@decohere/flux 0.0.1-dev.82 → 0.0.1-dev.84
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.
|
@@ -15,6 +15,12 @@ _export(exports, {
|
|
|
15
15
|
get HotReloadServer () {
|
|
16
16
|
return HotReloadServer;
|
|
17
17
|
},
|
|
18
|
+
get formatFluxRebootReady () {
|
|
19
|
+
return formatFluxRebootReady;
|
|
20
|
+
},
|
|
21
|
+
get formatFluxRebootStart () {
|
|
22
|
+
return formatFluxRebootStart;
|
|
23
|
+
},
|
|
18
24
|
get resolveRebootDebounceMs () {
|
|
19
25
|
return resolveRebootDebounceMs;
|
|
20
26
|
}
|
|
@@ -33,6 +39,7 @@ function _interop_require_default(obj) {
|
|
|
33
39
|
const currentFilePath = _io.io.fileUrlToPath(require("url").pathToFileURL(__filename).toString());
|
|
34
40
|
const VERSION_URL_PARAM = "version";
|
|
35
41
|
const DEFAULT_REBOOT_DEBOUNCE_MS = 250;
|
|
42
|
+
/** How many triggering paths to print on the info banner before `+N`. */ const MAX_REBOOT_TRIGGER_PATHS = 4;
|
|
36
43
|
function resolveRebootDebounceMs(value) {
|
|
37
44
|
const delay = value ?? DEFAULT_REBOOT_DEBOUNCE_MS;
|
|
38
45
|
if (!Number.isFinite(delay) || delay < 0) {
|
|
@@ -40,6 +47,34 @@ function resolveRebootDebounceMs(value) {
|
|
|
40
47
|
}
|
|
41
48
|
return delay;
|
|
42
49
|
}
|
|
50
|
+
function formatTriggerList(triggers) {
|
|
51
|
+
if (triggers.length === 0) return undefined;
|
|
52
|
+
if (triggers.length <= MAX_REBOOT_TRIGGER_PATHS) return triggers.join(", ");
|
|
53
|
+
return `${triggers.slice(0, MAX_REBOOT_TRIGGER_PATHS).join(", ")}, +${triggers.length - MAX_REBOOT_TRIGGER_PATHS}`;
|
|
54
|
+
}
|
|
55
|
+
const BANNER_RULE = "═".repeat(56);
|
|
56
|
+
function wrapFluxBanner(title, details) {
|
|
57
|
+
const body = details.map((line)=>` ${line}`).join("\n");
|
|
58
|
+
return `\n${BANNER_RULE}\n ${title}\n${body}\n${BANNER_RULE}\n`;
|
|
59
|
+
}
|
|
60
|
+
function formatFluxRebootStart(labels, triggers = []) {
|
|
61
|
+
const who = labels.join(", ") || "entry";
|
|
62
|
+
const files = formatTriggerList(triggers);
|
|
63
|
+
const details = files == null ? [
|
|
64
|
+
who
|
|
65
|
+
] : [
|
|
66
|
+
who,
|
|
67
|
+
files
|
|
68
|
+
];
|
|
69
|
+
return wrapFluxBanner("FLUX REBOOT", details);
|
|
70
|
+
}
|
|
71
|
+
function formatFluxRebootReady(labels, elapsedMs) {
|
|
72
|
+
const who = labels.join(", ") || "entry";
|
|
73
|
+
return wrapFluxBanner("FLUX READY", [
|
|
74
|
+
who,
|
|
75
|
+
`${Math.max(0, Math.round(elapsedMs))}ms`
|
|
76
|
+
]);
|
|
77
|
+
}
|
|
43
78
|
/** Process-wide: Node's ESM cache is process-global, including across HotReloadServer instances. */ let moduleVersionSeq = 0;
|
|
44
79
|
class HotReloadServer extends _nodeevents.EventEmitter {
|
|
45
80
|
// ── State ────────────────────────────────────────────────────────────────
|
|
@@ -48,6 +83,7 @@ class HotReloadServer extends _nodeevents.EventEmitter {
|
|
|
48
83
|
disposed = false;
|
|
49
84
|
/** Absolute entry paths currently served (one or more Flux apps). */ entries = new Map();
|
|
50
85
|
pendingEntryReboots = new Set();
|
|
86
|
+
/** Source paths that scheduled the next reboot (cleared when that reboot starts). */ pendingTriggers = new Set();
|
|
51
87
|
watchSubscription;
|
|
52
88
|
moduleCache = new Map();
|
|
53
89
|
dependencies = new Map();
|
|
@@ -65,6 +101,7 @@ class HotReloadServer extends _nodeevents.EventEmitter {
|
|
|
65
101
|
this.moduleCache.clear();
|
|
66
102
|
this.entries.clear();
|
|
67
103
|
this.pendingEntryReboots.clear();
|
|
104
|
+
this.pendingTriggers.clear();
|
|
68
105
|
this.pendingGraphPrune.clear();
|
|
69
106
|
this.rebootTail = Promise.resolve();
|
|
70
107
|
this.rebootInFlight = false;
|
|
@@ -83,7 +120,8 @@ class HotReloadServer extends _nodeevents.EventEmitter {
|
|
|
83
120
|
for (const project of selected){
|
|
84
121
|
const entryPath = _nodepath.default.resolve(project.getSourceEntryPath());
|
|
85
122
|
this.entries.set(entryPath, {
|
|
86
|
-
path: entryPath
|
|
123
|
+
path: entryPath,
|
|
124
|
+
label: project.name
|
|
87
125
|
});
|
|
88
126
|
}
|
|
89
127
|
this.loader.registerHooks();
|
|
@@ -161,9 +199,13 @@ class HotReloadServer extends _nodeevents.EventEmitter {
|
|
|
161
199
|
// Drop reverse edges only when rebooting so later saves in the debounce
|
|
162
200
|
// window can still walk the graph and reset the quiet timer.
|
|
163
201
|
this.prunePendingDependencyEdges();
|
|
164
|
-
|
|
202
|
+
const startedAt = Date.now();
|
|
203
|
+
const labels = this.labelsFor(toReboot);
|
|
204
|
+
const triggers = this.takeTriggers();
|
|
205
|
+
this.logger.info(formatFluxRebootStart(labels, triggers));
|
|
165
206
|
await this.disposeEntries(toReboot);
|
|
166
207
|
await this.bootEntries(toReboot);
|
|
208
|
+
this.logger.info(formatFluxRebootReady(labels, Date.now() - startedAt));
|
|
167
209
|
this.emit("reboot");
|
|
168
210
|
}while (this.rebootFollowUp && !this.disposed)
|
|
169
211
|
} finally{
|
|
@@ -298,6 +340,7 @@ class HotReloadServer extends _nodeevents.EventEmitter {
|
|
|
298
340
|
for (const entryPath of affectedEntries){
|
|
299
341
|
this.pendingEntryReboots.add(entryPath);
|
|
300
342
|
}
|
|
343
|
+
this.pendingTriggers.add(fullPath);
|
|
301
344
|
this.scheduleReboot();
|
|
302
345
|
return true;
|
|
303
346
|
}
|
|
@@ -385,6 +428,26 @@ class HotReloadServer extends _nodeevents.EventEmitter {
|
|
|
385
428
|
isSelf(filePath) {
|
|
386
429
|
return currentFilePath === _nodepath.default.resolve(filePath);
|
|
387
430
|
}
|
|
431
|
+
labelsFor(entryPaths) {
|
|
432
|
+
return entryPaths.map((entryPath)=>this.entries.get(entryPath)?.label ?? _nodepath.default.basename(entryPath));
|
|
433
|
+
}
|
|
434
|
+
takeTriggers() {
|
|
435
|
+
const triggers = [
|
|
436
|
+
...this.pendingTriggers
|
|
437
|
+
].map((fullPath)=>this.formatTrigger(fullPath));
|
|
438
|
+
this.pendingTriggers.clear();
|
|
439
|
+
return triggers;
|
|
440
|
+
}
|
|
441
|
+
formatTrigger(fullPath) {
|
|
442
|
+
const root = this.loader.getWorkspace()?.rootDir;
|
|
443
|
+
if (root != null) {
|
|
444
|
+
const rel = _nodepath.default.relative(_nodepath.default.resolve(root), fullPath);
|
|
445
|
+
if (rel !== "" && !rel.startsWith("..") && !_nodepath.default.isAbsolute(rel)) {
|
|
446
|
+
return rel.replaceAll("\\", "/");
|
|
447
|
+
}
|
|
448
|
+
}
|
|
449
|
+
return _nodepath.default.basename(fullPath);
|
|
450
|
+
}
|
|
388
451
|
}
|
|
389
452
|
|
|
390
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL2RlY29oZXJlL2RlY29oZXJlL3Byb2plY3RzL2ZsdXgvc3JjL2hvdC1yZWxvYWQtc2VydmVyLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEV2ZW50RW1pdHRlciB9IGZyb20gXCJub2RlOmV2ZW50c1wiO1xuaW1wb3J0IHR5cGUgeyBSZXNvbHZlRm5PdXRwdXQgfSBmcm9tIFwibm9kZTptb2R1bGVcIjtcbmltcG9ydCBwYXRoIGZyb20gXCJub2RlOnBhdGhcIjtcbmltcG9ydCB0eXBlIHsgUHJvamVjdCwgUHJvamVjdEZpbGVFdmVudCwgV29ya3NwYWNlIH0gZnJvbSBcIkBkZWNvaGVyZS9tZXNoXCI7XG5pbXBvcnQgeyBpbyB9IGZyb20gXCJAZGVjb2hlcmUvbmV4dXMvaW9cIjtcbmltcG9ydCB7IGRlYm91bmNlIH0gZnJvbSBcIkBkZWNvaGVyZS9uZXh1cy9zeXN0ZW1cIjtcbmltcG9ydCB7IHR5cGUgTG9nZ2VyLCBzY3JpYmUgfSBmcm9tIFwiQGRlY29oZXJlL3NjcmliZVwiO1xuaW1wb3J0IHR5cGUgeyBTdWJzY3JpcHRpb24gfSBmcm9tIFwicnhqc1wiO1xuaW1wb3J0IHsgU291cmNlTW9kdWxlTG9hZGVyIH0gZnJvbSBcIi4vc291cmNlLW1vZHVsZS1sb2FkZXIuanNcIjtcblxuY29uc3QgY3VycmVudEZpbGVQYXRoID0gaW8uZmlsZVVybFRvUGF0aChpbXBvcnQubWV0YS51cmwpO1xuY29uc3QgVkVSU0lPTl9VUkxfUEFSQU0gPSBcInZlcnNpb25cIjtcbi8qKiBEZWZhdWx0IHF1aWV0IHdpbmRvdyBiZWZvcmUgYSBmaWxlLWNoYW5nZSByZWJvb3QuICovXG5leHBvcnQgY29uc3QgREVGQVVMVF9SRUJPT1RfREVCT1VOQ0VfTVMgPSAyNTA7XG5cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlUmVib290RGVib3VuY2VNcyh2YWx1ZTogbnVtYmVyIHwgdW5kZWZpbmVkKTogbnVtYmVyIHtcblx0Y29uc3QgZGVsYXkgPSB2YWx1ZSA/PyBERUZBVUxUX1JFQk9PVF9ERUJPVU5DRV9NUztcblx0aWYgKCFOdW1iZXIuaXNGaW5pdGUoZGVsYXkpIHx8IGRlbGF5IDwgMCkge1xuXHRcdHRocm93IG5ldyBFcnJvcihgcmVib290RGVib3VuY2VNcyBtdXN0IGJlIGEgbm9uLW5lZ2F0aXZlIG51bWJlciwgZ290ICR7U3RyaW5nKHZhbHVlKX1gKTtcblx0fVxuXHRyZXR1cm4gZGVsYXk7XG59XG5cbi8qKiBQcm9jZXNzLXdpZGU6IE5vZGUncyBFU00gY2FjaGUgaXMgcHJvY2Vzcy1nbG9iYWwsIGluY2x1ZGluZyBhY3Jvc3MgSG90UmVsb2FkU2VydmVyIGluc3RhbmNlcy4gKi9cbmxldCBtb2R1bGVWZXJzaW9uU2VxID0gMDtcblxuZXhwb3J0IGludGVyZmFjZSBIb3RSZWxvYWRTZXJ2ZXJFdmVudHMge1xuXHRzdGFydDogW107XG5cdHJlYm9vdDogW107XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSG90UmVsb2FkU2VydmVyT3B0aW9ucyB7XG5cdC8qKiBCdWlsZCBjb25maWd1cmF0aW9uIG5hbWUuICovXG5cdGJ1aWxkQ29uZmlnOiBzdHJpbmc7XG5cdC8qKiBOYW1lIG9mIHRoZSBwcm9qZWN0IHRvIHNlcnZlLiBEZWZhdWx0cyB0byB0aGUgZmlyc3QgcHJvamVjdCBpbiB0aGUgd29ya3NwYWNlLiAqL1xuXHRwcm9qZWN0Pzogc3RyaW5nO1xuXHQvKipcblx0ICogTXVsdGlwbGUgRmx1eCBhcHAgcGFja2FnZSBuYW1lcyB0byBib290IGluIG9uZSBwcm9jZXNzIChkaXJlY3Rvcnkgc2xpY2UpLlxuXHQgKiBXaGVuIHNldCwgdGFrZXMgcHJlY2VkZW5jZSBvdmVyIHtAbGluayBwcm9qZWN0fS5cblx0ICovXG5cdHByb2plY3RzPzogcmVhZG9ubHkgc3RyaW5nW107XG5cdC8qKlxuXHQgKiBQcmUtYnVpbHQgV29ya3NwYWNlIGluc3RhbmNlIHRvIHVzZSBpbnN0ZWFkIG9mIHJ1bm5pbmcgV29ya3NwYWNlRmFjdG9yeS5cblx0ICogVXNlZnVsIGluIHRlc3RzIHRvIGJ5cGFzcyBmaWxlc3lzdGVtLWJhc2VkIHdvcmtzcGFjZSBkaXNjb3ZlcnkuXG5cdCAqL1xuXHR3b3Jrc3BhY2U/OiBXb3Jrc3BhY2U7XG5cdC8qKlxuXHQgKiBRdWlldCB3aW5kb3cgaW4gbWlsbGlzZWNvbmRzIGFmdGVyIHRoZSBsYXN0IGFmZmVjdGluZyBzYXZlIGJlZm9yZSBhIHJlYm9vdC5cblx0ICogRGVmYXVsdHMgdG8ge0BsaW5rIERFRkFVTFRfUkVCT09UX0RFQk9VTkNFX01TfS4gUmFpc2UgdGhpcyBmb3IgYWdlbnQgc2F2ZSB0cmFpbnMuXG5cdCAqL1xuXHRyZWJvb3REZWJvdW5jZU1zPzogbnVtYmVyO1xufVxuXG50eXBlIEVudHJ5U3RhdGUgPSB7IHBhdGg6IHN0cmluZzsgbW9kdWxlPzogQXN5bmNEaXNwb3NhYmxlIH07XG5cbmV4cG9ydCBjbGFzcyBIb3RSZWxvYWRTZXJ2ZXIgZXh0ZW5kcyBFdmVudEVtaXR0ZXI8SG90UmVsb2FkU2VydmVyRXZlbnRzPiB7XG5cdC8vIOKUgOKUgCBTdGF0ZSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblx0cHJpdmF0ZSByZWFkb25seSBsb2dnZXI6IExvZ2dlciA9IHNjcmliZS5sb2dnZXIoSG90UmVsb2FkU2VydmVyLm5hbWUpO1xuXHRwcml2YXRlIHJlYWRvbmx5IGxvYWRlciA9IG5ldyBTb3VyY2VNb2R1bGVMb2FkZXIoKTtcblx0cHJpdmF0ZSBkaXNwb3NlZCA9IGZhbHNlO1xuXHQvKiogQWJzb2x1dGUgZW50cnkgcGF0aHMgY3VycmVudGx5IHNlcnZlZCAob25lIG9yIG1vcmUgRmx1eCBhcHBzKS4gKi9cblx0cHJpdmF0ZSBlbnRyaWVzID0gbmV3IE1hcDxzdHJpbmcsIEVudHJ5U3RhdGU+KCk7XG5cdHByaXZhdGUgcGVuZGluZ0VudHJ5UmVib290cyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuXHRwcml2YXRlIHdhdGNoU3Vic2NyaXB0aW9uPzogU3Vic2NyaXB0aW9uO1xuXHRwcml2YXRlIG1vZHVsZUNhY2hlID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZyB8IG51bGw+KCk7XG5cdHByaXZhdGUgZGVwZW5kZW5jaWVzID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZ1tdPigpO1xuXHRwcml2YXRlIHJlYm9vdFRhaWw6IFByb21pc2U8dm9pZD4gPSBQcm9taXNlLnJlc29sdmUoKTtcblx0cHJpdmF0ZSByZWJvb3REZWJvdW5jZUdlbiA9IDA7XG5cdHByaXZhdGUgcmVib290SW5GbGlnaHQgPSBmYWxzZTtcblx0cHJpdmF0ZSByZWJvb3RGb2xsb3dVcCA9IGZhbHNlO1xuXHRwcml2YXRlIHJlYm9vdFF1ZXVlZCA9IGZhbHNlO1xuXHQvKiogTW9kdWxlcyB3aG9zZSByZXZlcnNlLWdyYXBoIGVkZ2VzIGFyZSBwcnVuZWQgYXQgcmVib290LCBub3Qgb24gc2NoZWR1bGUuICovXG5cdHByaXZhdGUgcGVuZGluZ0dyYXBoUHJ1bmUgPSBuZXcgU2V0PHN0cmluZz4oKTtcblx0cHJpdmF0ZSBzY2hlZHVsZVJlYm9vdDogKCkgPT4gdm9pZCA9ICgpID0+IHt9O1xuXG5cdC8vIOKUgOKUgCBQdWJsaWMgQVBJIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG5cdHB1YmxpYyBhc3luYyBzdGFydChvcHRpb25zOiBIb3RSZWxvYWRTZXJ2ZXJPcHRpb25zKSB7XG5cdFx0dGhpcy5kaXNwb3NlZCA9IGZhbHNlO1xuXHRcdHRoaXMuZGVwZW5kZW5jaWVzLmNsZWFyKCk7XG5cdFx0dGhpcy5tb2R1bGVDYWNoZS5jbGVhcigpO1xuXHRcdHRoaXMuZW50cmllcy5jbGVhcigpO1xuXHRcdHRoaXMucGVuZGluZ0VudHJ5UmVib290cy5jbGVhcigpO1xuXHRcdHRoaXMucGVuZGluZ0dyYXBoUHJ1bmUuY2xlYXIoKTtcblx0XHR0aGlzLnJlYm9vdFRhaWwgPSBQcm9taXNlLnJlc29sdmUoKTtcblx0XHR0aGlzLnJlYm9vdEluRmxpZ2h0ID0gZmFsc2U7XG5cdFx0dGhpcy5yZWJvb3RGb2xsb3dVcCA9IGZhbHNlO1xuXHRcdHRoaXMucmVib290UXVldWVkID0gZmFsc2U7XG5cdFx0dGhpcy5iaW5kU2NoZWR1bGVSZWJvb3QocmVzb2x2ZVJlYm9vdERlYm91bmNlTXMob3B0aW9ucy5yZWJvb3REZWJvdW5jZU1zKSk7XG5cblx0XHRjb25zdCB7IGJ1aWxkQ29uZmlnIH0gPSBvcHRpb25zO1xuXG5cdFx0YXdhaXQgdGhpcy5sb2FkZXIuY29uZmlndXJlKHtcblx0XHRcdGJ1aWxkQ29uZmlnLFxuXHRcdFx0d29ya3NwYWNlOiBvcHRpb25zLndvcmtzcGFjZSxcblx0XHRcdHZlcnNpb25GaWxlVXJsOiAoZmlsZVVybCkgPT4gdGhpcy5nZXRDYWNoZWRPck5ldyhmaWxlVXJsKSxcblx0XHRcdG9uUmVzb2x2ZWQ6IHRoaXMub25Qb3N0UmVzb2x2ZSxcblx0XHR9KTtcblxuXHRcdGNvbnN0IHdvcmtzcGFjZSA9IHRoaXMucmVxdWlyZVdvcmtzcGFjZSgpO1xuXHRcdGNvbnN0IHNlbGVjdGVkID0gdGhpcy5yZXNvbHZlUHJvamVjdHMoYnVpbGRDb25maWcsIG9wdGlvbnMpO1xuXHRcdGZvciAoY29uc3QgcHJvamVjdCBvZiBzZWxlY3RlZCkge1xuXHRcdFx0Y29uc3QgZW50cnlQYXRoID0gcGF0aC5yZXNvbHZlKHByb2plY3QuZ2V0U291cmNlRW50cnlQYXRoKCkpO1xuXHRcdFx0dGhpcy5lbnRyaWVzLnNldChlbnRyeVBhdGgsIHsgcGF0aDogZW50cnlQYXRoIH0pO1xuXHRcdH1cblxuXHRcdHRoaXMubG9hZGVyLnJlZ2lzdGVySG9va3MoKTtcblx0XHR0aGlzLmludmFsaWRhdGVBbGxTb3VyY2VGaWxlcygpO1xuXG5cdFx0YXdhaXQgd29ya3NwYWNlLndhdGNoKGJ1aWxkQ29uZmlnKTtcblx0XHR0aGlzLndhdGNoU3Vic2NyaXB0aW9uID0gd29ya3NwYWNlLnByb2plY3RGaWxlQ2hhbmdlZCQuc3Vic2NyaWJlKHRoaXMub25GaWxlQ2hhbmdlKTtcblxuXHRcdGZvciAoY29uc3QgZW50cnkgb2YgdGhpcy5lbnRyaWVzLnZhbHVlcygpKSB7XG5cdFx0XHR0aGlzLmxvZ2dlci50cmFjZShgU2VydmluZyAke2VudHJ5LnBhdGh9YCk7XG5cdFx0fVxuXHRcdGF3YWl0IHRoaXMuYm9vdEVudHJpZXMoWy4uLnRoaXMuZW50cmllcy5rZXlzKCldKTtcblx0XHR0aGlzLmVtaXQoXCJzdGFydFwiKTtcblx0fVxuXG5cdHB1YmxpYyBhc3luYyBkaXNwb3NlKCkge1xuXHRcdGlmICh0aGlzLmRpc3Bvc2VkKSByZXR1cm47XG5cdFx0dGhpcy5kaXNwb3NlZCA9IHRydWU7XG5cdFx0dGhpcy5yZWJvb3REZWJvdW5jZUdlbiArPSAxO1xuXHRcdHRoaXMud2F0Y2hTdWJzY3JpcHRpb24/LnVuc3Vic2NyaWJlKCk7XG5cdFx0YXdhaXQgdGhpcy5yZWJvb3RUYWlsO1xuXHRcdGF3YWl0IHRoaXMuZGlzcG9zZUVudHJpZXMoWy4uLnRoaXMuZW50cmllcy5rZXlzKCldKTtcblx0XHR0aGlzLmxvYWRlci5kaXNwb3NlKCk7XG5cdH1cblxuXHRwdWJsaWMgYXN5bmMgW1N5bWJvbC5hc3luY0Rpc3Bvc2VdKCkge1xuXHRcdGF3YWl0IHRoaXMuZGlzcG9zZSgpO1xuXHR9XG5cblx0Ly8g4pSA4pSAIExpZmVjeWNsZSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuXHRwcml2YXRlIGFzeW5jIGJvb3RFbnRyaWVzKGVudHJ5UGF0aHM6IHJlYWRvbmx5IHN0cmluZ1tdKSB7XG5cdFx0YXdhaXQgUHJvbWlzZS5hbGwoZW50cnlQYXRocy5tYXAoKGVudHJ5UGF0aCkgPT4gdGhpcy5ib290RW50cnkoZW50cnlQYXRoKSkpO1xuXHR9XG5cblx0cHJpdmF0ZSBhc3luYyBib290RW50cnkoZW50cnlQYXRoOiBzdHJpbmcpIHtcblx0XHRjb25zdCBzdGF0ZSA9IHRoaXMuZW50cmllcy5nZXQoZW50cnlQYXRoKTtcblx0XHRpZiAoc3RhdGUgPT0gbnVsbCkgcmV0dXJuO1xuXHRcdHRyeSB7XG5cdFx0XHRjb25zdCBtb2QgPSAoYXdhaXQgdGhpcy5sb2FkZXIuaW1wb3J0RW50cnkoZW50cnlQYXRoKSkgYXMge1xuXHRcdFx0XHRkZWZhdWx0PzogQXN5bmNEaXNwb3NhYmxlO1xuXHRcdFx0fTtcblx0XHRcdHN0YXRlLm1vZHVsZSA9IG1vZD8uZGVmYXVsdDtcblx0XHR9IGNhdGNoIChlcnJvcikge1xuXHRcdFx0c3RhdGUubW9kdWxlID0gdW5kZWZpbmVkO1xuXHRcdFx0dGhpcy5sb2dnZXIuZXJyb3IoXG5cdFx0XHRcdFwiVGhlcmUgd2FzIGFuIGVycm9yIGJvb3RpbmcgdGhlIGVudHJ5IHBvaW50LiBZb3VyIGFwcGxpY2F0aW9uIG1heSBub3QgZnVuY3Rpb24gYXMgZXhwZWN0ZWRcIixcblx0XHRcdFx0ZXJyb3IsXG5cdFx0XHQpO1xuXHRcdH1cblx0fVxuXG5cdHByaXZhdGUgYmluZFNjaGVkdWxlUmVib290KGRlbGF5TXM6IG51bWJlcikge1xuXHRcdGNvbnN0IGdlbiA9ICsrdGhpcy5yZWJvb3REZWJvdW5jZUdlbjtcblx0XHR0aGlzLnNjaGVkdWxlUmVib290ID0gZGVib3VuY2UoYXN5bmMgKCkgPT4ge1xuXHRcdFx0aWYgKHRoaXMuZGlzcG9zZWQgfHwgZ2VuICE9PSB0aGlzLnJlYm9vdERlYm91bmNlR2VuKSByZXR1cm47XG5cdFx0XHR0aGlzLnJlcXVlc3RSZWJvb3QoKTtcblx0XHR9LCBkZWxheU1zKTtcblx0fVxuXG5cdHByaXZhdGUgcmVxdWVzdFJlYm9vdCgpIHtcblx0XHRpZiAodGhpcy5kaXNwb3NlZCkgcmV0dXJuO1xuXHRcdGlmICh0aGlzLnJlYm9vdEluRmxpZ2h0KSB7XG5cdFx0XHR0aGlzLnJlYm9vdEZvbGxvd1VwID0gdHJ1ZTtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cdFx0aWYgKHRoaXMucmVib290UXVldWVkKSByZXR1cm47XG5cdFx0dGhpcy5yZWJvb3RRdWV1ZWQgPSB0cnVlO1xuXHRcdHRoaXMucmVib290VGFpbCA9IHRoaXMucmVib290VGFpbC50aGVuKFxuXHRcdFx0KCkgPT4gdGhpcy5ydW5SZWJvb3QoKSxcblx0XHRcdCgpID0+IHRoaXMucnVuUmVib290KCksXG5cdFx0KTtcblx0fVxuXG5cdHByaXZhdGUgYXN5bmMgcnVuUmVib290KCkge1xuXHRcdHRoaXMucmVib290UXVldWVkID0gZmFsc2U7XG5cdFx0aWYgKHRoaXMuZGlzcG9zZWQpIHJldHVybjtcblx0XHR0aGlzLnJlYm9vdEluRmxpZ2h0ID0gdHJ1ZTtcblx0XHR0cnkge1xuXHRcdFx0ZG8ge1xuXHRcdFx0XHR0aGlzLnJlYm9vdEZvbGxvd1VwID0gZmFsc2U7XG5cdFx0XHRcdGlmICh0aGlzLmRpc3Bvc2VkKSByZXR1cm47XG5cdFx0XHRcdGNvbnN0IHRvUmVib290ID1cblx0XHRcdFx0XHR0aGlzLnBlbmRpbmdFbnRyeVJlYm9vdHMuc2l6ZSA+IDBcblx0XHRcdFx0XHRcdD8gWy4uLnRoaXMucGVuZGluZ0VudHJ5UmVib290c11cblx0XHRcdFx0XHRcdDogWy4uLnRoaXMuZW50cmllcy5rZXlzKCldO1xuXHRcdFx0XHR0aGlzLnBlbmRpbmdFbnRyeVJlYm9vdHMuY2xlYXIoKTtcblx0XHRcdFx0Ly8gRHJvcCByZXZlcnNlIGVkZ2VzIG9ubHkgd2hlbiByZWJvb3Rpbmcgc28gbGF0ZXIgc2F2ZXMgaW4gdGhlIGRlYm91bmNlXG5cdFx0XHRcdC8vIHdpbmRvdyBjYW4gc3RpbGwgd2FsayB0aGUgZ3JhcGggYW5kIHJlc2V0IHRoZSBxdWlldCB0aW1lci5cblx0XHRcdFx0dGhpcy5wcnVuZVBlbmRpbmdEZXBlbmRlbmN5RWRnZXMoKTtcblx0XHRcdFx0dGhpcy5sb2dnZXIudHJhY2UoYFJlYm9vdGluZyAke3RvUmVib290Lmxlbmd0aH0gZW50cnkgbW9kdWxlKHMpYCk7XG5cdFx0XHRcdGF3YWl0IHRoaXMuZGlzcG9zZUVudHJpZXModG9SZWJvb3QpO1xuXHRcdFx0XHRhd2FpdCB0aGlzLmJvb3RFbnRyaWVzKHRvUmVib290KTtcblx0XHRcdFx0dGhpcy5lbWl0KFwicmVib290XCIpO1xuXHRcdFx0fSB3aGlsZSAodGhpcy5yZWJvb3RGb2xsb3dVcCAmJiAhdGhpcy5kaXNwb3NlZCk7XG5cdFx0fSBmaW5hbGx5IHtcblx0XHRcdGNvbnN0IG5lZWRzRm9sbG93VXAgPSB0aGlzLnJlYm9vdEZvbGxvd1VwICYmICF0aGlzLmRpc3Bvc2VkO1xuXHRcdFx0dGhpcy5yZWJvb3RGb2xsb3dVcCA9IGZhbHNlO1xuXHRcdFx0dGhpcy5yZWJvb3RJbkZsaWdodCA9IGZhbHNlO1xuXHRcdFx0aWYgKG5lZWRzRm9sbG93VXApIHRoaXMucmVxdWVzdFJlYm9vdCgpO1xuXHRcdH1cblx0fVxuXG5cdHByaXZhdGUgYXN5bmMgZGlzcG9zZUVudHJpZXMoZW50cnlQYXRoczogcmVhZG9ubHkgc3RyaW5nW10pIHtcblx0XHRhd2FpdCBQcm9taXNlLmFsbChlbnRyeVBhdGhzLm1hcCgoZW50cnlQYXRoKSA9PiB0aGlzLmRpc3Bvc2VFbnRyeShlbnRyeVBhdGgpKSk7XG5cdH1cblxuXHRwcml2YXRlIGFzeW5jIGRpc3Bvc2VFbnRyeShlbnRyeVBhdGg/OiBzdHJpbmcpIHtcblx0XHRjb25zdCBwYXRocyA9IGVudHJ5UGF0aCAhPSBudWxsID8gW2VudHJ5UGF0aF0gOiBbLi4udGhpcy5lbnRyaWVzLmtleXMoKV07XG5cdFx0Zm9yIChjb25zdCBwIG9mIHBhdGhzKSB7XG5cdFx0XHRjb25zdCBzdGF0ZSA9IHRoaXMuZW50cmllcy5nZXQocCk7XG5cdFx0XHRpZiAoc3RhdGUgPT0gbnVsbCkgY29udGludWU7XG5cdFx0XHRjb25zdCBlbnRyeSA9IHN0YXRlLm1vZHVsZTtcblx0XHRcdHN0YXRlLm1vZHVsZSA9IHVuZGVmaW5lZDtcblx0XHRcdHRyeSB7XG5cdFx0XHRcdGF3YWl0IGVudHJ5Py5bU3ltYm9sLmFzeW5jRGlzcG9zZV0oKTtcblx0XHRcdH0gY2F0Y2ggKGVycm9yKSB7XG5cdFx0XHRcdHRoaXMubG9nZ2VyLmVycm9yKFwiRW50cnkgYXN5bmNEaXNwb3NlIGZhaWxlZFwiLCBlcnJvcik7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0Ly8g4pSA4pSAIFNldHVwIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG5cdHByaXZhdGUgcmVxdWlyZVdvcmtzcGFjZSgpOiBXb3Jrc3BhY2Uge1xuXHRcdGNvbnN0IHdvcmtzcGFjZSA9IHRoaXMubG9hZGVyLmdldFdvcmtzcGFjZSgpO1xuXHRcdGlmICh3b3Jrc3BhY2UgPT0gbnVsbCkge1xuXHRcdFx0dGhyb3cgbmV3IEVycm9yKFwiU291cmNlTW9kdWxlTG9hZGVyIGhhcyBubyB3b3Jrc3BhY2UgYWZ0ZXIgY29uZmlndXJlXCIpO1xuXHRcdH1cblx0XHRyZXR1cm4gd29ya3NwYWNlO1xuXHR9XG5cblx0cHJpdmF0ZSByZXNvbHZlUHJvamVjdHMoYnVpbGRDb25maWc6IHN0cmluZywgb3B0aW9uczogSG90UmVsb2FkU2VydmVyT3B0aW9ucyk6IFByb2plY3RbXSB7XG5cdFx0Y29uc3QgcHJvamVjdHMgPSB0aGlzLmxvYWRlci5nZXRXb3Jrc3BhY2UoKT8uZ2V0UHJvamVjdHMoYnVpbGRDb25maWcpID8/IFtdO1xuXHRcdGNvbnN0IG5hbWVzID1cblx0XHRcdG9wdGlvbnMucHJvamVjdHMgIT0gbnVsbCAmJiBvcHRpb25zLnByb2plY3RzLmxlbmd0aCA+IDBcblx0XHRcdFx0PyBvcHRpb25zLnByb2plY3RzXG5cdFx0XHRcdDogb3B0aW9ucy5wcm9qZWN0ICE9IG51bGxcblx0XHRcdFx0XHQ/IFtvcHRpb25zLnByb2plY3RdXG5cdFx0XHRcdFx0OiB1bmRlZmluZWQ7XG5cblx0XHRpZiAobmFtZXMgPT0gbnVsbCkge1xuXHRcdFx0Y29uc3QgZmlyc3QgPSBwcm9qZWN0cy5hdCgwKTtcblx0XHRcdGlmIChmaXJzdCA9PSBudWxsKSB7XG5cdFx0XHRcdHRocm93IG5ldyBFcnJvcihgTm8gcHJvamVjdHMgZm91bmQgZm9yIGNvbmZpZ3VyYXRpb246ICR7YnVpbGRDb25maWd9YCk7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gW2ZpcnN0XTtcblx0XHR9XG5cblx0XHRjb25zdCBzZWxlY3RlZDogUHJvamVjdFtdID0gW107XG5cdFx0Zm9yIChjb25zdCBuYW1lIG9mIG5hbWVzKSB7XG5cdFx0XHRjb25zdCBmb3VuZCA9IHByb2plY3RzLmZpbmQoKHApID0+IHAubmFtZSA9PT0gbmFtZSk7XG5cdFx0XHRpZiAoZm91bmQgPT0gbnVsbCkge1xuXHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoYFByb2plY3QgXCIke25hbWV9XCIgbm90IGZvdW5kIGluIHdvcmtzcGFjZWApO1xuXHRcdFx0fVxuXHRcdFx0c2VsZWN0ZWQucHVzaChmb3VuZCk7XG5cdFx0fVxuXHRcdHJldHVybiBzZWxlY3RlZDtcblx0fVxuXG5cdC8qKlxuXHQgKiBQb3N0LW5leHQgZGVwZW5kZW5jeSB0cmFja2VyOiByZWNvcmRzIHdoaWNoIHNvdXJjZSBmaWxlcyBpbXBvcnQgd2hpY2hcblx0ICogb3RoZXIgc291cmNlIGZpbGVzIHNvIHRoYXQgcmVsb2FkSWZBZmZlY3RlZCBjYW4gdHJhdmVyc2UgdGhlIGdyYXBoLlxuXHQgKi9cblx0cHJpdmF0ZSBvblBvc3RSZXNvbHZlID0gKHJlc3VsdDogUmVzb2x2ZUZuT3V0cHV0LCBwYXJlbnRVcmw6IHN0cmluZykgPT4ge1xuXHRcdGNvbnN0IHsgdXJsIH0gPSByZXN1bHQ7XG5cdFx0Y29uc3QgcGFyZW50VXJsQ2xlYW4gPSBwYXJlbnRVcmwuc3BsaXQoXCI/XCIpWzBdO1xuXG5cdFx0bGV0IGZpbGVQYXRoOiBzdHJpbmc7XG5cdFx0bGV0IHBhcmVudFBhdGg6IHN0cmluZztcblxuXHRcdHRyeSB7XG5cdFx0XHRjb25zdCB1cmxPYmogPSBuZXcgVVJMKHVybCk7XG5cdFx0XHR1cmxPYmouc2VhcmNoID0gXCJcIjtcblx0XHRcdGZpbGVQYXRoID0gaW8uZmlsZVVybFRvUGF0aCh1cmxPYmoudG9TdHJpbmcoKSk7XG5cdFx0fSBjYXRjaCB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0dHJ5IHtcblx0XHRcdHBhcmVudFBhdGggPSBpby5maWxlVXJsVG9QYXRoKHBhcmVudFVybENsZWFuKTtcblx0XHR9IGNhdGNoIHtcblx0XHRcdHBhcmVudFBhdGggPSBcIlwiO1xuXHRcdH1cblxuXHRcdGNvbnN0IGlzU291cmNlID0gdGhpcy5sb2FkZXIuaGFzU291cmNlRmlsZShmaWxlUGF0aCk7XG5cdFx0Y29uc3QgcGFyZW50SXNTb3VyY2UgPSB0aGlzLmxvYWRlci5oYXNTb3VyY2VGaWxlKHBhcmVudFBhdGgpO1xuXG5cdFx0aWYgKGlzU291cmNlIHx8IHBhcmVudElzU291cmNlKSB7XG5cdFx0XHR0aGlzLnRyYWNrRGVwZW5kZW5jeShmaWxlUGF0aCwgcGFyZW50UGF0aCk7XG5cdFx0fVxuXHR9O1xuXG5cdC8vIOKUgOKUgCBGaWxlIHdhdGNoaW5nIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG5cdHByaXZhdGUgb25GaWxlQ2hhbmdlID0gKGV2dDogUHJvamVjdEZpbGVFdmVudCkgPT4ge1xuXHRcdGNvbnN0IHsgZmlsZSwgZXZlbnROYW1lLCBwcm9qZWN0IH0gPSBldnQ7XG5cdFx0Y29uc3QgZnVsbFBhdGggPSBmaWxlLmZ1bGxQYXRoO1xuXG5cdFx0dGhpcy5sb2dnZXIudHJhY2UoYEZpbGUgJHtldmVudE5hbWV9OiAke2Z1bGxQYXRofWApO1xuXG5cdFx0aWYgKGV2ZW50TmFtZSA9PT0gaW8uV2F0Y2hFdmVudHMudW5saW5rKSB7XG5cdFx0XHR0aGlzLmxvYWRlci5pbnZhbGlkYXRlVHJhbnNwaWxlKGZ1bGxQYXRoKTtcblx0XHRcdHRoaXMubW9kdWxlQ2FjaGUuc2V0KGZ1bGxQYXRoLCBudWxsKTtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRpZiAoZXZlbnROYW1lID09PSBpby5XYXRjaEV2ZW50cy5hZGQpIHtcblx0XHRcdGlmIChwcm9qZWN0LmlzU291cmNlRmlsZShmaWxlKSkge1xuXHRcdFx0XHR0aGlzLmxvYWRlci5zZXRTb3VyY2VGaWxlKGZ1bGxQYXRoLCBwcm9qZWN0KTtcblx0XHRcdFx0dGhpcy5tb2R1bGVDYWNoZS5zZXQoZnVsbFBhdGgsIG51bGwpO1xuXHRcdFx0XHR0aGlzLnJlbG9hZElmQWZmZWN0ZWQoZnVsbFBhdGgpO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdC8vIGNoYW5nZVxuXHRcdGlmICghcHJvamVjdC5pc1NvdXJjZUZpbGUoZmlsZSkpIHJldHVybjtcblx0XHR0aGlzLmxvYWRlci5pbnZhbGlkYXRlVHJhbnNwaWxlKGZ1bGxQYXRoKTtcblx0XHR0aGlzLnJlbG9hZElmQWZmZWN0ZWQoZnVsbFBhdGgpO1xuXHR9O1xuXG5cdHByaXZhdGUgcmVsb2FkSWZBZmZlY3RlZChmdWxsUGF0aDogc3RyaW5nKTogYm9vbGVhbiB7XG5cdFx0Y29uc3QgZGVwcyA9IHRoaXMuZ2V0RGVwZW5kZW5jeUdyYXBoKGZ1bGxQYXRoKTtcblx0XHRjb25zdCBtb2R1bGVzID0gWy4uLm5ldyBTZXQoWy4uLmRlcHMsIGZ1bGxQYXRoXSldO1xuXHRcdGNvbnN0IGFmZmVjdGVkRW50cmllcyA9IFsuLi50aGlzLmVudHJpZXMua2V5cygpXS5maWx0ZXIoKGVudHJ5UGF0aCkgPT5cblx0XHRcdG1vZHVsZXMuaW5jbHVkZXMoZW50cnlQYXRoKSxcblx0XHQpO1xuXG5cdFx0aWYgKGFmZmVjdGVkRW50cmllcy5sZW5ndGggPT09IDApIHtcblx0XHRcdHRoaXMubG9nZ2VyLnRyYWNlKGBDaGFuZ2UgaW4gJHtmdWxsUGF0aH0gZG9lcyBub3QgYWZmZWN0IGVudHJ5IOKAlCBza2lwcGluZyByZWxvYWRgKTtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cblx0XHR0aGlzLmxvZ2dlci50cmFjZShcblx0XHRcdGBDaGFuZ2UgaW4gJHtmdWxsUGF0aH0gYWZmZWN0cyAke21vZHVsZXMubGVuZ3RofSBtb2R1bGUocykg4oCUIHNjaGVkdWxpbmcgcmVsb2FkYCxcblx0XHQpO1xuXHRcdHRoaXMuaW52YWxpZGF0ZU1vZHVsZUNhY2hlcyguLi5tb2R1bGVzKTtcblx0XHRmb3IgKGNvbnN0IG1vZHVsZSBvZiBtb2R1bGVzKSB7XG5cdFx0XHR0aGlzLnBlbmRpbmdHcmFwaFBydW5lLmFkZChtb2R1bGUpO1xuXHRcdH1cblx0XHRmb3IgKGNvbnN0IGVudHJ5UGF0aCBvZiBhZmZlY3RlZEVudHJpZXMpIHtcblx0XHRcdHRoaXMucGVuZGluZ0VudHJ5UmVib290cy5hZGQoZW50cnlQYXRoKTtcblx0XHR9XG5cdFx0dGhpcy5zY2hlZHVsZVJlYm9vdCgpO1xuXHRcdHJldHVybiB0cnVlO1xuXHR9XG5cblx0Ly8g4pSA4pSAIERlcGVuZGVuY3kgZ3JhcGgg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cblx0cHJpdmF0ZSBnZXREZXBlbmRlbmN5R3JhcGgobW9kdWxlSWQ6IHN0cmluZywgcGFyZW50TW9kdWxlczogc3RyaW5nW10gPSBbXSk6IHN0cmluZ1tdIHtcblx0XHRpZiAodGhpcy5pc1NlbGYobW9kdWxlSWQpKSByZXR1cm4gW107XG5cblx0XHRjb25zdCBtb2R1bGVEZXBzID0gdGhpcy5kZXBlbmRlbmNpZXMuZ2V0KG1vZHVsZUlkKSA/PyBbXTtcblx0XHRpZiAocGFyZW50TW9kdWxlcy5pbmNsdWRlcyhtb2R1bGVJZCkpIHtcblx0XHRcdHRoaXMubG9nZ2VyLmVycm9yKGBDaXJjdWxhciByZWZlcmVuY2UgZGV0ZWN0ZWQ6ICR7bW9kdWxlSWR9YCk7XG5cdFx0XHRyZXR1cm4gW107XG5cdFx0fVxuXG5cdFx0bGV0IHN1YkRlcHM6IHN0cmluZ1tdID0gW107XG5cdFx0Zm9yIChjb25zdCBkZXAgb2YgbW9kdWxlRGVwcykge1xuXHRcdFx0aWYgKCF0aGlzLmxvYWRlci5oYXNTb3VyY2VGaWxlKGRlcCkpIGNvbnRpbnVlO1xuXHRcdFx0Y29uc3Qgc3VicyA9IHRoaXMuZ2V0RGVwZW5kZW5jeUdyYXBoKGRlcCwgW21vZHVsZUlkLCAuLi5wYXJlbnRNb2R1bGVzXSk7XG5cdFx0XHRzdWJEZXBzID0gWy4uLnN1YkRlcHMsIC4uLnN1YnNdO1xuXHRcdH1cblxuXHRcdHJldHVybiBbLi4ubmV3IFNldChbLi4ubW9kdWxlRGVwcywgLi4uc3ViRGVwc10pXTtcblx0fVxuXG5cdHByaXZhdGUgdHJhY2tEZXBlbmRlbmN5KGZpbGVQYXRoOiBzdHJpbmcsIHBhcmVudFBhdGg6IHN0cmluZykge1xuXHRcdGlmICghcGFyZW50UGF0aCkgcmV0dXJuO1xuXHRcdGNvbnN0IGRlcHMgPSB0aGlzLmRlcGVuZGVuY2llcy5nZXQoZmlsZVBhdGgpID8/IFtdO1xuXHRcdGNvbnN0IHVwZGF0ZWREZXBzID0gbmV3IFNldChbLi4uZGVwcywgcGFyZW50UGF0aF0pO1xuXHRcdHRoaXMuZGVwZW5kZW5jaWVzLnNldChmaWxlUGF0aCwgWy4uLnVwZGF0ZWREZXBzXSk7XG5cdH1cblxuXHQvLyDilIDilIAgTW9kdWxlIGNhY2hlIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG5cdHByaXZhdGUgZ2V0Q2FjaGVkT3JOZXcobW9kdWxlVXJsOiBzdHJpbmcpIHtcblx0XHRjb25zdCBmaWxlUGF0aCA9IGlvLmZpbGVVcmxUb1BhdGgobW9kdWxlVXJsKTtcblx0XHRjb25zdCBjYWNoZWQgPSB0aGlzLm1vZHVsZUNhY2hlLmdldChmaWxlUGF0aCk7XG5cdFx0Y29uc3QgdmVyc2lvbmVkID0gY2FjaGVkID8/IHRoaXMudmVyc2lvbk1vZHVsZShtb2R1bGVVcmwpO1xuXHRcdHRoaXMubW9kdWxlQ2FjaGUuc2V0KGZpbGVQYXRoLCB2ZXJzaW9uZWQpO1xuXHRcdHJldHVybiB2ZXJzaW9uZWQ7XG5cdH1cblxuXHRwcml2YXRlIHZlcnNpb25Nb2R1bGUobW9kdWxlVXJsOiBzdHJpbmcpIHtcblx0XHRjb25zdCB2ZXJzaW9uZWRVcmwgPSBuZXcgVVJMKG1vZHVsZVVybCk7XG5cdFx0dmVyc2lvbmVkVXJsLnNlYXJjaFBhcmFtcy5zZXQoVkVSU0lPTl9VUkxfUEFSQU0sIFN0cmluZygrK21vZHVsZVZlcnNpb25TZXEpKTtcblx0XHRyZXR1cm4gdmVyc2lvbmVkVXJsLnRvU3RyaW5nKCk7XG5cdH1cblxuXHRwcml2YXRlIGludmFsaWRhdGVNb2R1bGVDYWNoZXMoLi4ubW9kdWxlczogc3RyaW5nW10pIHtcblx0XHRmb3IgKGNvbnN0IG1vZHVsZSBvZiBtb2R1bGVzKSB7XG5cdFx0XHR0aGlzLm1vZHVsZUNhY2hlLnNldChtb2R1bGUsIG51bGwpO1xuXHRcdFx0dGhpcy5sb2FkZXIuaW52YWxpZGF0ZVRyYW5zcGlsZShtb2R1bGUpO1xuXHRcdH1cblx0fVxuXG5cdHByaXZhdGUgcHJ1bmVQZW5kaW5nRGVwZW5kZW5jeUVkZ2VzKCkge1xuXHRcdGNvbnN0IG1vZHVsZXMgPSBbLi4udGhpcy5wZW5kaW5nR3JhcGhQcnVuZV07XG5cdFx0dGhpcy5wZW5kaW5nR3JhcGhQcnVuZS5jbGVhcigpO1xuXHRcdHRoaXMucHJ1bmVEZXBlbmRlbmN5UGFyZW50cyguLi5tb2R1bGVzKTtcblx0fVxuXG5cdC8qKiBSZW1vdmUgdGhlc2UgbW9kdWxlcyBhcyBwYXJlbnRzIHNvIGJvb3QgY2FuIHJlYnVpbGQgZWRnZXMgd2l0aG91dCBzdGFsZSBpbXBvcnRlcnMuICovXG5cdHByaXZhdGUgcHJ1bmVEZXBlbmRlbmN5UGFyZW50cyguLi5tb2R1bGVzOiBzdHJpbmdbXSkge1xuXHRcdGZvciAoY29uc3QgbW9kdWxlIG9mIG1vZHVsZXMpIHtcblx0XHRcdGZvciAoY29uc3QgW2tleSwgcGFyZW50c10gb2YgdGhpcy5kZXBlbmRlbmNpZXMpIHtcblx0XHRcdFx0Y29uc3QgZmlsdGVyZWQgPSBwYXJlbnRzLmZpbHRlcigocCkgPT4gcCAhPT0gbW9kdWxlKTtcblx0XHRcdFx0aWYgKGZpbHRlcmVkLmxlbmd0aCA9PT0gMCkge1xuXHRcdFx0XHRcdHRoaXMuZGVwZW5kZW5jaWVzLmRlbGV0ZShrZXkpO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHRoaXMuZGVwZW5kZW5jaWVzLnNldChrZXksIGZpbHRlcmVkKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdHByaXZhdGUgaW52YWxpZGF0ZUFsbFNvdXJjZUZpbGVzKCkge1xuXHRcdGZvciAoY29uc3QgZmlsZVBhdGggb2YgdGhpcy5sb2FkZXIuc291cmNlRmlsZVBhdGhzKCkpIHtcblx0XHRcdHRoaXMubW9kdWxlQ2FjaGUuc2V0KGZpbGVQYXRoLCBudWxsKTtcblx0XHR9XG5cdH1cblxuXHRwcml2YXRlIGlzU2VsZihmaWxlUGF0aDogc3RyaW5nKSB7XG5cdFx0cmV0dXJuIGN1cnJlbnRGaWxlUGF0aCA9PT0gcGF0aC5yZXNvbHZlKGZpbGVQYXRoKTtcblx0fVxufVxuIl0sIm5hbWVzIjpbIkRFRkFVTFRfUkVCT09UX0RFQk9VTkNFX01TIiwiSG90UmVsb2FkU2VydmVyIiwicmVzb2x2ZVJlYm9vdERlYm91bmNlTXMiLCJjdXJyZW50RmlsZVBhdGgiLCJpbyIsImZpbGVVcmxUb1BhdGgiLCJWRVJTSU9OX1VSTF9QQVJBTSIsInZhbHVlIiwiZGVsYXkiLCJOdW1iZXIiLCJpc0Zpbml0ZSIsIkVycm9yIiwiU3RyaW5nIiwibW9kdWxlVmVyc2lvblNlcSIsIkV2ZW50RW1pdHRlciIsImxvZ2dlciIsInNjcmliZSIsIm5hbWUiLCJsb2FkZXIiLCJTb3VyY2VNb2R1bGVMb2FkZXIiLCJkaXNwb3NlZCIsImVudHJpZXMiLCJNYXAiLCJwZW5kaW5nRW50cnlSZWJvb3RzIiwiU2V0Iiwid2F0Y2hTdWJzY3JpcHRpb24iLCJtb2R1bGVDYWNoZSIsImRlcGVuZGVuY2llcyIsInJlYm9vdFRhaWwiLCJQcm9taXNlIiwicmVzb2x2ZSIsInJlYm9vdERlYm91bmNlR2VuIiwicmVib290SW5GbGlnaHQiLCJyZWJvb3RGb2xsb3dVcCIsInJlYm9vdFF1ZXVlZCIsInBlbmRpbmdHcmFwaFBydW5lIiwic2NoZWR1bGVSZWJvb3QiLCJzdGFydCIsIm9wdGlvbnMiLCJjbGVhciIsImJpbmRTY2hlZHVsZVJlYm9vdCIsInJlYm9vdERlYm91bmNlTXMiLCJidWlsZENvbmZpZyIsImNvbmZpZ3VyZSIsIndvcmtzcGFjZSIsInZlcnNpb25GaWxlVXJsIiwiZmlsZVVybCIsImdldENhY2hlZE9yTmV3Iiwib25SZXNvbHZlZCIsIm9uUG9zdFJlc29sdmUiLCJyZXF1aXJlV29ya3NwYWNlIiwic2VsZWN0ZWQiLCJyZXNvbHZlUHJvamVjdHMiLCJwcm9qZWN0IiwiZW50cnlQYXRoIiwicGF0aCIsImdldFNvdXJjZUVudHJ5UGF0aCIsInNldCIsInJlZ2lzdGVySG9va3MiLCJpbnZhbGlkYXRlQWxsU291cmNlRmlsZXMiLCJ3YXRjaCIsInByb2plY3RGaWxlQ2hhbmdlZCQiLCJzdWJzY3JpYmUiLCJvbkZpbGVDaGFuZ2UiLCJlbnRyeSIsInZhbHVlcyIsInRyYWNlIiwiYm9vdEVudHJpZXMiLCJrZXlzIiwiZW1pdCIsImRpc3Bvc2UiLCJ1bnN1YnNjcmliZSIsImRpc3Bvc2VFbnRyaWVzIiwiU3ltYm9sIiwiYXN5bmNEaXNwb3NlIiwiZW50cnlQYXRocyIsImFsbCIsIm1hcCIsImJvb3RFbnRyeSIsInN0YXRlIiwiZ2V0IiwibW9kIiwiaW1wb3J0RW50cnkiLCJtb2R1bGUiLCJkZWZhdWx0IiwiZXJyb3IiLCJ1bmRlZmluZWQiLCJkZWxheU1zIiwiZ2VuIiwiZGVib3VuY2UiLCJyZXF1ZXN0UmVib290IiwidGhlbiIsInJ1blJlYm9vdCIsInRvUmVib290Iiwic2l6ZSIsInBydW5lUGVuZGluZ0RlcGVuZGVuY3lFZGdlcyIsImxlbmd0aCIsIm5lZWRzRm9sbG93VXAiLCJkaXNwb3NlRW50cnkiLCJwYXRocyIsInAiLCJnZXRXb3Jrc3BhY2UiLCJwcm9qZWN0cyIsImdldFByb2plY3RzIiwibmFtZXMiLCJmaXJzdCIsImF0IiwiZm91bmQiLCJmaW5kIiwicHVzaCIsInJlc3VsdCIsInBhcmVudFVybCIsInVybCIsInBhcmVudFVybENsZWFuIiwic3BsaXQiLCJmaWxlUGF0aCIsInBhcmVudFBhdGgiLCJ1cmxPYmoiLCJVUkwiLCJzZWFyY2giLCJ0b1N0cmluZyIsImlzU291cmNlIiwiaGFzU291cmNlRmlsZSIsInBhcmVudElzU291cmNlIiwidHJhY2tEZXBlbmRlbmN5IiwiZXZ0IiwiZmlsZSIsImV2ZW50TmFtZSIsImZ1bGxQYXRoIiwiV2F0Y2hFdmVudHMiLCJ1bmxpbmsiLCJpbnZhbGlkYXRlVHJhbnNwaWxlIiwiYWRkIiwiaXNTb3VyY2VGaWxlIiwic2V0U291cmNlRmlsZSIsInJlbG9hZElmQWZmZWN0ZWQiLCJkZXBzIiwiZ2V0RGVwZW5kZW5jeUdyYXBoIiwibW9kdWxlcyIsImFmZmVjdGVkRW50cmllcyIsImZpbHRlciIsImluY2x1ZGVzIiwiaW52YWxpZGF0ZU1vZHVsZUNhY2hlcyIsIm1vZHVsZUlkIiwicGFyZW50TW9kdWxlcyIsImlzU2VsZiIsIm1vZHVsZURlcHMiLCJzdWJEZXBzIiwiZGVwIiwic3VicyIsInVwZGF0ZWREZXBzIiwibW9kdWxlVXJsIiwiY2FjaGVkIiwidmVyc2lvbmVkIiwidmVyc2lvbk1vZHVsZSIsInZlcnNpb25lZFVybCIsInNlYXJjaFBhcmFtcyIsInBydW5lRGVwZW5kZW5jeVBhcmVudHMiLCJrZXkiLCJwYXJlbnRzIiwiZmlsdGVyZWQiLCJkZWxldGUiLCJzb3VyY2VGaWxlUGF0aHMiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7O1FBYWFBO2VBQUFBOztRQTBDQUM7ZUFBQUE7O1FBeENHQztlQUFBQTs7OzRCQWZhO2lFQUVaO29CQUVFO3dCQUNNO3dCQUNXO29DQUVEOzs7Ozs7QUFFbkMsTUFBTUMsa0JBQWtCQyxNQUFFLENBQUNDLGFBQWEsQ0FBQztBQUN6QyxNQUFNQyxvQkFBb0I7QUFFbkIsTUFBTU4sNkJBQTZCO0FBRW5DLFNBQVNFLHdCQUF3QkssS0FBeUI7SUFDaEUsTUFBTUMsUUFBUUQsU0FBU1A7SUFDdkIsSUFBSSxDQUFDUyxPQUFPQyxRQUFRLENBQUNGLFVBQVVBLFFBQVEsR0FBRztRQUN6QyxNQUFNLElBQUlHLE1BQU0sQ0FBQyxvREFBb0QsRUFBRUMsT0FBT0wsUUFBUTtJQUN2RjtJQUNBLE9BQU9DO0FBQ1I7QUFFQSxrR0FBa0csR0FDbEcsSUFBSUssbUJBQW1CO0FBK0JoQixNQUFNWix3QkFBd0JhLHdCQUFZO0lBQ2hELDRFQUE0RTtJQUMzREMsU0FBaUJDLGNBQU0sQ0FBQ0QsTUFBTSxDQUFDZCxnQkFBZ0JnQixJQUFJLEVBQUU7SUFDckRDLFNBQVMsSUFBSUMsc0NBQWtCLEdBQUc7SUFDM0NDLFdBQVcsTUFBTTtJQUN6QixtRUFBbUUsR0FDbkUsQUFBUUMsVUFBVSxJQUFJQyxNQUEwQjtJQUN4Q0Msc0JBQXNCLElBQUlDLE1BQWM7SUFDeENDLGtCQUFpQztJQUNqQ0MsY0FBYyxJQUFJSixNQUE2QjtJQUMvQ0ssZUFBZSxJQUFJTCxNQUF3QjtJQUMzQ00sYUFBNEJDLFFBQVFDLE9BQU8sR0FBRztJQUM5Q0Msb0JBQW9CLEVBQUU7SUFDdEJDLGlCQUFpQixNQUFNO0lBQ3ZCQyxpQkFBaUIsTUFBTTtJQUN2QkMsZUFBZSxNQUFNO0lBQzdCLDZFQUE2RSxHQUM3RSxBQUFRQyxvQkFBb0IsSUFBSVgsTUFBYztJQUN0Q1ksaUJBQTZCLEtBQU8sRUFBRTtJQUU5Qyw0RUFBNEU7SUFFNUUsTUFBYUMsTUFBTUMsT0FBK0IsRUFBRTtRQUNuRCxJQUFJLENBQUNsQixRQUFRLEdBQUc7UUFDaEIsSUFBSSxDQUFDTyxZQUFZLENBQUNZLEtBQUs7UUFDdkIsSUFBSSxDQUFDYixXQUFXLENBQUNhLEtBQUs7UUFDdEIsSUFBSSxDQUFDbEIsT0FBTyxDQUFDa0IsS0FBSztRQUNsQixJQUFJLENBQUNoQixtQkFBbUIsQ0FBQ2dCLEtBQUs7UUFDOUIsSUFBSSxDQUFDSixpQkFBaUIsQ0FBQ0ksS0FBSztRQUM1QixJQUFJLENBQUNYLFVBQVUsR0FBR0MsUUFBUUMsT0FBTztRQUNqQyxJQUFJLENBQUNFLGNBQWMsR0FBRztRQUN0QixJQUFJLENBQUNDLGNBQWMsR0FBRztRQUN0QixJQUFJLENBQUNDLFlBQVksR0FBRztRQUNwQixJQUFJLENBQUNNLGtCQUFrQixDQUFDdEMsd0JBQXdCb0MsUUFBUUcsZ0JBQWdCO1FBRXhFLE1BQU0sRUFBRUMsV0FBVyxFQUFFLEdBQUdKO1FBRXhCLE1BQU0sSUFBSSxDQUFDcEIsTUFBTSxDQUFDeUIsU0FBUyxDQUFDO1lBQzNCRDtZQUNBRSxXQUFXTixRQUFRTSxTQUFTO1lBQzVCQyxnQkFBZ0IsQ0FBQ0MsVUFBWSxJQUFJLENBQUNDLGNBQWMsQ0FBQ0Q7WUFDakRFLFlBQVksSUFBSSxDQUFDQyxhQUFhO1FBQy9CO1FBRUEsTUFBTUwsWUFBWSxJQUFJLENBQUNNLGdCQUFnQjtRQUN2QyxNQUFNQyxXQUFXLElBQUksQ0FBQ0MsZUFBZSxDQUFDVixhQUFhSjtRQUNuRCxLQUFLLE1BQU1lLFdBQVdGLFNBQVU7WUFDL0IsTUFBTUcsWUFBWUMsaUJBQUksQ0FBQ3pCLE9BQU8sQ0FBQ3VCLFFBQVFHLGtCQUFrQjtZQUN6RCxJQUFJLENBQUNuQyxPQUFPLENBQUNvQyxHQUFHLENBQUNILFdBQVc7Z0JBQUVDLE1BQU1EO1lBQVU7UUFDL0M7UUFFQSxJQUFJLENBQUNwQyxNQUFNLENBQUN3QyxhQUFhO1FBQ3pCLElBQUksQ0FBQ0Msd0JBQXdCO1FBRTdCLE1BQU1mLFVBQVVnQixLQUFLLENBQUNsQjtRQUN0QixJQUFJLENBQUNqQixpQkFBaUIsR0FBR21CLFVBQVVpQixtQkFBbUIsQ0FBQ0MsU0FBUyxDQUFDLElBQUksQ0FBQ0MsWUFBWTtRQUVsRixLQUFLLE1BQU1DLFNBQVMsSUFBSSxDQUFDM0MsT0FBTyxDQUFDNEMsTUFBTSxHQUFJO1lBQzFDLElBQUksQ0FBQ2xELE1BQU0sQ0FBQ21ELEtBQUssQ0FBQyxDQUFDLFFBQVEsRUFBRUYsTUFBTVQsSUFBSSxFQUFFO1FBQzFDO1FBQ0EsTUFBTSxJQUFJLENBQUNZLFdBQVcsQ0FBQztlQUFJLElBQUksQ0FBQzlDLE9BQU8sQ0FBQytDLElBQUk7U0FBRztRQUMvQyxJQUFJLENBQUNDLElBQUksQ0FBQztJQUNYO0lBRUEsTUFBYUMsVUFBVTtRQUN0QixJQUFJLElBQUksQ0FBQ2xELFFBQVEsRUFBRTtRQUNuQixJQUFJLENBQUNBLFFBQVEsR0FBRztRQUNoQixJQUFJLENBQUNXLGlCQUFpQixJQUFJO1FBQzFCLElBQUksQ0FBQ04saUJBQWlCLEVBQUU4QztRQUN4QixNQUFNLElBQUksQ0FBQzNDLFVBQVU7UUFDckIsTUFBTSxJQUFJLENBQUM0QyxjQUFjLENBQUM7ZUFBSSxJQUFJLENBQUNuRCxPQUFPLENBQUMrQyxJQUFJO1NBQUc7UUFDbEQsSUFBSSxDQUFDbEQsTUFBTSxDQUFDb0QsT0FBTztJQUNwQjtJQUVBLE1BQWEsQ0FBQ0csT0FBT0MsWUFBWSxDQUFDLEdBQUc7UUFDcEMsTUFBTSxJQUFJLENBQUNKLE9BQU87SUFDbkI7SUFFQSw0RUFBNEU7SUFFNUUsTUFBY0gsWUFBWVEsVUFBNkIsRUFBRTtRQUN4RCxNQUFNOUMsUUFBUStDLEdBQUcsQ0FBQ0QsV0FBV0UsR0FBRyxDQUFDLENBQUN2QixZQUFjLElBQUksQ0FBQ3dCLFNBQVMsQ0FBQ3hCO0lBQ2hFO0lBRUEsTUFBY3dCLFVBQVV4QixTQUFpQixFQUFFO1FBQzFDLE1BQU15QixRQUFRLElBQUksQ0FBQzFELE9BQU8sQ0FBQzJELEdBQUcsQ0FBQzFCO1FBQy9CLElBQUl5QixTQUFTLE1BQU07UUFDbkIsSUFBSTtZQUNILE1BQU1FLE1BQU8sTUFBTSxJQUFJLENBQUMvRCxNQUFNLENBQUNnRSxXQUFXLENBQUM1QjtZQUczQ3lCLE1BQU1JLE1BQU0sR0FBR0YsS0FBS0c7UUFDckIsRUFBRSxPQUFPQyxPQUFPO1lBQ2ZOLE1BQU1JLE1BQU0sR0FBR0c7WUFDZixJQUFJLENBQUN2RSxNQUFNLENBQUNzRSxLQUFLLENBQ2hCLDZGQUNBQTtRQUVGO0lBQ0Q7SUFFUTdDLG1CQUFtQitDLE9BQWUsRUFBRTtRQUMzQyxNQUFNQyxNQUFNLEVBQUUsSUFBSSxDQUFDekQsaUJBQWlCO1FBQ3BDLElBQUksQ0FBQ0ssY0FBYyxHQUFHcUQsSUFBQUEsZ0JBQVEsRUFBQztZQUM5QixJQUFJLElBQUksQ0FBQ3JFLFFBQVEsSUFBSW9FLFFBQVEsSUFBSSxDQUFDekQsaUJBQWlCLEVBQUU7WUFDckQsSUFBSSxDQUFDMkQsYUFBYTtRQUNuQixHQUFHSDtJQUNKO0lBRVFHLGdCQUFnQjtRQUN2QixJQUFJLElBQUksQ0FBQ3RFLFFBQVEsRUFBRTtRQUNuQixJQUFJLElBQUksQ0FBQ1ksY0FBYyxFQUFFO1lBQ3hCLElBQUksQ0FBQ0MsY0FBYyxHQUFHO1lBQ3RCO1FBQ0Q7UUFDQSxJQUFJLElBQUksQ0FBQ0MsWUFBWSxFQUFFO1FBQ3ZCLElBQUksQ0FBQ0EsWUFBWSxHQUFHO1FBQ3BCLElBQUksQ0FBQ04sVUFBVSxHQUFHLElBQUksQ0FBQ0EsVUFBVSxDQUFDK0QsSUFBSSxDQUNyQyxJQUFNLElBQUksQ0FBQ0MsU0FBUyxJQUNwQixJQUFNLElBQUksQ0FBQ0EsU0FBUztJQUV0QjtJQUVBLE1BQWNBLFlBQVk7UUFDekIsSUFBSSxDQUFDMUQsWUFBWSxHQUFHO1FBQ3BCLElBQUksSUFBSSxDQUFDZCxRQUFRLEVBQUU7UUFDbkIsSUFBSSxDQUFDWSxjQUFjLEdBQUc7UUFDdEIsSUFBSTtZQUNILEdBQUc7Z0JBQ0YsSUFBSSxDQUFDQyxjQUFjLEdBQUc7Z0JBQ3RCLElBQUksSUFBSSxDQUFDYixRQUFRLEVBQUU7Z0JBQ25CLE1BQU15RSxXQUNMLElBQUksQ0FBQ3RFLG1CQUFtQixDQUFDdUUsSUFBSSxHQUFHLElBQzdCO3VCQUFJLElBQUksQ0FBQ3ZFLG1CQUFtQjtpQkFBQyxHQUM3Qjt1QkFBSSxJQUFJLENBQUNGLE9BQU8sQ0FBQytDLElBQUk7aUJBQUc7Z0JBQzVCLElBQUksQ0FBQzdDLG1CQUFtQixDQUFDZ0IsS0FBSztnQkFDOUIsd0VBQXdFO2dCQUN4RSw2REFBNkQ7Z0JBQzdELElBQUksQ0FBQ3dELDJCQUEyQjtnQkFDaEMsSUFBSSxDQUFDaEYsTUFBTSxDQUFDbUQsS0FBSyxDQUFDLENBQUMsVUFBVSxFQUFFMkIsU0FBU0csTUFBTSxDQUFDLGdCQUFnQixDQUFDO2dCQUNoRSxNQUFNLElBQUksQ0FBQ3hCLGNBQWMsQ0FBQ3FCO2dCQUMxQixNQUFNLElBQUksQ0FBQzFCLFdBQVcsQ0FBQzBCO2dCQUN2QixJQUFJLENBQUN4QixJQUFJLENBQUM7WUFDWCxRQUFTLElBQUksQ0FBQ3BDLGNBQWMsSUFBSSxDQUFDLElBQUksQ0FBQ2IsUUFBUSxDQUFFO1FBQ2pELFNBQVU7WUFDVCxNQUFNNkUsZ0JBQWdCLElBQUksQ0FBQ2hFLGNBQWMsSUFBSSxDQUFDLElBQUksQ0FBQ2IsUUFBUTtZQUMzRCxJQUFJLENBQUNhLGNBQWMsR0FBRztZQUN0QixJQUFJLENBQUNELGNBQWMsR0FBRztZQUN0QixJQUFJaUUsZUFBZSxJQUFJLENBQUNQLGFBQWE7UUFDdEM7SUFDRDtJQUVBLE1BQWNsQixlQUFlRyxVQUE2QixFQUFFO1FBQzNELE1BQU05QyxRQUFRK0MsR0FBRyxDQUFDRCxXQUFXRSxHQUFHLENBQUMsQ0FBQ3ZCLFlBQWMsSUFBSSxDQUFDNEMsWUFBWSxDQUFDNUM7SUFDbkU7SUFFQSxNQUFjNEMsYUFBYTVDLFNBQWtCLEVBQUU7UUFDOUMsTUFBTTZDLFFBQVE3QyxhQUFhLE9BQU87WUFBQ0E7U0FBVSxHQUFHO2VBQUksSUFBSSxDQUFDakMsT0FBTyxDQUFDK0MsSUFBSTtTQUFHO1FBQ3hFLEtBQUssTUFBTWdDLEtBQUtELE1BQU87WUFDdEIsTUFBTXBCLFFBQVEsSUFBSSxDQUFDMUQsT0FBTyxDQUFDMkQsR0FBRyxDQUFDb0I7WUFDL0IsSUFBSXJCLFNBQVMsTUFBTTtZQUNuQixNQUFNZixRQUFRZSxNQUFNSSxNQUFNO1lBQzFCSixNQUFNSSxNQUFNLEdBQUdHO1lBQ2YsSUFBSTtnQkFDSCxNQUFNdEIsT0FBTyxDQUFDUyxPQUFPQyxZQUFZLENBQUM7WUFDbkMsRUFBRSxPQUFPVyxPQUFPO2dCQUNmLElBQUksQ0FBQ3RFLE1BQU0sQ0FBQ3NFLEtBQUssQ0FBQyw2QkFBNkJBO1lBQ2hEO1FBQ0Q7SUFDRDtJQUVBLDRFQUE0RTtJQUVwRW5DLG1CQUE4QjtRQUNyQyxNQUFNTixZQUFZLElBQUksQ0FBQzFCLE1BQU0sQ0FBQ21GLFlBQVk7UUFDMUMsSUFBSXpELGFBQWEsTUFBTTtZQUN0QixNQUFNLElBQUlqQyxNQUFNO1FBQ2pCO1FBQ0EsT0FBT2lDO0lBQ1I7SUFFUVEsZ0JBQWdCVixXQUFtQixFQUFFSixPQUErQixFQUFhO1FBQ3hGLE1BQU1nRSxXQUFXLElBQUksQ0FBQ3BGLE1BQU0sQ0FBQ21GLFlBQVksSUFBSUUsWUFBWTdELGdCQUFnQixFQUFFO1FBQzNFLE1BQU04RCxRQUNMbEUsUUFBUWdFLFFBQVEsSUFBSSxRQUFRaEUsUUFBUWdFLFFBQVEsQ0FBQ04sTUFBTSxHQUFHLElBQ25EMUQsUUFBUWdFLFFBQVEsR0FDaEJoRSxRQUFRZSxPQUFPLElBQUksT0FDbEI7WUFBQ2YsUUFBUWUsT0FBTztTQUFDLEdBQ2pCaUM7UUFFTCxJQUFJa0IsU0FBUyxNQUFNO1lBQ2xCLE1BQU1DLFFBQVFILFNBQVNJLEVBQUUsQ0FBQztZQUMxQixJQUFJRCxTQUFTLE1BQU07Z0JBQ2xCLE1BQU0sSUFBSTlGLE1BQU0sQ0FBQyxxQ0FBcUMsRUFBRStCLGFBQWE7WUFDdEU7WUFDQSxPQUFPO2dCQUFDK0Q7YUFBTTtRQUNmO1FBRUEsTUFBTXRELFdBQXNCLEVBQUU7UUFDOUIsS0FBSyxNQUFNbEMsUUFBUXVGLE1BQU87WUFDekIsTUFBTUcsUUFBUUwsU0FBU00sSUFBSSxDQUFDLENBQUNSLElBQU1BLEVBQUVuRixJQUFJLEtBQUtBO1lBQzlDLElBQUkwRixTQUFTLE1BQU07Z0JBQ2xCLE1BQU0sSUFBSWhHLE1BQU0sQ0FBQyxTQUFTLEVBQUVNLEtBQUssd0JBQXdCLENBQUM7WUFDM0Q7WUFDQWtDLFNBQVMwRCxJQUFJLENBQUNGO1FBQ2Y7UUFDQSxPQUFPeEQ7SUFDUjtJQUVBOzs7RUFHQyxHQUNELEFBQVFGLGdCQUFnQixDQUFDNkQsUUFBeUJDO1FBQ2pELE1BQU0sRUFBRUMsR0FBRyxFQUFFLEdBQUdGO1FBQ2hCLE1BQU1HLGlCQUFpQkYsVUFBVUcsS0FBSyxDQUFDLElBQUksQ0FBQyxFQUFFO1FBRTlDLElBQUlDO1FBQ0osSUFBSUM7UUFFSixJQUFJO1lBQ0gsTUFBTUMsU0FBUyxJQUFJQyxJQUFJTjtZQUN2QkssT0FBT0UsTUFBTSxHQUFHO1lBQ2hCSixXQUFXL0csTUFBRSxDQUFDQyxhQUFhLENBQUNnSCxPQUFPRyxRQUFRO1FBQzVDLEVBQUUsT0FBTTtZQUNQO1FBQ0Q7UUFFQSxJQUFJO1lBQ0hKLGFBQWFoSCxNQUFFLENBQUNDLGFBQWEsQ0FBQzRHO1FBQy9CLEVBQUUsT0FBTTtZQUNQRyxhQUFhO1FBQ2Q7UUFFQSxNQUFNSyxXQUFXLElBQUksQ0FBQ3ZHLE1BQU0sQ0FBQ3dHLGFBQWEsQ0FBQ1A7UUFDM0MsTUFBTVEsaUJBQWlCLElBQUksQ0FBQ3pHLE1BQU0sQ0FBQ3dHLGFBQWEsQ0FBQ047UUFFakQsSUFBSUssWUFBWUUsZ0JBQWdCO1lBQy9CLElBQUksQ0FBQ0MsZUFBZSxDQUFDVCxVQUFVQztRQUNoQztJQUNELEVBQUU7SUFFRiw0RUFBNEU7SUFFcEVyRCxlQUFlLENBQUM4RDtRQUN2QixNQUFNLEVBQUVDLElBQUksRUFBRUMsU0FBUyxFQUFFMUUsT0FBTyxFQUFFLEdBQUd3RTtRQUNyQyxNQUFNRyxXQUFXRixLQUFLRSxRQUFRO1FBRTlCLElBQUksQ0FBQ2pILE1BQU0sQ0FBQ21ELEtBQUssQ0FBQyxDQUFDLEtBQUssRUFBRTZELFVBQVUsRUFBRSxFQUFFQyxVQUFVO1FBRWxELElBQUlELGNBQWMzSCxNQUFFLENBQUM2SCxXQUFXLENBQUNDLE1BQU0sRUFBRTtZQUN4QyxJQUFJLENBQUNoSCxNQUFNLENBQUNpSCxtQkFBbUIsQ0FBQ0g7WUFDaEMsSUFBSSxDQUFDdEcsV0FBVyxDQUFDK0IsR0FBRyxDQUFDdUUsVUFBVTtZQUMvQjtRQUNEO1FBRUEsSUFBSUQsY0FBYzNILE1BQUUsQ0FBQzZILFdBQVcsQ0FBQ0csR0FBRyxFQUFFO1lBQ3JDLElBQUkvRSxRQUFRZ0YsWUFBWSxDQUFDUCxPQUFPO2dCQUMvQixJQUFJLENBQUM1RyxNQUFNLENBQUNvSCxhQUFhLENBQUNOLFVBQVUzRTtnQkFDcEMsSUFBSSxDQUFDM0IsV0FBVyxDQUFDK0IsR0FBRyxDQUFDdUUsVUFBVTtnQkFDL0IsSUFBSSxDQUFDTyxnQkFBZ0IsQ0FBQ1A7WUFDdkI7WUFDQTtRQUNEO1FBRUEsU0FBUztRQUNULElBQUksQ0FBQzNFLFFBQVFnRixZQUFZLENBQUNQLE9BQU87UUFDakMsSUFBSSxDQUFDNUcsTUFBTSxDQUFDaUgsbUJBQW1CLENBQUNIO1FBQ2hDLElBQUksQ0FBQ08sZ0JBQWdCLENBQUNQO0lBQ3ZCLEVBQUU7SUFFTU8saUJBQWlCUCxRQUFnQixFQUFXO1FBQ25ELE1BQU1RLE9BQU8sSUFBSSxDQUFDQyxrQkFBa0IsQ0FBQ1Q7UUFDckMsTUFBTVUsVUFBVTtlQUFJLElBQUlsSCxJQUFJO21CQUFJZ0g7Z0JBQU1SO2FBQVM7U0FBRTtRQUNqRCxNQUFNVyxrQkFBa0I7ZUFBSSxJQUFJLENBQUN0SCxPQUFPLENBQUMrQyxJQUFJO1NBQUcsQ0FBQ3dFLE1BQU0sQ0FBQyxDQUFDdEYsWUFDeERvRixRQUFRRyxRQUFRLENBQUN2RjtRQUdsQixJQUFJcUYsZ0JBQWdCM0MsTUFBTSxLQUFLLEdBQUc7WUFDakMsSUFBSSxDQUFDakYsTUFBTSxDQUFDbUQsS0FBSyxDQUFDLENBQUMsVUFBVSxFQUFFOEQsU0FBUyx3Q0FBd0MsQ0FBQztZQUNqRixPQUFPO1FBQ1I7UUFFQSxJQUFJLENBQUNqSCxNQUFNLENBQUNtRCxLQUFLLENBQ2hCLENBQUMsVUFBVSxFQUFFOEQsU0FBUyxTQUFTLEVBQUVVLFFBQVExQyxNQUFNLENBQUMsOEJBQThCLENBQUM7UUFFaEYsSUFBSSxDQUFDOEMsc0JBQXNCLElBQUlKO1FBQy9CLEtBQUssTUFBTXZELFVBQVV1RCxRQUFTO1lBQzdCLElBQUksQ0FBQ3ZHLGlCQUFpQixDQUFDaUcsR0FBRyxDQUFDakQ7UUFDNUI7UUFDQSxLQUFLLE1BQU03QixhQUFhcUYsZ0JBQWlCO1lBQ3hDLElBQUksQ0FBQ3BILG1CQUFtQixDQUFDNkcsR0FBRyxDQUFDOUU7UUFDOUI7UUFDQSxJQUFJLENBQUNsQixjQUFjO1FBQ25CLE9BQU87SUFDUjtJQUVBLDRFQUE0RTtJQUVwRXFHLG1CQUFtQk0sUUFBZ0IsRUFBRUMsZ0JBQTBCLEVBQUUsRUFBWTtRQUNwRixJQUFJLElBQUksQ0FBQ0MsTUFBTSxDQUFDRixXQUFXLE9BQU8sRUFBRTtRQUVwQyxNQUFNRyxhQUFhLElBQUksQ0FBQ3ZILFlBQVksQ0FBQ3FELEdBQUcsQ0FBQytELGFBQWEsRUFBRTtRQUN4RCxJQUFJQyxjQUFjSCxRQUFRLENBQUNFLFdBQVc7WUFDckMsSUFBSSxDQUFDaEksTUFBTSxDQUFDc0UsS0FBSyxDQUFDLENBQUMsNkJBQTZCLEVBQUUwRCxVQUFVO1lBQzVELE9BQU8sRUFBRTtRQUNWO1FBRUEsSUFBSUksVUFBb0IsRUFBRTtRQUMxQixLQUFLLE1BQU1DLE9BQU9GLFdBQVk7WUFDN0IsSUFBSSxDQUFDLElBQUksQ0FBQ2hJLE1BQU0sQ0FBQ3dHLGFBQWEsQ0FBQzBCLE1BQU07WUFDckMsTUFBTUMsT0FBTyxJQUFJLENBQUNaLGtCQUFrQixDQUFDVyxLQUFLO2dCQUFDTDttQkFBYUM7YUFBYztZQUN0RUcsVUFBVTttQkFBSUE7bUJBQVlFO2FBQUs7UUFDaEM7UUFFQSxPQUFPO2VBQUksSUFBSTdILElBQUk7bUJBQUkwSDttQkFBZUM7YUFBUTtTQUFFO0lBQ2pEO0lBRVF2QixnQkFBZ0JULFFBQWdCLEVBQUVDLFVBQWtCLEVBQUU7UUFDN0QsSUFBSSxDQUFDQSxZQUFZO1FBQ2pCLE1BQU1vQixPQUFPLElBQUksQ0FBQzdHLFlBQVksQ0FBQ3FELEdBQUcsQ0FBQ21DLGFBQWEsRUFBRTtRQUNsRCxNQUFNbUMsY0FBYyxJQUFJOUgsSUFBSTtlQUFJZ0g7WUFBTXBCO1NBQVc7UUFDakQsSUFBSSxDQUFDekYsWUFBWSxDQUFDOEIsR0FBRyxDQUFDMEQsVUFBVTtlQUFJbUM7U0FBWTtJQUNqRDtJQUVBLDRFQUE0RTtJQUVwRXZHLGVBQWV3RyxTQUFpQixFQUFFO1FBQ3pDLE1BQU1wQyxXQUFXL0csTUFBRSxDQUFDQyxhQUFhLENBQUNrSjtRQUNsQyxNQUFNQyxTQUFTLElBQUksQ0FBQzlILFdBQVcsQ0FBQ3NELEdBQUcsQ0FBQ21DO1FBQ3BDLE1BQU1zQyxZQUFZRCxVQUFVLElBQUksQ0FBQ0UsYUFBYSxDQUFDSDtRQUMvQyxJQUFJLENBQUM3SCxXQUFXLENBQUMrQixHQUFHLENBQUMwRCxVQUFVc0M7UUFDL0IsT0FBT0E7SUFDUjtJQUVRQyxjQUFjSCxTQUFpQixFQUFFO1FBQ3hDLE1BQU1JLGVBQWUsSUFBSXJDLElBQUlpQztRQUM3QkksYUFBYUMsWUFBWSxDQUFDbkcsR0FBRyxDQUFDbkQsbUJBQW1CTSxPQUFPLEVBQUVDO1FBQzFELE9BQU84SSxhQUFhbkMsUUFBUTtJQUM3QjtJQUVRc0IsdUJBQXVCLEdBQUdKLE9BQWlCLEVBQUU7UUFDcEQsS0FBSyxNQUFNdkQsVUFBVXVELFFBQVM7WUFDN0IsSUFBSSxDQUFDaEgsV0FBVyxDQUFDK0IsR0FBRyxDQUFDMEIsUUFBUTtZQUM3QixJQUFJLENBQUNqRSxNQUFNLENBQUNpSCxtQkFBbUIsQ0FBQ2hEO1FBQ2pDO0lBQ0Q7SUFFUVksOEJBQThCO1FBQ3JDLE1BQU0yQyxVQUFVO2VBQUksSUFBSSxDQUFDdkcsaUJBQWlCO1NBQUM7UUFDM0MsSUFBSSxDQUFDQSxpQkFBaUIsQ0FBQ0ksS0FBSztRQUM1QixJQUFJLENBQUNzSCxzQkFBc0IsSUFBSW5CO0lBQ2hDO0lBRUEsdUZBQXVGLEdBQ3ZGLEFBQVFtQix1QkFBdUIsR0FBR25CLE9BQWlCLEVBQUU7UUFDcEQsS0FBSyxNQUFNdkQsVUFBVXVELFFBQVM7WUFDN0IsS0FBSyxNQUFNLENBQUNvQixLQUFLQyxRQUFRLElBQUksSUFBSSxDQUFDcEksWUFBWSxDQUFFO2dCQUMvQyxNQUFNcUksV0FBV0QsUUFBUW5CLE1BQU0sQ0FBQyxDQUFDeEMsSUFBTUEsTUFBTWpCO2dCQUM3QyxJQUFJNkUsU0FBU2hFLE1BQU0sS0FBSyxHQUFHO29CQUMxQixJQUFJLENBQUNyRSxZQUFZLENBQUNzSSxNQUFNLENBQUNIO2dCQUMxQixPQUFPO29CQUNOLElBQUksQ0FBQ25JLFlBQVksQ0FBQzhCLEdBQUcsQ0FBQ3FHLEtBQUtFO2dCQUM1QjtZQUNEO1FBQ0Q7SUFDRDtJQUVRckcsMkJBQTJCO1FBQ2xDLEtBQUssTUFBTXdELFlBQVksSUFBSSxDQUFDakcsTUFBTSxDQUFDZ0osZUFBZSxHQUFJO1lBQ3JELElBQUksQ0FBQ3hJLFdBQVcsQ0FBQytCLEdBQUcsQ0FBQzBELFVBQVU7UUFDaEM7SUFDRDtJQUVROEIsT0FBTzlCLFFBQWdCLEVBQUU7UUFDaEMsT0FBT2hILG9CQUFvQm9ELGlCQUFJLENBQUN6QixPQUFPLENBQUNxRjtJQUN6QztBQUNEIn0=
|
|
453
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL2RlY29oZXJlL2RlY29oZXJlL3Byb2plY3RzL2ZsdXgvc3JjL2hvdC1yZWxvYWQtc2VydmVyLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEV2ZW50RW1pdHRlciB9IGZyb20gXCJub2RlOmV2ZW50c1wiO1xuaW1wb3J0IHR5cGUgeyBSZXNvbHZlRm5PdXRwdXQgfSBmcm9tIFwibm9kZTptb2R1bGVcIjtcbmltcG9ydCBwYXRoIGZyb20gXCJub2RlOnBhdGhcIjtcbmltcG9ydCB0eXBlIHsgUHJvamVjdCwgUHJvamVjdEZpbGVFdmVudCwgV29ya3NwYWNlIH0gZnJvbSBcIkBkZWNvaGVyZS9tZXNoXCI7XG5pbXBvcnQgeyBpbyB9IGZyb20gXCJAZGVjb2hlcmUvbmV4dXMvaW9cIjtcbmltcG9ydCB7IGRlYm91bmNlIH0gZnJvbSBcIkBkZWNvaGVyZS9uZXh1cy9zeXN0ZW1cIjtcbmltcG9ydCB7IHR5cGUgTG9nZ2VyLCBzY3JpYmUgfSBmcm9tIFwiQGRlY29oZXJlL3NjcmliZVwiO1xuaW1wb3J0IHR5cGUgeyBTdWJzY3JpcHRpb24gfSBmcm9tIFwicnhqc1wiO1xuaW1wb3J0IHsgU291cmNlTW9kdWxlTG9hZGVyIH0gZnJvbSBcIi4vc291cmNlLW1vZHVsZS1sb2FkZXIuanNcIjtcblxuY29uc3QgY3VycmVudEZpbGVQYXRoID0gaW8uZmlsZVVybFRvUGF0aChpbXBvcnQubWV0YS51cmwpO1xuY29uc3QgVkVSU0lPTl9VUkxfUEFSQU0gPSBcInZlcnNpb25cIjtcbi8qKiBEZWZhdWx0IHF1aWV0IHdpbmRvdyBiZWZvcmUgYSBmaWxlLWNoYW5nZSByZWJvb3QuICovXG5leHBvcnQgY29uc3QgREVGQVVMVF9SRUJPT1RfREVCT1VOQ0VfTVMgPSAyNTA7XG4vKiogSG93IG1hbnkgdHJpZ2dlcmluZyBwYXRocyB0byBwcmludCBvbiB0aGUgaW5mbyBiYW5uZXIgYmVmb3JlIGArTmAuICovXG5jb25zdCBNQVhfUkVCT09UX1RSSUdHRVJfUEFUSFMgPSA0O1xuXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZVJlYm9vdERlYm91bmNlTXModmFsdWU6IG51bWJlciB8IHVuZGVmaW5lZCk6IG51bWJlciB7XG5cdGNvbnN0IGRlbGF5ID0gdmFsdWUgPz8gREVGQVVMVF9SRUJPT1RfREVCT1VOQ0VfTVM7XG5cdGlmICghTnVtYmVyLmlzRmluaXRlKGRlbGF5KSB8fCBkZWxheSA8IDApIHtcblx0XHR0aHJvdyBuZXcgRXJyb3IoYHJlYm9vdERlYm91bmNlTXMgbXVzdCBiZSBhIG5vbi1uZWdhdGl2ZSBudW1iZXIsIGdvdCAke1N0cmluZyh2YWx1ZSl9YCk7XG5cdH1cblx0cmV0dXJuIGRlbGF5O1xufVxuXG5mdW5jdGlvbiBmb3JtYXRUcmlnZ2VyTGlzdCh0cmlnZ2VyczogcmVhZG9ubHkgc3RyaW5nW10pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuXHRpZiAodHJpZ2dlcnMubGVuZ3RoID09PSAwKSByZXR1cm4gdW5kZWZpbmVkO1xuXHRpZiAodHJpZ2dlcnMubGVuZ3RoIDw9IE1BWF9SRUJPT1RfVFJJR0dFUl9QQVRIUykgcmV0dXJuIHRyaWdnZXJzLmpvaW4oXCIsIFwiKTtcblx0cmV0dXJuIGAke3RyaWdnZXJzLnNsaWNlKDAsIE1BWF9SRUJPT1RfVFJJR0dFUl9QQVRIUykuam9pbihcIiwgXCIpfSwgKyR7dHJpZ2dlcnMubGVuZ3RoIC0gTUFYX1JFQk9PVF9UUklHR0VSX1BBVEhTfWA7XG59XG5cbmNvbnN0IEJBTk5FUl9SVUxFID0gXCLilZBcIi5yZXBlYXQoNTYpO1xuXG5mdW5jdGlvbiB3cmFwRmx1eEJhbm5lcih0aXRsZTogc3RyaW5nLCBkZXRhaWxzOiByZWFkb25seSBzdHJpbmdbXSk6IHN0cmluZyB7XG5cdGNvbnN0IGJvZHkgPSBkZXRhaWxzLm1hcCgobGluZSkgPT4gYCAgJHtsaW5lfWApLmpvaW4oXCJcXG5cIik7XG5cdHJldHVybiBgXFxuJHtCQU5ORVJfUlVMRX1cXG4gICR7dGl0bGV9XFxuJHtib2R5fVxcbiR7QkFOTkVSX1JVTEV9XFxuYDtcbn1cblxuLyoqIEluZm8tbGV2ZWwgSE1SIHN0YXJ0IGJsb2NrIOKAlCBrZWVwIGBmbHV4IHJlYm9vdGAgaW4gdGhlIHRleHQgc28gb3BlcmF0b3JzIGNhbiBzZWFyY2ggdGhlIGJ1ZmZlci4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmb3JtYXRGbHV4UmVib290U3RhcnQoXG5cdGxhYmVsczogcmVhZG9ubHkgc3RyaW5nW10sXG5cdHRyaWdnZXJzOiByZWFkb25seSBzdHJpbmdbXSA9IFtdLFxuKTogc3RyaW5nIHtcblx0Y29uc3Qgd2hvID0gbGFiZWxzLmpvaW4oXCIsIFwiKSB8fCBcImVudHJ5XCI7XG5cdGNvbnN0IGZpbGVzID0gZm9ybWF0VHJpZ2dlckxpc3QodHJpZ2dlcnMpO1xuXHRjb25zdCBkZXRhaWxzID0gZmlsZXMgPT0gbnVsbCA/IFt3aG9dIDogW3dobywgZmlsZXNdO1xuXHRyZXR1cm4gd3JhcEZsdXhCYW5uZXIoXCJGTFVYIFJFQk9PVFwiLCBkZXRhaWxzKTtcbn1cblxuLyoqIEluZm8tbGV2ZWwgSE1SIGZpbmlzaCBibG9jay4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmb3JtYXRGbHV4UmVib290UmVhZHkobGFiZWxzOiByZWFkb25seSBzdHJpbmdbXSwgZWxhcHNlZE1zOiBudW1iZXIpOiBzdHJpbmcge1xuXHRjb25zdCB3aG8gPSBsYWJlbHMuam9pbihcIiwgXCIpIHx8IFwiZW50cnlcIjtcblx0cmV0dXJuIHdyYXBGbHV4QmFubmVyKFwiRkxVWCBSRUFEWVwiLCBbd2hvLCBgJHtNYXRoLm1heCgwLCBNYXRoLnJvdW5kKGVsYXBzZWRNcykpfW1zYF0pO1xufVxuXG4vKiogUHJvY2Vzcy13aWRlOiBOb2RlJ3MgRVNNIGNhY2hlIGlzIHByb2Nlc3MtZ2xvYmFsLCBpbmNsdWRpbmcgYWNyb3NzIEhvdFJlbG9hZFNlcnZlciBpbnN0YW5jZXMuICovXG5sZXQgbW9kdWxlVmVyc2lvblNlcSA9IDA7XG5cbmV4cG9ydCBpbnRlcmZhY2UgSG90UmVsb2FkU2VydmVyRXZlbnRzIHtcblx0c3RhcnQ6IFtdO1xuXHRyZWJvb3Q6IFtdO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEhvdFJlbG9hZFNlcnZlck9wdGlvbnMge1xuXHQvKiogQnVpbGQgY29uZmlndXJhdGlvbiBuYW1lLiAqL1xuXHRidWlsZENvbmZpZzogc3RyaW5nO1xuXHQvKiogTmFtZSBvZiB0aGUgcHJvamVjdCB0byBzZXJ2ZS4gRGVmYXVsdHMgdG8gdGhlIGZpcnN0IHByb2plY3QgaW4gdGhlIHdvcmtzcGFjZS4gKi9cblx0cHJvamVjdD86IHN0cmluZztcblx0LyoqXG5cdCAqIE11bHRpcGxlIEZsdXggYXBwIHBhY2thZ2UgbmFtZXMgdG8gYm9vdCBpbiBvbmUgcHJvY2VzcyAoZGlyZWN0b3J5IHNsaWNlKS5cblx0ICogV2hlbiBzZXQsIHRha2VzIHByZWNlZGVuY2Ugb3ZlciB7QGxpbmsgcHJvamVjdH0uXG5cdCAqL1xuXHRwcm9qZWN0cz86IHJlYWRvbmx5IHN0cmluZ1tdO1xuXHQvKipcblx0ICogUHJlLWJ1aWx0IFdvcmtzcGFjZSBpbnN0YW5jZSB0byB1c2UgaW5zdGVhZCBvZiBydW5uaW5nIFdvcmtzcGFjZUZhY3RvcnkuXG5cdCAqIFVzZWZ1bCBpbiB0ZXN0cyB0byBieXBhc3MgZmlsZXN5c3RlbS1iYXNlZCB3b3Jrc3BhY2UgZGlzY292ZXJ5LlxuXHQgKi9cblx0d29ya3NwYWNlPzogV29ya3NwYWNlO1xuXHQvKipcblx0ICogUXVpZXQgd2luZG93IGluIG1pbGxpc2Vjb25kcyBhZnRlciB0aGUgbGFzdCBhZmZlY3Rpbmcgc2F2ZSBiZWZvcmUgYSByZWJvb3QuXG5cdCAqIERlZmF1bHRzIHRvIHtAbGluayBERUZBVUxUX1JFQk9PVF9ERUJPVU5DRV9NU30uIFJhaXNlIHRoaXMgZm9yIGFnZW50IHNhdmUgdHJhaW5zLlxuXHQgKi9cblx0cmVib290RGVib3VuY2VNcz86IG51bWJlcjtcbn1cblxudHlwZSBFbnRyeVN0YXRlID0geyBwYXRoOiBzdHJpbmc7IGxhYmVsOiBzdHJpbmc7IG1vZHVsZT86IEFzeW5jRGlzcG9zYWJsZSB9O1xuXG5leHBvcnQgY2xhc3MgSG90UmVsb2FkU2VydmVyIGV4dGVuZHMgRXZlbnRFbWl0dGVyPEhvdFJlbG9hZFNlcnZlckV2ZW50cz4ge1xuXHQvLyDilIDilIAgU3RhdGUg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cdHByaXZhdGUgcmVhZG9ubHkgbG9nZ2VyOiBMb2dnZXIgPSBzY3JpYmUubG9nZ2VyKEhvdFJlbG9hZFNlcnZlci5uYW1lKTtcblx0cHJpdmF0ZSByZWFkb25seSBsb2FkZXIgPSBuZXcgU291cmNlTW9kdWxlTG9hZGVyKCk7XG5cdHByaXZhdGUgZGlzcG9zZWQgPSBmYWxzZTtcblx0LyoqIEFic29sdXRlIGVudHJ5IHBhdGhzIGN1cnJlbnRseSBzZXJ2ZWQgKG9uZSBvciBtb3JlIEZsdXggYXBwcykuICovXG5cdHByaXZhdGUgZW50cmllcyA9IG5ldyBNYXA8c3RyaW5nLCBFbnRyeVN0YXRlPigpO1xuXHRwcml2YXRlIHBlbmRpbmdFbnRyeVJlYm9vdHMgPSBuZXcgU2V0PHN0cmluZz4oKTtcblx0LyoqIFNvdXJjZSBwYXRocyB0aGF0IHNjaGVkdWxlZCB0aGUgbmV4dCByZWJvb3QgKGNsZWFyZWQgd2hlbiB0aGF0IHJlYm9vdCBzdGFydHMpLiAqL1xuXHRwcml2YXRlIHBlbmRpbmdUcmlnZ2VycyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuXHRwcml2YXRlIHdhdGNoU3Vic2NyaXB0aW9uPzogU3Vic2NyaXB0aW9uO1xuXHRwcml2YXRlIG1vZHVsZUNhY2hlID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZyB8IG51bGw+KCk7XG5cdHByaXZhdGUgZGVwZW5kZW5jaWVzID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZ1tdPigpO1xuXHRwcml2YXRlIHJlYm9vdFRhaWw6IFByb21pc2U8dm9pZD4gPSBQcm9taXNlLnJlc29sdmUoKTtcblx0cHJpdmF0ZSByZWJvb3REZWJvdW5jZUdlbiA9IDA7XG5cdHByaXZhdGUgcmVib290SW5GbGlnaHQgPSBmYWxzZTtcblx0cHJpdmF0ZSByZWJvb3RGb2xsb3dVcCA9IGZhbHNlO1xuXHRwcml2YXRlIHJlYm9vdFF1ZXVlZCA9IGZhbHNlO1xuXHQvKiogTW9kdWxlcyB3aG9zZSByZXZlcnNlLWdyYXBoIGVkZ2VzIGFyZSBwcnVuZWQgYXQgcmVib290LCBub3Qgb24gc2NoZWR1bGUuICovXG5cdHByaXZhdGUgcGVuZGluZ0dyYXBoUHJ1bmUgPSBuZXcgU2V0PHN0cmluZz4oKTtcblx0cHJpdmF0ZSBzY2hlZHVsZVJlYm9vdDogKCkgPT4gdm9pZCA9ICgpID0+IHt9O1xuXG5cdC8vIOKUgOKUgCBQdWJsaWMgQVBJIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG5cdHB1YmxpYyBhc3luYyBzdGFydChvcHRpb25zOiBIb3RSZWxvYWRTZXJ2ZXJPcHRpb25zKSB7XG5cdFx0dGhpcy5kaXNwb3NlZCA9IGZhbHNlO1xuXHRcdHRoaXMuZGVwZW5kZW5jaWVzLmNsZWFyKCk7XG5cdFx0dGhpcy5tb2R1bGVDYWNoZS5jbGVhcigpO1xuXHRcdHRoaXMuZW50cmllcy5jbGVhcigpO1xuXHRcdHRoaXMucGVuZGluZ0VudHJ5UmVib290cy5jbGVhcigpO1xuXHRcdHRoaXMucGVuZGluZ1RyaWdnZXJzLmNsZWFyKCk7XG5cdFx0dGhpcy5wZW5kaW5nR3JhcGhQcnVuZS5jbGVhcigpO1xuXHRcdHRoaXMucmVib290VGFpbCA9IFByb21pc2UucmVzb2x2ZSgpO1xuXHRcdHRoaXMucmVib290SW5GbGlnaHQgPSBmYWxzZTtcblx0XHR0aGlzLnJlYm9vdEZvbGxvd1VwID0gZmFsc2U7XG5cdFx0dGhpcy5yZWJvb3RRdWV1ZWQgPSBmYWxzZTtcblx0XHR0aGlzLmJpbmRTY2hlZHVsZVJlYm9vdChyZXNvbHZlUmVib290RGVib3VuY2VNcyhvcHRpb25zLnJlYm9vdERlYm91bmNlTXMpKTtcblxuXHRcdGNvbnN0IHsgYnVpbGRDb25maWcgfSA9IG9wdGlvbnM7XG5cblx0XHRhd2FpdCB0aGlzLmxvYWRlci5jb25maWd1cmUoe1xuXHRcdFx0YnVpbGRDb25maWcsXG5cdFx0XHR3b3Jrc3BhY2U6IG9wdGlvbnMud29ya3NwYWNlLFxuXHRcdFx0dmVyc2lvbkZpbGVVcmw6IChmaWxlVXJsKSA9PiB0aGlzLmdldENhY2hlZE9yTmV3KGZpbGVVcmwpLFxuXHRcdFx0b25SZXNvbHZlZDogdGhpcy5vblBvc3RSZXNvbHZlLFxuXHRcdH0pO1xuXG5cdFx0Y29uc3Qgd29ya3NwYWNlID0gdGhpcy5yZXF1aXJlV29ya3NwYWNlKCk7XG5cdFx0Y29uc3Qgc2VsZWN0ZWQgPSB0aGlzLnJlc29sdmVQcm9qZWN0cyhidWlsZENvbmZpZywgb3B0aW9ucyk7XG5cdFx0Zm9yIChjb25zdCBwcm9qZWN0IG9mIHNlbGVjdGVkKSB7XG5cdFx0XHRjb25zdCBlbnRyeVBhdGggPSBwYXRoLnJlc29sdmUocHJvamVjdC5nZXRTb3VyY2VFbnRyeVBhdGgoKSk7XG5cdFx0XHR0aGlzLmVudHJpZXMuc2V0KGVudHJ5UGF0aCwgeyBwYXRoOiBlbnRyeVBhdGgsIGxhYmVsOiBwcm9qZWN0Lm5hbWUgfSk7XG5cdFx0fVxuXG5cdFx0dGhpcy5sb2FkZXIucmVnaXN0ZXJIb29rcygpO1xuXHRcdHRoaXMuaW52YWxpZGF0ZUFsbFNvdXJjZUZpbGVzKCk7XG5cblx0XHRhd2FpdCB3b3Jrc3BhY2Uud2F0Y2goYnVpbGRDb25maWcpO1xuXHRcdHRoaXMud2F0Y2hTdWJzY3JpcHRpb24gPSB3b3Jrc3BhY2UucHJvamVjdEZpbGVDaGFuZ2VkJC5zdWJzY3JpYmUodGhpcy5vbkZpbGVDaGFuZ2UpO1xuXG5cdFx0Zm9yIChjb25zdCBlbnRyeSBvZiB0aGlzLmVudHJpZXMudmFsdWVzKCkpIHtcblx0XHRcdHRoaXMubG9nZ2VyLnRyYWNlKGBTZXJ2aW5nICR7ZW50cnkucGF0aH1gKTtcblx0XHR9XG5cdFx0YXdhaXQgdGhpcy5ib290RW50cmllcyhbLi4udGhpcy5lbnRyaWVzLmtleXMoKV0pO1xuXHRcdHRoaXMuZW1pdChcInN0YXJ0XCIpO1xuXHR9XG5cblx0cHVibGljIGFzeW5jIGRpc3Bvc2UoKSB7XG5cdFx0aWYgKHRoaXMuZGlzcG9zZWQpIHJldHVybjtcblx0XHR0aGlzLmRpc3Bvc2VkID0gdHJ1ZTtcblx0XHR0aGlzLnJlYm9vdERlYm91bmNlR2VuICs9IDE7XG5cdFx0dGhpcy53YXRjaFN1YnNjcmlwdGlvbj8udW5zdWJzY3JpYmUoKTtcblx0XHRhd2FpdCB0aGlzLnJlYm9vdFRhaWw7XG5cdFx0YXdhaXQgdGhpcy5kaXNwb3NlRW50cmllcyhbLi4udGhpcy5lbnRyaWVzLmtleXMoKV0pO1xuXHRcdHRoaXMubG9hZGVyLmRpc3Bvc2UoKTtcblx0fVxuXG5cdHB1YmxpYyBhc3luYyBbU3ltYm9sLmFzeW5jRGlzcG9zZV0oKSB7XG5cdFx0YXdhaXQgdGhpcy5kaXNwb3NlKCk7XG5cdH1cblxuXHQvLyDilIDilIAgTGlmZWN5Y2xlIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG5cdHByaXZhdGUgYXN5bmMgYm9vdEVudHJpZXMoZW50cnlQYXRoczogcmVhZG9ubHkgc3RyaW5nW10pIHtcblx0XHRhd2FpdCBQcm9taXNlLmFsbChlbnRyeVBhdGhzLm1hcCgoZW50cnlQYXRoKSA9PiB0aGlzLmJvb3RFbnRyeShlbnRyeVBhdGgpKSk7XG5cdH1cblxuXHRwcml2YXRlIGFzeW5jIGJvb3RFbnRyeShlbnRyeVBhdGg6IHN0cmluZykge1xuXHRcdGNvbnN0IHN0YXRlID0gdGhpcy5lbnRyaWVzLmdldChlbnRyeVBhdGgpO1xuXHRcdGlmIChzdGF0ZSA9PSBudWxsKSByZXR1cm47XG5cdFx0dHJ5IHtcblx0XHRcdGNvbnN0IG1vZCA9IChhd2FpdCB0aGlzLmxvYWRlci5pbXBvcnRFbnRyeShlbnRyeVBhdGgpKSBhcyB7XG5cdFx0XHRcdGRlZmF1bHQ/OiBBc3luY0Rpc3Bvc2FibGU7XG5cdFx0XHR9O1xuXHRcdFx0c3RhdGUubW9kdWxlID0gbW9kPy5kZWZhdWx0O1xuXHRcdH0gY2F0Y2ggKGVycm9yKSB7XG5cdFx0XHRzdGF0ZS5tb2R1bGUgPSB1bmRlZmluZWQ7XG5cdFx0XHR0aGlzLmxvZ2dlci5lcnJvcihcblx0XHRcdFx0XCJUaGVyZSB3YXMgYW4gZXJyb3IgYm9vdGluZyB0aGUgZW50cnkgcG9pbnQuIFlvdXIgYXBwbGljYXRpb24gbWF5IG5vdCBmdW5jdGlvbiBhcyBleHBlY3RlZFwiLFxuXHRcdFx0XHRlcnJvcixcblx0XHRcdCk7XG5cdFx0fVxuXHR9XG5cblx0cHJpdmF0ZSBiaW5kU2NoZWR1bGVSZWJvb3QoZGVsYXlNczogbnVtYmVyKSB7XG5cdFx0Y29uc3QgZ2VuID0gKyt0aGlzLnJlYm9vdERlYm91bmNlR2VuO1xuXHRcdHRoaXMuc2NoZWR1bGVSZWJvb3QgPSBkZWJvdW5jZShhc3luYyAoKSA9PiB7XG5cdFx0XHRpZiAodGhpcy5kaXNwb3NlZCB8fCBnZW4gIT09IHRoaXMucmVib290RGVib3VuY2VHZW4pIHJldHVybjtcblx0XHRcdHRoaXMucmVxdWVzdFJlYm9vdCgpO1xuXHRcdH0sIGRlbGF5TXMpO1xuXHR9XG5cblx0cHJpdmF0ZSByZXF1ZXN0UmVib290KCkge1xuXHRcdGlmICh0aGlzLmRpc3Bvc2VkKSByZXR1cm47XG5cdFx0aWYgKHRoaXMucmVib290SW5GbGlnaHQpIHtcblx0XHRcdHRoaXMucmVib290Rm9sbG93VXAgPSB0cnVlO1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblx0XHRpZiAodGhpcy5yZWJvb3RRdWV1ZWQpIHJldHVybjtcblx0XHR0aGlzLnJlYm9vdFF1ZXVlZCA9IHRydWU7XG5cdFx0dGhpcy5yZWJvb3RUYWlsID0gdGhpcy5yZWJvb3RUYWlsLnRoZW4oXG5cdFx0XHQoKSA9PiB0aGlzLnJ1blJlYm9vdCgpLFxuXHRcdFx0KCkgPT4gdGhpcy5ydW5SZWJvb3QoKSxcblx0XHQpO1xuXHR9XG5cblx0cHJpdmF0ZSBhc3luYyBydW5SZWJvb3QoKSB7XG5cdFx0dGhpcy5yZWJvb3RRdWV1ZWQgPSBmYWxzZTtcblx0XHRpZiAodGhpcy5kaXNwb3NlZCkgcmV0dXJuO1xuXHRcdHRoaXMucmVib290SW5GbGlnaHQgPSB0cnVlO1xuXHRcdHRyeSB7XG5cdFx0XHRkbyB7XG5cdFx0XHRcdHRoaXMucmVib290Rm9sbG93VXAgPSBmYWxzZTtcblx0XHRcdFx0aWYgKHRoaXMuZGlzcG9zZWQpIHJldHVybjtcblx0XHRcdFx0Y29uc3QgdG9SZWJvb3QgPVxuXHRcdFx0XHRcdHRoaXMucGVuZGluZ0VudHJ5UmVib290cy5zaXplID4gMFxuXHRcdFx0XHRcdFx0PyBbLi4udGhpcy5wZW5kaW5nRW50cnlSZWJvb3RzXVxuXHRcdFx0XHRcdFx0OiBbLi4udGhpcy5lbnRyaWVzLmtleXMoKV07XG5cdFx0XHRcdHRoaXMucGVuZGluZ0VudHJ5UmVib290cy5jbGVhcigpO1xuXHRcdFx0XHQvLyBEcm9wIHJldmVyc2UgZWRnZXMgb25seSB3aGVuIHJlYm9vdGluZyBzbyBsYXRlciBzYXZlcyBpbiB0aGUgZGVib3VuY2Vcblx0XHRcdFx0Ly8gd2luZG93IGNhbiBzdGlsbCB3YWxrIHRoZSBncmFwaCBhbmQgcmVzZXQgdGhlIHF1aWV0IHRpbWVyLlxuXHRcdFx0XHR0aGlzLnBydW5lUGVuZGluZ0RlcGVuZGVuY3lFZGdlcygpO1xuXHRcdFx0XHRjb25zdCBzdGFydGVkQXQgPSBEYXRlLm5vdygpO1xuXHRcdFx0XHRjb25zdCBsYWJlbHMgPSB0aGlzLmxhYmVsc0Zvcih0b1JlYm9vdCk7XG5cdFx0XHRcdGNvbnN0IHRyaWdnZXJzID0gdGhpcy50YWtlVHJpZ2dlcnMoKTtcblx0XHRcdFx0dGhpcy5sb2dnZXIuaW5mbyhmb3JtYXRGbHV4UmVib290U3RhcnQobGFiZWxzLCB0cmlnZ2VycykpO1xuXHRcdFx0XHRhd2FpdCB0aGlzLmRpc3Bvc2VFbnRyaWVzKHRvUmVib290KTtcblx0XHRcdFx0YXdhaXQgdGhpcy5ib290RW50cmllcyh0b1JlYm9vdCk7XG5cdFx0XHRcdHRoaXMubG9nZ2VyLmluZm8oZm9ybWF0Rmx1eFJlYm9vdFJlYWR5KGxhYmVscywgRGF0ZS5ub3coKSAtIHN0YXJ0ZWRBdCkpO1xuXHRcdFx0XHR0aGlzLmVtaXQoXCJyZWJvb3RcIik7XG5cdFx0XHR9IHdoaWxlICh0aGlzLnJlYm9vdEZvbGxvd1VwICYmICF0aGlzLmRpc3Bvc2VkKTtcblx0XHR9IGZpbmFsbHkge1xuXHRcdFx0Y29uc3QgbmVlZHNGb2xsb3dVcCA9IHRoaXMucmVib290Rm9sbG93VXAgJiYgIXRoaXMuZGlzcG9zZWQ7XG5cdFx0XHR0aGlzLnJlYm9vdEZvbGxvd1VwID0gZmFsc2U7XG5cdFx0XHR0aGlzLnJlYm9vdEluRmxpZ2h0ID0gZmFsc2U7XG5cdFx0XHRpZiAobmVlZHNGb2xsb3dVcCkgdGhpcy5yZXF1ZXN0UmVib290KCk7XG5cdFx0fVxuXHR9XG5cblx0cHJpdmF0ZSBhc3luYyBkaXNwb3NlRW50cmllcyhlbnRyeVBhdGhzOiByZWFkb25seSBzdHJpbmdbXSkge1xuXHRcdGF3YWl0IFByb21pc2UuYWxsKGVudHJ5UGF0aHMubWFwKChlbnRyeVBhdGgpID0+IHRoaXMuZGlzcG9zZUVudHJ5KGVudHJ5UGF0aCkpKTtcblx0fVxuXG5cdHByaXZhdGUgYXN5bmMgZGlzcG9zZUVudHJ5KGVudHJ5UGF0aD86IHN0cmluZykge1xuXHRcdGNvbnN0IHBhdGhzID0gZW50cnlQYXRoICE9IG51bGwgPyBbZW50cnlQYXRoXSA6IFsuLi50aGlzLmVudHJpZXMua2V5cygpXTtcblx0XHRmb3IgKGNvbnN0IHAgb2YgcGF0aHMpIHtcblx0XHRcdGNvbnN0IHN0YXRlID0gdGhpcy5lbnRyaWVzLmdldChwKTtcblx0XHRcdGlmIChzdGF0ZSA9PSBudWxsKSBjb250aW51ZTtcblx0XHRcdGNvbnN0IGVudHJ5ID0gc3RhdGUubW9kdWxlO1xuXHRcdFx0c3RhdGUubW9kdWxlID0gdW5kZWZpbmVkO1xuXHRcdFx0dHJ5IHtcblx0XHRcdFx0YXdhaXQgZW50cnk/LltTeW1ib2wuYXN5bmNEaXNwb3NlXSgpO1xuXHRcdFx0fSBjYXRjaCAoZXJyb3IpIHtcblx0XHRcdFx0dGhpcy5sb2dnZXIuZXJyb3IoXCJFbnRyeSBhc3luY0Rpc3Bvc2UgZmFpbGVkXCIsIGVycm9yKTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHQvLyDilIDilIAgU2V0dXAg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cblx0cHJpdmF0ZSByZXF1aXJlV29ya3NwYWNlKCk6IFdvcmtzcGFjZSB7XG5cdFx0Y29uc3Qgd29ya3NwYWNlID0gdGhpcy5sb2FkZXIuZ2V0V29ya3NwYWNlKCk7XG5cdFx0aWYgKHdvcmtzcGFjZSA9PSBudWxsKSB7XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJTb3VyY2VNb2R1bGVMb2FkZXIgaGFzIG5vIHdvcmtzcGFjZSBhZnRlciBjb25maWd1cmVcIik7XG5cdFx0fVxuXHRcdHJldHVybiB3b3Jrc3BhY2U7XG5cdH1cblxuXHRwcml2YXRlIHJlc29sdmVQcm9qZWN0cyhidWlsZENvbmZpZzogc3RyaW5nLCBvcHRpb25zOiBIb3RSZWxvYWRTZXJ2ZXJPcHRpb25zKTogUHJvamVjdFtdIHtcblx0XHRjb25zdCBwcm9qZWN0cyA9IHRoaXMubG9hZGVyLmdldFdvcmtzcGFjZSgpPy5nZXRQcm9qZWN0cyhidWlsZENvbmZpZykgPz8gW107XG5cdFx0Y29uc3QgbmFtZXMgPVxuXHRcdFx0b3B0aW9ucy5wcm9qZWN0cyAhPSBudWxsICYmIG9wdGlvbnMucHJvamVjdHMubGVuZ3RoID4gMFxuXHRcdFx0XHQ/IG9wdGlvbnMucHJvamVjdHNcblx0XHRcdFx0OiBvcHRpb25zLnByb2plY3QgIT0gbnVsbFxuXHRcdFx0XHRcdD8gW29wdGlvbnMucHJvamVjdF1cblx0XHRcdFx0XHQ6IHVuZGVmaW5lZDtcblxuXHRcdGlmIChuYW1lcyA9PSBudWxsKSB7XG5cdFx0XHRjb25zdCBmaXJzdCA9IHByb2plY3RzLmF0KDApO1xuXHRcdFx0aWYgKGZpcnN0ID09IG51bGwpIHtcblx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKGBObyBwcm9qZWN0cyBmb3VuZCBmb3IgY29uZmlndXJhdGlvbjogJHtidWlsZENvbmZpZ31gKTtcblx0XHRcdH1cblx0XHRcdHJldHVybiBbZmlyc3RdO1xuXHRcdH1cblxuXHRcdGNvbnN0IHNlbGVjdGVkOiBQcm9qZWN0W10gPSBbXTtcblx0XHRmb3IgKGNvbnN0IG5hbWUgb2YgbmFtZXMpIHtcblx0XHRcdGNvbnN0IGZvdW5kID0gcHJvamVjdHMuZmluZCgocCkgPT4gcC5uYW1lID09PSBuYW1lKTtcblx0XHRcdGlmIChmb3VuZCA9PSBudWxsKSB7XG5cdFx0XHRcdHRocm93IG5ldyBFcnJvcihgUHJvamVjdCBcIiR7bmFtZX1cIiBub3QgZm91bmQgaW4gd29ya3NwYWNlYCk7XG5cdFx0XHR9XG5cdFx0XHRzZWxlY3RlZC5wdXNoKGZvdW5kKTtcblx0XHR9XG5cdFx0cmV0dXJuIHNlbGVjdGVkO1xuXHR9XG5cblx0LyoqXG5cdCAqIFBvc3QtbmV4dCBkZXBlbmRlbmN5IHRyYWNrZXI6IHJlY29yZHMgd2hpY2ggc291cmNlIGZpbGVzIGltcG9ydCB3aGljaFxuXHQgKiBvdGhlciBzb3VyY2UgZmlsZXMgc28gdGhhdCByZWxvYWRJZkFmZmVjdGVkIGNhbiB0cmF2ZXJzZSB0aGUgZ3JhcGguXG5cdCAqL1xuXHRwcml2YXRlIG9uUG9zdFJlc29sdmUgPSAocmVzdWx0OiBSZXNvbHZlRm5PdXRwdXQsIHBhcmVudFVybDogc3RyaW5nKSA9PiB7XG5cdFx0Y29uc3QgeyB1cmwgfSA9IHJlc3VsdDtcblx0XHRjb25zdCBwYXJlbnRVcmxDbGVhbiA9IHBhcmVudFVybC5zcGxpdChcIj9cIilbMF07XG5cblx0XHRsZXQgZmlsZVBhdGg6IHN0cmluZztcblx0XHRsZXQgcGFyZW50UGF0aDogc3RyaW5nO1xuXG5cdFx0dHJ5IHtcblx0XHRcdGNvbnN0IHVybE9iaiA9IG5ldyBVUkwodXJsKTtcblx0XHRcdHVybE9iai5zZWFyY2ggPSBcIlwiO1xuXHRcdFx0ZmlsZVBhdGggPSBpby5maWxlVXJsVG9QYXRoKHVybE9iai50b1N0cmluZygpKTtcblx0XHR9IGNhdGNoIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHR0cnkge1xuXHRcdFx0cGFyZW50UGF0aCA9IGlvLmZpbGVVcmxUb1BhdGgocGFyZW50VXJsQ2xlYW4pO1xuXHRcdH0gY2F0Y2gge1xuXHRcdFx0cGFyZW50UGF0aCA9IFwiXCI7XG5cdFx0fVxuXG5cdFx0Y29uc3QgaXNTb3VyY2UgPSB0aGlzLmxvYWRlci5oYXNTb3VyY2VGaWxlKGZpbGVQYXRoKTtcblx0XHRjb25zdCBwYXJlbnRJc1NvdXJjZSA9IHRoaXMubG9hZGVyLmhhc1NvdXJjZUZpbGUocGFyZW50UGF0aCk7XG5cblx0XHRpZiAoaXNTb3VyY2UgfHwgcGFyZW50SXNTb3VyY2UpIHtcblx0XHRcdHRoaXMudHJhY2tEZXBlbmRlbmN5KGZpbGVQYXRoLCBwYXJlbnRQYXRoKTtcblx0XHR9XG5cdH07XG5cblx0Ly8g4pSA4pSAIEZpbGUgd2F0Y2hpbmcg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cblx0cHJpdmF0ZSBvbkZpbGVDaGFuZ2UgPSAoZXZ0OiBQcm9qZWN0RmlsZUV2ZW50KSA9PiB7XG5cdFx0Y29uc3QgeyBmaWxlLCBldmVudE5hbWUsIHByb2plY3QgfSA9IGV2dDtcblx0XHRjb25zdCBmdWxsUGF0aCA9IGZpbGUuZnVsbFBhdGg7XG5cblx0XHR0aGlzLmxvZ2dlci50cmFjZShgRmlsZSAke2V2ZW50TmFtZX06ICR7ZnVsbFBhdGh9YCk7XG5cblx0XHRpZiAoZXZlbnROYW1lID09PSBpby5XYXRjaEV2ZW50cy51bmxpbmspIHtcblx0XHRcdHRoaXMubG9hZGVyLmludmFsaWRhdGVUcmFuc3BpbGUoZnVsbFBhdGgpO1xuXHRcdFx0dGhpcy5tb2R1bGVDYWNoZS5zZXQoZnVsbFBhdGgsIG51bGwpO1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdGlmIChldmVudE5hbWUgPT09IGlvLldhdGNoRXZlbnRzLmFkZCkge1xuXHRcdFx0aWYgKHByb2plY3QuaXNTb3VyY2VGaWxlKGZpbGUpKSB7XG5cdFx0XHRcdHRoaXMubG9hZGVyLnNldFNvdXJjZUZpbGUoZnVsbFBhdGgsIHByb2plY3QpO1xuXHRcdFx0XHR0aGlzLm1vZHVsZUNhY2hlLnNldChmdWxsUGF0aCwgbnVsbCk7XG5cdFx0XHRcdHRoaXMucmVsb2FkSWZBZmZlY3RlZChmdWxsUGF0aCk7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Ly8gY2hhbmdlXG5cdFx0aWYgKCFwcm9qZWN0LmlzU291cmNlRmlsZShmaWxlKSkgcmV0dXJuO1xuXHRcdHRoaXMubG9hZGVyLmludmFsaWRhdGVUcmFuc3BpbGUoZnVsbFBhdGgpO1xuXHRcdHRoaXMucmVsb2FkSWZBZmZlY3RlZChmdWxsUGF0aCk7XG5cdH07XG5cblx0cHJpdmF0ZSByZWxvYWRJZkFmZmVjdGVkKGZ1bGxQYXRoOiBzdHJpbmcpOiBib29sZWFuIHtcblx0XHRjb25zdCBkZXBzID0gdGhpcy5nZXREZXBlbmRlbmN5R3JhcGgoZnVsbFBhdGgpO1xuXHRcdGNvbnN0IG1vZHVsZXMgPSBbLi4ubmV3IFNldChbLi4uZGVwcywgZnVsbFBhdGhdKV07XG5cdFx0Y29uc3QgYWZmZWN0ZWRFbnRyaWVzID0gWy4uLnRoaXMuZW50cmllcy5rZXlzKCldLmZpbHRlcigoZW50cnlQYXRoKSA9PlxuXHRcdFx0bW9kdWxlcy5pbmNsdWRlcyhlbnRyeVBhdGgpLFxuXHRcdCk7XG5cblx0XHRpZiAoYWZmZWN0ZWRFbnRyaWVzLmxlbmd0aCA9PT0gMCkge1xuXHRcdFx0dGhpcy5sb2dnZXIudHJhY2UoYENoYW5nZSBpbiAke2Z1bGxQYXRofSBkb2VzIG5vdCBhZmZlY3QgZW50cnkg4oCUIHNraXBwaW5nIHJlbG9hZGApO1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblxuXHRcdHRoaXMubG9nZ2VyLnRyYWNlKFxuXHRcdFx0YENoYW5nZSBpbiAke2Z1bGxQYXRofSBhZmZlY3RzICR7bW9kdWxlcy5sZW5ndGh9IG1vZHVsZShzKSDigJQgc2NoZWR1bGluZyByZWxvYWRgLFxuXHRcdCk7XG5cdFx0dGhpcy5pbnZhbGlkYXRlTW9kdWxlQ2FjaGVzKC4uLm1vZHVsZXMpO1xuXHRcdGZvciAoY29uc3QgbW9kdWxlIG9mIG1vZHVsZXMpIHtcblx0XHRcdHRoaXMucGVuZGluZ0dyYXBoUHJ1bmUuYWRkKG1vZHVsZSk7XG5cdFx0fVxuXHRcdGZvciAoY29uc3QgZW50cnlQYXRoIG9mIGFmZmVjdGVkRW50cmllcykge1xuXHRcdFx0dGhpcy5wZW5kaW5nRW50cnlSZWJvb3RzLmFkZChlbnRyeVBhdGgpO1xuXHRcdH1cblx0XHR0aGlzLnBlbmRpbmdUcmlnZ2Vycy5hZGQoZnVsbFBhdGgpO1xuXHRcdHRoaXMuc2NoZWR1bGVSZWJvb3QoKTtcblx0XHRyZXR1cm4gdHJ1ZTtcblx0fVxuXG5cdC8vIOKUgOKUgCBEZXBlbmRlbmN5IGdyYXBoIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG5cdHByaXZhdGUgZ2V0RGVwZW5kZW5jeUdyYXBoKG1vZHVsZUlkOiBzdHJpbmcsIHBhcmVudE1vZHVsZXM6IHN0cmluZ1tdID0gW10pOiBzdHJpbmdbXSB7XG5cdFx0aWYgKHRoaXMuaXNTZWxmKG1vZHVsZUlkKSkgcmV0dXJuIFtdO1xuXG5cdFx0Y29uc3QgbW9kdWxlRGVwcyA9IHRoaXMuZGVwZW5kZW5jaWVzLmdldChtb2R1bGVJZCkgPz8gW107XG5cdFx0aWYgKHBhcmVudE1vZHVsZXMuaW5jbHVkZXMobW9kdWxlSWQpKSB7XG5cdFx0XHR0aGlzLmxvZ2dlci5lcnJvcihgQ2lyY3VsYXIgcmVmZXJlbmNlIGRldGVjdGVkOiAke21vZHVsZUlkfWApO1xuXHRcdFx0cmV0dXJuIFtdO1xuXHRcdH1cblxuXHRcdGxldCBzdWJEZXBzOiBzdHJpbmdbXSA9IFtdO1xuXHRcdGZvciAoY29uc3QgZGVwIG9mIG1vZHVsZURlcHMpIHtcblx0XHRcdGlmICghdGhpcy5sb2FkZXIuaGFzU291cmNlRmlsZShkZXApKSBjb250aW51ZTtcblx0XHRcdGNvbnN0IHN1YnMgPSB0aGlzLmdldERlcGVuZGVuY3lHcmFwaChkZXAsIFttb2R1bGVJZCwgLi4ucGFyZW50TW9kdWxlc10pO1xuXHRcdFx0c3ViRGVwcyA9IFsuLi5zdWJEZXBzLCAuLi5zdWJzXTtcblx0XHR9XG5cblx0XHRyZXR1cm4gWy4uLm5ldyBTZXQoWy4uLm1vZHVsZURlcHMsIC4uLnN1YkRlcHNdKV07XG5cdH1cblxuXHRwcml2YXRlIHRyYWNrRGVwZW5kZW5jeShmaWxlUGF0aDogc3RyaW5nLCBwYXJlbnRQYXRoOiBzdHJpbmcpIHtcblx0XHRpZiAoIXBhcmVudFBhdGgpIHJldHVybjtcblx0XHRjb25zdCBkZXBzID0gdGhpcy5kZXBlbmRlbmNpZXMuZ2V0KGZpbGVQYXRoKSA/PyBbXTtcblx0XHRjb25zdCB1cGRhdGVkRGVwcyA9IG5ldyBTZXQoWy4uLmRlcHMsIHBhcmVudFBhdGhdKTtcblx0XHR0aGlzLmRlcGVuZGVuY2llcy5zZXQoZmlsZVBhdGgsIFsuLi51cGRhdGVkRGVwc10pO1xuXHR9XG5cblx0Ly8g4pSA4pSAIE1vZHVsZSBjYWNoZSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuXHRwcml2YXRlIGdldENhY2hlZE9yTmV3KG1vZHVsZVVybDogc3RyaW5nKSB7XG5cdFx0Y29uc3QgZmlsZVBhdGggPSBpby5maWxlVXJsVG9QYXRoKG1vZHVsZVVybCk7XG5cdFx0Y29uc3QgY2FjaGVkID0gdGhpcy5tb2R1bGVDYWNoZS5nZXQoZmlsZVBhdGgpO1xuXHRcdGNvbnN0IHZlcnNpb25lZCA9IGNhY2hlZCA/PyB0aGlzLnZlcnNpb25Nb2R1bGUobW9kdWxlVXJsKTtcblx0XHR0aGlzLm1vZHVsZUNhY2hlLnNldChmaWxlUGF0aCwgdmVyc2lvbmVkKTtcblx0XHRyZXR1cm4gdmVyc2lvbmVkO1xuXHR9XG5cblx0cHJpdmF0ZSB2ZXJzaW9uTW9kdWxlKG1vZHVsZVVybDogc3RyaW5nKSB7XG5cdFx0Y29uc3QgdmVyc2lvbmVkVXJsID0gbmV3IFVSTChtb2R1bGVVcmwpO1xuXHRcdHZlcnNpb25lZFVybC5zZWFyY2hQYXJhbXMuc2V0KFZFUlNJT05fVVJMX1BBUkFNLCBTdHJpbmcoKyttb2R1bGVWZXJzaW9uU2VxKSk7XG5cdFx0cmV0dXJuIHZlcnNpb25lZFVybC50b1N0cmluZygpO1xuXHR9XG5cblx0cHJpdmF0ZSBpbnZhbGlkYXRlTW9kdWxlQ2FjaGVzKC4uLm1vZHVsZXM6IHN0cmluZ1tdKSB7XG5cdFx0Zm9yIChjb25zdCBtb2R1bGUgb2YgbW9kdWxlcykge1xuXHRcdFx0dGhpcy5tb2R1bGVDYWNoZS5zZXQobW9kdWxlLCBudWxsKTtcblx0XHRcdHRoaXMubG9hZGVyLmludmFsaWRhdGVUcmFuc3BpbGUobW9kdWxlKTtcblx0XHR9XG5cdH1cblxuXHRwcml2YXRlIHBydW5lUGVuZGluZ0RlcGVuZGVuY3lFZGdlcygpIHtcblx0XHRjb25zdCBtb2R1bGVzID0gWy4uLnRoaXMucGVuZGluZ0dyYXBoUHJ1bmVdO1xuXHRcdHRoaXMucGVuZGluZ0dyYXBoUHJ1bmUuY2xlYXIoKTtcblx0XHR0aGlzLnBydW5lRGVwZW5kZW5jeVBhcmVudHMoLi4ubW9kdWxlcyk7XG5cdH1cblxuXHQvKiogUmVtb3ZlIHRoZXNlIG1vZHVsZXMgYXMgcGFyZW50cyBzbyBib290IGNhbiByZWJ1aWxkIGVkZ2VzIHdpdGhvdXQgc3RhbGUgaW1wb3J0ZXJzLiAqL1xuXHRwcml2YXRlIHBydW5lRGVwZW5kZW5jeVBhcmVudHMoLi4ubW9kdWxlczogc3RyaW5nW10pIHtcblx0XHRmb3IgKGNvbnN0IG1vZHVsZSBvZiBtb2R1bGVzKSB7XG5cdFx0XHRmb3IgKGNvbnN0IFtrZXksIHBhcmVudHNdIG9mIHRoaXMuZGVwZW5kZW5jaWVzKSB7XG5cdFx0XHRcdGNvbnN0IGZpbHRlcmVkID0gcGFyZW50cy5maWx0ZXIoKHApID0+IHAgIT09IG1vZHVsZSk7XG5cdFx0XHRcdGlmIChmaWx0ZXJlZC5sZW5ndGggPT09IDApIHtcblx0XHRcdFx0XHR0aGlzLmRlcGVuZGVuY2llcy5kZWxldGUoa2V5KTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHR0aGlzLmRlcGVuZGVuY2llcy5zZXQoa2V5LCBmaWx0ZXJlZCk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHRwcml2YXRlIGludmFsaWRhdGVBbGxTb3VyY2VGaWxlcygpIHtcblx0XHRmb3IgKGNvbnN0IGZpbGVQYXRoIG9mIHRoaXMubG9hZGVyLnNvdXJjZUZpbGVQYXRocygpKSB7XG5cdFx0XHR0aGlzLm1vZHVsZUNhY2hlLnNldChmaWxlUGF0aCwgbnVsbCk7XG5cdFx0fVxuXHR9XG5cblx0cHJpdmF0ZSBpc1NlbGYoZmlsZVBhdGg6IHN0cmluZykge1xuXHRcdHJldHVybiBjdXJyZW50RmlsZVBhdGggPT09IHBhdGgucmVzb2x2ZShmaWxlUGF0aCk7XG5cdH1cblxuXHRwcml2YXRlIGxhYmVsc0ZvcihlbnRyeVBhdGhzOiByZWFkb25seSBzdHJpbmdbXSk6IHN0cmluZ1tdIHtcblx0XHRyZXR1cm4gZW50cnlQYXRocy5tYXAoXG5cdFx0XHQoZW50cnlQYXRoKSA9PiB0aGlzLmVudHJpZXMuZ2V0KGVudHJ5UGF0aCk/LmxhYmVsID8/IHBhdGguYmFzZW5hbWUoZW50cnlQYXRoKSxcblx0XHQpO1xuXHR9XG5cblx0cHJpdmF0ZSB0YWtlVHJpZ2dlcnMoKTogc3RyaW5nW10ge1xuXHRcdGNvbnN0IHRyaWdnZXJzID0gWy4uLnRoaXMucGVuZGluZ1RyaWdnZXJzXS5tYXAoKGZ1bGxQYXRoKSA9PiB0aGlzLmZvcm1hdFRyaWdnZXIoZnVsbFBhdGgpKTtcblx0XHR0aGlzLnBlbmRpbmdUcmlnZ2Vycy5jbGVhcigpO1xuXHRcdHJldHVybiB0cmlnZ2Vycztcblx0fVxuXG5cdHByaXZhdGUgZm9ybWF0VHJpZ2dlcihmdWxsUGF0aDogc3RyaW5nKTogc3RyaW5nIHtcblx0XHRjb25zdCByb290ID0gdGhpcy5sb2FkZXIuZ2V0V29ya3NwYWNlKCk/LnJvb3REaXI7XG5cdFx0aWYgKHJvb3QgIT0gbnVsbCkge1xuXHRcdFx0Y29uc3QgcmVsID0gcGF0aC5yZWxhdGl2ZShwYXRoLnJlc29sdmUocm9vdCksIGZ1bGxQYXRoKTtcblx0XHRcdGlmIChyZWwgIT09IFwiXCIgJiYgIXJlbC5zdGFydHNXaXRoKFwiLi5cIikgJiYgIXBhdGguaXNBYnNvbHV0ZShyZWwpKSB7XG5cdFx0XHRcdHJldHVybiByZWwucmVwbGFjZUFsbChcIlxcXFxcIiwgXCIvXCIpO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gcGF0aC5iYXNlbmFtZShmdWxsUGF0aCk7XG5cdH1cbn1cbiJdLCJuYW1lcyI6WyJERUZBVUxUX1JFQk9PVF9ERUJPVU5DRV9NUyIsIkhvdFJlbG9hZFNlcnZlciIsImZvcm1hdEZsdXhSZWJvb3RSZWFkeSIsImZvcm1hdEZsdXhSZWJvb3RTdGFydCIsInJlc29sdmVSZWJvb3REZWJvdW5jZU1zIiwiY3VycmVudEZpbGVQYXRoIiwiaW8iLCJmaWxlVXJsVG9QYXRoIiwiVkVSU0lPTl9VUkxfUEFSQU0iLCJNQVhfUkVCT09UX1RSSUdHRVJfUEFUSFMiLCJ2YWx1ZSIsImRlbGF5IiwiTnVtYmVyIiwiaXNGaW5pdGUiLCJFcnJvciIsIlN0cmluZyIsImZvcm1hdFRyaWdnZXJMaXN0IiwidHJpZ2dlcnMiLCJsZW5ndGgiLCJ1bmRlZmluZWQiLCJqb2luIiwic2xpY2UiLCJCQU5ORVJfUlVMRSIsInJlcGVhdCIsIndyYXBGbHV4QmFubmVyIiwidGl0bGUiLCJkZXRhaWxzIiwiYm9keSIsIm1hcCIsImxpbmUiLCJsYWJlbHMiLCJ3aG8iLCJmaWxlcyIsImVsYXBzZWRNcyIsIk1hdGgiLCJtYXgiLCJyb3VuZCIsIm1vZHVsZVZlcnNpb25TZXEiLCJFdmVudEVtaXR0ZXIiLCJsb2dnZXIiLCJzY3JpYmUiLCJuYW1lIiwibG9hZGVyIiwiU291cmNlTW9kdWxlTG9hZGVyIiwiZGlzcG9zZWQiLCJlbnRyaWVzIiwiTWFwIiwicGVuZGluZ0VudHJ5UmVib290cyIsIlNldCIsInBlbmRpbmdUcmlnZ2VycyIsIndhdGNoU3Vic2NyaXB0aW9uIiwibW9kdWxlQ2FjaGUiLCJkZXBlbmRlbmNpZXMiLCJyZWJvb3RUYWlsIiwiUHJvbWlzZSIsInJlc29sdmUiLCJyZWJvb3REZWJvdW5jZUdlbiIsInJlYm9vdEluRmxpZ2h0IiwicmVib290Rm9sbG93VXAiLCJyZWJvb3RRdWV1ZWQiLCJwZW5kaW5nR3JhcGhQcnVuZSIsInNjaGVkdWxlUmVib290Iiwic3RhcnQiLCJvcHRpb25zIiwiY2xlYXIiLCJiaW5kU2NoZWR1bGVSZWJvb3QiLCJyZWJvb3REZWJvdW5jZU1zIiwiYnVpbGRDb25maWciLCJjb25maWd1cmUiLCJ3b3Jrc3BhY2UiLCJ2ZXJzaW9uRmlsZVVybCIsImZpbGVVcmwiLCJnZXRDYWNoZWRPck5ldyIsIm9uUmVzb2x2ZWQiLCJvblBvc3RSZXNvbHZlIiwicmVxdWlyZVdvcmtzcGFjZSIsInNlbGVjdGVkIiwicmVzb2x2ZVByb2plY3RzIiwicHJvamVjdCIsImVudHJ5UGF0aCIsInBhdGgiLCJnZXRTb3VyY2VFbnRyeVBhdGgiLCJzZXQiLCJsYWJlbCIsInJlZ2lzdGVySG9va3MiLCJpbnZhbGlkYXRlQWxsU291cmNlRmlsZXMiLCJ3YXRjaCIsInByb2plY3RGaWxlQ2hhbmdlZCQiLCJzdWJzY3JpYmUiLCJvbkZpbGVDaGFuZ2UiLCJlbnRyeSIsInZhbHVlcyIsInRyYWNlIiwiYm9vdEVudHJpZXMiLCJrZXlzIiwiZW1pdCIsImRpc3Bvc2UiLCJ1bnN1YnNjcmliZSIsImRpc3Bvc2VFbnRyaWVzIiwiU3ltYm9sIiwiYXN5bmNEaXNwb3NlIiwiZW50cnlQYXRocyIsImFsbCIsImJvb3RFbnRyeSIsInN0YXRlIiwiZ2V0IiwibW9kIiwiaW1wb3J0RW50cnkiLCJtb2R1bGUiLCJkZWZhdWx0IiwiZXJyb3IiLCJkZWxheU1zIiwiZ2VuIiwiZGVib3VuY2UiLCJyZXF1ZXN0UmVib290IiwidGhlbiIsInJ1blJlYm9vdCIsInRvUmVib290Iiwic2l6ZSIsInBydW5lUGVuZGluZ0RlcGVuZGVuY3lFZGdlcyIsInN0YXJ0ZWRBdCIsIkRhdGUiLCJub3ciLCJsYWJlbHNGb3IiLCJ0YWtlVHJpZ2dlcnMiLCJpbmZvIiwibmVlZHNGb2xsb3dVcCIsImRpc3Bvc2VFbnRyeSIsInBhdGhzIiwicCIsImdldFdvcmtzcGFjZSIsInByb2plY3RzIiwiZ2V0UHJvamVjdHMiLCJuYW1lcyIsImZpcnN0IiwiYXQiLCJmb3VuZCIsImZpbmQiLCJwdXNoIiwicmVzdWx0IiwicGFyZW50VXJsIiwidXJsIiwicGFyZW50VXJsQ2xlYW4iLCJzcGxpdCIsImZpbGVQYXRoIiwicGFyZW50UGF0aCIsInVybE9iaiIsIlVSTCIsInNlYXJjaCIsInRvU3RyaW5nIiwiaXNTb3VyY2UiLCJoYXNTb3VyY2VGaWxlIiwicGFyZW50SXNTb3VyY2UiLCJ0cmFja0RlcGVuZGVuY3kiLCJldnQiLCJmaWxlIiwiZXZlbnROYW1lIiwiZnVsbFBhdGgiLCJXYXRjaEV2ZW50cyIsInVubGluayIsImludmFsaWRhdGVUcmFuc3BpbGUiLCJhZGQiLCJpc1NvdXJjZUZpbGUiLCJzZXRTb3VyY2VGaWxlIiwicmVsb2FkSWZBZmZlY3RlZCIsImRlcHMiLCJnZXREZXBlbmRlbmN5R3JhcGgiLCJtb2R1bGVzIiwiYWZmZWN0ZWRFbnRyaWVzIiwiZmlsdGVyIiwiaW5jbHVkZXMiLCJpbnZhbGlkYXRlTW9kdWxlQ2FjaGVzIiwibW9kdWxlSWQiLCJwYXJlbnRNb2R1bGVzIiwiaXNTZWxmIiwibW9kdWxlRGVwcyIsInN1YkRlcHMiLCJkZXAiLCJzdWJzIiwidXBkYXRlZERlcHMiLCJtb2R1bGVVcmwiLCJjYWNoZWQiLCJ2ZXJzaW9uZWQiLCJ2ZXJzaW9uTW9kdWxlIiwidmVyc2lvbmVkVXJsIiwic2VhcmNoUGFyYW1zIiwicHJ1bmVEZXBlbmRlbmN5UGFyZW50cyIsImtleSIsInBhcmVudHMiLCJmaWx0ZXJlZCIsImRlbGV0ZSIsInNvdXJjZUZpbGVQYXRocyIsImJhc2VuYW1lIiwiZm9ybWF0VHJpZ2dlciIsInJvb3QiLCJyb290RGlyIiwicmVsIiwicmVsYXRpdmUi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
|
|
@@ -7,6 +7,7 @@ import { SourceModuleLoader } from "./source-module-loader.js";
|
|
|
7
7
|
const currentFilePath = io.fileUrlToPath(import.meta.url);
|
|
8
8
|
const VERSION_URL_PARAM = "version";
|
|
9
9
|
/** Default quiet window before a file-change reboot. */ export const DEFAULT_REBOOT_DEBOUNCE_MS = 250;
|
|
10
|
+
/** How many triggering paths to print on the info banner before `+N`. */ const MAX_REBOOT_TRIGGER_PATHS = 4;
|
|
10
11
|
export function resolveRebootDebounceMs(value) {
|
|
11
12
|
const delay = value ?? DEFAULT_REBOOT_DEBOUNCE_MS;
|
|
12
13
|
if (!Number.isFinite(delay) || delay < 0) {
|
|
@@ -14,6 +15,34 @@ export function resolveRebootDebounceMs(value) {
|
|
|
14
15
|
}
|
|
15
16
|
return delay;
|
|
16
17
|
}
|
|
18
|
+
function formatTriggerList(triggers) {
|
|
19
|
+
if (triggers.length === 0) return undefined;
|
|
20
|
+
if (triggers.length <= MAX_REBOOT_TRIGGER_PATHS) return triggers.join(", ");
|
|
21
|
+
return `${triggers.slice(0, MAX_REBOOT_TRIGGER_PATHS).join(", ")}, +${triggers.length - MAX_REBOOT_TRIGGER_PATHS}`;
|
|
22
|
+
}
|
|
23
|
+
const BANNER_RULE = "═".repeat(56);
|
|
24
|
+
function wrapFluxBanner(title, details) {
|
|
25
|
+
const body = details.map((line)=>` ${line}`).join("\n");
|
|
26
|
+
return `\n${BANNER_RULE}\n ${title}\n${body}\n${BANNER_RULE}\n`;
|
|
27
|
+
}
|
|
28
|
+
/** Info-level HMR start block — keep `flux reboot` in the text so operators can search the buffer. */ export function formatFluxRebootStart(labels, triggers = []) {
|
|
29
|
+
const who = labels.join(", ") || "entry";
|
|
30
|
+
const files = formatTriggerList(triggers);
|
|
31
|
+
const details = files == null ? [
|
|
32
|
+
who
|
|
33
|
+
] : [
|
|
34
|
+
who,
|
|
35
|
+
files
|
|
36
|
+
];
|
|
37
|
+
return wrapFluxBanner("FLUX REBOOT", details);
|
|
38
|
+
}
|
|
39
|
+
/** Info-level HMR finish block. */ export function formatFluxRebootReady(labels, elapsedMs) {
|
|
40
|
+
const who = labels.join(", ") || "entry";
|
|
41
|
+
return wrapFluxBanner("FLUX READY", [
|
|
42
|
+
who,
|
|
43
|
+
`${Math.max(0, Math.round(elapsedMs))}ms`
|
|
44
|
+
]);
|
|
45
|
+
}
|
|
17
46
|
/** Process-wide: Node's ESM cache is process-global, including across HotReloadServer instances. */ let moduleVersionSeq = 0;
|
|
18
47
|
export class HotReloadServer extends EventEmitter {
|
|
19
48
|
// ── State ────────────────────────────────────────────────────────────────
|
|
@@ -22,6 +51,7 @@ export class HotReloadServer extends EventEmitter {
|
|
|
22
51
|
disposed = false;
|
|
23
52
|
/** Absolute entry paths currently served (one or more Flux apps). */ entries = new Map();
|
|
24
53
|
pendingEntryReboots = new Set();
|
|
54
|
+
/** Source paths that scheduled the next reboot (cleared when that reboot starts). */ pendingTriggers = new Set();
|
|
25
55
|
watchSubscription;
|
|
26
56
|
moduleCache = new Map();
|
|
27
57
|
dependencies = new Map();
|
|
@@ -39,6 +69,7 @@ export class HotReloadServer extends EventEmitter {
|
|
|
39
69
|
this.moduleCache.clear();
|
|
40
70
|
this.entries.clear();
|
|
41
71
|
this.pendingEntryReboots.clear();
|
|
72
|
+
this.pendingTriggers.clear();
|
|
42
73
|
this.pendingGraphPrune.clear();
|
|
43
74
|
this.rebootTail = Promise.resolve();
|
|
44
75
|
this.rebootInFlight = false;
|
|
@@ -57,7 +88,8 @@ export class HotReloadServer extends EventEmitter {
|
|
|
57
88
|
for (const project of selected){
|
|
58
89
|
const entryPath = path.resolve(project.getSourceEntryPath());
|
|
59
90
|
this.entries.set(entryPath, {
|
|
60
|
-
path: entryPath
|
|
91
|
+
path: entryPath,
|
|
92
|
+
label: project.name
|
|
61
93
|
});
|
|
62
94
|
}
|
|
63
95
|
this.loader.registerHooks();
|
|
@@ -135,9 +167,13 @@ export class HotReloadServer extends EventEmitter {
|
|
|
135
167
|
// Drop reverse edges only when rebooting so later saves in the debounce
|
|
136
168
|
// window can still walk the graph and reset the quiet timer.
|
|
137
169
|
this.prunePendingDependencyEdges();
|
|
138
|
-
|
|
170
|
+
const startedAt = Date.now();
|
|
171
|
+
const labels = this.labelsFor(toReboot);
|
|
172
|
+
const triggers = this.takeTriggers();
|
|
173
|
+
this.logger.info(formatFluxRebootStart(labels, triggers));
|
|
139
174
|
await this.disposeEntries(toReboot);
|
|
140
175
|
await this.bootEntries(toReboot);
|
|
176
|
+
this.logger.info(formatFluxRebootReady(labels, Date.now() - startedAt));
|
|
141
177
|
this.emit("reboot");
|
|
142
178
|
}while (this.rebootFollowUp && !this.disposed)
|
|
143
179
|
} finally{
|
|
@@ -272,6 +308,7 @@ export class HotReloadServer extends EventEmitter {
|
|
|
272
308
|
for (const entryPath of affectedEntries){
|
|
273
309
|
this.pendingEntryReboots.add(entryPath);
|
|
274
310
|
}
|
|
311
|
+
this.pendingTriggers.add(fullPath);
|
|
275
312
|
this.scheduleReboot();
|
|
276
313
|
return true;
|
|
277
314
|
}
|
|
@@ -359,6 +396,26 @@ export class HotReloadServer extends EventEmitter {
|
|
|
359
396
|
isSelf(filePath) {
|
|
360
397
|
return currentFilePath === path.resolve(filePath);
|
|
361
398
|
}
|
|
399
|
+
labelsFor(entryPaths) {
|
|
400
|
+
return entryPaths.map((entryPath)=>this.entries.get(entryPath)?.label ?? path.basename(entryPath));
|
|
401
|
+
}
|
|
402
|
+
takeTriggers() {
|
|
403
|
+
const triggers = [
|
|
404
|
+
...this.pendingTriggers
|
|
405
|
+
].map((fullPath)=>this.formatTrigger(fullPath));
|
|
406
|
+
this.pendingTriggers.clear();
|
|
407
|
+
return triggers;
|
|
408
|
+
}
|
|
409
|
+
formatTrigger(fullPath) {
|
|
410
|
+
const root = this.loader.getWorkspace()?.rootDir;
|
|
411
|
+
if (root != null) {
|
|
412
|
+
const rel = path.relative(path.resolve(root), fullPath);
|
|
413
|
+
if (rel !== "" && !rel.startsWith("..") && !path.isAbsolute(rel)) {
|
|
414
|
+
return rel.replaceAll("\\", "/");
|
|
415
|
+
}
|
|
416
|
+
}
|
|
417
|
+
return path.basename(fullPath);
|
|
418
|
+
}
|
|
362
419
|
}
|
|
363
420
|
|
|
364
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL2RlY29oZXJlL2RlY29oZXJlL3Byb2plY3RzL2ZsdXgvc3JjL2hvdC1yZWxvYWQtc2VydmVyLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEV2ZW50RW1pdHRlciB9IGZyb20gXCJub2RlOmV2ZW50c1wiO1xuaW1wb3J0IHR5cGUgeyBSZXNvbHZlRm5PdXRwdXQgfSBmcm9tIFwibm9kZTptb2R1bGVcIjtcbmltcG9ydCBwYXRoIGZyb20gXCJub2RlOnBhdGhcIjtcbmltcG9ydCB0eXBlIHsgUHJvamVjdCwgUHJvamVjdEZpbGVFdmVudCwgV29ya3NwYWNlIH0gZnJvbSBcIkBkZWNvaGVyZS9tZXNoXCI7XG5pbXBvcnQgeyBpbyB9IGZyb20gXCJAZGVjb2hlcmUvbmV4dXMvaW9cIjtcbmltcG9ydCB7IGRlYm91bmNlIH0gZnJvbSBcIkBkZWNvaGVyZS9uZXh1cy9zeXN0ZW1cIjtcbmltcG9ydCB7IHR5cGUgTG9nZ2VyLCBzY3JpYmUgfSBmcm9tIFwiQGRlY29oZXJlL3NjcmliZVwiO1xuaW1wb3J0IHR5cGUgeyBTdWJzY3JpcHRpb24gfSBmcm9tIFwicnhqc1wiO1xuaW1wb3J0IHsgU291cmNlTW9kdWxlTG9hZGVyIH0gZnJvbSBcIi4vc291cmNlLW1vZHVsZS1sb2FkZXIuanNcIjtcblxuY29uc3QgY3VycmVudEZpbGVQYXRoID0gaW8uZmlsZVVybFRvUGF0aChpbXBvcnQubWV0YS51cmwpO1xuY29uc3QgVkVSU0lPTl9VUkxfUEFSQU0gPSBcInZlcnNpb25cIjtcbi8qKiBEZWZhdWx0IHF1aWV0IHdpbmRvdyBiZWZvcmUgYSBmaWxlLWNoYW5nZSByZWJvb3QuICovXG5leHBvcnQgY29uc3QgREVGQVVMVF9SRUJPT1RfREVCT1VOQ0VfTVMgPSAyNTA7XG5cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlUmVib290RGVib3VuY2VNcyh2YWx1ZTogbnVtYmVyIHwgdW5kZWZpbmVkKTogbnVtYmVyIHtcblx0Y29uc3QgZGVsYXkgPSB2YWx1ZSA/PyBERUZBVUxUX1JFQk9PVF9ERUJPVU5DRV9NUztcblx0aWYgKCFOdW1iZXIuaXNGaW5pdGUoZGVsYXkpIHx8IGRlbGF5IDwgMCkge1xuXHRcdHRocm93IG5ldyBFcnJvcihgcmVib290RGVib3VuY2VNcyBtdXN0IGJlIGEgbm9uLW5lZ2F0aXZlIG51bWJlciwgZ290ICR7U3RyaW5nKHZhbHVlKX1gKTtcblx0fVxuXHRyZXR1cm4gZGVsYXk7XG59XG5cbi8qKiBQcm9jZXNzLXdpZGU6IE5vZGUncyBFU00gY2FjaGUgaXMgcHJvY2Vzcy1nbG9iYWwsIGluY2x1ZGluZyBhY3Jvc3MgSG90UmVsb2FkU2VydmVyIGluc3RhbmNlcy4gKi9cbmxldCBtb2R1bGVWZXJzaW9uU2VxID0gMDtcblxuZXhwb3J0IGludGVyZmFjZSBIb3RSZWxvYWRTZXJ2ZXJFdmVudHMge1xuXHRzdGFydDogW107XG5cdHJlYm9vdDogW107XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSG90UmVsb2FkU2VydmVyT3B0aW9ucyB7XG5cdC8qKiBCdWlsZCBjb25maWd1cmF0aW9uIG5hbWUuICovXG5cdGJ1aWxkQ29uZmlnOiBzdHJpbmc7XG5cdC8qKiBOYW1lIG9mIHRoZSBwcm9qZWN0IHRvIHNlcnZlLiBEZWZhdWx0cyB0byB0aGUgZmlyc3QgcHJvamVjdCBpbiB0aGUgd29ya3NwYWNlLiAqL1xuXHRwcm9qZWN0Pzogc3RyaW5nO1xuXHQvKipcblx0ICogTXVsdGlwbGUgRmx1eCBhcHAgcGFja2FnZSBuYW1lcyB0byBib290IGluIG9uZSBwcm9jZXNzIChkaXJlY3Rvcnkgc2xpY2UpLlxuXHQgKiBXaGVuIHNldCwgdGFrZXMgcHJlY2VkZW5jZSBvdmVyIHtAbGluayBwcm9qZWN0fS5cblx0ICovXG5cdHByb2plY3RzPzogcmVhZG9ubHkgc3RyaW5nW107XG5cdC8qKlxuXHQgKiBQcmUtYnVpbHQgV29ya3NwYWNlIGluc3RhbmNlIHRvIHVzZSBpbnN0ZWFkIG9mIHJ1bm5pbmcgV29ya3NwYWNlRmFjdG9yeS5cblx0ICogVXNlZnVsIGluIHRlc3RzIHRvIGJ5cGFzcyBmaWxlc3lzdGVtLWJhc2VkIHdvcmtzcGFjZSBkaXNjb3ZlcnkuXG5cdCAqL1xuXHR3b3Jrc3BhY2U/OiBXb3Jrc3BhY2U7XG5cdC8qKlxuXHQgKiBRdWlldCB3aW5kb3cgaW4gbWlsbGlzZWNvbmRzIGFmdGVyIHRoZSBsYXN0IGFmZmVjdGluZyBzYXZlIGJlZm9yZSBhIHJlYm9vdC5cblx0ICogRGVmYXVsdHMgdG8ge0BsaW5rIERFRkFVTFRfUkVCT09UX0RFQk9VTkNFX01TfS4gUmFpc2UgdGhpcyBmb3IgYWdlbnQgc2F2ZSB0cmFpbnMuXG5cdCAqL1xuXHRyZWJvb3REZWJvdW5jZU1zPzogbnVtYmVyO1xufVxuXG50eXBlIEVudHJ5U3RhdGUgPSB7IHBhdGg6IHN0cmluZzsgbW9kdWxlPzogQXN5bmNEaXNwb3NhYmxlIH07XG5cbmV4cG9ydCBjbGFzcyBIb3RSZWxvYWRTZXJ2ZXIgZXh0ZW5kcyBFdmVudEVtaXR0ZXI8SG90UmVsb2FkU2VydmVyRXZlbnRzPiB7XG5cdC8vIOKUgOKUgCBTdGF0ZSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblx0cHJpdmF0ZSByZWFkb25seSBsb2dnZXI6IExvZ2dlciA9IHNjcmliZS5sb2dnZXIoSG90UmVsb2FkU2VydmVyLm5hbWUpO1xuXHRwcml2YXRlIHJlYWRvbmx5IGxvYWRlciA9IG5ldyBTb3VyY2VNb2R1bGVMb2FkZXIoKTtcblx0cHJpdmF0ZSBkaXNwb3NlZCA9IGZhbHNlO1xuXHQvKiogQWJzb2x1dGUgZW50cnkgcGF0aHMgY3VycmVudGx5IHNlcnZlZCAob25lIG9yIG1vcmUgRmx1eCBhcHBzKS4gKi9cblx0cHJpdmF0ZSBlbnRyaWVzID0gbmV3IE1hcDxzdHJpbmcsIEVudHJ5U3RhdGU+KCk7XG5cdHByaXZhdGUgcGVuZGluZ0VudHJ5UmVib290cyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuXHRwcml2YXRlIHdhdGNoU3Vic2NyaXB0aW9uPzogU3Vic2NyaXB0aW9uO1xuXHRwcml2YXRlIG1vZHVsZUNhY2hlID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZyB8IG51bGw+KCk7XG5cdHByaXZhdGUgZGVwZW5kZW5jaWVzID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZ1tdPigpO1xuXHRwcml2YXRlIHJlYm9vdFRhaWw6IFByb21pc2U8dm9pZD4gPSBQcm9taXNlLnJlc29sdmUoKTtcblx0cHJpdmF0ZSByZWJvb3REZWJvdW5jZUdlbiA9IDA7XG5cdHByaXZhdGUgcmVib290SW5GbGlnaHQgPSBmYWxzZTtcblx0cHJpdmF0ZSByZWJvb3RGb2xsb3dVcCA9IGZhbHNlO1xuXHRwcml2YXRlIHJlYm9vdFF1ZXVlZCA9IGZhbHNlO1xuXHQvKiogTW9kdWxlcyB3aG9zZSByZXZlcnNlLWdyYXBoIGVkZ2VzIGFyZSBwcnVuZWQgYXQgcmVib290LCBub3Qgb24gc2NoZWR1bGUuICovXG5cdHByaXZhdGUgcGVuZGluZ0dyYXBoUHJ1bmUgPSBuZXcgU2V0PHN0cmluZz4oKTtcblx0cHJpdmF0ZSBzY2hlZHVsZVJlYm9vdDogKCkgPT4gdm9pZCA9ICgpID0+IHt9O1xuXG5cdC8vIOKUgOKUgCBQdWJsaWMgQVBJIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG5cdHB1YmxpYyBhc3luYyBzdGFydChvcHRpb25zOiBIb3RSZWxvYWRTZXJ2ZXJPcHRpb25zKSB7XG5cdFx0dGhpcy5kaXNwb3NlZCA9IGZhbHNlO1xuXHRcdHRoaXMuZGVwZW5kZW5jaWVzLmNsZWFyKCk7XG5cdFx0dGhpcy5tb2R1bGVDYWNoZS5jbGVhcigpO1xuXHRcdHRoaXMuZW50cmllcy5jbGVhcigpO1xuXHRcdHRoaXMucGVuZGluZ0VudHJ5UmVib290cy5jbGVhcigpO1xuXHRcdHRoaXMucGVuZGluZ0dyYXBoUHJ1bmUuY2xlYXIoKTtcblx0XHR0aGlzLnJlYm9vdFRhaWwgPSBQcm9taXNlLnJlc29sdmUoKTtcblx0XHR0aGlzLnJlYm9vdEluRmxpZ2h0ID0gZmFsc2U7XG5cdFx0dGhpcy5yZWJvb3RGb2xsb3dVcCA9IGZhbHNlO1xuXHRcdHRoaXMucmVib290UXVldWVkID0gZmFsc2U7XG5cdFx0dGhpcy5iaW5kU2NoZWR1bGVSZWJvb3QocmVzb2x2ZVJlYm9vdERlYm91bmNlTXMob3B0aW9ucy5yZWJvb3REZWJvdW5jZU1zKSk7XG5cblx0XHRjb25zdCB7IGJ1aWxkQ29uZmlnIH0gPSBvcHRpb25zO1xuXG5cdFx0YXdhaXQgdGhpcy5sb2FkZXIuY29uZmlndXJlKHtcblx0XHRcdGJ1aWxkQ29uZmlnLFxuXHRcdFx0d29ya3NwYWNlOiBvcHRpb25zLndvcmtzcGFjZSxcblx0XHRcdHZlcnNpb25GaWxlVXJsOiAoZmlsZVVybCkgPT4gdGhpcy5nZXRDYWNoZWRPck5ldyhmaWxlVXJsKSxcblx0XHRcdG9uUmVzb2x2ZWQ6IHRoaXMub25Qb3N0UmVzb2x2ZSxcblx0XHR9KTtcblxuXHRcdGNvbnN0IHdvcmtzcGFjZSA9IHRoaXMucmVxdWlyZVdvcmtzcGFjZSgpO1xuXHRcdGNvbnN0IHNlbGVjdGVkID0gdGhpcy5yZXNvbHZlUHJvamVjdHMoYnVpbGRDb25maWcsIG9wdGlvbnMpO1xuXHRcdGZvciAoY29uc3QgcHJvamVjdCBvZiBzZWxlY3RlZCkge1xuXHRcdFx0Y29uc3QgZW50cnlQYXRoID0gcGF0aC5yZXNvbHZlKHByb2plY3QuZ2V0U291cmNlRW50cnlQYXRoKCkpO1xuXHRcdFx0dGhpcy5lbnRyaWVzLnNldChlbnRyeVBhdGgsIHsgcGF0aDogZW50cnlQYXRoIH0pO1xuXHRcdH1cblxuXHRcdHRoaXMubG9hZGVyLnJlZ2lzdGVySG9va3MoKTtcblx0XHR0aGlzLmludmFsaWRhdGVBbGxTb3VyY2VGaWxlcygpO1xuXG5cdFx0YXdhaXQgd29ya3NwYWNlLndhdGNoKGJ1aWxkQ29uZmlnKTtcblx0XHR0aGlzLndhdGNoU3Vic2NyaXB0aW9uID0gd29ya3NwYWNlLnByb2plY3RGaWxlQ2hhbmdlZCQuc3Vic2NyaWJlKHRoaXMub25GaWxlQ2hhbmdlKTtcblxuXHRcdGZvciAoY29uc3QgZW50cnkgb2YgdGhpcy5lbnRyaWVzLnZhbHVlcygpKSB7XG5cdFx0XHR0aGlzLmxvZ2dlci50cmFjZShgU2VydmluZyAke2VudHJ5LnBhdGh9YCk7XG5cdFx0fVxuXHRcdGF3YWl0IHRoaXMuYm9vdEVudHJpZXMoWy4uLnRoaXMuZW50cmllcy5rZXlzKCldKTtcblx0XHR0aGlzLmVtaXQoXCJzdGFydFwiKTtcblx0fVxuXG5cdHB1YmxpYyBhc3luYyBkaXNwb3NlKCkge1xuXHRcdGlmICh0aGlzLmRpc3Bvc2VkKSByZXR1cm47XG5cdFx0dGhpcy5kaXNwb3NlZCA9IHRydWU7XG5cdFx0dGhpcy5yZWJvb3REZWJvdW5jZUdlbiArPSAxO1xuXHRcdHRoaXMud2F0Y2hTdWJzY3JpcHRpb24/LnVuc3Vic2NyaWJlKCk7XG5cdFx0YXdhaXQgdGhpcy5yZWJvb3RUYWlsO1xuXHRcdGF3YWl0IHRoaXMuZGlzcG9zZUVudHJpZXMoWy4uLnRoaXMuZW50cmllcy5rZXlzKCldKTtcblx0XHR0aGlzLmxvYWRlci5kaXNwb3NlKCk7XG5cdH1cblxuXHRwdWJsaWMgYXN5bmMgW1N5bWJvbC5hc3luY0Rpc3Bvc2VdKCkge1xuXHRcdGF3YWl0IHRoaXMuZGlzcG9zZSgpO1xuXHR9XG5cblx0Ly8g4pSA4pSAIExpZmVjeWNsZSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuXHRwcml2YXRlIGFzeW5jIGJvb3RFbnRyaWVzKGVudHJ5UGF0aHM6IHJlYWRvbmx5IHN0cmluZ1tdKSB7XG5cdFx0YXdhaXQgUHJvbWlzZS5hbGwoZW50cnlQYXRocy5tYXAoKGVudHJ5UGF0aCkgPT4gdGhpcy5ib290RW50cnkoZW50cnlQYXRoKSkpO1xuXHR9XG5cblx0cHJpdmF0ZSBhc3luYyBib290RW50cnkoZW50cnlQYXRoOiBzdHJpbmcpIHtcblx0XHRjb25zdCBzdGF0ZSA9IHRoaXMuZW50cmllcy5nZXQoZW50cnlQYXRoKTtcblx0XHRpZiAoc3RhdGUgPT0gbnVsbCkgcmV0dXJuO1xuXHRcdHRyeSB7XG5cdFx0XHRjb25zdCBtb2QgPSAoYXdhaXQgdGhpcy5sb2FkZXIuaW1wb3J0RW50cnkoZW50cnlQYXRoKSkgYXMge1xuXHRcdFx0XHRkZWZhdWx0PzogQXN5bmNEaXNwb3NhYmxlO1xuXHRcdFx0fTtcblx0XHRcdHN0YXRlLm1vZHVsZSA9IG1vZD8uZGVmYXVsdDtcblx0XHR9IGNhdGNoIChlcnJvcikge1xuXHRcdFx0c3RhdGUubW9kdWxlID0gdW5kZWZpbmVkO1xuXHRcdFx0dGhpcy5sb2dnZXIuZXJyb3IoXG5cdFx0XHRcdFwiVGhlcmUgd2FzIGFuIGVycm9yIGJvb3RpbmcgdGhlIGVudHJ5IHBvaW50LiBZb3VyIGFwcGxpY2F0aW9uIG1heSBub3QgZnVuY3Rpb24gYXMgZXhwZWN0ZWRcIixcblx0XHRcdFx0ZXJyb3IsXG5cdFx0XHQpO1xuXHRcdH1cblx0fVxuXG5cdHByaXZhdGUgYmluZFNjaGVkdWxlUmVib290KGRlbGF5TXM6IG51bWJlcikge1xuXHRcdGNvbnN0IGdlbiA9ICsrdGhpcy5yZWJvb3REZWJvdW5jZUdlbjtcblx0XHR0aGlzLnNjaGVkdWxlUmVib290ID0gZGVib3VuY2UoYXN5bmMgKCkgPT4ge1xuXHRcdFx0aWYgKHRoaXMuZGlzcG9zZWQgfHwgZ2VuICE9PSB0aGlzLnJlYm9vdERlYm91bmNlR2VuKSByZXR1cm47XG5cdFx0XHR0aGlzLnJlcXVlc3RSZWJvb3QoKTtcblx0XHR9LCBkZWxheU1zKTtcblx0fVxuXG5cdHByaXZhdGUgcmVxdWVzdFJlYm9vdCgpIHtcblx0XHRpZiAodGhpcy5kaXNwb3NlZCkgcmV0dXJuO1xuXHRcdGlmICh0aGlzLnJlYm9vdEluRmxpZ2h0KSB7XG5cdFx0XHR0aGlzLnJlYm9vdEZvbGxvd1VwID0gdHJ1ZTtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cdFx0aWYgKHRoaXMucmVib290UXVldWVkKSByZXR1cm47XG5cdFx0dGhpcy5yZWJvb3RRdWV1ZWQgPSB0cnVlO1xuXHRcdHRoaXMucmVib290VGFpbCA9IHRoaXMucmVib290VGFpbC50aGVuKFxuXHRcdFx0KCkgPT4gdGhpcy5ydW5SZWJvb3QoKSxcblx0XHRcdCgpID0+IHRoaXMucnVuUmVib290KCksXG5cdFx0KTtcblx0fVxuXG5cdHByaXZhdGUgYXN5bmMgcnVuUmVib290KCkge1xuXHRcdHRoaXMucmVib290UXVldWVkID0gZmFsc2U7XG5cdFx0aWYgKHRoaXMuZGlzcG9zZWQpIHJldHVybjtcblx0XHR0aGlzLnJlYm9vdEluRmxpZ2h0ID0gdHJ1ZTtcblx0XHR0cnkge1xuXHRcdFx0ZG8ge1xuXHRcdFx0XHR0aGlzLnJlYm9vdEZvbGxvd1VwID0gZmFsc2U7XG5cdFx0XHRcdGlmICh0aGlzLmRpc3Bvc2VkKSByZXR1cm47XG5cdFx0XHRcdGNvbnN0IHRvUmVib290ID1cblx0XHRcdFx0XHR0aGlzLnBlbmRpbmdFbnRyeVJlYm9vdHMuc2l6ZSA+IDBcblx0XHRcdFx0XHRcdD8gWy4uLnRoaXMucGVuZGluZ0VudHJ5UmVib290c11cblx0XHRcdFx0XHRcdDogWy4uLnRoaXMuZW50cmllcy5rZXlzKCldO1xuXHRcdFx0XHR0aGlzLnBlbmRpbmdFbnRyeVJlYm9vdHMuY2xlYXIoKTtcblx0XHRcdFx0Ly8gRHJvcCByZXZlcnNlIGVkZ2VzIG9ubHkgd2hlbiByZWJvb3Rpbmcgc28gbGF0ZXIgc2F2ZXMgaW4gdGhlIGRlYm91bmNlXG5cdFx0XHRcdC8vIHdpbmRvdyBjYW4gc3RpbGwgd2FsayB0aGUgZ3JhcGggYW5kIHJlc2V0IHRoZSBxdWlldCB0aW1lci5cblx0XHRcdFx0dGhpcy5wcnVuZVBlbmRpbmdEZXBlbmRlbmN5RWRnZXMoKTtcblx0XHRcdFx0dGhpcy5sb2dnZXIudHJhY2UoYFJlYm9vdGluZyAke3RvUmVib290Lmxlbmd0aH0gZW50cnkgbW9kdWxlKHMpYCk7XG5cdFx0XHRcdGF3YWl0IHRoaXMuZGlzcG9zZUVudHJpZXModG9SZWJvb3QpO1xuXHRcdFx0XHRhd2FpdCB0aGlzLmJvb3RFbnRyaWVzKHRvUmVib290KTtcblx0XHRcdFx0dGhpcy5lbWl0KFwicmVib290XCIpO1xuXHRcdFx0fSB3aGlsZSAodGhpcy5yZWJvb3RGb2xsb3dVcCAmJiAhdGhpcy5kaXNwb3NlZCk7XG5cdFx0fSBmaW5hbGx5IHtcblx0XHRcdGNvbnN0IG5lZWRzRm9sbG93VXAgPSB0aGlzLnJlYm9vdEZvbGxvd1VwICYmICF0aGlzLmRpc3Bvc2VkO1xuXHRcdFx0dGhpcy5yZWJvb3RGb2xsb3dVcCA9IGZhbHNlO1xuXHRcdFx0dGhpcy5yZWJvb3RJbkZsaWdodCA9IGZhbHNlO1xuXHRcdFx0aWYgKG5lZWRzRm9sbG93VXApIHRoaXMucmVxdWVzdFJlYm9vdCgpO1xuXHRcdH1cblx0fVxuXG5cdHByaXZhdGUgYXN5bmMgZGlzcG9zZUVudHJpZXMoZW50cnlQYXRoczogcmVhZG9ubHkgc3RyaW5nW10pIHtcblx0XHRhd2FpdCBQcm9taXNlLmFsbChlbnRyeVBhdGhzLm1hcCgoZW50cnlQYXRoKSA9PiB0aGlzLmRpc3Bvc2VFbnRyeShlbnRyeVBhdGgpKSk7XG5cdH1cblxuXHRwcml2YXRlIGFzeW5jIGRpc3Bvc2VFbnRyeShlbnRyeVBhdGg/OiBzdHJpbmcpIHtcblx0XHRjb25zdCBwYXRocyA9IGVudHJ5UGF0aCAhPSBudWxsID8gW2VudHJ5UGF0aF0gOiBbLi4udGhpcy5lbnRyaWVzLmtleXMoKV07XG5cdFx0Zm9yIChjb25zdCBwIG9mIHBhdGhzKSB7XG5cdFx0XHRjb25zdCBzdGF0ZSA9IHRoaXMuZW50cmllcy5nZXQocCk7XG5cdFx0XHRpZiAoc3RhdGUgPT0gbnVsbCkgY29udGludWU7XG5cdFx0XHRjb25zdCBlbnRyeSA9IHN0YXRlLm1vZHVsZTtcblx0XHRcdHN0YXRlLm1vZHVsZSA9IHVuZGVmaW5lZDtcblx0XHRcdHRyeSB7XG5cdFx0XHRcdGF3YWl0IGVudHJ5Py5bU3ltYm9sLmFzeW5jRGlzcG9zZV0oKTtcblx0XHRcdH0gY2F0Y2ggKGVycm9yKSB7XG5cdFx0XHRcdHRoaXMubG9nZ2VyLmVycm9yKFwiRW50cnkgYXN5bmNEaXNwb3NlIGZhaWxlZFwiLCBlcnJvcik7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0Ly8g4pSA4pSAIFNldHVwIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG5cdHByaXZhdGUgcmVxdWlyZVdvcmtzcGFjZSgpOiBXb3Jrc3BhY2Uge1xuXHRcdGNvbnN0IHdvcmtzcGFjZSA9IHRoaXMubG9hZGVyLmdldFdvcmtzcGFjZSgpO1xuXHRcdGlmICh3b3Jrc3BhY2UgPT0gbnVsbCkge1xuXHRcdFx0dGhyb3cgbmV3IEVycm9yKFwiU291cmNlTW9kdWxlTG9hZGVyIGhhcyBubyB3b3Jrc3BhY2UgYWZ0ZXIgY29uZmlndXJlXCIpO1xuXHRcdH1cblx0XHRyZXR1cm4gd29ya3NwYWNlO1xuXHR9XG5cblx0cHJpdmF0ZSByZXNvbHZlUHJvamVjdHMoYnVpbGRDb25maWc6IHN0cmluZywgb3B0aW9uczogSG90UmVsb2FkU2VydmVyT3B0aW9ucyk6IFByb2plY3RbXSB7XG5cdFx0Y29uc3QgcHJvamVjdHMgPSB0aGlzLmxvYWRlci5nZXRXb3Jrc3BhY2UoKT8uZ2V0UHJvamVjdHMoYnVpbGRDb25maWcpID8/IFtdO1xuXHRcdGNvbnN0IG5hbWVzID1cblx0XHRcdG9wdGlvbnMucHJvamVjdHMgIT0gbnVsbCAmJiBvcHRpb25zLnByb2plY3RzLmxlbmd0aCA+IDBcblx0XHRcdFx0PyBvcHRpb25zLnByb2plY3RzXG5cdFx0XHRcdDogb3B0aW9ucy5wcm9qZWN0ICE9IG51bGxcblx0XHRcdFx0XHQ/IFtvcHRpb25zLnByb2plY3RdXG5cdFx0XHRcdFx0OiB1bmRlZmluZWQ7XG5cblx0XHRpZiAobmFtZXMgPT0gbnVsbCkge1xuXHRcdFx0Y29uc3QgZmlyc3QgPSBwcm9qZWN0cy5hdCgwKTtcblx0XHRcdGlmIChmaXJzdCA9PSBudWxsKSB7XG5cdFx0XHRcdHRocm93IG5ldyBFcnJvcihgTm8gcHJvamVjdHMgZm91bmQgZm9yIGNvbmZpZ3VyYXRpb246ICR7YnVpbGRDb25maWd9YCk7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gW2ZpcnN0XTtcblx0XHR9XG5cblx0XHRjb25zdCBzZWxlY3RlZDogUHJvamVjdFtdID0gW107XG5cdFx0Zm9yIChjb25zdCBuYW1lIG9mIG5hbWVzKSB7XG5cdFx0XHRjb25zdCBmb3VuZCA9IHByb2plY3RzLmZpbmQoKHApID0+IHAubmFtZSA9PT0gbmFtZSk7XG5cdFx0XHRpZiAoZm91bmQgPT0gbnVsbCkge1xuXHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoYFByb2plY3QgXCIke25hbWV9XCIgbm90IGZvdW5kIGluIHdvcmtzcGFjZWApO1xuXHRcdFx0fVxuXHRcdFx0c2VsZWN0ZWQucHVzaChmb3VuZCk7XG5cdFx0fVxuXHRcdHJldHVybiBzZWxlY3RlZDtcblx0fVxuXG5cdC8qKlxuXHQgKiBQb3N0LW5leHQgZGVwZW5kZW5jeSB0cmFja2VyOiByZWNvcmRzIHdoaWNoIHNvdXJjZSBmaWxlcyBpbXBvcnQgd2hpY2hcblx0ICogb3RoZXIgc291cmNlIGZpbGVzIHNvIHRoYXQgcmVsb2FkSWZBZmZlY3RlZCBjYW4gdHJhdmVyc2UgdGhlIGdyYXBoLlxuXHQgKi9cblx0cHJpdmF0ZSBvblBvc3RSZXNvbHZlID0gKHJlc3VsdDogUmVzb2x2ZUZuT3V0cHV0LCBwYXJlbnRVcmw6IHN0cmluZykgPT4ge1xuXHRcdGNvbnN0IHsgdXJsIH0gPSByZXN1bHQ7XG5cdFx0Y29uc3QgcGFyZW50VXJsQ2xlYW4gPSBwYXJlbnRVcmwuc3BsaXQoXCI/XCIpWzBdO1xuXG5cdFx0bGV0IGZpbGVQYXRoOiBzdHJpbmc7XG5cdFx0bGV0IHBhcmVudFBhdGg6IHN0cmluZztcblxuXHRcdHRyeSB7XG5cdFx0XHRjb25zdCB1cmxPYmogPSBuZXcgVVJMKHVybCk7XG5cdFx0XHR1cmxPYmouc2VhcmNoID0gXCJcIjtcblx0XHRcdGZpbGVQYXRoID0gaW8uZmlsZVVybFRvUGF0aCh1cmxPYmoudG9TdHJpbmcoKSk7XG5cdFx0fSBjYXRjaCB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0dHJ5IHtcblx0XHRcdHBhcmVudFBhdGggPSBpby5maWxlVXJsVG9QYXRoKHBhcmVudFVybENsZWFuKTtcblx0XHR9IGNhdGNoIHtcblx0XHRcdHBhcmVudFBhdGggPSBcIlwiO1xuXHRcdH1cblxuXHRcdGNvbnN0IGlzU291cmNlID0gdGhpcy5sb2FkZXIuaGFzU291cmNlRmlsZShmaWxlUGF0aCk7XG5cdFx0Y29uc3QgcGFyZW50SXNTb3VyY2UgPSB0aGlzLmxvYWRlci5oYXNTb3VyY2VGaWxlKHBhcmVudFBhdGgpO1xuXG5cdFx0aWYgKGlzU291cmNlIHx8IHBhcmVudElzU291cmNlKSB7XG5cdFx0XHR0aGlzLnRyYWNrRGVwZW5kZW5jeShmaWxlUGF0aCwgcGFyZW50UGF0aCk7XG5cdFx0fVxuXHR9O1xuXG5cdC8vIOKUgOKUgCBGaWxlIHdhdGNoaW5nIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG5cdHByaXZhdGUgb25GaWxlQ2hhbmdlID0gKGV2dDogUHJvamVjdEZpbGVFdmVudCkgPT4ge1xuXHRcdGNvbnN0IHsgZmlsZSwgZXZlbnROYW1lLCBwcm9qZWN0IH0gPSBldnQ7XG5cdFx0Y29uc3QgZnVsbFBhdGggPSBmaWxlLmZ1bGxQYXRoO1xuXG5cdFx0dGhpcy5sb2dnZXIudHJhY2UoYEZpbGUgJHtldmVudE5hbWV9OiAke2Z1bGxQYXRofWApO1xuXG5cdFx0aWYgKGV2ZW50TmFtZSA9PT0gaW8uV2F0Y2hFdmVudHMudW5saW5rKSB7XG5cdFx0XHR0aGlzLmxvYWRlci5pbnZhbGlkYXRlVHJhbnNwaWxlKGZ1bGxQYXRoKTtcblx0XHRcdHRoaXMubW9kdWxlQ2FjaGUuc2V0KGZ1bGxQYXRoLCBudWxsKTtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRpZiAoZXZlbnROYW1lID09PSBpby5XYXRjaEV2ZW50cy5hZGQpIHtcblx0XHRcdGlmIChwcm9qZWN0LmlzU291cmNlRmlsZShmaWxlKSkge1xuXHRcdFx0XHR0aGlzLmxvYWRlci5zZXRTb3VyY2VGaWxlKGZ1bGxQYXRoLCBwcm9qZWN0KTtcblx0XHRcdFx0dGhpcy5tb2R1bGVDYWNoZS5zZXQoZnVsbFBhdGgsIG51bGwpO1xuXHRcdFx0XHR0aGlzLnJlbG9hZElmQWZmZWN0ZWQoZnVsbFBhdGgpO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdC8vIGNoYW5nZVxuXHRcdGlmICghcHJvamVjdC5pc1NvdXJjZUZpbGUoZmlsZSkpIHJldHVybjtcblx0XHR0aGlzLmxvYWRlci5pbnZhbGlkYXRlVHJhbnNwaWxlKGZ1bGxQYXRoKTtcblx0XHR0aGlzLnJlbG9hZElmQWZmZWN0ZWQoZnVsbFBhdGgpO1xuXHR9O1xuXG5cdHByaXZhdGUgcmVsb2FkSWZBZmZlY3RlZChmdWxsUGF0aDogc3RyaW5nKTogYm9vbGVhbiB7XG5cdFx0Y29uc3QgZGVwcyA9IHRoaXMuZ2V0RGVwZW5kZW5jeUdyYXBoKGZ1bGxQYXRoKTtcblx0XHRjb25zdCBtb2R1bGVzID0gWy4uLm5ldyBTZXQoWy4uLmRlcHMsIGZ1bGxQYXRoXSldO1xuXHRcdGNvbnN0IGFmZmVjdGVkRW50cmllcyA9IFsuLi50aGlzLmVudHJpZXMua2V5cygpXS5maWx0ZXIoKGVudHJ5UGF0aCkgPT5cblx0XHRcdG1vZHVsZXMuaW5jbHVkZXMoZW50cnlQYXRoKSxcblx0XHQpO1xuXG5cdFx0aWYgKGFmZmVjdGVkRW50cmllcy5sZW5ndGggPT09IDApIHtcblx0XHRcdHRoaXMubG9nZ2VyLnRyYWNlKGBDaGFuZ2UgaW4gJHtmdWxsUGF0aH0gZG9lcyBub3QgYWZmZWN0IGVudHJ5IOKAlCBza2lwcGluZyByZWxvYWRgKTtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cblx0XHR0aGlzLmxvZ2dlci50cmFjZShcblx0XHRcdGBDaGFuZ2UgaW4gJHtmdWxsUGF0aH0gYWZmZWN0cyAke21vZHVsZXMubGVuZ3RofSBtb2R1bGUocykg4oCUIHNjaGVkdWxpbmcgcmVsb2FkYCxcblx0XHQpO1xuXHRcdHRoaXMuaW52YWxpZGF0ZU1vZHVsZUNhY2hlcyguLi5tb2R1bGVzKTtcblx0XHRmb3IgKGNvbnN0IG1vZHVsZSBvZiBtb2R1bGVzKSB7XG5cdFx0XHR0aGlzLnBlbmRpbmdHcmFwaFBydW5lLmFkZChtb2R1bGUpO1xuXHRcdH1cblx0XHRmb3IgKGNvbnN0IGVudHJ5UGF0aCBvZiBhZmZlY3RlZEVudHJpZXMpIHtcblx0XHRcdHRoaXMucGVuZGluZ0VudHJ5UmVib290cy5hZGQoZW50cnlQYXRoKTtcblx0XHR9XG5cdFx0dGhpcy5zY2hlZHVsZVJlYm9vdCgpO1xuXHRcdHJldHVybiB0cnVlO1xuXHR9XG5cblx0Ly8g4pSA4pSAIERlcGVuZGVuY3kgZ3JhcGgg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cblx0cHJpdmF0ZSBnZXREZXBlbmRlbmN5R3JhcGgobW9kdWxlSWQ6IHN0cmluZywgcGFyZW50TW9kdWxlczogc3RyaW5nW10gPSBbXSk6IHN0cmluZ1tdIHtcblx0XHRpZiAodGhpcy5pc1NlbGYobW9kdWxlSWQpKSByZXR1cm4gW107XG5cblx0XHRjb25zdCBtb2R1bGVEZXBzID0gdGhpcy5kZXBlbmRlbmNpZXMuZ2V0KG1vZHVsZUlkKSA/PyBbXTtcblx0XHRpZiAocGFyZW50TW9kdWxlcy5pbmNsdWRlcyhtb2R1bGVJZCkpIHtcblx0XHRcdHRoaXMubG9nZ2VyLmVycm9yKGBDaXJjdWxhciByZWZlcmVuY2UgZGV0ZWN0ZWQ6ICR7bW9kdWxlSWR9YCk7XG5cdFx0XHRyZXR1cm4gW107XG5cdFx0fVxuXG5cdFx0bGV0IHN1YkRlcHM6IHN0cmluZ1tdID0gW107XG5cdFx0Zm9yIChjb25zdCBkZXAgb2YgbW9kdWxlRGVwcykge1xuXHRcdFx0aWYgKCF0aGlzLmxvYWRlci5oYXNTb3VyY2VGaWxlKGRlcCkpIGNvbnRpbnVlO1xuXHRcdFx0Y29uc3Qgc3VicyA9IHRoaXMuZ2V0RGVwZW5kZW5jeUdyYXBoKGRlcCwgW21vZHVsZUlkLCAuLi5wYXJlbnRNb2R1bGVzXSk7XG5cdFx0XHRzdWJEZXBzID0gWy4uLnN1YkRlcHMsIC4uLnN1YnNdO1xuXHRcdH1cblxuXHRcdHJldHVybiBbLi4ubmV3IFNldChbLi4ubW9kdWxlRGVwcywgLi4uc3ViRGVwc10pXTtcblx0fVxuXG5cdHByaXZhdGUgdHJhY2tEZXBlbmRlbmN5KGZpbGVQYXRoOiBzdHJpbmcsIHBhcmVudFBhdGg6IHN0cmluZykge1xuXHRcdGlmICghcGFyZW50UGF0aCkgcmV0dXJuO1xuXHRcdGNvbnN0IGRlcHMgPSB0aGlzLmRlcGVuZGVuY2llcy5nZXQoZmlsZVBhdGgpID8/IFtdO1xuXHRcdGNvbnN0IHVwZGF0ZWREZXBzID0gbmV3IFNldChbLi4uZGVwcywgcGFyZW50UGF0aF0pO1xuXHRcdHRoaXMuZGVwZW5kZW5jaWVzLnNldChmaWxlUGF0aCwgWy4uLnVwZGF0ZWREZXBzXSk7XG5cdH1cblxuXHQvLyDilIDilIAgTW9kdWxlIGNhY2hlIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG5cdHByaXZhdGUgZ2V0Q2FjaGVkT3JOZXcobW9kdWxlVXJsOiBzdHJpbmcpIHtcblx0XHRjb25zdCBmaWxlUGF0aCA9IGlvLmZpbGVVcmxUb1BhdGgobW9kdWxlVXJsKTtcblx0XHRjb25zdCBjYWNoZWQgPSB0aGlzLm1vZHVsZUNhY2hlLmdldChmaWxlUGF0aCk7XG5cdFx0Y29uc3QgdmVyc2lvbmVkID0gY2FjaGVkID8/IHRoaXMudmVyc2lvbk1vZHVsZShtb2R1bGVVcmwpO1xuXHRcdHRoaXMubW9kdWxlQ2FjaGUuc2V0KGZpbGVQYXRoLCB2ZXJzaW9uZWQpO1xuXHRcdHJldHVybiB2ZXJzaW9uZWQ7XG5cdH1cblxuXHRwcml2YXRlIHZlcnNpb25Nb2R1bGUobW9kdWxlVXJsOiBzdHJpbmcpIHtcblx0XHRjb25zdCB2ZXJzaW9uZWRVcmwgPSBuZXcgVVJMKG1vZHVsZVVybCk7XG5cdFx0dmVyc2lvbmVkVXJsLnNlYXJjaFBhcmFtcy5zZXQoVkVSU0lPTl9VUkxfUEFSQU0sIFN0cmluZygrK21vZHVsZVZlcnNpb25TZXEpKTtcblx0XHRyZXR1cm4gdmVyc2lvbmVkVXJsLnRvU3RyaW5nKCk7XG5cdH1cblxuXHRwcml2YXRlIGludmFsaWRhdGVNb2R1bGVDYWNoZXMoLi4ubW9kdWxlczogc3RyaW5nW10pIHtcblx0XHRmb3IgKGNvbnN0IG1vZHVsZSBvZiBtb2R1bGVzKSB7XG5cdFx0XHR0aGlzLm1vZHVsZUNhY2hlLnNldChtb2R1bGUsIG51bGwpO1xuXHRcdFx0dGhpcy5sb2FkZXIuaW52YWxpZGF0ZVRyYW5zcGlsZShtb2R1bGUpO1xuXHRcdH1cblx0fVxuXG5cdHByaXZhdGUgcHJ1bmVQZW5kaW5nRGVwZW5kZW5jeUVkZ2VzKCkge1xuXHRcdGNvbnN0IG1vZHVsZXMgPSBbLi4udGhpcy5wZW5kaW5nR3JhcGhQcnVuZV07XG5cdFx0dGhpcy5wZW5kaW5nR3JhcGhQcnVuZS5jbGVhcigpO1xuXHRcdHRoaXMucHJ1bmVEZXBlbmRlbmN5UGFyZW50cyguLi5tb2R1bGVzKTtcblx0fVxuXG5cdC8qKiBSZW1vdmUgdGhlc2UgbW9kdWxlcyBhcyBwYXJlbnRzIHNvIGJvb3QgY2FuIHJlYnVpbGQgZWRnZXMgd2l0aG91dCBzdGFsZSBpbXBvcnRlcnMuICovXG5cdHByaXZhdGUgcHJ1bmVEZXBlbmRlbmN5UGFyZW50cyguLi5tb2R1bGVzOiBzdHJpbmdbXSkge1xuXHRcdGZvciAoY29uc3QgbW9kdWxlIG9mIG1vZHVsZXMpIHtcblx0XHRcdGZvciAoY29uc3QgW2tleSwgcGFyZW50c10gb2YgdGhpcy5kZXBlbmRlbmNpZXMpIHtcblx0XHRcdFx0Y29uc3QgZmlsdGVyZWQgPSBwYXJlbnRzLmZpbHRlcigocCkgPT4gcCAhPT0gbW9kdWxlKTtcblx0XHRcdFx0aWYgKGZpbHRlcmVkLmxlbmd0aCA9PT0gMCkge1xuXHRcdFx0XHRcdHRoaXMuZGVwZW5kZW5jaWVzLmRlbGV0ZShrZXkpO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHRoaXMuZGVwZW5kZW5jaWVzLnNldChrZXksIGZpbHRlcmVkKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdHByaXZhdGUgaW52YWxpZGF0ZUFsbFNvdXJjZUZpbGVzKCkge1xuXHRcdGZvciAoY29uc3QgZmlsZVBhdGggb2YgdGhpcy5sb2FkZXIuc291cmNlRmlsZVBhdGhzKCkpIHtcblx0XHRcdHRoaXMubW9kdWxlQ2FjaGUuc2V0KGZpbGVQYXRoLCBudWxsKTtcblx0XHR9XG5cdH1cblxuXHRwcml2YXRlIGlzU2VsZihmaWxlUGF0aDogc3RyaW5nKSB7XG5cdFx0cmV0dXJuIGN1cnJlbnRGaWxlUGF0aCA9PT0gcGF0aC5yZXNvbHZlKGZpbGVQYXRoKTtcblx0fVxufVxuIl0sIm5hbWVzIjpbIkV2ZW50RW1pdHRlciIsInBhdGgiLCJpbyIsImRlYm91bmNlIiwic2NyaWJlIiwiU291cmNlTW9kdWxlTG9hZGVyIiwiY3VycmVudEZpbGVQYXRoIiwiZmlsZVVybFRvUGF0aCIsInVybCIsIlZFUlNJT05fVVJMX1BBUkFNIiwiREVGQVVMVF9SRUJPT1RfREVCT1VOQ0VfTVMiLCJyZXNvbHZlUmVib290RGVib3VuY2VNcyIsInZhbHVlIiwiZGVsYXkiLCJOdW1iZXIiLCJpc0Zpbml0ZSIsIkVycm9yIiwiU3RyaW5nIiwibW9kdWxlVmVyc2lvblNlcSIsIkhvdFJlbG9hZFNlcnZlciIsImxvZ2dlciIsIm5hbWUiLCJsb2FkZXIiLCJkaXNwb3NlZCIsImVudHJpZXMiLCJNYXAiLCJwZW5kaW5nRW50cnlSZWJvb3RzIiwiU2V0Iiwid2F0Y2hTdWJzY3JpcHRpb24iLCJtb2R1bGVDYWNoZSIsImRlcGVuZGVuY2llcyIsInJlYm9vdFRhaWwiLCJQcm9taXNlIiwicmVzb2x2ZSIsInJlYm9vdERlYm91bmNlR2VuIiwicmVib290SW5GbGlnaHQiLCJyZWJvb3RGb2xsb3dVcCIsInJlYm9vdFF1ZXVlZCIsInBlbmRpbmdHcmFwaFBydW5lIiwic2NoZWR1bGVSZWJvb3QiLCJzdGFydCIsIm9wdGlvbnMiLCJjbGVhciIsImJpbmRTY2hlZHVsZVJlYm9vdCIsInJlYm9vdERlYm91bmNlTXMiLCJidWlsZENvbmZpZyIsImNvbmZpZ3VyZSIsIndvcmtzcGFjZSIsInZlcnNpb25GaWxlVXJsIiwiZmlsZVVybCIsImdldENhY2hlZE9yTmV3Iiwib25SZXNvbHZlZCIsIm9uUG9zdFJlc29sdmUiLCJyZXF1aXJlV29ya3NwYWNlIiwic2VsZWN0ZWQiLCJyZXNvbHZlUHJvamVjdHMiLCJwcm9qZWN0IiwiZW50cnlQYXRoIiwiZ2V0U291cmNlRW50cnlQYXRoIiwic2V0IiwicmVnaXN0ZXJIb29rcyIsImludmFsaWRhdGVBbGxTb3VyY2VGaWxlcyIsIndhdGNoIiwicHJvamVjdEZpbGVDaGFuZ2VkJCIsInN1YnNjcmliZSIsIm9uRmlsZUNoYW5nZSIsImVudHJ5IiwidmFsdWVzIiwidHJhY2UiLCJib290RW50cmllcyIsImtleXMiLCJlbWl0IiwiZGlzcG9zZSIsInVuc3Vic2NyaWJlIiwiZGlzcG9zZUVudHJpZXMiLCJTeW1ib2wiLCJhc3luY0Rpc3Bvc2UiLCJlbnRyeVBhdGhzIiwiYWxsIiwibWFwIiwiYm9vdEVudHJ5Iiwic3RhdGUiLCJnZXQiLCJtb2QiLCJpbXBvcnRFbnRyeSIsIm1vZHVsZSIsImRlZmF1bHQiLCJlcnJvciIsInVuZGVmaW5lZCIsImRlbGF5TXMiLCJnZW4iLCJyZXF1ZXN0UmVib290IiwidGhlbiIsInJ1blJlYm9vdCIsInRvUmVib290Iiwic2l6ZSIsInBydW5lUGVuZGluZ0RlcGVuZGVuY3lFZGdlcyIsImxlbmd0aCIsIm5lZWRzRm9sbG93VXAiLCJkaXNwb3NlRW50cnkiLCJwYXRocyIsInAiLCJnZXRXb3Jrc3BhY2UiLCJwcm9qZWN0cyIsImdldFByb2plY3RzIiwibmFtZXMiLCJmaXJzdCIsImF0IiwiZm91bmQiLCJmaW5kIiwicHVzaCIsInJlc3VsdCIsInBhcmVudFVybCIsInBhcmVudFVybENsZWFuIiwic3BsaXQiLCJmaWxlUGF0aCIsInBhcmVudFBhdGgiLCJ1cmxPYmoiLCJVUkwiLCJzZWFyY2giLCJ0b1N0cmluZyIsImlzU291cmNlIiwiaGFzU291cmNlRmlsZSIsInBhcmVudElzU291cmNlIiwidHJhY2tEZXBlbmRlbmN5IiwiZXZ0IiwiZmlsZSIsImV2ZW50TmFtZSIsImZ1bGxQYXRoIiwiV2F0Y2hFdmVudHMiLCJ1bmxpbmsiLCJpbnZhbGlkYXRlVHJhbnNwaWxlIiwiYWRkIiwiaXNTb3VyY2VGaWxlIiwic2V0U291cmNlRmlsZSIsInJlbG9hZElmQWZmZWN0ZWQiLCJkZXBzIiwiZ2V0RGVwZW5kZW5jeUdyYXBoIiwibW9kdWxlcyIsImFmZmVjdGVkRW50cmllcyIsImZpbHRlciIsImluY2x1ZGVzIiwiaW52YWxpZGF0ZU1vZHVsZUNhY2hlcyIsIm1vZHVsZUlkIiwicGFyZW50TW9kdWxlcyIsImlzU2VsZiIsIm1vZHVsZURlcHMiLCJzdWJEZXBzIiwiZGVwIiwic3VicyIsInVwZGF0ZWREZXBzIiwibW9kdWxlVXJsIiwiY2FjaGVkIiwidmVyc2lvbmVkIiwidmVyc2lvbk1vZHVsZSIsInZlcnNpb25lZFVybCIsInNlYXJjaFBhcmFtcyIsInBydW5lRGVwZW5kZW5jeVBhcmVudHMiLCJrZXkiLCJwYXJlbnRzIiwiZmlsdGVyZWQiLCJkZWxldGUiLCJzb3VyY2VGaWxlUGF0aHMiXSwibWFwcGluZ3MiOiJBQUFBLFNBQVNBLFlBQVksUUFBUSxjQUFjO0FBRTNDLE9BQU9DLFVBQVUsWUFBWTtBQUU3QixTQUFTQyxFQUFFLFFBQVEscUJBQXFCO0FBQ3hDLFNBQVNDLFFBQVEsUUFBUSx5QkFBeUI7QUFDbEQsU0FBc0JDLE1BQU0sUUFBUSxtQkFBbUI7QUFFdkQsU0FBU0Msa0JBQWtCLFFBQVEsNEJBQTRCO0FBRS9ELE1BQU1DLGtCQUFrQkosR0FBR0ssYUFBYSxDQUFDLFlBQVlDLEdBQUc7QUFDeEQsTUFBTUMsb0JBQW9CO0FBQzFCLHNEQUFzRCxHQUN0RCxPQUFPLE1BQU1DLDZCQUE2QixJQUFJO0FBRTlDLE9BQU8sU0FBU0Msd0JBQXdCQyxLQUF5QjtJQUNoRSxNQUFNQyxRQUFRRCxTQUFTRjtJQUN2QixJQUFJLENB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
|
|
421
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL2RlY29oZXJlL2RlY29oZXJlL3Byb2plY3RzL2ZsdXgvc3JjL2hvdC1yZWxvYWQtc2VydmVyLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEV2ZW50RW1pdHRlciB9IGZyb20gXCJub2RlOmV2ZW50c1wiO1xuaW1wb3J0IHR5cGUgeyBSZXNvbHZlRm5PdXRwdXQgfSBmcm9tIFwibm9kZTptb2R1bGVcIjtcbmltcG9ydCBwYXRoIGZyb20gXCJub2RlOnBhdGhcIjtcbmltcG9ydCB0eXBlIHsgUHJvamVjdCwgUHJvamVjdEZpbGVFdmVudCwgV29ya3NwYWNlIH0gZnJvbSBcIkBkZWNvaGVyZS9tZXNoXCI7XG5pbXBvcnQgeyBpbyB9IGZyb20gXCJAZGVjb2hlcmUvbmV4dXMvaW9cIjtcbmltcG9ydCB7IGRlYm91bmNlIH0gZnJvbSBcIkBkZWNvaGVyZS9uZXh1cy9zeXN0ZW1cIjtcbmltcG9ydCB7IHR5cGUgTG9nZ2VyLCBzY3JpYmUgfSBmcm9tIFwiQGRlY29oZXJlL3NjcmliZVwiO1xuaW1wb3J0IHR5cGUgeyBTdWJzY3JpcHRpb24gfSBmcm9tIFwicnhqc1wiO1xuaW1wb3J0IHsgU291cmNlTW9kdWxlTG9hZGVyIH0gZnJvbSBcIi4vc291cmNlLW1vZHVsZS1sb2FkZXIuanNcIjtcblxuY29uc3QgY3VycmVudEZpbGVQYXRoID0gaW8uZmlsZVVybFRvUGF0aChpbXBvcnQubWV0YS51cmwpO1xuY29uc3QgVkVSU0lPTl9VUkxfUEFSQU0gPSBcInZlcnNpb25cIjtcbi8qKiBEZWZhdWx0IHF1aWV0IHdpbmRvdyBiZWZvcmUgYSBmaWxlLWNoYW5nZSByZWJvb3QuICovXG5leHBvcnQgY29uc3QgREVGQVVMVF9SRUJPT1RfREVCT1VOQ0VfTVMgPSAyNTA7XG4vKiogSG93IG1hbnkgdHJpZ2dlcmluZyBwYXRocyB0byBwcmludCBvbiB0aGUgaW5mbyBiYW5uZXIgYmVmb3JlIGArTmAuICovXG5jb25zdCBNQVhfUkVCT09UX1RSSUdHRVJfUEFUSFMgPSA0O1xuXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZVJlYm9vdERlYm91bmNlTXModmFsdWU6IG51bWJlciB8IHVuZGVmaW5lZCk6IG51bWJlciB7XG5cdGNvbnN0IGRlbGF5ID0gdmFsdWUgPz8gREVGQVVMVF9SRUJPT1RfREVCT1VOQ0VfTVM7XG5cdGlmICghTnVtYmVyLmlzRmluaXRlKGRlbGF5KSB8fCBkZWxheSA8IDApIHtcblx0XHR0aHJvdyBuZXcgRXJyb3IoYHJlYm9vdERlYm91bmNlTXMgbXVzdCBiZSBhIG5vbi1uZWdhdGl2ZSBudW1iZXIsIGdvdCAke1N0cmluZyh2YWx1ZSl9YCk7XG5cdH1cblx0cmV0dXJuIGRlbGF5O1xufVxuXG5mdW5jdGlvbiBmb3JtYXRUcmlnZ2VyTGlzdCh0cmlnZ2VyczogcmVhZG9ubHkgc3RyaW5nW10pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuXHRpZiAodHJpZ2dlcnMubGVuZ3RoID09PSAwKSByZXR1cm4gdW5kZWZpbmVkO1xuXHRpZiAodHJpZ2dlcnMubGVuZ3RoIDw9IE1BWF9SRUJPT1RfVFJJR0dFUl9QQVRIUykgcmV0dXJuIHRyaWdnZXJzLmpvaW4oXCIsIFwiKTtcblx0cmV0dXJuIGAke3RyaWdnZXJzLnNsaWNlKDAsIE1BWF9SRUJPT1RfVFJJR0dFUl9QQVRIUykuam9pbihcIiwgXCIpfSwgKyR7dHJpZ2dlcnMubGVuZ3RoIC0gTUFYX1JFQk9PVF9UUklHR0VSX1BBVEhTfWA7XG59XG5cbmNvbnN0IEJBTk5FUl9SVUxFID0gXCLilZBcIi5yZXBlYXQoNTYpO1xuXG5mdW5jdGlvbiB3cmFwRmx1eEJhbm5lcih0aXRsZTogc3RyaW5nLCBkZXRhaWxzOiByZWFkb25seSBzdHJpbmdbXSk6IHN0cmluZyB7XG5cdGNvbnN0IGJvZHkgPSBkZXRhaWxzLm1hcCgobGluZSkgPT4gYCAgJHtsaW5lfWApLmpvaW4oXCJcXG5cIik7XG5cdHJldHVybiBgXFxuJHtCQU5ORVJfUlVMRX1cXG4gICR7dGl0bGV9XFxuJHtib2R5fVxcbiR7QkFOTkVSX1JVTEV9XFxuYDtcbn1cblxuLyoqIEluZm8tbGV2ZWwgSE1SIHN0YXJ0IGJsb2NrIOKAlCBrZWVwIGBmbHV4IHJlYm9vdGAgaW4gdGhlIHRleHQgc28gb3BlcmF0b3JzIGNhbiBzZWFyY2ggdGhlIGJ1ZmZlci4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmb3JtYXRGbHV4UmVib290U3RhcnQoXG5cdGxhYmVsczogcmVhZG9ubHkgc3RyaW5nW10sXG5cdHRyaWdnZXJzOiByZWFkb25seSBzdHJpbmdbXSA9IFtdLFxuKTogc3RyaW5nIHtcblx0Y29uc3Qgd2hvID0gbGFiZWxzLmpvaW4oXCIsIFwiKSB8fCBcImVudHJ5XCI7XG5cdGNvbnN0IGZpbGVzID0gZm9ybWF0VHJpZ2dlckxpc3QodHJpZ2dlcnMpO1xuXHRjb25zdCBkZXRhaWxzID0gZmlsZXMgPT0gbnVsbCA/IFt3aG9dIDogW3dobywgZmlsZXNdO1xuXHRyZXR1cm4gd3JhcEZsdXhCYW5uZXIoXCJGTFVYIFJFQk9PVFwiLCBkZXRhaWxzKTtcbn1cblxuLyoqIEluZm8tbGV2ZWwgSE1SIGZpbmlzaCBibG9jay4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmb3JtYXRGbHV4UmVib290UmVhZHkobGFiZWxzOiByZWFkb25seSBzdHJpbmdbXSwgZWxhcHNlZE1zOiBudW1iZXIpOiBzdHJpbmcge1xuXHRjb25zdCB3aG8gPSBsYWJlbHMuam9pbihcIiwgXCIpIHx8IFwiZW50cnlcIjtcblx0cmV0dXJuIHdyYXBGbHV4QmFubmVyKFwiRkxVWCBSRUFEWVwiLCBbd2hvLCBgJHtNYXRoLm1heCgwLCBNYXRoLnJvdW5kKGVsYXBzZWRNcykpfW1zYF0pO1xufVxuXG4vKiogUHJvY2Vzcy13aWRlOiBOb2RlJ3MgRVNNIGNhY2hlIGlzIHByb2Nlc3MtZ2xvYmFsLCBpbmNsdWRpbmcgYWNyb3NzIEhvdFJlbG9hZFNlcnZlciBpbnN0YW5jZXMuICovXG5sZXQgbW9kdWxlVmVyc2lvblNlcSA9IDA7XG5cbmV4cG9ydCBpbnRlcmZhY2UgSG90UmVsb2FkU2VydmVyRXZlbnRzIHtcblx0c3RhcnQ6IFtdO1xuXHRyZWJvb3Q6IFtdO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEhvdFJlbG9hZFNlcnZlck9wdGlvbnMge1xuXHQvKiogQnVpbGQgY29uZmlndXJhdGlvbiBuYW1lLiAqL1xuXHRidWlsZENvbmZpZzogc3RyaW5nO1xuXHQvKiogTmFtZSBvZiB0aGUgcHJvamVjdCB0byBzZXJ2ZS4gRGVmYXVsdHMgdG8gdGhlIGZpcnN0IHByb2plY3QgaW4gdGhlIHdvcmtzcGFjZS4gKi9cblx0cHJvamVjdD86IHN0cmluZztcblx0LyoqXG5cdCAqIE11bHRpcGxlIEZsdXggYXBwIHBhY2thZ2UgbmFtZXMgdG8gYm9vdCBpbiBvbmUgcHJvY2VzcyAoZGlyZWN0b3J5IHNsaWNlKS5cblx0ICogV2hlbiBzZXQsIHRha2VzIHByZWNlZGVuY2Ugb3ZlciB7QGxpbmsgcHJvamVjdH0uXG5cdCAqL1xuXHRwcm9qZWN0cz86IHJlYWRvbmx5IHN0cmluZ1tdO1xuXHQvKipcblx0ICogUHJlLWJ1aWx0IFdvcmtzcGFjZSBpbnN0YW5jZSB0byB1c2UgaW5zdGVhZCBvZiBydW5uaW5nIFdvcmtzcGFjZUZhY3RvcnkuXG5cdCAqIFVzZWZ1bCBpbiB0ZXN0cyB0byBieXBhc3MgZmlsZXN5c3RlbS1iYXNlZCB3b3Jrc3BhY2UgZGlzY292ZXJ5LlxuXHQgKi9cblx0d29ya3NwYWNlPzogV29ya3NwYWNlO1xuXHQvKipcblx0ICogUXVpZXQgd2luZG93IGluIG1pbGxpc2Vjb25kcyBhZnRlciB0aGUgbGFzdCBhZmZlY3Rpbmcgc2F2ZSBiZWZvcmUgYSByZWJvb3QuXG5cdCAqIERlZmF1bHRzIHRvIHtAbGluayBERUZBVUxUX1JFQk9PVF9ERUJPVU5DRV9NU30uIFJhaXNlIHRoaXMgZm9yIGFnZW50IHNhdmUgdHJhaW5zLlxuXHQgKi9cblx0cmVib290RGVib3VuY2VNcz86IG51bWJlcjtcbn1cblxudHlwZSBFbnRyeVN0YXRlID0geyBwYXRoOiBzdHJpbmc7IGxhYmVsOiBzdHJpbmc7IG1vZHVsZT86IEFzeW5jRGlzcG9zYWJsZSB9O1xuXG5leHBvcnQgY2xhc3MgSG90UmVsb2FkU2VydmVyIGV4dGVuZHMgRXZlbnRFbWl0dGVyPEhvdFJlbG9hZFNlcnZlckV2ZW50cz4ge1xuXHQvLyDilIDilIAgU3RhdGUg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cdHByaXZhdGUgcmVhZG9ubHkgbG9nZ2VyOiBMb2dnZXIgPSBzY3JpYmUubG9nZ2VyKEhvdFJlbG9hZFNlcnZlci5uYW1lKTtcblx0cHJpdmF0ZSByZWFkb25seSBsb2FkZXIgPSBuZXcgU291cmNlTW9kdWxlTG9hZGVyKCk7XG5cdHByaXZhdGUgZGlzcG9zZWQgPSBmYWxzZTtcblx0LyoqIEFic29sdXRlIGVudHJ5IHBhdGhzIGN1cnJlbnRseSBzZXJ2ZWQgKG9uZSBvciBtb3JlIEZsdXggYXBwcykuICovXG5cdHByaXZhdGUgZW50cmllcyA9IG5ldyBNYXA8c3RyaW5nLCBFbnRyeVN0YXRlPigpO1xuXHRwcml2YXRlIHBlbmRpbmdFbnRyeVJlYm9vdHMgPSBuZXcgU2V0PHN0cmluZz4oKTtcblx0LyoqIFNvdXJjZSBwYXRocyB0aGF0IHNjaGVkdWxlZCB0aGUgbmV4dCByZWJvb3QgKGNsZWFyZWQgd2hlbiB0aGF0IHJlYm9vdCBzdGFydHMpLiAqL1xuXHRwcml2YXRlIHBlbmRpbmdUcmlnZ2VycyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuXHRwcml2YXRlIHdhdGNoU3Vic2NyaXB0aW9uPzogU3Vic2NyaXB0aW9uO1xuXHRwcml2YXRlIG1vZHVsZUNhY2hlID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZyB8IG51bGw+KCk7XG5cdHByaXZhdGUgZGVwZW5kZW5jaWVzID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZ1tdPigpO1xuXHRwcml2YXRlIHJlYm9vdFRhaWw6IFByb21pc2U8dm9pZD4gPSBQcm9taXNlLnJlc29sdmUoKTtcblx0cHJpdmF0ZSByZWJvb3REZWJvdW5jZUdlbiA9IDA7XG5cdHByaXZhdGUgcmVib290SW5GbGlnaHQgPSBmYWxzZTtcblx0cHJpdmF0ZSByZWJvb3RGb2xsb3dVcCA9IGZhbHNlO1xuXHRwcml2YXRlIHJlYm9vdFF1ZXVlZCA9IGZhbHNlO1xuXHQvKiogTW9kdWxlcyB3aG9zZSByZXZlcnNlLWdyYXBoIGVkZ2VzIGFyZSBwcnVuZWQgYXQgcmVib290LCBub3Qgb24gc2NoZWR1bGUuICovXG5cdHByaXZhdGUgcGVuZGluZ0dyYXBoUHJ1bmUgPSBuZXcgU2V0PHN0cmluZz4oKTtcblx0cHJpdmF0ZSBzY2hlZHVsZVJlYm9vdDogKCkgPT4gdm9pZCA9ICgpID0+IHt9O1xuXG5cdC8vIOKUgOKUgCBQdWJsaWMgQVBJIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG5cdHB1YmxpYyBhc3luYyBzdGFydChvcHRpb25zOiBIb3RSZWxvYWRTZXJ2ZXJPcHRpb25zKSB7XG5cdFx0dGhpcy5kaXNwb3NlZCA9IGZhbHNlO1xuXHRcdHRoaXMuZGVwZW5kZW5jaWVzLmNsZWFyKCk7XG5cdFx0dGhpcy5tb2R1bGVDYWNoZS5jbGVhcigpO1xuXHRcdHRoaXMuZW50cmllcy5jbGVhcigpO1xuXHRcdHRoaXMucGVuZGluZ0VudHJ5UmVib290cy5jbGVhcigpO1xuXHRcdHRoaXMucGVuZGluZ1RyaWdnZXJzLmNsZWFyKCk7XG5cdFx0dGhpcy5wZW5kaW5nR3JhcGhQcnVuZS5jbGVhcigpO1xuXHRcdHRoaXMucmVib290VGFpbCA9IFByb21pc2UucmVzb2x2ZSgpO1xuXHRcdHRoaXMucmVib290SW5GbGlnaHQgPSBmYWxzZTtcblx0XHR0aGlzLnJlYm9vdEZvbGxvd1VwID0gZmFsc2U7XG5cdFx0dGhpcy5yZWJvb3RRdWV1ZWQgPSBmYWxzZTtcblx0XHR0aGlzLmJpbmRTY2hlZHVsZVJlYm9vdChyZXNvbHZlUmVib290RGVib3VuY2VNcyhvcHRpb25zLnJlYm9vdERlYm91bmNlTXMpKTtcblxuXHRcdGNvbnN0IHsgYnVpbGRDb25maWcgfSA9IG9wdGlvbnM7XG5cblx0XHRhd2FpdCB0aGlzLmxvYWRlci5jb25maWd1cmUoe1xuXHRcdFx0YnVpbGRDb25maWcsXG5cdFx0XHR3b3Jrc3BhY2U6IG9wdGlvbnMud29ya3NwYWNlLFxuXHRcdFx0dmVyc2lvbkZpbGVVcmw6IChmaWxlVXJsKSA9PiB0aGlzLmdldENhY2hlZE9yTmV3KGZpbGVVcmwpLFxuXHRcdFx0b25SZXNvbHZlZDogdGhpcy5vblBvc3RSZXNvbHZlLFxuXHRcdH0pO1xuXG5cdFx0Y29uc3Qgd29ya3NwYWNlID0gdGhpcy5yZXF1aXJlV29ya3NwYWNlKCk7XG5cdFx0Y29uc3Qgc2VsZWN0ZWQgPSB0aGlzLnJlc29sdmVQcm9qZWN0cyhidWlsZENvbmZpZywgb3B0aW9ucyk7XG5cdFx0Zm9yIChjb25zdCBwcm9qZWN0IG9mIHNlbGVjdGVkKSB7XG5cdFx0XHRjb25zdCBlbnRyeVBhdGggPSBwYXRoLnJlc29sdmUocHJvamVjdC5nZXRTb3VyY2VFbnRyeVBhdGgoKSk7XG5cdFx0XHR0aGlzLmVudHJpZXMuc2V0KGVudHJ5UGF0aCwgeyBwYXRoOiBlbnRyeVBhdGgsIGxhYmVsOiBwcm9qZWN0Lm5hbWUgfSk7XG5cdFx0fVxuXG5cdFx0dGhpcy5sb2FkZXIucmVnaXN0ZXJIb29rcygpO1xuXHRcdHRoaXMuaW52YWxpZGF0ZUFsbFNvdXJjZUZpbGVzKCk7XG5cblx0XHRhd2FpdCB3b3Jrc3BhY2Uud2F0Y2goYnVpbGRDb25maWcpO1xuXHRcdHRoaXMud2F0Y2hTdWJzY3JpcHRpb24gPSB3b3Jrc3BhY2UucHJvamVjdEZpbGVDaGFuZ2VkJC5zdWJzY3JpYmUodGhpcy5vbkZpbGVDaGFuZ2UpO1xuXG5cdFx0Zm9yIChjb25zdCBlbnRyeSBvZiB0aGlzLmVudHJpZXMudmFsdWVzKCkpIHtcblx0XHRcdHRoaXMubG9nZ2VyLnRyYWNlKGBTZXJ2aW5nICR7ZW50cnkucGF0aH1gKTtcblx0XHR9XG5cdFx0YXdhaXQgdGhpcy5ib290RW50cmllcyhbLi4udGhpcy5lbnRyaWVzLmtleXMoKV0pO1xuXHRcdHRoaXMuZW1pdChcInN0YXJ0XCIpO1xuXHR9XG5cblx0cHVibGljIGFzeW5jIGRpc3Bvc2UoKSB7XG5cdFx0aWYgKHRoaXMuZGlzcG9zZWQpIHJldHVybjtcblx0XHR0aGlzLmRpc3Bvc2VkID0gdHJ1ZTtcblx0XHR0aGlzLnJlYm9vdERlYm91bmNlR2VuICs9IDE7XG5cdFx0dGhpcy53YXRjaFN1YnNjcmlwdGlvbj8udW5zdWJzY3JpYmUoKTtcblx0XHRhd2FpdCB0aGlzLnJlYm9vdFRhaWw7XG5cdFx0YXdhaXQgdGhpcy5kaXNwb3NlRW50cmllcyhbLi4udGhpcy5lbnRyaWVzLmtleXMoKV0pO1xuXHRcdHRoaXMubG9hZGVyLmRpc3Bvc2UoKTtcblx0fVxuXG5cdHB1YmxpYyBhc3luYyBbU3ltYm9sLmFzeW5jRGlzcG9zZV0oKSB7XG5cdFx0YXdhaXQgdGhpcy5kaXNwb3NlKCk7XG5cdH1cblxuXHQvLyDilIDilIAgTGlmZWN5Y2xlIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG5cdHByaXZhdGUgYXN5bmMgYm9vdEVudHJpZXMoZW50cnlQYXRoczogcmVhZG9ubHkgc3RyaW5nW10pIHtcblx0XHRhd2FpdCBQcm9taXNlLmFsbChlbnRyeVBhdGhzLm1hcCgoZW50cnlQYXRoKSA9PiB0aGlzLmJvb3RFbnRyeShlbnRyeVBhdGgpKSk7XG5cdH1cblxuXHRwcml2YXRlIGFzeW5jIGJvb3RFbnRyeShlbnRyeVBhdGg6IHN0cmluZykge1xuXHRcdGNvbnN0IHN0YXRlID0gdGhpcy5lbnRyaWVzLmdldChlbnRyeVBhdGgpO1xuXHRcdGlmIChzdGF0ZSA9PSBudWxsKSByZXR1cm47XG5cdFx0dHJ5IHtcblx0XHRcdGNvbnN0IG1vZCA9IChhd2FpdCB0aGlzLmxvYWRlci5pbXBvcnRFbnRyeShlbnRyeVBhdGgpKSBhcyB7XG5cdFx0XHRcdGRlZmF1bHQ/OiBBc3luY0Rpc3Bvc2FibGU7XG5cdFx0XHR9O1xuXHRcdFx0c3RhdGUubW9kdWxlID0gbW9kPy5kZWZhdWx0O1xuXHRcdH0gY2F0Y2ggKGVycm9yKSB7XG5cdFx0XHRzdGF0ZS5tb2R1bGUgPSB1bmRlZmluZWQ7XG5cdFx0XHR0aGlzLmxvZ2dlci5lcnJvcihcblx0XHRcdFx0XCJUaGVyZSB3YXMgYW4gZXJyb3IgYm9vdGluZyB0aGUgZW50cnkgcG9pbnQuIFlvdXIgYXBwbGljYXRpb24gbWF5IG5vdCBmdW5jdGlvbiBhcyBleHBlY3RlZFwiLFxuXHRcdFx0XHRlcnJvcixcblx0XHRcdCk7XG5cdFx0fVxuXHR9XG5cblx0cHJpdmF0ZSBiaW5kU2NoZWR1bGVSZWJvb3QoZGVsYXlNczogbnVtYmVyKSB7XG5cdFx0Y29uc3QgZ2VuID0gKyt0aGlzLnJlYm9vdERlYm91bmNlR2VuO1xuXHRcdHRoaXMuc2NoZWR1bGVSZWJvb3QgPSBkZWJvdW5jZShhc3luYyAoKSA9PiB7XG5cdFx0XHRpZiAodGhpcy5kaXNwb3NlZCB8fCBnZW4gIT09IHRoaXMucmVib290RGVib3VuY2VHZW4pIHJldHVybjtcblx0XHRcdHRoaXMucmVxdWVzdFJlYm9vdCgpO1xuXHRcdH0sIGRlbGF5TXMpO1xuXHR9XG5cblx0cHJpdmF0ZSByZXF1ZXN0UmVib290KCkge1xuXHRcdGlmICh0aGlzLmRpc3Bvc2VkKSByZXR1cm47XG5cdFx0aWYgKHRoaXMucmVib290SW5GbGlnaHQpIHtcblx0XHRcdHRoaXMucmVib290Rm9sbG93VXAgPSB0cnVlO1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblx0XHRpZiAodGhpcy5yZWJvb3RRdWV1ZWQpIHJldHVybjtcblx0XHR0aGlzLnJlYm9vdFF1ZXVlZCA9IHRydWU7XG5cdFx0dGhpcy5yZWJvb3RUYWlsID0gdGhpcy5yZWJvb3RUYWlsLnRoZW4oXG5cdFx0XHQoKSA9PiB0aGlzLnJ1blJlYm9vdCgpLFxuXHRcdFx0KCkgPT4gdGhpcy5ydW5SZWJvb3QoKSxcblx0XHQpO1xuXHR9XG5cblx0cHJpdmF0ZSBhc3luYyBydW5SZWJvb3QoKSB7XG5cdFx0dGhpcy5yZWJvb3RRdWV1ZWQgPSBmYWxzZTtcblx0XHRpZiAodGhpcy5kaXNwb3NlZCkgcmV0dXJuO1xuXHRcdHRoaXMucmVib290SW5GbGlnaHQgPSB0cnVlO1xuXHRcdHRyeSB7XG5cdFx0XHRkbyB7XG5cdFx0XHRcdHRoaXMucmVib290Rm9sbG93VXAgPSBmYWxzZTtcblx0XHRcdFx0aWYgKHRoaXMuZGlzcG9zZWQpIHJldHVybjtcblx0XHRcdFx0Y29uc3QgdG9SZWJvb3QgPVxuXHRcdFx0XHRcdHRoaXMucGVuZGluZ0VudHJ5UmVib290cy5zaXplID4gMFxuXHRcdFx0XHRcdFx0PyBbLi4udGhpcy5wZW5kaW5nRW50cnlSZWJvb3RzXVxuXHRcdFx0XHRcdFx0OiBbLi4udGhpcy5lbnRyaWVzLmtleXMoKV07XG5cdFx0XHRcdHRoaXMucGVuZGluZ0VudHJ5UmVib290cy5jbGVhcigpO1xuXHRcdFx0XHQvLyBEcm9wIHJldmVyc2UgZWRnZXMgb25seSB3aGVuIHJlYm9vdGluZyBzbyBsYXRlciBzYXZlcyBpbiB0aGUgZGVib3VuY2Vcblx0XHRcdFx0Ly8gd2luZG93IGNhbiBzdGlsbCB3YWxrIHRoZSBncmFwaCBhbmQgcmVzZXQgdGhlIHF1aWV0IHRpbWVyLlxuXHRcdFx0XHR0aGlzLnBydW5lUGVuZGluZ0RlcGVuZGVuY3lFZGdlcygpO1xuXHRcdFx0XHRjb25zdCBzdGFydGVkQXQgPSBEYXRlLm5vdygpO1xuXHRcdFx0XHRjb25zdCBsYWJlbHMgPSB0aGlzLmxhYmVsc0Zvcih0b1JlYm9vdCk7XG5cdFx0XHRcdGNvbnN0IHRyaWdnZXJzID0gdGhpcy50YWtlVHJpZ2dlcnMoKTtcblx0XHRcdFx0dGhpcy5sb2dnZXIuaW5mbyhmb3JtYXRGbHV4UmVib290U3RhcnQobGFiZWxzLCB0cmlnZ2VycykpO1xuXHRcdFx0XHRhd2FpdCB0aGlzLmRpc3Bvc2VFbnRyaWVzKHRvUmVib290KTtcblx0XHRcdFx0YXdhaXQgdGhpcy5ib290RW50cmllcyh0b1JlYm9vdCk7XG5cdFx0XHRcdHRoaXMubG9nZ2VyLmluZm8oZm9ybWF0Rmx1eFJlYm9vdFJlYWR5KGxhYmVscywgRGF0ZS5ub3coKSAtIHN0YXJ0ZWRBdCkpO1xuXHRcdFx0XHR0aGlzLmVtaXQoXCJyZWJvb3RcIik7XG5cdFx0XHR9IHdoaWxlICh0aGlzLnJlYm9vdEZvbGxvd1VwICYmICF0aGlzLmRpc3Bvc2VkKTtcblx0XHR9IGZpbmFsbHkge1xuXHRcdFx0Y29uc3QgbmVlZHNGb2xsb3dVcCA9IHRoaXMucmVib290Rm9sbG93VXAgJiYgIXRoaXMuZGlzcG9zZWQ7XG5cdFx0XHR0aGlzLnJlYm9vdEZvbGxvd1VwID0gZmFsc2U7XG5cdFx0XHR0aGlzLnJlYm9vdEluRmxpZ2h0ID0gZmFsc2U7XG5cdFx0XHRpZiAobmVlZHNGb2xsb3dVcCkgdGhpcy5yZXF1ZXN0UmVib290KCk7XG5cdFx0fVxuXHR9XG5cblx0cHJpdmF0ZSBhc3luYyBkaXNwb3NlRW50cmllcyhlbnRyeVBhdGhzOiByZWFkb25seSBzdHJpbmdbXSkge1xuXHRcdGF3YWl0IFByb21pc2UuYWxsKGVudHJ5UGF0aHMubWFwKChlbnRyeVBhdGgpID0+IHRoaXMuZGlzcG9zZUVudHJ5KGVudHJ5UGF0aCkpKTtcblx0fVxuXG5cdHByaXZhdGUgYXN5bmMgZGlzcG9zZUVudHJ5KGVudHJ5UGF0aD86IHN0cmluZykge1xuXHRcdGNvbnN0IHBhdGhzID0gZW50cnlQYXRoICE9IG51bGwgPyBbZW50cnlQYXRoXSA6IFsuLi50aGlzLmVudHJpZXMua2V5cygpXTtcblx0XHRmb3IgKGNvbnN0IHAgb2YgcGF0aHMpIHtcblx0XHRcdGNvbnN0IHN0YXRlID0gdGhpcy5lbnRyaWVzLmdldChwKTtcblx0XHRcdGlmIChzdGF0ZSA9PSBudWxsKSBjb250aW51ZTtcblx0XHRcdGNvbnN0IGVudHJ5ID0gc3RhdGUubW9kdWxlO1xuXHRcdFx0c3RhdGUubW9kdWxlID0gdW5kZWZpbmVkO1xuXHRcdFx0dHJ5IHtcblx0XHRcdFx0YXdhaXQgZW50cnk/LltTeW1ib2wuYXN5bmNEaXNwb3NlXSgpO1xuXHRcdFx0fSBjYXRjaCAoZXJyb3IpIHtcblx0XHRcdFx0dGhpcy5sb2dnZXIuZXJyb3IoXCJFbnRyeSBhc3luY0Rpc3Bvc2UgZmFpbGVkXCIsIGVycm9yKTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHQvLyDilIDilIAgU2V0dXAg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cblx0cHJpdmF0ZSByZXF1aXJlV29ya3NwYWNlKCk6IFdvcmtzcGFjZSB7XG5cdFx0Y29uc3Qgd29ya3NwYWNlID0gdGhpcy5sb2FkZXIuZ2V0V29ya3NwYWNlKCk7XG5cdFx0aWYgKHdvcmtzcGFjZSA9PSBudWxsKSB7XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJTb3VyY2VNb2R1bGVMb2FkZXIgaGFzIG5vIHdvcmtzcGFjZSBhZnRlciBjb25maWd1cmVcIik7XG5cdFx0fVxuXHRcdHJldHVybiB3b3Jrc3BhY2U7XG5cdH1cblxuXHRwcml2YXRlIHJlc29sdmVQcm9qZWN0cyhidWlsZENvbmZpZzogc3RyaW5nLCBvcHRpb25zOiBIb3RSZWxvYWRTZXJ2ZXJPcHRpb25zKTogUHJvamVjdFtdIHtcblx0XHRjb25zdCBwcm9qZWN0cyA9IHRoaXMubG9hZGVyLmdldFdvcmtzcGFjZSgpPy5nZXRQcm9qZWN0cyhidWlsZENvbmZpZykgPz8gW107XG5cdFx0Y29uc3QgbmFtZXMgPVxuXHRcdFx0b3B0aW9ucy5wcm9qZWN0cyAhPSBudWxsICYmIG9wdGlvbnMucHJvamVjdHMubGVuZ3RoID4gMFxuXHRcdFx0XHQ/IG9wdGlvbnMucHJvamVjdHNcblx0XHRcdFx0OiBvcHRpb25zLnByb2plY3QgIT0gbnVsbFxuXHRcdFx0XHRcdD8gW29wdGlvbnMucHJvamVjdF1cblx0XHRcdFx0XHQ6IHVuZGVmaW5lZDtcblxuXHRcdGlmIChuYW1lcyA9PSBudWxsKSB7XG5cdFx0XHRjb25zdCBmaXJzdCA9IHByb2plY3RzLmF0KDApO1xuXHRcdFx0aWYgKGZpcnN0ID09IG51bGwpIHtcblx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKGBObyBwcm9qZWN0cyBmb3VuZCBmb3IgY29uZmlndXJhdGlvbjogJHtidWlsZENvbmZpZ31gKTtcblx0XHRcdH1cblx0XHRcdHJldHVybiBbZmlyc3RdO1xuXHRcdH1cblxuXHRcdGNvbnN0IHNlbGVjdGVkOiBQcm9qZWN0W10gPSBbXTtcblx0XHRmb3IgKGNvbnN0IG5hbWUgb2YgbmFtZXMpIHtcblx0XHRcdGNvbnN0IGZvdW5kID0gcHJvamVjdHMuZmluZCgocCkgPT4gcC5uYW1lID09PSBuYW1lKTtcblx0XHRcdGlmIChmb3VuZCA9PSBudWxsKSB7XG5cdFx0XHRcdHRocm93IG5ldyBFcnJvcihgUHJvamVjdCBcIiR7bmFtZX1cIiBub3QgZm91bmQgaW4gd29ya3NwYWNlYCk7XG5cdFx0XHR9XG5cdFx0XHRzZWxlY3RlZC5wdXNoKGZvdW5kKTtcblx0XHR9XG5cdFx0cmV0dXJuIHNlbGVjdGVkO1xuXHR9XG5cblx0LyoqXG5cdCAqIFBvc3QtbmV4dCBkZXBlbmRlbmN5IHRyYWNrZXI6IHJlY29yZHMgd2hpY2ggc291cmNlIGZpbGVzIGltcG9ydCB3aGljaFxuXHQgKiBvdGhlciBzb3VyY2UgZmlsZXMgc28gdGhhdCByZWxvYWRJZkFmZmVjdGVkIGNhbiB0cmF2ZXJzZSB0aGUgZ3JhcGguXG5cdCAqL1xuXHRwcml2YXRlIG9uUG9zdFJlc29sdmUgPSAocmVzdWx0OiBSZXNvbHZlRm5PdXRwdXQsIHBhcmVudFVybDogc3RyaW5nKSA9PiB7XG5cdFx0Y29uc3QgeyB1cmwgfSA9IHJlc3VsdDtcblx0XHRjb25zdCBwYXJlbnRVcmxDbGVhbiA9IHBhcmVudFVybC5zcGxpdChcIj9cIilbMF07XG5cblx0XHRsZXQgZmlsZVBhdGg6IHN0cmluZztcblx0XHRsZXQgcGFyZW50UGF0aDogc3RyaW5nO1xuXG5cdFx0dHJ5IHtcblx0XHRcdGNvbnN0IHVybE9iaiA9IG5ldyBVUkwodXJsKTtcblx0XHRcdHVybE9iai5zZWFyY2ggPSBcIlwiO1xuXHRcdFx0ZmlsZVBhdGggPSBpby5maWxlVXJsVG9QYXRoKHVybE9iai50b1N0cmluZygpKTtcblx0XHR9IGNhdGNoIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHR0cnkge1xuXHRcdFx0cGFyZW50UGF0aCA9IGlvLmZpbGVVcmxUb1BhdGgocGFyZW50VXJsQ2xlYW4pO1xuXHRcdH0gY2F0Y2gge1xuXHRcdFx0cGFyZW50UGF0aCA9IFwiXCI7XG5cdFx0fVxuXG5cdFx0Y29uc3QgaXNTb3VyY2UgPSB0aGlzLmxvYWRlci5oYXNTb3VyY2VGaWxlKGZpbGVQYXRoKTtcblx0XHRjb25zdCBwYXJlbnRJc1NvdXJjZSA9IHRoaXMubG9hZGVyLmhhc1NvdXJjZUZpbGUocGFyZW50UGF0aCk7XG5cblx0XHRpZiAoaXNTb3VyY2UgfHwgcGFyZW50SXNTb3VyY2UpIHtcblx0XHRcdHRoaXMudHJhY2tEZXBlbmRlbmN5KGZpbGVQYXRoLCBwYXJlbnRQYXRoKTtcblx0XHR9XG5cdH07XG5cblx0Ly8g4pSA4pSAIEZpbGUgd2F0Y2hpbmcg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cblx0cHJpdmF0ZSBvbkZpbGVDaGFuZ2UgPSAoZXZ0OiBQcm9qZWN0RmlsZUV2ZW50KSA9PiB7XG5cdFx0Y29uc3QgeyBmaWxlLCBldmVudE5hbWUsIHByb2plY3QgfSA9IGV2dDtcblx0XHRjb25zdCBmdWxsUGF0aCA9IGZpbGUuZnVsbFBhdGg7XG5cblx0XHR0aGlzLmxvZ2dlci50cmFjZShgRmlsZSAke2V2ZW50TmFtZX06ICR7ZnVsbFBhdGh9YCk7XG5cblx0XHRpZiAoZXZlbnROYW1lID09PSBpby5XYXRjaEV2ZW50cy51bmxpbmspIHtcblx0XHRcdHRoaXMubG9hZGVyLmludmFsaWRhdGVUcmFuc3BpbGUoZnVsbFBhdGgpO1xuXHRcdFx0dGhpcy5tb2R1bGVDYWNoZS5zZXQoZnVsbFBhdGgsIG51bGwpO1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdGlmIChldmVudE5hbWUgPT09IGlvLldhdGNoRXZlbnRzLmFkZCkge1xuXHRcdFx0aWYgKHByb2plY3QuaXNTb3VyY2VGaWxlKGZpbGUpKSB7XG5cdFx0XHRcdHRoaXMubG9hZGVyLnNldFNvdXJjZUZpbGUoZnVsbFBhdGgsIHByb2plY3QpO1xuXHRcdFx0XHR0aGlzLm1vZHVsZUNhY2hlLnNldChmdWxsUGF0aCwgbnVsbCk7XG5cdFx0XHRcdHRoaXMucmVsb2FkSWZBZmZlY3RlZChmdWxsUGF0aCk7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Ly8gY2hhbmdlXG5cdFx0aWYgKCFwcm9qZWN0LmlzU291cmNlRmlsZShmaWxlKSkgcmV0dXJuO1xuXHRcdHRoaXMubG9hZGVyLmludmFsaWRhdGVUcmFuc3BpbGUoZnVsbFBhdGgpO1xuXHRcdHRoaXMucmVsb2FkSWZBZmZlY3RlZChmdWxsUGF0aCk7XG5cdH07XG5cblx0cHJpdmF0ZSByZWxvYWRJZkFmZmVjdGVkKGZ1bGxQYXRoOiBzdHJpbmcpOiBib29sZWFuIHtcblx0XHRjb25zdCBkZXBzID0gdGhpcy5nZXREZXBlbmRlbmN5R3JhcGgoZnVsbFBhdGgpO1xuXHRcdGNvbnN0IG1vZHVsZXMgPSBbLi4ubmV3IFNldChbLi4uZGVwcywgZnVsbFBhdGhdKV07XG5cdFx0Y29uc3QgYWZmZWN0ZWRFbnRyaWVzID0gWy4uLnRoaXMuZW50cmllcy5rZXlzKCldLmZpbHRlcigoZW50cnlQYXRoKSA9PlxuXHRcdFx0bW9kdWxlcy5pbmNsdWRlcyhlbnRyeVBhdGgpLFxuXHRcdCk7XG5cblx0XHRpZiAoYWZmZWN0ZWRFbnRyaWVzLmxlbmd0aCA9PT0gMCkge1xuXHRcdFx0dGhpcy5sb2dnZXIudHJhY2UoYENoYW5nZSBpbiAke2Z1bGxQYXRofSBkb2VzIG5vdCBhZmZlY3QgZW50cnkg4oCUIHNraXBwaW5nIHJlbG9hZGApO1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblxuXHRcdHRoaXMubG9nZ2VyLnRyYWNlKFxuXHRcdFx0YENoYW5nZSBpbiAke2Z1bGxQYXRofSBhZmZlY3RzICR7bW9kdWxlcy5sZW5ndGh9IG1vZHVsZShzKSDigJQgc2NoZWR1bGluZyByZWxvYWRgLFxuXHRcdCk7XG5cdFx0dGhpcy5pbnZhbGlkYXRlTW9kdWxlQ2FjaGVzKC4uLm1vZHVsZXMpO1xuXHRcdGZvciAoY29uc3QgbW9kdWxlIG9mIG1vZHVsZXMpIHtcblx0XHRcdHRoaXMucGVuZGluZ0dyYXBoUHJ1bmUuYWRkKG1vZHVsZSk7XG5cdFx0fVxuXHRcdGZvciAoY29uc3QgZW50cnlQYXRoIG9mIGFmZmVjdGVkRW50cmllcykge1xuXHRcdFx0dGhpcy5wZW5kaW5nRW50cnlSZWJvb3RzLmFkZChlbnRyeVBhdGgpO1xuXHRcdH1cblx0XHR0aGlzLnBlbmRpbmdUcmlnZ2Vycy5hZGQoZnVsbFBhdGgpO1xuXHRcdHRoaXMuc2NoZWR1bGVSZWJvb3QoKTtcblx0XHRyZXR1cm4gdHJ1ZTtcblx0fVxuXG5cdC8vIOKUgOKUgCBEZXBlbmRlbmN5IGdyYXBoIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG5cdHByaXZhdGUgZ2V0RGVwZW5kZW5jeUdyYXBoKG1vZHVsZUlkOiBzdHJpbmcsIHBhcmVudE1vZHVsZXM6IHN0cmluZ1tdID0gW10pOiBzdHJpbmdbXSB7XG5cdFx0aWYgKHRoaXMuaXNTZWxmKG1vZHVsZUlkKSkgcmV0dXJuIFtdO1xuXG5cdFx0Y29uc3QgbW9kdWxlRGVwcyA9IHRoaXMuZGVwZW5kZW5jaWVzLmdldChtb2R1bGVJZCkgPz8gW107XG5cdFx0aWYgKHBhcmVudE1vZHVsZXMuaW5jbHVkZXMobW9kdWxlSWQpKSB7XG5cdFx0XHR0aGlzLmxvZ2dlci5lcnJvcihgQ2lyY3VsYXIgcmVmZXJlbmNlIGRldGVjdGVkOiAke21vZHVsZUlkfWApO1xuXHRcdFx0cmV0dXJuIFtdO1xuXHRcdH1cblxuXHRcdGxldCBzdWJEZXBzOiBzdHJpbmdbXSA9IFtdO1xuXHRcdGZvciAoY29uc3QgZGVwIG9mIG1vZHVsZURlcHMpIHtcblx0XHRcdGlmICghdGhpcy5sb2FkZXIuaGFzU291cmNlRmlsZShkZXApKSBjb250aW51ZTtcblx0XHRcdGNvbnN0IHN1YnMgPSB0aGlzLmdldERlcGVuZGVuY3lHcmFwaChkZXAsIFttb2R1bGVJZCwgLi4ucGFyZW50TW9kdWxlc10pO1xuXHRcdFx0c3ViRGVwcyA9IFsuLi5zdWJEZXBzLCAuLi5zdWJzXTtcblx0XHR9XG5cblx0XHRyZXR1cm4gWy4uLm5ldyBTZXQoWy4uLm1vZHVsZURlcHMsIC4uLnN1YkRlcHNdKV07XG5cdH1cblxuXHRwcml2YXRlIHRyYWNrRGVwZW5kZW5jeShmaWxlUGF0aDogc3RyaW5nLCBwYXJlbnRQYXRoOiBzdHJpbmcpIHtcblx0XHRpZiAoIXBhcmVudFBhdGgpIHJldHVybjtcblx0XHRjb25zdCBkZXBzID0gdGhpcy5kZXBlbmRlbmNpZXMuZ2V0KGZpbGVQYXRoKSA/PyBbXTtcblx0XHRjb25zdCB1cGRhdGVkRGVwcyA9IG5ldyBTZXQoWy4uLmRlcHMsIHBhcmVudFBhdGhdKTtcblx0XHR0aGlzLmRlcGVuZGVuY2llcy5zZXQoZmlsZVBhdGgsIFsuLi51cGRhdGVkRGVwc10pO1xuXHR9XG5cblx0Ly8g4pSA4pSAIE1vZHVsZSBjYWNoZSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuXHRwcml2YXRlIGdldENhY2hlZE9yTmV3KG1vZHVsZVVybDogc3RyaW5nKSB7XG5cdFx0Y29uc3QgZmlsZVBhdGggPSBpby5maWxlVXJsVG9QYXRoKG1vZHVsZVVybCk7XG5cdFx0Y29uc3QgY2FjaGVkID0gdGhpcy5tb2R1bGVDYWNoZS5nZXQoZmlsZVBhdGgpO1xuXHRcdGNvbnN0IHZlcnNpb25lZCA9IGNhY2hlZCA/PyB0aGlzLnZlcnNpb25Nb2R1bGUobW9kdWxlVXJsKTtcblx0XHR0aGlzLm1vZHVsZUNhY2hlLnNldChmaWxlUGF0aCwgdmVyc2lvbmVkKTtcblx0XHRyZXR1cm4gdmVyc2lvbmVkO1xuXHR9XG5cblx0cHJpdmF0ZSB2ZXJzaW9uTW9kdWxlKG1vZHVsZVVybDogc3RyaW5nKSB7XG5cdFx0Y29uc3QgdmVyc2lvbmVkVXJsID0gbmV3IFVSTChtb2R1bGVVcmwpO1xuXHRcdHZlcnNpb25lZFVybC5zZWFyY2hQYXJhbXMuc2V0KFZFUlNJT05fVVJMX1BBUkFNLCBTdHJpbmcoKyttb2R1bGVWZXJzaW9uU2VxKSk7XG5cdFx0cmV0dXJuIHZlcnNpb25lZFVybC50b1N0cmluZygpO1xuXHR9XG5cblx0cHJpdmF0ZSBpbnZhbGlkYXRlTW9kdWxlQ2FjaGVzKC4uLm1vZHVsZXM6IHN0cmluZ1tdKSB7XG5cdFx0Zm9yIChjb25zdCBtb2R1bGUgb2YgbW9kdWxlcykge1xuXHRcdFx0dGhpcy5tb2R1bGVDYWNoZS5zZXQobW9kdWxlLCBudWxsKTtcblx0XHRcdHRoaXMubG9hZGVyLmludmFsaWRhdGVUcmFuc3BpbGUobW9kdWxlKTtcblx0XHR9XG5cdH1cblxuXHRwcml2YXRlIHBydW5lUGVuZGluZ0RlcGVuZGVuY3lFZGdlcygpIHtcblx0XHRjb25zdCBtb2R1bGVzID0gWy4uLnRoaXMucGVuZGluZ0dyYXBoUHJ1bmVdO1xuXHRcdHRoaXMucGVuZGluZ0dyYXBoUHJ1bmUuY2xlYXIoKTtcblx0XHR0aGlzLnBydW5lRGVwZW5kZW5jeVBhcmVudHMoLi4ubW9kdWxlcyk7XG5cdH1cblxuXHQvKiogUmVtb3ZlIHRoZXNlIG1vZHVsZXMgYXMgcGFyZW50cyBzbyBib290IGNhbiByZWJ1aWxkIGVkZ2VzIHdpdGhvdXQgc3RhbGUgaW1wb3J0ZXJzLiAqL1xuXHRwcml2YXRlIHBydW5lRGVwZW5kZW5jeVBhcmVudHMoLi4ubW9kdWxlczogc3RyaW5nW10pIHtcblx0XHRmb3IgKGNvbnN0IG1vZHVsZSBvZiBtb2R1bGVzKSB7XG5cdFx0XHRmb3IgKGNvbnN0IFtrZXksIHBhcmVudHNdIG9mIHRoaXMuZGVwZW5kZW5jaWVzKSB7XG5cdFx0XHRcdGNvbnN0IGZpbHRlcmVkID0gcGFyZW50cy5maWx0ZXIoKHApID0+IHAgIT09IG1vZHVsZSk7XG5cdFx0XHRcdGlmIChmaWx0ZXJlZC5sZW5ndGggPT09IDApIHtcblx0XHRcdFx0XHR0aGlzLmRlcGVuZGVuY2llcy5kZWxldGUoa2V5KTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHR0aGlzLmRlcGVuZGVuY2llcy5zZXQoa2V5LCBmaWx0ZXJlZCk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHRwcml2YXRlIGludmFsaWRhdGVBbGxTb3VyY2VGaWxlcygpIHtcblx0XHRmb3IgKGNvbnN0IGZpbGVQYXRoIG9mIHRoaXMubG9hZGVyLnNvdXJjZUZpbGVQYXRocygpKSB7XG5cdFx0XHR0aGlzLm1vZHVsZUNhY2hlLnNldChmaWxlUGF0aCwgbnVsbCk7XG5cdFx0fVxuXHR9XG5cblx0cHJpdmF0ZSBpc1NlbGYoZmlsZVBhdGg6IHN0cmluZykge1xuXHRcdHJldHVybiBjdXJyZW50RmlsZVBhdGggPT09IHBhdGgucmVzb2x2ZShmaWxlUGF0aCk7XG5cdH1cblxuXHRwcml2YXRlIGxhYmVsc0ZvcihlbnRyeVBhdGhzOiByZWFkb25seSBzdHJpbmdbXSk6IHN0cmluZ1tdIHtcblx0XHRyZXR1cm4gZW50cnlQYXRocy5tYXAoXG5cdFx0XHQoZW50cnlQYXRoKSA9PiB0aGlzLmVudHJpZXMuZ2V0KGVudHJ5UGF0aCk/LmxhYmVsID8/IHBhdGguYmFzZW5hbWUoZW50cnlQYXRoKSxcblx0XHQpO1xuXHR9XG5cblx0cHJpdmF0ZSB0YWtlVHJpZ2dlcnMoKTogc3RyaW5nW10ge1xuXHRcdGNvbnN0IHRyaWdnZXJzID0gWy4uLnRoaXMucGVuZGluZ1RyaWdnZXJzXS5tYXAoKGZ1bGxQYXRoKSA9PiB0aGlzLmZvcm1hdFRyaWdnZXIoZnVsbFBhdGgpKTtcblx0XHR0aGlzLnBlbmRpbmdUcmlnZ2Vycy5jbGVhcigpO1xuXHRcdHJldHVybiB0cmlnZ2Vycztcblx0fVxuXG5cdHByaXZhdGUgZm9ybWF0VHJpZ2dlcihmdWxsUGF0aDogc3RyaW5nKTogc3RyaW5nIHtcblx0XHRjb25zdCByb290ID0gdGhpcy5sb2FkZXIuZ2V0V29ya3NwYWNlKCk/LnJvb3REaXI7XG5cdFx0aWYgKHJvb3QgIT0gbnVsbCkge1xuXHRcdFx0Y29uc3QgcmVsID0gcGF0aC5yZWxhdGl2ZShwYXRoLnJlc29sdmUocm9vdCksIGZ1bGxQYXRoKTtcblx0XHRcdGlmIChyZWwgIT09IFwiXCIgJiYgIXJlbC5zdGFydHNXaXRoKFwiLi5cIikgJiYgIXBhdGguaXNBYnNvbHV0ZShyZWwpKSB7XG5cdFx0XHRcdHJldHVybiByZWwucmVwbGFjZUFsbChcIlxcXFxcIiwgXCIvXCIpO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gcGF0aC5iYXNlbmFtZShmdWxsUGF0aCk7XG5cdH1cbn1cbiJdLCJuYW1lcyI6WyJFdmVudEVtaXR0ZXIiLCJwYXRoIiwiaW8iLCJkZWJvdW5jZSIsInNjcmliZSIsIlNvdXJjZU1vZHVsZUxvYWRlciIsImN1cnJlbnRGaWxlUGF0aCIsImZpbGVVcmxUb1BhdGgiLCJ1cmwiLCJWRVJTSU9OX1VSTF9QQVJBTSIsIkRFRkFVTFRfUkVCT09UX0RFQk9VTkNFX01TIiwiTUFYX1JFQk9PVF9UUklHR0VSX1BBVEhTIiwicmVzb2x2ZVJlYm9vdERlYm91bmNlTXMiLCJ2YWx1ZSIsImRlbGF5IiwiTnVtYmVyIiwiaXNGaW5pdGUiLCJFcnJvciIsIlN0cmluZyIsImZvcm1hdFRyaWdnZXJMaXN0IiwidHJpZ2dlcnMiLCJsZW5ndGgiLCJ1bmRlZmluZWQiLCJqb2luIiwic2xpY2UiLCJCQU5ORVJfUlVMRSIsInJlcGVhdCIsIndyYXBGbHV4QmFubmVyIiwidGl0bGUiLCJkZXRhaWxzIiwiYm9keSIsIm1hcCIsImxpbmUiLCJmb3JtYXRGbHV4UmVib290U3RhcnQiLCJsYWJlbHMiLCJ3aG8iLCJmaWxlcyIsImZvcm1hdEZsdXhSZWJvb3RSZWFkeSIsImVsYXBzZWRNcyIsIk1hdGgiLCJtYXgiLCJyb3VuZCIsIm1vZHVsZVZlcnNpb25TZXEiLCJIb3RSZWxvYWRTZXJ2ZXIiLCJsb2dnZXIiLCJuYW1lIiwibG9hZGVyIiwiZGlzcG9zZWQiLCJlbnRyaWVzIiwiTWFwIiwicGVuZGluZ0VudHJ5UmVib290cyIsIlNldCIsInBlbmRpbmdUcmlnZ2VycyIsIndhdGNoU3Vic2NyaXB0aW9uIiwibW9kdWxlQ2FjaGUiLCJkZXBlbmRlbmNpZXMiLCJyZWJvb3RUYWlsIiwiUHJvbWlzZSIsInJlc29sdmUiLCJyZWJvb3REZWJvdW5jZUdlbiIsInJlYm9vdEluRmxpZ2h0IiwicmVib290Rm9sbG93VXAiLCJyZWJvb3RRdWV1ZWQiLCJwZW5kaW5nR3JhcGhQcnVuZSIsInNjaGVkdWxlUmVib290Iiwic3RhcnQiLCJvcHRpb25zIiwiY2xlYXIiLCJiaW5kU2NoZWR1bGVSZWJvb3QiLCJyZWJvb3REZWJvdW5jZU1zIiwiYnVpbGRDb25maWciLCJjb25maWd1cmUiLCJ3b3Jrc3BhY2UiLCJ2ZXJzaW9uRmlsZVVybCIsImZpbGVVcmwiLCJnZXRDYWNoZWRPck5ldyIsIm9uUmVzb2x2ZWQiLCJvblBvc3RSZXNvbHZlIiwicmVxdWlyZVdvcmtzcGFjZSIsInNlbGVjdGVkIiwicmVzb2x2ZVByb2plY3RzIiwicHJvamVjdCIsImVudHJ5UGF0aCIsImdldFNvdXJjZUVudHJ5UGF0aCIsInNldCIsImxhYmVsIiwicmVnaXN0ZXJIb29rcyIsImludmFsaWRhdGVBbGxTb3VyY2VGaWxlcyIsIndhdGNoIiwicHJvamVjdEZpbGVDaGFuZ2VkJCIsInN1YnNjcmliZSIsIm9uRmlsZUNoYW5nZSIsImVudHJ5IiwidmFsdWVzIiwidHJhY2UiLCJib290RW50cmllcyIsImtleXMiLCJlbWl0IiwiZGlzcG9zZSIsInVuc3Vic2NyaWJlIiwiZGlzcG9zZUVudHJpZXMiLCJTeW1ib2wiLCJhc3luY0Rpc3Bvc2UiLCJlbnRyeVBhdGhzIiwiYWxsIiwiYm9vdEVudHJ5Iiwic3RhdGUiLCJnZXQiLCJtb2QiLCJpbXBvcnRFbnRyeSIsIm1vZHVsZSIsImRlZmF1bHQiLCJlcnJvciIsImRlbGF5TXMiLCJnZW4iLCJyZXF1ZXN0UmVib290IiwidGhlbiIsInJ1blJlYm9vdCIsInRvUmVib290Iiwic2l6ZSIsInBydW5lUGVuZGluZ0RlcGVuZGVuY3lFZGdlcyIsInN0YXJ0ZWRBdCIsIkRhdGUiLCJub3ciLCJsYWJlbHNGb3IiLCJ0YWtlVHJpZ2dlcnMiLCJpbmZvIiwibmVlZHNGb2xsb3dVcCIsImRpc3Bvc2VFbnRyeSIsInBhdGhzIiwicCIsImdldFdvcmtzcGFjZSIsInByb2plY3RzIiwiZ2V0UHJvamVjdHMiLCJuYW1lcyIsImZpcnN0IiwiYXQiLCJmb3VuZCIsImZpbmQiLCJwdXNoIiwicmVzdWx0IiwicGFyZW50VXJsIiwicGFyZW50VXJsQ2xlYW4iLCJzcGxpdCIsImZpbGVQYXRoIiwicGFyZW50UGF0aCIsInVybE9iaiIsIlVSTCIsInNlYXJjaCIsInRvU3RyaW5nIiwiaXNTb3VyY2UiLCJoYXNTb3VyY2VGaWxlIiwicGFyZW50SXNTb3VyY2UiLCJ0cmFja0RlcGVuZGVuY3kiLCJldnQiLCJmaWxlIiwiZXZlbnROYW1lIiwiZnVsbFBhdGgiLCJXYXRjaEV2ZW50cyIsInVubGluayIsImludmFsaWRhdGVUcmFuc3BpbGUiLCJhZGQiLCJpc1NvdXJjZUZpbGUiLCJzZXRTb3VyY2VGaWxlIiwicmVsb2FkSWZBZmZlY3RlZCIsImRlcHMiLCJnZXREZXBlbmRlbmN5R3JhcGgiLCJtb2R1bGVzIiwiYWZmZWN0ZWRFbnRyaWVzIiwiZmlsdGVyIiwiaW5jbHVkZXMiLCJpbnZhbGlkYXRlTW9kdWxlQ2FjaGVzIiwibW9kdWxlSWQiLCJwYXJlbnRNb2R1bGVzIiwiaXNTZWxmIiwibW9kdWxlRGVwcyIsInN1YkRlcHMiLCJkZXAiLCJzdWJzIiwidXBkYXRlZERlcHMiLCJtb2R1bGVVcmwiLCJjYWNoZWQiLCJ2ZXJzaW9uZWQiLCJ2ZXJzaW9uTW9kdWxlIiwidmVyc2lvbmVkVXJsIiwic2VhcmNoUGFyYW1zIiwicHJ1bmVEZXBlbmRlbmN5UGFyZW50cyIsImtleSIsInBhcmVudHMiLCJmaWx0ZXJlZCIsImRlbGV0ZSIsInNvdXJjZUZpbGVQYXRocyIsImJhc2VuYW1lIiwiZm9ybWF0VHJpZ2dlciIsInJvb3QiLCJyb290RGlyIiwicmVsIiwicmVsYXRpdmUi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
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@decohere/flux",
|
|
3
|
-
"version": "0.0.1-dev.
|
|
3
|
+
"version": "0.0.1-dev.84",
|
|
4
4
|
"description": "Hot module reload server for Node.js ESM applications",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"typescript",
|
|
@@ -25,11 +25,11 @@
|
|
|
25
25
|
"test": "echo \"Error: no test specified\" && exit 1"
|
|
26
26
|
},
|
|
27
27
|
"dependencies": {
|
|
28
|
-
"@decohere/crucible": "0.0.1-dev.
|
|
29
|
-
"@decohere/forge": "0.0.1-dev.
|
|
30
|
-
"@decohere/mesh": "0.0.1-dev.
|
|
31
|
-
"@decohere/nexus": "0.0.1-dev.
|
|
32
|
-
"@decohere/scribe": "0.0.1-dev.
|
|
28
|
+
"@decohere/crucible": "0.0.1-dev.84",
|
|
29
|
+
"@decohere/forge": "0.0.1-dev.84",
|
|
30
|
+
"@decohere/mesh": "0.0.1-dev.84",
|
|
31
|
+
"@decohere/nexus": "0.0.1-dev.84",
|
|
32
|
+
"@decohere/scribe": "0.0.1-dev.84",
|
|
33
33
|
"commander": "^13.1.0",
|
|
34
34
|
"rxjs": "^7.8.2"
|
|
35
35
|
},
|
|
@@ -3,6 +3,10 @@ import type { Workspace } from "@decohere/mesh";
|
|
|
3
3
|
/** Default quiet window before a file-change reboot. */
|
|
4
4
|
export declare const DEFAULT_REBOOT_DEBOUNCE_MS = 250;
|
|
5
5
|
export declare function resolveRebootDebounceMs(value: number | undefined): number;
|
|
6
|
+
/** Info-level HMR start block — keep `flux reboot` in the text so operators can search the buffer. */
|
|
7
|
+
export declare function formatFluxRebootStart(labels: readonly string[], triggers?: readonly string[]): string;
|
|
8
|
+
/** Info-level HMR finish block. */
|
|
9
|
+
export declare function formatFluxRebootReady(labels: readonly string[], elapsedMs: number): string;
|
|
6
10
|
export interface HotReloadServerEvents {
|
|
7
11
|
start: [];
|
|
8
12
|
reboot: [];
|
|
@@ -35,6 +39,8 @@ export declare class HotReloadServer extends EventEmitter<HotReloadServerEvents>
|
|
|
35
39
|
/** Absolute entry paths currently served (one or more Flux apps). */
|
|
36
40
|
private entries;
|
|
37
41
|
private pendingEntryReboots;
|
|
42
|
+
/** Source paths that scheduled the next reboot (cleared when that reboot starts). */
|
|
43
|
+
private pendingTriggers;
|
|
38
44
|
private watchSubscription?;
|
|
39
45
|
private moduleCache;
|
|
40
46
|
private dependencies;
|
|
@@ -75,4 +81,7 @@ export declare class HotReloadServer extends EventEmitter<HotReloadServerEvents>
|
|
|
75
81
|
private pruneDependencyParents;
|
|
76
82
|
private invalidateAllSourceFiles;
|
|
77
83
|
private isSelf;
|
|
84
|
+
private labelsFor;
|
|
85
|
+
private takeTriggers;
|
|
86
|
+
private formatTrigger;
|
|
78
87
|
}
|