@mnaoumov/obsidian-dev-toolkit 1.1.0 → 2.0.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/dist/demo-vault-helper/main.js +179 -1
- package/dist/integration-test-plugin/main.js +1232 -1023
- package/dist/integration-test-plugin/manifest.json +2 -2
- package/dist/lib/cjs/bundlers/esbuild-impl/copy-to-obsidian-plugins-folder-plugin.cjs +3 -22
- package/dist/lib/cjs/bundlers/esbuild-impl/copy-to-obsidian-plugins-folder-plugin.d.cts +1 -1
- package/dist/lib/cjs/bundlers/esbuild-impl/dependency.cjs +2 -21
- package/dist/lib/cjs/bundlers/esbuild-impl/dependency.d.cts +1 -1
- package/dist/lib/cjs/bundlers/esbuild-impl/fix-source-maps-plugin.cjs +2 -21
- package/dist/lib/cjs/bundlers/esbuild-impl/fix-source-maps-plugin.d.cts +1 -1
- package/dist/lib/cjs/bundlers/esbuild-impl/index.cjs +7 -53
- package/dist/lib/cjs/bundlers/esbuild-impl/index.d.cts +1 -1
- package/dist/lib/cjs/bundlers/esbuild-impl/obsidian-plugin-builder.cjs +4 -23
- package/dist/lib/cjs/bundlers/esbuild-impl/obsidian-plugin-builder.d.cts +1 -1
- package/dist/lib/cjs/bundlers/esbuild-impl/preprocess-plugin.cjs +2 -21
- package/dist/lib/cjs/bundlers/esbuild-impl/preprocess-plugin.d.cts +1 -1
- package/dist/lib/cjs/bundlers/esbuild-impl/rename-css-plugin.cjs +2 -21
- package/dist/lib/cjs/bundlers/esbuild-impl/rename-css-plugin.d.cts +1 -1
- package/dist/lib/cjs/bundlers/esbuild.cjs +1 -47
- package/dist/lib/cjs/bundlers/esbuild.d.cts +1 -1
- package/dist/lib/cjs/bundlers/index.cjs +3 -49
- package/dist/lib/cjs/bundlers/index.d.cts +1 -1
- package/dist/lib/cjs/demo-vault-app-json.cjs +2 -21
- package/dist/lib/cjs/demo-vault-app-json.d.cts +1 -1
- package/dist/lib/cjs/demo-vault-buttons.cjs +3 -22
- package/dist/lib/cjs/demo-vault-buttons.d.cts +1 -1
- package/dist/lib/cjs/demo-vault-coverage.cjs +2 -21
- package/dist/lib/cjs/demo-vault-coverage.d.cts +1 -1
- package/dist/lib/cjs/demo-vault.cjs +3 -22
- package/dist/lib/cjs/demo-vault.d.cts +1 -1
- package/dist/lib/cjs/formatters/dprint.cjs +2 -21
- package/dist/lib/cjs/formatters/dprint.d.cts +1 -1
- package/dist/lib/cjs/formatters/index.cjs +2 -48
- package/dist/lib/cjs/formatters/index.d.cts +1 -1
- package/dist/lib/cjs/index.cjs +12 -58
- package/dist/lib/cjs/integration-test-setup.cjs +1 -47
- package/dist/lib/cjs/integration-test-setup.d.cts +5 -5
- package/dist/lib/cjs/integration-test-vitest-global-setup.cjs +3 -22
- package/dist/lib/cjs/integration-test-vitest-global-setup.d.cts +7 -7
- package/dist/lib/cjs/jest-setup.cjs +2 -21
- package/dist/lib/cjs/jest-setup.d.cts +1 -1
- package/dist/lib/cjs/library-references.d.cts +2 -0
- package/dist/lib/cjs/linters/eslint-config.cjs +24 -40
- package/dist/lib/cjs/linters/eslint-config.d.cts +1 -1
- package/dist/lib/cjs/linters/eslint-rules/index.cjs +16 -62
- package/dist/lib/cjs/linters/eslint-rules/index.d.cts +2 -2
- package/dist/lib/cjs/linters/eslint-rules/manifest-description.cjs +1 -47
- package/dist/lib/cjs/linters/eslint-rules/manifest-description.d.cts +1 -1
- package/dist/lib/cjs/linters/eslint-rules/manifest-helpers.cjs +3 -22
- package/dist/lib/cjs/linters/eslint-rules/manifest-helpers.d.cts +1 -1
- package/dist/lib/cjs/linters/eslint-rules/manifest-id.cjs +1 -47
- package/dist/lib/cjs/linters/eslint-rules/manifest-id.d.cts +1 -1
- package/dist/lib/cjs/linters/eslint-rules/manifest-name.cjs +1 -47
- package/dist/lib/cjs/linters/eslint-rules/manifest-name.d.cts +1 -1
- package/dist/lib/cjs/linters/eslint-rules/manifest-schema.cjs +1 -47
- package/dist/lib/cjs/linters/eslint-rules/manifest-schema.d.cts +1 -1
- package/dist/lib/cjs/linters/eslint-rules/no-local-obsidian-internals.cjs +2 -21
- package/dist/lib/cjs/linters/eslint-rules/no-local-obsidian-internals.d.cts +1 -1
- package/dist/lib/cjs/linters/eslint-rules/no-over-cap-wait-in-eval-in-obsidian.cjs +2 -21
- package/dist/lib/cjs/linters/eslint-rules/no-over-cap-wait-in-eval-in-obsidian.d.cts +1 -1
- package/dist/lib/cjs/linters/eslint-rules/no-untrusted-input-events.cjs +2 -21
- package/dist/lib/cjs/linters/eslint-rules/no-untrusted-input-events.d.cts +1 -1
- package/dist/lib/cjs/linters/eslint-rules/obsidian-dev-toolkit-plugin.cjs +136 -0
- package/dist/lib/cjs/linters/eslint-rules/obsidian-dev-toolkit-plugin.d.cts +16 -0
- package/dist/lib/cjs/linters/eslint-rules/plugin-name-as-code-in-ui.cjs +1 -47
- package/dist/lib/cjs/linters/eslint-rules/plugin-name-as-code-in-ui.d.cts +1 -1
- package/dist/lib/cjs/linters/eslint-rules/plugin-name-as-code.cjs +1 -47
- package/dist/lib/cjs/linters/eslint-rules/plugin-name-as-code.d.cts +1 -1
- package/dist/lib/cjs/linters/eslint-rules/require-component-suffix.cjs +2 -21
- package/dist/lib/cjs/linters/eslint-rules/require-component-suffix.d.cts +1 -1
- package/dist/lib/cjs/linters/eslint-rules/require-plugin-api-contract-schemas.cjs +2 -21
- package/dist/lib/cjs/linters/eslint-rules/require-plugin-api-contract-schemas.d.cts +1 -1
- package/dist/lib/cjs/linters/eslint.cjs +2 -21
- package/dist/lib/cjs/linters/eslint.d.cts +1 -1
- package/dist/lib/cjs/linters/index.cjs +9 -55
- package/dist/lib/cjs/linters/index.d.cts +1 -1
- package/dist/lib/cjs/linters/markdownlint-cli2-config.cjs +2 -21
- package/dist/lib/cjs/linters/markdownlint-cli2-config.d.cts +1 -1
- package/dist/lib/cjs/linters/markdownlint-rules/index.cjs +2 -48
- package/dist/lib/cjs/linters/markdownlint-rules/index.d.cts +1 -1
- package/dist/lib/cjs/linters/markdownlint-rules/plugin-name-as-code.cjs +2 -48
- package/dist/lib/cjs/linters/markdownlint-rules/plugin-name-as-code.d.cts +1 -1
- package/dist/lib/cjs/linters/markdownlint.cjs +2 -21
- package/dist/lib/cjs/linters/markdownlint.d.cts +1 -1
- package/dist/lib/cjs/linters/obsidianmd-rule-custom-message.cjs +1 -47
- package/dist/lib/cjs/linters/obsidianmd-rule-custom-message.d.cts +1 -1
- package/dist/lib/cjs/linters/plugin-names.cjs +1 -47
- package/dist/lib/cjs/linters/plugin-names.d.cts +1 -1
- package/dist/lib/cjs/obsidian-plugin-repo-paths.cjs +1 -47
- package/dist/lib/cjs/obsidian-plugin-repo-paths.d.cts +1 -1
- package/dist/lib/cjs/setup.cjs +2 -21
- package/dist/lib/cjs/setup.d.cts +1 -1
- package/dist/lib/cjs/templates.cjs +2 -21
- package/dist/lib/cjs/templates.d.cts +1 -1
- package/dist/lib/cjs/test-runners/index.cjs +4 -50
- package/dist/lib/cjs/test-runners/index.d.cts +1 -1
- package/dist/lib/cjs/test-runners/integration-test-plugin.cjs +9 -28
- package/dist/lib/cjs/test-runners/integration-test-plugin.d.cts +5 -5
- package/dist/lib/cjs/test-runners/performance-eval-cap.cjs +1 -47
- package/dist/lib/cjs/test-runners/performance-eval-cap.d.cts +1 -1
- package/dist/lib/cjs/test-runners/stale-build-global-setup.cjs +2 -21
- package/dist/lib/cjs/test-runners/stale-build-global-setup.d.cts +1 -1
- package/dist/lib/cjs/test-runners/vitest-config.cjs +6 -25
- package/dist/lib/cjs/test-runners/vitest-config.d.cts +2 -3
- package/dist/lib/cjs/version.cjs +2 -21
- package/dist/lib/cjs/version.d.cts +1 -1
- package/dist/lib/cjs/vitest-setup.cjs +2 -21
- package/dist/lib/cjs/vitest-setup.d.cts +1 -1
- package/dist/lib/esm/bundlers/esbuild-impl/copy-to-obsidian-plugins-folder-plugin.d.mts +1 -1
- package/dist/lib/esm/bundlers/esbuild-impl/copy-to-obsidian-plugins-folder-plugin.mjs +2 -11
- package/dist/lib/esm/bundlers/esbuild-impl/dependency.d.mts +1 -1
- package/dist/lib/esm/bundlers/esbuild-impl/dependency.mjs +2 -11
- package/dist/lib/esm/bundlers/esbuild-impl/fix-source-maps-plugin.d.mts +1 -1
- package/dist/lib/esm/bundlers/esbuild-impl/fix-source-maps-plugin.mjs +2 -11
- package/dist/lib/esm/bundlers/esbuild-impl/index.d.mts +1 -1
- package/dist/lib/esm/bundlers/esbuild-impl/index.mjs +1 -37
- package/dist/lib/esm/bundlers/esbuild-impl/obsidian-plugin-builder.d.mts +1 -1
- package/dist/lib/esm/bundlers/esbuild-impl/obsidian-plugin-builder.mjs +2 -11
- package/dist/lib/esm/bundlers/esbuild-impl/preprocess-plugin.d.mts +1 -1
- package/dist/lib/esm/bundlers/esbuild-impl/preprocess-plugin.mjs +2 -11
- package/dist/lib/esm/bundlers/esbuild-impl/rename-css-plugin.d.mts +1 -1
- package/dist/lib/esm/bundlers/esbuild-impl/rename-css-plugin.mjs +2 -11
- package/dist/lib/esm/bundlers/esbuild.d.mts +1 -1
- package/dist/lib/esm/bundlers/esbuild.mjs +1 -37
- package/dist/lib/esm/bundlers/index.d.mts +1 -1
- package/dist/lib/esm/bundlers/index.mjs +1 -37
- package/dist/lib/esm/demo-vault-app-json.d.mts +1 -1
- package/dist/lib/esm/demo-vault-app-json.mjs +2 -11
- package/dist/lib/esm/demo-vault-buttons.d.mts +1 -1
- package/dist/lib/esm/demo-vault-buttons.mjs +2 -11
- package/dist/lib/esm/demo-vault-coverage.d.mts +1 -1
- package/dist/lib/esm/demo-vault-coverage.mjs +2 -11
- package/dist/lib/esm/demo-vault.d.mts +1 -1
- package/dist/lib/esm/demo-vault.mjs +3 -12
- package/dist/lib/esm/formatters/dprint.d.mts +1 -1
- package/dist/lib/esm/formatters/dprint.mjs +2 -11
- package/dist/lib/esm/formatters/index.d.mts +1 -1
- package/dist/lib/esm/formatters/index.mjs +1 -37
- package/dist/lib/esm/index.mjs +1 -37
- package/dist/lib/esm/integration-test-setup.d.mts +5 -5
- package/dist/lib/esm/integration-test-setup.mjs +1 -37
- package/dist/lib/esm/integration-test-vitest-global-setup.d.mts +7 -7
- package/dist/lib/esm/integration-test-vitest-global-setup.mjs +4 -13
- package/dist/lib/esm/jest-setup.d.mts +1 -1
- package/dist/lib/esm/jest-setup.mjs +2 -11
- package/dist/lib/esm/library-references.d.mts +2 -0
- package/dist/lib/esm/linters/eslint-config.d.mts +1 -1
- package/dist/lib/esm/linters/eslint-config.mjs +23 -29
- package/dist/lib/esm/linters/eslint-rules/index.d.mts +2 -2
- package/dist/lib/esm/linters/eslint-rules/index.mjs +3 -39
- package/dist/lib/esm/linters/eslint-rules/manifest-description.d.mts +1 -1
- package/dist/lib/esm/linters/eslint-rules/manifest-description.mjs +1 -37
- package/dist/lib/esm/linters/eslint-rules/manifest-helpers.d.mts +1 -1
- package/dist/lib/esm/linters/eslint-rules/manifest-helpers.mjs +2 -11
- package/dist/lib/esm/linters/eslint-rules/manifest-id.d.mts +1 -1
- package/dist/lib/esm/linters/eslint-rules/manifest-id.mjs +1 -37
- package/dist/lib/esm/linters/eslint-rules/manifest-name.d.mts +1 -1
- package/dist/lib/esm/linters/eslint-rules/manifest-name.mjs +1 -37
- package/dist/lib/esm/linters/eslint-rules/manifest-schema.d.mts +1 -1
- package/dist/lib/esm/linters/eslint-rules/manifest-schema.mjs +1 -37
- package/dist/lib/esm/linters/eslint-rules/no-local-obsidian-internals.d.mts +1 -1
- package/dist/lib/esm/linters/eslint-rules/no-local-obsidian-internals.mjs +2 -11
- package/dist/lib/esm/linters/eslint-rules/no-over-cap-wait-in-eval-in-obsidian.d.mts +1 -1
- package/dist/lib/esm/linters/eslint-rules/no-over-cap-wait-in-eval-in-obsidian.mjs +2 -11
- package/dist/lib/esm/linters/eslint-rules/no-untrusted-input-events.d.mts +1 -1
- package/dist/lib/esm/linters/eslint-rules/no-untrusted-input-events.mjs +2 -11
- package/dist/lib/esm/linters/eslint-rules/obsidian-dev-toolkit-plugin.d.mts +16 -0
- package/dist/lib/esm/linters/eslint-rules/obsidian-dev-toolkit-plugin.mjs +37 -0
- package/dist/lib/esm/linters/eslint-rules/plugin-name-as-code-in-ui.d.mts +1 -1
- package/dist/lib/esm/linters/eslint-rules/plugin-name-as-code-in-ui.mjs +1 -37
- package/dist/lib/esm/linters/eslint-rules/plugin-name-as-code.d.mts +1 -1
- package/dist/lib/esm/linters/eslint-rules/plugin-name-as-code.mjs +1 -37
- package/dist/lib/esm/linters/eslint-rules/require-component-suffix.d.mts +1 -1
- package/dist/lib/esm/linters/eslint-rules/require-component-suffix.mjs +2 -11
- package/dist/lib/esm/linters/eslint-rules/require-plugin-api-contract-schemas.d.mts +1 -1
- package/dist/lib/esm/linters/eslint-rules/require-plugin-api-contract-schemas.mjs +2 -11
- package/dist/lib/esm/linters/eslint.d.mts +1 -1
- package/dist/lib/esm/linters/eslint.mjs +2 -11
- package/dist/lib/esm/linters/index.d.mts +1 -1
- package/dist/lib/esm/linters/index.mjs +1 -37
- package/dist/lib/esm/linters/markdownlint-cli2-config.d.mts +1 -1
- package/dist/lib/esm/linters/markdownlint-cli2-config.mjs +2 -11
- package/dist/lib/esm/linters/markdownlint-rules/index.d.mts +1 -1
- package/dist/lib/esm/linters/markdownlint-rules/index.mjs +1 -37
- package/dist/lib/esm/linters/markdownlint-rules/plugin-name-as-code.d.mts +1 -1
- package/dist/lib/esm/linters/markdownlint-rules/plugin-name-as-code.mjs +1 -37
- package/dist/lib/esm/linters/markdownlint.d.mts +1 -1
- package/dist/lib/esm/linters/markdownlint.mjs +2 -11
- package/dist/lib/esm/linters/obsidianmd-rule-custom-message.d.mts +1 -1
- package/dist/lib/esm/linters/obsidianmd-rule-custom-message.mjs +1 -37
- package/dist/lib/esm/linters/plugin-names.d.mts +1 -1
- package/dist/lib/esm/linters/plugin-names.mjs +1 -37
- package/dist/lib/esm/obsidian-plugin-repo-paths.d.mts +1 -1
- package/dist/lib/esm/obsidian-plugin-repo-paths.mjs +1 -37
- package/dist/lib/esm/setup.d.mts +1 -1
- package/dist/lib/esm/setup.mjs +2 -11
- package/dist/lib/esm/templates.d.mts +1 -1
- package/dist/lib/esm/templates.mjs +2 -11
- package/dist/lib/esm/test-runners/index.d.mts +1 -1
- package/dist/lib/esm/test-runners/index.mjs +1 -37
- package/dist/lib/esm/test-runners/integration-test-plugin.d.mts +5 -5
- package/dist/lib/esm/test-runners/integration-test-plugin.mjs +8 -17
- package/dist/lib/esm/test-runners/performance-eval-cap.d.mts +1 -1
- package/dist/lib/esm/test-runners/performance-eval-cap.mjs +1 -37
- package/dist/lib/esm/test-runners/stale-build-global-setup.d.mts +1 -1
- package/dist/lib/esm/test-runners/stale-build-global-setup.mjs +2 -11
- package/dist/lib/esm/test-runners/vitest-config.d.mts +2 -3
- package/dist/lib/esm/test-runners/vitest-config.mjs +5 -14
- package/dist/lib/esm/version.d.mts +1 -1
- package/dist/lib/esm/version.mjs +2 -11
- package/dist/lib/esm/vitest-setup.d.mts +1 -1
- package/dist/lib/esm/vitest-setup.mjs +2 -11
- package/linters/eslint-rules/{obsidian-dev-utils-plugin → obsidian-dev-toolkit-plugin}/package.json +3 -3
- package/package.json +3 -3
- package/dist/lib/cjs/linters/eslint-rules/obsidian-dev-utils-plugin.cjs +0 -181
- package/dist/lib/cjs/linters/eslint-rules/obsidian-dev-utils-plugin.d.cts +0 -13
- package/dist/lib/esm/linters/eslint-rules/obsidian-dev-utils-plugin.d.mts +0 -13
- package/dist/lib/esm/linters/eslint-rules/obsidian-dev-utils-plugin.mjs +0 -73
|
@@ -2,13 +2,7 @@
|
|
|
2
2
|
THIS IS A GENERATED/BUNDLED FILE BY ESBUILD
|
|
3
3
|
if you want to view the source, please visit the github repository of this plugin
|
|
4
4
|
*/
|
|
5
|
-
|
|
6
5
|
(function () {
|
|
7
|
-
function ensureDisposeSymbols(symbolConstructor = Symbol) {
|
|
8
|
-
symbolConstructor.asyncDispose ??= symbolConstructor.for("Symbol.asyncDispose");
|
|
9
|
-
symbolConstructor.dispose ??= symbolConstructor.for("Symbol.dispose");
|
|
10
|
-
}
|
|
11
|
-
|
|
12
6
|
function ensureBrowserProcess() {
|
|
13
7
|
const browserProcess = {
|
|
14
8
|
browser: true,
|
|
@@ -33,10 +27,7 @@ function ensureBrowserProcess() {
|
|
|
33
27
|
existingProcessRecord["browser"] = true;
|
|
34
28
|
}
|
|
35
29
|
|
|
36
|
-
(
|
|
37
|
-
ensureDisposeSymbols();
|
|
38
|
-
ensureBrowserProcess();
|
|
39
|
-
})();
|
|
30
|
+
ensureBrowserProcess();
|
|
40
31
|
})();
|
|
41
32
|
|
|
42
33
|
import { normalizeOptionalProperties } from "@mnaoumov/typescript-lib/object-utils";
|
|
@@ -616,4 +607,4 @@ export {
|
|
|
616
607
|
DemoVaultCoverageChecker,
|
|
617
608
|
registerDemoVaultCoverageSuite
|
|
618
609
|
};
|
|
619
|
-
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2RlbW8tdmF1bHQtY292ZXJhZ2UudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBTdGF0aWMgY292ZXJhZ2UvZnJlc2huZXNzIGNoZWNrcyB0aGF0IGtlZXAgYSBwbHVnaW4ncyBpbi1yZXBvIGBkZW1vLXZhdWx0L2AgaW4gc3luYyB3aXRoIGl0cyBwdWJsaWMgc3VyZmFjZS5cbiAqXG4gKiBBIHBsdWdpbiBjYW4gc2hpcCBhIGN1cmF0ZWQgZGVtbyB2YXVsdCBhdCBgZGVtby12YXVsdC9gIGluIGl0cyByZXBvIHJvb3QuIFRoZXNlIGhlbHBlcnMgcmVmbGVjdCB0aGUgcmVhbFxuICogcHVibGljIEFQSS9jb25maWcvZG9jcyBzdHJhaWdodCBmcm9tIHNvdXJjZSBhbmQgYXNzZXJ0IFx1MjAxNCBXSVRIT1VUIGxhdW5jaGluZyBPYnNpZGlhbiBcdTIwMTQgdGhhdCBldmVyeSBmZWF0dXJlIGlzXG4gKiBkZW1vbnN0cmF0ZWQgaW4gdGhlIG5vdGVzIGFuZCB0aGF0IHRoZSBub3RlcyByZWZlcmVuY2Ugbm8gQVBJIG1lbWJlciB0aGF0IG5vIGxvbmdlciBleGlzdHMgKHJlbmFtZSBkcmlmdCkuXG4gKiBUaGUgcnVudGltZSBiZWhhdmlvciBvZiB0aGUgcGx1Z2luIGlzIGNvdmVyZWQgYnkgaXRzIG90aGVyIGludGVncmF0aW9uIHRlc3RzLCBub3QgYnkgdGhlIGRlbW8gdmF1bHQ7IHRoZVxuICogdmF1bHQgaXMgYSBsZWFybmluZyByZXNvdXJjZSwgYW5kIHRoZXNlIGNoZWNrcyBvbmx5IGd1YXJkIHRoYXQgaXQgc3RheXMgdHJ1dGhmdWwuXG4gKlxuICogVGhleSBhbHNvIGd1YXJkIHRoZSB2YXVsdCdzIG93biBgLm9ic2lkaWFuL2FwcC5qc29uYDogdGhlIHNldHRpbmdzIGxpc3RlZCBpblxuICoge0BsaW5rIERFTU9fVkFVTFRfQVBQX0pTT05fU0VUVElOR1N9IGJlbG9uZyB0byBgb2JzaWRpYW4tZGV2LXV0aWxzYCwgd2hpY2ggd3JpdGVzIHRoZW0gaW50byB0aGUgYXJjaGl2ZWRcbiAqIHZhdWx0IGF0IHJlbGVhc2UgdGltZSwgc28gYSB2YXVsdCB0aGF0IGNvbW1pdHMgYW55IG9mIHRoZW0gaXMga2VlcGluZyBhIHNlY29uZCBjb3B5IG5vdGhpbmcgcmVjb25jaWxlcy5cbiAqXG4gKiBUaGV5IGFsc28gZW5mb3JjZSB0aGUgZGVtby12YXVsdCBBVVRIT1JJTkcgY29udmVudGlvbiBcdTIwMTQgZXZlcnkgbm90ZSBvcGVucyB3aXRoIGFuIGAjIEgxYCBhbmQgYSBwbGFpblxuICogcHJvc2UgcGFyYWdyYXBoLCBldmVyeSBub3RlIGlzIHJlYWNoYWJsZSBmcm9tIHRoZSBzdGFydCBub3RlLCBhbmQgbm8gbm90ZSB1c2VzIGEgYFtbd2lraWxpbmtdXWAgb3IgYVxuICogYFtEb2NzXShcdTIwMjYpYCBsaW5lLiBUaGVzZSBjaGVja3MgYXJlIHVuY29uZGl0aW9uYWw6IHRoZSBkZW1vIHZhdWx0IGlzIHRoZSBwdWJsaXNoZWQgZG9jdW1lbnRhdGlvbiwgcmVhZFxuICogaW4gT2JzaWRpYW4gQU5EIG9uIEdpdEh1YiAod2hlcmUgYSB3aWtpbGluayBkb2VzIG5vdCByZW5kZXIpLCBzbyBhIG5vdGUgdGhhdCBicmVha3MgdGhlIGNvbnZlbnRpb24gaXNcbiAqIGJyb2tlbiBmb3IgcmVhbCByZWFkZXJzLiBgYXV0aG9yaW5nYCBvbmx5IHR1bmVzIHRoZW0gKHdoaWNoIG5vdGUgaXMgdGhlIHN0YXJ0LCB3aGljaCBub3RlcyBzaXQgb3V0c2lkZVxuICogdGhlIGxlYXJuaW5nIHBhdGgpOyBpdCBjYW5ub3Qgc3dpdGNoIHRoZW0gb2ZmLlxuICpcbiAqIE9ubHkgYHJvb3RGb2xkZXJgIGlzIHJlcXVpcmVkLCBzbyBhIHBsdWdpbiB3aXRoIG5vIHNldHRpbmdzIGFuZCBubyBwdWJsaWMgQVBJIHRvIHJlZmxlY3QgcmVnaXN0ZXJzIHRoZVxuICogc3VpdGUgd2l0aCB0aGF0IGFsb25lIGFuZCBzdGlsbCBnZXRzIGV2ZXJ5IGF1dGhvcmluZyBjaGVjayBcdTIwMTQgdGhlIGNoZWNrcyBoYXZlIG5vdGhpbmcgdG8gZG8gd2l0aCB3aGF0IHRoZVxuICogcGx1Z2luIGV4cG9zZXMuIEVhY2ggcmVmbGVjdGlvbiBzcGVjIChgY29uZmlnSW50ZXJmYWNlc2AsIGBpbnRlcmZhY2VzYCwgYG5vblRyaXZpYWxHdWFyZGApIGFkZHMgdGhlIGNoZWNrc1xuICogaXQgZGVzY3JpYmVzIHdoZW4gc3VwcGxpZWQuIFRoZSB2YXVsdCBpcyBndWFyZGVkIGFnYWluc3QgYmVpbmcgZW1wdHkgZWl0aGVyIHdheTogd2l0aCBubyBub3RlcyB0byByZWFkLFxuICogZXZlcnkgYXV0aG9yaW5nIGNoZWNrIHdvdWxkIHBhc3MgYnkgaGF2aW5nIG5vdGhpbmcgdG8gbG9vayBhdC5cbiAqXG4gKiBUaGUgb25lIGV4Y2VwdGlvbiBpcyBhIG5vdGUgd2hvc2UgU1VCSkVDVCBpcyB0aGUgd2lraWxpbmsgXHUyMDE0IGFuIGVtYmVkIHNwZWxsaW5nIHRoZSByZWFkZXIgaXMgYmVpbmcgdGF1Z2h0XG4gKiB0byB0eXBlLCBhIGZyb250bWF0dGVyIHByb3BlcnR5IHZhbHVlIHRoYXQgZXhpc3RzIHRvIGNvbnRyYXN0IHdpdGggYSBNYXJrZG93biBsaW5rLCBhIGZpeHR1cmUgdGhhdCBtdXN0XG4gKiBrZWVwIHRoZSB3aWtpbGluayBhIGNvbW1hbmQgaXMgc3VwcG9zZWQgdG8gbGVhdmUgYWxvbmUsIGEgbGluayB0aGUgcmVhZGVyIGNsaWNrcyB3aGlsZSBpdCBzdGlsbCByZXNvbHZlc1xuICogdG8gbm90aGluZy4gU3VjaCBhIG5vdGUgc2F5cyBzbyBpdHNlbGYsIHN0YXRpbmcgd2h5LCBpbiBvbmUgb2YgdHdvIGZvcm1zIG1vZGVsbGVkIG9uIEVTTGludCdzLlxuICpcbiAqIFBlciBsaW5lIG9yIHBlciByZWdpb24sIHdyaXR0ZW4gYXMgYW4gSFRNTCBjb21tZW50IHNvIGl0IGlzIGludmlzaWJsZSBpbiBPYnNpZGlhbiBBTkQgb24gR2l0SHViIFx1MjAxNCB0aGVcbiAqIHNwZWxsaW5nIHRoZXNlIHZhdWx0cyBhbHJlYWR5IHVzZSBmb3IgYG1hcmtkb3dubGludC1kaXNhYmxlLW5leHQtbGluZWA6XG4gKlxuICogYGBgbWFya2Rvd25cbiAqIDwhLS0gb2JzaWRpYW4tZGV2LXV0aWxzLWRpc2FibGUtbmV4dC1saW5lIGRlbW8tdmF1bHQtdmFsaWRhdGlvbi9uby13aWtpbGlua3MgLS0gQ2xpY2tpbmcgYSBsaW5rIHRvIGEgbm90ZSB0aGF0IGRvZXMgbm90IGV4aXN0IHlldCBJUyB0aGUgZmVhdHVyZS4gLS0+XG4gKiAyLiBDbGljayB0aGlzIGxpbms6IFtbUHJvamVjdHMvRnJlc2ggaWRlYV1dLlxuICpcbiAqIDwhLS0gb2JzaWRpYW4tZGV2LXV0aWxzLWRpc2FibGUgZGVtby12YXVsdC12YWxpZGF0aW9uL25vLXdpa2lsaW5rcyAtLSBUaGUgd2lraWxpbmsgZW1iZWQgaXMgdGhlIHN5bnRheCB0aGlzIG5vdGUgdGVhY2hlcy4gLS0+XG4gKiAhW1tiYXNpYy5odG1sfDQwMF1dXG4gKiA8IS0tIG9ic2lkaWFuLWRldi11dGlscy1lbmFibGUgZGVtby12YXVsdC12YWxpZGF0aW9uL25vLXdpa2lsaW5rcyAtLT5cbiAqIGBgYFxuICpcbiAqIFBlciBub3RlLCBpbiB0aGUgbm90ZSdzIG93biBmcm9udG1hdHRlciBcdTIwMTQgdGhlIG9ubHkgZm9ybSB0aGF0IGNhbiByZWFjaCBhIHdpa2lsaW5rIElOU0lERSBmcm9udG1hdHRlcixcbiAqIHdoZXJlIGEgY29tbWVudCBjYW5ub3QgZ286XG4gKlxuICogYGBgeWFtbFxuICogLS0tXG4gKiBvYnNpZGlhbi1kZXYtdXRpbHM6XG4gKiAgIGRlbW8tdmF1bHQtdmFsaWRhdGlvbjpcbiAqICAgICBhbGxvdy13aWtpbGlua3M6IFRoZSBgd2lraWxpbmtgIHByb3BlcnR5IHZhbHVlIGlzIHRoZSBjb250cmFzdCB0aGlzIG5vdGUgaXMgYnVpbHQgYXJvdW5kLlxuICogLS0tXG4gKiBgYGBcbiAqXG4gKiBFaXRoZXIgd2F5IHRoZSBkZWNsYXJhdGlvbiB0cmF2ZWxzIHdpdGggdGhlIG5vdGUgcmF0aGVyIHRoYW4gc2l0dGluZyBpbiBhIGxpc3Qgc29tZXdoZXJlIGVsc2UsIGl0IGNhcnJpZXNcbiAqIGl0cyBqdXN0aWZpY2F0aW9uLCBhbmQgaXQgZXhlbXB0cyBvbmx5IHRoZSBXSUtJTElOSyBjaGVjayBcdTIwMTQgdGhlIEgxLCBwcm9zZSwgcmVhY2hhYmlsaXR5IGFuZCBgW0RvY3NdYFxuICogY2hlY2tzIHN0aWxsIGFwcGx5LiBBIGRlY2xhcmF0aW9uIHdpdGggbm8gcmVhc29uLCBvbmUgY292ZXJpbmcgbm8gd2lraWxpbmssIGEgcmVnaW9uIG5ldmVyIGVuYWJsZWQgYWdhaW4sXG4gKiBvciBhIG1pc3NwZWxsZWQgZGlyZWN0aXZlIGFsbCBmYWlsOiBhbiBleGVtcHRpb24gbm9ib2R5IGNhbiBqdXN0aWZ5LCB0aGF0IG5vdGhpbmcgbmVlZHMgYW55IG1vcmUsIG9yIHRoYXRcbiAqIHNpbGVudGx5IGRvZXMgbm90aGluZyBpcyB3b3JzZSB0aGFuIG5vIGV4ZW1wdGlvbiBhdCBhbGwuXG4gKlxuICogVHdvIGxheWVycyBhcmUgZXhwb3NlZDpcbiAqIC0ge0BsaW5rIERlbW9WYXVsdENvdmVyYWdlQ2hlY2tlcn0gXHUyMDE0IGEgZnJhbWV3b3JrLWFnbm9zdGljIGNvcmUgdGhhdCByZWFkcyB0aGUgY29ycHVzLCBwYXJzZXMgaW50ZXJmYWNlIC9cbiAqICAgY2xhc3MgLyBlbnVtIG1lbWJlcnMgYW5kIGV4cG9ydGVkIGZ1bmN0aW9ucywgYW5kIHJldHVybnMgZGlhZ25vc3RpYyBhcnJheXMgKHdoYXQgaXMgdW5kZW1vbnN0cmF0ZWQgLyBzdGFsZVxuICogICAvIHVubGlua2VkIC8gb2ZmLWNvbnZlbnRpb24pLlxuICogLSB7QGxpbmsgcmVnaXN0ZXJEZW1vVmF1bHRDb3ZlcmFnZVN1aXRlfSBcdTIwMTQgYSB0aGluIHdyYXBwZXIgdGhhdCByZWdpc3RlcnMgYSBgdml0ZXN0YCBzdWl0ZSBvdmVyIHRoZSBjb3JlLCBzb1xuICogICBhIHBsdWdpbidzIGBkZW1vLXZhdWx0Lm5vLWFwcC5pbnRlZ3JhdGlvbi50ZXN0LnRzYCBpcyBhIHNpbmdsZSBkZWNsYXJhdGl2ZSBjYWxsLlxuICovXG5cbmltcG9ydCB7IG5vcm1hbGl6ZU9wdGlvbmFsUHJvcGVydGllcyB9IGZyb20gJ0BtbmFvdW1vdi90eXBlc2NyaXB0LWxpYi9vYmplY3QtdXRpbHMnO1xuaW1wb3J0IHtcbiAgZGlybmFtZSxcbiAgam9pbixcbiAgcmVsYXRpdmVcbn0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL3BhdGgnO1xuaW1wb3J0IHsgZ2V0TWFuZGF0b3J5TmFtZWRHcm91cCB9IGZyb20gJ0BtbmFvdW1vdi90eXBlc2NyaXB0LWxpYi9yZWctZXhwJztcbmltcG9ydCB7IGVuc3VyZU5vbk51bGxhYmxlIH0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL3R5cGUtZ3VhcmRzJztcbmltcG9ydCB7XG4gIGV4aXN0c1N5bmMsXG4gIHJlYWRkaXJTeW5jLFxuICByZWFkRmlsZVN5bmNcbn0gZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQge1xuICBkZXNjcmliZSxcbiAgZXhwZWN0LFxuICBpdFxufSBmcm9tICd2aXRlc3QnO1xuXG5pbXBvcnQge1xuICBmaW5kT3duZWREZW1vVmF1bHRBcHBKc29uU2V0dGluZ3MsXG4gIHBhcnNlRGVtb1ZhdWx0QXBwSnNvblxufSBmcm9tICcuL2RlbW8tdmF1bHQtYXBwLWpzb24udHMnO1xuaW1wb3J0IHsgT2JzaWRpYW5QbHVnaW5SZXBvUGF0aHMgfSBmcm9tICcuL29ic2lkaWFuLXBsdWdpbi1yZXBvLXBhdGhzLnRzJztcblxuLyoqXG4gKiBUdW5lcyB0aGUgYWx3YXlzLW9uIGF1dGhvcmluZyBjaGVja3MuIEl0IGNhbm5vdCBkaXNhYmxlIHRoZW0gXHUyMDE0IHNlZSB0aGUgZmlsZSBvdmVydmlldy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEZW1vVmF1bHRBdXRob3JpbmdTcGVjIHtcbiAgLyoqXG4gICAqIFRoZSBub3RlcyAocGF0aHMgcmVsYXRpdmUgdG8gdGhlIGRlbW8gdmF1bHQpIHRoYXQgc2l0IG91dHNpZGUgdGhlIGxlYXJuaW5nIHBhdGggYW5kIGFyZSB0aGVyZWZvcmVcbiAgICogZXhlbXB0IGZyb20gZXZlcnkgYXV0aG9yaW5nIGNoZWNrLiBEZWZhdWx0cyB0byB0aGUgdmF1bHQncyBvd24gYFJFQURNRS5tZGAsIHdoaWNoIGFkZHJlc3NlcyBzb21lb25lXG4gICAqIGJyb3dzaW5nIHRoZSByZXBvIG9uIEdpdEh1YiByYXRoZXIgdGhhbiBhIHJlYWRlciB3b3JraW5nIHRocm91Z2ggdGhlIHZhdWx0LlxuICAgKi9cbiAgcmVhZG9ubHkgZXhjbHVkZWROb3Rlcz86IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgKiBUaGUgbm90ZSAocGF0aCByZWxhdGl2ZSB0byB0aGUgZGVtbyB2YXVsdCkgZXZlcnkgb3RoZXIgbm90ZSBtdXN0IGJlIHJlYWNoYWJsZSBmcm9tLiBEZWZhdWx0cyB0b1xuICAgKiBgMDAgU3RhcnQubWRgLlxuICAgKi9cbiAgcmVhZG9ubHkgc3RhcnROb3RlPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIFJlZmxlY3RzIGEgY29uZmlnIGludGVyZmFjZSB3aG9zZSBvcHRpb25zIGFyZSBkZW1vbnN0cmF0ZWQgYnkgdGhlaXIgYmFyZSBuYW1lLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIERlbW9WYXVsdENvbmZpZ0ludGVyZmFjZUNvdmVyYWdlU3BlYyB7XG4gIC8qKlxuICAgKiBUaGUgbmFtZSBvZiB0aGUgYGV4cG9ydCBpbnRlcmZhY2VgLCBgZXhwb3J0IGNsYXNzYCwgb3IgYGV4cG9ydCBlbnVtYCB3aG9zZSBwcm9wZXJ0aWVzIGFyZSB0aGUgY29uZmlnXG4gICAqIG9wdGlvbnMuXG4gICAqL1xuICByZWFkb25seSBpbnRlcmZhY2VOYW1lOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBzb3VyY2UgZmlsZSBwYXRoIChyZWxhdGl2ZSB0byB0aGUgcmVwbyByb290KSB0aGF0IGRlY2xhcmVzIHRoZSBpbnRlcmZhY2UsIGNsYXNzLCBvciBlbnVtLlxuICAgKi9cbiAgcmVhZG9ubHkgc291cmNlUGF0aDogc3RyaW5nO1xufVxuXG4vKipcbiAqIFRoZSBwYXJhbWV0ZXJzIGZvciB0aGUge0BsaW5rIERlbW9WYXVsdENvdmVyYWdlQ2hlY2tlcn0gY29uc3RydWN0b3IuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRGVtb1ZhdWx0Q292ZXJhZ2VDaGVja2VyQ29uc3RydWN0b3JQYXJhbXMge1xuICAvKipcbiAgICogVGhlIG5vdGVzIChwYXRocyByZWxhdGl2ZSB0byB0aGUgZGVtbyB2YXVsdCkgZXhlbXB0IGZyb20gdGhlIGF1dGhvcmluZyBjaGVja3MuIERlZmF1bHRzIHRvIHRoZVxuICAgKiB2YXVsdCdzIG93biBgUkVBRE1FLm1kYC5cbiAgICovXG4gIHJlYWRvbmx5IGV4Y2x1ZGVkTm90ZXM/OiBzdHJpbmdbXTtcblxuICAvKipcbiAgICogVGhlIGFic29sdXRlIHBhdGggb2YgdGhlIHBsdWdpbiByZXBvIHJvb3QgXHUyMDE0IHRoZSBmb2xkZXIgY29udGFpbmluZyBgZGVtby12YXVsdC9gIGFuZCB0aGUgc291cmNlIGJlaW5nXG4gICAqIHJlZmxlY3RlZC4gQ2FsbGVycyB0eXBpY2FsbHkgcGFzcyBgZ2V0Um9vdEZvbGRlcigpID8/IHByb2Nlc3MuY3dkKClgLlxuICAgKi9cbiAgcmVhZG9ubHkgcm9vdEZvbGRlcjogc3RyaW5nO1xufVxuXG4vKipcbiAqIFRoZSBwYXJhbWV0ZXJzIGZvciB7QGxpbmsgRGVtb1ZhdWx0Q292ZXJhZ2VDaGVja2VyLmZpbmRTdGFsZVJlZmVyZW5jZXN9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIERlbW9WYXVsdENvdmVyYWdlQ2hlY2tlckZpbmRTdGFsZVJlZmVyZW5jZXNQYXJhbXMge1xuICAvKipcbiAgICogVGhlIHJlY2VpdmVyIHdob3NlIGBgIGAke3JlY2VpdmVyfS48bWVtYmVyPmAgYGAgcmVmZXJlbmNlcyBhcmUgc2Nhbm5lZCBmb3IgaW4gdGhlIGRlbW8gY29ycHVzLlxuICAgKi9cbiAgcmVhZG9ubHkgcmVjZWl2ZXI6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIG1lbWJlcnMgdGhhdCBjdXJyZW50bHkgZXhpc3Qgb24gdGhlIHJlY2VpdmVyOyBhbnkgcmVmZXJlbmNlZCBtZW1iZXIgbm90IGluIHRoaXMgc2V0IGlzIHN0YWxlLlxuICAgKi9cbiAgcmVhZG9ubHkgdmFsaWRNZW1iZXJzOiBzdHJpbmdbXTtcbn1cblxuLyoqXG4gKiBUaGUgcGFyYW1ldGVycyBmb3Ige0BsaW5rIERlbW9WYXVsdENvdmVyYWdlQ2hlY2tlci5maW5kVW5kZW1vbnN0cmF0ZWRNZW1iZXJzfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEZW1vVmF1bHRDb3ZlcmFnZUNoZWNrZXJGaW5kVW5kZW1vbnN0cmF0ZWRNZW1iZXJzUGFyYW1zIHtcbiAgLyoqXG4gICAqIFRoZSBtZW1iZXIgbmFtZXMgdGhhdCBtdXN0IGVhY2ggYXBwZWFyIGluIHRoZSBkZW1vIGNvcnB1cy5cbiAgICovXG4gIHJlYWRvbmx5IG1lbWJlcnM6IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgKiBXaGVuIHNldCwgYSBtZW1iZXIgaXMgZGVtb25zdHJhdGVkIG9ubHkgaWYgYGAgYCR7cmVjZWl2ZXJ9LiR7bWVtYmVyfWAgYGAgYXBwZWFycyAoZS5nLiBhIGNvbnRleHQgb2JqZWN0J3NcbiAgICogbWV0aG9kcyk7IHdoZW4gYWJzZW50LCB0aGUgYmFyZSBtZW1iZXIgbmFtZSBpcyBsb29rZWQgdXAgKGUuZy4gYSBjb25maWcgb3B0aW9uKS5cbiAgICovXG4gIHJlYWRvbmx5IHJlY2VpdmVyPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIFRoZSBwYXJhbWV0ZXJzIGZvciB7QGxpbmsgRGVtb1ZhdWx0Q292ZXJhZ2VDaGVja2VyLmZpbmRVbmxpbmtlZEZlYXR1cmVEb2NzfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEZW1vVmF1bHRDb3ZlcmFnZUNoZWNrZXJGaW5kVW5saW5rZWRGZWF0dXJlRG9jc1BhcmFtcyB7XG4gIC8qKlxuICAgKiBUaGUgZG9jcyBmb2xkZXIgKHJlbGF0aXZlIHRvIHRoZSByZXBvIHJvb3QpIHdob3NlIHRvcC1sZXZlbCBgKi5tZGAgZmlsZXMgYXJlIHRoZSBmZWF0dXJlIGRvY3MuXG4gICAqL1xuICByZWFkb25seSBkb2NzRm9sZGVyOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBkb2MgYmFzZW5hbWVzICh3aXRob3V0IGAubWRgKSB0aGF0IGFyZSBOT1QgcGVyLWZlYXR1cmUgcGFnZXMgYW5kIHNvIG5lZWQgbm8gbGlua2luZyBkZW1vIG5vdGUuXG4gICAqL1xuICByZWFkb25seSBub25GZWF0dXJlRG9jczogc3RyaW5nW107XG59XG5cbi8qKlxuICogVGhlIHBhcmFtZXRlcnMgZm9yIHtAbGluayBEZW1vVmF1bHRDb3ZlcmFnZUNoZWNrZXIuZmluZFVucmVhY2hhYmxlTm90ZXN9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIERlbW9WYXVsdENvdmVyYWdlQ2hlY2tlckZpbmRVbnJlYWNoYWJsZU5vdGVzUGFyYW1zIHtcbiAgLyoqXG4gICAqIFRoZSBub3RlIChwYXRoIHJlbGF0aXZlIHRvIHRoZSBkZW1vIHZhdWx0KSB0aGUgd2FsayBzdGFydHMgZnJvbSwgZS5nLiBgMDAgU3RhcnQubWRgLlxuICAgKi9cbiAgcmVhZG9ubHkgc3RhcnROb3RlOiBzdHJpbmc7XG59XG5cbi8qKlxuICogVGhlIHBhcmFtZXRlcnMgZm9yIHtAbGluayBEZW1vVmF1bHRDb3ZlcmFnZUNoZWNrZXIuZ2V0RXhwb3J0ZWRGdW5jdGlvbk5hbWVzfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEZW1vVmF1bHRDb3ZlcmFnZUNoZWNrZXJHZXRFeHBvcnRlZEZ1bmN0aW9uTmFtZXNQYXJhbXMge1xuICAvKipcbiAgICogVGhlIHNvdXJjZSBmaWxlIHBhdGggKHJlbGF0aXZlIHRvIHRoZSByZXBvIHJvb3QpIHdob3NlIGBleHBvcnQgZnVuY3Rpb25gcyBhcmUgcGFyc2VkLlxuICAgKi9cbiAgcmVhZG9ubHkgc291cmNlUGF0aDogc3RyaW5nO1xufVxuXG4vKipcbiAqIFRoZSBwYXJhbWV0ZXJzIGZvciB7QGxpbmsgRGVtb1ZhdWx0Q292ZXJhZ2VDaGVja2VyLmdldEludGVyZmFjZU1lbWJlcnN9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIERlbW9WYXVsdENvdmVyYWdlQ2hlY2tlckdldEludGVyZmFjZU1lbWJlcnNQYXJhbXMge1xuICAvKipcbiAgICogVGhlIG5hbWUgb2YgdGhlIGBleHBvcnQgaW50ZXJmYWNlYCwgYGV4cG9ydCBjbGFzc2AsIG9yIGBleHBvcnQgZW51bWAgdG8gcGFyc2UuXG4gICAqL1xuICByZWFkb25seSBpbnRlcmZhY2VOYW1lOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBzb3VyY2UgZmlsZSBwYXRoIChyZWxhdGl2ZSB0byB0aGUgcmVwbyByb290KSB0aGF0IGRlY2xhcmVzIHRoZSBpbnRlcmZhY2UsIGNsYXNzLCBvciBlbnVtLlxuICAgKi9cbiAgcmVhZG9ubHkgc291cmNlUGF0aDogc3RyaW5nO1xufVxuXG4vKipcbiAqIENvbmZpZ3VyZXMgdGhlIGZlYXR1cmUtZG9jIGxpbmtpbmcgY2hlY2suXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRGVtb1ZhdWx0RG9jc0NvdmVyYWdlU3BlYyB7XG4gIC8qKlxuICAgKiBUaGUgZG9jcyBmb2xkZXIgKHJlbGF0aXZlIHRvIHRoZSByZXBvIHJvb3QpIHdob3NlIHRvcC1sZXZlbCBgKi5tZGAgZmlsZXMgYXJlIHRoZSBmZWF0dXJlIGRvY3MuXG4gICAqL1xuICByZWFkb25seSBmb2xkZXI6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIGRvYyBiYXNlbmFtZXMgKHdpdGhvdXQgYC5tZGApIHRoYXQgYXJlIE5PVCBwZXItZmVhdHVyZSBwYWdlcyBhbmQgc28gbmVlZCBubyBsaW5raW5nIGRlbW8gbm90ZS5cbiAgICovXG4gIHJlYWRvbmx5IG5vbkZlYXR1cmVEb2NzOiBzdHJpbmdbXTtcbn1cblxuLyoqXG4gKiBSZWZsZWN0cyBhIG1vZHVsZSdzIGV4cG9ydGVkIGZ1bmN0aW9ucywgZWFjaCBkZW1vbnN0cmF0ZWQgYnkgaXRzIGJhcmUgbmFtZSBpbiB0aGUgZGVtbyBjb3JwdXMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRGVtb1ZhdWx0RnVuY3Rpb25zQ292ZXJhZ2VTcGVjIHtcbiAgLyoqXG4gICAqIFRoZSBzb3VyY2UgZmlsZSBwYXRoIChyZWxhdGl2ZSB0byB0aGUgcmVwbyByb290KSB3aG9zZSBgZXhwb3J0IGZ1bmN0aW9uYHMgbXVzdCBlYWNoIGJlIGRlbW9uc3RyYXRlZC5cbiAgICovXG4gIHJlYWRvbmx5IHNvdXJjZVBhdGg6IHN0cmluZztcbn1cblxuLyoqXG4gKiBSZWZsZWN0cyBhIHNpbmdsZSBpbnRlcmZhY2UncyBtZW1iZXJzIGFuZCBkZW1vbnN0cmF0ZXMgdGhlbSB2aWEgYGAgYCR7cmVjZWl2ZXJ9LjxtZW1iZXI+YCBgYCByZWZlcmVuY2VzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIERlbW9WYXVsdEludGVyZmFjZUNvdmVyYWdlU3BlYyB7XG4gIC8qKlxuICAgKiBUaGUgbmFtZSBvZiB0aGUgYGV4cG9ydCBpbnRlcmZhY2VgLCBgZXhwb3J0IGNsYXNzYCwgb3IgYGV4cG9ydCBlbnVtYCB0byByZWZsZWN0LlxuICAgKi9cbiAgcmVhZG9ubHkgaW50ZXJmYWNlTmFtZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSBkZW1vbnN0cmF0ZWQgbWVtYmVycyBhcmUgdGhlIHJlZmxlY3RlZCB0eXBlJ3MgbWV0aG9kcyBvciBpdHMgcHJvcGVydGllcyAoZW51bSBtZW1iZXJzIGNvdW50IGFzXG4gICAqIHByb3BlcnRpZXMpLlxuICAgKi9cbiAgcmVhZG9ubHkga2luZDogRGVtb1ZhdWx0SW50ZXJmYWNlTWVtYmVyS2luZDtcblxuICAvKipcbiAgICogVGhlIGlkZW50aWZpZXIgdGhlIG5vdGVzIGNhbGwgdGhlIG1lbWJlcnMgb24gKGUuZy4gYGNvZGVCdXR0b25Db250ZXh0YCkuXG4gICAqL1xuICByZWFkb25seSByZWNlaXZlcjogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgc291cmNlIGZpbGUgcGF0aCAocmVsYXRpdmUgdG8gdGhlIHJlcG8gcm9vdCkgdGhhdCBkZWNsYXJlcyB0aGUgaW50ZXJmYWNlLCBjbGFzcywgb3IgZW51bS5cbiAgICovXG4gIHJlYWRvbmx5IHNvdXJjZVBhdGg6IHN0cmluZztcbn1cblxuLyoqXG4gKiBXaGV0aGVyIGFuIGludGVyZmFjZSdzIGRlbW9uc3RyYXRlZCBtZW1iZXJzIGFyZSBpdHMgbWV0aG9kcyBvciBpdHMgcHJvcGVydGllcy5cbiAqL1xuZXhwb3J0IHR5cGUgRGVtb1ZhdWx0SW50ZXJmYWNlTWVtYmVyS2luZCA9ICdtZXRob2RzJyB8ICdwcm9wZXJ0aWVzJztcblxuLyoqXG4gKiBDb25maWd1cmVzIHRoZSBndWFyZCB0aGF0IHRoZSByZWZsZWN0ZWQgc3VyZmFjZSBpcyBub24tdHJpdmlhbCAocHJvdGVjdHMgYWdhaW5zdCBhIHBhcnNpbmcgcmVncmVzc2lvblxuICogc2lsZW50bHkgZW1wdHlpbmcgZXZlcnkgb3RoZXIgY2hlY2spLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIERlbW9WYXVsdE5vblRyaXZpYWxHdWFyZFNwZWMge1xuICAvKipcbiAgICogQSBkZW1vIG5vdGUgKHBhdGggcmVsYXRpdmUgdG8gdGhlIGRlbW8gdmF1bHQpIHRoYXQgbXVzdCBiZSBwcmVzZW50LlxuICAgKi9cbiAgcmVhZG9ubHkgZXhwZWN0RGVtb05vdGU6IHN0cmluZztcblxuICAvKipcbiAgICogQSBtZW1iZXIgdGhhdCBtdXN0IGJlIHJlZmxlY3RlZCBmcm9tIHtAbGluayBEZW1vVmF1bHROb25Ucml2aWFsR3VhcmRTcGVjLmludGVyZmFjZU5hbWV9LlxuICAgKi9cbiAgcmVhZG9ubHkgZXhwZWN0TWVtYmVyOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBuYW1lIG9mIHRoZSBgZXhwb3J0IGludGVyZmFjZWAsIGBleHBvcnQgY2xhc3NgLCBvciBgZXhwb3J0IGVudW1gIHdob3NlIG1lbWJlcnMgYXJlIHJlLXBhcnNlZCBmb3IgdGhlXG4gICAqIGd1YXJkLlxuICAgKi9cbiAgcmVhZG9ubHkgaW50ZXJmYWNlTmFtZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgc291cmNlIGZpbGUgcGF0aCAocmVsYXRpdmUgdG8gdGhlIHJlcG8gcm9vdCkgdGhhdCBkZWNsYXJlcyB0aGUgaW50ZXJmYWNlLCBjbGFzcywgb3IgZW51bS5cbiAgICovXG4gIHJlYWRvbmx5IHNvdXJjZVBhdGg6IHN0cmluZztcbn1cblxuLyoqXG4gKiBBIHNpbmdsZSBkZW1vIG5vdGUsIGFzIHJlYWQgZnJvbSB0aGUgZGVtbyB2YXVsdC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEZW1vVmF1bHROb3RlIHtcbiAgLyoqXG4gICAqIFRoZSBub3RlJ3MgcmF3IE1hcmtkb3duIGNvbnRlbnQuXG4gICAqL1xuICByZWFkb25seSBjb250ZW50OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBub3RlJ3MgcGF0aCByZWxhdGl2ZSB0byB0aGUgZGVtbyB2YXVsdCBmb2xkZXIsIGUuZy4gYDAwIFN0YXJ0Lm1kYC5cbiAgICovXG4gIHJlYWRvbmx5IHJlbGF0aXZlUGF0aDogc3RyaW5nO1xufVxuXG4vKipcbiAqIFRoZSBwYXJzZWQgbWVtYmVycyBvZiBhIHNvdXJjZSBpbnRlcmZhY2UsIGNsYXNzLCBvciBlbnVtLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEludGVyZmFjZU1lbWJlcnMge1xuICAvKipcbiAgICogRXZlcnkgbWVtYmVyIFx1MjAxNCB7QGxpbmsgSW50ZXJmYWNlTWVtYmVycy5tZXRob2RzfSBmb2xsb3dlZCBieSB7QGxpbmsgSW50ZXJmYWNlTWVtYmVycy5wcm9wZXJ0aWVzfS5cbiAgICovXG4gIHJlYWRvbmx5IGFsbDogc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIFRoZSBtZXRob2QgbWVtYmVycyAoZGVjbGFyZWQgYXMgYG5hbWUoLi4uKWApLlxuICAgKi9cbiAgcmVhZG9ubHkgbWV0aG9kczogc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIFRoZSBwcm9wZXJ0eSBtZW1iZXJzIChkZWNsYXJlZCBhcyBgbmFtZT86IC4uLmApLlxuICAgKi9cbiAgcmVhZG9ubHkgcHJvcGVydGllczogc3RyaW5nW107XG59XG5cbi8qKlxuICogQSBub3RlIGxpbmUgcGFpcmVkIHdpdGggdGhlIGxpbmUgbnVtYmVyIGl0IGNhbWUgZnJvbSwgc28gYSBjaGVjayB0aGF0IHNraXBzIGZlbmNlZCBibG9ja3MgY2FuIHN0aWxsXG4gKiByZXBvcnQgXHUyMDE0IGFuZCBhbiBpbmxpbmUgZGlyZWN0aXZlIGNhbiBzdGlsbCBuYW1lIFx1MjAxNCB0aGUgbGluZSBhcyB0aGUgcmVhZGVyIHNlZXMgaXQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTm90ZUxpbmUge1xuICAvKipcbiAgICogVGhlIHplcm8tYmFzZWQgbGluZSBudW1iZXIgd2l0aGluIHRoZSBub3RlLlxuICAgKi9cbiAgcmVhZG9ubHkgaW5kZXg6IG51bWJlcjtcblxuICAvKipcbiAgICogVGhlIGxpbmUncyByYXcgdGV4dC5cbiAgICovXG4gIHJlYWRvbmx5IGxpbmU6IHN0cmluZztcbn1cblxuLyoqXG4gKiBBIGBkaXNhYmxlYCByZWdpb24gdGhhdCBoYXMgYmVlbiBvcGVuZWQgYW5kIG5vdCB5ZXQgZW5hYmxlZCBhZ2Fpbi5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBPcGVuV2lraWxpbmtEaXJlY3RpdmVSZWdpb24ge1xuICAvKipcbiAgICogV2hldGhlciB0aGUgcmVnaW9uIGhhcyBjb3ZlcmVkIGEgd2lraWxpbmssIHdoaWNoIGlzIHdoYXQgc3RvcHMgaXQgYmVpbmcgcmVwb3J0ZWQgYXMgcG9pbnRsZXNzLlxuICAgKi9cbiAgaXNVc2VkOiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBUaGUgbGluZSB0aGUgcmVnaW9uIHdhcyBvcGVuZWQgb24uXG4gICAqL1xuICByZWFkb25seSBsaW5lSW5kZXg6IG51bWJlcjtcbn1cblxuLyoqXG4gKiBUaGUgcGFyYW1ldGVycyBmb3Ige0BsaW5rIHJlZ2lzdGVyRGVtb1ZhdWx0Q292ZXJhZ2VTdWl0ZX0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmVnaXN0ZXJEZW1vVmF1bHRDb3ZlcmFnZVN1aXRlUGFyYW1zIHtcbiAgLyoqXG4gICAqIFR1bmVzIHRoZSBhbHdheXMtb24gYXV0aG9yaW5nIGNoZWNrcywgb3IgYHVuZGVmaW5lZGAgdG8gdGFrZSB0aGVpciBkZWZhdWx0cy4gSXQgY2Fubm90IGRpc2FibGUgdGhlbS5cbiAgICovXG4gIHJlYWRvbmx5IGF1dGhvcmluZz86IERlbW9WYXVsdEF1dGhvcmluZ1NwZWM7XG5cbiAgLyoqXG4gICAqIFRoZSBjb25maWcgaW50ZXJmYWNlcyB3aG9zZSBvcHRpb25zIG11c3QgZWFjaCBiZSBkZW1vbnN0cmF0ZWQgYnkgdGhlaXIgYmFyZSBuYW1lLCBvciBgdW5kZWZpbmVkYCB3aGVuIHRoZVxuICAgKiBwbHVnaW4gaGFzIG5vIHNldHRpbmdzLlxuICAgKi9cbiAgcmVhZG9ubHkgY29uZmlnSW50ZXJmYWNlcz86IERlbW9WYXVsdENvbmZpZ0ludGVyZmFjZUNvdmVyYWdlU3BlY1tdO1xuXG4gIC8qKlxuICAgKiBUaGUgZmVhdHVyZS1kb2MgbGlua2luZyBjaGVjaywgb3IgYHVuZGVmaW5lZGAgd2hlbiB0aGUgcGx1Z2luIHNoaXBzIG5vIGBkb2NzL2AgZm9sZGVyLlxuICAgKi9cbiAgcmVhZG9ubHkgZG9jcz86IERlbW9WYXVsdERvY3NDb3ZlcmFnZVNwZWM7XG5cbiAgLyoqXG4gICAqIFRoZSBtb2R1bGVzIHdob3NlIGBleHBvcnQgZnVuY3Rpb25gcyBtdXN0IGVhY2ggYmUgZGVtb25zdHJhdGVkIGJ5IHRoZWlyIGJhcmUgbmFtZSwgb3IgYHVuZGVmaW5lZGAgd2hlbiB0aGVcbiAgICogcGx1Z2luIGV4cG9zZXMgbm8gc3VjaCBtb2R1bGUgdG8gY2hlY2suXG4gICAqL1xuICByZWFkb25seSBmdW5jdGlvbk1vZHVsZXM/OiBEZW1vVmF1bHRGdW5jdGlvbnNDb3ZlcmFnZVNwZWNbXTtcblxuICAvKipcbiAgICogVGhlIGludGVyZmFjZXMgd2hvc2UgbWVtYmVycyBtdXN0IGVhY2ggYmUgZGVtb25zdHJhdGVkIChhbmQgcmVmZXJlbmNlZCB3aXRob3V0IGRyaWZ0KSwgb3IgYHVuZGVmaW5lZGAgd2hlblxuICAgKiB0aGUgcGx1Z2luIGV4cG9zZXMgbm8gcHVibGljIEFQSSBzdXJmYWNlIHRvIHJlZmxlY3QuXG4gICAqL1xuICByZWFkb25seSBpbnRlcmZhY2VzPzogRGVtb1ZhdWx0SW50ZXJmYWNlQ292ZXJhZ2VTcGVjW107XG5cbiAgLyoqXG4gICAqIFRoZSBndWFyZCB0aGF0IGtlZXBzIHRoZSByZWZsZWN0ZWQgc3VyZmFjZSBub24tdHJpdmlhbCwgb3IgYHVuZGVmaW5lZGAgd2hlbiB0aGVyZSBpcyBubyByZWZsZWN0ZWQgc3VyZmFjZVxuICAgKiB0byBndWFyZC4gVGhlIHZhdWx0IGlzIGNoZWNrZWQgZm9yIGJlaW5nIG5vbi1lbXB0eSBlaXRoZXIgd2F5LlxuICAgKi9cbiAgcmVhZG9ubHkgbm9uVHJpdmlhbEd1YXJkPzogRGVtb1ZhdWx0Tm9uVHJpdmlhbEd1YXJkU3BlYztcblxuICAvKipcbiAgICogVGhlIGFic29sdXRlIHBhdGggb2YgdGhlIHBsdWdpbiByZXBvIHJvb3QuIENhbGxlcnMgdHlwaWNhbGx5IHBhc3MgYGdldFJvb3RGb2xkZXIoKSA/PyBwcm9jZXNzLmN3ZCgpYC5cbiAgICovXG4gIHJlYWRvbmx5IHJvb3RGb2xkZXI6IHN0cmluZztcbn1cblxuLyoqXG4gKiBXaGF0IGEgbm90ZSdzIGlubGluZSBgb2JzaWRpYW4tZGV2LXV0aWxzLWRpc2FibGVcdTIwMjZgIGRpcmVjdGl2ZXMgYWxsb3csIGFuZCB3aGF0IGlzIHdyb25nIHdpdGggdGhlbS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXaWtpbGlua0RpcmVjdGl2ZVNjYW4ge1xuICAvKipcbiAgICogVGhlIHplcm8tYmFzZWQgbGluZSBudW1iZXJzIGEgZGlyZWN0aXZlIGFsbG93cyBhIHdpa2lsaW5rIG9uLlxuICAgKi9cbiAgcmVhZG9ubHkgYWxsb3dlZExpbmVJbmRleGVzOiBSZWFkb25seVNldDxudW1iZXI+O1xuXG4gIC8qKlxuICAgKiBUaGUgZGlyZWN0aXZlIG1pc3Rha2VzIGZvdW5kLCBlYWNoIHBocmFzZWQgZm9yIGEgZmFpbGluZyBhc3NlcnRpb24uXG4gICAqL1xuICByZWFkb25seSBwcm9ibGVtczogc3RyaW5nW107XG59XG5cbi8qKlxuICogVGhlIHJ1bm5pbmcgc3RhdGUgb2YgYSBkaXJlY3RpdmUgc2NhbiwgdGhyZWFkZWQgdGhyb3VnaCB0aGUgcGVyLWxpbmUgaGVscGVycy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXaWtpbGlua0RpcmVjdGl2ZVNjYW5TdGF0ZSB7XG4gIC8qKlxuICAgKiBUaGUgbGluZXMgYSBkaXJlY3RpdmUgaGFzIGFsbG93ZWQgYSB3aWtpbGluayBvbiBzbyBmYXIuXG4gICAqL1xuICByZWFkb25seSBhbGxvd2VkTGluZUluZGV4ZXM6IFNldDxudW1iZXI+O1xuXG4gIC8qKlxuICAgKiBUaGUgcmVnaW9uIGN1cnJlbnRseSBvcGVuLCBhbmQgd2hldGhlciBpdCBoYXMgY292ZXJlZCBhIHdpa2lsaW5rIHlldC5cbiAgICovXG4gIG9wZW5SZWdpb246IG51bGwgfCBPcGVuV2lraWxpbmtEaXJlY3RpdmVSZWdpb247XG5cbiAgLyoqXG4gICAqIFRoZSBsaW5lIGEgYGRpc2FibGUtbmV4dC1saW5lYCB3YXMgcmVhZCBvbiwgd2hpbGUgaXQgc3RpbGwgd2FpdHMgZm9yIHRoZSBsaW5lIGl0IGNvdmVycy5cbiAgICovXG4gIHBlbmRpbmdOZXh0TGluZUluZGV4OiBudWxsIHwgbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBUaGUgZGlyZWN0aXZlIG1pc3Rha2VzIGZvdW5kIHNvIGZhci5cbiAgICovXG4gIHJlYWRvbmx5IHByb2JsZW1zOiBzdHJpbmdbXTtcblxuICAvKipcbiAgICogVGhlIGxpbmVzIG9mIHRoZSBub3RlIHRoYXQgY2FycnkgYSB3aWtpbGluay5cbiAgICovXG4gIHJlYWRvbmx5IHdpa2lsaW5rTGluZUluZGV4ZXM6IFJlYWRvbmx5U2V0PG51bWJlcj47XG59XG5cbi8qKlxuICogUmVmbGVjdHMgYSBwbHVnaW4ncyBwdWJsaWMgc3VyZmFjZSBmcm9tIHNvdXJjZSBhbmQgY2hlY2tzIGl0cyBpbi1yZXBvIGBkZW1vLXZhdWx0L2Agc3RheXMgaW4gc3luYyB3aXRoIGl0LlxuICpcbiAqIEV2ZXJ5IG1ldGhvZCBpcyBhIHB1cmUgcXVlcnkgb3ZlciBmaWxlcyB1bmRlciB0aGUgcmVwbyByb290ICh0aGUgZGVtbyBjb3JwdXMgaXMgcmVhZCBvbmNlIGFuZCBjYWNoZWQpLCBzb1xuICogdGhlIGNoZWNrZXIgaXMgdHJpdmlhbGx5IHVuaXQtdGVzdGFibGUgYWdhaW5zdCBhIGZpeHR1cmUgcmVwbyBhbmQgY2FycmllcyBubyB0ZXN0LWZyYW1ld29yayBkZXBlbmRlbmN5LlxuICovXG5leHBvcnQgY2xhc3MgRGVtb1ZhdWx0Q292ZXJhZ2VDaGVja2VyIHtcbiAgcHJpdmF0ZSBjYWNoZWRDb3JwdXM6IG51bGwgfCBzdHJpbmcgPSBudWxsO1xuICBwcml2YXRlIGNhY2hlZE5vdGVzOiBEZW1vVmF1bHROb3RlW10gfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSByZWFkb25seSBkZW1vVmF1bHRGb2xkZXI6IHN0cmluZztcbiAgcHJpdmF0ZSByZWFkb25seSBleGNsdWRlZE5vdGVzOiBTZXQ8c3RyaW5nPjtcbiAgcHJpdmF0ZSByZWFkb25seSByb290Rm9sZGVyOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBjaGVja2VyIHJvb3RlZCBhdCBhIHBsdWdpbiByZXBvLlxuICAgKlxuICAgKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIHRoZSBjb25zdHJ1Y3Rvci5cbiAgICovXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihwYXJhbXM6IERlbW9WYXVsdENvdmVyYWdlQ2hlY2tlckNvbnN0cnVjdG9yUGFyYW1zKSB7XG4gICAgdGhpcy5yb290Rm9sZGVyID0gcGFyYW1zLnJvb3RGb2xkZXI7XG4gICAgdGhpcy5kZW1vVmF1bHRGb2xkZXIgPSBqb2luKHRoaXMucm9vdEZvbGRlciwgT2JzaWRpYW5QbHVnaW5SZXBvUGF0aHMuRGVtb1ZhdWx0KTtcbiAgICB0aGlzLmV4Y2x1ZGVkTm90ZXMgPSBuZXcgU2V0KHBhcmFtcy5leGNsdWRlZE5vdGVzID8/IERFRkFVTFRfRVhDTFVERURfTk9URVMpO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbGxlY3RzIHRoZSBkZW1vIG5vdGVzIGFzIHBhdGhzIHJlbGF0aXZlIHRvIHRoZSBkZW1vIHZhdWx0IGZvbGRlciAoZm9yIGEgbm9uLXRyaXZpYWwtc3VyZmFjZSBndWFyZCkuXG4gICAqXG4gICAqIEByZXR1cm5zIFRoZSByZWxhdGl2ZSBwYXRocyBvZiBldmVyeSBgKi5tZGAgbm90ZSBpbiB0aGUgZGVtbyB2YXVsdC5cbiAgICovXG4gIHB1YmxpYyBjb2xsZWN0RGVtb05vdGVSZWxhdGl2ZVBhdGhzKCk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gdGhpcy5jb2xsZWN0Tm90ZXMoKS5tYXAoKG5vdGUpID0+IG5vdGUucmVsYXRpdmVQYXRoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWFkcyBhbmQgY2FjaGVzIGV2ZXJ5IGRlbW8gbm90ZSBpbmRpdmlkdWFsbHkgXHUyMDE0IHRoZSBwZXItbm90ZSB2aWV3IHRoZSBhdXRob3JpbmcgY2hlY2tzIHdvcmsgb24sIGFzXG4gICAqIG9wcG9zZWQgdG8gdGhlIGNvbmNhdGVuYXRlZCB7QGxpbmsgRGVtb1ZhdWx0Q292ZXJhZ2VDaGVja2VyLnJlYWRDb3JwdXN9LlxuICAgKlxuICAgKiBAcmV0dXJucyBFdmVyeSBgKi5tZGAgbm90ZSBpbiB0aGUgZGVtbyB2YXVsdCwgZXhjbHVkZWQgb25lcyBpbmNsdWRlZC5cbiAgICovXG4gIHB1YmxpYyBjb2xsZWN0Tm90ZXMoKTogRGVtb1ZhdWx0Tm90ZVtdIHtcbiAgICB0aGlzLmNhY2hlZE5vdGVzID8/PSB0aGlzLmNvbGxlY3RNYXJrZG93bkZpbGVzKHRoaXMuZGVtb1ZhdWx0Rm9sZGVyKS5tYXAoKGZpbGUpID0+ICh7XG4gICAgICBjb250ZW50OiByZWFkRmlsZVN5bmMoZmlsZSwgJ3V0Zi04JyksXG4gICAgICByZWxhdGl2ZVBhdGg6IHJlbGF0aXZlKHRoaXMuZGVtb1ZhdWx0Rm9sZGVyLCBmaWxlKVxuICAgIH0pKTtcbiAgICByZXR1cm4gdGhpcy5jYWNoZWROb3RlcztcbiAgfVxuXG4gIC8qKlxuICAgKiBGaW5kcyB0aGUgYC5vYnNpZGlhbi9hcHAuanNvbmAgc2V0dGluZ3MgdGhlIHZhdWx0IGNvbW1pdHMgdGhhdCBgb2JzaWRpYW4tZGV2LXV0aWxzYCBvd25zIGFuZCB3cml0ZXNcbiAgICogaW50byB0aGUgYXJjaGl2ZWQgdmF1bHQgaXRzZWxmLiBBIGNvbW1pdHRlZCBvbmUgaXMgYSBzZWNvbmQgY29weSBvZiBhIHNldHRpbmcgbm90aGluZyByZWNvbmNpbGVzLCBhbmRcbiAgICogaXQgaXMgdGhlIGNvcHkgdGhhdCBnb2VzIHN0YWxlIFx1MjAxNCBzbyB0aGUgY29udmVudGlvbiBpcyB0aGF0IHRoZSB2YXVsdCBjb21taXRzIG5vbmUgb2YgdGhlbS5cbiAgICpcbiAgICogQHJldHVybnMgVGhlIG5hbWVzIG9mIHRoZSBvd25lZCBzZXR0aW5ncyB0aGUgY29tbWl0dGVkIGBhcHAuanNvbmAgc2V0cy4gQSB2YXVsdCB0aGF0IGNvbW1pdHMgbm9cbiAgICogYGFwcC5qc29uYCBhdCBhbGwgaXMgZmluZSwgYW5kIHlpZWxkcyBub25lLlxuICAgKi9cbiAgcHVibGljIGZpbmRDb21taXR0ZWRBcHBKc29uU2V0dGluZ3MoKTogc3RyaW5nW10ge1xuICAgIGNvbnN0IGFwcEpzb25QYXRoID0gam9pbih0aGlzLmRlbW9WYXVsdEZvbGRlciwgT2JzaWRpYW5QbHVnaW5SZXBvUGF0aHMuRG90T2JzaWRpYW4sIE9ic2lkaWFuUGx1Z2luUmVwb1BhdGhzLkFwcEpzb24pO1xuICAgIGNvbnN0IGNvbnRlbnQgPSBleGlzdHNTeW5jKGFwcEpzb25QYXRoKSA/IHJlYWRGaWxlU3luYyhhcHBKc29uUGF0aCwgJ3V0Zi04JykgOiBudWxsO1xuICAgIHJldHVybiBmaW5kT3duZWREZW1vVmF1bHRBcHBKc29uU2V0dGluZ3MoeyBhcHBKc29uOiBwYXJzZURlbW9WYXVsdEFwcEpzb24oeyBjb250ZW50LCBwYXRoOiBhcHBKc29uUGF0aCB9KSB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaW5kcyBub3RlcyBjYXJyeWluZyBhIGBbRG9jc10oXHUyMDI2KWAgbGluayBsaW5lLiBUaGUgbm90ZSBJUyB0aGUgZG9jdW1lbnRhdGlvbiwgc28gYSBsaW5lIHBvaW50aW5nXG4gICAqIGVsc2V3aGVyZSBmb3IgdGhlIHJlYWwgZXhwbGFuYXRpb24gaXMgdGhlIHNoYXBlIHRoaXMgY29udmVudGlvbiBleGlzdHMgdG8gcmVtb3ZlLlxuICAgKlxuICAgKiBAcmV0dXJucyBUaGUgcmVsYXRpdmUgcGF0aHMgb2YgdGhlIG9mZmVuZGluZyBub3Rlcy5cbiAgICovXG4gIHB1YmxpYyBmaW5kTm90ZXNXaXRoRG9jc0xpbmtzKCk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gdGhpcy5jb2xsZWN0Q2hlY2thYmxlTm90ZXMoKVxuICAgICAgLmZpbHRlcigobm90ZSkgPT4gZ2V0TGluZXNPdXRzaWRlRmVuY2VzKG5vdGUuY29udGVudCkuc29tZSgobGluZSkgPT4gRE9DU19MSU5LX1JFR19FWFAudGVzdChsaW5lKSkpXG4gICAgICAubWFwKChub3RlKSA9PiBub3RlLnJlbGF0aXZlUGF0aCk7XG4gIH1cblxuICAvKipcbiAgICogRmluZHMgbm90ZXMgdGhhdCBkbyBub3Qgb3BlbiB3aXRoIGFuIGAjIEgxYCAoZnJvbnRtYXR0ZXIgYXNpZGUpLlxuICAgKlxuICAgKiBAcmV0dXJucyBUaGUgcmVsYXRpdmUgcGF0aHMgb2YgdGhlIG9mZmVuZGluZyBub3Rlcy5cbiAgICovXG4gIHB1YmxpYyBmaW5kTm90ZXNXaXRob3V0SDEoKTogc3RyaW5nW10ge1xuICAgIHJldHVybiB0aGlzLmNvbGxlY3RDaGVja2FibGVOb3RlcygpXG4gICAgICAuZmlsdGVyKChub3RlKSA9PiAhaGFzSDEobm90ZS5jb250ZW50KSlcbiAgICAgIC5tYXAoKG5vdGUpID0+IG5vdGUucmVsYXRpdmVQYXRoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaW5kcyBub3RlcyB3aXRoIG5vIHByb3NlIHBhcmFncmFwaCBiZWZvcmUgdGhlaXIgZmlyc3QgY29kZSBmZW5jZSBcdTIwMTQgdGhlIDEtMyBzZW50ZW5jZXMgc2F5aW5nIHdoYXQgdGhlXG4gICAqIGZlYXR1cmUgZG9lcyBhbmQgd2h5IGEgcmVhZGVyIHdvdWxkIHdhbnQgaXQsIHdpdGhvdXQgd2hpY2ggdGhlIG5vdGUgaXMgYSBidXR0b24gd2l0aCBubyBsZXNzb24uXG4gICAqXG4gICAqIEByZXR1cm5zIFRoZSByZWxhdGl2ZSBwYXRocyBvZiB0aGUgb2ZmZW5kaW5nIG5vdGVzLlxuICAgKi9cbiAgcHVibGljIGZpbmROb3Rlc1dpdGhvdXRJbnRyb1Byb3NlKCk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gdGhpcy5jb2xsZWN0Q2hlY2thYmxlTm90ZXMoKVxuICAgICAgLmZpbHRlcigobm90ZSkgPT4gIWhhc0ludHJvUHJvc2Uobm90ZS5jb250ZW50KSlcbiAgICAgIC5tYXAoKG5vdGUpID0+IG5vdGUucmVsYXRpdmVQYXRoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaW5kcyBub3RlcyB3aG9zZSB3aWtpbGluayBhbGxvd2FuY2UgaXMgbm90IGRvaW5nIGFueSB3b3JrIFx1MjAxNCBkZWNsYXJlZCB3aXRob3V0IGEgcmVhc29uLCBvciBvbiBhIG5vdGVcbiAgICogdGhhdCBjYXJyaWVzIG5vIHdpa2lsaW5rIGF0IGFsbC4gQm90aCBhcmUgZHJpZnQ6IGFuIGV4ZW1wdGlvbiBub2JvZHkgY2FuIGp1c3RpZnksIGFuZCBvbmUgbm90aGluZyBuZWVkc1xuICAgKiBhbnkgbW9yZSwgd2hpY2ggd291bGQgZ28gb24gaGlkaW5nIHRoZSBuZXh0IHdpa2lsaW5rIHNvbWVib2R5IGFkZHMgYnkgYWNjaWRlbnQuXG4gICAqXG4gICAqIEByZXR1cm5zIFRoZSByZWxhdGl2ZSBwYXRocyBvZiB0aGUgb2ZmZW5kaW5nIG5vdGVzLlxuICAgKi9cbiAgcHVibGljIGZpbmROb3Rlc1dpdGhVbmp1c3RpZmllZFdpa2lsaW5rQWxsb3dhbmNlKCk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gdGhpcy5jb2xsZWN0Q2hlY2thYmxlTm90ZXMoKS5mbGF0TWFwKChub3RlKSA9PiB7XG4gICAgICBjb25zdCBzY2FuID0gc2Nhbldpa2lsaW5rRGlyZWN0aXZlcyhub3RlLmNvbnRlbnQpO1xuICAgICAgY29uc3QgcHJvYmxlbXMgPSBbLi4uc2Nhbi5wcm9ibGVtc107XG4gICAgICBjb25zdCByZWFzb24gPSByZWFkV2lraWxpbmtBbGxvd2FuY2VSZWFzb24obm90ZS5jb250ZW50KTtcbiAgICAgIGlmIChyZWFzb24gIT09IG51bGwpIHtcbiAgICAgICAgaWYgKHJlYXNvbi50cmltKCkgPT09ICcnKSB7XG4gICAgICAgICAgcHJvYmxlbXMucHVzaCgnYSBub3RlLWxldmVsIGFsbG93YW5jZSB3aXRoIG5vIHJlYXNvbicpO1xuICAgICAgICB9IGVsc2UgaWYgKCFoYXNXaWtpbGluayhub3RlLmNvbnRlbnQpKSB7XG4gICAgICAgICAgcHJvYmxlbXMucHVzaCgnYSBub3RlLWxldmVsIGFsbG93YW5jZSBjb3ZlcmluZyBubyB3aWtpbGluaycpO1xuICAgICAgICB9IGVsc2UgaWYgKHNjYW4uYWxsb3dlZExpbmVJbmRleGVzLnNpemUgPiAwKSB7XG4gICAgICAgICAgcHJvYmxlbXMucHVzaCgnaW5saW5lIGRpcmVjdGl2ZXMgdGhlIG5vdGUtbGV2ZWwgYWxsb3dhbmNlIGFscmVhZHkgY292ZXJzJyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBwcm9ibGVtcy5tYXAoKHByb2JsZW0pID0+IGAke25vdGUucmVsYXRpdmVQYXRofTogJHtwcm9ibGVtfWApO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpbmRzIG5vdGVzIHVzaW5nIGFuIE9ic2lkaWFuIGBbW3dpa2lsaW5rXV1gIG91dHNpZGUgYSBjb2RlIGZlbmNlLiBUaGUgZGVtbyB2YXVsdCBpcyBhbHNvIHJlYWQgb25cbiAgICogR2l0SHViLCB3aGVyZSBhIHdpa2lsaW5rIHJlbmRlcnMgYXMgbGl0ZXJhbCBicmFja2V0cyBhbmQgbGVhZHMgbm93aGVyZS4gQSB3aWtpbGluayBzaG93biBJTlNJREUgYVxuICAgKiBmZW5jZSBpcyBzYW1wbGUgdGV4dCwgbm90IG5hdmlnYXRpb24sIHNvIGZlbmNlZCBibG9ja3MgYXJlIHNraXBwZWQsIGFzIGlzIGEgbm90ZSB0aGF0IGRlY2xhcmVzIGluIGl0c1xuICAgKiBmcm9udG1hdHRlciB3aHkgaXRzIHdpa2lsaW5rcyBhcmUgdGhlIHBvaW50IFx1MjAxNCBzZWUgdGhlIGZpbGUgb3ZlcnZpZXcuXG4gICAqXG4gICAqIEByZXR1cm5zIFRoZSByZWxhdGl2ZSBwYXRocyBvZiB0aGUgb2ZmZW5kaW5nIG5vdGVzLlxuICAgKi9cbiAgcHVibGljIGZpbmROb3Rlc1dpdGhXaWtpbGlua3MoKTogc3RyaW5nW10ge1xuICAgIHJldHVybiB0aGlzLmNvbGxlY3RDaGVja2FibGVOb3RlcygpXG4gICAgICAuZmlsdGVyKChub3RlKSA9PiB7XG4gICAgICAgIGlmIChyZWFkV2lraWxpbmtBbGxvd2FuY2VSZWFzb24obm90ZS5jb250ZW50KSAhPT0gbnVsbCkge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB7IGFsbG93ZWRMaW5lSW5kZXhlcyB9ID0gc2Nhbldpa2lsaW5rRGlyZWN0aXZlcyhub3RlLmNvbnRlbnQpO1xuICAgICAgICByZXR1cm4gZmluZFdpa2lsaW5rTGluZUluZGV4ZXMobm90ZS5jb250ZW50KS5zb21lKChsaW5lSW5kZXgpID0+ICFhbGxvd2VkTGluZUluZGV4ZXMuaGFzKGxpbmVJbmRleCkpO1xuICAgICAgfSlcbiAgICAgIC5tYXAoKG5vdGUpID0+IG5vdGUucmVsYXRpdmVQYXRoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaW5kcyBtZW1iZXJzIHRoYXQgdGhlIGRlbW8gbm90ZXMgcmVmZXJlbmNlIG9uIGEgcmVjZWl2ZXIgYnV0IHRoYXQgbm8gbG9uZ2VyIGV4aXN0IG9uIGl0IChyZW5hbWUgZHJpZnQpLlxuICAgKlxuICAgKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIHRoZSBsb29rdXAuXG4gICAqIEByZXR1cm5zIFRoZSBkaXN0aW5jdCBzdGFsZSBtZW1iZXIgbmFtZXMgcmVmZXJlbmNlZCBpbiB0aGUgZGVtbyBjb3JwdXMuXG4gICAqL1xuICBwdWJsaWMgZmluZFN0YWxlUmVmZXJlbmNlcyhwYXJhbXM6IERlbW9WYXVsdENvdmVyYWdlQ2hlY2tlckZpbmRTdGFsZVJlZmVyZW5jZXNQYXJhbXMpOiBzdHJpbmdbXSB7XG4gICAgY29uc3QgdmFsaWRNZW1iZXJzID0gbmV3IFNldChwYXJhbXMudmFsaWRNZW1iZXJzKTtcbiAgICBjb25zdCByZWZlcmVuY2VkID0gWy4uLnRoaXMucmVhZENvcnB1cygpLm1hdGNoQWxsKG5ldyBSZWdFeHAoU3RyaW5nLnJhd2Ake3BhcmFtcy5yZWNlaXZlcn1cXC4oPzxtZW1iZXI+XFx3KylgLCAnZycpKV1cbiAgICAgIC5tYXAoKG1hdGNoKSA9PiBnZXRNYW5kYXRvcnlOYW1lZEdyb3VwKG1hdGNoLCAnbWVtYmVyJykpO1xuICAgIHJldHVybiBbLi4ubmV3IFNldChyZWZlcmVuY2VkKV0uZmlsdGVyKChtZW1iZXIpID0+ICF2YWxpZE1lbWJlcnMuaGFzKG1lbWJlcikpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpbmRzIG1lbWJlcnMgdGhhdCBhcmUgbm90IGRlbW9uc3RyYXRlZCBhbnl3aGVyZSBpbiB0aGUgZGVtbyBjb3JwdXMuXG4gICAqXG4gICAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgcGFyYW1ldGVycyBmb3IgdGhlIGxvb2t1cC5cbiAgICogQHJldHVybnMgVGhlIG1lbWJlciBuYW1lcyB3aXRoIG5vIGRlbW9uc3RyYXRpb24uXG4gICAqL1xuICBwdWJsaWMgZmluZFVuZGVtb25zdHJhdGVkTWVtYmVycyhwYXJhbXM6IERlbW9WYXVsdENvdmVyYWdlQ2hlY2tlckZpbmRVbmRlbW9uc3RyYXRlZE1lbWJlcnNQYXJhbXMpOiBzdHJpbmdbXSB7XG4gICAgY29uc3QgY29ycHVzID0gdGhpcy5yZWFkQ29ycHVzKCk7XG4gICAgcmV0dXJuIHBhcmFtcy5tZW1iZXJzLmZpbHRlcigobWVtYmVyKSA9PiB7XG4gICAgICBjb25zdCBuZWVkbGUgPSBwYXJhbXMucmVjZWl2ZXIgPT09IHVuZGVmaW5lZCA/IG1lbWJlciA6IGAke3BhcmFtcy5yZWNlaXZlcn0uJHttZW1iZXJ9YDtcbiAgICAgIHJldHVybiAhY29ycHVzLmluY2x1ZGVzKG5lZWRsZSk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogRmluZHMgZmVhdHVyZSBkb2NzIHRoYXQgbm8gZGVtbyBub3RlIGxpbmtzIHRvLlxuICAgKlxuICAgKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIHRoZSBsb29rdXAuXG4gICAqIEByZXR1cm5zIFRoZSBmZWF0dXJlLWRvYyBiYXNlbmFtZXMgKHdpdGhvdXQgYC5tZGApIG5vdCBsaW5rZWQgZnJvbSBhbnkgZGVtbyBub3RlLlxuICAgKi9cbiAgcHVibGljIGZpbmRVbmxpbmtlZEZlYXR1cmVEb2NzKHBhcmFtczogRGVtb1ZhdWx0Q292ZXJhZ2VDaGVja2VyRmluZFVubGlua2VkRmVhdHVyZURvY3NQYXJhbXMpOiBzdHJpbmdbXSB7XG4gICAgY29uc3Qgbm9uRmVhdHVyZURvY3MgPSBuZXcgU2V0KHBhcmFtcy5ub25GZWF0dXJlRG9jcyk7XG4gICAgY29uc3QgZmVhdHVyZURvY3MgPSByZWFkZGlyU3luYyhqb2luKHRoaXMucm9vdEZvbGRlciwgcGFyYW1zLmRvY3NGb2xkZXIpKVxuICAgICAgLmZpbHRlcigoZmlsZSkgPT4gZmlsZS5lbmRzV2l0aCgnLm1kJykpXG4gICAgICAubWFwKChmaWxlKSA9PiBmaWxlLnJlcGxhY2UoL1xcLm1kJC8sICcnKSlcbiAgICAgIC5maWx0ZXIoKG5hbWUpID0+ICFub25GZWF0dXJlRG9jcy5oYXMobmFtZSkpO1xuICAgIGNvbnN0IGxpbmtlZERvY3MgPSBuZXcgU2V0KFxuICAgICAgWy4uLnRoaXMucmVhZENvcnB1cygpLm1hdGNoQWxsKC9kb2NzXFwvKD88ZG9jPltcXHctXSspXFwubWQvZyldLm1hcCgobWF0Y2gpID0+IGdldE1hbmRhdG9yeU5hbWVkR3JvdXAobWF0Y2gsICdkb2MnKSlcbiAgICApO1xuICAgIHJldHVybiBmZWF0dXJlRG9jcy5maWx0ZXIoKGRvYykgPT4gIWxpbmtlZERvY3MuaGFzKGRvYykpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpbmRzIG5vdGVzIHRoYXQgY2Fubm90IGJlIHJlYWNoZWQgZnJvbSB0aGUgc3RhcnQgbm90ZSBieSBmb2xsb3dpbmcgTWFya2Rvd24gbGlua3MgYmV0d2VlbiBub3Rlcy5cbiAgICpcbiAgICogVGhlIHdhbGsgc3RhcnRzIGF0IHtAbGluayBEZW1vVmF1bHRDb3ZlcmFnZUNoZWNrZXJGaW5kVW5yZWFjaGFibGVOb3Rlc1BhcmFtcy5zdGFydE5vdGV9IGFuZCBmb2xsb3dzXG4gICAqIGV2ZXJ5IGBbVGV4dF0oPC4vTk4gTmFtZS5tZD4pYCBsaW5rIG91dHNpZGUgYSBjb2RlIGZlbmNlLCB0cmFuc2l0aXZlbHkuIEEgbm90ZSBub3RoaW5nIGxpbmtzIHRvIGlzXG4gICAqIG9uZSBhIHJlYWRlciBjYW4gb25seSBmaW5kIGJ5IGJyb3dzaW5nIHRoZSBmaWxlIGxpc3QgXHUyMDE0IHdoaWNoIGlzIGV4YWN0bHkgd2hhdCB0aGUgZ3JvdXBlZCBpbmRleCBpbiB0aGVcbiAgICogc3RhcnQgbm90ZSBpcyBtZWFudCB0byByZXBsYWNlLiBXaGVuIHRoZSBzdGFydCBub3RlIGl0c2VsZiBpcyBtaXNzaW5nLCBFVkVSWSBub3RlIGlzIHVucmVhY2hhYmxlLFxuICAgKiBiZWNhdXNlIHRoZXJlIGlzIG5vd2hlcmUgdG8gc3RhcnQgZnJvbS5cbiAgICpcbiAgICogQHBhcmFtIHBhcmFtcyAtIFRoZSBwYXJhbWV0ZXJzIGZvciB0aGUgd2Fsay5cbiAgICogQHJldHVybnMgVGhlIHJlbGF0aXZlIHBhdGhzIG9mIHRoZSB1bnJlYWNoYWJsZSBub3Rlcy5cbiAgICovXG4gIHB1YmxpYyBmaW5kVW5yZWFjaGFibGVOb3RlcyhwYXJhbXM6IERlbW9WYXVsdENvdmVyYWdlQ2hlY2tlckZpbmRVbnJlYWNoYWJsZU5vdGVzUGFyYW1zKTogc3RyaW5nW10ge1xuICAgIGNvbnN0IG5vdGVzQnlSZWxhdGl2ZVBhdGggPSBuZXcgTWFwKHRoaXMuY29sbGVjdE5vdGVzKCkubWFwKChub3RlKSA9PiBbbm90ZS5yZWxhdGl2ZVBhdGgsIG5vdGVdKSk7XG4gICAgY29uc3QgcmVhY2hlZE5vdGVzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gICAgY29uc3QgcGVuZGluZ05vdGVzID0gW3BhcmFtcy5zdGFydE5vdGVdO1xuXG4gICAgd2hpbGUgKHBlbmRpbmdOb3Rlcy5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBub3RlUGF0aCA9IGVuc3VyZU5vbk51bGxhYmxlKHBlbmRpbmdOb3Rlcy5wb3AoKSk7XG4gICAgICBjb25zdCBub3RlID0gbm90ZXNCeVJlbGF0aXZlUGF0aC5nZXQobm90ZVBhdGgpO1xuICAgICAgaWYgKCFub3RlIHx8IHJlYWNoZWROb3Rlcy5oYXMobm90ZVBhdGgpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgcmVhY2hlZE5vdGVzLmFkZChub3RlUGF0aCk7XG4gICAgICBwZW5kaW5nTm90ZXMucHVzaCguLi5jb2xsZWN0Tm90ZUxpbmtUYXJnZXRzKG5vdGUpKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5jb2xsZWN0Q2hlY2thYmxlTm90ZXMoKVxuICAgICAgLm1hcCgobm90ZSkgPT4gbm90ZS5yZWxhdGl2ZVBhdGgpXG4gICAgICAuZmlsdGVyKChub3RlUGF0aCkgPT4gIXJlYWNoZWROb3Rlcy5oYXMobm90ZVBhdGgpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQYXJzZXMgdGhlIG5hbWVzIG9mIHRoZSBgZXhwb3J0IGZ1bmN0aW9uYHMgKGluY2x1ZGluZyBgYXN5bmNgIGFuZCBnZW5lcmF0b3IgZGVjbGFyYXRpb25zKSBpbiBhIHNvdXJjZSBmaWxlLlxuICAgKlxuICAgKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIHRoZSBsb29rdXAuXG4gICAqIEByZXR1cm5zIFRoZSBleHBvcnRlZCBmdW5jdGlvbiBuYW1lcyBpbiBzb3VyY2Ugb3JkZXIuXG4gICAqL1xuICBwdWJsaWMgZ2V0RXhwb3J0ZWRGdW5jdGlvbk5hbWVzKHBhcmFtczogRGVtb1ZhdWx0Q292ZXJhZ2VDaGVja2VyR2V0RXhwb3J0ZWRGdW5jdGlvbk5hbWVzUGFyYW1zKTogc3RyaW5nW10ge1xuICAgIGNvbnN0IHNvdXJjZSA9IHJlYWRGaWxlU3luYyhqb2luKHRoaXMucm9vdEZvbGRlciwgcGFyYW1zLnNvdXJjZVBhdGgpLCAndXRmLTgnKTtcbiAgICByZXR1cm4gWy4uLnNvdXJjZS5tYXRjaEFsbCgvXmV4cG9ydCAoPzphc3luYyApP2Z1bmN0aW9uXFwqPyAoPzxuYW1lPlxcdyspL2dtKV1cbiAgICAgIC5tYXAoKG1hdGNoKSA9PiBnZXRNYW5kYXRvcnlOYW1lZEdyb3VwKG1hdGNoLCAnbmFtZScpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQYXJzZXMgdGhlIG1lbWJlcnMgb2YgYW4gYGV4cG9ydCBpbnRlcmZhY2VgLCBgZXhwb3J0IGNsYXNzYCwgb3IgYGV4cG9ydCBlbnVtYCBkZWNsYXJlZCBpbiBhIHNvdXJjZSBmaWxlLlxuICAgKlxuICAgKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIHRoZSBsb29rdXAuXG4gICAqIEByZXR1cm5zIFRoZSBwYXJzZWQge0BsaW5rIEludGVyZmFjZU1lbWJlcnN9LlxuICAgKiBAdGhyb3dzIFdoZW4gdGhlIGludGVyZmFjZSwgY2xhc3MsIG9yIGVudW0gY2Fubm90IGJlIGZvdW5kIGluIHRoZSBzb3VyY2UgZmlsZS5cbiAgICovXG4gIHB1YmxpYyBnZXRJbnRlcmZhY2VNZW1iZXJzKHBhcmFtczogRGVtb1ZhdWx0Q292ZXJhZ2VDaGVja2VyR2V0SW50ZXJmYWNlTWVtYmVyc1BhcmFtcyk6IEludGVyZmFjZU1lbWJlcnMge1xuICAgIGNvbnN0IHNvdXJjZSA9IHJlYWRGaWxlU3luYyhqb2luKHRoaXMucm9vdEZvbGRlciwgcGFyYW1zLnNvdXJjZVBhdGgpLCAndXRmLTgnKTtcbiAgICBjb25zdCBtYXRjaCA9IG5ldyBSZWdFeHAoU3RyaW5nLnJhd2BleHBvcnQgKD88a2V5d29yZD5pbnRlcmZhY2V8Y2xhc3N8ZW51bSkgJHtwYXJhbXMuaW50ZXJmYWNlTmFtZX1cXGJbXntdKlxceyg/PGJvZHk+W1xcc1xcU10qPylcXG5cXH1gKS5leGVjKHNvdXJjZSk7XG4gICAgaWYgKCFtYXRjaCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBDb3VsZCBub3QgZmluZCBpbnRlcmZhY2UgJHtwYXJhbXMuaW50ZXJmYWNlTmFtZX1gKTtcbiAgICB9XG4gICAgcmV0dXJuIHBhcnNlTWVtYmVycyhnZXRNYW5kYXRvcnlOYW1lZEdyb3VwKG1hdGNoLCAna2V5d29yZCcpLCBnZXRNYW5kYXRvcnlOYW1lZEdyb3VwKG1hdGNoLCAnYm9keScpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWFkcyBhbmQgY2FjaGVzIHRoZSBkZW1vIGNvcnB1cyBcdTIwMTQgZXZlcnkgYCoubWRgIG5vdGUgaW4gdGhlIGRlbW8gdmF1bHQgam9pbmVkIGludG8gb25lIHN0cmluZy5cbiAgICpcbiAgICogQHJldHVybnMgVGhlIGNvbmNhdGVuYXRlZCBkZW1vLW5vdGUgY29udGVudHMuXG4gICAqL1xuICBwdWJsaWMgcmVhZENvcnB1cygpOiBzdHJpbmcge1xuICAgIHRoaXMuY2FjaGVkQ29ycHVzID8/PSB0aGlzLmNvbGxlY3ROb3RlcygpXG4gICAgICAubWFwKChub3RlKSA9PiBub3RlLmNvbnRlbnQpXG4gICAgICAuam9pbignXFxuJyk7XG4gICAgcmV0dXJuIHRoaXMuY2FjaGVkQ29ycHVzO1xuICB9XG5cbiAgLy8gVGhlIG5vdGVzIHRoZSBhdXRob3JpbmcgY2hlY2tzIGFwcGx5IHRvOiBldmVyeSBub3RlIGV4Y2VwdCB0aGUgb25lcyBkZWNsYXJlZCBvdXRzaWRlIHRoZSBsZWFybmluZ1xuICAvLyBwYXRoICh0aGUgdmF1bHQncyBvd24gYFJFQURNRS5tZGAgYnkgZGVmYXVsdCkuXG4gIHByaXZhdGUgY29sbGVjdENoZWNrYWJsZU5vdGVzKCk6IERlbW9WYXVsdE5vdGVbXSB7XG4gICAgcmV0dXJuIHRoaXMuY29sbGVjdE5vdGVzKCkuZmlsdGVyKChub3RlKSA9PiAhdGhpcy5leGNsdWRlZE5vdGVzLmhhcyhub3RlLnJlbGF0aXZlUGF0aCkpO1xuICB9XG5cbiAgcHJpdmF0ZSBjb2xsZWN0TWFya2Rvd25GaWxlcyhmb2xkZXI6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgICBjb25zdCByZXN1bHQ6IHN0cmluZ1tdID0gW107XG4gICAgLy8gYHJlYWRkaXJTeW5jYCByZXR1cm5zIGVudHJpZXMgaW4gdGhlIGZpbGUgc3lzdGVtJ3Mgb3duIG9yZGVyOiBieSBuYW1lIG9uIE5URlMsIGJ1dCBieSBoYXNoIG9uIGV4dDQsIHNvXG4gICAgLy8gc29ydCB0aGVtIHNvIGV2ZXJ5IGNoZWNrIHJlcG9ydHMgaXRzIG5vdGVzIGluIHRoZSBzYW1lIG9yZGVyIG9uIGV2ZXJ5IHBsYXRmb3JtLlxuICAgIGNvbnN0IGVudHJpZXMgPSByZWFkZGlyU3luYyhmb2xkZXIsIHsgd2l0aEZpbGVUeXBlczogdHJ1ZSB9KS5zb3J0KChhLCBiKSA9PiBhLm5hbWUubG9jYWxlQ29tcGFyZShiLm5hbWUsICdlbicpKTtcbiAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIGVudHJpZXMpIHtcbiAgICAgIGlmIChlbnRyeS5pc0RpcmVjdG9yeSgpKSB7XG4gICAgICAgIGlmIChlbnRyeS5uYW1lID09PSBPYnNpZGlhblBsdWdpblJlcG9QYXRocy5Ob2RlTW9kdWxlcyBhcyBzdHJpbmcpIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICByZXN1bHQucHVzaCguLi50aGlzLmNvbGxlY3RNYXJrZG93bkZpbGVzKGpvaW4oZm9sZGVyLCBlbnRyeS5uYW1lKSkpO1xuICAgICAgfSBlbHNlIGlmIChlbnRyeS5uYW1lLmVuZHNXaXRoKCcubWQnKSkge1xuICAgICAgICByZXN1bHQucHVzaChqb2luKGZvbGRlciwgZW50cnkubmFtZSkpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG59XG5cbi8qKlxuICogUmVnaXN0ZXJzIGEgYHZpdGVzdGAgc3VpdGUgdGhhdCBrZWVwcyBhIHBsdWdpbidzIGluLXJlcG8gYGRlbW8tdmF1bHQvYCBpbiBzeW5jIHdpdGggaXRzIHB1YmxpYyBzdXJmYWNlLlxuICpcbiAqIENhbGwgaXQgb25jZSBmcm9tIGEgcGx1Z2luJ3MgYGRlbW8tdmF1bHQubm8tYXBwLmludGVncmF0aW9uLnRlc3QudHNgOyBpdCByZWdpc3RlcnMgb25lIHRlc3QgcGVyIGNoZWNrLFxuICogZGVsZWdhdGluZyB0byB7QGxpbmsgRGVtb1ZhdWx0Q292ZXJhZ2VDaGVja2VyfS5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIGRlY2xhcmF0aXZlIGNvdmVyYWdlIHNwZWNpZmljYXRpb24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZWdpc3RlckRlbW9WYXVsdENvdmVyYWdlU3VpdGUocGFyYW1zOiBSZWdpc3RlckRlbW9WYXVsdENvdmVyYWdlU3VpdGVQYXJhbXMpOiB2b2lkIHtcbiAgY29uc3QgY2hlY2tlciA9IG5ldyBEZW1vVmF1bHRDb3ZlcmFnZUNoZWNrZXIobm9ybWFsaXplT3B0aW9uYWxQcm9wZXJ0aWVzPERlbW9WYXVsdENvdmVyYWdlQ2hlY2tlckNvbnN0cnVjdG9yUGFyYW1zPih7XG4gICAgZXhjbHVkZWROb3RlczogcGFyYW1zLmF1dGhvcmluZz8uZXhjbHVkZWROb3RlcyxcbiAgICByb290Rm9sZGVyOiBwYXJhbXMucm9vdEZvbGRlclxuICB9KSk7XG4gIGNvbnN0IHN0YXJ0Tm90ZSA9IHBhcmFtcy5hdXRob3Jpbmc/LnN0YXJ0Tm90ZSA/PyBERUZBVUxUX1NUQVJUX05PVEU7XG5cbiAgZGVzY3JpYmUoJ2RlbW8tdmF1bHQgY292ZXJhZ2UnLCAoKSA9PiB7XG4gICAgZm9yIChjb25zdCBzcGVjIG9mIHBhcmFtcy5pbnRlcmZhY2VzID8/IFtdKSB7XG4gICAgICBpdChgZGVtb25zdHJhdGVzIGV2ZXJ5ICR7c3BlYy5pbnRlcmZhY2VOYW1lfSAke3NwZWMua2luZH1gLCAoKSA9PiB7XG4gICAgICAgIGNvbnN0IG1lbWJlcnMgPSBjaGVja2VyLmdldEludGVyZmFjZU1lbWJlcnMoc3BlYyk7XG4gICAgICAgIGNvbnN0IGRlbW9uc3RyYXRlZCA9IG1lbWJlcnNbc3BlYy5raW5kXTtcbiAgICAgICAgZXhwZWN0KGRlbW9uc3RyYXRlZC5sZW5ndGgpLnRvQmVHcmVhdGVyVGhhbigwKTtcbiAgICAgICAgZXhwZWN0KGNoZWNrZXIuZmluZFVuZGVtb25zdHJhdGVkTWVtYmVycyh7IG1lbWJlcnM6IGRlbW9uc3RyYXRlZCwgcmVjZWl2ZXI6IHNwZWMucmVjZWl2ZXIgfSkpLnRvRXF1YWwoW10pO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KGByZWZlcmVuY2VzIG5vICR7c3BlYy5pbnRlcmZhY2VOYW1lfSBtZW1iZXIgdGhhdCBubyBsb25nZXIgZXhpc3RzYCwgKCkgPT4ge1xuICAgICAgICBjb25zdCBtZW1iZXJzID0gY2hlY2tlci5nZXRJbnRlcmZhY2VNZW1iZXJzKHNwZWMpO1xuICAgICAgICBleHBlY3QoY2hlY2tlci5maW5kU3RhbGVSZWZlcmVuY2VzKHsgcmVjZWl2ZXI6IHNwZWMucmVjZWl2ZXIsIHZhbGlkTWVtYmVyczogbWVtYmVycy5hbGwgfSkpLnRvRXF1YWwoW10pO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBzcGVjIG9mIHBhcmFtcy5jb25maWdJbnRlcmZhY2VzID8/IFtdKSB7XG4gICAgICBpdChgZGVtb25zdHJhdGVzIGV2ZXJ5ICR7c3BlYy5pbnRlcmZhY2VOYW1lfSBvcHRpb25gLCAoKSA9PiB7XG4gICAgICAgIGNvbnN0IG1lbWJlcnMgPSBjaGVja2VyLmdldEludGVyZmFjZU1lbWJlcnMoc3BlYyk7XG4gICAgICAgIGV4cGVjdChtZW1iZXJzLnByb3BlcnRpZXMubGVuZ3RoKS50b0JlR3JlYXRlclRoYW4oMCk7XG4gICAgICAgIGV4cGVjdChjaGVja2VyLmZpbmRVbmRlbW9uc3RyYXRlZE1lbWJlcnMoeyBtZW1iZXJzOiBtZW1iZXJzLnByb3BlcnRpZXMgfSkpLnRvRXF1YWwoW10pO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBzcGVjIG9mIHBhcmFtcy5mdW5jdGlvbk1vZHVsZXMgPz8gW10pIHtcbiAgICAgIGl0KGBkZW1vbnN0cmF0ZXMgZXZlcnkgZXhwb3J0ZWQgZnVuY3Rpb24gaW4gJHtzcGVjLnNvdXJjZVBhdGh9YCwgKCkgPT4ge1xuICAgICAgICBjb25zdCBmdW5jdGlvbk5hbWVzID0gY2hlY2tlci5nZXRFeHBvcnRlZEZ1bmN0aW9uTmFtZXMoc3BlYyk7XG4gICAgICAgIGV4cGVjdChmdW5jdGlvbk5hbWVzLmxlbmd0aCkudG9CZUdyZWF0ZXJUaGFuKDApO1xuICAgICAgICBleHBlY3QoY2hlY2tlci5maW5kVW5kZW1vbnN0cmF0ZWRNZW1iZXJzKHsgbWVtYmVyczogZnVuY3Rpb25OYW1lcyB9KSkudG9FcXVhbChbXSk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBjb25zdCBkb2NzID0gcGFyYW1zLmRvY3M7XG4gICAgaWYgKGRvY3MpIHtcbiAgICAgIGl0KCdsaW5rcyBhIGRlbW8gbm90ZSBmb3IgZXZlcnkgZmVhdHVyZSBkb2MnLCAoKSA9PiB7XG4gICAgICAgIGV4cGVjdChjaGVja2VyLmZpbmRVbmxpbmtlZEZlYXR1cmVEb2NzKHsgZG9jc0ZvbGRlcjogZG9jcy5mb2xkZXIsIG5vbkZlYXR1cmVEb2NzOiBkb2NzLm5vbkZlYXR1cmVEb2NzIH0pKVxuICAgICAgICAgIC50b0VxdWFsKFtdKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGl0KCdvcGVucyBldmVyeSBub3RlIHdpdGggYW4gSDEnLCAoKSA9PiB7XG4gICAgICBleHBlY3QoY2hlY2tlci5maW5kTm90ZXNXaXRob3V0SDEoKSkudG9FcXVhbChbXSk7XG4gICAgfSk7XG5cbiAgICBpdCgnb3BlbnMgZXZlcnkgbm90ZSB3aXRoIGEgcHJvc2UgcGFyYWdyYXBoIGJlZm9yZSBpdHMgZmlyc3QgY29kZSBibG9jaycsICgpID0+IHtcbiAgICAgIGV4cGVjdChjaGVja2VyLmZpbmROb3Rlc1dpdGhvdXRJbnRyb1Byb3NlKCkpLnRvRXF1YWwoW10pO1xuICAgIH0pO1xuXG4gICAgaXQoYHJlYWNoZXMgZXZlcnkgbm90ZSBmcm9tICR7c3RhcnROb3RlfWAsICgpID0+IHtcbiAgICAgIGV4cGVjdChjaGVja2VyLmZpbmRVbnJlYWNoYWJsZU5vdGVzKHsgc3RhcnROb3RlIH0pKS50b0VxdWFsKFtdKTtcbiAgICB9KTtcblxuICAgIGl0KCd1c2VzIG5vIHdpa2lsaW5rcywgd2hpY2ggZG8gbm90IHJlbmRlciBvbiBHaXRIdWInLCAoKSA9PiB7XG4gICAgICBleHBlY3QoY2hlY2tlci5maW5kTm90ZXNXaXRoV2lraWxpbmtzKCkpLnRvRXF1YWwoW10pO1xuICAgIH0pO1xuXG4gICAgaXQoJ2p1c3RpZmllcyBldmVyeSB3aWtpbGluayBhbGxvd2FuY2UsIGFuZCBkZWNsYXJlcyBub25lIGl0IG5vIGxvbmdlciBuZWVkcycsICgpID0+IHtcbiAgICAgIGV4cGVjdChjaGVja2VyLmZpbmROb3Rlc1dpdGhVbmp1c3RpZmllZFdpa2lsaW5rQWxsb3dhbmNlKCkpLnRvRXF1YWwoW10pO1xuICAgIH0pO1xuXG4gICAgaXQoJ2NhcnJpZXMgbm8gRG9jcyBsaW5rIGxpbmUsIGJlY2F1c2UgdGhlIG5vdGUgaXMgdGhlIGRvY3MnLCAoKSA9PiB7XG4gICAgICBleHBlY3QoY2hlY2tlci5maW5kTm90ZXNXaXRoRG9jc0xpbmtzKCkpLnRvRXF1YWwoW10pO1xuICAgIH0pO1xuXG4gICAgaXQoJ2NvbW1pdHMgbm9uZSBvZiB0aGUgYXBwLmpzb24gc2V0dGluZ3Mgb2JzaWRpYW4tZGV2LXV0aWxzIGluamVjdHMgYXQgcmVsZWFzZSB0aW1lJywgKCkgPT4ge1xuICAgICAgZXhwZWN0KGNoZWNrZXIuZmluZENvbW1pdHRlZEFwcEpzb25TZXR0aW5ncygpKS50b0VxdWFsKFtdKTtcbiAgICB9KTtcblxuICAgIC8vIFdpdGggbm8gbm90ZXMgdG8gcmVhZCwgZXZlcnkgYXV0aG9yaW5nIGNoZWNrIGFib3ZlIHBhc3NlcyBieSBoYXZpbmcgbm90aGluZyB0byBsb29rIGF0LCBzbyBhIHZhdWx0XG4gICAgLy8gdGhhdCBzdG9wcGVkIGJlaW5nIGZvdW5kIHdvdWxkIGdvIG9uIHJlcG9ydGluZyBpdHNlbGYgY2xlYW4uIFRoaXMgaXMgdGhlIGhhbGYgb2YgdGhlIG5vbi10cml2aWFsXG4gICAgLy8gZ3VhcmQgdGhhdCBzdGlsbCBhcHBsaWVzIHdoZW4gdGhlIHBsdWdpbiBleHBvc2VzIG5vdGhpbmcgdG8gcmVmbGVjdC5cbiAgICBpdCgncmVhZHMgYSBub24tZW1wdHkgZGVtbyB2YXVsdCcsICgpID0+IHtcbiAgICAgIGV4cGVjdChjaGVja2VyLmNvbGxlY3REZW1vTm90ZVJlbGF0aXZlUGF0aHMoKS5sZW5ndGgpLnRvQmVHcmVhdGVyVGhhbigwKTtcbiAgICB9KTtcblxuICAgIGNvbnN0IGd1YXJkID0gcGFyYW1zLm5vblRyaXZpYWxHdWFyZDtcbiAgICBpZiAoZ3VhcmQpIHtcbiAgICAgIGl0KCdrZWVwcyB0aGUgcmVmbGVjdGVkIHN1cmZhY2Ugbm9uLXRyaXZpYWwnLCAoKSA9PiB7XG4gICAgICAgIGNvbnN0IG1lbWJlcnMgPSBjaGVja2VyLmdldEludGVyZmFjZU1lbWJlcnMoZ3VhcmQpO1xuICAgICAgICBleHBlY3QobWVtYmVycy5hbGwpLnRvQ29udGFpbihndWFyZC5leHBlY3RNZW1iZXIpO1xuICAgICAgICBleHBlY3QoY2hlY2tlci5jb2xsZWN0RGVtb05vdGVSZWxhdGl2ZVBhdGhzKCkpLnRvQ29udGFpbihndWFyZC5leHBlY3REZW1vTm90ZSk7XG4gICAgICB9KTtcbiAgICB9XG4gIH0pO1xufVxuXG5jb25zdCBDTEFTU19NRU1CRVJfTU9ESUZJRVJTID0gU3RyaW5nLnJhd2AoPzooPzpwdWJsaWN8cHJpdmF0ZXxwcm90ZWN0ZWR8cmVhZG9ubHl8c3RhdGljfGFic3RyYWN0fG92ZXJyaWRlKVxccyspKmA7XG5jb25zdCBBQlNPTFVURV9VUkxfUkVHX0VYUCA9IC9eW2Etel1bXFx3Ky4tXSo6L2k7XG5jb25zdCBBUlJPV19SRUdfRVhQID0gL15cXHMqPT4vO1xuY29uc3QgRlVOQ1RJT05fVFlQRV9QQVJBTUVURVJTX1JFR19FWFAgPSAvXjxbXj5dKj5cXHMqLztcbmNvbnN0IEFOR0xFX0JSQUNLRVRTX1JFR19FWFAgPSAvXjx8PiQvZztcbmNvbnN0IENPREVfRkVOQ0VfUkVHX0VYUCA9IC9eXFxzKig/OmBgYHx+fn4pLztcbmNvbnN0IERFRkFVTFRfRVhDTFVERURfTk9URVMgPSBbJ1JFQURNRS5tZCddO1xuY29uc3QgREVGQVVMVF9TVEFSVF9OT1RFID0gJzAwIFN0YXJ0Lm1kJztcbmNvbnN0IERPQ1NfTElOS19SRUdfRVhQID0gL15cXHMqXFxbRG9jc11cXCgvO1xuY29uc3QgRlJPTlRNQVRURVJfUkVHX0VYUCA9IC9eLS0tXFxyP1xcbltcXHNcXFNdKj9cXHI/XFxuLS0tW15cXFNcXG5dKlxccj9cXG4/LztcbmNvbnN0IEgxX1JFR19FWFAgPSAvXiMgXFxTLztcbmNvbnN0IEhFQURJTkdfUkVHX0VYUCA9IC9eI3sxLDZ9IC87XG5jb25zdCBJTkxJTkVfQ09ERV9SRUdfRVhQID0gL2BbXmBcXG5dKmAvZztcbmNvbnN0IE1BUktET1dOX0xJTktfUkVHX0VYUCA9IC9cXFtbXlxcXV0qXVxcKCg/PHRhcmdldD5bXildKylcXCkvZztcbi8vIEFuIGlubGluZSBkaXJlY3RpdmUsIHNoYXBlZCBhZnRlciBFU0xpbnQncyBhbmQgd3JpdHRlbiBhcyBhbiBIVE1MIGNvbW1lbnQgc28gaXQgaXMgaW52aXNpYmxlIEJPVEggaW5cbi8vIE9ic2lkaWFuIGFuZCBvbiBHaXRIdWIgXHUyMDE0IHRoZSBzYW1lIHNwZWxsaW5nIHRoZSB2YXVsdHMgYWxyZWFkeSB1c2UgZm9yIGBtYXJrZG93bmxpbnQtZGlzYWJsZS1uZXh0LWxpbmVgLlxuLy8gQW4gT2JzaWRpYW4gYCUlIFx1MjAyNiAlJWAgY29tbWVudCB3b3VsZCBzaG93IHVwIGFzIGxpdGVyYWwgdGV4dCBvbiBHaXRIdWIsIHdoaWNoIGlzIGhhbGYgdGhlIHJlYWRlcnNoaXAuXG5jb25zdCBESVJFQ1RJVkVfUkVHX0VYUCA9IC9eXFxzKjwhLS1cXHMqb2JzaWRpYW4tZGV2LXV0aWxzLSg/PGFjdGlvbj5kaXNhYmxlLW5leHQtbGluZXxkaXNhYmxlfGVuYWJsZSlcXHMrKD88cnVsZT5bXFx3LV0rXFwvW1xcdy1dKykoPzpcXHMrLS1cXHMrKD88cmVhc29uPi4qPykpP1xccyotLT5cXHMqJC87XG4vLyBDYXRjaGVzIGEgZGlyZWN0aXZlIHRoYXQgd2FzIE1FQU5UIHRvIGJlIG9uZSBidXQgaXMgbWlzc3BlbGxlZDogaXQgd291bGQgb3RoZXJ3aXNlIHJlYWQgYXMgYW4gb3JkaW5hcnlcbi8vIGNvbW1lbnQgYW5kIHNpbGVudGx5IGRvIG5vdGhpbmcsIHdoaWNoIGlzIHRoZSBmYWlsdXJlIG1vZGUgYSBzdXBwcmVzc2lvbiBzeW50YXggbXVzdCBuZXZlciBoYXZlLlxuY29uc3QgRElSRUNUSVZFX1BST0JFX1JFR19FWFAgPSAvPCEtLVxccypvYnNpZGlhbi1kZXYtdXRpbHMtLztcbmNvbnN0IFdJS0lMSU5LX1JVTEUgPSAnZGVtby12YXVsdC12YWxpZGF0aW9uL25vLXdpa2lsaW5rcyc7XG4vLyBUaGUgYG9ic2lkaWFuLWRldi11dGlscyA+IGRlbW8tdmF1bHQtdmFsaWRhdGlvbiA+IGFsbG93LXdpa2lsaW5rc2AgZnJvbnRtYXR0ZXIgcGF0aCwgYXQgYW55IGluZGVudGF0aW9uOlxuLy8gVGhlIGtleXMgbXVzdCBuZXN0IGluIHRoYXQgb3JkZXIsIGFuZCBhbnkgbGluZSBiZXR3ZWVuIHRoZW0gaGFzIHRvIHN0YXkgaW5kZW50ZWQsIHNvIGEgZGVkZW50IHRvIHRoZVxuLy8gZG9jdW1lbnQncyBvd24gdG9wIGxldmVsIGVuZHMgdGhlIG1hdGNoIHJhdGhlciB0aGFuIHJlYWNoaW5nIGEgc2FtZS1uYW1lZCBrZXkgdW5kZXIgYW5vdGhlciBwYXJlbnQuXG5jb25zdCBXSUtJTElOS19BTExPV0FOQ0VfUkVHX0VYUCA9IC9eb2JzaWRpYW4tZGV2LXV0aWxzOlteXFxTXFxuXSpcXG4oPzpbXlxcU1xcbl0rLipcXG4pKj9bXlxcU1xcbl0rZGVtby12YXVsdC12YWxpZGF0aW9uOlteXFxTXFxuXSpcXG4oPzpbXlxcU1xcbl0rLipcXG4pKj9bXlxcU1xcbl0rYWxsb3ctd2lraWxpbmtzOig/PHJlYXNvbj4uKikkL207XG5jb25zdCBXSUtJTElOS19SRUdfRVhQID0gL1xcW1xcW1teXFxdXStdXS87XG5cbi8vIEFwcGxpZXMgb25lIHBhcnNlZCBkaXJlY3RpdmUgdG8gdGhlIHNjYW4uXG5mdW5jdGlvbiBhcHBseVdpa2lsaW5rRGlyZWN0aXZlKHN0YXRlOiBXaWtpbGlua0RpcmVjdGl2ZVNjYW5TdGF0ZSwgbGluZUluZGV4OiBudW1iZXIsIG1hdGNoOiBSZWdFeHBFeGVjQXJyYXkpOiB2b2lkIHtcbiAgY29uc3QgYWN0aW9uID0gZ2V0TWFuZGF0b3J5TmFtZWRHcm91cChtYXRjaCwgJ2FjdGlvbicpO1xuICBjb25zdCBydWxlID0gZ2V0TWFuZGF0b3J5TmFtZWRHcm91cChtYXRjaCwgJ3J1bGUnKTtcbiAgY29uc3QgcmVhc29uID0gbWF0Y2guZ3JvdXBzPy5bJ3JlYXNvbiddPy50cmltKCkgPz8gJyc7XG4gIGlmIChydWxlICE9PSBXSUtJTElOS19SVUxFKSB7XG4gICAgc3RhdGUucHJvYmxlbXMucHVzaChgYW4gdW5rbm93biBydWxlIFwiJHtydWxlfVwiIG9uICR7Zm9ybWF0TGluZU51bWJlcihsaW5lSW5kZXgpfWApO1xuICAgIHJldHVybjtcbiAgfVxuICBpZiAoYWN0aW9uICE9PSAnZW5hYmxlJyAmJiByZWFzb24gPT09ICcnKSB7XG4gICAgc3RhdGUucHJvYmxlbXMucHVzaChgYSBkaXJlY3RpdmUgd2l0aCBubyByZWFzb24gb24gJHtmb3JtYXRMaW5lTnVtYmVyKGxpbmVJbmRleCl9YCk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKGFjdGlvbiA9PT0gJ2Rpc2FibGUtbmV4dC1saW5lJykge1xuICAgIHN0YXRlLnBlbmRpbmdOZXh0TGluZUluZGV4ID0gbGluZUluZGV4O1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGlmIChhY3Rpb24gPT09ICdkaXNhYmxlJykge1xuICAgIGlmIChzdGF0ZS5vcGVuUmVnaW9uKSB7XG4gICAgICBzdGF0ZS5wcm9ibGVtcy5wdXNoKGBhIGRpc2FibGUgb24gJHtmb3JtYXRMaW5lTnVtYmVyKGxpbmVJbmRleCl9IGluc2lkZSB0aGUgcmVnaW9uIG9wZW5lZCBvbiAke2Zvcm1hdExpbmVOdW1iZXIoc3RhdGUub3BlblJlZ2lvbi5saW5lSW5kZXgpfWApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBzdGF0ZS5vcGVuUmVnaW9uID0geyBpc1VzZWQ6IGZhbHNlLCBsaW5lSW5kZXggfTtcbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAoIXN0YXRlLm9wZW5SZWdpb24pIHtcbiAgICBzdGF0ZS5wcm9ibGVtcy5wdXNoKGBhbiBlbmFibGUgb24gJHtmb3JtYXRMaW5lTnVtYmVyKGxpbmVJbmRleCl9IHdpdGggbm8gcmVnaW9uIG9wZW5gKTtcbiAgICByZXR1cm47XG4gIH1cbiAgaWYgKCFzdGF0ZS5vcGVuUmVnaW9uLmlzVXNlZCkge1xuICAgIHN0YXRlLnByb2JsZW1zLnB1c2goYGEgcmVnaW9uIG9wZW5lZCBvbiAke2Zvcm1hdExpbmVOdW1iZXIoc3RhdGUub3BlblJlZ2lvbi5saW5lSW5kZXgpfSBjb3ZlcmluZyBubyB3aWtpbGlua2ApO1xuICB9XG4gIHN0YXRlLm9wZW5SZWdpb24gPSBudWxsO1xufVxuXG4vLyBBcHBsaWVzIG9uZSBvcmRpbmFyeSBsaW5lIHRvIHRoZSBzY2FuOiBhbiBvcGVuIHJlZ2lvbiBjb3ZlcnMgaXQsIGFuZCBhIHBlbmRpbmcgYGRpc2FibGUtbmV4dC1saW5lYFxuLy8gY2xhaW1zIHRoZSBmaXJzdCBsaW5lIHdpdGggY29udGVudCBvbiBpdCBcdTIwMTQgdGhlIGRpcmVjdGl2ZSBhbmQgaXRzIHRhcmdldCBhcmUgdXN1YWxseSBhIGJsYW5rIGxpbmUgYXBhcnQuXG5mdW5jdGlvbiBhcHBseVdpa2lsaW5rU2NhbkxpbmUoc3RhdGU6IFdpa2lsaW5rRGlyZWN0aXZlU2NhblN0YXRlLCBsaW5lSW5kZXg6IG51bWJlciwgbGluZTogc3RyaW5nKTogdm9pZCB7XG4gIGlmIChzdGF0ZS5vcGVuUmVnaW9uKSB7XG4gICAgc3RhdGUuYWxsb3dlZExpbmVJbmRleGVzLmFkZChsaW5lSW5kZXgpO1xuICAgIHN0YXRlLm9wZW5SZWdpb24uaXNVc2VkIHx8PSBzdGF0ZS53aWtpbGlua0xpbmVJbmRleGVzLmhhcyhsaW5lSW5kZXgpO1xuICAgIHJldHVybjtcbiAgfVxuICBpZiAoc3RhdGUucGVuZGluZ05leHRMaW5lSW5kZXggPT09IG51bGwgfHwgbGluZS50cmltKCkgPT09ICcnKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIHN0YXRlLmFsbG93ZWRMaW5lSW5kZXhlcy5hZGQobGluZUluZGV4KTtcbiAgaWYgKCFzdGF0ZS53aWtpbGlua0xpbmVJbmRleGVzLmhhcyhsaW5lSW5kZXgpKSB7XG4gICAgc3RhdGUucHJvYmxlbXMucHVzaChgYSBkaXNhYmxlLW5leHQtbGluZSBvbiAke2Zvcm1hdExpbmVOdW1iZXIoc3RhdGUucGVuZGluZ05leHRMaW5lSW5kZXgpfSBjb3ZlcmluZyBubyB3aWtpbGlua2ApO1xuICB9XG4gIHN0YXRlLnBlbmRpbmdOZXh0TGluZUluZGV4ID0gbnVsbDtcbn1cblxuZnVuY3Rpb24gYnVpbGRNZW1iZXJzKG1ldGhvZHM6IHN0cmluZ1tdLCBwcm9wZXJ0aWVzOiBzdHJpbmdbXSk6IEludGVyZmFjZU1lbWJlcnMge1xuICByZXR1cm4ge1xuICAgIGFsbDogWy4uLm1ldGhvZHMsIC4uLnByb3BlcnRpZXNdLFxuICAgIG1ldGhvZHMsXG4gICAgcHJvcGVydGllc1xuICB9O1xufVxuXG4vLyBSZXNvbHZlcyB0aGUgbm90ZXMgYSBub3RlIGxpbmtzIHRvOiBldmVyeSBNYXJrZG93biBsaW5rIG91dHNpZGUgYSBjb2RlIGZlbmNlIHdob3NlIHRhcmdldCBpcyBhIGAubWRgXG4vLyBmaWxlLCBtYWRlIHJlbGF0aXZlIHRvIHRoZSBkZW1vIHZhdWx0IHNvIGl0IGNhbiBiZSBsb29rZWQgdXAgaW4gdGhlIG5vdGUgbWFwLiBFeHRlcm5hbCBVUkxzIGFuZFxuLy8gbm9uLW5vdGUgdGFyZ2V0cyAoaW1hZ2VzLCBzY3JpcHRzKSBhcmUgbm90IHBhcnQgb2YgdGhlIGxlYXJuaW5nIHBhdGggYW5kIGFyZSBza2lwcGVkOyBhIGAjYW5jaG9yYCBpc1xuLy8gZHJvcHBlZCwgc2luY2UgaXQgYWRkcmVzc2VzIGEgcGxhY2UgaW5zaWRlIGFuIGFscmVhZHktcmVzb2x2ZWQgbm90ZS5cbi8vIFJldHVybnMgdGhlIG5vdGUncyBsaW5lcyB3aXRoIGZlbmNlZCBjb2RlIGJsb2NrcyByZW1vdmVkICh0aGUgZmVuY2UgbGluZXMgaW5jbHVkZWQpLCBwYWlyZWQgd2l0aCB0aGVcbi8vIGxpbmUgbnVtYmVyIGVhY2ggY2FtZSBmcm9tLCBzbyBhIGNoZWNrIG5ldmVyIG1pc3Rha2VzIHNhbXBsZSBjb2RlIGZvciBwcm9zZSBcdTIwMTQgYSBgW1t3aWtpbGlua11dYFxuLy8gZGVtb25zdHJhdGVkIGluc2lkZSBhIGZlbmNlIGlzIHRleHQsIG5vdCBuYXZpZ2F0aW9uIFx1MjAxNCBhbmQgYW4gaW5saW5lIGRpcmVjdGl2ZSBjYW4gc3RpbGwgbmFtZSBhIGxpbmUuXG5mdW5jdGlvbiBjb2xsZWN0TGluZXNPdXRzaWRlRmVuY2VzKGNvbnRlbnQ6IHN0cmluZyk6IE5vdGVMaW5lW10ge1xuICBjb25zdCBub3RlTGluZXM6IE5vdGVMaW5lW10gPSBbXTtcbiAgbGV0IGlzSW5zaWRlRmVuY2UgPSBmYWxzZTtcbiAgZm9yIChjb25zdCBbaW5kZXgsIGxpbmVdIG9mIGNvbnRlbnQuc3BsaXQoJ1xcbicpLmVudHJpZXMoKSkge1xuICAgIGlmIChDT0RFX0ZFTkNFX1JFR19FWFAudGVzdChsaW5lKSkge1xuICAgICAgaXNJbnNpZGVGZW5jZSA9ICFpc0luc2lkZUZlbmNlO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGlmICghaXNJbnNpZGVGZW5jZSkge1xuICAgICAgbm90ZUxpbmVzLnB1c2goeyBpbmRleCwgbGluZSB9KTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG5vdGVMaW5lcztcbn1cblxuZnVuY3Rpb24gY29sbGVjdE5vdGVMaW5rVGFyZ2V0cyhub3RlOiBEZW1vVmF1bHROb3RlKTogc3RyaW5nW10ge1xuICBjb25zdCB0YXJnZXRzOiBzdHJpbmdbXSA9IFtdO1xuICBmb3IgKGNvbnN0IGxpbmUgb2YgZ2V0TGluZXNPdXRzaWRlRmVuY2VzKG5vdGUuY29udGVudCkpIHtcbiAgICBmb3IgKGNvbnN0IG1hdGNoIG9mIHN0cmlwSW5saW5lQ29kZShsaW5lKS5tYXRjaEFsbChNQVJLRE9XTl9MSU5LX1JFR19FWFApKSB7XG4gICAgICBjb25zdCB0YXJnZXQgPSBnZXRNYW5kYXRvcnlOYW1lZEdyb3VwKG1hdGNoLCAndGFyZ2V0JykucmVwbGFjZUFsbChBTkdMRV9CUkFDS0VUU19SRUdfRVhQLCAnJyk7XG4gICAgICBjb25zdCBbbm90ZVBhdGggPSAnJ10gPSB0YXJnZXQuc3BsaXQoJyMnLCAxKTtcbiAgICAgIGlmIChBQlNPTFVURV9VUkxfUkVHX0VYUC50ZXN0KG5vdGVQYXRoKSB8fCAhbm90ZVBhdGgudG9Mb3dlckNhc2UoKS5lbmRzV2l0aCgnLm1kJykpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICB0YXJnZXRzLnB1c2goam9pbihkaXJuYW1lKG5vdGUucmVsYXRpdmVQYXRoKSwgdHJ5RGVjb2RlVXJpQ29tcG9uZW50KG5vdGVQYXRoKSkpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gdGFyZ2V0cztcbn1cblxuZnVuY3Rpb24gZXh0cmFjdENsYXNzTWV0aG9kTmFtZXMoY2xhc3NCb2R5OiBzdHJpbmcpOiBzdHJpbmdbXSB7XG4gIHJldHVybiBbLi4uY2xhc3NCb2R5Lm1hdGNoQWxsKG5ldyBSZWdFeHAoU3RyaW5nLnJhd2BeIHsyfSg/PG1vZGlmaWVycz4ke0NMQVNTX01FTUJFUl9NT0RJRklFUlN9KSg/PG5hbWU+XFx3KykoPzo8W14+XSo+KT9cXChgLCAnZ20nKSldXG4gICAgLmZpbHRlcigobWF0Y2gpID0+ICFpc05vblB1YmxpY01lbWJlcihnZXRNYW5kYXRvcnlOYW1lZEdyb3VwKG1hdGNoLCAnbW9kaWZpZXJzJykpKVxuICAgIC5tYXAoKG1hdGNoKSA9PiBnZXRNYW5kYXRvcnlOYW1lZEdyb3VwKG1hdGNoLCAnbmFtZScpKTtcbn1cblxuZnVuY3Rpb24gZXh0cmFjdENsYXNzUHJvcGVydHlOYW1lcyhjbGFzc0JvZHk6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgcmV0dXJuIFsuLi5jbGFzc0JvZHkubWF0Y2hBbGwobmV3IFJlZ0V4cChTdHJpbmcucmF3YF4gezJ9KD88bW9kaWZpZXJzPiR7Q0xBU1NfTUVNQkVSX01PRElGSUVSU30pKD88bmFtZT5cXHcrKVxccypcXD8/XFxzKls6PV1gLCAnZ20nKSldXG4gICAgLmZpbHRlcigobWF0Y2gpID0+ICFpc05vblB1YmxpY01lbWJlcihnZXRNYW5kYXRvcnlOYW1lZEdyb3VwKG1hdGNoLCAnbW9kaWZpZXJzJykpKVxuICAgIC5tYXAoKG1hdGNoKSA9PiBnZXRNYW5kYXRvcnlOYW1lZEdyb3VwKG1hdGNoLCAnbmFtZScpKTtcbn1cblxuZnVuY3Rpb24gZXh0cmFjdEVudW1NZW1iZXJOYW1lcyhlbnVtQm9keTogc3RyaW5nKTogc3RyaW5nW10ge1xuICByZXR1cm4gWy4uLmVudW1Cb2R5Lm1hdGNoQWxsKC9eIHsyfSg/PG5hbWU+XFx3KykvZ20pXS5tYXAoKG1hdGNoKSA9PiBnZXRNYW5kYXRvcnlOYW1lZEdyb3VwKG1hdGNoLCAnbmFtZScpKTtcbn1cblxuLy8gQSBtZXRob2QgaXMgY2FsbGFibGUgc3VyZmFjZSBob3dldmVyIGl0IGlzIHdyaXR0ZW46IGEgbWV0aG9kIHNpZ25hdHVyZSAoYGZvbyhiYXI6IHN0cmluZyk6IHZvaWQ7YCkgb3IgYVxuLy8gcHJvcGVydHkgc2lnbmF0dXJlIHdob3NlIHR5cGUgaXMgYSBmdW5jdGlvbiB0eXBlIChgZm9vOiAoYmFyOiBzdHJpbmcpID0+IHZvaWQ7YCkuIFRoZSBzaGFyZWQgRVNMaW50IGNvbmZpZ1xuLy8gcnVucyBgQHR5cGVzY3JpcHQtZXNsaW50L21ldGhvZC1zaWduYXR1cmUtc3R5bGVgIGF0IGl0cyBgcHJvcGVydHlgIGRlZmF1bHQsIHNvIGBsaW50OmZpeGAgcmV3cml0ZXMgdGhlXG4vLyBmaXJzdCBzaGFwZSBpbnRvIHRoZSBzZWNvbmQgXHUyMDE0IHJlYWRpbmcgb25seSB0aGUgZmlyc3QgcmVwb3J0ZWQgemVybyBtZXRob2RzIGZvciBldmVyeSBzdWNoIGludGVyZmFjZS5cbmZ1bmN0aW9uIGV4dHJhY3RNZXRob2ROYW1lcyhpbnRlcmZhY2VCb2R5OiBzdHJpbmcpOiBzdHJpbmdbXSB7XG4gIGNvbnN0IG1ldGhvZFNpZ25hdHVyZU5hbWVzID0gWy4uLmludGVyZmFjZUJvZHkubWF0Y2hBbGwoL14gezJ9KD88bmFtZT5cXHcrKSg/OjxbXj5dKj4pP1xcKC9nbSldLm1hcCgobWF0Y2gpID0+IGdldE1hbmRhdG9yeU5hbWVkR3JvdXAobWF0Y2gsICduYW1lJykpO1xuICBjb25zdCBmdW5jdGlvblByb3BlcnR5TmFtZXMgPSBtYXRjaFByb3BlcnR5U2lnbmF0dXJlcyhpbnRlcmZhY2VCb2R5KVxuICAgIC5maWx0ZXIoKG1hdGNoKSA9PiBpc0Z1bmN0aW9uVHlwZShpbnRlcmZhY2VCb2R5LCBtYXRjaCkpXG4gICAgLm1hcCgobWF0Y2gpID0+IGdldE1hbmRhdG9yeU5hbWVkR3JvdXAobWF0Y2gsICduYW1lJykpO1xuICByZXR1cm4gWy4uLm1ldGhvZFNpZ25hdHVyZU5hbWVzLCAuLi5mdW5jdGlvblByb3BlcnR5TmFtZXNdO1xufVxuXG4vLyBFdmVyeSBwcm9wZXJ0eSBzaWduYXR1cmUgd2hvc2UgdHlwZSBpcyBub3QgYSBmdW5jdGlvbiB0eXBlLCBzbyBtZXRob2RzIGFuZCBwcm9wZXJ0aWVzIHN0YXkgYSBwYXJ0aXRpb24uXG5mdW5jdGlvbiBleHRyYWN0UHJvcGVydHlOYW1lcyhpbnRlcmZhY2VCb2R5OiBzdHJpbmcpOiBzdHJpbmdbXSB7XG4gIHJldHVybiBtYXRjaFByb3BlcnR5U2lnbmF0dXJlcyhpbnRlcmZhY2VCb2R5KVxuICAgIC5maWx0ZXIoKG1hdGNoKSA9PiAhaXNGdW5jdGlvblR5cGUoaW50ZXJmYWNlQm9keSwgbWF0Y2gpKVxuICAgIC5tYXAoKG1hdGNoKSA9PiBnZXRNYW5kYXRvcnlOYW1lZEdyb3VwKG1hdGNoLCAnbmFtZScpKTtcbn1cblxuLy8gVGhlIGxpbmUgbnVtYmVycyBjYXJyeWluZyBhIHdpa2lsaW5rIHRoYXQgaXMgbmF2aWdhdGlvbiByYXRoZXIgdGhhbiBzYW1wbGUgdGV4dC5cbmZ1bmN0aW9uIGZpbmRXaWtpbGlua0xpbmVJbmRleGVzKGNvbnRlbnQ6IHN0cmluZyk6IG51bWJlcltdIHtcbiAgcmV0dXJuIGNvbGxlY3RMaW5lc091dHNpZGVGZW5jZXMoY29udGVudClcbiAgICAuZmlsdGVyKChub3RlTGluZSkgPT4gV0lLSUxJTktfUkVHX0VYUC50ZXN0KHN0cmlwSW5saW5lQ29kZShub3RlTGluZS5saW5lKSkpXG4gICAgLm1hcCgobm90ZUxpbmUpID0+IG5vdGVMaW5lLmluZGV4KTtcbn1cblxuZnVuY3Rpb24gZm9ybWF0TGluZU51bWJlcihsaW5lSW5kZXg6IG51bWJlcik6IHN0cmluZyB7XG4gIHJldHVybiBgbGluZSAke1N0cmluZyhsaW5lSW5kZXggKyAxKX1gO1xufVxuXG5mdW5jdGlvbiBnZXRMaW5lc091dHNpZGVGZW5jZXMoY29udGVudDogc3RyaW5nKTogc3RyaW5nW10ge1xuICByZXR1cm4gY29sbGVjdExpbmVzT3V0c2lkZUZlbmNlcyhjb250ZW50KS5tYXAoKG5vdGVMaW5lKSA9PiBub3RlTGluZS5saW5lKTtcbn1cblxuLy8gV2hldGhlciB0aGUgbm90ZSdzIGZpcnN0IGNvbnRlbnQgbGluZSAoZnJvbnRtYXR0ZXIgYW5kIGJsYW5rIGxpbmVzIGFzaWRlKSBpcyBhbiBgIyBIMWAuXG5mdW5jdGlvbiBoYXNIMShjb250ZW50OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgZm9yIChjb25zdCBsaW5lIG9mIHN0cmlwRnJvbnRtYXR0ZXIoY29udGVudCkuc3BsaXQoJ1xcbicpKSB7XG4gICAgY29uc3QgdHJpbW1lZExpbmUgPSBsaW5lLnRyaW0oKTtcbiAgICBpZiAodHJpbW1lZExpbmUgPT09ICcnKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgcmV0dXJuIEgxX1JFR19FWFAudGVzdCh0cmltbWVkTGluZSk7XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG4vLyBXaGV0aGVyIGEgcGxhaW4gcHJvc2UgbGluZSBhcHBlYXJzIGJlZm9yZSB0aGUgbm90ZSdzIGZpcnN0IGNvZGUgZmVuY2UuIEhlYWRpbmdzIGFyZSBub3QgcHJvc2UgXHUyMDE0IGEgbm90ZVxuLy8gdGhhdCBnb2VzIHN0cmFpZ2h0IGZyb20gaXRzIHRpdGxlIHRvIGEgYnV0dG9uIGlzIGV4YWN0bHkgdGhlIHNoYXBlIHRoaXMgY2hlY2sgcmVqZWN0cy5cbmZ1bmN0aW9uIGhhc0ludHJvUHJvc2UoY29udGVudDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGZvciAoY29uc3QgbGluZSBvZiBzdHJpcEZyb250bWF0dGVyKGNvbnRlbnQpLnNwbGl0KCdcXG4nKSkge1xuICAgIGlmIChDT0RFX0ZFTkNFX1JFR19FWFAudGVzdChsaW5lKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBjb25zdCB0cmltbWVkTGluZSA9IGxpbmUudHJpbSgpO1xuICAgIGlmICh0cmltbWVkTGluZSA9PT0gJycgfHwgSEVBRElOR19SRUdfRVhQLnRlc3QodHJpbW1lZExpbmUpKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG4vLyBXaGV0aGVyIHRoZSBub3RlIG5hdmlnYXRlcyB3aXRoIGFuIE9ic2lkaWFuIGBbW3dpa2lsaW5rXV1gLiBGZW5jZWQgYmxvY2tzIGFuZCBpbmxpbmUgY29kZSBhcmUgc2FtcGxlXG4vLyB0ZXh0IHJhdGhlciB0aGFuIG5hdmlnYXRpb24sIHNvIHRoZXkgYXJlIHJlbW92ZWQgYmVmb3JlIGxvb2tpbmcuXG5mdW5jdGlvbiBoYXNXaWtpbGluayhjb250ZW50OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIGZpbmRXaWtpbGlua0xpbmVJbmRleGVzKGNvbnRlbnQpLmxlbmd0aCA+IDA7XG59XG5cbi8vIFdoZXRoZXIgdGhlIHByb3BlcnR5IHNpZ25hdHVyZSdzIHR5cGUsIHN0YXJ0aW5nIHJpZ2h0IGFmdGVyIGl0cyBgOmAsIGlzIGEgZnVuY3Rpb24gdHlwZTogYW4gb3B0aW9uYWwgdHlwZVxuLy8gcGFyYW1ldGVyIGxpc3QsIGEgcGFyYW1ldGVyIGxpc3QsIHRoZW4gYD0+YC4gVGhlIHBhcmFtZXRlciBsaXN0IGlzIHdhbGtlZCBieSBicmFja2V0IGRlcHRoIHJhdGhlciB0aGFuIGJ5IGFcbi8vIHJlZ3VsYXIgZXhwcmVzc2lvbiwgc28gYSBwYXJlbnRoZXNpemVkIG5vbi1mdW5jdGlvbiB0eXBlIChgKHN0cmluZyB8IG51bWJlcilbXWApIGFuZCBhIHBhcmFtZXRlciB3aG9zZSBvd25cbi8vIHR5cGUgaG9sZHMgcGFyZW50aGVzZXMgKGAoY2FsbGJhY2s6ICgpID0+IHZvaWQpID0+IHZvaWRgKSBhcmUgYm90aCByZWFkIGNvcnJlY3RseSwgYWNyb3NzIGxpbmVzIHRvby5cbmZ1bmN0aW9uIGlzRnVuY3Rpb25UeXBlKGludGVyZmFjZUJvZHk6IHN0cmluZywgbWF0Y2g6IFJlZ0V4cEV4ZWNBcnJheSk6IGJvb2xlYW4ge1xuICBsZXQgaW5kZXggPSBtYXRjaC5pbmRleCArIG1hdGNoWzBdLmxlbmd0aDtcbiAgaW5kZXggKz0gRlVOQ1RJT05fVFlQRV9QQVJBTUVURVJTX1JFR19FWFAuZXhlYyhpbnRlcmZhY2VCb2R5LnNsaWNlKGluZGV4KSk/LlswXS5sZW5ndGggPz8gMDtcbiAgaWYgKGludGVyZmFjZUJvZHlbaW5kZXhdICE9PSAnKCcpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgbGV0IGRlcHRoID0gMDtcbiAgZm9yICg7IGluZGV4IDwgaW50ZXJmYWNlQm9keS5sZW5ndGg7IGluZGV4KyspIHtcbiAgICBjb25zdCBjaGFyYWN0ZXIgPSBpbnRlcmZhY2VCb2R5W2luZGV4XTtcbiAgICBpZiAoY2hhcmFjdGVyID09PSAnKCcpIHtcbiAgICAgIGRlcHRoKys7XG4gICAgfSBlbHNlIGlmIChjaGFyYWN0ZXIgPT09ICcpJykge1xuICAgICAgZGVwdGgtLTtcbiAgICAgIGlmIChkZXB0aCA9PT0gMCkge1xuICAgICAgICByZXR1cm4gQVJST1dfUkVHX0VYUC50ZXN0KGludGVyZmFjZUJvZHkuc2xpY2UoaW5kZXggKyAxKSk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cblxuZnVuY3Rpb24gaXNOb25QdWJsaWNNZW1iZXIobW9kaWZpZXJzOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIC9cXGIoPzpwcml2YXRlfHByb3RlY3RlZClcXGIvLnRlc3QobW9kaWZpZXJzKTtcbn1cblxuLy8gYHJlYWRvbmx5YCBpcyB0aGUgb25seSBtb2RpZmllciBhIHByb3BlcnR5IHNpZ25hdHVyZSB0YWtlcywgYW5kIGEgbWV0aG9kIHNpZ25hdHVyZSB0YWtlcyBub25lIFx1MjAxNCBUeXBlU2NyaXB0XG4vLyByZWplY3RzIGByZWFkb25seSBmb28oKTogdm9pZDtgIFx1MjAxNCBzbyB0aGUgbWV0aG9kLXNpZ25hdHVyZSByZWdleCBuZWVkcyBubyBjb3VudGVycGFydC5cbmZ1bmN0aW9uIG1hdGNoUHJvcGVydHlTaWduYXR1cmVzKGludGVyZmFjZUJvZHk6IHN0cmluZyk6IFJlZ0V4cEV4ZWNBcnJheVtdIHtcbiAgcmV0dXJuIFsuLi5pbnRlcmZhY2VCb2R5Lm1hdGNoQWxsKC9eIHsyfSg/OnJlYWRvbmx5XFxzKyk/KD88bmFtZT5cXHcrKVxcPz86XFxzKi9nbSldO1xufVxuXG5mdW5jdGlvbiBwYXJzZU1lbWJlcnMoa2V5d29yZDogc3RyaW5nLCBib2R5OiBzdHJpbmcpOiBJbnRlcmZhY2VNZW1iZXJzIHtcbiAgc3dpdGNoIChrZXl3b3JkKSB7XG4gICAgY2FzZSAnY2xhc3MnOiB7XG4gICAgICByZXR1cm4gYnVpbGRNZW1iZXJzKGV4dHJhY3RDbGFzc01ldGhvZE5hbWVzKGJvZHkpLCBleHRyYWN0Q2xhc3NQcm9wZXJ0eU5hbWVzKGJvZHkpKTtcbiAgICB9XG4gICAgY2FzZSAnZW51bSc6IHtcbiAgICAgIHJldHVybiBidWlsZE1lbWJlcnMoW10sIGV4dHJhY3RFbnVtTWVtYmVyTmFtZXMoYm9keSkpO1xuICAgIH1cbiAgICBkZWZhdWx0OiB7XG4gICAgICByZXR1cm4gYnVpbGRNZW1iZXJzKGV4dHJhY3RNZXRob2ROYW1lcyhib2R5KSwgZXh0cmFjdFByb3BlcnR5TmFtZXMoYm9keSkpO1xuICAgIH1cbiAgfVxufVxuXG4vLyBSZWFkcyB0aGUgbm90ZSdzIGBvYnNpZGlhbi1kZXYtdXRpbHMgPiBkZW1vLXZhdWx0LXZhbGlkYXRpb24gPiBhbGxvdy13aWtpbGlua3NgIGRlY2xhcmF0aW9uOiB0aGUgc3RhdGVkXG4vLyByZWFzb24sIGAnJ2Agd2hlbiB0aGUga2V5IGlzIHByZXNlbnQgd2l0aCBub3RoaW5nIGFmdGVyIGl0LCBvciBgbnVsbGAgd2hlbiB0aGUgbm90ZSBkZWNsYXJlcyBub3RoaW5nLlxuLy8gUmVhZCB3aXRoIGEgcmVndWxhciBleHByZXNzaW9uIHJhdGhlciB0aGFuIGEgWUFNTCBwYXJzZXI6IGl0IGlzIG9uZSBrbm93biBrZXkgcGF0aCwgYW5kIGV2ZXJ5IHBsdWdpbiB0aGF0XG4vLyBpbnN0YWxscyB0aGlzIHBhY2thZ2Ugd291bGQgb3RoZXJ3aXNlIGNhcnJ5IGEgWUFNTCBkZXBlbmRlbmN5IGZvciBpdC5cbmZ1bmN0aW9uIHJlYWRXaWtpbGlua0FsbG93YW5jZVJlYXNvbihjb250ZW50OiBzdHJpbmcpOiBudWxsIHwgc3RyaW5nIHtcbiAgY29uc3QgZnJvbnRtYXR0ZXIgPSBGUk9OVE1BVFRFUl9SRUdfRVhQLmV4ZWMoY29udGVudCk/LlswXTtcbiAgaWYgKGZyb250bWF0dGVyID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICBjb25zdCByZWFzb24gPSBXSUtJTElOS19BTExPV0FOQ0VfUkVHX0VYUC5leGVjKGZyb250bWF0dGVyKT8uZ3JvdXBzPy5bJ3JlYXNvbiddO1xuICByZXR1cm4gcmVhc29uID09PSB1bmRlZmluZWQgPyBudWxsIDogcmVhc29uLnRyaW0oKS5yZXBsYWNlKC9eKD88cXVvdGU+W1wiJ10pKD88dmFsdWU+W1xcc1xcU10qKVxcazxxdW90ZT4kLywgJyQ8dmFsdWU+Jyk7XG59XG5cbi8vIFJlYWRzIHRoZSBub3RlJ3MgaW5saW5lIGBvYnNpZGlhbi1kZXYtdXRpbHMtZGlzYWJsZVx1MjAyNmAgZGlyZWN0aXZlcywgcmV0dXJuaW5nIHdoaWNoIGxpbmVzIHRoZXkgYWxsb3cgYVxuLy8gd2lraWxpbmsgb24gYW5kIGV2ZXJ5dGhpbmcgd3Jvbmcgd2l0aCB0aGVtLiBBIHN1cHByZXNzaW9uIHRoYXQgcXVpZXRseSBkb2VzIG5vdGhpbmcgaXMgd29yc2UgdGhhbiBub25lLFxuLy8gc28gYSBtaXNzcGVsbGVkIGRpcmVjdGl2ZSwgb25lIHdpdGggbm8gcmVhc29uLCBhbiB1bmNsb3NlZCByZWdpb24gYW5kIG9uZSBjb3ZlcmluZyBubyB3aWtpbGluayBhdCBhbGxcbi8vIGFyZSBlYWNoIHJlcG9ydGVkIHJhdGhlciB0aGFuIGlnbm9yZWQuXG5mdW5jdGlvbiBzY2FuV2lraWxpbmtEaXJlY3RpdmVzKGNvbnRlbnQ6IHN0cmluZyk6IFdpa2lsaW5rRGlyZWN0aXZlU2NhbiB7XG4gIGNvbnN0IHN0YXRlOiBXaWtpbGlua0RpcmVjdGl2ZVNjYW5TdGF0ZSA9IHtcbiAgICBhbGxvd2VkTGluZUluZGV4ZXM6IG5ldyBTZXQ8bnVtYmVyPigpLFxuICAgIG9wZW5SZWdpb246IG51bGwsXG4gICAgcGVuZGluZ05leHRMaW5lSW5kZXg6IG51bGwsXG4gICAgcHJvYmxlbXM6IFtdLFxuICAgIHdpa2lsaW5rTGluZUluZGV4ZXM6IG5ldyBTZXQoZmluZFdpa2lsaW5rTGluZUluZGV4ZXMoY29udGVudCkpXG4gIH07XG5cbiAgZm9yIChjb25zdCB7IGluZGV4LCBsaW5lIH0gb2YgY29sbGVjdExpbmVzT3V0c2lkZUZlbmNlcyhjb250ZW50KSkge1xuICAgIGNvbnN0IG1hdGNoID0gRElSRUNUSVZFX1JFR19FWFAuZXhlYyhsaW5lKTtcbiAgICBpZiAobWF0Y2gpIHtcbiAgICAgIGFwcGx5V2lraWxpbmtEaXJlY3RpdmUoc3RhdGUsIGluZGV4LCBtYXRjaCk7XG4gICAgfSBlbHNlIGlmIChESVJFQ1RJVkVfUFJPQkVfUkVHX0VYUC50ZXN0KGxpbmUpKSB7XG4gICAgICBzdGF0ZS5wcm9ibGVtcy5wdXNoKGBhIG1hbGZvcm1lZCBkaXJlY3RpdmUgb24gJHtmb3JtYXRMaW5lTnVtYmVyKGluZGV4KX1gKTtcbiAgICB9IGVsc2Uge1xuICAgICAgYXBwbHlXaWtpbGlua1NjYW5MaW5lKHN0YXRlLCBpbmRleCwgbGluZSk7XG4gICAgfVxuICB9XG5cbiAgaWYgKHN0YXRlLm9wZW5SZWdpb24pIHtcbiAgICBzdGF0ZS5wcm9ibGVtcy5wdXNoKGBhIHJlZ2lvbiBvcGVuZWQgb24gJHtmb3JtYXRMaW5lTnVtYmVyKHN0YXRlLm9wZW5SZWdpb24ubGluZUluZGV4KX0gdGhhdCBpcyBuZXZlciBlbmFibGVkIGFnYWluYCk7XG4gIH1cbiAgaWYgKHN0YXRlLnBlbmRpbmdOZXh0TGluZUluZGV4ICE9PSBudWxsKSB7XG4gICAgc3RhdGUucHJvYmxlbXMucHVzaChgYSBkaXNhYmxlLW5leHQtbGluZSBvbiAke2Zvcm1hdExpbmVOdW1iZXIoc3RhdGUucGVuZGluZ05leHRMaW5lSW5kZXgpfSBjb3ZlcmluZyBubyB3aWtpbGlua2ApO1xuICB9XG4gIHJldHVybiB7IGFsbG93ZWRMaW5lSW5kZXhlczogc3RhdGUuYWxsb3dlZExpbmVJbmRleGVzLCBwcm9ibGVtczogc3RhdGUucHJvYmxlbXMgfTtcbn1cblxuZnVuY3Rpb24gc3RyaXBGcm9udG1hdHRlcihjb250ZW50OiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gY29udGVudC5yZXBsYWNlKEZST05UTUFUVEVSX1JFR19FWFAsICcnKTtcbn1cblxuZnVuY3Rpb24gc3RyaXBJbmxpbmVDb2RlKGxpbmU6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBsaW5lLnJlcGxhY2VBbGwoSU5MSU5FX0NPREVfUkVHX0VYUCwgJycpO1xufVxuXG4vLyBBIGhhbmQtd3JpdHRlbiBsaW5rIG1heSBjb250YWluIGEgYmFyZSBgJWAgKG9yIGFueSBvdGhlciBpbnZhbGlkIHBlcmNlbnQtZXNjYXBlKSwgd2hpY2ggbWFrZXNcbi8vIGBkZWNvZGVVUklDb21wb25lbnRgIHRocm93LiBTdWNoIGEgdGFyZ2V0IGlzIG1lYW50IGxpdGVyYWxseSwgc28gaXQgaXMgdXNlZCBhcyB3cml0dGVuLlxuZnVuY3Rpb24gdHJ5RGVjb2RlVXJpQ29tcG9uZW50KHZhbHVlOiBzdHJpbmcpOiBzdHJpbmcge1xuICB0cnkge1xuICAgIHJldHVybiBkZWNvZGVVUklDb21wb25lbnQodmFsdWUpO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cbn1cbiJdLAogICJtYXBw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
|
|
610
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9kZW1vLXZhdWx0LWNvdmVyYWdlLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBTdGF0aWMgY292ZXJhZ2UvZnJlc2huZXNzIGNoZWNrcyB0aGF0IGtlZXAgYSBwbHVnaW4ncyBpbi1yZXBvIGBkZW1vLXZhdWx0L2AgaW4gc3luYyB3aXRoIGl0cyBwdWJsaWMgc3VyZmFjZS5cbiAqXG4gKiBBIHBsdWdpbiBjYW4gc2hpcCBhIGN1cmF0ZWQgZGVtbyB2YXVsdCBhdCBgZGVtby12YXVsdC9gIGluIGl0cyByZXBvIHJvb3QuIFRoZXNlIGhlbHBlcnMgcmVmbGVjdCB0aGUgcmVhbFxuICogcHVibGljIEFQSS9jb25maWcvZG9jcyBzdHJhaWdodCBmcm9tIHNvdXJjZSBhbmQgYXNzZXJ0IOKAlCBXSVRIT1VUIGxhdW5jaGluZyBPYnNpZGlhbiDigJQgdGhhdCBldmVyeSBmZWF0dXJlIGlzXG4gKiBkZW1vbnN0cmF0ZWQgaW4gdGhlIG5vdGVzIGFuZCB0aGF0IHRoZSBub3RlcyByZWZlcmVuY2Ugbm8gQVBJIG1lbWJlciB0aGF0IG5vIGxvbmdlciBleGlzdHMgKHJlbmFtZSBkcmlmdCkuXG4gKiBUaGUgcnVudGltZSBiZWhhdmlvciBvZiB0aGUgcGx1Z2luIGlzIGNvdmVyZWQgYnkgaXRzIG90aGVyIGludGVncmF0aW9uIHRlc3RzLCBub3QgYnkgdGhlIGRlbW8gdmF1bHQ7IHRoZVxuICogdmF1bHQgaXMgYSBsZWFybmluZyByZXNvdXJjZSwgYW5kIHRoZXNlIGNoZWNrcyBvbmx5IGd1YXJkIHRoYXQgaXQgc3RheXMgdHJ1dGhmdWwuXG4gKlxuICogVGhleSBhbHNvIGd1YXJkIHRoZSB2YXVsdCdzIG93biBgLm9ic2lkaWFuL2FwcC5qc29uYDogdGhlIHNldHRpbmdzIGxpc3RlZCBpblxuICoge0BsaW5rIERFTU9fVkFVTFRfQVBQX0pTT05fU0VUVElOR1N9IGJlbG9uZyB0byBgb2JzaWRpYW4tZGV2LXV0aWxzYCwgd2hpY2ggd3JpdGVzIHRoZW0gaW50byB0aGUgYXJjaGl2ZWRcbiAqIHZhdWx0IGF0IHJlbGVhc2UgdGltZSwgc28gYSB2YXVsdCB0aGF0IGNvbW1pdHMgYW55IG9mIHRoZW0gaXMga2VlcGluZyBhIHNlY29uZCBjb3B5IG5vdGhpbmcgcmVjb25jaWxlcy5cbiAqXG4gKiBUaGV5IGFsc28gZW5mb3JjZSB0aGUgZGVtby12YXVsdCBBVVRIT1JJTkcgY29udmVudGlvbiDigJQgZXZlcnkgbm90ZSBvcGVucyB3aXRoIGFuIGAjIEgxYCBhbmQgYSBwbGFpblxuICogcHJvc2UgcGFyYWdyYXBoLCBldmVyeSBub3RlIGlzIHJlYWNoYWJsZSBmcm9tIHRoZSBzdGFydCBub3RlLCBhbmQgbm8gbm90ZSB1c2VzIGEgYFtbd2lraWxpbmtdXWAgb3IgYVxuICogYFtEb2NzXSjigKYpYCBsaW5lLiBUaGVzZSBjaGVja3MgYXJlIHVuY29uZGl0aW9uYWw6IHRoZSBkZW1vIHZhdWx0IGlzIHRoZSBwdWJsaXNoZWQgZG9jdW1lbnRhdGlvbiwgcmVhZFxuICogaW4gT2JzaWRpYW4gQU5EIG9uIEdpdEh1YiAod2hlcmUgYSB3aWtpbGluayBkb2VzIG5vdCByZW5kZXIpLCBzbyBhIG5vdGUgdGhhdCBicmVha3MgdGhlIGNvbnZlbnRpb24gaXNcbiAqIGJyb2tlbiBmb3IgcmVhbCByZWFkZXJzLiBgYXV0aG9yaW5nYCBvbmx5IHR1bmVzIHRoZW0gKHdoaWNoIG5vdGUgaXMgdGhlIHN0YXJ0LCB3aGljaCBub3RlcyBzaXQgb3V0c2lkZVxuICogdGhlIGxlYXJuaW5nIHBhdGgpOyBpdCBjYW5ub3Qgc3dpdGNoIHRoZW0gb2ZmLlxuICpcbiAqIE9ubHkgYHJvb3RGb2xkZXJgIGlzIHJlcXVpcmVkLCBzbyBhIHBsdWdpbiB3aXRoIG5vIHNldHRpbmdzIGFuZCBubyBwdWJsaWMgQVBJIHRvIHJlZmxlY3QgcmVnaXN0ZXJzIHRoZVxuICogc3VpdGUgd2l0aCB0aGF0IGFsb25lIGFuZCBzdGlsbCBnZXRzIGV2ZXJ5IGF1dGhvcmluZyBjaGVjayDigJQgdGhlIGNoZWNrcyBoYXZlIG5vdGhpbmcgdG8gZG8gd2l0aCB3aGF0IHRoZVxuICogcGx1Z2luIGV4cG9zZXMuIEVhY2ggcmVmbGVjdGlvbiBzcGVjIChgY29uZmlnSW50ZXJmYWNlc2AsIGBpbnRlcmZhY2VzYCwgYG5vblRyaXZpYWxHdWFyZGApIGFkZHMgdGhlIGNoZWNrc1xuICogaXQgZGVzY3JpYmVzIHdoZW4gc3VwcGxpZWQuIFRoZSB2YXVsdCBpcyBndWFyZGVkIGFnYWluc3QgYmVpbmcgZW1wdHkgZWl0aGVyIHdheTogd2l0aCBubyBub3RlcyB0byByZWFkLFxuICogZXZlcnkgYXV0aG9yaW5nIGNoZWNrIHdvdWxkIHBhc3MgYnkgaGF2aW5nIG5vdGhpbmcgdG8gbG9vayBhdC5cbiAqXG4gKiBUaGUgb25lIGV4Y2VwdGlvbiBpcyBhIG5vdGUgd2hvc2UgU1VCSkVDVCBpcyB0aGUgd2lraWxpbmsg4oCUIGFuIGVtYmVkIHNwZWxsaW5nIHRoZSByZWFkZXIgaXMgYmVpbmcgdGF1Z2h0XG4gKiB0byB0eXBlLCBhIGZyb250bWF0dGVyIHByb3BlcnR5IHZhbHVlIHRoYXQgZXhpc3RzIHRvIGNvbnRyYXN0IHdpdGggYSBNYXJrZG93biBsaW5rLCBhIGZpeHR1cmUgdGhhdCBtdXN0XG4gKiBrZWVwIHRoZSB3aWtpbGluayBhIGNvbW1hbmQgaXMgc3VwcG9zZWQgdG8gbGVhdmUgYWxvbmUsIGEgbGluayB0aGUgcmVhZGVyIGNsaWNrcyB3aGlsZSBpdCBzdGlsbCByZXNvbHZlc1xuICogdG8gbm90aGluZy4gU3VjaCBhIG5vdGUgc2F5cyBzbyBpdHNlbGYsIHN0YXRpbmcgd2h5LCBpbiBvbmUgb2YgdHdvIGZvcm1zIG1vZGVsbGVkIG9uIEVTTGludCdzLlxuICpcbiAqIFBlciBsaW5lIG9yIHBlciByZWdpb24sIHdyaXR0ZW4gYXMgYW4gSFRNTCBjb21tZW50IHNvIGl0IGlzIGludmlzaWJsZSBpbiBPYnNpZGlhbiBBTkQgb24gR2l0SHViIOKAlCB0aGVcbiAqIHNwZWxsaW5nIHRoZXNlIHZhdWx0cyBhbHJlYWR5IHVzZSBmb3IgYG1hcmtkb3dubGludC1kaXNhYmxlLW5leHQtbGluZWA6XG4gKlxuICogYGBgbWFya2Rvd25cbiAqIDwhLS0gb2JzaWRpYW4tZGV2LXV0aWxzLWRpc2FibGUtbmV4dC1saW5lIGRlbW8tdmF1bHQtdmFsaWRhdGlvbi9uby13aWtpbGlua3MgLS0gQ2xpY2tpbmcgYSBsaW5rIHRvIGEgbm90ZSB0aGF0IGRvZXMgbm90IGV4aXN0IHlldCBJUyB0aGUgZmVhdHVyZS4gLS0+XG4gKiAyLiBDbGljayB0aGlzIGxpbms6IFtbUHJvamVjdHMvRnJlc2ggaWRlYV1dLlxuICpcbiAqIDwhLS0gb2JzaWRpYW4tZGV2LXV0aWxzLWRpc2FibGUgZGVtby12YXVsdC12YWxpZGF0aW9uL25vLXdpa2lsaW5rcyAtLSBUaGUgd2lraWxpbmsgZW1iZWQgaXMgdGhlIHN5bnRheCB0aGlzIG5vdGUgdGVhY2hlcy4gLS0+XG4gKiAhW1tiYXNpYy5odG1sfDQwMF1dXG4gKiA8IS0tIG9ic2lkaWFuLWRldi11dGlscy1lbmFibGUgZGVtby12YXVsdC12YWxpZGF0aW9uL25vLXdpa2lsaW5rcyAtLT5cbiAqIGBgYFxuICpcbiAqIFBlciBub3RlLCBpbiB0aGUgbm90ZSdzIG93biBmcm9udG1hdHRlciDigJQgdGhlIG9ubHkgZm9ybSB0aGF0IGNhbiByZWFjaCBhIHdpa2lsaW5rIElOU0lERSBmcm9udG1hdHRlcixcbiAqIHdoZXJlIGEgY29tbWVudCBjYW5ub3QgZ286XG4gKlxuICogYGBgeWFtbFxuICogLS0tXG4gKiBvYnNpZGlhbi1kZXYtdXRpbHM6XG4gKiAgIGRlbW8tdmF1bHQtdmFsaWRhdGlvbjpcbiAqICAgICBhbGxvdy13aWtpbGlua3M6IFRoZSBgd2lraWxpbmtgIHByb3BlcnR5IHZhbHVlIGlzIHRoZSBjb250cmFzdCB0aGlzIG5vdGUgaXMgYnVpbHQgYXJvdW5kLlxuICogLS0tXG4gKiBgYGBcbiAqXG4gKiBFaXRoZXIgd2F5IHRoZSBkZWNsYXJhdGlvbiB0cmF2ZWxzIHdpdGggdGhlIG5vdGUgcmF0aGVyIHRoYW4gc2l0dGluZyBpbiBhIGxpc3Qgc29tZXdoZXJlIGVsc2UsIGl0IGNhcnJpZXNcbiAqIGl0cyBqdXN0aWZpY2F0aW9uLCBhbmQgaXQgZXhlbXB0cyBvbmx5IHRoZSBXSUtJTElOSyBjaGVjayDigJQgdGhlIEgxLCBwcm9zZSwgcmVhY2hhYmlsaXR5IGFuZCBgW0RvY3NdYFxuICogY2hlY2tzIHN0aWxsIGFwcGx5LiBBIGRlY2xhcmF0aW9uIHdpdGggbm8gcmVhc29uLCBvbmUgY292ZXJpbmcgbm8gd2lraWxpbmssIGEgcmVnaW9uIG5ldmVyIGVuYWJsZWQgYWdhaW4sXG4gKiBvciBhIG1pc3NwZWxsZWQgZGlyZWN0aXZlIGFsbCBmYWlsOiBhbiBleGVtcHRpb24gbm9ib2R5IGNhbiBqdXN0aWZ5LCB0aGF0IG5vdGhpbmcgbmVlZHMgYW55IG1vcmUsIG9yIHRoYXRcbiAqIHNpbGVudGx5IGRvZXMgbm90aGluZyBpcyB3b3JzZSB0aGFuIG5vIGV4ZW1wdGlvbiBhdCBhbGwuXG4gKlxuICogVHdvIGxheWVycyBhcmUgZXhwb3NlZDpcbiAqIC0ge0BsaW5rIERlbW9WYXVsdENvdmVyYWdlQ2hlY2tlcn0g4oCUIGEgZnJhbWV3b3JrLWFnbm9zdGljIGNvcmUgdGhhdCByZWFkcyB0aGUgY29ycHVzLCBwYXJzZXMgaW50ZXJmYWNlIC9cbiAqICAgY2xhc3MgLyBlbnVtIG1lbWJlcnMgYW5kIGV4cG9ydGVkIGZ1bmN0aW9ucywgYW5kIHJldHVybnMgZGlhZ25vc3RpYyBhcnJheXMgKHdoYXQgaXMgdW5kZW1vbnN0cmF0ZWQgLyBzdGFsZVxuICogICAvIHVubGlua2VkIC8gb2ZmLWNvbnZlbnRpb24pLlxuICogLSB7QGxpbmsgcmVnaXN0ZXJEZW1vVmF1bHRDb3ZlcmFnZVN1aXRlfSDigJQgYSB0aGluIHdyYXBwZXIgdGhhdCByZWdpc3RlcnMgYSBgdml0ZXN0YCBzdWl0ZSBvdmVyIHRoZSBjb3JlLCBzb1xuICogICBhIHBsdWdpbidzIGBkZW1vLXZhdWx0Lm5vLWFwcC5pbnRlZ3JhdGlvbi50ZXN0LnRzYCBpcyBhIHNpbmdsZSBkZWNsYXJhdGl2ZSBjYWxsLlxuICovXG5cbmltcG9ydCB7IG5vcm1hbGl6ZU9wdGlvbmFsUHJvcGVydGllcyB9IGZyb20gJ0BtbmFvdW1vdi90eXBlc2NyaXB0LWxpYi9vYmplY3QtdXRpbHMnO1xuaW1wb3J0IHtcbiAgZGlybmFtZSxcbiAgam9pbixcbiAgcmVsYXRpdmVcbn0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL3BhdGgnO1xuaW1wb3J0IHsgZ2V0TWFuZGF0b3J5TmFtZWRHcm91cCB9IGZyb20gJ0BtbmFvdW1vdi90eXBlc2NyaXB0LWxpYi9yZWctZXhwJztcbmltcG9ydCB7IGVuc3VyZU5vbk51bGxhYmxlIH0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL3R5cGUtZ3VhcmRzJztcbmltcG9ydCB7XG4gIGV4aXN0c1N5bmMsXG4gIHJlYWRkaXJTeW5jLFxuICByZWFkRmlsZVN5bmNcbn0gZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQge1xuICBkZXNjcmliZSxcbiAgZXhwZWN0LFxuICBpdFxufSBmcm9tICd2aXRlc3QnO1xuXG5pbXBvcnQge1xuICBmaW5kT3duZWREZW1vVmF1bHRBcHBKc29uU2V0dGluZ3MsXG4gIHBhcnNlRGVtb1ZhdWx0QXBwSnNvblxufSBmcm9tICcuL2RlbW8tdmF1bHQtYXBwLWpzb24udHMnO1xuaW1wb3J0IHsgT2JzaWRpYW5QbHVnaW5SZXBvUGF0aHMgfSBmcm9tICcuL29ic2lkaWFuLXBsdWdpbi1yZXBvLXBhdGhzLnRzJztcblxuLyoqXG4gKiBUdW5lcyB0aGUgYWx3YXlzLW9uIGF1dGhvcmluZyBjaGVja3MuIEl0IGNhbm5vdCBkaXNhYmxlIHRoZW0g4oCUIHNlZSB0aGUgZmlsZSBvdmVydmlldy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEZW1vVmF1bHRBdXRob3JpbmdTcGVjIHtcbiAgLyoqXG4gICAqIFRoZSBub3RlcyAocGF0aHMgcmVsYXRpdmUgdG8gdGhlIGRlbW8gdmF1bHQpIHRoYXQgc2l0IG91dHNpZGUgdGhlIGxlYXJuaW5nIHBhdGggYW5kIGFyZSB0aGVyZWZvcmVcbiAgICogZXhlbXB0IGZyb20gZXZlcnkgYXV0aG9yaW5nIGNoZWNrLiBEZWZhdWx0cyB0byB0aGUgdmF1bHQncyBvd24gYFJFQURNRS5tZGAsIHdoaWNoIGFkZHJlc3NlcyBzb21lb25lXG4gICAqIGJyb3dzaW5nIHRoZSByZXBvIG9uIEdpdEh1YiByYXRoZXIgdGhhbiBhIHJlYWRlciB3b3JraW5nIHRocm91Z2ggdGhlIHZhdWx0LlxuICAgKi9cbiAgcmVhZG9ubHkgZXhjbHVkZWROb3Rlcz86IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgKiBUaGUgbm90ZSAocGF0aCByZWxhdGl2ZSB0byB0aGUgZGVtbyB2YXVsdCkgZXZlcnkgb3RoZXIgbm90ZSBtdXN0IGJlIHJlYWNoYWJsZSBmcm9tLiBEZWZhdWx0cyB0b1xuICAgKiBgMDAgU3RhcnQubWRgLlxuICAgKi9cbiAgcmVhZG9ubHkgc3RhcnROb3RlPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIFJlZmxlY3RzIGEgY29uZmlnIGludGVyZmFjZSB3aG9zZSBvcHRpb25zIGFyZSBkZW1vbnN0cmF0ZWQgYnkgdGhlaXIgYmFyZSBuYW1lLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIERlbW9WYXVsdENvbmZpZ0ludGVyZmFjZUNvdmVyYWdlU3BlYyB7XG4gIC8qKlxuICAgKiBUaGUgbmFtZSBvZiB0aGUgYGV4cG9ydCBpbnRlcmZhY2VgLCBgZXhwb3J0IGNsYXNzYCwgb3IgYGV4cG9ydCBlbnVtYCB3aG9zZSBwcm9wZXJ0aWVzIGFyZSB0aGUgY29uZmlnXG4gICAqIG9wdGlvbnMuXG4gICAqL1xuICByZWFkb25seSBpbnRlcmZhY2VOYW1lOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBzb3VyY2UgZmlsZSBwYXRoIChyZWxhdGl2ZSB0byB0aGUgcmVwbyByb290KSB0aGF0IGRlY2xhcmVzIHRoZSBpbnRlcmZhY2UsIGNsYXNzLCBvciBlbnVtLlxuICAgKi9cbiAgcmVhZG9ubHkgc291cmNlUGF0aDogc3RyaW5nO1xufVxuXG4vKipcbiAqIFRoZSBwYXJhbWV0ZXJzIGZvciB0aGUge0BsaW5rIERlbW9WYXVsdENvdmVyYWdlQ2hlY2tlcn0gY29uc3RydWN0b3IuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRGVtb1ZhdWx0Q292ZXJhZ2VDaGVja2VyQ29uc3RydWN0b3JQYXJhbXMge1xuICAvKipcbiAgICogVGhlIG5vdGVzIChwYXRocyByZWxhdGl2ZSB0byB0aGUgZGVtbyB2YXVsdCkgZXhlbXB0IGZyb20gdGhlIGF1dGhvcmluZyBjaGVja3MuIERlZmF1bHRzIHRvIHRoZVxuICAgKiB2YXVsdCdzIG93biBgUkVBRE1FLm1kYC5cbiAgICovXG4gIHJlYWRvbmx5IGV4Y2x1ZGVkTm90ZXM/OiBzdHJpbmdbXTtcblxuICAvKipcbiAgICogVGhlIGFic29sdXRlIHBhdGggb2YgdGhlIHBsdWdpbiByZXBvIHJvb3Qg4oCUIHRoZSBmb2xkZXIgY29udGFpbmluZyBgZGVtby12YXVsdC9gIGFuZCB0aGUgc291cmNlIGJlaW5nXG4gICAqIHJlZmxlY3RlZC4gQ2FsbGVycyB0eXBpY2FsbHkgcGFzcyBgZ2V0Um9vdEZvbGRlcigpID8/IHByb2Nlc3MuY3dkKClgLlxuICAgKi9cbiAgcmVhZG9ubHkgcm9vdEZvbGRlcjogc3RyaW5nO1xufVxuXG4vKipcbiAqIFRoZSBwYXJhbWV0ZXJzIGZvciB7QGxpbmsgRGVtb1ZhdWx0Q292ZXJhZ2VDaGVja2VyLmZpbmRTdGFsZVJlZmVyZW5jZXN9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIERlbW9WYXVsdENvdmVyYWdlQ2hlY2tlckZpbmRTdGFsZVJlZmVyZW5jZXNQYXJhbXMge1xuICAvKipcbiAgICogVGhlIHJlY2VpdmVyIHdob3NlIGBgIGAke3JlY2VpdmVyfS48bWVtYmVyPmAgYGAgcmVmZXJlbmNlcyBhcmUgc2Nhbm5lZCBmb3IgaW4gdGhlIGRlbW8gY29ycHVzLlxuICAgKi9cbiAgcmVhZG9ubHkgcmVjZWl2ZXI6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIG1lbWJlcnMgdGhhdCBjdXJyZW50bHkgZXhpc3Qgb24gdGhlIHJlY2VpdmVyOyBhbnkgcmVmZXJlbmNlZCBtZW1iZXIgbm90IGluIHRoaXMgc2V0IGlzIHN0YWxlLlxuICAgKi9cbiAgcmVhZG9ubHkgdmFsaWRNZW1iZXJzOiBzdHJpbmdbXTtcbn1cblxuLyoqXG4gKiBUaGUgcGFyYW1ldGVycyBmb3Ige0BsaW5rIERlbW9WYXVsdENvdmVyYWdlQ2hlY2tlci5maW5kVW5kZW1vbnN0cmF0ZWRNZW1iZXJzfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEZW1vVmF1bHRDb3ZlcmFnZUNoZWNrZXJGaW5kVW5kZW1vbnN0cmF0ZWRNZW1iZXJzUGFyYW1zIHtcbiAgLyoqXG4gICAqIFRoZSBtZW1iZXIgbmFtZXMgdGhhdCBtdXN0IGVhY2ggYXBwZWFyIGluIHRoZSBkZW1vIGNvcnB1cy5cbiAgICovXG4gIHJlYWRvbmx5IG1lbWJlcnM6IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgKiBXaGVuIHNldCwgYSBtZW1iZXIgaXMgZGVtb25zdHJhdGVkIG9ubHkgaWYgYGAgYCR7cmVjZWl2ZXJ9LiR7bWVtYmVyfWAgYGAgYXBwZWFycyAoZS5nLiBhIGNvbnRleHQgb2JqZWN0J3NcbiAgICogbWV0aG9kcyk7IHdoZW4gYWJzZW50LCB0aGUgYmFyZSBtZW1iZXIgbmFtZSBpcyBsb29rZWQgdXAgKGUuZy4gYSBjb25maWcgb3B0aW9uKS5cbiAgICovXG4gIHJlYWRvbmx5IHJlY2VpdmVyPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIFRoZSBwYXJhbWV0ZXJzIGZvciB7QGxpbmsgRGVtb1ZhdWx0Q292ZXJhZ2VDaGVja2VyLmZpbmRVbmxpbmtlZEZlYXR1cmVEb2NzfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEZW1vVmF1bHRDb3ZlcmFnZUNoZWNrZXJGaW5kVW5saW5rZWRGZWF0dXJlRG9jc1BhcmFtcyB7XG4gIC8qKlxuICAgKiBUaGUgZG9jcyBmb2xkZXIgKHJlbGF0aXZlIHRvIHRoZSByZXBvIHJvb3QpIHdob3NlIHRvcC1sZXZlbCBgKi5tZGAgZmlsZXMgYXJlIHRoZSBmZWF0dXJlIGRvY3MuXG4gICAqL1xuICByZWFkb25seSBkb2NzRm9sZGVyOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBkb2MgYmFzZW5hbWVzICh3aXRob3V0IGAubWRgKSB0aGF0IGFyZSBOT1QgcGVyLWZlYXR1cmUgcGFnZXMgYW5kIHNvIG5lZWQgbm8gbGlua2luZyBkZW1vIG5vdGUuXG4gICAqL1xuICByZWFkb25seSBub25GZWF0dXJlRG9jczogc3RyaW5nW107XG59XG5cbi8qKlxuICogVGhlIHBhcmFtZXRlcnMgZm9yIHtAbGluayBEZW1vVmF1bHRDb3ZlcmFnZUNoZWNrZXIuZmluZFVucmVhY2hhYmxlTm90ZXN9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIERlbW9WYXVsdENvdmVyYWdlQ2hlY2tlckZpbmRVbnJlYWNoYWJsZU5vdGVzUGFyYW1zIHtcbiAgLyoqXG4gICAqIFRoZSBub3RlIChwYXRoIHJlbGF0aXZlIHRvIHRoZSBkZW1vIHZhdWx0KSB0aGUgd2FsayBzdGFydHMgZnJvbSwgZS5nLiBgMDAgU3RhcnQubWRgLlxuICAgKi9cbiAgcmVhZG9ubHkgc3RhcnROb3RlOiBzdHJpbmc7XG59XG5cbi8qKlxuICogVGhlIHBhcmFtZXRlcnMgZm9yIHtAbGluayBEZW1vVmF1bHRDb3ZlcmFnZUNoZWNrZXIuZ2V0RXhwb3J0ZWRGdW5jdGlvbk5hbWVzfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEZW1vVmF1bHRDb3ZlcmFnZUNoZWNrZXJHZXRFeHBvcnRlZEZ1bmN0aW9uTmFtZXNQYXJhbXMge1xuICAvKipcbiAgICogVGhlIHNvdXJjZSBmaWxlIHBhdGggKHJlbGF0aXZlIHRvIHRoZSByZXBvIHJvb3QpIHdob3NlIGBleHBvcnQgZnVuY3Rpb25gcyBhcmUgcGFyc2VkLlxuICAgKi9cbiAgcmVhZG9ubHkgc291cmNlUGF0aDogc3RyaW5nO1xufVxuXG4vKipcbiAqIFRoZSBwYXJhbWV0ZXJzIGZvciB7QGxpbmsgRGVtb1ZhdWx0Q292ZXJhZ2VDaGVja2VyLmdldEludGVyZmFjZU1lbWJlcnN9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIERlbW9WYXVsdENvdmVyYWdlQ2hlY2tlckdldEludGVyZmFjZU1lbWJlcnNQYXJhbXMge1xuICAvKipcbiAgICogVGhlIG5hbWUgb2YgdGhlIGBleHBvcnQgaW50ZXJmYWNlYCwgYGV4cG9ydCBjbGFzc2AsIG9yIGBleHBvcnQgZW51bWAgdG8gcGFyc2UuXG4gICAqL1xuICByZWFkb25seSBpbnRlcmZhY2VOYW1lOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBzb3VyY2UgZmlsZSBwYXRoIChyZWxhdGl2ZSB0byB0aGUgcmVwbyByb290KSB0aGF0IGRlY2xhcmVzIHRoZSBpbnRlcmZhY2UsIGNsYXNzLCBvciBlbnVtLlxuICAgKi9cbiAgcmVhZG9ubHkgc291cmNlUGF0aDogc3RyaW5nO1xufVxuXG4vKipcbiAqIENvbmZpZ3VyZXMgdGhlIGZlYXR1cmUtZG9jIGxpbmtpbmcgY2hlY2suXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRGVtb1ZhdWx0RG9jc0NvdmVyYWdlU3BlYyB7XG4gIC8qKlxuICAgKiBUaGUgZG9jcyBmb2xkZXIgKHJlbGF0aXZlIHRvIHRoZSByZXBvIHJvb3QpIHdob3NlIHRvcC1sZXZlbCBgKi5tZGAgZmlsZXMgYXJlIHRoZSBmZWF0dXJlIGRvY3MuXG4gICAqL1xuICByZWFkb25seSBmb2xkZXI6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIGRvYyBiYXNlbmFtZXMgKHdpdGhvdXQgYC5tZGApIHRoYXQgYXJlIE5PVCBwZXItZmVhdHVyZSBwYWdlcyBhbmQgc28gbmVlZCBubyBsaW5raW5nIGRlbW8gbm90ZS5cbiAgICovXG4gIHJlYWRvbmx5IG5vbkZlYXR1cmVEb2NzOiBzdHJpbmdbXTtcbn1cblxuLyoqXG4gKiBSZWZsZWN0cyBhIG1vZHVsZSdzIGV4cG9ydGVkIGZ1bmN0aW9ucywgZWFjaCBkZW1vbnN0cmF0ZWQgYnkgaXRzIGJhcmUgbmFtZSBpbiB0aGUgZGVtbyBjb3JwdXMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRGVtb1ZhdWx0RnVuY3Rpb25zQ292ZXJhZ2VTcGVjIHtcbiAgLyoqXG4gICAqIFRoZSBzb3VyY2UgZmlsZSBwYXRoIChyZWxhdGl2ZSB0byB0aGUgcmVwbyByb290KSB3aG9zZSBgZXhwb3J0IGZ1bmN0aW9uYHMgbXVzdCBlYWNoIGJlIGRlbW9uc3RyYXRlZC5cbiAgICovXG4gIHJlYWRvbmx5IHNvdXJjZVBhdGg6IHN0cmluZztcbn1cblxuLyoqXG4gKiBSZWZsZWN0cyBhIHNpbmdsZSBpbnRlcmZhY2UncyBtZW1iZXJzIGFuZCBkZW1vbnN0cmF0ZXMgdGhlbSB2aWEgYGAgYCR7cmVjZWl2ZXJ9LjxtZW1iZXI+YCBgYCByZWZlcmVuY2VzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIERlbW9WYXVsdEludGVyZmFjZUNvdmVyYWdlU3BlYyB7XG4gIC8qKlxuICAgKiBUaGUgbmFtZSBvZiB0aGUgYGV4cG9ydCBpbnRlcmZhY2VgLCBgZXhwb3J0IGNsYXNzYCwgb3IgYGV4cG9ydCBlbnVtYCB0byByZWZsZWN0LlxuICAgKi9cbiAgcmVhZG9ubHkgaW50ZXJmYWNlTmFtZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSBkZW1vbnN0cmF0ZWQgbWVtYmVycyBhcmUgdGhlIHJlZmxlY3RlZCB0eXBlJ3MgbWV0aG9kcyBvciBpdHMgcHJvcGVydGllcyAoZW51bSBtZW1iZXJzIGNvdW50IGFzXG4gICAqIHByb3BlcnRpZXMpLlxuICAgKi9cbiAgcmVhZG9ubHkga2luZDogRGVtb1ZhdWx0SW50ZXJmYWNlTWVtYmVyS2luZDtcblxuICAvKipcbiAgICogVGhlIGlkZW50aWZpZXIgdGhlIG5vdGVzIGNhbGwgdGhlIG1lbWJlcnMgb24gKGUuZy4gYGNvZGVCdXR0b25Db250ZXh0YCkuXG4gICAqL1xuICByZWFkb25seSByZWNlaXZlcjogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgc291cmNlIGZpbGUgcGF0aCAocmVsYXRpdmUgdG8gdGhlIHJlcG8gcm9vdCkgdGhhdCBkZWNsYXJlcyB0aGUgaW50ZXJmYWNlLCBjbGFzcywgb3IgZW51bS5cbiAgICovXG4gIHJlYWRvbmx5IHNvdXJjZVBhdGg6IHN0cmluZztcbn1cblxuLyoqXG4gKiBXaGV0aGVyIGFuIGludGVyZmFjZSdzIGRlbW9uc3RyYXRlZCBtZW1iZXJzIGFyZSBpdHMgbWV0aG9kcyBvciBpdHMgcHJvcGVydGllcy5cbiAqL1xuZXhwb3J0IHR5cGUgRGVtb1ZhdWx0SW50ZXJmYWNlTWVtYmVyS2luZCA9ICdtZXRob2RzJyB8ICdwcm9wZXJ0aWVzJztcblxuLyoqXG4gKiBDb25maWd1cmVzIHRoZSBndWFyZCB0aGF0IHRoZSByZWZsZWN0ZWQgc3VyZmFjZSBpcyBub24tdHJpdmlhbCAocHJvdGVjdHMgYWdhaW5zdCBhIHBhcnNpbmcgcmVncmVzc2lvblxuICogc2lsZW50bHkgZW1wdHlpbmcgZXZlcnkgb3RoZXIgY2hlY2spLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIERlbW9WYXVsdE5vblRyaXZpYWxHdWFyZFNwZWMge1xuICAvKipcbiAgICogQSBkZW1vIG5vdGUgKHBhdGggcmVsYXRpdmUgdG8gdGhlIGRlbW8gdmF1bHQpIHRoYXQgbXVzdCBiZSBwcmVzZW50LlxuICAgKi9cbiAgcmVhZG9ubHkgZXhwZWN0RGVtb05vdGU6IHN0cmluZztcblxuICAvKipcbiAgICogQSBtZW1iZXIgdGhhdCBtdXN0IGJlIHJlZmxlY3RlZCBmcm9tIHtAbGluayBEZW1vVmF1bHROb25Ucml2aWFsR3VhcmRTcGVjLmludGVyZmFjZU5hbWV9LlxuICAgKi9cbiAgcmVhZG9ubHkgZXhwZWN0TWVtYmVyOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBuYW1lIG9mIHRoZSBgZXhwb3J0IGludGVyZmFjZWAsIGBleHBvcnQgY2xhc3NgLCBvciBgZXhwb3J0IGVudW1gIHdob3NlIG1lbWJlcnMgYXJlIHJlLXBhcnNlZCBmb3IgdGhlXG4gICAqIGd1YXJkLlxuICAgKi9cbiAgcmVhZG9ubHkgaW50ZXJmYWNlTmFtZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgc291cmNlIGZpbGUgcGF0aCAocmVsYXRpdmUgdG8gdGhlIHJlcG8gcm9vdCkgdGhhdCBkZWNsYXJlcyB0aGUgaW50ZXJmYWNlLCBjbGFzcywgb3IgZW51bS5cbiAgICovXG4gIHJlYWRvbmx5IHNvdXJjZVBhdGg6IHN0cmluZztcbn1cblxuLyoqXG4gKiBBIHNpbmdsZSBkZW1vIG5vdGUsIGFzIHJlYWQgZnJvbSB0aGUgZGVtbyB2YXVsdC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEZW1vVmF1bHROb3RlIHtcbiAgLyoqXG4gICAqIFRoZSBub3RlJ3MgcmF3IE1hcmtkb3duIGNvbnRlbnQuXG4gICAqL1xuICByZWFkb25seSBjb250ZW50OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBub3RlJ3MgcGF0aCByZWxhdGl2ZSB0byB0aGUgZGVtbyB2YXVsdCBmb2xkZXIsIGUuZy4gYDAwIFN0YXJ0Lm1kYC5cbiAgICovXG4gIHJlYWRvbmx5IHJlbGF0aXZlUGF0aDogc3RyaW5nO1xufVxuXG4vKipcbiAqIFRoZSBwYXJzZWQgbWVtYmVycyBvZiBhIHNvdXJjZSBpbnRlcmZhY2UsIGNsYXNzLCBvciBlbnVtLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEludGVyZmFjZU1lbWJlcnMge1xuICAvKipcbiAgICogRXZlcnkgbWVtYmVyIOKAlCB7QGxpbmsgSW50ZXJmYWNlTWVtYmVycy5tZXRob2RzfSBmb2xsb3dlZCBieSB7QGxpbmsgSW50ZXJmYWNlTWVtYmVycy5wcm9wZXJ0aWVzfS5cbiAgICovXG4gIHJlYWRvbmx5IGFsbDogc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIFRoZSBtZXRob2QgbWVtYmVycyAoZGVjbGFyZWQgYXMgYG5hbWUoLi4uKWApLlxuICAgKi9cbiAgcmVhZG9ubHkgbWV0aG9kczogc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIFRoZSBwcm9wZXJ0eSBtZW1iZXJzIChkZWNsYXJlZCBhcyBgbmFtZT86IC4uLmApLlxuICAgKi9cbiAgcmVhZG9ubHkgcHJvcGVydGllczogc3RyaW5nW107XG59XG5cbi8qKlxuICogQSBub3RlIGxpbmUgcGFpcmVkIHdpdGggdGhlIGxpbmUgbnVtYmVyIGl0IGNhbWUgZnJvbSwgc28gYSBjaGVjayB0aGF0IHNraXBzIGZlbmNlZCBibG9ja3MgY2FuIHN0aWxsXG4gKiByZXBvcnQg4oCUIGFuZCBhbiBpbmxpbmUgZGlyZWN0aXZlIGNhbiBzdGlsbCBuYW1lIOKAlCB0aGUgbGluZSBhcyB0aGUgcmVhZGVyIHNlZXMgaXQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTm90ZUxpbmUge1xuICAvKipcbiAgICogVGhlIHplcm8tYmFzZWQgbGluZSBudW1iZXIgd2l0aGluIHRoZSBub3RlLlxuICAgKi9cbiAgcmVhZG9ubHkgaW5kZXg6IG51bWJlcjtcblxuICAvKipcbiAgICogVGhlIGxpbmUncyByYXcgdGV4dC5cbiAgICovXG4gIHJlYWRvbmx5IGxpbmU6IHN0cmluZztcbn1cblxuLyoqXG4gKiBBIGBkaXNhYmxlYCByZWdpb24gdGhhdCBoYXMgYmVlbiBvcGVuZWQgYW5kIG5vdCB5ZXQgZW5hYmxlZCBhZ2Fpbi5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBPcGVuV2lraWxpbmtEaXJlY3RpdmVSZWdpb24ge1xuICAvKipcbiAgICogV2hldGhlciB0aGUgcmVnaW9uIGhhcyBjb3ZlcmVkIGEgd2lraWxpbmssIHdoaWNoIGlzIHdoYXQgc3RvcHMgaXQgYmVpbmcgcmVwb3J0ZWQgYXMgcG9pbnRsZXNzLlxuICAgKi9cbiAgaXNVc2VkOiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBUaGUgbGluZSB0aGUgcmVnaW9uIHdhcyBvcGVuZWQgb24uXG4gICAqL1xuICByZWFkb25seSBsaW5lSW5kZXg6IG51bWJlcjtcbn1cblxuLyoqXG4gKiBUaGUgcGFyYW1ldGVycyBmb3Ige0BsaW5rIHJlZ2lzdGVyRGVtb1ZhdWx0Q292ZXJhZ2VTdWl0ZX0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmVnaXN0ZXJEZW1vVmF1bHRDb3ZlcmFnZVN1aXRlUGFyYW1zIHtcbiAgLyoqXG4gICAqIFR1bmVzIHRoZSBhbHdheXMtb24gYXV0aG9yaW5nIGNoZWNrcywgb3IgYHVuZGVmaW5lZGAgdG8gdGFrZSB0aGVpciBkZWZhdWx0cy4gSXQgY2Fubm90IGRpc2FibGUgdGhlbS5cbiAgICovXG4gIHJlYWRvbmx5IGF1dGhvcmluZz86IERlbW9WYXVsdEF1dGhvcmluZ1NwZWM7XG5cbiAgLyoqXG4gICAqIFRoZSBjb25maWcgaW50ZXJmYWNlcyB3aG9zZSBvcHRpb25zIG11c3QgZWFjaCBiZSBkZW1vbnN0cmF0ZWQgYnkgdGhlaXIgYmFyZSBuYW1lLCBvciBgdW5kZWZpbmVkYCB3aGVuIHRoZVxuICAgKiBwbHVnaW4gaGFzIG5vIHNldHRpbmdzLlxuICAgKi9cbiAgcmVhZG9ubHkgY29uZmlnSW50ZXJmYWNlcz86IERlbW9WYXVsdENvbmZpZ0ludGVyZmFjZUNvdmVyYWdlU3BlY1tdO1xuXG4gIC8qKlxuICAgKiBUaGUgZmVhdHVyZS1kb2MgbGlua2luZyBjaGVjaywgb3IgYHVuZGVmaW5lZGAgd2hlbiB0aGUgcGx1Z2luIHNoaXBzIG5vIGBkb2NzL2AgZm9sZGVyLlxuICAgKi9cbiAgcmVhZG9ubHkgZG9jcz86IERlbW9WYXVsdERvY3NDb3ZlcmFnZVNwZWM7XG5cbiAgLyoqXG4gICAqIFRoZSBtb2R1bGVzIHdob3NlIGBleHBvcnQgZnVuY3Rpb25gcyBtdXN0IGVhY2ggYmUgZGVtb25zdHJhdGVkIGJ5IHRoZWlyIGJhcmUgbmFtZSwgb3IgYHVuZGVmaW5lZGAgd2hlbiB0aGVcbiAgICogcGx1Z2luIGV4cG9zZXMgbm8gc3VjaCBtb2R1bGUgdG8gY2hlY2suXG4gICAqL1xuICByZWFkb25seSBmdW5jdGlvbk1vZHVsZXM/OiBEZW1vVmF1bHRGdW5jdGlvbnNDb3ZlcmFnZVNwZWNbXTtcblxuICAvKipcbiAgICogVGhlIGludGVyZmFjZXMgd2hvc2UgbWVtYmVycyBtdXN0IGVhY2ggYmUgZGVtb25zdHJhdGVkIChhbmQgcmVmZXJlbmNlZCB3aXRob3V0IGRyaWZ0KSwgb3IgYHVuZGVmaW5lZGAgd2hlblxuICAgKiB0aGUgcGx1Z2luIGV4cG9zZXMgbm8gcHVibGljIEFQSSBzdXJmYWNlIHRvIHJlZmxlY3QuXG4gICAqL1xuICByZWFkb25seSBpbnRlcmZhY2VzPzogRGVtb1ZhdWx0SW50ZXJmYWNlQ292ZXJhZ2VTcGVjW107XG5cbiAgLyoqXG4gICAqIFRoZSBndWFyZCB0aGF0IGtlZXBzIHRoZSByZWZsZWN0ZWQgc3VyZmFjZSBub24tdHJpdmlhbCwgb3IgYHVuZGVmaW5lZGAgd2hlbiB0aGVyZSBpcyBubyByZWZsZWN0ZWQgc3VyZmFjZVxuICAgKiB0byBndWFyZC4gVGhlIHZhdWx0IGlzIGNoZWNrZWQgZm9yIGJlaW5nIG5vbi1lbXB0eSBlaXRoZXIgd2F5LlxuICAgKi9cbiAgcmVhZG9ubHkgbm9uVHJpdmlhbEd1YXJkPzogRGVtb1ZhdWx0Tm9uVHJpdmlhbEd1YXJkU3BlYztcblxuICAvKipcbiAgICogVGhlIGFic29sdXRlIHBhdGggb2YgdGhlIHBsdWdpbiByZXBvIHJvb3QuIENhbGxlcnMgdHlwaWNhbGx5IHBhc3MgYGdldFJvb3RGb2xkZXIoKSA/PyBwcm9jZXNzLmN3ZCgpYC5cbiAgICovXG4gIHJlYWRvbmx5IHJvb3RGb2xkZXI6IHN0cmluZztcbn1cblxuLyoqXG4gKiBXaGF0IGEgbm90ZSdzIGlubGluZSBgb2JzaWRpYW4tZGV2LXV0aWxzLWRpc2FibGXigKZgIGRpcmVjdGl2ZXMgYWxsb3csIGFuZCB3aGF0IGlzIHdyb25nIHdpdGggdGhlbS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXaWtpbGlua0RpcmVjdGl2ZVNjYW4ge1xuICAvKipcbiAgICogVGhlIHplcm8tYmFzZWQgbGluZSBudW1iZXJzIGEgZGlyZWN0aXZlIGFsbG93cyBhIHdpa2lsaW5rIG9uLlxuICAgKi9cbiAgcmVhZG9ubHkgYWxsb3dlZExpbmVJbmRleGVzOiBSZWFkb25seVNldDxudW1iZXI+O1xuXG4gIC8qKlxuICAgKiBUaGUgZGlyZWN0aXZlIG1pc3Rha2VzIGZvdW5kLCBlYWNoIHBocmFzZWQgZm9yIGEgZmFpbGluZyBhc3NlcnRpb24uXG4gICAqL1xuICByZWFkb25seSBwcm9ibGVtczogc3RyaW5nW107XG59XG5cbi8qKlxuICogVGhlIHJ1bm5pbmcgc3RhdGUgb2YgYSBkaXJlY3RpdmUgc2NhbiwgdGhyZWFkZWQgdGhyb3VnaCB0aGUgcGVyLWxpbmUgaGVscGVycy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXaWtpbGlua0RpcmVjdGl2ZVNjYW5TdGF0ZSB7XG4gIC8qKlxuICAgKiBUaGUgbGluZXMgYSBkaXJlY3RpdmUgaGFzIGFsbG93ZWQgYSB3aWtpbGluayBvbiBzbyBmYXIuXG4gICAqL1xuICByZWFkb25seSBhbGxvd2VkTGluZUluZGV4ZXM6IFNldDxudW1iZXI+O1xuXG4gIC8qKlxuICAgKiBUaGUgcmVnaW9uIGN1cnJlbnRseSBvcGVuLCBhbmQgd2hldGhlciBpdCBoYXMgY292ZXJlZCBhIHdpa2lsaW5rIHlldC5cbiAgICovXG4gIG9wZW5SZWdpb246IG51bGwgfCBPcGVuV2lraWxpbmtEaXJlY3RpdmVSZWdpb247XG5cbiAgLyoqXG4gICAqIFRoZSBsaW5lIGEgYGRpc2FibGUtbmV4dC1saW5lYCB3YXMgcmVhZCBvbiwgd2hpbGUgaXQgc3RpbGwgd2FpdHMgZm9yIHRoZSBsaW5lIGl0IGNvdmVycy5cbiAgICovXG4gIHBlbmRpbmdOZXh0TGluZUluZGV4OiBudWxsIHwgbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBUaGUgZGlyZWN0aXZlIG1pc3Rha2VzIGZvdW5kIHNvIGZhci5cbiAgICovXG4gIHJlYWRvbmx5IHByb2JsZW1zOiBzdHJpbmdbXTtcblxuICAvKipcbiAgICogVGhlIGxpbmVzIG9mIHRoZSBub3RlIHRoYXQgY2FycnkgYSB3aWtpbGluay5cbiAgICovXG4gIHJlYWRvbmx5IHdpa2lsaW5rTGluZUluZGV4ZXM6IFJlYWRvbmx5U2V0PG51bWJlcj47XG59XG5cbi8qKlxuICogUmVmbGVjdHMgYSBwbHVnaW4ncyBwdWJsaWMgc3VyZmFjZSBmcm9tIHNvdXJjZSBhbmQgY2hlY2tzIGl0cyBpbi1yZXBvIGBkZW1vLXZhdWx0L2Agc3RheXMgaW4gc3luYyB3aXRoIGl0LlxuICpcbiAqIEV2ZXJ5IG1ldGhvZCBpcyBhIHB1cmUgcXVlcnkgb3ZlciBmaWxlcyB1bmRlciB0aGUgcmVwbyByb290ICh0aGUgZGVtbyBjb3JwdXMgaXMgcmVhZCBvbmNlIGFuZCBjYWNoZWQpLCBzb1xuICogdGhlIGNoZWNrZXIgaXMgdHJpdmlhbGx5IHVuaXQtdGVzdGFibGUgYWdhaW5zdCBhIGZpeHR1cmUgcmVwbyBhbmQgY2FycmllcyBubyB0ZXN0LWZyYW1ld29yayBkZXBlbmRlbmN5LlxuICovXG5leHBvcnQgY2xhc3MgRGVtb1ZhdWx0Q292ZXJhZ2VDaGVja2VyIHtcbiAgcHJpdmF0ZSBjYWNoZWRDb3JwdXM6IG51bGwgfCBzdHJpbmcgPSBudWxsO1xuICBwcml2YXRlIGNhY2hlZE5vdGVzOiBEZW1vVmF1bHROb3RlW10gfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSByZWFkb25seSBkZW1vVmF1bHRGb2xkZXI6IHN0cmluZztcbiAgcHJpdmF0ZSByZWFkb25seSBleGNsdWRlZE5vdGVzOiBTZXQ8c3RyaW5nPjtcbiAgcHJpdmF0ZSByZWFkb25seSByb290Rm9sZGVyOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBjaGVja2VyIHJvb3RlZCBhdCBhIHBsdWdpbiByZXBvLlxuICAgKlxuICAgKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIHRoZSBjb25zdHJ1Y3Rvci5cbiAgICovXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihwYXJhbXM6IERlbW9WYXVsdENvdmVyYWdlQ2hlY2tlckNvbnN0cnVjdG9yUGFyYW1zKSB7XG4gICAgdGhpcy5yb290Rm9sZGVyID0gcGFyYW1zLnJvb3RGb2xkZXI7XG4gICAgdGhpcy5kZW1vVmF1bHRGb2xkZXIgPSBqb2luKHRoaXMucm9vdEZvbGRlciwgT2JzaWRpYW5QbHVnaW5SZXBvUGF0aHMuRGVtb1ZhdWx0KTtcbiAgICB0aGlzLmV4Y2x1ZGVkTm90ZXMgPSBuZXcgU2V0KHBhcmFtcy5leGNsdWRlZE5vdGVzID8/IERFRkFVTFRfRVhDTFVERURfTk9URVMpO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbGxlY3RzIHRoZSBkZW1vIG5vdGVzIGFzIHBhdGhzIHJlbGF0aXZlIHRvIHRoZSBkZW1vIHZhdWx0IGZvbGRlciAoZm9yIGEgbm9uLXRyaXZpYWwtc3VyZmFjZSBndWFyZCkuXG4gICAqXG4gICAqIEByZXR1cm5zIFRoZSByZWxhdGl2ZSBwYXRocyBvZiBldmVyeSBgKi5tZGAgbm90ZSBpbiB0aGUgZGVtbyB2YXVsdC5cbiAgICovXG4gIHB1YmxpYyBjb2xsZWN0RGVtb05vdGVSZWxhdGl2ZVBhdGhzKCk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gdGhpcy5jb2xsZWN0Tm90ZXMoKS5tYXAoKG5vdGUpID0+IG5vdGUucmVsYXRpdmVQYXRoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWFkcyBhbmQgY2FjaGVzIGV2ZXJ5IGRlbW8gbm90ZSBpbmRpdmlkdWFsbHkg4oCUIHRoZSBwZXItbm90ZSB2aWV3IHRoZSBhdXRob3JpbmcgY2hlY2tzIHdvcmsgb24sIGFzXG4gICAqIG9wcG9zZWQgdG8gdGhlIGNvbmNhdGVuYXRlZCB7QGxpbmsgRGVtb1ZhdWx0Q292ZXJhZ2VDaGVja2VyLnJlYWRDb3JwdXN9LlxuICAgKlxuICAgKiBAcmV0dXJucyBFdmVyeSBgKi5tZGAgbm90ZSBpbiB0aGUgZGVtbyB2YXVsdCwgZXhjbHVkZWQgb25lcyBpbmNsdWRlZC5cbiAgICovXG4gIHB1YmxpYyBjb2xsZWN0Tm90ZXMoKTogRGVtb1ZhdWx0Tm90ZVtdIHtcbiAgICB0aGlzLmNhY2hlZE5vdGVzID8/PSB0aGlzLmNvbGxlY3RNYXJrZG93bkZpbGVzKHRoaXMuZGVtb1ZhdWx0Rm9sZGVyKS5tYXAoKGZpbGUpID0+ICh7XG4gICAgICBjb250ZW50OiByZWFkRmlsZVN5bmMoZmlsZSwgJ3V0Zi04JyksXG4gICAgICByZWxhdGl2ZVBhdGg6IHJlbGF0aXZlKHRoaXMuZGVtb1ZhdWx0Rm9sZGVyLCBmaWxlKVxuICAgIH0pKTtcbiAgICByZXR1cm4gdGhpcy5jYWNoZWROb3RlcztcbiAgfVxuXG4gIC8qKlxuICAgKiBGaW5kcyB0aGUgYC5vYnNpZGlhbi9hcHAuanNvbmAgc2V0dGluZ3MgdGhlIHZhdWx0IGNvbW1pdHMgdGhhdCBgb2JzaWRpYW4tZGV2LXV0aWxzYCBvd25zIGFuZCB3cml0ZXNcbiAgICogaW50byB0aGUgYXJjaGl2ZWQgdmF1bHQgaXRzZWxmLiBBIGNvbW1pdHRlZCBvbmUgaXMgYSBzZWNvbmQgY29weSBvZiBhIHNldHRpbmcgbm90aGluZyByZWNvbmNpbGVzLCBhbmRcbiAgICogaXQgaXMgdGhlIGNvcHkgdGhhdCBnb2VzIHN0YWxlIOKAlCBzbyB0aGUgY29udmVudGlvbiBpcyB0aGF0IHRoZSB2YXVsdCBjb21taXRzIG5vbmUgb2YgdGhlbS5cbiAgICpcbiAgICogQHJldHVybnMgVGhlIG5hbWVzIG9mIHRoZSBvd25lZCBzZXR0aW5ncyB0aGUgY29tbWl0dGVkIGBhcHAuanNvbmAgc2V0cy4gQSB2YXVsdCB0aGF0IGNvbW1pdHMgbm9cbiAgICogYGFwcC5qc29uYCBhdCBhbGwgaXMgZmluZSwgYW5kIHlpZWxkcyBub25lLlxuICAgKi9cbiAgcHVibGljIGZpbmRDb21taXR0ZWRBcHBKc29uU2V0dGluZ3MoKTogc3RyaW5nW10ge1xuICAgIGNvbnN0IGFwcEpzb25QYXRoID0gam9pbih0aGlzLmRlbW9WYXVsdEZvbGRlciwgT2JzaWRpYW5QbHVnaW5SZXBvUGF0aHMuRG90T2JzaWRpYW4sIE9ic2lkaWFuUGx1Z2luUmVwb1BhdGhzLkFwcEpzb24pO1xuICAgIGNvbnN0IGNvbnRlbnQgPSBleGlzdHNTeW5jKGFwcEpzb25QYXRoKSA/IHJlYWRGaWxlU3luYyhhcHBKc29uUGF0aCwgJ3V0Zi04JykgOiBudWxsO1xuICAgIHJldHVybiBmaW5kT3duZWREZW1vVmF1bHRBcHBKc29uU2V0dGluZ3MoeyBhcHBKc29uOiBwYXJzZURlbW9WYXVsdEFwcEpzb24oeyBjb250ZW50LCBwYXRoOiBhcHBKc29uUGF0aCB9KSB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaW5kcyBub3RlcyBjYXJyeWluZyBhIGBbRG9jc10o4oCmKWAgbGluayBsaW5lLiBUaGUgbm90ZSBJUyB0aGUgZG9jdW1lbnRhdGlvbiwgc28gYSBsaW5lIHBvaW50aW5nXG4gICAqIGVsc2V3aGVyZSBmb3IgdGhlIHJlYWwgZXhwbGFuYXRpb24gaXMgdGhlIHNoYXBlIHRoaXMgY29udmVudGlvbiBleGlzdHMgdG8gcmVtb3ZlLlxuICAgKlxuICAgKiBAcmV0dXJucyBUaGUgcmVsYXRpdmUgcGF0aHMgb2YgdGhlIG9mZmVuZGluZyBub3Rlcy5cbiAgICovXG4gIHB1YmxpYyBmaW5kTm90ZXNXaXRoRG9jc0xpbmtzKCk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gdGhpcy5jb2xsZWN0Q2hlY2thYmxlTm90ZXMoKVxuICAgICAgLmZpbHRlcigobm90ZSkgPT4gZ2V0TGluZXNPdXRzaWRlRmVuY2VzKG5vdGUuY29udGVudCkuc29tZSgobGluZSkgPT4gRE9DU19MSU5LX1JFR19FWFAudGVzdChsaW5lKSkpXG4gICAgICAubWFwKChub3RlKSA9PiBub3RlLnJlbGF0aXZlUGF0aCk7XG4gIH1cblxuICAvKipcbiAgICogRmluZHMgbm90ZXMgdGhhdCBkbyBub3Qgb3BlbiB3aXRoIGFuIGAjIEgxYCAoZnJvbnRtYXR0ZXIgYXNpZGUpLlxuICAgKlxuICAgKiBAcmV0dXJucyBUaGUgcmVsYXRpdmUgcGF0aHMgb2YgdGhlIG9mZmVuZGluZyBub3Rlcy5cbiAgICovXG4gIHB1YmxpYyBmaW5kTm90ZXNXaXRob3V0SDEoKTogc3RyaW5nW10ge1xuICAgIHJldHVybiB0aGlzLmNvbGxlY3RDaGVja2FibGVOb3RlcygpXG4gICAgICAuZmlsdGVyKChub3RlKSA9PiAhaGFzSDEobm90ZS5jb250ZW50KSlcbiAgICAgIC5tYXAoKG5vdGUpID0+IG5vdGUucmVsYXRpdmVQYXRoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaW5kcyBub3RlcyB3aXRoIG5vIHByb3NlIHBhcmFncmFwaCBiZWZvcmUgdGhlaXIgZmlyc3QgY29kZSBmZW5jZSDigJQgdGhlIDEtMyBzZW50ZW5jZXMgc2F5aW5nIHdoYXQgdGhlXG4gICAqIGZlYXR1cmUgZG9lcyBhbmQgd2h5IGEgcmVhZGVyIHdvdWxkIHdhbnQgaXQsIHdpdGhvdXQgd2hpY2ggdGhlIG5vdGUgaXMgYSBidXR0b24gd2l0aCBubyBsZXNzb24uXG4gICAqXG4gICAqIEByZXR1cm5zIFRoZSByZWxhdGl2ZSBwYXRocyBvZiB0aGUgb2ZmZW5kaW5nIG5vdGVzLlxuICAgKi9cbiAgcHVibGljIGZpbmROb3Rlc1dpdGhvdXRJbnRyb1Byb3NlKCk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gdGhpcy5jb2xsZWN0Q2hlY2thYmxlTm90ZXMoKVxuICAgICAgLmZpbHRlcigobm90ZSkgPT4gIWhhc0ludHJvUHJvc2Uobm90ZS5jb250ZW50KSlcbiAgICAgIC5tYXAoKG5vdGUpID0+IG5vdGUucmVsYXRpdmVQYXRoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaW5kcyBub3RlcyB3aG9zZSB3aWtpbGluayBhbGxvd2FuY2UgaXMgbm90IGRvaW5nIGFueSB3b3JrIOKAlCBkZWNsYXJlZCB3aXRob3V0IGEgcmVhc29uLCBvciBvbiBhIG5vdGVcbiAgICogdGhhdCBjYXJyaWVzIG5vIHdpa2lsaW5rIGF0IGFsbC4gQm90aCBhcmUgZHJpZnQ6IGFuIGV4ZW1wdGlvbiBub2JvZHkgY2FuIGp1c3RpZnksIGFuZCBvbmUgbm90aGluZyBuZWVkc1xuICAgKiBhbnkgbW9yZSwgd2hpY2ggd291bGQgZ28gb24gaGlkaW5nIHRoZSBuZXh0IHdpa2lsaW5rIHNvbWVib2R5IGFkZHMgYnkgYWNjaWRlbnQuXG4gICAqXG4gICAqIEByZXR1cm5zIFRoZSByZWxhdGl2ZSBwYXRocyBvZiB0aGUgb2ZmZW5kaW5nIG5vdGVzLlxuICAgKi9cbiAgcHVibGljIGZpbmROb3Rlc1dpdGhVbmp1c3RpZmllZFdpa2lsaW5rQWxsb3dhbmNlKCk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gdGhpcy5jb2xsZWN0Q2hlY2thYmxlTm90ZXMoKS5mbGF0TWFwKChub3RlKSA9PiB7XG4gICAgICBjb25zdCBzY2FuID0gc2Nhbldpa2lsaW5rRGlyZWN0aXZlcyhub3RlLmNvbnRlbnQpO1xuICAgICAgY29uc3QgcHJvYmxlbXMgPSBbLi4uc2Nhbi5wcm9ibGVtc107XG4gICAgICBjb25zdCByZWFzb24gPSByZWFkV2lraWxpbmtBbGxvd2FuY2VSZWFzb24obm90ZS5jb250ZW50KTtcbiAgICAgIGlmIChyZWFzb24gIT09IG51bGwpIHtcbiAgICAgICAgaWYgKHJlYXNvbi50cmltKCkgPT09ICcnKSB7XG4gICAgICAgICAgcHJvYmxlbXMucHVzaCgnYSBub3RlLWxldmVsIGFsbG93YW5jZSB3aXRoIG5vIHJlYXNvbicpO1xuICAgICAgICB9IGVsc2UgaWYgKCFoYXNXaWtpbGluayhub3RlLmNvbnRlbnQpKSB7XG4gICAgICAgICAgcHJvYmxlbXMucHVzaCgnYSBub3RlLWxldmVsIGFsbG93YW5jZSBjb3ZlcmluZyBubyB3aWtpbGluaycpO1xuICAgICAgICB9IGVsc2UgaWYgKHNjYW4uYWxsb3dlZExpbmVJbmRleGVzLnNpemUgPiAwKSB7XG4gICAgICAgICAgcHJvYmxlbXMucHVzaCgnaW5saW5lIGRpcmVjdGl2ZXMgdGhlIG5vdGUtbGV2ZWwgYWxsb3dhbmNlIGFscmVhZHkgY292ZXJzJyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBwcm9ibGVtcy5tYXAoKHByb2JsZW0pID0+IGAke25vdGUucmVsYXRpdmVQYXRofTogJHtwcm9ibGVtfWApO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpbmRzIG5vdGVzIHVzaW5nIGFuIE9ic2lkaWFuIGBbW3dpa2lsaW5rXV1gIG91dHNpZGUgYSBjb2RlIGZlbmNlLiBUaGUgZGVtbyB2YXVsdCBpcyBhbHNvIHJlYWQgb25cbiAgICogR2l0SHViLCB3aGVyZSBhIHdpa2lsaW5rIHJlbmRlcnMgYXMgbGl0ZXJhbCBicmFja2V0cyBhbmQgbGVhZHMgbm93aGVyZS4gQSB3aWtpbGluayBzaG93biBJTlNJREUgYVxuICAgKiBmZW5jZSBpcyBzYW1wbGUgdGV4dCwgbm90IG5hdmlnYXRpb24sIHNvIGZlbmNlZCBibG9ja3MgYXJlIHNraXBwZWQsIGFzIGlzIGEgbm90ZSB0aGF0IGRlY2xhcmVzIGluIGl0c1xuICAgKiBmcm9udG1hdHRlciB3aHkgaXRzIHdpa2lsaW5rcyBhcmUgdGhlIHBvaW50IOKAlCBzZWUgdGhlIGZpbGUgb3ZlcnZpZXcuXG4gICAqXG4gICAqIEByZXR1cm5zIFRoZSByZWxhdGl2ZSBwYXRocyBvZiB0aGUgb2ZmZW5kaW5nIG5vdGVzLlxuICAgKi9cbiAgcHVibGljIGZpbmROb3Rlc1dpdGhXaWtpbGlua3MoKTogc3RyaW5nW10ge1xuICAgIHJldHVybiB0aGlzLmNvbGxlY3RDaGVja2FibGVOb3RlcygpXG4gICAgICAuZmlsdGVyKChub3RlKSA9PiB7XG4gICAgICAgIGlmIChyZWFkV2lraWxpbmtBbGxvd2FuY2VSZWFzb24obm90ZS5jb250ZW50KSAhPT0gbnVsbCkge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB7IGFsbG93ZWRMaW5lSW5kZXhlcyB9ID0gc2Nhbldpa2lsaW5rRGlyZWN0aXZlcyhub3RlLmNvbnRlbnQpO1xuICAgICAgICByZXR1cm4gZmluZFdpa2lsaW5rTGluZUluZGV4ZXMobm90ZS5jb250ZW50KS5zb21lKChsaW5lSW5kZXgpID0+ICFhbGxvd2VkTGluZUluZGV4ZXMuaGFzKGxpbmVJbmRleCkpO1xuICAgICAgfSlcbiAgICAgIC5tYXAoKG5vdGUpID0+IG5vdGUucmVsYXRpdmVQYXRoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaW5kcyBtZW1iZXJzIHRoYXQgdGhlIGRlbW8gbm90ZXMgcmVmZXJlbmNlIG9uIGEgcmVjZWl2ZXIgYnV0IHRoYXQgbm8gbG9uZ2VyIGV4aXN0IG9uIGl0IChyZW5hbWUgZHJpZnQpLlxuICAgKlxuICAgKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIHRoZSBsb29rdXAuXG4gICAqIEByZXR1cm5zIFRoZSBkaXN0aW5jdCBzdGFsZSBtZW1iZXIgbmFtZXMgcmVmZXJlbmNlZCBpbiB0aGUgZGVtbyBjb3JwdXMuXG4gICAqL1xuICBwdWJsaWMgZmluZFN0YWxlUmVmZXJlbmNlcyhwYXJhbXM6IERlbW9WYXVsdENvdmVyYWdlQ2hlY2tlckZpbmRTdGFsZVJlZmVyZW5jZXNQYXJhbXMpOiBzdHJpbmdbXSB7XG4gICAgY29uc3QgdmFsaWRNZW1iZXJzID0gbmV3IFNldChwYXJhbXMudmFsaWRNZW1iZXJzKTtcbiAgICBjb25zdCByZWZlcmVuY2VkID0gWy4uLnRoaXMucmVhZENvcnB1cygpLm1hdGNoQWxsKG5ldyBSZWdFeHAoU3RyaW5nLnJhd2Ake3BhcmFtcy5yZWNlaXZlcn1cXC4oPzxtZW1iZXI+XFx3KylgLCAnZycpKV1cbiAgICAgIC5tYXAoKG1hdGNoKSA9PiBnZXRNYW5kYXRvcnlOYW1lZEdyb3VwKG1hdGNoLCAnbWVtYmVyJykpO1xuICAgIHJldHVybiBbLi4ubmV3IFNldChyZWZlcmVuY2VkKV0uZmlsdGVyKChtZW1iZXIpID0+ICF2YWxpZE1lbWJlcnMuaGFzKG1lbWJlcikpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpbmRzIG1lbWJlcnMgdGhhdCBhcmUgbm90IGRlbW9uc3RyYXRlZCBhbnl3aGVyZSBpbiB0aGUgZGVtbyBjb3JwdXMuXG4gICAqXG4gICAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgcGFyYW1ldGVycyBmb3IgdGhlIGxvb2t1cC5cbiAgICogQHJldHVybnMgVGhlIG1lbWJlciBuYW1lcyB3aXRoIG5vIGRlbW9uc3RyYXRpb24uXG4gICAqL1xuICBwdWJsaWMgZmluZFVuZGVtb25zdHJhdGVkTWVtYmVycyhwYXJhbXM6IERlbW9WYXVsdENvdmVyYWdlQ2hlY2tlckZpbmRVbmRlbW9uc3RyYXRlZE1lbWJlcnNQYXJhbXMpOiBzdHJpbmdbXSB7XG4gICAgY29uc3QgY29ycHVzID0gdGhpcy5yZWFkQ29ycHVzKCk7XG4gICAgcmV0dXJuIHBhcmFtcy5tZW1iZXJzLmZpbHRlcigobWVtYmVyKSA9PiB7XG4gICAgICBjb25zdCBuZWVkbGUgPSBwYXJhbXMucmVjZWl2ZXIgPT09IHVuZGVmaW5lZCA/IG1lbWJlciA6IGAke3BhcmFtcy5yZWNlaXZlcn0uJHttZW1iZXJ9YDtcbiAgICAgIHJldHVybiAhY29ycHVzLmluY2x1ZGVzKG5lZWRsZSk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogRmluZHMgZmVhdHVyZSBkb2NzIHRoYXQgbm8gZGVtbyBub3RlIGxpbmtzIHRvLlxuICAgKlxuICAgKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIHRoZSBsb29rdXAuXG4gICAqIEByZXR1cm5zIFRoZSBmZWF0dXJlLWRvYyBiYXNlbmFtZXMgKHdpdGhvdXQgYC5tZGApIG5vdCBsaW5rZWQgZnJvbSBhbnkgZGVtbyBub3RlLlxuICAgKi9cbiAgcHVibGljIGZpbmRVbmxpbmtlZEZlYXR1cmVEb2NzKHBhcmFtczogRGVtb1ZhdWx0Q292ZXJhZ2VDaGVja2VyRmluZFVubGlua2VkRmVhdHVyZURvY3NQYXJhbXMpOiBzdHJpbmdbXSB7XG4gICAgY29uc3Qgbm9uRmVhdHVyZURvY3MgPSBuZXcgU2V0KHBhcmFtcy5ub25GZWF0dXJlRG9jcyk7XG4gICAgY29uc3QgZmVhdHVyZURvY3MgPSByZWFkZGlyU3luYyhqb2luKHRoaXMucm9vdEZvbGRlciwgcGFyYW1zLmRvY3NGb2xkZXIpKVxuICAgICAgLmZpbHRlcigoZmlsZSkgPT4gZmlsZS5lbmRzV2l0aCgnLm1kJykpXG4gICAgICAubWFwKChmaWxlKSA9PiBmaWxlLnJlcGxhY2UoL1xcLm1kJC8sICcnKSlcbiAgICAgIC5maWx0ZXIoKG5hbWUpID0+ICFub25GZWF0dXJlRG9jcy5oYXMobmFtZSkpO1xuICAgIGNvbnN0IGxpbmtlZERvY3MgPSBuZXcgU2V0KFxuICAgICAgWy4uLnRoaXMucmVhZENvcnB1cygpLm1hdGNoQWxsKC9kb2NzXFwvKD88ZG9jPltcXHctXSspXFwubWQvZyldLm1hcCgobWF0Y2gpID0+IGdldE1hbmRhdG9yeU5hbWVkR3JvdXAobWF0Y2gsICdkb2MnKSlcbiAgICApO1xuICAgIHJldHVybiBmZWF0dXJlRG9jcy5maWx0ZXIoKGRvYykgPT4gIWxpbmtlZERvY3MuaGFzKGRvYykpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpbmRzIG5vdGVzIHRoYXQgY2Fubm90IGJlIHJlYWNoZWQgZnJvbSB0aGUgc3RhcnQgbm90ZSBieSBmb2xsb3dpbmcgTWFya2Rvd24gbGlua3MgYmV0d2VlbiBub3Rlcy5cbiAgICpcbiAgICogVGhlIHdhbGsgc3RhcnRzIGF0IHtAbGluayBEZW1vVmF1bHRDb3ZlcmFnZUNoZWNrZXJGaW5kVW5yZWFjaGFibGVOb3Rlc1BhcmFtcy5zdGFydE5vdGV9IGFuZCBmb2xsb3dzXG4gICAqIGV2ZXJ5IGBbVGV4dF0oPC4vTk4gTmFtZS5tZD4pYCBsaW5rIG91dHNpZGUgYSBjb2RlIGZlbmNlLCB0cmFuc2l0aXZlbHkuIEEgbm90ZSBub3RoaW5nIGxpbmtzIHRvIGlzXG4gICAqIG9uZSBhIHJlYWRlciBjYW4gb25seSBmaW5kIGJ5IGJyb3dzaW5nIHRoZSBmaWxlIGxpc3Qg4oCUIHdoaWNoIGlzIGV4YWN0bHkgd2hhdCB0aGUgZ3JvdXBlZCBpbmRleCBpbiB0aGVcbiAgICogc3RhcnQgbm90ZSBpcyBtZWFudCB0byByZXBsYWNlLiBXaGVuIHRoZSBzdGFydCBub3RlIGl0c2VsZiBpcyBtaXNzaW5nLCBFVkVSWSBub3RlIGlzIHVucmVhY2hhYmxlLFxuICAgKiBiZWNhdXNlIHRoZXJlIGlzIG5vd2hlcmUgdG8gc3RhcnQgZnJvbS5cbiAgICpcbiAgICogQHBhcmFtIHBhcmFtcyAtIFRoZSBwYXJhbWV0ZXJzIGZvciB0aGUgd2Fsay5cbiAgICogQHJldHVybnMgVGhlIHJlbGF0aXZlIHBhdGhzIG9mIHRoZSB1bnJlYWNoYWJsZSBub3Rlcy5cbiAgICovXG4gIHB1YmxpYyBmaW5kVW5yZWFjaGFibGVOb3RlcyhwYXJhbXM6IERlbW9WYXVsdENvdmVyYWdlQ2hlY2tlckZpbmRVbnJlYWNoYWJsZU5vdGVzUGFyYW1zKTogc3RyaW5nW10ge1xuICAgIGNvbnN0IG5vdGVzQnlSZWxhdGl2ZVBhdGggPSBuZXcgTWFwKHRoaXMuY29sbGVjdE5vdGVzKCkubWFwKChub3RlKSA9PiBbbm90ZS5yZWxhdGl2ZVBhdGgsIG5vdGVdKSk7XG4gICAgY29uc3QgcmVhY2hlZE5vdGVzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gICAgY29uc3QgcGVuZGluZ05vdGVzID0gW3BhcmFtcy5zdGFydE5vdGVdO1xuXG4gICAgd2hpbGUgKHBlbmRpbmdOb3Rlcy5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBub3RlUGF0aCA9IGVuc3VyZU5vbk51bGxhYmxlKHBlbmRpbmdOb3Rlcy5wb3AoKSk7XG4gICAgICBjb25zdCBub3RlID0gbm90ZXNCeVJlbGF0aXZlUGF0aC5nZXQobm90ZVBhdGgpO1xuICAgICAgaWYgKCFub3RlIHx8IHJlYWNoZWROb3Rlcy5oYXMobm90ZVBhdGgpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgcmVhY2hlZE5vdGVzLmFkZChub3RlUGF0aCk7XG4gICAgICBwZW5kaW5nTm90ZXMucHVzaCguLi5jb2xsZWN0Tm90ZUxpbmtUYXJnZXRzKG5vdGUpKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5jb2xsZWN0Q2hlY2thYmxlTm90ZXMoKVxuICAgICAgLm1hcCgobm90ZSkgPT4gbm90ZS5yZWxhdGl2ZVBhdGgpXG4gICAgICAuZmlsdGVyKChub3RlUGF0aCkgPT4gIXJlYWNoZWROb3Rlcy5oYXMobm90ZVBhdGgpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQYXJzZXMgdGhlIG5hbWVzIG9mIHRoZSBgZXhwb3J0IGZ1bmN0aW9uYHMgKGluY2x1ZGluZyBgYXN5bmNgIGFuZCBnZW5lcmF0b3IgZGVjbGFyYXRpb25zKSBpbiBhIHNvdXJjZSBmaWxlLlxuICAgKlxuICAgKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIHRoZSBsb29rdXAuXG4gICAqIEByZXR1cm5zIFRoZSBleHBvcnRlZCBmdW5jdGlvbiBuYW1lcyBpbiBzb3VyY2Ugb3JkZXIuXG4gICAqL1xuICBwdWJsaWMgZ2V0RXhwb3J0ZWRGdW5jdGlvbk5hbWVzKHBhcmFtczogRGVtb1ZhdWx0Q292ZXJhZ2VDaGVja2VyR2V0RXhwb3J0ZWRGdW5jdGlvbk5hbWVzUGFyYW1zKTogc3RyaW5nW10ge1xuICAgIGNvbnN0IHNvdXJjZSA9IHJlYWRGaWxlU3luYyhqb2luKHRoaXMucm9vdEZvbGRlciwgcGFyYW1zLnNvdXJjZVBhdGgpLCAndXRmLTgnKTtcbiAgICByZXR1cm4gWy4uLnNvdXJjZS5tYXRjaEFsbCgvXmV4cG9ydCAoPzphc3luYyApP2Z1bmN0aW9uXFwqPyAoPzxuYW1lPlxcdyspL2dtKV1cbiAgICAgIC5tYXAoKG1hdGNoKSA9PiBnZXRNYW5kYXRvcnlOYW1lZEdyb3VwKG1hdGNoLCAnbmFtZScpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQYXJzZXMgdGhlIG1lbWJlcnMgb2YgYW4gYGV4cG9ydCBpbnRlcmZhY2VgLCBgZXhwb3J0IGNsYXNzYCwgb3IgYGV4cG9ydCBlbnVtYCBkZWNsYXJlZCBpbiBhIHNvdXJjZSBmaWxlLlxuICAgKlxuICAgKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIHRoZSBsb29rdXAuXG4gICAqIEByZXR1cm5zIFRoZSBwYXJzZWQge0BsaW5rIEludGVyZmFjZU1lbWJlcnN9LlxuICAgKiBAdGhyb3dzIFdoZW4gdGhlIGludGVyZmFjZSwgY2xhc3MsIG9yIGVudW0gY2Fubm90IGJlIGZvdW5kIGluIHRoZSBzb3VyY2UgZmlsZS5cbiAgICovXG4gIHB1YmxpYyBnZXRJbnRlcmZhY2VNZW1iZXJzKHBhcmFtczogRGVtb1ZhdWx0Q292ZXJhZ2VDaGVja2VyR2V0SW50ZXJmYWNlTWVtYmVyc1BhcmFtcyk6IEludGVyZmFjZU1lbWJlcnMge1xuICAgIGNvbnN0IHNvdXJjZSA9IHJlYWRGaWxlU3luYyhqb2luKHRoaXMucm9vdEZvbGRlciwgcGFyYW1zLnNvdXJjZVBhdGgpLCAndXRmLTgnKTtcbiAgICBjb25zdCBtYXRjaCA9IG5ldyBSZWdFeHAoU3RyaW5nLnJhd2BleHBvcnQgKD88a2V5d29yZD5pbnRlcmZhY2V8Y2xhc3N8ZW51bSkgJHtwYXJhbXMuaW50ZXJmYWNlTmFtZX1cXGJbXntdKlxceyg/PGJvZHk+W1xcc1xcU10qPylcXG5cXH1gKS5leGVjKHNvdXJjZSk7XG4gICAgaWYgKCFtYXRjaCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBDb3VsZCBub3QgZmluZCBpbnRlcmZhY2UgJHtwYXJhbXMuaW50ZXJmYWNlTmFtZX1gKTtcbiAgICB9XG4gICAgcmV0dXJuIHBhcnNlTWVtYmVycyhnZXRNYW5kYXRvcnlOYW1lZEdyb3VwKG1hdGNoLCAna2V5d29yZCcpLCBnZXRNYW5kYXRvcnlOYW1lZEdyb3VwKG1hdGNoLCAnYm9keScpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWFkcyBhbmQgY2FjaGVzIHRoZSBkZW1vIGNvcnB1cyDigJQgZXZlcnkgYCoubWRgIG5vdGUgaW4gdGhlIGRlbW8gdmF1bHQgam9pbmVkIGludG8gb25lIHN0cmluZy5cbiAgICpcbiAgICogQHJldHVybnMgVGhlIGNvbmNhdGVuYXRlZCBkZW1vLW5vdGUgY29udGVudHMuXG4gICAqL1xuICBwdWJsaWMgcmVhZENvcnB1cygpOiBzdHJpbmcge1xuICAgIHRoaXMuY2FjaGVkQ29ycHVzID8/PSB0aGlzLmNvbGxlY3ROb3RlcygpXG4gICAgICAubWFwKChub3RlKSA9PiBub3RlLmNvbnRlbnQpXG4gICAgICAuam9pbignXFxuJyk7XG4gICAgcmV0dXJuIHRoaXMuY2FjaGVkQ29ycHVzO1xuICB9XG5cbiAgLy8gVGhlIG5vdGVzIHRoZSBhdXRob3JpbmcgY2hlY2tzIGFwcGx5IHRvOiBldmVyeSBub3RlIGV4Y2VwdCB0aGUgb25lcyBkZWNsYXJlZCBvdXRzaWRlIHRoZSBsZWFybmluZ1xuICAvLyBwYXRoICh0aGUgdmF1bHQncyBvd24gYFJFQURNRS5tZGAgYnkgZGVmYXVsdCkuXG4gIHByaXZhdGUgY29sbGVjdENoZWNrYWJsZU5vdGVzKCk6IERlbW9WYXVsdE5vdGVbXSB7XG4gICAgcmV0dXJuIHRoaXMuY29sbGVjdE5vdGVzKCkuZmlsdGVyKChub3RlKSA9PiAhdGhpcy5leGNsdWRlZE5vdGVzLmhhcyhub3RlLnJlbGF0aXZlUGF0aCkpO1xuICB9XG5cbiAgcHJpdmF0ZSBjb2xsZWN0TWFya2Rvd25GaWxlcyhmb2xkZXI6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgICBjb25zdCByZXN1bHQ6IHN0cmluZ1tdID0gW107XG4gICAgLy8gYHJlYWRkaXJTeW5jYCByZXR1cm5zIGVudHJpZXMgaW4gdGhlIGZpbGUgc3lzdGVtJ3Mgb3duIG9yZGVyOiBieSBuYW1lIG9uIE5URlMsIGJ1dCBieSBoYXNoIG9uIGV4dDQsIHNvXG4gICAgLy8gc29ydCB0aGVtIHNvIGV2ZXJ5IGNoZWNrIHJlcG9ydHMgaXRzIG5vdGVzIGluIHRoZSBzYW1lIG9yZGVyIG9uIGV2ZXJ5IHBsYXRmb3JtLlxuICAgIGNvbnN0IGVudHJpZXMgPSByZWFkZGlyU3luYyhmb2xkZXIsIHsgd2l0aEZpbGVUeXBlczogdHJ1ZSB9KS5zb3J0KChhLCBiKSA9PiBhLm5hbWUubG9jYWxlQ29tcGFyZShiLm5hbWUsICdlbicpKTtcbiAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIGVudHJpZXMpIHtcbiAgICAgIGlmIChlbnRyeS5pc0RpcmVjdG9yeSgpKSB7XG4gICAgICAgIGlmIChlbnRyeS5uYW1lID09PSBPYnNpZGlhblBsdWdpblJlcG9QYXRocy5Ob2RlTW9kdWxlcyBhcyBzdHJpbmcpIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICByZXN1bHQucHVzaCguLi50aGlzLmNvbGxlY3RNYXJrZG93bkZpbGVzKGpvaW4oZm9sZGVyLCBlbnRyeS5uYW1lKSkpO1xuICAgICAgfSBlbHNlIGlmIChlbnRyeS5uYW1lLmVuZHNXaXRoKCcubWQnKSkge1xuICAgICAgICByZXN1bHQucHVzaChqb2luKGZvbGRlciwgZW50cnkubmFtZSkpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG59XG5cbi8qKlxuICogUmVnaXN0ZXJzIGEgYHZpdGVzdGAgc3VpdGUgdGhhdCBrZWVwcyBhIHBsdWdpbidzIGluLXJlcG8gYGRlbW8tdmF1bHQvYCBpbiBzeW5jIHdpdGggaXRzIHB1YmxpYyBzdXJmYWNlLlxuICpcbiAqIENhbGwgaXQgb25jZSBmcm9tIGEgcGx1Z2luJ3MgYGRlbW8tdmF1bHQubm8tYXBwLmludGVncmF0aW9uLnRlc3QudHNgOyBpdCByZWdpc3RlcnMgb25lIHRlc3QgcGVyIGNoZWNrLFxuICogZGVsZWdhdGluZyB0byB7QGxpbmsgRGVtb1ZhdWx0Q292ZXJhZ2VDaGVja2VyfS5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIGRlY2xhcmF0aXZlIGNvdmVyYWdlIHNwZWNpZmljYXRpb24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZWdpc3RlckRlbW9WYXVsdENvdmVyYWdlU3VpdGUocGFyYW1zOiBSZWdpc3RlckRlbW9WYXVsdENvdmVyYWdlU3VpdGVQYXJhbXMpOiB2b2lkIHtcbiAgY29uc3QgY2hlY2tlciA9IG5ldyBEZW1vVmF1bHRDb3ZlcmFnZUNoZWNrZXIobm9ybWFsaXplT3B0aW9uYWxQcm9wZXJ0aWVzPERlbW9WYXVsdENvdmVyYWdlQ2hlY2tlckNvbnN0cnVjdG9yUGFyYW1zPih7XG4gICAgZXhjbHVkZWROb3RlczogcGFyYW1zLmF1dGhvcmluZz8uZXhjbHVkZWROb3RlcyxcbiAgICByb290Rm9sZGVyOiBwYXJhbXMucm9vdEZvbGRlclxuICB9KSk7XG4gIGNvbnN0IHN0YXJ0Tm90ZSA9IHBhcmFtcy5hdXRob3Jpbmc/LnN0YXJ0Tm90ZSA/PyBERUZBVUxUX1NUQVJUX05PVEU7XG5cbiAgZGVzY3JpYmUoJ2RlbW8tdmF1bHQgY292ZXJhZ2UnLCAoKSA9PiB7XG4gICAgZm9yIChjb25zdCBzcGVjIG9mIHBhcmFtcy5pbnRlcmZhY2VzID8/IFtdKSB7XG4gICAgICBpdChgZGVtb25zdHJhdGVzIGV2ZXJ5ICR7c3BlYy5pbnRlcmZhY2VOYW1lfSAke3NwZWMua2luZH1gLCAoKSA9PiB7XG4gICAgICAgIGNvbnN0IG1lbWJlcnMgPSBjaGVja2VyLmdldEludGVyZmFjZU1lbWJlcnMoc3BlYyk7XG4gICAgICAgIGNvbnN0IGRlbW9uc3RyYXRlZCA9IG1lbWJlcnNbc3BlYy5raW5kXTtcbiAgICAgICAgZXhwZWN0KGRlbW9uc3RyYXRlZC5sZW5ndGgpLnRvQmVHcmVhdGVyVGhhbigwKTtcbiAgICAgICAgZXhwZWN0KGNoZWNrZXIuZmluZFVuZGVtb25zdHJhdGVkTWVtYmVycyh7IG1lbWJlcnM6IGRlbW9uc3RyYXRlZCwgcmVjZWl2ZXI6IHNwZWMucmVjZWl2ZXIgfSkpLnRvRXF1YWwoW10pO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KGByZWZlcmVuY2VzIG5vICR7c3BlYy5pbnRlcmZhY2VOYW1lfSBtZW1iZXIgdGhhdCBubyBsb25nZXIgZXhpc3RzYCwgKCkgPT4ge1xuICAgICAgICBjb25zdCBtZW1iZXJzID0gY2hlY2tlci5nZXRJbnRlcmZhY2VNZW1iZXJzKHNwZWMpO1xuICAgICAgICBleHBlY3QoY2hlY2tlci5maW5kU3RhbGVSZWZlcmVuY2VzKHsgcmVjZWl2ZXI6IHNwZWMucmVjZWl2ZXIsIHZhbGlkTWVtYmVyczogbWVtYmVycy5hbGwgfSkpLnRvRXF1YWwoW10pO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBzcGVjIG9mIHBhcmFtcy5jb25maWdJbnRlcmZhY2VzID8/IFtdKSB7XG4gICAgICBpdChgZGVtb25zdHJhdGVzIGV2ZXJ5ICR7c3BlYy5pbnRlcmZhY2VOYW1lfSBvcHRpb25gLCAoKSA9PiB7XG4gICAgICAgIGNvbnN0IG1lbWJlcnMgPSBjaGVja2VyLmdldEludGVyZmFjZU1lbWJlcnMoc3BlYyk7XG4gICAgICAgIGV4cGVjdChtZW1iZXJzLnByb3BlcnRpZXMubGVuZ3RoKS50b0JlR3JlYXRlclRoYW4oMCk7XG4gICAgICAgIGV4cGVjdChjaGVja2VyLmZpbmRVbmRlbW9uc3RyYXRlZE1lbWJlcnMoeyBtZW1iZXJzOiBtZW1iZXJzLnByb3BlcnRpZXMgfSkpLnRvRXF1YWwoW10pO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBzcGVjIG9mIHBhcmFtcy5mdW5jdGlvbk1vZHVsZXMgPz8gW10pIHtcbiAgICAgIGl0KGBkZW1vbnN0cmF0ZXMgZXZlcnkgZXhwb3J0ZWQgZnVuY3Rpb24gaW4gJHtzcGVjLnNvdXJjZVBhdGh9YCwgKCkgPT4ge1xuICAgICAgICBjb25zdCBmdW5jdGlvbk5hbWVzID0gY2hlY2tlci5nZXRFeHBvcnRlZEZ1bmN0aW9uTmFtZXMoc3BlYyk7XG4gICAgICAgIGV4cGVjdChmdW5jdGlvbk5hbWVzLmxlbmd0aCkudG9CZUdyZWF0ZXJUaGFuKDApO1xuICAgICAgICBleHBlY3QoY2hlY2tlci5maW5kVW5kZW1vbnN0cmF0ZWRNZW1iZXJzKHsgbWVtYmVyczogZnVuY3Rpb25OYW1lcyB9KSkudG9FcXVhbChbXSk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBjb25zdCBkb2NzID0gcGFyYW1zLmRvY3M7XG4gICAgaWYgKGRvY3MpIHtcbiAgICAgIGl0KCdsaW5rcyBhIGRlbW8gbm90ZSBmb3IgZXZlcnkgZmVhdHVyZSBkb2MnLCAoKSA9PiB7XG4gICAgICAgIGV4cGVjdChjaGVja2VyLmZpbmRVbmxpbmtlZEZlYXR1cmVEb2NzKHsgZG9jc0ZvbGRlcjogZG9jcy5mb2xkZXIsIG5vbkZlYXR1cmVEb2NzOiBkb2NzLm5vbkZlYXR1cmVEb2NzIH0pKVxuICAgICAgICAgIC50b0VxdWFsKFtdKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGl0KCdvcGVucyBldmVyeSBub3RlIHdpdGggYW4gSDEnLCAoKSA9PiB7XG4gICAgICBleHBlY3QoY2hlY2tlci5maW5kTm90ZXNXaXRob3V0SDEoKSkudG9FcXVhbChbXSk7XG4gICAgfSk7XG5cbiAgICBpdCgnb3BlbnMgZXZlcnkgbm90ZSB3aXRoIGEgcHJvc2UgcGFyYWdyYXBoIGJlZm9yZSBpdHMgZmlyc3QgY29kZSBibG9jaycsICgpID0+IHtcbiAgICAgIGV4cGVjdChjaGVja2VyLmZpbmROb3Rlc1dpdGhvdXRJbnRyb1Byb3NlKCkpLnRvRXF1YWwoW10pO1xuICAgIH0pO1xuXG4gICAgaXQoYHJlYWNoZXMgZXZlcnkgbm90ZSBmcm9tICR7c3RhcnROb3RlfWAsICgpID0+IHtcbiAgICAgIGV4cGVjdChjaGVja2VyLmZpbmRVbnJlYWNoYWJsZU5vdGVzKHsgc3RhcnROb3RlIH0pKS50b0VxdWFsKFtdKTtcbiAgICB9KTtcblxuICAgIGl0KCd1c2VzIG5vIHdpa2lsaW5rcywgd2hpY2ggZG8gbm90IHJlbmRlciBvbiBHaXRIdWInLCAoKSA9PiB7XG4gICAgICBleHBlY3QoY2hlY2tlci5maW5kTm90ZXNXaXRoV2lraWxpbmtzKCkpLnRvRXF1YWwoW10pO1xuICAgIH0pO1xuXG4gICAgaXQoJ2p1c3RpZmllcyBldmVyeSB3aWtpbGluayBhbGxvd2FuY2UsIGFuZCBkZWNsYXJlcyBub25lIGl0IG5vIGxvbmdlciBuZWVkcycsICgpID0+IHtcbiAgICAgIGV4cGVjdChjaGVja2VyLmZpbmROb3Rlc1dpdGhVbmp1c3RpZmllZFdpa2lsaW5rQWxsb3dhbmNlKCkpLnRvRXF1YWwoW10pO1xuICAgIH0pO1xuXG4gICAgaXQoJ2NhcnJpZXMgbm8gRG9jcyBsaW5rIGxpbmUsIGJlY2F1c2UgdGhlIG5vdGUgaXMgdGhlIGRvY3MnLCAoKSA9PiB7XG4gICAgICBleHBlY3QoY2hlY2tlci5maW5kTm90ZXNXaXRoRG9jc0xpbmtzKCkpLnRvRXF1YWwoW10pO1xuICAgIH0pO1xuXG4gICAgaXQoJ2NvbW1pdHMgbm9uZSBvZiB0aGUgYXBwLmpzb24gc2V0dGluZ3Mgb2JzaWRpYW4tZGV2LXV0aWxzIGluamVjdHMgYXQgcmVsZWFzZSB0aW1lJywgKCkgPT4ge1xuICAgICAgZXhwZWN0KGNoZWNrZXIuZmluZENvbW1pdHRlZEFwcEpzb25TZXR0aW5ncygpKS50b0VxdWFsKFtdKTtcbiAgICB9KTtcblxuICAgIC8vIFdpdGggbm8gbm90ZXMgdG8gcmVhZCwgZXZlcnkgYXV0aG9yaW5nIGNoZWNrIGFib3ZlIHBhc3NlcyBieSBoYXZpbmcgbm90aGluZyB0byBsb29rIGF0LCBzbyBhIHZhdWx0XG4gICAgLy8gdGhhdCBzdG9wcGVkIGJlaW5nIGZvdW5kIHdvdWxkIGdvIG9uIHJlcG9ydGluZyBpdHNlbGYgY2xlYW4uIFRoaXMgaXMgdGhlIGhhbGYgb2YgdGhlIG5vbi10cml2aWFsXG4gICAgLy8gZ3VhcmQgdGhhdCBzdGlsbCBhcHBsaWVzIHdoZW4gdGhlIHBsdWdpbiBleHBvc2VzIG5vdGhpbmcgdG8gcmVmbGVjdC5cbiAgICBpdCgncmVhZHMgYSBub24tZW1wdHkgZGVtbyB2YXVsdCcsICgpID0+IHtcbiAgICAgIGV4cGVjdChjaGVja2VyLmNvbGxlY3REZW1vTm90ZVJlbGF0aXZlUGF0aHMoKS5sZW5ndGgpLnRvQmVHcmVhdGVyVGhhbigwKTtcbiAgICB9KTtcblxuICAgIGNvbnN0IGd1YXJkID0gcGFyYW1zLm5vblRyaXZpYWxHdWFyZDtcbiAgICBpZiAoZ3VhcmQpIHtcbiAgICAgIGl0KCdrZWVwcyB0aGUgcmVmbGVjdGVkIHN1cmZhY2Ugbm9uLXRyaXZpYWwnLCAoKSA9PiB7XG4gICAgICAgIGNvbnN0IG1lbWJlcnMgPSBjaGVja2VyLmdldEludGVyZmFjZU1lbWJlcnMoZ3VhcmQpO1xuICAgICAgICBleHBlY3QobWVtYmVycy5hbGwpLnRvQ29udGFpbihndWFyZC5leHBlY3RNZW1iZXIpO1xuICAgICAgICBleHBlY3QoY2hlY2tlci5jb2xsZWN0RGVtb05vdGVSZWxhdGl2ZVBhdGhzKCkpLnRvQ29udGFpbihndWFyZC5leHBlY3REZW1vTm90ZSk7XG4gICAgICB9KTtcbiAgICB9XG4gIH0pO1xufVxuXG5jb25zdCBDTEFTU19NRU1CRVJfTU9ESUZJRVJTID0gU3RyaW5nLnJhd2AoPzooPzpwdWJsaWN8cHJpdmF0ZXxwcm90ZWN0ZWR8cmVhZG9ubHl8c3RhdGljfGFic3RyYWN0fG92ZXJyaWRlKVxccyspKmA7XG5jb25zdCBBQlNPTFVURV9VUkxfUkVHX0VYUCA9IC9eW2Etel1bXFx3Ky4tXSo6L2k7XG5jb25zdCBBUlJPV19SRUdfRVhQID0gL15cXHMqPT4vO1xuY29uc3QgRlVOQ1RJT05fVFlQRV9QQVJBTUVURVJTX1JFR19FWFAgPSAvXjxbXj5dKj5cXHMqLztcbmNvbnN0IEFOR0xFX0JSQUNLRVRTX1JFR19FWFAgPSAvXjx8PiQvZztcbmNvbnN0IENPREVfRkVOQ0VfUkVHX0VYUCA9IC9eXFxzKig/OmBgYHx+fn4pLztcbmNvbnN0IERFRkFVTFRfRVhDTFVERURfTk9URVMgPSBbJ1JFQURNRS5tZCddO1xuY29uc3QgREVGQVVMVF9TVEFSVF9OT1RFID0gJzAwIFN0YXJ0Lm1kJztcbmNvbnN0IERPQ1NfTElOS19SRUdfRVhQID0gL15cXHMqXFxbRG9jc11cXCgvO1xuY29uc3QgRlJPTlRNQVRURVJfUkVHX0VYUCA9IC9eLS0tXFxyP1xcbltcXHNcXFNdKj9cXHI/XFxuLS0tW15cXFNcXG5dKlxccj9cXG4/LztcbmNvbnN0IEgxX1JFR19FWFAgPSAvXiMgXFxTLztcbmNvbnN0IEhFQURJTkdfUkVHX0VYUCA9IC9eI3sxLDZ9IC87XG5jb25zdCBJTkxJTkVfQ09ERV9SRUdfRVhQID0gL2BbXmBcXG5dKmAvZztcbmNvbnN0IE1BUktET1dOX0xJTktfUkVHX0VYUCA9IC9cXFtbXlxcXV0qXVxcKCg/PHRhcmdldD5bXildKylcXCkvZztcbi8vIEFuIGlubGluZSBkaXJlY3RpdmUsIHNoYXBlZCBhZnRlciBFU0xpbnQncyBhbmQgd3JpdHRlbiBhcyBhbiBIVE1MIGNvbW1lbnQgc28gaXQgaXMgaW52aXNpYmxlIEJPVEggaW5cbi8vIE9ic2lkaWFuIGFuZCBvbiBHaXRIdWIg4oCUIHRoZSBzYW1lIHNwZWxsaW5nIHRoZSB2YXVsdHMgYWxyZWFkeSB1c2UgZm9yIGBtYXJrZG93bmxpbnQtZGlzYWJsZS1uZXh0LWxpbmVgLlxuLy8gQW4gT2JzaWRpYW4gYCUlIOKApiAlJWAgY29tbWVudCB3b3VsZCBzaG93IHVwIGFzIGxpdGVyYWwgdGV4dCBvbiBHaXRIdWIsIHdoaWNoIGlzIGhhbGYgdGhlIHJlYWRlcnNoaXAuXG5jb25zdCBESVJFQ1RJVkVfUkVHX0VYUCA9IC9eXFxzKjwhLS1cXHMqb2JzaWRpYW4tZGV2LXV0aWxzLSg/PGFjdGlvbj5kaXNhYmxlLW5leHQtbGluZXxkaXNhYmxlfGVuYWJsZSlcXHMrKD88cnVsZT5bXFx3LV0rXFwvW1xcdy1dKykoPzpcXHMrLS1cXHMrKD88cmVhc29uPi4qPykpP1xccyotLT5cXHMqJC87XG4vLyBDYXRjaGVzIGEgZGlyZWN0aXZlIHRoYXQgd2FzIE1FQU5UIHRvIGJlIG9uZSBidXQgaXMgbWlzc3BlbGxlZDogaXQgd291bGQgb3RoZXJ3aXNlIHJlYWQgYXMgYW4gb3JkaW5hcnlcbi8vIGNvbW1lbnQgYW5kIHNpbGVudGx5IGRvIG5vdGhpbmcsIHdoaWNoIGlzIHRoZSBmYWlsdXJlIG1vZGUgYSBzdXBwcmVzc2lvbiBzeW50YXggbXVzdCBuZXZlciBoYXZlLlxuY29uc3QgRElSRUNUSVZFX1BST0JFX1JFR19FWFAgPSAvPCEtLVxccypvYnNpZGlhbi1kZXYtdXRpbHMtLztcbmNvbnN0IFdJS0lMSU5LX1JVTEUgPSAnZGVtby12YXVsdC12YWxpZGF0aW9uL25vLXdpa2lsaW5rcyc7XG4vLyBUaGUgYG9ic2lkaWFuLWRldi11dGlscyA+IGRlbW8tdmF1bHQtdmFsaWRhdGlvbiA+IGFsbG93LXdpa2lsaW5rc2AgZnJvbnRtYXR0ZXIgcGF0aCwgYXQgYW55IGluZGVudGF0aW9uOlxuLy8gVGhlIGtleXMgbXVzdCBuZXN0IGluIHRoYXQgb3JkZXIsIGFuZCBhbnkgbGluZSBiZXR3ZWVuIHRoZW0gaGFzIHRvIHN0YXkgaW5kZW50ZWQsIHNvIGEgZGVkZW50IHRvIHRoZVxuLy8gZG9jdW1lbnQncyBvd24gdG9wIGxldmVsIGVuZHMgdGhlIG1hdGNoIHJhdGhlciB0aGFuIHJlYWNoaW5nIGEgc2FtZS1uYW1lZCBrZXkgdW5kZXIgYW5vdGhlciBwYXJlbnQuXG5jb25zdCBXSUtJTElOS19BTExPV0FOQ0VfUkVHX0VYUCA9IC9eb2JzaWRpYW4tZGV2LXV0aWxzOlteXFxTXFxuXSpcXG4oPzpbXlxcU1xcbl0rLipcXG4pKj9bXlxcU1xcbl0rZGVtby12YXVsdC12YWxpZGF0aW9uOlteXFxTXFxuXSpcXG4oPzpbXlxcU1xcbl0rLipcXG4pKj9bXlxcU1xcbl0rYWxsb3ctd2lraWxpbmtzOig/PHJlYXNvbj4uKikkL207XG5jb25zdCBXSUtJTElOS19SRUdfRVhQID0gL1xcW1xcW1teXFxdXStdXS87XG5cbi8vIEFwcGxpZXMgb25lIHBhcnNlZCBkaXJlY3RpdmUgdG8gdGhlIHNjYW4uXG5mdW5jdGlvbiBhcHBseVdpa2lsaW5rRGlyZWN0aXZlKHN0YXRlOiBXaWtpbGlua0RpcmVjdGl2ZVNjYW5TdGF0ZSwgbGluZUluZGV4OiBudW1iZXIsIG1hdGNoOiBSZWdFeHBFeGVjQXJyYXkpOiB2b2lkIHtcbiAgY29uc3QgYWN0aW9uID0gZ2V0TWFuZGF0b3J5TmFtZWRHcm91cChtYXRjaCwgJ2FjdGlvbicpO1xuICBjb25zdCBydWxlID0gZ2V0TWFuZGF0b3J5TmFtZWRHcm91cChtYXRjaCwgJ3J1bGUnKTtcbiAgY29uc3QgcmVhc29uID0gbWF0Y2guZ3JvdXBzPy5bJ3JlYXNvbiddPy50cmltKCkgPz8gJyc7XG4gIGlmIChydWxlICE9PSBXSUtJTElOS19SVUxFKSB7XG4gICAgc3RhdGUucHJvYmxlbXMucHVzaChgYW4gdW5rbm93biBydWxlIFwiJHtydWxlfVwiIG9uICR7Zm9ybWF0TGluZU51bWJlcihsaW5lSW5kZXgpfWApO1xuICAgIHJldHVybjtcbiAgfVxuICBpZiAoYWN0aW9uICE9PSAnZW5hYmxlJyAmJiByZWFzb24gPT09ICcnKSB7XG4gICAgc3RhdGUucHJvYmxlbXMucHVzaChgYSBkaXJlY3RpdmUgd2l0aCBubyByZWFzb24gb24gJHtmb3JtYXRMaW5lTnVtYmVyKGxpbmVJbmRleCl9YCk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKGFjdGlvbiA9PT0gJ2Rpc2FibGUtbmV4dC1saW5lJykge1xuICAgIHN0YXRlLnBlbmRpbmdOZXh0TGluZUluZGV4ID0gbGluZUluZGV4O1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGlmIChhY3Rpb24gPT09ICdkaXNhYmxlJykge1xuICAgIGlmIChzdGF0ZS5vcGVuUmVnaW9uKSB7XG4gICAgICBzdGF0ZS5wcm9ibGVtcy5wdXNoKGBhIGRpc2FibGUgb24gJHtmb3JtYXRMaW5lTnVtYmVyKGxpbmVJbmRleCl9IGluc2lkZSB0aGUgcmVnaW9uIG9wZW5lZCBvbiAke2Zvcm1hdExpbmVOdW1iZXIoc3RhdGUub3BlblJlZ2lvbi5saW5lSW5kZXgpfWApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBzdGF0ZS5vcGVuUmVnaW9uID0geyBpc1VzZWQ6IGZhbHNlLCBsaW5lSW5kZXggfTtcbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAoIXN0YXRlLm9wZW5SZWdpb24pIHtcbiAgICBzdGF0ZS5wcm9ibGVtcy5wdXNoKGBhbiBlbmFibGUgb24gJHtmb3JtYXRMaW5lTnVtYmVyKGxpbmVJbmRleCl9IHdpdGggbm8gcmVnaW9uIG9wZW5gKTtcbiAgICByZXR1cm47XG4gIH1cbiAgaWYgKCFzdGF0ZS5vcGVuUmVnaW9uLmlzVXNlZCkge1xuICAgIHN0YXRlLnByb2JsZW1zLnB1c2goYGEgcmVnaW9uIG9wZW5lZCBvbiAke2Zvcm1hdExpbmVOdW1iZXIoc3RhdGUub3BlblJlZ2lvbi5saW5lSW5kZXgpfSBjb3ZlcmluZyBubyB3aWtpbGlua2ApO1xuICB9XG4gIHN0YXRlLm9wZW5SZWdpb24gPSBudWxsO1xufVxuXG4vLyBBcHBsaWVzIG9uZSBvcmRpbmFyeSBsaW5lIHRvIHRoZSBzY2FuOiBhbiBvcGVuIHJlZ2lvbiBjb3ZlcnMgaXQsIGFuZCBhIHBlbmRpbmcgYGRpc2FibGUtbmV4dC1saW5lYFxuLy8gY2xhaW1zIHRoZSBmaXJzdCBsaW5lIHdpdGggY29udGVudCBvbiBpdCDigJQgdGhlIGRpcmVjdGl2ZSBhbmQgaXRzIHRhcmdldCBhcmUgdXN1YWxseSBhIGJsYW5rIGxpbmUgYXBhcnQuXG5mdW5jdGlvbiBhcHBseVdpa2lsaW5rU2NhbkxpbmUoc3RhdGU6IFdpa2lsaW5rRGlyZWN0aXZlU2NhblN0YXRlLCBsaW5lSW5kZXg6IG51bWJlciwgbGluZTogc3RyaW5nKTogdm9pZCB7XG4gIGlmIChzdGF0ZS5vcGVuUmVnaW9uKSB7XG4gICAgc3RhdGUuYWxsb3dlZExpbmVJbmRleGVzLmFkZChsaW5lSW5kZXgpO1xuICAgIHN0YXRlLm9wZW5SZWdpb24uaXNVc2VkIHx8PSBzdGF0ZS53aWtpbGlua0xpbmVJbmRleGVzLmhhcyhsaW5lSW5kZXgpO1xuICAgIHJldHVybjtcbiAgfVxuICBpZiAoc3RhdGUucGVuZGluZ05leHRMaW5lSW5kZXggPT09IG51bGwgfHwgbGluZS50cmltKCkgPT09ICcnKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIHN0YXRlLmFsbG93ZWRMaW5lSW5kZXhlcy5hZGQobGluZUluZGV4KTtcbiAgaWYgKCFzdGF0ZS53aWtpbGlua0xpbmVJbmRleGVzLmhhcyhsaW5lSW5kZXgpKSB7XG4gICAgc3RhdGUucHJvYmxlbXMucHVzaChgYSBkaXNhYmxlLW5leHQtbGluZSBvbiAke2Zvcm1hdExpbmVOdW1iZXIoc3RhdGUucGVuZGluZ05leHRMaW5lSW5kZXgpfSBjb3ZlcmluZyBubyB3aWtpbGlua2ApO1xuICB9XG4gIHN0YXRlLnBlbmRpbmdOZXh0TGluZUluZGV4ID0gbnVsbDtcbn1cblxuZnVuY3Rpb24gYnVpbGRNZW1iZXJzKG1ldGhvZHM6IHN0cmluZ1tdLCBwcm9wZXJ0aWVzOiBzdHJpbmdbXSk6IEludGVyZmFjZU1lbWJlcnMge1xuICByZXR1cm4ge1xuICAgIGFsbDogWy4uLm1ldGhvZHMsIC4uLnByb3BlcnRpZXNdLFxuICAgIG1ldGhvZHMsXG4gICAgcHJvcGVydGllc1xuICB9O1xufVxuXG4vLyBSZXNvbHZlcyB0aGUgbm90ZXMgYSBub3RlIGxpbmtzIHRvOiBldmVyeSBNYXJrZG93biBsaW5rIG91dHNpZGUgYSBjb2RlIGZlbmNlIHdob3NlIHRhcmdldCBpcyBhIGAubWRgXG4vLyBmaWxlLCBtYWRlIHJlbGF0aXZlIHRvIHRoZSBkZW1vIHZhdWx0IHNvIGl0IGNhbiBiZSBsb29rZWQgdXAgaW4gdGhlIG5vdGUgbWFwLiBFeHRlcm5hbCBVUkxzIGFuZFxuLy8gbm9uLW5vdGUgdGFyZ2V0cyAoaW1hZ2VzLCBzY3JpcHRzKSBhcmUgbm90IHBhcnQgb2YgdGhlIGxlYXJuaW5nIHBhdGggYW5kIGFyZSBza2lwcGVkOyBhIGAjYW5jaG9yYCBpc1xuLy8gZHJvcHBlZCwgc2luY2UgaXQgYWRkcmVzc2VzIGEgcGxhY2UgaW5zaWRlIGFuIGFscmVhZHktcmVzb2x2ZWQgbm90ZS5cbi8vIFJldHVybnMgdGhlIG5vdGUncyBsaW5lcyB3aXRoIGZlbmNlZCBjb2RlIGJsb2NrcyByZW1vdmVkICh0aGUgZmVuY2UgbGluZXMgaW5jbHVkZWQpLCBwYWlyZWQgd2l0aCB0aGVcbi8vIGxpbmUgbnVtYmVyIGVhY2ggY2FtZSBmcm9tLCBzbyBhIGNoZWNrIG5ldmVyIG1pc3Rha2VzIHNhbXBsZSBjb2RlIGZvciBwcm9zZSDigJQgYSBgW1t3aWtpbGlua11dYFxuLy8gZGVtb25zdHJhdGVkIGluc2lkZSBhIGZlbmNlIGlzIHRleHQsIG5vdCBuYXZpZ2F0aW9uIOKAlCBhbmQgYW4gaW5saW5lIGRpcmVjdGl2ZSBjYW4gc3RpbGwgbmFtZSBhIGxpbmUuXG5mdW5jdGlvbiBjb2xsZWN0TGluZXNPdXRzaWRlRmVuY2VzKGNvbnRlbnQ6IHN0cmluZyk6IE5vdGVMaW5lW10ge1xuICBjb25zdCBub3RlTGluZXM6IE5vdGVMaW5lW10gPSBbXTtcbiAgbGV0IGlzSW5zaWRlRmVuY2UgPSBmYWxzZTtcbiAgZm9yIChjb25zdCBbaW5kZXgsIGxpbmVdIG9mIGNvbnRlbnQuc3BsaXQoJ1xcbicpLmVudHJpZXMoKSkge1xuICAgIGlmIChDT0RFX0ZFTkNFX1JFR19FWFAudGVzdChsaW5lKSkge1xuICAgICAgaXNJbnNpZGVGZW5jZSA9ICFpc0luc2lkZUZlbmNlO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGlmICghaXNJbnNpZGVGZW5jZSkge1xuICAgICAgbm90ZUxpbmVzLnB1c2goeyBpbmRleCwgbGluZSB9KTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG5vdGVMaW5lcztcbn1cblxuZnVuY3Rpb24gY29sbGVjdE5vdGVMaW5rVGFyZ2V0cyhub3RlOiBEZW1vVmF1bHROb3RlKTogc3RyaW5nW10ge1xuICBjb25zdCB0YXJnZXRzOiBzdHJpbmdbXSA9IFtdO1xuICBmb3IgKGNvbnN0IGxpbmUgb2YgZ2V0TGluZXNPdXRzaWRlRmVuY2VzKG5vdGUuY29udGVudCkpIHtcbiAgICBmb3IgKGNvbnN0IG1hdGNoIG9mIHN0cmlwSW5saW5lQ29kZShsaW5lKS5tYXRjaEFsbChNQVJLRE9XTl9MSU5LX1JFR19FWFApKSB7XG4gICAgICBjb25zdCB0YXJnZXQgPSBnZXRNYW5kYXRvcnlOYW1lZEdyb3VwKG1hdGNoLCAndGFyZ2V0JykucmVwbGFjZUFsbChBTkdMRV9CUkFDS0VUU19SRUdfRVhQLCAnJyk7XG4gICAgICBjb25zdCBbbm90ZVBhdGggPSAnJ10gPSB0YXJnZXQuc3BsaXQoJyMnLCAxKTtcbiAgICAgIGlmIChBQlNPTFVURV9VUkxfUkVHX0VYUC50ZXN0KG5vdGVQYXRoKSB8fCAhbm90ZVBhdGgudG9Mb3dlckNhc2UoKS5lbmRzV2l0aCgnLm1kJykpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICB0YXJnZXRzLnB1c2goam9pbihkaXJuYW1lKG5vdGUucmVsYXRpdmVQYXRoKSwgdHJ5RGVjb2RlVXJpQ29tcG9uZW50KG5vdGVQYXRoKSkpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gdGFyZ2V0cztcbn1cblxuZnVuY3Rpb24gZXh0cmFjdENsYXNzTWV0aG9kTmFtZXMoY2xhc3NCb2R5OiBzdHJpbmcpOiBzdHJpbmdbXSB7XG4gIHJldHVybiBbLi4uY2xhc3NCb2R5Lm1hdGNoQWxsKG5ldyBSZWdFeHAoU3RyaW5nLnJhd2BeIHsyfSg/PG1vZGlmaWVycz4ke0NMQVNTX01FTUJFUl9NT0RJRklFUlN9KSg/PG5hbWU+XFx3KykoPzo8W14+XSo+KT9cXChgLCAnZ20nKSldXG4gICAgLmZpbHRlcigobWF0Y2gpID0+ICFpc05vblB1YmxpY01lbWJlcihnZXRNYW5kYXRvcnlOYW1lZEdyb3VwKG1hdGNoLCAnbW9kaWZpZXJzJykpKVxuICAgIC5tYXAoKG1hdGNoKSA9PiBnZXRNYW5kYXRvcnlOYW1lZEdyb3VwKG1hdGNoLCAnbmFtZScpKTtcbn1cblxuZnVuY3Rpb24gZXh0cmFjdENsYXNzUHJvcGVydHlOYW1lcyhjbGFzc0JvZHk6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgcmV0dXJuIFsuLi5jbGFzc0JvZHkubWF0Y2hBbGwobmV3IFJlZ0V4cChTdHJpbmcucmF3YF4gezJ9KD88bW9kaWZpZXJzPiR7Q0xBU1NfTUVNQkVSX01PRElGSUVSU30pKD88bmFtZT5cXHcrKVxccypcXD8/XFxzKls6PV1gLCAnZ20nKSldXG4gICAgLmZpbHRlcigobWF0Y2gpID0+ICFpc05vblB1YmxpY01lbWJlcihnZXRNYW5kYXRvcnlOYW1lZEdyb3VwKG1hdGNoLCAnbW9kaWZpZXJzJykpKVxuICAgIC5tYXAoKG1hdGNoKSA9PiBnZXRNYW5kYXRvcnlOYW1lZEdyb3VwKG1hdGNoLCAnbmFtZScpKTtcbn1cblxuZnVuY3Rpb24gZXh0cmFjdEVudW1NZW1iZXJOYW1lcyhlbnVtQm9keTogc3RyaW5nKTogc3RyaW5nW10ge1xuICByZXR1cm4gWy4uLmVudW1Cb2R5Lm1hdGNoQWxsKC9eIHsyfSg/PG5hbWU+XFx3KykvZ20pXS5tYXAoKG1hdGNoKSA9PiBnZXRNYW5kYXRvcnlOYW1lZEdyb3VwKG1hdGNoLCAnbmFtZScpKTtcbn1cblxuLy8gQSBtZXRob2QgaXMgY2FsbGFibGUgc3VyZmFjZSBob3dldmVyIGl0IGlzIHdyaXR0ZW46IGEgbWV0aG9kIHNpZ25hdHVyZSAoYGZvbyhiYXI6IHN0cmluZyk6IHZvaWQ7YCkgb3IgYVxuLy8gcHJvcGVydHkgc2lnbmF0dXJlIHdob3NlIHR5cGUgaXMgYSBmdW5jdGlvbiB0eXBlIChgZm9vOiAoYmFyOiBzdHJpbmcpID0+IHZvaWQ7YCkuIFRoZSBzaGFyZWQgRVNMaW50IGNvbmZpZ1xuLy8gcnVucyBgQHR5cGVzY3JpcHQtZXNsaW50L21ldGhvZC1zaWduYXR1cmUtc3R5bGVgIGF0IGl0cyBgcHJvcGVydHlgIGRlZmF1bHQsIHNvIGBsaW50OmZpeGAgcmV3cml0ZXMgdGhlXG4vLyBmaXJzdCBzaGFwZSBpbnRvIHRoZSBzZWNvbmQg4oCUIHJlYWRpbmcgb25seSB0aGUgZmlyc3QgcmVwb3J0ZWQgemVybyBtZXRob2RzIGZvciBldmVyeSBzdWNoIGludGVyZmFjZS5cbmZ1bmN0aW9uIGV4dHJhY3RNZXRob2ROYW1lcyhpbnRlcmZhY2VCb2R5OiBzdHJpbmcpOiBzdHJpbmdbXSB7XG4gIGNvbnN0IG1ldGhvZFNpZ25hdHVyZU5hbWVzID0gWy4uLmludGVyZmFjZUJvZHkubWF0Y2hBbGwoL14gezJ9KD88bmFtZT5cXHcrKSg/OjxbXj5dKj4pP1xcKC9nbSldLm1hcCgobWF0Y2gpID0+IGdldE1hbmRhdG9yeU5hbWVkR3JvdXAobWF0Y2gsICduYW1lJykpO1xuICBjb25zdCBmdW5jdGlvblByb3BlcnR5TmFtZXMgPSBtYXRjaFByb3BlcnR5U2lnbmF0dXJlcyhpbnRlcmZhY2VCb2R5KVxuICAgIC5maWx0ZXIoKG1hdGNoKSA9PiBpc0Z1bmN0aW9uVHlwZShpbnRlcmZhY2VCb2R5LCBtYXRjaCkpXG4gICAgLm1hcCgobWF0Y2gpID0+IGdldE1hbmRhdG9yeU5hbWVkR3JvdXAobWF0Y2gsICduYW1lJykpO1xuICByZXR1cm4gWy4uLm1ldGhvZFNpZ25hdHVyZU5hbWVzLCAuLi5mdW5jdGlvblByb3BlcnR5TmFtZXNdO1xufVxuXG4vLyBFdmVyeSBwcm9wZXJ0eSBzaWduYXR1cmUgd2hvc2UgdHlwZSBpcyBub3QgYSBmdW5jdGlvbiB0eXBlLCBzbyBtZXRob2RzIGFuZCBwcm9wZXJ0aWVzIHN0YXkgYSBwYXJ0aXRpb24uXG5mdW5jdGlvbiBleHRyYWN0UHJvcGVydHlOYW1lcyhpbnRlcmZhY2VCb2R5OiBzdHJpbmcpOiBzdHJpbmdbXSB7XG4gIHJldHVybiBtYXRjaFByb3BlcnR5U2lnbmF0dXJlcyhpbnRlcmZhY2VCb2R5KVxuICAgIC5maWx0ZXIoKG1hdGNoKSA9PiAhaXNGdW5jdGlvblR5cGUoaW50ZXJmYWNlQm9keSwgbWF0Y2gpKVxuICAgIC5tYXAoKG1hdGNoKSA9PiBnZXRNYW5kYXRvcnlOYW1lZEdyb3VwKG1hdGNoLCAnbmFtZScpKTtcbn1cblxuLy8gVGhlIGxpbmUgbnVtYmVycyBjYXJyeWluZyBhIHdpa2lsaW5rIHRoYXQgaXMgbmF2aWdhdGlvbiByYXRoZXIgdGhhbiBzYW1wbGUgdGV4dC5cbmZ1bmN0aW9uIGZpbmRXaWtpbGlua0xpbmVJbmRleGVzKGNvbnRlbnQ6IHN0cmluZyk6IG51bWJlcltdIHtcbiAgcmV0dXJuIGNvbGxlY3RMaW5lc091dHNpZGVGZW5jZXMoY29udGVudClcbiAgICAuZmlsdGVyKChub3RlTGluZSkgPT4gV0lLSUxJTktfUkVHX0VYUC50ZXN0KHN0cmlwSW5saW5lQ29kZShub3RlTGluZS5saW5lKSkpXG4gICAgLm1hcCgobm90ZUxpbmUpID0+IG5vdGVMaW5lLmluZGV4KTtcbn1cblxuZnVuY3Rpb24gZm9ybWF0TGluZU51bWJlcihsaW5lSW5kZXg6IG51bWJlcik6IHN0cmluZyB7XG4gIHJldHVybiBgbGluZSAke1N0cmluZyhsaW5lSW5kZXggKyAxKX1gO1xufVxuXG5mdW5jdGlvbiBnZXRMaW5lc091dHNpZGVGZW5jZXMoY29udGVudDogc3RyaW5nKTogc3RyaW5nW10ge1xuICByZXR1cm4gY29sbGVjdExpbmVzT3V0c2lkZUZlbmNlcyhjb250ZW50KS5tYXAoKG5vdGVMaW5lKSA9PiBub3RlTGluZS5saW5lKTtcbn1cblxuLy8gV2hldGhlciB0aGUgbm90ZSdzIGZpcnN0IGNvbnRlbnQgbGluZSAoZnJvbnRtYXR0ZXIgYW5kIGJsYW5rIGxpbmVzIGFzaWRlKSBpcyBhbiBgIyBIMWAuXG5mdW5jdGlvbiBoYXNIMShjb250ZW50OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgZm9yIChjb25zdCBsaW5lIG9mIHN0cmlwRnJvbnRtYXR0ZXIoY29udGVudCkuc3BsaXQoJ1xcbicpKSB7XG4gICAgY29uc3QgdHJpbW1lZExpbmUgPSBsaW5lLnRyaW0oKTtcbiAgICBpZiAodHJpbW1lZExpbmUgPT09ICcnKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgcmV0dXJuIEgxX1JFR19FWFAudGVzdCh0cmltbWVkTGluZSk7XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG4vLyBXaGV0aGVyIGEgcGxhaW4gcHJvc2UgbGluZSBhcHBlYXJzIGJlZm9yZSB0aGUgbm90ZSdzIGZpcnN0IGNvZGUgZmVuY2UuIEhlYWRpbmdzIGFyZSBub3QgcHJvc2Ug4oCUIGEgbm90ZVxuLy8gdGhhdCBnb2VzIHN0cmFpZ2h0IGZyb20gaXRzIHRpdGxlIHRvIGEgYnV0dG9uIGlzIGV4YWN0bHkgdGhlIHNoYXBlIHRoaXMgY2hlY2sgcmVqZWN0cy5cbmZ1bmN0aW9uIGhhc0ludHJvUHJvc2UoY29udGVudDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGZvciAoY29uc3QgbGluZSBvZiBzdHJpcEZyb250bWF0dGVyKGNvbnRlbnQpLnNwbGl0KCdcXG4nKSkge1xuICAgIGlmIChDT0RFX0ZFTkNFX1JFR19FWFAudGVzdChsaW5lKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBjb25zdCB0cmltbWVkTGluZSA9IGxpbmUudHJpbSgpO1xuICAgIGlmICh0cmltbWVkTGluZSA9PT0gJycgfHwgSEVBRElOR19SRUdfRVhQLnRlc3QodHJpbW1lZExpbmUpKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG4vLyBXaGV0aGVyIHRoZSBub3RlIG5hdmlnYXRlcyB3aXRoIGFuIE9ic2lkaWFuIGBbW3dpa2lsaW5rXV1gLiBGZW5jZWQgYmxvY2tzIGFuZCBpbmxpbmUgY29kZSBhcmUgc2FtcGxlXG4vLyB0ZXh0IHJhdGhlciB0aGFuIG5hdmlnYXRpb24sIHNvIHRoZXkgYXJlIHJlbW92ZWQgYmVmb3JlIGxvb2tpbmcuXG5mdW5jdGlvbiBoYXNXaWtpbGluayhjb250ZW50OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIGZpbmRXaWtpbGlua0xpbmVJbmRleGVzKGNvbnRlbnQpLmxlbmd0aCA+IDA7XG59XG5cbi8vIFdoZXRoZXIgdGhlIHByb3BlcnR5IHNpZ25hdHVyZSdzIHR5cGUsIHN0YXJ0aW5nIHJpZ2h0IGFmdGVyIGl0cyBgOmAsIGlzIGEgZnVuY3Rpb24gdHlwZTogYW4gb3B0aW9uYWwgdHlwZVxuLy8gcGFyYW1ldGVyIGxpc3QsIGEgcGFyYW1ldGVyIGxpc3QsIHRoZW4gYD0+YC4gVGhlIHBhcmFtZXRlciBsaXN0IGlzIHdhbGtlZCBieSBicmFja2V0IGRlcHRoIHJhdGhlciB0aGFuIGJ5IGFcbi8vIHJlZ3VsYXIgZXhwcmVzc2lvbiwgc28gYSBwYXJlbnRoZXNpemVkIG5vbi1mdW5jdGlvbiB0eXBlIChgKHN0cmluZyB8IG51bWJlcilbXWApIGFuZCBhIHBhcmFtZXRlciB3aG9zZSBvd25cbi8vIHR5cGUgaG9sZHMgcGFyZW50aGVzZXMgKGAoY2FsbGJhY2s6ICgpID0+IHZvaWQpID0+IHZvaWRgKSBhcmUgYm90aCByZWFkIGNvcnJlY3RseSwgYWNyb3NzIGxpbmVzIHRvby5cbmZ1bmN0aW9uIGlzRnVuY3Rpb25UeXBlKGludGVyZmFjZUJvZHk6IHN0cmluZywgbWF0Y2g6IFJlZ0V4cEV4ZWNBcnJheSk6IGJvb2xlYW4ge1xuICBsZXQgaW5kZXggPSBtYXRjaC5pbmRleCArIG1hdGNoWzBdLmxlbmd0aDtcbiAgaW5kZXggKz0gRlVOQ1RJT05fVFlQRV9QQVJBTUVURVJTX1JFR19FWFAuZXhlYyhpbnRlcmZhY2VCb2R5LnNsaWNlKGluZGV4KSk/LlswXS5sZW5ndGggPz8gMDtcbiAgaWYgKGludGVyZmFjZUJvZHlbaW5kZXhdICE9PSAnKCcpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgbGV0IGRlcHRoID0gMDtcbiAgZm9yICg7IGluZGV4IDwgaW50ZXJmYWNlQm9keS5sZW5ndGg7IGluZGV4KyspIHtcbiAgICBjb25zdCBjaGFyYWN0ZXIgPSBpbnRlcmZhY2VCb2R5W2luZGV4XTtcbiAgICBpZiAoY2hhcmFjdGVyID09PSAnKCcpIHtcbiAgICAgIGRlcHRoKys7XG4gICAgfSBlbHNlIGlmIChjaGFyYWN0ZXIgPT09ICcpJykge1xuICAgICAgZGVwdGgtLTtcbiAgICAgIGlmIChkZXB0aCA9PT0gMCkge1xuICAgICAgICByZXR1cm4gQVJST1dfUkVHX0VYUC50ZXN0KGludGVyZmFjZUJvZHkuc2xpY2UoaW5kZXggKyAxKSk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cblxuZnVuY3Rpb24gaXNOb25QdWJsaWNNZW1iZXIobW9kaWZpZXJzOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIC9cXGIoPzpwcml2YXRlfHByb3RlY3RlZClcXGIvLnRlc3QobW9kaWZpZXJzKTtcbn1cblxuLy8gYHJlYWRvbmx5YCBpcyB0aGUgb25seSBtb2RpZmllciBhIHByb3BlcnR5IHNpZ25hdHVyZSB0YWtlcywgYW5kIGEgbWV0aG9kIHNpZ25hdHVyZSB0YWtlcyBub25lIOKAlCBUeXBlU2NyaXB0XG4vLyByZWplY3RzIGByZWFkb25seSBmb28oKTogdm9pZDtgIOKAlCBzbyB0aGUgbWV0aG9kLXNpZ25hdHVyZSByZWdleCBuZWVkcyBubyBjb3VudGVycGFydC5cbmZ1bmN0aW9uIG1hdGNoUHJvcGVydHlTaWduYXR1cmVzKGludGVyZmFjZUJvZHk6IHN0cmluZyk6IFJlZ0V4cEV4ZWNBcnJheVtdIHtcbiAgcmV0dXJuIFsuLi5pbnRlcmZhY2VCb2R5Lm1hdGNoQWxsKC9eIHsyfSg/OnJlYWRvbmx5XFxzKyk/KD88bmFtZT5cXHcrKVxcPz86XFxzKi9nbSldO1xufVxuXG5mdW5jdGlvbiBwYXJzZU1lbWJlcnMoa2V5d29yZDogc3RyaW5nLCBib2R5OiBzdHJpbmcpOiBJbnRlcmZhY2VNZW1iZXJzIHtcbiAgc3dpdGNoIChrZXl3b3JkKSB7XG4gICAgY2FzZSAnY2xhc3MnOiB7XG4gICAgICByZXR1cm4gYnVpbGRNZW1iZXJzKGV4dHJhY3RDbGFzc01ldGhvZE5hbWVzKGJvZHkpLCBleHRyYWN0Q2xhc3NQcm9wZXJ0eU5hbWVzKGJvZHkpKTtcbiAgICB9XG4gICAgY2FzZSAnZW51bSc6IHtcbiAgICAgIHJldHVybiBidWlsZE1lbWJlcnMoW10sIGV4dHJhY3RFbnVtTWVtYmVyTmFtZXMoYm9keSkpO1xuICAgIH1cbiAgICBkZWZhdWx0OiB7XG4gICAgICByZXR1cm4gYnVpbGRNZW1iZXJzKGV4dHJhY3RNZXRob2ROYW1lcyhib2R5KSwgZXh0cmFjdFByb3BlcnR5TmFtZXMoYm9keSkpO1xuICAgIH1cbiAgfVxufVxuXG4vLyBSZWFkcyB0aGUgbm90ZSdzIGBvYnNpZGlhbi1kZXYtdXRpbHMgPiBkZW1vLXZhdWx0LXZhbGlkYXRpb24gPiBhbGxvdy13aWtpbGlua3NgIGRlY2xhcmF0aW9uOiB0aGUgc3RhdGVkXG4vLyByZWFzb24sIGAnJ2Agd2hlbiB0aGUga2V5IGlzIHByZXNlbnQgd2l0aCBub3RoaW5nIGFmdGVyIGl0LCBvciBgbnVsbGAgd2hlbiB0aGUgbm90ZSBkZWNsYXJlcyBub3RoaW5nLlxuLy8gUmVhZCB3aXRoIGEgcmVndWxhciBleHByZXNzaW9uIHJhdGhlciB0aGFuIGEgWUFNTCBwYXJzZXI6IGl0IGlzIG9uZSBrbm93biBrZXkgcGF0aCwgYW5kIGV2ZXJ5IHBsdWdpbiB0aGF0XG4vLyBpbnN0YWxscyB0aGlzIHBhY2thZ2Ugd291bGQgb3RoZXJ3aXNlIGNhcnJ5IGEgWUFNTCBkZXBlbmRlbmN5IGZvciBpdC5cbmZ1bmN0aW9uIHJlYWRXaWtpbGlua0FsbG93YW5jZVJlYXNvbihjb250ZW50OiBzdHJpbmcpOiBudWxsIHwgc3RyaW5nIHtcbiAgY29uc3QgZnJvbnRtYXR0ZXIgPSBGUk9OVE1BVFRFUl9SRUdfRVhQLmV4ZWMoY29udGVudCk/LlswXTtcbiAgaWYgKGZyb250bWF0dGVyID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICBjb25zdCByZWFzb24gPSBXSUtJTElOS19BTExPV0FOQ0VfUkVHX0VYUC5leGVjKGZyb250bWF0dGVyKT8uZ3JvdXBzPy5bJ3JlYXNvbiddO1xuICByZXR1cm4gcmVhc29uID09PSB1bmRlZmluZWQgPyBudWxsIDogcmVhc29uLnRyaW0oKS5yZXBsYWNlKC9eKD88cXVvdGU+W1wiJ10pKD88dmFsdWU+W1xcc1xcU10qKVxcazxxdW90ZT4kLywgJyQ8dmFsdWU+Jyk7XG59XG5cbi8vIFJlYWRzIHRoZSBub3RlJ3MgaW5saW5lIGBvYnNpZGlhbi1kZXYtdXRpbHMtZGlzYWJsZeKApmAgZGlyZWN0aXZlcywgcmV0dXJuaW5nIHdoaWNoIGxpbmVzIHRoZXkgYWxsb3cgYVxuLy8gd2lraWxpbmsgb24gYW5kIGV2ZXJ5dGhpbmcgd3Jvbmcgd2l0aCB0aGVtLiBBIHN1cHByZXNzaW9uIHRoYXQgcXVpZXRseSBkb2VzIG5vdGhpbmcgaXMgd29yc2UgdGhhbiBub25lLFxuLy8gc28gYSBtaXNzcGVsbGVkIGRpcmVjdGl2ZSwgb25lIHdpdGggbm8gcmVhc29uLCBhbiB1bmNsb3NlZCByZWdpb24gYW5kIG9uZSBjb3ZlcmluZyBubyB3aWtpbGluayBhdCBhbGxcbi8vIGFyZSBlYWNoIHJlcG9ydGVkIHJhdGhlciB0aGFuIGlnbm9yZWQuXG5mdW5jdGlvbiBzY2FuV2lraWxpbmtEaXJlY3RpdmVzKGNvbnRlbnQ6IHN0cmluZyk6IFdpa2lsaW5rRGlyZWN0aXZlU2NhbiB7XG4gIGNvbnN0IHN0YXRlOiBXaWtpbGlua0RpcmVjdGl2ZVNjYW5TdGF0ZSA9IHtcbiAgICBhbGxvd2VkTGluZUluZGV4ZXM6IG5ldyBTZXQ8bnVtYmVyPigpLFxuICAgIG9wZW5SZWdpb246IG51bGwsXG4gICAgcGVuZGluZ05leHRMaW5lSW5kZXg6IG51bGwsXG4gICAgcHJvYmxlbXM6IFtdLFxuICAgIHdpa2lsaW5rTGluZUluZGV4ZXM6IG5ldyBTZXQoZmluZFdpa2lsaW5rTGluZUluZGV4ZXMoY29udGVudCkpXG4gIH07XG5cbiAgZm9yIChjb25zdCB7IGluZGV4LCBsaW5lIH0gb2YgY29sbGVjdExpbmVzT3V0c2lkZUZlbmNlcyhjb250ZW50KSkge1xuICAgIGNvbnN0IG1hdGNoID0gRElSRUNUSVZFX1JFR19FWFAuZXhlYyhsaW5lKTtcbiAgICBpZiAobWF0Y2gpIHtcbiAgICAgIGFwcGx5V2lraWxpbmtEaXJlY3RpdmUoc3RhdGUsIGluZGV4LCBtYXRjaCk7XG4gICAgfSBlbHNlIGlmIChESVJFQ1RJVkVfUFJPQkVfUkVHX0VYUC50ZXN0KGxpbmUpKSB7XG4gICAgICBzdGF0ZS5wcm9ibGVtcy5wdXNoKGBhIG1hbGZvcm1lZCBkaXJlY3RpdmUgb24gJHtmb3JtYXRMaW5lTnVtYmVyKGluZGV4KX1gKTtcbiAgICB9IGVsc2Uge1xuICAgICAgYXBwbHlXaWtpbGlua1NjYW5MaW5lKHN0YXRlLCBpbmRleCwgbGluZSk7XG4gICAgfVxuICB9XG5cbiAgaWYgKHN0YXRlLm9wZW5SZWdpb24pIHtcbiAgICBzdGF0ZS5wcm9ibGVtcy5wdXNoKGBhIHJlZ2lvbiBvcGVuZWQgb24gJHtmb3JtYXRMaW5lTnVtYmVyKHN0YXRlLm9wZW5SZWdpb24ubGluZUluZGV4KX0gdGhhdCBpcyBuZXZlciBlbmFibGVkIGFnYWluYCk7XG4gIH1cbiAgaWYgKHN0YXRlLnBlbmRpbmdOZXh0TGluZUluZGV4ICE9PSBudWxsKSB7XG4gICAgc3RhdGUucHJvYmxlbXMucHVzaChgYSBkaXNhYmxlLW5leHQtbGluZSBvbiAke2Zvcm1hdExpbmVOdW1iZXIoc3RhdGUucGVuZGluZ05leHRMaW5lSW5kZXgpfSBjb3ZlcmluZyBubyB3aWtpbGlua2ApO1xuICB9XG4gIHJldHVybiB7IGFsbG93ZWRMaW5lSW5kZXhlczogc3RhdGUuYWxsb3dlZExpbmVJbmRleGVzLCBwcm9ibGVtczogc3RhdGUucHJvYmxlbXMgfTtcbn1cblxuZnVuY3Rpb24gc3RyaXBGcm9udG1hdHRlcihjb250ZW50OiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gY29udGVudC5yZXBsYWNlKEZST05UTUFUVEVSX1JFR19FWFAsICcnKTtcbn1cblxuZnVuY3Rpb24gc3RyaXBJbmxpbmVDb2RlKGxpbmU6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBsaW5lLnJlcGxhY2VBbGwoSU5MSU5FX0NPREVfUkVHX0VYUCwgJycpO1xufVxuXG4vLyBBIGhhbmQtd3JpdHRlbiBsaW5rIG1heSBjb250YWluIGEgYmFyZSBgJWAgKG9yIGFueSBvdGhlciBpbnZhbGlkIHBlcmNlbnQtZXNjYXBlKSwgd2hpY2ggbWFrZXNcbi8vIGBkZWNvZGVVUklDb21wb25lbnRgIHRocm93LiBTdWNoIGEgdGFyZ2V0IGlzIG1lYW50IGxpdGVyYWxseSwgc28gaXQgaXMgdXNlZCBhcyB3cml0dGVuLlxuZnVuY3Rpb24gdHJ5RGVjb2RlVXJpQ29tcG9uZW50KHZhbHVlOiBzdHJpbmcpOiBzdHJpbmcge1xuICB0cnkge1xuICAgIHJldHVybiBkZWNvZGVVUklDb21wb25lbnQodmFsdWUpO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFzRUEsU0FBUyxtQ0FBbUM7QUFDNUM7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBQ1AsU0FBUyw4QkFBOEI7QUFDdkMsU0FBUyx5QkFBeUI7QUFDbEM7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBQ1A7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBRVA7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLE9BQ0s7QUFDUCxTQUFTLCtCQUErQjtBQTBYakMsTUFBTSx5QkFBeUI7QUFBQSxFQUM1QixlQUE4QjtBQUFBLEVBQzlCLGNBQXNDO0FBQUEsRUFDN0I7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQU9WLFlBQVksUUFBbUQ7QUFDcEUsU0FBSyxhQUFhLE9BQU87QUFDekIsU0FBSyxrQkFBa0IsS0FBSyxLQUFLLFlBQVksd0JBQXdCLFNBQVM7QUFDOUUsU0FBSyxnQkFBZ0IsSUFBSSxJQUFJLE9BQU8saUJBQWlCLHNCQUFzQjtBQUFBLEVBQzdFO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBT08sK0JBQXlDO0FBQzlDLFdBQU8sS0FBSyxhQUFhLEVBQUUsSUFBSSxDQUFDLFNBQVMsS0FBSyxZQUFZO0FBQUEsRUFDNUQ7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQVFPLGVBQWdDO0FBQ3JDLFNBQUssZ0JBQWdCLEtBQUsscUJBQXFCLEtBQUssZUFBZSxFQUFFLElBQUksQ0FBQyxVQUFVO0FBQUEsTUFDbEYsU0FBUyxhQUFhLE1BQU0sT0FBTztBQUFBLE1BQ25DLGNBQWMsU0FBUyxLQUFLLGlCQUFpQixJQUFJO0FBQUEsSUFDbkQsRUFBRTtBQUNGLFdBQU8sS0FBSztBQUFBLEVBQ2Q7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFVTywrQkFBeUM7QUFDOUMsVUFBTSxjQUFjLEtBQUssS0FBSyxpQkFBaUIsd0JBQXdCLGFBQWEsd0JBQXdCLE9BQU87QUFDbkgsVUFBTSxVQUFVLFdBQVcsV0FBVyxJQUFJLGFBQWEsYUFBYSxPQUFPLElBQUk7QUFDL0UsV0FBTyxrQ0FBa0MsRUFBRSxTQUFTLHNCQUFzQixFQUFFLFNBQVMsTUFBTSxZQUFZLENBQUMsRUFBRSxDQUFDO0FBQUEsRUFDN0c7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQVFPLHlCQUFtQztBQUN4QyxXQUFPLEtBQUssc0JBQXNCLEVBQy9CLE9BQU8sQ0FBQyxTQUFTLHNCQUFzQixLQUFLLE9BQU8sRUFBRSxLQUFLLENBQUMsU0FBUyxrQkFBa0IsS0FBSyxJQUFJLENBQUMsQ0FBQyxFQUNqRyxJQUFJLENBQUMsU0FBUyxLQUFLLFlBQVk7QUFBQSxFQUNwQztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQU9PLHFCQUErQjtBQUNwQyxXQUFPLEtBQUssc0JBQXNCLEVBQy9CLE9BQU8sQ0FBQyxTQUFTLENBQUMsTUFBTSxLQUFLLE9BQU8sQ0FBQyxFQUNyQyxJQUFJLENBQUMsU0FBUyxLQUFLLFlBQVk7QUFBQSxFQUNwQztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBUU8sNkJBQXVDO0FBQzVDLFdBQU8sS0FBSyxzQkFBc0IsRUFDL0IsT0FBTyxDQUFDLFNBQVMsQ0FBQyxjQUFjLEtBQUssT0FBTyxDQUFDLEVBQzdDLElBQUksQ0FBQyxTQUFTLEtBQUssWUFBWTtBQUFBLEVBQ3BDO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQVNPLDRDQUFzRDtBQUMzRCxXQUFPLEtBQUssc0JBQXNCLEVBQUUsUUFBUSxDQUFDLFNBQVM7QUFDcEQsWUFBTSxPQUFPLHVCQUF1QixLQUFLLE9BQU87QUFDaEQsWUFBTSxXQUFXLENBQUMsR0FBRyxLQUFLLFFBQVE7QUFDbEMsWUFBTSxTQUFTLDRCQUE0QixLQUFLLE9BQU87QUFDdkQsVUFBSSxXQUFXLE1BQU07QUFDbkIsWUFBSSxPQUFPLEtBQUssTUFBTSxJQUFJO0FBQ3hCLG1CQUFTLEtBQUssdUNBQXVDO0FBQUEsUUFDdkQsV0FBVyxDQUFDLFlBQVksS0FBSyxPQUFPLEdBQUc7QUFDckMsbUJBQVMsS0FBSyw2Q0FBNkM7QUFBQSxRQUM3RCxXQUFXLEtBQUssbUJBQW1CLE9BQU8sR0FBRztBQUMzQyxtQkFBUyxLQUFLLDJEQUEyRDtBQUFBLFFBQzNFO0FBQUEsTUFDRjtBQUNBLGFBQU8sU0FBUyxJQUFJLENBQUMsWUFBWSxHQUFHLEtBQUssWUFBWSxLQUFLLE9BQU8sRUFBRTtBQUFBLElBQ3JFLENBQUM7QUFBQSxFQUNIO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBVU8seUJBQW1DO0FBQ3hDLFdBQU8sS0FBSyxzQkFBc0IsRUFDL0IsT0FBTyxDQUFDLFNBQVM7QUFDaEIsVUFBSSw0QkFBNEIsS0FBSyxPQUFPLE1BQU0sTUFBTTtBQUN0RCxlQUFPO0FBQUEsTUFDVDtBQUNBLFlBQU0sRUFBRSxtQkFBbUIsSUFBSSx1QkFBdUIsS0FBSyxPQUFPO0FBQ2xFLGFBQU8sd0JBQXdCLEtBQUssT0FBTyxFQUFFLEtBQUssQ0FBQyxjQUFjLENBQUMsbUJBQW1CLElBQUksU0FBUyxDQUFDO0FBQUEsSUFDckcsQ0FBQyxFQUNBLElBQUksQ0FBQyxTQUFTLEtBQUssWUFBWTtBQUFBLEVBQ3BDO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFRTyxvQkFBb0IsUUFBcUU7QUFDOUYsVUFBTSxlQUFlLElBQUksSUFBSSxPQUFPLFlBQVk7QUFDaEQsVUFBTSxhQUFhLENBQUMsR0FBRyxLQUFLLFdBQVcsRUFBRSxTQUFTLElBQUksT0FBTyxPQUFPLE1BQU0sT0FBTyxRQUFRLG9CQUFvQixHQUFHLENBQUMsQ0FBQyxFQUMvRyxJQUFJLENBQUMsVUFBVSx1QkFBdUIsT0FBTyxRQUFRLENBQUM7QUFDekQsV0FBTyxDQUFDLEdBQUcsSUFBSSxJQUFJLFVBQVUsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxXQUFXLENBQUMsYUFBYSxJQUFJLE1BQU0sQ0FBQztBQUFBLEVBQzlFO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFRTywwQkFBMEIsUUFBMkU7QUFDMUcsVUFBTSxTQUFTLEtBQUssV0FBVztBQUMvQixXQUFPLE9BQU8sUUFBUSxPQUFPLENBQUMsV0FBVztBQUN2QyxZQUFNLFNBQVMsT0FBTyxhQUFhLFNBQVksU0FBUyxHQUFHLE9BQU8sUUFBUSxJQUFJLE1BQU07QUFDcEYsYUFBTyxDQUFDLE9BQU8sU0FBUyxNQUFNO0FBQUEsSUFDaEMsQ0FBQztBQUFBLEVBQ0g7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQVFPLHdCQUF3QixRQUF5RTtBQUN0RyxVQUFNLGlCQUFpQixJQUFJLElBQUksT0FBTyxjQUFjO0FBQ3BELFVBQU0sY0FBYyxZQUFZLEtBQUssS0FBSyxZQUFZLE9BQU8sVUFBVSxDQUFDLEVBQ3JFLE9BQU8sQ0FBQyxTQUFTLEtBQUssU0FBUyxLQUFLLENBQUMsRUFDckMsSUFBSSxDQUFDLFNBQVMsS0FBSyxRQUFRLFNBQVMsRUFBRSxDQUFDLEVBQ3ZDLE9BQU8sQ0FBQyxTQUFTLENBQUMsZUFBZSxJQUFJLElBQUksQ0FBQztBQUM3QyxVQUFNLGFBQWEsSUFBSTtBQUFBLE1BQ3JCLENBQUMsR0FBRyxLQUFLLFdBQVcsRUFBRSxTQUFTLDJCQUEyQixDQUFDLEVBQUUsSUFBSSxDQUFDLFVBQVUsdUJBQXVCLE9BQU8sS0FBSyxDQUFDO0FBQUEsSUFDbEg7QUFDQSxXQUFPLFlBQVksT0FBTyxDQUFDLFFBQVEsQ0FBQyxXQUFXLElBQUksR0FBRyxDQUFDO0FBQUEsRUFDekQ7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQWNPLHFCQUFxQixRQUFzRTtBQUNoRyxVQUFNLHNCQUFzQixJQUFJLElBQUksS0FBSyxhQUFhLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLGNBQWMsSUFBSSxDQUFDLENBQUM7QUFDaEcsVUFBTSxlQUFlLG9CQUFJLElBQVk7QUFDckMsVUFBTSxlQUFlLENBQUMsT0FBTyxTQUFTO0FBRXRDLFdBQU8sYUFBYSxTQUFTLEdBQUc7QUFDOUIsWUFBTSxXQUFXLGtCQUFrQixhQUFhLElBQUksQ0FBQztBQUNyRCxZQUFNLE9BQU8sb0JBQW9CLElBQUksUUFBUTtBQUM3QyxVQUFJLENBQUMsUUFBUSxhQUFhLElBQUksUUFBUSxHQUFHO0FBQ3ZDO0FBQUEsTUFDRjtBQUNBLG1CQUFhLElBQUksUUFBUTtBQUN6QixtQkFBYSxLQUFLLEdBQUcsdUJBQXVCLElBQUksQ0FBQztBQUFBLElBQ25EO0FBRUEsV0FBTyxLQUFLLHNCQUFzQixFQUMvQixJQUFJLENBQUMsU0FBUyxLQUFLLFlBQVksRUFDL0IsT0FBTyxDQUFDLGFBQWEsQ0FBQyxhQUFhLElBQUksUUFBUSxDQUFDO0FBQUEsRUFDckQ7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQVFPLHlCQUF5QixRQUEwRTtBQUN4RyxVQUFNLFNBQVMsYUFBYSxLQUFLLEtBQUssWUFBWSxPQUFPLFVBQVUsR0FBRyxPQUFPO0FBQzdFLFdBQU8sQ0FBQyxHQUFHLE9BQU8sU0FBUywrQ0FBK0MsQ0FBQyxFQUN4RSxJQUFJLENBQUMsVUFBVSx1QkFBdUIsT0FBTyxNQUFNLENBQUM7QUFBQSxFQUN6RDtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFTTyxvQkFBb0IsUUFBNkU7QUFDdEcsVUFBTSxTQUFTLGFBQWEsS0FBSyxLQUFLLFlBQVksT0FBTyxVQUFVLEdBQUcsT0FBTztBQUM3RSxVQUFNLFFBQVEsSUFBSSxPQUFPLE9BQU8sOENBQThDLE9BQU8sYUFBYSxnQ0FBZ0MsRUFBRSxLQUFLLE1BQU07QUFDL0ksUUFBSSxDQUFDLE9BQU87QUFDVixZQUFNLElBQUksTUFBTSw0QkFBNEIsT0FBTyxhQUFhLEVBQUU7QUFBQSxJQUNwRTtBQUNBLFdBQU8sYUFBYSx1QkFBdUIsT0FBTyxTQUFTLEdBQUcsdUJBQXVCLE9BQU8sTUFBTSxDQUFDO0FBQUEsRUFDckc7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFPTyxhQUFxQjtBQUMxQixTQUFLLGlCQUFpQixLQUFLLGFBQWEsRUFDckMsSUFBSSxDQUFDLFNBQVMsS0FBSyxPQUFPLEVBQzFCLEtBQUssSUFBSTtBQUNaLFdBQU8sS0FBSztBQUFBLEVBQ2Q7QUFBQTtBQUFBO0FBQUEsRUFJUSx3QkFBeUM7QUFDL0MsV0FBTyxLQUFLLGFBQWEsRUFBRSxPQUFPLENBQUMsU0FBUyxDQUFDLEtBQUssY0FBYyxJQUFJLEtBQUssWUFBWSxDQUFDO0FBQUEsRUFDeEY7QUFBQSxFQUVRLHFCQUFxQixRQUEwQjtBQUNyRCxVQUFNLFNBQW1CLENBQUM7QUFHMUIsVUFBTSxVQUFVLFlBQVksUUFBUSxFQUFFLGVBQWUsS0FBSyxDQUFDLEVBQUUsS0FBSyxDQUFDLEdBQUcsTUFBTSxFQUFFLEtBQUssY0FBYyxFQUFFLE1BQU0sSUFBSSxDQUFDO0FBQzlHLGVBQVcsU0FBUyxTQUFTO0FBQzNCLFVBQUksTUFBTSxZQUFZLEdBQUc7QUFDdkIsWUFBSSxNQUFNLFNBQVMsd0JBQXdCLGFBQXVCO0FBQ2hFO0FBQUEsUUFDRjtBQUNBLGVBQU8sS0FBSyxHQUFHLEtBQUsscUJBQXFCLEtBQUssUUFBUSxNQUFNLElBQUksQ0FBQyxDQUFDO0FBQUEsTUFDcEUsV0FBVyxNQUFNLEtBQUssU0FBUyxLQUFLLEdBQUc7QUFDckMsZUFBTyxLQUFLLEtBQUssUUFBUSxNQUFNLElBQUksQ0FBQztBQUFBLE1BQ3RDO0FBQUEsSUFDRjtBQUNBLFdBQU87QUFBQSxFQUNUO0FBQ0Y7QUFVTyxTQUFTLCtCQUErQixRQUFvRDtBQUNqRyxRQUFNLFVBQVUsSUFBSSx5QkFBeUIsNEJBQXVFO0FBQUEsSUFDbEgsZUFBZSxPQUFPLFdBQVc7QUFBQSxJQUNqQyxZQUFZLE9BQU87QUFBQSxFQUNyQixDQUFDLENBQUM7QUFDRixRQUFNLFlBQVksT0FBTyxXQUFXLGFBQWE7QUFFakQsV0FBUyx1QkFBdUIsTUFBTTtBQUNwQyxlQUFXLFFBQVEsT0FBTyxjQUFjLENBQUMsR0FBRztBQUMxQyxTQUFHLHNCQUFzQixLQUFLLGFBQWEsSUFBSSxLQUFLLElBQUksSUFBSSxNQUFNO0FBQ2hFLGNBQU0sVUFBVSxRQUFRLG9CQUFvQixJQUFJO0FBQ2hELGNBQU0sZUFBZSxRQUFRLEtBQUssSUFBSTtBQUN0QyxlQUFPLGFBQWEsTUFBTSxFQUFFLGdCQUFnQixDQUFDO0FBQzdDLGVBQU8sUUFBUSwwQkFBMEIsRUFBRSxTQUFTLGNBQWMsVUFBVSxLQUFLLFNBQVMsQ0FBQyxDQUFDLEVBQUUsUUFBUSxDQUFDLENBQUM7QUFBQSxNQUMxRyxDQUFDO0FBRUQsU0FBRyxpQkFBaUIsS0FBSyxhQUFhLGlDQUFpQyxNQUFNO0FBQzNFLGNBQU0sVUFBVSxRQUFRLG9CQUFvQixJQUFJO0FBQ2hELGVBQU8sUUFBUSxvQkFBb0IsRUFBRSxVQUFVLEtBQUssVUFBVSxjQUFjLFFBQVEsSUFBSSxDQUFDLENBQUMsRUFBRSxRQUFRLENBQUMsQ0FBQztBQUFBLE1BQ3hHLENBQUM7QUFBQSxJQUNIO0FBRUEsZUFBVyxRQUFRLE9BQU8sb0JBQW9CLENBQUMsR0FBRztBQUNoRCxTQUFHLHNCQUFzQixLQUFLLGFBQWEsV0FBVyxNQUFNO0FBQzFELGNBQU0sVUFBVSxRQUFRLG9CQUFvQixJQUFJO0FBQ2hELGVBQU8sUUFBUSxXQUFXLE1BQU0sRUFBRSxnQkFBZ0IsQ0FBQztBQUNuRCxlQUFPLFFBQVEsMEJBQTBCLEVBQUUsU0FBUyxRQUFRLFdBQVcsQ0FBQyxDQUFDLEVBQUUsUUFBUSxDQUFDLENBQUM7QUFBQSxNQUN2RixDQUFDO0FBQUEsSUFDSDtBQUVBLGVBQVcsUUFBUSxPQUFPLG1CQUFtQixDQUFDLEdBQUc7QUFDL0MsU0FBRywyQ0FBMkMsS0FBSyxVQUFVLElBQUksTUFBTTtBQUNyRSxjQUFNLGdCQUFnQixRQUFRLHlCQUF5QixJQUFJO0FBQzNELGVBQU8sY0FBYyxNQUFNLEVBQUUsZ0JBQWdCLENBQUM7QUFDOUMsZUFBTyxRQUFRLDBCQUEwQixFQUFFLFNBQVMsY0FBYyxDQUFDLENBQUMsRUFBRSxRQUFRLENBQUMsQ0FBQztBQUFBLE1BQ2xGLENBQUM7QUFBQSxJQUNIO0FBRUEsVUFBTSxPQUFPLE9BQU87QUFDcEIsUUFBSSxNQUFNO0FBQ1IsU0FBRywyQ0FBMkMsTUFBTTtBQUNsRCxlQUFPLFFBQVEsd0JBQXdCLEVBQUUsWUFBWSxLQUFLLFFBQVEsZ0JBQWdCLEtBQUssZUFBZSxDQUFDLENBQUMsRUFDckcsUUFBUSxDQUFDLENBQUM7QUFBQSxNQUNmLENBQUM7QUFBQSxJQUNIO0FBRUEsT0FBRywrQkFBK0IsTUFBTTtBQUN0QyxhQUFPLFFBQVEsbUJBQW1CLENBQUMsRUFBRSxRQUFRLENBQUMsQ0FBQztBQUFBLElBQ2pELENBQUM7QUFFRCxPQUFHLHVFQUF1RSxNQUFNO0FBQzlFLGFBQU8sUUFBUSwyQkFBMkIsQ0FBQyxFQUFFLFFBQVEsQ0FBQyxDQUFDO0FBQUEsSUFDekQsQ0FBQztBQUVELE9BQUcsMkJBQTJCLFNBQVMsSUFBSSxNQUFNO0FBQy9DLGFBQU8sUUFBUSxxQkFBcUIsRUFBRSxVQUFVLENBQUMsQ0FBQyxFQUFFLFFBQVEsQ0FBQyxDQUFDO0FBQUEsSUFDaEUsQ0FBQztBQUVELE9BQUcsb0RBQW9ELE1BQU07QUFDM0QsYUFBTyxRQUFRLHVCQUF1QixDQUFDLEVBQUUsUUFBUSxDQUFDLENBQUM7QUFBQSxJQUNyRCxDQUFDO0FBRUQsT0FBRyw0RUFBNEUsTUFBTTtBQUNuRixhQUFPLFFBQVEsMENBQTBDLENBQUMsRUFBRSxRQUFRLENBQUMsQ0FBQztBQUFBLElBQ3hFLENBQUM7QUFFRCxPQUFHLDJEQUEyRCxNQUFNO0FBQ2xFLGFBQU8sUUFBUSx1QkFBdUIsQ0FBQyxFQUFFLFFBQVEsQ0FBQyxDQUFDO0FBQUEsSUFDckQsQ0FBQztBQUVELE9BQUcsb0ZBQW9GLE1BQU07QUFDM0YsYUFBTyxRQUFRLDZCQUE2QixDQUFDLEVBQUUsUUFBUSxDQUFDLENBQUM7QUFBQSxJQUMzRCxDQUFDO0FBS0QsT0FBRyxnQ0FBZ0MsTUFBTTtBQUN2QyxhQUFPLFFBQVEsNkJBQTZCLEVBQUUsTUFBTSxFQUFFLGdCQUFnQixDQUFDO0FBQUEsSUFDekUsQ0FBQztBQUVELFVBQU0sUUFBUSxPQUFPO0FBQ3JCLFFBQUksT0FBTztBQUNULFNBQUcsMkNBQTJDLE1BQU07QUFDbEQsY0FBTSxVQUFVLFFBQVEsb0JBQW9CLEtBQUs7QUFDakQsZUFBTyxRQUFRLEdBQUcsRUFBRSxVQUFVLE1BQU0sWUFBWTtBQUNoRCxlQUFPLFFBQVEsNkJBQTZCLENBQUMsRUFBRSxVQUFVLE1BQU0sY0FBYztBQUFBLE1BQy9FLENBQUM7QUFBQSxJQUNIO0FBQUEsRUFDRixDQUFDO0FBQ0g7QUFFQSxNQUFNLHlCQUF5QixPQUFPO0FBQ3RDLE1BQU0sdUJBQXVCO0FBQzdCLE1BQU0sZ0JBQWdCO0FBQ3RCLE1BQU0sbUNBQW1DO0FBQ3pDLE1BQU0seUJBQXlCO0FBQy9CLE1BQU0scUJBQXFCO0FBQzNCLE1BQU0seUJBQXlCLENBQUMsV0FBVztBQUMzQyxNQUFNLHFCQUFxQjtBQUMzQixNQUFNLG9CQUFvQjtBQUMxQixNQUFNLHNCQUFzQjtBQUM1QixNQUFNLGFBQWE7QUFDbkIsTUFBTSxrQkFBa0I7QUFDeEIsTUFBTSxzQkFBc0I7QUFDNUIsTUFBTSx3QkFBd0I7QUFJOUIsTUFBTSxvQkFBb0I7QUFHMUIsTUFBTSwwQkFBMEI7QUFDaEMsTUFBTSxnQkFBZ0I7QUFJdEIsTUFBTSw2QkFBNkI7QUFDbkMsTUFBTSxtQkFBbUI7QUFHekIsU0FBUyx1QkFBdUIsT0FBbUMsV0FBbUIsT0FBOEI7QUFDbEgsUUFBTSxTQUFTLHVCQUF1QixPQUFPLFFBQVE7QUFDckQsUUFBTSxPQUFPLHVCQUF1QixPQUFPLE1BQU07QUFDakQsUUFBTSxTQUFTLE1BQU0sU0FBUyxRQUFRLEdBQUcsS0FBSyxLQUFLO0FBQ25ELE1BQUksU0FBUyxlQUFlO0FBQzFCLFVBQU0sU0FBUyxLQUFLLG9CQUFvQixJQUFJLFFBQVEsaUJBQWlCLFNBQVMsQ0FBQyxFQUFFO0FBQ2pGO0FBQUEsRUFDRjtBQUNBLE1BQUksV0FBVyxZQUFZLFdBQVcsSUFBSTtBQUN4QyxVQUFNLFNBQVMsS0FBSyxpQ0FBaUMsaUJBQWlCLFNBQVMsQ0FBQyxFQUFFO0FBQ2xGO0FBQUEsRUFDRjtBQUVBLE1BQUksV0FBVyxxQkFBcUI7QUFDbEMsVUFBTSx1QkFBdUI7QUFDN0I7QUFBQSxFQUNGO0FBRUEsTUFBSSxXQUFXLFdBQVc7QUFDeEIsUUFBSSxNQUFNLFlBQVk7QUFDcEIsWUFBTSxTQUFTLEtBQUssZ0JBQWdCLGlCQUFpQixTQUFTLENBQUMsZ0NBQWdDLGlCQUFpQixNQUFNLFdBQVcsU0FBUyxDQUFDLEVBQUU7QUFDN0k7QUFBQSxJQUNGO0FBQ0EsVUFBTSxhQUFhLEVBQUUsUUFBUSxPQUFPLFVBQVU7QUFDOUM7QUFBQSxFQUNGO0FBRUEsTUFBSSxDQUFDLE1BQU0sWUFBWTtBQUNyQixVQUFNLFNBQVMsS0FBSyxnQkFBZ0IsaUJBQWlCLFNBQVMsQ0FBQyxzQkFBc0I7QUFDckY7QUFBQSxFQUNGO0FBQ0EsTUFBSSxDQUFDLE1BQU0sV0FBVyxRQUFRO0FBQzVCLFVBQU0sU0FBUyxLQUFLLHNCQUFzQixpQkFBaUIsTUFBTSxXQUFXLFNBQVMsQ0FBQyx1QkFBdUI7QUFBQSxFQUMvRztBQUNBLFFBQU0sYUFBYTtBQUNyQjtBQUlBLFNBQVMsc0JBQXNCLE9BQW1DLFdBQW1CLE1BQW9CO0FBQ3ZHLE1BQUksTUFBTSxZQUFZO0FBQ3BCLFVBQU0sbUJBQW1CLElBQUksU0FBUztBQUN0QyxVQUFNLFdBQVcsV0FBVyxNQUFNLG9CQUFvQixJQUFJLFNBQVM7QUFDbkU7QUFBQSxFQUNGO0FBQ0EsTUFBSSxNQUFNLHlCQUF5QixRQUFRLEtBQUssS0FBSyxNQUFNLElBQUk7QUFDN0Q7QUFBQSxFQUNGO0FBQ0EsUUFBTSxtQkFBbUIsSUFBSSxTQUFTO0FBQ3RDLE1BQUksQ0FBQyxNQUFNLG9CQUFvQixJQUFJLFNBQVMsR0FBRztBQUM3QyxVQUFNLFNBQVMsS0FBSywwQkFBMEIsaUJBQWlCLE1BQU0sb0JBQW9CLENBQUMsdUJBQXVCO0FBQUEsRUFDbkg7QUFDQSxRQUFNLHVCQUF1QjtBQUMvQjtBQUVBLFNBQVMsYUFBYSxTQUFtQixZQUF3QztBQUMvRSxTQUFPO0FBQUEsSUFDTCxLQUFLLENBQUMsR0FBRyxTQUFTLEdBQUcsVUFBVTtBQUFBLElBQy9CO0FBQUEsSUFDQTtBQUFBLEVBQ0Y7QUFDRjtBQVNBLFNBQVMsMEJBQTBCLFNBQTZCO0FBQzlELFFBQU0sWUFBd0IsQ0FBQztBQUMvQixNQUFJLGdCQUFnQjtBQUNwQixhQUFXLENBQUMsT0FBTyxJQUFJLEtBQUssUUFBUSxNQUFNLElBQUksRUFBRSxRQUFRLEdBQUc7QUFDekQsUUFBSSxtQkFBbUIsS0FBSyxJQUFJLEdBQUc7QUFDakMsc0JBQWdCLENBQUM7QUFDakI7QUFBQSxJQUNGO0FBQ0EsUUFBSSxDQUFDLGVBQWU7QUFDbEIsZ0JBQVUsS0FBSyxFQUFFLE9BQU8sS0FBSyxDQUFDO0FBQUEsSUFDaEM7QUFBQSxFQUNGO0FBQ0EsU0FBTztBQUNUO0FBRUEsU0FBUyx1QkFBdUIsTUFBK0I7QUFDN0QsUUFBTSxVQUFvQixDQUFDO0FBQzNCLGFBQVcsUUFBUSxzQkFBc0IsS0FBSyxPQUFPLEdBQUc7QUFDdEQsZUFBVyxTQUFTLGdCQUFnQixJQUFJLEVBQUUsU0FBUyxxQkFBcUIsR0FBRztBQUN6RSxZQUFNLFNBQVMsdUJBQXVCLE9BQU8sUUFBUSxFQUFFLFdBQVcsd0JBQXdCLEVBQUU7QUFDNUYsWUFBTSxDQUFDLFdBQVcsRUFBRSxJQUFJLE9BQU8sTUFBTSxLQUFLLENBQUM7QUFDM0MsVUFBSSxxQkFBcUIsS0FBSyxRQUFRLEtBQUssQ0FBQyxTQUFTLFlBQVksRUFBRSxTQUFTLEtBQUssR0FBRztBQUNsRjtBQUFBLE1BQ0Y7QUFDQSxjQUFRLEtBQUssS0FBSyxRQUFRLEtBQUssWUFBWSxHQUFHLHNCQUFzQixRQUFRLENBQUMsQ0FBQztBQUFBLElBQ2hGO0FBQUEsRUFDRjtBQUNBLFNBQU87QUFDVDtBQUVBLFNBQVMsd0JBQXdCLFdBQTZCO0FBQzVELFNBQU8sQ0FBQyxHQUFHLFVBQVUsU0FBUyxJQUFJLE9BQU8sT0FBTyx3QkFBd0Isc0JBQXNCLCtCQUErQixJQUFJLENBQUMsQ0FBQyxFQUNoSSxPQUFPLENBQUMsVUFBVSxDQUFDLGtCQUFrQix1QkFBdUIsT0FBTyxXQUFXLENBQUMsQ0FBQyxFQUNoRixJQUFJLENBQUMsVUFBVSx1QkFBdUIsT0FBTyxNQUFNLENBQUM7QUFDekQ7QUFFQSxTQUFTLDBCQUEwQixXQUE2QjtBQUM5RCxTQUFPLENBQUMsR0FBRyxVQUFVLFNBQVMsSUFBSSxPQUFPLE9BQU8sd0JBQXdCLHNCQUFzQiw4QkFBOEIsSUFBSSxDQUFDLENBQUMsRUFDL0gsT0FBTyxDQUFDLFVBQVUsQ0FBQyxrQkFBa0IsdUJBQXVCLE9BQU8sV0FBVyxDQUFDLENBQUMsRUFDaEYsSUFBSSxDQUFDLFVBQVUsdUJBQXVCLE9BQU8sTUFBTSxDQUFDO0FBQ3pEO0FBRUEsU0FBUyx1QkFBdUIsVUFBNEI7QUFDMUQsU0FBTyxDQUFDLEdBQUcsU0FBUyxTQUFTLHFCQUFxQixDQUFDLEVBQUUsSUFBSSxDQUFDLFVBQVUsdUJBQXVCLE9BQU8sTUFBTSxDQUFDO0FBQzNHO0FBTUEsU0FBUyxtQkFBbUIsZUFBaUM7QUFDM0QsUUFBTSx1QkFBdUIsQ0FBQyxHQUFHLGNBQWMsU0FBUyxtQ0FBbUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxVQUFVLHVCQUF1QixPQUFPLE1BQU0sQ0FBQztBQUNsSixRQUFNLHdCQUF3Qix3QkFBd0IsYUFBYSxFQUNoRSxPQUFPLENBQUMsVUFBVSxlQUFlLGVBQWUsS0FBSyxDQUFDLEVBQ3RELElBQUksQ0FBQyxVQUFVLHVCQUF1QixPQUFPLE1BQU0sQ0FBQztBQUN2RCxTQUFPLENBQUMsR0FBRyxzQkFBc0IsR0FBRyxxQkFBcUI7QUFDM0Q7QUFHQSxTQUFTLHFCQUFxQixlQUFpQztBQUM3RCxTQUFPLHdCQUF3QixhQUFhLEVBQ3pDLE9BQU8sQ0FBQyxVQUFVLENBQUMsZUFBZSxlQUFlLEtBQUssQ0FBQyxFQUN2RCxJQUFJLENBQUMsVUFBVSx1QkFBdUIsT0FBTyxNQUFNLENBQUM7QUFDekQ7QUFHQSxTQUFTLHdCQUF3QixTQUEyQjtBQUMxRCxTQUFPLDBCQUEwQixPQUFPLEVBQ3JDLE9BQU8sQ0FBQyxhQUFhLGlCQUFpQixLQUFLLGdCQUFnQixTQUFTLElBQUksQ0FBQyxDQUFDLEVBQzFFLElBQUksQ0FBQyxhQUFhLFNBQVMsS0FBSztBQUNyQztBQUVBLFNBQVMsaUJBQWlCLFdBQTJCO0FBQ25ELFNBQU8sUUFBUSxPQUFPLFlBQVksQ0FBQyxDQUFDO0FBQ3RDO0FBRUEsU0FBUyxzQkFBc0IsU0FBMkI7QUFDeEQsU0FBTywwQkFBMEIsT0FBTyxFQUFFLElBQUksQ0FBQyxhQUFhLFNBQVMsSUFBSTtBQUMzRTtBQUdBLFNBQVMsTUFBTSxTQUEwQjtBQUN2QyxhQUFXLFFBQVEsaUJBQWlCLE9BQU8sRUFBRSxNQUFNLElBQUksR0FBRztBQUN4RCxVQUFNLGNBQWMsS0FBSyxLQUFLO0FBQzlCLFFBQUksZ0JBQWdCLElBQUk7QUFDdEI7QUFBQSxJQUNGO0FBQ0EsV0FBTyxXQUFXLEtBQUssV0FBVztBQUFBLEVBQ3BDO0FBQ0EsU0FBTztBQUNUO0FBSUEsU0FBUyxjQUFjLFNBQTBCO0FBQy9DLGFBQVcsUUFBUSxpQkFBaUIsT0FBTyxFQUFFLE1BQU0sSUFBSSxHQUFHO0FBQ3hELFFBQUksbUJBQW1CLEtBQUssSUFBSSxHQUFHO0FBQ2pDLGFBQU87QUFBQSxJQUNUO0FBQ0EsVUFBTSxjQUFjLEtBQUssS0FBSztBQUM5QixRQUFJLGdCQUFnQixNQUFNLGdCQUFnQixLQUFLLFdBQVcsR0FBRztBQUMzRDtBQUFBLElBQ0Y7QUFDQSxXQUFPO0FBQUEsRUFDVDtBQUNBLFNBQU87QUFDVDtBQUlBLFNBQVMsWUFBWSxTQUEwQjtBQUM3QyxTQUFPLHdCQUF3QixPQUFPLEVBQUUsU0FBUztBQUNuRDtBQU1BLFNBQVMsZUFBZSxlQUF1QixPQUFpQztBQUM5RSxNQUFJLFFBQVEsTUFBTSxRQUFRLE1BQU0sQ0FBQyxFQUFFO0FBQ25DLFdBQVMsaUNBQWlDLEtBQUssY0FBYyxNQUFNLEtBQUssQ0FBQyxJQUFJLENBQUMsRUFBRSxVQUFVO0FBQzFGLE1BQUksY0FBYyxLQUFLLE1BQU0sS0FBSztBQUNoQyxXQUFPO0FBQUEsRUFDVDtBQUNBLE1BQUksUUFBUTtBQUNaLFNBQU8sUUFBUSxjQUFjLFFBQVEsU0FBUztBQUM1QyxVQUFNLFlBQVksY0FBYyxLQUFLO0FBQ3JDLFFBQUksY0FBYyxLQUFLO0FBQ3JCO0FBQUEsSUFDRixXQUFXLGNBQWMsS0FBSztBQUM1QjtBQUNBLFVBQUksVUFBVSxHQUFHO0FBQ2YsZUFBTyxjQUFjLEtBQUssY0FBYyxNQUFNLFFBQVEsQ0FBQyxDQUFDO0FBQUEsTUFDMUQ7QUFBQSxJQUNGO0FBQUEsRUFDRjtBQUNBLFNBQU87QUFDVDtBQUVBLFNBQVMsa0JBQWtCLFdBQTRCO0FBQ3JELFNBQU8sNEJBQTRCLEtBQUssU0FBUztBQUNuRDtBQUlBLFNBQVMsd0JBQXdCLGVBQTBDO0FBQ3pFLFNBQU8sQ0FBQyxHQUFHLGNBQWMsU0FBUyw0Q0FBNEMsQ0FBQztBQUNqRjtBQUVBLFNBQVMsYUFBYSxTQUFpQixNQUFnQztBQUNyRSxVQUFRLFNBQVM7QUFBQSxJQUNmLEtBQUssU0FBUztBQUNaLGFBQU8sYUFBYSx3QkFBd0IsSUFBSSxHQUFHLDBCQUEwQixJQUFJLENBQUM7QUFBQSxJQUNwRjtBQUFBLElBQ0EsS0FBSyxRQUFRO0FBQ1gsYUFBTyxhQUFhLENBQUMsR0FBRyx1QkFBdUIsSUFBSSxDQUFDO0FBQUEsSUFDdEQ7QUFBQSxJQUNBLFNBQVM7QUFDUCxhQUFPLGFBQWEsbUJBQW1CLElBQUksR0FBRyxxQkFBcUIsSUFBSSxDQUFDO0FBQUEsSUFDMUU7QUFBQSxFQUNGO0FBQ0Y7QUFNQSxTQUFTLDRCQUE0QixTQUFnQztBQUNuRSxRQUFNLGNBQWMsb0JBQW9CLEtBQUssT0FBTyxJQUFJLENBQUM7QUFDekQsTUFBSSxnQkFBZ0IsUUFBVztBQUM3QixXQUFPO0FBQUEsRUFDVDtBQUNBLFFBQU0sU0FBUywyQkFBMkIsS0FBSyxXQUFXLEdBQUcsU0FBUyxRQUFRO0FBQzlFLFNBQU8sV0FBVyxTQUFZLE9BQU8sT0FBTyxLQUFLLEVBQUUsUUFBUSw4Q0FBOEMsVUFBVTtBQUNySDtBQU1BLFNBQVMsdUJBQXVCLFNBQXdDO0FBQ3RFLFFBQU0sUUFBb0M7QUFBQSxJQUN4QyxvQkFBb0Isb0JBQUksSUFBWTtBQUFBLElBQ3BDLFlBQVk7QUFBQSxJQUNaLHNCQUFzQjtBQUFBLElBQ3RCLFVBQVUsQ0FBQztBQUFBLElBQ1gscUJBQXFCLElBQUksSUFBSSx3QkFBd0IsT0FBTyxDQUFDO0FBQUEsRUFDL0Q7QUFFQSxhQUFXLEVBQUUsT0FBTyxLQUFLLEtBQUssMEJBQTBCLE9BQU8sR0FBRztBQUNoRSxVQUFNLFFBQVEsa0JBQWtCLEtBQUssSUFBSTtBQUN6QyxRQUFJLE9BQU87QUFDVCw2QkFBdUIsT0FBTyxPQUFPLEtBQUs7QUFBQSxJQUM1QyxXQUFXLHdCQUF3QixLQUFLLElBQUksR0FBRztBQUM3QyxZQUFNLFNBQVMsS0FBSyw0QkFBNEIsaUJBQWlCLEtBQUssQ0FBQyxFQUFFO0FBQUEsSUFDM0UsT0FBTztBQUNMLDRCQUFzQixPQUFPLE9BQU8sSUFBSTtBQUFBLElBQzFDO0FBQUEsRUFDRjtBQUVBLE1BQUksTUFBTSxZQUFZO0FBQ3BCLFVBQU0sU0FBUyxLQUFLLHNCQUFzQixpQkFBaUIsTUFBTSxXQUFXLFNBQVMsQ0FBQyw4QkFBOEI7QUFBQSxFQUN0SDtBQUNBLE1BQUksTUFBTSx5QkFBeUIsTUFBTTtBQUN2QyxVQUFNLFNBQVMsS0FBSywwQkFBMEIsaUJBQWlCLE1BQU0sb0JBQW9CLENBQUMsdUJBQXVCO0FBQUEsRUFDbkg7QUFDQSxTQUFPLEVBQUUsb0JBQW9CLE1BQU0sb0JBQW9CLFVBQVUsTUFBTSxTQUFTO0FBQ2xGO0FBRUEsU0FBUyxpQkFBaUIsU0FBeUI7QUFDakQsU0FBTyxRQUFRLFFBQVEscUJBQXFCLEVBQUU7QUFDaEQ7QUFFQSxTQUFTLGdCQUFnQixNQUFzQjtBQUM3QyxTQUFPLEtBQUssV0FBVyxxQkFBcUIsRUFBRTtBQUNoRDtBQUlBLFNBQVMsc0JBQXNCLE9BQXVCO0FBQ3BELE1BQUk7QUFDRixXQUFPLG1CQUFtQixLQUFLO0FBQUEsRUFDakMsUUFBUTtBQUNOLFdBQU87QUFBQSxFQUNUO0FBQ0Y7IiwibmFtZXMiOltdfQ==
|
|
@@ -2,13 +2,7 @@
|
|
|
2
2
|
THIS IS A GENERATED/BUNDLED FILE BY ESBUILD
|
|
3
3
|
if you want to view the source, please visit the github repository of this plugin
|
|
4
4
|
*/
|
|
5
|
-
|
|
6
5
|
(function () {
|
|
7
|
-
function ensureDisposeSymbols(symbolConstructor = Symbol) {
|
|
8
|
-
symbolConstructor.asyncDispose ??= symbolConstructor.for("Symbol.asyncDispose");
|
|
9
|
-
symbolConstructor.dispose ??= symbolConstructor.for("Symbol.dispose");
|
|
10
|
-
}
|
|
11
|
-
|
|
12
6
|
function ensureBrowserProcess() {
|
|
13
7
|
const browserProcess = {
|
|
14
8
|
browser: true,
|
|
@@ -33,10 +27,7 @@ function ensureBrowserProcess() {
|
|
|
33
27
|
existingProcessRecord["browser"] = true;
|
|
34
28
|
}
|
|
35
29
|
|
|
36
|
-
(
|
|
37
|
-
ensureDisposeSymbols();
|
|
38
|
-
ensureBrowserProcess();
|
|
39
|
-
})();
|
|
30
|
+
ensureBrowserProcess();
|
|
40
31
|
})();
|
|
41
32
|
|
|
42
33
|
import {
|
|
@@ -127,7 +118,7 @@ function injectAppJson(params) {
|
|
|
127
118
|
async function injectDemoVaultHelper(demoedPluginId) {
|
|
128
119
|
const packageFolder = getRootFolder(getFolderName(import.meta.url));
|
|
129
120
|
if (!packageFolder) {
|
|
130
|
-
throw new Error("Could not resolve the obsidian-dev-
|
|
121
|
+
throw new Error("Could not resolve the @mnaoumov/obsidian-dev-toolkit package folder to inject the demo-vault-helper plugin.");
|
|
131
122
|
}
|
|
132
123
|
const helperSourcePath = join(packageFolder, ObsidianPluginRepoPaths.DistDemoVaultHelper);
|
|
133
124
|
const helperFolder = resolvePathFromRootSafe({
|
|
@@ -194,4 +185,4 @@ async function readDemoVaultEntries(params) {
|
|
|
194
185
|
export {
|
|
195
186
|
archivePluginDemoVault
|
|
196
187
|
};
|
|
197
|
-
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2RlbW8tdmF1bHQudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBBcmNoaXZlcyBhIHBsdWdpbidzIGRlbW8gdmF1bHQgYXMgYSByZWxlYXNlIGFydGlmYWN0LlxuICpcbiAqIEEgcGx1Z2luIGNhbiBzaGlwIGEgY3VyYXRlZCBkZW1vIHZhdWx0IGF0IGBkZW1vLXZhdWx0L2AgaW4gaXRzIHJlcG8gcm9vdC4gQXQgcmVsZWFzZSB0aW1lIHRoaXNcbiAqIG1vZHVsZSBpbnN0YWxscyB0aGUgZnJlc2hseSBidWlsdCBwbHVnaW4gaW50byB0aGF0IHZhdWx0J3MgYC5vYnNpZGlhbi9wbHVnaW5zLzxpZD4vYCBmb2xkZXIgYW5kXG4gKiB6aXBzIHRoZSB3aG9sZSB2YXVsdCBpbnRvIGBkaXN0L2J1aWxkLzxwbHVnaW4taWQ+LWRlbW8tdmF1bHQuemlwYCwgc28gdGhlIGV4aXN0aW5nIEdpdEh1Yi1yZWxlYXNlXG4gKiBzdGVwICh3aGljaCB1cGxvYWRzIGV2ZXJ5IGZpbGUgaW4gYGRpc3QvYnVpbGQvYCkgYXR0YWNoZXMgaXQgYXV0b21hdGljYWxseS5cbiAqXG4gKiBUaGUgdmVyc2lvbiBpcyBkZWxpYmVyYXRlbHkgYWJzZW50IGZyb20gdGhhdCBuYW1lIGFuZCBsaXZlcyBJTlNJREUgdGhlIGFyY2hpdmUgaW5zdGVhZCBcdTIwMTQgc2VlXG4gKiBgb2JzaWRpYW4vZGVtby12YXVsdC1uYW1pbmcudHNgIGZvciB3aHkgXHUyMDE0IGluIHRoZSB0d28gcGxhY2VzIGEgcGVyc29uIGFjdHVhbGx5IG1lZXRzIGl0OiB0aGUgdmF1bHRcbiAqIHNpdHMgdW5kZXIgYSBzaW5nbGUgYDxwbHVnaW4taWQ+LWRlbW8tdmF1bHQtPHZlcnNpb24+L2AgZm9sZGVyLCBzbyB1bnppcHBpbmcgc2V2ZXJhbCByZWxlYXNlcyBieSBoYW5kXG4gKiBpbnRvIG9uZSBmb2xkZXIgbmVpdGhlciBjb2xsaWRlcyBub3IgcHJvZHVjZXMgYW5vbnltb3VzIGRpcmVjdG9yaWVzLCBhbmQgdGhlIHZhdWx0J3MgYFJFQURNRS5tZGBcbiAqIGhlYWRpbmcgZ2FpbnMgdGhlIHZlcnNpb24gaXQgZGVtb25zdHJhdGVzLlxuICpcbiAqIFRoZSBhcmNoaXZlZCBjb3B5IGFsc28gY2FycmllcyB0aGUgYC5vYnNpZGlhbi9hcHAuanNvbmAgc2V0dGluZ3MgdGhpcyBwYWNrYWdlIG93bnMgKHNlZVxuICogYGRlbW8tdmF1bHQtYXBwLWpzb24udHNgKS4gVGhvc2Ugc2V0dGluZ3MgYW5kIHRoZSBSRUFETUUgaGVhZGluZyBhcmUgd3JpdHRlbiBpbnRvIHRoZSBaSVAgRU5UUlkgYW5kXG4gKiBuZXZlciBpbnRvIHRoZSByZXBvIGZvbGRlcjogYm90aCBmaWxlcyBhcmUgdHJhY2tlZCwgYW5kIGB1cGRhdGVWZXJzaW9uYCBhcmNoaXZlcyBhZnRlciBpdCBoYXMgYWxyZWFkeVxuICogcHVzaGVkLCBzbyBhbiBpbi1wbGFjZSB3cml0ZSB3b3VsZCBsZWF2ZSBhbiB1bmNvbW1pdHRlZCBjaGFuZ2UgYmVoaW5kIGEgcHVibGlzaGVkIHJlbGVhc2UuXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBEZW1vVmF1bHRIZWxwZXJTZXR0aW5ncyB9IGZyb20gJ0BtbmFvdW1vdi9vYnNpZGlhbi1saWIvZGVtby12YXVsdC1oZWxwZXItc2V0dGluZ3MnO1xuXG5pbXBvcnQge1xuICBnZXREZW1vVmF1bHRBcmNoaXZlRmlsZU5hbWUsXG4gIGdldERlbW9WYXVsdEZvbGRlck5hbWVcbn0gZnJvbSAnQG1uYW91bW92L29ic2lkaWFuLWxpYi9kZW1vLXZhdWx0LW5hbWluZyc7XG5pbXBvcnQgeyByZWFkZGlyUG9zaXggfSBmcm9tICdAbW5hb3Vtb3YvdHlwZXNjcmlwdC1kZXYtdG9vbGtpdC9mcyc7XG5pbXBvcnQge1xuICBnZXRSb290Rm9sZGVyLFxuICByZXNvbHZlUGF0aEZyb21Sb290U2FmZVxufSBmcm9tICdAbW5hb3Vtb3YvdHlwZXNjcmlwdC1kZXYtdG9vbGtpdC9yb290JztcbmltcG9ydCB7XG4gIGdldEZvbGRlck5hbWUsXG4gIGpvaW4sXG4gIHJlbGF0aXZlXG59IGZyb20gJ0BtbmFvdW1vdi90eXBlc2NyaXB0LWxpYi9wYXRoJztcbmltcG9ydCB7IHppcFN5bmMgfSBmcm9tICdmZmxhdGUnO1xuaW1wb3J0IHsgZXhpc3RzU3luYyB9IGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHtcbiAgY3AsXG4gIG1rZGlyLFxuICByZWFkRmlsZSxcbiAgd3JpdGVGaWxlXG59IGZyb20gJ25vZGU6ZnMvcHJvbWlzZXMnO1xuXG5pbXBvcnQgdHlwZSB7IERlbW9WYXVsdEFwcEpzb24gfSBmcm9tICcuL2RlbW8tdmF1bHQtYXBwLWpzb24udHMnO1xuXG5pbXBvcnQge1xuICBidWlsZEFyY2hpdmVkRGVtb1ZhdWx0QXBwSnNvbkNvbnRlbnQsXG4gIGZpbmRPd25lZERlbW9WYXVsdEFwcEpzb25TZXR0aW5ncyxcbiAgcGFyc2VEZW1vVmF1bHRBcHBKc29uXG59IGZyb20gJy4vZGVtby12YXVsdC1hcHAtanNvbi50cyc7XG5pbXBvcnQgeyBPYnNpZGlhblBsdWdpblJlcG9QYXRocyB9IGZyb20gJy4vb2JzaWRpYW4tcGx1Z2luLXJlcG8tcGF0aHMudHMnO1xuXG5jb25zdCBERU1PX1ZBVUxUX0hFTFBFUl9QTFVHSU5fSUQgPSAnZGVtby12YXVsdC1oZWxwZXInO1xuY29uc3QgREFUQV9KU09OX0ZJTEVfTkFNRSA9ICdkYXRhLmpzb24nO1xuY29uc3QgREFUQV9KU09OX0lOREVOVCA9IDI7XG5jb25zdCBSRUFETUVfRklMRV9OQU1FID0gJ1JFQURNRS5tZCc7XG5cbi8vIFRoZSBSRUFETUUncyBvcGVuaW5nIGAjIEgxYCwgYW5kIG9ubHkgdGhhdCBvbmU6IHdpdGhvdXQgdGhlIGBtYCBmbGFnIHRoZSBtYXRjaCBpcyBhbmNob3JlZCB0byB0aGUgc3RhcnRcbi8vIG9mIHRoZSBmaWxlLCBhbmQgYC5gIHN0b3BzIGF0IHRoZSBuZXdsaW5lIHRoYXQgZW5kcyB0aGUgbGluZS5cbmNvbnN0IE9QRU5JTkdfSEVBRElOR19SRUdfRVhQID0gL14jIC4qLztcblxuLyoqXG4gKiBUaGUgYXJjaGl2ZSdzIGVudHJpZXMsIGtleWVkIGJ5IHRoZSBuYW1lIGVhY2ggb25lIHRha2VzIGluc2lkZSB0aGUgWklQLlxuICpcbiAqIFRoZSB3aG9sZSBhcmNoaXZlIGlzIGFzc2VtYmxlZCBhcyB0aGlzIG1hcCBhbmQgc2VyaWFsaXplZCBvbmNlLCBzbyBpbmplY3RpbmcgYW4gZW50cnkgaXMgYW4gb3JkaW5hcnlcbiAqIGBzZXRgIHJhdGhlciB0aGFuIGEgbXV0YXRpb24gb2YgYSBoYWxmLWJ1aWx0IGFyY2hpdmUgb2JqZWN0LlxuICovXG50eXBlIERlbW9WYXVsdFppcEVudHJpZXMgPSBNYXA8c3RyaW5nLCBCdWZmZXI+O1xuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayBpbmplY3RBcHBKc29ufS5cbiAqL1xuaW50ZXJmYWNlIEluamVjdEFwcEpzb25QYXJhbXMge1xuICAvKipcbiAgICogVGhlIGNvbW1pdHRlZCBzZXR0aW5ncyB0aGUgb3duZWQgb25lcyBhcmUgbWVyZ2VkIG92ZXIuXG4gICAqL1xuICByZWFkb25seSBhcHBKc29uOiBEZW1vVmF1bHRBcHBKc29uO1xuXG4gIC8qKlxuICAgKiBUaGUgYXJjaGl2ZSdzIGVudHJpZXMsIGVkaXRlZCBpbiBwbGFjZS5cbiAgICovXG4gIHJlYWRvbmx5IGVudHJpZXM6IERlbW9WYXVsdFppcEVudHJpZXM7XG5cbiAgLyoqXG4gICAqIFRoZSBhcmNoaXZlJ3Mgc2luZ2xlIHRvcC1sZXZlbCBmb2xkZXIsIHdoaWNoIGV2ZXJ5IGVudHJ5IG5hbWUgaXMgcmVsYXRpdmUgdG8uXG4gICAqL1xuICByZWFkb25seSByb290Rm9sZGVyTmFtZTogc3RyaW5nO1xufVxuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayBpbmplY3RSZWFkbWVWZXJzaW9ufS5cbiAqL1xuaW50ZXJmYWNlIEluamVjdFJlYWRtZVZlcnNpb25QYXJhbXMge1xuICAvKipcbiAgICogVGhlIGFyY2hpdmUncyBlbnRyaWVzLCBlZGl0ZWQgaW4gcGxhY2UuXG4gICAqL1xuICByZWFkb25seSBlbnRyaWVzOiBEZW1vVmF1bHRaaXBFbnRyaWVzO1xuXG4gIC8qKlxuICAgKiBUaGUgYXJjaGl2ZSdzIHNpbmdsZSB0b3AtbGV2ZWwgZm9sZGVyLCB3aGljaCBldmVyeSBlbnRyeSBuYW1lIGlzIHJlbGF0aXZlIHRvLlxuICAgKi9cbiAgcmVhZG9ubHkgcm9vdEZvbGRlck5hbWU6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHBsdWdpbiB2ZXJzaW9uIHRoZSB2YXVsdCBkZW1vbnN0cmF0ZXMuXG4gICAqL1xuICByZWFkb25seSB2ZXJzaW9uOiBzdHJpbmc7XG59XG5cbi8qKlxuICogVGhlIG1pbmltYWwgc2hhcGUgb2YgYSBwbHVnaW4gYG1hbmlmZXN0Lmpzb25gIHJlYWQgYnkge0BsaW5rIGFyY2hpdmVQbHVnaW5EZW1vVmF1bHR9LlxuICovXG5pbnRlcmZhY2UgUGx1Z2luTWFuaWZlc3Qge1xuICAvKipcbiAgICogVGhlIHBsdWdpbiBpZCwgdXNlZCBhcyB0aGUgZm9sZGVyIG5hbWUgdW5kZXIgYGRlbW8tdmF1bHQvLm9ic2lkaWFuL3BsdWdpbnMvYC5cbiAgICovXG4gIHJlYWRvbmx5IGlkOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBwbHVnaW4gdmVyc2lvbiwgZW1iZWRkZWQgaW4gdGhlIGFyY2hpdmUncyB0b3AtbGV2ZWwgZm9sZGVyIG5hbWUgYW5kIGl0cyBSRUFETUUgaGVhZGluZy5cbiAgICovXG4gIHJlYWRvbmx5IHZlcnNpb246IHN0cmluZztcbn1cblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgcmVhZERlbW9WYXVsdEVudHJpZXN9LlxuICovXG5pbnRlcmZhY2UgUmVhZERlbW9WYXVsdEVudHJpZXNQYXJhbXMge1xuICAvKipcbiAgICogVGhlIHZhdWx0IGZvbGRlciB0byByZWFkLCBhcyBhbiBhYnNvbHV0ZSBwYXRoLlxuICAgKi9cbiAgcmVhZG9ubHkgZGVtb1ZhdWx0UGF0aDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgYXJjaGl2ZSdzIHNpbmdsZSB0b3AtbGV2ZWwgZm9sZGVyLCB3aGljaCBldmVyeSBlbnRyeSBuYW1lIGlzIHJlbGF0aXZlIHRvLlxuICAgKi9cbiAgcmVhZG9ubHkgcm9vdEZvbGRlck5hbWU6IHN0cmluZztcbn1cblxuLyoqXG4gKiBBcmNoaXZlcyB0aGUgcGx1Z2luJ3MgZGVtbyB2YXVsdCAoYGRlbW8tdmF1bHQvYCBpbiB0aGUgcmVwbyByb290KSBhcyBhIHJlbGVhc2UgYXJ0aWZhY3QuXG4gKlxuICogSW5zdGFsbHMgdGhlIGZyZXNobHkgYnVpbHQgcGx1Z2luIGZyb20gYGRpc3QvYnVpbGQvYCBpbnRvIHRoZSB2YXVsdCdzXG4gKiBgLm9ic2lkaWFuL3BsdWdpbnMvPGlkPi9gIGZvbGRlciwgdGhlbiB6aXBzIHRoZSB3aG9sZSB2YXVsdCB0b1xuICogYGRpc3QvYnVpbGQvPHBsdWdpbi1pZD4tZGVtby12YXVsdC56aXBgLCB1bmRlciBhIHNpbmdsZSBgPHBsdWdpbi1pZD4tZGVtby12YXVsdC08dmVyc2lvbj4vYCBmb2xkZXIuXG4gKlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB0byB0aGUgYWJzb2x1dGUgcGF0aCBvZiB0aGUgY3JlYXRlZCB6aXAgYXJjaGl2ZSwgb3JcbiAqIGBudWxsYCBpZiB0aGUgcmVwbyBoYXMgbm8gYGRlbW8tdmF1bHQvYCBmb2xkZXIuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBhcmNoaXZlUGx1Z2luRGVtb1ZhdWx0KCk6IFByb21pc2U8bnVsbCB8IHN0cmluZz4ge1xuICBjb25zdCBkZW1vVmF1bHRQYXRoID0gcmVzb2x2ZVBhdGhGcm9tUm9vdFNhZmUoeyBwYXRoOiBPYnNpZGlhblBsdWdpblJlcG9QYXRocy5EZW1vVmF1bHQgfSk7XG4gIGlmICghZXhpc3RzU3luYyhkZW1vVmF1bHRQYXRoKSkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgY29uc3QgbWFuaWZlc3RQYXRoID0gcmVzb2x2ZVBhdGhGcm9tUm9vdFNhZmUoeyBwYXRoOiBPYnNpZGlhblBsdWdpblJlcG9QYXRocy5NYW5pZmVzdEpzb24gfSk7XG4gIGNvbnN0IG1hbmlmZXN0ID0gSlNPTi5wYXJzZShhd2FpdCByZWFkRmlsZShtYW5pZmVzdFBhdGgsICd1dGYtOCcpKSBhcyBQbHVnaW5NYW5pZmVzdDtcblxuICBjb25zdCBwbHVnaW5Gb2xkZXIgPSByZXNvbHZlUGF0aEZyb21Sb290U2FmZSh7XG4gICAgcGF0aDogam9pbihcbiAgICAgIE9ic2lkaWFuUGx1Z2luUmVwb1BhdGhzLkRlbW9WYXVsdCxcbiAgICAgIE9ic2lkaWFuUGx1Z2luUmVwb1BhdGhzLkRvdE9ic2lkaWFuLFxuICAgICAgT2JzaWRpYW5QbHVnaW5SZXBvUGF0aHMuUGx1Z2lucyxcbiAgICAgIG1hbmlmZXN0LmlkXG4gICAgKVxuICB9KTtcbiAgYXdhaXQgbWtkaXIocGx1Z2luRm9sZGVyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcblxuICBjb25zdCBkaXN0QnVpbGRQYXRoID0gcmVzb2x2ZVBhdGhGcm9tUm9vdFNhZmUoeyBwYXRoOiBPYnNpZGlhblBsdWdpblJlcG9QYXRocy5EaXN0QnVpbGQgfSk7XG4gIGF3YWl0IGNwKGRpc3RCdWlsZFBhdGgsIHBsdWdpbkZvbGRlciwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG5cbiAgYXdhaXQgaW5qZWN0RGVtb1ZhdWx0SGVscGVyKG1hbmlmZXN0LmlkKTtcblxuICBjb25zdCB6aXBQYXRoID0gcmVzb2x2ZVBhdGhGcm9tUm9vdFNhZmUoe1xuICAgIHBhdGg6IGpvaW4oT2JzaWRpYW5QbHVnaW5SZXBvUGF0aHMuRGlzdEJ1aWxkLCBnZXREZW1vVmF1bHRBcmNoaXZlRmlsZU5hbWUobWFuaWZlc3QuaWQpKVxuICB9KTtcbiAgY29uc3Qgcm9vdEZvbGRlck5hbWUgPSBnZXREZW1vVmF1bHRGb2xkZXJOYW1lKHtcbiAgICBwbHVnaW5JZDogbWFuaWZlc3QuaWQsXG4gICAgdmVyc2lvbjogbWFuaWZlc3QudmVyc2lvblxuICB9KTtcbiAgY29uc3QgZW50cmllcyA9IGF3YWl0IHJlYWREZW1vVmF1bHRFbnRyaWVzKHtcbiAgICBkZW1vVmF1bHRQYXRoLFxuICAgIHJvb3RGb2xkZXJOYW1lXG4gIH0pO1xuICBpbmplY3RBcHBKc29uKHtcbiAgICBhcHBKc29uOiBhd2FpdCByZWFkQ29tbWl0dGVkQXBwSnNvbigpLFxuICAgIGVudHJpZXMsXG4gICAgcm9vdEZvbGRlck5hbWVcbiAgfSk7XG4gIGluamVjdFJlYWRtZVZlcnNpb24oe1xuICAgIGVudHJpZXMsXG4gICAgcm9vdEZvbGRlck5hbWUsXG4gICAgdmVyc2lvbjogbWFuaWZlc3QudmVyc2lvblxuICB9KTtcbiAgLy8gRXZlcnkgZW50cnkgaXMgc3RhbXBlZCB3aXRoIHRoZSBtb21lbnQgdGhlIGFyY2hpdmUgaXMgYnVpbHQgcmF0aGVyIHRoYW4gdGhlIGZpbGUncyBvd24gbXRpbWUsIHdoaWNoIGlzXG4gIC8vIHdoYXQgdGhlIHByZXZpb3VzIGFyY2hpdmVyIHdyb3RlLiBBIGRlbW8gdmF1bHQncyBjb21taXR0ZWQgdGltZXN0YW1wcyBhcmUgY2hlY2tvdXQgYXJ0aWZhY3RzIG9mIHdob2V2ZXJcbiAgLy8gcmFuIHRoZSByZWxlYXNlLCBzbyB0aGV5IGNhcnJ5IG5vdGhpbmcgYSByZWFkZXIgY291bGQgdXNlOyB0aGUgYnVpbGQgdGltZSBhdCBsZWFzdCBkZXNjcmliZXMgdGhlXG4gIC8vIGFyY2hpdmUuXG4gIGF3YWl0IHdyaXRlRmlsZSh6aXBQYXRoLCB6aXBTeW5jKE9iamVjdC5mcm9tRW50cmllcyhlbnRyaWVzKSkpO1xuICByZXR1cm4gemlwUGF0aDtcbn1cblxuLy8gU3RvcmVzIHRoZSBhcmNoaXZlZCB2YXVsdCdzIGAub2JzaWRpYW4vYXBwLmpzb25gIFx1MjAxNCB0aGUgY29tbWl0dGVkIHNldHRpbmdzIHdpdGggdGhlIG93bmVkIG9uZXMgbWVyZ2VkXG4vLyBvdmVyIHRoZW0uIFRoZSBFTlRSWSBpcyB3cml0dGVuIHJhdGhlciB0aGFuIHRoZSBmaWxlLCBzbyB0aGUgcmVwbyBmb2xkZXIgaXMgbGVmdCBleGFjdGx5IGFzIGl0IHdhcywgYW5kXG4vLyBBIHZhdWx0IHdpdGggbm90aGluZyBlbHNlIHRvIGNvbmZpZ3VyZSBcdTIwMTQgd2hpY2ggY29tbWl0cyBubyBgYXBwLmpzb25gIGF0IGFsbCBcdTIwMTQgZ2V0cyBvbmUgaGVyZSByZWdhcmRsZXNzLlxuZnVuY3Rpb24gaW5qZWN0QXBwSnNvbihwYXJhbXM6IEluamVjdEFwcEpzb25QYXJhbXMpOiB2b2lkIHtcbiAgY29uc3Qge1xuICAgIGFwcEpzb24sXG4gICAgZW50cmllcyxcbiAgICByb290Rm9sZGVyTmFtZVxuICB9ID0gcGFyYW1zO1xuXG4gIGNvbnN0IGVudHJ5TmFtZSA9IGpvaW4ocm9vdEZvbGRlck5hbWUsIE9ic2lkaWFuUGx1Z2luUmVwb1BhdGhzLkRvdE9ic2lkaWFuLCBPYnNpZGlhblBsdWdpblJlcG9QYXRocy5BcHBKc29uKTtcbiAgZW50cmllcy5zZXQoZW50cnlOYW1lLCBCdWZmZXIuZnJvbShidWlsZEFyY2hpdmVkRGVtb1ZhdWx0QXBwSnNvbkNvbnRlbnQoeyBhcHBKc29uIH0pLCAndXRmLTgnKSk7XG59XG5cbi8vIEluamVjdHMgdGhlIGJ1aWx0LCBgb2JzaWRpYW4tZGV2LXV0aWxzYC1vd25lZCBgZGVtby12YXVsdC1oZWxwZXJgIGJvb3RzdHJhcCBwbHVnaW4gKHNoaXBwZWQgaW4gdGhpcyBwYWNrYWdlKSBpbnRvIHRoZSBkZW1vIHZhdWx0LCBzbyBubyBwZXItdmF1bHQgY29weSBpcyBjb21taXR0ZWQgYW5kIGFuIGBvYnNpZGlhbi1kZXYtdXRpbHNgIGJ1bXAgcHJvcGFnYXRlcyBmaXhlcy5cbi8vXG4vLyBBbG9uZ3NpZGUgdGhlIGJpbmFyaWVzIGl0IHdyaXRlcyB0aGUgaGVscGVyJ3Mgb3duIGBkYXRhLmpzb25gIG5hbWluZyB0aGUgZGVtb25zdHJhdGVkIHBsdWdpbi4gVGhhdCBpc1xuLy8gdGhlIG9uZSBtb21lbnQgdGhlIGlkIGlzIGtub3duIGZvciBjZXJ0YWluIFx1MjAxNCBpdCBjb21lcyBmcm9tIHRoZSBwbHVnaW4ncyBvd24gbWFuaWZlc3QgXHUyMDE0IHdoZXJlYXMgdGhlXG4vLyBvcGVuZWQgdmF1bHQgb25seSBvZmZlcnMgcGx1Z2luIGZvbGRlcnMgdG8gY291bnQsIHdoaWNoIHRoZSBib290c3RyYXAgaXRzZWxmIGFkZHMgdG8gKHNlZVxuLy8gYERlbW9WYXVsdEhlbHBlclNldHRpbmdzYCkuXG5hc3luYyBmdW5jdGlvbiBpbmplY3REZW1vVmF1bHRIZWxwZXIoZGVtb2VkUGx1Z2luSWQ6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBwYWNrYWdlRm9sZGVyID0gZ2V0Um9vdEZvbGRlcihnZXRGb2xkZXJOYW1lKGltcG9ydC5tZXRhLnVybCkpO1xuICBpZiAoIXBhY2thZ2VGb2xkZXIpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0NvdWxkIG5vdCByZXNvbHZlIHRoZSBvYnNpZGlhbi1kZXYtdXRpbHMgcGFja2FnZSBmb2xkZXIgdG8gaW5qZWN0IHRoZSBkZW1vLXZhdWx0LWhlbHBlciBwbHVnaW4uJyk7XG4gIH1cblxuICBjb25zdCBoZWxwZXJTb3VyY2VQYXRoID0gam9pbihwYWNrYWdlRm9sZGVyLCBPYnNpZGlhblBsdWdpblJlcG9QYXRocy5EaXN0RGVtb1ZhdWx0SGVscGVyKTtcbiAgY29uc3QgaGVscGVyRm9sZGVyID0gcmVzb2x2ZVBhdGhGcm9tUm9vdFNhZmUoe1xuICAgIHBhdGg6IGpvaW4oXG4gICAgICBPYnNpZGlhblBsdWdpblJlcG9QYXRocy5EZW1vVmF1bHQsXG4gICAgICBPYnNpZGlhblBsdWdpblJlcG9QYXRocy5Eb3RPYnNpZGlhbixcbiAgICAgIE9ic2lkaWFuUGx1Z2luUmVwb1BhdGhzLlBsdWdpbnMsXG4gICAgICBERU1PX1ZBVUxUX0hFTFBFUl9QTFVHSU5fSURcbiAgICApXG4gIH0pO1xuICBhd2FpdCBta2RpcihoZWxwZXJGb2xkZXIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICBhd2FpdCBjcChoZWxwZXJTb3VyY2VQYXRoLCBoZWxwZXJGb2xkZXIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuXG4gIGNvbnN0IHNldHRpbmdzOiBEZW1vVmF1bHRIZWxwZXJTZXR0aW5ncyA9IHsgZGVtb2VkUGx1Z2luSWQgfTtcbiAgYXdhaXQgd3JpdGVGaWxlKGpvaW4oaGVscGVyRm9sZGVyLCBEQVRBX0pTT05fRklMRV9OQU1FKSwgYCR7SlNPTi5zdHJpbmdpZnkoc2V0dGluZ3MsIG51bGwsIERBVEFfSlNPTl9JTkRFTlQpfVxcbmAsICd1dGYtOCcpO1xufVxuXG4vLyBOYW1lcyB0aGUgdmVyc2lvbiBvbiB0aGUgYXJjaGl2ZWQgYFJFQURNRS5tZGAncyBoZWFkaW5nLCBzbyB0aGUgdmF1bHQgc2F5cyB3aGljaCByZWxlYXNlIGl0IGRlbW9uc3RyYXRlc1xuLy8gaG93ZXZlciBmYXIgaXQgdHJhdmVscyBmcm9tIHRoZSByZWxlYXNlIHBhZ2UgaXQgd2FzIGRvd25sb2FkZWQgZnJvbS5cbi8vXG4vLyBFbnRyeS1vbmx5LCBmb3IgdGhlIHNhbWUgcmVhc29uIGBpbmplY3RBcHBKc29uYCBpczogdGhlIGNvbW1pdHRlZCBSRUFETUUgaXMgYSB0cmFja2VkLCBoYW5kLWF1dGhvcmVkXG4vLyBmaWxlIGFuZCBgdXBkYXRlVmVyc2lvbmAgYXJjaGl2ZXMgYWZ0ZXIgaXQgaGFzIGFscmVhZHkgcHVzaGVkLlxuLy9cbi8vIEEgdmF1bHQgdGhhdCBzaGlwcyBubyBSRUFETUUsIG9yIG9uZSBvcGVuaW5nIG9uIHNvbWV0aGluZyBvdGhlciB0aGFuIGFuIGAjIEgxYCwgaXMgbGVmdCBhbG9uZSByYXRoZXJcbi8vIHRoYW4gY29ycmVjdGVkLiBUaGUgZGVtby12YXVsdCBjb3ZlcmFnZSBzdWl0ZSBleGVtcHRzIGBSRUFETUUubWRgIGZyb20gaXRzIEgxIGNoZWNrLCBzbyBuZWl0aGVyIHNoYXBlXG4vLyBpcyBhIGRlZmVjdCBcdTIwMTQgYW5kIGEgcmVsZWFzZSBpcyB0aGUgd3JvbmcgbW9tZW50IHRvIHN0YXJ0IGZhaWxpbmcgb24gb25lLlxuZnVuY3Rpb24gaW5qZWN0UmVhZG1lVmVyc2lvbihwYXJhbXM6IEluamVjdFJlYWRtZVZlcnNpb25QYXJhbXMpOiB2b2lkIHtcbiAgY29uc3Qge1xuICAgIGVudHJpZXMsXG4gICAgcm9vdEZvbGRlck5hbWUsXG4gICAgdmVyc2lvblxuICB9ID0gcGFyYW1zO1xuXG4gIGNvbnN0IGVudHJ5TmFtZSA9IGpvaW4ocm9vdEZvbGRlck5hbWUsIFJFQURNRV9GSUxFX05BTUUpO1xuICBjb25zdCBlbnRyeSA9IGVudHJpZXMuZ2V0KGVudHJ5TmFtZSk7XG4gIGlmICghZW50cnkpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBjb250ZW50ID0gZW50cnkudG9TdHJpbmcoJ3V0Zi04Jyk7XG4gIGNvbnN0IHZlcnNpb25lZENvbnRlbnQgPSBjb250ZW50LnJlcGxhY2UoT1BFTklOR19IRUFESU5HX1JFR19FWFAsIChoZWFkaW5nKSA9PiBgJHtoZWFkaW5nfSB2JHt2ZXJzaW9ufWApO1xuICBpZiAodmVyc2lvbmVkQ29udGVudCA9PT0gY29udGVudCkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGVudHJpZXMuc2V0KGVudHJ5TmFtZSwgQnVmZmVyLmZyb20odmVyc2lvbmVkQ29udGVudCwgJ3V0Zi04JykpO1xufVxuXG4vLyBSZWFkcyB0aGUgZGVtbyB2YXVsdCdzIGNvbW1pdHRlZCBgLm9ic2lkaWFuL2FwcC5qc29uYCwgcmVmdXNpbmcgdGhlIHNldHRpbmdzIHRoaXMgcGFja2FnZSBvd25zLlxuLy9cbi8vIFRob3NlIHNldHRpbmdzIGFyZSBpbmplY3RlZCBpbnRvIHRoZSBhcmNoaXZlLCBzbyBhIGNvbW1pdHRlZCBvbmUgaXMgYSBzZWNvbmQgc291cmNlIG9mIHRydXRoIHRoYXRcbi8vIG5vdGhpbmcga2VlcHMgaW4gc3RlcC4gVGhlIGRlbW8tdmF1bHQgY292ZXJhZ2Ugc3VpdGUgYWxyZWFkeSBmYWlscyBvbiBpdCwgd2hpY2ggbWVhbnMgcmVhY2hpbmcgaGVyZVxuLy8gbWVhbnMgdGhhdCBnYXRlIHdhcyBza2lwcGVkIFx1MjAxNCBzbyB0aGlzIHJlZnVzZXMgcmF0aGVyIHRoYW4gb3ZlcndyaXRpbmcgYSB2YWx1ZSBzb21lYm9keSBjaG9zZSBvbiBwdXJwb3NlLlxuYXN5bmMgZnVuY3Rpb24gcmVhZENvbW1pdHRlZEFwcEpzb24oKTogUHJvbWlzZTxEZW1vVmF1bHRBcHBKc29uPiB7XG4gIGNvbnN0IGFwcEpzb25QYXRoID0gcmVzb2x2ZVBhdGhGcm9tUm9vdFNhZmUoe1xuICAgIHBhdGg6IGpvaW4oT2JzaWRpYW5QbHVnaW5SZXBvUGF0aHMuRGVtb1ZhdWx0LCBPYnNpZGlhblBsdWdpblJlcG9QYXRocy5Eb3RPYnNpZGlhbiwgT2JzaWRpYW5QbHVnaW5SZXBvUGF0aHMuQXBwSnNvbilcbiAgfSk7XG4gIGNvbnN0IGNvbnRlbnQgPSBleGlzdHNTeW5jKGFwcEpzb25QYXRoKSA/IGF3YWl0IHJlYWRGaWxlKGFwcEpzb25QYXRoLCAndXRmLTgnKSA6IG51bGw7XG4gIGNvbnN0IGFwcEpzb24gPSBwYXJzZURlbW9WYXVsdEFwcEpzb24oeyBjb250ZW50LCBwYXRoOiBhcHBKc29uUGF0aCB9KTtcblxuICBjb25zdCBvd25lZFNldHRpbmdzID0gZmluZE93bmVkRGVtb1ZhdWx0QXBwSnNvblNldHRpbmdzKHsgYXBwSnNvbiB9KTtcbiAgaWYgKG93bmVkU2V0dGluZ3MubGVuZ3RoID4gMCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGAke2FwcEpzb25QYXRofSBzZXRzICR7b3duZWRTZXR0aW5ncy5qb2luKCcsICcpfSwgd2hpY2ggb2JzaWRpYW4tZGV2LXV0aWxzIG93bnMgYW5kIHdyaXRlcyBpbnRvIHRoZSBhcmNoaXZlZCBkZW1vIHZhdWx0LiBTZXR0aW5ncyBpdCBvd25zIG11c3Qgbm90IGJlIGNvbW1pdHRlZC5gXG4gICAgKTtcbiAgfVxuXG4gIHJldHVybiBhcHBKc29uO1xufVxuXG4vLyBSZWFkcyBldmVyeSBmaWxlIGluIHRoZSBkZW1vIHZhdWx0IGFzIGFuIGFyY2hpdmUgZW50cnksIHVuZGVyIHRoZSBzaW5nbGUgdG9wLWxldmVsIGZvbGRlciB0aGUgYXJjaGl2ZVxuLy8gc2l0cyBpbi5cbi8vXG4vLyBPbmx5IEZJTEVTIGJlY29tZSBlbnRyaWVzLiBHaXQgY2Fubm90IHRyYWNrIGFuIGVtcHR5IGZvbGRlciwgc28gYSBjb21taXR0ZWQgZGVtbyB2YXVsdCBoYXMgbm9uZSBcdTIwMTQgYW5kXG4vLyBgZXh0cmFjdFppcEFyY2hpdmVgIGNyZWF0ZXMgYW4gZW50cnkncyBwYXJlbnQgZm9sZGVycyB3aGV0aGVyIG9yIG5vdCB0aGUgYXJjaGl2ZSBkZWNsYXJlZCB0aGVtLCBzbyBhXG4vLyBmb2xkZXIgZW50cnkgd291bGQgZWFybiBub3RoaW5nIGV2ZW4gaWYgb25lIGNvdWxkIGV4aXN0LlxuYXN5bmMgZnVuY3Rpb24gcmVhZERlbW9WYXVsdEVudHJpZXMocGFyYW1zOiBSZWFkRGVtb1ZhdWx0RW50cmllc1BhcmFtcyk6IFByb21pc2U8RGVtb1ZhdWx0WmlwRW50cmllcz4ge1xuICBjb25zdCB7XG4gICAgZGVtb1ZhdWx0UGF0aCxcbiAgICByb290Rm9sZGVyTmFtZVxuICB9ID0gcGFyYW1zO1xuXG4gIGNvbnN0IGVudHJpZXM6IERlbW9WYXVsdFppcEVudHJpZXMgPSBuZXcgTWFwPHN0cmluZywgQnVmZmVyPigpO1xuICBmb3IgKGNvbnN0IGRpcmVudCBvZiBhd2FpdCByZWFkZGlyUG9zaXgoZGVtb1ZhdWx0UGF0aCwgeyByZWN1cnNpdmU6IHRydWUsIHdpdGhGaWxlVHlwZXM6IHRydWUgfSkpIHtcbiAgICBpZiAoIWRpcmVudC5pc0ZpbGUoKSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgY29uc3QgcGF0aCA9IGpvaW4oZGlyZW50LnBhcmVudFBhdGgsIGRpcmVudC5uYW1lKTtcbiAgICBlbnRyaWVzLnNldChqb2luKHJvb3RGb2xkZXJOYW1lLCByZWxhdGl2ZShkZW1vVmF1bHRQYXRoLCBwYXRoKSksIGF3YWl0IHJlYWRGaWxlKHBhdGgpKTtcbiAgfVxuXG4gIHJldHVybiBlbnRyaWVzO1xufVxuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUF3QkE7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLE9BQ0s7QUFDUCxTQUFTLG9CQUFvQjtBQUM3QjtBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsT0FDSztBQUNQO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsT0FDSztBQUNQLFNBQVMsZUFBZTtBQUN4QixTQUFTLGtCQUFrQjtBQUMzQjtBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBSVA7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBQ1AsU0FBUywrQkFBK0I7QUFFeEMsTUFBTSw4QkFBOEI7QUFDcEMsTUFBTSxzQkFBc0I7QUFDNUIsTUFBTSxtQkFBbUI7QUFDekIsTUFBTSxtQkFBbUI7QUFJekIsTUFBTSwwQkFBMEI7QUEwRmhDLGVBQXNCLHlCQUFpRDtBQUNyRSxRQUFNLGdCQUFnQix3QkFBd0IsRUFBRSxNQUFNLHdCQUF3QixVQUFVLENBQUM7QUFDekYsTUFBSSxDQUFDLFdBQVcsYUFBYSxHQUFHO0FBQzlCLFdBQU87QUFBQSxFQUNUO0FBRUEsUUFBTSxlQUFlLHdCQUF3QixFQUFFLE1BQU0sd0JBQXdCLGFBQWEsQ0FBQztBQUMzRixRQUFNLFdBQVcsS0FBSyxNQUFNLE1BQU0sU0FBUyxjQUFjLE9BQU8sQ0FBQztBQUVqRSxRQUFNLGVBQWUsd0JBQXdCO0FBQUEsSUFDM0MsTUFBTTtBQUFBLE1BQ0osd0JBQXdCO0FBQUEsTUFDeEIsd0JBQXdCO0FBQUEsTUFDeEIsd0JBQXdCO0FBQUEsTUFDeEIsU0FBUztBQUFBLElBQ1g7QUFBQSxFQUNGLENBQUM7QUFDRCxRQUFNLE1BQU0sY0FBYyxFQUFFLFdBQVcsS0FBSyxDQUFDO0FB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
|
|
188
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9kZW1vLXZhdWx0LnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBBcmNoaXZlcyBhIHBsdWdpbidzIGRlbW8gdmF1bHQgYXMgYSByZWxlYXNlIGFydGlmYWN0LlxuICpcbiAqIEEgcGx1Z2luIGNhbiBzaGlwIGEgY3VyYXRlZCBkZW1vIHZhdWx0IGF0IGBkZW1vLXZhdWx0L2AgaW4gaXRzIHJlcG8gcm9vdC4gQXQgcmVsZWFzZSB0aW1lIHRoaXNcbiAqIG1vZHVsZSBpbnN0YWxscyB0aGUgZnJlc2hseSBidWlsdCBwbHVnaW4gaW50byB0aGF0IHZhdWx0J3MgYC5vYnNpZGlhbi9wbHVnaW5zLzxpZD4vYCBmb2xkZXIgYW5kXG4gKiB6aXBzIHRoZSB3aG9sZSB2YXVsdCBpbnRvIGBkaXN0L2J1aWxkLzxwbHVnaW4taWQ+LWRlbW8tdmF1bHQuemlwYCwgc28gdGhlIGV4aXN0aW5nIEdpdEh1Yi1yZWxlYXNlXG4gKiBzdGVwICh3aGljaCB1cGxvYWRzIGV2ZXJ5IGZpbGUgaW4gYGRpc3QvYnVpbGQvYCkgYXR0YWNoZXMgaXQgYXV0b21hdGljYWxseS5cbiAqXG4gKiBUaGUgdmVyc2lvbiBpcyBkZWxpYmVyYXRlbHkgYWJzZW50IGZyb20gdGhhdCBuYW1lIGFuZCBsaXZlcyBJTlNJREUgdGhlIGFyY2hpdmUgaW5zdGVhZCDigJQgc2VlXG4gKiBgb2JzaWRpYW4vZGVtby12YXVsdC1uYW1pbmcudHNgIGZvciB3aHkg4oCUIGluIHRoZSB0d28gcGxhY2VzIGEgcGVyc29uIGFjdHVhbGx5IG1lZXRzIGl0OiB0aGUgdmF1bHRcbiAqIHNpdHMgdW5kZXIgYSBzaW5nbGUgYDxwbHVnaW4taWQ+LWRlbW8tdmF1bHQtPHZlcnNpb24+L2AgZm9sZGVyLCBzbyB1bnppcHBpbmcgc2V2ZXJhbCByZWxlYXNlcyBieSBoYW5kXG4gKiBpbnRvIG9uZSBmb2xkZXIgbmVpdGhlciBjb2xsaWRlcyBub3IgcHJvZHVjZXMgYW5vbnltb3VzIGRpcmVjdG9yaWVzLCBhbmQgdGhlIHZhdWx0J3MgYFJFQURNRS5tZGBcbiAqIGhlYWRpbmcgZ2FpbnMgdGhlIHZlcnNpb24gaXQgZGVtb25zdHJhdGVzLlxuICpcbiAqIFRoZSBhcmNoaXZlZCBjb3B5IGFsc28gY2FycmllcyB0aGUgYC5vYnNpZGlhbi9hcHAuanNvbmAgc2V0dGluZ3MgdGhpcyBwYWNrYWdlIG93bnMgKHNlZVxuICogYGRlbW8tdmF1bHQtYXBwLWpzb24udHNgKS4gVGhvc2Ugc2V0dGluZ3MgYW5kIHRoZSBSRUFETUUgaGVhZGluZyBhcmUgd3JpdHRlbiBpbnRvIHRoZSBaSVAgRU5UUlkgYW5kXG4gKiBuZXZlciBpbnRvIHRoZSByZXBvIGZvbGRlcjogYm90aCBmaWxlcyBhcmUgdHJhY2tlZCwgYW5kIGB1cGRhdGVWZXJzaW9uYCBhcmNoaXZlcyBhZnRlciBpdCBoYXMgYWxyZWFkeVxuICogcHVzaGVkLCBzbyBhbiBpbi1wbGFjZSB3cml0ZSB3b3VsZCBsZWF2ZSBhbiB1bmNvbW1pdHRlZCBjaGFuZ2UgYmVoaW5kIGEgcHVibGlzaGVkIHJlbGVhc2UuXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBEZW1vVmF1bHRIZWxwZXJTZXR0aW5ncyB9IGZyb20gJ0BtbmFvdW1vdi9vYnNpZGlhbi1saWIvZGVtby12YXVsdC1oZWxwZXItc2V0dGluZ3MnO1xuXG5pbXBvcnQge1xuICBnZXREZW1vVmF1bHRBcmNoaXZlRmlsZU5hbWUsXG4gIGdldERlbW9WYXVsdEZvbGRlck5hbWVcbn0gZnJvbSAnQG1uYW91bW92L29ic2lkaWFuLWxpYi9kZW1vLXZhdWx0LW5hbWluZyc7XG5pbXBvcnQgeyByZWFkZGlyUG9zaXggfSBmcm9tICdAbW5hb3Vtb3YvdHlwZXNjcmlwdC1kZXYtdG9vbGtpdC9mcyc7XG5pbXBvcnQge1xuICBnZXRSb290Rm9sZGVyLFxuICByZXNvbHZlUGF0aEZyb21Sb290U2FmZVxufSBmcm9tICdAbW5hb3Vtb3YvdHlwZXNjcmlwdC1kZXYtdG9vbGtpdC9yb290JztcbmltcG9ydCB7XG4gIGdldEZvbGRlck5hbWUsXG4gIGpvaW4sXG4gIHJlbGF0aXZlXG59IGZyb20gJ0BtbmFvdW1vdi90eXBlc2NyaXB0LWxpYi9wYXRoJztcbmltcG9ydCB7IHppcFN5bmMgfSBmcm9tICdmZmxhdGUnO1xuaW1wb3J0IHsgZXhpc3RzU3luYyB9IGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHtcbiAgY3AsXG4gIG1rZGlyLFxuICByZWFkRmlsZSxcbiAgd3JpdGVGaWxlXG59IGZyb20gJ25vZGU6ZnMvcHJvbWlzZXMnO1xuXG5pbXBvcnQgdHlwZSB7IERlbW9WYXVsdEFwcEpzb24gfSBmcm9tICcuL2RlbW8tdmF1bHQtYXBwLWpzb24udHMnO1xuXG5pbXBvcnQge1xuICBidWlsZEFyY2hpdmVkRGVtb1ZhdWx0QXBwSnNvbkNvbnRlbnQsXG4gIGZpbmRPd25lZERlbW9WYXVsdEFwcEpzb25TZXR0aW5ncyxcbiAgcGFyc2VEZW1vVmF1bHRBcHBKc29uXG59IGZyb20gJy4vZGVtby12YXVsdC1hcHAtanNvbi50cyc7XG5pbXBvcnQgeyBPYnNpZGlhblBsdWdpblJlcG9QYXRocyB9IGZyb20gJy4vb2JzaWRpYW4tcGx1Z2luLXJlcG8tcGF0aHMudHMnO1xuXG5jb25zdCBERU1PX1ZBVUxUX0hFTFBFUl9QTFVHSU5fSUQgPSAnZGVtby12YXVsdC1oZWxwZXInO1xuY29uc3QgREFUQV9KU09OX0ZJTEVfTkFNRSA9ICdkYXRhLmpzb24nO1xuY29uc3QgREFUQV9KU09OX0lOREVOVCA9IDI7XG5jb25zdCBSRUFETUVfRklMRV9OQU1FID0gJ1JFQURNRS5tZCc7XG5cbi8vIFRoZSBSRUFETUUncyBvcGVuaW5nIGAjIEgxYCwgYW5kIG9ubHkgdGhhdCBvbmU6IHdpdGhvdXQgdGhlIGBtYCBmbGFnIHRoZSBtYXRjaCBpcyBhbmNob3JlZCB0byB0aGUgc3RhcnRcbi8vIG9mIHRoZSBmaWxlLCBhbmQgYC5gIHN0b3BzIGF0IHRoZSBuZXdsaW5lIHRoYXQgZW5kcyB0aGUgbGluZS5cbmNvbnN0IE9QRU5JTkdfSEVBRElOR19SRUdfRVhQID0gL14jIC4qLztcblxuLyoqXG4gKiBUaGUgYXJjaGl2ZSdzIGVudHJpZXMsIGtleWVkIGJ5IHRoZSBuYW1lIGVhY2ggb25lIHRha2VzIGluc2lkZSB0aGUgWklQLlxuICpcbiAqIFRoZSB3aG9sZSBhcmNoaXZlIGlzIGFzc2VtYmxlZCBhcyB0aGlzIG1hcCBhbmQgc2VyaWFsaXplZCBvbmNlLCBzbyBpbmplY3RpbmcgYW4gZW50cnkgaXMgYW4gb3JkaW5hcnlcbiAqIGBzZXRgIHJhdGhlciB0aGFuIGEgbXV0YXRpb24gb2YgYSBoYWxmLWJ1aWx0IGFyY2hpdmUgb2JqZWN0LlxuICovXG50eXBlIERlbW9WYXVsdFppcEVudHJpZXMgPSBNYXA8c3RyaW5nLCBCdWZmZXI+O1xuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayBpbmplY3RBcHBKc29ufS5cbiAqL1xuaW50ZXJmYWNlIEluamVjdEFwcEpzb25QYXJhbXMge1xuICAvKipcbiAgICogVGhlIGNvbW1pdHRlZCBzZXR0aW5ncyB0aGUgb3duZWQgb25lcyBhcmUgbWVyZ2VkIG92ZXIuXG4gICAqL1xuICByZWFkb25seSBhcHBKc29uOiBEZW1vVmF1bHRBcHBKc29uO1xuXG4gIC8qKlxuICAgKiBUaGUgYXJjaGl2ZSdzIGVudHJpZXMsIGVkaXRlZCBpbiBwbGFjZS5cbiAgICovXG4gIHJlYWRvbmx5IGVudHJpZXM6IERlbW9WYXVsdFppcEVudHJpZXM7XG5cbiAgLyoqXG4gICAqIFRoZSBhcmNoaXZlJ3Mgc2luZ2xlIHRvcC1sZXZlbCBmb2xkZXIsIHdoaWNoIGV2ZXJ5IGVudHJ5IG5hbWUgaXMgcmVsYXRpdmUgdG8uXG4gICAqL1xuICByZWFkb25seSByb290Rm9sZGVyTmFtZTogc3RyaW5nO1xufVxuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayBpbmplY3RSZWFkbWVWZXJzaW9ufS5cbiAqL1xuaW50ZXJmYWNlIEluamVjdFJlYWRtZVZlcnNpb25QYXJhbXMge1xuICAvKipcbiAgICogVGhlIGFyY2hpdmUncyBlbnRyaWVzLCBlZGl0ZWQgaW4gcGxhY2UuXG4gICAqL1xuICByZWFkb25seSBlbnRyaWVzOiBEZW1vVmF1bHRaaXBFbnRyaWVzO1xuXG4gIC8qKlxuICAgKiBUaGUgYXJjaGl2ZSdzIHNpbmdsZSB0b3AtbGV2ZWwgZm9sZGVyLCB3aGljaCBldmVyeSBlbnRyeSBuYW1lIGlzIHJlbGF0aXZlIHRvLlxuICAgKi9cbiAgcmVhZG9ubHkgcm9vdEZvbGRlck5hbWU6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHBsdWdpbiB2ZXJzaW9uIHRoZSB2YXVsdCBkZW1vbnN0cmF0ZXMuXG4gICAqL1xuICByZWFkb25seSB2ZXJzaW9uOiBzdHJpbmc7XG59XG5cbi8qKlxuICogVGhlIG1pbmltYWwgc2hhcGUgb2YgYSBwbHVnaW4gYG1hbmlmZXN0Lmpzb25gIHJlYWQgYnkge0BsaW5rIGFyY2hpdmVQbHVnaW5EZW1vVmF1bHR9LlxuICovXG5pbnRlcmZhY2UgUGx1Z2luTWFuaWZlc3Qge1xuICAvKipcbiAgICogVGhlIHBsdWdpbiBpZCwgdXNlZCBhcyB0aGUgZm9sZGVyIG5hbWUgdW5kZXIgYGRlbW8tdmF1bHQvLm9ic2lkaWFuL3BsdWdpbnMvYC5cbiAgICovXG4gIHJlYWRvbmx5IGlkOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBwbHVnaW4gdmVyc2lvbiwgZW1iZWRkZWQgaW4gdGhlIGFyY2hpdmUncyB0b3AtbGV2ZWwgZm9sZGVyIG5hbWUgYW5kIGl0cyBSRUFETUUgaGVhZGluZy5cbiAgICovXG4gIHJlYWRvbmx5IHZlcnNpb246IHN0cmluZztcbn1cblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgcmVhZERlbW9WYXVsdEVudHJpZXN9LlxuICovXG5pbnRlcmZhY2UgUmVhZERlbW9WYXVsdEVudHJpZXNQYXJhbXMge1xuICAvKipcbiAgICogVGhlIHZhdWx0IGZvbGRlciB0byByZWFkLCBhcyBhbiBhYnNvbHV0ZSBwYXRoLlxuICAgKi9cbiAgcmVhZG9ubHkgZGVtb1ZhdWx0UGF0aDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgYXJjaGl2ZSdzIHNpbmdsZSB0b3AtbGV2ZWwgZm9sZGVyLCB3aGljaCBldmVyeSBlbnRyeSBuYW1lIGlzIHJlbGF0aXZlIHRvLlxuICAgKi9cbiAgcmVhZG9ubHkgcm9vdEZvbGRlck5hbWU6IHN0cmluZztcbn1cblxuLyoqXG4gKiBBcmNoaXZlcyB0aGUgcGx1Z2luJ3MgZGVtbyB2YXVsdCAoYGRlbW8tdmF1bHQvYCBpbiB0aGUgcmVwbyByb290KSBhcyBhIHJlbGVhc2UgYXJ0aWZhY3QuXG4gKlxuICogSW5zdGFsbHMgdGhlIGZyZXNobHkgYnVpbHQgcGx1Z2luIGZyb20gYGRpc3QvYnVpbGQvYCBpbnRvIHRoZSB2YXVsdCdzXG4gKiBgLm9ic2lkaWFuL3BsdWdpbnMvPGlkPi9gIGZvbGRlciwgdGhlbiB6aXBzIHRoZSB3aG9sZSB2YXVsdCB0b1xuICogYGRpc3QvYnVpbGQvPHBsdWdpbi1pZD4tZGVtby12YXVsdC56aXBgLCB1bmRlciBhIHNpbmdsZSBgPHBsdWdpbi1pZD4tZGVtby12YXVsdC08dmVyc2lvbj4vYCBmb2xkZXIuXG4gKlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB0byB0aGUgYWJzb2x1dGUgcGF0aCBvZiB0aGUgY3JlYXRlZCB6aXAgYXJjaGl2ZSwgb3JcbiAqIGBudWxsYCBpZiB0aGUgcmVwbyBoYXMgbm8gYGRlbW8tdmF1bHQvYCBmb2xkZXIuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBhcmNoaXZlUGx1Z2luRGVtb1ZhdWx0KCk6IFByb21pc2U8bnVsbCB8IHN0cmluZz4ge1xuICBjb25zdCBkZW1vVmF1bHRQYXRoID0gcmVzb2x2ZVBhdGhGcm9tUm9vdFNhZmUoeyBwYXRoOiBPYnNpZGlhblBsdWdpblJlcG9QYXRocy5EZW1vVmF1bHQgfSk7XG4gIGlmICghZXhpc3RzU3luYyhkZW1vVmF1bHRQYXRoKSkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgY29uc3QgbWFuaWZlc3RQYXRoID0gcmVzb2x2ZVBhdGhGcm9tUm9vdFNhZmUoeyBwYXRoOiBPYnNpZGlhblBsdWdpblJlcG9QYXRocy5NYW5pZmVzdEpzb24gfSk7XG4gIGNvbnN0IG1hbmlmZXN0ID0gSlNPTi5wYXJzZShhd2FpdCByZWFkRmlsZShtYW5pZmVzdFBhdGgsICd1dGYtOCcpKSBhcyBQbHVnaW5NYW5pZmVzdDtcblxuICBjb25zdCBwbHVnaW5Gb2xkZXIgPSByZXNvbHZlUGF0aEZyb21Sb290U2FmZSh7XG4gICAgcGF0aDogam9pbihcbiAgICAgIE9ic2lkaWFuUGx1Z2luUmVwb1BhdGhzLkRlbW9WYXVsdCxcbiAgICAgIE9ic2lkaWFuUGx1Z2luUmVwb1BhdGhzLkRvdE9ic2lkaWFuLFxuICAgICAgT2JzaWRpYW5QbHVnaW5SZXBvUGF0aHMuUGx1Z2lucyxcbiAgICAgIG1hbmlmZXN0LmlkXG4gICAgKVxuICB9KTtcbiAgYXdhaXQgbWtkaXIocGx1Z2luRm9sZGVyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcblxuICBjb25zdCBkaXN0QnVpbGRQYXRoID0gcmVzb2x2ZVBhdGhGcm9tUm9vdFNhZmUoeyBwYXRoOiBPYnNpZGlhblBsdWdpblJlcG9QYXRocy5EaXN0QnVpbGQgfSk7XG4gIGF3YWl0IGNwKGRpc3RCdWlsZFBhdGgsIHBsdWdpbkZvbGRlciwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG5cbiAgYXdhaXQgaW5qZWN0RGVtb1ZhdWx0SGVscGVyKG1hbmlmZXN0LmlkKTtcblxuICBjb25zdCB6aXBQYXRoID0gcmVzb2x2ZVBhdGhGcm9tUm9vdFNhZmUoe1xuICAgIHBhdGg6IGpvaW4oT2JzaWRpYW5QbHVnaW5SZXBvUGF0aHMuRGlzdEJ1aWxkLCBnZXREZW1vVmF1bHRBcmNoaXZlRmlsZU5hbWUobWFuaWZlc3QuaWQpKVxuICB9KTtcbiAgY29uc3Qgcm9vdEZvbGRlck5hbWUgPSBnZXREZW1vVmF1bHRGb2xkZXJOYW1lKHtcbiAgICBwbHVnaW5JZDogbWFuaWZlc3QuaWQsXG4gICAgdmVyc2lvbjogbWFuaWZlc3QudmVyc2lvblxuICB9KTtcbiAgY29uc3QgZW50cmllcyA9IGF3YWl0IHJlYWREZW1vVmF1bHRFbnRyaWVzKHtcbiAgICBkZW1vVmF1bHRQYXRoLFxuICAgIHJvb3RGb2xkZXJOYW1lXG4gIH0pO1xuICBpbmplY3RBcHBKc29uKHtcbiAgICBhcHBKc29uOiBhd2FpdCByZWFkQ29tbWl0dGVkQXBwSnNvbigpLFxuICAgIGVudHJpZXMsXG4gICAgcm9vdEZvbGRlck5hbWVcbiAgfSk7XG4gIGluamVjdFJlYWRtZVZlcnNpb24oe1xuICAgIGVudHJpZXMsXG4gICAgcm9vdEZvbGRlck5hbWUsXG4gICAgdmVyc2lvbjogbWFuaWZlc3QudmVyc2lvblxuICB9KTtcbiAgLy8gRXZlcnkgZW50cnkgaXMgc3RhbXBlZCB3aXRoIHRoZSBtb21lbnQgdGhlIGFyY2hpdmUgaXMgYnVpbHQgcmF0aGVyIHRoYW4gdGhlIGZpbGUncyBvd24gbXRpbWUsIHdoaWNoIGlzXG4gIC8vIHdoYXQgdGhlIHByZXZpb3VzIGFyY2hpdmVyIHdyb3RlLiBBIGRlbW8gdmF1bHQncyBjb21taXR0ZWQgdGltZXN0YW1wcyBhcmUgY2hlY2tvdXQgYXJ0aWZhY3RzIG9mIHdob2V2ZXJcbiAgLy8gcmFuIHRoZSByZWxlYXNlLCBzbyB0aGV5IGNhcnJ5IG5vdGhpbmcgYSByZWFkZXIgY291bGQgdXNlOyB0aGUgYnVpbGQgdGltZSBhdCBsZWFzdCBkZXNjcmliZXMgdGhlXG4gIC8vIGFyY2hpdmUuXG4gIGF3YWl0IHdyaXRlRmlsZSh6aXBQYXRoLCB6aXBTeW5jKE9iamVjdC5mcm9tRW50cmllcyhlbnRyaWVzKSkpO1xuICByZXR1cm4gemlwUGF0aDtcbn1cblxuLy8gU3RvcmVzIHRoZSBhcmNoaXZlZCB2YXVsdCdzIGAub2JzaWRpYW4vYXBwLmpzb25gIOKAlCB0aGUgY29tbWl0dGVkIHNldHRpbmdzIHdpdGggdGhlIG93bmVkIG9uZXMgbWVyZ2VkXG4vLyBvdmVyIHRoZW0uIFRoZSBFTlRSWSBpcyB3cml0dGVuIHJhdGhlciB0aGFuIHRoZSBmaWxlLCBzbyB0aGUgcmVwbyBmb2xkZXIgaXMgbGVmdCBleGFjdGx5IGFzIGl0IHdhcywgYW5kXG4vLyBBIHZhdWx0IHdpdGggbm90aGluZyBlbHNlIHRvIGNvbmZpZ3VyZSDigJQgd2hpY2ggY29tbWl0cyBubyBgYXBwLmpzb25gIGF0IGFsbCDigJQgZ2V0cyBvbmUgaGVyZSByZWdhcmRsZXNzLlxuZnVuY3Rpb24gaW5qZWN0QXBwSnNvbihwYXJhbXM6IEluamVjdEFwcEpzb25QYXJhbXMpOiB2b2lkIHtcbiAgY29uc3Qge1xuICAgIGFwcEpzb24sXG4gICAgZW50cmllcyxcbiAgICByb290Rm9sZGVyTmFtZVxuICB9ID0gcGFyYW1zO1xuXG4gIGNvbnN0IGVudHJ5TmFtZSA9IGpvaW4ocm9vdEZvbGRlck5hbWUsIE9ic2lkaWFuUGx1Z2luUmVwb1BhdGhzLkRvdE9ic2lkaWFuLCBPYnNpZGlhblBsdWdpblJlcG9QYXRocy5BcHBKc29uKTtcbiAgZW50cmllcy5zZXQoZW50cnlOYW1lLCBCdWZmZXIuZnJvbShidWlsZEFyY2hpdmVkRGVtb1ZhdWx0QXBwSnNvbkNvbnRlbnQoeyBhcHBKc29uIH0pLCAndXRmLTgnKSk7XG59XG5cbi8vIEluamVjdHMgdGhlIGJ1aWx0LCBgb2JzaWRpYW4tZGV2LXV0aWxzYC1vd25lZCBgZGVtby12YXVsdC1oZWxwZXJgIGJvb3RzdHJhcCBwbHVnaW4gKHNoaXBwZWQgaW4gdGhpcyBwYWNrYWdlKSBpbnRvIHRoZSBkZW1vIHZhdWx0LCBzbyBubyBwZXItdmF1bHQgY29weSBpcyBjb21taXR0ZWQgYW5kIGFuIGBvYnNpZGlhbi1kZXYtdXRpbHNgIGJ1bXAgcHJvcGFnYXRlcyBmaXhlcy5cbi8vXG4vLyBBbG9uZ3NpZGUgdGhlIGJpbmFyaWVzIGl0IHdyaXRlcyB0aGUgaGVscGVyJ3Mgb3duIGBkYXRhLmpzb25gIG5hbWluZyB0aGUgZGVtb25zdHJhdGVkIHBsdWdpbi4gVGhhdCBpc1xuLy8gdGhlIG9uZSBtb21lbnQgdGhlIGlkIGlzIGtub3duIGZvciBjZXJ0YWluIOKAlCBpdCBjb21lcyBmcm9tIHRoZSBwbHVnaW4ncyBvd24gbWFuaWZlc3Qg4oCUIHdoZXJlYXMgdGhlXG4vLyBvcGVuZWQgdmF1bHQgb25seSBvZmZlcnMgcGx1Z2luIGZvbGRlcnMgdG8gY291bnQsIHdoaWNoIHRoZSBib290c3RyYXAgaXRzZWxmIGFkZHMgdG8gKHNlZVxuLy8gYERlbW9WYXVsdEhlbHBlclNldHRpbmdzYCkuXG5hc3luYyBmdW5jdGlvbiBpbmplY3REZW1vVmF1bHRIZWxwZXIoZGVtb2VkUGx1Z2luSWQ6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBwYWNrYWdlRm9sZGVyID0gZ2V0Um9vdEZvbGRlcihnZXRGb2xkZXJOYW1lKGltcG9ydC5tZXRhLnVybCkpO1xuICBpZiAoIXBhY2thZ2VGb2xkZXIpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0NvdWxkIG5vdCByZXNvbHZlIHRoZSBAbW5hb3Vtb3Yvb2JzaWRpYW4tZGV2LXRvb2xraXQgcGFja2FnZSBmb2xkZXIgdG8gaW5qZWN0IHRoZSBkZW1vLXZhdWx0LWhlbHBlciBwbHVnaW4uJyk7XG4gIH1cblxuICBjb25zdCBoZWxwZXJTb3VyY2VQYXRoID0gam9pbihwYWNrYWdlRm9sZGVyLCBPYnNpZGlhblBsdWdpblJlcG9QYXRocy5EaXN0RGVtb1ZhdWx0SGVscGVyKTtcbiAgY29uc3QgaGVscGVyRm9sZGVyID0gcmVzb2x2ZVBhdGhGcm9tUm9vdFNhZmUoe1xuICAgIHBhdGg6IGpvaW4oXG4gICAgICBPYnNpZGlhblBsdWdpblJlcG9QYXRocy5EZW1vVmF1bHQsXG4gICAgICBPYnNpZGlhblBsdWdpblJlcG9QYXRocy5Eb3RPYnNpZGlhbixcbiAgICAgIE9ic2lkaWFuUGx1Z2luUmVwb1BhdGhzLlBsdWdpbnMsXG4gICAgICBERU1PX1ZBVUxUX0hFTFBFUl9QTFVHSU5fSURcbiAgICApXG4gIH0pO1xuICBhd2FpdCBta2RpcihoZWxwZXJGb2xkZXIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICBhd2FpdCBjcChoZWxwZXJTb3VyY2VQYXRoLCBoZWxwZXJGb2xkZXIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuXG4gIGNvbnN0IHNldHRpbmdzOiBEZW1vVmF1bHRIZWxwZXJTZXR0aW5ncyA9IHsgZGVtb2VkUGx1Z2luSWQgfTtcbiAgYXdhaXQgd3JpdGVGaWxlKGpvaW4oaGVscGVyRm9sZGVyLCBEQVRBX0pTT05fRklMRV9OQU1FKSwgYCR7SlNPTi5zdHJpbmdpZnkoc2V0dGluZ3MsIG51bGwsIERBVEFfSlNPTl9JTkRFTlQpfVxcbmAsICd1dGYtOCcpO1xufVxuXG4vLyBOYW1lcyB0aGUgdmVyc2lvbiBvbiB0aGUgYXJjaGl2ZWQgYFJFQURNRS5tZGAncyBoZWFkaW5nLCBzbyB0aGUgdmF1bHQgc2F5cyB3aGljaCByZWxlYXNlIGl0IGRlbW9uc3RyYXRlc1xuLy8gaG93ZXZlciBmYXIgaXQgdHJhdmVscyBmcm9tIHRoZSByZWxlYXNlIHBhZ2UgaXQgd2FzIGRvd25sb2FkZWQgZnJvbS5cbi8vXG4vLyBFbnRyeS1vbmx5LCBmb3IgdGhlIHNhbWUgcmVhc29uIGBpbmplY3RBcHBKc29uYCBpczogdGhlIGNvbW1pdHRlZCBSRUFETUUgaXMgYSB0cmFja2VkLCBoYW5kLWF1dGhvcmVkXG4vLyBmaWxlIGFuZCBgdXBkYXRlVmVyc2lvbmAgYXJjaGl2ZXMgYWZ0ZXIgaXQgaGFzIGFscmVhZHkgcHVzaGVkLlxuLy9cbi8vIEEgdmF1bHQgdGhhdCBzaGlwcyBubyBSRUFETUUsIG9yIG9uZSBvcGVuaW5nIG9uIHNvbWV0aGluZyBvdGhlciB0aGFuIGFuIGAjIEgxYCwgaXMgbGVmdCBhbG9uZSByYXRoZXJcbi8vIHRoYW4gY29ycmVjdGVkLiBUaGUgZGVtby12YXVsdCBjb3ZlcmFnZSBzdWl0ZSBleGVtcHRzIGBSRUFETUUubWRgIGZyb20gaXRzIEgxIGNoZWNrLCBzbyBuZWl0aGVyIHNoYXBlXG4vLyBpcyBhIGRlZmVjdCDigJQgYW5kIGEgcmVsZWFzZSBpcyB0aGUgd3JvbmcgbW9tZW50IHRvIHN0YXJ0IGZhaWxpbmcgb24gb25lLlxuZnVuY3Rpb24gaW5qZWN0UmVhZG1lVmVyc2lvbihwYXJhbXM6IEluamVjdFJlYWRtZVZlcnNpb25QYXJhbXMpOiB2b2lkIHtcbiAgY29uc3Qge1xuICAgIGVudHJpZXMsXG4gICAgcm9vdEZvbGRlck5hbWUsXG4gICAgdmVyc2lvblxuICB9ID0gcGFyYW1zO1xuXG4gIGNvbnN0IGVudHJ5TmFtZSA9IGpvaW4ocm9vdEZvbGRlck5hbWUsIFJFQURNRV9GSUxFX05BTUUpO1xuICBjb25zdCBlbnRyeSA9IGVudHJpZXMuZ2V0KGVudHJ5TmFtZSk7XG4gIGlmICghZW50cnkpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBjb250ZW50ID0gZW50cnkudG9TdHJpbmcoJ3V0Zi04Jyk7XG4gIGNvbnN0IHZlcnNpb25lZENvbnRlbnQgPSBjb250ZW50LnJlcGxhY2UoT1BFTklOR19IRUFESU5HX1JFR19FWFAsIChoZWFkaW5nKSA9PiBgJHtoZWFkaW5nfSB2JHt2ZXJzaW9ufWApO1xuICBpZiAodmVyc2lvbmVkQ29udGVudCA9PT0gY29udGVudCkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGVudHJpZXMuc2V0KGVudHJ5TmFtZSwgQnVmZmVyLmZyb20odmVyc2lvbmVkQ29udGVudCwgJ3V0Zi04JykpO1xufVxuXG4vLyBSZWFkcyB0aGUgZGVtbyB2YXVsdCdzIGNvbW1pdHRlZCBgLm9ic2lkaWFuL2FwcC5qc29uYCwgcmVmdXNpbmcgdGhlIHNldHRpbmdzIHRoaXMgcGFja2FnZSBvd25zLlxuLy9cbi8vIFRob3NlIHNldHRpbmdzIGFyZSBpbmplY3RlZCBpbnRvIHRoZSBhcmNoaXZlLCBzbyBhIGNvbW1pdHRlZCBvbmUgaXMgYSBzZWNvbmQgc291cmNlIG9mIHRydXRoIHRoYXRcbi8vIG5vdGhpbmcga2VlcHMgaW4gc3RlcC4gVGhlIGRlbW8tdmF1bHQgY292ZXJhZ2Ugc3VpdGUgYWxyZWFkeSBmYWlscyBvbiBpdCwgd2hpY2ggbWVhbnMgcmVhY2hpbmcgaGVyZVxuLy8gbWVhbnMgdGhhdCBnYXRlIHdhcyBza2lwcGVkIOKAlCBzbyB0aGlzIHJlZnVzZXMgcmF0aGVyIHRoYW4gb3ZlcndyaXRpbmcgYSB2YWx1ZSBzb21lYm9keSBjaG9zZSBvbiBwdXJwb3NlLlxuYXN5bmMgZnVuY3Rpb24gcmVhZENvbW1pdHRlZEFwcEpzb24oKTogUHJvbWlzZTxEZW1vVmF1bHRBcHBKc29uPiB7XG4gIGNvbnN0IGFwcEpzb25QYXRoID0gcmVzb2x2ZVBhdGhGcm9tUm9vdFNhZmUoe1xuICAgIHBhdGg6IGpvaW4oT2JzaWRpYW5QbHVnaW5SZXBvUGF0aHMuRGVtb1ZhdWx0LCBPYnNpZGlhblBsdWdpblJlcG9QYXRocy5Eb3RPYnNpZGlhbiwgT2JzaWRpYW5QbHVnaW5SZXBvUGF0aHMuQXBwSnNvbilcbiAgfSk7XG4gIGNvbnN0IGNvbnRlbnQgPSBleGlzdHNTeW5jKGFwcEpzb25QYXRoKSA/IGF3YWl0IHJlYWRGaWxlKGFwcEpzb25QYXRoLCAndXRmLTgnKSA6IG51bGw7XG4gIGNvbnN0IGFwcEpzb24gPSBwYXJzZURlbW9WYXVsdEFwcEpzb24oeyBjb250ZW50LCBwYXRoOiBhcHBKc29uUGF0aCB9KTtcblxuICBjb25zdCBvd25lZFNldHRpbmdzID0gZmluZE93bmVkRGVtb1ZhdWx0QXBwSnNvblNldHRpbmdzKHsgYXBwSnNvbiB9KTtcbiAgaWYgKG93bmVkU2V0dGluZ3MubGVuZ3RoID4gMCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGAke2FwcEpzb25QYXRofSBzZXRzICR7b3duZWRTZXR0aW5ncy5qb2luKCcsICcpfSwgd2hpY2ggb2JzaWRpYW4tZGV2LXV0aWxzIG93bnMgYW5kIHdyaXRlcyBpbnRvIHRoZSBhcmNoaXZlZCBkZW1vIHZhdWx0LiBTZXR0aW5ncyBpdCBvd25zIG11c3Qgbm90IGJlIGNvbW1pdHRlZC5gXG4gICAgKTtcbiAgfVxuXG4gIHJldHVybiBhcHBKc29uO1xufVxuXG4vLyBSZWFkcyBldmVyeSBmaWxlIGluIHRoZSBkZW1vIHZhdWx0IGFzIGFuIGFyY2hpdmUgZW50cnksIHVuZGVyIHRoZSBzaW5nbGUgdG9wLWxldmVsIGZvbGRlciB0aGUgYXJjaGl2ZVxuLy8gc2l0cyBpbi5cbi8vXG4vLyBPbmx5IEZJTEVTIGJlY29tZSBlbnRyaWVzLiBHaXQgY2Fubm90IHRyYWNrIGFuIGVtcHR5IGZvbGRlciwgc28gYSBjb21taXR0ZWQgZGVtbyB2YXVsdCBoYXMgbm9uZSDigJQgYW5kXG4vLyBgZXh0cmFjdFppcEFyY2hpdmVgIGNyZWF0ZXMgYW4gZW50cnkncyBwYXJlbnQgZm9sZGVycyB3aGV0aGVyIG9yIG5vdCB0aGUgYXJjaGl2ZSBkZWNsYXJlZCB0aGVtLCBzbyBhXG4vLyBmb2xkZXIgZW50cnkgd291bGQgZWFybiBub3RoaW5nIGV2ZW4gaWYgb25lIGNvdWxkIGV4aXN0LlxuYXN5bmMgZnVuY3Rpb24gcmVhZERlbW9WYXVsdEVudHJpZXMocGFyYW1zOiBSZWFkRGVtb1ZhdWx0RW50cmllc1BhcmFtcyk6IFByb21pc2U8RGVtb1ZhdWx0WmlwRW50cmllcz4ge1xuICBjb25zdCB7XG4gICAgZGVtb1ZhdWx0UGF0aCxcbiAgICByb290Rm9sZGVyTmFtZVxuICB9ID0gcGFyYW1zO1xuXG4gIGNvbnN0IGVudHJpZXM6IERlbW9WYXVsdFppcEVudHJpZXMgPSBuZXcgTWFwPHN0cmluZywgQnVmZmVyPigpO1xuICBmb3IgKGNvbnN0IGRpcmVudCBvZiBhd2FpdCByZWFkZGlyUG9zaXgoZGVtb1ZhdWx0UGF0aCwgeyByZWN1cnNpdmU6IHRydWUsIHdpdGhGaWxlVHlwZXM6IHRydWUgfSkpIHtcbiAgICBpZiAoIWRpcmVudC5pc0ZpbGUoKSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgY29uc3QgcGF0aCA9IGpvaW4oZGlyZW50LnBhcmVudFBhdGgsIGRpcmVudC5uYW1lKTtcbiAgICBlbnRyaWVzLnNldChqb2luKHJvb3RGb2xkZXJOYW1lLCByZWxhdGl2ZShkZW1vVmF1bHRQYXRoLCBwYXRoKSksIGF3YWl0IHJlYWRGaWxlKHBh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
|
|
@@ -2,13 +2,7 @@
|
|
|
2
2
|
THIS IS A GENERATED/BUNDLED FILE BY ESBUILD
|
|
3
3
|
if you want to view the source, please visit the github repository of this plugin
|
|
4
4
|
*/
|
|
5
|
-
|
|
6
5
|
(function () {
|
|
7
|
-
function ensureDisposeSymbols(symbolConstructor = Symbol) {
|
|
8
|
-
symbolConstructor.asyncDispose ??= symbolConstructor.for("Symbol.asyncDispose");
|
|
9
|
-
symbolConstructor.dispose ??= symbolConstructor.for("Symbol.dispose");
|
|
10
|
-
}
|
|
11
|
-
|
|
12
6
|
function ensureBrowserProcess() {
|
|
13
7
|
const browserProcess = {
|
|
14
8
|
browser: true,
|
|
@@ -33,10 +27,7 @@ function ensureBrowserProcess() {
|
|
|
33
27
|
existingProcessRecord["browser"] = true;
|
|
34
28
|
}
|
|
35
29
|
|
|
36
|
-
(
|
|
37
|
-
ensureDisposeSymbols();
|
|
38
|
-
ensureBrowserProcess();
|
|
39
|
-
})();
|
|
30
|
+
ensureBrowserProcess();
|
|
40
31
|
})();
|
|
41
32
|
|
|
42
33
|
import { format as formatGeneric } from "@mnaoumov/typescript-dev-toolkit/formatters/dprint";
|
|
@@ -49,4 +40,4 @@ async function format(options) {
|
|
|
49
40
|
export {
|
|
50
41
|
format
|
|
51
42
|
};
|
|
52
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
43
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9mb3JtYXR0ZXJzL2RwcmludC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBmaWxlXG4gKlxuICogRm9ybWF0cyBhbiBPYnNpZGlhbiBwbHVnaW4gd2l0aCBkcHJpbnQ6IHRoZSBnZW5lcmljIHJ1bm5lciBmcm9tIGBAbW5hb3Vtb3YvdHlwZXNjcmlwdC1kZXYtdG9vbGtpdGAsIGZhbGxpbmdcbiAqIGJhY2sgdG8gdGhpcyBwYWNrYWdlJ3MgYGRwcmludC5qc29uYCB0ZW1wbGF0ZSB3aGVuIHRoZSBwcm9qZWN0IGhhcyBub25lLlxuICovXG5cbmltcG9ydCB0eXBlIHsgRm9ybWF0T3B0aW9ucyB9IGZyb20gJ0BtbmFvdW1vdi90eXBlc2NyaXB0LWRldi10b29sa2l0L2Zvcm1hdHRlcnMvZHByaW50JztcblxuaW1wb3J0IHsgZm9ybWF0IGFzIGZvcm1hdEdlbmVyaWMgfSBmcm9tICdAbW5hb3Vtb3YvdHlwZXNjcmlwdC1kZXYtdG9vbGtpdC9mb3JtYXR0ZXJzL2RwcmludCc7XG5pbXBvcnQgeyBSZXBvUGF0aHMgfSBmcm9tICdAbW5hb3Vtb3YvdHlwZXNjcmlwdC1kZXYtdG9vbGtpdC9yZXBvLXBhdGhzJztcblxuaW1wb3J0IHsgZ2V0VGVtcGxhdGVGaWxlUGF0aCB9IGZyb20gJy4uL3RlbXBsYXRlcy50cyc7XG5cbi8qKlxuICogRm9ybWF0cyB0aGUgc291cmNlIGNvZGUuXG4gKlxuICogQHBhcmFtIG9wdGlvbnMgLSBUaGUge0BsaW5rIEZvcm1hdE9wdGlvbnN9LlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZm9ybWF0KG9wdGlvbnM/OiBGb3JtYXRPcHRpb25zKTogUHJvbWlzZTx2b2lkPiB7XG4gIGF3YWl0IGZvcm1hdEdlbmVyaWMoeyBkZWZhdWx0Q29uZmlnRmlsZVBhdGg6IGdldFRlbXBsYXRlRmlsZVBhdGgoUmVwb1BhdGhzLkRwcmludEpzb24pLCAuLi5vcHRpb25zIH0pO1xufVxuZXhwb3J0IHsgdHlwZSBGb3JtYXRPcHRpb25zIH0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtZGV2LXRvb2xraXQvZm9ybWF0dGVycy9kcHJpbnQnO1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQVNBLFNBQVMsVUFBVSxxQkFBcUI7QUFDeEMsU0FBUyxpQkFBaUI7QUFFMUIsU0FBUywyQkFBMkI7QUFVcEMsZUFBbUM7QUFIbkMsZUFBc0IsT0FBTyxTQUF3QztBQUNuRSxRQUFNLGNBQWMsRUFBRSx1QkFBdUIsb0JBQW9CLFVBQVUsVUFBVSxHQUFHLEdBQUcsUUFBUSxDQUFDO0FBQ3RHOyIsIm5hbWVzIjpbXX0=
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
/// <reference path="../
|
|
1
|
+
/// <reference path="../library-references.d.mts" />
|
|
2
2
|
export * as 'dprint' from './dprint.mjs';
|