@tscircuit/eval 0.0.191 → 0.0.192
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bunfig.toml +2 -1
- package/dist/lib/index.d.ts +6 -0
- package/dist/lib/index.js +24 -1
- package/dist/worker.d.ts +6 -0
- package/dist/worker.js +24 -1
- package/lib/worker.ts +33 -1
- package/package.json +1 -1
- package/tests/fixtures/preload.ts +9 -0
package/bunfig.toml
CHANGED
package/dist/lib/index.d.ts
CHANGED
|
@@ -2388,6 +2388,12 @@ declare const runTscircuitModule: (module: string, opts?: {
|
|
|
2388
2388
|
|
|
2389
2389
|
declare const getImportsFromCode: (code: string) => string[];
|
|
2390
2390
|
|
|
2391
|
+
declare global {
|
|
2392
|
+
interface Window {
|
|
2393
|
+
TSCIRCUIT_GLOBAL_CIRCUIT_WORKER: CircuitWebWorker | undefined;
|
|
2394
|
+
}
|
|
2395
|
+
var TSCIRCUIT_GLOBAL_CIRCUIT_WORKER: CircuitWebWorker | undefined;
|
|
2396
|
+
}
|
|
2391
2397
|
declare const createCircuitWebWorker: (configuration: Partial<WebWorkerConfiguration>) => Promise<CircuitWebWorker>;
|
|
2392
2398
|
|
|
2393
2399
|
export { CircuitRunner, type CircuitWebWorker, type WebWorkerConfiguration, createCircuitWebWorker, getImportsFromCode, runTscircuitCode, runTscircuitModule };
|
package/dist/lib/index.js
CHANGED
|
@@ -732,6 +732,25 @@ var runTscircuitModule = async (module, opts = {}) => {
|
|
|
732
732
|
// lib/worker.ts
|
|
733
733
|
import * as Comlink from "comlink";
|
|
734
734
|
var createCircuitWebWorker = async (configuration) => {
|
|
735
|
+
const existingWorker = globalThis.TSCIRCUIT_GLOBAL_CIRCUIT_WORKER;
|
|
736
|
+
if (existingWorker && typeof existingWorker.kill === "function") {
|
|
737
|
+
if (configuration.verbose) {
|
|
738
|
+
console.log("[Worker] Killing previous global worker instance...");
|
|
739
|
+
}
|
|
740
|
+
try {
|
|
741
|
+
await existingWorker.kill();
|
|
742
|
+
} catch (e) {
|
|
743
|
+
if (configuration.verbose) {
|
|
744
|
+
console.warn(
|
|
745
|
+
"[Worker] Error killing previous global worker instance:",
|
|
746
|
+
e
|
|
747
|
+
);
|
|
748
|
+
}
|
|
749
|
+
if (globalThis.TSCIRCUIT_GLOBAL_CIRCUIT_WORKER === existingWorker) {
|
|
750
|
+
globalThis.TSCIRCUIT_GLOBAL_CIRCUIT_WORKER = void 0;
|
|
751
|
+
}
|
|
752
|
+
}
|
|
753
|
+
}
|
|
735
754
|
if (configuration.verbose) {
|
|
736
755
|
console.log(
|
|
737
756
|
"[Worker] Creating circuit web worker with config:",
|
|
@@ -776,8 +795,12 @@ var createCircuitWebWorker = async (configuration) => {
|
|
|
776
795
|
comlinkWorker[Comlink.releaseProxy]();
|
|
777
796
|
rawWorker.terminate();
|
|
778
797
|
isTerminated = true;
|
|
798
|
+
if (globalThis.TSCIRCUIT_GLOBAL_CIRCUIT_WORKER === wrapper) {
|
|
799
|
+
globalThis.TSCIRCUIT_GLOBAL_CIRCUIT_WORKER = void 0;
|
|
800
|
+
}
|
|
779
801
|
}
|
|
780
802
|
};
|
|
803
|
+
globalThis.TSCIRCUIT_GLOBAL_CIRCUIT_WORKER = wrapper;
|
|
781
804
|
return wrapper;
|
|
782
805
|
};
|
|
783
806
|
export {
|
|
@@ -787,4 +810,4 @@ export {
|
|
|
787
810
|
runTscircuitCode,
|
|
788
811
|
runTscircuitModule
|
|
789
812
|
};
|
|
790
|
-
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vd2Vid29ya2VyL2V4ZWN1dGlvbi1jb250ZXh0LnRzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9AdHNjaXJjdWl0L3BhcnRzLWVuZ2luZS9saWIvamxjLXBhcnRzLWVuZ2luZS50cyIsICIuLi8uLi9saWIvZ2V0UGxhdGZvcm1Db25maWcudHMiLCAiLi4vLi4vbGliL3J1bm5lci9ub3JtYWxpemVGc01hcC50cyIsICIuLi8uLi9saWIvcnVubmVyL0NpcmN1aXRSdW5uZXIudHMiLCAiLi4vLi4vbGliL3V0aWxzL2Rpcm5hbWUudHMiLCAiLi4vLi4vbGliL3J1bm5lci9yZXNvbHZlRmlsZVBhdGgudHMiLCAiLi4vLi4vd2Vid29ya2VyL2V2YWwtY29tcGlsZWQtanMudHMiLCAiLi4vLi4vd2Vid29ya2VyL2ltcG9ydC1ldmFsLXBhdGgudHMiLCAiLi4vLi4vd2Vid29ya2VyL2ltcG9ydC1sb2NhbC1maWxlLnRzIiwgIi4uLy4uL2xpYi91dGlscy9nZXQtaW1wb3J0cy1mcm9tLWNvZGUudHMiLCAiLi4vLi4vd2Vid29ya2VyL2ltcG9ydC1zbmlwcGV0LnRzIiwgIi4uLy4uL2xpYi91dGlscy9yZXNvbHZlLW5vZGUtbW9kdWxlLnRzIiwgIi4uLy4uL3dlYndvcmtlci9pbXBvcnQtbm9kZS1tb2R1bGUudHMiLCAiLi4vLi4vbGliL3J1bm5lci9zZXR1cERlZmF1bHRFbnRyeXBvaW50SWZOZWVkZWQudHMiLCAiLi4vLi4vbGliL3J1bm5lci9ydW5Uc2NpcmN1aXRDb2RlLnRzIiwgIi4uLy4uL2xpYi9ydW5uZXIvcnVuVHNjaXJjdWl0TW9kdWxlLnRzIiwgIi4uLy4uL2xpYi93b3JrZXIudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbImltcG9ydCB7IFJvb3RDaXJjdWl0IH0gZnJvbSBcIkB0c2NpcmN1aXQvY29yZVwiXG5pbXBvcnQgdHlwZSB7IFdlYldvcmtlckNvbmZpZ3VyYXRpb24gfSBmcm9tIFwibGliL3NoYXJlZC90eXBlc1wiXG5pbXBvcnQgKiBhcyB0c2NpcmN1aXRDb3JlIGZyb20gXCJAdHNjaXJjdWl0L2NvcmVcIlxuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSBcInJlYWN0XCJcbmltcG9ydCAqIGFzIGpzY2FkRmliZXIgZnJvbSBcImpzY2FkLWZpYmVyXCJcbmltcG9ydCAqIGFzIHRzY2lyY3VpdE1hdGhVdGlscyBmcm9tIFwiQHRzY2lyY3VpdC9tYXRoLXV0aWxzXCJcbmltcG9ydCB0eXBlIHsgUGxhdGZvcm1Db25maWcgfSBmcm9tIFwiQHRzY2lyY3VpdC9wcm9wc1wiXG5pbXBvcnQgeyBnZXRQbGF0Zm9ybUNvbmZpZyB9IGZyb20gXCJsaWIvZ2V0UGxhdGZvcm1Db25maWdcIlxuXG5leHBvcnQgaW50ZXJmYWNlIEV4ZWN1dGlvbkNvbnRleHQgZXh0ZW5kcyBXZWJXb3JrZXJDb25maWd1cmF0aW9uIHtcbiAgZnNNYXA6IFJlY29yZDxzdHJpbmcsIHN0cmluZz5cbiAgZW50cnlwb2ludDogc3RyaW5nXG4gIHByZVN1cHBsaWVkSW1wb3J0czogUmVjb3JkPHN0cmluZywgYW55PlxuICBjaXJjdWl0OiBSb290Q2lyY3VpdFxufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlRXhlY3V0aW9uQ29udGV4dChcbiAgd2ViV29ya2VyQ29uZmlndXJhdGlvbjogV2ViV29ya2VyQ29uZmlndXJhdGlvbixcbiAgb3B0czoge1xuICAgIG5hbWU/OiBzdHJpbmdcbiAgICBwbGF0Zm9ybT86IFBsYXRmb3JtQ29uZmlnXG4gIH0gPSB7fSxcbik6IEV4ZWN1dGlvbkNvbnRleHQge1xuICBnbG9iYWxUaGlzLlJlYWN0ID0gUmVhY3RcblxuICBjb25zdCBjaXJjdWl0ID0gbmV3IFJvb3RDaXJjdWl0KHtcbiAgICBwbGF0Zm9ybTogb3B0cy5wbGF0Zm9ybSB8fCBnZXRQbGF0Zm9ybUNvbmZpZygpLFxuICB9KVxuXG4gIGlmIChvcHRzLm5hbWUpIHtcbiAgICBjaXJjdWl0Lm5hbWUgPSBvcHRzLm5hbWVcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgZnNNYXA6IHt9LFxuICAgIGVudHJ5cG9pbnQ6IFwiXCIsXG4gICAgcHJlU3VwcGxpZWRJbXBvcnRzOiB7XG4gICAgICBcIkB0c2NpcmN1aXQvY29yZVwiOiB0c2NpcmN1aXRDb3JlLFxuICAgICAgdHNjaXJjdWl0OiB0c2NpcmN1aXRDb3JlLFxuICAgICAgXCJAdHNjaXJjdWl0L21hdGgtdXRpbHNcIjogdHNjaXJjdWl0TWF0aFV0aWxzLFxuICAgICAgcmVhY3Q6IFJlYWN0LFxuICAgICAgXCJqc2NhZC1maWJlclwiOiBqc2NhZEZpYmVyLFxuXG4gICAgICAvLyBUaGlzIGlzIHVzdWFsbHkgdXNlZCBhcyBhIHR5cGUgaW1wb3J0LCB3ZSBjYW4gcmVtb3ZlIHRoZSBzaGltIHdoZW4gd2VcbiAgICAgIC8vIGlnbm9yZSB0eXBlIGltcG9ydHMgaW4gZ2V0SW1wb3J0c0Zyb21Db2RlXG4gICAgICBcIkB0c2NpcmN1aXQvcHJvcHNcIjoge30sXG4gICAgfSxcbiAgICBjaXJjdWl0LFxuICAgIC4uLndlYldvcmtlckNvbmZpZ3VyYXRpb24sXG4gIH1cbn1cbiIsICJpbXBvcnQgdHlwZSB7IFBhcnRzRW5naW5lLCBTdXBwbGllclBhcnROdW1iZXJzIH0gZnJvbSBcIkB0c2NpcmN1aXQvcHJvcHNcIlxuXG5jb25zdCBjYWNoZSA9IG5ldyBNYXA8c3RyaW5nLCBhbnk+KClcblxuY29uc3QgZ2V0SmxjUGFydHNDYWNoZWQgPSBhc3luYyAobmFtZTogYW55LCBwYXJhbXM6IGFueSkgPT4ge1xuICBjb25zdCBwYXJhbVN0cmluZyA9IG5ldyBVUkxTZWFyY2hQYXJhbXMoe1xuICAgIC4uLnBhcmFtcyxcbiAgICBqc29uOiBcInRydWVcIixcbiAgfSkudG9TdHJpbmcoKVxuICBpZiAoY2FjaGUuaGFzKHBhcmFtU3RyaW5nKSkge1xuICAgIHJldHVybiBjYWNoZS5nZXQocGFyYW1TdHJpbmcpXG4gIH1cbiAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaChcbiAgICBgaHR0cHM6Ly9qbGNzZWFyY2gudHNjaXJjdWl0LmNvbS8ke25hbWV9L2xpc3Q/JHtwYXJhbVN0cmluZ31gLFxuICApXG4gIGNvbnN0IHJlc3BvbnNlSnNvbiA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKVxuICBjYWNoZS5zZXQocGFyYW1TdHJpbmcsIHJlc3BvbnNlSnNvbilcbiAgcmV0dXJuIHJlc3BvbnNlSnNvblxufVxuXG5leHBvcnQgY29uc3QgamxjUGFydHNFbmdpbmU6IFBhcnRzRW5naW5lID0ge1xuICBmaW5kUGFydDogYXN5bmMgKHtcbiAgICBzb3VyY2VDb21wb25lbnQsXG4gICAgZm9vdHByaW50ZXJTdHJpbmcsXG4gIH0pOiBQcm9taXNlPFN1cHBsaWVyUGFydE51bWJlcnM+ID0+IHtcbiAgICBpZiAoXG4gICAgICBzb3VyY2VDb21wb25lbnQudHlwZSA9PT0gXCJzb3VyY2VfY29tcG9uZW50XCIgJiZcbiAgICAgIHNvdXJjZUNvbXBvbmVudC5mdHlwZSA9PT0gXCJzaW1wbGVfcmVzaXN0b3JcIlxuICAgICkge1xuICAgICAgY29uc3QgeyByZXNpc3RvcnMgfSA9IGF3YWl0IGdldEpsY1BhcnRzQ2FjaGVkKFwicmVzaXN0b3JzXCIsIHtcbiAgICAgICAgcmVzaXN0YW5jZTogc291cmNlQ29tcG9uZW50LnJlc2lzdGFuY2UsXG4gICAgICAgIHBhY2thZ2U6IGZvb3RwcmludGVyU3RyaW5nLFxuICAgICAgfSlcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgamxjcGNiOiByZXNpc3RvcnMubWFwKChyOiBhbnkpID0+IGBDJHtyLmxjc2N9YCkuc2xpY2UoMCwgMyksXG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChcbiAgICAgIHNvdXJjZUNvbXBvbmVudC50eXBlID09PSBcInNvdXJjZV9jb21wb25lbnRcIiAmJlxuICAgICAgc291cmNlQ29tcG9uZW50LmZ0eXBlID09PSBcInNpbXBsZV9jYXBhY2l0b3JcIlxuICAgICkge1xuICAgICAgaWYgKGZvb3RwcmludGVyU3RyaW5nPy5pbmNsdWRlcyhcImNhcFwiKSkge1xuICAgICAgICBmb290cHJpbnRlclN0cmluZyA9IGZvb3RwcmludGVyU3RyaW5nLnJlcGxhY2UoXCJjYXBcIiwgXCJcIilcbiAgICAgIH1cbiAgICAgIGNvbnN0IHsgY2FwYWNpdG9ycyB9ID0gYXdhaXQgZ2V0SmxjUGFydHNDYWNoZWQoXCJjYXBhY2l0b3JzXCIsIHtcbiAgICAgICAgY2FwYWNpdGFuY2U6IHNvdXJjZUNvbXBvbmVudC5jYXBhY2l0YW5jZSxcbiAgICAgICAgcGFja2FnZTogZm9vdHByaW50ZXJTdHJpbmcsXG4gICAgICB9KVxuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBqbGNwY2I6IGNhcGFjaXRvcnMubWFwKChjOiBhbnkpID0+IGBDJHtjLmxjc2N9YCkuc2xpY2UoMCwgMyksXG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChcbiAgICAgIHNvdXJjZUNvbXBvbmVudC50eXBlID09PSBcInNvdXJjZV9jb21wb25lbnRcIiAmJlxuICAgICAgc291cmNlQ29tcG9uZW50LmZ0eXBlID09PSBcInNpbXBsZV9waW5faGVhZGVyXCJcbiAgICApIHtcbiAgICAgIGxldCBwaXRjaFxuICAgICAgaWYgKGZvb3RwcmludGVyU3RyaW5nPy5pbmNsdWRlcyhcIl9wXCIpKSB7XG4gICAgICAgIHBpdGNoID0gZm9vdHByaW50ZXJTdHJpbmcuc3BsaXQoXCJfcFwiKVsxXVxuICAgICAgfVxuICAgICAgY29uc3QgeyBoZWFkZXJzIH0gPSBhd2FpdCBnZXRKbGNQYXJ0c0NhY2hlZChcbiAgICAgICAgXCJoZWFkZXJzXCIsXG4gICAgICAgIHBpdGNoXG4gICAgICAgICAgPyB7XG4gICAgICAgICAgICAgIHBpdGNoOiBwaXRjaCxcbiAgICAgICAgICAgICAgbnVtX3BpbnM6IHNvdXJjZUNvbXBvbmVudC5waW5fY291bnQsXG4gICAgICAgICAgICAgIGdlbmRlcjogc291cmNlQ29tcG9uZW50LmdlbmRlcixcbiAgICAgICAgICAgIH1cbiAgICAgICAgICA6IHtcbiAgICAgICAgICAgICAgbnVtX3BpbnM6IHNvdXJjZUNvbXBvbmVudC5waW5fY291bnQsXG4gICAgICAgICAgICAgIGdlbmRlcjogc291cmNlQ29tcG9uZW50LmdlbmRlcixcbiAgICAgICAgICAgIH0sXG4gICAgICApXG4gICAgICByZXR1cm4ge1xuICAgICAgICBqbGNwY2I6IGhlYWRlcnMubWFwKChoOiBhbnkpID0+IGBDJHtoLmxjc2N9YCkuc2xpY2UoMCwgMyksXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB7fVxuICB9LFxufVxuIiwgImltcG9ydCB0eXBlIHsgUGxhdGZvcm1Db25maWcgfSBmcm9tIFwiQHRzY2lyY3VpdC9wcm9wc1wiXG5pbXBvcnQgeyBqbGNQYXJ0c0VuZ2luZSB9IGZyb20gXCJAdHNjaXJjdWl0L3BhcnRzLWVuZ2luZVwiXG5cbmV4cG9ydCBjb25zdCBnZXRQbGF0Zm9ybUNvbmZpZyA9ICgpOiBQbGF0Zm9ybUNvbmZpZyA9PiAoe1xuICBwYXJ0c0VuZ2luZTogamxjUGFydHNFbmdpbmUsXG59KVxuIiwgImV4cG9ydCBmdW5jdGlvbiBub3JtYWxpemVGaWxlUGF0aChmaWxlUGF0aDogc3RyaW5nKSB7XG4gIGxldCBub3JtRmlsZVBhdGggPSBmaWxlUGF0aFxuICBub3JtRmlsZVBhdGggPSBub3JtRmlsZVBhdGgucmVwbGFjZSgvXFxcXC9nLCBcIi9cIilcbiAgbm9ybUZpbGVQYXRoID0gbm9ybUZpbGVQYXRoLnRyaW0oKVxuICBpZiAobm9ybUZpbGVQYXRoLnN0YXJ0c1dpdGgoXCIuL1wiKSkge1xuICAgIG5vcm1GaWxlUGF0aCA9IG5vcm1GaWxlUGF0aC5zbGljZSgyKVxuICB9XG4gIGlmIChub3JtRmlsZVBhdGguc3RhcnRzV2l0aChcIi9cIikpIHtcbiAgICBub3JtRmlsZVBhdGggPSBub3JtRmlsZVBhdGguc2xpY2UoMSlcbiAgfVxuICByZXR1cm4gbm9ybUZpbGVQYXRoXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBub3JtYWxpemVGc01hcChmc01hcDogUmVjb3JkPHN0cmluZywgc3RyaW5nPikge1xuICBjb25zdCBub3JtYWxpemVkRnNNYXA6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fVxuICBmb3IgKGNvbnN0IFtmc1BhdGgsIGZpbGVDb250ZW50XSBvZiBPYmplY3QuZW50cmllcyhmc01hcCkpIHtcbiAgICBub3JtYWxpemVkRnNNYXBbbm9ybWFsaXplRmlsZVBhdGgoZnNQYXRoKV0gPSBmaWxlQ29udGVudFxuICB9XG4gIHJldHVybiBub3JtYWxpemVkRnNNYXBcbn1cbiIsICJpbXBvcnQgdHlwZSB7IEFueUNpcmN1aXRFbGVtZW50IH0gZnJvbSBcImNpcmN1aXQtanNvblwiXG5pbXBvcnQgdHlwZSB7XG4gIENpcmN1aXRSdW5uZXJBcGksXG4gIENpcmN1aXRSdW5uZXJDb25maWd1cmF0aW9uLFxufSBmcm9tIFwibGliL3NoYXJlZC90eXBlc1wiXG5pbXBvcnQgeyBjcmVhdGVFeGVjdXRpb25Db250ZXh0IH0gZnJvbSBcIi4uLy4uL3dlYndvcmtlci9leGVjdXRpb24tY29udGV4dFwiXG5pbXBvcnQgeyBub3JtYWxpemVGc01hcCB9IGZyb20gXCIuL25vcm1hbGl6ZUZzTWFwXCJcbmltcG9ydCB0eXBlIHsgUm9vdENpcmN1aXQgfSBmcm9tIFwiQHRzY2lyY3VpdC9jb3JlXCJcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gXCJyZWFjdFwiXG5pbXBvcnQgeyBpbXBvcnRFdmFsUGF0aCB9IGZyb20gXCJ3ZWJ3b3JrZXIvaW1wb3J0LWV2YWwtcGF0aFwiXG5pbXBvcnQgeyBzZXR1cERlZmF1bHRFbnRyeXBvaW50SWZOZWVkZWQgfSBmcm9tIFwiLi9zZXR1cERlZmF1bHRFbnRyeXBvaW50SWZOZWVkZWRcIlxuXG5leHBvcnQgY2xhc3MgQ2lyY3VpdFJ1bm5lciBpbXBsZW1lbnRzIENpcmN1aXRSdW5uZXJBcGkge1xuICBfZXhlY3V0aW9uQ29udGV4dDogUmV0dXJuVHlwZTx0eXBlb2YgY3JlYXRlRXhlY3V0aW9uQ29udGV4dD4gfCBudWxsID0gbnVsbFxuICBfY2lyY3VpdFJ1bm5lckNvbmZpZ3VyYXRpb246IENpcmN1aXRSdW5uZXJDb25maWd1cmF0aW9uID0ge1xuICAgIHNuaXBwZXRzQXBpQmFzZVVybDogXCJodHRwczovL3JlZ2lzdHJ5LWFwaS50c2NpcmN1aXQuY29tXCIsXG4gICAgY2pzUmVnaXN0cnlVcmw6IFwiaHR0cHM6Ly9janMudHNjaXJjdWl0LmNvbVwiLFxuICAgIHZlcmJvc2U6IGZhbHNlLFxuICB9XG4gIF9ldmVudExpc3RlbmVyczogUmVjb3JkPHN0cmluZywgKCguLi5hcmdzOiBhbnlbXSkgPT4gdm9pZClbXT4gPSB7fVxuXG4gIGFzeW5jIGV4ZWN1dGVXaXRoRnNNYXAob2dPcHRzOiB7XG4gICAgZW50cnlwb2ludD86IHN0cmluZ1xuICAgIG1haW5Db21wb25lbnRQYXRoPzogc3RyaW5nXG4gICAgbWFpbkNvbXBvbmVudE5hbWU/OiBzdHJpbmdcbiAgICBmc01hcDogUmVjb3JkPHN0cmluZywgc3RyaW5nPlxuICAgIG5hbWU/OiBzdHJpbmdcbiAgICBtYWluQ29tcG9uZW50UHJvcHM/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+XG4gIH0pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBvcHRzID0geyAuLi5vZ09wdHMgfVxuICAgIGlmICh0aGlzLl9jaXJjdWl0UnVubmVyQ29uZmlndXJhdGlvbi52ZXJib3NlKSB7XG4gICAgICBjb25zb2xlLmxvZyhcIltDaXJjdWl0UnVubmVyXSBleGVjdXRlV2l0aEZzTWFwIGNhbGxlZCB3aXRoOlwiLCB7XG4gICAgICAgIGVudHJ5cG9pbnQ6IG9wdHMuZW50cnlwb2ludCxcbiAgICAgICAgZnNNYXBLZXlzOiBPYmplY3Qua2V5cyhvcHRzLmZzTWFwKSxcbiAgICAgICAgbmFtZTogb3B0cy5uYW1lLFxuICAgICAgfSlcbiAgICB9XG5cbiAgICBzZXR1cERlZmF1bHRFbnRyeXBvaW50SWZOZWVkZWQob3B0cylcblxuICAgIHRoaXMuX2V4ZWN1dGlvbkNvbnRleHQgPSBjcmVhdGVFeGVjdXRpb25Db250ZXh0KFxuICAgICAgdGhpcy5fY2lyY3VpdFJ1bm5lckNvbmZpZ3VyYXRpb24sXG4gICAgICB7XG4gICAgICAgIG5hbWU6IG9wdHMubmFtZSxcbiAgICAgIH0sXG4gICAgKVxuICAgIHRoaXMuX2JpbmRFdmVudExpc3RlbmVycyh0aGlzLl9leGVjdXRpb25Db250ZXh0LmNpcmN1aXQpXG5cbiAgICB0aGlzLl9leGVjdXRpb25Db250ZXh0LmZzTWFwID0gbm9ybWFsaXplRnNNYXAob3B0cy5mc01hcClcbiAgICBpZiAoIXRoaXMuX2V4ZWN1dGlvbkNvbnRleHQuZnNNYXBbb3B0cy5lbnRyeXBvaW50IV0pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRW50cnlwb2ludCBcIiR7b3B0cy5lbnRyeXBvaW50fVwiIG5vdCBmb3VuZGApXG4gICAgfVxuICAgIDsoZ2xvYmFsVGhpcyBhcyBhbnkpLl9fdHNjaXJjdWl0X2NpcmN1aXQgPSB0aGlzLl9leGVjdXRpb25Db250ZXh0LmNpcmN1aXRcblxuICAgIGNvbnN0IGVudHJ5cG9pbnQgPSBvcHRzLmVudHJ5cG9pbnQhLnN0YXJ0c1dpdGgoXCIuL1wiKVxuICAgICAgPyBvcHRzLmVudHJ5cG9pbnRcbiAgICAgIDogYC4vJHtvcHRzLmVudHJ5cG9pbnR9YFxuXG4gICAgYXdhaXQgaW1wb3J0RXZhbFBhdGgoZW50cnlwb2ludCEsIHRoaXMuX2V4ZWN1dGlvbkNvbnRleHQpXG4gIH1cblxuICBhc3luYyBleGVjdXRlKGNvZGU6IHN0cmluZywgb3B0czogeyBuYW1lPzogc3RyaW5nIH0gPSB7fSkge1xuICAgIGlmICh0aGlzLl9jaXJjdWl0UnVubmVyQ29uZmlndXJhdGlvbi52ZXJib3NlKSB7XG4gICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgXCJbQ2lyY3VpdFJ1bm5lcl0gZXhlY3V0ZSBjYWxsZWQgd2l0aCBjb2RlIGxlbmd0aDpcIixcbiAgICAgICAgY29kZS5sZW5ndGgsXG4gICAgICApXG4gICAgfVxuXG4gICAgdGhpcy5fZXhlY3V0aW9uQ29udGV4dCA9IGNyZWF0ZUV4ZWN1dGlvbkNvbnRleHQoXG4gICAgICB0aGlzLl9jaXJjdWl0UnVubmVyQ29uZmlndXJhdGlvbixcbiAgICAgIG9wdHMsXG4gICAgKVxuICAgIHRoaXMuX2JpbmRFdmVudExpc3RlbmVycyh0aGlzLl9leGVjdXRpb25Db250ZXh0LmNpcmN1aXQpXG4gICAgdGhpcy5fZXhlY3V0aW9uQ29udGV4dC5mc01hcFtcImVudHJ5cG9pbnQudHN4XCJdID0gY29kZVxuICAgIDsoZ2xvYmFsVGhpcyBhcyBhbnkpLl9fdHNjaXJjdWl0X2NpcmN1aXQgPSB0aGlzLl9leGVjdXRpb25Db250ZXh0LmNpcmN1aXRcblxuICAgIGF3YWl0IGltcG9ydEV2YWxQYXRoKFwiLi9lbnRyeXBvaW50LnRzeFwiLCB0aGlzLl9leGVjdXRpb25Db250ZXh0KVxuICB9XG5cbiAgb24oZXZlbnQ6IHN0cmluZywgY2FsbGJhY2s6ICguLi5hcmdzOiBhbnlbXSkgPT4gdm9pZCkge1xuICAgIHRoaXMuX2V2ZW50TGlzdGVuZXJzW2V2ZW50XSA/Pz0gW11cbiAgICB0aGlzLl9ldmVudExpc3RlbmVyc1tldmVudF0ucHVzaChjYWxsYmFjaylcbiAgICB0aGlzLl9leGVjdXRpb25Db250ZXh0Py5jaXJjdWl0Lm9uKGV2ZW50IGFzIGFueSwgY2FsbGJhY2spXG4gIH1cblxuICBhc3luYyByZW5kZXJVbnRpbFNldHRsZWQoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKCF0aGlzLl9leGVjdXRpb25Db250ZXh0KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJObyBjaXJjdWl0IGhhcyBiZWVuIGNyZWF0ZWRcIilcbiAgICB9XG4gICAgYXdhaXQgdGhpcy5fZXhlY3V0aW9uQ29udGV4dC5jaXJjdWl0LnJlbmRlclVudGlsU2V0dGxlZCgpXG4gIH1cblxuICBhc3luYyBnZXRDaXJjdWl0SnNvbigpOiBQcm9taXNlPEFueUNpcmN1aXRFbGVtZW50W10+IHtcbiAgICBpZiAoIXRoaXMuX2V4ZWN1dGlvbkNvbnRleHQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIk5vIGNpcmN1aXQgaGFzIGJlZW4gY3JlYXRlZFwiKVxuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fZXhlY3V0aW9uQ29udGV4dC5jaXJjdWl0LmdldENpcmN1aXRKc29uKClcbiAgfVxuXG4gIGNsZWFyRXZlbnRMaXN0ZW5lcnMoKSB7XG4gICAgaWYgKHRoaXMuX2V4ZWN1dGlvbkNvbnRleHQ/LmNpcmN1aXQpIHtcbiAgICAgIGZvciAoY29uc3QgZXZlbnQgaW4gdGhpcy5fZXZlbnRMaXN0ZW5lcnMpIHtcbiAgICAgICAgZm9yIChjb25zdCBsaXN0ZW5lciBvZiB0aGlzLl9ldmVudExpc3RlbmVyc1tldmVudF0pIHtcbiAgICAgICAgICBjb25zdCBjaXJjdWl0ID0gdGhpcy5fZXhlY3V0aW9uQ29udGV4dC5jaXJjdWl0IGFzIHVua25vd24gYXMge1xuICAgICAgICAgICAgLy8gYmlvbWUtaWdub3JlIGxpbnQvY29tcGxleGl0eS9ub0Jhbm5lZFR5cGVzOiA8ZXhwbGFuYXRpb24+XG4gICAgICAgICAgICByZW1vdmVMaXN0ZW5lcj86IChldmVudDogc3RyaW5nLCBsaXN0ZW5lcjogRnVuY3Rpb24pID0+IHZvaWRcbiAgICAgICAgICB9XG4gICAgICAgICAgY2lyY3VpdC5yZW1vdmVMaXN0ZW5lcj8uKGV2ZW50LCBsaXN0ZW5lcilcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGZvciAoY29uc3QgZXZlbnQgaW4gdGhpcy5fZXZlbnRMaXN0ZW5lcnMpIHtcbiAgICAgIGRlbGV0ZSB0aGlzLl9ldmVudExpc3RlbmVyc1tldmVudF1cbiAgICB9XG4gIH1cblxuICBhc3luYyBraWxsKCkge1xuICAgIC8vIENsZWFudXAgcmVzb3VyY2VzXG4gICAgdGhpcy5fZXhlY3V0aW9uQ29udGV4dCA9IG51bGxcbiAgfVxuXG4gIGFzeW5jIHNldFNuaXBwZXRzQXBpQmFzZVVybChiYXNlVXJsOiBzdHJpbmcpIHtcbiAgICB0aGlzLl9jaXJjdWl0UnVubmVyQ29uZmlndXJhdGlvbi5zbmlwcGV0c0FwaUJhc2VVcmwgPSBiYXNlVXJsXG4gIH1cblxuICBwcml2YXRlIF9iaW5kRXZlbnRMaXN0ZW5lcnMoY2lyY3VpdDogUm9vdENpcmN1aXQpIHtcbiAgICBmb3IgKGNvbnN0IGV2ZW50IGluIHRoaXMuX2V2ZW50TGlzdGVuZXJzKSB7XG4gICAgICBmb3IgKGNvbnN0IGxpc3RlbmVyIG9mIHRoaXMuX2V2ZW50TGlzdGVuZXJzW2V2ZW50XSkge1xuICAgICAgICBjaXJjdWl0Lm9uKGV2ZW50IGFzIGFueSwgbGlzdGVuZXIgYXMgYW55KVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuIiwgIi8qKlxuICogUmV0dXJucyB0aGUgZGlyZWN0b3J5IG5hbWUgb2YgYSBwYXRoLCBzaW1pbGFyIHRvIE5vZGUuanMgcGF0aC5kaXJuYW1lXG4gKiBXb3JrcyBvbiBib3RoIFVuaXggYW5kIFdpbmRvd3MgcGF0aHNcbiAqIEBwYXJhbSBwYXRoIFRoZSBwYXRoIHRvIGV4dHJhY3QgdGhlIGRpcmVjdG9yeSBmcm9tXG4gKiBAcmV0dXJucyBUaGUgZGlyZWN0b3J5IHBhcnQgb2YgdGhlIHBhdGhcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRpcm5hbWUocGF0aDogc3RyaW5nKTogc3RyaW5nIHtcbiAgaWYgKCFwYXRoKSByZXR1cm4gXCIuXCJcblxuICAvLyBOb3JtYWxpemUgcGF0aCBzZXBhcmF0b3JzIHRvIGZvcndhcmQgc2xhc2hlc1xuICBjb25zdCBub3JtYWxpemVkUGF0aCA9IHBhdGgucmVwbGFjZSgvXFxcXC9nLCBcIi9cIilcblxuICAvLyBSZW1vdmUgdHJhaWxpbmcgc2xhc2hlc1xuICBjb25zdCBjbGVhblBhdGggPSBub3JtYWxpemVkUGF0aC5yZXBsYWNlKC9cXC8rJC8sIFwiXCIpXG5cbiAgLy8gSWYgdGhlcmUgYXJlIG5vIHNsYXNoZXMsIHJldHVybiBcIi5cIlxuICBpZiAoY2xlYW5QYXRoLmluZGV4T2YoXCIvXCIpID09PSAtMSkgcmV0dXJuIFwiLlwiXG5cbiAgLy8gUmV0dXJuIGV2ZXJ5dGhpbmcgdXAgdG8gdGhlIGxhc3Qgc2xhc2hcbiAgcmV0dXJuIGNsZWFuUGF0aC5zdWJzdHJpbmcoMCwgY2xlYW5QYXRoLmxhc3RJbmRleE9mKFwiL1wiKSkgfHwgXCIvXCJcbn1cbiIsICJpbXBvcnQgeyBub3JtYWxpemVGaWxlUGF0aCB9IGZyb20gXCIuL25vcm1hbGl6ZUZzTWFwXCJcbmltcG9ydCB7IGRpcm5hbWUgfSBmcm9tIFwibGliL3V0aWxzL2Rpcm5hbWVcIlxuXG5mdW5jdGlvbiByZXNvbHZlUmVsYXRpdmVQYXRoKGltcG9ydFBhdGg6IHN0cmluZywgY3dkOiBzdHJpbmcpOiBzdHJpbmcge1xuICAvLyBIYW5kbGUgcGFyZW50IGRpcmVjdG9yeSBuYXZpZ2F0aW9uXG4gIGlmIChpbXBvcnRQYXRoLnN0YXJ0c1dpdGgoXCIuLi9cIikpIHtcbiAgICBjb25zdCBwYXJlbnREaXIgPSBkaXJuYW1lKGN3ZClcbiAgICByZXR1cm4gcmVzb2x2ZVJlbGF0aXZlUGF0aChpbXBvcnRQYXRoLnNsaWNlKDMpLCBwYXJlbnREaXIpXG4gIH1cbiAgLy8gSGFuZGxlIGN1cnJlbnQgZGlyZWN0b3J5XG4gIGlmIChpbXBvcnRQYXRoLnN0YXJ0c1dpdGgoXCIuL1wiKSkge1xuICAgIHJldHVybiByZXNvbHZlUmVsYXRpdmVQYXRoKGltcG9ydFBhdGguc2xpY2UoMiksIGN3ZClcbiAgfVxuICAvLyBIYW5kbGUgYWJzb2x1dGUgcGF0aFxuICBpZiAoaW1wb3J0UGF0aC5zdGFydHNXaXRoKFwiL1wiKSkge1xuICAgIHJldHVybiBpbXBvcnRQYXRoLnNsaWNlKDEpXG4gIH1cbiAgLy8gSGFuZGxlIHJlbGF0aXZlIHBhdGhcbiAgcmV0dXJuIGAke2N3ZH0vJHtpbXBvcnRQYXRofWBcbn1cblxuZXhwb3J0IGNvbnN0IHJlc29sdmVGaWxlUGF0aCA9IChcbiAgdW5rbm93bkZpbGVQYXRoOiBzdHJpbmcsXG4gIGZzTWFwT3JBbGxGaWxlUGF0aHM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gfCBzdHJpbmdbXSxcbiAgY3dkPzogc3RyaW5nLFxuKSA9PiB7XG4gIC8vIEhhbmRsZSBwYXJlbnQgZGlyZWN0b3J5IG5hdmlnYXRpb24gcHJvcGVybHlcbiAgY29uc3QgcmVzb2x2ZWRQYXRoID0gY3dkXG4gICAgPyByZXNvbHZlUmVsYXRpdmVQYXRoKHVua25vd25GaWxlUGF0aCwgY3dkKVxuICAgIDogdW5rbm93bkZpbGVQYXRoXG5cbiAgY29uc3QgZmlsZVBhdGhzID0gbmV3IFNldChcbiAgICBBcnJheS5pc0FycmF5KGZzTWFwT3JBbGxGaWxlUGF0aHMpXG4gICAgICA/IGZzTWFwT3JBbGxGaWxlUGF0aHNcbiAgICAgIDogT2JqZWN0LmtleXMoZnNNYXBPckFsbEZpbGVQYXRocyksXG4gIClcblxuICBpZiAoZmlsZVBhdGhzLmhhcyhyZXNvbHZlZFBhdGgpKSB7XG4gICAgcmV0dXJuIHJlc29sdmVkUGF0aFxuICB9XG5cbiAgY29uc3Qgbm9ybWFsaXplZEZpbGVQYXRoTWFwID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZz4oKVxuICBmb3IgKGNvbnN0IGZpbGVQYXRoIG9mIGZpbGVQYXRocykge1xuICAgIG5vcm1hbGl6ZWRGaWxlUGF0aE1hcC5zZXQobm9ybWFsaXplRmlsZVBhdGgoZmlsZVBhdGgpLCBmaWxlUGF0aClcbiAgfVxuXG4gIGNvbnN0IG5vcm1hbGl6ZWRSZXNvbHZlZFBhdGggPSBub3JtYWxpemVGaWxlUGF0aChyZXNvbHZlZFBhdGgpXG5cbiAgaWYgKG5vcm1hbGl6ZWRGaWxlUGF0aE1hcC5oYXMobm9ybWFsaXplZFJlc29sdmVkUGF0aCkpIHtcbiAgICByZXR1cm4gbm9ybWFsaXplZEZpbGVQYXRoTWFwLmdldChub3JtYWxpemVkUmVzb2x2ZWRQYXRoKSFcbiAgfVxuXG4gIC8vIFNlYXJjaCBmb3IgZmlsZSB3aXRoIGEgc2V0IG9mIGRpZmZlcmVudCBleHRlbnNpb25zXG4gIGNvbnN0IGV4dGVuc2lvbiA9IFtcInRzeFwiLCBcInRzXCIsIFwianNvblwiLCBcImpzXCIsIFwianN4XCJdXG4gIGZvciAoY29uc3QgZXh0IG9mIGV4dGVuc2lvbikge1xuICAgIGNvbnN0IHBvc3NpYmxlRmlsZVBhdGggPSBgJHtub3JtYWxpemVkUmVzb2x2ZWRQYXRofS4ke2V4dH1gXG4gICAgaWYgKG5vcm1hbGl6ZWRGaWxlUGF0aE1hcC5oYXMocG9zc2libGVGaWxlUGF0aCkpIHtcbiAgICAgIHJldHVybiBub3JtYWxpemVkRmlsZVBhdGhNYXAuZ2V0KHBvc3NpYmxlRmlsZVBhdGgpIVxuICAgIH1cbiAgfVxuXG4gIC8vIENoZWNrIGlmIGl0J3MgYW4gYWJzb2x1dGUgaW1wb3J0XG4gIGlmICghdW5rbm93bkZpbGVQYXRoLnN0YXJ0c1dpdGgoXCIuL1wiKSAmJiAhdW5rbm93bkZpbGVQYXRoLnN0YXJ0c1dpdGgoXCIuLi9cIikpIHtcbiAgICBjb25zdCBub3JtYWxpemVkVW5rbm93bkZpbGVQYXRoID0gbm9ybWFsaXplRmlsZVBhdGgodW5rbm93bkZpbGVQYXRoKVxuICAgIGlmIChub3JtYWxpemVkRmlsZVBhdGhNYXAuaGFzKG5vcm1hbGl6ZWRVbmtub3duRmlsZVBhdGgpKSB7XG4gICAgICByZXR1cm4gbm9ybWFsaXplZEZpbGVQYXRoTWFwLmdldChub3JtYWxpemVkVW5rbm93bkZpbGVQYXRoKSFcbiAgICB9XG4gICAgZm9yIChjb25zdCBleHQgb2YgZXh0ZW5zaW9uKSB7XG4gICAgICBjb25zdCBwb3NzaWJsZUZpbGVQYXRoID0gYCR7bm9ybWFsaXplZFVua25vd25GaWxlUGF0aH0uJHtleHR9YFxuICAgICAgaWYgKG5vcm1hbGl6ZWRGaWxlUGF0aE1hcC5oYXMocG9zc2libGVGaWxlUGF0aCkpIHtcbiAgICAgICAgcmV0dXJuIG5vcm1hbGl6ZWRGaWxlUGF0aE1hcC5nZXQocG9zc2libGVGaWxlUGF0aCkhXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG51bGxcbn1cblxuZXhwb3J0IGNvbnN0IHJlc29sdmVGaWxlUGF0aE9yVGhyb3cgPSAoXG4gIHVua25vd25GaWxlUGF0aDogc3RyaW5nLFxuICBmc01hcE9yQWxsRmlsZVBhdGhzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IHwgc3RyaW5nW10sXG4pID0+IHtcbiAgY29uc3QgcmVzb2x2ZWRGaWxlUGF0aCA9IHJlc29sdmVGaWxlUGF0aCh1bmtub3duRmlsZVBhdGgsIGZzTWFwT3JBbGxGaWxlUGF0aHMpXG4gIGlmICghcmVzb2x2ZWRGaWxlUGF0aCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBGaWxlIG5vdCBmb3VuZCBcIiR7dW5rbm93bkZpbGVQYXRofVwiLCBhdmFpbGFibGUgcGF0aHM6XFxuXFxuJHtPYmplY3Qua2V5cyhmc01hcE9yQWxsRmlsZVBhdGhzKS5qb2luKFwiLCBcIil9YCxcbiAgICApXG4gIH1cbiAgcmV0dXJuIHJlc29sdmVkRmlsZVBhdGhcbn1cbiIsICJpbXBvcnQgeyByZXNvbHZlRmlsZVBhdGggfSBmcm9tIFwibGliL3J1bm5lci9yZXNvbHZlRmlsZVBhdGhcIlxuXG5leHBvcnQgZnVuY3Rpb24gZXZhbENvbXBpbGVkSnMoXG4gIGNvbXBpbGVkQ29kZTogc3RyaW5nLFxuICBwcmVTdXBwbGllZEltcG9ydHM6IFJlY29yZDxzdHJpbmcsIGFueT4sXG4gIGN3ZD86IHN0cmluZyxcbikge1xuICA7KGdsb2JhbFRoaXMgYXMgYW55KS5fX3RzY2lyY3VpdF9yZXF1aXJlID0gKG5hbWU6IHN0cmluZykgPT4ge1xuICAgIGNvbnN0IHJlc29sdmVkRmlsZVBhdGggPSByZXNvbHZlRmlsZVBhdGgobmFtZSwgcHJlU3VwcGxpZWRJbXBvcnRzLCBjd2QpXG5cbiAgICBjb25zdCBoYXNSZXNvbHZlZEZpbGVQYXRoID1cbiAgICAgIHJlc29sdmVkRmlsZVBhdGggJiYgcHJlU3VwcGxpZWRJbXBvcnRzW3Jlc29sdmVkRmlsZVBhdGhdXG5cbiAgICBpZiAoIXByZVN1cHBsaWVkSW1wb3J0c1tuYW1lXSAmJiAhaGFzUmVzb2x2ZWRGaWxlUGF0aCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbXBvcnQgXCIke25hbWV9XCIgbm90IGZvdW5kICR7Y3dkID8gYGluIFwiJHtjd2R9XCJgIDogXCJcIn1gKVxuICAgIH1cblxuICAgIGNvbnN0IG1vZCA9XG4gICAgICBwcmVTdXBwbGllZEltcG9ydHNbbmFtZV0gfHwgcHJlU3VwcGxpZWRJbXBvcnRzW3Jlc29sdmVkRmlsZVBhdGghXVxuICAgIHJldHVybiBuZXcgUHJveHkobW9kLCB7XG4gICAgICBnZXQodGFyZ2V0LCBwcm9wKSB7XG4gICAgICAgIGlmICghKHByb3AgaW4gdGFyZ2V0KSkge1xuICAgICAgICAgIGlmIChwcm9wID09PSBcImRlZmF1bHRcIikge1xuICAgICAgICAgICAgaWYgKHRhcmdldC5kZWZhdWx0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHRhcmdldC5kZWZhdWx0XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh0YXJnZXQuX19lc01vZHVsZSkge1xuICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh0eXBlb2YgdGFyZ2V0ID09PSBcImZ1bmN0aW9uXCIgfHwgdHlwZW9mIHRhcmdldCA9PT0gXCJvYmplY3RcIikge1xuICAgICAgICAgICAgICByZXR1cm4gdGFyZ2V0XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWRcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAocHJvcCA9PT0gXCJfX2VzTW9kdWxlXCIpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgYENvbXBvbmVudCBcIiR7U3RyaW5nKHByb3ApfVwiIGlzIG5vdCBleHBvcnRlZCBieSBcIiR7bmFtZX1cImAsXG4gICAgICAgICAgKVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRhcmdldFtwcm9wIGFzIGtleW9mIHR5cGVvZiB0YXJnZXRdXG4gICAgICB9LFxuICAgIH0pXG4gIH1cblxuICBjb25zdCBmdW5jdGlvbkJvZHkgPSBgXG4gIHZhciBleHBvcnRzID0ge307XG4gIHZhciByZXF1aXJlID0gZ2xvYmFsVGhpcy5fX3RzY2lyY3VpdF9yZXF1aXJlO1xuICB2YXIgbW9kdWxlID0geyBleHBvcnRzIH07XG4gIHZhciBjaXJjdWl0ID0gZ2xvYmFsVGhpcy5fX3RzY2lyY3VpdF9jaXJjdWl0O1xuICAke2NvbXBpbGVkQ29kZX07XG4gIHJldHVybiBtb2R1bGU7YC50cmltKClcbiAgcmV0dXJuIEZ1bmN0aW9uKGZ1bmN0aW9uQm9keSkuY2FsbChnbG9iYWxUaGlzKVxufVxuIiwgImltcG9ydCB7IGV2YWxDb21waWxlZEpzIH0gZnJvbSBcIi4vZXZhbC1jb21waWxlZC1qc1wiXG5pbXBvcnQgdHlwZSB7IEV4ZWN1dGlvbkNvbnRleHQgfSBmcm9tIFwiLi9leGVjdXRpb24tY29udGV4dFwiXG5pbXBvcnQgKiBhcyBCYWJlbCBmcm9tIFwiQGJhYmVsL3N0YW5kYWxvbmVcIlxuaW1wb3J0IHsgaW1wb3J0TG9jYWxGaWxlIH0gZnJvbSBcIi4vaW1wb3J0LWxvY2FsLWZpbGVcIlxuaW1wb3J0IHsgaW1wb3J0U25pcHBldCB9IGZyb20gXCIuL2ltcG9ydC1zbmlwcGV0XCJcbmltcG9ydCB7IHJlc29sdmVGaWxlUGF0aCB9IGZyb20gXCJsaWIvcnVubmVyL3Jlc29sdmVGaWxlUGF0aFwiXG5pbXBvcnQgeyByZXNvbHZlTm9kZU1vZHVsZSB9IGZyb20gXCJsaWIvdXRpbHMvcmVzb2x2ZS1ub2RlLW1vZHVsZVwiXG5pbXBvcnQgeyBpbXBvcnROb2RlTW9kdWxlIH0gZnJvbSBcIi4vaW1wb3J0LW5vZGUtbW9kdWxlXCJcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGltcG9ydEV2YWxQYXRoKFxuICBpbXBvcnROYW1lOiBzdHJpbmcsXG4gIGN0eDogRXhlY3V0aW9uQ29udGV4dCxcbiAgZGVwdGggPSAwLFxuICBvcHRzOiB7XG4gICAgY3dkPzogc3RyaW5nXG4gIH0gPSB7fSxcbikge1xuICBpZiAoY3R4LnZlcmJvc2UpIHtcbiAgICBjb25zb2xlLmxvZyhgW1dvcmtlcl0gJHtcIiAgXCIucmVwZWF0KGRlcHRoKX1cdTI3QTFcdUZFMEZgLCBpbXBvcnROYW1lKVxuICB9XG4gIGNvbnN0IHsgcHJlU3VwcGxpZWRJbXBvcnRzIH0gPSBjdHhcblxuICBpZiAocHJlU3VwcGxpZWRJbXBvcnRzW2ltcG9ydE5hbWVdKSByZXR1cm5cbiAgaWYgKGltcG9ydE5hbWUuc3RhcnRzV2l0aChcIi4vXCIpICYmIHByZVN1cHBsaWVkSW1wb3J0c1tpbXBvcnROYW1lLnNsaWNlKDIpXSlcbiAgICByZXR1cm5cblxuICBpZiAoZGVwdGggPiA1KSB7XG4gICAgY29uc29sZS5sb2coXCJNYXggZGVwdGggZm9yIGltcG9ydHMgcmVhY2hlZFwiKVxuICAgIHJldHVyblxuICB9XG5cbiAgY29uc3QgcmVzb2x2ZWRMb2NhbEltcG9ydFBhdGggPSByZXNvbHZlRmlsZVBhdGgoXG4gICAgaW1wb3J0TmFtZSxcbiAgICBjdHguZnNNYXAsXG4gICAgb3B0cy5jd2QsXG4gIClcbiAgaWYgKHJlc29sdmVkTG9jYWxJbXBvcnRQYXRoKSB7XG4gICAgcmV0dXJuIGltcG9ydExvY2FsRmlsZShyZXNvbHZlZExvY2FsSW1wb3J0UGF0aCwgY3R4LCBkZXB0aClcbiAgfVxuXG4gIC8vIFRyeSB0byByZXNvbHZlIGZyb20gbm9kZV9tb2R1bGVzXG4gIGNvbnN0IHJlc29sdmVkTm9kZU1vZHVsZVBhdGggPSByZXNvbHZlTm9kZU1vZHVsZShcbiAgICBpbXBvcnROYW1lLFxuICAgIGN0eC5mc01hcCxcbiAgICBvcHRzLmN3ZCB8fCBcIlwiLFxuICApXG4gIGlmIChyZXNvbHZlZE5vZGVNb2R1bGVQYXRoKSB7XG4gICAgcmV0dXJuIGltcG9ydE5vZGVNb2R1bGUoaW1wb3J0TmFtZSwgY3R4LCBkZXB0aClcbiAgfVxuXG4gIGlmIChpbXBvcnROYW1lLnN0YXJ0c1dpdGgoXCJAdHNjaS9cIikpIHtcbiAgICByZXR1cm4gaW1wb3J0U25pcHBldChpbXBvcnROYW1lLCBjdHgsIGRlcHRoKVxuICB9XG5cbiAgdGhyb3cgbmV3IEVycm9yKFxuICAgIGBVbnJlc29sdmVkIGltcG9ydCBcIiR7aW1wb3J0TmFtZX1cIiAke29wdHMuY3dkID8gYGZyb20gZGlyZWN0b3J5IFwiJHtvcHRzLmN3ZH1cImAgOiBcIlwifWAsXG4gIClcbn1cbiIsICJpbXBvcnQgKiBhcyBCYWJlbCBmcm9tIFwiQGJhYmVsL3N0YW5kYWxvbmVcIlxuaW1wb3J0IHsgcmVzb2x2ZUZpbGVQYXRoT3JUaHJvdyB9IGZyb20gXCJsaWIvcnVubmVyL3Jlc29sdmVGaWxlUGF0aFwiXG5pbXBvcnQgeyBkaXJuYW1lIH0gZnJvbSBcImxpYi91dGlscy9kaXJuYW1lXCJcbmltcG9ydCB7IGdldEltcG9ydHNGcm9tQ29kZSB9IGZyb20gXCJsaWIvdXRpbHMvZ2V0LWltcG9ydHMtZnJvbS1jb2RlXCJcbmltcG9ydCB7IGV2YWxDb21waWxlZEpzIH0gZnJvbSBcIi4vZXZhbC1jb21waWxlZC1qc1wiXG5pbXBvcnQgdHlwZSB7IEV4ZWN1dGlvbkNvbnRleHQgfSBmcm9tIFwiLi9leGVjdXRpb24tY29udGV4dFwiXG5pbXBvcnQgeyBpbXBvcnRFdmFsUGF0aCB9IGZyb20gXCIuL2ltcG9ydC1ldmFsLXBhdGhcIlxuXG5leHBvcnQgY29uc3QgaW1wb3J0TG9jYWxGaWxlID0gYXN5bmMgKFxuICBpbXBvcnROYW1lOiBzdHJpbmcsXG4gIGN0eDogRXhlY3V0aW9uQ29udGV4dCxcbiAgZGVwdGggPSAwLFxuKSA9PiB7XG4gIGNvbnN0IHsgZnNNYXAsIHByZVN1cHBsaWVkSW1wb3J0cyB9ID0gY3R4XG5cbiAgY29uc3QgZnNQYXRoID0gcmVzb2x2ZUZpbGVQYXRoT3JUaHJvdyhpbXBvcnROYW1lLCBmc01hcClcbiAgaWYgKCFjdHguZnNNYXBbZnNQYXRoXSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgRmlsZSBcIiR7ZnNQYXRofVwiIG5vdCBmb3VuZGApXG4gIH1cbiAgY29uc3QgZmlsZUNvbnRlbnQgPSBmc01hcFtmc1BhdGhdXG4gIGlmIChmc1BhdGguZW5kc1dpdGgoXCIuanNvblwiKSkge1xuICAgIGNvbnN0IGpzb25EYXRhID0gSlNPTi5wYXJzZShmaWxlQ29udGVudClcbiAgICBwcmVTdXBwbGllZEltcG9ydHNbZnNQYXRoXSA9IHtcbiAgICAgIF9fZXNNb2R1bGU6IHRydWUsXG4gICAgICBkZWZhdWx0OiBqc29uRGF0YSxcbiAgICB9XG4gIH0gZWxzZSBpZiAoZnNQYXRoLmVuZHNXaXRoKFwiLnRzeFwiKSB8fCBmc1BhdGguZW5kc1dpdGgoXCIudHNcIikpIHtcbiAgICBjb25zdCBpbXBvcnROYW1lcyA9IGdldEltcG9ydHNGcm9tQ29kZShmaWxlQ29udGVudClcblxuICAgIGZvciAoY29uc3QgaW1wb3J0TmFtZSBvZiBpbXBvcnROYW1lcykge1xuICAgICAgaWYgKCFwcmVTdXBwbGllZEltcG9ydHNbaW1wb3J0TmFtZV0pIHtcbiAgICAgICAgYXdhaXQgaW1wb3J0RXZhbFBhdGgoaW1wb3J0TmFtZSwgY3R4LCBkZXB0aCArIDEsIHtcbiAgICAgICAgICBjd2Q6IGRpcm5hbWUoZnNQYXRoKSxcbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCByZXN1bHQgPSBCYWJlbC50cmFuc2Zvcm0oZmlsZUNvbnRlbnQsIHtcbiAgICAgIHByZXNldHM6IFtcInJlYWN0XCIsIFwidHlwZXNjcmlwdFwiXSxcbiAgICAgIHBsdWdpbnM6IFtcInRyYW5zZm9ybS1tb2R1bGVzLWNvbW1vbmpzXCJdLFxuICAgICAgZmlsZW5hbWU6IFwidmlydHVhbC50c3hcIixcbiAgICB9KVxuXG4gICAgaWYgKCFyZXN1bHQgfHwgIXJlc3VsdC5jb2RlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJGYWlsZWQgdG8gdHJhbnNmb3JtIGNvZGVcIilcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgaW1wb3J0UnVuUmVzdWx0ID0gZXZhbENvbXBpbGVkSnMoXG4gICAgICAgIHJlc3VsdC5jb2RlLFxuICAgICAgICBwcmVTdXBwbGllZEltcG9ydHMsXG4gICAgICAgIGRpcm5hbWUoZnNQYXRoKSxcbiAgICAgIClcbiAgICAgIHByZVN1cHBsaWVkSW1wb3J0c1tmc1BhdGhdID0gaW1wb3J0UnVuUmVzdWx0LmV4cG9ydHNcbiAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBFdmFsIGNvbXBpbGVkIGpzIGVycm9yIGZvciBcIiR7aW1wb3J0TmFtZX1cIjogJHtlcnJvci5tZXNzYWdlfWAsXG4gICAgICApXG4gICAgfVxuICB9IGVsc2UgaWYgKGZzUGF0aC5lbmRzV2l0aChcIi5qc1wiKSkge1xuICAgIC8vIEZvciAuanMgZmlsZXMsIGVzcGVjaWFsbHkgZnJvbSBub2RlX21vZHVsZXMsIHdlIG5lZWQgdG8gdHJhbnNmb3JtIHRoZW1cbiAgICBjb25zdCByZXN1bHQgPSBCYWJlbC50cmFuc2Zvcm0oZmlsZUNvbnRlbnQsIHtcbiAgICAgIHByZXNldHM6IFtcImVudlwiXSxcbiAgICAgIHBsdWdpbnM6IFtcInRyYW5zZm9ybS1tb2R1bGVzLWNvbW1vbmpzXCJdLFxuICAgICAgZmlsZW5hbWU6IGZzUGF0aCxcbiAgICB9KVxuXG4gICAgaWYgKCFyZXN1bHQgfHwgIXJlc3VsdC5jb2RlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJGYWlsZWQgdG8gdHJhbnNmb3JtIEpTIGNvZGVcIilcbiAgICB9XG5cbiAgICBwcmVTdXBwbGllZEltcG9ydHNbZnNQYXRoXSA9IGV2YWxDb21waWxlZEpzKFxuICAgICAgcmVzdWx0LmNvZGUsXG4gICAgICBwcmVTdXBwbGllZEltcG9ydHMsXG4gICAgICBkaXJuYW1lKGZzUGF0aCksXG4gICAgKS5leHBvcnRzXG4gIH0gZWxzZSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYFVuc3VwcG9ydGVkIGZpbGUgZXh0ZW5zaW9uIFwiJHtmc1BhdGguc3BsaXQoXCIuXCIpLnBvcCgpfVwiIGZvciBcIiR7ZnNQYXRofVwiYCxcbiAgICApXG4gIH1cbn1cbiIsICJleHBvcnQgY29uc3QgZ2V0SW1wb3J0c0Zyb21Db2RlID0gKGNvZGU6IHN0cmluZyk6IHN0cmluZ1tdID0+IHtcbiAgLy8gTWF0Y2ggYmFzaWMgaW1wb3J0IHBhdHRlcm5zIGluY2x1ZGluZyBjb21iaW5lZCBkZWZhdWx0IGFuZCBuYW1lc3BhY2UgaW1wb3J0c1xuICBjb25zdCBpbXBvcnRSZWdleCA9XG4gICAgL15cXHMqaW1wb3J0XFxzKyg/Oig/OltcXHdcXHNdKyxcXHMqKT8oPzpcXCpcXHMrYXNcXHMrW1xcd1xcc10rfFxce1tcXHNcXHcsXStcXH18XFx3KylcXHMrZnJvbVxccyspP1snXCJdKC4rPylbJ1wiXS9nbVxuICBjb25zdCBpbXBvcnRzOiBzdHJpbmdbXSA9IFtdXG4gIGxldCBtYXRjaDogUmVnRXhwRXhlY0FycmF5IHwgbnVsbFxuXG4gIC8vIGJpb21lLWlnbm9yZSBsaW50L3N1c3BpY2lvdXMvbm9Bc3NpZ25JbkV4cHJlc3Npb25zOiA8ZXhwbGFuYXRpb24+XG4gIHdoaWxlICgobWF0Y2ggPSBpbXBvcnRSZWdleC5leGVjKGNvZGUpKSAhPT0gbnVsbCkge1xuICAgIGltcG9ydHMucHVzaChtYXRjaFsxXSlcbiAgfVxuXG4gIC8vIE1hdGNoIHJlLWV4cG9ydHNcbiAgY29uc3QgcmVFeHBvcnRSZWdleCA9XG4gICAgL15cXHMqZXhwb3J0XFxzKyg/OlxcKnwoPzpcXHtbXFxzXFx3LF0rXFx9KSlcXHMrZnJvbVxccytbJ1wiXSguKz8pWydcIl0vZ21cbiAgbGV0IHJlRXhwb3J0TWF0Y2g6IFJlZ0V4cEV4ZWNBcnJheSB8IG51bGxcbiAgLy8gYmlvbWUtaWdub3JlIGxpbnQvc3VzcGljaW91cy9ub0Fzc2lnbkluRXhwcmVzc2lvbnM6IDxleHBsYW5hdGlvbj5cbiAgd2hpbGUgKChyZUV4cG9ydE1hdGNoID0gcmVFeHBvcnRSZWdleC5leGVjKGNvZGUpKSAhPT0gbnVsbCkge1xuICAgIGltcG9ydHMucHVzaChyZUV4cG9ydE1hdGNoWzFdKVxuICB9XG5cbiAgcmV0dXJuIGltcG9ydHNcbn1cbiIsICJpbXBvcnQgeyBldmFsQ29tcGlsZWRKcyB9IGZyb20gXCIuL2V2YWwtY29tcGlsZWQtanNcIlxuaW1wb3J0IHR5cGUgeyBFeGVjdXRpb25Db250ZXh0IH0gZnJvbSBcIi4vZXhlY3V0aW9uLWNvbnRleHRcIlxuaW1wb3J0ICogYXMgQmFiZWwgZnJvbSBcIkBiYWJlbC9zdGFuZGFsb25lXCJcbmltcG9ydCB7IGltcG9ydExvY2FsRmlsZSB9IGZyb20gXCIuL2ltcG9ydC1sb2NhbC1maWxlXCJcbmltcG9ydCB7IGltcG9ydEV2YWxQYXRoIH0gZnJvbSBcIi4vaW1wb3J0LWV2YWwtcGF0aFwiXG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBpbXBvcnRTbmlwcGV0KFxuICBpbXBvcnROYW1lOiBzdHJpbmcsXG4gIGN0eDogRXhlY3V0aW9uQ29udGV4dCxcbiAgZGVwdGggPSAwLFxuKSB7XG4gIGNvbnN0IHsgcHJlU3VwcGxpZWRJbXBvcnRzIH0gPSBjdHhcbiAgY29uc3QgZnVsbFNuaXBwZXROYW1lID0gaW1wb3J0TmFtZS5yZXBsYWNlKFwiQHRzY2kvXCIsIFwiXCIpLnJlcGxhY2UoXCIuXCIsIFwiL1wiKVxuXG4gIGNvbnN0IHsgY2pzLCBlcnJvciB9ID0gYXdhaXQgZmV0Y2goYCR7Y3R4LmNqc1JlZ2lzdHJ5VXJsfS8ke2Z1bGxTbmlwcGV0TmFtZX1gKVxuICAgIC50aGVuKGFzeW5jIChyZXMpID0+ICh7IGNqczogYXdhaXQgcmVzLnRleHQoKSwgZXJyb3I6IG51bGwgfSkpXG4gICAgLmNhdGNoKChlKSA9PiAoeyBlcnJvcjogZSwgY2pzOiBudWxsIH0pKVxuXG4gIGlmIChlcnJvcikge1xuICAgIGNvbnNvbGUuZXJyb3IoXCJFcnJvciBmZXRjaGluZyBpbXBvcnRcIiwgaW1wb3J0TmFtZSwgZXJyb3IpXG4gICAgcmV0dXJuXG4gIH1cblxuICB0cnkge1xuICAgIHByZVN1cHBsaWVkSW1wb3J0c1tpbXBvcnROYW1lXSA9IGV2YWxDb21waWxlZEpzKFxuICAgICAgY2pzISxcbiAgICAgIHByZVN1cHBsaWVkSW1wb3J0cyxcbiAgICApLmV4cG9ydHNcbiAgfSBjYXRjaCAoZSkge1xuICAgIGNvbnNvbGUuZXJyb3IoXCJFcnJvciBpbXBvcnRpbmcgc25pcHBldFwiLCBlKVxuICB9XG59XG4iLCAiaW1wb3J0IHsgZGlybmFtZSB9IGZyb20gXCIuL2Rpcm5hbWVcIlxuXG5pbnRlcmZhY2UgUGFja2FnZUpzb24ge1xuICBtYWluPzogc3RyaW5nXG4gIG1vZHVsZT86IHN0cmluZ1xuICBleHBvcnRzPzogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgUmVjb3JkPHN0cmluZywgc3RyaW5nPj5cbn1cblxuaW50ZXJmYWNlIE5vZGVSZXNvbHV0aW9uQ29udGV4dCB7XG4gIGZzTWFwOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+XG4gIGV4dGVuc2lvbnM6IHN0cmluZ1tdXG4gIGJhc2VQYXRoOiBzdHJpbmdcbiAgbW9kdWxlUGF0aDogc3RyaW5nXG59XG5cbmZ1bmN0aW9uIGNyZWF0ZUNvbnRleHQoXG4gIG1vZHVsZVBhdGg6IHN0cmluZyxcbiAgZnNNYXA6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4sXG4gIGJhc2VQYXRoOiBzdHJpbmcsXG4pOiBOb2RlUmVzb2x1dGlvbkNvbnRleHQge1xuICByZXR1cm4ge1xuICAgIGZzTWFwLFxuICAgIGV4dGVuc2lvbnM6IFtcIi5qc1wiLCBcIi5qc3hcIiwgXCIudHNcIiwgXCIudHN4XCIsIFwiLmpzb25cIl0sXG4gICAgYmFzZVBhdGgsXG4gICAgbW9kdWxlUGF0aCxcbiAgfVxufVxuXG5mdW5jdGlvbiBmaW5kUGFja2FnZUpzb24obm9kZU1vZHVsZXNQYXRoOiBzdHJpbmcsIGN0eDogTm9kZVJlc29sdXRpb25Db250ZXh0KSB7XG4gIGNvbnN0IHBhY2thZ2VKc29uUGF0aCA9IGAke25vZGVNb2R1bGVzUGF0aH0vcGFja2FnZS5qc29uYFxuICBpZiAoIWN0eC5mc01hcFtwYWNrYWdlSnNvblBhdGhdKSByZXR1cm4gbnVsbFxuICB0cnkge1xuICAgIHJldHVybiBKU09OLnBhcnNlKGN0eC5mc01hcFtwYWNrYWdlSnNvblBhdGhdKSBhcyBQYWNrYWdlSnNvblxuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gbnVsbFxuICB9XG59XG5cbmZ1bmN0aW9uIHRyeVJlc29sdmVXaXRoRXh0ZW5zaW9ucyhcbiAgcGF0aDogc3RyaW5nLFxuICBjdHg6IE5vZGVSZXNvbHV0aW9uQ29udGV4dCxcbik6IHN0cmluZyB8IG51bGwge1xuICBpZiAoY3R4LmZzTWFwW3BhdGhdKSByZXR1cm4gcGF0aFxuXG4gIGZvciAoY29uc3QgZXh0IG9mIGN0eC5leHRlbnNpb25zKSB7XG4gICAgY29uc3QgcGF0aFdpdGhFeHQgPSBwYXRoLnJlcGxhY2UoL1xcLmpzJHxcXC5qc3gkLywgXCJcIikgKyBleHRcbiAgICBpZiAoY3R4LmZzTWFwW3BhdGhXaXRoRXh0XSkgcmV0dXJuIHBhdGhXaXRoRXh0XG4gIH1cbiAgcmV0dXJuIG51bGxcbn1cblxuZnVuY3Rpb24gcmVzb2x2ZUV4cG9ydFBhdGgoXG4gIG5vZGVNb2R1bGVzUGF0aDogc3RyaW5nLFxuICBleHBvcnRQYXRoOiBzdHJpbmcsXG4gIGN0eDogTm9kZVJlc29sdXRpb25Db250ZXh0LFxuKTogc3RyaW5nIHwgbnVsbCB7XG4gIGNvbnN0IGZ1bGxFeHBvcnRQYXRoID0gYCR7bm9kZU1vZHVsZXNQYXRofS8ke2V4cG9ydFBhdGgucmVwbGFjZSgvXlxcLlxcLy8sIFwiXCIpfWBcbiAgcmV0dXJuIHRyeVJlc29sdmVXaXRoRXh0ZW5zaW9ucyhmdWxsRXhwb3J0UGF0aCwgY3R4KVxufVxuXG5mdW5jdGlvbiByZXNvbHZlUGFja2FnZUV4cG9ydHMoXG4gIG5vZGVNb2R1bGVzUGF0aDogc3RyaW5nLFxuICBwYWNrYWdlSnNvbjogUGFja2FnZUpzb24sXG4gIHJlbWFpbmluZ1BhdGg6IHN0cmluZyxcbiAgY3R4OiBOb2RlUmVzb2x1dGlvbkNvbnRleHQsXG4pOiBzdHJpbmcgfCBudWxsIHtcbiAgaWYgKCFwYWNrYWdlSnNvbi5leHBvcnRzKSByZXR1cm4gbnVsbFxuXG4gIC8vIEhhbmRsZSBkZWZhdWx0IGV4cG9ydCBjb25kaXRpb25cbiAgY29uc3QgZGVmYXVsdEV4cG9ydCA9IHBhY2thZ2VKc29uLmV4cG9ydHNbXCIuXCJdXG4gIGlmIChyZW1haW5pbmdQYXRoID09PSBcIlwiICYmIGRlZmF1bHRFeHBvcnQpIHtcbiAgICBpZiAodHlwZW9mIGRlZmF1bHRFeHBvcnQgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgIGNvbnN0IHJlc29sdmVkID0gcmVzb2x2ZUV4cG9ydFBhdGgobm9kZU1vZHVsZXNQYXRoLCBkZWZhdWx0RXhwb3J0LCBjdHgpXG4gICAgICBpZiAocmVzb2x2ZWQpIHJldHVybiByZXNvbHZlZFxuICAgIH1cbiAgfVxuXG4gIC8vIEhhbmRsZSBzdWJwYXRoIGV4cG9ydHNcbiAgY29uc3Qgc3VicGF0aEV4cG9ydCA9IHJlbWFpbmluZ1BhdGhcbiAgICA/IHBhY2thZ2VKc29uLmV4cG9ydHNbYC4vJHtyZW1haW5pbmdQYXRofWBdXG4gICAgOiBudWxsXG4gIGlmIChzdWJwYXRoRXhwb3J0ICYmIHR5cGVvZiBzdWJwYXRoRXhwb3J0ID09PSBcInN0cmluZ1wiKSB7XG4gICAgY29uc3QgcmVzb2x2ZWQgPSByZXNvbHZlRXhwb3J0UGF0aChub2RlTW9kdWxlc1BhdGgsIHN1YnBhdGhFeHBvcnQsIGN0eClcbiAgICBpZiAocmVzb2x2ZWQpIHJldHVybiByZXNvbHZlZFxuICB9XG5cbiAgLy8gSGFuZGxlIGNvbmRpdGlvbmFsIGV4cG9ydHNcbiAgY29uc3QgaW1wb3J0RXhwb3J0ID0gcGFja2FnZUpzb24uZXhwb3J0c1tcImltcG9ydFwiXVxuICBpZiAoXG4gICAgcmVtYWluaW5nUGF0aCA9PT0gXCJcIiAmJlxuICAgIGltcG9ydEV4cG9ydCAmJlxuICAgIHR5cGVvZiBpbXBvcnRFeHBvcnQgPT09IFwic3RyaW5nXCJcbiAgKSB7XG4gICAgY29uc3QgcmVzb2x2ZWQgPSByZXNvbHZlRXhwb3J0UGF0aChub2RlTW9kdWxlc1BhdGgsIGltcG9ydEV4cG9ydCwgY3R4KVxuICAgIGlmIChyZXNvbHZlZCkgcmV0dXJuIHJlc29sdmVkXG4gIH1cblxuICByZXR1cm4gbnVsbFxufVxuXG5mdW5jdGlvbiByZXNvbHZlUGFja2FnZUVudHJ5UG9pbnQoXG4gIG5vZGVNb2R1bGVzUGF0aDogc3RyaW5nLFxuICBwYWNrYWdlSnNvbjogUGFja2FnZUpzb24sXG4gIGN0eDogTm9kZVJlc29sdXRpb25Db250ZXh0LFxuKTogc3RyaW5nIHwgbnVsbCB7XG4gIGNvbnN0IGVudHJ5UG9pbnQgPSBwYWNrYWdlSnNvbi5tb2R1bGUgfHwgcGFja2FnZUpzb24ubWFpbiB8fCBcImluZGV4LmpzXCJcbiAgY29uc3QgZnVsbFBhdGggPSBgJHtub2RlTW9kdWxlc1BhdGh9LyR7ZW50cnlQb2ludH1gXG4gIHJldHVybiB0cnlSZXNvbHZlV2l0aEV4dGVuc2lvbnMoZnVsbFBhdGgsIGN0eClcbn1cblxuZnVuY3Rpb24gcmVzb2x2ZVJlbWFpbmluZ1BhdGgoXG4gIG5vZGVNb2R1bGVzUGF0aDogc3RyaW5nLFxuICByZW1haW5pbmdQYXRoOiBzdHJpbmcsXG4gIGN0eDogTm9kZVJlc29sdXRpb25Db250ZXh0LFxuKTogc3RyaW5nIHwgbnVsbCB7XG4gIGlmICghcmVtYWluaW5nUGF0aCkge1xuICAgIC8vIFRyeSBpbmRleCBmaWxlcyBpbiB0aGUgbW9kdWxlIHJvb3RcbiAgICBmb3IgKGNvbnN0IGV4dCBvZiBjdHguZXh0ZW5zaW9ucykge1xuICAgICAgY29uc3QgaW5kZXhQYXRoID0gYCR7bm9kZU1vZHVsZXNQYXRofS9pbmRleCR7ZXh0fWBcbiAgICAgIGlmIChjdHguZnNNYXBbaW5kZXhQYXRoXSkgcmV0dXJuIGluZGV4UGF0aFxuICAgIH1cbiAgICByZXR1cm4gbnVsbFxuICB9XG5cbiAgY29uc3QgZnVsbFBhdGggPSBgJHtub2RlTW9kdWxlc1BhdGh9LyR7cmVtYWluaW5nUGF0aH1gXG4gIGNvbnN0IGRpcmVjdE1hdGNoID0gdHJ5UmVzb2x2ZVdpdGhFeHRlbnNpb25zKGZ1bGxQYXRoLCBjdHgpXG4gIGlmIChkaXJlY3RNYXRjaCkgcmV0dXJuIGRpcmVjdE1hdGNoXG5cbiAgLy8gVHJ5IGluZGV4IGZpbGVzXG4gIGZvciAoY29uc3QgZXh0IG9mIGN0eC5leHRlbnNpb25zKSB7XG4gICAgY29uc3QgaW5kZXhQYXRoID0gYCR7ZnVsbFBhdGh9L2luZGV4JHtleHR9YFxuICAgIGlmIChjdHguZnNNYXBbaW5kZXhQYXRoXSkgcmV0dXJuIGluZGV4UGF0aFxuICB9XG4gIHJldHVybiBudWxsXG59XG5cbmZ1bmN0aW9uIHJlc29sdmVOb2RlTW9kdWxlSW5QYXRoKFxuICBzZWFyY2hQYXRoOiBzdHJpbmcsXG4gIGN0eDogTm9kZVJlc29sdXRpb25Db250ZXh0LFxuKTogc3RyaW5nIHwgbnVsbCB7XG4gIGNvbnN0IG1vZHVsZVBhcnRzID0gY3R4Lm1vZHVsZVBhdGguc3BsaXQoXCIvXCIpXG4gIGNvbnN0IHNjb3BlID0gbW9kdWxlUGFydHNbMF0uc3RhcnRzV2l0aChcIkBcIilcbiAgICA/IG1vZHVsZVBhcnRzLnNsaWNlKDAsIDIpLmpvaW4oXCIvXCIpXG4gICAgOiBtb2R1bGVQYXJ0c1swXVxuICBjb25zdCByZW1haW5pbmdQYXRoID0gbW9kdWxlUGFydHMuc2xpY2Uoc2NvcGUuaW5jbHVkZXMoXCIvXCIpID8gMiA6IDEpLmpvaW4oXCIvXCIpXG4gIGNvbnN0IG5vZGVNb2R1bGVzUGF0aCA9IGAke3NlYXJjaFBhdGggPT0gXCIuXCIgPyBcIlwiIDogYCR7c2VhcmNoUGF0aH0vYH1ub2RlX21vZHVsZXMvJHtzY29wZX1gXG5cbiAgLy8gVHJ5IHRvIGZpbmQgcGFja2FnZS5qc29uXG4gIGNvbnN0IHBhY2thZ2VKc29uID0gZmluZFBhY2thZ2VKc29uKG5vZGVNb2R1bGVzUGF0aCwgY3R4KVxuICBpZiAocGFja2FnZUpzb24pIHtcbiAgICAvLyBUcnkgcmVzb2x2aW5nIHRocm91Z2ggZXhwb3J0cyBmaWVsZFxuICAgIGNvbnN0IGV4cG9ydHNSZXNvbHV0aW9uID0gcmVzb2x2ZVBhY2thZ2VFeHBvcnRzKFxuICAgICAgbm9kZU1vZHVsZXNQYXRoLFxuICAgICAgcGFja2FnZUpzb24sXG4gICAgICByZW1haW5pbmdQYXRoLFxuICAgICAgY3R4LFxuICAgIClcbiAgICBpZiAoZXhwb3J0c1Jlc29sdXRpb24pIHJldHVybiBleHBvcnRzUmVzb2x1dGlvblxuXG4gICAgLy8gVHJ5IHJlc29sdmluZyB0aHJvdWdoIG1haW4vbW9kdWxlIGZpZWxkc1xuICAgIGNvbnN0IGVudHJ5UG9pbnRSZXNvbHV0aW9uID0gcmVzb2x2ZVBhY2thZ2VFbnRyeVBvaW50KFxuICAgICAgbm9kZU1vZHVsZXNQYXRoLFxuICAgICAgcGFja2FnZUpzb24sXG4gICAgICBjdHgsXG4gICAgKVxuICAgIGlmIChlbnRyeVBvaW50UmVzb2x1dGlvbikgcmV0dXJuIGVudHJ5UG9pbnRSZXNvbHV0aW9uXG4gIH1cblxuICAvLyBUcnkgcmVzb2x2aW5nIHJlbWFpbmluZyBwYXRoXG4gIGNvbnN0IHJlbWFpbmluZ1BhdGhSZXNvbHV0aW9uID0gcmVzb2x2ZVJlbWFpbmluZ1BhdGgoXG4gICAgbm9kZU1vZHVsZXNQYXRoLFxuICAgIHJlbWFpbmluZ1BhdGgsXG4gICAgY3R4LFxuICApXG4gIGlmIChyZW1haW5pbmdQYXRoUmVzb2x1dGlvbikgcmV0dXJuIHJlbWFpbmluZ1BhdGhSZXNvbHV0aW9uXG5cbiAgLy8gSWYgbm90IGZvdW5kIGFuZCB3ZSBoYXZlIGEgcGFyZW50IGRpcmVjdG9yeSwgdHJ5IHRoZXJlXG4gIGNvbnN0IHBhcmVudFBhdGggPSBkaXJuYW1lKHNlYXJjaFBhdGgpXG4gIGlmIChwYXJlbnRQYXRoICYmIHBhcmVudFBhdGggIT09IHNlYXJjaFBhdGgpIHtcbiAgICByZXR1cm4gcmVzb2x2ZU5vZGVNb2R1bGVJblBhdGgocGFyZW50UGF0aCwgY3R4KVxuICB9XG5cbiAgcmV0dXJuIG51bGxcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVOb2RlTW9kdWxlKFxuICBtb2R1bGVQYXRoOiBzdHJpbmcsXG4gIGZzTWFwOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+LFxuICBiYXNlUGF0aDogc3RyaW5nLFxuKTogc3RyaW5nIHwgbnVsbCB7XG4gIGNvbnN0IGN0eCA9IGNyZWF0ZUNvbnRleHQobW9kdWxlUGF0aCwgZnNNYXAsIGJhc2VQYXRoKVxuICByZXR1cm4gcmVzb2x2ZU5vZGVNb2R1bGVJblBhdGgoY3R4LmJhc2VQYXRoLCBjdHgpXG59XG4iLCAiaW1wb3J0IHsgcmVzb2x2ZU5vZGVNb2R1bGUgfSBmcm9tIFwibGliL3V0aWxzL3Jlc29sdmUtbm9kZS1tb2R1bGVcIlxuaW1wb3J0IHR5cGUgeyBFeGVjdXRpb25Db250ZXh0IH0gZnJvbSBcIi4vZXhlY3V0aW9uLWNvbnRleHRcIlxuaW1wb3J0IHsgaW1wb3J0TG9jYWxGaWxlIH0gZnJvbSBcIi4vaW1wb3J0LWxvY2FsLWZpbGVcIlxuXG5leHBvcnQgY29uc3QgaW1wb3J0Tm9kZU1vZHVsZSA9IGFzeW5jIChcbiAgaW1wb3J0TmFtZTogc3RyaW5nLFxuICBjdHg6IEV4ZWN1dGlvbkNvbnRleHQsXG4gIGRlcHRoID0gMCxcbikgPT4ge1xuICBjb25zdCB7IHByZVN1cHBsaWVkSW1wb3J0cyB9ID0gY3R4XG5cbiAgaWYgKHByZVN1cHBsaWVkSW1wb3J0c1tpbXBvcnROYW1lXSkge1xuICAgIHJldHVyblxuICB9XG5cbiAgY29uc3QgcmVzb2x2ZWROb2RlTW9kdWxlUGF0aCA9IHJlc29sdmVOb2RlTW9kdWxlKGltcG9ydE5hbWUsIGN0eC5mc01hcCwgXCJcIilcblxuICBpZiAoIXJlc29sdmVkTm9kZU1vZHVsZVBhdGgpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYE5vZGUgbW9kdWxlIFwiJHtpbXBvcnROYW1lfVwiIG5vdCBmb3VuZGApXG4gIH1cblxuICAvLyBVc2UgaW1wb3J0TG9jYWxGaWxlIHRvIGhhbmRsZSB0aGUgbm9kZSBtb2R1bGVcbiAgYXdhaXQgaW1wb3J0TG9jYWxGaWxlKHJlc29sdmVkTm9kZU1vZHVsZVBhdGgsIGN0eCwgZGVwdGgpXG5cbiAgLy8gTWFwIHRoZSBvcmlnaW5hbCBpbXBvcnQgbmFtZSB0byB0aGUgcmVzb2x2ZWQgbW9kdWxlJ3MgZXhwb3J0c1xuICBwcmVTdXBwbGllZEltcG9ydHNbaW1wb3J0TmFtZV0gPSBwcmVTdXBwbGllZEltcG9ydHNbcmVzb2x2ZWROb2RlTW9kdWxlUGF0aF1cblxuICAvLyBNYXAgd2l0aG91dCBub2RlX21vZHVsZXMgcHJlZml4IGZvciBkaXJlY3QgaW1wb3J0c1xuICBjb25zdCB1bnByZWZpeGVkUGF0aCA9IHJlc29sdmVkTm9kZU1vZHVsZVBhdGgucmVwbGFjZSgvXm5vZGVfbW9kdWxlc1xcLy8sIFwiXCIpXG4gIHByZVN1cHBsaWVkSW1wb3J0c1t1bnByZWZpeGVkUGF0aF0gPVxuICAgIHByZVN1cHBsaWVkSW1wb3J0c1tyZXNvbHZlZE5vZGVNb2R1bGVQYXRoXVxuXG4gIC8vIEhhbmRsZSBpbmRleCBmaWxlcyBzcGVjaWFsbHlcbiAgaWYgKFxuICAgIHJlc29sdmVkTm9kZU1vZHVsZVBhdGguZW5kc1dpdGgoXCIvaW5kZXgudHN4XCIpIHx8XG4gICAgcmVzb2x2ZWROb2RlTW9kdWxlUGF0aC5lbmRzV2l0aChcIi9pbmRleC50c1wiKSB8fFxuICAgIHJlc29sdmVkTm9kZU1vZHVsZVBhdGguZW5kc1dpdGgoXCIvaW5kZXguanNcIilcbiAgKSB7XG4gICAgY29uc3QgZGlyUGF0aCA9IHJlc29sdmVkTm9kZU1vZHVsZVBhdGgucmVwbGFjZSgvXFwvaW5kZXhcXC4odHN4P3xqcykkLywgXCJcIilcbiAgICBjb25zdCB1bnByZWZpeGVkRGlyUGF0aCA9IGRpclBhdGgucmVwbGFjZSgvXm5vZGVfbW9kdWxlc1xcLy8sIFwiXCIpXG4gICAgcHJlU3VwcGxpZWRJbXBvcnRzW3VucHJlZml4ZWREaXJQYXRoXSA9XG4gICAgICBwcmVTdXBwbGllZEltcG9ydHNbcmVzb2x2ZWROb2RlTW9kdWxlUGF0aF1cblxuICAgIC8vIEhhbmRsZSBzY29wZWQgcGFja2FnZXNcbiAgICBpZiAodW5wcmVmaXhlZERpclBhdGguc3RhcnRzV2l0aChcIkBcIikpIHtcbiAgICAgIGNvbnN0IHNjb3BlUGFydHMgPSB1bnByZWZpeGVkRGlyUGF0aC5zcGxpdChcIi9cIilcbiAgICAgIGlmIChzY29wZVBhcnRzLmxlbmd0aCA+PSAyKSB7XG4gICAgICAgIGNvbnN0IHNjb3BlZE5hbWUgPSBgJHtzY29wZVBhcnRzWzBdfS8ke3Njb3BlUGFydHNbMV19YFxuICAgICAgICBwcmVTdXBwbGllZEltcG9ydHNbc2NvcGVkTmFtZV0gPVxuICAgICAgICAgIHByZVN1cHBsaWVkSW1wb3J0c1tyZXNvbHZlZE5vZGVNb2R1bGVQYXRoXVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuIiwgImltcG9ydCB7IHJlc29sdmVGaWxlUGF0aCwgcmVzb2x2ZUZpbGVQYXRoT3JUaHJvdyB9IGZyb20gXCIuL3Jlc29sdmVGaWxlUGF0aFwiXG5cbmV4cG9ydCBjb25zdCBzZXR1cERlZmF1bHRFbnRyeXBvaW50SWZOZWVkZWQgPSAob3B0czoge1xuICBlbnRyeXBvaW50Pzogc3RyaW5nXG4gIGZzTWFwOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+XG4gIG1haW5Db21wb25lbnRQYXRoPzogc3RyaW5nXG4gIG1haW5Db21wb25lbnROYW1lPzogc3RyaW5nXG4gIG5hbWU/OiBzdHJpbmdcbiAgbWFpbkNvbXBvbmVudFByb3BzPzogUmVjb3JkPHN0cmluZywgYW55PlxufSkgPT4ge1xuICBpZiAoIW9wdHMuZW50cnlwb2ludCAmJiAhb3B0cy5tYWluQ29tcG9uZW50UGF0aCkge1xuICAgIGlmIChcImluZGV4LnRzeFwiIGluIG9wdHMuZnNNYXApIHtcbiAgICAgIG9wdHMubWFpbkNvbXBvbmVudFBhdGggPSBcImluZGV4LnRzeFwiXG4gICAgfSBlbHNlIGlmIChcImluZGV4LnRzXCIgaW4gb3B0cy5mc01hcCkge1xuICAgICAgb3B0cy5tYWluQ29tcG9uZW50UGF0aCA9IFwiaW5kZXgudHNcIlxuICAgIH0gZWxzZSBpZiAoXG4gICAgICBPYmplY3Qua2V5cyhvcHRzLmZzTWFwKS5maWx0ZXIoKGspID0+IGsuZW5kc1dpdGgoXCIudHN4XCIpKS5sZW5ndGggPT09IDFcbiAgICApIHtcbiAgICAgIG9wdHMubWFpbkNvbXBvbmVudFBhdGggPSBPYmplY3Qua2V5cyhvcHRzLmZzTWFwKVswXVxuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIFwiRWl0aGVyIGVudHJ5cG9pbnQgb3IgbWFpbkNvbXBvbmVudFBhdGggbXVzdCBiZSBwcm92aWRlZCAobm8gaW5kZXggZmlsZSwgY291bGQgbm90IGluZmVyIGVudHJ5cG9pbnQpXCIsXG4gICAgICApXG4gICAgfVxuICB9XG5cbiAgaWYgKCFvcHRzLmVudHJ5cG9pbnQgJiYgb3B0cy5tYWluQ29tcG9uZW50UGF0aCkge1xuICAgIG9wdHMuZW50cnlwb2ludCA9IFwiZW50cnlwb2ludC50c3hcIlxuICAgIGNvbnN0IG1haW5Db21wb25lbnRDb2RlID1cbiAgICAgIG9wdHMuZnNNYXBbcmVzb2x2ZUZpbGVQYXRoT3JUaHJvdyhvcHRzLm1haW5Db21wb25lbnRQYXRoLCBvcHRzLmZzTWFwKV1cbiAgICBpZiAoIW1haW5Db21wb25lbnRDb2RlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBNYWluIGNvbXBvbmVudCBwYXRoIFwiJHtvcHRzLm1haW5Db21wb25lbnRQYXRofVwiIG5vdCBmb3VuZCBpbiBmc01hcC4gQXZhaWxhYmxlIHBhdGhzOiAke09iamVjdC5rZXlzKG9wdHMuZnNNYXApLmpvaW4oXCIsIFwiKX1gLFxuICAgICAgKVxuICAgIH1cbiAgICBvcHRzLmZzTWFwW29wdHMuZW50cnlwb2ludF0gPSBgXG4gICAgIGltcG9ydCAqIGFzIFVzZXJDb21wb25lbnRzIGZyb20gXCIuLyR7b3B0cy5tYWluQ29tcG9uZW50UGF0aH1cIjtcbiAgICAgICAgICBcbiAgICAgIGNvbnN0IGhhc0JvYXJkID0gJHttYWluQ29tcG9uZW50Q29kZS5pbmNsdWRlcyhcIjxib2FyZFwiKS50b1N0cmluZygpfTtcbiAgICAgICR7XG4gICAgICAgIG9wdHMubWFpbkNvbXBvbmVudE5hbWVcbiAgICAgICAgICA/IGBcbiAgICAgICAgY29uc3QgQ29tcG9uZW50VG9SZW5kZXIgPSBVc2VyQ29tcG9uZW50c1tcIiR7b3B0cy5tYWluQ29tcG9uZW50TmFtZX1cIl1cbiAgICAgICAgYFxuICAgICAgICAgIDogYGNvbnN0IENvbXBvbmVudFRvUmVuZGVyID0gT2JqZWN0LmVudHJpZXMoVXNlckNvbXBvbmVudHMpXG4gICAgICAgIC5maWx0ZXIoKFtuYW1lXSkgPT4gIW5hbWUuc3RhcnRzV2l0aChcInVzZVwiKSlcbiAgICAgICAgLm1hcCgoW18sIGNvbXBvbmVudF0pID0+IGNvbXBvbmVudClbMF0gfHwgKCgpID0+IG51bGwpO2BcbiAgICAgIH1cblxuICAgICAgY2lyY3VpdC5hZGQoXG4gICAgICAgIGhhc0JvYXJkID8gKFxuICAgICAgICAgIDxDb21wb25lbnRUb1JlbmRlciAke29wdHMubWFpbkNvbXBvbmVudFByb3BzID8gYHsuLi4ke0pTT04uc3RyaW5naWZ5KG9wdHMubWFpbkNvbXBvbmVudFByb3BzLCBudWxsLCAyKX19YCA6IFwiXCJ9IC8+XG4gICAgICAgICkgOiAoXG4gICAgICAgICAgPGJvYXJkPlxuICAgICAgICAgICAgPENvbXBvbmVudFRvUmVuZGVyIG5hbWU9XCJVMVwiICR7b3B0cy5tYWluQ29tcG9uZW50UHJvcHMgPyBgey4uLiR7SlNPTi5zdHJpbmdpZnkob3B0cy5tYWluQ29tcG9uZW50UHJvcHMsIG51bGwsIDIpfX1gIDogXCJcIn0gLz5cbiAgICAgICAgICA8L2JvYXJkPlxuICAgICAgICApXG4gICAgICApO1xuYFxuICB9XG5cbiAgaWYgKCFvcHRzLm5hbWUgJiYgb3B0cy5tYWluQ29tcG9uZW50TmFtZSkge1xuICAgIG9wdHMubmFtZSA9IG9wdHMubWFpbkNvbXBvbmVudE5hbWVcbiAgfVxufVxuIiwgImltcG9ydCB7IENpcmN1aXRSdW5uZXIgfSBmcm9tIFwiLi9DaXJjdWl0UnVubmVyXCJcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJ1blRzY2lyY3VpdENvZGUoXG4gIGZpbGVzeXN0ZW1PckNvZGVTdHJpbmc6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gfCBzdHJpbmcsXG4gIG9wdHM/OiBPbWl0PFBhcmFtZXRlcnM8Q2lyY3VpdFJ1bm5lcltcImV4ZWN1dGVXaXRoRnNNYXBcIl0+WzBdLCBcImZzTWFwXCI+LFxuKSB7XG4gIGlmIChcbiAgICB0eXBlb2YgZmlsZXN5c3RlbU9yQ29kZVN0cmluZyA9PT0gXCJzdHJpbmdcIiAmJlxuICAgICFmaWxlc3lzdGVtT3JDb2RlU3RyaW5nLmluY2x1ZGVzKFwiZXhwb3J0XCIpXG4gICkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBUaGUgXCJleHBvcnRcIiBrZXl3b3JkIHdhc24ndCBmb3VuZCBpbiB5b3VyIHByb3ZpZGVkIGNvZGUuIFlvdSBuZWVkIHRvIGV4cG9ydCBhIGNvbXBvbmVudCBpbiB5b3VyIGNvZGUsIGUuZy5cXG5cXG5leHBvcnQgZGVmYXVsdCAoKSA9PiAoXFxuICA8cmVzaXN0b3IgbmFtZT1cIlIxXCIgcmVzaXN0YW5jZT1cIjFrXCIgLz5cXG4pYCxcbiAgICApXG4gIH1cbiAgY29uc3QgZmlsZXN5c3RlbSA9XG4gICAgdHlwZW9mIGZpbGVzeXN0ZW1PckNvZGVTdHJpbmcgPT09IFwic3RyaW5nXCJcbiAgICAgID8geyBcInVzZXItY29kZS50c3hcIjogZmlsZXN5c3RlbU9yQ29kZVN0cmluZyB9XG4gICAgICA6IGZpbGVzeXN0ZW1PckNvZGVTdHJpbmdcblxuICBjb25zdCBjaXJjdWl0UnVubmVyID0gbmV3IENpcmN1aXRSdW5uZXIoKVxuXG4gIGF3YWl0IGNpcmN1aXRSdW5uZXIuZXhlY3V0ZVdpdGhGc01hcCh7XG4gICAgZnNNYXA6IGZpbGVzeXN0ZW0sXG4gICAgLi4ub3B0cyxcbiAgfSlcblxuICBhd2FpdCBjaXJjdWl0UnVubmVyLnJlbmRlclVudGlsU2V0dGxlZCgpXG5cbiAgcmV0dXJuIGF3YWl0IGNpcmN1aXRSdW5uZXIuZ2V0Q2lyY3VpdEpzb24oKVxufVxuIiwgImltcG9ydCB7IHJ1blRzY2lyY3VpdENvZGUgfSBmcm9tIFwiLi9ydW5Uc2NpcmN1aXRDb2RlXCJcblxuZXhwb3J0IGNvbnN0IHJ1blRzY2lyY3VpdE1vZHVsZSA9IGFzeW5jIChcbiAgbW9kdWxlOiBzdHJpbmcsXG4gIG9wdHM6IHsgcHJvcHM/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+OyBleHBvcnROYW1lPzogc3RyaW5nIH0gPSB7fSxcbikgPT4ge1xuICBpZiAoIW1vZHVsZS5zdGFydHNXaXRoKFwiQFwiKSkge1xuICAgIG1vZHVsZSA9IGBAdHNjaS8ke21vZHVsZS5yZXBsYWNlKC9cXC8vLCBcIi5cIil9YFxuICB9XG4gIGNvbnN0IGNpcmN1aXRKc29uID0gYXdhaXQgcnVuVHNjaXJjdWl0Q29kZShcbiAgICB7XG4gICAgICAvLyBUT0RPIGhhbmRsZSBleHBvcnRzIHRoYXQgYXJlIG5vdCB0aGUgZGVmYXVsdCBleHBvcnQgYnkgc2Nhbm5pbmdcbiAgICAgIC8vIG90aGVyRXhwb3J0cyBmb3IgY29tcG9uZW50c1xuICAgICAgXCJ1c2VyLWNvZGUudHN4XCI6IGBcbiAgICBpbXBvcnQgTW9kdWxlLCAqIGFzIG90aGVyRXhwb3J0cyBmcm9tIFwiJHttb2R1bGV9XCI7XG5cbiAgICBsZXQgZXhwb3J0TmFtZSA9IFwiJHtvcHRzLmV4cG9ydE5hbWUgPz8gXCJcIn1cIlxuXG4gICAgaWYgKCghTW9kdWxlIHx8IHR5cGVvZiBNb2R1bGUgIT09IFwiZnVuY3Rpb25cIikgJiYgIUJvb2xlYW4oZXhwb3J0TmFtZSkpIHtcbiAgICAgIGV4cG9ydE5hbWUgPSBPYmplY3Qua2V5cyhvdGhlckV4cG9ydHMpLmZpbHRlcihrZXkgPT4ga2V5WzBdID09PSBrZXlbMF0udG9VcHBlckNhc2UoKSAmJiB0eXBlb2Ygb3RoZXJFeHBvcnRzW2tleV0gPT09IFwiZnVuY3Rpb25cIilbMF1cbiAgICB9XG5cbiAgICBjb25zdCBkZWZhdWx0RXhwb3J0ID0gZXhwb3J0TmFtZSA/IG90aGVyRXhwb3J0c1tleHBvcnROYW1lXSA6IE1vZHVsZVxuXG4gICAgaWYgKCFkZWZhdWx0RXhwb3J0KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXFxgTm8gZXhwb3J0IGZvdW5kIGZvciBtb2R1bGUgXCJcXCR7bW9kdWxlfVwiICh0cmllZCBcIlxcJHtleHBvcnROYW1lID8/IFwiZGVmYXVsdFwifVwiKVxcYClcbiAgICB9XG5cbiAgICBleHBvcnQgZGVmYXVsdCBkZWZhdWx0RXhwb3J0O1xuICAgIGAsXG4gICAgfSxcbiAgICB7XG4gICAgICBtYWluQ29tcG9uZW50UHJvcHM6IG9wdHMucHJvcHMsXG4gICAgfSxcbiAgKVxuICByZXR1cm4gY2lyY3VpdEpzb25cbn1cbiIsICJpbXBvcnQgKiBhcyBDb21saW5rIGZyb20gXCJjb21saW5rXCJcbmV4cG9ydCAqIGZyb20gXCIuL3V0aWxzL2luZGV4XCJcbmltcG9ydCB0eXBlIHtcbiAgSW50ZXJuYWxXZWJXb3JrZXJBcGksXG4gIFdlYldvcmtlckNvbmZpZ3VyYXRpb24sXG4gIENpcmN1aXRXZWJXb3JrZXIsXG59IGZyb20gXCIuL3NoYXJlZC90eXBlc1wiXG5pbXBvcnQgdHlwZSB7IFJvb3RDaXJjdWl0RXZlbnROYW1lIH0gZnJvbSBcIkB0c2NpcmN1aXQvY29yZVwiXG5cbmV4cG9ydCB0eXBlIHsgQ2lyY3VpdFdlYldvcmtlciwgV2ViV29ya2VyQ29uZmlndXJhdGlvbiB9XG5cbmV4cG9ydCBjb25zdCBjcmVhdGVDaXJjdWl0V2ViV29ya2VyID0gYXN5bmMgKFxuICBjb25maWd1cmF0aW9uOiBQYXJ0aWFsPFdlYldvcmtlckNvbmZpZ3VyYXRpb24+LFxuKTogUHJvbWlzZTxDaXJjdWl0V2ViV29ya2VyPiA9PiB7XG4gIGlmIChjb25maWd1cmF0aW9uLnZlcmJvc2UpIHtcbiAgICBjb25zb2xlLmxvZyhcbiAgICAgIFwiW1dvcmtlcl0gQ3JlYXRpbmcgY2lyY3VpdCB3ZWIgd29ya2VyIHdpdGggY29uZmlnOlwiLFxuICAgICAgY29uZmlndXJhdGlvbixcbiAgICApXG4gIH1cblxuICBsZXQgd29ya2VyQmxvYlVybCA9XG4gICAgY29uZmlndXJhdGlvbi53ZWJXb3JrZXJCbG9iVXJsID8/IGNvbmZpZ3VyYXRpb24ud2ViV29ya2VyVXJsXG5cbiAgaWYgKCF3b3JrZXJCbG9iVXJsKSB7XG4gICAgY29uc3QgY2RuVXJsID0gYGh0dHBzOi8vY2RuLmpzZGVsaXZyLm5ldC9ucG0vQHRzY2lyY3VpdC9ldmFsQCR7Y29uZmlndXJhdGlvbi5ldmFsVmVyc2lvbiA/PyBcImxhdGVzdFwifS9kaXN0L3dlYndvcmtlci9lbnRyeXBvaW50LmpzYFxuXG4gICAgY29uc3Qgd29ya2VyQmxvYiA9IGF3YWl0IGZldGNoKGNkblVybCkudGhlbigocmVzKSA9PiByZXMuYmxvYigpKVxuICAgIHdvcmtlckJsb2JVcmwgPSBVUkwuY3JlYXRlT2JqZWN0VVJMKHdvcmtlckJsb2IpXG4gIH1cblxuICBjb25zdCByYXdXb3JrZXIgPSBuZXcgV29ya2VyKHdvcmtlckJsb2JVcmwsIHsgdHlwZTogXCJtb2R1bGVcIiB9KVxuICBjb25zdCBjb21saW5rV29ya2VyID0gQ29tbGluay53cmFwPEludGVybmFsV2ViV29ya2VyQXBpPihyYXdXb3JrZXIpXG5cbiAgaWYgKGNvbmZpZ3VyYXRpb24uc25pcHBldHNBcGlCYXNlVXJsKSB7XG4gICAgYXdhaXQgY29tbGlua1dvcmtlci5zZXRTbmlwcGV0c0FwaUJhc2VVcmwoY29uZmlndXJhdGlvbi5zbmlwcGV0c0FwaUJhc2VVcmwpXG4gIH1cblxuICBsZXQgaXNUZXJtaW5hdGVkID0gZmFsc2VcblxuICAvLyBDcmVhdGUgYSB3cmFwcGVyIHRoYXQgaGFuZGxlcyBldmVudHMgZGlyZWN0bHkgdGhyb3VnaCBjaXJjdWl0IGluc3RhbmNlXG4gIGNvbnN0IHdyYXBwZXI6IENpcmN1aXRXZWJXb3JrZXIgPSB7XG4gICAgY2xlYXJFdmVudExpc3RlbmVyczogY29tbGlua1dvcmtlci5jbGVhckV2ZW50TGlzdGVuZXJzLmJpbmQoY29tbGlua1dvcmtlciksXG4gICAgZXhlY3V0ZTogYXN5bmMgKC4uLmFyZ3MpID0+IHtcbiAgICAgIGlmIChpc1Rlcm1pbmF0ZWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ2lyY3VpdFdlYldvcmtlciB3YXMgdGVybWluYXRlZCwgY2FuJ3QgZXhlY3V0ZVwiKVxuICAgICAgfVxuICAgICAgcmV0dXJuIGNvbWxpbmtXb3JrZXIuZXhlY3V0ZS5iaW5kKGNvbWxpbmtXb3JrZXIpKC4uLmFyZ3MpXG4gICAgfSxcbiAgICBleGVjdXRlV2l0aEZzTWFwOiBhc3luYyAoLi4uYXJncykgPT4ge1xuICAgICAgaWYgKGlzVGVybWluYXRlZCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgXCJDaXJjdWl0V2ViV29ya2VyIHdhcyB0ZXJtaW5hdGVkLCBjYW4ndCBleGVjdXRlV2l0aEZzTWFwXCIsXG4gICAgICAgIClcbiAgICAgIH1cbiAgICAgIHJldHVybiBjb21saW5rV29ya2VyLmV4ZWN1dGVXaXRoRnNNYXAuYmluZChjb21saW5rV29ya2VyKSguLi5hcmdzKVxuICAgIH0sXG4gICAgcmVuZGVyVW50aWxTZXR0bGVkOiBjb21saW5rV29ya2VyLnJlbmRlclVudGlsU2V0dGxlZC5iaW5kKGNvbWxpbmtXb3JrZXIpLFxuICAgIGdldENpcmN1aXRKc29uOiBjb21saW5rV29ya2VyLmdldENpcmN1aXRKc29uLmJpbmQoY29tbGlua1dvcmtlciksXG4gICAgb246IChldmVudDogc3RyaW5nLCBjYWxsYmFjazogKC4uLmFyZ3M6IGFueVtdKSA9PiB2b2lkKSA9PiB7XG4gICAgICBjb25zdCBwcm94aWVkQ2FsbGJhY2sgPSBDb21saW5rLnByb3h5KGNhbGxiYWNrKVxuICAgICAgY29tbGlua1dvcmtlci5vbihldmVudCBhcyBSb290Q2lyY3VpdEV2ZW50TmFtZSwgcHJveGllZENhbGxiYWNrKVxuICAgIH0sXG4gICAga2lsbDogYXN5bmMgKCkgPT4ge1xuICAgICAgY29tbGlua1dvcmtlcltDb21saW5rLnJlbGVhc2VQcm94eV0oKVxuICAgICAgcmF3V29ya2VyLnRlcm1pbmF0ZSgpXG4gICAgICBpc1Rlcm1pbmF0ZWQgPSB0cnVlXG4gICAgfSxcbiAgfVxuXG4gIHJldHVybiB3cmFwcGVyXG59XG4iXSwKICAibWFwcGluZ3MiOiAiO0FBQUEsU0FBUyxtQkFBbUI7QUFFNUIsWUFBWSxtQkFBbUI7QUFDL0IsWUFBWSxXQUFXO0FBQ3ZCLFlBQVksZ0JBQWdCO0FBQzVCLFlBQVksd0JBQXdCOzs7QUNIcEMsSUFBTSxRQUFRLG9CQUFJLElBQWlCO0FBRW5DLElBQU0sb0JBQW9CLE9BQU8sTUFBVyxXQUFnQjtBQUMxRCxRQUFNLGNBQWMsSUFBSSxnQkFBZ0I7QUFBQSxJQUN0QyxHQUFHO0FBQUEsSUFDSCxNQUFNO0FBQUEsRUFDUixDQUFDLEVBQUUsU0FBUztBQUNaLE1BQUksTUFBTSxJQUFJLFdBQVcsR0FBRztBQUMxQixXQUFPLE1BQU0sSUFBSSxXQUFXO0FBQUEsRUFDOUI7QUFDQSxRQUFNLFdBQVcsTUFBTTtBQUFBLElBQ3JCLG1DQUFtQyxJQUFJLFNBQVMsV0FBVztBQUFBLEVBQzdEO0FBQ0EsUUFBTSxlQUFlLE1BQU0sU0FBUyxLQUFLO0FBQ3pDLFFBQU0sSUFBSSxhQUFhLFlBQVk7QUFDbkMsU0FBTztBQUNUO0FBRU8sSUFBTSxpQkFBOEI7QUFBQSxFQUN6QyxVQUFVLE9BQU87QUFBQSxJQUNmO0FBQUEsSUFDQTtBQUFBLEVBQ0YsTUFBb0M7QUFDbEMsUUFDRSxnQkFBZ0IsU0FBUyxzQkFDekIsZ0JBQWdCLFVBQVUsbUJBQzFCO0FBQ0EsWUFBTSxFQUFFLFVBQVUsSUFBSSxNQUFNLGtCQUFrQixhQUFhO0FBQUEsUUFDekQsWUFBWSxnQkFBZ0I7QUFBQSxRQUM1QixTQUFTO0FBQUEsTUFDWCxDQUFDO0FBRUQsYUFBTztBQUFBLFFBQ0wsUUFBUSxVQUFVLElBQUksQ0FBQyxNQUFXLElBQUksRUFBRSxJQUFJLEVBQUUsRUFBRSxNQUFNLEdBQUcsQ0FBQztBQUFBLE1BQzVEO0FBQUEs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
|
|
813
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vd2Vid29ya2VyL2V4ZWN1dGlvbi1jb250ZXh0LnRzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9AdHNjaXJjdWl0L3BhcnRzLWVuZ2luZS9saWIvamxjLXBhcnRzLWVuZ2luZS50cyIsICIuLi8uLi9saWIvZ2V0UGxhdGZvcm1Db25maWcudHMiLCAiLi4vLi4vbGliL3J1bm5lci9ub3JtYWxpemVGc01hcC50cyIsICIuLi8uLi9saWIvcnVubmVyL0NpcmN1aXRSdW5uZXIudHMiLCAiLi4vLi4vbGliL3V0aWxzL2Rpcm5hbWUudHMiLCAiLi4vLi4vbGliL3J1bm5lci9yZXNvbHZlRmlsZVBhdGgudHMiLCAiLi4vLi4vd2Vid29ya2VyL2V2YWwtY29tcGlsZWQtanMudHMiLCAiLi4vLi4vd2Vid29ya2VyL2ltcG9ydC1ldmFsLXBhdGgudHMiLCAiLi4vLi4vd2Vid29ya2VyL2ltcG9ydC1sb2NhbC1maWxlLnRzIiwgIi4uLy4uL2xpYi91dGlscy9nZXQtaW1wb3J0cy1mcm9tLWNvZGUudHMiLCAiLi4vLi4vd2Vid29ya2VyL2ltcG9ydC1zbmlwcGV0LnRzIiwgIi4uLy4uL2xpYi91dGlscy9yZXNvbHZlLW5vZGUtbW9kdWxlLnRzIiwgIi4uLy4uL3dlYndvcmtlci9pbXBvcnQtbm9kZS1tb2R1bGUudHMiLCAiLi4vLi4vbGliL3J1bm5lci9zZXR1cERlZmF1bHRFbnRyeXBvaW50SWZOZWVkZWQudHMiLCAiLi4vLi4vbGliL3J1bm5lci9ydW5Uc2NpcmN1aXRDb2RlLnRzIiwgIi4uLy4uL2xpYi9ydW5uZXIvcnVuVHNjaXJjdWl0TW9kdWxlLnRzIiwgIi4uLy4uL2xpYi93b3JrZXIudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbImltcG9ydCB7IFJvb3RDaXJjdWl0IH0gZnJvbSBcIkB0c2NpcmN1aXQvY29yZVwiXG5pbXBvcnQgdHlwZSB7IFdlYldvcmtlckNvbmZpZ3VyYXRpb24gfSBmcm9tIFwibGliL3NoYXJlZC90eXBlc1wiXG5pbXBvcnQgKiBhcyB0c2NpcmN1aXRDb3JlIGZyb20gXCJAdHNjaXJjdWl0L2NvcmVcIlxuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSBcInJlYWN0XCJcbmltcG9ydCAqIGFzIGpzY2FkRmliZXIgZnJvbSBcImpzY2FkLWZpYmVyXCJcbmltcG9ydCAqIGFzIHRzY2lyY3VpdE1hdGhVdGlscyBmcm9tIFwiQHRzY2lyY3VpdC9tYXRoLXV0aWxzXCJcbmltcG9ydCB0eXBlIHsgUGxhdGZvcm1Db25maWcgfSBmcm9tIFwiQHRzY2lyY3VpdC9wcm9wc1wiXG5pbXBvcnQgeyBnZXRQbGF0Zm9ybUNvbmZpZyB9IGZyb20gXCJsaWIvZ2V0UGxhdGZvcm1Db25maWdcIlxuXG5leHBvcnQgaW50ZXJmYWNlIEV4ZWN1dGlvbkNvbnRleHQgZXh0ZW5kcyBXZWJXb3JrZXJDb25maWd1cmF0aW9uIHtcbiAgZnNNYXA6IFJlY29yZDxzdHJpbmcsIHN0cmluZz5cbiAgZW50cnlwb2ludDogc3RyaW5nXG4gIHByZVN1cHBsaWVkSW1wb3J0czogUmVjb3JkPHN0cmluZywgYW55PlxuICBjaXJjdWl0OiBSb290Q2lyY3VpdFxufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlRXhlY3V0aW9uQ29udGV4dChcbiAgd2ViV29ya2VyQ29uZmlndXJhdGlvbjogV2ViV29ya2VyQ29uZmlndXJhdGlvbixcbiAgb3B0czoge1xuICAgIG5hbWU/OiBzdHJpbmdcbiAgICBwbGF0Zm9ybT86IFBsYXRmb3JtQ29uZmlnXG4gIH0gPSB7fSxcbik6IEV4ZWN1dGlvbkNvbnRleHQge1xuICBnbG9iYWxUaGlzLlJlYWN0ID0gUmVhY3RcblxuICBjb25zdCBjaXJjdWl0ID0gbmV3IFJvb3RDaXJjdWl0KHtcbiAgICBwbGF0Zm9ybTogb3B0cy5wbGF0Zm9ybSB8fCBnZXRQbGF0Zm9ybUNvbmZpZygpLFxuICB9KVxuXG4gIGlmIChvcHRzLm5hbWUpIHtcbiAgICBjaXJjdWl0Lm5hbWUgPSBvcHRzLm5hbWVcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgZnNNYXA6IHt9LFxuICAgIGVudHJ5cG9pbnQ6IFwiXCIsXG4gICAgcHJlU3VwcGxpZWRJbXBvcnRzOiB7XG4gICAgICBcIkB0c2NpcmN1aXQvY29yZVwiOiB0c2NpcmN1aXRDb3JlLFxuICAgICAgdHNjaXJjdWl0OiB0c2NpcmN1aXRDb3JlLFxuICAgICAgXCJAdHNjaXJjdWl0L21hdGgtdXRpbHNcIjogdHNjaXJjdWl0TWF0aFV0aWxzLFxuICAgICAgcmVhY3Q6IFJlYWN0LFxuICAgICAgXCJqc2NhZC1maWJlclwiOiBqc2NhZEZpYmVyLFxuXG4gICAgICAvLyBUaGlzIGlzIHVzdWFsbHkgdXNlZCBhcyBhIHR5cGUgaW1wb3J0LCB3ZSBjYW4gcmVtb3ZlIHRoZSBzaGltIHdoZW4gd2VcbiAgICAgIC8vIGlnbm9yZSB0eXBlIGltcG9ydHMgaW4gZ2V0SW1wb3J0c0Zyb21Db2RlXG4gICAgICBcIkB0c2NpcmN1aXQvcHJvcHNcIjoge30sXG4gICAgfSxcbiAgICBjaXJjdWl0LFxuICAgIC4uLndlYldvcmtlckNvbmZpZ3VyYXRpb24sXG4gIH1cbn1cbiIsICJpbXBvcnQgdHlwZSB7IFBhcnRzRW5naW5lLCBTdXBwbGllclBhcnROdW1iZXJzIH0gZnJvbSBcIkB0c2NpcmN1aXQvcHJvcHNcIlxuXG5jb25zdCBjYWNoZSA9IG5ldyBNYXA8c3RyaW5nLCBhbnk+KClcblxuY29uc3QgZ2V0SmxjUGFydHNDYWNoZWQgPSBhc3luYyAobmFtZTogYW55LCBwYXJhbXM6IGFueSkgPT4ge1xuICBjb25zdCBwYXJhbVN0cmluZyA9IG5ldyBVUkxTZWFyY2hQYXJhbXMoe1xuICAgIC4uLnBhcmFtcyxcbiAgICBqc29uOiBcInRydWVcIixcbiAgfSkudG9TdHJpbmcoKVxuICBpZiAoY2FjaGUuaGFzKHBhcmFtU3RyaW5nKSkge1xuICAgIHJldHVybiBjYWNoZS5nZXQocGFyYW1TdHJpbmcpXG4gIH1cbiAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaChcbiAgICBgaHR0cHM6Ly9qbGNzZWFyY2gudHNjaXJjdWl0LmNvbS8ke25hbWV9L2xpc3Q/JHtwYXJhbVN0cmluZ31gLFxuICApXG4gIGNvbnN0IHJlc3BvbnNlSnNvbiA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKVxuICBjYWNoZS5zZXQocGFyYW1TdHJpbmcsIHJlc3BvbnNlSnNvbilcbiAgcmV0dXJuIHJlc3BvbnNlSnNvblxufVxuXG5leHBvcnQgY29uc3QgamxjUGFydHNFbmdpbmU6IFBhcnRzRW5naW5lID0ge1xuICBmaW5kUGFydDogYXN5bmMgKHtcbiAgICBzb3VyY2VDb21wb25lbnQsXG4gICAgZm9vdHByaW50ZXJTdHJpbmcsXG4gIH0pOiBQcm9taXNlPFN1cHBsaWVyUGFydE51bWJlcnM+ID0+IHtcbiAgICBpZiAoXG4gICAgICBzb3VyY2VDb21wb25lbnQudHlwZSA9PT0gXCJzb3VyY2VfY29tcG9uZW50XCIgJiZcbiAgICAgIHNvdXJjZUNvbXBvbmVudC5mdHlwZSA9PT0gXCJzaW1wbGVfcmVzaXN0b3JcIlxuICAgICkge1xuICAgICAgY29uc3QgeyByZXNpc3RvcnMgfSA9IGF3YWl0IGdldEpsY1BhcnRzQ2FjaGVkKFwicmVzaXN0b3JzXCIsIHtcbiAgICAgICAgcmVzaXN0YW5jZTogc291cmNlQ29tcG9uZW50LnJlc2lzdGFuY2UsXG4gICAgICAgIHBhY2thZ2U6IGZvb3RwcmludGVyU3RyaW5nLFxuICAgICAgfSlcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgamxjcGNiOiByZXNpc3RvcnMubWFwKChyOiBhbnkpID0+IGBDJHtyLmxjc2N9YCkuc2xpY2UoMCwgMyksXG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChcbiAgICAgIHNvdXJjZUNvbXBvbmVudC50eXBlID09PSBcInNvdXJjZV9jb21wb25lbnRcIiAmJlxuICAgICAgc291cmNlQ29tcG9uZW50LmZ0eXBlID09PSBcInNpbXBsZV9jYXBhY2l0b3JcIlxuICAgICkge1xuICAgICAgaWYgKGZvb3RwcmludGVyU3RyaW5nPy5pbmNsdWRlcyhcImNhcFwiKSkge1xuICAgICAgICBmb290cHJpbnRlclN0cmluZyA9IGZvb3RwcmludGVyU3RyaW5nLnJlcGxhY2UoXCJjYXBcIiwgXCJcIilcbiAgICAgIH1cbiAgICAgIGNvbnN0IHsgY2FwYWNpdG9ycyB9ID0gYXdhaXQgZ2V0SmxjUGFydHNDYWNoZWQoXCJjYXBhY2l0b3JzXCIsIHtcbiAgICAgICAgY2FwYWNpdGFuY2U6IHNvdXJjZUNvbXBvbmVudC5jYXBhY2l0YW5jZSxcbiAgICAgICAgcGFja2FnZTogZm9vdHByaW50ZXJTdHJpbmcsXG4gICAgICB9KVxuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBqbGNwY2I6IGNhcGFjaXRvcnMubWFwKChjOiBhbnkpID0+IGBDJHtjLmxjc2N9YCkuc2xpY2UoMCwgMyksXG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChcbiAgICAgIHNvdXJjZUNvbXBvbmVudC50eXBlID09PSBcInNvdXJjZV9jb21wb25lbnRcIiAmJlxuICAgICAgc291cmNlQ29tcG9uZW50LmZ0eXBlID09PSBcInNpbXBsZV9waW5faGVhZGVyXCJcbiAgICApIHtcbiAgICAgIGxldCBwaXRjaFxuICAgICAgaWYgKGZvb3RwcmludGVyU3RyaW5nPy5pbmNsdWRlcyhcIl9wXCIpKSB7XG4gICAgICAgIHBpdGNoID0gZm9vdHByaW50ZXJTdHJpbmcuc3BsaXQoXCJfcFwiKVsxXVxuICAgICAgfVxuICAgICAgY29uc3QgeyBoZWFkZXJzIH0gPSBhd2FpdCBnZXRKbGNQYXJ0c0NhY2hlZChcbiAgICAgICAgXCJoZWFkZXJzXCIsXG4gICAgICAgIHBpdGNoXG4gICAgICAgICAgPyB7XG4gICAgICAgICAgICAgIHBpdGNoOiBwaXRjaCxcbiAgICAgICAgICAgICAgbnVtX3BpbnM6IHNvdXJjZUNvbXBvbmVudC5waW5fY291bnQsXG4gICAgICAgICAgICAgIGdlbmRlcjogc291cmNlQ29tcG9uZW50LmdlbmRlcixcbiAgICAgICAgICAgIH1cbiAgICAgICAgICA6IHtcbiAgICAgICAgICAgICAgbnVtX3BpbnM6IHNvdXJjZUNvbXBvbmVudC5waW5fY291bnQsXG4gICAgICAgICAgICAgIGdlbmRlcjogc291cmNlQ29tcG9uZW50LmdlbmRlcixcbiAgICAgICAgICAgIH0sXG4gICAgICApXG4gICAgICByZXR1cm4ge1xuICAgICAgICBqbGNwY2I6IGhlYWRlcnMubWFwKChoOiBhbnkpID0+IGBDJHtoLmxjc2N9YCkuc2xpY2UoMCwgMyksXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB7fVxuICB9LFxufVxuIiwgImltcG9ydCB0eXBlIHsgUGxhdGZvcm1Db25maWcgfSBmcm9tIFwiQHRzY2lyY3VpdC9wcm9wc1wiXG5pbXBvcnQgeyBqbGNQYXJ0c0VuZ2luZSB9IGZyb20gXCJAdHNjaXJjdWl0L3BhcnRzLWVuZ2luZVwiXG5cbmV4cG9ydCBjb25zdCBnZXRQbGF0Zm9ybUNvbmZpZyA9ICgpOiBQbGF0Zm9ybUNvbmZpZyA9PiAoe1xuICBwYXJ0c0VuZ2luZTogamxjUGFydHNFbmdpbmUsXG59KVxuIiwgImV4cG9ydCBmdW5jdGlvbiBub3JtYWxpemVGaWxlUGF0aChmaWxlUGF0aDogc3RyaW5nKSB7XG4gIGxldCBub3JtRmlsZVBhdGggPSBmaWxlUGF0aFxuICBub3JtRmlsZVBhdGggPSBub3JtRmlsZVBhdGgucmVwbGFjZSgvXFxcXC9nLCBcIi9cIilcbiAgbm9ybUZpbGVQYXRoID0gbm9ybUZpbGVQYXRoLnRyaW0oKVxuICBpZiAobm9ybUZpbGVQYXRoLnN0YXJ0c1dpdGgoXCIuL1wiKSkge1xuICAgIG5vcm1GaWxlUGF0aCA9IG5vcm1GaWxlUGF0aC5zbGljZSgyKVxuICB9XG4gIGlmIChub3JtRmlsZVBhdGguc3RhcnRzV2l0aChcIi9cIikpIHtcbiAgICBub3JtRmlsZVBhdGggPSBub3JtRmlsZVBhdGguc2xpY2UoMSlcbiAgfVxuICByZXR1cm4gbm9ybUZpbGVQYXRoXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBub3JtYWxpemVGc01hcChmc01hcDogUmVjb3JkPHN0cmluZywgc3RyaW5nPikge1xuICBjb25zdCBub3JtYWxpemVkRnNNYXA6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fVxuICBmb3IgKGNvbnN0IFtmc1BhdGgsIGZpbGVDb250ZW50XSBvZiBPYmplY3QuZW50cmllcyhmc01hcCkpIHtcbiAgICBub3JtYWxpemVkRnNNYXBbbm9ybWFsaXplRmlsZVBhdGgoZnNQYXRoKV0gPSBmaWxlQ29udGVudFxuICB9XG4gIHJldHVybiBub3JtYWxpemVkRnNNYXBcbn1cbiIsICJpbXBvcnQgdHlwZSB7IEFueUNpcmN1aXRFbGVtZW50IH0gZnJvbSBcImNpcmN1aXQtanNvblwiXG5pbXBvcnQgdHlwZSB7XG4gIENpcmN1aXRSdW5uZXJBcGksXG4gIENpcmN1aXRSdW5uZXJDb25maWd1cmF0aW9uLFxufSBmcm9tIFwibGliL3NoYXJlZC90eXBlc1wiXG5pbXBvcnQgeyBjcmVhdGVFeGVjdXRpb25Db250ZXh0IH0gZnJvbSBcIi4uLy4uL3dlYndvcmtlci9leGVjdXRpb24tY29udGV4dFwiXG5pbXBvcnQgeyBub3JtYWxpemVGc01hcCB9IGZyb20gXCIuL25vcm1hbGl6ZUZzTWFwXCJcbmltcG9ydCB0eXBlIHsgUm9vdENpcmN1aXQgfSBmcm9tIFwiQHRzY2lyY3VpdC9jb3JlXCJcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gXCJyZWFjdFwiXG5pbXBvcnQgeyBpbXBvcnRFdmFsUGF0aCB9IGZyb20gXCJ3ZWJ3b3JrZXIvaW1wb3J0LWV2YWwtcGF0aFwiXG5pbXBvcnQgeyBzZXR1cERlZmF1bHRFbnRyeXBvaW50SWZOZWVkZWQgfSBmcm9tIFwiLi9zZXR1cERlZmF1bHRFbnRyeXBvaW50SWZOZWVkZWRcIlxuXG5leHBvcnQgY2xhc3MgQ2lyY3VpdFJ1bm5lciBpbXBsZW1lbnRzIENpcmN1aXRSdW5uZXJBcGkge1xuICBfZXhlY3V0aW9uQ29udGV4dDogUmV0dXJuVHlwZTx0eXBlb2YgY3JlYXRlRXhlY3V0aW9uQ29udGV4dD4gfCBudWxsID0gbnVsbFxuICBfY2lyY3VpdFJ1bm5lckNvbmZpZ3VyYXRpb246IENpcmN1aXRSdW5uZXJDb25maWd1cmF0aW9uID0ge1xuICAgIHNuaXBwZXRzQXBpQmFzZVVybDogXCJodHRwczovL3JlZ2lzdHJ5LWFwaS50c2NpcmN1aXQuY29tXCIsXG4gICAgY2pzUmVnaXN0cnlVcmw6IFwiaHR0cHM6Ly9janMudHNjaXJjdWl0LmNvbVwiLFxuICAgIHZlcmJvc2U6IGZhbHNlLFxuICB9XG4gIF9ldmVudExpc3RlbmVyczogUmVjb3JkPHN0cmluZywgKCguLi5hcmdzOiBhbnlbXSkgPT4gdm9pZClbXT4gPSB7fVxuXG4gIGFzeW5jIGV4ZWN1dGVXaXRoRnNNYXAob2dPcHRzOiB7XG4gICAgZW50cnlwb2ludD86IHN0cmluZ1xuICAgIG1haW5Db21wb25lbnRQYXRoPzogc3RyaW5nXG4gICAgbWFpbkNvbXBvbmVudE5hbWU/OiBzdHJpbmdcbiAgICBmc01hcDogUmVjb3JkPHN0cmluZywgc3RyaW5nPlxuICAgIG5hbWU/OiBzdHJpbmdcbiAgICBtYWluQ29tcG9uZW50UHJvcHM/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+XG4gIH0pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBvcHRzID0geyAuLi5vZ09wdHMgfVxuICAgIGlmICh0aGlzLl9jaXJjdWl0UnVubmVyQ29uZmlndXJhdGlvbi52ZXJib3NlKSB7XG4gICAgICBjb25zb2xlLmxvZyhcIltDaXJjdWl0UnVubmVyXSBleGVjdXRlV2l0aEZzTWFwIGNhbGxlZCB3aXRoOlwiLCB7XG4gICAgICAgIGVudHJ5cG9pbnQ6IG9wdHMuZW50cnlwb2ludCxcbiAgICAgICAgZnNNYXBLZXlzOiBPYmplY3Qua2V5cyhvcHRzLmZzTWFwKSxcbiAgICAgICAgbmFtZTogb3B0cy5uYW1lLFxuICAgICAgfSlcbiAgICB9XG5cbiAgICBzZXR1cERlZmF1bHRFbnRyeXBvaW50SWZOZWVkZWQob3B0cylcblxuICAgIHRoaXMuX2V4ZWN1dGlvbkNvbnRleHQgPSBjcmVhdGVFeGVjdXRpb25Db250ZXh0KFxuICAgICAgdGhpcy5fY2lyY3VpdFJ1bm5lckNvbmZpZ3VyYXRpb24sXG4gICAgICB7XG4gICAgICAgIG5hbWU6IG9wdHMubmFtZSxcbiAgICAgIH0sXG4gICAgKVxuICAgIHRoaXMuX2JpbmRFdmVudExpc3RlbmVycyh0aGlzLl9leGVjdXRpb25Db250ZXh0LmNpcmN1aXQpXG5cbiAgICB0aGlzLl9leGVjdXRpb25Db250ZXh0LmZzTWFwID0gbm9ybWFsaXplRnNNYXAob3B0cy5mc01hcClcbiAgICBpZiAoIXRoaXMuX2V4ZWN1dGlvbkNvbnRleHQuZnNNYXBbb3B0cy5lbnRyeXBvaW50IV0pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRW50cnlwb2ludCBcIiR7b3B0cy5lbnRyeXBvaW50fVwiIG5vdCBmb3VuZGApXG4gICAgfVxuICAgIDsoZ2xvYmFsVGhpcyBhcyBhbnkpLl9fdHNjaXJjdWl0X2NpcmN1aXQgPSB0aGlzLl9leGVjdXRpb25Db250ZXh0LmNpcmN1aXRcblxuICAgIGNvbnN0IGVudHJ5cG9pbnQgPSBvcHRzLmVudHJ5cG9pbnQhLnN0YXJ0c1dpdGgoXCIuL1wiKVxuICAgICAgPyBvcHRzLmVudHJ5cG9pbnRcbiAgICAgIDogYC4vJHtvcHRzLmVudHJ5cG9pbnR9YFxuXG4gICAgYXdhaXQgaW1wb3J0RXZhbFBhdGgoZW50cnlwb2ludCEsIHRoaXMuX2V4ZWN1dGlvbkNvbnRleHQpXG4gIH1cblxuICBhc3luYyBleGVjdXRlKGNvZGU6IHN0cmluZywgb3B0czogeyBuYW1lPzogc3RyaW5nIH0gPSB7fSkge1xuICAgIGlmICh0aGlzLl9jaXJjdWl0UnVubmVyQ29uZmlndXJhdGlvbi52ZXJib3NlKSB7XG4gICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgXCJbQ2lyY3VpdFJ1bm5lcl0gZXhlY3V0ZSBjYWxsZWQgd2l0aCBjb2RlIGxlbmd0aDpcIixcbiAgICAgICAgY29kZS5sZW5ndGgsXG4gICAgICApXG4gICAgfVxuXG4gICAgdGhpcy5fZXhlY3V0aW9uQ29udGV4dCA9IGNyZWF0ZUV4ZWN1dGlvbkNvbnRleHQoXG4gICAgICB0aGlzLl9jaXJjdWl0UnVubmVyQ29uZmlndXJhdGlvbixcbiAgICAgIG9wdHMsXG4gICAgKVxuICAgIHRoaXMuX2JpbmRFdmVudExpc3RlbmVycyh0aGlzLl9leGVjdXRpb25Db250ZXh0LmNpcmN1aXQpXG4gICAgdGhpcy5fZXhlY3V0aW9uQ29udGV4dC5mc01hcFtcImVudHJ5cG9pbnQudHN4XCJdID0gY29kZVxuICAgIDsoZ2xvYmFsVGhpcyBhcyBhbnkpLl9fdHNjaXJjdWl0X2NpcmN1aXQgPSB0aGlzLl9leGVjdXRpb25Db250ZXh0LmNpcmN1aXRcblxuICAgIGF3YWl0IGltcG9ydEV2YWxQYXRoKFwiLi9lbnRyeXBvaW50LnRzeFwiLCB0aGlzLl9leGVjdXRpb25Db250ZXh0KVxuICB9XG5cbiAgb24oZXZlbnQ6IHN0cmluZywgY2FsbGJhY2s6ICguLi5hcmdzOiBhbnlbXSkgPT4gdm9pZCkge1xuICAgIHRoaXMuX2V2ZW50TGlzdGVuZXJzW2V2ZW50XSA/Pz0gW11cbiAgICB0aGlzLl9ldmVudExpc3RlbmVyc1tldmVudF0ucHVzaChjYWxsYmFjaylcbiAgICB0aGlzLl9leGVjdXRpb25Db250ZXh0Py5jaXJjdWl0Lm9uKGV2ZW50IGFzIGFueSwgY2FsbGJhY2spXG4gIH1cblxuICBhc3luYyByZW5kZXJVbnRpbFNldHRsZWQoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKCF0aGlzLl9leGVjdXRpb25Db250ZXh0KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJObyBjaXJjdWl0IGhhcyBiZWVuIGNyZWF0ZWRcIilcbiAgICB9XG4gICAgYXdhaXQgdGhpcy5fZXhlY3V0aW9uQ29udGV4dC5jaXJjdWl0LnJlbmRlclVudGlsU2V0dGxlZCgpXG4gIH1cblxuICBhc3luYyBnZXRDaXJjdWl0SnNvbigpOiBQcm9taXNlPEFueUNpcmN1aXRFbGVtZW50W10+IHtcbiAgICBpZiAoIXRoaXMuX2V4ZWN1dGlvbkNvbnRleHQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIk5vIGNpcmN1aXQgaGFzIGJlZW4gY3JlYXRlZFwiKVxuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fZXhlY3V0aW9uQ29udGV4dC5jaXJjdWl0LmdldENpcmN1aXRKc29uKClcbiAgfVxuXG4gIGNsZWFyRXZlbnRMaXN0ZW5lcnMoKSB7XG4gICAgaWYgKHRoaXMuX2V4ZWN1dGlvbkNvbnRleHQ/LmNpcmN1aXQpIHtcbiAgICAgIGZvciAoY29uc3QgZXZlbnQgaW4gdGhpcy5fZXZlbnRMaXN0ZW5lcnMpIHtcbiAgICAgICAgZm9yIChjb25zdCBsaXN0ZW5lciBvZiB0aGlzLl9ldmVudExpc3RlbmVyc1tldmVudF0pIHtcbiAgICAgICAgICBjb25zdCBjaXJjdWl0ID0gdGhpcy5fZXhlY3V0aW9uQ29udGV4dC5jaXJjdWl0IGFzIHVua25vd24gYXMge1xuICAgICAgICAgICAgLy8gYmlvbWUtaWdub3JlIGxpbnQvY29tcGxleGl0eS9ub0Jhbm5lZFR5cGVzOiA8ZXhwbGFuYXRpb24+XG4gICAgICAgICAgICByZW1vdmVMaXN0ZW5lcj86IChldmVudDogc3RyaW5nLCBsaXN0ZW5lcjogRnVuY3Rpb24pID0+IHZvaWRcbiAgICAgICAgICB9XG4gICAgICAgICAgY2lyY3VpdC5yZW1vdmVMaXN0ZW5lcj8uKGV2ZW50LCBsaXN0ZW5lcilcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGZvciAoY29uc3QgZXZlbnQgaW4gdGhpcy5fZXZlbnRMaXN0ZW5lcnMpIHtcbiAgICAgIGRlbGV0ZSB0aGlzLl9ldmVudExpc3RlbmVyc1tldmVudF1cbiAgICB9XG4gIH1cblxuICBhc3luYyBraWxsKCkge1xuICAgIC8vIENsZWFudXAgcmVzb3VyY2VzXG4gICAgdGhpcy5fZXhlY3V0aW9uQ29udGV4dCA9IG51bGxcbiAgfVxuXG4gIGFzeW5jIHNldFNuaXBwZXRzQXBpQmFzZVVybChiYXNlVXJsOiBzdHJpbmcpIHtcbiAgICB0aGlzLl9jaXJjdWl0UnVubmVyQ29uZmlndXJhdGlvbi5zbmlwcGV0c0FwaUJhc2VVcmwgPSBiYXNlVXJsXG4gIH1cblxuICBwcml2YXRlIF9iaW5kRXZlbnRMaXN0ZW5lcnMoY2lyY3VpdDogUm9vdENpcmN1aXQpIHtcbiAgICBmb3IgKGNvbnN0IGV2ZW50IGluIHRoaXMuX2V2ZW50TGlzdGVuZXJzKSB7XG4gICAgICBmb3IgKGNvbnN0IGxpc3RlbmVyIG9mIHRoaXMuX2V2ZW50TGlzdGVuZXJzW2V2ZW50XSkge1xuICAgICAgICBjaXJjdWl0Lm9uKGV2ZW50IGFzIGFueSwgbGlzdGVuZXIgYXMgYW55KVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuIiwgIi8qKlxuICogUmV0dXJucyB0aGUgZGlyZWN0b3J5IG5hbWUgb2YgYSBwYXRoLCBzaW1pbGFyIHRvIE5vZGUuanMgcGF0aC5kaXJuYW1lXG4gKiBXb3JrcyBvbiBib3RoIFVuaXggYW5kIFdpbmRvd3MgcGF0aHNcbiAqIEBwYXJhbSBwYXRoIFRoZSBwYXRoIHRvIGV4dHJhY3QgdGhlIGRpcmVjdG9yeSBmcm9tXG4gKiBAcmV0dXJucyBUaGUgZGlyZWN0b3J5IHBhcnQgb2YgdGhlIHBhdGhcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRpcm5hbWUocGF0aDogc3RyaW5nKTogc3RyaW5nIHtcbiAgaWYgKCFwYXRoKSByZXR1cm4gXCIuXCJcblxuICAvLyBOb3JtYWxpemUgcGF0aCBzZXBhcmF0b3JzIHRvIGZvcndhcmQgc2xhc2hlc1xuICBjb25zdCBub3JtYWxpemVkUGF0aCA9IHBhdGgucmVwbGFjZSgvXFxcXC9nLCBcIi9cIilcblxuICAvLyBSZW1vdmUgdHJhaWxpbmcgc2xhc2hlc1xuICBjb25zdCBjbGVhblBhdGggPSBub3JtYWxpemVkUGF0aC5yZXBsYWNlKC9cXC8rJC8sIFwiXCIpXG5cbiAgLy8gSWYgdGhlcmUgYXJlIG5vIHNsYXNoZXMsIHJldHVybiBcIi5cIlxuICBpZiAoY2xlYW5QYXRoLmluZGV4T2YoXCIvXCIpID09PSAtMSkgcmV0dXJuIFwiLlwiXG5cbiAgLy8gUmV0dXJuIGV2ZXJ5dGhpbmcgdXAgdG8gdGhlIGxhc3Qgc2xhc2hcbiAgcmV0dXJuIGNsZWFuUGF0aC5zdWJzdHJpbmcoMCwgY2xlYW5QYXRoLmxhc3RJbmRleE9mKFwiL1wiKSkgfHwgXCIvXCJcbn1cbiIsICJpbXBvcnQgeyBub3JtYWxpemVGaWxlUGF0aCB9IGZyb20gXCIuL25vcm1hbGl6ZUZzTWFwXCJcbmltcG9ydCB7IGRpcm5hbWUgfSBmcm9tIFwibGliL3V0aWxzL2Rpcm5hbWVcIlxuXG5mdW5jdGlvbiByZXNvbHZlUmVsYXRpdmVQYXRoKGltcG9ydFBhdGg6IHN0cmluZywgY3dkOiBzdHJpbmcpOiBzdHJpbmcge1xuICAvLyBIYW5kbGUgcGFyZW50IGRpcmVjdG9yeSBuYXZpZ2F0aW9uXG4gIGlmIChpbXBvcnRQYXRoLnN0YXJ0c1dpdGgoXCIuLi9cIikpIHtcbiAgICBjb25zdCBwYXJlbnREaXIgPSBkaXJuYW1lKGN3ZClcbiAgICByZXR1cm4gcmVzb2x2ZVJlbGF0aXZlUGF0aChpbXBvcnRQYXRoLnNsaWNlKDMpLCBwYXJlbnREaXIpXG4gIH1cbiAgLy8gSGFuZGxlIGN1cnJlbnQgZGlyZWN0b3J5XG4gIGlmIChpbXBvcnRQYXRoLnN0YXJ0c1dpdGgoXCIuL1wiKSkge1xuICAgIHJldHVybiByZXNvbHZlUmVsYXRpdmVQYXRoKGltcG9ydFBhdGguc2xpY2UoMiksIGN3ZClcbiAgfVxuICAvLyBIYW5kbGUgYWJzb2x1dGUgcGF0aFxuICBpZiAoaW1wb3J0UGF0aC5zdGFydHNXaXRoKFwiL1wiKSkge1xuICAgIHJldHVybiBpbXBvcnRQYXRoLnNsaWNlKDEpXG4gIH1cbiAgLy8gSGFuZGxlIHJlbGF0aXZlIHBhdGhcbiAgcmV0dXJuIGAke2N3ZH0vJHtpbXBvcnRQYXRofWBcbn1cblxuZXhwb3J0IGNvbnN0IHJlc29sdmVGaWxlUGF0aCA9IChcbiAgdW5rbm93bkZpbGVQYXRoOiBzdHJpbmcsXG4gIGZzTWFwT3JBbGxGaWxlUGF0aHM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gfCBzdHJpbmdbXSxcbiAgY3dkPzogc3RyaW5nLFxuKSA9PiB7XG4gIC8vIEhhbmRsZSBwYXJlbnQgZGlyZWN0b3J5IG5hdmlnYXRpb24gcHJvcGVybHlcbiAgY29uc3QgcmVzb2x2ZWRQYXRoID0gY3dkXG4gICAgPyByZXNvbHZlUmVsYXRpdmVQYXRoKHVua25vd25GaWxlUGF0aCwgY3dkKVxuICAgIDogdW5rbm93bkZpbGVQYXRoXG5cbiAgY29uc3QgZmlsZVBhdGhzID0gbmV3IFNldChcbiAgICBBcnJheS5pc0FycmF5KGZzTWFwT3JBbGxGaWxlUGF0aHMpXG4gICAgICA/IGZzTWFwT3JBbGxGaWxlUGF0aHNcbiAgICAgIDogT2JqZWN0LmtleXMoZnNNYXBPckFsbEZpbGVQYXRocyksXG4gIClcblxuICBpZiAoZmlsZVBhdGhzLmhhcyhyZXNvbHZlZFBhdGgpKSB7XG4gICAgcmV0dXJuIHJlc29sdmVkUGF0aFxuICB9XG5cbiAgY29uc3Qgbm9ybWFsaXplZEZpbGVQYXRoTWFwID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZz4oKVxuICBmb3IgKGNvbnN0IGZpbGVQYXRoIG9mIGZpbGVQYXRocykge1xuICAgIG5vcm1hbGl6ZWRGaWxlUGF0aE1hcC5zZXQobm9ybWFsaXplRmlsZVBhdGgoZmlsZVBhdGgpLCBmaWxlUGF0aClcbiAgfVxuXG4gIGNvbnN0IG5vcm1hbGl6ZWRSZXNvbHZlZFBhdGggPSBub3JtYWxpemVGaWxlUGF0aChyZXNvbHZlZFBhdGgpXG5cbiAgaWYgKG5vcm1hbGl6ZWRGaWxlUGF0aE1hcC5oYXMobm9ybWFsaXplZFJlc29sdmVkUGF0aCkpIHtcbiAgICByZXR1cm4gbm9ybWFsaXplZEZpbGVQYXRoTWFwLmdldChub3JtYWxpemVkUmVzb2x2ZWRQYXRoKSFcbiAgfVxuXG4gIC8vIFNlYXJjaCBmb3IgZmlsZSB3aXRoIGEgc2V0IG9mIGRpZmZlcmVudCBleHRlbnNpb25zXG4gIGNvbnN0IGV4dGVuc2lvbiA9IFtcInRzeFwiLCBcInRzXCIsIFwianNvblwiLCBcImpzXCIsIFwianN4XCJdXG4gIGZvciAoY29uc3QgZXh0IG9mIGV4dGVuc2lvbikge1xuICAgIGNvbnN0IHBvc3NpYmxlRmlsZVBhdGggPSBgJHtub3JtYWxpemVkUmVzb2x2ZWRQYXRofS4ke2V4dH1gXG4gICAgaWYgKG5vcm1hbGl6ZWRGaWxlUGF0aE1hcC5oYXMocG9zc2libGVGaWxlUGF0aCkpIHtcbiAgICAgIHJldHVybiBub3JtYWxpemVkRmlsZVBhdGhNYXAuZ2V0KHBvc3NpYmxlRmlsZVBhdGgpIVxuICAgIH1cbiAgfVxuXG4gIC8vIENoZWNrIGlmIGl0J3MgYW4gYWJzb2x1dGUgaW1wb3J0XG4gIGlmICghdW5rbm93bkZpbGVQYXRoLnN0YXJ0c1dpdGgoXCIuL1wiKSAmJiAhdW5rbm93bkZpbGVQYXRoLnN0YXJ0c1dpdGgoXCIuLi9cIikpIHtcbiAgICBjb25zdCBub3JtYWxpemVkVW5rbm93bkZpbGVQYXRoID0gbm9ybWFsaXplRmlsZVBhdGgodW5rbm93bkZpbGVQYXRoKVxuICAgIGlmIChub3JtYWxpemVkRmlsZVBhdGhNYXAuaGFzKG5vcm1hbGl6ZWRVbmtub3duRmlsZVBhdGgpKSB7XG4gICAgICByZXR1cm4gbm9ybWFsaXplZEZpbGVQYXRoTWFwLmdldChub3JtYWxpemVkVW5rbm93bkZpbGVQYXRoKSFcbiAgICB9XG4gICAgZm9yIChjb25zdCBleHQgb2YgZXh0ZW5zaW9uKSB7XG4gICAgICBjb25zdCBwb3NzaWJsZUZpbGVQYXRoID0gYCR7bm9ybWFsaXplZFVua25vd25GaWxlUGF0aH0uJHtleHR9YFxuICAgICAgaWYgKG5vcm1hbGl6ZWRGaWxlUGF0aE1hcC5oYXMocG9zc2libGVGaWxlUGF0aCkpIHtcbiAgICAgICAgcmV0dXJuIG5vcm1hbGl6ZWRGaWxlUGF0aE1hcC5nZXQocG9zc2libGVGaWxlUGF0aCkhXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG51bGxcbn1cblxuZXhwb3J0IGNvbnN0IHJlc29sdmVGaWxlUGF0aE9yVGhyb3cgPSAoXG4gIHVua25vd25GaWxlUGF0aDogc3RyaW5nLFxuICBmc01hcE9yQWxsRmlsZVBhdGhzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IHwgc3RyaW5nW10sXG4pID0+IHtcbiAgY29uc3QgcmVzb2x2ZWRGaWxlUGF0aCA9IHJlc29sdmVGaWxlUGF0aCh1bmtub3duRmlsZVBhdGgsIGZzTWFwT3JBbGxGaWxlUGF0aHMpXG4gIGlmICghcmVzb2x2ZWRGaWxlUGF0aCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBGaWxlIG5vdCBmb3VuZCBcIiR7dW5rbm93bkZpbGVQYXRofVwiLCBhdmFpbGFibGUgcGF0aHM6XFxuXFxuJHtPYmplY3Qua2V5cyhmc01hcE9yQWxsRmlsZVBhdGhzKS5qb2luKFwiLCBcIil9YCxcbiAgICApXG4gIH1cbiAgcmV0dXJuIHJlc29sdmVkRmlsZVBhdGhcbn1cbiIsICJpbXBvcnQgeyByZXNvbHZlRmlsZVBhdGggfSBmcm9tIFwibGliL3J1bm5lci9yZXNvbHZlRmlsZVBhdGhcIlxuXG5leHBvcnQgZnVuY3Rpb24gZXZhbENvbXBpbGVkSnMoXG4gIGNvbXBpbGVkQ29kZTogc3RyaW5nLFxuICBwcmVTdXBwbGllZEltcG9ydHM6IFJlY29yZDxzdHJpbmcsIGFueT4sXG4gIGN3ZD86IHN0cmluZyxcbikge1xuICA7KGdsb2JhbFRoaXMgYXMgYW55KS5fX3RzY2lyY3VpdF9yZXF1aXJlID0gKG5hbWU6IHN0cmluZykgPT4ge1xuICAgIGNvbnN0IHJlc29sdmVkRmlsZVBhdGggPSByZXNvbHZlRmlsZVBhdGgobmFtZSwgcHJlU3VwcGxpZWRJbXBvcnRzLCBjd2QpXG5cbiAgICBjb25zdCBoYXNSZXNvbHZlZEZpbGVQYXRoID1cbiAgICAgIHJlc29sdmVkRmlsZVBhdGggJiYgcHJlU3VwcGxpZWRJbXBvcnRzW3Jlc29sdmVkRmlsZVBhdGhdXG5cbiAgICBpZiAoIXByZVN1cHBsaWVkSW1wb3J0c1tuYW1lXSAmJiAhaGFzUmVzb2x2ZWRGaWxlUGF0aCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbXBvcnQgXCIke25hbWV9XCIgbm90IGZvdW5kICR7Y3dkID8gYGluIFwiJHtjd2R9XCJgIDogXCJcIn1gKVxuICAgIH1cblxuICAgIGNvbnN0IG1vZCA9XG4gICAgICBwcmVTdXBwbGllZEltcG9ydHNbbmFtZV0gfHwgcHJlU3VwcGxpZWRJbXBvcnRzW3Jlc29sdmVkRmlsZVBhdGghXVxuICAgIHJldHVybiBuZXcgUHJveHkobW9kLCB7XG4gICAgICBnZXQodGFyZ2V0LCBwcm9wKSB7XG4gICAgICAgIGlmICghKHByb3AgaW4gdGFyZ2V0KSkge1xuICAgICAgICAgIGlmIChwcm9wID09PSBcImRlZmF1bHRcIikge1xuICAgICAgICAgICAgaWYgKHRhcmdldC5kZWZhdWx0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHRhcmdldC5kZWZhdWx0XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh0YXJnZXQuX19lc01vZHVsZSkge1xuICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh0eXBlb2YgdGFyZ2V0ID09PSBcImZ1bmN0aW9uXCIgfHwgdHlwZW9mIHRhcmdldCA9PT0gXCJvYmplY3RcIikge1xuICAgICAgICAgICAgICByZXR1cm4gdGFyZ2V0XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWRcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAocHJvcCA9PT0gXCJfX2VzTW9kdWxlXCIpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgYENvbXBvbmVudCBcIiR7U3RyaW5nKHByb3ApfVwiIGlzIG5vdCBleHBvcnRlZCBieSBcIiR7bmFtZX1cImAsXG4gICAgICAgICAgKVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRhcmdldFtwcm9wIGFzIGtleW9mIHR5cGVvZiB0YXJnZXRdXG4gICAgICB9LFxuICAgIH0pXG4gIH1cblxuICBjb25zdCBmdW5jdGlvbkJvZHkgPSBgXG4gIHZhciBleHBvcnRzID0ge307XG4gIHZhciByZXF1aXJlID0gZ2xvYmFsVGhpcy5fX3RzY2lyY3VpdF9yZXF1aXJlO1xuICB2YXIgbW9kdWxlID0geyBleHBvcnRzIH07XG4gIHZhciBjaXJjdWl0ID0gZ2xvYmFsVGhpcy5fX3RzY2lyY3VpdF9jaXJjdWl0O1xuICAke2NvbXBpbGVkQ29kZX07XG4gIHJldHVybiBtb2R1bGU7YC50cmltKClcbiAgcmV0dXJuIEZ1bmN0aW9uKGZ1bmN0aW9uQm9keSkuY2FsbChnbG9iYWxUaGlzKVxufVxuIiwgImltcG9ydCB7IGV2YWxDb21waWxlZEpzIH0gZnJvbSBcIi4vZXZhbC1jb21waWxlZC1qc1wiXG5pbXBvcnQgdHlwZSB7IEV4ZWN1dGlvbkNvbnRleHQgfSBmcm9tIFwiLi9leGVjdXRpb24tY29udGV4dFwiXG5pbXBvcnQgKiBhcyBCYWJlbCBmcm9tIFwiQGJhYmVsL3N0YW5kYWxvbmVcIlxuaW1wb3J0IHsgaW1wb3J0TG9jYWxGaWxlIH0gZnJvbSBcIi4vaW1wb3J0LWxvY2FsLWZpbGVcIlxuaW1wb3J0IHsgaW1wb3J0U25pcHBldCB9IGZyb20gXCIuL2ltcG9ydC1zbmlwcGV0XCJcbmltcG9ydCB7IHJlc29sdmVGaWxlUGF0aCB9IGZyb20gXCJsaWIvcnVubmVyL3Jlc29sdmVGaWxlUGF0aFwiXG5pbXBvcnQgeyByZXNvbHZlTm9kZU1vZHVsZSB9IGZyb20gXCJsaWIvdXRpbHMvcmVzb2x2ZS1ub2RlLW1vZHVsZVwiXG5pbXBvcnQgeyBpbXBvcnROb2RlTW9kdWxlIH0gZnJvbSBcIi4vaW1wb3J0LW5vZGUtbW9kdWxlXCJcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGltcG9ydEV2YWxQYXRoKFxuICBpbXBvcnROYW1lOiBzdHJpbmcsXG4gIGN0eDogRXhlY3V0aW9uQ29udGV4dCxcbiAgZGVwdGggPSAwLFxuICBvcHRzOiB7XG4gICAgY3dkPzogc3RyaW5nXG4gIH0gPSB7fSxcbikge1xuICBpZiAoY3R4LnZlcmJvc2UpIHtcbiAgICBjb25zb2xlLmxvZyhgW1dvcmtlcl0gJHtcIiAgXCIucmVwZWF0KGRlcHRoKX1cdTI3QTFcdUZFMEZgLCBpbXBvcnROYW1lKVxuICB9XG4gIGNvbnN0IHsgcHJlU3VwcGxpZWRJbXBvcnRzIH0gPSBjdHhcblxuICBpZiAocHJlU3VwcGxpZWRJbXBvcnRzW2ltcG9ydE5hbWVdKSByZXR1cm5cbiAgaWYgKGltcG9ydE5hbWUuc3RhcnRzV2l0aChcIi4vXCIpICYmIHByZVN1cHBsaWVkSW1wb3J0c1tpbXBvcnROYW1lLnNsaWNlKDIpXSlcbiAgICByZXR1cm5cblxuICBpZiAoZGVwdGggPiA1KSB7XG4gICAgY29uc29sZS5sb2coXCJNYXggZGVwdGggZm9yIGltcG9ydHMgcmVhY2hlZFwiKVxuICAgIHJldHVyblxuICB9XG5cbiAgY29uc3QgcmVzb2x2ZWRMb2NhbEltcG9ydFBhdGggPSByZXNvbHZlRmlsZVBhdGgoXG4gICAgaW1wb3J0TmFtZSxcbiAgICBjdHguZnNNYXAsXG4gICAgb3B0cy5jd2QsXG4gIClcbiAgaWYgKHJlc29sdmVkTG9jYWxJbXBvcnRQYXRoKSB7XG4gICAgcmV0dXJuIGltcG9ydExvY2FsRmlsZShyZXNvbHZlZExvY2FsSW1wb3J0UGF0aCwgY3R4LCBkZXB0aClcbiAgfVxuXG4gIC8vIFRyeSB0byByZXNvbHZlIGZyb20gbm9kZV9tb2R1bGVzXG4gIGNvbnN0IHJlc29sdmVkTm9kZU1vZHVsZVBhdGggPSByZXNvbHZlTm9kZU1vZHVsZShcbiAgICBpbXBvcnROYW1lLFxuICAgIGN0eC5mc01hcCxcbiAgICBvcHRzLmN3ZCB8fCBcIlwiLFxuICApXG4gIGlmIChyZXNvbHZlZE5vZGVNb2R1bGVQYXRoKSB7XG4gICAgcmV0dXJuIGltcG9ydE5vZGVNb2R1bGUoaW1wb3J0TmFtZSwgY3R4LCBkZXB0aClcbiAgfVxuXG4gIGlmIChpbXBvcnROYW1lLnN0YXJ0c1dpdGgoXCJAdHNjaS9cIikpIHtcbiAgICByZXR1cm4gaW1wb3J0U25pcHBldChpbXBvcnROYW1lLCBjdHgsIGRlcHRoKVxuICB9XG5cbiAgdGhyb3cgbmV3IEVycm9yKFxuICAgIGBVbnJlc29sdmVkIGltcG9ydCBcIiR7aW1wb3J0TmFtZX1cIiAke29wdHMuY3dkID8gYGZyb20gZGlyZWN0b3J5IFwiJHtvcHRzLmN3ZH1cImAgOiBcIlwifWAsXG4gIClcbn1cbiIsICJpbXBvcnQgKiBhcyBCYWJlbCBmcm9tIFwiQGJhYmVsL3N0YW5kYWxvbmVcIlxuaW1wb3J0IHsgcmVzb2x2ZUZpbGVQYXRoT3JUaHJvdyB9IGZyb20gXCJsaWIvcnVubmVyL3Jlc29sdmVGaWxlUGF0aFwiXG5pbXBvcnQgeyBkaXJuYW1lIH0gZnJvbSBcImxpYi91dGlscy9kaXJuYW1lXCJcbmltcG9ydCB7IGdldEltcG9ydHNGcm9tQ29kZSB9IGZyb20gXCJsaWIvdXRpbHMvZ2V0LWltcG9ydHMtZnJvbS1jb2RlXCJcbmltcG9ydCB7IGV2YWxDb21waWxlZEpzIH0gZnJvbSBcIi4vZXZhbC1jb21waWxlZC1qc1wiXG5pbXBvcnQgdHlwZSB7IEV4ZWN1dGlvbkNvbnRleHQgfSBmcm9tIFwiLi9leGVjdXRpb24tY29udGV4dFwiXG5pbXBvcnQgeyBpbXBvcnRFdmFsUGF0aCB9IGZyb20gXCIuL2ltcG9ydC1ldmFsLXBhdGhcIlxuXG5leHBvcnQgY29uc3QgaW1wb3J0TG9jYWxGaWxlID0gYXN5bmMgKFxuICBpbXBvcnROYW1lOiBzdHJpbmcsXG4gIGN0eDogRXhlY3V0aW9uQ29udGV4dCxcbiAgZGVwdGggPSAwLFxuKSA9PiB7XG4gIGNvbnN0IHsgZnNNYXAsIHByZVN1cHBsaWVkSW1wb3J0cyB9ID0gY3R4XG5cbiAgY29uc3QgZnNQYXRoID0gcmVzb2x2ZUZpbGVQYXRoT3JUaHJvdyhpbXBvcnROYW1lLCBmc01hcClcbiAgaWYgKCFjdHguZnNNYXBbZnNQYXRoXSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgRmlsZSBcIiR7ZnNQYXRofVwiIG5vdCBmb3VuZGApXG4gIH1cbiAgY29uc3QgZmlsZUNvbnRlbnQgPSBmc01hcFtmc1BhdGhdXG4gIGlmIChmc1BhdGguZW5kc1dpdGgoXCIuanNvblwiKSkge1xuICAgIGNvbnN0IGpzb25EYXRhID0gSlNPTi5wYXJzZShmaWxlQ29udGVudClcbiAgICBwcmVTdXBwbGllZEltcG9ydHNbZnNQYXRoXSA9IHtcbiAgICAgIF9fZXNNb2R1bGU6IHRydWUsXG4gICAgICBkZWZhdWx0OiBqc29uRGF0YSxcbiAgICB9XG4gIH0gZWxzZSBpZiAoZnNQYXRoLmVuZHNXaXRoKFwiLnRzeFwiKSB8fCBmc1BhdGguZW5kc1dpdGgoXCIudHNcIikpIHtcbiAgICBjb25zdCBpbXBvcnROYW1lcyA9IGdldEltcG9ydHNGcm9tQ29kZShmaWxlQ29udGVudClcblxuICAgIGZvciAoY29uc3QgaW1wb3J0TmFtZSBvZiBpbXBvcnROYW1lcykge1xuICAgICAgaWYgKCFwcmVTdXBwbGllZEltcG9ydHNbaW1wb3J0TmFtZV0pIHtcbiAgICAgICAgYXdhaXQgaW1wb3J0RXZhbFBhdGgoaW1wb3J0TmFtZSwgY3R4LCBkZXB0aCArIDEsIHtcbiAgICAgICAgICBjd2Q6IGRpcm5hbWUoZnNQYXRoKSxcbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCByZXN1bHQgPSBCYWJlbC50cmFuc2Zvcm0oZmlsZUNvbnRlbnQsIHtcbiAgICAgIHByZXNldHM6IFtcInJlYWN0XCIsIFwidHlwZXNjcmlwdFwiXSxcbiAgICAgIHBsdWdpbnM6IFtcInRyYW5zZm9ybS1tb2R1bGVzLWNvbW1vbmpzXCJdLFxuICAgICAgZmlsZW5hbWU6IFwidmlydHVhbC50c3hcIixcbiAgICB9KVxuXG4gICAgaWYgKCFyZXN1bHQgfHwgIXJlc3VsdC5jb2RlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJGYWlsZWQgdG8gdHJhbnNmb3JtIGNvZGVcIilcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgaW1wb3J0UnVuUmVzdWx0ID0gZXZhbENvbXBpbGVkSnMoXG4gICAgICAgIHJlc3VsdC5jb2RlLFxuICAgICAgICBwcmVTdXBwbGllZEltcG9ydHMsXG4gICAgICAgIGRpcm5hbWUoZnNQYXRoKSxcbiAgICAgIClcbiAgICAgIHByZVN1cHBsaWVkSW1wb3J0c1tmc1BhdGhdID0gaW1wb3J0UnVuUmVzdWx0LmV4cG9ydHNcbiAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBFdmFsIGNvbXBpbGVkIGpzIGVycm9yIGZvciBcIiR7aW1wb3J0TmFtZX1cIjogJHtlcnJvci5tZXNzYWdlfWAsXG4gICAgICApXG4gICAgfVxuICB9IGVsc2UgaWYgKGZzUGF0aC5lbmRzV2l0aChcIi5qc1wiKSkge1xuICAgIC8vIEZvciAuanMgZmlsZXMsIGVzcGVjaWFsbHkgZnJvbSBub2RlX21vZHVsZXMsIHdlIG5lZWQgdG8gdHJhbnNmb3JtIHRoZW1cbiAgICBjb25zdCByZXN1bHQgPSBCYWJlbC50cmFuc2Zvcm0oZmlsZUNvbnRlbnQsIHtcbiAgICAgIHByZXNldHM6IFtcImVudlwiXSxcbiAgICAgIHBsdWdpbnM6IFtcInRyYW5zZm9ybS1tb2R1bGVzLWNvbW1vbmpzXCJdLFxuICAgICAgZmlsZW5hbWU6IGZzUGF0aCxcbiAgICB9KVxuXG4gICAgaWYgKCFyZXN1bHQgfHwgIXJlc3VsdC5jb2RlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJGYWlsZWQgdG8gdHJhbnNmb3JtIEpTIGNvZGVcIilcbiAgICB9XG5cbiAgICBwcmVTdXBwbGllZEltcG9ydHNbZnNQYXRoXSA9IGV2YWxDb21waWxlZEpzKFxuICAgICAgcmVzdWx0LmNvZGUsXG4gICAgICBwcmVTdXBwbGllZEltcG9ydHMsXG4gICAgICBkaXJuYW1lKGZzUGF0aCksXG4gICAgKS5leHBvcnRzXG4gIH0gZWxzZSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYFVuc3VwcG9ydGVkIGZpbGUgZXh0ZW5zaW9uIFwiJHtmc1BhdGguc3BsaXQoXCIuXCIpLnBvcCgpfVwiIGZvciBcIiR7ZnNQYXRofVwiYCxcbiAgICApXG4gIH1cbn1cbiIsICJleHBvcnQgY29uc3QgZ2V0SW1wb3J0c0Zyb21Db2RlID0gKGNvZGU6IHN0cmluZyk6IHN0cmluZ1tdID0+IHtcbiAgLy8gTWF0Y2ggYmFzaWMgaW1wb3J0IHBhdHRlcm5zIGluY2x1ZGluZyBjb21iaW5lZCBkZWZhdWx0IGFuZCBuYW1lc3BhY2UgaW1wb3J0c1xuICBjb25zdCBpbXBvcnRSZWdleCA9XG4gICAgL15cXHMqaW1wb3J0XFxzKyg/Oig/OltcXHdcXHNdKyxcXHMqKT8oPzpcXCpcXHMrYXNcXHMrW1xcd1xcc10rfFxce1tcXHNcXHcsXStcXH18XFx3KylcXHMrZnJvbVxccyspP1snXCJdKC4rPylbJ1wiXS9nbVxuICBjb25zdCBpbXBvcnRzOiBzdHJpbmdbXSA9IFtdXG4gIGxldCBtYXRjaDogUmVnRXhwRXhlY0FycmF5IHwgbnVsbFxuXG4gIC8vIGJpb21lLWlnbm9yZSBsaW50L3N1c3BpY2lvdXMvbm9Bc3NpZ25JbkV4cHJlc3Npb25zOiA8ZXhwbGFuYXRpb24+XG4gIHdoaWxlICgobWF0Y2ggPSBpbXBvcnRSZWdleC5leGVjKGNvZGUpKSAhPT0gbnVsbCkge1xuICAgIGltcG9ydHMucHVzaChtYXRjaFsxXSlcbiAgfVxuXG4gIC8vIE1hdGNoIHJlLWV4cG9ydHNcbiAgY29uc3QgcmVFeHBvcnRSZWdleCA9XG4gICAgL15cXHMqZXhwb3J0XFxzKyg/OlxcKnwoPzpcXHtbXFxzXFx3LF0rXFx9KSlcXHMrZnJvbVxccytbJ1wiXSguKz8pWydcIl0vZ21cbiAgbGV0IHJlRXhwb3J0TWF0Y2g6IFJlZ0V4cEV4ZWNBcnJheSB8IG51bGxcbiAgLy8gYmlvbWUtaWdub3JlIGxpbnQvc3VzcGljaW91cy9ub0Fzc2lnbkluRXhwcmVzc2lvbnM6IDxleHBsYW5hdGlvbj5cbiAgd2hpbGUgKChyZUV4cG9ydE1hdGNoID0gcmVFeHBvcnRSZWdleC5leGVjKGNvZGUpKSAhPT0gbnVsbCkge1xuICAgIGltcG9ydHMucHVzaChyZUV4cG9ydE1hdGNoWzFdKVxuICB9XG5cbiAgcmV0dXJuIGltcG9ydHNcbn1cbiIsICJpbXBvcnQgeyBldmFsQ29tcGlsZWRKcyB9IGZyb20gXCIuL2V2YWwtY29tcGlsZWQtanNcIlxuaW1wb3J0IHR5cGUgeyBFeGVjdXRpb25Db250ZXh0IH0gZnJvbSBcIi4vZXhlY3V0aW9uLWNvbnRleHRcIlxuaW1wb3J0ICogYXMgQmFiZWwgZnJvbSBcIkBiYWJlbC9zdGFuZGFsb25lXCJcbmltcG9ydCB7IGltcG9ydExvY2FsRmlsZSB9IGZyb20gXCIuL2ltcG9ydC1sb2NhbC1maWxlXCJcbmltcG9ydCB7IGltcG9ydEV2YWxQYXRoIH0gZnJvbSBcIi4vaW1wb3J0LWV2YWwtcGF0aFwiXG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBpbXBvcnRTbmlwcGV0KFxuICBpbXBvcnROYW1lOiBzdHJpbmcsXG4gIGN0eDogRXhlY3V0aW9uQ29udGV4dCxcbiAgZGVwdGggPSAwLFxuKSB7XG4gIGNvbnN0IHsgcHJlU3VwcGxpZWRJbXBvcnRzIH0gPSBjdHhcbiAgY29uc3QgZnVsbFNuaXBwZXROYW1lID0gaW1wb3J0TmFtZS5yZXBsYWNlKFwiQHRzY2kvXCIsIFwiXCIpLnJlcGxhY2UoXCIuXCIsIFwiL1wiKVxuXG4gIGNvbnN0IHsgY2pzLCBlcnJvciB9ID0gYXdhaXQgZmV0Y2goYCR7Y3R4LmNqc1JlZ2lzdHJ5VXJsfS8ke2Z1bGxTbmlwcGV0TmFtZX1gKVxuICAgIC50aGVuKGFzeW5jIChyZXMpID0+ICh7IGNqczogYXdhaXQgcmVzLnRleHQoKSwgZXJyb3I6IG51bGwgfSkpXG4gICAgLmNhdGNoKChlKSA9PiAoeyBlcnJvcjogZSwgY2pzOiBudWxsIH0pKVxuXG4gIGlmIChlcnJvcikge1xuICAgIGNvbnNvbGUuZXJyb3IoXCJFcnJvciBmZXRjaGluZyBpbXBvcnRcIiwgaW1wb3J0TmFtZSwgZXJyb3IpXG4gICAgcmV0dXJuXG4gIH1cblxuICB0cnkge1xuICAgIHByZVN1cHBsaWVkSW1wb3J0c1tpbXBvcnROYW1lXSA9IGV2YWxDb21waWxlZEpzKFxuICAgICAgY2pzISxcbiAgICAgIHByZVN1cHBsaWVkSW1wb3J0cyxcbiAgICApLmV4cG9ydHNcbiAgfSBjYXRjaCAoZSkge1xuICAgIGNvbnNvbGUuZXJyb3IoXCJFcnJvciBpbXBvcnRpbmcgc25pcHBldFwiLCBlKVxuICB9XG59XG4iLCAiaW1wb3J0IHsgZGlybmFtZSB9IGZyb20gXCIuL2Rpcm5hbWVcIlxuXG5pbnRlcmZhY2UgUGFja2FnZUpzb24ge1xuICBtYWluPzogc3RyaW5nXG4gIG1vZHVsZT86IHN0cmluZ1xuICBleHBvcnRzPzogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgUmVjb3JkPHN0cmluZywgc3RyaW5nPj5cbn1cblxuaW50ZXJmYWNlIE5vZGVSZXNvbHV0aW9uQ29udGV4dCB7XG4gIGZzTWFwOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+XG4gIGV4dGVuc2lvbnM6IHN0cmluZ1tdXG4gIGJhc2VQYXRoOiBzdHJpbmdcbiAgbW9kdWxlUGF0aDogc3RyaW5nXG59XG5cbmZ1bmN0aW9uIGNyZWF0ZUNvbnRleHQoXG4gIG1vZHVsZVBhdGg6IHN0cmluZyxcbiAgZnNNYXA6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4sXG4gIGJhc2VQYXRoOiBzdHJpbmcsXG4pOiBOb2RlUmVzb2x1dGlvbkNvbnRleHQge1xuICByZXR1cm4ge1xuICAgIGZzTWFwLFxuICAgIGV4dGVuc2lvbnM6IFtcIi5qc1wiLCBcIi5qc3hcIiwgXCIudHNcIiwgXCIudHN4XCIsIFwiLmpzb25cIl0sXG4gICAgYmFzZVBhdGgsXG4gICAgbW9kdWxlUGF0aCxcbiAgfVxufVxuXG5mdW5jdGlvbiBmaW5kUGFja2FnZUpzb24obm9kZU1vZHVsZXNQYXRoOiBzdHJpbmcsIGN0eDogTm9kZVJlc29sdXRpb25Db250ZXh0KSB7XG4gIGNvbnN0IHBhY2thZ2VKc29uUGF0aCA9IGAke25vZGVNb2R1bGVzUGF0aH0vcGFja2FnZS5qc29uYFxuICBpZiAoIWN0eC5mc01hcFtwYWNrYWdlSnNvblBhdGhdKSByZXR1cm4gbnVsbFxuICB0cnkge1xuICAgIHJldHVybiBKU09OLnBhcnNlKGN0eC5mc01hcFtwYWNrYWdlSnNvblBhdGhdKSBhcyBQYWNrYWdlSnNvblxuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gbnVsbFxuICB9XG59XG5cbmZ1bmN0aW9uIHRyeVJlc29sdmVXaXRoRXh0ZW5zaW9ucyhcbiAgcGF0aDogc3RyaW5nLFxuICBjdHg6IE5vZGVSZXNvbHV0aW9uQ29udGV4dCxcbik6IHN0cmluZyB8IG51bGwge1xuICBpZiAoY3R4LmZzTWFwW3BhdGhdKSByZXR1cm4gcGF0aFxuXG4gIGZvciAoY29uc3QgZXh0IG9mIGN0eC5leHRlbnNpb25zKSB7XG4gICAgY29uc3QgcGF0aFdpdGhFeHQgPSBwYXRoLnJlcGxhY2UoL1xcLmpzJHxcXC5qc3gkLywgXCJcIikgKyBleHRcbiAgICBpZiAoY3R4LmZzTWFwW3BhdGhXaXRoRXh0XSkgcmV0dXJuIHBhdGhXaXRoRXh0XG4gIH1cbiAgcmV0dXJuIG51bGxcbn1cblxuZnVuY3Rpb24gcmVzb2x2ZUV4cG9ydFBhdGgoXG4gIG5vZGVNb2R1bGVzUGF0aDogc3RyaW5nLFxuICBleHBvcnRQYXRoOiBzdHJpbmcsXG4gIGN0eDogTm9kZVJlc29sdXRpb25Db250ZXh0LFxuKTogc3RyaW5nIHwgbnVsbCB7XG4gIGNvbnN0IGZ1bGxFeHBvcnRQYXRoID0gYCR7bm9kZU1vZHVsZXNQYXRofS8ke2V4cG9ydFBhdGgucmVwbGFjZSgvXlxcLlxcLy8sIFwiXCIpfWBcbiAgcmV0dXJuIHRyeVJlc29sdmVXaXRoRXh0ZW5zaW9ucyhmdWxsRXhwb3J0UGF0aCwgY3R4KVxufVxuXG5mdW5jdGlvbiByZXNvbHZlUGFja2FnZUV4cG9ydHMoXG4gIG5vZGVNb2R1bGVzUGF0aDogc3RyaW5nLFxuICBwYWNrYWdlSnNvbjogUGFja2FnZUpzb24sXG4gIHJlbWFpbmluZ1BhdGg6IHN0cmluZyxcbiAgY3R4OiBOb2RlUmVzb2x1dGlvbkNvbnRleHQsXG4pOiBzdHJpbmcgfCBudWxsIHtcbiAgaWYgKCFwYWNrYWdlSnNvbi5leHBvcnRzKSByZXR1cm4gbnVsbFxuXG4gIC8vIEhhbmRsZSBkZWZhdWx0IGV4cG9ydCBjb25kaXRpb25cbiAgY29uc3QgZGVmYXVsdEV4cG9ydCA9IHBhY2thZ2VKc29uLmV4cG9ydHNbXCIuXCJdXG4gIGlmIChyZW1haW5pbmdQYXRoID09PSBcIlwiICYmIGRlZmF1bHRFeHBvcnQpIHtcbiAgICBpZiAodHlwZW9mIGRlZmF1bHRFeHBvcnQgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgIGNvbnN0IHJlc29sdmVkID0gcmVzb2x2ZUV4cG9ydFBhdGgobm9kZU1vZHVsZXNQYXRoLCBkZWZhdWx0RXhwb3J0LCBjdHgpXG4gICAgICBpZiAocmVzb2x2ZWQpIHJldHVybiByZXNvbHZlZFxuICAgIH1cbiAgfVxuXG4gIC8vIEhhbmRsZSBzdWJwYXRoIGV4cG9ydHNcbiAgY29uc3Qgc3VicGF0aEV4cG9ydCA9IHJlbWFpbmluZ1BhdGhcbiAgICA/IHBhY2thZ2VKc29uLmV4cG9ydHNbYC4vJHtyZW1haW5pbmdQYXRofWBdXG4gICAgOiBudWxsXG4gIGlmIChzdWJwYXRoRXhwb3J0ICYmIHR5cGVvZiBzdWJwYXRoRXhwb3J0ID09PSBcInN0cmluZ1wiKSB7XG4gICAgY29uc3QgcmVzb2x2ZWQgPSByZXNvbHZlRXhwb3J0UGF0aChub2RlTW9kdWxlc1BhdGgsIHN1YnBhdGhFeHBvcnQsIGN0eClcbiAgICBpZiAocmVzb2x2ZWQpIHJldHVybiByZXNvbHZlZFxuICB9XG5cbiAgLy8gSGFuZGxlIGNvbmRpdGlvbmFsIGV4cG9ydHNcbiAgY29uc3QgaW1wb3J0RXhwb3J0ID0gcGFja2FnZUpzb24uZXhwb3J0c1tcImltcG9ydFwiXVxuICBpZiAoXG4gICAgcmVtYWluaW5nUGF0aCA9PT0gXCJcIiAmJlxuICAgIGltcG9ydEV4cG9ydCAmJlxuICAgIHR5cGVvZiBpbXBvcnRFeHBvcnQgPT09IFwic3RyaW5nXCJcbiAgKSB7XG4gICAgY29uc3QgcmVzb2x2ZWQgPSByZXNvbHZlRXhwb3J0UGF0aChub2RlTW9kdWxlc1BhdGgsIGltcG9ydEV4cG9ydCwgY3R4KVxuICAgIGlmIChyZXNvbHZlZCkgcmV0dXJuIHJlc29sdmVkXG4gIH1cblxuICByZXR1cm4gbnVsbFxufVxuXG5mdW5jdGlvbiByZXNvbHZlUGFja2FnZUVudHJ5UG9pbnQoXG4gIG5vZGVNb2R1bGVzUGF0aDogc3RyaW5nLFxuICBwYWNrYWdlSnNvbjogUGFja2FnZUpzb24sXG4gIGN0eDogTm9kZVJlc29sdXRpb25Db250ZXh0LFxuKTogc3RyaW5nIHwgbnVsbCB7XG4gIGNvbnN0IGVudHJ5UG9pbnQgPSBwYWNrYWdlSnNvbi5tb2R1bGUgfHwgcGFja2FnZUpzb24ubWFpbiB8fCBcImluZGV4LmpzXCJcbiAgY29uc3QgZnVsbFBhdGggPSBgJHtub2RlTW9kdWxlc1BhdGh9LyR7ZW50cnlQb2ludH1gXG4gIHJldHVybiB0cnlSZXNvbHZlV2l0aEV4dGVuc2lvbnMoZnVsbFBhdGgsIGN0eClcbn1cblxuZnVuY3Rpb24gcmVzb2x2ZVJlbWFpbmluZ1BhdGgoXG4gIG5vZGVNb2R1bGVzUGF0aDogc3RyaW5nLFxuICByZW1haW5pbmdQYXRoOiBzdHJpbmcsXG4gIGN0eDogTm9kZVJlc29sdXRpb25Db250ZXh0LFxuKTogc3RyaW5nIHwgbnVsbCB7XG4gIGlmICghcmVtYWluaW5nUGF0aCkge1xuICAgIC8vIFRyeSBpbmRleCBmaWxlcyBpbiB0aGUgbW9kdWxlIHJvb3RcbiAgICBmb3IgKGNvbnN0IGV4dCBvZiBjdHguZXh0ZW5zaW9ucykge1xuICAgICAgY29uc3QgaW5kZXhQYXRoID0gYCR7bm9kZU1vZHVsZXNQYXRofS9pbmRleCR7ZXh0fWBcbiAgICAgIGlmIChjdHguZnNNYXBbaW5kZXhQYXRoXSkgcmV0dXJuIGluZGV4UGF0aFxuICAgIH1cbiAgICByZXR1cm4gbnVsbFxuICB9XG5cbiAgY29uc3QgZnVsbFBhdGggPSBgJHtub2RlTW9kdWxlc1BhdGh9LyR7cmVtYWluaW5nUGF0aH1gXG4gIGNvbnN0IGRpcmVjdE1hdGNoID0gdHJ5UmVzb2x2ZVdpdGhFeHRlbnNpb25zKGZ1bGxQYXRoLCBjdHgpXG4gIGlmIChkaXJlY3RNYXRjaCkgcmV0dXJuIGRpcmVjdE1hdGNoXG5cbiAgLy8gVHJ5IGluZGV4IGZpbGVzXG4gIGZvciAoY29uc3QgZXh0IG9mIGN0eC5leHRlbnNpb25zKSB7XG4gICAgY29uc3QgaW5kZXhQYXRoID0gYCR7ZnVsbFBhdGh9L2luZGV4JHtleHR9YFxuICAgIGlmIChjdHguZnNNYXBbaW5kZXhQYXRoXSkgcmV0dXJuIGluZGV4UGF0aFxuICB9XG4gIHJldHVybiBudWxsXG59XG5cbmZ1bmN0aW9uIHJlc29sdmVOb2RlTW9kdWxlSW5QYXRoKFxuICBzZWFyY2hQYXRoOiBzdHJpbmcsXG4gIGN0eDogTm9kZVJlc29sdXRpb25Db250ZXh0LFxuKTogc3RyaW5nIHwgbnVsbCB7XG4gIGNvbnN0IG1vZHVsZVBhcnRzID0gY3R4Lm1vZHVsZVBhdGguc3BsaXQoXCIvXCIpXG4gIGNvbnN0IHNjb3BlID0gbW9kdWxlUGFydHNbMF0uc3RhcnRzV2l0aChcIkBcIilcbiAgICA/IG1vZHVsZVBhcnRzLnNsaWNlKDAsIDIpLmpvaW4oXCIvXCIpXG4gICAgOiBtb2R1bGVQYXJ0c1swXVxuICBjb25zdCByZW1haW5pbmdQYXRoID0gbW9kdWxlUGFydHMuc2xpY2Uoc2NvcGUuaW5jbHVkZXMoXCIvXCIpID8gMiA6IDEpLmpvaW4oXCIvXCIpXG4gIGNvbnN0IG5vZGVNb2R1bGVzUGF0aCA9IGAke3NlYXJjaFBhdGggPT0gXCIuXCIgPyBcIlwiIDogYCR7c2VhcmNoUGF0aH0vYH1ub2RlX21vZHVsZXMvJHtzY29wZX1gXG5cbiAgLy8gVHJ5IHRvIGZpbmQgcGFja2FnZS5qc29uXG4gIGNvbnN0IHBhY2thZ2VKc29uID0gZmluZFBhY2thZ2VKc29uKG5vZGVNb2R1bGVzUGF0aCwgY3R4KVxuICBpZiAocGFja2FnZUpzb24pIHtcbiAgICAvLyBUcnkgcmVzb2x2aW5nIHRocm91Z2ggZXhwb3J0cyBmaWVsZFxuICAgIGNvbnN0IGV4cG9ydHNSZXNvbHV0aW9uID0gcmVzb2x2ZVBhY2thZ2VFeHBvcnRzKFxuICAgICAgbm9kZU1vZHVsZXNQYXRoLFxuICAgICAgcGFja2FnZUpzb24sXG4gICAgICByZW1haW5pbmdQYXRoLFxuICAgICAgY3R4LFxuICAgIClcbiAgICBpZiAoZXhwb3J0c1Jlc29sdXRpb24pIHJldHVybiBleHBvcnRzUmVzb2x1dGlvblxuXG4gICAgLy8gVHJ5IHJlc29sdmluZyB0aHJvdWdoIG1haW4vbW9kdWxlIGZpZWxkc1xuICAgIGNvbnN0IGVudHJ5UG9pbnRSZXNvbHV0aW9uID0gcmVzb2x2ZVBhY2thZ2VFbnRyeVBvaW50KFxuICAgICAgbm9kZU1vZHVsZXNQYXRoLFxuICAgICAgcGFja2FnZUpzb24sXG4gICAgICBjdHgsXG4gICAgKVxuICAgIGlmIChlbnRyeVBvaW50UmVzb2x1dGlvbikgcmV0dXJuIGVudHJ5UG9pbnRSZXNvbHV0aW9uXG4gIH1cblxuICAvLyBUcnkgcmVzb2x2aW5nIHJlbWFpbmluZyBwYXRoXG4gIGNvbnN0IHJlbWFpbmluZ1BhdGhSZXNvbHV0aW9uID0gcmVzb2x2ZVJlbWFpbmluZ1BhdGgoXG4gICAgbm9kZU1vZHVsZXNQYXRoLFxuICAgIHJlbWFpbmluZ1BhdGgsXG4gICAgY3R4LFxuICApXG4gIGlmIChyZW1haW5pbmdQYXRoUmVzb2x1dGlvbikgcmV0dXJuIHJlbWFpbmluZ1BhdGhSZXNvbHV0aW9uXG5cbiAgLy8gSWYgbm90IGZvdW5kIGFuZCB3ZSBoYXZlIGEgcGFyZW50IGRpcmVjdG9yeSwgdHJ5IHRoZXJlXG4gIGNvbnN0IHBhcmVudFBhdGggPSBkaXJuYW1lKHNlYXJjaFBhdGgpXG4gIGlmIChwYXJlbnRQYXRoICYmIHBhcmVudFBhdGggIT09IHNlYXJjaFBhdGgpIHtcbiAgICByZXR1cm4gcmVzb2x2ZU5vZGVNb2R1bGVJblBhdGgocGFyZW50UGF0aCwgY3R4KVxuICB9XG5cbiAgcmV0dXJuIG51bGxcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVOb2RlTW9kdWxlKFxuICBtb2R1bGVQYXRoOiBzdHJpbmcsXG4gIGZzTWFwOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+LFxuICBiYXNlUGF0aDogc3RyaW5nLFxuKTogc3RyaW5nIHwgbnVsbCB7XG4gIGNvbnN0IGN0eCA9IGNyZWF0ZUNvbnRleHQobW9kdWxlUGF0aCwgZnNNYXAsIGJhc2VQYXRoKVxuICByZXR1cm4gcmVzb2x2ZU5vZGVNb2R1bGVJblBhdGgoY3R4LmJhc2VQYXRoLCBjdHgpXG59XG4iLCAiaW1wb3J0IHsgcmVzb2x2ZU5vZGVNb2R1bGUgfSBmcm9tIFwibGliL3V0aWxzL3Jlc29sdmUtbm9kZS1tb2R1bGVcIlxuaW1wb3J0IHR5cGUgeyBFeGVjdXRpb25Db250ZXh0IH0gZnJvbSBcIi4vZXhlY3V0aW9uLWNvbnRleHRcIlxuaW1wb3J0IHsgaW1wb3J0TG9jYWxGaWxlIH0gZnJvbSBcIi4vaW1wb3J0LWxvY2FsLWZpbGVcIlxuXG5leHBvcnQgY29uc3QgaW1wb3J0Tm9kZU1vZHVsZSA9IGFzeW5jIChcbiAgaW1wb3J0TmFtZTogc3RyaW5nLFxuICBjdHg6IEV4ZWN1dGlvbkNvbnRleHQsXG4gIGRlcHRoID0gMCxcbikgPT4ge1xuICBjb25zdCB7IHByZVN1cHBsaWVkSW1wb3J0cyB9ID0gY3R4XG5cbiAgaWYgKHByZVN1cHBsaWVkSW1wb3J0c1tpbXBvcnROYW1lXSkge1xuICAgIHJldHVyblxuICB9XG5cbiAgY29uc3QgcmVzb2x2ZWROb2RlTW9kdWxlUGF0aCA9IHJlc29sdmVOb2RlTW9kdWxlKGltcG9ydE5hbWUsIGN0eC5mc01hcCwgXCJcIilcblxuICBpZiAoIXJlc29sdmVkTm9kZU1vZHVsZVBhdGgpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYE5vZGUgbW9kdWxlIFwiJHtpbXBvcnROYW1lfVwiIG5vdCBmb3VuZGApXG4gIH1cblxuICAvLyBVc2UgaW1wb3J0TG9jYWxGaWxlIHRvIGhhbmRsZSB0aGUgbm9kZSBtb2R1bGVcbiAgYXdhaXQgaW1wb3J0TG9jYWxGaWxlKHJlc29sdmVkTm9kZU1vZHVsZVBhdGgsIGN0eCwgZGVwdGgpXG5cbiAgLy8gTWFwIHRoZSBvcmlnaW5hbCBpbXBvcnQgbmFtZSB0byB0aGUgcmVzb2x2ZWQgbW9kdWxlJ3MgZXhwb3J0c1xuICBwcmVTdXBwbGllZEltcG9ydHNbaW1wb3J0TmFtZV0gPSBwcmVTdXBwbGllZEltcG9ydHNbcmVzb2x2ZWROb2RlTW9kdWxlUGF0aF1cblxuICAvLyBNYXAgd2l0aG91dCBub2RlX21vZHVsZXMgcHJlZml4IGZvciBkaXJlY3QgaW1wb3J0c1xuICBjb25zdCB1bnByZWZpeGVkUGF0aCA9IHJlc29sdmVkTm9kZU1vZHVsZVBhdGgucmVwbGFjZSgvXm5vZGVfbW9kdWxlc1xcLy8sIFwiXCIpXG4gIHByZVN1cHBsaWVkSW1wb3J0c1t1bnByZWZpeGVkUGF0aF0gPVxuICAgIHByZVN1cHBsaWVkSW1wb3J0c1tyZXNvbHZlZE5vZGVNb2R1bGVQYXRoXVxuXG4gIC8vIEhhbmRsZSBpbmRleCBmaWxlcyBzcGVjaWFsbHlcbiAgaWYgKFxuICAgIHJlc29sdmVkTm9kZU1vZHVsZVBhdGguZW5kc1dpdGgoXCIvaW5kZXgudHN4XCIpIHx8XG4gICAgcmVzb2x2ZWROb2RlTW9kdWxlUGF0aC5lbmRzV2l0aChcIi9pbmRleC50c1wiKSB8fFxuICAgIHJlc29sdmVkTm9kZU1vZHVsZVBhdGguZW5kc1dpdGgoXCIvaW5kZXguanNcIilcbiAgKSB7XG4gICAgY29uc3QgZGlyUGF0aCA9IHJlc29sdmVkTm9kZU1vZHVsZVBhdGgucmVwbGFjZSgvXFwvaW5kZXhcXC4odHN4P3xqcykkLywgXCJcIilcbiAgICBjb25zdCB1bnByZWZpeGVkRGlyUGF0aCA9IGRpclBhdGgucmVwbGFjZSgvXm5vZGVfbW9kdWxlc1xcLy8sIFwiXCIpXG4gICAgcHJlU3VwcGxpZWRJbXBvcnRzW3VucHJlZml4ZWREaXJQYXRoXSA9XG4gICAgICBwcmVTdXBwbGllZEltcG9ydHNbcmVzb2x2ZWROb2RlTW9kdWxlUGF0aF1cblxuICAgIC8vIEhhbmRsZSBzY29wZWQgcGFja2FnZXNcbiAgICBpZiAodW5wcmVmaXhlZERpclBhdGguc3RhcnRzV2l0aChcIkBcIikpIHtcbiAgICAgIGNvbnN0IHNjb3BlUGFydHMgPSB1bnByZWZpeGVkRGlyUGF0aC5zcGxpdChcIi9cIilcbiAgICAgIGlmIChzY29wZVBhcnRzLmxlbmd0aCA+PSAyKSB7XG4gICAgICAgIGNvbnN0IHNjb3BlZE5hbWUgPSBgJHtzY29wZVBhcnRzWzBdfS8ke3Njb3BlUGFydHNbMV19YFxuICAgICAgICBwcmVTdXBwbGllZEltcG9ydHNbc2NvcGVkTmFtZV0gPVxuICAgICAgICAgIHByZVN1cHBsaWVkSW1wb3J0c1tyZXNvbHZlZE5vZGVNb2R1bGVQYXRoXVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuIiwgImltcG9ydCB7IHJlc29sdmVGaWxlUGF0aCwgcmVzb2x2ZUZpbGVQYXRoT3JUaHJvdyB9IGZyb20gXCIuL3Jlc29sdmVGaWxlUGF0aFwiXG5cbmV4cG9ydCBjb25zdCBzZXR1cERlZmF1bHRFbnRyeXBvaW50SWZOZWVkZWQgPSAob3B0czoge1xuICBlbnRyeXBvaW50Pzogc3RyaW5nXG4gIGZzTWFwOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+XG4gIG1haW5Db21wb25lbnRQYXRoPzogc3RyaW5nXG4gIG1haW5Db21wb25lbnROYW1lPzogc3RyaW5nXG4gIG5hbWU/OiBzdHJpbmdcbiAgbWFpbkNvbXBvbmVudFByb3BzPzogUmVjb3JkPHN0cmluZywgYW55PlxufSkgPT4ge1xuICBpZiAoIW9wdHMuZW50cnlwb2ludCAmJiAhb3B0cy5tYWluQ29tcG9uZW50UGF0aCkge1xuICAgIGlmIChcImluZGV4LnRzeFwiIGluIG9wdHMuZnNNYXApIHtcbiAgICAgIG9wdHMubWFpbkNvbXBvbmVudFBhdGggPSBcImluZGV4LnRzeFwiXG4gICAgfSBlbHNlIGlmIChcImluZGV4LnRzXCIgaW4gb3B0cy5mc01hcCkge1xuICAgICAgb3B0cy5tYWluQ29tcG9uZW50UGF0aCA9IFwiaW5kZXgudHNcIlxuICAgIH0gZWxzZSBpZiAoXG4gICAgICBPYmplY3Qua2V5cyhvcHRzLmZzTWFwKS5maWx0ZXIoKGspID0+IGsuZW5kc1dpdGgoXCIudHN4XCIpKS5sZW5ndGggPT09IDFcbiAgICApIHtcbiAgICAgIG9wdHMubWFpbkNvbXBvbmVudFBhdGggPSBPYmplY3Qua2V5cyhvcHRzLmZzTWFwKVswXVxuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIFwiRWl0aGVyIGVudHJ5cG9pbnQgb3IgbWFpbkNvbXBvbmVudFBhdGggbXVzdCBiZSBwcm92aWRlZCAobm8gaW5kZXggZmlsZSwgY291bGQgbm90IGluZmVyIGVudHJ5cG9pbnQpXCIsXG4gICAgICApXG4gICAgfVxuICB9XG5cbiAgaWYgKCFvcHRzLmVudHJ5cG9pbnQgJiYgb3B0cy5tYWluQ29tcG9uZW50UGF0aCkge1xuICAgIG9wdHMuZW50cnlwb2ludCA9IFwiZW50cnlwb2ludC50c3hcIlxuICAgIGNvbnN0IG1haW5Db21wb25lbnRDb2RlID1cbiAgICAgIG9wdHMuZnNNYXBbcmVzb2x2ZUZpbGVQYXRoT3JUaHJvdyhvcHRzLm1haW5Db21wb25lbnRQYXRoLCBvcHRzLmZzTWFwKV1cbiAgICBpZiAoIW1haW5Db21wb25lbnRDb2RlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBNYWluIGNvbXBvbmVudCBwYXRoIFwiJHtvcHRzLm1haW5Db21wb25lbnRQYXRofVwiIG5vdCBmb3VuZCBpbiBmc01hcC4gQXZhaWxhYmxlIHBhdGhzOiAke09iamVjdC5rZXlzKG9wdHMuZnNNYXApLmpvaW4oXCIsIFwiKX1gLFxuICAgICAgKVxuICAgIH1cbiAgICBvcHRzLmZzTWFwW29wdHMuZW50cnlwb2ludF0gPSBgXG4gICAgIGltcG9ydCAqIGFzIFVzZXJDb21wb25lbnRzIGZyb20gXCIuLyR7b3B0cy5tYWluQ29tcG9uZW50UGF0aH1cIjtcbiAgICAgICAgICBcbiAgICAgIGNvbnN0IGhhc0JvYXJkID0gJHttYWluQ29tcG9uZW50Q29kZS5pbmNsdWRlcyhcIjxib2FyZFwiKS50b1N0cmluZygpfTtcbiAgICAgICR7XG4gICAgICAgIG9wdHMubWFpbkNvbXBvbmVudE5hbWVcbiAgICAgICAgICA/IGBcbiAgICAgICAgY29uc3QgQ29tcG9uZW50VG9SZW5kZXIgPSBVc2VyQ29tcG9uZW50c1tcIiR7b3B0cy5tYWluQ29tcG9uZW50TmFtZX1cIl1cbiAgICAgICAgYFxuICAgICAgICAgIDogYGNvbnN0IENvbXBvbmVudFRvUmVuZGVyID0gT2JqZWN0LmVudHJpZXMoVXNlckNvbXBvbmVudHMpXG4gICAgICAgIC5maWx0ZXIoKFtuYW1lXSkgPT4gIW5hbWUuc3RhcnRzV2l0aChcInVzZVwiKSlcbiAgICAgICAgLm1hcCgoW18sIGNvbXBvbmVudF0pID0+IGNvbXBvbmVudClbMF0gfHwgKCgpID0+IG51bGwpO2BcbiAgICAgIH1cblxuICAgICAgY2lyY3VpdC5hZGQoXG4gICAgICAgIGhhc0JvYXJkID8gKFxuICAgICAgICAgIDxDb21wb25lbnRUb1JlbmRlciAke29wdHMubWFpbkNvbXBvbmVudFByb3BzID8gYHsuLi4ke0pTT04uc3RyaW5naWZ5KG9wdHMubWFpbkNvbXBvbmVudFByb3BzLCBudWxsLCAyKX19YCA6IFwiXCJ9IC8+XG4gICAgICAgICkgOiAoXG4gICAgICAgICAgPGJvYXJkPlxuICAgICAgICAgICAgPENvbXBvbmVudFRvUmVuZGVyIG5hbWU9XCJVMVwiICR7b3B0cy5tYWluQ29tcG9uZW50UHJvcHMgPyBgey4uLiR7SlNPTi5zdHJpbmdpZnkob3B0cy5tYWluQ29tcG9uZW50UHJvcHMsIG51bGwsIDIpfX1gIDogXCJcIn0gLz5cbiAgICAgICAgICA8L2JvYXJkPlxuICAgICAgICApXG4gICAgICApO1xuYFxuICB9XG5cbiAgaWYgKCFvcHRzLm5hbWUgJiYgb3B0cy5tYWluQ29tcG9uZW50TmFtZSkge1xuICAgIG9wdHMubmFtZSA9IG9wdHMubWFpbkNvbXBvbmVudE5hbWVcbiAgfVxufVxuIiwgImltcG9ydCB7IENpcmN1aXRSdW5uZXIgfSBmcm9tIFwiLi9DaXJjdWl0UnVubmVyXCJcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJ1blRzY2lyY3VpdENvZGUoXG4gIGZpbGVzeXN0ZW1PckNvZGVTdHJpbmc6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gfCBzdHJpbmcsXG4gIG9wdHM/OiBPbWl0PFBhcmFtZXRlcnM8Q2lyY3VpdFJ1bm5lcltcImV4ZWN1dGVXaXRoRnNNYXBcIl0+WzBdLCBcImZzTWFwXCI+LFxuKSB7XG4gIGlmIChcbiAgICB0eXBlb2YgZmlsZXN5c3RlbU9yQ29kZVN0cmluZyA9PT0gXCJzdHJpbmdcIiAmJlxuICAgICFmaWxlc3lzdGVtT3JDb2RlU3RyaW5nLmluY2x1ZGVzKFwiZXhwb3J0XCIpXG4gICkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBUaGUgXCJleHBvcnRcIiBrZXl3b3JkIHdhc24ndCBmb3VuZCBpbiB5b3VyIHByb3ZpZGVkIGNvZGUuIFlvdSBuZWVkIHRvIGV4cG9ydCBhIGNvbXBvbmVudCBpbiB5b3VyIGNvZGUsIGUuZy5cXG5cXG5leHBvcnQgZGVmYXVsdCAoKSA9PiAoXFxuICA8cmVzaXN0b3IgbmFtZT1cIlIxXCIgcmVzaXN0YW5jZT1cIjFrXCIgLz5cXG4pYCxcbiAgICApXG4gIH1cbiAgY29uc3QgZmlsZXN5c3RlbSA9XG4gICAgdHlwZW9mIGZpbGVzeXN0ZW1PckNvZGVTdHJpbmcgPT09IFwic3RyaW5nXCJcbiAgICAgID8geyBcInVzZXItY29kZS50c3hcIjogZmlsZXN5c3RlbU9yQ29kZVN0cmluZyB9XG4gICAgICA6IGZpbGVzeXN0ZW1PckNvZGVTdHJpbmdcblxuICBjb25zdCBjaXJjdWl0UnVubmVyID0gbmV3IENpcmN1aXRSdW5uZXIoKVxuXG4gIGF3YWl0IGNpcmN1aXRSdW5uZXIuZXhlY3V0ZVdpdGhGc01hcCh7XG4gICAgZnNNYXA6IGZpbGVzeXN0ZW0sXG4gICAgLi4ub3B0cyxcbiAgfSlcblxuICBhd2FpdCBjaXJjdWl0UnVubmVyLnJlbmRlclVudGlsU2V0dGxlZCgpXG5cbiAgcmV0dXJuIGF3YWl0IGNpcmN1aXRSdW5uZXIuZ2V0Q2lyY3VpdEpzb24oKVxufVxuIiwgImltcG9ydCB7IHJ1blRzY2lyY3VpdENvZGUgfSBmcm9tIFwiLi9ydW5Uc2NpcmN1aXRDb2RlXCJcblxuZXhwb3J0IGNvbnN0IHJ1blRzY2lyY3VpdE1vZHVsZSA9IGFzeW5jIChcbiAgbW9kdWxlOiBzdHJpbmcsXG4gIG9wdHM6IHsgcHJvcHM/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+OyBleHBvcnROYW1lPzogc3RyaW5nIH0gPSB7fSxcbikgPT4ge1xuICBpZiAoIW1vZHVsZS5zdGFydHNXaXRoKFwiQFwiKSkge1xuICAgIG1vZHVsZSA9IGBAdHNjaS8ke21vZHVsZS5yZXBsYWNlKC9cXC8vLCBcIi5cIil9YFxuICB9XG4gIGNvbnN0IGNpcmN1aXRKc29uID0gYXdhaXQgcnVuVHNjaXJjdWl0Q29kZShcbiAgICB7XG4gICAgICAvLyBUT0RPIGhhbmRsZSBleHBvcnRzIHRoYXQgYXJlIG5vdCB0aGUgZGVmYXVsdCBleHBvcnQgYnkgc2Nhbm5pbmdcbiAgICAgIC8vIG90aGVyRXhwb3J0cyBmb3IgY29tcG9uZW50c1xuICAgICAgXCJ1c2VyLWNvZGUudHN4XCI6IGBcbiAgICBpbXBvcnQgTW9kdWxlLCAqIGFzIG90aGVyRXhwb3J0cyBmcm9tIFwiJHttb2R1bGV9XCI7XG5cbiAgICBsZXQgZXhwb3J0TmFtZSA9IFwiJHtvcHRzLmV4cG9ydE5hbWUgPz8gXCJcIn1cIlxuXG4gICAgaWYgKCghTW9kdWxlIHx8IHR5cGVvZiBNb2R1bGUgIT09IFwiZnVuY3Rpb25cIikgJiYgIUJvb2xlYW4oZXhwb3J0TmFtZSkpIHtcbiAgICAgIGV4cG9ydE5hbWUgPSBPYmplY3Qua2V5cyhvdGhlckV4cG9ydHMpLmZpbHRlcihrZXkgPT4ga2V5WzBdID09PSBrZXlbMF0udG9VcHBlckNhc2UoKSAmJiB0eXBlb2Ygb3RoZXJFeHBvcnRzW2tleV0gPT09IFwiZnVuY3Rpb25cIilbMF1cbiAgICB9XG5cbiAgICBjb25zdCBkZWZhdWx0RXhwb3J0ID0gZXhwb3J0TmFtZSA/IG90aGVyRXhwb3J0c1tleHBvcnROYW1lXSA6IE1vZHVsZVxuXG4gICAgaWYgKCFkZWZhdWx0RXhwb3J0KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXFxgTm8gZXhwb3J0IGZvdW5kIGZvciBtb2R1bGUgXCJcXCR7bW9kdWxlfVwiICh0cmllZCBcIlxcJHtleHBvcnROYW1lID8/IFwiZGVmYXVsdFwifVwiKVxcYClcbiAgICB9XG5cbiAgICBleHBvcnQgZGVmYXVsdCBkZWZhdWx0RXhwb3J0O1xuICAgIGAsXG4gICAgfSxcbiAgICB7XG4gICAgICBtYWluQ29tcG9uZW50UHJvcHM6IG9wdHMucHJvcHMsXG4gICAgfSxcbiAgKVxuICByZXR1cm4gY2lyY3VpdEpzb25cbn1cbiIsICJpbXBvcnQgKiBhcyBDb21saW5rIGZyb20gXCJjb21saW5rXCJcbmV4cG9ydCAqIGZyb20gXCIuL3V0aWxzL2luZGV4XCJcbmltcG9ydCB0eXBlIHtcbiAgSW50ZXJuYWxXZWJXb3JrZXJBcGksXG4gIFdlYldvcmtlckNvbmZpZ3VyYXRpb24sXG4gIENpcmN1aXRXZWJXb3JrZXIsXG59IGZyb20gXCIuL3NoYXJlZC90eXBlc1wiXG5pbXBvcnQgdHlwZSB7IFJvb3RDaXJjdWl0RXZlbnROYW1lIH0gZnJvbSBcIkB0c2NpcmN1aXQvY29yZVwiXG5cbmV4cG9ydCB0eXBlIHsgQ2lyY3VpdFdlYldvcmtlciwgV2ViV29ya2VyQ29uZmlndXJhdGlvbiB9XG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgaW50ZXJmYWNlIFdpbmRvdyB7XG4gICAgVFNDSVJDVUlUX0dMT0JBTF9DSVJDVUlUX1dPUktFUjogQ2lyY3VpdFdlYldvcmtlciB8IHVuZGVmaW5lZFxuICB9XG4gIHZhciBUU0NJUkNVSVRfR0xPQkFMX0NJUkNVSVRfV09SS0VSOiBDaXJjdWl0V2ViV29ya2VyIHwgdW5kZWZpbmVkXG59XG5cbmV4cG9ydCBjb25zdCBjcmVhdGVDaXJjdWl0V2ViV29ya2VyID0gYXN5bmMgKFxuICBjb25maWd1cmF0aW9uOiBQYXJ0aWFsPFdlYldvcmtlckNvbmZpZ3VyYXRpb24+LFxuKTogUHJvbWlzZTxDaXJjdWl0V2ViV29ya2VyPiA9PiB7XG4gIC8vIEtpbGwgZXhpc3RpbmcgZ2xvYmFsIHdvcmtlciBpbnN0YW5jZSBpZiBwcmVzZW50XG4gIGNvbnN0IGV4aXN0aW5nV29ya2VyID0gZ2xvYmFsVGhpcy5UU0NJUkNVSVRfR0xPQkFMX0NJUkNVSVRfV09SS0VSXG4gIGlmIChleGlzdGluZ1dvcmtlciAmJiB0eXBlb2YgZXhpc3RpbmdXb3JrZXIua2lsbCA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgaWYgKGNvbmZpZ3VyYXRpb24udmVyYm9zZSkge1xuICAgICAgY29uc29sZS5sb2coXCJbV29ya2VyXSBLaWxsaW5nIHByZXZpb3VzIGdsb2JhbCB3b3JrZXIgaW5zdGFuY2UuLi5cIilcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGV4aXN0aW5nV29ya2VyLmtpbGwoKVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGlmIChjb25maWd1cmF0aW9uLnZlcmJvc2UpIHtcbiAgICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgIFwiW1dvcmtlcl0gRXJyb3Iga2lsbGluZyBwcmV2aW91cyBnbG9iYWwgd29ya2VyIGluc3RhbmNlOlwiLFxuICAgICAgICAgIGUsXG4gICAgICAgIClcbiAgICAgIH1cbiAgICAgIC8vIEVuc3VyZSB0aGUga2V5IGlzIGNsZWFyZWQgZXZlbiBpZiBraWxsIHRocm93cyBhbiBlcnJvclxuICAgICAgaWYgKGdsb2JhbFRoaXMuVFNDSVJDVUlUX0dMT0JBTF9DSVJDVUlUX1dPUktFUiA9PT0gZXhpc3RpbmdXb3JrZXIpIHtcbiAgICAgICAgZ2xvYmFsVGhpcy5UU0NJUkNVSVRfR0xPQkFMX0NJUkNVSVRfV09SS0VSID0gdW5kZWZpbmVkXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgaWYgKGNvbmZpZ3VyYXRpb24udmVyYm9zZSkge1xuICAgIGNvbnNvbGUubG9nKFxuICAgICAgXCJbV29ya2VyXSBDcmVhdGluZyBjaXJjdWl0IHdlYiB3b3JrZXIgd2l0aCBjb25maWc6XCIsXG4gICAgICBjb25maWd1cmF0aW9uLFxuICAgIClcbiAgfVxuXG4gIGxldCB3b3JrZXJCbG9iVXJsID1cbiAgICBjb25maWd1cmF0aW9uLndlYldvcmtlckJsb2JVcmwgPz8gY29uZmlndXJhdGlvbi53ZWJXb3JrZXJVcmxcblxuICBpZiAoIXdvcmtlckJsb2JVcmwpIHtcbiAgICBjb25zdCBjZG5VcmwgPSBgaHR0cHM6Ly9jZG4uanNkZWxpdnIubmV0L25wbS9AdHNjaXJjdWl0L2V2YWxAJHtjb25maWd1cmF0aW9uLmV2YWxWZXJzaW9uID8/IFwibGF0ZXN0XCJ9L2Rpc3Qvd2Vid29ya2VyL2VudHJ5cG9pbnQuanNgXG5cbiAgICBjb25zdCB3b3JrZXJCbG9iID0gYXdhaXQgZmV0Y2goY2RuVXJsKS50aGVuKChyZXMpID0+IHJlcy5ibG9iKCkpXG4gICAgd29ya2VyQmxvYlVybCA9IFVSTC5jcmVhdGVPYmplY3RVUkwod29ya2VyQmxvYilcbiAgfVxuXG4gIGNvbnN0IHJhd1dvcmtlciA9IG5ldyBXb3JrZXIod29ya2VyQmxvYlVybCwgeyB0eXBlOiBcIm1vZHVsZVwiIH0pXG4gIGNvbnN0IGNvbWxpbmtXb3JrZXIgPSBDb21saW5rLndyYXA8SW50ZXJuYWxXZWJXb3JrZXJBcGk+KHJhd1dvcmtlcilcblxuICBpZiAoY29uZmlndXJhdGlvbi5zbmlwcGV0c0FwaUJhc2VVcmwpIHtcbiAgICBhd2FpdCBjb21saW5rV29ya2VyLnNldFNuaXBwZXRzQXBpQmFzZVVybChjb25maWd1cmF0aW9uLnNuaXBwZXRzQXBpQmFzZVVybClcbiAgfVxuXG4gIGxldCBpc1Rlcm1pbmF0ZWQgPSBmYWxzZVxuXG4gIC8vIENyZWF0ZSBhIHdyYXBwZXIgdGhhdCBoYW5kbGVzIGV2ZW50cyBkaXJlY3RseSB0aHJvdWdoIGNpcmN1aXQgaW5zdGFuY2VcbiAgY29uc3Qgd3JhcHBlcjogQ2lyY3VpdFdlYldvcmtlciA9IHtcbiAgICBjbGVhckV2ZW50TGlzdGVuZXJzOiBjb21saW5rV29ya2VyLmNsZWFyRXZlbnRMaXN0ZW5lcnMuYmluZChjb21saW5rV29ya2VyKSxcbiAgICBleGVjdXRlOiBhc3luYyAoLi4uYXJncykgPT4ge1xuICAgICAgaWYgKGlzVGVybWluYXRlZCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDaXJjdWl0V2ViV29ya2VyIHdhcyB0ZXJtaW5hdGVkLCBjYW4ndCBleGVjdXRlXCIpXG4gICAgICB9XG4gICAgICByZXR1cm4gY29tbGlua1dvcmtlci5leGVjdXRlLmJpbmQoY29tbGlua1dvcmtlcikoLi4uYXJncylcbiAgICB9LFxuICAgIGV4ZWN1dGVXaXRoRnNNYXA6IGFzeW5jICguLi5hcmdzKSA9PiB7XG4gICAgICBpZiAoaXNUZXJtaW5hdGVkKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBcIkNpcmN1aXRXZWJXb3JrZXIgd2FzIHRlcm1pbmF0ZWQsIGNhbid0IGV4ZWN1dGVXaXRoRnNNYXBcIixcbiAgICAgICAgKVxuICAgICAgfVxuICAgICAgcmV0dXJuIGNvbWxpbmtXb3JrZXIuZXhlY3V0ZVdpdGhGc01hcC5iaW5kKGNvbWxpbmtXb3JrZXIpKC4uLmFyZ3MpXG4gICAgfSxcbiAgICByZW5kZXJVbnRpbFNldHRsZWQ6IGNvbWxpbmtXb3JrZXIucmVuZGVyVW50aWxTZXR0bGVkLmJpbmQoY29tbGlua1dvcmtlciksXG4gICAgZ2V0Q2lyY3VpdEpzb246IGNvbWxpbmtXb3JrZXIuZ2V0Q2lyY3VpdEpzb24uYmluZChjb21saW5rV29ya2VyKSxcbiAgICBvbjogKGV2ZW50OiBzdHJpbmcsIGNhbGxiYWNrOiAoLi4uYXJnczogYW55W10pID0+IHZvaWQpID0+IHtcbiAgICAgIGNvbnN0IHByb3hpZWRDYWxsYmFjayA9IENvbWxpbmsucHJveHkoY2FsbGJhY2spXG4gICAgICBjb21saW5rV29ya2VyLm9uKGV2ZW50IGFzIFJvb3RDaXJjdWl0RXZlbnROYW1lLCBwcm94aWVkQ2FsbGJhY2spXG4gICAgfSxcbiAgICBraWxsOiBhc3luYyAoKSA9PiB7XG4gICAgICBjb21saW5rV29ya2VyW0NvbWxpbmsucmVsZWFzZVByb3h5XSgpXG4gICAgICByYXdXb3JrZXIudGVybWluYXRlKClcbiAgICAgIGlzVGVybWluYXRlZCA9IHRydWVcbiAgICAgIGlmIChnbG9iYWxUaGlzLlRTQ0lSQ1VJVF9HTE9CQUxfQ0lSQ1VJVF9XT1JLRVIgPT09IHdyYXBwZXIpIHtcbiAgICAgICAgZ2xvYmFsVGhpcy5UU0NJUkNVSVRfR0xPQkFMX0NJUkNVSVRfV09SS0VSID0gdW5kZWZpbmVkXG4gICAgICB9XG4gICAgfSxcbiAgfVxuICBnbG9iYWxUaGlzLlRTQ0lSQ1VJVF9HTE9CQUxfQ0lSQ1VJVF9XT1JLRVIgPSB3cmFwcGVyXG4gIHJldHVybiB3cmFwcGVyXG59XG4iXSwKICAibWFwcGluZ3MiOiAiO0FBQUEsU0FBUyxtQkFBbUI7QUFFNUIsWUFBWSxtQkFBbUI7QUFDL0IsWUFBWSxXQUFXO0FBQ3ZCLFlBQVksZ0JBQWdCO0FBQzVCLFlBQVksd0JBQXdCOzs7QUNIcEMsSUFBTSxRQUFRLG9CQUFJLElBQWlCO0FBRW5DLElBQU0sb0JBQW9CLE9BQU8sTUFBVyxXQUFnQjtBQUMxRCxRQUFNLGNBQWMsSUFBSSxnQkFBZ0I7QUFBQSxJQUN0QyxHQUFHO0FBQUEsSUFDSCxNQUFNO0FBQUEsRUFDUixDQUFDLEVBQUUsU0FBUztBQUNaLE1BQUksTUFBTSxJQUFJLFdBQVcsR0FBRztBQUMxQixXQUFPLE1BQU0sSUFBSSxXQUFXO0FBQUEsRUFDOUI7QUFDQSxRQUFNLFdBQVcsTUFBTTtBQUFBLElBQ3JCLG1DQUFtQyxJQUFJLFNBQVMsV0FBVztBQUFBLEVBQzdEO0FBQ0EsUUFBTSxlQUFlLE1BQU0sU0FBUyxLQUFLO0FBQ3pDLFFBQU0sSUFBSSxhQUFhLFlBQVk7QUFDbkMsU0FBTztBQUNUO0FBRU8sSUFBTSxpQkFBOEI7QUFBQSxFQUN6QyxVQUFVLE9BQU87QUFBQSxJQUNmO0FBQUEsSUFDQTtBQUFBLEVBQ0YsTUFBb0M7QUFDbEMsUUFDRSxnQkFBZ0IsU0FBUyxzQkFDekIsZ0JBQWdCLFVBQVUsbUJBQzFCO0FBQ0EsWUFBTSxFQUFFLFVBQVUsSUFBSSxNQUFNLGtCQUFrQixhQUFhO0FBQUEsUUFDekQsWUFBWSxnQkFBZ0I7QUFBQSxRQUM1QixTQUFTO0FBQUEsTUFDWCxDQUFDO0FBRUQsYUFBTztBQUFBLFFBQ0wsUUFBUSxVQUFVLElBQUksQ0FBQyxNQUFXLElBQUksRUFBRSxJQUFJLEVBQUUsRUFBRSxNQUFNLEdBQUcsQ0FBQztBQUFBLE1BQzVEO0FBQUEsSUFDRixXQUNFLGdCQUFnQixTQUFTLHNCQUN6QixnQkFBZ0IsVUFBVSxvQkFDMUI7QUFDQSxVQUFJLG1CQUFtQixTQUFTLEtBQUssR0FBRztBQUN0Qyw0QkFBb0Isa0JBQWtCLFFBQVEsT0FBTyxFQUFFO0FBQUEsTUFDekQ7QUFDQSxZQUFNLEVBQUUsV0FBVyxJQUFJLE1BQU0sa0JBQWtCLGNBQWM7QUFBQSxRQUMzRCxhQUFhLGdCQUFnQjtBQUFBLFFBQzdCLFNBQVM7QUFBQSxNQUNYLENBQUM7QUFFRCxhQUFPO0FBQUEsUUFDTCxRQUFRLFdBQVcsSUFBSSxDQUFDLE1BQVcsSUFBSSxFQUFFLElBQUksRUFBRSxFQUFFLE1BQU0sR0FBRyxDQUFDO0FBQUEsTUFDN0Q7QUFBQSxJQUNGLFdBQ0UsZ0JBQWdCLFNBQVMsc0JBQ3pCLGdCQUFnQixVQUFVLHFCQUMxQjtBQUNBLFVBQUk7QUFDSixVQUFJLG1CQUFtQixTQUFTLElBQUksR0FBRztBQUNyQyxnQkFBUSxrQkFBa0IsTUFBTSxJQUFJLEVBQUUsQ0FBQztBQUFBLE1BQ3pDO0FBQ0EsWUFBTSxFQUFFLFFBQVEsSUFBSSxNQUFNO0FBQUEsUUFDeEI7QUFBQSxRQUNBLFFBQ0k7QUFBQSxVQUNFO0FBQUEsVUFDQSxVQUFVLGdCQUFnQjtBQUFBLFVBQzFCLFFBQVEsZ0JBQWdCO0FBQUEsUUFDMUIsSUFDQTtBQUFBLFVBQ0UsVUFBVSxnQkFBZ0I7QUFBQSxVQUMxQixRQUFRLGdCQUFnQjtBQUFBLFFBQzFCO0FBQUEsTUFDTjtBQUNBLGFBQU87QUFBQSxRQUNMLFFBQVEsUUFBUSxJQUFJLENBQUMsTUFBVyxJQUFJLEVBQUUsSUFBSSxFQUFFLEVBQUUsTUFBTSxHQUFHLENBQUM7QUFBQSxNQUMxRDtBQUFBLElBQ0Y7QUFDQSxXQUFPLENBQUM7QUFBQSxFQUNWO0FBQ0Y7OztBQzVFTyxJQUFNLG9CQUFvQixPQUF1QjtBQUFBLEVBQ3RELGFBQWE7QUFDZjs7O0FGV08sU0FBUyx1QkFDZCx3QkFDQSxPQUdJLENBQUMsR0FDYTtBQUNsQixhQUFXLFFBQVE7QUFFbkIsUUFBTSxVQUFVLElBQUksWUFBWTtBQUFBLElBQzlCLFVBQVUsS0FBSyxZQUFZLGtCQUFrQjtBQUFBLEVBQy9DLENBQUM7QUFFRCxNQUFJLEtBQUssTUFBTTtBQUNiLFlBQVEsT0FBTyxLQUFLO0FBQUEsRUFDdEI7QUFFQSxTQUFPO0FBQUEsSUFDTCxPQUFPLENBQUM7QUFBQSxJQUNSLFlBQVk7QUFBQSxJQUNaLG9CQUFvQjtBQUFBLE1BQ2xCLG1CQUFtQjtBQUFBLE1BQ25CLFdBQVc7QUFBQSxNQUNYLHlCQUF5QjtBQUFBLE1BQ3pCLE9BQU87QUFBQSxNQUNQLGVBQWU7QUFBQTtBQUFBO0FBQUEsTUFJZixvQkFBb0IsQ0FBQztBQUFBLElBQ3ZCO0FBQUEsSUFDQTtBQUFBLElBQ0EsR0FBRztBQUFBLEVBQ0w7QUFDRjs7O0FHbERPLFNBQVMsa0JBQWtCLFVBQWtCO0FBQ2xELE1BQUksZUFBZTtBQUNuQixpQkFBZSxhQUFhLFFBQVEsT0FBTyxHQUFHO0FBQzlDLGlCQUFlLGFBQWEsS0FBSztBQUNqQyxNQUFJLGFBQWEsV0FBVyxJQUFJLEdBQUc7QUFDakMsbUJBQWUsYUFBYSxNQUFNLENBQUM7QUFBQSxFQUNyQztBQUNBLE1BQUksYUFBYSxXQUFXLEdBQUcsR0FBRztBQUNoQyxtQkFBZSxhQUFhLE1BQU0sQ0FBQztBQUFBLEVBQ3JDO0FBQ0EsU0FBTztBQUNUO0FBRU8sU0FBUyxlQUFlLE9BQStCO0FBQzVELFFBQU0sa0JBQTBDLENBQUM7QUFDakQsYUFBVyxDQUFDLFFBQVEsV0FBVyxLQUFLLE9BQU8sUUFBUSxLQUFLLEdBQUc7QUFDekQsb0JBQWdCLGtCQUFrQixNQUFNLENBQUMsSUFBSTtBQUFBLEVBQy9DO0FBQ0EsU0FBTztBQUNUOzs7QUNYQSxPQUF1Qjs7O0FDRmhCLFNBQVMsUUFBUSxNQUFzQjtBQUM1QyxNQUFJLENBQUMsS0FBTSxRQUFPO0FBR2xCLFFBQU0saUJBQWlCLEtBQUssUUFBUSxPQUFPLEdBQUc7QUFHOUMsUUFBTSxZQUFZLGVBQWUsUUFBUSxRQUFRLEVBQUU7QUFHbkQsTUFBSSxVQUFVLFFBQVEsR0FBRyxNQUFNLEdBQUksUUFBTztBQUcxQyxTQUFPLFVBQVUsVUFBVSxHQUFHLFVBQVUsWUFBWSxHQUFHLENBQUMsS0FBSztBQUMvRDs7O0FDakJBLFNBQVMsb0JBQW9CLFlBQW9CLEtBQXFCO0FBRXBFLE1BQUksV0FBVyxXQUFXLEtBQUssR0FBRztBQUNoQyxVQUFNLFlBQVksUUFBUSxHQUFHO0FBQzdCLFdBQU8sb0JBQW9CLFdBQVcsTUFBTSxDQUFDLEdBQUcsU0FBUztBQUFBLEVBQzNEO0FBRUEsTUFBSSxXQUFXLFdBQVcsSUFBSSxHQUFHO0FBQy9CLFdBQU8sb0JBQW9CLFdBQVcsTUFBTSxDQUFDLEdBQUcsR0FBRztBQUFBLEVBQ3JEO0FBRUEsTUFBSSxXQUFXLFdBQVcsR0FBRyxHQUFHO0FBQzlCLFdBQU8sV0FBVyxNQUFNLENBQUM7QUFBQSxFQUMzQjtBQUVBLFNBQU8sR0FBRyxHQUFHLElBQUksVUFBVTtBQUM3QjtBQUVPLElBQU0sa0JBQWtCLENBQzdCLGlCQUNBLHFCQUNBLFFBQ0c7QUFFSCxRQUFNLGVBQWUsTUFDakIsb0JBQW9CLGlCQUFpQixHQUFHLElBQ3hDO0FBRUosUUFBTSxZQUFZLElBQUk7QUFBQSxJQUNwQixNQUFNLFFBQVEsbUJBQW1CLElBQzdCLHNCQUNBLE9BQU8sS0FBSyxtQkFBbUI7QUFBQSxFQUNyQztBQUVBLE1BQUksVUFBVSxJQUFJLFlBQVksR0FBRztBQUMvQixXQUFPO0FBQUEsRUFDVDtBQUVBLFFBQU0sd0JBQXdCLG9CQUFJLElBQW9CO0FBQ3RELGFBQVcsWUFBWSxXQUFXO0FBQ2hDLDBCQUFzQixJQUFJLGtCQUFrQixRQUFRLEdBQUcsUUFBUTtBQUFBLEVBQ2pFO0FBRUEsUUFBTSx5QkFBeUIsa0JBQWtCLFlBQVk7QUFFN0QsTUFBSSxzQkFBc0IsSUFBSSxzQkFBc0IsR0FBRztBQUNyRCxXQUFPLHNCQUFzQixJQUFJLHNCQUFzQjtBQUFBLEVBQ3pEO0FBR0EsUUFBTSxZQUFZLENBQUMsT0FBTyxNQUFNLFFBQVEsTUFBTSxLQUFLO0FBQ25ELGFBQVcsT0FBTyxXQUFXO0FBQzNCLFVBQU0sbUJBQW1CLEdBQUcsc0JBQXNCLElBQUksR0FBRztBQUN6RCxRQUFJLHNCQUFzQixJQUFJLGdCQUFnQixHQUFHO0FBQy9DLGFBQU8sc0JBQXNCLElBQUksZ0JBQWdCO0FBQUEsSUFDbkQ7QUFBQSxFQUNGO0FBR0EsTUFBSSxDQUFDLGdCQUFnQixXQUFXLElBQUksS0FBSyxDQUFDLGdCQUFnQixXQUFXLEtBQUssR0FBRztBQUMzRSxVQUFNLDRCQUE0QixrQkFBa0IsZUFBZTtBQUNuRSxRQUFJLHNCQUFzQixJQUFJLHlCQUF5QixHQUFHO0FBQ3hELGFBQU8sc0JBQXNCLElBQUkseUJBQXlCO0FBQUEsSUFDNUQ7QUFDQSxlQUFXLE9BQU8sV0FBVztBQUMzQixZQUFNLG1CQUFtQixHQUFHLHlCQUF5QixJQUFJLEdBQUc7QUFDNUQsVUFBSSxzQkFBc0IsSUFBSSxnQkFBZ0IsR0FBRztBQUMvQyxlQUFPLHNCQUFzQixJQUFJLGdCQUFnQjtBQUFBLE1BQ25EO0FBQUEsSUFDRjtBQUFBLEVBQ0Y7QUFFQSxTQUFPO0FBQ1Q7QUFFTyxJQUFNLHlCQUF5QixDQUNwQyxpQkFDQSx3QkFDRztBQUNILFFBQU0sbUJBQW1CLGdCQUFnQixpQkFBaUIsbUJBQW1CO0FBQzdFLE1BQUksQ0FBQyxrQkFBa0I7QUFDckIsVUFBTSxJQUFJO0FBQUEsTUFDUixtQkFBbUIsZUFBZTtBQUFBO0FBQUEsRUFBMEIsT0FBTyxLQUFLLG1CQUFtQixFQUFFLEtBQUssSUFBSSxDQUFDO0FBQUEsSUFDekc7QUFBQSxFQUNGO0FBQ0EsU0FBTztBQUNUOzs7QUN2Rk8sU0FBUyxlQUNkLGNBQ0Esb0JBQ0EsS0FDQTtBQUNBO0FBQUMsRUFBQyxXQUFtQixzQkFBc0IsQ0FBQyxTQUFpQjtBQUMzRCxVQUFNLG1CQUFtQixnQkFBZ0IsTUFBTSxvQkFBb0IsR0FBRztBQUV0RSxVQUFNLHNCQUNKLG9CQUFvQixtQkFBbUIsZ0JBQWdCO0FBRXpELFFBQUksQ0FBQyxtQkFBbUIsSUFBSSxLQUFLLENBQUMscUJBQXFCO0FBQ3JELFlBQU0sSUFBSSxNQUFNLFdBQVcsSUFBSSxlQUFlLE1BQU0sT0FBTyxHQUFHLE1BQU0sRUFBRSxFQUFFO0FBQUEsSUFDMUU7QUFFQSxVQUFNLE1BQ0osbUJBQW1CLElBQUksS0FBSyxtQkFBbUIsZ0JBQWlCO0FBQ2xFLFdBQU8sSUFBSSxNQUFNLEtBQUs7QUFBQSxNQUNwQixJQUFJLFFBQVEsTUFBTTtBQUNoQixZQUFJLEVBQUUsUUFBUSxTQUFTO0FBQ3JCLGNBQUksU0FBUyxXQUFXO0FBQ3RCLGdCQUFJLE9BQU8sWUFBWSxRQUFXO0FBQ2hDLHFCQUFPLE9BQU87QUFBQSxZQUNoQjtBQUVBLGdCQUFJLE9BQU8sWUFBWTtBQUNyQixxQkFBTztBQUFBLFlBQ1Q7QUFFQSxnQkFBSSxPQUFPLFdBQVcsY0FBYyxPQUFPLFdBQVcsVUFBVTtBQUM5RCxxQkFBTztBQUFBLFlBQ1Q7QUFFQSxtQkFBTztBQUFBLFVBQ1Q7QUFFQSxjQUFJLFNBQVMsY0FBYztBQUN6QixtQkFBTztBQUFBLFVBQ1Q7QUFFQSxnQkFBTSxJQUFJO0FBQUEsWUFDUixjQUFjLE9BQU8sSUFBSSxDQUFDLHlCQUF5QixJQUFJO0FBQUEsVUFDekQ7QUFBQSxRQUNGO0FBRUEsZUFBTyxPQUFPLElBQTJCO0FBQUEsTUFDM0M7QUFBQSxJQUNGLENBQUM7QUFBQSxFQUNIO0FBRUEsUUFBTSxlQUFlO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxJQUtuQixZQUFZO0FBQUEsa0JBQ0UsS0FBSztBQUNyQixTQUFPLFNBQVMsWUFBWSxFQUFFLEtBQUssVUFBVTtBQUMvQzs7O0FDMURBLE9BQXVCOzs7QUNGdkIsWUFBWSxXQUFXOzs7QUNBaEIsSUFBTSxxQkFBcUIsQ0FBQyxTQUEyQjtBQUU1RCxRQUFNLGNBQ0o7QUFDRixRQUFNLFVBQW9CLENBQUM7QUFDM0IsTUFBSTtBQUdKLFVBQVEsUUFBUSxZQUFZLEtBQUssSUFBSSxPQUFPLE1BQU07QUFDaEQsWUFBUSxLQUFLLE1BQU0sQ0FBQyxDQUFDO0FBQUEsRUFDdkI7QUFHQSxRQUFNLGdCQUNKO0FBQ0YsTUFBSTtBQUVKLFVBQVEsZ0JBQWdCLGNBQWMsS0FBSyxJQUFJLE9BQU8sTUFBTTtBQUMxRCxZQUFRLEtBQUssY0FBYyxDQUFDLENBQUM7QUFBQSxFQUMvQjtBQUVBLFNBQU87QUFDVDs7O0FEZE8sSUFBTSxrQkFBa0IsT0FDN0IsWUFDQSxLQUNBLFFBQVEsTUFDTDtBQUNILFFBQU0sRUFBRSxPQUFPLG1CQUFtQixJQUFJO0FBRXRDLFFBQU0sU0FBUyx1QkFBdUIsWUFBWSxLQUFLO0FBQ3ZELE1BQUksQ0FBQyxJQUFJLE1BQU0sTUFBTSxHQUFHO0FBQ3RCLFVBQU0sSUFBSSxNQUFNLFNBQVMsTUFBTSxhQUFhO0FBQUEsRUFDOUM7QUFDQSxRQUFNLGNBQWMsTUFBTSxNQUFNO0FBQ2hDLE1BQUksT0FBTyxTQUFTLE9BQU8sR0FBRztBQUM1QixVQUFNLFdBQVcsS0FBSyxNQUFNLFdBQVc7QUFDdkMsdUJBQW1CLE1BQU0sSUFBSTtBQUFBLE1BQzNCLFlBQVk7QUFBQSxNQUNaLFNBQVM7QUFBQSxJQUNYO0FBQUEsRUFDRixXQUFXLE9BQU8sU0FBUyxNQUFNLEtBQUssT0FBTyxTQUFTLEtBQUssR0FBRztBQUM1RCxVQUFNLGNBQWMsbUJBQW1CLFdBQVc7QUFFbEQsZUFBV0EsZUFBYyxhQUFhO0FBQ3BDLFVBQUksQ0FBQyxtQkFBbUJBLFdBQVUsR0FBRztBQUNuQyxjQUFNLGVBQWVBLGFBQVksS0FBSyxRQUFRLEdBQUc7QUFBQSxVQUMvQyxLQUFLLFFBQVEsTUFBTTtBQUFBLFFBQ3JCLENBQUM7QUFBQSxNQUNIO0FBQUEsSUFDRjtBQUVBLFVBQU0sU0FBZSxnQkFBVSxhQUFhO0FBQUEsTUFDMUMsU0FBUyxDQUFDLFNBQVMsWUFBWTtBQUFBLE1BQy9CLFNBQVMsQ0FBQyw0QkFBNEI7QUFBQSxNQUN0QyxVQUFVO0FBQUEsSUFDWixDQUFDO0FBRUQsUUFBSSxDQUFDLFVBQVUsQ0FBQyxPQUFPLE1BQU07QUFDM0IsWUFBTSxJQUFJLE1BQU0sMEJBQTBCO0FBQUEsSUFDNUM7QUFFQSxRQUFJO0FBQ0YsWUFBTSxrQkFBa0I7QUFBQSxRQUN0QixPQUFPO0FBQUEsUUFDUDtBQUFBLFFBQ0EsUUFBUSxNQUFNO0FBQUEsTUFDaEI7QUFDQSx5QkFBbUIsTUFBTSxJQUFJLGdCQUFnQjtBQUFBLElBQy9DLFNBQVMsT0FBWTtBQUNuQixZQUFNLElBQUk7QUFBQSxRQUNSLCtCQUErQixVQUFVLE1BQU0sTUFBTSxPQUFPO0FBQUEsTUFDOUQ7QUFBQSxJQUNGO0FBQUEsRUFDRixXQUFXLE9BQU8sU0FBUyxLQUFLLEdBQUc7QUFFakMsVUFBTSxTQUFlLGdCQUFVLGFBQWE7QUFBQSxNQUMxQyxTQUFTLENBQUMsS0FBSztBQUFBLE1BQ2YsU0FBUyxDQUFDLDRCQUE0QjtBQUFBLE1BQ3RDLFVBQVU7QUFBQSxJQUNaLENBQUM7QUFFRCxRQUFJLENBQUMsVUFBVSxDQUFDLE9BQU8sTUFBTTtBQUMzQixZQUFNLElBQUksTUFBTSw2QkFBNkI7QUFBQSxJQUMvQztBQUVBLHVCQUFtQixNQUFNLElBQUk7QUFBQSxNQUMzQixPQUFPO0FBQUEsTUFDUDtBQUFBLE1BQ0EsUUFBUSxNQUFNO0FBQUEsSUFDaEIsRUFBRTtBQUFBLEVBQ0osT0FBTztBQUNMLFVBQU0sSUFBSTtBQUFBLE1BQ1IsK0JBQStCLE9BQU8sTUFBTSxHQUFHLEVBQUUsSUFBSSxDQUFDLFVBQVUsTUFBTTtBQUFBLElBQ3hFO0FBQUEsRUFDRjtBQUNGOzs7QUUvRUEsT0FBdUI7QUFJdkIsZUFBc0IsY0FDcEIsWUFDQSxLQUNBLFFBQVEsR0FDUjtBQUNBLFFBQU0sRUFBRSxtQkFBbUIsSUFBSTtBQUMvQixRQUFNLGtCQUFrQixXQUFXLFFBQVEsVUFBVSxFQUFFLEVBQUUsUUFBUSxLQUFLLEdBQUc7QUFFekUsUUFBTSxFQUFFLEtBQUssTUFBTSxJQUFJLE1BQU0sTUFBTSxHQUFHLElBQUksY0FBYyxJQUFJLGVBQWUsRUFBRSxFQUMxRSxLQUFLLE9BQU8sU0FBUyxFQUFFLEtBQUssTUFBTSxJQUFJLEtBQUssR0FBRyxPQUFPLEtBQUssRUFBRSxFQUM1RCxNQUFNLENBQUMsT0FBTyxFQUFFLE9BQU8sR0FBRyxLQUFLLEtBQUssRUFBRTtBQUV6QyxNQUFJLE9BQU87QUFDVCxZQUFRLE1BQU0seUJBQXlCLFlBQVksS0FBSztBQUN4RDtBQUFBLEVBQ0Y7QUFFQSxNQUFJO0FBQ0YsdUJBQW1CLFVBQVUsSUFBSTtBQUFBLE1BQy9CO0FBQUEsTUFDQTtBQUFBLElBQ0YsRUFBRTtBQUFBLEVBQ0osU0FBUyxHQUFHO0FBQ1YsWUFBUSxNQUFNLDJCQUEyQixDQUFDO0FBQUEsRUFDNUM7QUFDRjs7O0FDaEJBLFNBQVMsY0FDUCxZQUNBLE9BQ0EsVUFDdUI7QUFDdkIsU0FBTztBQUFBLElBQ0w7QUFBQSxJQUNBLFlBQVksQ0FBQyxPQUFPLFFBQVEsT0FBTyxRQUFRLE9BQU87QUFBQSxJQUNsRDtBQUFBLElBQ0E7QUFBQSxFQUNGO0FBQ0Y7QUFFQSxTQUFTLGdCQUFnQixpQkFBeUIsS0FBNEI7QUFDNUUsUUFBTSxrQkFBa0IsR0FBRyxlQUFlO0FBQzFDLE1BQUksQ0FBQyxJQUFJLE1BQU0sZUFBZSxFQUFHLFFBQU87QUFDeEMsTUFBSTtBQUNGLFdBQU8sS0FBSyxNQUFNLElBQUksTUFBTSxlQUFlLENBQUM7QUFBQSxFQUM5QyxRQUFRO0FBQ04sV0FBTztBQUFBLEVBQ1Q7QUFDRjtBQUVBLFNBQVMseUJBQ1AsTUFDQSxLQUNlO0FBQ2YsTUFBSSxJQUFJLE1BQU0sSUFBSSxFQUFHLFFBQU87QUFFNUIsYUFBVyxPQUFPLElBQUksWUFBWTtBQUNoQyxVQUFNLGNBQWMsS0FBSyxRQUFRLGdCQUFnQixFQUFFLElBQUk7QUFDdkQsUUFBSSxJQUFJLE1BQU0sV0FBVyxFQUFHLFFBQU87QUFBQSxFQUNyQztBQUNBLFNBQU87QUFDVDtBQUVBLFNBQVMsa0JBQ1AsaUJBQ0EsWUFDQSxLQUNlO0FBQ2YsUUFBTSxpQkFBaUIsR0FBRyxlQUFlLElBQUksV0FBVyxRQUFRLFNBQVMsRUFBRSxDQUFDO0FBQzVFLFNBQU8seUJBQXlCLGdCQUFnQixHQUFHO0FBQ3JEO0FBRUEsU0FBUyxzQkFDUCxpQkFDQSxhQUNBLGVBQ0EsS0FDZTtBQUNmLE1BQUksQ0FBQyxZQUFZLFFBQVMsUUFBTztBQUdqQyxRQUFNLGdCQUFnQixZQUFZLFFBQVEsR0FBRztBQUM3QyxNQUFJLGtCQUFrQixNQUFNLGVBQWU7QUFDekMsUUFBSSxPQUFPLGtCQUFrQixVQUFVO0FBQ3JDLFlBQU0sV0FBVyxrQkFBa0IsaUJBQWlCLGVBQWUsR0FBRztBQUN0RSxVQUFJLFNBQVUsUUFBTztBQUFBLElBQ3ZCO0FBQUEsRUFDRjtBQUdBLFFBQU0sZ0JBQWdCLGdCQUNsQixZQUFZLFFBQVEsS0FBSyxhQUFhLEVBQUUsSUFDeEM7QUFDSixNQUFJLGlCQUFpQixPQUFPLGtCQUFrQixVQUFVO0FBQ3RELFVBQU0sV0FBVyxrQkFBa0IsaUJBQWlCLGVBQWUsR0FBRztBQUN0RSxRQUFJLFNBQVUsUUFBTztBQUFBLEVBQ3ZCO0FBR0EsUUFBTSxlQUFlLFlBQVksUUFBUSxRQUFRO0FBQ2pELE1BQ0Usa0JBQWtCLE1BQ2xCLGdCQUNBLE9BQU8saUJBQWlCLFVBQ3hCO0FBQ0EsVUFBTSxXQUFXLGtCQUFrQixpQkFBaUIsY0FBYyxHQUFHO0FBQ3JFLFFBQUksU0FBVSxRQUFPO0FBQUEsRUFDdkI7QUFFQSxTQUFPO0FBQ1Q7QUFFQSxTQUFTLHlCQUNQLGlCQUNBLGFBQ0EsS0FDZTtBQUNmLFFBQU0sYUFBYSxZQUFZLFVBQVUsWUFBWSxRQUFRO0FBQzdELFFBQU0sV0FBVyxHQUFHLGVBQWUsSUFBSSxVQUFVO0FBQ2pELFNBQU8seUJBQXlCLFVBQVUsR0FBRztBQUMvQztBQUVBLFNBQVMscUJBQ1AsaUJBQ0EsZUFDQSxLQUNlO0FBQ2YsTUFBSSxDQUFDLGVBQWU7QUFFbEIsZUFBVyxPQUFPLElBQUksWUFBWTtBQUNoQyxZQUFNLFlBQVksR0FBRyxlQUFlLFNBQVMsR0FBRztBQUNoRCxVQUFJLElBQUksTUFBTSxTQUFTLEVBQUcsUUFBTztBQUFBLElBQ25DO0FBQ0EsV0FBTztBQUFBLEVBQ1Q7QUFFQSxRQUFNLFdBQVcsR0FBRyxlQUFlLElBQUksYUFBYTtBQUNwRCxRQUFNLGNBQWMseUJBQXlCLFVBQVUsR0FBRztBQUMxRCxNQUFJLFlBQWEsUUFBTztBQUd4QixhQUFXLE9BQU8sSUFBSSxZQUFZO0FBQ2hDLFVBQU0sWUFBWSxHQUFHLFFBQVEsU0FBUyxHQUFHO0FBQ3pDLFFBQUksSUFBSSxNQUFNLFNBQVMsRUFBRyxRQUFPO0FBQUEsRUFDbkM7QUFDQSxTQUFPO0FBQ1Q7QUFFQSxTQUFTLHdCQUNQLFlBQ0EsS0FDZTtBQUNmLFFBQU0sY0FBYyxJQUFJLFdBQVcsTUFBTSxHQUFHO0FBQzVDLFFBQU0sUUFBUSxZQUFZLENBQUMsRUFBRSxXQUFXLEdBQUcsSUFDdkMsWUFBWSxNQUFNLEdBQUcsQ0FBQyxFQUFFLEtBQUssR0FBRyxJQUNoQyxZQUFZLENBQUM7QUFDakIsUUFBTSxnQkFBZ0IsWUFBWSxNQUFNLE1BQU0sU0FBUyxHQUFHLElBQUksSUFBSSxDQUFDLEVBQUUsS0FBSyxHQUFHO0FBQzdFLFFBQU0sa0JBQWtCLEdBQUcsY0FBYyxNQUFNLEtBQUssR0FBRyxVQUFVLEdBQUcsZ0JBQWdCLEtBQUs7QUFHekYsUUFBTSxjQUFjLGdCQUFnQixpQkFBaUIsR0FBRztBQUN4RCxNQUFJLGFBQWE7QUFFZixVQUFNLG9CQUFvQjtBQUFBLE1BQ3hCO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsSUFDRjtBQUNBLFFBQUksa0JBQW1CLFFBQU87QUFHOUIsVUFBTSx1QkFBdUI7QUFBQSxNQUMzQjtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsSUFDRjtBQUNBLFFBQUkscUJBQXNCLFFBQU87QUFBQSxFQUNuQztBQUdBLFFBQU0sMEJBQTBCO0FBQUEsSUFDOUI7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLEVBQ0Y7QUFDQSxNQUFJLHdCQUF5QixRQUFPO0FBR3BDLFFBQU0sYUFBYSxRQUFRLFVBQVU7QUFDckMsTUFBSSxjQUFjLGVBQWUsWUFBWTtBQUMzQyxXQUFPLHdCQUF3QixZQUFZLEdBQUc7QUFBQSxFQUNoRDtBQUVBLFNBQU87QUFDVDtBQUVPLFNBQVMsa0JBQ2QsWUFDQSxPQUNBLFVBQ2U7QUFDZixRQUFNLE1BQU0sY0FBYyxZQUFZLE9BQU8sUUFBUTtBQUNyRCxTQUFPLHdCQUF3QixJQUFJLFVBQVUsR0FBRztBQUNsRDs7O0FDNUxPLElBQU0sbUJBQW1CLE9BQzlCLFlBQ0EsS0FDQSxRQUFRLE1BQ0w7QUFDSCxRQUFNLEVBQUUsbUJBQW1CLElBQUk7QUFFL0IsTUFBSSxtQkFBbUIsVUFBVSxHQUFHO0FBQ2xDO0FBQUEsRUFDRjtBQUVBLFFBQU0seUJBQXlCLGtCQUFrQixZQUFZLElBQUksT0FBTyxFQUFFO0FBRTFFLE1BQUksQ0FBQyx3QkFBd0I7QUFDM0IsVUFBTSxJQUFJLE1BQU0sZ0JBQWdCLFVBQVUsYUFBYTtBQUFBLEVBQ3pEO0FBR0EsUUFBTSxnQkFBZ0Isd0JBQXdCLEtBQUssS0FBSztBQUd4RCxxQkFBbUIsVUFBVSxJQUFJLG1CQUFtQixzQkFBc0I7QUFHMUUsUUFBTSxpQkFBaUIsdUJBQXVCLFFBQVEsbUJBQW1CLEVBQUU7QUFDM0UscUJBQW1CLGNBQWMsSUFDL0IsbUJBQW1CLHNCQUFzQjtBQUczQyxNQUNFLHVCQUF1QixTQUFTLFlBQVksS0FDNUMsdUJBQXVCLFNBQVMsV0FBVyxLQUMzQyx1QkFBdUIsU0FBUyxXQUFXLEdBQzNDO0FBQ0EsVUFBTSxVQUFVLHVCQUF1QixRQUFRLHVCQUF1QixFQUFFO0FBQ3hFLFVBQU0sb0JBQW9CLFFBQVEsUUFBUSxtQkFBbUIsRUFBRTtBQUMvRCx1QkFBbUIsaUJBQWlCLElBQ2xDLG1CQUFtQixzQkFBc0I7QUFHM0MsUUFBSSxrQkFBa0IsV0FBVyxHQUFHLEdBQUc7QUFDckMsWUFBTSxhQUFhLGtCQUFrQixNQUFNLEdBQUc7QUFDOUMsVUFBSSxXQUFXLFVBQVUsR0FBRztBQUMxQixjQUFNLGFBQWEsR0FBRyxXQUFXLENBQUMsQ0FBQyxJQUFJLFdBQVcsQ0FBQyxDQUFDO0FBQ3BELDJCQUFtQixVQUFVLElBQzNCLG1CQUFtQixzQkFBc0I7QUFBQSxNQUM3QztBQUFBLElBQ0Y7QUFBQSxFQUNGO0FBQ0Y7OztBTDVDQSxlQUFzQixlQUNwQixZQUNBLEtBQ0EsUUFBUSxHQUNSLE9BRUksQ0FBQyxHQUNMO0FBQ0EsTUFBSSxJQUFJLFNBQVM7QUFDZixZQUFRLElBQUksWUFBWSxLQUFLLE9BQU8sS0FBSyxDQUFDLGdCQUFNLFVBQVU7QUFBQSxFQUM1RDtBQUNBLFFBQU0sRUFBRSxtQkFBbUIsSUFBSTtBQUUvQixNQUFJLG1CQUFtQixVQUFVLEVBQUc7QUFDcEMsTUFBSSxXQUFXLFdBQVcsSUFBSSxLQUFLLG1CQUFtQixXQUFXLE1BQU0sQ0FBQyxDQUFDO0FBQ3ZFO0FBRUYsTUFBSSxRQUFRLEdBQUc7QUFDYixZQUFRLElBQUksK0JBQStCO0FBQzNDO0FBQUEsRUFDRjtBQUVBLFFBQU0sMEJBQTBCO0FBQUEsSUFDOUI7QUFBQSxJQUNBLElBQUk7QUFBQSxJQUNKLEtBQUs7QUFBQSxFQUNQO0FBQ0EsTUFBSSx5QkFBeUI7QUFDM0IsV0FBTyxnQkFBZ0IseUJBQXlCLEtBQUssS0FBSztBQUFBLEVBQzVEO0FBR0EsUUFBTSx5QkFBeUI7QUFBQSxJQUM3QjtBQUFBLElBQ0EsSUFBSTtBQUFBLElBQ0osS0FBSyxPQUFPO0FBQUEsRUFDZDtBQUNBLE1BQUksd0JBQXdCO0FBQzFCLFdBQU8saUJBQWlCLFlBQVksS0FBSyxLQUFLO0FBQUEsRUFDaEQ7QUFFQSxNQUFJLFdBQVcsV0FBVyxRQUFRLEdBQUc7QUFDbkMsV0FBTyxjQUFjLFlBQVksS0FBSyxLQUFLO0FBQUEsRUFDN0M7QUFFQSxRQUFNLElBQUk7QUFBQSxJQUNSLHNCQUFzQixVQUFVLEtBQUssS0FBSyxNQUFNLG1CQUFtQixLQUFLLEdBQUcsTUFBTSxFQUFFO0FBQUEsRUFDckY7QUFDRjs7O0FNdkRPLElBQU0saUNBQWlDLENBQUMsU0FPekM7QUFDSixNQUFJLENBQUMsS0FBSyxjQUFjLENBQUMsS0FBSyxtQkFBbUI7QUFDL0MsUUFBSSxlQUFlLEtBQUssT0FBTztBQUM3QixXQUFLLG9CQUFvQjtBQUFBLElBQzNCLFdBQVcsY0FBYyxLQUFLLE9BQU87QUFDbkMsV0FBSyxvQkFBb0I7QUFBQSxJQUMzQixXQUNFLE9BQU8sS0FBSyxLQUFLLEtBQUssRUFBRSxPQUFPLENBQUMsTUFBTSxFQUFFLFNBQVMsTUFBTSxDQUFDLEVBQUUsV0FBVyxHQUNyRTtBQUNBLFdBQUssb0JBQW9CLE9BQU8sS0FBSyxLQUFLLEtBQUssRUFBRSxDQUFDO0FBQUEsSUFDcEQsT0FBTztBQUNMLFlBQU0sSUFBSTtBQUFBLFFBQ1I7QUFBQSxNQUNGO0FBQUEsSUFDRjtBQUFBLEVBQ0Y7QUFFQSxNQUFJLENBQUMsS0FBSyxjQUFjLEtBQUssbUJBQW1CO0FBQzlDLFNBQUssYUFBYTtBQUNsQixVQUFNLG9CQUNKLEtBQUssTUFBTSx1QkFBdUIsS0FBSyxtQkFBbUIsS0FBSyxLQUFLLENBQUM7QUFDdkUsUUFBSSxDQUFDLG1CQUFtQjtBQUN0QixZQUFNLElBQUk7QUFBQSxRQUNSLHdCQUF3QixLQUFLLGlCQUFpQiwwQ0FBMEMsT0FBTyxLQUFLLEtBQUssS0FBSyxFQUFFLEtBQUssSUFBSSxDQUFDO0FBQUEsTUFDNUg7QUFBQSxJQUNGO0FBQ0EsU0FBSyxNQUFNLEtBQUssVUFBVSxJQUFJO0FBQUEsMENBQ1EsS0FBSyxpQkFBaUI7QUFBQTtBQUFBLHlCQUV2QyxrQkFBa0IsU0FBUyxRQUFRLEVBQUUsU0FBUyxDQUFDO0FBQUEsUUFFaEUsS0FBSyxvQkFDRDtBQUFBLG9EQUN3QyxLQUFLLGlCQUFpQjtBQUFBLFlBRTlEO0FBQUE7QUFBQSxnRUFHTjtBQUFBO0FBQUE7QUFBQTtBQUFBLCtCQUl5QixLQUFLLHFCQUFxQixPQUFPLEtBQUssVUFBVSxLQUFLLG9CQUFvQixNQUFNLENBQUMsQ0FBQyxNQUFNLEVBQUU7QUFBQTtBQUFBO0FBQUEsMkNBRzdFLEtBQUsscUJBQXFCLE9BQU8sS0FBSyxVQUFVLEtBQUssb0JBQW9CLE1BQU0sQ0FBQyxDQUFDLE1BQU0sRUFBRTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFLbEk7QUFFQSxNQUFJLENBQUMsS0FBSyxRQUFRLEtBQUssbUJBQW1CO0FBQ3hDLFNBQUssT0FBTyxLQUFLO0FBQUEsRUFDbkI7QUFDRjs7O0FWcERPLElBQU0sZ0JBQU4sTUFBZ0Q7QUFBQSxFQUFoRDtBQUNMLDZCQUFzRTtBQUN0RSx1Q0FBMEQ7QUFBQSxNQUN4RCxvQkFBb0I7QUFBQSxNQUNwQixnQkFBZ0I7QUFBQSxNQUNoQixTQUFTO0FBQUEsSUFDWDtBQUNBLDJCQUFnRSxDQUFDO0FBQUE7QUFBQSxFQUVqRSxNQUFNLGlCQUFpQixRQU9MO0FBQ2hCLFVBQU0sT0FBTyxFQUFFLEdBQUcsT0FBTztBQUN6QixRQUFJLEtBQUssNEJBQTRCLFNBQVM7QUFDNUMsY0FBUSxJQUFJLGlEQUFpRDtBQUFBLFFBQzNELFlBQVksS0FBSztBQUFBLFFBQ2pCLFdBQVcsT0FBTyxLQUFLLEtBQUssS0FBSztBQUFBLFFBQ2pDLE1BQU0sS0FBSztBQUFBLE1BQ2IsQ0FBQztBQUFBLElBQ0g7QUFFQSxtQ0FBK0IsSUFBSTtBQUVuQyxTQUFLLG9CQUFvQjtBQUFBLE1BQ3ZCLEtBQUs7QUFBQSxNQUNMO0FBQUEsUUFDRSxNQUFNLEtBQUs7QUFBQSxNQUNiO0FBQUEsSUFDRjtBQUNBLFNBQUssb0JBQW9CLEtBQUssa0JBQWtCLE9BQU87QUFFdkQsU0FBSyxrQkFBa0IsUUFBUSxlQUFlLEtBQUssS0FBSztBQUN4RCxRQUFJLENBQUMsS0FBSyxrQkFBa0IsTUFBTSxLQUFLLFVBQVcsR0FBRztBQUNuRCxZQUFNLElBQUksTUFBTSxlQUFlLEtBQUssVUFBVSxhQUFhO0FBQUEsSUFDN0Q7QUFDQTtBQUFDLElBQUMsV0FBbUIsc0JBQXNCLEtBQUssa0JBQWtCO0FBRWxFLFVBQU0sYUFBYSxLQUFLLFdBQVksV0FBVyxJQUFJLElBQy9DLEtBQUssYUFDTCxLQUFLLEtBQUssVUFBVTtBQUV4QixVQUFNLGVBQWUsWUFBYSxLQUFLLGlCQUFpQjtBQUFBLEVBQzFEO0FBQUEsRUFFQSxNQUFNLFFBQVEsTUFBYyxPQUEwQixDQUFDLEdBQUc7QUFDeEQsUUFBSSxLQUFLLDRCQUE0QixTQUFTO0FBQzVDLGNBQVE7QUFBQSxRQUNOO0FBQUEsUUFDQSxLQUFLO0FBQUEsTUFDUDtBQUFBLElBQ0Y7QUFFQSxTQUFLLG9CQUFvQjtBQUFBLE1BQ3ZCLEtBQUs7QUFBQSxNQUNMO0FBQUEsSUFDRjtBQUNBLFNBQUssb0JBQW9CLEtBQUssa0JBQWtCLE9BQU87QUFDdkQsU0FBSyxrQkFBa0IsTUFBTSxnQkFBZ0IsSUFBSTtBQUNoRCxJQUFDLFdBQW1CLHNCQUFzQixLQUFLLGtCQUFrQjtBQUVsRSxVQUFNLGVBQWUsb0JBQW9CLEtBQUssaUJBQWlCO0FBQUEsRUFDakU7QUFBQSxFQUVBLEdBQUcsT0FBZSxVQUFvQztBQWhGeEQ7QUFpRkksZUFBSyxpQkFBTCx1QkFBZ0MsQ0FBQztBQUNqQyxTQUFLLGdCQUFnQixLQUFLLEVBQUUsS0FBSyxRQUFRO0FBQ3pDLFNBQUssbUJBQW1CLFFBQVEsR0FBRyxPQUFjLFFBQVE7QUFBQSxFQUMzRDtBQUFBLEVBRUEsTUFBTSxxQkFBb0M7QUFDeEMsUUFBSSxDQUFDLEtBQUssbUJBQW1CO0FBQzNCLFlBQU0sSUFBSSxNQUFNLDZCQUE2QjtBQUFBLElBQy9DO0FBQ0EsVUFBTSxLQUFLLGtCQUFrQixRQUFRLG1CQUFtQjtBQUFBLEVBQzFEO0FBQUEsRUFFQSxNQUFNLGlCQUErQztBQUNuRCxRQUFJLENBQUMsS0FBSyxtQkFBbUI7QUFDM0IsWUFBTSxJQUFJLE1BQU0sNkJBQTZCO0FBQUEsSUFDL0M7QUFDQSxXQUFPLEtBQUssa0JBQWtCLFFBQVEsZUFBZTtBQUFBLEVBQ3ZEO0FBQUEsRUFFQSxzQkFBc0I7QUFDcEIsUUFBSSxLQUFLLG1CQUFtQixTQUFTO0FBQ25DLGlCQUFXLFNBQVMsS0FBSyxpQkFBaUI7QUFDeEMsbUJBQVcsWUFBWSxLQUFLLGdCQUFnQixLQUFLLEdBQUc7QUFDbEQsZ0JBQU0sVUFBVSxLQUFLLGtCQUFrQjtBQUl2QyxrQkFBUSxpQkFBaUIsT0FBTyxRQUFRO0FBQUEsUUFDMUM7QUFBQSxNQUNGO0FBQUEsSUFDRjtBQUVBLGVBQVcsU0FBUyxLQUFLLGlCQUFpQjtBQUN4QyxhQUFPLEtBQUssZ0JBQWdCLEtBQUs7QUFBQSxJQUNuQztBQUFBLEVBQ0Y7QUFBQSxFQUVBLE1BQU0sT0FBTztBQUVYLFNBQUssb0JBQW9CO0FBQUEsRUFDM0I7QUFBQSxFQUVBLE1BQU0sc0JBQXNCLFNBQWlCO0FBQzNDLFNBQUssNEJBQTRCLHFCQUFxQjtBQUFBLEVBQ3hEO0FBQUEsRUFFUSxvQkFBb0IsU0FBc0I7QUFDaEQsZUFBVyxTQUFTLEtBQUssaUJBQWlCO0FBQ3hDLGlCQUFXLFlBQVksS0FBSyxnQkFBZ0IsS0FBSyxHQUFHO0FBQ2xELGdCQUFRLEdBQUcsT0FBYyxRQUFlO0FBQUEsTUFDMUM7QUFBQSxJQUNGO0FBQUEsRUFDRjtBQUNGOzs7QVdwSUEsZUFBc0IsaUJBQ3BCLHdCQUNBLE1BQ0E7QUFDQSxNQUNFLE9BQU8sMkJBQTJCLFlBQ2xDLENBQUMsdUJBQXVCLFNBQVMsUUFBUSxHQUN6QztBQUNBLFVBQU0sSUFBSTtBQUFBLE1BQ1I7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLElBQ0Y7QUFBQSxFQUNGO0FBQ0EsUUFBTSxhQUNKLE9BQU8sMkJBQTJCLFdBQzlCLEVBQUUsaUJBQWlCLHVCQUF1QixJQUMxQztBQUVOLFFBQU0sZ0JBQWdCLElBQUksY0FBYztBQUV4QyxRQUFNLGNBQWMsaUJBQWlCO0FBQUEsSUFDbkMsT0FBTztBQUFBLElBQ1AsR0FBRztBQUFBLEVBQ0wsQ0FBQztBQUVELFFBQU0sY0FBYyxtQkFBbUI7QUFFdkMsU0FBTyxNQUFNLGNBQWMsZUFBZTtBQUM1Qzs7O0FDM0JPLElBQU0scUJBQXFCLE9BQ2hDLFFBQ0EsT0FBNkQsQ0FBQyxNQUMzRDtBQUNILE1BQUksQ0FBQyxPQUFPLFdBQVcsR0FBRyxHQUFHO0FBQzNCLGFBQVMsU0FBUyxPQUFPLFFBQVEsTUFBTSxHQUFHLENBQUM7QUFBQSxFQUM3QztBQUNBLFFBQU0sY0FBYyxNQUFNO0FBQUEsSUFDeEI7QUFBQTtBQUFBO0FBQUEsTUFHRSxpQkFBaUI7QUFBQSw2Q0FDc0IsTUFBTTtBQUFBO0FBQUEsd0JBRTNCLEtBQUssY0FBYyxFQUFFO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxJQWN6QztBQUFBLElBQ0E7QUFBQSxNQUNFLG9CQUFvQixLQUFLO0FBQUEsSUFDM0I7QUFBQSxFQUNGO0FBQ0EsU0FBTztBQUNUOzs7QUNwQ0EsWUFBWSxhQUFhO0FBa0JsQixJQUFNLHlCQUF5QixPQUNwQyxrQkFDOEI7QUFFOUIsUUFBTSxpQkFBaUIsV0FBVztBQUNsQyxNQUFJLGtCQUFrQixPQUFPLGVBQWUsU0FBUyxZQUFZO0FBQy9ELFFBQUksY0FBYyxTQUFTO0FBQ3pCLGNBQVEsSUFBSSxxREFBcUQ7QUFBQSxJQUNuRTtBQUNBLFFBQUk7QUFDRixZQUFNLGVBQWUsS0FBSztBQUFBLElBQzVCLFNBQVMsR0FBRztBQUNWLFVBQUksY0FBYyxTQUFTO0FBQ3pCLGdCQUFRO0FBQUEsVUFDTjtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsTUFDRjtBQUVBLFVBQUksV0FBVyxvQ0FBb0MsZ0JBQWdCO0FBQ2pFLG1CQUFXLGtDQUFrQztBQUFBLE1BQy9DO0FBQUEsSUFDRjtBQUFBLEVBQ0Y7QUFFQSxNQUFJLGNBQWMsU0FBUztBQUN6QixZQUFRO0FBQUEsTUFDTjtBQUFBLE1BQ0E7QUFBQSxJQUNGO0FBQUEsRUFDRjtBQUVBLE1BQUksZ0JBQ0YsY0FBYyxvQkFBb0IsY0FBYztBQUVsRCxNQUFJLENBQUMsZUFBZTtBQUNsQixVQUFNLFNBQVMsZ0RBQWdELGNBQWMsZUFBZSxRQUFRO0FBRXBHLFVBQU0sYUFBYSxNQUFNLE1BQU0sTUFBTSxFQUFFLEtBQUssQ0FBQyxRQUFRLElBQUksS0FBSyxDQUFDO0FBQy9ELG9CQUFnQixJQUFJLGdCQUFnQixVQUFVO0FBQUEsRUFDaEQ7QUFFQSxRQUFNLFlBQVksSUFBSSxPQUFPLGVBQWUsRUFBRSxNQUFNLFNBQVMsQ0FBQztBQUM5RCxRQUFNLGdCQUF3QixhQUEyQixTQUFTO0FBRWxFLE1BQUksY0FBYyxvQkFBb0I7QUFDcEMsVUFBTSxjQUFjLHNCQUFzQixjQUFjLGtCQUFrQjtBQUFBLEVBQzVFO0FBRUEsTUFBSSxlQUFlO0FBR25CLFFBQU0sVUFBNEI7QUFBQSxJQUNoQyxxQkFBcUIsY0FBYyxvQkFBb0IsS0FBSyxhQUFhO0FBQUEsSUFDekUsU0FBUyxVQUFVLFNBQVM7QUFDMUIsVUFBSSxjQUFjO0FBQ2hCLGNBQU0sSUFBSSxNQUFNLGdEQUFnRDtBQUFBLE1BQ2xFO0FBQ0EsYUFBTyxjQUFjLFFBQVEsS0FBSyxhQUFhLEVBQUUsR0FBRyxJQUFJO0FBQUEsSUFDMUQ7QUFBQSxJQUNBLGtCQUFrQixVQUFVLFNBQVM7QUFDbkMsVUFBSSxjQUFjO0FBQ2hCLGNBQU0sSUFBSTtBQUFBLFVBQ1I7QUFBQSxRQUNGO0FBQUEsTUFDRjtBQUNBLGFBQU8sY0FBYyxpQkFBaUIsS0FBSyxhQUFhLEVBQUUsR0FBRyxJQUFJO0FBQUEsSUFDbkU7QUFBQSxJQUNBLG9CQUFvQixjQUFjLG1CQUFtQixLQUFLLGFBQWE7QUFBQSxJQUN2RSxnQkFBZ0IsY0FBYyxlQUFlLEtBQUssYUFBYTtBQUFBLElBQy9ELElBQUksQ0FBQyxPQUFlLGFBQXVDO0FBQ3pELFlBQU0sa0JBQTBCLGNBQU0sUUFBUTtBQUM5QyxvQkFBYyxHQUFHLE9BQStCLGVBQWU7QUFBQSxJQUNqRTtBQUFBLElBQ0EsTUFBTSxZQUFZO0FBQ2hCLG9CQUFzQixvQkFBWSxFQUFFO0FBQ3BDLGdCQUFVLFVBQVU7QUFDcEIscUJBQWU7QUFDZixVQUFJLFdBQVcsb0NBQW9DLFNBQVM7QUFDMUQsbUJBQVcsa0NBQWtDO0FBQUEsTUFDL0M7QUFBQSxJQUNGO0FBQUEsRUFDRjtBQUNBLGFBQVcsa0NBQWtDO0FBQzdDLFNBQU87QUFDVDsiLAogICJuYW1lcyI6IFsiaW1wb3J0TmFtZSJdCn0K
|
package/dist/worker.d.ts
CHANGED
|
@@ -30,6 +30,12 @@ type CircuitWebWorker = {
|
|
|
30
30
|
kill: () => Promise<void>;
|
|
31
31
|
};
|
|
32
32
|
|
|
33
|
+
declare global {
|
|
34
|
+
interface Window {
|
|
35
|
+
TSCIRCUIT_GLOBAL_CIRCUIT_WORKER: CircuitWebWorker | undefined;
|
|
36
|
+
}
|
|
37
|
+
var TSCIRCUIT_GLOBAL_CIRCUIT_WORKER: CircuitWebWorker | undefined;
|
|
38
|
+
}
|
|
33
39
|
declare const createCircuitWebWorker: (configuration: Partial<WebWorkerConfiguration>) => Promise<CircuitWebWorker>;
|
|
34
40
|
|
|
35
41
|
export { type CircuitWebWorker, type WebWorkerConfiguration, createCircuitWebWorker, getImportsFromCode };
|
package/dist/worker.js
CHANGED
|
@@ -19,6 +19,25 @@ var getImportsFromCode = (code) => {
|
|
|
19
19
|
|
|
20
20
|
// lib/worker.ts
|
|
21
21
|
var createCircuitWebWorker = async (configuration) => {
|
|
22
|
+
const existingWorker = globalThis.TSCIRCUIT_GLOBAL_CIRCUIT_WORKER;
|
|
23
|
+
if (existingWorker && typeof existingWorker.kill === "function") {
|
|
24
|
+
if (configuration.verbose) {
|
|
25
|
+
console.log("[Worker] Killing previous global worker instance...");
|
|
26
|
+
}
|
|
27
|
+
try {
|
|
28
|
+
await existingWorker.kill();
|
|
29
|
+
} catch (e) {
|
|
30
|
+
if (configuration.verbose) {
|
|
31
|
+
console.warn(
|
|
32
|
+
"[Worker] Error killing previous global worker instance:",
|
|
33
|
+
e
|
|
34
|
+
);
|
|
35
|
+
}
|
|
36
|
+
if (globalThis.TSCIRCUIT_GLOBAL_CIRCUIT_WORKER === existingWorker) {
|
|
37
|
+
globalThis.TSCIRCUIT_GLOBAL_CIRCUIT_WORKER = void 0;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
}
|
|
22
41
|
if (configuration.verbose) {
|
|
23
42
|
console.log(
|
|
24
43
|
"[Worker] Creating circuit web worker with config:",
|
|
@@ -63,12 +82,16 @@ var createCircuitWebWorker = async (configuration) => {
|
|
|
63
82
|
comlinkWorker[Comlink.releaseProxy]();
|
|
64
83
|
rawWorker.terminate();
|
|
65
84
|
isTerminated = true;
|
|
85
|
+
if (globalThis.TSCIRCUIT_GLOBAL_CIRCUIT_WORKER === wrapper) {
|
|
86
|
+
globalThis.TSCIRCUIT_GLOBAL_CIRCUIT_WORKER = void 0;
|
|
87
|
+
}
|
|
66
88
|
}
|
|
67
89
|
};
|
|
90
|
+
globalThis.TSCIRCUIT_GLOBAL_CIRCUIT_WORKER = wrapper;
|
|
68
91
|
return wrapper;
|
|
69
92
|
};
|
|
70
93
|
export {
|
|
71
94
|
createCircuitWebWorker,
|
|
72
95
|
getImportsFromCode
|
|
73
96
|
};
|
|
74
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
97
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vbGliL3dvcmtlci50cyIsICIuLi9saWIvdXRpbHMvZ2V0LWltcG9ydHMtZnJvbS1jb2RlLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyJpbXBvcnQgKiBhcyBDb21saW5rIGZyb20gXCJjb21saW5rXCJcbmV4cG9ydCAqIGZyb20gXCIuL3V0aWxzL2luZGV4XCJcbmltcG9ydCB0eXBlIHtcbiAgSW50ZXJuYWxXZWJXb3JrZXJBcGksXG4gIFdlYldvcmtlckNvbmZpZ3VyYXRpb24sXG4gIENpcmN1aXRXZWJXb3JrZXIsXG59IGZyb20gXCIuL3NoYXJlZC90eXBlc1wiXG5pbXBvcnQgdHlwZSB7IFJvb3RDaXJjdWl0RXZlbnROYW1lIH0gZnJvbSBcIkB0c2NpcmN1aXQvY29yZVwiXG5cbmV4cG9ydCB0eXBlIHsgQ2lyY3VpdFdlYldvcmtlciwgV2ViV29ya2VyQ29uZmlndXJhdGlvbiB9XG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgaW50ZXJmYWNlIFdpbmRvdyB7XG4gICAgVFNDSVJDVUlUX0dMT0JBTF9DSVJDVUlUX1dPUktFUjogQ2lyY3VpdFdlYldvcmtlciB8IHVuZGVmaW5lZFxuICB9XG4gIHZhciBUU0NJUkNVSVRfR0xPQkFMX0NJUkNVSVRfV09SS0VSOiBDaXJjdWl0V2ViV29ya2VyIHwgdW5kZWZpbmVkXG59XG5cbmV4cG9ydCBjb25zdCBjcmVhdGVDaXJjdWl0V2ViV29ya2VyID0gYXN5bmMgKFxuICBjb25maWd1cmF0aW9uOiBQYXJ0aWFsPFdlYldvcmtlckNvbmZpZ3VyYXRpb24+LFxuKTogUHJvbWlzZTxDaXJjdWl0V2ViV29ya2VyPiA9PiB7XG4gIC8vIEtpbGwgZXhpc3RpbmcgZ2xvYmFsIHdvcmtlciBpbnN0YW5jZSBpZiBwcmVzZW50XG4gIGNvbnN0IGV4aXN0aW5nV29ya2VyID0gZ2xvYmFsVGhpcy5UU0NJUkNVSVRfR0xPQkFMX0NJUkNVSVRfV09SS0VSXG4gIGlmIChleGlzdGluZ1dvcmtlciAmJiB0eXBlb2YgZXhpc3RpbmdXb3JrZXIua2lsbCA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgaWYgKGNvbmZpZ3VyYXRpb24udmVyYm9zZSkge1xuICAgICAgY29uc29sZS5sb2coXCJbV29ya2VyXSBLaWxsaW5nIHByZXZpb3VzIGdsb2JhbCB3b3JrZXIgaW5zdGFuY2UuLi5cIilcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGV4aXN0aW5nV29ya2VyLmtpbGwoKVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGlmIChjb25maWd1cmF0aW9uLnZlcmJvc2UpIHtcbiAgICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgIFwiW1dvcmtlcl0gRXJyb3Iga2lsbGluZyBwcmV2aW91cyBnbG9iYWwgd29ya2VyIGluc3RhbmNlOlwiLFxuICAgICAgICAgIGUsXG4gICAgICAgIClcbiAgICAgIH1cbiAgICAgIC8vIEVuc3VyZSB0aGUga2V5IGlzIGNsZWFyZWQgZXZlbiBpZiBraWxsIHRocm93cyBhbiBlcnJvclxuICAgICAgaWYgKGdsb2JhbFRoaXMuVFNDSVJDVUlUX0dMT0JBTF9DSVJDVUlUX1dPUktFUiA9PT0gZXhpc3RpbmdXb3JrZXIpIHtcbiAgICAgICAgZ2xvYmFsVGhpcy5UU0NJUkNVSVRfR0xPQkFMX0NJUkNVSVRfV09SS0VSID0gdW5kZWZpbmVkXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgaWYgKGNvbmZpZ3VyYXRpb24udmVyYm9zZSkge1xuICAgIGNvbnNvbGUubG9nKFxuICAgICAgXCJbV29ya2VyXSBDcmVhdGluZyBjaXJjdWl0IHdlYiB3b3JrZXIgd2l0aCBjb25maWc6XCIsXG4gICAgICBjb25maWd1cmF0aW9uLFxuICAgIClcbiAgfVxuXG4gIGxldCB3b3JrZXJCbG9iVXJsID1cbiAgICBjb25maWd1cmF0aW9uLndlYldvcmtlckJsb2JVcmwgPz8gY29uZmlndXJhdGlvbi53ZWJXb3JrZXJVcmxcblxuICBpZiAoIXdvcmtlckJsb2JVcmwpIHtcbiAgICBjb25zdCBjZG5VcmwgPSBgaHR0cHM6Ly9jZG4uanNkZWxpdnIubmV0L25wbS9AdHNjaXJjdWl0L2V2YWxAJHtjb25maWd1cmF0aW9uLmV2YWxWZXJzaW9uID8/IFwibGF0ZXN0XCJ9L2Rpc3Qvd2Vid29ya2VyL2VudHJ5cG9pbnQuanNgXG5cbiAgICBjb25zdCB3b3JrZXJCbG9iID0gYXdhaXQgZmV0Y2goY2RuVXJsKS50aGVuKChyZXMpID0+IHJlcy5ibG9iKCkpXG4gICAgd29ya2VyQmxvYlVybCA9IFVSTC5jcmVhdGVPYmplY3RVUkwod29ya2VyQmxvYilcbiAgfVxuXG4gIGNvbnN0IHJhd1dvcmtlciA9IG5ldyBXb3JrZXIod29ya2VyQmxvYlVybCwgeyB0eXBlOiBcIm1vZHVsZVwiIH0pXG4gIGNvbnN0IGNvbWxpbmtXb3JrZXIgPSBDb21saW5rLndyYXA8SW50ZXJuYWxXZWJXb3JrZXJBcGk+KHJhd1dvcmtlcilcblxuICBpZiAoY29uZmlndXJhdGlvbi5zbmlwcGV0c0FwaUJhc2VVcmwpIHtcbiAgICBhd2FpdCBjb21saW5rV29ya2VyLnNldFNuaXBwZXRzQXBpQmFzZVVybChjb25maWd1cmF0aW9uLnNuaXBwZXRzQXBpQmFzZVVybClcbiAgfVxuXG4gIGxldCBpc1Rlcm1pbmF0ZWQgPSBmYWxzZVxuXG4gIC8vIENyZWF0ZSBhIHdyYXBwZXIgdGhhdCBoYW5kbGVzIGV2ZW50cyBkaXJlY3RseSB0aHJvdWdoIGNpcmN1aXQgaW5zdGFuY2VcbiAgY29uc3Qgd3JhcHBlcjogQ2lyY3VpdFdlYldvcmtlciA9IHtcbiAgICBjbGVhckV2ZW50TGlzdGVuZXJzOiBjb21saW5rV29ya2VyLmNsZWFyRXZlbnRMaXN0ZW5lcnMuYmluZChjb21saW5rV29ya2VyKSxcbiAgICBleGVjdXRlOiBhc3luYyAoLi4uYXJncykgPT4ge1xuICAgICAgaWYgKGlzVGVybWluYXRlZCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDaXJjdWl0V2ViV29ya2VyIHdhcyB0ZXJtaW5hdGVkLCBjYW4ndCBleGVjdXRlXCIpXG4gICAgICB9XG4gICAgICByZXR1cm4gY29tbGlua1dvcmtlci5leGVjdXRlLmJpbmQoY29tbGlua1dvcmtlcikoLi4uYXJncylcbiAgICB9LFxuICAgIGV4ZWN1dGVXaXRoRnNNYXA6IGFzeW5jICguLi5hcmdzKSA9PiB7XG4gICAgICBpZiAoaXNUZXJtaW5hdGVkKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBcIkNpcmN1aXRXZWJXb3JrZXIgd2FzIHRlcm1pbmF0ZWQsIGNhbid0IGV4ZWN1dGVXaXRoRnNNYXBcIixcbiAgICAgICAgKVxuICAgICAgfVxuICAgICAgcmV0dXJuIGNvbWxpbmtXb3JrZXIuZXhlY3V0ZVdpdGhGc01hcC5iaW5kKGNvbWxpbmtXb3JrZXIpKC4uLmFyZ3MpXG4gICAgfSxcbiAgICByZW5kZXJVbnRpbFNldHRsZWQ6IGNvbWxpbmtXb3JrZXIucmVuZGVyVW50aWxTZXR0bGVkLmJpbmQoY29tbGlua1dvcmtlciksXG4gICAgZ2V0Q2lyY3VpdEpzb246IGNvbWxpbmtXb3JrZXIuZ2V0Q2lyY3VpdEpzb24uYmluZChjb21saW5rV29ya2VyKSxcbiAgICBvbjogKGV2ZW50OiBzdHJpbmcsIGNhbGxiYWNrOiAoLi4uYXJnczogYW55W10pID0+IHZvaWQpID0+IHtcbiAgICAgIGNvbnN0IHByb3hpZWRDYWxsYmFjayA9IENvbWxpbmsucHJveHkoY2FsbGJhY2spXG4gICAgICBjb21saW5rV29ya2VyLm9uKGV2ZW50IGFzIFJvb3RDaXJjdWl0RXZlbnROYW1lLCBwcm94aWVkQ2FsbGJhY2spXG4gICAgfSxcbiAgICBraWxsOiBhc3luYyAoKSA9PiB7XG4gICAgICBjb21saW5rV29ya2VyW0NvbWxpbmsucmVsZWFzZVByb3h5XSgpXG4gICAgICByYXdXb3JrZXIudGVybWluYXRlKClcbiAgICAgIGlzVGVybWluYXRlZCA9IHRydWVcbiAgICAgIGlmIChnbG9iYWxUaGlzLlRTQ0lSQ1VJVF9HTE9CQUxfQ0lSQ1VJVF9XT1JLRVIgPT09IHdyYXBwZXIpIHtcbiAgICAgICAgZ2xvYmFsVGhpcy5UU0NJUkNVSVRfR0xPQkFMX0NJUkNVSVRfV09SS0VSID0gdW5kZWZpbmVkXG4gICAgICB9XG4gICAgfSxcbiAgfVxuICBnbG9iYWxUaGlzLlRTQ0lSQ1VJVF9HTE9CQUxfQ0lSQ1VJVF9XT1JLRVIgPSB3cmFwcGVyXG4gIHJldHVybiB3cmFwcGVyXG59XG4iLCAiZXhwb3J0IGNvbnN0IGdldEltcG9ydHNGcm9tQ29kZSA9IChjb2RlOiBzdHJpbmcpOiBzdHJpbmdbXSA9PiB7XG4gIC8vIE1hdGNoIGJhc2ljIGltcG9ydCBwYXR0ZXJucyBpbmNsdWRpbmcgY29tYmluZWQgZGVmYXVsdCBhbmQgbmFtZXNwYWNlIGltcG9ydHNcbiAgY29uc3QgaW1wb3J0UmVnZXggPVxuICAgIC9eXFxzKmltcG9ydFxccysoPzooPzpbXFx3XFxzXSssXFxzKik/KD86XFwqXFxzK2FzXFxzK1tcXHdcXHNdK3xcXHtbXFxzXFx3LF0rXFx9fFxcdyspXFxzK2Zyb21cXHMrKT9bJ1wiXSguKz8pWydcIl0vZ21cbiAgY29uc3QgaW1wb3J0czogc3RyaW5nW10gPSBbXVxuICBsZXQgbWF0Y2g6IFJlZ0V4cEV4ZWNBcnJheSB8IG51bGxcblxuICAvLyBiaW9tZS1pZ25vcmUgbGludC9zdXNwaWNpb3VzL25vQXNzaWduSW5FeHByZXNzaW9uczogPGV4cGxhbmF0aW9uPlxuICB3aGlsZSAoKG1hdGNoID0gaW1wb3J0UmVnZXguZXhlYyhjb2RlKSkgIT09IG51bGwpIHtcbiAgICBpbXBvcnRzLnB1c2gobWF0Y2hbMV0pXG4gIH1cblxuICAvLyBNYXRjaCByZS1leHBvcnRzXG4gIGNvbnN0IHJlRXhwb3J0UmVnZXggPVxuICAgIC9eXFxzKmV4cG9ydFxccysoPzpcXCp8KD86XFx7W1xcc1xcdyxdK1xcfSkpXFxzK2Zyb21cXHMrWydcIl0oLis/KVsnXCJdL2dtXG4gIGxldCByZUV4cG9ydE1hdGNoOiBSZWdFeHBFeGVjQXJyYXkgfCBudWxsXG4gIC8vIGJpb21lLWlnbm9yZSBsaW50L3N1c3BpY2lvdXMvbm9Bc3NpZ25JbkV4cHJlc3Npb25zOiA8ZXhwbGFuYXRpb24+XG4gIHdoaWxlICgocmVFeHBvcnRNYXRjaCA9IHJlRXhwb3J0UmVnZXguZXhlYyhjb2RlKSkgIT09IG51bGwpIHtcbiAgICBpbXBvcnRzLnB1c2gocmVFeHBvcnRNYXRjaFsxXSlcbiAgfVxuXG4gIHJldHVybiBpbXBvcnRzXG59XG4iXSwKICAibWFwcGluZ3MiOiAiO0FBQUEsWUFBWSxhQUFhOzs7QUNBbEIsSUFBTSxxQkFBcUIsQ0FBQyxTQUEyQjtBQUU1RCxRQUFNLGNBQ0o7QUFDRixRQUFNLFVBQW9CLENBQUM7QUFDM0IsTUFBSTtBQUdKLFVBQVEsUUFBUSxZQUFZLEtBQUssSUFBSSxPQUFPLE1BQU07QUFDaEQsWUFBUSxLQUFLLE1BQU0sQ0FBQyxDQUFDO0FBQUEsRUFDdkI7QUFHQSxRQUFNLGdCQUNKO0FBQ0YsTUFBSTtBQUVKLFVBQVEsZ0JBQWdCLGNBQWMsS0FBSyxJQUFJLE9BQU8sTUFBTTtBQUMxRCxZQUFRLEtBQUssY0FBYyxDQUFDLENBQUM7QUFBQSxFQUMvQjtBQUVBLFNBQU87QUFDVDs7O0FESk8sSUFBTSx5QkFBeUIsT0FDcEMsa0JBQzhCO0FBRTlCLFFBQU0saUJBQWlCLFdBQVc7QUFDbEMsTUFBSSxrQkFBa0IsT0FBTyxlQUFlLFNBQVMsWUFBWTtBQUMvRCxRQUFJLGNBQWMsU0FBUztBQUN6QixjQUFRLElBQUkscURBQXFEO0FBQUEsSUFDbkU7QUFDQSxRQUFJO0FBQ0YsWUFBTSxlQUFlLEtBQUs7QUFBQSxJQUM1QixTQUFTLEdBQUc7QUFDVixVQUFJLGNBQWMsU0FBUztBQUN6QixnQkFBUTtBQUFBLFVBQ047QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLE1BQ0Y7QUFFQSxVQUFJLFdBQVcsb0NBQW9DLGdCQUFnQjtBQUNqRSxtQkFBVyxrQ0FBa0M7QUFBQSxNQUMvQztBQUFBLElBQ0Y7QUFBQSxFQUNGO0FBRUEsTUFBSSxjQUFjLFNBQVM7QUFDekIsWUFBUTtBQUFBLE1BQ047QUFBQSxNQUNBO0FBQUEsSUFDRjtBQUFBLEVBQ0Y7QUFFQSxNQUFJLGdCQUNGLGNBQWMsb0JBQW9CLGNBQWM7QUFFbEQsTUFBSSxDQUFDLGVBQWU7QUFDbEIsVUFBTSxTQUFTLGdEQUFnRCxjQUFjLGVBQWUsUUFBUTtBQUVwRyxVQUFNLGFBQWEsTUFBTSxNQUFNLE1BQU0sRUFBRSxLQUFLLENBQUMsUUFBUSxJQUFJLEtBQUssQ0FBQztBQUMvRCxvQkFBZ0IsSUFBSSxnQkFBZ0IsVUFBVTtBQUFBLEVBQ2hEO0FBRUEsUUFBTSxZQUFZLElBQUksT0FBTyxlQUFlLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFDOUQsUUFBTSxnQkFBd0IsYUFBMkIsU0FBUztBQUVsRSxNQUFJLGNBQWMsb0JBQW9CO0FBQ3BDLFVBQU0sY0FBYyxzQkFBc0IsY0FBYyxrQkFBa0I7QUFBQSxFQUM1RTtBQUVBLE1BQUksZUFBZTtBQUduQixRQUFNLFVBQTRCO0FBQUEsSUFDaEMscUJBQXFCLGNBQWMsb0JBQW9CLEtBQUssYUFBYTtBQUFBLElBQ3pFLFNBQVMsVUFBVSxTQUFTO0FBQzFCLFVBQUksY0FBYztBQUNoQixjQUFNLElBQUksTUFBTSxnREFBZ0Q7QUFBQSxNQUNsRTtBQUNBLGFBQU8sY0FBYyxRQUFRLEtBQUssYUFBYSxFQUFFLEdBQUcsSUFBSTtBQUFBLElBQzFEO0FBQUEsSUFDQSxrQkFBa0IsVUFBVSxTQUFTO0FBQ25DLFVBQUksY0FBYztBQUNoQixjQUFNLElBQUk7QUFBQSxVQUNSO0FBQUEsUUFDRjtBQUFBLE1BQ0Y7QUFDQSxhQUFPLGNBQWMsaUJBQWlCLEtBQUssYUFBYSxFQUFFLEdBQUcsSUFBSTtBQUFBLElBQ25FO0FBQUEsSUFDQSxvQkFBb0IsY0FBYyxtQkFBbUIsS0FBSyxhQUFhO0FBQUEsSUFDdkUsZ0JBQWdCLGNBQWMsZUFBZSxLQUFLLGFBQWE7QUFBQSxJQUMvRCxJQUFJLENBQUMsT0FBZSxhQUF1QztBQUN6RCxZQUFNLGtCQUEwQixjQUFNLFFBQVE7QUFDOUMsb0JBQWMsR0FBRyxPQUErQixlQUFlO0FBQUEsSUFDakU7QUFBQSxJQUNBLE1BQU0sWUFBWTtBQUNoQixvQkFBc0Isb0JBQVksRUFBRTtBQUNwQyxnQkFBVSxVQUFVO0FBQ3BCLHFCQUFlO0FBQ2YsVUFBSSxXQUFXLG9DQUFvQyxTQUFTO0FBQzFELG1CQUFXLGtDQUFrQztBQUFBLE1BQy9DO0FBQUEsSUFDRjtBQUFBLEVBQ0Y7QUFDQSxhQUFXLGtDQUFrQztBQUM3QyxTQUFPO0FBQ1Q7IiwKICAibmFtZXMiOiBbXQp9Cg==
|
package/lib/worker.ts
CHANGED
|
@@ -9,9 +9,38 @@ import type { RootCircuitEventName } from "@tscircuit/core"
|
|
|
9
9
|
|
|
10
10
|
export type { CircuitWebWorker, WebWorkerConfiguration }
|
|
11
11
|
|
|
12
|
+
declare global {
|
|
13
|
+
interface Window {
|
|
14
|
+
TSCIRCUIT_GLOBAL_CIRCUIT_WORKER: CircuitWebWorker | undefined
|
|
15
|
+
}
|
|
16
|
+
var TSCIRCUIT_GLOBAL_CIRCUIT_WORKER: CircuitWebWorker | undefined
|
|
17
|
+
}
|
|
18
|
+
|
|
12
19
|
export const createCircuitWebWorker = async (
|
|
13
20
|
configuration: Partial<WebWorkerConfiguration>,
|
|
14
21
|
): Promise<CircuitWebWorker> => {
|
|
22
|
+
// Kill existing global worker instance if present
|
|
23
|
+
const existingWorker = globalThis.TSCIRCUIT_GLOBAL_CIRCUIT_WORKER
|
|
24
|
+
if (existingWorker && typeof existingWorker.kill === "function") {
|
|
25
|
+
if (configuration.verbose) {
|
|
26
|
+
console.log("[Worker] Killing previous global worker instance...")
|
|
27
|
+
}
|
|
28
|
+
try {
|
|
29
|
+
await existingWorker.kill()
|
|
30
|
+
} catch (e) {
|
|
31
|
+
if (configuration.verbose) {
|
|
32
|
+
console.warn(
|
|
33
|
+
"[Worker] Error killing previous global worker instance:",
|
|
34
|
+
e,
|
|
35
|
+
)
|
|
36
|
+
}
|
|
37
|
+
// Ensure the key is cleared even if kill throws an error
|
|
38
|
+
if (globalThis.TSCIRCUIT_GLOBAL_CIRCUIT_WORKER === existingWorker) {
|
|
39
|
+
globalThis.TSCIRCUIT_GLOBAL_CIRCUIT_WORKER = undefined
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
|
|
15
44
|
if (configuration.verbose) {
|
|
16
45
|
console.log(
|
|
17
46
|
"[Worker] Creating circuit web worker with config:",
|
|
@@ -65,8 +94,11 @@ export const createCircuitWebWorker = async (
|
|
|
65
94
|
comlinkWorker[Comlink.releaseProxy]()
|
|
66
95
|
rawWorker.terminate()
|
|
67
96
|
isTerminated = true
|
|
97
|
+
if (globalThis.TSCIRCUIT_GLOBAL_CIRCUIT_WORKER === wrapper) {
|
|
98
|
+
globalThis.TSCIRCUIT_GLOBAL_CIRCUIT_WORKER = undefined
|
|
99
|
+
}
|
|
68
100
|
},
|
|
69
101
|
}
|
|
70
|
-
|
|
102
|
+
globalThis.TSCIRCUIT_GLOBAL_CIRCUIT_WORKER = wrapper
|
|
71
103
|
return wrapper
|
|
72
104
|
}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@tscircuit/eval",
|
|
3
3
|
"main": "dist/lib/index.js",
|
|
4
|
-
"version": "0.0.
|
|
4
|
+
"version": "0.0.192",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"scripts": {
|
|
7
7
|
"build": "bun run build:lib && bun run build:webworker && bun run build:blob-url && bun run build:runner && bun run build:worker-wrapper",
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { afterEach } from "bun:test"
|
|
2
|
+
|
|
3
|
+
// Clean up all workers after each test
|
|
4
|
+
afterEach(async () => {
|
|
5
|
+
if (globalThis.TSCIRCUIT_GLOBAL_CIRCUIT_WORKER) {
|
|
6
|
+
await globalThis.TSCIRCUIT_GLOBAL_CIRCUIT_WORKER.kill()
|
|
7
|
+
globalThis.TSCIRCUIT_GLOBAL_CIRCUIT_WORKER = undefined
|
|
8
|
+
}
|
|
9
|
+
})
|