obsidian-dev-utils 84.5.3 → 84.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +10 -0
- package/dist/dev/main.js +194 -35
- package/dist/lib/cjs/beeper.cjs +170 -0
- package/dist/lib/cjs/beeper.d.cts +21 -0
- package/dist/lib/cjs/generated-during-build.cjs +2 -2
- package/dist/lib/cjs/index.cjs +4 -1
- package/dist/lib/cjs/index.d.cts +1 -0
- package/dist/lib/cjs/obsidian/css-class.cjs +2 -1
- package/dist/lib/cjs/obsidian/css-class.d.cts +5 -0
- package/dist/lib/cjs/obsidian/editor.cjs +19 -2
- package/dist/lib/cjs/obsidian/editor.d.cts +2 -1
- package/dist/lib/cjs/obsidian/modals/minimizable-modal.cjs +133 -5
- package/dist/lib/cjs/obsidian/modals/minimizable-modal.d.cts +32 -15
- package/dist/lib/cjs/obsidian/resource-lock.cjs +4 -30
- package/dist/lib/cjs/script-utils/build.cjs +2 -11
- package/dist/lib/cjs/script-utils/build.d.cts +0 -7
- package/dist/lib/cjs/script-utils/check-project-types.cjs +18 -18
- package/dist/lib/cjs/script-utils/check-project-types.d.cts +1 -1
- package/dist/lib/cjs/script-utils/linters/eslint-rules/no-async-callback-to-unsafe-return.cjs +8 -8
- package/dist/lib/cjs/script-utils/linters/eslint-rules/require-component-suffix.cjs +1 -1
- package/dist/lib/cjs/script-utils/linters/eslint-rules/require-super-call.cjs +5 -5
- package/dist/lib/cjs/script-utils/linters/index.cjs +1 -4
- package/dist/lib/cjs/script-utils/linters/index.d.cts +0 -1
- package/dist/lib/cjs/script-utils/linters/over-exposure.cjs +30 -30
- package/dist/lib/cjs/script-utils/linters/over-exposure.d.cts +1 -1
- package/dist/lib/esm/beeper.d.mts +21 -0
- package/dist/lib/esm/beeper.mjs +62 -0
- package/dist/lib/esm/generated-during-build.mjs +2 -2
- package/dist/lib/esm/index.d.mts +1 -0
- package/dist/lib/esm/index.mjs +3 -1
- package/dist/lib/esm/obsidian/css-class.d.mts +5 -0
- package/dist/lib/esm/obsidian/css-class.mjs +2 -1
- package/dist/lib/esm/obsidian/editor.d.mts +2 -1
- package/dist/lib/esm/obsidian/editor.mjs +20 -2
- package/dist/lib/esm/obsidian/modals/minimizable-modal.d.mts +32 -15
- package/dist/lib/esm/obsidian/modals/minimizable-modal.mjs +137 -6
- package/dist/lib/esm/obsidian/resource-lock.mjs +4 -30
- package/dist/lib/esm/script-utils/build.d.mts +0 -7
- package/dist/lib/esm/script-utils/build.mjs +2 -11
- package/dist/lib/esm/script-utils/check-project-types.d.mts +1 -1
- package/dist/lib/esm/script-utils/check-project-types.mjs +2 -2
- package/dist/lib/esm/script-utils/linters/eslint-rules/no-async-callback-to-unsafe-return.mjs +2 -2
- package/dist/lib/esm/script-utils/linters/eslint-rules/require-component-suffix.mjs +1 -1
- package/dist/lib/esm/script-utils/linters/eslint-rules/require-super-call.mjs +2 -2
- package/dist/lib/esm/script-utils/linters/index.d.mts +0 -1
- package/dist/lib/esm/script-utils/linters/index.mjs +1 -3
- package/dist/lib/esm/script-utils/linters/over-exposure.d.mts +1 -1
- package/dist/lib/esm/script-utils/linters/over-exposure.mjs +2 -2
- package/dist/styles.css +15 -1
- package/package.json +3 -5
- package/dist/lib/cjs/script-utils/linters/eslint-typescript-classic-api-boundary.cjs +0 -141
- package/dist/lib/cjs/script-utils/linters/eslint-typescript-classic-api-boundary.d.cts +0 -41
- package/dist/lib/esm/script-utils/linters/eslint-typescript-classic-api-boundary.d.mts +0 -41
- package/dist/lib/esm/script-utils/linters/eslint-typescript-classic-api-boundary.mjs +0 -33
- package/script-utils/linters/eslint-typescript-classic-api-boundary/package.json +0 -6
|
@@ -31,6 +31,7 @@ import {
|
|
|
31
31
|
Vault
|
|
32
32
|
} from "obsidian";
|
|
33
33
|
import { convertAsyncToSync } from "../async.mjs";
|
|
34
|
+
import { Beeper } from "../beeper.mjs";
|
|
34
35
|
import {
|
|
35
36
|
CallbackDisposable,
|
|
36
37
|
MultipleDisposeBehavior
|
|
@@ -49,10 +50,6 @@ import {
|
|
|
49
50
|
isChild,
|
|
50
51
|
isChildOrSelf
|
|
51
52
|
} from "./vault.mjs";
|
|
52
|
-
const BEEP_DURATION_SECONDS = 0.08;
|
|
53
|
-
const BEEP_FREQUENCY_HZ = 660;
|
|
54
|
-
const BEEP_GAIN = 0.05;
|
|
55
|
-
const BEEP_THROTTLE_MILLISECONDS = 200;
|
|
56
53
|
const RESOURCE_LOCK_STATE_KEY = "resourceLock";
|
|
57
54
|
const LOCK_ICON_ID = "lock";
|
|
58
55
|
const LOCK_INDICATOR_CSS_CLASS = "obsidian-dev-utils-lock-indicator";
|
|
@@ -215,11 +212,10 @@ class ResourceLockMutationBlockerComponent extends MonkeyAroundComponent {
|
|
|
215
212
|
}
|
|
216
213
|
}
|
|
217
214
|
class ResourceLockManager {
|
|
218
|
-
|
|
215
|
+
beeper = new Beeper();
|
|
219
216
|
bypassPathSets = /* @__PURE__ */ new Set();
|
|
220
217
|
eventsComponent = null;
|
|
221
218
|
indicatorsByView = /* @__PURE__ */ new Map();
|
|
222
|
-
lastBeepMilliseconds = 0;
|
|
223
219
|
lockEntriesByPath = /* @__PURE__ */ new Map();
|
|
224
220
|
mutationBlockerComponent = null;
|
|
225
221
|
statusBarItemEl = null;
|
|
@@ -353,28 +349,6 @@ class ResourceLockManager {
|
|
|
353
349
|
}));
|
|
354
350
|
});
|
|
355
351
|
}
|
|
356
|
-
beep() {
|
|
357
|
-
const nowMilliseconds = Date.now();
|
|
358
|
-
if (nowMilliseconds - this.lastBeepMilliseconds < BEEP_THROTTLE_MILLISECONDS) {
|
|
359
|
-
return;
|
|
360
|
-
}
|
|
361
|
-
this.lastBeepMilliseconds = nowMilliseconds;
|
|
362
|
-
const AudioContextClass = window.AudioContext;
|
|
363
|
-
if (!AudioContextClass) {
|
|
364
|
-
return;
|
|
365
|
-
}
|
|
366
|
-
this.audioContext ??= new AudioContextClass();
|
|
367
|
-
const audioContext = this.audioContext;
|
|
368
|
-
const oscillator = audioContext.createOscillator();
|
|
369
|
-
const gainNode = audioContext.createGain();
|
|
370
|
-
oscillator.type = "sine";
|
|
371
|
-
oscillator.frequency.value = BEEP_FREQUENCY_HZ;
|
|
372
|
-
gainNode.gain.value = BEEP_GAIN;
|
|
373
|
-
oscillator.connect(gainNode);
|
|
374
|
-
gainNode.connect(audioContext.destination);
|
|
375
|
-
oscillator.start();
|
|
376
|
-
oscillator.stop(audioContext.currentTime + BEEP_DURATION_SECONDS);
|
|
377
|
-
}
|
|
378
352
|
createIndicators(app, view, path, tooltip) {
|
|
379
353
|
const actionIconEl = view.addAction(LOCK_ICON_ID, tooltip, noop);
|
|
380
354
|
this.registerUnlockMenu(app, actionIconEl, () => path);
|
|
@@ -388,7 +362,7 @@ class ResourceLockManager {
|
|
|
388
362
|
}
|
|
389
363
|
const onTypeAttempt = () => {
|
|
390
364
|
this.flashIndicators(view);
|
|
391
|
-
this.beep();
|
|
365
|
+
this.beeper.beep();
|
|
392
366
|
};
|
|
393
367
|
view.contentEl.addEventListener("beforeinput", onTypeAttempt);
|
|
394
368
|
return {
|
|
@@ -796,4 +770,4 @@ export {
|
|
|
796
770
|
requestResourceUnlockForPath,
|
|
797
771
|
unlockResourceForPath
|
|
798
772
|
};
|
|
799
|
-
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vc3JjL29ic2lkaWFuL3Jlc291cmNlLWxvY2sudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBQYXRoLXNjb3BlZCByZXNvdXJjZSBsb2NraW5nIGZvciB2YXVsdCBmaWxlcyBhbmQgZm9sZGVycywgd2l0aCB0aHJlZSBlbmZvcmNlbWVudCBsYXllcnMgb3ZlciBvbmVcbiAqIHNoYXJlZCBsb2NrZWQtcGF0aCBzZXQ6XG4gKlxuICogMS4gKipFZGl0b3IgcmVhZC1vbmx5KiogXHUyMDE0IHdoaWxlIGEgcGF0aCBpcyBsb2NrZWQsIGV2ZXJ5IGN1cnJlbnQgYW5kIGZ1dHVyZSB7QGxpbmsgTWFya2Rvd25WaWV3fSBvZlxuICogICAgdGhhdCBub3RlIChpbiBhbnkgd2luZG93LCBpbmNsdWRpbmcgcG9wb3V0cykgaXMgbWFkZSByZWFkLW9ubHkgYW5kIHNob3dzIGEgbG9jayBpbmRpY2F0b3IgaW4gaXRzXG4gKiAgICB0YWIgaGVhZGVyLCBpdHMgdmlldyBhY3Rpb24gYmFyLCBhbmQgdGhlIHN0YXR1cyBiYXI7IGEgbm90ZSBpbnNpZGUgYSBgc3VidHJlZWAtbG9ja2VkIGZvbGRlciBpc1xuICogICAgY292ZXJlZCB0b28uIExvY2tzIGFyZSByZWZlcmVuY2UtY291bnRlZCBwZXIgbG9ja2luZyBwbHVnaW4gKHRoZSBpbmRpY2F0b3JzJyB0b29sdGlwIGxpc3RzIHdoaWNoXG4gKiAgICBwbHVnaW5zIGhvbGQgYSBsb2NrKSwgc28gbmVzdGVkL2NvbmN1cnJlbnQgb3BlcmF0aW9ucyBhcmUgc2FmZSBcdTIwMTQgdGhlIHBhdGggaXMgdW5sb2NrZWQgb25seSB3aGVuXG4gKiAgICB0aGUgbGFzdCBsb2NrIGlzIHJlbGVhc2VkLlxuICogMi4gKipWYXVsdC1tdXRhdGlvbiBibG9ja2luZyoqIChvcHQtaW4gdmlhIGBzaG91bGRCbG9ja011dGF0aW9uc2ApIFx1MjAxNCBhbnkgZWRpdC9kZWxldGUvcmVuYW1lL21vdmUvXG4gKiAgICBjcmVhdGUgb2YgYSBsb2NrZWQgcGF0aCB0aHJvdWdoIHRoZSBgVmF1bHRgL2BGaWxlTWFuYWdlcmAgQVBJIHRocm93cyB7QGxpbmsgUmVzb3VyY2VMb2NrZWRFcnJvcn0sXG4gKiAgICB1bmxlc3MgdGhlIG93bmluZyBvcGVyYXRpb24gaGFzIG9wZW5lZCBhIHtAbGluayBSZXNvdXJjZUxvY2tDb21wb25lbnQuYnlwYXNzQmxvY2tlZE11dGF0aW9uc30gc2NvcGVcbiAqICAgIG92ZXIgdGhhdCBwYXRoLlxuICogMy4gKipFeHRlcm5hbC1jaGFuZ2UgZGV0ZWN0aW9uKiogXHUyMDE0IGEgdmF1bHQvbWV0YWRhdGEgZXZlbnQgb24gYSBsb2NrZWQgcGF0aCB0aGF0IG5vIGJ5cGFzcyBzY29wZVxuICogICAgY292ZXJzIGlzIHRyZWF0ZWQgYXMgYW4gaW50cnVkZXIgKFN5bmMgLyByYXcgZmlsZXN5c3RlbSAvIGFub3RoZXIgcGx1Z2luKSBhbmQgYWJvcnRzIHRoZSBvd25pbmdcbiAqICAgIG9wZXJhdGlvbidzIHtAbGluayBBYm9ydENvbnRyb2xsZXJ9LlxuICpcbiAqIFRoZSBhY3F1aXJlcnMgcmV0dXJuIGEge0BsaW5rIERpc3Bvc2FibGV9LCBzbyB0aGUgcHJlZmVycmVkIGNhbGwgc3R5bGUgaXMgYSBgdXNpbmdgIGRlY2xhcmF0aW9uIHRoYXRcbiAqIHJlbGVhc2VzIGF1dG9tYXRpY2FsbHkgYXQgc2NvcGUgZXhpdCAoaW5jbHVkaW5nIG9uIHRocm93KTpcbiAqXG4gKiBgYGB0c1xuICogdXNpbmcgX2xvY2sgPSBsb2NrUmVzb3VyY2VGb3JQYXRoKGFwcCwgcGF0aCwgdGhpcy5tYW5pZmVzdC5pZCk7XG4gKiAvLyAuLi4gbG9uZy1ydW5uaW5nIHdvcmsgKHByb2Nlc3MsIHByb2Nlc3NGcm9udE1hdHRlciwgbWVyZ2Uvc3BsaXQpIC4uLlxuICogLy8gYXV0by11bmxvY2tlZCBhdCBzY29wZSBleGl0XG4gKiBgYGBcbiAqXG4gKiBUaGUgZXhwbGljaXQge0BsaW5rIHVubG9ja1Jlc291cmNlRm9yUGF0aH0gcGFpciByZW1haW5zIGF2YWlsYWJsZSBmb3Igbm9uLWB1c2luZ2AgY2FsbCBzaXRlcy5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7XG4gIEFwcCxcbiAgVEFic3RyYWN0RmlsZVxufSBmcm9tICdvYnNpZGlhbic7XG5cbmltcG9ydCB7IFZpZXdUeXBlIH0gZnJvbSAnQG9ic2lkaWFuLXR5cGluZ3Mvb2JzaWRpYW4tcHVibGljLWxhdGVzdC9pbXBsZW1lbnRhdGlvbnMnO1xuaW1wb3J0IHtcbiAgRmlsZU1hbmFnZXIsXG4gIE1hcmtkb3duVmlldyxcbiAgTWVudSxcbiAgc2V0SWNvbixcbiAgc2V0VG9vbHRpcCxcbiAgVmF1bHRcbn0gZnJvbSAnb2JzaWRpYW4nO1xuXG5pbXBvcnQgdHlwZSB7IFBhdGhPckZpbGUgfSBmcm9tICcuL2ZpbGUtc3lzdGVtLnRzJztcblxuaW1wb3J0IHsgY29udmVydEFzeW5jVG9TeW5jIH0gZnJvbSAnLi4vYXN5bmMudHMnO1xuaW1wb3J0IHtcbiAgQ2FsbGJhY2tEaXNwb3NhYmxlLFxuICBNdWx0aXBsZURpc3Bvc2VCZWhhdmlvclxufSBmcm9tICcuLi9kaXNwb3NhYmxlLnRzJztcbmltcG9ydCB7IG5vb3AgfSBmcm9tICcuLi9mdW5jdGlvbi50cyc7XG5pbXBvcnQgeyBnZXRPYnNpZGlhbkRldlV0aWxzU3RhdGUgfSBmcm9tICcuLi9vYnNpZGlhbi1kZXYtdXRpbHMtc3RhdGUudHMnO1xuaW1wb3J0IHsgYXNzZXJ0Tm9uTnVsbGFibGUgfSBmcm9tICcuLi90eXBlLWd1YXJkcy50cyc7XG5pbXBvcnQgeyBDb21wb25lbnRFeCB9IGZyb20gJy4vY29tcG9uZW50cy9jb21wb25lbnQtZXgudHMnO1xuaW1wb3J0IHsgTW9ua2V5QXJvdW5kQ29tcG9uZW50IH0gZnJvbSAnLi9jb21wb25lbnRzL21vbmtleS1hcm91bmQtY29tcG9uZW50LnRzJztcbmltcG9ydCB7IHRvZ2dsZUVkaXRvclJlYWRPbmx5IH0gZnJvbSAnLi9lZGl0b3IudHMnO1xuaW1wb3J0IHsgZ2V0UGF0aCB9IGZyb20gJy4vZmlsZS1zeXN0ZW0udHMnO1xuaW1wb3J0IHsgYXBwZW5kQ29kZUJsb2NrIH0gZnJvbSAnLi9odG1sLWVsZW1lbnQudHMnO1xuaW1wb3J0IHsgdCB9IGZyb20gJy4vaTE4bi9pMThuLnRzJztcbmltcG9ydCB7IGNvbmZpcm0gfSBmcm9tICcuL21vZGFscy9jb25maXJtLnRzJztcbmltcG9ydCB7XG4gIGlzQ2hpbGQsXG4gIGlzQ2hpbGRPclNlbGZcbn0gZnJvbSAnLi92YXVsdC50cyc7XG5cbmNvbnN0IEJFRVBfRFVSQVRJT05fU0VDT05EUyA9IDAuMDg7XG5jb25zdCBCRUVQX0ZSRVFVRU5DWV9IWiA9IDY2MDtcbmNvbnN0IEJFRVBfR0FJTiA9IDAuMDU7XG5jb25zdCBCRUVQX1RIUk9UVExFX01JTExJU0VDT05EUyA9IDIwMDtcbmNvbnN0IFJFU09VUkNFX0xPQ0tfU1RBVEVfS0VZID0gJ3Jlc291cmNlTG9jayc7XG5jb25zdCBMT0NLX0lDT05fSUQgPSAnbG9jayc7XG5jb25zdCBMT0NLX0lORElDQVRPUl9DU1NfQ0xBU1MgPSAnb2JzaWRpYW4tZGV2LXV0aWxzLWxvY2staW5kaWNhdG9yJztcbmNvbnN0IExPQ0tfSU5ESUNBVE9SX0ZMQVNIX0NTU19DTEFTUyA9ICdvYnNpZGlhbi1kZXYtdXRpbHMtbG9jay1pbmRpY2F0b3ItZmxhc2gnO1xuY29uc3QgU1RBVFVTX0JBUl9JVEVNX0NTU19DTEFTUyA9ICdzdGF0dXMtYmFyLWl0ZW0nO1xuY29uc3QgU1RBVFVTX0JBUl9DU1NfU0VMRUNUT1IgPSAnLnN0YXR1cy1iYXInO1xuY29uc3QgVU5MT0NLX0lDT05fSUQgPSAndW5sb2NrJztcblxuLyoqXG4gKiBPcHRpb25zIGZvciB7QGxpbmsgUmVzb3VyY2VMb2NrQ29tcG9uZW50LmxvY2tGb3JQYXRofS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZXNvdXJjZUxvY2tDb21wb25lbnRMb2NrRm9yUGF0aE9wdGlvbnMge1xuICAvKipcbiAgICogQW4gb3B0aW9uYWwge0BsaW5rIEFib3J0Q29udHJvbGxlcn0gYXNzb2NpYXRlZCB3aXRoIHRoZSBsb2NrLiBXaGVuIHRoZSBsb2NrIGluZGljYXRvciBpc1xuICAgKiByaWdodC1jbGlja2VkIGFuZCB0aGUgdXNlciBjb25maXJtcyBhbiB1bmxvY2sgKG9yIHtAbGluayByZXF1ZXN0UmVzb3VyY2VVbmxvY2tGb3JQYXRofSBpcyBjYWxsZWQgZm9yXG4gICAqIHRoZSBwYXRoKSwgdGhpcyBjb250cm9sbGVyIGlzIGFib3J0ZWQgc28gdGhlIG9wZXJhdGlvbiBob2xkaW5nIHRoZSBsb2NrIGNhbiBjYW5jZWwgaXRzZWxmIGFuZFxuICAgKiByZWxlYXNlIHRoZSBsb2NrIGluIGl0cyBvd24gY2xlYW51cC5cbiAgICovXG4gIHJlYWRvbmx5IGFib3J0Q29udHJvbGxlcj86IEFib3J0Q29udHJvbGxlcjtcblxuICAvKipcbiAgICogVGhlIGxvY2sgc2NvcGUuIGAnc3VidHJlZSdgIGFsc28gbG9ja3MgZXZlcnkgZGVzY2VuZGFudCBvZiBhIGZvbGRlciBwYXRoOyBgJ2ZpbGUnYCBsb2NrcyBvbmx5IHRoZVxuICAgKiBleGFjdCBwYXRoLiBBIGBzdWJ0cmVlYCBsb2NrIG11c3QgYmUgcmVsZWFzZWQgdmlhIHRoZSByZXR1cm5lZCB7QGxpbmsgRGlzcG9zYWJsZX0gKG5vdCB0aGVcbiAgICogZXhwbGljaXQge0BsaW5rIFJlc291cmNlTG9ja0NvbXBvbmVudC51bmxvY2tGb3JQYXRofSkuXG4gICAqXG4gICAqIEBkZWZhdWx0IGAnZmlsZSdgXG4gICAqL1xuICByZWFkb25seSBtb2RlPzogUmVzb3VyY2VMb2NrTW9kZTtcblxuICAvKipcbiAgICogV2hlbiBgdHJ1ZWAsIHRoZSBsb2NrIGFsc28gKipibG9ja3MgdmF1bHQgbXV0YXRpb25zKiogb2YgdGhlIGNvdmVyZWQgcGF0aChzKTogYW55IGF0dGVtcHQgdG8gZWRpdCxcbiAgICogZGVsZXRlLCByZW5hbWUsIG1vdmUsIG9yIChyZSljcmVhdGUgdGhlIHJlc291cmNlIHRocm91Z2ggdGhlIGBWYXVsdGAvYEZpbGVNYW5hZ2VyYCBBUEkgdGhyb3dzIGFcbiAgICoge0BsaW5rIFJlc291cmNlTG9ja2VkRXJyb3J9LiBJbnN0YWxsZWQgbGF6aWx5IG9uIHRoZSBmaXJzdCBzdWNoIGxvY2sgYW5kIHJlbW92ZWQgd2hlbiB0aGUgbGFzdCBvbmVcbiAgICogaXMgcmVsZWFzZWQuIFdoZW4gYGZhbHNlYCAodGhlIGRlZmF1bHQpIHRoZSBsb2NrIG9ubHkgbWFrZXMgdGhlIGVkaXRvciByZWFkLW9ubHkgXHUyMDE0IGxlZ2FjeSBiZWhhdmlvcixcbiAgICogc28gZXhpc3RpbmcgY29uc3VtZXJzIHRoYXQgd3JpdGUgdG8gYSBub3RlIHRoZXkgaG9sZCBhbiBlZGl0b3IgbG9jayBvbiBhcmUgdW5hZmZlY3RlZC5cbiAgICpcbiAgICogQGRlZmF1bHQgYGZhbHNlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkQmxvY2tNdXRhdGlvbnM/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIFRoZSBzY29wZSBvZiBhIGxvY2suXG4gKlxuICogLSBgJ2ZpbGUnYCBsb2NrcyBvbmx5IHRoZSBleGFjdCBwYXRoLlxuICogLSBgJ3N1YnRyZWUnYCBsb2NrcyB0aGUgcGF0aCBhbmQgZXZlcnkgZGVzY2VuZGFudCB1bmRlciBpdCAoaXRzIHdob2xlIGZvbGRlciBzdWJ0cmVlKSwgc28gYSBmaWxlXG4gKiAgIGluc2lkZSBhIGBzdWJ0cmVlYC1sb2NrZWQgZm9sZGVyIGlzIHRyZWF0ZWQgYXMgbG9ja2VkIHRvby5cbiAqL1xuZXhwb3J0IHR5cGUgUmVzb3VyY2VMb2NrTW9kZSA9ICdmaWxlJyB8ICdzdWJ0cmVlJztcblxuaW50ZXJmYWNlIExvY2tFbnRyeSB7XG4gIHJlYWRvbmx5IGFib3J0Q29udHJvbGxlcjogQWJvcnRDb250cm9sbGVyIHwgbnVsbDtcbiAgcmVhZG9ubHkgYmxvY2tzTXV0YXRpb25zOiBib29sZWFuO1xuICByZWFkb25seSBtb2RlOiBSZXNvdXJjZUxvY2tNb2RlO1xuICByZWFkb25seSBwbHVnaW5JZDogc3RyaW5nO1xufVxuXG5pbnRlcmZhY2UgTG9ja0luZGljYXRvcnMge1xuICByZWFkb25seSBhY3Rpb25JY29uRWw6IEhUTUxFbGVtZW50O1xuICBkaXNwb3NlVHlwZUxpc3RlbmVyKCk6IHZvaWQ7XG4gIHJlYWRvbmx5IHRhYkljb25FbDogSFRNTEVsZW1lbnQgfCBudWxsO1xufVxuXG5pbnRlcmZhY2UgTWFuYWdlckxvY2tPcHRpb25zIHtcbiAgcmVhZG9ubHkgYWJvcnRDb250cm9sbGVyPzogQWJvcnRDb250cm9sbGVyIHwgdW5kZWZpbmVkO1xuICByZWFkb25seSBibG9ja3NNdXRhdGlvbnM/OiBib29sZWFuIHwgdW5kZWZpbmVkO1xuICByZWFkb25seSBtb2RlPzogUmVzb3VyY2VMb2NrTW9kZSB8IHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBDb25zdHJ1Y3RvciBwYXJhbWV0ZXJzIGZvciB7QGxpbmsgUmVzb3VyY2VMb2NrRXZlbnRzQ29tcG9uZW50fS5cbiAqL1xuaW50ZXJmYWNlIFJlc291cmNlTG9ja0V2ZW50c0NvbXBvbmVudENvbnN0cnVjdG9yUGFyYW1zIHtcbiAgcmVhZG9ubHkgYXBwOiBBcHA7XG4gIG9uQ2hhbmdlKHRoaXM6IHZvaWQpOiB2b2lkO1xuICBvbkV4dGVybmFsTXV0YXRpb24odGhpczogdm9pZCwgcGF0aDogc3RyaW5nKTogdm9pZDtcbiAgb25GaWxlTWVudSh0aGlzOiB2b2lkLCBtZW51OiBNZW51LCBmaWxlOiBUQWJzdHJhY3RGaWxlKTogdm9pZDtcbn1cblxuaW50ZXJmYWNlIFJlc291cmNlTG9ja011dGF0aW9uQmxvY2tlckNvbXBvbmVudENvbnN0cnVjdG9yUGFyYW1zIHtcbiAgc2hvdWxkQmxvY2tNdXRhdGlvbih0aGlzOiB2b2lkLCBwYXRoOiBzdHJpbmcpOiBib29sZWFuO1xufVxuXG4vKipcbiAqIFN1YnNjcmliZXMgdG8gdGhlIHdvcmtzcGFjZSBldmVudHMgdGhhdCBzaG91bGQgdHJpZ2dlciBhIGxvY2sgcmVjb25jaWxlIChhbmQgdGhlIGZpbGUgY29udGV4dC1tZW51XG4gKiBldmVudCB0aGF0IG9mZmVycyBhbiBcIlVubG9ja1wiIGl0ZW0pLiBJbXBsZW1lbnRlZCBhcyBhIHtAbGluayBDb21wb25lbnRFeH0gc28gdGhlIHN1YnNjcmlwdGlvbnMgYXJlXG4gKiByZWdpc3RlcmVkIG9uIGBsb2FkKClgIGFuZCBhdXRvbWF0aWNhbGx5IHJlbW92ZWQgb24gYHVubG9hZCgpYCwgaW5zdGVhZCBvZiBiZWluZyB0cmFja2VkIGJ5IGhhbmQuXG4gKi9cbmNsYXNzIFJlc291cmNlTG9ja0V2ZW50c0NvbXBvbmVudCBleHRlbmRzIENvbXBvbmVudEV4IHtcbiAgcHJpdmF0ZSByZWFkb25seSBhcHA6IEFwcDtcbiAgcHJpdmF0ZSByZWFkb25seSBvbkNoYW5nZTogKCkgPT4gdm9pZDtcbiAgcHJpdmF0ZSByZWFkb25seSBvbkV4dGVybmFsTXV0YXRpb246IChwYXRoOiBzdHJpbmcpID0+IHZvaWQ7XG4gIHByaXZhdGUgcmVhZG9ubHkgb25GaWxlTWVudTogKG1lbnU6IE1lbnUsIGZpbGU6IFRBYnN0cmFjdEZpbGUpID0+IHZvaWQ7XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKHBhcmFtczogUmVzb3VyY2VMb2NrRXZlbnRzQ29tcG9uZW50Q29uc3RydWN0b3JQYXJhbXMpIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMuYXBwID0gcGFyYW1zLmFwcDtcbiAgICB0aGlzLm9uQ2hhbmdlID0gcGFyYW1zLm9uQ2hhbmdlO1xuICAgIHRoaXMub25FeHRlcm5hbE11dGF0aW9uID0gcGFyYW1zLm9uRXh0ZXJuYWxNdXRhdGlvbjtcbiAgICB0aGlzLm9uRmlsZU1lbnUgPSBwYXJhbXMub25GaWxlTWVudTtcbiAgfVxuXG4gIHB1YmxpYyBvdmVycmlkZSBvbmxvYWQoKTogdm9pZCB7XG4gICAgc3VwZXIub25sb2FkKCk7XG4gICAgdGhpcy5yZWdpc3RlckV2ZW50KHRoaXMuYXBwLndvcmtzcGFjZS5vbignYWN0aXZlLWxlYWYtY2hhbmdlJywgdGhpcy5vbkNoYW5nZSkpO1xuICAgIHRoaXMucmVnaXN0ZXJFdmVudCh0aGlzLmFwcC53b3Jrc3BhY2Uub24oJ2xheW91dC1jaGFuZ2UnLCB0aGlzLm9uQ2hhbmdlKSk7XG4gICAgLy8gU2FtZS1sZWFmIG5hdmlnYXRpb24gdG8gYW5vdGhlciBub3RlIGZpcmVzIG5vIGxlYWYvbGF5b3V0IGNoYW5nZTsgd2l0aG91dCB0aGlzIGl0IHN0YXlzIHJlYWQtb25seS5cbiAgICB0aGlzLnJlZ2lzdGVyRXZlbnQodGhpcy5hcHAud29ya3NwYWNlLm9uKCdmaWxlLW9wZW4nLCB0aGlzLm9uQ2hhbmdlKSk7XG4gICAgLy8gQWRkcyBhbiBcIlVubG9ja1wiIGl0ZW0gdG8gYSBsb2NrZWQgbm90ZSdzIHRhYi9maWxlIGNvbnRleHQgbWVudSAoYWxvbmdzaWRlIHRoZSBpbmRpY2F0b3IgbWVudXMpLlxuICAgIHRoaXMucmVnaXN0ZXJFdmVudCh0aGlzLmFwcC53b3Jrc3BhY2Uub24oJ2ZpbGUtbWVudScsIHRoaXMub25GaWxlTWVudSkpO1xuICAgIC8vIEV4dGVybmFsLWNoYW5nZSBiYWNrc3RvcDogYSB2YXVsdC9tZXRhZGF0YSBldmVudCBvbiBhIG11dGF0aW9uLWJsb2NrZWQgcGF0aCBub3QgY292ZXJlZCBieSBhbiBhY3RpdmUgYnlwYXNzIHNjb3BlIGlzIGFuIGludHJ1ZGVyIChhIHN5bmMvRlMvYWRhcHRlciBjaGFuZ2UgdGhhdCBieXBhc3NlZCB0aGUgYmxvY2tlciBwYXRjaCkuXG4gICAgdGhpcy5yZWdpc3RlckV2ZW50KHRoaXMuYXBwLnZhdWx0Lm9uKCdjcmVhdGUnLCAoZmlsZSk6IHZvaWQgPT4ge1xuICAgICAgdGhpcy5vbkV4dGVybmFsTXV0YXRpb24oZmlsZS5wYXRoKTtcbiAgICB9KSk7XG4gICAgdGhpcy5yZWdpc3RlckV2ZW50KHRoaXMuYXBwLnZhdWx0Lm9uKCdkZWxldGUnLCAoZmlsZSk6IHZvaWQgPT4ge1xuICAgICAgdGhpcy5vbkV4dGVybmFsTXV0YXRpb24oZmlsZS5wYXRoKTtcbiAgICB9KSk7XG4gICAgdGhpcy5yZWdpc3RlckV2ZW50KHRoaXMuYXBwLnZhdWx0Lm9uKCdyZW5hbWUnLCAoZmlsZSwgb2xkUGF0aCk6IHZvaWQgPT4ge1xuICAgICAgdGhpcy5vbkV4dGVybmFsTXV0YXRpb24ob2xkUGF0aCk7XG4gICAgICB0aGlzLm9uRXh0ZXJuYWxNdXRhdGlvbihmaWxlLnBhdGgpO1xuICAgIH0pKTtcbiAgICB0aGlzLnJlZ2lzdGVyRXZlbnQodGhpcy5hcHAubWV0YWRhdGFDYWNoZS5vbignZGVsZXRlZCcsIChmaWxlKTogdm9pZCA9PiB7XG4gICAgICB0aGlzLm9uRXh0ZXJuYWxNdXRhdGlvbihmaWxlLnBhdGgpO1xuICAgIH0pKTtcbiAgfVxufVxuXG4vKipcbiAqIE1vbmtleS1wYXRjaGVzIHRoZSB2YXVsdC1tdXRhdGlvbiBjaG9rZSBwb2ludHMgb24gYFZhdWx0YC9gRmlsZU1hbmFnZXJgIHNvIHRoYXQgYW55IGVkaXQsIGRlbGV0ZSxcbiAqIHJlbmFtZSwgbW92ZSwgb3IgKHJlKWNyZWF0ZSBvZiBhIG11dGF0aW9uLWJsb2NrZWQgcGF0aCB0aHJvd3MgYSB7QGxpbmsgUmVzb3VyY2VMb2NrZWRFcnJvcn0uXG4gKiBJbnN0YWxsZWQgbGF6aWx5IGJ5IHtAbGluayBSZXNvdXJjZUxvY2tNYW5hZ2VyfSBvbiB0aGUgZmlyc3QgYHNob3VsZEJsb2NrTXV0YXRpb25zYCBsb2NrIGFuZCByZW1vdmVkXG4gKiB3aGVuIHRoZSBsYXN0IG9uZSBpcyByZWxlYXNlZDsgYmVpbmcgYSB7QGxpbmsgTW9ua2V5QXJvdW5kQ29tcG9uZW50fSwgZXZlcnkgcGF0Y2ggaXMgdG9ybiBkb3duIG9uXG4gKiBgdW5sb2FkYC4gUmVuYW1lL2NvcHkgY2hlY2sgYm90aCBzb3VyY2UgYW5kIGRlc3RpbmF0aW9uOyB0aGUgb3RoZXIgbWV0aG9kcyBjaGVjayB0aGVpciBzaW5nbGUgcGF0aC5cbiAqL1xuY2xhc3MgUmVzb3VyY2VMb2NrTXV0YXRpb25CbG9ja2VyQ29tcG9uZW50IGV4dGVuZHMgTW9ua2V5QXJvdW5kQ29tcG9uZW50IHtcbiAgcHJpdmF0ZSByZWFkb25seSBzaG91bGRCbG9ja011dGF0aW9uOiAocGF0aDogc3RyaW5nKSA9PiBib29sZWFuO1xuXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihwYXJhbXM6IFJlc291cmNlTG9ja011dGF0aW9uQmxvY2tlckNvbXBvbmVudENvbnN0cnVjdG9yUGFyYW1zKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLnNob3VsZEJsb2NrTXV0YXRpb24gPSBwYXJhbXMuc2hvdWxkQmxvY2tNdXRhdGlvbjtcbiAgfVxuXG4gIHB1YmxpYyBvdmVycmlkZSBvbmxvYWQoKTogdm9pZCB7XG4gICAgc3VwZXIub25sb2FkKCk7XG5cbiAgICB0aGlzLnJlZ2lzdGVyTWV0aG9kUGF0Y2g8VmF1bHQsICdhcHBlbmQnPih7XG4gICAgICBtZXRob2ROYW1lOiAnYXBwZW5kJyxcbiAgICAgIG9iajogVmF1bHQucHJvdG90eXBlLFxuICAgICAgcGF0Y2hIYW5kbGVyOiAoeyBmYWxsYmFjaywgb3JpZ2luYWxBcmdzOiBbZmlsZV0gfSkgPT4ge1xuICAgICAgICB0aGlzLmFzc2VydE5vdEJsb2NrZWQoW2ZpbGUucGF0aF0pO1xuICAgICAgICByZXR1cm4gZmFsbGJhY2soKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICB0aGlzLnJlZ2lzdGVyTWV0aG9kUGF0Y2g8VmF1bHQsICdjb3B5Jz4oe1xuICAgICAgbWV0aG9kTmFtZTogJ2NvcHknLFxuICAgICAgb2JqOiBWYXVsdC5wcm90b3R5cGUsXG4gICAgICBwYXRjaEhhbmRsZXI6ICh7IGZhbGxiYWNrLCBvcmlnaW5hbEFyZ3M6IFssIG5ld1BhdGhdIH0pID0+IHtcbiAgICAgICAgdGhpcy5hc3NlcnROb3RCbG9ja2VkKFtuZXdQYXRoXSk7XG4gICAgICAgIHJldHVybiBmYWxsYmFjaygpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHRoaXMucmVnaXN0ZXJNZXRob2RQYXRjaDxWYXVsdCwgJ2NyZWF0ZSc+KHtcbiAgICAgIG1ldGhvZE5hbWU6ICdjcmVhdGUnLFxuICAgICAgb2JqOiBWYXVsdC5wcm90b3R5cGUsXG4gICAgICBwYXRjaEhhbmRsZXI6ICh7IGZhbGxiYWNrLCBvcmlnaW5hbEFyZ3M6IFtwYXRoXSB9KSA9PiB7XG4gICAgICAgIHRoaXMuYXNzZXJ0Tm90QmxvY2tlZChbcGF0aF0pO1xuICAgICAgICByZXR1cm4gZmFsbGJhY2soKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICB0aGlzLnJlZ2lzdGVyTWV0aG9kUGF0Y2g8VmF1bHQsICdjcmVhdGVCaW5hcnknPih7XG4gICAgICBtZXRob2ROYW1lOiAnY3JlYXRlQmluYXJ5JyxcbiAgICAgIG9iajogVmF1bHQucHJvdG90eXBlLFxuICAgICAgcGF0Y2hIYW5kbGVyOiAoeyBmYWxsYmFjaywgb3JpZ2luYWxBcmdzOiBbcGF0aF0gfSkgPT4ge1xuICAgICAgICB0aGlzLmFzc2VydE5vdEJsb2NrZWQoW3BhdGhdKTtcbiAgICAgICAgcmV0dXJuIGZhbGxiYWNrKCk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgdGhpcy5yZWdpc3Rlck1ldGhvZFBhdGNoPFZhdWx0LCAnY3JlYXRlRm9sZGVyJz4oe1xuICAgICAgbWV0aG9kTmFtZTogJ2NyZWF0ZUZvbGRlcicsXG4gICAgICBvYmo6IFZhdWx0LnByb3RvdHlwZSxcbiAgICAgIHBhdGNoSGFuZGxlcjogKHsgZmFsbGJhY2ssIG9yaWdpbmFsQXJnczogW3BhdGhdIH0pID0+IHtcbiAgICAgICAgdGhpcy5hc3NlcnROb3RCbG9ja2VkKFtwYXRoXSk7XG4gICAgICAgIHJldHVybiBmYWxsYmFjaygpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHRoaXMucmVnaXN0ZXJNZXRob2RQYXRjaDxWYXVsdCwgJ2RlbGV0ZSc+KHtcbiAgICAgIG1ldGhvZE5hbWU6ICdkZWxldGUnLFxuICAgICAgb2JqOiBWYXVsdC5wcm90b3R5cGUsXG4gICAgICBwYXRjaEhhbmRsZXI6ICh7IGZhbGxiYWNrLCBvcmlnaW5hbEFyZ3M6IFtmaWxlXSB9KSA9PiB7XG4gICAgICAgIHRoaXMuYXNzZXJ0Tm90QmxvY2tlZChbZmlsZS5wYXRoXSk7XG4gICAgICAgIHJldHVybiBmYWxsYmFjaygpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHRoaXMucmVnaXN0ZXJNZXRob2RQYXRjaDxWYXVsdCwgJ21vZGlmeSc+KHtcbiAgICAgIG1ldGhvZE5hbWU6ICdtb2RpZnknLFxuICAgICAgb2JqOiBWYXVsdC5wcm90b3R5cGUsXG4gICAgICBwYXRjaEhhbmRsZXI6ICh7IGZhbGxiYWNrLCBvcmlnaW5hbEFyZ3M6IFtmaWxlXSB9KSA9PiB7XG4gICAgICAgIHRoaXMuYXNzZXJ0Tm90QmxvY2tlZChbZmlsZS5wYXRoXSk7XG4gICAgICAgIHJldHVybiBmYWxsYmFjaygpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHRoaXMucmVnaXN0ZXJNZXRob2RQYXRjaDxWYXVsdCwgJ21vZGlmeUJpbmFyeSc+KHtcbiAgICAgIG1ldGhvZE5hbWU6ICdtb2RpZnlCaW5hcnknLFxuICAgICAgb2JqOiBWYXVsdC5wcm90b3R5cGUsXG4gICAgICBwYXRjaEhhbmRsZXI6ICh7IGZhbGxiYWNrLCBvcmlnaW5hbEFyZ3M6IFtmaWxlXSB9KSA9PiB7XG4gICAgICAgIHRoaXMuYXNzZXJ0Tm90QmxvY2tlZChbZmlsZS5wYXRoXSk7XG4gICAgICAgIHJldHVybiBmYWxsYmFjaygpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHRoaXMucmVnaXN0ZXJNZXRob2RQYXRjaDxWYXVsdCwgJ3Byb2Nlc3MnPih7XG4gICAgICBtZXRob2ROYW1lOiAncHJvY2VzcycsXG4gICAgICBvYmo6IFZhdWx0LnByb3RvdHlwZSxcbiAgICAgIHBhdGNoSGFuZGxlcjogKHsgZmFsbGJhY2ssIG9yaWdpbmFsQXJnczogW2ZpbGVdIH0pID0+IHtcbiAgICAgICAgdGhpcy5hc3NlcnROb3RCbG9ja2VkKFtmaWxlLnBhdGhdKTtcbiAgICAgICAgcmV0dXJuIGZhbGxiYWNrKCk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgdGhpcy5yZWdpc3Rlck1ldGhvZFBhdGNoPFZhdWx0LCAncmVuYW1lJz4oe1xuICAgICAgbWV0aG9kTmFtZTogJ3JlbmFtZScsXG4gICAgICBvYmo6IFZhdWx0LnByb3RvdHlwZSxcbiAgICAgIHBhdGNoSGFuZGxlcjogKHsgZmFsbGJhY2ssIG9yaWdpbmFsQXJnczogW2ZpbGUsIG5ld1BhdGhdIH0pID0+IHtcbiAgICAgICAgdGhpcy5hc3NlcnROb3RCbG9ja2VkKFtmaWxlLnBhdGgsIG5ld1BhdGhdKTtcbiAgICAgICAgcmV0dXJuIGZhbGxiYWNrKCk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgdGhpcy5yZWdpc3Rlck1ldGhvZFBhdGNoPFZhdWx0LCAndHJhc2gnPih7XG4gICAgICBtZXRob2ROYW1lOiAndHJhc2gnLFxuICAgICAgb2JqOiBWYXVsdC5wcm90b3R5cGUsXG4gICAgICBwYXRjaEhhbmRsZXI6ICh7IGZhbGxiYWNrLCBvcmlnaW5hbEFyZ3M6IFtmaWxlXSB9KSA9PiB7XG4gICAgICAgIHRoaXMuYXNzZXJ0Tm90QmxvY2tlZChbZmlsZS5wYXRoXSk7XG4gICAgICAgIHJldHVybiBmYWxsYmFjaygpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHRoaXMucmVnaXN0ZXJNZXRob2RQYXRjaDxGaWxlTWFuYWdlciwgJ3JlbmFtZUZpbGUnPih7XG4gICAgICBtZXRob2ROYW1lOiAncmVuYW1lRmlsZScsXG4gICAgICBvYmo6IEZpbGVNYW5hZ2VyLnByb3RvdHlwZSxcbiAgICAgIHBhdGNoSGFuZGxlcjogKHsgZmFsbGJhY2ssIG9yaWdpbmFsQXJnczogW2ZpbGUsIG5ld1BhdGhdIH0pID0+IHtcbiAgICAgICAgdGhpcy5hc3NlcnROb3RCbG9ja2VkKFtmaWxlLnBhdGgsIG5ld1BhdGhdKTtcbiAgICAgICAgcmV0dXJuIGZhbGxiYWNrKCk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgdGhpcy5yZWdpc3Rlck1ldGhvZFBhdGNoPEZpbGVNYW5hZ2VyLCAndHJhc2hGaWxlJz4oe1xuICAgICAgbWV0aG9kTmFtZTogJ3RyYXNoRmlsZScsXG4gICAgICBvYmo6IEZpbGVNYW5hZ2VyLnByb3RvdHlwZSxcbiAgICAgIHBhdGNoSGFuZGxlcjogKHsgZmFsbGJhY2ssIG9yaWdpbmFsQXJnczogW2ZpbGVdIH0pID0+IHtcbiAgICAgICAgdGhpcy5hc3NlcnROb3RCbG9ja2VkKFtmaWxlLnBhdGhdKTtcbiAgICAgICAgcmV0dXJuIGZhbGxiYWNrKCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGFzc2VydE5vdEJsb2NrZWQocGF0aHM6IHN0cmluZ1tdKTogdm9pZCB7XG4gICAgZm9yIChjb25zdCBwYXRoIG9mIHBhdGhzKSB7XG4gICAgICBpZiAodGhpcy5zaG91bGRCbG9ja011dGF0aW9uKHBhdGgpKSB7XG4gICAgICAgIHRocm93IG5ldyBSZXNvdXJjZUxvY2tlZEVycm9yKHBhdGgpO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIFRyYWNrcyBwYXRoLXNjb3BlZCBlZGl0b3IgbG9ja3MgYW5kIGtlZXBzIGV2ZXJ5IG9wZW4ge0BsaW5rIE1hcmtkb3duVmlld30gaW4gc3luYyB3aXRoIHRoZSBsb2NrZWRcbiAqIHNldC4gQSBzaW5nbGUgaW5zdGFuY2UgbGl2ZXMgb24gdGhlIHNoYXJlZCBgb2JzaWRpYW4tZGV2LXV0aWxzYCBzdGF0ZS4gRWFjaCBsb2NrIGlzIG9uZVxuICoge0BsaW5rIExvY2tFbnRyeX0gaW4gYSBwZXItcGF0aCBsaXN0LCBzbyBhIHBhdGggY2FuIGJlIGhlbGQgYnkgc2V2ZXJhbCBwbHVnaW5zIChvciBzZXZlcmFsIHRpbWVzIGJ5XG4gKiBvbmUpIGNvbmN1cnJlbnRseSBhbmQgaXMgcmVsZWFzZWQgb25seSB3aGVuIGl0cyBsYXN0IGVudHJ5IGlzIHJlbW92ZWQ7IHRoZSBpbmRpY2F0b3JzIHJlcG9ydCB3aGljaFxuICogcGx1Z2lucyBjdXJyZW50bHkgaG9sZCBhIGxvY2suXG4gKi9cbmNsYXNzIFJlc291cmNlTG9ja01hbmFnZXIge1xuICBwcml2YXRlIGF1ZGlvQ29udGV4dDogQXVkaW9Db250ZXh0IHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgcmVhZG9ubHkgYnlwYXNzUGF0aFNldHMgPSBuZXcgU2V0PFJlYWRvbmx5U2V0PHN0cmluZz4+KCk7XG4gIHByaXZhdGUgZXZlbnRzQ29tcG9uZW50OiBudWxsIHwgUmVzb3VyY2VMb2NrRXZlbnRzQ29tcG9uZW50ID0gbnVsbDtcbiAgcHJpdmF0ZSByZWFkb25seSBpbmRpY2F0b3JzQnlWaWV3ID0gbmV3IE1hcDxNYXJrZG93blZpZXcsIExvY2tJbmRpY2F0b3JzPigpO1xuICBwcml2YXRlIGxhc3RCZWVwTWlsbGlzZWNvbmRzID0gMDtcbiAgcHJpdmF0ZSByZWFkb25seSBsb2NrRW50cmllc0J5UGF0aCA9IG5ldyBNYXA8c3RyaW5nLCBMb2NrRW50cnlbXT4oKTtcbiAgcHJpdmF0ZSBtdXRhdGlvbkJsb2NrZXJDb21wb25lbnQ6IG51bGwgfCBSZXNvdXJjZUxvY2tNdXRhdGlvbkJsb2NrZXJDb21wb25lbnQgPSBudWxsO1xuICBwcml2YXRlIHN0YXR1c0Jhckl0ZW1FbDogSFRNTEVsZW1lbnQgfCBudWxsID0gbnVsbDtcblxuICBwdWJsaWMgYnlwYXNzKGFwcDogQXBwLCBwYXRoc09yRmlsZXM6IHJlYWRvbmx5IFBhdGhPckZpbGVbXSk6IERpc3Bvc2FibGUge1xuICAgIGNvbnN0IGJ5cGFzc2VkUGF0aHM6IFJlYWRvbmx5U2V0PHN0cmluZz4gPSBuZXcgU2V0KHBhdGhzT3JGaWxlcy5tYXAoKHBhdGhPckZpbGUpID0+IGdldFBhdGgoYXBwLCBwYXRoT3JGaWxlKSkpO1xuICAgIHRoaXMuYnlwYXNzUGF0aFNldHMuYWRkKGJ5cGFzc2VkUGF0aHMpO1xuICAgIHJldHVybiBuZXcgQ2FsbGJhY2tEaXNwb3NhYmxlKHtcbiAgICAgIGNhbGxiYWNrOiAoKTogdm9pZCA9PiB7XG4gICAgICAgIHRoaXMuYnlwYXNzUGF0aFNldHMuZGVsZXRlKGJ5cGFzc2VkUGF0aHMpO1xuICAgICAgfSxcbiAgICAgIG11bHRpcGxlRGlzcG9zZUJlaGF2aW9yOiBNdWx0aXBsZURpc3Bvc2VCZWhhdmlvci5JZ25vcmVcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBpc0xvY2tlZChhcHA6IEFwcCwgcGF0aE9yRmlsZTogUGF0aE9yRmlsZSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmlzUGF0aExvY2tlZChnZXRQYXRoKGFwcCwgcGF0aE9yRmlsZSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrcyB3aGV0aGVyIHRoZSBnaXZlbiBwYXRoIGlzIGxvY2tlZCBkaXJlY3RseSBvciBpcyBjb3ZlcmVkIGJ5IGEgYHN1YnRyZWVgLWxvY2tlZCBhbmNlc3RvclxuICAgKiBmb2xkZXIuXG4gICAqXG4gICAqIEBwYXJhbSBhcHAgLSBUaGUgT2JzaWRpYW4gYXBwIGluc3RhbmNlLlxuICAgKiBAcGFyYW0gcGF0aE9yRmlsZSAtIFRoZSBwYXRoIG9yIGZpbGUgdG8gY2hlY2suXG4gICAqIEByZXR1cm5zIGB0cnVlYCBpZiB0aGUgcGF0aCBpcyBpdHNlbGYgbG9ja2VkIG9yIGxpZXMgdW5kZXIgYSBgc3VidHJlZWAtbG9ja2VkIGZvbGRlci5cbiAgICovXG4gIHB1YmxpYyBpc0xvY2tlZEJ5QW5jZXN0b3IoYXBwOiBBcHAsIHBhdGhPckZpbGU6IFBhdGhPckZpbGUpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5yZXNvbHZlTG9ja093bmVyUGF0aChhcHAsIGdldFBhdGgoYXBwLCBwYXRoT3JGaWxlKSkgIT09IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIGdpdmVuIHBhdGggaXMgY292ZXJlZCBieSBhIG11dGF0aW9uLWJsb2NraW5nIGxvY2sgKG9uZSB0YWtlbiB3aXRoXG4gICAqIGBibG9ja3NNdXRhdGlvbnNgKSBkaXJlY3RseSBvciBvbiBhIGBzdWJ0cmVlYC1sb2NrZWQgYW5jZXN0b3IgZm9sZGVyLlxuICAgKlxuICAgKiBAcGFyYW0gYXBwIC0gVGhlIE9ic2lkaWFuIGFwcCBpbnN0YW5jZS5cbiAgICogQHBhcmFtIHBhdGhPckZpbGUgLSBUaGUgcGF0aCBvciBmaWxlIHRvIGNoZWNrLlxuICAgKiBAcmV0dXJucyBgdHJ1ZWAgaWYgYSBtdXRhdGlvbiBvZiB0aGUgcGF0aCBpcyBjdXJyZW50bHkgYmxvY2tlZC5cbiAgICovXG4gIHB1YmxpYyBpc011dGF0aW9uQmxvY2tlZEJ5QW5jZXN0b3IoYXBwOiBBcHAsIHBhdGhPckZpbGU6IFBhdGhPckZpbGUpOiBib29sZWFuIHtcbiAgICBjb25zdCBwYXRoID0gZ2V0UGF0aChhcHAsIHBhdGhPckZpbGUpO1xuICAgIGNvbnN0IGV4YWN0RW50cmllcyA9IHRoaXMubG9ja0VudHJpZXNCeVBhdGguZ2V0KHBhdGgpO1xuICAgIGlmIChleGFjdEVudHJpZXM/LnNvbWUoKGVudHJ5KSA9PiBlbnRyeS5ibG9ja3NNdXRhdGlvbnMpKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgZm9yIChjb25zdCBbbG9ja2VkUGF0aCwgZW50cmllc10gb2YgdGhpcy5sb2NrRW50cmllc0J5UGF0aCkge1xuICAgICAgaWYgKGVudHJpZXMuc29tZSgoZW50cnkpID0+IGVudHJ5Lm1vZGUgPT09ICdzdWJ0cmVlJyAmJiBlbnRyeS5ibG9ja3NNdXRhdGlvbnMpICYmIGlzQ2hpbGQoeyBhcHAsIGNoaWxkUGF0aE9yRmlsZTogcGF0aCwgcGFyZW50UGF0aE9yRmlsZTogbG9ja2VkUGF0aCB9KSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcHVibGljIGxvY2soYXBwOiBBcHAsIHBhdGhPckZpbGU6IFBhdGhPckZpbGUsIHBsdWdpbklkOiBzdHJpbmcsIG9wdGlvbnM6IE1hbmFnZXJMb2NrT3B0aW9ucyA9IHt9KTogRGlzcG9zYWJsZSB7XG4gICAgY29uc3QgcGF0aCA9IGdldFBhdGgoYXBwLCBwYXRoT3JGaWxlKTtcbiAgICBjb25zdCBlbnRyeTogTG9ja0VudHJ5ID0ge1xuICAgICAgYWJvcnRDb250cm9sbGVyOiBvcHRpb25zLmFib3J0Q29udHJvbGxlciA/PyBudWxsLFxuICAgICAgYmxvY2tzTXV0YXRpb25zOiBvcHRpb25zLmJsb2Nrc011dGF0aW9ucyA/PyBmYWxzZSxcbiAgICAgIG1vZGU6IG9wdGlvbnMubW9kZSA/PyAnZmlsZScsXG4gICAgICBwbHVnaW5JZFxuICAgIH07XG4gICAgbGV0IGVudHJpZXMgPSB0aGlzLmxvY2tFbnRyaWVzQnlQYXRoLmdldChwYXRoKTtcbiAgICBpZiAoIWVudHJpZXMpIHtcbiAgICAgIGVudHJpZXMgPSBbXTtcbiAgICAgIHRoaXMubG9ja0VudHJpZXNCeVBhdGguc2V0KHBhdGgsIGVudHJpZXMpO1xuICAgIH1cbiAgICBlbnRyaWVzLnB1c2goZW50cnkpO1xuICAgIHRoaXMuZW5zdXJlU3Vic2NyaWJlZChhcHApO1xuICAgIGlmIChlbnRyeS5ibG9ja3NNdXRhdGlvbnMpIHtcbiAgICAgIHRoaXMuZW5zdXJlQmxvY2tlckluc3RhbGxlZChhcHApO1xuICAgIH1cbiAgICB0aGlzLnJlY29uY2lsZShhcHApO1xuXG4gICAgcmV0dXJuIG5ldyBDYWxsYmFja0Rpc3Bvc2FibGUoe1xuICAgICAgY2FsbGJhY2s6ICgpOiB2b2lkID0+IHtcbiAgICAgICAgdGhpcy5yZW1vdmVFbnRyeShhcHAsIHBhdGgsIGVudHJ5KTtcbiAgICAgIH0sXG4gICAgICBtdWx0aXBsZURpc3Bvc2VCZWhhdmlvcjogTXVsdGlwbGVEaXNwb3NlQmVoYXZpb3IuSWdub3JlXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQWJvcnRzIGV2ZXJ5IHtAbGluayBBYm9ydENvbnRyb2xsZXJ9IGN1cnJlbnRseSByZWdpc3RlcmVkIGZvciB0aGUgbm90ZSBhdCB0aGUgZ2l2ZW4gcGF0aCwgd2hpY2hcbiAgICogY2FuY2VscyB0aGUgb3BlcmF0aW9ucyBob2xkaW5nIHRoZSBsb2NrLiBFYWNoIG9wZXJhdGlvbiByZWxlYXNlcyBpdHMgb3duIGxvY2sgaW4gaXRzIGBmaW5hbGx5YFxuICAgKiB3aGVuIGl0IG9ic2VydmVzIHRoZSBhYm9ydCwgc28gdGhpcyBkb2VzIG5vdCB1bmxvY2sgdGhlIHBhdGggZGlyZWN0bHkuIEEgbm8tb3Agd2hlbiBubyBjb250cm9sbGVyXG4gICAqIGlzIHJlZ2lzdGVyZWQgZm9yIHRoZSBwYXRoLlxuICAgKlxuICAgKiBAcGFyYW0gYXBwIC0gVGhlIE9ic2lkaWFuIGFwcCBpbnN0YW5jZS5cbiAgICogQHBhcmFtIHBhdGhPckZpbGUgLSBUaGUgcGF0aCBvciBmaWxlIG9mIHRoZSBub3RlIHRvIHJlcXVlc3QgYW4gdW5sb2NrIGZvci5cbiAgICovXG4gIHB1YmxpYyByZXF1ZXN0VW5sb2NrKGFwcDogQXBwLCBwYXRoT3JGaWxlOiBQYXRoT3JGaWxlKTogdm9pZCB7XG4gICAgY29uc3QgZW50cmllcyA9IHRoaXMubG9ja0VudHJpZXNCeVBhdGguZ2V0KGdldFBhdGgoYXBwLCBwYXRoT3JGaWxlKSk7XG4gICAgaWYgKCFlbnRyaWVzKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGZvciAoY29uc3QgZW50cnkgb2YgZW50cmllcykge1xuICAgICAgZW50cnkuYWJvcnRDb250cm9sbGVyPy5hYm9ydCgpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyB1bmxvY2soYXBwOiBBcHAsIHBhdGhPckZpbGU6IFBhdGhPckZpbGUsIHBsdWdpbklkOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zdCBwYXRoID0gZ2V0UGF0aChhcHAsIHBhdGhPckZpbGUpO1xuICAgIGNvbnN0IGVudHJpZXMgPSB0aGlzLmxvY2tFbnRyaWVzQnlQYXRoLmdldChwYXRoKTtcbiAgICBpZiAoIWVudHJpZXMpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgaW5kZXggPSBlbnRyaWVzLmZpbmRJbmRleCgoZW50cnkpID0+IGVudHJ5LnBsdWdpbklkID09PSBwbHVnaW5JZCk7XG4gICAgaWYgKGluZGV4ID09PSAtMSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBlbnRyaWVzLnNwbGljZShpbmRleCwgMSk7XG4gICAgaWYgKGVudHJpZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aGlzLmxvY2tFbnRyaWVzQnlQYXRoLmRlbGV0ZShwYXRoKTtcbiAgICB9XG4gICAgdGhpcy5yZWNvbmNpbGVBbmRDbGVhbnVwKGFwcCk7XG4gIH1cblxuICBwdWJsaWMgdW5sb2NrQWxsRm9yUGx1Z2luKGFwcDogQXBwLCBwbHVnaW5JZDogc3RyaW5nKTogdm9pZCB7XG4gICAgZm9yIChjb25zdCBbcGF0aCwgZW50cmllc10gb2YgdGhpcy5sb2NrRW50cmllc0J5UGF0aCkge1xuICAgICAgY29uc3QgcmVtYWluaW5nID0gZW50cmllcy5maWx0ZXIoKGVudHJ5KSA9PiBlbnRyeS5wbHVnaW5JZCAhPT0gcGx1Z2luSWQpO1xuICAgICAgaWYgKHJlbWFpbmluZy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgdGhpcy5sb2NrRW50cmllc0J5UGF0aC5kZWxldGUocGF0aCk7XG4gICAgICB9IGVsc2UgaWYgKHJlbWFpbmluZy5sZW5ndGggIT09IGVudHJpZXMubGVuZ3RoKSB7XG4gICAgICAgIHRoaXMubG9ja0VudHJpZXNCeVBhdGguc2V0KHBhdGgsIHJlbWFpbmluZyk7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMucmVjb25jaWxlQW5kQ2xlYW51cChhcHApO1xuICB9XG5cbiAgcHJpdmF0ZSBhZGRVbmxvY2tNZW51SXRlbShhcHA6IEFwcCwgbWVudTogTWVudSwgcGF0aDogc3RyaW5nKTogdm9pZCB7XG4gICAgbWVudS5hZGRJdGVtKChpdGVtKSA9PiB7XG4gICAgICBpdGVtXG4gICAgICAgIC5zZXRUaXRsZSh0KCgkKSA9PiAkLm9ic2lkaWFuRGV2VXRpbHMucmVzb3VyY2VMb2NrLnVubG9ja01lbnVJdGVtKSlcbiAgICAgICAgLnNldEljb24oVU5MT0NLX0lDT05fSUQpXG4gICAgICAgIC5vbkNsaWNrKGNvbnZlcnRBc3luY1RvU3luYyhhc3luYyAoKSA9PiB7XG4gICAgICAgICAgY29uc3QgaXNDb25maXJtZWQgPSBhd2FpdCBjb25maXJtKHtcbiAgICAgICAgICAgIGFwcCxcbiAgICAgICAgICAgIG1lc3NhZ2U6IHRoaXMudW5sb2NrQ29uZmlybU1lc3NhZ2UoYXBwLCBwYXRoKSxcbiAgICAgICAgICAgIHRpdGxlOiB0KCgkKSA9PiAkLm9ic2lkaWFuRGV2VXRpbHMucmVzb3VyY2VMb2NrLnVubG9ja0NvbmZpcm1UaXRsZSlcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBpZiAoaXNDb25maXJtZWQpIHtcbiAgICAgICAgICAgIHRoaXMucmVxdWVzdFVubG9jayhhcHAsIHBhdGgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSkpO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBiZWVwKCk6IHZvaWQge1xuICAgIC8vIFRocm90dGxlIHNvIGEgYnVyc3Qgb2Yga2V5c3Ryb2tlcyBkb2VzIG5vdCBzdGFjayBvdmVybGFwcGluZyB0b25lcyBpbnRvIGEgYnV6ei5cbiAgICBjb25zdCBub3dNaWxsaXNlY29uZHMgPSBEYXRlLm5vdygpO1xuICAgIGlmIChub3dNaWxsaXNlY29uZHMgLSB0aGlzLmxhc3RCZWVwTWlsbGlzZWNvbmRzIDwgQkVFUF9USFJPVFRMRV9NSUxMSVNFQ09ORFMpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5sYXN0QmVlcE1pbGxpc2Vjb25kcyA9IG5vd01pbGxpc2Vjb25kcztcblxuICAgIC8vIGBsaWIuZG9tYCB0eXBlcyBgQXVkaW9Db250ZXh0YCBhcyBhbHdheXMgcHJlc2VudCwgYnV0IGl0IGlzIGFic2VudCBpbiBzb21lIHJ1bnRpbWVzXG4gICAgLy8gKGUuZy4gdGhlIGpzZG9tIHRlc3QgZW52aXJvbm1lbnQpLCBzbyB0aGlzIGd1YXJkIGlzIHJlYWwsIG5vdCByZWR1bmRhbnQuXG4gICAgY29uc3QgQXVkaW9Db250ZXh0Q2xhc3MgPSB3aW5kb3cuQXVkaW9Db250ZXh0O1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5uZWNlc3NhcnktY29uZGl0aW9uIC0tIHNlZSB0aGUgY29tbWVudCBhYm92ZS5cbiAgICBpZiAoIUF1ZGlvQ29udGV4dENsYXNzKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuYXVkaW9Db250ZXh0ID8/PSBuZXcgQXVkaW9Db250ZXh0Q2xhc3MoKTtcbiAgICBjb25zdCBhdWRpb0NvbnRleHQgPSB0aGlzLmF1ZGlvQ29udGV4dDtcbiAgICBjb25zdCBvc2NpbGxhdG9yID0gYXVkaW9Db250ZXh0LmNyZWF0ZU9zY2lsbGF0b3IoKTtcbiAgICBjb25zdCBnYWluTm9kZSA9IGF1ZGlvQ29udGV4dC5jcmVhdGVHYWluKCk7XG4gICAgb3NjaWxsYXRvci50eXBlID0gJ3NpbmUnO1xuICAgIG9zY2lsbGF0b3IuZnJlcXVlbmN5LnZhbHVlID0gQkVFUF9GUkVRVUVOQ1lfSFo7XG4gICAgZ2Fpbk5vZGUuZ2Fpbi52YWx1ZSA9IEJFRVBfR0FJTjtcbiAgICBvc2NpbGxhdG9yLmNvbm5lY3QoZ2Fpbk5vZGUpO1xuICAgIGdhaW5Ob2RlLmNvbm5lY3QoYXVkaW9Db250ZXh0LmRlc3RpbmF0aW9uKTtcbiAgICBvc2NpbGxhdG9yLnN0YXJ0KCk7XG4gICAgb3NjaWxsYXRvci5zdG9wKGF1ZGlvQ29udGV4dC5jdXJyZW50VGltZSArIEJFRVBfRFVSQVRJT05fU0VDT05EUyk7XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZUluZGljYXRvcnMoYXBwOiBBcHAsIHZpZXc6IE1hcmtkb3duVmlldywgcGF0aDogc3RyaW5nLCB0b29sdGlwOiBzdHJpbmcpOiBMb2NrSW5kaWNhdG9ycyB7XG4gICAgY29uc3QgYWN0aW9uSWNvbkVsID0gdmlldy5hZGRBY3Rpb24oTE9DS19JQ09OX0lELCB0b29sdGlwLCBub29wKTtcbiAgICB0aGlzLnJlZ2lzdGVyVW5sb2NrTWVudShhcHAsIGFjdGlvbkljb25FbCwgKCkgPT4gcGF0aCk7XG5cbiAgICBsZXQgdGFiSWNvbkVsOiBIVE1MRWxlbWVudCB8IG51bGwgPSBudWxsO1xuICAgIGNvbnN0IHRhYlN0YXR1c0NvbnRhaW5lckVsID0gdmlldy5sZWFmLnRhYkhlYWRlclN0YXR1c0NvbnRhaW5lckVsO1xuICAgIGlmICh0YWJTdGF0dXNDb250YWluZXJFbCkge1xuICAgICAgdGFiSWNvbkVsID0gdGFiU3RhdHVzQ29udGFpbmVyRWwuY3JlYXRlU3Bhbih7IGNsczogTE9DS19JTkRJQ0FUT1JfQ1NTX0NMQVNTIH0pO1xuICAgICAgc2V0SWNvbih0YWJJY29uRWwsIExPQ0tfSUNPTl9JRCk7XG4gICAgICBzZXRUb29sdGlwKHRhYkljb25FbCwgdG9vbHRpcCk7XG4gICAgICB0aGlzLnJlZ2lzdGVyVW5sb2NrTWVudShhcHAsIHRhYkljb25FbCwgKCkgPT4gcGF0aCk7XG4gICAgfVxuXG4gICAgLy8gQSBsb2NrZWQgdmlldyBpcyByZWFkLW9ubHkgYnV0IHN0aWxsIGVkaXRhYmxlLWZvY3VzYWJsZSwgc28gYSBrZXlzdHJva2UgZmlyZXMgYGJlZm9yZWlucHV0YC5cbiAgICAvLyBPbiB0aGF0IHJlamVjdGVkIGF0dGVtcHQsIGZsYXNoIHRoZSBpbmRpY2F0b3JzIGFuZCBiZWVwIHNvIGl0J3MgY2xlYXIgdGhlIG5vdGUgaXMgbG9ja2VkLlxuICAgIC8vIFRoZSBsaXN0ZW5lciBpcyByZW1vdmVkIG9uIHVubG9jay5cbiAgICBjb25zdCBvblR5cGVBdHRlbXB0ID0gKCk6IHZvaWQgPT4ge1xuICAgICAgdGhpcy5mbGFzaEluZGljYXRvcnModmlldyk7XG4gICAgICB0aGlzLmJlZXAoKTtcbiAgICB9O1xuICAgIHZpZXcuY29udGVudEVsLmFkZEV2ZW50TGlzdGVuZXIoJ2JlZm9yZWlucHV0Jywgb25UeXBlQXR0ZW1wdCk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgYWN0aW9uSWNvbkVsLFxuICAgICAgZGlzcG9zZVR5cGVMaXN0ZW5lcjogKCk6IHZvaWQgPT4ge1xuICAgICAgICB2aWV3LmNvbnRlbnRFbC5yZW1vdmVFdmVudExpc3RlbmVyKCdiZWZvcmVpbnB1dCcsIG9uVHlwZUF0dGVtcHQpO1xuICAgICAgfSxcbiAgICAgIHRhYkljb25FbFxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIGVuc3VyZUJsb2NrZXJJbnN0YWxsZWQoYXBwOiBBcHApOiB2b2lkIHtcbiAgICBpZiAodGhpcy5tdXRhdGlvbkJsb2NrZXJDb21wb25lbnQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5tdXRhdGlvbkJsb2NrZXJDb21wb25lbnQgPSBuZXcgUmVzb3VyY2VMb2NrTXV0YXRpb25CbG9ja2VyQ29tcG9uZW50KHtcbiAgICAgIHNob3VsZEJsb2NrTXV0YXRpb246IChwYXRoKTogYm9vbGVhbiA9PiB0aGlzLnNob3VsZEJsb2NrTXV0YXRpb24oYXBwLCBwYXRoKVxuICAgIH0pO1xuICAgIHRoaXMubXV0YXRpb25CbG9ja2VyQ29tcG9uZW50LmxvYWQoKTtcbiAgfVxuXG4gIHByaXZhdGUgZW5zdXJlU3Vic2NyaWJlZChhcHA6IEFwcCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmV2ZW50c0NvbXBvbmVudCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLmV2ZW50c0NvbXBvbmVudCA9IG5ldyBSZXNvdXJjZUxvY2tFdmVudHNDb21wb25lbnQoe1xuICAgICAgYXBwLFxuICAgICAgb25DaGFuZ2U6ICgpOiB2b2lkID0+IHtcbiAgICAgICAgdGhpcy5yZWNvbmNpbGUoYXBwKTtcbiAgICAgIH0sXG4gICAgICBvbkV4dGVybmFsTXV0YXRpb246IChwYXRoKTogdm9pZCA9PiB7XG4gICAgICAgIHRoaXMuaGFuZGxlRXh0ZXJuYWxNdXRhdGlvbihhcHAsIHBhdGgpO1xuICAgICAgfSxcbiAgICAgIG9uRmlsZU1lbnU6IChtZW51LCBmaWxlKTogdm9pZCA9PiB7XG4gICAgICAgIHRoaXMuaGFuZGxlRmlsZU1lbnUoYXBwLCBtZW51LCBmaWxlKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICB0aGlzLmV2ZW50c0NvbXBvbmVudC5sb2FkKCk7XG4gIH1cblxuICBwcml2YXRlIGZsYXNoRWxlbWVudChlbDogSFRNTEVsZW1lbnQpOiB2b2lkIHtcbiAgICBlbC5yZW1vdmVDbGFzcyhMT0NLX0lORElDQVRPUl9GTEFTSF9DU1NfQ0xBU1MpO1xuICAgIC8vIFJlYWQgbGF5b3V0IHRvIGZvcmNlIGEgcmVmbG93IHNvIHRoZSBmbGFzaCBhbmltYXRpb24gcmVzdGFydHMgb24gZXZlcnkgcmVqZWN0ZWQga2V5c3Ryb2tlLlxuICAgIGVsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIGVsLmFkZENsYXNzKExPQ0tfSU5ESUNBVE9SX0ZMQVNIX0NTU19DTEFTUyk7XG4gIH1cblxuICBwcml2YXRlIGZsYXNoSW5kaWNhdG9ycyh2aWV3OiBNYXJrZG93blZpZXcpOiB2b2lkIHtcbiAgICBjb25zdCBpbmRpY2F0b3JzID0gdGhpcy5pbmRpY2F0b3JzQnlWaWV3LmdldCh2aWV3KTtcbiAgICBmb3IgKGNvbnN0IGVsIG9mIFtpbmRpY2F0b3JzPy5hY3Rpb25JY29uRWwsIGluZGljYXRvcnM/LnRhYkljb25FbCwgdGhpcy5zdGF0dXNCYXJJdGVtRWxdKSB7XG4gICAgICBpZiAoZWwpIHtcbiAgICAgICAgdGhpcy5mbGFzaEVsZW1lbnQoZWwpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZWFjdHMgdG8gYSB2YXVsdC9tZXRhZGF0YSBldmVudCBvbiBhIHBhdGguIElmIHRoZSBwYXRoIGlzIG11dGF0aW9uLWJsb2NrZWQgYW5kIE5PVCBjb3ZlcmVkIGJ5IGFuXG4gICAqIGFjdGl2ZSBieXBhc3Mgc2NvcGUsIHRoZSBjaGFuZ2UgYnlwYXNzZWQgdGhlIGJsb2NrZXIgcGF0Y2ggKHN5bmMgLyBmaWxlc3lzdGVtIC8gYSByYXctYWRhcHRlclxuICAgKiB3cml0ZSkgXHUyMDE0IGFuIGludHJ1ZGVyLiBBYm9ydCB0aGUgYGFib3J0Q29udHJvbGxlcmAgb2YgZXZlcnkgbXV0YXRpb24tYmxvY2tpbmcgbG9jayBjb3ZlcmluZyB0aGUgcGF0aFxuICAgKiBzbyB0aGUgb3duaW5nIG9wZXJhdGlvbiBjYW5jZWxzIGFuZCByb2xscyBiYWNrLiBBIG5vLW9wIGZvciB0aGUgb3duZXIncyBvd24gKGJ5cGFzc2VkKSBtdXRhdGlvbnMsXG4gICAqIGZvciB1bmJsb2NrZWQgcGF0aHMsIGFuZCBmb3IgYmxvY2tpbmcgbG9ja3Mgd2l0aCBubyBgYWJvcnRDb250cm9sbGVyYC5cbiAgICpcbiAgICogQHBhcmFtIGFwcCAtIFRoZSBPYnNpZGlhbiBhcHAgaW5zdGFuY2UuXG4gICAqIEBwYXJhbSBwYXRoIC0gVGhlIHBhdGggdGhlIGV2ZW50IGZpcmVkIG9uLlxuICAgKi9cbiAgcHJpdmF0ZSBoYW5kbGVFeHRlcm5hbE11dGF0aW9uKGFwcDogQXBwLCBwYXRoOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuaXNNdXRhdGlvbkJsb2NrZWRCeUFuY2VzdG9yKGFwcCwgcGF0aCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHRoaXMuaXNCeXBhc3NlZChhcHAsIHBhdGgpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGZvciAoY29uc3QgW2xvY2tlZFBhdGgsIGVudHJpZXNdIG9mIHRoaXMubG9ja0VudHJpZXNCeVBhdGgpIHtcbiAgICAgIGZvciAoY29uc3QgZW50cnkgb2YgZW50cmllcykge1xuICAgICAgICBpZiAoIWVudHJ5LmJsb2Nrc011dGF0aW9ucyB8fCAhZW50cnkuYWJvcnRDb250cm9sbGVyKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgY292ZXJzUGF0aCA9IGxvY2tlZFBhdGggPT09IHBhdGggfHwgKGVudHJ5Lm1vZGUgPT09ICdzdWJ0cmVlJyAmJiBpc0NoaWxkKHsgYXBwLCBjaGlsZFBhdGhPckZpbGU6IHBhdGgsIHBhcmVudFBhdGhPckZpbGU6IGxvY2tlZFBhdGggfSkpO1xuICAgICAgICBpZiAoY292ZXJzUGF0aCkge1xuICAgICAgICAgIGVudHJ5LmFib3J0Q29udHJvbGxlci5hYm9ydCgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBoYW5kbGVGaWxlTWVudShhcHA6IEFwcCwgbWVudTogTWVudSwgZmlsZTogVEFic3RyYWN0RmlsZSk6IHZvaWQge1xuICAgIC8vIE9mZmVyIFwiVW5sb2NrXCIgZm9yIGEgZGlyZWN0bHktbG9ja2VkIGZpbGUvZm9sZGVyLCBvciBhbnl0aGluZyBjb3ZlcmVkIGJ5IGEgYHN1YnRyZWVgIGxvY2sgb24gYW4gYW5jZXN0b3IuIFRoZSBtZW51IHRhcmdldHMgdGhlIG93bmVyIGxvY2sncyBwYXRoLlxuICAgIGNvbnN0IG93bmVyUGF0aCA9IHRoaXMucmVzb2x2ZUxvY2tPd25lclBhdGgoYXBwLCBmaWxlLnBhdGgpO1xuICAgIGlmIChvd25lclBhdGggPT09IG51bGwpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5hZGRVbmxvY2tNZW51SXRlbShhcHAsIG1lbnUsIG93bmVyUGF0aCk7XG4gIH1cblxuICBwcml2YXRlIGhhc0Jsb2NraW5nTG9jaygpOiBib29sZWFuIHtcbiAgICBmb3IgKGNvbnN0IGVudHJpZXMgb2YgdGhpcy5sb2NrRW50cmllc0J5UGF0aC52YWx1ZXMoKSkge1xuICAgICAgaWYgKGVudHJpZXMuc29tZSgoZW50cnkpID0+IGVudHJ5LmJsb2Nrc011dGF0aW9ucykpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVja3Mgd2hldGhlciB0aGUgcGF0aCBpcyBjb3ZlcmVkIGJ5IGFuIGFjdGl2ZSB7QGxpbmsgUmVzb3VyY2VMb2NrTWFuYWdlci5ieXBhc3N9IHNjb3BlIFx1MjAxNCB0aGVcbiAgICogb3duZXIgZGVjbGFyaW5nIHRoYXQgaXRzIG93biBtdXRhdGlvbnMgb2YgdGhlIHBhdGggKGFuZCwgZm9yIGEgZm9sZGVyLCBpdHMgc3VidHJlZSkgYXJlIHNhbmN0aW9uZWQuXG4gICAqXG4gICAqIEBwYXJhbSBhcHAgLSBUaGUgT2JzaWRpYW4gYXBwIGluc3RhbmNlLlxuICAgKiBAcGFyYW0gcGF0aCAtIFRoZSBwYXRoIGJlaW5nIG11dGF0ZWQuXG4gICAqIEByZXR1cm5zIGB0cnVlYCBpZiBzb21lIGFjdGl2ZSBieXBhc3Mgc2NvcGUgY292ZXJzIHRoZSBwYXRoLlxuICAgKi9cbiAgcHJpdmF0ZSBpc0J5cGFzc2VkKGFwcDogQXBwLCBwYXRoOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICBmb3IgKGNvbnN0IGJ5cGFzc2VkUGF0aHMgb2YgdGhpcy5ieXBhc3NQYXRoU2V0cykge1xuICAgICAgZm9yIChjb25zdCBieXBhc3NlZFBhdGggb2YgYnlwYXNzZWRQYXRocykge1xuICAgICAgICBpZiAoaXNDaGlsZE9yU2VsZih7IGFwcCwgY2hpbGRQYXRoT3JGaWxlOiBwYXRoLCBwYXJlbnRQYXRoT3JGaWxlOiBieXBhc3NlZFBhdGggfSkpIHtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBwcml2YXRlIGlzUGF0aExvY2tlZChwYXRoOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gKHRoaXMubG9ja0VudHJpZXNCeVBhdGguZ2V0KHBhdGgpPy5sZW5ndGggPz8gMCkgPiAwO1xuICB9XG5cbiAgcHJpdmF0ZSBsb2NraW5nUGx1Z2luTmFtZXMoYXBwOiBBcHAsIHBhdGg6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgICBjb25zdCBlbnRyaWVzID0gdGhpcy5sb2NrRW50cmllc0J5UGF0aC5nZXQocGF0aCk7XG4gICAgLy8gYGxvY2tpbmdQbHVnaW5OYW1lc2AgaXMgb25seSBldmVyIGNhbGxlZCBmb3IgYSBsb2NrZWQgcGF0aCwgc28gaXRzIGVudHJpZXMgYXJlIGFsd2F5cyBwcmVzZW50LlxuICAgIGFzc2VydE5vbk51bGxhYmxlKGVudHJpZXMpO1xuICAgIGNvbnN0IHBsdWdpbklkcyA9IFsuLi5uZXcgU2V0KGVudHJpZXMubWFwKChlbnRyeSkgPT4gZW50cnkucGx1Z2luSWQpKV07XG4gICAgcmV0dXJuIHBsdWdpbklkcy5tYXAoKHBsdWdpbklkKSA9PiBhcHAucGx1Z2lucy5tYW5pZmVzdHNbcGx1Z2luSWRdPy5uYW1lID8/IHBsdWdpbklkKTtcbiAgfVxuXG4gIHByaXZhdGUgbG9ja1Rvb2x0aXAoYXBwOiBBcHAsIHBhdGg6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgY29uc3QgaGVhZGVyID0gdCgoJCkgPT4gJC5vYnNpZGlhbkRldlV0aWxzLnJlc291cmNlTG9jay5sb2NrZWRCeVRvb2x0aXApO1xuICAgIC8vIEEgcnVudGltZS1sZW5ndGggbGlzdCBvZiBwbHVnaW4gbmFtZXMsIG9uZSBwZXIgbGluZSB1bmRlciB0aGUgaGVhZGVyLlxuICAgIHJldHVybiBbaGVhZGVyLCAuLi50aGlzLmxvY2tpbmdQbHVnaW5OYW1lcyhhcHAsIHBhdGgpXS5qb2luKCdcXG4nKTtcbiAgfVxuXG4gIHByaXZhdGUgcmVjb25jaWxlKGFwcDogQXBwKTogdm9pZCB7XG4gICAgY29uc3Qgdmlld3NUb0xvY2sgPSBuZXcgU2V0PE1hcmtkb3duVmlldz4oKTtcbiAgICBmb3IgKGNvbnN0IGxlYWYgb2YgYXBwLndvcmtzcGFjZS5nZXRMZWF2ZXNPZlR5cGUoVmlld1R5cGUuTWFya2Rvd24pKSB7XG4gICAgICBjb25zdCB2aWV3ID0gbGVhZi52aWV3O1xuICAgICAgaWYgKCEodmlldyBpbnN0YW5jZW9mIE1hcmtkb3duVmlldykpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHBhdGggPSB2aWV3LmZpbGU/LnBhdGg7XG4gICAgICBpZiAocGF0aCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICAvLyBSZXNvbHZlIHRoZSBsb2NrIGNvdmVyaW5nIHRoaXMgdmlldzogdGhlIGV4YWN0IHBhdGggd2hlbiBkaXJlY3RseSBsb2NrZWQsIG90aGVyd2lzZSB0aGUgZW5jbG9zaW5nIGBzdWJ0cmVlYC1sb2NrZWQgZm9sZGVyLiBJbmRpY2F0b3JzL3Rvb2x0aXAvdW5sb2NrIG1lbnUga2V5IG9mZiB0aGF0IG93bmVyIHBhdGguXG4gICAgICBjb25zdCBvd25lclBhdGggPSB0aGlzLnJlc29sdmVMb2NrT3duZXJQYXRoKGFwcCwgcGF0aCk7XG4gICAgICBpZiAob3duZXJQYXRoICE9PSBudWxsKSB7XG4gICAgICAgIHZpZXdzVG9Mb2NrLmFkZCh2aWV3KTtcbiAgICAgICAgY29uc3QgdG9vbHRpcCA9IHRoaXMubG9ja1Rvb2x0aXAoYXBwLCBvd25lclBhdGgpO1xuICAgICAgICAvLyBSZS1hcHBseSB0aGUgcmVhZC1vbmx5IHRvZ2dsZSBvbiBldmVyeSByZWNvbmNpbGUsIG5vdCBvbmx5IHRoZSBmaXJzdCB0aW1lIGEgdmlldyBpcyB0cmFja2VkLlxuICAgICAgICAvLyBUaGUgdG9nZ2xlIGlzIGlkZW1wb3RlbnQsIHNvIHJlLWFwcGx5aW5nIHRvIGFuIGFscmVhZHktbG9ja2VkIHZpZXcgaXMgY2hlYXAuXG4gICAgICAgIC8vIEEgdmlldyBvcGVuZWQgYWZ0ZXIgdGhlIGxvY2sgaXMgcmVjb25jaWxlZCBzeW5jaHJvbm91c2x5LCBiZWZvcmUgaXRzIENvZGVNaXJyb3IgaXMgcmVhZHkuXG4gICAgICAgIC8vIEl0cyBmaXJzdCB0b2dnbGUgaXMgdGhlcmVmb3JlIGEgbm8tb3A7IHJlLWFwcGx5aW5nIG1ha2VzIHRoZSBsb2NrIHRha2UgaG9sZCBvbmNlIGl0IHNldHRsZXMuXG4gICAgICAgIHRvZ2dsZUVkaXRvclJlYWRPbmx5KHZpZXcuZWRpdG9yLCB0cnVlKTtcbiAgICAgICAgY29uc3QgaW5kaWNhdG9ycyA9IHRoaXMuaW5kaWNhdG9yc0J5Vmlldy5nZXQodmlldyk7XG4gICAgICAgIGlmIChpbmRpY2F0b3JzKSB7XG4gICAgICAgICAgdGhpcy51cGRhdGVJbmRpY2F0b3JUb29sdGlwcyhpbmRpY2F0b3JzLCB0b29sdGlwKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLmluZGljYXRvcnNCeVZpZXcuc2V0KHZpZXcsIHRoaXMuY3JlYXRlSW5kaWNhdG9ycyhhcHAsIHZpZXcsIG93bmVyUGF0aCwgdG9vbHRpcCkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBbdmlldywgaW5kaWNhdG9yc10gb2YgdGhpcy5pbmRpY2F0b3JzQnlWaWV3KSB7XG4gICAgICBpZiAoIXZpZXdzVG9Mb2NrLmhhcyh2aWV3KSkge1xuICAgICAgICB0b2dnbGVFZGl0b3JSZWFkT25seSh2aWV3LmVkaXRvciwgZmFsc2UpO1xuICAgICAgICBpbmRpY2F0b3JzLmRpc3Bvc2VUeXBlTGlzdGVuZXIoKTtcbiAgICAgICAgaW5kaWNhdG9ycy5hY3Rpb25JY29uRWwucmVtb3ZlKCk7XG4gICAgICAgIGluZGljYXRvcnMudGFiSWNvbkVsPy5yZW1vdmUoKTtcbiAgICAgICAgdGhpcy5pbmRpY2F0b3JzQnlWaWV3LmRlbGV0ZSh2aWV3KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLnVwZGF0ZVN0YXR1c0JhcihhcHApO1xuICB9XG5cbiAgcHJpdmF0ZSByZWNvbmNpbGVBbmRDbGVhbnVwKGFwcDogQXBwKTogdm9pZCB7XG4gICAgdGhpcy5yZWNvbmNpbGUoYXBwKTtcbiAgICBpZiAodGhpcy5sb2NrRW50cmllc0J5UGF0aC5zaXplID09PSAwKSB7XG4gICAgICB0aGlzLmV2ZW50c0NvbXBvbmVudD8udW5sb2FkKCk7XG4gICAgICB0aGlzLmV2ZW50c0NvbXBvbmVudCA9IG51bGw7XG4gICAgfVxuICAgIGlmICghdGhpcy5oYXNCbG9ja2luZ0xvY2soKSkge1xuICAgICAgdGhpcy5tdXRhdGlvbkJsb2NrZXJDb21wb25lbnQ/LnVubG9hZCgpO1xuICAgICAgdGhpcy5tdXRhdGlvbkJsb2NrZXJDb21wb25lbnQgPSBudWxsO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgcmVnaXN0ZXJVbmxvY2tNZW51KGFwcDogQXBwLCBlbDogSFRNTEVsZW1lbnQsIGdldENvbnRleHRQYXRoOiAoKSA9PiBzdHJpbmcgfCB1bmRlZmluZWQpOiB2b2lkIHtcbiAgICAvLyBBIHBsYWluIGxpc3RlbmVyIGRpZXMgd2l0aCB0aGUgZWxlbWVudCB3aGVuIGl0IGlzIGAucmVtb3ZlKClgZCBvbiB1bmxvY2ssIHNvIGl0IG5ldmVyIGxlYWtzLlxuICAgIGVsLmFkZEV2ZW50TGlzdGVuZXIoJ2NvbnRleHRtZW51JywgKGV2dCkgPT4ge1xuICAgICAgZXZ0LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICBjb25zdCBwYXRoID0gZ2V0Q29udGV4dFBhdGgoKTtcbiAgICAgIGlmIChwYXRoID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY29uc3QgbWVudSA9IG5ldyBNZW51KCk7XG4gICAgICB0aGlzLmFkZFVubG9ja01lbnVJdGVtKGFwcCwgbWVudSwgcGF0aCk7XG4gICAgICBtZW51LnNob3dBdE1vdXNlRXZlbnQoZXZ0KTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgcmVtb3ZlRW50cnkoYXBwOiBBcHAsIHBhdGg6IHN0cmluZywgZW50cnk6IExvY2tFbnRyeSk6IHZvaWQge1xuICAgIGNvbnN0IGVudHJpZXMgPSB0aGlzLmxvY2tFbnRyaWVzQnlQYXRoLmdldChwYXRoKTtcbiAgICBpZiAoIWVudHJpZXMpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgaW5kZXggPSBlbnRyaWVzLmluZGV4T2YoZW50cnkpO1xuICAgIGlmIChpbmRleCA9PT0gLTEpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZW50cmllcy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgIGlmIChlbnRyaWVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhpcy5sb2NrRW50cmllc0J5UGF0aC5kZWxldGUocGF0aCk7XG4gICAgfVxuICAgIHRoaXMucmVjb25jaWxlQW5kQ2xlYW51cChhcHApO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc29sdmVzIHdoaWNoIGxvY2tlZCBwYXRoIChpZiBhbnkpIGNvdmVycyB0aGUgZ2l2ZW4gcGF0aDogdGhlIHBhdGggaXRzZWxmIHdoZW4gZGlyZWN0bHkgbG9ja2VkLFxuICAgKiBvdGhlcndpc2UgdGhlIGxvbmdlc3QgYHN1YnRyZWVgLWxvY2tlZCBhbmNlc3RvciBmb2xkZXIgdGhhdCBjb250YWlucyBpdCAobG9uZ2VzdCBzbyBhIG5lc3RlZFxuICAgKiBzdWJ0cmVlIGxvY2sgd2lucyBkZXRlcm1pbmlzdGljYWxseSBvdmVyIGFuIG91dGVyIG9uZSkuXG4gICAqXG4gICAqIEBwYXJhbSBhcHAgLSBUaGUgT2JzaWRpYW4gYXBwIGluc3RhbmNlLlxuICAgKiBAcGFyYW0gcGF0aCAtIFRoZSBwYXRoIHRvIHJlc29sdmUgYW4gb3duZXIgbG9jayBmb3IuXG4gICAqIEByZXR1cm5zIFRoZSBjb3ZlcmluZyBsb2NrZWQgcGF0aCwgb3IgYG51bGxgIHdoZW4gbm90aGluZyBjb3ZlcnMgaXQuXG4gICAqL1xuICBwcml2YXRlIHJlc29sdmVMb2NrT3duZXJQYXRoKGFwcDogQXBwLCBwYXRoOiBzdHJpbmcpOiBudWxsIHwgc3RyaW5nIHtcbiAgICBpZiAodGhpcy5pc1BhdGhMb2NrZWQocGF0aCkpIHtcbiAgICAgIHJldHVybiBwYXRoO1xuICAgIH1cbiAgICBsZXQgYmVzdE93bmVyUGF0aDogbnVsbCB8IHN0cmluZyA9IG51bGw7XG4gICAgZm9yIChjb25zdCBbbG9ja2VkUGF0aCwgZW50cmllc10gb2YgdGhpcy5sb2NrRW50cmllc0J5UGF0aCkge1xuICAgICAgY29uc3QgaGFzU3VidHJlZUxvY2sgPSBlbnRyaWVzLnNvbWUoKGVudHJ5KSA9PiBlbnRyeS5tb2RlID09PSAnc3VidHJlZScpO1xuICAgICAgaWYgKGhhc1N1YnRyZWVMb2NrICYmIGlzQ2hpbGQoeyBhcHAsIGNoaWxkUGF0aE9yRmlsZTogcGF0aCwgcGFyZW50UGF0aE9yRmlsZTogbG9ja2VkUGF0aCB9KSAmJiAoYmVzdE93bmVyUGF0aCA9PT0gbnVsbCB8fCBsb2NrZWRQYXRoLmxlbmd0aCA+IGJlc3RPd25lclBhdGgubGVuZ3RoKSkge1xuICAgICAgICBiZXN0T3duZXJQYXRoID0gbG9ja2VkUGF0aDtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGJlc3RPd25lclBhdGg7XG4gIH1cblxuICAvKipcbiAgICogRGVjaWRlcyB3aGV0aGVyIGEgbXV0YXRpb24gb2YgdGhlIHBhdGggbXVzdCBiZSBibG9ja2VkOiBgdHJ1ZWAgd2hlbiB0aGUgcGF0aCBpcyBtdXRhdGlvbi1ibG9ja2VkXG4gICAqIGFuZCBub3QgY292ZXJlZCBieSBhbnkgYWN0aXZlIHtAbGluayBSZXNvdXJjZUxvY2tNYW5hZ2VyLmJ5cGFzc30gc2NvcGUuXG4gICAqXG4gICAqIEBwYXJhbSBhcHAgLSBUaGUgT2JzaWRpYW4gYXBwIGluc3RhbmNlLlxuICAgKiBAcGFyYW0gcGF0aCAtIFRoZSBwYXRoIGJlaW5nIG11dGF0ZWQuXG4gICAqIEByZXR1cm5zIGB0cnVlYCB0byByZWplY3QgdGhlIG11dGF0aW9uLCBgZmFsc2VgIHRvIGFsbG93IGl0LlxuICAgKi9cbiAgcHJpdmF0ZSBzaG91bGRCbG9ja011dGF0aW9uKGFwcDogQXBwLCBwYXRoOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICBpZiAoIXRoaXMuaXNNdXRhdGlvbkJsb2NrZWRCeUFuY2VzdG9yKGFwcCwgcGF0aCkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuICF0aGlzLmlzQnlwYXNzZWQoYXBwLCBwYXRoKTtcbiAgfVxuXG4gIHByaXZhdGUgdW5sb2NrQ29uZmlybU1lc3NhZ2UoYXBwOiBBcHAsIHBhdGg6IHN0cmluZyk6IERvY3VtZW50RnJhZ21lbnQge1xuICAgIGNvbnN0IGZyYWdtZW50ID0gY3JlYXRlRnJhZ21lbnQoKTtcbiAgICBmcmFnbWVudC5hcHBlbmRUZXh0KHQoKCQpID0+ICQub2JzaWRpYW5EZXZVdGlscy5yZXNvdXJjZUxvY2sudW5sb2NrQ29uZmlybU1lc3NhZ2UpKTtcbiAgICAvLyBBIHJ1bnRpbWUtbGVuZ3RoIGxpc3Qgb2YgdGhlIHBsdWdpbnMgY3VycmVudGx5IGhvbGRpbmcgYSBsb2NrLCBlYWNoIGFzIGEgY29kZSBibG9jayBvbiBpdHMgb3duIGxpbmUuXG4gICAgZm9yIChjb25zdCBuYW1lIG9mIHRoaXMubG9ja2luZ1BsdWdpbk5hbWVzKGFwcCwgcGF0aCkpIHtcbiAgICAgIGZyYWdtZW50LmNyZWF0ZUVsKCdicicpO1xuICAgICAgYXBwZW5kQ29kZUJsb2NrKGZyYWdtZW50LCBuYW1lKTtcbiAgICB9XG4gICAgcmV0dXJuIGZyYWdtZW50O1xuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVJbmRpY2F0b3JUb29sdGlwcyhpbmRpY2F0b3JzOiBMb2NrSW5kaWNhdG9ycywgdG9vbHRpcDogc3RyaW5nKTogdm9pZCB7XG4gICAgc2V0VG9vbHRpcChpbmRpY2F0b3JzLmFjdGlvbkljb25FbCwgdG9vbHRpcCk7XG4gICAgaWYgKGluZGljYXRvcnMudGFiSWNvbkVsKSB7XG4gICAgICBzZXRUb29sdGlwKGluZGljYXRvcnMudGFiSWNvbkVsLCB0b29sdGlwKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZVN0YXR1c0JhcihhcHA6IEFwcCk6IHZvaWQge1xuICAgIGNvbnN0IGFjdGl2ZVZpZXcgPSBhcHAud29ya3NwYWNlLmdldEFjdGl2ZVZpZXdPZlR5cGUoTWFya2Rvd25WaWV3KTtcbiAgICBjb25zdCBhY3RpdmVQYXRoID0gYWN0aXZlVmlldz8uZmlsZT8ucGF0aDtcbiAgICBjb25zdCBhY3RpdmVPd25lclBhdGggPSBhY3RpdmVQYXRoID09PSB1bmRlZmluZWQgPyBudWxsIDogdGhpcy5yZXNvbHZlTG9ja093bmVyUGF0aChhcHAsIGFjdGl2ZVBhdGgpO1xuXG4gICAgaWYgKGFjdGl2ZU93bmVyUGF0aCA9PT0gbnVsbCB8fCAhYWN0aXZlVmlldykge1xuICAgICAgdGhpcy5zdGF0dXNCYXJJdGVtRWw/LnJlbW92ZSgpO1xuICAgICAgdGhpcy5zdGF0dXNCYXJJdGVtRWwgPSBudWxsO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICghdGhpcy5zdGF0dXNCYXJJdGVtRWwpIHtcbiAgICAgIGNvbnN0IHN0YXR1c0JhckVsID0gYWN0aXZlVmlldy5jb250YWluZXJFbC5vd25lckRvY3VtZW50LmJvZHkucXVlcnlTZWxlY3RvcjxIVE1MRWxlbWVudD4oU1RBVFVTX0JBUl9DU1NfU0VMRUNUT1IpO1xuICAgICAgaWYgKCFzdGF0dXNCYXJFbCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB0aGlzLnN0YXR1c0Jhckl0ZW1FbCA9IHN0YXR1c0JhckVsLmNyZWF0ZURpdih7IGNsczogW1NUQVRVU19CQVJfSVRFTV9DU1NfQ0xBU1MsIExPQ0tfSU5ESUNBVE9SX0NTU19DTEFTU10gfSk7XG4gICAgICBzZXRJY29uKHRoaXMuc3RhdHVzQmFySXRlbUVsLCBMT0NLX0lDT05fSUQpO1xuICAgICAgLy8gVGhlIHNpbmdsZSBzdGF0dXMtYmFyIGl0ZW0gaXMgcmV1c2VkIGFjcm9zcyBhY3RpdmUtbm90ZSBzd2l0Y2hlcy5cbiAgICAgIC8vIEl0IG11c3QgcmVzb2x2ZSB0aGUgY3VycmVudGx5IGFjdGl2ZSBub3RlJ3Mgb3duZXIgbG9jayBhdCBjbGljayB0aW1lIHJhdGhlciB0aGFuIGNhcHR1cmluZyBvbmUgcGF0aC5cbiAgICAgIHRoaXMucmVnaXN0ZXJVbmxvY2tNZW51KGFwcCwgdGhpcy5zdGF0dXNCYXJJdGVtRWwsICgpID0+IHtcbiAgICAgICAgY29uc3QgcGF0aCA9IGFwcC53b3Jrc3BhY2UuZ2V0QWN0aXZlVmlld09mVHlwZShNYXJrZG93blZpZXcpPy5maWxlPy5wYXRoO1xuICAgICAgICByZXR1cm4gcGF0aCA9PT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkIDogdGhpcy5yZXNvbHZlTG9ja093bmVyUGF0aChhcHAsIHBhdGgpID8/IHVuZGVmaW5lZDtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHNldFRvb2x0aXAodGhpcy5zdGF0dXNCYXJJdGVtRWwsIHRoaXMubG9ja1Rvb2x0aXAoYXBwLCBhY3RpdmVPd25lclBhdGgpKTtcbiAgfVxufVxuXG4vKipcbiAqIEEgcGVyLXBsdWdpbiBoYW5kbGUgZm9yIHBhdGgtc2NvcGVkIHJlc291cmNlIGxvY2tpbmcgKGVkaXRvciByZWFkLW9ubHksIG9wdGlvbmFsIHZhdWx0LW11dGF0aW9uXG4gKiBibG9ja2luZywgYW5kIGV4dGVybmFsLWNoYW5nZSBkZXRlY3Rpb24gXHUyMDE0IHNlZSB0aGUgZmlsZSBvdmVydmlldykuIEFkZCBpdCBhcyBhIGNoaWxkIG9mIHlvdXIgcGx1Z2luXG4gKiAoYHRoaXMuYWRkQ2hpbGQobmV3IFJlc291cmNlTG9ja0NvbXBvbmVudCh0aGlzLmFwcCkpYCkgc28gdGhhdCBhbnkgbG9ja3MgaXQgc3RpbGwgaG9sZHMgYXJlIHJlbGVhc2VkXG4gKiBhdXRvbWF0aWNhbGx5IHdoZW4gdGhlIHBsdWdpbiB1bmxvYWRzIFx1MjAxNCBhIHJlc291cmNlIGNhbiBuZXZlciBiZSBsZWZ0IHN0dWNrIGxvY2tlZCBiZWNhdXNlIHRoZSBwbHVnaW5cbiAqIHRoYXQgbG9ja2VkIGl0IHdhcyBkaXNhYmxlZCBvciByZWxvYWRlZCBtaWQtb3BlcmF0aW9uLlxuICpcbiAqIExvY2tzIGFyZSByZWZlcmVuY2UtY291bnRlZCBhbmQgYXR0cmlidXRlZCB0byB0aGlzIHBsdWdpbiwgc28gdGhlIGxvY2sgaW5kaWNhdG9ycycgdG9vbHRpcCBuYW1lcyBpdFxuICogYW1vbmcgdGhlIHBsdWdpbnMgY3VycmVudGx5IGhvbGRpbmcgYSBsb2NrLlxuICovXG5leHBvcnQgY2xhc3MgUmVzb3VyY2VMb2NrQ29tcG9uZW50IGV4dGVuZHMgQ29tcG9uZW50RXgge1xuICBwcml2YXRlIHJlYWRvbmx5IGFwcDogQXBwO1xuICBwcml2YXRlIHJlYWRvbmx5IHBsdWdpbklkOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYW4gcmVzb3VyY2UtbG9jayBoYW5kbGUgb3duZWQgYnkgYSBwbHVnaW4uXG4gICAqXG4gICAqIEBwYXJhbSBhcHAgLSBUaGUgT2JzaWRpYW4gYXBwIGluc3RhbmNlLlxuICAgKiBAcGFyYW0gcGx1Z2luSWQgLSBUaGUgaWQgb2YgdGhlIG93bmluZyBwbHVnaW4gKGUuZy4gaXRzIGBtYW5pZmVzdC5pZGApLiBMb2NrcyBhcmUgYXR0cmlidXRlZCB0b1xuICAgKiBpdCBmb3IgcmVmZXJlbmNlLWNvdW50aW5nIGFuZCB0aGUgaW5kaWNhdG9ycycgXCJsb2NrZWQgYnlcIiB0b29sdGlwLlxuICAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKGFwcDogQXBwLCBwbHVnaW5JZDogc3RyaW5nKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLmFwcCA9IGFwcDtcbiAgICB0aGlzLnBsdWdpbklkID0gcGx1Z2luSWQ7XG4gIH1cblxuICAvKipcbiAgICogT3BlbnMgYW4gKiphbWJpZW50IGJ5cGFzcyBzY29wZSoqOiB3aGlsZSB0aGUgcmV0dXJuZWQge0BsaW5rIERpc3Bvc2FibGV9IGlzIG5vdCBkaXNwb3NlZCwgdGhpc1xuICAgKiBwbHVnaW4ncyBvd24gbXV0YXRpb25zIG9mIHRoZSBnaXZlbiBwYXRocyAoYW5kLCBmb3IgYSBmb2xkZXIsIGl0cyB3aG9sZSBzdWJ0cmVlKSBwYXNzIHRocm91Z2ggdGhlXG4gICAqIG11dGF0aW9uIGJsb2NrZXIgaW5zdGVhZCBvZiB0aHJvd2luZyB7QGxpbmsgUmVzb3VyY2VMb2NrZWRFcnJvcn0uIEFueSBtdXRhdGlvbiBvZiBhIGJsb2NrZWQgcGF0aFxuICAgKiBOT1QgY292ZXJlZCBieSBhbiBhY3RpdmUgYnlwYXNzIHNjb3BlIGlzIHN0aWxsIHJlamVjdGVkLiBVc2UgaXQgd2l0aCBhIGB1c2luZ2AgZGVjbGFyYXRpb24gYXJvdW5kXG4gICAqIHRoZSBvcGVyYXRpb24gdGhhdCBsZWdpdGltYXRlbHkgbXV0YXRlcyByZXNvdXJjZXMgaXQgaGFzIGxvY2tlZCB3aXRoXG4gICAqIHtAbGluayBSZXNvdXJjZUxvY2tDb21wb25lbnRMb2NrRm9yUGF0aE9wdGlvbnMuc2hvdWxkQmxvY2tNdXRhdGlvbnN9OlxuICAgKlxuICAgKiBgYGB0c1xuICAgKiB1c2luZyBfYnlwYXNzID0gY29tcG9uZW50LmJ5cGFzc0Jsb2NrZWRNdXRhdGlvbnMoW3NvdXJjZUZpbGUsIHRhcmdldEZpbGVdKTtcbiAgICogLy8gLi4uIHRoZSBvcGVyYXRpb24ncyBvd24gdmF1bHQgbXV0YXRpb25zIG9mIHRob3NlIHBhdGhzIGFyZSBhbGxvd2VkIC4uLlxuICAgKiAvLyBzY29wZSBlbmQ6IHRoZSBwYXRocyBhcmUgZW5mb3JjZWQgYWdhaW5cbiAgICogYGBgXG4gICAqXG4gICAqIEBwYXJhbSBwYXRoc09yRmlsZXMgLSBUaGUgcGF0aHMgKG9yIGZpbGVzL2ZvbGRlcnMpIHdob3NlIG11dGF0aW9uIGJ5IHRoaXMgb3BlcmF0aW9uIGlzIHNhbmN0aW9uZWQuXG4gICAqIEByZXR1cm5zIEEge0BsaW5rIERpc3Bvc2FibGV9IHRoYXQgZW5kcyB0aGUgYnlwYXNzIHNjb3BlIHdoZW4gZGlzcG9zZWQuXG4gICAqL1xuICBwdWJsaWMgYnlwYXNzQmxvY2tlZE11dGF0aW9ucyhwYXRoc09yRmlsZXM6IHJlYWRvbmx5IFBhdGhPckZpbGVbXSk6IERpc3Bvc2FibGUge1xuICAgIHJldHVybiBnZXRNYW5hZ2VyKCkuYnlwYXNzKHRoaXMuYXBwLCBwYXRoc09yRmlsZXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrcyB3aGV0aGVyIHRoZSBwYXRoIGlzIGxvY2tlZCBkaXJlY3RseSBvciBsaWVzIHVuZGVyIGEgYHN1YnRyZWVgLWxvY2tlZCBhbmNlc3RvciBmb2xkZXIuXG4gICAqXG4gICAqIEBwYXJhbSBwYXRoT3JGaWxlIC0gVGhlIHBhdGggb3IgZmlsZSB0byBjaGVjay5cbiAgICogQHJldHVybnMgYHRydWVgIGlmIHRoZSBwYXRoIGlzIGl0c2VsZiBsb2NrZWQgb3IgaXMgY292ZXJlZCBieSBhIGBzdWJ0cmVlYCBsb2NrIG9uIGFuIGFuY2VzdG9yLlxuICAgKi9cbiAgcHVibGljIGlzTG9ja2VkQnlBbmNlc3RvckZvclBhdGgocGF0aE9yRmlsZTogUGF0aE9yRmlsZSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBnZXRNYW5hZ2VyKCkuaXNMb2NrZWRCeUFuY2VzdG9yKHRoaXMuYXBwLCBwYXRoT3JGaWxlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVja3Mgd2hldGhlciB0aGUgbm90ZSBhdCB0aGUgZ2l2ZW4gcGF0aCBpcyBjdXJyZW50bHkgbG9ja2VkIGJ5IGFueSBwbHVnaW4uXG4gICAqXG4gICAqIEBwYXJhbSBwYXRoT3JGaWxlIC0gVGhlIHBhdGggb3IgZmlsZSBvZiB0aGUgbm90ZSB0byBjaGVjay5cbiAgICogQHJldHVybnMgYHRydWVgIGlmIHRoZSBub3RlIGhhcyBhdCBsZWFzdCBvbmUgYWN0aXZlIGxvY2ssIGBmYWxzZWAgb3RoZXJ3aXNlLlxuICAgKi9cbiAgcHVibGljIGlzTG9ja2VkRm9yUGF0aChwYXRoT3JGaWxlOiBQYXRoT3JGaWxlKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGdldE1hbmFnZXIoKS5pc0xvY2tlZCh0aGlzLmFwcCwgcGF0aE9yRmlsZSk7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2tzIHdoZXRoZXIgYSB2YXVsdCBtdXRhdGlvbiBvZiB0aGUgcGF0aCBpcyBjdXJyZW50bHkgYmxvY2tlZCBieSBhIGBzaG91bGRCbG9ja011dGF0aW9uc2AgbG9ja1xuICAgKiBvbiB0aGUgcGF0aCBpdHNlbGYgb3Igb24gYSBgc3VidHJlZWAtbG9ja2VkIGFuY2VzdG9yIGZvbGRlci5cbiAgICpcbiAgICogQHBhcmFtIHBhdGhPckZpbGUgLSBUaGUgcGF0aCBvciBmaWxlIHRvIGNoZWNrLlxuICAgKiBAcmV0dXJucyBgdHJ1ZWAgaWYgZWRpdGluZy9kZWxldGluZy9yZW5hbWluZy9tb3ZpbmcvY3JlYXRpbmcgdGhlIHBhdGggd291bGQgdGhyb3cgYVxuICAgKiB7QGxpbmsgUmVzb3VyY2VMb2NrZWRFcnJvcn0uXG4gICAqL1xuICBwdWJsaWMgaXNNdXRhdGlvbkJsb2NrZWRCeUFuY2VzdG9yRm9yUGF0aChwYXRoT3JGaWxlOiBQYXRoT3JGaWxlKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGdldE1hbmFnZXIoKS5pc011dGF0aW9uQmxvY2tlZEJ5QW5jZXN0b3IodGhpcy5hcHAsIHBhdGhPckZpbGUpO1xuICB9XG5cbiAgLyoqXG4gICAqIExvY2tzIHRoZSBub3RlIGF0IHRoZSBnaXZlbiBwYXRoIG9uIGJlaGFsZiBvZiB0aGlzIHBsdWdpbiwgbWFraW5nIGl0IHJlYWQtb25seSBpbiBldmVyeSBjdXJyZW50XG4gICAqIGFuZCBmdXR1cmUge0BsaW5rIE1hcmtkb3duVmlld30gdW50aWwgdGhlIGxvY2sgaXMgcmVsZWFzZWQuIFJlZmVyZW5jZS1jb3VudGVkOiBiYWxhbmNlIGVhY2ggY2FsbFxuICAgKiB3aXRoIGEgZGlzcG9zZSBvZiB0aGUgcmV0dXJuZWQge0BsaW5rIERpc3Bvc2FibGV9IChpZGVhbGx5IHZpYSBgdXNpbmdgKSBvciB7QGxpbmsgdW5sb2NrRm9yUGF0aH0uXG4gICAqXG4gICAqIEBwYXJhbSBwYXRoT3JGaWxlIC0gVGhlIHBhdGggb3IgZmlsZSBvZiB0aGUgbm90ZSB0byBsb2NrLlxuICAgKiBAcGFyYW0gb3B0aW9ucyAtIE9wdGlvbmFsIGxvY2tpbmcgb3B0aW9ucy4gUGFzcyBhblxuICAgKiB7QGxpbmsgUmVzb3VyY2VMb2NrQ29tcG9uZW50TG9ja0ZvclBhdGhPcHRpb25zLmFib3J0Q29udHJvbGxlcn0gdG8gbWFrZSB0aGUgbG9jayBjYW5jZWxhYmxlIHZpYSB0aGVcbiAgICogaW5kaWNhdG9yJ3MgcmlnaHQtY2xpY2sgXCJ1bmxvY2tcIiBtZW51IG9yIHtAbGluayByZXF1ZXN0UmVzb3VyY2VVbmxvY2tGb3JQYXRofS5cbiAgICogQHJldHVybnMgQSB7QGxpbmsgRGlzcG9zYWJsZX0gdGhhdCByZWxlYXNlcyB0aGlzIGxvY2sgd2hlbiBkaXNwb3NlZC4gRGlzcG9zaW5nIG1vcmUgdGhhbiBvbmNlIGlzIGEgbm8tb3AuXG4gICAqL1xuICBwdWJsaWMgbG9ja0ZvclBhdGgocGF0aE9yRmlsZTogUGF0aE9yRmlsZSwgb3B0aW9ucz86IFJlc291cmNlTG9ja0NvbXBvbmVudExvY2tGb3JQYXRoT3B0aW9ucyk6IERpc3Bvc2FibGUge1xuICAgIHJldHVybiBnZXRNYW5hZ2VyKCkubG9jayh0aGlzLmFwcCwgcGF0aE9yRmlsZSwgdGhpcy5wbHVnaW5JZCwgeyBhYm9ydENvbnRyb2xsZXI6IG9wdGlvbnM/LmFib3J0Q29udHJvbGxlciwgYmxvY2tzTXV0YXRpb25zOiBvcHRpb25zPy5zaG91bGRCbG9ja011dGF0aW9ucywgbW9kZTogb3B0aW9ucz8ubW9kZSB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWxlYXNlcyBldmVyeSBsb2NrIHN0aWxsIGhlbGQgYnkgdGhpcyBwbHVnaW4gd2hlbiB0aGUgY29tcG9uZW50IChhbmQgdGh1cyB0aGUgcGx1Z2luKSB1bmxvYWRzLFxuICAgKiBzbyBubyBub3RlIGlzIGxlZnQgc3R1Y2sgcmVhZC1vbmx5IGJ5IGFuIG9wZXJhdGlvbiB0aGF0IG5ldmVyIGNvbXBsZXRlZC5cbiAgICovXG4gIHB1YmxpYyBvdmVycmlkZSBvbnVubG9hZCgpOiB2b2lkIHtcbiAgICBnZXRNYW5hZ2VyKCkudW5sb2NrQWxsRm9yUGx1Z2luKHRoaXMuYXBwLCB0aGlzLnBsdWdpbklkKTtcbiAgICBzdXBlci5vbnVubG9hZCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbGVhc2VzIG9uZSBsb2NrIHByZXZpb3VzbHkgYWNxdWlyZWQgZm9yIHRoZSBub3RlIGF0IHRoZSBnaXZlbiBwYXRoIHZpYSB7QGxpbmsgbG9ja0ZvclBhdGh9LlxuICAgKlxuICAgKiBAcGFyYW0gcGF0aE9yRmlsZSAtIFRoZSBwYXRoIG9yIGZpbGUgb2YgdGhlIG5vdGUgdG8gdW5sb2NrLlxuICAgKi9cbiAgcHVibGljIHVubG9ja0ZvclBhdGgocGF0aE9yRmlsZTogUGF0aE9yRmlsZSk6IHZvaWQge1xuICAgIGdldE1hbmFnZXIoKS51bmxvY2sodGhpcy5hcHAsIHBhdGhPckZpbGUsIHRoaXMucGx1Z2luSWQpO1xuICB9XG59XG5cbi8qKlxuICogVGhyb3duIGJ5IHRoZSB2YXVsdC1tdXRhdGlvbiBibG9ja2VyIHdoZW4gYSBwbHVnaW4gdHJpZXMgdG8gZWRpdCwgZGVsZXRlLCByZW5hbWUsIG1vdmUsIG9yIGNyZWF0ZSBhXG4gKiByZXNvdXJjZSB3aG9zZSBwYXRoIGlzIGNvdmVyZWQgYnkgYSBsb2NrIHRha2VuIHdpdGhcbiAqIHtAbGluayBSZXNvdXJjZUxvY2tDb21wb25lbnRMb2NrRm9yUGF0aE9wdGlvbnMuc2hvdWxkQmxvY2tNdXRhdGlvbnN9LlxuICovXG5leHBvcnQgY2xhc3MgUmVzb3VyY2VMb2NrZWRFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgLyoqXG4gICAqIFRoZSB2YXVsdCBwYXRoIHdob3NlIG11dGF0aW9uIHdhcyBibG9ja2VkLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHBhdGg6IHN0cmluZztcblxuICAvKipcbiAgICogQ3JlYXRlcyBhIHtAbGluayBSZXNvdXJjZUxvY2tlZEVycm9yfS5cbiAgICpcbiAgICogQHBhcmFtIHBhdGggLSBUaGUgdmF1bHQgcGF0aCB3aG9zZSBtdXRhdGlvbiB3YXMgYmxvY2tlZC5cbiAgICovXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihwYXRoOiBzdHJpbmcpIHtcbiAgICBzdXBlcihgVGhlIHJlc291cmNlIFwiJHtwYXRofVwiIGlzIGxvY2tlZCBhbmQgY2Fubm90IGJlIG11dGF0ZWQuYCk7XG4gICAgdGhpcy5uYW1lID0gJ1Jlc291cmNlTG9ja2VkRXJyb3InO1xuICAgIHRoaXMucGF0aCA9IHBhdGg7XG4gIH1cbn1cblxuLyoqXG4gKiBDaGVja3Mgd2hldGhlciB0aGUgbm90ZSBhdCB0aGUgZ2l2ZW4gcGF0aCBpcyBjdXJyZW50bHkgbG9ja2VkLlxuICpcbiAqIEBwYXJhbSBhcHAgLSBUaGUgT2JzaWRpYW4gYXBwIGluc3RhbmNlLlxuICogQHBhcmFtIHBhdGhPckZpbGUgLSBUaGUgcGF0aCBvciBmaWxlIG9mIHRoZSBub3RlIHRvIGNoZWNrLlxuICogQHJldHVybnMgYHRydWVgIGlmIHRoZSBub3RlIGhhcyBhdCBsZWFzdCBvbmUgYWN0aXZlIGxvY2ssIGBmYWxzZWAgb3RoZXJ3aXNlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNSZXNvdXJjZUxvY2tlZEZvclBhdGgoYXBwOiBBcHAsIHBhdGhPckZpbGU6IFBhdGhPckZpbGUpOiBib29sZWFuIHtcbiAgcmV0dXJuIGdldE1hbmFnZXIoKS5pc0xvY2tlZChhcHAsIHBhdGhPckZpbGUpO1xufVxuXG4vKipcbiAqIExvY2tzIHRoZSBub3RlIGF0IHRoZSBnaXZlbiBwYXRoLCBtYWtpbmcgaXQgcmVhZC1vbmx5IGluIGV2ZXJ5IGN1cnJlbnQgYW5kIGZ1dHVyZVxuICoge0BsaW5rIE1hcmtkb3duVmlld30gdW50aWwgdGhlIGxvY2sgaXMgcmVsZWFzZWQsIGFuZCBzaG93aW5nIGEgbG9jayBpbmRpY2F0b3IgaW4gdGhlIHRhYiBoZWFkZXIsXG4gKiB2aWV3IGFjdGlvbiBiYXIsIGFuZCAod2hpbGUgYWN0aXZlKSB0aGUgc3RhdHVzIGJhci4gVGhlIGluZGljYXRvcnMnIHRvb2x0aXAgbGlzdHMgdGhlIHBsdWdpbnNcbiAqIHRoYXQgY3VycmVudGx5IGhvbGQgYSBsb2NrIG9uIHRoZSBub3RlLlxuICpcbiAqIFRoZSBsb2NrIGlzIHJlZmVyZW5jZS1jb3VudGVkIHBlciBjYWxsaW5nIHBsdWdpbjogZWFjaCBjYWxsIG11c3QgYmUgYmFsYW5jZWQgYnkgZXhhY3RseSBvbmVcbiAqIHJlbGVhc2UgKGVpdGhlciBkaXNwb3NpbmcgdGhlIHJldHVybmVkIHtAbGluayBEaXNwb3NhYmxlfSBcdTIwMTQgaWRlYWxseSB2aWEgYSBgdXNpbmdgIGRlY2xhcmF0aW9uIFx1MjAxNCBvclxuICogYSBtYXRjaGluZyB7QGxpbmsgdW5sb2NrUmVzb3VyY2VGb3JQYXRofSBjYWxsKS5cbiAqXG4gKiBAcGFyYW0gYXBwIC0gVGhlIE9ic2lkaWFuIGFwcCBpbnN0YW5jZS5cbiAqIEBwYXJhbSBwYXRoT3JGaWxlIC0gVGhlIHBhdGggb3IgZmlsZSBvZiB0aGUgbm90ZSB0byBsb2NrLlxuICogQHBhcmFtIHBsdWdpbklkIC0gVGhlIGlkIG9mIHRoZSBsb2NraW5nIHBsdWdpbiAoZS5nLiBpdHMgYG1hbmlmZXN0LmlkYCkuIFRoZSBsb2NrIGlzIGF0dHJpYnV0ZWQgdG9cbiAqIGl0IGZvciByZWZlcmVuY2UtY291bnRpbmcgYW5kIHRoZSBpbmRpY2F0b3JzJyBcImxvY2tlZCBieVwiIHRvb2x0aXAuXG4gKiBAcmV0dXJucyBBIHtAbGluayBEaXNwb3NhYmxlfSB0aGF0IHJlbGVhc2VzIHRoaXMgbG9jayB3aGVuIGRpc3Bvc2VkLiBEaXNwb3NpbmcgbW9yZSB0aGFuIG9uY2UgaXMgYSBuby1vcC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGxvY2tSZXNvdXJjZUZvclBhdGgoYXBwOiBBcHAsIHBhdGhPckZpbGU6IFBhdGhPckZpbGUsIHBsdWdpbklkOiBzdHJpbmcpOiBEaXNwb3NhYmxlIHtcbiAgcmV0dXJuIGdldE1hbmFnZXIoKS5sb2NrKGFwcCwgcGF0aE9yRmlsZSwgcGx1Z2luSWQpO1xufVxuXG4vKipcbiAqIFJlcXVlc3RzIGFuIHVubG9jayBvZiB0aGUgbm90ZSBhdCB0aGUgZ2l2ZW4gcGF0aCBieSBhYm9ydGluZyBldmVyeSB7QGxpbmsgQWJvcnRDb250cm9sbGVyfSB0aGF0IHdhc1xuICogYXNzb2NpYXRlZCB3aXRoIGEgbG9jayBvbiBpdCAodmlhIHtAbGluayBSZXNvdXJjZUxvY2tDb21wb25lbnQubG9ja0ZvclBhdGh9J3NcbiAqIHtAbGluayBSZXNvdXJjZUxvY2tDb21wb25lbnRMb2NrRm9yUGF0aE9wdGlvbnMuYWJvcnRDb250cm9sbGVyfSkuIFRoZSBvcGVyYXRpb25zIGhvbGRpbmcgdGhlIGxvY2tcbiAqIG9ic2VydmUgdGhlIGFib3J0IGFuZCByZWxlYXNlIHRoZWlyIG93biBsb2Nrcy4gQSBuby1vcCB3aGVuIG5vIGFib3J0YWJsZSBsb2NrIGlzIHJlZ2lzdGVyZWQgZm9yIHRoZVxuICogcGF0aC5cbiAqXG4gKiBUaGlzIGxldHMgYSBjb25zdW1pbmcgcGx1Z2luIHdpcmUgaXRzIG93biBcInVubG9jayBhY3RpdmUgbm90ZVwiIGNvbW1hbmQgd2l0aG91dCByZWFjaGluZyBpbnRvIHRoZVxuICogbG9jayBtYW5hZ2VyIGRpcmVjdGx5LlxuICpcbiAqIEBwYXJhbSBhcHAgLSBUaGUgT2JzaWRpYW4gYXBwIGluc3RhbmNlLlxuICogQHBhcmFtIHBhdGhPckZpbGUgLSBUaGUgcGF0aCBvciBmaWxlIG9mIHRoZSBub3RlIHRvIHJlcXVlc3QgYW4gdW5sb2NrIGZvci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlcXVlc3RSZXNvdXJjZVVubG9ja0ZvclBhdGgoYXBwOiBBcHAsIHBhdGhPckZpbGU6IFBhdGhPckZpbGUpOiB2b2lkIHtcbiAgZ2V0TWFuYWdlcigpLnJlcXVlc3RVbmxvY2soYXBwLCBwYXRoT3JGaWxlKTtcbn1cblxuLyoqXG4gKiBSZWxlYXNlcyBvbmUgbG9jayBwcmV2aW91c2x5IGFjcXVpcmVkIGZvciB0aGUgbm90ZSBhdCB0aGUgZ2l2ZW4gcGF0aCB2aWEge0BsaW5rIGxvY2tSZXNvdXJjZUZvclBhdGh9LlxuICpcbiAqIFdoZW4gdGhlIGxhc3QgbG9jayBpcyByZWxlYXNlZCB0aGUgbm90ZSBiZWNvbWVzIGZ1bGx5IGVkaXRhYmxlIGFnYWluIGFuZCBpdHMgbG9jayBpbmRpY2F0b3JzIGFyZVxuICogcmVtb3ZlZC4gQ2FsbGluZyB0aGlzIHdoZW4gdGhlIG5vdGUgaXMgbm90IGxvY2tlZCBpcyBhIG5vLW9wLlxuICpcbiAqIEBwYXJhbSBhcHAgLSBUaGUgT2JzaWRpYW4gYXBwIGluc3RhbmNlLlxuICogQHBhcmFtIHBhdGhPckZpbGUgLSBUaGUgcGF0aCBvciBmaWxlIG9mIHRoZSBub3RlIHRvIHVubG9jay5cbiAqIEBwYXJhbSBwbHVnaW5JZCAtIFRoZSBpZCBvZiB0aGUgcGx1Z2luIHRoYXQgaG9sZHMgdGhlIGxvY2sgKGUuZy4gaXRzIGBtYW5pZmVzdC5pZGApOyBvbmUgb2YgaXRzXG4gKiBsb2NrcyBvbiB0aGUgbm90ZSBpcyByZWxlYXNlZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVubG9ja1Jlc291cmNlRm9yUGF0aChhcHA6IEFwcCwgcGF0aE9yRmlsZTogUGF0aE9yRmlsZSwgcGx1Z2luSWQ6IHN0cmluZyk6IHZvaWQge1xuICBnZXRNYW5hZ2VyKCkudW5sb2NrKGFwcCwgcGF0aE9yRmlsZSwgcGx1Z2luSWQpO1xufVxuXG5mdW5jdGlvbiBnZXRNYW5hZ2VyKCk6IFJlc291cmNlTG9ja01hbmFnZXIge1xuICByZXR1cm4gZ2V0T2JzaWRpYW5EZXZVdGlsc1N0YXRlPFJlc291cmNlTG9ja01hbmFnZXI+KFJFU09VUkNFX0xPQ0tfU1RBVEVfS0VZLCBuZXcgUmVzb3VyY2VMb2NrTWFuYWdlcigpKS52YWx1ZTtcbn1cbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBcUNBLFNBQVMsZ0JBQWdCO0FBQ3pCO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsT0FDSztBQUlQLFNBQVMsMEJBQTBCO0FBQ25DO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBQ1AsU0FBUyxZQUFZO0FBQ3JCLFNBQVMsZ0NBQWdDO0FBQ3pDLFNBQVMseUJBQXlCO0FBQ2xDLFNBQVMsbUJBQW1CO0FBQzVCLFNBQVMsNkJBQTZCO0FBQ3RDLFNBQVMsNEJBQTRCO0FBQ3JDLFNBQVMsZUFBZTtBQUN4QixTQUFTLHVCQUF1QjtBQUNoQyxTQUFTLFNBQVM7QUFDbEIsU0FBUyxlQUFlO0FBQ3hCO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBRVAsTUFBTSx3QkFBd0I7QUFDOUIsTUFBTSxvQkFBb0I7QUFDMUIsTUFBTSxZQUFZO0FBQ2xCLE1BQU0sNkJB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
|
|
773
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vc3JjL29ic2lkaWFuL3Jlc291cmNlLWxvY2sudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBQYXRoLXNjb3BlZCByZXNvdXJjZSBsb2NraW5nIGZvciB2YXVsdCBmaWxlcyBhbmQgZm9sZGVycywgd2l0aCB0aHJlZSBlbmZvcmNlbWVudCBsYXllcnMgb3ZlciBvbmVcbiAqIHNoYXJlZCBsb2NrZWQtcGF0aCBzZXQ6XG4gKlxuICogMS4gKipFZGl0b3IgcmVhZC1vbmx5KiogXHUyMDE0IHdoaWxlIGEgcGF0aCBpcyBsb2NrZWQsIGV2ZXJ5IGN1cnJlbnQgYW5kIGZ1dHVyZSB7QGxpbmsgTWFya2Rvd25WaWV3fSBvZlxuICogICAgdGhhdCBub3RlIChpbiBhbnkgd2luZG93LCBpbmNsdWRpbmcgcG9wb3V0cykgaXMgbWFkZSByZWFkLW9ubHkgYW5kIHNob3dzIGEgbG9jayBpbmRpY2F0b3IgaW4gaXRzXG4gKiAgICB0YWIgaGVhZGVyLCBpdHMgdmlldyBhY3Rpb24gYmFyLCBhbmQgdGhlIHN0YXR1cyBiYXI7IGEgbm90ZSBpbnNpZGUgYSBgc3VidHJlZWAtbG9ja2VkIGZvbGRlciBpc1xuICogICAgY292ZXJlZCB0b28uIExvY2tzIGFyZSByZWZlcmVuY2UtY291bnRlZCBwZXIgbG9ja2luZyBwbHVnaW4gKHRoZSBpbmRpY2F0b3JzJyB0b29sdGlwIGxpc3RzIHdoaWNoXG4gKiAgICBwbHVnaW5zIGhvbGQgYSBsb2NrKSwgc28gbmVzdGVkL2NvbmN1cnJlbnQgb3BlcmF0aW9ucyBhcmUgc2FmZSBcdTIwMTQgdGhlIHBhdGggaXMgdW5sb2NrZWQgb25seSB3aGVuXG4gKiAgICB0aGUgbGFzdCBsb2NrIGlzIHJlbGVhc2VkLlxuICogMi4gKipWYXVsdC1tdXRhdGlvbiBibG9ja2luZyoqIChvcHQtaW4gdmlhIGBzaG91bGRCbG9ja011dGF0aW9uc2ApIFx1MjAxNCBhbnkgZWRpdC9kZWxldGUvcmVuYW1lL21vdmUvXG4gKiAgICBjcmVhdGUgb2YgYSBsb2NrZWQgcGF0aCB0aHJvdWdoIHRoZSBgVmF1bHRgL2BGaWxlTWFuYWdlcmAgQVBJIHRocm93cyB7QGxpbmsgUmVzb3VyY2VMb2NrZWRFcnJvcn0sXG4gKiAgICB1bmxlc3MgdGhlIG93bmluZyBvcGVyYXRpb24gaGFzIG9wZW5lZCBhIHtAbGluayBSZXNvdXJjZUxvY2tDb21wb25lbnQuYnlwYXNzQmxvY2tlZE11dGF0aW9uc30gc2NvcGVcbiAqICAgIG92ZXIgdGhhdCBwYXRoLlxuICogMy4gKipFeHRlcm5hbC1jaGFuZ2UgZGV0ZWN0aW9uKiogXHUyMDE0IGEgdmF1bHQvbWV0YWRhdGEgZXZlbnQgb24gYSBsb2NrZWQgcGF0aCB0aGF0IG5vIGJ5cGFzcyBzY29wZVxuICogICAgY292ZXJzIGlzIHRyZWF0ZWQgYXMgYW4gaW50cnVkZXIgKFN5bmMgLyByYXcgZmlsZXN5c3RlbSAvIGFub3RoZXIgcGx1Z2luKSBhbmQgYWJvcnRzIHRoZSBvd25pbmdcbiAqICAgIG9wZXJhdGlvbidzIHtAbGluayBBYm9ydENvbnRyb2xsZXJ9LlxuICpcbiAqIFRoZSBhY3F1aXJlcnMgcmV0dXJuIGEge0BsaW5rIERpc3Bvc2FibGV9LCBzbyB0aGUgcHJlZmVycmVkIGNhbGwgc3R5bGUgaXMgYSBgdXNpbmdgIGRlY2xhcmF0aW9uIHRoYXRcbiAqIHJlbGVhc2VzIGF1dG9tYXRpY2FsbHkgYXQgc2NvcGUgZXhpdCAoaW5jbHVkaW5nIG9uIHRocm93KTpcbiAqXG4gKiBgYGB0c1xuICogdXNpbmcgX2xvY2sgPSBsb2NrUmVzb3VyY2VGb3JQYXRoKGFwcCwgcGF0aCwgdGhpcy5tYW5pZmVzdC5pZCk7XG4gKiAvLyAuLi4gbG9uZy1ydW5uaW5nIHdvcmsgKHByb2Nlc3MsIHByb2Nlc3NGcm9udE1hdHRlciwgbWVyZ2Uvc3BsaXQpIC4uLlxuICogLy8gYXV0by11bmxvY2tlZCBhdCBzY29wZSBleGl0XG4gKiBgYGBcbiAqXG4gKiBUaGUgZXhwbGljaXQge0BsaW5rIHVubG9ja1Jlc291cmNlRm9yUGF0aH0gcGFpciByZW1haW5zIGF2YWlsYWJsZSBmb3Igbm9uLWB1c2luZ2AgY2FsbCBzaXRlcy5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7XG4gIEFwcCxcbiAgVEFic3RyYWN0RmlsZVxufSBmcm9tICdvYnNpZGlhbic7XG5cbmltcG9ydCB7IFZpZXdUeXBlIH0gZnJvbSAnQG9ic2lkaWFuLXR5cGluZ3Mvb2JzaWRpYW4tcHVibGljLWxhdGVzdC9pbXBsZW1lbnRhdGlvbnMnO1xuaW1wb3J0IHtcbiAgRmlsZU1hbmFnZXIsXG4gIE1hcmtkb3duVmlldyxcbiAgTWVudSxcbiAgc2V0SWNvbixcbiAgc2V0VG9vbHRpcCxcbiAgVmF1bHRcbn0gZnJvbSAnb2JzaWRpYW4nO1xuXG5pbXBvcnQgdHlwZSB7IFBhdGhPckZpbGUgfSBmcm9tICcuL2ZpbGUtc3lzdGVtLnRzJztcblxuaW1wb3J0IHsgY29udmVydEFzeW5jVG9TeW5jIH0gZnJvbSAnLi4vYXN5bmMudHMnO1xuaW1wb3J0IHsgQmVlcGVyIH0gZnJvbSAnLi4vYmVlcGVyLnRzJztcbmltcG9ydCB7XG4gIENhbGxiYWNrRGlzcG9zYWJsZSxcbiAgTXVsdGlwbGVEaXNwb3NlQmVoYXZpb3Jcbn0gZnJvbSAnLi4vZGlzcG9zYWJsZS50cyc7XG5pbXBvcnQgeyBub29wIH0gZnJvbSAnLi4vZnVuY3Rpb24udHMnO1xuaW1wb3J0IHsgZ2V0T2JzaWRpYW5EZXZVdGlsc1N0YXRlIH0gZnJvbSAnLi4vb2JzaWRpYW4tZGV2LXV0aWxzLXN0YXRlLnRzJztcbmltcG9ydCB7IGFzc2VydE5vbk51bGxhYmxlIH0gZnJvbSAnLi4vdHlwZS1ndWFyZHMudHMnO1xuaW1wb3J0IHsgQ29tcG9uZW50RXggfSBmcm9tICcuL2NvbXBvbmVudHMvY29tcG9uZW50LWV4LnRzJztcbmltcG9ydCB7IE1vbmtleUFyb3VuZENvbXBvbmVudCB9IGZyb20gJy4vY29tcG9uZW50cy9tb25rZXktYXJvdW5kLWNvbXBvbmVudC50cyc7XG5pbXBvcnQgeyB0b2dnbGVFZGl0b3JSZWFkT25seSB9IGZyb20gJy4vZWRpdG9yLnRzJztcbmltcG9ydCB7IGdldFBhdGggfSBmcm9tICcuL2ZpbGUtc3lzdGVtLnRzJztcbmltcG9ydCB7IGFwcGVuZENvZGVCbG9jayB9IGZyb20gJy4vaHRtbC1lbGVtZW50LnRzJztcbmltcG9ydCB7IHQgfSBmcm9tICcuL2kxOG4vaTE4bi50cyc7XG5pbXBvcnQgeyBjb25maXJtIH0gZnJvbSAnLi9tb2RhbHMvY29uZmlybS50cyc7XG5pbXBvcnQge1xuICBpc0NoaWxkLFxuICBpc0NoaWxkT3JTZWxmXG59IGZyb20gJy4vdmF1bHQudHMnO1xuXG5jb25zdCBSRVNPVVJDRV9MT0NLX1NUQVRFX0tFWSA9ICdyZXNvdXJjZUxvY2snO1xuY29uc3QgTE9DS19JQ09OX0lEID0gJ2xvY2snO1xuY29uc3QgTE9DS19JTkRJQ0FUT1JfQ1NTX0NMQVNTID0gJ29ic2lkaWFuLWRldi11dGlscy1sb2NrLWluZGljYXRvcic7XG5jb25zdCBMT0NLX0lORElDQVRPUl9GTEFTSF9DU1NfQ0xBU1MgPSAnb2JzaWRpYW4tZGV2LXV0aWxzLWxvY2staW5kaWNhdG9yLWZsYXNoJztcbmNvbnN0IFNUQVRVU19CQVJfSVRFTV9DU1NfQ0xBU1MgPSAnc3RhdHVzLWJhci1pdGVtJztcbmNvbnN0IFNUQVRVU19CQVJfQ1NTX1NFTEVDVE9SID0gJy5zdGF0dXMtYmFyJztcbmNvbnN0IFVOTE9DS19JQ09OX0lEID0gJ3VubG9jayc7XG5cbi8qKlxuICogT3B0aW9ucyBmb3Ige0BsaW5rIFJlc291cmNlTG9ja0NvbXBvbmVudC5sb2NrRm9yUGF0aH0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmVzb3VyY2VMb2NrQ29tcG9uZW50TG9ja0ZvclBhdGhPcHRpb25zIHtcbiAgLyoqXG4gICAqIEFuIG9wdGlvbmFsIHtAbGluayBBYm9ydENvbnRyb2xsZXJ9IGFzc29jaWF0ZWQgd2l0aCB0aGUgbG9jay4gV2hlbiB0aGUgbG9jayBpbmRpY2F0b3IgaXNcbiAgICogcmlnaHQtY2xpY2tlZCBhbmQgdGhlIHVzZXIgY29uZmlybXMgYW4gdW5sb2NrIChvciB7QGxpbmsgcmVxdWVzdFJlc291cmNlVW5sb2NrRm9yUGF0aH0gaXMgY2FsbGVkIGZvclxuICAgKiB0aGUgcGF0aCksIHRoaXMgY29udHJvbGxlciBpcyBhYm9ydGVkIHNvIHRoZSBvcGVyYXRpb24gaG9sZGluZyB0aGUgbG9jayBjYW4gY2FuY2VsIGl0c2VsZiBhbmRcbiAgICogcmVsZWFzZSB0aGUgbG9jayBpbiBpdHMgb3duIGNsZWFudXAuXG4gICAqL1xuICByZWFkb25seSBhYm9ydENvbnRyb2xsZXI/OiBBYm9ydENvbnRyb2xsZXI7XG5cbiAgLyoqXG4gICAqIFRoZSBsb2NrIHNjb3BlLiBgJ3N1YnRyZWUnYCBhbHNvIGxvY2tzIGV2ZXJ5IGRlc2NlbmRhbnQgb2YgYSBmb2xkZXIgcGF0aDsgYCdmaWxlJ2AgbG9ja3Mgb25seSB0aGVcbiAgICogZXhhY3QgcGF0aC4gQSBgc3VidHJlZWAgbG9jayBtdXN0IGJlIHJlbGVhc2VkIHZpYSB0aGUgcmV0dXJuZWQge0BsaW5rIERpc3Bvc2FibGV9IChub3QgdGhlXG4gICAqIGV4cGxpY2l0IHtAbGluayBSZXNvdXJjZUxvY2tDb21wb25lbnQudW5sb2NrRm9yUGF0aH0pLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgJ2ZpbGUnYFxuICAgKi9cbiAgcmVhZG9ubHkgbW9kZT86IFJlc291cmNlTG9ja01vZGU7XG5cbiAgLyoqXG4gICAqIFdoZW4gYHRydWVgLCB0aGUgbG9jayBhbHNvICoqYmxvY2tzIHZhdWx0IG11dGF0aW9ucyoqIG9mIHRoZSBjb3ZlcmVkIHBhdGgocyk6IGFueSBhdHRlbXB0IHRvIGVkaXQsXG4gICAqIGRlbGV0ZSwgcmVuYW1lLCBtb3ZlLCBvciAocmUpY3JlYXRlIHRoZSByZXNvdXJjZSB0aHJvdWdoIHRoZSBgVmF1bHRgL2BGaWxlTWFuYWdlcmAgQVBJIHRocm93cyBhXG4gICAqIHtAbGluayBSZXNvdXJjZUxvY2tlZEVycm9yfS4gSW5zdGFsbGVkIGxhemlseSBvbiB0aGUgZmlyc3Qgc3VjaCBsb2NrIGFuZCByZW1vdmVkIHdoZW4gdGhlIGxhc3Qgb25lXG4gICAqIGlzIHJlbGVhc2VkLiBXaGVuIGBmYWxzZWAgKHRoZSBkZWZhdWx0KSB0aGUgbG9jayBvbmx5IG1ha2VzIHRoZSBlZGl0b3IgcmVhZC1vbmx5IFx1MjAxNCBsZWdhY3kgYmVoYXZpb3IsXG4gICAqIHNvIGV4aXN0aW5nIGNvbnN1bWVycyB0aGF0IHdyaXRlIHRvIGEgbm90ZSB0aGV5IGhvbGQgYW4gZWRpdG9yIGxvY2sgb24gYXJlIHVuYWZmZWN0ZWQuXG4gICAqXG4gICAqIEBkZWZhdWx0IGBmYWxzZWBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZEJsb2NrTXV0YXRpb25zPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBUaGUgc2NvcGUgb2YgYSBsb2NrLlxuICpcbiAqIC0gYCdmaWxlJ2AgbG9ja3Mgb25seSB0aGUgZXhhY3QgcGF0aC5cbiAqIC0gYCdzdWJ0cmVlJ2AgbG9ja3MgdGhlIHBhdGggYW5kIGV2ZXJ5IGRlc2NlbmRhbnQgdW5kZXIgaXQgKGl0cyB3aG9sZSBmb2xkZXIgc3VidHJlZSksIHNvIGEgZmlsZVxuICogICBpbnNpZGUgYSBgc3VidHJlZWAtbG9ja2VkIGZvbGRlciBpcyB0cmVhdGVkIGFzIGxvY2tlZCB0b28uXG4gKi9cbmV4cG9ydCB0eXBlIFJlc291cmNlTG9ja01vZGUgPSAnZmlsZScgfCAnc3VidHJlZSc7XG5cbmludGVyZmFjZSBMb2NrRW50cnkge1xuICByZWFkb25seSBhYm9ydENvbnRyb2xsZXI6IEFib3J0Q29udHJvbGxlciB8IG51bGw7XG4gIHJlYWRvbmx5IGJsb2Nrc011dGF0aW9uczogYm9vbGVhbjtcbiAgcmVhZG9ubHkgbW9kZTogUmVzb3VyY2VMb2NrTW9kZTtcbiAgcmVhZG9ubHkgcGx1Z2luSWQ6IHN0cmluZztcbn1cblxuaW50ZXJmYWNlIExvY2tJbmRpY2F0b3JzIHtcbiAgcmVhZG9ubHkgYWN0aW9uSWNvbkVsOiBIVE1MRWxlbWVudDtcbiAgZGlzcG9zZVR5cGVMaXN0ZW5lcigpOiB2b2lkO1xuICByZWFkb25seSB0YWJJY29uRWw6IEhUTUxFbGVtZW50IHwgbnVsbDtcbn1cblxuaW50ZXJmYWNlIE1hbmFnZXJMb2NrT3B0aW9ucyB7XG4gIHJlYWRvbmx5IGFib3J0Q29udHJvbGxlcj86IEFib3J0Q29udHJvbGxlciB8IHVuZGVmaW5lZDtcbiAgcmVhZG9ubHkgYmxvY2tzTXV0YXRpb25zPzogYm9vbGVhbiB8IHVuZGVmaW5lZDtcbiAgcmVhZG9ubHkgbW9kZT86IFJlc291cmNlTG9ja01vZGUgfCB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogQ29uc3RydWN0b3IgcGFyYW1ldGVycyBmb3Ige0BsaW5rIFJlc291cmNlTG9ja0V2ZW50c0NvbXBvbmVudH0uXG4gKi9cbmludGVyZmFjZSBSZXNvdXJjZUxvY2tFdmVudHNDb21wb25lbnRDb25zdHJ1Y3RvclBhcmFtcyB7XG4gIHJlYWRvbmx5IGFwcDogQXBwO1xuICBvbkNoYW5nZSh0aGlzOiB2b2lkKTogdm9pZDtcbiAgb25FeHRlcm5hbE11dGF0aW9uKHRoaXM6IHZvaWQsIHBhdGg6IHN0cmluZyk6IHZvaWQ7XG4gIG9uRmlsZU1lbnUodGhpczogdm9pZCwgbWVudTogTWVudSwgZmlsZTogVEFic3RyYWN0RmlsZSk6IHZvaWQ7XG59XG5cbmludGVyZmFjZSBSZXNvdXJjZUxvY2tNdXRhdGlvbkJsb2NrZXJDb21wb25lbnRDb25zdHJ1Y3RvclBhcmFtcyB7XG4gIHNob3VsZEJsb2NrTXV0YXRpb24odGhpczogdm9pZCwgcGF0aDogc3RyaW5nKTogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBTdWJzY3JpYmVzIHRvIHRoZSB3b3Jrc3BhY2UgZXZlbnRzIHRoYXQgc2hvdWxkIHRyaWdnZXIgYSBsb2NrIHJlY29uY2lsZSAoYW5kIHRoZSBmaWxlIGNvbnRleHQtbWVudVxuICogZXZlbnQgdGhhdCBvZmZlcnMgYW4gXCJVbmxvY2tcIiBpdGVtKS4gSW1wbGVtZW50ZWQgYXMgYSB7QGxpbmsgQ29tcG9uZW50RXh9IHNvIHRoZSBzdWJzY3JpcHRpb25zIGFyZVxuICogcmVnaXN0ZXJlZCBvbiBgbG9hZCgpYCBhbmQgYXV0b21hdGljYWxseSByZW1vdmVkIG9uIGB1bmxvYWQoKWAsIGluc3RlYWQgb2YgYmVpbmcgdHJhY2tlZCBieSBoYW5kLlxuICovXG5jbGFzcyBSZXNvdXJjZUxvY2tFdmVudHNDb21wb25lbnQgZXh0ZW5kcyBDb21wb25lbnRFeCB7XG4gIHByaXZhdGUgcmVhZG9ubHkgYXBwOiBBcHA7XG4gIHByaXZhdGUgcmVhZG9ubHkgb25DaGFuZ2U6ICgpID0+IHZvaWQ7XG4gIHByaXZhdGUgcmVhZG9ubHkgb25FeHRlcm5hbE11dGF0aW9uOiAocGF0aDogc3RyaW5nKSA9PiB2b2lkO1xuICBwcml2YXRlIHJlYWRvbmx5IG9uRmlsZU1lbnU6IChtZW51OiBNZW51LCBmaWxlOiBUQWJzdHJhY3RGaWxlKSA9PiB2b2lkO1xuXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihwYXJhbXM6IFJlc291cmNlTG9ja0V2ZW50c0NvbXBvbmVudENvbnN0cnVjdG9yUGFyYW1zKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLmFwcCA9IHBhcmFtcy5hcHA7XG4gICAgdGhpcy5vbkNoYW5nZSA9IHBhcmFtcy5vbkNoYW5nZTtcbiAgICB0aGlzLm9uRXh0ZXJuYWxNdXRhdGlvbiA9IHBhcmFtcy5vbkV4dGVybmFsTXV0YXRpb247XG4gICAgdGhpcy5vbkZpbGVNZW51ID0gcGFyYW1zLm9uRmlsZU1lbnU7XG4gIH1cblxuICBwdWJsaWMgb3ZlcnJpZGUgb25sb2FkKCk6IHZvaWQge1xuICAgIHN1cGVyLm9ubG9hZCgpO1xuICAgIHRoaXMucmVnaXN0ZXJFdmVudCh0aGlzLmFwcC53b3Jrc3BhY2Uub24oJ2FjdGl2ZS1sZWFmLWNoYW5nZScsIHRoaXMub25DaGFuZ2UpKTtcbiAgICB0aGlzLnJlZ2lzdGVyRXZlbnQodGhpcy5hcHAud29ya3NwYWNlLm9uKCdsYXlvdXQtY2hhbmdlJywgdGhpcy5vbkNoYW5nZSkpO1xuICAgIC8vIFNhbWUtbGVhZiBuYXZpZ2F0aW9uIHRvIGFub3RoZXIgbm90ZSBmaXJlcyBubyBsZWFmL2xheW91dCBjaGFuZ2U7IHdpdGhvdXQgdGhpcyBpdCBzdGF5cyByZWFkLW9ubHkuXG4gICAgdGhpcy5yZWdpc3RlckV2ZW50KHRoaXMuYXBwLndvcmtzcGFjZS5vbignZmlsZS1vcGVuJywgdGhpcy5vbkNoYW5nZSkpO1xuICAgIC8vIEFkZHMgYW4gXCJVbmxvY2tcIiBpdGVtIHRvIGEgbG9ja2VkIG5vdGUncyB0YWIvZmlsZSBjb250ZXh0IG1lbnUgKGFsb25nc2lkZSB0aGUgaW5kaWNhdG9yIG1lbnVzKS5cbiAgICB0aGlzLnJlZ2lzdGVyRXZlbnQodGhpcy5hcHAud29ya3NwYWNlLm9uKCdmaWxlLW1lbnUnLCB0aGlzLm9uRmlsZU1lbnUpKTtcbiAgICAvLyBFeHRlcm5hbC1jaGFuZ2UgYmFja3N0b3A6IGEgdmF1bHQvbWV0YWRhdGEgZXZlbnQgb24gYSBtdXRhdGlvbi1ibG9ja2VkIHBhdGggbm90IGNvdmVyZWQgYnkgYW4gYWN0aXZlIGJ5cGFzcyBzY29wZSBpcyBhbiBpbnRydWRlciAoYSBzeW5jL0ZTL2FkYXB0ZXIgY2hhbmdlIHRoYXQgYnlwYXNzZWQgdGhlIGJsb2NrZXIgcGF0Y2gpLlxuICAgIHRoaXMucmVnaXN0ZXJFdmVudCh0aGlzLmFwcC52YXVsdC5vbignY3JlYXRlJywgKGZpbGUpOiB2b2lkID0+IHtcbiAgICAgIHRoaXMub25FeHRlcm5hbE11dGF0aW9uKGZpbGUucGF0aCk7XG4gICAgfSkpO1xuICAgIHRoaXMucmVnaXN0ZXJFdmVudCh0aGlzLmFwcC52YXVsdC5vbignZGVsZXRlJywgKGZpbGUpOiB2b2lkID0+IHtcbiAgICAgIHRoaXMub25FeHRlcm5hbE11dGF0aW9uKGZpbGUucGF0aCk7XG4gICAgfSkpO1xuICAgIHRoaXMucmVnaXN0ZXJFdmVudCh0aGlzLmFwcC52YXVsdC5vbigncmVuYW1lJywgKGZpbGUsIG9sZFBhdGgpOiB2b2lkID0+IHtcbiAgICAgIHRoaXMub25FeHRlcm5hbE11dGF0aW9uKG9sZFBhdGgpO1xuICAgICAgdGhpcy5vbkV4dGVybmFsTXV0YXRpb24oZmlsZS5wYXRoKTtcbiAgICB9KSk7XG4gICAgdGhpcy5yZWdpc3RlckV2ZW50KHRoaXMuYXBwLm1ldGFkYXRhQ2FjaGUub24oJ2RlbGV0ZWQnLCAoZmlsZSk6IHZvaWQgPT4ge1xuICAgICAgdGhpcy5vbkV4dGVybmFsTXV0YXRpb24oZmlsZS5wYXRoKTtcbiAgICB9KSk7XG4gIH1cbn1cblxuLyoqXG4gKiBNb25rZXktcGF0Y2hlcyB0aGUgdmF1bHQtbXV0YXRpb24gY2hva2UgcG9pbnRzIG9uIGBWYXVsdGAvYEZpbGVNYW5hZ2VyYCBzbyB0aGF0IGFueSBlZGl0LCBkZWxldGUsXG4gKiByZW5hbWUsIG1vdmUsIG9yIChyZSljcmVhdGUgb2YgYSBtdXRhdGlvbi1ibG9ja2VkIHBhdGggdGhyb3dzIGEge0BsaW5rIFJlc291cmNlTG9ja2VkRXJyb3J9LlxuICogSW5zdGFsbGVkIGxhemlseSBieSB7QGxpbmsgUmVzb3VyY2VMb2NrTWFuYWdlcn0gb24gdGhlIGZpcnN0IGBzaG91bGRCbG9ja011dGF0aW9uc2AgbG9jayBhbmQgcmVtb3ZlZFxuICogd2hlbiB0aGUgbGFzdCBvbmUgaXMgcmVsZWFzZWQ7IGJlaW5nIGEge0BsaW5rIE1vbmtleUFyb3VuZENvbXBvbmVudH0sIGV2ZXJ5IHBhdGNoIGlzIHRvcm4gZG93biBvblxuICogYHVubG9hZGAuIFJlbmFtZS9jb3B5IGNoZWNrIGJvdGggc291cmNlIGFuZCBkZXN0aW5hdGlvbjsgdGhlIG90aGVyIG1ldGhvZHMgY2hlY2sgdGhlaXIgc2luZ2xlIHBhdGguXG4gKi9cbmNsYXNzIFJlc291cmNlTG9ja011dGF0aW9uQmxvY2tlckNvbXBvbmVudCBleHRlbmRzIE1vbmtleUFyb3VuZENvbXBvbmVudCB7XG4gIHByaXZhdGUgcmVhZG9ubHkgc2hvdWxkQmxvY2tNdXRhdGlvbjogKHBhdGg6IHN0cmluZykgPT4gYm9vbGVhbjtcblxuICBwdWJsaWMgY29uc3RydWN0b3IocGFyYW1zOiBSZXNvdXJjZUxvY2tNdXRhdGlvbkJsb2NrZXJDb21wb25lbnRDb25zdHJ1Y3RvclBhcmFtcykge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5zaG91bGRCbG9ja011dGF0aW9uID0gcGFyYW1zLnNob3VsZEJsb2NrTXV0YXRpb247XG4gIH1cblxuICBwdWJsaWMgb3ZlcnJpZGUgb25sb2FkKCk6IHZvaWQge1xuICAgIHN1cGVyLm9ubG9hZCgpO1xuXG4gICAgdGhpcy5yZWdpc3Rlck1ldGhvZFBhdGNoPFZhdWx0LCAnYXBwZW5kJz4oe1xuICAgICAgbWV0aG9kTmFtZTogJ2FwcGVuZCcsXG4gICAgICBvYmo6IFZhdWx0LnByb3RvdHlwZSxcbiAgICAgIHBhdGNoSGFuZGxlcjogKHsgZmFsbGJhY2ssIG9yaWdpbmFsQXJnczogW2ZpbGVdIH0pID0+IHtcbiAgICAgICAgdGhpcy5hc3NlcnROb3RCbG9ja2VkKFtmaWxlLnBhdGhdKTtcbiAgICAgICAgcmV0dXJuIGZhbGxiYWNrKCk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgdGhpcy5yZWdpc3Rlck1ldGhvZFBhdGNoPFZhdWx0LCAnY29weSc+KHtcbiAgICAgIG1ldGhvZE5hbWU6ICdjb3B5JyxcbiAgICAgIG9iajogVmF1bHQucHJvdG90eXBlLFxuICAgICAgcGF0Y2hIYW5kbGVyOiAoeyBmYWxsYmFjaywgb3JpZ2luYWxBcmdzOiBbLCBuZXdQYXRoXSB9KSA9PiB7XG4gICAgICAgIHRoaXMuYXNzZXJ0Tm90QmxvY2tlZChbbmV3UGF0aF0pO1xuICAgICAgICByZXR1cm4gZmFsbGJhY2soKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICB0aGlzLnJlZ2lzdGVyTWV0aG9kUGF0Y2g8VmF1bHQsICdjcmVhdGUnPih7XG4gICAgICBtZXRob2ROYW1lOiAnY3JlYXRlJyxcbiAgICAgIG9iajogVmF1bHQucHJvdG90eXBlLFxuICAgICAgcGF0Y2hIYW5kbGVyOiAoeyBmYWxsYmFjaywgb3JpZ2luYWxBcmdzOiBbcGF0aF0gfSkgPT4ge1xuICAgICAgICB0aGlzLmFzc2VydE5vdEJsb2NrZWQoW3BhdGhdKTtcbiAgICAgICAgcmV0dXJuIGZhbGxiYWNrKCk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgdGhpcy5yZWdpc3Rlck1ldGhvZFBhdGNoPFZhdWx0LCAnY3JlYXRlQmluYXJ5Jz4oe1xuICAgICAgbWV0aG9kTmFtZTogJ2NyZWF0ZUJpbmFyeScsXG4gICAgICBvYmo6IFZhdWx0LnByb3RvdHlwZSxcbiAgICAgIHBhdGNoSGFuZGxlcjogKHsgZmFsbGJhY2ssIG9yaWdpbmFsQXJnczogW3BhdGhdIH0pID0+IHtcbiAgICAgICAgdGhpcy5hc3NlcnROb3RCbG9ja2VkKFtwYXRoXSk7XG4gICAgICAgIHJldHVybiBmYWxsYmFjaygpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHRoaXMucmVnaXN0ZXJNZXRob2RQYXRjaDxWYXVsdCwgJ2NyZWF0ZUZvbGRlcic+KHtcbiAgICAgIG1ldGhvZE5hbWU6ICdjcmVhdGVGb2xkZXInLFxuICAgICAgb2JqOiBWYXVsdC5wcm90b3R5cGUsXG4gICAgICBwYXRjaEhhbmRsZXI6ICh7IGZhbGxiYWNrLCBvcmlnaW5hbEFyZ3M6IFtwYXRoXSB9KSA9PiB7XG4gICAgICAgIHRoaXMuYXNzZXJ0Tm90QmxvY2tlZChbcGF0aF0pO1xuICAgICAgICByZXR1cm4gZmFsbGJhY2soKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICB0aGlzLnJlZ2lzdGVyTWV0aG9kUGF0Y2g8VmF1bHQsICdkZWxldGUnPih7XG4gICAgICBtZXRob2ROYW1lOiAnZGVsZXRlJyxcbiAgICAgIG9iajogVmF1bHQucHJvdG90eXBlLFxuICAgICAgcGF0Y2hIYW5kbGVyOiAoeyBmYWxsYmFjaywgb3JpZ2luYWxBcmdzOiBbZmlsZV0gfSkgPT4ge1xuICAgICAgICB0aGlzLmFzc2VydE5vdEJsb2NrZWQoW2ZpbGUucGF0aF0pO1xuICAgICAgICByZXR1cm4gZmFsbGJhY2soKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICB0aGlzLnJlZ2lzdGVyTWV0aG9kUGF0Y2g8VmF1bHQsICdtb2RpZnknPih7XG4gICAgICBtZXRob2ROYW1lOiAnbW9kaWZ5JyxcbiAgICAgIG9iajogVmF1bHQucHJvdG90eXBlLFxuICAgICAgcGF0Y2hIYW5kbGVyOiAoeyBmYWxsYmFjaywgb3JpZ2luYWxBcmdzOiBbZmlsZV0gfSkgPT4ge1xuICAgICAgICB0aGlzLmFzc2VydE5vdEJsb2NrZWQoW2ZpbGUucGF0aF0pO1xuICAgICAgICByZXR1cm4gZmFsbGJhY2soKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICB0aGlzLnJlZ2lzdGVyTWV0aG9kUGF0Y2g8VmF1bHQsICdtb2RpZnlCaW5hcnknPih7XG4gICAgICBtZXRob2ROYW1lOiAnbW9kaWZ5QmluYXJ5JyxcbiAgICAgIG9iajogVmF1bHQucHJvdG90eXBlLFxuICAgICAgcGF0Y2hIYW5kbGVyOiAoeyBmYWxsYmFjaywgb3JpZ2luYWxBcmdzOiBbZmlsZV0gfSkgPT4ge1xuICAgICAgICB0aGlzLmFzc2VydE5vdEJsb2NrZWQoW2ZpbGUucGF0aF0pO1xuICAgICAgICByZXR1cm4gZmFsbGJhY2soKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICB0aGlzLnJlZ2lzdGVyTWV0aG9kUGF0Y2g8VmF1bHQsICdwcm9jZXNzJz4oe1xuICAgICAgbWV0aG9kTmFtZTogJ3Byb2Nlc3MnLFxuICAgICAgb2JqOiBWYXVsdC5wcm90b3R5cGUsXG4gICAgICBwYXRjaEhhbmRsZXI6ICh7IGZhbGxiYWNrLCBvcmlnaW5hbEFyZ3M6IFtmaWxlXSB9KSA9PiB7XG4gICAgICAgIHRoaXMuYXNzZXJ0Tm90QmxvY2tlZChbZmlsZS5wYXRoXSk7XG4gICAgICAgIHJldHVybiBmYWxsYmFjaygpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHRoaXMucmVnaXN0ZXJNZXRob2RQYXRjaDxWYXVsdCwgJ3JlbmFtZSc+KHtcbiAgICAgIG1ldGhvZE5hbWU6ICdyZW5hbWUnLFxuICAgICAgb2JqOiBWYXVsdC5wcm90b3R5cGUsXG4gICAgICBwYXRjaEhhbmRsZXI6ICh7IGZhbGxiYWNrLCBvcmlnaW5hbEFyZ3M6IFtmaWxlLCBuZXdQYXRoXSB9KSA9PiB7XG4gICAgICAgIHRoaXMuYXNzZXJ0Tm90QmxvY2tlZChbZmlsZS5wYXRoLCBuZXdQYXRoXSk7XG4gICAgICAgIHJldHVybiBmYWxsYmFjaygpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHRoaXMucmVnaXN0ZXJNZXRob2RQYXRjaDxWYXVsdCwgJ3RyYXNoJz4oe1xuICAgICAgbWV0aG9kTmFtZTogJ3RyYXNoJyxcbiAgICAgIG9iajogVmF1bHQucHJvdG90eXBlLFxuICAgICAgcGF0Y2hIYW5kbGVyOiAoeyBmYWxsYmFjaywgb3JpZ2luYWxBcmdzOiBbZmlsZV0gfSkgPT4ge1xuICAgICAgICB0aGlzLmFzc2VydE5vdEJsb2NrZWQoW2ZpbGUucGF0aF0pO1xuICAgICAgICByZXR1cm4gZmFsbGJhY2soKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICB0aGlzLnJlZ2lzdGVyTWV0aG9kUGF0Y2g8RmlsZU1hbmFnZXIsICdyZW5hbWVGaWxlJz4oe1xuICAgICAgbWV0aG9kTmFtZTogJ3JlbmFtZUZpbGUnLFxuICAgICAgb2JqOiBGaWxlTWFuYWdlci5wcm90b3R5cGUsXG4gICAgICBwYXRjaEhhbmRsZXI6ICh7IGZhbGxiYWNrLCBvcmlnaW5hbEFyZ3M6IFtmaWxlLCBuZXdQYXRoXSB9KSA9PiB7XG4gICAgICAgIHRoaXMuYXNzZXJ0Tm90QmxvY2tlZChbZmlsZS5wYXRoLCBuZXdQYXRoXSk7XG4gICAgICAgIHJldHVybiBmYWxsYmFjaygpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHRoaXMucmVnaXN0ZXJNZXRob2RQYXRjaDxGaWxlTWFuYWdlciwgJ3RyYXNoRmlsZSc+KHtcbiAgICAgIG1ldGhvZE5hbWU6ICd0cmFzaEZpbGUnLFxuICAgICAgb2JqOiBGaWxlTWFuYWdlci5wcm90b3R5cGUsXG4gICAgICBwYXRjaEhhbmRsZXI6ICh7IGZhbGxiYWNrLCBvcmlnaW5hbEFyZ3M6IFtmaWxlXSB9KSA9PiB7XG4gICAgICAgIHRoaXMuYXNzZXJ0Tm90QmxvY2tlZChbZmlsZS5wYXRoXSk7XG4gICAgICAgIHJldHVybiBmYWxsYmFjaygpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3NlcnROb3RCbG9ja2VkKHBhdGhzOiBzdHJpbmdbXSk6IHZvaWQge1xuICAgIGZvciAoY29uc3QgcGF0aCBvZiBwYXRocykge1xuICAgICAgaWYgKHRoaXMuc2hvdWxkQmxvY2tNdXRhdGlvbihwYXRoKSkge1xuICAgICAgICB0aHJvdyBuZXcgUmVzb3VyY2VMb2NrZWRFcnJvcihwYXRoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBUcmFja3MgcGF0aC1zY29wZWQgZWRpdG9yIGxvY2tzIGFuZCBrZWVwcyBldmVyeSBvcGVuIHtAbGluayBNYXJrZG93blZpZXd9IGluIHN5bmMgd2l0aCB0aGUgbG9ja2VkXG4gKiBzZXQuIEEgc2luZ2xlIGluc3RhbmNlIGxpdmVzIG9uIHRoZSBzaGFyZWQgYG9ic2lkaWFuLWRldi11dGlsc2Agc3RhdGUuIEVhY2ggbG9jayBpcyBvbmVcbiAqIHtAbGluayBMb2NrRW50cnl9IGluIGEgcGVyLXBhdGggbGlzdCwgc28gYSBwYXRoIGNhbiBiZSBoZWxkIGJ5IHNldmVyYWwgcGx1Z2lucyAob3Igc2V2ZXJhbCB0aW1lcyBieVxuICogb25lKSBjb25jdXJyZW50bHkgYW5kIGlzIHJlbGVhc2VkIG9ubHkgd2hlbiBpdHMgbGFzdCBlbnRyeSBpcyByZW1vdmVkOyB0aGUgaW5kaWNhdG9ycyByZXBvcnQgd2hpY2hcbiAqIHBsdWdpbnMgY3VycmVudGx5IGhvbGQgYSBsb2NrLlxuICovXG5jbGFzcyBSZXNvdXJjZUxvY2tNYW5hZ2VyIHtcbiAgcHJpdmF0ZSByZWFkb25seSBiZWVwZXIgPSBuZXcgQmVlcGVyKCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgYnlwYXNzUGF0aFNldHMgPSBuZXcgU2V0PFJlYWRvbmx5U2V0PHN0cmluZz4+KCk7XG4gIHByaXZhdGUgZXZlbnRzQ29tcG9uZW50OiBudWxsIHwgUmVzb3VyY2VMb2NrRXZlbnRzQ29tcG9uZW50ID0gbnVsbDtcbiAgcHJpdmF0ZSByZWFkb25seSBpbmRpY2F0b3JzQnlWaWV3ID0gbmV3IE1hcDxNYXJrZG93blZpZXcsIExvY2tJbmRpY2F0b3JzPigpO1xuICBwcml2YXRlIHJlYWRvbmx5IGxvY2tFbnRyaWVzQnlQYXRoID0gbmV3IE1hcDxzdHJpbmcsIExvY2tFbnRyeVtdPigpO1xuICBwcml2YXRlIG11dGF0aW9uQmxvY2tlckNvbXBvbmVudDogbnVsbCB8IFJlc291cmNlTG9ja011dGF0aW9uQmxvY2tlckNvbXBvbmVudCA9IG51bGw7XG4gIHByaXZhdGUgc3RhdHVzQmFySXRlbUVsOiBIVE1MRWxlbWVudCB8IG51bGwgPSBudWxsO1xuXG4gIHB1YmxpYyBieXBhc3MoYXBwOiBBcHAsIHBhdGhzT3JGaWxlczogcmVhZG9ubHkgUGF0aE9yRmlsZVtdKTogRGlzcG9zYWJsZSB7XG4gICAgY29uc3QgYnlwYXNzZWRQYXRoczogUmVhZG9ubHlTZXQ8c3RyaW5nPiA9IG5ldyBTZXQocGF0aHNPckZpbGVzLm1hcCgocGF0aE9yRmlsZSkgPT4gZ2V0UGF0aChhcHAsIHBhdGhPckZpbGUpKSk7XG4gICAgdGhpcy5ieXBhc3NQYXRoU2V0cy5hZGQoYnlwYXNzZWRQYXRocyk7XG4gICAgcmV0dXJuIG5ldyBDYWxsYmFja0Rpc3Bvc2FibGUoe1xuICAgICAgY2FsbGJhY2s6ICgpOiB2b2lkID0+IHtcbiAgICAgICAgdGhpcy5ieXBhc3NQYXRoU2V0cy5kZWxldGUoYnlwYXNzZWRQYXRocyk7XG4gICAgICB9LFxuICAgICAgbXVsdGlwbGVEaXNwb3NlQmVoYXZpb3I6IE11bHRpcGxlRGlzcG9zZUJlaGF2aW9yLklnbm9yZVxuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGlzTG9ja2VkKGFwcDogQXBwLCBwYXRoT3JGaWxlOiBQYXRoT3JGaWxlKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuaXNQYXRoTG9ja2VkKGdldFBhdGgoYXBwLCBwYXRoT3JGaWxlKSk7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIGdpdmVuIHBhdGggaXMgbG9ja2VkIGRpcmVjdGx5IG9yIGlzIGNvdmVyZWQgYnkgYSBgc3VidHJlZWAtbG9ja2VkIGFuY2VzdG9yXG4gICAqIGZvbGRlci5cbiAgICpcbiAgICogQHBhcmFtIGFwcCAtIFRoZSBPYnNpZGlhbiBhcHAgaW5zdGFuY2UuXG4gICAqIEBwYXJhbSBwYXRoT3JGaWxlIC0gVGhlIHBhdGggb3IgZmlsZSB0byBjaGVjay5cbiAgICogQHJldHVybnMgYHRydWVgIGlmIHRoZSBwYXRoIGlzIGl0c2VsZiBsb2NrZWQgb3IgbGllcyB1bmRlciBhIGBzdWJ0cmVlYC1sb2NrZWQgZm9sZGVyLlxuICAgKi9cbiAgcHVibGljIGlzTG9ja2VkQnlBbmNlc3RvcihhcHA6IEFwcCwgcGF0aE9yRmlsZTogUGF0aE9yRmlsZSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnJlc29sdmVMb2NrT3duZXJQYXRoKGFwcCwgZ2V0UGF0aChhcHAsIHBhdGhPckZpbGUpKSAhPT0gbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVja3Mgd2hldGhlciB0aGUgZ2l2ZW4gcGF0aCBpcyBjb3ZlcmVkIGJ5IGEgbXV0YXRpb24tYmxvY2tpbmcgbG9jayAob25lIHRha2VuIHdpdGhcbiAgICogYGJsb2Nrc011dGF0aW9uc2ApIGRpcmVjdGx5IG9yIG9uIGEgYHN1YnRyZWVgLWxvY2tlZCBhbmNlc3RvciBmb2xkZXIuXG4gICAqXG4gICAqIEBwYXJhbSBhcHAgLSBUaGUgT2JzaWRpYW4gYXBwIGluc3RhbmNlLlxuICAgKiBAcGFyYW0gcGF0aE9yRmlsZSAtIFRoZSBwYXRoIG9yIGZpbGUgdG8gY2hlY2suXG4gICAqIEByZXR1cm5zIGB0cnVlYCBpZiBhIG11dGF0aW9uIG9mIHRoZSBwYXRoIGlzIGN1cnJlbnRseSBibG9ja2VkLlxuICAgKi9cbiAgcHVibGljIGlzTXV0YXRpb25CbG9ja2VkQnlBbmNlc3RvcihhcHA6IEFwcCwgcGF0aE9yRmlsZTogUGF0aE9yRmlsZSk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHBhdGggPSBnZXRQYXRoKGFwcCwgcGF0aE9yRmlsZSk7XG4gICAgY29uc3QgZXhhY3RFbnRyaWVzID0gdGhpcy5sb2NrRW50cmllc0J5UGF0aC5nZXQocGF0aCk7XG4gICAgaWYgKGV4YWN0RW50cmllcz8uc29tZSgoZW50cnkpID0+IGVudHJ5LmJsb2Nrc011dGF0aW9ucykpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IFtsb2NrZWRQYXRoLCBlbnRyaWVzXSBvZiB0aGlzLmxvY2tFbnRyaWVzQnlQYXRoKSB7XG4gICAgICBpZiAoZW50cmllcy5zb21lKChlbnRyeSkgPT4gZW50cnkubW9kZSA9PT0gJ3N1YnRyZWUnICYmIGVudHJ5LmJsb2Nrc011dGF0aW9ucykgJiYgaXNDaGlsZCh7IGFwcCwgY2hpbGRQYXRoT3JGaWxlOiBwYXRoLCBwYXJlbnRQYXRoT3JGaWxlOiBsb2NrZWRQYXRoIH0pKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBwdWJsaWMgbG9jayhhcHA6IEFwcCwgcGF0aE9yRmlsZTogUGF0aE9yRmlsZSwgcGx1Z2luSWQ6IHN0cmluZywgb3B0aW9uczogTWFuYWdlckxvY2tPcHRpb25zID0ge30pOiBEaXNwb3NhYmxlIHtcbiAgICBjb25zdCBwYXRoID0gZ2V0UGF0aChhcHAsIHBhdGhPckZpbGUpO1xuICAgIGNvbnN0IGVudHJ5OiBMb2NrRW50cnkgPSB7XG4gICAgICBhYm9ydENvbnRyb2xsZXI6IG9wdGlvbnMuYWJvcnRDb250cm9sbGVyID8/IG51bGwsXG4gICAgICBibG9ja3NNdXRhdGlvbnM6IG9wdGlvbnMuYmxvY2tzTXV0YXRpb25zID8/IGZhbHNlLFxuICAgICAgbW9kZTogb3B0aW9ucy5tb2RlID8/ICdmaWxlJyxcbiAgICAgIHBsdWdpbklkXG4gICAgfTtcbiAgICBsZXQgZW50cmllcyA9IHRoaXMubG9ja0VudHJpZXNCeVBhdGguZ2V0KHBhdGgpO1xuICAgIGlmICghZW50cmllcykge1xuICAgICAgZW50cmllcyA9IFtdO1xuICAgICAgdGhpcy5sb2NrRW50cmllc0J5UGF0aC5zZXQocGF0aCwgZW50cmllcyk7XG4gICAgfVxuICAgIGVudHJpZXMucHVzaChlbnRyeSk7XG4gICAgdGhpcy5lbnN1cmVTdWJzY3JpYmVkKGFwcCk7XG4gICAgaWYgKGVudHJ5LmJsb2Nrc011dGF0aW9ucykge1xuICAgICAgdGhpcy5lbnN1cmVCbG9ja2VySW5zdGFsbGVkKGFwcCk7XG4gICAgfVxuICAgIHRoaXMucmVjb25jaWxlKGFwcCk7XG5cbiAgICByZXR1cm4gbmV3IENhbGxiYWNrRGlzcG9zYWJsZSh7XG4gICAgICBjYWxsYmFjazogKCk6IHZvaWQgPT4ge1xuICAgICAgICB0aGlzLnJlbW92ZUVudHJ5KGFwcCwgcGF0aCwgZW50cnkpO1xuICAgICAgfSxcbiAgICAgIG11bHRpcGxlRGlzcG9zZUJlaGF2aW9yOiBNdWx0aXBsZURpc3Bvc2VCZWhhdmlvci5JZ25vcmVcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBYm9ydHMgZXZlcnkge0BsaW5rIEFib3J0Q29udHJvbGxlcn0gY3VycmVudGx5IHJlZ2lzdGVyZWQgZm9yIHRoZSBub3RlIGF0IHRoZSBnaXZlbiBwYXRoLCB3aGljaFxuICAgKiBjYW5jZWxzIHRoZSBvcGVyYXRpb25zIGhvbGRpbmcgdGhlIGxvY2suIEVhY2ggb3BlcmF0aW9uIHJlbGVhc2VzIGl0cyBvd24gbG9jayBpbiBpdHMgYGZpbmFsbHlgXG4gICAqIHdoZW4gaXQgb2JzZXJ2ZXMgdGhlIGFib3J0LCBzbyB0aGlzIGRvZXMgbm90IHVubG9jayB0aGUgcGF0aCBkaXJlY3RseS4gQSBuby1vcCB3aGVuIG5vIGNvbnRyb2xsZXJcbiAgICogaXMgcmVnaXN0ZXJlZCBmb3IgdGhlIHBhdGguXG4gICAqXG4gICAqIEBwYXJhbSBhcHAgLSBUaGUgT2JzaWRpYW4gYXBwIGluc3RhbmNlLlxuICAgKiBAcGFyYW0gcGF0aE9yRmlsZSAtIFRoZSBwYXRoIG9yIGZpbGUgb2YgdGhlIG5vdGUgdG8gcmVxdWVzdCBhbiB1bmxvY2sgZm9yLlxuICAgKi9cbiAgcHVibGljIHJlcXVlc3RVbmxvY2soYXBwOiBBcHAsIHBhdGhPckZpbGU6IFBhdGhPckZpbGUpOiB2b2lkIHtcbiAgICBjb25zdCBlbnRyaWVzID0gdGhpcy5sb2NrRW50cmllc0J5UGF0aC5nZXQoZ2V0UGF0aChhcHAsIHBhdGhPckZpbGUpKTtcbiAgICBpZiAoIWVudHJpZXMpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZm9yIChjb25zdCBlbnRyeSBvZiBlbnRyaWVzKSB7XG4gICAgICBlbnRyeS5hYm9ydENvbnRyb2xsZXI/LmFib3J0KCk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHVubG9jayhhcHA6IEFwcCwgcGF0aE9yRmlsZTogUGF0aE9yRmlsZSwgcGx1Z2luSWQ6IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IHBhdGggPSBnZXRQYXRoKGFwcCwgcGF0aE9yRmlsZSk7XG4gICAgY29uc3QgZW50cmllcyA9IHRoaXMubG9ja0VudHJpZXNCeVBhdGguZ2V0KHBhdGgpO1xuICAgIGlmICghZW50cmllcykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBpbmRleCA9IGVudHJpZXMuZmluZEluZGV4KChlbnRyeSkgPT4gZW50cnkucGx1Z2luSWQgPT09IHBsdWdpbklkKTtcbiAgICBpZiAoaW5kZXggPT09IC0xKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGVudHJpZXMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICBpZiAoZW50cmllcy5sZW5ndGggPT09IDApIHtcbiAgICAgIHRoaXMubG9ja0VudHJpZXNCeVBhdGguZGVsZXRlKHBhdGgpO1xuICAgIH1cbiAgICB0aGlzLnJlY29uY2lsZUFuZENsZWFudXAoYXBwKTtcbiAgfVxuXG4gIHB1YmxpYyB1bmxvY2tBbGxGb3JQbHVnaW4oYXBwOiBBcHAsIHBsdWdpbklkOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBmb3IgKGNvbnN0IFtwYXRoLCBlbnRyaWVzXSBvZiB0aGlzLmxvY2tFbnRyaWVzQnlQYXRoKSB7XG4gICAgICBjb25zdCByZW1haW5pbmcgPSBlbnRyaWVzLmZpbHRlcigoZW50cnkpID0+IGVudHJ5LnBsdWdpbklkICE9PSBwbHVnaW5JZCk7XG4gICAgICBpZiAocmVtYWluaW5nLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICB0aGlzLmxvY2tFbnRyaWVzQnlQYXRoLmRlbGV0ZShwYXRoKTtcbiAgICAgIH0gZWxzZSBpZiAocmVtYWluaW5nLmxlbmd0aCAhPT0gZW50cmllcy5sZW5ndGgpIHtcbiAgICAgICAgdGhpcy5sb2NrRW50cmllc0J5UGF0aC5zZXQocGF0aCwgcmVtYWluaW5nKTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5yZWNvbmNpbGVBbmRDbGVhbnVwKGFwcCk7XG4gIH1cblxuICBwcml2YXRlIGFkZFVubG9ja01lbnVJdGVtKGFwcDogQXBwLCBtZW51OiBNZW51LCBwYXRoOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBtZW51LmFkZEl0ZW0oKGl0ZW0pID0+IHtcbiAgICAgIGl0ZW1cbiAgICAgICAgLnNldFRpdGxlKHQoKCQpID0+ICQub2JzaWRpYW5EZXZVdGlscy5yZXNvdXJjZUxvY2sudW5sb2NrTWVudUl0ZW0pKVxuICAgICAgICAuc2V0SWNvbihVTkxPQ0tfSUNPTl9JRClcbiAgICAgICAgLm9uQ2xpY2soY29udmVydEFzeW5jVG9TeW5jKGFzeW5jICgpID0+IHtcbiAgICAgICAgICBjb25zdCBpc0NvbmZpcm1lZCA9IGF3YWl0IGNvbmZpcm0oe1xuICAgICAgICAgICAgYXBwLFxuICAgICAgICAgICAgbWVzc2FnZTogdGhpcy51bmxvY2tDb25maXJtTWVzc2FnZShhcHAsIHBhdGgpLFxuICAgICAgICAgICAgdGl0bGU6IHQoKCQpID0+ICQub2JzaWRpYW5EZXZVdGlscy5yZXNvdXJjZUxvY2sudW5sb2NrQ29uZmlybVRpdGxlKVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGlmIChpc0NvbmZpcm1lZCkge1xuICAgICAgICAgICAgdGhpcy5yZXF1ZXN0VW5sb2NrKGFwcCwgcGF0aCk7XG4gICAgICAgICAgfVxuICAgICAgICB9KSk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZUluZGljYXRvcnMoYXBwOiBBcHAsIHZpZXc6IE1hcmtkb3duVmlldywgcGF0aDogc3RyaW5nLCB0b29sdGlwOiBzdHJpbmcpOiBMb2NrSW5kaWNhdG9ycyB7XG4gICAgY29uc3QgYWN0aW9uSWNvbkVsID0gdmlldy5hZGRBY3Rpb24oTE9DS19JQ09OX0lELCB0b29sdGlwLCBub29wKTtcbiAgICB0aGlzLnJlZ2lzdGVyVW5sb2NrTWVudShhcHAsIGFjdGlvbkljb25FbCwgKCkgPT4gcGF0aCk7XG5cbiAgICBsZXQgdGFiSWNvbkVsOiBIVE1MRWxlbWVudCB8IG51bGwgPSBudWxsO1xuICAgIGNvbnN0IHRhYlN0YXR1c0NvbnRhaW5lckVsID0gdmlldy5sZWFmLnRhYkhlYWRlclN0YXR1c0NvbnRhaW5lckVsO1xuICAgIGlmICh0YWJTdGF0dXNDb250YWluZXJFbCkge1xuICAgICAgdGFiSWNvbkVsID0gdGFiU3RhdHVzQ29udGFpbmVyRWwuY3JlYXRlU3Bhbih7IGNsczogTE9DS19JTkRJQ0FUT1JfQ1NTX0NMQVNTIH0pO1xuICAgICAgc2V0SWNvbih0YWJJY29uRWwsIExPQ0tfSUNPTl9JRCk7XG4gICAgICBzZXRUb29sdGlwKHRhYkljb25FbCwgdG9vbHRpcCk7XG4gICAgICB0aGlzLnJlZ2lzdGVyVW5sb2NrTWVudShhcHAsIHRhYkljb25FbCwgKCkgPT4gcGF0aCk7XG4gICAgfVxuXG4gICAgLy8gQSBsb2NrZWQgdmlldyBpcyByZWFkLW9ubHkgYnV0IHN0aWxsIGVkaXRhYmxlLWZvY3VzYWJsZSwgc28gYSBrZXlzdHJva2UgZmlyZXMgYGJlZm9yZWlucHV0YC5cbiAgICAvLyBPbiB0aGF0IHJlamVjdGVkIGF0dGVtcHQsIGZsYXNoIHRoZSBpbmRpY2F0b3JzIGFuZCBiZWVwIHNvIGl0J3MgY2xlYXIgdGhlIG5vdGUgaXMgbG9ja2VkLlxuICAgIC8vIFRoZSBsaXN0ZW5lciBpcyByZW1vdmVkIG9uIHVubG9jay5cbiAgICBjb25zdCBvblR5cGVBdHRlbXB0ID0gKCk6IHZvaWQgPT4ge1xuICAgICAgdGhpcy5mbGFzaEluZGljYXRvcnModmlldyk7XG4gICAgICB0aGlzLmJlZXBlci5iZWVwKCk7XG4gICAgfTtcbiAgICB2aWV3LmNvbnRlbnRFbC5hZGRFdmVudExpc3RlbmVyKCdiZWZvcmVpbnB1dCcsIG9uVHlwZUF0dGVtcHQpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIGFjdGlvbkljb25FbCxcbiAgICAgIGRpc3Bvc2VUeXBlTGlzdGVuZXI6ICgpOiB2b2lkID0+IHtcbiAgICAgICAgdmlldy5jb250ZW50RWwucmVtb3ZlRXZlbnRMaXN0ZW5lcignYmVmb3JlaW5wdXQnLCBvblR5cGVBdHRlbXB0KTtcbiAgICAgIH0sXG4gICAgICB0YWJJY29uRWxcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBlbnN1cmVCbG9ja2VySW5zdGFsbGVkKGFwcDogQXBwKTogdm9pZCB7XG4gICAgaWYgKHRoaXMubXV0YXRpb25CbG9ja2VyQ29tcG9uZW50KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMubXV0YXRpb25CbG9ja2VyQ29tcG9uZW50ID0gbmV3IFJlc291cmNlTG9ja011dGF0aW9uQmxvY2tlckNvbXBvbmVudCh7XG4gICAgICBzaG91bGRCbG9ja011dGF0aW9uOiAocGF0aCk6IGJvb2xlYW4gPT4gdGhpcy5zaG91bGRCbG9ja011dGF0aW9uKGFwcCwgcGF0aClcbiAgICB9KTtcbiAgICB0aGlzLm11dGF0aW9uQmxvY2tlckNvbXBvbmVudC5sb2FkKCk7XG4gIH1cblxuICBwcml2YXRlIGVuc3VyZVN1YnNjcmliZWQoYXBwOiBBcHApOiB2b2lkIHtcbiAgICBpZiAodGhpcy5ldmVudHNDb21wb25lbnQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5ldmVudHNDb21wb25lbnQgPSBuZXcgUmVzb3VyY2VMb2NrRXZlbnRzQ29tcG9uZW50KHtcbiAgICAgIGFwcCxcbiAgICAgIG9uQ2hhbmdlOiAoKTogdm9pZCA9PiB7XG4gICAgICAgIHRoaXMucmVjb25jaWxlKGFwcCk7XG4gICAgICB9LFxuICAgICAgb25FeHRlcm5hbE11dGF0aW9uOiAocGF0aCk6IHZvaWQgPT4ge1xuICAgICAgICB0aGlzLmhhbmRsZUV4dGVybmFsTXV0YXRpb24oYXBwLCBwYXRoKTtcbiAgICAgIH0sXG4gICAgICBvbkZpbGVNZW51OiAobWVudSwgZmlsZSk6IHZvaWQgPT4ge1xuICAgICAgICB0aGlzLmhhbmRsZUZpbGVNZW51KGFwcCwgbWVudSwgZmlsZSk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgdGhpcy5ldmVudHNDb21wb25lbnQubG9hZCgpO1xuICB9XG5cbiAgcHJpdmF0ZSBmbGFzaEVsZW1lbnQoZWw6IEhUTUxFbGVtZW50KTogdm9pZCB7XG4gICAgZWwucmVtb3ZlQ2xhc3MoTE9DS19JTkRJQ0FUT1JfRkxBU0hfQ1NTX0NMQVNTKTtcbiAgICAvLyBSZWFkIGxheW91dCB0byBmb3JjZSBhIHJlZmxvdyBzbyB0aGUgZmxhc2ggYW5pbWF0aW9uIHJlc3RhcnRzIG9uIGV2ZXJ5IHJlamVjdGVkIGtleXN0cm9rZS5cbiAgICBlbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICBlbC5hZGRDbGFzcyhMT0NLX0lORElDQVRPUl9GTEFTSF9DU1NfQ0xBU1MpO1xuICB9XG5cbiAgcHJpdmF0ZSBmbGFzaEluZGljYXRvcnModmlldzogTWFya2Rvd25WaWV3KTogdm9pZCB7XG4gICAgY29uc3QgaW5kaWNhdG9ycyA9IHRoaXMuaW5kaWNhdG9yc0J5Vmlldy5nZXQodmlldyk7XG4gICAgZm9yIChjb25zdCBlbCBvZiBbaW5kaWNhdG9ycz8uYWN0aW9uSWNvbkVsLCBpbmRpY2F0b3JzPy50YWJJY29uRWwsIHRoaXMuc3RhdHVzQmFySXRlbUVsXSkge1xuICAgICAgaWYgKGVsKSB7XG4gICAgICAgIHRoaXMuZmxhc2hFbGVtZW50KGVsKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmVhY3RzIHRvIGEgdmF1bHQvbWV0YWRhdGEgZXZlbnQgb24gYSBwYXRoLiBJZiB0aGUgcGF0aCBpcyBtdXRhdGlvbi1ibG9ja2VkIGFuZCBOT1QgY292ZXJlZCBieSBhblxuICAgKiBhY3RpdmUgYnlwYXNzIHNjb3BlLCB0aGUgY2hhbmdlIGJ5cGFzc2VkIHRoZSBibG9ja2VyIHBhdGNoIChzeW5jIC8gZmlsZXN5c3RlbSAvIGEgcmF3LWFkYXB0ZXJcbiAgICogd3JpdGUpIFx1MjAxNCBhbiBpbnRydWRlci4gQWJvcnQgdGhlIGBhYm9ydENvbnRyb2xsZXJgIG9mIGV2ZXJ5IG11dGF0aW9uLWJsb2NraW5nIGxvY2sgY292ZXJpbmcgdGhlIHBhdGhcbiAgICogc28gdGhlIG93bmluZyBvcGVyYXRpb24gY2FuY2VscyBhbmQgcm9sbHMgYmFjay4gQSBuby1vcCBmb3IgdGhlIG93bmVyJ3Mgb3duIChieXBhc3NlZCkgbXV0YXRpb25zLFxuICAgKiBmb3IgdW5ibG9ja2VkIHBhdGhzLCBhbmQgZm9yIGJsb2NraW5nIGxvY2tzIHdpdGggbm8gYGFib3J0Q29udHJvbGxlcmAuXG4gICAqXG4gICAqIEBwYXJhbSBhcHAgLSBUaGUgT2JzaWRpYW4gYXBwIGluc3RhbmNlLlxuICAgKiBAcGFyYW0gcGF0aCAtIFRoZSBwYXRoIHRoZSBldmVudCBmaXJlZCBvbi5cbiAgICovXG4gIHByaXZhdGUgaGFuZGxlRXh0ZXJuYWxNdXRhdGlvbihhcHA6IEFwcCwgcGF0aDogc3RyaW5nKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmlzTXV0YXRpb25CbG9ja2VkQnlBbmNlc3RvcihhcHAsIHBhdGgpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh0aGlzLmlzQnlwYXNzZWQoYXBwLCBwYXRoKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IFtsb2NrZWRQYXRoLCBlbnRyaWVzXSBvZiB0aGlzLmxvY2tFbnRyaWVzQnlQYXRoKSB7XG4gICAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIGVudHJpZXMpIHtcbiAgICAgICAgaWYgKCFlbnRyeS5ibG9ja3NNdXRhdGlvbnMgfHwgIWVudHJ5LmFib3J0Q29udHJvbGxlcikge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGNvdmVyc1BhdGggPSBsb2NrZWRQYXRoID09PSBwYXRoIHx8IChlbnRyeS5tb2RlID09PSAnc3VidHJlZScgJiYgaXNDaGlsZCh7IGFwcCwgY2hpbGRQYXRoT3JGaWxlOiBwYXRoLCBwYXJlbnRQYXRoT3JGaWxlOiBsb2NrZWRQYXRoIH0pKTtcbiAgICAgICAgaWYgKGNvdmVyc1BhdGgpIHtcbiAgICAgICAgICBlbnRyeS5hYm9ydENvbnRyb2xsZXIuYWJvcnQoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgaGFuZGxlRmlsZU1lbnUoYXBwOiBBcHAsIG1lbnU6IE1lbnUsIGZpbGU6IFRBYnN0cmFjdEZpbGUpOiB2b2lkIHtcbiAgICAvLyBPZmZlciBcIlVubG9ja1wiIGZvciBhIGRpcmVjdGx5LWxvY2tlZCBmaWxlL2ZvbGRlciwgb3IgYW55dGhpbmcgY292ZXJlZCBieSBhIGBzdWJ0cmVlYCBsb2NrIG9uIGFuIGFuY2VzdG9yLiBUaGUgbWVudSB0YXJnZXRzIHRoZSBvd25lciBsb2NrJ3MgcGF0aC5cbiAgICBjb25zdCBvd25lclBhdGggPSB0aGlzLnJlc29sdmVMb2NrT3duZXJQYXRoKGFwcCwgZmlsZS5wYXRoKTtcbiAgICBpZiAob3duZXJQYXRoID09PSBudWxsKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuYWRkVW5sb2NrTWVudUl0ZW0oYXBwLCBtZW51LCBvd25lclBhdGgpO1xuICB9XG5cbiAgcHJpdmF0ZSBoYXNCbG9ja2luZ0xvY2soKTogYm9vbGVhbiB7XG4gICAgZm9yIChjb25zdCBlbnRyaWVzIG9mIHRoaXMubG9ja0VudHJpZXNCeVBhdGgudmFsdWVzKCkpIHtcbiAgICAgIGlmIChlbnRyaWVzLnNvbWUoKGVudHJ5KSA9PiBlbnRyeS5ibG9ja3NNdXRhdGlvbnMpKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIHBhdGggaXMgY292ZXJlZCBieSBhbiBhY3RpdmUge0BsaW5rIFJlc291cmNlTG9ja01hbmFnZXIuYnlwYXNzfSBzY29wZSBcdTIwMTQgdGhlXG4gICAqIG93bmVyIGRlY2xhcmluZyB0aGF0IGl0cyBvd24gbXV0YXRpb25zIG9mIHRoZSBwYXRoIChhbmQsIGZvciBhIGZvbGRlciwgaXRzIHN1YnRyZWUpIGFyZSBzYW5jdGlvbmVkLlxuICAgKlxuICAgKiBAcGFyYW0gYXBwIC0gVGhlIE9ic2lkaWFuIGFwcCBpbnN0YW5jZS5cbiAgICogQHBhcmFtIHBhdGggLSBUaGUgcGF0aCBiZWluZyBtdXRhdGVkLlxuICAgKiBAcmV0dXJucyBgdHJ1ZWAgaWYgc29tZSBhY3RpdmUgYnlwYXNzIHNjb3BlIGNvdmVycyB0aGUgcGF0aC5cbiAgICovXG4gIHByaXZhdGUgaXNCeXBhc3NlZChhcHA6IEFwcCwgcGF0aDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgZm9yIChjb25zdCBieXBhc3NlZFBhdGhzIG9mIHRoaXMuYnlwYXNzUGF0aFNldHMpIHtcbiAgICAgIGZvciAoY29uc3QgYnlwYXNzZWRQYXRoIG9mIGJ5cGFzc2VkUGF0aHMpIHtcbiAgICAgICAgaWYgKGlzQ2hpbGRPclNlbGYoeyBhcHAsIGNoaWxkUGF0aE9yRmlsZTogcGF0aCwgcGFyZW50UGF0aE9yRmlsZTogYnlwYXNzZWRQYXRoIH0pKSB7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcHJpdmF0ZSBpc1BhdGhMb2NrZWQocGF0aDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICh0aGlzLmxvY2tFbnRyaWVzQnlQYXRoLmdldChwYXRoKT8ubGVuZ3RoID8/IDApID4gMDtcbiAgfVxuXG4gIHByaXZhdGUgbG9ja2luZ1BsdWdpbk5hbWVzKGFwcDogQXBwLCBwYXRoOiBzdHJpbmcpOiBzdHJpbmdbXSB7XG4gICAgY29uc3QgZW50cmllcyA9IHRoaXMubG9ja0VudHJpZXNCeVBhdGguZ2V0KHBhdGgpO1xuICAgIC8vIGBsb2NraW5nUGx1Z2luTmFtZXNgIGlzIG9ubHkgZXZlciBjYWxsZWQgZm9yIGEgbG9ja2VkIHBhdGgsIHNvIGl0cyBlbnRyaWVzIGFyZSBhbHdheXMgcHJlc2VudC5cbiAgICBhc3NlcnROb25OdWxsYWJsZShlbnRyaWVzKTtcbiAgICBjb25zdCBwbHVnaW5JZHMgPSBbLi4ubmV3IFNldChlbnRyaWVzLm1hcCgoZW50cnkpID0+IGVudHJ5LnBsdWdpbklkKSldO1xuICAgIHJldHVybiBwbHVnaW5JZHMubWFwKChwbHVnaW5JZCkgPT4gYXBwLnBsdWdpbnMubWFuaWZlc3RzW3BsdWdpbklkXT8ubmFtZSA/PyBwbHVnaW5JZCk7XG4gIH1cblxuICBwcml2YXRlIGxvY2tUb29sdGlwKGFwcDogQXBwLCBwYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGNvbnN0IGhlYWRlciA9IHQoKCQpID0+ICQub2JzaWRpYW5EZXZVdGlscy5yZXNvdXJjZUxvY2subG9ja2VkQnlUb29sdGlwKTtcbiAgICAvLyBBIHJ1bnRpbWUtbGVuZ3RoIGxpc3Qgb2YgcGx1Z2luIG5hbWVzLCBvbmUgcGVyIGxpbmUgdW5kZXIgdGhlIGhlYWRlci5cbiAgICByZXR1cm4gW2hlYWRlciwgLi4udGhpcy5sb2NraW5nUGx1Z2luTmFtZXMoYXBwLCBwYXRoKV0uam9pbignXFxuJyk7XG4gIH1cblxuICBwcml2YXRlIHJlY29uY2lsZShhcHA6IEFwcCk6IHZvaWQge1xuICAgIGNvbnN0IHZpZXdzVG9Mb2NrID0gbmV3IFNldDxNYXJrZG93blZpZXc+KCk7XG4gICAgZm9yIChjb25zdCBsZWFmIG9mIGFwcC53b3Jrc3BhY2UuZ2V0TGVhdmVzT2ZUeXBlKFZpZXdUeXBlLk1hcmtkb3duKSkge1xuICAgICAgY29uc3QgdmlldyA9IGxlYWYudmlldztcbiAgICAgIGlmICghKHZpZXcgaW5zdGFuY2VvZiBNYXJrZG93blZpZXcpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBwYXRoID0gdmlldy5maWxlPy5wYXRoO1xuICAgICAgaWYgKHBhdGggPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgLy8gUmVzb2x2ZSB0aGUgbG9jayBjb3ZlcmluZyB0aGlzIHZpZXc6IHRoZSBleGFjdCBwYXRoIHdoZW4gZGlyZWN0bHkgbG9ja2VkLCBvdGhlcndpc2UgdGhlIGVuY2xvc2luZyBgc3VidHJlZWAtbG9ja2VkIGZvbGRlci4gSW5kaWNhdG9ycy90b29sdGlwL3VubG9jayBtZW51IGtleSBvZmYgdGhhdCBvd25lciBwYXRoLlxuICAgICAgY29uc3Qgb3duZXJQYXRoID0gdGhpcy5yZXNvbHZlTG9ja093bmVyUGF0aChhcHAsIHBhdGgpO1xuICAgICAgaWYgKG93bmVyUGF0aCAhPT0gbnVsbCkge1xuICAgICAgICB2aWV3c1RvTG9jay5hZGQodmlldyk7XG4gICAgICAgIGNvbnN0IHRvb2x0aXAgPSB0aGlzLmxvY2tUb29sdGlwKGFwcCwgb3duZXJQYXRoKTtcbiAgICAgICAgLy8gUmUtYXBwbHkgdGhlIHJlYWQtb25seSB0b2dnbGUgb24gZXZlcnkgcmVjb25jaWxlLCBub3Qgb25seSB0aGUgZmlyc3QgdGltZSBhIHZpZXcgaXMgdHJhY2tlZC5cbiAgICAgICAgLy8gVGhlIHRvZ2dsZSBpcyBpZGVtcG90ZW50LCBzbyByZS1hcHBseWluZyB0byBhbiBhbHJlYWR5LWxvY2tlZCB2aWV3IGlzIGNoZWFwLlxuICAgICAgICAvLyBBIHZpZXcgb3BlbmVkIGFmdGVyIHRoZSBsb2NrIGlzIHJlY29uY2lsZWQgc3luY2hyb25vdXNseSwgYmVmb3JlIGl0cyBDb2RlTWlycm9yIGlzIHJlYWR5LlxuICAgICAgICAvLyBJdHMgZmlyc3QgdG9nZ2xlIGlzIHRoZXJlZm9yZSBhIG5vLW9wOyByZS1hcHBseWluZyBtYWtlcyB0aGUgbG9jayB0YWtlIGhvbGQgb25jZSBpdCBzZXR0bGVzLlxuICAgICAgICB0b2dnbGVFZGl0b3JSZWFkT25seSh2aWV3LmVkaXRvciwgdHJ1ZSk7XG4gICAgICAgIGNvbnN0IGluZGljYXRvcnMgPSB0aGlzLmluZGljYXRvcnNCeVZpZXcuZ2V0KHZpZXcpO1xuICAgICAgICBpZiAoaW5kaWNhdG9ycykge1xuICAgICAgICAgIHRoaXMudXBkYXRlSW5kaWNhdG9yVG9vbHRpcHMoaW5kaWNhdG9ycywgdG9vbHRpcCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5pbmRpY2F0b3JzQnlWaWV3LnNldCh2aWV3LCB0aGlzLmNyZWF0ZUluZGljYXRvcnMoYXBwLCB2aWV3LCBvd25lclBhdGgsIHRvb2x0aXApKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGZvciAoY29uc3QgW3ZpZXcsIGluZGljYXRvcnNdIG9mIHRoaXMuaW5kaWNhdG9yc0J5Vmlldykge1xuICAgICAgaWYgKCF2aWV3c1RvTG9jay5oYXModmlldykpIHtcbiAgICAgICAgdG9nZ2xlRWRpdG9yUmVhZE9ubHkodmlldy5lZGl0b3IsIGZhbHNlKTtcbiAgICAgICAgaW5kaWNhdG9ycy5kaXNwb3NlVHlwZUxpc3RlbmVyKCk7XG4gICAgICAgIGluZGljYXRvcnMuYWN0aW9uSWNvbkVsLnJlbW92ZSgpO1xuICAgICAgICBpbmRpY2F0b3JzLnRhYkljb25FbD8ucmVtb3ZlKCk7XG4gICAgICAgIHRoaXMuaW5kaWNhdG9yc0J5Vmlldy5kZWxldGUodmlldyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy51cGRhdGVTdGF0dXNCYXIoYXBwKTtcbiAgfVxuXG4gIHByaXZhdGUgcmVjb25jaWxlQW5kQ2xlYW51cChhcHA6IEFwcCk6IHZvaWQge1xuICAgIHRoaXMucmVjb25jaWxlKGFwcCk7XG4gICAgaWYgKHRoaXMubG9ja0VudHJpZXNCeVBhdGguc2l6ZSA9PT0gMCkge1xuICAgICAgdGhpcy5ldmVudHNDb21wb25lbnQ/LnVubG9hZCgpO1xuICAgICAgdGhpcy5ldmVudHNDb21wb25lbnQgPSBudWxsO1xuICAgIH1cbiAgICBpZiAoIXRoaXMuaGFzQmxvY2tpbmdMb2NrKCkpIHtcbiAgICAgIHRoaXMubXV0YXRpb25CbG9ja2VyQ29tcG9uZW50Py51bmxvYWQoKTtcbiAgICAgIHRoaXMubXV0YXRpb25CbG9ja2VyQ29tcG9uZW50ID0gbnVsbDtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHJlZ2lzdGVyVW5sb2NrTWVudShhcHA6IEFwcCwgZWw6IEhUTUxFbGVtZW50LCBnZXRDb250ZXh0UGF0aDogKCkgPT4gc3RyaW5nIHwgdW5kZWZpbmVkKTogdm9pZCB7XG4gICAgLy8gQSBwbGFpbiBsaXN0ZW5lciBkaWVzIHdpdGggdGhlIGVsZW1lbnQgd2hlbiBpdCBpcyBgLnJlbW92ZSgpYGQgb24gdW5sb2NrLCBzbyBpdCBuZXZlciBsZWFrcy5cbiAgICBlbC5hZGRFdmVudExpc3RlbmVyKCdjb250ZXh0bWVudScsIChldnQpID0+IHtcbiAgICAgIGV2dC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgY29uc3QgcGF0aCA9IGdldENvbnRleHRQYXRoKCk7XG4gICAgICBpZiAocGF0aCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IG1lbnUgPSBuZXcgTWVudSgpO1xuICAgICAgdGhpcy5hZGRVbmxvY2tNZW51SXRlbShhcHAsIG1lbnUsIHBhdGgpO1xuICAgICAgbWVudS5zaG93QXRNb3VzZUV2ZW50KGV2dCk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIHJlbW92ZUVudHJ5KGFwcDogQXBwLCBwYXRoOiBzdHJpbmcsIGVudHJ5OiBMb2NrRW50cnkpOiB2b2lkIHtcbiAgICBjb25zdCBlbnRyaWVzID0gdGhpcy5sb2NrRW50cmllc0J5UGF0aC5nZXQocGF0aCk7XG4gICAgaWYgKCFlbnRyaWVzKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGluZGV4ID0gZW50cmllcy5pbmRleE9mKGVudHJ5KTtcbiAgICBpZiAoaW5kZXggPT09IC0xKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGVudHJpZXMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICBpZiAoZW50cmllcy5sZW5ndGggPT09IDApIHtcbiAgICAgIHRoaXMubG9ja0VudHJpZXNCeVBhdGguZGVsZXRlKHBhdGgpO1xuICAgIH1cbiAgICB0aGlzLnJlY29uY2lsZUFuZENsZWFudXAoYXBwKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNvbHZlcyB3aGljaCBsb2NrZWQgcGF0aCAoaWYgYW55KSBjb3ZlcnMgdGhlIGdpdmVuIHBhdGg6IHRoZSBwYXRoIGl0c2VsZiB3aGVuIGRpcmVjdGx5IGxvY2tlZCxcbiAgICogb3RoZXJ3aXNlIHRoZSBsb25nZXN0IGBzdWJ0cmVlYC1sb2NrZWQgYW5jZXN0b3IgZm9sZGVyIHRoYXQgY29udGFpbnMgaXQgKGxvbmdlc3Qgc28gYSBuZXN0ZWRcbiAgICogc3VidHJlZSBsb2NrIHdpbnMgZGV0ZXJtaW5pc3RpY2FsbHkgb3ZlciBhbiBvdXRlciBvbmUpLlxuICAgKlxuICAgKiBAcGFyYW0gYXBwIC0gVGhlIE9ic2lkaWFuIGFwcCBpbnN0YW5jZS5cbiAgICogQHBhcmFtIHBhdGggLSBUaGUgcGF0aCB0byByZXNvbHZlIGFuIG93bmVyIGxvY2sgZm9yLlxuICAgKiBAcmV0dXJucyBUaGUgY292ZXJpbmcgbG9ja2VkIHBhdGgsIG9yIGBudWxsYCB3aGVuIG5vdGhpbmcgY292ZXJzIGl0LlxuICAgKi9cbiAgcHJpdmF0ZSByZXNvbHZlTG9ja093bmVyUGF0aChhcHA6IEFwcCwgcGF0aDogc3RyaW5nKTogbnVsbCB8IHN0cmluZyB7XG4gICAgaWYgKHRoaXMuaXNQYXRoTG9ja2VkKHBhdGgpKSB7XG4gICAgICByZXR1cm4gcGF0aDtcbiAgICB9XG4gICAgbGV0IGJlc3RPd25lclBhdGg6IG51bGwgfCBzdHJpbmcgPSBudWxsO1xuICAgIGZvciAoY29uc3QgW2xvY2tlZFBhdGgsIGVudHJpZXNdIG9mIHRoaXMubG9ja0VudHJpZXNCeVBhdGgpIHtcbiAgICAgIGNvbnN0IGhhc1N1YnRyZWVMb2NrID0gZW50cmllcy5zb21lKChlbnRyeSkgPT4gZW50cnkubW9kZSA9PT0gJ3N1YnRyZWUnKTtcbiAgICAgIGlmIChoYXNTdWJ0cmVlTG9jayAmJiBpc0NoaWxkKHsgYXBwLCBjaGlsZFBhdGhPckZpbGU6IHBhdGgsIHBhcmVudFBhdGhPckZpbGU6IGxvY2tlZFBhdGggfSkgJiYgKGJlc3RPd25lclBhdGggPT09IG51bGwgfHwgbG9ja2VkUGF0aC5sZW5ndGggPiBiZXN0T3duZXJQYXRoLmxlbmd0aCkpIHtcbiAgICAgICAgYmVzdE93bmVyUGF0aCA9IGxvY2tlZFBhdGg7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBiZXN0T3duZXJQYXRoO1xuICB9XG5cbiAgLyoqXG4gICAqIERlY2lkZXMgd2hldGhlciBhIG11dGF0aW9uIG9mIHRoZSBwYXRoIG11c3QgYmUgYmxvY2tlZDogYHRydWVgIHdoZW4gdGhlIHBhdGggaXMgbXV0YXRpb24tYmxvY2tlZFxuICAgKiBhbmQgbm90IGNvdmVyZWQgYnkgYW55IGFjdGl2ZSB7QGxpbmsgUmVzb3VyY2VMb2NrTWFuYWdlci5ieXBhc3N9IHNjb3BlLlxuICAgKlxuICAgKiBAcGFyYW0gYXBwIC0gVGhlIE9ic2lkaWFuIGFwcCBpbnN0YW5jZS5cbiAgICogQHBhcmFtIHBhdGggLSBUaGUgcGF0aCBiZWluZyBtdXRhdGVkLlxuICAgKiBAcmV0dXJucyBgdHJ1ZWAgdG8gcmVqZWN0IHRoZSBtdXRhdGlvbiwgYGZhbHNlYCB0byBhbGxvdyBpdC5cbiAgICovXG4gIHByaXZhdGUgc2hvdWxkQmxvY2tNdXRhdGlvbihhcHA6IEFwcCwgcGF0aDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgaWYgKCF0aGlzLmlzTXV0YXRpb25CbG9ja2VkQnlBbmNlc3RvcihhcHAsIHBhdGgpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiAhdGhpcy5pc0J5cGFzc2VkKGFwcCwgcGF0aCk7XG4gIH1cblxuICBwcml2YXRlIHVubG9ja0NvbmZpcm1NZXNzYWdlKGFwcDogQXBwLCBwYXRoOiBzdHJpbmcpOiBEb2N1bWVudEZyYWdtZW50IHtcbiAgICBjb25zdCBmcmFnbWVudCA9IGNyZWF0ZUZyYWdtZW50KCk7XG4gICAgZnJhZ21lbnQuYXBwZW5kVGV4dCh0KCgkKSA9PiAkLm9ic2lkaWFuRGV2VXRpbHMucmVzb3VyY2VMb2NrLnVubG9ja0NvbmZpcm1NZXNzYWdlKSk7XG4gICAgLy8gQSBydW50aW1lLWxlbmd0aCBsaXN0IG9mIHRoZSBwbHVnaW5zIGN1cnJlbnRseSBob2xkaW5nIGEgbG9jaywgZWFjaCBhcyBhIGNvZGUgYmxvY2sgb24gaXRzIG93biBsaW5lLlxuICAgIGZvciAoY29uc3QgbmFtZSBvZiB0aGlzLmxvY2tpbmdQbHVnaW5OYW1lcyhhcHAsIHBhdGgpKSB7XG4gICAgICBmcmFnbWVudC5jcmVhdGVFbCgnYnInKTtcbiAgICAgIGFwcGVuZENvZGVCbG9jayhmcmFnbWVudCwgbmFtZSk7XG4gICAgfVxuICAgIHJldHVybiBmcmFnbWVudDtcbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlSW5kaWNhdG9yVG9vbHRpcHMoaW5kaWNhdG9yczogTG9ja0luZGljYXRvcnMsIHRvb2x0aXA6IHN0cmluZyk6IHZvaWQge1xuICAgIHNldFRvb2x0aXAoaW5kaWNhdG9ycy5hY3Rpb25JY29uRWwsIHRvb2x0aXApO1xuICAgIGlmIChpbmRpY2F0b3JzLnRhYkljb25FbCkge1xuICAgICAgc2V0VG9vbHRpcChpbmRpY2F0b3JzLnRhYkljb25FbCwgdG9vbHRpcCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVTdGF0dXNCYXIoYXBwOiBBcHApOiB2b2lkIHtcbiAgICBjb25zdCBhY3RpdmVWaWV3ID0gYXBwLndvcmtzcGFjZS5nZXRBY3RpdmVWaWV3T2ZUeXBlKE1hcmtkb3duVmlldyk7XG4gICAgY29uc3QgYWN0aXZlUGF0aCA9IGFjdGl2ZVZpZXc/LmZpbGU/LnBhdGg7XG4gICAgY29uc3QgYWN0aXZlT3duZXJQYXRoID0gYWN0aXZlUGF0aCA9PT0gdW5kZWZpbmVkID8gbnVsbCA6IHRoaXMucmVzb2x2ZUxvY2tPd25lclBhdGgoYXBwLCBhY3RpdmVQYXRoKTtcblxuICAgIGlmIChhY3RpdmVPd25lclBhdGggPT09IG51bGwgfHwgIWFjdGl2ZVZpZXcpIHtcbiAgICAgIHRoaXMuc3RhdHVzQmFySXRlbUVsPy5yZW1vdmUoKTtcbiAgICAgIHRoaXMuc3RhdHVzQmFySXRlbUVsID0gbnVsbDtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMuc3RhdHVzQmFySXRlbUVsKSB7XG4gICAgICBjb25zdCBzdGF0dXNCYXJFbCA9IGFjdGl2ZVZpZXcuY29udGFpbmVyRWwub3duZXJEb2N1bWVudC5ib2R5LnF1ZXJ5U2VsZWN0b3I8SFRNTEVsZW1lbnQ+KFNUQVRVU19CQVJfQ1NTX1NFTEVDVE9SKTtcbiAgICAgIGlmICghc3RhdHVzQmFyRWwpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdGhpcy5zdGF0dXNCYXJJdGVtRWwgPSBzdGF0dXNCYXJFbC5jcmVhdGVEaXYoeyBjbHM6IFtTVEFUVVNfQkFSX0lURU1fQ1NTX0NMQVNTLCBMT0NLX0lORElDQVRPUl9DU1NfQ0xBU1NdIH0pO1xuICAgICAgc2V0SWNvbih0aGlzLnN0YXR1c0Jhckl0ZW1FbCwgTE9DS19JQ09OX0lEKTtcbiAgICAgIC8vIFRoZSBzaW5nbGUgc3RhdHVzLWJhciBpdGVtIGlzIHJldXNlZCBhY3Jvc3MgYWN0aXZlLW5vdGUgc3dpdGNoZXMuXG4gICAgICAvLyBJdCBtdXN0IHJlc29sdmUgdGhlIGN1cnJlbnRseSBhY3RpdmUgbm90ZSdzIG93bmVyIGxvY2sgYXQgY2xpY2sgdGltZSByYXRoZXIgdGhhbiBjYXB0dXJpbmcgb25lIHBhdGguXG4gICAgICB0aGlzLnJlZ2lzdGVyVW5sb2NrTWVudShhcHAsIHRoaXMuc3RhdHVzQmFySXRlbUVsLCAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHBhdGggPSBhcHAud29ya3NwYWNlLmdldEFjdGl2ZVZpZXdPZlR5cGUoTWFya2Rvd25WaWV3KT8uZmlsZT8ucGF0aDtcbiAgICAgICAgcmV0dXJuIHBhdGggPT09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZCA6IHRoaXMucmVzb2x2ZUxvY2tPd25lclBhdGgoYXBwLCBwYXRoKSA/PyB1bmRlZmluZWQ7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBzZXRUb29sdGlwKHRoaXMuc3RhdHVzQmFySXRlbUVsLCB0aGlzLmxvY2tUb29sdGlwKGFwcCwgYWN0aXZlT3duZXJQYXRoKSk7XG4gIH1cbn1cblxuLyoqXG4gKiBBIHBlci1wbHVnaW4gaGFuZGxlIGZvciBwYXRoLXNjb3BlZCByZXNvdXJjZSBsb2NraW5nIChlZGl0b3IgcmVhZC1vbmx5LCBvcHRpb25hbCB2YXVsdC1tdXRhdGlvblxuICogYmxvY2tpbmcsIGFuZCBleHRlcm5hbC1jaGFuZ2UgZGV0ZWN0aW9uIFx1MjAxNCBzZWUgdGhlIGZpbGUgb3ZlcnZpZXcpLiBBZGQgaXQgYXMgYSBjaGlsZCBvZiB5b3VyIHBsdWdpblxuICogKGB0aGlzLmFkZENoaWxkKG5ldyBSZXNvdXJjZUxvY2tDb21wb25lbnQodGhpcy5hcHApKWApIHNvIHRoYXQgYW55IGxvY2tzIGl0IHN0aWxsIGhvbGRzIGFyZSByZWxlYXNlZFxuICogYXV0b21hdGljYWxseSB3aGVuIHRoZSBwbHVnaW4gdW5sb2FkcyBcdTIwMTQgYSByZXNvdXJjZSBjYW4gbmV2ZXIgYmUgbGVmdCBzdHVjayBsb2NrZWQgYmVjYXVzZSB0aGUgcGx1Z2luXG4gKiB0aGF0IGxvY2tlZCBpdCB3YXMgZGlzYWJsZWQgb3IgcmVsb2FkZWQgbWlkLW9wZXJhdGlvbi5cbiAqXG4gKiBMb2NrcyBhcmUgcmVmZXJlbmNlLWNvdW50ZWQgYW5kIGF0dHJpYnV0ZWQgdG8gdGhpcyBwbHVnaW4sIHNvIHRoZSBsb2NrIGluZGljYXRvcnMnIHRvb2x0aXAgbmFtZXMgaXRcbiAqIGFtb25nIHRoZSBwbHVnaW5zIGN1cnJlbnRseSBob2xkaW5nIGEgbG9jay5cbiAqL1xuZXhwb3J0IGNsYXNzIFJlc291cmNlTG9ja0NvbXBvbmVudCBleHRlbmRzIENvbXBvbmVudEV4IHtcbiAgcHJpdmF0ZSByZWFkb25seSBhcHA6IEFwcDtcbiAgcHJpdmF0ZSByZWFkb25seSBwbHVnaW5JZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGFuIHJlc291cmNlLWxvY2sgaGFuZGxlIG93bmVkIGJ5IGEgcGx1Z2luLlxuICAgKlxuICAgKiBAcGFyYW0gYXBwIC0gVGhlIE9ic2lkaWFuIGFwcCBpbnN0YW5jZS5cbiAgICogQHBhcmFtIHBsdWdpbklkIC0gVGhlIGlkIG9mIHRoZSBvd25pbmcgcGx1Z2luIChlLmcuIGl0cyBgbWFuaWZlc3QuaWRgKS4gTG9ja3MgYXJlIGF0dHJpYnV0ZWQgdG9cbiAgICogaXQgZm9yIHJlZmVyZW5jZS1jb3VudGluZyBhbmQgdGhlIGluZGljYXRvcnMnIFwibG9ja2VkIGJ5XCIgdG9vbHRpcC5cbiAgICovXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihhcHA6IEFwcCwgcGx1Z2luSWQ6IHN0cmluZykge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5hcHAgPSBhcHA7XG4gICAgdGhpcy5wbHVnaW5JZCA9IHBsdWdpbklkO1xuICB9XG5cbiAgLyoqXG4gICAqIE9wZW5zIGFuICoqYW1iaWVudCBieXBhc3Mgc2NvcGUqKjogd2hpbGUgdGhlIHJldHVybmVkIHtAbGluayBEaXNwb3NhYmxlfSBpcyBub3QgZGlzcG9zZWQsIHRoaXNcbiAgICogcGx1Z2luJ3Mgb3duIG11dGF0aW9ucyBvZiB0aGUgZ2l2ZW4gcGF0aHMgKGFuZCwgZm9yIGEgZm9sZGVyLCBpdHMgd2hvbGUgc3VidHJlZSkgcGFzcyB0aHJvdWdoIHRoZVxuICAgKiBtdXRhdGlvbiBibG9ja2VyIGluc3RlYWQgb2YgdGhyb3dpbmcge0BsaW5rIFJlc291cmNlTG9ja2VkRXJyb3J9LiBBbnkgbXV0YXRpb24gb2YgYSBibG9ja2VkIHBhdGhcbiAgICogTk9UIGNvdmVyZWQgYnkgYW4gYWN0aXZlIGJ5cGFzcyBzY29wZSBpcyBzdGlsbCByZWplY3RlZC4gVXNlIGl0IHdpdGggYSBgdXNpbmdgIGRlY2xhcmF0aW9uIGFyb3VuZFxuICAgKiB0aGUgb3BlcmF0aW9uIHRoYXQgbGVnaXRpbWF0ZWx5IG11dGF0ZXMgcmVzb3VyY2VzIGl0IGhhcyBsb2NrZWQgd2l0aFxuICAgKiB7QGxpbmsgUmVzb3VyY2VMb2NrQ29tcG9uZW50TG9ja0ZvclBhdGhPcHRpb25zLnNob3VsZEJsb2NrTXV0YXRpb25zfTpcbiAgICpcbiAgICogYGBgdHNcbiAgICogdXNpbmcgX2J5cGFzcyA9IGNvbXBvbmVudC5ieXBhc3NCbG9ja2VkTXV0YXRpb25zKFtzb3VyY2VGaWxlLCB0YXJnZXRGaWxlXSk7XG4gICAqIC8vIC4uLiB0aGUgb3BlcmF0aW9uJ3Mgb3duIHZhdWx0IG11dGF0aW9ucyBvZiB0aG9zZSBwYXRocyBhcmUgYWxsb3dlZCAuLi5cbiAgICogLy8gc2NvcGUgZW5kOiB0aGUgcGF0aHMgYXJlIGVuZm9yY2VkIGFnYWluXG4gICAqIGBgYFxuICAgKlxuICAgKiBAcGFyYW0gcGF0aHNPckZpbGVzIC0gVGhlIHBhdGhzIChvciBmaWxlcy9mb2xkZXJzKSB3aG9zZSBtdXRhdGlvbiBieSB0aGlzIG9wZXJhdGlvbiBpcyBzYW5jdGlvbmVkLlxuICAgKiBAcmV0dXJucyBBIHtAbGluayBEaXNwb3NhYmxlfSB0aGF0IGVuZHMgdGhlIGJ5cGFzcyBzY29wZSB3aGVuIGRpc3Bvc2VkLlxuICAgKi9cbiAgcHVibGljIGJ5cGFzc0Jsb2NrZWRNdXRhdGlvbnMocGF0aHNPckZpbGVzOiByZWFkb25seSBQYXRoT3JGaWxlW10pOiBEaXNwb3NhYmxlIHtcbiAgICByZXR1cm4gZ2V0TWFuYWdlcigpLmJ5cGFzcyh0aGlzLmFwcCwgcGF0aHNPckZpbGVzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVja3Mgd2hldGhlciB0aGUgcGF0aCBpcyBsb2NrZWQgZGlyZWN0bHkgb3IgbGllcyB1bmRlciBhIGBzdWJ0cmVlYC1sb2NrZWQgYW5jZXN0b3IgZm9sZGVyLlxuICAgKlxuICAgKiBAcGFyYW0gcGF0aE9yRmlsZSAtIFRoZSBwYXRoIG9yIGZpbGUgdG8gY2hlY2suXG4gICAqIEByZXR1cm5zIGB0cnVlYCBpZiB0aGUgcGF0aCBpcyBpdHNlbGYgbG9ja2VkIG9yIGlzIGNvdmVyZWQgYnkgYSBgc3VidHJlZWAgbG9jayBvbiBhbiBhbmNlc3Rvci5cbiAgICovXG4gIHB1YmxpYyBpc0xvY2tlZEJ5QW5jZXN0b3JGb3JQYXRoKHBhdGhPckZpbGU6IFBhdGhPckZpbGUpOiBib29sZWFuIHtcbiAgICByZXR1cm4gZ2V0TWFuYWdlcigpLmlzTG9ja2VkQnlBbmNlc3Rvcih0aGlzLmFwcCwgcGF0aE9yRmlsZSk7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIG5vdGUgYXQgdGhlIGdpdmVuIHBhdGggaXMgY3VycmVudGx5IGxvY2tlZCBieSBhbnkgcGx1Z2luLlxuICAgKlxuICAgKiBAcGFyYW0gcGF0aE9yRmlsZSAtIFRoZSBwYXRoIG9yIGZpbGUgb2YgdGhlIG5vdGUgdG8gY2hlY2suXG4gICAqIEByZXR1cm5zIGB0cnVlYCBpZiB0aGUgbm90ZSBoYXMgYXQgbGVhc3Qgb25lIGFjdGl2ZSBsb2NrLCBgZmFsc2VgIG90aGVyd2lzZS5cbiAgICovXG4gIHB1YmxpYyBpc0xvY2tlZEZvclBhdGgocGF0aE9yRmlsZTogUGF0aE9yRmlsZSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBnZXRNYW5hZ2VyKCkuaXNMb2NrZWQodGhpcy5hcHAsIHBhdGhPckZpbGUpO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrcyB3aGV0aGVyIGEgdmF1bHQgbXV0YXRpb24gb2YgdGhlIHBhdGggaXMgY3VycmVudGx5IGJsb2NrZWQgYnkgYSBgc2hvdWxkQmxvY2tNdXRhdGlvbnNgIGxvY2tcbiAgICogb24gdGhlIHBhdGggaXRzZWxmIG9yIG9uIGEgYHN1YnRyZWVgLWxvY2tlZCBhbmNlc3RvciBmb2xkZXIuXG4gICAqXG4gICAqIEBwYXJhbSBwYXRoT3JGaWxlIC0gVGhlIHBhdGggb3IgZmlsZSB0byBjaGVjay5cbiAgICogQHJldHVybnMgYHRydWVgIGlmIGVkaXRpbmcvZGVsZXRpbmcvcmVuYW1pbmcvbW92aW5nL2NyZWF0aW5nIHRoZSBwYXRoIHdvdWxkIHRocm93IGFcbiAgICoge0BsaW5rIFJlc291cmNlTG9ja2VkRXJyb3J9LlxuICAgKi9cbiAgcHVibGljIGlzTXV0YXRpb25CbG9ja2VkQnlBbmNlc3RvckZvclBhdGgocGF0aE9yRmlsZTogUGF0aE9yRmlsZSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBnZXRNYW5hZ2VyKCkuaXNNdXRhdGlvbkJsb2NrZWRCeUFuY2VzdG9yKHRoaXMuYXBwLCBwYXRoT3JGaWxlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMb2NrcyB0aGUgbm90ZSBhdCB0aGUgZ2l2ZW4gcGF0aCBvbiBiZWhhbGYgb2YgdGhpcyBwbHVnaW4sIG1ha2luZyBpdCByZWFkLW9ubHkgaW4gZXZlcnkgY3VycmVudFxuICAgKiBhbmQgZnV0dXJlIHtAbGluayBNYXJrZG93blZpZXd9IHVudGlsIHRoZSBsb2NrIGlzIHJlbGVhc2VkLiBSZWZlcmVuY2UtY291bnRlZDogYmFsYW5jZSBlYWNoIGNhbGxcbiAgICogd2l0aCBhIGRpc3Bvc2Ugb2YgdGhlIHJldHVybmVkIHtAbGluayBEaXNwb3NhYmxlfSAoaWRlYWxseSB2aWEgYHVzaW5nYCkgb3Ige0BsaW5rIHVubG9ja0ZvclBhdGh9LlxuICAgKlxuICAgKiBAcGFyYW0gcGF0aE9yRmlsZSAtIFRoZSBwYXRoIG9yIGZpbGUgb2YgdGhlIG5vdGUgdG8gbG9jay5cbiAgICogQHBhcmFtIG9wdGlvbnMgLSBPcHRpb25hbCBsb2NraW5nIG9wdGlvbnMuIFBhc3MgYW5cbiAgICoge0BsaW5rIFJlc291cmNlTG9ja0NvbXBvbmVudExvY2tGb3JQYXRoT3B0aW9ucy5hYm9ydENvbnRyb2xsZXJ9IHRvIG1ha2UgdGhlIGxvY2sgY2FuY2VsYWJsZSB2aWEgdGhlXG4gICAqIGluZGljYXRvcidzIHJpZ2h0LWNsaWNrIFwidW5sb2NrXCIgbWVudSBvciB7QGxpbmsgcmVxdWVzdFJlc291cmNlVW5sb2NrRm9yUGF0aH0uXG4gICAqIEByZXR1cm5zIEEge0BsaW5rIERpc3Bvc2FibGV9IHRoYXQgcmVsZWFzZXMgdGhpcyBsb2NrIHdoZW4gZGlzcG9zZWQuIERpc3Bvc2luZyBtb3JlIHRoYW4gb25jZSBpcyBhIG5vLW9wLlxuICAgKi9cbiAgcHVibGljIGxvY2tGb3JQYXRoKHBhdGhPckZpbGU6IFBhdGhPckZpbGUsIG9wdGlvbnM/OiBSZXNvdXJjZUxvY2tDb21wb25lbnRMb2NrRm9yUGF0aE9wdGlvbnMpOiBEaXNwb3NhYmxlIHtcbiAgICByZXR1cm4gZ2V0TWFuYWdlcigpLmxvY2sodGhpcy5hcHAsIHBhdGhPckZpbGUsIHRoaXMucGx1Z2luSWQsIHsgYWJvcnRDb250cm9sbGVyOiBvcHRpb25zPy5hYm9ydENvbnRyb2xsZXIsIGJsb2Nrc011dGF0aW9uczogb3B0aW9ucz8uc2hvdWxkQmxvY2tNdXRhdGlvbnMsIG1vZGU6IG9wdGlvbnM/Lm1vZGUgfSk7XG4gIH1cblxuICAvKipcbiAgICogUmVsZWFzZXMgZXZlcnkgbG9jayBzdGlsbCBoZWxkIGJ5IHRoaXMgcGx1Z2luIHdoZW4gdGhlIGNvbXBvbmVudCAoYW5kIHRodXMgdGhlIHBsdWdpbikgdW5sb2FkcyxcbiAgICogc28gbm8gbm90ZSBpcyBsZWZ0IHN0dWNrIHJlYWQtb25seSBieSBhbiBvcGVyYXRpb24gdGhhdCBuZXZlciBjb21wbGV0ZWQuXG4gICAqL1xuICBwdWJsaWMgb3ZlcnJpZGUgb251bmxvYWQoKTogdm9pZCB7XG4gICAgZ2V0TWFuYWdlcigpLnVubG9ja0FsbEZvclBsdWdpbih0aGlzLmFwcCwgdGhpcy5wbHVnaW5JZCk7XG4gICAgc3VwZXIub251bmxvYWQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWxlYXNlcyBvbmUgbG9jayBwcmV2aW91c2x5IGFjcXVpcmVkIGZvciB0aGUgbm90ZSBhdCB0aGUgZ2l2ZW4gcGF0aCB2aWEge0BsaW5rIGxvY2tGb3JQYXRofS5cbiAgICpcbiAgICogQHBhcmFtIHBhdGhPckZpbGUgLSBUaGUgcGF0aCBvciBmaWxlIG9mIHRoZSBub3RlIHRvIHVubG9jay5cbiAgICovXG4gIHB1YmxpYyB1bmxvY2tGb3JQYXRoKHBhdGhPckZpbGU6IFBhdGhPckZpbGUpOiB2b2lkIHtcbiAgICBnZXRNYW5hZ2VyKCkudW5sb2NrKHRoaXMuYXBwLCBwYXRoT3JGaWxlLCB0aGlzLnBsdWdpbklkKTtcbiAgfVxufVxuXG4vKipcbiAqIFRocm93biBieSB0aGUgdmF1bHQtbXV0YXRpb24gYmxvY2tlciB3aGVuIGEgcGx1Z2luIHRyaWVzIHRvIGVkaXQsIGRlbGV0ZSwgcmVuYW1lLCBtb3ZlLCBvciBjcmVhdGUgYVxuICogcmVzb3VyY2Ugd2hvc2UgcGF0aCBpcyBjb3ZlcmVkIGJ5IGEgbG9jayB0YWtlbiB3aXRoXG4gKiB7QGxpbmsgUmVzb3VyY2VMb2NrQ29tcG9uZW50TG9ja0ZvclBhdGhPcHRpb25zLnNob3VsZEJsb2NrTXV0YXRpb25zfS5cbiAqL1xuZXhwb3J0IGNsYXNzIFJlc291cmNlTG9ja2VkRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gIC8qKlxuICAgKiBUaGUgdmF1bHQgcGF0aCB3aG9zZSBtdXRhdGlvbiB3YXMgYmxvY2tlZC5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBwYXRoOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSB7QGxpbmsgUmVzb3VyY2VMb2NrZWRFcnJvcn0uXG4gICAqXG4gICAqIEBwYXJhbSBwYXRoIC0gVGhlIHZhdWx0IHBhdGggd2hvc2UgbXV0YXRpb24gd2FzIGJsb2NrZWQuXG4gICAqL1xuICBwdWJsaWMgY29uc3RydWN0b3IocGF0aDogc3RyaW5nKSB7XG4gICAgc3VwZXIoYFRoZSByZXNvdXJjZSBcIiR7cGF0aH1cIiBpcyBsb2NrZWQgYW5kIGNhbm5vdCBiZSBtdXRhdGVkLmApO1xuICAgIHRoaXMubmFtZSA9ICdSZXNvdXJjZUxvY2tlZEVycm9yJztcbiAgICB0aGlzLnBhdGggPSBwYXRoO1xuICB9XG59XG5cbi8qKlxuICogQ2hlY2tzIHdoZXRoZXIgdGhlIG5vdGUgYXQgdGhlIGdpdmVuIHBhdGggaXMgY3VycmVudGx5IGxvY2tlZC5cbiAqXG4gKiBAcGFyYW0gYXBwIC0gVGhlIE9ic2lkaWFuIGFwcCBpbnN0YW5jZS5cbiAqIEBwYXJhbSBwYXRoT3JGaWxlIC0gVGhlIHBhdGggb3IgZmlsZSBvZiB0aGUgbm90ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIGB0cnVlYCBpZiB0aGUgbm90ZSBoYXMgYXQgbGVhc3Qgb25lIGFjdGl2ZSBsb2NrLCBgZmFsc2VgIG90aGVyd2lzZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzUmVzb3VyY2VMb2NrZWRGb3JQYXRoKGFwcDogQXBwLCBwYXRoT3JGaWxlOiBQYXRoT3JGaWxlKTogYm9vbGVhbiB7XG4gIHJldHVybiBnZXRNYW5hZ2VyKCkuaXNMb2NrZWQoYXBwLCBwYXRoT3JGaWxlKTtcbn1cblxuLyoqXG4gKiBMb2NrcyB0aGUgbm90ZSBhdCB0aGUgZ2l2ZW4gcGF0aCwgbWFraW5nIGl0IHJlYWQtb25seSBpbiBldmVyeSBjdXJyZW50IGFuZCBmdXR1cmVcbiAqIHtAbGluayBNYXJrZG93blZpZXd9IHVudGlsIHRoZSBsb2NrIGlzIHJlbGVhc2VkLCBhbmQgc2hvd2luZyBhIGxvY2sgaW5kaWNhdG9yIGluIHRoZSB0YWIgaGVhZGVyLFxuICogdmlldyBhY3Rpb24gYmFyLCBhbmQgKHdoaWxlIGFjdGl2ZSkgdGhlIHN0YXR1cyBiYXIuIFRoZSBpbmRpY2F0b3JzJyB0b29sdGlwIGxpc3RzIHRoZSBwbHVnaW5zXG4gKiB0aGF0IGN1cnJlbnRseSBob2xkIGEgbG9jayBvbiB0aGUgbm90ZS5cbiAqXG4gKiBUaGUgbG9jayBpcyByZWZlcmVuY2UtY291bnRlZCBwZXIgY2FsbGluZyBwbHVnaW46IGVhY2ggY2FsbCBtdXN0IGJlIGJhbGFuY2VkIGJ5IGV4YWN0bHkgb25lXG4gKiByZWxlYXNlIChlaXRoZXIgZGlzcG9zaW5nIHRoZSByZXR1cm5lZCB7QGxpbmsgRGlzcG9zYWJsZX0gXHUyMDE0IGlkZWFsbHkgdmlhIGEgYHVzaW5nYCBkZWNsYXJhdGlvbiBcdTIwMTQgb3JcbiAqIGEgbWF0Y2hpbmcge0BsaW5rIHVubG9ja1Jlc291cmNlRm9yUGF0aH0gY2FsbCkuXG4gKlxuICogQHBhcmFtIGFwcCAtIFRoZSBPYnNpZGlhbiBhcHAgaW5zdGFuY2UuXG4gKiBAcGFyYW0gcGF0aE9yRmlsZSAtIFRoZSBwYXRoIG9yIGZpbGUgb2YgdGhlIG5vdGUgdG8gbG9jay5cbiAqIEBwYXJhbSBwbHVnaW5JZCAtIFRoZSBpZCBvZiB0aGUgbG9ja2luZyBwbHVnaW4gKGUuZy4gaXRzIGBtYW5pZmVzdC5pZGApLiBUaGUgbG9jayBpcyBhdHRyaWJ1dGVkIHRvXG4gKiBpdCBmb3IgcmVmZXJlbmNlLWNvdW50aW5nIGFuZCB0aGUgaW5kaWNhdG9ycycgXCJsb2NrZWQgYnlcIiB0b29sdGlwLlxuICogQHJldHVybnMgQSB7QGxpbmsgRGlzcG9zYWJsZX0gdGhhdCByZWxlYXNlcyB0aGlzIGxvY2sgd2hlbiBkaXNwb3NlZC4gRGlzcG9zaW5nIG1vcmUgdGhhbiBvbmNlIGlzIGEgbm8tb3AuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBsb2NrUmVzb3VyY2VGb3JQYXRoKGFwcDogQXBwLCBwYXRoT3JGaWxlOiBQYXRoT3JGaWxlLCBwbHVnaW5JZDogc3RyaW5nKTogRGlzcG9zYWJsZSB7XG4gIHJldHVybiBnZXRNYW5hZ2VyKCkubG9jayhhcHAsIHBhdGhPckZpbGUsIHBsdWdpbklkKTtcbn1cblxuLyoqXG4gKiBSZXF1ZXN0cyBhbiB1bmxvY2sgb2YgdGhlIG5vdGUgYXQgdGhlIGdpdmVuIHBhdGggYnkgYWJvcnRpbmcgZXZlcnkge0BsaW5rIEFib3J0Q29udHJvbGxlcn0gdGhhdCB3YXNcbiAqIGFzc29jaWF0ZWQgd2l0aCBhIGxvY2sgb24gaXQgKHZpYSB7QGxpbmsgUmVzb3VyY2VMb2NrQ29tcG9uZW50LmxvY2tGb3JQYXRofSdzXG4gKiB7QGxpbmsgUmVzb3VyY2VMb2NrQ29tcG9uZW50TG9ja0ZvclBhdGhPcHRpb25zLmFib3J0Q29udHJvbGxlcn0pLiBUaGUgb3BlcmF0aW9ucyBob2xkaW5nIHRoZSBsb2NrXG4gKiBvYnNlcnZlIHRoZSBhYm9ydCBhbmQgcmVsZWFzZSB0aGVpciBvd24gbG9ja3MuIEEgbm8tb3Agd2hlbiBubyBhYm9ydGFibGUgbG9jayBpcyByZWdpc3RlcmVkIGZvciB0aGVcbiAqIHBhdGguXG4gKlxuICogVGhpcyBsZXRzIGEgY29uc3VtaW5nIHBsdWdpbiB3aXJlIGl0cyBvd24gXCJ1bmxvY2sgYWN0aXZlIG5vdGVcIiBjb21tYW5kIHdpdGhvdXQgcmVhY2hpbmcgaW50byB0aGVcbiAqIGxvY2sgbWFuYWdlciBkaXJlY3RseS5cbiAqXG4gKiBAcGFyYW0gYXBwIC0gVGhlIE9ic2lkaWFuIGFwcCBpbnN0YW5jZS5cbiAqIEBwYXJhbSBwYXRoT3JGaWxlIC0gVGhlIHBhdGggb3IgZmlsZSBvZiB0aGUgbm90ZSB0byByZXF1ZXN0IGFuIHVubG9jayBmb3IuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXF1ZXN0UmVzb3VyY2VVbmxvY2tGb3JQYXRoKGFwcDogQXBwLCBwYXRoT3JGaWxlOiBQYXRoT3JGaWxlKTogdm9pZCB7XG4gIGdldE1hbmFnZXIoKS5yZXF1ZXN0VW5sb2NrKGFwcCwgcGF0aE9yRmlsZSk7XG59XG5cbi8qKlxuICogUmVsZWFzZXMgb25lIGxvY2sgcHJldmlvdXNseSBhY3F1aXJlZCBmb3IgdGhlIG5vdGUgYXQgdGhlIGdpdmVuIHBhdGggdmlhIHtAbGluayBsb2NrUmVzb3VyY2VGb3JQYXRofS5cbiAqXG4gKiBXaGVuIHRoZSBsYXN0IGxvY2sgaXMgcmVsZWFzZWQgdGhlIG5vdGUgYmVjb21lcyBmdWxseSBlZGl0YWJsZSBhZ2FpbiBhbmQgaXRzIGxvY2sgaW5kaWNhdG9ycyBhcmVcbiAqIHJlbW92ZWQuIENhbGxpbmcgdGhpcyB3aGVuIHRoZSBub3RlIGlzIG5vdCBsb2NrZWQgaXMgYSBuby1vcC5cbiAqXG4gKiBAcGFyYW0gYXBwIC0gVGhlIE9ic2lkaWFuIGFwcCBpbnN0YW5jZS5cbiAqIEBwYXJhbSBwYXRoT3JGaWxlIC0gVGhlIHBhdGggb3IgZmlsZSBvZiB0aGUgbm90ZSB0byB1bmxvY2suXG4gKiBAcGFyYW0gcGx1Z2luSWQgLSBUaGUgaWQgb2YgdGhlIHBsdWdpbiB0aGF0IGhvbGRzIHRoZSBsb2NrIChlLmcuIGl0cyBgbWFuaWZlc3QuaWRgKTsgb25lIG9mIGl0c1xuICogbG9ja3Mgb24gdGhlIG5vdGUgaXMgcmVsZWFzZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1bmxvY2tSZXNvdXJjZUZvclBhdGgoYXBwOiBBcHAsIHBhdGhPckZpbGU6IFBhdGhPckZpbGUsIHBsdWdpbklkOiBzdHJpbmcpOiB2b2lkIHtcbiAgZ2V0TWFuYWdlcigpLnVubG9jayhhcHAsIHBhdGhPckZpbGUsIHBsdWdpbklkKTtcbn1cblxuZnVuY3Rpb24gZ2V0TWFuYWdlcigpOiBSZXNvdXJjZUxvY2tNYW5hZ2VyIHtcbiAgcmV0dXJuIGdldE9ic2lkaWFuRGV2VXRpbHNTdGF0ZTxSZXNvdXJjZUxvY2tNYW5hZ2VyPihSRVNPVVJDRV9MT0NLX1NUQVRFX0tFWSwgbmV3IFJlc291cmNlTG9ja01hbmFnZXIoKSkudmFsdWU7XG59XG4iXSwK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
|
|
@@ -34,13 +34,6 @@ export declare function buildCompileSvelte(): Promise<void>;
|
|
|
34
34
|
* re-runs the type-check in-memory with `skipLibCheck: false`, reporting only diagnostics from the
|
|
35
35
|
* files we own, so the declarations we author are still fully validated.
|
|
36
36
|
*
|
|
37
|
-
* When the `typescript-7` alias (`npm:typescript@7`, the native `tsgo` port) is installed, its faster
|
|
38
|
-
* compiler runs the `tsc --build` pass; otherwise the project's default `tsc` is used. The
|
|
39
|
-
* {@link validateProjectTypes} second pass runs on the `typescript-6` alias regardless (through
|
|
40
|
-
* {@link checkProjectTypes}, which imports the classic compiler API from `typescript-6`), since that
|
|
41
|
-
* API is unavailable in `typescript@7`. Using the distinctly-named alias keeps this pass working even
|
|
42
|
-
* when a consumer forces the bare `typescript` dependency to v7.
|
|
43
|
-
*
|
|
44
37
|
* @returns A {@link Promise} that resolves when the code compiles successfully.
|
|
45
38
|
* @throws If the project's own declarations fail validation.
|
|
46
39
|
*/
|
|
@@ -21,7 +21,6 @@ if you want to view the source, please visit the github repository of this plugi
|
|
|
21
21
|
globalThis.process = browserProcess;
|
|
22
22
|
})();
|
|
23
23
|
|
|
24
|
-
import { existsSync } from "node:fs";
|
|
25
24
|
import {
|
|
26
25
|
cp,
|
|
27
26
|
glob,
|
|
@@ -68,7 +67,7 @@ async function buildCompileSvelte() {
|
|
|
68
67
|
await execFromRoot(["npx", "svelte-check", "--tsconfig", ObsidianDevUtilsRepoPaths.TsConfigJson]);
|
|
69
68
|
}
|
|
70
69
|
async function buildCompileTypeScript() {
|
|
71
|
-
await execFromRoot([
|
|
70
|
+
await execFromRoot(["npx", "tsc", "--build", "--force"]);
|
|
72
71
|
if (!validateProjectTypes()) {
|
|
73
72
|
throw new Error("TypeScript declaration validation failed.");
|
|
74
73
|
}
|
|
@@ -88,14 +87,6 @@ async function buildTemplates() {
|
|
|
88
87
|
}
|
|
89
88
|
const TEMPLATE_FILE_SUFFIX = ".template";
|
|
90
89
|
const NODE_MODULES_SEGMENT = "/node_modules/";
|
|
91
|
-
const TYPESCRIPT_7_TSC_BIN_PATH = "node_modules/typescript-7/bin/tsc";
|
|
92
|
-
function getTypeScriptCompilerCommand() {
|
|
93
|
-
const typeScript7TscBinPath = resolvePathFromRootSafe({ path: TYPESCRIPT_7_TSC_BIN_PATH });
|
|
94
|
-
if (existsSync(typeScript7TscBinPath)) {
|
|
95
|
-
return ["node", typeScript7TscBinPath];
|
|
96
|
-
}
|
|
97
|
-
return ["npx", "tsc"];
|
|
98
|
-
}
|
|
99
90
|
function shouldKeepProjectFile(params) {
|
|
100
91
|
const { fileName, rootCanonical } = params;
|
|
101
92
|
return fileName.startsWith(`${rootCanonical}/`) && !fileName.includes(NODE_MODULES_SEGMENT);
|
|
@@ -120,4 +111,4 @@ export {
|
|
|
120
111
|
buildCompileTypeScript,
|
|
121
112
|
buildTemplates
|
|
122
113
|
};
|
|
123
|
-
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vc3JjL3NjcmlwdC11dGlscy9idWlsZC50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIFRoaXMgbW9kdWxlIHByb3ZpZGVzIHV0aWxpdHkgZnVuY3Rpb25zIHRvIGhhbmRsZSB0aGUgYnVpbGQgcHJvY2VzcyBmb3Igc3RhdGljIGFzc2V0cyBhbmQgY2xlYW5pbmdcbiAqIHRoZSBidWlsZCBvdXRwdXQgZm9sZGVyLiBJdCBpbmNsdWRlcyBmdW5jdGlvbnMgdG8gY29weSBzdGF0aWMgZmlsZXMgdG8gdGhlIGRpc3RyaWJ1dGlvbiBmb2xkZXJcbiAqIGFuZCB0byByZW1vdmUgdGhlIGV4aXN0aW5nIGJ1aWxkIG91dHB1dC5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7IFRzQ29uZmlnSnNvbiB9IGZyb20gJ3R5cGUtZmVzdCc7XG5cbmltcG9ydCB7IGV4aXN0c1N5bmMgfSBmcm9tICdub2RlOmZzJztcbmltcG9ydCB7XG4gIGNwLFxuICBnbG9iLFxuICBybVxufSBmcm9tICdub2RlOmZzL3Byb21pc2VzJztcblxuaW1wb3J0IHsgdG9BcnJheSB9IGZyb20gJy4uL2FzeW5jLnRzJztcbmltcG9ydCB7IGdldExpYkRlYnVnZ2VyIH0gZnJvbSAnLi4vZGVidWcudHMnO1xuaW1wb3J0IHsgam9pbiB9IGZyb20gJy4uL3BhdGgudHMnO1xuaW1wb3J0IHsgdHJpbVN0YXJ0IH0gZnJvbSAnLi4vc3RyaW5nLnRzJztcbmltcG9ydCB7XG4gIGNoZWNrUHJvamVjdFR5cGVzLFxuICBwYXJzZVRzQ29uZmlnLFxuICB0b0Nhbm9uaWNhbFxufSBmcm9tICcuL2NoZWNrLXByb2plY3QtdHlwZXMudHMnO1xuaW1wb3J0IHsgcmVhZGRpclBvc2l4IH0gZnJvbSAnLi9mcy50cyc7XG5pbXBvcnQgeyByZWFkSnNvbiB9IGZyb20gJy4vanNvbi50cyc7XG5pbXBvcnQgeyBucG1SdW5PcHRpb25hbCB9IGZyb20gJy4vbnBtLXJ1bi50cyc7XG5pbXBvcnQgeyBPYnNpZGlhbkRldlV0aWxzUmVwb1BhdGhzIH0gZnJvbSAnLi9vYnNpZGlhbi1kZXYtdXRpbHMtcmVwby1wYXRocy50cyc7XG5pbXBvcnQge1xuICBleGVjRnJvbVJvb3QsXG4gIGdldFJvb3RGb2xkZXIsXG4gIHJlc29sdmVQYXRoRnJvbVJvb3RTYWZlXG59IGZyb20gJy4vcm9vdC50cyc7XG5cbi8qKlxuICogUmVtb3ZlcyB0aGUgZGlzdHJpYnV0aW9uIGZvbGRlciBhbmQgaXRzIGNvbnRlbnRzLlxuICpcbiAqIFRoaXMgZnVuY3Rpb24gZGVsZXRlcyB0aGUgZW50aXJlIGRpc3RyaWJ1dGlvbiBmb2xkZXIgdG8gZW5zdXJlIGEgY2xlYW4gYnVpbGQgZW52aXJvbm1lbnQuXG4gKlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBmb2xkZXIgaGFzIGJlZW4gcmVtb3ZlZC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGJ1aWxkQ2xlYW4oKTogUHJvbWlzZTx2b2lkPiB7XG4gIGF3YWl0IHJtKE9ic2lkaWFuRGV2VXRpbHNSZXBvUGF0aHMuRGlzdCwgeyBmb3JjZTogdHJ1ZSwgcmVjdXJzaXZlOiB0cnVlIH0pO1xufVxuXG4vKipcbiAqIENvbXBpbGVzIHRoZSBjb2RlLlxuICpcbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgY29kZSBjb21waWxlcyBzdWNjZXNzZnVsbHkuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBidWlsZENvbXBpbGUoKTogUHJvbWlzZTx2b2lkPiB7XG4gIGlmICghYXdhaXQgbnBtUnVuT3B0aW9uYWwoJ2J1aWxkOmNvbXBpbGU6c3ZlbHRlJykpIHtcbiAgICBhd2FpdCBidWlsZENvbXBpbGVTdmVsdGUoKTtcbiAgfVxuICBpZiAoIWF3YWl0IG5wbVJ1bk9wdGlvbmFsKCdidWlsZDpjb21waWxlOnR5cGVzY3JpcHQnKSkge1xuICAgIGF3YWl0IGJ1aWxkQ29tcGlsZVR5cGVTY3JpcHQoKTtcbiAgfVxufVxuXG4vKipcbiAqIENvbXBpbGVzIHRoZSBTdmVsdGUgY29kZS5cbiAqXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIGNvZGUgY29tcGlsZXMgc3VjY2Vzc2Z1bGx5LlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gYnVpbGRDb21waWxlU3ZlbHRlKCk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCB0c0NvbmZpZ1BhdGggPSByZXNvbHZlUGF0aEZyb21Sb290U2FmZSh7IHBhdGg6IE9ic2lkaWFuRGV2VXRpbHNSZXBvUGF0aHMuVHNDb25maWdKc29uIH0pO1xuICBjb25zdCB0c0NvbmZpZyA9IGF3YWl0IHJlYWRKc29uPFRzQ29uZmlnSnNvbj4odHNDb25maWdQYXRoKTtcbiAgY29uc3QgYWxsRmlsZXMgPSBhd2FpdCB0b0FycmF5KGdsb2IodHNDb25maWcuaW5jbHVkZSA/PyBbXSwgeyBleGNsdWRlOiB0c0NvbmZpZy5leGNsdWRlID8/IFtdIH0pKTtcbiAgY29uc3Qgc3ZlbHRlRmlsZXMgPSBhbGxGaWxlcy5maWx0ZXIoKGZpbGUpID0+IGZpbGUuZW5kc1dpdGgoJy5zdmVsdGUnKSB8fCBmaWxlLmVuZHNXaXRoKCcuc3ZlbHRlLmpzJykgfHwgZmlsZS5lbmRzV2l0aCgnLnN2ZWx0ZS50cycpKTtcblxuICBpZiAoc3ZlbHRlRmlsZXMubGVuZ3RoID09PSAwKSB7XG4gICAgZ2V0TGliRGVidWdnZXIoJ2J1aWxkOmJ1aWxkQ29tcGlsZVN2ZWx0ZScpKCdObyBTdmVsdGUgZmlsZXMgZm91bmQgaW4gdGhlIHByb2plY3QsIHNraXBwaW5nIFN2ZWx0ZSBjb21waWxhdGlvbicpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGF3YWl0IGV4ZWNGcm9tUm9vdChbJ25weCcsICdzdmVsdGUtY2hlY2snLCAnLS10c2NvbmZpZycsIE9ic2lkaWFuRGV2VXRpbHNSZXBvUGF0aHMuVHNDb25maWdKc29uXSk7XG59XG5cbi8qKlxuICogQ29tcGlsZXMgdGhlIFR5cGVTY3JpcHQgY29kZS5cbiAqXG4gKiBUaGUgZ2VuZXJhbCBgdHNjYCBwYXNzIHJ1bnMgd2l0aCBgc2tpcExpYkNoZWNrOiB0cnVlYCAoY29uZmlndXJlZCBpbiBgdHNjb25maWcuanNvbmApIHNvIGl0IGRvZXNcbiAqIG5vdCBmYWlsIG9uIGJyb2tlbiB1cHN0cmVhbSBgLmQudHNgIGZpbGVzIHdlIGRvIG5vdCBjb250cm9sLiBBZnRlcndhcmRzLCB7QGxpbmsgdmFsaWRhdGVQcm9qZWN0VHlwZXN9XG4gKiByZS1ydW5zIHRoZSB0eXBlLWNoZWNrIGluLW1lbW9yeSB3aXRoIGBza2lwTGliQ2hlY2s6IGZhbHNlYCwgcmVwb3J0aW5nIG9ubHkgZGlhZ25vc3RpY3MgZnJvbSB0aGVcbiAqIGZpbGVzIHdlIG93biwgc28gdGhlIGRlY2xhcmF0aW9ucyB3ZSBhdXRob3IgYXJlIHN0aWxsIGZ1bGx5IHZhbGlkYXRlZC5cbiAqXG4gKiBXaGVuIHRoZSBgdHlwZXNjcmlwdC03YCBhbGlhcyAoYG5wbTp0eXBlc2NyaXB0QDdgLCB0aGUgbmF0aXZlIGB0c2dvYCBwb3J0KSBpcyBpbnN0YWxsZWQsIGl0cyBmYXN0ZXJcbiAqIGNvbXBpbGVyIHJ1bnMgdGhlIGB0c2MgLS1idWlsZGAgcGFzczsgb3RoZXJ3aXNlIHRoZSBwcm9qZWN0J3MgZGVmYXVsdCBgdHNjYCBpcyB1c2VkLiBUaGVcbiAqIHtAbGluayB2YWxpZGF0ZVByb2plY3RUeXBlc30gc2Vjb25kIHBhc3MgcnVucyBvbiB0aGUgYHR5cGVzY3JpcHQtNmAgYWxpYXMgcmVnYXJkbGVzcyAodGhyb3VnaFxuICoge0BsaW5rIGNoZWNrUHJvamVjdFR5cGVzfSwgd2hpY2ggaW1wb3J0cyB0aGUgY2xhc3NpYyBjb21waWxlciBBUEkgZnJvbSBgdHlwZXNjcmlwdC02YCksIHNpbmNlIHRoYXRcbiAqIEFQSSBpcyB1bmF2YWlsYWJsZSBpbiBgdHlwZXNjcmlwdEA3YC4gVXNpbmcgdGhlIGRpc3RpbmN0bHktbmFtZWQgYWxpYXMga2VlcHMgdGhpcyBwYXNzIHdvcmtpbmcgZXZlblxuICogd2hlbiBhIGNvbnN1bWVyIGZvcmNlcyB0aGUgYmFyZSBgdHlwZXNjcmlwdGAgZGVwZW5kZW5jeSB0byB2Ny5cbiAqXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIGNvZGUgY29tcGlsZXMgc3VjY2Vzc2Z1bGx5LlxuICogQHRocm93cyBJZiB0aGUgcHJvamVjdCdzIG93biBkZWNsYXJhdGlvbnMgZmFpbCB2YWxpZGF0aW9uLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gYnVpbGRDb21waWxlVHlwZVNjcmlwdCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgYXdhaXQgZXhlY0Zyb21Sb290KFsuLi5nZXRUeXBlU2NyaXB0Q29tcGlsZXJDb21tYW5kKCksICctLWJ1aWxkJywgJy0tZm9yY2UnXSk7XG5cbiAgaWYgKCF2YWxpZGF0ZVByb2plY3RUeXBlcygpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdUeXBlU2NyaXB0IGRlY2xhcmF0aW9uIHZhbGlkYXRpb24gZmFpbGVkLicpO1xuICB9XG59XG5cbi8qKlxuICogQ29waWVzIGFsbCB0ZW1wbGF0ZSBmaWxlcyBmcm9tIHRoZSB0ZW1wbGF0ZXMgZm9sZGVyIHRvIHRoZSBgdGVtcGxhdGVzYCBmb2xkZXIgd2l0aGluIHRoZVxuICogZGlzdHJpYnV0aW9uIGZvbGRlci5cbiAqXG4gKiBUaGlzIGZ1bmN0aW9uIHJlY3Vyc2l2ZWx5IHJlYWRzIHRoZSBjb250ZW50cyBvZiB0aGUgdGVtcGxhdGVzIGZvbGRlciBhbmQgY29waWVzIGVhY2ggZmlsZSB0byB0aGVcbiAqIGNvcnJlc3BvbmRpbmcgcGF0aCB1bmRlciB7QGxpbmsgT2JzaWRpYW5EZXZVdGlsc1JlcG9QYXRocy5EaXN0VGVtcGxhdGVzfSwgc28gY29uc3VtZXJzIGNhbiBjb3B5IHRoZVxuICogdGVtcGxhdGVzIGZyb20gYG5vZGVfbW9kdWxlcy9vYnNpZGlhbi1kZXYtdXRpbHMvZGlzdC90ZW1wbGF0ZXNgLiBBIHRyYWlsaW5nIGAudGVtcGxhdGVgIG9uIGEgc291cmNlXG4gKiBmaWxlIG5hbWUgaXMgc3RyaXBwZWQgaW4gdGhlIGRlc3RpbmF0aW9uIChlLmcuIGBlc2xpbnQuY29uZmlnLm10cy50ZW1wbGF0ZWAgaXMgY29waWVkIGFzXG4gKiBgZXNsaW50LmNvbmZpZy5tdHNgKSwgc28gYW4gYWN0aXZlIGNvbmZpZyB0ZW1wbGF0ZSBjYW4gbGl2ZSBpbiB0aGUgcmVwbyB1bmRlciBhIG5hbWUgdGhhdCB0aGVcbiAqIGNvcnJlc3BvbmRpbmcgdG9vbCBkb2VzIG5vdCBhdXRvLWRpc2NvdmVyLlxuICpcbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgd2hlbiBhbGwgZmlsZXMgaGF2ZSBiZWVuIGNvcGllZC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGJ1aWxkVGVtcGxhdGVzKCk6IFByb21pc2U8dm9pZD4ge1xuICBmb3IgKGNvbnN0IGRpcmVudCBvZiBhd2FpdCByZWFkZGlyUG9zaXgoT2JzaWRpYW5EZXZVdGlsc1JlcG9QYXRocy5UZW1wbGF0ZXMsIHsgcmVjdXJzaXZlOiB0cnVlLCB3aXRoRmlsZVR5cGVzOiB0cnVlIH0pKSB7XG4gICAgaWYgKCFkaXJlbnQuaXNGaWxlKCkpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGNvbnN0IHBhdGggPSB0cmltU3RhcnQoe1xuICAgICAgcHJlZml4OiBgJHtPYnNpZGlhbkRldlV0aWxzUmVwb1BhdGhzLlRlbXBsYXRlc30vYCxcbiAgICAgIHN0cjogam9pbihkaXJlbnQucGFyZW50UGF0aCwgZGlyZW50Lm5hbWUpXG4gICAgfSk7XG4gICAgY29uc3QgZGVzdGluYXRpb25QYXRoID0gcGF0aC5lbmRzV2l0aChURU1QTEFURV9GSUxFX1NVRkZJWCkgPyBwYXRoLnNsaWNlKDAsIC1URU1QTEFURV9GSUxFX1NVRkZJWC5sZW5ndGgpIDogcGF0aDtcbiAgICBhd2FpdCBjcChqb2luKE9ic2lkaWFuRGV2VXRpbHNSZXBvUGF0aHMuVGVtcGxhdGVzLCBwYXRoKSwgam9pbihPYnNpZGlhbkRldlV0aWxzUmVwb1BhdGhzLkRpc3RUZW1wbGF0ZXMsIGRlc3RpbmF0aW9uUGF0aCkpO1xuICB9XG59XG5cbmNvbnN0IFRFTVBMQVRFX0ZJTEVfU1VGRklYID0gJy50ZW1wbGF0ZSc7XG5cbmNvbnN0IE5PREVfTU9EVUxFU19TRUdNRU5UID0gJy9ub2RlX21vZHVsZXMvJztcblxuY29uc3QgVFlQRVNDUklQVF83X1RTQ19CSU5fUEFUSCA9ICdub2RlX21vZHVsZXMvdHlwZXNjcmlwdC03L2Jpbi90c2MnO1xuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayBzaG91bGRLZWVwUHJvamVjdEZpbGV9LlxuICovXG5pbnRlcmZhY2UgU2hvdWxkS2VlcFByb2plY3RGaWxlUGFyYW1zIHtcbiAgLyoqXG4gICAqIEFic29sdXRlIHBhdGggb2YgdGhlIGZpbGUgdW5kZXIgY29uc2lkZXJhdGlvbi5cbiAgICovXG4gIHJlYWRvbmx5IGZpbGVOYW1lOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEFic29sdXRlIChjYW5vbmljYWwpIHBhdGggb2YgdGhlIHByb2plY3Qgcm9vdC5cbiAgICovXG4gIHJlYWRvbmx5IHJvb3RDYW5vbmljYWw6IHN0cmluZztcbn1cblxuLyoqXG4gKiBSZXNvbHZlcyB0aGUgY29tbWFuZCB1c2VkIHRvIHJ1biB0aGUgYHRzYyAtLWJ1aWxkYCBwYXNzLiBQcmVmZXJzIHRoZSBgdHlwZXNjcmlwdC03YCBhbGlhc1xuICogKGBucG06dHlwZXNjcmlwdEA3YCwgdGhlIG5hdGl2ZSBgdHNnb2AgcG9ydCkgd2hlbiBpdCBpcyBpbnN0YWxsZWQsIGZhbGxpbmcgYmFjayB0byB0aGUgcHJvamVjdCdzXG4gKiBkZWZhdWx0IGB0c2NgLlxuICpcbiAqIEByZXR1cm5zIFRoZSBjb21tYW5kIGFyZ3VtZW50IGxpc3QgKHdpdGhvdXQgdGhlIHRyYWlsaW5nIGB0c2NgIGZsYWdzKS5cbiAqL1xuZnVuY3Rpb24gZ2V0VHlwZVNjcmlwdENvbXBpbGVyQ29tbWFuZCgpOiBzdHJpbmdbXSB7XG4gIGNvbnN0IHR5cGVTY3JpcHQ3VHNjQmluUGF0aCA9IHJlc29sdmVQYXRoRnJvbVJvb3RTYWZlKHsgcGF0aDogVFlQRVNDUklQVF83X1RTQ19CSU5fUEFUSCB9KTtcbiAgaWYgKGV4aXN0c1N5bmModHlwZVNjcmlwdDdUc2NCaW5QYXRoKSkge1xuICAgIHJldHVybiBbJ25vZGUnLCB0eXBlU2NyaXB0N1RzY0JpblBhdGhdO1xuICB9XG5cbiAgcmV0dXJuIFsnbnB4JywgJ3RzYyddO1xufVxuXG4vKipcbiAqIERldGVybWluZXMgd2hldGhlciBhIGZpbGUgYmVsb25ncyB0byB0aGUgcHJvamVjdCAodW5kZXIgdGhlIHJvb3QgZm9sZGVyLCBvdXRzaWRlIGBub2RlX21vZHVsZXNgKS5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIHRoZSBjaGVjay5cbiAqIEByZXR1cm5zIGB0cnVlYCB3aGVuIHRoZSBmaWxlIGJlbG9uZ3MgdG8gdGhlIHByb2plY3QuXG4gKi9cbmZ1bmN0aW9uIHNob3VsZEtlZXBQcm9qZWN0RmlsZShwYXJhbXM6IFNob3VsZEtlZXBQcm9qZWN0RmlsZVBhcmFtcyk6IGJvb2xlYW4ge1xuICBjb25zdCB7IGZpbGVOYW1lLCByb290Q2Fub25pY2FsIH0gPSBwYXJhbXM7XG4gIHJldHVybiBmaWxlTmFtZS5zdGFydHNXaXRoKGAke3Jvb3RDYW5vbmljYWx9L2ApICYmICFmaWxlTmFtZS5pbmNsdWRlcyhOT0RFX01PRFVMRVNfU0VHTUVOVCk7XG59XG5cbi8qKlxuICogUmUtcnVucyB0aGUgcHJvamVjdCB0eXBlLWNoZWNrIGluLW1lbW9yeSB3aXRoIGBza2lwTGliQ2hlY2s6IGZhbHNlYCwgcmVwb3J0aW5nIG9ubHkgZGlhZ25vc3RpY3NcbiAqIHdob3NlIHNvdXJjZSBmaWxlIGJlbG9uZ3MgdG8gdGhlIHByb2plY3QgKHVuZGVyIHRoZSByb290IGZvbGRlciwgb3V0c2lkZSBgbm9kZV9tb2R1bGVzYCkuXG4gKlxuICogQHJldHVybnMgYHRydWVgIHdoZW4gdGhlIHByb2plY3QncyBvd24gZmlsZXMgaGF2ZSBubyB0eXBlIGVycm9ycywgYGZhbHNlYCBvdGhlcndpc2UuXG4gKiBAdGhyb3dzIElmIHRoZSByb290IGZvbGRlciBjYW5ub3QgYmUgZm91bmQuXG4gKi9cbmZ1bmN0aW9uIHZhbGlkYXRlUHJvamVjdFR5cGVzKCk6IGJvb2xlYW4ge1xuICBjb25zdCByb290ID0gZ2V0Um9vdEZvbGRlcigpO1xuXG4gIGlmICghcm9vdCkge1xuICAgIHRocm93IG5ldyBFcnJvcignQ291bGQgbm90IGZpbmQgcm9vdCBmb2xkZXInKTtcbiAgfVxuXG4gIGNvbnN0IHJvb3RDYW5vbmljYWwgPSB0b0Nhbm9uaWNhbChyb290KTtcbiAgY29uc3QgeyBmaWxlTmFtZXMsIG9wdGlvbnMgfSA9IHBhcnNlVHNDb25maWcoam9pbihyb290LCBPYnNpZGlhbkRldlV0aWxzUmVwb1BhdGhzLlRzQ29uZmlnSnNvbikpO1xuXG4gIHJldHVybiBjaGVja1Byb2plY3RUeXBlcyh7XG4gICAgb3B0aW9ucyxcbiAgICByb290TmFtZXM6IGZpbGVOYW1lcyxcbiAgICBzaG91bGRLZWVwRmlsZTogKGZpbGVOYW1lKSA9PiBzaG91bGRLZWVwUHJvamVjdEZpbGUoeyBmaWxlTmFtZSwgcm9vdENhbm9uaWNhbCB9KVxuICB9KTtcbn1cbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBVUEsU0FBUyxrQkFBa0I7QUFDM0I7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBRVAsU0FBUyxlQUFlO0FBQ3hCLFNBQVMsc0JBQXNCO0FBQy9CLFNBQVMsWUFBWTtBQUNyQixTQUFTLGlCQUFpQjtBQUMxQjtBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLE9BQ0s7QUFDUCxTQUFTLG9CQUFvQjtBQUM3QixTQUFTLGdCQUFnQjtBQUN6QixTQUFTLHNCQUFzQjtBQUMvQixTQUFTLGlDQUFpQztBQUMxQztBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLE9BQ0s7QUFTUCxlQUFzQixhQUE0QjtBQUNoRCxRQUFNLEdBQUcsMEJBQTBCLE1BQU0sRUFBRSxPQUFPLE1BQU0sV0FBVyxLQUFLLENBQUM7QUFDM0U7QUFPQSxlQUFzQixlQUE4QjtBQUNsRCxNQUFJLENBQUMsTUFBTSxlQUFlLHNCQUFzQixHQUFHO0FBQ2pELFVBQU0sbUJBQW1CO0FBQUEsRUFDM0I7QUFDQSxNQUFJLENBQUMsTUFBTSxlQUFlLDBCQUEwQixHQUFHO0FBQ3JELFVBQU0sdUJBQXVCO0FBQUEsRUFDL0I7QUFDRjtBQU9BLGVBQXNCLHFCQUFvQztBQUN4RCxRQUFNLGVBQWUsd0JBQXdCLEVBQUUsTUFBTSwwQkFBMEIsYUFBYSxDQUFDO0FBQzdGLFFBQU0sV0FBVyxNQUFNLFNBQXVCLFlBQVk7QUFDMUQsUUFBTSxXQUFXLE1BQU0sUUFBUSxLQUFLLFNBQVMsV0FBVyxDQUFDLEdBQUcsRUFBRSxTQUFTLFNBQVMsV0FBVyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQ2hHLFFBQU0sY0FBYyxTQUFTLE9BQU8sQ0FBQyxTQUFTLEtBQUssU0FBUyxTQUFTLEtBQUssS0FBSyxTQUFTLFlBQVksS0FBSyxLQUFLLFNBQVMsWUFBWSxDQUFDO0FBRXBJLE1BQUksWUFBWSxXQUFXLEdBQUc7QUFDNUIsbUJBQWUsMEJBQTBCLEVBQUUsbUVBQW1FO0FBQzlHO0FBQUEsRUFDRjtBQUVBLFFBQU0sYUFBYSxDQUFDLE9BQU8sZ0JBQWdCLGNBQWMsMEJBQTBCLFlBQVksQ0FBQztBQUNsRztBQW9CQSxlQUFzQix5QkFBd0M7QUFDNUQsUUFBTSxhQUFhLENBQUMsR0FBRyw2QkFBNkIsR0FBRyxXQUFXLFNBQVMsQ0FBQztBQUU1RSxNQUFJLENBQUMscUJBQXFCLEdBQUc7QUFDM0IsVUFBTSxJQUFJLE1BQU0sMkNBQTJDO0FBQUEsRUFDN0Q7QUFDRjtBQWVBLGVBQXNCLGlCQUFnQztBQUNwRCxhQUFXLFVBQVUsTUFBTSxhQUFhLDBCQUEwQixXQUFXLEVBQUUsV0FBVyxNQUFNLGVBQWUsS0FBSyxDQUFDLEdBQUc7QUFDdEgsUUFBSSxDQUFDLE9BQU8sT0FBTyxHQUFHO0FBQ3BCO0FBQUEsSUFDRjtBQUVBLFVBQU0sT0FBTyxVQUFVO0FBQUEsTUFDckIsUUFBUSxHQUFHLDBCQUEwQixTQUFTO0FBQUEsTUFDOUMsS0FBSyxLQUFLLE9BQU8sWUFBWSxPQUFPLElBQUk7QUFBQSxJQUMxQyxDQUFDO0FBQ0QsVUFBTSxrQkFBa0IsS0FBSyxTQUFTLG9CQUFvQixJQUFJLEtBQUssTUFBTSxHQUFHLENBQUMscUJBQXFCLE1BQU0sSUFBSTtBQUM1RyxVQUFNLEdBQUcsS0FBSywwQkFBMEIsV0FBVyxJQUFJLEdBQUcsS0FBSywwQkFBMEIsZUFBZSxlQUFlLENBQUM7QUFBQSxFQUMxSDtBQUNGO0FBRUEsTUFBTSx1QkFBdUI7QUFFN0IsTUFBTSx1QkFBdUI7QUFFN0IsTUFBTSw0QkFBNEI7QUF3QmxDLFNBQVMsK0JBQXlDO0FBQ2hELFFBQU0sd0JBQXdCLHdCQUF3QixFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDekYsTUFBSSxXQUFXLHFCQUFxQixHQUFHO0FBQ3JDLFdBQU8sQ0FBQyxRQUFRLHFCQUFxQjtBQUFBLEVBQ3ZDO0FBRUEsU0FBTyxDQUFDLE9BQU8sS0FBSztBQUN0QjtBQVFBLFNBQVMsc0JBQXNCLFFBQThDO0FBQzNFLFFBQU0sRUFBRSxVQUFVLGNBQWMsSUFBSTtBQUNwQyxTQUFPLFNBQVMsV0FBVyxHQUFHLGFBQWEsR0FBRyxLQUFLLENBQUMsU0FBUyxTQUFTLG9CQUFvQjtBQUM1RjtBQVNBLFNBQVMsdUJBQWdDO0FBQ3ZDLFFBQU0sT0FBTyxjQUFjO0FBRTNCLE1BQUksQ0FBQyxNQUFNO0FBQ1QsVUFBTSxJQUFJLE1BQU0sNEJBQTRCO0FBQUEsRUFDOUM7QUFFQSxRQUFNLGdCQUFnQixZQUFZLElBQUk7QUFDdEMsUUFBTSxFQUFFLFdBQVcsUUFBUSxJQUFJLGNBQWMsS0FBSyxNQUFNLDBCQUEwQixZQUFZLENBQUM7QUFFL0YsU0FBTyxrQkFBa0I7QUFBQSxJQUN2QjtBQUFBLElBQ0EsV0FBVztBQUFBLElBQ1gsZ0JBQWdCLENBQUMsYUFBYSxzQkFBc0IsRUFBRSxVQUFVLGNBQWMsQ0FBQztBQUFBLEVBQ2pGLENBQUM7QUFDSDsiLAogICJuYW1lcyI6IFtdCn0K
|
|
114
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vc3JjL3NjcmlwdC11dGlscy9idWlsZC50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIFRoaXMgbW9kdWxlIHByb3ZpZGVzIHV0aWxpdHkgZnVuY3Rpb25zIHRvIGhhbmRsZSB0aGUgYnVpbGQgcHJvY2VzcyBmb3Igc3RhdGljIGFzc2V0cyBhbmQgY2xlYW5pbmdcbiAqIHRoZSBidWlsZCBvdXRwdXQgZm9sZGVyLiBJdCBpbmNsdWRlcyBmdW5jdGlvbnMgdG8gY29weSBzdGF0aWMgZmlsZXMgdG8gdGhlIGRpc3RyaWJ1dGlvbiBmb2xkZXJcbiAqIGFuZCB0byByZW1vdmUgdGhlIGV4aXN0aW5nIGJ1aWxkIG91dHB1dC5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7IFRzQ29uZmlnSnNvbiB9IGZyb20gJ3R5cGUtZmVzdCc7XG5cbmltcG9ydCB7XG4gIGNwLFxuICBnbG9iLFxuICBybVxufSBmcm9tICdub2RlOmZzL3Byb21pc2VzJztcblxuaW1wb3J0IHsgdG9BcnJheSB9IGZyb20gJy4uL2FzeW5jLnRzJztcbmltcG9ydCB7IGdldExpYkRlYnVnZ2VyIH0gZnJvbSAnLi4vZGVidWcudHMnO1xuaW1wb3J0IHsgam9pbiB9IGZyb20gJy4uL3BhdGgudHMnO1xuaW1wb3J0IHsgdHJpbVN0YXJ0IH0gZnJvbSAnLi4vc3RyaW5nLnRzJztcbmltcG9ydCB7XG4gIGNoZWNrUHJvamVjdFR5cGVzLFxuICBwYXJzZVRzQ29uZmlnLFxuICB0b0Nhbm9uaWNhbFxufSBmcm9tICcuL2NoZWNrLXByb2plY3QtdHlwZXMudHMnO1xuaW1wb3J0IHsgcmVhZGRpclBvc2l4IH0gZnJvbSAnLi9mcy50cyc7XG5pbXBvcnQgeyByZWFkSnNvbiB9IGZyb20gJy4vanNvbi50cyc7XG5pbXBvcnQgeyBucG1SdW5PcHRpb25hbCB9IGZyb20gJy4vbnBtLXJ1bi50cyc7XG5pbXBvcnQgeyBPYnNpZGlhbkRldlV0aWxzUmVwb1BhdGhzIH0gZnJvbSAnLi9vYnNpZGlhbi1kZXYtdXRpbHMtcmVwby1wYXRocy50cyc7XG5pbXBvcnQge1xuICBleGVjRnJvbVJvb3QsXG4gIGdldFJvb3RGb2xkZXIsXG4gIHJlc29sdmVQYXRoRnJvbVJvb3RTYWZlXG59IGZyb20gJy4vcm9vdC50cyc7XG5cbi8qKlxuICogUmVtb3ZlcyB0aGUgZGlzdHJpYnV0aW9uIGZvbGRlciBhbmQgaXRzIGNvbnRlbnRzLlxuICpcbiAqIFRoaXMgZnVuY3Rpb24gZGVsZXRlcyB0aGUgZW50aXJlIGRpc3RyaWJ1dGlvbiBmb2xkZXIgdG8gZW5zdXJlIGEgY2xlYW4gYnVpbGQgZW52aXJvbm1lbnQuXG4gKlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBmb2xkZXIgaGFzIGJlZW4gcmVtb3ZlZC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGJ1aWxkQ2xlYW4oKTogUHJvbWlzZTx2b2lkPiB7XG4gIGF3YWl0IHJtKE9ic2lkaWFuRGV2VXRpbHNSZXBvUGF0aHMuRGlzdCwgeyBmb3JjZTogdHJ1ZSwgcmVjdXJzaXZlOiB0cnVlIH0pO1xufVxuXG4vKipcbiAqIENvbXBpbGVzIHRoZSBjb2RlLlxuICpcbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgY29kZSBjb21waWxlcyBzdWNjZXNzZnVsbHkuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBidWlsZENvbXBpbGUoKTogUHJvbWlzZTx2b2lkPiB7XG4gIGlmICghYXdhaXQgbnBtUnVuT3B0aW9uYWwoJ2J1aWxkOmNvbXBpbGU6c3ZlbHRlJykpIHtcbiAgICBhd2FpdCBidWlsZENvbXBpbGVTdmVsdGUoKTtcbiAgfVxuICBpZiAoIWF3YWl0IG5wbVJ1bk9wdGlvbmFsKCdidWlsZDpjb21waWxlOnR5cGVzY3JpcHQnKSkge1xuICAgIGF3YWl0IGJ1aWxkQ29tcGlsZVR5cGVTY3JpcHQoKTtcbiAgfVxufVxuXG4vKipcbiAqIENvbXBpbGVzIHRoZSBTdmVsdGUgY29kZS5cbiAqXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIGNvZGUgY29tcGlsZXMgc3VjY2Vzc2Z1bGx5LlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gYnVpbGRDb21waWxlU3ZlbHRlKCk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCB0c0NvbmZpZ1BhdGggPSByZXNvbHZlUGF0aEZyb21Sb290U2FmZSh7IHBhdGg6IE9ic2lkaWFuRGV2VXRpbHNSZXBvUGF0aHMuVHNDb25maWdKc29uIH0pO1xuICBjb25zdCB0c0NvbmZpZyA9IGF3YWl0IHJlYWRKc29uPFRzQ29uZmlnSnNvbj4odHNDb25maWdQYXRoKTtcbiAgY29uc3QgYWxsRmlsZXMgPSBhd2FpdCB0b0FycmF5KGdsb2IodHNDb25maWcuaW5jbHVkZSA/PyBbXSwgeyBleGNsdWRlOiB0c0NvbmZpZy5leGNsdWRlID8/IFtdIH0pKTtcbiAgY29uc3Qgc3ZlbHRlRmlsZXMgPSBhbGxGaWxlcy5maWx0ZXIoKGZpbGUpID0+IGZpbGUuZW5kc1dpdGgoJy5zdmVsdGUnKSB8fCBmaWxlLmVuZHNXaXRoKCcuc3ZlbHRlLmpzJykgfHwgZmlsZS5lbmRzV2l0aCgnLnN2ZWx0ZS50cycpKTtcblxuICBpZiAoc3ZlbHRlRmlsZXMubGVuZ3RoID09PSAwKSB7XG4gICAgZ2V0TGliRGVidWdnZXIoJ2J1aWxkOmJ1aWxkQ29tcGlsZVN2ZWx0ZScpKCdObyBTdmVsdGUgZmlsZXMgZm91bmQgaW4gdGhlIHByb2plY3QsIHNraXBwaW5nIFN2ZWx0ZSBjb21waWxhdGlvbicpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGF3YWl0IGV4ZWNGcm9tUm9vdChbJ25weCcsICdzdmVsdGUtY2hlY2snLCAnLS10c2NvbmZpZycsIE9ic2lkaWFuRGV2VXRpbHNSZXBvUGF0aHMuVHNDb25maWdKc29uXSk7XG59XG5cbi8qKlxuICogQ29tcGlsZXMgdGhlIFR5cGVTY3JpcHQgY29kZS5cbiAqXG4gKiBUaGUgZ2VuZXJhbCBgdHNjYCBwYXNzIHJ1bnMgd2l0aCBgc2tpcExpYkNoZWNrOiB0cnVlYCAoY29uZmlndXJlZCBpbiBgdHNjb25maWcuanNvbmApIHNvIGl0IGRvZXNcbiAqIG5vdCBmYWlsIG9uIGJyb2tlbiB1cHN0cmVhbSBgLmQudHNgIGZpbGVzIHdlIGRvIG5vdCBjb250cm9sLiBBZnRlcndhcmRzLCB7QGxpbmsgdmFsaWRhdGVQcm9qZWN0VHlwZXN9XG4gKiByZS1ydW5zIHRoZSB0eXBlLWNoZWNrIGluLW1lbW9yeSB3aXRoIGBza2lwTGliQ2hlY2s6IGZhbHNlYCwgcmVwb3J0aW5nIG9ubHkgZGlhZ25vc3RpY3MgZnJvbSB0aGVcbiAqIGZpbGVzIHdlIG93biwgc28gdGhlIGRlY2xhcmF0aW9ucyB3ZSBhdXRob3IgYXJlIHN0aWxsIGZ1bGx5IHZhbGlkYXRlZC5cbiAqXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIGNvZGUgY29tcGlsZXMgc3VjY2Vzc2Z1bGx5LlxuICogQHRocm93cyBJZiB0aGUgcHJvamVjdCdzIG93biBkZWNsYXJhdGlvbnMgZmFpbCB2YWxpZGF0aW9uLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gYnVpbGRDb21waWxlVHlwZVNjcmlwdCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgYXdhaXQgZXhlY0Zyb21Sb290KFsnbnB4JywgJ3RzYycsICctLWJ1aWxkJywgJy0tZm9yY2UnXSk7XG5cbiAgaWYgKCF2YWxpZGF0ZVByb2plY3RUeXBlcygpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdUeXBlU2NyaXB0IGRlY2xhcmF0aW9uIHZhbGlkYXRpb24gZmFpbGVkLicpO1xuICB9XG59XG5cbi8qKlxuICogQ29waWVzIGFsbCB0ZW1wbGF0ZSBmaWxlcyBmcm9tIHRoZSB0ZW1wbGF0ZXMgZm9sZGVyIHRvIHRoZSBgdGVtcGxhdGVzYCBmb2xkZXIgd2l0aGluIHRoZVxuICogZGlzdHJpYnV0aW9uIGZvbGRlci5cbiAqXG4gKiBUaGlzIGZ1bmN0aW9uIHJlY3Vyc2l2ZWx5IHJlYWRzIHRoZSBjb250ZW50cyBvZiB0aGUgdGVtcGxhdGVzIGZvbGRlciBhbmQgY29waWVzIGVhY2ggZmlsZSB0byB0aGVcbiAqIGNvcnJlc3BvbmRpbmcgcGF0aCB1bmRlciB7QGxpbmsgT2JzaWRpYW5EZXZVdGlsc1JlcG9QYXRocy5EaXN0VGVtcGxhdGVzfSwgc28gY29uc3VtZXJzIGNhbiBjb3B5IHRoZVxuICogdGVtcGxhdGVzIGZyb20gYG5vZGVfbW9kdWxlcy9vYnNpZGlhbi1kZXYtdXRpbHMvZGlzdC90ZW1wbGF0ZXNgLiBBIHRyYWlsaW5nIGAudGVtcGxhdGVgIG9uIGEgc291cmNlXG4gKiBmaWxlIG5hbWUgaXMgc3RyaXBwZWQgaW4gdGhlIGRlc3RpbmF0aW9uIChlLmcuIGBlc2xpbnQuY29uZmlnLm10cy50ZW1wbGF0ZWAgaXMgY29waWVkIGFzXG4gKiBgZXNsaW50LmNvbmZpZy5tdHNgKSwgc28gYW4gYWN0aXZlIGNvbmZpZyB0ZW1wbGF0ZSBjYW4gbGl2ZSBpbiB0aGUgcmVwbyB1bmRlciBhIG5hbWUgdGhhdCB0aGVcbiAqIGNvcnJlc3BvbmRpbmcgdG9vbCBkb2VzIG5vdCBhdXRvLWRpc2NvdmVyLlxuICpcbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgd2hlbiBhbGwgZmlsZXMgaGF2ZSBiZWVuIGNvcGllZC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGJ1aWxkVGVtcGxhdGVzKCk6IFByb21pc2U8dm9pZD4ge1xuICBmb3IgKGNvbnN0IGRpcmVudCBvZiBhd2FpdCByZWFkZGlyUG9zaXgoT2JzaWRpYW5EZXZVdGlsc1JlcG9QYXRocy5UZW1wbGF0ZXMsIHsgcmVjdXJzaXZlOiB0cnVlLCB3aXRoRmlsZVR5cGVzOiB0cnVlIH0pKSB7XG4gICAgaWYgKCFkaXJlbnQuaXNGaWxlKCkpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGNvbnN0IHBhdGggPSB0cmltU3RhcnQoe1xuICAgICAgcHJlZml4OiBgJHtPYnNpZGlhbkRldlV0aWxzUmVwb1BhdGhzLlRlbXBsYXRlc30vYCxcbiAgICAgIHN0cjogam9pbihkaXJlbnQucGFyZW50UGF0aCwgZGlyZW50Lm5hbWUpXG4gICAgfSk7XG4gICAgY29uc3QgZGVzdGluYXRpb25QYXRoID0gcGF0aC5lbmRzV2l0aChURU1QTEFURV9GSUxFX1NVRkZJWCkgPyBwYXRoLnNsaWNlKDAsIC1URU1QTEFURV9GSUxFX1NVRkZJWC5sZW5ndGgpIDogcGF0aDtcbiAgICBhd2FpdCBjcChqb2luKE9ic2lkaWFuRGV2VXRpbHNSZXBvUGF0aHMuVGVtcGxhdGVzLCBwYXRoKSwgam9pbihPYnNpZGlhbkRldlV0aWxzUmVwb1BhdGhzLkRpc3RUZW1wbGF0ZXMsIGRlc3RpbmF0aW9uUGF0aCkpO1xuICB9XG59XG5cbmNvbnN0IFRFTVBMQVRFX0ZJTEVfU1VGRklYID0gJy50ZW1wbGF0ZSc7XG5cbmNvbnN0IE5PREVfTU9EVUxFU19TRUdNRU5UID0gJy9ub2RlX21vZHVsZXMvJztcblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgc2hvdWxkS2VlcFByb2plY3RGaWxlfS5cbiAqL1xuaW50ZXJmYWNlIFNob3VsZEtlZXBQcm9qZWN0RmlsZVBhcmFtcyB7XG4gIC8qKlxuICAgKiBBYnNvbHV0ZSBwYXRoIG9mIHRoZSBmaWxlIHVuZGVyIGNvbnNpZGVyYXRpb24uXG4gICAqL1xuICByZWFkb25seSBmaWxlTmFtZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBYnNvbHV0ZSAoY2Fub25pY2FsKSBwYXRoIG9mIHRoZSBwcm9qZWN0IHJvb3QuXG4gICAqL1xuICByZWFkb25seSByb290Q2Fub25pY2FsOiBzdHJpbmc7XG59XG5cbi8qKlxuICogRGV0ZXJtaW5lcyB3aGV0aGVyIGEgZmlsZSBiZWxvbmdzIHRvIHRoZSBwcm9qZWN0ICh1bmRlciB0aGUgcm9vdCBmb2xkZXIsIG91dHNpZGUgYG5vZGVfbW9kdWxlc2ApLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgcGFyYW1ldGVycyBmb3IgdGhlIGNoZWNrLlxuICogQHJldHVybnMgYHRydWVgIHdoZW4gdGhlIGZpbGUgYmVsb25ncyB0byB0aGUgcHJvamVjdC5cbiAqL1xuZnVuY3Rpb24gc2hvdWxkS2VlcFByb2plY3RGaWxlKHBhcmFtczogU2hvdWxkS2VlcFByb2plY3RGaWxlUGFyYW1zKTogYm9vbGVhbiB7XG4gIGNvbnN0IHsgZmlsZU5hbWUsIHJvb3RDYW5vbmljYWwgfSA9IHBhcmFtcztcbiAgcmV0dXJuIGZpbGVOYW1lLnN0YXJ0c1dpdGgoYCR7cm9vdENhbm9uaWNhbH0vYCkgJiYgIWZpbGVOYW1lLmluY2x1ZGVzKE5PREVfTU9EVUxFU19TRUdNRU5UKTtcbn1cblxuLyoqXG4gKiBSZS1ydW5zIHRoZSBwcm9qZWN0IHR5cGUtY2hlY2sgaW4tbWVtb3J5IHdpdGggYHNraXBMaWJDaGVjazogZmFsc2VgLCByZXBvcnRpbmcgb25seSBkaWFnbm9zdGljc1xuICogd2hvc2Ugc291cmNlIGZpbGUgYmVsb25ncyB0byB0aGUgcHJvamVjdCAodW5kZXIgdGhlIHJvb3QgZm9sZGVyLCBvdXRzaWRlIGBub2RlX21vZHVsZXNgKS5cbiAqXG4gKiBAcmV0dXJucyBgdHJ1ZWAgd2hlbiB0aGUgcHJvamVjdCdzIG93biBmaWxlcyBoYXZlIG5vIHR5cGUgZXJyb3JzLCBgZmFsc2VgIG90aGVyd2lzZS5cbiAqIEB0aHJvd3MgSWYgdGhlIHJvb3QgZm9sZGVyIGNhbm5vdCBiZSBmb3VuZC5cbiAqL1xuZnVuY3Rpb24gdmFsaWRhdGVQcm9qZWN0VHlwZXMoKTogYm9vbGVhbiB7XG4gIGNvbnN0IHJvb3QgPSBnZXRSb290Rm9sZGVyKCk7XG5cbiAgaWYgKCFyb290KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdDb3VsZCBub3QgZmluZCByb290IGZvbGRlcicpO1xuICB9XG5cbiAgY29uc3Qgcm9vdENhbm9uaWNhbCA9IHRvQ2Fub25pY2FsKHJvb3QpO1xuICBjb25zdCB7IGZpbGVOYW1lcywgb3B0aW9ucyB9ID0gcGFyc2VUc0NvbmZpZyhqb2luKHJvb3QsIE9ic2lkaWFuRGV2VXRpbHNSZXBvUGF0aHMuVHNDb25maWdKc29uKSk7XG5cbiAgcmV0dXJuIGNoZWNrUHJvamVjdFR5cGVzKHtcbiAgICBvcHRpb25zLFxuICAgIHJvb3ROYW1lczogZmlsZU5hbWVzLFxuICAgIHNob3VsZEtlZXBGaWxlOiAoZmlsZU5hbWUpID0+IHNob3VsZEtlZXBQcm9qZWN0RmlsZSh7IGZpbGVOYW1lLCByb290Q2Fub25pY2FsIH0pXG4gIH0pO1xufVxuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFVQTtBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLE9BQ0s7QUFFUCxTQUFTLGVBQWU7QUFDeEIsU0FBUyxzQkFBc0I7QUFDL0IsU0FBUyxZQUFZO0FBQ3JCLFNBQVMsaUJBQWlCO0FBQzFCO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsT0FDSztBQUNQLFNBQVMsb0JBQW9CO0FBQzdCLFNBQVMsZ0JBQWdCO0FBQ3pCLFNBQVMsc0JBQXNCO0FBQy9CLFNBQVMsaUNBQWlDO0FBQzFDO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsT0FDSztBQVNQLGVBQXNCLGFBQTRCO0FBQ2hELFFBQU0sR0FBRywwQkFBMEIsTUFBTSxFQUFFLE9BQU8sTUFBTSxXQUFXLEtBQUssQ0FBQztBQUMzRTtBQU9BLGVBQXNCLGVBQThCO0FBQ2xELE1BQUksQ0FBQyxNQUFNLGVBQWUsc0JBQXNCLEdBQUc7QUFDakQsVUFBTSxtQkFBbUI7QUFBQSxFQUMzQjtBQUNBLE1BQUksQ0FBQyxNQUFNLGVBQWUsMEJBQTBCLEdBQUc7QUFDckQsVUFBTSx1QkFBdUI7QUFBQSxFQUMvQjtBQUNGO0FBT0EsZUFBc0IscUJBQW9DO0FBQ3hELFFBQU0sZUFBZSx3QkFBd0IsRUFBRSxNQUFNLDBCQUEwQixhQUFhLENBQUM7QUFDN0YsUUFBTSxXQUFXLE1BQU0sU0FBdUIsWUFBWTtBQUMxRCxRQUFNLFdBQVcsTUFBTSxRQUFRLEtBQUssU0FBUyxXQUFXLENBQUMsR0FBRyxFQUFFLFNBQVMsU0FBUyxXQUFXLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDaEcsUUFBTSxjQUFjLFNBQVMsT0FBTyxDQUFDLFNBQVMsS0FBSyxTQUFTLFNBQVMsS0FBSyxLQUFLLFNBQVMsWUFBWSxLQUFLLEtBQUssU0FBUyxZQUFZLENBQUM7QUFFcEksTUFBSSxZQUFZLFdBQVcsR0FBRztBQUM1QixtQkFBZSwwQkFBMEIsRUFBRSxtRUFBbUU7QUFDOUc7QUFBQSxFQUNGO0FBRUEsUUFBTSxhQUFhLENBQUMsT0FBTyxnQkFBZ0IsY0FBYywwQkFBMEIsWUFBWSxDQUFDO0FBQ2xHO0FBYUEsZUFBc0IseUJBQXdDO0FBQzVELFFBQU0sYUFBYSxDQUFDLE9BQU8sT0FBTyxXQUFXLFNBQVMsQ0FBQztBQUV2RCxNQUFJLENBQUMscUJBQXFCLEdBQUc7QUFDM0IsVUFBTSxJQUFJLE1BQU0sMkNBQTJDO0FBQUEsRUFDN0Q7QUFDRjtBQWVBLGVBQXNCLGlCQUFnQztBQUNwRCxhQUFXLFVBQVUsTUFBTSxhQUFhLDBCQUEwQixXQUFXLEVBQUUsV0FBVyxNQUFNLGVBQWUsS0FBSyxDQUFDLEdBQUc7QUFDdEgsUUFBSSxDQUFDLE9BQU8sT0FBTyxHQUFHO0FBQ3BCO0FBQUEsSUFDRjtBQUVBLFVBQU0sT0FBTyxVQUFVO0FBQUEsTUFDckIsUUFBUSxHQUFHLDBCQUEwQixTQUFTO0FBQUEsTUFDOUMsS0FBSyxLQUFLLE9BQU8sWUFBWSxPQUFPLElBQUk7QUFBQSxJQUMxQyxDQUFDO0FBQ0QsVUFBTSxrQkFBa0IsS0FBSyxTQUFTLG9CQUFvQixJQUFJLEtBQUssTUFBTSxHQUFHLENBQUMscUJBQXFCLE1BQU0sSUFBSTtBQUM1RyxVQUFNLEdBQUcsS0FBSywwQkFBMEIsV0FBVyxJQUFJLEdBQUcsS0FBSywwQkFBMEIsZUFBZSxlQUFlLENBQUM7QUFBQSxFQUMxSDtBQUNGO0FBRUEsTUFBTSx1QkFBdUI7QUFFN0IsTUFBTSx1QkFBdUI7QUF1QjdCLFNBQVMsc0JBQXNCLFFBQThDO0FBQzNFLFFBQU0sRUFBRSxVQUFVLGNBQWMsSUFBSTtBQUNwQyxTQUFPLFNBQVMsV0FBVyxHQUFHLGFBQWEsR0FBRyxLQUFLLENBQUMsU0FBUyxTQUFTLG9CQUFvQjtBQUM1RjtBQVNBLFNBQVMsdUJBQWdDO0FBQ3ZDLFFBQU0sT0FBTyxjQUFjO0FBRTNCLE1BQUksQ0FBQyxNQUFNO0FBQ1QsVUFBTSxJQUFJLE1BQU0sNEJBQTRCO0FBQUEsRUFDOUM7QUFFQSxRQUFNLGdCQUFnQixZQUFZLElBQUk7QUFDdEMsUUFBTSxFQUFFLFdBQVcsUUFBUSxJQUFJLGNBQWMsS0FBSyxNQUFNLDBCQUEwQixZQUFZLENBQUM7QUFFL0YsU0FBTyxrQkFBa0I7QUFBQSxJQUN2QjtBQUFBLElBQ0EsV0FBVztBQUFBLElBQ1gsZ0JBQWdCLENBQUMsYUFBYSxzQkFBc0IsRUFBRSxVQUFVLGNBQWMsQ0FBQztBQUFBLEVBQ2pGLENBQUM7QUFDSDsiLAogICJuYW1lcyI6IFtdCn0K
|
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
* When upstream types are fixed, the `Ignored N diagnostic(s)` count drops to `0`, signalling the
|
|
11
11
|
* workaround is no longer doing anything.
|
|
12
12
|
*/
|
|
13
|
-
import type { CompilerOptions, Diagnostic } from 'typescript
|
|
13
|
+
import type { CompilerOptions, Diagnostic } from 'typescript';
|
|
14
14
|
/**
|
|
15
15
|
* Parameters for {@link checkProjectTypes}.
|
|
16
16
|
*/
|
|
@@ -31,7 +31,7 @@ import {
|
|
|
31
31
|
getParsedCommandLineOfConfigFile,
|
|
32
32
|
getPreEmitDiagnostics,
|
|
33
33
|
sys
|
|
34
|
-
} from "typescript
|
|
34
|
+
} from "typescript";
|
|
35
35
|
const FORMAT_HOST = {
|
|
36
36
|
getCanonicalFileName: (fileName) => fileName,
|
|
37
37
|
getCurrentDirectory: () => sys.getCurrentDirectory(),
|
|
@@ -99,4 +99,4 @@ export {
|
|
|
99
99
|
parseTsConfig,
|
|
100
100
|
toCanonical
|
|
101
101
|
};
|
|
102
|
-
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vc3JjL3NjcmlwdC11dGlscy9jaGVjay1wcm9qZWN0LXR5cGVzLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBmaWxlXG4gKlxuICogVHlwZS1jaGVja3MgYSBzZXQgb2YgVHlwZVNjcmlwdCBmaWxlcyB3aXRoIGBza2lwTGliQ2hlY2tgIGRpc2FibGVkLCBidXQgcmVwb3J0cyBvbmx5IHRoZVxuICogZGlhZ25vc3RpY3Mgd2hvc2Ugc291cmNlIGZpbGUgd2Ugb3duLiBUaGlzIGxldHMgdGhlIGdlbmVyYWwgYnVpbGQgcnVuIHdpdGggYHNraXBMaWJDaGVjazogdHJ1ZWBcbiAqIChzbyBpdCBkb2VzIG5vdCBmYWlsIG9uIGJyb2tlbiB1cHN0cmVhbSBgLmQudHNgIGZpbGVzIHdlIGRvIG5vdCBjb250cm9sLCBzdWNoIGFzIGEgZ2l2ZW5cbiAqIHZlcnNpb24ncyBgb2JzaWRpYW4uZC50c2ApIHdoaWxlIHN0aWxsIGZ1bGx5IHZhbGlkYXRpbmcgdGhlIGRlY2xhcmF0aW9ucyB3ZSBhdXRob3IuXG4gKlxuICogV2hlbiB1cHN0cmVhbSB0eXBlcyBhcmUgZml4ZWQsIHRoZSBgSWdub3JlZCBOIGRpYWdub3N0aWMocylgIGNvdW50IGRyb3BzIHRvIGAwYCwgc2lnbmFsbGluZyB0aGVcbiAqIHdvcmthcm91bmQgaXMgbm8gbG9uZ2VyIGRvaW5nIGFueXRoaW5nLlxuICovXG5cbmltcG9ydCB0eXBlIHtcbiAgQ29tcGlsZXJPcHRpb25zLFxuICBEaWFnbm9zdGljLFxuICBGb3JtYXREaWFnbm9zdGljc0hvc3QsXG4gIFBhcnNlQ29uZmlnRmlsZUhvc3Rcbn0gZnJvbSAndHlwZXNjcmlwdC02JztcblxuaW1wb3J0IHByb2Nlc3MgZnJvbSAnbm9kZTpwcm9jZXNzJztcbmltcG9ydCB7XG4gIGNyZWF0ZVByb2dyYW0sXG4gIERpYWdub3N0aWNDYXRlZ29yeSxcbiAgZm9ybWF0RGlhZ25vc3RpYyxcbiAgZm9ybWF0RGlhZ25vc3RpY3MsXG4gIGZvcm1hdERpYWdub3N0aWNzV2l0aENvbG9yQW5kQ29udGV4dCxcbiAgZ2V0UGFyc2VkQ29tbWFuZExpbmVPZkNvbmZpZ0ZpbGUsXG4gIGdldFByZUVtaXREaWFnbm9zdGljcyxcbiAgc3lzXG59IGZyb20gJ3R5cGVzY3JpcHQtNic7XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIGNoZWNrUHJvamVjdFR5cGVzfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDaGVja1Byb2plY3RUeXBlc1BhcmFtcyB7XG4gIC8qKlxuICAgKiBXaGVuIGB0cnVlYCwgdGhlIGlnbm9yZWQgZGlhZ25vc3RpY3MgKHRob3NlIGRyb3BwZWQgYnkge0BsaW5rIENoZWNrUHJvamVjdFR5cGVzUGFyYW1zLnNob3VsZEtlZXBGaWxlfVxuICAgKiBvciB7QGxpbmsgQ2hlY2tQcm9qZWN0VHlwZXNQYXJhbXMuc2hvdWxkS2VlcERpYWdub3N0aWN9KSBhcmUgcHJpbnRlZCBpbiBmdWxsIGFmdGVyIHRoZSBpZ25vcmVkXG4gICAqIGNvdW50LCBzbyB0aGV5IGNhbiBiZSBpbnNwZWN0ZWQuIFdoZW4gb21pdHRlZCBvciBgZmFsc2VgLCBvbmx5IHRoZSBjb3VudCBpcyBwcmludGVkLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgZmFsc2VgXG4gICAqL1xuICByZWFkb25seSBpc1ZlcmJvc2U/OiBib29sZWFuO1xuXG4gIC8qKiBDb21waWxlciBvcHRpb25zIGZvciB0aGUgcHJvZ3JhbS4gYHNraXBMaWJDaGVja2AgaXMgYWx3YXlzIGZvcmNlZCB0byBgZmFsc2VgLiAqL1xuICByZWFkb25seSBvcHRpb25zOiBDb21waWxlck9wdGlvbnM7XG5cbiAgLyoqIFRoZSByb290IGZpbGVzIHRvIHR5cGUtY2hlY2suICovXG4gIHJlYWRvbmx5IHJvb3ROYW1lczogcmVhZG9ubHkgc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIERlY2lkZXMgd2hldGhlciBhIGRpYWdub3N0aWMgc2hvdWxkIGJlIHJlcG9ydGVkLCBiYXNlZCBvbiB0aGUgZGlhZ25vc3RpYyBpdHNlbGYgcmF0aGVyIHRoYW4gaXRzXG4gICAqIHNvdXJjZSBmaWxlLiBSdW5zIGluIGFkZGl0aW9uIHRvIHtAbGluayBDaGVja1Byb2plY3RUeXBlc1BhcmFtcy5zaG91bGRLZWVwRmlsZX0gXHUyMDE0IGEgZGlhZ25vc3RpYyBpc1xuICAgKiByZXBvcnRlZCBvbmx5IHdoZW4gYm90aCBwcmVkaWNhdGVzIGtlZXAgaXQuIFVzZSB0aGlzIHRvIGRyb3AgZGlhZ25vc3RpY3MgdGhhdCBhcmUgcmVwb3J0ZWQgaW4gYVxuICAgKiBmaWxlIHdlIG93biBidXQgYXJlIGNhdXNlZCBieSBzb21ldGhpbmcgd2UgZG8gbm90IGNvbnRyb2wgKGUuZy4gYSBjcm9zcy1tb2R1bGUtZm9ybWF0IGludGVyb3BcbiAgICogY29tcGxhaW50IGFib3V0IGEgdGhpcmQtcGFydHkgaW1wb3J0KS4gV2hlbiBvbWl0dGVkLCBubyBkaWFnbm9zdGljIGlzIGRyb3BwZWQgb24gdGhpcyBiYXNpcy5cbiAgICpcbiAgICogQHBhcmFtIGRpYWdub3N0aWMgLSBUaGUgZGlhZ25vc3RpYyB0byBldmFsdWF0ZS5cbiAgICogQHJldHVybnMgYHRydWVgIHRvIHJlcG9ydCB0aGUgZGlhZ25vc3RpYywgYGZhbHNlYCB0byBpZ25vcmUgaXQuXG4gICAqL1xuICBzaG91bGRLZWVwRGlhZ25vc3RpYz8odGhpczogdm9pZCwgZGlhZ25vc3RpYzogRGlhZ25vc3RpYyk6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIERlY2lkZXMgd2hldGhlciBhIGRpYWdub3N0aWMncyBzb3VyY2UgZmlsZSBpcyBvbmUgd2UgY2FyZSBhYm91dC5cbiAgICpcbiAgICogQHBhcmFtIGZpbGVOYW1lIC0gVGhlIGRpYWdub3N0aWMncyBzb3VyY2UgZmlsZSwgYWxyZWFkeSBwYXNzZWQgdGhyb3VnaCB7QGxpbmsgdG9DYW5vbmljYWx9LlxuICAgKiBAcmV0dXJucyBgdHJ1ZWAgdG8gcmVwb3J0IHRoZSBkaWFnbm9zdGljLCBgZmFsc2VgIHRvIGlnbm9yZSBpdC5cbiAgICovXG4gIHNob3VsZEtlZXBGaWxlKHRoaXM6IHZvaWQsIGZpbGVOYW1lOiBzdHJpbmcpOiBib29sZWFuO1xufVxuXG4vKipcbiAqIFRoZSByZXNvbHZlZCByZXN1bHQgb2Yge0BsaW5rIHBhcnNlVHNDb25maWd9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBhcnNlZFRzQ29uZmlnIHtcbiAgLyoqIFRoZSByZXNvbHZlZCBsaXN0IG9mIGZpbGVzIHRoZSBjb25maWcgaW5jbHVkZXMgKGFic29sdXRlIHBhdGhzKS4gKi9cbiAgcmVhZG9ubHkgZmlsZU5hbWVzOiByZWFkb25seSBzdHJpbmdbXTtcblxuICAvKiogVGhlIHJlc29sdmVkIGNvbXBpbGVyIG9wdGlvbnMgKHdpdGggYGV4dGVuZHNgIGFwcGxpZWQpLiAqL1xuICByZWFkb25seSBvcHRpb25zOiBDb21waWxlck9wdGlvbnM7XG59XG5cbmNvbnN0IEZPUk1BVF9IT1NUOiBGb3JtYXREaWFnbm9zdGljc0hvc3QgPSB7XG4gIGdldENhbm9uaWNhbEZpbGVOYW1lOiAoZmlsZU5hbWUpID0+IGZpbGVOYW1lLFxuICBnZXRDdXJyZW50RGlyZWN0b3J5OiAoKSA9PiBzeXMuZ2V0Q3VycmVudERpcmVjdG9yeSgpLFxuICBnZXROZXdMaW5lOiAoKSA9PiBzeXMubmV3TGluZVxufTtcblxuLyoqXG4gKiBUeXBlLWNoZWNrcyBhIHNldCBvZiBmaWxlcyB3aXRoIGBza2lwTGliQ2hlY2s6IGZhbHNlYCwgYnV0IHJlcG9ydHMgb25seSB0aGUgZGlhZ25vc3RpY3Mgd2hvc2VcbiAqIHNvdXJjZSBmaWxlIHBhc3NlcyBgc2hvdWxkS2VlcEZpbGVgLiBEaWFnbm9zdGljcyBmcm9tIGZpbGVzIHdlIGRvIG5vdCBjb250cm9sIChlLmcuIGJyb2tlblxuICogdGhpcmQtcGFydHkgYC5kLnRzYCBwdWxsZWQgaW4gdHJhbnNpdGl2ZWx5KSBhcmUgZHJvcHBlZCwgd2hpbGUgc3RpbGwgYmVpbmcgY291bnRlZCBmb3JcbiAqIHZpc2liaWxpdHkuIFdoZW4gYGlzVmVyYm9zZWAgaXMgc2V0LCB0aGUgZHJvcHBlZCBkaWFnbm9zdGljcyBhcmUgYWxzbyBwcmludGVkIGluIGZ1bGwuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBwcm9ncmFtIGlucHV0cyBhbmQgdGhlIGtlZXAgcHJlZGljYXRlLlxuICogQHJldHVybnMgYHRydWVgIHdoZW4gbm8gcmVwb3J0ZWQgZGlhZ25vc3RpYyBpcyBhbiBlcnJvciwgYGZhbHNlYCBvdGhlcndpc2UuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjaGVja1Byb2plY3RUeXBlcyhwYXJhbXM6IENoZWNrUHJvamVjdFR5cGVzUGFyYW1zKTogYm9vbGVhbiB7XG4gIGNvbnN0IG9wdGlvbnM6IENvbXBpbGVyT3B0aW9ucyA9IHtcbiAgICAuLi5wYXJhbXMub3B0aW9ucyxcbiAgICBza2lwTGliQ2hlY2s6IGZhbHNlXG4gIH07XG5cbiAgY29uc3QgcHJvZ3JhbSA9IGNyZWF0ZVByb2dyYW0oe1xuICAgIG9wdGlvbnMsXG4gICAgcm9vdE5hbWVzOiBbLi4ucGFyYW1zLnJvb3ROYW1lc11cbiAgfSk7XG5cbiAgY29uc3QgYWxsRGlhZ25vc3RpY3MgPSBnZXRQcmVFbWl0RGlhZ25vc3RpY3MocHJvZ3JhbSk7XG4gIGNvbnN0IGtlcHREaWFnbm9zdGljcyA9IGFsbERpYWdub3N0aWNzLmZpbHRlcigoZGlhZ25vc3RpYykgPT4gc2hvdWxkS2VlcERpYWdub3N0aWNCeUZpbGUoZGlhZ25vc3RpYywgcGFyYW1zLnNob3VsZEtlZXBGaWxlKSAmJiAocGFyYW1zLnNob3VsZEtlZXBEaWFnbm9zdGljPy4oZGlhZ25vc3RpYykgPz8gdHJ1ZSkpO1xuICBjb25zdCBpZ25vcmVkQ291bnQgPSBhbGxEaWFnbm9zdGljcy5sZW5ndGggLSBrZXB0RGlhZ25vc3RpY3MubGVuZ3RoO1xuXG4gIGlmIChrZXB0RGlhZ25vc3RpY3MubGVuZ3RoID4gMCkge1xuICAgIHByb2Nlc3Muc3Rkb3V0LndyaXRlKGZvcm1hdERpYWdub3N0aWNzV2l0aENvbG9yQW5kQ29udGV4dChrZXB0RGlhZ25vc3RpY3MsIEZPUk1BVF9IT1NUKSk7XG4gIH1cblxuICBwcm9jZXNzLnN0ZG91dC53cml0ZShgSWdub3JlZCAke1N0cmluZyhpZ25vcmVkQ291bnQpfSBkaWFnbm9zdGljKHMpIG91dHNpZGUgdGhlIHZhbGlkYXRlZCBzZXQuXFxuYCk7XG5cbiAgaWYgKHBhcmFtcy5pc1ZlcmJvc2UgJiYgaWdub3JlZENvdW50ID4gMCkge1xuICAgIGNvbnN0IGlnbm9yZWREaWFnbm9zdGljcyA9IGFsbERpYWdub3N0aWNzLmZpbHRlcigoZGlhZ25vc3RpYykgPT4gIWtlcHREaWFnbm9zdGljcy5pbmNsdWRlcyhkaWFnbm9zdGljKSk7XG4gICAgcHJvY2Vzcy5zdGRvdXQud3JpdGUoZm9ybWF0RGlhZ25vc3RpY3NXaXRoQ29sb3JBbmRDb250ZXh0KGlnbm9yZWREaWFnbm9zdGljcywgRk9STUFUX0hPU1QpKTtcbiAgfVxuXG4gIHJldHVybiAha2VwdERpYWdub3N0aWNzLnNvbWUoKGRpYWdub3N0aWMpID0+IGRpYWdub3N0aWMuY2F0ZWdvcnkgPT09IERpYWdub3N0aWNDYXRlZ29yeS5FcnJvcik7XG59XG5cbi8qKlxuICogUGFyc2VzIGEgYHRzY29uZmlnLmpzb25gIChyZXNvbHZpbmcgYGV4dGVuZHNgLCBgaW5jbHVkZWAsIGBleGNsdWRlYCkgaW50byB0aGUgcmVzb2x2ZWQgZmlsZSBsaXN0XG4gKiBhbmQgY29tcGlsZXIgb3B0aW9ucy5cbiAqXG4gKiBAcGFyYW0gdHNDb25maWdQYXRoIC0gQWJzb2x1dGUgcGF0aCB0byB0aGUgY29uZmlnIGZpbGUuXG4gKiBAcmV0dXJucyBUaGUgcmVzb2x2ZWQgZmlsZSBuYW1lcyBhbmQgb3B0aW9ucy5cbiAqIEB0aHJvd3MgSWYgdGhlIGNvbmZpZyBjYW5ub3QgYmUgcGFyc2VkIG9yIGNvbnRhaW5zIGVycm9ycy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlVHNDb25maWcodHNDb25maWdQYXRoOiBzdHJpbmcpOiBQYXJzZWRUc0NvbmZpZyB7XG4gIGNvbnN0IGhvc3Q6IFBhcnNlQ29uZmlnRmlsZUhvc3QgPSB7XG4gICAgZmlsZUV4aXN0czogKHBhdGgpID0+IHN5cy5maWxlRXhpc3RzKHBhdGgpLFxuICAgIGdldEN1cnJlbnREaXJlY3Rvcnk6ICgpID0+IHN5cy5nZXRDdXJyZW50RGlyZWN0b3J5KCksXG4gICAgb25VblJlY292ZXJhYmxlQ29uZmlnRmlsZURpYWdub3N0aWM6IChkaWFnbm9zdGljKSA9PiB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoZm9ybWF0RGlhZ25vc3RpYyhkaWFnbm9zdGljLCBGT1JNQVRfSE9TVCkpO1xuICAgIH0sXG4gICAgcmVhZERpcmVjdG9yeTogKHJvb3REaXIsIGV4dGVuc2lvbnMsIGV4Y2x1ZGVzLCBpbmNsdWRlcywgZGVwdGgpID0+IHN5cy5yZWFkRGlyZWN0b3J5KHJvb3REaXIsIGV4dGVuc2lvbnMsIGV4Y2x1ZGVzLCBpbmNsdWRlcywgZGVwdGgpLFxuICAgIHJlYWRGaWxlOiAocGF0aCkgPT4gc3lzLnJlYWRGaWxlKHBhdGgpLFxuICAgIHVzZUNhc2VTZW5zaXRpdmVGaWxlTmFtZXM6IHN5cy51c2VDYXNlU2Vuc2l0aXZlRmlsZU5hbWVzXG4gIH07XG5cbiAgY29uc3QgcGFyc2VkID0gZ2V0UGFyc2VkQ29tbWFuZExpbmVPZkNvbmZpZ0ZpbGUodHNDb25maWdQYXRoLCB1bmRlZmluZWQsIGhvc3QpO1xuXG4gIGlmICghcGFyc2VkKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gcGFyc2UgVHlwZVNjcmlwdCBjb25maWc6ICR7dHNDb25maWdQYXRofWApO1xuICB9XG5cbiAgaWYgKHBhcnNlZC5lcnJvcnMubGVuZ3RoID4gMCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgRXJyb3JzIHdoaWxlIHBhcnNpbmcgVHlwZVNjcmlwdCBjb25maWcgJHt0c0NvbmZpZ1BhdGh9OlxcbiR7Zm9ybWF0RGlhZ25vc3RpY3MocGFyc2VkLmVycm9ycywgRk9STUFUX0hPU1QpfWApO1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBmaWxlTmFtZXM6IHBhcnNlZC5maWxlTmFtZXMsXG4gICAgb3B0aW9uczogcGFyc2VkLm9wdGlvbnNcbiAgfTtcbn1cblxuLyoqXG4gKiBOb3JtYWxpemVzIGEgZmlsZSBwYXRoIGZvciBjb21wYXJpc29uOiBmb3J3YXJkIHNsYXNoZXMgZXZlcnl3aGVyZSwgbG93ZXItY2FzZWQgb24gYVxuICogY2FzZS1pbnNlbnNpdGl2ZSBmaWxlIHN5c3RlbS5cbiAqXG4gKiBAcGFyYW0gZmlsZU5hbWUgLSBUaGUgcGF0aCB0byBub3JtYWxpemUuXG4gKiBAcmV0dXJucyBUaGUgY2Fub25pY2FsIHBhdGguXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0Nhbm9uaWNhbChmaWxlTmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3Qgbm9ybWFsaXplZCA9IGZpbGVOYW1lLnJlcGxhY2VBbGwoJ1xcXFwnLCAnLycpO1xuICByZXR1cm4gc3lzLnVzZUNhc2VTZW5zaXRpdmVGaWxlTmFtZXMgPyBub3JtYWxpemVkIDogbm9ybWFsaXplZC50b0xvd2VyQ2FzZSgpO1xufVxuXG5mdW5jdGlvbiBzaG91bGRLZWVwRGlhZ25vc3RpY0J5RmlsZShkaWFnbm9zdGljOiBEaWFnbm9zdGljLCBzaG91bGRLZWVwRmlsZTogKGZpbGVOYW1lOiBzdHJpbmcpID0+IGJvb2xlYW4pOiBib29sZWFuIHtcbiAgaWYgKCFkaWFnbm9zdGljLmZpbGUpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHJldHVybiBzaG91bGRLZWVwRmlsZSh0b0Nhbm9uaWNhbChkaWFnbm9zdGljLmZpbGUuZmlsZU5hbWUpKTtcbn1cbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBbUJBLE9BQU8sYUFBYTtBQUNwQjtBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FB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
|
|
102
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vc3JjL3NjcmlwdC11dGlscy9jaGVjay1wcm9qZWN0LXR5cGVzLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBmaWxlXG4gKlxuICogVHlwZS1jaGVja3MgYSBzZXQgb2YgVHlwZVNjcmlwdCBmaWxlcyB3aXRoIGBza2lwTGliQ2hlY2tgIGRpc2FibGVkLCBidXQgcmVwb3J0cyBvbmx5IHRoZVxuICogZGlhZ25vc3RpY3Mgd2hvc2Ugc291cmNlIGZpbGUgd2Ugb3duLiBUaGlzIGxldHMgdGhlIGdlbmVyYWwgYnVpbGQgcnVuIHdpdGggYHNraXBMaWJDaGVjazogdHJ1ZWBcbiAqIChzbyBpdCBkb2VzIG5vdCBmYWlsIG9uIGJyb2tlbiB1cHN0cmVhbSBgLmQudHNgIGZpbGVzIHdlIGRvIG5vdCBjb250cm9sLCBzdWNoIGFzIGEgZ2l2ZW5cbiAqIHZlcnNpb24ncyBgb2JzaWRpYW4uZC50c2ApIHdoaWxlIHN0aWxsIGZ1bGx5IHZhbGlkYXRpbmcgdGhlIGRlY2xhcmF0aW9ucyB3ZSBhdXRob3IuXG4gKlxuICogV2hlbiB1cHN0cmVhbSB0eXBlcyBhcmUgZml4ZWQsIHRoZSBgSWdub3JlZCBOIGRpYWdub3N0aWMocylgIGNvdW50IGRyb3BzIHRvIGAwYCwgc2lnbmFsbGluZyB0aGVcbiAqIHdvcmthcm91bmQgaXMgbm8gbG9uZ2VyIGRvaW5nIGFueXRoaW5nLlxuICovXG5cbmltcG9ydCB0eXBlIHtcbiAgQ29tcGlsZXJPcHRpb25zLFxuICBEaWFnbm9zdGljLFxuICBGb3JtYXREaWFnbm9zdGljc0hvc3QsXG4gIFBhcnNlQ29uZmlnRmlsZUhvc3Rcbn0gZnJvbSAndHlwZXNjcmlwdCc7XG5cbmltcG9ydCBwcm9jZXNzIGZyb20gJ25vZGU6cHJvY2Vzcyc7XG5pbXBvcnQge1xuICBjcmVhdGVQcm9ncmFtLFxuICBEaWFnbm9zdGljQ2F0ZWdvcnksXG4gIGZvcm1hdERpYWdub3N0aWMsXG4gIGZvcm1hdERpYWdub3N0aWNzLFxuICBmb3JtYXREaWFnbm9zdGljc1dpdGhDb2xvckFuZENvbnRleHQsXG4gIGdldFBhcnNlZENvbW1hbmRMaW5lT2ZDb25maWdGaWxlLFxuICBnZXRQcmVFbWl0RGlhZ25vc3RpY3MsXG4gIHN5c1xufSBmcm9tICd0eXBlc2NyaXB0JztcblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgY2hlY2tQcm9qZWN0VHlwZXN9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIENoZWNrUHJvamVjdFR5cGVzUGFyYW1zIHtcbiAgLyoqXG4gICAqIFdoZW4gYHRydWVgLCB0aGUgaWdub3JlZCBkaWFnbm9zdGljcyAodGhvc2UgZHJvcHBlZCBieSB7QGxpbmsgQ2hlY2tQcm9qZWN0VHlwZXNQYXJhbXMuc2hvdWxkS2VlcEZpbGV9XG4gICAqIG9yIHtAbGluayBDaGVja1Byb2plY3RUeXBlc1BhcmFtcy5zaG91bGRLZWVwRGlhZ25vc3RpY30pIGFyZSBwcmludGVkIGluIGZ1bGwgYWZ0ZXIgdGhlIGlnbm9yZWRcbiAgICogY291bnQsIHNvIHRoZXkgY2FuIGJlIGluc3BlY3RlZC4gV2hlbiBvbWl0dGVkIG9yIGBmYWxzZWAsIG9ubHkgdGhlIGNvdW50IGlzIHByaW50ZWQuXG4gICAqXG4gICAqIEBkZWZhdWx0IGBmYWxzZWBcbiAgICovXG4gIHJlYWRvbmx5IGlzVmVyYm9zZT86IGJvb2xlYW47XG5cbiAgLyoqIENvbXBpbGVyIG9wdGlvbnMgZm9yIHRoZSBwcm9ncmFtLiBgc2tpcExpYkNoZWNrYCBpcyBhbHdheXMgZm9yY2VkIHRvIGBmYWxzZWAuICovXG4gIHJlYWRvbmx5IG9wdGlvbnM6IENvbXBpbGVyT3B0aW9ucztcblxuICAvKiogVGhlIHJvb3QgZmlsZXMgdG8gdHlwZS1jaGVjay4gKi9cbiAgcmVhZG9ubHkgcm9vdE5hbWVzOiByZWFkb25seSBzdHJpbmdbXTtcblxuICAvKipcbiAgICogRGVjaWRlcyB3aGV0aGVyIGEgZGlhZ25vc3RpYyBzaG91bGQgYmUgcmVwb3J0ZWQsIGJhc2VkIG9uIHRoZSBkaWFnbm9zdGljIGl0c2VsZiByYXRoZXIgdGhhbiBpdHNcbiAgICogc291cmNlIGZpbGUuIFJ1bnMgaW4gYWRkaXRpb24gdG8ge0BsaW5rIENoZWNrUHJvamVjdFR5cGVzUGFyYW1zLnNob3VsZEtlZXBGaWxlfSBcdTIwMTQgYSBkaWFnbm9zdGljIGlzXG4gICAqIHJlcG9ydGVkIG9ubHkgd2hlbiBib3RoIHByZWRpY2F0ZXMga2VlcCBpdC4gVXNlIHRoaXMgdG8gZHJvcCBkaWFnbm9zdGljcyB0aGF0IGFyZSByZXBvcnRlZCBpbiBhXG4gICAqIGZpbGUgd2Ugb3duIGJ1dCBhcmUgY2F1c2VkIGJ5IHNvbWV0aGluZyB3ZSBkbyBub3QgY29udHJvbCAoZS5nLiBhIGNyb3NzLW1vZHVsZS1mb3JtYXQgaW50ZXJvcFxuICAgKiBjb21wbGFpbnQgYWJvdXQgYSB0aGlyZC1wYXJ0eSBpbXBvcnQpLiBXaGVuIG9taXR0ZWQsIG5vIGRpYWdub3N0aWMgaXMgZHJvcHBlZCBvbiB0aGlzIGJhc2lzLlxuICAgKlxuICAgKiBAcGFyYW0gZGlhZ25vc3RpYyAtIFRoZSBkaWFnbm9zdGljIHRvIGV2YWx1YXRlLlxuICAgKiBAcmV0dXJucyBgdHJ1ZWAgdG8gcmVwb3J0IHRoZSBkaWFnbm9zdGljLCBgZmFsc2VgIHRvIGlnbm9yZSBpdC5cbiAgICovXG4gIHNob3VsZEtlZXBEaWFnbm9zdGljPyh0aGlzOiB2b2lkLCBkaWFnbm9zdGljOiBEaWFnbm9zdGljKTogYm9vbGVhbjtcblxuICAvKipcbiAgICogRGVjaWRlcyB3aGV0aGVyIGEgZGlhZ25vc3RpYydzIHNvdXJjZSBmaWxlIGlzIG9uZSB3ZSBjYXJlIGFib3V0LlxuICAgKlxuICAgKiBAcGFyYW0gZmlsZU5hbWUgLSBUaGUgZGlhZ25vc3RpYydzIHNvdXJjZSBmaWxlLCBhbHJlYWR5IHBhc3NlZCB0aHJvdWdoIHtAbGluayB0b0Nhbm9uaWNhbH0uXG4gICAqIEByZXR1cm5zIGB0cnVlYCB0byByZXBvcnQgdGhlIGRpYWdub3N0aWMsIGBmYWxzZWAgdG8gaWdub3JlIGl0LlxuICAgKi9cbiAgc2hvdWxkS2VlcEZpbGUodGhpczogdm9pZCwgZmlsZU5hbWU6IHN0cmluZyk6IGJvb2xlYW47XG59XG5cbi8qKlxuICogVGhlIHJlc29sdmVkIHJlc3VsdCBvZiB7QGxpbmsgcGFyc2VUc0NvbmZpZ30uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGFyc2VkVHNDb25maWcge1xuICAvKiogVGhlIHJlc29sdmVkIGxpc3Qgb2YgZmlsZXMgdGhlIGNvbmZpZyBpbmNsdWRlcyAoYWJzb2x1dGUgcGF0aHMpLiAqL1xuICByZWFkb25seSBmaWxlTmFtZXM6IHJlYWRvbmx5IHN0cmluZ1tdO1xuXG4gIC8qKiBUaGUgcmVzb2x2ZWQgY29tcGlsZXIgb3B0aW9ucyAod2l0aCBgZXh0ZW5kc2AgYXBwbGllZCkuICovXG4gIHJlYWRvbmx5IG9wdGlvbnM6IENvbXBpbGVyT3B0aW9ucztcbn1cblxuY29uc3QgRk9STUFUX0hPU1Q6IEZvcm1hdERpYWdub3N0aWNzSG9zdCA9IHtcbiAgZ2V0Q2Fub25pY2FsRmlsZU5hbWU6IChmaWxlTmFtZSkgPT4gZmlsZU5hbWUsXG4gIGdldEN1cnJlbnREaXJlY3Rvcnk6ICgpID0+IHN5cy5nZXRDdXJyZW50RGlyZWN0b3J5KCksXG4gIGdldE5ld0xpbmU6ICgpID0+IHN5cy5uZXdMaW5lXG59O1xuXG4vKipcbiAqIFR5cGUtY2hlY2tzIGEgc2V0IG9mIGZpbGVzIHdpdGggYHNraXBMaWJDaGVjazogZmFsc2VgLCBidXQgcmVwb3J0cyBvbmx5IHRoZSBkaWFnbm9zdGljcyB3aG9zZVxuICogc291cmNlIGZpbGUgcGFzc2VzIGBzaG91bGRLZWVwRmlsZWAuIERpYWdub3N0aWNzIGZyb20gZmlsZXMgd2UgZG8gbm90IGNvbnRyb2wgKGUuZy4gYnJva2VuXG4gKiB0aGlyZC1wYXJ0eSBgLmQudHNgIHB1bGxlZCBpbiB0cmFuc2l0aXZlbHkpIGFyZSBkcm9wcGVkLCB3aGlsZSBzdGlsbCBiZWluZyBjb3VudGVkIGZvclxuICogdmlzaWJpbGl0eS4gV2hlbiBgaXNWZXJib3NlYCBpcyBzZXQsIHRoZSBkcm9wcGVkIGRpYWdub3N0aWNzIGFyZSBhbHNvIHByaW50ZWQgaW4gZnVsbC5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHByb2dyYW0gaW5wdXRzIGFuZCB0aGUga2VlcCBwcmVkaWNhdGUuXG4gKiBAcmV0dXJucyBgdHJ1ZWAgd2hlbiBubyByZXBvcnRlZCBkaWFnbm9zdGljIGlzIGFuIGVycm9yLCBgZmFsc2VgIG90aGVyd2lzZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNoZWNrUHJvamVjdFR5cGVzKHBhcmFtczogQ2hlY2tQcm9qZWN0VHlwZXNQYXJhbXMpOiBib29sZWFuIHtcbiAgY29uc3Qgb3B0aW9uczogQ29tcGlsZXJPcHRpb25zID0ge1xuICAgIC4uLnBhcmFtcy5vcHRpb25zLFxuICAgIHNraXBMaWJDaGVjazogZmFsc2VcbiAgfTtcblxuICBjb25zdCBwcm9ncmFtID0gY3JlYXRlUHJvZ3JhbSh7XG4gICAgb3B0aW9ucyxcbiAgICByb290TmFtZXM6IFsuLi5wYXJhbXMucm9vdE5hbWVzXVxuICB9KTtcblxuICBjb25zdCBhbGxEaWFnbm9zdGljcyA9IGdldFByZUVtaXREaWFnbm9zdGljcyhwcm9ncmFtKTtcbiAgY29uc3Qga2VwdERpYWdub3N0aWNzID0gYWxsRGlhZ25vc3RpY3MuZmlsdGVyKChkaWFnbm9zdGljKSA9PiBzaG91bGRLZWVwRGlhZ25vc3RpY0J5RmlsZShkaWFnbm9zdGljLCBwYXJhbXMuc2hvdWxkS2VlcEZpbGUpICYmIChwYXJhbXMuc2hvdWxkS2VlcERpYWdub3N0aWM/LihkaWFnbm9zdGljKSA/PyB0cnVlKSk7XG4gIGNvbnN0IGlnbm9yZWRDb3VudCA9IGFsbERpYWdub3N0aWNzLmxlbmd0aCAtIGtlcHREaWFnbm9zdGljcy5sZW5ndGg7XG5cbiAgaWYgKGtlcHREaWFnbm9zdGljcy5sZW5ndGggPiAwKSB7XG4gICAgcHJvY2Vzcy5zdGRvdXQud3JpdGUoZm9ybWF0RGlhZ25vc3RpY3NXaXRoQ29sb3JBbmRDb250ZXh0KGtlcHREaWFnbm9zdGljcywgRk9STUFUX0hPU1QpKTtcbiAgfVxuXG4gIHByb2Nlc3Muc3Rkb3V0LndyaXRlKGBJZ25vcmVkICR7U3RyaW5nKGlnbm9yZWRDb3VudCl9IGRpYWdub3N0aWMocykgb3V0c2lkZSB0aGUgdmFsaWRhdGVkIHNldC5cXG5gKTtcblxuICBpZiAocGFyYW1zLmlzVmVyYm9zZSAmJiBpZ25vcmVkQ291bnQgPiAwKSB7XG4gICAgY29uc3QgaWdub3JlZERpYWdub3N0aWNzID0gYWxsRGlhZ25vc3RpY3MuZmlsdGVyKChkaWFnbm9zdGljKSA9PiAha2VwdERpYWdub3N0aWNzLmluY2x1ZGVzKGRpYWdub3N0aWMpKTtcbiAgICBwcm9jZXNzLnN0ZG91dC53cml0ZShmb3JtYXREaWFnbm9zdGljc1dpdGhDb2xvckFuZENvbnRleHQoaWdub3JlZERpYWdub3N0aWNzLCBGT1JNQVRfSE9TVCkpO1xuICB9XG5cbiAgcmV0dXJuICFrZXB0RGlhZ25vc3RpY3Muc29tZSgoZGlhZ25vc3RpYykgPT4gZGlhZ25vc3RpYy5jYXRlZ29yeSA9PT0gRGlhZ25vc3RpY0NhdGVnb3J5LkVycm9yKTtcbn1cblxuLyoqXG4gKiBQYXJzZXMgYSBgdHNjb25maWcuanNvbmAgKHJlc29sdmluZyBgZXh0ZW5kc2AsIGBpbmNsdWRlYCwgYGV4Y2x1ZGVgKSBpbnRvIHRoZSByZXNvbHZlZCBmaWxlIGxpc3RcbiAqIGFuZCBjb21waWxlciBvcHRpb25zLlxuICpcbiAqIEBwYXJhbSB0c0NvbmZpZ1BhdGggLSBBYnNvbHV0ZSBwYXRoIHRvIHRoZSBjb25maWcgZmlsZS5cbiAqIEByZXR1cm5zIFRoZSByZXNvbHZlZCBmaWxlIG5hbWVzIGFuZCBvcHRpb25zLlxuICogQHRocm93cyBJZiB0aGUgY29uZmlnIGNhbm5vdCBiZSBwYXJzZWQgb3IgY29udGFpbnMgZXJyb3JzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VUc0NvbmZpZyh0c0NvbmZpZ1BhdGg6IHN0cmluZyk6IFBhcnNlZFRzQ29uZmlnIHtcbiAgY29uc3QgaG9zdDogUGFyc2VDb25maWdGaWxlSG9zdCA9IHtcbiAgICBmaWxlRXhpc3RzOiAocGF0aCkgPT4gc3lzLmZpbGVFeGlzdHMocGF0aCksXG4gICAgZ2V0Q3VycmVudERpcmVjdG9yeTogKCkgPT4gc3lzLmdldEN1cnJlbnREaXJlY3RvcnkoKSxcbiAgICBvblVuUmVjb3ZlcmFibGVDb25maWdGaWxlRGlhZ25vc3RpYzogKGRpYWdub3N0aWMpID0+IHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihmb3JtYXREaWFnbm9zdGljKGRpYWdub3N0aWMsIEZPUk1BVF9IT1NUKSk7XG4gICAgfSxcbiAgICByZWFkRGlyZWN0b3J5OiAocm9vdERpciwgZXh0ZW5zaW9ucywgZXhjbHVkZXMsIGluY2x1ZGVzLCBkZXB0aCkgPT4gc3lzLnJlYWREaXJlY3Rvcnkocm9vdERpciwgZXh0ZW5zaW9ucywgZXhjbHVkZXMsIGluY2x1ZGVzLCBkZXB0aCksXG4gICAgcmVhZEZpbGU6IChwYXRoKSA9PiBzeXMucmVhZEZpbGUocGF0aCksXG4gICAgdXNlQ2FzZVNlbnNpdGl2ZUZpbGVOYW1lczogc3lzLnVzZUNhc2VTZW5zaXRpdmVGaWxlTmFtZXNcbiAgfTtcblxuICBjb25zdCBwYXJzZWQgPSBnZXRQYXJzZWRDb21tYW5kTGluZU9mQ29uZmlnRmlsZSh0c0NvbmZpZ1BhdGgsIHVuZGVmaW5lZCwgaG9zdCk7XG5cbiAgaWYgKCFwYXJzZWQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEZhaWxlZCB0byBwYXJzZSBUeXBlU2NyaXB0IGNvbmZpZzogJHt0c0NvbmZpZ1BhdGh9YCk7XG4gIH1cblxuICBpZiAocGFyc2VkLmVycm9ycy5sZW5ndGggPiAwKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBFcnJvcnMgd2hpbGUgcGFyc2luZyBUeXBlU2NyaXB0IGNvbmZpZyAke3RzQ29uZmlnUGF0aH06XFxuJHtmb3JtYXREaWFnbm9zdGljcyhwYXJzZWQuZXJyb3JzLCBGT1JNQVRfSE9TVCl9YCk7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIGZpbGVOYW1lczogcGFyc2VkLmZpbGVOYW1lcyxcbiAgICBvcHRpb25zOiBwYXJzZWQub3B0aW9uc1xuICB9O1xufVxuXG4vKipcbiAqIE5vcm1hbGl6ZXMgYSBmaWxlIHBhdGggZm9yIGNvbXBhcmlzb246IGZvcndhcmQgc2xhc2hlcyBldmVyeXdoZXJlLCBsb3dlci1jYXNlZCBvbiBhXG4gKiBjYXNlLWluc2Vuc2l0aXZlIGZpbGUgc3lzdGVtLlxuICpcbiAqIEBwYXJhbSBmaWxlTmFtZSAtIFRoZSBwYXRoIHRvIG5vcm1hbGl6ZS5cbiAqIEByZXR1cm5zIFRoZSBjYW5vbmljYWwgcGF0aC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvQ2Fub25pY2FsKGZpbGVOYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCBub3JtYWxpemVkID0gZmlsZU5hbWUucmVwbGFjZUFsbCgnXFxcXCcsICcvJyk7XG4gIHJldHVybiBzeXMudXNlQ2FzZVNlbnNpdGl2ZUZpbGVOYW1lcyA/IG5vcm1hbGl6ZWQgOiBub3JtYWxpemVkLnRvTG93ZXJDYXNlKCk7XG59XG5cbmZ1bmN0aW9uIHNob3VsZEtlZXBEaWFnbm9zdGljQnlGaWxlKGRpYWdub3N0aWM6IERpYWdub3N0aWMsIHNob3VsZEtlZXBGaWxlOiAoZmlsZU5hbWU6IHN0cmluZykgPT4gYm9vbGVhbik6IGJvb2xlYW4ge1xuICBpZiAoIWRpYWdub3N0aWMuZmlsZSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgcmV0dXJuIHNob3VsZEtlZXBGaWxlKHRvQ2Fub25pY2FsKGRpYWdub3N0aWMuZmlsZS5maWxlTmFtZSkpO1xufVxuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFtQkEsT0FBTyxhQUFhO0FBQ3BCO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxP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
|