sliftutils 1.7.70 → 1.7.72
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 +505 -257
- 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/hostServer.ts.cache +5 -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/spec.txt +10 -0
- package/storage/ArchivesDisk.d.ts +4 -13
- package/storage/ArchivesDisk.ts +6 -4
- 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 +14 -10
- package/storage/IArchives.ts +16 -4
- package/storage/backblaze.d.ts +3 -9
- package/storage/backblaze.ts +22 -19
- package/storage/dist/ArchivesDisk.ts.cache +6 -3
- package/storage/dist/FileFolderAPI.tsx.cache +2 -2
- package/storage/dist/IArchives.ts.cache +18 -4
- 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 +36 -27
- package/storage/dist/fileSystemPointer.ts.cache +2 -2
- package/storage/dist/remoteFileStorage.ts.cache +2 -2
- package/storage/remoteStorage/ArchivesRemote.d.ts +5 -9
- package/storage/remoteStorage/ArchivesRemote.ts +25 -20
- package/storage/remoteStorage/ArchivesUrl.d.ts +3 -9
- package/storage/remoteStorage/ArchivesUrl.ts +7 -5
- package/storage/remoteStorage/accessPage.tsx +4 -4
- package/storage/remoteStorage/accessStats.d.ts +2 -0
- package/storage/remoteStorage/accessStats.ts +32 -0
- package/storage/remoteStorage/blobStore.d.ts +193 -88
- package/storage/remoteStorage/blobStore.ts +535 -400
- package/storage/remoteStorage/bucketDisk.d.ts +18 -0
- package/storage/remoteStorage/bucketDisk.ts +66 -0
- package/storage/remoteStorage/createArchives.d.ts +4 -10
- package/storage/remoteStorage/createArchives.ts +102 -63
- package/storage/remoteStorage/dist/ArchivesRemote.ts.cache +29 -20
- package/storage/remoteStorage/dist/ArchivesUrl.ts.cache +8 -5
- package/storage/remoteStorage/dist/accessPage.tsx.cache +6 -6
- package/storage/remoteStorage/dist/accessStats.ts.cache +39 -4
- package/storage/remoteStorage/dist/blobStore.ts.cache +517 -375
- package/storage/remoteStorage/dist/bucketDisk.ts.cache +72 -0
- package/storage/remoteStorage/dist/cliArgs.ts.cache +2 -2
- package/storage/remoteStorage/dist/createArchives.ts.cache +112 -58
- package/storage/remoteStorage/dist/deployTakeover.ts.cache +2 -2
- package/storage/remoteStorage/dist/intermediateSources.ts.cache +13 -13
- package/storage/remoteStorage/dist/remoteConfig.ts.cache +19 -3
- package/storage/remoteStorage/dist/serverConfig.ts.cache +116 -0
- package/storage/remoteStorage/dist/sourceWrapper.ts.cache +7 -6
- package/storage/remoteStorage/dist/sourcesList.ts.cache +6 -3
- package/storage/remoteStorage/dist/storageClientController.ts.cache +2 -2
- package/storage/remoteStorage/dist/storageController.ts.cache +224 -191
- package/storage/remoteStorage/dist/storageServer.ts.cache +9 -9
- package/storage/remoteStorage/dist/storageServerState.ts.cache +330 -567
- package/storage/remoteStorage/dist/storePlan.ts.cache +149 -0
- package/storage/remoteStorage/dist/validation.ts.cache +40 -0
- package/storage/remoteStorage/grantAccessCli.ts +1 -1
- package/storage/remoteStorage/intermediateSources.d.ts +3 -5
- package/storage/remoteStorage/intermediateSources.ts +14 -16
- package/storage/remoteStorage/remoteConfig.d.ts +2 -2
- package/storage/remoteStorage/remoteConfig.ts +19 -3
- package/storage/remoteStorage/serverConfig.d.ts +27 -0
- package/storage/remoteStorage/serverConfig.ts +109 -0
- package/storage/remoteStorage/sourceWrapper.d.ts +3 -3
- package/storage/remoteStorage/sourceWrapper.ts +7 -6
- package/storage/remoteStorage/sourcesList.ts +3 -0
- package/storage/remoteStorage/storageController.d.ts +118 -36
- package/storage/remoteStorage/storageController.ts +166 -168
- package/storage/remoteStorage/storageServer.ts +1 -1
- package/storage/remoteStorage/storageServerState.d.ts +52 -63
- package/storage/remoteStorage/storageServerState.ts +340 -584
- package/storage/remoteStorage/storePlan.d.ts +34 -0
- package/storage/remoteStorage/storePlan.ts +166 -0
- package/storage/remoteStorage/validation.d.ts +4 -0
- package/storage/remoteStorage/validation.ts +31 -0
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
"use strict";
|
|
1
|
+
"use strict";
|
|
2
2
|
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
3
|
return (mod && mod.__esModule && mod.default) ? mod : { "default": mod };
|
|
4
4
|
};
|
|
@@ -24,6 +24,8 @@ let backblazeCreds = (0, caching_1.lazy)(async () => {
|
|
|
24
24
|
});
|
|
25
25
|
// B2's minimum maxAgeSeconds is 60 - anything lower gets bumped to 60 server-side, so a smaller default would never match what the bucket actually stores and we would rewrite its settings on every startup
|
|
26
26
|
const MIN_BUCKET_CACHE_TIME = 60 * 1000;
|
|
27
|
+
// Backblaze requires 5MB chunks for large files, but larger is more efficient for us (and their "last part" size check misbehaves on retries, which chunks this big sidestep - see setLargeFile)
|
|
28
|
+
const LARGE_FILE_MIN_CHUNK_SIZE = 32 * 1024 * 1024;
|
|
27
29
|
// A B2 download/HEAD response's headers carry the file's metadata. content-range's total wins over content-length for ranged responses (which only report the slice's length).
|
|
28
30
|
function parseFileMetadataHeaders(response) {
|
|
29
31
|
let size = Number(response.headers["content-length"] || 0);
|
|
@@ -404,10 +406,10 @@ class ArchivesBackblaze {
|
|
|
404
406
|
let result = await this.apiRetryLogic(`get ${fileName}`, async (api) => {
|
|
405
407
|
let range = config === null || config === void 0 ? void 0 : config.range;
|
|
406
408
|
if (range) {
|
|
407
|
-
// The clamp needs the file's size (and gives us its metadata for free)
|
|
408
|
-
let fileInfo = await this.getInfo(fileName);
|
|
409
|
+
// The clamp needs the file's size (and gives us its metadata for free). The tombstone flag forwards: without it a deleted file's info is hidden, so the ranged read reports absent too.
|
|
410
|
+
let fileInfo = await this.getInfo(fileName, { includeTombstones: config === null || config === void 0 ? void 0 : config.includeTombstones });
|
|
409
411
|
if (!fileInfo)
|
|
410
|
-
|
|
412
|
+
return undefined;
|
|
411
413
|
let rangeStart = range.start;
|
|
412
414
|
let rangeEnd = Math.min(range.end, fileInfo.size);
|
|
413
415
|
// NOTE: I think if we request nothing, it confuses Backblaze and ends up giving us the entire file.
|
|
@@ -430,9 +432,16 @@ class ArchivesBackblaze {
|
|
|
430
432
|
fileName,
|
|
431
433
|
outResponse: response,
|
|
432
434
|
});
|
|
435
|
+
// Backblaze stores this system's deletions as REAL empty files (its hide would make them invisible to scans), so an empty download IS a tombstone - absent, unless the caller asked to see tombstones
|
|
436
|
+
if (!data.length && !(config === null || config === void 0 ? void 0 : config.includeTombstones)) {
|
|
437
|
+
this.log(`backblaze file is a tombstone (deleted) ${fileName}`);
|
|
438
|
+
return undefined;
|
|
439
|
+
}
|
|
433
440
|
let meta = parseFileMetadataHeaders(response);
|
|
434
441
|
return { data, writeTime: meta.uploadTimestamp, size: data.length };
|
|
435
442
|
});
|
|
443
|
+
if (!result)
|
|
444
|
+
return undefined;
|
|
436
445
|
let timeStr = (0, format_1.formatTime)(Date.now() - time);
|
|
437
446
|
let rateStr = (0, format_1.formatNumber)(result.data.length / (Date.now() - time) * 1000) + "B/s";
|
|
438
447
|
this.log(`backblaze download (${(0, format_1.formatNumber)(result.data.length)}B${(config === null || config === void 0 ? void 0 : config.range) && `, ${(0, format_1.formatNumber)(config.range.start)} - ${(0, format_1.formatNumber)(config.range.end)}` || ""}) in ${timeStr} (${rateStr}, ${fileName})`);
|
|
@@ -479,16 +488,19 @@ class ArchivesBackblaze {
|
|
|
479
488
|
}
|
|
480
489
|
if (config === null || config === void 0 ? void 0 : config.lastModified) {
|
|
481
490
|
(0, IArchives_1.assertValidLastModified)(config.lastModified);
|
|
482
|
-
|
|
483
|
-
|
|
484
|
-
|
|
485
|
-
|
|
486
|
-
|
|
487
|
-
|
|
488
|
-
|
|
489
|
-
|
|
490
|
-
|
|
491
|
-
|
|
491
|
+
// This comparison deliberately IGNORES noChecks: backblaze has no server of ours to enforce only-take-the-latest (unlike hosted targets, where the receiving store re-checks), so this comparison IS the ordering guard. Skipping it lets a stale push land over a newer value or tombstone - and because b2 stamps its own upload times, the stale data then becomes the newest-timestamped copy in the whole system, resurrecting globally through everyone's scans. includeTombstones: a deletion on b2 is a real size-0 file and must win this comparison too.
|
|
492
|
+
let existing = await this.getInfo(fileName, { includeTombstones: true });
|
|
493
|
+
// An older write never overwrites a newer one (see IArchives.set). B2 stamps its own upload time, so the exact lastModified is not preserved on the stored file.
|
|
494
|
+
if (existing && config.lastModified < existing.writeTime)
|
|
495
|
+
return fileName;
|
|
496
|
+
// Immutability wins: a synchronization push never overwrites an existing path on an immutable bucket (see SetConfig.forceSetImmutable)
|
|
497
|
+
if (existing && config.forceSetImmutable && this.config.immutable)
|
|
498
|
+
return fileName;
|
|
499
|
+
}
|
|
500
|
+
// Big buffers stream through the large-file API: a failed part retries alone instead of restarting the whole upload. The threshold MUST stay at two full chunks - below that setLargeFile falls back to plain set, which would recurse right back here.
|
|
501
|
+
if (data.length >= LARGE_FILE_MIN_CHUNK_SIZE * 2) {
|
|
502
|
+
await this.setLargeFile({ path: fileName, lastModified: config === null || config === void 0 ? void 0 : config.lastModified, getNextData: (0, IArchives_1.bufferChunkStream)(data) });
|
|
503
|
+
return fileName;
|
|
492
504
|
}
|
|
493
505
|
this.log(`backblaze upload (${(0, format_1.formatNumber)(data.length)}B) ${fileName}`);
|
|
494
506
|
let f = fileName;
|
|
@@ -514,11 +526,10 @@ class ArchivesBackblaze {
|
|
|
514
526
|
async del(fileName, config) {
|
|
515
527
|
if (config === null || config === void 0 ? void 0 : config.lastModified) {
|
|
516
528
|
// A synchronized deletion: b2's hide removes the file from listings entirely, so peers scanning the bucket could never learn of it. Instead the tombstone is stored as a REAL empty file (an empty file IS a missing file), which listings show and scans ingest as a deletion. (b2 stamps its own upload time, so the exact deletion time is not preserved here - same as every b2 write.)
|
|
517
|
-
|
|
518
|
-
|
|
519
|
-
|
|
520
|
-
|
|
521
|
-
}
|
|
529
|
+
// The comparison ignores noChecks for the same reason as in set: on b2 it IS the ordering guard
|
|
530
|
+
let existing = await this.getInfo(fileName, { includeTombstones: true });
|
|
531
|
+
if (existing && config.lastModified < existing.writeTime)
|
|
532
|
+
return;
|
|
522
533
|
this.log(`backblaze tombstone upload ${fileName}`);
|
|
523
534
|
await this.apiRetryLogic(`del ${fileName}`, async (api) => {
|
|
524
535
|
await api.uploadFile({ bucketId: this.bucketId, fileName, data: Buffer.alloc(0) });
|
|
@@ -542,8 +553,6 @@ class ArchivesBackblaze {
|
|
|
542
553
|
let time = Date.now();
|
|
543
554
|
try {
|
|
544
555
|
let { path } = config;
|
|
545
|
-
// Backblaze requires 5MB chunks. But, larger is more efficient for us.
|
|
546
|
-
const MIN_CHUNK_SIZE = 32 * 1024 * 1024;
|
|
547
556
|
let dataQueue = [];
|
|
548
557
|
async function getNextData() {
|
|
549
558
|
if (dataQueue.length)
|
|
@@ -551,7 +560,7 @@ class ArchivesBackblaze {
|
|
|
551
560
|
// Get buffers until we get 5MB, OR, end. Backblaze requires this for large files.
|
|
552
561
|
let totalBytes = 0;
|
|
553
562
|
let buffers = [];
|
|
554
|
-
while (totalBytes <
|
|
563
|
+
while (totalBytes < LARGE_FILE_MIN_CHUNK_SIZE) {
|
|
555
564
|
let data = await config.getNextData();
|
|
556
565
|
if (!data)
|
|
557
566
|
break;
|
|
@@ -568,7 +577,7 @@ class ArchivesBackblaze {
|
|
|
568
577
|
throw new Error(`setLargeFile produced no data for ${JSON.stringify(config.path)} on ${this.getDebugName()}: an empty file IS a deletion in this system - call del to delete, never write empty files`);
|
|
569
578
|
}
|
|
570
579
|
// Backblaze disallows overly small files
|
|
571
|
-
if (data.length <
|
|
580
|
+
if (data.length < LARGE_FILE_MIN_CHUNK_SIZE) {
|
|
572
581
|
await this.set(fileName, data);
|
|
573
582
|
return;
|
|
574
583
|
}
|
|
@@ -579,7 +588,7 @@ class ArchivesBackblaze {
|
|
|
579
588
|
return;
|
|
580
589
|
}
|
|
581
590
|
// ALSO, if there are two chunks, but one is too small, combine it. This helps allow us never send small chunks.
|
|
582
|
-
if (secondData.length <
|
|
591
|
+
if (secondData.length < LARGE_FILE_MIN_CHUNK_SIZE) {
|
|
583
592
|
await this.set(fileName, Buffer.concat([data, secondData]));
|
|
584
593
|
return;
|
|
585
594
|
}
|
|
@@ -611,7 +620,7 @@ class ArchivesBackblaze {
|
|
|
611
620
|
if (partSha1Array.length > 0) {
|
|
612
621
|
let maybeLastData = await getNextData();
|
|
613
622
|
if (maybeLastData) {
|
|
614
|
-
if (maybeLastData.length <
|
|
623
|
+
if (maybeLastData.length < LARGE_FILE_MIN_CHUNK_SIZE) {
|
|
615
624
|
// It's the last one, so consume it now
|
|
616
625
|
data = Buffer.concat([data, maybeLastData]);
|
|
617
626
|
}
|
|
@@ -844,5 +853,5 @@ exports.getArchivesBackblazePublic = (0, caching_1.cache)((domain) => {
|
|
|
844
853
|
allowedOrigins: [`https://${domain}`, `https://127-0-0-1.${domain}:7007`],
|
|
845
854
|
});
|
|
846
855
|
});
|
|
847
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFja2JsYXplLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiYmFja2JsYXplLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLHlEQUEwRDtBQUcxRCxtREFBa0Y7QUFDbEYsMkRBQXFEO0FBQ3JELGtFQUFpRjtBQUNqRix3RUFBZ0Y7QUFFaEYsOENBQXNCO0FBQ3RCLGlEQUE4QztBQUM5QyxxREFBNEU7QUFDNUUsMkNBQTRMO0FBQzVMLCtEQUE2RDtBQU83RCxJQUFJLGNBQWMsR0FBRyxJQUFBLGNBQUksRUFBQyxLQUFLLElBQTZCLEVBQUU7SUFDMUQsSUFBSSxLQUFLLEdBQUcsTUFBTSxJQUFBLHFCQUFTLEVBQUMsaUNBQWlDLENBQUMsQ0FBQztJQUMvRCxJQUFJLEdBQUcsR0FBRyxNQUFNLElBQUEscUJBQVMsRUFBQywrQkFBK0IsQ0FBQyxDQUFDO0lBQzNELE9BQU87UUFDSCxnQkFBZ0IsRUFBRSxLQUFLO1FBQ3ZCLGNBQWMsRUFBRSxHQUFHO0tBQ3RCLENBQUM7QUFDTixDQUFDLENBQUMsQ0FBQztBQUNILDZNQUE2TTtBQUM3TSxNQUFNLHFCQUFxQixHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUM7QUFFeEMsK0tBQStLO0FBQy9LLFNBQVMsd0JBQXdCLENBQUMsUUFBMkI7SUFDekQsSUFBSSxJQUFJLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztJQUMzRCxJQUFJLFlBQVksR0FBRyxRQUFRLENBQUMsT0FBTyxDQUFDLGVBQWUsQ0FBQyxDQUFDO0lBQ3JELElBQUksS0FBSyxHQUFHLFlBQVksSUFBSSxNQUFNLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQy9ELElBQUksS0FBSyxJQUFJLE1BQU0sQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztRQUNsQyxJQUFJLEdBQUcs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LElBQUk7UUFDZixjQUFjLEVBQUUsQ0FBQyxXQUFXLE1BQU0sRUFBRSxFQUFFLHFCQUFxQixNQUFNLE9BQU8sQ0FBQztLQUM1RSxDQUFDLENBQUM7QUFDUCxDQUFDLENBQUMsQ0FBQztBQUVILDJRQUEyUTtBQUM5UCxRQUFBLDBCQUEwQixHQUFHLElBQUEsZUFBSyxFQUFDLENBQUMsTUFBYyxFQUFFLEVBQUU7SUFDL0QsT0FBTyxJQUFJLGlCQUFpQixDQUFDO1FBQ3pCLFVBQVUsRUFBRSxNQUFNLEdBQUcsU0FBUztRQUM5QixNQUFNLEVBQUUsSUFBSTtRQUNaLFNBQVMsRUFBRSxtQkFBWTtRQUN2QixjQUFjLEVBQUUsQ0FBQyxXQUFXLE1BQU0sRUFBRSxFQUFFLHFCQUFxQixNQUFNLE9BQU8sQ0FBQztLQUM1RSxDQUFDLENBQUM7QUFDUCxDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGNhY2hlLCBsYXp5IH0gZnJvbSBcInNvY2tldC1mdW5jdGlvbi9zcmMvY2FjaGluZ1wiO1xuaW1wb3J0IGZzIGZyb20gXCJmc1wiO1xuaW1wb3J0IG9zIGZyb20gXCJvc1wiO1xuaW1wb3J0IHsgaXNOb2RlLCBzb3J0LCB0aW1lSW5Ib3VyLCB0aW1lSW5NaW51dGUgfSBmcm9tIFwic29ja2V0LWZ1bmN0aW9uL3NyYy9taXNjXCI7XG5pbXBvcnQgeyBkZWxheSB9IGZyb20gXCJzb2NrZXQtZnVuY3Rpb24vc3JjL2JhdGNoaW5nXCI7XG5pbXBvcnQgeyBmb3JtYXROdW1iZXIsIGZvcm1hdFRpbWUgfSBmcm9tIFwic29ja2V0LWZ1bmN0aW9uL3NyYy9mb3JtYXR0aW5nL2Zvcm1hdFwiO1xuaW1wb3J0IHsgYmx1ZSwgZ3JlZW4sIG1hZ2VudGEgfSBmcm9tIFwic29ja2V0LWZ1bmN0aW9uL3NyYy9mb3JtYXR0aW5nL2xvZ0NvbG9yc1wiO1xuaW1wb3J0IGRlYnVnYnJlYWsgZnJvbSBcImRlYnVnYnJlYWtcIjtcbmltcG9ydCBkbnMgZnJvbSBcImRuc1wiO1xuaW1wb3J0IHsgZ2V0U2VjcmV0IH0gZnJvbSBcIi4uL21pc2MvZ2V0U2VjcmV0XCI7XG5pbXBvcnQgeyBodHRwc1JlcXVlc3QsIEh0dHBzUmVzcG9uc2VJbmZvIH0gZnJvbSBcInNvY2tldC1mdW5jdGlvbi9zcmMvaHR0cHNcIjtcbmltcG9ydCB7IElBcmNoaXZlcywgQXJjaGl2ZXNDb25maWcsIENoYW5nZXNBZnRlckNvbmZpZywgQXJjaGl2ZUZpbGVJbmZvLCBEZWxDb25maWcsIEdldENvbmZpZywgR2V0SW5mb0NvbmZpZywgU2V0Q29uZmlnLCBhc3NlcnRWYWxpZExhc3RNb2RpZmllZCwgSU1NVVRBQkxFX0NBQ0hFX1RJTUUgfSBmcm9tIFwiLi9JQXJjaGl2ZXNcIjtcbmltcG9ydCB7IGZpbHRlckNoYW5nZXMgfSBmcm9tIFwiLi9yZW1vdGVTdG9yYWdlL3JlbW90ZUNvbmZpZ1wiO1xuXG50eXBlIEJhY2tibGF6ZUNyZWRzID0ge1xuICAgIGFwcGxpY2F0aW9uS2V5SWQ6IHN0cmluZztcbiAgICBhcHBsaWNhdGlvbktleTogc3RyaW5nO1xufTtcblxubGV0IGJhY2tibGF6ZUNyZWRzID0gbGF6eShhc3luYyAoKTogUHJvbWlzZTxCYWNrYmxhemVDcmVkcz4gPT4ge1xuICAgIGxldCBrZXlJZCA9IGF3YWl0IGdldFNlY3JldChcImJhY2tibGF6ZS5qc29uLmFwcGxpY2F0aW9uS2V5SWRcIik7XG4gICAgbGV0IGtleSA9IGF3YWl0IGdldFNlY3JldChcImJhY2tibGF6ZS5qc29uLmFwcGxpY2F0aW9uS2V5XCIpO1xuICAgIHJldHVybiB7XG4gICAgICAgIGFwcGxpY2F0aW9uS2V5SWQ6IGtleUlkLFxuICAgICAgICBhcHBsaWNhdGlvbktleToga2V5LFxuICAgIH07XG59KTtcbi8vIEIyJ3MgbWluaW11bSBtYXhBZ2VTZWNvbmRzIGlzIDYwIC0gYW55dGhpbmcgbG93ZXIgZ2V0cyBidW1wZWQgdG8gNjAgc2VydmVyLXNpZGUsIHNvIGEgc21hbGxlciBkZWZhdWx0IHdvdWxkIG5ldmVyIG1hdGNoIHdoYXQgdGhlIGJ1Y2tldCBhY3R1YWxseSBzdG9yZXMgYW5kIHdlIHdvdWxkIHJld3JpdGUgaXRzIHNldHRpbmdzIG9uIGV2ZXJ5IHN0YXJ0dXBcbmNvbnN0IE1JTl9CVUNLRVRfQ0FDSEVfVElNRSA9IDYwICogMTAwMDtcblxuLy8gQSBCMiBkb3dubG9hZC9IRUFEIHJlc3BvbnNlJ3MgaGVhZGVycyBjYXJyeSB0aGUgZmlsZSdzIG1ldGFkYXRhLiBjb250ZW50LXJhbmdlJ3MgdG90YWwgd2lucyBvdmVyIGNvbnRlbnQtbGVuZ3RoIGZvciByYW5nZWQgcmVzcG9uc2VzICh3aGljaCBvbmx5IHJlcG9ydCB0aGUgc2xpY2UncyBsZW5ndGgpLlxuZnVuY3Rpb24gcGFyc2VGaWxlTWV0YWRhdGFIZWFkZXJzKHJlc3BvbnNlOiBIdHRwc1Jlc3BvbnNlSW5mbyk6IHsgc2l6ZTogbnVtYmVyOyB1cGxvYWRUaW1lc3RhbXA6IG51bWJlciB9IHtcbiAgICBsZXQgc2l6ZSA9IE51bWJlcihyZXNwb25zZS5oZWFkZXJzW1wiY29udGVudC1sZW5ndGhcIl0gfHwgMCk7XG4gICAgbGV0IGNvbnRlbnRSYW5nZSA9IHJlc3BvbnNlLmhlYWRlcnNbXCJjb250ZW50LXJhbmdlXCJdO1xuICAgIGxldCB0b3RhbCA9IGNvbnRlbnRSYW5nZSAmJiBOdW1iZXIoY29udGVudFJhbmdlLnNwbGl0KFwiL1wiKVsxXSk7XG4gICAgaWYgKHRvdGFsICYmIE51bWJlci5pc0Zpbml0ZSh0b3RhbCkpIHtcbiAgICAgICAgc2l6ZSA9IHRvdGFsO1xuICAgIH1cbiAgICByZXR1cm4geyBzaXplLCB1cGxvYWRUaW1lc3RhbXA6IE51bWJlcihyZXNwb25zZS5oZWFkZXJzW1wieC1iei11cGxvYWQtdGltZXN0YW1wXCJdIHx8IDApIH07XG59XG5cbmNvbnN0IGdldEFQSSA9IGxhenkoYXN5bmMgKCkgPT4ge1xuICAgIGxldCBjcmVkcyA9IGF3YWl0IGJhY2tibGF6ZUNyZWRzKCk7XG5cbiAgICAvLyBOT1RFOiBPbiBlcnJvcnMsIG91ciByZXRyeSBjb2RlIHJlc2V0cyB0aGlzIGxhenksIHNvIHdlIERPIGdldCBuZXcgYXV0aG9yaXplIHdoZW4gbmVlZGVkLlxuICAgIC8vIFRPRE86IE1heWJlIHdlIHNob3VsZCBnZXQgbmV3IGF1dGhvcml6YXRpb24gcGVyaW9kaWNhbGx5IGF0IHdlbGw/XG4gICAgbGV0IGF1dGhvcml6ZVJhdyA9IGF3YWl0IGh0dHBzUmVxdWVzdChcImh0dHBzOi8vYXBpLmJhY2tibGF6ZWIyLmNvbS9iMmFwaS92Mi9iMl9hdXRob3JpemVfYWNjb3VudFwiLCB1bmRlZmluZWQsIFwiR0VUXCIsIHVuZGVmaW5lZCwge1xuICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgICBBdXRob3JpemF0aW9uOiBcIkJhc2ljIFwiICsgQnVmZmVyLmZyb20oY3JlZHMuYXBwbGljYXRpb25LZXlJZCArIFwiOlwiICsgY3JlZHMuYXBwbGljYXRpb25LZXkpLnRvU3RyaW5nKFwiYmFzZTY0XCIpLFxuICAgICAgICB9XG4gICAgfSk7XG5cbiAgICBsZXQgYXV0aCA9IEpTT04ucGFyc2UoYXV0aG9yaXplUmF3LnRvU3RyaW5nKCkpIGFzIHtcbiAgICAgICAgYWNjb3VudElkOiBzdHJpbmc7XG4gICAgICAgIGF1dGhvcml6YXRpb25Ub2tlbjogc3RyaW5nO1xuICAgICAgICBhcGlVcmw6IHN0cmluZztcbiAgICAgICAgZG93bmxvYWRVcmw6IHN0cmluZztcbiAgICAgICAgYWxsb3dlZDoge1xuICAgICAgICAgICAgYnVja2V0SWQ6IHN0cmluZztcbiAgICAgICAgICAgIGJ1Y2tldE5hbWU6IHN0cmluZztcbiAgICAgICAgICAgIGNhcGFiaWxpdGllczogc3RyaW5nW107XG4gICAgICAgICAgICBuYW1lUHJlZml4OiBzdHJpbmc7XG4gICAgICAgIH1bXTtcbiAgICB9O1xuXG4gICAgZnVuY3Rpb24gY3JlYXRlQjJGdW5jdGlvbjxBcmcsIFJlc3VsdD4obmFtZTogc3RyaW5nLCB0eXBlOiBcIlBPU1RcIiB8IFwiR0VUXCIsIG5vQWNjb3VudElkPzogXCJub0FjY291bnRJZFwiKTogKGFyZzogQXJnKSA9PiBQcm9taXNlPFJlc3VsdD4ge1xuICAgICAgICByZXR1cm4gYXN5bmMgKGFyZzogQXJnKSA9PiB7XG4gICAgICAgICAgICBpZiAoIW5vQWNjb3VudElkKSB7XG4gICAgICAgICAgICAgICAgYXJnID0geyBhY2NvdW50SWQ6IGF1dGguYWNjb3VudElkLCAuLi5hcmcgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgbGV0IHVybCA9IGF1dGguYXBpVXJsICsgXCIvYjJhcGkvdjIvXCIgKyBuYW1lO1xuICAgICAgICAgICAgICAgIGxldCByZXN1bHQgPSBhd2FpdCBodHRwc1JlcXVlc3QodXJsLCBCdWZmZXIuZnJvbShKU09OLnN0cmluZ2lmeShhcmcpKSwgdHlwZSwgdW5kZWZpbmVkLCB7XG4gICAgICAgICAgICAgICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIEF1dGhvcml6YXRpb246IGF1dGguYXV0aG9yaXphdGlvblRva2VuLFxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIEpTT04ucGFyc2UocmVzdWx0LnRvU3RyaW5nKCkpO1xuICAgICAgICAgICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBFcnJvciBpbiAke25hbWV9LCBhcmcgJHtKU09OLnN0cmluZ2lmeShhcmcpLnNsaWNlKDAsIDEwMDApfTogJHtlLnN0YWNrfWApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgIH1cblxuICAgIGNvbnN0IGNyZWF0ZUJ1Y2tldCA9IGNyZWF0ZUIyRnVuY3Rpb248e1xuICAgICAgICBidWNrZXROYW1lOiBzdHJpbmc7XG4gICAgICAgIGJ1Y2tldFR5cGU6IFwiYWxsUHJpdmF0ZVwiIHwgXCJhbGxQdWJsaWNcIjtcbiAgICAgICAgbGlmZWN5Y2xlUnVsZXM/OiBhbnlbXTtcbiAgICAgICAgY29yc1J1bGVzPzogdW5rbm93bltdO1xuICAgICAgICBidWNrZXRJbmZvPzoge1xuICAgICAgICAgICAgW2tleTogc3RyaW5nXTogdW5rbm93bjtcbiAgICAgICAgfTtcbiAgICB9LCB7XG4gICAgICAgIGFjY291bnRJZDogc3RyaW5nO1xuICAgICAgICBidWNrZXRJZDogc3RyaW5nO1xuICAgICAgICBidWNrZXROYW1lOiBzdHJpbmc7XG4gICAgICAgIGJ1Y2tldFR5cGU6IFwiYWxsUHJpdmF0ZVwiIHwgXCJhbGxQdWJsaWNcIjtcbiAgICAgICAgYnVja2V0SW5mbzoge1xuICAgICAgICAgICAgbGlmZWN5Y2xlUnVsZXM6IGFueVtdO1xuICAgICAgICB9O1xuICAgICAgICBjb3JzUnVsZXM6IGFueVtdO1xuICAgICAgICBsaWZlY3ljbGVSdWxlczogYW55W107XG4gICAgICAgIHJldmlzaW9uOiBudW1iZXI7XG4gICAgfT4oXCJiMl9jcmVhdGVfYnVja2V0XCIsIFwiUE9TVFwiKTtcblxuICAgIGNvbnN0IHVwZGF0ZUJ1Y2tldCA9IGNyZWF0ZUIyRnVuY3Rpb248e1xuICAgICAgICBhY2NvdW50SWQ6IHN0cmluZztcbiAgICAgICAgYnVja2V0SWQ6IHN0cmluZztcbiAgICAgICAgYnVja2V0VHlwZT86IFwiYWxsUHJpdmF0ZVwiIHwgXCJhbGxQdWJsaWNcIjtcbiAgICAgICAgbGlmZWN5Y2xlUnVsZXM/OiBhbnlbXTtcbiAgICAgICAgYnVja2V0SW5mbz86IHtcbiAgICAgICAgICAgIFtrZXk6IHN0cmluZ106IHVua25vd247XG4gICAgICAgIH07XG4gICAgICAgIGNvcnNSdWxlcz86IHVua25vd25bXTtcbiAgICB9LCB7XG4gICAgICAgIGFjY291bnRJZDogc3RyaW5nO1xuICAgICAgICBidWNrZXRJZDogc3RyaW5nO1xuICAgICAgICBidWNrZXROYW1lOiBzdHJpbmc7XG4gICAgICAgIGJ1Y2tldFR5cGU6IFwiYWxsUHJpdmF0ZVwiIHwgXCJhbGxQdWJsaWNcIjtcbiAgICAgICAgYnVja2V0SW5mbzoge1xuICAgICAgICAgICAgbGlmZWN5Y2xlUnVsZXM6IGFueVtdO1xuICAgICAgICB9O1xuICAgICAgICBjb3JzUnVsZXM6IGFueVtdO1xuICAgICAgICBsaWZlY3ljbGVSdWxlczogYW55W107XG4gICAgICAgIHJldmlzaW9uOiBudW1iZXI7XG4gICAgfT4oXCJiMl91cGRhdGVfYnVja2V0XCIsIFwiUE9TVFwiKTtcblxuICAgIC8vIGh0dHBzOi8vd3d3LmJhY2tibGF6ZS5jb20vYXBpZG9jcy9iMi11cGRhdGUtYnVja2V0XG4gICAgLy8gIFRPRE86IGIyX3VwZGF0ZV9idWNrZXQsIHNvIHdlIGNhbiB1cGRhdGUgQ09SUywgZXRjXG5cbiAgICBjb25zdCBsaXN0QnVja2V0cyA9IGNyZWF0ZUIyRnVuY3Rpb248e1xuICAgICAgICBidWNrZXROYW1lPzogc3RyaW5nO1xuICAgIH0sIHtcbiAgICAgICAgYnVja2V0czoge1xuICAgICAgICAgICAgYWNjb3VudElkOiBzdHJpbmc7XG4gICAgICAgICAgICBidWNrZXRJZDogc3RyaW5nO1xuICAgICAgICAgICAgYnVja2V0TmFtZTogc3RyaW5nO1xuICAgICAgICAgICAgYnVja2V0VHlwZTogXCJhbGxQcml2YXRlXCIgfCBcImFsbFB1YmxpY1wiO1xuICAgICAgICAgICAgYnVja2V0SW5mbzoge1xuICAgICAgICAgICAgICAgIGxpZmVjeWNsZVJ1bGVzOiBhbnlbXTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBjb3JzUnVsZXM6IGFueVtdO1xuICAgICAgICAgICAgbGlmZWN5Y2xlUnVsZXM6IGFueVtdO1xuICAgICAgICAgICAgcmV2aXNpb246IG51bWJlcjtcbiAgICAgICAgfVtdO1xuICAgIH0+KFwiYjJfbGlzdF9idWNrZXRzXCIsIFwiUE9TVFwiKTtcblxuICAgIGZ1bmN0aW9uIGVuY29kZVBhdGgocGF0aDogc3RyaW5nKSB7XG4gICAgICAgIC8vIFByZXNlcnZlIHNsYXNoZXMsIGJ1dCBlbmNvZGUgZXZlcnl0aGluZyBlbHNlXG4gICAgICAgIHBhdGggPSBwYXRoLnNwbGl0KFwiL1wiKS5tYXAoZW5jb2RlVVJJQ29tcG9uZW50KS5qb2luKFwiL1wiKTtcbiAgICAgICAgaWYgKHBhdGguc3RhcnRzV2l0aChcIi9cIikpIHBhdGggPSBcIiUyRlwiICsgcGF0aC5zbGljZSgxKTtcbiAgICAgICAgaWYgKHBhdGguZW5kc1dpdGgoXCIvXCIpKSBwYXRoID0gcGF0aC5zbGljZSgwLCAtMSkgKyBcIiUyRlwiO1xuICAgICAgICAvLyBOT1RFOiBGb3Igc29tZSByZWFzb24sIHRoaXMgd29uJ3QgcmVuZGVyIGluIHRoZSB3ZWIgVUkgY29ycmVjdGx5LiBCVVQsIGl0J2xsXG4gICAgICAgIC8vICB3b3JrIGdldCBnZXQvc2V0IGFuZCBmaW5kXG4gICAgICAgIC8vICAtIEFMU08sIGl0IHNlZW1zIHRvIGFkZCBkdXBsaWNhdGUgZmlsZXM/IFRoaXMgbWlnaHQgYWxzbyBiZSBhIHdlYiBVSSB0aGluZy4gSXQgc2VlbXMgdG8gd29yayB0aG91Z2guXG4gICAgICAgIHdoaWxlIChwYXRoLmluY2x1ZGVzKFwiLy9cIikpIHtcbiAgICAgICAgICAgIHBhdGggPSBwYXRoLnJlcGxhY2VBbGwoXCIvL1wiLCBcIi8lMkZcIik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHBhdGg7XG4gICAgfVxuXG4gICAgYXN5bmMgZnVuY3Rpb24gZG93bmxvYWRGaWxlQnlOYW1lKGNvbmZpZzoge1xuICAgICAgICBidWNrZXROYW1lOiBzdHJpbmc7XG4gICAgICAgIGZpbGVOYW1lOiBzdHJpbmc7XG4gICAgICAgIHJhbmdlPzogeyBzdGFydDogbnVtYmVyOyBlbmQ6IG51bWJlcjsgfTtcbiAgICAgICAgLy8gQ2FwdHVyZXMgdGhlIHJlc3BvbnNlIGhlYWRlcnMsIHdoaWNoIGNhcnJ5IHRoZSBmaWxlJ3MgbWV0YWRhdGEgKHgtYnotdXBsb2FkLXRpbWVzdGFtcCwgY29udGVudC1sZW5ndGggLyBjb250ZW50LXJhbmdlKSAtIHNvIGNhbGxlcnMgdGhhdCBuZWVkIGl0IGRvbid0IHBheSBhIHNlY29uZCBBUEkgY2FsbFxuICAgICAgICBvdXRSZXNwb25zZT86IEh0dHBzUmVzcG9uc2VJbmZvO1xuICAgIH0pIHtcbiAgICAgICAgbGV0IGZpbGVOYW1lID0gZW5jb2RlUGF0aChjb25maWcuZmlsZU5hbWUpO1xuXG4gICAgICAgIGxldCByZXN1bHQgPSBhd2FpdCBodHRwc1JlcXVlc3QoYXV0aC5hcGlVcmwgKyBcIi9maWxlL1wiICsgY29uZmlnLmJ1Y2tldE5hbWUgKyBcIi9cIiArIGZpbGVOYW1lLCBCdWZmZXIuZnJvbShKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgICBhY2NvdW50SWQ6IGF1dGguYWNjb3VudElkLFxuICAgICAgICAgICAgcmVzcG9uc2VUeXBlOiBcImFycmF5YnVmZmVyXCIsXG4gICAgICAgIH0pKSwgXCJHRVRcIiwgdW5kZWZpbmVkLCB7XG4gICAgICAgICAgICBoZWFkZXJzOiBPYmplY3QuZnJvbUVudHJpZXMoT2JqZWN0LmVudHJpZXMoe1xuICAgICAgICAgICAgICAgIEF1dGhvcml6YXRpb246IGF1dGguYXV0aG9yaXphdGlvblRva2VuLFxuICAgICAgICAgICAgICAgIFwiQ29udGVudC1UeXBlXCI6IFwiYXBwbGljYXRpb24vanNvblwiLFxuICAgICAgICAgICAgICAgIFJhbmdlOiBjb25maWcucmFuZ2UgPyBgYnl0ZXM9JHtjb25maWcucmFuZ2Uuc3RhcnR9LSR7Y29uZmlnLnJhbmdlLmVuZCAtIDF9YCA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIH0pLmZpbHRlcih4ID0+IHhbMV0gIT09IHVuZGVmaW5lZCkpLFxuICAgICAgICAgICAgb3V0UmVzcG9uc2U6IGNvbmZpZy5vdXRSZXNwb25zZSxcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqIEEgZmlsZSdzIG1ldGFkYXRhIGJ5IG5hbWUsIHdpdGhvdXQgdGhlIGJvZHk6IEhFQUQgb24gdGhlIGRvd25sb2FkIFVSTCwgd2hpY2ggaXMgYSBjbGFzcyBCIChkb3dubG9hZC1wcmljZWQpIHRyYW5zYWN0aW9uIC0gYjJfbGlzdF9maWxlX25hbWVzIGlzIGNsYXNzIEMgYXQgMTB4IHRoZSBwcmljZSwgYW5kIGIyX2dldF9maWxlX2luZm8gbmVlZHMgYSBmaWxlSWQgd2UgZG9uJ3QgaGF2ZS4gUmV0dXJucyB1bmRlZmluZWQgZm9yIG1pc3NpbmcgKG9yIGhpZGRlbikgZmlsZXMuICovXG4gICAgYXN5bmMgZnVuY3Rpb24gaGVhZEZpbGVCeU5hbWUoY29uZmlnOiB7IGJ1Y2tldE5hbWU6IHN0cmluZzsgZmlsZU5hbWU6IHN0cmluZyB9KTogUHJvbWlzZTx7IHNpemU6IG51bWJlcjsgdXBsb2FkVGltZXN0YW1wOiBudW1iZXIgfSB8IHVuZGVmaW5lZD4ge1xuICAgICAgICBsZXQgZmlsZU5hbWUgPSBlbmNvZGVQYXRoKGNvbmZpZy5maWxlTmFtZSk7XG4gICAgICAgIGxldCByZXNwb25zZTogSHR0cHNSZXNwb25zZUluZm8gPSB7IGhlYWRlcnM6IHt9IH07XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBhd2FpdCBodHRwc1JlcXVlc3QoYXV0aC5hcGlVcmwgKyBcIi9maWxlL1wiICsgY29uZmlnLmJ1Y2tldE5hbWUgKyBcIi9cIiArIGZpbGVOYW1lLCB1bmRlZmluZWQsIFwiSEVBRFwiLCB1bmRlZmluZWQsIHtcbiAgICAgICAgICAgICAgICBoZWFkZXJzOiB7IEF1dGhvcml6YXRpb246IGF1dGguYXV0aG9yaXphdGlvblRva2VuIH0sXG4gICAgICAgICAgICAgICAgb3V0UmVzcG9uc2U6IHJlc3BvbnNlLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIGlmIChyZXNwb25zZS5zdGF0dXNDb2RlID09PSA0MDQpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgICAgICAvLyBIRUFEIHJlc3BvbnNlcyBoYXZlIG5vIGJvZHksIHNvIHRoZSBleHBpcmVkX2F1dGhfdG9rZW4gbWFya2VyIGFwaVJldHJ5TG9naWMgbWF0Y2hlcyBvbiBuZXZlciBhcHBlYXJzIC0gcmUtYWRkIGl0IHNvIGFuIGV4cGlyZWQgdG9rZW4gc3RpbGwgcmVmcmVzaGVzIGFuZCByZXRyaWVzXG4gICAgICAgICAgICBpZiAocmVzcG9uc2Uuc3RhdHVzQ29kZSA9PT0gNDAxKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBcImV4cGlyZWRfYXV0aF90b2tlblwiIEhFQUQgJHtjb25maWcuYnVja2V0TmFtZX0vJHtjb25maWcuZmlsZU5hbWV9IGdvdCBhIDQwMTogJHsoZSBhcyBFcnJvcikuc3RhY2sgPz8gZX1gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRocm93IGU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHBhcnNlRmlsZU1ldGFkYXRhSGVhZGVycyhyZXNwb25zZSk7XG4gICAgfVxuXG4gICAgLy8gT2guLi4gYXBwYXJlbnRseSwgd2UgY2FuJ3QgcmV1c2UgdGhlc2U/IEh1aC4uLlxuICAgIGNvbnN0IGdldFVwbG9hZFVSTCA9IChhc3luYyAoYnVja2V0SWQ6IHN0cmluZykgPT4ge1xuICAgICAgICAvLyBzZXRUaW1lb3V0KCgpID0+IGdldFVwbG9hZFVSTC5jbGVhcihidWNrZXRJZCksIHRpbWVJbkhvdXIgKiAxKTtcbiAgICAgICAgbGV0IGdldFVwbG9hZFVybFJhdyA9IGF3YWl0IGh0dHBzUmVxdWVzdChhdXRoLmFwaVVybCArIFwiL2IyYXBpL3YyL2IyX2dldF91cGxvYWRfdXJsP2J1Y2tldElkPVwiICsgYnVja2V0SWQsIHVuZGVmaW5lZCwgXCJHRVRcIiwgdW5kZWZpbmVkLCB7XG4gICAgICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgICAgICAgQXV0aG9yaXphdGlvbjogYXV0aC5hdXRob3JpemF0aW9uVG9rZW4sXG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiBKU09OLnBhcnNlKGdldFVwbG9hZFVybFJhdy50b1N0cmluZygpKSBhcyB7XG4gICAgICAgICAgICBidWNrZXRJZDogc3RyaW5nO1xuICAgICAgICAgICAgdXBsb2FkVXJsOiBzdHJpbmc7XG4gICAgICAgICAgICBhdXRob3JpemF0aW9uVG9rZW46IHN0cmluZztcbiAgICAgICAgfTtcbiAgICB9KTtcblxuICAgIGFzeW5jIGZ1bmN0aW9uIHVwbG9hZEZpbGUoY29uZmlnOiB7XG4gICAgICAgIGJ1Y2tldElkOiBzdHJpbmc7XG4gICAgICAgIGZpbGVOYW1lOiBzdHJpbmc7XG4gICAgICAgIGRhdGE6IEJ1ZmZlcjtcbiAgICB9KSB7XG4gICAgICAgIGxldCBnZXRVcGxvYWRVcmwgPSBhd2FpdCBnZXRVcGxvYWRVUkwoY29uZmlnLmJ1Y2tldElkKTtcblxuICAgICAgICBhd2FpdCBodHRwc1JlcXVlc3QoZ2V0VXBsb2FkVXJsLnVwbG9hZFVybCwgY29uZmlnLmRhdGEsIFwiUE9TVFwiLCB1bmRlZmluZWQsIHtcbiAgICAgICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICAgICAgICBBdXRob3JpemF0aW9uOiBnZXRVcGxvYWRVcmwuYXV0aG9yaXphdGlvblRva2VuLFxuICAgICAgICAgICAgICAgIFwiWC1Cei1GaWxlLU5hbWVcIjogZW5jb2RlUGF0aChjb25maWcuZmlsZU5hbWUpLFxuICAgICAgICAgICAgICAgIFwiQ29udGVudC1UeXBlXCI6IFwiYjIveC1hdXRvXCIsXG4gICAgICAgICAgICAgICAgXCJYLUJ6LUNvbnRlbnQtU2hhMVwiOiBcImRvX25vdF92ZXJpZnlcIixcbiAgICAgICAgICAgICAgICBcIkNvbnRlbnQtTGVuZ3RoXCI6IGNvbmZpZy5kYXRhLmxlbmd0aCArIFwiXCIsXG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGNvbnN0IGhpZGVGaWxlID0gY3JlYXRlQjJGdW5jdGlvbjx7XG4gICAgICAgIGJ1Y2tldElkOiBzdHJpbmc7XG4gICAgICAgIGZpbGVOYW1lOiBzdHJpbmc7XG4gICAgfSwge30+KFwiYjJfaGlkZV9maWxlXCIsIFwiUE9TVFwiLCBcIm5vQWNjb3VudElkXCIpO1xuXG4gICAgY29uc3QgZ2V0RmlsZUluZm8gPSBjcmVhdGVCMkZ1bmN0aW9uPHtcbiAgICAgICAgYnVja2V0TmFtZTogc3RyaW5nO1xuICAgICAgICBmaWxlSWQ6IHN0cmluZztcbiAgICB9LCB7XG4gICAgICAgIGZpbGVJZDogc3RyaW5nO1xuICAgICAgICBmaWxlTmFtZTogc3RyaW5nO1xuICAgICAgICBhY2NvdW50SWQ6IHN0cmluZztcbiAgICAgICAgYnVja2V0SWQ6IHN0cmluZztcbiAgICAgICAgY29udGVudExlbmd0aDogbnVtYmVyO1xuICAgICAgICBjb250ZW50U2hhMTogc3RyaW5nO1xuICAgICAgICBjb250ZW50VHlwZTogc3RyaW5nO1xuICAgICAgICBmaWxlSW5mbzoge1xuICAgICAgICAgICAgc3JjX2xhc3RfbW9kaWZpZWRfbWlsbGlzOiBudW1iZXI7XG4gICAgICAgIH07XG4gICAgICAgIGFjdGlvbjogc3RyaW5nO1xuICAgICAgICB1cGxvYWRUaW1lc3RhbXA6IG51bWJlcjtcbiAgICB9PihcImIyX2dldF9maWxlX2luZm9cIiwgXCJQT1NUXCIsIFwibm9BY2NvdW50SWRcIik7XG5cbiAgICBjb25zdCBsaXN0RmlsZU5hbWVzID0gY3JlYXRlQjJGdW5jdGlvbjx7XG4gICAgICAgIGJ1Y2tldElkOiBzdHJpbmc7XG4gICAgICAgIHByZWZpeDogc3RyaW5nO1xuICAgICAgICBzdGFydEZpbGVOYW1lPzogc3RyaW5nO1xuICAgICAgICBtYXhGaWxlQ291bnQ/OiBudW1iZXI7XG4gICAgICAgIGRlbGltaXRlcj86IHN0cmluZztcbiAgICB9LCB7XG4gICAgICAgIGZpbGVzOiB7XG4gICAgICAgICAgICBmaWxlSWQ6IHN0cmluZztcbiAgICAgICAgICAgIGZpbGVOYW1lOiBzdHJpbmc7XG4gICAgICAgICAgICBhY2NvdW50SWQ6IHN0cmluZztcbiAgICAgICAgICAgIGJ1Y2tldElkOiBzdHJpbmc7XG4gICAgICAgICAgICBjb250ZW50TGVuZ3RoOiBudW1iZXI7XG4gICAgICAgICAgICBjb250ZW50U2hhMTogc3RyaW5nO1xuICAgICAgICAgICAgY29udGVudFR5cGU6IHN0cmluZztcbiAgICAgICAgICAgIGZpbGVJbmZvOiB7XG4gICAgICAgICAgICAgICAgc3JjX2xhc3RfbW9kaWZpZWRfbWlsbGlzOiBudW1iZXI7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgYWN0aW9uOiBzdHJpbmc7XG4gICAgICAgICAgICB1cGxvYWRUaW1lc3RhbXA6IG51bWJlcjtcbiAgICAgICAgfVtdO1xuICAgICAgICBuZXh0RmlsZU5hbWU6IHN0cmluZztcbiAgICB9PihcImIyX2xpc3RfZmlsZV9uYW1lc1wiLCBcIlBPU1RcIiwgXCJub0FjY291bnRJZFwiKTtcblxuICAgIGNvbnN0IGNvcHlGaWxlID0gY3JlYXRlQjJGdW5jdGlvbjx7XG4gICAgICAgIHNvdXJjZUZpbGVJZDogc3RyaW5nO1xuICAgICAgICBmaWxlTmFtZTogc3RyaW5nO1xuICAgICAgICBkZXN0aW5hdGlvbkJ1Y2tldElkOiBzdHJpbmc7XG4gICAgfSwge30+KFwiYjJfY29weV9maWxlXCIsIFwiUE9TVFwiLCBcIm5vQWNjb3VudElkXCIpO1xuXG4gICAgY29uc3Qgc3RhcnRMYXJnZUZpbGUgPSBjcmVhdGVCMkZ1bmN0aW9uPHtcbiAgICAgICAgYnVja2V0SWQ6IHN0cmluZztcbiAgICAgICAgZmlsZU5hbWU6IHN0cmluZztcbiAgICAgICAgY29udGVudFR5cGU6IHN0cmluZztcbiAgICAgICAgZmlsZUluZm86IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH07XG4gICAgfSwge1xuICAgICAgICBmaWxlSWQ6IHN0cmluZztcbiAgICAgICAgZmlsZU5hbWU6IHN0cmluZztcbiAgICAgICAgYWNjb3VudElkOiBzdHJpbmc7XG4gICAgICAgIGJ1Y2tldElkOiBzdHJpbmc7XG4gICAgICAgIGNvbnRlbnRUeXBlOiBzdHJpbmc7XG4gICAgICAgIGZpbGVJbmZvOiBhbnk7XG4gICAgICAgIHVwbG9hZFRpbWVzdGFtcDogbnVtYmVyO1xuICAgIH0+KFwiYjJfc3RhcnRfbGFyZ2VfZmlsZVwiLCBcIlBPU1RcIiwgXCJub0FjY291bnRJZFwiKTtcblxuICAgIC8vIEFwcGFyZW50bHkgd2UgY2FuJ3QgcmV1c2UgdGhlc2U/XG4gICAgY29uc3QgZ2V0VXBsb2FkUGFydFVSTCA9IChhc3luYyAoZmlsZUlkOiBzdHJpbmcpID0+IHtcbiAgICAgICAgbGV0IHVwbG9hZFBhcnRSYXcgPSBhd2FpdCBodHRwc1JlcXVlc3QoYXV0aC5hcGlVcmwgKyBcIi9iMmFwaS92Mi9iMl9nZXRfdXBsb2FkX3BhcnRfdXJsP2ZpbGVJZD1cIiArIGZpbGVJZCwgdW5kZWZpbmVkLCBcIkdFVFwiLCB1bmRlZmluZWQsIHtcbiAgICAgICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICAgICAgICBBdXRob3JpemF0aW9uOiBhdXRoLmF1dGhvcml6YXRpb25Ub2tlbixcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBKU09OLnBhcnNlKHVwbG9hZFBhcnRSYXcudG9TdHJpbmcoKSkgYXMge1xuICAgICAgICAgICAgZmlsZUlkOiBzdHJpbmc7XG4gICAgICAgICAgICBwYXJ0TnVtYmVyOiBudW1iZXI7XG4gICAgICAgICAgICB1cGxvYWRVcmw6IHN0cmluZztcbiAgICAgICAgICAgIGF1dGhvcml6YXRpb25Ub2tlbjogc3RyaW5nO1xuICAgICAgICB9O1xuICAgIH0pO1xuICAgIGFzeW5jIGZ1bmN0aW9uIHVwbG9hZFBhcnQoY29uZmlnOiB7XG4gICAgICAgIGZpbGVJZDogc3RyaW5nO1xuICAgICAgICBwYXJ0TnVtYmVyOiBudW1iZXI7XG4gICAgICAgIGRhdGE6IEJ1ZmZlcjtcbiAgICAgICAgc2hhMTogc3RyaW5nO1xuICAgIH0pOiBQcm9taXNlPHtcbiAgICAgICAgZmlsZUlkOiBzdHJpbmc7XG4gICAgICAgIHBhcnROdW1iZXI6IG51bWJlcjtcbiAgICAgICAgY29udGVudExlbmd0aDogbnVtYmVyO1xuICAgICAgICBjb250ZW50U2hhMTogc3RyaW5nO1xuICAgIH0+IHtcbiAgICAgICAgbGV0IHVwbG9hZFBhcnQgPSBhd2FpdCBnZXRVcGxvYWRQYXJ0VVJMKGNvbmZpZy5maWxlSWQpO1xuXG4gICAgICAgIGxldCByZXN1bHQgPSBhd2FpdCBodHRwc1JlcXVlc3QodXBsb2FkUGFydC51cGxvYWRVcmwsIGNvbmZpZy5kYXRhLCBcIlBPU1RcIiwgdW5kZWZpbmVkLCB7XG4gICAgICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgICAgICAgQXV0aG9yaXphdGlvbjogdXBsb2FkUGFydC5hdXRob3JpemF0aW9uVG9rZW4sXG4gICAgICAgICAgICAgICAgXCJYLUJ6LVBhcnQtTnVtYmVyXCI6IGNvbmZpZy5wYXJ0TnVtYmVyICsgXCJcIixcbiAgICAgICAgICAgICAgICBcIlgtQnotQ29udGVudC1TaGExXCI6IGNvbmZpZy5zaGExLFxuICAgICAgICAgICAgICAgIFwiQ29udGVudC1MZW5ndGhcIjogY29uZmlnLmRhdGEubGVuZ3RoICsgXCJcIixcblxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIEpTT04ucGFyc2UocmVzdWx0LnRvU3RyaW5nKCkpO1xuICAgIH1cblxuICAgIGNvbnN0IGZpbmlzaExhcmdlRmlsZSA9IGNyZWF0ZUIyRnVuY3Rpb248e1xuICAgICAgICBmaWxlSWQ6IHN0cmluZztcbiAgICAgICAgcGFydFNoYTFBcnJheTogc3RyaW5nW107XG4gICAgfSwge1xuICAgICAgICBmaWxlSWQ6IHN0cmluZztcbiAgICAgICAgZmlsZU5hbWU6IHN0cmluZztcbiAgICAgICAgYWNjb3VudElkOiBzdHJpbmc7XG4gICAgICAgIGJ1Y2tldElkOiBzdHJpbmc7XG4gICAgICAgIGNvbnRlbnRMZW5ndGg6IG51bWJlcjtcbiAgICAgICAgY29udGVudFNoYTE6IHN0cmluZztcbiAgICAgICAgY29udGVudFR5cGU6IHN0cmluZztcbiAgICAgICAgZmlsZUluZm86IGFueTtcbiAgICAgICAgdXBsb2FkVGltZXN0YW1wOiBudW1iZXI7XG4gICAgfT4oXCJiMl9maW5pc2hfbGFyZ2VfZmlsZVwiLCBcIlBPU1RcIiwgXCJub0FjY291bnRJZFwiKTtcblxuICAgIGNvbnN0IGNhbmNlbExhcmdlRmlsZSA9IGNyZWF0ZUIyRnVuY3Rpb248e1xuICAgICAgICBmaWxlSWQ6IHN0cmluZztcbiAgICB9LCB7fT4oXCJiMl9jYW5jZWxfbGFyZ2VfZmlsZVwiLCBcIlBPU1RcIiwgXCJub0FjY291bnRJZFwiKTtcblxuICAgIGNvbnN0IGdldERvd25sb2FkQXV0aG9yaXphdGlvbiA9IGNyZWF0ZUIyRnVuY3Rpb248e1xuICAgICAgICBidWNrZXRJZDogc3RyaW5nO1xuICAgICAgICBmaWxlTmFtZVByZWZpeDogc3RyaW5nO1xuICAgICAgICB2YWxpZER1cmF0aW9uSW5TZWNvbmRzOiBudW1iZXI7XG4gICAgICAgIGIyQ29udGVudERpc3Bvc2l0aW9uPzogc3RyaW5nO1xuICAgICAgICBiMkNvbnRlbnRMYW5ndWFnZT86IHN0cmluZztcbiAgICAgICAgYjJFeHBpcmVzPzogc3RyaW5nO1xuICAgICAgICBiMkNhY2hlQ29udHJvbD86IHN0cmluZztcbiAgICAgICAgYjJDb250ZW50RW5jb2Rpbmc/OiBzdHJpbmc7XG4gICAgICAgIGIyQ29udGVudFR5cGU/OiBzdHJpbmc7XG4gICAgfSwge1xuICAgICAgICBidWNrZXRJZDogc3RyaW5nO1xuICAgICAgICBmaWxlTmFtZVByZWZpeDogc3RyaW5nO1xuICAgICAgICBhdXRob3JpemF0aW9uVG9rZW46IHN0cmluZztcbiAgICB9PihcImIyX2dldF9kb3dubG9hZF9hdXRob3JpemF0aW9uXCIsIFwiUE9TVFwiLCBcIm5vQWNjb3VudElkXCIpO1xuXG4gICAgYXN5bmMgZnVuY3Rpb24gZ2V0RG93bmxvYWRVUkwocGF0aDogc3RyaW5nKSB7XG4gICAgICAgIGlmICghcGF0aC5zdGFydHNXaXRoKFwiL1wiKSkge1xuICAgICAgICAgICAgcGF0aCA9IFwiL1wiICsgcGF0aDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYXV0aC5kb3dubG9hZFVybCArIHBhdGg7XG4gICAgfVxuXG5cbiAgICByZXR1cm4ge1xuICAgICAgICBjcmVhdGVCdWNrZXQsXG4gICAgICAgIHVwZGF0ZUJ1Y2tldCxcbiAgICAgICAgbGlzdEJ1Y2tldHMsXG4gICAgICAgIGRvd25sb2FkRmlsZUJ5TmFtZSxcbiAgICAgICAgaGVhZEZpbGVCeU5hbWUsXG4gICAgICAgIHVwbG9hZEZpbGUsXG4gICAgICAgIGhpZGVGaWxlLFxuICAgICAgICBnZXRGaWxlSW5mbyxcbiAgICAgICAgbGlzdEZpbGVOYW1lcyxcbiAgICAgICAgY29weUZpbGUsXG4gICAgICAgIHN0YXJ0TGFyZ2VGaWxlLFxuICAgICAgICB1cGxvYWRQYXJ0LFxuICAgICAgICBmaW5pc2hMYXJnZUZpbGUsXG4gICAgICAgIGNhbmNlbExhcmdlRmlsZSxcbiAgICAgICAgZ2V0RG93bmxvYWRBdXRob3JpemF0aW9uLFxuICAgICAgICBnZXREb3dubG9hZFVSTCxcbiAgICAgICAgYXBpVXJsOiBhdXRoLmFwaVVybCxcbiAgICAgICAgYWxsb3dlZDogYXV0aC5hbGxvd2VkLFxuICAgIH07XG59KTtcblxudHlwZSBCMkFwaSA9ICh0eXBlb2YgZ2V0QVBJKSBleHRlbmRzICgpID0+IFByb21pc2U8aW5mZXIgVD4gPyBUIDogbmV2ZXI7XG5cblxuZXhwb3J0IGNsYXNzIEFyY2hpdmVzQmFja2JsYXplIGltcGxlbWVudHMgSUFyY2hpdmVzIHtcbiAgICBwdWJsaWMgY29uc3RydWN0b3IocHJpdmF0ZSBjb25maWc6IHtcbiAgICAgICAgYnVja2V0TmFtZTogc3RyaW5nO1xuICAgICAgICBwdWJsaWM/OiBib29sZWFuO1xuICAgICAgICBpbW11dGFibGU/OiBib29sZWFuO1xuICAgICAgICBjYWNoZVRpbWU/OiBudW1iZXI7XG4gICAgICAgIGFsbG93ZWRPcmlnaW5zPzogc3RyaW5nW107XG4gICAgfSkge1xuICAgICAgICAvLyBHZXQgdGhlIGFwaSwgdG8gc2V0dXAgY29yc1xuICAgICAgICB2b2lkIHRoaXMuZ2V0QnVja2V0QVBJKCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBidWNrZXROYW1lID0gdGhpcy5jb25maWcuYnVja2V0TmFtZS5yZXBsYWNlQWxsKC9bXlxcd1xcZF0vZywgXCItXCIpO1xuICAgIHByaXZhdGUgYnVja2V0SWQgPSBcIlwiO1xuXG4gICAgcHJpdmF0ZSBsb2dnaW5nID0gZmFsc2U7XG4gICAgcHVibGljIGVuYWJsZUxvZ2dpbmcoKSB7XG4gICAgICAgIHRoaXMubG9nZ2luZyA9IHRydWU7XG4gICAgfVxuICAgIHByaXZhdGUgbG9nKHRleHQ6IHN0cmluZykge1xuICAgICAgICBpZiAoIXRoaXMubG9nZ2luZykgcmV0dXJuO1xuICAgICAgICBjb25zb2xlLmxvZyh0ZXh0KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0RGVidWdOYW1lKCkge1xuICAgICAgICByZXR1cm4gXCJiYWNrYmxhemUgXCIgKyB0aGlzLmNvbmZpZy5idWNrZXROYW1lO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0QnVja2V0QVBJID0gbGF6eShhc3luYyAoKSA9PiB7XG4gICAgICAgIGxldCBhcGkgPSBhd2FpdCBnZXRBUEkoKTtcblxuICAgICAgICBsZXQgY2FjaGVUaW1lID0gTWF0aC5tYXgodGhpcy5jb25maWcuY2FjaGVUaW1lID8/IDAsIE1JTl9CVUNLRVRfQ0FDSEVfVElNRSk7XG4gICAgICAgIGlmICh0aGlzLmNvbmZpZy5pbW11dGFibGUpIHtcbiAgICAgICAgICAgIGNhY2hlVGltZSA9IElNTVVUQUJMRV9DQUNIRV9USU1FO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQUxXQVlTIHNldCBhY2Nlc3MgY29udHJvbCwgYXMgd2UgY2FuIG1ha2UgdXJscyBmb3IgcHJpdmF0ZSBidWNrZXRzIHdpdGggZ2V0RG93bmxvYWRBdXRob3JpemF0aW9uXG4gICAgICAgIGxldCBkZXNpcmVkQ29yc1J1bGVzID0gW3tcbiAgICAgICAgICAgIGNvcnNSdWxlTmFtZTogXCJhbGxvd0FsbFwiLFxuICAgICAgICAgICAgYWxsb3dlZE9yaWdpbnM6IHRoaXMuY29uZmlnLmFsbG93ZWRPcmlnaW5zID8/IFtcImh0dHBzXCJdLFxuICAgICAgICAgICAgYWxsb3dlZE9wZXJhdGlvbnM6IFtcImIyX2Rvd25sb2FkX2ZpbGVfYnlfaWRcIiwgXCJiMl9kb3dubG9hZF9maWxlX2J5X25hbWVcIl0sXG4gICAgICAgICAgICBhbGxvd2VkSGVhZGVyczogW1wicmFuZ2VcIl0sXG4gICAgICAgICAgICBleHBvc2VIZWFkZXJzOiBbXCJ4LWJ6LWNvbnRlbnQtc2hhMVwiXSxcbiAgICAgICAgICAgIG1heEFnZVNlY29uZHM6IGNhY2hlVGltZSAvIDEwMDAsXG4gICAgICAgIH1dO1xuICAgICAgICBsZXQgYnVja2V0SW5mbzogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7fTtcbiAgICAgICAgaWYgKGNhY2hlVGltZSkge1xuICAgICAgICAgICAgYnVja2V0SW5mb1tcImNhY2hlLWNvbnRyb2xcIl0gPSBgbWF4LWFnZT0ke2NhY2hlVGltZSAvIDEwMDB9YDtcbiAgICAgICAgfVxuXG5cbiAgICAgICAgbGV0IGV4aXN0cyA9IGZhbHNlO1xuICAgICAgICBsZXQgcmV0cmllcyA9IDA7XG4gICAgICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGF3YWl0IGFwaS5jcmVhdGVCdWNrZXQoe1xuICAgICAgICAgICAgICAgICAgICBidWNrZXROYW1lOiB0aGlzLmJ1Y2tldE5hbWUsXG4gICAgICAgICAgICAgICAgICAgIGJ1Y2tldFR5cGU6IHRoaXMuY29uZmlnLnB1YmxpYyA/IFwiYWxsUHVibGljXCIgOiBcImFsbFByaXZhdGVcIixcbiAgICAgICAgICAgICAgICAgICAgbGlmZWN5Y2xlUnVsZXM6IFt7XG4gICAgICAgICAgICAgICAgICAgICAgICBcImRheXNGcm9tVXBsb2FkaW5nVG9IaWRpbmdcIjogbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEtlZXAgZmlsZXMgZm9yIDcgZGF5cywgd2hpY2ggc2hvdWxkIGJlIGVub3VnaCB0aW1lIHRvIHJlY292ZXIgYWNjaWRlbnRhbCBoaWRpbmcuXG4gICAgICAgICAgICAgICAgICAgICAgICBcImRheXNGcm9tSGlkaW5nVG9EZWxldGluZ1wiOiA3LFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJmaWxlTmFtZVByZWZpeFwiOiBcIlwiXG4gICAgICAgICAgICAgICAgICAgIH1dLFxuICAgICAgICAgICAgICAgICAgICBjb3JzUnVsZXM6IGRlc2lyZWRDb3JzUnVsZXMsXG4gICAgICAgICAgICAgICAgICAgIGJ1Y2tldEluZm9cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgICAgICAgICAgIGlmICghZS5zdGFjay5pbmNsdWRlcyhgXCJkdXBsaWNhdGVfYnVja2V0X25hbWVcImApKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChyZXRyaWVzIDwgMykge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihgQmFja2JsYXplIGNyZWF0ZSBidWNrZXQgZmFpbGVkLCByZXRyeWluZyBpbiA1czogJHtlLnN0YWNrfWApO1xuICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgZGVsYXkoNTAwMCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXRyaWVzKys7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBleGlzdHMgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgYnVja2V0TGlzdCA9IGF3YWl0IGFwaS5saXN0QnVja2V0cyh7XG4gICAgICAgICAgICBidWNrZXROYW1lOiB0aGlzLmJ1Y2tldE5hbWUsXG4gICAgICAgIH0pO1xuICAgICAgICBpZiAoYnVja2V0TGlzdC5idWNrZXRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBCdWNrZXQgbmFtZSBcIiR7dGhpcy5idWNrZXROYW1lfVwiIGlzIGJlaW5nIHVzZWQgYnkgc29tZW9uZSBlbHNlLiBCdWNrZXQgbmFtZXMgaGF2ZSB0byBiZSBnbG9iYWxseSB1bmlxdWUuIFRyeSBhIGRpZmZlcmVudCBuYW1lIHVudGlsIHlvdSBmaW5kIGEgZnJlZSBvbmUuYCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5idWNrZXRJZCA9IGJ1Y2tldExpc3QuYnVja2V0c1swXS5idWNrZXRJZDtcblxuICAgICAgICBpZiAoZXhpc3RzKSB7XG4gICAgICAgICAgICBsZXQgYnVja2V0ID0gYnVja2V0TGlzdC5idWNrZXRzWzBdO1xuICAgICAgICAgICAgZnVuY3Rpb24gbm9ybWFsaXplKG9iajogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pIHtcbiAgICAgICAgICAgICAgICBsZXQga3ZwcyA9IE9iamVjdC5lbnRyaWVzKG9iaik7XG4gICAgICAgICAgICAgICAgc29ydChrdnBzLCB4ID0+IHhbMF0pO1xuICAgICAgICAgICAgICAgIHJldHVybiBPYmplY3QuZnJvbUVudHJpZXMoa3Zwcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmdW5jdGlvbiBvcmRlckluZGVwZW5kZW50RXF1YWwobGhzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiwgcmhzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikge1xuICAgICAgICAgICAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShub3JtYWxpemUobGhzKSkgPT09IEpTT04uc3RyaW5naWZ5KG5vcm1hbGl6ZShyaHMpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZ1bmN0aW9uIG9yZGVySW5kZXBlbmRlbnRFcXVhbEFycmF5KGxoczogdW5rbm93bltdLCByaHM6IHVua25vd25bXSkge1xuICAgICAgICAgICAgICAgIGlmIChsaHMubGVuZ3RoICE9PSByaHMubGVuZ3RoKSByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsaHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFvcmRlckluZGVwZW5kZW50RXF1YWwobGhzW2ldIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+LCByaHNbaV0gYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pKSByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGV0IGNvcnNDaGFuZ2VkID0gIW9yZGVySW5kZXBlbmRlbnRFcXVhbEFycmF5KGJ1Y2tldC5jb3JzUnVsZXMsIGRlc2lyZWRDb3JzUnVsZXMpO1xuICAgICAgICAgICAgbGV0IGluZm9DaGFuZ2VkID0gIW9yZGVySW5kZXBlbmRlbnRFcXVhbChidWNrZXQuYnVja2V0SW5mbywgYnVja2V0SW5mbyk7XG4gICAgICAgICAgICBpZiAoY29yc0NoYW5nZWQgfHwgaW5mb0NoYW5nZWQpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhtYWdlbnRhKGBVcGRhdGluZyBidWNrZXQgc2V0dGluZ3MgZm9yICR7dGhpcy5idWNrZXROYW1lfSAoY29yc1J1bGVzICR7Y29yc0NoYW5nZWQgJiYgXCJjaGFuZ2VkXCIgfHwgXCJ1bmNoYW5nZWRcIn0sIGJ1Y2tldEluZm8gJHtpbmZvQ2hhbmdlZCAmJiBcImNoYW5nZWRcIiB8fCBcInVuY2hhbmdlZFwifSk6IGNvcnNSdWxlcyAke0pTT04uc3RyaW5naWZ5KGJ1Y2tldC5jb3JzUnVsZXMpfSAtPiAke0pTT04uc3RyaW5naWZ5KGRlc2lyZWRDb3JzUnVsZXMpfSwgYnVja2V0SW5mbyAke0pTT04uc3RyaW5naWZ5KGJ1Y2tldC5idWNrZXRJbmZvKX0gLT4gJHtKU09OLnN0cmluZ2lmeShidWNrZXRJbmZvKX1gKSk7XG4gICAgICAgICAgICAgICAgYXdhaXQgYXBpLnVwZGF0ZUJ1Y2tldCh7XG4gICAgICAgICAgICAgICAgICAgIGFjY291bnRJZDogYnVja2V0LmFjY291bnRJZCxcbiAgICAgICAgICAgICAgICAgICAgYnVja2V0SWQ6IGJ1Y2tldC5idWNrZXRJZCxcbiAgICAgICAgICAgICAgICAgICAgYnVja2V0VHlwZTogYnVja2V0LmJ1Y2tldFR5cGUsXG4gICAgICAgICAgICAgICAgICAgIGxpZmVjeWNsZVJ1bGVzOiBidWNrZXQubGlmZWN5Y2xlUnVsZXMsXG4gICAgICAgICAgICAgICAgICAgIGNvcnNSdWxlczogZGVzaXJlZENvcnNSdWxlcyxcbiAgICAgICAgICAgICAgICAgICAgYnVja2V0SW5mbzogYnVja2V0SW5mbyxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYXBpO1xuICAgIH0pO1xuXG4gICAgcHJpdmF0ZSBjdXJyZW50UmVzZXQ6IFByb21pc2U8dm9pZD4gfCB1bmRlZmluZWQ7XG5cbiAgICAvLyBLZWVwIHRyYWNrIG9mIHdoZW4gd2UgbGFzdCByZXNldCBiZWNhdXNlIG9mIGEgNTAzXG4gICAgcHJpdmF0ZSBsYXN0NTAzUmVzZXQgPSAwO1xuICAgIC8vIElNUE9SVEFOVCEgV2UgbXVzdCBhbHdheXMgQ0FUQ0ggQVJPVU5EIHRoZSBhcGlSZXRyeUxvZ2ljLCBORVZFUiBpbnNpZGUgb2YgZm5jLiBPdGhlcndpc2Ugd2Ugd29uJ3QgYmUgYWJsZSB0byByZWNyZWF0ZSB0aGUgYXV0aCB0b2tlbi4gYGNvbnRleHRgIGlzIGEgc2hvcnQgbGFiZWwgKHZlcmIgKyBmaWxlIHBhdGgpIGluY2x1ZGVkIGluIGV2ZXJ5IHJldHJ5L2Vycm9yIGxvZyBzbyBhIHN0dWNrIHNpbGVudC1yZXRyeSBsb29wIGlzIGlkZW50aWZpYWJsZSBmcm9tIHRoZSBsb2dzLlxuICAgIHByaXZhdGUgYXN5bmMgYXBpUmV0cnlMb2dpYzxUPihcbiAgICAgICAgY29udGV4dDogc3RyaW5nLFxuICAgICAgICBmbmM6IChhcGk6IEIyQXBpKSA9PiBQcm9taXNlPFQ+LFxuICAgICAgICByZXRyaWVzID0gM1xuICAgICk6IFByb21pc2U8VD4ge1xuICAgICAgICBsZXQgYXBpOiBCMkFwaSB8IHVuZGVmaW5lZDtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGFwaSA9IGF3YWl0IHRoaXMuZ2V0QnVja2V0QVBJKCk7XG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgZm5jKGFwaSk7XG4gICAgICAgIH0gY2F0Y2ggKGVycjogYW55KSB7XG4gICAgICAgICAgICBpZiAocmV0cmllcyA8PSAwKSB0aHJvdyBlcnI7XG5cbiAgICAgICAgICAgIC8vIElmIGl0J3MgYSA1MDMgYW5kIGl0J3MgYmVlbiBhIG1pbnV0ZSBzaW5jZSB3ZSBsYXN0IHJlc2V0LCB0aGVuIFdhaXQgYW5kIHJlc2V0LlxuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgIChlcnIuc3RhY2suaW5jbHVkZXMoYFwic3RhdHVzXCI6IDUwM2ApXG4gICAgICAgICAgICAgICAgICAgIHx8IGVyci5zdGFjay5pbmNsdWRlcyhgXCJzZXJ2aWNlX3VuYXZhaWxhYmxlXCJgKVxuICAgICAgICAgICAgICAgICAgICB8fCBlcnIuc3RhY2suaW5jbHVkZXMoYFwiaW50ZXJuYWxfZXJyb3JcImApXG4gICAgICAgICAgICAgICAgICAgIHx8IGVyci5zdGFjay5pbmNsdWRlcyhgRU5PQlVGU2ApXG4gICAgICAgICAgICAgICAgKSAmJiBEYXRlLm5vdygpIC0gdGhpcy5sYXN0NTAzUmVzZXQgPiA2MCAqIDEwMDApIHtcbiAgICAgICAgICAgICAgICAvLyBCYWNrYmxhemUgaXMgc28gZmxha3kgdGhhdCB3ZSdyZSBqdXN0IGdvaW5nIHRvIHdhcm4gaGVyZS5cbiAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oYFske2NvbnRleHR9XSBCYWNrYmxhemUgZXJyb3IsIHdhaXRpbmcgYW5kIHJlc2V0dGluZzogJHtlcnIubWVzc2FnZX1gKTtcbiAgICAgICAgICAgICAgICB0aGlzLmxvZyhgWyR7Y29udGV4dH1dIEJhY2tibGF6ZSBlcnJvciwgd2FpdGluZyBhbmQgcmVzZXR0aW5nOiAke2Vyci5tZXNzYWdlfWApO1xuICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudFJlc2V0ID0gdGhpcy5jdXJyZW50UmVzZXQgfHwgKGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgZGVsYXkoMTAgKiAxMDAwKTtcbiAgICAgICAgICAgICAgICAgICAgLy8gV2UgY2hlY2sgYWdhaW4gaW4gY2FzZSwgYW5kIGluIHRoZSB2ZXJ5IGxpa2VseSBjYXNlIHRoYXQgdGhpcyBpcyBiZWluZyBydW4gaW4gcGFyYWxsZWwsIHdlIG9ubHkgd2FudCB0byByZXNldCBvbmNlLlxuICAgICAgICAgICAgICAgICAgICBpZiAoRGF0ZS5ub3coKSAtIHRoaXMubGFzdDUwM1Jlc2V0ID4gNjAgKiAxMDAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxvZyhgWyR7Y29udGV4dH1dIFJlc2V0dGluZyBnZXRBUEkgYW5kIGdldEJ1Y2tldEFQSTogJHtlcnIubWVzc2FnZX1gKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubGFzdDUwM1Jlc2V0ID0gRGF0ZS5ub3coKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGdldEFQSS5yZXNldCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5nZXRCdWNrZXRBUEkucmVzZXQoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pKCkuZmluYWxseSgoKSA9PiB0aGlzLmN1cnJlbnRSZXNldCA9IHVuZGVmaW5lZCk7XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5jdXJyZW50UmVzZXQ7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuYXBpUmV0cnlMb2dpYyhjb250ZXh0LCBmbmMsIHJldHJpZXMgLSAxKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gSWYgdGhlIGVycm9yIGlzIHRoYXQgdGhlIGF1dGhvcml6YXRpb24gdG9rZW4gaXMgaW52YWxpZCwgcmVzZXQgZ2V0QnVja2V0QVBJIGFuZCBnZXRBUEkgSWYgdGhlIGVycm9yIGlzIHRoYXQgdGhlIGJ1Y2tldCBpc24ndCBmb3VuZCwgcmVzZXQgZ2V0QnVja2V0QVBJXG4gICAgICAgICAgICBpZiAoZXJyLnN0YWNrLmluY2x1ZGVzKGBcImV4cGlyZWRfYXV0aF90b2tlblwiYCkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmxvZyhgWyR7Y29udGV4dH1dIEF1dGhvcml6YXRpb24gdG9rZW4gZXhwaXJlZGApO1xuICAgICAgICAgICAgICAgIGdldEFQSS5yZXNldCgpO1xuICAgICAgICAgICAgICAgIHRoaXMuZ2V0QnVja2V0QVBJLnJlc2V0KCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuYXBpUmV0cnlMb2dpYyhjb250ZXh0LCBmbmMsIHJldHJpZXMgLSAxKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgIGVyci5zdGFjay5pbmNsdWRlcyhgbm8gdG9tZXMgYXZhaWxhYmxlYClcbiAgICAgICAgICAgICAgICB8fCBlcnIuc3RhY2suaW5jbHVkZXMoYEVUSU1FRE9VVGApXG4gICAgICAgICAgICAgICAgfHwgZXJyLnN0YWNrLmluY2x1ZGVzKGBzb2NrZXQgaGFuZyB1cGApXG4gICAgICAgICAgICAgICAgLy8gRWguLi4gdGhpcyBtaWdodCBiZSBiYWQsIGJ1dC4uLiBJIHRoaW5rIHdlIGp1c3QgZ2V0IHJhbmRvbSA0MDAgZXJyb3JzLiBJZiB0aGlzIHNwYW1zIGVycm9ycywgd2UgY2FuIHJlbW92ZSB0aGlzIGxpbmUuXG4gICAgICAgICAgICAgICAgfHwgZXJyLnN0YWNrLmluY2x1ZGVzKGA0MDAgQmFkIFJlcXVlc3RgKVxuICAgICAgICAgICAgICAgIHx8IGVyci5zdGFjay5pbmNsdWRlcyhgZ2V0YWRkcmluZm8gRU5PVEZPVU5EYClcbiAgICAgICAgICAgICAgICB8fCBlcnIuc3RhY2suaW5jbHVkZXMoYEVDT05OUkVTRVRgKVxuICAgICAgICAgICAgICAgIHx8IGVyci5zdGFjay5pbmNsdWRlcyhgRUNPTk5SRUZVU0VEYClcbiAgICAgICAgICAgICAgICB8fCBlcnIuc3RhY2suaW5jbHVkZXMoYEVOT0JVRlNgKVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS53YXJuKGBbJHtjb250ZXh0fV0gUmV0cnlpbmcgaW4gNXM6ICR7ZXJyLm1lc3NhZ2V9YCk7XG4gICAgICAgICAgICAgICAgdGhpcy5sb2coYFske2NvbnRleHR9XSAke2Vyci5tZXNzYWdlfSByZXRyeWluZyBpbiA1c2ApO1xuICAgICAgICAgICAgICAgIGF3YWl0IGRlbGF5KDUwMDApO1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmFwaVJldHJ5TG9naWMoY29udGV4dCwgZm5jLCByZXRyaWVzIC0gMSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChlcnIuc3RhY2suaW5jbHVkZXMoYGdldGFkZHJpbmZvIEVOT1RGT1VORGApKSB7XG4gICAgICAgICAgICAgICAgaWYgKGFwaSkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgdXJsT2JqID0gbmV3IFVSTChhcGkuYXBpVXJsKTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGhvc3RuYW1lID0gdXJsT2JqLmhvc3RuYW1lO1xuICAgICAgICAgICAgICAgICAgICBsZXQgbG9va3VwQWRkcmVzc2VzID0gYXdhaXQgbmV3IFByb21pc2UocmVzb2x2ZSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBkbnMubG9va3VwKGhvc3RuYW1lLCAoZXJyLCBhZGRyZXNzZXMpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKGFkZHJlc3Nlcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIGxldCByZXNvbHZlQWRkcmVzc2VzID0gYXdhaXQgbmV3IFByb21pc2UocmVzb2x2ZSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBkbnMucmVzb2x2ZTQoaG9zdG5hbWUsIChlcnIsIGFkZHJlc3NlcykgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUoYWRkcmVzc2VzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihgWyR7Y29udGV4dH1dIGdldGFkZHJpbmZvIEVOT1RGT1VORCAke2hvc3RuYW1lfWAsIHsgbG9va3VwQWRkcmVzc2VzLCByZXNvbHZlQWRkcmVzc2VzLCBhcGlVcmw6IGFwaS5hcGlVcmwsIGZ1bGxFcnJvcjogZXJyLnN0YWNrIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGdldChmaWxlTmFtZTogc3RyaW5nLCBjb25maWc/OiBHZXRDb25maWcpOiBQcm9taXNlPEJ1ZmZlciB8IHVuZGVmaW5lZD4ge1xuICAgICAgICBsZXQgcmVzdWx0ID0gYXdhaXQgdGhpcy5nZXQyKGZpbGVOYW1lLCBjb25maWcpO1xuICAgICAgICByZXR1cm4gcmVzdWx0ICYmIHJlc3VsdC5kYXRhIHx8IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgcHVibGljIGFzeW5jIGdldDIoZmlsZU5hbWU6IHN0cmluZywgY29uZmlnPzogR2V0Q29uZmlnKTogUHJvbWlzZTx7IGRhdGE6IEJ1ZmZlcjsgd3JpdGVUaW1lOiBudW1iZXI7IHNpemU6IG51bWJlciB9IHwgdW5kZWZpbmVkPiB7XG4gICAgICAgIGxldCBkb3dubG9hZGluZyA9IHRydWU7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBsZXQgdGltZSA9IERhdGUubm93KCk7XG4gICAgICAgICAgICBjb25zdCBkb3dubG9hZFBvbGwgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKCFkb3dubG9hZGluZykgcmV0dXJuO1xuICAgICAgICAgICAgICAgIHRoaXMubG9nKGBCYWNrYmxhemUgZG93bmxvYWQgaW4gcHJvZ3Jlc3MgJHtmaWxlTmFtZX1gKTtcbiAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KGRvd25sb2FkUG9sbCwgNTAwMCk7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgc2V0VGltZW91dChkb3dubG9hZFBvbGwsIDUwMDApO1xuICAgICAgICAgICAgbGV0IHJlc3VsdCA9IGF3YWl0IHRoaXMuYXBpUmV0cnlMb2dpYyhgZ2V0ICR7ZmlsZU5hbWV9YCwgYXN5bmMgKGFwaSk6IFByb21pc2U8eyBkYXRhOiBCdWZmZXI7IHdyaXRlVGltZTogbnVtYmVyOyBzaXplOiBudW1iZXIgfT4gPT4ge1xuICAgICAgICAgICAgICAgIGxldCByYW5nZSA9IGNvbmZpZz8ucmFuZ2U7XG4gICAgICAgICAgICAgICAgaWYgKHJhbmdlKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIFRoZSBjbGFtcCBuZWVkcyB0aGUgZmlsZSdzIHNpemUgKGFuZCBnaXZlcyB1cyBpdHMgbWV0YWRhdGEgZm9yIGZyZWUpXG4gICAgICAgICAgICAgICAgICAgIGxldCBmaWxlSW5mbyA9IGF3YWl0IHRoaXMuZ2V0SW5mbyhmaWxlTmFtZSk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghZmlsZUluZm8pIHRocm93IG5ldyBFcnJvcihgRmlsZSAke2ZpbGVOYW1lfSBub3QgZm91bmRgKTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHJhbmdlU3RhcnQgPSByYW5nZS5zdGFydDtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHJhbmdlRW5kID0gTWF0aC5taW4ocmFuZ2UuZW5kLCBmaWxlSW5mby5zaXplKTtcbiAgICAgICAgICAgICAgICAgICAgLy8gTk9URTogSSB0aGluayBpZiB3ZSByZXF1ZXN0IG5vdGhpbmcsIGl0IGNvbmZ1c2VzIEJhY2tibGF6ZSBhbmQgZW5kcyB1cCBnaXZpbmcgdXMgdGhlIGVudGlyZSBmaWxlLlxuICAgICAgICAgICAgICAgICAgICBpZiAocmFuZ2VFbmQgPD0gcmFuZ2VTdGFydCkgcmV0dXJuIHsgZGF0YTogQnVmZmVyLmFsbG9jKDApLCB3cml0ZVRpbWU6IGZpbGVJbmZvLndyaXRlVGltZSwgc2l6ZTogZmlsZUluZm8uc2l6ZSB9O1xuICAgICAgICAgICAgICAgICAgICBsZXQgZGF0YSA9IGF3YWl0IGFwaS5kb3dubG9hZEZpbGVCeU5hbWUoe1xuICAgICAgICAgICAgICAgICAgICAgICAgYnVja2V0TmFtZTogdGhpcy5idWNrZXROYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgZmlsZU5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICByYW5nZTogeyBzdGFydDogcmFuZ2VTdGFydCwgZW5kOiByYW5nZUVuZCB9LFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGRhdGEubGVuZ3RoICE9PSByYW5nZUVuZCAtIHJhbmdlU3RhcnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYEJhY2tibGF6ZSByYW5nZSBkb3dubG9hZCByZXR1cm5lZCB0aGUgd3JvbmcgbnVtYmVyIG9mIGJ5dGVzLiBUcmllZCB0byBnZXQgJHtyYW5nZVN0YXJ0fS0ke3JhbmdlRW5kfSwgYnV0IHJlY2VpdmVkICR7cmFuZ2VTdGFydH0tJHtyYW5nZVN0YXJ0ICsgZGF0YS5sZW5ndGh9LiBGb3IgZmlsZTogJHtmaWxlTmFtZX1gKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4geyBkYXRhLCB3cml0ZVRpbWU6IGZpbGVJbmZvLndyaXRlVGltZSwgc2l6ZTogZmlsZUluZm8uc2l6ZSB9O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBUaGUgZG93bmxvYWQncyBvd24gcmVzcG9uc2UgaGVhZGVycyBjYXJyeSB0aGUgbWV0YWRhdGEsIHNvIGEgZnVsbCByZWFkIGlzIGEgc2luZ2xlIEFQSSBjYWxsXG4gICAgICAgICAgICAgICAgbGV0IHJlc3BvbnNlOiBIdHRwc1Jlc3BvbnNlSW5mbyA9IHsgaGVhZGVyczoge30gfTtcbiAgICAgICAgICAgICAgICBsZXQgZGF0YSA9IGF3YWl0IGFwaS5kb3dubG9hZEZpbGVCeU5hbWUoe1xuICAgICAgICAgICAgICAgICAgICBidWNrZXROYW1lOiB0aGlzLmJ1Y2tldE5hbWUsXG4gICAgICAgICAgICAgICAgICAgIGZpbGVOYW1lLFxuICAgICAgICAgICAgICAgICAgICBvdXRSZXNwb25zZTogcmVzcG9uc2UsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgbGV0IG1ldGEgPSBwYXJzZUZpbGVNZXRhZGF0YUhlYWRlcnMocmVzcG9uc2UpO1xuICAgICAgICAgICAgICAgIHJldHVybiB7IGRhdGEsIHdyaXRlVGltZTogbWV0YS51cGxvYWRUaW1lc3RhbXAsIHNpemU6IGRhdGEubGVuZ3RoIH07XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGxldCB0aW1lU3RyID0gZm9ybWF0VGltZShEYXRlLm5vdygpIC0gdGltZSk7XG4gICAgICAgICAgICBsZXQgcmF0ZVN0ciA9IGZvcm1hdE51bWJlcihyZXN1bHQuZGF0YS5sZW5ndGggLyAoRGF0ZS5ub3coKSAtIHRpbWUpICogMTAwMCkgKyBcIkIvc1wiO1xuICAgICAgICAgICAgdGhpcy5sb2coYGJhY2tibGF6ZSBkb3dubG9hZCAoJHtmb3JtYXROdW1iZXIocmVzdWx0LmRhdGEubGVuZ3RoKX1CJHtjb25maWc/LnJhbmdlICYmIGAsICR7Zm9ybWF0TnVtYmVyKGNvbmZpZy5yYW5nZS5zdGFydCl9IC0gJHtmb3JtYXROdW1iZXIoY29uZmlnLnJhbmdlLmVuZCl9YCB8fCBcIlwifSkgaW4gJHt0aW1lU3RyfSAoJHtyYXRlU3RyfSwgJHtmaWxlTmFtZX0pYCk7XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAvLyBPbmx5IGdlbnVpbmUgYWJzZW5jZSBtYXkgYmVjb21lIHVuZGVmaW5lZDogY2FsbGVycyB0cmVhdCB1bmRlZmluZWQgYXMgYXV0aG9yaXRhdGl2ZSBcInRoZSBidWNrZXQgZG9lcyBub3QgaG9sZCB0aGlzIGZpbGVcIiAoQmxvYlN0b3JlIGV2ZW4gZGVsZXRlcyBpbmRleCBlbnRyaWVzIG92ZXIgaXQpLCBzbyBhIHRyYW5zaWVudCBmYWlsdXJlICg1MDMsIGF1dGgsIHRpbWVvdXQpIG11c3QgdGhyb3cgaW5zdGVhZCBvZiBtYXNxdWVyYWRpbmcgYXMgYSBtaXNzaW5nIGZpbGVcbiAgICAgICAgICAgIGxldCBtZXNzYWdlID0gU3RyaW5nKChlIGFzIEVycm9yKS5zdGFjayA/PyBlKTtcbiAgICAgICAgICAgIGlmIChtZXNzYWdlLmluY2x1ZGVzKGBcIm5vdF9mb3VuZFwiYCkgfHwgbWVzc2FnZS5pbmNsdWRlcyhgZmlsZV9ub3RfZm91bmRgKSB8fCBtZXNzYWdlLmluY2x1ZGVzKGBub3QgZm91bmRgKSkge1xuICAgICAgICAgICAgICAgIHRoaXMubG9nKGBiYWNrYmxhemUgZmlsZSBkb2VzIG5vdCBleGlzdCAke2ZpbGVOYW1lfWApO1xuICAgICAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgZG93bmxvYWRpbmcgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBwdWJsaWMgYXN5bmMgZ2V0Q29uZmlnKCk6IFByb21pc2U8QXJjaGl2ZXNDb25maWc+IHtcbiAgICAgICAgcmV0dXJuIHt9O1xuICAgIH1cbiAgICBwdWJsaWMgYXN5bmMgaGFzV3JpdGVBY2Nlc3MoKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBsZXQgYXBpID0gYXdhaXQgZ2V0QVBJKCk7XG4gICAgICAgICAgICAvLyBCMiB2MiBkb2N1bWVudHMgYWxsb3dlZCBhcyBhIHNpbmdsZSBvYmplY3Q7IG91ciB0eXBlIHNheXMgYSBsaXN0IC0gaGFuZGxlIGJvdGhcbiAgICAgICAgICAgIGxldCBhbGxvd2VkUmF3ID0gYXBpLmFsbG93ZWQgYXMgdW5rbm93bjtcbiAgICAgICAgICAgIGxldCBhbGxvd2VkTGlzdCA9IChBcnJheS5pc0FycmF5KGFsbG93ZWRSYXcpICYmIGFsbG93ZWRSYXcgfHwgW2FsbG93ZWRSYXddKSBhcyB0eXBlb2YgYXBpLmFsbG93ZWQ7XG4gICAgICAgICAgICByZXR1cm4gYWxsb3dlZExpc3Quc29tZShhbGxvd2VkID0+XG4gICAgICAgICAgICAgICAgYWxsb3dlZC5jYXBhYmlsaXRpZXMuaW5jbHVkZXMoXCJ3cml0ZUZpbGVzXCIpXG4gICAgICAgICAgICAgICAgJiYgKCFhbGxvd2VkLmJ1Y2tldE5hbWUgfHwgYWxsb3dlZC5idWNrZXROYW1lID09PSB0aGlzLmJ1Y2tldE5hbWUpXG4gICAgICAgICAgICApO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAvLyBObyAvIGludmFsaWQgY3JlZGVudGlhbHNcbiAgICAgICAgICAgIHRoaXMubG9nKGBiYWNrYmxhemUgaGFzV3JpdGVBY2Nlc3MgY2hlY2sgZmFpbGVkOiAkeyhlIGFzIEVycm9yKS5zdGFjayA/PyBlfWApO1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxuICAgIHB1YmxpYyBhc3luYyBzZXQoZmlsZU5hbWU6IHN0cmluZywgZGF0YTogQnVmZmVyLCBjb25maWc/OiBTZXRDb25maWcpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgICAgICBpZiAoIWRhdGEubGVuZ3RoKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYHNldCB3YXMgY2FsbGVkIHdpdGggYW4gZW1wdHkgYnVmZmVyIGZvciAke0pTT04uc3RyaW5naWZ5KGZpbGVOYW1lKX0gb24gJHt0aGlzLmdldERlYnVnTmFtZSgpfTogYW4gZW1wdHkgZmlsZSBJUyBhIGRlbGV0aW9uIGluIHRoaXMgc3lzdGVtIGFuZCB3b3VsZCByZWFkIGJhY2sgYXMgbWlzc2luZyAtIGNhbGwgZGVsIGluc3RlYWRgKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY29uZmlnPy5mb3JjZVNldEltbXV0YWJsZSAmJiAhY29uZmlnLmxhc3RNb2RpZmllZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBmb3JjZVNldEltbXV0YWJsZSByZXF1aXJlcyBsYXN0TW9kaWZpZWQgKHN5bmNocm9uaXphdGlvbiB3cml0ZXMgYXJlIG9yZGVyZWQgYnkgdGhlaXIgd3JpdGUgdGltZSksIHdyaXRpbmcgJHtmaWxlTmFtZX0gdG8gJHt0aGlzLmdldERlYnVnTmFtZSgpfWApO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjb25maWc/Lmxhc3RNb2RpZmllZCkge1xuICAgICAgICAgICAgYXNzZXJ0VmFsaWRMYXN0TW9kaWZpZWQoY29uZmlnLmxhc3RNb2RpZmllZCk7XG4gICAgICAgICAgICBpZiAoIWNvbmZpZy5ub0NoZWNrcykge1xuICAgICAgICAgICAgICAgIC8vIGluY2x1ZGVUb21ic3RvbmVzOiBhIGRlbGV0aW9uIHB1c2hlZCB0byBiMiBpcyBhIHJlYWwgc2l6ZS0wIGZpbGUsIGFuZCBpdCBtdXN0IHN0aWxsIHdpbiB0aGUgb2xkZXItd3JpdGUgY29tcGFyaXNvbiAtIG9yIGFuIG9sZGVyLXN0YW1wZWQgd3JpdGUgd291bGQgcmVzdXJyZWN0IHRoZSBkZWxldGVkIGZpbGVcbiAgICAgICAgICAgICAgICBsZXQgZXhpc3RpbmcgPSBhd2FpdCB0aGlzLmdldEluZm8oZmlsZU5hbWUsIHsgaW5jbHVkZVRvbWJzdG9uZXM6IHRydWUgfSk7XG4gICAgICAgICAgICAgICAgLy8gQW4gb2xkZXIgd3JpdGUgbmV2ZXIgb3ZlcndyaXRlcyBhIG5ld2VyIG9uZSAoc2VlIElBcmNoaXZlcy5zZXQpLiBCMiBzdGFtcHMgaXRzIG93biB1cGxvYWQgdGltZSwgc28gdGhlIGV4YWN0IGxhc3RNb2RpZmllZCBpcyBub3QgcHJlc2VydmVkIG9uIHRoZSBzdG9yZWQgZmlsZS5cbiAgICAgICAgICAgICAgICBpZiAoZXhpc3RpbmcgJiYgY29uZmlnLmxhc3RNb2RpZmllZCA8IGV4aXN0aW5nLndyaXRlVGltZSkgcmV0dXJuIGZpbGVOYW1lO1xuICAgICAgICAgICAgICAgIC8vIEltbXV0YWJpbGl0eSB3aW5zOiBhIHN5bmNocm9uaXphdGlvbiBwdXNoIG5ldmVyIG92ZXJ3cml0ZXMgYW4gZXhpc3RpbmcgcGF0aCBvbiBhbiBpbW11dGFibGUgYnVja2V0IChzZWUgU2V0Q29uZmlnLmZvcmNlU2V0SW1tdXRhYmxlKVxuICAgICAgICAgICAgICAgIGlmIChleGlzdGluZyAmJiBjb25maWcuZm9yY2VTZXRJbW11dGFibGUgJiYgdGhpcy5jb25maWcuaW1tdXRhYmxlKSByZXR1cm4gZmlsZU5hbWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5sb2coYGJhY2tibGF6ZSB1cGxvYWQgKCR7Zm9ybWF0TnVtYmVyKGRhdGEubGVuZ3RoKX1CKSAke2ZpbGVOYW1lfWApO1xuICAgICAgICBsZXQgZiA9IGZpbGVOYW1lO1xuICAgICAgICBhd2FpdCB0aGlzLmFwaVJldHJ5TG9naWMoYHVwbG9hZEZpbGUgJHtmaWxlTmFtZX1gLCBhc3luYyAoYXBpKSA9PiB7XG4gICAgICAgICAgICBhd2FpdCBhcGkudXBsb2FkRmlsZSh7IGJ1Y2tldElkOiB0aGlzLmJ1Y2tldElkLCBmaWxlTmFtZSwgZGF0YTogZGF0YSwgfSk7XG4gICAgICAgIH0pO1xuICAgICAgICBpZiAoIWNvbmZpZz8ubm9DaGVja3MpIHtcbiAgICAgICAgICAgIGxldCBleGlzdHNDaGVja3MgPSAzMDtcbiAgICAgICAgICAgIHdoaWxlIChleGlzdHNDaGVja3MgPiAwKSB7XG4gICAgICAgICAgICAgICAgbGV0IGV4aXN0cyA9IGF3YWl0IHRoaXMuZ2V0SW5mbyhmaWxlTmFtZSk7XG4gICAgICAgICAgICAgICAgaWYgKGV4aXN0cykgYnJlYWs7XG4gICAgICAgICAgICAgICAgYXdhaXQgZGVsYXkoMTAwMCk7XG4gICAgICAgICAgICAgICAgZXhpc3RzQ2hlY2tzLS07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZXhpc3RzQ2hlY2tzID09PSAwKSB7XG4gICAgICAgICAgICAgICAgbGV0IGV4aXN0cyA9IGF3YWl0IHRoaXMuZ2V0SW5mbyhmaWxlTmFtZSk7XG4gICAgICAgICAgICAgICAgY29uc29sZS53YXJuKGBGaWxlICR7ZmlsZU5hbWV9LyR7Zn0gd2FzIHVwbG9hZGVkLCBidXQgY291bGQgbm90IGJlIGZvdW5kIGFmdGVyd2FyZHMuIEhvcGVmdWxseSBpdCB3YXMganVzdCBkZWxldGVkLCB2ZXJ5IHF1aWNrbHk/IElmIGJhY2tibGF6ZSBpcyB0YWtpbmcgdG9vIGxvbmcgZm9yIGZpbGVzIHRvIHByb3BhZ2F0ZSwgdGhlbiB3ZSBtaWdodCBydW4gaW50byBpc3N1ZXMgd2l0aCB0aGUgZGF0YWJhc2UgYXRvbWljaXR5LmApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmaWxlTmFtZTtcbiAgICB9XG4gICAgcHVibGljIGFzeW5jIGRlbChmaWxlTmFtZTogc3RyaW5nLCBjb25maWc/OiBEZWxDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgaWYgKGNvbmZpZz8ubGFzdE1vZGlmaWVkKSB7XG4gICAgICAgICAgICAvLyBBIHN5bmNocm9uaXplZCBkZWxldGlvbjogYjIncyBoaWRlIHJlbW92ZXMgdGhlIGZpbGUgZnJvbSBsaXN0aW5ncyBlbnRpcmVseSwgc28gcGVlcnMgc2Nhbm5pbmcgdGhlIGJ1Y2tldCBjb3VsZCBuZXZlciBsZWFybiBvZiBpdC4gSW5zdGVhZCB0aGUgdG9tYnN0b25lIGlzIHN0b3JlZCBhcyBhIFJFQUwgZW1wdHkgZmlsZSAoYW4gZW1wdHkgZmlsZSBJUyBhIG1pc3NpbmcgZmlsZSksIHdoaWNoIGxpc3RpbmdzIHNob3cgYW5kIHNjYW5zIGluZ2VzdCBhcyBhIGRlbGV0aW9uLiAoYjIgc3RhbXBzIGl0cyBvd24gdXBsb2FkIHRpbWUsIHNvIHRoZSBleGFjdCBkZWxldGlvbiB0aW1lIGlzIG5vdCBwcmVzZXJ2ZWQgaGVyZSAtIHNhbWUgYXMgZXZlcnkgYjIgd3JpdGUuKVxuICAgICAgICAgICAgaWYgKCFjb25maWcubm9DaGVja3MpIHtcbiAgICAgICAgICAgICAgICBsZXQgZXhpc3RpbmcgPSBhd2FpdCB0aGlzLmdldEluZm8oZmlsZU5hbWUsIHsgaW5jbHVkZVRvbWJzdG9uZXM6IHRydWUgfSk7XG4gICAgICAgICAgICAgICAgaWYgKGV4aXN0aW5nICYmIGNvbmZpZy5sYXN0TW9kaWZpZWQgPCBleGlzdGluZy53cml0ZVRpbWUpIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMubG9nKGBiYWNrYmxhemUgdG9tYnN0b25lIHVwbG9hZCAke2ZpbGVOYW1lfWApO1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5hcGlSZXRyeUxvZ2ljKGBkZWwgJHtmaWxlTmFtZX1gLCBhc3luYyAoYXBpKSA9PiB7XG4gICAgICAgICAgICAgICAgYXdhaXQgYXBpLnVwbG9hZEZpbGUoeyBidWNrZXRJZDogdGhpcy5idWNrZXRJZCwgZmlsZU5hbWUsIGRhdGE6IEJ1ZmZlci5hbGxvYygwKSB9KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMubG9nKGBiYWNrYmxhemUgZGVsZXRlICR7ZmlsZU5hbWV9YCk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLmFwaVJldHJ5TG9naWMoYGhpZGVGaWxlICR7ZmlsZU5hbWV9YCwgYXN5bmMgKGFwaSkgPT4ge1xuICAgICAgICAgICAgICAgIGF3YWl0IGFwaS5oaWRlRmlsZSh7IGJ1Y2tldElkOiB0aGlzLmJ1Y2tldElkLCBmaWxlTmFtZTogZmlsZU5hbWUgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICAgICAgICB0aGlzLmxvZyhgYmFja2JsYXplIGVycm9yIGluIGhpZGUsIHBvc3NpYmx5IGFscmVhZHkgaGlkZGVuICR7ZmlsZU5hbWV9XFxuJHtlLnN0YWNrfWApO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gTk9URTogRGVsZXRpb24gU0VFTVMgdG8gd29yay4gVGhpcyBET0VTIGJyZWFrIGlmIHdlIGRlbGV0ZSBhIGZpbGUgd2hpY2gga2VlcHMgYmVpbmcgcmVjcmVhdGVkLCBleCwgdGhlIGhlYXJ0YmVhdC4gbGV0IGV4aXN0c0NoZWNrcyA9IDEwOyB3aGlsZSAoZXhpc3RzQ2hlY2tzID4gMCkgeyBsZXQgZXhpc3RzID0gYXdhaXQgdGhpcy5nZXRJbmZvKGZpbGVOYW1lKTsgaWYgKCFleGlzdHMpIGJyZWFrOyBhd2FpdCBkZWxheSgxMDAwKTsgZXhpc3RzQ2hlY2tzLS07IH0gaWYgKGV4aXN0c0NoZWNrcyA9PT0gMCkgeyBsZXQgZXhpc3RzID0gYXdhaXQgdGhpcy5nZXRJbmZvKGZpbGVOYW1lKTsgZGV2RGVidWdicmVhaygpOyBjb25zb2xlLndhcm4oYEZpbGUgJHtmaWxlTmFtZX0gd2FzIGRlbGV0ZWQsIGJ1dCB3YXMgc3RpbGwgZm91bmQgYWZ0ZXJ3YXJkc2ApOyBleGlzdHMgPSBhd2FpdCB0aGlzLmdldEluZm8oZmlsZU5hbWUpOyB9XG4gICAgfVxuXG4gICAgLy8gbGFzdE1vZGlmaWVkIGlzIGFjY2VwdGVkIGJ1dCBjYW5ub3QgYmUgaG9ub3JlZCAtIGIyIHN0YW1wcyBpdHMgb3duIHVwbG9hZFRpbWVzdGFtcCwgd2hpY2ggaXMgd2hhdCBvdXIgZ2V0SW5mby9maW5kSW5mbyByZXBvcnQgYXMgdGhlIHdyaXRlIHRpbWVcbiAgICBwdWJsaWMgYXN5bmMgc2V0TGFyZ2VGaWxlKGNvbmZpZzogeyBwYXRoOiBzdHJpbmc7IGxhc3RNb2RpZmllZD86IG51bWJlcjsgZ2V0TmV4dERhdGEoKTogUHJvbWlzZTxCdWZmZXIgfCB1bmRlZmluZWQ+OyB9KTogUHJvbWlzZTx2b2lkPiB7XG5cbiAgICAgICAgbGV0IG9uRXJyb3I6ICgoKSA9PiBQcm9taXNlPHZvaWQ+KVtdID0gW107XG4gICAgICAgIGxldCB0aW1lID0gRGF0ZS5ub3coKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGxldCB7IHBhdGggfSA9IGNvbmZpZztcbiAgICAgICAgICAgIC8vIEJhY2tibGF6ZSByZXF1aXJlcyA1TUIgY2h1bmtzLiBCdXQsIGxhcmdlciBpcyBtb3JlIGVmZmljaWVudCBmb3IgdXMuXG4gICAgICAgICAgICBjb25zdCBNSU5fQ0hVTktfU0laRSA9IDMyICogMTAyNCAqIDEwMjQ7XG4gICAgICAgICAgICBsZXQgZGF0YVF1ZXVlOiBCdWZmZXJbXSA9IFtdO1xuICAgICAgICAgICAgYXN5bmMgZnVuY3Rpb24gZ2V0TmV4dERhdGEoKTogUHJvbWlzZTxCdWZmZXIgfCB1bmRlZmluZWQ+IHtcbiAgICAgICAgICAgICAgICBpZiAoZGF0YVF1ZXVlLmxlbmd0aCkgcmV0dXJuIGRhdGFRdWV1ZS5zaGlmdCgpO1xuICAgICAgICAgICAgICAgIC8vIEdldCBidWZmZXJzIHVudGlsIHdlIGdldCA1TUIsIE9SLCBlbmQuIEJhY2tibGF6ZSByZXF1aXJlcyB0aGlzIGZvciBsYXJnZSBmaWxlcy5cbiAgICAgICAgICAgICAgICBsZXQgdG90YWxCeXRlcyA9IDA7XG4gICAgICAgICAgICAgICAgbGV0IGJ1ZmZlcnM6IEJ1ZmZlcltdID0gW107XG4gICAgICAgICAgICAgICAgd2hpbGUgKHRvdGFsQnl0ZXMgPCBNSU5fQ0hVTktfU0laRSkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgZGF0YSA9IGF3YWl0IGNvbmZpZy5nZXROZXh0RGF0YSgpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWRhdGEpIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB0b3RhbEJ5dGVzICs9IGRhdGEubGVuZ3RoO1xuICAgICAgICAgICAgICAgICAgICBidWZmZXJzLnB1c2goZGF0YSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICghYnVmZmVycy5sZW5ndGgpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgcmV0dXJuIEJ1ZmZlci5jb25jYXQoYnVmZmVycyk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGxldCBmaWxlTmFtZSA9IHBhdGg7XG4gICAgICAgICAgICBsZXQgZGF0YSA9IGF3YWl0IGdldE5leHREYXRhKCk7XG4gICAgICAgICAgICBpZiAoIWRhdGE/Lmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgc2V0TGFyZ2VGaWxlIHByb2R1Y2VkIG5vIGRhdGEgZm9yICR7SlNPTi5zdHJpbmdpZnkoY29uZmlnLnBhdGgpfSBvbiAke3RoaXMuZ2V0RGVidWdOYW1lKCl9OiBhbiBlbXB0eSBmaWxlIElTIGEgZGVsZXRpb24gaW4gdGhpcyBzeXN0ZW0gLSBjYWxsIGRlbCB0byBkZWxldGUsIG5ldmVyIHdyaXRlIGVtcHR5IGZpbGVzYCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBCYWNrYmxhemUgZGlzYWxsb3dzIG92ZXJseSBzbWFsbCBmaWxlc1xuICAgICAgICAgICAgaWYgKGRhdGEubGVuZ3RoIDwgTUlOX0NIVU5LX1NJWkUpIHtcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnNldChmaWxlTmFtZSwgZGF0YSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gQmFja2JsYXplIGRpc2FsbG93cyBsZXNzIHRoYW4gMiBjaHVua3NcbiAgICAgICAgICAgIGxldCBzZWNvbmREYXRhID0gYXdhaXQgZ2V0TmV4dERhdGEoKTtcbiAgICAgICAgICAgIGlmICghc2Vjb25kRGF0YT8ubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5zZXQoZmlsZU5hbWUsIGRhdGEpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIEFMU08sIGlmIHRoZXJlIGFyZSB0d28gY2h1bmtzLCBidXQgb25lIGlzIHRvbyBzbWFsbCwgY29tYmluZSBpdC4gVGhpcyBoZWxwcyBhbGxvdyB1cyBuZXZlciBzZW5kIHNtYWxsIGNodW5rcy5cbiAgICAgICAgICAgIGlmIChzZWNvbmREYXRhLmxlbmd0aCA8IE1JTl9DSFVOS19TSVpFKSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5zZXQoZmlsZU5hbWUsIEJ1ZmZlci5jb25jYXQoW2RhdGEsIHNlY29uZERhdGFdKSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5sb2coYFVwbG9hZGluZyBsYXJnZSBmaWxlICR7Y29uZmlnLnBhdGh9YCk7XG4gICAgICAgICAgICBkYXRhUXVldWUudW5zaGlmdChkYXRhLCBzZWNvbmREYXRhKTtcblxuXG4gICAgICAgICAgICBsZXQgdXBsb2FkSW5mbyA9IGF3YWl0IHRoaXMuYXBpUmV0cnlMb2dpYyhgc3RhcnRMYXJnZUZpbGUgJHtmaWxlTmFtZX1gLCBhc3luYyAoYXBpKSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGF3YWl0IGFwaS5zdGFydExhcmdlRmlsZSh7XG4gICAgICAgICAgICAgICAgICAgIGJ1Y2tldElkOiB0aGlzLmJ1Y2tldElkLFxuICAgICAgICAgICAgICAgICAgICBmaWxlTmFtZTogZmlsZU5hbWUsXG4gICAgICAgICAgICAgICAgICAgIGNvbnRlbnRUeXBlOiBcImIyL3gtYXV0b1wiLFxuICAgICAgICAgICAgICAgICAgICBmaWxlSW5mbzoge30sXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIG9uRXJyb3IucHVzaChhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5hcGlSZXRyeUxvZ2ljKGBjYW5jZWxMYXJnZUZpbGUgJHtmaWxlTmFtZX1gLCBhc3luYyAoYXBpKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IGFwaS5jYW5jZWxMYXJnZUZpbGUoeyBmaWxlSWQ6IHVwbG9hZEluZm8uZmlsZUlkIH0pO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIGNvbnN0IExPR19JTlRFUlZBTCA9IHRpbWVJbk1pbnV0ZTtcbiAgICAgICAgICAgIGxldCBuZXh0TG9nVGltZSA9IERhdGUubm93KCkgKyBMT0dfSU5URVJWQUw7XG5cbiAgICAgICAgICAgIGxldCBwYXJ0TnVtYmVyID0gMTtcbiAgICAgICAgICAgIGxldCBwYXJ0U2hhMUFycmF5OiBzdHJpbmdbXSA9IFtdO1xuICAgICAgICAgICAgbGV0IHRvdGFsQnl0ZXMgPSAwO1xuICAgICAgICAgICAgd2hpbGUgKHRydWUpIHtcbiAgICAgICAgICAgICAgICBkYXRhID0gYXdhaXQgZ2V0TmV4dERhdGEoKTtcbiAgICAgICAgICAgICAgICBpZiAoIWRhdGEpIGJyZWFrO1xuICAgICAgICAgICAgICAgIC8vIFNvLi4uIGlmIHRoZSBuZXh0IGNodW5rIGlzIHRoZSBsYXN0IG9uZSwgY29tYmluZSBpdCB3aXRoIHRoZSBjdXJyZW50IG9uZS4gVGhpcyBwcmV2ZW50cyBBTlkgdXBsb2FkcyBmcm9tIGJlaW5nIDwgdGhlIHRocmVzaG9sZCwgYXMgYXBwYXJlbnRseSB0aGUgXCJsYXN0IHBhcnRcIiBjaGVjayBpbiBiYWNrYmxhemUgZmFpbHMgd2hlbiB3ZSBoYXZlIHRvIHJldHJ5IGFuIHVwbG9hZCAoZHVlIHRvIFwibm8gdG9tZXMgYXZhaWxhYmxlXCIpLiBXZWxsIGl0IGNhbid0IGZhaWwgaWYgZXZlbiB0aGUgbGFzdCBwYXJ0IGlzID4gNU1CLCBub3cgY2FuIGl0ISBCVVQsIG9ubHkgaWYgdGhpcyBpc24ndCB0aGUgZmlyc3QgY2h1bmssIG90aGVyd2lzZSB3ZSBtaWdodCB0cnkgdG8gc2VuZCBhIHNpbmdsZSBjaHVuaywgd2hpY2ggd2UgY2FuJ3QgZG8uXG4gICAgICAgICAgICAgICAgaWYgKHBhcnRTaGExQXJyYXkubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgbWF5YmVMYXN0RGF0YSA9IGF3YWl0IGdldE5leHREYXRhKCk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChtYXliZUxhc3REYXRhKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobWF5YmVMYXN0RGF0YS5sZW5ndGggPCBNSU5fQ0hVTktfU0laRSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEl0J3MgdGhlIGxhc3Qgb25lLCBzbyBjb25zdW1lIGl0IG5vd1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBCdWZmZXIuY29uY2F0KFtkYXRhLCBtYXliZUxhc3REYXRhXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEl0J3Mgbm90IHRoZSBsYXN0IG9uZS4gUHV0IGl0IGJhY2ssIGluIGNhc2UgdGhlIG9uZSBBRlRFUiBpcyB0aGUgbGFzdCBvbmUsIGluIHdoaWNoIGNhc2Ugd2UgbmVlZCB0byBtZXJnZSBtYXliZUxhc3REYXRhIHdpdGggdGhlIG5leHQgbmV4dCBkYXRhLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFRdWV1ZS51bnNoaWZ0KG1heWJlTGFzdERhdGEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGxldCBzaGExID0gcmVxdWlyZShcImNyeXB0b1wiKS5jcmVhdGVIYXNoKFwic2hhMVwiKTtcbiAgICAgICAgICAgICAgICBzaGExLnVwZGF0ZShkYXRhKTtcbiAgICAgICAgICAgICAgICBsZXQgc2hhMUhleCA9IHNoYTEuZGlnZXN0KFwiaGV4XCIpO1xuICAgICAgICAgICAgICAgIHBhcnRTaGExQXJyYXkucHVzaChzaGExSGV4KTtcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmFwaVJldHJ5TG9naWMoYHVwbG9hZFBhcnQjJHtwYXJ0TnVtYmVyfSAke2ZpbGVOYW1lfWAsIGFzeW5jIChhcGkpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFkYXRhKSB0aHJvdyBuZXcgRXJyb3IoXCJJbXBvc3NpYmxlLCBkYXRhIGlzIHVuZGVmaW5lZFwiKTtcblxuICAgICAgICAgICAgICAgICAgICBsZXQgdGltZVN0ciA9IGZvcm1hdFRpbWUoRGF0ZS5ub3coKSAtIHRpbWUpO1xuICAgICAgICAgICAgICAgICAgICBsZXQgcmF0ZVN0ciA9IGZvcm1hdE51bWJlcih0b3RhbEJ5dGVzIC8gKERhdGUubm93KCkgLSB0aW1lKSAqIDEwMDApICsgXCJCL3NcIjtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2coYFVwbG9hZGluZyBsYXJnZSBmaWxlIHBhcnQgJHtwYXJ0TnVtYmVyfSwgdXBsb2FkZWQgJHtibHVlKGZvcm1hdE51bWJlcih0b3RhbEJ5dGVzKSArIFwiQlwiKX0gaW4gJHtibHVlKHRpbWVTdHIpfSAoJHtibHVlKHJhdGVTdHIpfSkuICR7Y29uZmlnLnBhdGh9YCk7XG4gICAgICAgICAgICAgICAgICAgIHRvdGFsQnl0ZXMgKz0gZGF0YS5sZW5ndGg7XG5cbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgYXBpLnVwbG9hZFBhcnQoe1xuICAgICAgICAgICAgICAgICAgICAgICAgZmlsZUlkOiB1cGxvYWRJbmZvLmZpbGVJZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhcnROdW1iZXI6IHBhcnROdW1iZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICBkYXRhOiBkYXRhLFxuICAgICAgICAgICAgICAgICAgICAgICAgc2hhMTogc2hhMUhleCxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgcGFydE51bWJlcisrO1xuXG4gICAgICAgICAgICAgICAgaWYgKERhdGUubm93KCkgPiBuZXh0TG9nVGltZSkge1xuICAgICAgICAgICAgICAgICAgICBuZXh0TG9nVGltZSA9IERhdGUubm93KCkgKyBMT0dfSU5URVJWQUw7XG4gICAgICAgICAgICAgICAgICAgIGxldCB0aW1lU3RyID0gZm9ybWF0VGltZShEYXRlLm5vdygpIC0gdGltZSk7XG4gICAgICAgICAgICAgICAgICAgIGxldCByYXRlU3RyID0gZm9ybWF0TnVtYmVyKHRvdGFsQnl0ZXMgLyAoRGF0ZS5ub3coKSAtIHRpbWUpICogMTAwMCkgKyBcIkIvc1wiO1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhgU3RpbGwgdXBsb2FkaW5nIGxhcmdlIGZpbGUgYXQgJHtEYXRlLm5vdygpfS4gVXBsb2FkZWQgJHtmb3JtYXROdW1iZXIodG90YWxCeXRlcyl9QiBpbiAke3RpbWVTdHJ9ICgke3JhdGVTdHJ9KS4gJHtjb25maWcucGF0aH1gKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmxvZyhgRmluaXNoZWQgdXBsb2FkaW5nIGxhcmdlIGZpbGUgdXBsb2FkZWQgJHtncmVlbihmb3JtYXROdW1iZXIodG90YWxCeXRlcykpfUJgKTtcblxuICAgICAgICAgICAgYXdhaXQgdGhpcy5hcGlSZXRyeUxvZ2ljKGBmaW5pc2hMYXJnZUZpbGUgJHtmaWxlTmFtZX1gLCBhc3luYyAoYXBpKSA9PiB7XG4gICAgICAgICAgICAgICAgYXdhaXQgYXBpLmZpbmlzaExhcmdlRmlsZSh7XG4gICAgICAgICAgICAgICAgICAgIGZpbGVJZDogdXBsb2FkSW5mby5maWxlSWQsXG4gICAgICAgICAgICAgICAgICAgIHBhcnRTaGExQXJyYXk6IHBhcnRTaGExQXJyYXksXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICAgICAgICBmb3IgKGxldCBjIG9mIG9uRXJyb3IpIHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCBjKCk7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGBFcnJvciBkdXJpbmcgZXJyb3IgY2xlYW4uIElnbm9yaW5nLCB3ZSB3aWxsIHJldGhyb3cgdGhlIG9yaWdpbmFsIGVycm9yLCBwYXRoICR7Y29uZmlnLnBhdGh9YCwgZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEVycm9yIGluIHNldExhcmdlRmlsZSBmb3IgJHtjb25maWcucGF0aH06ICR7ZS5zdGFja31gKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBnZXRJbmZvKGZpbGVOYW1lOiBzdHJpbmcsIGNvbmZpZz86IEdldEluZm9Db25maWcpOiBQcm9taXNlPHsgd3JpdGVUaW1lOiBudW1iZXI7IHNpemU6IG51bWJlcjsgfSB8IHVuZGVmaW5lZD4ge1xuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5hcGlSZXRyeUxvZ2ljKGBnZXRJbmZvICR7ZmlsZU5hbWV9YCwgYXN5bmMgKGFwaSkgPT4ge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBsZXQgZmlsZSA9IGF3YWl0IGFwaS5oZWFkRmlsZUJ5TmFtZSh7IGJ1Y2tldE5hbWU6IHRoaXMuYnVja2V0TmFtZSwgZmlsZU5hbWUgfSk7XG4gICAgICAgICAgICAgICAgaWYgKCFmaWxlIHx8ICFmaWxlLnNpemUgJiYgIWNvbmZpZz8uaW5jbHVkZVRvbWJzdG9uZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2coYEJhY2tibGF6ZSBmaWxlIG5vdCBleGlzdHMgJHtmaWxlTmFtZX1gKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy5sb2coYEJhY2tibGF6ZSBmaWxlIGV4aXN0cyAke2ZpbGVOYW1lfWApO1xuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIHdyaXRlVGltZTogZmlsZS51cGxvYWRUaW1lc3RhbXAsXG4gICAgICAgICAgICAgICAgICAgIHNpemU6IGZpbGUuc2l6ZSxcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICAgICAgICAgICAgaWYgKGUuc3RhY2suaW5jbHVkZXMoYGZpbGVfbm90X2ZvdW5kYCkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2coYEJhY2tibGF6ZSBmaWxlIG5vdCBleGlzdHMgJHtmaWxlTmFtZX1gKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhyb3cgZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gRm9yIGV4YW1wbGUgZmluZEZpbGVOYW1lcyhcImlwcy9cIilcbiAgICBwdWJsaWMgYXN5bmMgZmluZChwcmVmaXg6IHN0cmluZywgY29uZmlnPzogeyBzaGFsbG93PzogYm9vbGVhbjsgdHlwZTogXCJmaWxlc1wiIHwgXCJmb2xkZXJzXCIgfSk6IFByb21pc2U8c3RyaW5nW10+IHtcbiAgICAgICAgbGV0IHJlc3VsdCA9IGF3YWl0IHRoaXMuZmluZEluZm8ocHJlZml4LCBjb25maWcpO1xuICAgICAgICByZXR1cm4gcmVzdWx0Lm1hcCh4ID0+IHgucGF0aCk7XG4gICAgfVxuICAgIHB1YmxpYyBhc3luYyBnZXRDaGFuZ2VzQWZ0ZXIyKGNvbmZpZzogQ2hhbmdlc0FmdGVyQ29uZmlnKTogUHJvbWlzZTxBcmNoaXZlRmlsZUluZm9bXT4ge1xuICAgICAgICAvLyBObyBuYXRpdmUgY2hhbmdlIGZlZWQgKGIyIHN1cHBvcnRzIG5laXRoZXIgdGltZSBub3Igcm91dGUgZmlsdGVyaW5nKSAtIGEgZnVsbCBsaXN0aW5nIGZpbHRlcmVkIGluIG1lbW9yeVxuICAgICAgICByZXR1cm4gZmlsdGVyQ2hhbmdlcyhhd2FpdCB0aGlzLmZpbmRJbmZvKFwiXCIpLCBjb25maWcpO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBmaW5kSW5mbyhwcmVmaXg6IHN0cmluZywgY29uZmlnPzogeyBzaGFsbG93PzogYm9vbGVhbjsgdHlwZTogXCJmaWxlc1wiIHwgXCJmb2xkZXJzXCIgfSk6IFByb21pc2U8eyBwYXRoOiBzdHJpbmc7IGNyZWF0ZVRpbWU6IG51bWJlcjsgc2l6ZTogbnVtYmVyOyB9W10+IHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuYXBpUmV0cnlMb2dpYyhgZmluZEluZm8gJHtwcmVmaXh9YCwgYXN5bmMgKGFwaSkgPT4ge1xuICAgICAgICAgICAgaWYgKCFjb25maWc/LnNoYWxsb3cgJiYgY29uZmlnPy50eXBlID09PSBcImZvbGRlcnNcIikge1xuICAgICAgICAgICAgICAgIGxldCBhbGxGaWxlcyA9IGF3YWl0IHRoaXMuZmluZEluZm8ocHJlZml4KTtcbiAgICAgICAgICAgICAgICBsZXQgYWxsRm9sZGVycyA9IG5ldyBNYXA8c3RyaW5nLCB7IHBhdGg6IHN0cmluZzsgY3JlYXRlVGltZTogbnVtYmVyOyBzaXplOiBudW1iZXIgfT4oKTtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCB7IHBhdGgsIGNyZWF0ZVRpbWUsIHNpemUgfSBvZiBhbGxGaWxlcykge1xuICAgICAgICAgICAgICAgICAgICBsZXQgZm9sZGVyID0gcGF0aC5zcGxpdChcIi9cIikuc2xpY2UoMCwgLTEpLmpvaW4oXCIvXCIpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWZvbGRlcikgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgIGFsbEZvbGRlcnMuc2V0KGZvbGRlciwgeyBwYXRoOiBmb2xkZXIsIGNyZWF0ZVRpbWUsIHNpemUgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBBcnJheS5mcm9tKGFsbEZvbGRlcnMudmFsdWVzKCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGV0IGZpbGVzID0gbmV3IE1hcDxzdHJpbmcsIHsgcGF0aDogc3RyaW5nOyBjcmVhdGVUaW1lOiBudW1iZXI7IHNpemU6IG51bWJlcjsgfT4oKTtcbiAgICAgICAgICAgIGxldCBzdGFydEZpbGVOYW1lID0gXCJcIjtcbiAgICAgICAgICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICAgICAgICAgICAgbGV0IHJlc3VsdCA9IGF3YWl0IGFwaS5saXN0RmlsZU5hbWVzKHtcbiAgICAgICAgICAgICAgICAgICAgYnVja2V0SWQ6IHRoaXMuYnVja2V0SWQsXG4gICAgICAgICAgICAgICAgICAgIHByZWZpeDogcHJlZml4LFxuICAgICAgICAgICAgICAgICAgICBzdGFydEZpbGVOYW1lLFxuICAgICAgICAgICAgICAgICAgICBtYXhGaWxlQ291bnQ6IDEwMDAsXG4gICAgICAgICAgICAgICAgICAgIGRlbGltaXRlcjogY29uZmlnPy5zaGFsbG93ID8gXCIvXCIgOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgZmlsZSBvZiByZXN1bHQuZmlsZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGZpbGUuYWN0aW9uID09PSBcInVwbG9hZFwiICYmIGNvbmZpZz8udHlwZSAhPT0gXCJmb2xkZXJzXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVzLnNldChmaWxlLmZpbGVOYW1lLCB7IHBhdGg6IGZpbGUuZmlsZU5hbWUsIGNyZWF0ZVRpbWU6IGZpbGUudXBsb2FkVGltZXN0YW1wLCBzaXplOiBmaWxlLmNvbnRlbnRMZW5ndGggfSk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZmlsZS5hY3Rpb24gPT09IFwiZm9sZGVyXCIgJiYgY29uZmlnPy50eXBlID09PSBcImZvbGRlcnNcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGZvbGRlciA9IGZpbGUuZmlsZU5hbWU7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZm9sZGVyLmVuZHNXaXRoKFwiL1wiKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvbGRlciA9IGZvbGRlci5zbGljZSgwLCAtMSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBmaWxlcy5zZXQoZm9sZGVyLCB7IHBhdGg6IGZvbGRlciwgY3JlYXRlVGltZTogZmlsZS51cGxvYWRUaW1lc3RhbXAsIHNpemU6IGZpbGUuY29udGVudExlbmd0aCB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHN0YXJ0RmlsZU5hbWUgPSByZXN1bHQubmV4dEZpbGVOYW1lO1xuICAgICAgICAgICAgICAgIGlmICghc3RhcnRGaWxlTmFtZSkgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gQXJyYXkuZnJvbShmaWxlcy52YWx1ZXMoKSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBhc3NlcnRQYXRoVmFsaWQocGF0aDogc3RyaW5nKSB7XG4gICAgICAgIGxldCBieXRlcyA9IEJ1ZmZlci5mcm9tKHBhdGgsIFwidXRmOFwiKTtcbiAgICAgICAgaWYgKGJ5dGVzLmxlbmd0aCA+IDEwMDApIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgUGF0aCB0b28gbG9uZzogJHtwYXRoLmxlbmd0aH0gY2hhcmFjdGVycyA+IDEwMDAgY2hhcmFjdGVycy4gUGF0aDogJHtwYXRofWApO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIG1vdmUoY29uZmlnOiB7XG4gICAgICAgIHBhdGg6IHN0cmluZztcbiAgICAgICAgdGFyZ2V0OiBJQXJjaGl2ZXM7XG4gICAgICAgIHRhcmdldFBhdGg6IHN0cmluZztcbiAgICAgICAgY29weUluc3RlYWQ/OiBib29sZWFuO1xuICAgIH0pIHtcbiAgICAgICAgbGV0IHsgcGF0aCwgdGFyZ2V0LCB0YXJnZXRQYXRoIH0gPSBjb25maWc7XG4gICAgICAgIC8vIEEgc2VsZiBtb3ZlIHNob3VsZCBOT09QIChhbmQgZGVmaW5pdGVseSBub3QgY29weSwgYW5kIHRoZW4gZGVsZXRlIGl0c2VsZiEpXG4gICAgICAgIGlmICh0YXJnZXQgPT09IHRoaXMgJiYgcGF0aCA9PT0gdGFyZ2V0UGF0aCkge1xuICAgICAgICAgICAgdGhpcy5sb2coYEJhY2tibGF6ZSBtb3ZlIHBhdGggdG8gaXRzZWxmLiBTa2lwcGluZyBtb3ZlLCBhcyB0aGVyZSBpcyBubyB3b3JrIHRvIGRvLiAke3BhdGh9YCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRhcmdldCBpbnN0YW5jZW9mIEFyY2hpdmVzQmFja2JsYXplKSB7XG4gICAgICAgICAgICBsZXQgdGFyZ2V0QnVja2V0SWQgPSB0YXJnZXQuYnVja2V0SWQ7XG4gICAgICAgICAgICBpZiAodGFyZ2V0QnVja2V0SWQgPT09IHRoaXMuYnVja2V0SWQgJiYgcGF0aCA9PT0gdGFyZ2V0UGF0aCkgcmV0dXJuO1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5hcGlSZXRyeUxvZ2ljKGBtb3ZlICR7cGF0aH0gLT4gJHt0YXJnZXRQYXRofWAsIGFzeW5jIChhcGkpID0+IHtcbiAgICAgICAgICAgICAgICAvLyBVZ2guLi4gbGlzdGluZyB0aGUgZmlsZSBuYW1lIHN1Y2tzLCBidXQuLi4gSSBndWVzcyBpdCdzIHN0aWxsIGJldHRlciB0aGFuIGRvd25sb2FkaW5nIGFuZCByZS11cGxvYWRpbmcgdGhlIGVudGlyZSBmaWxlLlxuICAgICAgICAgICAgICAgIGxldCBpbmZvID0gYXdhaXQgYXBpLmxpc3RGaWxlTmFtZXMoeyBidWNrZXRJZDogdGhpcy5idWNrZXRJZCwgcHJlZml4OiBwYXRoLCBtYXhGaWxlQ291bnQ6IDEwIH0pO1xuICAgICAgICAgICAgICAgIGxldCBmaWxlID0gaW5mby5maWxlcy5maW5kKHggPT4geC5maWxlTmFtZSA9PT0gcGF0aCk7XG4gICAgICAgICAgICAgICAgaWYgKCFmaWxlKSB0aHJvdyBuZXcgRXJyb3IoYEZpbGUgbm90IGZvdW5kIHRvIG1vdmU6ICR7cGF0aH1gKTtcbiAgICAgICAgICAgICAgICBhd2FpdCBhcGkuY29weUZpbGUoe1xuICAgICAgICAgICAgICAgICAgICBzb3VyY2VGaWxlSWQ6IGZpbGUuZmlsZUlkLFxuICAgICAgICAgICAgICAgICAgICBmaWxlTmFtZTogdGFyZ2V0UGF0aCxcbiAgICAgICAgICAgICAgICAgICAgZGVzdGluYXRpb25CdWNrZXRJZDogdGFyZ2V0QnVja2V0SWQsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGxldCBkYXRhID0gYXdhaXQgdGhpcy5nZXQocGF0aCk7XG4gICAgICAgICAgICBpZiAoIWRhdGEpIHRocm93IG5ldyBFcnJvcihgRmlsZSBub3QgZm91bmQgdG8gbW92ZTogJHtwYXRofWApO1xuICAgICAgICAgICAgYXdhaXQgdGFyZ2V0LnNldCh0YXJnZXRQYXRoLCBkYXRhKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghY29uZmlnLmNvcHlJbnN0ZWFkKSB7XG4gICAgICAgICAgICBsZXQgZXhpc3RzID0gYXdhaXQgdGhpcy5nZXRJbmZvKHRhcmdldFBhdGgpO1xuICAgICAgICAgICAgaWYgKCFleGlzdHMpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGBGaWxlIG5vdCBmb3VuZCBhZnRlciBtb3ZlLiBMZWF2aW5nIEJPVEggZmlsZXMuICR7dGFyZ2V0UGF0aH0gd2FzIG5vdCBmb3VuZC4gQmVpbmcgbW92ZWQgZnJvbSAke3BhdGh9YCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuZGVsKHBhdGgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGNvcHkoY29uZmlnOiB7XG4gICAgICAgIHBhdGg6IHN0cmluZztcbiAgICAgICAgdGFyZ2V0OiBJQXJjaGl2ZXM7XG4gICAgICAgIHRhcmdldFBhdGg6IHN0cmluZztcbiAgICB9KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIHJldHVybiB0aGlzLm1vdmUoeyAuLi5jb25maWcsIGNvcHlJbnN0ZWFkOiB0cnVlIH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBnZXRVUkwocGF0aDogc3RyaW5nKSB7XG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmFwaVJldHJ5TG9naWMoYGdldFVSTCAke3BhdGh9YCwgYXN5bmMgKGFwaSkgPT4ge1xuICAgICAgICAgICAgaWYgKHBhdGguc3RhcnRzV2l0aChcIi9cIikpIHtcbiAgICAgICAgICAgICAgICBwYXRoID0gcGF0aC5zbGljZSgxKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBhd2FpdCBhcGkuZ2V0RG93bmxvYWRVUkwoXCJmaWxlL1wiICsgdGhpcy5idWNrZXROYW1lICsgXCIvXCIgKyBwYXRoKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGdldERvd25sb2FkQXV0aG9yaXphdGlvbihjb25maWc6IHtcbiAgICAgICAgZmlsZU5hbWVQcmVmaXg/OiBzdHJpbmc7XG4gICAgICAgIHZhbGlkRHVyYXRpb25JblNlY29uZHM6IG51bWJlcjtcbiAgICAgICAgYjJDb250ZW50RGlzcG9zaXRpb24/OiBzdHJpbmc7XG4gICAgICAgIGIyQ29udGVudExhbmd1YWdlPzogc3RyaW5nO1xuICAgICAgICBiMkV4cGlyZXM/OiBzdHJpbmc7XG4gICAgICAgIGIyQ2FjaGVDb250cm9sPzogc3RyaW5nO1xuICAgICAgICBiMkNvbnRlbnRFbmNvZGluZz86IHN0cmluZztcbiAgICAgICAgYjJDb250ZW50VHlwZT86IHN0cmluZztcbiAgICB9KTogUHJvbWlzZTx7XG4gICAgICAgIGJ1Y2tldElkOiBzdHJpbmc7XG4gICAgICAgIGZpbGVOYW1lUHJlZml4OiBzdHJpbmc7XG4gICAgICAgIGF1dGhvcml6YXRpb25Ub2tlbjogc3RyaW5nO1xuICAgIH0+IHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuYXBpUmV0cnlMb2dpYyhgZ2V0RG93bmxvYWRBdXRob3JpemF0aW9uICR7Y29uZmlnLmZpbGVOYW1lUHJlZml4ID8/IFwiXCJ9YCwgYXN5bmMgKGFwaSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IGFwaS5nZXREb3dubG9hZEF1dGhvcml6YXRpb24oe1xuICAgICAgICAgICAgICAgIGJ1Y2tldElkOiB0aGlzLmJ1Y2tldElkLFxuICAgICAgICAgICAgICAgIGZpbGVOYW1lUHJlZml4OiBjb25maWcuZmlsZU5hbWVQcmVmaXggPz8gXCJcIixcbiAgICAgICAgICAgICAgICAuLi5jb25maWcsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfVxufVxuXG4vKlxuTmFtZXMgc2hvdWxkIGJlIGEgVVRGLTggc3RyaW5nIHVwIHRvIDEwMjQgYnl0ZXMgd2l0aCB0aGUgZm9sbG93aW5nIGV4Y2VwdGlvbnM6XG4gICAgQ2hhcmFjdGVyIGNvZGVzIGJlbG93IDMyIGFyZSBub3QgYWxsb3dlZC5cbiAgICBERUwgY2hhcmFjdGVycyAoMTI3KSBhcmUgbm90IGFsbG93ZWQuXG4gICAgQmFja3NsYXNoZXMgYXJlIG5vdCBhbGxvd2VkLlxuICAgIEZpbGUgbmFtZXMgY2Fubm90IHN0YXJ0IHdpdGggLywgZW5kIHdpdGggLywgb3IgY29udGFpbiAvLy5cbiovXG5cblxuZXhwb3J0IGNvbnN0IGdldEFyY2hpdmVzQmFja2JsYXplID0gY2FjaGUoKGRvbWFpbjogc3RyaW5nKSA9PiB7XG4gICAgcmV0dXJuIG5ldyBBcmNoaXZlc0JhY2tibGF6ZSh7IGJ1Y2tldE5hbWU6IGRvbWFpbiB9KTtcbn0pO1xuZXhwb3J0IGNvbnN0IGdldEFyY2hpdmVzQmFja2JsYXplUHJpdmF0ZUltbXV0YWJsZSA9IGNhY2hlKChkb21haW46IHN0cmluZykgPT4ge1xuICAgIHJldHVybiBuZXcgQXJjaGl2ZXNCYWNrYmxhemUoe1xuICAgICAgICBidWNrZXROYW1lOiBkb21haW4gKyBcIi1wcml2YXRlLWltbXV0YWJsZVwiLFxuICAgICAgICBpbW11dGFibGU6IHRydWVcbiAgICB9KTtcbn0pO1xuZXhwb3J0IGNvbnN0IGdldEFyY2hpdmVzQmFja2JsYXplUHVibGljSW1tdXRhYmxlID0gY2FjaGUoKGRvbWFpbjogc3RyaW5nKSA9PiB7XG4gICAgcmV0dXJuIG5ldyBBcmNoaXZlc0JhY2tibGF6ZSh7XG4gICAgICAgIGJ1Y2tldE5hbWU6IGRvbWFpbiArIFwiLXB1YmxpYy1pbW11dGFibGVcIixcbiAgICAgICAgcHVibGljOiB0cnVlLFxuICAgICAgICBpbW11dGFibGU6IHRydWUsXG4gICAgICAgIGFsbG93ZWRPcmlnaW5zOiBbYGh0dHBzOi8vJHtkb21haW59YCwgYGh0dHBzOi8vMTI3LTAtMC0xLiR7ZG9tYWlufTo3MDA3YF0sXG4gICAgfSk7XG59KTtcblxuLy8gTk9URTogQ2FjaGUgYnkgYSBtaW51dGUuIFRoaXMgbWlnaHQgYmUgYSBiYWQgaWRlYSwgYnV0Li4uIHVzdWFsbHkgd2hvbGUgcmVhc29uIGZvciBwdWJsaWMgaXMgZm9yIGNsb3VkZmxhcmUgY2FjaGluZyAoYXMgb3RoZXJ3aXNlIHdlIGNhbiBqdXN0IGFjY2VzcyBpdCB0aHJvdWdoIGEgc2VydmVyKSwgb3IgZm9yIGxhcmdlIGZpbGVzICh3aGljaCBzaG91bGQgYmUgY2FjaGVkIGFueXdheXMsIGFuZCBwcm9iYWJseSBldmVuIHVzZSBpbW11dGFibGUgY2FjaGluZykuXG5leHBvcnQgY29uc3QgZ2V0QXJjaGl2ZXNCYWNrYmxhemVQdWJsaWMgPSBjYWNoZSgoZG9tYWluOiBzdHJpbmcpID0+IHtcbiAgICByZXR1cm4gbmV3IEFyY2hpdmVzQmFja2JsYXplKHtcbiAgICAgICAgYnVja2V0TmFtZTogZG9tYWluICsgXCItcHVibGljXCIsXG4gICAgICAgIHB1YmxpYzogdHJ1ZSxcbiAgICAgICAgY2FjaGVUaW1lOiB0aW1lSW5NaW51dGUsXG4gICAgICAgIGFsbG93ZWRPcmlnaW5zOiBbYGh0dHBzOi8vJHtkb21haW59YCwgYGh0dHBzOi8vMTI3LTAtMC0xLiR7ZG9tYWlufTo3MDA3YF0sXG4gICAgfSk7XG59KTsiXX0=
|
|
848
|
-
/* _JS_SOURCE_HASH = "
|
|
856
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFja2JsYXplLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiYmFja2JsYXplLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLHlEQUEwRDtBQUcxRCxtREFBa0Y7QUFDbEYsMkRBQXFEO0FBQ3JELGtFQUFpRjtBQUNqRix3RUFBZ0Y7QUFFaEYsOENBQXNCO0FBQ3RCLGlEQUE4QztBQUM5QyxxREFBNEU7QUFDNUUsMkNBQTJOO0FBQzNOLCtEQUE2RDtBQU83RCxJQUFJLGNBQWMsR0FBRyxJQUFBLGNBQUksRUFBQyxLQUFLLElBQTZCLEVBQUU7SUFDMUQsSUFBSSxLQUFLLEdBQUcsTUFBTSxJQUFBLHFCQUFTLEVBQUMsaUNBQWlDLENBQUMsQ0FBQztJQUMvRCxJQUFJLEdBQUcsR0FBRyxNQUFNLElBQUEscUJBQVMsRUFBQywrQkFBK0IsQ0FBQyxDQUFDO0lBQzNELE9BQU87UUFDSCxnQkFBZ0IsRUFBRSxLQUFLO1FBQ3ZCLGNBQWMsRUFBRSxHQUFHO0tBQ3RCLENBQUM7QUFDTixDQUFDLENBQUMsQ0FBQztBQUNILDZNQUE2TTtBQUM3TSxNQUFNLHFCQUFxQixHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUM7QUFDeEMsaU1BQWlNO0FBQ2pNLE1BQU0seUJBQXlCLEdBQUcsRUFBRSxHQUFHLElBQUksR0FBRyxJQUFJLENBQUM7QUFFbkQsK0tBQStLO0FBQy9LLFNBQVMsd0JBQXdCLENBQUMsUUFBMkI7SUFDekQsSUFBSSxJQUFJLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztJQUMzRCxJQUFJLFlBQVksR0FBRyxRQUFRLENBQUMsT0FBTyxDQUFDLGVBQWUsQ0FBQyxDQUFDO0lBQ3JELElBQUksS0FBSyxHQUFHLFlBQVksSUFBSSxNQUFNLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQy9ELElBQUks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YWNoaW5nXCI7XG5pbXBvcnQgZnMgZnJvbSBcImZzXCI7XG5pbXBvcnQgb3MgZnJvbSBcIm9zXCI7XG5pbXBvcnQgeyBpc05vZGUsIHNvcnQsIHRpbWVJbkhvdXIsIHRpbWVJbk1pbnV0ZSB9IGZyb20gXCJzb2NrZXQtZnVuY3Rpb24vc3JjL21pc2NcIjtcbmltcG9ydCB7IGRlbGF5IH0gZnJvbSBcInNvY2tldC1mdW5jdGlvbi9zcmMvYmF0Y2hpbmdcIjtcbmltcG9ydCB7IGZvcm1hdE51bWJlciwgZm9ybWF0VGltZSB9IGZyb20gXCJzb2NrZXQtZnVuY3Rpb24vc3JjL2Zvcm1hdHRpbmcvZm9ybWF0XCI7XG5pbXBvcnQgeyBibHVlLCBncmVlbiwgbWFnZW50YSB9IGZyb20gXCJzb2NrZXQtZnVuY3Rpb24vc3JjL2Zvcm1hdHRpbmcvbG9nQ29sb3JzXCI7XG5pbXBvcnQgZGVidWdicmVhayBmcm9tIFwiZGVidWdicmVha1wiO1xuaW1wb3J0IGRucyBmcm9tIFwiZG5zXCI7XG5pbXBvcnQgeyBnZXRTZWNyZXQgfSBmcm9tIFwiLi4vbWlzYy9nZXRTZWNyZXRcIjtcbmltcG9ydCB7IGh0dHBzUmVxdWVzdCwgSHR0cHNSZXNwb25zZUluZm8gfSBmcm9tIFwic29ja2V0LWZ1bmN0aW9uL3NyYy9odHRwc1wiO1xuaW1wb3J0IHsgSUFyY2hpdmVzLCBBcmNoaXZlc0NvbmZpZywgQ2hhbmdlc0FmdGVyQ29uZmlnLCBBcmNoaXZlRmlsZUluZm8sIERlbENvbmZpZywgRmluZENvbmZpZywgR2V0Q29uZmlnLCBHZXRJbmZvQ29uZmlnLCBTZXRDb25maWcsIGFzc2VydFZhbGlkTGFzdE1vZGlmaWVkLCBidWZmZXJDaHVua1N0cmVhbSwgSU1NVVRBQkxFX0NBQ0hFX1RJTUUgfSBmcm9tIFwiLi9JQXJjaGl2ZXNcIjtcbmltcG9ydCB7IGZpbHRlckNoYW5nZXMgfSBmcm9tIFwiLi9yZW1vdGVTdG9yYWdlL3JlbW90ZUNvbmZpZ1wiO1xuXG50eXBlIEJhY2tibGF6ZUNyZWRzID0ge1xuICAgIGFwcGxpY2F0aW9uS2V5SWQ6IHN0cmluZztcbiAgICBhcHBsaWNhdGlvbktleTogc3RyaW5nO1xufTtcblxubGV0IGJhY2tibGF6ZUNyZWRzID0gbGF6eShhc3luYyAoKTogUHJvbWlzZTxCYWNrYmxhemVDcmVkcz4gPT4ge1xuICAgIGxldCBrZXlJZCA9IGF3YWl0IGdldFNlY3JldChcImJhY2tibGF6ZS5qc29uLmFwcGxpY2F0aW9uS2V5SWRcIik7XG4gICAgbGV0IGtleSA9IGF3YWl0IGdldFNlY3JldChcImJhY2tibGF6ZS5qc29uLmFwcGxpY2F0aW9uS2V5XCIpO1xuICAgIHJldHVybiB7XG4gICAgICAgIGFwcGxpY2F0aW9uS2V5SWQ6IGtleUlkLFxuICAgICAgICBhcHBsaWNhdGlvbktleToga2V5LFxuICAgIH07XG59KTtcbi8vIEIyJ3MgbWluaW11bSBtYXhBZ2VTZWNvbmRzIGlzIDYwIC0gYW55dGhpbmcgbG93ZXIgZ2V0cyBidW1wZWQgdG8gNjAgc2VydmVyLXNpZGUsIHNvIGEgc21hbGxlciBkZWZhdWx0IHdvdWxkIG5ldmVyIG1hdGNoIHdoYXQgdGhlIGJ1Y2tldCBhY3R1YWxseSBzdG9yZXMgYW5kIHdlIHdvdWxkIHJld3JpdGUgaXRzIHNldHRpbmdzIG9uIGV2ZXJ5IHN0YXJ0dXBcbmNvbnN0IE1JTl9CVUNLRVRfQ0FDSEVfVElNRSA9IDYwICogMTAwMDtcbi8vIEJhY2tibGF6ZSByZXF1aXJlcyA1TUIgY2h1bmtzIGZvciBsYXJnZSBmaWxlcywgYnV0IGxhcmdlciBpcyBtb3JlIGVmZmljaWVudCBmb3IgdXMgKGFuZCB0aGVpciBcImxhc3QgcGFydFwiIHNpemUgY2hlY2sgbWlzYmVoYXZlcyBvbiByZXRyaWVzLCB3aGljaCBjaHVua3MgdGhpcyBiaWcgc2lkZXN0ZXAgLSBzZWUgc2V0TGFyZ2VGaWxlKVxuY29uc3QgTEFSR0VfRklMRV9NSU5fQ0hVTktfU0laRSA9IDMyICogMTAyNCAqIDEwMjQ7XG5cbi8vIEEgQjIgZG93bmxvYWQvSEVBRCByZXNwb25zZSdzIGhlYWRlcnMgY2FycnkgdGhlIGZpbGUncyBtZXRhZGF0YS4gY29udGVudC1yYW5nZSdzIHRvdGFsIHdpbnMgb3ZlciBjb250ZW50LWxlbmd0aCBmb3IgcmFuZ2VkIHJlc3BvbnNlcyAod2hpY2ggb25seSByZXBvcnQgdGhlIHNsaWNlJ3MgbGVuZ3RoKS5cbmZ1bmN0aW9uIHBhcnNlRmlsZU1ldGFkYXRhSGVhZGVycyhyZXNwb25zZTogSHR0cHNSZXNwb25zZUluZm8pOiB7IHNpemU6IG51bWJlcjsgdXBsb2FkVGltZXN0YW1wOiBudW1iZXIgfSB7XG4gICAgbGV0IHNpemUgPSBOdW1iZXIocmVzcG9uc2UuaGVhZGVyc1tcImNvbnRlbnQtbGVuZ3RoXCJdIHx8IDApO1xuICAgIGxldCBjb250ZW50UmFuZ2UgPSByZXNwb25zZS5oZWFkZXJzW1wiY29udGVudC1yYW5nZVwiXTtcbiAgICBsZXQgdG90YWwgPSBjb250ZW50UmFuZ2UgJiYgTnVtYmVyKGNvbnRlbnRSYW5nZS5zcGxpdChcIi9cIilbMV0pO1xuICAgIGlmICh0b3RhbCAmJiBOdW1iZXIuaXNGaW5pdGUodG90YWwpKSB7XG4gICAgICAgIHNpemUgPSB0b3RhbDtcbiAgICB9XG4gICAgcmV0dXJuIHsgc2l6ZSwgdXBsb2FkVGltZXN0YW1wOiBOdW1iZXIocmVzcG9uc2UuaGVhZGVyc1tcIngtYnotdXBsb2FkLXRpbWVzdGFtcFwiXSB8fCAwKSB9O1xufVxuXG5jb25zdCBnZXRBUEkgPSBsYXp5KGFzeW5jICgpID0+IHtcbiAgICBsZXQgY3JlZHMgPSBhd2FpdCBiYWNrYmxhemVDcmVkcygpO1xuXG4gICAgLy8gTk9URTogT24gZXJyb3JzLCBvdXIgcmV0cnkgY29kZSByZXNldHMgdGhpcyBsYXp5LCBzbyB3ZSBETyBnZXQgbmV3IGF1dGhvcml6ZSB3aGVuIG5lZWRlZC5cbiAgICAvLyBUT0RPOiBNYXliZSB3ZSBzaG91bGQgZ2V0IG5ldyBhdXRob3JpemF0aW9uIHBlcmlvZGljYWxseSBhdCB3ZWxsP1xuICAgIGxldCBhdXRob3JpemVSYXcgPSBhd2FpdCBodHRwc1JlcXVlc3QoXCJodHRwczovL2FwaS5iYWNrYmxhemViMi5jb20vYjJhcGkvdjIvYjJfYXV0aG9yaXplX2FjY291bnRcIiwgdW5kZWZpbmVkLCBcIkdFVFwiLCB1bmRlZmluZWQsIHtcbiAgICAgICAgaGVhZGVyczoge1xuICAgICAgICAgICAgQXV0aG9yaXphdGlvbjogXCJCYXNpYyBcIiArIEJ1ZmZlci5mcm9tKGNyZWRzLmFwcGxpY2F0aW9uS2V5SWQgKyBcIjpcIiArIGNyZWRzLmFwcGxpY2F0aW9uS2V5KS50b1N0cmluZyhcImJhc2U2NFwiKSxcbiAgICAgICAgfVxuICAgIH0pO1xuXG4gICAgbGV0IGF1dGggPSBKU09OLnBhcnNlKGF1dGhvcml6ZVJhdy50b1N0cmluZygpKSBhcyB7XG4gICAgICAgIGFjY291bnRJZDogc3RyaW5nO1xuICAgICAgICBhdXRob3JpemF0aW9uVG9rZW46IHN0cmluZztcbiAgICAgICAgYXBpVXJsOiBzdHJpbmc7XG4gICAgICAgIGRvd25sb2FkVXJsOiBzdHJpbmc7XG4gICAgICAgIGFsbG93ZWQ6IHtcbiAgICAgICAgICAgIGJ1Y2tldElkOiBzdHJpbmc7XG4gICAgICAgICAgICBidWNrZXROYW1lOiBzdHJpbmc7XG4gICAgICAgICAgICBjYXBhYmlsaXRpZXM6IHN0cmluZ1tdO1xuICAgICAgICAgICAgbmFtZVByZWZpeDogc3RyaW5nO1xuICAgICAgICB9W107XG4gICAgfTtcblxuICAgIGZ1bmN0aW9uIGNyZWF0ZUIyRnVuY3Rpb248QXJnLCBSZXN1bHQ+KG5hbWU6IHN0cmluZywgdHlwZTogXCJQT1NUXCIgfCBcIkdFVFwiLCBub0FjY291bnRJZD86IFwibm9BY2NvdW50SWRcIik6IChhcmc6IEFyZykgPT4gUHJvbWlzZTxSZXN1bHQ+IHtcbiAgICAgICAgcmV0dXJuIGFzeW5jIChhcmc6IEFyZykgPT4ge1xuICAgICAgICAgICAgaWYgKCFub0FjY291bnRJZCkge1xuICAgICAgICAgICAgICAgIGFyZyA9IHsgYWNjb3VudElkOiBhdXRoLmFjY291bnRJZCwgLi4uYXJnIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGxldCB1cmwgPSBhdXRoLmFwaVVybCArIFwiL2IyYXBpL3YyL1wiICsgbmFtZTtcbiAgICAgICAgICAgICAgICBsZXQgcmVzdWx0ID0gYXdhaXQgaHR0cHNSZXF1ZXN0KHVybCwgQnVmZmVyLmZyb20oSlNPTi5zdHJpbmdpZnkoYXJnKSksIHR5cGUsIHVuZGVmaW5lZCwge1xuICAgICAgICAgICAgICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBBdXRob3JpemF0aW9uOiBhdXRoLmF1dGhvcml6YXRpb25Ub2tlbixcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHJldHVybiBKU09OLnBhcnNlKHJlc3VsdC50b1N0cmluZygpKTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgRXJyb3IgaW4gJHtuYW1lfSwgYXJnICR7SlNPTi5zdHJpbmdpZnkoYXJnKS5zbGljZSgwLCAxMDAwKX06ICR7ZS5zdGFja31gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBjb25zdCBjcmVhdGVCdWNrZXQgPSBjcmVhdGVCMkZ1bmN0aW9uPHtcbiAgICAgICAgYnVja2V0TmFtZTogc3RyaW5nO1xuICAgICAgICBidWNrZXRUeXBlOiBcImFsbFByaXZhdGVcIiB8IFwiYWxsUHVibGljXCI7XG4gICAgICAgIGxpZmVjeWNsZVJ1bGVzPzogYW55W107XG4gICAgICAgIGNvcnNSdWxlcz86IHVua25vd25bXTtcbiAgICAgICAgYnVja2V0SW5mbz86IHtcbiAgICAgICAgICAgIFtrZXk6IHN0cmluZ106IHVua25vd247XG4gICAgICAgIH07XG4gICAgfSwge1xuICAgICAgICBhY2NvdW50SWQ6IHN0cmluZztcbiAgICAgICAgYnVja2V0SWQ6IHN0cmluZztcbiAgICAgICAgYnVja2V0TmFtZTogc3RyaW5nO1xuICAgICAgICBidWNrZXRUeXBlOiBcImFsbFByaXZhdGVcIiB8IFwiYWxsUHVibGljXCI7XG4gICAgICAgIGJ1Y2tldEluZm86IHtcbiAgICAgICAgICAgIGxpZmVjeWNsZVJ1bGVzOiBhbnlbXTtcbiAgICAgICAgfTtcbiAgICAgICAgY29yc1J1bGVzOiBhbnlbXTtcbiAgICAgICAgbGlmZWN5Y2xlUnVsZXM6IGFueVtdO1xuICAgICAgICByZXZpc2lvbjogbnVtYmVyO1xuICAgIH0+KFwiYjJfY3JlYXRlX2J1Y2tldFwiLCBcIlBPU1RcIik7XG5cbiAgICBjb25zdCB1cGRhdGVCdWNrZXQgPSBjcmVhdGVCMkZ1bmN0aW9uPHtcbiAgICAgICAgYWNjb3VudElkOiBzdHJpbmc7XG4gICAgICAgIGJ1Y2tldElkOiBzdHJpbmc7XG4gICAgICAgIGJ1Y2tldFR5cGU/OiBcImFsbFByaXZhdGVcIiB8IFwiYWxsUHVibGljXCI7XG4gICAgICAgIGxpZmVjeWNsZVJ1bGVzPzogYW55W107XG4gICAgICAgIGJ1Y2tldEluZm8/OiB7XG4gICAgICAgICAgICBba2V5OiBzdHJpbmddOiB1bmtub3duO1xuICAgICAgICB9O1xuICAgICAgICBjb3JzUnVsZXM/OiB1bmtub3duW107XG4gICAgfSwge1xuICAgICAgICBhY2NvdW50SWQ6IHN0cmluZztcbiAgICAgICAgYnVja2V0SWQ6IHN0cmluZztcbiAgICAgICAgYnVja2V0TmFtZTogc3RyaW5nO1xuICAgICAgICBidWNrZXRUeXBlOiBcImFsbFByaXZhdGVcIiB8IFwiYWxsUHVibGljXCI7XG4gICAgICAgIGJ1Y2tldEluZm86IHtcbiAgICAgICAgICAgIGxpZmVjeWNsZVJ1bGVzOiBhbnlbXTtcbiAgICAgICAgfTtcbiAgICAgICAgY29yc1J1bGVzOiBhbnlbXTtcbiAgICAgICAgbGlmZWN5Y2xlUnVsZXM6IGFueVtdO1xuICAgICAgICByZXZpc2lvbjogbnVtYmVyO1xuICAgIH0+KFwiYjJfdXBkYXRlX2J1Y2tldFwiLCBcIlBPU1RcIik7XG5cbiAgICAvLyBodHRwczovL3d3dy5iYWNrYmxhemUuY29tL2FwaWRvY3MvYjItdXBkYXRlLWJ1Y2tldFxuICAgIC8vICBUT0RPOiBiMl91cGRhdGVfYnVja2V0LCBzbyB3ZSBjYW4gdXBkYXRlIENPUlMsIGV0Y1xuXG4gICAgY29uc3QgbGlzdEJ1Y2tldHMgPSBjcmVhdGVCMkZ1bmN0aW9uPHtcbiAgICAgICAgYnVja2V0TmFtZT86IHN0cmluZztcbiAgICB9LCB7XG4gICAgICAgIGJ1Y2tldHM6IHtcbiAgICAgICAgICAgIGFjY291bnRJZDogc3RyaW5nO1xuICAgICAgICAgICAgYnVja2V0SWQ6IHN0cmluZztcbiAgICAgICAgICAgIGJ1Y2tldE5hbWU6IHN0cmluZztcbiAgICAgICAgICAgIGJ1Y2tldFR5cGU6IFwiYWxsUHJpdmF0ZVwiIHwgXCJhbGxQdWJsaWNcIjtcbiAgICAgICAgICAgIGJ1Y2tldEluZm86IHtcbiAgICAgICAgICAgICAgICBsaWZlY3ljbGVSdWxlczogYW55W107XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgY29yc1J1bGVzOiBhbnlbXTtcbiAgICAgICAgICAgIGxpZmVjeWNsZVJ1bGVzOiBhbnlbXTtcbiAgICAgICAgICAgIHJldmlzaW9uOiBudW1iZXI7XG4gICAgICAgIH1bXTtcbiAgICB9PihcImIyX2xpc3RfYnVja2V0c1wiLCBcIlBPU1RcIik7XG5cbiAgICBmdW5jdGlvbiBlbmNvZGVQYXRoKHBhdGg6IHN0cmluZykge1xuICAgICAgICAvLyBQcmVzZXJ2ZSBzbGFzaGVzLCBidXQgZW5jb2RlIGV2ZXJ5dGhpbmcgZWxzZVxuICAgICAgICBwYXRoID0gcGF0aC5zcGxpdChcIi9cIikubWFwKGVuY29kZVVSSUNvbXBvbmVudCkuam9pbihcIi9cIik7XG4gICAgICAgIGlmIChwYXRoLnN0YXJ0c1dpdGgoXCIvXCIpKSBwYXRoID0gXCIlMkZcIiArIHBhdGguc2xpY2UoMSk7XG4gICAgICAgIGlmIChwYXRoLmVuZHNXaXRoKFwiL1wiKSkgcGF0aCA9IHBhdGguc2xpY2UoMCwgLTEpICsgXCIlMkZcIjtcbiAgICAgICAgLy8gTk9URTogRm9yIHNvbWUgcmVhc29uLCB0aGlzIHdvbid0IHJlbmRlciBpbiB0aGUgd2ViIFVJIGNvcnJlY3RseS4gQlVULCBpdCdsbFxuICAgICAgICAvLyAgd29yayBnZXQgZ2V0L3NldCBhbmQgZmluZFxuICAgICAgICAvLyAgLSBBTFNPLCBpdCBzZWVtcyB0byBhZGQgZHVwbGljYXRlIGZpbGVzPyBUaGlzIG1pZ2h0IGFsc28gYmUgYSB3ZWIgVUkgdGhpbmcuIEl0IHNlZW1zIHRvIHdvcmsgdGhvdWdoLlxuICAgICAgICB3aGlsZSAocGF0aC5pbmNsdWRlcyhcIi8vXCIpKSB7XG4gICAgICAgICAgICBwYXRoID0gcGF0aC5yZXBsYWNlQWxsKFwiLy9cIiwgXCIvJTJGXCIpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBwYXRoO1xuICAgIH1cblxuICAgIGFzeW5jIGZ1bmN0aW9uIGRvd25sb2FkRmlsZUJ5TmFtZShjb25maWc6IHtcbiAgICAgICAgYnVja2V0TmFtZTogc3RyaW5nO1xuICAgICAgICBmaWxlTmFtZTogc3RyaW5nO1xuICAgICAgICByYW5nZT86IHsgc3RhcnQ6IG51bWJlcjsgZW5kOiBudW1iZXI7IH07XG4gICAgICAgIC8vIENhcHR1cmVzIHRoZSByZXNwb25zZSBoZWFkZXJzLCB3aGljaCBjYXJyeSB0aGUgZmlsZSdzIG1ldGFkYXRhICh4LWJ6LXVwbG9hZC10aW1lc3RhbXAsIGNvbnRlbnQtbGVuZ3RoIC8gY29udGVudC1yYW5nZSkgLSBzbyBjYWxsZXJzIHRoYXQgbmVlZCBpdCBkb24ndCBwYXkgYSBzZWNvbmQgQVBJIGNhbGxcbiAgICAgICAgb3V0UmVzcG9uc2U/OiBIdHRwc1Jlc3BvbnNlSW5mbztcbiAgICB9KSB7XG4gICAgICAgIGxldCBmaWxlTmFtZSA9IGVuY29kZVBhdGgoY29uZmlnLmZpbGVOYW1lKTtcblxuICAgICAgICBsZXQgcmVzdWx0ID0gYXdhaXQgaHR0cHNSZXF1ZXN0KGF1dGguYXBpVXJsICsgXCIvZmlsZS9cIiArIGNvbmZpZy5idWNrZXROYW1lICsgXCIvXCIgKyBmaWxlTmFtZSwgQnVmZmVyLmZyb20oSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAgICAgYWNjb3VudElkOiBhdXRoLmFjY291bnRJZCxcbiAgICAgICAgICAgIHJlc3BvbnNlVHlwZTogXCJhcnJheWJ1ZmZlclwiLFxuICAgICAgICB9KSksIFwiR0VUXCIsIHVuZGVmaW5lZCwge1xuICAgICAgICAgICAgaGVhZGVyczogT2JqZWN0LmZyb21FbnRyaWVzKE9iamVjdC5lbnRyaWVzKHtcbiAgICAgICAgICAgICAgICBBdXRob3JpemF0aW9uOiBhdXRoLmF1dGhvcml6YXRpb25Ub2tlbixcbiAgICAgICAgICAgICAgICBcIkNvbnRlbnQtVHlwZVwiOiBcImFwcGxpY2F0aW9uL2pzb25cIixcbiAgICAgICAgICAgICAgICBSYW5nZTogY29uZmlnLnJhbmdlID8gYGJ5dGVzPSR7Y29uZmlnLnJhbmdlLnN0YXJ0fS0ke2NvbmZpZy5yYW5nZS5lbmQgLSAxfWAgOiB1bmRlZmluZWQsXG4gICAgICAgICAgICB9KS5maWx0ZXIoeCA9PiB4WzFdICE9PSB1bmRlZmluZWQpKSxcbiAgICAgICAgICAgIG91dFJlc3BvbnNlOiBjb25maWcub3V0UmVzcG9uc2UsXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKiBBIGZpbGUncyBtZXRhZGF0YSBieSBuYW1lLCB3aXRob3V0IHRoZSBib2R5OiBIRUFEIG9uIHRoZSBkb3dubG9hZCBVUkwsIHdoaWNoIGlzIGEgY2xhc3MgQiAoZG93bmxvYWQtcHJpY2VkKSB0cmFuc2FjdGlvbiAtIGIyX2xpc3RfZmlsZV9uYW1lcyBpcyBjbGFzcyBDIGF0IDEweCB0aGUgcHJpY2UsIGFuZCBiMl9nZXRfZmlsZV9pbmZvIG5lZWRzIGEgZmlsZUlkIHdlIGRvbid0IGhhdmUuIFJldHVybnMgdW5kZWZpbmVkIGZvciBtaXNzaW5nIChvciBoaWRkZW4pIGZpbGVzLiAqL1xuICAgIGFzeW5jIGZ1bmN0aW9uIGhlYWRGaWxlQnlOYW1lKGNvbmZpZzogeyBidWNrZXROYW1lOiBzdHJpbmc7IGZpbGVOYW1lOiBzdHJpbmcgfSk6IFByb21pc2U8eyBzaXplOiBudW1iZXI7IHVwbG9hZFRpbWVzdGFtcDogbnVtYmVyIH0gfCB1bmRlZmluZWQ+IHtcbiAgICAgICAgbGV0IGZpbGVOYW1lID0gZW5jb2RlUGF0aChjb25maWcuZmlsZU5hbWUpO1xuICAgICAgICBsZXQgcmVzcG9uc2U6IEh0dHBzUmVzcG9uc2VJbmZvID0geyBoZWFkZXJzOiB7fSB9O1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgYXdhaXQgaHR0cHNSZXF1ZXN0KGF1dGguYXBpVXJsICsgXCIvZmlsZS9cIiArIGNvbmZpZy5idWNrZXROYW1lICsgXCIvXCIgKyBmaWxlTmFtZSwgdW5kZWZpbmVkLCBcIkhFQURcIiwgdW5kZWZpbmVkLCB7XG4gICAgICAgICAgICAgICAgaGVhZGVyczogeyBBdXRob3JpemF0aW9uOiBhdXRoLmF1dGhvcml6YXRpb25Ub2tlbiB9LFxuICAgICAgICAgICAgICAgIG91dFJlc3BvbnNlOiByZXNwb25zZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICBpZiAocmVzcG9uc2Uuc3RhdHVzQ29kZSA9PT0gNDA0KSByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICAgICAgLy8gSEVBRCByZXNwb25zZXMgaGF2ZSBubyBib2R5LCBzbyB0aGUgZXhwaXJlZF9hdXRoX3Rva2VuIG1hcmtlciBhcGlSZXRyeUxvZ2ljIG1hdGNoZXMgb24gbmV2ZXIgYXBwZWFycyAtIHJlLWFkZCBpdCBzbyBhbiBleHBpcmVkIHRva2VuIHN0aWxsIHJlZnJlc2hlcyBhbmQgcmV0cmllc1xuICAgICAgICAgICAgaWYgKHJlc3BvbnNlLnN0YXR1c0NvZGUgPT09IDQwMSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgXCJleHBpcmVkX2F1dGhfdG9rZW5cIiBIRUFEICR7Y29uZmlnLmJ1Y2tldE5hbWV9LyR7Y29uZmlnLmZpbGVOYW1lfSBnb3QgYSA0MDE6ICR7KGUgYXMgRXJyb3IpLnN0YWNrID8/IGV9YCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBwYXJzZUZpbGVNZXRhZGF0YUhlYWRlcnMocmVzcG9uc2UpO1xuICAgIH1cblxuICAgIC8vIE9oLi4uIGFwcGFyZW50bHksIHdlIGNhbid0IHJldXNlIHRoZXNlPyBIdWguLi5cbiAgICBjb25zdCBnZXRVcGxvYWRVUkwgPSAoYXN5bmMgKGJ1Y2tldElkOiBzdHJpbmcpID0+IHtcbiAgICAgICAgLy8gc2V0VGltZW91dCgoKSA9PiBnZXRVcGxvYWRVUkwuY2xlYXIoYnVja2V0SWQpLCB0aW1lSW5Ib3VyICogMSk7XG4gICAgICAgIGxldCBnZXRVcGxvYWRVcmxSYXcgPSBhd2FpdCBodHRwc1JlcXVlc3QoYXV0aC5hcGlVcmwgKyBcIi9iMmFwaS92Mi9iMl9nZXRfdXBsb2FkX3VybD9idWNrZXRJZD1cIiArIGJ1Y2tldElkLCB1bmRlZmluZWQsIFwiR0VUXCIsIHVuZGVmaW5lZCwge1xuICAgICAgICAgICAgaGVhZGVyczoge1xuICAgICAgICAgICAgICAgIEF1dGhvcml6YXRpb246IGF1dGguYXV0aG9yaXphdGlvblRva2VuLFxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gSlNPTi5wYXJzZShnZXRVcGxvYWRVcmxSYXcudG9TdHJpbmcoKSkgYXMge1xuICAgICAgICAgICAgYnVja2V0SWQ6IHN0cmluZztcbiAgICAgICAgICAgIHVwbG9hZFVybDogc3RyaW5nO1xuICAgICAgICAgICAgYXV0aG9yaXphdGlvblRva2VuOiBzdHJpbmc7XG4gICAgICAgIH07XG4gICAgfSk7XG5cbiAgICBhc3luYyBmdW5jdGlvbiB1cGxvYWRGaWxlKGNvbmZpZzoge1xuICAgICAgICBidWNrZXRJZDogc3RyaW5nO1xuICAgICAgICBmaWxlTmFtZTogc3RyaW5nO1xuICAgICAgICBkYXRhOiBCdWZmZXI7XG4gICAgfSkge1xuICAgICAgICBsZXQgZ2V0VXBsb2FkVXJsID0gYXdhaXQgZ2V0VXBsb2FkVVJMKGNvbmZpZy5idWNrZXRJZCk7XG5cbiAgICAgICAgYXdhaXQgaHR0cHNSZXF1ZXN0KGdldFVwbG9hZFVybC51cGxvYWRVcmwsIGNvbmZpZy5kYXRhLCBcIlBPU1RcIiwgdW5kZWZpbmVkLCB7XG4gICAgICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgICAgICAgQXV0aG9yaXphdGlvbjogZ2V0VXBsb2FkVXJsLmF1dGhvcml6YXRpb25Ub2tlbixcbiAgICAgICAgICAgICAgICBcIlgtQnotRmlsZS1OYW1lXCI6IGVuY29kZVBhdGgoY29uZmlnLmZpbGVOYW1lKSxcbiAgICAgICAgICAgICAgICBcIkNvbnRlbnQtVHlwZVwiOiBcImIyL3gtYXV0b1wiLFxuICAgICAgICAgICAgICAgIFwiWC1Cei1Db250ZW50LVNoYTFcIjogXCJkb19ub3RfdmVyaWZ5XCIsXG4gICAgICAgICAgICAgICAgXCJDb250ZW50LUxlbmd0aFwiOiBjb25maWcuZGF0YS5sZW5ndGggKyBcIlwiLFxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBjb25zdCBoaWRlRmlsZSA9IGNyZWF0ZUIyRnVuY3Rpb248e1xuICAgICAgICBidWNrZXRJZDogc3RyaW5nO1xuICAgICAgICBmaWxlTmFtZTogc3RyaW5nO1xuICAgIH0sIHt9PihcImIyX2hpZGVfZmlsZVwiLCBcIlBPU1RcIiwgXCJub0FjY291bnRJZFwiKTtcblxuICAgIGNvbnN0IGdldEZpbGVJbmZvID0gY3JlYXRlQjJGdW5jdGlvbjx7XG4gICAgICAgIGJ1Y2tldE5hbWU6IHN0cmluZztcbiAgICAgICAgZmlsZUlkOiBzdHJpbmc7XG4gICAgfSwge1xuICAgICAgICBmaWxlSWQ6IHN0cmluZztcbiAgICAgICAgZmlsZU5hbWU6IHN0cmluZztcbiAgICAgICAgYWNjb3VudElkOiBzdHJpbmc7XG4gICAgICAgIGJ1Y2tldElkOiBzdHJpbmc7XG4gICAgICAgIGNvbnRlbnRMZW5ndGg6IG51bWJlcjtcbiAgICAgICAgY29udGVudFNoYTE6IHN0cmluZztcbiAgICAgICAgY29udGVudFR5cGU6IHN0cmluZztcbiAgICAgICAgZmlsZUluZm86IHtcbiAgICAgICAgICAgIHNyY19sYXN0X21vZGlmaWVkX21pbGxpczogbnVtYmVyO1xuICAgICAgICB9O1xuICAgICAgICBhY3Rpb246IHN0cmluZztcbiAgICAgICAgdXBsb2FkVGltZXN0YW1wOiBudW1iZXI7XG4gICAgfT4oXCJiMl9nZXRfZmlsZV9pbmZvXCIsIFwiUE9TVFwiLCBcIm5vQWNjb3VudElkXCIpO1xuXG4gICAgY29uc3QgbGlzdEZpbGVOYW1lcyA9IGNyZWF0ZUIyRnVuY3Rpb248e1xuICAgICAgICBidWNrZXRJZDogc3RyaW5nO1xuICAgICAgICBwcmVmaXg6IHN0cmluZztcbiAgICAgICAgc3RhcnRGaWxlTmFtZT86IHN0cmluZztcbiAgICAgICAgbWF4RmlsZUNvdW50PzogbnVtYmVyO1xuICAgICAgICBkZWxpbWl0ZXI/OiBzdHJpbmc7XG4gICAgfSwge1xuICAgICAgICBmaWxlczoge1xuICAgICAgICAgICAgZmlsZUlkOiBzdHJpbmc7XG4gICAgICAgICAgICBmaWxlTmFtZTogc3RyaW5nO1xuICAgICAgICAgICAgYWNjb3VudElkOiBzdHJpbmc7XG4gICAgICAgICAgICBidWNrZXRJZDogc3RyaW5nO1xuICAgICAgICAgICAgY29udGVudExlbmd0aDogbnVtYmVyO1xuICAgICAgICAgICAgY29udGVudFNoYTE6IHN0cmluZztcbiAgICAgICAgICAgIGNvbnRlbnRUeXBlOiBzdHJpbmc7XG4gICAgICAgICAgICBmaWxlSW5mbzoge1xuICAgICAgICAgICAgICAgIHNyY19sYXN0X21vZGlmaWVkX21pbGxpczogbnVtYmVyO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGFjdGlvbjogc3RyaW5nO1xuICAgICAgICAgICAgdXBsb2FkVGltZXN0YW1wOiBudW1iZXI7XG4gICAgICAgIH1bXTtcbiAgICAgICAgbmV4dEZpbGVOYW1lOiBzdHJpbmc7XG4gICAgfT4oXCJiMl9saXN0X2ZpbGVfbmFtZXNcIiwgXCJQT1NUXCIsIFwibm9BY2NvdW50SWRcIik7XG5cbiAgICBjb25zdCBjb3B5RmlsZSA9IGNyZWF0ZUIyRnVuY3Rpb248e1xuICAgICAgICBzb3VyY2VGaWxlSWQ6IHN0cmluZztcbiAgICAgICAgZmlsZU5hbWU6IHN0cmluZztcbiAgICAgICAgZGVzdGluYXRpb25CdWNrZXRJZDogc3RyaW5nO1xuICAgIH0sIHt9PihcImIyX2NvcHlfZmlsZVwiLCBcIlBPU1RcIiwgXCJub0FjY291bnRJZFwiKTtcblxuICAgIGNvbnN0IHN0YXJ0TGFyZ2VGaWxlID0gY3JlYXRlQjJGdW5jdGlvbjx7XG4gICAgICAgIGJ1Y2tldElkOiBzdHJpbmc7XG4gICAgICAgIGZpbGVOYW1lOiBzdHJpbmc7XG4gICAgICAgIGNvbnRlbnRUeXBlOiBzdHJpbmc7XG4gICAgICAgIGZpbGVJbmZvOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9O1xuICAgIH0sIHtcbiAgICAgICAgZmlsZUlkOiBzdHJpbmc7XG4gICAgICAgIGZpbGVOYW1lOiBzdHJpbmc7XG4gICAgICAgIGFjY291bnRJZDogc3RyaW5nO1xuICAgICAgICBidWNrZXRJZDogc3RyaW5nO1xuICAgICAgICBjb250ZW50VHlwZTogc3RyaW5nO1xuICAgICAgICBmaWxlSW5mbzogYW55O1xuICAgICAgICB1cGxvYWRUaW1lc3RhbXA6IG51bWJlcjtcbiAgICB9PihcImIyX3N0YXJ0X2xhcmdlX2ZpbGVcIiwgXCJQT1NUXCIsIFwibm9BY2NvdW50SWRcIik7XG5cbiAgICAvLyBBcHBhcmVudGx5IHdlIGNhbid0IHJldXNlIHRoZXNlP1xuICAgIGNvbnN0IGdldFVwbG9hZFBhcnRVUkwgPSAoYXN5bmMgKGZpbGVJZDogc3RyaW5nKSA9PiB7XG4gICAgICAgIGxldCB1cGxvYWRQYXJ0UmF3ID0gYXdhaXQgaHR0cHNSZXF1ZXN0KGF1dGguYXBpVXJsICsgXCIvYjJhcGkvdjIvYjJfZ2V0X3VwbG9hZF9wYXJ0X3VybD9maWxlSWQ9XCIgKyBmaWxlSWQsIHVuZGVmaW5lZCwgXCJHRVRcIiwgdW5kZWZpbmVkLCB7XG4gICAgICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgICAgICAgQXV0aG9yaXphdGlvbjogYXV0aC5hdXRob3JpemF0aW9uVG9rZW4sXG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gSlNPTi5wYXJzZSh1cGxvYWRQYXJ0UmF3LnRvU3RyaW5nKCkpIGFzIHtcbiAgICAgICAgICAgIGZpbGVJZDogc3RyaW5nO1xuICAgICAgICAgICAgcGFydE51bWJlcjogbnVtYmVyO1xuICAgICAgICAgICAgdXBsb2FkVXJsOiBzdHJpbmc7XG4gICAgICAgICAgICBhdXRob3JpemF0aW9uVG9rZW46IHN0cmluZztcbiAgICAgICAgfTtcbiAgICB9KTtcbiAgICBhc3luYyBmdW5jdGlvbiB1cGxvYWRQYXJ0KGNvbmZpZzoge1xuICAgICAgICBmaWxlSWQ6IHN0cmluZztcbiAgICAgICAgcGFydE51bWJlcjogbnVtYmVyO1xuICAgICAgICBkYXRhOiBCdWZmZXI7XG4gICAgICAgIHNoYTE6IHN0cmluZztcbiAgICB9KTogUHJvbWlzZTx7XG4gICAgICAgIGZpbGVJZDogc3RyaW5nO1xuICAgICAgICBwYXJ0TnVtYmVyOiBudW1iZXI7XG4gICAgICAgIGNvbnRlbnRMZW5ndGg6IG51bWJlcjtcbiAgICAgICAgY29udGVudFNoYTE6IHN0cmluZztcbiAgICB9PiB7XG4gICAgICAgIGxldCB1cGxvYWRQYXJ0ID0gYXdhaXQgZ2V0VXBsb2FkUGFydFVSTChjb25maWcuZmlsZUlkKTtcblxuICAgICAgICBsZXQgcmVzdWx0ID0gYXdhaXQgaHR0cHNSZXF1ZXN0KHVwbG9hZFBhcnQudXBsb2FkVXJsLCBjb25maWcuZGF0YSwgXCJQT1NUXCIsIHVuZGVmaW5lZCwge1xuICAgICAgICAgICAgaGVhZGVyczoge1xuICAgICAgICAgICAgICAgIEF1dGhvcml6YXRpb246IHVwbG9hZFBhcnQuYXV0aG9yaXphdGlvblRva2VuLFxuICAgICAgICAgICAgICAgIFwiWC1Cei1QYXJ0LU51bWJlclwiOiBjb25maWcucGFydE51bWJlciArIFwiXCIsXG4gICAgICAgICAgICAgICAgXCJYLUJ6LUNvbnRlbnQtU2hhMVwiOiBjb25maWcuc2hhMSxcbiAgICAgICAgICAgICAgICBcIkNvbnRlbnQtTGVuZ3RoXCI6IGNvbmZpZy5kYXRhLmxlbmd0aCArIFwiXCIsXG5cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBKU09OLnBhcnNlKHJlc3VsdC50b1N0cmluZygpKTtcbiAgICB9XG5cbiAgICBjb25zdCBmaW5pc2hMYXJnZUZpbGUgPSBjcmVhdGVCMkZ1bmN0aW9uPHtcbiAgICAgICAgZmlsZUlkOiBzdHJpbmc7XG4gICAgICAgIHBhcnRTaGExQXJyYXk6IHN0cmluZ1tdO1xuICAgIH0sIHtcbiAgICAgICAgZmlsZUlkOiBzdHJpbmc7XG4gICAgICAgIGZpbGVOYW1lOiBzdHJpbmc7XG4gICAgICAgIGFjY291bnRJZDogc3RyaW5nO1xuICAgICAgICBidWNrZXRJZDogc3RyaW5nO1xuICAgICAgICBjb250ZW50TGVuZ3RoOiBudW1iZXI7XG4gICAgICAgIGNvbnRlbnRTaGExOiBzdHJpbmc7XG4gICAgICAgIGNvbnRlbnRUeXBlOiBzdHJpbmc7XG4gICAgICAgIGZpbGVJbmZvOiBhbnk7XG4gICAgICAgIHVwbG9hZFRpbWVzdGFtcDogbnVtYmVyO1xuICAgIH0+KFwiYjJfZmluaXNoX2xhcmdlX2ZpbGVcIiwgXCJQT1NUXCIsIFwibm9BY2NvdW50SWRcIik7XG5cbiAgICBjb25zdCBjYW5jZWxMYXJnZUZpbGUgPSBjcmVhdGVCMkZ1bmN0aW9uPHtcbiAgICAgICAgZmlsZUlkOiBzdHJpbmc7XG4gICAgfSwge30+KFwiYjJfY2FuY2VsX2xhcmdlX2ZpbGVcIiwgXCJQT1NUXCIsIFwibm9BY2NvdW50SWRcIik7XG5cbiAgICBjb25zdCBnZXREb3dubG9hZEF1dGhvcml6YXRpb24gPSBjcmVhdGVCMkZ1bmN0aW9uPHtcbiAgICAgICAgYnVja2V0SWQ6IHN0cmluZztcbiAgICAgICAgZmlsZU5hbWVQcmVmaXg6IHN0cmluZztcbiAgICAgICAgdmFsaWREdXJhdGlvbkluU2Vjb25kczogbnVtYmVyO1xuICAgICAgICBiMkNvbnRlbnREaXNwb3NpdGlvbj86IHN0cmluZztcbiAgICAgICAgYjJDb250ZW50TGFuZ3VhZ2U/OiBzdHJpbmc7XG4gICAgICAgIGIyRXhwaXJlcz86IHN0cmluZztcbiAgICAgICAgYjJDYWNoZUNvbnRyb2w/OiBzdHJpbmc7XG4gICAgICAgIGIyQ29udGVudEVuY29kaW5nPzogc3RyaW5nO1xuICAgICAgICBiMkNvbnRlbnRUeXBlPzogc3RyaW5nO1xuICAgIH0sIHtcbiAgICAgICAgYnVja2V0SWQ6IHN0cmluZztcbiAgICAgICAgZmlsZU5hbWVQcmVmaXg6IHN0cmluZztcbiAgICAgICAgYXV0aG9yaXphdGlvblRva2VuOiBzdHJpbmc7XG4gICAgfT4oXCJiMl9nZXRfZG93bmxvYWRfYXV0aG9yaXphdGlvblwiLCBcIlBPU1RcIiwgXCJub0FjY291bnRJZFwiKTtcblxuICAgIGFzeW5jIGZ1bmN0aW9uIGdldERvd25sb2FkVVJMKHBhdGg6IHN0cmluZykge1xuICAgICAgICBpZiAoIXBhdGguc3RhcnRzV2l0aChcIi9cIikpIHtcbiAgICAgICAgICAgIHBhdGggPSBcIi9cIiArIHBhdGg7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGF1dGguZG93bmxvYWRVcmwgKyBwYXRoO1xuICAgIH1cblxuXG4gICAgcmV0dXJuIHtcbiAgICAgICAgY3JlYXRlQnVja2V0LFxuICAgICAgICB1cGRhdGVCdWNrZXQsXG4gICAgICAgIGxpc3RCdWNrZXRzLFxuICAgICAgICBkb3dubG9hZEZpbGVCeU5hbWUsXG4gICAgICAgIGhlYWRGaWxlQnlOYW1lLFxuICAgICAgICB1cGxvYWRGaWxlLFxuICAgICAgICBoaWRlRmlsZSxcbiAgICAgICAgZ2V0RmlsZUluZm8sXG4gICAgICAgIGxpc3RGaWxlTmFtZXMsXG4gICAgICAgIGNvcHlGaWxlLFxuICAgICAgICBzdGFydExhcmdlRmlsZSxcbiAgICAgICAgdXBsb2FkUGFydCxcbiAgICAgICAgZmluaXNoTGFyZ2VGaWxlLFxuICAgICAgICBjYW5jZWxMYXJnZUZpbGUsXG4gICAgICAgIGdldERvd25sb2FkQXV0aG9yaXphdGlvbixcbiAgICAgICAgZ2V0RG93bmxvYWRVUkwsXG4gICAgICAgIGFwaVVybDogYXV0aC5hcGlVcmwsXG4gICAgICAgIGFsbG93ZWQ6IGF1dGguYWxsb3dlZCxcbiAgICB9O1xufSk7XG5cbnR5cGUgQjJBcGkgPSAodHlwZW9mIGdldEFQSSkgZXh0ZW5kcyAoKSA9PiBQcm9taXNlPGluZmVyIFQ+ID8gVCA6IG5ldmVyO1xuXG5cbmV4cG9ydCBjbGFzcyBBcmNoaXZlc0JhY2tibGF6ZSBpbXBsZW1lbnRzIElBcmNoaXZlcyB7XG4gICAgcHVibGljIGNvbnN0cnVjdG9yKHByaXZhdGUgY29uZmlnOiB7XG4gICAgICAgIGJ1Y2tldE5hbWU6IHN0cmluZztcbiAgICAgICAgcHVibGljPzogYm9vbGVhbjtcbiAgICAgICAgaW1tdXRhYmxlPzogYm9vbGVhbjtcbiAgICAgICAgY2FjaGVUaW1lPzogbnVtYmVyO1xuICAgICAgICBhbGxvd2VkT3JpZ2lucz86IHN0cmluZ1tdO1xuICAgIH0pIHtcbiAgICAgICAgLy8gR2V0IHRoZSBhcGksIHRvIHNldHVwIGNvcnNcbiAgICAgICAgdm9pZCB0aGlzLmdldEJ1Y2tldEFQSSgpO1xuICAgIH1cblxuICAgIHByaXZhdGUgYnVja2V0TmFtZSA9IHRoaXMuY29uZmlnLmJ1Y2tldE5hbWUucmVwbGFjZUFsbCgvW15cXHdcXGRdL2csIFwiLVwiKTtcbiAgICBwcml2YXRlIGJ1Y2tldElkID0gXCJcIjtcblxuICAgIHByaXZhdGUgbG9nZ2luZyA9IGZhbHNlO1xuICAgIHB1YmxpYyBlbmFibGVMb2dnaW5nKCkge1xuICAgICAgICB0aGlzLmxvZ2dpbmcgPSB0cnVlO1xuICAgIH1cbiAgICBwcml2YXRlIGxvZyh0ZXh0OiBzdHJpbmcpIHtcbiAgICAgICAgaWYgKCF0aGlzLmxvZ2dpbmcpIHJldHVybjtcbiAgICAgICAgY29uc29sZS5sb2codGV4dCk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldERlYnVnTmFtZSgpIHtcbiAgICAgICAgcmV0dXJuIFwiYmFja2JsYXplIFwiICsgdGhpcy5jb25maWcuYnVja2V0TmFtZTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldEJ1Y2tldEFQSSA9IGxhenkoYXN5bmMgKCkgPT4ge1xuICAgICAgICBsZXQgYXBpID0gYXdhaXQgZ2V0QVBJKCk7XG5cbiAgICAgICAgbGV0IGNhY2hlVGltZSA9IE1hdGgubWF4KHRoaXMuY29uZmlnLmNhY2hlVGltZSA/PyAwLCBNSU5fQlVDS0VUX0NBQ0hFX1RJTUUpO1xuICAgICAgICBpZiAodGhpcy5jb25maWcuaW1tdXRhYmxlKSB7XG4gICAgICAgICAgICBjYWNoZVRpbWUgPSBJTU1VVEFCTEVfQ0FDSEVfVElNRTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEFMV0FZUyBzZXQgYWNjZXNzIGNvbnRyb2wsIGFzIHdlIGNhbiBtYWtlIHVybHMgZm9yIHByaXZhdGUgYnVja2V0cyB3aXRoIGdldERvd25sb2FkQXV0aG9yaXphdGlvblxuICAgICAgICBsZXQgZGVzaXJlZENvcnNSdWxlcyA9IFt7XG4gICAgICAgICAgICBjb3JzUnVsZU5hbWU6IFwiYWxsb3dBbGxcIixcbiAgICAgICAgICAgIGFsbG93ZWRPcmlnaW5zOiB0aGlzLmNvbmZpZy5hbGxvd2VkT3JpZ2lucyA/PyBbXCJodHRwc1wiXSxcbiAgICAgICAgICAgIGFsbG93ZWRPcGVyYXRpb25zOiBbXCJiMl9kb3dubG9hZF9maWxlX2J5X2lkXCIsIFwiYjJfZG93bmxvYWRfZmlsZV9ieV9uYW1lXCJdLFxuICAgICAgICAgICAgYWxsb3dlZEhlYWRlcnM6IFtcInJhbmdlXCJdLFxuICAgICAgICAgICAgZXhwb3NlSGVhZGVyczogW1wieC1iei1jb250ZW50LXNoYTFcIl0sXG4gICAgICAgICAgICBtYXhBZ2VTZWNvbmRzOiBjYWNoZVRpbWUgLyAxMDAwLFxuICAgICAgICB9XTtcbiAgICAgICAgbGV0IGJ1Y2tldEluZm86IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge307XG4gICAgICAgIGlmIChjYWNoZVRpbWUpIHtcbiAgICAgICAgICAgIGJ1Y2tldEluZm9bXCJjYWNoZS1jb250cm9sXCJdID0gYG1heC1hZ2U9JHtjYWNoZVRpbWUgLyAxMDAwfWA7XG4gICAgICAgIH1cblxuXG4gICAgICAgIGxldCBleGlzdHMgPSBmYWxzZTtcbiAgICAgICAgbGV0IHJldHJpZXMgPSAwO1xuICAgICAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBhd2FpdCBhcGkuY3JlYXRlQnVja2V0KHtcbiAgICAgICAgICAgICAgICAgICAgYnVja2V0TmFtZTogdGhpcy5idWNrZXROYW1lLFxuICAgICAgICAgICAgICAgICAgICBidWNrZXRUeXBlOiB0aGlzLmNvbmZpZy5wdWJsaWMgPyBcImFsbFB1YmxpY1wiIDogXCJhbGxQcml2YXRlXCIsXG4gICAgICAgICAgICAgICAgICAgIGxpZmVjeWNsZVJ1bGVzOiBbe1xuICAgICAgICAgICAgICAgICAgICAgICAgXCJkYXlzRnJvbVVwbG9hZGluZ1RvSGlkaW5nXCI6IG51bGwsXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBLZWVwIGZpbGVzIGZvciA3IGRheXMsIHdoaWNoIHNob3VsZCBiZSBlbm91Z2ggdGltZSB0byByZWNvdmVyIGFjY2lkZW50YWwgaGlkaW5nLlxuICAgICAgICAgICAgICAgICAgICAgICAgXCJkYXlzRnJvbUhpZGluZ1RvRGVsZXRpbmdcIjogNyxcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiZmlsZU5hbWVQcmVmaXhcIjogXCJcIlxuICAgICAgICAgICAgICAgICAgICB9XSxcbiAgICAgICAgICAgICAgICAgICAgY29yc1J1bGVzOiBkZXNpcmVkQ29yc1J1bGVzLFxuICAgICAgICAgICAgICAgICAgICBidWNrZXRJbmZvXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgICAgICAgICAgICBpZiAoIWUuc3RhY2suaW5jbHVkZXMoYFwiZHVwbGljYXRlX2J1Y2tldF9uYW1lXCJgKSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAocmV0cmllcyA8IDMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYEJhY2tibGF6ZSBjcmVhdGUgYnVja2V0IGZhaWxlZCwgcmV0cnlpbmcgaW4gNXM6ICR7ZS5zdGFja31gKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IGRlbGF5KDUwMDApO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0cmllcysrO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZXhpc3RzID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGJ1Y2tldExpc3QgPSBhd2FpdCBhcGkubGlzdEJ1Y2tldHMoe1xuICAgICAgICAgICAgYnVja2V0TmFtZTogdGhpcy5idWNrZXROYW1lLFxuICAgICAgICB9KTtcbiAgICAgICAgaWYgKGJ1Y2tldExpc3QuYnVja2V0cy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgQnVja2V0IG5hbWUgXCIke3RoaXMuYnVja2V0TmFtZX1cIiBpcyBiZWluZyB1c2VkIGJ5IHNvbWVvbmUgZWxzZS4gQnVja2V0IG5hbWVzIGhhdmUgdG8gYmUgZ2xvYmFsbHkgdW5pcXVlLiBUcnkgYSBkaWZmZXJlbnQgbmFtZSB1bnRpbCB5b3UgZmluZCBhIGZyZWUgb25lLmApO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuYnVja2V0SWQgPSBidWNrZXRMaXN0LmJ1Y2tldHNbMF0uYnVja2V0SWQ7XG5cbiAgICAgICAgaWYgKGV4aXN0cykge1xuICAgICAgICAgICAgbGV0IGJ1Y2tldCA9IGJ1Y2tldExpc3QuYnVja2V0c1swXTtcbiAgICAgICAgICAgIGZ1bmN0aW9uIG5vcm1hbGl6ZShvYmo6IFJlY29yZDxzdHJpbmcsIHVua25vd24+KSB7XG4gICAgICAgICAgICAgICAgbGV0IGt2cHMgPSBPYmplY3QuZW50cmllcyhvYmopO1xuICAgICAgICAgICAgICAgIHNvcnQoa3ZwcywgeCA9PiB4WzBdKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gT2JqZWN0LmZyb21FbnRyaWVzKGt2cHMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZnVuY3Rpb24gb3JkZXJJbmRlcGVuZGVudEVxdWFsKGxoczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sIHJoczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkobm9ybWFsaXplKGxocykpID09PSBKU09OLnN0cmluZ2lmeShub3JtYWxpemUocmhzKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmdW5jdGlvbiBvcmRlckluZGVwZW5kZW50RXF1YWxBcnJheShsaHM6IHVua25vd25bXSwgcmhzOiB1bmtub3duW10pIHtcbiAgICAgICAgICAgICAgICBpZiAobGhzLmxlbmd0aCAhPT0gcmhzLmxlbmd0aCkgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGhzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghb3JkZXJJbmRlcGVuZGVudEVxdWFsKGxoc1tpXSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiwgcmhzW2ldIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxldCBjb3JzQ2hhbmdlZCA9ICFvcmRlckluZGVwZW5kZW50RXF1YWxBcnJheShidWNrZXQuY29yc1J1bGVzLCBkZXNpcmVkQ29yc1J1bGVzKTtcbiAgICAgICAgICAgIGxldCBpbmZvQ2hhbmdlZCA9ICFvcmRlckluZGVwZW5kZW50RXF1YWwoYnVja2V0LmJ1Y2tldEluZm8sIGJ1Y2tldEluZm8pO1xuICAgICAgICAgICAgaWYgKGNvcnNDaGFuZ2VkIHx8IGluZm9DaGFuZ2VkKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2cobWFnZW50YShgVXBkYXRpbmcgYnVja2V0IHNldHRpbmdzIGZvciAke3RoaXMuYnVja2V0TmFtZX0gKGNvcnNSdWxlcyAke2NvcnNDaGFuZ2VkICYmIFwiY2hhbmdlZFwiIHx8IFwidW5jaGFuZ2VkXCJ9LCBidWNrZXRJbmZvICR7aW5mb0NoYW5nZWQgJiYgXCJjaGFuZ2VkXCIgfHwgXCJ1bmNoYW5nZWRcIn0pOiBjb3JzUnVsZXMgJHtKU09OLnN0cmluZ2lmeShidWNrZXQuY29yc1J1bGVzKX0gLT4gJHtKU09OLnN0cmluZ2lmeShkZXNpcmVkQ29yc1J1bGVzKX0sIGJ1Y2tldEluZm8gJHtKU09OLnN0cmluZ2lmeShidWNrZXQuYnVja2V0SW5mbyl9IC0+ICR7SlNPTi5zdHJpbmdpZnkoYnVja2V0SW5mbyl9YCkpO1xuICAgICAgICAgICAgICAgIGF3YWl0IGFwaS51cGRhdGVCdWNrZXQoe1xuICAgICAgICAgICAgICAgICAgICBhY2NvdW50SWQ6IGJ1Y2tldC5hY2NvdW50SWQsXG4gICAgICAgICAgICAgICAgICAgIGJ1Y2tldElkOiBidWNrZXQuYnVja2V0SWQsXG4gICAgICAgICAgICAgICAgICAgIGJ1Y2tldFR5cGU6IGJ1Y2tldC5idWNrZXRUeXBlLFxuICAgICAgICAgICAgICAgICAgICBsaWZlY3ljbGVSdWxlczogYnVja2V0LmxpZmVjeWNsZVJ1bGVzLFxuICAgICAgICAgICAgICAgICAgICBjb3JzUnVsZXM6IGRlc2lyZWRDb3JzUnVsZXMsXG4gICAgICAgICAgICAgICAgICAgIGJ1Y2tldEluZm86IGJ1Y2tldEluZm8sXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGFwaTtcbiAgICB9KTtcblxuICAgIHByaXZhdGUgY3VycmVudFJlc2V0OiBQcm9taXNlPHZvaWQ+IHwgdW5kZWZpbmVkO1xuXG4gICAgLy8gS2VlcCB0cmFjayBvZiB3aGVuIHdlIGxhc3QgcmVzZXQgYmVjYXVzZSBvZiBhIDUwM1xuICAgIHByaXZhdGUgbGFzdDUwM1Jlc2V0ID0gMDtcbiAgICAvLyBJTVBPUlRBTlQhIFdlIG11c3QgYWx3YXlzIENBVENIIEFST1VORCB0aGUgYXBpUmV0cnlMb2dpYywgTkVWRVIgaW5zaWRlIG9mIGZuYy4gT3RoZXJ3aXNlIHdlIHdvbid0IGJlIGFibGUgdG8gcmVjcmVhdGUgdGhlIGF1dGggdG9rZW4uIGBjb250ZXh0YCBpcyBhIHNob3J0IGxhYmVsICh2ZXJiICsgZmlsZSBwYXRoKSBpbmNsdWRlZCBpbiBldmVyeSByZXRyeS9lcnJvciBsb2cgc28gYSBzdHVjayBzaWxlbnQtcmV0cnkgbG9vcCBpcyBpZGVudGlmaWFibGUgZnJvbSB0aGUgbG9ncy5cbiAgICBwcml2YXRlIGFzeW5jIGFwaVJldHJ5TG9naWM8VD4oXG4gICAgICAgIGNvbnRleHQ6IHN0cmluZyxcbiAgICAgICAgZm5jOiAoYXBpOiBCMkFwaSkgPT4gUHJvbWlzZTxUPixcbiAgICAgICAgcmV0cmllcyA9IDNcbiAgICApOiBQcm9taXNlPFQ+IHtcbiAgICAgICAgbGV0IGFwaTogQjJBcGkgfCB1bmRlZmluZWQ7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBhcGkgPSBhd2FpdCB0aGlzLmdldEJ1Y2tldEFQSSgpO1xuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IGZuYyhhcGkpO1xuICAgICAgICB9IGNhdGNoIChlcnI6IGFueSkge1xuICAgICAgICAgICAgaWYgKHJldHJpZXMgPD0gMCkgdGhyb3cgZXJyO1xuXG4gICAgICAgICAgICAvLyBJZiBpdCdzIGEgNTAzIGFuZCBpdCdzIGJlZW4gYSBtaW51dGUgc2luY2Ugd2UgbGFzdCByZXNldCwgdGhlbiBXYWl0IGFuZCByZXNldC5cbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAoZXJyLnN0YWNrLmluY2x1ZGVzKGBcInN0YXR1c1wiOiA1MDNgKVxuICAgICAgICAgICAgICAgICAgICB8fCBlcnIuc3RhY2suaW5jbHVkZXMoYFwic2VydmljZV91bmF2YWlsYWJsZVwiYClcbiAgICAgICAgICAgICAgICAgICAgfHwgZXJyLnN0YWNrLmluY2x1ZGVzKGBcImludGVybmFsX2Vycm9yXCJgKVxuICAgICAgICAgICAgICAgICAgICB8fCBlcnIuc3RhY2suaW5jbHVkZXMoYEVOT0JVRlNgKVxuICAgICAgICAgICAgICAgICkgJiYgRGF0ZS5ub3coKSAtIHRoaXMubGFzdDUwM1Jlc2V0ID4gNjAgKiAxMDAwKSB7XG4gICAgICAgICAgICAgICAgLy8gQmFja2JsYXplIGlzIHNvIGZsYWt5IHRoYXQgd2UncmUganVzdCBnb2luZyB0byB3YXJuIGhlcmUuXG4gICAgICAgICAgICAgICAgY29uc29sZS53YXJuKGBbJHtjb250ZXh0fV0gQmFja2JsYXplIGVycm9yLCB3YWl0aW5nIGFuZCByZXNldHRpbmc6ICR7ZXJyLm1lc3NhZ2V9YCk7XG4gICAgICAgICAgICAgICAgdGhpcy5sb2coYFske2NvbnRleHR9XSBCYWNrYmxhemUgZXJyb3IsIHdhaXRpbmcgYW5kIHJlc2V0dGluZzogJHtlcnIubWVzc2FnZX1gKTtcbiAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnRSZXNldCA9IHRoaXMuY3VycmVudFJlc2V0IHx8IChhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IGRlbGF5KDEwICogMTAwMCk7XG4gICAgICAgICAgICAgICAgICAgIC8vIFdlIGNoZWNrIGFnYWluIGluIGNhc2UsIGFuZCBpbiB0aGUgdmVyeSBsaWtlbHkgY2FzZSB0aGF0IHRoaXMgaXMgYmVpbmcgcnVuIGluIHBhcmFsbGVsLCB3ZSBvbmx5IHdhbnQgdG8gcmVzZXQgb25jZS5cbiAgICAgICAgICAgICAgICAgICAgaWYgKERhdGUubm93KCkgLSB0aGlzLmxhc3Q1MDNSZXNldCA+IDYwICogMTAwMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2coYFske2NvbnRleHR9XSBSZXNldHRpbmcgZ2V0QVBJIGFuZCBnZXRCdWNrZXRBUEk6ICR7ZXJyLm1lc3NhZ2V9YCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxhc3Q1MDNSZXNldCA9IERhdGUubm93KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBnZXRBUEkucmVzZXQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZ2V0QnVja2V0QVBJLnJlc2V0KCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KSgpLmZpbmFsbHkoKCkgPT4gdGhpcy5jdXJyZW50UmVzZXQgPSB1bmRlZmluZWQpO1xuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuY3VycmVudFJlc2V0O1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmFwaVJldHJ5TG9naWMoY29udGV4dCwgZm5jLCByZXRyaWVzIC0gMSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIElmIHRoZSBlcnJvciBpcyB0aGF0IHRoZSBhdXRob3JpemF0aW9uIHRva2VuIGlzIGludmFsaWQsIHJlc2V0IGdldEJ1Y2tldEFQSSBhbmQgZ2V0QVBJIElmIHRoZSBlcnJvciBpcyB0aGF0IHRoZSBidWNrZXQgaXNuJ3QgZm91bmQsIHJlc2V0IGdldEJ1Y2tldEFQSVxuICAgICAgICAgICAgaWYgKGVyci5zdGFjay5pbmNsdWRlcyhgXCJleHBpcmVkX2F1dGhfdG9rZW5cImApKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5sb2coYFske2NvbnRleHR9XSBBdXRob3JpemF0aW9uIHRva2VuIGV4cGlyZWRgKTtcbiAgICAgICAgICAgICAgICBnZXRBUEkucmVzZXQoKTtcbiAgICAgICAgICAgICAgICB0aGlzLmdldEJ1Y2tldEFQSS5yZXNldCgpO1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmFwaVJldHJ5TG9naWMoY29udGV4dCwgZm5jLCByZXRyaWVzIC0gMSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICBlcnIuc3RhY2suaW5jbHVkZXMoYG5vIHRvbWVzIGF2YWlsYWJsZWApXG4gICAgICAgICAgICAgICAgfHwgZXJyLnN0YWNrLmluY2x1ZGVzKGBFVElNRURPVVRgKVxuICAgICAgICAgICAgICAgIHx8IGVyci5zdGFjay5pbmNsdWRlcyhgc29ja2V0IGhhbmcgdXBgKVxuICAgICAgICAgICAgICAgIC8vIEVoLi4uIHRoaXMgbWlnaHQgYmUgYmFkLCBidXQuLi4gSSB0aGluayB3ZSBqdXN0IGdldCByYW5kb20gNDAwIGVycm9ycy4gSWYgdGhpcyBzcGFtcyBlcnJvcnMsIHdlIGNhbiByZW1vdmUgdGhpcyBsaW5lLlxuICAgICAgICAgICAgICAgIHx8IGVyci5zdGFjay5pbmNsdWRlcyhgNDAwIEJhZCBSZXF1ZXN0YClcbiAgICAgICAgICAgICAgICB8fCBlcnIuc3RhY2suaW5jbHVkZXMoYGdldGFkZHJpbmZvIEVOT1RGT1VORGApXG4gICAgICAgICAgICAgICAgfHwgZXJyLnN0YWNrLmluY2x1ZGVzKGBFQ09OTlJFU0VUYClcbiAgICAgICAgICAgICAgICB8fCBlcnIuc3RhY2suaW5jbHVkZXMoYEVDT05OUkVGVVNFRGApXG4gICAgICAgICAgICAgICAgfHwgZXJyLnN0YWNrLmluY2x1ZGVzKGBFTk9CVUZTYClcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybihgWyR7Y29udGV4dH1dIFJldHJ5aW5nIGluIDVzOiAke2Vyci5tZXNzYWdlfWApO1xuICAgICAgICAgICAgICAgIHRoaXMubG9nKGBbJHtjb250ZXh0fV0gJHtlcnIubWVzc2FnZX0gcmV0cnlpbmcgaW4gNXNgKTtcbiAgICAgICAgICAgICAgICBhd2FpdCBkZWxheSg1MDAwKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5hcGlSZXRyeUxvZ2ljKGNvbnRleHQsIGZuYywgcmV0cmllcyAtIDEpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoZXJyLnN0YWNrLmluY2x1ZGVzKGBnZXRhZGRyaW5mbyBFTk9URk9VTkRgKSkge1xuICAgICAgICAgICAgICAgIGlmIChhcGkpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHVybE9iaiA9IG5ldyBVUkwoYXBpLmFwaVVybCk7XG4gICAgICAgICAgICAgICAgICAgIGxldCBob3N0bmFtZSA9IHVybE9iai5ob3N0bmFtZTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGxvb2t1cEFkZHJlc3NlcyA9IGF3YWl0IG5ldyBQcm9taXNlKHJlc29sdmUgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgZG5zLmxvb2t1cChob3N0bmFtZSwgKGVyciwgYWRkcmVzc2VzKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShhZGRyZXNzZXMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBsZXQgcmVzb2x2ZUFkZHJlc3NlcyA9IGF3YWl0IG5ldyBQcm9taXNlKHJlc29sdmUgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgZG5zLnJlc29sdmU0KGhvc3RuYW1lLCAoZXJyLCBhZGRyZXNzZXMpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKGFkZHJlc3Nlcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYFske2NvbnRleHR9XSBnZXRhZGRyaW5mbyBFTk9URk9VTkQgJHtob3N0bmFtZX1gLCB7IGxvb2t1cEFkZHJlc3NlcywgcmVzb2x2ZUFkZHJlc3NlcywgYXBpVXJsOiBhcGkuYXBpVXJsLCBmdWxsRXJyb3I6IGVyci5zdGFjayB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRocm93IGVycjtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBnZXQoZmlsZU5hbWU6IHN0cmluZywgY29uZmlnPzogR2V0Q29uZmlnKTogUHJvbWlzZTxCdWZmZXIgfCB1bmRlZmluZWQ+IHtcbiAgICAgICAgbGV0IHJlc3VsdCA9IGF3YWl0IHRoaXMuZ2V0MihmaWxlTmFtZSwgY29uZmlnKTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdCAmJiByZXN1bHQuZGF0YSB8fCB1bmRlZmluZWQ7XG4gICAgfVxuICAgIHB1YmxpYyBhc3luYyBnZXQyKGZpbGVOYW1lOiBzdHJpbmcsIGNvbmZpZz86IEdldENvbmZpZyk6IFByb21pc2U8eyBkYXRhOiBCdWZmZXI7IHdyaXRlVGltZTogbnVtYmVyOyBzaXplOiBudW1iZXIgfSB8IHVuZGVmaW5lZD4ge1xuICAgICAgICBsZXQgZG93bmxvYWRpbmcgPSB0cnVlO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgbGV0IHRpbWUgPSBEYXRlLm5vdygpO1xuICAgICAgICAgICAgY29uc3QgZG93bmxvYWRQb2xsID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmICghZG93bmxvYWRpbmcpIHJldHVybjtcbiAgICAgICAgICAgICAgICB0aGlzLmxvZyhgQmFja2JsYXplIGRvd25sb2FkIGluIHByb2dyZXNzICR7ZmlsZU5hbWV9YCk7XG4gICAgICAgICAgICAgICAgc2V0VGltZW91dChkb3dubG9hZFBvbGwsIDUwMDApO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHNldFRpbWVvdXQoZG93bmxvYWRQb2xsLCA1MDAwKTtcbiAgICAgICAgICAgIGxldCByZXN1bHQgPSBhd2FpdCB0aGlzLmFwaVJldHJ5TG9naWMoYGdldCAke2ZpbGVOYW1lfWAsIGFzeW5jIChhcGkpOiBQcm9taXNlPHsgZGF0YTogQnVmZmVyOyB3cml0ZVRpbWU6IG51bWJlcjsgc2l6ZTogbnVtYmVyIH0gfCB1bmRlZmluZWQ+ID0+IHtcbiAgICAgICAgICAgICAgICBsZXQgcmFuZ2UgPSBjb25maWc/LnJhbmdlO1xuICAgICAgICAgICAgICAgIGlmIChyYW5nZSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBUaGUgY2xhbXAgbmVlZHMgdGhlIGZpbGUncyBzaXplIChhbmQgZ2l2ZXMgdXMgaXRzIG1ldGFkYXRhIGZvciBmcmVlKS4gVGhlIHRvbWJzdG9uZSBmbGFnIGZvcndhcmRzOiB3aXRob3V0IGl0IGEgZGVsZXRlZCBmaWxlJ3MgaW5mbyBpcyBoaWRkZW4sIHNvIHRoZSByYW5nZWQgcmVhZCByZXBvcnRzIGFic2VudCB0b28uXG4gICAgICAgICAgICAgICAgICAgIGxldCBmaWxlSW5mbyA9IGF3YWl0IHRoaXMuZ2V0SW5mbyhmaWxlTmFtZSwgeyBpbmNsdWRlVG9tYnN0b25lczogY29uZmlnPy5pbmNsdWRlVG9tYnN0b25lcyB9KTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFmaWxlSW5mbykgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHJhbmdlU3RhcnQgPSByYW5nZS5zdGFydDtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHJhbmdlRW5kID0gTWF0aC5taW4ocmFuZ2UuZW5kLCBmaWxlSW5mby5zaXplKTtcbiAgICAgICAgICAgICAgICAgICAgLy8gTk9URTogSSB0aGluayBpZiB3ZSByZXF1ZXN0IG5vdGhpbmcsIGl0IGNvbmZ1c2VzIEJhY2tibGF6ZSBhbmQgZW5kcyB1cCBnaXZpbmcgdXMgdGhlIGVudGlyZSBmaWxlLlxuICAgICAgICAgICAgICAgICAgICBpZiAocmFuZ2VFbmQgPD0gcmFuZ2VTdGFydCkgcmV0dXJuIHsgZGF0YTogQnVmZmVyLmFsbG9jKDApLCB3cml0ZVRpbWU6IGZpbGVJbmZvLndyaXRlVGltZSwgc2l6ZTogZmlsZUluZm8uc2l6ZSB9O1xuICAgICAgICAgICAgICAgICAgICBsZXQgZGF0YSA9IGF3YWl0IGFwaS5kb3dubG9hZEZpbGVCeU5hbWUoe1xuICAgICAgICAgICAgICAgICAgICAgICAgYnVja2V0TmFtZTogdGhpcy5idWNrZXROYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgZmlsZU5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICByYW5nZTogeyBzdGFydDogcmFuZ2VTdGFydCwgZW5kOiByYW5nZUVuZCB9LFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGRhdGEubGVuZ3RoICE9PSByYW5nZUVuZCAtIHJhbmdlU3RhcnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYEJhY2tibGF6ZSByYW5nZSBkb3dubG9hZCByZXR1cm5lZCB0aGUgd3JvbmcgbnVtYmVyIG9mIGJ5dGVzLiBUcmllZCB0byBnZXQgJHtyYW5nZVN0YXJ0fS0ke3JhbmdlRW5kfSwgYnV0IHJlY2VpdmVkICR7cmFuZ2VTdGFydH0tJHtyYW5nZVN0YXJ0ICsgZGF0YS5sZW5ndGh9LiBGb3IgZmlsZTogJHtmaWxlTmFtZX1gKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4geyBkYXRhLCB3cml0ZVRpbWU6IGZpbGVJbmZvLndyaXRlVGltZSwgc2l6ZTogZmlsZUluZm8uc2l6ZSB9O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBUaGUgZG93bmxvYWQncyBvd24gcmVzcG9uc2UgaGVhZGVycyBjYXJyeSB0aGUgbWV0YWRhdGEsIHNvIGEgZnVsbCByZWFkIGlzIGEgc2luZ2xlIEFQSSBjYWxsXG4gICAgICAgICAgICAgICAgbGV0IHJlc3BvbnNlOiBIdHRwc1Jlc3BvbnNlSW5mbyA9IHsgaGVhZGVyczoge30gfTtcbiAgICAgICAgICAgICAgICBsZXQgZGF0YSA9IGF3YWl0IGFwaS5kb3dubG9hZEZpbGVCeU5hbWUoe1xuICAgICAgICAgICAgICAgICAgICBidWNrZXROYW1lOiB0aGlzLmJ1Y2tldE5hbWUsXG4gICAgICAgICAgICAgICAgICAgIGZpbGVOYW1lLFxuICAgICAgICAgICAgICAgICAgICBvdXRSZXNwb25zZTogcmVzcG9uc2UsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgLy8gQmFja2JsYXplIHN0b3JlcyB0aGlzIHN5c3RlbSdzIGRlbGV0aW9ucyBhcyBSRUFMIGVtcHR5IGZpbGVzIChpdHMgaGlkZSB3b3VsZCBtYWtlIHRoZW0gaW52aXNpYmxlIHRvIHNjYW5zKSwgc28gYW4gZW1wdHkgZG93bmxvYWQgSVMgYSB0b21ic3RvbmUgLSBhYnNlbnQsIHVubGVzcyB0aGUgY2FsbGVyIGFza2VkIHRvIHNlZSB0b21ic3RvbmVzXG4gICAgICAgICAgICAgICAgaWYgKCFkYXRhLmxlbmd0aCAmJiAhY29uZmlnPy5pbmNsdWRlVG9tYnN0b25lcykge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmxvZyhgYmFja2JsYXplIGZpbGUgaXMgYSB0b21ic3RvbmUgKGRlbGV0ZWQpICR7ZmlsZU5hbWV9YCk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGxldCBtZXRhID0gcGFyc2VGaWxlTWV0YWRhdGFIZWFkZXJzKHJlc3BvbnNlKTtcbiAgICAgICAgICAgICAgICByZXR1cm4geyBkYXRhLCB3cml0ZVRpbWU6IG1ldGEudXBsb2FkVGltZXN0YW1wLCBzaXplOiBkYXRhLmxlbmd0aCB9O1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBpZiAoIXJlc3VsdCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgICAgIGxldCB0aW1lU3RyID0gZm9ybWF0VGltZShEYXRlLm5vdygpIC0gdGltZSk7XG4gICAgICAgICAgICBsZXQgcmF0ZVN0ciA9IGZvcm1hdE51bWJlcihyZXN1bHQuZGF0YS5sZW5ndGggLyAoRGF0ZS5ub3coKSAtIHRpbWUpICogMTAwMCkgKyBcIkIvc1wiO1xuICAgICAgICAgICAgdGhpcy5sb2coYGJhY2tibGF6ZSBkb3dubG9hZCAoJHtmb3JtYXROdW1iZXIocmVzdWx0LmRhdGEubGVuZ3RoKX1CJHtjb25maWc/LnJhbmdlICYmIGAsICR7Zm9ybWF0TnVtYmVyKGNvbmZpZy5yYW5nZS5zdGFydCl9IC0gJHtmb3JtYXROdW1iZXIoY29uZmlnLnJhbmdlLmVuZCl9YCB8fCBcIlwifSkgaW4gJHt0aW1lU3RyfSAoJHtyYXRlU3RyfSwgJHtmaWxlTmFtZX0pYCk7XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAvLyBPbmx5IGdlbnVpbmUgYWJzZW5jZSBtYXkgYmVjb21lIHVuZGVmaW5lZDogY2FsbGVycyB0cmVhdCB1bmRlZmluZWQgYXMgYXV0aG9yaXRhdGl2ZSBcInRoZSBidWNrZXQgZG9lcyBub3QgaG9sZCB0aGlzIGZpbGVcIiAoQmxvYlN0b3JlIGV2ZW4gZGVsZXRlcyBpbmRleCBlbnRyaWVzIG92ZXIgaXQpLCBzbyBhIHRyYW5zaWVudCBmYWlsdXJlICg1MDMsIGF1dGgsIHRpbWVvdXQpIG11c3QgdGhyb3cgaW5zdGVhZCBvZiBtYXNxdWVyYWRpbmcgYXMgYSBtaXNzaW5nIGZpbGVcbiAgICAgICAgICAgIGxldCBtZXNzYWdlID0gU3RyaW5nKChlIGFzIEVycm9yKS5zdGFjayA/PyBlKTtcbiAgICAgICAgICAgIGlmIChtZXNzYWdlLmluY2x1ZGVzKGBcIm5vdF9mb3VuZFwiYCkgfHwgbWVzc2FnZS5pbmNsdWRlcyhgZmlsZV9ub3RfZm91bmRgKSB8fCBtZXNzYWdlLmluY2x1ZGVzKGBub3QgZm91bmRgKSkge1xuICAgICAgICAgICAgICAgIHRoaXMubG9nKGBiYWNrYmxhemUgZmlsZSBkb2VzIG5vdCBleGlzdCAke2ZpbGVOYW1lfWApO1xuICAgICAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgZG93bmxvYWRpbmcgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBwdWJsaWMgYXN5bmMgZ2V0Q29uZmlnKCk6IFByb21pc2U8QXJjaGl2ZXNDb25maWc+IHtcbiAgICAgICAgcmV0dXJuIHt9O1xuICAgIH1cbiAgICBwdWJsaWMgYXN5bmMgaGFzV3JpdGVBY2Nlc3MoKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBsZXQgYXBpID0gYXdhaXQgZ2V0QVBJKCk7XG4gICAgICAgICAgICAvLyBCMiB2MiBkb2N1bWVudHMgYWxsb3dlZCBhcyBhIHNpbmdsZSBvYmplY3Q7IG91ciB0eXBlIHNheXMgYSBsaXN0IC0gaGFuZGxlIGJvdGhcbiAgICAgICAgICAgIGxldCBhbGxvd2VkUmF3ID0gYXBpLmFsbG93ZWQgYXMgdW5rbm93bjtcbiAgICAgICAgICAgIGxldCBhbGxvd2VkTGlzdCA9IChBcnJheS5pc0FycmF5KGFsbG93ZWRSYXcpICYmIGFsbG93ZWRSYXcgfHwgW2FsbG93ZWRSYXddKSBhcyB0eXBlb2YgYXBpLmFsbG93ZWQ7XG4gICAgICAgICAgICByZXR1cm4gYWxsb3dlZExpc3Quc29tZShhbGxvd2VkID0+XG4gICAgICAgICAgICAgICAgYWxsb3dlZC5jYXBhYmlsaXRpZXMuaW5jbHVkZXMoXCJ3cml0ZUZpbGVzXCIpXG4gICAgICAgICAgICAgICAgJiYgKCFhbGxvd2VkLmJ1Y2tldE5hbWUgfHwgYWxsb3dlZC5idWNrZXROYW1lID09PSB0aGlzLmJ1Y2tldE5hbWUpXG4gICAgICAgICAgICApO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAvLyBObyAvIGludmFsaWQgY3JlZGVudGlhbHNcbiAgICAgICAgICAgIHRoaXMubG9nKGBiYWNrYmxhemUgaGFzV3JpdGVBY2Nlc3MgY2hlY2sgZmFpbGVkOiAkeyhlIGFzIEVycm9yKS5zdGFjayA/PyBlfWApO1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxuICAgIHB1YmxpYyBhc3luYyBzZXQoZmlsZU5hbWU6IHN0cmluZywgZGF0YTogQnVmZmVyLCBjb25maWc/OiBTZXRDb25maWcpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgICAgICBpZiAoIWRhdGEubGVuZ3RoKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYHNldCB3YXMgY2FsbGVkIHdpdGggYW4gZW1wdHkgYnVmZmVyIGZvciAke0pTT04uc3RyaW5naWZ5KGZpbGVOYW1lKX0gb24gJHt0aGlzLmdldERlYnVnTmFtZSgpfTogYW4gZW1wdHkgZmlsZSBJUyBhIGRlbGV0aW9uIGluIHRoaXMgc3lzdGVtIGFuZCB3b3VsZCByZWFkIGJhY2sgYXMgbWlzc2luZyAtIGNhbGwgZGVsIGluc3RlYWRgKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY29uZmlnPy5mb3JjZVNldEltbXV0YWJsZSAmJiAhY29uZmlnLmxhc3RNb2RpZmllZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBmb3JjZVNldEltbXV0YWJsZSByZXF1aXJlcyBsYXN0TW9kaWZpZWQgKHN5bmNocm9uaXphdGlvbiB3cml0ZXMgYXJlIG9yZGVyZWQgYnkgdGhlaXIgd3JpdGUgdGltZSksIHdyaXRpbmcgJHtmaWxlTmFtZX0gdG8gJHt0aGlzLmdldERlYnVnTmFtZSgpfWApO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjb25maWc/Lmxhc3RNb2RpZmllZCkge1xuICAgICAgICAgICAgYXNzZXJ0VmFsaWRMYXN0TW9kaWZpZWQoY29uZmlnLmxhc3RNb2RpZmllZCk7XG4gICAgICAgICAgICAvLyBUaGlzIGNvbXBhcmlzb24gZGVsaWJlcmF0ZWx5IElHTk9SRVMgbm9DaGVja3M6IGJhY2tibGF6ZSBoYXMgbm8gc2VydmVyIG9mIG91cnMgdG8gZW5mb3JjZSBvbmx5LXRha2UtdGhlLWxhdGVzdCAodW5saWtlIGhvc3RlZCB0YXJnZXRzLCB3aGVyZSB0aGUgcmVjZWl2aW5nIHN0b3JlIHJlLWNoZWNrcyksIHNvIHRoaXMgY29tcGFyaXNvbiBJUyB0aGUgb3JkZXJpbmcgZ3VhcmQuIFNraXBwaW5nIGl0IGxldHMgYSBzdGFsZSBwdXNoIGxhbmQgb3ZlciBhIG5ld2VyIHZhbHVlIG9yIHRvbWJzdG9uZSAtIGFuZCBiZWNhdXNlIGIyIHN0YW1wcyBpdHMgb3duIHVwbG9hZCB0aW1lcywgdGhlIHN0YWxlIGRhdGEgdGhlbiBiZWNvbWVzIHRoZSBuZXdlc3QtdGltZXN0YW1wZWQgY29weSBpbiB0aGUgd2hvbGUgc3lzdGVtLCByZXN1cnJlY3RpbmcgZ2xvYmFsbHkgdGhyb3VnaCBldmVyeW9uZSdzIHNjYW5zLiBpbmNsdWRlVG9tYnN0b25lczogYSBkZWxldGlvbiBvbiBiMiBpcyBhIHJlYWwgc2l6ZS0wIGZpbGUgYW5kIG11c3Qgd2luIHRoaXMgY29tcGFyaXNvbiB0b28uXG4gICAgICAgICAgICBsZXQgZXhpc3RpbmcgPSBhd2FpdCB0aGlzLmdldEluZm8oZmlsZU5hbWUsIHsgaW5jbHVkZVRvbWJzdG9uZXM6IHRydWUgfSk7XG4gICAgICAgICAgICAvLyBBbiBvbGRlciB3cml0ZSBuZXZlciBvdmVyd3JpdGVzIGEgbmV3ZXIgb25lIChzZWUgSUFyY2hpdmVzLnNldCkuIEIyIHN0YW1wcyBpdHMgb3duIHVwbG9hZCB0aW1lLCBzbyB0aGUgZXhhY3QgbGFzdE1vZGlmaWVkIGlzIG5vdCBwcmVzZXJ2ZWQgb24gdGhlIHN0b3JlZCBmaWxlLlxuICAgICAgICAgICAgaWYgKGV4aXN0aW5nICYmIGNvbmZpZy5sYXN0TW9kaWZpZWQgPCBleGlzdGluZy53cml0ZVRpbWUpIHJldHVybiBmaWxlTmFtZTtcbiAgICAgICAgICAgIC8vIEltbXV0YWJpbGl0eSB3aW5zOiBhIHN5bmNocm9uaXphdGlvbiBwdXNoIG5ldmVyIG92ZXJ3cml0ZXMgYW4gZXhpc3RpbmcgcGF0aCBvbiBhbiBpbW11dGFibGUgYnVja2V0IChzZWUgU2V0Q29uZmlnLmZvcmNlU2V0SW1tdXRhYmxlKVxuICAgICAgICAgICAgaWYgKGV4aXN0aW5nICYmIGNvbmZpZy5mb3JjZVNldEltbXV0YWJsZSAmJiB0aGlzLmNvbmZpZy5pbW11dGFibGUpIHJldHVybiBmaWxlTmFtZTtcbiAgICAgICAgfVxuICAgICAgICAvLyBCaWcgYnVmZmVycyBzdHJlYW0gdGhyb3VnaCB0aGUgbGFyZ2UtZmlsZSBBUEk6IGEgZmFpbGVkIHBhcnQgcmV0cmllcyBhbG9uZSBpbnN0ZWFkIG9mIHJlc3RhcnRpbmcgdGhlIHdob2xlIHVwbG9hZC4gVGhlIHRocmVzaG9sZCBNVVNUIHN0YXkgYXQgdHdvIGZ1bGwgY2h1bmtzIC0gYmVsb3cgdGhhdCBzZXRMYXJnZUZpbGUgZmFsbHMgYmFjayB0byBwbGFpbiBzZXQsIHdoaWNoIHdvdWxkIHJlY3Vyc2UgcmlnaHQgYmFjayBoZXJlLlxuICAgICAgICBpZiAoZGF0YS5sZW5ndGggPj0gTEFSR0VfRklMRV9NSU5fQ0hVTktfU0laRSAqIDIpIHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuc2V0TGFyZ2VGaWxlKHsgcGF0aDogZmlsZU5hbWUsIGxhc3RNb2RpZmllZDogY29uZmlnPy5sYXN0TW9kaWZpZWQsIGdldE5leHREYXRhOiBidWZmZXJDaHVua1N0cmVhbShkYXRhKSB9KTtcbiAgICAgICAgICAgIHJldHVybiBmaWxlTmFtZTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmxvZyhgYmFja2JsYXplIHVwbG9hZCAoJHtmb3JtYXROdW1iZXIoZGF0YS5sZW5ndGgpfUIpICR7ZmlsZU5hbWV9YCk7XG4gICAgICAgIGxldCBmID0gZmlsZU5hbWU7XG4gICAgICAgIGF3YWl0IHRoaXMuYXBpUmV0cnlMb2dpYyhgdXBsb2FkRmlsZSAke2ZpbGVOYW1lfWAsIGFzeW5jIChhcGkpID0+IHtcbiAgICAgICAgICAgIGF3YWl0IGFwaS51cGxvYWRGaWxlKHsgYnVja2V0SWQ6IHRoaXMuYnVja2V0SWQsIGZpbGVOYW1lLCBkYXRhOiBkYXRhLCB9KTtcbiAgICAgICAgfSk7XG4gICAgICAgIGlmICghY29uZmlnPy5ub0NoZWNrcykge1xuICAgICAgICAgICAgbGV0IGV4aXN0c0NoZWNrcyA9IDMwO1xuICAgICAgICAgICAgd2hpbGUgKGV4aXN0c0NoZWNrcyA+IDApIHtcbiAgICAgICAgICAgICAgICBsZXQgZXhpc3RzID0gYXdhaXQgdGhpcy5nZXRJbmZvKGZpbGVOYW1lKTtcbiAgICAgICAgICAgICAgICBpZiAoZXhpc3RzKSBicmVhaztcbiAgICAgICAgICAgICAgICBhd2FpdCBkZWxheSgxMDAwKTtcbiAgICAgICAgICAgICAgICBleGlzdHNDaGVja3MtLTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChleGlzdHNDaGVja3MgPT09IDApIHtcbiAgICAgICAgICAgICAgICBsZXQgZXhpc3RzID0gYXdhaXQgdGhpcy5nZXRJbmZvKGZpbGVOYW1lKTtcbiAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oYEZpbGUgJHtmaWxlTmFtZX0vJHtmfSB3YXMgdXBsb2FkZWQsIGJ1dCBjb3VsZCBub3QgYmUgZm91bmQgYWZ0ZXJ3YXJkcy4gSG9wZWZ1bGx5IGl0IHdhcyBqdXN0IGRlbGV0ZWQsIHZlcnkgcXVpY2tseT8gSWYgYmFja2JsYXplIGlzIHRha2luZyB0b28gbG9uZyBmb3IgZmlsZXMgdG8gcHJvcGFnYXRlLCB0aGVuIHdlIG1pZ2h0IHJ1biBpbnRvIGlzc3VlcyB3aXRoIHRoZSBkYXRhYmFzZSBhdG9taWNpdHkuYCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZpbGVOYW1lO1xuICAgIH1cbiAgICBwdWJsaWMgYXN5bmMgZGVsKGZpbGVOYW1lOiBzdHJpbmcsIGNvbmZpZz86IERlbENvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBpZiAoY29uZmlnPy5sYXN0TW9kaWZpZWQpIHtcbiAgICAgICAgICAgIC8vIEEgc3luY2hyb25pemVkIGRlbGV0aW9uOiBiMidzIGhpZGUgcmVtb3ZlcyB0aGUgZmlsZSBmcm9tIGxpc3RpbmdzIGVudGlyZWx5LCBzbyBwZWVycyBzY2FubmluZyB0aGUgYnVja2V0IGNvdWxkIG5ldmVyIGxlYXJuIG9mIGl0LiBJbnN0ZWFkIHRoZSB0b21ic3RvbmUgaXMgc3RvcmVkIGFzIGEgUkVBTCBlbXB0eSBmaWxlIChhbiBlbXB0eSBmaWxlIElTIGEgbWlzc2luZyBmaWxlKSwgd2hpY2ggbGlzdGluZ3Mgc2hvdyBhbmQgc2NhbnMgaW5nZXN0IGFzIGEgZGVsZXRpb24uIChiMiBzdGFtcHMgaXRzIG93biB1cGxvYWQgdGltZSwgc28gdGhlIGV4YWN0IGRlbGV0aW9uIHRpbWUgaXMgbm90IHByZXNlcnZlZCBoZXJlIC0gc2FtZSBhcyBldmVyeSBiMiB3cml0ZS4pXG4gICAgICAgICAgICAvLyBUaGUgY29tcGFyaXNvbiBpZ25vcmVzIG5vQ2hlY2tzIGZvciB0aGUgc2FtZSByZWFzb24gYXMgaW4gc2V0OiBvbiBiMiBpdCBJUyB0aGUgb3JkZXJpbmcgZ3VhcmRcbiAgICAgICAgICAgIGxldCBleGlzdGluZyA9IGF3YWl0IHRoaXMuZ2V0SW5mbyhmaWxlTmFtZSwgeyBpbmNsdWRlVG9tYnN0b25lczogdHJ1ZSB9KTtcbiAgICAgICAgICAgIGlmIChleGlzdGluZyAmJiBjb25maWcubGFzdE1vZGlmaWVkIDwgZXhpc3Rpbmcud3JpdGVUaW1lKSByZXR1cm47XG4gICAgICAgICAgICB0aGlzLmxvZyhgYmFja2JsYXplIHRvbWJzdG9uZSB1cGxvYWQgJHtmaWxlTmFtZX1gKTtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuYXBpUmV0cnlMb2dpYyhgZGVsICR7ZmlsZU5hbWV9YCwgYXN5bmMgKGFwaSkgPT4ge1xuICAgICAgICAgICAgICAgIGF3YWl0IGFwaS51cGxvYWRGaWxlKHsgYnVja2V0SWQ6IHRoaXMuYnVja2V0SWQsIGZpbGVOYW1lLCBkYXRhOiBCdWZmZXIuYWxsb2MoMCkgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmxvZyhgYmFja2JsYXplIGRlbGV0ZSAke2ZpbGVOYW1lfWApO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5hcGlSZXRyeUxvZ2ljKGBoaWRlRmlsZSAke2ZpbGVOYW1lfWAsIGFzeW5jIChhcGkpID0+IHtcbiAgICAgICAgICAgICAgICBhd2FpdCBhcGkuaGlkZUZpbGUoeyBidWNrZXRJZDogdGhpcy5idWNrZXRJZCwgZmlsZU5hbWU6IGZpbGVOYW1lIH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgICAgICAgdGhpcy5sb2coYGJhY2tibGF6ZSBlcnJvciBpbiBoaWRlLCBwb3NzaWJseSBhbHJlYWR5IGhpZGRlbiAke2ZpbGVOYW1lfVxcbiR7ZS5zdGFja31gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIE5PVEU6IERlbGV0aW9uIFNFRU1TIHRvIHdvcmsuIFRoaXMgRE9FUyBicmVhayBpZiB3ZSBkZWxldGUgYSBmaWxlIHdoaWNoIGtlZXBzIGJlaW5nIHJlY3JlYXRlZCwgZXgsIHRoZSBoZWFydGJlYXQuIGxldCBleGlzdHNDaGVja3MgPSAxMDsgd2hpbGUgKGV4aXN0c0NoZWNrcyA+IDApIHsgbGV0IGV4aXN0cyA9IGF3YWl0IHRoaXMuZ2V0SW5mbyhmaWxlTmFtZSk7IGlmICghZXhpc3RzKSBicmVhazsgYXdhaXQgZGVsYXkoMTAwMCk7IGV4aXN0c0NoZWNrcy0tOyB9IGlmIChleGlzdHNDaGVja3MgPT09IDApIHsgbGV0IGV4aXN0cyA9IGF3YWl0IHRoaXMuZ2V0SW5mbyhmaWxlTmFtZSk7IGRldkRlYnVnYnJlYWsoKTsgY29uc29sZS53YXJuKGBGaWxlICR7ZmlsZU5hbWV9IHdhcyBkZWxldGVkLCBidXQgd2FzIHN0aWxsIGZvdW5kIGFmdGVyd2FyZHNgKTsgZXhpc3RzID0gYXdhaXQgdGhpcy5nZXRJbmZvKGZpbGVOYW1lKTsgfVxuICAgIH1cblxuICAgIC8vIGxhc3RNb2RpZmllZCBpcyBhY2NlcHRlZCBidXQgY2Fubm90IGJlIGhvbm9yZWQgLSBiMiBzdGFtcHMgaXRzIG93biB1cGxvYWRUaW1lc3RhbXAsIHdoaWNoIGlzIHdoYXQgb3VyIGdldEluZm8vZmluZEluZm8gcmVwb3J0IGFzIHRoZSB3cml0ZSB0aW1lXG4gICAgcHVibGljIGFzeW5jIHNldExhcmdlRmlsZShjb25maWc6IHsgcGF0aDogc3RyaW5nOyBsYXN0TW9kaWZpZWQ/OiBudW1iZXI7IGdldE5leHREYXRhKCk6IFByb21pc2U8QnVmZmVyIHwgdW5kZWZpbmVkPjsgfSk6IFByb21pc2U8dm9pZD4ge1xuXG4gICAgICAgIGxldCBvbkVycm9yOiAoKCkgPT4gUHJvbWlzZTx2b2lkPilbXSA9IFtdO1xuICAgICAgICBsZXQgdGltZSA9IERhdGUubm93KCk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBsZXQgeyBwYXRoIH0gPSBjb25maWc7XG4gICAgICAgICAgICBsZXQgZGF0YVF1ZXVlOiBCdWZmZXJbXSA9IFtdO1xuICAgICAgICAgICAgYXN5bmMgZnVuY3Rpb24gZ2V0TmV4dERhdGEoKTogUHJvbWlzZTxCdWZmZXIgfCB1bmRlZmluZWQ+IHtcbiAgICAgICAgICAgICAgICBpZiAoZGF0YVF1ZXVlLmxlbmd0aCkgcmV0dXJuIGRhdGFRdWV1ZS5zaGlmdCgpO1xuICAgICAgICAgICAgICAgIC8vIEdldCBidWZmZXJzIHVudGlsIHdlIGdldCA1TUIsIE9SLCBlbmQuIEJhY2tibGF6ZSByZXF1aXJlcyB0aGlzIGZvciBsYXJnZSBmaWxlcy5cbiAgICAgICAgICAgICAgICBsZXQgdG90YWxCeXRlcyA9IDA7XG4gICAgICAgICAgICAgICAgbGV0IGJ1ZmZlcnM6IEJ1ZmZlcltdID0gW107XG4gICAgICAgICAgICAgICAgd2hpbGUgKHRvdGFsQnl0ZXMgPCBMQVJHRV9GSUxFX01JTl9DSFVOS19TSVpFKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBkYXRhID0gYXdhaXQgY29uZmlnLmdldE5leHREYXRhKCk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghZGF0YSkgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIHRvdGFsQnl0ZXMgKz0gZGF0YS5sZW5ndGg7XG4gICAgICAgICAgICAgICAgICAgIGJ1ZmZlcnMucHVzaChkYXRhKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKCFidWZmZXJzLmxlbmd0aCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICByZXR1cm4gQnVmZmVyLmNvbmNhdChidWZmZXJzKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgbGV0IGZpbGVOYW1lID0gcGF0aDtcbiAgICAgICAgICAgIGxldCBkYXRhID0gYXdhaXQgZ2V0TmV4dERhdGEoKTtcbiAgICAgICAgICAgIGlmICghZGF0YT8ubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBzZXRMYXJnZUZpbGUgcHJvZHVjZWQgbm8gZGF0YSBmb3IgJHtKU09OLnN0cmluZ2lmeShjb25maWcucGF0aCl9IG9uICR7dGhpcy5nZXREZWJ1Z05hbWUoKX06IGFuIGVtcHR5IGZpbGUgSVMgYSBkZWxldGlvbiBpbiB0aGlzIHN5c3RlbSAtIGNhbGwgZGVsIHRvIGRlbGV0ZSwgbmV2ZXIgd3JpdGUgZW1wdHkgZmlsZXNgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIEJhY2tibGF6ZSBkaXNhbGxvd3Mgb3Zlcmx5IHNtYWxsIGZpbGVzXG4gICAgICAgICAgICBpZiAoZGF0YS5sZW5ndGggPCBMQVJHRV9GSUxFX01JTl9DSFVOS19TSVpFKSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5zZXQoZmlsZU5hbWUsIGRhdGEpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIEJhY2tibGF6ZSBkaXNhbGxvd3MgbGVzcyB0aGFuIDIgY2h1bmtzXG4gICAgICAgICAgICBsZXQgc2Vjb25kRGF0YSA9IGF3YWl0IGdldE5leHREYXRhKCk7XG4gICAgICAgICAgICBpZiAoIXNlY29uZERhdGE/Lmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuc2V0KGZpbGVOYW1lLCBkYXRhKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBBTFNPLCBpZiB0aGVyZSBhcmUgdHdvIGNodW5rcywgYnV0IG9uZSBpcyB0b28gc21hbGwsIGNvbWJpbmUgaXQuIFRoaXMgaGVscHMgYWxsb3cgdXMgbmV2ZXIgc2VuZCBzbWFsbCBjaHVua3MuXG4gICAgICAgICAgICBpZiAoc2Vjb25kRGF0YS5sZW5ndGggPCBMQVJHRV9GSUxFX01JTl9DSFVOS19TSVpFKSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5zZXQoZmlsZU5hbWUsIEJ1ZmZlci5jb25jYXQoW2RhdGEsIHNlY29uZERhdGFdKSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5sb2coYFVwbG9hZGluZyBsYXJnZSBmaWxlICR7Y29uZmlnLnBhdGh9YCk7XG4gICAgICAgICAgICBkYXRhUXVldWUudW5zaGlmdChkYXRhLCBzZWNvbmREYXRhKTtcblxuXG4gICAgICAgICAgICBsZXQgdXBsb2FkSW5mbyA9IGF3YWl0IHRoaXMuYXBpUmV0cnlMb2dpYyhgc3RhcnRMYXJnZUZpbGUgJHtmaWxlTmFtZX1gLCBhc3luYyAoYXBpKSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGF3YWl0IGFwaS5zdGFydExhcmdlRmlsZSh7XG4gICAgICAgICAgICAgICAgICAgIGJ1Y2tldElkOiB0aGlzLmJ1Y2tldElkLFxuICAgICAgICAgICAgICAgICAgICBmaWxlTmFtZTogZmlsZU5hbWUsXG4gICAgICAgICAgICAgICAgICAgIGNvbnRlbnRUeXBlOiBcImIyL3gtYXV0b1wiLFxuICAgICAgICAgICAgICAgICAgICBmaWxlSW5mbzoge30sXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIG9uRXJyb3IucHVzaChhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5hcGlSZXRyeUxvZ2ljKGBjYW5jZWxMYXJnZUZpbGUgJHtmaWxlTmFtZX1gLCBhc3luYyAoYXBpKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IGFwaS5jYW5jZWxMYXJnZUZpbGUoeyBmaWxlSWQ6IHVwbG9hZEluZm8uZmlsZUlkIH0pO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIGNvbnN0IExPR19JTlRFUlZBTCA9IHRpbWVJbk1pbnV0ZTtcbiAgICAgICAgICAgIGxldCBuZXh0TG9nVGltZSA9IERhdGUubm93KCkgKyBMT0dfSU5URVJWQUw7XG5cbiAgICAgICAgICAgIGxldCBwYXJ0TnVtYmVyID0gMTtcbiAgICAgICAgICAgIGxldCBwYXJ0U2hhMUFycmF5OiBzdHJpbmdbXSA9IFtdO1xuICAgICAgICAgICAgbGV0IHRvdGFsQnl0ZXMgPSAwO1xuICAgICAgICAgICAgd2hpbGUgKHRydWUpIHtcbiAgICAgICAgICAgICAgICBkYXRhID0gYXdhaXQgZ2V0TmV4dERhdGEoKTtcbiAgICAgICAgICAgICAgICBpZiAoIWRhdGEpIGJyZWFrO1xuICAgICAgICAgICAgICAgIC8vIFNvLi4uIGlmIHRoZSBuZXh0IGNodW5rIGlzIHRoZSBsYXN0IG9uZSwgY29tYmluZSBpdCB3aXRoIHRoZSBjdXJyZW50IG9uZS4gVGhpcyBwcmV2ZW50cyBBTlkgdXBsb2FkcyBmcm9tIGJlaW5nIDwgdGhlIHRocmVzaG9sZCwgYXMgYXBwYXJlbnRseSB0aGUgXCJsYXN0IHBhcnRcIiBjaGVjayBpbiBiYWNrYmxhemUgZmFpbHMgd2hlbiB3ZSBoYXZlIHRvIHJldHJ5IGFuIHVwbG9hZCAoZHVlIHRvIFwibm8gdG9tZXMgYXZhaWxhYmxlXCIpLiBXZWxsIGl0IGNhbid0IGZhaWwgaWYgZXZlbiB0aGUgbGFzdCBwYXJ0IGlzID4gNU1CLCBub3cgY2FuIGl0ISBCVVQsIG9ubHkgaWYgdGhpcyBpc24ndCB0aGUgZmlyc3QgY2h1bmssIG90aGVyd2lzZSB3ZSBtaWdodCB0cnkgdG8gc2VuZCBhIHNpbmdsZSBjaHVuaywgd2hpY2ggd2UgY2FuJ3QgZG8uXG4gICAgICAgICAgICAgICAgaWYgKHBhcnRTaGExQXJyYXkubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgbWF5YmVMYXN0RGF0YSA9IGF3YWl0IGdldE5leHREYXRhKCk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChtYXliZUxhc3REYXRhKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobWF5YmVMYXN0RGF0YS5sZW5ndGggPCBMQVJHRV9GSUxFX01JTl9DSFVOS19TSVpFKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSXQncyB0aGUgbGFzdCBvbmUsIHNvIGNvbnN1bWUgaXQgbm93XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IEJ1ZmZlci5jb25jYXQoW2RhdGEsIG1heWJlTGFzdERhdGFdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSXQncyBub3QgdGhlIGxhc3Qgb25lLiBQdXQgaXQgYmFjaywgaW4gY2FzZSB0aGUgb25lIEFGVEVSIGlzIHRoZSBsYXN0IG9uZSwgaW4gd2hpY2ggY2FzZSB3ZSBuZWVkIHRvIG1lcmdlIG1heWJlTGFzdERhdGEgd2l0aCB0aGUgbmV4dCBuZXh0IGRhdGEuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVF1ZXVlLnVuc2hpZnQobWF5YmVMYXN0RGF0YSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbGV0IHNoYTEgPSByZXF1aXJlKFwiY3J5cHRvXCIpLmNyZWF0ZUhhc2goXCJzaGExXCIpO1xuICAgICAgICAgICAgICAgIHNoYTEudXBkYXRlKGRhdGEpO1xuICAgICAgICAgICAgICAgIGxldCBzaGExSGV4ID0gc2hhMS5kaWdlc3QoXCJoZXhcIik7XG4gICAgICAgICAgICAgICAgcGFydFNoYTFBcnJheS5wdXNoKHNoYTFIZXgpO1xuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuYXBpUmV0cnlMb2dpYyhgdXBsb2FkUGFydCMke3BhcnROdW1iZXJ9ICR7ZmlsZU5hbWV9YCwgYXN5bmMgKGFwaSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWRhdGEpIHRocm93IG5ldyBFcnJvcihcIkltcG9zc2libGUsIGRhdGEgaXMgdW5kZWZpbmVkXCIpO1xuXG4gICAgICAgICAgICAgICAgICAgIGxldCB0aW1lU3RyID0gZm9ybWF0VGltZShEYXRlLm5vdygpIC0gdGltZSk7XG4gICAgICAgICAgICAgICAgICAgIGxldCByYXRlU3RyID0gZm9ybWF0TnVtYmVyKHRvdGFsQnl0ZXMgLyAoRGF0ZS5ub3coKSAtIHRpbWUpICogMTAwMCkgKyBcIkIvc1wiO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmxvZyhgVXBsb2FkaW5nIGxhcmdlIGZpbGUgcGFydCAke3BhcnROdW1iZXJ9LCB1cGxvYWRlZCAke2JsdWUoZm9ybWF0TnVtYmVyKHRvdGFsQnl0ZXMpICsgXCJCXCIpfSBpbiAke2JsdWUodGltZVN0cil9ICgke2JsdWUocmF0ZVN0cil9KS4gJHtjb25maWcucGF0aH1gKTtcbiAgICAgICAgICAgICAgICAgICAgdG90YWxCeXRlcyArPSBkYXRhLmxlbmd0aDtcblxuICAgICAgICAgICAgICAgICAgICBhd2FpdCBhcGkudXBsb2FkUGFydCh7XG4gICAgICAgICAgICAgICAgICAgICAgICBmaWxlSWQ6IHVwbG9hZEluZm8uZmlsZUlkLFxuICAgICAgICAgICAgICAgICAgICAgICAgcGFydE51bWJlcjogcGFydE51bWJlcixcbiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGE6IGRhdGEsXG4gICAgICAgICAgICAgICAgICAgICAgICBzaGExOiBzaGExSGV4LFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBwYXJ0TnVtYmVyKys7XG5cbiAgICAgICAgICAgICAgICBpZiAoRGF0ZS5ub3coKSA+IG5leHRMb2dUaW1lKSB7XG4gICAgICAgICAgICAgICAgICAgIG5leHRMb2dUaW1lID0gRGF0ZS5ub3coKSArIExPR19JTlRFUlZBTDtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHRpbWVTdHIgPSBmb3JtYXRUaW1lKERhdGUubm93KCkgLSB0aW1lKTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHJhdGVTdHIgPSBmb3JtYXROdW1iZXIodG90YWxCeXRlcyAvIChEYXRlLm5vdygpIC0gdGltZSkgKiAxMDAwKSArIFwiQi9zXCI7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGBTdGlsbCB1cGxvYWRpbmcgbGFyZ2UgZmlsZSBhdCAke0RhdGUubm93KCl9LiBVcGxvYWRlZCAke2Zvcm1hdE51bWJlcih0b3RhbEJ5dGVzKX1CIGluICR7dGltZVN0cn0gKCR7cmF0ZVN0cn0pLiAke2NvbmZpZy5wYXRofWApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMubG9nKGBGaW5pc2hlZCB1cGxvYWRpbmcgbGFyZ2UgZmlsZSB1cGxvYWRlZCAke2dyZWVuKGZvcm1hdE51bWJlcih0b3RhbEJ5dGVzKSl9QmApO1xuXG4gICAgICAgICAgICBhd2FpdCB0aGlzLmFwaVJldHJ5TG9naWMoYGZpbmlzaExhcmdlRmlsZSAke2ZpbGVOYW1lfWAsIGFzeW5jIChhcGkpID0+IHtcbiAgICAgICAgICAgICAgICBhd2FpdCBhcGkuZmluaXNoTGFyZ2VGaWxlKHtcbiAgICAgICAgICAgICAgICAgICAgZmlsZUlkOiB1cGxvYWRJbmZvLmZpbGVJZCxcbiAgICAgICAgICAgICAgICAgICAgcGFydFNoYTFBcnJheTogcGFydFNoYTFBcnJheSxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgICAgICAgIGZvciAobGV0IGMgb2Ygb25FcnJvcikge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IGMoKTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYEVycm9yIGR1cmluZyBlcnJvciBjbGVhbi4gSWdub3JpbmcsIHdlIHdpbGwgcmV0aHJvdyB0aGUgb3JpZ2luYWwgZXJyb3IsIHBhdGggJHtjb25maWcucGF0aH1gLCBlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgRXJyb3IgaW4gc2V0TGFyZ2VGaWxlIGZvciAke2NvbmZpZy5wYXRofTogJHtlLnN0YWNrfWApO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGdldEluZm8oZmlsZU5hbWU6IHN0cmluZywgY29uZmlnPzogR2V0SW5mb0NvbmZpZyk6IFByb21pc2U8eyB3cml0ZVRpbWU6IG51bWJlcjsgc2l6ZTogbnVtYmVyOyB9IHwgdW5kZWZpbmVkPiB7XG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmFwaVJldHJ5TG9naWMoYGdldEluZm8gJHtmaWxlTmFtZX1gLCBhc3luYyAoYXBpKSA9PiB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGxldCBmaWxlID0gYXdhaXQgYXBpLmhlYWRGaWxlQnlOYW1lKHsgYnVja2V0TmFtZTogdGhpcy5idWNrZXROYW1lLCBmaWxlTmFtZSB9KTtcbiAgICAgICAgICAgICAgICBpZiAoIWZpbGUgfHwgIWZpbGUuc2l6ZSAmJiAhY29uZmlnPy5pbmNsdWRlVG9tYnN0b25lcykge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmxvZyhgQmFja2JsYXplIGZpbGUgbm90IGV4aXN0cyAke2ZpbGVOYW1lfWApO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aGlzLmxvZyhgQmFja2JsYXplIGZpbGUgZXhpc3RzICR7ZmlsZU5hbWV9YCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgd3JpdGVUaW1lOiBmaWxlLnVwbG9hZFRpbWVzdGFtcCxcbiAgICAgICAgICAgICAgICAgICAgc2l6ZTogZmlsZS5zaXplLFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgICAgICAgICAgICBpZiAoZS5zdGFjay5pbmNsdWRlcyhgZmlsZV9ub3RfZm91bmRgKSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmxvZyhgQmFja2JsYXplIGZpbGUgbm90IGV4aXN0cyAke2ZpbGVOYW1lfWApO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBGb3IgZXhhbXBsZSBmaW5kRmlsZU5hbWVzKFwiaXBzL1wiKVxuICAgIHB1YmxpYyBhc3luYyBmaW5kKHByZWZpeDogc3RyaW5nLCBjb25maWc/OiBGaW5kQ29uZmlnKTogUHJvbWlzZTxzdHJpbmdbXT4ge1xuICAgICAgICBsZXQgcmVzdWx0ID0gYXdhaXQgdGhpcy5maW5kSW5mbyhwcmVmaXgsIGNvbmZpZyk7XG4gICAgICAgIHJldHVybiByZXN1bHQubWFwKHggPT4geC5wYXRoKTtcbiAgICB9XG4gICAgcHVibGljIGFzeW5jIGdldENoYW5nZXNBZnRlcjIoY29uZmlnOiBDaGFuZ2VzQWZ0ZXJDb25maWcpOiBQcm9taXNlPEFyY2hpdmVGaWxlSW5mb1tdPiB7XG4gICAgICAgIC8vIE5vIG5hdGl2ZSBjaGFuZ2UgZmVlZCAoYjIgc3VwcG9ydHMgbmVpdGhlciB0aW1lIG5vciByb3V0ZSBmaWx0ZXJpbmcpIC0gYSBmdWxsIGxpc3RpbmcgZmlsdGVyZWQgaW4gbWVtb3J5XG4gICAgICAgIHJldHVybiBmaWx0ZXJDaGFuZ2VzKGF3YWl0IHRoaXMuZmluZEluZm8oXCJcIiksIGNvbmZpZyk7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGZpbmRJbmZvKHByZWZpeDogc3RyaW5nLCBjb25maWc/OiBGaW5kQ29uZmlnKTogUHJvbWlzZTx7IHBhdGg6IHN0cmluZzsgY3JlYXRlVGltZTogbnVtYmVyOyBzaXplOiBudW1iZXI7IH1bXT4ge1xuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5hcGlSZXRyeUxvZ2ljKGBmaW5kSW5mbyAke3ByZWZpeH1gLCBhc3luYyAoYXBpKSA9PiB7XG4gICAgICAgICAgICBpZiAoIWNvbmZpZz8uc2hhbGxvdyAmJiBjb25maWc/LnR5cGUgPT09IFwiZm9sZGVyc1wiKSB7XG4gICAgICAgICAgICAgICAgbGV0IGFsbEZpbGVzID0gYXdhaXQgdGhpcy5maW5kSW5mbyhwcmVmaXgpO1xuICAgICAgICAgICAgICAgIGxldCBhbGxGb2xkZXJzID0gbmV3IE1hcDxzdHJpbmcsIHsgcGF0aDogc3RyaW5nOyBjcmVhdGVUaW1lOiBudW1iZXI7IHNpemU6IG51bWJlciB9PigpO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IHsgcGF0aCwgY3JlYXRlVGltZSwgc2l6ZSB9IG9mIGFsbEZpbGVzKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBmb2xkZXIgPSBwYXRoLnNwbGl0KFwiL1wiKS5zbGljZSgwLCAtMSkuam9pbihcIi9cIik7XG4gICAgICAgICAgICAgICAgICAgIGlmICghZm9sZGVyKSBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgYWxsRm9sZGVycy5zZXQoZm9sZGVyLCB7IHBhdGg6IGZvbGRlciwgY3JlYXRlVGltZSwgc2l6ZSB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIEFycmF5LmZyb20oYWxsRm9sZGVycy52YWx1ZXMoKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsZXQgZmlsZXMgPSBuZXcgTWFwPHN0cmluZywgeyBwYXRoOiBzdHJpbmc7IGNyZWF0ZVRpbWU6IG51bWJlcjsgc2l6ZTogbnVtYmVyOyB9PigpO1xuICAgICAgICAgICAgbGV0IHN0YXJ0RmlsZU5hbWUgPSBcIlwiO1xuICAgICAgICAgICAgd2hpbGUgKHRydWUpIHtcbiAgICAgICAgICAgICAgICBsZXQgcmVzdWx0ID0gYXdhaXQgYXBpLmxpc3RGaWxlTmFtZXMoe1xuICAgICAgICAgICAgICAgICAgICBidWNrZXRJZDogdGhpcy5idWNrZXRJZCxcbiAgICAgICAgICAgICAgICAgICAgcHJlZml4OiBwcmVmaXgsXG4gICAgICAgICAgICAgICAgICAgIHN0YXJ0RmlsZU5hbWUsXG4gICAgICAgICAgICAgICAgICAgIG1heEZpbGVDb3VudDogMTAwMCxcbiAgICAgICAgICAgICAgICAgICAgZGVsaW1pdGVyOiBjb25maWc/LnNoYWxsb3cgPyBcIi9cIiA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBmaWxlIG9mIHJlc3VsdC5maWxlcykge1xuICAgICAgICAgICAgICAgICAgICBpZiAoZmlsZS5hY3Rpb24gPT09IFwidXBsb2FkXCIgJiYgY29uZmlnPy50eXBlICE9PSBcImZvbGRlcnNcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgZmlsZXMuc2V0KGZpbGUuZmlsZU5hbWUsIHsgcGF0aDogZmlsZS5maWxlTmFtZSwgY3JlYXRlVGltZTogZmlsZS51cGxvYWRUaW1lc3RhbXAsIHNpemU6IGZpbGUuY29udGVudExlbmd0aCB9KTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChmaWxlLmFjdGlvbiA9PT0gXCJmb2xkZXJcIiAmJiBjb25maWc/LnR5cGUgPT09IFwiZm9sZGVyc1wiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgZm9sZGVyID0gZmlsZS5maWxlTmFtZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmb2xkZXIuZW5kc1dpdGgoXCIvXCIpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9sZGVyID0gZm9sZGVyLnNsaWNlKDAsIC0xKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVzLnNldChmb2xkZXIsIHsgcGF0aDogZm9sZGVyLCBjcmVhdGVUaW1lOiBmaWxlLnVwbG9hZFRpbWVzdGFtcCwgc2l6ZTogZmlsZS5jb250ZW50TGVuZ3RoIH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgc3RhcnRGaWxlTmFtZSA9IHJlc3VsdC5uZXh0RmlsZU5hbWU7XG4gICAgICAgICAgICAgICAgaWYgKCFzdGFydEZpbGVOYW1lKSBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBBcnJheS5mcm9tKGZpbGVzLnZhbHVlcygpKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGFzc2VydFBhdGhWYWxpZChwYXRoOiBzdHJpbmcpIHtcbiAgICAgICAgbGV0IGJ5dGVzID0gQnVmZmVyLmZyb20ocGF0aCwgXCJ1dGY4XCIpO1xuICAgICAgICBpZiAoYnl0ZXMubGVuZ3RoID4gMTAwMCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBQYXRoIHRvbyBsb25nOiAke3BhdGgubGVuZ3RofSBjaGFyYWN0ZXJzID4gMTAwMCBjaGFyYWN0ZXJzLiBQYXRoOiAke3BhdGh9YCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgbW92ZShjb25maWc6IHtcbiAgICAgICAgcGF0aDogc3RyaW5nO1xuICAgICAgICB0YXJnZXQ6IElBcmNoaXZlcztcbiAgICAgICAgdGFyZ2V0UGF0aDogc3RyaW5nO1xuICAgICAgICBjb3B5SW5zdGVhZD86IGJvb2xlYW47XG4gICAgfSkge1xuICAgICAgICBsZXQgeyBwYXRoLCB0YXJnZXQsIHRhcmdldFBhdGggfSA9IGNvbmZpZztcbiAgICAgICAgLy8gQSBzZWxmIG1vdmUgc2hvdWxkIE5PT1AgKGFuZCBkZWZpbml0ZWx5IG5vdCBjb3B5LCBhbmQgdGhlbiBkZWxldGUgaXRzZWxmISlcbiAgICAgICAgaWYgKHRhcmdldCA9PT0gdGhpcyAmJiBwYXRoID09PSB0YXJnZXRQYXRoKSB7XG4gICAgICAgICAgICB0aGlzLmxvZyhgQmFja2JsYXplIG1vdmUgcGF0aCB0byBpdHNlbGYuIFNraXBwaW5nIG1vdmUsIGFzIHRoZXJlIGlzIG5vIHdvcmsgdG8gZG8uICR7cGF0aH1gKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGFyZ2V0IGluc3RhbmNlb2YgQXJjaGl2ZXNCYWNrYmxhemUpIHtcbiAgICAgICAgICAgIGxldCB0YXJnZXRCdWNrZXRJZCA9IHRhcmdldC5idWNrZXRJZDtcbiAgICAgICAgICAgIGlmICh0YXJnZXRCdWNrZXRJZCA9PT0gdGhpcy5idWNrZXRJZCAmJiBwYXRoID09PSB0YXJnZXRQYXRoKSByZXR1cm47XG4gICAgICAgICAgICBhd2FpdCB0aGlzLmFwaVJldHJ5TG9naWMoYG1vdmUgJHtwYXRofSAtPiAke3RhcmdldFBhdGh9YCwgYXN5bmMgKGFwaSkgPT4ge1xuICAgICAgICAgICAgICAgIC8vIFVnaC4uLiBsaXN0aW5nIHRoZSBmaWxlIG5hbWUgc3Vja3MsIGJ1dC4uLiBJIGd1ZXNzIGl0J3Mgc3RpbGwgYmV0dGVyIHRoYW4gZG93bmxvYWRpbmcgYW5kIHJlLXVwbG9hZGluZyB0aGUgZW50aXJlIGZpbGUuXG4gICAgICAgICAgICAgICAgbGV0IGluZm8gPSBhd2FpdCBhcGkubGlzdEZpbGVOYW1lcyh7IGJ1Y2tldElkOiB0aGlzLmJ1Y2tldElkLCBwcmVmaXg6IHBhdGgsIG1heEZpbGVDb3VudDogMTAgfSk7XG4gICAgICAgICAgICAgICAgbGV0IGZpbGUgPSBpbmZvLmZpbGVzLmZpbmQoeCA9PiB4LmZpbGVOYW1lID09PSBwYXRoKTtcbiAgICAgICAgICAgICAgICBpZiAoIWZpbGUpIHRocm93IG5ldyBFcnJvcihgRmlsZSBub3QgZm91bmQgdG8gbW92ZTogJHtwYXRofWApO1xuICAgICAgICAgICAgICAgIGF3YWl0IGFwaS5jb3B5RmlsZSh7XG4gICAgICAgICAgICAgICAgICAgIHNvdXJjZUZpbGVJZDogZmlsZS5maWxlSWQsXG4gICAgICAgICAgICAgICAgICAgIGZpbGVOYW1lOiB0YXJnZXRQYXRoLFxuICAgICAgICAgICAgICAgICAgICBkZXN0aW5hdGlvbkJ1Y2tldElkOiB0YXJnZXRCdWNrZXRJZCxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbGV0IGRhdGEgPSBhd2FpdCB0aGlzLmdldChwYXRoKTtcbiAgICAgICAgICAgIGlmICghZGF0YSkgdGhyb3cgbmV3IEVycm9yKGBGaWxlIG5vdCBmb3VuZCB0byBtb3ZlOiAke3BhdGh9YCk7XG4gICAgICAgICAgICBhd2FpdCB0YXJnZXQuc2V0KHRhcmdldFBhdGgsIGRhdGEpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFjb25maWcuY29weUluc3RlYWQpIHtcbiAgICAgICAgICAgIGxldCBleGlzdHMgPSBhd2FpdCB0aGlzLmdldEluZm8odGFyZ2V0UGF0aCk7XG4gICAgICAgICAgICBpZiAoIWV4aXN0cykge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYEZpbGUgbm90IGZvdW5kIGFmdGVyIG1vdmUuIExlYXZpbmcgQk9USCBmaWxlcy4gJHt0YXJnZXRQYXRofSB3YXMgbm90IGZvdW5kLiBCZWluZyBtb3ZlZCBmcm9tICR7cGF0aH1gKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5kZWwocGF0aCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgY29weShjb25maWc6IHtcbiAgICAgICAgcGF0aDogc3RyaW5nO1xuICAgICAgICB0YXJnZXQ6IElBcmNoaXZlcztcbiAgICAgICAgdGFyZ2V0UGF0aDogc3RyaW5nO1xuICAgIH0pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMubW92ZSh7IC4uLmNvbmZpZywgY29weUluc3RlYWQ6IHRydWUgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGdldFVSTChwYXRoOiBzdHJpbmcpIHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuYXBpUmV0cnlMb2dpYyhgZ2V0VVJMICR7cGF0aH1gLCBhc3luYyAoYXBpKSA9PiB7XG4gICAgICAgICAgICBpZiAocGF0aC5zdGFydHNXaXRoKFwiL1wiKSkge1xuICAgICAgICAgICAgICAgIHBhdGggPSBwYXRoLnNsaWNlKDEpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IGFwaS5nZXREb3dubG9hZFVSTChcImZpbGUvXCIgKyB0aGlzLmJ1Y2tldE5hbWUgKyBcIi9cIiArIHBhdGgpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgZ2V0RG93bmxvYWRBdXRob3JpemF0aW9uKGNvbmZpZzoge1xuICAgICAgICBmaWxlTmFtZVByZWZpeD86IHN0cmluZztcbiAgICAgICAgdmFsaWREdXJhdGlvbkluU2Vjb25kczogbnVtYmVyO1xuICAgICAgICBiMkNvbnRlbnREaXNwb3NpdGlvbj86IHN0cmluZztcbiAgICAgICAgYjJDb250ZW50TGFuZ3VhZ2U/OiBzdHJpbmc7XG4gICAgICAgIGIyRXhwaXJlcz86IHN0cmluZztcbiAgICAgICAgYjJDYWNoZUNvbnRyb2w/OiBzdHJpbmc7XG4gICAgICAgIGIyQ29udGVudEVuY29kaW5nPzogc3RyaW5nO1xuICAgICAgICBiMkNvbnRlbnRUeXBlPzogc3RyaW5nO1xuICAgIH0pOiBQcm9taXNlPHtcbiAgICAgICAgYnVja2V0SWQ6IHN0cmluZztcbiAgICAgICAgZmlsZU5hbWVQcmVmaXg6IHN0cmluZztcbiAgICAgICAgYXV0aG9yaXphdGlvblRva2VuOiBzdHJpbmc7XG4gICAgfT4ge1xuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5hcGlSZXRyeUxvZ2ljKGBnZXREb3dubG9hZEF1dGhvcml6YXRpb24gJHtjb25maWcuZmlsZU5hbWVQcmVmaXggPz8gXCJcIn1gLCBhc3luYyAoYXBpKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgYXBpLmdldERvd25sb2FkQXV0aG9yaXphdGlvbih7XG4gICAgICAgICAgICAgICAgYnVja2V0SWQ6IHRoaXMuYnVja2V0SWQsXG4gICAgICAgICAgICAgICAgZmlsZU5hbWVQcmVmaXg6IGNvbmZpZy5maWxlTmFtZVByZWZpeCA/PyBcIlwiLFxuICAgICAgICAgICAgICAgIC4uLmNvbmZpZyxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9XG59XG5cbi8qXG5OYW1lcyBzaG91bGQgYmUgYSBVVEYtOCBzdHJpbmcgdXAgdG8gMTAyNCBieXRlcyB3aXRoIHRoZSBmb2xsb3dpbmcgZXhjZXB0aW9uczpcbiAgICBDaGFyYWN0ZXIgY29kZXMgYmVsb3cgMzIgYXJlIG5vdCBhbGxvd2VkLlxuICAgIERFTCBjaGFyYWN0ZXJzICgxMjcpIGFyZSBub3QgYWxsb3dlZC5cbiAgICBCYWNrc2xhc2hlcyBhcmUgbm90IGFsbG93ZWQuXG4gICAgRmlsZSBuYW1lcyBjYW5ub3Qgc3RhcnQgd2l0aCAvLCBlbmQgd2l0aCAvLCBvciBjb250YWluIC8vLlxuKi9cblxuXG5leHBvcnQgY29uc3QgZ2V0QXJjaGl2ZXNCYWNrYmxhemUgPSBjYWNoZSgoZG9tYWluOiBzdHJpbmcpID0+IHtcbiAgICByZXR1cm4gbmV3IEFyY2hpdmVzQmFja2JsYXplKHsgYnVja2V0TmFtZTogZG9tYWluIH0pO1xufSk7XG5leHBvcnQgY29uc3QgZ2V0QXJjaGl2ZXNCYWNrYmxhemVQcml2YXRlSW1tdXRhYmxlID0gY2FjaGUoKGRvbWFpbjogc3RyaW5nKSA9PiB7XG4gICAgcmV0dXJuIG5ldyBBcmNoaXZlc0JhY2tibGF6ZSh7XG4gICAgICAgIGJ1Y2tldE5hbWU6IGRvbWFpbiArIFwiLXByaXZhdGUtaW1tdXRhYmxlXCIsXG4gICAgICAgIGltbXV0YWJsZTogdHJ1ZVxuICAgIH0pO1xufSk7XG5leHBvcnQgY29uc3QgZ2V0QXJjaGl2ZXNCYWNrYmxhemVQdWJsaWNJbW11dGFibGUgPSBjYWNoZSgoZG9tYWluOiBzdHJpbmcpID0+IHtcbiAgICByZXR1cm4gbmV3IEFyY2hpdmVzQmFja2JsYXplKHtcbiAgICAgICAgYnVja2V0TmFtZTogZG9tYWluICsgXCItcHVibGljLWltbXV0YWJsZVwiLFxuICAgICAgICBwdWJsaWM6IHRydWUsXG4gICAgICAgIGltbXV0YWJsZTogdHJ1ZSxcbiAgICAgICAgYWxsb3dlZE9yaWdpbnM6IFtgaHR0cHM6Ly8ke2RvbWFpbn1gLCBgaHR0cHM6Ly8xMjctMC0wLTEuJHtkb21haW59OjcwMDdgXSxcbiAgICB9KTtcbn0pO1xuXG4vLyBOT1RFOiBDYWNoZSBieSBhIG1pbnV0ZS4gVGhpcyBtaWdodCBiZSBhIGJhZCBpZGVhLCBidXQuLi4gdXN1YWxseSB3aG9sZSByZWFzb24gZm9yIHB1YmxpYyBpcyBmb3IgY2xvdWRmbGFyZSBjYWNoaW5nIChhcyBvdGhlcndpc2Ugd2UgY2FuIGp1c3QgYWNjZXNzIGl0IHRocm91Z2ggYSBzZXJ2ZXIpLCBvciBmb3IgbGFyZ2UgZmlsZXMgKHdoaWNoIHNob3VsZCBiZSBjYWNoZWQgYW55d2F5cywgYW5kIHByb2JhYmx5IGV2ZW4gdXNlIGltbXV0YWJsZSBjYWNoaW5nKS5cbmV4cG9ydCBjb25zdCBnZXRBcmNoaXZlc0JhY2tibGF6ZVB1YmxpYyA9IGNhY2hlKChkb21haW46IHN0cmluZykgPT4ge1xuICAgIHJldHVybiBuZXcgQXJjaGl2ZXNCYWNrYmxhemUoe1xuICAgICAgICBidWNrZXROYW1lOiBkb21haW4gKyBcIi1wdWJsaWNcIixcbiAgICAgICAgcHVibGljOiB0cnVlLFxuICAgICAgICBjYWNoZVRpbWU6IHRpbWVJbk1pbnV0ZSxcbiAgICAgICAgYWxsb3dlZE9yaWdpbnM6IFtgaHR0cHM6Ly8ke2RvbWFpbn1gLCBgaHR0cHM6Ly8xMjctMC0wLTEuJHtkb21haW59OjcwMDdgXSxcbiAgICB9KTtcbn0pOyJdfQ==
|
|
857
|
+
/* _JS_SOURCE_HASH = "b59108dddc108c352193999078715a33440362927674daa8155ed64d74ab995f"; */
|