@mnaoumov/obsidian-lib 10.7.0 → 10.9.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/data-stores/data-store-locations/package.json +6 -0
- package/dist/lib/cjs/__merged.cjs +18 -1
- package/dist/lib/cjs/__merged.d.cts +4 -1
- package/dist/lib/cjs/code-block-render-handoff.cjs +2 -5
- 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/style-sheet-component.cjs +1 -4
- package/dist/lib/cjs/data-stores/data-store-locations.cjs +248 -0
- package/dist/lib/cjs/data-stores/data-store-locations.d.cts +60 -0
- package/dist/lib/cjs/data-stores/data-store-seeds.cjs +2 -2
- package/dist/lib/cjs/data-stores/data-store-seeds.d.cts +1 -1
- package/dist/lib/cjs/data-stores/data-store-transport.cjs +126 -21
- package/dist/lib/cjs/data-stores/data-store-transport.d.cts +38 -4
- package/dist/lib/cjs/data-stores/index.cjs +4 -1
- package/dist/lib/cjs/data-stores/index.d.cts +1 -0
- package/dist/lib/cjs/data-stores/shared-data-store.cjs +145 -22
- package/dist/lib/cjs/data-stores/shared-data-store.d.cts +53 -1
- 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 +1 -1
- 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/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 +4 -1
- package/dist/lib/esm/__merged.mjs +20 -2
- package/dist/lib/esm/code-block-render-handoff.mjs +2 -5
- 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/style-sheet-component.mjs +1 -4
- package/dist/lib/esm/data-stores/data-store-locations.d.mts +60 -0
- package/dist/lib/esm/data-stores/data-store-locations.mjs +160 -0
- package/dist/lib/esm/data-stores/data-store-seeds.d.mts +1 -1
- package/dist/lib/esm/data-stores/data-store-seeds.mjs +2 -2
- package/dist/lib/esm/data-stores/data-store-transport.d.mts +38 -4
- package/dist/lib/esm/data-stores/data-store-transport.mjs +126 -21
- package/dist/lib/esm/data-stores/index.d.mts +1 -0
- package/dist/lib/esm/data-stores/index.mjs +3 -1
- package/dist/lib/esm/data-stores/shared-data-store.d.mts +53 -1
- package/dist/lib/esm/data-stores/shared-data-store.mjs +145 -22
- 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 +1 -1
- 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/vault.mjs +2 -2
- package/dist/lib/esm/virtual-file.d.mts +48 -0
- package/dist/lib/esm/virtual-file.mjs +264 -0
- package/package.json +5 -5
|
@@ -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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
|
|
@@ -94,16 +94,16 @@ function resolveFolderNoteConfig(params) {
|
|
|
94
94
|
const {
|
|
95
95
|
app,
|
|
96
96
|
extensions,
|
|
97
|
-
isHidden,
|
|
97
|
+
isHidden = false,
|
|
98
98
|
location,
|
|
99
99
|
resolveName
|
|
100
100
|
} = params;
|
|
101
|
-
return location
|
|
101
|
+
return location === void 0 || location === "Auto" /* Auto */ ? readFolderNotesPluginConfig(app) ?? FALLBACK_FOLDER_NOTE_CONFIG : {
|
|
102
102
|
extensions: normalizeExtensions(extensions ?? [MARKDOWN_FILE_EXTENSION]),
|
|
103
|
-
isHidden
|
|
103
|
+
isHidden,
|
|
104
104
|
location,
|
|
105
105
|
resolveName: resolveName ?? FALLBACK_FOLDER_NOTE_CONFIG.resolveName
|
|
106
|
-
}
|
|
106
|
+
};
|
|
107
107
|
}
|
|
108
108
|
function normalizeExtensions(extensions) {
|
|
109
109
|
const normalizedExtensions = extensions.map((extension) => extension.trim().toLowerCase().replace(/^\./, "")).map((extension) => extension === EXCALIDRAW_FILE_EXTENSION ? MARKDOWN_FILE_EXTENSION : extension).filter(Boolean);
|
|
@@ -168,4 +168,4 @@ export {
|
|
|
168
168
|
resolveFolderNote,
|
|
169
169
|
resolveFolderNoteConfig
|
|
170
170
|
};
|
|
171
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9mb2xkZXItbm90ZS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBmaWxlXG4gKlxuICogVGhlIGZvbGRlci1ub3RlIGNvbmNlcHQ6IHdoaWNoIG5vdGUsIGlmIGFueSwgaXMgdGhlIG9uZSB3aG9zZSBwcm9wZXJ0aWVzIGRlc2NyaWJlIGEgRk9MREVSIGl0c2VsZi5cbiAqXG4gKiBPYnNpZGlhbiBoYXMgbm8gc3VjaCBjb25jZXB0IOKAlCBpdCBpcyBhIGNvbnZlbnRpb24gdGhlIGNvbW11bml0eSBzZXR0bGVkIG9uLCBhbmQgdGhlIHBsdWdpbiB0aGF0IG93bnMgaXRcbiAqIGZvciBtb3N0IHZhdWx0cyBpcyBbYGZvbGRlci1ub3Rlc2BdKGh0dHBzOi8vY29tbXVuaXR5Lm9ic2lkaWFuLm1kL3BsdWdpbnMvZm9sZGVyLW5vdGVzKS4gU28gdGhlIGFuc3dlciB0b1xuICogXCJ3aGljaCBub3RlIGJlbG9uZ3MgdG8gdGhpcyBmb2xkZXJcIiBpcyB0aGF0IHBsdWdpbidzIHRvIGdpdmUgd2hlbmV2ZXIgaXQgaXMgaW5zdGFsbGVkLCBhbmQgdGhpcyBtb2R1bGVcbiAqIGFza3MgaXQgcmF0aGVyIHRoYW4gaW52ZW50aW5nIGEgc2Vjb25kIGFuc3dlcjoge0BsaW5rIEZvbGRlck5vdGVMb2NhdGlvbi5BdXRvfSDigJQgdGhlIGRlZmF1bHQg4oCUIHJlYWRzIGl0c1xuICogbGl2ZSBjb25maWd1cmF0aW9uIGF0IGV2ZXJ5IHVzZS5cbiAqXG4gKiBSZWFkaW5nIGl0IGxpdmUgcmF0aGVyIHRoYW4gY29weWluZyBpdHMgdmFsdWVzIGludG8gYSBjb25zdW1lcidzIG93biBzZXR0aW5ncyBpcyBkZWxpYmVyYXRlOiBhIGNvcHkgZ29lc1xuICogc3RhbGUgdGhlIG1vbWVudCB0aGF0IHBsdWdpbiBpcyByZWNvbmZpZ3VyZWQsIGFuZCBpdCB3b3VsZCBuZWVkIGEgc2V0dGluZ3MgbWlncmF0aW9uIHRvIHNlZWQuIEV2ZXJ5dGhpbmdcbiAqIGVsc2UgaXMgdGhlIGNhbGxlcidzIGV4cGxpY2l0IGNob2ljZSwgYW5kIHRoZW4gdGhlIG90aGVyIHBsdWdpbiBpcyBub3QgY29uc3VsdGVkIGF0IGFsbC5cbiAqXG4gKiBOb3RoaW5nIGhlcmUgZXZlciBDUkVBVEVTIGEgbm90ZS4gQSBmb2xkZXIgd2l0aCBubyBmb2xkZXIgbm90ZSBhbnN3ZXJzIGBudWxsYCwgd2hpY2ggaXMgd2hhdCBsZXRzIGFcbiAqIGNhbGxlciBsYXllciBmb2xkZXItbm90ZSBiZWhhdmlvciBvbnRvIGEgY2xpY2sgd2l0aG91dCByaXNraW5nIGEgZmlsZSBhcHBlYXJpbmcgb24gdGhlIHVzZXIncyBkaXNrLlxuICovXG5cbmltcG9ydCB0eXBlIHtcbiAgQXBwLFxuICBURmlsZSxcbiAgVEZvbGRlclxufSBmcm9tICdvYnNpZGlhbic7XG5cbmltcG9ydCB7IGpvaW4gfSBmcm9tICdAbW5hb3Vtb3YvdHlwZXNjcmlwdC1saWIvcGF0aCc7XG5pbXBvcnQgeyByZXBsYWNlQWxsIH0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL3N0cmluZyc7XG5pbXBvcnQgeyBub3JtYWxpemVQYXRoIH0gZnJvbSAnb2JzaWRpYW4nO1xuXG5pbXBvcnQge1xuICBpc0ZvbGRlcixcbiAgTUFSS0RPV05fRklMRV9FWFRFTlNJT05cbn0gZnJvbSAnLi9maWxlLXN5c3RlbS50cyc7XG5cbi8qKlxuICogV2hlcmUgYSBmb2xkZXIncyBmb2xkZXIgbm90ZSBsaXZlcy5cbiAqXG4gKiBUaGUgdGhyZWUgY29uY3JldGUgbWVtYmVycyBhcmUgdGhlIHNoYXBlcyB0aGUgZm9sZGVyLW5vdGUgZWNvc3lzdGVtIGFjdHVhbGx5IHVzZXM6XG4gKiBgY2hhcmxpZS9jaGFybGllLm1kYCBhbmQgYGNoYXJsaWUvaW5kZXgubWRgIGFyZSBib3RoIHtAbGluayBGb2xkZXJOb3RlTG9jYXRpb24uSW5zaWRlRm9sZGVyfSAodGhleVxuICogZGlmZmVyIG9ubHkgaW4gdGhlIE5BTUUsIHdoaWNoIGlzIHdoeSBuYW1pbmcgaXMgYSBjYWxsYmFjayBhbmQgbm90IGEgZm91cnRoIG1lbWJlciksIHdoaWxlXG4gKiBgY2hhcmxpZS5tZGAgYmVzaWRlIHRoZSBmb2xkZXIgaXMge0BsaW5rIEZvbGRlck5vdGVMb2NhdGlvbi5QYXJlbnRGb2xkZXJ9IOKAlCB3aG9zZSB3aG9sZSBwb2ludCBpcyB0aGF0XG4gKiBgW1thbHBoYS9icmF2by9jaGFybGllXV1gIGxpbmtzIHRvIGEgZm9sZGVyIHdpdGggbm8gc3BlY2lhbCBzeW50YXguXG4gKi9cbmV4cG9ydCBlbnVtIEZvbGRlck5vdGVMb2NhdGlvbiB7XG4gIC8qKlxuICAgKiBUYWtlIHRoZSBhbnN3ZXIgZnJvbSB0aGUgaW5zdGFsbGVkIGBmb2xkZXItbm90ZXNgIHBsdWdpbiwgZmFsbGluZyBiYWNrIHRvIGEgbm90ZSBuYW1lZCBhZnRlciBpdHNcbiAgICogZm9sZGVyLCBpbnNpZGUgaXQuIFRoZSBkZWZhdWx0LCBhbmQgcmVzb2x2ZWQgTElWRSByYXRoZXIgdGhhbiBjb3BpZWQuXG4gICAqL1xuICBBdXRvID0gJ0F1dG8nLFxuXG4gIC8qKlxuICAgKiBgYWxwaGEvYnJhdm8vY2hhcmxpZS88bmFtZT4ubWRgLlxuICAgKi9cbiAgSW5zaWRlRm9sZGVyID0gJ0luc2lkZUZvbGRlcicsXG5cbiAgLyoqXG4gICAqIFRoZSB2YXVsdCBoYXMgbm8gZm9sZGVyIG5vdGVzIGF0IGFsbCwgc28gZXZlcnkgZm9sZGVyIGFuc3dlcnMgYG51bGxgLiBUaGlzIGlzIGFsc28gaG93IGEgY2FsbGVyIG9wdHNcbiAgICogb3V0IG9mIGZvbGRlci1ub3RlIGJlaGF2aW9yIGVudGlyZWx5LlxuICAgKi9cbiAgTm9uZSA9ICdOb25lJyxcblxuICAvKipcbiAgICogYGFscGhhL2JyYXZvLzxuYW1lPi5tZGAsIGJlc2lkZSB0aGUgZm9sZGVyLlxuICAgKi9cbiAgUGFyZW50Rm9sZGVyID0gJ1BhcmVudEZvbGRlcidcbn1cblxuLyoqXG4gKiBBIGZvbGRlci1ub3RlIHNldHVwIHdpdGgge0BsaW5rIEZvbGRlck5vdGVMb2NhdGlvbi5BdXRvfSBhbHJlYWR5IHJlc29sdmVkIHRvIGEgY29uY3JldGUgYW5zd2VyLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEZvbGRlck5vdGVDb25maWcge1xuICAvKipcbiAgICogVGhlIGV4dGVuc2lvbnMgYSBmb2xkZXIgbm90ZSBtYXkgY2FycnksIFdJVEhPVVQgdGhlIGxlYWRpbmcgZG90LCBpbiByZXNvbHV0aW9uIG9yZGVyIOKAlCB0aGUgZmlyc3Qgb25lXG4gICAqIHRoYXQgbmFtZXMgYW4gZXhpc3RpbmcgZmlsZSB3aW5zLlxuICAgKi9cbiAgcmVhZG9ubHkgZXh0ZW5zaW9uczogcmVhZG9ubHkgc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIGZvbGRlciBub3RlIGlzIGhpZGRlbiBpbiB0aGUgZmlsZSBleHBsb3Jlci5cbiAgICpcbiAgICogUmVhZCByYXRoZXIgdGhhbiBhY3RlZCB1cG9uIGhlcmU6IGl0IGNoYW5nZXMgbm90aGluZyBhYm91dCBXSElDSCBmaWxlIGlzIHRoZSBmb2xkZXIgbm90ZSwgYnV0IGEgY2FsbGVyXG4gICAqIHRoYXQgcmV2ZWFscyB0aGUgbm90ZSBoYXMgdG8ga25vdyB0aGVyZSBpcyBub3RoaW5nIHRvIHJldmVhbCBhbmQgZmFsbCBiYWNrIHRvIHJldmVhbGluZyB0aGUgZm9sZGVyLlxuICAgKi9cbiAgcmVhZG9ubHkgaXNIaWRkZW46IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXJlIHRoZSBub3RlIHNpdHMgcmVsYXRpdmUgdG8gaXRzIGZvbGRlci5cbiAgICovXG4gIHJlYWRvbmx5IGxvY2F0aW9uOiBGb2xkZXJOb3RlTG9jYXRpb24uSW5zaWRlRm9sZGVyIHwgRm9sZGVyTm90ZUxvY2F0aW9uLk5vbmUgfCBGb2xkZXJOb3RlTG9jYXRpb24uUGFyZW50Rm9sZGVyO1xuXG4gIC8qKlxuICAgKiBOYW1lcyB0aGUgZm9sZGVyIG5vdGUgb2YgYSBmb2xkZXIsIFdJVEhPVVQgaXRzIGV4dGVuc2lvbi5cbiAgICpcbiAgICogQHBhcmFtIGZvbGRlciAtIFRoZSBmb2xkZXIgd2hvc2Ugbm90ZSBpcyBiZWluZyBuYW1lZC5cbiAgICogQHJldHVybnMgVGhlIG5vdGUncyBuYW1lOyBhbiBlbXB0eSAob3IgYmxhbmspIG5hbWUgbWVhbnMgdGhlIGZvbGRlciBoYXMgbm8gZm9sZGVyIG5vdGUuXG4gICAqL1xuICAvLyBBIGZ1bmN0aW9uIHByb3BlcnR5IHJhdGhlciB0aGFuIGEgbWV0aG9kLCBiZWNhdXNlIGl0IGlzIGEgc3RhbmRhbG9uZSBjYWxsYmFjaywgbmV2ZXIgYSBtZXRob2Qgb2YgdGhlXG4gIC8vIGNvbmZpZyDigJQgd2hpY2ggaXMgYWxzbyB3aGF0IGxldHMgaXQgYmUgZGVzdHJ1Y3R1cmVkIGFuZCBoYW5kZWQgb24gd2l0aG91dCB0cmlwcGluZyBgdW5ib3VuZC1tZXRob2RgLlxuICByZWFkb25seSByZXNvbHZlTmFtZTogKGZvbGRlcjogVEZvbGRlcikgPT4gc3RyaW5nO1xufVxuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayBnZXRGb2xkZXJOb3RlRm9sZGVyfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBHZXRGb2xkZXJOb3RlRm9sZGVyUGFyYW1zIHtcbiAgLyoqXG4gICAqIFRoZSBPYnNpZGlhbiBhcHAgaW5zdGFuY2UuXG4gICAqL1xuICByZWFkb25seSBhcHA6IEFwcDtcblxuICAvKipcbiAgICogVGhlIGFscmVhZHktcmVzb2x2ZWQgc2V0dXAgdG8gdXNlLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgcmVzb2x2ZUZvbGRlck5vdGVDb25maWcoeyBhcHAgfSlgXG4gICAqL1xuICByZWFkb25seSBjb25maWc/OiBGb2xkZXJOb3RlQ29uZmlnO1xuXG4gIC8qKlxuICAgKiBUaGUgZmlsZSB0aGF0IG1heSBiZSBhIGZvbGRlciBub3RlLlxuICAgKi9cbiAgcmVhZG9ubHkgZmlsZTogVEZpbGU7XG59XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIHJlc29sdmVGb2xkZXJOb3RlQ29uZmlnfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZXNvbHZlRm9sZGVyTm90ZUNvbmZpZ1BhcmFtcyB7XG4gIC8qKlxuICAgKiBUaGUgT2JzaWRpYW4gYXBwIGluc3RhbmNlLlxuICAgKi9cbiAgcmVhZG9ubHkgYXBwOiBBcHA7XG5cbiAgLyoqXG4gICAqIFRoZSBleHRlbnNpb25zIGEgZm9sZGVyIG5vdGUgbWF5IGNhcnJ5LCB3aXRoIG9yIHdpdGhvdXQgdGhlIGxlYWRpbmcgZG90LCBpbiByZXNvbHV0aW9uIG9yZGVyLiBJZ25vcmVkXG4gICAqIHVuZGVyIHtAbGluayBGb2xkZXJOb3RlTG9jYXRpb24uQXV0b30sIHdoaWNoIHRha2VzIHRoZSBpbnN0YWxsZWQgcGx1Z2luJ3MgYW5zd2VyIHdob2xlLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgWydtZCddYFxuICAgKi9cbiAgcmVhZG9ubHkgZXh0ZW5zaW9ucz86IHJlYWRvbmx5IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSBmb2xkZXIgbm90ZSBpcyBoaWRkZW4gaW4gdGhlIGZpbGUgZXhwbG9yZXIuIElnbm9yZWQgdW5kZXIge0BsaW5rIEZvbGRlck5vdGVMb2NhdGlvbi5BdXRvfS5cbiAgICpcbiAgICogQGRlZmF1bHQgYGZhbHNlYFxuICAgKi9cbiAgcmVhZG9ubHkgaXNIaWRkZW4/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGVyZSB0aGUgbm90ZSBzaXRzIHJlbGF0aXZlIHRvIGl0cyBmb2xkZXIuXG4gICAqXG4gICAqIEBkZWZhdWx0IHtAbGluayBGb2xkZXJOb3RlTG9jYXRpb24uQXV0b31cbiAgICovXG4gIHJlYWRvbmx5IGxvY2F0aW9uPzogRm9sZGVyTm90ZUxvY2F0aW9uO1xuXG4gIC8qKlxuICAgKiBOYW1lcyB0aGUgZm9sZGVyIG5vdGUgb2YgYSBmb2xkZXIsIFdJVEhPVVQgaXRzIGV4dGVuc2lvbi4gSWdub3JlZCB1bmRlclxuICAgKiB7QGxpbmsgRm9sZGVyTm90ZUxvY2F0aW9uLkF1dG99LCB3aGljaCBuYW1lcyB0aGUgbm90ZSB0aGUgd2F5IHRoZSBpbnN0YWxsZWQgcGx1Z2luIGRvZXMuXG4gICAqXG4gICAqIEEgY2FsbGJhY2sgcmF0aGVyIHRoYW4gYSBuYW1lIHRlbXBsYXRlLCBiZWNhdXNlIGEgdGVtcGxhdGUgbmVlZHMgYSB0b2tlbiB2b2NhYnVsYXJ5IGFuZCB0aGlzIGxpYnJhcnlcbiAgICogaGFzIG5vbmUgdG8gaW1wb3NlIOKAlCBhIGNhbGxlciB0aGF0IGhhcyBvbmUgKGB7e2ZvbGRlck5hbWV9fWAsIGB7e2ZvbGRlclBhdGh9fWAsIOKApikgcmVuZGVycyBpdCBoZXJlLlxuICAgKlxuICAgKiBAcGFyYW0gZm9sZGVyIC0gVGhlIGZvbGRlciB3aG9zZSBub3RlIGlzIGJlaW5nIG5hbWVkLlxuICAgKiBAcmV0dXJucyBUaGUgbm90ZSdzIG5hbWUuXG4gICAqIEBkZWZhdWx0IGAoZm9sZGVyKSA9PiBmb2xkZXIubmFtZWBcbiAgICovXG4gIC8vIFNlZSB7QGxpbmsgRm9sZGVyTm90ZUNvbmZpZy5yZXNvbHZlTmFtZX0gZm9yIHdoeSB0aGlzIGlzIGEgZnVuY3Rpb24gcHJvcGVydHkuXG4gIHJlYWRvbmx5IHJlc29sdmVOYW1lPzogKGZvbGRlcjogVEZvbGRlcikgPT4gc3RyaW5nO1xufVxuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayByZXNvbHZlRm9sZGVyTm90ZX0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmVzb2x2ZUZvbGRlck5vdGVQYXJhbXMge1xuICAvKipcbiAgICogVGhlIE9ic2lkaWFuIGFwcCBpbnN0YW5jZS5cbiAgICovXG4gIHJlYWRvbmx5IGFwcDogQXBwO1xuXG4gIC8qKlxuICAgKiBUaGUgYWxyZWFkeS1yZXNvbHZlZCBzZXR1cCB0byB1c2UuXG4gICAqXG4gICAqIE9taXR0ZWQgbWVhbnMge0BsaW5rIEZvbGRlck5vdGVMb2NhdGlvbi5BdXRvfSDigJQgdGhlIHNldHVwIGlzIHJlc29sdmVkIG9uIHRoZSBzcG90LCB3aGljaCBpcyB3aGF0IG1ha2VzXG4gICAqIGByZXNvbHZlRm9sZGVyTm90ZSh7IGFwcCwgZm9sZGVyIH0pYCB0aGUgb25lLWxpbmVyIGV2ZXJ5IGNhbGxlciB3YW50cy4gUGFzcyBvbmUgd2hlbiB0aGUgc2FtZSBzZXR1cCBpc1xuICAgKiB1c2VkIG1vcmUgdGhhbiBvbmNlLCBvciB3aGVuIGl0cyB7QGxpbmsgRm9sZGVyTm90ZUNvbmZpZy5pc0hpZGRlbn0gaXMgbmVlZGVkIGFsb25nc2lkZSB0aGUgbm90ZS5cbiAgICpcbiAgICogQGRlZmF1bHQgYHJlc29sdmVGb2xkZXJOb3RlQ29uZmlnKHsgYXBwIH0pYFxuICAgKi9cbiAgcmVhZG9ubHkgY29uZmlnPzogRm9sZGVyTm90ZUNvbmZpZztcblxuICAvKipcbiAgICogVGhlIGZvbGRlciB3aG9zZSBmb2xkZXIgbm90ZSBpcyB3YW50ZWQuIFJlYWQgQUZURVIgYW55IHJlbmFtZTogdGhlIG5vdGUgaXMgbmFtZWQgZnJvbSB0aGUgZm9sZGVyJ3NcbiAgICogQ1VSUkVOVCBuYW1lLCBhbmQgYSBgZm9sZGVyLW5vdGVzYCBpbnN0YWxsIHdpdGggYHN5bmNGb2xkZXJOYW1lYCBvbiB3aWxsIGhhdmUgcmVuYW1lZCBpdCBhbHJlYWR5LlxuICAgKi9cbiAgcmVhZG9ubHkgZm9sZGVyOiBURm9sZGVyO1xufVxuXG4vKipcbiAqIFRoZSBgZm9sZGVyLW5vdGVzYCBwbHVnaW4ncyBpZCwgYXMgaXRzIG1hbmlmZXN0IGRlY2xhcmVzIGl0LlxuICovXG5leHBvcnQgY29uc3QgRk9MREVSX05PVEVTX1BMVUdJTl9JRCA9ICdmb2xkZXItbm90ZXMnO1xuXG4vKipcbiAqIFRoZSBvbmUgdG9rZW4gYGZvbGRlci1ub3Rlc2AnIG93biBuYW1lIHRlbXBsYXRlIHVuZGVyc3RhbmRzLiBFdmVyeSBvdGhlciBjaGFyYWN0ZXIgaW4gdGhhdCB0ZW1wbGF0ZSBpc1xuICogYSBsaXRlcmFsLCBzbyB0cmFuc2xhdGluZyB0aGlzIHRva2VuIGlzIHRoZSB3aG9sZSBvZiB0aGUgdHJhbnNsYXRpb24uXG4gKi9cbmNvbnN0IEZPTERFUl9OT1RFU19GT0xERVJfTkFNRV9UT0tFTl9SRUdfRVhQID0gL1xce1xce2ZvbGRlcl9uYW1lXFx9XFx9L2dpO1xuXG4vKipcbiAqIGBmb2xkZXItbm90ZXNgIG9mZmVycyBgRXhjYWxpZHJhd2AgZm9sZGVyIG5vdGVzLCB3aGljaCBhcmUgTWFya2Rvd24gZmlsZXMgd2l0aCBhbiBgRXhjYWxpZHJhd2AgcGF5bG9hZCDigJQgaXRzXG4gKiBvd24gcmVzb2x2ZXIgbm9ybWFsaXplcyB0aGUgdHlwZSB0aGUgc2FtZSB3YXkgYmVmb3JlIGxvb2tpbmcgdGhlIGZpbGUgdXAuXG4gKi9cbmNvbnN0IEVYQ0FMSURSQVdfRklMRV9FWFRFTlNJT04gPSAnZXhjYWxpZHJhdyc7XG5cbi8qKlxuICogV2hhdCB7QGxpbmsgRm9sZGVyTm90ZUxvY2F0aW9uLkF1dG99IGZhbGxzIGJhY2sgdG86IHRoZSBsYXlvdXQgZXZlcnkgZm9sZGVyLW5vdGUgcGx1Z2luIHN1cHBvcnRzLCBhbmRcbiAqIHRoZSBvbmUgYGZvbGRlci1ub3Rlc2AgaXRzZWxmIHNoaXBzIGFzIGl0cyBkZWZhdWx0LiBOb3RoaW5nIGhpZGVzIGEgbm90ZSB3aGVuIG5vIHBsdWdpbiBpcyB0aGVyZSB0byBoaWRlXG4gKiBpdCwgc28ge0BsaW5rIEZvbGRlck5vdGVDb25maWcuaXNIaWRkZW59IGlzIGBmYWxzZWAuXG4gKi9cbmNvbnN0IEZBTExCQUNLX0ZPTERFUl9OT1RFX0NPTkZJRzogRm9sZGVyTm90ZUNvbmZpZyA9IHtcbiAgZXh0ZW5zaW9uczogW01BUktET1dOX0ZJTEVfRVhURU5TSU9OXSxcbiAgaXNIaWRkZW46IGZhbHNlLFxuICBsb2NhdGlvbjogRm9sZGVyTm90ZUxvY2F0aW9uLkluc2lkZUZvbGRlcixcbiAgcmVzb2x2ZU5hbWU6IChmb2xkZXI6IFRGb2xkZXIpOiBzdHJpbmcgPT4gZm9sZGVyLm5hbWVcbn07XG5cbi8qKlxuICogRmluZHMgdGhlIGZvbGRlciBhIGZpbGUgaXMgdGhlIGZvbGRlciBub3RlIG9mIOKAlCB0aGUgaW52ZXJzZSBvZiB7QGxpbmsgcmVzb2x2ZUZvbGRlck5vdGV9LlxuICpcbiAqIFRoZSBhbnN3ZXIgaXMgY2hlY2tlZCB0aHJvdWdoIHtAbGluayByZXNvbHZlRm9sZGVyTm90ZX0gaXRzZWxmLCBzbyB0aGUgdHdvIGNhbiBuZXZlciBkaXNhZ3JlZTogYSBmaWxlIGlzXG4gKiBhIGZvbGRlcidzIG5vdGUgZXhhY3RseSB3aGVuIHJlc29sdmluZyB0aGF0IGZvbGRlcidzIG5vdGUgeWllbGRzIHRoaXMgdmVyeSBmaWxlLiBBIGZpbGUgdGhhdCBkb2VzIG5vdFxuICogZXhpc3QgaW4gdGhlIHZhdWx0IChvbmUgYnVpbHQgZm9yIGEgcGF0aCB3aXRoIG5vdGhpbmcgYXQgaXQpIGlzIG5ldmVyIGEgZm9sZGVyIG5vdGUuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBmaWxlLCBhbmQgb3B0aW9uYWxseSB0aGUgc2V0dXAgdG8gcmVzb2x2ZSBpdCB3aXRoLlxuICogQHJldHVybnMgVGhlIGZvbGRlciwgb3IgYG51bGxgIHdoZW4gdGhlIGZpbGUgaXMgbm90IGEgZm9sZGVyIG5vdGUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRGb2xkZXJOb3RlRm9sZGVyKHBhcmFtczogR2V0Rm9sZGVyTm90ZUZvbGRlclBhcmFtcyk6IG51bGwgfCBURm9sZGVyIHtcbiAgY29uc3QgeyBhcHAsIGZpbGUgfSA9IHBhcmFtcztcbiAgY29uc3QgY29uZmlnID0gcGFyYW1zLmNvbmZpZyA/PyByZXNvbHZlRm9sZGVyTm90ZUNvbmZpZyh7IGFwcCB9KTtcbiAgY29uc3QgcGFyZW50ID0gZmlsZS5wYXJlbnQ7XG4gIGlmICghcGFyZW50IHx8IGNvbmZpZy5sb2NhdGlvbiA9PT0gRm9sZGVyTm90ZUxvY2F0aW9uLk5vbmUpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGxldCBjYW5kaWRhdGVGb2xkZXJzOiBURm9sZGVyW107XG4gIGlmIChjb25maWcubG9jYXRpb24gPT09IEZvbGRlck5vdGVMb2NhdGlvbi5JbnNpZGVGb2xkZXIpIHtcbiAgICAvLyBUaGUgdmF1bHQgcm9vdCBoYXMgbm8gZm9sZGVyIG5vdGUgdW5kZXIgdGhpcyBsYXlvdXQsIHNpbmNlIG5vdGhpbmcgbmFtZXMgaXQuXG4gICAgY2FuZGlkYXRlRm9sZGVycyA9IHBhcmVudC5pc1Jvb3QoKSA/IFtdIDogW3BhcmVudF07XG4gIH0gZWxzZSB7XG4gICAgY2FuZGlkYXRlRm9sZGVycyA9IHBhcmVudC5jaGlsZHJlbi5maWx0ZXIoaXNGb2xkZXIpO1xuICB9XG5cbiAgcmV0dXJuIGNhbmRpZGF0ZUZvbGRlcnMuZmluZCgoZm9sZGVyKSA9PiByZXNvbHZlRm9sZGVyTm90ZSh7IGFwcCwgY29uZmlnLCBmb2xkZXIgfSkgPT09IGZpbGUpID8/IG51bGw7XG59XG5cbi8qKlxuICogRmluZHMgYSBmb2xkZXIncyBmb2xkZXIgbm90ZSDigJQgdGhlIG9uZSBub3RlIHdob3NlIHByb3BlcnRpZXMgZGVzY3JpYmUgdGhlIGZvbGRlciBpdHNlbGYuXG4gKlxuICogKipOZXZlciBjcmVhdGVzLioqIEEgZm9sZGVyIHRoYXQgaGFzIG5vIGZvbGRlciBub3RlIGFuc3dlcnMgYG51bGxgLCBhbmQgc28gZG9lcyB0aGUgdmF1bHQgcm9vdCB1bmRlclxuICoge0BsaW5rIEZvbGRlck5vdGVMb2NhdGlvbi5QYXJlbnRGb2xkZXJ9IChub3RoaW5nIGNhbiBzaXQgYmVzaWRlIGl0KS5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIGZvbGRlciwgYW5kIG9wdGlvbmFsbHkgdGhlIHNldHVwIHRvIHJlc29sdmUgaXQgd2l0aC5cbiAqIEByZXR1cm5zIFRoZSBmb2xkZXIgbm90ZSwgb3IgYG51bGxgIHdoZW4gdGhlcmUgaXMgbm9uZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVGb2xkZXJOb3RlKHBhcmFtczogUmVzb2x2ZUZvbGRlck5vdGVQYXJhbXMpOiBudWxsIHwgVEZpbGUge1xuICBjb25zdCB7IGFwcCwgZm9sZGVyIH0gPSBwYXJhbXM7XG4gIGNvbnN0IGNvbmZpZyA9IHBhcmFtcy5jb25maWcgPz8gcmVzb2x2ZUZvbGRlck5vdGVDb25maWcoeyBhcHAgfSk7XG4gIGlmIChjb25maWcubG9jYXRpb24gPT09IEZvbGRlck5vdGVMb2NhdGlvbi5Ob25lKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBjb25zdCBwYXJlbnRGb2xkZXJQYXRoID0gY29uZmlnLmxvY2F0aW9uID09PSBGb2xkZXJOb3RlTG9jYXRpb24uUGFyZW50Rm9sZGVyID8gZm9sZGVyLnBhcmVudD8ucGF0aCA6IGZvbGRlci5wYXRoO1xuICBpZiAocGFyZW50Rm9sZGVyUGF0aCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBjb25zdCBub3RlTmFtZSA9IGNvbmZpZy5yZXNvbHZlTmFtZShmb2xkZXIpLnRyaW0oKTtcbiAgaWYgKCFub3RlTmFtZSkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgZm9yIChjb25zdCBleHRlbnNpb24gb2YgY29uZmlnLmV4dGVuc2lvbnMpIHtcbiAgICBjb25zdCBmaWxlID0gYXBwLnZhdWx0LmdldEZpbGVCeVBhdGgobm9ybWFsaXplUGF0aChqb2luKHBhcmVudEZvbGRlclBhdGgsIGAke25vdGVOYW1lfS4ke2V4dGVuc2lvbn1gKSkpO1xuICAgIGlmIChmaWxlKSB7XG4gICAgICByZXR1cm4gZmlsZTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn1cblxuLyoqXG4gKiBSZXNvbHZlcyB7QGxpbmsgRm9sZGVyTm90ZUxvY2F0aW9uLkF1dG99IGludG8gYSBjb25jcmV0ZSBmb2xkZXItbm90ZSBzZXR1cC5cbiAqXG4gKiBgZm9sZGVyLW5vdGVzYCcgYHZhdWx0Rm9sZGVyYCBzdG9yYWdlIChldmVyeSBmb2xkZXIgbm90ZSBwb29sZWQgaW4gb25lIGNlbnRyYWwgZm9sZGVyKSBoYXMgbm9cbiAqIGNvdW50ZXJwYXJ0IGhlcmUgYW5kIGZhbGxzIGJhY2sgcmF0aGVyIHRoYW4gZ3Vlc3Npbmc6IHdpdGggdGhlIG5vdGVzIHBvb2xlZCwgdGhlIG5vdGUgYmVsb25naW5nIHRvIGFcbiAqIGZvbGRlciBpcyBubyBsb25nZXIgZGVyaXZhYmxlIGZyb20gdGhhdCBmb2xkZXIncyBwYXRoIGFsb25lLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgc2V0dXAsIGFuZCB0aGUgYXBwIHRvIHJlYWQgdGhlIGluc3RhbGxlZCBwbHVnaW4gZnJvbS5cbiAqIEByZXR1cm5zIFRoZSByZXNvbHZlZCBzZXR1cC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVGb2xkZXJOb3RlQ29uZmlnKHBhcmFtczogUmVzb2x2ZUZvbGRlck5vdGVDb25maWdQYXJhbXMpOiBGb2xkZXJOb3RlQ29uZmlnIHtcbiAgY29uc3Qge1xuICAgIGFwcCxcbiAgICBleHRlbnNpb25zLFxuICAgIGlzSGlkZGVuLFxuICAgIGxvY2F0aW9uLFxuICAgIHJlc29sdmVOYW1lXG4gIH0gPSBwYXJhbXM7XG5cbiAgcmV0dXJuIGxvY2F0aW9uICE9PSB1bmRlZmluZWQgJiYgbG9jYXRpb24gIT09IEZvbGRlck5vdGVMb2NhdGlvbi5BdXRvXG4gICAgPyB7XG4gICAgICBleHRlbnNpb25zOiBub3JtYWxpemVFeHRlbnNpb25zKGV4dGVuc2lvbnMgPz8gW01BUktET1dOX0ZJTEVfRVhURU5TSU9OXSksXG4gICAgICBpc0hpZGRlbjogaXNIaWRkZW4gPz8gZmFsc2UsXG4gICAgICBsb2NhdGlvbixcbiAgICAgIHJlc29sdmVOYW1lOiByZXNvbHZlTmFtZSA/PyBGQUxMQkFDS19GT0xERVJfTk9URV9DT05GSUcucmVzb2x2ZU5hbWVcbiAgICB9XG4gICAgOiByZWFkRm9sZGVyTm90ZXNQbHVnaW5Db25maWcoYXBwKSA/PyBGQUxMQkFDS19GT0xERVJfTk9URV9DT05GSUc7XG59XG5cbi8qKlxuICogTm9ybWFsaXplcyBleHRlbnNpb25zIHRoZSB3YXkgYGZvbGRlci1ub3Rlc2AgZG9lcyBiZWZvcmUgaXQgbG9va3MgYSBmaWxlIHVwOiBubyBsZWFkaW5nIGRvdCwgbG93ZXItY2FzZSxcbiAqIGBFeGNhbGlkcmF3YCB0cmVhdGVkIGFzIE1hcmtkb3duLCBibGFua3MgZHJvcHBlZCwgZHVwbGljYXRlcyBjb2xsYXBzZWQgd2hpbGUga2VlcGluZyB0aGUgZmlyc3Qgb2NjdXJyZW5jZSdzXG4gKiBwb3NpdGlvbi5cbiAqXG4gKiBAcGFyYW0gZXh0ZW5zaW9ucyAtIFRoZSBleHRlbnNpb25zIGFzIGNvbmZpZ3VyZWQuXG4gKiBAcmV0dXJucyBUaGUgbm9ybWFsaXplZCBleHRlbnNpb25zLCBpbiByZXNvbHV0aW9uIG9yZGVyLlxuICovXG5mdW5jdGlvbiBub3JtYWxpemVFeHRlbnNpb25zKGV4dGVuc2lvbnM6IHJlYWRvbmx5IHN0cmluZ1tdKTogcmVhZG9ubHkgc3RyaW5nW10ge1xuICBjb25zdCBub3JtYWxpemVkRXh0ZW5zaW9ucyA9IGV4dGVuc2lvbnNcbiAgICAubWFwKChleHRlbnNpb24pID0+IGV4dGVuc2lvbi50cmltKCkudG9Mb3dlckNhc2UoKS5yZXBsYWNlKC9eXFwuLywgJycpKVxuICAgIC5tYXAoKGV4dGVuc2lvbikgPT4gZXh0ZW5zaW9uID09PSBFWENBTElEUkFXX0ZJTEVfRVhURU5TSU9OID8gTUFSS0RPV05fRklMRV9FWFRFTlNJT04gOiBleHRlbnNpb24pXG4gICAgLmZpbHRlcihCb29sZWFuKTtcbiAgcmV0dXJuIFsuLi5uZXcgU2V0KG5vcm1hbGl6ZWRFeHRlbnNpb25zKV07XG59XG5cbi8qKlxuICogUmVhZHMgdGhlIGluc3RhbGxlZCBgZm9sZGVyLW5vdGVzYCBwbHVnaW4ncyBvd24gY29uZmlndXJhdGlvbiwgaWYgaXQgaXMgaW5zdGFsbGVkIGFuZCBjb25maWd1cmVkIHRoZSB3YXlcbiAqIGl0IGRvY3VtZW50cy5cbiAqXG4gKiBFdmVyeSB2YWx1ZSBpcyByZWFkIGFzIGB1bmtub3duYCBhbmQgY2hlY2tlZCwgcmF0aGVyIHRoYW4gYXNzZXJ0ZWQgaW50byBhIHNoYXBlOiB0aGlzIGlzIGFub3RoZXJcbiAqIHBsdWdpbidzIHByaXZhdGUgc2V0dGluZ3Mgb2JqZWN0LCBzbyBhIHZlcnNpb24gdGhhdCByZW5hbWVzIG9yIGRyb3BzIGEga2V5IG11c3QgZGVncmFkZSB0byB0aGUgZmFsbGJhY2tcbiAqIGluc3RlYWQgb2YgdGhyb3dpbmcgaW5zaWRlIGEgY2xpY2sgaGFuZGxlci5cbiAqXG4gKiBAcGFyYW0gYXBwIC0gVGhlIE9ic2lkaWFuIGFwcGxpY2F0aW9uIGluc3RhbmNlLlxuICogQHJldHVybnMgVGhlIGNvbmZpZ3VyYXRpb24sIG9yIGBudWxsYCB3aGVuIHRoZSBwbHVnaW4gaXMgYWJzZW50LCBub3QgY29uZmlndXJlZCwgb3Igc2V0IHRvIGEgc3RvcmFnZVxuICogbG9jYXRpb24gd2l0aCBubyBjb3VudGVycGFydCBoZXJlLlxuICovXG5mdW5jdGlvbiByZWFkRm9sZGVyTm90ZXNQbHVnaW5Db25maWcoYXBwOiBBcHApOiBGb2xkZXJOb3RlQ29uZmlnIHwgbnVsbCB7XG4gIGNvbnN0IGZvbGRlck5vdGVzUGx1Z2luID0gYXBwLnBsdWdpbnMuZ2V0UGx1Z2luKEZPTERFUl9OT1RFU19QTFVHSU5fSUQpO1xuICAvLyBOYXJyb3dlZCB3aXRoIGBpbmAgcmF0aGVyIHRoYW4gYXNzZXJ0ZWQgaW50byBhIHNoYXBlOiB0aGF0IGtlZXBzIGV2ZXJ5IHZhbHVlIGJlbG93IHR5cGVkIGB1bmtub3duYCxcbiAgLy8gd2hpY2ggaXMgZXhhY3RseSB3aGF0IGEgZm9yZWlnbiBwbHVnaW4ncyBwcml2YXRlIHNldHRpbmdzIGFyZS5cbiAgaWYgKCFmb2xkZXJOb3Rlc1BsdWdpbiB8fCAhKCdzZXR0aW5ncycgaW4gZm9sZGVyTm90ZXNQbHVnaW4pKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBjb25zdCBmb2xkZXJOb3Rlc1NldHRpbmdzOiB1bmtub3duID0gZm9sZGVyTm90ZXNQbHVnaW4uc2V0dGluZ3M7XG4gIGlmICh0eXBlb2YgZm9sZGVyTm90ZXNTZXR0aW5ncyAhPT0gJ29iamVjdCcgfHwgZm9sZGVyTm90ZXNTZXR0aW5ncyA9PT0gbnVsbCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgY29uc3QgbG9jYXRpb24gPSB0b0ZvbGRlck5vdGVMb2NhdGlvbignc3RvcmFnZUxvY2F0aW9uJyBpbiBmb2xkZXJOb3Rlc1NldHRpbmdzID8gZm9sZGVyTm90ZXNTZXR0aW5ncy5zdG9yYWdlTG9jYXRpb24gOiBudWxsKTtcbiAgaWYgKCFsb2NhdGlvbikge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgY29uc3QgZm9sZGVyTm90ZU5hbWUgPSAnZm9sZGVyTm90ZU5hbWUnIGluIGZvbGRlck5vdGVzU2V0dGluZ3MgPyBmb2xkZXJOb3Rlc1NldHRpbmdzLmZvbGRlck5vdGVOYW1lIDogbnVsbDtcbiAgaWYgKHR5cGVvZiBmb2xkZXJOb3RlTmFtZSAhPT0gJ3N0cmluZycgfHwgIWZvbGRlck5vdGVOYW1lKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBjb25zdCBmb2xkZXJOb3RlVHlwZSA9ICdmb2xkZXJOb3RlVHlwZScgaW4gZm9sZGVyTm90ZXNTZXR0aW5ncyA/IGZvbGRlck5vdGVzU2V0dGluZ3MuZm9sZGVyTm90ZVR5cGUgOiBudWxsO1xuICBjb25zdCBzdXBwb3J0ZWRGaWxlVHlwZXMgPSAnc3VwcG9ydGVkRmlsZVR5cGVzJyBpbiBmb2xkZXJOb3Rlc1NldHRpbmdzID8gZm9sZGVyTm90ZXNTZXR0aW5ncy5zdXBwb3J0ZWRGaWxlVHlwZXMgOiBudWxsO1xuICBjb25zdCBpc0hpZGRlbiA9ICdoaWRlRm9sZGVyTm90ZScgaW4gZm9sZGVyTm90ZXNTZXR0aW5ncyA/IGZvbGRlck5vdGVzU2V0dGluZ3MuaGlkZUZvbGRlck5vdGUgOiBudWxsO1xuXG4gIHJldHVybiB7XG4gICAgLy8gSXRzIG93biByZXNvbHZlciB0cmllcyB0aGUgcHJpbWFyeSB0eXBlIGZpcnN0IGFuZCBldmVyeSBvdGhlciBzdXBwb3J0ZWQgdHlwZSBhZnRlciBpdCwgd2hpY2ggaXMgdGhlXG4gICAgLy8gb3JkZXIgcmVwcm9kdWNlZCBoZXJlLiBBbiB1bnVzYWJsZSBwYWlyIGxlYXZlcyBNYXJrZG93biwgdGhlIGV4dGVuc2lvbiBpdCBjYW5ub3QgYmUgY29uZmlndXJlZFxuICAgIC8vIHdpdGhvdXQuXG4gICAgZXh0ZW5zaW9uczogbm9ybWFsaXplRXh0ZW5zaW9ucyhbXG4gICAgICB0eXBlb2YgZm9sZGVyTm90ZVR5cGUgPT09ICdzdHJpbmcnID8gZm9sZGVyTm90ZVR5cGUgOiBNQVJLRE9XTl9GSUxFX0VYVEVOU0lPTixcbiAgICAgIC4uLihBcnJheS5pc0FycmF5KHN1cHBvcnRlZEZpbGVUeXBlcykgPyBzdXBwb3J0ZWRGaWxlVHlwZXMuZmlsdGVyKCh0eXBlOiB1bmtub3duKSA9PiB0eXBlb2YgdHlwZSA9PT0gJ3N0cmluZycpIDogW10pLFxuICAgICAgTUFSS0RPV05fRklMRV9FWFRFTlNJT05cbiAgICBdKSxcbiAgICBpc0hpZGRlbjogaXNIaWRkZW4gPT09IHRydWUsXG4gICAgbG9jYXRpb24sXG4gICAgcmVzb2x2ZU5hbWU6IChmb2xkZXI6IFRGb2xkZXIpOiBzdHJpbmcgPT5cbiAgICAgIHJlcGxhY2VBbGwoe1xuICAgICAgICAkc3RyaW5nOiBmb2xkZXJOb3RlTmFtZSxcbiAgICAgICAgLy8gQSBmdW5jdGlvbiByZXBsYWNlciwgc28gYSBmb2xkZXIgbmFtZSBjb250YWluaW5nIGAkJmAgaXMgaW5zZXJ0ZWQgbGl0ZXJhbGx5LlxuICAgICAgICByZXBsYWNlcjogKCkgPT4gZm9sZGVyLm5hbWUsXG4gICAgICAgIHNlYXJjaFZhbHVlOiBGT0xERVJfTk9URVNfRk9MREVSX05BTUVfVE9LRU5fUkVHX0VYUFxuICAgICAgfSlcbiAgfTtcbn1cblxuLyoqXG4gKiBNYXBzIGBmb2xkZXItbm90ZXNgJyBgc3RvcmFnZUxvY2F0aW9uYCBvbnRvIHRoaXMgbGlicmFyeSdzIG93biBsb2NhdGlvbi5cbiAqXG4gKiBAcGFyYW0gc3RvcmFnZUxvY2F0aW9uIC0gVGhlIHZhbHVlIHJlYWQgb3V0IG9mIHRoYXQgcGx1Z2luJ3Mgc2V0dGluZ3MuXG4gKiBAcmV0dXJucyBUaGUgbG9jYXRpb24sIG9yIGBudWxsYCBmb3IgYHZhdWx0Rm9sZGVyYCBhbmQgZm9yIGFueXRoaW5nIHRoYXQgaXMgbm90IG9uZSBvZiBpdHMgdmFsdWVzLlxuICovXG5mdW5jdGlvbiB0b0ZvbGRlck5vdGVMb2NhdGlvbihzdG9yYWdlTG9jYXRpb246IHVua25vd24pOiBGb2xkZXJOb3RlQ29uZmlnWydsb2NhdGlvbiddIHwgbnVsbCB7XG4gIHN3aXRjaCAoc3RvcmFnZUxvY2F0aW9uKSB7XG4gICAgY2FzZSAnaW5zaWRlRm9sZGVyJzoge1xuICAgICAgcmV0dXJuIEZvbGRlck5vdGVMb2NhdGlvbi5JbnNpZGVGb2xkZXI7XG4gICAgfVxuICAgIGNhc2UgJ3BhcmVudEZvbGRlcic6IHtcbiAgICAgIHJldHVybiBGb2xkZXJOb3RlTG9jYXRpb24uUGFyZW50Rm9sZGVyO1xuICAgIH1cbiAgICBkZWZhdWx0OiB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUF5QkEsU0FBUyxZQUFZO0FBQ3JCLFNBQVMsa0JBQWtCO0FBQzNCLFNBQVMscUJBQXFCO0FBRTlCO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBV0EsSUFBSyxxQkFBTCxrQkFBS0Esd0JBQUw7QUFLTCxFQUFBQSxvQkFBQSxVQUFPO0FBS1AsRUFBQUEsb0JBQUEsa0JBQWU7QUFNZixFQUFBQSxvQkFBQSxVQUFPO0FBS1AsRUFBQUEsb0JBQUEsa0JBQWU7QUFyQkwsU0FBQUE7QUFBQSxHQUFBO0FBNEpMLE1BQU0seUJBQXlCO0FBTXRDLE1BQU0seUNBQXlDO0FBTS9DLE1BQU0sNEJBQTRCO0FBT2xDLE1BQU0sOEJBQWdEO0FBQUEsRUFDcEQsWUFBWSxDQUFDLHVCQUF1QjtBQUFBLEVBQ3BDLFVBQVU7QUFBQSxFQUNWLFVBQVU7QUFBQSxFQUNWLGFBQWEsQ0FBQyxXQUE0QixPQUFP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
|
|
171
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9mb2xkZXItbm90ZS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBmaWxlXG4gKlxuICogVGhlIGZvbGRlci1ub3RlIGNvbmNlcHQ6IHdoaWNoIG5vdGUsIGlmIGFueSwgaXMgdGhlIG9uZSB3aG9zZSBwcm9wZXJ0aWVzIGRlc2NyaWJlIGEgRk9MREVSIGl0c2VsZi5cbiAqXG4gKiBPYnNpZGlhbiBoYXMgbm8gc3VjaCBjb25jZXB0IOKAlCBpdCBpcyBhIGNvbnZlbnRpb24gdGhlIGNvbW11bml0eSBzZXR0bGVkIG9uLCBhbmQgdGhlIHBsdWdpbiB0aGF0IG93bnMgaXRcbiAqIGZvciBtb3N0IHZhdWx0cyBpcyBbYGZvbGRlci1ub3Rlc2BdKGh0dHBzOi8vY29tbXVuaXR5Lm9ic2lkaWFuLm1kL3BsdWdpbnMvZm9sZGVyLW5vdGVzKS4gU28gdGhlIGFuc3dlciB0b1xuICogXCJ3aGljaCBub3RlIGJlbG9uZ3MgdG8gdGhpcyBmb2xkZXJcIiBpcyB0aGF0IHBsdWdpbidzIHRvIGdpdmUgd2hlbmV2ZXIgaXQgaXMgaW5zdGFsbGVkLCBhbmQgdGhpcyBtb2R1bGVcbiAqIGFza3MgaXQgcmF0aGVyIHRoYW4gaW52ZW50aW5nIGEgc2Vjb25kIGFuc3dlcjoge0BsaW5rIEZvbGRlck5vdGVMb2NhdGlvbi5BdXRvfSDigJQgdGhlIGRlZmF1bHQg4oCUIHJlYWRzIGl0c1xuICogbGl2ZSBjb25maWd1cmF0aW9uIGF0IGV2ZXJ5IHVzZS5cbiAqXG4gKiBSZWFkaW5nIGl0IGxpdmUgcmF0aGVyIHRoYW4gY29weWluZyBpdHMgdmFsdWVzIGludG8gYSBjb25zdW1lcidzIG93biBzZXR0aW5ncyBpcyBkZWxpYmVyYXRlOiBhIGNvcHkgZ29lc1xuICogc3RhbGUgdGhlIG1vbWVudCB0aGF0IHBsdWdpbiBpcyByZWNvbmZpZ3VyZWQsIGFuZCBpdCB3b3VsZCBuZWVkIGEgc2V0dGluZ3MgbWlncmF0aW9uIHRvIHNlZWQuIEV2ZXJ5dGhpbmdcbiAqIGVsc2UgaXMgdGhlIGNhbGxlcidzIGV4cGxpY2l0IGNob2ljZSwgYW5kIHRoZW4gdGhlIG90aGVyIHBsdWdpbiBpcyBub3QgY29uc3VsdGVkIGF0IGFsbC5cbiAqXG4gKiBOb3RoaW5nIGhlcmUgZXZlciBDUkVBVEVTIGEgbm90ZS4gQSBmb2xkZXIgd2l0aCBubyBmb2xkZXIgbm90ZSBhbnN3ZXJzIGBudWxsYCwgd2hpY2ggaXMgd2hhdCBsZXRzIGFcbiAqIGNhbGxlciBsYXllciBmb2xkZXItbm90ZSBiZWhhdmlvciBvbnRvIGEgY2xpY2sgd2l0aG91dCByaXNraW5nIGEgZmlsZSBhcHBlYXJpbmcgb24gdGhlIHVzZXIncyBkaXNrLlxuICovXG5cbmltcG9ydCB0eXBlIHtcbiAgQXBwLFxuICBURmlsZSxcbiAgVEZvbGRlclxufSBmcm9tICdvYnNpZGlhbic7XG5cbmltcG9ydCB7IGpvaW4gfSBmcm9tICdAbW5hb3Vtb3YvdHlwZXNjcmlwdC1saWIvcGF0aCc7XG5pbXBvcnQgeyByZXBsYWNlQWxsIH0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL3N0cmluZyc7XG5pbXBvcnQgeyBub3JtYWxpemVQYXRoIH0gZnJvbSAnb2JzaWRpYW4nO1xuXG5pbXBvcnQge1xuICBpc0ZvbGRlcixcbiAgTUFSS0RPV05fRklMRV9FWFRFTlNJT05cbn0gZnJvbSAnLi9maWxlLXN5c3RlbS50cyc7XG5cbi8qKlxuICogV2hlcmUgYSBmb2xkZXIncyBmb2xkZXIgbm90ZSBsaXZlcy5cbiAqXG4gKiBUaGUgdGhyZWUgY29uY3JldGUgbWVtYmVycyBhcmUgdGhlIHNoYXBlcyB0aGUgZm9sZGVyLW5vdGUgZWNvc3lzdGVtIGFjdHVhbGx5IHVzZXM6XG4gKiBgY2hhcmxpZS9jaGFybGllLm1kYCBhbmQgYGNoYXJsaWUvaW5kZXgubWRgIGFyZSBib3RoIHtAbGluayBGb2xkZXJOb3RlTG9jYXRpb24uSW5zaWRlRm9sZGVyfSAodGhleVxuICogZGlmZmVyIG9ubHkgaW4gdGhlIE5BTUUsIHdoaWNoIGlzIHdoeSBuYW1pbmcgaXMgYSBjYWxsYmFjayBhbmQgbm90IGEgZm91cnRoIG1lbWJlciksIHdoaWxlXG4gKiBgY2hhcmxpZS5tZGAgYmVzaWRlIHRoZSBmb2xkZXIgaXMge0BsaW5rIEZvbGRlck5vdGVMb2NhdGlvbi5QYXJlbnRGb2xkZXJ9IOKAlCB3aG9zZSB3aG9sZSBwb2ludCBpcyB0aGF0XG4gKiBgW1thbHBoYS9icmF2by9jaGFybGllXV1gIGxpbmtzIHRvIGEgZm9sZGVyIHdpdGggbm8gc3BlY2lhbCBzeW50YXguXG4gKi9cbmV4cG9ydCBlbnVtIEZvbGRlck5vdGVMb2NhdGlvbiB7XG4gIC8qKlxuICAgKiBUYWtlIHRoZSBhbnN3ZXIgZnJvbSB0aGUgaW5zdGFsbGVkIGBmb2xkZXItbm90ZXNgIHBsdWdpbiwgZmFsbGluZyBiYWNrIHRvIGEgbm90ZSBuYW1lZCBhZnRlciBpdHNcbiAgICogZm9sZGVyLCBpbnNpZGUgaXQuIFRoZSBkZWZhdWx0LCBhbmQgcmVzb2x2ZWQgTElWRSByYXRoZXIgdGhhbiBjb3BpZWQuXG4gICAqL1xuICBBdXRvID0gJ0F1dG8nLFxuXG4gIC8qKlxuICAgKiBgYWxwaGEvYnJhdm8vY2hhcmxpZS88bmFtZT4ubWRgLlxuICAgKi9cbiAgSW5zaWRlRm9sZGVyID0gJ0luc2lkZUZvbGRlcicsXG5cbiAgLyoqXG4gICAqIFRoZSB2YXVsdCBoYXMgbm8gZm9sZGVyIG5vdGVzIGF0IGFsbCwgc28gZXZlcnkgZm9sZGVyIGFuc3dlcnMgYG51bGxgLiBUaGlzIGlzIGFsc28gaG93IGEgY2FsbGVyIG9wdHNcbiAgICogb3V0IG9mIGZvbGRlci1ub3RlIGJlaGF2aW9yIGVudGlyZWx5LlxuICAgKi9cbiAgTm9uZSA9ICdOb25lJyxcblxuICAvKipcbiAgICogYGFscGhhL2JyYXZvLzxuYW1lPi5tZGAsIGJlc2lkZSB0aGUgZm9sZGVyLlxuICAgKi9cbiAgUGFyZW50Rm9sZGVyID0gJ1BhcmVudEZvbGRlcidcbn1cblxuLyoqXG4gKiBBIGZvbGRlci1ub3RlIHNldHVwIHdpdGgge0BsaW5rIEZvbGRlck5vdGVMb2NhdGlvbi5BdXRvfSBhbHJlYWR5IHJlc29sdmVkIHRvIGEgY29uY3JldGUgYW5zd2VyLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEZvbGRlck5vdGVDb25maWcge1xuICAvKipcbiAgICogVGhlIGV4dGVuc2lvbnMgYSBmb2xkZXIgbm90ZSBtYXkgY2FycnksIFdJVEhPVVQgdGhlIGxlYWRpbmcgZG90LCBpbiByZXNvbHV0aW9uIG9yZGVyIOKAlCB0aGUgZmlyc3Qgb25lXG4gICAqIHRoYXQgbmFtZXMgYW4gZXhpc3RpbmcgZmlsZSB3aW5zLlxuICAgKi9cbiAgcmVhZG9ubHkgZXh0ZW5zaW9uczogcmVhZG9ubHkgc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIGZvbGRlciBub3RlIGlzIGhpZGRlbiBpbiB0aGUgZmlsZSBleHBsb3Jlci5cbiAgICpcbiAgICogUmVhZCByYXRoZXIgdGhhbiBhY3RlZCB1cG9uIGhlcmU6IGl0IGNoYW5nZXMgbm90aGluZyBhYm91dCBXSElDSCBmaWxlIGlzIHRoZSBmb2xkZXIgbm90ZSwgYnV0IGEgY2FsbGVyXG4gICAqIHRoYXQgcmV2ZWFscyB0aGUgbm90ZSBoYXMgdG8ga25vdyB0aGVyZSBpcyBub3RoaW5nIHRvIHJldmVhbCBhbmQgZmFsbCBiYWNrIHRvIHJldmVhbGluZyB0aGUgZm9sZGVyLlxuICAgKi9cbiAgcmVhZG9ubHkgaXNIaWRkZW46IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXJlIHRoZSBub3RlIHNpdHMgcmVsYXRpdmUgdG8gaXRzIGZvbGRlci5cbiAgICovXG4gIHJlYWRvbmx5IGxvY2F0aW9uOiBGb2xkZXJOb3RlTG9jYXRpb24uSW5zaWRlRm9sZGVyIHwgRm9sZGVyTm90ZUxvY2F0aW9uLk5vbmUgfCBGb2xkZXJOb3RlTG9jYXRpb24uUGFyZW50Rm9sZGVyO1xuXG4gIC8qKlxuICAgKiBOYW1lcyB0aGUgZm9sZGVyIG5vdGUgb2YgYSBmb2xkZXIsIFdJVEhPVVQgaXRzIGV4dGVuc2lvbi5cbiAgICpcbiAgICogQHBhcmFtIGZvbGRlciAtIFRoZSBmb2xkZXIgd2hvc2Ugbm90ZSBpcyBiZWluZyBuYW1lZC5cbiAgICogQHJldHVybnMgVGhlIG5vdGUncyBuYW1lOyBhbiBlbXB0eSAob3IgYmxhbmspIG5hbWUgbWVhbnMgdGhlIGZvbGRlciBoYXMgbm8gZm9sZGVyIG5vdGUuXG4gICAqL1xuICAvLyBBIGZ1bmN0aW9uIHByb3BlcnR5IHJhdGhlciB0aGFuIGEgbWV0aG9kLCBiZWNhdXNlIGl0IGlzIGEgc3RhbmRhbG9uZSBjYWxsYmFjaywgbmV2ZXIgYSBtZXRob2Qgb2YgdGhlXG4gIC8vIGNvbmZpZyDigJQgd2hpY2ggaXMgYWxzbyB3aGF0IGxldHMgaXQgYmUgZGVzdHJ1Y3R1cmVkIGFuZCBoYW5kZWQgb24gd2l0aG91dCB0cmlwcGluZyBgdW5ib3VuZC1tZXRob2RgLlxuICByZWFkb25seSByZXNvbHZlTmFtZTogKGZvbGRlcjogVEZvbGRlcikgPT4gc3RyaW5nO1xufVxuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayBnZXRGb2xkZXJOb3RlRm9sZGVyfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBHZXRGb2xkZXJOb3RlRm9sZGVyUGFyYW1zIHtcbiAgLyoqXG4gICAqIFRoZSBPYnNpZGlhbiBhcHAgaW5zdGFuY2UuXG4gICAqL1xuICByZWFkb25seSBhcHA6IEFwcDtcblxuICAvKipcbiAgICogVGhlIGFscmVhZHktcmVzb2x2ZWQgc2V0dXAgdG8gdXNlLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgcmVzb2x2ZUZvbGRlck5vdGVDb25maWcoeyBhcHAgfSlgXG4gICAqL1xuICByZWFkb25seSBjb25maWc/OiBGb2xkZXJOb3RlQ29uZmlnO1xuXG4gIC8qKlxuICAgKiBUaGUgZmlsZSB0aGF0IG1heSBiZSBhIGZvbGRlciBub3RlLlxuICAgKi9cbiAgcmVhZG9ubHkgZmlsZTogVEZpbGU7XG59XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIHJlc29sdmVGb2xkZXJOb3RlQ29uZmlnfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZXNvbHZlRm9sZGVyTm90ZUNvbmZpZ1BhcmFtcyB7XG4gIC8qKlxuICAgKiBUaGUgT2JzaWRpYW4gYXBwIGluc3RhbmNlLlxuICAgKi9cbiAgcmVhZG9ubHkgYXBwOiBBcHA7XG5cbiAgLyoqXG4gICAqIFRoZSBleHRlbnNpb25zIGEgZm9sZGVyIG5vdGUgbWF5IGNhcnJ5LCB3aXRoIG9yIHdpdGhvdXQgdGhlIGxlYWRpbmcgZG90LCBpbiByZXNvbHV0aW9uIG9yZGVyLiBJZ25vcmVkXG4gICAqIHVuZGVyIHtAbGluayBGb2xkZXJOb3RlTG9jYXRpb24uQXV0b30sIHdoaWNoIHRha2VzIHRoZSBpbnN0YWxsZWQgcGx1Z2luJ3MgYW5zd2VyIHdob2xlLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgWydtZCddYFxuICAgKi9cbiAgcmVhZG9ubHkgZXh0ZW5zaW9ucz86IHJlYWRvbmx5IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSBmb2xkZXIgbm90ZSBpcyBoaWRkZW4gaW4gdGhlIGZpbGUgZXhwbG9yZXIuIElnbm9yZWQgdW5kZXIge0BsaW5rIEZvbGRlck5vdGVMb2NhdGlvbi5BdXRvfS5cbiAgICpcbiAgICogQGRlZmF1bHQgYGZhbHNlYFxuICAgKi9cbiAgcmVhZG9ubHkgaXNIaWRkZW4/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGVyZSB0aGUgbm90ZSBzaXRzIHJlbGF0aXZlIHRvIGl0cyBmb2xkZXIuXG4gICAqXG4gICAqIEBkZWZhdWx0IHtAbGluayBGb2xkZXJOb3RlTG9jYXRpb24uQXV0b31cbiAgICovXG4gIHJlYWRvbmx5IGxvY2F0aW9uPzogRm9sZGVyTm90ZUxvY2F0aW9uO1xuXG4gIC8qKlxuICAgKiBOYW1lcyB0aGUgZm9sZGVyIG5vdGUgb2YgYSBmb2xkZXIsIFdJVEhPVVQgaXRzIGV4dGVuc2lvbi4gSWdub3JlZCB1bmRlclxuICAgKiB7QGxpbmsgRm9sZGVyTm90ZUxvY2F0aW9uLkF1dG99LCB3aGljaCBuYW1lcyB0aGUgbm90ZSB0aGUgd2F5IHRoZSBpbnN0YWxsZWQgcGx1Z2luIGRvZXMuXG4gICAqXG4gICAqIEEgY2FsbGJhY2sgcmF0aGVyIHRoYW4gYSBuYW1lIHRlbXBsYXRlLCBiZWNhdXNlIGEgdGVtcGxhdGUgbmVlZHMgYSB0b2tlbiB2b2NhYnVsYXJ5IGFuZCB0aGlzIGxpYnJhcnlcbiAgICogaGFzIG5vbmUgdG8gaW1wb3NlIOKAlCBhIGNhbGxlciB0aGF0IGhhcyBvbmUgKGB7e2ZvbGRlck5hbWV9fWAsIGB7e2ZvbGRlclBhdGh9fWAsIOKApikgcmVuZGVycyBpdCBoZXJlLlxuICAgKlxuICAgKiBAcGFyYW0gZm9sZGVyIC0gVGhlIGZvbGRlciB3aG9zZSBub3RlIGlzIGJlaW5nIG5hbWVkLlxuICAgKiBAcmV0dXJucyBUaGUgbm90ZSdzIG5hbWUuXG4gICAqIEBkZWZhdWx0IGAoZm9sZGVyKSA9PiBmb2xkZXIubmFtZWBcbiAgICovXG4gIC8vIFNlZSB7QGxpbmsgRm9sZGVyTm90ZUNvbmZpZy5yZXNvbHZlTmFtZX0gZm9yIHdoeSB0aGlzIGlzIGEgZnVuY3Rpb24gcHJvcGVydHkuXG4gIHJlYWRvbmx5IHJlc29sdmVOYW1lPzogKGZvbGRlcjogVEZvbGRlcikgPT4gc3RyaW5nO1xufVxuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayByZXNvbHZlRm9sZGVyTm90ZX0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmVzb2x2ZUZvbGRlck5vdGVQYXJhbXMge1xuICAvKipcbiAgICogVGhlIE9ic2lkaWFuIGFwcCBpbnN0YW5jZS5cbiAgICovXG4gIHJlYWRvbmx5IGFwcDogQXBwO1xuXG4gIC8qKlxuICAgKiBUaGUgYWxyZWFkeS1yZXNvbHZlZCBzZXR1cCB0byB1c2UuXG4gICAqXG4gICAqIE9taXR0ZWQgbWVhbnMge0BsaW5rIEZvbGRlck5vdGVMb2NhdGlvbi5BdXRvfSDigJQgdGhlIHNldHVwIGlzIHJlc29sdmVkIG9uIHRoZSBzcG90LCB3aGljaCBpcyB3aGF0IG1ha2VzXG4gICAqIGByZXNvbHZlRm9sZGVyTm90ZSh7IGFwcCwgZm9sZGVyIH0pYCB0aGUgb25lLWxpbmVyIGV2ZXJ5IGNhbGxlciB3YW50cy4gUGFzcyBvbmUgd2hlbiB0aGUgc2FtZSBzZXR1cCBpc1xuICAgKiB1c2VkIG1vcmUgdGhhbiBvbmNlLCBvciB3aGVuIGl0cyB7QGxpbmsgRm9sZGVyTm90ZUNvbmZpZy5pc0hpZGRlbn0gaXMgbmVlZGVkIGFsb25nc2lkZSB0aGUgbm90ZS5cbiAgICpcbiAgICogQGRlZmF1bHQgYHJlc29sdmVGb2xkZXJOb3RlQ29uZmlnKHsgYXBwIH0pYFxuICAgKi9cbiAgcmVhZG9ubHkgY29uZmlnPzogRm9sZGVyTm90ZUNvbmZpZztcblxuICAvKipcbiAgICogVGhlIGZvbGRlciB3aG9zZSBmb2xkZXIgbm90ZSBpcyB3YW50ZWQuIFJlYWQgQUZURVIgYW55IHJlbmFtZTogdGhlIG5vdGUgaXMgbmFtZWQgZnJvbSB0aGUgZm9sZGVyJ3NcbiAgICogQ1VSUkVOVCBuYW1lLCBhbmQgYSBgZm9sZGVyLW5vdGVzYCBpbnN0YWxsIHdpdGggYHN5bmNGb2xkZXJOYW1lYCBvbiB3aWxsIGhhdmUgcmVuYW1lZCBpdCBhbHJlYWR5LlxuICAgKi9cbiAgcmVhZG9ubHkgZm9sZGVyOiBURm9sZGVyO1xufVxuXG4vKipcbiAqIFRoZSBgZm9sZGVyLW5vdGVzYCBwbHVnaW4ncyBpZCwgYXMgaXRzIG1hbmlmZXN0IGRlY2xhcmVzIGl0LlxuICovXG5leHBvcnQgY29uc3QgRk9MREVSX05PVEVTX1BMVUdJTl9JRCA9ICdmb2xkZXItbm90ZXMnO1xuXG4vKipcbiAqIFRoZSBvbmUgdG9rZW4gYGZvbGRlci1ub3Rlc2AnIG93biBuYW1lIHRlbXBsYXRlIHVuZGVyc3RhbmRzLiBFdmVyeSBvdGhlciBjaGFyYWN0ZXIgaW4gdGhhdCB0ZW1wbGF0ZSBpc1xuICogYSBsaXRlcmFsLCBzbyB0cmFuc2xhdGluZyB0aGlzIHRva2VuIGlzIHRoZSB3aG9sZSBvZiB0aGUgdHJhbnNsYXRpb24uXG4gKi9cbmNvbnN0IEZPTERFUl9OT1RFU19GT0xERVJfTkFNRV9UT0tFTl9SRUdfRVhQID0gL1xce1xce2ZvbGRlcl9uYW1lXFx9XFx9L2dpO1xuXG4vKipcbiAqIGBmb2xkZXItbm90ZXNgIG9mZmVycyBgRXhjYWxpZHJhd2AgZm9sZGVyIG5vdGVzLCB3aGljaCBhcmUgTWFya2Rvd24gZmlsZXMgd2l0aCBhbiBgRXhjYWxpZHJhd2AgcGF5bG9hZCDigJQgaXRzXG4gKiBvd24gcmVzb2x2ZXIgbm9ybWFsaXplcyB0aGUgdHlwZSB0aGUgc2FtZSB3YXkgYmVmb3JlIGxvb2tpbmcgdGhlIGZpbGUgdXAuXG4gKi9cbmNvbnN0IEVYQ0FMSURSQVdfRklMRV9FWFRFTlNJT04gPSAnZXhjYWxpZHJhdyc7XG5cbi8qKlxuICogV2hhdCB7QGxpbmsgRm9sZGVyTm90ZUxvY2F0aW9uLkF1dG99IGZhbGxzIGJhY2sgdG86IHRoZSBsYXlvdXQgZXZlcnkgZm9sZGVyLW5vdGUgcGx1Z2luIHN1cHBvcnRzLCBhbmRcbiAqIHRoZSBvbmUgYGZvbGRlci1ub3Rlc2AgaXRzZWxmIHNoaXBzIGFzIGl0cyBkZWZhdWx0LiBOb3RoaW5nIGhpZGVzIGEgbm90ZSB3aGVuIG5vIHBsdWdpbiBpcyB0aGVyZSB0byBoaWRlXG4gKiBpdCwgc28ge0BsaW5rIEZvbGRlck5vdGVDb25maWcuaXNIaWRkZW59IGlzIGBmYWxzZWAuXG4gKi9cbmNvbnN0IEZBTExCQUNLX0ZPTERFUl9OT1RFX0NPTkZJRzogRm9sZGVyTm90ZUNvbmZpZyA9IHtcbiAgZXh0ZW5zaW9uczogW01BUktET1dOX0ZJTEVfRVhURU5TSU9OXSxcbiAgaXNIaWRkZW46IGZhbHNlLFxuICBsb2NhdGlvbjogRm9sZGVyTm90ZUxvY2F0aW9uLkluc2lkZUZvbGRlcixcbiAgcmVzb2x2ZU5hbWU6IChmb2xkZXI6IFRGb2xkZXIpOiBzdHJpbmcgPT4gZm9sZGVyLm5hbWVcbn07XG5cbi8qKlxuICogRmluZHMgdGhlIGZvbGRlciBhIGZpbGUgaXMgdGhlIGZvbGRlciBub3RlIG9mIOKAlCB0aGUgaW52ZXJzZSBvZiB7QGxpbmsgcmVzb2x2ZUZvbGRlck5vdGV9LlxuICpcbiAqIFRoZSBhbnN3ZXIgaXMgY2hlY2tlZCB0aHJvdWdoIHtAbGluayByZXNvbHZlRm9sZGVyTm90ZX0gaXRzZWxmLCBzbyB0aGUgdHdvIGNhbiBuZXZlciBkaXNhZ3JlZTogYSBmaWxlIGlzXG4gKiBhIGZvbGRlcidzIG5vdGUgZXhhY3RseSB3aGVuIHJlc29sdmluZyB0aGF0IGZvbGRlcidzIG5vdGUgeWllbGRzIHRoaXMgdmVyeSBmaWxlLiBBIGZpbGUgdGhhdCBkb2VzIG5vdFxuICogZXhpc3QgaW4gdGhlIHZhdWx0IChvbmUgYnVpbHQgZm9yIGEgcGF0aCB3aXRoIG5vdGhpbmcgYXQgaXQpIGlzIG5ldmVyIGEgZm9sZGVyIG5vdGUuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBmaWxlLCBhbmQgb3B0aW9uYWxseSB0aGUgc2V0dXAgdG8gcmVzb2x2ZSBpdCB3aXRoLlxuICogQHJldHVybnMgVGhlIGZvbGRlciwgb3IgYG51bGxgIHdoZW4gdGhlIGZpbGUgaXMgbm90IGEgZm9sZGVyIG5vdGUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRGb2xkZXJOb3RlRm9sZGVyKHBhcmFtczogR2V0Rm9sZGVyTm90ZUZvbGRlclBhcmFtcyk6IG51bGwgfCBURm9sZGVyIHtcbiAgY29uc3QgeyBhcHAsIGZpbGUgfSA9IHBhcmFtcztcbiAgY29uc3QgY29uZmlnID0gcGFyYW1zLmNvbmZpZyA/PyByZXNvbHZlRm9sZGVyTm90ZUNvbmZpZyh7IGFwcCB9KTtcbiAgY29uc3QgcGFyZW50ID0gZmlsZS5wYXJlbnQ7XG4gIGlmICghcGFyZW50IHx8IGNvbmZpZy5sb2NhdGlvbiA9PT0gRm9sZGVyTm90ZUxvY2F0aW9uLk5vbmUpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGxldCBjYW5kaWRhdGVGb2xkZXJzOiBURm9sZGVyW107XG4gIGlmIChjb25maWcubG9jYXRpb24gPT09IEZvbGRlck5vdGVMb2NhdGlvbi5JbnNpZGVGb2xkZXIpIHtcbiAgICAvLyBUaGUgdmF1bHQgcm9vdCBoYXMgbm8gZm9sZGVyIG5vdGUgdW5kZXIgdGhpcyBsYXlvdXQsIHNpbmNlIG5vdGhpbmcgbmFtZXMgaXQuXG4gICAgY2FuZGlkYXRlRm9sZGVycyA9IHBhcmVudC5pc1Jvb3QoKSA/IFtdIDogW3BhcmVudF07XG4gIH0gZWxzZSB7XG4gICAgY2FuZGlkYXRlRm9sZGVycyA9IHBhcmVudC5jaGlsZHJlbi5maWx0ZXIoaXNGb2xkZXIpO1xuICB9XG5cbiAgcmV0dXJuIGNhbmRpZGF0ZUZvbGRlcnMuZmluZCgoZm9sZGVyKSA9PiByZXNvbHZlRm9sZGVyTm90ZSh7IGFwcCwgY29uZmlnLCBmb2xkZXIgfSkgPT09IGZpbGUpID8/IG51bGw7XG59XG5cbi8qKlxuICogRmluZHMgYSBmb2xkZXIncyBmb2xkZXIgbm90ZSDigJQgdGhlIG9uZSBub3RlIHdob3NlIHByb3BlcnRpZXMgZGVzY3JpYmUgdGhlIGZvbGRlciBpdHNlbGYuXG4gKlxuICogKipOZXZlciBjcmVhdGVzLioqIEEgZm9sZGVyIHRoYXQgaGFzIG5vIGZvbGRlciBub3RlIGFuc3dlcnMgYG51bGxgLCBhbmQgc28gZG9lcyB0aGUgdmF1bHQgcm9vdCB1bmRlclxuICoge0BsaW5rIEZvbGRlck5vdGVMb2NhdGlvbi5QYXJlbnRGb2xkZXJ9IChub3RoaW5nIGNhbiBzaXQgYmVzaWRlIGl0KS5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIGZvbGRlciwgYW5kIG9wdGlvbmFsbHkgdGhlIHNldHVwIHRvIHJlc29sdmUgaXQgd2l0aC5cbiAqIEByZXR1cm5zIFRoZSBmb2xkZXIgbm90ZSwgb3IgYG51bGxgIHdoZW4gdGhlcmUgaXMgbm9uZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVGb2xkZXJOb3RlKHBhcmFtczogUmVzb2x2ZUZvbGRlck5vdGVQYXJhbXMpOiBudWxsIHwgVEZpbGUge1xuICBjb25zdCB7IGFwcCwgZm9sZGVyIH0gPSBwYXJhbXM7XG4gIGNvbnN0IGNvbmZpZyA9IHBhcmFtcy5jb25maWcgPz8gcmVzb2x2ZUZvbGRlck5vdGVDb25maWcoeyBhcHAgfSk7XG4gIGlmIChjb25maWcubG9jYXRpb24gPT09IEZvbGRlck5vdGVMb2NhdGlvbi5Ob25lKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBjb25zdCBwYXJlbnRGb2xkZXJQYXRoID0gY29uZmlnLmxvY2F0aW9uID09PSBGb2xkZXJOb3RlTG9jYXRpb24uUGFyZW50Rm9sZGVyID8gZm9sZGVyLnBhcmVudD8ucGF0aCA6IGZvbGRlci5wYXRoO1xuICBpZiAocGFyZW50Rm9sZGVyUGF0aCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBjb25zdCBub3RlTmFtZSA9IGNvbmZpZy5yZXNvbHZlTmFtZShmb2xkZXIpLnRyaW0oKTtcbiAgaWYgKCFub3RlTmFtZSkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgZm9yIChjb25zdCBleHRlbnNpb24gb2YgY29uZmlnLmV4dGVuc2lvbnMpIHtcbiAgICBjb25zdCBmaWxlID0gYXBwLnZhdWx0LmdldEZpbGVCeVBhdGgobm9ybWFsaXplUGF0aChqb2luKHBhcmVudEZvbGRlclBhdGgsIGAke25vdGVOYW1lfS4ke2V4dGVuc2lvbn1gKSkpO1xuICAgIGlmIChmaWxlKSB7XG4gICAgICByZXR1cm4gZmlsZTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn1cblxuLyoqXG4gKiBSZXNvbHZlcyB7QGxpbmsgRm9sZGVyTm90ZUxvY2F0aW9uLkF1dG99IGludG8gYSBjb25jcmV0ZSBmb2xkZXItbm90ZSBzZXR1cC5cbiAqXG4gKiBgZm9sZGVyLW5vdGVzYCcgYHZhdWx0Rm9sZGVyYCBzdG9yYWdlIChldmVyeSBmb2xkZXIgbm90ZSBwb29sZWQgaW4gb25lIGNlbnRyYWwgZm9sZGVyKSBoYXMgbm9cbiAqIGNvdW50ZXJwYXJ0IGhlcmUgYW5kIGZhbGxzIGJhY2sgcmF0aGVyIHRoYW4gZ3Vlc3Npbmc6IHdpdGggdGhlIG5vdGVzIHBvb2xlZCwgdGhlIG5vdGUgYmVsb25naW5nIHRvIGFcbiAqIGZvbGRlciBpcyBubyBsb25nZXIgZGVyaXZhYmxlIGZyb20gdGhhdCBmb2xkZXIncyBwYXRoIGFsb25lLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgc2V0dXAsIGFuZCB0aGUgYXBwIHRvIHJlYWQgdGhlIGluc3RhbGxlZCBwbHVnaW4gZnJvbS5cbiAqIEByZXR1cm5zIFRoZSByZXNvbHZlZCBzZXR1cC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVGb2xkZXJOb3RlQ29uZmlnKHBhcmFtczogUmVzb2x2ZUZvbGRlck5vdGVDb25maWdQYXJhbXMpOiBGb2xkZXJOb3RlQ29uZmlnIHtcbiAgY29uc3Qge1xuICAgIGFwcCxcbiAgICBleHRlbnNpb25zLFxuICAgIGlzSGlkZGVuID0gZmFsc2UsXG4gICAgbG9jYXRpb24sXG4gICAgcmVzb2x2ZU5hbWVcbiAgfSA9IHBhcmFtcztcblxuICByZXR1cm4gbG9jYXRpb24gPT09IHVuZGVmaW5lZCB8fCBsb2NhdGlvbiA9PT0gRm9sZGVyTm90ZUxvY2F0aW9uLkF1dG9cbiAgICA/IHJlYWRGb2xkZXJOb3Rlc1BsdWdpbkNvbmZpZyhhcHApID8/IEZBTExCQUNLX0ZPTERFUl9OT1RFX0NPTkZJR1xuICAgIDoge1xuICAgICAgZXh0ZW5zaW9uczogbm9ybWFsaXplRXh0ZW5zaW9ucyhleHRlbnNpb25zID8/IFtNQVJLRE9XTl9GSUxFX0VYVEVOU0lPTl0pLFxuICAgICAgaXNIaWRkZW4sXG4gICAgICBsb2NhdGlvbixcbiAgICAgIHJlc29sdmVOYW1lOiByZXNvbHZlTmFtZSA/PyBGQUxMQkFDS19GT0xERVJfTk9URV9DT05GSUcucmVzb2x2ZU5hbWVcbiAgICB9O1xufVxuXG4vKipcbiAqIE5vcm1hbGl6ZXMgZXh0ZW5zaW9ucyB0aGUgd2F5IGBmb2xkZXItbm90ZXNgIGRvZXMgYmVmb3JlIGl0IGxvb2tzIGEgZmlsZSB1cDogbm8gbGVhZGluZyBkb3QsIGxvd2VyLWNhc2UsXG4gKiBgRXhjYWxpZHJhd2AgdHJlYXRlZCBhcyBNYXJrZG93biwgYmxhbmtzIGRyb3BwZWQsIGR1cGxpY2F0ZXMgY29sbGFwc2VkIHdoaWxlIGtlZXBpbmcgdGhlIGZpcnN0IG9jY3VycmVuY2Unc1xuICogcG9zaXRpb24uXG4gKlxuICogQHBhcmFtIGV4dGVuc2lvbnMgLSBUaGUgZXh0ZW5zaW9ucyBhcyBjb25maWd1cmVkLlxuICogQHJldHVybnMgVGhlIG5vcm1hbGl6ZWQgZXh0ZW5zaW9ucywgaW4gcmVzb2x1dGlvbiBvcmRlci5cbiAqL1xuZnVuY3Rpb24gbm9ybWFsaXplRXh0ZW5zaW9ucyhleHRlbnNpb25zOiByZWFkb25seSBzdHJpbmdbXSk6IHJlYWRvbmx5IHN0cmluZ1tdIHtcbiAgY29uc3Qgbm9ybWFsaXplZEV4dGVuc2lvbnMgPSBleHRlbnNpb25zXG4gICAgLm1hcCgoZXh0ZW5zaW9uKSA9PiBleHRlbnNpb24udHJpbSgpLnRvTG93ZXJDYXNlKCkucmVwbGFjZSgvXlxcLi8sICcnKSlcbiAgICAubWFwKChleHRlbnNpb24pID0+IGV4dGVuc2lvbiA9PT0gRVhDQUxJRFJBV19GSUxFX0VYVEVOU0lPTiA/IE1BUktET1dOX0ZJTEVfRVhURU5TSU9OIDogZXh0ZW5zaW9uKVxuICAgIC5maWx0ZXIoQm9vbGVhbik7XG4gIHJldHVybiBbLi4ubmV3IFNldChub3JtYWxpemVkRXh0ZW5zaW9ucyldO1xufVxuXG4vKipcbiAqIFJlYWRzIHRoZSBpbnN0YWxsZWQgYGZvbGRlci1ub3Rlc2AgcGx1Z2luJ3Mgb3duIGNvbmZpZ3VyYXRpb24sIGlmIGl0IGlzIGluc3RhbGxlZCBhbmQgY29uZmlndXJlZCB0aGUgd2F5XG4gKiBpdCBkb2N1bWVudHMuXG4gKlxuICogRXZlcnkgdmFsdWUgaXMgcmVhZCBhcyBgdW5rbm93bmAgYW5kIGNoZWNrZWQsIHJhdGhlciB0aGFuIGFzc2VydGVkIGludG8gYSBzaGFwZTogdGhpcyBpcyBhbm90aGVyXG4gKiBwbHVnaW4ncyBwcml2YXRlIHNldHRpbmdzIG9iamVjdCwgc28gYSB2ZXJzaW9uIHRoYXQgcmVuYW1lcyBvciBkcm9wcyBhIGtleSBtdXN0IGRlZ3JhZGUgdG8gdGhlIGZhbGxiYWNrXG4gKiBpbnN0ZWFkIG9mIHRocm93aW5nIGluc2lkZSBhIGNsaWNrIGhhbmRsZXIuXG4gKlxuICogQHBhcmFtIGFwcCAtIFRoZSBPYnNpZGlhbiBhcHBsaWNhdGlvbiBpbnN0YW5jZS5cbiAqIEByZXR1cm5zIFRoZSBjb25maWd1cmF0aW9uLCBvciBgbnVsbGAgd2hlbiB0aGUgcGx1Z2luIGlzIGFic2VudCwgbm90IGNvbmZpZ3VyZWQsIG9yIHNldCB0byBhIHN0b3JhZ2VcbiAqIGxvY2F0aW9uIHdpdGggbm8gY291bnRlcnBhcnQgaGVyZS5cbiAqL1xuZnVuY3Rpb24gcmVhZEZvbGRlck5vdGVzUGx1Z2luQ29uZmlnKGFwcDogQXBwKTogRm9sZGVyTm90ZUNvbmZpZyB8IG51bGwge1xuICBjb25zdCBmb2xkZXJOb3Rlc1BsdWdpbiA9IGFwcC5wbHVnaW5zLmdldFBsdWdpbihGT0xERVJfTk9URVNfUExVR0lOX0lEKTtcbiAgLy8gTmFycm93ZWQgd2l0aCBgaW5gIHJhdGhlciB0aGFuIGFzc2VydGVkIGludG8gYSBzaGFwZTogdGhhdCBrZWVwcyBldmVyeSB2YWx1ZSBiZWxvdyB0eXBlZCBgdW5rbm93bmAsXG4gIC8vIHdoaWNoIGlzIGV4YWN0bHkgd2hhdCBhIGZvcmVpZ24gcGx1Z2luJ3MgcHJpdmF0ZSBzZXR0aW5ncyBhcmUuXG4gIGlmICghZm9sZGVyTm90ZXNQbHVnaW4gfHwgISgnc2V0dGluZ3MnIGluIGZvbGRlck5vdGVzUGx1Z2luKSkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgY29uc3QgZm9sZGVyTm90ZXNTZXR0aW5nczogdW5rbm93biA9IGZvbGRlck5vdGVzUGx1Z2luLnNldHRpbmdzO1xuICBpZiAodHlwZW9mIGZvbGRlck5vdGVzU2V0dGluZ3MgIT09ICdvYmplY3QnIHx8IGZvbGRlck5vdGVzU2V0dGluZ3MgPT09IG51bGwpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGNvbnN0IGxvY2F0aW9uID0gdG9Gb2xkZXJOb3RlTG9jYXRpb24oJ3N0b3JhZ2VMb2NhdGlvbicgaW4gZm9sZGVyTm90ZXNTZXR0aW5ncyA/IGZvbGRlck5vdGVzU2V0dGluZ3Muc3RvcmFnZUxvY2F0aW9uIDogbnVsbCk7XG4gIGlmICghbG9jYXRpb24pIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGNvbnN0IGZvbGRlck5vdGVOYW1lID0gJ2ZvbGRlck5vdGVOYW1lJyBpbiBmb2xkZXJOb3Rlc1NldHRpbmdzID8gZm9sZGVyTm90ZXNTZXR0aW5ncy5mb2xkZXJOb3RlTmFtZSA6IG51bGw7XG4gIGlmICh0eXBlb2YgZm9sZGVyTm90ZU5hbWUgIT09ICdzdHJpbmcnIHx8ICFmb2xkZXJOb3RlTmFtZSkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgY29uc3QgZm9sZGVyTm90ZVR5cGUgPSAnZm9sZGVyTm90ZVR5cGUnIGluIGZvbGRlck5vdGVzU2V0dGluZ3MgPyBmb2xkZXJOb3Rlc1NldHRpbmdzLmZvbGRlck5vdGVUeXBlIDogbnVsbDtcbiAgY29uc3Qgc3VwcG9ydGVkRmlsZVR5cGVzID0gJ3N1cHBvcnRlZEZpbGVUeXBlcycgaW4gZm9sZGVyTm90ZXNTZXR0aW5ncyA/IGZvbGRlck5vdGVzU2V0dGluZ3Muc3VwcG9ydGVkRmlsZVR5cGVzIDogbnVsbDtcbiAgY29uc3QgaXNIaWRkZW4gPSAnaGlkZUZvbGRlck5vdGUnIGluIGZvbGRlck5vdGVzU2V0dGluZ3MgPyBmb2xkZXJOb3Rlc1NldHRpbmdzLmhpZGVGb2xkZXJOb3RlIDogbnVsbDtcblxuICByZXR1cm4ge1xuICAgIC8vIEl0cyBvd24gcmVzb2x2ZXIgdHJpZXMgdGhlIHByaW1hcnkgdHlwZSBmaXJzdCBhbmQgZXZlcnkgb3RoZXIgc3VwcG9ydGVkIHR5cGUgYWZ0ZXIgaXQsIHdoaWNoIGlzIHRoZVxuICAgIC8vIG9yZGVyIHJlcHJvZHVjZWQgaGVyZS4gQW4gdW51c2FibGUgcGFpciBsZWF2ZXMgTWFya2Rvd24sIHRoZSBleHRlbnNpb24gaXQgY2Fubm90IGJlIGNvbmZpZ3VyZWRcbiAgICAvLyB3aXRob3V0LlxuICAgIGV4dGVuc2lvbnM6IG5vcm1hbGl6ZUV4dGVuc2lvbnMoW1xuICAgICAgdHlwZW9mIGZvbGRlck5vdGVUeXBlID09PSAnc3RyaW5nJyA/IGZvbGRlck5vdGVUeXBlIDogTUFSS0RPV05fRklMRV9FWFRFTlNJT04sXG4gICAgICAuLi4oQXJyYXkuaXNBcnJheShzdXBwb3J0ZWRGaWxlVHlwZXMpID8gc3VwcG9ydGVkRmlsZVR5cGVzLmZpbHRlcigodHlwZTogdW5rbm93bikgPT4gdHlwZW9mIHR5cGUgPT09ICdzdHJpbmcnKSA6IFtdKSxcbiAgICAgIE1BUktET1dOX0ZJTEVfRVhURU5TSU9OXG4gICAgXSksXG4gICAgaXNIaWRkZW46IGlzSGlkZGVuID09PSB0cnVlLFxuICAgIGxvY2F0aW9uLFxuICAgIHJlc29sdmVOYW1lOiAoZm9sZGVyOiBURm9sZGVyKTogc3RyaW5nID0+XG4gICAgICByZXBsYWNlQWxsKHtcbiAgICAgICAgJHN0cmluZzogZm9sZGVyTm90ZU5hbWUsXG4gICAgICAgIC8vIEEgZnVuY3Rpb24gcmVwbGFjZXIsIHNvIGEgZm9sZGVyIG5hbWUgY29udGFpbmluZyBgJCZgIGlzIGluc2VydGVkIGxpdGVyYWxseS5cbiAgICAgICAgcmVwbGFjZXI6ICgpID0+IGZvbGRlci5uYW1lLFxuICAgICAgICBzZWFyY2hWYWx1ZTogRk9MREVSX05PVEVTX0ZPTERFUl9OQU1FX1RPS0VOX1JFR19FWFBcbiAgICAgIH0pXG4gIH07XG59XG5cbi8qKlxuICogTWFwcyBgZm9sZGVyLW5vdGVzYCcgYHN0b3JhZ2VMb2NhdGlvbmAgb250byB0aGlzIGxpYnJhcnkncyBvd24gbG9jYXRpb24uXG4gKlxuICogQHBhcmFtIHN0b3JhZ2VMb2NhdGlvbiAtIFRoZSB2YWx1ZSByZWFkIG91dCBvZiB0aGF0IHBsdWdpbidzIHNldHRpbmdzLlxuICogQHJldHVybnMgVGhlIGxvY2F0aW9uLCBvciBgbnVsbGAgZm9yIGB2YXVsdEZvbGRlcmAgYW5kIGZvciBhbnl0aGluZyB0aGF0IGlzIG5vdCBvbmUgb2YgaXRzIHZhbHVlcy5cbiAqL1xuZnVuY3Rpb24gdG9Gb2xkZXJOb3RlTG9jYXRpb24oc3RvcmFnZUxvY2F0aW9uOiB1bmtub3duKTogRm9sZGVyTm90ZUNvbmZpZ1snbG9jYXRpb24nXSB8IG51bGwge1xuICBzd2l0Y2ggKHN0b3JhZ2VMb2NhdGlvbikge1xuICAgIGNhc2UgJ2luc2lkZUZvbGRlcic6IHtcbiAgICAgIHJldHVybiBGb2xkZXJOb3RlTG9jYXRpb24uSW5zaWRlRm9sZGVyO1xuICAgIH1cbiAgICBjYXNlICdwYXJlbnRGb2xkZXInOiB7XG4gICAgICByZXR1cm4gRm9sZGVyTm90ZUxvY2F0aW9uLlBhcmVudEZvbGRlcjtcbiAgICB9XG4gICAgZGVmYXVsdDoge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBeUJBLFNBQVMsWUFBWTtBQUNyQixTQUFTLGtCQUFrQjtBQUMzQixTQUFTLHFCQUFxQjtBQUU5QjtBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsT0FDSztBQVdBLElBQUsscUJBQUwsa0JBQUtBLHdCQUFMO0FBS0wsRUFBQUEsb0JBQUEsVUFBTztBQUtQLEVBQUFBLG9CQUFBLGtCQUFlO0FBTWYsRUFBQUEsb0JBQUEsVUFBTztBQUtQLEVBQUFBLG9CQUFBLGtCQUFlO0FBckJMLFNBQUFBO0FBQUEsR0FBQTtBQTRKTCxNQUFNLHlCQUF5QjtBQU10QyxNQUFNLHlDQUF5QztBQU0vQyxNQUFNLDRCQUE0QjtBQU9sQyxNQUFNLDhCQUFnRDtBQUFBLEVBQ3BELFlBQVksQ0FBQyx1QkFBdUI7QUFBQSxFQUNwQyxVQUFVO0FBQUEsRUFDVixVQUFVO0FBQUEsRUFDVixhQUFhLENBQUMsV0FBNEIsT0FBTztBQUNuRDtBQVlP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
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
/// <reference path="./library-references.d.mts" />
|
|
2
|
+
/**
|
|
3
|
+
* @file
|
|
4
|
+
*
|
|
5
|
+
* Construction and plugin-scoped registration of Bases formula functions.
|
|
6
|
+
*/
|
|
7
|
+
import type { FormulaFunction, FormulaFunctionParam } from '@obsidian-typings/obsidian-public-latest';
|
|
8
|
+
import type { Constructor, FormulaContext, Plugin, Value } from 'obsidian';
|
|
9
|
+
/**
|
|
10
|
+
* Parameters for {@link createFormulaFunctionParameter}.
|
|
11
|
+
*/
|
|
12
|
+
export interface CreateFormulaFunctionParameterParams {
|
|
13
|
+
/**
|
|
14
|
+
* Filter-editor widget, such as `file`, `folder`, `property`, `tags` or `text`.
|
|
15
|
+
*/
|
|
16
|
+
readonly customWidget?: string;
|
|
17
|
+
/**
|
|
18
|
+
* Whether omitted arguments are accepted and passed as `null`.
|
|
19
|
+
*
|
|
20
|
+
* @default `false`
|
|
21
|
+
*/
|
|
22
|
+
readonly isOptional?: boolean;
|
|
23
|
+
/**
|
|
24
|
+
* Whether this final parameter accepts all remaining arguments.
|
|
25
|
+
*
|
|
26
|
+
* @default `false`
|
|
27
|
+
*/
|
|
28
|
+
readonly isVariadic?: boolean;
|
|
29
|
+
/**
|
|
30
|
+
* Name displayed in formula completion.
|
|
31
|
+
*/
|
|
32
|
+
readonly name: string;
|
|
33
|
+
/**
|
|
34
|
+
* Accepted value classes. The first names the expected type in errors.
|
|
35
|
+
*/
|
|
36
|
+
readonly type: Constructor<Value>[];
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Parameters for {@link createFormulaFunction}.
|
|
40
|
+
*/
|
|
41
|
+
export interface CreateFormulaFunctionParams {
|
|
42
|
+
/**
|
|
43
|
+
* Description shown in formula completion.
|
|
44
|
+
*/
|
|
45
|
+
readonly docString?: (() => string) | string;
|
|
46
|
+
/**
|
|
47
|
+
* Synchronous evaluator. Direct `apply` calls receive a `null` context.
|
|
48
|
+
*/
|
|
49
|
+
readonly evaluate: (context: FormulaContext | null, ...arguments_: (null | Value)[]) => Value;
|
|
50
|
+
/**
|
|
51
|
+
* The receiver class for an instance function; omit for a global function.
|
|
52
|
+
*
|
|
53
|
+
* @default `undefined`
|
|
54
|
+
*/
|
|
55
|
+
readonly instanceType?: Constructor<Value>;
|
|
56
|
+
/**
|
|
57
|
+
* Function name, matched case-insensitively by Obsidian.
|
|
58
|
+
*/
|
|
59
|
+
readonly name: string;
|
|
60
|
+
/**
|
|
61
|
+
* Parameters, including the receiver first for an instance function.
|
|
62
|
+
*/
|
|
63
|
+
readonly params: FormulaFunctionParam[];
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Parameters for {@link registerFormulaFunction}.
|
|
67
|
+
*/
|
|
68
|
+
export interface RegisterFormulaFunctionParams extends CreateFormulaFunctionParams {
|
|
69
|
+
/**
|
|
70
|
+
* Plugin whose unload removes the registration.
|
|
71
|
+
*/
|
|
72
|
+
readonly plugin: Plugin;
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Creates a Bases function without accessing Obsidian's unexported base class.
|
|
76
|
+
* Context is restored even when evaluation throws or recursively evaluates the same function.
|
|
77
|
+
* Argument validation is performed by Obsidian's evaluator, not by direct `apply` calls.
|
|
78
|
+
*
|
|
79
|
+
* @param params - Function definition.
|
|
80
|
+
* @returns The function, ready for either of Obsidian's registration methods.
|
|
81
|
+
*/
|
|
82
|
+
export declare function createFormulaFunction(params: CreateFormulaFunctionParams): FormulaFunction;
|
|
83
|
+
/**
|
|
84
|
+
* Builds the parameter metadata consumed by Bases completion, validation and filter widgets.
|
|
85
|
+
* Only the last parameter of a function may be variadic.
|
|
86
|
+
*
|
|
87
|
+
* @param params - Parameter definition.
|
|
88
|
+
* @returns Obsidian's parameter metadata.
|
|
89
|
+
*/
|
|
90
|
+
export declare function createFormulaFunctionParameter(params: CreateFormulaFunctionParameterParams): FormulaFunctionParam;
|
|
91
|
+
/**
|
|
92
|
+
* Creates and registers a Bases function for a plugin's lifetime.
|
|
93
|
+
* Names share Obsidian's registry: use a distinctive name to avoid replacing another function.
|
|
94
|
+
*
|
|
95
|
+
* @param params - Function definition and owning plugin.
|
|
96
|
+
* @returns The registered function.
|
|
97
|
+
*/
|
|
98
|
+
export declare function registerFormulaFunction(params: RegisterFormulaFunctionParams): FormulaFunction;
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
/*
|
|
2
|
+
THIS IS A GENERATED/BUNDLED FILE BY ESBUILD
|
|
3
|
+
if you want to view the source, please visit the github repository of this plugin
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
function createFormulaFunction(params) {
|
|
7
|
+
const { docString, evaluate, instanceType, name } = params;
|
|
8
|
+
return {
|
|
9
|
+
// eslint-disable-next-line unicorn/name-replacements -- Obsidian's FormulaFunction contract names this member ctx.
|
|
10
|
+
ctx: null,
|
|
11
|
+
...docString !== void 0 && { docString },
|
|
12
|
+
apply(...arguments_) {
|
|
13
|
+
return evaluate(this.ctx, ...arguments_);
|
|
14
|
+
},
|
|
15
|
+
applyWithContext(context, ...arguments_) {
|
|
16
|
+
const previousContext = this.ctx;
|
|
17
|
+
this.ctx = context;
|
|
18
|
+
try {
|
|
19
|
+
return this.apply(...arguments_);
|
|
20
|
+
} finally {
|
|
21
|
+
this.ctx = previousContext;
|
|
22
|
+
}
|
|
23
|
+
},
|
|
24
|
+
name,
|
|
25
|
+
params: params.params,
|
|
26
|
+
serialize(...arguments_) {
|
|
27
|
+
if (instanceType) {
|
|
28
|
+
const [receiver, ...rest] = arguments_;
|
|
29
|
+
if (receiver === void 0) {
|
|
30
|
+
throw new Error("An instance formula function requires a receiver");
|
|
31
|
+
}
|
|
32
|
+
return `${receiver}.${name}(${rest.join(", ")})`;
|
|
33
|
+
}
|
|
34
|
+
return `${name}(${arguments_.join(", ")})`;
|
|
35
|
+
}
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
function createFormulaFunctionParameter(params) {
|
|
39
|
+
const { customWidget, isOptional = false, isVariadic = false, name, type } = params;
|
|
40
|
+
return {
|
|
41
|
+
...customWidget !== void 0 && { customWidget },
|
|
42
|
+
name,
|
|
43
|
+
optional: isOptional,
|
|
44
|
+
type,
|
|
45
|
+
variadic: isVariadic
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
function registerFormulaFunction(params) {
|
|
49
|
+
const function_ = createFormulaFunction(params);
|
|
50
|
+
if (params.instanceType) {
|
|
51
|
+
params.plugin.registerInstanceFunc(params.instanceType, function_);
|
|
52
|
+
} else {
|
|
53
|
+
params.plugin.registerGlobalFunc(function_);
|
|
54
|
+
}
|
|
55
|
+
return function_;
|
|
56
|
+
}
|
|
57
|
+
export {
|
|
58
|
+
createFormulaFunction,
|
|
59
|
+
createFormulaFunctionParameter,
|
|
60
|
+
registerFormulaFunction
|
|
61
|
+
};
|
|
62
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2Zvcm11bGEtZnVuY3Rpb24udHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBDb25zdHJ1Y3Rpb24gYW5kIHBsdWdpbi1zY29wZWQgcmVnaXN0cmF0aW9uIG9mIEJhc2VzIGZvcm11bGEgZnVuY3Rpb25zLlxuICovXG5cbmltcG9ydCB0eXBlIHtcbiAgRm9ybXVsYUZ1bmN0aW9uLFxuICBGb3JtdWxhRnVuY3Rpb25QYXJhbVxufSBmcm9tICdAb2JzaWRpYW4tdHlwaW5ncy9vYnNpZGlhbi1wdWJsaWMtbGF0ZXN0JztcbmltcG9ydCB0eXBlIHtcbiAgQ29uc3RydWN0b3IsXG4gIEZvcm11bGFDb250ZXh0LFxuICBQbHVnaW4sXG4gIFZhbHVlXG59IGZyb20gJ29ic2lkaWFuJztcblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgY3JlYXRlRm9ybXVsYUZ1bmN0aW9uUGFyYW1ldGVyfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmVhdGVGb3JtdWxhRnVuY3Rpb25QYXJhbWV0ZXJQYXJhbXMge1xuICAvKipcbiAgICogRmlsdGVyLWVkaXRvciB3aWRnZXQsIHN1Y2ggYXMgYGZpbGVgLCBgZm9sZGVyYCwgYHByb3BlcnR5YCwgYHRhZ3NgIG9yIGB0ZXh0YC5cbiAgICovXG4gIHJlYWRvbmx5IGN1c3RvbVdpZGdldD86IHN0cmluZztcbiAgLyoqXG4gICAqIFdoZXRoZXIgb21pdHRlZCBhcmd1bWVudHMgYXJlIGFjY2VwdGVkIGFuZCBwYXNzZWQgYXMgYG51bGxgLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgZmFsc2VgXG4gICAqL1xuICByZWFkb25seSBpc09wdGlvbmFsPzogYm9vbGVhbjtcbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhpcyBmaW5hbCBwYXJhbWV0ZXIgYWNjZXB0cyBhbGwgcmVtYWluaW5nIGFyZ3VtZW50cy5cbiAgICpcbiAgICogQGRlZmF1bHQgYGZhbHNlYFxuICAgKi9cbiAgcmVhZG9ubHkgaXNWYXJpYWRpYz86IGJvb2xlYW47XG4gIC8qKlxuICAgKiBOYW1lIGRpc3BsYXllZCBpbiBmb3JtdWxhIGNvbXBsZXRpb24uXG4gICAqL1xuICByZWFkb25seSBuYW1lOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBBY2NlcHRlZCB2YWx1ZSBjbGFzc2VzLiBUaGUgZmlyc3QgbmFtZXMgdGhlIGV4cGVjdGVkIHR5cGUgaW4gZXJyb3JzLlxuICAgKi9cbiAgcmVhZG9ubHkgdHlwZTogQ29uc3RydWN0b3I8VmFsdWU+W107XG59XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIGNyZWF0ZUZvcm11bGFGdW5jdGlvbn0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlYXRlRm9ybXVsYUZ1bmN0aW9uUGFyYW1zIHtcbiAgLyoqXG4gICAqIERlc2NyaXB0aW9uIHNob3duIGluIGZvcm11bGEgY29tcGxldGlvbi5cbiAgICovXG4gIHJlYWRvbmx5IGRvY1N0cmluZz86ICgoKSA9PiBzdHJpbmcpIHwgc3RyaW5nO1xuICAvKipcbiAgICogU3luY2hyb25vdXMgZXZhbHVhdG9yLiBEaXJlY3QgYGFwcGx5YCBjYWxscyByZWNlaXZlIGEgYG51bGxgIGNvbnRleHQuXG4gICAqL1xuICByZWFkb25seSBldmFsdWF0ZTogKGNvbnRleHQ6IEZvcm11bGFDb250ZXh0IHwgbnVsbCwgLi4uYXJndW1lbnRzXzogKG51bGwgfCBWYWx1ZSlbXSkgPT4gVmFsdWU7XG4gIC8qKlxuICAgKiBUaGUgcmVjZWl2ZXIgY2xhc3MgZm9yIGFuIGluc3RhbmNlIGZ1bmN0aW9uOyBvbWl0IGZvciBhIGdsb2JhbCBmdW5jdGlvbi5cbiAgICpcbiAgICogQGRlZmF1bHQgYHVuZGVmaW5lZGBcbiAgICovXG4gIHJlYWRvbmx5IGluc3RhbmNlVHlwZT86IENvbnN0cnVjdG9yPFZhbHVlPjtcbiAgLyoqXG4gICAqIEZ1bmN0aW9uIG5hbWUsIG1hdGNoZWQgY2FzZS1pbnNlbnNpdGl2ZWx5IGJ5IE9ic2lkaWFuLlxuICAgKi9cbiAgcmVhZG9ubHkgbmFtZTogc3RyaW5nO1xuICAvKipcbiAgICogUGFyYW1ldGVycywgaW5jbHVkaW5nIHRoZSByZWNlaXZlciBmaXJzdCBmb3IgYW4gaW5zdGFuY2UgZnVuY3Rpb24uXG4gICAqL1xuICByZWFkb25seSBwYXJhbXM6IEZvcm11bGFGdW5jdGlvblBhcmFtW107XG59XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIHJlZ2lzdGVyRm9ybXVsYUZ1bmN0aW9ufS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZWdpc3RlckZvcm11bGFGdW5jdGlvblBhcmFtcyBleHRlbmRzIENyZWF0ZUZvcm11bGFGdW5jdGlvblBhcmFtcyB7XG4gIC8qKlxuICAgKiBQbHVnaW4gd2hvc2UgdW5sb2FkIHJlbW92ZXMgdGhlIHJlZ2lzdHJhdGlvbi5cbiAgICovXG4gIHJlYWRvbmx5IHBsdWdpbjogUGx1Z2luO1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBCYXNlcyBmdW5jdGlvbiB3aXRob3V0IGFjY2Vzc2luZyBPYnNpZGlhbidzIHVuZXhwb3J0ZWQgYmFzZSBjbGFzcy5cbiAqIENvbnRleHQgaXMgcmVzdG9yZWQgZXZlbiB3aGVuIGV2YWx1YXRpb24gdGhyb3dzIG9yIHJlY3Vyc2l2ZWx5IGV2YWx1YXRlcyB0aGUgc2FtZSBmdW5jdGlvbi5cbiAqIEFyZ3VtZW50IHZhbGlkYXRpb24gaXMgcGVyZm9ybWVkIGJ5IE9ic2lkaWFuJ3MgZXZhbHVhdG9yLCBub3QgYnkgZGlyZWN0IGBhcHBseWAgY2FsbHMuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIEZ1bmN0aW9uIGRlZmluaXRpb24uXG4gKiBAcmV0dXJucyBUaGUgZnVuY3Rpb24sIHJlYWR5IGZvciBlaXRoZXIgb2YgT2JzaWRpYW4ncyByZWdpc3RyYXRpb24gbWV0aG9kcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUZvcm11bGFGdW5jdGlvbihwYXJhbXM6IENyZWF0ZUZvcm11bGFGdW5jdGlvblBhcmFtcyk6IEZvcm11bGFGdW5jdGlvbiB7XG4gIGNvbnN0IHsgZG9jU3RyaW5nLCBldmFsdWF0ZSwgaW5zdGFuY2VUeXBlLCBuYW1lIH0gPSBwYXJhbXM7XG4gIHJldHVybiB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHVuaWNvcm4vbmFtZS1yZXBsYWNlbWVudHMgLS0gT2JzaWRpYW4ncyBGb3JtdWxhRnVuY3Rpb24gY29udHJhY3QgbmFtZXMgdGhpcyBtZW1iZXIgY3R4LlxuICAgIGN0eDogbnVsbCxcbiAgICAuLi4oZG9jU3RyaW5nICE9PSB1bmRlZmluZWQgJiYgeyBkb2NTdHJpbmcgfSksXG4gICAgYXBwbHkoLi4uYXJndW1lbnRzXyk6IFZhbHVlIHtcbiAgICAgIHJldHVybiBldmFsdWF0ZSh0aGlzLmN0eCwgLi4uYXJndW1lbnRzXyk7XG4gICAgfSxcbiAgICBhcHBseVdpdGhDb250ZXh0KGNvbnRleHQsIC4uLmFyZ3VtZW50c18pOiBWYWx1ZSB7XG4gICAgICBjb25zdCBwcmV2aW91c0NvbnRleHQgPSB0aGlzLmN0eDtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSB1bmljb3JuL25hbWUtcmVwbGFjZW1lbnRzIC0tIE9ic2lkaWFuJ3MgRm9ybXVsYUZ1bmN0aW9uIGNvbnRyYWN0IG5hbWVzIHRoaXMgbWVtYmVyIGN0eC5cbiAgICAgIHRoaXMuY3R4ID0gY29udGV4dDtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiB0aGlzLmFwcGx5KC4uLmFyZ3VtZW50c18pO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHVuaWNvcm4vbmFtZS1yZXBsYWNlbWVudHMgLS0gT2JzaWRpYW4ncyBGb3JtdWxhRnVuY3Rpb24gY29udHJhY3QgbmFtZXMgdGhpcyBtZW1iZXIgY3R4LlxuICAgICAgICB0aGlzLmN0eCA9IHByZXZpb3VzQ29udGV4dDtcbiAgICAgIH1cbiAgICB9LFxuICAgIG5hbWUsXG4gICAgcGFyYW1zOiBwYXJhbXMucGFyYW1zLFxuICAgIHNlcmlhbGl6ZSguLi5hcmd1bWVudHNfKTogc3RyaW5nIHtcbiAgICAgIGlmIChpbnN0YW5jZVR5cGUpIHtcbiAgICAgICAgY29uc3QgW3JlY2VpdmVyLCAuLi5yZXN0XSA9IGFyZ3VtZW50c187XG4gICAgICAgIGlmIChyZWNlaXZlciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdBbiBpbnN0YW5jZSBmb3JtdWxhIGZ1bmN0aW9uIHJlcXVpcmVzIGEgcmVjZWl2ZXInKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYCR7cmVjZWl2ZXJ9LiR7bmFtZX0oJHtyZXN0LmpvaW4oJywgJyl9KWA7XG4gICAgICB9XG4gICAgICByZXR1cm4gYCR7bmFtZX0oJHthcmd1bWVudHNfLmpvaW4oJywgJyl9KWA7XG4gICAgfVxuICB9O1xufVxuXG4vKipcbiAqIEJ1aWxkcyB0aGUgcGFyYW1ldGVyIG1ldGFkYXRhIGNvbnN1bWVkIGJ5IEJhc2VzIGNvbXBsZXRpb24sIHZhbGlkYXRpb24gYW5kIGZpbHRlciB3aWRnZXRzLlxuICogT25seSB0aGUgbGFzdCBwYXJhbWV0ZXIgb2YgYSBmdW5jdGlvbiBtYXkgYmUgdmFyaWFkaWMuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFBhcmFtZXRlciBkZWZpbml0aW9uLlxuICogQHJldHVybnMgT2JzaWRpYW4ncyBwYXJhbWV0ZXIgbWV0YWRhdGEuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVGb3JtdWxhRnVuY3Rpb25QYXJhbWV0ZXIocGFyYW1zOiBDcmVhdGVGb3JtdWxhRnVuY3Rpb25QYXJhbWV0ZXJQYXJhbXMpOiBGb3JtdWxhRnVuY3Rpb25QYXJhbSB7XG4gIGNvbnN0IHsgY3VzdG9tV2lkZ2V0LCBpc09wdGlvbmFsID0gZmFsc2UsIGlzVmFyaWFkaWMgPSBmYWxzZSwgbmFtZSwgdHlwZSB9ID0gcGFyYW1zO1xuICByZXR1cm4ge1xuICAgIC4uLihjdXN0b21XaWRnZXQgIT09IHVuZGVmaW5lZCAmJiB7IGN1c3RvbVdpZGdldCB9KSxcbiAgICBuYW1lLFxuICAgIG9wdGlvbmFsOiBpc09wdGlvbmFsLFxuICAgIHR5cGUsXG4gICAgdmFyaWFkaWM6IGlzVmFyaWFkaWNcbiAgfTtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGFuZCByZWdpc3RlcnMgYSBCYXNlcyBmdW5jdGlvbiBmb3IgYSBwbHVnaW4ncyBsaWZldGltZS5cbiAqIE5hbWVzIHNoYXJlIE9ic2lkaWFuJ3MgcmVnaXN0cnk6IHVzZSBhIGRpc3RpbmN0aXZlIG5hbWUgdG8gYXZvaWQgcmVwbGFjaW5nIGFub3RoZXIgZnVuY3Rpb24uXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIEZ1bmN0aW9uIGRlZmluaXRpb24gYW5kIG93bmluZyBwbHVnaW4uXG4gKiBAcmV0dXJucyBUaGUgcmVnaXN0ZXJlZCBmdW5jdGlvbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlZ2lzdGVyRm9ybXVsYUZ1bmN0aW9uKHBhcmFtczogUmVnaXN0ZXJGb3JtdWxhRnVuY3Rpb25QYXJhbXMpOiBGb3JtdWxhRnVuY3Rpb24ge1xuICBjb25zdCBmdW5jdGlvbl8gPSBjcmVhdGVGb3JtdWxhRnVuY3Rpb24ocGFyYW1zKTtcbiAgaWYgKHBhcmFtcy5pbnN0YW5jZVR5cGUpIHtcbiAgICBwYXJhbXMucGx1Z2luLnJlZ2lzdGVySW5zdGFuY2VGdW5jKHBhcmFtcy5pbnN0YW5jZVR5cGUsIGZ1bmN0aW9uXyk7XG4gIH0gZWxzZSB7XG4gICAgcGFyYW1zLnBsdWdpbi5yZWdpc3Rlckdsb2JhbEZ1bmMoZnVuY3Rpb25fKTtcbiAgfVxuICByZXR1cm4gZnVuY3Rpb25fO1xufVxuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7QUE2Rk8sU0FBUyxzQkFBc0IsUUFBc0Q7QUFDMUYsUUFBTSxFQUFFLFdBQVcsVUFBVSxjQUFjLEtBQUssSUFBSTtBQUNwRCxTQUFPO0FBQUE7QUFBQSxJQUVMLEtBQUs7QUFBQSxJQUNMLEdBQUksY0FBYyxVQUFhLEVBQUUsVUFBVTtBQUFBLElBQzNDLFNBQVMsWUFBbUI7QUFDMUIsYUFBTyxTQUFTLEtBQUssS0FBSyxHQUFHLFVBQVU7QUFBQSxJQUN6QztBQUFBLElBQ0EsaUJBQWlCLFlBQVksWUFBbUI7QUFDOUMsWUFBTSxrQkFBa0IsS0FBSztBQUU3QixXQUFLLE1BQU07QUFDWCxVQUFJO0FBQ0YsZUFBTyxLQUFLLE1BQU0sR0FBRyxVQUFVO0FBQUEsTUFDakMsVUFBRTtBQUVBLGFBQUssTUFBTTtBQUFBLE1BQ2I7QUFBQSxJQUNGO0FBQUEsSUFDQTtBQUFBLElBQ0EsUUFBUSxPQUFPO0FBQUEsSUFDZixhQUFhLFlBQW9CO0FBQy9CLFVBQUksY0FBYztBQUNoQixjQUFNLENBQUMsVUFBVSxHQUFHLElBQUksSUFBSTtBQUM1QixZQUFJLGFBQWEsUUFBVztBQUMxQixnQkFBTSxJQUFJLE1BQU0sa0RBQWtEO0FBQUEsUUFDcEU7QUFDQSxlQUFPLEdBQUcsUUFBUSxJQUFJLElBQUksSUFBSSxLQUFLLEtBQUssSUFBSSxDQUFDO0FBQUEsTUFDL0M7QUFDQSxhQUFPLEdBQUcsSUFBSSxJQUFJLFdBQVcsS0FBSyxJQUFJLENBQUM7QUFBQSxJQUN6QztBQUFBLEVBQ0Y7QUFDRjtBQVNPLFNBQVMsK0JBQStCLFFBQW9FO0FBQ2pILFFBQU0sRUFBRSxjQUFjLGFBQWEsT0FBTyxhQUFhLE9BQU8sTUFBTSxLQUFLLElBQUk7QUFDN0UsU0FBTztBQUFBLElBQ0wsR0FBSSxpQkFBaUIsVUFBYSxFQUFFLGFBQWE7QUFBQSxJQUNqRDtBQUFBLElBQ0EsVUFBVTtBQUFBLElBQ1Y7QUFBQSxJQUNBLFVBQVU7QUFBQSxFQUNaO0FBQ0Y7QUFTTyxTQUFTLHdCQUF3QixRQUF3RDtBQUM5RixRQUFNLFlBQVksc0JBQXNCLE1BQU07QUFDOUMsTUFBSSxPQUFPLGNBQWM7QUFDdkIsV0FBTyxPQUFPLHFCQUFxQixPQUFPLGNBQWMsU0FBUztBQUFBLEVBQ25FLE9BQU87QUFDTCxXQUFPLE9BQU8sbUJBQW1CLFNBQVM7QUFBQSxFQUM1QztBQUNBLFNBQU87QUFDVDsiLAogICJuYW1lcyI6IFtdCn0K
|