@mnaoumov/obsidian-lib 10.8.0 → 10.10.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/README.md +4 -0
- package/codemirror/editor-mode-extension/package.json +6 -0
- package/dist/lib/cjs/__merged.cjs +42 -1
- package/dist/lib/cjs/__merged.d.cts +7 -2
- package/dist/lib/cjs/code-block-render-handoff.cjs +2 -5
- package/dist/lib/cjs/codemirror/editor-mode-extension.cjs +180 -0
- package/dist/lib/cjs/codemirror/editor-mode-extension.d.cts +50 -0
- package/dist/lib/cjs/codemirror/index.cjs +4 -1
- package/dist/lib/cjs/codemirror/index.d.cts +1 -0
- package/dist/lib/cjs/codemirror/inline-token-widgets.cjs +4 -7
- package/dist/lib/cjs/command-handlers/unlock-active-note-command-handler.cjs +2 -2
- package/dist/lib/cjs/community-plugins.cjs +2 -2
- package/dist/lib/cjs/components/all-windows-event-component.cjs +86 -14
- package/dist/lib/cjs/components/all-windows-event-component.d.cts +54 -3
- package/dist/lib/cjs/components/monkey-around-component.cjs +1 -1
- package/dist/lib/cjs/components/plugin-notice-component.cjs +2 -6
- package/dist/lib/cjs/components/plugin-settings-component.cjs +4 -3
- package/dist/lib/cjs/components/plugin-settings-component.d.cts +2 -1
- package/dist/lib/cjs/components/style-sheet-component.cjs +1 -4
- package/dist/lib/cjs/css-class.cjs +7 -1
- package/dist/lib/cjs/css-class.d.cts +24 -0
- package/dist/lib/cjs/data-stores/shared-data-store.cjs +15 -4
- package/dist/lib/cjs/desktop-bulk-operation-git.cjs +5 -5
- package/dist/lib/cjs/folder-note.cjs +5 -5
- package/dist/lib/cjs/formula-function.cjs +152 -0
- package/dist/lib/cjs/formula-function.d.cts +98 -0
- package/dist/lib/cjs/frontmatter-formatting.cjs +2 -2
- package/dist/lib/cjs/generated-during-build.cjs +2 -2
- package/dist/lib/cjs/i18n/i18n.cjs +38 -10
- package/dist/lib/cjs/i18n/i18n.d.cts +29 -2
- package/dist/lib/cjs/i18n/locales/en.cjs +13 -1
- package/dist/lib/cjs/i18n/locales/en.d.cts +12 -0
- package/dist/lib/cjs/i18n/locales/translations-map.d.cts +12 -0
- package/dist/lib/cjs/index.cjs +7 -1
- package/dist/lib/cjs/index.d.cts +2 -0
- package/dist/lib/cjs/link.cjs +12 -12
- package/dist/lib/cjs/markdown.cjs +7 -7
- package/dist/lib/cjs/modals/code-block-builder.cjs +486 -0
- package/dist/lib/cjs/modals/code-block-builder.d.cts +321 -0
- package/dist/lib/cjs/modals/index.cjs +4 -1
- package/dist/lib/cjs/modals/index.d.cts +1 -0
- package/dist/lib/cjs/plugin/index.cjs +4 -1
- package/dist/lib/cjs/plugin/index.d.cts +1 -0
- package/dist/lib/cjs/plugin/plugin-async-cleanup.cjs +189 -0
- package/dist/lib/cjs/plugin/plugin-async-cleanup.d.cts +111 -0
- package/dist/lib/cjs/plugin/plugin.cjs +47 -2
- package/dist/lib/cjs/plugin/plugin.d.cts +25 -1
- package/dist/lib/cjs/vault.cjs +2 -2
- package/dist/lib/cjs/virtual-file.cjs +340 -0
- package/dist/lib/cjs/virtual-file.d.cts +48 -0
- package/dist/lib/esm/__merged.d.mts +7 -2
- package/dist/lib/esm/__merged.mjs +48 -2
- package/dist/lib/esm/code-block-render-handoff.mjs +2 -5
- package/dist/lib/esm/codemirror/editor-mode-extension.d.mts +50 -0
- package/dist/lib/esm/codemirror/editor-mode-extension.mjs +93 -0
- package/dist/lib/esm/codemirror/index.d.mts +1 -0
- package/dist/lib/esm/codemirror/index.mjs +3 -1
- package/dist/lib/esm/codemirror/inline-token-widgets.mjs +3 -9
- package/dist/lib/esm/command-handlers/unlock-active-note-command-handler.mjs +2 -2
- package/dist/lib/esm/community-plugins.mjs +2 -2
- package/dist/lib/esm/components/all-windows-event-component.d.mts +54 -3
- package/dist/lib/esm/components/all-windows-event-component.mjs +87 -14
- package/dist/lib/esm/components/monkey-around-component.mjs +1 -1
- package/dist/lib/esm/components/plugin-notice-component.mjs +2 -6
- package/dist/lib/esm/components/plugin-settings-component.d.mts +2 -1
- package/dist/lib/esm/components/plugin-settings-component.mjs +4 -3
- package/dist/lib/esm/components/style-sheet-component.mjs +1 -4
- package/dist/lib/esm/css-class.d.mts +24 -0
- package/dist/lib/esm/css-class.mjs +7 -1
- package/dist/lib/esm/data-stores/shared-data-store.mjs +15 -4
- package/dist/lib/esm/desktop-bulk-operation-git.mjs +5 -5
- package/dist/lib/esm/folder-note.mjs +5 -5
- package/dist/lib/esm/formula-function.d.mts +98 -0
- package/dist/lib/esm/formula-function.mjs +62 -0
- package/dist/lib/esm/frontmatter-formatting.mjs +2 -2
- package/dist/lib/esm/generated-during-build.mjs +2 -2
- package/dist/lib/esm/i18n/i18n.d.mts +29 -2
- package/dist/lib/esm/i18n/i18n.mjs +40 -10
- package/dist/lib/esm/i18n/locales/en.d.mts +12 -0
- package/dist/lib/esm/i18n/locales/en.mjs +13 -1
- package/dist/lib/esm/i18n/locales/translations-map.d.mts +12 -0
- package/dist/lib/esm/index.d.mts +2 -0
- package/dist/lib/esm/index.mjs +5 -1
- package/dist/lib/esm/link.mjs +12 -12
- package/dist/lib/esm/markdown.mjs +7 -7
- package/dist/lib/esm/modals/code-block-builder.d.mts +321 -0
- package/dist/lib/esm/modals/code-block-builder.mjs +408 -0
- package/dist/lib/esm/modals/index.d.mts +1 -0
- package/dist/lib/esm/modals/index.mjs +3 -1
- package/dist/lib/esm/plugin/index.d.mts +1 -0
- package/dist/lib/esm/plugin/index.mjs +3 -1
- package/dist/lib/esm/plugin/plugin-async-cleanup.d.mts +111 -0
- package/dist/lib/esm/plugin/plugin-async-cleanup.mjs +96 -0
- package/dist/lib/esm/plugin/plugin.d.mts +25 -1
- package/dist/lib/esm/plugin/plugin.mjs +52 -2
- package/dist/lib/esm/vault.mjs +2 -2
- package/dist/lib/esm/virtual-file.d.mts +48 -0
- package/dist/lib/esm/virtual-file.mjs +264 -0
- package/dist/styles.css +31 -1
- package/modals/code-block-builder/package.json +6 -0
- package/package.json +5 -5
- package/plugin/plugin-async-cleanup/package.json +6 -0
|
@@ -41,6 +41,7 @@ const DEFAULT_ACTIVE_DEVICE_MILLISECONDS = 2592e6;
|
|
|
41
41
|
const OWNER_PATH_INDEX = -2;
|
|
42
42
|
const VECTOR_ENTRY_LENGTH = 2;
|
|
43
43
|
const DEVICE_PATH_PARTS = 2;
|
|
44
|
+
const DEVICE_ID_REG_EXP = /^[\w-]+$/;
|
|
44
45
|
const RECORD_PREFIX = "shared-record-v1:";
|
|
45
46
|
class SharedDataStore {
|
|
46
47
|
constructor(params, device) {
|
|
@@ -85,7 +86,7 @@ class SharedDataStore {
|
|
|
85
86
|
*/
|
|
86
87
|
static async open(params) {
|
|
87
88
|
const device = await params.local.getOrCreate("shared-device-v1", window.crypto.randomUUID());
|
|
88
|
-
if (typeof device !== "string" ||
|
|
89
|
+
if (typeof device !== "string" || !DEVICE_ID_REG_EXP.test(device)) {
|
|
89
90
|
throw new Error("Invalid local data-store identity");
|
|
90
91
|
}
|
|
91
92
|
const store = new SharedDataStore(params, device);
|
|
@@ -233,8 +234,18 @@ class SharedDataStore {
|
|
|
233
234
|
}
|
|
234
235
|
async acknowledgements(files) {
|
|
235
236
|
const acknowledgements = [new Map(this.vector)];
|
|
236
|
-
const
|
|
237
|
-
const devices =
|
|
237
|
+
const devicesPrefix = `${this.transport.root}/devices/`;
|
|
238
|
+
const devices = /* @__PURE__ */ new Set();
|
|
239
|
+
for (const path of files) {
|
|
240
|
+
if (!path.startsWith(devicesPrefix)) {
|
|
241
|
+
continue;
|
|
242
|
+
}
|
|
243
|
+
const parts = path.slice(devicesPrefix.length).split("/");
|
|
244
|
+
const device = parts[0];
|
|
245
|
+
if (parts.length >= DEVICE_PATH_PARTS && device !== void 0 && DEVICE_ID_REG_EXP.test(device)) {
|
|
246
|
+
devices.add(device);
|
|
247
|
+
}
|
|
248
|
+
}
|
|
238
249
|
for (const device of devices) {
|
|
239
250
|
if (device === this.device) {
|
|
240
251
|
continue;
|
|
@@ -455,4 +466,4 @@ function isVector(value) {
|
|
|
455
466
|
export {
|
|
456
467
|
SharedDataStore
|
|
457
468
|
};
|
|
458
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9kYXRhLXN0b3Jlcy9zaGFyZWQtZGF0YS1zdG9yZS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKiBlc2xpbnQtZGlzYWJsZSBuL25vLXVuc3VwcG9ydGVkLWZlYXR1cmVzL25vZGUtYnVpbHRpbnMgLS0gVGhlc2UgYXJlIE9ic2lkaWFuIHJlbmRlcmVyIFdlYiBBUElzLCBub3QgTm9kZSBidWlsdGlucy4gKi9cbi8qKlxuICogQGZpbGVcbiAqXG4gKiBNZXJnZWFibGUgcGx1Z2luIGRhdGEsIHRyYW5zcG9ydGVkIGFzIHNpbmdsZS13cml0ZXIgam91cm5hbCBzZWdtZW50cyBhbmQgY2h1bmtlZCBzbmFwc2hvdHMuXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBEYXRhQWRhcHRlciB9IGZyb20gJ29ic2lkaWFuJztcbmltcG9ydCB0eXBlIHsgSnNvblZhbHVlIH0gZnJvbSAndHlwZS1mZXN0JztcblxuaW1wb3J0IHsgZW5zdXJlTm9uTnVsbGFibGUgfSBmcm9tICdAbW5hb3Vtb3YvdHlwZXNjcmlwdC1saWIvdHlwZS1ndWFyZHMnO1xuXG5pbXBvcnQgdHlwZSB7IERhdGFTdG9yZUxvY2F0aW9uIH0gZnJvbSAnLi9kYXRhLXN0b3JlLWxvY2F0aW9ucy50cyc7XG5pbXBvcnQgdHlwZSB7XG4gIERhdGFTdG9yZU1lcmdlS2luZCxcbiAgRGF0YVN0b3JlT3BlcmF0aW9uXG59IGZyb20gJy4vZGF0YS1zdG9yZS1yZXBsaWNhLnRzJztcbmltcG9ydCB0eXBlIHsgTG9jYWxEYXRhU3RvcmUgfSBmcm9tICcuL2xvY2FsLWRhdGEtc3RvcmUudHMnO1xuXG5pbXBvcnQgeyBEYXRhU3RvcmVMb2NhdGlvbnMgfSBmcm9tICcuL2RhdGEtc3RvcmUtbG9jYXRpb25zLnRzJztcbmltcG9ydCB7XG4gIERhdGFTdG9yZVJlcGxpY2EsXG4gIGlzRGF0YVN0b3JlT3BlcmF0aW9uXG59IGZyb20gJy4vZGF0YS1zdG9yZS1yZXBsaWNhLnRzJztcbmltcG9ydCB7IERhdGFTdG9yZVRyYW5zcG9ydCB9IGZyb20gJy4vZGF0YS1zdG9yZS10cmFuc3BvcnQudHMnO1xuXG5jb25zdCBERUZBVUxUX0FDVElWRV9ERVZJQ0VfTUlMTElTRUNPTkRTID0gMl81OTJfMDAwXzAwMDtcblxuY29uc3QgT1dORVJfUEFUSF9JTkRFWCA9IC0yO1xuXG5jb25zdCBWRUNUT1JfRU5UUllfTEVOR1RIID0gMjtcbmNvbnN0IERFVklDRV9QQVRIX1BBUlRTID0gMjtcbmNvbnN0IFJFQ09SRF9QUkVGSVggPSAnc2hhcmVkLXJlY29yZC12MTonO1xuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIG9wZW5pbmcgYSBzaGFyZWQgc3RvcmUuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2hhcmVkRGF0YVN0b3JlT3BlblBhcmFtcyB7XG4gIC8qKlxuICAgKiBEZXZpY2UgcmV0aXJlbWVudCBpbnRlcnZhbCwgbWVhc3VyZWQgZnJvbSBpdHMgbGFzdCBhY2tub3dsZWRnZW1lbnQuXG4gICAqXG4gICAqIEBkZWZhdWx0IGAyNTkyMDAwMDAwYFxuICAgKi9cbiAgcmVhZG9ubHkgYWN0aXZlRGV2aWNlTWlsbGlzZWNvbmRzPzogbnVtYmVyO1xuICAvKipcbiAgICogVmF1bHQgYWRhcHRlci5cbiAgICovXG4gIHJlYWRvbmx5IGFkYXB0ZXI6IERhdGFBZGFwdGVyO1xuICAvKipcbiAgICogVmF1bHQtcmVsYXRpdmUgZm9sZGVyLiBIaWRkZW4gc2VnbWVudHMgYXJlIGFsbG93ZWQ7IGNhbGxlcnMgbXVzdCBhcnJhbmdlIHRoZWlyIHN5bmNocm9uaXphdGlvbi5cbiAgICpcbiAgICogQGRlZmF1bHQgYCdQbHVnaW4gZGF0YSdgXG4gICAqL1xuICByZWFkb25seSBmb2xkZXI/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBOZXcgZG9jdW1lbnQgZW5jb2RpbmcgYXQgdGhlIHBlcm1hbmVudCBkaXNjb3ZlcnkgYW5jaG9yLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgJ21hcmtkb3duJ2BcbiAgICovXG4gIHJlYWRvbmx5IGZvcm1hdD86ICdqc29uJyB8ICdtYXJrZG93bic7XG4gIC8qKlxuICAgKiBFbmFibGVzIHZhdWx0IHRyYW5zcG9ydC4gRGlzYWJsZWQgc3RvcmVzIG1ha2Ugbm8gYWRhcHRlciBjYWxscywgaW5jbHVkaW5nIGR1cmluZyBjb21wYWN0aW9uLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgdHJ1ZWBcbiAgICovXG4gIHJlYWRvbmx5IGlzU3luY0VuYWJsZWQ/OiBib29sZWFuO1xuICAvKipcbiAgICogSW1tdXRhYmxlIG1lcmdlIHJ1bGU7IGNoYW5naW5nIGl0IHJlcXVpcmVzIGEgbmV3IHN0b3JlIGlkLlxuICAgKi9cbiAgcmVhZG9ubHkga2luZDogRGF0YVN0b3JlTWVyZ2VLaW5kO1xuICAvKipcbiAgICogRGVkaWNhdGVkIGxvY2FsIHN0b3JlIHNjb3BlZCB0byBUSElTIHZhdWx0LCBwbHVnaW4gYW5kIHNoYXJlZC1zdG9yZSBzY2hlbWEuIFRoZSBjYWxsZXIgb3ducyBpdHMgY29ubmVjdGlvbi5cbiAgICovXG4gIHJlYWRvbmx5IGxvY2FsOiBMb2NhbERhdGFTdG9yZTtcbiAgLyoqXG4gICAqIE1heGltdW0gVVRGLTggYnl0ZXMgcGVyIGZpbGUsIHdyYXBwZXIgaW5jbHVkZWQuXG4gICAqXG4gICAqIEBkZWZhdWx0IGAxMDAwMDAwYFxuICAgKi9cbiAgcmVhZG9ubHkgbWF4RmlsZUJ5dGVzPzogbnVtYmVyO1xuICAvKipcbiAgICogTWF4aW11bSBVVEYtOCBieXRlcyBpbiBhIHJlY29uc3RydWN0ZWQgc25hcHNob3QgYmVmb3JlIEpTT04gcGFyc2luZy5cbiAgICpcbiAgICogQGRlZmF1bHQgYDY0MDAwMDAwYFxuICAgKi9cbiAgcmVhZG9ubHkgbWF4U25hcHNob3RCeXRlcz86IG51bWJlcjtcbiAgLyoqXG4gICAqIFBsdWdpbiBtYW5pZmVzdCBpZC5cbiAgICovXG4gIHJlYWRvbmx5IHBsdWdpbklkOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBTdG9yZSBpZCBpbmNsdWRpbmcgdGhlIGNvbnN1bWVyJ3Mgc2NoZW1hIHZlcnNpb24uXG4gICAqL1xuICByZWFkb25seSBzdG9yZUlkOiBzdHJpbmc7XG59XG5cbmludGVyZmFjZSBDaGFuZ2Uge1xuICByZWFkb25seSBkZWxldGVkOiBib29sZWFuO1xuICByZWFkb25seSBrZXk6IHN0cmluZztcbiAgcmVhZG9ubHkgdmFsdWU6IEpzb25WYWx1ZTtcbn1cblxuaW50ZXJmYWNlIENoZWNrcG9pbnQge1xuICByZWFkb25seSBjb3VudGVyOiBudW1iZXI7XG4gIHJlYWRvbmx5IGZvcm1hdDogMTtcbiAgcmVhZG9ubHkga2luZDogRGF0YVN0b3JlTWVyZ2VLaW5kO1xuICByZWFkb25seSBvcGVyYXRpb25zOiBEYXRhU3RvcmVPcGVyYXRpb25bXTtcbiAgcmVhZG9ubHkgdGltZTogbnVtYmVyO1xuICByZWFkb25seSB2ZWN0b3I6IFZlcnNpb25WZWN0b3I7XG59XG5cbnR5cGUgVmVyc2lvblZlY3RvciA9IFtzdHJpbmcsIG51bWJlcl1bXTtcblxuLyoqXG4gKiBBIGRldmljZS1sb2NhbCBxdWVyeSByZXBsaWNhIGJhY2tlZCBieSB2YXVsdCBmaWxlcy4gQ2FsbCBgc3luY2hyb25pemVgIGFmdGVyIHRyYW5zcG9ydCBjaGFuZ2VzIG9yIHBlcmlvZGljYWxseS5cbiAqIE5vIHRpbWVyIG9yIGV2ZW50IGhhbmRsZXIgb3V0bGl2ZXMgdGhlIGNvbnN1bWVyOiB0aGUgY29uc3VtZXIgc2NoZWR1bGVzIHN5bmNocm9uaXphdGlvbiBhbmQgb3ducyB1bmxvYWRpbmcuXG4gKi9cbmV4cG9ydCBjbGFzcyBTaGFyZWREYXRhU3RvcmUge1xuICAvKipcbiAgQ29uZmlndXJlZCBhbmQgcmVtZW1iZXJlZCByZWFkZXIgcm9vdHMsIGluY2x1ZGluZyByZXRhaW5lZCBtaWdyYXRpb24gc291cmNlcyB3aGlsZSBkaXNhYmxlZC5cbiAgICpcbiAgICogQHJldHVybnMgVW5pcXVlIHJvb3RzIHN1aXRhYmxlIGZvciBtZXRhZGF0YSBleGNsdXNpb24gd2l0aG91dCBhZGFwdGVyIGFjY2Vzcy5cbiAgICovXG4gIHB1YmxpYyBnZXQgdHJhbnNwb3J0Um9vdHMoKTogc3RyaW5nW10ge1xuICAgIHJldHVybiBbLi4ubmV3IFNldChbLi4udGhpcy5rbm93blRyYW5zcG9ydFJvb3RzLCAuLi50aGlzLmxvY2F0aW9ucy50cmFuc3BvcnRzLm1hcCgodHJhbnNwb3J0KSA9PiB0cmFuc3BvcnQucm9vdCldKV07XG4gIH1cblxuICBwcml2YXRlIHJlYWRvbmx5IGFjdGl2ZURldmljZU1pbGxpc2Vjb25kczogbnVtYmVyO1xuICBwcml2YXRlIGNvdW50ZXIgPSAwO1xuICBwcml2YXRlIGhhc1VucHVibGlzaGVkQ2hhbmdlcyA9IGZhbHNlO1xuICBwcml2YXRlIGlzU3luY0VuYWJsZWQ6IGJvb2xlYW47XG4gIHByaXZhdGUgcmVhZG9ubHkga25vd25UcmFuc3BvcnRSb290cyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICBwcml2YXRlIHJlYWRvbmx5IGxvY2FsUmVjb3JkcyA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmc+KCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgbG9jYXRpb25zOiBEYXRhU3RvcmVMb2NhdGlvbnM7XG4gIHByaXZhdGUgcmVwbGljYTogRGF0YVN0b3JlUmVwbGljYTtcbiAgcHJpdmF0ZSB0aW1lID0gMDtcblxuICBwcml2YXRlIHJlYWRvbmx5IHZlY3RvciA9IG5ldyBNYXA8c3RyaW5nLCBudW1iZXI+KCk7XG5cbiAgcHJpdmF0ZSBnZXQgdHJhbnNwb3J0KCk6IERhdGFTdG9yZVRyYW5zcG9ydCB7XG4gICAgcmV0dXJuIGVuc3VyZU5vbk51bGxhYmxlKHRoaXMubG9jYXRpb25zLnRyYW5zcG9ydHMuYXQoLTEpKTtcbiAgfVxuXG4gIHByaXZhdGUgY29uc3RydWN0b3IocHJvdGVjdGVkIHJlYWRvbmx5IHBhcmFtczogU2hhcmVkRGF0YVN0b3JlT3BlblBhcmFtcywgcHJvdGVjdGVkIHJlYWRvbmx5IGRldmljZTogc3RyaW5nKSB7XG4gICAgdGhpcy5sb2NhdGlvbnMgPSBuZXcgRGF0YVN0b3JlTG9jYXRpb25zKHBhcmFtcyk7XG4gICAgdGhpcy5pc1N5bmNFbmFibGVkID0gcGFyYW1zLmlzU3luY0VuYWJsZWQgPz8gdHJ1ZTtcbiAgICB0aGlzLnJlcGxpY2EgPSBuZXcgRGF0YVN0b3JlUmVwbGljYShwYXJhbXMua2luZCk7XG4gICAgdGhpcy5hY3RpdmVEZXZpY2VNaWxsaXNlY29uZHMgPSBwYXJhbXMuYWN0aXZlRGV2aWNlTWlsbGlzZWNvbmRzID8/IERFRkFVTFRfQUNUSVZFX0RFVklDRV9NSUxMSVNFQ09ORFM7XG4gICAgaWYgKCFOdW1iZXIuaXNGaW5pdGUodGhpcy5hY3RpdmVEZXZpY2VNaWxsaXNlY29uZHMpIHx8IHRoaXMuYWN0aXZlRGV2aWNlTWlsbGlzZWNvbmRzIDw9IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignRGV2aWNlIHJldGlyZW1lbnQgaW50ZXJ2YWwgbXVzdCBiZSBwb3NpdGl2ZScpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBPcGVucyBhbmQgc3luY2hyb25pemVzIGEgc3RvcmUsIHJlc3RvcmluZyBpdHMgZGV2aWNlIGlkZW50aXR5IGV4Y2x1c2l2ZWx5IGZyb20gSW5kZXhlZERCLlxuICAgKlxuICAgKiBAcGFyYW0gcGFyYW1zIC0gUGVyc2lzdGVuY2UsIHRyYW5zcG9ydCBhbmQgbWVyZ2UgcG9saWN5LlxuICAgKiBAcmV0dXJucyBBIHN5bmNocm9uaXplZCBxdWVyeSByZXBsaWNhLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBhc3luYyBvcGVuKHBhcmFtczogU2hhcmVkRGF0YVN0b3JlT3BlblBhcmFtcyk6IFByb21pc2U8U2hhcmVkRGF0YVN0b3JlPiB7XG4gICAgY29uc3QgZGV2aWNlID0gYXdhaXQgcGFyYW1zLmxvY2FsLmdldE9yQ3JlYXRlKCdzaGFyZWQtZGV2aWNlLXYxJywgd2luZG93LmNyeXB0by5yYW5kb21VVUlEKCkpO1xuICAgIGlmICh0eXBlb2YgZGV2aWNlICE9PSAnc3RyaW5nJyB8fCAhL15bXFx3LV0rJC8udGVzdChkZXZpY2UpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgbG9jYWwgZGF0YS1zdG9yZSBpZGVudGl0eScpO1xuICAgIH1cbiAgICBjb25zdCBzdG9yZSA9IG5ldyBTaGFyZWREYXRhU3RvcmUocGFyYW1zLCBkZXZpY2UpO1xuICAgIGF3YWl0IHN0b3JlLnN5bmNocm9uaXplKCk7XG4gICAgcmV0dXJuIHN0b3JlO1xuICB9XG5cbiAgLyoqXG4gICAqIFB1Ymxpc2hlcyBhIGNvbXBsZXRlIGNodW5rZWQgc25hcHNob3QgYW5kIHRyaW1zIG9ubHkgdGhpcyBkZXZpY2UncyBhY2tub3dsZWRnZWQgam91cm5hbCBzZWdtZW50cy5cbiAgICogUmV0aXJlZCBkZXZpY2VzIHJlam9pbiBieSBtZXJnaW5nIHNuYXBzaG90czsgdG9tYnN0b25lcyByZW1haW4gaW4gc25hcHNob3RzIHRvIHByZXZlbnQgcmVzdXJyZWN0aW9uLlxuICAgKlxuICAgKiBAcmV0dXJucyBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIGNvbXBhY3Rpb24gZmluaXNoZXMuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgY29tcGFjdCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCB0aGlzLnBhcmFtcy5sb2NhbC5leGNsdXNpdmUoYXN5bmMgKCkgPT4ge1xuICAgICAgYXdhaXQgdGhpcy5sb2FkTG9jYWwoKTtcbiAgICAgIGF3YWl0IHRoaXMubWVyZ2VGaWxlcygpO1xuICAgICAgYXdhaXQgdGhpcy5wZXJzaXN0KCk7XG4gICAgICBpZiAoIXRoaXMuaXNTeW5jRW5hYmxlZCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjb25zdCBmaWxlcyA9IGF3YWl0IHRoaXMudHJhbnNwb3J0Lmxpc3QoKTtcbiAgICAgIGNvbnN0IGJhc2UgPSBgJHt0aGlzLmRldmljZVJvb3QoKX0vc25hcHNob3QtJHt3aW5kb3cuY3J5cHRvLnJhbmRvbVVVSUQoKX0tbWFuaWZlc3RgO1xuICAgICAgYXdhaXQgdGhpcy50cmFuc3BvcnQud3JpdGVTbmFwc2hvdCh7IGJhc2UsIHBheWxvYWQ6IHRoaXMuY2hlY2twb2ludCgpIH0pO1xuICAgICAgY29uc3QgYWNrbm93bGVkZ2VtZW50cyA9IGF3YWl0IHRoaXMuYWNrbm93bGVkZ2VtZW50cyhmaWxlcyk7XG4gICAgICBmb3IgKGNvbnN0IHBhdGggb2YgZmlsZXMpIHtcbiAgICAgICAgaWYgKCFwYXRoLnN0YXJ0c1dpdGgoYCR7dGhpcy5kZXZpY2VSb290KCl9L2xvZy1gKSkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG9wZXJhdGlvbnMgPSBhd2FpdCB0aGlzLnRyYW5zcG9ydC5yZWFkKHBhdGgpO1xuICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkob3BlcmF0aW9ucykgfHwgIW9wZXJhdGlvbnMuZXZlcnkoaXNEYXRhU3RvcmVPcGVyYXRpb24pKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgbGFzdCA9IE1hdGgubWF4KC4uLm9wZXJhdGlvbnMubWFwKChvcGVyYXRpb24pID0+IG9wZXJhdGlvbi5zZXF1ZW5jZSkpO1xuICAgICAgICBpZiAoYWNrbm93bGVkZ2VtZW50cy5ldmVyeSgodmVjdG9yKSA9PiAodmVjdG9yLmdldCh0aGlzLmRldmljZSkgPz8gMCkgPj0gbGFzdCkpIHtcbiAgICAgICAgICBhd2FpdCB0aGlzLnRyYW5zcG9ydC5yZW1vdmUocGF0aCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIC8vIFRoZSBjb21wbGV0ZSBuZXcgc25hcHNob3QgY292ZXJzIGV2ZXJ5IGVhcmxpZXIgc25hcHNob3QgZnJvbSB0aGlzIHdyaXRlci5cbiAgICAgIGZvciAoY29uc3QgcGF0aCBvZiBmaWxlcykge1xuICAgICAgICBpZiAocGF0aC5zdGFydHNXaXRoKGAke3RoaXMuZGV2aWNlUm9vdCgpfS9zbmFwc2hvdC1gKSkge1xuICAgICAgICAgIGF3YWl0IHRoaXMudHJhbnNwb3J0LnJlbW92ZShwYXRoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlY29nbml6ZXMgdHJhbnNwb3J0IGZpbGVzLCByb290cywgYW5kIGFuY2VzdG9yIGZvbGRlciBvcGVyYXRpb25zIGZvciBjb25zdW1lciBldmVudCBmaWx0ZXJzLlxuICAgKlxuICAgKiBAcGFyYW0gcGF0aCAtIFZhdWx0LXJlbGF0aXZlIGZpbGUgb3IgZm9sZGVyIHBhdGguXG4gICAqIEByZXR1cm5zIFdoZXRoZXIgdGhlIHBhdGggaW50ZXJzZWN0cyBhbiBhY3RpdmUgb3IgcmV0YWluZWQgdHJhbnNwb3J0IHJvb3QuXG4gICAqL1xuICBwdWJsaWMgY29udGFpbnNUcmFuc3BvcnRQYXRoKHBhdGg6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnRyYW5zcG9ydFJvb3RzLnNvbWUoKHJvb3QpID0+IHBhdGggPT09IHJvb3QgfHwgcGF0aC5zdGFydHNXaXRoKGAke3Jvb3R9L2ApIHx8IHJvb3Quc3RhcnRzV2l0aChgJHtwYXRofS9gKSk7XG4gIH1cblxuICAvKipcbiAgICogRGVsZXRlcyBhIHJlZ2lzdGVyIG9yIHJlbW92ZXMgdGhlIGN1cnJlbnRseSBvYnNlcnZlZCBhZGRpdGlvbnMgb2YgYSBzZXQgbWVtYmVyLlxuICAgKlxuICAgKiBAcGFyYW0ga2V5IC0gUmVjb3JkIGtleSBvciBzZXQgbWVtYmVyLiBNaW4vbWF4IHJlZ2lzdGVycyBkZWxpYmVyYXRlbHkgY2Fubm90IGJlIGRlbGV0ZWQuXG4gICAqIEByZXR1cm5zIEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIGFmdGVyIGpvdXJuYWwgcHVibGljYXRpb24gYW5kIGxvY2FsIGNvbW1pdC5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBkZWxldGUoa2V5OiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCB0aGlzLmNoYW5nZShbeyBkZWxldGVkOiB0cnVlLCBrZXksIHZhbHVlOiBudWxsIH1dKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWFkcyB0aGUgY3VycmVudCBsb2NhbCBxdWVyeSByZXBsaWNhLlxuICAgKlxuICAgKiBAcmV0dXJucyBEZXRhY2hlZCBrZXkvdmFsdWUgcGFpcnMgaW4gZGV0ZXJtaW5pc3RpYyBvcmRlci5cbiAgICovXG4gIHB1YmxpYyBlbnRyaWVzKCk6IFtzdHJpbmcsIHVua25vd25dW10ge1xuICAgIHJldHVybiB0aGlzLnJlcGxpY2EuZW50cmllcygpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlYWRzIGEgcmVnaXN0ZXIgb3Igc2V0IG1lbWJlcnNoaXAgZnJvbSB0aGUgY3VycmVudCBsb2NhbCBxdWVyeSByZXBsaWNhLlxuICAgKlxuICAgKiBAcGFyYW0ga2V5IC0gUmVjb3JkIGtleSBvciBzZXQgbWVtYmVyLlxuICAgKiBAcmV0dXJucyBBIGRldGFjaGVkIHZhbHVlLCBvciBgdW5kZWZpbmVkYCB3aGVuIGFic2VudCBvciBkZWxldGVkLlxuICAgKi9cbiAgcHVibGljIGdldChrZXk6IHN0cmluZyk6IHVua25vd24ge1xuICAgIHJldHVybiB0aGlzLnJlcGxpY2EuZ2V0KGtleSk7XG4gIH1cblxuICAvKipcbiAgICogUmVsb2NhdGVzIG9ubHkgdGhpcyBwbHVnaW4vc3RvcmUgc3VidHJlZTsga2VlcCBvcGVuaW5nIHdpdGggdGhlIG9yaWdpbmFsIGFuY2hvciBwYXJhbWV0ZXJzLlxuICAgKlxuICAgKiBAcGFyYW0gbG9jYXRpb24gLSBOZXcgZm9sZGVyIGFuZCBkb2N1bWVudCBmb3JtYXQuXG4gICAqIEByZXR1cm5zIEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIGFmdGVyIGhpc3RvcnkgaGFzIGJlZW4gY29waWVkIGFuZCB2ZXJpZmllZC5cbiAgICovXG4gIHB1YmxpYyBhc3luYyByZWxvY2F0ZShsb2NhdGlvbjogRGF0YVN0b3JlTG9jYXRpb24pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCB0aGlzLnBhcmFtcy5sb2NhbC5leGNsdXNpdmUoYXN5bmMgKCkgPT4ge1xuICAgICAgYXdhaXQgdGhpcy5sb2FkTG9jYWwoKTtcbiAgICAgIGlmICghdGhpcy5pc1N5bmNFbmFibGVkKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignRW5hYmxlIGRhdGEtc3RvcmUgc3luY2hyb25pemF0aW9uIGJlZm9yZSByZWxvY2F0aW9uJyk7XG4gICAgICB9XG4gICAgICBhd2FpdCB0aGlzLmxvY2F0aW9ucy5yZWxvY2F0ZShsb2NhdGlvbik7XG4gICAgICBhd2FpdCB0aGlzLm1lcmdlRmlsZXMoKTtcbiAgICAgIHRoaXMuaGFzVW5wdWJsaXNoZWRDaGFuZ2VzID0gdHJ1ZTtcbiAgICAgIGF3YWl0IHRoaXMucGVyc2lzdCgpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFdyaXRlcyBvbmUgcmVnaXN0ZXIgdmFsdWUsIG9yIGFkZHMgYSBtZW1iZXIgdG8gYW4gb2JzZXJ2ZWQtcmVtb3ZlIHNldC5cbiAgICpcbiAgICogQHBhcmFtIGtleSAtIFJlY29yZCBrZXkgb3Igc2V0IG1lbWJlci5cbiAgICogQHBhcmFtIHZhbHVlIC0gSlNPTi1jb21wYXRpYmxlIHZhbHVlICh1c2UgYHRydWVgIGZvciBhIHNldCkuXG4gICAqIEByZXR1cm5zIEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIGFmdGVyIGpvdXJuYWwgcHVibGljYXRpb24gYW5kIGxvY2FsIGNvbW1pdC5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBzZXQoa2V5OiBzdHJpbmcsIHZhbHVlOiBKc29uVmFsdWUpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCB0aGlzLnNldE1hbnkoW1trZXksIHZhbHVlXV0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFB1Ymxpc2hlcyBhIGJhdGNoIG9mIHJlZ2lzdGVyIHdyaXRlcywgc3BsaXQgaW50byBib3VuZGVkIGltbXV0YWJsZSBzZWdtZW50cy5cbiAgICogU2VnbWVudHMgYXJlIGluZGl2aWR1YWxseSBkdXJhYmxlOyBhIGZhaWxlZCBiYXRjaCBjYW4gaGF2ZSBhIHB1Ymxpc2hlZCBwcmVmaXggYW5kIGNhbiBiZSByZXRyaWVkIHNhZmVseS5cbiAgICpcbiAgICogQHBhcmFtIGVudHJpZXMgLSBSZWdpc3RlciB3cml0ZXMgb3Igc2V0IGFkZGl0aW9ucy5cbiAgICogQHJldHVybnMgQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgYWZ0ZXIgam91cm5hbCBwdWJsaWNhdGlvbiBhbmQgbG9jYWwgY29tbWl0LlxuICAgKi9cbiAgcHVibGljIGFzeW5jIHNldE1hbnkoZW50cmllczogcmVhZG9ubHkgKHJlYWRvbmx5IFtzdHJpbmcsIEpzb25WYWx1ZV0pW10pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCB0aGlzLmNoYW5nZShlbnRyaWVzLm1hcCgoW2tleSwgdmFsdWVdKSA9PiAoeyBkZWxldGVkOiBmYWxzZSwga2V5LCB2YWx1ZSB9KSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRvZ2dsZXMgdHJhbnNwb3J0IHdpdGhvdXQgY2hhbmdpbmcgaWRlbnRpdHkgb3IgY2F1c2FsIHN0YXRlLiBQZXJzaXN0IHRoZSBwcmVmZXJlbmNlIGluIGNvbnN1bWVyIHNldHRpbmdzLlxuICAgKiBFbmFibGluZyBwdWJsaXNoZXMgYSBjb21wbGV0ZSBjaGVja3BvaW50IHNvIG9mZmxpbmUgc2VxdWVuY2VzIGNhbm5vdCBsZWF2ZSBnYXBzLlxuICAgKlxuICAgKiBAcGFyYW0gaXNFbmFibGVkIC0gV2hldGhlciB0byB1c2UgdmF1bHQgdHJhbnNwb3J0IGZvciBzdWJzZXF1ZW50IGNhbGxzIG9uIHRoaXMgaW5zdGFuY2UuXG4gICAqIEByZXR1cm5zIEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIGFmdGVyIHN5bmNocm9uaXphdGlvbiB3aGVuIGVuYWJsaW5nLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIHNldFN5bmNFbmFibGVkKGlzRW5hYmxlZDogYm9vbGVhbik6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IHRoaXMucGFyYW1zLmxvY2FsLmV4Y2x1c2l2ZShhc3luYyAoKSA9PiB7XG4gICAgICBhd2FpdCB0aGlzLmxvYWRMb2NhbCgpO1xuICAgICAgdGhpcy5pc1N5bmNFbmFibGVkID0gaXNFbmFibGVkO1xuICAgICAgYXdhaXQgdGhpcy5tZXJnZUZpbGVzKCk7XG4gICAgICBhd2FpdCB0aGlzLnBlcnNpc3QoKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNZXJnZXMgY29tcGxldGUgc25hcHNob3RzIGFuZCBjb250aWd1b3VzIGpvdXJuYWwgaGlzdG9yeSwgdGhlbiBwdWJsaXNoZXMgaXRzIGR1cmFibGUgYWNrbm93bGVkZ2VtZW50LlxuICAgKiBQYXJ0aWFsIGRlbGl2ZXJpZXMgcmVtYWluIHBlbmRpbmc7IGEgbGF0ZXIgY2FsbCByZXRyaWVzIHRoZW0uIE5vIGFja25vd2xlZGdlbWVudCBza2lwcyBhIG1pc3Npbmcgc2VxdWVuY2UuXG4gICAqXG4gICAqIEByZXR1cm5zIEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIGFmdGVyIHRoZSBsb2NhbCBjaGVja3BvaW50IGFuZCBhY2tub3dsZWRnZW1lbnQgY29tbWl0LlxuICAgKi9cbiAgcHVibGljIGFzeW5jIHN5bmNocm9uaXplKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IHRoaXMucGFyYW1zLmxvY2FsLmV4Y2x1c2l2ZShhc3luYyAoKSA9PiB7XG4gICAgICBhd2FpdCB0aGlzLmxvYWRMb2NhbCgpO1xuICAgICAgYXdhaXQgdGhpcy5tZXJnZUZpbGVzKCk7XG4gICAgICBhd2FpdCB0aGlzLnBlcnNpc3QoKTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgYWNrbm93bGVkZ2VtZW50cyhmaWxlczogcmVhZG9ubHkgc3RyaW5nW10pOiBQcm9taXNlPE1hcDxzdHJpbmcsIG51bWJlcj5bXT4ge1xuICAgIGNvbnN0IGFja25vd2xlZGdlbWVudHMgPSBbbmV3IE1hcCh0aGlzLnZlY3RvcildO1xuICAgIGNvbnN0IGRldmljZUZpbGVzID0gZmlsZXMuZmlsdGVyKChwYXRoKSA9PiBwYXRoLnN0YXJ0c1dpdGgoYCR7dGhpcy50cmFuc3BvcnQucm9vdH0vZGV2aWNlcy9gKSk7XG4gICAgY29uc3QgZGV2aWNlcyA9IG5ldyBTZXQoZGV2aWNlRmlsZXMubWFwKChwYXRoKSA9PiBwYXRoLnNsaWNlKHRoaXMudHJhbnNwb3J0LnJvb3QubGVuZ3RoICsgMSkuc3BsaXQoJy8nLCBERVZJQ0VfUEFUSF9QQVJUUylbMV0pLmZpbHRlcigoZGV2aWNlKSA9PiBkZXZpY2UgIT09IHVuZGVmaW5lZCkpO1xuICAgIGZvciAoY29uc3QgZGV2aWNlIG9mIGRldmljZXMpIHtcbiAgICAgIGlmIChkZXZpY2UgPT09IHRoaXMuZGV2aWNlKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgY29uc3QgaGF2ZSA9IGF3YWl0IHRoaXMudHJhbnNwb3J0LnJlYWQoYCR7dGhpcy50cmFuc3BvcnQucm9vdH0vZGV2aWNlcy8ke2RldmljZX0vaGF2ZSR7dGhpcy50cmFuc3BvcnQuZXh0ZW5zaW9ufWApO1xuICAgICAgaWYgKCFpc09iamVjdChoYXZlKSB8fCAhaXNWZWN0b3IoaGF2ZVsndmVjdG9yJ10pIHx8IHR5cGVvZiBoYXZlWyd0aW1lJ10gIT09ICdudW1iZXInKSB7XG4gICAgICAgIGFja25vd2xlZGdlbWVudHMucHVzaChuZXcgTWFwKCkpO1xuICAgICAgfSBlbHNlIGlmIChEYXRlLm5vdygpIC0gaGF2ZVsndGltZSddIDw9IHRoaXMuYWN0aXZlRGV2aWNlTWlsbGlzZWNvbmRzKSB7XG4gICAgICAgIGFja25vd2xlZGdlbWVudHMucHVzaChuZXcgTWFwKGhhdmVbJ3ZlY3RvciddKSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBhY2tub3dsZWRnZW1lbnRzO1xuICB9XG5cbiAgcHJpdmF0ZSBhcHBseShvcGVyYXRpb246IERhdGFTdG9yZU9wZXJhdGlvbik6IHZvaWQge1xuICAgIHRoaXMucmVwbGljYS5hcHBseShvcGVyYXRpb24pO1xuICAgIHRoaXMudmVjdG9yLnNldChvcGVyYXRpb24uZGV2aWNlLCBvcGVyYXRpb24uc2VxdWVuY2UpO1xuICAgIHRoaXMub2JzZXJ2ZUNsb2NrKG9wZXJhdGlvbi50aW1lLCBvcGVyYXRpb24uY291bnRlcik7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGNoYW5nZShjaGFuZ2VzOiByZWFkb25seSBDaGFuZ2VbXSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IHRoaXMucGFyYW1zLmxvY2FsLmV4Y2x1c2l2ZShhc3luYyAoKSA9PiB7XG4gICAgICBhd2FpdCB0aGlzLmxvYWRMb2NhbCgpO1xuICAgICAgYXdhaXQgdGhpcy5tZXJnZUZpbGVzKCk7XG4gICAgICBjb25zdCBvcGVyYXRpb25zOiBEYXRhU3RvcmVPcGVyYXRpb25bXSA9IFtdO1xuICAgICAgY29uc3QgY2FuZGlkYXRlID0gbmV3IERhdGFTdG9yZVJlcGxpY2EodGhpcy5wYXJhbXMua2luZCk7XG4gICAgICBmb3IgKGNvbnN0IG9wZXJhdGlvbiBvZiB0aGlzLnJlcGxpY2EuZXhwb3J0KCkpIHtcbiAgICAgICAgY2FuZGlkYXRlLmFwcGx5KG9wZXJhdGlvbik7XG4gICAgICB9XG4gICAgICBsZXQgc2VxdWVuY2UgPSB0aGlzLnZlY3Rvci5nZXQodGhpcy5kZXZpY2UpID8/IDA7XG4gICAgICBmb3IgKGNvbnN0IGNoYW5nZSBvZiBjaGFuZ2VzKSB7XG4gICAgICAgIGNvbnN0IG5vdyA9IERhdGUubm93KCk7XG4gICAgICAgIHRoaXMuY291bnRlciA9IG5vdyA+IHRoaXMudGltZSA/IDAgOiB0aGlzLmNvdW50ZXIgKyAxO1xuICAgICAgICB0aGlzLnRpbWUgPSBNYXRoLm1heChub3csIHRoaXMudGltZSk7XG4gICAgICAgIGNvbnN0IG9wZXJhdGlvbjogRGF0YVN0b3JlT3BlcmF0aW9uID0ge1xuICAgICAgICAgIC4uLmNoYW5nZSxcbiAgICAgICAgICBjb3VudGVyOiB0aGlzLmNvdW50ZXIsXG4gICAgICAgICAgZGV2aWNlOiB0aGlzLmRldmljZSxcbiAgICAgICAgICBzZXF1ZW5jZTogKytzZXF1ZW5jZSxcbiAgICAgICAgICB0YWdzOiBjYW5kaWRhdGUub2JzZXJ2ZWRUYWdzKGNoYW5nZS5rZXkpLFxuICAgICAgICAgIHRpbWU6IHRoaXMudGltZVxuICAgICAgICB9O1xuICAgICAgICBjYW5kaWRhdGUuYXBwbHkob3BlcmF0aW9uKTtcbiAgICAgICAgb3BlcmF0aW9ucy5wdXNoKG9wZXJhdGlvbik7XG4gICAgICB9XG4gICAgICBpZiAoIXRoaXMuaXNTeW5jRW5hYmxlZCkge1xuICAgICAgICBmb3IgKGNvbnN0IG9wZXJhdGlvbiBvZiBvcGVyYXRpb25zKSB7XG4gICAgICAgICAgdGhpcy5hcHBseShvcGVyYXRpb24pO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuaGFzVW5wdWJsaXNoZWRDaGFuZ2VzID0gdHJ1ZTtcbiAgICAgICAgYXdhaXQgdGhpcy5wZXJzaXN0KCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIC8vIFZhbGlkYXRlIGV2ZXJ5IHNpbmdsZSBvcGVyYXRpb24gYmVmb3JlIHB1Ymxpc2hpbmcgYW55IHByZWZpeCBvZiBhIGJhdGNoLlxuICAgICAgZm9yIChjb25zdCBvcGVyYXRpb24gb2Ygb3BlcmF0aW9ucykge1xuICAgICAgICBpZiAoIXRoaXMudHJhbnNwb3J0LmZpdHMoW29wZXJhdGlvbl0pKSB7XG4gICAgICAgICAgYXdhaXQgdGhpcy50cmFuc3BvcnQud3JpdGUoYCR7dGhpcy5kZXZpY2VSb290KCl9L2xvZy0ke1N0cmluZyhvcGVyYXRpb24uc2VxdWVuY2UpfSR7dGhpcy50cmFuc3BvcnQuZXh0ZW5zaW9ufWAsIFtvcGVyYXRpb25dKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgbGV0IGJhdGNoOiBEYXRhU3RvcmVPcGVyYXRpb25bXSA9IFtdO1xuICAgICAgZm9yIChjb25zdCBvcGVyYXRpb24gb2Ygb3BlcmF0aW9ucykge1xuICAgICAgICBpZiAoIXRoaXMudHJhbnNwb3J0LmZpdHMoWy4uLmJhdGNoLCBvcGVyYXRpb25dKSkge1xuICAgICAgICAgIGF3YWl0IHRoaXMucHVibGlzaChiYXRjaCk7XG4gICAgICAgICAgYmF0Y2ggPSBbXTtcbiAgICAgICAgfVxuICAgICAgICBiYXRjaC5wdXNoKG9wZXJhdGlvbik7XG4gICAgICB9XG4gICAgICBpZiAoYmF0Y2gubGVuZ3RoID4gMCkge1xuICAgICAgICBhd2FpdCB0aGlzLnB1Ymxpc2goYmF0Y2gpO1xuICAgICAgfVxuICAgICAgYXdhaXQgdGhpcy5wZXJzaXN0KCk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGNoZWNrcG9pbnQoKTogQ2hlY2twb2ludCB7XG4gICAgcmV0dXJuIHsgY291bnRlcjogdGhpcy5jb3VudGVyLCBmb3JtYXQ6IDEsIGtpbmQ6IHRoaXMucGFyYW1zLmtpbmQsIG9wZXJhdGlvbnM6IHRoaXMucmVwbGljYS5leHBvcnQoKSwgdGltZTogdGhpcy50aW1lLCB2ZWN0b3I6IFsuLi50aGlzLnZlY3Rvcl0gfTtcbiAgfVxuXG4gIHByaXZhdGUgZGV2aWNlUm9vdCgpOiBzdHJpbmcge1xuICAgIHJldHVybiBgJHt0aGlzLnRyYW5zcG9ydC5yb290fS9kZXZpY2VzLyR7dGhpcy5kZXZpY2V9YDtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgbG9hZExvY2FsKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMucmVwbGljYSA9IG5ldyBEYXRhU3RvcmVSZXBsaWNhKHRoaXMucGFyYW1zLmtpbmQpO1xuICAgIHRoaXMudmVjdG9yLmNsZWFyKCk7XG4gICAgdGhpcy50aW1lID0gMDtcbiAgICB0aGlzLmNvdW50ZXIgPSAwO1xuICAgIHRoaXMubG9jYWxSZWNvcmRzLmNsZWFyKCk7XG4gICAgdGhpcy5rbm93blRyYW5zcG9ydFJvb3RzLmNsZWFyKCk7XG4gICAgdGhpcy5oYXNVbnB1Ymxpc2hlZENoYW5nZXMgPSBmYWxzZTtcbiAgICBjb25zdCByZWNvcmRzID0gYXdhaXQgdGhpcy5wYXJhbXMubG9jYWwuZW50cmllcygpO1xuICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIHJlY29yZHMpIHtcbiAgICAgIHN3aXRjaCAoa2V5KSB7XG4gICAgICAgIGNhc2UgJ3NoYXJlZC1jaGVja3BvaW50LXYxJzoge1xuICAgICAgICAgIHRoaXMubWVyZ2VDaGVja3BvaW50KHZhbHVlKTtcblxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ3NoYXJlZC10cmFuc3BvcnQtcm9vdHMtdjEnOiB7XG4gICAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignSW52YWxpZCBsb2NhbCBkYXRhLXN0b3JlIHRyYW5zcG9ydCByb290cycpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb25zdCBzdWZmaXggPSBgLyR7dGhpcy5wYXJhbXMucGx1Z2luSWR9LyR7dGhpcy5wYXJhbXMuc3RvcmVJZH1gO1xuICAgICAgICAgIGZvciAoY29uc3Qgcm9vdCBvZiB2YWx1ZSkge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiByb290ICE9PSAnc3RyaW5nJyB8fCAhcm9vdC5lbmRzV2l0aChzdWZmaXgpKSB7XG4gICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBsb2NhbCBkYXRhLXN0b3JlIHRyYW5zcG9ydCByb290cycpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gVmFsaWRhdGUgcmVtZW1iZXJlZCBwYXRocyB3aXRob3V0IHJlYWRpbmcgdGhlIGFkYXB0ZXIgb3IgYWN0aXZhdGluZyBhIHdyaXRlci5cbiAgICAgICAgICAgIGNvbnN0IHRyYW5zcG9ydCA9IG5ldyBEYXRhU3RvcmVUcmFuc3BvcnQoeyAuLi50aGlzLnBhcmFtcywgZm9sZGVyOiByb290LnNsaWNlKDAsIC1zdWZmaXgubGVuZ3RoKSB9KTtcbiAgICAgICAgICAgIHRoaXMua25vd25UcmFuc3BvcnRSb290cy5hZGQodHJhbnNwb3J0LnJvb3QpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ3NoYXJlZC11bnB1Ymxpc2hlZC12MSc6IHtcbiAgICAgICAgICB0aGlzLmhhc1VucHVibGlzaGVkQ2hhbmdlcyA9IHZhbHVlID09PSB0cnVlO1xuXG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgIGlmIChrZXkuc3RhcnRzV2l0aChSRUNPUkRfUFJFRklYKSkge1xuICAgICAgICAgICAgdGhpcy5yZXBsaWNhLmFwcGx5KHZhbHVlKTtcbiAgICAgICAgICAgIHRoaXMubG9jYWxSZWNvcmRzLnNldChrZXksIGVuc3VyZU5vbk51bGxhYmxlKEpTT04uc3RyaW5naWZ5KHZhbHVlKSkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgbWVyZ2VDaGVja3BvaW50KHZhbHVlOiB1bmtub3duKTogdm9pZCB7XG4gICAgaWYgKFxuICAgICAgIWlzT2JqZWN0KHZhbHVlKSB8fCB2YWx1ZVsnZm9ybWF0J10gIT09IDEgfHwgdmFsdWVbJ2tpbmQnXSAhPT0gdGhpcy5wYXJhbXMua2luZFxuICAgICAgfHwgIUFycmF5LmlzQXJyYXkodmFsdWVbJ29wZXJhdGlvbnMnXSkgfHwgIXZhbHVlWydvcGVyYXRpb25zJ10uZXZlcnkoaXNEYXRhU3RvcmVPcGVyYXRpb24pXG4gICAgICB8fCAhaXNWZWN0b3IodmFsdWVbJ3ZlY3RvciddKSB8fCAhTnVtYmVyLmlzU2FmZUludGVnZXIodmFsdWVbJ3RpbWUnXSkgfHwgIU51bWJlci5pc1NhZmVJbnRlZ2VyKHZhbHVlWydjb3VudGVyJ10pXG4gICAgKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgZGF0YS1zdG9yZSBjaGVja3BvaW50IG9yIGluY29tcGF0aWJsZSBtZXJnZSBydWxlJyk7XG4gICAgfVxuICAgIGZvciAoY29uc3Qgb3BlcmF0aW9uIG9mIHZhbHVlWydvcGVyYXRpb25zJ10pIHtcbiAgICAgIHRoaXMucmVwbGljYS5hcHBseShvcGVyYXRpb24pO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IFtkZXZpY2UsIHNlcXVlbmNlXSBvZiB2YWx1ZVsndmVjdG9yJ10pIHtcbiAgICAgIHRoaXMudmVjdG9yLnNldChkZXZpY2UsIE1hdGgubWF4KHNlcXVlbmNlLCB0aGlzLnZlY3Rvci5nZXQoZGV2aWNlKSA/PyAwKSk7XG4gICAgfVxuICAgIHRoaXMub2JzZXJ2ZUNsb2NrKE51bWJlcih2YWx1ZVsndGltZSddKSwgTnVtYmVyKHZhbHVlWydjb3VudGVyJ10pKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgbWVyZ2VGaWxlcygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoIXRoaXMuaXNTeW5jRW5hYmxlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBhd2FpdCB0aGlzLmxvY2F0aW9ucy5yZWZyZXNoKCk7XG4gICAgZm9yIChjb25zdCB0cmFuc3BvcnQgb2YgdGhpcy5sb2NhdGlvbnMudHJhbnNwb3J0cykge1xuICAgICAgYXdhaXQgdGhpcy5tZXJnZVRyYW5zcG9ydCh0cmFuc3BvcnQpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgbWVyZ2VUcmFuc3BvcnQodHJhbnNwb3J0OiBEYXRhU3RvcmVUcmFuc3BvcnQpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBhbGxGaWxlcyA9IGF3YWl0IHRyYW5zcG9ydC5saXN0KCk7XG4gICAgY29uc3QgZmlsZXMgPSBhbGxGaWxlcy5maWx0ZXIoKHBhdGgpID0+IHBhdGguc3RhcnRzV2l0aChgJHt0cmFuc3BvcnQucm9vdH0vZGV2aWNlcy9gKSk7XG4gICAgY29uc3QgbWFuaWZlc3RzID0gZmlsZXMuZmlsdGVyKChmaWxlKSA9PiAvXFwvc25hcHNob3QtW1xcdy1dKy1tYW5pZmVzdFxcLig/Om1kfGpzb24pJC8udGVzdChmaWxlKSk7XG4gICAgZm9yIChjb25zdCBwYXRoIG9mIG1hbmlmZXN0cykge1xuICAgICAgY29uc3Qgc25hcHNob3QgPSBhd2FpdCB0cmFuc3BvcnQucmVhZFNuYXBzaG90KHBhdGgpO1xuICAgICAgaWYgKHNuYXBzaG90ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhpcy5tZXJnZUNoZWNrcG9pbnQoc25hcHNob3QpO1xuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBvcGVyYXRpb25zOiBEYXRhU3RvcmVPcGVyYXRpb25bXSA9IFtdO1xuICAgIGNvbnN0IHNlZ21lbnRzID0gZmlsZXMuZmlsdGVyKChmaWxlKSA9PiAvXFwvbG9nLVxcZCtcXC4oPzptZHxqc29uKSQvLnRlc3QoZmlsZSkpO1xuICAgIGZvciAoY29uc3QgcGF0aCBvZiBzZWdtZW50cykge1xuICAgICAgY29uc3Qgc2VnbWVudCA9IGF3YWl0IHRyYW5zcG9ydC5yZWFkKHBhdGgpO1xuICAgICAgaWYgKHNlZ21lbnQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGlmICghQXJyYXkuaXNBcnJheShzZWdtZW50KSB8fCAhc2VnbWVudC5ldmVyeShpc0RhdGFTdG9yZU9wZXJhdGlvbikpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGRhdGEtc3RvcmUgam91cm5hbCBzZWdtZW50Jyk7XG4gICAgICB9XG4gICAgICBjb25zdCBvd25lciA9IHBhdGguc3BsaXQoJy8nKS5hdChPV05FUl9QQVRIX0lOREVYKTtcbiAgICAgIGlmIChzZWdtZW50LnNvbWUoKG9wZXJhdGlvbikgPT4gb3BlcmF0aW9uLmRldmljZSAhPT0gb3duZXIpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignSm91cm5hbCBzZWdtZW50IGhhcyBhIGRpZmZlcmVudCB3cml0ZXInKTtcbiAgICAgIH1cbiAgICAgIG9wZXJhdGlvbnMucHVzaCguLi5zZWdtZW50KTtcbiAgICB9XG4gICAgb3BlcmF0aW9ucy5zb3J0KChmaXJzdCwgc2Vjb25kKSA9PiBmaXJzdC5kZXZpY2UubG9jYWxlQ29tcGFyZShzZWNvbmQuZGV2aWNlKSB8fCBmaXJzdC5zZXF1ZW5jZSAtIHNlY29uZC5zZXF1ZW5jZSk7XG4gICAgZm9yIChjb25zdCBvcGVyYXRpb24gb2Ygb3BlcmF0aW9ucykge1xuICAgICAgaWYgKG9wZXJhdGlvbi5zZXF1ZW5jZSA9PT0gKHRoaXMudmVjdG9yLmdldChvcGVyYXRpb24uZGV2aWNlKSA/PyAwKSArIDEpIHtcbiAgICAgICAgdGhpcy5hcHBseShvcGVyYXRpb24pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgb2JzZXJ2ZUNsb2NrKHRpbWU6IG51bWJlciwgY291bnRlcjogbnVtYmVyKTogdm9pZCB7XG4gICAgaWYgKHRpbWUgPiB0aGlzLnRpbWUpIHtcbiAgICAgIHRoaXMudGltZSA9IHRpbWU7XG4gICAgICB0aGlzLmNvdW50ZXIgPSBjb3VudGVyO1xuICAgIH0gZWxzZSBpZiAodGltZSA9PT0gdGhpcy50aW1lKSB7XG4gICAgICB0aGlzLmNvdW50ZXIgPSBNYXRoLm1heCh0aGlzLmNvdW50ZXIsIGNvdW50ZXIpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgcGVyc2lzdCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBjaGVja3BvaW50ID0gdGhpcy5jaGVja3BvaW50KCk7XG4gICAgY29uc3QgcmVjb3JkcyA9IG5ldyBNYXA8c3RyaW5nLCBEYXRhU3RvcmVPcGVyYXRpb24+KCk7XG4gICAgZm9yIChjb25zdCBvcGVyYXRpb24gb2YgY2hlY2twb2ludC5vcGVyYXRpb25zKSB7XG4gICAgICBjb25zdCBpZGVudGl0eSA9IHRoaXMucGFyYW1zLmtpbmQgPT09ICdvYnNlcnZlZC1yZW1vdmUtc2V0JyA/IGAke29wZXJhdGlvbi5kZXZpY2V9OiR7U3RyaW5nKG9wZXJhdGlvbi5zZXF1ZW5jZSl9YCA6IG9wZXJhdGlvbi5rZXk7XG4gICAgICByZWNvcmRzLnNldChgJHtSRUNPUkRfUFJFRklYfSR7aWRlbnRpdHl9YCwgb3BlcmF0aW9uKTtcbiAgICB9XG4gICAgY29uc3QgZW50cmllczogW3N0cmluZywgdW5rbm93bl1bXSA9IFsuLi5yZWNvcmRzXS5maWx0ZXIoKFtrZXksIHZhbHVlXSkgPT4gdGhpcy5sb2NhbFJlY29yZHMuZ2V0KGtleSkgIT09IEpTT04uc3RyaW5naWZ5KHZhbHVlKSk7XG4gICAgY29uc3QgcmVtb3ZlZEtleXMgPSBbLi4udGhpcy5sb2NhbFJlY29yZHMua2V5cygpXS5maWx0ZXIoKGtleSkgPT4gIXJlY29yZHMuaGFzKGtleSkpO1xuICAgIGVudHJpZXMucHVzaChbJ3NoYXJlZC1jaGVja3BvaW50LXYxJywgeyAuLi5jaGVja3BvaW50LCBvcGVyYXRpb25zOiBbXSB9XSwgWydzaGFyZWQtdW5wdWJsaXNoZWQtdjEnLCB0aGlzLmhhc1VucHVibGlzaGVkQ2hhbmdlc10sIFsnc2hhcmVkLXRyYW5zcG9ydC1yb290cy12MScsIHRoaXMudHJhbnNwb3J0Um9vdHNdKTtcbiAgICBhd2FpdCB0aGlzLnBhcmFtcy5sb2NhbC5jb21taXQoeyBlbnRyaWVzLCByZW1vdmVkS2V5cyB9KTtcbiAgICBpZiAoIXRoaXMuaXNTeW5jRW5hYmxlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAodGhpcy5oYXNVbnB1Ymxpc2hlZENoYW5nZXMpIHtcbiAgICAgIGF3YWl0IHRoaXMudHJhbnNwb3J0LndyaXRlU25hcHNob3QoeyBiYXNlOiBgJHt0aGlzLmRldmljZVJvb3QoKX0vc25hcHNob3QtJHt3aW5kb3cuY3J5cHRvLnJhbmRvbVVVSUQoKX0tbWFuaWZlc3RgLCBwYXlsb2FkOiBjaGVja3BvaW50IH0pO1xuICAgICAgYXdhaXQgdGhpcy5wYXJhbXMubG9jYWwuc2V0KCdzaGFyZWQtdW5wdWJsaXNoZWQtdjEnLCBmYWxzZSk7XG4gICAgICB0aGlzLmhhc1VucHVibGlzaGVkQ2hhbmdlcyA9IGZhbHNlO1xuICAgIH1cbiAgICBhd2FpdCB0aGlzLnRyYW5zcG9ydC53cml0ZShgJHt0aGlzLmRldmljZVJvb3QoKX0vaGF2ZSR7dGhpcy50cmFuc3BvcnQuZXh0ZW5zaW9ufWAsIHsgZm9ybWF0OiAxLCB0aW1lOiBEYXRlLm5vdygpLCB2ZWN0b3I6IFsuLi50aGlzLnZlY3Rvcl0gfSk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHB1Ymxpc2gob3BlcmF0aW9uczogRGF0YVN0b3JlT3BlcmF0aW9uW10pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBmaXJzdCA9IGVuc3VyZU5vbk51bGxhYmxlKG9wZXJhdGlvbnNbMF0pO1xuICAgIGF3YWl0IHRoaXMudHJhbnNwb3J0LndyaXRlSW1tdXRhYmxlKGAke3RoaXMuZGV2aWNlUm9vdCgpfS9sb2ctJHtTdHJpbmcoZmlyc3Quc2VxdWVuY2UpfSR7dGhpcy50cmFuc3BvcnQuZXh0ZW5zaW9ufWAsIG9wZXJhdGlvbnMpO1xuICAgIGZvciAoY29uc3Qgb3BlcmF0aW9uIG9mIG9wZXJhdGlvbnMpIHtcbiAgICAgIHRoaXMuYXBwbHkob3BlcmF0aW9uKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gaXNPYmplY3QodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB7XG4gIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIHZhbHVlICE9PSBudWxsICYmICFBcnJheS5pc0FycmF5KHZhbHVlKTtcbn1cblxuZnVuY3Rpb24gaXNWZWN0b3IodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBWZXJzaW9uVmVjdG9yIHtcbiAgcmV0dXJuIEFycmF5LmlzQXJyYXkodmFsdWUpICYmIHZhbHVlLmV2ZXJ5KChlbnRyeTogdW5rbm93bikgPT5cbiAgICBBcnJheS5pc0FycmF5KGVudHJ5KSAmJiBlbnRyeS5sZW5ndGggPT09IFZFQ1RPUl9FTlRSWV9MRU5HVEhcbiAgICAmJiB0eXBlb2YgZW50cnlbMF0gPT09ICdzdHJpbmcnICYmIC9eW1xcdy1dKyQvLnRlc3QoZW50cnlbMF0pICYmIE51bWJlci5pc1NhZmVJbnRlZ2VyKGVudHJ5WzFdKSAmJiBOdW1iZXIoZW50cnlbMV0pID49IDBcbiAgKTtcbn1cblxuLyogZXNsaW50LWVuYWJsZSBuL25vLXVuc3VwcG9ydGVkLWZlYXR1cmVzL25vZGUtYnVpbHRpbnMgLS0gVGhlc2UgYXJlIE9ic2lkaWFuIHJlbmRlcmVyIFdlYiBBUElzLCBub3QgTm9kZSBidWlsdGlucy4gKi9cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFVQSxTQUFTLHlCQUF5QjtBQVNsQyxTQUFTLDBCQUEwQjtBQUNuQztBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsT0FDSztBQUNQLFNBQVMsMEJBQTBCO0FBRW5DLE1BQU0scUNBQXFDO0FBRTNDLE1BQU0sbUJBQW1CO0FBRXpCLE1BQU0sc0JBQXNCO0FBQzVCLE1BQU0sb0JBQW9CO0FBQzFCLE1BQU0sZ0JBQWdCO0FBcUZmLE1BQU0sZ0JBQWdCO0FBQUEsRUEwQm5CLFlBQStCLFFBQXNELFFBQWdCO0FBQXRFO0FBQXNEO0FBQzNGLFNBQUssWUFBWSxJQUFJLG1CQUFtQixNQUFNO0FBQzlDLFNBQUssZ0JBQWdCLE9BQU8saUJBQWlCO0FBQzdDLFNBQUssVUFBVSxJQUFJLGlCQUFpQixPQUFPLElBQUk7QUFDL0MsU0FBSywyQkFBMkIsT0FBTyw0QkFBNEI7QUFDbkUsUUFBSSxDQUFDLE9BQU8sU0FBUyxLQUFLLHdCQUF3QixLQUFLLEtBQUssNEJBQTRCLEdBQUc7QUFDekYsWUFBTSxJQUFJLE1BQU0sNkNBQTZDO0FBQUEsSUFDL0Q7QUFBQSxFQUNGO0FBQUEsRUFSdUM7QUFBQSxFQUFzRDtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQXBCN0YsSUFBVyxpQkFBMkI7QUFDcEMsV0FBTyxDQUFDLEdBQUcsb0JBQUksSUFBSSxDQUFDLEdBQUcsS0FBSyxxQkFBcUIsR0FBRyxLQUFLLFVBQVUsV0FBVyxJQUFJLENBQUMsY0FBYyxVQUFVLElBQUksQ0FBQyxDQUFDLENBQUM7QUFBQSxFQUNwSDtBQUFBLEVBRWlCO0FBQUEsRUFDVCxVQUFVO0FBQUEsRUFDVix3QkFBd0I7QUFBQSxFQUN4QjtBQUFBLEVBQ1Msc0JBQXNCLG9CQUFJLElBQVk7QUFB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
|
|
469
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9kYXRhLXN0b3Jlcy9zaGFyZWQtZGF0YS1zdG9yZS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKiBlc2xpbnQtZGlzYWJsZSBuL25vLXVuc3VwcG9ydGVkLWZlYXR1cmVzL25vZGUtYnVpbHRpbnMgLS0gVGhlc2UgYXJlIE9ic2lkaWFuIHJlbmRlcmVyIFdlYiBBUElzLCBub3QgTm9kZSBidWlsdGlucy4gKi9cbi8qKlxuICogQGZpbGVcbiAqXG4gKiBNZXJnZWFibGUgcGx1Z2luIGRhdGEsIHRyYW5zcG9ydGVkIGFzIHNpbmdsZS13cml0ZXIgam91cm5hbCBzZWdtZW50cyBhbmQgY2h1bmtlZCBzbmFwc2hvdHMuXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBEYXRhQWRhcHRlciB9IGZyb20gJ29ic2lkaWFuJztcbmltcG9ydCB0eXBlIHsgSnNvblZhbHVlIH0gZnJvbSAndHlwZS1mZXN0JztcblxuaW1wb3J0IHsgZW5zdXJlTm9uTnVsbGFibGUgfSBmcm9tICdAbW5hb3Vtb3YvdHlwZXNjcmlwdC1saWIvdHlwZS1ndWFyZHMnO1xuXG5pbXBvcnQgdHlwZSB7IERhdGFTdG9yZUxvY2F0aW9uIH0gZnJvbSAnLi9kYXRhLXN0b3JlLWxvY2F0aW9ucy50cyc7XG5pbXBvcnQgdHlwZSB7XG4gIERhdGFTdG9yZU1lcmdlS2luZCxcbiAgRGF0YVN0b3JlT3BlcmF0aW9uXG59IGZyb20gJy4vZGF0YS1zdG9yZS1yZXBsaWNhLnRzJztcbmltcG9ydCB0eXBlIHsgTG9jYWxEYXRhU3RvcmUgfSBmcm9tICcuL2xvY2FsLWRhdGEtc3RvcmUudHMnO1xuXG5pbXBvcnQgeyBEYXRhU3RvcmVMb2NhdGlvbnMgfSBmcm9tICcuL2RhdGEtc3RvcmUtbG9jYXRpb25zLnRzJztcbmltcG9ydCB7XG4gIERhdGFTdG9yZVJlcGxpY2EsXG4gIGlzRGF0YVN0b3JlT3BlcmF0aW9uXG59IGZyb20gJy4vZGF0YS1zdG9yZS1yZXBsaWNhLnRzJztcbmltcG9ydCB7IERhdGFTdG9yZVRyYW5zcG9ydCB9IGZyb20gJy4vZGF0YS1zdG9yZS10cmFuc3BvcnQudHMnO1xuXG5jb25zdCBERUZBVUxUX0FDVElWRV9ERVZJQ0VfTUlMTElTRUNPTkRTID0gMl81OTJfMDAwXzAwMDtcblxuY29uc3QgT1dORVJfUEFUSF9JTkRFWCA9IC0yO1xuXG5jb25zdCBWRUNUT1JfRU5UUllfTEVOR1RIID0gMjtcbmNvbnN0IERFVklDRV9QQVRIX1BBUlRTID0gMjtcbmNvbnN0IERFVklDRV9JRF9SRUdfRVhQID0gL15bXFx3LV0rJC87XG5jb25zdCBSRUNPUkRfUFJFRklYID0gJ3NoYXJlZC1yZWNvcmQtdjE6JztcblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciBvcGVuaW5nIGEgc2hhcmVkIHN0b3JlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNoYXJlZERhdGFTdG9yZU9wZW5QYXJhbXMge1xuICAvKipcbiAgICogRGV2aWNlIHJldGlyZW1lbnQgaW50ZXJ2YWwsIG1lYXN1cmVkIGZyb20gaXRzIGxhc3QgYWNrbm93bGVkZ2VtZW50LlxuICAgKlxuICAgKiBAZGVmYXVsdCBgMjU5MjAwMDAwMGBcbiAgICovXG4gIHJlYWRvbmx5IGFjdGl2ZURldmljZU1pbGxpc2Vjb25kcz86IG51bWJlcjtcbiAgLyoqXG4gICAqIFZhdWx0IGFkYXB0ZXIuXG4gICAqL1xuICByZWFkb25seSBhZGFwdGVyOiBEYXRhQWRhcHRlcjtcbiAgLyoqXG4gICAqIFZhdWx0LXJlbGF0aXZlIGZvbGRlci4gSGlkZGVuIHNlZ21lbnRzIGFyZSBhbGxvd2VkOyBjYWxsZXJzIG11c3QgYXJyYW5nZSB0aGVpciBzeW5jaHJvbml6YXRpb24uXG4gICAqXG4gICAqIEBkZWZhdWx0IGAnUGx1Z2luIGRhdGEnYFxuICAgKi9cbiAgcmVhZG9ubHkgZm9sZGVyPzogc3RyaW5nO1xuICAvKipcbiAgICogTmV3IGRvY3VtZW50IGVuY29kaW5nIGF0IHRoZSBwZXJtYW5lbnQgZGlzY292ZXJ5IGFuY2hvci5cbiAgICpcbiAgICogQGRlZmF1bHQgYCdtYXJrZG93bidgXG4gICAqL1xuICByZWFkb25seSBmb3JtYXQ/OiAnanNvbicgfCAnbWFya2Rvd24nO1xuICAvKipcbiAgICogRW5hYmxlcyB2YXVsdCB0cmFuc3BvcnQuIERpc2FibGVkIHN0b3JlcyBtYWtlIG5vIGFkYXB0ZXIgY2FsbHMsIGluY2x1ZGluZyBkdXJpbmcgY29tcGFjdGlvbi5cbiAgICpcbiAgICogQGRlZmF1bHQgYHRydWVgXG4gICAqL1xuICByZWFkb25seSBpc1N5bmNFbmFibGVkPzogYm9vbGVhbjtcbiAgLyoqXG4gICAqIEltbXV0YWJsZSBtZXJnZSBydWxlOyBjaGFuZ2luZyBpdCByZXF1aXJlcyBhIG5ldyBzdG9yZSBpZC5cbiAgICovXG4gIHJlYWRvbmx5IGtpbmQ6IERhdGFTdG9yZU1lcmdlS2luZDtcbiAgLyoqXG4gICAqIERlZGljYXRlZCBsb2NhbCBzdG9yZSBzY29wZWQgdG8gVEhJUyB2YXVsdCwgcGx1Z2luIGFuZCBzaGFyZWQtc3RvcmUgc2NoZW1hLiBUaGUgY2FsbGVyIG93bnMgaXRzIGNvbm5lY3Rpb24uXG4gICAqL1xuICByZWFkb25seSBsb2NhbDogTG9jYWxEYXRhU3RvcmU7XG4gIC8qKlxuICAgKiBNYXhpbXVtIFVURi04IGJ5dGVzIHBlciBmaWxlLCB3cmFwcGVyIGluY2x1ZGVkLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgMTAwMDAwMGBcbiAgICovXG4gIHJlYWRvbmx5IG1heEZpbGVCeXRlcz86IG51bWJlcjtcbiAgLyoqXG4gICAqIE1heGltdW0gVVRGLTggYnl0ZXMgaW4gYSByZWNvbnN0cnVjdGVkIHNuYXBzaG90IGJlZm9yZSBKU09OIHBhcnNpbmcuXG4gICAqXG4gICAqIEBkZWZhdWx0IGA2NDAwMDAwMGBcbiAgICovXG4gIHJlYWRvbmx5IG1heFNuYXBzaG90Qnl0ZXM/OiBudW1iZXI7XG4gIC8qKlxuICAgKiBQbHVnaW4gbWFuaWZlc3QgaWQuXG4gICAqL1xuICByZWFkb25seSBwbHVnaW5JZDogc3RyaW5nO1xuICAvKipcbiAgICogU3RvcmUgaWQgaW5jbHVkaW5nIHRoZSBjb25zdW1lcidzIHNjaGVtYSB2ZXJzaW9uLlxuICAgKi9cbiAgcmVhZG9ubHkgc3RvcmVJZDogc3RyaW5nO1xufVxuXG5pbnRlcmZhY2UgQ2hhbmdlIHtcbiAgcmVhZG9ubHkgZGVsZXRlZDogYm9vbGVhbjtcbiAgcmVhZG9ubHkga2V5OiBzdHJpbmc7XG4gIHJlYWRvbmx5IHZhbHVlOiBKc29uVmFsdWU7XG59XG5cbmludGVyZmFjZSBDaGVja3BvaW50IHtcbiAgcmVhZG9ubHkgY291bnRlcjogbnVtYmVyO1xuICByZWFkb25seSBmb3JtYXQ6IDE7XG4gIHJlYWRvbmx5IGtpbmQ6IERhdGFTdG9yZU1lcmdlS2luZDtcbiAgcmVhZG9ubHkgb3BlcmF0aW9uczogRGF0YVN0b3JlT3BlcmF0aW9uW107XG4gIHJlYWRvbmx5IHRpbWU6IG51bWJlcjtcbiAgcmVhZG9ubHkgdmVjdG9yOiBWZXJzaW9uVmVjdG9yO1xufVxuXG50eXBlIFZlcnNpb25WZWN0b3IgPSBbc3RyaW5nLCBudW1iZXJdW107XG5cbi8qKlxuICogQSBkZXZpY2UtbG9jYWwgcXVlcnkgcmVwbGljYSBiYWNrZWQgYnkgdmF1bHQgZmlsZXMuIENhbGwgYHN5bmNocm9uaXplYCBhZnRlciB0cmFuc3BvcnQgY2hhbmdlcyBvciBwZXJpb2RpY2FsbHkuXG4gKiBObyB0aW1lciBvciBldmVudCBoYW5kbGVyIG91dGxpdmVzIHRoZSBjb25zdW1lcjogdGhlIGNvbnN1bWVyIHNjaGVkdWxlcyBzeW5jaHJvbml6YXRpb24gYW5kIG93bnMgdW5sb2FkaW5nLlxuICovXG5leHBvcnQgY2xhc3MgU2hhcmVkRGF0YVN0b3JlIHtcbiAgLyoqXG4gIENvbmZpZ3VyZWQgYW5kIHJlbWVtYmVyZWQgcmVhZGVyIHJvb3RzLCBpbmNsdWRpbmcgcmV0YWluZWQgbWlncmF0aW9uIHNvdXJjZXMgd2hpbGUgZGlzYWJsZWQuXG4gICAqXG4gICAqIEByZXR1cm5zIFVuaXF1ZSByb290cyBzdWl0YWJsZSBmb3IgbWV0YWRhdGEgZXhjbHVzaW9uIHdpdGhvdXQgYWRhcHRlciBhY2Nlc3MuXG4gICAqL1xuICBwdWJsaWMgZ2V0IHRyYW5zcG9ydFJvb3RzKCk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gWy4uLm5ldyBTZXQoWy4uLnRoaXMua25vd25UcmFuc3BvcnRSb290cywgLi4udGhpcy5sb2NhdGlvbnMudHJhbnNwb3J0cy5tYXAoKHRyYW5zcG9ydCkgPT4gdHJhbnNwb3J0LnJvb3QpXSldO1xuICB9XG5cbiAgcHJpdmF0ZSByZWFkb25seSBhY3RpdmVEZXZpY2VNaWxsaXNlY29uZHM6IG51bWJlcjtcbiAgcHJpdmF0ZSBjb3VudGVyID0gMDtcbiAgcHJpdmF0ZSBoYXNVbnB1Ymxpc2hlZENoYW5nZXMgPSBmYWxzZTtcbiAgcHJpdmF0ZSBpc1N5bmNFbmFibGVkOiBib29sZWFuO1xuICBwcml2YXRlIHJlYWRvbmx5IGtub3duVHJhbnNwb3J0Um9vdHMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgcHJpdmF0ZSByZWFkb25seSBsb2NhbFJlY29yZHMgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nPigpO1xuICBwcml2YXRlIHJlYWRvbmx5IGxvY2F0aW9uczogRGF0YVN0b3JlTG9jYXRpb25zO1xuICBwcml2YXRlIHJlcGxpY2E6IERhdGFTdG9yZVJlcGxpY2E7XG4gIHByaXZhdGUgdGltZSA9IDA7XG5cbiAgcHJpdmF0ZSByZWFkb25seSB2ZWN0b3IgPSBuZXcgTWFwPHN0cmluZywgbnVtYmVyPigpO1xuXG4gIHByaXZhdGUgZ2V0IHRyYW5zcG9ydCgpOiBEYXRhU3RvcmVUcmFuc3BvcnQge1xuICAgIHJldHVybiBlbnN1cmVOb25OdWxsYWJsZSh0aGlzLmxvY2F0aW9ucy50cmFuc3BvcnRzLmF0KC0xKSk7XG4gIH1cblxuICBwcml2YXRlIGNvbnN0cnVjdG9yKHByb3RlY3RlZCByZWFkb25seSBwYXJhbXM6IFNoYXJlZERhdGFTdG9yZU9wZW5QYXJhbXMsIHByb3RlY3RlZCByZWFkb25seSBkZXZpY2U6IHN0cmluZykge1xuICAgIHRoaXMubG9jYXRpb25zID0gbmV3IERhdGFTdG9yZUxvY2F0aW9ucyhwYXJhbXMpO1xuICAgIHRoaXMuaXNTeW5jRW5hYmxlZCA9IHBhcmFtcy5pc1N5bmNFbmFibGVkID8/IHRydWU7XG4gICAgdGhpcy5yZXBsaWNhID0gbmV3IERhdGFTdG9yZVJlcGxpY2EocGFyYW1zLmtpbmQpO1xuICAgIHRoaXMuYWN0aXZlRGV2aWNlTWlsbGlzZWNvbmRzID0gcGFyYW1zLmFjdGl2ZURldmljZU1pbGxpc2Vjb25kcyA/PyBERUZBVUxUX0FDVElWRV9ERVZJQ0VfTUlMTElTRUNPTkRTO1xuICAgIGlmICghTnVtYmVyLmlzRmluaXRlKHRoaXMuYWN0aXZlRGV2aWNlTWlsbGlzZWNvbmRzKSB8fCB0aGlzLmFjdGl2ZURldmljZU1pbGxpc2Vjb25kcyA8PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0RldmljZSByZXRpcmVtZW50IGludGVydmFsIG11c3QgYmUgcG9zaXRpdmUnKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogT3BlbnMgYW5kIHN5bmNocm9uaXplcyBhIHN0b3JlLCByZXN0b3JpbmcgaXRzIGRldmljZSBpZGVudGl0eSBleGNsdXNpdmVseSBmcm9tIEluZGV4ZWREQi5cbiAgICpcbiAgICogQHBhcmFtIHBhcmFtcyAtIFBlcnNpc3RlbmNlLCB0cmFuc3BvcnQgYW5kIG1lcmdlIHBvbGljeS5cbiAgICogQHJldHVybnMgQSBzeW5jaHJvbml6ZWQgcXVlcnkgcmVwbGljYS5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgYXN5bmMgb3BlbihwYXJhbXM6IFNoYXJlZERhdGFTdG9yZU9wZW5QYXJhbXMpOiBQcm9taXNlPFNoYXJlZERhdGFTdG9yZT4ge1xuICAgIGNvbnN0IGRldmljZSA9IGF3YWl0IHBhcmFtcy5sb2NhbC5nZXRPckNyZWF0ZSgnc2hhcmVkLWRldmljZS12MScsIHdpbmRvdy5jcnlwdG8ucmFuZG9tVVVJRCgpKTtcbiAgICBpZiAodHlwZW9mIGRldmljZSAhPT0gJ3N0cmluZycgfHwgIURFVklDRV9JRF9SRUdfRVhQLnRlc3QoZGV2aWNlKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGxvY2FsIGRhdGEtc3RvcmUgaWRlbnRpdHknKTtcbiAgICB9XG4gICAgY29uc3Qgc3RvcmUgPSBuZXcgU2hhcmVkRGF0YVN0b3JlKHBhcmFtcywgZGV2aWNlKTtcbiAgICBhd2FpdCBzdG9yZS5zeW5jaHJvbml6ZSgpO1xuICAgIHJldHVybiBzdG9yZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQdWJsaXNoZXMgYSBjb21wbGV0ZSBjaHVua2VkIHNuYXBzaG90IGFuZCB0cmltcyBvbmx5IHRoaXMgZGV2aWNlJ3MgYWNrbm93bGVkZ2VkIGpvdXJuYWwgc2VnbWVudHMuXG4gICAqIFJldGlyZWQgZGV2aWNlcyByZWpvaW4gYnkgbWVyZ2luZyBzbmFwc2hvdHM7IHRvbWJzdG9uZXMgcmVtYWluIGluIHNuYXBzaG90cyB0byBwcmV2ZW50IHJlc3VycmVjdGlvbi5cbiAgICpcbiAgICogQHJldHVybnMgQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiBjb21wYWN0aW9uIGZpbmlzaGVzLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIGNvbXBhY3QoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgdGhpcy5wYXJhbXMubG9jYWwuZXhjbHVzaXZlKGFzeW5jICgpID0+IHtcbiAgICAgIGF3YWl0IHRoaXMubG9hZExvY2FsKCk7XG4gICAgICBhd2FpdCB0aGlzLm1lcmdlRmlsZXMoKTtcbiAgICAgIGF3YWl0IHRoaXMucGVyc2lzdCgpO1xuICAgICAgaWYgKCF0aGlzLmlzU3luY0VuYWJsZWQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY29uc3QgZmlsZXMgPSBhd2FpdCB0aGlzLnRyYW5zcG9ydC5saXN0KCk7XG4gICAgICBjb25zdCBiYXNlID0gYCR7dGhpcy5kZXZpY2VSb290KCl9L3NuYXBzaG90LSR7d2luZG93LmNyeXB0by5yYW5kb21VVUlEKCl9LW1hbmlmZXN0YDtcbiAgICAgIGF3YWl0IHRoaXMudHJhbnNwb3J0LndyaXRlU25hcHNob3QoeyBiYXNlLCBwYXlsb2FkOiB0aGlzLmNoZWNrcG9pbnQoKSB9KTtcbiAgICAgIGNvbnN0IGFja25vd2xlZGdlbWVudHMgPSBhd2FpdCB0aGlzLmFja25vd2xlZGdlbWVudHMoZmlsZXMpO1xuICAgICAgZm9yIChjb25zdCBwYXRoIG9mIGZpbGVzKSB7XG4gICAgICAgIGlmICghcGF0aC5zdGFydHNXaXRoKGAke3RoaXMuZGV2aWNlUm9vdCgpfS9sb2ctYCkpIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBvcGVyYXRpb25zID0gYXdhaXQgdGhpcy50cmFuc3BvcnQucmVhZChwYXRoKTtcbiAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KG9wZXJhdGlvbnMpIHx8ICFvcGVyYXRpb25zLmV2ZXJ5KGlzRGF0YVN0b3JlT3BlcmF0aW9uKSkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGxhc3QgPSBNYXRoLm1heCguLi5vcGVyYXRpb25zLm1hcCgob3BlcmF0aW9uKSA9PiBvcGVyYXRpb24uc2VxdWVuY2UpKTtcbiAgICAgICAgaWYgKGFja25vd2xlZGdlbWVudHMuZXZlcnkoKHZlY3RvcikgPT4gKHZlY3Rvci5nZXQodGhpcy5kZXZpY2UpID8/IDApID49IGxhc3QpKSB7XG4gICAgICAgICAgYXdhaXQgdGhpcy50cmFuc3BvcnQucmVtb3ZlKHBhdGgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICAvLyBUaGUgY29tcGxldGUgbmV3IHNuYXBzaG90IGNvdmVycyBldmVyeSBlYXJsaWVyIHNuYXBzaG90IGZyb20gdGhpcyB3cml0ZXIuXG4gICAgICBmb3IgKGNvbnN0IHBhdGggb2YgZmlsZXMpIHtcbiAgICAgICAgaWYgKHBhdGguc3RhcnRzV2l0aChgJHt0aGlzLmRldmljZVJvb3QoKX0vc25hcHNob3QtYCkpIHtcbiAgICAgICAgICBhd2FpdCB0aGlzLnRyYW5zcG9ydC5yZW1vdmUocGF0aCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWNvZ25pemVzIHRyYW5zcG9ydCBmaWxlcywgcm9vdHMsIGFuZCBhbmNlc3RvciBmb2xkZXIgb3BlcmF0aW9ucyBmb3IgY29uc3VtZXIgZXZlbnQgZmlsdGVycy5cbiAgICpcbiAgICogQHBhcmFtIHBhdGggLSBWYXVsdC1yZWxhdGl2ZSBmaWxlIG9yIGZvbGRlciBwYXRoLlxuICAgKiBAcmV0dXJucyBXaGV0aGVyIHRoZSBwYXRoIGludGVyc2VjdHMgYW4gYWN0aXZlIG9yIHJldGFpbmVkIHRyYW5zcG9ydCByb290LlxuICAgKi9cbiAgcHVibGljIGNvbnRhaW5zVHJhbnNwb3J0UGF0aChwYXRoOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy50cmFuc3BvcnRSb290cy5zb21lKChyb290KSA9PiBwYXRoID09PSByb290IHx8IHBhdGguc3RhcnRzV2l0aChgJHtyb290fS9gKSB8fCByb290LnN0YXJ0c1dpdGgoYCR7cGF0aH0vYCkpO1xuICB9XG5cbiAgLyoqXG4gICAqIERlbGV0ZXMgYSByZWdpc3RlciBvciByZW1vdmVzIHRoZSBjdXJyZW50bHkgb2JzZXJ2ZWQgYWRkaXRpb25zIG9mIGEgc2V0IG1lbWJlci5cbiAgICpcbiAgICogQHBhcmFtIGtleSAtIFJlY29yZCBrZXkgb3Igc2V0IG1lbWJlci4gTWluL21heCByZWdpc3RlcnMgZGVsaWJlcmF0ZWx5IGNhbm5vdCBiZSBkZWxldGVkLlxuICAgKiBAcmV0dXJucyBBIHByb21pc2UgdGhhdCByZXNvbHZlcyBhZnRlciBqb3VybmFsIHB1YmxpY2F0aW9uIGFuZCBsb2NhbCBjb21taXQuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZGVsZXRlKGtleTogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgdGhpcy5jaGFuZ2UoW3sgZGVsZXRlZDogdHJ1ZSwga2V5LCB2YWx1ZTogbnVsbCB9XSk7XG4gIH1cblxuICAvKipcbiAgICogUmVhZHMgdGhlIGN1cnJlbnQgbG9jYWwgcXVlcnkgcmVwbGljYS5cbiAgICpcbiAgICogQHJldHVybnMgRGV0YWNoZWQga2V5L3ZhbHVlIHBhaXJzIGluIGRldGVybWluaXN0aWMgb3JkZXIuXG4gICAqL1xuICBwdWJsaWMgZW50cmllcygpOiBbc3RyaW5nLCB1bmtub3duXVtdIHtcbiAgICByZXR1cm4gdGhpcy5yZXBsaWNhLmVudHJpZXMoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWFkcyBhIHJlZ2lzdGVyIG9yIHNldCBtZW1iZXJzaGlwIGZyb20gdGhlIGN1cnJlbnQgbG9jYWwgcXVlcnkgcmVwbGljYS5cbiAgICpcbiAgICogQHBhcmFtIGtleSAtIFJlY29yZCBrZXkgb3Igc2V0IG1lbWJlci5cbiAgICogQHJldHVybnMgQSBkZXRhY2hlZCB2YWx1ZSwgb3IgYHVuZGVmaW5lZGAgd2hlbiBhYnNlbnQgb3IgZGVsZXRlZC5cbiAgICovXG4gIHB1YmxpYyBnZXQoa2V5OiBzdHJpbmcpOiB1bmtub3duIHtcbiAgICByZXR1cm4gdGhpcy5yZXBsaWNhLmdldChrZXkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbG9jYXRlcyBvbmx5IHRoaXMgcGx1Z2luL3N0b3JlIHN1YnRyZWU7IGtlZXAgb3BlbmluZyB3aXRoIHRoZSBvcmlnaW5hbCBhbmNob3IgcGFyYW1ldGVycy5cbiAgICpcbiAgICogQHBhcmFtIGxvY2F0aW9uIC0gTmV3IGZvbGRlciBhbmQgZG9jdW1lbnQgZm9ybWF0LlxuICAgKiBAcmV0dXJucyBBIHByb21pc2UgdGhhdCByZXNvbHZlcyBhZnRlciBoaXN0b3J5IGhhcyBiZWVuIGNvcGllZCBhbmQgdmVyaWZpZWQuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgcmVsb2NhdGUobG9jYXRpb246IERhdGFTdG9yZUxvY2F0aW9uKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgdGhpcy5wYXJhbXMubG9jYWwuZXhjbHVzaXZlKGFzeW5jICgpID0+IHtcbiAgICAgIGF3YWl0IHRoaXMubG9hZExvY2FsKCk7XG4gICAgICBpZiAoIXRoaXMuaXNTeW5jRW5hYmxlZCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0VuYWJsZSBkYXRhLXN0b3JlIHN5bmNocm9uaXphdGlvbiBiZWZvcmUgcmVsb2NhdGlvbicpO1xuICAgICAgfVxuICAgICAgYXdhaXQgdGhpcy5sb2NhdGlvbnMucmVsb2NhdGUobG9jYXRpb24pO1xuICAgICAgYXdhaXQgdGhpcy5tZXJnZUZpbGVzKCk7XG4gICAgICB0aGlzLmhhc1VucHVibGlzaGVkQ2hhbmdlcyA9IHRydWU7XG4gICAgICBhd2FpdCB0aGlzLnBlcnNpc3QoKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBXcml0ZXMgb25lIHJlZ2lzdGVyIHZhbHVlLCBvciBhZGRzIGEgbWVtYmVyIHRvIGFuIG9ic2VydmVkLXJlbW92ZSBzZXQuXG4gICAqXG4gICAqIEBwYXJhbSBrZXkgLSBSZWNvcmQga2V5IG9yIHNldCBtZW1iZXIuXG4gICAqIEBwYXJhbSB2YWx1ZSAtIEpTT04tY29tcGF0aWJsZSB2YWx1ZSAodXNlIGB0cnVlYCBmb3IgYSBzZXQpLlxuICAgKiBAcmV0dXJucyBBIHByb21pc2UgdGhhdCByZXNvbHZlcyBhZnRlciBqb3VybmFsIHB1YmxpY2F0aW9uIGFuZCBsb2NhbCBjb21taXQuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgc2V0KGtleTogc3RyaW5nLCB2YWx1ZTogSnNvblZhbHVlKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgdGhpcy5zZXRNYW55KFtba2V5LCB2YWx1ZV1dKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQdWJsaXNoZXMgYSBiYXRjaCBvZiByZWdpc3RlciB3cml0ZXMsIHNwbGl0IGludG8gYm91bmRlZCBpbW11dGFibGUgc2VnbWVudHMuXG4gICAqIFNlZ21lbnRzIGFyZSBpbmRpdmlkdWFsbHkgZHVyYWJsZTsgYSBmYWlsZWQgYmF0Y2ggY2FuIGhhdmUgYSBwdWJsaXNoZWQgcHJlZml4IGFuZCBjYW4gYmUgcmV0cmllZCBzYWZlbHkuXG4gICAqXG4gICAqIEBwYXJhbSBlbnRyaWVzIC0gUmVnaXN0ZXIgd3JpdGVzIG9yIHNldCBhZGRpdGlvbnMuXG4gICAqIEByZXR1cm5zIEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIGFmdGVyIGpvdXJuYWwgcHVibGljYXRpb24gYW5kIGxvY2FsIGNvbW1pdC5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBzZXRNYW55KGVudHJpZXM6IHJlYWRvbmx5IChyZWFkb25seSBbc3RyaW5nLCBKc29uVmFsdWVdKVtdKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgdGhpcy5jaGFuZ2UoZW50cmllcy5tYXAoKFtrZXksIHZhbHVlXSkgPT4gKHsgZGVsZXRlZDogZmFsc2UsIGtleSwgdmFsdWUgfSkpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUb2dnbGVzIHRyYW5zcG9ydCB3aXRob3V0IGNoYW5naW5nIGlkZW50aXR5IG9yIGNhdXNhbCBzdGF0ZS4gUGVyc2lzdCB0aGUgcHJlZmVyZW5jZSBpbiBjb25zdW1lciBzZXR0aW5ncy5cbiAgICogRW5hYmxpbmcgcHVibGlzaGVzIGEgY29tcGxldGUgY2hlY2twb2ludCBzbyBvZmZsaW5lIHNlcXVlbmNlcyBjYW5ub3QgbGVhdmUgZ2Fwcy5cbiAgICpcbiAgICogQHBhcmFtIGlzRW5hYmxlZCAtIFdoZXRoZXIgdG8gdXNlIHZhdWx0IHRyYW5zcG9ydCBmb3Igc3Vic2VxdWVudCBjYWxscyBvbiB0aGlzIGluc3RhbmNlLlxuICAgKiBAcmV0dXJucyBBIHByb21pc2UgdGhhdCByZXNvbHZlcyBhZnRlciBzeW5jaHJvbml6YXRpb24gd2hlbiBlbmFibGluZy5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBzZXRTeW5jRW5hYmxlZChpc0VuYWJsZWQ6IGJvb2xlYW4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCB0aGlzLnBhcmFtcy5sb2NhbC5leGNsdXNpdmUoYXN5bmMgKCkgPT4ge1xuICAgICAgYXdhaXQgdGhpcy5sb2FkTG9jYWwoKTtcbiAgICAgIHRoaXMuaXNTeW5jRW5hYmxlZCA9IGlzRW5hYmxlZDtcbiAgICAgIGF3YWl0IHRoaXMubWVyZ2VGaWxlcygpO1xuICAgICAgYXdhaXQgdGhpcy5wZXJzaXN0KCk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogTWVyZ2VzIGNvbXBsZXRlIHNuYXBzaG90cyBhbmQgY29udGlndW91cyBqb3VybmFsIGhpc3RvcnksIHRoZW4gcHVibGlzaGVzIGl0cyBkdXJhYmxlIGFja25vd2xlZGdlbWVudC5cbiAgICogUGFydGlhbCBkZWxpdmVyaWVzIHJlbWFpbiBwZW5kaW5nOyBhIGxhdGVyIGNhbGwgcmV0cmllcyB0aGVtLiBObyBhY2tub3dsZWRnZW1lbnQgc2tpcHMgYSBtaXNzaW5nIHNlcXVlbmNlLlxuICAgKlxuICAgKiBAcmV0dXJucyBBIHByb21pc2UgdGhhdCByZXNvbHZlcyBhZnRlciB0aGUgbG9jYWwgY2hlY2twb2ludCBhbmQgYWNrbm93bGVkZ2VtZW50IGNvbW1pdC5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBzeW5jaHJvbml6ZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCB0aGlzLnBhcmFtcy5sb2NhbC5leGNsdXNpdmUoYXN5bmMgKCkgPT4ge1xuICAgICAgYXdhaXQgdGhpcy5sb2FkTG9jYWwoKTtcbiAgICAgIGF3YWl0IHRoaXMubWVyZ2VGaWxlcygpO1xuICAgICAgYXdhaXQgdGhpcy5wZXJzaXN0KCk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGFja25vd2xlZGdlbWVudHMoZmlsZXM6IHJlYWRvbmx5IHN0cmluZ1tdKTogUHJvbWlzZTxNYXA8c3RyaW5nLCBudW1iZXI+W10+IHtcbiAgICBjb25zdCBhY2tub3dsZWRnZW1lbnRzID0gW25ldyBNYXAodGhpcy52ZWN0b3IpXTtcbiAgICBjb25zdCBkZXZpY2VzUHJlZml4ID0gYCR7dGhpcy50cmFuc3BvcnQucm9vdH0vZGV2aWNlcy9gO1xuICAgIGNvbnN0IGRldmljZXMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgICBmb3IgKGNvbnN0IHBhdGggb2YgZmlsZXMpIHtcbiAgICAgIGlmICghcGF0aC5zdGFydHNXaXRoKGRldmljZXNQcmVmaXgpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgLy8gT25seSBhIGZvbGRlciB1bmRlciBgZGV2aWNlcy9gIGlzIGEgZGV2aWNlOyBhIHN0cmF5IGZpbGUgdGhlcmUgKHN1Y2ggYXMgbWFjT1MgYC5EU19TdG9yZWApIG9yIGEgZm9sZGVyIHdob3NlXG4gICAgICAvLyBuYW1lIGlzIG5vdCBhIHZhbGlkIGRldmljZSBpZCBpcyBub3Qgb25lLCBhbmQgY291bnRpbmcgaXQgd291bGQgYmxvY2sgZXZlcnkgdHJpbSBiZWhpbmQgYW4gYWNrbm93bGVkZ2VtZW50XG4gICAgICAvLyB0aGF0IG5ldmVyIGFycml2ZXMuXG4gICAgICBjb25zdCBwYXJ0cyA9IHBhdGguc2xpY2UoZGV2aWNlc1ByZWZpeC5sZW5ndGgpLnNwbGl0KCcvJyk7XG4gICAgICBjb25zdCBkZXZpY2UgPSBwYXJ0c1swXTtcbiAgICAgIGlmIChwYXJ0cy5sZW5ndGggPj0gREVWSUNFX1BBVEhfUEFSVFMgJiYgZGV2aWNlICE9PSB1bmRlZmluZWQgJiYgREVWSUNFX0lEX1JFR19FWFAudGVzdChkZXZpY2UpKSB7XG4gICAgICAgIGRldmljZXMuYWRkKGRldmljZSk7XG4gICAgICB9XG4gICAgfVxuICAgIGZvciAoY29uc3QgZGV2aWNlIG9mIGRldmljZXMpIHtcbiAgICAgIGlmIChkZXZpY2UgPT09IHRoaXMuZGV2aWNlKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgY29uc3QgaGF2ZSA9IGF3YWl0IHRoaXMudHJhbnNwb3J0LnJlYWQoYCR7dGhpcy50cmFuc3BvcnQucm9vdH0vZGV2aWNlcy8ke2RldmljZX0vaGF2ZSR7dGhpcy50cmFuc3BvcnQuZXh0ZW5zaW9ufWApO1xuICAgICAgaWYgKCFpc09iamVjdChoYXZlKSB8fCAhaXNWZWN0b3IoaGF2ZVsndmVjdG9yJ10pIHx8IHR5cGVvZiBoYXZlWyd0aW1lJ10gIT09ICdudW1iZXInKSB7XG4gICAgICAgIGFja25vd2xlZGdlbWVudHMucHVzaChuZXcgTWFwKCkpO1xuICAgICAgfSBlbHNlIGlmIChEYXRlLm5vdygpIC0gaGF2ZVsndGltZSddIDw9IHRoaXMuYWN0aXZlRGV2aWNlTWlsbGlzZWNvbmRzKSB7XG4gICAgICAgIGFja25vd2xlZGdlbWVudHMucHVzaChuZXcgTWFwKGhhdmVbJ3ZlY3RvciddKSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBhY2tub3dsZWRnZW1lbnRzO1xuICB9XG5cbiAgcHJpdmF0ZSBhcHBseShvcGVyYXRpb246IERhdGFTdG9yZU9wZXJhdGlvbik6IHZvaWQge1xuICAgIHRoaXMucmVwbGljYS5hcHBseShvcGVyYXRpb24pO1xuICAgIHRoaXMudmVjdG9yLnNldChvcGVyYXRpb24uZGV2aWNlLCBvcGVyYXRpb24uc2VxdWVuY2UpO1xuICAgIHRoaXMub2JzZXJ2ZUNsb2NrKG9wZXJhdGlvbi50aW1lLCBvcGVyYXRpb24uY291bnRlcik7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGNoYW5nZShjaGFuZ2VzOiByZWFkb25seSBDaGFuZ2VbXSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IHRoaXMucGFyYW1zLmxvY2FsLmV4Y2x1c2l2ZShhc3luYyAoKSA9PiB7XG4gICAgICBhd2FpdCB0aGlzLmxvYWRMb2NhbCgpO1xuICAgICAgYXdhaXQgdGhpcy5tZXJnZUZpbGVzKCk7XG4gICAgICBjb25zdCBvcGVyYXRpb25zOiBEYXRhU3RvcmVPcGVyYXRpb25bXSA9IFtdO1xuICAgICAgY29uc3QgY2FuZGlkYXRlID0gbmV3IERhdGFTdG9yZVJlcGxpY2EodGhpcy5wYXJhbXMua2luZCk7XG4gICAgICBmb3IgKGNvbnN0IG9wZXJhdGlvbiBvZiB0aGlzLnJlcGxpY2EuZXhwb3J0KCkpIHtcbiAgICAgICAgY2FuZGlkYXRlLmFwcGx5KG9wZXJhdGlvbik7XG4gICAgICB9XG4gICAgICBsZXQgc2VxdWVuY2UgPSB0aGlzLnZlY3Rvci5nZXQodGhpcy5kZXZpY2UpID8/IDA7XG4gICAgICBmb3IgKGNvbnN0IGNoYW5nZSBvZiBjaGFuZ2VzKSB7XG4gICAgICAgIGNvbnN0IG5vdyA9IERhdGUubm93KCk7XG4gICAgICAgIHRoaXMuY291bnRlciA9IG5vdyA+IHRoaXMudGltZSA/IDAgOiB0aGlzLmNvdW50ZXIgKyAxO1xuICAgICAgICB0aGlzLnRpbWUgPSBNYXRoLm1heChub3csIHRoaXMudGltZSk7XG4gICAgICAgIGNvbnN0IG9wZXJhdGlvbjogRGF0YVN0b3JlT3BlcmF0aW9uID0ge1xuICAgICAgICAgIC4uLmNoYW5nZSxcbiAgICAgICAgICBjb3VudGVyOiB0aGlzLmNvdW50ZXIsXG4gICAgICAgICAgZGV2aWNlOiB0aGlzLmRldmljZSxcbiAgICAgICAgICBzZXF1ZW5jZTogKytzZXF1ZW5jZSxcbiAgICAgICAgICB0YWdzOiBjYW5kaWRhdGUub2JzZXJ2ZWRUYWdzKGNoYW5nZS5rZXkpLFxuICAgICAgICAgIHRpbWU6IHRoaXMudGltZVxuICAgICAgICB9O1xuICAgICAgICBjYW5kaWRhdGUuYXBwbHkob3BlcmF0aW9uKTtcbiAgICAgICAgb3BlcmF0aW9ucy5wdXNoKG9wZXJhdGlvbik7XG4gICAgICB9XG4gICAgICBpZiAoIXRoaXMuaXNTeW5jRW5hYmxlZCkge1xuICAgICAgICBmb3IgKGNvbnN0IG9wZXJhdGlvbiBvZiBvcGVyYXRpb25zKSB7XG4gICAgICAgICAgdGhpcy5hcHBseShvcGVyYXRpb24pO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuaGFzVW5wdWJsaXNoZWRDaGFuZ2VzID0gdHJ1ZTtcbiAgICAgICAgYXdhaXQgdGhpcy5wZXJzaXN0KCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIC8vIFZhbGlkYXRlIGV2ZXJ5IHNpbmdsZSBvcGVyYXRpb24gYmVmb3JlIHB1Ymxpc2hpbmcgYW55IHByZWZpeCBvZiBhIGJhdGNoLlxuICAgICAgZm9yIChjb25zdCBvcGVyYXRpb24gb2Ygb3BlcmF0aW9ucykge1xuICAgICAgICBpZiAoIXRoaXMudHJhbnNwb3J0LmZpdHMoW29wZXJhdGlvbl0pKSB7XG4gICAgICAgICAgYXdhaXQgdGhpcy50cmFuc3BvcnQud3JpdGUoYCR7dGhpcy5kZXZpY2VSb290KCl9L2xvZy0ke1N0cmluZyhvcGVyYXRpb24uc2VxdWVuY2UpfSR7dGhpcy50cmFuc3BvcnQuZXh0ZW5zaW9ufWAsIFtvcGVyYXRpb25dKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgbGV0IGJhdGNoOiBEYXRhU3RvcmVPcGVyYXRpb25bXSA9IFtdO1xuICAgICAgZm9yIChjb25zdCBvcGVyYXRpb24gb2Ygb3BlcmF0aW9ucykge1xuICAgICAgICBpZiAoIXRoaXMudHJhbnNwb3J0LmZpdHMoWy4uLmJhdGNoLCBvcGVyYXRpb25dKSkge1xuICAgICAgICAgIGF3YWl0IHRoaXMucHVibGlzaChiYXRjaCk7XG4gICAgICAgICAgYmF0Y2ggPSBbXTtcbiAgICAgICAgfVxuICAgICAgICBiYXRjaC5wdXNoKG9wZXJhdGlvbik7XG4gICAgICB9XG4gICAgICBpZiAoYmF0Y2gubGVuZ3RoID4gMCkge1xuICAgICAgICBhd2FpdCB0aGlzLnB1Ymxpc2goYmF0Y2gpO1xuICAgICAgfVxuICAgICAgYXdhaXQgdGhpcy5wZXJzaXN0KCk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGNoZWNrcG9pbnQoKTogQ2hlY2twb2ludCB7XG4gICAgcmV0dXJuIHsgY291bnRlcjogdGhpcy5jb3VudGVyLCBmb3JtYXQ6IDEsIGtpbmQ6IHRoaXMucGFyYW1zLmtpbmQsIG9wZXJhdGlvbnM6IHRoaXMucmVwbGljYS5leHBvcnQoKSwgdGltZTogdGhpcy50aW1lLCB2ZWN0b3I6IFsuLi50aGlzLnZlY3Rvcl0gfTtcbiAgfVxuXG4gIHByaXZhdGUgZGV2aWNlUm9vdCgpOiBzdHJpbmcge1xuICAgIHJldHVybiBgJHt0aGlzLnRyYW5zcG9ydC5yb290fS9kZXZpY2VzLyR7dGhpcy5kZXZpY2V9YDtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgbG9hZExvY2FsKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMucmVwbGljYSA9IG5ldyBEYXRhU3RvcmVSZXBsaWNhKHRoaXMucGFyYW1zLmtpbmQpO1xuICAgIHRoaXMudmVjdG9yLmNsZWFyKCk7XG4gICAgdGhpcy50aW1lID0gMDtcbiAgICB0aGlzLmNvdW50ZXIgPSAwO1xuICAgIHRoaXMubG9jYWxSZWNvcmRzLmNsZWFyKCk7XG4gICAgdGhpcy5rbm93blRyYW5zcG9ydFJvb3RzLmNsZWFyKCk7XG4gICAgdGhpcy5oYXNVbnB1Ymxpc2hlZENoYW5nZXMgPSBmYWxzZTtcbiAgICBjb25zdCByZWNvcmRzID0gYXdhaXQgdGhpcy5wYXJhbXMubG9jYWwuZW50cmllcygpO1xuICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIHJlY29yZHMpIHtcbiAgICAgIHN3aXRjaCAoa2V5KSB7XG4gICAgICAgIGNhc2UgJ3NoYXJlZC1jaGVja3BvaW50LXYxJzoge1xuICAgICAgICAgIHRoaXMubWVyZ2VDaGVja3BvaW50KHZhbHVlKTtcblxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ3NoYXJlZC10cmFuc3BvcnQtcm9vdHMtdjEnOiB7XG4gICAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignSW52YWxpZCBsb2NhbCBkYXRhLXN0b3JlIHRyYW5zcG9ydCByb290cycpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb25zdCBzdWZmaXggPSBgLyR7dGhpcy5wYXJhbXMucGx1Z2luSWR9LyR7dGhpcy5wYXJhbXMuc3RvcmVJZH1gO1xuICAgICAgICAgIGZvciAoY29uc3Qgcm9vdCBvZiB2YWx1ZSkge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiByb290ICE9PSAnc3RyaW5nJyB8fCAhcm9vdC5lbmRzV2l0aChzdWZmaXgpKSB7XG4gICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBsb2NhbCBkYXRhLXN0b3JlIHRyYW5zcG9ydCByb290cycpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gVmFsaWRhdGUgcmVtZW1iZXJlZCBwYXRocyB3aXRob3V0IHJlYWRpbmcgdGhlIGFkYXB0ZXIgb3IgYWN0aXZhdGluZyBhIHdyaXRlci5cbiAgICAgICAgICAgIGNvbnN0IHRyYW5zcG9ydCA9IG5ldyBEYXRhU3RvcmVUcmFuc3BvcnQoeyAuLi50aGlzLnBhcmFtcywgZm9sZGVyOiByb290LnNsaWNlKDAsIC1zdWZmaXgubGVuZ3RoKSB9KTtcbiAgICAgICAgICAgIHRoaXMua25vd25UcmFuc3BvcnRSb290cy5hZGQodHJhbnNwb3J0LnJvb3QpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ3NoYXJlZC11bnB1Ymxpc2hlZC12MSc6IHtcbiAgICAgICAgICB0aGlzLmhhc1VucHVibGlzaGVkQ2hhbmdlcyA9IHZhbHVlID09PSB0cnVlO1xuXG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgIGlmIChrZXkuc3RhcnRzV2l0aChSRUNPUkRfUFJFRklYKSkge1xuICAgICAgICAgICAgdGhpcy5yZXBsaWNhLmFwcGx5KHZhbHVlKTtcbiAgICAgICAgICAgIHRoaXMubG9jYWxSZWNvcmRzLnNldChrZXksIGVuc3VyZU5vbk51bGxhYmxlKEpTT04uc3RyaW5naWZ5KHZhbHVlKSkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgbWVyZ2VDaGVja3BvaW50KHZhbHVlOiB1bmtub3duKTogdm9pZCB7XG4gICAgaWYgKFxuICAgICAgIWlzT2JqZWN0KHZhbHVlKSB8fCB2YWx1ZVsnZm9ybWF0J10gIT09IDEgfHwgdmFsdWVbJ2tpbmQnXSAhPT0gdGhpcy5wYXJhbXMua2luZFxuICAgICAgfHwgIUFycmF5LmlzQXJyYXkodmFsdWVbJ29wZXJhdGlvbnMnXSkgfHwgIXZhbHVlWydvcGVyYXRpb25zJ10uZXZlcnkoaXNEYXRhU3RvcmVPcGVyYXRpb24pXG4gICAgICB8fCAhaXNWZWN0b3IodmFsdWVbJ3ZlY3RvciddKSB8fCAhTnVtYmVyLmlzU2FmZUludGVnZXIodmFsdWVbJ3RpbWUnXSkgfHwgIU51bWJlci5pc1NhZmVJbnRlZ2VyKHZhbHVlWydjb3VudGVyJ10pXG4gICAgKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgZGF0YS1zdG9yZSBjaGVja3BvaW50IG9yIGluY29tcGF0aWJsZSBtZXJnZSBydWxlJyk7XG4gICAgfVxuICAgIGZvciAoY29uc3Qgb3BlcmF0aW9uIG9mIHZhbHVlWydvcGVyYXRpb25zJ10pIHtcbiAgICAgIHRoaXMucmVwbGljYS5hcHBseShvcGVyYXRpb24pO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IFtkZXZpY2UsIHNlcXVlbmNlXSBvZiB2YWx1ZVsndmVjdG9yJ10pIHtcbiAgICAgIHRoaXMudmVjdG9yLnNldChkZXZpY2UsIE1hdGgubWF4KHNlcXVlbmNlLCB0aGlzLnZlY3Rvci5nZXQoZGV2aWNlKSA/PyAwKSk7XG4gICAgfVxuICAgIHRoaXMub2JzZXJ2ZUNsb2NrKE51bWJlcih2YWx1ZVsndGltZSddKSwgTnVtYmVyKHZhbHVlWydjb3VudGVyJ10pKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgbWVyZ2VGaWxlcygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoIXRoaXMuaXNTeW5jRW5hYmxlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBhd2FpdCB0aGlzLmxvY2F0aW9ucy5yZWZyZXNoKCk7XG4gICAgZm9yIChjb25zdCB0cmFuc3BvcnQgb2YgdGhpcy5sb2NhdGlvbnMudHJhbnNwb3J0cykge1xuICAgICAgYXdhaXQgdGhpcy5tZXJnZVRyYW5zcG9ydCh0cmFuc3BvcnQpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgbWVyZ2VUcmFuc3BvcnQodHJhbnNwb3J0OiBEYXRhU3RvcmVUcmFuc3BvcnQpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBhbGxGaWxlcyA9IGF3YWl0IHRyYW5zcG9ydC5saXN0KCk7XG4gICAgY29uc3QgZmlsZXMgPSBhbGxGaWxlcy5maWx0ZXIoKHBhdGgpID0+IHBhdGguc3RhcnRzV2l0aChgJHt0cmFuc3BvcnQucm9vdH0vZGV2aWNlcy9gKSk7XG4gICAgY29uc3QgbWFuaWZlc3RzID0gZmlsZXMuZmlsdGVyKChmaWxlKSA9PiAvXFwvc25hcHNob3QtW1xcdy1dKy1tYW5pZmVzdFxcLig/Om1kfGpzb24pJC8udGVzdChmaWxlKSk7XG4gICAgZm9yIChjb25zdCBwYXRoIG9mIG1hbmlmZXN0cykge1xuICAgICAgY29uc3Qgc25hcHNob3QgPSBhd2FpdCB0cmFuc3BvcnQucmVhZFNuYXBzaG90KHBhdGgpO1xuICAgICAgaWYgKHNuYXBzaG90ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhpcy5tZXJnZUNoZWNrcG9pbnQoc25hcHNob3QpO1xuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBvcGVyYXRpb25zOiBEYXRhU3RvcmVPcGVyYXRpb25bXSA9IFtdO1xuICAgIGNvbnN0IHNlZ21lbnRzID0gZmlsZXMuZmlsdGVyKChmaWxlKSA9PiAvXFwvbG9nLVxcZCtcXC4oPzptZHxqc29uKSQvLnRlc3QoZmlsZSkpO1xuICAgIGZvciAoY29uc3QgcGF0aCBvZiBzZWdtZW50cykge1xuICAgICAgY29uc3Qgc2VnbWVudCA9IGF3YWl0IHRyYW5zcG9ydC5yZWFkKHBhdGgpO1xuICAgICAgaWYgKHNlZ21lbnQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGlmICghQXJyYXkuaXNBcnJheShzZWdtZW50KSB8fCAhc2VnbWVudC5ldmVyeShpc0RhdGFTdG9yZU9wZXJhdGlvbikpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGRhdGEtc3RvcmUgam91cm5hbCBzZWdtZW50Jyk7XG4gICAgICB9XG4gICAgICBjb25zdCBvd25lciA9IHBhdGguc3BsaXQoJy8nKS5hdChPV05FUl9QQVRIX0lOREVYKTtcbiAgICAgIGlmIChzZWdtZW50LnNvbWUoKG9wZXJhdGlvbikgPT4gb3BlcmF0aW9uLmRldmljZSAhPT0gb3duZXIpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignSm91cm5hbCBzZWdtZW50IGhhcyBhIGRpZmZlcmVudCB3cml0ZXInKTtcbiAgICAgIH1cbiAgICAgIG9wZXJhdGlvbnMucHVzaCguLi5zZWdtZW50KTtcbiAgICB9XG4gICAgb3BlcmF0aW9ucy5zb3J0KChmaXJzdCwgc2Vjb25kKSA9PiBmaXJzdC5kZXZpY2UubG9jYWxlQ29tcGFyZShzZWNvbmQuZGV2aWNlKSB8fCBmaXJzdC5zZXF1ZW5jZSAtIHNlY29uZC5zZXF1ZW5jZSk7XG4gICAgZm9yIChjb25zdCBvcGVyYXRpb24gb2Ygb3BlcmF0aW9ucykge1xuICAgICAgaWYgKG9wZXJhdGlvbi5zZXF1ZW5jZSA9PT0gKHRoaXMudmVjdG9yLmdldChvcGVyYXRpb24uZGV2aWNlKSA/PyAwKSArIDEpIHtcbiAgICAgICAgdGhpcy5hcHBseShvcGVyYXRpb24pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgb2JzZXJ2ZUNsb2NrKHRpbWU6IG51bWJlciwgY291bnRlcjogbnVtYmVyKTogdm9pZCB7XG4gICAgaWYgKHRpbWUgPiB0aGlzLnRpbWUpIHtcbiAgICAgIHRoaXMudGltZSA9IHRpbWU7XG4gICAgICB0aGlzLmNvdW50ZXIgPSBjb3VudGVyO1xuICAgIH0gZWxzZSBpZiAodGltZSA9PT0gdGhpcy50aW1lKSB7XG4gICAgICB0aGlzLmNvdW50ZXIgPSBNYXRoLm1heCh0aGlzLmNvdW50ZXIsIGNvdW50ZXIpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgcGVyc2lzdCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBjaGVja3BvaW50ID0gdGhpcy5jaGVja3BvaW50KCk7XG4gICAgY29uc3QgcmVjb3JkcyA9IG5ldyBNYXA8c3RyaW5nLCBEYXRhU3RvcmVPcGVyYXRpb24+KCk7XG4gICAgZm9yIChjb25zdCBvcGVyYXRpb24gb2YgY2hlY2twb2ludC5vcGVyYXRpb25zKSB7XG4gICAgICBjb25zdCBpZGVudGl0eSA9IHRoaXMucGFyYW1zLmtpbmQgPT09ICdvYnNlcnZlZC1yZW1vdmUtc2V0JyA/IGAke29wZXJhdGlvbi5kZXZpY2V9OiR7U3RyaW5nKG9wZXJhdGlvbi5zZXF1ZW5jZSl9YCA6IG9wZXJhdGlvbi5rZXk7XG4gICAgICByZWNvcmRzLnNldChgJHtSRUNPUkRfUFJFRklYfSR7aWRlbnRpdHl9YCwgb3BlcmF0aW9uKTtcbiAgICB9XG4gICAgY29uc3QgZW50cmllczogW3N0cmluZywgdW5rbm93bl1bXSA9IFsuLi5yZWNvcmRzXS5maWx0ZXIoKFtrZXksIHZhbHVlXSkgPT4gdGhpcy5sb2NhbFJlY29yZHMuZ2V0KGtleSkgIT09IEpTT04uc3RyaW5naWZ5KHZhbHVlKSk7XG4gICAgY29uc3QgcmVtb3ZlZEtleXMgPSBbLi4udGhpcy5sb2NhbFJlY29yZHMua2V5cygpXS5maWx0ZXIoKGtleSkgPT4gIXJlY29yZHMuaGFzKGtleSkpO1xuICAgIGVudHJpZXMucHVzaChbJ3NoYXJlZC1jaGVja3BvaW50LXYxJywgeyAuLi5jaGVja3BvaW50LCBvcGVyYXRpb25zOiBbXSB9XSwgWydzaGFyZWQtdW5wdWJsaXNoZWQtdjEnLCB0aGlzLmhhc1VucHVibGlzaGVkQ2hhbmdlc10sIFsnc2hhcmVkLXRyYW5zcG9ydC1yb290cy12MScsIHRoaXMudHJhbnNwb3J0Um9vdHNdKTtcbiAgICBhd2FpdCB0aGlzLnBhcmFtcy5sb2NhbC5jb21taXQoeyBlbnRyaWVzLCByZW1vdmVkS2V5cyB9KTtcbiAgICBpZiAoIXRoaXMuaXNTeW5jRW5hYmxlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAodGhpcy5oYXNVbnB1Ymxpc2hlZENoYW5nZXMpIHtcbiAgICAgIGF3YWl0IHRoaXMudHJhbnNwb3J0LndyaXRlU25hcHNob3QoeyBiYXNlOiBgJHt0aGlzLmRldmljZVJvb3QoKX0vc25hcHNob3QtJHt3aW5kb3cuY3J5cHRvLnJhbmRvbVVVSUQoKX0tbWFuaWZlc3RgLCBwYXlsb2FkOiBjaGVja3BvaW50IH0pO1xuICAgICAgYXdhaXQgdGhpcy5wYXJhbXMubG9jYWwuc2V0KCdzaGFyZWQtdW5wdWJsaXNoZWQtdjEnLCBmYWxzZSk7XG4gICAgICB0aGlzLmhhc1VucHVibGlzaGVkQ2hhbmdlcyA9IGZhbHNlO1xuICAgIH1cbiAgICBhd2FpdCB0aGlzLnRyYW5zcG9ydC53cml0ZShgJHt0aGlzLmRldmljZVJvb3QoKX0vaGF2ZSR7dGhpcy50cmFuc3BvcnQuZXh0ZW5zaW9ufWAsIHsgZm9ybWF0OiAxLCB0aW1lOiBEYXRlLm5vdygpLCB2ZWN0b3I6IFsuLi50aGlzLnZlY3Rvcl0gfSk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHB1Ymxpc2gob3BlcmF0aW9uczogRGF0YVN0b3JlT3BlcmF0aW9uW10pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBmaXJzdCA9IGVuc3VyZU5vbk51bGxhYmxlKG9wZXJhdGlvbnNbMF0pO1xuICAgIGF3YWl0IHRoaXMudHJhbnNwb3J0LndyaXRlSW1tdXRhYmxlKGAke3RoaXMuZGV2aWNlUm9vdCgpfS9sb2ctJHtTdHJpbmcoZmlyc3Quc2VxdWVuY2UpfSR7dGhpcy50cmFuc3BvcnQuZXh0ZW5zaW9ufWAsIG9wZXJhdGlvbnMpO1xuICAgIGZvciAoY29uc3Qgb3BlcmF0aW9uIG9mIG9wZXJhdGlvbnMpIHtcbiAgICAgIHRoaXMuYXBwbHkob3BlcmF0aW9uKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gaXNPYmplY3QodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB7XG4gIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIHZhbHVlICE9PSBudWxsICYmICFBcnJheS5pc0FycmF5KHZhbHVlKTtcbn1cblxuZnVuY3Rpb24gaXNWZWN0b3IodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBWZXJzaW9uVmVjdG9yIHtcbiAgcmV0dXJuIEFycmF5LmlzQXJyYXkodmFsdWUpICYmIHZhbHVlLmV2ZXJ5KChlbnRyeTogdW5rbm93bikgPT5cbiAgICBBcnJheS5pc0FycmF5KGVudHJ5KSAmJiBlbnRyeS5sZW5ndGggPT09IFZFQ1RPUl9FTlRSWV9MRU5HVEhcbiAgICAmJiB0eXBlb2YgZW50cnlbMF0gPT09ICdzdHJpbmcnICYmIC9eW1xcdy1dKyQvLnRlc3QoZW50cnlbMF0pICYmIE51bWJlci5pc1NhZmVJbnRlZ2VyKGVudHJ5WzFdKSAmJiBOdW1iZXIoZW50cnlbMV0pID49IDBcbiAgKTtcbn1cblxuLyogZXNsaW50LWVuYWJsZSBuL25vLXVuc3VwcG9ydGVkLWZlYXR1cmVzL25vZGUtYnVpbHRpbnMgLS0gVGhlc2UgYXJlIE9ic2lkaWFuIHJlbmRlcmVyIFdlYiBBUElzLCBub3QgTm9kZSBidWlsdGlucy4gKi9cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFVQSxTQUFTLHlCQUF5QjtBQVNsQyxTQUFTLDBCQUEwQjtBQUNuQztBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsT0FDSztBQUNQLFNBQVMsMEJBQTBCO0FBRW5DLE1BQU0scUNBQXFDO0FBRTNDLE1BQU0sbUJBQW1CO0FBRXpCLE1BQU0sc0JBQXNCO0FBQzVCLE1BQU0sb0JBQW9CO0FBQzFCLE1BQU0sb0JBQW9CO0FBQzFCLE1BQU0sZ0JBQWdCO0FBcUZmLE1BQU0sZ0JBQWdCO0FBQUEsRUEwQm5CLFlBQStCLFFBQXNELFFBQWdCO0FBQXRFO0FBQXNEO0FBQzNGLFNB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
|
|
@@ -105,7 +105,7 @@ class BulkOperationGitRepo {
|
|
|
105
105
|
return null;
|
|
106
106
|
}
|
|
107
107
|
const [isInsideWorkTree, gitDirectory] = result.stdout.split(/\r?\n/, REV_PARSE_OUTPUT_LINE_COUNT);
|
|
108
|
-
return result.exitCode
|
|
108
|
+
return result.exitCode === 0 && isInsideWorkTree === "true" && gitDirectory ? new BulkOperationGitRepo({ gitDirectory, workingDirectory }) : null;
|
|
109
109
|
}
|
|
110
110
|
/**
|
|
111
111
|
* Refuses to go on when the repo routes files through git-annex but `git-annex` cannot be run, since a
|
|
@@ -159,7 +159,7 @@ class BulkOperationGitRepo {
|
|
|
159
159
|
*/
|
|
160
160
|
async recoverStaleLock() {
|
|
161
161
|
const lock = await this.readLock();
|
|
162
|
-
return
|
|
162
|
+
return lock && this.isStale(lock) ? await this.recover(lock) : null;
|
|
163
163
|
}
|
|
164
164
|
/**
|
|
165
165
|
* Reverts a bulk-operation commit with `git revert --no-edit`.
|
|
@@ -290,11 +290,11 @@ class BulkOperationGitRepo {
|
|
|
290
290
|
});
|
|
291
291
|
};
|
|
292
292
|
}
|
|
293
|
-
async findNextOperationId(usedOperationId) {
|
|
293
|
+
async findNextOperationId(usedOperationId = "") {
|
|
294
294
|
const result = await this.runGit({
|
|
295
295
|
gitArguments: ["log", "--all", "--format=%s", "--extended-regexp", "--grep=^(chore: before )?OP[0-9]+"]
|
|
296
296
|
});
|
|
297
|
-
return getNextOperationId([...result.stdout.split(/\r?\n/), usedOperationId
|
|
297
|
+
return getNextOperationId([...result.stdout.split(/\r?\n/), usedOperationId]);
|
|
298
298
|
}
|
|
299
299
|
async heartbeat() {
|
|
300
300
|
const lock = await this.readLock();
|
|
@@ -485,4 +485,4 @@ export {
|
|
|
485
485
|
BulkOperationGitRepo,
|
|
486
486
|
GitCommandError
|
|
487
487
|
};
|
|
488
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9kZXNrdG9wLWJ1bGstb3BlcmF0aW9uLWdpdC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBmaWxlXG4gKlxuICogVGhlIGRlc2t0b3AgaGFsZiBvZiBidWxrLW9wZXJhdGlvbiBnaXQgY29tbWl0czogZHJpdmVzIHRoZSBzeXN0ZW0gYGdpdGAgQ0xJIHRvIHdyYXAgYSBidWxrIG9wZXJhdGlvbiBpbiBjb21taXRzLFxuICogZ3VhcmRlZCBieSBhIGxlYXNlIGxvY2sgaW4gdGhlIHJlcG8ncyBnaXQgZGlyZWN0b3J5LlxuICpcbiAqIFRoZSBzeXN0ZW0gQ0xJIGlzIHVzZWQgcmF0aGVyIHRoYW4gYSBidW5kbGVkIGltcGxlbWVudGF0aW9uIGJlY2F1c2UgaXQgaG9ub3JzIHRoZSByZXBvJ3Mgb3duIGNvbmZpZywgaG9va3NcbiAqIGFuZCBjbGVhbi9zbXVkZ2UgZmlsdGVycywgZ2l0LWFubmV4J3MgYW1vbmcgdGhlbSwgYW5kIGJlY2F1c2UgYGdpdCByZXZlcnRgIGlzIHRoZSB3aG9sZSB1bmRvIHN0b3J5LlxuICpcbiAqIEV2ZXJ5IGNvbW1hbmQgcnVucyB3aXRoIHRoZSB2YXVsdCBmb2xkZXIgYXMgaXRzIHdvcmtpbmcgZGlyZWN0b3J5IGFuZCBgLmAgYXMgaXRzIHBhdGhzcGVjLCBzbyB3aGVuIHRoZSB2YXVsdCBpcyBhXG4gKiBzdWJmb2xkZXIgb2YgYSBsYXJnZXIgcmVwbyBvbmx5IHRoZSB2YXVsdCdzIGNoYW5nZXMgYXJlIGNvbW1pdHRlZC5cbiAqXG4gKiBEZXNrdG9wLW9ubHkgKGBub2RlOmNoaWxkX3Byb2Nlc3NgLCBgbm9kZTpmc2AsIGBub2RlOm9zYCksIGJ1dCBpbmVydCB0byBpbXBvcnQgb24gbW9iaWxlOiBub3RoaW5nIGhlcmUgdG91Y2hlcyBhXG4gKiBOb2RlIGJ1aWx0aW4gdW50aWwgYSBmdW5jdGlvbiBpcyBjYWxsZWQuXG4gKi9cblxuaW1wb3J0IHsgc2V0VGltZW91dEFzeW5jIH0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL2FzeW5jJztcbmltcG9ydCB7IG5vb3BBc3luYyB9IGZyb20gJ0BtbmFvdW1vdi90eXBlc2NyaXB0LWxpYi9mdW5jdGlvbic7XG5pbXBvcnQgeyBlc2NhcGVSZWdFeHAgfSBmcm9tICdAbW5hb3Vtb3YvdHlwZXNjcmlwdC1saWIvcmVnLWV4cCc7XG5pbXBvcnQgeyBlbnN1cmVOb25OdWxsYWJsZSB9IGZyb20gJ0BtbmFvdW1vdi90eXBlc2NyaXB0LWxpYi90eXBlLWd1YXJkcyc7XG5pbXBvcnQgeyBleGVjRmlsZSB9IGZyb20gJ25vZGU6Y2hpbGRfcHJvY2Vzcyc7XG5pbXBvcnQge1xuICByZWFkRmlsZSxcbiAgcmVuYW1lLFxuICBzdGF0LFxuICB1bmxpbmssXG4gIHdyaXRlRmlsZVxufSBmcm9tICdub2RlOmZzL3Byb21pc2VzJztcbmltcG9ydCB7XG4gIGhvc3RuYW1lLFxuICB1cHRpbWVcbn0gZnJvbSAnbm9kZTpvcyc7XG5pbXBvcnQgeyBqb2luIH0gZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHR5cGUge1xuICBCdWxrT3BlcmF0aW9uQ29tbWl0LFxuICBCdWxrT3BlcmF0aW9uTG9ja1xufSBmcm9tICcuL2J1bGstb3BlcmF0aW9uLnRzJztcblxuaW1wb3J0IHsgcmVnaXN0ZXJCdWxrT3BlcmF0aW9uUHJvZ3Jlc3NMaXN0ZW5lciB9IGZyb20gJy4vYnVsay1vcGVyYXRpb24tcHJvZ3Jlc3MudHMnO1xuaW1wb3J0IHtcbiAgYnVpbGRCZWZvcmVPcGVyYXRpb25Db21taXRTdWJqZWN0LFxuICBidWlsZE9wZXJhdGlvbkNvbW1pdE1lc3NhZ2UsXG4gIEJVTEtfT1BFUkFUSU9OX0xPQ0tfRklMRV9OQU1FLFxuICBnZXROZXh0T3BlcmF0aW9uSWQsXG4gIGlzQnVsa09wZXJhdGlvbkxvY2ssXG4gIGlzQnVsa09wZXJhdGlvbkxvY2tTdGFsZSxcbiAgcGFyc2VCdWxrT3BlcmF0aW9uQ29tbWl0LFxuICBQTFVHSU5fVFJBSUxFUl9LRVlcbn0gZnJvbSAnLi9idWxrLW9wZXJhdGlvbi50cyc7XG5cbi8qKlxuICogQ29uc3RydWN0b3IgcGFyYW1ldGVycyBmb3Ige0BsaW5rIEJ1bGtPcGVyYXRpb25HaXRSZXBvfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCdWxrT3BlcmF0aW9uR2l0UmVwb0NvbnN0cnVjdG9yUGFyYW1zIHtcbiAgLyoqXG4gICAqIFRoZSBhYnNvbHV0ZSBwYXRoIG9mIHRoZSByZXBvJ3MgZ2l0IGRpcmVjdG9yeSwgd2hlcmUgdGhlIGxlYXNlIGxvY2sgbGl2ZXMuXG4gICAqL1xuICByZWFkb25seSBnaXREaXJlY3Rvcnk6IHN0cmluZztcblxuICAvKipcbiAgICogSG93IGxvbmcgdG8gd2FpdCBmb3IgYW5vdGhlciBvcGVyYXRpb24ncyBsb2NrIGJlZm9yZSBnaXZpbmcgdXAuXG4gICAqXG4gICAqIEBkZWZhdWx0IGA2MDBfMDAwYFxuICAgKi9cbiAgcmVhZG9ubHkgbG9ja1dhaXRUaW1lb3V0SW5NaWxsaXNlY29uZHM/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFRoZSBhYnNvbHV0ZSBwYXRoIG9mIHRoZSBmb2xkZXIgd2hvc2UgY2hhbmdlcyBhcmUgY29tbWl0dGVkOiB0aGUgdmF1bHQgcm9vdC5cbiAgICovXG4gIHJlYWRvbmx5IHdvcmtpbmdEaXJlY3Rvcnk6IHN0cmluZztcbn1cblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgQnVsa09wZXJhdGlvbkdpdFJlcG8ucnVuQnVsa09wZXJhdGlvbn0uXG4gKlxuICogQHR5cGVQYXJhbSBUIC0gVGhlIHR5cGUgb2YgdGhlIG9wZXJhdGlvbidzIHJlc3VsdC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCdWxrT3BlcmF0aW9uR2l0UmVwb1J1bkJ1bGtPcGVyYXRpb25QYXJhbXM8VD4ge1xuICAvKipcbiAgICogUnVucyB0aGUgYnVsayBvcGVyYXRpb24uXG4gICAqXG4gICAqIEByZXR1cm5zIFRoZSBvcGVyYXRpb24ncyByZXN1bHQuXG4gICAqL1xuICByZWFkb25seSBvcGVyYXRpb246ICgpID0+IFByb21pc2U8VD47XG5cbiAgLyoqXG4gICAqIFRoZSBpZCBvZiB0aGUgcGx1Z2luIHJ1bm5pbmcgdGhlIG9wZXJhdGlvbi5cbiAgICovXG4gIHJlYWRvbmx5IHBsdWdpbklkOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFdhaXRzIGZvciB0aGUgZm9sbG93LXVwcyB0aGUgb3BlcmF0aW9uIHNldCBvZmYgKHJlbmFtZSBoYW5kbGVycywgbGluayB1cGRhdGVzLCB0aGUgbWV0YWRhdGEgY2FjaGUpIHRvIGZpbmlzaCwgc29cbiAgICogdGhlaXIgY2hhbmdlcyBsYW5kIGluIHRoZSBvcGVyYXRpb24ncyBjb21taXQuXG4gICAqL1xuICByZWFkb25seSBzZXR0bGU6ICgpID0+IFByb21pc2U8dm9pZD47XG5cbiAgLyoqXG4gICAqIEEgb25lLWxpbmUgZGVzY3JpcHRpb24gb2YgdGhlIG9wZXJhdGlvbiwgdXNlZCBpbiB0aGUgY29tbWl0IHN1YmplY3QuXG4gICAqL1xuICByZWFkb25seSBzdW1tYXJ5OiBzdHJpbmc7XG59XG5cbi8qKlxuICogVGhlIHJlc3VsdCBvZiB7QGxpbmsgQnVsa09wZXJhdGlvbkdpdFJlcG8ucnVuQnVsa09wZXJhdGlvbn0uXG4gKlxuICogQHR5cGVQYXJhbSBUIC0gVGhlIHR5cGUgb2YgdGhlIG9wZXJhdGlvbidzIHJlc3VsdC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBHaXRCdWxrT3BlcmF0aW9uUmVzdWx0PFQ+IHtcbiAgLyoqXG4gICAqIFRoZSBoYXNoIG9mIHRoZSBjb21taXQgcmVjb3JkaW5nIHRoZSBvcGVyYXRpb24sIG9yIGBudWxsYCB3aGVuIHRoZSBvcGVyYXRpb24gY2hhbmdlZCBub3RoaW5nLlxuICAgKi9cbiAgcmVhZG9ubHkgY29tbWl0U2hhOiBudWxsIHwgc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgb3BlcmF0aW9uIGlkLCBzdWNoIGFzIGBPUDEyYC5cbiAgICovXG4gIHJlYWRvbmx5IG9wZXJhdGlvbklkOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBpZCB0aGUgb3BlcmF0aW9uIHN0YXJ0ZWQgdW5kZXIsIHdoZW4gaXRzIGxvY2sgd2FzIHJlY292ZXJlZCBhcyBzdGFsZSB3aGlsZSBpdCByYW4sIG9yIGBudWxsYCBvdGhlcndpc2UuXG4gICAqXG4gICAqIFRoZSBjaGFuZ2VzIG1hZGUgYmVmb3JlIHRoZSByZWNvdmVyeSBhcmUgaW4gdGhlIGA8cmVjb3ZlcmVkT3BlcmF0aW9uSWQ+IGludGVycnVwdGVkYCBjb21taXQsIGFuZCB0aGUgcmVzdCB3ZW50IGludG9cbiAgICogYSBmcmVzaCB7QGxpbmsgb3BlcmF0aW9uSWR9LCBzbyB1bmRvaW5nIHRoZSB3aG9sZSBvcGVyYXRpb24gdGFrZXMgcmV2ZXJ0aW5nIGJvdGguXG4gICAqL1xuICByZWFkb25seSByZWNvdmVyZWRPcGVyYXRpb25JZDogbnVsbCB8IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIG9wZXJhdGlvbidzIHJlc3VsdC5cbiAgICovXG4gIHJlYWRvbmx5IHJlc3VsdDogVDtcbn1cblxuLyoqXG4gKiBUaGUgcmVzdWx0IG9mIHtAbGluayBCdWxrT3BlcmF0aW9uR2l0UmVwby5yZXZlcnRCdWxrT3BlcmF0aW9uQ29tbWl0fS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBHaXRSZXZlcnRSZXN1bHQge1xuICAvKipcbiAgICogV2hldGhlciB0aGUgcmV2ZXJ0IHN0b3BwZWQgb24gYSBjb25mbGljdCwgbGVhdmluZyB0aGUgcmVwbyBtaWQtcmV2ZXJ0IGZvciB0aGUgdXNlciB0byByZXNvbHZlLlxuICAgKi9cbiAgcmVhZG9ubHkgaXNDb25mbGljdDogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hhdCBnaXQgcHJpbnRlZC5cbiAgICovXG4gIHJlYWRvbmx5IG91dHB1dDogc3RyaW5nO1xufVxuXG5pbnRlcmZhY2UgQnVsa09wZXJhdGlvbkdpdFJlcG9SdW5HaXRQYXJhbXMge1xuICByZWFkb25seSBhbGxvd2VkRXhpdENvZGVzPzogcmVhZG9ubHkgbnVtYmVyW107XG4gIHJlYWRvbmx5IGdpdEFyZ3VtZW50czogcmVhZG9ubHkgc3RyaW5nW107XG59XG5cbmludGVyZmFjZSBHaXRDb21tYW5kUmVzdWx0IHtcbiAgcmVhZG9ubHkgZXhpdENvZGU6IG51bWJlcjtcbiAgcmVhZG9ubHkgc3RkZXJyOiBzdHJpbmc7XG4gIHJlYWRvbmx5IHN0ZG91dDogc3RyaW5nO1xufVxuXG5jb25zdCBERUZBVUxUX0xPQ0tfV0FJVF9USU1FT1VUX0lOX01JTExJU0VDT05EUyA9IDYwMF8wMDA7XG5jb25zdCBIRUFSVEJFQVRfVEhST1RUTEVfSU5fTUlMTElTRUNPTkRTID0gNTAwMDtcbmNvbnN0IElOREVYX0xPQ0tfUkVUUllfQ09VTlQgPSAyMDtcbmNvbnN0IElOREVYX0xPQ0tfUkVUUllfREVMQVlfSU5fTUlMTElTRUNPTkRTID0gNTAwO1xuY29uc3QgTE9DS19QT0xMX0lOVEVSVkFMX0lOX01JTExJU0VDT05EUyA9IDEwMDA7XG5jb25zdCBNQVhfQlVGRkVSX0lOX0JZVEVTID0gMjY4XzQzNV80NTY7XG5jb25zdCBNSUxMSVNFQ09ORFNfSU5fU0VDT05EID0gMTAwMDtcbmNvbnN0IEdJVF9GQVRBTF9FWElUX0NPREUgPSAxMjg7XG5jb25zdCBSRVZfUEFSU0VfT1VUUFVUX0xJTkVfQ09VTlQgPSAyO1xuY29uc3QgVU5JVF9TRVBBUkFUT1IgPSAnXFx1ezFGfSc7XG5cbmludGVyZmFjZSBCdWxrT3BlcmF0aW9uR2l0UmVwb0NvbW1pdE9wZXJhdGlvblBhcmFtcyB7XG4gIHJlYWRvbmx5IGlzSW50ZXJydXB0ZWQ/OiBib29sZWFuO1xuICByZWFkb25seSBvcGVyYXRpb25JZDogc3RyaW5nO1xuICByZWFkb25seSBwbHVnaW5JZDogc3RyaW5nO1xuICByZWFkb25seSBzdW1tYXJ5Pzogc3RyaW5nO1xufVxuXG5pbnRlcmZhY2UgQ29tbWl0TWVzc2FnZSB7XG4gIHJlYWRvbmx5IGJvZHk6IHN0cmluZztcbiAgcmVhZG9ubHkgc3ViamVjdDogc3RyaW5nO1xufVxuXG5pbnRlcmZhY2UgRXhlY0dpdFBhcmFtcyB7XG4gIHJlYWRvbmx5IGN3ZDogc3RyaW5nO1xuICByZWFkb25seSBnaXRBcmd1bWVudHM6IHJlYWRvbmx5IHN0cmluZ1tdO1xufVxuXG4vKipcbiAqIEEgZ2l0IHJlcG8gaG9sZGluZyBhIHZhdWx0LCBkcml2ZW4gdG8gd3JhcCBidWxrIG9wZXJhdGlvbnMgaW4gY29tbWl0cy5cbiAqL1xuZXhwb3J0IGNsYXNzIEJ1bGtPcGVyYXRpb25HaXRSZXBvIHtcbiAgLyoqXG4gICAqIFRoZSBhYnNvbHV0ZSBwYXRoIG9mIHRoZSByZXBvJ3MgZ2l0IGRpcmVjdG9yeS5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBnaXREaXJlY3Rvcnk6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIGFic29sdXRlIHBhdGggb2YgdGhlIGZvbGRlciB3aG9zZSBjaGFuZ2VzIGFyZSBjb21taXR0ZWQuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgd29ya2luZ0RpcmVjdG9yeTogc3RyaW5nO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgbG9ja0ZpbGVQYXRoOiBzdHJpbmc7XG4gIHByaXZhdGUgcmVhZG9ubHkgbG9ja1dhaXRUaW1lb3V0SW5NaWxsaXNlY29uZHM6IG51bWJlcjtcbiAgcHJpdmF0ZSBvd25Mb2NrOiBCdWxrT3BlcmF0aW9uTG9jayB8IG51bGwgPSBudWxsO1xuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLiBVc2Uge0BsaW5rIEJ1bGtPcGVyYXRpb25HaXRSZXBvLm9wZW59IHRvIGZpbmQgdGhlIHJlcG8gb2YgYSBmb2xkZXIuXG4gICAqXG4gICAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgY29uc3RydWN0b3IgcGFyYW1ldGVycy5cbiAgICovXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihwYXJhbXM6IEJ1bGtPcGVyYXRpb25HaXRSZXBvQ29uc3RydWN0b3JQYXJhbXMpIHtcbiAgICB0aGlzLmdpdERpcmVjdG9yeSA9IHBhcmFtcy5naXREaXJlY3Rvcnk7XG4gICAgdGhpcy53b3JraW5nRGlyZWN0b3J5ID0gcGFyYW1zLndvcmtpbmdEaXJlY3Rvcnk7XG4gICAgdGhpcy5sb2NrV2FpdFRpbWVvdXRJbk1pbGxpc2Vjb25kcyA9IHBhcmFtcy5sb2NrV2FpdFRpbWVvdXRJbk1pbGxpc2Vjb25kcyA/PyBERUZBVUxUX0xPQ0tfV0FJVF9USU1FT1VUX0lOX01JTExJU0VDT05EUztcbiAgICB0aGlzLmxvY2tGaWxlUGF0aCA9IGpvaW4odGhpcy5naXREaXJlY3RvcnksIEJVTEtfT1BFUkFUSU9OX0xPQ0tfRklMRV9OQU1FKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaW5kcyB0aGUgZ2l0IHJlcG8gYSBmb2xkZXIgYmVsb25ncyB0by5cbiAgICpcbiAgICogQHBhcmFtIHdvcmtpbmdEaXJlY3RvcnkgLSBUaGUgZm9sZGVyLCBub3JtYWxseSB0aGUgdmF1bHQgcm9vdC5cbiAgICogQHJldHVybnMgVGhlIHJlcG8sIG9yIGBudWxsYCB3aGVuIHRoZSBmb2xkZXIgaXMgbm90IGluc2lkZSBhIGdpdCB3b3JrIHRyZWUgb3IgYGdpdGAgY2Fubm90IGJlIHJ1bi5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgYXN5bmMgb3Blbih3b3JraW5nRGlyZWN0b3J5OiBzdHJpbmcpOiBQcm9taXNlPEJ1bGtPcGVyYXRpb25HaXRSZXBvIHwgbnVsbD4ge1xuICAgIGxldCByZXN1bHQ6IEdpdENvbW1hbmRSZXN1bHQ7XG4gICAgdHJ5IHtcbiAgICAgIHJlc3VsdCA9IGF3YWl0IGV4ZWNHaXQoeyBjd2Q6IHdvcmtpbmdEaXJlY3RvcnksIGdpdEFyZ3VtZW50czogWydyZXYtcGFyc2UnLCAnLS1pcy1pbnNpZGUtd29yay10cmVlJywgJy0tYWJzb2x1dGUtZ2l0LWRpciddIH0pO1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGNvbnN0IFtpc0luc2lkZVdvcmtUcmVlLCBnaXREaXJlY3RvcnldID0gcmVzdWx0LnN0ZG91dC5zcGxpdCgvXFxyP1xcbi8sIFJFVl9QQVJTRV9PVVRQVVRfTElORV9DT1VOVCk7XG4gICAgcmV0dXJuIHJlc3VsdC5leGl0Q29kZSAhPT0gMCB8fCBpc0luc2lkZVdvcmtUcmVlICE9PSAndHJ1ZScgfHwgIWdpdERpcmVjdG9yeSA/IG51bGwgOiBuZXcgQnVsa09wZXJhdGlvbkdpdFJlcG8oeyBnaXREaXJlY3RvcnksIHdvcmtpbmdEaXJlY3RvcnkgfSk7XG4gIH1cblxuICAvKipcbiAgICogUmVmdXNlcyB0byBnbyBvbiB3aGVuIHRoZSByZXBvIHJvdXRlcyBmaWxlcyB0aHJvdWdoIGdpdC1hbm5leCBidXQgYGdpdC1hbm5leGAgY2Fubm90IGJlIHJ1biwgc2luY2UgYVxuICAgKiBwbGFpbiBgZ2l0IGFkZGAgd291bGQgdGhlbiBwdXQgdGhlIGxhcmdlIGZpbGVzIGludG8gZ2l0IGl0c2VsZi5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBhc3NlcnRDYW5Db21taXRMYXJnZUZpbGVzKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGFubmV4RmlsdGVycyA9IGF3YWl0IHRoaXMucnVuR2l0KHsgYWxsb3dlZEV4aXRDb2RlczogWzAsIDFdLCBnaXRBcmd1bWVudHM6IFsnY29uZmlnJywgJy0tZ2V0LXJlZ2V4cCcsIFN0cmluZy5yYXdgXmZpbHRlclxcLmFubmV4XFwuYF0gfSk7XG4gICAgaWYgKCFhbm5leEZpbHRlcnMuc3Rkb3V0LnRyaW0oKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBhbm5leFZlcnNpb24gPSBhd2FpdCB0aGlzLnJ1bkdpdCh7IGdpdEFyZ3VtZW50czogWydhbm5leCcsICd2ZXJzaW9uJywgJy0tcmF3J10gfSkuY2F0Y2goKCkgPT4gbnVsbCk7XG4gICAgaWYgKGFubmV4VmVyc2lvbiA9PT0gbnVsbCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAnVGhlIHZhdWx0IHJlcG9zaXRvcnkgcm91dGVzIGZpbGVzIHRocm91Z2ggZ2l0LWFubmV4LCBidXQgZ2l0LWFubmV4IGlzIG5vdCBvbiBQQVRILiBCdWxrIG9wZXJhdGlvbiBjb21taXRzIGFyZSByZWZ1c2VkLCBiZWNhdXNlIHRoZXkgd291bGQgYWRkIGxhcmdlIGZpbGVzIHRvIGdpdCBpdHNlbGYuJ1xuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogTGlzdHMgdGhlIGJ1bGstb3BlcmF0aW9uIGNvbW1pdHMgYSBwbHVnaW4gbWFkZSBvbiB0aGUgY3VycmVudCBicmFuY2gsIG5ld2VzdCBmaXJzdC5cbiAgICpcbiAgICogQHBhcmFtIHBsdWdpbklkIC0gVGhlIHBsdWdpbiBpZC5cbiAgICogQHJldHVybnMgVGhlIGNvbW1pdHMuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgbGlzdEJ1bGtPcGVyYXRpb25Db21taXRzKHBsdWdpbklkOiBzdHJpbmcpOiBQcm9taXNlPEJ1bGtPcGVyYXRpb25Db21taXRbXT4ge1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMucnVuR2l0KHtcbiAgICAgIGFsbG93ZWRFeGl0Q29kZXM6IFswLCBHSVRfRkFUQUxfRVhJVF9DT0RFXSxcbiAgICAgIGdpdEFyZ3VtZW50czogW1xuICAgICAgICAnbG9nJyxcbiAgICAgICAgYC0tZm9ybWF0PSVIJHtVTklUX1NFUEFSQVRPUn0lYUkke1VOSVRfU0VQQVJBVE9SfSVzYCxcbiAgICAgICAgJy0tZXh0ZW5kZWQtcmVnZXhwJyxcbiAgICAgICAgYC0tZ3JlcD1eJHtQTFVHSU5fVFJBSUxFUl9LRVl9OiAke2VzY2FwZVJlZ0V4cChwbHVnaW5JZCl9JGBcbiAgICAgIF1cbiAgICB9KTtcbiAgICBpZiAocmVzdWx0LmV4aXRDb2RlICE9PSAwKSB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuICAgIGNvbnN0IGNvbW1pdHM6IEJ1bGtPcGVyYXRpb25Db21taXRbXSA9IFtdO1xuICAgIGZvciAoY29uc3QgbGluZSBvZiByZXN1bHQuc3Rkb3V0LnNwbGl0KC9cXHI/XFxuLykpIHtcbiAgICAgIGNvbnN0IFtzaGEgPSAnJywgZGF0ZSA9ICcnLCAuLi5zdWJqZWN0UGFydHNdID0gbGluZS5zcGxpdChVTklUX1NFUEFSQVRPUik7XG4gICAgICBjb25zdCBjb21taXQgPSBwYXJzZUJ1bGtPcGVyYXRpb25Db21taXQoeyBkYXRlLCBzaGEsIHN1YmplY3Q6IHN1YmplY3RQYXJ0cy5qb2luKFVOSVRfU0VQQVJBVE9SKSB9KTtcbiAgICAgIGlmIChjb21taXQpIHtcbiAgICAgICAgY29tbWl0cy5wdXNoKGNvbW1pdCk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBjb21taXRzO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbW1pdHMgd2hhdGV2ZXIgYSBzdGFsZSBsb2NrJ3Mgb3BlcmF0aW9uIGxlZnQgYmVoaW5kIGFzIGBPUDxuPiBpbnRlcnJ1cHRlZGAgYW5kIHJlbW92ZXMgdGhlIGxvY2suXG4gICAqXG4gICAqIEByZXR1cm5zIFRoZSBpZCBvZiB0aGUgcmVjb3ZlcmVkIG9wZXJhdGlvbiwgb3IgYG51bGxgIHdoZW4gdGhlcmUgd2FzIG5vIHN0YWxlIGxvY2suXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgcmVjb3ZlclN0YWxlTG9jaygpOiBQcm9taXNlPG51bGwgfCBzdHJpbmc+IHtcbiAgICBjb25zdCBsb2NrID0gYXdhaXQgdGhpcy5yZWFkTG9jaygpO1xuICAgIHJldHVybiAhbG9jayB8fCAhdGhpcy5pc1N0YWxlKGxvY2spID8gbnVsbCA6IChhd2FpdCB0aGlzLnJlY292ZXIobG9jaykpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldmVydHMgYSBidWxrLW9wZXJhdGlvbiBjb21taXQgd2l0aCBgZ2l0IHJldmVydCAtLW5vLWVkaXRgLlxuICAgKlxuICAgKiBXaGF0ZXZlciBpcyBwZW5kaW5nIGlzIGNvbW1pdHRlZCBmaXJzdCwgc28gdGhlIHJldmVydCBzdGFydHMgZnJvbSBhIGNsZWFuIHRyZWUuIEEgY29uZmxpY3QgaXMgTk9UIGFib3J0ZWQ6IHRoZVxuICAgKiByZXBvIGlzIGxlZnQgbWlkLXJldmVydCBmb3IgdGhlIHVzZXIgdG8gcmVzb2x2ZS5cbiAgICpcbiAgICogQHBhcmFtIGNvbW1pdCAtIFRoZSBjb21taXQgdG8gcmV2ZXJ0LlxuICAgKiBAcmV0dXJucyBXaGV0aGVyIHRoZSByZXZlcnQgc3RvcHBlZCBvbiBhIGNvbmZsaWN0LCBhbmQgd2hhdCBnaXQgcHJpbnRlZC5cbiAgICovXG4gIHB1YmxpYyBhc3luYyByZXZlcnRCdWxrT3BlcmF0aW9uQ29tbWl0KGNvbW1pdDogQnVsa09wZXJhdGlvbkNvbW1pdCk6IFByb21pc2U8R2l0UmV2ZXJ0UmVzdWx0PiB7XG4gICAgYXdhaXQgdGhpcy5hc3NlcnRDYW5Db21taXRMYXJnZUZpbGVzKCk7XG4gICAgYXdhaXQgdGhpcy5hY3F1aXJlTG9jaygpO1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCB0aGlzLmNvbW1pdFBlbmRpbmcoeyBib2R5OiAnJywgc3ViamVjdDogYGNob3JlOiBiZWZvcmUgcmV2ZXJ0IG9mICR7Y29tbWl0Lm9wZXJhdGlvbklkfWAgfSk7XG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLnJ1bkdpdCh7IGFsbG93ZWRFeGl0Q29kZXM6IFswLCAxXSwgZ2l0QXJndW1lbnRzOiBbJ3JldmVydCcsICctLW5vLWVkaXQnLCBjb21taXQuc2hhXSB9KTtcbiAgICAgIHJldHVybiB7IGlzQ29uZmxpY3Q6IHJlc3VsdC5leGl0Q29kZSAhPT0gMCwgb3V0cHV0OiBgJHtyZXN1bHQuc3Rkb3V0fSR7cmVzdWx0LnN0ZGVycn1gLnRyaW0oKSB9O1xuICAgIH0gZmluYWxseSB7XG4gICAgICBhd2FpdCB0aGlzLnJlbGVhc2VMb2NrKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgYSBidWxrIG9wZXJhdGlvbiBiZXR3ZWVuIHR3byBjb21taXRzLlxuICAgKlxuICAgKiBUYWtlcyB0aGUgbGVhc2UgbG9jaywgY29tbWl0cyB3aGF0ZXZlciBpcyBwZW5kaW5nIGFzIGBjaG9yZTogYmVmb3JlIE9QPG4+YCwgcnVucyB0aGUgb3BlcmF0aW9uLCB3YWl0cyBmb3IgaXRzXG4gICAqIGZvbGxvdy11cHMgdG8gc2V0dGxlLCBjb21taXRzIHRoZSByZXN1bHQgYXMgYE9QPG4+OiA8c3VtbWFyeT5gIGFuZCByZWxlYXNlcyB0aGUgbG9jay4gQW4gb3BlcmF0aW9uIHRoYXQgdGhyb3dzXG4gICAqIHN0aWxsIGdldHMgaXRzIHBhcnRpYWwgY2hhbmdlcyBjb21taXR0ZWQsIGFzIGBPUDxuPiBpbnRlcnJ1cHRlZGAsIGJlZm9yZSB0aGUgZXJyb3IgaXMgcmV0aHJvd24uXG4gICAqXG4gICAqIFdoZW4gdGhlIGxvY2sgd2FzIHJlY292ZXJlZCB1bmRlciB0aGUgb3BlcmF0aW9uIChpdCB3ZW50IHN0YWxlLCBhbmQgYW5vdGhlciBvcGVyYXRpb24sIHRoZSBzY2hlZHVsZWQgYXV0b2NvbW1pdCBvclxuICAgKiBhIHJlbG9hZCBjb21taXR0ZWQgYE9QPG4+IGludGVycnVwdGVkYCBhbmQgcmVtb3ZlZCBpdCksIHRoZSByZXN0IGlzIG5ldmVyIGNvbW1pdHRlZCB1bmRlciB0aGUgcmVjb3ZlcmVkIGlkOiB0aGVcbiAgICogbG9jayBpcyB0YWtlbiBhZ2FpbiBhbmQgdGhlIHJlc3QgaXMgY29tbWl0dGVkIGFzIGEgZnJlc2ggYE9QPG0+YCB3aG9zZSBzdW1tYXJ5IG5hbWVzIGBPUDxuPmAuXG4gICAqXG4gICAqIEB0eXBlUGFyYW0gVCAtIFRoZSB0eXBlIG9mIHRoZSBvcGVyYXRpb24ncyByZXN1bHQuXG4gICAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgcGFyYW1ldGVycy5cbiAgICogQHJldHVybnMgVGhlIG9wZXJhdGlvbidzIHJlc3VsdCwgaXRzIGlkLCB0aGUgaGFzaCBvZiBpdHMgY29tbWl0IGFuZCB0aGUgaWQgaXQgbG9zdCB0byBhIHJlY292ZXJ5LCBpZiBhbnkuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgcnVuQnVsa09wZXJhdGlvbjxUPihwYXJhbXM6IEJ1bGtPcGVyYXRpb25HaXRSZXBvUnVuQnVsa09wZXJhdGlvblBhcmFtczxUPik6IFByb21pc2U8R2l0QnVsa09wZXJhdGlvblJlc3VsdDxUPj4ge1xuICAgIGF3YWl0IHRoaXMuYXNzZXJ0Q2FuQ29tbWl0TGFyZ2VGaWxlcygpO1xuICAgIGF3YWl0IHRoaXMuYWNxdWlyZUxvY2soKTtcbiAgICBsZXQgdW5yZWdpc3RlclByb2dyZXNzTGlzdGVuZXI6ICgoKSA9PiB2b2lkKSB8IG51bGwgPSBudWxsO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBzdGFydE9wZXJhdGlvbklkID0gYXdhaXQgdGhpcy5hbGxvY2F0ZU9wZXJhdGlvbklkKHBhcmFtcy5wbHVnaW5JZCk7XG4gICAgICBhd2FpdCB0aGlzLmNvbW1pdFBlbmRpbmcoeyBib2R5OiAnJywgc3ViamVjdDogYnVpbGRCZWZvcmVPcGVyYXRpb25Db21taXRTdWJqZWN0KHN0YXJ0T3BlcmF0aW9uSWQpIH0pO1xuXG4gICAgICB1bnJlZ2lzdGVyUHJvZ3Jlc3NMaXN0ZW5lciA9IHJlZ2lzdGVyQnVsa09wZXJhdGlvblByb2dyZXNzTGlzdGVuZXIodGhpcy5jcmVhdGVUaHJvdHRsZWRIZWFydGJlYXQoKSk7XG5cbiAgICAgIGxldCByZXN1bHQ6IFQ7XG4gICAgICB0cnkge1xuICAgICAgICByZXN1bHQgPSBhd2FpdCBwYXJhbXMub3BlcmF0aW9uKCk7XG4gICAgICAgIGF3YWl0IHBhcmFtcy5zZXR0bGUoKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNvbnN0IG9wZXJhdGlvbklkID0gYXdhaXQgdGhpcy5yZWNsYWltTG9ja0lmUmVjb3ZlcmVkKHN0YXJ0T3BlcmF0aW9uSWQsIHBhcmFtcy5wbHVnaW5JZCkgPz8gc3RhcnRPcGVyYXRpb25JZDtcbiAgICAgICAgYXdhaXQgdGhpcy5jb21taXRPcGVyYXRpb24oeyBpc0ludGVycnVwdGVkOiB0cnVlLCBvcGVyYXRpb25JZCwgcGx1Z2luSWQ6IHBhcmFtcy5wbHVnaW5JZCB9KTtcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHJlc3VtZWRPcGVyYXRpb25JZCA9IGF3YWl0IHRoaXMucmVjbGFpbUxvY2tJZlJlY292ZXJlZChzdGFydE9wZXJhdGlvbklkLCBwYXJhbXMucGx1Z2luSWQpO1xuICAgICAgY29uc3Qgb3BlcmF0aW9uSWQgPSByZXN1bWVkT3BlcmF0aW9uSWQgPz8gc3RhcnRPcGVyYXRpb25JZDtcbiAgICAgIGNvbnN0IHN1bW1hcnkgPSByZXN1bWVkT3BlcmF0aW9uSWQgPT09IG51bGwgPyBwYXJhbXMuc3VtbWFyeSA6IGAke3BhcmFtcy5zdW1tYXJ5fSAocmVzdW1lZCBhZnRlciAke3N0YXJ0T3BlcmF0aW9uSWR9IHdhcyByZWNvdmVyZWQpYDtcbiAgICAgIGNvbnN0IGNvbW1pdFNoYSA9IGF3YWl0IHRoaXMuY29tbWl0T3BlcmF0aW9uKHsgb3BlcmF0aW9uSWQsIHBsdWdpbklkOiBwYXJhbXMucGx1Z2luSWQsIHN1bW1hcnkgfSk7XG4gICAgICByZXR1cm4geyBjb21taXRTaGEsIG9wZXJhdGlvbklkLCByZWNvdmVyZWRPcGVyYXRpb25JZDogcmVzdW1lZE9wZXJhdGlvbklkID09PSBudWxsID8gbnVsbCA6IHN0YXJ0T3BlcmF0aW9uSWQsIHJlc3VsdCB9O1xuICAgIH0gZmluYWxseSB7XG4gICAgICB1bnJlZ2lzdGVyUHJvZ3Jlc3NMaXN0ZW5lcj8uKCk7XG4gICAgICBhd2FpdCB0aGlzLnJlbGVhc2VMb2NrKCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBhY3F1aXJlTG9jaygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBkZWFkbGluZSA9IERhdGUubm93KCkgKyB0aGlzLmxvY2tXYWl0VGltZW91dEluTWlsbGlzZWNvbmRzO1xuICAgIGZvciAoOzspIHtcbiAgICAgIGlmIChhd2FpdCB0aGlzLnRyeUNyZWF0ZUxvY2soKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGxvY2sgPSBhd2FpdCB0aGlzLnJlYWRMb2NrKCk7XG4gICAgICBpZiAoIWxvY2spIHtcbiAgICAgICAgLy8gUmVsZWFzZWQgYmV0d2VlbiB0aGUgdHdvIGNhbGxzOiB0cnkgdG8gdGFrZSBpdCBhZ2FpbiBhdCBvbmNlLlxuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMuaXNTdGFsZShsb2NrKSkge1xuICAgICAgICBhd2FpdCB0aGlzLnJlY292ZXIobG9jayk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAoRGF0ZS5ub3coKSA+PSBkZWFkbGluZSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYFRpbWVkIG91dCB3YWl0aW5nIGZvciAke2xvY2sub3BlcmF0aW9uSWQgfHwgJ2FuIG9wZXJhdGlvbid9IG9mICR7bG9jay5wbHVnaW5JZH0gb24gJHtsb2NrLmhvc3R9IHRvIHJlbGVhc2UgdGhlIGJ1bGsgb3BlcmF0aW9uIGxvY2sgJHt0aGlzLmxvY2tGaWxlUGF0aH0uYFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICBhd2FpdCBzZXRUaW1lb3V0QXN5bmMoTE9DS19QT0xMX0lOVEVSVkFMX0lOX01JTExJU0VDT05EUyk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBhbGxvY2F0ZU9wZXJhdGlvbklkKHBsdWdpbklkOiBzdHJpbmcsIHVzZWRPcGVyYXRpb25JZD86IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgY29uc3Qgb3BlcmF0aW9uSWQgPSBhd2FpdCB0aGlzLmZpbmROZXh0T3BlcmF0aW9uSWQodXNlZE9wZXJhdGlvbklkKTtcbiAgICBjb25zdCBvd25Mb2NrID0gZW5zdXJlTm9uTnVsbGFibGUodGhpcy5vd25Mb2NrKTtcbiAgICB0aGlzLm93bkxvY2sgPSB7IC4uLm93bkxvY2ssIGhlYXJ0YmVhdEF0OiBEYXRlLm5vdygpLCBvcGVyYXRpb25JZCwgcGx1Z2luSWQgfTtcbiAgICBhd2FpdCB0aGlzLndyaXRlTG9jayh0aGlzLm93bkxvY2spO1xuICAgIHJldHVybiBvcGVyYXRpb25JZDtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgY29tbWl0T3BlcmF0aW9uKHBhcmFtczogQnVsa09wZXJhdGlvbkdpdFJlcG9Db21taXRPcGVyYXRpb25QYXJhbXMpOiBQcm9taXNlPG51bGwgfCBzdHJpbmc+IHtcbiAgICBjb25zdCBjaGFuZ2VkRmlsZUNvdW50ID0gYXdhaXQgdGhpcy5zdGFnZUFsbCgpO1xuICAgIGlmIChjaGFuZ2VkRmlsZUNvdW50ID09PSAwKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgY29uc3QgbWVzc2FnZSA9IGJ1aWxkT3BlcmF0aW9uQ29tbWl0TWVzc2FnZSh7IC4uLnBhcmFtcywgY2hhbmdlZEZpbGVDb3VudCwgdGltZXN0YW1wOiBuZXcgRGF0ZSgpIH0pO1xuICAgIGF3YWl0IHRoaXMuY29tbWl0U3RhZ2VkKG1lc3NhZ2UpO1xuICAgIGNvbnN0IGhlYWRSZXN1bHQgPSBhd2FpdCB0aGlzLnJ1bkdpdCh7IGdpdEFyZ3VtZW50czogWydyZXYtcGFyc2UnLCAnSEVBRCddIH0pO1xuICAgIHJldHVybiBoZWFkUmVzdWx0LnN0ZG91dC50cmltKCk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGNvbW1pdFBlbmRpbmcobWVzc2FnZTogQ29tbWl0TWVzc2FnZSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmIChhd2FpdCB0aGlzLnN0YWdlQWxsKCkgPT09IDApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgYXdhaXQgdGhpcy5jb21taXRTdGFnZWQobWVzc2FnZSk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGNvbW1pdFN0YWdlZChtZXNzYWdlOiBDb21taXRNZXNzYWdlKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgZ2l0QXJndW1lbnRzID0gWydjb21taXQnLCAnLS1xdWlldCcsICctbScsIG1lc3NhZ2Uuc3ViamVjdF07XG4gICAgaWYgKG1lc3NhZ2UuYm9keSkge1xuICAgICAgZ2l0QXJndW1lbnRzLnB1c2goJy1tJywgbWVzc2FnZS5ib2R5KTtcbiAgICB9XG4gICAgZ2l0QXJndW1lbnRzLnB1c2goJy0tJywgJy4nKTtcbiAgICBhd2FpdCB0aGlzLnJ1bkdpdCh7IGdpdEFyZ3VtZW50cyB9KTtcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlVGhyb3R0bGVkSGVhcnRiZWF0KCk6ICgpID0+IHZvaWQge1xuICAgIGxldCBsYXN0SGVhcnRiZWF0QXQgPSBEYXRlLm5vdygpO1xuICAgIGxldCBwZW5kaW5nSGVhcnRiZWF0OiBQcm9taXNlPHZvaWQ+ID0gbm9vcEFzeW5jKCk7XG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgIGNvbnN0IG5vdyA9IERhdGUubm93KCk7XG4gICAgICBpZiAobm93IC0gbGFzdEhlYXJ0YmVhdEF0IDwgSEVBUlRCRUFUX1RIUk9UVExFX0lOX01JTExJU0VDT05EUykge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBsYXN0SGVhcnRiZWF0QXQgPSBub3c7XG4gICAgICBwZW5kaW5nSGVhcnRiZWF0ID0gcGVuZGluZ0hlYXJ0YmVhdC50aGVuKCgpID0+IHRoaXMuaGVhcnRiZWF0KCkpLmNhdGNoKChlcnJvcjogdW5rbm93bikgPT4ge1xuICAgICAgICBjb25zb2xlLmVycm9yKCdGYWlsZWQgdG8gcmVmcmVzaCB0aGUgYnVsayBvcGVyYXRpb24gbG9jayBoZWFydGJlYXQnLCBlcnJvcik7XG4gICAgICB9KTtcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBmaW5kTmV4dE9wZXJhdGlvbklkKHVzZWRPcGVyYXRpb25JZD86IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgLy8gYC0tYWxsYCBhbHNvIHJlYWRzIGEgcmVwb3NpdG9yeSB3aXRoIG5vIGNvbW1pdCB5ZXQsIHdoZXJlIGEgcGxhaW4gYGdpdCBsb2dgIGZhaWxzLlxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMucnVuR2l0KHtcbiAgICAgIGdpdEFyZ3VtZW50czogWydsb2cnLCAnLS1hbGwnLCAnLS1mb3JtYXQ9JXMnLCAnLS1leHRlbmRlZC1yZWdleHAnLCAnLS1ncmVwPV4oY2hvcmU6IGJlZm9yZSApP09QWzAtOV0rJ11cbiAgICB9KTtcbiAgICAvLyBBIHJlY292ZXJlZCBvcGVyYXRpb24gdGhhdCBjaGFuZ2VkIG5vdGhpbmcgeWV0IGxlZnQgbm8gY29tbWl0IG5hbWluZyBpdHMgaWQsIHNvIGl0IGlzIHBhc3NlZCBpbiBleHBsaWNpdGx5LlxuICAgIHJldHVybiBnZXROZXh0T3BlcmF0aW9uSWQoWy4uLnJlc3VsdC5zdGRvdXQuc3BsaXQoL1xccj9cXG4vKSwgdXNlZE9wZXJhdGlvbklkID8/ICcnXSk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGhlYXJ0YmVhdCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBsb2NrID0gYXdhaXQgdGhpcy5yZWFkTG9jaygpO1xuICAgIGlmICghbG9jayB8fCAhdGhpcy5pc093bkxvY2sobG9jaykpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgYXdhaXQgdGhpcy53cml0ZUxvY2soeyAuLi5sb2NrLCBoZWFydGJlYXRBdDogRGF0ZS5ub3coKSB9KTtcbiAgfVxuXG4gIHByaXZhdGUgaXNPd25Mb2NrKGxvY2s6IEJ1bGtPcGVyYXRpb25Mb2NrKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMub3duTG9jayAhPT0gbnVsbFxuICAgICAgJiYgbG9jay5ob3N0ID09PSB0aGlzLm93bkxvY2suaG9zdFxuICAgICAgJiYgbG9jay5wcm9jZXNzSWQgPT09IHRoaXMub3duTG9jay5wcm9jZXNzSWRcbiAgICAgICYmIGxvY2suc3RhcnRlZEF0ID09PSB0aGlzLm93bkxvY2suc3RhcnRlZEF0O1xuICB9XG5cbiAgcHJpdmF0ZSBpc1N0YWxlKGxvY2s6IEJ1bGtPcGVyYXRpb25Mb2NrKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGlzQnVsa09wZXJhdGlvbkxvY2tTdGFsZShsb2NrLCB7XG4gICAgICBib290ZWRBdDogRGF0ZS5ub3coKSAtIHVwdGltZSgpICogTUlMTElTRUNPTkRTX0lOX1NFQ09ORCxcbiAgICAgIGhvc3Q6IGhvc3RuYW1lKCksXG4gICAgICBpc1Byb2Nlc3NBbGl2ZSxcbiAgICAgIG5vdzogRGF0ZS5ub3coKVxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyByZWFkTG9jaygpOiBQcm9taXNlPEJ1bGtPcGVyYXRpb25Mb2NrIHwgbnVsbD4ge1xuICAgIGxldCB0ZXh0OiBzdHJpbmc7XG4gICAgdHJ5IHtcbiAgICAgIHRleHQgPSBhd2FpdCByZWFkRmlsZSh0aGlzLmxvY2tGaWxlUGF0aCwgJ3V0Zi04Jyk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGlmIChpc0Vycm9yV2l0aENvZGUoZXJyb3IsICdFTk9FTlQnKSkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICBjb25zdCB2YWx1ZTogdW5rbm93biA9IEpTT04ucGFyc2UodGV4dCk7XG4gICAgICBpZiAoaXNCdWxrT3BlcmF0aW9uTG9jayh2YWx1ZSkpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgfVxuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gVXBkYXRlcyBhcmUgYXRvbWljLCBidXQgYSBsb2NrIGJlaW5nIGNyZWF0ZWQgY2FuIGJlIHJlYWQgYmVmb3JlIGl0cyBjb250ZW50IGlzIHdyaXR0ZW4uIFRoZSBmaWxlJ3MgYWdlXG4gICAgICAvLyBzdGFuZHMgaW4gZm9yIHRoZSBoZWFydGJlYXQsIHNvIHN1Y2ggYSBsb2NrIHJlYWRzIGFzIGZyZXNoIGFuZCBhIGNvcnJ1cHQgb25lIGdvZXMgc3RhbGUgbGlrZSBhbnkgb3RoZXIuXG4gICAgfVxuICAgIGNvbnN0IGZpbGVTdGF0cyA9IGF3YWl0IHN0YXQodGhpcy5sb2NrRmlsZVBhdGgpO1xuICAgIHJldHVybiB7XG4gICAgICBoZWFydGJlYXRBdDogZmlsZVN0YXRzLm10aW1lTXMsXG4gICAgICBob3N0OiAnJyxcbiAgICAgIG9wZXJhdGlvbklkOiAnJyxcbiAgICAgIHBsdWdpbklkOiAnJyxcbiAgICAgIHByb2Nlc3NJZDogMCxcbiAgICAgIHByb2Nlc3NTdGFydGVkQXQ6IDAsXG4gICAgICBzdGFydGVkQXQ6IDBcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFJlZnJlc2hlcyB0aGUgb3BlcmF0aW9uJ3MgbG9jayBiZWZvcmUgaXRzIGNvbW1pdCwgb3IgdGFrZXMgdGhlIGxvY2sgYWdhaW4gd2hlbiBpdCB3YXMgcmVjb3ZlcmVkIHVuZGVyIHRoZVxuICAgKiBvcGVyYXRpb24uXG4gICAqXG4gICAqIEBwYXJhbSBvcGVyYXRpb25JZCAtIFRoZSBpZCB0aGUgb3BlcmF0aW9uIHN0YXJ0ZWQgdW5kZXIuXG4gICAqIEBwYXJhbSBwbHVnaW5JZCAtIFRoZSBpZCBvZiB0aGUgcGx1Z2luIHJ1bm5pbmcgdGhlIG9wZXJhdGlvbi5cbiAgICogQHJldHVybnMgYG51bGxgIHdoZW4gdGhlIGxvY2sgaXMgc3RpbGwgdGhlIG9wZXJhdGlvbidzIG93biwgb3RoZXJ3aXNlIHRoZSBmcmVzaCBpZCB0aGUgcmVzdCBpcyBjb21taXR0ZWQgdW5kZXIuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHJlY2xhaW1Mb2NrSWZSZWNvdmVyZWQob3BlcmF0aW9uSWQ6IHN0cmluZywgcGx1Z2luSWQ6IHN0cmluZyk6IFByb21pc2U8bnVsbCB8IHN0cmluZz4ge1xuICAgIGNvbnN0IGxvY2sgPSBhd2FpdCB0aGlzLnJlYWRMb2NrKCk7XG4gICAgaWYgKGxvY2sgIT09IG51bGwgJiYgdGhpcy5pc093bkxvY2sobG9jaykpIHtcbiAgICAgIGF3YWl0IHRoaXMud3JpdGVMb2NrKHsgLi4ubG9jaywgaGVhcnRiZWF0QXQ6IERhdGUubm93KCkgfSk7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgY29uc29sZS53YXJuKGBUaGUgYnVsayBvcGVyYXRpb24gbG9jayBvZiAke29wZXJhdGlvbklkfSB3YXMgcmVjb3ZlcmVkIHdoaWxlIGl0IHJhbjsgY29tbWl0dGluZyB0aGUgcmVzdCB1bmRlciBhIGZyZXNoIG9wZXJhdGlvbiBpZC5gKTtcbiAgICB0aGlzLm93bkxvY2sgPSBudWxsO1xuICAgIGF3YWl0IHRoaXMuYWNxdWlyZUxvY2soKTtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5hbGxvY2F0ZU9wZXJhdGlvbklkKHBsdWdpbklkLCBvcGVyYXRpb25JZCk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHJlY292ZXIobG9jazogQnVsa09wZXJhdGlvbkxvY2spOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGNvbnN0IG9wZXJhdGlvbklkID0gbG9jay5vcGVyYXRpb25JZCB8fCBhd2FpdCB0aGlzLmZpbmROZXh0T3BlcmF0aW9uSWQoKTtcbiAgICBhd2FpdCB0aGlzLmNvbW1pdE9wZXJhdGlvbih7IGlzSW50ZXJydXB0ZWQ6IHRydWUsIG9wZXJhdGlvbklkLCBwbHVnaW5JZDogbG9jay5wbHVnaW5JZCB8fCAndW5rbm93bicgfSk7XG4gICAgYXdhaXQgdW5saW5rKHRoaXMubG9ja0ZpbGVQYXRoKS5jYXRjaCgoZXJyb3I6IHVua25vd24pID0+IHtcbiAgICAgIGlmICghaXNFcnJvcldpdGhDb2RlKGVycm9yLCAnRU5PRU5UJykpIHtcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIG9wZXJhdGlvbklkO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyByZWxlYXNlTG9jaygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBsb2NrID0gYXdhaXQgdGhpcy5yZWFkTG9jaygpO1xuICAgIGNvbnN0IGlzT3duTG9jayA9IGxvY2sgIT09IG51bGwgJiYgdGhpcy5pc093bkxvY2sobG9jayk7XG4gICAgdGhpcy5vd25Mb2NrID0gbnVsbDtcbiAgICBpZiAoIWlzT3duTG9jaykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBhd2FpdCB1bmxpbmsodGhpcy5sb2NrRmlsZVBhdGgpLmNhdGNoKChlcnJvcjogdW5rbm93bikgPT4ge1xuICAgICAgaWYgKCFpc0Vycm9yV2l0aENvZGUoZXJyb3IsICdFTk9FTlQnKSkge1xuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgcnVuR2l0KHBhcmFtczogQnVsa09wZXJhdGlvbkdpdFJlcG9SdW5HaXRQYXJhbXMpOiBQcm9taXNlPEdpdENvbW1hbmRSZXN1bHQ+IHtcbiAgICBjb25zdCBhbGxvd2VkRXhpdENvZGVzID0gcGFyYW1zLmFsbG93ZWRFeGl0Q29kZXMgPz8gWzBdO1xuICAgIGZvciAobGV0IGF0dGVtcHQgPSAxOzsgYXR0ZW1wdCsrKSB7XG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBleGVjR2l0KHsgY3dkOiB0aGlzLndvcmtpbmdEaXJlY3RvcnksIGdpdEFyZ3VtZW50czogcGFyYW1zLmdpdEFyZ3VtZW50cyB9KTtcbiAgICAgIGlmIChhbGxvd2VkRXhpdENvZGVzLmluY2x1ZGVzKHJlc3VsdC5leGl0Q29kZSkpIHtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH1cbiAgICAgIGlmIChhdHRlbXB0IDwgSU5ERVhfTE9DS19SRVRSWV9DT1VOVCAmJiByZXN1bHQuc3RkZXJyLmluY2x1ZGVzKCdpbmRleC5sb2NrJykpIHtcbiAgICAgICAgYXdhaXQgc2V0VGltZW91dEFzeW5jKElOREVYX0xPQ0tfUkVUUllfREVMQVlfSU5fTUlMTElTRUNPTkRTKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICB0aHJvdyBuZXcgR2l0Q29tbWFuZEVycm9yKHBhcmFtcy5naXRBcmd1bWVudHMsIHJlc3VsdC5leGl0Q29kZSwgcmVzdWx0LnN0ZGVycik7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBzdGFnZUFsbCgpOiBQcm9taXNlPG51bWJlcj4ge1xuICAgIGF3YWl0IHRoaXMucnVuR2l0KHsgZ2l0QXJndW1lbnRzOiBbJ2FkZCcsICctLWFsbCcsICctLScsICcuJ10gfSk7XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5ydW5HaXQoeyBnaXRBcmd1bWVudHM6IFsnZGlmZicsICctLWNhY2hlZCcsICctLW5hbWUtb25seScsICcteicsICctLScsICcuJ10gfSk7XG4gICAgcmV0dXJuIHJlc3VsdC5zdGRvdXQuc3BsaXQoJ1xcMCcpLmZpbHRlcihCb29sZWFuKS5sZW5ndGg7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHRyeUNyZWF0ZUxvY2soKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgY29uc3QgbG9jayA9IGNyZWF0ZUxvY2tSZWNvcmQoKTtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgd3JpdGVGaWxlKHRoaXMubG9ja0ZpbGVQYXRoLCBKU09OLnN0cmluZ2lmeShsb2NrKSwgeyBmbGFnOiAnd3gnIH0pO1xuICAgICAgdGhpcy5vd25Mb2NrID0gbG9jaztcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBpZiAoaXNFcnJvcldpdGhDb2RlKGVycm9yLCAnRUVYSVNUJykpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyB3cml0ZUxvY2sobG9jazogQnVsa09wZXJhdGlvbkxvY2spOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAvLyBXcml0dGVuIGJlc2lkZSB0aGUgbG9jayBhbmQgcmVuYW1lZCBvdmVyIGl0LCBzbyBhIHJlYWRlciBuZXZlciBzZWVzIGEgaGFsZi13cml0dGVuIGhlYXJ0YmVhdC5cbiAgICBjb25zdCB0ZW1wb3JhcnlQYXRoID0gYCR7dGhpcy5sb2NrRmlsZVBhdGh9LiR7U3RyaW5nKGxvY2sucHJvY2Vzc0lkKX0udG1wYDtcbiAgICBhd2FpdCB3cml0ZUZpbGUodGVtcG9yYXJ5UGF0aCwgSlNPTi5zdHJpbmdpZnkobG9jaykpO1xuICAgIGF3YWl0IHJlbmFtZSh0ZW1wb3JhcnlQYXRoLCB0aGlzLmxvY2tGaWxlUGF0aCk7XG4gIH1cbn1cblxuLyoqXG4gKiBBbiBlcnJvciB0aHJvd24gd2hlbiBhIGBnaXRgIGNvbW1hbmQgZmFpbHMuXG4gKi9cbmV4cG9ydCBjbGFzcyBHaXRDb21tYW5kRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLlxuICAgKlxuICAgKiBAcGFyYW0gZ2l0QXJndW1lbnRzIC0gVGhlIGFyZ3VtZW50cyBgZ2l0YCB3YXMgcnVuIHdpdGguXG4gICAqIEBwYXJhbSBleGl0Q29kZSAtIFRoZSBleGl0IGNvZGUuXG4gICAqIEBwYXJhbSBzdGRlcnIgLSBXaGF0IGBnaXRgIHByaW50ZWQgdG8gc3RkZXJyLlxuICAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKHB1YmxpYyByZWFkb25seSBnaXRBcmd1bWVudHM6IHJlYWRvbmx5IHN0cmluZ1tdLCBwdWJsaWMgcmVhZG9ubHkgZXhpdENvZGU6IG51bWJlciwgcHVibGljIHJlYWRvbmx5IHN0ZGVycjogc3RyaW5nKSB7XG4gICAgc3VwZXIoYGdpdCAke2dpdEFyZ3VtZW50cy5qb2luKCcgJyl9IGZhaWxlZCB3aXRoIGV4aXQgY29kZSAke1N0cmluZyhleGl0Q29kZSl9OiAke3N0ZGVyci50cmltKCl9YCk7XG4gICAgdGhpcy5uYW1lID0gJ0dpdENvbW1hbmRFcnJvcic7XG4gIH1cbn1cblxuZnVuY3Rpb24gY3JlYXRlTG9ja1JlY29yZCgpOiBCdWxrT3BlcmF0aW9uTG9jayB7XG4gIGNvbnN0IG5vdyA9IERhdGUubm93KCk7XG4gIHJldHVybiB7XG4gICAgaGVhcnRiZWF0QXQ6IG5vdyxcbiAgICBob3N0OiBob3N0bmFtZSgpLFxuICAgIG9wZXJhdGlvbklkOiAnJyxcbiAgICBwbHVnaW5JZDogJycsXG4gICAgcHJvY2Vzc0lkOiBwcm9jZXNzLnBpZCxcbiAgICBwcm9jZXNzU3RhcnRlZEF0OiBnZXRQcm9jZXNzU3RhcnRlZEF0KCksXG4gICAgc3RhcnRlZEF0OiBub3dcbiAgfTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZXhlY0dpdChwYXJhbXM6IEV4ZWNHaXRQYXJhbXMpOiBQcm9taXNlPEdpdENvbW1hbmRSZXN1bHQ+IHtcbiAgcmV0dXJuIGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICBleGVjRmlsZSgnZ2l0JywgWy4uLnBhcmFtcy5naXRBcmd1bWVudHNdLCB7IGN3ZDogcGFyYW1zLmN3ZCwgbWF4QnVmZmVyOiBNQVhfQlVGRkVSX0lOX0JZVEVTLCB3aW5kb3dzSGlkZTogdHJ1ZSB9LCAoZXJyb3IsIHN0ZG91dCwgc3RkZXJyKSA9PiB7XG4gICAgICBpZiAoZXJyb3IgJiYgdHlwZW9mIGVycm9yLmNvZGUgIT09ICdudW1iZXInKSB7XG4gICAgICAgIHJlamVjdChuZXcgRXJyb3IoYEZhaWxlZCB0byBydW4gZ2l0ICR7cGFyYW1zLmdpdEFyZ3VtZW50cy5qb2luKCcgJyl9YCwgeyBjYXVzZTogZXJyb3IgfSkpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICByZXNvbHZlKHsgZXhpdENvZGU6IHR5cGVvZiBlcnJvcj8uY29kZSA9PT0gJ251bWJlcicgPyBlcnJvci5jb2RlIDogMCwgc3RkZXJyLCBzdGRvdXQgfSk7XG4gICAgfSk7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBnZXRQcm9jZXNzU3RhcnRlZEF0KCk6IG51bWJlciB7XG4gIHJldHVybiBNYXRoLnJvdW5kKHBlcmZvcm1hbmNlLnRpbWVPcmlnaW4pO1xufVxuXG5mdW5jdGlvbiBpc0Vycm9yV2l0aENvZGUoZXJyb3I6IHVua25vd24sIGNvZGU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gdHlwZW9mIGVycm9yID09PSAnb2JqZWN0JyAmJiBlcnJvciAhPT0gbnVsbCAmJiAnY29kZScgaW4gZXJyb3IgJiYgZXJyb3IuY29kZSA9PT0gY29kZTtcbn1cblxuZnVuY3Rpb24gaXNQcm9jZXNzQWxpdmUocHJvY2Vzc0lkOiBudW1iZXIpOiBib29sZWFuIHwgbnVsbCB7XG4gIGlmIChwcm9jZXNzSWQgPD0gMCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICB0cnkge1xuICAgIHByb2Nlc3Mua2lsbChwcm9jZXNzSWQsIDApO1xuICAgIHJldHVybiB0cnVlO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIHJldHVybiAhaXNFcnJvcldpdGhDb2RlKGVycm9yLCAnRVNSQ0gnKSAmJiAoaXNFcnJvcldpdGhDb2RlKGVycm9yLCAnRVBFUk0nKSB8fCBudWxsKTtcbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQWdCQSxTQUFTLHVCQUF1QjtBQUNoQyxTQUFTLGlCQUFpQjtBQUMxQixTQUFTLG9CQUFvQjtBQUM3QixTQUFTLHlCQUF5QjtBQUNsQyxTQUFTLGdCQUFnQjtBQUN6QjtBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsT0FDSztBQUNQO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBQ1AsU0FBUyxZQUFZO0FBT3JCLFNBQVMsNkNBQTZDO0FBQ3REO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBOEdQLE1BQU0sNENBQTRDO0FBQ2xELE1BQU0scUNBQXFDO0FBQzNDLE1BQU0seUJBQXlCO0FBQy9CLE1BQU0seUNBQXlDO0FBQy9DLE1BQU0scUNBQXFDO0FBQzNDLE1BQU0sc0JBQXNCO0FBQzVCLE1BQU0seUJBQXlCO0FBQy9CLE1BQU0sc0JBQXNCO0FBQzVCLE1BQU0sOEJBQThCO0FBQ3BDLE1BQU0saUJBQWlCO0FBc0JoQixNQUFNLHFCQUFxQjtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBSWhCO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFLQTtBQUFBLEVBRUM7QUFBQSxFQUNBO0FBQUEsRUFDVCxVQUFvQztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQU9yQyxZ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
|
|
488
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9kZXNrdG9wLWJ1bGstb3BlcmF0aW9uLWdpdC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBmaWxlXG4gKlxuICogVGhlIGRlc2t0b3AgaGFsZiBvZiBidWxrLW9wZXJhdGlvbiBnaXQgY29tbWl0czogZHJpdmVzIHRoZSBzeXN0ZW0gYGdpdGAgQ0xJIHRvIHdyYXAgYSBidWxrIG9wZXJhdGlvbiBpbiBjb21taXRzLFxuICogZ3VhcmRlZCBieSBhIGxlYXNlIGxvY2sgaW4gdGhlIHJlcG8ncyBnaXQgZGlyZWN0b3J5LlxuICpcbiAqIFRoZSBzeXN0ZW0gQ0xJIGlzIHVzZWQgcmF0aGVyIHRoYW4gYSBidW5kbGVkIGltcGxlbWVudGF0aW9uIGJlY2F1c2UgaXQgaG9ub3JzIHRoZSByZXBvJ3Mgb3duIGNvbmZpZywgaG9va3NcbiAqIGFuZCBjbGVhbi9zbXVkZ2UgZmlsdGVycywgZ2l0LWFubmV4J3MgYW1vbmcgdGhlbSwgYW5kIGJlY2F1c2UgYGdpdCByZXZlcnRgIGlzIHRoZSB3aG9sZSB1bmRvIHN0b3J5LlxuICpcbiAqIEV2ZXJ5IGNvbW1hbmQgcnVucyB3aXRoIHRoZSB2YXVsdCBmb2xkZXIgYXMgaXRzIHdvcmtpbmcgZGlyZWN0b3J5IGFuZCBgLmAgYXMgaXRzIHBhdGhzcGVjLCBzbyB3aGVuIHRoZSB2YXVsdCBpcyBhXG4gKiBzdWJmb2xkZXIgb2YgYSBsYXJnZXIgcmVwbyBvbmx5IHRoZSB2YXVsdCdzIGNoYW5nZXMgYXJlIGNvbW1pdHRlZC5cbiAqXG4gKiBEZXNrdG9wLW9ubHkgKGBub2RlOmNoaWxkX3Byb2Nlc3NgLCBgbm9kZTpmc2AsIGBub2RlOm9zYCksIGJ1dCBpbmVydCB0byBpbXBvcnQgb24gbW9iaWxlOiBub3RoaW5nIGhlcmUgdG91Y2hlcyBhXG4gKiBOb2RlIGJ1aWx0aW4gdW50aWwgYSBmdW5jdGlvbiBpcyBjYWxsZWQuXG4gKi9cblxuaW1wb3J0IHsgc2V0VGltZW91dEFzeW5jIH0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL2FzeW5jJztcbmltcG9ydCB7IG5vb3BBc3luYyB9IGZyb20gJ0BtbmFvdW1vdi90eXBlc2NyaXB0LWxpYi9mdW5jdGlvbic7XG5pbXBvcnQgeyBlc2NhcGVSZWdFeHAgfSBmcm9tICdAbW5hb3Vtb3YvdHlwZXNjcmlwdC1saWIvcmVnLWV4cCc7XG5pbXBvcnQgeyBlbnN1cmVOb25OdWxsYWJsZSB9IGZyb20gJ0BtbmFvdW1vdi90eXBlc2NyaXB0LWxpYi90eXBlLWd1YXJkcyc7XG5pbXBvcnQgeyBleGVjRmlsZSB9IGZyb20gJ25vZGU6Y2hpbGRfcHJvY2Vzcyc7XG5pbXBvcnQge1xuICByZWFkRmlsZSxcbiAgcmVuYW1lLFxuICBzdGF0LFxuICB1bmxpbmssXG4gIHdyaXRlRmlsZVxufSBmcm9tICdub2RlOmZzL3Byb21pc2VzJztcbmltcG9ydCB7XG4gIGhvc3RuYW1lLFxuICB1cHRpbWVcbn0gZnJvbSAnbm9kZTpvcyc7XG5pbXBvcnQgeyBqb2luIH0gZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHR5cGUge1xuICBCdWxrT3BlcmF0aW9uQ29tbWl0LFxuICBCdWxrT3BlcmF0aW9uTG9ja1xufSBmcm9tICcuL2J1bGstb3BlcmF0aW9uLnRzJztcblxuaW1wb3J0IHsgcmVnaXN0ZXJCdWxrT3BlcmF0aW9uUHJvZ3Jlc3NMaXN0ZW5lciB9IGZyb20gJy4vYnVsay1vcGVyYXRpb24tcHJvZ3Jlc3MudHMnO1xuaW1wb3J0IHtcbiAgYnVpbGRCZWZvcmVPcGVyYXRpb25Db21taXRTdWJqZWN0LFxuICBidWlsZE9wZXJhdGlvbkNvbW1pdE1lc3NhZ2UsXG4gIEJVTEtfT1BFUkFUSU9OX0xPQ0tfRklMRV9OQU1FLFxuICBnZXROZXh0T3BlcmF0aW9uSWQsXG4gIGlzQnVsa09wZXJhdGlvbkxvY2ssXG4gIGlzQnVsa09wZXJhdGlvbkxvY2tTdGFsZSxcbiAgcGFyc2VCdWxrT3BlcmF0aW9uQ29tbWl0LFxuICBQTFVHSU5fVFJBSUxFUl9LRVlcbn0gZnJvbSAnLi9idWxrLW9wZXJhdGlvbi50cyc7XG5cbi8qKlxuICogQ29uc3RydWN0b3IgcGFyYW1ldGVycyBmb3Ige0BsaW5rIEJ1bGtPcGVyYXRpb25HaXRSZXBvfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCdWxrT3BlcmF0aW9uR2l0UmVwb0NvbnN0cnVjdG9yUGFyYW1zIHtcbiAgLyoqXG4gICAqIFRoZSBhYnNvbHV0ZSBwYXRoIG9mIHRoZSByZXBvJ3MgZ2l0IGRpcmVjdG9yeSwgd2hlcmUgdGhlIGxlYXNlIGxvY2sgbGl2ZXMuXG4gICAqL1xuICByZWFkb25seSBnaXREaXJlY3Rvcnk6IHN0cmluZztcblxuICAvKipcbiAgICogSG93IGxvbmcgdG8gd2FpdCBmb3IgYW5vdGhlciBvcGVyYXRpb24ncyBsb2NrIGJlZm9yZSBnaXZpbmcgdXAuXG4gICAqXG4gICAqIEBkZWZhdWx0IGA2MDBfMDAwYFxuICAgKi9cbiAgcmVhZG9ubHkgbG9ja1dhaXRUaW1lb3V0SW5NaWxsaXNlY29uZHM/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFRoZSBhYnNvbHV0ZSBwYXRoIG9mIHRoZSBmb2xkZXIgd2hvc2UgY2hhbmdlcyBhcmUgY29tbWl0dGVkOiB0aGUgdmF1bHQgcm9vdC5cbiAgICovXG4gIHJlYWRvbmx5IHdvcmtpbmdEaXJlY3Rvcnk6IHN0cmluZztcbn1cblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgQnVsa09wZXJhdGlvbkdpdFJlcG8ucnVuQnVsa09wZXJhdGlvbn0uXG4gKlxuICogQHR5cGVQYXJhbSBUIC0gVGhlIHR5cGUgb2YgdGhlIG9wZXJhdGlvbidzIHJlc3VsdC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCdWxrT3BlcmF0aW9uR2l0UmVwb1J1bkJ1bGtPcGVyYXRpb25QYXJhbXM8VD4ge1xuICAvKipcbiAgICogUnVucyB0aGUgYnVsayBvcGVyYXRpb24uXG4gICAqXG4gICAqIEByZXR1cm5zIFRoZSBvcGVyYXRpb24ncyByZXN1bHQuXG4gICAqL1xuICByZWFkb25seSBvcGVyYXRpb246ICgpID0+IFByb21pc2U8VD47XG5cbiAgLyoqXG4gICAqIFRoZSBpZCBvZiB0aGUgcGx1Z2luIHJ1bm5pbmcgdGhlIG9wZXJhdGlvbi5cbiAgICovXG4gIHJlYWRvbmx5IHBsdWdpbklkOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFdhaXRzIGZvciB0aGUgZm9sbG93LXVwcyB0aGUgb3BlcmF0aW9uIHNldCBvZmYgKHJlbmFtZSBoYW5kbGVycywgbGluayB1cGRhdGVzLCB0aGUgbWV0YWRhdGEgY2FjaGUpIHRvIGZpbmlzaCwgc29cbiAgICogdGhlaXIgY2hhbmdlcyBsYW5kIGluIHRoZSBvcGVyYXRpb24ncyBjb21taXQuXG4gICAqL1xuICByZWFkb25seSBzZXR0bGU6ICgpID0+IFByb21pc2U8dm9pZD47XG5cbiAgLyoqXG4gICAqIEEgb25lLWxpbmUgZGVzY3JpcHRpb24gb2YgdGhlIG9wZXJhdGlvbiwgdXNlZCBpbiB0aGUgY29tbWl0IHN1YmplY3QuXG4gICAqL1xuICByZWFkb25seSBzdW1tYXJ5OiBzdHJpbmc7XG59XG5cbi8qKlxuICogVGhlIHJlc3VsdCBvZiB7QGxpbmsgQnVsa09wZXJhdGlvbkdpdFJlcG8ucnVuQnVsa09wZXJhdGlvbn0uXG4gKlxuICogQHR5cGVQYXJhbSBUIC0gVGhlIHR5cGUgb2YgdGhlIG9wZXJhdGlvbidzIHJlc3VsdC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBHaXRCdWxrT3BlcmF0aW9uUmVzdWx0PFQ+IHtcbiAgLyoqXG4gICAqIFRoZSBoYXNoIG9mIHRoZSBjb21taXQgcmVjb3JkaW5nIHRoZSBvcGVyYXRpb24sIG9yIGBudWxsYCB3aGVuIHRoZSBvcGVyYXRpb24gY2hhbmdlZCBub3RoaW5nLlxuICAgKi9cbiAgcmVhZG9ubHkgY29tbWl0U2hhOiBudWxsIHwgc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgb3BlcmF0aW9uIGlkLCBzdWNoIGFzIGBPUDEyYC5cbiAgICovXG4gIHJlYWRvbmx5IG9wZXJhdGlvbklkOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBpZCB0aGUgb3BlcmF0aW9uIHN0YXJ0ZWQgdW5kZXIsIHdoZW4gaXRzIGxvY2sgd2FzIHJlY292ZXJlZCBhcyBzdGFsZSB3aGlsZSBpdCByYW4sIG9yIGBudWxsYCBvdGhlcndpc2UuXG4gICAqXG4gICAqIFRoZSBjaGFuZ2VzIG1hZGUgYmVmb3JlIHRoZSByZWNvdmVyeSBhcmUgaW4gdGhlIGA8cmVjb3ZlcmVkT3BlcmF0aW9uSWQ+IGludGVycnVwdGVkYCBjb21taXQsIGFuZCB0aGUgcmVzdCB3ZW50IGludG9cbiAgICogYSBmcmVzaCB7QGxpbmsgb3BlcmF0aW9uSWR9LCBzbyB1bmRvaW5nIHRoZSB3aG9sZSBvcGVyYXRpb24gdGFrZXMgcmV2ZXJ0aW5nIGJvdGguXG4gICAqL1xuICByZWFkb25seSByZWNvdmVyZWRPcGVyYXRpb25JZDogbnVsbCB8IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIG9wZXJhdGlvbidzIHJlc3VsdC5cbiAgICovXG4gIHJlYWRvbmx5IHJlc3VsdDogVDtcbn1cblxuLyoqXG4gKiBUaGUgcmVzdWx0IG9mIHtAbGluayBCdWxrT3BlcmF0aW9uR2l0UmVwby5yZXZlcnRCdWxrT3BlcmF0aW9uQ29tbWl0fS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBHaXRSZXZlcnRSZXN1bHQge1xuICAvKipcbiAgICogV2hldGhlciB0aGUgcmV2ZXJ0IHN0b3BwZWQgb24gYSBjb25mbGljdCwgbGVhdmluZyB0aGUgcmVwbyBtaWQtcmV2ZXJ0IGZvciB0aGUgdXNlciB0byByZXNvbHZlLlxuICAgKi9cbiAgcmVhZG9ubHkgaXNDb25mbGljdDogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hhdCBnaXQgcHJpbnRlZC5cbiAgICovXG4gIHJlYWRvbmx5IG91dHB1dDogc3RyaW5nO1xufVxuXG5pbnRlcmZhY2UgQnVsa09wZXJhdGlvbkdpdFJlcG9SdW5HaXRQYXJhbXMge1xuICByZWFkb25seSBhbGxvd2VkRXhpdENvZGVzPzogcmVhZG9ubHkgbnVtYmVyW107XG4gIHJlYWRvbmx5IGdpdEFyZ3VtZW50czogcmVhZG9ubHkgc3RyaW5nW107XG59XG5cbmludGVyZmFjZSBHaXRDb21tYW5kUmVzdWx0IHtcbiAgcmVhZG9ubHkgZXhpdENvZGU6IG51bWJlcjtcbiAgcmVhZG9ubHkgc3RkZXJyOiBzdHJpbmc7XG4gIHJlYWRvbmx5IHN0ZG91dDogc3RyaW5nO1xufVxuXG5jb25zdCBERUZBVUxUX0xPQ0tfV0FJVF9USU1FT1VUX0lOX01JTExJU0VDT05EUyA9IDYwMF8wMDA7XG5jb25zdCBIRUFSVEJFQVRfVEhST1RUTEVfSU5fTUlMTElTRUNPTkRTID0gNTAwMDtcbmNvbnN0IElOREVYX0xPQ0tfUkVUUllfQ09VTlQgPSAyMDtcbmNvbnN0IElOREVYX0xPQ0tfUkVUUllfREVMQVlfSU5fTUlMTElTRUNPTkRTID0gNTAwO1xuY29uc3QgTE9DS19QT0xMX0lOVEVSVkFMX0lOX01JTExJU0VDT05EUyA9IDEwMDA7XG5jb25zdCBNQVhfQlVGRkVSX0lOX0JZVEVTID0gMjY4XzQzNV80NTY7XG5jb25zdCBNSUxMSVNFQ09ORFNfSU5fU0VDT05EID0gMTAwMDtcbmNvbnN0IEdJVF9GQVRBTF9FWElUX0NPREUgPSAxMjg7XG5jb25zdCBSRVZfUEFSU0VfT1VUUFVUX0xJTkVfQ09VTlQgPSAyO1xuY29uc3QgVU5JVF9TRVBBUkFUT1IgPSAnXFx1ezFGfSc7XG5cbmludGVyZmFjZSBCdWxrT3BlcmF0aW9uR2l0UmVwb0NvbW1pdE9wZXJhdGlvblBhcmFtcyB7XG4gIHJlYWRvbmx5IGlzSW50ZXJydXB0ZWQ/OiBib29sZWFuO1xuICByZWFkb25seSBvcGVyYXRpb25JZDogc3RyaW5nO1xuICByZWFkb25seSBwbHVnaW5JZDogc3RyaW5nO1xuICByZWFkb25seSBzdW1tYXJ5Pzogc3RyaW5nO1xufVxuXG5pbnRlcmZhY2UgQ29tbWl0TWVzc2FnZSB7XG4gIHJlYWRvbmx5IGJvZHk6IHN0cmluZztcbiAgcmVhZG9ubHkgc3ViamVjdDogc3RyaW5nO1xufVxuXG5pbnRlcmZhY2UgRXhlY0dpdFBhcmFtcyB7XG4gIHJlYWRvbmx5IGN3ZDogc3RyaW5nO1xuICByZWFkb25seSBnaXRBcmd1bWVudHM6IHJlYWRvbmx5IHN0cmluZ1tdO1xufVxuXG4vKipcbiAqIEEgZ2l0IHJlcG8gaG9sZGluZyBhIHZhdWx0LCBkcml2ZW4gdG8gd3JhcCBidWxrIG9wZXJhdGlvbnMgaW4gY29tbWl0cy5cbiAqL1xuZXhwb3J0IGNsYXNzIEJ1bGtPcGVyYXRpb25HaXRSZXBvIHtcbiAgLyoqXG4gICAqIFRoZSBhYnNvbHV0ZSBwYXRoIG9mIHRoZSByZXBvJ3MgZ2l0IGRpcmVjdG9yeS5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBnaXREaXJlY3Rvcnk6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIGFic29sdXRlIHBhdGggb2YgdGhlIGZvbGRlciB3aG9zZSBjaGFuZ2VzIGFyZSBjb21taXR0ZWQuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgd29ya2luZ0RpcmVjdG9yeTogc3RyaW5nO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgbG9ja0ZpbGVQYXRoOiBzdHJpbmc7XG4gIHByaXZhdGUgcmVhZG9ubHkgbG9ja1dhaXRUaW1lb3V0SW5NaWxsaXNlY29uZHM6IG51bWJlcjtcbiAgcHJpdmF0ZSBvd25Mb2NrOiBCdWxrT3BlcmF0aW9uTG9jayB8IG51bGwgPSBudWxsO1xuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLiBVc2Uge0BsaW5rIEJ1bGtPcGVyYXRpb25HaXRSZXBvLm9wZW59IHRvIGZpbmQgdGhlIHJlcG8gb2YgYSBmb2xkZXIuXG4gICAqXG4gICAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgY29uc3RydWN0b3IgcGFyYW1ldGVycy5cbiAgICovXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihwYXJhbXM6IEJ1bGtPcGVyYXRpb25HaXRSZXBvQ29uc3RydWN0b3JQYXJhbXMpIHtcbiAgICB0aGlzLmdpdERpcmVjdG9yeSA9IHBhcmFtcy5naXREaXJlY3Rvcnk7XG4gICAgdGhpcy53b3JraW5nRGlyZWN0b3J5ID0gcGFyYW1zLndvcmtpbmdEaXJlY3Rvcnk7XG4gICAgdGhpcy5sb2NrV2FpdFRpbWVvdXRJbk1pbGxpc2Vjb25kcyA9IHBhcmFtcy5sb2NrV2FpdFRpbWVvdXRJbk1pbGxpc2Vjb25kcyA/PyBERUZBVUxUX0xPQ0tfV0FJVF9USU1FT1VUX0lOX01JTExJU0VDT05EUztcbiAgICB0aGlzLmxvY2tGaWxlUGF0aCA9IGpvaW4odGhpcy5naXREaXJlY3RvcnksIEJVTEtfT1BFUkFUSU9OX0xPQ0tfRklMRV9OQU1FKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaW5kcyB0aGUgZ2l0IHJlcG8gYSBmb2xkZXIgYmVsb25ncyB0by5cbiAgICpcbiAgICogQHBhcmFtIHdvcmtpbmdEaXJlY3RvcnkgLSBUaGUgZm9sZGVyLCBub3JtYWxseSB0aGUgdmF1bHQgcm9vdC5cbiAgICogQHJldHVybnMgVGhlIHJlcG8sIG9yIGBudWxsYCB3aGVuIHRoZSBmb2xkZXIgaXMgbm90IGluc2lkZSBhIGdpdCB3b3JrIHRyZWUgb3IgYGdpdGAgY2Fubm90IGJlIHJ1bi5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgYXN5bmMgb3Blbih3b3JraW5nRGlyZWN0b3J5OiBzdHJpbmcpOiBQcm9taXNlPEJ1bGtPcGVyYXRpb25HaXRSZXBvIHwgbnVsbD4ge1xuICAgIGxldCByZXN1bHQ6IEdpdENvbW1hbmRSZXN1bHQ7XG4gICAgdHJ5IHtcbiAgICAgIHJlc3VsdCA9IGF3YWl0IGV4ZWNHaXQoeyBjd2Q6IHdvcmtpbmdEaXJlY3RvcnksIGdpdEFyZ3VtZW50czogWydyZXYtcGFyc2UnLCAnLS1pcy1pbnNpZGUtd29yay10cmVlJywgJy0tYWJzb2x1dGUtZ2l0LWRpciddIH0pO1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGNvbnN0IFtpc0luc2lkZVdvcmtUcmVlLCBnaXREaXJlY3RvcnldID0gcmVzdWx0LnN0ZG91dC5zcGxpdCgvXFxyP1xcbi8sIFJFVl9QQVJTRV9PVVRQVVRfTElORV9DT1VOVCk7XG4gICAgcmV0dXJuIHJlc3VsdC5leGl0Q29kZSA9PT0gMCAmJiBpc0luc2lkZVdvcmtUcmVlID09PSAndHJ1ZScgJiYgZ2l0RGlyZWN0b3J5ID8gbmV3IEJ1bGtPcGVyYXRpb25HaXRSZXBvKHsgZ2l0RGlyZWN0b3J5LCB3b3JraW5nRGlyZWN0b3J5IH0pIDogbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWZ1c2VzIHRvIGdvIG9uIHdoZW4gdGhlIHJlcG8gcm91dGVzIGZpbGVzIHRocm91Z2ggZ2l0LWFubmV4IGJ1dCBgZ2l0LWFubmV4YCBjYW5ub3QgYmUgcnVuLCBzaW5jZSBhXG4gICAqIHBsYWluIGBnaXQgYWRkYCB3b3VsZCB0aGVuIHB1dCB0aGUgbGFyZ2UgZmlsZXMgaW50byBnaXQgaXRzZWxmLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIGFzc2VydENhbkNvbW1pdExhcmdlRmlsZXMoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgYW5uZXhGaWx0ZXJzID0gYXdhaXQgdGhpcy5ydW5HaXQoeyBhbGxvd2VkRXhpdENvZGVzOiBbMCwgMV0sIGdpdEFyZ3VtZW50czogWydjb25maWcnLCAnLS1nZXQtcmVnZXhwJywgU3RyaW5nLnJhd2BeZmlsdGVyXFwuYW5uZXhcXC5gXSB9KTtcbiAgICBpZiAoIWFubmV4RmlsdGVycy5zdGRvdXQudHJpbSgpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGFubmV4VmVyc2lvbiA9IGF3YWl0IHRoaXMucnVuR2l0KHsgZ2l0QXJndW1lbnRzOiBbJ2FubmV4JywgJ3ZlcnNpb24nLCAnLS1yYXcnXSB9KS5jYXRjaCgoKSA9PiBudWxsKTtcbiAgICBpZiAoYW5uZXhWZXJzaW9uID09PSBudWxsKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICdUaGUgdmF1bHQgcmVwb3NpdG9yeSByb3V0ZXMgZmlsZXMgdGhyb3VnaCBnaXQtYW5uZXgsIGJ1dCBnaXQtYW5uZXggaXMgbm90IG9uIFBBVEguIEJ1bGsgb3BlcmF0aW9uIGNvbW1pdHMgYXJlIHJlZnVzZWQsIGJlY2F1c2UgdGhleSB3b3VsZCBhZGQgbGFyZ2UgZmlsZXMgdG8gZ2l0IGl0c2VsZi4nXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBMaXN0cyB0aGUgYnVsay1vcGVyYXRpb24gY29tbWl0cyBhIHBsdWdpbiBtYWRlIG9uIHRoZSBjdXJyZW50IGJyYW5jaCwgbmV3ZXN0IGZpcnN0LlxuICAgKlxuICAgKiBAcGFyYW0gcGx1Z2luSWQgLSBUaGUgcGx1Z2luIGlkLlxuICAgKiBAcmV0dXJucyBUaGUgY29tbWl0cy5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBsaXN0QnVsa09wZXJhdGlvbkNvbW1pdHMocGx1Z2luSWQ6IHN0cmluZyk6IFByb21pc2U8QnVsa09wZXJhdGlvbkNvbW1pdFtdPiB7XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5ydW5HaXQoe1xuICAgICAgYWxsb3dlZEV4aXRDb2RlczogWzAsIEdJVF9GQVRBTF9FWElUX0NPREVdLFxuICAgICAgZ2l0QXJndW1lbnRzOiBbXG4gICAgICAgICdsb2cnLFxuICAgICAgICBgLS1mb3JtYXQ9JUgke1VOSVRfU0VQQVJBVE9SfSVhSSR7VU5JVF9TRVBBUkFUT1J9JXNgLFxuICAgICAgICAnLS1leHRlbmRlZC1yZWdleHAnLFxuICAgICAgICBgLS1ncmVwPV4ke1BMVUdJTl9UUkFJTEVSX0tFWX06ICR7ZXNjYXBlUmVnRXhwKHBsdWdpbklkKX0kYFxuICAgICAgXVxuICAgIH0pO1xuICAgIGlmIChyZXN1bHQuZXhpdENvZGUgIT09IDApIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG4gICAgY29uc3QgY29tbWl0czogQnVsa09wZXJhdGlvbkNvbW1pdFtdID0gW107XG4gICAgZm9yIChjb25zdCBsaW5lIG9mIHJlc3VsdC5zdGRvdXQuc3BsaXQoL1xccj9cXG4vKSkge1xuICAgICAgY29uc3QgW3NoYSA9ICcnLCBkYXRlID0gJycsIC4uLnN1YmplY3RQYXJ0c10gPSBsaW5lLnNwbGl0KFVOSVRfU0VQQVJBVE9SKTtcbiAgICAgIGNvbnN0IGNvbW1pdCA9IHBhcnNlQnVsa09wZXJhdGlvbkNvbW1pdCh7IGRhdGUsIHNoYSwgc3ViamVjdDogc3ViamVjdFBhcnRzLmpvaW4oVU5JVF9TRVBBUkFUT1IpIH0pO1xuICAgICAgaWYgKGNvbW1pdCkge1xuICAgICAgICBjb21taXRzLnB1c2goY29tbWl0KTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGNvbW1pdHM7XG4gIH1cblxuICAvKipcbiAgICogQ29tbWl0cyB3aGF0ZXZlciBhIHN0YWxlIGxvY2sncyBvcGVyYXRpb24gbGVmdCBiZWhpbmQgYXMgYE9QPG4+IGludGVycnVwdGVkYCBhbmQgcmVtb3ZlcyB0aGUgbG9jay5cbiAgICpcbiAgICogQHJldHVybnMgVGhlIGlkIG9mIHRoZSByZWNvdmVyZWQgb3BlcmF0aW9uLCBvciBgbnVsbGAgd2hlbiB0aGVyZSB3YXMgbm8gc3RhbGUgbG9jay5cbiAgICovXG4gIHB1YmxpYyBhc3luYyByZWNvdmVyU3RhbGVMb2NrKCk6IFByb21pc2U8bnVsbCB8IHN0cmluZz4ge1xuICAgIGNvbnN0IGxvY2sgPSBhd2FpdCB0aGlzLnJlYWRMb2NrKCk7XG4gICAgcmV0dXJuIGxvY2sgJiYgdGhpcy5pc1N0YWxlKGxvY2spID8gKGF3YWl0IHRoaXMucmVjb3Zlcihsb2NrKSkgOiBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldmVydHMgYSBidWxrLW9wZXJhdGlvbiBjb21taXQgd2l0aCBgZ2l0IHJldmVydCAtLW5vLWVkaXRgLlxuICAgKlxuICAgKiBXaGF0ZXZlciBpcyBwZW5kaW5nIGlzIGNvbW1pdHRlZCBmaXJzdCwgc28gdGhlIHJldmVydCBzdGFydHMgZnJvbSBhIGNsZWFuIHRyZWUuIEEgY29uZmxpY3QgaXMgTk9UIGFib3J0ZWQ6IHRoZVxuICAgKiByZXBvIGlzIGxlZnQgbWlkLXJldmVydCBmb3IgdGhlIHVzZXIgdG8gcmVzb2x2ZS5cbiAgICpcbiAgICogQHBhcmFtIGNvbW1pdCAtIFRoZSBjb21taXQgdG8gcmV2ZXJ0LlxuICAgKiBAcmV0dXJucyBXaGV0aGVyIHRoZSByZXZlcnQgc3RvcHBlZCBvbiBhIGNvbmZsaWN0LCBhbmQgd2hhdCBnaXQgcHJpbnRlZC5cbiAgICovXG4gIHB1YmxpYyBhc3luYyByZXZlcnRCdWxrT3BlcmF0aW9uQ29tbWl0KGNvbW1pdDogQnVsa09wZXJhdGlvbkNvbW1pdCk6IFByb21pc2U8R2l0UmV2ZXJ0UmVzdWx0PiB7XG4gICAgYXdhaXQgdGhpcy5hc3NlcnRDYW5Db21taXRMYXJnZUZpbGVzKCk7XG4gICAgYXdhaXQgdGhpcy5hY3F1aXJlTG9jaygpO1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCB0aGlzLmNvbW1pdFBlbmRpbmcoeyBib2R5OiAnJywgc3ViamVjdDogYGNob3JlOiBiZWZvcmUgcmV2ZXJ0IG9mICR7Y29tbWl0Lm9wZXJhdGlvbklkfWAgfSk7XG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLnJ1bkdpdCh7IGFsbG93ZWRFeGl0Q29kZXM6IFswLCAxXSwgZ2l0QXJndW1lbnRzOiBbJ3JldmVydCcsICctLW5vLWVkaXQnLCBjb21taXQuc2hhXSB9KTtcbiAgICAgIHJldHVybiB7IGlzQ29uZmxpY3Q6IHJlc3VsdC5leGl0Q29kZSAhPT0gMCwgb3V0cHV0OiBgJHtyZXN1bHQuc3Rkb3V0fSR7cmVzdWx0LnN0ZGVycn1gLnRyaW0oKSB9O1xuICAgIH0gZmluYWxseSB7XG4gICAgICBhd2FpdCB0aGlzLnJlbGVhc2VMb2NrKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgYSBidWxrIG9wZXJhdGlvbiBiZXR3ZWVuIHR3byBjb21taXRzLlxuICAgKlxuICAgKiBUYWtlcyB0aGUgbGVhc2UgbG9jaywgY29tbWl0cyB3aGF0ZXZlciBpcyBwZW5kaW5nIGFzIGBjaG9yZTogYmVmb3JlIE9QPG4+YCwgcnVucyB0aGUgb3BlcmF0aW9uLCB3YWl0cyBmb3IgaXRzXG4gICAqIGZvbGxvdy11cHMgdG8gc2V0dGxlLCBjb21taXRzIHRoZSByZXN1bHQgYXMgYE9QPG4+OiA8c3VtbWFyeT5gIGFuZCByZWxlYXNlcyB0aGUgbG9jay4gQW4gb3BlcmF0aW9uIHRoYXQgdGhyb3dzXG4gICAqIHN0aWxsIGdldHMgaXRzIHBhcnRpYWwgY2hhbmdlcyBjb21taXR0ZWQsIGFzIGBPUDxuPiBpbnRlcnJ1cHRlZGAsIGJlZm9yZSB0aGUgZXJyb3IgaXMgcmV0aHJvd24uXG4gICAqXG4gICAqIFdoZW4gdGhlIGxvY2sgd2FzIHJlY292ZXJlZCB1bmRlciB0aGUgb3BlcmF0aW9uIChpdCB3ZW50IHN0YWxlLCBhbmQgYW5vdGhlciBvcGVyYXRpb24sIHRoZSBzY2hlZHVsZWQgYXV0b2NvbW1pdCBvclxuICAgKiBhIHJlbG9hZCBjb21taXR0ZWQgYE9QPG4+IGludGVycnVwdGVkYCBhbmQgcmVtb3ZlZCBpdCksIHRoZSByZXN0IGlzIG5ldmVyIGNvbW1pdHRlZCB1bmRlciB0aGUgcmVjb3ZlcmVkIGlkOiB0aGVcbiAgICogbG9jayBpcyB0YWtlbiBhZ2FpbiBhbmQgdGhlIHJlc3QgaXMgY29tbWl0dGVkIGFzIGEgZnJlc2ggYE9QPG0+YCB3aG9zZSBzdW1tYXJ5IG5hbWVzIGBPUDxuPmAuXG4gICAqXG4gICAqIEB0eXBlUGFyYW0gVCAtIFRoZSB0eXBlIG9mIHRoZSBvcGVyYXRpb24ncyByZXN1bHQuXG4gICAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgcGFyYW1ldGVycy5cbiAgICogQHJldHVybnMgVGhlIG9wZXJhdGlvbidzIHJlc3VsdCwgaXRzIGlkLCB0aGUgaGFzaCBvZiBpdHMgY29tbWl0IGFuZCB0aGUgaWQgaXQgbG9zdCB0byBhIHJlY292ZXJ5LCBpZiBhbnkuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgcnVuQnVsa09wZXJhdGlvbjxUPihwYXJhbXM6IEJ1bGtPcGVyYXRpb25HaXRSZXBvUnVuQnVsa09wZXJhdGlvblBhcmFtczxUPik6IFByb21pc2U8R2l0QnVsa09wZXJhdGlvblJlc3VsdDxUPj4ge1xuICAgIGF3YWl0IHRoaXMuYXNzZXJ0Q2FuQ29tbWl0TGFyZ2VGaWxlcygpO1xuICAgIGF3YWl0IHRoaXMuYWNxdWlyZUxvY2soKTtcbiAgICBsZXQgdW5yZWdpc3RlclByb2dyZXNzTGlzdGVuZXI6ICgoKSA9PiB2b2lkKSB8IG51bGwgPSBudWxsO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBzdGFydE9wZXJhdGlvbklkID0gYXdhaXQgdGhpcy5hbGxvY2F0ZU9wZXJhdGlvbklkKHBhcmFtcy5wbHVnaW5JZCk7XG4gICAgICBhd2FpdCB0aGlzLmNvbW1pdFBlbmRpbmcoeyBib2R5OiAnJywgc3ViamVjdDogYnVpbGRCZWZvcmVPcGVyYXRpb25Db21taXRTdWJqZWN0KHN0YXJ0T3BlcmF0aW9uSWQpIH0pO1xuXG4gICAgICB1bnJlZ2lzdGVyUHJvZ3Jlc3NMaXN0ZW5lciA9IHJlZ2lzdGVyQnVsa09wZXJhdGlvblByb2dyZXNzTGlzdGVuZXIodGhpcy5jcmVhdGVUaHJvdHRsZWRIZWFydGJlYXQoKSk7XG5cbiAgICAgIGxldCByZXN1bHQ6IFQ7XG4gICAgICB0cnkge1xuICAgICAgICByZXN1bHQgPSBhd2FpdCBwYXJhbXMub3BlcmF0aW9uKCk7XG4gICAgICAgIGF3YWl0IHBhcmFtcy5zZXR0bGUoKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNvbnN0IG9wZXJhdGlvbklkID0gYXdhaXQgdGhpcy5yZWNsYWltTG9ja0lmUmVjb3ZlcmVkKHN0YXJ0T3BlcmF0aW9uSWQsIHBhcmFtcy5wbHVnaW5JZCkgPz8gc3RhcnRPcGVyYXRpb25JZDtcbiAgICAgICAgYXdhaXQgdGhpcy5jb21taXRPcGVyYXRpb24oeyBpc0ludGVycnVwdGVkOiB0cnVlLCBvcGVyYXRpb25JZCwgcGx1Z2luSWQ6IHBhcmFtcy5wbHVnaW5JZCB9KTtcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHJlc3VtZWRPcGVyYXRpb25JZCA9IGF3YWl0IHRoaXMucmVjbGFpbUxvY2tJZlJlY292ZXJlZChzdGFydE9wZXJhdGlvbklkLCBwYXJhbXMucGx1Z2luSWQpO1xuICAgICAgY29uc3Qgb3BlcmF0aW9uSWQgPSByZXN1bWVkT3BlcmF0aW9uSWQgPz8gc3RhcnRPcGVyYXRpb25JZDtcbiAgICAgIGNvbnN0IHN1bW1hcnkgPSByZXN1bWVkT3BlcmF0aW9uSWQgPT09IG51bGwgPyBwYXJhbXMuc3VtbWFyeSA6IGAke3BhcmFtcy5zdW1tYXJ5fSAocmVzdW1lZCBhZnRlciAke3N0YXJ0T3BlcmF0aW9uSWR9IHdhcyByZWNvdmVyZWQpYDtcbiAgICAgIGNvbnN0IGNvbW1pdFNoYSA9IGF3YWl0IHRoaXMuY29tbWl0T3BlcmF0aW9uKHsgb3BlcmF0aW9uSWQsIHBsdWdpbklkOiBwYXJhbXMucGx1Z2luSWQsIHN1bW1hcnkgfSk7XG4gICAgICByZXR1cm4geyBjb21taXRTaGEsIG9wZXJhdGlvbklkLCByZWNvdmVyZWRPcGVyYXRpb25JZDogcmVzdW1lZE9wZXJhdGlvbklkID09PSBudWxsID8gbnVsbCA6IHN0YXJ0T3BlcmF0aW9uSWQsIHJlc3VsdCB9O1xuICAgIH0gZmluYWxseSB7XG4gICAgICB1bnJlZ2lzdGVyUHJvZ3Jlc3NMaXN0ZW5lcj8uKCk7XG4gICAgICBhd2FpdCB0aGlzLnJlbGVhc2VMb2NrKCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBhY3F1aXJlTG9jaygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBkZWFkbGluZSA9IERhdGUubm93KCkgKyB0aGlzLmxvY2tXYWl0VGltZW91dEluTWlsbGlzZWNvbmRzO1xuICAgIGZvciAoOzspIHtcbiAgICAgIGlmIChhd2FpdCB0aGlzLnRyeUNyZWF0ZUxvY2soKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGxvY2sgPSBhd2FpdCB0aGlzLnJlYWRMb2NrKCk7XG4gICAgICBpZiAoIWxvY2spIHtcbiAgICAgICAgLy8gUmVsZWFzZWQgYmV0d2VlbiB0aGUgdHdvIGNhbGxzOiB0cnkgdG8gdGFrZSBpdCBhZ2FpbiBhdCBvbmNlLlxuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMuaXNTdGFsZShsb2NrKSkge1xuICAgICAgICBhd2FpdCB0aGlzLnJlY292ZXIobG9jayk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAoRGF0ZS5ub3coKSA+PSBkZWFkbGluZSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYFRpbWVkIG91dCB3YWl0aW5nIGZvciAke2xvY2sub3BlcmF0aW9uSWQgfHwgJ2FuIG9wZXJhdGlvbid9IG9mICR7bG9jay5wbHVnaW5JZH0gb24gJHtsb2NrLmhvc3R9IHRvIHJlbGVhc2UgdGhlIGJ1bGsgb3BlcmF0aW9uIGxvY2sgJHt0aGlzLmxvY2tGaWxlUGF0aH0uYFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICBhd2FpdCBzZXRUaW1lb3V0QXN5bmMoTE9DS19QT0xMX0lOVEVSVkFMX0lOX01JTExJU0VDT05EUyk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBhbGxvY2F0ZU9wZXJhdGlvbklkKHBsdWdpbklkOiBzdHJpbmcsIHVzZWRPcGVyYXRpb25JZD86IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgY29uc3Qgb3BlcmF0aW9uSWQgPSBhd2FpdCB0aGlzLmZpbmROZXh0T3BlcmF0aW9uSWQodXNlZE9wZXJhdGlvbklkKTtcbiAgICBjb25zdCBvd25Mb2NrID0gZW5zdXJlTm9uTnVsbGFibGUodGhpcy5vd25Mb2NrKTtcbiAgICB0aGlzLm93bkxvY2sgPSB7IC4uLm93bkxvY2ssIGhlYXJ0YmVhdEF0OiBEYXRlLm5vdygpLCBvcGVyYXRpb25JZCwgcGx1Z2luSWQgfTtcbiAgICBhd2FpdCB0aGlzLndyaXRlTG9jayh0aGlzLm93bkxvY2spO1xuICAgIHJldHVybiBvcGVyYXRpb25JZDtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgY29tbWl0T3BlcmF0aW9uKHBhcmFtczogQnVsa09wZXJhdGlvbkdpdFJlcG9Db21taXRPcGVyYXRpb25QYXJhbXMpOiBQcm9taXNlPG51bGwgfCBzdHJpbmc+IHtcbiAgICBjb25zdCBjaGFuZ2VkRmlsZUNvdW50ID0gYXdhaXQgdGhpcy5zdGFnZUFsbCgpO1xuICAgIGlmIChjaGFuZ2VkRmlsZUNvdW50ID09PSAwKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgY29uc3QgbWVzc2FnZSA9IGJ1aWxkT3BlcmF0aW9uQ29tbWl0TWVzc2FnZSh7IC4uLnBhcmFtcywgY2hhbmdlZEZpbGVDb3VudCwgdGltZXN0YW1wOiBuZXcgRGF0ZSgpIH0pO1xuICAgIGF3YWl0IHRoaXMuY29tbWl0U3RhZ2VkKG1lc3NhZ2UpO1xuICAgIGNvbnN0IGhlYWRSZXN1bHQgPSBhd2FpdCB0aGlzLnJ1bkdpdCh7IGdpdEFyZ3VtZW50czogWydyZXYtcGFyc2UnLCAnSEVBRCddIH0pO1xuICAgIHJldHVybiBoZWFkUmVzdWx0LnN0ZG91dC50cmltKCk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGNvbW1pdFBlbmRpbmcobWVzc2FnZTogQ29tbWl0TWVzc2FnZSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmIChhd2FpdCB0aGlzLnN0YWdlQWxsKCkgPT09IDApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgYXdhaXQgdGhpcy5jb21taXRTdGFnZWQobWVzc2FnZSk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGNvbW1pdFN0YWdlZChtZXNzYWdlOiBDb21taXRNZXNzYWdlKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgZ2l0QXJndW1lbnRzID0gWydjb21taXQnLCAnLS1xdWlldCcsICctbScsIG1lc3NhZ2Uuc3ViamVjdF07XG4gICAgaWYgKG1lc3NhZ2UuYm9keSkge1xuICAgICAgZ2l0QXJndW1lbnRzLnB1c2goJy1tJywgbWVzc2FnZS5ib2R5KTtcbiAgICB9XG4gICAgZ2l0QXJndW1lbnRzLnB1c2goJy0tJywgJy4nKTtcbiAgICBhd2FpdCB0aGlzLnJ1bkdpdCh7IGdpdEFyZ3VtZW50cyB9KTtcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlVGhyb3R0bGVkSGVhcnRiZWF0KCk6ICgpID0+IHZvaWQge1xuICAgIGxldCBsYXN0SGVhcnRiZWF0QXQgPSBEYXRlLm5vdygpO1xuICAgIGxldCBwZW5kaW5nSGVhcnRiZWF0OiBQcm9taXNlPHZvaWQ+ID0gbm9vcEFzeW5jKCk7XG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgIGNvbnN0IG5vdyA9IERhdGUubm93KCk7XG4gICAgICBpZiAobm93IC0gbGFzdEhlYXJ0YmVhdEF0IDwgSEVBUlRCRUFUX1RIUk9UVExFX0lOX01JTExJU0VDT05EUykge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBsYXN0SGVhcnRiZWF0QXQgPSBub3c7XG4gICAgICBwZW5kaW5nSGVhcnRiZWF0ID0gcGVuZGluZ0hlYXJ0YmVhdC50aGVuKCgpID0+IHRoaXMuaGVhcnRiZWF0KCkpLmNhdGNoKChlcnJvcjogdW5rbm93bikgPT4ge1xuICAgICAgICBjb25zb2xlLmVycm9yKCdGYWlsZWQgdG8gcmVmcmVzaCB0aGUgYnVsayBvcGVyYXRpb24gbG9jayBoZWFydGJlYXQnLCBlcnJvcik7XG4gICAgICB9KTtcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBmaW5kTmV4dE9wZXJhdGlvbklkKHVzZWRPcGVyYXRpb25JZCA9ICcnKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICAvLyBgLS1hbGxgIGFsc28gcmVhZHMgYSByZXBvc2l0b3J5IHdpdGggbm8gY29tbWl0IHlldCwgd2hlcmUgYSBwbGFpbiBgZ2l0IGxvZ2AgZmFpbHMuXG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5ydW5HaXQoe1xuICAgICAgZ2l0QXJndW1lbnRzOiBbJ2xvZycsICctLWFsbCcsICctLWZvcm1hdD0lcycsICctLWV4dGVuZGVkLXJlZ2V4cCcsICctLWdyZXA9XihjaG9yZTogYmVmb3JlICk/T1BbMC05XSsnXVxuICAgIH0pO1xuICAgIC8vIEEgcmVjb3ZlcmVkIG9wZXJhdGlvbiB0aGF0IGNoYW5nZWQgbm90aGluZyB5ZXQgbGVmdCBubyBjb21taXQgbmFtaW5nIGl0cyBpZCwgc28gaXQgaXMgcGFzc2VkIGluIGV4cGxpY2l0bHkuXG4gICAgcmV0dXJuIGdldE5leHRPcGVyYXRpb25JZChbLi4ucmVzdWx0LnN0ZG91dC5zcGxpdCgvXFxyP1xcbi8pLCB1c2VkT3BlcmF0aW9uSWRdKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgaGVhcnRiZWF0KCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGxvY2sgPSBhd2FpdCB0aGlzLnJlYWRMb2NrKCk7XG4gICAgaWYgKCFsb2NrIHx8ICF0aGlzLmlzT3duTG9jayhsb2NrKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBhd2FpdCB0aGlzLndyaXRlTG9jayh7IC4uLmxvY2ssIGhlYXJ0YmVhdEF0OiBEYXRlLm5vdygpIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBpc093bkxvY2sobG9jazogQnVsa09wZXJhdGlvbkxvY2spOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5vd25Mb2NrICE9PSBudWxsXG4gICAgICAmJiBsb2NrLmhvc3QgPT09IHRoaXMub3duTG9jay5ob3N0XG4gICAgICAmJiBsb2NrLnByb2Nlc3NJZCA9PT0gdGhpcy5vd25Mb2NrLnByb2Nlc3NJZFxuICAgICAgJiYgbG9jay5zdGFydGVkQXQgPT09IHRoaXMub3duTG9jay5zdGFydGVkQXQ7XG4gIH1cblxuICBwcml2YXRlIGlzU3RhbGUobG9jazogQnVsa09wZXJhdGlvbkxvY2spOiBib29sZWFuIHtcbiAgICByZXR1cm4gaXNCdWxrT3BlcmF0aW9uTG9ja1N0YWxlKGxvY2ssIHtcbiAgICAgIGJvb3RlZEF0OiBEYXRlLm5vdygpIC0gdXB0aW1lKCkgKiBNSUxMSVNFQ09ORFNfSU5fU0VDT05ELFxuICAgICAgaG9zdDogaG9zdG5hbWUoKSxcbiAgICAgIGlzUHJvY2Vzc0FsaXZlLFxuICAgICAgbm93OiBEYXRlLm5vdygpXG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHJlYWRMb2NrKCk6IFByb21pc2U8QnVsa09wZXJhdGlvbkxvY2sgfCBudWxsPiB7XG4gICAgbGV0IHRleHQ6IHN0cmluZztcbiAgICB0cnkge1xuICAgICAgdGV4dCA9IGF3YWl0IHJlYWRGaWxlKHRoaXMubG9ja0ZpbGVQYXRoLCAndXRmLTgnKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgaWYgKGlzRXJyb3JXaXRoQ29kZShlcnJvciwgJ0VOT0VOVCcpKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHZhbHVlOiB1bmtub3duID0gSlNPTi5wYXJzZSh0ZXh0KTtcbiAgICAgIGlmIChpc0J1bGtPcGVyYXRpb25Mb2NrKHZhbHVlKSkge1xuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICB9XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBVcGRhdGVzIGFyZSBhdG9taWMsIGJ1dCBhIGxvY2sgYmVpbmcgY3JlYXRlZCBjYW4gYmUgcmVhZCBiZWZvcmUgaXRzIGNvbnRlbnQgaXMgd3JpdHRlbi4gVGhlIGZpbGUncyBhZ2VcbiAgICAgIC8vIHN0YW5kcyBpbiBmb3IgdGhlIGhlYXJ0YmVhdCwgc28gc3VjaCBhIGxvY2sgcmVhZHMgYXMgZnJlc2ggYW5kIGEgY29ycnVwdCBvbmUgZ29lcyBzdGFsZSBsaWtlIGFueSBvdGhlci5cbiAgICB9XG4gICAgY29uc3QgZmlsZVN0YXRzID0gYXdhaXQgc3RhdCh0aGlzLmxvY2tGaWxlUGF0aCk7XG4gICAgcmV0dXJuIHtcbiAgICAgIGhlYXJ0YmVhdEF0OiBmaWxlU3RhdHMubXRpbWVNcyxcbiAgICAgIGhvc3Q6ICcnLFxuICAgICAgb3BlcmF0aW9uSWQ6ICcnLFxuICAgICAgcGx1Z2luSWQ6ICcnLFxuICAgICAgcHJvY2Vzc0lkOiAwLFxuICAgICAgcHJvY2Vzc1N0YXJ0ZWRBdDogMCxcbiAgICAgIHN0YXJ0ZWRBdDogMFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogUmVmcmVzaGVzIHRoZSBvcGVyYXRpb24ncyBsb2NrIGJlZm9yZSBpdHMgY29tbWl0LCBvciB0YWtlcyB0aGUgbG9jayBhZ2FpbiB3aGVuIGl0IHdhcyByZWNvdmVyZWQgdW5kZXIgdGhlXG4gICAqIG9wZXJhdGlvbi5cbiAgICpcbiAgICogQHBhcmFtIG9wZXJhdGlvbklkIC0gVGhlIGlkIHRoZSBvcGVyYXRpb24gc3RhcnRlZCB1bmRlci5cbiAgICogQHBhcmFtIHBsdWdpbklkIC0gVGhlIGlkIG9mIHRoZSBwbHVnaW4gcnVubmluZyB0aGUgb3BlcmF0aW9uLlxuICAgKiBAcmV0dXJucyBgbnVsbGAgd2hlbiB0aGUgbG9jayBpcyBzdGlsbCB0aGUgb3BlcmF0aW9uJ3Mgb3duLCBvdGhlcndpc2UgdGhlIGZyZXNoIGlkIHRoZSByZXN0IGlzIGNvbW1pdHRlZCB1bmRlci5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgcmVjbGFpbUxvY2tJZlJlY292ZXJlZChvcGVyYXRpb25JZDogc3RyaW5nLCBwbHVnaW5JZDogc3RyaW5nKTogUHJvbWlzZTxudWxsIHwgc3RyaW5nPiB7XG4gICAgY29uc3QgbG9jayA9IGF3YWl0IHRoaXMucmVhZExvY2soKTtcbiAgICBpZiAobG9jayAhPT0gbnVsbCAmJiB0aGlzLmlzT3duTG9jayhsb2NrKSkge1xuICAgICAgYXdhaXQgdGhpcy53cml0ZUxvY2soeyAuLi5sb2NrLCBoZWFydGJlYXRBdDogRGF0ZS5ub3coKSB9KTtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBjb25zb2xlLndhcm4oYFRoZSBidWxrIG9wZXJhdGlvbiBsb2NrIG9mICR7b3BlcmF0aW9uSWR9IHdhcyByZWNvdmVyZWQgd2hpbGUgaXQgcmFuOyBjb21taXR0aW5nIHRoZSByZXN0IHVuZGVyIGEgZnJlc2ggb3BlcmF0aW9uIGlkLmApO1xuICAgIHRoaXMub3duTG9jayA9IG51bGw7XG4gICAgYXdhaXQgdGhpcy5hY3F1aXJlTG9jaygpO1xuICAgIHJldHVybiBhd2FpdCB0aGlzLmFsbG9jYXRlT3BlcmF0aW9uSWQocGx1Z2luSWQsIG9wZXJhdGlvbklkKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgcmVjb3Zlcihsb2NrOiBCdWxrT3BlcmF0aW9uTG9jayk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgY29uc3Qgb3BlcmF0aW9uSWQgPSBsb2NrLm9wZXJhdGlvbklkIHx8IGF3YWl0IHRoaXMuZmluZE5leHRPcGVyYXRpb25JZCgpO1xuICAgIGF3YWl0IHRoaXMuY29tbWl0T3BlcmF0aW9uKHsgaXNJbnRlcnJ1cHRlZDogdHJ1ZSwgb3BlcmF0aW9uSWQsIHBsdWdpbklkOiBsb2NrLnBsdWdpbklkIHx8ICd1bmtub3duJyB9KTtcbiAgICBhd2FpdCB1bmxpbmsodGhpcy5sb2NrRmlsZVBhdGgpLmNhdGNoKChlcnJvcjogdW5rbm93bikgPT4ge1xuICAgICAgaWYgKCFpc0Vycm9yV2l0aENvZGUoZXJyb3IsICdFTk9FTlQnKSkge1xuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gb3BlcmF0aW9uSWQ7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHJlbGVhc2VMb2NrKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGxvY2sgPSBhd2FpdCB0aGlzLnJlYWRMb2NrKCk7XG4gICAgY29uc3QgaXNPd25Mb2NrID0gbG9jayAhPT0gbnVsbCAmJiB0aGlzLmlzT3duTG9jayhsb2NrKTtcbiAgICB0aGlzLm93bkxvY2sgPSBudWxsO1xuICAgIGlmICghaXNPd25Mb2NrKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGF3YWl0IHVubGluayh0aGlzLmxvY2tGaWxlUGF0aCkuY2F0Y2goKGVycm9yOiB1bmtub3duKSA9PiB7XG4gICAgICBpZiAoIWlzRXJyb3JXaXRoQ29kZShlcnJvciwgJ0VOT0VOVCcpKSB7XG4gICAgICAgIHRocm93IGVycm9yO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBydW5HaXQocGFyYW1zOiBCdWxrT3BlcmF0aW9uR2l0UmVwb1J1bkdpdFBhcmFtcyk6IFByb21pc2U8R2l0Q29tbWFuZFJlc3VsdD4ge1xuICAgIGNvbnN0IGFsbG93ZWRFeGl0Q29kZXMgPSBwYXJhbXMuYWxsb3dlZEV4aXRDb2RlcyA/PyBbMF07XG4gICAgZm9yIChsZXQgYXR0ZW1wdCA9IDE7OyBhdHRlbXB0KyspIHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGV4ZWNHaXQoeyBjd2Q6IHRoaXMud29ya2luZ0RpcmVjdG9yeSwgZ2l0QXJndW1lbnRzOiBwYXJhbXMuZ2l0QXJndW1lbnRzIH0pO1xuICAgICAgaWYgKGFsbG93ZWRFeGl0Q29kZXMuaW5jbHVkZXMocmVzdWx0LmV4aXRDb2RlKSkge1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfVxuICAgICAgaWYgKGF0dGVtcHQgPCBJTkRFWF9MT0NLX1JFVFJZX0NPVU5UICYmIHJlc3VsdC5zdGRlcnIuaW5jbHVkZXMoJ2luZGV4LmxvY2snKSkge1xuICAgICAgICBhd2FpdCBzZXRUaW1lb3V0QXN5bmMoSU5ERVhfTE9DS19SRVRSWV9ERUxBWV9JTl9NSUxMSVNFQ09ORFMpO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIHRocm93IG5ldyBHaXRDb21tYW5kRXJyb3IocGFyYW1zLmdpdEFyZ3VtZW50cywgcmVzdWx0LmV4aXRDb2RlLCByZXN1bHQuc3RkZXJyKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHN0YWdlQWxsKCk6IFByb21pc2U8bnVtYmVyPiB7XG4gICAgYXdhaXQgdGhpcy5ydW5HaXQoeyBnaXRBcmd1bWVudHM6IFsnYWRkJywgJy0tYWxsJywgJy0tJywgJy4nXSB9KTtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLnJ1bkdpdCh7IGdpdEFyZ3VtZW50czogWydkaWZmJywgJy0tY2FjaGVkJywgJy0tbmFtZS1vbmx5JywgJy16JywgJy0tJywgJy4nXSB9KTtcbiAgICByZXR1cm4gcmVzdWx0LnN0ZG91dC5zcGxpdCgnXFwwJykuZmlsdGVyKEJvb2xlYW4pLmxlbmd0aDtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgdHJ5Q3JlYXRlTG9jaygpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBjb25zdCBsb2NrID0gY3JlYXRlTG9ja1JlY29yZCgpO1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCB3cml0ZUZpbGUodGhpcy5sb2NrRmlsZVBhdGgsIEpTT04uc3RyaW5naWZ5KGxvY2spLCB7IGZsYWc6ICd3eCcgfSk7XG4gICAgICB0aGlzLm93bkxvY2sgPSBsb2NrO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGlmIChpc0Vycm9yV2l0aENvZGUoZXJyb3IsICdFRVhJU1QnKSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHdyaXRlTG9jayhsb2NrOiBCdWxrT3BlcmF0aW9uTG9jayk6IFByb21pc2U8dm9pZD4ge1xuICAgIC8vIFdyaXR0ZW4gYmVzaWRlIHRoZSBsb2NrIGFuZCByZW5hbWVkIG92ZXIgaXQsIHNvIGEgcmVhZGVyIG5ldmVyIHNlZXMgYSBoYWxmLXdyaXR0ZW4gaGVhcnRiZWF0LlxuICAgIGNvbnN0IHRlbXBvcmFyeVBhdGggPSBgJHt0aGlzLmxvY2tGaWxlUGF0aH0uJHtTdHJpbmcobG9jay5wcm9jZXNzSWQpfS50bXBgO1xuICAgIGF3YWl0IHdyaXRlRmlsZSh0ZW1wb3JhcnlQYXRoLCBKU09OLnN0cmluZ2lmeShsb2NrKSk7XG4gICAgYXdhaXQgcmVuYW1lKHRlbXBvcmFyeVBhdGgsIHRoaXMubG9ja0ZpbGVQYXRoKTtcbiAgfVxufVxuXG4vKipcbiAqIEFuIGVycm9yIHRocm93biB3aGVuIGEgYGdpdGAgY29tbWFuZCBmYWlscy5cbiAqL1xuZXhwb3J0IGNsYXNzIEdpdENvbW1hbmRFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuXG4gICAqXG4gICAqIEBwYXJhbSBnaXRBcmd1bWVudHMgLSBUaGUgYXJndW1lbnRzIGBnaXRgIHdhcyBydW4gd2l0aC5cbiAgICogQHBhcmFtIGV4aXRDb2RlIC0gVGhlIGV4aXQgY29kZS5cbiAgICogQHBhcmFtIHN0ZGVyciAtIFdoYXQgYGdpdGAgcHJpbnRlZCB0byBzdGRlcnIuXG4gICAqL1xuICBwdWJsaWMgY29uc3RydWN0b3IocHVibGljIHJlYWRvbmx5IGdpdEFyZ3VtZW50czogcmVhZG9ubHkgc3RyaW5nW10sIHB1YmxpYyByZWFkb25seSBleGl0Q29kZTogbnVtYmVyLCBwdWJsaWMgcmVhZG9ubHkgc3RkZXJyOiBzdHJpbmcpIHtcbiAgICBzdXBlcihgZ2l0ICR7Z2l0QXJndW1lbnRzLmpvaW4oJyAnKX0gZmFpbGVkIHdpdGggZXhpdCBjb2RlICR7U3RyaW5nKGV4aXRDb2RlKX06ICR7c3RkZXJyLnRyaW0oKX1gKTtcbiAgICB0aGlzLm5hbWUgPSAnR2l0Q29tbWFuZEVycm9yJztcbiAgfVxufVxuXG5mdW5jdGlvbiBjcmVhdGVMb2NrUmVjb3JkKCk6IEJ1bGtPcGVyYXRpb25Mb2NrIHtcbiAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKTtcbiAgcmV0dXJuIHtcbiAgICBoZWFydGJlYXRBdDogbm93LFxuICAgIGhvc3Q6IGhvc3RuYW1lKCksXG4gICAgb3BlcmF0aW9uSWQ6ICcnLFxuICAgIHBsdWdpbklkOiAnJyxcbiAgICBwcm9jZXNzSWQ6IHByb2Nlc3MucGlkLFxuICAgIHByb2Nlc3NTdGFydGVkQXQ6IGdldFByb2Nlc3NTdGFydGVkQXQoKSxcbiAgICBzdGFydGVkQXQ6IG5vd1xuICB9O1xufVxuXG5hc3luYyBmdW5jdGlvbiBleGVjR2l0KHBhcmFtczogRXhlY0dpdFBhcmFtcyk6IFByb21pc2U8R2l0Q29tbWFuZFJlc3VsdD4ge1xuICByZXR1cm4gYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgIGV4ZWNGaWxlKCdnaXQnLCBbLi4ucGFyYW1zLmdpdEFyZ3VtZW50c10sIHsgY3dkOiBwYXJhbXMuY3dkLCBtYXhCdWZmZXI6IE1BWF9CVUZGRVJfSU5fQllURVMsIHdpbmRvd3NIaWRlOiB0cnVlIH0sIChlcnJvciwgc3Rkb3V0LCBzdGRlcnIpID0+IHtcbiAgICAgIGlmIChlcnJvciAmJiB0eXBlb2YgZXJyb3IuY29kZSAhPT0gJ251bWJlcicpIHtcbiAgICAgICAgcmVqZWN0KG5ldyBFcnJvcihgRmFpbGVkIHRvIHJ1biBnaXQgJHtwYXJhbXMuZ2l0QXJndW1lbnRzLmpvaW4oJyAnKX1gLCB7IGNhdXNlOiBlcnJvciB9KSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHJlc29sdmUoeyBleGl0Q29kZTogdHlwZW9mIGVycm9yPy5jb2RlID09PSAnbnVtYmVyJyA/IGVycm9yLmNvZGUgOiAwLCBzdGRlcnIsIHN0ZG91dCB9KTtcbiAgICB9KTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGdldFByb2Nlc3NTdGFydGVkQXQoKTogbnVtYmVyIHtcbiAgcmV0dXJuIE1hdGgucm91bmQocGVyZm9ybWFuY2UudGltZU9yaWdpbik7XG59XG5cbmZ1bmN0aW9uIGlzRXJyb3JXaXRoQ29kZShlcnJvcjogdW5rbm93biwgY29kZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiB0eXBlb2YgZXJyb3IgPT09ICdvYmplY3QnICYmIGVycm9yICE9PSBudWxsICYmICdjb2RlJyBpbiBlcnJvciAmJiBlcnJvci5jb2RlID09PSBjb2RlO1xufVxuXG5mdW5jdGlvbiBpc1Byb2Nlc3NBbGl2ZShwcm9jZXNzSWQ6IG51bWJlcik6IGJvb2xlYW4gfCBudWxsIHtcbiAgaWYgKHByb2Nlc3NJZCA8PSAwKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHRyeSB7XG4gICAgcHJvY2Vzcy5raWxsKHByb2Nlc3NJZCwgMCk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgcmV0dXJuICFpc0Vycm9yV2l0aENvZGUoZXJyb3IsICdFU1JDSCcpICYmIChpc0Vycm9yV2l0aENvZGUoZXJyb3IsICdFUEVSTScpIHx8IG51bGwpO1xuICB9XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBZ0JBLFNBQVMsdUJBQXVCO0FBQ2hDLFNBQVMsaUJBQWlCO0FBQzFCLFNBQVMsb0JBQW9CO0FBQzdCLFNBQVMseUJBQXlCO0FBQ2xDLFNBQVMsZ0JBQWdCO0FBQ3pCO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBQ1A7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLE9BQ0s7QUFDUCxTQUFTLFlBQVk7QUFPckIsU0FBUyw2Q0FBNkM7QUFDdEQ7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLE9BQ0s7QUE4R1AsTUFBTSw0Q0FBNEM7QUFDbEQsTUFBTSxxQ0FBcUM7QUFDM0MsTUFBTSx5QkFBeUI7QUFDL0IsTUFBTSx5Q0FBeUM7QUFDL0MsTUFBTSxxQ0FBcUM7QUFDM0MsTUFBTSxzQkFBc0I7QUFDNUIsTUFBTSx5QkFBeUI7QUFDL0IsTUFBTSxzQkFBc0I7QUFDNUIsTUFBTSw4QkFBOEI7QUFDcEMsTUFBTSxpQkFBaUI7QUFzQmhCLE1BQU0scUJBQXFCO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFJaEI7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUtBO0FBQUEsRUFFQztBQUFBLEVBQ0E7QUFBQSxFQUNULFVBQW9DO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBT3JDLFlBQVksUUFBK0M7QUFD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
|