sliftutils 1.7.22 → 1.7.24
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/index.d.ts +14 -10
- package/package.json +1 -1
- package/storage/ArchivesDisk.ts +1 -1
- package/storage/IArchives.d.ts +1 -0
- package/storage/IArchives.ts +4 -0
- package/storage/backblaze.ts +1 -1
- package/storage/dist/IArchives.ts.cache +2 -2
- package/storage/dist/backblaze.ts.cache +4 -4
- package/storage/remoteStorage/ArchivesRemote.ts +1 -1
- package/storage/remoteStorage/ArchivesUrl.ts +1 -1
- package/storage/remoteStorage/blobStore.d.ts +11 -4
- package/storage/remoteStorage/blobStore.ts +159 -46
- package/storage/remoteStorage/createArchives.ts +13 -3
- package/storage/remoteStorage/deployTakeover.d.ts +2 -5
- package/storage/remoteStorage/deployTakeover.ts +7 -38
- package/storage/remoteStorage/dist/ArchivesRemote.ts.cache +7 -7
- package/storage/remoteStorage/dist/blobStore.ts.cache +171 -56
- package/storage/remoteStorage/dist/createArchives.ts.cache +15 -4
- package/storage/remoteStorage/dist/deployTakeover.ts.cache +40 -35
- package/storage/remoteStorage/dist/sourceWrapper.ts.cache +4 -4
- package/storage/remoteStorage/dist/storageController.ts.cache +18 -9
- package/storage/remoteStorage/dist/storageServerState.ts.cache +178 -32
- package/storage/remoteStorage/sourceWrapper.ts +2 -2
- package/storage/remoteStorage/spec.md +19 -1
- package/storage/remoteStorage/storageServerState.d.ts +0 -1
- package/storage/remoteStorage/storageServerState.ts +153 -25
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
"use strict";
|
|
1
|
+
"use strict"; var console = (function shimConsole() { let baseConsole = globalThis.console; if (typeof window !== "undefined") return baseConsole; let name = __filename.replaceAll("\\", "/").split("/").pop(); let dirName = __dirname.replaceAll("\\", "/").split("/").pop(); let context = { __FILE__: __filename, __DIR__: __dirname, __NAME__: name, __DIRNAME__: dirName }; let newConsole = { ...baseConsole }; for (let shim of ["log", "info", "warn", "error"]) { newConsole[shim] = (...args) => { args.push(context); baseConsole[shim](...args); }; } newConsole.__context = context; return newConsole; })(); "use strict";
|
|
2
2
|
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
3
|
return (mod && mod.__esModule && mod.default) ? mod : { "default": mod };
|
|
4
4
|
};
|
|
@@ -274,7 +274,7 @@ class ArchivesBackblaze {
|
|
|
274
274
|
console.log(text);
|
|
275
275
|
}
|
|
276
276
|
getDebugName() {
|
|
277
|
-
return "backblaze
|
|
277
|
+
return "backblaze " + this.config.bucketName;
|
|
278
278
|
}
|
|
279
279
|
// IMPORTANT! We must always CATCH AROUND the apiRetryLogic, NEVER inside of fnc. Otherwise we won't
|
|
280
280
|
// be able to recreate the auth token.
|
|
@@ -797,5 +797,5 @@ exports.getArchivesBackblazePublic = (0, caching_1.cache)((domain) => {
|
|
|
797
797
|
allowedOrigins: [`https://${domain}`, `https://127-0-0-1.${domain}:7007`],
|
|
798
798
|
});
|
|
799
799
|
});
|
|
800
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFja2JsYXplLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiYmFja2JsYXplLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLHlEQUEwRDtBQUcxRCxtREFBa0Y7QUFDbEYsMkRBQXFEO0FBQ3JELGtFQUFpRjtBQUNqRix3RUFBZ0Y7QUFFaEYsOENBQXNCO0FBQ3RCLGlEQUE4QztBQUM5QyxxREFBeUQ7QUFDekQsMkNBQXVHO0FBT3ZHLElBQUksY0FBYyxHQUFHLElBQUEsY0FBSSxFQUFDLEtBQUssSUFBNkIsRUFBRTtJQUMxRCxJQUFJLEtBQUssR0FBRyxNQUFNLElBQUEscUJBQVMsRUFBQyxpQ0FBaUMsQ0FBQyxDQUFDO0lBQy9ELElBQUksR0FBRyxHQUFHLE1BQU0sSUFBQSxxQkFBUyxFQUFDLCtCQUErQixDQUFDLENBQUM7SUFDM0QsT0FBTztRQUNILGdCQUFnQixFQUFFLEtBQUs7UUFDdkIsY0FBYyxFQUFFLEdBQUc7S0FDdEIsQ0FBQztBQUNOLENBQUMsQ0FBQyxDQUFDO0FBQ0gsTUFBTSxNQUFNLEdBQUcsSUFBQSxjQUFJLEVBQUMsS0FBSyxJQUFJLEVBQUU7SUFDM0IsSUFBSSxLQUFLLEdBQUcsTUFBTSxjQUFjLEVBQUUsQ0FBQztJQUVuQyw0RkFBNEY7SUFDNUYsb0VBQW9FO0lBQ3BFLElBQUksWUFBWSxHQUFHLE1BQU0sSUFBQSxvQkFBWSxFQUFDLDJEQUEyRCxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFO1FBQzVILE9BQU8sRUFBRTtZQUNMLGFBQWEsRUFBRSxRQUFRLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsZ0JBQWdCLEdBQUcsR0FBRyxHQUFHLEtBQUssQ0FBQyxjQUFjLENBQUMsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDO1NBQ2hIO0tBQ0osQ0FBQyxDQUFDO0lBRUgsSUFBSSxJQUFJLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxZQUFZLENBQUMsUUFBUSxFQUFFLENB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bGF6eSB9IGZyb20gXCJzb2NrZXQtZnVuY3Rpb24vc3JjL2NhY2hpbmdcIjtcbmltcG9ydCBmcyBmcm9tIFwiZnNcIjtcbmltcG9ydCBvcyBmcm9tIFwib3NcIjtcbmltcG9ydCB7IGlzTm9kZSwgc29ydCwgdGltZUluSG91ciwgdGltZUluTWludXRlIH0gZnJvbSBcInNvY2tldC1mdW5jdGlvbi9zcmMvbWlzY1wiO1xuaW1wb3J0IHsgZGVsYXkgfSBmcm9tIFwic29ja2V0LWZ1bmN0aW9uL3NyYy9iYXRjaGluZ1wiO1xuaW1wb3J0IHsgZm9ybWF0TnVtYmVyLCBmb3JtYXRUaW1lIH0gZnJvbSBcInNvY2tldC1mdW5jdGlvbi9zcmMvZm9ybWF0dGluZy9mb3JtYXRcIjtcbmltcG9ydCB7IGJsdWUsIGdyZWVuLCBtYWdlbnRhIH0gZnJvbSBcInNvY2tldC1mdW5jdGlvbi9zcmMvZm9ybWF0dGluZy9sb2dDb2xvcnNcIjtcbmltcG9ydCBkZWJ1Z2JyZWFrIGZyb20gXCJkZWJ1Z2JyZWFrXCI7XG5pbXBvcnQgZG5zIGZyb20gXCJkbnNcIjtcbmltcG9ydCB7IGdldFNlY3JldCB9IGZyb20gXCIuLi9taXNjL2dldFNlY3JldFwiO1xuaW1wb3J0IHsgaHR0cHNSZXF1ZXN0IH0gZnJvbSBcInNvY2tldC1mdW5jdGlvbi9zcmMvaHR0cHNcIjtcbmltcG9ydCB7IElBcmNoaXZlcywgQXJjaGl2ZXNDb25maWcsIGFzc2VydFZhbGlkTGFzdE1vZGlmaWVkLCBJTU1VVEFCTEVfQ0FDSEVfVElNRSB9IGZyb20gXCIuL0lBcmNoaXZlc1wiO1xuXG50eXBlIEJhY2tibGF6ZUNyZWRzID0ge1xuICAgIGFwcGxpY2F0aW9uS2V5SWQ6IHN0cmluZztcbiAgICBhcHBsaWNhdGlvbktleTogc3RyaW5nO1xufTtcblxubGV0IGJhY2tibGF6ZUNyZWRzID0gbGF6eShhc3luYyAoKTogUHJvbWlzZTxCYWNrYmxhemVDcmVkcz4gPT4ge1xuICAgIGxldCBrZXlJZCA9IGF3YWl0IGdldFNlY3JldChcImJhY2tibGF6ZS5qc29uLmFwcGxpY2F0aW9uS2V5SWRcIik7XG4gICAgbGV0IGtleSA9IGF3YWl0IGdldFNlY3JldChcImJhY2tibGF6ZS5qc29uLmFwcGxpY2F0aW9uS2V5XCIpO1xuICAgIHJldHVybiB7XG4gICAgICAgIGFwcGxpY2F0aW9uS2V5SWQ6IGtleUlkLFxuICAgICAgICBhcHBsaWNhdGlvbktleToga2V5LFxuICAgIH07XG59KTtcbmNvbnN0IGdldEFQSSA9IGxhenkoYXN5bmMgKCkgPT4ge1xuICAgIGxldCBjcmVkcyA9IGF3YWl0IGJhY2tibGF6ZUNyZWRzKCk7XG5cbiAgICAvLyBOT1RFOiBPbiBlcnJvcnMsIG91ciByZXRyeSBjb2RlIHJlc2V0cyB0aGlzIGxhenksIHNvIHdlIERPIGdldCBuZXcgYXV0aG9yaXplIHdoZW4gbmVlZGVkLlxuICAgIC8vIFRPRE86IE1heWJlIHdlIHNob3VsZCBnZXQgbmV3IGF1dGhvcml6YXRpb24gcGVyaW9kaWNhbGx5IGF0IHdlbGw/XG4gICAgbGV0IGF1dGhvcml6ZVJhdyA9IGF3YWl0IGh0dHBzUmVxdWVzdChcImh0dHBzOi8vYXBpLmJhY2tibGF6ZWIyLmNvbS9iMmFwaS92Mi9iMl9hdXRob3JpemVfYWNjb3VudFwiLCB1bmRlZmluZWQsIFwiR0VUXCIsIHVuZGVmaW5lZCwge1xuICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgICBBdXRob3JpemF0aW9uOiBcIkJhc2ljIFwiICsgQnVmZmVyLmZyb20oY3JlZHMuYXBwbGljYXRpb25LZXlJZCArIFwiOlwiICsgY3JlZHMuYXBwbGljYXRpb25LZXkpLnRvU3RyaW5nKFwiYmFzZTY0XCIpLFxuICAgICAgICB9XG4gICAgfSk7XG5cbiAgICBsZXQgYXV0aCA9IEpTT04ucGFyc2UoYXV0aG9yaXplUmF3LnRvU3RyaW5nKCkpIGFzIHtcbiAgICAgICAgYWNjb3VudElkOiBzdHJpbmc7XG4gICAgICAgIGF1dGhvcml6YXRpb25Ub2tlbjogc3RyaW5nO1xuICAgICAgICBhcGlVcmw6IHN0cmluZztcbiAgICAgICAgZG93bmxvYWRVcmw6IHN0cmluZztcbiAgICAgICAgYWxsb3dlZDoge1xuICAgICAgICAgICAgYnVja2V0SWQ6IHN0cmluZztcbiAgICAgICAgICAgIGJ1Y2tldE5hbWU6IHN0cmluZztcbiAgICAgICAgICAgIGNhcGFiaWxpdGllczogc3RyaW5nW107XG4gICAgICAgICAgICBuYW1lUHJlZml4OiBzdHJpbmc7XG4gICAgICAgIH1bXTtcbiAgICB9O1xuXG4gICAgZnVuY3Rpb24gY3JlYXRlQjJGdW5jdGlvbjxBcmcsIFJlc3VsdD4obmFtZTogc3RyaW5nLCB0eXBlOiBcIlBPU1RcIiB8IFwiR0VUXCIsIG5vQWNjb3VudElkPzogXCJub0FjY291bnRJZFwiKTogKGFyZzogQXJnKSA9PiBQcm9taXNlPFJlc3VsdD4ge1xuICAgICAgICByZXR1cm4gYXN5bmMgKGFyZzogQXJnKSA9PiB7XG4gICAgICAgICAgICBpZiAoIW5vQWNjb3VudElkKSB7XG4gICAgICAgICAgICAgICAgYXJnID0geyBhY2NvdW50SWQ6IGF1dGguYWNjb3VudElkLCAuLi5hcmcgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgbGV0IHVybCA9IGF1dGguYXBpVXJsICsgXCIvYjJhcGkvdjIvXCIgKyBuYW1lO1xuICAgICAgICAgICAgICAgIGxldCByZXN1bHQgPSBhd2FpdCBodHRwc1JlcXVlc3QodXJsLCBCdWZmZXIuZnJvbShKU09OLnN0cmluZ2lmeShhcmcpKSwgdHlwZSwgdW5kZWZpbmVkLCB7XG4gICAgICAgICAgICAgICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIEF1dGhvcml6YXRpb246IGF1dGguYXV0aG9yaXphdGlvblRva2VuLFxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIEpTT04ucGFyc2UocmVzdWx0LnRvU3RyaW5nKCkpO1xuICAgICAgICAgICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBFcnJvciBpbiAke25hbWV9LCBhcmcgJHtKU09OLnN0cmluZ2lmeShhcmcpLnNsaWNlKDAsIDEwMDApfTogJHtlLnN0YWNrfWApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgIH1cblxuICAgIGNvbnN0IGNyZWF0ZUJ1Y2tldCA9IGNyZWF0ZUIyRnVuY3Rpb248e1xuICAgICAgICBidWNrZXROYW1lOiBzdHJpbmc7XG4gICAgICAgIGJ1Y2tldFR5cGU6IFwiYWxsUHJpdmF0ZVwiIHwgXCJhbGxQdWJsaWNcIjtcbiAgICAgICAgbGlmZWN5Y2xlUnVsZXM/OiBhbnlbXTtcbiAgICAgICAgY29yc1J1bGVzPzogdW5rbm93bltdO1xuICAgICAgICBidWNrZXRJbmZvPzoge1xuICAgICAgICAgICAgW2tleTogc3RyaW5nXTogdW5rbm93bjtcbiAgICAgICAgfTtcbiAgICB9LCB7XG4gICAgICAgIGFjY291bnRJZDogc3RyaW5nO1xuICAgICAgICBidWNrZXRJZDogc3RyaW5nO1xuICAgICAgICBidWNrZXROYW1lOiBzdHJpbmc7XG4gICAgICAgIGJ1Y2tldFR5cGU6IFwiYWxsUHJpdmF0ZVwiIHwgXCJhbGxQdWJsaWNcIjtcbiAgICAgICAgYnVja2V0SW5mbzoge1xuICAgICAgICAgICAgbGlmZWN5Y2xlUnVsZXM6IGFueVtdO1xuICAgICAgICB9O1xuICAgICAgICBjb3JzUnVsZXM6IGFueVtdO1xuICAgICAgICBsaWZlY3ljbGVSdWxlczogYW55W107XG4gICAgICAgIHJldmlzaW9uOiBudW1iZXI7XG4gICAgfT4oXCJiMl9jcmVhdGVfYnVja2V0XCIsIFwiUE9TVFwiKTtcblxuICAgIGNvbnN0IHVwZGF0ZUJ1Y2tldCA9IGNyZWF0ZUIyRnVuY3Rpb248e1xuICAgICAgICBhY2NvdW50SWQ6IHN0cmluZztcbiAgICAgICAgYnVja2V0SWQ6IHN0cmluZztcbiAgICAgICAgYnVja2V0VHlwZT86IFwiYWxsUHJpdmF0ZVwiIHwgXCJhbGxQdWJsaWNcIjtcbiAgICAgICAgbGlmZWN5Y2xlUnVsZXM/OiBhbnlbXTtcbiAgICAgICAgYnVja2V0SW5mbz86IHtcbiAgICAgICAgICAgIFtrZXk6IHN0cmluZ106IHVua25vd247XG4gICAgICAgIH07XG4gICAgICAgIGNvcnNSdWxlcz86IHVua25vd25bXTtcbiAgICB9LCB7XG4gICAgICAgIGFjY291bnRJZDogc3RyaW5nO1xuICAgICAgICBidWNrZXRJZDogc3RyaW5nO1xuICAgICAgICBidWNrZXROYW1lOiBzdHJpbmc7XG4gICAgICAgIGJ1Y2tldFR5cGU6IFwiYWxsUHJpdmF0ZVwiIHwgXCJhbGxQdWJsaWNcIjtcbiAgICAgICAgYnVja2V0SW5mbzoge1xuICAgICAgICAgICAgbGlmZWN5Y2xlUnVsZXM6IGFueVtdO1xuICAgICAgICB9O1xuICAgICAgICBjb3JzUnVsZXM6IGFueVtdO1xuICAgICAgICBsaWZlY3ljbGVSdWxlczogYW55W107XG4gICAgICAgIHJldmlzaW9uOiBudW1iZXI7XG4gICAgfT4oXCJiMl91cGRhdGVfYnVja2V0XCIsIFwiUE9TVFwiKTtcblxuICAgIC8vIGh0dHBzOi8vd3d3LmJhY2tibGF6ZS5jb20vYXBpZG9jcy9iMi11cGRhdGUtYnVja2V0XG4gICAgLy8gIFRPRE86IGIyX3VwZGF0ZV9idWNrZXQsIHNvIHdlIGNhbiB1cGRhdGUgQ09SUywgZXRjXG5cbiAgICBjb25zdCBsaXN0QnVja2V0cyA9IGNyZWF0ZUIyRnVuY3Rpb248e1xuICAgICAgICBidWNrZXROYW1lPzogc3RyaW5nO1xuICAgIH0sIHtcbiAgICAgICAgYnVja2V0czoge1xuICAgICAgICAgICAgYWNjb3VudElkOiBzdHJpbmc7XG4gICAgICAgICAgICBidWNrZXRJZDogc3RyaW5nO1xuICAgICAgICAgICAgYnVja2V0TmFtZTogc3RyaW5nO1xuICAgICAgICAgICAgYnVja2V0VHlwZTogXCJhbGxQcml2YXRlXCIgfCBcImFsbFB1YmxpY1wiO1xuICAgICAgICAgICAgYnVja2V0SW5mbzoge1xuICAgICAgICAgICAgICAgIGxpZmVjeWNsZVJ1bGVzOiBhbnlbXTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBjb3JzUnVsZXM6IGFueVtdO1xuICAgICAgICAgICAgbGlmZWN5Y2xlUnVsZXM6IGFueVtdO1xuICAgICAgICAgICAgcmV2aXNpb246IG51bWJlcjtcbiAgICAgICAgfVtdO1xuICAgIH0+KFwiYjJfbGlzdF9idWNrZXRzXCIsIFwiUE9TVFwiKTtcblxuICAgIGZ1bmN0aW9uIGVuY29kZVBhdGgocGF0aDogc3RyaW5nKSB7XG4gICAgICAgIC8vIFByZXNlcnZlIHNsYXNoZXMsIGJ1dCBlbmNvZGUgZXZlcnl0aGluZyBlbHNlXG4gICAgICAgIHBhdGggPSBwYXRoLnNwbGl0KFwiL1wiKS5tYXAoZW5jb2RlVVJJQ29tcG9uZW50KS5qb2luKFwiL1wiKTtcbiAgICAgICAgaWYgKHBhdGguc3RhcnRzV2l0aChcIi9cIikpIHBhdGggPSBcIiUyRlwiICsgcGF0aC5zbGljZSgxKTtcbiAgICAgICAgaWYgKHBhdGguZW5kc1dpdGgoXCIvXCIpKSBwYXRoID0gcGF0aC5zbGljZSgwLCAtMSkgKyBcIiUyRlwiO1xuICAgICAgICAvLyBOT1RFOiBGb3Igc29tZSByZWFzb24sIHRoaXMgd29uJ3QgcmVuZGVyIGluIHRoZSB3ZWIgVUkgY29ycmVjdGx5LiBCVVQsIGl0J2xsXG4gICAgICAgIC8vICB3b3JrIGdldCBnZXQvc2V0IGFuZCBmaW5kXG4gICAgICAgIC8vICAtIEFMU08sIGl0IHNlZW1zIHRvIGFkZCBkdXBsaWNhdGUgZmlsZXM/IFRoaXMgbWlnaHQgYWxzbyBiZSBhIHdlYiBVSSB0aGluZy4gSXRcbiAgICAgICAgLy8gICAgICBzZWVtcyB0byB3b3JrIHRob3VnaC5cbiAgICAgICAgd2hpbGUgKHBhdGguaW5jbHVkZXMoXCIvL1wiKSkge1xuICAgICAgICAgICAgcGF0aCA9IHBhdGgucmVwbGFjZUFsbChcIi8vXCIsIFwiLyUyRlwiKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcGF0aDtcbiAgICB9XG5cbiAgICBhc3luYyBmdW5jdGlvbiBkb3dubG9hZEZpbGVCeU5hbWUoY29uZmlnOiB7XG4gICAgICAgIGJ1Y2tldE5hbWU6IHN0cmluZztcbiAgICAgICAgZmlsZU5hbWU6IHN0cmluZztcbiAgICAgICAgcmFuZ2U/OiB7IHN0YXJ0OiBudW1iZXI7IGVuZDogbnVtYmVyOyB9O1xuICAgIH0pIHtcbiAgICAgICAgbGV0IGZpbGVOYW1lID0gZW5jb2RlUGF0aChjb25maWcuZmlsZU5hbWUpO1xuXG4gICAgICAgIGxldCByZXN1bHQgPSBhd2FpdCBodHRwc1JlcXVlc3QoYXV0aC5hcGlVcmwgKyBcIi9maWxlL1wiICsgY29uZmlnLmJ1Y2tldE5hbWUgKyBcIi9cIiArIGZpbGVOYW1lLCBCdWZmZXIuZnJvbShKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgICBhY2NvdW50SWQ6IGF1dGguYWNjb3VudElkLFxuICAgICAgICAgICAgcmVzcG9uc2VUeXBlOiBcImFycmF5YnVmZmVyXCIsXG4gICAgICAgIH0pKSwgXCJHRVRcIiwgdW5kZWZpbmVkLCB7XG4gICAgICAgICAgICBoZWFkZXJzOiBPYmplY3QuZnJvbUVudHJpZXMoT2JqZWN0LmVudHJpZXMoe1xuICAgICAgICAgICAgICAgIEF1dGhvcml6YXRpb246IGF1dGguYXV0aG9yaXphdGlvblRva2VuLFxuICAgICAgICAgICAgICAgIFwiQ29udGVudC1UeXBlXCI6IFwiYXBwbGljYXRpb24vanNvblwiLFxuICAgICAgICAgICAgICAgIFJhbmdlOiBjb25maWcucmFuZ2UgPyBgYnl0ZXM9JHtjb25maWcucmFuZ2Uuc3RhcnR9LSR7Y29uZmlnLnJhbmdlLmVuZCAtIDF9YCA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIH0pLmZpbHRlcih4ID0+IHhbMV0gIT09IHVuZGVmaW5lZCkpLFxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvLyBPaC4uLiBhcHBhcmVudGx5LCB3ZSBjYW4ndCByZXVzZSB0aGVzZT8gSHVoLi4uXG4gICAgY29uc3QgZ2V0VXBsb2FkVVJMID0gKGFzeW5jIChidWNrZXRJZDogc3RyaW5nKSA9PiB7XG4gICAgICAgIC8vc2V0VGltZW91dCgoKSA9PiBnZXRVcGxvYWRVUkwuY2xlYXIoYnVja2V0SWQpLCB0aW1lSW5Ib3VyICogMSk7XG4gICAgICAgIGxldCBnZXRVcGxvYWRVcmxSYXcgPSBhd2FpdCBodHRwc1JlcXVlc3QoYXV0aC5hcGlVcmwgKyBcIi9iMmFwaS92Mi9iMl9nZXRfdXBsb2FkX3VybD9idWNrZXRJZD1cIiArIGJ1Y2tldElkLCB1bmRlZmluZWQsIFwiR0VUXCIsIHVuZGVmaW5lZCwge1xuICAgICAgICAgICAgaGVhZGVyczoge1xuICAgICAgICAgICAgICAgIEF1dGhvcml6YXRpb246IGF1dGguYXV0aG9yaXphdGlvblRva2VuLFxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gSlNPTi5wYXJzZShnZXRVcGxvYWRVcmxSYXcudG9TdHJpbmcoKSkgYXMge1xuICAgICAgICAgICAgYnVja2V0SWQ6IHN0cmluZztcbiAgICAgICAgICAgIHVwbG9hZFVybDogc3RyaW5nO1xuICAgICAgICAgICAgYXV0aG9yaXphdGlvblRva2VuOiBzdHJpbmc7XG4gICAgICAgIH07XG4gICAgfSk7XG5cbiAgICBhc3luYyBmdW5jdGlvbiB1cGxvYWRGaWxlKGNvbmZpZzoge1xuICAgICAgICBidWNrZXRJZDogc3RyaW5nO1xuICAgICAgICBmaWxlTmFtZTogc3RyaW5nO1xuICAgICAgICBkYXRhOiBCdWZmZXI7XG4gICAgfSkge1xuICAgICAgICBsZXQgZ2V0VXBsb2FkVXJsID0gYXdhaXQgZ2V0VXBsb2FkVVJMKGNvbmZpZy5idWNrZXRJZCk7XG5cbiAgICAgICAgYXdhaXQgaHR0cHNSZXF1ZXN0KGdldFVwbG9hZFVybC51cGxvYWRVcmwsIGNvbmZpZy5kYXRhLCBcIlBPU1RcIiwgdW5kZWZpbmVkLCB7XG4gICAgICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgICAgICAgQXV0aG9yaXphdGlvbjogZ2V0VXBsb2FkVXJsLmF1dGhvcml6YXRpb25Ub2tlbixcbiAgICAgICAgICAgICAgICBcIlgtQnotRmlsZS1OYW1lXCI6IGVuY29kZVBhdGgoY29uZmlnLmZpbGVOYW1lKSxcbiAgICAgICAgICAgICAgICBcIkNvbnRlbnQtVHlwZVwiOiBcImIyL3gtYXV0b1wiLFxuICAgICAgICAgICAgICAgIFwiWC1Cei1Db250ZW50LVNoYTFcIjogXCJkb19ub3RfdmVyaWZ5XCIsXG4gICAgICAgICAgICAgICAgXCJDb250ZW50LUxlbmd0aFwiOiBjb25maWcuZGF0YS5sZW5ndGggKyBcIlwiLFxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBjb25zdCBoaWRlRmlsZSA9IGNyZWF0ZUIyRnVuY3Rpb248e1xuICAgICAgICBidWNrZXRJZDogc3RyaW5nO1xuICAgICAgICBmaWxlTmFtZTogc3RyaW5nO1xuICAgIH0sIHt9PihcImIyX2hpZGVfZmlsZVwiLCBcIlBPU1RcIiwgXCJub0FjY291bnRJZFwiKTtcblxuICAgIGNvbnN0IGdldEZpbGVJbmZvID0gY3JlYXRlQjJGdW5jdGlvbjx7XG4gICAgICAgIGJ1Y2tldE5hbWU6IHN0cmluZztcbiAgICAgICAgZmlsZUlkOiBzdHJpbmc7XG4gICAgfSwge1xuICAgICAgICBmaWxlSWQ6IHN0cmluZztcbiAgICAgICAgZmlsZU5hbWU6IHN0cmluZztcbiAgICAgICAgYWNjb3VudElkOiBzdHJpbmc7XG4gICAgICAgIGJ1Y2tldElkOiBzdHJpbmc7XG4gICAgICAgIGNvbnRlbnRMZW5ndGg6IG51bWJlcjtcbiAgICAgICAgY29udGVudFNoYTE6IHN0cmluZztcbiAgICAgICAgY29udGVudFR5cGU6IHN0cmluZztcbiAgICAgICAgZmlsZUluZm86IHtcbiAgICAgICAgICAgIHNyY19sYXN0X21vZGlmaWVkX21pbGxpczogbnVtYmVyO1xuICAgICAgICB9O1xuICAgICAgICBhY3Rpb246IHN0cmluZztcbiAgICAgICAgdXBsb2FkVGltZXN0YW1wOiBudW1iZXI7XG4gICAgfT4oXCJiMl9nZXRfZmlsZV9pbmZvXCIsIFwiUE9TVFwiLCBcIm5vQWNjb3VudElkXCIpO1xuXG4gICAgY29uc3QgbGlzdEZpbGVOYW1lcyA9IGNyZWF0ZUIyRnVuY3Rpb248e1xuICAgICAgICBidWNrZXRJZDogc3RyaW5nO1xuICAgICAgICBwcmVmaXg6IHN0cmluZztcbiAgICAgICAgc3RhcnRGaWxlTmFtZT86IHN0cmluZztcbiAgICAgICAgbWF4RmlsZUNvdW50PzogbnVtYmVyO1xuICAgICAgICBkZWxpbWl0ZXI/OiBzdHJpbmc7XG4gICAgfSwge1xuICAgICAgICBmaWxlczoge1xuICAgICAgICAgICAgZmlsZUlkOiBzdHJpbmc7XG4gICAgICAgICAgICBmaWxlTmFtZTogc3RyaW5nO1xuICAgICAgICAgICAgYWNjb3VudElkOiBzdHJpbmc7XG4gICAgICAgICAgICBidWNrZXRJZDogc3RyaW5nO1xuICAgICAgICAgICAgY29udGVudExlbmd0aDogbnVtYmVyO1xuICAgICAgICAgICAgY29udGVudFNoYTE6IHN0cmluZztcbiAgICAgICAgICAgIGNvbnRlbnRUeXBlOiBzdHJpbmc7XG4gICAgICAgICAgICBmaWxlSW5mbzoge1xuICAgICAgICAgICAgICAgIHNyY19sYXN0X21vZGlmaWVkX21pbGxpczogbnVtYmVyO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGFjdGlvbjogc3RyaW5nO1xuICAgICAgICAgICAgdXBsb2FkVGltZXN0YW1wOiBudW1iZXI7XG4gICAgICAgIH1bXTtcbiAgICAgICAgbmV4dEZpbGVOYW1lOiBzdHJpbmc7XG4gICAgfT4oXCJiMl9saXN0X2ZpbGVfbmFtZXNcIiwgXCJQT1NUXCIsIFwibm9BY2NvdW50SWRcIik7XG5cbiAgICBjb25zdCBjb3B5RmlsZSA9IGNyZWF0ZUIyRnVuY3Rpb248e1xuICAgICAgICBzb3VyY2VGaWxlSWQ6IHN0cmluZztcbiAgICAgICAgZmlsZU5hbWU6IHN0cmluZztcbiAgICAgICAgZGVzdGluYXRpb25CdWNrZXRJZDogc3RyaW5nO1xuICAgIH0sIHt9PihcImIyX2NvcHlfZmlsZVwiLCBcIlBPU1RcIiwgXCJub0FjY291bnRJZFwiKTtcblxuICAgIGNvbnN0IHN0YXJ0TGFyZ2VGaWxlID0gY3JlYXRlQjJGdW5jdGlvbjx7XG4gICAgICAgIGJ1Y2tldElkOiBzdHJpbmc7XG4gICAgICAgIGZpbGVOYW1lOiBzdHJpbmc7XG4gICAgICAgIGNvbnRlbnRUeXBlOiBzdHJpbmc7XG4gICAgICAgIGZpbGVJbmZvOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9O1xuICAgIH0sIHtcbiAgICAgICAgZmlsZUlkOiBzdHJpbmc7XG4gICAgICAgIGZpbGVOYW1lOiBzdHJpbmc7XG4gICAgICAgIGFjY291bnRJZDogc3RyaW5nO1xuICAgICAgICBidWNrZXRJZDogc3RyaW5nO1xuICAgICAgICBjb250ZW50VHlwZTogc3RyaW5nO1xuICAgICAgICBmaWxlSW5mbzogYW55O1xuICAgICAgICB1cGxvYWRUaW1lc3RhbXA6IG51bWJlcjtcbiAgICB9PihcImIyX3N0YXJ0X2xhcmdlX2ZpbGVcIiwgXCJQT1NUXCIsIFwibm9BY2NvdW50SWRcIik7XG5cbiAgICAvLyBBcHBhcmVudGx5IHdlIGNhbid0IHJldXNlIHRoZXNlP1xuICAgIGNvbnN0IGdldFVwbG9hZFBhcnRVUkwgPSAoYXN5bmMgKGZpbGVJZDogc3RyaW5nKSA9PiB7XG4gICAgICAgIGxldCB1cGxvYWRQYXJ0UmF3ID0gYXdhaXQgaHR0cHNSZXF1ZXN0KGF1dGguYXBpVXJsICsgXCIvYjJhcGkvdjIvYjJfZ2V0X3VwbG9hZF9wYXJ0X3VybD9maWxlSWQ9XCIgKyBmaWxlSWQsIHVuZGVmaW5lZCwgXCJHRVRcIiwgdW5kZWZpbmVkLCB7XG4gICAgICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgICAgICAgQXV0aG9yaXphdGlvbjogYXV0aC5hdXRob3JpemF0aW9uVG9rZW4sXG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gSlNPTi5wYXJzZSh1cGxvYWRQYXJ0UmF3LnRvU3RyaW5nKCkpIGFzIHtcbiAgICAgICAgICAgIGZpbGVJZDogc3RyaW5nO1xuICAgICAgICAgICAgcGFydE51bWJlcjogbnVtYmVyO1xuICAgICAgICAgICAgdXBsb2FkVXJsOiBzdHJpbmc7XG4gICAgICAgICAgICBhdXRob3JpemF0aW9uVG9rZW46IHN0cmluZztcbiAgICAgICAgfTtcbiAgICB9KTtcbiAgICBhc3luYyBmdW5jdGlvbiB1cGxvYWRQYXJ0KGNvbmZpZzoge1xuICAgICAgICBmaWxlSWQ6IHN0cmluZztcbiAgICAgICAgcGFydE51bWJlcjogbnVtYmVyO1xuICAgICAgICBkYXRhOiBCdWZmZXI7XG4gICAgICAgIHNoYTE6IHN0cmluZztcbiAgICB9KTogUHJvbWlzZTx7XG4gICAgICAgIGZpbGVJZDogc3RyaW5nO1xuICAgICAgICBwYXJ0TnVtYmVyOiBudW1iZXI7XG4gICAgICAgIGNvbnRlbnRMZW5ndGg6IG51bWJlcjtcbiAgICAgICAgY29udGVudFNoYTE6IHN0cmluZztcbiAgICB9PiB7XG4gICAgICAgIGxldCB1cGxvYWRQYXJ0ID0gYXdhaXQgZ2V0VXBsb2FkUGFydFVSTChjb25maWcuZmlsZUlkKTtcblxuICAgICAgICBsZXQgcmVzdWx0ID0gYXdhaXQgaHR0cHNSZXF1ZXN0KHVwbG9hZFBhcnQudXBsb2FkVXJsLCBjb25maWcuZGF0YSwgXCJQT1NUXCIsIHVuZGVmaW5lZCwge1xuICAgICAgICAgICAgaGVhZGVyczoge1xuICAgICAgICAgICAgICAgIEF1dGhvcml6YXRpb246IHVwbG9hZFBhcnQuYXV0aG9yaXphdGlvblRva2VuLFxuICAgICAgICAgICAgICAgIFwiWC1Cei1QYXJ0LU51bWJlclwiOiBjb25maWcucGFydE51bWJlciArIFwiXCIsXG4gICAgICAgICAgICAgICAgXCJYLUJ6LUNvbnRlbnQtU2hhMVwiOiBjb25maWcuc2hhMSxcbiAgICAgICAgICAgICAgICBcIkNvbnRlbnQtTGVuZ3RoXCI6IGNvbmZpZy5kYXRhLmxlbmd0aCArIFwiXCIsXG5cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBKU09OLnBhcnNlKHJlc3VsdC50b1N0cmluZygpKTtcbiAgICB9XG5cbiAgICBjb25zdCBmaW5pc2hMYXJnZUZpbGUgPSBjcmVhdGVCMkZ1bmN0aW9uPHtcbiAgICAgICAgZmlsZUlkOiBzdHJpbmc7XG4gICAgICAgIHBhcnRTaGExQXJyYXk6IHN0cmluZ1tdO1xuICAgIH0sIHtcbiAgICAgICAgZmlsZUlkOiBzdHJpbmc7XG4gICAgICAgIGZpbGVOYW1lOiBzdHJpbmc7XG4gICAgICAgIGFjY291bnRJZDogc3RyaW5nO1xuICAgICAgICBidWNrZXRJZDogc3RyaW5nO1xuICAgICAgICBjb250ZW50TGVuZ3RoOiBudW1iZXI7XG4gICAgICAgIGNvbnRlbnRTaGExOiBzdHJpbmc7XG4gICAgICAgIGNvbnRlbnRUeXBlOiBzdHJpbmc7XG4gICAgICAgIGZpbGVJbmZvOiBhbnk7XG4gICAgICAgIHVwbG9hZFRpbWVzdGFtcDogbnVtYmVyO1xuICAgIH0+KFwiYjJfZmluaXNoX2xhcmdlX2ZpbGVcIiwgXCJQT1NUXCIsIFwibm9BY2NvdW50SWRcIik7XG5cbiAgICBjb25zdCBjYW5jZWxMYXJnZUZpbGUgPSBjcmVhdGVCMkZ1bmN0aW9uPHtcbiAgICAgICAgZmlsZUlkOiBzdHJpbmc7XG4gICAgfSwge30+KFwiYjJfY2FuY2VsX2xhcmdlX2ZpbGVcIiwgXCJQT1NUXCIsIFwibm9BY2NvdW50SWRcIik7XG5cbiAgICBjb25zdCBnZXREb3dubG9hZEF1dGhvcml6YXRpb24gPSBjcmVhdGVCMkZ1bmN0aW9uPHtcbiAgICAgICAgYnVja2V0SWQ6IHN0cmluZztcbiAgICAgICAgZmlsZU5hbWVQcmVmaXg6IHN0cmluZztcbiAgICAgICAgdmFsaWREdXJhdGlvbkluU2Vjb25kczogbnVtYmVyO1xuICAgICAgICBiMkNvbnRlbnREaXNwb3NpdGlvbj86IHN0cmluZztcbiAgICAgICAgYjJDb250ZW50TGFuZ3VhZ2U/OiBzdHJpbmc7XG4gICAgICAgIGIyRXhwaXJlcz86IHN0cmluZztcbiAgICAgICAgYjJDYWNoZUNvbnRyb2w/OiBzdHJpbmc7XG4gICAgICAgIGIyQ29udGVudEVuY29kaW5nPzogc3RyaW5nO1xuICAgICAgICBiMkNvbnRlbnRUeXBlPzogc3RyaW5nO1xuICAgIH0sIHtcbiAgICAgICAgYnVja2V0SWQ6IHN0cmluZztcbiAgICAgICAgZmlsZU5hbWVQcmVmaXg6IHN0cmluZztcbiAgICAgICAgYXV0aG9yaXphdGlvblRva2VuOiBzdHJpbmc7XG4gICAgfT4oXCJiMl9nZXRfZG93bmxvYWRfYXV0aG9yaXphdGlvblwiLCBcIlBPU1RcIiwgXCJub0FjY291bnRJZFwiKTtcblxuICAgIGFzeW5jIGZ1bmN0aW9uIGdldERvd25sb2FkVVJMKHBhdGg6IHN0cmluZykge1xuICAgICAgICBpZiAoIXBhdGguc3RhcnRzV2l0aChcIi9cIikpIHtcbiAgICAgICAgICAgIHBhdGggPSBcIi9cIiArIHBhdGg7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGF1dGguZG93bmxvYWRVcmwgKyBwYXRoO1xuICAgIH1cblxuXG4gICAgcmV0dXJuIHtcbiAgICAgICAgY3JlYXRlQnVja2V0LFxuICAgICAgICB1cGRhdGVCdWNrZXQsXG4gICAgICAgIGxpc3RCdWNrZXRzLFxuICAgICAgICBkb3dubG9hZEZpbGVCeU5hbWUsXG4gICAgICAgIHVwbG9hZEZpbGUsXG4gICAgICAgIGhpZGVGaWxlLFxuICAgICAgICBnZXRGaWxlSW5mbyxcbiAgICAgICAgbGlzdEZpbGVOYW1lcyxcbiAgICAgICAgY29weUZpbGUsXG4gICAgICAgIHN0YXJ0TGFyZ2VGaWxlLFxuICAgICAgICB1cGxvYWRQYXJ0LFxuICAgICAgICBmaW5pc2hMYXJnZUZpbGUsXG4gICAgICAgIGNhbmNlbExhcmdlRmlsZSxcbiAgICAgICAgZ2V0RG93bmxvYWRBdXRob3JpemF0aW9uLFxuICAgICAgICBnZXREb3dubG9hZFVSTCxcbiAgICAgICAgYXBpVXJsOiBhdXRoLmFwaVVybCxcbiAgICAgICAgYWxsb3dlZDogYXV0aC5hbGxvd2VkLFxuICAgIH07XG59KTtcblxudHlwZSBCMkFwaSA9ICh0eXBlb2YgZ2V0QVBJKSBleHRlbmRzICgpID0+IFByb21pc2U8aW5mZXIgVD4gPyBUIDogbmV2ZXI7XG5cblxuZXhwb3J0IGNsYXNzIEFyY2hpdmVzQmFja2JsYXplIGltcGxlbWVudHMgSUFyY2hpdmVzIHtcbiAgICBwdWJsaWMgY29uc3RydWN0b3IocHJpdmF0ZSBjb25maWc6IHtcbiAgICAgICAgYnVja2V0TmFtZTogc3RyaW5nO1xuICAgICAgICBwdWJsaWM/OiBib29sZWFuO1xuICAgICAgICBpbW11dGFibGU/OiBib29sZWFuO1xuICAgICAgICBjYWNoZVRpbWU/OiBudW1iZXI7XG4gICAgICAgIGFsbG93ZWRPcmlnaW5zPzogc3RyaW5nW107XG4gICAgfSkge1xuICAgICAgICAvLyBHZXQgdGhlIGFwaSwgdG8gc2V0dXAgY29yc1xuICAgICAgICB2b2lkIHRoaXMuZ2V0QnVja2V0QVBJKCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBidWNrZXROYW1lID0gdGhpcy5jb25maWcuYnVja2V0TmFtZS5yZXBsYWNlQWxsKC9bXlxcd1xcZF0vZywgXCItXCIpO1xuICAgIHByaXZhdGUgYnVja2V0SWQgPSBcIlwiO1xuXG4gICAgcHJpdmF0ZSBsb2dnaW5nID0gZmFsc2U7XG4gICAgcHVibGljIGVuYWJsZUxvZ2dpbmcoKSB7XG4gICAgICAgIHRoaXMubG9nZ2luZyA9IHRydWU7XG4gICAgfVxuICAgIHByaXZhdGUgbG9nKHRleHQ6IHN0cmluZykge1xuICAgICAgICBpZiAoIXRoaXMubG9nZ2luZykgcmV0dXJuO1xuICAgICAgICBjb25zb2xlLmxvZyh0ZXh0KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0RGVidWdOYW1lKCkge1xuICAgICAgICByZXR1cm4gXCJiYWNrYmxhemUvXCIgKyB0aGlzLmNvbmZpZy5idWNrZXROYW1lO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0QnVja2V0QVBJID0gbGF6eShhc3luYyAoKSA9PiB7XG4gICAgICAgIGxldCBhcGkgPSBhd2FpdCBnZXRBUEkoKTtcblxuICAgICAgICBsZXQgY2FjaGVUaW1lID0gdGhpcy5jb25maWcuY2FjaGVUaW1lID8/IDA7XG4gICAgICAgIGlmICh0aGlzLmNvbmZpZy5pbW11dGFibGUpIHtcbiAgICAgICAgICAgIGNhY2hlVGltZSA9IElNTVVUQUJMRV9DQUNIRV9USU1FO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQUxXQVlTIHNldCBhY2Nlc3MgY29udHJvbCwgYXMgd2UgY2FuIG1ha2UgdXJscyBmb3IgcHJpdmF0ZSBidWNrZXRzIHdpdGggZ2V0RG93bmxvYWRBdXRob3JpemF0aW9uXG4gICAgICAgIGxldCBkZXNpcmVkQ29yc1J1bGVzID0gW3tcbiAgICAgICAgICAgIGNvcnNSdWxlTmFtZTogXCJhbGxvd0FsbFwiLFxuICAgICAgICAgICAgYWxsb3dlZE9yaWdpbnM6IHRoaXMuY29uZmlnLmFsbG93ZWRPcmlnaW5zID8/IFtcImh0dHBzXCJdLFxuICAgICAgICAgICAgYWxsb3dlZE9wZXJhdGlvbnM6IFtcImIyX2Rvd25sb2FkX2ZpbGVfYnlfaWRcIiwgXCJiMl9kb3dubG9hZF9maWxlX2J5X25hbWVcIl0sXG4gICAgICAgICAgICBhbGxvd2VkSGVhZGVyczogW1wicmFuZ2VcIl0sXG4gICAgICAgICAgICBleHBvc2VIZWFkZXJzOiBbXCJ4LWJ6LWNvbnRlbnQtc2hhMVwiXSxcbiAgICAgICAgICAgIG1heEFnZVNlY29uZHM6IGNhY2hlVGltZSAvIDEwMDAsXG4gICAgICAgIH1dO1xuICAgICAgICBsZXQgYnVja2V0SW5mbzogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7fTtcbiAgICAgICAgaWYgKGNhY2hlVGltZSkge1xuICAgICAgICAgICAgYnVja2V0SW5mb1tcImNhY2hlLWNvbnRyb2xcIl0gPSBgbWF4LWFnZT0ke2NhY2hlVGltZSAvIDEwMDB9YDtcbiAgICAgICAgfVxuXG5cbiAgICAgICAgbGV0IGV4aXN0cyA9IGZhbHNlO1xuICAgICAgICBsZXQgcmV0cmllcyA9IDA7XG4gICAgICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGF3YWl0IGFwaS5jcmVhdGVCdWNrZXQoe1xuICAgICAgICAgICAgICAgICAgICBidWNrZXROYW1lOiB0aGlzLmJ1Y2tldE5hbWUsXG4gICAgICAgICAgICAgICAgICAgIGJ1Y2tldFR5cGU6IHRoaXMuY29uZmlnLnB1YmxpYyA/IFwiYWxsUHVibGljXCIgOiBcImFsbFByaXZhdGVcIixcbiAgICAgICAgICAgICAgICAgICAgbGlmZWN5Y2xlUnVsZXM6IFt7XG4gICAgICAgICAgICAgICAgICAgICAgICBcImRheXNGcm9tVXBsb2FkaW5nVG9IaWRpbmdcIjogbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEtlZXAgZmlsZXMgZm9yIDcgZGF5cywgd2hpY2ggc2hvdWxkIGJlIGVub3VnaCB0aW1lIHRvIHJlY292ZXIgYWNjaWRlbnRhbCBoaWRpbmcuXG4gICAgICAgICAgICAgICAgICAgICAgICBcImRheXNGcm9tSGlkaW5nVG9EZWxldGluZ1wiOiA3LFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJmaWxlTmFtZVByZWZpeFwiOiBcIlwiXG4gICAgICAgICAgICAgICAgICAgIH1dLFxuICAgICAgICAgICAgICAgICAgICBjb3JzUnVsZXM6IGRlc2lyZWRDb3JzUnVsZXMsXG4gICAgICAgICAgICAgICAgICAgIGJ1Y2tldEluZm9cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgICAgICAgICAgIGlmICghZS5zdGFjay5pbmNsdWRlcyhgXCJkdXBsaWNhdGVfYnVja2V0X25hbWVcImApKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChyZXRyaWVzIDwgMykge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihgQmFja2JsYXplIGNyZWF0ZSBidWNrZXQgZmFpbGVkLCByZXRyeWluZyBpbiA1czogJHtlLnN0YWNrfWApO1xuICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgZGVsYXkoNTAwMCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXRyaWVzKys7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBleGlzdHMgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgYnVja2V0TGlzdCA9IGF3YWl0IGFwaS5saXN0QnVja2V0cyh7XG4gICAgICAgICAgICBidWNrZXROYW1lOiB0aGlzLmJ1Y2tldE5hbWUsXG4gICAgICAgIH0pO1xuICAgICAgICBpZiAoYnVja2V0TGlzdC5idWNrZXRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBCdWNrZXQgbmFtZSBcIiR7dGhpcy5idWNrZXROYW1lfVwiIGlzIGJlaW5nIHVzZWQgYnkgc29tZW9uZSBlbHNlLiBCdWNrZXQgbmFtZXMgaGF2ZSB0byBiZSBnbG9iYWxseSB1bmlxdWUuIFRyeSBhIGRpZmZlcmVudCBuYW1lIHVudGlsIHlvdSBmaW5kIGEgZnJlZSBvbmUuYCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5idWNrZXRJZCA9IGJ1Y2tldExpc3QuYnVja2V0c1swXS5idWNrZXRJZDtcblxuICAgICAgICBpZiAoZXhpc3RzKSB7XG4gICAgICAgICAgICBsZXQgYnVja2V0ID0gYnVja2V0TGlzdC5idWNrZXRzWzBdO1xuICAgICAgICAgICAgZnVuY3Rpb24gbm9ybWFsaXplKG9iajogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pIHtcbiAgICAgICAgICAgICAgICBsZXQga3ZwcyA9IE9iamVjdC5lbnRyaWVzKG9iaik7XG4gICAgICAgICAgICAgICAgc29ydChrdnBzLCB4ID0+IHhbMF0pO1xuICAgICAgICAgICAgICAgIHJldHVybiBPYmplY3QuZnJvbUVudHJpZXMoa3Zwcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmdW5jdGlvbiBvcmRlckluZGVwZW5kZW50RXF1YWwobGhzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiwgcmhzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikge1xuICAgICAgICAgICAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShub3JtYWxpemUobGhzKSkgPT09IEpTT04uc3RyaW5naWZ5KG5vcm1hbGl6ZShyaHMpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZ1bmN0aW9uIG9yZGVySW5kZXBlbmRlbnRFcXVhbEFycmF5KGxoczogdW5rbm93bltdLCByaHM6IHVua25vd25bXSkge1xuICAgICAgICAgICAgICAgIGlmIChsaHMubGVuZ3RoICE9PSByaHMubGVuZ3RoKSByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsaHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFvcmRlckluZGVwZW5kZW50RXF1YWwobGhzW2ldIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+LCByaHNbaV0gYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pKSByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICFvcmRlckluZGVwZW5kZW50RXF1YWxBcnJheShidWNrZXQuY29yc1J1bGVzLCBkZXNpcmVkQ29yc1J1bGVzKVxuICAgICAgICAgICAgICAgIHx8ICFvcmRlckluZGVwZW5kZW50RXF1YWwoYnVja2V0LmJ1Y2tldEluZm8sIGJ1Y2tldEluZm8pXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhtYWdlbnRhKGBVcGRhdGluZyBDT1JTIHJ1bGVzIGZvciAke3RoaXMuYnVja2V0TmFtZX1gKSwgYnVja2V0LmNvcnNSdWxlcywgZGVzaXJlZENvcnNSdWxlcyk7XG4gICAgICAgICAgICAgICAgYXdhaXQgYXBpLnVwZGF0ZUJ1Y2tldCh7XG4gICAgICAgICAgICAgICAgICAgIGFjY291bnRJZDogYnVja2V0LmFjY291bnRJZCxcbiAgICAgICAgICAgICAgICAgICAgYnVja2V0SWQ6IGJ1Y2tldC5idWNrZXRJZCxcbiAgICAgICAgICAgICAgICAgICAgYnVja2V0VHlwZTogYnVja2V0LmJ1Y2tldFR5cGUsXG4gICAgICAgICAgICAgICAgICAgIGxpZmVjeWNsZVJ1bGVzOiBidWNrZXQubGlmZWN5Y2xlUnVsZXMsXG4gICAgICAgICAgICAgICAgICAgIGNvcnNSdWxlczogZGVzaXJlZENvcnNSdWxlcyxcbiAgICAgICAgICAgICAgICAgICAgYnVja2V0SW5mbzogYnVja2V0SW5mbyxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYXBpO1xuICAgIH0pO1xuXG4gICAgcHJpdmF0ZSBjdXJyZW50UmVzZXQ6IFByb21pc2U8dm9pZD4gfCB1bmRlZmluZWQ7XG5cbiAgICAvLyBLZWVwIHRyYWNrIG9mIHdoZW4gd2UgbGFzdCByZXNldCBiZWNhdXNlIG9mIGEgNTAzXG4gICAgcHJpdmF0ZSBsYXN0NTAzUmVzZXQgPSAwO1xuICAgIC8vIElNUE9SVEFOVCEgV2UgbXVzdCBhbHdheXMgQ0FUQ0ggQVJPVU5EIHRoZSBhcGlSZXRyeUxvZ2ljLCBORVZFUiBpbnNpZGUgb2YgZm5jLiBPdGhlcndpc2Ugd2Ugd29uJ3RcbiAgICAvLyAgYmUgYWJsZSB0byByZWNyZWF0ZSB0aGUgYXV0aCB0b2tlbi5cbiAgICAvLyAgYGNvbnRleHRgIGlzIGEgc2hvcnQgbGFiZWwgKHZlcmIgKyBmaWxlIHBhdGgpIGluY2x1ZGVkIGluIGV2ZXJ5IHJldHJ5L2Vycm9yIGxvZyBzbyBhIHN0dWNrXG4gICAgLy8gICBzaWxlbnQtcmV0cnkgbG9vcCBpcyBpZGVudGlmaWFibGUgZnJvbSB0aGUgbG9ncy5cbiAgICBwcml2YXRlIGFzeW5jIGFwaVJldHJ5TG9naWM8VD4oXG4gICAgICAgIGNvbnRleHQ6IHN0cmluZyxcbiAgICAgICAgZm5jOiAoYXBpOiBCMkFwaSkgPT4gUHJvbWlzZTxUPixcbiAgICAgICAgcmV0cmllcyA9IDNcbiAgICApOiBQcm9taXNlPFQ+IHtcbiAgICAgICAgbGV0IGFwaTogQjJBcGkgfCB1bmRlZmluZWQ7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBhcGkgPSBhd2FpdCB0aGlzLmdldEJ1Y2tldEFQSSgpO1xuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IGZuYyhhcGkpO1xuICAgICAgICB9IGNhdGNoIChlcnI6IGFueSkge1xuICAgICAgICAgICAgaWYgKHJldHJpZXMgPD0gMCkgdGhyb3cgZXJyO1xuXG4gICAgICAgICAgICAvLyBJZiBpdCdzIGEgNTAzIGFuZCBpdCdzIGJlZW4gYSBtaW51dGUgc2luY2Ugd2UgbGFzdCByZXNldCwgdGhlbiBXYWl0IGFuZCByZXNldC5cbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAoZXJyLnN0YWNrLmluY2x1ZGVzKGBcInN0YXR1c1wiOiA1MDNgKVxuICAgICAgICAgICAgICAgICAgICB8fCBlcnIuc3RhY2suaW5jbHVkZXMoYFwic2VydmljZV91bmF2YWlsYWJsZVwiYClcbiAgICAgICAgICAgICAgICAgICAgfHwgZXJyLnN0YWNrLmluY2x1ZGVzKGBcImludGVybmFsX2Vycm9yXCJgKVxuICAgICAgICAgICAgICAgICAgICB8fCBlcnIuc3RhY2suaW5jbHVkZXMoYEVOT0JVRlNgKVxuICAgICAgICAgICAgICAgICkgJiYgRGF0ZS5ub3coKSAtIHRoaXMubGFzdDUwM1Jlc2V0ID4gNjAgKiAxMDAwKSB7XG4gICAgICAgICAgICAgICAgLy8gQmFja2JsYXplIGlzIHNvIGZsYWt5IHRoYXQgd2UncmUganVzdCBnb2luZyB0byB3YXJuIGhlcmUuXG4gICAgICAgICAgICAgICAgY29uc29sZS53YXJuKGBbJHtjb250ZXh0fV0gQmFja2JsYXplIGVycm9yLCB3YWl0aW5nIGFuZCByZXNldHRpbmc6ICR7ZXJyLm1lc3NhZ2V9YCk7XG4gICAgICAgICAgICAgICAgdGhpcy5sb2coYFske2NvbnRleHR9XSBCYWNrYmxhemUgZXJyb3IsIHdhaXRpbmcgYW5kIHJlc2V0dGluZzogJHtlcnIubWVzc2FnZX1gKTtcbiAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnRSZXNldCA9IHRoaXMuY3VycmVudFJlc2V0IHx8IChhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IGRlbGF5KDEwICogMTAwMCk7XG4gICAgICAgICAgICAgICAgICAgIC8vIFdlIGNoZWNrIGFnYWluIGluIGNhc2UsIGFuZCBpbiB0aGUgdmVyeSBsaWtlbHkgY2FzZSB0aGF0IHRoaXMgaXMgYmVpbmcgcnVuIGluIHBhcmFsbGVsLCB3ZSBvbmx5IHdhbnQgdG8gcmVzZXQgb25jZS5cbiAgICAgICAgICAgICAgICAgICAgaWYgKERhdGUubm93KCkgLSB0aGlzLmxhc3Q1MDNSZXNldCA+IDYwICogMTAwMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2coYFske2NvbnRleHR9XSBSZXNldHRpbmcgZ2V0QVBJIGFuZCBnZXRCdWNrZXRBUEk6ICR7ZXJyLm1lc3NhZ2V9YCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxhc3Q1MDNSZXNldCA9IERhdGUubm93KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBnZXRBUEkucmVzZXQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZ2V0QnVja2V0QVBJLnJlc2V0KCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KSgpLmZpbmFsbHkoKCkgPT4gdGhpcy5jdXJyZW50UmVzZXQgPSB1bmRlZmluZWQpO1xuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuY3VycmVudFJlc2V0O1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmFwaVJldHJ5TG9naWMoY29udGV4dCwgZm5jLCByZXRyaWVzIC0gMSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIElmIHRoZSBlcnJvciBpcyB0aGF0IHRoZSBhdXRob3JpemF0aW9uIHRva2VuIGlzIGludmFsaWQsIHJlc2V0IGdldEJ1Y2tldEFQSSBhbmQgZ2V0QVBJXG4gICAgICAgICAgICAvLyBJZiB0aGUgZXJyb3IgaXMgdGhhdCB0aGUgYnVja2V0IGlzbid0IGZvdW5kLCByZXNldCBnZXRCdWNrZXRBUElcbiAgICAgICAgICAgIGlmIChlcnIuc3RhY2suaW5jbHVkZXMoYFwiZXhwaXJlZF9hdXRoX3Rva2VuXCJgKSkge1xuICAgICAgICAgICAgICAgIHRoaXMubG9nKGBbJHtjb250ZXh0fV0gQXV0aG9yaXphdGlvbiB0b2tlbiBleHBpcmVkYCk7XG4gICAgICAgICAgICAgICAgZ2V0QVBJLnJlc2V0KCk7XG4gICAgICAgICAgICAgICAgdGhpcy5nZXRCdWNrZXRBUEkucmVzZXQoKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5hcGlSZXRyeUxvZ2ljKGNvbnRleHQsIGZuYywgcmV0cmllcyAtIDEpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgZXJyLnN0YWNrLmluY2x1ZGVzKGBubyB0b21lcyBhdmFpbGFibGVgKVxuICAgICAgICAgICAgICAgIHx8IGVyci5zdGFjay5pbmNsdWRlcyhgRVRJTUVET1VUYClcbiAgICAgICAgICAgICAgICB8fCBlcnIuc3RhY2suaW5jbHVkZXMoYHNvY2tldCBoYW5nIHVwYClcbiAgICAgICAgICAgICAgICAvLyBFaC4uLiB0aGlzIG1pZ2h0IGJlIGJhZCwgYnV0Li4uIEkgdGhpbmsgd2UganVzdCBnZXQgcmFuZG9tIDQwMCBlcnJvcnMuIElmIHRoaXMgc3BhbXMgZXJyb3JzLFxuICAgICAgICAgICAgICAgIC8vICB3ZSBjYW4gcmVtb3ZlIHRoaXMgbGluZS5cbiAgICAgICAgICAgICAgICB8fCBlcnIuc3RhY2suaW5jbHVkZXMoYDQwMCBCYWQgUmVxdWVzdGApXG4gICAgICAgICAgICAgICAgfHwgZXJyLnN0YWNrLmluY2x1ZGVzKGBnZXRhZGRyaW5mbyBFTk9URk9VTkRgKVxuICAgICAgICAgICAgICAgIHx8IGVyci5zdGFjay5pbmNsdWRlcyhgRUNPTk5SRVNFVGApXG4gICAgICAgICAgICAgICAgfHwgZXJyLnN0YWNrLmluY2x1ZGVzKGBFQ09OTlJFRlVTRURgKVxuICAgICAgICAgICAgICAgIHx8IGVyci5zdGFjay5pbmNsdWRlcyhgRU5PQlVGU2ApXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oYFske2NvbnRleHR9XSBSZXRyeWluZyBpbiA1czogJHtlcnIubWVzc2FnZX1gKTtcbiAgICAgICAgICAgICAgICB0aGlzLmxvZyhgWyR7Y29udGV4dH1dICR7ZXJyLm1lc3NhZ2V9IHJldHJ5aW5nIGluIDVzYCk7XG4gICAgICAgICAgICAgICAgYXdhaXQgZGVsYXkoNTAwMCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuYXBpUmV0cnlMb2dpYyhjb250ZXh0LCBmbmMsIHJldHJpZXMgLSAxKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGVyci5zdGFjay5pbmNsdWRlcyhgZ2V0YWRkcmluZm8gRU5PVEZPVU5EYCkpIHtcbiAgICAgICAgICAgICAgICBpZiAoYXBpKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCB1cmxPYmogPSBuZXcgVVJMKGFwaS5hcGlVcmwpO1xuICAgICAgICAgICAgICAgICAgICBsZXQgaG9zdG5hbWUgPSB1cmxPYmouaG9zdG5hbWU7XG4gICAgICAgICAgICAgICAgICAgIGxldCBsb29rdXBBZGRyZXNzZXMgPSBhd2FpdCBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRucy5sb29rdXAoaG9zdG5hbWUsIChlcnIsIGFkZHJlc3NlcykgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUoYWRkcmVzc2VzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHJlc29sdmVBZGRyZXNzZXMgPSBhd2FpdCBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRucy5yZXNvbHZlNChob3N0bmFtZSwgKGVyciwgYWRkcmVzc2VzKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShhZGRyZXNzZXMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGBbJHtjb250ZXh0fV0gZ2V0YWRkcmluZm8gRU5PVEZPVU5EICR7aG9zdG5hbWV9YCwgeyBsb29rdXBBZGRyZXNzZXMsIHJlc29sdmVBZGRyZXNzZXMsIGFwaVVybDogYXBpLmFwaVVybCwgZnVsbEVycm9yOiBlcnIuc3RhY2sgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgZ2V0KGZpbGVOYW1lOiBzdHJpbmcsIGNvbmZpZz86IHsgcmFuZ2U/OiB7IHN0YXJ0OiBudW1iZXI7IGVuZDogbnVtYmVyOyB9OyByZXRyeUNvdW50PzogbnVtYmVyIH0pOiBQcm9taXNlPEJ1ZmZlciB8IHVuZGVmaW5lZD4ge1xuICAgICAgICBsZXQgZG93bmxvYWRpbmcgPSB0cnVlO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgbGV0IHRpbWUgPSBEYXRlLm5vdygpO1xuICAgICAgICAgICAgY29uc3QgZG93bmxvYWRQb2xsID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmICghZG93bmxvYWRpbmcpIHJldHVybjtcbiAgICAgICAgICAgICAgICB0aGlzLmxvZyhgQmFja2JsYXplIGRvd25sb2FkIGluIHByb2dyZXNzICR7ZmlsZU5hbWV9YCk7XG4gICAgICAgICAgICAgICAgc2V0VGltZW91dChkb3dubG9hZFBvbGwsIDUwMDApO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHNldFRpbWVvdXQoZG93bmxvYWRQb2xsLCA1MDAwKTtcbiAgICAgICAgICAgIGxldCByZXN1bHQgPSBhd2FpdCB0aGlzLmFwaVJldHJ5TG9naWMoYGdldCAke2ZpbGVOYW1lfWAsIGFzeW5jIChhcGkpID0+IHtcbiAgICAgICAgICAgICAgICBsZXQgcmFuZ2UgPSBjb25maWc/LnJhbmdlO1xuICAgICAgICAgICAgICAgIGlmIChyYW5nZSkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgZmlsZUluZm8gPSBhd2FpdCB0aGlzLmdldEluZm8oZmlsZU5hbWUpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWZpbGVJbmZvKSB0aHJvdyBuZXcgRXJyb3IoYEZpbGUgJHtmaWxlTmFtZX0gbm90IGZvdW5kYCk7XG4gICAgICAgICAgICAgICAgICAgIGxldCByYW5nZVN0YXJ0ID0gcmFuZ2Uuc3RhcnQ7XG4gICAgICAgICAgICAgICAgICAgIGxldCByYW5nZUVuZCA9IE1hdGgubWluKHJhbmdlLmVuZCwgZmlsZUluZm8uc2l6ZSk7XG4gICAgICAgICAgICAgICAgICAgIC8vIE5PVEU6IEkgdGhpbmsgaWYgd2UgcmVxdWVzdCBub3RoaW5nLCBpdCBjb25mdXNlcyBCYWNrYmxhemUgYW5kIGVuZHMgdXAgZ2l2aW5nIHVzIHRoZSBlbnRpcmUgZmlsZS5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHJhbmdlRW5kIDw9IHJhbmdlU3RhcnQpIHJldHVybiBCdWZmZXIuYWxsb2MoMCk7XG4gICAgICAgICAgICAgICAgICAgIGxldCByZXN1bHQgPSBhd2FpdCBhcGkuZG93bmxvYWRGaWxlQnlOYW1lKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJ1Y2tldE5hbWU6IHRoaXMuYnVja2V0TmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVOYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgcmFuZ2U6IHsgc3RhcnQ6IHJhbmdlU3RhcnQsIGVuZDogcmFuZ2VFbmQgfSxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChyZXN1bHQubGVuZ3RoICE9PSByYW5nZUVuZCAtIHJhbmdlU3RhcnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYEJhY2tibGF6ZSByYW5nZSBkb3dubG9hZCByZXR1cm5lZCB0aGUgd3JvbmcgbnVtYmVyIG9mIGJ5dGVzLiBUcmllZCB0byBnZXQgJHtyYW5nZVN0YXJ0fS0ke3JhbmdlRW5kfSwgYnV0IHJlY2VpdmVkICR7cmFuZ2VTdGFydH0tJHtyYW5nZVN0YXJ0ICsgcmVzdWx0Lmxlbmd0aH0uIEZvciBmaWxlOiAke2ZpbGVOYW1lfWApO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBhd2FpdCBhcGkuZG93bmxvYWRGaWxlQnlOYW1lKHtcbiAgICAgICAgICAgICAgICAgICAgYnVja2V0TmFtZTogdGhpcy5idWNrZXROYW1lLFxuICAgICAgICAgICAgICAgICAgICBmaWxlTmFtZSxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgbGV0IHRpbWVTdHIgPSBmb3JtYXRUaW1lKERhdGUubm93KCkgLSB0aW1lKTtcbiAgICAgICAgICAgIGxldCByYXRlU3RyID0gZm9ybWF0TnVtYmVyKHJlc3VsdC5sZW5ndGggLyAoRGF0ZS5ub3coKSAtIHRpbWUpICogMTAwMCkgKyBcIkIvc1wiO1xuICAgICAgICAgICAgdGhpcy5sb2coYGJhY2tibGF6ZSBkb3dubG9hZCAoJHtmb3JtYXROdW1iZXIocmVzdWx0Lmxlbmd0aCl9QiR7Y29uZmlnPy5yYW5nZSAmJiBgLCAke2Zvcm1hdE51bWJlcihjb25maWcucmFuZ2Uuc3RhcnQpfSAtICR7Zm9ybWF0TnVtYmVyKGNvbmZpZy5yYW5nZS5lbmQpfWAgfHwgXCJcIn0pIGluICR7dGltZVN0cn0gKCR7cmF0ZVN0cn0sICR7ZmlsZU5hbWV9KWApO1xuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgdGhpcy5sb2coYGJhY2tibGF6ZSBmaWxlIGRvZXMgbm90IGV4aXN0ICR7ZmlsZU5hbWV9YCk7XG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgZG93bmxvYWRpbmcgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBwdWJsaWMgYXN5bmMgZ2V0MihmaWxlTmFtZTogc3RyaW5nLCBjb25maWc/OiB7IHJhbmdlPzogeyBzdGFydDogbnVtYmVyOyBlbmQ6IG51bWJlcjsgfSB9KTogUHJvbWlzZTx7IGRhdGE6IEJ1ZmZlcjsgd3JpdGVUaW1lOiBudW1iZXI7IHNpemU6IG51bWJlciB9IHwgdW5kZWZpbmVkPiB7XG4gICAgICAgIC8vIEIyIGRvd25sb2FkcyBkb24ndCByZXR1cm4gdGhlIHVwbG9hZCB0aW1lLCBzbyB0aGlzIHRha2VzIGEgc2Vjb25kIEFQSSBjYWxsXG4gICAgICAgIGxldCBbZGF0YSwgaW5mb10gPSBhd2FpdCBQcm9taXNlLmFsbChbdGhpcy5nZXQoZmlsZU5hbWUsIGNvbmZpZyksIHRoaXMuZ2V0SW5mbyhmaWxlTmFtZSldKTtcbiAgICAgICAgaWYgKCFkYXRhIHx8ICFpbmZvKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICByZXR1cm4geyBkYXRhLCB3cml0ZVRpbWU6IGluZm8ud3JpdGVUaW1lLCBzaXplOiBpbmZvLnNpemUgfTtcbiAgICB9XG4gICAgcHVibGljIGFzeW5jIGdldENvbmZpZygpOiBQcm9taXNlPEFyY2hpdmVzQ29uZmlnPiB7XG4gICAgICAgIHJldHVybiB7fTtcbiAgICB9XG4gICAgcHVibGljIGFzeW5jIGhhc1dyaXRlQWNjZXNzKCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgbGV0IGFwaSA9IGF3YWl0IGdldEFQSSgpO1xuICAgICAgICAgICAgLy8gQjIgdjIgZG9jdW1lbnRzIGFsbG93ZWQgYXMgYSBzaW5nbGUgb2JqZWN0OyBvdXIgdHlwZSBzYXlzIGEgbGlzdCAtIGhhbmRsZSBib3RoXG4gICAgICAgICAgICBsZXQgYWxsb3dlZFJhdyA9IGFwaS5hbGxvd2VkIGFzIHVua25vd247XG4gICAgICAgICAgICBsZXQgYWxsb3dlZExpc3QgPSAoQXJyYXkuaXNBcnJheShhbGxvd2VkUmF3KSAmJiBhbGxvd2VkUmF3IHx8IFthbGxvd2VkUmF3XSkgYXMgdHlwZW9mIGFwaS5hbGxvd2VkO1xuICAgICAgICAgICAgcmV0dXJuIGFsbG93ZWRMaXN0LnNvbWUoYWxsb3dlZCA9PlxuICAgICAgICAgICAgICAgIGFsbG93ZWQuY2FwYWJpbGl0aWVzLmluY2x1ZGVzKFwid3JpdGVGaWxlc1wiKVxuICAgICAgICAgICAgICAgICYmICghYWxsb3dlZC5idWNrZXROYW1lIHx8IGFsbG93ZWQuYnVja2V0TmFtZSA9PT0gdGhpcy5idWNrZXROYW1lKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgLy8gTm8gLyBpbnZhbGlkIGNyZWRlbnRpYWxzXG4gICAgICAgICAgICB0aGlzLmxvZyhgYmFja2JsYXplIGhhc1dyaXRlQWNjZXNzIGNoZWNrIGZhaWxlZDogJHsoZSBhcyBFcnJvcikuc3RhY2sgPz8gZX1gKTtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBwdWJsaWMgYXN5bmMgc2V0KGZpbGVOYW1lOiBzdHJpbmcsIGRhdGE6IEJ1ZmZlciwgY29uZmlnPzogeyBsYXN0TW9kaWZpZWQ/OiBudW1iZXIgfSk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgICAgIGlmIChjb25maWc/Lmxhc3RNb2RpZmllZCkge1xuICAgICAgICAgICAgYXNzZXJ0VmFsaWRMYXN0TW9kaWZpZWQoY29uZmlnLmxhc3RNb2RpZmllZCk7XG4gICAgICAgICAgICBsZXQgZXhpc3RpbmcgPSBhd2FpdCB0aGlzLmdldEluZm8oZmlsZU5hbWUpO1xuICAgICAgICAgICAgLy8gQW4gb2xkZXIgd3JpdGUgbmV2ZXIgb3ZlcndyaXRlcyBhIG5ld2VyIG9uZSAoc2VlIElBcmNoaXZlcy5zZXQpLiBCMiBzdGFtcHMgaXRzIG93blxuICAgICAgICAgICAgLy8gdXBsb2FkIHRpbWUsIHNvIHRoZSBleGFjdCBsYXN0TW9kaWZpZWQgaXMgbm90IHByZXNlcnZlZCBvbiB0aGUgc3RvcmVkIGZpbGUuXG4gICAgICAgICAgICBpZiAoZXhpc3RpbmcgJiYgY29uZmlnLmxhc3RNb2RpZmllZCA8IGV4aXN0aW5nLndyaXRlVGltZSkgcmV0dXJuIGZpbGVOYW1lO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMubG9nKGBiYWNrYmxhemUgdXBsb2FkICgke2Zvcm1hdE51bWJlcihkYXRhLmxlbmd0aCl9QikgJHtmaWxlTmFtZX1gKTtcbiAgICAgICAgbGV0IGYgPSBmaWxlTmFtZTtcbiAgICAgICAgYXdhaXQgdGhpcy5hcGlSZXRyeUxvZ2ljKGB1cGxvYWRGaWxlICR7ZmlsZU5hbWV9YCwgYXN5bmMgKGFwaSkgPT4ge1xuICAgICAgICAgICAgYXdhaXQgYXBpLnVwbG9hZEZpbGUoeyBidWNrZXRJZDogdGhpcy5idWNrZXRJZCwgZmlsZU5hbWUsIGRhdGE6IGRhdGEsIH0pO1xuICAgICAgICB9KTtcbiAgICAgICAgbGV0IGV4aXN0c0NoZWNrcyA9IDMwO1xuICAgICAgICB3aGlsZSAoZXhpc3RzQ2hlY2tzID4gMCkge1xuICAgICAgICAgICAgbGV0IGV4aXN0cyA9IGF3YWl0IHRoaXMuZ2V0SW5mbyhmaWxlTmFtZSk7XG4gICAgICAgICAgICBpZiAoZXhpc3RzKSBicmVhaztcbiAgICAgICAgICAgIGF3YWl0IGRlbGF5KDEwMDApO1xuICAgICAgICAgICAgZXhpc3RzQ2hlY2tzLS07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGV4aXN0c0NoZWNrcyA9PT0gMCkge1xuICAgICAgICAgICAgbGV0IGV4aXN0cyA9IGF3YWl0IHRoaXMuZ2V0SW5mbyhmaWxlTmFtZSk7XG4gICAgICAgICAgICBjb25zb2xlLndhcm4oYEZpbGUgJHtmaWxlTmFtZX0vJHtmfSB3YXMgdXBsb2FkZWQsIGJ1dCBjb3VsZCBub3QgYmUgZm91bmQgYWZ0ZXJ3YXJkcy4gSG9wZWZ1bGx5IGl0IHdhcyBqdXN0IGRlbGV0ZWQsIHZlcnkgcXVpY2tseT8gSWYgYmFja2JsYXplIGlzIHRha2luZyB0b28gbG9uZyBmb3IgZmlsZXMgdG8gcHJvcGFnYXRlLCB0aGVuIHdlIG1pZ2h0IHJ1biBpbnRvIGlzc3VlcyB3aXRoIHRoZSBkYXRhYmFzZSBhdG9taWNpdHkuYCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZpbGVOYW1lO1xuICAgIH1cbiAgICBwdWJsaWMgYXN5bmMgZGVsKGZpbGVOYW1lOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgdGhpcy5sb2coYGJhY2tibGF6ZSBkZWxldGUgJHtmaWxlTmFtZX1gKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuYXBpUmV0cnlMb2dpYyhgaGlkZUZpbGUgJHtmaWxlTmFtZX1gLCBhc3luYyAoYXBpKSA9PiB7XG4gICAgICAgICAgICAgICAgYXdhaXQgYXBpLmhpZGVGaWxlKHsgYnVja2V0SWQ6IHRoaXMuYnVja2V0SWQsIGZpbGVOYW1lOiBmaWxlTmFtZSB9KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgICAgICAgIHRoaXMubG9nKGBiYWNrYmxhemUgZXJyb3IgaW4gaGlkZSwgcG9zc2libHkgYWxyZWFkeSBoaWRkZW4gJHtmaWxlTmFtZX1cXG4ke2Uuc3RhY2t9YCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBOT1RFOiBEZWxldGlvbiBTRUVNUyB0byB3b3JrLiBUaGlzIERPRVMgYnJlYWsgaWYgd2UgZGVsZXRlIGEgZmlsZSB3aGljaCBrZWVwcyBiZWluZyByZWNyZWF0ZWQsXG4gICAgICAgIC8vICBleCwgdGhlIGhlYXJ0YmVhdC5cbiAgICAgICAgLy8gbGV0IGV4aXN0c0NoZWNrcyA9IDEwO1xuICAgICAgICAvLyB3aGlsZSAoZXhpc3RzQ2hlY2tzID4gMCkge1xuICAgICAgICAvLyAgICAgbGV0IGV4aXN0cyA9IGF3YWl0IHRoaXMuZ2V0SW5mbyhmaWxlTmFtZSk7XG4gICAgICAgIC8vICAgICBpZiAoIWV4aXN0cykgYnJlYWs7XG4gICAgICAgIC8vICAgICBhd2FpdCBkZWxheSgxMDAwKTtcbiAgICAgICAgLy8gICAgIGV4aXN0c0NoZWNrcy0tO1xuICAgICAgICAvLyB9XG4gICAgICAgIC8vIGlmIChleGlzdHNDaGVja3MgPT09IDApIHtcbiAgICAgICAgLy8gICAgIGxldCBleGlzdHMgPSBhd2FpdCB0aGlzLmdldEluZm8oZmlsZU5hbWUpO1xuICAgICAgICAvLyAgICAgZGV2RGVidWdicmVhaygpO1xuICAgICAgICAvLyAgICAgY29uc29sZS53YXJuKGBGaWxlICR7ZmlsZU5hbWV9IHdhcyBkZWxldGVkLCBidXQgd2FzIHN0aWxsIGZvdW5kIGFmdGVyd2FyZHNgKTtcbiAgICAgICAgLy8gICAgIGV4aXN0cyA9IGF3YWl0IHRoaXMuZ2V0SW5mbyhmaWxlTmFtZSk7XG4gICAgICAgIC8vIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgc2V0TGFyZ2VGaWxlKGNvbmZpZzogeyBwYXRoOiBzdHJpbmc7IGdldE5leHREYXRhKCk6IFByb21pc2U8QnVmZmVyIHwgdW5kZWZpbmVkPjsgfSk6IFByb21pc2U8dm9pZD4ge1xuXG4gICAgICAgIGxldCBvbkVycm9yOiAoKCkgPT4gUHJvbWlzZTx2b2lkPilbXSA9IFtdO1xuICAgICAgICBsZXQgdGltZSA9IERhdGUubm93KCk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBsZXQgeyBwYXRoIH0gPSBjb25maWc7XG4gICAgICAgICAgICAvLyBCYWNrYmxhemUgcmVxdWlyZXMgNU1CIGNodW5rcy4gQnV0LCBsYXJnZXIgaXMgbW9yZSBlZmZpY2llbnQgZm9yIHVzLlxuICAgICAgICAgICAgY29uc3QgTUlOX0NIVU5LX1NJWkUgPSAzMiAqIDEwMjQgKiAxMDI0O1xuICAgICAgICAgICAgbGV0IGRhdGFRdWV1ZTogQnVmZmVyW10gPSBbXTtcbiAgICAgICAgICAgIGFzeW5jIGZ1bmN0aW9uIGdldE5leHREYXRhKCk6IFByb21pc2U8QnVmZmVyIHwgdW5kZWZpbmVkPiB7XG4gICAgICAgICAgICAgICAgaWYgKGRhdGFRdWV1ZS5sZW5ndGgpIHJldHVybiBkYXRhUXVldWUuc2hpZnQoKTtcbiAgICAgICAgICAgICAgICAvLyBHZXQgYnVmZmVycyB1bnRpbCB3ZSBnZXQgNU1CLCBPUiwgZW5kLiBCYWNrYmxhemUgcmVxdWlyZXMgdGhpcyBmb3IgbGFyZ2UgZmlsZXMuXG4gICAgICAgICAgICAgICAgbGV0IHRvdGFsQnl0ZXMgPSAwO1xuICAgICAgICAgICAgICAgIGxldCBidWZmZXJzOiBCdWZmZXJbXSA9IFtdO1xuICAgICAgICAgICAgICAgIHdoaWxlICh0b3RhbEJ5dGVzIDwgTUlOX0NIVU5LX1NJWkUpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGRhdGEgPSBhd2FpdCBjb25maWcuZ2V0TmV4dERhdGEoKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFkYXRhKSBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgdG90YWxCeXRlcyArPSBkYXRhLmxlbmd0aDtcbiAgICAgICAgICAgICAgICAgICAgYnVmZmVycy5wdXNoKGRhdGEpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoIWJ1ZmZlcnMubGVuZ3RoKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIHJldHVybiBCdWZmZXIuY29uY2F0KGJ1ZmZlcnMpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBsZXQgZmlsZU5hbWUgPSBwYXRoO1xuICAgICAgICAgICAgbGV0IGRhdGEgPSBhd2FpdCBnZXROZXh0RGF0YSgpO1xuICAgICAgICAgICAgaWYgKCFkYXRhPy5sZW5ndGgpIHJldHVybjtcbiAgICAgICAgICAgIC8vIEJhY2tibGF6ZSBkaXNhbGxvd3Mgb3Zlcmx5IHNtYWxsIGZpbGVzXG4gICAgICAgICAgICBpZiAoZGF0YS5sZW5ndGggPCBNSU5fQ0hVTktfU0laRSkge1xuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuc2V0KGZpbGVOYW1lLCBkYXRhKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBCYWNrYmxhemUgZGlzYWxsb3dzIGxlc3MgdGhhbiAyIGNodW5rc1xuICAgICAgICAgICAgbGV0IHNlY29uZERhdGEgPSBhd2FpdCBnZXROZXh0RGF0YSgpO1xuICAgICAgICAgICAgaWYgKCFzZWNvbmREYXRhPy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnNldChmaWxlTmFtZSwgZGF0YSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gQUxTTywgaWYgdGhlcmUgYXJlIHR3byBjaHVua3MsIGJ1dCBvbmUgaXMgdG9vIHNtYWxsLCBjb21iaW5lIGl0LiBUaGlzIGhlbHBzIGFsbG93IHVzIG5ldmVyXG4gICAgICAgICAgICAvLyAgc2VuZCBzbWFsbCBjaHVua3MuXG4gICAgICAgICAgICBpZiAoc2Vjb25kRGF0YS5sZW5ndGggPCBNSU5fQ0hVTktfU0laRSkge1xuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuc2V0KGZpbGVOYW1lLCBCdWZmZXIuY29uY2F0KFtkYXRhLCBzZWNvbmREYXRhXSkpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMubG9nKGBVcGxvYWRpbmcgbGFyZ2UgZmlsZSAke2NvbmZpZy5wYXRofWApO1xuICAgICAgICAgICAgZGF0YVF1ZXVlLnVuc2hpZnQoZGF0YSwgc2Vjb25kRGF0YSk7XG5cblxuICAgICAgICAgICAgbGV0IHVwbG9hZEluZm8gPSBhd2FpdCB0aGlzLmFwaVJldHJ5TG9naWMoYHN0YXJ0TGFyZ2VGaWxlICR7ZmlsZU5hbWV9YCwgYXN5bmMgKGFwaSkgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiBhd2FpdCBhcGkuc3RhcnRMYXJnZUZpbGUoe1xuICAgICAgICAgICAgICAgICAgICBidWNrZXRJZDogdGhpcy5idWNrZXRJZCxcbiAgICAgICAgICAgICAgICAgICAgZmlsZU5hbWU6IGZpbGVOYW1lLFxuICAgICAgICAgICAgICAgICAgICBjb250ZW50VHlwZTogXCJiMi94LWF1dG9cIixcbiAgICAgICAgICAgICAgICAgICAgZmlsZUluZm86IHt9LFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBvbkVycm9yLnB1c2goYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuYXBpUmV0cnlMb2dpYyhgY2FuY2VsTGFyZ2VGaWxlICR7ZmlsZU5hbWV9YCwgYXN5bmMgKGFwaSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCBhcGkuY2FuY2VsTGFyZ2VGaWxlKHsgZmlsZUlkOiB1cGxvYWRJbmZvLmZpbGVJZCB9KTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBjb25zdCBMT0dfSU5URVJWQUwgPSB0aW1lSW5NaW51dGU7XG4gICAgICAgICAgICBsZXQgbmV4dExvZ1RpbWUgPSBEYXRlLm5vdygpICsgTE9HX0lOVEVSVkFMO1xuXG4gICAgICAgICAgICBsZXQgcGFydE51bWJlciA9IDE7XG4gICAgICAgICAgICBsZXQgcGFydFNoYTFBcnJheTogc3RyaW5nW10gPSBbXTtcbiAgICAgICAgICAgIGxldCB0b3RhbEJ5dGVzID0gMDtcbiAgICAgICAgICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICAgICAgICAgICAgZGF0YSA9IGF3YWl0IGdldE5leHREYXRhKCk7XG4gICAgICAgICAgICAgICAgaWYgKCFkYXRhKSBicmVhaztcbiAgICAgICAgICAgICAgICAvLyBTby4uLiBpZiB0aGUgbmV4dCBjaHVuayBpcyB0aGUgbGFzdCBvbmUsIGNvbWJpbmUgaXQgd2l0aCB0aGUgY3VycmVudCBvbmUuIFRoaXNcbiAgICAgICAgICAgICAgICAvLyAgcHJldmVudHMgQU5ZIHVwbG9hZHMgZnJvbSBiZWluZyA8IHRoZSB0aHJlc2hvbGQsIGFzIGFwcGFyZW50bHkgdGhlIFwibGFzdCBwYXJ0XCJcbiAgICAgICAgICAgICAgICAvLyAgY2hlY2sgaW4gYmFja2JsYXplIGZhaWxzIHdoZW4gd2UgaGF2ZSB0byByZXRyeSBhbiB1cGxvYWQgKGR1ZSB0byBcIm5vIHRvbWVzIGF2YWlsYWJsZVwiKS5cbiAgICAgICAgICAgICAgICAvLyAgV2VsbCBpdCBjYW4ndCBmYWlsIGlmIGV2ZW4gdGhlIGxhc3QgcGFydCBpcyA+IDVNQiwgbm93IGNhbiBpdCFcbiAgICAgICAgICAgICAgICAvLyBCVVQsIG9ubHkgaWYgdGhpcyBpc24ndCB0aGUgZmlyc3QgY2h1bmssIG90aGVyd2lzZSB3ZSBtaWdodCB0cnkgdG8gc2VuZFxuICAgICAgICAgICAgICAgIC8vICBhIHNpbmdsZSBjaHVuaywgd2hpY2ggd2UgY2FuJ3QgZG8uXG4gICAgICAgICAgICAgICAgaWYgKHBhcnRTaGExQXJyYXkubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgbWF5YmVMYXN0RGF0YSA9IGF3YWl0IGdldE5leHREYXRhKCk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChtYXliZUxhc3REYXRhKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobWF5YmVMYXN0RGF0YS5sZW5ndGggPCBNSU5fQ0hVTktfU0laRSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEl0J3MgdGhlIGxhc3Qgb25lLCBzbyBjb25zdW1lIGl0IG5vd1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBCdWZmZXIuY29uY2F0KFtkYXRhLCBtYXliZUxhc3REYXRhXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEl0J3Mgbm90IHRoZSBsYXN0IG9uZS4gUHV0IGl0IGJhY2ssIGluIGNhc2UgdGhlIG9uZSBBRlRFUiBpcyB0aGUgbGFzdFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICBvbmUsIGluIHdoaWNoIGNhc2Ugd2UgbmVlZCB0byBtZXJnZSBtYXliZUxhc3REYXRhIHdpdGggdGhlIG5leHQgbmV4dCBkYXRhLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFRdWV1ZS51bnNoaWZ0KG1heWJlTGFzdERhdGEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGxldCBzaGExID0gcmVxdWlyZShcImNyeXB0b1wiKS5jcmVhdGVIYXNoKFwic2hhMVwiKTtcbiAgICAgICAgICAgICAgICBzaGExLnVwZGF0ZShkYXRhKTtcbiAgICAgICAgICAgICAgICBsZXQgc2hhMUhleCA9IHNoYTEuZGlnZXN0KFwiaGV4XCIpO1xuICAgICAgICAgICAgICAgIHBhcnRTaGExQXJyYXkucHVzaChzaGExSGV4KTtcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmFwaVJldHJ5TG9naWMoYHVwbG9hZFBhcnQjJHtwYXJ0TnVtYmVyfSAke2ZpbGVOYW1lfWAsIGFzeW5jIChhcGkpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFkYXRhKSB0aHJvdyBuZXcgRXJyb3IoXCJJbXBvc3NpYmxlLCBkYXRhIGlzIHVuZGVmaW5lZFwiKTtcblxuICAgICAgICAgICAgICAgICAgICBsZXQgdGltZVN0ciA9IGZvcm1hdFRpbWUoRGF0ZS5ub3coKSAtIHRpbWUpO1xuICAgICAgICAgICAgICAgICAgICBsZXQgcmF0ZVN0ciA9IGZvcm1hdE51bWJlcih0b3RhbEJ5dGVzIC8gKERhdGUubm93KCkgLSB0aW1lKSAqIDEwMDApICsgXCJCL3NcIjtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2coYFVwbG9hZGluZyBsYXJnZSBmaWxlIHBhcnQgJHtwYXJ0TnVtYmVyfSwgdXBsb2FkZWQgJHtibHVlKGZvcm1hdE51bWJlcih0b3RhbEJ5dGVzKSArIFwiQlwiKX0gaW4gJHtibHVlKHRpbWVTdHIpfSAoJHtibHVlKHJhdGVTdHIpfSkuICR7Y29uZmlnLnBhdGh9YCk7XG4gICAgICAgICAgICAgICAgICAgIHRvdGFsQnl0ZXMgKz0gZGF0YS5sZW5ndGg7XG5cbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgYXBpLnVwbG9hZFBhcnQoe1xuICAgICAgICAgICAgICAgICAgICAgICAgZmlsZUlkOiB1cGxvYWRJbmZvLmZpbGVJZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhcnROdW1iZXI6IHBhcnROdW1iZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICBkYXRhOiBkYXRhLFxuICAgICAgICAgICAgICAgICAgICAgICAgc2hhMTogc2hhMUhleCxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgcGFydE51bWJlcisrO1xuXG4gICAgICAgICAgICAgICAgaWYgKERhdGUubm93KCkgPiBuZXh0TG9nVGltZSkge1xuICAgICAgICAgICAgICAgICAgICBuZXh0TG9nVGltZSA9IERhdGUubm93KCkgKyBMT0dfSU5URVJWQUw7XG4gICAgICAgICAgICAgICAgICAgIGxldCB0aW1lU3RyID0gZm9ybWF0VGltZShEYXRlLm5vdygpIC0gdGltZSk7XG4gICAgICAgICAgICAgICAgICAgIGxldCByYXRlU3RyID0gZm9ybWF0TnVtYmVyKHRvdGFsQnl0ZXMgLyAoRGF0ZS5ub3coKSAtIHRpbWUpICogMTAwMCkgKyBcIkIvc1wiO1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhgU3RpbGwgdXBsb2FkaW5nIGxhcmdlIGZpbGUgYXQgJHtEYXRlLm5vdygpfS4gVXBsb2FkZWQgJHtmb3JtYXROdW1iZXIodG90YWxCeXRlcyl9QiBpbiAke3RpbWVTdHJ9ICgke3JhdGVTdHJ9KS4gJHtjb25maWcucGF0aH1gKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmxvZyhgRmluaXNoZWQgdXBsb2FkaW5nIGxhcmdlIGZpbGUgdXBsb2FkZWQgJHtncmVlbihmb3JtYXROdW1iZXIodG90YWxCeXRlcykpfUJgKTtcblxuICAgICAgICAgICAgYXdhaXQgdGhpcy5hcGlSZXRyeUxvZ2ljKGBmaW5pc2hMYXJnZUZpbGUgJHtmaWxlTmFtZX1gLCBhc3luYyAoYXBpKSA9PiB7XG4gICAgICAgICAgICAgICAgYXdhaXQgYXBpLmZpbmlzaExhcmdlRmlsZSh7XG4gICAgICAgICAgICAgICAgICAgIGZpbGVJZDogdXBsb2FkSW5mby5maWxlSWQsXG4gICAgICAgICAgICAgICAgICAgIHBhcnRTaGExQXJyYXk6IHBhcnRTaGExQXJyYXksXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICAgICAgICBmb3IgKGxldCBjIG9mIG9uRXJyb3IpIHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCBjKCk7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGBFcnJvciBkdXJpbmcgZXJyb3IgY2xlYW4uIElnbm9yaW5nLCB3ZSB3aWxsIHJldGhyb3cgdGhlIG9yaWdpbmFsIGVycm9yLCBwYXRoICR7Y29uZmlnLnBhdGh9YCwgZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEVycm9yIGluIHNldExhcmdlRmlsZSBmb3IgJHtjb25maWcucGF0aH06ICR7ZS5zdGFja31gKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBnZXRJbmZvKGZpbGVOYW1lOiBzdHJpbmcpOiBQcm9taXNlPHsgd3JpdGVUaW1lOiBudW1iZXI7IHNpemU6IG51bWJlcjsgfSB8IHVuZGVmaW5lZD4ge1xuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5hcGlSZXRyeUxvZ2ljKGBnZXRJbmZvICR7ZmlsZU5hbWV9YCwgYXN5bmMgKGFwaSkgPT4ge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAvLyBOT1RFOiBBcHBhcmVudGx5LCB0aGVyZSdzIG5vIG90aGVyIHdheSB0byBkbyB0aGlzLCBhcyB0aGUgZmlsZSBuYW1lIGRvZXMgbm90IGVxdWFsIHRoZSBmaWxlIElELCBhbmQgZ2V0IGZpbGUgaW5mbyByZXF1aXJlcyB0aGUgZmlsZSBJRC5cbiAgICAgICAgICAgICAgICBsZXQgaW5mbyA9IGF3YWl0IGFwaS5saXN0RmlsZU5hbWVzKHsgYnVja2V0SWQ6IHRoaXMuYnVja2V0SWQsIHByZWZpeDogZmlsZU5hbWUsIG1heEZpbGVDb3VudDogMTAgfSk7XG4gICAgICAgICAgICAgICAgbGV0IGZpbGUgPSBpbmZvLmZpbGVzLmZpbmQoeCA9PiB4LmZpbGVOYW1lID09PSBmaWxlTmFtZSAmJiB4LmFjdGlvbiA9PT0gXCJ1cGxvYWRcIik7XG4gICAgICAgICAgICAgICAgaWYgKCFmaWxlKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubG9nKGBCYWNrYmxhemUgZmlsZSBub3QgZXhpc3RzICR7ZmlsZU5hbWV9YCk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMubG9nKGBCYWNrYmxhemUgZmlsZSBleGlzdHMgJHtmaWxlTmFtZX1gKTtcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICB3cml0ZVRpbWU6IGZpbGUudXBsb2FkVGltZXN0YW1wLFxuICAgICAgICAgICAgICAgICAgICBzaXplOiBmaWxlLmNvbnRlbnRMZW5ndGgsXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgICAgICAgICAgIGlmIChlLnN0YWNrLmluY2x1ZGVzKGBmaWxlX25vdF9mb3VuZGApKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubG9nKGBCYWNrYmxhemUgZmlsZSBub3QgZXhpc3RzICR7ZmlsZU5hbWV9YCk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRocm93IGU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIEZvciBleGFtcGxlIGZpbmRGaWxlTmFtZXMoXCJpcHMvXCIpXG4gICAgcHVibGljIGFzeW5jIGZpbmQocHJlZml4OiBzdHJpbmcsIGNvbmZpZz86IHsgc2hhbGxvdz86IGJvb2xlYW47IHR5cGU6IFwiZmlsZXNcIiB8IFwiZm9sZGVyc1wiIH0pOiBQcm9taXNlPHN0cmluZ1tdPiB7XG4gICAgICAgIGxldCByZXN1bHQgPSBhd2FpdCB0aGlzLmZpbmRJbmZvKHByZWZpeCwgY29uZmlnKTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdC5tYXAoeCA9PiB4LnBhdGgpO1xuICAgIH1cbiAgICBwdWJsaWMgYXN5bmMgZmluZEluZm8ocHJlZml4OiBzdHJpbmcsIGNvbmZpZz86IHsgc2hhbGxvdz86IGJvb2xlYW47IHR5cGU6IFwiZmlsZXNcIiB8IFwiZm9sZGVyc1wiIH0pOiBQcm9taXNlPHsgcGF0aDogc3RyaW5nOyBjcmVhdGVUaW1lOiBudW1iZXI7IHNpemU6IG51bWJlcjsgfVtdPiB7XG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmFwaVJldHJ5TG9naWMoYGZpbmRJbmZvICR7cHJlZml4fWAsIGFzeW5jIChhcGkpID0+IHtcbiAgICAgICAgICAgIGlmICghY29uZmlnPy5zaGFsbG93ICYmIGNvbmZpZz8udHlwZSA9PT0gXCJmb2xkZXJzXCIpIHtcbiAgICAgICAgICAgICAgICBsZXQgYWxsRmlsZXMgPSBhd2FpdCB0aGlzLmZpbmRJbmZvKHByZWZpeCk7XG4gICAgICAgICAgICAgICAgbGV0IGFsbEZvbGRlcnMgPSBuZXcgTWFwPHN0cmluZywgeyBwYXRoOiBzdHJpbmc7IGNyZWF0ZVRpbWU6IG51bWJlcjsgc2l6ZTogbnVtYmVyIH0+KCk7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgeyBwYXRoLCBjcmVhdGVUaW1lLCBzaXplIH0gb2YgYWxsRmlsZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGZvbGRlciA9IHBhdGguc3BsaXQoXCIvXCIpLnNsaWNlKDAsIC0xKS5qb2luKFwiL1wiKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFmb2xkZXIpIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICBhbGxGb2xkZXJzLnNldChmb2xkZXIsIHsgcGF0aDogZm9sZGVyLCBjcmVhdGVUaW1lLCBzaXplIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gQXJyYXkuZnJvbShhbGxGb2xkZXJzLnZhbHVlcygpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxldCBmaWxlcyA9IG5ldyBNYXA8c3RyaW5nLCB7IHBhdGg6IHN0cmluZzsgY3JlYXRlVGltZTogbnVtYmVyOyBzaXplOiBudW1iZXI7IH0+KCk7XG4gICAgICAgICAgICBsZXQgc3RhcnRGaWxlTmFtZSA9IFwiXCI7XG4gICAgICAgICAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgICAgICAgICAgIGxldCByZXN1bHQgPSBhd2FpdCBhcGkubGlzdEZpbGVOYW1lcyh7XG4gICAgICAgICAgICAgICAgICAgIGJ1Y2tldElkOiB0aGlzLmJ1Y2tldElkLFxuICAgICAgICAgICAgICAgICAgICBwcmVmaXg6IHByZWZpeCxcbiAgICAgICAgICAgICAgICAgICAgc3RhcnRGaWxlTmFtZSxcbiAgICAgICAgICAgICAgICAgICAgbWF4RmlsZUNvdW50OiAxMDAwLFxuICAgICAgICAgICAgICAgICAgICBkZWxpbWl0ZXI6IGNvbmZpZz8uc2hhbGxvdyA/IFwiL1wiIDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGZpbGUgb2YgcmVzdWx0LmZpbGVzKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChmaWxlLmFjdGlvbiA9PT0gXCJ1cGxvYWRcIiAmJiBjb25maWc/LnR5cGUgIT09IFwiZm9sZGVyc1wiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBmaWxlcy5zZXQoZmlsZS5maWxlTmFtZSwgeyBwYXRoOiBmaWxlLmZpbGVOYW1lLCBjcmVhdGVUaW1lOiBmaWxlLnVwbG9hZFRpbWVzdGFtcCwgc2l6ZTogZmlsZS5jb250ZW50TGVuZ3RoIH0pO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGZpbGUuYWN0aW9uID09PSBcImZvbGRlclwiICYmIGNvbmZpZz8udHlwZSA9PT0gXCJmb2xkZXJzXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBmb2xkZXIgPSBmaWxlLmZpbGVOYW1lO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZvbGRlci5lbmRzV2l0aChcIi9cIikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb2xkZXIgPSBmb2xkZXIuc2xpY2UoMCwgLTEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZmlsZXMuc2V0KGZvbGRlciwgeyBwYXRoOiBmb2xkZXIsIGNyZWF0ZVRpbWU6IGZpbGUudXBsb2FkVGltZXN0YW1wLCBzaXplOiBmaWxlLmNvbnRlbnRMZW5ndGggfSk7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBzdGFydEZpbGVOYW1lID0gcmVzdWx0Lm5leHRGaWxlTmFtZTtcbiAgICAgICAgICAgICAgICBpZiAoIXN0YXJ0RmlsZU5hbWUpIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIEFycmF5LmZyb20oZmlsZXMudmFsdWVzKCkpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgYXNzZXJ0UGF0aFZhbGlkKHBhdGg6IHN0cmluZykge1xuICAgICAgICBsZXQgYnl0ZXMgPSBCdWZmZXIuZnJvbShwYXRoLCBcInV0ZjhcIik7XG4gICAgICAgIGlmIChieXRlcy5sZW5ndGggPiAxMDAwKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFBhdGggdG9vIGxvbmc6ICR7cGF0aC5sZW5ndGh9IGNoYXJhY3RlcnMgPiAxMDAwIGNoYXJhY3RlcnMuIFBhdGg6ICR7cGF0aH1gKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBtb3ZlKGNvbmZpZzoge1xuICAgICAgICBwYXRoOiBzdHJpbmc7XG4gICAgICAgIHRhcmdldDogSUFyY2hpdmVzO1xuICAgICAgICB0YXJnZXRQYXRoOiBzdHJpbmc7XG4gICAgICAgIGNvcHlJbnN0ZWFkPzogYm9vbGVhbjtcbiAgICB9KSB7XG4gICAgICAgIGxldCB7IHBhdGgsIHRhcmdldCwgdGFyZ2V0UGF0aCB9ID0gY29uZmlnO1xuICAgICAgICAvLyBBIHNlbGYgbW92ZSBzaG91bGQgTk9PUCAoYW5kIGRlZmluaXRlbHkgbm90IGNvcHksIGFuZCB0aGVuIGRlbGV0ZSBpdHNlbGYhKVxuICAgICAgICBpZiAodGFyZ2V0ID09PSB0aGlzICYmIHBhdGggPT09IHRhcmdldFBhdGgpIHtcbiAgICAgICAgICAgIHRoaXMubG9nKGBCYWNrYmxhemUgbW92ZSBwYXRoIHRvIGl0c2VsZi4gU2tpcHBpbmcgbW92ZSwgYXMgdGhlcmUgaXMgbm8gd29yayB0byBkby4gJHtwYXRofWApO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0YXJnZXQgaW5zdGFuY2VvZiBBcmNoaXZlc0JhY2tibGF6ZSkge1xuICAgICAgICAgICAgbGV0IHRhcmdldEJ1Y2tldElkID0gdGFyZ2V0LmJ1Y2tldElkO1xuICAgICAgICAgICAgaWYgKHRhcmdldEJ1Y2tldElkID09PSB0aGlzLmJ1Y2tldElkICYmIHBhdGggPT09IHRhcmdldFBhdGgpIHJldHVybjtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuYXBpUmV0cnlMb2dpYyhgbW92ZSAke3BhdGh9IC0+ICR7dGFyZ2V0UGF0aH1gLCBhc3luYyAoYXBpKSA9PiB7XG4gICAgICAgICAgICAgICAgLy8gVWdoLi4uIGxpc3RpbmcgdGhlIGZpbGUgbmFtZSBzdWNrcywgYnV0Li4uIEkgZ3Vlc3MgaXQncyBzdGlsbCBiZXR0ZXIgdGhhblxuICAgICAgICAgICAgICAgIC8vICBkb3dubG9hZGluZyBhbmQgcmUtdXBsb2FkaW5nIHRoZSBlbnRpcmUgZmlsZS5cbiAgICAgICAgICAgICAgICBsZXQgaW5mbyA9IGF3YWl0IGFwaS5saXN0RmlsZU5hbWVzKHsgYnVja2V0SWQ6IHRoaXMuYnVja2V0SWQsIHByZWZpeDogcGF0aCwgbWF4RmlsZUNvdW50OiAxMCB9KTtcbiAgICAgICAgICAgICAgICBsZXQgZmlsZSA9IGluZm8uZmlsZXMuZmluZCh4ID0+IHguZmlsZU5hbWUgPT09IHBhdGgpO1xuICAgICAgICAgICAgICAgIGlmICghZmlsZSkgdGhyb3cgbmV3IEVycm9yKGBGaWxlIG5vdCBmb3VuZCB0byBtb3ZlOiAke3BhdGh9YCk7XG4gICAgICAgICAgICAgICAgYXdhaXQgYXBpLmNvcHlGaWxlKHtcbiAgICAgICAgICAgICAgICAgICAgc291cmNlRmlsZUlkOiBmaWxlLmZpbGVJZCxcbiAgICAgICAgICAgICAgICAgICAgZmlsZU5hbWU6IHRhcmdldFBhdGgsXG4gICAgICAgICAgICAgICAgICAgIGRlc3RpbmF0aW9uQnVja2V0SWQ6IHRhcmdldEJ1Y2tldElkLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBsZXQgZGF0YSA9IGF3YWl0IHRoaXMuZ2V0KHBhdGgpO1xuICAgICAgICAgICAgaWYgKCFkYXRhKSB0aHJvdyBuZXcgRXJyb3IoYEZpbGUgbm90IGZvdW5kIHRvIG1vdmU6ICR7cGF0aH1gKTtcbiAgICAgICAgICAgIGF3YWl0IHRhcmdldC5zZXQodGFyZ2V0UGF0aCwgZGF0YSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIWNvbmZpZy5jb3B5SW5zdGVhZCkge1xuICAgICAgICAgICAgbGV0IGV4aXN0cyA9IGF3YWl0IHRoaXMuZ2V0SW5mbyh0YXJnZXRQYXRoKTtcbiAgICAgICAgICAgIGlmICghZXhpc3RzKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihgRmlsZSBub3QgZm91bmQgYWZ0ZXIgbW92ZS4gTGVhdmluZyBCT1RIIGZpbGVzLiAke3RhcmdldFBhdGh9IHdhcyBub3QgZm91bmQuIEJlaW5nIG1vdmVkIGZyb20gJHtwYXRofWApO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmRlbChwYXRoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBjb3B5KGNvbmZpZzoge1xuICAgICAgICBwYXRoOiBzdHJpbmc7XG4gICAgICAgIHRhcmdldDogSUFyY2hpdmVzO1xuICAgICAgICB0YXJnZXRQYXRoOiBzdHJpbmc7XG4gICAgfSk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICByZXR1cm4gdGhpcy5tb3ZlKHsgLi4uY29uZmlnLCBjb3B5SW5zdGVhZDogdHJ1ZSB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgZ2V0VVJMKHBhdGg6IHN0cmluZykge1xuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5hcGlSZXRyeUxvZ2ljKGBnZXRVUkwgJHtwYXRofWAsIGFzeW5jIChhcGkpID0+IHtcbiAgICAgICAgICAgIGlmIChwYXRoLnN0YXJ0c1dpdGgoXCIvXCIpKSB7XG4gICAgICAgICAgICAgICAgcGF0aCA9IHBhdGguc2xpY2UoMSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgYXBpLmdldERvd25sb2FkVVJMKFwiZmlsZS9cIiArIHRoaXMuYnVja2V0TmFtZSArIFwiL1wiICsgcGF0aCk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBnZXREb3dubG9hZEF1dGhvcml6YXRpb24oY29uZmlnOiB7XG4gICAgICAgIGZpbGVOYW1lUHJlZml4Pzogc3RyaW5nO1xuICAgICAgICB2YWxpZER1cmF0aW9uSW5TZWNvbmRzOiBudW1iZXI7XG4gICAgICAgIGIyQ29udGVudERpc3Bvc2l0aW9uPzogc3RyaW5nO1xuICAgICAgICBiMkNvbnRlbnRMYW5ndWFnZT86IHN0cmluZztcbiAgICAgICAgYjJFeHBpcmVzPzogc3RyaW5nO1xuICAgICAgICBiMkNhY2hlQ29udHJvbD86IHN0cmluZztcbiAgICAgICAgYjJDb250ZW50RW5jb2Rpbmc/OiBzdHJpbmc7XG4gICAgICAgIGIyQ29udGVudFR5cGU/OiBzdHJpbmc7XG4gICAgfSk6IFByb21pc2U8e1xuICAgICAgICBidWNrZXRJZDogc3RyaW5nO1xuICAgICAgICBmaWxlTmFtZVByZWZpeDogc3RyaW5nO1xuICAgICAgICBhdXRob3JpemF0aW9uVG9rZW46IHN0cmluZztcbiAgICB9PiB7XG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmFwaVJldHJ5TG9naWMoYGdldERvd25sb2FkQXV0aG9yaXphdGlvbiAke2NvbmZpZy5maWxlTmFtZVByZWZpeCA/PyBcIlwifWAsIGFzeW5jIChhcGkpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCBhcGkuZ2V0RG93bmxvYWRBdXRob3JpemF0aW9uKHtcbiAgICAgICAgICAgICAgICBidWNrZXRJZDogdGhpcy5idWNrZXRJZCxcbiAgICAgICAgICAgICAgICBmaWxlTmFtZVByZWZpeDogY29uZmlnLmZpbGVOYW1lUHJlZml4ID8/IFwiXCIsXG4gICAgICAgICAgICAgICAgLi4uY29uZmlnLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH1cbn1cblxuLypcbk5hbWVzIHNob3VsZCBiZSBhIFVURi04IHN0cmluZyB1cCB0byAxMDI0IGJ5dGVzIHdpdGggdGhlIGZvbGxvd2luZyBleGNlcHRpb25zOlxuICAgIENoYXJhY3RlciBjb2RlcyBiZWxvdyAzMiBhcmUgbm90IGFsbG93ZWQuXG4gICAgREVMIGNoYXJhY3RlcnMgKDEyNykgYXJlIG5vdCBhbGxvd2VkLlxuICAgIEJhY2tzbGFzaGVzIGFyZSBub3QgYWxsb3dlZC5cbiAgICBGaWxlIG5hbWVzIGNhbm5vdCBzdGFydCB3aXRoIC8sIGVuZCB3aXRoIC8sIG9yIGNvbnRhaW4gLy8uXG4qL1xuXG5cbmV4cG9ydCBjb25zdCBnZXRBcmNoaXZlc0JhY2tibGF6ZSA9IGNhY2hlKChkb21haW46IHN0cmluZykgPT4ge1xuICAgIHJldHVybiBuZXcgQXJjaGl2ZXNCYWNrYmxhemUoeyBidWNrZXROYW1lOiBkb21haW4gfSk7XG59KTtcbmV4cG9ydCBjb25zdCBnZXRBcmNoaXZlc0JhY2tibGF6ZVByaXZhdGVJbW11dGFibGUgPSBjYWNoZSgoZG9tYWluOiBzdHJpbmcpID0+IHtcbiAgICByZXR1cm4gbmV3IEFyY2hpdmVzQmFja2JsYXplKHtcbiAgICAgICAgYnVja2V0TmFtZTogZG9tYWluICsgXCItcHJpdmF0ZS1pbW11dGFibGVcIixcbiAgICAgICAgaW1tdXRhYmxlOiB0cnVlXG4gICAgfSk7XG59KTtcbmV4cG9ydCBjb25zdCBnZXRBcmNoaXZlc0JhY2tibGF6ZVB1YmxpY0ltbXV0YWJsZSA9IGNhY2hlKChkb21haW46IHN0cmluZykgPT4ge1xuICAgIHJldHVybiBuZXcgQXJjaGl2ZXNCYWNrYmxhemUoe1xuICAgICAgICBidWNrZXROYW1lOiBkb21haW4gKyBcIi1wdWJsaWMtaW1tdXRhYmxlXCIsXG4gICAgICAgIHB1YmxpYzogdHJ1ZSxcbiAgICAgICAgaW1tdXRhYmxlOiB0cnVlLFxuICAgICAgICBhbGxvd2VkT3JpZ2luczogW2BodHRwczovLyR7ZG9tYWlufWAsIGBodHRwczovLzEyNy0wLTAtMS4ke2RvbWFpbn06NzAwN2BdLFxuICAgIH0pO1xufSk7XG5cbi8vIE5PVEU6IENhY2hlIGJ5IGEgbWludXRlLiBUaGlzIG1pZ2h0IGJlIGEgYmFkIGlkZWEsIGJ1dC4uLiB1c3VhbGx5IHdob2xlIHJlYXNvbiBmb3IgcHVibGljIGlzXG4vLyAgZm9yIGNsb3VkZmxhcmUgY2FjaGluZyAoYXMgb3RoZXJ3aXNlIHdlIGNhbiBqdXN0IGFjY2VzcyBpdCB0aHJvdWdoIGEgc2VydmVyKSwgb3IgZm9yIGxhcmdlIGZpbGVzXG4vLyAgKHdoaWNoIHNob3VsZCBiZSBjYWNoZWQgYW55d2F5cywgYW5kIHByb2JhYmx5IGV2ZW4gdXNlIGltbXV0YWJsZSBjYWNoaW5nKS5cbmV4cG9ydCBjb25zdCBnZXRBcmNoaXZlc0JhY2tibGF6ZVB1YmxpYyA9IGNhY2hlKChkb21haW46IHN0cmluZykgPT4ge1xuICAgIHJldHVybiBuZXcgQXJjaGl2ZXNCYWNrYmxhemUoe1xuICAgICAgICBidWNrZXROYW1lOiBkb21haW4gKyBcIi1wdWJsaWNcIixcbiAgICAgICAgcHVibGljOiB0cnVlLFxuICAgICAgICBjYWNoZVRpbWU6IHRpbWVJbk1pbnV0ZSxcbiAgICAgICAgYWxsb3dlZE9yaWdpbnM6IFtgaHR0cHM6Ly8ke2RvbWFpbn1gLCBgaHR0cHM6Ly8xMjctMC0wLTEuJHtkb21haW59OjcwMDdgXSxcbiAgICB9KTtcbn0pOyJdfQ==
|
|
801
|
-
/* _JS_SOURCE_HASH = "
|
|
800
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFja2JsYXplLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiYmFja2JsYXplLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLHlEQUEwRDtBQUcxRCxtREFBa0Y7QUFDbEYsMkRBQXFEO0FBQ3JELGtFQUFpRjtBQUNqRix3RUFBZ0Y7QUFFaEYsOENBQXNCO0FBQ3RCLGlEQUE4QztBQUM5QyxxREFBeUQ7QUFDekQsMkNBQXVHO0FBT3ZHLElBQUksY0FBYyxHQUFHLElBQUEsY0FBSSxFQUFDLEtBQUssSUFBNkIsRUFBRTtJQUMxRCxJQUFJLEtBQUssR0FBRyxNQUFNLElBQUEscUJBQVMsRUFBQyxpQ0FBaUMsQ0FBQyxDQUFDO0lBQy9ELElBQUksR0FBRyxHQUFHLE1BQU0sSUFBQSxxQkFBUyxFQUFDLCtCQUErQixDQUFDLENBQUM7SUFDM0QsT0FBTztRQUNILGdCQUFnQixFQUFFLEtBQUs7UUFDdkIsY0FBYyxFQUFFLEdBQUc7S0FDdEIsQ0FBQztBQUNOLENBQUMsQ0FBQyxDQUFDO0FBQ0gsTUFBTSxNQUFNLEdBQUcsSUFBQSxjQUFJLEVBQUMsS0FBSyxJQUFJLEVBQUU7SUFDM0IsSUFBSSxLQUFLLEdBQUcsTUFBTSxjQUFjLEVBQUUsQ0FBQztJQUVuQyw0RkFBNEY7SUFDNUYsb0VBQW9FO0lBQ3BFLElBQUksWUFBWSxHQUFHLE1BQU0sSUFBQSxvQkFBWSxFQUFDLDJEQUEyRCxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFO1FBQzVILE9BQU8sRUFBRTtZQUNMLGFBQWEsRUFBRSxRQUFRLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsZ0JBQWdCLEdBQUcsR0FBRyxHQUFHLEtBQUssQ0FBQyxjQUFjLENBQUMsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDO1NBQ2hIO0tBQ0osQ0FBQyxDQUFDO0lBRUgsSUFBSSxJQUFJLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxZQUFZLENBQUMsUUFBUSxFQUFFLENB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bGF6eSB9IGZyb20gXCJzb2NrZXQtZnVuY3Rpb24vc3JjL2NhY2hpbmdcIjtcbmltcG9ydCBmcyBmcm9tIFwiZnNcIjtcbmltcG9ydCBvcyBmcm9tIFwib3NcIjtcbmltcG9ydCB7IGlzTm9kZSwgc29ydCwgdGltZUluSG91ciwgdGltZUluTWludXRlIH0gZnJvbSBcInNvY2tldC1mdW5jdGlvbi9zcmMvbWlzY1wiO1xuaW1wb3J0IHsgZGVsYXkgfSBmcm9tIFwic29ja2V0LWZ1bmN0aW9uL3NyYy9iYXRjaGluZ1wiO1xuaW1wb3J0IHsgZm9ybWF0TnVtYmVyLCBmb3JtYXRUaW1lIH0gZnJvbSBcInNvY2tldC1mdW5jdGlvbi9zcmMvZm9ybWF0dGluZy9mb3JtYXRcIjtcbmltcG9ydCB7IGJsdWUsIGdyZWVuLCBtYWdlbnRhIH0gZnJvbSBcInNvY2tldC1mdW5jdGlvbi9zcmMvZm9ybWF0dGluZy9sb2dDb2xvcnNcIjtcbmltcG9ydCBkZWJ1Z2JyZWFrIGZyb20gXCJkZWJ1Z2JyZWFrXCI7XG5pbXBvcnQgZG5zIGZyb20gXCJkbnNcIjtcbmltcG9ydCB7IGdldFNlY3JldCB9IGZyb20gXCIuLi9taXNjL2dldFNlY3JldFwiO1xuaW1wb3J0IHsgaHR0cHNSZXF1ZXN0IH0gZnJvbSBcInNvY2tldC1mdW5jdGlvbi9zcmMvaHR0cHNcIjtcbmltcG9ydCB7IElBcmNoaXZlcywgQXJjaGl2ZXNDb25maWcsIGFzc2VydFZhbGlkTGFzdE1vZGlmaWVkLCBJTU1VVEFCTEVfQ0FDSEVfVElNRSB9IGZyb20gXCIuL0lBcmNoaXZlc1wiO1xuXG50eXBlIEJhY2tibGF6ZUNyZWRzID0ge1xuICAgIGFwcGxpY2F0aW9uS2V5SWQ6IHN0cmluZztcbiAgICBhcHBsaWNhdGlvbktleTogc3RyaW5nO1xufTtcblxubGV0IGJhY2tibGF6ZUNyZWRzID0gbGF6eShhc3luYyAoKTogUHJvbWlzZTxCYWNrYmxhemVDcmVkcz4gPT4ge1xuICAgIGxldCBrZXlJZCA9IGF3YWl0IGdldFNlY3JldChcImJhY2tibGF6ZS5qc29uLmFwcGxpY2F0aW9uS2V5SWRcIik7XG4gICAgbGV0IGtleSA9IGF3YWl0IGdldFNlY3JldChcImJhY2tibGF6ZS5qc29uLmFwcGxpY2F0aW9uS2V5XCIpO1xuICAgIHJldHVybiB7XG4gICAgICAgIGFwcGxpY2F0aW9uS2V5SWQ6IGtleUlkLFxuICAgICAgICBhcHBsaWNhdGlvbktleToga2V5LFxuICAgIH07XG59KTtcbmNvbnN0IGdldEFQSSA9IGxhenkoYXN5bmMgKCkgPT4ge1xuICAgIGxldCBjcmVkcyA9IGF3YWl0IGJhY2tibGF6ZUNyZWRzKCk7XG5cbiAgICAvLyBOT1RFOiBPbiBlcnJvcnMsIG91ciByZXRyeSBjb2RlIHJlc2V0cyB0aGlzIGxhenksIHNvIHdlIERPIGdldCBuZXcgYXV0aG9yaXplIHdoZW4gbmVlZGVkLlxuICAgIC8vIFRPRE86IE1heWJlIHdlIHNob3VsZCBnZXQgbmV3IGF1dGhvcml6YXRpb24gcGVyaW9kaWNhbGx5IGF0IHdlbGw/XG4gICAgbGV0IGF1dGhvcml6ZVJhdyA9IGF3YWl0IGh0dHBzUmVxdWVzdChcImh0dHBzOi8vYXBpLmJhY2tibGF6ZWIyLmNvbS9iMmFwaS92Mi9iMl9hdXRob3JpemVfYWNjb3VudFwiLCB1bmRlZmluZWQsIFwiR0VUXCIsIHVuZGVmaW5lZCwge1xuICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgICBBdXRob3JpemF0aW9uOiBcIkJhc2ljIFwiICsgQnVmZmVyLmZyb20oY3JlZHMuYXBwbGljYXRpb25LZXlJZCArIFwiOlwiICsgY3JlZHMuYXBwbGljYXRpb25LZXkpLnRvU3RyaW5nKFwiYmFzZTY0XCIpLFxuICAgICAgICB9XG4gICAgfSk7XG5cbiAgICBsZXQgYXV0aCA9IEpTT04ucGFyc2UoYXV0aG9yaXplUmF3LnRvU3RyaW5nKCkpIGFzIHtcbiAgICAgICAgYWNjb3VudElkOiBzdHJpbmc7XG4gICAgICAgIGF1dGhvcml6YXRpb25Ub2tlbjogc3RyaW5nO1xuICAgICAgICBhcGlVcmw6IHN0cmluZztcbiAgICAgICAgZG93bmxvYWRVcmw6IHN0cmluZztcbiAgICAgICAgYWxsb3dlZDoge1xuICAgICAgICAgICAgYnVja2V0SWQ6IHN0cmluZztcbiAgICAgICAgICAgIGJ1Y2tldE5hbWU6IHN0cmluZztcbiAgICAgICAgICAgIGNhcGFiaWxpdGllczogc3RyaW5nW107XG4gICAgICAgICAgICBuYW1lUHJlZml4OiBzdHJpbmc7XG4gICAgICAgIH1bXTtcbiAgICB9O1xuXG4gICAgZnVuY3Rpb24gY3JlYXRlQjJGdW5jdGlvbjxBcmcsIFJlc3VsdD4obmFtZTogc3RyaW5nLCB0eXBlOiBcIlBPU1RcIiB8IFwiR0VUXCIsIG5vQWNjb3VudElkPzogXCJub0FjY291bnRJZFwiKTogKGFyZzogQXJnKSA9PiBQcm9taXNlPFJlc3VsdD4ge1xuICAgICAgICByZXR1cm4gYXN5bmMgKGFyZzogQXJnKSA9PiB7XG4gICAgICAgICAgICBpZiAoIW5vQWNjb3VudElkKSB7XG4gICAgICAgICAgICAgICAgYXJnID0geyBhY2NvdW50SWQ6IGF1dGguYWNjb3VudElkLCAuLi5hcmcgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgbGV0IHVybCA9IGF1dGguYXBpVXJsICsgXCIvYjJhcGkvdjIvXCIgKyBuYW1lO1xuICAgICAgICAgICAgICAgIGxldCByZXN1bHQgPSBhd2FpdCBodHRwc1JlcXVlc3QodXJsLCBCdWZmZXIuZnJvbShKU09OLnN0cmluZ2lmeShhcmcpKSwgdHlwZSwgdW5kZWZpbmVkLCB7XG4gICAgICAgICAgICAgICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIEF1dGhvcml6YXRpb246IGF1dGguYXV0aG9yaXphdGlvblRva2VuLFxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIEpTT04ucGFyc2UocmVzdWx0LnRvU3RyaW5nKCkpO1xuICAgICAgICAgICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBFcnJvciBpbiAke25hbWV9LCBhcmcgJHtKU09OLnN0cmluZ2lmeShhcmcpLnNsaWNlKDAsIDEwMDApfTogJHtlLnN0YWNrfWApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgIH1cblxuICAgIGNvbnN0IGNyZWF0ZUJ1Y2tldCA9IGNyZWF0ZUIyRnVuY3Rpb248e1xuICAgICAgICBidWNrZXROYW1lOiBzdHJpbmc7XG4gICAgICAgIGJ1Y2tldFR5cGU6IFwiYWxsUHJpdmF0ZVwiIHwgXCJhbGxQdWJsaWNcIjtcbiAgICAgICAgbGlmZWN5Y2xlUnVsZXM/OiBhbnlbXTtcbiAgICAgICAgY29yc1J1bGVzPzogdW5rbm93bltdO1xuICAgICAgICBidWNrZXRJbmZvPzoge1xuICAgICAgICAgICAgW2tleTogc3RyaW5nXTogdW5rbm93bjtcbiAgICAgICAgfTtcbiAgICB9LCB7XG4gICAgICAgIGFjY291bnRJZDogc3RyaW5nO1xuICAgICAgICBidWNrZXRJZDogc3RyaW5nO1xuICAgICAgICBidWNrZXROYW1lOiBzdHJpbmc7XG4gICAgICAgIGJ1Y2tldFR5cGU6IFwiYWxsUHJpdmF0ZVwiIHwgXCJhbGxQdWJsaWNcIjtcbiAgICAgICAgYnVja2V0SW5mbzoge1xuICAgICAgICAgICAgbGlmZWN5Y2xlUnVsZXM6IGFueVtdO1xuICAgICAgICB9O1xuICAgICAgICBjb3JzUnVsZXM6IGFueVtdO1xuICAgICAgICBsaWZlY3ljbGVSdWxlczogYW55W107XG4gICAgICAgIHJldmlzaW9uOiBudW1iZXI7XG4gICAgfT4oXCJiMl9jcmVhdGVfYnVja2V0XCIsIFwiUE9TVFwiKTtcblxuICAgIGNvbnN0IHVwZGF0ZUJ1Y2tldCA9IGNyZWF0ZUIyRnVuY3Rpb248e1xuICAgICAgICBhY2NvdW50SWQ6IHN0cmluZztcbiAgICAgICAgYnVja2V0SWQ6IHN0cmluZztcbiAgICAgICAgYnVja2V0VHlwZT86IFwiYWxsUHJpdmF0ZVwiIHwgXCJhbGxQdWJsaWNcIjtcbiAgICAgICAgbGlmZWN5Y2xlUnVsZXM/OiBhbnlbXTtcbiAgICAgICAgYnVja2V0SW5mbz86IHtcbiAgICAgICAgICAgIFtrZXk6IHN0cmluZ106IHVua25vd247XG4gICAgICAgIH07XG4gICAgICAgIGNvcnNSdWxlcz86IHVua25vd25bXTtcbiAgICB9LCB7XG4gICAgICAgIGFjY291bnRJZDogc3RyaW5nO1xuICAgICAgICBidWNrZXRJZDogc3RyaW5nO1xuICAgICAgICBidWNrZXROYW1lOiBzdHJpbmc7XG4gICAgICAgIGJ1Y2tldFR5cGU6IFwiYWxsUHJpdmF0ZVwiIHwgXCJhbGxQdWJsaWNcIjtcbiAgICAgICAgYnVja2V0SW5mbzoge1xuICAgICAgICAgICAgbGlmZWN5Y2xlUnVsZXM6IGFueVtdO1xuICAgICAgICB9O1xuICAgICAgICBjb3JzUnVsZXM6IGFueVtdO1xuICAgICAgICBsaWZlY3ljbGVSdWxlczogYW55W107XG4gICAgICAgIHJldmlzaW9uOiBudW1iZXI7XG4gICAgfT4oXCJiMl91cGRhdGVfYnVja2V0XCIsIFwiUE9TVFwiKTtcblxuICAgIC8vIGh0dHBzOi8vd3d3LmJhY2tibGF6ZS5jb20vYXBpZG9jcy9iMi11cGRhdGUtYnVja2V0XG4gICAgLy8gIFRPRE86IGIyX3VwZGF0ZV9idWNrZXQsIHNvIHdlIGNhbiB1cGRhdGUgQ09SUywgZXRjXG5cbiAgICBjb25zdCBsaXN0QnVja2V0cyA9IGNyZWF0ZUIyRnVuY3Rpb248e1xuICAgICAgICBidWNrZXROYW1lPzogc3RyaW5nO1xuICAgIH0sIHtcbiAgICAgICAgYnVja2V0czoge1xuICAgICAgICAgICAgYWNjb3VudElkOiBzdHJpbmc7XG4gICAgICAgICAgICBidWNrZXRJZDogc3RyaW5nO1xuICAgICAgICAgICAgYnVja2V0TmFtZTogc3RyaW5nO1xuICAgICAgICAgICAgYnVja2V0VHlwZTogXCJhbGxQcml2YXRlXCIgfCBcImFsbFB1YmxpY1wiO1xuICAgICAgICAgICAgYnVja2V0SW5mbzoge1xuICAgICAgICAgICAgICAgIGxpZmVjeWNsZVJ1bGVzOiBhbnlbXTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBjb3JzUnVsZXM6IGFueVtdO1xuICAgICAgICAgICAgbGlmZWN5Y2xlUnVsZXM6IGFueVtdO1xuICAgICAgICAgICAgcmV2aXNpb246IG51bWJlcjtcbiAgICAgICAgfVtdO1xuICAgIH0+KFwiYjJfbGlzdF9idWNrZXRzXCIsIFwiUE9TVFwiKTtcblxuICAgIGZ1bmN0aW9uIGVuY29kZVBhdGgocGF0aDogc3RyaW5nKSB7XG4gICAgICAgIC8vIFByZXNlcnZlIHNsYXNoZXMsIGJ1dCBlbmNvZGUgZXZlcnl0aGluZyBlbHNlXG4gICAgICAgIHBhdGggPSBwYXRoLnNwbGl0KFwiL1wiKS5tYXAoZW5jb2RlVVJJQ29tcG9uZW50KS5qb2luKFwiL1wiKTtcbiAgICAgICAgaWYgKHBhdGguc3RhcnRzV2l0aChcIi9cIikpIHBhdGggPSBcIiUyRlwiICsgcGF0aC5zbGljZSgxKTtcbiAgICAgICAgaWYgKHBhdGguZW5kc1dpdGgoXCIvXCIpKSBwYXRoID0gcGF0aC5zbGljZSgwLCAtMSkgKyBcIiUyRlwiO1xuICAgICAgICAvLyBOT1RFOiBGb3Igc29tZSByZWFzb24sIHRoaXMgd29uJ3QgcmVuZGVyIGluIHRoZSB3ZWIgVUkgY29ycmVjdGx5LiBCVVQsIGl0J2xsXG4gICAgICAgIC8vICB3b3JrIGdldCBnZXQvc2V0IGFuZCBmaW5kXG4gICAgICAgIC8vICAtIEFMU08sIGl0IHNlZW1zIHRvIGFkZCBkdXBsaWNhdGUgZmlsZXM/IFRoaXMgbWlnaHQgYWxzbyBiZSBhIHdlYiBVSSB0aGluZy4gSXRcbiAgICAgICAgLy8gICAgICBzZWVtcyB0byB3b3JrIHRob3VnaC5cbiAgICAgICAgd2hpbGUgKHBhdGguaW5jbHVkZXMoXCIvL1wiKSkge1xuICAgICAgICAgICAgcGF0aCA9IHBhdGgucmVwbGFjZUFsbChcIi8vXCIsIFwiLyUyRlwiKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcGF0aDtcbiAgICB9XG5cbiAgICBhc3luYyBmdW5jdGlvbiBkb3dubG9hZEZpbGVCeU5hbWUoY29uZmlnOiB7XG4gICAgICAgIGJ1Y2tldE5hbWU6IHN0cmluZztcbiAgICAgICAgZmlsZU5hbWU6IHN0cmluZztcbiAgICAgICAgcmFuZ2U/OiB7IHN0YXJ0OiBudW1iZXI7IGVuZDogbnVtYmVyOyB9O1xuICAgIH0pIHtcbiAgICAgICAgbGV0IGZpbGVOYW1lID0gZW5jb2RlUGF0aChjb25maWcuZmlsZU5hbWUpO1xuXG4gICAgICAgIGxldCByZXN1bHQgPSBhd2FpdCBodHRwc1JlcXVlc3QoYXV0aC5hcGlVcmwgKyBcIi9maWxlL1wiICsgY29uZmlnLmJ1Y2tldE5hbWUgKyBcIi9cIiArIGZpbGVOYW1lLCBCdWZmZXIuZnJvbShKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgICBhY2NvdW50SWQ6IGF1dGguYWNjb3VudElkLFxuICAgICAgICAgICAgcmVzcG9uc2VUeXBlOiBcImFycmF5YnVmZmVyXCIsXG4gICAgICAgIH0pKSwgXCJHRVRcIiwgdW5kZWZpbmVkLCB7XG4gICAgICAgICAgICBoZWFkZXJzOiBPYmplY3QuZnJvbUVudHJpZXMoT2JqZWN0LmVudHJpZXMoe1xuICAgICAgICAgICAgICAgIEF1dGhvcml6YXRpb246IGF1dGguYXV0aG9yaXphdGlvblRva2VuLFxuICAgICAgICAgICAgICAgIFwiQ29udGVudC1UeXBlXCI6IFwiYXBwbGljYXRpb24vanNvblwiLFxuICAgICAgICAgICAgICAgIFJhbmdlOiBjb25maWcucmFuZ2UgPyBgYnl0ZXM9JHtjb25maWcucmFuZ2Uuc3RhcnR9LSR7Y29uZmlnLnJhbmdlLmVuZCAtIDF9YCA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIH0pLmZpbHRlcih4ID0+IHhbMV0gIT09IHVuZGVmaW5lZCkpLFxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvLyBPaC4uLiBhcHBhcmVudGx5LCB3ZSBjYW4ndCByZXVzZSB0aGVzZT8gSHVoLi4uXG4gICAgY29uc3QgZ2V0VXBsb2FkVVJMID0gKGFzeW5jIChidWNrZXRJZDogc3RyaW5nKSA9PiB7XG4gICAgICAgIC8vc2V0VGltZW91dCgoKSA9PiBnZXRVcGxvYWRVUkwuY2xlYXIoYnVja2V0SWQpLCB0aW1lSW5Ib3VyICogMSk7XG4gICAgICAgIGxldCBnZXRVcGxvYWRVcmxSYXcgPSBhd2FpdCBodHRwc1JlcXVlc3QoYXV0aC5hcGlVcmwgKyBcIi9iMmFwaS92Mi9iMl9nZXRfdXBsb2FkX3VybD9idWNrZXRJZD1cIiArIGJ1Y2tldElkLCB1bmRlZmluZWQsIFwiR0VUXCIsIHVuZGVmaW5lZCwge1xuICAgICAgICAgICAgaGVhZGVyczoge1xuICAgICAgICAgICAgICAgIEF1dGhvcml6YXRpb246IGF1dGguYXV0aG9yaXphdGlvblRva2VuLFxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gSlNPTi5wYXJzZShnZXRVcGxvYWRVcmxSYXcudG9TdHJpbmcoKSkgYXMge1xuICAgICAgICAgICAgYnVja2V0SWQ6IHN0cmluZztcbiAgICAgICAgICAgIHVwbG9hZFVybDogc3RyaW5nO1xuICAgICAgICAgICAgYXV0aG9yaXphdGlvblRva2VuOiBzdHJpbmc7XG4gICAgICAgIH07XG4gICAgfSk7XG5cbiAgICBhc3luYyBmdW5jdGlvbiB1cGxvYWRGaWxlKGNvbmZpZzoge1xuICAgICAgICBidWNrZXRJZDogc3RyaW5nO1xuICAgICAgICBmaWxlTmFtZTogc3RyaW5nO1xuICAgICAgICBkYXRhOiBCdWZmZXI7XG4gICAgfSkge1xuICAgICAgICBsZXQgZ2V0VXBsb2FkVXJsID0gYXdhaXQgZ2V0VXBsb2FkVVJMKGNvbmZpZy5idWNrZXRJZCk7XG5cbiAgICAgICAgYXdhaXQgaHR0cHNSZXF1ZXN0KGdldFVwbG9hZFVybC51cGxvYWRVcmwsIGNvbmZpZy5kYXRhLCBcIlBPU1RcIiwgdW5kZWZpbmVkLCB7XG4gICAgICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgICAgICAgQXV0aG9yaXphdGlvbjogZ2V0VXBsb2FkVXJsLmF1dGhvcml6YXRpb25Ub2tlbixcbiAgICAgICAgICAgICAgICBcIlgtQnotRmlsZS1OYW1lXCI6IGVuY29kZVBhdGgoY29uZmlnLmZpbGVOYW1lKSxcbiAgICAgICAgICAgICAgICBcIkNvbnRlbnQtVHlwZVwiOiBcImIyL3gtYXV0b1wiLFxuICAgICAgICAgICAgICAgIFwiWC1Cei1Db250ZW50LVNoYTFcIjogXCJkb19ub3RfdmVyaWZ5XCIsXG4gICAgICAgICAgICAgICAgXCJDb250ZW50LUxlbmd0aFwiOiBjb25maWcuZGF0YS5sZW5ndGggKyBcIlwiLFxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBjb25zdCBoaWRlRmlsZSA9IGNyZWF0ZUIyRnVuY3Rpb248e1xuICAgICAgICBidWNrZXRJZDogc3RyaW5nO1xuICAgICAgICBmaWxlTmFtZTogc3RyaW5nO1xuICAgIH0sIHt9PihcImIyX2hpZGVfZmlsZVwiLCBcIlBPU1RcIiwgXCJub0FjY291bnRJZFwiKTtcblxuICAgIGNvbnN0IGdldEZpbGVJbmZvID0gY3JlYXRlQjJGdW5jdGlvbjx7XG4gICAgICAgIGJ1Y2tldE5hbWU6IHN0cmluZztcbiAgICAgICAgZmlsZUlkOiBzdHJpbmc7XG4gICAgfSwge1xuICAgICAgICBmaWxlSWQ6IHN0cmluZztcbiAgICAgICAgZmlsZU5hbWU6IHN0cmluZztcbiAgICAgICAgYWNjb3VudElkOiBzdHJpbmc7XG4gICAgICAgIGJ1Y2tldElkOiBzdHJpbmc7XG4gICAgICAgIGNvbnRlbnRMZW5ndGg6IG51bWJlcjtcbiAgICAgICAgY29udGVudFNoYTE6IHN0cmluZztcbiAgICAgICAgY29udGVudFR5cGU6IHN0cmluZztcbiAgICAgICAgZmlsZUluZm86IHtcbiAgICAgICAgICAgIHNyY19sYXN0X21vZGlmaWVkX21pbGxpczogbnVtYmVyO1xuICAgICAgICB9O1xuICAgICAgICBhY3Rpb246IHN0cmluZztcbiAgICAgICAgdXBsb2FkVGltZXN0YW1wOiBudW1iZXI7XG4gICAgfT4oXCJiMl9nZXRfZmlsZV9pbmZvXCIsIFwiUE9TVFwiLCBcIm5vQWNjb3VudElkXCIpO1xuXG4gICAgY29uc3QgbGlzdEZpbGVOYW1lcyA9IGNyZWF0ZUIyRnVuY3Rpb248e1xuICAgICAgICBidWNrZXRJZDogc3RyaW5nO1xuICAgICAgICBwcmVmaXg6IHN0cmluZztcbiAgICAgICAgc3RhcnRGaWxlTmFtZT86IHN0cmluZztcbiAgICAgICAgbWF4RmlsZUNvdW50PzogbnVtYmVyO1xuICAgICAgICBkZWxpbWl0ZXI/OiBzdHJpbmc7XG4gICAgfSwge1xuICAgICAgICBmaWxlczoge1xuICAgICAgICAgICAgZmlsZUlkOiBzdHJpbmc7XG4gICAgICAgICAgICBmaWxlTmFtZTogc3RyaW5nO1xuICAgICAgICAgICAgYWNjb3VudElkOiBzdHJpbmc7XG4gICAgICAgICAgICBidWNrZXRJZDogc3RyaW5nO1xuICAgICAgICAgICAgY29udGVudExlbmd0aDogbnVtYmVyO1xuICAgICAgICAgICAgY29udGVudFNoYTE6IHN0cmluZztcbiAgICAgICAgICAgIGNvbnRlbnRUeXBlOiBzdHJpbmc7XG4gICAgICAgICAgICBmaWxlSW5mbzoge1xuICAgICAgICAgICAgICAgIHNyY19sYXN0X21vZGlmaWVkX21pbGxpczogbnVtYmVyO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGFjdGlvbjogc3RyaW5nO1xuICAgICAgICAgICAgdXBsb2FkVGltZXN0YW1wOiBudW1iZXI7XG4gICAgICAgIH1bXTtcbiAgICAgICAgbmV4dEZpbGVOYW1lOiBzdHJpbmc7XG4gICAgfT4oXCJiMl9saXN0X2ZpbGVfbmFtZXNcIiwgXCJQT1NUXCIsIFwibm9BY2NvdW50SWRcIik7XG5cbiAgICBjb25zdCBjb3B5RmlsZSA9IGNyZWF0ZUIyRnVuY3Rpb248e1xuICAgICAgICBzb3VyY2VGaWxlSWQ6IHN0cmluZztcbiAgICAgICAgZmlsZU5hbWU6IHN0cmluZztcbiAgICAgICAgZGVzdGluYXRpb25CdWNrZXRJZDogc3RyaW5nO1xuICAgIH0sIHt9PihcImIyX2NvcHlfZmlsZVwiLCBcIlBPU1RcIiwgXCJub0FjY291bnRJZFwiKTtcblxuICAgIGNvbnN0IHN0YXJ0TGFyZ2VGaWxlID0gY3JlYXRlQjJGdW5jdGlvbjx7XG4gICAgICAgIGJ1Y2tldElkOiBzdHJpbmc7XG4gICAgICAgIGZpbGVOYW1lOiBzdHJpbmc7XG4gICAgICAgIGNvbnRlbnRUeXBlOiBzdHJpbmc7XG4gICAgICAgIGZpbGVJbmZvOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9O1xuICAgIH0sIHtcbiAgICAgICAgZmlsZUlkOiBzdHJpbmc7XG4gICAgICAgIGZpbGVOYW1lOiBzdHJpbmc7XG4gICAgICAgIGFjY291bnRJZDogc3RyaW5nO1xuICAgICAgICBidWNrZXRJZDogc3RyaW5nO1xuICAgICAgICBjb250ZW50VHlwZTogc3RyaW5nO1xuICAgICAgICBmaWxlSW5mbzogYW55O1xuICAgICAgICB1cGxvYWRUaW1lc3RhbXA6IG51bWJlcjtcbiAgICB9PihcImIyX3N0YXJ0X2xhcmdlX2ZpbGVcIiwgXCJQT1NUXCIsIFwibm9BY2NvdW50SWRcIik7XG5cbiAgICAvLyBBcHBhcmVudGx5IHdlIGNhbid0IHJldXNlIHRoZXNlP1xuICAgIGNvbnN0IGdldFVwbG9hZFBhcnRVUkwgPSAoYXN5bmMgKGZpbGVJZDogc3RyaW5nKSA9PiB7XG4gICAgICAgIGxldCB1cGxvYWRQYXJ0UmF3ID0gYXdhaXQgaHR0cHNSZXF1ZXN0KGF1dGguYXBpVXJsICsgXCIvYjJhcGkvdjIvYjJfZ2V0X3VwbG9hZF9wYXJ0X3VybD9maWxlSWQ9XCIgKyBmaWxlSWQsIHVuZGVmaW5lZCwgXCJHRVRcIiwgdW5kZWZpbmVkLCB7XG4gICAgICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgICAgICAgQXV0aG9yaXphdGlvbjogYXV0aC5hdXRob3JpemF0aW9uVG9rZW4sXG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gSlNPTi5wYXJzZSh1cGxvYWRQYXJ0UmF3LnRvU3RyaW5nKCkpIGFzIHtcbiAgICAgICAgICAgIGZpbGVJZDogc3RyaW5nO1xuICAgICAgICAgICAgcGFydE51bWJlcjogbnVtYmVyO1xuICAgICAgICAgICAgdXBsb2FkVXJsOiBzdHJpbmc7XG4gICAgICAgICAgICBhdXRob3JpemF0aW9uVG9rZW46IHN0cmluZztcbiAgICAgICAgfTtcbiAgICB9KTtcbiAgICBhc3luYyBmdW5jdGlvbiB1cGxvYWRQYXJ0KGNvbmZpZzoge1xuICAgICAgICBmaWxlSWQ6IHN0cmluZztcbiAgICAgICAgcGFydE51bWJlcjogbnVtYmVyO1xuICAgICAgICBkYXRhOiBCdWZmZXI7XG4gICAgICAgIHNoYTE6IHN0cmluZztcbiAgICB9KTogUHJvbWlzZTx7XG4gICAgICAgIGZpbGVJZDogc3RyaW5nO1xuICAgICAgICBwYXJ0TnVtYmVyOiBudW1iZXI7XG4gICAgICAgIGNvbnRlbnRMZW5ndGg6IG51bWJlcjtcbiAgICAgICAgY29udGVudFNoYTE6IHN0cmluZztcbiAgICB9PiB7XG4gICAgICAgIGxldCB1cGxvYWRQYXJ0ID0gYXdhaXQgZ2V0VXBsb2FkUGFydFVSTChjb25maWcuZmlsZUlkKTtcblxuICAgICAgICBsZXQgcmVzdWx0ID0gYXdhaXQgaHR0cHNSZXF1ZXN0KHVwbG9hZFBhcnQudXBsb2FkVXJsLCBjb25maWcuZGF0YSwgXCJQT1NUXCIsIHVuZGVmaW5lZCwge1xuICAgICAgICAgICAgaGVhZGVyczoge1xuICAgICAgICAgICAgICAgIEF1dGhvcml6YXRpb246IHVwbG9hZFBhcnQuYXV0aG9yaXphdGlvblRva2VuLFxuICAgICAgICAgICAgICAgIFwiWC1Cei1QYXJ0LU51bWJlclwiOiBjb25maWcucGFydE51bWJlciArIFwiXCIsXG4gICAgICAgICAgICAgICAgXCJYLUJ6LUNvbnRlbnQtU2hhMVwiOiBjb25maWcuc2hhMSxcbiAgICAgICAgICAgICAgICBcIkNvbnRlbnQtTGVuZ3RoXCI6IGNvbmZpZy5kYXRhLmxlbmd0aCArIFwiXCIsXG5cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBKU09OLnBhcnNlKHJlc3VsdC50b1N0cmluZygpKTtcbiAgICB9XG5cbiAgICBjb25zdCBmaW5pc2hMYXJnZUZpbGUgPSBjcmVhdGVCMkZ1bmN0aW9uPHtcbiAgICAgICAgZmlsZUlkOiBzdHJpbmc7XG4gICAgICAgIHBhcnRTaGExQXJyYXk6IHN0cmluZ1tdO1xuICAgIH0sIHtcbiAgICAgICAgZmlsZUlkOiBzdHJpbmc7XG4gICAgICAgIGZpbGVOYW1lOiBzdHJpbmc7XG4gICAgICAgIGFjY291bnRJZDogc3RyaW5nO1xuICAgICAgICBidWNrZXRJZDogc3RyaW5nO1xuICAgICAgICBjb250ZW50TGVuZ3RoOiBudW1iZXI7XG4gICAgICAgIGNvbnRlbnRTaGExOiBzdHJpbmc7XG4gICAgICAgIGNvbnRlbnRUeXBlOiBzdHJpbmc7XG4gICAgICAgIGZpbGVJbmZvOiBhbnk7XG4gICAgICAgIHVwbG9hZFRpbWVzdGFtcDogbnVtYmVyO1xuICAgIH0+KFwiYjJfZmluaXNoX2xhcmdlX2ZpbGVcIiwgXCJQT1NUXCIsIFwibm9BY2NvdW50SWRcIik7XG5cbiAgICBjb25zdCBjYW5jZWxMYXJnZUZpbGUgPSBjcmVhdGVCMkZ1bmN0aW9uPHtcbiAgICAgICAgZmlsZUlkOiBzdHJpbmc7XG4gICAgfSwge30+KFwiYjJfY2FuY2VsX2xhcmdlX2ZpbGVcIiwgXCJQT1NUXCIsIFwibm9BY2NvdW50SWRcIik7XG5cbiAgICBjb25zdCBnZXREb3dubG9hZEF1dGhvcml6YXRpb24gPSBjcmVhdGVCMkZ1bmN0aW9uPHtcbiAgICAgICAgYnVja2V0SWQ6IHN0cmluZztcbiAgICAgICAgZmlsZU5hbWVQcmVmaXg6IHN0cmluZztcbiAgICAgICAgdmFsaWREdXJhdGlvbkluU2Vjb25kczogbnVtYmVyO1xuICAgICAgICBiMkNvbnRlbnREaXNwb3NpdGlvbj86IHN0cmluZztcbiAgICAgICAgYjJDb250ZW50TGFuZ3VhZ2U/OiBzdHJpbmc7XG4gICAgICAgIGIyRXhwaXJlcz86IHN0cmluZztcbiAgICAgICAgYjJDYWNoZUNvbnRyb2w/OiBzdHJpbmc7XG4gICAgICAgIGIyQ29udGVudEVuY29kaW5nPzogc3RyaW5nO1xuICAgICAgICBiMkNvbnRlbnRUeXBlPzogc3RyaW5nO1xuICAgIH0sIHtcbiAgICAgICAgYnVja2V0SWQ6IHN0cmluZztcbiAgICAgICAgZmlsZU5hbWVQcmVmaXg6IHN0cmluZztcbiAgICAgICAgYXV0aG9yaXphdGlvblRva2VuOiBzdHJpbmc7XG4gICAgfT4oXCJiMl9nZXRfZG93bmxvYWRfYXV0aG9yaXphdGlvblwiLCBcIlBPU1RcIiwgXCJub0FjY291bnRJZFwiKTtcblxuICAgIGFzeW5jIGZ1bmN0aW9uIGdldERvd25sb2FkVVJMKHBhdGg6IHN0cmluZykge1xuICAgICAgICBpZiAoIXBhdGguc3RhcnRzV2l0aChcIi9cIikpIHtcbiAgICAgICAgICAgIHBhdGggPSBcIi9cIiArIHBhdGg7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGF1dGguZG93bmxvYWRVcmwgKyBwYXRoO1xuICAgIH1cblxuXG4gICAgcmV0dXJuIHtcbiAgICAgICAgY3JlYXRlQnVja2V0LFxuICAgICAgICB1cGRhdGVCdWNrZXQsXG4gICAgICAgIGxpc3RCdWNrZXRzLFxuICAgICAgICBkb3dubG9hZEZpbGVCeU5hbWUsXG4gICAgICAgIHVwbG9hZEZpbGUsXG4gICAgICAgIGhpZGVGaWxlLFxuICAgICAgICBnZXRGaWxlSW5mbyxcbiAgICAgICAgbGlzdEZpbGVOYW1lcyxcbiAgICAgICAgY29weUZpbGUsXG4gICAgICAgIHN0YXJ0TGFyZ2VGaWxlLFxuICAgICAgICB1cGxvYWRQYXJ0LFxuICAgICAgICBmaW5pc2hMYXJnZUZpbGUsXG4gICAgICAgIGNhbmNlbExhcmdlRmlsZSxcbiAgICAgICAgZ2V0RG93bmxvYWRBdXRob3JpemF0aW9uLFxuICAgICAgICBnZXREb3dubG9hZFVSTCxcbiAgICAgICAgYXBpVXJsOiBhdXRoLmFwaVVybCxcbiAgICAgICAgYWxsb3dlZDogYXV0aC5hbGxvd2VkLFxuICAgIH07XG59KTtcblxudHlwZSBCMkFwaSA9ICh0eXBlb2YgZ2V0QVBJKSBleHRlbmRzICgpID0+IFByb21pc2U8aW5mZXIgVD4gPyBUIDogbmV2ZXI7XG5cblxuZXhwb3J0IGNsYXNzIEFyY2hpdmVzQmFja2JsYXplIGltcGxlbWVudHMgSUFyY2hpdmVzIHtcbiAgICBwdWJsaWMgY29uc3RydWN0b3IocHJpdmF0ZSBjb25maWc6IHtcbiAgICAgICAgYnVja2V0TmFtZTogc3RyaW5nO1xuICAgICAgICBwdWJsaWM/OiBib29sZWFuO1xuICAgICAgICBpbW11dGFibGU/OiBib29sZWFuO1xuICAgICAgICBjYWNoZVRpbWU/OiBudW1iZXI7XG4gICAgICAgIGFsbG93ZWRPcmlnaW5zPzogc3RyaW5nW107XG4gICAgfSkge1xuICAgICAgICAvLyBHZXQgdGhlIGFwaSwgdG8gc2V0dXAgY29yc1xuICAgICAgICB2b2lkIHRoaXMuZ2V0QnVja2V0QVBJKCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBidWNrZXROYW1lID0gdGhpcy5jb25maWcuYnVja2V0TmFtZS5yZXBsYWNlQWxsKC9bXlxcd1xcZF0vZywgXCItXCIpO1xuICAgIHByaXZhdGUgYnVja2V0SWQgPSBcIlwiO1xuXG4gICAgcHJpdmF0ZSBsb2dnaW5nID0gZmFsc2U7XG4gICAgcHVibGljIGVuYWJsZUxvZ2dpbmcoKSB7XG4gICAgICAgIHRoaXMubG9nZ2luZyA9IHRydWU7XG4gICAgfVxuICAgIHByaXZhdGUgbG9nKHRleHQ6IHN0cmluZykge1xuICAgICAgICBpZiAoIXRoaXMubG9nZ2luZykgcmV0dXJuO1xuICAgICAgICBjb25zb2xlLmxvZyh0ZXh0KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0RGVidWdOYW1lKCkge1xuICAgICAgICByZXR1cm4gXCJiYWNrYmxhemUgXCIgKyB0aGlzLmNvbmZpZy5idWNrZXROYW1lO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0QnVja2V0QVBJID0gbGF6eShhc3luYyAoKSA9PiB7XG4gICAgICAgIGxldCBhcGkgPSBhd2FpdCBnZXRBUEkoKTtcblxuICAgICAgICBsZXQgY2FjaGVUaW1lID0gdGhpcy5jb25maWcuY2FjaGVUaW1lID8/IDA7XG4gICAgICAgIGlmICh0aGlzLmNvbmZpZy5pbW11dGFibGUpIHtcbiAgICAgICAgICAgIGNhY2hlVGltZSA9IElNTVVUQUJMRV9DQUNIRV9USU1FO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQUxXQVlTIHNldCBhY2Nlc3MgY29udHJvbCwgYXMgd2UgY2FuIG1ha2UgdXJscyBmb3IgcHJpdmF0ZSBidWNrZXRzIHdpdGggZ2V0RG93bmxvYWRBdXRob3JpemF0aW9uXG4gICAgICAgIGxldCBkZXNpcmVkQ29yc1J1bGVzID0gW3tcbiAgICAgICAgICAgIGNvcnNSdWxlTmFtZTogXCJhbGxvd0FsbFwiLFxuICAgICAgICAgICAgYWxsb3dlZE9yaWdpbnM6IHRoaXMuY29uZmlnLmFsbG93ZWRPcmlnaW5zID8/IFtcImh0dHBzXCJdLFxuICAgICAgICAgICAgYWxsb3dlZE9wZXJhdGlvbnM6IFtcImIyX2Rvd25sb2FkX2ZpbGVfYnlfaWRcIiwgXCJiMl9kb3dubG9hZF9maWxlX2J5X25hbWVcIl0sXG4gICAgICAgICAgICBhbGxvd2VkSGVhZGVyczogW1wicmFuZ2VcIl0sXG4gICAgICAgICAgICBleHBvc2VIZWFkZXJzOiBbXCJ4LWJ6LWNvbnRlbnQtc2hhMVwiXSxcbiAgICAgICAgICAgIG1heEFnZVNlY29uZHM6IGNhY2hlVGltZSAvIDEwMDAsXG4gICAgICAgIH1dO1xuICAgICAgICBsZXQgYnVja2V0SW5mbzogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7fTtcbiAgICAgICAgaWYgKGNhY2hlVGltZSkge1xuICAgICAgICAgICAgYnVja2V0SW5mb1tcImNhY2hlLWNvbnRyb2xcIl0gPSBgbWF4LWFnZT0ke2NhY2hlVGltZSAvIDEwMDB9YDtcbiAgICAgICAgfVxuXG5cbiAgICAgICAgbGV0IGV4aXN0cyA9IGZhbHNlO1xuICAgICAgICBsZXQgcmV0cmllcyA9IDA7XG4gICAgICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGF3YWl0IGFwaS5jcmVhdGVCdWNrZXQoe1xuICAgICAgICAgICAgICAgICAgICBidWNrZXROYW1lOiB0aGlzLmJ1Y2tldE5hbWUsXG4gICAgICAgICAgICAgICAgICAgIGJ1Y2tldFR5cGU6IHRoaXMuY29uZmlnLnB1YmxpYyA/IFwiYWxsUHVibGljXCIgOiBcImFsbFByaXZhdGVcIixcbiAgICAgICAgICAgICAgICAgICAgbGlmZWN5Y2xlUnVsZXM6IFt7XG4gICAgICAgICAgICAgICAgICAgICAgICBcImRheXNGcm9tVXBsb2FkaW5nVG9IaWRpbmdcIjogbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEtlZXAgZmlsZXMgZm9yIDcgZGF5cywgd2hpY2ggc2hvdWxkIGJlIGVub3VnaCB0aW1lIHRvIHJlY292ZXIgYWNjaWRlbnRhbCBoaWRpbmcuXG4gICAgICAgICAgICAgICAgICAgICAgICBcImRheXNGcm9tSGlkaW5nVG9EZWxldGluZ1wiOiA3LFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJmaWxlTmFtZVByZWZpeFwiOiBcIlwiXG4gICAgICAgICAgICAgICAgICAgIH1dLFxuICAgICAgICAgICAgICAgICAgICBjb3JzUnVsZXM6IGRlc2lyZWRDb3JzUnVsZXMsXG4gICAgICAgICAgICAgICAgICAgIGJ1Y2tldEluZm9cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgICAgICAgICAgIGlmICghZS5zdGFjay5pbmNsdWRlcyhgXCJkdXBsaWNhdGVfYnVja2V0X25hbWVcImApKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChyZXRyaWVzIDwgMykge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihgQmFja2JsYXplIGNyZWF0ZSBidWNrZXQgZmFpbGVkLCByZXRyeWluZyBpbiA1czogJHtlLnN0YWNrfWApO1xuICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgZGVsYXkoNTAwMCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXRyaWVzKys7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBleGlzdHMgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgYnVja2V0TGlzdCA9IGF3YWl0IGFwaS5saXN0QnVja2V0cyh7XG4gICAgICAgICAgICBidWNrZXROYW1lOiB0aGlzLmJ1Y2tldE5hbWUsXG4gICAgICAgIH0pO1xuICAgICAgICBpZiAoYnVja2V0TGlzdC5idWNrZXRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBCdWNrZXQgbmFtZSBcIiR7dGhpcy5idWNrZXROYW1lfVwiIGlzIGJlaW5nIHVzZWQgYnkgc29tZW9uZSBlbHNlLiBCdWNrZXQgbmFtZXMgaGF2ZSB0byBiZSBnbG9iYWxseSB1bmlxdWUuIFRyeSBhIGRpZmZlcmVudCBuYW1lIHVudGlsIHlvdSBmaW5kIGEgZnJlZSBvbmUuYCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5idWNrZXRJZCA9IGJ1Y2tldExpc3QuYnVja2V0c1swXS5idWNrZXRJZDtcblxuICAgICAgICBpZiAoZXhpc3RzKSB7XG4gICAgICAgICAgICBsZXQgYnVja2V0ID0gYnVja2V0TGlzdC5idWNrZXRzWzBdO1xuICAgICAgICAgICAgZnVuY3Rpb24gbm9ybWFsaXplKG9iajogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pIHtcbiAgICAgICAgICAgICAgICBsZXQga3ZwcyA9IE9iamVjdC5lbnRyaWVzKG9iaik7XG4gICAgICAgICAgICAgICAgc29ydChrdnBzLCB4ID0+IHhbMF0pO1xuICAgICAgICAgICAgICAgIHJldHVybiBPYmplY3QuZnJvbUVudHJpZXMoa3Zwcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmdW5jdGlvbiBvcmRlckluZGVwZW5kZW50RXF1YWwobGhzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiwgcmhzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikge1xuICAgICAgICAgICAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShub3JtYWxpemUobGhzKSkgPT09IEpTT04uc3RyaW5naWZ5KG5vcm1hbGl6ZShyaHMpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZ1bmN0aW9uIG9yZGVySW5kZXBlbmRlbnRFcXVhbEFycmF5KGxoczogdW5rbm93bltdLCByaHM6IHVua25vd25bXSkge1xuICAgICAgICAgICAgICAgIGlmIChsaHMubGVuZ3RoICE9PSByaHMubGVuZ3RoKSByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsaHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFvcmRlckluZGVwZW5kZW50RXF1YWwobGhzW2ldIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+LCByaHNbaV0gYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pKSByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICFvcmRlckluZGVwZW5kZW50RXF1YWxBcnJheShidWNrZXQuY29yc1J1bGVzLCBkZXNpcmVkQ29yc1J1bGVzKVxuICAgICAgICAgICAgICAgIHx8ICFvcmRlckluZGVwZW5kZW50RXF1YWwoYnVja2V0LmJ1Y2tldEluZm8sIGJ1Y2tldEluZm8pXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhtYWdlbnRhKGBVcGRhdGluZyBDT1JTIHJ1bGVzIGZvciAke3RoaXMuYnVja2V0TmFtZX1gKSwgYnVja2V0LmNvcnNSdWxlcywgZGVzaXJlZENvcnNSdWxlcyk7XG4gICAgICAgICAgICAgICAgYXdhaXQgYXBpLnVwZGF0ZUJ1Y2tldCh7XG4gICAgICAgICAgICAgICAgICAgIGFjY291bnRJZDogYnVja2V0LmFjY291bnRJZCxcbiAgICAgICAgICAgICAgICAgICAgYnVja2V0SWQ6IGJ1Y2tldC5idWNrZXRJZCxcbiAgICAgICAgICAgICAgICAgICAgYnVja2V0VHlwZTogYnVja2V0LmJ1Y2tldFR5cGUsXG4gICAgICAgICAgICAgICAgICAgIGxpZmVjeWNsZVJ1bGVzOiBidWNrZXQubGlmZWN5Y2xlUnVsZXMsXG4gICAgICAgICAgICAgICAgICAgIGNvcnNSdWxlczogZGVzaXJlZENvcnNSdWxlcyxcbiAgICAgICAgICAgICAgICAgICAgYnVja2V0SW5mbzogYnVja2V0SW5mbyxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYXBpO1xuICAgIH0pO1xuXG4gICAgcHJpdmF0ZSBjdXJyZW50UmVzZXQ6IFByb21pc2U8dm9pZD4gfCB1bmRlZmluZWQ7XG5cbiAgICAvLyBLZWVwIHRyYWNrIG9mIHdoZW4gd2UgbGFzdCByZXNldCBiZWNhdXNlIG9mIGEgNTAzXG4gICAgcHJpdmF0ZSBsYXN0NTAzUmVzZXQgPSAwO1xuICAgIC8vIElNUE9SVEFOVCEgV2UgbXVzdCBhbHdheXMgQ0FUQ0ggQVJPVU5EIHRoZSBhcGlSZXRyeUxvZ2ljLCBORVZFUiBpbnNpZGUgb2YgZm5jLiBPdGhlcndpc2Ugd2Ugd29uJ3RcbiAgICAvLyAgYmUgYWJsZSB0byByZWNyZWF0ZSB0aGUgYXV0aCB0b2tlbi5cbiAgICAvLyAgYGNvbnRleHRgIGlzIGEgc2hvcnQgbGFiZWwgKHZlcmIgKyBmaWxlIHBhdGgpIGluY2x1ZGVkIGluIGV2ZXJ5IHJldHJ5L2Vycm9yIGxvZyBzbyBhIHN0dWNrXG4gICAgLy8gICBzaWxlbnQtcmV0cnkgbG9vcCBpcyBpZGVudGlmaWFibGUgZnJvbSB0aGUgbG9ncy5cbiAgICBwcml2YXRlIGFzeW5jIGFwaVJldHJ5TG9naWM8VD4oXG4gICAgICAgIGNvbnRleHQ6IHN0cmluZyxcbiAgICAgICAgZm5jOiAoYXBpOiBCMkFwaSkgPT4gUHJvbWlzZTxUPixcbiAgICAgICAgcmV0cmllcyA9IDNcbiAgICApOiBQcm9taXNlPFQ+IHtcbiAgICAgICAgbGV0IGFwaTogQjJBcGkgfCB1bmRlZmluZWQ7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBhcGkgPSBhd2FpdCB0aGlzLmdldEJ1Y2tldEFQSSgpO1xuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IGZuYyhhcGkpO1xuICAgICAgICB9IGNhdGNoIChlcnI6IGFueSkge1xuICAgICAgICAgICAgaWYgKHJldHJpZXMgPD0gMCkgdGhyb3cgZXJyO1xuXG4gICAgICAgICAgICAvLyBJZiBpdCdzIGEgNTAzIGFuZCBpdCdzIGJlZW4gYSBtaW51dGUgc2luY2Ugd2UgbGFzdCByZXNldCwgdGhlbiBXYWl0IGFuZCByZXNldC5cbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAoZXJyLnN0YWNrLmluY2x1ZGVzKGBcInN0YXR1c1wiOiA1MDNgKVxuICAgICAgICAgICAgICAgICAgICB8fCBlcnIuc3RhY2suaW5jbHVkZXMoYFwic2VydmljZV91bmF2YWlsYWJsZVwiYClcbiAgICAgICAgICAgICAgICAgICAgfHwgZXJyLnN0YWNrLmluY2x1ZGVzKGBcImludGVybmFsX2Vycm9yXCJgKVxuICAgICAgICAgICAgICAgICAgICB8fCBlcnIuc3RhY2suaW5jbHVkZXMoYEVOT0JVRlNgKVxuICAgICAgICAgICAgICAgICkgJiYgRGF0ZS5ub3coKSAtIHRoaXMubGFzdDUwM1Jlc2V0ID4gNjAgKiAxMDAwKSB7XG4gICAgICAgICAgICAgICAgLy8gQmFja2JsYXplIGlzIHNvIGZsYWt5IHRoYXQgd2UncmUganVzdCBnb2luZyB0byB3YXJuIGhlcmUuXG4gICAgICAgICAgICAgICAgY29uc29sZS53YXJuKGBbJHtjb250ZXh0fV0gQmFja2JsYXplIGVycm9yLCB3YWl0aW5nIGFuZCByZXNldHRpbmc6ICR7ZXJyLm1lc3NhZ2V9YCk7XG4gICAgICAgICAgICAgICAgdGhpcy5sb2coYFske2NvbnRleHR9XSBCYWNrYmxhemUgZXJyb3IsIHdhaXRpbmcgYW5kIHJlc2V0dGluZzogJHtlcnIubWVzc2FnZX1gKTtcbiAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnRSZXNldCA9IHRoaXMuY3VycmVudFJlc2V0IHx8IChhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IGRlbGF5KDEwICogMTAwMCk7XG4gICAgICAgICAgICAgICAgICAgIC8vIFdlIGNoZWNrIGFnYWluIGluIGNhc2UsIGFuZCBpbiB0aGUgdmVyeSBsaWtlbHkgY2FzZSB0aGF0IHRoaXMgaXMgYmVpbmcgcnVuIGluIHBhcmFsbGVsLCB3ZSBvbmx5IHdhbnQgdG8gcmVzZXQgb25jZS5cbiAgICAgICAgICAgICAgICAgICAgaWYgKERhdGUubm93KCkgLSB0aGlzLmxhc3Q1MDNSZXNldCA+IDYwICogMTAwMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2coYFske2NvbnRleHR9XSBSZXNldHRpbmcgZ2V0QVBJIGFuZCBnZXRCdWNrZXRBUEk6ICR7ZXJyLm1lc3NhZ2V9YCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxhc3Q1MDNSZXNldCA9IERhdGUubm93KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBnZXRBUEkucmVzZXQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZ2V0QnVja2V0QVBJLnJlc2V0KCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KSgpLmZpbmFsbHkoKCkgPT4gdGhpcy5jdXJyZW50UmVzZXQgPSB1bmRlZmluZWQpO1xuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuY3VycmVudFJlc2V0O1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmFwaVJldHJ5TG9naWMoY29udGV4dCwgZm5jLCByZXRyaWVzIC0gMSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIElmIHRoZSBlcnJvciBpcyB0aGF0IHRoZSBhdXRob3JpemF0aW9uIHRva2VuIGlzIGludmFsaWQsIHJlc2V0IGdldEJ1Y2tldEFQSSBhbmQgZ2V0QVBJXG4gICAgICAgICAgICAvLyBJZiB0aGUgZXJyb3IgaXMgdGhhdCB0aGUgYnVja2V0IGlzbid0IGZvdW5kLCByZXNldCBnZXRCdWNrZXRBUElcbiAgICAgICAgICAgIGlmIChlcnIuc3RhY2suaW5jbHVkZXMoYFwiZXhwaXJlZF9hdXRoX3Rva2VuXCJgKSkge1xuICAgICAgICAgICAgICAgIHRoaXMubG9nKGBbJHtjb250ZXh0fV0gQXV0aG9yaXphdGlvbiB0b2tlbiBleHBpcmVkYCk7XG4gICAgICAgICAgICAgICAgZ2V0QVBJLnJlc2V0KCk7XG4gICAgICAgICAgICAgICAgdGhpcy5nZXRCdWNrZXRBUEkucmVzZXQoKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5hcGlSZXRyeUxvZ2ljKGNvbnRleHQsIGZuYywgcmV0cmllcyAtIDEpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgZXJyLnN0YWNrLmluY2x1ZGVzKGBubyB0b21lcyBhdmFpbGFibGVgKVxuICAgICAgICAgICAgICAgIHx8IGVyci5zdGFjay5pbmNsdWRlcyhgRVRJTUVET1VUYClcbiAgICAgICAgICAgICAgICB8fCBlcnIuc3RhY2suaW5jbHVkZXMoYHNvY2tldCBoYW5nIHVwYClcbiAgICAgICAgICAgICAgICAvLyBFaC4uLiB0aGlzIG1pZ2h0IGJlIGJhZCwgYnV0Li4uIEkgdGhpbmsgd2UganVzdCBnZXQgcmFuZG9tIDQwMCBlcnJvcnMuIElmIHRoaXMgc3BhbXMgZXJyb3JzLFxuICAgICAgICAgICAgICAgIC8vICB3ZSBjYW4gcmVtb3ZlIHRoaXMgbGluZS5cbiAgICAgICAgICAgICAgICB8fCBlcnIuc3RhY2suaW5jbHVkZXMoYDQwMCBCYWQgUmVxdWVzdGApXG4gICAgICAgICAgICAgICAgfHwgZXJyLnN0YWNrLmluY2x1ZGVzKGBnZXRhZGRyaW5mbyBFTk9URk9VTkRgKVxuICAgICAgICAgICAgICAgIHx8IGVyci5zdGFjay5pbmNsdWRlcyhgRUNPTk5SRVNFVGApXG4gICAgICAgICAgICAgICAgfHwgZXJyLnN0YWNrLmluY2x1ZGVzKGBFQ09OTlJFRlVTRURgKVxuICAgICAgICAgICAgICAgIHx8IGVyci5zdGFjay5pbmNsdWRlcyhgRU5PQlVGU2ApXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oYFske2NvbnRleHR9XSBSZXRyeWluZyBpbiA1czogJHtlcnIubWVzc2FnZX1gKTtcbiAgICAgICAgICAgICAgICB0aGlzLmxvZyhgWyR7Y29udGV4dH1dICR7ZXJyLm1lc3NhZ2V9IHJldHJ5aW5nIGluIDVzYCk7XG4gICAgICAgICAgICAgICAgYXdhaXQgZGVsYXkoNTAwMCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuYXBpUmV0cnlMb2dpYyhjb250ZXh0LCBmbmMsIHJldHJpZXMgLSAxKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGVyci5zdGFjay5pbmNsdWRlcyhgZ2V0YWRkcmluZm8gRU5PVEZPVU5EYCkpIHtcbiAgICAgICAgICAgICAgICBpZiAoYXBpKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCB1cmxPYmogPSBuZXcgVVJMKGFwaS5hcGlVcmwpO1xuICAgICAgICAgICAgICAgICAgICBsZXQgaG9zdG5hbWUgPSB1cmxPYmouaG9zdG5hbWU7XG4gICAgICAgICAgICAgICAgICAgIGxldCBsb29rdXBBZGRyZXNzZXMgPSBhd2FpdCBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRucy5sb29rdXAoaG9zdG5hbWUsIChlcnIsIGFkZHJlc3NlcykgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUoYWRkcmVzc2VzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHJlc29sdmVBZGRyZXNzZXMgPSBhd2FpdCBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRucy5yZXNvbHZlNChob3N0bmFtZSwgKGVyciwgYWRkcmVzc2VzKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShhZGRyZXNzZXMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGBbJHtjb250ZXh0fV0gZ2V0YWRkcmluZm8gRU5PVEZPVU5EICR7aG9zdG5hbWV9YCwgeyBsb29rdXBBZGRyZXNzZXMsIHJlc29sdmVBZGRyZXNzZXMsIGFwaVVybDogYXBpLmFwaVVybCwgZnVsbEVycm9yOiBlcnIuc3RhY2sgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgZ2V0KGZpbGVOYW1lOiBzdHJpbmcsIGNvbmZpZz86IHsgcmFuZ2U/OiB7IHN0YXJ0OiBudW1iZXI7IGVuZDogbnVtYmVyOyB9OyByZXRyeUNvdW50PzogbnVtYmVyIH0pOiBQcm9taXNlPEJ1ZmZlciB8IHVuZGVmaW5lZD4ge1xuICAgICAgICBsZXQgZG93bmxvYWRpbmcgPSB0cnVlO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgbGV0IHRpbWUgPSBEYXRlLm5vdygpO1xuICAgICAgICAgICAgY29uc3QgZG93bmxvYWRQb2xsID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmICghZG93bmxvYWRpbmcpIHJldHVybjtcbiAgICAgICAgICAgICAgICB0aGlzLmxvZyhgQmFja2JsYXplIGRvd25sb2FkIGluIHByb2dyZXNzICR7ZmlsZU5hbWV9YCk7XG4gICAgICAgICAgICAgICAgc2V0VGltZW91dChkb3dubG9hZFBvbGwsIDUwMDApO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHNldFRpbWVvdXQoZG93bmxvYWRQb2xsLCA1MDAwKTtcbiAgICAgICAgICAgIGxldCByZXN1bHQgPSBhd2FpdCB0aGlzLmFwaVJldHJ5TG9naWMoYGdldCAke2ZpbGVOYW1lfWAsIGFzeW5jIChhcGkpID0+IHtcbiAgICAgICAgICAgICAgICBsZXQgcmFuZ2UgPSBjb25maWc/LnJhbmdlO1xuICAgICAgICAgICAgICAgIGlmIChyYW5nZSkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgZmlsZUluZm8gPSBhd2FpdCB0aGlzLmdldEluZm8oZmlsZU5hbWUpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWZpbGVJbmZvKSB0aHJvdyBuZXcgRXJyb3IoYEZpbGUgJHtmaWxlTmFtZX0gbm90IGZvdW5kYCk7XG4gICAgICAgICAgICAgICAgICAgIGxldCByYW5nZVN0YXJ0ID0gcmFuZ2Uuc3RhcnQ7XG4gICAgICAgICAgICAgICAgICAgIGxldCByYW5nZUVuZCA9IE1hdGgubWluKHJhbmdlLmVuZCwgZmlsZUluZm8uc2l6ZSk7XG4gICAgICAgICAgICAgICAgICAgIC8vIE5PVEU6IEkgdGhpbmsgaWYgd2UgcmVxdWVzdCBub3RoaW5nLCBpdCBjb25mdXNlcyBCYWNrYmxhemUgYW5kIGVuZHMgdXAgZ2l2aW5nIHVzIHRoZSBlbnRpcmUgZmlsZS5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHJhbmdlRW5kIDw9IHJhbmdlU3RhcnQpIHJldHVybiBCdWZmZXIuYWxsb2MoMCk7XG4gICAgICAgICAgICAgICAgICAgIGxldCByZXN1bHQgPSBhd2FpdCBhcGkuZG93bmxvYWRGaWxlQnlOYW1lKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJ1Y2tldE5hbWU6IHRoaXMuYnVja2V0TmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVOYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgcmFuZ2U6IHsgc3RhcnQ6IHJhbmdlU3RhcnQsIGVuZDogcmFuZ2VFbmQgfSxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChyZXN1bHQubGVuZ3RoICE9PSByYW5nZUVuZCAtIHJhbmdlU3RhcnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYEJhY2tibGF6ZSByYW5nZSBkb3dubG9hZCByZXR1cm5lZCB0aGUgd3JvbmcgbnVtYmVyIG9mIGJ5dGVzLiBUcmllZCB0byBnZXQgJHtyYW5nZVN0YXJ0fS0ke3JhbmdlRW5kfSwgYnV0IHJlY2VpdmVkICR7cmFuZ2VTdGFydH0tJHtyYW5nZVN0YXJ0ICsgcmVzdWx0Lmxlbmd0aH0uIEZvciBmaWxlOiAke2ZpbGVOYW1lfWApO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBhd2FpdCBhcGkuZG93bmxvYWRGaWxlQnlOYW1lKHtcbiAgICAgICAgICAgICAgICAgICAgYnVja2V0TmFtZTogdGhpcy5idWNrZXROYW1lLFxuICAgICAgICAgICAgICAgICAgICBmaWxlTmFtZSxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgbGV0IHRpbWVTdHIgPSBmb3JtYXRUaW1lKERhdGUubm93KCkgLSB0aW1lKTtcbiAgICAgICAgICAgIGxldCByYXRlU3RyID0gZm9ybWF0TnVtYmVyKHJlc3VsdC5sZW5ndGggLyAoRGF0ZS5ub3coKSAtIHRpbWUpICogMTAwMCkgKyBcIkIvc1wiO1xuICAgICAgICAgICAgdGhpcy5sb2coYGJhY2tibGF6ZSBkb3dubG9hZCAoJHtmb3JtYXROdW1iZXIocmVzdWx0Lmxlbmd0aCl9QiR7Y29uZmlnPy5yYW5nZSAmJiBgLCAke2Zvcm1hdE51bWJlcihjb25maWcucmFuZ2Uuc3RhcnQpfSAtICR7Zm9ybWF0TnVtYmVyKGNvbmZpZy5yYW5nZS5lbmQpfWAgfHwgXCJcIn0pIGluICR7dGltZVN0cn0gKCR7cmF0ZVN0cn0sICR7ZmlsZU5hbWV9KWApO1xuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgdGhpcy5sb2coYGJhY2tibGF6ZSBmaWxlIGRvZXMgbm90IGV4aXN0ICR7ZmlsZU5hbWV9YCk7XG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgZG93bmxvYWRpbmcgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBwdWJsaWMgYXN5bmMgZ2V0MihmaWxlTmFtZTogc3RyaW5nLCBjb25maWc/OiB7IHJhbmdlPzogeyBzdGFydDogbnVtYmVyOyBlbmQ6IG51bWJlcjsgfSB9KTogUHJvbWlzZTx7IGRhdGE6IEJ1ZmZlcjsgd3JpdGVUaW1lOiBudW1iZXI7IHNpemU6IG51bWJlciB9IHwgdW5kZWZpbmVkPiB7XG4gICAgICAgIC8vIEIyIGRvd25sb2FkcyBkb24ndCByZXR1cm4gdGhlIHVwbG9hZCB0aW1lLCBzbyB0aGlzIHRha2VzIGEgc2Vjb25kIEFQSSBjYWxsXG4gICAgICAgIGxldCBbZGF0YSwgaW5mb10gPSBhd2FpdCBQcm9taXNlLmFsbChbdGhpcy5nZXQoZmlsZU5hbWUsIGNvbmZpZyksIHRoaXMuZ2V0SW5mbyhmaWxlTmFtZSldKTtcbiAgICAgICAgaWYgKCFkYXRhIHx8ICFpbmZvKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICByZXR1cm4geyBkYXRhLCB3cml0ZVRpbWU6IGluZm8ud3JpdGVUaW1lLCBzaXplOiBpbmZvLnNpemUgfTtcbiAgICB9XG4gICAgcHVibGljIGFzeW5jIGdldENvbmZpZygpOiBQcm9taXNlPEFyY2hpdmVzQ29uZmlnPiB7XG4gICAgICAgIHJldHVybiB7fTtcbiAgICB9XG4gICAgcHVibGljIGFzeW5jIGhhc1dyaXRlQWNjZXNzKCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgbGV0IGFwaSA9IGF3YWl0IGdldEFQSSgpO1xuICAgICAgICAgICAgLy8gQjIgdjIgZG9jdW1lbnRzIGFsbG93ZWQgYXMgYSBzaW5nbGUgb2JqZWN0OyBvdXIgdHlwZSBzYXlzIGEgbGlzdCAtIGhhbmRsZSBib3RoXG4gICAgICAgICAgICBsZXQgYWxsb3dlZFJhdyA9IGFwaS5hbGxvd2VkIGFzIHVua25vd247XG4gICAgICAgICAgICBsZXQgYWxsb3dlZExpc3QgPSAoQXJyYXkuaXNBcnJheShhbGxvd2VkUmF3KSAmJiBhbGxvd2VkUmF3IHx8IFthbGxvd2VkUmF3XSkgYXMgdHlwZW9mIGFwaS5hbGxvd2VkO1xuICAgICAgICAgICAgcmV0dXJuIGFsbG93ZWRMaXN0LnNvbWUoYWxsb3dlZCA9PlxuICAgICAgICAgICAgICAgIGFsbG93ZWQuY2FwYWJpbGl0aWVzLmluY2x1ZGVzKFwid3JpdGVGaWxlc1wiKVxuICAgICAgICAgICAgICAgICYmICghYWxsb3dlZC5idWNrZXROYW1lIHx8IGFsbG93ZWQuYnVja2V0TmFtZSA9PT0gdGhpcy5idWNrZXROYW1lKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgLy8gTm8gLyBpbnZhbGlkIGNyZWRlbnRpYWxzXG4gICAgICAgICAgICB0aGlzLmxvZyhgYmFja2JsYXplIGhhc1dyaXRlQWNjZXNzIGNoZWNrIGZhaWxlZDogJHsoZSBhcyBFcnJvcikuc3RhY2sgPz8gZX1gKTtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBwdWJsaWMgYXN5bmMgc2V0KGZpbGVOYW1lOiBzdHJpbmcsIGRhdGE6IEJ1ZmZlciwgY29uZmlnPzogeyBsYXN0TW9kaWZpZWQ/OiBudW1iZXIgfSk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgICAgIGlmIChjb25maWc/Lmxhc3RNb2RpZmllZCkge1xuICAgICAgICAgICAgYXNzZXJ0VmFsaWRMYXN0TW9kaWZpZWQoY29uZmlnLmxhc3RNb2RpZmllZCk7XG4gICAgICAgICAgICBsZXQgZXhpc3RpbmcgPSBhd2FpdCB0aGlzLmdldEluZm8oZmlsZU5hbWUpO1xuICAgICAgICAgICAgLy8gQW4gb2xkZXIgd3JpdGUgbmV2ZXIgb3ZlcndyaXRlcyBhIG5ld2VyIG9uZSAoc2VlIElBcmNoaXZlcy5zZXQpLiBCMiBzdGFtcHMgaXRzIG93blxuICAgICAgICAgICAgLy8gdXBsb2FkIHRpbWUsIHNvIHRoZSBleGFjdCBsYXN0TW9kaWZpZWQgaXMgbm90IHByZXNlcnZlZCBvbiB0aGUgc3RvcmVkIGZpbGUuXG4gICAgICAgICAgICBpZiAoZXhpc3RpbmcgJiYgY29uZmlnLmxhc3RNb2RpZmllZCA8IGV4aXN0aW5nLndyaXRlVGltZSkgcmV0dXJuIGZpbGVOYW1lO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMubG9nKGBiYWNrYmxhemUgdXBsb2FkICgke2Zvcm1hdE51bWJlcihkYXRhLmxlbmd0aCl9QikgJHtmaWxlTmFtZX1gKTtcbiAgICAgICAgbGV0IGYgPSBmaWxlTmFtZTtcbiAgICAgICAgYXdhaXQgdGhpcy5hcGlSZXRyeUxvZ2ljKGB1cGxvYWRGaWxlICR7ZmlsZU5hbWV9YCwgYXN5bmMgKGFwaSkgPT4ge1xuICAgICAgICAgICAgYXdhaXQgYXBpLnVwbG9hZEZpbGUoeyBidWNrZXRJZDogdGhpcy5idWNrZXRJZCwgZmlsZU5hbWUsIGRhdGE6IGRhdGEsIH0pO1xuICAgICAgICB9KTtcbiAgICAgICAgbGV0IGV4aXN0c0NoZWNrcyA9IDMwO1xuICAgICAgICB3aGlsZSAoZXhpc3RzQ2hlY2tzID4gMCkge1xuICAgICAgICAgICAgbGV0IGV4aXN0cyA9IGF3YWl0IHRoaXMuZ2V0SW5mbyhmaWxlTmFtZSk7XG4gICAgICAgICAgICBpZiAoZXhpc3RzKSBicmVhaztcbiAgICAgICAgICAgIGF3YWl0IGRlbGF5KDEwMDApO1xuICAgICAgICAgICAgZXhpc3RzQ2hlY2tzLS07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGV4aXN0c0NoZWNrcyA9PT0gMCkge1xuICAgICAgICAgICAgbGV0IGV4aXN0cyA9IGF3YWl0IHRoaXMuZ2V0SW5mbyhmaWxlTmFtZSk7XG4gICAgICAgICAgICBjb25zb2xlLndhcm4oYEZpbGUgJHtmaWxlTmFtZX0vJHtmfSB3YXMgdXBsb2FkZWQsIGJ1dCBjb3VsZCBub3QgYmUgZm91bmQgYWZ0ZXJ3YXJkcy4gSG9wZWZ1bGx5IGl0IHdhcyBqdXN0IGRlbGV0ZWQsIHZlcnkgcXVpY2tseT8gSWYgYmFja2JsYXplIGlzIHRha2luZyB0b28gbG9uZyBmb3IgZmlsZXMgdG8gcHJvcGFnYXRlLCB0aGVuIHdlIG1pZ2h0IHJ1biBpbnRvIGlzc3VlcyB3aXRoIHRoZSBkYXRhYmFzZSBhdG9taWNpdHkuYCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZpbGVOYW1lO1xuICAgIH1cbiAgICBwdWJsaWMgYXN5bmMgZGVsKGZpbGVOYW1lOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgdGhpcy5sb2coYGJhY2tibGF6ZSBkZWxldGUgJHtmaWxlTmFtZX1gKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuYXBpUmV0cnlMb2dpYyhgaGlkZUZpbGUgJHtmaWxlTmFtZX1gLCBhc3luYyAoYXBpKSA9PiB7XG4gICAgICAgICAgICAgICAgYXdhaXQgYXBpLmhpZGVGaWxlKHsgYnVja2V0SWQ6IHRoaXMuYnVja2V0SWQsIGZpbGVOYW1lOiBmaWxlTmFtZSB9KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgICAgICAgIHRoaXMubG9nKGBiYWNrYmxhemUgZXJyb3IgaW4gaGlkZSwgcG9zc2libHkgYWxyZWFkeSBoaWRkZW4gJHtmaWxlTmFtZX1cXG4ke2Uuc3RhY2t9YCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBOT1RFOiBEZWxldGlvbiBTRUVNUyB0byB3b3JrLiBUaGlzIERPRVMgYnJlYWsgaWYgd2UgZGVsZXRlIGEgZmlsZSB3aGljaCBrZWVwcyBiZWluZyByZWNyZWF0ZWQsXG4gICAgICAgIC8vICBleCwgdGhlIGhlYXJ0YmVhdC5cbiAgICAgICAgLy8gbGV0IGV4aXN0c0NoZWNrcyA9IDEwO1xuICAgICAgICAvLyB3aGlsZSAoZXhpc3RzQ2hlY2tzID4gMCkge1xuICAgICAgICAvLyAgICAgbGV0IGV4aXN0cyA9IGF3YWl0IHRoaXMuZ2V0SW5mbyhmaWxlTmFtZSk7XG4gICAgICAgIC8vICAgICBpZiAoIWV4aXN0cykgYnJlYWs7XG4gICAgICAgIC8vICAgICBhd2FpdCBkZWxheSgxMDAwKTtcbiAgICAgICAgLy8gICAgIGV4aXN0c0NoZWNrcy0tO1xuICAgICAgICAvLyB9XG4gICAgICAgIC8vIGlmIChleGlzdHNDaGVja3MgPT09IDApIHtcbiAgICAgICAgLy8gICAgIGxldCBleGlzdHMgPSBhd2FpdCB0aGlzLmdldEluZm8oZmlsZU5hbWUpO1xuICAgICAgICAvLyAgICAgZGV2RGVidWdicmVhaygpO1xuICAgICAgICAvLyAgICAgY29uc29sZS53YXJuKGBGaWxlICR7ZmlsZU5hbWV9IHdhcyBkZWxldGVkLCBidXQgd2FzIHN0aWxsIGZvdW5kIGFmdGVyd2FyZHNgKTtcbiAgICAgICAgLy8gICAgIGV4aXN0cyA9IGF3YWl0IHRoaXMuZ2V0SW5mbyhmaWxlTmFtZSk7XG4gICAgICAgIC8vIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgc2V0TGFyZ2VGaWxlKGNvbmZpZzogeyBwYXRoOiBzdHJpbmc7IGdldE5leHREYXRhKCk6IFByb21pc2U8QnVmZmVyIHwgdW5kZWZpbmVkPjsgfSk6IFByb21pc2U8dm9pZD4ge1xuXG4gICAgICAgIGxldCBvbkVycm9yOiAoKCkgPT4gUHJvbWlzZTx2b2lkPilbXSA9IFtdO1xuICAgICAgICBsZXQgdGltZSA9IERhdGUubm93KCk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBsZXQgeyBwYXRoIH0gPSBjb25maWc7XG4gICAgICAgICAgICAvLyBCYWNrYmxhemUgcmVxdWlyZXMgNU1CIGNodW5rcy4gQnV0LCBsYXJnZXIgaXMgbW9yZSBlZmZpY2llbnQgZm9yIHVzLlxuICAgICAgICAgICAgY29uc3QgTUlOX0NIVU5LX1NJWkUgPSAzMiAqIDEwMjQgKiAxMDI0O1xuICAgICAgICAgICAgbGV0IGRhdGFRdWV1ZTogQnVmZmVyW10gPSBbXTtcbiAgICAgICAgICAgIGFzeW5jIGZ1bmN0aW9uIGdldE5leHREYXRhKCk6IFByb21pc2U8QnVmZmVyIHwgdW5kZWZpbmVkPiB7XG4gICAgICAgICAgICAgICAgaWYgKGRhdGFRdWV1ZS5sZW5ndGgpIHJldHVybiBkYXRhUXVldWUuc2hpZnQoKTtcbiAgICAgICAgICAgICAgICAvLyBHZXQgYnVmZmVycyB1bnRpbCB3ZSBnZXQgNU1CLCBPUiwgZW5kLiBCYWNrYmxhemUgcmVxdWlyZXMgdGhpcyBmb3IgbGFyZ2UgZmlsZXMuXG4gICAgICAgICAgICAgICAgbGV0IHRvdGFsQnl0ZXMgPSAwO1xuICAgICAgICAgICAgICAgIGxldCBidWZmZXJzOiBCdWZmZXJbXSA9IFtdO1xuICAgICAgICAgICAgICAgIHdoaWxlICh0b3RhbEJ5dGVzIDwgTUlOX0NIVU5LX1NJWkUpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGRhdGEgPSBhd2FpdCBjb25maWcuZ2V0TmV4dERhdGEoKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFkYXRhKSBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgdG90YWxCeXRlcyArPSBkYXRhLmxlbmd0aDtcbiAgICAgICAgICAgICAgICAgICAgYnVmZmVycy5wdXNoKGRhdGEpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoIWJ1ZmZlcnMubGVuZ3RoKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIHJldHVybiBCdWZmZXIuY29uY2F0KGJ1ZmZlcnMpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBsZXQgZmlsZU5hbWUgPSBwYXRoO1xuICAgICAgICAgICAgbGV0IGRhdGEgPSBhd2FpdCBnZXROZXh0RGF0YSgpO1xuICAgICAgICAgICAgaWYgKCFkYXRhPy5sZW5ndGgpIHJldHVybjtcbiAgICAgICAgICAgIC8vIEJhY2tibGF6ZSBkaXNhbGxvd3Mgb3Zlcmx5IHNtYWxsIGZpbGVzXG4gICAgICAgICAgICBpZiAoZGF0YS5sZW5ndGggPCBNSU5fQ0hVTktfU0laRSkge1xuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuc2V0KGZpbGVOYW1lLCBkYXRhKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBCYWNrYmxhemUgZGlzYWxsb3dzIGxlc3MgdGhhbiAyIGNodW5rc1xuICAgICAgICAgICAgbGV0IHNlY29uZERhdGEgPSBhd2FpdCBnZXROZXh0RGF0YSgpO1xuICAgICAgICAgICAgaWYgKCFzZWNvbmREYXRhPy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnNldChmaWxlTmFtZSwgZGF0YSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gQUxTTywgaWYgdGhlcmUgYXJlIHR3byBjaHVua3MsIGJ1dCBvbmUgaXMgdG9vIHNtYWxsLCBjb21iaW5lIGl0LiBUaGlzIGhlbHBzIGFsbG93IHVzIG5ldmVyXG4gICAgICAgICAgICAvLyAgc2VuZCBzbWFsbCBjaHVua3MuXG4gICAgICAgICAgICBpZiAoc2Vjb25kRGF0YS5sZW5ndGggPCBNSU5fQ0hVTktfU0laRSkge1xuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuc2V0KGZpbGVOYW1lLCBCdWZmZXIuY29uY2F0KFtkYXRhLCBzZWNvbmREYXRhXSkpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMubG9nKGBVcGxvYWRpbmcgbGFyZ2UgZmlsZSAke2NvbmZpZy5wYXRofWApO1xuICAgICAgICAgICAgZGF0YVF1ZXVlLnVuc2hpZnQoZGF0YSwgc2Vjb25kRGF0YSk7XG5cblxuICAgICAgICAgICAgbGV0IHVwbG9hZEluZm8gPSBhd2FpdCB0aGlzLmFwaVJldHJ5TG9naWMoYHN0YXJ0TGFyZ2VGaWxlICR7ZmlsZU5hbWV9YCwgYXN5bmMgKGFwaSkgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiBhd2FpdCBhcGkuc3RhcnRMYXJnZUZpbGUoe1xuICAgICAgICAgICAgICAgICAgICBidWNrZXRJZDogdGhpcy5idWNrZXRJZCxcbiAgICAgICAgICAgICAgICAgICAgZmlsZU5hbWU6IGZpbGVOYW1lLFxuICAgICAgICAgICAgICAgICAgICBjb250ZW50VHlwZTogXCJiMi94LWF1dG9cIixcbiAgICAgICAgICAgICAgICAgICAgZmlsZUluZm86IHt9LFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBvbkVycm9yLnB1c2goYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuYXBpUmV0cnlMb2dpYyhgY2FuY2VsTGFyZ2VGaWxlICR7ZmlsZU5hbWV9YCwgYXN5bmMgKGFwaSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCBhcGkuY2FuY2VsTGFyZ2VGaWxlKHsgZmlsZUlkOiB1cGxvYWRJbmZvLmZpbGVJZCB9KTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBjb25zdCBMT0dfSU5URVJWQUwgPSB0aW1lSW5NaW51dGU7XG4gICAgICAgICAgICBsZXQgbmV4dExvZ1RpbWUgPSBEYXRlLm5vdygpICsgTE9HX0lOVEVSVkFMO1xuXG4gICAgICAgICAgICBsZXQgcGFydE51bWJlciA9IDE7XG4gICAgICAgICAgICBsZXQgcGFydFNoYTFBcnJheTogc3RyaW5nW10gPSBbXTtcbiAgICAgICAgICAgIGxldCB0b3RhbEJ5dGVzID0gMDtcbiAgICAgICAgICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICAgICAgICAgICAgZGF0YSA9IGF3YWl0IGdldE5leHREYXRhKCk7XG4gICAgICAgICAgICAgICAgaWYgKCFkYXRhKSBicmVhaztcbiAgICAgICAgICAgICAgICAvLyBTby4uLiBpZiB0aGUgbmV4dCBjaHVuayBpcyB0aGUgbGFzdCBvbmUsIGNvbWJpbmUgaXQgd2l0aCB0aGUgY3VycmVudCBvbmUuIFRoaXNcbiAgICAgICAgICAgICAgICAvLyAgcHJldmVudHMgQU5ZIHVwbG9hZHMgZnJvbSBiZWluZyA8IHRoZSB0aHJlc2hvbGQsIGFzIGFwcGFyZW50bHkgdGhlIFwibGFzdCBwYXJ0XCJcbiAgICAgICAgICAgICAgICAvLyAgY2hlY2sgaW4gYmFja2JsYXplIGZhaWxzIHdoZW4gd2UgaGF2ZSB0byByZXRyeSBhbiB1cGxvYWQgKGR1ZSB0byBcIm5vIHRvbWVzIGF2YWlsYWJsZVwiKS5cbiAgICAgICAgICAgICAgICAvLyAgV2VsbCBpdCBjYW4ndCBmYWlsIGlmIGV2ZW4gdGhlIGxhc3QgcGFydCBpcyA+IDVNQiwgbm93IGNhbiBpdCFcbiAgICAgICAgICAgICAgICAvLyBCVVQsIG9ubHkgaWYgdGhpcyBpc24ndCB0aGUgZmlyc3QgY2h1bmssIG90aGVyd2lzZSB3ZSBtaWdodCB0cnkgdG8gc2VuZFxuICAgICAgICAgICAgICAgIC8vICBhIHNpbmdsZSBjaHVuaywgd2hpY2ggd2UgY2FuJ3QgZG8uXG4gICAgICAgICAgICAgICAgaWYgKHBhcnRTaGExQXJyYXkubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgbWF5YmVMYXN0RGF0YSA9IGF3YWl0IGdldE5leHREYXRhKCk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChtYXliZUxhc3REYXRhKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobWF5YmVMYXN0RGF0YS5sZW5ndGggPCBNSU5fQ0hVTktfU0laRSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEl0J3MgdGhlIGxhc3Qgb25lLCBzbyBjb25zdW1lIGl0IG5vd1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBCdWZmZXIuY29uY2F0KFtkYXRhLCBtYXliZUxhc3REYXRhXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEl0J3Mgbm90IHRoZSBsYXN0IG9uZS4gUHV0IGl0IGJhY2ssIGluIGNhc2UgdGhlIG9uZSBBRlRFUiBpcyB0aGUgbGFzdFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICBvbmUsIGluIHdoaWNoIGNhc2Ugd2UgbmVlZCB0byBtZXJnZSBtYXliZUxhc3REYXRhIHdpdGggdGhlIG5leHQgbmV4dCBkYXRhLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFRdWV1ZS51bnNoaWZ0KG1heWJlTGFzdERhdGEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGxldCBzaGExID0gcmVxdWlyZShcImNyeXB0b1wiKS5jcmVhdGVIYXNoKFwic2hhMVwiKTtcbiAgICAgICAgICAgICAgICBzaGExLnVwZGF0ZShkYXRhKTtcbiAgICAgICAgICAgICAgICBsZXQgc2hhMUhleCA9IHNoYTEuZGlnZXN0KFwiaGV4XCIpO1xuICAgICAgICAgICAgICAgIHBhcnRTaGExQXJyYXkucHVzaChzaGExSGV4KTtcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmFwaVJldHJ5TG9naWMoYHVwbG9hZFBhcnQjJHtwYXJ0TnVtYmVyfSAke2ZpbGVOYW1lfWAsIGFzeW5jIChhcGkpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFkYXRhKSB0aHJvdyBuZXcgRXJyb3IoXCJJbXBvc3NpYmxlLCBkYXRhIGlzIHVuZGVmaW5lZFwiKTtcblxuICAgICAgICAgICAgICAgICAgICBsZXQgdGltZVN0ciA9IGZvcm1hdFRpbWUoRGF0ZS5ub3coKSAtIHRpbWUpO1xuICAgICAgICAgICAgICAgICAgICBsZXQgcmF0ZVN0ciA9IGZvcm1hdE51bWJlcih0b3RhbEJ5dGVzIC8gKERhdGUubm93KCkgLSB0aW1lKSAqIDEwMDApICsgXCJCL3NcIjtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2coYFVwbG9hZGluZyBsYXJnZSBmaWxlIHBhcnQgJHtwYXJ0TnVtYmVyfSwgdXBsb2FkZWQgJHtibHVlKGZvcm1hdE51bWJlcih0b3RhbEJ5dGVzKSArIFwiQlwiKX0gaW4gJHtibHVlKHRpbWVTdHIpfSAoJHtibHVlKHJhdGVTdHIpfSkuICR7Y29uZmlnLnBhdGh9YCk7XG4gICAgICAgICAgICAgICAgICAgIHRvdGFsQnl0ZXMgKz0gZGF0YS5sZW5ndGg7XG5cbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgYXBpLnVwbG9hZFBhcnQoe1xuICAgICAgICAgICAgICAgICAgICAgICAgZmlsZUlkOiB1cGxvYWRJbmZvLmZpbGVJZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhcnROdW1iZXI6IHBhcnROdW1iZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICBkYXRhOiBkYXRhLFxuICAgICAgICAgICAgICAgICAgICAgICAgc2hhMTogc2hhMUhleCxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgcGFydE51bWJlcisrO1xuXG4gICAgICAgICAgICAgICAgaWYgKERhdGUubm93KCkgPiBuZXh0TG9nVGltZSkge1xuICAgICAgICAgICAgICAgICAgICBuZXh0TG9nVGltZSA9IERhdGUubm93KCkgKyBMT0dfSU5URVJWQUw7XG4gICAgICAgICAgICAgICAgICAgIGxldCB0aW1lU3RyID0gZm9ybWF0VGltZShEYXRlLm5vdygpIC0gdGltZSk7XG4gICAgICAgICAgICAgICAgICAgIGxldCByYXRlU3RyID0gZm9ybWF0TnVtYmVyKHRvdGFsQnl0ZXMgLyAoRGF0ZS5ub3coKSAtIHRpbWUpICogMTAwMCkgKyBcIkIvc1wiO1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhgU3RpbGwgdXBsb2FkaW5nIGxhcmdlIGZpbGUgYXQgJHtEYXRlLm5vdygpfS4gVXBsb2FkZWQgJHtmb3JtYXROdW1iZXIodG90YWxCeXRlcyl9QiBpbiAke3RpbWVTdHJ9ICgke3JhdGVTdHJ9KS4gJHtjb25maWcucGF0aH1gKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmxvZyhgRmluaXNoZWQgdXBsb2FkaW5nIGxhcmdlIGZpbGUgdXBsb2FkZWQgJHtncmVlbihmb3JtYXROdW1iZXIodG90YWxCeXRlcykpfUJgKTtcblxuICAgICAgICAgICAgYXdhaXQgdGhpcy5hcGlSZXRyeUxvZ2ljKGBmaW5pc2hMYXJnZUZpbGUgJHtmaWxlTmFtZX1gLCBhc3luYyAoYXBpKSA9PiB7XG4gICAgICAgICAgICAgICAgYXdhaXQgYXBpLmZpbmlzaExhcmdlRmlsZSh7XG4gICAgICAgICAgICAgICAgICAgIGZpbGVJZDogdXBsb2FkSW5mby5maWxlSWQsXG4gICAgICAgICAgICAgICAgICAgIHBhcnRTaGExQXJyYXk6IHBhcnRTaGExQXJyYXksXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICAgICAgICBmb3IgKGxldCBjIG9mIG9uRXJyb3IpIHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCBjKCk7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGBFcnJvciBkdXJpbmcgZXJyb3IgY2xlYW4uIElnbm9yaW5nLCB3ZSB3aWxsIHJldGhyb3cgdGhlIG9yaWdpbmFsIGVycm9yLCBwYXRoICR7Y29uZmlnLnBhdGh9YCwgZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEVycm9yIGluIHNldExhcmdlRmlsZSBmb3IgJHtjb25maWcucGF0aH06ICR7ZS5zdGFja31gKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBnZXRJbmZvKGZpbGVOYW1lOiBzdHJpbmcpOiBQcm9taXNlPHsgd3JpdGVUaW1lOiBudW1iZXI7IHNpemU6IG51bWJlcjsgfSB8IHVuZGVmaW5lZD4ge1xuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5hcGlSZXRyeUxvZ2ljKGBnZXRJbmZvICR7ZmlsZU5hbWV9YCwgYXN5bmMgKGFwaSkgPT4ge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAvLyBOT1RFOiBBcHBhcmVudGx5LCB0aGVyZSdzIG5vIG90aGVyIHdheSB0byBkbyB0aGlzLCBhcyB0aGUgZmlsZSBuYW1lIGRvZXMgbm90IGVxdWFsIHRoZSBmaWxlIElELCBhbmQgZ2V0IGZpbGUgaW5mbyByZXF1aXJlcyB0aGUgZmlsZSBJRC5cbiAgICAgICAgICAgICAgICBsZXQgaW5mbyA9IGF3YWl0IGFwaS5saXN0RmlsZU5hbWVzKHsgYnVja2V0SWQ6IHRoaXMuYnVja2V0SWQsIHByZWZpeDogZmlsZU5hbWUsIG1heEZpbGVDb3VudDogMTAgfSk7XG4gICAgICAgICAgICAgICAgbGV0IGZpbGUgPSBpbmZvLmZpbGVzLmZpbmQoeCA9PiB4LmZpbGVOYW1lID09PSBmaWxlTmFtZSAmJiB4LmFjdGlvbiA9PT0gXCJ1cGxvYWRcIik7XG4gICAgICAgICAgICAgICAgaWYgKCFmaWxlKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubG9nKGBCYWNrYmxhemUgZmlsZSBub3QgZXhpc3RzICR7ZmlsZU5hbWV9YCk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMubG9nKGBCYWNrYmxhemUgZmlsZSBleGlzdHMgJHtmaWxlTmFtZX1gKTtcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICB3cml0ZVRpbWU6IGZpbGUudXBsb2FkVGltZXN0YW1wLFxuICAgICAgICAgICAgICAgICAgICBzaXplOiBmaWxlLmNvbnRlbnRMZW5ndGgsXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgICAgICAgICAgIGlmIChlLnN0YWNrLmluY2x1ZGVzKGBmaWxlX25vdF9mb3VuZGApKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubG9nKGBCYWNrYmxhemUgZmlsZSBub3QgZXhpc3RzICR7ZmlsZU5hbWV9YCk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRocm93IGU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIEZvciBleGFtcGxlIGZpbmRGaWxlTmFtZXMoXCJpcHMvXCIpXG4gICAgcHVibGljIGFzeW5jIGZpbmQocHJlZml4OiBzdHJpbmcsIGNvbmZpZz86IHsgc2hhbGxvdz86IGJvb2xlYW47IHR5cGU6IFwiZmlsZXNcIiB8IFwiZm9sZGVyc1wiIH0pOiBQcm9taXNlPHN0cmluZ1tdPiB7XG4gICAgICAgIGxldCByZXN1bHQgPSBhd2FpdCB0aGlzLmZpbmRJbmZvKHByZWZpeCwgY29uZmlnKTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdC5tYXAoeCA9PiB4LnBhdGgpO1xuICAgIH1cbiAgICBwdWJsaWMgYXN5bmMgZmluZEluZm8ocHJlZml4OiBzdHJpbmcsIGNvbmZpZz86IHsgc2hhbGxvdz86IGJvb2xlYW47IHR5cGU6IFwiZmlsZXNcIiB8IFwiZm9sZGVyc1wiIH0pOiBQcm9taXNlPHsgcGF0aDogc3RyaW5nOyBjcmVhdGVUaW1lOiBudW1iZXI7IHNpemU6IG51bWJlcjsgfVtdPiB7XG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmFwaVJldHJ5TG9naWMoYGZpbmRJbmZvICR7cHJlZml4fWAsIGFzeW5jIChhcGkpID0+IHtcbiAgICAgICAgICAgIGlmICghY29uZmlnPy5zaGFsbG93ICYmIGNvbmZpZz8udHlwZSA9PT0gXCJmb2xkZXJzXCIpIHtcbiAgICAgICAgICAgICAgICBsZXQgYWxsRmlsZXMgPSBhd2FpdCB0aGlzLmZpbmRJbmZvKHByZWZpeCk7XG4gICAgICAgICAgICAgICAgbGV0IGFsbEZvbGRlcnMgPSBuZXcgTWFwPHN0cmluZywgeyBwYXRoOiBzdHJpbmc7IGNyZWF0ZVRpbWU6IG51bWJlcjsgc2l6ZTogbnVtYmVyIH0+KCk7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgeyBwYXRoLCBjcmVhdGVUaW1lLCBzaXplIH0gb2YgYWxsRmlsZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGZvbGRlciA9IHBhdGguc3BsaXQoXCIvXCIpLnNsaWNlKDAsIC0xKS5qb2luKFwiL1wiKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFmb2xkZXIpIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICBhbGxGb2xkZXJzLnNldChmb2xkZXIsIHsgcGF0aDogZm9sZGVyLCBjcmVhdGVUaW1lLCBzaXplIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gQXJyYXkuZnJvbShhbGxGb2xkZXJzLnZhbHVlcygpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxldCBmaWxlcyA9IG5ldyBNYXA8c3RyaW5nLCB7IHBhdGg6IHN0cmluZzsgY3JlYXRlVGltZTogbnVtYmVyOyBzaXplOiBudW1iZXI7IH0+KCk7XG4gICAgICAgICAgICBsZXQgc3RhcnRGaWxlTmFtZSA9IFwiXCI7XG4gICAgICAgICAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgICAgICAgICAgIGxldCByZXN1bHQgPSBhd2FpdCBhcGkubGlzdEZpbGVOYW1lcyh7XG4gICAgICAgICAgICAgICAgICAgIGJ1Y2tldElkOiB0aGlzLmJ1Y2tldElkLFxuICAgICAgICAgICAgICAgICAgICBwcmVmaXg6IHByZWZpeCxcbiAgICAgICAgICAgICAgICAgICAgc3RhcnRGaWxlTmFtZSxcbiAgICAgICAgICAgICAgICAgICAgbWF4RmlsZUNvdW50OiAxMDAwLFxuICAgICAgICAgICAgICAgICAgICBkZWxpbWl0ZXI6IGNvbmZpZz8uc2hhbGxvdyA/IFwiL1wiIDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGZpbGUgb2YgcmVzdWx0LmZpbGVzKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChmaWxlLmFjdGlvbiA9PT0gXCJ1cGxvYWRcIiAmJiBjb25maWc/LnR5cGUgIT09IFwiZm9sZGVyc1wiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBmaWxlcy5zZXQoZmlsZS5maWxlTmFtZSwgeyBwYXRoOiBmaWxlLmZpbGVOYW1lLCBjcmVhdGVUaW1lOiBmaWxlLnVwbG9hZFRpbWVzdGFtcCwgc2l6ZTogZmlsZS5jb250ZW50TGVuZ3RoIH0pO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGZpbGUuYWN0aW9uID09PSBcImZvbGRlclwiICYmIGNvbmZpZz8udHlwZSA9PT0gXCJmb2xkZXJzXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBmb2xkZXIgPSBmaWxlLmZpbGVOYW1lO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZvbGRlci5lbmRzV2l0aChcIi9cIikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb2xkZXIgPSBmb2xkZXIuc2xpY2UoMCwgLTEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZmlsZXMuc2V0KGZvbGRlciwgeyBwYXRoOiBmb2xkZXIsIGNyZWF0ZVRpbWU6IGZpbGUudXBsb2FkVGltZXN0YW1wLCBzaXplOiBmaWxlLmNvbnRlbnRMZW5ndGggfSk7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBzdGFydEZpbGVOYW1lID0gcmVzdWx0Lm5leHRGaWxlTmFtZTtcbiAgICAgICAgICAgICAgICBpZiAoIXN0YXJ0RmlsZU5hbWUpIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIEFycmF5LmZyb20oZmlsZXMudmFsdWVzKCkpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgYXNzZXJ0UGF0aFZhbGlkKHBhdGg6IHN0cmluZykge1xuICAgICAgICBsZXQgYnl0ZXMgPSBCdWZmZXIuZnJvbShwYXRoLCBcInV0ZjhcIik7XG4gICAgICAgIGlmIChieXRlcy5sZW5ndGggPiAxMDAwKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFBhdGggdG9vIGxvbmc6ICR7cGF0aC5sZW5ndGh9IGNoYXJhY3RlcnMgPiAxMDAwIGNoYXJhY3RlcnMuIFBhdGg6ICR7cGF0aH1gKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBtb3ZlKGNvbmZpZzoge1xuICAgICAgICBwYXRoOiBzdHJpbmc7XG4gICAgICAgIHRhcmdldDogSUFyY2hpdmVzO1xuICAgICAgICB0YXJnZXRQYXRoOiBzdHJpbmc7XG4gICAgICAgIGNvcHlJbnN0ZWFkPzogYm9vbGVhbjtcbiAgICB9KSB7XG4gICAgICAgIGxldCB7IHBhdGgsIHRhcmdldCwgdGFyZ2V0UGF0aCB9ID0gY29uZmlnO1xuICAgICAgICAvLyBBIHNlbGYgbW92ZSBzaG91bGQgTk9PUCAoYW5kIGRlZmluaXRlbHkgbm90IGNvcHksIGFuZCB0aGVuIGRlbGV0ZSBpdHNlbGYhKVxuICAgICAgICBpZiAodGFyZ2V0ID09PSB0aGlzICYmIHBhdGggPT09IHRhcmdldFBhdGgpIHtcbiAgICAgICAgICAgIHRoaXMubG9nKGBCYWNrYmxhemUgbW92ZSBwYXRoIHRvIGl0c2VsZi4gU2tpcHBpbmcgbW92ZSwgYXMgdGhlcmUgaXMgbm8gd29yayB0byBkby4gJHtwYXRofWApO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0YXJnZXQgaW5zdGFuY2VvZiBBcmNoaXZlc0JhY2tibGF6ZSkge1xuICAgICAgICAgICAgbGV0IHRhcmdldEJ1Y2tldElkID0gdGFyZ2V0LmJ1Y2tldElkO1xuICAgICAgICAgICAgaWYgKHRhcmdldEJ1Y2tldElkID09PSB0aGlzLmJ1Y2tldElkICYmIHBhdGggPT09IHRhcmdldFBhdGgpIHJldHVybjtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuYXBpUmV0cnlMb2dpYyhgbW92ZSAke3BhdGh9IC0+ICR7dGFyZ2V0UGF0aH1gLCBhc3luYyAoYXBpKSA9PiB7XG4gICAgICAgICAgICAgICAgLy8gVWdoLi4uIGxpc3RpbmcgdGhlIGZpbGUgbmFtZSBzdWNrcywgYnV0Li4uIEkgZ3Vlc3MgaXQncyBzdGlsbCBiZXR0ZXIgdGhhblxuICAgICAgICAgICAgICAgIC8vICBkb3dubG9hZGluZyBhbmQgcmUtdXBsb2FkaW5nIHRoZSBlbnRpcmUgZmlsZS5cbiAgICAgICAgICAgICAgICBsZXQgaW5mbyA9IGF3YWl0IGFwaS5saXN0RmlsZU5hbWVzKHsgYnVja2V0SWQ6IHRoaXMuYnVja2V0SWQsIHByZWZpeDogcGF0aCwgbWF4RmlsZUNvdW50OiAxMCB9KTtcbiAgICAgICAgICAgICAgICBsZXQgZmlsZSA9IGluZm8uZmlsZXMuZmluZCh4ID0+IHguZmlsZU5hbWUgPT09IHBhdGgpO1xuICAgICAgICAgICAgICAgIGlmICghZmlsZSkgdGhyb3cgbmV3IEVycm9yKGBGaWxlIG5vdCBmb3VuZCB0byBtb3ZlOiAke3BhdGh9YCk7XG4gICAgICAgICAgICAgICAgYXdhaXQgYXBpLmNvcHlGaWxlKHtcbiAgICAgICAgICAgICAgICAgICAgc291cmNlRmlsZUlkOiBmaWxlLmZpbGVJZCxcbiAgICAgICAgICAgICAgICAgICAgZmlsZU5hbWU6IHRhcmdldFBhdGgsXG4gICAgICAgICAgICAgICAgICAgIGRlc3RpbmF0aW9uQnVja2V0SWQ6IHRhcmdldEJ1Y2tldElkLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBsZXQgZGF0YSA9IGF3YWl0IHRoaXMuZ2V0KHBhdGgpO1xuICAgICAgICAgICAgaWYgKCFkYXRhKSB0aHJvdyBuZXcgRXJyb3IoYEZpbGUgbm90IGZvdW5kIHRvIG1vdmU6ICR7cGF0aH1gKTtcbiAgICAgICAgICAgIGF3YWl0IHRhcmdldC5zZXQodGFyZ2V0UGF0aCwgZGF0YSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIWNvbmZpZy5jb3B5SW5zdGVhZCkge1xuICAgICAgICAgICAgbGV0IGV4aXN0cyA9IGF3YWl0IHRoaXMuZ2V0SW5mbyh0YXJnZXRQYXRoKTtcbiAgICAgICAgICAgIGlmICghZXhpc3RzKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihgRmlsZSBub3QgZm91bmQgYWZ0ZXIgbW92ZS4gTGVhdmluZyBCT1RIIGZpbGVzLiAke3RhcmdldFBhdGh9IHdhcyBub3QgZm91bmQuIEJlaW5nIG1vdmVkIGZyb20gJHtwYXRofWApO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmRlbChwYXRoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBjb3B5KGNvbmZpZzoge1xuICAgICAgICBwYXRoOiBzdHJpbmc7XG4gICAgICAgIHRhcmdldDogSUFyY2hpdmVzO1xuICAgICAgICB0YXJnZXRQYXRoOiBzdHJpbmc7XG4gICAgfSk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICByZXR1cm4gdGhpcy5tb3ZlKHsgLi4uY29uZmlnLCBjb3B5SW5zdGVhZDogdHJ1ZSB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgZ2V0VVJMKHBhdGg6IHN0cmluZykge1xuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5hcGlSZXRyeUxvZ2ljKGBnZXRVUkwgJHtwYXRofWAsIGFzeW5jIChhcGkpID0+IHtcbiAgICAgICAgICAgIGlmIChwYXRoLnN0YXJ0c1dpdGgoXCIvXCIpKSB7XG4gICAgICAgICAgICAgICAgcGF0aCA9IHBhdGguc2xpY2UoMSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgYXBpLmdldERvd25sb2FkVVJMKFwiZmlsZS9cIiArIHRoaXMuYnVja2V0TmFtZSArIFwiL1wiICsgcGF0aCk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBnZXREb3dubG9hZEF1dGhvcml6YXRpb24oY29uZmlnOiB7XG4gICAgICAgIGZpbGVOYW1lUHJlZml4Pzogc3RyaW5nO1xuICAgICAgICB2YWxpZER1cmF0aW9uSW5TZWNvbmRzOiBudW1iZXI7XG4gICAgICAgIGIyQ29udGVudERpc3Bvc2l0aW9uPzogc3RyaW5nO1xuICAgICAgICBiMkNvbnRlbnRMYW5ndWFnZT86IHN0cmluZztcbiAgICAgICAgYjJFeHBpcmVzPzogc3RyaW5nO1xuICAgICAgICBiMkNhY2hlQ29udHJvbD86IHN0cmluZztcbiAgICAgICAgYjJDb250ZW50RW5jb2Rpbmc/OiBzdHJpbmc7XG4gICAgICAgIGIyQ29udGVudFR5cGU/OiBzdHJpbmc7XG4gICAgfSk6IFByb21pc2U8e1xuICAgICAgICBidWNrZXRJZDogc3RyaW5nO1xuICAgICAgICBmaWxlTmFtZVByZWZpeDogc3RyaW5nO1xuICAgICAgICBhdXRob3JpemF0aW9uVG9rZW46IHN0cmluZztcbiAgICB9PiB7XG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmFwaVJldHJ5TG9naWMoYGdldERvd25sb2FkQXV0aG9yaXphdGlvbiAke2NvbmZpZy5maWxlTmFtZVByZWZpeCA/PyBcIlwifWAsIGFzeW5jIChhcGkpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCBhcGkuZ2V0RG93bmxvYWRBdXRob3JpemF0aW9uKHtcbiAgICAgICAgICAgICAgICBidWNrZXRJZDogdGhpcy5idWNrZXRJZCxcbiAgICAgICAgICAgICAgICBmaWxlTmFtZVByZWZpeDogY29uZmlnLmZpbGVOYW1lUHJlZml4ID8/IFwiXCIsXG4gICAgICAgICAgICAgICAgLi4uY29uZmlnLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH1cbn1cblxuLypcbk5hbWVzIHNob3VsZCBiZSBhIFVURi04IHN0cmluZyB1cCB0byAxMDI0IGJ5dGVzIHdpdGggdGhlIGZvbGxvd2luZyBleGNlcHRpb25zOlxuICAgIENoYXJhY3RlciBjb2RlcyBiZWxvdyAzMiBhcmUgbm90IGFsbG93ZWQuXG4gICAgREVMIGNoYXJhY3RlcnMgKDEyNykgYXJlIG5vdCBhbGxvd2VkLlxuICAgIEJhY2tzbGFzaGVzIGFyZSBub3QgYWxsb3dlZC5cbiAgICBGaWxlIG5hbWVzIGNhbm5vdCBzdGFydCB3aXRoIC8sIGVuZCB3aXRoIC8sIG9yIGNvbnRhaW4gLy8uXG4qL1xuXG5cbmV4cG9ydCBjb25zdCBnZXRBcmNoaXZlc0JhY2tibGF6ZSA9IGNhY2hlKChkb21haW46IHN0cmluZykgPT4ge1xuICAgIHJldHVybiBuZXcgQXJjaGl2ZXNCYWNrYmxhemUoeyBidWNrZXROYW1lOiBkb21haW4gfSk7XG59KTtcbmV4cG9ydCBjb25zdCBnZXRBcmNoaXZlc0JhY2tibGF6ZVByaXZhdGVJbW11dGFibGUgPSBjYWNoZSgoZG9tYWluOiBzdHJpbmcpID0+IHtcbiAgICByZXR1cm4gbmV3IEFyY2hpdmVzQmFja2JsYXplKHtcbiAgICAgICAgYnVja2V0TmFtZTogZG9tYWluICsgXCItcHJpdmF0ZS1pbW11dGFibGVcIixcbiAgICAgICAgaW1tdXRhYmxlOiB0cnVlXG4gICAgfSk7XG59KTtcbmV4cG9ydCBjb25zdCBnZXRBcmNoaXZlc0JhY2tibGF6ZVB1YmxpY0ltbXV0YWJsZSA9IGNhY2hlKChkb21haW46IHN0cmluZykgPT4ge1xuICAgIHJldHVybiBuZXcgQXJjaGl2ZXNCYWNrYmxhemUoe1xuICAgICAgICBidWNrZXROYW1lOiBkb21haW4gKyBcIi1wdWJsaWMtaW1tdXRhYmxlXCIsXG4gICAgICAgIHB1YmxpYzogdHJ1ZSxcbiAgICAgICAgaW1tdXRhYmxlOiB0cnVlLFxuICAgICAgICBhbGxvd2VkT3JpZ2luczogW2BodHRwczovLyR7ZG9tYWlufWAsIGBodHRwczovLzEyNy0wLTAtMS4ke2RvbWFpbn06NzAwN2BdLFxuICAgIH0pO1xufSk7XG5cbi8vIE5PVEU6IENhY2hlIGJ5IGEgbWludXRlLiBUaGlzIG1pZ2h0IGJlIGEgYmFkIGlkZWEsIGJ1dC4uLiB1c3VhbGx5IHdob2xlIHJlYXNvbiBmb3IgcHVibGljIGlzXG4vLyAgZm9yIGNsb3VkZmxhcmUgY2FjaGluZyAoYXMgb3RoZXJ3aXNlIHdlIGNhbiBqdXN0IGFjY2VzcyBpdCB0aHJvdWdoIGEgc2VydmVyKSwgb3IgZm9yIGxhcmdlIGZpbGVzXG4vLyAgKHdoaWNoIHNob3VsZCBiZSBjYWNoZWQgYW55d2F5cywgYW5kIHByb2JhYmx5IGV2ZW4gdXNlIGltbXV0YWJsZSBjYWNoaW5nKS5cbmV4cG9ydCBjb25zdCBnZXRBcmNoaXZlc0JhY2tibGF6ZVB1YmxpYyA9IGNhY2hlKChkb21haW46IHN0cmluZykgPT4ge1xuICAgIHJldHVybiBuZXcgQXJjaGl2ZXNCYWNrYmxhemUoe1xuICAgICAgICBidWNrZXROYW1lOiBkb21haW4gKyBcIi1wdWJsaWNcIixcbiAgICAgICAgcHVibGljOiB0cnVlLFxuICAgICAgICBjYWNoZVRpbWU6IHRpbWVJbk1pbnV0ZSxcbiAgICAgICAgYWxsb3dlZE9yaWdpbnM6IFtgaHR0cHM6Ly8ke2RvbWFpbn1gLCBgaHR0cHM6Ly8xMjctMC0wLTEuJHtkb21haW59OjcwMDdgXSxcbiAgICB9KTtcbn0pOyJdfQ==
|
|
801
|
+
/* _JS_SOURCE_HASH = "3be2dd337a25a9e20190720218a5cdf957942e1609d4d513bb72a7834b201c21"; */
|
|
@@ -70,7 +70,7 @@ export class ArchivesRemote implements IArchives {
|
|
|
70
70
|
private lastDeniedLog = 0;
|
|
71
71
|
|
|
72
72
|
public getDebugName() {
|
|
73
|
-
return `remoteStorage
|
|
73
|
+
return `remoteStorage ${this.parsed.address}:${this.parsed.port} account ${this.account} bucket ${this.bucketName}`;
|
|
74
74
|
}
|
|
75
75
|
|
|
76
76
|
public isConnected(): boolean {
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
/// <reference types="node" />
|
|
2
2
|
/// <reference types="node" />
|
|
3
|
-
import { ArchiveFileInfo, ArchivesSource, ArchivesSyncStatus, SyncActivity } from "../IArchives";
|
|
3
|
+
import { IArchives, ArchiveFileInfo, ArchivesSource, ArchivesSyncStatus, SyncActivity } from "../IArchives";
|
|
4
4
|
export declare const DEFAULT_FAST_WRITE_DELAY: number;
|
|
5
|
+
export declare const WINDOW_END_FLUSH_MARGIN: number;
|
|
5
6
|
export type WriteConfig = {
|
|
6
7
|
fast?: boolean;
|
|
7
8
|
writeDelay?: number;
|
|
@@ -70,7 +71,6 @@ export declare class BlobStore implements IBucketStore {
|
|
|
70
71
|
constructor(folder: string, sources: ArchivesSource[], config?: {
|
|
71
72
|
onIndexChanged?: ((key: string) => void) | undefined;
|
|
72
73
|
readerDiskLimit?: number | undefined;
|
|
73
|
-
getFlushDeadline?: (() => number | undefined) | undefined;
|
|
74
74
|
} | undefined);
|
|
75
75
|
private stopped;
|
|
76
76
|
private index;
|
|
@@ -93,9 +93,16 @@ export declare class BlobStore implements IBucketStore {
|
|
|
93
93
|
private countEntry;
|
|
94
94
|
private setIndexEntry;
|
|
95
95
|
private deleteIndexEntry;
|
|
96
|
-
/** Rescans our own disk's metadata into the index - used around
|
|
97
|
-
*
|
|
96
|
+
/** Rescans our own disk's metadata into the index - used around valid window handoffs, where
|
|
97
|
+
* another process wrote files to the shared folder that our index hasn't seen. */
|
|
98
98
|
rescanBase(): Promise<void>;
|
|
99
|
+
/** A boundary scan of the node that owned (part of) our route in the valid window before ours,
|
|
100
|
+
* when that node is different storage (a disk rescan can't see its writes): just its changes
|
|
101
|
+
* since the boundary neighborhood, with matching values pulled onto our own disk. */
|
|
102
|
+
boundaryScanRemote(source: IArchives, config: {
|
|
103
|
+
since: number;
|
|
104
|
+
route?: [number, number];
|
|
105
|
+
}): Promise<void>;
|
|
99
106
|
/** The cheap always-current totals plus any in-progress background synchronization. */
|
|
100
107
|
getSyncProgress(): {
|
|
101
108
|
index: {
|