UNPKG

21.6 kBJavaScriptView Raw
1import from2 from "from2";
2import fs from "fs";
3import libReport from "istanbul-lib-report";
4import merge2 from "merge2";
5import sysPath from "path";
6import stream from "stream";
7import Vinyl from "vinyl";
8function createContext(options) {
9 const context = libReport.createContext(options);
10 if (context.writer !== options.writer) {
11 Object.defineProperty(context, "writer", { value: options.writer });
12 }
13 return context;
14}
15export function wrapFileReporter(reporter) {
16 function reportVinyl(options) {
17 let done = false;
18 return from2({ objectMode: true }, (_, next) => {
19 if (done) {
20 next(null, null); // end of stream
21 return;
22 }
23 const cwd = process.cwd();
24 const writer = new VinylWriter(cwd, cwd, next);
25 // TODO: Fix istanbul-lib-report types
26 const context = createContext({
27 coverageMap: options.map,
28 writer,
29 sourceFinder: options.sourceFinder,
30 });
31 const tree = context.getTree("pkg");
32 tree.visit(reporter, context);
33 done = true;
34 });
35 }
36 return { reportVinyl };
37}
38class VinylWriter {
39 constructor(base, dir, next) {
40 this.base = base;
41 this.dir = dir;
42 this.next = next;
43 }
44 copyFile(source, dest) {
45 const content = fs.readFileSync(source);
46 const resolvedPath = sysPath.join(this.dir, dest);
47 const vinyl = new Vinyl({
48 cwd: this.base,
49 base: this.base,
50 path: resolvedPath,
51 contents: content,
52 });
53 this.next(null, vinyl);
54 }
55 writeFile(file) {
56 if (typeof file !== "string") {
57 throw new Error("NotSupported: StreamWriter#writeFile(file: null)");
58 }
59 const resolvedPath = sysPath.join(this.dir, file);
60 return new VinylContentWriter((content) => {
61 const vinyl = new Vinyl({
62 cwd: this.base,
63 base: this.base,
64 path: resolvedPath,
65 contents: content,
66 });
67 this.next(null, vinyl);
68 });
69 }
70 writeForDir(subdir) {
71 return new VinylWriter(this.base, sysPath.join(this.dir, subdir), this.next);
72 }
73}
74class VinylContentWriter {
75 constructor(done) {
76 this.chunks = [];
77 this.done = done;
78 }
79 write(str) {
80 this.chunks.push(str);
81 }
82 println(str) {
83 this.write(str);
84 this.write("\n");
85 }
86 colorize(str) {
87 return str;
88 }
89 close() {
90 return this.done(Buffer.from(this.chunks.join("")));
91 }
92}
93export function wrapStreamReporter(reporter) {
94 function reportStream(options) {
95 const duplex = new stream.PassThrough();
96 const writer = new StreamWriter(duplex);
97 const context = createContext({
98 coverageMap: options.map,
99 writer,
100 sourceFinder: options.sourceFinder,
101 });
102 const tree = context.getTree("pkg");
103 tree.visit(reporter, context);
104 return duplex;
105 }
106 return { reportStream };
107}
108class StreamWriter {
109 constructor(stream) {
110 this.stream = stream;
111 this.fileName = undefined;
112 }
113 copyFile(source, dest) {
114 throw new Error("NotSupported: StreamWriter#copyFile");
115 }
116 writeFile(file) {
117 if (typeof file !== "string") {
118 file = null;
119 }
120 if (this.fileName === undefined) {
121 this.fileName = file;
122 }
123 else if (file !== this.fileName) {
124 throw new Error(`NotSupported: Write to multiple different files: ${this.fileName}, ${file}`);
125 }
126 return new StreamContentWriter(this.stream);
127 }
128 writeForDir(subdir) {
129 throw new Error("NotSupported: StreamWriter#writeForDir");
130 }
131}
132class StreamContentWriter {
133 constructor(stream) {
134 this.stream = stream;
135 }
136 write(str) {
137 this.stream.write(Buffer.from(str));
138 }
139 println(str) {
140 this.write(str);
141 this.write("\n");
142 }
143 colorize(str) {
144 return str;
145 }
146 close() {
147 this.stream.end();
148 }
149}
150export function toVinylOnlyReporter(reporter, fileName) {
151 function reportVinyl(options) {
152 let done = false;
153 const wrappedStream = from2({ objectMode: true }, (_, next) => {
154 if (done) {
155 next(null, null); // end of stream
156 return;
157 }
158 const stream = reporter.reportStream(options);
159 next(null, streamToVinyl(stream, fileName));
160 done = true;
161 });
162 const streams = [wrappedStream];
163 if (reporter.reportVinyl !== undefined) {
164 streams.push(reporter.reportVinyl(options));
165 }
166 return merge2(streams);
167 }
168 return { reportVinyl };
169}
170function streamToVinyl(stream, fileName) {
171 const cwd = process.cwd();
172 const resolvedPath = sysPath.join(cwd, fileName);
173 return new Vinyl({
174 cwd,
175 base: cwd,
176 path: resolvedPath,
177 contents: stream,
178 });
179}
180
181//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIl9zcmMvd3JhcC1pc3RhbmJ1bC1yZXBvcnRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssTUFBTSxPQUFPLENBQUM7QUFDMUIsT0FBTyxFQUFFLE1BQU0sSUFBSSxDQUFDO0FBQ3BCLE9BQU8sU0FBUyxNQUFNLHFCQUFxQixDQUFDO0FBQzVDLE9BQU8sTUFBTSxNQUFNLFFBQVEsQ0FBQztBQUM1QixPQUFPLE9BQU8sTUFBTSxNQUFNLENBQUM7QUFDM0IsT0FBTyxNQUFNLE1BQU0sUUFBUSxDQUFDO0FBQzVCLE9BQU8sS0FBSyxNQUFNLE9BQU8sQ0FBQztBQU8xQixTQUFTLGFBQWEsQ0FBQyxPQUF1QjtJQUM1QyxNQUFNLE9BQU8sR0FBc0IsU0FBUyxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUNwRSxJQUFJLE9BQU8sQ0FBQyxNQUFNLEtBQUssT0FBTyxDQUFDLE1BQU0sRUFBRTtRQUNyQyxNQUFNLENBQUMsY0FBYyxDQUFDLE9BQU8sRUFBRSxRQUFRLEVBQUUsRUFBQyxLQUFLLEVBQUUsT0FBTyxDQUFDLE1BQU0sRUFBQyxDQUFDLENBQUM7S0FDbkU7SUFDRCxPQUFPLE9BQU8sQ0FBQztBQUNqQixDQUFDO0FBRUQsTUFBTSxVQUFVLGdCQUFnQixDQUFDLFFBQTJCO0lBQzFELFNBQVMsV0FBVyxDQUFDLE9BQWdDO1FBQ25ELElBQUksSUFBSSxHQUFZLEtBQUssQ0FBQztRQUMxQixPQUFPLEtBQUssQ0FBQyxFQUFDLFVBQVUsRUFBRSxJQUFJLEVBQUMsRUFBRSxDQUFDLENBQVMsRUFBRSxJQUE2QyxFQUFRLEVBQUU7WUFDbEcsSUFBSSxJQUFJLEVBQUU7Z0JBQ1IsSUFBSSxDQUFDLElBQUksRUFBRSxJQUFXLENBQUMsQ0FBQyxDQUFDLGdCQUFnQjtnQkFDekMsT0FBTzthQUNSO1lBQ0QsTUFBTSxHQUFHLEdBQVcsT0FBTyxDQUFDLEdBQUcsRUFBRSxDQUFDO1lBQ2xDLE1BQU0sTUFBTSxHQUFnQixJQUFJLFdB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QUUsTUFBTTtLQUNqQixDQUFDLENBQUM7QUFDTCxDQUFDIiwiZmlsZSI6IndyYXAtaXN0YW5idWwtcmVwb3J0ZXIuanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgZnJvbTIgZnJvbSBcImZyb20yXCI7XG5pbXBvcnQgZnMgZnJvbSBcImZzXCI7XG5pbXBvcnQgbGliUmVwb3J0IGZyb20gXCJpc3RhbmJ1bC1saWItcmVwb3J0XCI7XG5pbXBvcnQgbWVyZ2UyIGZyb20gXCJtZXJnZTJcIjtcbmltcG9ydCBzeXNQYXRoIGZyb20gXCJwYXRoXCI7XG5pbXBvcnQgc3RyZWFtIGZyb20gXCJzdHJlYW1cIjtcbmltcG9ydCBWaW55bCBmcm9tIFwidmlueWxcIjtcbmltcG9ydCB7IFJlcG9ydE9wdGlvbnMsIFN0cmVhbVJlcG9ydGVyLCBWaW55bFJlcG9ydGVyIH0gZnJvbSBcIi4vcmVwb3J0ZXJcIjtcblxuZXhwb3J0IGludGVyZmFjZSBDb250ZXh0T3B0aW9ucyBleHRlbmRzIGxpYlJlcG9ydC5Db250ZXh0IHtcbiAgd3JpdGVyOiBsaWJSZXBvcnQuRmlsZVdyaXRlcjtcbn1cblxuZnVuY3Rpb24gY3JlYXRlQ29udGV4dChvcHRpb25zOiBDb250ZXh0T3B0aW9ucyk6IGFueSB7XG4gIGNvbnN0IGNvbnRleHQ6IGxpYlJlcG9ydC5Db250ZXh0ID0gbGliUmVwb3J0LmNyZWF0ZUNvbnRleHQob3B0aW9ucyk7XG4gIGlmIChjb250ZXh0LndyaXRlciAhPT0gb3B0aW9ucy53cml0ZXIpIHtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoY29udGV4dCwgXCJ3cml0ZXJcIiwge3ZhbHVlOiBvcHRpb25zLndyaXRlcn0pO1xuICB9XG4gIHJldHVybiBjb250ZXh0O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gd3JhcEZpbGVSZXBvcnRlcihyZXBvcnRlcjogbGliUmVwb3J0LlZpc2l0b3IpOiBWaW55bFJlcG9ydGVyIHtcbiAgZnVuY3Rpb24gcmVwb3J0VmlueWwob3B0aW9uczogUmVhZG9ubHk8UmVwb3J0T3B0aW9ucz4pOiBOb2RlSlMuUmVhZGFibGVTdHJlYW0ge1xuICAgIGxldCBkb25lOiBib29sZWFuID0gZmFsc2U7XG4gICAgcmV0dXJuIGZyb20yKHtvYmplY3RNb2RlOiB0cnVlfSwgKF86IG51bWJlciwgbmV4dDogKGVycjogbnVsbCB8IEVycm9yLCBvYmo6IFZpbnlsKSA9PiB2b2lkKTogdm9pZCA9PiB7XG4gICAgICBpZiAoZG9uZSkge1xuICAgICAgICBuZXh0KG51bGwsIG51bGwgYXMgYW55KTsgLy8gZW5kIG9mIHN0cmVhbVxuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjb25zdCBjd2Q6IHN0cmluZyA9IHByb2Nlc3MuY3dkKCk7XG4gICAgICBjb25zdCB3cml0ZXI6IFZpbnlsV3JpdGVyID0gbmV3IFZpbnlsV3JpdGVyKGN3ZCwgY3dkLCBuZXh0KTtcbiAgICAgIC8vIFRPRE86IEZpeCBpc3RhbmJ1bC1saWItcmVwb3J0IHR5cGVzXG4gICAgICBjb25zdCBjb250ZXh0OiBsaWJSZXBvcnQuQ29udGV4dCA9IGNyZWF0ZUNvbnRleHQoe1xuICAgICAgICBjb3ZlcmFnZU1hcDogb3B0aW9ucy5tYXAsXG4gICAgICAgIHdyaXRlcixcbiAgICAgICAgc291cmNlRmluZGVyOiBvcHRpb25zLnNvdXJjZUZpbmRlcixcbiAgICAgIH0gYXMgYW55IGFzIENvbnRleHRPcHRpb25zKTtcbiAgICAgIGNvbnN0IHRyZWU6IGxpYlJlcG9ydC5UcmVlID0gY29udGV4dC5nZXRUcmVlKFwicGtnXCIpO1xuICAgICAgdHJlZS52aXNpdChyZXBvcnRlciwgY29udGV4dCk7XG4gICAgICBkb25lID0gdHJ1ZTtcbiAgICB9KTtcbiAgfVxuXG4gIHJldHVybiB7cmVwb3J0VmlueWx9O1xufVxuXG5jbGFzcyBWaW55bFdyaXRlciBpbXBsZW1lbnRzIGxpYlJlcG9ydC5GaWxlV3JpdGVyIHtcbiAgcHVibGljIHJlYWRvbmx5IGJhc2U6IHN0cmluZztcbiAgcHVibGljIHJlYWRvbmx5IGRpcjogc3RyaW5nO1xuICBwcml2YXRlIHJlYWRvbmx5IG5leHQ6IChlcnI6IG51bGwgfCBFcnJvciwgb2JqOiBWaW55bCkgPT4gdm9pZDtcblxuICBjb25zdHJ1Y3RvcihiYXNlOiBzdHJpbmcsIGRpcjogc3RyaW5nLCBuZXh0OiAoZXJyOiBudWxsIHwgRXJyb3IsIG9iajogVmlueWwpID0+IHZvaWQpIHtcbiAgICB0aGlzLmJhc2UgPSBiYXNlO1xuICAgIHRoaXMuZGlyID0gZGlyO1xuICAgIHRoaXMubmV4dCA9IG5leHQ7XG4gIH1cblxuICBwdWJsaWMgY29weUZpbGUoc291cmNlOiBzdHJpbmcsIGRlc3Q6IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IGNvbnRlbnQ6IEJ1ZmZlciA9IGZzLnJlYWRGaWxlU3luYyhzb3VyY2UpO1xuICAgIGNvbnN0IHJlc29sdmVkUGF0aDogc3RyaW5nID0gc3lzUGF0aC5qb2luKHRoaXMuZGlyLCBkZXN0KTtcbiAgICBjb25zdCB2aW55bDogVmlueWwgPSBuZXcgVmlueWwoe1xuICAgICAgY3dkOiB0aGlzLmJhc2UsXG4gICAgICBiYXNlOiB0aGlzLmJhc2UsXG4gICAgICBwYXRoOiByZXNvbHZlZFBhdGgsXG4gICAgICBjb250ZW50czogY29udGVudCxcbiAgICB9KTtcbiAgICB0aGlzLm5leHQobnVsbCwgdmlueWwpO1xuICB9XG5cbiAgcHVibGljIHdyaXRlRmlsZShmaWxlOiBzdHJpbmcgfCBudWxsKTogVmlueWxDb250ZW50V3JpdGVyIHtcbiAgICBpZiAodHlwZW9mIGZpbGUgIT09IFwic3RyaW5nXCIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIk5vdFN1cHBvcnRlZDogU3RyZWFtV3JpdGVyI3dyaXRlRmlsZShmaWxlOiBudWxsKVwiKTtcbiAgICB9XG4gICAgY29uc3QgcmVzb2x2ZWRQYXRoOiBzdHJpbmcgPSBzeXNQYXRoLmpvaW4odGhpcy5kaXIsIGZpbGUpO1xuICAgIHJldHVybiBuZXcgVmlueWxDb250ZW50V3JpdGVyKChjb250ZW50OiBCdWZmZXIpOiB2b2lkID0+IHtcbiAgICAgIGNvbnN0IHZpbnlsOiBWaW55bCA9IG5ldyBWaW55bCh7XG4gICAgICAgIGN3ZDogdGhpcy5iYXNlLFxuICAgICAgICBiYXNlOiB0aGlzLmJhc2UsXG4gICAgICAgIHBhdGg6IHJlc29sdmVkUGF0aCxcbiAgICAgICAgY29udGVudHM6IGNvbnRlbnQsXG4gICAgICB9KTtcbiAgICAgIHRoaXMubmV4dChudWxsLCB2aW55bCk7XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgd3JpdGVGb3JEaXIoc3ViZGlyOiBzdHJpbmcpOiBWaW55bFdyaXRlciB7XG4gICAgcmV0dXJuIG5ldyBWaW55bFdyaXRlcih0aGlzLmJhc2UsIHN5c1BhdGguam9pbih0aGlzLmRpciwgc3ViZGlyKSwgdGhpcy5uZXh0KTtcbiAgfVxufVxuXG5jbGFzcyBWaW55bENvbnRlbnRXcml0ZXIgaW1wbGVtZW50cyBsaWJSZXBvcnQuQ29udGVudFdyaXRlciB7XG4gIHByaXZhdGUgcmVhZG9ubHkgY2h1bmtzOiBzdHJpbmdbXTtcbiAgcHJpdmF0ZSByZWFkb25seSBkb25lOiAoY29udGVudDogQnVmZmVyKSA9PiB2b2lkO1xuXG4gIGNvbnN0cnVjdG9yKGRvbmU6IChjb250ZW50OiBCdWZmZXIpID0+IHZvaWQpIHtcbiAgICB0aGlzLmNodW5rcyA9IFtdO1xuICAgIHRoaXMuZG9uZSA9IGRvbmU7XG4gIH1cblxuICBwdWJsaWMgd3JpdGUoc3RyOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLmNodW5rcy5wdXNoKHN0cik7XG4gIH1cblxuICBwdWJsaWMgcHJpbnRsbihzdHI6IHN0cmluZykge1xuICAgIHRoaXMud3JpdGUoc3RyKTtcbiAgICB0aGlzLndyaXRlKFwiXFxuXCIpO1xuICB9XG5cbiAgcHVibGljIGNvbG9yaXplKHN0cjogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gc3RyO1xuICB9XG5cbiAgcHVibGljIGNsb3NlKCk6IHZvaWQge1xuICAgIHJldHVybiB0aGlzLmRvbmUoQnVmZmVyLmZyb20odGhpcy5jaHVua3Muam9pbihcIlwiKSkpO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB3cmFwU3RyZWFtUmVwb3J0ZXIocmVwb3J0ZXI6IGxpYlJlcG9ydC5WaXNpdG9yKTogU3RyZWFtUmVwb3J0ZXIge1xuICBmdW5jdGlvbiByZXBvcnRTdHJlYW0ob3B0aW9uczogUmVhZG9ubHk8UmVwb3J0T3B0aW9ucz4pOiBOb2RlSlMuUmVhZGFibGVTdHJlYW0ge1xuICAgIGNvbnN0IGR1cGxleDogc3RyZWFtLkR1cGxleCA9IG5ldyBzdHJlYW0uUGFzc1Rocm91Z2goKTtcbiAgICBjb25zdCB3cml0ZXI6IFN0cmVhbVdyaXRlciA9IG5ldyBTdHJlYW1Xcml0ZXIoZHVwbGV4KTtcbiAgICBjb25zdCBjb250ZXh0OiBsaWJSZXBvcnQuQ29udGV4dCA9IGNyZWF0ZUNvbnRleHQoe1xuICAgICAgY292ZXJhZ2VNYXA6IG9wdGlvbnMubWFwLFxuICAgICAgd3JpdGVyLFxuICAgICAgc291cmNlRmluZGVyOiBvcHRpb25zLnNvdXJjZUZpbmRlcixcbiAgICB9IGFzIGFueSBhcyBDb250ZXh0T3B0aW9ucyk7XG4gICAgY29uc3QgdHJlZTogbGliUmVwb3J0LlRyZWUgPSBjb250ZXh0LmdldFRyZWUoXCJwa2dcIik7XG4gICAgdHJlZS52aXNpdChyZXBvcnRlciwgY29udGV4dCk7XG4gICAgcmV0dXJuIGR1cGxleDtcbiAgfVxuXG4gIHJldHVybiB7cmVwb3J0U3RyZWFtfTtcbn1cblxuY2xhc3MgU3RyZWFtV3JpdGVyIGltcGxlbWVudHMgbGliUmVwb3J0LkZpbGVXcml0ZXIge1xuICBwcml2YXRlIHJlYWRvbmx5IHN0cmVhbTogTm9kZUpTLldyaXRhYmxlU3RyZWFtO1xuICBwcml2YXRlIGZpbGVOYW1lOiBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkO1xuXG4gIGNvbnN0cnVjdG9yKHN0cmVhbTogTm9kZUpTLldyaXRhYmxlU3RyZWFtKSB7XG4gICAgdGhpcy5zdHJlYW0gPSBzdHJlYW07XG4gICAgdGhpcy5maWxlTmFtZSA9IHVuZGVmaW5lZDtcbiAgfVxuXG4gIHB1YmxpYyBjb3B5RmlsZShzb3VyY2U6IHN0cmluZywgZGVzdDogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiTm90U3VwcG9ydGVkOiBTdHJlYW1Xcml0ZXIjY29weUZpbGVcIik7XG4gIH1cblxuICBwdWJsaWMgd3JpdGVGaWxlKGZpbGU6IHN0cmluZyB8IG51bGwpOiBTdHJlYW1Db250ZW50V3JpdGVyIHtcbiAgICBpZiAodHlwZW9mIGZpbGUgIT09IFwic3RyaW5nXCIpIHtcbiAgICAgIGZpbGUgPSBudWxsO1xuICAgIH1cbiAgICBpZiAodGhpcy5maWxlTmFtZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmZpbGVOYW1lID0gZmlsZTtcbiAgICB9IGVsc2UgaWYgKGZpbGUgIT09IHRoaXMuZmlsZU5hbWUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgTm90U3VwcG9ydGVkOiBXcml0ZSB0byBtdWx0aXBsZSBkaWZmZXJlbnQgZmlsZXM6ICR7dGhpcy5maWxlTmFtZX0sICR7ZmlsZX1gKTtcbiAgICB9XG5cbiAgICByZXR1cm4gbmV3IFN0cmVhbUNvbnRlbnRXcml0ZXIodGhpcy5zdHJlYW0pO1xuICB9XG5cbiAgcHVibGljIHdyaXRlRm9yRGlyKHN1YmRpcjogc3RyaW5nKTogU3RyZWFtV3JpdGVyIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJOb3RTdXBwb3J0ZWQ6IFN0cmVhbVdyaXRlciN3cml0ZUZvckRpclwiKTtcbiAgfVxufVxuXG5jbGFzcyBTdHJlYW1Db250ZW50V3JpdGVyIGltcGxlbWVudHMgbGliUmVwb3J0LkNvbnRlbnRXcml0ZXIge1xuICBwcml2YXRlIHJlYWRvbmx5IHN0cmVhbTogTm9kZUpTLldyaXRhYmxlU3RyZWFtO1xuXG4gIGNvbnN0cnVjdG9yKHN0cmVhbTogTm9kZUpTLldyaXRhYmxlU3RyZWFtKSB7XG4gICAgdGhpcy5zdHJlYW0gPSBzdHJlYW07XG4gIH1cblxuICBwdWJsaWMgd3JpdGUoc3RyOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLnN0cmVhbS53cml0ZShCdWZmZXIuZnJvbShzdHIpKTtcbiAgfVxuXG4gIHB1YmxpYyBwcmludGxuKHN0cjogc3RyaW5nKSB7XG4gICAgdGhpcy53cml0ZShzdHIpO1xuICAgIHRoaXMud3JpdGUoXCJcXG5cIik7XG4gIH1cblxuICBwdWJsaWMgY29sb3JpemUoc3RyOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiBzdHI7XG4gIH1cblxuICBwdWJsaWMgY2xvc2UoKTogdm9pZCB7XG4gICAgdGhpcy5zdHJlYW0uZW5kKCk7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHRvVmlueWxPbmx5UmVwb3J0ZXIocmVwb3J0ZXI6IFN0cmVhbVJlcG9ydGVyLCBmaWxlTmFtZTogc3RyaW5nKTogVmlueWxSZXBvcnRlciB7XG4gIGZ1bmN0aW9uIHJlcG9ydFZpbnlsKG9wdGlvbnM6IFJlYWRvbmx5PFJlcG9ydE9wdGlvbnM+KTogTm9kZUpTLlJlYWRhYmxlU3RyZWFtIHtcbiAgICBsZXQgZG9uZTogYm9vbGVhbiA9IGZhbHNlO1xuICAgIGNvbnN0IHdyYXBwZWRTdHJlYW06IE5vZGVKUy5SZWFkYWJsZVN0cmVhbSA9IGZyb20yKFxuICAgICAge29iamVjdE1vZGU6IHRydWV9LFxuICAgICAgKF86IG51bWJlciwgbmV4dDogKGVycjogbnVsbCB8IEVycm9yLCBvYmo6IFZpbnlsKSA9PiB2b2lkKTogdm9pZCA9PiB7XG4gICAgICAgIGlmIChkb25lKSB7XG4gICAgICAgICAgbmV4dChudWxsLCBudWxsIGFzIGFueSk7IC8vIGVuZCBvZiBzdHJlYW1cbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgc3RyZWFtOiBOb2RlSlMuUmVhZGFibGVTdHJlYW0gPSByZXBvcnRlci5yZXBvcnRTdHJlYW0ob3B0aW9ucyk7XG4gICAgICAgIG5leHQobnVsbCwgc3RyZWFtVG9WaW55bChzdHJlYW0sIGZpbGVOYW1lKSk7XG4gICAgICAgIGRvbmUgPSB0cnVlO1xuICAgICAgfSxcbiAgICApO1xuICAgIGNvbnN0IHN0cmVhbXM6IE5vZGVKUy5SZWFkYWJsZVN0cmVhbVtdID0gW3dyYXBwZWRTdHJlYW1dO1xuICAgIGlmIChyZXBvcnRlci5yZXBvcnRWaW55bCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBzdHJlYW1zLnB1c2gocmVwb3J0ZXIucmVwb3J0VmlueWwob3B0aW9ucykpO1xuICAgIH1cbiAgICByZXR1cm4gbWVyZ2UyKHN0cmVhbXMpO1xuICB9XG5cbiAgcmV0dXJuIHtyZXBvcnRWaW55bH07XG59XG5cbmZ1bmN0aW9uIHN0cmVhbVRvVmlueWwoc3RyZWFtOiBOb2RlSlMuUmVhZGFibGVTdHJlYW0sIGZpbGVOYW1lOiBzdHJpbmcpOiBWaW55bCB7XG4gIGNvbnN0IGN3ZDogc3RyaW5nID0gcHJvY2Vzcy5jd2QoKTtcbiAgY29uc3QgcmVzb2x2ZWRQYXRoOiBzdHJpbmcgPSBzeXNQYXRoLmpvaW4oY3dkLCBmaWxlTmFtZSk7XG4gIHJldHVybiBuZXcgVmlueWwoe1xuICAgIGN3ZCxcbiAgICBiYXNlOiBjd2QsXG4gICAgcGF0aDogcmVzb2x2ZWRQYXRoLFxuICAgIGNvbnRlbnRzOiBzdHJlYW0sXG4gIH0pO1xufVxuIl0sInNvdXJjZVJvb3QiOiIifQ==