testcafe 2.6.2 → 3.4.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/lib/api/exportable-lib/index.js +5 -1
- package/lib/api/request-hooks/request-logger.js +6 -3
- package/lib/api/structure/fixture.js +6 -1
- package/lib/api/structure/interfaces.js +1 -1
- package/lib/api/structure/test-file.js +2 -2
- package/lib/api/structure/testing-unit.js +2 -1
- package/lib/api/test-controller/assertion.js +1 -1
- package/lib/api/test-controller/index.js +9 -19
- package/lib/api/test-page-url.js +2 -2
- package/lib/assertions/executor.js +1 -1
- package/lib/browser/connection/gateway/index.js +1 -4
- package/lib/browser/connection/index.js +6 -1
- package/lib/browser/provider/built-in/dedicated/firefox/marionette-client/index.js +4 -1
- package/lib/cli/argument-parser/index.js +3 -8
- package/lib/cli/remotes-wizard.js +3 -1
- package/lib/client/automation/index.js +153 -192
- package/lib/client/automation/index.min.js +1 -1
- package/lib/client/automation/playback/press/shortcut-type.js +24 -0
- package/lib/client/browser/idle-page/index.html.mustache +1 -1
- package/lib/client/browser/idle-page/index.js +5 -1
- package/lib/client/core/index.js +101 -330
- package/lib/client/core/index.min.js +1 -1
- package/lib/client/core/utils/array.js +3 -18
- package/lib/client/core/utils/dom.js +12 -32
- package/lib/client/driver/index.js +65 -77
- package/lib/client/driver/index.min.js +1 -1
- package/lib/client/driver/status.js +1 -2
- package/lib/client/test-run/index.js.mustache +1 -6
- package/lib/client/ui/index.js +77 -50
- package/lib/client/ui/index.min.js +1 -1
- package/lib/client/ui/styles.css +81 -3
- package/lib/client-functions/client-function-builder.js +7 -28
- package/lib/client-functions/selectors/add-api.js +3 -61
- package/lib/client-functions/selectors/selector-builder.js +3 -6
- package/lib/client-functions/selectors/selector-text-filter.js +1 -3
- package/lib/compiler/test-file/formats/dev-tools/compiler.js +8 -2
- package/lib/compiler/test-file/formats/typescript/compiler.js +2 -1
- package/lib/configuration/configuration-base.js +10 -8
- package/lib/configuration/default-values.js +3 -3
- package/lib/configuration/option-names.js +2 -3
- package/lib/configuration/run-option-names.js +2 -2
- package/lib/configuration/testcafe-configuration.js +4 -12
- package/lib/configuration/types.js +1 -1
- package/lib/custom-client-scripts/client-script.js +4 -1
- package/lib/custom-client-scripts/routing.js +3 -4
- package/lib/errors/get-callsite.js +3 -3
- package/lib/errors/runtime/index.js +64 -5
- package/lib/errors/runtime/templates.js +24 -15
- package/lib/errors/test-run/render-error-template/utils.js +2 -2
- package/lib/errors/test-run/templates.js +2 -2
- package/lib/errors/test-run/utils.js +2 -2
- package/lib/errors/types.js +5 -2
- package/lib/index.js +6 -4
- package/lib/native-automation/client/deps/hammerhead.js +25 -0
- package/lib/native-automation/client/event-descriptor.js +14 -1
- package/lib/native-automation/client/input.js +17 -5
- package/lib/native-automation/client/key-press/utils.js +13 -2
- package/lib/native-automation/cookie-provider.js +15 -4
- package/lib/native-automation/index.js +3 -2
- package/lib/native-automation/request-hooks/event-factory/request-paused-event-based.js +9 -5
- package/lib/native-automation/request-hooks/event-provider.js +14 -4
- package/lib/native-automation/request-pipeline/index.js +77 -48
- package/lib/native-automation/request-pipeline/safe-api.js +15 -10
- package/lib/native-automation/request-pipeline/test-run-bridge.js +13 -1
- package/lib/native-automation/resource-injector.js +3 -1
- package/lib/native-automation/types.js +1 -1
- package/lib/native-automation/utils/headers.js +2 -10
- package/lib/notifications/warning-message.js +3 -4
- package/lib/reporter/index.js +30 -21
- package/lib/reporter/module-prefix.js +6 -0
- package/lib/reporter/plugin-host.js +3 -12
- package/lib/role/index.js +1 -4
- package/lib/role/role.js +9 -1
- package/lib/runner/bootstrapper.js +45 -16
- package/lib/runner/browser-job.js +33 -5
- package/lib/runner/fixture-hook-controller.js +4 -3
- package/lib/runner/index.js +4 -19
- package/lib/runner/task/index.js +2 -4
- package/lib/runner/test-run-controller.js +24 -9
- package/lib/screenshots/capturer.js +8 -19
- package/lib/screenshots/index.js +4 -23
- package/lib/test-run/bookmark.js +1 -1
- package/lib/test-run/commands/observation.js +2 -10
- package/lib/test-run/commands/service.js +2 -9
- package/lib/test-run/commands/type.js +1 -2
- package/lib/test-run/index.js +10 -20
- package/lib/test-run/request/create-request-options.js +1 -1
- package/lib/test-run/request/interfaces.js +1 -1
- package/lib/test-run/request/send.js +2 -2
- package/lib/testcafe.js +3 -2
- package/lib/utils/debug-loggers.js +9 -2
- package/lib/utils/escape-unsafe-chars.js +13 -0
- package/lib/utils/get-browser.js +3 -2
- package/lib/utils/get-options/index.js +2 -4
- package/lib/utils/get-renderes.js +2 -2
- package/lib/utils/get-test-and-fixture-info.js +20 -0
- package/lib/utils/get-testcafe-version.js +3 -3
- package/lib/utils/lowercase-object-keys.js +12 -0
- package/lib/utils/match-collection.js +3 -3
- package/lib/utils/prerender-callsite.js +1 -1
- package/lib/utils/render-callsite-sync.js +2 -2
- package/lib/utils/reporter.js +8 -4
- package/lib/video-recorder/recorder.js +2 -2
- package/package.json +25 -27
- package/ts-defs/index.d.ts +49 -12
- package/ts-defs/selectors.d.ts +42 -8
- package/ts-defs/testcafe-scripts.d.ts +52 -8
- package/CHANGELOG.md +0 -4879
- package/lib/client/driver/command-executors/client-functions/selector-executor/check-element-delay.js +0 -5
- package/lib/client-functions/selector-api-execution-mode.js +0 -22
- package/lib/custom-client-scripts/get-url.js +0 -8
- package/lib/utils/is-repl.js +0 -12
|
@@ -48,7 +48,7 @@ const should_move_option_to_end_1 = __importDefault(require("../utils/should-mov
|
|
|
48
48
|
const REMOTE_ALIAS_RE = /^remote(?::(\d*))?$/;
|
|
49
49
|
const DESCRIPTION = (0, dedent_1.default)(`
|
|
50
50
|
|
|
51
|
-
To select a browser, specify an alias ("
|
|
51
|
+
To select a browser, specify an alias ("edge", "chrome", etc.) or the path to the browser executable. You can select more than one browser.
|
|
52
52
|
|
|
53
53
|
Use the "all" alias to run tests against all available browsers.
|
|
54
54
|
Use the "remote" alias to run tests on remote devices, like smartphones or tablets. Specify the number of remote browsers after the semicolon ("remote:3").
|
|
@@ -114,7 +114,7 @@ class CLIArgumentParser {
|
|
|
114
114
|
.option('--test-meta <key=value[,key2=value2,...]>', 'filter tests by metadata')
|
|
115
115
|
.option('--fixture-meta <key=value[,key2=value2,...]>', 'filter fixtures by metadata')
|
|
116
116
|
.option('--debug-on-fail', 'pause tests on failure')
|
|
117
|
-
.option('--native-automation', '
|
|
117
|
+
.option('--disable-native-automation', 'disable native automation')
|
|
118
118
|
.option('--app-init-delay <ms>', 'specify your application`s initialization time')
|
|
119
119
|
.option('--selector-timeout <ms>', 'specify the maximum Selector resolution time')
|
|
120
120
|
.option('--assertion-timeout <ms>', 'specify the maximum Assertion resolution time')
|
|
@@ -316,10 +316,6 @@ class CLIArgumentParser {
|
|
|
316
316
|
(0, lodash_1.set)(resultCompilerOptions, key, value);
|
|
317
317
|
this.opts.compilerOptions = resultCompilerOptions;
|
|
318
318
|
}
|
|
319
|
-
async _parseDashboardOptions() {
|
|
320
|
-
if (this.opts.dashboardOptions)
|
|
321
|
-
this.opts.dashboardOptions = await (0, get_options_1.getDashboardOptions)(this.opts.dashboardOptions);
|
|
322
|
-
}
|
|
323
319
|
_parseListBrowsers() {
|
|
324
320
|
const listBrowserOption = this.opts.listBrowsers;
|
|
325
321
|
this.opts.listBrowsers = !!this.opts.listBrowsers;
|
|
@@ -367,7 +363,6 @@ class CLIArgumentParser {
|
|
|
367
363
|
await this._parseCompilerOptions();
|
|
368
364
|
await this._parseSslOptions();
|
|
369
365
|
await this._parseReporters();
|
|
370
|
-
await this._parseDashboardOptions();
|
|
371
366
|
}
|
|
372
367
|
getRunOptions() {
|
|
373
368
|
const result = Object.create(null);
|
|
@@ -381,4 +376,4 @@ class CLIArgumentParser {
|
|
|
381
376
|
}
|
|
382
377
|
exports.default = CLIArgumentParser;
|
|
383
378
|
module.exports = exports.default;
|
|
384
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvY2xpL2FyZ3VtZW50LXBhcnNlci9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsbUNBQWtDO0FBRWxDLHVEQUdtQjtBQUVuQixvREFBNEI7QUFDNUIsa0RBQW9EO0FBQ3BELDhDQUFvRDtBQUNwRCwwRUFBc0U7QUFDdEUsd0ZBQThEO0FBQzlELCtDQUErRDtBQUMvRCx5REFVaUM7QUFFakMsOEVBQW9EO0FBQ3BELDBHQUFrRjtBQUNsRiw0RkFBb0U7QUFNcEUsMEdBQWtGO0FBQ2xGLG9FQUF1RTtBQUN2RSw0RkFBa0U7QUFDbEUsK0NBQTJEO0FBQzNELG9FQUE0QztBQUM1QyxpR0FBNkc7QUFDN0csbUdBQXVFO0FBRXZFLE1BQU0sZUFBZSxHQUFHLHFCQUFxQixDQUFDO0FBRTlDLE1BQU0sV0FBVyxHQUFHLElBQUEsZ0JBQU0sRUFBQzs7Ozs7Ozs7Ozs7Q0FXMUIsQ0FBQyxDQUFDO0FBeUNILE1BQXFCLGlCQUFpQjtJQU9sQyxZQUFvQixHQUFZO1FBQzVCLElBQUksQ0FBQyxHQUFHLEdBQVcsR0FBRyxJQUFJLE9BQU8sQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUN4QyxJQUFJLENBQUMsV0FBVyxHQUFHLENBQUMsQ0FBQztRQUNyQixJQUFJLENBQUMsSUFBSSxHQUFVLEVBQUUsQ0FBQztRQUN0QixJQUFJLENBQUMsSUFBSSxHQUFVLEVBQUUsQ0FBQztRQUV0QixJQUFJLENBQUMsZUFBZSxHQUFHLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO1FBRWxELElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUM7UUFDNUMsaUJBQWlCLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztJQUMxQyxDQUFDO0lBRU8sTUFBTSxDQUFDLGlCQUFpQjtRQUM1Qix3RUFBd0U7UUFDeEUsZ0ZBQWdG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RSxDQUFDO0lBQ3hDLENBQUM7SUFFTSxhQUFhO1FBQ2hCLE1BQU0sTUFBTSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUM7UUFFbkMsMEJBQWdCLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxFQUFFO1lBQ2xDLElBQUksVUFBVSxJQUFJLElBQUksQ0FBQyxJQUFJO2dCQUN2QiwyREFBMkQ7Z0JBQzNELE1BQU0sQ0FBQyxVQUFVLENBQUMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQ25ELENBQUMsQ0FBQyxDQUFDO1FBRUgsT0FBTyxNQUEwQixDQUFDO0lBQ3RDLENBQUM7Q0FDSjtBQS9aRCxvQ0ErWkMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBoYXMsIHNldCB9IGZyb20gJ2xvZGFzaCc7XG5cbmltcG9ydCBwcm9ncmFtLCB7XG4gICAgQ29tbWFuZCxcbiAgICBPcHRpb24sXG59IGZyb20gJ2NvbW1hbmRlcic7XG5cbmltcG9ydCBkZWRlbnQgZnJvbSAnZGVkZW50JztcbmltcG9ydCB7IEdlbmVyYWxFcnJvciB9IGZyb20gJy4uLy4uL2Vycm9ycy9ydW50aW1lJztcbmltcG9ydCB7IFJVTlRJTUVfRVJST1JTIH0gZnJvbSAnLi4vLi4vZXJyb3JzL3R5cGVzJztcbmltcG9ydCB7IGFzc2VydFR5cGUsIGlzIH0gZnJvbSAnLi4vLi4vZXJyb3JzL3J1bnRpbWUvdHlwZS1hc3NlcnRpb25zJztcbmltcG9ydCBnZXRWaWV3UG9ydFdpZHRoIGZyb20gJy4uLy4uL3V0aWxzL2dldC12aWV3cG9ydC13aWR0aCc7XG5pbXBvcnQgeyB3b3JkV3JhcCwgc3BsaXRRdW90ZWRUZXh0IH0gZnJvbSAnLi4vLi4vdXRpbHMvc3RyaW5nJztcbmltcG9ydCB7XG4gICAgZ2V0U1NMT3B0aW9ucyxcbiAgICBnZXRRdWFyYW50aW5lT3B0aW9ucyxcbiAgICBnZXRTY3JlZW5zaG90T3B0aW9ucyxcbiAgICBnZXRTa2lwSnNFcnJvcnNPcHRpb25zLFxuICAgIGdldFZpZGVvT3B0aW9ucyxcbiAgICBnZXRNZXRhT3B0aW9ucyxcbiAgICBnZXRHcmVwT3B0aW9ucyxcbiAgICBnZXRDb21waWxlck9wdGlvbnMsXG4gICAgZ2V0RGFzaGJvYXJkT3B0aW9ucyxcbn0gZnJvbSAnLi4vLi4vdXRpbHMvZ2V0LW9wdGlvbnMnO1xuXG5pbXBvcnQgZ2V0RmlsdGVyRm4gZnJvbSAnLi4vLi4vdXRpbHMvZ2V0LWZpbHRlci1mbic7XG5pbXBvcnQgU0NSRUVOU0hPVF9PUFRJT05fTkFNRVMgZnJvbSAnLi4vLi4vY29uZmlndXJhdGlvbi9zY3JlZW5zaG90LW9wdGlvbi1uYW1lcyc7XG5pbXBvcnQgUlVOX09QVElPTl9OQU1FUyBmcm9tICcuLi8uLi9jb25maWd1cmF0aW9uL3J1bi1vcHRpb24tbmFtZXMnO1xuaW1wb3J0IHtcbiAgICBEaWN0aW9uYXJ5LFxuICAgIFJlcG9ydGVyT3B0aW9uLFxuICAgIFJ1bm5lclJ1bk9wdGlvbnMsXG59IGZyb20gJy4uLy4uL2NvbmZpZ3VyYXRpb24vaW50ZXJmYWNlcyc7XG5pbXBvcnQgUVVBUkFOVElORV9PUFRJT05fTkFNRVMgZnJvbSAnLi4vLi4vY29uZmlndXJhdGlvbi9xdWFyYW50aW5lLW9wdGlvbi1uYW1lcyc7XG5pbXBvcnQgeyBleHRyYWN0Tm9kZVByb2Nlc3NBcmd1bWVudHMgfSBmcm9tICcuLi9ub2RlLWFyZ3VtZW50cy1maWx0ZXInO1xuaW1wb3J0IGdldFRlc3RjYWZlVmVyc2lvbiBmcm9tICcuLi8uLi91dGlscy9nZXQtdGVzdGNhZmUtdmVyc2lvbic7XG5pbXBvcnQgeyBwYXJzZVBvcnROdW1iZXIsIHBhcnNlTGlzdCB9IGZyb20gJy4vcGFyc2UtdXRpbHMnO1xuaW1wb3J0IENPTU1BTkRfTkFNRVMgZnJvbSAnLi9jb21tYW5kLW5hbWVzJztcbmltcG9ydCB7IFNLSVBfSlNfRVJST1JTX09QVElPTlNfT0JKRUNUX09QVElPTl9OQU1FUyB9IGZyb20gJy4uLy4uL2NvbmZpZ3VyYXRpb24vc2tpcC1qcy1lcnJvcnMtb3B0aW9uLW5hbWVzJztcbmltcG9ydCBzaG91bGRNb3ZlT3B0aW9uVG9FbmQgZnJvbSAnLi4vdXRpbHMvc2hvdWxkLW1vdmUtb3B0aW9uLXRvLWVuZCc7XG5cbmNvbnN0IFJFTU9URV9BTElBU19SRSA9IC9ecmVtb3RlKD86OihcXGQqKSk/JC87XG5cbmNvbnN0IERFU0NSSVBUSU9OID0gZGVkZW50KGBcblxuICAgIFRvIHNlbGVjdCBhIGJyb3dzZXIsIHNwZWNpZnkgYW4gYWxpYXMgKFwiaWVcIiwgXCJjaHJvbWVcIiwgZXRjLikgb3IgdGhlIHBhdGggdG8gdGhlIGJyb3dzZXIgZXhlY3V0YWJsZS4gWW91IGNhbiBzZWxlY3QgbW9yZSB0aGFuIG9uZSBicm93c2VyLlxuXG4gICAgVXNlIHRoZSBcImFsbFwiIGFsaWFzIHRvIHJ1biB0ZXN0cyBhZ2FpbnN0IGFsbCBhdmFpbGFibGUgYnJvd3NlcnMuXG4gICAgVXNlIHRoZSBcInJlbW90ZVwiIGFsaWFzIHRvIHJ1biB0ZXN0cyBvbiByZW1vdGUgZGV2aWNlcywgbGlrZSBzbWFydHBob25lcyBvciB0YWJsZXRzLiBTcGVjaWZ5IHRoZSBudW1iZXIgb2YgcmVtb3RlIGJyb3dzZXJzIGFmdGVyIHRoZSBzZW1pY29sb24gKFwicmVtb3RlOjNcIikuXG4gICAgSWYgeW91IHVzZSBhIGJyb3dzZXIgcHJvdmlkZXIgcGx1Z2luLCBzcGVjaWZ5IGJvdGggdGhlIG5hbWUgb2YgdGhlIHBsdWdpbiBhbmQgdGhlIG5hbWUgb2YgdGhlIGJyb3dzZXIuIFNlcGFyYXRlIHRoZSB0d28gd2l0aCBhIHNlbWljb2xvbiAoXCJzYXVjZWxhYnM6Y2hyb21lQDUxXCIpLlxuXG4gICAgVG8gZXhlY3V0ZSBtdWx0aXBsZSB0ZXN0IGZpbGVzLCBzcGVjaWZ5IG11bHRpcGxlIGZpbGUgcGF0aHMgb3IgZ2xvYiBwYXR0ZXJucy5cblxuICAgIEZ1bGwgZG9jdW1lbnRhdGlvbjogaHR0cHM6Ly90ZXN0Y2FmZS5pby9kb2N1bWVudGF0aW9uLzQwMjYzOS9yZWZlcmVuY2UvY29tbWFuZC1saW5lLWludGVyZmFjZVxuYCk7XG5cbmludGVyZmFjZSBDb21tYW5kTGluZU9wdGlvbnMge1xuICAgIHRlc3RHcmVwPzogc3RyaW5nIHwgUmVnRXhwO1xuICAgIGZpeHR1cmVHcmVwPzogc3RyaW5nIHwgUmVnRXhwO1xuICAgIHNyYz86IHN0cmluZ1tdO1xuICAgIGJyb3dzZXJzPzogc3RyaW5nW107XG4gICAgbGlzdEJyb3dzZXJzPzogYm9vbGVhbiB8IHN0cmluZztcbiAgICB0ZXN0TWV0YT86IHN0cmluZyB8IERpY3Rpb25hcnk8c3RyaW5nIHwgbnVtYmVyIHwgYm9vbGVhbj47XG4gICAgZml4dHVyZU1ldGE/OiBzdHJpbmcgfCBEaWN0aW9uYXJ5PHN0cmluZyB8IG51bWJlciB8IGJvb2xlYW4+O1xuICAgIGZpbHRlcj86IEZ1bmN0aW9uO1xuICAgIGFwcEluaXREZWxheT86IHN0cmluZyB8IG51bWJlcjtcbiAgICBhc3NlcnRpb25UaW1lb3V0Pzogc3RyaW5nIHwgbnVtYmVyO1xuICAgIHNlbGVjdG9yVGltZW91dD86IHN0cmluZyB8IG51bWJlcjtcbiAgICBzcGVlZD86IHN0cmluZyB8IG51bWJlcjtcbiAgICBwYWdlTG9hZFRpbWVvdXQ/OiBzdHJpbmcgfCBudW1iZXI7XG4gICAgcGFnZVJlcXVlc3RUaW1lb3V0Pzogc3RyaW5nIHwgbnVtYmVyO1xuICAgIGFqYXhSZXF1ZXN0VGltZW91dD86IHN0cmluZyB8IG51bWJlcjtcbiAgICBicm93c2VySW5pdFRpbWVvdXQ/OiBzdHJpbmcgfCBudW1iZXI7XG4gICAgdGVzdEV4ZWN1dGlvblRpbWVvdXQ/OiBzdHJpbmcgfCBudW1iZXI7XG4gICAgcnVuRXhlY3V0aW9uVGltZW91dD86IHN0cmluZyB8IG51bWJlcjtcbiAgICBjb25jdXJyZW5jeT86IHN0cmluZyB8IG51bWJlcjtcbiAgICBxdWFyYW50aW5lTW9kZT86IGJvb2xlYW4gfCBEaWN0aW9uYXJ5PHN0cmluZyB8IG51bWJlcj47XG4gICAgcG9ydHM/OiBzdHJpbmcgfCBudW1iZXJbXTtcbiAgICBwcm92aWRlck5hbWU/OiBzdHJpbmc7XG4gICAgc3NsPzogc3RyaW5nIHwgRGljdGlvbmFyeTxzdHJpbmcgfCBudW1iZXIgfCBib29sZWFuPjtcbiAgICByZXBvcnRlcj86IHN0cmluZyB8IFJlcG9ydGVyT3B0aW9uW107XG4gICAgc2NyZWVuc2hvdHM/OiBEaWN0aW9uYXJ5PHN0cmluZyB8IG51bWJlciB8IGJvb2xlYW4+IHwgc3RyaW5nO1xuICAgIHNjcmVlbnNob3RQYXRoUGF0dGVybj86IHN0cmluZztcbiAgICBzY3JlZW5zaG90c09uRmFpbHM/OiBib29sZWFuO1xuICAgIHZpZGVvT3B0aW9ucz86IHN0cmluZyB8IERpY3Rpb25hcnk8bnVtYmVyIHwgc3RyaW5nIHwgYm9vbGVhbj47XG4gICAgdmlkZW9FbmNvZGluZ09wdGlvbnM/OiBzdHJpbmcgfCBEaWN0aW9uYXJ5PG51bWJlciB8IHN0cmluZyB8IGJvb2xlYW4+O1xuICAgIGNvbXBpbGVyT3B0aW9ucz86IHN0cmluZyB8IERpY3Rpb25hcnk8bnVtYmVyIHwgc3RyaW5nIHwgYm9vbGVhbj47XG4gICAgY29uZmlnRmlsZT86IHN0cmluZztcbiAgICBuYXRpdmVBdXRvbWF0aW9uPzogYm9vbGVhbjtcbiAgICB2OEZsYWdzPzogc3RyaW5nW107XG4gICAgZGFzaGJvYXJkT3B0aW9ucz86IHN0cmluZyB8IERpY3Rpb25hcnk8c3RyaW5nIHwgYm9vbGVhbiB8IG51bWJlcj47XG4gICAgYmFzZVVybD86IHN0cmluZztcbiAgICBza2lwSnNFcnJvcnM/OiBib29sZWFuIHwgRGljdGlvbmFyeTxSZWdFeHAgfCBzdHJpbmc+O1xufVxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBDTElBcmd1bWVudFBhcnNlciB7XG4gICAgcHJpdmF0ZSBjd2Q6IHN0cmluZztcbiAgICBwcml2YXRlIHJlbW90ZUNvdW50OiBudW1iZXI7XG4gICAgcHVibGljIG9wdHM6IENvbW1hbmRMaW5lT3B0aW9ucztcbiAgICBwdWJsaWMgYXJnczogc3RyaW5nW107XG4gICAgcHJpdmF0ZSByZWFkb25seSB0ZXN0Q2FmZUNvbW1hbmQ6IENvbW1hbmQ7XG5cbiAgICBwdWJsaWMgY29uc3RydWN0b3IgKGN3ZD86IHN0cmluZykge1xuICAgICAgICB0aGlzLmN3ZCAgICAgICAgID0gY3dkIHx8IHByb2Nlc3MuY3dkKCk7XG4gICAgICAgIHRoaXMucmVtb3RlQ291bnQgPSAwO1xuICAgICAgICB0aGlzLm9wdHMgICAgICAgID0ge307XG4gICAgICAgIHRoaXMuYXJncyAgICAgICAgPSBbXTtcblxuICAgICAgICB0aGlzLnRlc3RDYWZlQ29tbWFuZCA9IHRoaXMuX2FkZFRlc3RDYWZlQ29tbWFuZCgpO1xuXG4gICAgICAgIHRoaXMuX3BhdGNoSGVscE91dHB1dCh0aGlzLnRlc3RDYWZlQ29tbWFuZCk7XG4gICAgICAgIENMSUFyZ3VtZW50UGFyc2VyLl9zZXR1cFJvb3RDb21tYW5kKCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzdGF0aWMgX3NldHVwUm9vdENvbW1hbmQgKCk6IHZvaWQge1xuICAgICAgICAvLyBOT1RFOiBXZSBhcmUgZm9yY2VkIHRvIHNldCB0aGUgbmFtZSBvZiB0aGUgcm9vdCBjb21tYW5kIHRvICd0ZXN0Y2FmZSdcbiAgICAgICAgLy8gdG8gYXZvaWQgdGhlIGF1dG9tYXRpYyBjb21tYW5kIG5hbWUgY2FsY3VsYXRpb24gdXNpbmcgdGhlIGV4ZWN1dGVkIGZpbGUgcGF0aC5cbiAgICAgICAgLy8gSXQncyBuZWNlc3NhcnkgdG8gY29ycmVjdCBjb21tYW5kIGRlc2NyaXB0aW9uIGZvciBuZXN0ZWQgY29tbWFuZHMuXG4gICAgICAgIChwcm9ncmFtIGFzIHVua25vd24gYXMgQ29tbWFuZCkubmFtZShDT01NQU5EX05BTUVTLlRlc3RDYWZlKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHN0YXRpYyBfcmVtb3ZlQ29tbWFuZElmRXhpc3RzIChuYW1lOiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgICAgLy8gTk9URTogQnVnIGluIHRoZSAnY29tbWFuZGVyJyBtb2R1bGUuXG4gICAgICAgIC8vIEl0J3MgcG9zc2libGUgdG8gYWRkIGEgZmV3IGNvbW1hbmRzIHdpdGggdGhlIHNhbWUgbmFtZS5cbiAgICAgICAgLy8gQWxzbywgcmVtb3ZpbmcgaXMgYSBiZXR0ZXIgdGhhbiBjb25kaXRpb25hbGx5IGFkZGluZ1xuICAgICAgICAvLyBiZWNhdXNlIGl0IGFsbG93cyBhdm9pZGluZyB0aGUgcGFyc2VkIG9wdGlvbiBkdXBsaWNhdGVzLlxuICAgICAgICBjb25zdCBpbmRleCA9IChwcm9ncmFtIGFzIHVua25vd24gYXMgQ29tbWFuZCkuY29tbWFuZHMuZmluZEluZGV4KGNtZCA9PiBjbWQubmFtZSgpID09PSBuYW1lKTtcblxuICAgICAgICBpZiAoaW5kZXggPiAtMSlcbiAgICAgICAgICAgIChwcm9ncmFtIGFzIHVua25vd24gYXMgQ29tbWFuZCkuY29tbWFuZHMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHN0YXRpYyBfZ2V0RGVzY3JpcHRpb24gKCk6IHN0cmluZyB7XG4gICAgICAgIC8vIE5PVEU6IGFkZCBlbXB0eSBsaW5lIHRvIHdvcmthcm91bmQgY29tbWFuZGVyLWZvcmNlZCBpbmRlbnRhdGlvbiBvbiB0aGUgZmlyc3QgbGluZS5cbiAgICAgICAgcmV0dXJuICdcXG4nICsgd29yZFdyYXAoREVTQ1JJUFRJT04sIDIsIGdldFZpZXdQb3J0V2lkdGgocHJvY2Vzcy5zdGRvdXQpKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9hZGRUZXN0Q2FmZUNvbW1hbmQgKCk6IENvbW1hbmQge1xuICAgICAgICBDTElBcmd1bWVudFBhcnNlci5fcmVtb3ZlQ29tbWFuZElmRXhpc3RzKENPTU1BTkRfTkFNRVMuVGVzdENhZmUpO1xuXG4gICAgICAgIHJldHVybiAocHJvZ3JhbSBhcyB1bmtub3duIGFzIENvbW1hbmQpXG4gICAgICAgICAgICAuY29tbWFuZChDT01NQU5EX05BTUVTLlRlc3RDYWZlLCB7IGlzRGVmYXVsdDogdHJ1ZSB9KVxuICAgICAgICAgICAgLnZlcnNpb24oZ2V0VGVzdGNhZmVWZXJzaW9uKCksICctdiwgLS12ZXJzaW9uJylcbiAgICAgICAgICAgIC51c2FnZSgnW29wdGlvbnNdIDxjb21tYS1zZXBhcmF0ZWQtYnJvd3Nlci1saXN0PiA8ZmlsZS1vci1nbG9iIC4uLj4nKVxuICAgICAgICAgICAgLmRlc2NyaXB0aW9uKENMSUFyZ3VtZW50UGFyc2VyLl9nZXREZXNjcmlwdGlvbigpKVxuXG4gICAgICAgICAgICAuYWxsb3dVbmtub3duT3B0aW9uKClcbiAgICAgICAgICAgIC5vcHRpb24oJy1iLCAtLWxpc3QtYnJvd3NlcnMgW3Byb3ZpZGVyXScsICdkaXNwbGF5IHRoZSBsaXN0IG9mIGFsaWFzZXMgZm9yIGF2YWlsYWJsZSBicm93c2VycyBhbmQgYnJvd3NlciBwcm92aWRlcnMnKVxuICAgICAgICAgICAgLm9wdGlvbignLXIsIC0tcmVwb3J0ZXIgPG5hbWVbOm91dHB1dEZpbGVdWywuLi5dPicsICdzcGVjaWZ5IHJlcG9ydGVycyBhbmQgcmVwb3J0IGZpbGVuYW1lcycpXG4gICAgICAgICAgICAub3B0aW9uKCctcywgLS1zY3JlZW5zaG90cyA8b3B0aW9uPXZhbHVlWywuLi5dPicsICdzcGVjaWZ5IHNjcmVlbnNob3Qgb3B0aW9ucycpXG4gICAgICAgICAgICAub3B0aW9uKCctUywgLS1zY3JlZW5zaG90cy1vbi1mYWlscycsICd0YWtlIGEgc2NyZWVuc2hvdCBvbiB0ZXN0IGZhaWx1cmUnKVxuICAgICAgICAgICAgLm9wdGlvbignLXAsIC0tc2NyZWVuc2hvdC1wYXRoLXBhdHRlcm4gPHBhdHRlcm4+JywgJ3NwZWNpZnkgdGhlIG5hbWluZyBzY2hlbWEgZm9yIHNjcmVlbnNob3QgZmlsZW5hbWVzIGFuZCBwYXRoczogJHtCUk9XU0VSfSwgJHtCUk9XU0VSX1ZFUlNJT059LCAke09TfSwgZXRjLicpXG4gICAgICAgICAgICAub3B0aW9uKCctcSwgLS1xdWFyYW50aW5lLW1vZGUgW29wdGlvbj12YWx1ZSwuLi5dJywgJ2VuYWJsZSBhbmQgY29uZmlndXJlIHF1YXJhbnRpbmUgbW9kZScpXG4gICAgICAgICAgICAub3B0aW9uKCctZCwgLS1kZWJ1Zy1tb2RlJywgJ2VuYWJsZSBkZWJ1ZyBtb2RlLiBXaGVuIHlvdSBydW4gVGVzdENhZmUgaW4gZGVidWcgbW9kZSwgaXQgZXhlY3V0ZXMgdGVzdCBzdGVwcyBvbmUgYnkgb25lLCBhbmQgcGF1c2VzIHRoZSB0ZXN0IGFmdGVyIGVhY2ggc3RlcC4nKVxuICAgICAgICAgICAgLm9wdGlvbignLWUsIC0tc2tpcC1qcy1lcnJvcnMgW29wdGlvbj12YWx1ZSwuLi5dJywgJ2lnbm9yZSBKYXZhU2NyaXB0IGVycm9ycyB0aGF0IG1hdGNoIHRoZSBzcGVjaWZpZWQgY3JpdGVyaWEnKVxuICAgICAgICAgICAgLm9wdGlvbignLXUsIC0tc2tpcC11bmNhdWdodC1lcnJvcnMnLCAnaWdub3JlIHVuY2F1Z2h0IGVycm9ycyBhbmQgdW5oYW5kbGVkIHByb21pc2UgcmVqZWN0aW9ucycpXG4gICAgICAgICAgICAub3B0aW9uKCctdCwgLS10ZXN0IDxuYW1lPicsICdmaWx0ZXIgdGVzdHMgYnkgbmFtZScpXG4gICAgICAgICAgICAub3B0aW9uKCctVCwgLS10ZXN0LWdyZXAgPHBhdHRlcm4+JywgJ2ZpbHRlciB0ZXN0cyBieSByZWd1bGFyIGV4cHJlc3Npb24nKVxuICAgICAgICAgICAgLm9wdGlvbignLWYsIC0tZml4dHVyZSA8bmFtZT4nLCAnZmlsdGVyIGZpeHR1cmVzIGJ5IG5hbWUnKVxuICAgICAgICAgICAgLm9wdGlvbignLUYsIC0tZml4dHVyZS1ncmVwIDxwYXR0ZXJuPicsICdmaWx0ZXIgZml4dHVyZXMgYnkgcmVndWxhciBleHByZXNzaW9uJylcbiAgICAgICAgICAgIC5vcHRpb24oJy1hLCAtLWFwcCA8Y29tbWFuZD4nLCAnZXhlY3V0ZSBhIHNoZWxsIGNvbW1hbmQgb24gc3RhcnR1cCB0byBsYXVuY2ggYSB3ZWIgYXBwbGljYXRpb24gb3IgcGVyZm9ybSBvdGhlciBwcmVwYXJhdG9yeSB0YXNrcycpXG4gICAgICAgICAgICAub3B0aW9uKCctYywgLS1jb25jdXJyZW5jeSA8bnVtYmVyPicsICdydW4gdGVzdHMgY29uY3VycmVudGx5JylcbiAgICAgICAgICAgIC5vcHRpb24oJy1MLCAtLWxpdmUnLCAnZW5hYmxlIGxpdmUgbW9kZS4gTGl2ZSBtb2RlIHJlc3RhcnRzIHRlc3RzIHdoZW4geW91IG1ha2UgY2hhbmdlcyB0byB0ZXN0IGZpbGVzLicpXG4gICAgICAgICAgICAub3B0aW9uKCctLXRlc3QtbWV0YSA8a2V5PXZhbHVlWyxrZXkyPXZhbHVlMiwuLi5dPicsICdmaWx0ZXIgdGVzdHMgYnkgbWV0YWRhdGEnKVxuICAgICAgICAgICAgLm9wdGlvbignLS1maXh0dXJlLW1ldGEgPGtleT12YWx1ZVssa2V5Mj12YWx1ZTIsLi4uXT4nLCAnZmlsdGVyIGZpeHR1cmVzIGJ5IG1ldGFkYXRhJylcbiAgICAgICAgICAgIC5vcHRpb24oJy0tZGVidWctb24tZmFpbCcsICdwYXVzZSB0ZXN0cyBvbiBmYWlsdXJlJylcbiAgICAgICAgICAgIC5vcHRpb24oJy0tbmF0aXZlLWF1dG9tYXRpb24nLCAnZW5hYmxlIG5hdGl2ZSBhdXRvbWF0aW9uJylcbiAgICAgICAgICAgIC5vcHRpb24oJy0tYXBwLWluaXQtZGVsYXkgPG1zPicsICdzcGVjaWZ5IHlvdXIgYXBwbGljYXRpb25gcyBpbml0aWFsaXphdGlvbiB0aW1lJylcbiAgICAgICAgICAgIC5vcHRpb24oJy0tc2VsZWN0b3ItdGltZW91dCA8bXM+JywgJ3NwZWNpZnkgdGhlIG1heGltdW0gU2VsZWN0b3IgcmVzb2x1dGlvbiB0aW1lJylcbiAgICAgICAgICAgIC5vcHRpb24oJy0tYXNzZXJ0aW9uLXRpbWVvdXQgPG1zPicsICdzcGVjaWZ5IHRoZSBtYXhpbXVtIEFzc2VydGlvbiByZXNvbHV0aW9uIHRpbWUnKVxuICAgICAgICAgICAgLm9wdGlvbignLS1wYWdlLWxvYWQtdGltZW91dCA8bXM+JywgJ3NwZWNpZnkgdGhlIG1heGltdW0gdGltZSBiZXR3ZWVuIHRoZSB3aW5kb3cubG9hZCBldmVudCBhbmQgdGhlIERPTUNvbnRlbnRMb2FkZWQgZXZlbnQgKG1zKScpXG4gICAgICAgICAgICAub3B0aW9uKCctLXBhZ2UtcmVxdWVzdC10aW1lb3V0IDxtcz4nLCAnc3BlY2lmeSB0aGUgbWF4aW11bSBwYWdlIHJlcXVlc3QgcmVzb2x1dGlvbiB0aW1lJylcbiAgICAgICAgICAgIC5vcHRpb24oJy0tYWpheC1yZXF1ZXN0LXRpbWVvdXQgPG1zPicsICdzcGVjaWZ5IHRoZSBtYXhpbXVtIEFKQVggcmVxdWVzdCByZXNvbHV0aW9uIHRpbWUnKVxuICAgICAgICAgICAgLm9wdGlvbignLS1icm93c2VyLWluaXQtdGltZW91dCA8bXM+JywgJ3NwZWNpZnkgdGhlIG1heGltdW0gYnJvd3NlciBzdGFydHVwIHRpbWUnKVxuICAgICAgICAgICAgLm9wdGlvbignLS10ZXN0LWV4ZWN1dGlvbi10aW1lb3V0IDxtcz4nLCAnc3BlY2lmeSB0aGUgbWF4aW11bSB0ZXN0IGV4ZWN1dGlvbiB0aW1lJylcbiAgICAgICAgICAgIC5vcHRpb24oJy0tcnVuLWV4ZWN1dGlvbi10aW1lb3V0IDxtcz4nLCAnc3BlY2lmeSB0aGUgbWF4aW11bSB0ZXN0IHJ1biB0aW1lJylcbiAgICAgICAgICAgIC5vcHRpb24oJy0tc3BlZWQgPGZhY3Rvcj4nLCAnc2V0IHRlc3QgZXhlY3V0aW9uIHNwZWVkICgwLjAxIC4uLiAxKScpXG4gICAgICAgICAgICAub3B0aW9uKCctLXBvcnRzIDxwb3J0MSxwb3J0Mj4nLCAnc3BlY2lmeSBuZXR3b3JrIHBvcnRzIHRvIHVzZSBkdXJpbmcgdGhlIHRlc3QgcnVuLiBUaGUgc2Vjb25kIHBvcnQgaXMgbmVjZXNzYXJ5IHRvIGFjY2VzcyBjcm9zcy1kb21haW4gcmVzb3VyY2VzLicpXG4gICAgICAgICAgICAub3B0aW9uKCctLWhvc3RuYW1lIDxuYW1lPicsIGBzcGVjaWZ5IHlvdXIgaG9zdG5hbWUuIE5lY2Vzc2FyeSB0byBydW4gdGVzdHMgaW4gcmVtb3RlIGJyb3dzZXJzLmApXG4gICAgICAgICAgICAub3B0aW9uKCctLXByb3h5IDxob3N0PicsICdzcGVjaWZ5IHRoZSBwcm94eSBzZXJ2ZXIgaG9zdG5hbWUgb3IgSVAgYWRkcmVzcycpXG4gICAgICAgICAgICAub3B0aW9uKCctLXByb3h5LWJ5cGFzcyA8cnVsZXM+JywgJ3NwZWNpZnkgVVJMcyB0aGF0IGJ5cGFzcyB0aGUgcHJveHkgc2VydmVyJylcbiAgICAgICAgICAgIC5vcHRpb24oJy0tc3NsIDxvcHRpb25zPicsICdzcGVjaWZ5IFNTTCBvcHRpb25zIHRvIHJ1biBUZXN0Q2FmZSBvdmVyIEhUVFBTJylcbiAgICAgICAgICAgIC5vcHRpb24oJy0tdmlkZW8gPHBhdGg+JywgJ3JlY29yZCB2aWRlb3Mgb2YgdGVzdCBydW5zJylcbiAgICAgICAgICAgIC5vcHRpb24oJy0tdmlkZW8tb3B0aW9ucyA8b3B0aW9uPXZhbHVlWywuLi5dPicsICdzcGVjaWZ5IHZpZGVvIHJlY29yZGluZyBvcHRpb25zJylcbiAgICAgICAgICAgIC5vcHRpb24oJy0tdmlkZW8tZW5jb2Rpbmctb3B0aW9ucyA8b3B0aW9uPXZhbHVlWywuLi5dPicsICdzcGVjaWZ5IHZpZGVvIGVuY29kaW5nIG9wdGlvbnMnKVxuICAgICAgICAgICAgLm9wdGlvbignLS1kZXYnLCAnbG9nIGFuZCBkaWFnbm9zZSBUZXN0Q2FmZSBlcnJvcnMnKVxuICAgICAgICAgICAgLm9wdGlvbignLS1xci1jb2RlJywgJ291dHB1dCBRUiBjb2RlcyB3aXRoIFVSTHMgZm9yIHJlbW90ZSBicm93c2VyIGNvbm5lY3Rpb25zJylcbiAgICAgICAgICAgIC5vcHRpb24oJy0tc2YsIC0tc3RvcC1vbi1maXJzdC1mYWlsJywgJ3N0b3AgdGhlIHRlc3QgcnVuIGlmIGFueSB0ZXN0IGZhaWxzJylcbiAgICAgICAgICAgIC5vcHRpb24oJy0tY29uZmlnLWZpbGUgPHBhdGg+JywgJ3NwZWNpZnkgYSBjdXN0b20gcGF0aCB0byB0aGUgdGVzdGNhZmUgY29uZmlndXJhdGlvbiBmaWxlJylcbiAgICAgICAgICAgIC5vcHRpb24oJy0tdHMtY29uZmlnLXBhdGggPHBhdGg+JywgJ3NwZWNpZnkgdGhlIHBhdGggdG8gYSBjdXN0b20gVHlwZVNjcmlwdCBjb25maWd1cmF0aW9uIGZpbGUnKVxuICAgICAgICAgICAgLm9wdGlvbignLS1jcywgLS1jbGllbnQtc2NyaXB0cyA8cGF0aHM+JywgJ2luamVjdCBjbGllbnQtc2lkZSBzY3JpcHRzIGludG8gdGhlIHBhZ2UnLCBwYXJzZUxpc3QsIFtdKVxuICAgICAgICAgICAgLm9wdGlvbignLS1kaXNhYmxlLXBhZ2UtY2FjaGluZycsICdkbyBub3QgY2FjaGUgcGFnZXMnKVxuICAgICAgICAgICAgLm9wdGlvbignLS1kaXNhYmxlLXBhZ2UtcmVsb2FkcycsICdkbyBub3QgcmVsb2FkIHBhZ2VzIGJldHdlZW4gdGVzdHMnKVxuICAgICAgICAgICAgLm9wdGlvbignLS1yZXRyeS10ZXN0LXBhZ2VzJywgJ3JldHJ5IHBhZ2UgcmVxdWVzdHMgaW4gY2FzZSBvZiBmYWlsdXJlJylcbiAgICAgICAgICAgIC5vcHRpb24oJy0tZGlzYWJsZS1zY3JlZW5zaG90cycsICdkaXNhYmxlIHNjcmVlbnNob3RzJylcbiAgICAgICAgICAgIC5vcHRpb24oJy0tc2NyZWVuc2hvdHMtZnVsbC1wYWdlJywgJ2VuYWJsZSBmdWxsLXBhZ2Ugc2NyZWVuc2hvdHMnKVxuICAgICAgICAgICAgLm9wdGlvbignLS1jb21waWxlci1vcHRpb25zIDxvcHRpb249dmFsdWVbLC4uLl0+JywgJ3NwZWNpZnkgdGVzdCBjb21waWxhdGlvbiBzZXR0aW5ncycpXG4gICAgICAgICAgICAub3B0aW9uKCctLWRpc2FibGUtbXVsdGlwbGUtd2luZG93cycsICdkaXNhYmxlIHRoZSBtdWx0aS13aW5kb3cgbW9kZScpXG4gICAgICAgICAgICAub3B0aW9uKCctLWRpc2FibGUtaHR0cDInLCAnZm9yY2UgdGhlIHByb3h5IHRvIGlzc3VlIEhUVFAvMS4xIHJlcXVlc3RzJylcbiAgICAgICAgICAgIC5vcHRpb24oJy0tY2FjaGUnLCAnY2FjaGUgd2ViIGFzc2V0cyBiZXR3ZWVuIHRlc3QgcnVucycpXG4gICAgICAgICAgICAub3B0aW9uKCctLWJhc2UtdXJsIDx1cmw+JywgJ3NldCB0aGUgYmFzZSB1cmwgZm9yIHRoZSB0ZXN0IHJ1bicpXG4gICAgICAgICAgICAub3B0aW9uKCctLWVzbScsICdlbmFibGUgRVNNIG1vZHVsZSBzdXBwb3J0JylcblxuICAgICAgICAgICAgLy8gTk9URTogdGhlc2Ugb3B0aW9ucyB3aWxsIGJlIGhhbmRsZWQgYnkgY2hhbGsgaW50ZXJuYWxseVxuICAgICAgICAgICAgLm9wdGlvbignLS1jb2xvcicsICdmb3JjZSBUZXN0Q2FmZSB0byBmb3JtYXQgQ0xJIG91dHB1dCB3aXRoIGNvbG9yJylcbiAgICAgICAgICAgIC5vcHRpb24oJy0tbm8tY29sb3InLCAnZGlzYWJsZSB0ZXh0IGNvbG9yIGZvcm1hdHRpbmcgaW4gdGhlIENMSScpXG5cbiAgICAgICAgICAgIC8vIE5PVEU6IFRlbXBvcmFyaWx5IGV4Y2x1ZGUgZXhwZXJpbWVudGFsIG9wdGlvbnMgZnJvbSAtLWhlbHAgb3V0cHV0XG4gICAgICAgICAgICAuYWRkT3B0aW9uKG5ldyBPcHRpb24oJy0tZGlzYWJsZS1jcm9zcy1kb21haW4nLCAnZXhwZXJpbWVudGFsJykuaGlkZUhlbHAoKSlcbiAgICAgICAgICAgIC5hY3Rpb24oKG9wdHM6IENvbW1hbmRMaW5lT3B0aW9ucykgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMub3B0cyA9IG9wdHM7XG4gICAgICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9wYXRjaEhlbHBPdXRwdXQgKGRlZmF1bHRTdWJDb21tYW5kOiBDb21tYW5kKTogdm9pZCB7XG4gICAgICAgIC8vIE5PVEU6IEluIHRoZSBmdXR1cmUgdmVyc2lvbnMgb2YgdGhlICdjb21tYW5kZXInIG1vZHVsZVxuICAgICAgICAvLyBuZWVkIHRvIGludmVzdGlnYXRlIGhvdyB0byByZW1vdmUgdGhpcyBoYWNrLlxuICAgICAgICAocHJvZ3JhbSBhcyB1bmtub3duIGFzIENvbW1hbmQpLm91dHB1dEhlbHAgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBjb25zdCBzdG9yZWRQYXJlbnQgPSBkZWZhdWx0U3ViQ29tbWFuZC5wYXJlbnQ7XG5cbiAgICAgICAgICAgIGRlZmF1bHRTdWJDb21tYW5kLnBhcmVudCA9IG51bGw7XG5cbiAgICAgICAgICAgIGRlZmF1bHRTdWJDb21tYW5kLm91dHB1dEhlbHAoKTtcblxuICAgICAgICAgICAgZGVmYXVsdFN1YkNvbW1hbmQucGFyZW50ID0gc3RvcmVkUGFyZW50O1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIHByaXZhdGUgX2NoZWNrQW5kQ291bnRSZW1vdGVzIChicm93c2VyOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICAgICAgY29uc3QgcmVtb3RlTWF0Y2ggPSBicm93c2VyLm1hdGNoKFJFTU9URV9BTElBU19SRSk7XG5cbiAgICAgICAgaWYgKHJlbW90ZU1hdGNoKSB7XG4gICAgICAgICAgICB0aGlzLnJlbW90ZUNvdW50ICs9IHBhcnNlSW50KHJlbW90ZU1hdGNoWzFdLCAxMCkgfHwgMTtcblxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIF9wYXJzZUZpbHRlcmluZ09wdGlvbnMgKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBpZiAodGhpcy5vcHRzLnRlc3RHcmVwKVxuICAgICAgICAgICAgdGhpcy5vcHRzLnRlc3RHcmVwID0gZ2V0R3JlcE9wdGlvbnMoJy0tdGVzdC1ncmVwJywgdGhpcy5vcHRzLnRlc3RHcmVwIGFzIHN0cmluZyk7XG5cbiAgICAgICAgaWYgKHRoaXMub3B0cy5maXh0dXJlR3JlcClcbiAgICAgICAgICAgIHRoaXMub3B0cy5maXh0dXJlR3JlcCA9IGdldEdyZXBPcHRpb25zKCctLWZpeHR1cmUtZ3JlcCcsIHRoaXMub3B0cy5maXh0dXJlR3JlcCBhcyBzdHJpbmcpO1xuXG4gICAgICAgIGlmICh0aGlzLm9wdHMudGVzdE1ldGEpXG4gICAgICAgICAgICB0aGlzLm9wdHMudGVzdE1ldGEgPSBhd2FpdCBnZXRNZXRhT3B0aW9ucygnLS10ZXN0LW1ldGEnLCB0aGlzLm9wdHMudGVzdE1ldGEgYXMgc3RyaW5nKTtcblxuICAgICAgICBpZiAodGhpcy5vcHRzLmZpeHR1cmVNZXRhKVxuICAgICAgICAgICAgdGhpcy5vcHRzLmZpeHR1cmVNZXRhID0gYXdhaXQgZ2V0TWV0YU9wdGlvbnMoJy0tZml4dHVyZS1tZXRhJywgdGhpcy5vcHRzLmZpeHR1cmVNZXRhIGFzIHN0cmluZyk7XG5cbiAgICAgICAgdGhpcy5vcHRzLmZpbHRlciA9IGdldEZpbHRlckZuKHRoaXMub3B0cyk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfcGFyc2VBcHBJbml0RGVsYXkgKCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5vcHRzLmFwcEluaXREZWxheSkge1xuICAgICAgICAgICAgYXNzZXJ0VHlwZShpcy5ub25OZWdhdGl2ZU51bWJlclN0cmluZywgbnVsbCwgJ1RoZSB0ZXN0ZWQgYXBwIGluaXRpYWxpemF0aW9uIGRlbGF5JywgdGhpcy5vcHRzLmFwcEluaXREZWxheSk7XG5cbiAgICAgICAgICAgIHRoaXMub3B0cy5hcHBJbml0RGVsYXkgPSBwYXJzZUludCh0aGlzLm9wdHMuYXBwSW5pdERlbGF5IGFzIHN0cmluZywgMTApO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfcGFyc2VTZWxlY3RvclRpbWVvdXQgKCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5vcHRzLnNlbGVjdG9yVGltZW91dCkge1xuICAgICAgICAgICAgYXNzZXJ0VHlwZShpcy5ub25OZWdhdGl2ZU51bWJlclN0cmluZywgbnVsbCwgJ1RoZSBTZWxlY3RvciB0aW1lb3V0JywgdGhpcy5vcHRzLnNlbGVjdG9yVGltZW91dCk7XG5cbiAgICAgICAgICAgIHRoaXMub3B0cy5zZWxlY3RvclRpbWVvdXQgPSBwYXJzZUludCh0aGlzLm9wdHMuc2VsZWN0b3JUaW1lb3V0IGFzIHN0cmluZywgMTApO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfcGFyc2VBc3NlcnRpb25UaW1lb3V0ICgpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMub3B0cy5hc3NlcnRpb25UaW1lb3V0KSB7XG4gICAgICAgICAgICBhc3NlcnRUeXBlKGlzLm5vbk5lZ2F0aXZlTnVtYmVyU3RyaW5nLCBudWxsLCAnVGhlIGFzc2VydGlvbiB0aW1lb3V0JywgdGhpcy5vcHRzLmFzc2VydGlvblRpbWVvdXQpO1xuXG4gICAgICAgICAgICB0aGlzLm9wdHMuYXNzZXJ0aW9uVGltZW91dCA9IHBhcnNlSW50KHRoaXMub3B0cy5hc3NlcnRpb25UaW1lb3V0IGFzIHN0cmluZywgMTApO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfcGFyc2VQYWdlTG9hZFRpbWVvdXQgKCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5vcHRzLnBhZ2VMb2FkVGltZW91dCkge1xuICAgICAgICAgICAgYXNzZXJ0VHlwZShpcy5ub25OZWdhdGl2ZU51bWJlclN0cmluZywgbnVsbCwgJ1RoZSBwYWdlIGxvYWQgdGltZW91dCcsIHRoaXMub3B0cy5wYWdlTG9hZFRpbWVvdXQpO1xuXG4gICAgICAgICAgICB0aGlzLm9wdHMucGFnZUxvYWRUaW1lb3V0ID0gcGFyc2VJbnQodGhpcy5vcHRzLnBhZ2VMb2FkVGltZW91dCBhcyBzdHJpbmcsIDEwKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgX3BhcnNlUGFnZVJlcXVlc3RUaW1lb3V0ICgpOiB2b2lkIHtcbiAgICAgICAgaWYgKCF0aGlzLm9wdHMucGFnZVJlcXVlc3RUaW1lb3V0KVxuICAgICAgICAgICAgcmV0dXJuO1xuXG4gICAgICAgIGFzc2VydFR5cGUoaXMubm9uTmVnYXRpdmVOdW1iZXJTdHJpbmcsIG51bGwsICdUaGUgcGFnZSByZXF1ZXN0IHRpbWVvdXQnLCB0aGlzLm9wdHMucGFnZVJlcXVlc3RUaW1lb3V0KTtcblxuICAgICAgICB0aGlzLm9wdHMucGFnZVJlcXVlc3RUaW1lb3V0ID0gcGFyc2VJbnQodGhpcy5vcHRzLnBhZ2VSZXF1ZXN0VGltZW91dCBhcyBzdHJpbmcsIDEwKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9wYXJzZUFqYXhSZXF1ZXN0VGltZW91dCAoKTogdm9pZCB7XG4gICAgICAgIGlmICghdGhpcy5vcHRzLmFqYXhSZXF1ZXN0VGltZW91dClcbiAgICAgICAgICAgIHJldHVybjtcblxuICAgICAgICBhc3NlcnRUeXBlKGlzLm5vbk5lZ2F0aXZlTnVtYmVyU3RyaW5nLCBudWxsLCAnVGhlIEFKQVggcmVxdWVzdCB0aW1lb3V0JywgdGhpcy5vcHRzLmFqYXhSZXF1ZXN0VGltZW91dCk7XG5cbiAgICAgICAgdGhpcy5vcHRzLmFqYXhSZXF1ZXN0VGltZW91dCA9IHBhcnNlSW50KHRoaXMub3B0cy5hamF4UmVxdWVzdFRpbWVvdXQgYXMgc3RyaW5nLCAxMCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfcGFyc2VCcm93c2VySW5pdFRpbWVvdXQgKCk6IHZvaWQge1xuICAgICAgICBpZiAoIXRoaXMub3B0cy5icm93c2VySW5pdFRpbWVvdXQpXG4gICAgICAgICAgICByZXR1cm47XG5cbiAgICAgICAgYXNzZXJ0VHlwZShpcy5ub25OZWdhdGl2ZU51bWJlclN0cmluZywgbnVsbCwgJ1RoZSBicm93c2VyIGluaXRpYWxpemF0aW9uIHRpbWVvdXQnLCB0aGlzLm9wdHMuYnJvd3NlckluaXRUaW1lb3V0KTtcblxuICAgICAgICB0aGlzLm9wdHMuYnJvd3NlckluaXRUaW1lb3V0ID0gcGFyc2VJbnQodGhpcy5vcHRzLmJyb3dzZXJJbml0VGltZW91dCBhcyBzdHJpbmcsIDEwKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9wYXJzZVRlc3RFeGVjdXRpb25UaW1lb3V0ICgpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMub3B0cy50ZXN0RXhlY3V0aW9uVGltZW91dCkge1xuICAgICAgICAgICAgYXNzZXJ0VHlwZShpcy5ub25OZWdhdGl2ZU51bWJlclN0cmluZywgbnVsbCwgJ1RoZSB0ZXN0IGV4ZWN1dGlvbiB0aW1lb3V0JywgdGhpcy5vcHRzLnRlc3RFeGVjdXRpb25UaW1lb3V0KTtcblxuICAgICAgICAgICAgdGhpcy5vcHRzLnRlc3RFeGVjdXRpb25UaW1lb3V0ID0gcGFyc2VJbnQodGhpcy5vcHRzLnRlc3RFeGVjdXRpb25UaW1lb3V0IGFzIHN0cmluZywgMTApO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfcGFyc2VSdW5FeGVjdXRpb25UaW1lb3V0ICgpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMub3B0cy5ydW5FeGVjdXRpb25UaW1lb3V0KSB7XG4gICAgICAgICAgICBhc3NlcnRUeXBlKGlzLm5vbk5lZ2F0aXZlTnVtYmVyU3RyaW5nLCBudWxsLCAnVGhlIHJ1biBleGVjdXRpb24gdGltZW91dCcsIHRoaXMub3B0cy5ydW5FeGVjdXRpb25UaW1lb3V0KTtcblxuICAgICAgICAgICAgdGhpcy5vcHRzLnJ1bkV4ZWN1dGlvblRpbWVvdXQgPSBwYXJzZUludCh0aGlzLm9wdHMucnVuRXhlY3V0aW9uVGltZW91dCBhcyBzdHJpbmcsIDEwKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgX3BhcnNlU3BlZWQgKCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5vcHRzLnNwZWVkKVxuICAgICAgICAgICAgdGhpcy5vcHRzLnNwZWVkID0gcGFyc2VGbG9hdCh0aGlzLm9wdHMuc3BlZWQgYXMgc3RyaW5nKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9wYXJzZUNvbmN1cnJlbmN5ICgpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMub3B0cy5jb25jdXJyZW5jeSlcbiAgICAgICAgICAgIHRoaXMub3B0cy5jb25jdXJyZW5jeSA9IHBhcnNlSW50KHRoaXMub3B0cy5jb25jdXJyZW5jeSBhcyBzdHJpbmcsIDEwKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIF9wYXJzZVF1YXJhbnRpbmVPcHRpb25zICgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgaWYgKHRoaXMub3B0cy5xdWFyYW50aW5lTW9kZSAhPT0gdm9pZCAwKVxuICAgICAgICAgICAgdGhpcy5vcHRzLnF1YXJhbnRpbmVNb2RlID0gYXdhaXQgZ2V0UXVhcmFudGluZU9wdGlvbnMoJy0tcXVhcmFudGluZS1tb2RlJywgdGhpcy5vcHRzLnF1YXJhbnRpbmVNb2RlKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIF9wYXJzZVNraXBKc0Vycm9yc09wdGlvbnMgKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBpZiAodGhpcy5vcHRzLnNraXBKc0Vycm9ycyAhPT0gdm9pZCAwKVxuICAgICAgICAgICAgdGhpcy5vcHRzLnNraXBKc0Vycm9ycyA9IGF3YWl0IGdldFNraXBKc0Vycm9yc09wdGlvbnMoJy0tc2tpcC1qcy1lcnJvcnMnLCB0aGlzLm9wdHMuc2tpcEpzRXJyb3JzKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9wYXJzZVBvcnRzICgpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMub3B0cy5wb3J0cykge1xuICAgICAgICAgICAgY29uc3QgcGFyc2VkUG9ydHMgPSAodGhpcy5vcHRzLnBvcnRzIGFzIHN0cmluZykgLyogZXNsaW50LWRpc2FibGUtbGluZSBuby1leHRyYS1wYXJlbnMgKi9cbiAgICAgICAgICAgICAgICAuc3BsaXQoJywnKVxuICAgICAgICAgICAgICAgIC5tYXAocGFyc2VQb3J0TnVtYmVyKTtcblxuICAgICAgICAgICAgaWYgKHBhcnNlZFBvcnRzLmxlbmd0aCA8IDIpXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEdlbmVyYWxFcnJvcihSVU5USU1FX0VSUk9SUy5wb3J0c09wdGlvblJlcXVpcmVzVHdvTnVtYmVycyk7XG5cbiAgICAgICAgICAgIHRoaXMub3B0cy5wb3J0cyA9IHBhcnNlZFBvcnRzIGFzIG51bWJlcltdO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfcGFyc2VCcm93c2Vyc0Zyb21BcmdzICgpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgYnJvd3NlcnNBcmcgPSB0aGlzLnRlc3RDYWZlQ29tbWFuZC5hcmdzWzBdIHx8ICcnO1xuXG4gICAgICAgIHRoaXMub3B0cy5icm93c2VycyA9IHNwbGl0UXVvdGVkVGV4dChicm93c2Vyc0FyZywgJywnKVxuICAgICAgICAgICAgLmZpbHRlcihicm93c2VyID0+IGJyb3dzZXIgJiYgdGhpcy5fY2hlY2tBbmRDb3VudFJlbW90ZXMoYnJvd3NlcikpO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBfcGFyc2VTc2xPcHRpb25zICgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgaWYgKHRoaXMub3B0cy5zc2wpXG4gICAgICAgICAgICB0aGlzLm9wdHMuc3NsID0gYXdhaXQgZ2V0U1NMT3B0aW9ucyh0aGlzLm9wdHMuc3NsIGFzIHN0cmluZyk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBfcGFyc2VSZXBvcnRlcnMgKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBjb25zdCByZXBvcnRlcnMgPSB0aGlzLm9wdHMucmVwb3J0ZXIgPyAodGhpcy5vcHRzLnJlcG9ydGVyIGFzIHN0cmluZykuc3BsaXQoJywnKSA6IFtdOyAvKiBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLWV4dHJhLXBhcmVucyovXG5cbiAgICAgICAgdGhpcy5vcHRzLnJlcG9ydGVyID0gcmVwb3J0ZXJzLm1hcCgocmVwb3J0ZXI6IHN0cmluZykgPT4ge1xuICAgICAgICAgICAgY29uc3Qgc2VwYXJhdG9ySW5kZXggPSByZXBvcnRlci5pbmRleE9mKCc6Jyk7XG5cbiAgICAgICAgICAgIGlmIChzZXBhcmF0b3JJbmRleCA8IDApXG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgbmFtZTogcmVwb3J0ZXIgfTtcblxuICAgICAgICAgICAgY29uc3QgbmFtZSAgID0gcmVwb3J0ZXIuc3Vic3RyaW5nKDAsIHNlcGFyYXRvckluZGV4KTtcbiAgICAgICAgICAgIGNvbnN0IG91dHB1dCA9IHJlcG9ydGVyLnN1YnN0cmluZyhzZXBhcmF0b3JJbmRleCArIDEpO1xuXG4gICAgICAgICAgICByZXR1cm4geyBuYW1lLCBvdXRwdXQgfTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfcGFyc2VGaWxlTGlzdCAoKTogdm9pZCB7XG4gICAgICAgIHRoaXMub3B0cy5zcmMgPSB0aGlzLnRlc3RDYWZlQ29tbWFuZC5hcmdzLnNsaWNlKDEpO1xuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgX3BhcnNlU2NyZWVuc2hvdE9wdGlvbnMgKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBpZiAodGhpcy5vcHRzLnNjcmVlbnNob3RzKVxuICAgICAgICAgICAgdGhpcy5vcHRzLnNjcmVlbnNob3RzID0gYXdhaXQgZ2V0U2NyZWVuc2hvdE9wdGlvbnModGhpcy5vcHRzLnNjcmVlbnNob3RzKTtcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgdGhpcy5vcHRzLnNjcmVlbnNob3RzID0ge307XG5cbiAgICAgICAgaWYgKCFoYXModGhpcy5vcHRzLnNjcmVlbnNob3RzLCBTQ1JFRU5TSE9UX09QVElPTl9OQU1FUy5wYXRoUGF0dGVybikgJiYgdGhpcy5vcHRzLnNjcmVlbnNob3RQYXRoUGF0dGVybilcbiAgICAgICAgICAgIHRoaXMub3B0cy5zY3JlZW5zaG90c1tTQ1JFRU5TSE9UX09QVElPTl9OQU1FUy5wYXRoUGF0dGVybl0gPSB0aGlzLm9wdHMuc2NyZWVuc2hvdFBhdGhQYXR0ZXJuO1xuXG4gICAgICAgIGlmICghaGFzKHRoaXMub3B0cy5zY3JlZW5zaG90cywgU0NSRUVOU0hPVF9PUFRJT05fTkFNRVMudGFrZU9uRmFpbHMpICYmIHRoaXMub3B0cy5zY3JlZW5zaG90c09uRmFpbHMpXG4gICAgICAgICAgICB0aGlzLm9wdHMuc2NyZWVuc2hvdHNbU0NSRUVOU0hPVF9PUFRJT05fTkFNRVMudGFrZU9uRmFpbHNdID0gdGhpcy5vcHRzLnNjcmVlbnNob3RzT25GYWlscztcbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIF9wYXJzZVZpZGVvT3B0aW9ucyAoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGlmICh0aGlzLm9wdHMudmlkZW9PcHRpb25zKVxuICAgICAgICAgICAgdGhpcy5vcHRzLnZpZGVvT3B0aW9ucyA9IGF3YWl0IGdldFZpZGVvT3B0aW9ucyh0aGlzLm9wdHMudmlkZW9PcHRpb25zIGFzIHN0cmluZyk7XG5cbiAgICAgICAgaWYgKHRoaXMub3B0cy52aWRlb0VuY29kaW5nT3B0aW9ucylcbiAgICAgICAgICAgIHRoaXMub3B0cy52aWRlb0VuY29kaW5nT3B0aW9ucyA9IGF3YWl0IGdldFZpZGVvT3B0aW9ucyh0aGlzLm9wdHMudmlkZW9FbmNvZGluZ09wdGlvbnMgYXMgc3RyaW5nKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIF9wYXJzZUNvbXBpbGVyT3B0aW9ucyAoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGlmICghdGhpcy5vcHRzLmNvbXBpbGVyT3B0aW9ucylcbiAgICAgICAgICAgIHJldHVybjtcblxuICAgICAgICBjb25zdCBwYXJzZWRDb21waWxlck9wdGlvbnMgPSBhd2FpdCBnZXRDb21waWxlck9wdGlvbnModGhpcy5vcHRzLmNvbXBpbGVyT3B0aW9ucyBhcyBzdHJpbmcpO1xuICAgICAgICBjb25zdCByZXN1bHRDb21waWxlck9wdGlvbnMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuXG4gICAgICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHBhcnNlZENvbXBpbGVyT3B0aW9ucykpXG4gICAgICAgICAgICBzZXQocmVzdWx0Q29tcGlsZXJPcHRpb25zLCBrZXksIHZhbHVlKTtcblxuICAgICAgICB0aGlzLm9wdHMuY29tcGlsZXJPcHRpb25zID0gcmVzdWx0Q29tcGlsZXJPcHRpb25zO1xuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgX3BhcnNlRGFzaGJvYXJkT3B0aW9ucyAoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGlmICh0aGlzLm9wdHMuZGFzaGJvYXJkT3B0aW9ucylcbiAgICAgICAgICAgIHRoaXMub3B0cy5kYXNoYm9hcmRPcHRpb25zID0gYXdhaXQgZ2V0RGFzaGJvYXJkT3B0aW9ucyh0aGlzLm9wdHMuZGFzaGJvYXJkT3B0aW9ucyBhcyBzdHJpbmcpO1xuICAgIH1cblxuICAgIHByaXZhdGUgX3BhcnNlTGlzdEJyb3dzZXJzICgpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgbGlzdEJyb3dzZXJPcHRpb24gPSB0aGlzLm9wdHMubGlzdEJyb3dzZXJzO1xuXG4gICAgICAgIHRoaXMub3B0cy5saXN0QnJvd3NlcnMgPSAhIXRoaXMub3B0cy5saXN0QnJvd3NlcnM7XG5cbiAgICAgICAgaWYgKCF0aGlzLm9wdHMubGlzdEJyb3dzZXJzKVxuICAgICAgICAgICAgcmV0dXJuO1xuXG4gICAgICAgIHRoaXMub3B0cy5wcm92aWRlck5hbWUgPSB0eXBlb2YgbGlzdEJyb3dzZXJPcHRpb24gPT09ICdzdHJpbmcnID8gbGlzdEJyb3dzZXJPcHRpb24gOiAnbG9jYWxseS1pbnN0YWxsZWQnO1xuICAgIH1cblxuICAgIHByaXZhdGUgc3RhdGljIF9wcmVwYXJlQm9vbGVhbk9yT2JqZWN0T3B0aW9uIChhcmd2OiBzdHJpbmdbXSwgb3B0aW9uTmFtZXM6IHN0cmluZ1tdLCBzdWJPcHRpb25zTmFtZXM6IHN0cmluZ1tdKTogdm9pZCB7XG4gICAgICAgIC8vIE5PVEU6IG1vdmUgb3B0aW9ucyB0byB0aGUgZW5kIG9mIHRoZSBhcnJheSB0byBjb3JyZWN0bHkgcGFyc2UgYm90aCBCb29sZWFuIGFuZCBPYmplY3QgdHlwZSBhcmd1bWVudHMgKEdILTYyMzEpXG4gICAgICAgIGNvbnN0IG9wdGlvbkluZGV4ID0gYXJndi5maW5kSW5kZXgoXG4gICAgICAgICAgICBlbCA9PiBvcHRpb25OYW1lcy5zb21lKG9wdCA9PiBlbC5zdGFydHNXaXRoKG9wdCkpKTtcblxuICAgICAgICBpZiAob3B0aW9uSW5kZXggPiAtMSAmJiBzaG91bGRNb3ZlT3B0aW9uVG9FbmQoYXJndiwgb3B0aW9uSW5kZXgsIHN1Yk9wdGlvbnNOYW1lcykpXG4gICAgICAgICAgICBhcmd2LnB1c2goYXJndi5zcGxpY2Uob3B0aW9uSW5kZXgsIDEpWzBdKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgcGFyc2UgKGFyZ3Y6IHN0cmluZ1tdKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIENMSUFyZ3VtZW50UGFyc2VyLl9wcmVwYXJlQm9vbGVhbk9yT2JqZWN0T3B0aW9uKGFyZ3YsIFsnLXEnLCAnLS1xdWFyYW50aW5lLW1vZGUnXSwgT2JqZWN0LnZhbHVlcyhRVUFSQU5USU5FX09QVElPTl9OQU1FUykpO1xuICAgICAgICBDTElBcmd1bWVudFBhcnNlci5fcHJlcGFyZUJvb2xlYW5Pck9iamVjdE9wdGlvbihhcmd2LCBbJy1lJywgJy0tc2tpcC1qcy1lcnJvcnMnXSwgT2JqZWN0LnZhbHVlcyhTS0lQX0pTX0VSUk9SU19PUFRJT05TX09CSkVDVF9PUFRJT05fTkFNRVMpKTtcblxuICAgICAgICBjb25zdCB7IGFyZ3MsIHY4RmxhZ3MgfSA9IGV4dHJhY3ROb2RlUHJvY2Vzc0FyZ3VtZW50cyhhcmd2KTtcblxuICAgICAgICAocHJvZ3JhbSBhcyB1bmtub3duIGFzIENvbW1hbmQpLnBhcnNlKGFyZ3MpO1xuXG4gICAgICAgIHRoaXMuYXJncyA9IChwcm9ncmFtIGFzIHVua25vd24gYXMgQ29tbWFuZCkuYXJncztcbiAgICAgICAgdGhpcy5vcHRzID0gT2JqZWN0LmFzc2lnbih0aGlzLm9wdHMsIHsgdjhGbGFncyB9KTtcblxuICAgICAgICB0aGlzLl9wYXJzZUxpc3RCcm93c2VycygpO1xuXG4gICAgICAgIC8vIE5PVEU6IHRoZSAnLS1saXN0LWJyb3dzZXJzJyBvcHRpb24gb25seSBsaXN0cyBicm93c2VycyBhbmQgaW1tZWRpYXRlbHkgZXhpdHMgdGhlIGFwcC5cbiAgICAgICAgLy8gVGhlcmVmb3JlLCB3ZSBkb24ndCBuZWVkIHRvIHByb2Nlc3Mgb3RoZXIgYXJndW1lbnRzLlxuICAgICAgICBpZiAodGhpcy5vcHRzLmxpc3RCcm93c2VycylcbiAgICAgICAgICAgIHJldHVybjtcblxuICAgICAgICB0aGlzLl9wYXJzZVNlbGVjdG9yVGltZW91dCgpO1xuICAgICAgICB0aGlzLl9wYXJzZUFzc2VydGlvblRpbWVvdXQoKTtcbiAgICAgICAgdGhpcy5fcGFyc2VQYWdlTG9hZFRpbWVvdXQoKTtcbiAgICAgICAgdGhpcy5fcGFyc2VQYWdlUmVxdWVzdFRpbWVvdXQoKTtcbiAgICAgICAgdGhpcy5fcGFyc2VBamF4UmVxdWVzdFRpbWVvdXQoKTtcbiAgICAgICAgdGhpcy5fcGFyc2VCcm93c2VySW5pdFRpbWVvdXQoKTtcbiAgICAgICAgdGhpcy5fcGFyc2VUZXN0RXhlY3V0aW9uVGltZW91dCgpO1xuICAgICAgICB0aGlzLl9wYXJzZVJ1bkV4ZWN1dGlvblRpbWVvdXQoKTtcbiAgICAgICAgdGhpcy5fcGFyc2VBcHBJbml0RGVsYXkoKTtcbiAgICAgICAgdGhpcy5fcGFyc2VTcGVlZCgpO1xuICAgICAgICB0aGlzLl9wYXJzZVBvcnRzKCk7XG4gICAgICAgIHRoaXMuX3BhcnNlQnJvd3NlcnNGcm9tQXJncygpO1xuICAgICAgICB0aGlzLl9wYXJzZUNvbmN1cnJlbmN5KCk7XG4gICAgICAgIHRoaXMuX3BhcnNlRmlsZUxpc3QoKTtcblxuICAgICAgICBhd2FpdCB0aGlzLl9wYXJzZUZpbHRlcmluZ09wdGlvbnMoKTtcbiAgICAgICAgYXdhaXQgdGhpcy5fcGFyc2VRdWFyYW50aW5lT3B0aW9ucygpO1xuICAgICAgICBhd2FpdCB0aGlzLl9wYXJzZVNraXBKc0Vycm9yc09wdGlvbnMoKTtcbiAgICAgICAgYXdhaXQgdGhpcy5fcGFyc2VTY3JlZW5zaG90T3B0aW9ucygpO1xuICAgICAgICBhd2FpdCB0aGlzLl9wYXJzZVZpZGVvT3B0aW9ucygpO1xuICAgICAgICBhd2FpdCB0aGlzLl9wYXJzZUNvbXBpbGVyT3B0aW9ucygpO1xuICAgICAgICBhd2FpdCB0aGlzLl9wYXJzZVNzbE9wdGlvbnMoKTtcbiAgICAgICAgYXdhaXQgdGhpcy5fcGFyc2VSZXBvcnRlcnMoKTtcbiAgICAgICAgYXdhaXQgdGhpcy5fcGFyc2VEYXNoYm9hcmRPcHRpb25zKCk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldFJ1bk9wdGlvbnMgKCk6IFJ1bm5lclJ1bk9wdGlvbnMge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuXG4gICAgICAgIFJVTl9PUFRJT05fTkFNRVMuZm9yRWFjaChvcHRpb25OYW1lID0+IHtcbiAgICAgICAgICAgIGlmIChvcHRpb25OYW1lIGluIHRoaXMub3B0cylcbiAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlIGEgaGFjayB0byBhZGQgYW4gaW5kZXggc2lnbmF0dXJlIHRvIGludGVyZmFjZVxuICAgICAgICAgICAgICAgIHJlc3VsdFtvcHRpb25OYW1lXSA9IHRoaXMub3B0c1tvcHRpb25OYW1lXTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIHJlc3VsdCBhcyBSdW5uZXJSdW5PcHRpb25zO1xuICAgIH1cbn1cbiJdfQ==
|
|
379
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvY2xpL2FyZ3VtZW50LXBhcnNlci9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsbUNBQWtDO0FBRWxDLHVEQUdtQjtBQUVuQixvREFBNEI7QUFDNUIsa0RBQW9EO0FBQ3BELDhDQUFvRDtBQUNwRCwwRUFBc0U7QUFDdEUsd0ZBQThEO0FBQzlELCtDQUErRDtBQUMvRCx5REFTaUM7QUFFakMsOEVBQW9EO0FBQ3BELDBHQUFrRjtBQUNsRiw0RkFBb0U7QUFNcEUsMEdBQWtGO0FBQ2xGLG9FQUF1RTtBQUN2RSw0RkFBa0U7QUFDbEUsK0NBQTJEO0FBQzNELG9FQUE0QztBQUM1QyxpR0FBNkc7QUFDN0csbUdBQXVFO0FBRXZFLE1BQU0sZUFBZSxHQUFHLHFCQUFxQixDQUFDO0FBRTlDLE1BQU0sV0FBVyxHQUFHLElBQUEsZ0JBQU0sRUFBQzs7Ozs7Ozs7Ozs7Q0FXMUIsQ0FBQyxDQUFDO0FBd0NILE1BQXFCLGlCQUFpQjtJQU9sQyxZQUFvQixHQUFZO1FBQzVCLElBQUksQ0FBQyxHQUFHLEdBQVcsR0FBRyxJQUFJLE9BQU8sQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUN4QyxJQUFJLENBQUMsV0FBVyxHQUFHLENBQUMsQ0FBQztRQUNyQixJQUFJLENBQUMsSUFBSSxHQUFVLEVBQUUsQ0FBQztRQUN0QixJQUFJLENBQUMsSUFBSSxHQUFVLEVBQUUsQ0FBQztRQUV0QixJQUFJLENBQUMsZUFBZSxHQUFHLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO1FBRWxELElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUM7UUFDNUMsaUJBQWlCLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztJQUMxQyxDQUFDO0lBRU8sTUFBTSxDQUFDLGlCQUFpQjtRQUM1Qix3RUFBd0U7UUFDeEUsZ0ZBQWdG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QUcsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUNuRCxDQUFDLENBQUMsQ0FBQztRQUVILE9BQU8sTUFBMEIsQ0FBQztJQUN0QyxDQUFDO0NBQ0o7QUF6WkQsb0NBeVpDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgaGFzLCBzZXQgfSBmcm9tICdsb2Rhc2gnO1xuXG5pbXBvcnQgcHJvZ3JhbSwge1xuICAgIENvbW1hbmQsXG4gICAgT3B0aW9uLFxufSBmcm9tICdjb21tYW5kZXInO1xuXG5pbXBvcnQgZGVkZW50IGZyb20gJ2RlZGVudCc7XG5pbXBvcnQgeyBHZW5lcmFsRXJyb3IgfSBmcm9tICcuLi8uLi9lcnJvcnMvcnVudGltZSc7XG5pbXBvcnQgeyBSVU5USU1FX0VSUk9SUyB9IGZyb20gJy4uLy4uL2Vycm9ycy90eXBlcyc7XG5pbXBvcnQgeyBhc3NlcnRUeXBlLCBpcyB9IGZyb20gJy4uLy4uL2Vycm9ycy9ydW50aW1lL3R5cGUtYXNzZXJ0aW9ucyc7XG5pbXBvcnQgZ2V0Vmlld1BvcnRXaWR0aCBmcm9tICcuLi8uLi91dGlscy9nZXQtdmlld3BvcnQtd2lkdGgnO1xuaW1wb3J0IHsgd29yZFdyYXAsIHNwbGl0UXVvdGVkVGV4dCB9IGZyb20gJy4uLy4uL3V0aWxzL3N0cmluZyc7XG5pbXBvcnQge1xuICAgIGdldFNTTE9wdGlvbnMsXG4gICAgZ2V0UXVhcmFudGluZU9wdGlvbnMsXG4gICAgZ2V0U2NyZWVuc2hvdE9wdGlvbnMsXG4gICAgZ2V0U2tpcEpzRXJyb3JzT3B0aW9ucyxcbiAgICBnZXRWaWRlb09wdGlvbnMsXG4gICAgZ2V0TWV0YU9wdGlvbnMsXG4gICAgZ2V0R3JlcE9wdGlvbnMsXG4gICAgZ2V0Q29tcGlsZXJPcHRpb25zLFxufSBmcm9tICcuLi8uLi91dGlscy9nZXQtb3B0aW9ucyc7XG5cbmltcG9ydCBnZXRGaWx0ZXJGbiBmcm9tICcuLi8uLi91dGlscy9nZXQtZmlsdGVyLWZuJztcbmltcG9ydCBTQ1JFRU5TSE9UX09QVElPTl9OQU1FUyBmcm9tICcuLi8uLi9jb25maWd1cmF0aW9uL3NjcmVlbnNob3Qtb3B0aW9uLW5hbWVzJztcbmltcG9ydCBSVU5fT1BUSU9OX05BTUVTIGZyb20gJy4uLy4uL2NvbmZpZ3VyYXRpb24vcnVuLW9wdGlvbi1uYW1lcyc7XG5pbXBvcnQge1xuICAgIERpY3Rpb25hcnksXG4gICAgUmVwb3J0ZXJPcHRpb24sXG4gICAgUnVubmVyUnVuT3B0aW9ucyxcbn0gZnJvbSAnLi4vLi4vY29uZmlndXJhdGlvbi9pbnRlcmZhY2VzJztcbmltcG9ydCBRVUFSQU5USU5FX09QVElPTl9OQU1FUyBmcm9tICcuLi8uLi9jb25maWd1cmF0aW9uL3F1YXJhbnRpbmUtb3B0aW9uLW5hbWVzJztcbmltcG9ydCB7IGV4dHJhY3ROb2RlUHJvY2Vzc0FyZ3VtZW50cyB9IGZyb20gJy4uL25vZGUtYXJndW1lbnRzLWZpbHRlcic7XG5pbXBvcnQgZ2V0VGVzdENhZmVWZXJzaW9uIGZyb20gJy4uLy4uL3V0aWxzL2dldC10ZXN0Y2FmZS12ZXJzaW9uJztcbmltcG9ydCB7IHBhcnNlUG9ydE51bWJlciwgcGFyc2VMaXN0IH0gZnJvbSAnLi9wYXJzZS11dGlscyc7XG5pbXBvcnQgQ09NTUFORF9OQU1FUyBmcm9tICcuL2NvbW1hbmQtbmFtZXMnO1xuaW1wb3J0IHsgU0tJUF9KU19FUlJPUlNfT1BUSU9OU19PQkpFQ1RfT1BUSU9OX05BTUVTIH0gZnJvbSAnLi4vLi4vY29uZmlndXJhdGlvbi9za2lwLWpzLWVycm9ycy1vcHRpb24tbmFtZXMnO1xuaW1wb3J0IHNob3VsZE1vdmVPcHRpb25Ub0VuZCBmcm9tICcuLi91dGlscy9zaG91bGQtbW92ZS1vcHRpb24tdG8tZW5kJztcblxuY29uc3QgUkVNT1RFX0FMSUFTX1JFID0gL15yZW1vdGUoPzo6KFxcZCopKT8kLztcblxuY29uc3QgREVTQ1JJUFRJT04gPSBkZWRlbnQoYFxuXG4gICAgVG8gc2VsZWN0IGEgYnJvd3Nlciwgc3BlY2lmeSBhbiBhbGlhcyAoXCJlZGdlXCIsIFwiY2hyb21lXCIsIGV0Yy4pIG9yIHRoZSBwYXRoIHRvIHRoZSBicm93c2VyIGV4ZWN1dGFibGUuIFlvdSBjYW4gc2VsZWN0IG1vcmUgdGhhbiBvbmUgYnJvd3Nlci5cblxuICAgIFVzZSB0aGUgXCJhbGxcIiBhbGlhcyB0byBydW4gdGVzdHMgYWdhaW5zdCBhbGwgYXZhaWxhYmxlIGJyb3dzZXJzLlxuICAgIFVzZSB0aGUgXCJyZW1vdGVcIiBhbGlhcyB0byBydW4gdGVzdHMgb24gcmVtb3RlIGRldmljZXMsIGxpa2Ugc21hcnRwaG9uZXMgb3IgdGFibGV0cy4gU3BlY2lmeSB0aGUgbnVtYmVyIG9mIHJlbW90ZSBicm93c2VycyBhZnRlciB0aGUgc2VtaWNvbG9uIChcInJlbW90ZTozXCIpLlxuICAgIElmIHlvdSB1c2UgYSBicm93c2VyIHByb3ZpZGVyIHBsdWdpbiwgc3BlY2lmeSBib3RoIHRoZSBuYW1lIG9mIHRoZSBwbHVnaW4gYW5kIHRoZSBuYW1lIG9mIHRoZSBicm93c2VyLiBTZXBhcmF0ZSB0aGUgdHdvIHdpdGggYSBzZW1pY29sb24gKFwic2F1Y2VsYWJzOmNocm9tZUA1MVwiKS5cblxuICAgIFRvIGV4ZWN1dGUgbXVsdGlwbGUgdGVzdCBmaWxlcywgc3BlY2lmeSBtdWx0aXBsZSBmaWxlIHBhdGhzIG9yIGdsb2IgcGF0dGVybnMuXG5cbiAgICBGdWxsIGRvY3VtZW50YXRpb246IGh0dHBzOi8vdGVzdGNhZmUuaW8vZG9jdW1lbnRhdGlvbi80MDI2MzkvcmVmZXJlbmNlL2NvbW1hbmQtbGluZS1pbnRlcmZhY2VcbmApO1xuXG5pbnRlcmZhY2UgQ29tbWFuZExpbmVPcHRpb25zIHtcbiAgICB0ZXN0R3JlcD86IHN0cmluZyB8IFJlZ0V4cDtcbiAgICBmaXh0dXJlR3JlcD86IHN0cmluZyB8IFJlZ0V4cDtcbiAgICBzcmM/OiBzdHJpbmdbXTtcbiAgICBicm93c2Vycz86IHN0cmluZ1tdO1xuICAgIGxpc3RCcm93c2Vycz86IGJvb2xlYW4gfCBzdHJpbmc7XG4gICAgdGVzdE1ldGE/OiBzdHJpbmcgfCBEaWN0aW9uYXJ5PHN0cmluZyB8IG51bWJlciB8IGJvb2xlYW4+O1xuICAgIGZpeHR1cmVNZXRhPzogc3RyaW5nIHwgRGljdGlvbmFyeTxzdHJpbmcgfCBudW1iZXIgfCBib29sZWFuPjtcbiAgICBmaWx0ZXI/OiBGdW5jdGlvbjtcbiAgICBhcHBJbml0RGVsYXk/OiBzdHJpbmcgfCBudW1iZXI7XG4gICAgYXNzZXJ0aW9uVGltZW91dD86IHN0cmluZyB8IG51bWJlcjtcbiAgICBzZWxlY3RvclRpbWVvdXQ/OiBzdHJpbmcgfCBudW1iZXI7XG4gICAgc3BlZWQ/OiBzdHJpbmcgfCBudW1iZXI7XG4gICAgcGFnZUxvYWRUaW1lb3V0Pzogc3RyaW5nIHwgbnVtYmVyO1xuICAgIHBhZ2VSZXF1ZXN0VGltZW91dD86IHN0cmluZyB8IG51bWJlcjtcbiAgICBhamF4UmVxdWVzdFRpbWVvdXQ/OiBzdHJpbmcgfCBudW1iZXI7XG4gICAgYnJvd3NlckluaXRUaW1lb3V0Pzogc3RyaW5nIHwgbnVtYmVyO1xuICAgIHRlc3RFeGVjdXRpb25UaW1lb3V0Pzogc3RyaW5nIHwgbnVtYmVyO1xuICAgIHJ1bkV4ZWN1dGlvblRpbWVvdXQ/OiBzdHJpbmcgfCBudW1iZXI7XG4gICAgY29uY3VycmVuY3k/OiBzdHJpbmcgfCBudW1iZXI7XG4gICAgcXVhcmFudGluZU1vZGU/OiBib29sZWFuIHwgRGljdGlvbmFyeTxzdHJpbmcgfCBudW1iZXI+O1xuICAgIHBvcnRzPzogc3RyaW5nIHwgbnVtYmVyW107XG4gICAgcHJvdmlkZXJOYW1lPzogc3RyaW5nO1xuICAgIHNzbD86IHN0cmluZyB8IERpY3Rpb25hcnk8c3RyaW5nIHwgbnVtYmVyIHwgYm9vbGVhbj47XG4gICAgcmVwb3J0ZXI/OiBzdHJpbmcgfCBSZXBvcnRlck9wdGlvbltdO1xuICAgIHNjcmVlbnNob3RzPzogRGljdGlvbmFyeTxzdHJpbmcgfCBudW1iZXIgfCBib29sZWFuPiB8IHN0cmluZztcbiAgICBzY3JlZW5zaG90UGF0aFBhdHRlcm4/OiBzdHJpbmc7XG4gICAgc2NyZWVuc2hvdHNPbkZhaWxzPzogYm9vbGVhbjtcbiAgICB2aWRlb09wdGlvbnM/OiBzdHJpbmcgfCBEaWN0aW9uYXJ5PG51bWJlciB8IHN0cmluZyB8IGJvb2xlYW4+O1xuICAgIHZpZGVvRW5jb2RpbmdPcHRpb25zPzogc3RyaW5nIHwgRGljdGlvbmFyeTxudW1iZXIgfCBzdHJpbmcgfCBib29sZWFuPjtcbiAgICBjb21waWxlck9wdGlvbnM/OiBzdHJpbmcgfCBEaWN0aW9uYXJ5PG51bWJlciB8IHN0cmluZyB8IGJvb2xlYW4+O1xuICAgIGNvbmZpZ0ZpbGU/OiBzdHJpbmc7XG4gICAgbmF0aXZlQXV0b21hdGlvbj86IGJvb2xlYW47XG4gICAgdjhGbGFncz86IHN0cmluZ1tdO1xuICAgIGJhc2VVcmw/OiBzdHJpbmc7XG4gICAgc2tpcEpzRXJyb3JzPzogYm9vbGVhbiB8IERpY3Rpb25hcnk8UmVnRXhwIHwgc3RyaW5nPjtcbn1cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQ0xJQXJndW1lbnRQYXJzZXIge1xuICAgIHByaXZhdGUgY3dkOiBzdHJpbmc7XG4gICAgcHJpdmF0ZSByZW1vdGVDb3VudDogbnVtYmVyO1xuICAgIHB1YmxpYyBvcHRzOiBDb21tYW5kTGluZU9wdGlvbnM7XG4gICAgcHVibGljIGFyZ3M6IHN0cmluZ1tdO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgdGVzdENhZmVDb21tYW5kOiBDb21tYW5kO1xuXG4gICAgcHVibGljIGNvbnN0cnVjdG9yIChjd2Q/OiBzdHJpbmcpIHtcbiAgICAgICAgdGhpcy5jd2QgICAgICAgICA9IGN3ZCB8fCBwcm9jZXNzLmN3ZCgpO1xuICAgICAgICB0aGlzLnJlbW90ZUNvdW50ID0gMDtcbiAgICAgICAgdGhpcy5vcHRzICAgICAgICA9IHt9O1xuICAgICAgICB0aGlzLmFyZ3MgICAgICAgID0gW107XG5cbiAgICAgICAgdGhpcy50ZXN0Q2FmZUNvbW1hbmQgPSB0aGlzLl9hZGRUZXN0Q2FmZUNvbW1hbmQoKTtcblxuICAgICAgICB0aGlzLl9wYXRjaEhlbHBPdXRwdXQodGhpcy50ZXN0Q2FmZUNvbW1hbmQpO1xuICAgICAgICBDTElBcmd1bWVudFBhcnNlci5fc2V0dXBSb290Q29tbWFuZCgpO1xuICAgIH1cblxuICAgIHByaXZhdGUgc3RhdGljIF9zZXR1cFJvb3RDb21tYW5kICgpOiB2b2lkIHtcbiAgICAgICAgLy8gTk9URTogV2UgYXJlIGZvcmNlZCB0byBzZXQgdGhlIG5hbWUgb2YgdGhlIHJvb3QgY29tbWFuZCB0byAndGVzdGNhZmUnXG4gICAgICAgIC8vIHRvIGF2b2lkIHRoZSBhdXRvbWF0aWMgY29tbWFuZCBuYW1lIGNhbGN1bGF0aW9uIHVzaW5nIHRoZSBleGVjdXRlZCBmaWxlIHBhdGguXG4gICAgICAgIC8vIEl0J3MgbmVjZXNzYXJ5IHRvIGNvcnJlY3QgY29tbWFuZCBkZXNjcmlwdGlvbiBmb3IgbmVzdGVkIGNvbW1hbmRzLlxuICAgICAgICAocHJvZ3JhbSBhcyB1bmtub3duIGFzIENvbW1hbmQpLm5hbWUoQ09NTUFORF9OQU1FUy5UZXN0Q2FmZSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzdGF0aWMgX3JlbW92ZUNvbW1hbmRJZkV4aXN0cyAobmFtZTogc3RyaW5nKTogdm9pZCB7XG4gICAgICAgIC8vIE5PVEU6IEJ1ZyBpbiB0aGUgJ2NvbW1hbmRlcicgbW9kdWxlLlxuICAgICAgICAvLyBJdCdzIHBvc3NpYmxlIHRvIGFkZCBhIGZldyBjb21tYW5kcyB3aXRoIHRoZSBzYW1lIG5hbWUuXG4gICAgICAgIC8vIEFsc28sIHJlbW92aW5nIGlzIGEgYmV0dGVyIHRoYW4gY29uZGl0aW9uYWxseSBhZGRpbmdcbiAgICAgICAgLy8gYmVjYXVzZSBpdCBhbGxvd3MgYXZvaWRpbmcgdGhlIHBhcnNlZCBvcHRpb24gZHVwbGljYXRlcy5cbiAgICAgICAgY29uc3QgaW5kZXggPSAocHJvZ3JhbSBhcyB1bmtub3duIGFzIENvbW1hbmQpLmNvbW1hbmRzLmZpbmRJbmRleChjbWQgPT4gY21kLm5hbWUoKSA9PT0gbmFtZSk7XG5cbiAgICAgICAgaWYgKGluZGV4ID4gLTEpXG4gICAgICAgICAgICAocHJvZ3JhbSBhcyB1bmtub3duIGFzIENvbW1hbmQpLmNvbW1hbmRzLnNwbGljZShpbmRleCwgMSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzdGF0aWMgX2dldERlc2NyaXB0aW9uICgpOiBzdHJpbmcge1xuICAgICAgICAvLyBOT1RFOiBhZGQgZW1wdHkgbGluZSB0byB3b3JrYXJvdW5kIGNvbW1hbmRlci1mb3JjZWQgaW5kZW50YXRpb24gb24gdGhlIGZpcnN0IGxpbmUuXG4gICAgICAgIHJldHVybiAnXFxuJyArIHdvcmRXcmFwKERFU0NSSVBUSU9OLCAyLCBnZXRWaWV3UG9ydFdpZHRoKHByb2Nlc3Muc3Rkb3V0KSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfYWRkVGVzdENhZmVDb21tYW5kICgpOiBDb21tYW5kIHtcbiAgICAgICAgQ0xJQXJndW1lbnRQYXJzZXIuX3JlbW92ZUNvbW1hbmRJZkV4aXN0cyhDT01NQU5EX05BTUVTLlRlc3RDYWZlKTtcblxuICAgICAgICByZXR1cm4gKHByb2dyYW0gYXMgdW5rbm93biBhcyBDb21tYW5kKVxuICAgICAgICAgICAgLmNvbW1hbmQoQ09NTUFORF9OQU1FUy5UZXN0Q2FmZSwgeyBpc0RlZmF1bHQ6IHRydWUgfSlcbiAgICAgICAgICAgIC52ZXJzaW9uKGdldFRlc3RDYWZlVmVyc2lvbigpLCAnLXYsIC0tdmVyc2lvbicpXG4gICAgICAgICAgICAudXNhZ2UoJ1tvcHRpb25zXSA8Y29tbWEtc2VwYXJhdGVkLWJyb3dzZXItbGlzdD4gPGZpbGUtb3ItZ2xvYiAuLi4+JylcbiAgICAgICAgICAgIC5kZXNjcmlwdGlvbihDTElBcmd1bWVudFBhcnNlci5fZ2V0RGVzY3JpcHRpb24oKSlcblxuICAgICAgICAgICAgLmFsbG93VW5rbm93bk9wdGlvbigpXG4gICAgICAgICAgICAub3B0aW9uKCctYiwgLS1saXN0LWJyb3dzZXJzIFtwcm92aWRlcl0nLCAnZGlzcGxheSB0aGUgbGlzdCBvZiBhbGlhc2VzIGZvciBhdmFpbGFibGUgYnJvd3NlcnMgYW5kIGJyb3dzZXIgcHJvdmlkZXJzJylcbiAgICAgICAgICAgIC5vcHRpb24oJy1yLCAtLXJlcG9ydGVyIDxuYW1lWzpvdXRwdXRGaWxlXVssLi4uXT4nLCAnc3BlY2lmeSByZXBvcnRlcnMgYW5kIHJlcG9ydCBmaWxlbmFtZXMnKVxuICAgICAgICAgICAgLm9wdGlvbignLXMsIC0tc2NyZWVuc2hvdHMgPG9wdGlvbj12YWx1ZVssLi4uXT4nLCAnc3BlY2lmeSBzY3JlZW5zaG90IG9wdGlvbnMnKVxuICAgICAgICAgICAgLm9wdGlvbignLVMsIC0tc2NyZWVuc2hvdHMtb24tZmFpbHMnLCAndGFrZSBhIHNjcmVlbnNob3Qgb24gdGVzdCBmYWlsdXJlJylcbiAgICAgICAgICAgIC5vcHRpb24oJy1wLCAtLXNjcmVlbnNob3QtcGF0aC1wYXR0ZXJuIDxwYXR0ZXJuPicsICdzcGVjaWZ5IHRoZSBuYW1pbmcgc2NoZW1hIGZvciBzY3JlZW5zaG90IGZpbGVuYW1lcyBhbmQgcGF0aHM6ICR7QlJPV1NFUn0sICR7QlJPV1NFUl9WRVJTSU9OfSwgJHtPU30sIGV0Yy4nKVxuICAgICAgICAgICAgLm9wdGlvbignLXEsIC0tcXVhcmFudGluZS1tb2RlIFtvcHRpb249dmFsdWUsLi4uXScsICdlbmFibGUgYW5kIGNvbmZpZ3VyZSBxdWFyYW50aW5lIG1vZGUnKVxuICAgICAgICAgICAgLm9wdGlvbignLWQsIC0tZGVidWctbW9kZScsICdlbmFibGUgZGVidWcgbW9kZS4gV2hlbiB5b3UgcnVuIFRlc3RDYWZlIGluIGRlYnVnIG1vZGUsIGl0IGV4ZWN1dGVzIHRlc3Qgc3RlcHMgb25lIGJ5IG9uZSwgYW5kIHBhdXNlcyB0aGUgdGVzdCBhZnRlciBlYWNoIHN0ZXAuJylcbiAgICAgICAgICAgIC5vcHRpb24oJy1lLCAtLXNraXAtanMtZXJyb3JzIFtvcHRpb249dmFsdWUsLi4uXScsICdpZ25vcmUgSmF2YVNjcmlwdCBlcnJvcnMgdGhhdCBtYXRjaCB0aGUgc3BlY2lmaWVkIGNyaXRlcmlhJylcbiAgICAgICAgICAgIC5vcHRpb24oJy11LCAtLXNraXAtdW5jYXVnaHQtZXJyb3JzJywgJ2lnbm9yZSB1bmNhdWdodCBlcnJvcnMgYW5kIHVuaGFuZGxlZCBwcm9taXNlIHJlamVjdGlvbnMnKVxuICAgICAgICAgICAgLm9wdGlvbignLXQsIC0tdGVzdCA8bmFtZT4nLCAnZmlsdGVyIHRlc3RzIGJ5IG5hbWUnKVxuICAgICAgICAgICAgLm9wdGlvbignLVQsIC0tdGVzdC1ncmVwIDxwYXR0ZXJuPicsICdmaWx0ZXIgdGVzdHMgYnkgcmVndWxhciBleHByZXNzaW9uJylcbiAgICAgICAgICAgIC5vcHRpb24oJy1mLCAtLWZpeHR1cmUgPG5hbWU+JywgJ2ZpbHRlciBmaXh0dXJlcyBieSBuYW1lJylcbiAgICAgICAgICAgIC5vcHRpb24oJy1GLCAtLWZpeHR1cmUtZ3JlcCA8cGF0dGVybj4nLCAnZmlsdGVyIGZpeHR1cmVzIGJ5IHJlZ3VsYXIgZXhwcmVzc2lvbicpXG4gICAgICAgICAgICAub3B0aW9uKCctYSwgLS1hcHAgPGNvbW1hbmQ+JywgJ2V4ZWN1dGUgYSBzaGVsbCBjb21tYW5kIG9uIHN0YXJ0dXAgdG8gbGF1bmNoIGEgd2ViIGFwcGxpY2F0aW9uIG9yIHBlcmZvcm0gb3RoZXIgcHJlcGFyYXRvcnkgdGFza3MnKVxuICAgICAgICAgICAgLm9wdGlvbignLWMsIC0tY29uY3VycmVuY3kgPG51bWJlcj4nLCAncnVuIHRlc3RzIGNvbmN1cnJlbnRseScpXG4gICAgICAgICAgICAub3B0aW9uKCctTCwgLS1saXZlJywgJ2VuYWJsZSBsaXZlIG1vZGUuIExpdmUgbW9kZSByZXN0YXJ0cyB0ZXN0cyB3aGVuIHlvdSBtYWtlIGNoYW5nZXMgdG8gdGVzdCBmaWxlcy4nKVxuICAgICAgICAgICAgLm9wdGlvbignLS10ZXN0LW1ldGEgPGtleT12YWx1ZVssa2V5Mj12YWx1ZTIsLi4uXT4nLCAnZmlsdGVyIHRlc3RzIGJ5IG1ldGFkYXRhJylcbiAgICAgICAgICAgIC5vcHRpb24oJy0tZml4dHVyZS1tZXRhIDxrZXk9dmFsdWVbLGtleTI9dmFsdWUyLC4uLl0+JywgJ2ZpbHRlciBmaXh0dXJlcyBieSBtZXRhZGF0YScpXG4gICAgICAgICAgICAub3B0aW9uKCctLWRlYnVnLW9uLWZhaWwnLCAncGF1c2UgdGVzdHMgb24gZmFpbHVyZScpXG4gICAgICAgICAgICAub3B0aW9uKCctLWRpc2FibGUtbmF0aXZlLWF1dG9tYXRpb24nLCAnZGlzYWJsZSBuYXRpdmUgYXV0b21hdGlvbicpXG4gICAgICAgICAgICAub3B0aW9uKCctLWFwcC1pbml0LWRlbGF5IDxtcz4nLCAnc3BlY2lmeSB5b3VyIGFwcGxpY2F0aW9uYHMgaW5pdGlhbGl6YXRpb24gdGltZScpXG4gICAgICAgICAgICAub3B0aW9uKCctLXNlbGVjdG9yLXRpbWVvdXQgPG1zPicsICdzcGVjaWZ5IHRoZSBtYXhpbXVtIFNlbGVjdG9yIHJlc29sdXRpb24gdGltZScpXG4gICAgICAgICAgICAub3B0aW9uKCctLWFzc2VydGlvbi10aW1lb3V0IDxtcz4nLCAnc3BlY2lmeSB0aGUgbWF4aW11bSBBc3NlcnRpb24gcmVzb2x1dGlvbiB0aW1lJylcbiAgICAgICAgICAgIC5vcHRpb24oJy0tcGFnZS1sb2FkLXRpbWVvdXQgPG1zPicsICdzcGVjaWZ5IHRoZSBtYXhpbXVtIHRpbWUgYmV0d2VlbiB0aGUgd2luZG93LmxvYWQgZXZlbnQgYW5kIHRoZSBET01Db250ZW50TG9hZGVkIGV2ZW50IChtcyknKVxuICAgICAgICAgICAgLm9wdGlvbignLS1wYWdlLXJlcXVlc3QtdGltZW91dCA8bXM+JywgJ3NwZWNpZnkgdGhlIG1heGltdW0gcGFnZSByZXF1ZXN0IHJlc29sdXRpb24gdGltZScpXG4gICAgICAgICAgICAub3B0aW9uKCctLWFqYXgtcmVxdWVzdC10aW1lb3V0IDxtcz4nLCAnc3BlY2lmeSB0aGUgbWF4aW11bSBBSkFYIHJlcXVlc3QgcmVzb2x1dGlvbiB0aW1lJylcbiAgICAgICAgICAgIC5vcHRpb24oJy0tYnJvd3Nlci1pbml0LXRpbWVvdXQgPG1zPicsICdzcGVjaWZ5IHRoZSBtYXhpbXVtIGJyb3dzZXIgc3RhcnR1cCB0aW1lJylcbiAgICAgICAgICAgIC5vcHRpb24oJy0tdGVzdC1leGVjdXRpb24tdGltZW91dCA8bXM+JywgJ3NwZWNpZnkgdGhlIG1heGltdW0gdGVzdCBleGVjdXRpb24gdGltZScpXG4gICAgICAgICAgICAub3B0aW9uKCctLXJ1bi1leGVjdXRpb24tdGltZW91dCA8bXM+JywgJ3NwZWNpZnkgdGhlIG1heGltdW0gdGVzdCBydW4gdGltZScpXG4gICAgICAgICAgICAub3B0aW9uKCctLXNwZWVkIDxmYWN0b3I+JywgJ3NldCB0ZXN0IGV4ZWN1dGlvbiBzcGVlZCAoMC4wMSAuLi4gMSknKVxuICAgICAgICAgICAgLm9wdGlvbignLS1wb3J0cyA8cG9ydDEscG9ydDI+JywgJ3NwZWNpZnkgbmV0d29yayBwb3J0cyB0byB1c2UgZHVyaW5nIHRoZSB0ZXN0IHJ1bi4gVGhlIHNlY29uZCBwb3J0IGlzIG5lY2Vzc2FyeSB0byBhY2Nlc3MgY3Jvc3MtZG9tYWluIHJlc291cmNlcy4nKVxuICAgICAgICAgICAgLm9wdGlvbignLS1ob3N0bmFtZSA8bmFtZT4nLCBgc3BlY2lmeSB5b3VyIGhvc3RuYW1lLiBOZWNlc3NhcnkgdG8gcnVuIHRlc3RzIGluIHJlbW90ZSBicm93c2Vycy5gKVxuICAgICAgICAgICAgLm9wdGlvbignLS1wcm94eSA8aG9zdD4nLCAnc3BlY2lmeSB0aGUgcHJveHkgc2VydmVyIGhvc3RuYW1lIG9yIElQIGFkZHJlc3MnKVxuICAgICAgICAgICAgLm9wdGlvbignLS1wcm94eS1ieXBhc3MgPHJ1bGVzPicsICdzcGVjaWZ5IFVSTHMgdGhhdCBieXBhc3MgdGhlIHByb3h5IHNlcnZlcicpXG4gICAgICAgICAgICAub3B0aW9uKCctLXNzbCA8b3B0aW9ucz4nLCAnc3BlY2lmeSBTU0wgb3B0aW9ucyB0byBydW4gVGVzdENhZmUgb3ZlciBIVFRQUycpXG4gICAgICAgICAgICAub3B0aW9uKCctLXZpZGVvIDxwYXRoPicsICdyZWNvcmQgdmlkZW9zIG9mIHRlc3QgcnVucycpXG4gICAgICAgICAgICAub3B0aW9uKCctLXZpZGVvLW9wdGlvbnMgPG9wdGlvbj12YWx1ZVssLi4uXT4nLCAnc3BlY2lmeSB2aWRlbyByZWNvcmRpbmcgb3B0aW9ucycpXG4gICAgICAgICAgICAub3B0aW9uKCctLXZpZGVvLWVuY29kaW5nLW9wdGlvbnMgPG9wdGlvbj12YWx1ZVssLi4uXT4nLCAnc3BlY2lmeSB2aWRlbyBlbmNvZGluZyBvcHRpb25zJylcbiAgICAgICAgICAgIC5vcHRpb24oJy0tZGV2JywgJ2xvZyBhbmQgZGlhZ25vc2UgVGVzdENhZmUgZXJyb3JzJylcbiAgICAgICAgICAgIC5vcHRpb24oJy0tcXItY29kZScsICdvdXRwdXQgUVIgY29kZXMgd2l0aCBVUkxzIGZvciByZW1vdGUgYnJvd3NlciBjb25uZWN0aW9ucycpXG4gICAgICAgICAgICAub3B0aW9uKCctLXNmLCAtLXN0b3Atb24tZmlyc3QtZmFpbCcsICdzdG9wIHRoZSB0ZXN0IHJ1biBpZiBhbnkgdGVzdCBmYWlscycpXG4gICAgICAgICAgICAub3B0aW9uKCctLWNvbmZpZy1maWxlIDxwYXRoPicsICdzcGVjaWZ5IGEgY3VzdG9tIHBhdGggdG8gdGhlIHRlc3RjYWZlIGNvbmZpZ3VyYXRpb24gZmlsZScpXG4gICAgICAgICAgICAub3B0aW9uKCctLXRzLWNvbmZpZy1wYXRoIDxwYXRoPicsICdzcGVjaWZ5IHRoZSBwYXRoIHRvIGEgY3VzdG9tIFR5cGVTY3JpcHQgY29uZmlndXJhdGlvbiBmaWxlJylcbiAgICAgICAgICAgIC5vcHRpb24oJy0tY3MsIC0tY2xpZW50LXNjcmlwdHMgPHBhdGhzPicsICdpbmplY3QgY2xpZW50LXNpZGUgc2NyaXB0cyBpbnRvIHRoZSBwYWdlJywgcGFyc2VMaXN0LCBbXSlcbiAgICAgICAgICAgIC5vcHRpb24oJy0tZGlzYWJsZS1wYWdlLWNhY2hpbmcnLCAnZG8gbm90IGNhY2hlIHBhZ2VzJylcbiAgICAgICAgICAgIC5vcHRpb24oJy0tZGlzYWJsZS1wYWdlLXJlbG9hZHMnLCAnZG8gbm90IHJlbG9hZCBwYWdlcyBiZXR3ZWVuIHRlc3RzJylcbiAgICAgICAgICAgIC5vcHRpb24oJy0tcmV0cnktdGVzdC1wYWdlcycsICdyZXRyeSBwYWdlIHJlcXVlc3RzIGluIGNhc2Ugb2YgZmFpbHVyZScpXG4gICAgICAgICAgICAub3B0aW9uKCctLWRpc2FibGUtc2NyZWVuc2hvdHMnLCAnZGlzYWJsZSBzY3JlZW5zaG90cycpXG4gICAgICAgICAgICAub3B0aW9uKCctLXNjcmVlbnNob3RzLWZ1bGwtcGFnZScsICdlbmFibGUgZnVsbC1wYWdlIHNjcmVlbnNob3RzJylcbiAgICAgICAgICAgIC5vcHRpb24oJy0tY29tcGlsZXItb3B0aW9ucyA8b3B0aW9uPXZhbHVlWywuLi5dPicsICdzcGVjaWZ5IHRlc3QgY29tcGlsYXRpb24gc2V0dGluZ3MnKVxuICAgICAgICAgICAgLm9wdGlvbignLS1kaXNhYmxlLW11bHRpcGxlLXdpbmRvd3MnLCAnZGlzYWJsZSB0aGUgbXVsdGktd2luZG93IG1vZGUnKVxuICAgICAgICAgICAgLm9wdGlvbignLS1kaXNhYmxlLWh0dHAyJywgJ2ZvcmNlIHRoZSBwcm94eSB0byBpc3N1ZSBIVFRQLzEuMSByZXF1ZXN0cycpXG4gICAgICAgICAgICAub3B0aW9uKCctLWNhY2hlJywgJ2NhY2hlIHdlYiBhc3NldHMgYmV0d2VlbiB0ZXN0IHJ1bnMnKVxuICAgICAgICAgICAgLm9wdGlvbignLS1iYXNlLXVybCA8dXJsPicsICdzZXQgdGhlIGJhc2UgdXJsIGZvciB0aGUgdGVzdCBydW4nKVxuICAgICAgICAgICAgLm9wdGlvbignLS1lc20nLCAnZW5hYmxlIEVTTSBtb2R1bGUgc3VwcG9ydCcpXG5cbiAgICAgICAgICAgIC8vIE5PVEU6IHRoZXNlIG9wdGlvbnMgd2lsbCBiZSBoYW5kbGVkIGJ5IGNoYWxrIGludGVybmFsbHlcbiAgICAgICAgICAgIC5vcHRpb24oJy0tY29sb3InLCAnZm9yY2UgVGVzdENhZmUgdG8gZm9ybWF0IENMSSBvdXRwdXQgd2l0aCBjb2xvcicpXG4gICAgICAgICAgICAub3B0aW9uKCctLW5vLWNvbG9yJywgJ2Rpc2FibGUgdGV4dCBjb2xvciBmb3JtYXR0aW5nIGluIHRoZSBDTEknKVxuXG4gICAgICAgICAgICAvLyBOT1RFOiBUZW1wb3JhcmlseSBleGNsdWRlIGV4cGVyaW1lbnRhbCBvcHRpb25zIGZyb20gLS1oZWxwIG91dHB1dFxuICAgICAgICAgICAgLmFkZE9wdGlvbihuZXcgT3B0aW9uKCctLWRpc2FibGUtY3Jvc3MtZG9tYWluJywgJ2V4cGVyaW1lbnRhbCcpLmhpZGVIZWxwKCkpXG4gICAgICAgICAgICAuYWN0aW9uKChvcHRzOiBDb21tYW5kTGluZU9wdGlvbnMpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLm9wdHMgPSBvcHRzO1xuICAgICAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfcGF0Y2hIZWxwT3V0cHV0IChkZWZhdWx0U3ViQ29tbWFuZDogQ29tbWFuZCk6IHZvaWQge1xuICAgICAgICAvLyBOT1RFOiBJbiB0aGUgZnV0dXJlIHZlcnNpb25zIG9mIHRoZSAnY29tbWFuZGVyJyBtb2R1bGVcbiAgICAgICAgLy8gbmVlZCB0byBpbnZlc3RpZ2F0ZSBob3cgdG8gcmVtb3ZlIHRoaXMgaGFjay5cbiAgICAgICAgKHByb2dyYW0gYXMgdW5rbm93biBhcyBDb21tYW5kKS5vdXRwdXRIZWxwID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgY29uc3Qgc3RvcmVkUGFyZW50ID0gZGVmYXVsdFN1YkNvbW1hbmQucGFyZW50O1xuXG4gICAgICAgICAgICBkZWZhdWx0U3ViQ29tbWFuZC5wYXJlbnQgPSBudWxsO1xuXG4gICAgICAgICAgICBkZWZhdWx0U3ViQ29tbWFuZC5vdXRwdXRIZWxwKCk7XG5cbiAgICAgICAgICAgIGRlZmF1bHRTdWJDb21tYW5kLnBhcmVudCA9IHN0b3JlZFBhcmVudDtcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9jaGVja0FuZENvdW50UmVtb3RlcyAoYnJvd3Nlcjogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgICAgIGNvbnN0IHJlbW90ZU1hdGNoID0gYnJvd3Nlci5tYXRjaChSRU1PVEVfQUxJQVNfUkUpO1xuXG4gICAgICAgIGlmIChyZW1vdGVNYXRjaCkge1xuICAgICAgICAgICAgdGhpcy5yZW1vdGVDb3VudCArPSBwYXJzZUludChyZW1vdGVNYXRjaFsxXSwgMTApIHx8IDE7XG5cbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBfcGFyc2VGaWx0ZXJpbmdPcHRpb25zICgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgaWYgKHRoaXMub3B0cy50ZXN0R3JlcClcbiAgICAgICAgICAgIHRoaXMub3B0cy50ZXN0R3JlcCA9IGdldEdyZXBPcHRpb25zKCctLXRlc3QtZ3JlcCcsIHRoaXMub3B0cy50ZXN0R3JlcCBhcyBzdHJpbmcpO1xuXG4gICAgICAgIGlmICh0aGlzLm9wdHMuZml4dHVyZUdyZXApXG4gICAgICAgICAgICB0aGlzLm9wdHMuZml4dHVyZUdyZXAgPSBnZXRHcmVwT3B0aW9ucygnLS1maXh0dXJlLWdyZXAnLCB0aGlzLm9wdHMuZml4dHVyZUdyZXAgYXMgc3RyaW5nKTtcblxuICAgICAgICBpZiAodGhpcy5vcHRzLnRlc3RNZXRhKVxuICAgICAgICAgICAgdGhpcy5vcHRzLnRlc3RNZXRhID0gYXdhaXQgZ2V0TWV0YU9wdGlvbnMoJy0tdGVzdC1tZXRhJywgdGhpcy5vcHRzLnRlc3RNZXRhIGFzIHN0cmluZyk7XG5cbiAgICAgICAgaWYgKHRoaXMub3B0cy5maXh0dXJlTWV0YSlcbiAgICAgICAgICAgIHRoaXMub3B0cy5maXh0dXJlTWV0YSA9IGF3YWl0IGdldE1ldGFPcHRpb25zKCctLWZpeHR1cmUtbWV0YScsIHRoaXMub3B0cy5maXh0dXJlTWV0YSBhcyBzdHJpbmcpO1xuXG4gICAgICAgIHRoaXMub3B0cy5maWx0ZXIgPSBnZXRGaWx0ZXJGbih0aGlzLm9wdHMpO1xuICAgIH1cblxuICAgIHByaXZhdGUgX3BhcnNlQXBwSW5pdERlbGF5ICgpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMub3B0cy5hcHBJbml0RGVsYXkpIHtcbiAgICAgICAgICAgIGFzc2VydFR5cGUoaXMubm9uTmVnYXRpdmVOdW1iZXJTdHJpbmcsIG51bGwsICdUaGUgdGVzdGVkIGFwcCBpbml0aWFsaXphdGlvbiBkZWxheScsIHRoaXMub3B0cy5hcHBJbml0RGVsYXkpO1xuXG4gICAgICAgICAgICB0aGlzLm9wdHMuYXBwSW5pdERlbGF5ID0gcGFyc2VJbnQodGhpcy5vcHRzLmFwcEluaXREZWxheSBhcyBzdHJpbmcsIDEwKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgX3BhcnNlU2VsZWN0b3JUaW1lb3V0ICgpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMub3B0cy5zZWxlY3RvclRpbWVvdXQpIHtcbiAgICAgICAgICAgIGFzc2VydFR5cGUoaXMubm9uTmVnYXRpdmVOdW1iZXJTdHJpbmcsIG51bGwsICdUaGUgU2VsZWN0b3IgdGltZW91dCcsIHRoaXMub3B0cy5zZWxlY3RvclRpbWVvdXQpO1xuXG4gICAgICAgICAgICB0aGlzLm9wdHMuc2VsZWN0b3JUaW1lb3V0ID0gcGFyc2VJbnQodGhpcy5vcHRzLnNlbGVjdG9yVGltZW91dCBhcyBzdHJpbmcsIDEwKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgX3BhcnNlQXNzZXJ0aW9uVGltZW91dCAoKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLm9wdHMuYXNzZXJ0aW9uVGltZW91dCkge1xuICAgICAgICAgICAgYXNzZXJ0VHlwZShpcy5ub25OZWdhdGl2ZU51bWJlclN0cmluZywgbnVsbCwgJ1RoZSBhc3NlcnRpb24gdGltZW91dCcsIHRoaXMub3B0cy5hc3NlcnRpb25UaW1lb3V0KTtcblxuICAgICAgICAgICAgdGhpcy5vcHRzLmFzc2VydGlvblRpbWVvdXQgPSBwYXJzZUludCh0aGlzLm9wdHMuYXNzZXJ0aW9uVGltZW91dCBhcyBzdHJpbmcsIDEwKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgX3BhcnNlUGFnZUxvYWRUaW1lb3V0ICgpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMub3B0cy5wYWdlTG9hZFRpbWVvdXQpIHtcbiAgICAgICAgICAgIGFzc2VydFR5cGUoaXMubm9uTmVnYXRpdmVOdW1iZXJTdHJpbmcsIG51bGwsICdUaGUgcGFnZSBsb2FkIHRpbWVvdXQnLCB0aGlzLm9wdHMucGFnZUxvYWRUaW1lb3V0KTtcblxuICAgICAgICAgICAgdGhpcy5vcHRzLnBhZ2VMb2FkVGltZW91dCA9IHBhcnNlSW50KHRoaXMub3B0cy5wYWdlTG9hZFRpbWVvdXQgYXMgc3RyaW5nLCAxMCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIF9wYXJzZVBhZ2VSZXF1ZXN0VGltZW91dCAoKTogdm9pZCB7XG4gICAgICAgIGlmICghdGhpcy5vcHRzLnBhZ2VSZXF1ZXN0VGltZW91dClcbiAgICAgICAgICAgIHJldHVybjtcblxuICAgICAgICBhc3NlcnRUeXBlKGlzLm5vbk5lZ2F0aXZlTnVtYmVyU3RyaW5nLCBudWxsLCAnVGhlIHBhZ2UgcmVxdWVzdCB0aW1lb3V0JywgdGhpcy5vcHRzLnBhZ2VSZXF1ZXN0VGltZW91dCk7XG5cbiAgICAgICAgdGhpcy5vcHRzLnBhZ2VSZXF1ZXN0VGltZW91dCA9IHBhcnNlSW50KHRoaXMub3B0cy5wYWdlUmVxdWVzdFRpbWVvdXQgYXMgc3RyaW5nLCAxMCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfcGFyc2VBamF4UmVxdWVzdFRpbWVvdXQgKCk6IHZvaWQge1xuICAgICAgICBpZiAoIXRoaXMub3B0cy5hamF4UmVxdWVzdFRpbWVvdXQpXG4gICAgICAgICAgICByZXR1cm47XG5cbiAgICAgICAgYXNzZXJ0VHlwZShpcy5ub25OZWdhdGl2ZU51bWJlclN0cmluZywgbnVsbCwgJ1RoZSBBSkFYIHJlcXVlc3QgdGltZW91dCcsIHRoaXMub3B0cy5hamF4UmVxdWVzdFRpbWVvdXQpO1xuXG4gICAgICAgIHRoaXMub3B0cy5hamF4UmVxdWVzdFRpbWVvdXQgPSBwYXJzZUludCh0aGlzLm9wdHMuYWpheFJlcXVlc3RUaW1lb3V0IGFzIHN0cmluZywgMTApO1xuICAgIH1cblxuICAgIHByaXZhdGUgX3BhcnNlQnJvd3NlckluaXRUaW1lb3V0ICgpOiB2b2lkIHtcbiAgICAgICAgaWYgKCF0aGlzLm9wdHMuYnJvd3NlckluaXRUaW1lb3V0KVxuICAgICAgICAgICAgcmV0dXJuO1xuXG4gICAgICAgIGFzc2VydFR5cGUoaXMubm9uTmVnYXRpdmVOdW1iZXJTdHJpbmcsIG51bGwsICdUaGUgYnJvd3NlciBpbml0aWFsaXphdGlvbiB0aW1lb3V0JywgdGhpcy5vcHRzLmJyb3dzZXJJbml0VGltZW91dCk7XG5cbiAgICAgICAgdGhpcy5vcHRzLmJyb3dzZXJJbml0VGltZW91dCA9IHBhcnNlSW50KHRoaXMub3B0cy5icm93c2VySW5pdFRpbWVvdXQgYXMgc3RyaW5nLCAxMCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfcGFyc2VUZXN0RXhlY3V0aW9uVGltZW91dCAoKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLm9wdHMudGVzdEV4ZWN1dGlvblRpbWVvdXQpIHtcbiAgICAgICAgICAgIGFzc2VydFR5cGUoaXMubm9uTmVnYXRpdmVOdW1iZXJTdHJpbmcsIG51bGwsICdUaGUgdGVzdCBleGVjdXRpb24gdGltZW91dCcsIHRoaXMub3B0cy50ZXN0RXhlY3V0aW9uVGltZW91dCk7XG5cbiAgICAgICAgICAgIHRoaXMub3B0cy50ZXN0RXhlY3V0aW9uVGltZW91dCA9IHBhcnNlSW50KHRoaXMub3B0cy50ZXN0RXhlY3V0aW9uVGltZW91dCBhcyBzdHJpbmcsIDEwKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgX3BhcnNlUnVuRXhlY3V0aW9uVGltZW91dCAoKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLm9wdHMucnVuRXhlY3V0aW9uVGltZW91dCkge1xuICAgICAgICAgICAgYXNzZXJ0VHlwZShpcy5ub25OZWdhdGl2ZU51bWJlclN0cmluZywgbnVsbCwgJ1RoZSBydW4gZXhlY3V0aW9uIHRpbWVvdXQnLCB0aGlzLm9wdHMucnVuRXhlY3V0aW9uVGltZW91dCk7XG5cbiAgICAgICAgICAgIHRoaXMub3B0cy5ydW5FeGVjdXRpb25UaW1lb3V0ID0gcGFyc2VJbnQodGhpcy5vcHRzLnJ1bkV4ZWN1dGlvblRpbWVvdXQgYXMgc3RyaW5nLCAxMCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIF9wYXJzZVNwZWVkICgpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMub3B0cy5zcGVlZClcbiAgICAgICAgICAgIHRoaXMub3B0cy5zcGVlZCA9IHBhcnNlRmxvYXQodGhpcy5vcHRzLnNwZWVkIGFzIHN0cmluZyk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfcGFyc2VDb25jdXJyZW5jeSAoKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLm9wdHMuY29uY3VycmVuY3kpXG4gICAgICAgICAgICB0aGlzLm9wdHMuY29uY3VycmVuY3kgPSBwYXJzZUludCh0aGlzLm9wdHMuY29uY3VycmVuY3kgYXMgc3RyaW5nLCAxMCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBfcGFyc2VRdWFyYW50aW5lT3B0aW9ucyAoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGlmICh0aGlzLm9wdHMucXVhcmFudGluZU1vZGUgIT09IHZvaWQgMClcbiAgICAgICAgICAgIHRoaXMub3B0cy5xdWFyYW50aW5lTW9kZSA9IGF3YWl0IGdldFF1YXJhbnRpbmVPcHRpb25zKCctLXF1YXJhbnRpbmUtbW9kZScsIHRoaXMub3B0cy5xdWFyYW50aW5lTW9kZSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBfcGFyc2VTa2lwSnNFcnJvcnNPcHRpb25zICgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgaWYgKHRoaXMub3B0cy5za2lwSnNFcnJvcnMgIT09IHZvaWQgMClcbiAgICAgICAgICAgIHRoaXMub3B0cy5za2lwSnNFcnJvcnMgPSBhd2FpdCBnZXRTa2lwSnNFcnJvcnNPcHRpb25zKCctLXNraXAtanMtZXJyb3JzJywgdGhpcy5vcHRzLnNraXBKc0Vycm9ycyk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfcGFyc2VQb3J0cyAoKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLm9wdHMucG9ydHMpIHtcbiAgICAgICAgICAgIGNvbnN0IHBhcnNlZFBvcnRzID0gKHRoaXMub3B0cy5wb3J0cyBhcyBzdHJpbmcpIC8qIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tZXh0cmEtcGFyZW5zICovXG4gICAgICAgICAgICAgICAgLnNwbGl0KCcsJylcbiAgICAgICAgICAgICAgICAubWFwKHBhcnNlUG9ydE51bWJlcik7XG5cbiAgICAgICAgICAgIGlmIChwYXJzZWRQb3J0cy5sZW5ndGggPCAyKVxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBHZW5lcmFsRXJyb3IoUlVOVElNRV9FUlJPUlMucG9ydHNPcHRpb25SZXF1aXJlc1R3b051bWJlcnMpO1xuXG4gICAgICAgICAgICB0aGlzLm9wdHMucG9ydHMgPSBwYXJzZWRQb3J0cyBhcyBudW1iZXJbXTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgX3BhcnNlQnJvd3NlcnNGcm9tQXJncyAoKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGJyb3dzZXJzQXJnID0gdGhpcy50ZXN0Q2FmZUNvbW1hbmQuYXJnc1swXSB8fCAnJztcblxuICAgICAgICB0aGlzLm9wdHMuYnJvd3NlcnMgPSBzcGxpdFF1b3RlZFRleHQoYnJvd3NlcnNBcmcsICcsJylcbiAgICAgICAgICAgIC5maWx0ZXIoYnJvd3NlciA9PiBicm93c2VyICYmIHRoaXMuX2NoZWNrQW5kQ291bnRSZW1vdGVzKGJyb3dzZXIpKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgX3BhcnNlU3NsT3B0aW9ucyAoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGlmICh0aGlzLm9wdHMuc3NsKVxuICAgICAgICAgICAgdGhpcy5vcHRzLnNzbCA9IGF3YWl0IGdldFNTTE9wdGlvbnModGhpcy5vcHRzLnNzbCBhcyBzdHJpbmcpO1xuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgX3BhcnNlUmVwb3J0ZXJzICgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgY29uc3QgcmVwb3J0ZXJzID0gdGhpcy5vcHRzLnJlcG9ydGVyID8gKHRoaXMub3B0cy5yZXBvcnRlciBhcyBzdHJpbmcpLnNwbGl0KCcsJykgOiBbXTsgLyogZXNsaW50LWRpc2FibGUtbGluZSBuby1leHRyYS1wYXJlbnMqL1xuXG4gICAgICAgIHRoaXMub3B0cy5yZXBvcnRlciA9IHJlcG9ydGVycy5tYXAoKHJlcG9ydGVyOiBzdHJpbmcpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHNlcGFyYXRvckluZGV4ID0gcmVwb3J0ZXIuaW5kZXhPZignOicpO1xuXG4gICAgICAgICAgICBpZiAoc2VwYXJhdG9ySW5kZXggPCAwKVxuICAgICAgICAgICAgICAgIHJldHVybiB7IG5hbWU6IHJlcG9ydGVyIH07XG5cbiAgICAgICAgICAgIGNvbnN0IG5hbWUgICA9IHJlcG9ydGVyLnN1YnN0cmluZygwLCBzZXBhcmF0b3JJbmRleCk7XG4gICAgICAgICAgICBjb25zdCBvdXRwdXQgPSByZXBvcnRlci5zdWJzdHJpbmcoc2VwYXJhdG9ySW5kZXggKyAxKTtcblxuICAgICAgICAgICAgcmV0dXJuIHsgbmFtZSwgb3V0cHV0IH07XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgX3BhcnNlRmlsZUxpc3QgKCk6IHZvaWQge1xuICAgICAgICB0aGlzLm9wdHMuc3JjID0gdGhpcy50ZXN0Q2FmZUNvbW1hbmQuYXJncy5zbGljZSgxKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIF9wYXJzZVNjcmVlbnNob3RPcHRpb25zICgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgaWYgKHRoaXMub3B0cy5zY3JlZW5zaG90cylcbiAgICAgICAgICAgIHRoaXMub3B0cy5zY3JlZW5zaG90cyA9IGF3YWl0IGdldFNjcmVlbnNob3RPcHRpb25zKHRoaXMub3B0cy5zY3JlZW5zaG90cyk7XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIHRoaXMub3B0cy5zY3JlZW5zaG90cyA9IHt9O1xuXG4gICAgICAgIGlmICghaGFzKHRoaXMub3B0cy5zY3JlZW5zaG90cywgU0NSRUVOU0hPVF9PUFRJT05fTkFNRVMucGF0aFBhdHRlcm4pICYmIHRoaXMub3B0cy5zY3JlZW5zaG90UGF0aFBhdHRlcm4pXG4gICAgICAgICAgICB0aGlzLm9wdHMuc2NyZWVuc2hvdHNbU0NSRUVOU0hPVF9PUFRJT05fTkFNRVMucGF0aFBhdHRlcm5dID0gdGhpcy5vcHRzLnNjcmVlbnNob3RQYXRoUGF0dGVybjtcblxuICAgICAgICBpZiAoIWhhcyh0aGlzLm9wdHMuc2NyZWVuc2hvdHMsIFNDUkVFTlNIT1RfT1BUSU9OX05BTUVTLnRha2VPbkZhaWxzKSAmJiB0aGlzLm9wdHMuc2NyZWVuc2hvdHNPbkZhaWxzKVxuICAgICAgICAgICAgdGhpcy5vcHRzLnNjcmVlbnNob3RzW1NDUkVFTlNIT1RfT1BUSU9OX05BTUVTLnRha2VPbkZhaWxzXSA9IHRoaXMub3B0cy5zY3JlZW5zaG90c09uRmFpbHM7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBfcGFyc2VWaWRlb09wdGlvbnMgKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBpZiAodGhpcy5vcHRzLnZpZGVvT3B0aW9ucylcbiAgICAgICAgICAgIHRoaXMub3B0cy52aWRlb09wdGlvbnMgPSBhd2FpdCBnZXRWaWRlb09wdGlvbnModGhpcy5vcHRzLnZpZGVvT3B0aW9ucyBhcyBzdHJpbmcpO1xuXG4gICAgICAgIGlmICh0aGlzLm9wdHMudmlkZW9FbmNvZGluZ09wdGlvbnMpXG4gICAgICAgICAgICB0aGlzLm9wdHMudmlkZW9FbmNvZGluZ09wdGlvbnMgPSBhd2FpdCBnZXRWaWRlb09wdGlvbnModGhpcy5vcHRzLnZpZGVvRW5jb2RpbmdPcHRpb25zIGFzIHN0cmluZyk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBfcGFyc2VDb21waWxlck9wdGlvbnMgKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBpZiAoIXRoaXMub3B0cy5jb21waWxlck9wdGlvbnMpXG4gICAgICAgICAgICByZXR1cm47XG5cbiAgICAgICAgY29uc3QgcGFyc2VkQ29tcGlsZXJPcHRpb25zID0gYXdhaXQgZ2V0Q29tcGlsZXJPcHRpb25zKHRoaXMub3B0cy5jb21waWxlck9wdGlvbnMgYXMgc3RyaW5nKTtcbiAgICAgICAgY29uc3QgcmVzdWx0Q29tcGlsZXJPcHRpb25zID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcblxuICAgICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhwYXJzZWRDb21waWxlck9wdGlvbnMpKVxuICAgICAgICAgICAgc2V0KHJlc3VsdENvbXBpbGVyT3B0aW9ucywga2V5LCB2YWx1ZSk7XG5cbiAgICAgICAgdGhpcy5vcHRzLmNvbXBpbGVyT3B0aW9ucyA9IHJlc3VsdENvbXBpbGVyT3B0aW9ucztcbiAgICB9XG5cbiAgICBwcml2YXRlIF9wYXJzZUxpc3RCcm93c2VycyAoKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGxpc3RCcm93c2VyT3B0aW9uID0gdGhpcy5vcHRzLmxpc3RCcm93c2VycztcblxuICAgICAgICB0aGlzLm9wdHMubGlzdEJyb3dzZXJzID0gISF0aGlzLm9wdHMubGlzdEJyb3dzZXJzO1xuXG4gICAgICAgIGlmICghdGhpcy5vcHRzLmxpc3RCcm93c2VycylcbiAgICAgICAgICAgIHJldHVybjtcblxuICAgICAgICB0aGlzLm9wdHMucHJvdmlkZXJOYW1lID0gdHlwZW9mIGxpc3RCcm93c2VyT3B0aW9uID09PSAnc3RyaW5nJyA/IGxpc3RCcm93c2VyT3B0aW9uIDogJ2xvY2FsbHktaW5zdGFsbGVkJztcbiAgICB9XG5cbiAgICBwcml2YXRlIHN0YXRpYyBfcHJlcGFyZUJvb2xlYW5Pck9iamVjdE9wdGlvbiAoYXJndjogc3RyaW5nW10sIG9wdGlvbk5hbWVzOiBzdHJpbmdbXSwgc3ViT3B0aW9uc05hbWVzOiBzdHJpbmdbXSk6IHZvaWQge1xuICAgICAgICAvLyBOT1RFOiBtb3ZlIG9wdGlvbnMgdG8gdGhlIGVuZCBvZiB0aGUgYXJyYXkgdG8gY29ycmVjdGx5IHBhcnNlIGJvdGggQm9vbGVhbiBhbmQgT2JqZWN0IHR5cGUgYXJndW1lbnRzIChHSC02MjMxKVxuICAgICAgICBjb25zdCBvcHRpb25JbmRleCA9IGFyZ3YuZmluZEluZGV4KFxuICAgICAgICAgICAgZWwgPT4gb3B0aW9uTmFtZXMuc29tZShvcHQgPT4gZWwuc3RhcnRzV2l0aChvcHQpKSk7XG5cbiAgICAgICAgaWYgKG9wdGlvbkluZGV4ID4gLTEgJiYgc2hvdWxkTW92ZU9wdGlvblRvRW5kKGFyZ3YsIG9wdGlvbkluZGV4LCBzdWJPcHRpb25zTmFtZXMpKVxuICAgICAgICAgICAgYXJndi5wdXNoKGFyZ3Yuc3BsaWNlKG9wdGlvbkluZGV4LCAxKVswXSk7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIHBhcnNlIChhcmd2OiBzdHJpbmdbXSk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBDTElBcmd1bWVudFBhcnNlci5fcHJlcGFyZUJvb2xlYW5Pck9iamVjdE9wdGlvbihhcmd2LCBbJy1xJywgJy0tcXVhcmFudGluZS1tb2RlJ10sIE9iamVjdC52YWx1ZXMoUVVBUkFOVElORV9PUFRJT05fTkFNRVMpKTtcbiAgICAgICAgQ0xJQXJndW1lbnRQYXJzZXIuX3ByZXBhcmVCb29sZWFuT3JPYmplY3RPcHRpb24oYXJndiwgWyctZScsICctLXNraXAtanMtZXJyb3JzJ10sIE9iamVjdC52YWx1ZXMoU0tJUF9KU19FUlJPUlNfT1BUSU9OU19PQkpFQ1RfT1BUSU9OX05BTUVTKSk7XG5cbiAgICAgICAgY29uc3QgeyBhcmdzLCB2OEZsYWdzIH0gPSBleHRyYWN0Tm9kZVByb2Nlc3NBcmd1bWVudHMoYXJndik7XG5cbiAgICAgICAgKHByb2dyYW0gYXMgdW5rbm93biBhcyBDb21tYW5kKS5wYXJzZShhcmdzKTtcblxuICAgICAgICB0aGlzLmFyZ3MgPSAocHJvZ3JhbSBhcyB1bmtub3duIGFzIENvbW1hbmQpLmFyZ3M7XG4gICAgICAgIHRoaXMub3B0cyA9IE9iamVjdC5hc3NpZ24odGhpcy5vcHRzLCB7IHY4RmxhZ3MgfSk7XG5cbiAgICAgICAgdGhpcy5fcGFyc2VMaXN0QnJvd3NlcnMoKTtcblxuICAgICAgICAvLyBOT1RFOiB0aGUgJy0tbGlzdC1icm93c2Vycycgb3B0aW9uIG9ubHkgbGlzdHMgYnJvd3NlcnMgYW5kIGltbWVkaWF0ZWx5IGV4aXRzIHRoZSBhcHAuXG4gICAgICAgIC8vIFRoZXJlZm9yZSwgd2UgZG9uJ3QgbmVlZCB0byBwcm9jZXNzIG90aGVyIGFyZ3VtZW50cy5cbiAgICAgICAgaWYgKHRoaXMub3B0cy5saXN0QnJvd3NlcnMpXG4gICAgICAgICAgICByZXR1cm47XG5cbiAgICAgICAgdGhpcy5fcGFyc2VTZWxlY3RvclRpbWVvdXQoKTtcbiAgICAgICAgdGhpcy5fcGFyc2VBc3NlcnRpb25UaW1lb3V0KCk7XG4gICAgICAgIHRoaXMuX3BhcnNlUGFnZUxvYWRUaW1lb3V0KCk7XG4gICAgICAgIHRoaXMuX3BhcnNlUGFnZVJlcXVlc3RUaW1lb3V0KCk7XG4gICAgICAgIHRoaXMuX3BhcnNlQWpheFJlcXVlc3RUaW1lb3V0KCk7XG4gICAgICAgIHRoaXMuX3BhcnNlQnJvd3NlckluaXRUaW1lb3V0KCk7XG4gICAgICAgIHRoaXMuX3BhcnNlVGVzdEV4ZWN1dGlvblRpbWVvdXQoKTtcbiAgICAgICAgdGhpcy5fcGFyc2VSdW5FeGVjdXRpb25UaW1lb3V0KCk7XG4gICAgICAgIHRoaXMuX3BhcnNlQXBwSW5pdERlbGF5KCk7XG4gICAgICAgIHRoaXMuX3BhcnNlU3BlZWQoKTtcbiAgICAgICAgdGhpcy5fcGFyc2VQb3J0cygpO1xuICAgICAgICB0aGlzLl9wYXJzZUJyb3dzZXJzRnJvbUFyZ3MoKTtcbiAgICAgICAgdGhpcy5fcGFyc2VDb25jdXJyZW5jeSgpO1xuICAgICAgICB0aGlzLl9wYXJzZUZpbGVMaXN0KCk7XG5cbiAgICAgICAgYXdhaXQgdGhpcy5fcGFyc2VGaWx0ZXJpbmdPcHRpb25zKCk7XG4gICAgICAgIGF3YWl0IHRoaXMuX3BhcnNlUXVhcmFudGluZU9wdGlvbnMoKTtcbiAgICAgICAgYXdhaXQgdGhpcy5fcGFyc2VTa2lwSnNFcnJvcnNPcHRpb25zKCk7XG4gICAgICAgIGF3YWl0IHRoaXMuX3BhcnNlU2NyZWVuc2hvdE9wdGlvbnMoKTtcbiAgICAgICAgYXdhaXQgdGhpcy5fcGFyc2VWaWRlb09wdGlvbnMoKTtcbiAgICAgICAgYXdhaXQgdGhpcy5fcGFyc2VDb21waWxlck9wdGlvbnMoKTtcbiAgICAgICAgYXdhaXQgdGhpcy5fcGFyc2VTc2xPcHRpb25zKCk7XG4gICAgICAgIGF3YWl0IHRoaXMuX3BhcnNlUmVwb3J0ZXJzKCk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldFJ1bk9wdGlvbnMgKCk6IFJ1bm5lclJ1bk9wdGlvbnMge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuXG4gICAgICAgIFJVTl9PUFRJT05fTkFNRVMuZm9yRWFjaChvcHRpb25OYW1lID0+IHtcbiAgICAgICAgICAgIGlmIChvcHRpb25OYW1lIGluIHRoaXMub3B0cylcbiAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlIGEgaGFjayB0byBhZGQgYW4gaW5kZXggc2lnbmF0dXJlIHRvIGludGVyZmFjZVxuICAgICAgICAgICAgICAgIHJlc3VsdFtvcHRpb25OYW1lXSA9IHRoaXMub3B0c1tvcHRpb25OYW1lXTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIHJlc3VsdCBhcyBSdW5uZXJSdW5PcHRpb25zO1xuICAgIH1cbn1cbiJdfQ==
|
|
@@ -19,6 +19,8 @@ async function default_1(testCafe, remoteCount, showQRCode) {
|
|
|
19
19
|
log_1.default.write(description);
|
|
20
20
|
if (showQRCode)
|
|
21
21
|
log_1.default.write('You can either enter the URL or scan the QR-code.');
|
|
22
|
+
// NOTE: 'remote' browser connection cannot be in the 'native automation' mode.
|
|
23
|
+
testCafe.configuration.mergeOptions({ disableNativeAutomation: true });
|
|
22
24
|
await testCafe.initializeBrowserConnectionGateway();
|
|
23
25
|
const connectionUrl = testCafe.browserConnectionGateway.connectUrl;
|
|
24
26
|
log_1.default.write(`Connect URL: ${chalk_1.default.underline.blue(connectionUrl)}`);
|
|
@@ -39,4 +41,4 @@ async function default_1(testCafe, remoteCount, showQRCode) {
|
|
|
39
41
|
}
|
|
40
42
|
exports.default = default_1;
|
|
41
43
|
module.exports = exports.default;
|
|
42
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
44
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVtb3Rlcy13aXphcmQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY2xpL3JlbW90ZXMtd2l6YXJkLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsc0VBQXFDO0FBQ3JDLGtEQUEwQjtBQUMxQixnREFBd0I7QUFDeEIsc0VBQTZDO0FBQzdDLG9EQUE0QjtBQWFiLEtBQUssb0JBQVcsUUFBa0IsRUFBRSxXQUFtQixFQUFFLFVBQW1CO0lBQ3ZGLE1BQU0sa0JBQWtCLEdBQUcsRUFBRSxDQUFDO0lBRTlCLElBQUksV0FBVyxFQUFFO1FBQ2IsYUFBRyxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBRWxCLE1BQU0sV0FBVyxHQUFHLElBQUEsZ0JBQU0sRUFBQzt5QkFDVixXQUFXOztTQUUzQixDQUFDLENBQUM7UUFFSCxhQUFHLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBRXZCLElBQUksVUFBVTtZQUNWLGFBQUcsQ0FBQyxLQUFLLENBQUMsbURBQW1ELENBQUMsQ0FBQztRQUVuRSwrRUFBK0U7UUFDL0UsUUFBUSxDQUFDLGFBQWEsQ0FBQyxZQUFZLENBQUMsRUFBRSx1QkFBdUIsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBRXZFLE1BQU0sUUFBUSxDQUFDLGtDQUFrQyxFQUFFLENBQUM7UUFFcEQsTUFBTSxhQUFhLEdBQUcsUUFBUSxDQUFDLHdCQUF3QixDQUFDLFVBQVUsQ0FBQztRQUVuRSxhQUFHLENBQUMsS0FBSyxDQUFDLGdCQUFnQixlQUFLLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsRUFBRSxDQUFDLENBQUM7UUFFakUsSUFBSSxVQUFVO1lBQ1YseUJBQU0sQ0FBQyxRQUFRLENBQUMsYUFBYSxDQUFDLENBQUM7UUFFbkMsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFdBQVcsRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUNsQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsUUFBUTtpQkFDM0IsdUJBQXVCLEVBQUU7aUJBQ3pCLElBQUksQ0FBQyxDQUFDLEVBQXFCLEVBQUUsRUFBRSxDQUFDLElBQUEseUJBQWMsRUFBQyxFQUFFLEVBQUUsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDO2lCQUMzRSxJQUFJLENBQUMsQ0FBQyxFQUFxQixFQUFFLEVBQUU7Z0JBQzVCLGFBQUcsQ0FBQyxLQUFLLENBQUMsR0FBRyxlQUFLLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDO2dCQUV6RCxPQUFPLEVBQUUsQ0FBQztZQUNkLENBQUMsQ0FBQyxDQUNMLENBQUM7U0FDTDtRQUVELGFBQUcsQ0FBQyxXQUFXLEVBQUUsQ0FBQztLQUNyQjtJQUVELE9BQU8sTUFBTSxPQUFPLENBQUMsR0FBRyxDQUFDLGtCQUFrQixDQUFDLENBQUM7QUFDakQsQ0FBQztBQTVDRCw0QkE0Q0MiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgcXJjb2RlIGZyb20gJ3FyY29kZS10ZXJtaW5hbCc7XG5pbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnO1xuaW1wb3J0IGxvZyBmcm9tICcuL2xvZyc7XG5pbXBvcnQgcHJvbWlzaWZ5RXZlbnQgZnJvbSAncHJvbWlzaWZ5LWV2ZW50JztcbmltcG9ydCBkZWRlbnQgZnJvbSAnZGVkZW50JztcblxuaW1wb3J0IEJyb3dzZXJDb25uZWN0aW9uIGZyb20gJy4uL2Jyb3dzZXIvY29ubmVjdGlvbic7XG5pbXBvcnQgQnJvd3NlckNvbm5lY3Rpb25HYXRld2F5IGZyb20gJy4uL2Jyb3dzZXIvY29ubmVjdGlvbi9nYXRld2F5JztcbmltcG9ydCBUZXN0Q2FmZUNvbmZpZ3VyYXRpb24gZnJvbSAnLi4vY29uZmlndXJhdGlvbi90ZXN0Y2FmZS1jb25maWd1cmF0aW9uJztcblxuaW50ZXJmYWNlIFRlc3RDYWZlIHtcbiAgICBicm93c2VyQ29ubmVjdGlvbkdhdGV3YXk6IEJyb3dzZXJDb25uZWN0aW9uR2F0ZXdheTtcbiAgICBjcmVhdGVCcm93c2VyQ29ubmVjdGlvbigpOiBQcm9taXNlPEJyb3dzZXJDb25uZWN0aW9uPjtcbiAgICBpbml0aWFsaXplQnJvd3NlckNvbm5lY3Rpb25HYXRld2F5KCk6IFByb21pc2U8dm9pZD47XG4gICAgY29uZmlndXJhdGlvbjogVGVzdENhZmVDb25maWd1cmF0aW9uO1xufVxuXG5leHBvcnQgZGVmYXVsdCBhc3luYyBmdW5jdGlvbiAodGVzdENhZmU6IFRlc3RDYWZlLCByZW1vdGVDb3VudDogbnVtYmVyLCBzaG93UVJDb2RlOiBib29sZWFuKTogUHJvbWlzZTxCcm93c2VyQ29ubmVjdGlvbltdPiB7XG4gICAgY29uc3QgY29ubmVjdGlvblByb21pc2VzID0gW107XG5cbiAgICBpZiAocmVtb3RlQ291bnQpIHtcbiAgICAgICAgbG9nLmhpZGVTcGlubmVyKCk7XG5cbiAgICAgICAgY29uc3QgZGVzY3JpcHRpb24gPSBkZWRlbnQoYFxuICAgICAgICAgICAgQ29ubmVjdGluZyAke3JlbW90ZUNvdW50fSByZW1vdGUgYnJvd3NlcihzKS4uLlxuICAgICAgICAgICAgTmF2aWdhdGUgdG8gdGhlIGZvbGxvd2luZyBVUkwgZnJvbSBlYWNoIHJlbW90ZSBicm93c2VyLlxuICAgICAgICBgKTtcblxuICAgICAgICBsb2cud3JpdGUoZGVzY3JpcHRpb24pO1xuXG4gICAgICAgIGlmIChzaG93UVJDb2RlKVxuICAgICAgICAgICAgbG9nLndyaXRlKCdZb3UgY2FuIGVpdGhlciBlbnRlciB0aGUgVVJMIG9yIHNjYW4gdGhlIFFSLWNvZGUuJyk7XG5cbiAgICAgICAgLy8gTk9URTogJ3JlbW90ZScgYnJvd3NlciBjb25uZWN0aW9uIGNhbm5vdCBiZSBpbiB0aGUgJ25hdGl2ZSBhdXRvbWF0aW9uJyBtb2RlLlxuICAgICAgICB0ZXN0Q2FmZS5jb25maWd1cmF0aW9uLm1lcmdlT3B0aW9ucyh7IGRpc2FibGVOYXRpdmVBdXRvbWF0aW9uOiB0cnVlIH0pO1xuXG4gICAgICAgIGF3YWl0IHRlc3RDYWZlLmluaXRpYWxpemVCcm93c2VyQ29ubmVjdGlvbkdhdGV3YXkoKTtcblxuICAgICAgICBjb25zdCBjb25uZWN0aW9uVXJsID0gdGVzdENhZmUuYnJvd3NlckNvbm5lY3Rpb25HYXRld2F5LmNvbm5lY3RVcmw7XG5cbiAgICAgICAgbG9nLndyaXRlKGBDb25uZWN0IFVSTDogJHtjaGFsay51bmRlcmxpbmUuYmx1ZShjb25uZWN0aW9uVXJsKX1gKTtcblxuICAgICAgICBpZiAoc2hvd1FSQ29kZSlcbiAgICAgICAgICAgIHFyY29kZS5nZW5lcmF0ZShjb25uZWN0aW9uVXJsKTtcblxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJlbW90ZUNvdW50OyBpKyspIHtcbiAgICAgICAgICAgIGNvbm5lY3Rpb25Qcm9taXNlcy5wdXNoKHRlc3RDYWZlXG4gICAgICAgICAgICAgICAgLmNyZWF0ZUJyb3dzZXJDb25uZWN0aW9uKClcbiAgICAgICAgICAgICAgICAudGhlbigoYmM6IEJyb3dzZXJDb25uZWN0aW9uKSA9PiBwcm9taXNpZnlFdmVudChiYywgJ3JlYWR5JykudGhlbigoKSA9PiBiYykpXG4gICAgICAgICAgICAgICAgLnRoZW4oKGJjOiBCcm93c2VyQ29ubmVjdGlvbikgPT4ge1xuICAgICAgICAgICAgICAgICAgICBsb2cud3JpdGUoYCR7Y2hhbGsuZ3JlZW4oJ0NPTk5FQ1RFRCcpfSAke2JjLnVzZXJBZ2VudH1gKTtcblxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmM7XG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICBsb2cuc2hvd1NwaW5uZXIoKTtcbiAgICB9XG5cbiAgICByZXR1cm4gYXdhaXQgUHJvbWlzZS5hbGwoY29ubmVjdGlvblByb21pc2VzKTtcbn1cbiJdfQ==
|