sliftutils 1.7.72 → 1.7.73
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/dist/treeSummary.ts.cache +2 -2
- package/index.d.ts +1 -0
- package/misc/dist/environment.ts.cache +2 -2
- package/misc/dist/getSecret.ts.cache +2 -2
- package/misc/dist/strings.ts.cache +2 -2
- package/misc/dist/zip.ts.cache +2 -2
- package/misc/https/dist/certs.ts.cache +2 -2
- package/misc/https/dist/persistentLocalStorage.ts.cache +2 -2
- package/package.json +1 -1
- package/render-utils/dist/observer.tsx.cache +2 -2
- package/storage/BulkDatabase2/dist/BulkDatabaseBase.ts.cache +2 -2
- package/storage/BulkDatabase2/dist/BulkDatabaseFormat.ts.cache +2 -2
- package/storage/BulkDatabase2/dist/BulkDatabaseMerge.ts.cache +2 -2
- package/storage/BulkDatabase2/dist/BulkDatabaseReader.ts.cache +2 -2
- package/storage/BulkDatabase2/dist/LoadedIndex.ts.cache +2 -2
- package/storage/BulkDatabase2/dist/WriteOverlay.ts.cache +2 -2
- package/storage/BulkDatabase2/dist/blockCache.ts.cache +2 -2
- package/storage/BulkDatabase2/dist/mergeLock.ts.cache +2 -2
- package/storage/BulkDatabase2/dist/mergeMarkers.ts.cache +2 -2
- package/storage/BulkDatabase2/dist/streamLog.ts.cache +2 -2
- package/storage/BulkDatabase2/dist/syncClient.ts.cache +2 -2
- package/storage/IArchives.d.ts +1 -0
- package/storage/IArchives.ts +3 -2
- package/storage/dist/ArchivesDisk.ts.cache +2 -2
- package/storage/dist/FileFolderAPI.tsx.cache +2 -2
- package/storage/dist/IArchives.ts.cache +2 -2
- package/storage/dist/IndexedDBFileFolderAPI.ts.cache +2 -2
- package/storage/dist/JSONStorage.ts.cache +2 -2
- package/storage/dist/PendingManager.tsx.cache +2 -2
- package/storage/dist/TransactionStorage.ts.cache +2 -2
- package/storage/dist/backblaze.ts.cache +2 -2
- package/storage/dist/fileSystemPointer.ts.cache +2 -2
- package/storage/dist/remoteFileStorage.ts.cache +2 -2
- package/storage/remoteStorage/createArchives.ts +4 -2
- package/storage/remoteStorage/dist/ArchivesRemote.ts.cache +2 -2
- package/storage/remoteStorage/dist/ArchivesUrl.ts.cache +2 -2
- package/storage/remoteStorage/dist/accessStats.ts.cache +2 -2
- package/storage/remoteStorage/dist/blobStore.ts.cache +2 -2
- package/storage/remoteStorage/dist/bucketDisk.ts.cache +2 -2
- package/storage/remoteStorage/dist/cliArgs.ts.cache +2 -2
- package/storage/remoteStorage/dist/createArchives.ts.cache +8 -5
- package/storage/remoteStorage/dist/deployTakeover.ts.cache +2 -2
- package/storage/remoteStorage/dist/intermediateSources.ts.cache +2 -2
- package/storage/remoteStorage/dist/remoteConfig.ts.cache +2 -2
- package/storage/remoteStorage/dist/serverConfig.ts.cache +2 -2
- package/storage/remoteStorage/dist/sourceWrapper.ts.cache +2 -2
- package/storage/remoteStorage/dist/sourcesList.ts.cache +2 -2
- package/storage/remoteStorage/dist/storageClientController.ts.cache +2 -2
- package/storage/remoteStorage/dist/storageController.ts.cache +2 -2
- package/storage/remoteStorage/dist/storageServerState.ts.cache +2 -2
- package/storage/remoteStorage/dist/storePlan.ts.cache +2 -2
- package/storage/remoteStorage/dist/validation.ts.cache +2 -2
|
@@ -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
|
Object.defineProperty(exports, "__esModule", { value: true , configurable: true});
|
|
3
3
|
//exports.getBucketInfo = exports.clearServerWriteStats = exports.activateServerBucket = exports.listServerActiveBucketKeys = exports.getServerActiveBucket = exports.listServerBuckets = exports.createArchives = exports.ArchivesChain = exports.createApiArchives = exports.getBucketBaseUrl = exports.parseBackblazeUrl = exports.parseHostedUrl = void 0;
|
|
4
4
|
const misc_1 = require("socket-function/src/misc");
|
|
@@ -642,6 +642,7 @@ class ArchivesChain {
|
|
|
642
642
|
let state = await this.getState();
|
|
643
643
|
// Errors name the OPERATION and the SPECIFIC sources that failed - "the find failed because source X is unavailable", never an anonymous failure attributed to the whole chain
|
|
644
644
|
let outcome = await (async () => {
|
|
645
|
+
var _a;
|
|
645
646
|
let covering;
|
|
646
647
|
try {
|
|
647
648
|
covering = this.selectCoveringSources(state, { fallbacks: config === null || config === void 0 ? void 0 : config.fallbacks, exclude: failed });
|
|
@@ -670,8 +671,10 @@ class ArchivesChain {
|
|
|
670
671
|
}));
|
|
671
672
|
if (!failures.length)
|
|
672
673
|
return { values };
|
|
673
|
-
|
|
674
|
-
|
|
674
|
+
if (failures.length === 1) {
|
|
675
|
+
return { error: new Error(`${operation} failed because source ${failures[0].source.getDebugName()} is unavailable: ${(_a = failures[0].error.stack) !== null && _a !== void 0 ? _a : failures[0].error}`) };
|
|
676
|
+
}
|
|
677
|
+
return { error: new Error(`${operation} failed because ${failures.length} of the ${covering.length} covering sources are unavailable: ${failures.map(x => { var _a; return `${x.source.getDebugName()}: ${(_a = x.error.stack) !== null && _a !== void 0 ? _a : x.error}`; }).join(" | ")}`) };
|
|
675
678
|
})();
|
|
676
679
|
if ("values" in outcome)
|
|
677
680
|
return outcome.values;
|
|
@@ -1033,5 +1036,5 @@ async function getBucketInfo(config) {
|
|
|
1033
1036
|
return await remote.getConfig();
|
|
1034
1037
|
}
|
|
1035
1038
|
exports.getBucketInfo = getBucketInfo;
|
|
1036
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3JlYXRlQXJjaGl2ZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJjcmVhdGVBcmNoaXZlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSxtREFBMEU7QUFDMUUsMkRBQXFEO0FBQ3JELDRDQUlzQjtBQUN0QixpREFJd0I7QUFDeEIsK0NBQTRDO0FBQzVDLCtEQUFtRTtBQUNuRSxtRUFBZ0U7QUFDaEUscURBQXdGO0FBQ3hGLHVFQUFtRTtBQUNuRSw0Q0FBaUQ7QUFDakQsNkRBQTRGO0FBQzVGLGlEQUE4QztBQUM5QywyREFBeUY7QUFDekYsbURBQWtHO0FBRWxHLE1BQU0sb0JBQW9CLEdBQUcsQ0FBQyxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUM7QUFDM0MsTUFBTSw0QkFBNEIsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDO0FBQy9DLE1BQU0saUNBQWlDLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQztBQUNwRCxNQUFNLHVCQUF1QixHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUM7QUFDMUMsTUFBTSw2QkFBNkIsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDO0FBQy9DLE1BQU0scUJBQXFCLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQztBQUN4QyxNQUFNLG1CQUFtQixHQUFHLENBQUMsR0FBRyxJQUFJLENBQUM7QUFDckMsTUFBTSxzQkFBc0IsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDO0FBQ3pDLE1BQU0sb0JBQW9CLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQztBQUN0Qyx3SkFBd0o7QUFDeEosTUFBTSxtQkFBbUIsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDO0FBQ3RDLDZHQUE2RztBQUM3RyxNQUFNLHVDQUF1QyxHQUFHLElBQUksR0FBRyxJQUFJLENBQUM7QUFDNUQsTUFBTSxxQ0FBcUMsR0FBRyxHQUFHLEdBQUcsSUFBSSxDQUFDO0FBQ3pELG9KQUFvSjtBQUNwSixNQUFNLG9CQUFvQixHQUFHLCtCQUErQixDQUFDO0FBVTdE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TSxDQUFDLEdBQUcsRUFBRSxhQUFhLEVBQUUsS0FBSyxFQUFFLFlBQVksRUFBRSxJQUFBLDhCQUFlLEVBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUN0SCxPQUFPLE1BQU0sTUFBTSxDQUFDLFNBQVMsRUFBRSxDQUFDO0FBQ3BDLENBQUM7QUFKRCxzQ0FJQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGlzTm9kZSwgc29ydCwgd2F0Y2hTbG93UHJvbWlzZSB9IGZyb20gXCJzb2NrZXQtZnVuY3Rpb24vc3JjL21pc2NcIjtcbmltcG9ydCB7IGRlbGF5IH0gZnJvbSBcInNvY2tldC1mdW5jdGlvbi9zcmMvYmF0Y2hpbmdcIjtcbmltcG9ydCB7XG4gICAgSUFyY2hpdmVzLCBSZW1vdGVDb25maWcsIFJlbW90ZUNvbmZpZ0Jhc2UsIFNvdXJjZUNvbmZpZyxcbiAgICBBcmNoaXZlRmlsZUluZm8sIEFyY2hpdmVzQ29uZmlnLCBBcmNoaXZlc1N5bmNTdGF0dXMsIENoYW5nZXNBZnRlckNvbmZpZywgRGVsQ29uZmlnLCBGaW5kQ29uZmlnLCBHZXRDb25maWcsIEdldEluZm9Db25maWcsIFNldENvbmZpZywgU1RPUkFHRV9XUk9OR19WQUxJRF9XSU5ET1csXG4gICAgU1RPUkFHRV9XUk9OR19ST1VURSwgRlVMTF9ST1VURSwgVkFSSUFCTEVfU0hBUkQsIExBUkdFX1NFVF9USFJFU0hPTEQsIGJ1ZmZlckNodW5rU3RyZWFtLFxufSBmcm9tIFwiLi4vSUFyY2hpdmVzXCI7XG5pbXBvcnQge1xuICAgIFJPVVRJTkdfRklMRSwgZ2V0Q29uZmlnVmVyc2lvbiwgcGFyc2VIb3N0ZWRVcmwsIHBhcnNlQmFja2JsYXplVXJsLFxuICAgIG5vcm1hbGl6ZVJlbW90ZUNvbmZpZywgbm9ybWFsaXplU291cmNlLCBzZXJpYWxpemVSZW1vdGVDb25maWcsXG4gICAgZ2V0Um91dGUsIHJvdXRlQ29udGFpbnMsIHBhcnNlVmFyaWFibGVSb3V0ZSwgZ2V0QnVja2V0QmFzZVVybCwgYnVpbGRGaWxlVXJsLFxufSBmcm9tIFwiLi9yZW1vdGVDb25maWdcIjtcbmltcG9ydCB7IEFyY2hpdmVzVXJsIH0gZnJvbSBcIi4vQXJjaGl2ZXNVcmxcIjtcbmltcG9ydCB7IHJlc29sdmVJbnRlcm1lZGlhdGVTb3VyY2VzIH0gZnJvbSBcIi4vaW50ZXJtZWRpYXRlU291cmNlc1wiO1xuaW1wb3J0IHsgU29ja2V0RnVuY3Rpb24gfSBmcm9tIFwic29ja2V0LWZ1bmN0aW9uL1NvY2tldEZ1bmN0aW9uXCI7XG5pbXBvcnQgeyBBcmNoaXZlc1JlbW90ZSwgcGFyc2VTdG9yYWdlVXJsLCBhdXRoZW50aWNhdGVTdG9yYWdlIH0gZnJvbSBcIi4vQXJjaGl2ZXNSZW1vdGVcIjtcbmltcG9ydCB7IG9uU2VydmVyUm91dGluZ0NoYW5nZWQgfSBmcm9tIFwiLi9zdG9yYWdlQ2xpZW50Q29udHJvbGxlclwiO1xuaW1wb3J0IHsgQXJjaGl2ZXNCYWNrYmxhemUgfSBmcm9tIFwiLi4vYmFja2JsYXplXCI7XG5pbXBvcnQgeyBTZXJ2ZXJCdWNrZXRJbmZvLCBBY3RpdmVCdWNrZXRJbmZvLCBnZXRMb2NhbEFyY2hpdmVzIH0gZnJvbSBcIi4vc3RvcmFnZVNlcnZlclN0YXRlXCI7XG5pbXBvcnQgeyBpc093bkFkZHJlc3MgfSBmcm9tIFwiLi9zZXJ2ZXJDb25maWdcIjtcbmltcG9ydCB7IFJlbW90ZVN0b3JhZ2VDb250cm9sbGVyLCBTVE9SQUdFX05PVF9BVVRIRU5USUNBVEVEIH0gZnJvbSBcIi4vc3RvcmFnZUNvbnRyb2xsZXJcIjtcbmltcG9ydCB7IFNvdXJjZVdyYXBwZXIsIFJFVFJZX1NUQVJUX0RFTEFZLCBSRVRSWV9NQVhfREVMQVksIFJFVFJZX0dST1dUSCB9IGZyb20gXCIuL3NvdXJjZVdyYXBwZXJcIjtcblxuY29uc3QgQ09ORklHX1BPTExfSU5URVJWQUwgPSA1ICogNjAgKiAxMDAwO1xuY29uc3QgV1JPTkdfVEFSR0VUX0JPVU5EQVJZX1dJTkRPVyA9IDMwICogMTAwMDtcbmNvbnN0IFdST05HX1RBUkdFVF9CT1VOREFSWV9SRVRSWV9ERUxBWSA9IDE1ICogMTAwMDtcbmNvbnN0IENPTkZJR19SRUZSRVNIX1RIUk9UVExFID0gMzAgKiAxMDAwO1xuY29uc3QgQVZBSUxBQklMSVRZX1JFQ0hFQ0tfVEhST1RUTEUgPSA1ICogMTAwMDtcbmNvbnN0IFBSSU1BUllfUkVUUllfVElNRU9VVCA9IDMwICogMTAwMDtcbmNvbnN0IFBSSU1BUllfUkVUUllfREVMQVkgPSAyICogMTAwMDtcbmNvbnN0IENPVkVSSU5HX1JFVFJZX1RJTUVPVVQgPSAzMCAqIDEwMDA7XG5jb25zdCBDT1ZFUklOR19SRVRSWV9ERUxBWSA9IDUgKiAxMDAwO1xuLy8gU21hcnQgdGltZW91dHM6IGFuIGF0dGVtcHQgZ2V0cyB0aGlzIGxvbmcgdG8gcHJvZHVjZSBhbnl0aGluZyBiZWZvcmUgd2UgcHJvYmUgZ2V0SW5mbyBmb3IgdGhlIGZpbGUncyBzaXplIChhbmQgdGhlIHByb2JlIGl0c2VsZiBnZXRzIHRoZSBzYW1lIHdpbmRvdylcbmNvbnN0IFNNQVJUX1RJTUVPVVRfUFJPQkUgPSAxMCAqIDEwMDA7XG4vLyBWZXJ5IGdlbmVyb3VzIGFzc3VtZWQgdHJhbnNmZXIgcmF0ZXMgLSB0aGUgcmVzdWx0aW5nIGRlYWRsaW5lIGV4aXN0cyB0byBjYXRjaCBzdHVjayBzb3VyY2VzLCBub3Qgc2xvdyBvbmVzXG5jb25zdCBTTUFSVF9USU1FT1VUX0RPV05MT0FEX0JZVEVTX1BFUl9TRUNPTkQgPSAxMDI0ICogMTAyNDtcbmNvbnN0IFNNQVJUX1RJTUVPVVRfVVBMT0FEX0JZVEVTX1BFUl9TRUNPTkQgPSA1MTIgKiAxMDI0O1xuLy8gTWFya2VyIGluIHNtYXJ0LXRpbWVvdXQgZXJyb3JzLCBzbyB0aGUgcmVhZCBsb29wIGNhbiBsb2cgdGhlbSBhbmQgY29udGludWUgd2l0aCB0aGUgb3RoZXIgc291cmNlcyAoYSBjb25uZWN0ZWQgc291cmNlJ3Mgb3RoZXIgZXJyb3JzIHN0aWxsIHRocm93KVxuY29uc3QgU01BUlRfVElNRU9VVF9NQVJLRVIgPSBcIkFSQ0hJVkVTX1NNQVJUX1RJTUVPVVRfYzQxYTlkXCI7XG5cbi8vIFNpemVzIGEgZ2VuZXJvdXMgcGVyLWF0dGVtcHQgZGVhZGxpbmUuIEdldC1zdHlsZSBjYWxscyBwYXNzIHBhdGg6IHRoZSBzaXplIGlzIG9ubHkgZmV0Y2hlZCAodmlhIGdldEluZm8pIHdoZW4gdGhlIGNhbGwgdHVybnMgb3V0IHRvIGJlIHNsb3cuIFNldC1zdHlsZSBjYWxscyBwYXNzIHVwbG9hZEJ5dGVzLCB3aGljaCB0aGV5IGFscmVhZHkga25vdy5cbnR5cGUgU21hcnRUaW1lb3V0ID0ge1xuICAgIHBhdGg/OiBzdHJpbmc7XG4gICAgdXBsb2FkQnl0ZXM/OiBudW1iZXI7XG4gICAgLy8gTmFtZXMgdGhlIG9wZXJhdGlvbiBpbiB0aW1lb3V0IGVycm9ycyAtIHdpdGhvdXQgaXQgYSBkZWxldGlvbiAoYSB0b21ic3RvbmUgd3JpdGUsIHVwbG9hZEJ5dGVzIDApIHJlYWRzIGFzIFwiVXBsb2FkIG9mIDAgYnl0ZXNcIiwgd2hpY2ggbG9va3MgbGlrZSBhIGJ1ZyByYXRoZXIgdGhhbiBhIGRlbGV0ZVxuICAgIGxhYmVsPzogc3RyaW5nO1xufTtcblxuLyoqIFRoZSBhZGRyZXNzLCBwb3J0LCBhY2NvdW50LCBhbmQgYnVja2V0IG5hbWUgYSBidWNrZXQgcm91dGluZyBVUkwgYWRkcmVzc2VzLiBUaHJvd3Mgd2hlbiB0aGUgVVJMIGlzbid0IGEgaG9zdGVkIGJ1Y2tldCByb3V0aW5nIFVSTCAoaHR0cHM6Ly9ob3N0OnBvcnQvZmlsZS88YWNjb3VudD4vPGJ1Y2tldE5hbWU+L3N0b3JhZ2Uvc3RvcmFnZXJvdXRpbmcuanNvbikuICovXG5leHBvcnQgeyBwYXJzZUhvc3RlZFVybCwgcGFyc2VCYWNrYmxhemVVcmwsIGdldEJ1Y2tldEJhc2VVcmwgfSBmcm9tIFwiLi9yZW1vdGVDb25maWdcIjtcblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUFwaUFyY2hpdmVzKHNvdXJjZTogU291cmNlQ29uZmlnKTogSUFyY2hpdmVzIHtcbiAgICBpZiAoc291cmNlLnR5cGUgPT09IFwiYmFja2JsYXplXCIpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBBcmNoaXZlc0JhY2tibGF6ZSh7IGJ1Y2tldE5hbWU6IHBhcnNlQmFja2JsYXplVXJsKHNvdXJjZS51cmwpLmJ1Y2tldE5hbWUsIHB1YmxpYzogc291cmNlLnB1YmxpYywgaW1tdXRhYmxlOiBzb3VyY2UuaW1tdXRhYmxlLCBhbGxvd2VkT3JpZ2luczogc291cmNlLmFsbG93ZWRPcmlnaW5zIH0pO1xuICAgIH1cbiAgICBsZXQgcGFyc2VkID0gcGFyc2VIb3N0ZWRVcmwoc291cmNlLnVybCk7XG4gICAgaWYgKGlzTm9kZSgpICYmIGlzT3duQWRkcmVzcyhwYXJzZWQuYWRkcmVzcywgcGFyc2VkLnBvcnQpKSB7XG4gICAgICAgIHJldHVybiBnZXRMb2NhbEFyY2hpdmVzKHBhcnNlZC5hY2NvdW50LCBwYXJzZWQuYnVja2V0TmFtZSwgc291cmNlKTtcbiAgICB9XG4gICAgcmV0dXJuIG5ldyBBcmNoaXZlc1JlbW90ZSh7IHVybDogc291cmNlLnVybCwgd2FpdEZvckFjY2VzczogZmFsc2UsIHNvdXJjZUNvbmZpZzogc291cmNlIH0pO1xufVxuXG50eXBlIENoYWluU3RhdGUgPSB7XG4gICAgY29uZmlnOiBSZW1vdGVDb25maWc7XG4gICAgc291cmNlczogU291cmNlV3JhcHBlcltdO1xufTtcblxuZXhwb3J0IHR5cGUgQXJjaGl2ZXNDaGFpbk9wdGlvbnMgPSB7XG4gICAgLyoqIE91dHNpZGUgb2Ygbm9kZSB3ZSBkZWZhdWx0IHRvIHJlYWQtb25seSBkb3dubG9hZHMgb3ZlciB0aGUgcHVibGljIFVSTHMgKG5vIEFQSSBjb25uZWN0aW9uKSB3aGVuIHRoZSBjb25maWcgaGFzIHB1YmxpYyBzb3VyY2VzLiBTZXQgdGhpcyB0byBjb25uZWN0IHRvIHRoZSBBUEkgYW55d2F5IC0gbmVlZGVkIGZvciB3cml0aW5nLCBsaXN0aW5nLCBhbmQgYW55IG90aGVyIG9wZXJhdGlvbiB0aGUgcGxhaW4gVVJMIGZvcm0gY2Fubm90IHNlcnZlLiAqL1xuICAgIGRpcmVjdENvbm5lY3Q/OiBib29sZWFuO1xufTtcblxuZnVuY3Rpb24gY29uZmlnV2luZG93Q3VycmVudChjb25maWc6IFNvdXJjZUNvbmZpZyk6IGJvb2xlYW4ge1xuICAgIGxldCBub3cgPSBEYXRlLm5vdygpO1xuICAgIGxldCBbc3RhcnQsIGVuZF0gPSBjb25maWcudmFsaWRXaW5kb3c7XG4gICAgcmV0dXJuIHN0YXJ0IDw9IG5vdyAmJiBub3cgPCBlbmQ7XG59XG5cbmZ1bmN0aW9uIGNvbmZpZ0FjY2VwdHNXcml0ZXMoY29uZmlnOiBTb3VyY2VDb25maWcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gY29uZmlnV2luZG93Q3VycmVudChjb25maWcpO1xufVxuXG5mdW5jdGlvbiBtYXRlcmlhbGl6ZVNoYXJkS2V5KGtleTogc3RyaW5nLCB0YXJnZXQ6IFNvdXJjZVdyYXBwZXIpOiBzdHJpbmcge1xuICAgIGxldCBbc3RhcnQsIGVuZF0gPSB0YXJnZXQuY29uZmlnLnJvdXRlIHx8IEZVTExfUk9VVEU7XG4gICAgcmV0dXJuIGtleS5yZXBsYWNlKFZBUklBQkxFX1NIQVJELCBWQVJJQUJMRV9TSEFSRCArIFwiX1wiICsgKHN0YXJ0ICsgTWF0aC5yYW5kb20oKSAqIChlbmQgLSBzdGFydCkpKTtcbn1cblxuLyoqIENvdmVycyB0aGUgd2hvbGUga2V5IHNwYWNlIHdpdGggdGhlIEFVVEhPUklUQVRJVkUgc291cmNlczogZm9yIGVhY2ggdW5jb3ZlcmVkIHBvaW50LCB0aGUgRklSU1Qgc291cmNlIGluIGNvbmZpZyBvcmRlciB3aG9zZSByb3V0ZSBjb250YWlucyBpdCAtIHRoZSBleGFjdCBzZWxlY3Rpb24gZXZlcnkgcmVhZCBhbmQgd3JpdGUgdXNlcywgc28gbGlzdGluZ3MgY29tZSBmcm9tIHRoZSBzYW1lIG5vZGVzIHdyaXRlcyB3ZW50IHRvIChyZWFkLXlvdXItd3JpdGVzKS4gTmV2ZXIgXCJmZXdlc3RcIiBvciBcIndpZGVzdFwiOiBwcmVmZXJyaW5nIGEgd2lkZSByZWFkIHJlcGxpY2Egb3ZlciB0aGUgcm91dGVkIHdyaXRlIHNoYXJkcyB3b3VsZCBzZXJ2ZSBsaXN0aW5ncyBmcm9tIGEgbm9kZSB0aGF0IG9ubHkgaGFzIHRoZSBkYXRhIHNlY29uZC1oYW5kLiBSZXR1cm5zIHVuZGVmaW5lZCB3aGVuIHRoZSBjYW5kaWRhdGVzIGxlYXZlIGEgZ2FwLiAqL1xuZnVuY3Rpb24gY292ZXJSb3V0ZXMoY2FuZGlkYXRlczogU291cmNlV3JhcHBlcltdKTogU291cmNlV3JhcHBlcltdIHwgdW5kZWZpbmVkIHtcbiAgICBsZXQgY2hvc2VuOiBTb3VyY2VXcmFwcGVyW10gPSBbXTtcbiAgICBsZXQgY292ZXJlZCA9IDA7XG4gICAgd2hpbGUgKGNvdmVyZWQgPCAxKSB7XG4gICAgICAgIGxldCBuZXh0ID0gY2FuZGlkYXRlcy5maW5kKHggPT4gcm91dGVDb250YWlucyh4LmNvbmZpZy5yb3V0ZSwgY292ZXJlZCkpO1xuICAgICAgICBpZiAoIW5leHQpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIGNob3Nlbi5wdXNoKG5leHQpO1xuICAgICAgICBsZXQgWywgZW5kXSA9IG5leHQuY29uZmlnLnJvdXRlIHx8IEZVTExfUk9VVEU7XG4gICAgICAgIGNvdmVyZWQgPSBlbmQ7XG4gICAgfVxuICAgIHJldHVybiBjaG9zZW47XG59XG5cbi8qKiBSRUFEUyBPTkxZLiBEcm9wcyBzb3VyY2VzIHRoYXQgcmVjZW50bHkgZmFpbGVkIHdoaWxlIGRpc2Nvbm5lY3RlZCAtIHVubGVzcyB0aGF0IHdvdWxkIGxlYXZlIG5vdGhpbmcsIGluIHdoaWNoIGNhc2UgYSBkb3duIHNvdXJjZSBpcyBzdGlsbCBiZXR0ZXIgdGhhbiBubyBzb3VyY2UsIGFuZCB3ZSByZXRyeSBpdCBpbW1lZGlhdGVseS4gTmV2ZXIgYXBwbGllcyB0byB3cml0ZXMgKG9yIG5vRmFsbGJhY2tzIHJlYWRzIG9mIHRoZSB3cml0ZSB0YXJnZXQpOiB0aGUgd3JpdGUgbm9kZSBpcyBzdHJpY3RseSB0aGUgRklSU1Qgc291cmNlIG1hdGNoaW5nIHRoZSByb3V0ZSBhbmQgdmFsaWQgd2luZG93LCByZWdhcmRsZXNzIG9mIGNvbm5lY3Rpdml0eSAtIGEgY2xpZW50J3MgZmxha3kgdmlldyBvZiB0aGUgbmV0d29yayBtdXN0IG5ldmVyIHNjYXR0ZXIgd3JpdGVzIGFjcm9zcyB0aGUgY2hhaW4gKHNwZWM6IGNsaWVudCB3cml0ZXMgYXJlIGNvbnNpc3RlbnQsIGNsaWVudCByZWFkcyBhcmUgcmVkdW5kYW50KS4gKi9cbmZ1bmN0aW9uIHByZWZlclVzYWJsZShzb3VyY2VzOiBTb3VyY2VXcmFwcGVyW10pOiBTb3VyY2VXcmFwcGVyW10ge1xuICAgIGxldCB1c2FibGUgPSBzb3VyY2VzLmZpbHRlcih4ID0+ICF4LmlzT25Db29sZG93bigpKTtcbiAgICByZXR1cm4gdXNhYmxlLmxlbmd0aCAmJiB1c2FibGUgfHwgc291cmNlcztcbn1cblxuZXhwb3J0IGNsYXNzIEFyY2hpdmVzQ2hhaW4gaW1wbGVtZW50cyBJQXJjaGl2ZXMge1xuICAgIHByaXZhdGUgY29uZmlndXJlZDogUmVtb3RlQ29uZmlnO1xuICAgIHByaXZhdGUgYWN0aXZlQ29uZmlnOiBSZW1vdGVDb25maWc7XG4gICAgcHJpdmF0ZSBzdGF0ZVByb21pc2U6IFByb21pc2U8Q2hhaW5TdGF0ZT4gfCB1bmRlZmluZWQ7XG4gICAgLy8gVGhlIHJlc29sdmVkIHN0YXRlLCBmb3Igc3luY2hyb25vdXMgYWNjZXNzIChnZXRHZXRVUkxzKSAtIGFsd2F5cyB0aGUgbmV3ZXN0IGFkb3B0ZWQgY29uZmlnLCB3aGVyZSBzdGF0ZVByb21pc2UgbWF5IGJyaWVmbHkgbGFnIGR1cmluZyBhIHJlYnVpbGRcbiAgICBwcml2YXRlIGxhdGVzdFN0YXRlOiBDaGFpblN0YXRlIHwgdW5kZWZpbmVkO1xuICAgIHByaXZhdGUgaW5pdFJldHJ5RGVsYXkgPSBSRVRSWV9TVEFSVF9ERUxBWTtcbiAgICBwcml2YXRlIGluaXRSZXRyeVRpbWVyOiBSZXR1cm5UeXBlPHR5cGVvZiBzZXRUaW1lb3V0PiB8IHVuZGVmaW5lZDtcbiAgICBwcml2YXRlIHBvbGxUaW1lcjogUmV0dXJuVHlwZTx0eXBlb2Ygc2V0SW50ZXJ2YWw+IHwgdW5kZWZpbmVkO1xuICAgIHByaXZhdGUgZGlzcG9zZWQgPSBmYWxzZTtcbiAgICBwcml2YXRlIHVuc3Vic2NyaWJlUm91dGluZ1B1c2g6ICgoKSA9PiB2b2lkKSB8IHVuZGVmaW5lZDtcblxuICAgIGNvbnN0cnVjdG9yKGNvbmZpZzogUmVtb3RlQ29uZmlnIHwgUmVtb3RlQ29uZmlnQmFzZSwgcHJpdmF0ZSBvcHRpb25zPzogQXJjaGl2ZXNDaGFpbk9wdGlvbnMpIHtcbiAgICAgICAgdGhpcy5jb25maWd1cmVkID0gbm9ybWFsaXplUmVtb3RlQ29uZmlnKGNvbmZpZyk7XG4gICAgICAgIHRoaXMuYWN0aXZlQ29uZmlnID0gdGhpcy5jb25maWd1cmVkO1xuICAgICAgICB0aGlzLnVuc3Vic2NyaWJlUm91dGluZ1B1c2ggPSBvblNlcnZlclJvdXRpbmdDaGFuZ2VkKCgpID0+IHtcbiAgICAgICAgICAgIHZvaWQgdGhpcy5yZWZyZXNoQWN0aXZlQ29uZmlnKCkuY2F0Y2goKGU6IEVycm9yKSA9PiBjb25zb2xlLmVycm9yKGBDb25maWcgcmVmcmVzaCBmYWlsZWQgZm9yICR7dGhpcy5nZXREZWJ1Z05hbWUoKX06ICR7ZS5zdGFjayA/PyBlfWApKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldERlYnVnTmFtZSgpIHtcbiAgICAgICAgbGV0IHVybHMgPSB0aGlzLmFjdGl2ZUNvbmZpZy5zb3VyY2VzLm1hcCh4ID0+IHR5cGVvZiB4ID09PSBcInN0cmluZ1wiICYmIHggfHwgKHggYXMgU291cmNlQ29uZmlnKS51cmwpO1xuICAgICAgICByZXR1cm4gYGNoYWluICR7dXJscy5qb2luKFwiLCBcIil9YDtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldFN0YXRlKCk6IFByb21pc2U8Q2hhaW5TdGF0ZT4ge1xuICAgICAgICBpZiAodGhpcy5kaXNwb3NlZCkge1xuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihgQXJjaGl2ZXNDaGFpbiAke3RoaXMuZ2V0RGVidWdOYW1lKCl9IGhhcyBiZWVuIGRpc3Bvc2VkYCkpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghdGhpcy5zdGF0ZVByb21pc2UpIHtcbiAgICAgICAgICAgIGxldCBwcm9taXNlID0gdGhpcy5pbml0KCk7XG4gICAgICAgICAgICB0aGlzLnN0YXRlUHJvbWlzZSA9IHByb21pc2U7XG4gICAgICAgICAgICBwcm9taXNlLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuaW5pdFJldHJ5RGVsYXkgPSBSRVRSWV9TVEFSVF9ERUxBWTtcbiAgICAgICAgICAgIH0sIChlOiBFcnJvcikgPT4ge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmRpc3Bvc2VkIHx8IHRoaXMuaW5pdFJldHJ5VGltZXIpIHJldHVybjtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGBTdG9yYWdlIGluaXQgZmFpbGVkIGZvciAke3RoaXMuZ2V0RGVidWdOYW1lKCl9LCByZXRyeWluZyBpbiAke01hdGgucm91bmQodGhpcy5pbml0UmV0cnlEZWxheSAvIDEwMDApfXMuICR7ZS5zdGFjayA/PyBlfWApO1xuICAgICAgICAgICAgICAgIHRoaXMuaW5pdFJldHJ5VGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pbml0UmV0cnlUaW1lciA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuZGlzcG9zZWQpIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuc3RhdGVQcm9taXNlID09PSBwcm9taXNlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnN0YXRlUHJvbWlzZSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB0aGlzLmdldFN0YXRlKCkuY2F0Y2goKCkgPT4geyB9KTtcbiAgICAgICAgICAgICAgICB9LCB0aGlzLmluaXRSZXRyeURlbGF5KTtcbiAgICAgICAgICAgICAgICAodGhpcy5pbml0UmV0cnlUaW1lciBhcyB7IHVucmVmPzogKCkgPT4gdm9pZCB9KS51bnJlZj8uKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5pbml0UmV0cnlEZWxheSA9IE1hdGgubWluKFJFVFJZX01BWF9ERUxBWSwgdGhpcy5pbml0UmV0cnlEZWxheSAqIFJFVFJZX0dST1dUSCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5zdGF0ZVByb21pc2U7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBpbml0KCk6IFByb21pc2U8Q2hhaW5TdGF0ZT4ge1xuICAgICAgICBsZXQgY29uZmlncyA9IHRoaXMuY29uZmlndXJlZC5zb3VyY2VzLm1hcChub3JtYWxpemVTb3VyY2UpO1xuICAgICAgICBsZXQgcmVhZE9ubHkgPSB0aGlzLmlzUmVhZE9ubHkodGhpcy5jb25maWd1cmVkKTtcbiAgICAgICAgbGV0IGZldGNoZXMgPSBhd2FpdCBQcm9taXNlLmFsbChjb25maWdzLm1hcChhc3luYyBzb3VyY2VDb25maWcgPT4ge1xuICAgICAgICAgICAgbGV0IHByb2JlID0gYXdhaXQgU291cmNlV3JhcHBlci5jcmVhdGUoc291cmNlQ29uZmlnLCB7IGJhY2tncm91bmQ6IGZhbHNlLCByZWFkT25seSB9KTtcbiAgICAgICAgICAgIGxldCBzdGFydCA9IERhdGUubm93KCk7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGxldCBleGlzdGluZyA9IGF3YWl0IHByb2JlLnJlYWRSb3V0aW5nQ29uZmlnKCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgcHJvYmUsIHNvdXJjZUNvbmZpZywgcmVzcG9uZGVkOiB0cnVlLCBsYXRlbmN5OiBEYXRlLm5vdygpIC0gc3RhcnQsIGV4aXN0aW5nLCBlcnJvcjogXCJcIiB9O1xuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB7IHByb2JlLCBzb3VyY2VDb25maWcsIHJlc3BvbmRlZDogZmFsc2UsIGxhdGVuY3k6IDAsIGV4aXN0aW5nOiB1bmRlZmluZWQsIGVycm9yOiBgJHtzb3VyY2VDb25maWcudXJsfTogJHsoZSBhcyBFcnJvcikuc3RhY2sgPz8gZX1gIH07XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGxldCBmb3VuZCA9IGZldGNoZXMuZmluZCh4ID0+IHgucmVzcG9uZGVkKTtcbiAgICAgICAgICAgIGlmICghZm91bmQpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCBpbml0aWFsaXplIHN0b3JhZ2UgZm9yICR7dGhpcy5nZXREZWJ1Z05hbWUoKX06IG5vIHNvdXJjZSBhbnN3ZXJlZC4gJHtmZXRjaGVzLm1hcCh4ID0+IHguZXJyb3IpLmpvaW4oXCIgfCBcIil9YCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsZXQgZXhpc3RpbmcgPSBmb3VuZC5leGlzdGluZztcbiAgICAgICAgICAgIGxldCBhY3RpdmUgPSB0aGlzLmNvbmZpZ3VyZWQ7XG4gICAgICAgICAgICBsZXQgbmVlZHNXcml0ZSA9IHRydWU7XG4gICAgICAgICAgICBpZiAoZXhpc3RpbmcgJiYgZ2V0Q29uZmlnVmVyc2lvbihleGlzdGluZykgPj0gZ2V0Q29uZmlnVmVyc2lvbih0aGlzLmNvbmZpZ3VyZWQpKSB7XG4gICAgICAgICAgICAgICAgaWYgKGdldENvbmZpZ1ZlcnNpb24oZXhpc3RpbmcpID09PSBnZXRDb25maWdWZXJzaW9uKHRoaXMuY29uZmlndXJlZCkgJiYgSlNPTi5zdHJpbmdpZnkoZXhpc3RpbmcpICE9PSBKU09OLnN0cmluZ2lmeSh0aGlzLmNvbmZpZ3VyZWQpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYEFyY2hpdmVzIGNvbmZpZ3VyYXRpb24gdXBkYXRlZCB3aXRob3V0IHVwZGF0aW5nIHRoZSB2ZXJzaW9uLCBmb3IgJHtmb3VuZC5zb3VyY2VDb25maWcudXJsfS4gVXBkYXRlcyB3aWxsIGJlIGlnbm9yZWQgdW50aWwgeW91IGluY3JlYXNlIHRoZSB2ZXJzaW9uLiBVc2luZzogJHtKU09OLnN0cmluZ2lmeShleGlzdGluZyl9LCBpZ25vcmluZzogJHtKU09OLnN0cmluZ2lmeSh0aGlzLmNvbmZpZ3VyZWQpfWApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBhY3RpdmUgPSBleGlzdGluZztcbiAgICAgICAgICAgICAgICBuZWVkc1dyaXRlID0gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAobmVlZHNXcml0ZSkge1xuICAgICAgICAgICAgICAgIGxldCBiZXN0OiBSZW1vdGVDb25maWcgfCB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgbGV0IGNvbmZsaWN0VXJsOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgZmV0Y2ggb2YgZmV0Y2hlcykge1xuICAgICAgICAgICAgICAgICAgICBsZXQgc3RvcmVkID0gZmV0Y2guZXhpc3Rpbmc7XG4gICAgICAgICAgICAgICAgICAgIGlmICghc3RvcmVkKSBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFiZXN0IHx8IGdldENvbmZpZ1ZlcnNpb24oc3RvcmVkKSA+IGdldENvbmZpZ1ZlcnNpb24oYmVzdCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJlc3QgPSBzdG9yZWQ7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKGdldENvbmZpZ1ZlcnNpb24oc3RvcmVkKSA9PT0gZ2V0Q29uZmlnVmVyc2lvbih0aGlzLmNvbmZpZ3VyZWQpICYmIEpTT04uc3RyaW5naWZ5KHN0b3JlZCkgIT09IEpTT04uc3RyaW5naWZ5KHRoaXMuY29uZmlndXJlZCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZsaWN0VXJsID0gZmV0Y2guc291cmNlQ29uZmlnLnVybDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoYmVzdCAmJiBnZXRDb25maWdWZXJzaW9uKGJlc3QpID49IGdldENvbmZpZ1ZlcnNpb24odGhpcy5jb25maWd1cmVkKSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoY29uZmxpY3RVcmwgJiYgZ2V0Q29uZmlnVmVyc2lvbihiZXN0KSA9PT0gZ2V0Q29uZmlnVmVyc2lvbih0aGlzLmNvbmZpZ3VyZWQpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGBBcmNoaXZlcyBjb25maWd1cmF0aW9uIHVwZGF0ZWQgd2l0aG91dCB1cGRhdGluZyB0aGUgdmVyc2lvbiwgZm9yICR7Y29uZmxpY3RVcmx9LiBVcGRhdGVzIHdpbGwgYmUgaWdub3JlZCB1bnRpbCB5b3UgaW5jcmVhc2UgdGhlIHZlcnNpb24uIFVzaW5nOiAke0pTT04uc3RyaW5naWZ5KGJlc3QpfSwgaWdub3Jpbmc6ICR7SlNPTi5zdHJpbmdpZnkodGhpcy5jb25maWd1cmVkKX1gKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBhY3RpdmUgPSBiZXN0O1xuICAgICAgICAgICAgICAgICAgICBuZWVkc1dyaXRlID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGV0IHNvdXJjZXMgPSBhd2FpdCB0aGlzLmJ1aWxkU291cmNlcyhhY3RpdmUpO1xuICAgICAgICAgICAgaWYgKG5lZWRzV3JpdGUpIHtcbiAgICAgICAgICAgICAgICBsZXQgbWlzc2luZzogc3RyaW5nW10gPSBbXTtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBzb3VyY2Ugb2Ygc291cmNlcykge1xuICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFhd2FpdCBzb3VyY2UuaGFzV3JpdGVBY2Nlc3MoKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pc3NpbmcucHVzaChzb3VyY2UuY29uZmlnLnVybCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1pc3NpbmcucHVzaChgJHtzb3VyY2UuY29uZmlnLnVybH0gKGNoZWNrIGZhaWxlZDogJHsoZSBhcyBFcnJvcikuc3RhY2sgPz8gZX0pYCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKG1pc3NpbmcubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYE5vdCB3cml0aW5nIHRoZSBzdG9yYWdlIHJvdXRpbmcgY29uZmlnIGZvciAke3RoaXMuZ2V0RGVidWdOYW1lKCl9ICh2ZXJzaW9uICR7Z2V0Q29uZmlnVmVyc2lvbih0aGlzLmNvbmZpZ3VyZWQpfSk6IG5vIHdyaXRlIGFjY2VzcyB0byAke21pc3Npbmcuam9pbihcIiwgXCIpfS4gJHtleGlzdGluZyAmJiBgUnVubmluZyBvbiB0aGUgc3RvcmVkIGNvbmZpZyAodmVyc2lvbiAke2dldENvbmZpZ1ZlcnNpb24oZXhpc3RpbmcpfSkgaW5zdGVhZC5gIHx8IGBObyBzdG9yZWQgY29uZmlnIGV4aXN0cywgc28gdGhlIGJ1Y2tldCBjYW5ub3QgYmUgY3JlYXRlZCB1bnRpbCB3cml0ZSBhY2Nlc3MgaXMgZ3JhbnRlZC5gfWApO1xuICAgICAgICAgICAgICAgICAgICBpZiAoZXhpc3RpbmcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFjdGl2ZSA9IGV4aXN0aW5nO1xuICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgc291cmNlIG9mIHNvdXJjZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2UuZGlzcG9zZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlcyA9IGF3YWl0IHRoaXMuYnVpbGRTb3VyY2VzKGFjdGl2ZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHJvdXRpbmdEYXRhID0gc2VyaWFsaXplUmVtb3RlQ29uZmlnKHRoaXMuY29uZmlndXJlZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgcm91dGluZ1dyaXRlVGltZSA9IERhdGUubm93KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgd3JpdHRlblVybHMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IHNvdXJjZSBvZiBzb3VyY2VzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHdyaXR0ZW5VcmxzLmhhcyhzb3VyY2UuY29uZmlnLnVybCkpIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyaXR0ZW5VcmxzLmFkZChzb3VyY2UuY29uZmlnLnVybCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhgU3RvcmFnZSByb3V0aW5nIGNvbmZpZyBmb3IgJHt0aGlzLmdldERlYnVnTmFtZSgpfSBpcyBvdXQgb2YgZGF0ZSAoc3RvcmVkIHZlcnNpb24gJHtleGlzdGluZyAmJiBnZXRDb25maWdWZXJzaW9uKGV4aXN0aW5nKSB8fCBcIm5vbmVcIn0sIG91cnMgJHtnZXRDb25maWdWZXJzaW9uKHRoaXMuY29uZmlndXJlZCl9KTogd3JpdGluZyBvdXJzIHRvIGFsbCAke3dyaXR0ZW5VcmxzLnNpemV9IG5vZGVzICh3cml0ZSB0aW1lICR7bmV3IERhdGUocm91dGluZ1dyaXRlVGltZSkudG9JU09TdHJpbmcoKX0pOiAke1suLi53cml0dGVuVXJsc10uam9pbihcIiwgXCIpfWApO1xuICAgICAgICAgICAgICAgICAgICAgICAgd3JpdHRlblVybHMuY2xlYXIoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IHNvdXJjZSBvZiBzb3VyY2VzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHdyaXR0ZW5VcmxzLmhhcyhzb3VyY2UuY29uZmlnLnVybCkpIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyaXR0ZW5VcmxzLmFkZChzb3VyY2UuY29uZmlnLnVybCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgc291cmNlLndyaXRlKGFyY2hpdmVzID0+IGFyY2hpdmVzLnNldChST1VUSU5HX0ZJTEUsIHJvdXRpbmdEYXRhLCB7IGxhc3RNb2RpZmllZDogcm91dGluZ1dyaXRlVGltZSB9KSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coYFdyb3RlIHN0b3JhZ2Ugcm91dGluZyBjb25maWcgdmVyc2lvbiAke2dldENvbmZpZ1ZlcnNpb24odGhpcy5jb25maWd1cmVkKX0gdG8gJHtzb3VyY2UuY29uZmlnLnVybH1gKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgc291cmNlIG9mIHNvdXJjZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2UuZGlzcG9zZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZvciAobGV0IHNvdXJjZSBvZiBzb3VyY2VzKSB7XG4gICAgICAgICAgICAgICAgbGV0IGZldGNoID0gZmV0Y2hlcy5maW5kKHggPT4geC5yZXNwb25kZWQgJiYgeC5zb3VyY2VDb25maWcudXJsID09PSBzb3VyY2UuY29uZmlnLnVybCk7XG4gICAgICAgICAgICAgICAgaWYgKGZldGNoKSB7XG4gICAgICAgICAgICAgICAgICAgIHNvdXJjZS5zZWVkTGF0ZW5jeShmZXRjaC5sYXRlbmN5KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmFjdGl2ZUNvbmZpZyA9IGFjdGl2ZTtcbiAgICAgICAgICAgIHRoaXMuc3RhcnRDb25maWdQb2xsKCk7XG4gICAgICAgICAgICBsZXQgc3RhdGU6IENoYWluU3RhdGUgPSB7IGNvbmZpZzogYWN0aXZlLCBzb3VyY2VzIH07XG4gICAgICAgICAgICB0aGlzLmxhdGVzdFN0YXRlID0gc3RhdGU7XG4gICAgICAgICAgICByZXR1cm4gc3RhdGU7XG4gICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgICBmb3IgKGxldCBmZXRjaCBvZiBmZXRjaGVzKSB7XG4gICAgICAgICAgICAgICAgZmV0Y2gucHJvYmUuZGlzcG9zZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqIENsaWVudHNpZGUsIGEgY29uZmlnIHdpdGggcHVibGljIHNvdXJjZXMgaXMgc2VydmVkIGVudGlyZWx5IG92ZXIgcGxhaW4gVVJMIGRvd25sb2FkcyAtIG5vIEFQSSBjb25uZWN0aW9uLCBubyBhY2Nlc3MgZ3JhbnQsIGFuZCBubyB3cml0aW5nLiBkaXJlY3RDb25uZWN0IG9wdHMgb3V0IG9mIHRoYXQuICovXG4gICAgcHJpdmF0ZSBpc1JlYWRPbmx5KGNvbmZpZzogUmVtb3RlQ29uZmlnKTogYm9vbGVhbiB7XG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnM/LmRpcmVjdENvbm5lY3QgfHwgaXNOb2RlKCkpIHJldHVybiBmYWxzZTtcbiAgICAgICAgcmV0dXJuIGNvbmZpZy5zb3VyY2VzLm1hcChub3JtYWxpemVTb3VyY2UpLnNvbWUoeCA9PiB4LnB1YmxpYyk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBjcmVhdGVDaGFpblNvdXJjZShzb3VyY2VDb25maWc6IFNvdXJjZUNvbmZpZywgcmVhZE9ubHk6IGJvb2xlYW4pOiBQcm9taXNlPFNvdXJjZVdyYXBwZXI+IHtcbiAgICAgICAgbGV0IHNvdXJjZSA9IGF3YWl0IFNvdXJjZVdyYXBwZXIuY3JlYXRlKHNvdXJjZUNvbmZpZywgeyByZWFkT25seSB9KTtcbiAgICAgICAgc291cmNlLnN0YXJ0UGluZ2luZygpO1xuICAgICAgICByZXR1cm4gc291cmNlO1xuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgYnVpbGRTb3VyY2VzKGNvbmZpZzogUmVtb3RlQ29uZmlnKTogUHJvbWlzZTxTb3VyY2VXcmFwcGVyW10+IHtcbiAgICAgICAgbGV0IHJlYWRPbmx5ID0gdGhpcy5pc1JlYWRPbmx5KGNvbmZpZyk7XG4gICAgICAgIGxldCBzb3VyY2VzOiBTb3VyY2VXcmFwcGVyW10gPSBbXTtcbiAgICAgICAgZm9yIChsZXQgc291cmNlQ29uZmlnIG9mIGNvbmZpZy5zb3VyY2VzLm1hcChub3JtYWxpemVTb3VyY2UpKSB7XG4gICAgICAgICAgICBzb3VyY2VzLnB1c2goYXdhaXQgdGhpcy5jcmVhdGVDaGFpblNvdXJjZShzb3VyY2VDb25maWcsIHJlYWRPbmx5KSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHNvdXJjZXM7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzdGFydENvbmZpZ1BvbGwoKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLnBvbGxUaW1lciB8fCB0aGlzLmRpc3Bvc2VkKSByZXR1cm47XG4gICAgICAgIHRoaXMucG9sbFRpbWVyID0gc2V0SW50ZXJ2YWwoKCkgPT4ge1xuICAgICAgICAgICAgdm9pZCB0aGlzLnJlZnJlc2hBY3RpdmVDb25maWcoKS5jYXRjaCgoZTogRXJyb3IpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGBDaGVja2luZyBmb3IgYSBuZXcgc3RvcmFnZSByb3V0aW5nIGNvbmZpZyBmYWlsZWQgZm9yICR7dGhpcy5nZXREZWJ1Z05hbWUoKX06ICR7ZS5zdGFjayA/PyBlfWApO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0sIENPTkZJR19QT0xMX0lOVEVSVkFMKTtcbiAgICAgICAgKHRoaXMucG9sbFRpbWVyIGFzIHsgdW5yZWY/OiAoKSA9PiB2b2lkIH0pLnVucmVmPy4oKTtcbiAgICB9XG5cbiAgICAvLyBEZWR1cGxpY2F0ZXMgY29uY3VycmVudCByZWZyZXNoZXMgKHRoZSBwb2xsIHRpbWVyIGFuZCB3cm9uZy10YXJnZXQgd3JpdGUgcmV0cmllcyBzaGFyZSB0aGlzKVxuICAgIHByaXZhdGUgY29uZmlnUmVmcmVzaEluRmxpZ2h0OiBQcm9taXNlPHZvaWQ+IHwgdW5kZWZpbmVkO1xuICAgIHByaXZhdGUgcmVmcmVzaEFjdGl2ZUNvbmZpZygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgaWYgKCF0aGlzLmNvbmZpZ1JlZnJlc2hJbkZsaWdodCkge1xuICAgICAgICAgICAgdGhpcy5jb25maWdSZWZyZXNoSW5GbGlnaHQgPSB0aGlzLmNoZWNrRm9yTmV3Q29uZmlnKCkuZmluYWxseSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5jb25maWdSZWZyZXNoSW5GbGlnaHQgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5jb25maWdSZWZyZXNoSW5GbGlnaHQ7XG4gICAgfVxuXG4gICAgLy8gVGhlIGxhdGVzdCBjb25maWcsIGFzIHRoZSBzZXJ2ZXIgSU5URVJQUkVUUyBpdDogZ2V0Q29uZmlnIGNhcnJpZXMgaW4tbWVtb3J5IG92ZXJsYXlzIChkZXBsb3lcbiAgICBwcml2YXRlIGFzeW5jIGZldGNoTGF0ZXN0Q29uZmlnKHN0YXRlOiBDaGFpblN0YXRlKTogUHJvbWlzZTxSZW1vdGVDb25maWcgfCB1bmRlZmluZWQ+IHtcbiAgICAgICAgbGV0IGVycm9yczogc3RyaW5nW10gPSBbXTtcbiAgICAgICAgZm9yIChsZXQgc291cmNlIG9mIHN0YXRlLnNvdXJjZXMpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgbGV0IGxhdGVzdCA9IGF3YWl0IHNvdXJjZS5yZWFkUm91dGluZ0NvbmZpZygpO1xuICAgICAgICAgICAgICAgIGlmIChsYXRlc3QpIHJldHVybiBub3JtYWxpemVSZW1vdGVDb25maWcobGF0ZXN0KTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICBlcnJvcnMucHVzaChgJHtzb3VyY2UuY29uZmlnLnVybH06ICR7KGUgYXMgRXJyb3IpLnN0YWNrID8/IGV9YCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGVycm9ycy5sZW5ndGggPT09IHN0YXRlLnNvdXJjZXMubGVuZ3RoKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE5vIHN0b3JhZ2Ugc291cmNlIGNvdWxkIGdpdmUgdXMgdGhlIHJvdXRpbmcgY29uZmlnIGZvciAke3RoaXMuZ2V0RGVidWdOYW1lKCl9OiAke2Vycm9ycy5qb2luKFwiIHwgXCIpfWApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBjaGVja0Zvck5ld0NvbmZpZygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgaWYgKHRoaXMuZGlzcG9zZWQgfHwgIXRoaXMuc3RhdGVQcm9taXNlKSByZXR1cm47XG4gICAgICAgIGxldCBzdGF0ZTogQ2hhaW5TdGF0ZTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHN0YXRlID0gYXdhaXQgdGhpcy5zdGF0ZVByb21pc2U7XG4gICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGxldCBsYXRlc3QgPSBhd2FpdCB0aGlzLmZldGNoTGF0ZXN0Q29uZmlnKHN0YXRlKTtcbiAgICAgICAgaWYgKCFsYXRlc3QpIHJldHVybjtcbiAgICAgICAgYXdhaXQgdGhpcy5hZG9wdE5ld0NvbmZpZyhzdGF0ZSwgbGF0ZXN0KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIGFkb3B0TmV3Q29uZmlnKHN0YXRlOiBDaGFpblN0YXRlLCBsYXRlc3Q6IFJlbW90ZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBpZiAoSlNPTi5zdHJpbmdpZnkobGF0ZXN0KSA9PT0gSlNPTi5zdHJpbmdpZnkoc3RhdGUuY29uZmlnKSkgcmV0dXJuO1xuICAgICAgICBsZXQgcmVjZWl2ZWQgPSBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCk7XG4gICAgICAgIGxldCBvbmx5SW50ZXJtZWRpYXRlc0NoYW5nZWQgPSBKU09OLnN0cmluZ2lmeShyZXNvbHZlSW50ZXJtZWRpYXRlU291cmNlcyhsYXRlc3QpKSA9PT0gSlNPTi5zdHJpbmdpZnkocmVzb2x2ZUludGVybWVkaWF0ZVNvdXJjZXMoc3RhdGUuY29uZmlnKSk7XG4gICAgICAgIGlmIChvbmx5SW50ZXJtZWRpYXRlc0NoYW5nZWQpIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGBTdG9yYWdlIHJvdXRpbmcgc3dpdGNob3ZlciB3aW5kb3dzIGNoYW5nZWQgKHZlcnNpb24gJHtnZXRDb25maWdWZXJzaW9uKHN0YXRlLmNvbmZpZyl9IC0+ICR7Z2V0Q29uZmlnVmVyc2lvbihsYXRlc3QpfSksIHJlY2VpdmVkICR7cmVjZWl2ZWR9LCByZWJ1aWxkaW5nIHNvdXJjZXMuIE5ldyBjb25maWc6ICR7SlNPTi5zdHJpbmdpZnkobGF0ZXN0KX1gKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGBTdG9yYWdlIHJvdXRpbmcgY29uZmlnIGNoYW5nZWQgKHZlcnNpb24gJHtnZXRDb25maWdWZXJzaW9uKHN0YXRlLmNvbmZpZyl9IC0+ICR7Z2V0Q29uZmlnVmVyc2lvbihsYXRlc3QpfSksIHJlY2VpdmVkICR7cmVjZWl2ZWR9LCByZWJ1aWxkaW5nIHNvdXJjZXMuIE5ldyBjb25maWc6ICR7SlNPTi5zdHJpbmdpZnkobGF0ZXN0KX1gKTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgc3RyaXBwZWRLZXkgPSAoY29uZmlnOiBTb3VyY2VDb25maWcpID0+IEpTT04uc3RyaW5naWZ5KHsgLi4uY29uZmlnLCB2YWxpZFdpbmRvdzogdW5kZWZpbmVkIH0pO1xuICAgICAgICBsZXQgb2xkQnlDb25maWcgPSBuZXcgTWFwPHN0cmluZywgU291cmNlV3JhcHBlcltdPigpO1xuICAgICAgICBmb3IgKGxldCBzb3VyY2Ugb2Ygc3RhdGUuc291cmNlcykge1xuICAgICAgICAgICAgbGV0IGtleSA9IHN0cmlwcGVkS2V5KHNvdXJjZS5jb25maWcpO1xuICAgICAgICAgICAgbGV0IGxpc3QgPSBvbGRCeUNvbmZpZy5nZXQoa2V5KTtcbiAgICAgICAgICAgIGlmICghbGlzdCkge1xuICAgICAgICAgICAgICAgIGxpc3QgPSBbXTtcbiAgICAgICAgICAgICAgICBvbGRCeUNvbmZpZy5zZXQoa2V5LCBsaXN0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxpc3QucHVzaChzb3VyY2UpO1xuICAgICAgICB9XG4gICAgICAgIGxldCByZWFkT25seSA9IHRoaXMuaXNSZWFkT25seShsYXRlc3QpO1xuICAgICAgICBsZXQgc291cmNlczogU291cmNlV3JhcHBlcltdID0gW107XG4gICAgICAgIGZvciAobGV0IHNvdXJjZUNvbmZpZyBvZiBsYXRlc3Quc291cmNlcy5tYXAobm9ybWFsaXplU291cmNlKSkge1xuICAgICAgICAgICAgbGV0IG9sZCA9IG9sZEJ5Q29uZmlnLmdldChzdHJpcHBlZEtleShzb3VyY2VDb25maWcpKT8uc2hpZnQoKTtcbiAgICAgICAgICAgIGlmIChvbGQpIHtcbiAgICAgICAgICAgICAgICBvbGQudXBkYXRlVmFsaWRXaW5kb3coc291cmNlQ29uZmlnLnZhbGlkV2luZG93KTtcbiAgICAgICAgICAgICAgICBzb3VyY2VzLnB1c2gob2xkKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgc291cmNlcy5wdXNoKGF3YWl0IHRoaXMuY3JlYXRlQ2hhaW5Tb3VyY2Uoc291cmNlQ29uZmlnLCByZWFkT25seSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGZvciAobGV0IGxlZnRvdmVycyBvZiBvbGRCeUNvbmZpZy52YWx1ZXMoKSkge1xuICAgICAgICAgICAgZm9yIChsZXQgbGVmdG92ZXIgb2YgbGVmdG92ZXJzKSB7XG4gICAgICAgICAgICAgICAgbGVmdG92ZXIuZGlzcG9zZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMuYWN0aXZlQ29uZmlnID0gbGF0ZXN0O1xuICAgICAgICBsZXQgbmV3U3RhdGU6IENoYWluU3RhdGUgPSB7IGNvbmZpZzogbGF0ZXN0LCBzb3VyY2VzIH07XG4gICAgICAgIHRoaXMubGF0ZXN0U3RhdGUgPSBuZXdTdGF0ZTtcbiAgICAgICAgdGhpcy5zdGF0ZVByb21pc2UgPSBQcm9taXNlLnJlc29sdmUobmV3U3RhdGUpO1xuICAgIH1cblxuICAgIHByaXZhdGUgbGFzdEF2YWlsYWJpbGl0eVJlY2hlY2sgPSAwO1xuICAgIHByaXZhdGUgYXZhaWxhYmlsaXR5UmVjaGVja0luRmxpZ2h0OiBQcm9taXNlPHZvaWQ+IHwgdW5kZWZpbmVkO1xuICAgIHByaXZhdGUgcmVjaGVja0F2YWlsYWJpbGl0eSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgaWYgKHRoaXMuYXZhaWxhYmlsaXR5UmVjaGVja0luRmxpZ2h0KSByZXR1cm4gdGhpcy5hdmFpbGFiaWxpdHlSZWNoZWNrSW5GbGlnaHQ7XG4gICAgICAgIGlmIChEYXRlLm5vdygpIC0gdGhpcy5sYXN0QXZhaWxhYmlsaXR5UmVjaGVjayA8IEFWQUlMQUJJTElUWV9SRUNIRUNLX1RIUk9UVExFKSByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG4gICAgICAgIHRoaXMubGFzdEF2YWlsYWJpbGl0eVJlY2hlY2sgPSBEYXRlLm5vdygpO1xuICAgICAgICB0aGlzLmF2YWlsYWJpbGl0eVJlY2hlY2tJbkZsaWdodCA9IHRoaXMucmVjaGVja0F2YWlsYWJpbGl0eU5vdygpLmZpbmFsbHkoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5hdmFpbGFiaWxpdHlSZWNoZWNrSW5GbGlnaHQgPSB1bmRlZmluZWQ7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gdGhpcy5hdmFpbGFiaWxpdHlSZWNoZWNrSW5GbGlnaHQ7XG4gICAgfVxuICAgIHByaXZhdGUgYXN5bmMgcmVjaGVja0F2YWlsYWJpbGl0eU5vdygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgaWYgKHRoaXMuZGlzcG9zZWQgfHwgIXRoaXMuc3RhdGVQcm9taXNlKSByZXR1cm47XG4gICAgICAgIGxldCBzdGF0ZTogQ2hhaW5TdGF0ZTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHN0YXRlID0gYXdhaXQgdGhpcy5zdGF0ZVByb21pc2U7XG4gICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnNvbGUubG9nKGBFdmVyeSBzdG9yYWdlIHNvdXJjZSBmYWlsZWQgZm9yICR7dGhpcy5nZXREZWJ1Z05hbWUoKX07IHJlLWNvbnRhY3RpbmcgYWxsICR7c3RhdGUuc291cmNlcy5sZW5ndGh9IHNvdXJjZXMgKHJvdXRpbmcgcmUtcmVhZCArIGNvbm5lY3Rpb24gcmUtYXR0ZW1wdClgKTtcbiAgICAgICAgbGV0IHJlc3VsdHMgPSBhd2FpdCBQcm9taXNlLmFsbChzdGF0ZS5zb3VyY2VzLm1hcChhc3luYyBzb3VyY2UgPT4ge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgc291cmNlLnJlYWRSb3V0aW5nQ29uZmlnKCk7XG4gICAgICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KSk7XG4gICAgICAgIGxldCBsYXRlc3QgPSByZXN1bHRzLmZpbmQoeCA9PiB4KTtcbiAgICAgICAgaWYgKCFsYXRlc3QpIHJldHVybjtcbiAgICAgICAgYXdhaXQgdGhpcy5hZG9wdE5ld0NvbmZpZyhzdGF0ZSwgbGF0ZXN0KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIHJ1bjxUPihzdGF0ZTogQ2hhaW5TdGF0ZSwgY29uZmlnOiB7IGFwaU9ubHk/OiBib29sZWFuOyB3cml0ZT86IGJvb2xlYW47IHJvdXRlPzogbnVtYmVyOyBub0ZhbGxiYWNrcz86IGJvb2xlYW47IGZhc3Q/OiBib29sZWFuOyB0aW1lb3V0PzogU21hcnRUaW1lb3V0IH0sIHJ1bjogKGFyY2hpdmVzOiBJQXJjaGl2ZXMsIHNvdXJjZVVybDogc3RyaW5nKSA9PiBQcm9taXNlPFQ+KTogUHJvbWlzZTxUPiB7XG4gICAgICAgIGlmIChjb25maWcuZmFzdCAmJiBjb25maWcubm9GYWxsYmFja3MpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgZmFzdCBhbmQgbm9GYWxsYmFja3MgYXJlIG11dHVhbGx5IGV4Y2x1c2l2ZSBmb3IgJHt0aGlzLmdldERlYnVnTmFtZSgpfTogbm9GYWxsYmFja3Mgb25seSBjb25zaWRlcnMgb25lIHNvdXJjZSAodGhlIHdyaXRlIG5vZGUpLCBzbyB0aGVyZSBpcyBubyBvcmRlciB0byBzcGVlZCB1cGApO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjb25maWcud3JpdGUgfHwgY29uZmlnLm5vRmFsbGJhY2tzKSB7XG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5ydW5QcmltYXJ5KGNvbmZpZywgcnVuKTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgcmVjaGVja2VkQXZhaWxhYmlsaXR5ID0gZmFsc2U7XG4gICAgICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICAgICAgICBsZXQgZXJyb3JzOiBzdHJpbmdbXSA9IFtdO1xuICAgICAgICAgICAgbGV0IGNhbmRpZGF0ZXMgPSBzdGF0ZS5zb3VyY2VzLmZpbHRlcihzb3VyY2UgPT5cbiAgICAgICAgICAgICAgICAoY29uZmlnLnJvdXRlID09PSB1bmRlZmluZWQgfHwgcm91dGVDb250YWlucyhzb3VyY2UuY29uZmlnLnJvdXRlLCBjb25maWcucm91dGUpKVxuICAgICAgICAgICAgICAgICYmIGNvbmZpZ1dpbmRvd0N1cnJlbnQoc291cmNlLmNvbmZpZylcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBsZXQgb3JkZXJlZCA9IHByZWZlclVzYWJsZShjYW5kaWRhdGVzKTtcbiAgICAgICAgICAgIGlmIChjb25maWcuZmFzdCkge1xuICAgICAgICAgICAgICAgIG9yZGVyZWQgPSBbLi4ub3JkZXJlZF07XG4gICAgICAgICAgICAgICAgc29ydChvcmRlcmVkLCB4ID0+IHguZ2V0TGF0ZW5jeSgpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZvciAobGV0IHNvdXJjZSBvZiBvcmRlcmVkKSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNvbmZpZy5hcGlPbmx5KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgYXBpID0gc291cmNlLmFwaTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghYXBpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JzLnB1c2goYCR7c291cmNlLmNvbmZpZy51cmx9IGhhcyBVUkwtb25seSBhY2Nlc3MsIHdoaWNoIGNhbm5vdCBzZXJ2ZSB0aGlzIG9wZXJhdGlvbmApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHJ1bihhcGksIHNvdXJjZS5jb25maWcudXJsKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5hcHBseVNtYXJ0VGltZW91dChjb25maWcudGltZW91dCwgc291cmNlLCAoKSA9PiBzb3VyY2UucmVhZChhcmNoaXZlcyA9PiBydW4oYXJjaGl2ZXMsIHNvdXJjZS5jb25maWcudXJsKSkpO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IG1lc3NhZ2UgPSBTdHJpbmcoKGUgYXMgRXJyb3IpLnN0YWNrID8/IGUpO1xuICAgICAgICAgICAgICAgICAgICBpZiAobWVzc2FnZS5pbmNsdWRlcyhTTUFSVF9USU1FT1VUX01BUktFUikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYFNvdXJjZSB0aW1lZCBvdXQgZm9yICR7dGhpcy5nZXREZWJ1Z05hbWUoKX0sIGNvbnRpbnVpbmcgd2l0aCB0aGUgbmV4dCBzb3VyY2U6ICR7bWVzc2FnZX1gKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVycm9ycy5wdXNoKG1lc3NhZ2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKHNvdXJjZS5pc0Nvbm5lY3RlZCgpKSB0aHJvdyBlO1xuICAgICAgICAgICAgICAgICAgICBzb3VyY2Uubm90ZUZhaWx1cmUoKTtcbiAgICAgICAgICAgICAgICAgICAgZXJyb3JzLnB1c2gobWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCFyZWNoZWNrZWRBdmFpbGFiaWxpdHkpIHtcbiAgICAgICAgICAgICAgICByZWNoZWNrZWRBdmFpbGFiaWxpdHkgPSB0cnVlO1xuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMucmVjaGVja0F2YWlsYWJpbGl0eSgpO1xuICAgICAgICAgICAgICAgIHN0YXRlID0gYXdhaXQgdGhpcy5nZXRTdGF0ZSgpO1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBBbGwgc291cmNlcyBmYWlsZWQgZm9yICR7dGhpcy5nZXREZWJ1Z05hbWUoKX0ke2NvbmZpZy5yb3V0ZSAhPT0gdW5kZWZpbmVkICYmIGAgKHJvdXRlICR7Y29uZmlnLnJvdXRlfSlgIHx8IFwiXCJ9OiAke2Vycm9ycy5qb2luKFwiIHwgXCIpIHx8IFwibm8gc291cmNlcyBhdmFpbGFibGVcIn1gKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIFdyaXRlcyBhbmQgbm9GYWxsYmFja3MgcmVhZHMgYXJlIHRoZSBzYW1lIGNhc2U6IHRha2UgdGhlIGF1dGhvcml0YXRpdmUgbm9kZSAtIHN0cmljdGx5IHRoZSBmaXJzdCBzb3VyY2UgbWF0Y2hpbmcgdGhlIHJvdXRlIGFuZCB2YWxpZCB3aW5kb3csIHdoZXRoZXIgaXQgaXMgdXAgb3IgZG93biAtIGFuZCB1c2UgaXQsIG5ldmVyIGZhbGxpbmcgYmFjayB0byBhbm90aGVyIG5vZGUuIEl0J3MgaW1wb3J0YW50IHRoYXQgd3JpdGluZyBhbHdheXMgYWNjZXNzZXMgdGhlIHNhbWUgbm9kZSBldmVyeXdoZXJlLCBldmVuIGlmIHRoYXQgbm9kZSBpcyBkb3duIC0gb3RoZXJ3aXNlIHdlJ3JlIGp1c3Qgd3JpdGluZyBpbnRvIHRoZSB2b2lkLCBhbmQgd2hvIGtub3dzIGlmIHRoZSB3cml0ZXMgd2lsbCBldmVuIGJlIGFjY2VwdGVkLCBvciBjbG9iYmVyZWQsIG9yIHdoYXQ7IGFuZCBub0ZhbGxiYWNrcyByZWFkcyB3YW50IHRoZSBzYW1lIG5vZGUgcHJlY2lzZWx5IGJlY2F1c2UgaXQgaXMgdGhlIG9uZSB3cml0ZXMgdGFyZ2V0LiBBIHNsb3cgY2FsbCBpcyBhbG1vc3QgYWx3YXlzIGJldHRlciB0aGFuIHRocm93aW5nLCBzbyBhIGZhaWxpbmcgcHJpbWFyeSBpcyByZXRyaWVkICh0aGUgU0FNRSBub2RlLCByZS1yZXNvbHZlZCBlYWNoIGF0dGVtcHQgc2luY2UgYSBjb25maWcgcmVmcmVzaCBjYW4gY2hhbmdlIHdoaWNoIHNvdXJjZSBpcyBwcmltYXJ5KSB1bnRpbCB0aGUgZGVhZGxpbmUsIHRoZW4gdGhyb3dzLlxuICAgIHByaXZhdGUgYXN5bmMgcnVuUHJpbWFyeTxUPihjb25maWc6IHsgd3JpdGU/OiBib29sZWFuOyByb3V0ZT86IG51bWJlcjsgdGltZW91dD86IFNtYXJ0VGltZW91dCB9LCBydW46IChhcmNoaXZlczogSUFyY2hpdmVzLCBzb3VyY2VVcmw6IHN0cmluZykgPT4gUHJvbWlzZTxUPik6IFByb21pc2U8VD4ge1xuICAgICAgICBsZXQgcmV0cmllZFdyb25nV2luZG93ID0gZmFsc2U7XG4gICAgICAgIGxldCByZXRyaWVkV3JvbmdSb3V0ZSA9IGZhbHNlO1xuICAgICAgICBsZXQgZGVhZGxpbmUgPSBEYXRlLm5vdygpICsgUFJJTUFSWV9SRVRSWV9USU1FT1VUO1xuICAgICAgICBsZXQgYXR0ZW1wdCA9IDA7XG4gICAgICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICAgICAgICBhdHRlbXB0Kys7XG4gICAgICAgICAgICBsZXQgYXR0ZW1wdFN0YXJ0ID0gRGF0ZS5ub3coKTtcbiAgICAgICAgICAgIGxldCBzdGF0ZSA9IGF3YWl0IHRoaXMuZ2V0U3RhdGUoKTtcbiAgICAgICAgICAgIGxldCB0YXJnZXQgPSBzdGF0ZS5zb3VyY2VzLmZpbmQoeCA9PiBjb25maWdBY2NlcHRzV3JpdGVzKHguY29uZmlnKSAmJiAoY29uZmlnLnJvdXRlID09PSB1bmRlZmluZWQgfHwgcm91dGVDb250YWlucyh4LmNvbmZpZy5yb3V0ZSwgY29uZmlnLnJvdXRlKSkpO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBpZiAoIXRhcmdldCkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE5vIHNvdXJjZSBpcyB0aGUgJHtjb25maWcud3JpdGUgJiYgXCJ3cml0ZSB0YXJnZXRcIiB8fCBcInByaW1hcnkgcmVhZCBzb3VyY2VcIn0gZm9yICR7dGhpcy5nZXREZWJ1Z05hbWUoKX0ke2NvbmZpZy5yb3V0ZSAhPT0gdW5kZWZpbmVkICYmIGAgKHJvdXRlICR7Y29uZmlnLnJvdXRlfSlgIHx8IFwiXCJ9IChldmVyeSBzb3VyY2UgaXMgb3V0c2lkZSBpdHMgdmFsaWQgd2luZG93IG9yIG91dHNpZGUgdGhlIGtleSdzIHJvdXRlKWApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zdCBwcmltYXJ5ID0gdGFyZ2V0O1xuICAgICAgICAgICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmFwcGx5U21hcnRUaW1lb3V0KGNvbmZpZy50aW1lb3V0LCBwcmltYXJ5LCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChjb25maWcud3JpdGUpIHJldHVybiBwcmltYXJ5LndyaXRlKGFyY2hpdmVzID0+IHJ1bihhcmNoaXZlcywgcHJpbWFyeS5jb25maWcudXJsKSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBwcmltYXJ5LnJlYWQoYXJjaGl2ZXMgPT4gcnVuKGFyY2hpdmVzLCBwcmltYXJ5LmNvbmZpZy51cmwpKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICBsZXQgbWVzc2FnZSA9IFN0cmluZygoZSBhcyBFcnJvcikuc3RhY2sgPz8gZSk7XG4gICAgICAgICAgICAgICAgaWYgKG1lc3NhZ2UuaW5jbHVkZXMoU1RPUkFHRV9XUk9OR19WQUxJRF9XSU5ET1cpICYmICFyZXRyaWVkV3JvbmdXaW5kb3cpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0cmllZFdyb25nV2luZG93ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5wcmVwYXJlV3JvbmdUYXJnZXRSZXRyeShzdGF0ZSwgXCJ3aW5kb3dcIik7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAobWVzc2FnZS5pbmNsdWRlcyhTVE9SQUdFX1dST05HX1JPVVRFKSAmJiAhcmV0cmllZFdyb25nUm91dGUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0cmllZFdyb25nUm91dGUgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnByZXBhcmVXcm9uZ1RhcmdldFJldHJ5KHN0YXRlLCBcInJvdXRlXCIpO1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHRhcmdldCAmJiAhdGFyZ2V0LmlzQ29ubmVjdGVkKCkpIHRhcmdldC5ub3RlRmFpbHVyZSgpO1xuICAgICAgICAgICAgICAgIGlmICghY29uZmlnLndyaXRlICYmIHRhcmdldCAmJiAoYXR0ZW1wdCA9PT0gMSB8fCBhdHRlbXB0ICUgMyA9PT0gMCkpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gVGhlIHJlYXNvbiB3ZSB0cnkgdGhlIEhUVFAgcmVxdWVzdDogaHR0cHNSZXF1ZXN0IGhhcyBiZXR0ZXIgRE5TIHJldHJ5aW5nIGNhcGFiaWxpdGllcyB0aGFuIG91ciBXZWJTb2NrZXQgc2VydmVyICh3ZSBoYXZlIG1vcmUgY29udHJvbCBvdmVyIGl0KSwgc28ganVzdCB1c2luZyBpdCBjYW4gZml4IHNvbWUgRE5TIGlzc3Vlcywgd2hpY2ggY2FuIHByb3BhZ2F0ZSB0byBmaXggdGhlIFdlYlNvY2tldCBjb25uZWN0aW9uLiBJdCBpcyBzdGlsbCB0aGUgcHJpbWFyeSBzb3VyY2UncyBvd24gZGF0YSwgc28gdGhlIG5vLWZhbGxiYWNrIHNlbWFudGljcyBob2xkIC0gYW5kIEFyY2hpdmVzVXJsIGhhcyBubyBzZXR1cCBjb3N0LCBzbyBtYWtpbmcgb25lIG9uIHRoZSBzcG90IGlzIGZpbmUuXG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgcnVuKHRhcmdldC51cmwgfHwgbmV3IEFyY2hpdmVzVXJsKGdldEJ1Y2tldEJhc2VVcmwodGFyZ2V0LmNvbmZpZy51cmwpKSwgdGFyZ2V0LmNvbmZpZy51cmwpO1xuICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEJlc3QtZWZmb3J0OiB0aGUgcHJpbWFyeSdzIGVycm9yICh0aHJvd24gYXQgdGhlIGRlYWRsaW5lKSBpcyB0aGUgcmVhbCBvbmVcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoRGF0ZS5ub3coKSA+PSBkZWFkbGluZSkgdGhyb3cgZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIEF0IG1vc3Qgb25lIGF0dGVtcHQgcGVyIGludGVydmFsLCBpbiBjYXNlIHRoZSBmYWlsdXJlIGlzIGZhc3RcbiAgICAgICAgICAgIGF3YWl0IGRlbGF5KE1hdGgubWF4KDAsIGF0dGVtcHRTdGFydCArIFBSSU1BUllfUkVUUllfREVMQVkgLSBEYXRlLm5vdygpKSk7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLnJlY2hlY2tBdmFpbGFiaWxpdHkoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKiBSYWNlcyBjYWxsIGFnYWluc3QgYSBzaXplLWJhc2VkIGRlYWRsaW5lLiBVcGxvYWRzIGtub3cgdGhlaXIgc2l6ZSB1cGZyb250OyBnZXRzIGFyZSBnaXZlbiBTTUFSVF9USU1FT1VUX1BST0JFIHRvIHByb2R1Y2UgYW55dGhpbmcsIGFuZCBvbmx5IHRoZW4gaXMgdGhlIGZpbGUncyBpbmZvIGZldGNoZWQgKGZyb20gdGhlIHNhbWUgc291cmNlLCBpdHNlbGYgdGltZS1saW1pdGVkKSB0byBzaXplIHRoZSBkZWFkbGluZSAtIG1lYXN1cmVkIGZyb20gdGhlIGNhbGwncyBzdGFydCwgc28gYSBzb3VyY2UgdGhhdCB3YXMgc2xvdyBiZWZvcmUgdGhlIHByb2JlIGRvZXNuJ3QgZ2V0IHRoZSBmdWxsIGFsbG93YW5jZSBhZ2Fpbi4gVGltZWQtb3V0IGNhbGxzIGtlZXAgcnVubmluZyBpbiB0aGUgYmFja2dyb3VuZCAodGhleSBjYW5ub3QgYmUgY2FuY2VsbGVkKSBidXQgdGhlaXIgZXZlbnR1YWwgcmVzdWx0IGlzIGlnbm9yZWQuICovXG4gICAgcHJpdmF0ZSBhc3luYyBhcHBseVNtYXJ0VGltZW91dDxUPih0aW1lb3V0OiBTbWFydFRpbWVvdXQgfCB1bmRlZmluZWQsIHNvdXJjZTogU291cmNlV3JhcHBlciwgY2FsbDogKCkgPT4gUHJvbWlzZTxUPik6IFByb21pc2U8VD4ge1xuICAgICAgICBpZiAoIXRpbWVvdXQpIHJldHVybiBhd2FpdCBjYWxsKCk7XG4gICAgICAgIGxldCBzdGFydCA9IERhdGUubm93KCk7XG4gICAgICAgIGxldCBjYWxsUHJvbWlzZSA9IGNhbGwoKTtcbiAgICAgICAgLy8gQW4gYWJhbmRvbmVkIGNhbGwgbXVzdCBub3Qgc3VyZmFjZSBhbiB1bmhhbmRsZWQgcmVqZWN0aW9uIHdoZW4gaXQgZXZlbnR1YWxseSBmYWlsc1xuICAgICAgICBsZXQgYWJhbmRvbiA9ICgpID0+IHZvaWQgY2FsbFByb21pc2UudGhlbigoKSA9PiB7IH0sICgpID0+IHsgfSk7XG4gICAgICAgIGlmICh0aW1lb3V0LnVwbG9hZEJ5dGVzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIC8vIEEgZmxhdCBiYXNlIHBsdXMgdGhlIHByZWRpY3RlZCB0cmFuc2ZlciB0aW1lLCBzbyB0aW55IHVwbG9hZHMgc3RpbGwgZ2V0IHRoZSBmdWxsIGJhc2Ugd2luZG93XG4gICAgICAgICAgICBsZXQgYWxsb3dlZCA9IFNNQVJUX1RJTUVPVVRfUFJPQkUgKyB0aW1lb3V0LnVwbG9hZEJ5dGVzIC8gU01BUlRfVElNRU9VVF9VUExPQURfQllURVNfUEVSX1NFQ09ORCAqIDEwMDA7XG4gICAgICAgICAgICBsZXQgcmVzdWx0ID0gYXdhaXQgUHJvbWlzZS5yYWNlKFtjYWxsUHJvbWlzZS50aGVuKHZhbHVlID0+ICh7IHZhbHVlIH0pKSwgZGVsYXkoYWxsb3dlZCkudGhlbigoKSA9PiB1bmRlZmluZWQpXSk7XG4gICAgICAgICAgICBpZiAocmVzdWx0KSByZXR1cm4gcmVzdWx0LnZhbHVlO1xuICAgICAgICAgICAgYWJhbmRvbigpO1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAke1NNQVJUX1RJTUVPVVRfTUFSS0VSfSAke3RpbWVvdXQubGFiZWwgfHwgYFVwbG9hZCBvZiAke3RpbWVvdXQudXBsb2FkQnl0ZXN9IGJ5dGVzYH0gdG8gJHtzb3VyY2UuZ2V0RGVidWdOYW1lKCl9IHRpbWVkIG91dCBhZnRlciAke0RhdGUubm93KCkgLSBzdGFydH1tcyAoYWxsb3dlZCAke01hdGgucm91bmQoYWxsb3dlZCl9bXM6ICR7U01BUlRfVElNRU9VVF9QUk9CRX1tcyBiYXNlIHBsdXMgdHJhbnNmZXIgYXQgYW4gYXNzdW1lZCAke1NNQVJUX1RJTUVPVVRfVVBMT0FEX0JZVEVTX1BFUl9TRUNPTkR9IGJ5dGVzL3MpYCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcGF0aCA9IHRpbWVvdXQucGF0aDtcbiAgICAgICAgaWYgKHBhdGggPT09IHVuZGVmaW5lZCkgcmV0dXJuIGF3YWl0IGNhbGxQcm9taXNlO1xuICAgICAgICBsZXQgZmlyc3QgPSBhd2FpdCBQcm9taXNlLnJhY2UoW2NhbGxQcm9taXNlLnRoZW4odmFsdWUgPT4gKHsgdmFsdWUgfSkpLCBkZWxheShTTUFSVF9USU1FT1VUX1BST0JFKS50aGVuKCgpID0+IHVuZGVmaW5lZCldKTtcbiAgICAgICAgaWYgKGZpcnN0KSByZXR1cm4gZmlyc3QudmFsdWU7XG4gICAgICAgIGxldCBwcm9iZUVycm9yOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgICAgIGxldCBpbmZvOiB7IHNpemU6IG51bWJlciB9IHwgdW5kZWZpbmVkO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgaW5mbyA9IGF3YWl0IFByb21pc2UucmFjZShbXG4gICAgICAgICAgICAgICAgc291cmNlLnJlYWQoYXJjaGl2ZXMgPT4gYXJjaGl2ZXMuZ2V0SW5mbyhwYXRoKSkudGhlbih4ID0+ICh7IHNpemU6IHggJiYgeC5zaXplIHx8IDAgfSkpLFxuICAgICAgICAgICAgICAgIGRlbGF5KFNNQVJUX1RJTUVPVVRfUFJPQkUpLnRoZW4oKCkgPT4gdW5kZWZpbmVkKSxcbiAgICAgICAgICAgIF0pO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICBwcm9iZUVycm9yID0gU3RyaW5nKChlIGFzIEVycm9yKS5zdGFjayA/PyBlKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWluZm8pIHtcbiAgICAgICAgICAgIGFiYW5kb24oKTtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgJHtTTUFSVF9USU1FT1VUX01BUktFUn0gUmVhZCBvZiAke0pTT04uc3RyaW5naWZ5KHBhdGgpfSBmcm9tICR7c291cmNlLmdldERlYnVnTmFtZSgpfSB0aW1lZCBvdXQ6IG5vIHJlc3VsdCBhZnRlciAke0RhdGUubm93KCkgLSBzdGFydH1tcywgYW5kIGdldEluZm8gJHtwcm9iZUVycm9yICYmIGBmYWlsZWQgKCR7cHJvYmVFcnJvcn0pYCB8fCBgY291bGQgbm90IGFuc3dlciB3aXRoaW4gJHtTTUFSVF9USU1FT1VUX1BST0JFfW1zIGVpdGhlcmB9YCk7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGFsbG93ZWQgPSBNYXRoLm1heChTTUFSVF9USU1FT1VUX1BST0JFLCBpbmZvLnNpemUgLyBTTUFSVF9USU1FT1VUX0RPV05MT0FEX0JZVEVTX1BFUl9TRUNPTkQgKiAxMDAwKTtcbiAgICAgICAgbGV0IHJlbWFpbmluZyA9IHN0YXJ0ICsgYWxsb3dlZCAtIERhdGUubm93KCk7XG4gICAgICAgIGlmIChyZW1haW5pbmcgPiAwKSB7XG4gICAgICAgICAgICBsZXQgc2Vjb25kID0gYXdhaXQgUHJvbWlzZS5yYWNlKFtjYWxsUHJvbWlzZS50aGVuKHZhbHVlID0+ICh7IHZhbHVlIH0pKSwgZGVsYXkocmVtYWluaW5nKS50aGVuKCgpID0+IHVuZGVmaW5lZCldKTtcbiAgICAgICAgICAgIGlmIChzZWNvbmQpIHJldHVybiBzZWNvbmQudmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgYWJhbmRvbigpO1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7U01BUlRfVElNRU9VVF9NQVJLRVJ9IFJlYWQgb2YgJHtKU09OLnN0cmluZ2lmeShwYXRoKX0gKCR7aW5mby5zaXplfSBieXRlcykgZnJvbSAke3NvdXJjZS5nZXREZWJ1Z05hbWUoKX0gdGltZWQgb3V0IGFmdGVyICR7RGF0ZS5ub3coKSAtIHN0YXJ0fW1zIChhbGxvd2VkICR7TWF0aC5yb3VuZChhbGxvd2VkKX1tcyBmcm9tIHRoZSBjYWxsJ3Mgc3RhcnQsIGF0IGFuIGFzc3VtZWQgJHtTTUFSVF9USU1FT1VUX0RPV05MT0FEX0JZVEVTX1BFUl9TRUNPTkR9IGJ5dGVzL3MpYCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBsYXN0Q29uZmlnUmVmcmVzaCA9IDA7XG4gICAgcHJpdmF0ZSBhc3luYyBwcmVwYXJlV3JvbmdUYXJnZXRSZXRyeShzdGF0ZTogQ2hhaW5TdGF0ZSwga2luZDogXCJ3aW5kb3dcIiB8IFwicm91dGVcIik6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBpZiAoa2luZCA9PT0gXCJ3aW5kb3dcIikge1xuICAgICAgICAgICAgbGV0IG5vdyA9IERhdGUubm93KCk7XG4gICAgICAgICAgICBsZXQgbmVhckJvdW5kYXJ5ID0gc3RhdGUuc291cmNlcy5zb21lKHNvdXJjZSA9PiBzb3VyY2UuY29uZmlnLnZhbGlkV2luZG93LnNvbWUodCA9PiB0ID4gMCAmJiB0IDwgTnVtYmVyLk1BWF9TQUZFX0lOVEVHRVIgJiYgTWF0aC5hYnModCAtIG5vdykgPD0gV1JPTkdfVEFSR0VUX0JPVU5EQVJZX1dJTkRPVykpO1xuICAgICAgICAgICAgaWYgKG5lYXJCb3VuZGFyeSkge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGBXcml0ZSByZWplY3RlZCBieSAke3RoaXMuZ2V0RGVidWdOYW1lKCl9OiByYWNlZCBhIHZhbGlkIHdpbmRvdyBib3VuZGFyeTsgd2FpdGluZyAke1dST05HX1RBUkdFVF9CT1VOREFSWV9SRVRSWV9ERUxBWSAvIDEwMDB9cyBhbmQgcmV0cnlpbmdgKTtcbiAgICAgICAgICAgICAgICBhd2FpdCBkZWxheShXUk9OR19UQVJHRVRfQk9VTkRBUllfUkVUUllfREVMQVkpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoRGF0ZS5ub3coKSAtIHRoaXMubGFzdENvbmZpZ1JlZnJlc2ggPCBDT05GSUdfUkVGUkVTSF9USFJPVFRMRSkgcmV0dXJuO1xuICAgICAgICB0aGlzLmxhc3RDb25maWdSZWZyZXNoID0gRGF0ZS5ub3coKTtcbiAgICAgICAgY29uc29sZS5sb2coYFdyaXRlIHJlamVjdGVkIGJ5ICR7dGhpcy5nZXREZWJ1Z05hbWUoKX0gKHdyb25nICR7a2luZH0pOiBvdXIgY29uZmlnIGlzIHN0YWxlIChsaWtlbHkgYSBkZXBsb3kgc3dpdGNob3Zlcik7IHJlZnJlc2hpbmcgaXQgYW5kIHJldHJ5aW5nYCk7XG4gICAgICAgIGF3YWl0IHRoaXMucmVmcmVzaEFjdGl2ZUNvbmZpZygpO1xuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgcmVxdWVzdDxUPihjb25maWc6IHsgYXBpT25seT86IGJvb2xlYW47IHdyaXRlPzogYm9vbGVhbjsgcm91dGU/OiBudW1iZXI7IG5vRmFsbGJhY2tzPzogYm9vbGVhbjsgZmFzdD86IGJvb2xlYW47IHRpbWVvdXQ/OiBTbWFydFRpbWVvdXQgfSwgcnVuOiAoYXJjaGl2ZXM6IElBcmNoaXZlcywgc291cmNlVXJsOiBzdHJpbmcpID0+IFByb21pc2U8VD4pOiBQcm9taXNlPFQ+IHtcbiAgICAgICAgbGV0IHN0YXRlID0gYXdhaXQgdGhpcy5nZXRTdGF0ZSgpO1xuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5ydW4oc3RhdGUsIGNvbmZpZywgcnVuKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgd2FpdGluZ0ZvckFjY2VzcygpOiBQcm9taXNlPHsgbGluazogc3RyaW5nOyBtYWNoaW5lSWQ6IHN0cmluZzsgaXA6IHN0cmluZyB9IHwgdW5kZWZpbmVkPiB7XG4gICAgICAgIGxldCBzdGF0ZSA9IGF3YWl0IHRoaXMuZ2V0U3RhdGUoKTtcbiAgICAgICAgZm9yIChsZXQgc291cmNlIG9mIHN0YXRlLnNvdXJjZXMpIHtcbiAgICAgICAgICAgIC8vIEEgc291cmNlIHdob3NlIHdpbmRvdyBoYXMgcGFzc2VkIGlzIG5ldmVyIHJlYWQgb3Igd3JpdHRlbiBhZ2Fpbiwgc28gaXRzIGFjY2VzcyBzdGF0ZSBpcyBpcnJlbGV2YW50IC0gYW5kIGFza2luZyBhIGRlYWQgaW50ZXJtZWRpYXRlIHdvdWxkIGp1c3QgaGFuZyBvciB0aHJvdy4gRnV0dXJlIHdpbmRvd3MgRE8gbWF0dGVyOiBhY2Nlc3Mgc2hvdWxkIGJlIGdyYW50ZWQgYmVmb3JlIHRoZWlyIHdpbmRvdyBzdGFydHMuXG4gICAgICAgICAgICBpZiAoc291cmNlLmNvbmZpZy52YWxpZFdpbmRvd1sxXSA8PSBEYXRlLm5vdygpKSBjb250aW51ZTtcbiAgICAgICAgICAgIGlmIChzb3VyY2UuYXBpIGluc3RhbmNlb2YgQXJjaGl2ZXNSZW1vdGUpIHtcbiAgICAgICAgICAgICAgICBsZXQgd2FpdGluZyA9IGF3YWl0IHNvdXJjZS5hcGkud2FpdGluZ0ZvckFjY2VzcygpO1xuICAgICAgICAgICAgICAgIGlmICh3YWl0aW5nKSByZXR1cm4gd2FpdGluZztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBnZXQoZmlsZU5hbWU6IHN0cmluZywgY29uZmlnPzogR2V0Q29uZmlnKTogUHJvbWlzZTxCdWZmZXIgfCB1bmRlZmluZWQ+IHtcbiAgICAgICAgbGV0IHJlc3VsdCA9IGF3YWl0IHRoaXMuZ2V0MihmaWxlTmFtZSwgY29uZmlnKTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdCAmJiByZXN1bHQuZGF0YSB8fCB1bmRlZmluZWQ7XG4gICAgfVxuICAgIC8qKiBnZXQyLCBidXQgdHJ5aW5nIHNvdXJjZXMgaW4gbGF0ZW5jeSBvcmRlciAoZmFzdGVzdCBmaXJzdCkgaW5zdGVhZCBvZiBjb25maWcgb3JkZXIuIFdoaWxlIHRoaXMgaXMgbXVjaCBmYXN0ZXIsIGl0IG1pZ2h0IG1pc3MgaW1tZWRpYXRlIHdyaXRlczogdGhlIHdyaXRlIG5vZGUgaXMgbm8gbG9uZ2VyIHRyaWVkIGZpcnN0LCBzbyBhIGxhZ2dpbmcgcmVwbGljYSBtYXkgYW5zd2VyIHdpdGggYSBzbGlnaHRseSBvbGRlciB2YWx1ZS4gRXhjbHVzaXZlIHdpdGggbm9GYWxsYmFja3MgKHdoaWNoIG9ubHkgY29uc2lkZXJzIG9uZSBzb3VyY2UgLSB0aGUgd3JpdGUgbm9kZSAtIHNvIHRoZXJlIGlzIG5vIG9yZGVyIHRvIHNwZWVkIHVwKTsgcGFzc2luZyBib3RoIHRocm93cy4gKi9cbiAgICBwdWJsaWMgYXN5bmMgZ2V0RmFzdChmaWxlTmFtZTogc3RyaW5nLCBjb25maWc/OiBHZXRDb25maWcpOiBQcm9taXNlPHsgZGF0YTogQnVmZmVyOyB3cml0ZVRpbWU6IG51bWJlcjsgc2l6ZTogbnVtYmVyOyB1cmw6IHN0cmluZyB9IHwgeyBkYXRhPzogdW5kZWZpbmVkOyB3cml0ZVRpbWU/OiB1bmRlZmluZWQ7IHNpemU/OiB1bmRlZmluZWQ7IHVybDogc3RyaW5nIH0+IHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMucmVxdWVzdCh7IHJvdXRlOiBnZXRSb3V0ZShmaWxlTmFtZSksIG5vRmFsbGJhY2tzOiBjb25maWc/Lm5vRmFsbGJhY2tzLCBmYXN0OiB0cnVlLCB0aW1lb3V0OiB7IHBhdGg6IGZpbGVOYW1lIH0gfSwgYXN5bmMgKGFyY2hpdmVzLCB1cmwpID0+IHtcbiAgICAgICAgICAgIGxldCByZXN1bHQgPSBhd2FpdCBhcmNoaXZlcy5nZXQyKGZpbGVOYW1lLCBjb25maWcpO1xuICAgICAgICAgICAgLy8gRW1wdHkgZGF0YSBpcyBhIHRvbWJzdG9uZSwgbm90IGNvbnRlbnQgLSBzZWUgZ2V0MlxuICAgICAgICAgICAgaWYgKCFyZXN1bHQgfHwgIXJlc3VsdC5kYXRhIHx8ICFyZXN1bHQuZGF0YS5sZW5ndGggJiYgIWNvbmZpZz8uaW5jbHVkZVRvbWJzdG9uZXMgJiYgIShjb25maWc/LnJhbmdlICYmIHJlc3VsdC5zaXplKSkgcmV0dXJuIHsgdXJsIH07XG4gICAgICAgICAgICByZXR1cm4geyBkYXRhOiByZXN1bHQuZGF0YSwgd3JpdGVUaW1lOiByZXN1bHQud3JpdGVUaW1lLCBzaXplOiByZXN1bHQuc2l6ZSwgdXJsIH07XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKiogQWx3YXlzIHJlc29sdmVzIHdpdGggYSB1cmwgLSB0aGUgYXV0aG9yaXR5IHRoYXQgYW5zd2VyZWQuIEEgdmFsdWUgdGhhdCBkb2Vzbid0IGV4aXN0IGlzIHN0aWxsIGFuIGFuc3dlciBGUk9NIGEgc2VydmVyLCBzbyBpdCBjb21lcyBiYWNrIGFzIHsgdXJsIH0gd2l0aCBubyBkYXRhIChuZXZlciBwbGFpbiB1bmRlZmluZWQpOyBlcnJvcnMgZnJvbSBldmVyeSBzb3VyY2UgdGhyb3cgaW5zdGVhZC4gKi9cbiAgICBwdWJsaWMgYXN5bmMgZ2V0MihmaWxlTmFtZTogc3RyaW5nLCBjb25maWc/OiBHZXRDb25maWcpOiBQcm9taXNlPHsgZGF0YTogQnVmZmVyOyB3cml0ZVRpbWU6IG51bWJlcjsgc2l6ZTogbnVtYmVyOyB1cmw6IHN0cmluZyB9IHwgeyBkYXRhPzogdW5kZWZpbmVkOyB3cml0ZVRpbWU/OiB1bmRlZmluZWQ7IHNpemU/OiB1bmRlZmluZWQ7IHVybDogc3RyaW5nIH0+IHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMucmVxdWVzdCh7IHJvdXRlOiBnZXRSb3V0ZShmaWxlTmFtZSksIG5vRmFsbGJhY2tzOiBjb25maWc/Lm5vRmFsbGJhY2tzLCB0aW1lb3V0OiB7IHBhdGg6IGZpbGVOYW1lIH0gfSwgYXN5bmMgKGFyY2hpdmVzLCB1cmwpID0+IHtcbiAgICAgICAgICAgIGxldCByZXN1bHQgPSBhd2FpdCBhcmNoaXZlcy5nZXQyKGZpbGVOYW1lLCBjb25maWcpO1xuICAgICAgICAgICAgLy8gRW1wdHkgZGF0YSBpcyBhIHRvbWJzdG9uZSwgbm90IGNvbnRlbnQgKHVubGVzcyB0aGUgY2FsbGVyIGFza2VkIGZvciB0b21ic3RvbmVzKSAtIGEgcmFuZ2VkIHJlYWQgb2YgYSBSRUFMIGZpbGUgY2FuIGxlZ2l0aW1hdGVseSBiZSBlbXB0eSB0aG91Z2ggKHJhbmdlIHBhc3QgRU9GKSwgd2hpY2ggdGhlIHRvdGFsIHNpemUgZGlzdGluZ3Vpc2hlc1xuICAgICAgICAgICAgaWYgKCFyZXN1bHQgfHwgIXJlc3VsdC5kYXRhIHx8ICFyZXN1bHQuZGF0YS5sZW5ndGggJiYgIWNvbmZpZz8uaW5jbHVkZVRvbWJzdG9uZXMgJiYgIShjb25maWc/LnJhbmdlICYmIHJlc3VsdC5zaXplKSkgcmV0dXJuIHsgdXJsIH07XG4gICAgICAgICAgICByZXR1cm4geyBkYXRhOiByZXN1bHQuZGF0YSwgd3JpdGVUaW1lOiByZXN1bHQud3JpdGVUaW1lLCBzaXplOiByZXN1bHQuc2l6ZSwgdXJsIH07XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBwdWJsaWMgYXN5bmMgZ2V0SW5mbyhmaWxlTmFtZTogc3RyaW5nLCBjb25maWc/OiBHZXRJbmZvQ29uZmlnKTogUHJvbWlzZTx7IHdyaXRlVGltZTogbnVtYmVyOyBzaXplOiBudW1iZXI7IHVybDogc3RyaW5nIH0gfCB1bmRlZmluZWQ+IHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMucmVxdWVzdCh7IHJvdXRlOiBnZXRSb3V0ZShmaWxlTmFtZSkgfSwgYXN5bmMgKGFyY2hpdmVzLCB1cmwpID0+IHtcbiAgICAgICAgICAgIGxldCByZXN1bHQgPSBhd2FpdCBhcmNoaXZlcy5nZXRJbmZvKGZpbGVOYW1lLCBjb25maWcpO1xuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdCAmJiB7IC4uLnJlc3VsdCwgdXJsIH0gfHwgdW5kZWZpbmVkO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHNlbGVjdENvdmVyaW5nU291cmNlcyhzdGF0ZTogQ2hhaW5TdGF0ZSwgY29uZmlnPzogeyBmYWxsYmFja3M/OiBib29sZWFuOyBleGNsdWRlPzogU2V0PFNvdXJjZVdyYXBwZXI+IH0pOiBTb3VyY2VXcmFwcGVyW10ge1xuICAgICAgICAvLyBObyBjb29sZG93biBwcmVmZXJlbmNlIGJ5IGRlZmF1bHQ6IGxpc3RpbmdzIG11c3QgY29tZSBmcm9tIHRoZSBBVVRIT1JJVEFUSVZFIHNvdXJjZXMgKHRoZSBmaXJzdCBtYXRjaGluZywgbGlrZSBldmVyeSByZWFkIGFuZCB3cml0ZSksIG9yIHRoZXkgbWlzcyBqdXN0LXdyaXR0ZW4gZGF0YS4gV2l0aCBmYWxsYmFja3MgdGhlIGNhbGxlciBjaG9zZSBhdmFpbGFiaWxpdHkgb3ZlciB0aGF0OiBrbm93bi1kb3duIHNvdXJjZXMgbW92ZSB0byB0aGUgYmFjayBzbyB0aGUgbmV4dCBzb3VyY2UgY292ZXJpbmcgdGhlaXIgcm91dGVzIHN1YnN0aXR1dGVzLCBhbmQgc291cmNlcyB0aGF0IGZhaWxlZCBUSElTIGNhbGwgYXJlIGV4Y2x1ZGVkIG91dHJpZ2h0LlxuICAgICAgICBsZXQgY2FuZGlkYXRlcyA9IHN0YXRlLnNvdXJjZXMuZmlsdGVyKHggPT4gY29uZmlnV2luZG93Q3VycmVudCh4LmNvbmZpZykgJiYgeC5hcGkgJiYgIWNvbmZpZz8uZXhjbHVkZT8uaGFzKHgpKTtcbiAgICAgICAgaWYgKGNvbmZpZz8uZmFsbGJhY2tzKSB7XG4gICAgICAgICAgICBsZXQgdXNhYmxlID0gY2FuZGlkYXRlcy5maWx0ZXIoeCA9PiAheC5pc09uQ29vbGRvd24oKSk7XG4gICAgICAgICAgICBsZXQgY2hvc2VuID0gY292ZXJSb3V0ZXModXNhYmxlKSB8fCBjb3ZlclJvdXRlcyhjYW5kaWRhdGVzKTtcbiAgICAgICAgICAgIGlmIChjaG9zZW4pIHJldHVybiBjaG9zZW47XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGNob3NlbiA9IGNvdmVyUm91dGVzKGNhbmRpZGF0ZXMpO1xuICAgICAgICBpZiAoIWNob3Nlbikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgY292ZXIgdGhlIGZ1bGwgcm91dGUgc3BhY2UgZm9yICR7dGhpcy5nZXREZWJ1Z05hbWUoKX06IHRoZSBhdmFpbGFibGUgc291cmNlcyBsZWF2ZSBhIGdhcCAoc29tZSBzaGFyZHMgYXJlIGRvd24gb3IgVVJMLW9ubHkpYCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNob3NlbjtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIHJ1bk9uQ292ZXJpbmc8VD4ob3BlcmF0aW9uOiBzdHJpbmcsIHJ1bjogKGFyY2hpdmVzOiBJQXJjaGl2ZXMpID0+IFByb21pc2U8VD4sIGNvbmZpZz86IHsgZmFsbGJhY2tzPzogYm9vbGVhbiB9KTogUHJvbWlzZTxUW10+IHtcbiAgICAgICAgbGV0IGRlYWRsaW5lID0gRGF0ZS5ub3coKSArIENPVkVSSU5HX1JFVFJZX1RJTUVPVVQ7XG4gICAgICAgIC8vIFNvdXJjZXMgdGhhdCBmYWlsZWQgZHVyaW5nIHRoaXMgY2FsbCAtIHdpdGggZmFsbGJhY2tzLCB0aGUgbmV4dCBhdHRlbXB0IGNvdmVycyB0aGVpciByb3V0ZXMgd2l0aCB0aGUgbmV4dCBzb3VyY2UgaG9sZGluZyB0aGVtIGluc3RlYWRcbiAgICAgICAgbGV0IGZhaWxlZCA9IG5ldyBTZXQ8U291cmNlV3JhcHBlcj4oKTtcbiAgICAgICAgd2hpbGUgKHRydWUpIHtcbiAgICAgICAgICAgIGxldCBzdGF0ZSA9IGF3YWl0IHRoaXMuZ2V0U3RhdGUoKTtcbiAgICAgICAgICAgIC8vIEVycm9ycyBuYW1lIHRoZSBPUEVSQVRJT04gYW5kIHRoZSBTUEVDSUZJQyBzb3VyY2VzIHRoYXQgZmFpbGVkIC0gXCJ0aGUgZmluZCBmYWlsZWQgYmVjYXVzZSBzb3VyY2UgWCBpcyB1bmF2YWlsYWJsZVwiLCBuZXZlciBhbiBhbm9ueW1vdXMgZmFpbHVyZSBhdHRyaWJ1dGVkIHRvIHRoZSB3aG9sZSBjaGFpblxuICAgICAgICAgICAgbGV0IG91dGNvbWUgPSBhd2FpdCAoYXN5bmMgKCk6IFByb21pc2U8eyB2YWx1ZXM6IFRbXSB9IHwgeyBlcnJvcjogRXJyb3IgfT4gPT4ge1xuICAgICAgICAgICAgICAgIGxldCBjb3ZlcmluZzogU291cmNlV3JhcHBlcltdO1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIGNvdmVyaW5nID0gdGhpcy5zZWxlY3RDb3ZlcmluZ1NvdXJjZXMoc3RhdGUsIHsgZmFsbGJhY2tzOiBjb25maWc/LmZhbGxiYWNrcywgZXhjbHVkZTogZmFpbGVkIH0pO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsgZXJyb3I6IG5ldyBFcnJvcihgJHtvcGVyYXRpb259IGNhbm5vdCBydW46ICR7KGUgYXMgRXJyb3IpLm1lc3NhZ2V9YCkgfTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbGV0IHZhbHVlczogVFtdID0gW107XG4gICAgICAgICAgICAgICAgbGV0IGZhaWx1cmVzOiB7IHNvdXJjZTogU291cmNlV3JhcHBlcjsgZXJyb3I6IEVycm9yIH1bXSA9IFtdO1xuICAgICAgICAgICAgICAgIGF3YWl0IFByb21pc2UuYWxsKGNvdmVyaW5nLm1hcChhc3luYyBzb3VyY2UgPT4ge1xuICAgICAgICAgICAgICAgICAgICBsZXQgYXBpID0gc291cmNlLmFwaTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFhcGkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZhaWxlZC5hZGQoc291cmNlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZhaWx1cmVzLnB1c2goeyBzb3VyY2UsIGVycm9yOiBuZXcgRXJyb3IoYFVSTC1vbmx5IGFjY2Vzcywgd2hpY2ggY2Fubm90IHNlcnZlICR7b3BlcmF0aW9ufWApIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXMucHVzaChhd2FpdCBydW4oYXBpKSk7XG4gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghc291cmNlLmlzQ29ubmVjdGVkKCkpIHNvdXJjZS5ub3RlRmFpbHVyZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZmFpbGVkLmFkZChzb3VyY2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZmFpbHVyZXMucHVzaCh7IHNvdXJjZSwgZXJyb3I6IGUgYXMgRXJyb3IgfSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICAgICAgaWYgKCFmYWlsdXJlcy5sZW5ndGgpIHJldHVybiB7IHZhbHVlcyB9O1xuICAgICAgICAgICAgICAgIGxldCBwaHJhc2UgPSBmYWlsdXJlcy5sZW5ndGggPT09IDEgJiYgYHNvdXJjZSAke2ZhaWx1cmVzWzBdLnNvdXJjZS5nZXREZWJ1Z05hbWUoKX0gaXMgdW5hdmFpbGFibGVgIHx8IGAke2ZhaWx1cmVzLmxlbmd0aH0gb2YgdGhlICR7Y292ZXJpbmcubGVuZ3RofSBjb3ZlcmluZyBzb3VyY2VzIGFyZSB1bmF2YWlsYWJsZWA7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgZXJyb3I6IG5ldyBFcnJvcihgJHtvcGVyYXRpb259IGZhaWxlZCBiZWNhdXNlICR7cGhyYXNlfTogJHtmYWlsdXJlcy5tYXAoeCA9PiBgJHt4LnNvdXJjZS5nZXREZWJ1Z05hbWUoKX06ICR7eC5lcnJvci5zdGFjayA/PyB4LmVycm9yfWApLmpvaW4oXCIgfCBcIil9YCkgfTtcbiAgICAgICAgICAgIH0pKCk7XG4gICAgICAgICAgICBpZiAoXCJ2YWx1ZXNcIiBpbiBvdXRjb21lKSByZXR1cm4gb3V0Y29tZS52YWx1ZXM7XG4gICAgICAgICAgICBsZXQgZXJyb3IgPSBvdXRjb21lLmVycm9yO1xuICAgICAgICAgICAgaWYgKERhdGUubm93KCkgPj0gZGVhZGxpbmUpIHRocm93IGVycm9yO1xuICAgICAgICAgICAgaWYgKGNvbmZpZz8uZmFsbGJhY2tzICYmIGZhaWxlZC5zaXplKSB7XG4gICAgICAgICAgICAgICAgbGV0IHN1YnN0aXR1dGFibGUgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdENvdmVyaW5nU291cmNlcyhzdGF0ZSwgeyBmYWxsYmFja3M6IHRydWUsIGV4Y2x1ZGU6IGZhaWxlZCB9KTtcbiAgICAgICAgICAgICAgICAgICAgc3Vic3RpdHV0YWJsZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCB7IH1cbiAgICAgICAgICAgICAgICBpZiAoc3Vic3RpdHV0YWJsZSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGAke2Vycm9yLm1lc3NhZ2V9LiBTdWJzdGl0dXRpbmcgdGhlIGZhaWxlZCBzb3VyY2VzJyByb3V0ZXMgd2l0aCBmYWxsYmFjayBzb3VyY2VzLmApO1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gTm8gc3Vic3RpdHV0ZSBjb3ZlcnMgdGhlIGZhaWxlZCByb3V0ZXMgLSByZXRyeSB0aGUgZmFpbGVkIHNvdXJjZXMgdGhlbXNlbHZlcyBhZnRlciB0aGUgZGVsYXlcbiAgICAgICAgICAgICAgICBmYWlsZWQuY2xlYXIoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYCR7ZXJyb3IubWVzc2FnZX0uIFJldHJ5aW5nIGluICR7Q09WRVJJTkdfUkVUUllfREVMQVkgLyAxMDAwfXMgKGdpdmluZyB1cCBhdCAke25ldyBEYXRlKGRlYWRsaW5lKS50b0lTT1N0cmluZygpfSkuYCk7XG4gICAgICAgICAgICBhd2FpdCBkZWxheShDT1ZFUklOR19SRVRSWV9ERUxBWSk7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLnJlY2hlY2tBdmFpbGFiaWxpdHkoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBmaW5kKHByZWZpeDogc3RyaW5nLCBjb25maWc/OiBGaW5kQ29uZmlnKTogUHJvbWlzZTxzdHJpbmdbXT4ge1xuICAgICAgICByZXR1cm4gKGF3YWl0IHRoaXMuZmluZEluZm8ocHJlZml4LCBjb25maWcpKS5tYXAoeCA9PiB4LnBhdGgpO1xuICAgIH1cbiAgICBwdWJsaWMgYXN5bmMgZmluZEluZm8ocHJlZml4OiBzdHJpbmcsIGNvbmZpZz86IEZpbmRDb25maWcpOiBQcm9taXNlPEFyY2hpdmVGaWxlSW5mb1tdPiB7XG4gICAgICAgIGxldCByZXN1bHRzID0gYXdhaXQgdGhpcy5ydW5PbkNvdmVyaW5nKGBUaGUgZmluZCBvZiAke0pTT04uc3RyaW5naWZ5KHByZWZpeCl9YCwgYXJjaGl2ZXMgPT4gYXJjaGl2ZXMuZmluZEluZm8ocHJlZml4LCBjb25maWcpLCB7IGZhbGxiYWNrczogY29uZmlnPy5mYWxsYmFja3MgfSk7XG4gICAgICAgIGxldCBieVBhdGggPSBuZXcgTWFwPHN0cmluZywgQXJjaGl2ZUZpbGVJbmZvPigpO1xuICAgICAgICBmb3IgKGxldCBsaXN0IG9mIHJlc3VsdHMpIHtcbiAgICAgICAgICAgIGZvciAobGV0IGZpbGUgb2YgbGlzdCkge1xuICAgICAgICAgICAgICAgIGxldCBleGlzdGluZyA9IGJ5UGF0aC5nZXQoZmlsZS5wYXRoKTtcbiAgICAgICAgICAgICAgICBpZiAoIWV4aXN0aW5nIHx8IGZpbGUuY3JlYXRlVGltZSA+IGV4aXN0aW5nLmNyZWF0ZVRpbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgYnlQYXRoLnNldChmaWxlLnBhdGgsIGZpbGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBsZXQgbWVyZ2VkID0gWy4uLmJ5UGF0aC52YWx1ZXMoKV07XG4gICAgICAgIHNvcnQobWVyZ2VkLCB4ID0+IHgucGF0aCk7XG4gICAgICAgIHJldHVybiBtZXJnZWQ7XG4gICAgfVxuICAgIHB1YmxpYyBhc3luYyBnZXRDaGFuZ2VzQWZ0ZXIyKGNvbmZpZzogQ2hhbmdlc0FmdGVyQ29uZmlnKTogUHJvbWlzZTxBcmNoaXZlRmlsZUluZm9bXT4ge1xuICAgICAgICBsZXQgcmVzdWx0cyA9IGF3YWl0IHRoaXMucnVuT25Db3ZlcmluZyhgVGhlIGNoYW5nZXMgbGlzdGluZyBzaW5jZSAke25ldyBEYXRlKGNvbmZpZy50aW1lKS50b0lTT1N0cmluZygpfWAsIGFyY2hpdmVzID0+IGFyY2hpdmVzLmdldENoYW5nZXNBZnRlcjIoY29uZmlnKSk7XG4gICAgICAgIGxldCBieVBhdGggPSBuZXcgTWFwPHN0cmluZywgQXJjaGl2ZUZpbGVJbmZvPigpO1xuICAgICAgICBmb3IgKGxldCBsaXN0IG9mIHJlc3VsdHMpIHtcbiAgICAgICAgICAgIGZvciAobGV0IGZpbGUgb2YgbGlzdCkge1xuICAgICAgICAgICAgICAgIGxldCBleGlzdGluZyA9IGJ5UGF0aC5nZXQoZmlsZS5wYXRoKTtcbiAgICAgICAgICAgICAgICBpZiAoIWV4aXN0aW5nIHx8IGZpbGUuY3JlYXRlVGltZSA+IGV4aXN0aW5nLmNyZWF0ZVRpbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgYnlQYXRoLnNldChmaWxlLnBhdGgsIGZpbGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBsZXQgbWVyZ2VkID0gWy4uLmJ5UGF0aC52YWx1ZXMoKV07XG4gICAgICAgIHNvcnQobWVyZ2VkLCB4ID0+IHgucGF0aCk7XG4gICAgICAgIHJldHVybiBtZXJnZWQ7XG4gICAgfVxuICAgIHB1YmxpYyBhc3luYyBnZXRTeW5jU3RhdHVzKCk6IFByb21pc2U8QXJjaGl2ZXNTeW5jU3RhdHVzPiB7XG4gICAgICAgIGxldCBzdGF0dXNlcyA9IGF3YWl0IHRoaXMucnVuT25Db3ZlcmluZyhgVGhlIHN5bmMgc3RhdHVzIGNoZWNrYCwgYXN5bmMgYXJjaGl2ZXMgPT4ge1xuICAgICAgICAgICAgaWYgKCFhcmNoaXZlcy5nZXRTeW5jU3RhdHVzKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAke2FyY2hpdmVzLmdldERlYnVnTmFtZSgpfSBkb2VzIG5vdCBzdXBwb3J0IGdldFN5bmNTdGF0dXNgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBhd2FpdCBhcmNoaXZlcy5nZXRTeW5jU3RhdHVzKCk7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgYWxsU2NhbnNDb21wbGV0ZTogc3RhdHVzZXMuZXZlcnkoeCA9PiB4LmFsbFNjYW5zQ29tcGxldGUpLFxuICAgICAgICAgICAgaW5kZXhTaXplOiBzdGF0dXNlcy5yZWR1Y2UoKHN1bSwgeCkgPT4gc3VtICsgeC5pbmRleFNpemUsIDApLFxuICAgICAgICAgICAgc291cmNlczogc3RhdHVzZXMuZmxhdE1hcCh4ID0+IHguc291cmNlcyksXG4gICAgICAgIH07XG4gICAgfVxuICAgIHB1YmxpYyBhc3luYyBnZXRDb25maWcoKTogUHJvbWlzZTxBcmNoaXZlc0NvbmZpZz4ge1xuICAgICAgICBsZXQgc3RhdGUgPSBhd2FpdCB0aGlzLmdldFN0YXRlKCk7XG4gICAgICAgIGlmICghc3RhdGUuc291cmNlcy5zb21lKHggPT4geC5hcGkpKSByZXR1cm4geyByZW1vdGVDb25maWc6IHN0YXRlLmNvbmZpZyB9O1xuICAgICAgICBsZXQgY29uZmlnID0gYXdhaXQgdGhpcy5ydW4oc3RhdGUsIHsgYXBpT25seTogdHJ1ZSB9LCBhcmNoaXZlcyA9PiBhcmNoaXZlcy5nZXRDb25maWcoKSk7XG4gICAgICAgIHJldHVybiB7IC4uLmNvbmZpZywgcmVtb3RlQ29uZmlnOiBzdGF0ZS5jb25maWcgfTtcbiAgICB9XG4gICAgcHVibGljIGFzeW5jIGhhc1dyaXRlQWNjZXNzKCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgICAgICBsZXQgc3RhdGUgPSBhd2FpdCB0aGlzLmdldFN0YXRlKCk7XG4gICAgICAgIGZvciAobGV0IHNvdXJjZSBvZiBzdGF0ZS5zb3VyY2VzKSB7XG4gICAgICAgICAgICBpZiAoIWNvbmZpZ0FjY2VwdHNXcml0ZXMoc291cmNlLmNvbmZpZykpIGNvbnRpbnVlO1xuICAgICAgICAgICAgaWYgKCFhd2FpdCBzb3VyY2UuaGFzV3JpdGVBY2Nlc3MoKSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBzZXQoZmlsZU5hbWU6IHN0cmluZywgZGF0YTogQnVmZmVyLCBjb25maWc/OiBTZXRDb25maWcpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgICAgICBpZiAoIWRhdGEubGVuZ3RoKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYHNldCB3YXMgY2FsbGVkIHdpdGggYW4gZW1wdHkgYnVmZmVyIGZvciAke0pTT04uc3RyaW5naWZ5KGZpbGVOYW1lKX06IGFuIGVtcHR5IGZpbGUgSVMgYSBkZWxldGlvbiBpbiB0aGlzIHN5c3RlbSBhbmQgd291bGQgcmVhZCBiYWNrIGFzIG1pc3NpbmcgLSBjYWxsIGRlbCBpbnN0ZWFkYCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGZpbGVOYW1lID09PSBST1VUSU5HX0ZJTEUpIHtcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCB0aGlzLnNldFJvdXRpbmdDb25maWcoZGF0YSwgY29uZmlnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZmlsZU5hbWUuaW5jbHVkZXMoVkFSSUFCTEVfU0hBUkQpICYmIHBhcnNlVmFyaWFibGVSb3V0ZShmaWxlTmFtZSkgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuc2V0VmFyaWFibGVTaGFyZChmaWxlTmFtZSwgZGF0YSwgY29uZmlnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZGF0YS5sZW5ndGggPiBMQVJHRV9TRVRfVEhSRVNIT0xEKSB7XG4gICAgICAgICAgICAvLyBTdHJlYW1lZCBhdXRvbWF0aWNhbGx5IHNvIGNhbGxlcnMgbmV2ZXIgaGF2ZSB0byBjYWxsIHNldExhcmdlRmlsZSB0aGVtc2VsdmVzIHdoZW4gdGhleSBhbHJlYWR5IGhvbGQgdGhlIGJ1ZmZlciAtIG9uZSBnaWFudCBtZXNzYWdlIHdvdWxkIGV4Y2VlZCB0aGUgd2lyZSBsaW1pdCBhbmQgbGFnIGV2ZXJ5IG90aGVyIGNsaWVudCBvbiB0aGUgY29ubmVjdGlvblxuICAgICAgICAgICAgYXdhaXQgdGhpcy5zZXRMYXJnZUZpbGUoeyBwYXRoOiBmaWxlTmFtZSwgbGFzdE1vZGlmaWVkOiBjb25maWc/Lmxhc3RNb2RpZmllZCwgZ2V0TmV4dERhdGE6IGJ1ZmZlckNodW5rU3RyZWFtKGRhdGEpIH0pO1xuICAgICAgICAgICAgcmV0dXJuIGZpbGVOYW1lO1xuICAgICAgICB9XG4gICAgICAgIGF3YWl0IHRoaXMucmVxdWVzdCh7IHdyaXRlOiB0cnVlLCByb3V0ZTogZ2V0Um91dGUoZmlsZU5hbWUpLCB0aW1lb3V0OiB7IHVwbG9hZEJ5dGVzOiBkYXRhLmxlbmd0aCwgbGFiZWw6IGBVcGxvYWQgb2YgJHtKU09OLnN0cmluZ2lmeShmaWxlTmFtZSl9ICgke2RhdGEubGVuZ3RofSBieXRlcylgIH0gfSwgYXJjaGl2ZXMgPT4gYXJjaGl2ZXMuc2V0KGZpbGVOYW1lLCBkYXRhLCBjb25maWcpKTtcbiAgICAgICAgcmV0dXJuIGZpbGVOYW1lO1xuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgc2V0Um91dGluZ0NvbmZpZyhkYXRhOiBCdWZmZXIsIGNvbmZpZz86IHsgbGFzdE1vZGlmaWVkPzogbnVtYmVyIH0pOiBQcm9taXNlPHN0cmluZz4ge1xuICAgICAgICBsZXQgc3RhdGUgPSBhd2FpdCB0aGlzLmdldFN0YXRlKCk7XG4gICAgICAgIGxldCB3cml0ZVRpbWUgPSBjb25maWc/Lmxhc3RNb2RpZmllZCB8fCBEYXRlLm5vdygpO1xuICAgICAgICBsZXQgd3JpdHRlbjogc3RyaW5nW10gPSBbXTtcbiAgICAgICAgbGV0IGVycm9yczogc3RyaW5nW10gPSBbXTtcbiAgICAgICAgbGV0IHNlZW4gPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgICAgICAgY29uc29sZS5sb2coYFdyaXRpbmcgc3RvcmFnZSByb3V0aW5nIGNvbmZpZyBmb3IgJHt0aGlzLmdldERlYnVnTmFtZSgpfSB0byBldmVyeSBub2RlICh3cml0ZSB0aW1lICR7bmV3IERhdGUod3JpdGVUaW1lKS50b0lTT1N0cmluZygpfSk6ICR7ZGF0YS50b1N0cmluZyhcInV0ZjhcIikuc2xpY2UoMCwgMjAwMCl9YCk7XG4gICAgICAgIGZvciAobGV0IHNvdXJjZSBvZiBzdGF0ZS5zb3VyY2VzKSB7XG4gICAgICAgICAgICBpZiAoc2Vlbi5oYXMoc291cmNlLmNvbmZpZy51cmwpKSBjb250aW51ZTtcbiAgICAgICAgICAgIHNlZW4uYWRkKHNvdXJjZS5jb25maWcudXJsKTtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgc291cmNlLndyaXRlKGFyY2hpdmVzID0+IGFyY2hpdmVzLnNldChST1VUSU5HX0ZJTEUsIGRhdGEsIHsgbGFzdE1vZGlmaWVkOiB3cml0ZVRpbWUgfSkpO1xuICAgICAgICAgICAgICAgIHdyaXR0ZW4ucHVzaChzb3VyY2UuY29uZmlnLnVybCk7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coYFdyb3RlIHRoZSBzdG9yYWdlIHJvdXRpbmcgY29uZmlnIHRvICR7c291cmNlLmNvbmZpZy51cmx9YCk7XG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgZXJyb3JzLnB1c2goYCR7c291cmNlLmNvbmZpZy51cmx9OiAkeyhlIGFzIEVycm9yKS5zdGFjayA/PyBlfWApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGF3YWl0IHRoaXMucmVmcmVzaEFjdGl2ZUNvbmZpZygpO1xuICAgICAgICBpZiAoZXJyb3JzLmxlbmd0aCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBTdG9yYWdlIHJvdXRpbmcgY29uZmlnIHdyaXRlIGZvciAke3RoaXMuZ2V0RGVidWdOYW1lKCl9IGZhaWxlZCBvbiAke2Vycm9ycy5sZW5ndGh9IG9mICR7c2Vlbi5zaXplfSBub2RlcyAoc3VjY2VlZGVkIG9uOiAke3dyaXR0ZW4uam9pbihcIiwgXCIpIHx8IFwibm9uZVwifSk6ICR7ZXJyb3JzLmpvaW4oXCIgfCBcIil9YCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFJPVVRJTkdfRklMRTtcbiAgICB9XG4gICAgcHVibGljIGFzeW5jIGRlbChmaWxlTmFtZTogc3RyaW5nLCBjb25maWc/OiBEZWxDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgYXdhaXQgdGhpcy5yZXF1ZXN0KHsgd3JpdGU6IHRydWUsIHJvdXRlOiBnZXRSb3V0ZShmaWxlTmFtZSksIHRpbWVvdXQ6IHsgdXBsb2FkQnl0ZXM6IDAsIGxhYmVsOiBgRGVsZXRpb24gb2YgJHtKU09OLnN0cmluZ2lmeShmaWxlTmFtZSl9YCB9IH0sIGFyY2hpdmVzID0+IGFyY2hpdmVzLmRlbChmaWxlTmFtZSwgY29uZmlnKSk7XG4gICAgfVxuXG4gICAgLy8gT25lIHdyaXRlIHRhcmdldCBwZXIgcm91dGUgcmFuZ2UsIGxvd2VzdCBsYXRlbmN5IGZpcnN0LiBXaXRoaW4gYSBzaGFyZCB0aGUgdGFyZ2V0IGlzIEFMV0FZUyB0aGUgZmlyc3Qgc291cmNlIGluIGNvbmZpZyBvcmRlciAoc2VlIHJ1blByaW1hcnkgLSB3cml0ZXMgbXVzdCBzdGF5IG9uIHRoZSBzYW1lIG5vZGUpOiBjb25uZWN0aXZpdHkgb25seSBkZWNpZGVzIHdoaWNoIFNIQVJEIHdlIHBpY2ssIG5ldmVyIHdoaWNoIG5vZGUgd2l0aGluIGl0LCBzbyBhIHNoYXJkIHdob3NlIG5vZGUgaXMgZGlzY29ubmVjdGVkIGlzIGRyb3BwZWQgZW50aXJlbHkgd2hlbiBjb25uZWN0ZWRPbmx5IGlzIHNldC5cbiAgICBwcml2YXRlIGdldFZhcmlhYmxlU2hhcmRUYXJnZXRzKHN0YXRlOiBDaGFpblN0YXRlLCBjb25maWc6IHsgY29ubmVjdGVkT25seTogYm9vbGVhbiB9KTogU291cmNlV3JhcHBlcltdIHtcbiAgICAgICAgbGV0IHRhcmdldHNCeVJvdXRlID0gbmV3IE1hcDxzdHJpbmcsIFNvdXJjZVdyYXBwZXI+KCk7XG4gICAgICAgIGZvciAobGV0IHNvdXJjZSBvZiBzdGF0ZS5zb3VyY2VzKSB7XG4gICAgICAgICAgICBpZiAoIWNvbmZpZ0FjY2VwdHNXcml0ZXMoc291cmNlLmNvbmZpZykpIGNvbnRpbnVlO1xuICAgICAgICAgICAgbGV0IHJvdXRlS2V5ID0gSlNPTi5zdHJpbmdpZnkoc291cmNlLmNvbmZpZy5yb3V0ZSB8fCBGVUxMX1JPVVRFKTtcbiAgICAgICAgICAgIGlmICghdGFyZ2V0c0J5Um91dGUuaGFzKHJvdXRlS2V5KSkge1xuICAgICAgICAgICAgICAgIHRhcmdldHNCeVJvdXRlLnNldChyb3V0ZUtleSwgc291cmNlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBsZXQgdGFyZ2V0cyA9IFsuLi50YXJnZXRzQnlSb3V0ZS52YWx1ZXMoKV07XG4gICAgICAgIGlmIChjb25maWcuY29ubmVjdGVkT25seSkge1xuICAgICAgICAgICAgdGFyZ2V0cyA9IHRhcmdldHMuZmlsdGVyKHggPT4geC5pc0Nvbm5lY3RlZCgpKTtcbiAgICAgICAgfVxuICAgICAgICBzb3J0KHRhcmdldHMsIHggPT4geC5nZXRMYXRlbmN5KCkpO1xuICAgICAgICByZXR1cm4gdGFyZ2V0cztcbiAgICB9XG5cbiAgICAvKiogVGhlIGtleSBzZXRWYXJpYWJsZVNoYXJkIHdvdWxkIG1hdGVyaWFsaXplIGZvciB0aGlzIFZBUklBQkxFX1NIQVJEIGtleSAoYSB2YWx1ZSBpbiB0aGUgcHJlZmVycmVkIHNoYXJkJ3Mgcm91dGUgcmFuZ2UpLCB3aXRob3V0IHdyaXRpbmcgYW55dGhpbmcuICovXG4gICAgcHVibGljIGFzeW5jIGdldFNoYXJkS2V5KGtleTogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICAgICAgaWYgKCFrZXkuaW5jbHVkZXMoVkFSSUFCTEVfU0hBUkQpIHx8IHBhcnNlVmFyaWFibGVSb3V0ZShrZXkpICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgZ2V0U2hhcmRLZXkgcmVxdWlyZXMgYSBrZXkgY29udGFpbmluZyBhbiB1bm1hdGVyaWFsaXplZCAke0pTT04uc3RyaW5naWZ5KFZBUklBQkxFX1NIQVJEKX0sIGdvdCAke0pTT04uc3RyaW5naWZ5KGtleSl9YCk7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHN0YXRlID0gYXdhaXQgdGhpcy5nZXRTdGF0ZSgpO1xuICAgICAgICBsZXQgdGFyZ2V0ID0gdGhpcy5nZXRWYXJpYWJsZVNoYXJkVGFyZ2V0cyhzdGF0ZSwgeyBjb25uZWN0ZWRPbmx5OiB0cnVlIH0pWzBdXG4gICAgICAgICAgICB8fCB0aGlzLmdldFZhcmlhYmxlU2hhcmRUYXJnZXRzKHN0YXRlLCB7IGNvbm5lY3RlZE9ubHk6IGZhbHNlIH0pWzBdO1xuICAgICAgICBpZiAoIXRhcmdldCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBObyBzb3VyY2UgYWNjZXB0cyB3cml0ZXMgZm9yICR7dGhpcy5nZXREZWJ1Z05hbWUoKX0sIHNvIHRoZXJlIGlzIG5vIHNoYXJkIHRvIG1hdGVyaWFsaXplICR7SlNPTi5zdHJpbmdpZnkoa2V5KX0gaW50b2ApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtYXRlcmlhbGl6ZVNoYXJkS2V5KGtleSwgdGFyZ2V0KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIHNldFZhcmlhYmxlU2hhcmQoa2V5OiBzdHJpbmcsIGRhdGE6IEJ1ZmZlciwgY29uZmlnPzogU2V0Q29uZmlnKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICAgICAgbGV0IHJlY2hlY2tlZEF2YWlsYWJpbGl0eSA9IGZhbHNlO1xuICAgICAgICAvLyBUaGVyZSdzIG5vIHBvaW50IHRhbGtpbmcgdG8gYSBzaGFyZCB3aG9zZSBub2RlIHdhcyBmYXN0IGJ1dCBpcyBub3cgZGlzY29ubmVjdGVkIC0gb25seSB3aGVuIG5vIGNvbm5lY3RlZCBzaGFyZCB3b3JrcyBkbyB3ZSByZWNoZWNrIGF2YWlsYWJpbGl0eSBhbmQgdHJ5IGV2ZXJ5IHNoYXJkXG4gICAgICAgIGxldCBjb25uZWN0ZWRPbmx5ID0gdHJ1ZTtcbiAgICAgICAgd2hpbGUgKHRydWUpIHtcbiAgICAgICAgICAgIGxldCBzdGF0ZSA9IGF3YWl0IHRoaXMuZ2V0U3RhdGUoKTtcbiAgICAgICAgICAgIGxldCB0YXJnZXRzID0gdGhpcy5nZXRWYXJpYWJsZVNoYXJkVGFyZ2V0cyhzdGF0ZSwgeyBjb25uZWN0ZWRPbmx5IH0pO1xuICAgICAgICAgICAgbGV0IGVycm9yczogc3RyaW5nW10gPSBbXTtcbiAgICAgICAgICAgIGZvciAobGV0IHRhcmdldCBvZiB0YXJnZXRzKSB7XG4gICAgICAgICAgICAgICAgbGV0IGZ1bGxLZXkgPSBtYXRlcmlhbGl6ZVNoYXJkS2V5KGtleSwgdGFyZ2V0KTtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAvLyBUaGUgc2hhcmQgcGlja2luZyBhbHJlYWR5IHJldHJpZXMgYWNyb3NzIHNoYXJkcywgc28gYSBzdHVjayBzaGFyZCBqdXN0IGNvc3RzIGl0cyB0aW1lb3V0IGFuZCB3ZSBtb3ZlIG9uLiBMYXJnZSBkYXRhIHN0cmVhbXMgdmlhIHNldExhcmdlRmlsZSAtIHRoZSBrZXkgaXMgYWxyZWFkeSBtYXRlcmlhbGl6ZWQgaGVyZSwgc28gdGhlIG5vLVZBUklBQkxFX1NIQVJEIHJlc3RyaWN0aW9uIG9uIHNldExhcmdlRmlsZSBkb2Vzbid0IGFwcGx5LlxuICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmFwcGx5U21hcnRUaW1lb3V0KHsgdXBsb2FkQnl0ZXM6IGRhdGEubGVuZ3RoLCBsYWJlbDogYFZhcmlhYmxlLXNoYXJkIHVwbG9hZCBvZiAke0pTT04uc3RyaW5naWZ5KGZ1bGxLZXkpfSAoJHtkYXRhLmxlbmd0aH0gYnl0ZXMpYCB9LCB0YXJnZXQsICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkYXRhLmxlbmd0aCA+IExBUkdFX1NFVF9USFJFU0hPTEQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGFyZ2V0LndyaXRlKGFyY2hpdmVzID0+IGFyY2hpdmVzLnNldExhcmdlRmlsZSh7IHBhdGg6IGZ1bGxLZXksIGxhc3RNb2RpZmllZDogY29uZmlnPy5sYXN0TW9kaWZpZWQsIGdldE5leHREYXRhOiBidWZmZXJDaHVua1N0cmVhbShkYXRhKSB9KSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGFyZ2V0LndyaXRlKGFyY2hpdmVzID0+IGFyY2hpdmVzLnNldChmdWxsS2V5LCBkYXRhLCBjb25maWcpKSBhcyBhbnk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZnVsbEtleTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBtZXNzYWdlID0gU3RyaW5nKChlIGFzIEVycm9yKS5zdGFjayA/PyBlKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG1lc3NhZ2UuaW5jbHVkZXMoU01BUlRfVElNRU9VVF9NQVJLRVIpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGBWYXJpYWJsZS1zaGFyZCB3cml0ZSB0YXJnZXQgJHt0YXJnZXQuZ2V0RGVidWdOYW1lKCl9IHRpbWVkIG91dDsgbW92aW5nIHRvIHRoZSBuZXh0LWxvd2VzdC1sYXRlbmN5IHNoYXJkOiAke21lc3NhZ2V9YCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBlcnJvcnMucHVzaChtZXNzYWdlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmICh0YXJnZXQuaXNDb25uZWN0ZWQoKSkgdGhyb3cgZTtcbiAgICAgICAgICAgICAgICAgICAgdGFyZ2V0Lm5vdGVGYWlsdXJlKCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGBWYXJpYWJsZS1zaGFyZCB3cml0ZSB0YXJnZXQgJHt0YXJnZXQuZ2V0RGVidWdOYW1lKCl9IGlzIGRvd247IG1vdmluZyB0byB0aGUgbmV4dC1sb3dlc3QtbGF0ZW5jeSBzaGFyZGApO1xuICAgICAgICAgICAgICAgICAgICBlcnJvcnMucHVzaChtZXNzYWdlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIXJlY2hlY2tlZEF2YWlsYWJpbGl0eSkge1xuICAgICAgICAgICAgICAgIHJlY2hlY2tlZEF2YWlsYWJpbGl0eSA9IHRydWU7XG4gICAgICAgICAgICAgICAgY29ubmVjdGVkT25seSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMucmVjaGVja0F2YWlsYWJpbGl0eSgpO1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBFdmVyeSB2YXJpYWJsZS1zaGFyZCB3cml0ZSB0YXJnZXQgZmFpbGVkIGZvciAke3RoaXMuZ2V0RGVidWdOYW1lKCl9OiAke2Vycm9ycy5qb2luKFwiIHwgXCIpIHx8IFwibm8gc291cmNlcyBhY2NlcHQgd3JpdGVzXCJ9YCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgc2V0TGFyZ2VGaWxlKGNvbmZpZzogeyBwYXRoOiBzdHJpbmc7IGxhc3RNb2RpZmllZD86IG51bWJlcjsgZ2V0TmV4dERhdGEoKTogUHJvbWlzZTxCdWZmZXIgfCB1bmRlZmluZWQ+IH0pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgaWYgKGNvbmZpZy5wYXRoLmluY2x1ZGVzKFZBUklBQkxFX1NIQVJEKSAmJiBwYXJzZVZhcmlhYmxlUm91dGUoY29uZmlnLnBhdGgpID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgc2V0TGFyZ2VGaWxlIGRvZXMgbm90IHN1cHBvcnQgVkFSSUFCTEVfU0hBUkQga2V5cyAodGhlcmUgaXMgbm8gd2F5IHRvIHJldHVybiB0aGUgbWF0ZXJpYWxpemVkIGtleSk7IHdyaXRlIHRoZSBmaWxlIHdpdGggc2V0LCBvciBtYXRlcmlhbGl6ZSB0aGUga2V5IHlvdXJzZWxmLiBLZXk6ICR7SlNPTi5zdHJpbmdpZnkoY29uZmlnLnBhdGgpfWApO1xuICAgICAgICB9XG4gICAgICAgIGxldCByb3V0ZSA9IGdldFJvdXRlKGNvbmZpZy5wYXRoKTtcbiAgICAgICAgbGV0IHJlY2hlY2tlZEF2YWlsYWJpbGl0eSA9IGZhbHNlO1xuICAgICAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgICAgICAgbGV0IHN0YXRlID0gYXdhaXQgdGhpcy5nZXRTdGF0ZSgpO1xuICAgICAgICAgICAgbGV0IHRhcmdldCA9IHN0YXRlLnNvdXJjZXMuZmluZCh4ID0+IGNvbmZpZ0FjY2VwdHNXcml0ZXMoeC5jb25maWcpICYmIHJvdXRlQ29udGFpbnMoeC5jb25maWcucm91dGUsIHJvdXRlKSk7XG4gICAgICAgICAgICBpZiAoIXRhcmdldCkge1xuICAgICAgICAgICAgICAgIGlmICghcmVjaGVja2VkQXZhaWxhYmlsaXR5KSB7XG4gICAgICAgICAgICAgICAgICAgIHJlY2hlY2tlZEF2YWlsYWJpbGl0eSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMucmVjaGVja0F2YWlsYWJpbGl0eSgpO1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBObyBzb3VyY2UgYWNjZXB0cyB3cml0ZXMgZm9yIHNldExhcmdlRmlsZSBvbiAke3RoaXMuZ2V0RGVidWdOYW1lKCl9IChyb3V0ZSAke3JvdXRlfSlgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgd2F0Y2hTbG93UHJvbWlzZShgc2V0TGFyZ2VGaWxlfCR7Y29uZmlnLnBhdGh9YCwgdGFyZ2V0LndyaXRlKGFyY2hpdmVzID0+IGFyY2hpdmVzLnNldExhcmdlRmlsZShjb25maWcpKSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgIGlmICghdGFyZ2V0LmlzQ29ubmVjdGVkKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGFyZ2V0Lm5vdGVGYWlsdXJlKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRocm93IGU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgZ2V0VVJMKHBhdGg6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgICAgIGxldCB1cmxzID0gYXdhaXQgdGhpcy5nZXRVUkxzKHBhdGgpO1xuICAgICAgICBpZiAoIXVybHMubGVuZ3RoKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE5vIHB1YmxpYyBzb3VyY2UgY292ZXJpbmcgcm91dGUgJHtnZXRSb3V0ZShwYXRoKX0gdG8gYnVpbGQgYSBVUkwgZnJvbSBmb3IgJHt0aGlzLmdldERlYnVnTmFtZSgpfWApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB1cmxzWzBdO1xuICAgIH1cblxuICAgIC8qKiBFdmVyeSBVUkwgdGhhdCBjb3VsZCBzZXJ2ZSB0aGlzIHBhdGg6IHB1YmxpYyBzb3VyY2VzIG1hdGNoaW5nIGJvdGggdGhlIHBhdGgncyByb3V0ZSBhbmQgdGhlIGN1cnJlbnQgdmFsaWQgd2luZG93LiBUaGUgZmlyc3QgaXMgdGhlIHdyaXRlIG5vZGUncyAoZmlyc3QgbWF0Y2hpbmcgc291cmNlIGluIGNvbmZpZyBvcmRlciwgc2VlIHJ1blByaW1hcnkgLSB0aGUgb25lIGd1YXJhbnRlZWQgY3VycmVudCk7IHRoZSByZXN0IGFyZSByYW5rZWQgZmFzdGVzdC1maXJzdCBieSBtZWFzdXJlZCBsYXRlbmN5LiBFbXB0eSB3aGVuIG5vbmUgcXVhbGlmeS4gKi9cbiAgICBwdWJsaWMgYXN5bmMgZ2V0VVJMcyhwYXRoOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZ1tdPiB7XG4gICAgICAgIHJldHVybiAoYXdhaXQgdGhpcy5nZXRHZXRVUkxzKCkpKHBhdGgpO1xuICAgIH1cblxuICAgIC8qKiBnZXRVUkxzLCBidXQgYWZ0ZXIgdGhlIG9uZSBhd2FpdCAoaW5pdGlhbGl6YXRpb24pIHRoZSByZXR1cm5lZCBmdW5jdGlvbiBpcyBzeW5jaHJvbm91czogZXZlcnl0aGluZyB1bmRlcm5lYXRoIC0gcm91dGUgaGFzaGluZywgd2luZG93IGNoZWNrcywgbGF0ZW5jaWVzLCBVUkwgYnVpbGRpbmcgLSBpcyBzeW5jaHJvbm91cywgYW5kIHRoZSBjbG9zdXJlIGFsd2F5cyByZWFkcyB0aGUgbmV3ZXN0IGFkb3B0ZWQgY29uZmlnLCBzbyBpdCBzdGF5cyBjb3JyZWN0IGFjcm9zcyBjb25maWcgcmVmcmVzaGVzLiAqL1xuICAgIHB1YmxpYyBhc3luYyBnZXRHZXRVUkxzKCk6IFByb21pc2U8KHBhdGg6IHN0cmluZykgPT4gc3RyaW5nW10+IHtcbiAgICAgICAgbGV0IGluaXRpYWxTdGF0ZSA9IGF3YWl0IHRoaXMuZ2V0U3RhdGUoKTtcbiAgICAgICAgcmV0dXJuIHRoaXMubWFrZUdldFVSTHMoaW5pdGlhbFN0YXRlLCB7IHdyaXRlTm9kZUZpcnN0OiB0cnVlIH0pO1xuICAgIH1cblxuICAgIC8qKiBnZXRHZXRVUkxzLCBidXQgc29ydGVkIHB1cmVseSBieSBsYXRlbmN5IC0gdGhlIHdyaXRlIG5vZGUgZ2V0cyBubyBzcGVjaWFsIGZpcnN0IHBvc2l0aW9uLiBGb3IgcmVhZC1vbmx5IGNvbnN1bWVycyB0aGF0IGp1c3Qgd2FudCB0aGUgZmFzdGVzdCBob3N0LiAqL1xuICAgIHB1YmxpYyBhc3luYyBnZXRHZXRGYXN0VVJMcygpOiBQcm9taXNlPChwYXRoOiBzdHJpbmcpID0+IHN0cmluZ1tdPiB7XG4gICAgICAgIGxldCBpbml0aWFsU3RhdGUgPSBhd2FpdCB0aGlzLmdldFN0YXRlKCk7XG4gICAgICAgIHJldHVybiB0aGlzLm1ha2VHZXRVUkxzKGluaXRpYWxTdGF0ZSwgeyB3cml0ZU5vZGVGaXJzdDogZmFsc2UgfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBtYWtlR2V0VVJMcyhpbml0aWFsU3RhdGU6IENoYWluU3RhdGUsIGNvbmZpZzogeyB3cml0ZU5vZGVGaXJzdDogYm9vbGVhbiB9KTogKHBhdGg6IHN0cmluZykgPT4gc3RyaW5nW10ge1xuICAgICAgICByZXR1cm4gKHBhdGg6IHN0cmluZykgPT4ge1xuICAgICAgICAgICAgbGV0IHN0YXRlID0gdGhpcy5sYXRlc3RTdGF0ZSB8fCBpbml0aWFsU3RhdGU7XG4gICAgICAgICAgICBsZXQgcm91dGUgPSBnZXRSb3V0ZShwYXRoKTtcbiAgICAgICAgICAgIGxldCBzb3VyY2VzOiBTb3VyY2VXcmFwcGVyW10gPSBbXTtcbiAgICAgICAgICAgIGZvciAobGV0IHNvdXJjZSBvZiBzdGF0ZS5zb3VyY2VzKSB7XG4gICAgICAgICAgICAgICAgaWYgKCEoc291cmNlLmNvbmZpZy5wdWJsaWMgPz8gdHJ1ZSkpIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIGlmICghcm91dGVDb250YWlucyhzb3VyY2UuY29uZmlnLnJvdXRlLCByb3V0ZSkpIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIGlmICghY29uZmlnV2luZG93Q3VycmVudChzb3VyY2UuY29uZmlnKSkgY29udGludWU7XG4gICAgICAgICAgICAgICAgc291cmNlcy5wdXNoKHNvdXJjZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsZXQgb3JkZXJlZDogU291cmNlV3JhcHBlcltdO1xuICAgICAgICAgICAgaWYgKGNvbmZpZy53cml0ZU5vZGVGaXJzdCkge1xuICAgICAgICAgICAgICAgIGxldCByZXN0ID0gc291cmNlcy5zbGljZSgxKTtcbiAgICAgICAgICAgICAgICBzb3J0KHJlc3QsIHggPT4geC5nZXRMYXRlbmN5KCkpO1xuICAgICAgICAgICAgICAgIG9yZGVyZWQgPSBbLi4uc291cmNlcy5zbGljZSgwLCAxKSwgLi4ucmVzdF07XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIG9yZGVyZWQgPSBbLi4uc291cmNlc107XG4gICAgICAgICAgICAgICAgc29ydChvcmRlcmVkLCB4ID0+IHguZ2V0TGF0ZW5jeSgpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxldCB1cmxzID0gb3JkZXJlZC5tYXAoeCA9PiBidWlsZEZpbGVVcmwoZ2V0QnVja2V0QmFzZVVybCh4LmNvbmZpZy51cmwpLCBwYXRoKSk7XG4gICAgICAgICAgICByZXR1cm4gWy4uLm5ldyBTZXQodXJscyldO1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIHB1YmxpYyBkaXNwb3NlKCk6IHZvaWQge1xuICAgICAgICB0aGlzLmRpc3Bvc2VkID0gdHJ1ZTtcbiAgICAgICAgdGhpcy51bnN1YnNjcmliZVJvdXRpbmdQdXNoPy4oKTtcbiAgICAgICAgaWYgKHRoaXMucG9sbFRpbWVyKSB7XG4gICAgICAgICAgICBjbGVhckludGVydmFsKHRoaXMucG9sbFRpbWVyKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5pbml0UmV0cnlUaW1lcikge1xuICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuaW5pdFJldHJ5VGltZXIpO1xuICAgICAgICB9XG4gICAgICAgIGxldCBzdGF0ZVByb21pc2UgPSB0aGlzLnN0YXRlUHJvbWlzZTtcbiAgICAgICAgaWYgKHN0YXRlUHJvbWlzZSkge1xuICAgICAgICAgICAgdm9pZCBzdGF0ZVByb21pc2UudGhlbihzdGF0ZSA9PiB7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgc291cmNlIG9mIHN0YXRlLnNvdXJjZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgc291cmNlLmRpc3Bvc2UoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LCAoKSA9PiB7IH0pO1xuICAgICAgICB9XG4gICAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlQXJjaGl2ZXMoY29uZmlnOiBSZW1vdGVDb25maWcgfCBSZW1vdGVDb25maWdCYXNlLCBvcHRpb25zPzogQXJjaGl2ZXNDaGFpbk9wdGlvbnMpOiBBcmNoaXZlc0NoYWluIHtcbiAgICByZXR1cm4gbmV3IEFyY2hpdmVzQ2hhaW4oY29uZmlnLCBvcHRpb25zKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gY2FsbFNlcnZlcjxUPih1cmw6IHN0cmluZywgcnVuOiAoY29udHJvbGxlcjogdHlwZW9mIFJlbW90ZVN0b3JhZ2VDb250cm9sbGVyLm5vZGVzW3N0cmluZ10pID0+IFByb21pc2U8VD4pOiBQcm9taXNlPFQ+IHtcbiAgICBTb2NrZXRGdW5jdGlvbi5FTkFCTEVfQ0xJRU5UX01PREUgPSB0cnVlO1xuICAgIGxldCBwYXJzZWQgPSBwYXJzZVN0b3JhZ2VVcmwodXJsKTtcbiAgICBsZXQgbm9kZUlkID0gU29ja2V0RnVuY3Rpb24uY29ubmVjdCh7IGFkZHJlc3M6IHBhcnNlZC5hZGRyZXNzLCBwb3J0OiBwYXJzZWQucG9ydCB9KTtcbiAgICBsZXQgY29udHJvbGxlciA9IFJlbW90ZVN0b3JhZ2VDb250cm9sbGVyLm5vZGVzW25vZGVJZF07XG4gICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHJ1bihjb250cm9sbGVyKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGlmICghU3RyaW5nKChlIGFzIEVycm9yKS5zdGFjayA/PyBlKS5pbmNsdWRlcyhTVE9SQUdFX05PVF9BVVRIRU5USUNBVEVEKSkgdGhyb3cgZTtcbiAgICAgICAgYXdhaXQgYXV0aGVudGljYXRlU3RvcmFnZSh7IGFkZHJlc3M6IHBhcnNlZC5hZGRyZXNzLCBwb3J0OiBwYXJzZWQucG9ydCwgbm9kZUlkIH0pO1xuICAgICAgICByZXR1cm4gYXdhaXQgcnVuKGNvbnRyb2xsZXIpO1xuICAgIH1cbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGxpc3RTZXJ2ZXJCdWNrZXRzKGNvbmZpZzogeyB1cmw6IHN0cmluZzsgYWNjb3VudDogc3RyaW5nIH0pOiBQcm9taXNlPFNlcnZlckJ1Y2tldEluZm9bXT4ge1xuICAgIHJldHVybiBhd2FpdCBjYWxsU2VydmVyKGNvbmZpZy51cmwsIGNvbnRyb2xsZXIgPT4gY29udHJvbGxlci5saXN0QnVja2V0cyh7IGFjY291bnQ6IGNvbmZpZy5hY2NvdW50IH0pKTtcbn1cblxuLyoqIFRoZSBsaXZlLCBpbi1tZW1vcnkgc3RhdGUgb2Ygb25lIGJ1Y2tldCBvbiBhIHNlcnZlciAocm91dGluZyBjb25maWcgaW5jbHVkZWQpLCBvciBhIHN0cmluZyBzYXlpbmcgd2h5IGl0IGlzIHVuYXZhaWxhYmxlLiBDaGVhcCAtIGl0IG5ldmVyIHRvdWNoZXMgdGhlIHNlcnZlcidzIGRpc2sgLSBidXQgb25seSB3b3JrcyB3aGlsZSB0aGF0IGJ1Y2tldCBpcyBsb2FkZWQgdGhlcmUuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0U2VydmVyQWN0aXZlQnVja2V0KGNvbmZpZzogeyB1cmw6IHN0cmluZzsgYWNjb3VudDogc3RyaW5nOyBidWNrZXROYW1lOiBzdHJpbmcgfSk6IFByb21pc2U8QWN0aXZlQnVja2V0SW5mbyB8IHN0cmluZz4ge1xuICAgIHJldHVybiBhd2FpdCBjYWxsU2VydmVyKGNvbmZpZy51cmwsIGNvbnRyb2xsZXIgPT4gY29udHJvbGxlci5nZXRBY3RpdmVCdWNrZXQoeyBhY2NvdW50OiBjb25maWcuYWNjb3VudCwgYnVja2V0TmFtZTogY29uZmlnLmJ1Y2tldE5hbWUgfSkpO1xufVxuXG4vKiogVGhlIGJ1Y2tldHMgYSBzZXJ2ZXIgY3VycmVudGx5IGhhcyBsb2FkZWQuIEFkbWluIG9ubHksIHNvIGluIHByYWN0aWNlIHRoaXMgaXMgb3VyIG93biBtYWNoaW5lJ3Mgb3RoZXIgcHJvY2VzcyAtIGEgZGVwbG95IHN1Y2Nlc3NvciBhc2tpbmcgaXRzIHByZWRlY2Vzc29yIHdoYXQgaXMgYWN0dWFsbHkgaW4gdXNlLiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGxpc3RTZXJ2ZXJBY3RpdmVCdWNrZXRLZXlzKGNvbmZpZzogeyB1cmw6IHN0cmluZyB9KTogUHJvbWlzZTx7IGFjY291bnQ6IHN0cmluZzsgYnVja2V0TmFtZTogc3RyaW5nIH1bXT4ge1xuICAgIHJldHVybiBhd2FpdCBjYWxsU2VydmVyKGNvbmZpZy51cmwsIGNvbnRyb2xsZXIgPT4gY29udHJvbGxlci5hZG1pbkxpc3RBY3RpdmVCdWNrZXRzKCkpO1xufVxuXG4vKiogVGVsbHMgYSBzZXJ2ZXIgdG8gbG9hZCBvbmUgb2YgaXRzIGJ1Y2tldHMgaW50byBtZW1vcnkgKHN0YXJ0aW5nIGl0cyBzeW5jaHJvbml6YXRpb24pIGFuZCByZXR1cm5zIGl0cyBsaXZlIHN0YXRlLCBvciBhIHN0cmluZyBzYXlpbmcgd2h5IGl0IGNvdWxkIG5vdCBiZSBsb2FkZWQuIE9ubHkgdG91Y2hlcyB0aGF0IHNlcnZlciAtIG5vdGhpbmcgaXMgd3JpdHRlbiBhbmQgbm8gb3RoZXIgc291cmNlIGlzIGNvbnRhY3RlZC4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBhY3RpdmF0ZVNlcnZlckJ1Y2tldChjb25maWc6IHsgdXJsOiBzdHJpbmc7IGFjY291bnQ6IHN0cmluZzsgYnVja2V0TmFtZTogc3RyaW5nIH0pOiBQcm9taXNlPEFjdGl2ZUJ1Y2tldEluZm8gfCBzdHJpbmc+IHtcbiAgICByZXR1cm4gYXdhaXQgY2FsbFNlcnZlcihjb25maWcudXJsLCBjb250cm9sbGVyID0+IGNvbnRyb2xsZXIuYWN0aXZhdGVCdWNrZXQoeyBhY2NvdW50OiBjb25maWcuYWNjb3VudCwgYnVja2V0TmFtZTogY29uZmlnLmJ1Y2tldE5hbWUgfSkpO1xufVxuXG4vKiogWmVyb2VzIHRoZSB3cml0ZSBzdGF0aXN0aWNzIGxpc3RTZXJ2ZXJCdWNrZXRzIHJlcG9ydHMsIGZvciBldmVyeSBidWNrZXQgaW4gdGhlIGFjY291bnQuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY2xlYXJTZXJ2ZXJXcml0ZVN0YXRzKGNvbmZpZzogeyB1cmw6IHN0cmluZzsgYWNjb3VudDogc3RyaW5nIH0pOiBQcm9taXNlPHsgY2xlYXJlZEJ1Y2tldHM6IG51bWJlciB9PiB7XG4gICAgcmV0dXJuIGF3YWl0IGNhbGxTZXJ2ZXIoY29uZmlnLnVybCwgY29udHJvbGxlciA9PiBjb250cm9sbGVyLmNsZWFyV3JpdGVTdGF0cyh7IGFjY291bnQ6IGNvbmZpZy5hY2NvdW50IH0pKTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldEJ1Y2tldEluZm8oY29uZmlnOiB7IHVybDogc3RyaW5nIH0pOiBQcm9taXNlPEFyY2hpdmVzQ29uZmlnPiB7XG4gICAgLy8gZ2V0Q29uZmlnIGlzIGJ1Y2tldC1sZXZlbCAobm8gc3RvcmUgc2VsZWN0aW9uKSwgc28gdGhlIGZhYnJpY2F0ZWQgc291cmNlQ29uZmlnIG5ldmVyIGhhcyB0byBtYXRjaCBhbnl0aGluZ1xuICAgIGxldCByZW1vdGUgPSBuZXcgQXJjaGl2ZXNSZW1vdGUoeyB1cmw6IGNvbmZpZy51cmwsIHdhaXRGb3JBY2Nlc3M6IGZhbHNlLCBzb3VyY2VDb25maWc6IG5vcm1hbGl6ZVNvdXJjZShjb25maWcudXJsKSB9KTtcbiAgICByZXR1cm4gYXdhaXQgcmVtb3RlLmdldENvbmZpZygpO1xufVxuIl19
|
|
1037
|
-
/* _JS_SOURCE_HASH = "
|
|
1039
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3JlYXRlQXJjaGl2ZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJjcmVhdGVBcmNoaXZlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSxtREFBMEU7QUFDMUUsMkRBQXFEO0FBQ3JELDRDQUlzQjtBQUN0QixpREFJd0I7QUFDeEIsK0NBQTRDO0FBQzVDLCtEQUFtRTtBQUNuRSxtRUFBZ0U7QUFDaEUscURBQXdGO0FBQ3hGLHVFQUFtRTtBQUNuRSw0Q0FBaUQ7QUFDakQsNkRBQTRGO0FBQzVGLGlEQUE4QztBQUM5QywyREFBeUY7QUFDekYsbURBQWtHO0FBRWxHLE1BQU0sb0JBQW9CLEdBQUcsQ0FBQyxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUM7QUFDM0MsTUFBTSw0QkFBNEIsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDO0FBQy9DLE1BQU0saUNBQWlDLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQztBQUNwRCxNQUFNLHVCQUF1QixHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUM7QUFDMUMsTUFBTSw2QkFBNkIsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDO0FBQy9DLE1BQU0scUJBQXFCLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQztBQUN4QyxNQUFNLG1CQUFtQixHQUFHLENBQUMsR0FBRyxJQUFJLENBQUM7QUFDckMsTUFBTSxzQkFBc0IsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDO0FBQ3pDLE1BQU0sb0JBQW9CLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQztBQUN0Qyx3SkFBd0o7QUFDeEosTUFBTSxtQkFBbUIsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDO0FBQ3RDLDZHQUE2RztBQUM3RyxNQUFNLHVDQUF1QyxHQUFHLElBQUksR0FBRyxJQUFJLENBQUM7QUFDNUQsTUFBTSxxQ0FBcUMsR0FBRyxHQUFHLEdBQUcsSUFBSSxDQUFDO0FBQ3pELG9KQUFvSjtBQUNwSixNQUFNLG9CQUFvQixHQUFHLCtCQUErQixDQUFDO0FBVTdE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LENBQUMsQ0FBQyxDQUFDO0FBQy9HLENBQUM7QUFGRCxzREFFQztBQUVNLEtBQUssVUFBVSxhQUFhLENBQUMsTUFBdUI7SUFDdkQsNkdBQTZHO0lBQzdHLElBQUksTUFBTSxHQUFHLElBQUksK0JBQWMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxNQUFNLENBQUMsR0FBRyxFQUFFLGFBQWEsRUFBRSxLQUFLLEVBQUUsWUFBWSxFQUFFLElBQUEsOEJBQWUsRUFBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQ3RILE9BQU8sTUFBTSxNQUFNLENBQUMsU0FBUyxFQUFFLENBQUM7QUFDcEMsQ0FBQztBQUpELHNDQUlDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgaXNOb2RlLCBzb3J0LCB3YXRjaFNsb3dQcm9taXNlIH0gZnJvbSBcInNvY2tldC1mdW5jdGlvbi9zcmMvbWlzY1wiO1xuaW1wb3J0IHsgZGVsYXkgfSBmcm9tIFwic29ja2V0LWZ1bmN0aW9uL3NyYy9iYXRjaGluZ1wiO1xuaW1wb3J0IHtcbiAgICBJQXJjaGl2ZXMsIFJlbW90ZUNvbmZpZywgUmVtb3RlQ29uZmlnQmFzZSwgU291cmNlQ29uZmlnLFxuICAgIEFyY2hpdmVGaWxlSW5mbywgQXJjaGl2ZXNDb25maWcsIEFyY2hpdmVzU3luY1N0YXR1cywgQ2hhbmdlc0FmdGVyQ29uZmlnLCBEZWxDb25maWcsIEZpbmRDb25maWcsIEdldENvbmZpZywgR2V0SW5mb0NvbmZpZywgU2V0Q29uZmlnLCBTVE9SQUdFX1dST05HX1ZBTElEX1dJTkRPVyxcbiAgICBTVE9SQUdFX1dST05HX1JPVVRFLCBGVUxMX1JPVVRFLCBWQVJJQUJMRV9TSEFSRCwgTEFSR0VfU0VUX1RIUkVTSE9MRCwgYnVmZmVyQ2h1bmtTdHJlYW0sXG59IGZyb20gXCIuLi9JQXJjaGl2ZXNcIjtcbmltcG9ydCB7XG4gICAgUk9VVElOR19GSUxFLCBnZXRDb25maWdWZXJzaW9uLCBwYXJzZUhvc3RlZFVybCwgcGFyc2VCYWNrYmxhemVVcmwsXG4gICAgbm9ybWFsaXplUmVtb3RlQ29uZmlnLCBub3JtYWxpemVTb3VyY2UsIHNlcmlhbGl6ZVJlbW90ZUNvbmZpZyxcbiAgICBnZXRSb3V0ZSwgcm91dGVDb250YWlucywgcGFyc2VWYXJpYWJsZVJvdXRlLCBnZXRCdWNrZXRCYXNlVXJsLCBidWlsZEZpbGVVcmwsXG59IGZyb20gXCIuL3JlbW90ZUNvbmZpZ1wiO1xuaW1wb3J0IHsgQXJjaGl2ZXNVcmwgfSBmcm9tIFwiLi9BcmNoaXZlc1VybFwiO1xuaW1wb3J0IHsgcmVzb2x2ZUludGVybWVkaWF0ZVNvdXJjZXMgfSBmcm9tIFwiLi9pbnRlcm1lZGlhdGVTb3VyY2VzXCI7XG5pbXBvcnQgeyBTb2NrZXRGdW5jdGlvbiB9IGZyb20gXCJzb2NrZXQtZnVuY3Rpb24vU29ja2V0RnVuY3Rpb25cIjtcbmltcG9ydCB7IEFyY2hpdmVzUmVtb3RlLCBwYXJzZVN0b3JhZ2VVcmwsIGF1dGhlbnRpY2F0ZVN0b3JhZ2UgfSBmcm9tIFwiLi9BcmNoaXZlc1JlbW90ZVwiO1xuaW1wb3J0IHsgb25TZXJ2ZXJSb3V0aW5nQ2hhbmdlZCB9IGZyb20gXCIuL3N0b3JhZ2VDbGllbnRDb250cm9sbGVyXCI7XG5pbXBvcnQgeyBBcmNoaXZlc0JhY2tibGF6ZSB9IGZyb20gXCIuLi9iYWNrYmxhemVcIjtcbmltcG9ydCB7IFNlcnZlckJ1Y2tldEluZm8sIEFjdGl2ZUJ1Y2tldEluZm8sIGdldExvY2FsQXJjaGl2ZXMgfSBmcm9tIFwiLi9zdG9yYWdlU2VydmVyU3RhdGVcIjtcbmltcG9ydCB7IGlzT3duQWRkcmVzcyB9IGZyb20gXCIuL3NlcnZlckNvbmZpZ1wiO1xuaW1wb3J0IHsgUmVtb3RlU3RvcmFnZUNvbnRyb2xsZXIsIFNUT1JBR0VfTk9UX0FVVEhFTlRJQ0FURUQgfSBmcm9tIFwiLi9zdG9yYWdlQ29udHJvbGxlclwiO1xuaW1wb3J0IHsgU291cmNlV3JhcHBlciwgUkVUUllfU1RBUlRfREVMQVksIFJFVFJZX01BWF9ERUxBWSwgUkVUUllfR1JPV1RIIH0gZnJvbSBcIi4vc291cmNlV3JhcHBlclwiO1xuXG5jb25zdCBDT05GSUdfUE9MTF9JTlRFUlZBTCA9IDUgKiA2MCAqIDEwMDA7XG5jb25zdCBXUk9OR19UQVJHRVRfQk9VTkRBUllfV0lORE9XID0gMzAgKiAxMDAwO1xuY29uc3QgV1JPTkdfVEFSR0VUX0JPVU5EQVJZX1JFVFJZX0RFTEFZID0gMTUgKiAxMDAwO1xuY29uc3QgQ09ORklHX1JFRlJFU0hfVEhST1RUTEUgPSAzMCAqIDEwMDA7XG5jb25zdCBBVkFJTEFCSUxJVFlfUkVDSEVDS19USFJPVFRMRSA9IDUgKiAxMDAwO1xuY29uc3QgUFJJTUFSWV9SRVRSWV9USU1FT1VUID0gMzAgKiAxMDAwO1xuY29uc3QgUFJJTUFSWV9SRVRSWV9ERUxBWSA9IDIgKiAxMDAwO1xuY29uc3QgQ09WRVJJTkdfUkVUUllfVElNRU9VVCA9IDMwICogMTAwMDtcbmNvbnN0IENPVkVSSU5HX1JFVFJZX0RFTEFZID0gNSAqIDEwMDA7XG4vLyBTbWFydCB0aW1lb3V0czogYW4gYXR0ZW1wdCBnZXRzIHRoaXMgbG9uZyB0byBwcm9kdWNlIGFueXRoaW5nIGJlZm9yZSB3ZSBwcm9iZSBnZXRJbmZvIGZvciB0aGUgZmlsZSdzIHNpemUgKGFuZCB0aGUgcHJvYmUgaXRzZWxmIGdldHMgdGhlIHNhbWUgd2luZG93KVxuY29uc3QgU01BUlRfVElNRU9VVF9QUk9CRSA9IDEwICogMTAwMDtcbi8vIFZlcnkgZ2VuZXJvdXMgYXNzdW1lZCB0cmFuc2ZlciByYXRlcyAtIHRoZSByZXN1bHRpbmcgZGVhZGxpbmUgZXhpc3RzIHRvIGNhdGNoIHN0dWNrIHNvdXJjZXMsIG5vdCBzbG93IG9uZXNcbmNvbnN0IFNNQVJUX1RJTUVPVVRfRE9XTkxPQURfQllURVNfUEVSX1NFQ09ORCA9IDEwMjQgKiAxMDI0O1xuY29uc3QgU01BUlRfVElNRU9VVF9VUExPQURfQllURVNfUEVSX1NFQ09ORCA9IDUxMiAqIDEwMjQ7XG4vLyBNYXJrZXIgaW4gc21hcnQtdGltZW91dCBlcnJvcnMsIHNvIHRoZSByZWFkIGxvb3AgY2FuIGxvZyB0aGVtIGFuZCBjb250aW51ZSB3aXRoIHRoZSBvdGhlciBzb3VyY2VzIChhIGNvbm5lY3RlZCBzb3VyY2UncyBvdGhlciBlcnJvcnMgc3RpbGwgdGhyb3cpXG5jb25zdCBTTUFSVF9USU1FT1VUX01BUktFUiA9IFwiQVJDSElWRVNfU01BUlRfVElNRU9VVF9jNDFhOWRcIjtcblxuLy8gU2l6ZXMgYSBnZW5lcm91cyBwZXItYXR0ZW1wdCBkZWFkbGluZS4gR2V0LXN0eWxlIGNhbGxzIHBhc3MgcGF0aDogdGhlIHNpemUgaXMgb25seSBmZXRjaGVkICh2aWEgZ2V0SW5mbykgd2hlbiB0aGUgY2FsbCB0dXJucyBvdXQgdG8gYmUgc2xvdy4gU2V0LXN0eWxlIGNhbGxzIHBhc3MgdXBsb2FkQnl0ZXMsIHdoaWNoIHRoZXkgYWxyZWFkeSBrbm93LlxudHlwZSBTbWFydFRpbWVvdXQgPSB7XG4gICAgcGF0aD86IHN0cmluZztcbiAgICB1cGxvYWRCeXRlcz86IG51bWJlcjtcbiAgICAvLyBOYW1lcyB0aGUgb3BlcmF0aW9uIGluIHRpbWVvdXQgZXJyb3JzIC0gd2l0aG91dCBpdCBhIGRlbGV0aW9uIChhIHRvbWJzdG9uZSB3cml0ZSwgdXBsb2FkQnl0ZXMgMCkgcmVhZHMgYXMgXCJVcGxvYWQgb2YgMCBieXRlc1wiLCB3aGljaCBsb29rcyBsaWtlIGEgYnVnIHJhdGhlciB0aGFuIGEgZGVsZXRlXG4gICAgbGFiZWw/OiBzdHJpbmc7XG59O1xuXG4vKiogVGhlIGFkZHJlc3MsIHBvcnQsIGFjY291bnQsIGFuZCBidWNrZXQgbmFtZSBhIGJ1Y2tldCByb3V0aW5nIFVSTCBhZGRyZXNzZXMuIFRocm93cyB3aGVuIHRoZSBVUkwgaXNuJ3QgYSBob3N0ZWQgYnVja2V0IHJvdXRpbmcgVVJMIChodHRwczovL2hvc3Q6cG9ydC9maWxlLzxhY2NvdW50Pi88YnVja2V0TmFtZT4vc3RvcmFnZS9zdG9yYWdlcm91dGluZy5qc29uKS4gKi9cbmV4cG9ydCB7IHBhcnNlSG9zdGVkVXJsLCBwYXJzZUJhY2tibGF6ZVVybCwgZ2V0QnVja2V0QmFzZVVybCB9IGZyb20gXCIuL3JlbW90ZUNvbmZpZ1wiO1xuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlQXBpQXJjaGl2ZXMoc291cmNlOiBTb3VyY2VDb25maWcpOiBJQXJjaGl2ZXMge1xuICAgIGlmIChzb3VyY2UudHlwZSA9PT0gXCJiYWNrYmxhemVcIikge1xuICAgICAgICByZXR1cm4gbmV3IEFyY2hpdmVzQmFja2JsYXplKHsgYnVja2V0TmFtZTogcGFyc2VCYWNrYmxhemVVcmwoc291cmNlLnVybCkuYnVja2V0TmFtZSwgcHVibGljOiBzb3VyY2UucHVibGljLCBpbW11dGFibGU6IHNvdXJjZS5pbW11dGFibGUsIGFsbG93ZWRPcmlnaW5zOiBzb3VyY2UuYWxsb3dlZE9yaWdpbnMgfSk7XG4gICAgfVxuICAgIGxldCBwYXJzZWQgPSBwYXJzZUhvc3RlZFVybChzb3VyY2UudXJsKTtcbiAgICBpZiAoaXNOb2RlKCkgJiYgaXNPd25BZGRyZXNzKHBhcnNlZC5hZGRyZXNzLCBwYXJzZWQucG9ydCkpIHtcbiAgICAgICAgcmV0dXJuIGdldExvY2FsQXJjaGl2ZXMocGFyc2VkLmFjY291bnQsIHBhcnNlZC5idWNrZXROYW1lLCBzb3VyY2UpO1xuICAgIH1cbiAgICByZXR1cm4gbmV3IEFyY2hpdmVzUmVtb3RlKHsgdXJsOiBzb3VyY2UudXJsLCB3YWl0Rm9yQWNjZXNzOiBmYWxzZSwgc291cmNlQ29uZmlnOiBzb3VyY2UgfSk7XG59XG5cbnR5cGUgQ2hhaW5TdGF0ZSA9IHtcbiAgICBjb25maWc6IFJlbW90ZUNvbmZpZztcbiAgICBzb3VyY2VzOiBTb3VyY2VXcmFwcGVyW107XG59O1xuXG5leHBvcnQgdHlwZSBBcmNoaXZlc0NoYWluT3B0aW9ucyA9IHtcbiAgICAvKiogT3V0c2lkZSBvZiBub2RlIHdlIGRlZmF1bHQgdG8gcmVhZC1vbmx5IGRvd25sb2FkcyBvdmVyIHRoZSBwdWJsaWMgVVJMcyAobm8gQVBJIGNvbm5lY3Rpb24pIHdoZW4gdGhlIGNvbmZpZyBoYXMgcHVibGljIHNvdXJjZXMuIFNldCB0aGlzIHRvIGNvbm5lY3QgdG8gdGhlIEFQSSBhbnl3YXkgLSBuZWVkZWQgZm9yIHdyaXRpbmcsIGxpc3RpbmcsIGFuZCBhbnkgb3RoZXIgb3BlcmF0aW9uIHRoZSBwbGFpbiBVUkwgZm9ybSBjYW5ub3Qgc2VydmUuICovXG4gICAgZGlyZWN0Q29ubmVjdD86IGJvb2xlYW47XG59O1xuXG5mdW5jdGlvbiBjb25maWdXaW5kb3dDdXJyZW50KGNvbmZpZzogU291cmNlQ29uZmlnKTogYm9vbGVhbiB7XG4gICAgbGV0IG5vdyA9IERhdGUubm93KCk7XG4gICAgbGV0IFtzdGFydCwgZW5kXSA9IGNvbmZpZy52YWxpZFdpbmRvdztcbiAgICByZXR1cm4gc3RhcnQgPD0gbm93ICYmIG5vdyA8IGVuZDtcbn1cblxuZnVuY3Rpb24gY29uZmlnQWNjZXB0c1dyaXRlcyhjb25maWc6IFNvdXJjZUNvbmZpZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBjb25maWdXaW5kb3dDdXJyZW50KGNvbmZpZyk7XG59XG5cbmZ1bmN0aW9uIG1hdGVyaWFsaXplU2hhcmRLZXkoa2V5OiBzdHJpbmcsIHRhcmdldDogU291cmNlV3JhcHBlcik6IHN0cmluZyB7XG4gICAgbGV0IFtzdGFydCwgZW5kXSA9IHRhcmdldC5jb25maWcucm91dGUgfHwgRlVMTF9ST1VURTtcbiAgICByZXR1cm4ga2V5LnJlcGxhY2UoVkFSSUFCTEVfU0hBUkQsIFZBUklBQkxFX1NIQVJEICsgXCJfXCIgKyAoc3RhcnQgKyBNYXRoLnJhbmRvbSgpICogKGVuZCAtIHN0YXJ0KSkpO1xufVxuXG4vKiogQ292ZXJzIHRoZSB3aG9sZSBrZXkgc3BhY2Ugd2l0aCB0aGUgQVVUSE9SSVRBVElWRSBzb3VyY2VzOiBmb3IgZWFjaCB1bmNvdmVyZWQgcG9pbnQsIHRoZSBGSVJTVCBzb3VyY2UgaW4gY29uZmlnIG9yZGVyIHdob3NlIHJvdXRlIGNvbnRhaW5zIGl0IC0gdGhlIGV4YWN0IHNlbGVjdGlvbiBldmVyeSByZWFkIGFuZCB3cml0ZSB1c2VzLCBzbyBsaXN0aW5ncyBjb21lIGZyb20gdGhlIHNhbWUgbm9kZXMgd3JpdGVzIHdlbnQgdG8gKHJlYWQteW91ci13cml0ZXMpLiBOZXZlciBcImZld2VzdFwiIG9yIFwid2lkZXN0XCI6IHByZWZlcnJpbmcgYSB3aWRlIHJlYWQgcmVwbGljYSBvdmVyIHRoZSByb3V0ZWQgd3JpdGUgc2hhcmRzIHdvdWxkIHNlcnZlIGxpc3RpbmdzIGZyb20gYSBub2RlIHRoYXQgb25seSBoYXMgdGhlIGRhdGEgc2Vjb25kLWhhbmQuIFJldHVybnMgdW5kZWZpbmVkIHdoZW4gdGhlIGNhbmRpZGF0ZXMgbGVhdmUgYSBnYXAuICovXG5mdW5jdGlvbiBjb3ZlclJvdXRlcyhjYW5kaWRhdGVzOiBTb3VyY2VXcmFwcGVyW10pOiBTb3VyY2VXcmFwcGVyW10gfCB1bmRlZmluZWQge1xuICAgIGxldCBjaG9zZW46IFNvdXJjZVdyYXBwZXJbXSA9IFtdO1xuICAgIGxldCBjb3ZlcmVkID0gMDtcbiAgICB3aGlsZSAoY292ZXJlZCA8IDEpIHtcbiAgICAgICAgbGV0IG5leHQgPSBjYW5kaWRhdGVzLmZpbmQoeCA9PiByb3V0ZUNvbnRhaW5zKHguY29uZmlnLnJvdXRlLCBjb3ZlcmVkKSk7XG4gICAgICAgIGlmICghbmV4dCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgY2hvc2VuLnB1c2gobmV4dCk7XG4gICAgICAgIGxldCBbLCBlbmRdID0gbmV4dC5jb25maWcucm91dGUgfHwgRlVMTF9ST1VURTtcbiAgICAgICAgY292ZXJlZCA9IGVuZDtcbiAgICB9XG4gICAgcmV0dXJuIGNob3Nlbjtcbn1cblxuLyoqIFJFQURTIE9OTFkuIERyb3BzIHNvdXJjZXMgdGhhdCByZWNlbnRseSBmYWlsZWQgd2hpbGUgZGlzY29ubmVjdGVkIC0gdW5sZXNzIHRoYXQgd291bGQgbGVhdmUgbm90aGluZywgaW4gd2hpY2ggY2FzZSBhIGRvd24gc291cmNlIGlzIHN0aWxsIGJldHRlciB0aGFuIG5vIHNvdXJjZSwgYW5kIHdlIHJldHJ5IGl0IGltbWVkaWF0ZWx5LiBOZXZlciBhcHBsaWVzIHRvIHdyaXRlcyAob3Igbm9GYWxsYmFja3MgcmVhZHMgb2YgdGhlIHdyaXRlIHRhcmdldCk6IHRoZSB3cml0ZSBub2RlIGlzIHN0cmljdGx5IHRoZSBGSVJTVCBzb3VyY2UgbWF0Y2hpbmcgdGhlIHJvdXRlIGFuZCB2YWxpZCB3aW5kb3csIHJlZ2FyZGxlc3Mgb2YgY29ubmVjdGl2aXR5IC0gYSBjbGllbnQncyBmbGFreSB2aWV3IG9mIHRoZSBuZXR3b3JrIG11c3QgbmV2ZXIgc2NhdHRlciB3cml0ZXMgYWNyb3NzIHRoZSBjaGFpbiAoc3BlYzogY2xpZW50IHdyaXRlcyBhcmUgY29uc2lzdGVudCwgY2xpZW50IHJlYWRzIGFyZSByZWR1bmRhbnQpLiAqL1xuZnVuY3Rpb24gcHJlZmVyVXNhYmxlKHNvdXJjZXM6IFNvdXJjZVdyYXBwZXJbXSk6IFNvdXJjZVdyYXBwZXJbXSB7XG4gICAgbGV0IHVzYWJsZSA9IHNvdXJjZXMuZmlsdGVyKHggPT4gIXguaXNPbkNvb2xkb3duKCkpO1xuICAgIHJldHVybiB1c2FibGUubGVuZ3RoICYmIHVzYWJsZSB8fCBzb3VyY2VzO1xufVxuXG5leHBvcnQgY2xhc3MgQXJjaGl2ZXNDaGFpbiBpbXBsZW1lbnRzIElBcmNoaXZlcyB7XG4gICAgcHJpdmF0ZSBjb25maWd1cmVkOiBSZW1vdGVDb25maWc7XG4gICAgcHJpdmF0ZSBhY3RpdmVDb25maWc6IFJlbW90ZUNvbmZpZztcbiAgICBwcml2YXRlIHN0YXRlUHJvbWlzZTogUHJvbWlzZTxDaGFpblN0YXRlPiB8IHVuZGVmaW5lZDtcbiAgICAvLyBUaGUgcmVzb2x2ZWQgc3RhdGUsIGZvciBzeW5jaHJvbm91cyBhY2Nlc3MgKGdldEdldFVSTHMpIC0gYWx3YXlzIHRoZSBuZXdlc3QgYWRvcHRlZCBjb25maWcsIHdoZXJlIHN0YXRlUHJvbWlzZSBtYXkgYnJpZWZseSBsYWcgZHVyaW5nIGEgcmVidWlsZFxuICAgIHByaXZhdGUgbGF0ZXN0U3RhdGU6IENoYWluU3RhdGUgfCB1bmRlZmluZWQ7XG4gICAgcHJpdmF0ZSBpbml0UmV0cnlEZWxheSA9IFJFVFJZX1NUQVJUX0RFTEFZO1xuICAgIHByaXZhdGUgaW5pdFJldHJ5VGltZXI6IFJldHVyblR5cGU8dHlwZW9mIHNldFRpbWVvdXQ+IHwgdW5kZWZpbmVkO1xuICAgIHByaXZhdGUgcG9sbFRpbWVyOiBSZXR1cm5UeXBlPHR5cGVvZiBzZXRJbnRlcnZhbD4gfCB1bmRlZmluZWQ7XG4gICAgcHJpdmF0ZSBkaXNwb3NlZCA9IGZhbHNlO1xuICAgIHByaXZhdGUgdW5zdWJzY3JpYmVSb3V0aW5nUHVzaDogKCgpID0+IHZvaWQpIHwgdW5kZWZpbmVkO1xuXG4gICAgY29uc3RydWN0b3IoY29uZmlnOiBSZW1vdGVDb25maWcgfCBSZW1vdGVDb25maWdCYXNlLCBwcml2YXRlIG9wdGlvbnM/OiBBcmNoaXZlc0NoYWluT3B0aW9ucykge1xuICAgICAgICB0aGlzLmNvbmZpZ3VyZWQgPSBub3JtYWxpemVSZW1vdGVDb25maWcoY29uZmlnKTtcbiAgICAgICAgdGhpcy5hY3RpdmVDb25maWcgPSB0aGlzLmNvbmZpZ3VyZWQ7XG4gICAgICAgIHRoaXMudW5zdWJzY3JpYmVSb3V0aW5nUHVzaCA9IG9uU2VydmVyUm91dGluZ0NoYW5nZWQoKCkgPT4ge1xuICAgICAgICAgICAgdm9pZCB0aGlzLnJlZnJlc2hBY3RpdmVDb25maWcoKS5jYXRjaCgoZTogRXJyb3IpID0+IGNvbnNvbGUuZXJyb3IoYENvbmZpZyByZWZyZXNoIGZhaWxlZCBmb3IgJHt0aGlzLmdldERlYnVnTmFtZSgpfTogJHtlLnN0YWNrID8/IGV9YCkpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0RGVidWdOYW1lKCkge1xuICAgICAgICBsZXQgdXJscyA9IHRoaXMuYWN0aXZlQ29uZmlnLnNvdXJjZXMubWFwKHggPT4gdHlwZW9mIHggPT09IFwic3RyaW5nXCIgJiYgeCB8fCAoeCBhcyBTb3VyY2VDb25maWcpLnVybCk7XG4gICAgICAgIHJldHVybiBgY2hhaW4gJHt1cmxzLmpvaW4oXCIsIFwiKX1gO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0U3RhdGUoKTogUHJvbWlzZTxDaGFpblN0YXRlPiB7XG4gICAgICAgIGlmICh0aGlzLmRpc3Bvc2VkKSB7XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKGBBcmNoaXZlc0NoYWluICR7dGhpcy5nZXREZWJ1Z05hbWUoKX0gaGFzIGJlZW4gZGlzcG9zZWRgKSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCF0aGlzLnN0YXRlUHJvbWlzZSkge1xuICAgICAgICAgICAgbGV0IHByb21pc2UgPSB0aGlzLmluaXQoKTtcbiAgICAgICAgICAgIHRoaXMuc3RhdGVQcm9taXNlID0gcHJvbWlzZTtcbiAgICAgICAgICAgIHByb21pc2UudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5pbml0UmV0cnlEZWxheSA9IFJFVFJZX1NUQVJUX0RFTEFZO1xuICAgICAgICAgICAgfSwgKGU6IEVycm9yKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuZGlzcG9zZWQgfHwgdGhpcy5pbml0UmV0cnlUaW1lcikgcmV0dXJuO1xuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYFN0b3JhZ2UgaW5pdCBmYWlsZWQgZm9yICR7dGhpcy5nZXREZWJ1Z05hbWUoKX0sIHJldHJ5aW5nIGluICR7TWF0aC5yb3VuZCh0aGlzLmluaXRSZXRyeURlbGF5IC8gMTAwMCl9cy4gJHtlLnN0YWNrID8/IGV9YCk7XG4gICAgICAgICAgICAgICAgdGhpcy5pbml0UmV0cnlUaW1lciA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmluaXRSZXRyeVRpbWVyID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5kaXNwb3NlZCkgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5zdGF0ZVByb21pc2UgPT09IHByb21pc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc3RhdGVQcm9taXNlID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZ2V0U3RhdGUoKS5jYXRjaCgoKSA9PiB7IH0pO1xuICAgICAgICAgICAgICAgIH0sIHRoaXMuaW5pdFJldHJ5RGVsYXkpO1xuICAgICAgICAgICAgICAgICh0aGlzLmluaXRSZXRyeVRpbWVyIGFzIHsgdW5yZWY/OiAoKSA9PiB2b2lkIH0pLnVucmVmPy4oKTtcbiAgICAgICAgICAgICAgICB0aGlzLmluaXRSZXRyeURlbGF5ID0gTWF0aC5taW4oUkVUUllfTUFYX0RFTEFZLCB0aGlzLmluaXRSZXRyeURlbGF5ICogUkVUUllfR1JPV1RIKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLnN0YXRlUHJvbWlzZTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIGluaXQoKTogUHJvbWlzZTxDaGFpblN0YXRlPiB7XG4gICAgICAgIGxldCBjb25maWdzID0gdGhpcy5jb25maWd1cmVkLnNvdXJjZXMubWFwKG5vcm1hbGl6ZVNvdXJjZSk7XG4gICAgICAgIGxldCByZWFkT25seSA9IHRoaXMuaXNSZWFkT25seSh0aGlzLmNvbmZpZ3VyZWQpO1xuICAgICAgICBsZXQgZmV0Y2hlcyA9IGF3YWl0IFByb21pc2UuYWxsKGNvbmZpZ3MubWFwKGFzeW5jIHNvdXJjZUNvbmZpZyA9PiB7XG4gICAgICAgICAgICBsZXQgcHJvYmUgPSBhd2FpdCBTb3VyY2VXcmFwcGVyLmNyZWF0ZShzb3VyY2VDb25maWcsIHsgYmFja2dyb3VuZDogZmFsc2UsIHJlYWRPbmx5IH0pO1xuICAgICAgICAgICAgbGV0IHN0YXJ0ID0gRGF0ZS5ub3coKTtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgbGV0IGV4aXN0aW5nID0gYXdhaXQgcHJvYmUucmVhZFJvdXRpbmdDb25maWcoKTtcbiAgICAgICAgICAgICAgICByZXR1cm4geyBwcm9iZSwgc291cmNlQ29uZmlnLCByZXNwb25kZWQ6IHRydWUsIGxhdGVuY3k6IERhdGUubm93KCkgLSBzdGFydCwgZXhpc3RpbmcsIGVycm9yOiBcIlwiIH07XG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgcHJvYmUsIHNvdXJjZUNvbmZpZywgcmVzcG9uZGVkOiBmYWxzZSwgbGF0ZW5jeTogMCwgZXhpc3Rpbmc6IHVuZGVmaW5lZCwgZXJyb3I6IGAke3NvdXJjZUNvbmZpZy51cmx9OiAkeyhlIGFzIEVycm9yKS5zdGFjayA/PyBlfWAgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSkpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgbGV0IGZvdW5kID0gZmV0Y2hlcy5maW5kKHggPT4geC5yZXNwb25kZWQpO1xuICAgICAgICAgICAgaWYgKCFmb3VuZCkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgQ2Fubm90IGluaXRpYWxpemUgc3RvcmFnZSBmb3IgJHt0aGlzLmdldERlYnVnTmFtZSgpfTogbm8gc291cmNlIGFuc3dlcmVkLiAke2ZldGNoZXMubWFwKHggPT4geC5lcnJvcikuam9pbihcIiB8IFwiKX1gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxldCBleGlzdGluZyA9IGZvdW5kLmV4aXN0aW5nO1xuICAgICAgICAgICAgbGV0IGFjdGl2ZSA9IHRoaXMuY29uZmlndXJlZDtcbiAgICAgICAgICAgIGxldCBuZWVkc1dyaXRlID0gdHJ1ZTtcbiAgICAgICAgICAgIGlmIChleGlzdGluZyAmJiBnZXRDb25maWdWZXJzaW9uKGV4aXN0aW5nKSA+PSBnZXRDb25maWdWZXJzaW9uKHRoaXMuY29uZmlndXJlZCkpIHtcbiAgICAgICAgICAgICAgICBpZiAoZ2V0Q29uZmlnVmVyc2lvbihleGlzdGluZykgPT09IGdldENvbmZpZ1ZlcnNpb24odGhpcy5jb25maWd1cmVkKSAmJiBKU09OLnN0cmluZ2lmeShleGlzdGluZykgIT09IEpTT04uc3RyaW5naWZ5KHRoaXMuY29uZmlndXJlZCkpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihgQXJjaGl2ZXMgY29uZmlndXJhdGlvbiB1cGRhdGVkIHdpdGhvdXQgdXBkYXRpbmcgdGhlIHZlcnNpb24sIGZvciAke2ZvdW5kLnNvdXJjZUNvbmZpZy51cmx9LiBVcGRhdGVzIHdpbGwgYmUgaWdub3JlZCB1bnRpbCB5b3UgaW5jcmVhc2UgdGhlIHZlcnNpb24uIFVzaW5nOiAke0pTT04uc3RyaW5naWZ5KGV4aXN0aW5nKX0sIGlnbm9yaW5nOiAke0pTT04uc3RyaW5naWZ5KHRoaXMuY29uZmlndXJlZCl9YCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGFjdGl2ZSA9IGV4aXN0aW5nO1xuICAgICAgICAgICAgICAgIG5lZWRzV3JpdGUgPSBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChuZWVkc1dyaXRlKSB7XG4gICAgICAgICAgICAgICAgbGV0IGJlc3Q6IFJlbW90ZUNvbmZpZyB8IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICBsZXQgY29uZmxpY3RVcmw6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBmZXRjaCBvZiBmZXRjaGVzKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBzdG9yZWQgPSBmZXRjaC5leGlzdGluZztcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFzdG9yZWQpIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWJlc3QgfHwgZ2V0Q29uZmlnVmVyc2lvbihzdG9yZWQpID4gZ2V0Q29uZmlnVmVyc2lvbihiZXN0KSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYmVzdCA9IHN0b3JlZDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAoZ2V0Q29uZmlnVmVyc2lvbihzdG9yZWQpID09PSBnZXRDb25maWdWZXJzaW9uKHRoaXMuY29uZmlndXJlZCkgJiYgSlNPTi5zdHJpbmdpZnkoc3RvcmVkKSAhPT0gSlNPTi5zdHJpbmdpZnkodGhpcy5jb25maWd1cmVkKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uZmxpY3RVcmwgPSBmZXRjaC5zb3VyY2VDb25maWcudXJsO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChiZXN0ICYmIGdldENvbmZpZ1ZlcnNpb24oYmVzdCkgPj0gZ2V0Q29uZmlnVmVyc2lvbih0aGlzLmNvbmZpZ3VyZWQpKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChjb25mbGljdFVybCAmJiBnZXRDb25maWdWZXJzaW9uKGJlc3QpID09PSBnZXRDb25maWdWZXJzaW9uKHRoaXMuY29uZmlndXJlZCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYEFyY2hpdmVzIGNvbmZpZ3VyYXRpb24gdXBkYXRlZCB3aXRob3V0IHVwZGF0aW5nIHRoZSB2ZXJzaW9uLCBmb3IgJHtjb25mbGljdFVybH0uIFVwZGF0ZXMgd2lsbCBiZSBpZ25vcmVkIHVudGlsIHlvdSBpbmNyZWFzZSB0aGUgdmVyc2lvbi4gVXNpbmc6ICR7SlNPTi5zdHJpbmdpZnkoYmVzdCl9LCBpZ25vcmluZzogJHtKU09OLnN0cmluZ2lmeSh0aGlzLmNvbmZpZ3VyZWQpfWApO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGFjdGl2ZSA9IGJlc3Q7XG4gICAgICAgICAgICAgICAgICAgIG5lZWRzV3JpdGUgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsZXQgc291cmNlcyA9IGF3YWl0IHRoaXMuYnVpbGRTb3VyY2VzKGFjdGl2ZSk7XG4gICAgICAgICAgICBpZiAobmVlZHNXcml0ZSkge1xuICAgICAgICAgICAgICAgIGxldCBtaXNzaW5nOiBzdHJpbmdbXSA9IFtdO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IHNvdXJjZSBvZiBzb3VyY2VzKSB7XG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWF3YWl0IHNvdXJjZS5oYXNXcml0ZUFjY2VzcygpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWlzc2luZy5wdXNoKHNvdXJjZS5jb25maWcudXJsKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbWlzc2luZy5wdXNoKGAke3NvdXJjZS5jb25maWcudXJsfSAoY2hlY2sgZmFpbGVkOiAkeyhlIGFzIEVycm9yKS5zdGFjayA/PyBlfSlgKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAobWlzc2luZy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihgTm90IHdyaXRpbmcgdGhlIHN0b3JhZ2Ugcm91dGluZyBjb25maWcgZm9yICR7dGhpcy5nZXREZWJ1Z05hbWUoKX0gKHZlcnNpb24gJHtnZXRDb25maWdWZXJzaW9uKHRoaXMuY29uZmlndXJlZCl9KTogbm8gd3JpdGUgYWNjZXNzIHRvICR7bWlzc2luZy5qb2luKFwiLCBcIil9LiAke2V4aXN0aW5nICYmIGBSdW5uaW5nIG9uIHRoZSBzdG9yZWQgY29uZmlnICh2ZXJzaW9uICR7Z2V0Q29uZmlnVmVyc2lvbihleGlzdGluZyl9KSBpbnN0ZWFkLmAgfHwgYE5vIHN0b3JlZCBjb25maWcgZXhpc3RzLCBzbyB0aGUgYnVja2V0IGNhbm5vdCBiZSBjcmVhdGVkIHVudGlsIHdyaXRlIGFjY2VzcyBpcyBncmFudGVkLmB9YCk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChleGlzdGluZykge1xuICAgICAgICAgICAgICAgICAgICAgICAgYWN0aXZlID0gZXhpc3Rpbmc7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBzb3VyY2Ugb2Ygc291cmNlcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZS5kaXNwb3NlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2VzID0gYXdhaXQgdGhpcy5idWlsZFNvdXJjZXMoYWN0aXZlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgcm91dGluZ0RhdGEgPSBzZXJpYWxpemVSZW1vdGVDb25maWcodGhpcy5jb25maWd1cmVkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCByb3V0aW5nV3JpdGVUaW1lID0gRGF0ZS5ub3coKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCB3cml0dGVuVXJscyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgc291cmNlIG9mIHNvdXJjZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAod3JpdHRlblVybHMuaGFzKHNvdXJjZS5jb25maWcudXJsKSkgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JpdHRlblVybHMuYWRkKHNvdXJjZS5jb25maWcudXJsKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGBTdG9yYWdlIHJvdXRpbmcgY29uZmlnIGZvciAke3RoaXMuZ2V0RGVidWdOYW1lKCl9IGlzIG91dCBvZiBkYXRlIChzdG9yZWQgdmVyc2lvbiAke2V4aXN0aW5nICYmIGdldENvbmZpZ1ZlcnNpb24oZXhpc3RpbmcpIHx8IFwibm9uZVwifSwgb3VycyAke2dldENvbmZpZ1ZlcnNpb24odGhpcy5jb25maWd1cmVkKX0pOiB3cml0aW5nIG91cnMgdG8gYWxsICR7d3JpdHRlblVybHMuc2l6ZX0gbm9kZXMgKHdyaXRlIHRpbWUgJHtuZXcgRGF0ZShyb3V0aW5nV3JpdGVUaW1lKS50b0lTT1N0cmluZygpfSk6ICR7Wy4uLndyaXR0ZW5VcmxzXS5qb2luKFwiLCBcIil9YCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB3cml0dGVuVXJscy5jbGVhcigpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgc291cmNlIG9mIHNvdXJjZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAod3JpdHRlblVybHMuaGFzKHNvdXJjZS5jb25maWcudXJsKSkgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JpdHRlblVybHMuYWRkKHNvdXJjZS5jb25maWcudXJsKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBzb3VyY2Uud3JpdGUoYXJjaGl2ZXMgPT4gYXJjaGl2ZXMuc2V0KFJPVVRJTkdfRklMRSwgcm91dGluZ0RhdGEsIHsgbGFzdE1vZGlmaWVkOiByb3V0aW5nV3JpdGVUaW1lIH0pKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhgV3JvdGUgc3RvcmFnZSByb3V0aW5nIGNvbmZpZyB2ZXJzaW9uICR7Z2V0Q29uZmlnVmVyc2lvbih0aGlzLmNvbmZpZ3VyZWQpfSB0byAke3NvdXJjZS5jb25maWcudXJsfWApO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBzb3VyY2Ugb2Ygc291cmNlcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZS5kaXNwb3NlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZm9yIChsZXQgc291cmNlIG9mIHNvdXJjZXMpIHtcbiAgICAgICAgICAgICAgICBsZXQgZmV0Y2ggPSBmZXRjaGVzLmZpbmQoeCA9PiB4LnJlc3BvbmRlZCAmJiB4LnNvdXJjZUNvbmZpZy51cmwgPT09IHNvdXJjZS5jb25maWcudXJsKTtcbiAgICAgICAgICAgICAgICBpZiAoZmV0Y2gpIHtcbiAgICAgICAgICAgICAgICAgICAgc291cmNlLnNlZWRMYXRlbmN5KGZldGNoLmxhdGVuY3kpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuYWN0aXZlQ29uZmlnID0gYWN0aXZlO1xuICAgICAgICAgICAgdGhpcy5zdGFydENvbmZpZ1BvbGwoKTtcbiAgICAgICAgICAgIGxldCBzdGF0ZTogQ2hhaW5TdGF0ZSA9IHsgY29uZmlnOiBhY3RpdmUsIHNvdXJjZXMgfTtcbiAgICAgICAgICAgIHRoaXMubGF0ZXN0U3RhdGUgPSBzdGF0ZTtcbiAgICAgICAgICAgIHJldHVybiBzdGF0ZTtcbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgIGZvciAobGV0IGZldGNoIG9mIGZldGNoZXMpIHtcbiAgICAgICAgICAgICAgICBmZXRjaC5wcm9iZS5kaXNwb3NlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKiogQ2xpZW50c2lkZSwgYSBjb25maWcgd2l0aCBwdWJsaWMgc291cmNlcyBpcyBzZXJ2ZWQgZW50aXJlbHkgb3ZlciBwbGFpbiBVUkwgZG93bmxvYWRzIC0gbm8gQVBJIGNvbm5lY3Rpb24sIG5vIGFjY2VzcyBncmFudCwgYW5kIG5vIHdyaXRpbmcuIGRpcmVjdENvbm5lY3Qgb3B0cyBvdXQgb2YgdGhhdC4gKi9cbiAgICBwcml2YXRlIGlzUmVhZE9ubHkoY29uZmlnOiBSZW1vdGVDb25maWcpOiBib29sZWFuIHtcbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucz8uZGlyZWN0Q29ubmVjdCB8fCBpc05vZGUoKSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICByZXR1cm4gY29uZmlnLnNvdXJjZXMubWFwKG5vcm1hbGl6ZVNvdXJjZSkuc29tZSh4ID0+IHgucHVibGljKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIGNyZWF0ZUNoYWluU291cmNlKHNvdXJjZUNvbmZpZzogU291cmNlQ29uZmlnLCByZWFkT25seTogYm9vbGVhbik6IFByb21pc2U8U291cmNlV3JhcHBlcj4ge1xuICAgICAgICBsZXQgc291cmNlID0gYXdhaXQgU291cmNlV3JhcHBlci5jcmVhdGUoc291cmNlQ29uZmlnLCB7IHJlYWRPbmx5IH0pO1xuICAgICAgICBzb3VyY2Uuc3RhcnRQaW5naW5nKCk7XG4gICAgICAgIHJldHVybiBzb3VyY2U7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBidWlsZFNvdXJjZXMoY29uZmlnOiBSZW1vdGVDb25maWcpOiBQcm9taXNlPFNvdXJjZVdyYXBwZXJbXT4ge1xuICAgICAgICBsZXQgcmVhZE9ubHkgPSB0aGlzLmlzUmVhZE9ubHkoY29uZmlnKTtcbiAgICAgICAgbGV0IHNvdXJjZXM6IFNvdXJjZVdyYXBwZXJbXSA9IFtdO1xuICAgICAgICBmb3IgKGxldCBzb3VyY2VDb25maWcgb2YgY29uZmlnLnNvdXJjZXMubWFwKG5vcm1hbGl6ZVNvdXJjZSkpIHtcbiAgICAgICAgICAgIHNvdXJjZXMucHVzaChhd2FpdCB0aGlzLmNyZWF0ZUNoYWluU291cmNlKHNvdXJjZUNvbmZpZywgcmVhZE9ubHkpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc291cmNlcztcbiAgICB9XG5cbiAgICBwcml2YXRlIHN0YXJ0Q29uZmlnUG9sbCgpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMucG9sbFRpbWVyIHx8IHRoaXMuZGlzcG9zZWQpIHJldHVybjtcbiAgICAgICAgdGhpcy5wb2xsVGltZXIgPSBzZXRJbnRlcnZhbCgoKSA9PiB7XG4gICAgICAgICAgICB2b2lkIHRoaXMucmVmcmVzaEFjdGl2ZUNvbmZpZygpLmNhdGNoKChlOiBFcnJvcikgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYENoZWNraW5nIGZvciBhIG5ldyBzdG9yYWdlIHJvdXRpbmcgY29uZmlnIGZhaWxlZCBmb3IgJHt0aGlzLmdldERlYnVnTmFtZSgpfTogJHtlLnN0YWNrID8/IGV9YCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSwgQ09ORklHX1BPTExfSU5URVJWQUwpO1xuICAgICAgICAodGhpcy5wb2xsVGltZXIgYXMgeyB1bnJlZj86ICgpID0+IHZvaWQgfSkudW5yZWY/LigpO1xuICAgIH1cblxuICAgIC8vIERlZHVwbGljYXRlcyBjb25jdXJyZW50IHJlZnJlc2hlcyAodGhlIHBvbGwgdGltZXIgYW5kIHdyb25nLXRhcmdldCB3cml0ZSByZXRyaWVzIHNoYXJlIHRoaXMpXG4gICAgcHJpdmF0ZSBjb25maWdSZWZyZXNoSW5GbGlnaHQ6IFByb21pc2U8dm9pZD4gfCB1bmRlZmluZWQ7XG4gICAgcHJpdmF0ZSByZWZyZXNoQWN0aXZlQ29uZmlnKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBpZiAoIXRoaXMuY29uZmlnUmVmcmVzaEluRmxpZ2h0KSB7XG4gICAgICAgICAgICB0aGlzLmNvbmZpZ1JlZnJlc2hJbkZsaWdodCA9IHRoaXMuY2hlY2tGb3JOZXdDb25maWcoKS5maW5hbGx5KCgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmNvbmZpZ1JlZnJlc2hJbkZsaWdodCA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLmNvbmZpZ1JlZnJlc2hJbkZsaWdodDtcbiAgICB9XG5cbiAgICAvLyBUaGUgbGF0ZXN0IGNvbmZpZywgYXMgdGhlIHNlcnZlciBJTlRFUlBSRVRTIGl0OiBnZXRDb25maWcgY2FycmllcyBpbi1tZW1vcnkgb3ZlcmxheXMgKGRlcGxveVxuICAgIHByaXZhdGUgYXN5bmMgZmV0Y2hMYXRlc3RDb25maWcoc3RhdGU6IENoYWluU3RhdGUpOiBQcm9taXNlPFJlbW90ZUNvbmZpZyB8IHVuZGVmaW5lZD4ge1xuICAgICAgICBsZXQgZXJyb3JzOiBzdHJpbmdbXSA9IFtdO1xuICAgICAgICBmb3IgKGxldCBzb3VyY2Ugb2Ygc3RhdGUuc291cmNlcykge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBsZXQgbGF0ZXN0ID0gYXdhaXQgc291cmNlLnJlYWRSb3V0aW5nQ29uZmlnKCk7XG4gICAgICAgICAgICAgICAgaWYgKGxhdGVzdCkgcmV0dXJuIG5vcm1hbGl6ZVJlbW90ZUNvbmZpZyhsYXRlc3QpO1xuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgIGVycm9ycy5wdXNoKGAke3NvdXJjZS5jb25maWcudXJsfTogJHsoZSBhcyBFcnJvcikuc3RhY2sgPz8gZX1gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoZXJyb3JzLmxlbmd0aCA9PT0gc3RhdGUuc291cmNlcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgTm8gc3RvcmFnZSBzb3VyY2UgY291bGQgZ2l2ZSB1cyB0aGUgcm91dGluZyBjb25maWcgZm9yICR7dGhpcy5nZXREZWJ1Z05hbWUoKX06ICR7ZXJyb3JzLmpvaW4oXCIgfCBcIil9YCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIGNoZWNrRm9yTmV3Q29uZmlnKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBpZiAodGhpcy5kaXNwb3NlZCB8fCAhdGhpcy5zdGF0ZVByb21pc2UpIHJldHVybjtcbiAgICAgICAgbGV0IHN0YXRlOiBDaGFpblN0YXRlO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgc3RhdGUgPSBhd2FpdCB0aGlzLnN0YXRlUHJvbWlzZTtcbiAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGxhdGVzdCA9IGF3YWl0IHRoaXMuZmV0Y2hMYXRlc3RDb25maWcoc3RhdGUpO1xuICAgICAgICBpZiAoIWxhdGVzdCkgcmV0dXJuO1xuICAgICAgICBhd2FpdCB0aGlzLmFkb3B0TmV3Q29uZmlnKHN0YXRlLCBsYXRlc3QpO1xuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgYWRvcHROZXdDb25maWcoc3RhdGU6IENoYWluU3RhdGUsIGxhdGVzdDogUmVtb3RlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGlmIChKU09OLnN0cmluZ2lmeShsYXRlc3QpID09PSBKU09OLnN0cmluZ2lmeShzdGF0ZS5jb25maWcpKSByZXR1cm47XG4gICAgICAgIGxldCByZWNlaXZlZCA9IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKTtcbiAgICAgICAgbGV0IG9ubHlJbnRlcm1lZGlhdGVzQ2hhbmdlZCA9IEpTT04uc3RyaW5naWZ5KHJlc29sdmVJbnRlcm1lZGlhdGVTb3VyY2VzKGxhdGVzdCkpID09PSBKU09OLnN0cmluZ2lmeShyZXNvbHZlSW50ZXJtZWRpYXRlU291cmNlcyhzdGF0ZS5jb25maWcpKTtcbiAgICAgICAgaWYgKG9ubHlJbnRlcm1lZGlhdGVzQ2hhbmdlZCkge1xuICAgICAgICAgICAgY29uc29sZS5sb2coYFN0b3JhZ2Ugcm91dGluZyBzd2l0Y2hvdmVyIHdpbmRvd3MgY2hhbmdlZCAodmVyc2lvbiAke2dldENvbmZpZ1ZlcnNpb24oc3RhdGUuY29uZmlnKX0gLT4gJHtnZXRDb25maWdWZXJzaW9uKGxhdGVzdCl9KSwgcmVjZWl2ZWQgJHtyZWNlaXZlZH0sIHJlYnVpbGRpbmcgc291cmNlcy4gTmV3IGNvbmZpZzogJHtKU09OLnN0cmluZ2lmeShsYXRlc3QpfWApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc29sZS5sb2coYFN0b3JhZ2Ugcm91dGluZyBjb25maWcgY2hhbmdlZCAodmVyc2lvbiAke2dldENvbmZpZ1ZlcnNpb24oc3RhdGUuY29uZmlnKX0gLT4gJHtnZXRDb25maWdWZXJzaW9uKGxhdGVzdCl9KSwgcmVjZWl2ZWQgJHtyZWNlaXZlZH0sIHJlYnVpbGRpbmcgc291cmNlcy4gTmV3IGNvbmZpZzogJHtKU09OLnN0cmluZ2lmeShsYXRlc3QpfWApO1xuICAgICAgICB9XG4gICAgICAgIGxldCBzdHJpcHBlZEtleSA9IChjb25maWc6IFNvdXJjZUNvbmZpZykgPT4gSlNPTi5zdHJpbmdpZnkoeyAuLi5jb25maWcsIHZhbGlkV2luZG93OiB1bmRlZmluZWQgfSk7XG4gICAgICAgIGxldCBvbGRCeUNvbmZpZyA9IG5ldyBNYXA8c3RyaW5nLCBTb3VyY2VXcmFwcGVyW10+KCk7XG4gICAgICAgIGZvciAobGV0IHNvdXJjZSBvZiBzdGF0ZS5zb3VyY2VzKSB7XG4gICAgICAgICAgICBsZXQga2V5ID0gc3RyaXBwZWRLZXkoc291cmNlLmNvbmZpZyk7XG4gICAgICAgICAgICBsZXQgbGlzdCA9IG9sZEJ5Q29uZmlnLmdldChrZXkpO1xuICAgICAgICAgICAgaWYgKCFsaXN0KSB7XG4gICAgICAgICAgICAgICAgbGlzdCA9IFtdO1xuICAgICAgICAgICAgICAgIG9sZEJ5Q29uZmlnLnNldChrZXksIGxpc3QpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGlzdC5wdXNoKHNvdXJjZSk7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHJlYWRPbmx5ID0gdGhpcy5pc1JlYWRPbmx5KGxhdGVzdCk7XG4gICAgICAgIGxldCBzb3VyY2VzOiBTb3VyY2VXcmFwcGVyW10gPSBbXTtcbiAgICAgICAgZm9yIChsZXQgc291cmNlQ29uZmlnIG9mIGxhdGVzdC5zb3VyY2VzLm1hcChub3JtYWxpemVTb3VyY2UpKSB7XG4gICAgICAgICAgICBsZXQgb2xkID0gb2xkQnlDb25maWcuZ2V0KHN0cmlwcGVkS2V5KHNvdXJjZUNvbmZpZykpPy5zaGlmdCgpO1xuICAgICAgICAgICAgaWYgKG9sZCkge1xuICAgICAgICAgICAgICAgIG9sZC51cGRhdGVWYWxpZFdpbmRvdyhzb3VyY2VDb25maWcudmFsaWRXaW5kb3cpO1xuICAgICAgICAgICAgICAgIHNvdXJjZXMucHVzaChvbGQpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBzb3VyY2VzLnB1c2goYXdhaXQgdGhpcy5jcmVhdGVDaGFpblNvdXJjZShzb3VyY2VDb25maWcsIHJlYWRPbmx5KSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChsZXQgbGVmdG92ZXJzIG9mIG9sZEJ5Q29uZmlnLnZhbHVlcygpKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBsZWZ0b3ZlciBvZiBsZWZ0b3ZlcnMpIHtcbiAgICAgICAgICAgICAgICBsZWZ0b3Zlci5kaXNwb3NlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5hY3RpdmVDb25maWcgPSBsYXRlc3Q7XG4gICAgICAgIGxldCBuZXdTdGF0ZTogQ2hhaW5TdGF0ZSA9IHsgY29uZmlnOiBsYXRlc3QsIHNvdXJjZXMgfTtcbiAgICAgICAgdGhpcy5sYXRlc3RTdGF0ZSA9IG5ld1N0YXRlO1xuICAgICAgICB0aGlzLnN0YXRlUHJvbWlzZSA9IFByb21pc2UucmVzb2x2ZShuZXdTdGF0ZSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBsYXN0QXZhaWxhYmlsaXR5UmVjaGVjayA9IDA7XG4gICAgcHJpdmF0ZSBhdmFpbGFiaWxpdHlSZWNoZWNrSW5GbGlnaHQ6IFByb21pc2U8dm9pZD4gfCB1bmRlZmluZWQ7XG4gICAgcHJpdmF0ZSByZWNoZWNrQXZhaWxhYmlsaXR5KCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBpZiAodGhpcy5hdmFpbGFiaWxpdHlSZWNoZWNrSW5GbGlnaHQpIHJldHVybiB0aGlzLmF2YWlsYWJpbGl0eVJlY2hlY2tJbkZsaWdodDtcbiAgICAgICAgaWYgKERhdGUubm93KCkgLSB0aGlzLmxhc3RBdmFpbGFiaWxpdHlSZWNoZWNrIDwgQVZBSUxBQklMSVRZX1JFQ0hFQ0tfVEhST1RUTEUpIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbiAgICAgICAgdGhpcy5sYXN0QXZhaWxhYmlsaXR5UmVjaGVjayA9IERhdGUubm93KCk7XG4gICAgICAgIHRoaXMuYXZhaWxhYmlsaXR5UmVjaGVja0luRmxpZ2h0ID0gdGhpcy5yZWNoZWNrQXZhaWxhYmlsaXR5Tm93KCkuZmluYWxseSgoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmF2YWlsYWJpbGl0eVJlY2hlY2tJbkZsaWdodCA9IHVuZGVmaW5lZDtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB0aGlzLmF2YWlsYWJpbGl0eVJlY2hlY2tJbkZsaWdodDtcbiAgICB9XG4gICAgcHJpdmF0ZSBhc3luYyByZWNoZWNrQXZhaWxhYmlsaXR5Tm93KCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBpZiAodGhpcy5kaXNwb3NlZCB8fCAhdGhpcy5zdGF0ZVByb21pc2UpIHJldHVybjtcbiAgICAgICAgbGV0IHN0YXRlOiBDaGFpblN0YXRlO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgc3RhdGUgPSBhd2FpdCB0aGlzLnN0YXRlUHJvbWlzZTtcbiAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc29sZS5sb2coYEV2ZXJ5IHN0b3JhZ2Ugc291cmNlIGZhaWxlZCBmb3IgJHt0aGlzLmdldERlYnVnTmFtZSgpfTsgcmUtY29udGFjdGluZyBhbGwgJHtzdGF0ZS5zb3VyY2VzLmxlbmd0aH0gc291cmNlcyAocm91dGluZyByZS1yZWFkICsgY29ubmVjdGlvbiByZS1hdHRlbXB0KWApO1xuICAgICAgICBsZXQgcmVzdWx0cyA9IGF3YWl0IFByb21pc2UuYWxsKHN0YXRlLnNvdXJjZXMubWFwKGFzeW5jIHNvdXJjZSA9PiB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHJldHVybiBhd2FpdCBzb3VyY2UucmVhZFJvdXRpbmdDb25maWcoKTtcbiAgICAgICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pKTtcbiAgICAgICAgbGV0IGxhdGVzdCA9IHJlc3VsdHMuZmluZCh4ID0+IHgpO1xuICAgICAgICBpZiAoIWxhdGVzdCkgcmV0dXJuO1xuICAgICAgICBhd2FpdCB0aGlzLmFkb3B0TmV3Q29uZmlnKHN0YXRlLCBsYXRlc3QpO1xuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgcnVuPFQ+KHN0YXRlOiBDaGFpblN0YXRlLCBjb25maWc6IHsgYXBpT25seT86IGJvb2xlYW47IHdyaXRlPzogYm9vbGVhbjsgcm91dGU/OiBudW1iZXI7IG5vRmFsbGJhY2tzPzogYm9vbGVhbjsgZmFzdD86IGJvb2xlYW47IHRpbWVvdXQ/OiBTbWFydFRpbWVvdXQgfSwgcnVuOiAoYXJjaGl2ZXM6IElBcmNoaXZlcywgc291cmNlVXJsOiBzdHJpbmcpID0+IFByb21pc2U8VD4pOiBQcm9taXNlPFQ+IHtcbiAgICAgICAgaWYgKGNvbmZpZy5mYXN0ICYmIGNvbmZpZy5ub0ZhbGxiYWNrcykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBmYXN0IGFuZCBub0ZhbGxiYWNrcyBhcmUgbXV0dWFsbHkgZXhjbHVzaXZlIGZvciAke3RoaXMuZ2V0RGVidWdOYW1lKCl9OiBub0ZhbGxiYWNrcyBvbmx5IGNvbnNpZGVycyBvbmUgc291cmNlICh0aGUgd3JpdGUgbm9kZSksIHNvIHRoZXJlIGlzIG5vIG9yZGVyIHRvIHNwZWVkIHVwYCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNvbmZpZy53cml0ZSB8fCBjb25maWcubm9GYWxsYmFja3MpIHtcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCB0aGlzLnJ1blByaW1hcnkoY29uZmlnLCBydW4pO1xuICAgICAgICB9XG4gICAgICAgIGxldCByZWNoZWNrZWRBdmFpbGFiaWxpdHkgPSBmYWxzZTtcbiAgICAgICAgd2hpbGUgKHRydWUpIHtcbiAgICAgICAgICAgIGxldCBlcnJvcnM6IHN0cmluZ1tdID0gW107XG4gICAgICAgICAgICBsZXQgY2FuZGlkYXRlcyA9IHN0YXRlLnNvdXJjZXMuZmlsdGVyKHNvdXJjZSA9PlxuICAgICAgICAgICAgICAgIChjb25maWcucm91dGUgPT09IHVuZGVmaW5lZCB8fCByb3V0ZUNvbnRhaW5zKHNvdXJjZS5jb25maWcucm91dGUsIGNvbmZpZy5yb3V0ZSkpXG4gICAgICAgICAgICAgICAgJiYgY29uZmlnV2luZG93Q3VycmVudChzb3VyY2UuY29uZmlnKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGxldCBvcmRlcmVkID0gcHJlZmVyVXNhYmxlKGNhbmRpZGF0ZXMpO1xuICAgICAgICAgICAgaWYgKGNvbmZpZy5mYXN0KSB7XG4gICAgICAgICAgICAgICAgb3JkZXJlZCA9IFsuLi5vcmRlcmVkXTtcbiAgICAgICAgICAgICAgICBzb3J0KG9yZGVyZWQsIHggPT4geC5nZXRMYXRlbmN5KCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZm9yIChsZXQgc291cmNlIG9mIG9yZGVyZWQpIHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoY29uZmlnLmFwaU9ubHkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBhcGkgPSBzb3VyY2UuYXBpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFhcGkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcnMucHVzaChgJHtzb3VyY2UuY29uZmlnLnVybH0gaGFzIFVSTC1vbmx5IGFjY2Vzcywgd2hpY2ggY2Fubm90IHNlcnZlIHRoaXMgb3BlcmF0aW9uYCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgcnVuKGFwaSwgc291cmNlLmNvbmZpZy51cmwpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmFwcGx5U21hcnRUaW1lb3V0KGNvbmZpZy50aW1lb3V0LCBzb3VyY2UsICgpID0+IHNvdXJjZS5yZWFkKGFyY2hpdmVzID0+IHJ1bihhcmNoaXZlcywgc291cmNlLmNvbmZpZy51cmwpKSk7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgbWVzc2FnZSA9IFN0cmluZygoZSBhcyBFcnJvcikuc3RhY2sgPz8gZSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChtZXNzYWdlLmluY2x1ZGVzKFNNQVJUX1RJTUVPVVRfTUFSS0VSKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihgU291cmNlIHRpbWVkIG91dCBmb3IgJHt0aGlzLmdldERlYnVnTmFtZSgpfSwgY29udGludWluZyB3aXRoIHRoZSBuZXh0IHNvdXJjZTogJHttZXNzYWdlfWApO1xuICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JzLnB1c2gobWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAoc291cmNlLmlzQ29ubmVjdGVkKCkpIHRocm93IGU7XG4gICAgICAgICAgICAgICAgICAgIHNvdXJjZS5ub3RlRmFpbHVyZSgpO1xuICAgICAgICAgICAgICAgICAgICBlcnJvcnMucHVzaChtZXNzYWdlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIXJlY2hlY2tlZEF2YWlsYWJpbGl0eSkge1xuICAgICAgICAgICAgICAgIHJlY2hlY2tlZEF2YWlsYWJpbGl0eSA9IHRydWU7XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5yZWNoZWNrQXZhaWxhYmlsaXR5KCk7XG4gICAgICAgICAgICAgICAgc3RhdGUgPSBhd2FpdCB0aGlzLmdldFN0YXRlKCk7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEFsbCBzb3VyY2VzIGZhaWxlZCBmb3IgJHt0aGlzLmdldERlYnVnTmFtZSgpfSR7Y29uZmlnLnJvdXRlICE9PSB1bmRlZmluZWQgJiYgYCAocm91dGUgJHtjb25maWcucm91dGV9KWAgfHwgXCJcIn06ICR7ZXJyb3JzLmpvaW4oXCIgfCBcIikgfHwgXCJubyBzb3VyY2VzIGF2YWlsYWJsZVwifWApO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gV3JpdGVzIGFuZCBub0ZhbGxiYWNrcyByZWFkcyBhcmUgdGhlIHNhbWUgY2FzZTogdGFrZSB0aGUgYXV0aG9yaXRhdGl2ZSBub2RlIC0gc3RyaWN0bHkgdGhlIGZpcnN0IHNvdXJjZSBtYXRjaGluZyB0aGUgcm91dGUgYW5kIHZhbGlkIHdpbmRvdywgd2hldGhlciBpdCBpcyB1cCBvciBkb3duIC0gYW5kIHVzZSBpdCwgbmV2ZXIgZmFsbGluZyBiYWNrIHRvIGFub3RoZXIgbm9kZS4gSXQncyBpbXBvcnRhbnQgdGhhdCB3cml0aW5nIGFsd2F5cyBhY2Nlc3NlcyB0aGUgc2FtZSBub2RlIGV2ZXJ5d2hlcmUsIGV2ZW4gaWYgdGhhdCBub2RlIGlzIGRvd24gLSBvdGhlcndpc2Ugd2UncmUganVzdCB3cml0aW5nIGludG8gdGhlIHZvaWQsIGFuZCB3aG8ga25vd3MgaWYgdGhlIHdyaXRlcyB3aWxsIGV2ZW4gYmUgYWNjZXB0ZWQsIG9yIGNsb2JiZXJlZCwgb3Igd2hhdDsgYW5kIG5vRmFsbGJhY2tzIHJlYWRzIHdhbnQgdGhlIHNhbWUgbm9kZSBwcmVjaXNlbHkgYmVjYXVzZSBpdCBpcyB0aGUgb25lIHdyaXRlcyB0YXJnZXQuIEEgc2xvdyBjYWxsIGlzIGFsbW9zdCBhbHdheXMgYmV0dGVyIHRoYW4gdGhyb3dpbmcsIHNvIGEgZmFpbGluZyBwcmltYXJ5IGlzIHJldHJpZWQgKHRoZSBTQU1FIG5vZGUsIHJlLXJlc29sdmVkIGVhY2ggYXR0ZW1wdCBzaW5jZSBhIGNvbmZpZyByZWZyZXNoIGNhbiBjaGFuZ2Ugd2hpY2ggc291cmNlIGlzIHByaW1hcnkpIHVudGlsIHRoZSBkZWFkbGluZSwgdGhlbiB0aHJvd3MuXG4gICAgcHJpdmF0ZSBhc3luYyBydW5QcmltYXJ5PFQ+KGNvbmZpZzogeyB3cml0ZT86IGJvb2xlYW47IHJvdXRlPzogbnVtYmVyOyB0aW1lb3V0PzogU21hcnRUaW1lb3V0IH0sIHJ1bjogKGFyY2hpdmVzOiBJQXJjaGl2ZXMsIHNvdXJjZVVybDogc3RyaW5nKSA9PiBQcm9taXNlPFQ+KTogUHJvbWlzZTxUPiB7XG4gICAgICAgIGxldCByZXRyaWVkV3JvbmdXaW5kb3cgPSBmYWxzZTtcbiAgICAgICAgbGV0IHJldHJpZWRXcm9uZ1JvdXRlID0gZmFsc2U7XG4gICAgICAgIGxldCBkZWFkbGluZSA9IERhdGUubm93KCkgKyBQUklNQVJZX1JFVFJZX1RJTUVPVVQ7XG4gICAgICAgIGxldCBhdHRlbXB0ID0gMDtcbiAgICAgICAgd2hpbGUgKHRydWUpIHtcbiAgICAgICAgICAgIGF0dGVtcHQrKztcbiAgICAgICAgICAgIGxldCBhdHRlbXB0U3RhcnQgPSBEYXRlLm5vdygpO1xuICAgICAgICAgICAgbGV0IHN0YXRlID0gYXdhaXQgdGhpcy5nZXRTdGF0ZSgpO1xuICAgICAgICAgICAgbGV0IHRhcmdldCA9IHN0YXRlLnNvdXJjZXMuZmluZCh4ID0+IGNvbmZpZ0FjY2VwdHNXcml0ZXMoeC5jb25maWcpICYmIChjb25maWcucm91dGUgPT09IHVuZGVmaW5lZCB8fCByb3V0ZUNvbnRhaW5zKHguY29uZmlnLnJvdXRlLCBjb25maWcucm91dGUpKSk7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGlmICghdGFyZ2V0KSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgTm8gc291cmNlIGlzIHRoZSAke2NvbmZpZy53cml0ZSAmJiBcIndyaXRlIHRhcmdldFwiIHx8IFwicHJpbWFyeSByZWFkIHNvdXJjZVwifSBmb3IgJHt0aGlzLmdldERlYnVnTmFtZSgpfSR7Y29uZmlnLnJvdXRlICE9PSB1bmRlZmluZWQgJiYgYCAocm91dGUgJHtjb25maWcucm91dGV9KWAgfHwgXCJcIn0gKGV2ZXJ5IHNvdXJjZSBpcyBvdXRzaWRlIGl0cyB2YWxpZCB3aW5kb3cgb3Igb3V0c2lkZSB0aGUga2V5J3Mgcm91dGUpYCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnN0IHByaW1hcnkgPSB0YXJnZXQ7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuYXBwbHlTbWFydFRpbWVvdXQoY29uZmlnLnRpbWVvdXQsIHByaW1hcnksICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNvbmZpZy53cml0ZSkgcmV0dXJuIHByaW1hcnkud3JpdGUoYXJjaGl2ZXMgPT4gcnVuKGFyY2hpdmVzLCBwcmltYXJ5LmNvbmZpZy51cmwpKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHByaW1hcnkucmVhZChhcmNoaXZlcyA9PiBydW4oYXJjaGl2ZXMsIHByaW1hcnkuY29uZmlnLnVybCkpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgIGxldCBtZXNzYWdlID0gU3RyaW5nKChlIGFzIEVycm9yKS5zdGFjayA/PyBlKTtcbiAgICAgICAgICAgICAgICBpZiAobWVzc2FnZS5pbmNsdWRlcyhTVE9SQUdFX1dST05HX1ZBTElEX1dJTkRPVykgJiYgIXJldHJpZWRXcm9uZ1dpbmRvdykge1xuICAgICAgICAgICAgICAgICAgICByZXRyaWVkV3JvbmdXaW5kb3cgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnByZXBhcmVXcm9uZ1RhcmdldFJldHJ5KHN0YXRlLCBcIndpbmRvd1wiKTtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChtZXNzYWdlLmluY2x1ZGVzKFNUT1JBR0VfV1JPTkdfUk9VVEUpICYmICFyZXRyaWVkV3JvbmdSb3V0ZSkge1xuICAgICAgICAgICAgICAgICAgICByZXRyaWVkV3JvbmdSb3V0ZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMucHJlcGFyZVdyb25nVGFyZ2V0UmV0cnkoc3RhdGUsIFwicm91dGVcIik7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAodGFyZ2V0ICYmICF0YXJnZXQuaXNDb25uZWN0ZWQoKSkgdGFyZ2V0Lm5vdGVGYWlsdXJlKCk7XG4gICAgICAgICAgICAgICAgaWYgKCFjb25maWcud3JpdGUgJiYgdGFyZ2V0ICYmIChhdHRlbXB0ID09PSAxIHx8IGF0dGVtcHQgJSAzID09PSAwKSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBUaGUgcmVhc29uIHdlIHRyeSB0aGUgSFRUUCByZXF1ZXN0OiBodHRwc1JlcXVlc3QgaGFzIGJldHRlciBETlMgcmV0cnlpbmcgY2FwYWJpbGl0aWVzIHRoYW4gb3VyIFdlYlNvY2tldCBzZXJ2ZXIgKHdlIGhhdmUgbW9yZSBjb250cm9sIG92ZXIgaXQpLCBzbyBqdXN0IHVzaW5nIGl0IGNhbiBmaXggc29tZSBETlMgaXNzdWVzLCB3aGljaCBjYW4gcHJvcGFnYXRlIHRvIGZpeCB0aGUgV2ViU29ja2V0IGNvbm5lY3Rpb24uIEl0IGlzIHN0aWxsIHRoZSBwcmltYXJ5IHNvdXJjZSdzIG93biBkYXRhLCBzbyB0aGUgbm8tZmFsbGJhY2sgc2VtYW50aWNzIGhvbGQgLSBhbmQgQXJjaGl2ZXNVcmwgaGFzIG5vIHNldHVwIGNvc3QsIHNvIG1ha2luZyBvbmUgb24gdGhlIHNwb3QgaXMgZmluZS5cbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhd2FpdCBydW4odGFyZ2V0LnVybCB8fCBuZXcgQXJjaGl2ZXNVcmwoZ2V0QnVja2V0QmFzZVVybCh0YXJnZXQuY29uZmlnLnVybCkpLCB0YXJnZXQuY29uZmlnLnVybCk7XG4gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gQmVzdC1lZmZvcnQ6IHRoZSBwcmltYXJ5J3MgZXJyb3IgKHRocm93biBhdCB0aGUgZGVhZGxpbmUpIGlzIHRoZSByZWFsIG9uZVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChEYXRlLm5vdygpID49IGRlYWRsaW5lKSB0aHJvdyBlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gQXQgbW9zdCBvbmUgYXR0ZW1wdCBwZXIgaW50ZXJ2YWwsIGluIGNhc2UgdGhlIGZhaWx1cmUgaXMgZmFzdFxuICAgICAgICAgICAgYXdhaXQgZGVsYXkoTWF0aC5tYXgoMCwgYXR0ZW1wdFN0YXJ0ICsgUFJJTUFSWV9SRVRSWV9ERUxBWSAtIERhdGUubm93KCkpKTtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMucmVjaGVja0F2YWlsYWJpbGl0eSgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqIFJhY2VzIGNhbGwgYWdhaW5zdCBhIHNpemUtYmFzZWQgZGVhZGxpbmUuIFVwbG9hZHMga25vdyB0aGVpciBzaXplIHVwZnJvbnQ7IGdldHMgYXJlIGdpdmVuIFNNQVJUX1RJTUVPVVRfUFJPQkUgdG8gcHJvZHVjZSBhbnl0aGluZywgYW5kIG9ubHkgdGhlbiBpcyB0aGUgZmlsZSdzIGluZm8gZmV0Y2hlZCAoZnJvbSB0aGUgc2FtZSBzb3VyY2UsIGl0c2VsZiB0aW1lLWxpbWl0ZWQpIHRvIHNpemUgdGhlIGRlYWRsaW5lIC0gbWVhc3VyZWQgZnJvbSB0aGUgY2FsbCdzIHN0YXJ0LCBzbyBhIHNvdXJjZSB0aGF0IHdhcyBzbG93IGJlZm9yZSB0aGUgcHJvYmUgZG9lc24ndCBnZXQgdGhlIGZ1bGwgYWxsb3dhbmNlIGFnYWluLiBUaW1lZC1vdXQgY2FsbHMga2VlcCBydW5uaW5nIGluIHRoZSBiYWNrZ3JvdW5kICh0aGV5IGNhbm5vdCBiZSBjYW5jZWxsZWQpIGJ1dCB0aGVpciBldmVudHVhbCByZXN1bHQgaXMgaWdub3JlZC4gKi9cbiAgICBwcml2YXRlIGFzeW5jIGFwcGx5U21hcnRUaW1lb3V0PFQ+KHRpbWVvdXQ6IFNtYXJ0VGltZW91dCB8IHVuZGVmaW5lZCwgc291cmNlOiBTb3VyY2VXcmFwcGVyLCBjYWxsOiAoKSA9PiBQcm9taXNlPFQ+KTogUHJvbWlzZTxUPiB7XG4gICAgICAgIGlmICghdGltZW91dCkgcmV0dXJuIGF3YWl0IGNhbGwoKTtcbiAgICAgICAgbGV0IHN0YXJ0ID0gRGF0ZS5ub3coKTtcbiAgICAgICAgbGV0IGNhbGxQcm9taXNlID0gY2FsbCgpO1xuICAgICAgICAvLyBBbiBhYmFuZG9uZWQgY2FsbCBtdXN0IG5vdCBzdXJmYWNlIGFuIHVuaGFuZGxlZCByZWplY3Rpb24gd2hlbiBpdCBldmVudHVhbGx5IGZhaWxzXG4gICAgICAgIGxldCBhYmFuZG9uID0gKCkgPT4gdm9pZCBjYWxsUHJvbWlzZS50aGVuKCgpID0+IHsgfSwgKCkgPT4geyB9KTtcbiAgICAgICAgaWYgKHRpbWVvdXQudXBsb2FkQnl0ZXMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgLy8gQSBmbGF0IGJhc2UgcGx1cyB0aGUgcHJlZGljdGVkIHRyYW5zZmVyIHRpbWUsIHNvIHRpbnkgdXBsb2FkcyBzdGlsbCBnZXQgdGhlIGZ1bGwgYmFzZSB3aW5kb3dcbiAgICAgICAgICAgIGxldCBhbGxvd2VkID0gU01BUlRfVElNRU9VVF9QUk9CRSArIHRpbWVvdXQudXBsb2FkQnl0ZXMgLyBTTUFSVF9USU1FT1VUX1VQTE9BRF9CWVRFU19QRVJfU0VDT05EICogMTAwMDtcbiAgICAgICAgICAgIGxldCByZXN1bHQgPSBhd2FpdCBQcm9taXNlLnJhY2UoW2NhbGxQcm9taXNlLnRoZW4odmFsdWUgPT4gKHsgdmFsdWUgfSkpLCBkZWxheShhbGxvd2VkKS50aGVuKCgpID0+IHVuZGVmaW5lZCldKTtcbiAgICAgICAgICAgIGlmIChyZXN1bHQpIHJldHVybiByZXN1bHQudmFsdWU7XG4gICAgICAgICAgICBhYmFuZG9uKCk7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7U01BUlRfVElNRU9VVF9NQVJLRVJ9ICR7dGltZW91dC5sYWJlbCB8fCBgVXBsb2FkIG9mICR7dGltZW91dC51cGxvYWRCeXRlc30gYnl0ZXNgfSB0byAke3NvdXJjZS5nZXREZWJ1Z05hbWUoKX0gdGltZWQgb3V0IGFmdGVyICR7RGF0ZS5ub3coKSAtIHN0YXJ0fW1zIChhbGxvd2VkICR7TWF0aC5yb3VuZChhbGxvd2VkKX1tczogJHtTTUFSVF9USU1FT1VUX1BST0JFfW1zIGJhc2UgcGx1cyB0cmFuc2ZlciBhdCBhbiBhc3N1bWVkICR7U01BUlRfVElNRU9VVF9VUExPQURfQllURVNfUEVSX1NFQ09ORH0gYnl0ZXMvcylgKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBwYXRoID0gdGltZW91dC5wYXRoO1xuICAgICAgICBpZiAocGF0aCA9PT0gdW5kZWZpbmVkKSByZXR1cm4gYXdhaXQgY2FsbFByb21pc2U7XG4gICAgICAgIGxldCBmaXJzdCA9IGF3YWl0IFByb21pc2UucmFjZShbY2FsbFByb21pc2UudGhlbih2YWx1ZSA9PiAoeyB2YWx1ZSB9KSksIGRlbGF5KFNNQVJUX1RJTUVPVVRfUFJPQkUpLnRoZW4oKCkgPT4gdW5kZWZpbmVkKV0pO1xuICAgICAgICBpZiAoZmlyc3QpIHJldHVybiBmaXJzdC52YWx1ZTtcbiAgICAgICAgbGV0IHByb2JlRXJyb3I6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICAgICAgbGV0IGluZm86IHsgc2l6ZTogbnVtYmVyIH0gfCB1bmRlZmluZWQ7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBpbmZvID0gYXdhaXQgUHJvbWlzZS5yYWNlKFtcbiAgICAgICAgICAgICAgICBzb3VyY2UucmVhZChhcmNoaXZlcyA9PiBhcmNoaXZlcy5nZXRJbmZvKHBhdGgpKS50aGVuKHggPT4gKHsgc2l6ZTogeCAmJiB4LnNpemUgfHwgMCB9KSksXG4gICAgICAgICAgICAgICAgZGVsYXkoU01BUlRfVElNRU9VVF9QUk9CRSkudGhlbigoKSA9PiB1bmRlZmluZWQpLFxuICAgICAgICAgICAgXSk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIHByb2JlRXJyb3IgPSBTdHJpbmcoKGUgYXMgRXJyb3IpLnN0YWNrID8/IGUpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghaW5mbykge1xuICAgICAgICAgICAgYWJhbmRvbigpO1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAke1NNQVJUX1RJTUVPVVRfTUFSS0VSfSBSZWFkIG9mICR7SlNPTi5zdHJpbmdpZnkocGF0aCl9IGZyb20gJHtzb3VyY2UuZ2V0RGVidWdOYW1lKCl9IHRpbWVkIG91dDogbm8gcmVzdWx0IGFmdGVyICR7RGF0ZS5ub3coKSAtIHN0YXJ0fW1zLCBhbmQgZ2V0SW5mbyAke3Byb2JlRXJyb3IgJiYgYGZhaWxlZCAoJHtwcm9iZUVycm9yfSlgIHx8IGBjb3VsZCBub3QgYW5zd2VyIHdpdGhpbiAke1NNQVJUX1RJTUVPVVRfUFJPQkV9bXMgZWl0aGVyYH1gKTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgYWxsb3dlZCA9IE1hdGgubWF4KFNNQVJUX1RJTUVPVVRfUFJPQkUsIGluZm8uc2l6ZSAvIFNNQVJUX1RJTUVPVVRfRE9XTkxPQURfQllURVNfUEVSX1NFQ09ORCAqIDEwMDApO1xuICAgICAgICBsZXQgcmVtYWluaW5nID0gc3RhcnQgKyBhbGxvd2VkIC0gRGF0ZS5ub3coKTtcbiAgICAgICAgaWYgKHJlbWFpbmluZyA+IDApIHtcbiAgICAgICAgICAgIGxldCBzZWNvbmQgPSBhd2FpdCBQcm9taXNlLnJhY2UoW2NhbGxQcm9taXNlLnRoZW4odmFsdWUgPT4gKHsgdmFsdWUgfSkpLCBkZWxheShyZW1haW5pbmcpLnRoZW4oKCkgPT4gdW5kZWZpbmVkKV0pO1xuICAgICAgICAgICAgaWYgKHNlY29uZCkgcmV0dXJuIHNlY29uZC52YWx1ZTtcbiAgICAgICAgfVxuICAgICAgICBhYmFuZG9uKCk7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgJHtTTUFSVF9USU1FT1VUX01BUktFUn0gUmVhZCBvZiAke0pTT04uc3RyaW5naWZ5KHBhdGgpfSAoJHtpbmZvLnNpemV9IGJ5dGVzKSBmcm9tICR7c291cmNlLmdldERlYnVnTmFtZSgpfSB0aW1lZCBvdXQgYWZ0ZXIgJHtEYXRlLm5vdygpIC0gc3RhcnR9bXMgKGFsbG93ZWQgJHtNYXRoLnJvdW5kKGFsbG93ZWQpfW1zIGZyb20gdGhlIGNhbGwncyBzdGFydCwgYXQgYW4gYXNzdW1lZCAke1NNQVJUX1RJTUVPVVRfRE9XTkxPQURfQllURVNfUEVSX1NFQ09ORH0gYnl0ZXMvcylgKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGxhc3RDb25maWdSZWZyZXNoID0gMDtcbiAgICBwcml2YXRlIGFzeW5jIHByZXBhcmVXcm9uZ1RhcmdldFJldHJ5KHN0YXRlOiBDaGFpblN0YXRlLCBraW5kOiBcIndpbmRvd1wiIHwgXCJyb3V0ZVwiKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGlmIChraW5kID09PSBcIndpbmRvd1wiKSB7XG4gICAgICAgICAgICBsZXQgbm93ID0gRGF0ZS5ub3coKTtcbiAgICAgICAgICAgIGxldCBuZWFyQm91bmRhcnkgPSBzdGF0ZS5zb3VyY2VzLnNvbWUoc291cmNlID0+IHNvdXJjZS5jb25maWcudmFsaWRXaW5kb3cuc29tZSh0ID0+IHQgPiAwICYmIHQgPCBOdW1iZXIuTUFYX1NBRkVfSU5URUdFUiAmJiBNYXRoLmFicyh0IC0gbm93KSA8PSBXUk9OR19UQVJHRVRfQk9VTkRBUllfV0lORE9XKSk7XG4gICAgICAgICAgICBpZiAobmVhckJvdW5kYXJ5KSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coYFdyaXRlIHJlamVjdGVkIGJ5ICR7dGhpcy5nZXREZWJ1Z05hbWUoKX06IHJhY2VkIGEgdmFsaWQgd2luZG93IGJvdW5kYXJ5OyB3YWl0aW5nICR7V1JPTkdfVEFSR0VUX0JPVU5EQVJZX1JFVFJZX0RFTEFZIC8gMTAwMH1zIGFuZCByZXRyeWluZ2ApO1xuICAgICAgICAgICAgICAgIGF3YWl0IGRlbGF5KFdST05HX1RBUkdFVF9CT1VOREFSWV9SRVRSWV9ERUxBWSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChEYXRlLm5vdygpIC0gdGhpcy5sYXN0Q29uZmlnUmVmcmVzaCA8IENPTkZJR19SRUZSRVNIX1RIUk9UVExFKSByZXR1cm47XG4gICAgICAgIHRoaXMubGFzdENvbmZpZ1JlZnJlc2ggPSBEYXRlLm5vdygpO1xuICAgICAgICBjb25zb2xlLmxvZyhgV3JpdGUgcmVqZWN0ZWQgYnkgJHt0aGlzLmdldERlYnVnTmFtZSgpfSAod3JvbmcgJHtraW5kfSk6IG91ciBjb25maWcgaXMgc3RhbGUgKGxpa2VseSBhIGRlcGxveSBzd2l0Y2hvdmVyKTsgcmVmcmVzaGluZyBpdCBhbmQgcmV0cnlpbmdgKTtcbiAgICAgICAgYXdhaXQgdGhpcy5yZWZyZXNoQWN0aXZlQ29uZmlnKCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyByZXF1ZXN0PFQ+KGNvbmZpZzogeyBhcGlPbmx5PzogYm9vbGVhbjsgd3JpdGU/OiBib29sZWFuOyByb3V0ZT86IG51bWJlcjsgbm9GYWxsYmFja3M/OiBib29sZWFuOyBmYXN0PzogYm9vbGVhbjsgdGltZW91dD86IFNtYXJ0VGltZW91dCB9LCBydW46IChhcmNoaXZlczogSUFyY2hpdmVzLCBzb3VyY2VVcmw6IHN0cmluZykgPT4gUHJvbWlzZTxUPik6IFByb21pc2U8VD4ge1xuICAgICAgICBsZXQgc3RhdGUgPSBhd2FpdCB0aGlzLmdldFN0YXRlKCk7XG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLnJ1bihzdGF0ZSwgY29uZmlnLCBydW4pO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyB3YWl0aW5nRm9yQWNjZXNzKCk6IFByb21pc2U8eyBsaW5rOiBzdHJpbmc7IG1hY2hpbmVJZDogc3RyaW5nOyBpcDogc3RyaW5nIH0gfCB1bmRlZmluZWQ+IHtcbiAgICAgICAgbGV0IHN0YXRlID0gYXdhaXQgdGhpcy5nZXRTdGF0ZSgpO1xuICAgICAgICBmb3IgKGxldCBzb3VyY2Ugb2Ygc3RhdGUuc291cmNlcykge1xuICAgICAgICAgICAgLy8gQSBzb3VyY2Ugd2hvc2Ugd2luZG93IGhhcyBwYXNzZWQgaXMgbmV2ZXIgcmVhZCBvciB3cml0dGVuIGFnYWluLCBzbyBpdHMgYWNjZXNzIHN0YXRlIGlzIGlycmVsZXZhbnQgLSBhbmQgYXNraW5nIGEgZGVhZCBpbnRlcm1lZGlhdGUgd291bGQganVzdCBoYW5nIG9yIHRocm93LiBGdXR1cmUgd2luZG93cyBETyBtYXR0ZXI6IGFjY2VzcyBzaG91bGQgYmUgZ3JhbnRlZCBiZWZvcmUgdGhlaXIgd2luZG93IHN0YXJ0cy5cbiAgICAgICAgICAgIGlmIChzb3VyY2UuY29uZmlnLnZhbGlkV2luZG93WzFdIDw9IERhdGUubm93KCkpIGNvbnRpbnVlO1xuICAgICAgICAgICAgaWYgKHNvdXJjZS5hcGkgaW5zdGFuY2VvZiBBcmNoaXZlc1JlbW90ZSkge1xuICAgICAgICAgICAgICAgIGxldCB3YWl0aW5nID0gYXdhaXQgc291cmNlLmFwaS53YWl0aW5nRm9yQWNjZXNzKCk7XG4gICAgICAgICAgICAgICAgaWYgKHdhaXRpbmcpIHJldHVybiB3YWl0aW5nO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGdldChmaWxlTmFtZTogc3RyaW5nLCBjb25maWc/OiBHZXRDb25maWcpOiBQcm9taXNlPEJ1ZmZlciB8IHVuZGVmaW5lZD4ge1xuICAgICAgICBsZXQgcmVzdWx0ID0gYXdhaXQgdGhpcy5nZXQyKGZpbGVOYW1lLCBjb25maWcpO1xuICAgICAgICByZXR1cm4gcmVzdWx0ICYmIHJlc3VsdC5kYXRhIHx8IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgLyoqIGdldDIsIGJ1dCB0cnlpbmcgc291cmNlcyBpbiBsYXRlbmN5IG9yZGVyIChmYXN0ZXN0IGZpcnN0KSBpbnN0ZWFkIG9mIGNvbmZpZyBvcmRlci4gV2hpbGUgdGhpcyBpcyBtdWNoIGZhc3RlciwgaXQgbWlnaHQgbWlzcyBpbW1lZGlhdGUgd3JpdGVzOiB0aGUgd3JpdGUgbm9kZSBpcyBubyBsb25nZXIgdHJpZWQgZmlyc3QsIHNvIGEgbGFnZ2luZyByZXBsaWNhIG1heSBhbnN3ZXIgd2l0aCBhIHNsaWdodGx5IG9sZGVyIHZhbHVlLiBFeGNsdXNpdmUgd2l0aCBub0ZhbGxiYWNrcyAod2hpY2ggb25seSBjb25zaWRlcnMgb25lIHNvdXJjZSAtIHRoZSB3cml0ZSBub2RlIC0gc28gdGhlcmUgaXMgbm8gb3JkZXIgdG8gc3BlZWQgdXApOyBwYXNzaW5nIGJvdGggdGhyb3dzLiAqL1xuICAgIHB1YmxpYyBhc3luYyBnZXRGYXN0KGZpbGVOYW1lOiBzdHJpbmcsIGNvbmZpZz86IEdldENvbmZpZyk6IFByb21pc2U8eyBkYXRhOiBCdWZmZXI7IHdyaXRlVGltZTogbnVtYmVyOyBzaXplOiBudW1iZXI7IHVybDogc3RyaW5nIH0gfCB7IGRhdGE/OiB1bmRlZmluZWQ7IHdyaXRlVGltZT86IHVuZGVmaW5lZDsgc2l6ZT86IHVuZGVmaW5lZDsgdXJsOiBzdHJpbmcgfT4ge1xuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5yZXF1ZXN0KHsgcm91dGU6IGdldFJvdXRlKGZpbGVOYW1lKSwgbm9GYWxsYmFja3M6IGNvbmZpZz8ubm9GYWxsYmFja3MsIGZhc3Q6IHRydWUsIHRpbWVvdXQ6IHsgcGF0aDogZmlsZU5hbWUgfSB9LCBhc3luYyAoYXJjaGl2ZXMsIHVybCkgPT4ge1xuICAgICAgICAgICAgbGV0IHJlc3VsdCA9IGF3YWl0IGFyY2hpdmVzLmdldDIoZmlsZU5hbWUsIGNvbmZpZyk7XG4gICAgICAgICAgICAvLyBFbXB0eSBkYXRhIGlzIGEgdG9tYnN0b25lLCBub3QgY29udGVudCAtIHNlZSBnZXQyXG4gICAgICAgICAgICBpZiAoIXJlc3VsdCB8fCAhcmVzdWx0LmRhdGEgfHwgIXJlc3VsdC5kYXRhLmxlbmd0aCAmJiAhY29uZmlnPy5pbmNsdWRlVG9tYnN0b25lcyAmJiAhKGNvbmZpZz8ucmFuZ2UgJiYgcmVzdWx0LnNpemUpKSByZXR1cm4geyB1cmwgfTtcbiAgICAgICAgICAgIHJldHVybiB7IGRhdGE6IHJlc3VsdC5kYXRhLCB3cml0ZVRpbWU6IHJlc3VsdC53cml0ZVRpbWUsIHNpemU6IHJlc3VsdC5zaXplLCB1cmwgfTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKiBBbHdheXMgcmVzb2x2ZXMgd2l0aCBhIHVybCAtIHRoZSBhdXRob3JpdHkgdGhhdCBhbnN3ZXJlZC4gQSB2YWx1ZSB0aGF0IGRvZXNuJ3QgZXhpc3QgaXMgc3RpbGwgYW4gYW5zd2VyIEZST00gYSBzZXJ2ZXIsIHNvIGl0IGNvbWVzIGJhY2sgYXMgeyB1cmwgfSB3aXRoIG5vIGRhdGEgKG5ldmVyIHBsYWluIHVuZGVmaW5lZCk7IGVycm9ycyBmcm9tIGV2ZXJ5IHNvdXJjZSB0aHJvdyBpbnN0ZWFkLiAqL1xuICAgIHB1YmxpYyBhc3luYyBnZXQyKGZpbGVOYW1lOiBzdHJpbmcsIGNvbmZpZz86IEdldENvbmZpZyk6IFByb21pc2U8eyBkYXRhOiBCdWZmZXI7IHdyaXRlVGltZTogbnVtYmVyOyBzaXplOiBudW1iZXI7IHVybDogc3RyaW5nIH0gfCB7IGRhdGE/OiB1bmRlZmluZWQ7IHdyaXRlVGltZT86IHVuZGVmaW5lZDsgc2l6ZT86IHVuZGVmaW5lZDsgdXJsOiBzdHJpbmcgfT4ge1xuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5yZXF1ZXN0KHsgcm91dGU6IGdldFJvdXRlKGZpbGVOYW1lKSwgbm9GYWxsYmFja3M6IGNvbmZpZz8ubm9GYWxsYmFja3MsIHRpbWVvdXQ6IHsgcGF0aDogZmlsZU5hbWUgfSB9LCBhc3luYyAoYXJjaGl2ZXMsIHVybCkgPT4ge1xuICAgICAgICAgICAgbGV0IHJlc3VsdCA9IGF3YWl0IGFyY2hpdmVzLmdldDIoZmlsZU5hbWUsIGNvbmZpZyk7XG4gICAgICAgICAgICAvLyBFbXB0eSBkYXRhIGlzIGEgdG9tYnN0b25lLCBub3QgY29udGVudCAodW5sZXNzIHRoZSBjYWxsZXIgYXNrZWQgZm9yIHRvbWJzdG9uZXMpIC0gYSByYW5nZWQgcmVhZCBvZiBhIFJFQUwgZmlsZSBjYW4gbGVnaXRpbWF0ZWx5IGJlIGVtcHR5IHRob3VnaCAocmFuZ2UgcGFzdCBFT0YpLCB3aGljaCB0aGUgdG90YWwgc2l6ZSBkaXN0aW5ndWlzaGVzXG4gICAgICAgICAgICBpZiAoIXJlc3VsdCB8fCAhcmVzdWx0LmRhdGEgfHwgIXJlc3VsdC5kYXRhLmxlbmd0aCAmJiAhY29uZmlnPy5pbmNsdWRlVG9tYnN0b25lcyAmJiAhKGNvbmZpZz8ucmFuZ2UgJiYgcmVzdWx0LnNpemUpKSByZXR1cm4geyB1cmwgfTtcbiAgICAgICAgICAgIHJldHVybiB7IGRhdGE6IHJlc3VsdC5kYXRhLCB3cml0ZVRpbWU6IHJlc3VsdC53cml0ZVRpbWUsIHNpemU6IHJlc3VsdC5zaXplLCB1cmwgfTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHB1YmxpYyBhc3luYyBnZXRJbmZvKGZpbGVOYW1lOiBzdHJpbmcsIGNvbmZpZz86IEdldEluZm9Db25maWcpOiBQcm9taXNlPHsgd3JpdGVUaW1lOiBudW1iZXI7IHNpemU6IG51bWJlcjsgdXJsOiBzdHJpbmcgfSB8IHVuZGVmaW5lZD4ge1xuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5yZXF1ZXN0KHsgcm91dGU6IGdldFJvdXRlKGZpbGVOYW1lKSB9LCBhc3luYyAoYXJjaGl2ZXMsIHVybCkgPT4ge1xuICAgICAgICAgICAgbGV0IHJlc3VsdCA9IGF3YWl0IGFyY2hpdmVzLmdldEluZm8oZmlsZU5hbWUsIGNvbmZpZyk7XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0ICYmIHsgLi4ucmVzdWx0LCB1cmwgfSB8fCB1bmRlZmluZWQ7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgc2VsZWN0Q292ZXJpbmdTb3VyY2VzKHN0YXRlOiBDaGFpblN0YXRlLCBjb25maWc/OiB7IGZhbGxiYWNrcz86IGJvb2xlYW47IGV4Y2x1ZGU/OiBTZXQ8U291cmNlV3JhcHBlcj4gfSk6IFNvdXJjZVdyYXBwZXJbXSB7XG4gICAgICAgIC8vIE5vIGNvb2xkb3duIHByZWZlcmVuY2UgYnkgZGVmYXVsdDogbGlzdGluZ3MgbXVzdCBjb21lIGZyb20gdGhlIEFVVEhPUklUQVRJVkUgc291cmNlcyAodGhlIGZpcnN0IG1hdGNoaW5nLCBsaWtlIGV2ZXJ5IHJlYWQgYW5kIHdyaXRlKSwgb3IgdGhleSBtaXNzIGp1c3Qtd3JpdHRlbiBkYXRhLiBXaXRoIGZhbGxiYWNrcyB0aGUgY2FsbGVyIGNob3NlIGF2YWlsYWJpbGl0eSBvdmVyIHRoYXQ6IGtub3duLWRvd24gc291cmNlcyBtb3ZlIHRvIHRoZSBiYWNrIHNvIHRoZSBuZXh0IHNvdXJjZSBjb3ZlcmluZyB0aGVpciByb3V0ZXMgc3Vic3RpdHV0ZXMsIGFuZCBzb3VyY2VzIHRoYXQgZmFpbGVkIFRISVMgY2FsbCBhcmUgZXhjbHVkZWQgb3V0cmlnaHQuXG4gICAgICAgIGxldCBjYW5kaWRhdGVzID0gc3RhdGUuc291cmNlcy5maWx0ZXIoeCA9PiBjb25maWdXaW5kb3dDdXJyZW50KHguY29uZmlnKSAmJiB4LmFwaSAmJiAhY29uZmlnPy5leGNsdWRlPy5oYXMoeCkpO1xuICAgICAgICBpZiAoY29uZmlnPy5mYWxsYmFja3MpIHtcbiAgICAgICAgICAgIGxldCB1c2FibGUgPSBjYW5kaWRhdGVzLmZpbHRlcih4ID0+ICF4LmlzT25Db29sZG93bigpKTtcbiAgICAgICAgICAgIGxldCBjaG9zZW4gPSBjb3ZlclJvdXRlcyh1c2FibGUpIHx8IGNvdmVyUm91dGVzKGNhbmRpZGF0ZXMpO1xuICAgICAgICAgICAgaWYgKGNob3NlbikgcmV0dXJuIGNob3NlbjtcbiAgICAgICAgfVxuICAgICAgICBsZXQgY2hvc2VuID0gY292ZXJSb3V0ZXMoY2FuZGlkYXRlcyk7XG4gICAgICAgIGlmICghY2hvc2VuKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCBjb3ZlciB0aGUgZnVsbCByb3V0ZSBzcGFjZSBmb3IgJHt0aGlzLmdldERlYnVnTmFtZSgpfTogdGhlIGF2YWlsYWJsZSBzb3VyY2VzIGxlYXZlIGEgZ2FwIChzb21lIHNoYXJkcyBhcmUgZG93biBvciBVUkwtb25seSlgKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY2hvc2VuO1xuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgcnVuT25Db3ZlcmluZzxUPihvcGVyYXRpb246IHN0cmluZywgcnVuOiAoYXJjaGl2ZXM6IElBcmNoaXZlcykgPT4gUHJvbWlzZTxUPiwgY29uZmlnPzogeyBmYWxsYmFja3M/OiBib29sZWFuIH0pOiBQcm9taXNlPFRbXT4ge1xuICAgICAgICBsZXQgZGVhZGxpbmUgPSBEYXRlLm5vdygpICsgQ09WRVJJTkdfUkVUUllfVElNRU9VVDtcbiAgICAgICAgLy8gU291cmNlcyB0aGF0IGZhaWxlZCBkdXJpbmcgdGhpcyBjYWxsIC0gd2l0aCBmYWxsYmFja3MsIHRoZSBuZXh0IGF0dGVtcHQgY292ZXJzIHRoZWlyIHJvdXRlcyB3aXRoIHRoZSBuZXh0IHNvdXJjZSBob2xkaW5nIHRoZW0gaW5zdGVhZFxuICAgICAgICBsZXQgZmFpbGVkID0gbmV3IFNldDxTb3VyY2VXcmFwcGVyPigpO1xuICAgICAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgICAgICAgbGV0IHN0YXRlID0gYXdhaXQgdGhpcy5nZXRTdGF0ZSgpO1xuICAgICAgICAgICAgLy8gRXJyb3JzIG5hbWUgdGhlIE9QRVJBVElPTiBhbmQgdGhlIFNQRUNJRklDIHNvdXJjZXMgdGhhdCBmYWlsZWQgLSBcInRoZSBmaW5kIGZhaWxlZCBiZWNhdXNlIHNvdXJjZSBYIGlzIHVuYXZhaWxhYmxlXCIsIG5ldmVyIGFuIGFub255bW91cyBmYWlsdXJlIGF0dHJpYnV0ZWQgdG8gdGhlIHdob2xlIGNoYWluXG4gICAgICAgICAgICBsZXQgb3V0Y29tZSA9IGF3YWl0IChhc3luYyAoKTogUHJvbWlzZTx7IHZhbHVlczogVFtdIH0gfCB7IGVycm9yOiBFcnJvciB9PiA9PiB7XG4gICAgICAgICAgICAgICAgbGV0IGNvdmVyaW5nOiBTb3VyY2VXcmFwcGVyW107XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgY292ZXJpbmcgPSB0aGlzLnNlbGVjdENvdmVyaW5nU291cmNlcyhzdGF0ZSwgeyBmYWxsYmFja3M6IGNvbmZpZz8uZmFsbGJhY2tzLCBleGNsdWRlOiBmYWlsZWQgfSk7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4geyBlcnJvcjogbmV3IEVycm9yKGAke29wZXJhdGlvbn0gY2Fubm90IHJ1bjogJHsoZSBhcyBFcnJvcikubWVzc2FnZX1gKSB9O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBsZXQgdmFsdWVzOiBUW10gPSBbXTtcbiAgICAgICAgICAgICAgICBsZXQgZmFpbHVyZXM6IHsgc291cmNlOiBTb3VyY2VXcmFwcGVyOyBlcnJvcjogRXJyb3IgfVtdID0gW107XG4gICAgICAgICAgICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoY292ZXJpbmcubWFwKGFzeW5jIHNvdXJjZSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBhcGkgPSBzb3VyY2UuYXBpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWFwaSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZmFpbGVkLmFkZChzb3VyY2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZmFpbHVyZXMucHVzaCh7IHNvdXJjZSwgZXJyb3I6IG5ldyBFcnJvcihgVVJMLW9ubHkgYWNjZXNzLCB3aGljaCBjYW5ub3Qgc2VydmUgJHtvcGVyYXRpb259YCkgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlcy5wdXNoKGF3YWl0IHJ1bihhcGkpKTtcbiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFzb3VyY2UuaXNDb25uZWN0ZWQoKSkgc291cmNlLm5vdGVGYWlsdXJlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBmYWlsZWQuYWRkKHNvdXJjZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBmYWlsdXJlcy5wdXNoKHsgc291cmNlLCBlcnJvcjogZSBhcyBFcnJvciB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgICAgICBpZiAoIWZhaWx1cmVzLmxlbmd0aCkgcmV0dXJuIHsgdmFsdWVzIH07XG4gICAgICAgICAgICAgICAgaWYgKGZhaWx1cmVzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4geyBlcnJvcjogbmV3IEVycm9yKGAke29wZXJhdGlvbn0gZmFpbGVkIGJlY2F1c2Ugc291cmNlICR7ZmFpbHVyZXNbMF0uc291cmNlLmdldERlYnVnTmFtZSgpfSBpcyB1bmF2YWlsYWJsZTogJHtmYWlsdXJlc1swXS5lcnJvci5zdGFjayA/PyBmYWlsdXJlc1swXS5lcnJvcn1gKSB9O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4geyBlcnJvcjogbmV3IEVycm9yKGAke29wZXJhdGlvbn0gZmFpbGVkIGJlY2F1c2UgJHtmYWlsdXJlcy5sZW5ndGh9IG9mIHRoZSAke2NvdmVyaW5nLmxlbmd0aH0gY292ZXJpbmcgc291cmNlcyBhcmUgdW5hdmFpbGFibGU6ICR7ZmFpbHVyZXMubWFwKHggPT4gYCR7eC5zb3VyY2UuZ2V0RGVidWdOYW1lKCl9OiAke3guZXJyb3Iuc3RhY2sgPz8geC5lcnJvcn1gKS5qb2luKFwiIHwgXCIpfWApIH07XG4gICAgICAgICAgICB9KSgpO1xuICAgICAgICAgICAgaWYgKFwidmFsdWVzXCIgaW4gb3V0Y29tZSkgcmV0dXJuIG91dGNvbWUudmFsdWVzO1xuICAgICAgICAgICAgbGV0IGVycm9yID0gb3V0Y29tZS5lcnJvcjtcbiAgICAgICAgICAgIGlmIChEYXRlLm5vdygpID49IGRlYWRsaW5lKSB0aHJvdyBlcnJvcjtcbiAgICAgICAgICAgIGlmIChjb25maWc/LmZhbGxiYWNrcyAmJiBmYWlsZWQuc2l6ZSkge1xuICAgICAgICAgICAgICAgIGxldCBzdWJzdGl0dXRhYmxlID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RDb3ZlcmluZ1NvdXJjZXMoc3RhdGUsIHsgZmFsbGJhY2tzOiB0cnVlLCBleGNsdWRlOiBmYWlsZWQgfSk7XG4gICAgICAgICAgICAgICAgICAgIHN1YnN0aXR1dGFibGUgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggeyB9XG4gICAgICAgICAgICAgICAgaWYgKHN1YnN0aXR1dGFibGUpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihgJHtlcnJvci5tZXNzYWdlfS4gU3Vic3RpdHV0aW5nIHRoZSBmYWlsZWQgc291cmNlcycgcm91dGVzIHdpdGggZmFsbGJhY2sgc291cmNlcy5gKTtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIE5vIHN1YnN0aXR1dGUgY292ZXJzIHRoZSBmYWlsZWQgcm91dGVzIC0gcmV0cnkgdGhlIGZhaWxlZCBzb3VyY2VzIHRoZW1zZWx2ZXMgYWZ0ZXIgdGhlIGRlbGF5XG4gICAgICAgICAgICAgICAgZmFpbGVkLmNsZWFyKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKGAke2Vycm9yLm1lc3NhZ2V9LiBSZXRyeWluZyBpbiAke0NPVkVSSU5HX1JFVFJZX0RFTEFZIC8gMTAwMH1zIChnaXZpbmcgdXAgYXQgJHtuZXcgRGF0ZShkZWFkbGluZSkudG9JU09TdHJpbmcoKX0pLmApO1xuICAgICAgICAgICAgYXdhaXQgZGVsYXkoQ09WRVJJTkdfUkVUUllfREVMQVkpO1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5yZWNoZWNrQXZhaWxhYmlsaXR5KCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgZmluZChwcmVmaXg6IHN0cmluZywgY29uZmlnPzogRmluZENvbmZpZyk6IFByb21pc2U8c3RyaW5nW10+IHtcbiAgICAgICAgcmV0dXJuIChhd2FpdCB0aGlzLmZpbmRJbmZvKHByZWZpeCwgY29uZmlnKSkubWFwKHggPT4geC5wYXRoKTtcbiAgICB9XG4gICAgcHVibGljIGFzeW5jIGZpbmRJbmZvKHByZWZpeDogc3RyaW5nLCBjb25maWc/OiBGaW5kQ29uZmlnKTogUHJvbWlzZTxBcmNoaXZlRmlsZUluZm9bXT4ge1xuICAgICAgICBsZXQgcmVzdWx0cyA9IGF3YWl0IHRoaXMucnVuT25Db3ZlcmluZyhgVGhlIGZpbmQgb2YgJHtKU09OLnN0cmluZ2lmeShwcmVmaXgpfWAsIGFyY2hpdmVzID0+IGFyY2hpdmVzLmZpbmRJbmZvKHByZWZpeCwgY29uZmlnKSwgeyBmYWxsYmFja3M6IGNvbmZpZz8uZmFsbGJhY2tzIH0pO1xuICAgICAgICBsZXQgYnlQYXRoID0gbmV3IE1hcDxzdHJpbmcsIEFyY2hpdmVGaWxlSW5mbz4oKTtcbiAgICAgICAgZm9yIChsZXQgbGlzdCBvZiByZXN1bHRzKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBmaWxlIG9mIGxpc3QpIHtcbiAgICAgICAgICAgICAgICBsZXQgZXhpc3RpbmcgPSBieVBhdGguZ2V0KGZpbGUucGF0aCk7XG4gICAgICAgICAgICAgICAgaWYgKCFleGlzdGluZyB8fCBmaWxlLmNyZWF0ZVRpbWUgPiBleGlzdGluZy5jcmVhdGVUaW1lKSB7XG4gICAgICAgICAgICAgICAgICAgIGJ5UGF0aC5zZXQoZmlsZS5wYXRoLCBmaWxlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgbGV0IG1lcmdlZCA9IFsuLi5ieVBhdGgudmFsdWVzKCldO1xuICAgICAgICBzb3J0KG1lcmdlZCwgeCA9PiB4LnBhdGgpO1xuICAgICAgICByZXR1cm4gbWVyZ2VkO1xuICAgIH1cbiAgICBwdWJsaWMgYXN5bmMgZ2V0Q2hhbmdlc0FmdGVyMihjb25maWc6IENoYW5nZXNBZnRlckNvbmZpZyk6IFByb21pc2U8QXJjaGl2ZUZpbGVJbmZvW10+IHtcbiAgICAgICAgbGV0IHJlc3VsdHMgPSBhd2FpdCB0aGlzLnJ1bk9uQ292ZXJpbmcoYFRoZSBjaGFuZ2VzIGxpc3Rpbmcgc2luY2UgJHtuZXcgRGF0ZShjb25maWcudGltZSkudG9JU09TdHJpbmcoKX1gLCBhcmNoaXZlcyA9PiBhcmNoaXZlcy5nZXRDaGFuZ2VzQWZ0ZXIyKGNvbmZpZykpO1xuICAgICAgICBsZXQgYnlQYXRoID0gbmV3IE1hcDxzdHJpbmcsIEFyY2hpdmVGaWxlSW5mbz4oKTtcbiAgICAgICAgZm9yIChsZXQgbGlzdCBvZiByZXN1bHRzKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBmaWxlIG9mIGxpc3QpIHtcbiAgICAgICAgICAgICAgICBsZXQgZXhpc3RpbmcgPSBieVBhdGguZ2V0KGZpbGUucGF0aCk7XG4gICAgICAgICAgICAgICAgaWYgKCFleGlzdGluZyB8fCBmaWxlLmNyZWF0ZVRpbWUgPiBleGlzdGluZy5jcmVhdGVUaW1lKSB7XG4gICAgICAgICAgICAgICAgICAgIGJ5UGF0aC5zZXQoZmlsZS5wYXRoLCBmaWxlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgbGV0IG1lcmdlZCA9IFsuLi5ieVBhdGgudmFsdWVzKCldO1xuICAgICAgICBzb3J0KG1lcmdlZCwgeCA9PiB4LnBhdGgpO1xuICAgICAgICByZXR1cm4gbWVyZ2VkO1xuICAgIH1cbiAgICBwdWJsaWMgYXN5bmMgZ2V0U3luY1N0YXR1cygpOiBQcm9taXNlPEFyY2hpdmVzU3luY1N0YXR1cz4ge1xuICAgICAgICBsZXQgc3RhdHVzZXMgPSBhd2FpdCB0aGlzLnJ1bk9uQ292ZXJpbmcoYFRoZSBzeW5jIHN0YXR1cyBjaGVja2AsIGFzeW5jIGFyY2hpdmVzID0+IHtcbiAgICAgICAgICAgIGlmICghYXJjaGl2ZXMuZ2V0U3luY1N0YXR1cykge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgJHthcmNoaXZlcy5nZXREZWJ1Z05hbWUoKX0gZG9lcyBub3Qgc3VwcG9ydCBnZXRTeW5jU3RhdHVzYCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgYXJjaGl2ZXMuZ2V0U3luY1N0YXR1cygpO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGFsbFNjYW5zQ29tcGxldGU6IHN0YXR1c2VzLmV2ZXJ5KHggPT4geC5hbGxTY2Fuc0NvbXBsZXRlKSxcbiAgICAgICAgICAgIGluZGV4U2l6ZTogc3RhdHVzZXMucmVkdWNlKChzdW0sIHgpID0+IHN1bSArIHguaW5kZXhTaXplLCAwKSxcbiAgICAgICAgICAgIHNvdXJjZXM6IHN0YXR1c2VzLmZsYXRNYXAoeCA9PiB4LnNvdXJjZXMpLFxuICAgICAgICB9O1xuICAgIH1cbiAgICBwdWJsaWMgYXN5bmMgZ2V0Q29uZmlnKCk6IFByb21pc2U8QXJjaGl2ZXNDb25maWc+IHtcbiAgICAgICAgbGV0IHN0YXRlID0gYXdhaXQgdGhpcy5nZXRTdGF0ZSgpO1xuICAgICAgICBpZiAoIXN0YXRlLnNvdXJjZXMuc29tZSh4ID0+IHguYXBpKSkgcmV0dXJuIHsgcmVtb3RlQ29uZmlnOiBzdGF0ZS5jb25maWcgfTtcbiAgICAgICAgbGV0IGNvbmZpZyA9IGF3YWl0IHRoaXMucnVuKHN0YXRlLCB7IGFwaU9ubHk6IHRydWUgfSwgYXJjaGl2ZXMgPT4gYXJjaGl2ZXMuZ2V0Q29uZmlnKCkpO1xuICAgICAgICByZXR1cm4geyAuLi5jb25maWcsIHJlbW90ZUNvbmZpZzogc3RhdGUuY29uZmlnIH07XG4gICAgfVxuICAgIHB1YmxpYyBhc3luYyBoYXNXcml0ZUFjY2VzcygpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICAgICAgbGV0IHN0YXRlID0gYXdhaXQgdGhpcy5nZXRTdGF0ZSgpO1xuICAgICAgICBmb3IgKGxldCBzb3VyY2Ugb2Ygc3RhdGUuc291cmNlcykge1xuICAgICAgICAgICAgaWYgKCFjb25maWdBY2NlcHRzV3JpdGVzKHNvdXJjZS5jb25maWcpKSBjb250aW51ZTtcbiAgICAgICAgICAgIGlmICghYXdhaXQgc291cmNlLmhhc1dyaXRlQWNjZXNzKCkpIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgc2V0KGZpbGVOYW1lOiBzdHJpbmcsIGRhdGE6IEJ1ZmZlciwgY29uZmlnPzogU2V0Q29uZmlnKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICAgICAgaWYgKCFkYXRhLmxlbmd0aCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBzZXQgd2FzIGNhbGxlZCB3aXRoIGFuIGVtcHR5IGJ1ZmZlciBmb3IgJHtKU09OLnN0cmluZ2lmeShmaWxlTmFtZSl9OiBhbiBlbXB0eSBmaWxlIElTIGEgZGVsZXRpb24gaW4gdGhpcyBzeXN0ZW0gYW5kIHdvdWxkIHJlYWQgYmFjayBhcyBtaXNzaW5nIC0gY2FsbCBkZWwgaW5zdGVhZGApO1xuICAgICAgICB9XG4gICAgICAgIGlmIChmaWxlTmFtZSA9PT0gUk9VVElOR19GSUxFKSB7XG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5zZXRSb3V0aW5nQ29uZmlnKGRhdGEsIGNvbmZpZyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGZpbGVOYW1lLmluY2x1ZGVzKFZBUklBQkxFX1NIQVJEKSAmJiBwYXJzZVZhcmlhYmxlUm91dGUoZmlsZU5hbWUpID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCB0aGlzLnNldFZhcmlhYmxlU2hhcmQoZmlsZU5hbWUsIGRhdGEsIGNvbmZpZyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGRhdGEubGVuZ3RoID4gTEFSR0VfU0VUX1RIUkVTSE9MRCkge1xuICAgICAgICAgICAgLy8gU3RyZWFtZWQgYXV0b21hdGljYWxseSBzbyBjYWxsZXJzIG5ldmVyIGhhdmUgdG8gY2FsbCBzZXRMYXJnZUZpbGUgdGhlbXNlbHZlcyB3aGVuIHRoZXkgYWxyZWFkeSBob2xkIHRoZSBidWZmZXIgLSBvbmUgZ2lhbnQgbWVzc2FnZSB3b3VsZCBleGNlZWQgdGhlIHdpcmUgbGltaXQgYW5kIGxhZyBldmVyeSBvdGhlciBjbGllbnQgb24gdGhlIGNvbm5lY3Rpb25cbiAgICAgICAgICAgIGF3YWl0IHRoaXMuc2V0TGFyZ2VGaWxlKHsgcGF0aDogZmlsZU5hbWUsIGxhc3RNb2RpZmllZDogY29uZmlnPy5sYXN0TW9kaWZpZWQsIGdldE5leHREYXRhOiBidWZmZXJDaHVua1N0cmVhbShkYXRhKSB9KTtcbiAgICAgICAgICAgIHJldHVybiBmaWxlTmFtZTtcbiAgICAgICAgfVxuICAgICAgICBhd2FpdCB0aGlzLnJlcXVlc3QoeyB3cml0ZTogdHJ1ZSwgcm91dGU6IGdldFJvdXRlKGZpbGVOYW1lKSwgdGltZW91dDogeyB1cGxvYWRCeXRlczogZGF0YS5sZW5ndGgsIGxhYmVsOiBgVXBsb2FkIG9mICR7SlNPTi5zdHJpbmdpZnkoZmlsZU5hbWUpfSAoJHtkYXRhLmxlbmd0aH0gYnl0ZXMpYCB9IH0sIGFyY2hpdmVzID0+IGFyY2hpdmVzLnNldChmaWxlTmFtZSwgZGF0YSwgY29uZmlnKSk7XG4gICAgICAgIHJldHVybiBmaWxlTmFtZTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIHNldFJvdXRpbmdDb25maWcoZGF0YTogQnVmZmVyLCBjb25maWc/OiB7IGxhc3RNb2RpZmllZD86IG51bWJlciB9KTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICAgICAgbGV0IHN0YXRlID0gYXdhaXQgdGhpcy5nZXRTdGF0ZSgpO1xuICAgICAgICBsZXQgd3JpdGVUaW1lID0gY29uZmlnPy5sYXN0TW9kaWZpZWQgfHwgRGF0ZS5ub3coKTtcbiAgICAgICAgbGV0IHdyaXR0ZW46IHN0cmluZ1tdID0gW107XG4gICAgICAgIGxldCBlcnJvcnM6IHN0cmluZ1tdID0gW107XG4gICAgICAgIGxldCBzZWVuID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gICAgICAgIGNvbnNvbGUubG9nKGBXcml0aW5nIHN0b3JhZ2Ugcm91dGluZyBjb25maWcgZm9yICR7dGhpcy5nZXREZWJ1Z05hbWUoKX0gdG8gZXZlcnkgbm9kZSAod3JpdGUgdGltZSAke25ldyBEYXRlKHdyaXRlVGltZSkudG9JU09TdHJpbmcoKX0pOiAke2RhdGEudG9TdHJpbmcoXCJ1dGY4XCIpLnNsaWNlKDAsIDIwMDApfWApO1xuICAgICAgICBmb3IgKGxldCBzb3VyY2Ugb2Ygc3RhdGUuc291cmNlcykge1xuICAgICAgICAgICAgaWYgKHNlZW4uaGFzKHNvdXJjZS5jb25maWcudXJsKSkgY29udGludWU7XG4gICAgICAgICAgICBzZWVuLmFkZChzb3VyY2UuY29uZmlnLnVybCk7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGF3YWl0IHNvdXJjZS53cml0ZShhcmNoaXZlcyA9PiBhcmNoaXZlcy5zZXQoUk9VVElOR19GSUxFLCBkYXRhLCB7IGxhc3RNb2RpZmllZDogd3JpdGVUaW1lIH0pKTtcbiAgICAgICAgICAgICAgICB3cml0dGVuLnB1c2goc291cmNlLmNvbmZpZy51cmwpO1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGBXcm90ZSB0aGUgc3RvcmFnZSByb3V0aW5nIGNvbmZpZyB0byAke3NvdXJjZS5jb25maWcudXJsfWApO1xuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgIGVycm9ycy5wdXNoKGAke3NvdXJjZS5jb25maWcudXJsfTogJHsoZSBhcyBFcnJvcikuc3RhY2sgPz8gZX1gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBhd2FpdCB0aGlzLnJlZnJlc2hBY3RpdmVDb25maWcoKTtcbiAgICAgICAgaWYgKGVycm9ycy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgU3RvcmFnZSByb3V0aW5nIGNvbmZpZyB3cml0ZSBmb3IgJHt0aGlzLmdldERlYnVnTmFtZSgpfSBmYWlsZWQgb24gJHtlcnJvcnMubGVuZ3RofSBvZiAke3NlZW4uc2l6ZX0gbm9kZXMgKHN1Y2NlZWRlZCBvbjogJHt3cml0dGVuLmpvaW4oXCIsIFwiKSB8fCBcIm5vbmVcIn0pOiAke2Vycm9ycy5qb2luKFwiIHwgXCIpfWApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBST1VUSU5HX0ZJTEU7XG4gICAgfVxuICAgIHB1YmxpYyBhc3luYyBkZWwoZmlsZU5hbWU6IHN0cmluZywgY29uZmlnPzogRGVsQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGF3YWl0IHRoaXMucmVxdWVzdCh7IHdyaXRlOiB0cnVlLCByb3V0ZTogZ2V0Um91dGUoZmlsZU5hbWUpLCB0aW1lb3V0OiB7IHVwbG9hZEJ5dGVzOiAwLCBsYWJlbDogYERlbGV0aW9uIG9mICR7SlNPTi5zdHJpbmdpZnkoZmlsZU5hbWUpfWAgfSB9LCBhcmNoaXZlcyA9PiBhcmNoaXZlcy5kZWwoZmlsZU5hbWUsIGNvbmZpZykpO1xuICAgIH1cblxuICAgIC8vIE9uZSB3cml0ZSB0YXJnZXQgcGVyIHJvdXRlIHJhbmdlLCBsb3dlc3QgbGF0ZW5jeSBmaXJzdC4gV2l0aGluIGEgc2hhcmQgdGhlIHRhcmdldCBpcyBBTFdBWVMgdGhlIGZpcnN0IHNvdXJjZSBpbiBjb25maWcgb3JkZXIgKHNlZSBydW5QcmltYXJ5IC0gd3JpdGVzIG11c3Qgc3RheSBvbiB0aGUgc2FtZSBub2RlKTogY29ubmVjdGl2aXR5IG9ubHkgZGVjaWRlcyB3aGljaCBTSEFSRCB3ZSBwaWNrLCBuZXZlciB3aGljaCBub2RlIHdpdGhpbiBpdCwgc28gYSBzaGFyZCB3aG9zZSBub2RlIGlzIGRpc2Nvbm5lY3RlZCBpcyBkcm9wcGVkIGVudGlyZWx5IHdoZW4gY29ubmVjdGVkT25seSBpcyBzZXQuXG4gICAgcHJpdmF0ZSBnZXRWYXJpYWJsZVNoYXJkVGFyZ2V0cyhzdGF0ZTogQ2hhaW5TdGF0ZSwgY29uZmlnOiB7IGNvbm5lY3RlZE9ubHk6IGJvb2xlYW4gfSk6IFNvdXJjZVdyYXBwZXJbXSB7XG4gICAgICAgIGxldCB0YXJnZXRzQnlSb3V0ZSA9IG5ldyBNYXA8c3RyaW5nLCBTb3VyY2VXcmFwcGVyPigpO1xuICAgICAgICBmb3IgKGxldCBzb3VyY2Ugb2Ygc3RhdGUuc291cmNlcykge1xuICAgICAgICAgICAgaWYgKCFjb25maWdBY2NlcHRzV3JpdGVzKHNvdXJjZS5jb25maWcpKSBjb250aW51ZTtcbiAgICAgICAgICAgIGxldCByb3V0ZUtleSA9IEpTT04uc3RyaW5naWZ5KHNvdXJjZS5jb25maWcucm91dGUgfHwgRlVMTF9ST1VURSk7XG4gICAgICAgICAgICBpZiAoIXRhcmdldHNCeVJvdXRlLmhhcyhyb3V0ZUtleSkpIHtcbiAgICAgICAgICAgICAgICB0YXJnZXRzQnlSb3V0ZS5zZXQocm91dGVLZXksIHNvdXJjZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHRhcmdldHMgPSBbLi4udGFyZ2V0c0J5Um91dGUudmFsdWVzKCldO1xuICAgICAgICBpZiAoY29uZmlnLmNvbm5lY3RlZE9ubHkpIHtcbiAgICAgICAgICAgIHRhcmdldHMgPSB0YXJnZXRzLmZpbHRlcih4ID0+IHguaXNDb25uZWN0ZWQoKSk7XG4gICAgICAgIH1cbiAgICAgICAgc29ydCh0YXJnZXRzLCB4ID0+IHguZ2V0TGF0ZW5jeSgpKTtcbiAgICAgICAgcmV0dXJuIHRhcmdldHM7XG4gICAgfVxuXG4gICAgLyoqIFRoZSBrZXkgc2V0VmFyaWFibGVTaGFyZCB3b3VsZCBtYXRlcmlhbGl6ZSBmb3IgdGhpcyBWQVJJQUJMRV9TSEFSRCBrZXkgKGEgdmFsdWUgaW4gdGhlIHByZWZlcnJlZCBzaGFyZCdzIHJvdXRlIHJhbmdlKSwgd2l0aG91dCB3cml0aW5nIGFueXRoaW5nLiAqL1xuICAgIHB1YmxpYyBhc3luYyBnZXRTaGFyZEtleShrZXk6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgICAgIGlmICgha2V5LmluY2x1ZGVzKFZBUklBQkxFX1NIQVJEKSB8fCBwYXJzZVZhcmlhYmxlUm91dGUoa2V5KSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYGdldFNoYXJkS2V5IHJlcXVpcmVzIGEga2V5IGNvbnRhaW5pbmcgYW4gdW5tYXRlcmlhbGl6ZWQgJHtKU09OLnN0cmluZ2lmeShWQVJJQUJMRV9TSEFSRCl9LCBnb3QgJHtKU09OLnN0cmluZ2lmeShrZXkpfWApO1xuICAgICAgICB9XG4gICAgICAgIGxldCBzdGF0ZSA9IGF3YWl0IHRoaXMuZ2V0U3RhdGUoKTtcbiAgICAgICAgbGV0IHRhcmdldCA9IHRoaXMuZ2V0VmFyaWFibGVTaGFyZFRhcmdldHMoc3RhdGUsIHsgY29ubmVjdGVkT25seTogdHJ1ZSB9KVswXVxuICAgICAgICAgICAgfHwgdGhpcy5nZXRWYXJpYWJsZVNoYXJkVGFyZ2V0cyhzdGF0ZSwgeyBjb25uZWN0ZWRPbmx5OiBmYWxzZSB9KVswXTtcbiAgICAgICAgaWYgKCF0YXJnZXQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgTm8gc291cmNlIGFjY2VwdHMgd3JpdGVzIGZvciAke3RoaXMuZ2V0RGVidWdOYW1lKCl9LCBzbyB0aGVyZSBpcyBubyBzaGFyZCB0byBtYXRlcmlhbGl6ZSAke0pTT04uc3RyaW5naWZ5KGtleSl9IGludG9gKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbWF0ZXJpYWxpemVTaGFyZEtleShrZXksIHRhcmdldCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBzZXRWYXJpYWJsZVNoYXJkKGtleTogc3RyaW5nLCBkYXRhOiBCdWZmZXIsIGNvbmZpZz86IFNldENvbmZpZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgICAgIGxldCByZWNoZWNrZWRBdmFpbGFiaWxpdHkgPSBmYWxzZTtcbiAgICAgICAgLy8gVGhlcmUncyBubyBwb2ludCB0YWxraW5nIHRvIGEgc2hhcmQgd2hvc2Ugbm9kZSB3YXMgZmFzdCBidXQgaXMgbm93IGRpc2Nvbm5lY3RlZCAtIG9ubHkgd2hlbiBubyBjb25uZWN0ZWQgc2hhcmQgd29ya3MgZG8gd2UgcmVjaGVjayBhdmFpbGFiaWxpdHkgYW5kIHRyeSBldmVyeSBzaGFyZFxuICAgICAgICBsZXQgY29ubmVjdGVkT25seSA9IHRydWU7XG4gICAgICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICAgICAgICBsZXQgc3RhdGUgPSBhd2FpdCB0aGlzLmdldFN0YXRlKCk7XG4gICAgICAgICAgICBsZXQgdGFyZ2V0cyA9IHRoaXMuZ2V0VmFyaWFibGVTaGFyZFRhcmdldHMoc3RhdGUsIHsgY29ubmVjdGVkT25seSB9KTtcbiAgICAgICAgICAgIGxldCBlcnJvcnM6IHN0cmluZ1tdID0gW107XG4gICAgICAgICAgICBmb3IgKGxldCB0YXJnZXQgb2YgdGFyZ2V0cykge1xuICAgICAgICAgICAgICAgIGxldCBmdWxsS2V5ID0gbWF0ZXJpYWxpemVTaGFyZEtleShrZXksIHRhcmdldCk7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgLy8gVGhlIHNoYXJkIHBpY2tpbmcgYWxyZWFkeSByZXRyaWVzIGFjcm9zcyBzaGFyZHMsIHNvIGEgc3R1Y2sgc2hhcmQganVzdCBjb3N0cyBpdHMgdGltZW91dCBhbmQgd2UgbW92ZSBvbi4gTGFyZ2UgZGF0YSBzdHJlYW1zIHZpYSBzZXRMYXJnZUZpbGUgLSB0aGUga2V5IGlzIGFscmVhZHkgbWF0ZXJpYWxpemVkIGhlcmUsIHNvIHRoZSBuby1WQVJJQUJMRV9TSEFSRCByZXN0cmljdGlvbiBvbiBzZXRMYXJnZUZpbGUgZG9lc24ndCBhcHBseS5cbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5hcHBseVNtYXJ0VGltZW91dCh7IHVwbG9hZEJ5dGVzOiBkYXRhLmxlbmd0aCwgbGFiZWw6IGBWYXJpYWJsZS1zaGFyZCB1cGxvYWQgb2YgJHtKU09OLnN0cmluZ2lmeShmdWxsS2V5KX0gKCR7ZGF0YS5sZW5ndGh9IGJ5dGVzKWAgfSwgdGFyZ2V0LCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGF0YS5sZW5ndGggPiBMQVJHRV9TRVRfVEhSRVNIT0xEKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRhcmdldC53cml0ZShhcmNoaXZlcyA9PiBhcmNoaXZlcy5zZXRMYXJnZUZpbGUoeyBwYXRoOiBmdWxsS2V5LCBsYXN0TW9kaWZpZWQ6IGNvbmZpZz8ubGFzdE1vZGlmaWVkLCBnZXROZXh0RGF0YTogYnVmZmVyQ2h1bmtTdHJlYW0oZGF0YSkgfSkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRhcmdldC53cml0ZShhcmNoaXZlcyA9PiBhcmNoaXZlcy5zZXQoZnVsbEtleSwgZGF0YSwgY29uZmlnKSkgYXMgYW55O1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bGxLZXk7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgbWVzc2FnZSA9IFN0cmluZygoZSBhcyBFcnJvcikuc3RhY2sgPz8gZSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChtZXNzYWdlLmluY2x1ZGVzKFNNQVJUX1RJTUVPVVRfTUFSS0VSKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihgVmFyaWFibGUtc2hhcmQgd3JpdGUgdGFyZ2V0ICR7dGFyZ2V0LmdldERlYnVnTmFtZSgpfSB0aW1lZCBvdXQ7IG1vdmluZyB0byB0aGUgbmV4dC1sb3dlc3QtbGF0ZW5jeSBzaGFyZDogJHttZXNzYWdlfWApO1xuICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JzLnB1c2gobWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAodGFyZ2V0LmlzQ29ubmVjdGVkKCkpIHRocm93IGU7XG4gICAgICAgICAgICAgICAgICAgIHRhcmdldC5ub3RlRmFpbHVyZSgpO1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhgVmFyaWFibGUtc2hhcmQgd3JpdGUgdGFyZ2V0ICR7dGFyZ2V0LmdldERlYnVnTmFtZSgpfSBpcyBkb3duOyBtb3ZpbmcgdG8gdGhlIG5leHQtbG93ZXN0LWxhdGVuY3kgc2hhcmRgKTtcbiAgICAgICAgICAgICAgICAgICAgZXJyb3JzLnB1c2gobWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCFyZWNoZWNrZWRBdmFpbGFiaWxpdHkpIHtcbiAgICAgICAgICAgICAgICByZWNoZWNrZWRBdmFpbGFiaWxpdHkgPSB0cnVlO1xuICAgICAgICAgICAgICAgIGNvbm5lY3RlZE9ubHkgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnJlY2hlY2tBdmFpbGFiaWxpdHkoKTtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgRXZlcnkgdmFyaWFibGUtc2hhcmQgd3JpdGUgdGFyZ2V0IGZhaWxlZCBmb3IgJHt0aGlzLmdldERlYnVnTmFtZSgpfTogJHtlcnJvcnMuam9pbihcIiB8IFwiKSB8fCBcIm5vIHNvdXJjZXMgYWNjZXB0IHdyaXRlc1wifWApO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIHNldExhcmdlRmlsZShjb25maWc6IHsgcGF0aDogc3RyaW5nOyBsYXN0TW9kaWZpZWQ/OiBudW1iZXI7IGdldE5leHREYXRhKCk6IFByb21pc2U8QnVmZmVyIHwgdW5kZWZpbmVkPiB9KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGlmIChjb25maWcucGF0aC5pbmNsdWRlcyhWQVJJQUJMRV9TSEFSRCkgJiYgcGFyc2VWYXJpYWJsZVJvdXRlKGNvbmZpZy5wYXRoKSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYHNldExhcmdlRmlsZSBkb2VzIG5vdCBzdXBwb3J0IFZBUklBQkxFX1NIQVJEIGtleXMgKHRoZXJlIGlzIG5vIHdheSB0byByZXR1cm4gdGhlIG1hdGVyaWFsaXplZCBrZXkpOyB3cml0ZSB0aGUgZmlsZSB3aXRoIHNldCwgb3IgbWF0ZXJpYWxpemUgdGhlIGtleSB5b3Vyc2VsZi4gS2V5OiAke0pTT04uc3RyaW5naWZ5KGNvbmZpZy5wYXRoKX1gKTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgcm91dGUgPSBnZXRSb3V0ZShjb25maWcucGF0aCk7XG4gICAgICAgIGxldCByZWNoZWNrZWRBdmFpbGFiaWxpdHkgPSBmYWxzZTtcbiAgICAgICAgd2hpbGUgKHRydWUpIHtcbiAgICAgICAgICAgIGxldCBzdGF0ZSA9IGF3YWl0IHRoaXMuZ2V0U3RhdGUoKTtcbiAgICAgICAgICAgIGxldCB0YXJnZXQgPSBzdGF0ZS5zb3VyY2VzLmZpbmQoeCA9PiBjb25maWdBY2NlcHRzV3JpdGVzKHguY29uZmlnKSAmJiByb3V0ZUNvbnRhaW5zKHguY29uZmlnLnJvdXRlLCByb3V0ZSkpO1xuICAgICAgICAgICAgaWYgKCF0YXJnZXQpIHtcbiAgICAgICAgICAgICAgICBpZiAoIXJlY2hlY2tlZEF2YWlsYWJpbGl0eSkge1xuICAgICAgICAgICAgICAgICAgICByZWNoZWNrZWRBdmFpbGFiaWxpdHkgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnJlY2hlY2tBdmFpbGFiaWxpdHkoKTtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgTm8gc291cmNlIGFjY2VwdHMgd3JpdGVzIGZvciBzZXRMYXJnZUZpbGUgb24gJHt0aGlzLmdldERlYnVnTmFtZSgpfSAocm91dGUgJHtyb3V0ZX0pYCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGF3YWl0IHdhdGNoU2xvd1Byb21pc2UoYHNldExhcmdlRmlsZXwke2NvbmZpZy5wYXRofWAsIHRhcmdldC53cml0ZShhcmNoaXZlcyA9PiBhcmNoaXZlcy5zZXRMYXJnZUZpbGUoY29uZmlnKSkpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICBpZiAoIXRhcmdldC5pc0Nvbm5lY3RlZCgpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRhcmdldC5ub3RlRmFpbHVyZSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGdldFVSTChwYXRoOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgICAgICBsZXQgdXJscyA9IGF3YWl0IHRoaXMuZ2V0VVJMcyhwYXRoKTtcbiAgICAgICAgaWYgKCF1cmxzLmxlbmd0aCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBObyBwdWJsaWMgc291cmNlIGNvdmVyaW5nIHJvdXRlICR7Z2V0Um91dGUocGF0aCl9IHRvIGJ1aWxkIGEgVVJMIGZyb20gZm9yICR7dGhpcy5nZXREZWJ1Z05hbWUoKX1gKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdXJsc1swXTtcbiAgICB9XG5cbiAgICAvKiogRXZlcnkgVVJMIHRoYXQgY291bGQgc2VydmUgdGhpcyBwYXRoOiBwdWJsaWMgc291cmNlcyBtYXRjaGluZyBib3RoIHRoZSBwYXRoJ3Mgcm91dGUgYW5kIHRoZSBjdXJyZW50IHZhbGlkIHdpbmRvdy4gVGhlIGZpcnN0IGlzIHRoZSB3cml0ZSBub2RlJ3MgKGZpcnN0IG1hdGNoaW5nIHNvdXJjZSBpbiBjb25maWcgb3JkZXIsIHNlZSBydW5QcmltYXJ5IC0gdGhlIG9uZSBndWFyYW50ZWVkIGN1cnJlbnQpOyB0aGUgcmVzdCBhcmUgcmFua2VkIGZhc3Rlc3QtZmlyc3QgYnkgbWVhc3VyZWQgbGF0ZW5jeS4gRW1wdHkgd2hlbiBub25lIHF1YWxpZnkuICovXG4gICAgcHVibGljIGFzeW5jIGdldFVSTHMocGF0aDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmdbXT4ge1xuICAgICAgICByZXR1cm4gKGF3YWl0IHRoaXMuZ2V0R2V0VVJMcygpKShwYXRoKTtcbiAgICB9XG5cbiAgICAvKiogZ2V0VVJMcywgYnV0IGFmdGVyIHRoZSBvbmUgYXdhaXQgKGluaXRpYWxpemF0aW9uKSB0aGUgcmV0dXJuZWQgZnVuY3Rpb24gaXMgc3luY2hyb25vdXM6IGV2ZXJ5dGhpbmcgdW5kZXJuZWF0aCAtIHJvdXRlIGhhc2hpbmcsIHdpbmRvdyBjaGVja3MsIGxhdGVuY2llcywgVVJMIGJ1aWxkaW5nIC0gaXMgc3luY2hyb25vdXMsIGFuZCB0aGUgY2xvc3VyZSBhbHdheXMgcmVhZHMgdGhlIG5ld2VzdCBhZG9wdGVkIGNvbmZpZywgc28gaXQgc3RheXMgY29ycmVjdCBhY3Jvc3MgY29uZmlnIHJlZnJlc2hlcy4gKi9cbiAgICBwdWJsaWMgYXN5bmMgZ2V0R2V0VVJMcygpOiBQcm9taXNlPChwYXRoOiBzdHJpbmcpID0+IHN0cmluZ1tdPiB7XG4gICAgICAgIGxldCBpbml0aWFsU3RhdGUgPSBhd2FpdCB0aGlzLmdldFN0YXRlKCk7XG4gICAgICAgIHJldHVybiB0aGlzLm1ha2VHZXRVUkxzKGluaXRpYWxTdGF0ZSwgeyB3cml0ZU5vZGVGaXJzdDogdHJ1ZSB9KTtcbiAgICB9XG5cbiAgICAvKiogZ2V0R2V0VVJMcywgYnV0IHNvcnRlZCBwdXJlbHkgYnkgbGF0ZW5jeSAtIHRoZSB3cml0ZSBub2RlIGdldHMgbm8gc3BlY2lhbCBmaXJzdCBwb3NpdGlvbi4gRm9yIHJlYWQtb25seSBjb25zdW1lcnMgdGhhdCBqdXN0IHdhbnQgdGhlIGZhc3Rlc3QgaG9zdC4gKi9cbiAgICBwdWJsaWMgYXN5bmMgZ2V0R2V0RmFzdFVSTHMoKTogUHJvbWlzZTwocGF0aDogc3RyaW5nKSA9PiBzdHJpbmdbXT4ge1xuICAgICAgICBsZXQgaW5pdGlhbFN0YXRlID0gYXdhaXQgdGhpcy5nZXRTdGF0ZSgpO1xuICAgICAgICByZXR1cm4gdGhpcy5tYWtlR2V0VVJMcyhpbml0aWFsU3RhdGUsIHsgd3JpdGVOb2RlRmlyc3Q6IGZhbHNlIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgbWFrZUdldFVSTHMoaW5pdGlhbFN0YXRlOiBDaGFpblN0YXRlLCBjb25maWc6IHsgd3JpdGVOb2RlRmlyc3Q6IGJvb2xlYW4gfSk6IChwYXRoOiBzdHJpbmcpID0+IHN0cmluZ1tdIHtcbiAgICAgICAgcmV0dXJuIChwYXRoOiBzdHJpbmcpID0+IHtcbiAgICAgICAgICAgIGxldCBzdGF0ZSA9IHRoaXMubGF0ZXN0U3RhdGUgfHwgaW5pdGlhbFN0YXRlO1xuICAgICAgICAgICAgbGV0IHJvdXRlID0gZ2V0Um91dGUocGF0aCk7XG4gICAgICAgICAgICBsZXQgc291cmNlczogU291cmNlV3JhcHBlcltdID0gW107XG4gICAgICAgICAgICBmb3IgKGxldCBzb3VyY2Ugb2Ygc3RhdGUuc291cmNlcykge1xuICAgICAgICAgICAgICAgIGlmICghKHNvdXJjZS5jb25maWcucHVibGljID8/IHRydWUpKSBjb250aW51ZTtcbiAgICAgICAgICAgICAgICBpZiAoIXJvdXRlQ29udGFpbnMoc291cmNlLmNvbmZpZy5yb3V0ZSwgcm91dGUpKSBjb250aW51ZTtcbiAgICAgICAgICAgICAgICBpZiAoIWNvbmZpZ1dpbmRvd0N1cnJlbnQoc291cmNlLmNvbmZpZykpIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIHNvdXJjZXMucHVzaChzb3VyY2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGV0IG9yZGVyZWQ6IFNvdXJjZVdyYXBwZXJbXTtcbiAgICAgICAgICAgIGlmIChjb25maWcud3JpdGVOb2RlRmlyc3QpIHtcbiAgICAgICAgICAgICAgICBsZXQgcmVzdCA9IHNvdXJjZXMuc2xpY2UoMSk7XG4gICAgICAgICAgICAgICAgc29ydChyZXN0LCB4ID0+IHguZ2V0TGF0ZW5jeSgpKTtcbiAgICAgICAgICAgICAgICBvcmRlcmVkID0gWy4uLnNvdXJjZXMuc2xpY2UoMCwgMSksIC4uLnJlc3RdO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBvcmRlcmVkID0gWy4uLnNvdXJjZXNdO1xuICAgICAgICAgICAgICAgIHNvcnQob3JkZXJlZCwgeCA9PiB4LmdldExhdGVuY3koKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsZXQgdXJscyA9IG9yZGVyZWQubWFwKHggPT4gYnVpbGRGaWxlVXJsKGdldEJ1Y2tldEJhc2VVcmwoeC5jb25maWcudXJsKSwgcGF0aCkpO1xuICAgICAgICAgICAgcmV0dXJuIFsuLi5uZXcgU2V0KHVybHMpXTtcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZGlzcG9zZSgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5kaXNwb3NlZCA9IHRydWU7XG4gICAgICAgIHRoaXMudW5zdWJzY3JpYmVSb3V0aW5nUHVzaD8uKCk7XG4gICAgICAgIGlmICh0aGlzLnBvbGxUaW1lcikge1xuICAgICAgICAgICAgY2xlYXJJbnRlcnZhbCh0aGlzLnBvbGxUaW1lcik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuaW5pdFJldHJ5VGltZXIpIHtcbiAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aGlzLmluaXRSZXRyeVRpbWVyKTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgc3RhdGVQcm9taXNlID0gdGhpcy5zdGF0ZVByb21pc2U7XG4gICAgICAgIGlmIChzdGF0ZVByb21pc2UpIHtcbiAgICAgICAgICAgIHZvaWQgc3RhdGVQcm9taXNlLnRoZW4oc3RhdGUgPT4ge1xuICAgICAgICAgICAgICAgIGZvciAobGV0IHNvdXJjZSBvZiBzdGF0ZS5zb3VyY2VzKSB7XG4gICAgICAgICAgICAgICAgICAgIHNvdXJjZS5kaXNwb3NlKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSwgKCkgPT4geyB9KTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUFyY2hpdmVzKGNvbmZpZzogUmVtb3RlQ29uZmlnIHwgUmVtb3RlQ29uZmlnQmFzZSwgb3B0aW9ucz86IEFyY2hpdmVzQ2hhaW5PcHRpb25zKTogQXJjaGl2ZXNDaGFpbiB7XG4gICAgcmV0dXJuIG5ldyBBcmNoaXZlc0NoYWluKGNvbmZpZywgb3B0aW9ucyk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGNhbGxTZXJ2ZXI8VD4odXJsOiBzdHJpbmcsIHJ1bjogKGNvbnRyb2xsZXI6IHR5cGVvZiBSZW1vdGVTdG9yYWdlQ29udHJvbGxlci5ub2Rlc1tzdHJpbmddKSA9PiBQcm9taXNlPFQ+KTogUHJvbWlzZTxUPiB7XG4gICAgU29ja2V0RnVuY3Rpb24uRU5BQkxFX0NMSUVOVF9NT0RFID0gdHJ1ZTtcbiAgICBsZXQgcGFyc2VkID0gcGFyc2VTdG9yYWdlVXJsKHVybCk7XG4gICAgbGV0IG5vZGVJZCA9IFNvY2tldEZ1bmN0aW9uLmNvbm5lY3QoeyBhZGRyZXNzOiBwYXJzZWQuYWRkcmVzcywgcG9ydDogcGFyc2VkLnBvcnQgfSk7XG4gICAgbGV0IGNvbnRyb2xsZXIgPSBSZW1vdGVTdG9yYWdlQ29udHJvbGxlci5ub2Rlc1tub2RlSWRdO1xuICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBhd2FpdCBydW4oY29udHJvbGxlcik7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBpZiAoIVN0cmluZygoZSBhcyBFcnJvcikuc3RhY2sgPz8gZSkuaW5jbHVkZXMoU1RPUkFHRV9OT1RfQVVUSEVOVElDQVRFRCkpIHRocm93IGU7XG4gICAgICAgIGF3YWl0IGF1dGhlbnRpY2F0ZVN0b3JhZ2UoeyBhZGRyZXNzOiBwYXJzZWQuYWRkcmVzcywgcG9ydDogcGFyc2VkLnBvcnQsIG5vZGVJZCB9KTtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHJ1bihjb250cm9sbGVyKTtcbiAgICB9XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBsaXN0U2VydmVyQnVja2V0cyhjb25maWc6IHsgdXJsOiBzdHJpbmc7IGFjY291bnQ6IHN0cmluZyB9KTogUHJvbWlzZTxTZXJ2ZXJCdWNrZXRJbmZvW10+IHtcbiAgICByZXR1cm4gYXdhaXQgY2FsbFNlcnZlcihjb25maWcudXJsLCBjb250cm9sbGVyID0+IGNvbnRyb2xsZXIubGlzdEJ1Y2tldHMoeyBhY2NvdW50OiBjb25maWcuYWNjb3VudCB9KSk7XG59XG5cbi8qKiBUaGUgbGl2ZSwgaW4tbWVtb3J5IHN0YXRlIG9mIG9uZSBidWNrZXQgb24gYSBzZXJ2ZXIgKHJvdXRpbmcgY29uZmlnIGluY2x1ZGVkKSwgb3IgYSBzdHJpbmcgc2F5aW5nIHdoeSBpdCBpcyB1bmF2YWlsYWJsZS4gQ2hlYXAgLSBpdCBuZXZlciB0b3VjaGVzIHRoZSBzZXJ2ZXIncyBkaXNrIC0gYnV0IG9ubHkgd29ya3Mgd2hpbGUgdGhhdCBidWNrZXQgaXMgbG9hZGVkIHRoZXJlLiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldFNlcnZlckFjdGl2ZUJ1Y2tldChjb25maWc6IHsgdXJsOiBzdHJpbmc7IGFjY291bnQ6IHN0cmluZzsgYnVja2V0TmFtZTogc3RyaW5nIH0pOiBQcm9taXNlPEFjdGl2ZUJ1Y2tldEluZm8gfCBzdHJpbmc+IHtcbiAgICByZXR1cm4gYXdhaXQgY2FsbFNlcnZlcihjb25maWcudXJsLCBjb250cm9sbGVyID0+IGNvbnRyb2xsZXIuZ2V0QWN0aXZlQnVja2V0KHsgYWNjb3VudDogY29uZmlnLmFjY291bnQsIGJ1Y2tldE5hbWU6IGNvbmZpZy5idWNrZXROYW1lIH0pKTtcbn1cblxuLyoqIFRoZSBidWNrZXRzIGEgc2VydmVyIGN1cnJlbnRseSBoYXMgbG9hZGVkLiBBZG1pbiBvbmx5LCBzbyBpbiBwcmFjdGljZSB0aGlzIGlzIG91ciBvd24gbWFjaGluZSdzIG90aGVyIHByb2Nlc3MgLSBhIGRlcGxveSBzdWNjZXNzb3IgYXNraW5nIGl0cyBwcmVkZWNlc3NvciB3aGF0IGlzIGFjdHVhbGx5IGluIHVzZS4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBsaXN0U2VydmVyQWN0aXZlQnVja2V0S2V5cyhjb25maWc6IHsgdXJsOiBzdHJpbmcgfSk6IFByb21pc2U8eyBhY2NvdW50OiBzdHJpbmc7IGJ1Y2tldE5hbWU6IHN0cmluZyB9W10+IHtcbiAgICByZXR1cm4gYXdhaXQgY2FsbFNlcnZlcihjb25maWcudXJsLCBjb250cm9sbGVyID0+IGNvbnRyb2xsZXIuYWRtaW5MaXN0QWN0aXZlQnVja2V0cygpKTtcbn1cblxuLyoqIFRlbGxzIGEgc2VydmVyIHRvIGxvYWQgb25lIG9mIGl0cyBidWNrZXRzIGludG8gbWVtb3J5IChzdGFydGluZyBpdHMgc3luY2hyb25pemF0aW9uKSBhbmQgcmV0dXJucyBpdHMgbGl2ZSBzdGF0ZSwgb3IgYSBzdHJpbmcgc2F5aW5nIHdoeSBpdCBjb3VsZCBub3QgYmUgbG9hZGVkLiBPbmx5IHRvdWNoZXMgdGhhdCBzZXJ2ZXIgLSBub3RoaW5nIGlzIHdyaXR0ZW4gYW5kIG5vIG90aGVyIHNvdXJjZSBpcyBjb250YWN0ZWQuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gYWN0aXZhdGVTZXJ2ZXJCdWNrZXQoY29uZmlnOiB7IHVybDogc3RyaW5nOyBhY2NvdW50OiBzdHJpbmc7IGJ1Y2tldE5hbWU6IHN0cmluZyB9KTogUHJvbWlzZTxBY3RpdmVCdWNrZXRJbmZvIHwgc3RyaW5nPiB7XG4gICAgcmV0dXJuIGF3YWl0IGNhbGxTZXJ2ZXIoY29uZmlnLnVybCwgY29udHJvbGxlciA9PiBjb250cm9sbGVyLmFjdGl2YXRlQnVja2V0KHsgYWNjb3VudDogY29uZmlnLmFjY291bnQsIGJ1Y2tldE5hbWU6IGNvbmZpZy5idWNrZXROYW1lIH0pKTtcbn1cblxuLyoqIFplcm9lcyB0aGUgd3JpdGUgc3RhdGlzdGljcyBsaXN0U2VydmVyQnVja2V0cyByZXBvcnRzLCBmb3IgZXZlcnkgYnVja2V0IGluIHRoZSBhY2NvdW50LiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNsZWFyU2VydmVyV3JpdGVTdGF0cyhjb25maWc6IHsgdXJsOiBzdHJpbmc7IGFjY291bnQ6IHN0cmluZyB9KTogUHJvbWlzZTx7IGNsZWFyZWRCdWNrZXRzOiBudW1iZXIgfT4ge1xuICAgIHJldHVybiBhd2FpdCBjYWxsU2VydmVyKGNvbmZpZy51cmwsIGNvbnRyb2xsZXIgPT4gY29udHJvbGxlci5jbGVhcldyaXRlU3RhdHMoeyBhY2NvdW50OiBjb25maWcuYWNjb3VudCB9KSk7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRCdWNrZXRJbmZvKGNvbmZpZzogeyB1cmw6IHN0cmluZyB9KTogUHJvbWlzZTxBcmNoaXZlc0NvbmZpZz4ge1xuICAgIC8vIGdldENvbmZpZyBpcyBidWNrZXQtbGV2ZWwgKG5vIHN0b3JlIHNlbGVjdGlvbiksIHNvIHRoZSBmYWJyaWNhdGVkIHNvdXJjZUNvbmZpZyBuZXZlciBoYXMgdG8gbWF0Y2ggYW55dGhpbmdcbiAgICBsZXQgcmVtb3RlID0gbmV3IEFyY2hpdmVzUmVtb3RlKHsgdXJsOiBjb25maWcudXJsLCB3YWl0Rm9yQWNjZXNzOiBmYWxzZSwgc291cmNlQ29uZmlnOiBub3JtYWxpemVTb3VyY2UoY29uZmlnLnVybCkgfSk7XG4gICAgcmV0dXJuIGF3YWl0IHJlbW90ZS5nZXRDb25maWcoKTtcbn1cbiJdfQ==
|
|
1040
|
+
/* _JS_SOURCE_HASH = "345eb4047b5f442f6915a53b5b2673ba34ce79d520ddc96b1e845582888f5e16"; */
|