testcafe 1.13.0 → 1.14.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +88 -10
- package/LICENSE +21 -21
- package/README.md +52 -48
- package/bin/testcafe-with-v8-flag-filter.js +0 -0
- package/lib/api/exportable-lib/index.js +50 -50
- package/lib/api/request-hooks/assert-type.js +7 -7
- package/lib/api/request-hooks/hook-method-names.js +11 -0
- package/lib/api/request-hooks/hook.js +33 -39
- package/lib/api/request-hooks/interfaces.js +3 -3
- package/lib/api/request-hooks/request-logger.js +113 -111
- package/lib/api/request-hooks/request-mock/create-request-mock.js +12 -0
- package/lib/api/request-hooks/request-mock/index.js +46 -0
- package/lib/api/request-hooks/request-mock.js +47 -48
- package/lib/api/structure/base-unit.js +11 -11
- package/lib/api/structure/fixture.js +75 -75
- package/lib/api/structure/interfaces.js +2 -2
- package/lib/api/structure/test-file.js +31 -31
- package/lib/api/structure/test-timeout.js +9 -9
- package/lib/api/structure/test.js +85 -85
- package/lib/api/structure/testing-unit.js +89 -89
- package/lib/api/structure/unit-type.js +9 -9
- package/lib/api/test-controller/assertion.js +88 -88
- package/lib/api/test-controller/execution-context.js +82 -82
- package/lib/api/test-controller/index.js +359 -319
- package/lib/api/test-controller/proxy.js +28 -28
- package/lib/api/test-page-url.js +60 -60
- package/lib/api/test-run-tracker.js +68 -68
- package/lib/api/wrap-test-function.js +49 -49
- package/lib/assertions/executor.js +74 -74
- package/lib/assertions/get-fn.js +46 -46
- package/lib/assertions/type.js +20 -20
- package/lib/assets/content-types.js +9 -9
- package/lib/assets/injectables.js +18 -18
- package/lib/browser/connection/command.js +10 -10
- package/lib/browser/connection/error-hints.js +9 -9
- package/lib/browser/connection/gateway.js +159 -159
- package/lib/browser/connection/get-hints.js +33 -33
- package/lib/browser/connection/heartbeat-status.js +8 -8
- package/lib/browser/connection/index.js +328 -328
- package/lib/browser/connection/remotes-queue.js +46 -46
- package/lib/browser/connection/service-routes.js +12 -12
- package/lib/browser/connection/status.js +12 -12
- package/lib/browser/interfaces.js +2 -2
- package/lib/browser/provider/built-in/dedicated/base.js +80 -80
- package/lib/browser/provider/built-in/dedicated/chrome/browser-client.js +204 -204
- package/lib/browser/provider/built-in/dedicated/chrome/build-chrome-args.js +17 -17
- package/lib/browser/provider/built-in/dedicated/chrome/config.js +110 -110
- package/lib/browser/provider/built-in/dedicated/chrome/create-temp-profile.js +45 -45
- package/lib/browser/provider/built-in/dedicated/chrome/elapsed-upperbounds.js +15 -15
- package/lib/browser/provider/built-in/dedicated/chrome/index.js +102 -102
- package/lib/browser/provider/built-in/dedicated/chrome/interfaces.js +2 -2
- package/lib/browser/provider/built-in/dedicated/chrome/local-chrome.js +24 -24
- package/lib/browser/provider/built-in/dedicated/chrome/runtime-info.js +29 -29
- package/lib/browser/provider/built-in/dedicated/edge/index.js +10 -10
- package/lib/browser/provider/built-in/dedicated/edge/runtime-info.js +29 -29
- package/lib/browser/provider/built-in/dedicated/firefox/config.js +33 -33
- package/lib/browser/provider/built-in/dedicated/firefox/create-temp-profile.js +78 -78
- package/lib/browser/provider/built-in/dedicated/firefox/index.js +73 -73
- package/lib/browser/provider/built-in/dedicated/firefox/local-firefox.js +36 -36
- package/lib/browser/provider/built-in/dedicated/firefox/marionette-client/commands.js +13 -13
- package/lib/browser/provider/built-in/dedicated/firefox/marionette-client/index.js +200 -200
- package/lib/browser/provider/built-in/dedicated/firefox/runtime-info.js +17 -17
- package/lib/browser/provider/built-in/index.js +21 -21
- package/lib/browser/provider/built-in/locally-installed.js +30 -30
- package/lib/browser/provider/built-in/path.js +47 -47
- package/lib/browser/provider/built-in/remote.js +58 -58
- package/lib/browser/provider/index.js +303 -303
- package/lib/browser/provider/parse-provider-name.js +16 -16
- package/lib/browser/provider/plugin-host.js +121 -121
- package/lib/browser/provider/pool.js +115 -115
- package/lib/browser/provider/utils/argument-parsing.js +74 -74
- package/lib/browser/provider/utils/browser-starter.js +34 -34
- package/lib/browser/provider/utils/client-functions.js +24 -24
- package/lib/browser/provider/utils/get-maximized-headless-window-size.js +9 -9
- package/lib/cli/argument-parser.js +284 -279
- package/lib/cli/authentication-helper.js +35 -35
- package/lib/cli/cli.js +134 -134
- package/lib/cli/correct-browsers-and-sources.js +40 -40
- package/lib/cli/index.js +19 -19
- package/lib/cli/log.js +43 -43
- package/lib/cli/remotes-wizard.js +36 -36
- package/lib/cli/termination-handler.js +38 -38
- package/lib/client/automation/index.js +144 -46
- package/lib/client/automation/index.min.js +1 -1
- package/lib/client/browser/idle-page/index.html.mustache +35 -35
- package/lib/client/browser/idle-page/logo.svg +86 -86
- package/lib/client/browser/service-worker.js +4 -6
- package/lib/client/core/index.js +19 -13
- package/lib/client/core/index.min.js +1 -1
- package/lib/client/driver/index.js +1807 -451
- package/lib/client/driver/index.min.js +1 -1
- package/lib/client/driver/internal-properties.js +9 -9
- package/lib/client/test-run/iframe.js.mustache +17 -17
- package/lib/client/test-run/index.js.mustache +51 -51
- package/lib/client/ui/index.js +14 -12
- package/lib/client/ui/index.min.js +1 -1
- package/lib/client/ui/sprite.svg +42 -42
- package/lib/client-functions/builder-symbol.js +4 -4
- package/lib/client-functions/client-function-builder.js +156 -135
- package/lib/client-functions/replicator.js +61 -61
- package/lib/client-functions/return-single-prop-mode.js +8 -8
- package/lib/client-functions/selector-api-execution-mode.js +22 -0
- package/lib/client-functions/selectors/add-api.js +646 -588
- package/lib/client-functions/selectors/create-snapshot-methods.js +13 -13
- package/lib/client-functions/selectors/prepare-api-args.js +20 -20
- package/lib/client-functions/selectors/selector-attribute-filter.js +22 -22
- package/lib/client-functions/selectors/selector-builder.js +154 -150
- package/lib/client-functions/selectors/selector-text-filter.js +43 -43
- package/lib/client-functions/selectors/snapshot-properties.js +48 -48
- package/lib/client-functions/types.js +18 -18
- package/lib/compiler/babel/format-babel-produced-code.js +10 -10
- package/lib/compiler/babel/get-base-babel-options.js +11 -11
- package/lib/compiler/babel/load-libs.js +64 -62
- package/lib/compiler/babel/preset-stage-2.js +19 -19
- package/lib/compiler/compile-client-function.js +73 -73
- package/lib/compiler/compilers.js +33 -33
- package/lib/compiler/index.js +92 -92
- package/lib/compiler/interfaces.js +2 -2
- package/lib/compiler/test-file/api-based.js +146 -146
- package/lib/compiler/test-file/base.js +36 -36
- package/lib/compiler/test-file/exportble-lib-path.js +5 -5
- package/lib/compiler/test-file/formats/coffeescript/compiler.js +38 -38
- package/lib/compiler/test-file/formats/coffeescript/get-test-list.js +29 -29
- package/lib/compiler/test-file/formats/es-next/compiler.js +43 -43
- package/lib/compiler/test-file/formats/es-next/get-test-list.js +166 -166
- package/lib/compiler/test-file/formats/es-next/is-flow-code.js +7 -7
- package/lib/compiler/test-file/formats/raw.js +85 -85
- package/lib/compiler/test-file/formats/typescript/compiler.js +135 -135
- package/lib/compiler/test-file/formats/typescript/get-test-list.js +185 -185
- package/lib/compiler/test-file/test-file-parser-base.js +214 -214
- package/lib/configuration/configuration-base.js +165 -165
- package/lib/configuration/constants.js +9 -9
- package/lib/configuration/customizable-compilers.js +7 -7
- package/lib/configuration/default-values.js +51 -51
- package/lib/configuration/interfaces.js +3 -3
- package/lib/configuration/option-names.js +53 -53
- package/lib/configuration/option-source.js +9 -9
- package/lib/configuration/option.js +14 -14
- package/lib/configuration/quarantine-option-names.js +10 -0
- package/lib/configuration/run-option-names.js +26 -26
- package/lib/configuration/screenshot-option-names.js +10 -10
- package/lib/configuration/testcafe-configuration.js +164 -165
- package/lib/configuration/types.js +2 -2
- package/lib/configuration/typescript-configuration.js +62 -62
- package/lib/custom-client-scripts/assert-type.js +7 -7
- package/lib/custom-client-scripts/client-script-init.js +3 -3
- package/lib/custom-client-scripts/client-script.js +107 -108
- package/lib/custom-client-scripts/get-code.js +11 -11
- package/lib/custom-client-scripts/get-url.js +6 -6
- package/lib/custom-client-scripts/load.js +15 -15
- package/lib/custom-client-scripts/problematic-scripts.js +2 -2
- package/lib/custom-client-scripts/routing.js +36 -36
- package/lib/custom-client-scripts/utils.js +60 -60
- package/lib/embedding-utils.js +83 -83
- package/lib/errors/create-stack-filter.js +18 -18
- package/lib/errors/error-list.js +26 -26
- package/lib/errors/get-callsite.js +31 -31
- package/lib/errors/internal-modules-prefix.js +8 -8
- package/lib/errors/is-internal-stack-frame.js +46 -46
- package/lib/errors/process-test-fn-error.js +37 -37
- package/lib/errors/runtime/index.js +123 -123
- package/lib/errors/runtime/templates.js +116 -114
- package/lib/errors/runtime/type-assertions.js +112 -112
- package/lib/errors/stack-cleaning-hook.js +64 -64
- package/lib/errors/test-run/formattable-adapter.js +59 -59
- package/lib/errors/test-run/index.js +302 -302
- package/lib/errors/test-run/render-error-template.js +31 -31
- package/lib/errors/test-run/templates.js +93 -95
- package/lib/errors/test-run/utils.js +90 -85
- package/lib/errors/types.js +157 -155
- package/lib/index.js +81 -81
- package/lib/live/bootstrapper.js +44 -44
- package/lib/live/controller.js +107 -107
- package/lib/live/file-watcher/index.js +67 -67
- package/lib/live/file-watcher/modules-graph.js +58 -58
- package/lib/live/keyboard-observer.js +76 -76
- package/lib/live/logger/index.js +64 -64
- package/lib/live/test-run-controller.js +96 -96
- package/lib/live/test-run-state.js +6 -6
- package/lib/live/test-run.js +56 -56
- package/lib/live/test-runner.js +168 -168
- package/lib/load-assets.js +29 -29
- package/lib/notifications/add-rendered-warning.js +16 -16
- package/lib/notifications/debug-logger.js +78 -78
- package/lib/notifications/deprecated.js +24 -24
- package/lib/notifications/information-message.js +12 -12
- package/lib/notifications/warning-log.js +32 -31
- package/lib/notifications/warning-message.js +48 -48
- package/lib/reporter/command/command-formatter.js +120 -109
- package/lib/reporter/command/format-command.js +8 -8
- package/lib/reporter/command/interfaces.js +2 -2
- package/lib/reporter/index.js +319 -314
- package/lib/reporter/interfaces.js +2 -2
- package/lib/reporter/plugin-host.js +136 -137
- package/lib/reporter/plugin-methods.js +12 -12
- package/lib/role/index.js +74 -74
- package/lib/role/marker-symbol.js +7 -7
- package/lib/role/phase.js +9 -9
- package/lib/runner/bootstrapper.js +272 -272
- package/lib/runner/browser-job-result.js +9 -9
- package/lib/runner/browser-job.js +153 -123
- package/lib/runner/browser-set.js +114 -114
- package/lib/runner/fixture-hook-controller.js +85 -85
- package/lib/runner/index.js +450 -442
- package/lib/runner/interfaces.js +3 -3
- package/lib/runner/reporter-stream-controller.js +28 -28
- package/lib/runner/task/index.js +152 -133
- package/lib/runner/task/phase.js +9 -9
- package/lib/runner/test-run-controller.js +166 -185
- package/lib/runner/tested-app.js +73 -72
- package/lib/screenshots/capturer.js +141 -141
- package/lib/screenshots/constants.js +11 -11
- package/lib/screenshots/crop.js +111 -111
- package/lib/screenshots/default-extension.js +4 -4
- package/lib/screenshots/index.js +67 -67
- package/lib/screenshots/utils.js +39 -39
- package/lib/services/compiler/host.js +190 -106
- package/lib/services/compiler/io.js +9 -9
- package/lib/services/compiler/protocol.js +17 -16
- package/lib/services/compiler/service.js +225 -106
- package/lib/services/compiler/test-run-proxy.js +111 -73
- package/lib/services/interfaces.js +3 -0
- package/lib/services/process-title.js +8 -8
- package/lib/services/serialization/prepare-options.js +17 -17
- package/lib/services/serialization/replicator/create-replicator.js +27 -0
- package/lib/services/serialization/replicator/custom-error-transform.js +28 -0
- package/lib/services/serialization/test-structure.js +93 -77
- package/lib/services/utils/ipc/interfaces.js +30 -30
- package/lib/services/utils/ipc/io.js +108 -108
- package/lib/services/utils/ipc/message.js +76 -73
- package/lib/services/utils/ipc/packet.js +55 -55
- package/lib/services/utils/ipc/proxy.js +110 -118
- package/lib/services/utils/ipc/transport.js +64 -64
- package/lib/shared/errors/index.js +382 -382
- package/lib/shared/node-modules-folder-name.js +4 -4
- package/lib/test-run/bookmark.js +90 -90
- package/lib/test-run/browser-console-messages.js +73 -73
- package/lib/test-run/browser-manipulation-queue.js +92 -92
- package/lib/test-run/client-messages.js +9 -9
- package/lib/test-run/commands/actions.js +486 -425
- package/lib/test-run/commands/assertion.js +45 -45
- package/lib/test-run/commands/base.js +14 -14
- package/lib/test-run/commands/browser-manipulation.js +95 -95
- package/lib/test-run/commands/from-object.js +82 -82
- package/lib/test-run/commands/observation.js +61 -61
- package/lib/test-run/commands/options.js +231 -215
- package/lib/test-run/commands/service.js +54 -48
- package/lib/test-run/commands/type.js +65 -60
- package/lib/test-run/commands/utils.js +87 -87
- package/lib/test-run/commands/validations/argument.js +90 -90
- package/lib/test-run/commands/validations/factories.js +47 -47
- package/lib/test-run/commands/validations/initializers.js +44 -44
- package/lib/test-run/debug-log.js +32 -32
- package/lib/test-run/execute-js-expression.js +74 -74
- package/lib/test-run/index.js +823 -752
- package/lib/test-run/marker-symbol.js +7 -7
- package/lib/test-run/observed-callsites-storage.js +17 -17
- package/lib/test-run/phase.js +16 -16
- package/lib/test-run/session-controller.js +104 -104
- package/lib/testcafe.js +119 -114
- package/lib/utils/assignable.js +39 -39
- package/lib/utils/async-event-emitter.js +28 -28
- package/lib/utils/async-queue.js +14 -14
- package/lib/utils/browser-connection-timeouts.js +19 -19
- package/lib/utils/callsite.js +17 -17
- package/lib/utils/check-file-path.js +31 -31
- package/lib/utils/check-url.js +51 -51
- package/lib/utils/convert-to-best-fit-type.js +16 -16
- package/lib/utils/correct-file-path.js +21 -21
- package/lib/utils/define-lazy-property.js +13 -13
- package/lib/utils/delay.js +6 -6
- package/lib/utils/delegated-api.js +44 -44
- package/lib/utils/detect-display.js +6 -6
- package/lib/utils/detect-ffmpeg.js +44 -44
- package/lib/utils/diff/colors.js +29 -29
- package/lib/utils/diff/index.js +53 -53
- package/lib/utils/diff/util.js +24 -22
- package/lib/utils/diff.js +29 -29
- package/lib/utils/escape-user-agent.js +10 -10
- package/lib/utils/flag-list.js +17 -17
- package/lib/utils/get-any-key.js +8 -8
- package/lib/utils/get-browser.js +8 -8
- package/lib/utils/get-common-path.js +34 -34
- package/lib/utils/get-filter-fn.js +40 -40
- package/lib/utils/get-options/base.js +36 -36
- package/lib/utils/get-options/compiler.js +33 -33
- package/lib/utils/get-options/grep.js +15 -15
- package/lib/utils/get-options/index.js +21 -19
- package/lib/utils/get-options/meta.js +22 -22
- package/lib/utils/get-options/quarantine.js +92 -0
- package/lib/utils/get-options/screenshot.js +17 -17
- package/lib/utils/get-options/ssl.js +45 -45
- package/lib/utils/get-options/video.js +10 -10
- package/lib/utils/get-viewport-width.js +18 -18
- package/lib/utils/guard-time-execution.js +10 -10
- package/lib/utils/handle-errors.js +74 -74
- package/lib/utils/handle-tag-args.js +8 -8
- package/lib/utils/http.js +30 -30
- package/lib/utils/is-localhost.js +11 -11
- package/lib/utils/is-password-input.js +11 -0
- package/lib/utils/is-repl.js +12 -0
- package/lib/utils/is-window-in-iframe.js +6 -6
- package/lib/utils/limit-number.js +10 -10
- package/lib/utils/make-reg-exp.js +7 -7
- package/lib/utils/moment-loader.js +20 -20
- package/lib/utils/parse-file-list.js +71 -71
- package/lib/utils/parse-user-agent.js +55 -55
- package/lib/utils/path-pattern.js +114 -114
- package/lib/utils/prepare-reporters.js +30 -30
- package/lib/utils/prerender-callsite.js +18 -18
- package/lib/utils/process.js +119 -119
- package/lib/utils/promisified-functions.js +46 -46
- package/lib/utils/re-executable-promise.js +39 -39
- package/lib/utils/render-callsite-sync.js +29 -29
- package/lib/utils/render-template.js +10 -10
- package/lib/utils/reporter.js +30 -30
- package/lib/utils/resolve-path-relatively-cwd.js +7 -7
- package/lib/utils/string.js +105 -105
- package/lib/utils/temp-directory/cleanup-process/commands.js +7 -7
- package/lib/utils/temp-directory/cleanup-process/index.js +143 -143
- package/lib/utils/temp-directory/cleanup-process/worker.js +58 -58
- package/lib/utils/temp-directory/index.js +87 -87
- package/lib/utils/temp-directory/lockfile.js +56 -56
- package/lib/utils/thennable.js +7 -7
- package/lib/utils/timer.js +15 -15
- package/lib/utils/to-posix-path.js +8 -8
- package/lib/utils/types.js +2 -2
- package/lib/video-recorder/interfaces.js +2 -2
- package/lib/video-recorder/process.js +126 -126
- package/lib/video-recorder/recorder.js +136 -136
- package/lib/video-recorder/test-run-video-recorder.js +69 -69
- package/lib/video-recorder/videos.js +37 -37
- package/package.json +7 -7
- package/ts-defs/index.d.ts +109 -17
- package/ts-defs/selectors.d.ts +95 -7
- package/ts-defs/testcafe-scripts.d.ts +96 -8
|
@@ -1,115 +1,117 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
// -------------------------------------------------------------
|
|
3
|
-
// WARNING: this file is used by both the client and the server.
|
|
4
|
-
// Do not use any browser or node-specific API!
|
|
5
|
-
// -------------------------------------------------------------
|
|
6
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
7
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
8
|
-
};
|
|
9
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
|
-
const types_1 = require("../types");
|
|
11
|
-
const error_hints_1 = __importDefault(require("../../browser/connection/error-hints"));
|
|
12
|
-
const DOCUMENTATION_LINKS = {
|
|
13
|
-
TEST_SOURCE_PARAMETER: 'https://devexpress.github.io/testcafe/documentation/using-testcafe/command-line-interface.html#file-pathglob-pattern',
|
|
14
|
-
FILTER_SETTINGS: 'https://devexpress.github.io/testcafe/documentation/using-testcafe/configuration-file.html#filter'
|
|
15
|
-
};
|
|
16
|
-
exports.default = {
|
|
17
|
-
[types_1.RUNTIME_ERRORS.cannotCreateMultipleLiveModeRunners]: 'Cannot create multiple live mode runners.',
|
|
18
|
-
[types_1.RUNTIME_ERRORS.cannotRunLiveModeRunnerMultipleTimes]: 'Cannot run a live mode runner multiple times.',
|
|
19
|
-
[types_1.RUNTIME_ERRORS.browserDisconnected]: 'The {userAgent} browser disconnected. This problem may appear when a browser hangs or is closed, or due to network issues.',
|
|
20
|
-
[types_1.RUNTIME_ERRORS.cannotRunAgainstDisconnectedBrowsers]: 'The following browsers disconnected: {userAgents}. Tests will not be run.',
|
|
21
|
-
[types_1.RUNTIME_ERRORS.testRunRequestInDisconnectedBrowser]: '"{browser}" has disconnected during test execution',
|
|
22
|
-
[types_1.RUNTIME_ERRORS.cannotEstablishBrowserConnection]: 'Unable to establish one or more of the specified browser connections.',
|
|
23
|
-
[types_1.RUNTIME_ERRORS.cannotFindBrowser]: 'Unable to find the browser. "{browser}" is not a browser alias or path to an executable file.',
|
|
24
|
-
[types_1.RUNTIME_ERRORS.browserProviderNotFound]: 'The specified "{providerName}" browser provider was not found.',
|
|
25
|
-
[types_1.RUNTIME_ERRORS.browserNotSet]: 'No browser selected to test against.',
|
|
26
|
-
[types_1.RUNTIME_ERRORS.testFilesNotFound]: 'TestCafe could not find the test files that match the following patterns:\n' +
|
|
27
|
-
'{sourceList}\n\n' +
|
|
28
|
-
'The "{cwd}" current working directory was used as the base path.\n' +
|
|
29
|
-
'Ensure the file patterns are correct or change the current working directory.\n' +
|
|
30
|
-
`For more information on how to specify test files, see ${DOCUMENTATION_LINKS.TEST_SOURCE_PARAMETER}.`,
|
|
31
|
-
[types_1.RUNTIME_ERRORS.noTestsToRun]: 'No tests found in the specified source files.\n' +
|
|
32
|
-
"Ensure the sources contain the 'fixture' and 'test' directives.",
|
|
33
|
-
[types_1.RUNTIME_ERRORS.noTestsToRunDueFiltering]: 'The specified filter settings exclude all tests.\n' +
|
|
34
|
-
'Modify these settings to leave at least one available test.\n' +
|
|
35
|
-
`For more information on how to specify filter settings, see ${DOCUMENTATION_LINKS.FILTER_SETTINGS}.`,
|
|
36
|
-
[types_1.RUNTIME_ERRORS.cannotFindReporterForAlias]: 'The provided "{name}" reporter does not exist. Check that you have specified the report format correctly.',
|
|
37
|
-
[types_1.RUNTIME_ERRORS.multipleSameStreamReporters]: 'The following reporters attempted to write to the same output stream: "{reporters}". Only one reporter can write to a stream.',
|
|
38
|
-
[types_1.RUNTIME_ERRORS.optionValueIsNotValidRegExp]: 'The "{optionName}" option value is not a valid regular expression.',
|
|
39
|
-
[types_1.RUNTIME_ERRORS.optionValueIsNotValidKeyValue]: 'The "{optionName}" option value is not a valid key-value pair.',
|
|
40
|
-
[types_1.RUNTIME_ERRORS.
|
|
41
|
-
[types_1.RUNTIME_ERRORS.
|
|
42
|
-
[types_1.RUNTIME_ERRORS.
|
|
43
|
-
[types_1.RUNTIME_ERRORS.
|
|
44
|
-
[types_1.RUNTIME_ERRORS.
|
|
45
|
-
[types_1.RUNTIME_ERRORS.
|
|
46
|
-
[types_1.RUNTIME_ERRORS.
|
|
47
|
-
[types_1.RUNTIME_ERRORS.
|
|
48
|
-
[types_1.RUNTIME_ERRORS.
|
|
49
|
-
[types_1.RUNTIME_ERRORS.
|
|
50
|
-
[types_1.RUNTIME_ERRORS.
|
|
51
|
-
[types_1.RUNTIME_ERRORS.
|
|
52
|
-
[types_1.RUNTIME_ERRORS.
|
|
53
|
-
[types_1.RUNTIME_ERRORS.
|
|
54
|
-
[types_1.RUNTIME_ERRORS.
|
|
55
|
-
[types_1.RUNTIME_ERRORS.
|
|
56
|
-
[types_1.RUNTIME_ERRORS.
|
|
57
|
-
[types_1.RUNTIME_ERRORS.
|
|
58
|
-
[types_1.RUNTIME_ERRORS.
|
|
59
|
-
[types_1.RUNTIME_ERRORS.
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
'
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
'
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
'
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
'
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
'
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
' {
|
|
79
|
-
[types_1.RUNTIME_ERRORS.
|
|
80
|
-
'
|
|
81
|
-
|
|
82
|
-
'
|
|
83
|
-
'*
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
[types_1.RUNTIME_ERRORS.
|
|
87
|
-
[types_1.RUNTIME_ERRORS.
|
|
88
|
-
[types_1.RUNTIME_ERRORS.
|
|
89
|
-
[types_1.RUNTIME_ERRORS.
|
|
90
|
-
[types_1.RUNTIME_ERRORS.
|
|
91
|
-
[types_1.RUNTIME_ERRORS.
|
|
92
|
-
[types_1.RUNTIME_ERRORS.
|
|
93
|
-
[types_1.RUNTIME_ERRORS.
|
|
94
|
-
[types_1.RUNTIME_ERRORS.
|
|
95
|
-
[types_1.RUNTIME_ERRORS.
|
|
96
|
-
[types_1.RUNTIME_ERRORS.
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
'
|
|
100
|
-
'
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
[types_1.RUNTIME_ERRORS.
|
|
104
|
-
[types_1.RUNTIME_ERRORS.
|
|
105
|
-
[types_1.RUNTIME_ERRORS.
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
[error_hints_1.default.
|
|
112
|
-
|
|
113
|
-
}
|
|
1
|
+
"use strict";
|
|
2
|
+
// -------------------------------------------------------------
|
|
3
|
+
// WARNING: this file is used by both the client and the server.
|
|
4
|
+
// Do not use any browser or node-specific API!
|
|
5
|
+
// -------------------------------------------------------------
|
|
6
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
7
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
8
|
+
};
|
|
9
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
|
+
const types_1 = require("../types");
|
|
11
|
+
const error_hints_1 = __importDefault(require("../../browser/connection/error-hints"));
|
|
12
|
+
const DOCUMENTATION_LINKS = {
|
|
13
|
+
TEST_SOURCE_PARAMETER: 'https://devexpress.github.io/testcafe/documentation/using-testcafe/command-line-interface.html#file-pathglob-pattern',
|
|
14
|
+
FILTER_SETTINGS: 'https://devexpress.github.io/testcafe/documentation/using-testcafe/configuration-file.html#filter'
|
|
15
|
+
};
|
|
16
|
+
exports.default = {
|
|
17
|
+
[types_1.RUNTIME_ERRORS.cannotCreateMultipleLiveModeRunners]: 'Cannot create multiple live mode runners.',
|
|
18
|
+
[types_1.RUNTIME_ERRORS.cannotRunLiveModeRunnerMultipleTimes]: 'Cannot run a live mode runner multiple times.',
|
|
19
|
+
[types_1.RUNTIME_ERRORS.browserDisconnected]: 'The {userAgent} browser disconnected. This problem may appear when a browser hangs or is closed, or due to network issues.',
|
|
20
|
+
[types_1.RUNTIME_ERRORS.cannotRunAgainstDisconnectedBrowsers]: 'The following browsers disconnected: {userAgents}. Tests will not be run.',
|
|
21
|
+
[types_1.RUNTIME_ERRORS.testRunRequestInDisconnectedBrowser]: '"{browser}" has disconnected during test execution',
|
|
22
|
+
[types_1.RUNTIME_ERRORS.cannotEstablishBrowserConnection]: 'Unable to establish one or more of the specified browser connections.',
|
|
23
|
+
[types_1.RUNTIME_ERRORS.cannotFindBrowser]: 'Unable to find the browser. "{browser}" is not a browser alias or path to an executable file.',
|
|
24
|
+
[types_1.RUNTIME_ERRORS.browserProviderNotFound]: 'The specified "{providerName}" browser provider was not found.',
|
|
25
|
+
[types_1.RUNTIME_ERRORS.browserNotSet]: 'No browser selected to test against.',
|
|
26
|
+
[types_1.RUNTIME_ERRORS.testFilesNotFound]: 'TestCafe could not find the test files that match the following patterns:\n' +
|
|
27
|
+
'{sourceList}\n\n' +
|
|
28
|
+
'The "{cwd}" current working directory was used as the base path.\n' +
|
|
29
|
+
'Ensure the file patterns are correct or change the current working directory.\n' +
|
|
30
|
+
`For more information on how to specify test files, see ${DOCUMENTATION_LINKS.TEST_SOURCE_PARAMETER}.`,
|
|
31
|
+
[types_1.RUNTIME_ERRORS.noTestsToRun]: 'No tests found in the specified source files.\n' +
|
|
32
|
+
"Ensure the sources contain the 'fixture' and 'test' directives.",
|
|
33
|
+
[types_1.RUNTIME_ERRORS.noTestsToRunDueFiltering]: 'The specified filter settings exclude all tests.\n' +
|
|
34
|
+
'Modify these settings to leave at least one available test.\n' +
|
|
35
|
+
`For more information on how to specify filter settings, see ${DOCUMENTATION_LINKS.FILTER_SETTINGS}.`,
|
|
36
|
+
[types_1.RUNTIME_ERRORS.cannotFindReporterForAlias]: 'The provided "{name}" reporter does not exist. Check that you have specified the report format correctly.',
|
|
37
|
+
[types_1.RUNTIME_ERRORS.multipleSameStreamReporters]: 'The following reporters attempted to write to the same output stream: "{reporters}". Only one reporter can write to a stream.',
|
|
38
|
+
[types_1.RUNTIME_ERRORS.optionValueIsNotValidRegExp]: 'The "{optionName}" option value is not a valid regular expression.',
|
|
39
|
+
[types_1.RUNTIME_ERRORS.optionValueIsNotValidKeyValue]: 'The "{optionName}" option value is not a valid key-value pair.',
|
|
40
|
+
[types_1.RUNTIME_ERRORS.invalidQuarantineOption]: 'The "{optionName}" option should be empty, otherwise one of "retryCount" or "passCount".',
|
|
41
|
+
[types_1.RUNTIME_ERRORS.invalidRetryCountValue]: 'The "retryCount" value should be greater or equal to "passCount" ({passCount}).',
|
|
42
|
+
[types_1.RUNTIME_ERRORS.invalidSpeedValue]: 'Speed should be a number between 0.01 and 1.',
|
|
43
|
+
[types_1.RUNTIME_ERRORS.invalidConcurrencyFactor]: 'The concurrency factor should be an integer greater or equal to 1.',
|
|
44
|
+
[types_1.RUNTIME_ERRORS.cannotDivideRemotesCountByConcurrency]: 'The number of remote browsers should be divisible by the factor of concurrency.',
|
|
45
|
+
[types_1.RUNTIME_ERRORS.portsOptionRequiresTwoNumbers]: 'The "--ports" option requires two numbers to be specified.',
|
|
46
|
+
[types_1.RUNTIME_ERRORS.portIsNotFree]: 'The specified {portNum} port is already in use by another program.',
|
|
47
|
+
[types_1.RUNTIME_ERRORS.invalidHostname]: 'The specified "{hostname}" hostname cannot be resolved to the current machine.',
|
|
48
|
+
[types_1.RUNTIME_ERRORS.cannotFindSpecifiedTestSource]: 'Cannot find a test source file at "{path}".',
|
|
49
|
+
[types_1.RUNTIME_ERRORS.clientFunctionCodeIsNotAFunction]: '{#instantiationCallsiteName} code is expected to be specified as a function, but {type} was passed.',
|
|
50
|
+
[types_1.RUNTIME_ERRORS.selectorInitializedWithWrongType]: '{#instantiationCallsiteName} is expected to be initialized with a function, CSS selector string, another Selector, node snapshot or a Promise returned by a Selector, but {type} was passed.',
|
|
51
|
+
[types_1.RUNTIME_ERRORS.clientFunctionCannotResolveTestRun]: "{#instantiationCallsiteName} cannot implicitly resolve the test run in context of which it should be executed. If you need to call {#instantiationCallsiteName} from the Node.js API callback, pass the test controller manually via {#instantiationCallsiteName}'s `.with({ boundTestRun: t })` method first. Note that you cannot execute {#instantiationCallsiteName} outside the test code.",
|
|
52
|
+
[types_1.RUNTIME_ERRORS.regeneratorInClientFunctionCode]: `{#instantiationCallsiteName} code, arguments or dependencies cannot contain generators or "async/await" syntax (use Promises instead).`,
|
|
53
|
+
[types_1.RUNTIME_ERRORS.invalidClientFunctionTestRunBinding]: 'The "boundTestRun" option value is expected to be a test controller.',
|
|
54
|
+
[types_1.RUNTIME_ERRORS.invalidValueType]: '{smthg} is expected to be a {type}, but it was {actual}.',
|
|
55
|
+
[types_1.RUNTIME_ERRORS.unsupportedUrlProtocol]: 'The specified "{url}" test page URL uses an unsupported {protocol}:// protocol. Only relative URLs or absolute URLs with http://, https:// and file:// protocols are supported.',
|
|
56
|
+
[types_1.RUNTIME_ERRORS.testControllerProxyCannotResolveTestRun]: `Cannot implicitly resolve the test run in the context of which the test controller action should be executed. Use test function's 't' argument instead.`,
|
|
57
|
+
[types_1.RUNTIME_ERRORS.timeLimitedPromiseTimeoutExpired]: 'Timeout expired for a time limited promise',
|
|
58
|
+
[types_1.RUNTIME_ERRORS.cannotSetVideoOptionsWithoutBaseVideoPathSpecified]: 'Unable to set video or encoding options when video recording is disabled. Specify the base path where video files are stored to enable recording.',
|
|
59
|
+
[types_1.RUNTIME_ERRORS.multipleAPIMethodCallForbidden]: 'You cannot call the "{methodName}" method more than once. Pass an array of parameters to this method instead.',
|
|
60
|
+
[types_1.RUNTIME_ERRORS.invalidReporterOutput]: "Specify a file name or a writable stream as the reporter's output target.",
|
|
61
|
+
[types_1.RUNTIME_ERRORS.cannotReadSSLCertFile]: 'Unable to read the "{path}" file, specified by the "{option}" ssl option. Error details:\n' +
|
|
62
|
+
'\n' +
|
|
63
|
+
'{err}',
|
|
64
|
+
[types_1.RUNTIME_ERRORS.cannotPrepareTestsDueToError]: 'Cannot prepare tests due to an error.\n' +
|
|
65
|
+
'\n' +
|
|
66
|
+
'{errMessage}',
|
|
67
|
+
[types_1.RUNTIME_ERRORS.cannotParseRawFile]: 'Cannot parse a test source file in the raw format at "{path}" due to an error.\n' +
|
|
68
|
+
'\n' +
|
|
69
|
+
'{errMessage}',
|
|
70
|
+
[types_1.RUNTIME_ERRORS.testedAppFailedWithError]: 'Tested app failed with an error:\n' +
|
|
71
|
+
'\n' +
|
|
72
|
+
'{errMessage}',
|
|
73
|
+
[types_1.RUNTIME_ERRORS.unableToOpenBrowser]: 'Was unable to open the browser "{alias}" due to error.\n' +
|
|
74
|
+
'\n' +
|
|
75
|
+
'{errMessage}',
|
|
76
|
+
[types_1.RUNTIME_ERRORS.requestHookConfigureAPIError]: 'There was an error while configuring the request hook:\n' +
|
|
77
|
+
'\n' +
|
|
78
|
+
'{requestHookName}: {errMsg}',
|
|
79
|
+
[types_1.RUNTIME_ERRORS.forbiddenCharatersInScreenshotPath]: 'There are forbidden characters in the "{screenshotPath}" {screenshotPathType}:\n' +
|
|
80
|
+
' {forbiddenCharsDescription}',
|
|
81
|
+
[types_1.RUNTIME_ERRORS.cannotFindFFMPEG]: 'Unable to locate the FFmpeg executable required to record videos. Do one of the following:\n' +
|
|
82
|
+
'\n' +
|
|
83
|
+
'* add the FFmpeg installation directory to the PATH environment variable,\n' +
|
|
84
|
+
'* specify the path to the FFmpeg executable in the FFMPEG_PATH environment variable or the ffmpegPath video option,\n' +
|
|
85
|
+
'* install the @ffmpeg-installer/ffmpeg package from npm.',
|
|
86
|
+
[types_1.RUNTIME_ERRORS.cannotFindTypescriptConfigurationFile]: 'Unable to find the TypeScript configuration file in "{filePath}"',
|
|
87
|
+
[types_1.RUNTIME_ERRORS.clientScriptInitializerIsNotSpecified]: 'Specify the JavaScript file path, module name or script content to inject a client script.',
|
|
88
|
+
[types_1.RUNTIME_ERRORS.clientScriptBasePathIsNotSpecified]: 'Specify the base path for the client script file.',
|
|
89
|
+
[types_1.RUNTIME_ERRORS.clientScriptInitializerMultipleContentSources]: 'You cannot combine the file path, module name and script content when you specify a client script to inject.',
|
|
90
|
+
[types_1.RUNTIME_ERRORS.cannotLoadClientScriptFromPath]: 'Cannot load a client script from {path}.',
|
|
91
|
+
[types_1.RUNTIME_ERRORS.clientScriptModuleEntryPointPathCalculationError]: 'An error occurred when trying to locate the injected client script module:\n\n{errorMessage}.',
|
|
92
|
+
[types_1.RUNTIME_ERRORS.methodIsNotAvailableForAnIPCHost]: 'This method cannot be called on a service host.',
|
|
93
|
+
[types_1.RUNTIME_ERRORS.tooLargeIPCPayload]: 'The specified payload is too large to form an IPC packet.',
|
|
94
|
+
[types_1.RUNTIME_ERRORS.malformedIPCMessage]: 'Cannot process a malformed IPC message.',
|
|
95
|
+
[types_1.RUNTIME_ERRORS.unexpectedIPCHeadPacket]: 'Cannot create an IPC message due to an unexpected IPC head packet.',
|
|
96
|
+
[types_1.RUNTIME_ERRORS.unexpectedIPCBodyPacket]: 'Cannot create an IPC message due to an unexpected IPC body packet.',
|
|
97
|
+
[types_1.RUNTIME_ERRORS.unexpectedIPCTailPacket]: 'Cannot create an IPC message due to an unexpected IPC tail packet.',
|
|
98
|
+
[types_1.RUNTIME_ERRORS.cannotRunLocalNonHeadlessBrowserWithoutDisplay]: 'Your Linux version does not have a graphic subsystem to run {browserAlias} with a GUI. ' +
|
|
99
|
+
'You can launch the browser in headless mode. ' +
|
|
100
|
+
'If you use a portable browser version, ' +
|
|
101
|
+
'specify the browser alias before the path instead of the \'path\' prefix. ' +
|
|
102
|
+
'For more information, see https://devexpress.github.io/testcafe/documentation/guides/concepts/browsers.html#test-in-headless-mode',
|
|
103
|
+
[types_1.RUNTIME_ERRORS.uncaughtErrorInReporter]: 'An uncaught error occurred in the "{reporterName}" reporter\'s "{methodName}" method. Error details:\n{originalError}',
|
|
104
|
+
[types_1.RUNTIME_ERRORS.roleInitializedWithRelativeUrl]: 'You cannot specify relative login page URLs in the Role constructor. Use an absolute URL.',
|
|
105
|
+
[types_1.RUNTIME_ERRORS.typeScriptCompilerLoadingError]: 'Unable to load the TypeScript compiler.\n{originErrorMessage}.',
|
|
106
|
+
[types_1.RUNTIME_ERRORS.cannotCustomizeSpecifiedCompilers]: 'You cannot specify options for the {noncustomizableCompilerList} compiler{suffix}.',
|
|
107
|
+
[types_1.RUNTIME_ERRORS.cannotEnableRetryTestPagesOption]: 'Cannot enable the \'retryTestPages\' option. Apply one of the following two solutions:\n' +
|
|
108
|
+
'-- set \'localhost\' as the value of the \'hostname\' option\n' +
|
|
109
|
+
'-- run TestCafe over HTTPS\n',
|
|
110
|
+
[types_1.RUNTIME_ERRORS.browserConnectionError]: '{originErrorMessage}\n{numOfNotOpenedConnection} of {numOfAllConnections} browser connections have not been established:\n{listOfNotOpenedConnections}\n\nHints:\n{listOfHints}',
|
|
111
|
+
[error_hints_1.default.TooHighConcurrencyFactor]: 'The error can be due to a concurrency factor that is too high for the host machine’s performance (the factor value {concurrencyFactor} was specified). ' +
|
|
112
|
+
'Try to decrease the concurrency factor or ensure more system resources are available on the host machine.',
|
|
113
|
+
[error_hints_1.default.UseBrowserInitOption]: 'Use the "browserInitTimeout" option to allow more time for the browser to start. The timeout is set to {browserInitTimeoutMsg}.',
|
|
114
|
+
[error_hints_1.default.RestErrorCauses]: 'The error can also be caused by network issues or remote device failure. Make sure that the connection is stable and the remote device can be reached.'
|
|
115
|
+
};
|
|
114
116
|
module.exports = exports.default;
|
|
115
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVtcGxhdGVzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2Vycm9ycy9ydW50aW1lL3RlbXBsYXRlcy5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsZ0VBQWdFO0FBQ2hFLGdFQUFnRTtBQUNoRSwrQ0FBK0M7QUFDL0MsZ0VBQWdFOzs7OztBQUVoRSxvQ0FBMEM7QUFDMUMsdUZBQThFO0FBRTlFLE1BQU0sbUJBQW1CLEdBQUc7SUFDeEIscUJBQXFCLEVBQUUsc0hBQXNIO0lBQzdJLGVBQWUsRUFBUSxtR0FBbUc7Q0FDN0gsQ0FBQztBQUVGLGtCQUFlO0lBQ1gsQ0FBQyxzQkFBYyxDQUFDLG1DQUFtQyxDQUFDLEVBQUcsMkNBQTJDO0lBQ2xHLENBQUMsc0JBQWMsQ0FBQyxvQ0FBb0MsQ0FBQyxFQUFFLCtDQUErQztJQUN0RyxDQUFDLHNCQUFjLENBQUMsbUJBQW1CLENBQUMsRUFBbUIsNEhBQTRIO0lBQ25MLENBQUMsc0JBQWMsQ0FBQyxvQ0FBb0MsQ0FBQyxFQUFFLDJFQUEyRTtJQUNsSSxDQUFDLHNCQUFjLENBQUMsbUNBQW1DLENBQUMsRUFBRyxvREFBb0Q7SUFDM0csQ0FBQyxzQkFBYyxDQUFDLGdDQUFnQyxDQUFDLEVBQU0sdUVBQXVFO0lBQzlILENBQUMsc0JBQWMsQ0FBQyxpQkFBaUIsQ0FBQyxFQUFxQiwrRkFBK0Y7SUFDdEosQ0FBQyxzQkFBYyxDQUFDLHVCQUF1QixDQUFDLEVBQWUsZ0VBQWdFO0lBQ3ZILENBQUMsc0JBQWMsQ0FBQyxhQUFhLENBQUMsRUFBeUIsc0NBQXNDO0lBRTdGLENBQUMsc0JBQWMsQ0FBQyxpQkFBaUIsQ0FBQyxFQUFFLDZFQUE2RTtRQUM3RSxrQkFBa0I7UUFDbEIsb0VBQW9FO1FBQ3BFLGlGQUFpRjtRQUNqRiwwREFBMEQsbUJBQW1CLENBQUMscUJBQXFCLEdBQUc7SUFFMUksQ0FBQyxzQkFBYyxDQUFDLFlBQVksQ0FBQyxFQUFFLGlEQUFpRDtRQUNqRCxpRUFBaUU7SUFF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QUEwQixDQUFDLHdCQUF3QixDQUFDLEVBQUUseUpBQXlKO1FBQ3pKLDJHQUEyRztJQUNsSyxDQUFDLHFCQUEwQixDQUFDLG9CQUFvQixDQUFDLEVBQUUsaUlBQWlJO0lBQ3BMLENBQUMscUJBQTBCLENBQUMsZUFBZSxDQUFDLEVBQU8sd0pBQXdKO0NBQzlNLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBXQVJOSU5HOiB0aGlzIGZpbGUgaXMgdXNlZCBieSBib3RoIHRoZSBjbGllbnQgYW5kIHRoZSBzZXJ2ZXIuXG4vLyBEbyBub3QgdXNlIGFueSBicm93c2VyIG9yIG5vZGUtc3BlY2lmaWMgQVBJIVxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5pbXBvcnQgeyBSVU5USU1FX0VSUk9SUyB9IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCBCcm93c2VyQ29ubmVjdGlvbkVycm9ySGludCBmcm9tICcuLi8uLi9icm93c2VyL2Nvbm5lY3Rpb24vZXJyb3ItaGludHMnO1xuXG5jb25zdCBET0NVTUVOVEFUSU9OX0xJTktTID0ge1xuICAgIFRFU1RfU09VUkNFX1BBUkFNRVRFUjogJ2h0dHBzOi8vZGV2ZXhwcmVzcy5naXRodWIuaW8vdGVzdGNhZmUvZG9jdW1lbnRhdGlvbi91c2luZy10ZXN0Y2FmZS9jb21tYW5kLWxpbmUtaW50ZXJmYWNlLmh0bWwjZmlsZS1wYXRoZ2xvYi1wYXR0ZXJuJyxcbiAgICBGSUxURVJfU0VUVElOR1M6ICAgICAgICdodHRwczovL2RldmV4cHJlc3MuZ2l0aHViLmlvL3Rlc3RjYWZlL2RvY3VtZW50YXRpb24vdXNpbmctdGVzdGNhZmUvY29uZmlndXJhdGlvbi1maWxlLmh0bWwjZmlsdGVyJ1xufTtcblxuZXhwb3J0IGRlZmF1bHQge1xuICAgIFtSVU5USU1FX0VSUk9SUy5jYW5ub3RDcmVhdGVNdWx0aXBsZUxpdmVNb2RlUnVubmVyc106ICAnQ2Fubm90IGNyZWF0ZSBtdWx0aXBsZSBsaXZlIG1vZGUgcnVubmVycy4nLFxuICAgIFtSVU5USU1FX0VSUk9SUy5jYW5ub3RSdW5MaXZlTW9kZVJ1bm5lck11bHRpcGxlVGltZXNdOiAnQ2Fubm90IHJ1biBhIGxpdmUgbW9kZSBydW5uZXIgbXVsdGlwbGUgdGltZXMuJyxcbiAgICBbUlVOVElNRV9FUlJPUlMuYnJvd3NlckRpc2Nvbm5lY3RlZF06ICAgICAgICAgICAgICAgICAgJ1RoZSB7dXNlckFnZW50fSBicm93c2VyIGRpc2Nvbm5lY3RlZC4gVGhpcyBwcm9ibGVtIG1heSBhcHBlYXIgd2hlbiBhIGJyb3dzZXIgaGFuZ3Mgb3IgaXMgY2xvc2VkLCBvciBkdWUgdG8gbmV0d29yayBpc3N1ZXMuJyxcbiAgICBbUlVOVElNRV9FUlJPUlMuY2Fubm90UnVuQWdhaW5zdERpc2Nvbm5lY3RlZEJyb3dzZXJzXTogJ1RoZSBmb2xsb3dpbmcgYnJvd3NlcnMgZGlzY29ubmVjdGVkOiB7dXNlckFnZW50c30uIFRlc3RzIHdpbGwgbm90IGJlIHJ1bi4nLFxuICAgIFtSVU5USU1FX0VSUk9SUy50ZXN0UnVuUmVxdWVzdEluRGlzY29ubmVjdGVkQnJvd3Nlcl06ICAnXCJ7YnJvd3Nlcn1cIiBoYXMgZGlzY29ubmVjdGVkIGR1cmluZyB0ZXN0IGV4ZWN1dGlvbicsXG4gICAgW1JVTlRJTUVfRVJST1JTLmNhbm5vdEVzdGFibGlzaEJyb3dzZXJDb25uZWN0aW9uXTogICAgICdVbmFibGUgdG8gZXN0YWJsaXNoIG9uZSBvciBtb3JlIG9mIHRoZSBzcGVjaWZpZWQgYnJvd3NlciBjb25uZWN0aW9ucy4nLFxuICAgIFtSVU5USU1FX0VSUk9SUy5jYW5ub3RGaW5kQnJvd3Nlcl06ICAgICAgICAgICAgICAgICAgICAnVW5hYmxlIHRvIGZpbmQgdGhlIGJyb3dzZXIuIFwie2Jyb3dzZXJ9XCIgaXMgbm90IGEgYnJvd3NlciBhbGlhcyBvciBwYXRoIHRvIGFuIGV4ZWN1dGFibGUgZmlsZS4nLFxuICAgIFtSVU5USU1FX0VSUk9SUy5icm93c2VyUHJvdmlkZXJOb3RGb3VuZF06ICAgICAgICAgICAgICAnVGhlIHNwZWNpZmllZCBcIntwcm92aWRlck5hbWV9XCIgYnJvd3NlciBwcm92aWRlciB3YXMgbm90IGZvdW5kLicsXG4gICAgW1JVTlRJTUVfRVJST1JTLmJyb3dzZXJOb3RTZXRdOiAgICAgICAgICAgICAgICAgICAgICAgICdObyBicm93c2VyIHNlbGVjdGVkIHRvIHRlc3QgYWdhaW5zdC4nLFxuXG4gICAgW1JVTlRJTUVfRVJST1JTLnRlc3RGaWxlc05vdEZvdW5kXTogJ1Rlc3RDYWZlIGNvdWxkIG5vdCBmaW5kIHRoZSB0ZXN0IGZpbGVzIHRoYXQgbWF0Y2ggdGhlIGZvbGxvd2luZyBwYXR0ZXJuczpcXG4nICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAne3NvdXJjZUxpc3R9XFxuXFxuJyArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1RoZSBcIntjd2R9XCIgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeSB3YXMgdXNlZCBhcyB0aGUgYmFzZSBwYXRoLlxcbicgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdFbnN1cmUgdGhlIGZpbGUgcGF0dGVybnMgYXJlIGNvcnJlY3Qgb3IgY2hhbmdlIHRoZSBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5LlxcbicgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBob3cgdG8gc3BlY2lmeSB0ZXN0IGZpbGVzLCBzZWUgJHtET0NVTUVOVEFUSU9OX0xJTktTLlRFU1RfU09VUkNFX1BBUkFNRVRFUn0uYCxcblxuICAgIFtSVU5USU1FX0VSUk9SUy5ub1Rlc3RzVG9SdW5dOiAnTm8gdGVzdHMgZm91bmQgaW4gdGhlIHNwZWNpZmllZCBzb3VyY2UgZmlsZXMuXFxuJyArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiRW5zdXJlIHRoZSBzb3VyY2VzIGNvbnRhaW4gdGhlICdmaXh0dXJlJyBhbmQgJ3Rlc3QnIGRpcmVjdGl2ZXMuXCIsXG5cbiAgICBbUlVOVElNRV9FUlJPUlMubm9UZXN0c1RvUnVuRHVlRmlsdGVyaW5nXTogJ1RoZSBzcGVjaWZpZWQgZmlsdGVyIHNldHRpbmdzIGV4Y2x1ZGUgYWxsIHRlc3RzLlxcbicgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnTW9kaWZ5IHRoZXNlIHNldHRpbmdzIHRvIGxlYXZlIGF0IGxlYXN0IG9uZSBhdmFpbGFibGUgdGVzdC5cXG4nICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIGhvdyB0byBzcGVjaWZ5IGZpbHRlciBzZXR0aW5ncywgc2VlICR7RE9DVU1FTlRBVElPTl9MSU5LUy5GSUxURVJfU0VUVElOR1N9LmAsXG5cbiAgICBbUlVOVElNRV9FUlJPUlMuY2Fubm90RmluZFJlcG9ydGVyRm9yQWxpYXNdOiAgICAgICAgICAgICAgICAgICAgICAgICAnVGhlIHByb3ZpZGVkIFwie25hbWV9XCIgcmVwb3J0ZXIgZG9lcyBub3QgZXhpc3QuIENoZWNrIHRoYXQgeW91IGhhdmUgc3BlY2lmaWVkIHRoZSByZXBvcnQgZm9ybWF0IGNvcnJlY3RseS4nLFxuICAgIFtSVU5USU1FX0VSUk9SUy5tdWx0aXBsZVNhbWVTdHJlYW1SZXBvcnRlcnNdOiAgICAgICAgICAgICAgICAgICAgICAgICdUaGUgZm9sbG93aW5nIHJlcG9ydGVycyBhdHRlbXB0ZWQgdG8gd3JpdGUgdG8gdGhlIHNhbWUgb3V0cHV0IHN0cmVhbTogXCJ7cmVwb3J0ZXJzfVwiLiBPbmx5IG9uZSByZXBvcnRlciBjYW4gd3JpdGUgdG8gYSBzdHJlYW0uJyxcbiAgICBbUlVOVElNRV9FUlJPUlMub3B0aW9uVmFsdWVJc05vdFZhbGlkUmVnRXhwXTogICAgICAgICAgICAgICAgICAgICAgICAnVGhlIFwie29wdGlvbk5hbWV9XCIgb3B0aW9uIHZhbHVlIGlzIG5vdCBhIHZhbGlkIHJlZ3VsYXIgZXhwcmVzc2lvbi4nLFxuICAgIFtSVU5USU1FX0VSUk9SUy5vcHRpb25WYWx1ZUlzTm90VmFsaWRLZXlWYWx1ZV06ICAgICAgICAgICAgICAgICAgICAgICdUaGUgXCJ7b3B0aW9uTmFtZX1cIiBvcHRpb24gdmFsdWUgaXMgbm90IGEgdmFsaWQga2V5LXZhbHVlIHBhaXIuJyxcbiAgICBbUlVOVElNRV9FUlJPUlMuaW52YWxpZFNwZWVkVmFsdWVdOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnU3BlZWQgc2hvdWxkIGJlIGEgbnVtYmVyIGJldHdlZW4gMC4wMSBhbmQgMS4nLFxuICAgIFtSVU5USU1FX0VSUk9SUy5pbnZhbGlkQ29uY3VycmVuY3lGYWN0b3JdOiAgICAgICAgICAgICAgICAgICAgICAgICAgICdUaGUgY29uY3VycmVuY3kgZmFjdG9yIHNob3VsZCBiZSBhbiBpbnRlZ2VyIGdyZWF0ZXIgb3IgZXF1YWwgdG8gMS4nLFxuICAgIFtSVU5USU1FX0VSUk9SUy5jYW5ub3REaXZpZGVSZW1vdGVzQ291bnRCeUNvbmN1cnJlbmN5XTogICAgICAgICAgICAgICdUaGUgbnVtYmVyIG9mIHJlbW90ZSBicm93c2VycyBzaG91bGQgYmUgZGl2aXNpYmxlIGJ5IHRoZSBmYWN0b3Igb2YgY29uY3VycmVuY3kuJyxcbiAgICBbUlVOVElNRV9FUlJPUlMucG9ydHNPcHRpb25SZXF1aXJlc1R3b051bWJlcnNdOiAgICAgICAgICAgICAgICAgICAgICAnVGhlIFwiLS1wb3J0c1wiIG9wdGlvbiByZXF1aXJlcyB0d28gbnVtYmVycyB0byBiZSBzcGVjaWZpZWQuJyxcbiAgICBbUlVOVElNRV9FUlJPUlMucG9ydElzTm90RnJlZV06ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnVGhlIHNwZWNpZmllZCB7cG9ydE51bX0gcG9ydCBpcyBhbHJlYWR5IGluIHVzZSBieSBhbm90aGVyIHByb2dyYW0uJyxcbiAgICBbUlVOVElNRV9FUlJPUlMuaW52YWxpZEhvc3RuYW1lXTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnVGhlIHNwZWNpZmllZCBcIntob3N0bmFtZX1cIiBob3N0bmFtZSBjYW5ub3QgYmUgcmVzb2x2ZWQgdG8gdGhlIGN1cnJlbnQgbWFjaGluZS4nLFxuICAgIFtSVU5USU1FX0VSUk9SUy5jYW5ub3RGaW5kU3BlY2lmaWVkVGVzdFNvdXJjZV06ICAgICAgICAgICAgICAgICAgICAgICdDYW5ub3QgZmluZCBhIHRlc3Qgc291cmNlIGZpbGUgYXQgXCJ7cGF0aH1cIi4nLFxuICAgIFtSVU5USU1FX0VSUk9SUy5jbGllbnRGdW5jdGlvbkNvZGVJc05vdEFGdW5jdGlvbl06ICAgICAgICAgICAgICAgICAgICd7I2luc3RhbnRpYXRpb25DYWxsc2l0ZU5hbWV9IGNvZGUgaXMgZXhwZWN0ZWQgdG8gYmUgc3BlY2lmaWVkIGFzIGEgZnVuY3Rpb24sIGJ1dCB7dHlwZX0gd2FzIHBhc3NlZC4nLFxuICAgIFtSVU5USU1FX0VSUk9SUy5zZWxlY3RvckluaXRpYWxpemVkV2l0aFdyb25nVHlwZV06ICAgICAgICAgICAgICAgICAgICd7I2luc3RhbnRpYXRpb25DYWxsc2l0ZU5hbWV9IGlzIGV4cGVjdGVkIHRvIGJlIGluaXRpYWxpemVkIHdpdGggYSBmdW5jdGlvbiwgQ1NTIHNlbGVjdG9yIHN0cmluZywgYW5vdGhlciBTZWxlY3Rvciwgbm9kZSBzbmFwc2hvdCBvciBhIFByb21pc2UgcmV0dXJuZWQgYnkgYSBTZWxlY3RvciwgYnV0IHt0eXBlfSB3YXMgcGFzc2VkLicsXG4gICAgW1JVTlRJTUVfRVJST1JTLmNsaWVudEZ1bmN0aW9uQ2Fubm90UmVzb2x2ZVRlc3RSdW5dOiAgICAgICAgICAgICAgICAgXCJ7I2luc3RhbnRpYXRpb25DYWxsc2l0ZU5hbWV9IGNhbm5vdCBpbXBsaWNpdGx5IHJlc29sdmUgdGhlIHRlc3QgcnVuIGluIGNvbnRleHQgb2Ygd2hpY2ggaXQgc2hvdWxkIGJlIGV4ZWN1dGVkLiBJZiB5b3UgbmVlZCB0byBjYWxsIHsjaW5zdGFudGlhdGlvbkNhbGxzaXRlTmFtZX0gZnJvbSB0aGUgTm9kZS5qcyBBUEkgY2FsbGJhY2ssIHBhc3MgdGhlIHRlc3QgY29udHJvbGxlciBtYW51YWxseSB2aWEgeyNpbnN0YW50aWF0aW9uQ2FsbHNpdGVOYW1lfSdzIGAud2l0aCh7IGJvdW5kVGVzdFJ1bjogdCB9KWAgbWV0aG9kIGZpcnN0LiBOb3RlIHRoYXQgeW91IGNhbm5vdCBleGVjdXRlIHsjaW5zdGFudGlhdGlvbkNhbGxzaXRlTmFtZX0gb3V0c2lkZSB0aGUgdGVzdCBjb2RlLlwiLFxuICAgIFtSVU5USU1FX0VSUk9SUy5yZWdlbmVyYXRvckluQ2xpZW50RnVuY3Rpb25Db2RlXTogICAgICAgICAgICAgICAgICAgIGB7I2luc3RhbnRpYXRpb25DYWxsc2l0ZU5hbWV9IGNvZGUsIGFyZ3VtZW50cyBvciBkZXBlbmRlbmNpZXMgY2Fubm90IGNvbnRhaW4gZ2VuZXJhdG9ycyBvciBcImFzeW5jL2F3YWl0XCIgc3ludGF4ICh1c2UgUHJvbWlzZXMgaW5zdGVhZCkuYCxcbiAgICBbUlVOVElNRV9FUlJPUlMuaW52YWxpZENsaWVudEZ1bmN0aW9uVGVzdFJ1bkJpbmRpbmddOiAgICAgICAgICAgICAgICAnVGhlIFwiYm91bmRUZXN0UnVuXCIgb3B0aW9uIHZhbHVlIGlzIGV4cGVjdGVkIHRvIGJlIGEgdGVzdCBjb250cm9sbGVyLicsXG4gICAgW1JVTlRJTUVfRVJST1JTLmludmFsaWRWYWx1ZVR5cGVdOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3tzbXRoZ30gaXMgZXhwZWN0ZWQgdG8gYmUgYSB7dHlwZX0sIGJ1dCBpdCB3YXMge2FjdHVhbH0uJyxcbiAgICBbUlVOVElNRV9FUlJPUlMudW5zdXBwb3J0ZWRVcmxQcm90b2NvbF06ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnVGhlIHNwZWNpZmllZCBcInt1cmx9XCIgdGVzdCBwYWdlIFVSTCB1c2VzIGFuIHVuc3VwcG9ydGVkIHtwcm90b2NvbH06Ly8gcHJvdG9jb2wuIE9ubHkgcmVsYXRpdmUgVVJMcyBvciBhYnNvbHV0ZSBVUkxzIHdpdGggaHR0cDovLywgaHR0cHM6Ly8gYW5kIGZpbGU6Ly8gcHJvdG9jb2xzIGFyZSBzdXBwb3J0ZWQuJyxcbiAgICBbUlVOVElNRV9FUlJPUlMudGVzdENvbnRyb2xsZXJQcm94eUNhbm5vdFJlc29sdmVUZXN0UnVuXTogICAgICAgICAgICBgQ2Fubm90IGltcGxpY2l0bHkgcmVzb2x2ZSB0aGUgdGVzdCBydW4gaW4gdGhlIGNvbnRleHQgb2Ygd2hpY2ggdGhlIHRlc3QgY29udHJvbGxlciBhY3Rpb24gc2hvdWxkIGJlIGV4ZWN1dGVkLiBVc2UgdGVzdCBmdW5jdGlvbidzICd0JyBhcmd1bWVudCBpbnN0ZWFkLmAsXG4gICAgW1JVTlRJTUVfRVJST1JTLnRpbWVMaW1pdGVkUHJvbWlzZVRpbWVvdXRFeHBpcmVkXTogICAgICAgICAgICAgICAgICAgJ1RpbWVvdXQgZXhwaXJlZCBmb3IgYSB0aW1lIGxpbWl0ZWQgcHJvbWlzZScsXG4gICAgW1JVTlRJTUVfRVJST1JTLmNhbm5vdFNldFZpZGVvT3B0aW9uc1dpdGhvdXRCYXNlVmlkZW9QYXRoU3BlY2lmaWVkXTogJ1VuYWJsZSB0byBzZXQgdmlkZW8gb3IgZW5jb2Rpbmcgb3B0aW9ucyB3aGVuIHZpZGVvIHJlY29yZGluZyBpcyBkaXNhYmxlZC4gU3BlY2lmeSB0aGUgYmFzZSBwYXRoIHdoZXJlIHZpZGVvIGZpbGVzIGFyZSBzdG9yZWQgdG8gZW5hYmxlIHJlY29yZGluZy4nLFxuICAgIFtSVU5USU1FX0VSUk9SUy5tdWx0aXBsZUFQSU1ldGhvZENhbGxGb3JiaWRkZW5dOiAgICAgICAgICAgICAgICAgICAgICdZb3UgY2Fubm90IGNhbGwgdGhlIFwie21ldGhvZE5hbWV9XCIgbWV0aG9kIG1vcmUgdGhhbiBvbmNlLiBQYXNzIGFuIGFycmF5IG9mIHBhcmFtZXRlcnMgdG8gdGhpcyBtZXRob2QgaW5zdGVhZC4nLFxuICAgIFtSVU5USU1FX0VSUk9SUy5pbnZhbGlkUmVwb3J0ZXJPdXRwdXRdOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiU3BlY2lmeSBhIGZpbGUgbmFtZSBvciBhIHdyaXRhYmxlIHN0cmVhbSBhcyB0aGUgcmVwb3J0ZXIncyBvdXRwdXQgdGFyZ2V0LlwiLFxuICAgIFtSVU5USU1FX0VSUk9SUy5jYW5ub3RSZWFkU1NMQ2VydEZpbGVdOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdVbmFibGUgdG8gcmVhZCB0aGUgXCJ7cGF0aH1cIiBmaWxlLCBzcGVjaWZpZWQgYnkgdGhlIFwie29wdGlvbn1cIiBzc2wgb3B0aW9uLiBFcnJvciBkZXRhaWxzOlxcbicgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcXG4nICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAne2Vycn0nLFxuXG4gICAgW1JVTlRJTUVfRVJST1JTLmNhbm5vdFByZXBhcmVUZXN0c0R1ZVRvRXJyb3JdOiAnQ2Fubm90IHByZXBhcmUgdGVzdHMgZHVlIHRvIGFuIGVycm9yLlxcbicgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1xcbicgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3tlcnJNZXNzYWdlfScsXG5cbiAgICBbUlVOVElNRV9FUlJPUlMuY2Fubm90UGFyc2VSYXdGaWxlXTogJ0Nhbm5vdCBwYXJzZSBhIHRlc3Qgc291cmNlIGZpbGUgaW4gdGhlIHJhdyBmb3JtYXQgYXQgXCJ7cGF0aH1cIiBkdWUgdG8gYW4gZXJyb3IuXFxuJyArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcXG4nICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3tlcnJNZXNzYWdlfScsXG5cbiAgICBbUlVOVElNRV9FUlJPUlMudGVzdGVkQXBwRmFpbGVkV2l0aEVycm9yXTogJ1Rlc3RlZCBhcHAgZmFpbGVkIHdpdGggYW4gZXJyb3I6XFxuJyArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcXG4nICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3tlcnJNZXNzYWdlfScsXG5cbiAgICBbUlVOVElNRV9FUlJPUlMudW5hYmxlVG9PcGVuQnJvd3Nlcl06ICdXYXMgdW5hYmxlIHRvIG9wZW4gdGhlIGJyb3dzZXIgXCJ7YWxpYXN9XCIgZHVlIHRvIGVycm9yLlxcbicgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1xcbicgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3tlcnJNZXNzYWdlfScsXG5cbiAgICBbUlVOVElNRV9FUlJPUlMucmVxdWVzdEhvb2tDb25maWd1cmVBUElFcnJvcl06ICdUaGVyZSB3YXMgYW4gZXJyb3Igd2hpbGUgY29uZmlndXJpbmcgdGhlIHJlcXVlc3QgaG9vazpcXG4nICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcXG4nICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd7cmVxdWVzdEhvb2tOYW1lfToge2Vyck1zZ30nLFxuXG4gICAgW1JVTlRJTUVfRVJST1JTLmZvcmJpZGRlbkNoYXJhdGVyc0luU2NyZWVuc2hvdFBhdGhdOiAnVGhlcmUgYXJlIGZvcmJpZGRlbiBjaGFyYWN0ZXJzIGluIHRoZSBcIntzY3JlZW5zaG90UGF0aH1cIiB7c2NyZWVuc2hvdFBhdGhUeXBlfTpcXG4nICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcge2ZvcmJpZGRlbkNoYXJzRGVzY3JpcHRpb259JyxcblxuICAgIFtSVU5USU1FX0VSUk9SUy5jYW5ub3RGaW5kRkZNUEVHXTogJ1VuYWJsZSB0byBsb2NhdGUgdGhlIEZGbXBlZyBleGVjdXRhYmxlIHJlcXVpcmVkIHRvIHJlY29yZCB2aWRlb3MuIERvIG9uZSBvZiB0aGUgZm9sbG93aW5nOlxcbicgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1xcbicgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJyogYWRkIHRoZSBGRm1wZWcgaW5zdGFsbGF0aW9uIGRpcmVjdG9yeSB0byB0aGUgUEFUSCBlbnZpcm9ubWVudCB2YXJpYWJsZSxcXG4nICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcqIHNwZWNpZnkgdGhlIHBhdGggdG8gdGhlIEZGbXBlZyBleGVjdXRhYmxlIGluIHRoZSBGRk1QRUdfUEFUSCBlbnZpcm9ubWVudCB2YXJpYWJsZSBvciB0aGUgZmZtcGVnUGF0aCB2aWRlbyBvcHRpb24sXFxuJyArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnKiBpbnN0YWxsIHRoZSBAZmZtcGVnLWluc3RhbGxlci9mZm1wZWcgcGFja2FnZSBmcm9tIG5wbS4nLFxuXG4gICAgW1JVTlRJTUVfRVJST1JTLmNhbm5vdEZpbmRUeXBlc2NyaXB0Q29uZmlndXJhdGlvbkZpbGVdOiAgICAgICAgICAgICdVbmFibGUgdG8gZmluZCB0aGUgVHlwZVNjcmlwdCBjb25maWd1cmF0aW9uIGZpbGUgaW4gXCJ7ZmlsZVBhdGh9XCInLFxuICAgIFtSVU5USU1FX0VSUk9SUy5jbGllbnRTY3JpcHRJbml0aWFsaXplcklzTm90U3BlY2lmaWVkXTogICAgICAgICAgICAnU3BlY2lmeSB0aGUgSmF2YVNjcmlwdCBmaWxlIHBhdGgsIG1vZHVsZSBuYW1lIG9yIHNjcmlwdCBjb250ZW50IHRvIGluamVjdCBhIGNsaWVudCBzY3JpcHQuJyxcbiAgICBbUlVOVElNRV9FUlJPUlMuY2xpZW50U2NyaXB0QmFzZVBhdGhJc05vdFNwZWNpZmllZF06ICAgICAgICAgICAgICAgJ1NwZWNpZnkgdGhlIGJhc2UgcGF0aCBmb3IgdGhlIGNsaWVudCBzY3JpcHQgZmlsZS4nLFxuICAgIFtSVU5USU1FX0VSUk9SUy5jbGllbnRTY3JpcHRJbml0aWFsaXplck11bHRpcGxlQ29udGVudFNvdXJjZXNdOiAgICAnWW91IGNhbm5vdCBjb21iaW5lIHRoZSBmaWxlIHBhdGgsIG1vZHVsZSBuYW1lIGFuZCBzY3JpcHQgY29udGVudCB3aGVuIHlvdSBzcGVjaWZ5IGEgY2xpZW50IHNjcmlwdCB0byBpbmplY3QuJyxcbiAgICBbUlVOVElNRV9FUlJPUlMuY2Fubm90TG9hZENsaWVudFNjcmlwdEZyb21QYXRoXTogICAgICAgICAgICAgICAgICAgJ0Nhbm5vdCBsb2FkIGEgY2xpZW50IHNjcmlwdCBmcm9tIHtwYXRofS4nLFxuICAgIFtSVU5USU1FX0VSUk9SUy5jbGllbnRTY3JpcHRNb2R1bGVFbnRyeVBvaW50UGF0aENhbGN1bGF0aW9uRXJyb3JdOiAnQW4gZXJyb3Igb2NjdXJyZWQgd2hlbiB0cnlpbmcgdG8gbG9jYXRlIHRoZSBpbmplY3RlZCBjbGllbnQgc2NyaXB0IG1vZHVsZTpcXG5cXG57ZXJyb3JNZXNzYWdlfS4nLFxuICAgIFtSVU5USU1FX0VSUk9SUy5tZXRob2RJc05vdEF2YWlsYWJsZUZvckFuSVBDSG9zdF06ICAgICAgICAgICAgICAgICAnVGhpcyBtZXRob2QgY2Fubm90IGJlIGNhbGxlZCBvbiBhIHNlcnZpY2UgaG9zdC4nLFxuICAgIFtSVU5USU1FX0VSUk9SUy50b29MYXJnZUlQQ1BheWxvYWRdOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnVGhlIHNwZWNpZmllZCBwYXlsb2FkIGlzIHRvbyBsYXJnZSB0byBmb3JtIGFuIElQQyBwYWNrZXQuJyxcbiAgICBbUlVOVElNRV9FUlJPUlMubWFsZm9ybWVkSVBDTWVzc2FnZV06ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0Nhbm5vdCBwcm9jZXNzIGEgbWFsZm9ybWVkIElQQyBtZXNzYWdlLicsXG4gICAgW1JVTlRJTUVfRVJST1JTLnVuZXhwZWN0ZWRJUENIZWFkUGFja2V0XTogICAgICAgICAgICAgICAgICAgICAgICAgICdDYW5ub3QgY3JlYXRlIGFuIElQQyBtZXNzYWdlIGR1ZSB0byBhbiB1bmV4cGVjdGVkIElQQyBoZWFkIHBhY2tldC4nLFxuICAgIFtSVU5USU1FX0VSUk9SUy51bmV4cGVjdGVkSVBDQm9keVBhY2tldF06ICAgICAgICAgICAgICAgICAgICAgICAgICAnQ2Fubm90IGNyZWF0ZSBhbiBJUEMgbWVzc2FnZSBkdWUgdG8gYW4gdW5leHBlY3RlZCBJUEMgYm9keSBwYWNrZXQuJyxcbiAgICBbUlVOVElNRV9FUlJPUlMudW5leHBlY3RlZElQQ1RhaWxQYWNrZXRdOiAgICAgICAgICAgICAgICAgICAgICAgICAgJ0Nhbm5vdCBjcmVhdGUgYW4gSVBDIG1lc3NhZ2UgZHVlIHRvIGFuIHVuZXhwZWN0ZWQgSVBDIHRhaWwgcGFja2V0LicsXG4gICAgW1JVTlRJTUVfRVJST1JTLmNhbm5vdFJ1bkxvY2FsTm9uSGVhZGxlc3NCcm93c2VyV2l0aG91dERpc3BsYXldOlxuICAgICAgICAnWW91ciBMaW51eCB2ZXJzaW9uIGRvZXMgbm90IGhhdmUgYSBncmFwaGljIHN1YnN5c3RlbSB0byBydW4ge2Jyb3dzZXJBbGlhc30gd2l0aCBhIEdVSS4gJyArXG4gICAgICAgICdZb3UgY2FuIGxhdW5jaCB0aGUgYnJvd3NlciBpbiBoZWFkbGVzcyBtb2RlLiAnICtcbiAgICAgICAgJ0lmIHlvdSB1c2UgYSBwb3J0YWJsZSBicm93c2VyIHZlcnNpb24sICcgK1xuICAgICAgICAnc3BlY2lmeSB0aGUgYnJvd3NlciBhbGlhcyBiZWZvcmUgdGhlIHBhdGggaW5zdGVhZCBvZiB0aGUgXFwncGF0aFxcJyBwcmVmaXguICcgK1xuICAgICAgICAnRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSBodHRwczovL2RldmV4cHJlc3MuZ2l0aHViLmlvL3Rlc3RjYWZlL2RvY3VtZW50YXRpb24vZ3VpZGVzL2NvbmNlcHRzL2Jyb3dzZXJzLmh0bWwjdGVzdC1pbi1oZWFkbGVzcy1tb2RlJyxcblxuICAgIFtSVU5USU1FX0VSUk9SUy51bmNhdWdodEVycm9ySW5SZXBvcnRlcl06ICAgICAgICAgICAnQW4gdW5jYXVnaHQgZXJyb3Igb2NjdXJyZWQgaW4gdGhlIFwie3JlcG9ydGVyTmFtZX1cIiByZXBvcnRlclxcJ3MgXCJ7bWV0aG9kTmFtZX1cIiBtZXRob2QuIEVycm9yIGRldGFpbHM6XFxue29yaWdpbmFsRXJyb3J9JyxcbiAgICBbUlVOVElNRV9FUlJPUlMucm9sZUluaXRpYWxpemVkV2l0aFJlbGF0aXZlVXJsXTogICAgJ1lvdSBjYW5ub3Qgc3BlY2lmeSByZWxhdGl2ZSBsb2dpbiBwYWdlIFVSTHMgaW4gdGhlIFJvbGUgY29uc3RydWN0b3IuIFVzZSBhbiBhYnNvbHV0ZSBVUkwuJyxcbiAgICBbUlVOVElNRV9FUlJPUlMudHlwZVNjcmlwdENvbXBpbGVyTG9hZGluZ0Vycm9yXTogICAgJ1VuYWJsZSB0byBsb2FkIHRoZSBUeXBlU2NyaXB0IGNvbXBpbGVyLlxcbntvcmlnaW5FcnJvck1lc3NhZ2V9LicsXG4gICAgW1JVTlRJTUVfRVJST1JTLmNhbm5vdEN1c3RvbWl6ZVNwZWNpZmllZENvbXBpbGVyc106ICdZb3UgY2Fubm90IHNwZWNpZnkgb3B0aW9ucyBmb3IgdGhlIHtub25jdXN0b21pemFibGVDb21waWxlckxpc3R9IGNvbXBpbGVye3N1ZmZpeH0uJyxcblxuICAgIFtSVU5USU1FX0VSUk9SUy5jYW5ub3RFbmFibGVSZXRyeVRlc3RQYWdlc09wdGlvbl06XG4gICAgICAgICdDYW5ub3QgZW5hYmxlIHRoZSBcXCdyZXRyeVRlc3RQYWdlc1xcJyBvcHRpb24uIEFwcGx5IG9uZSBvZiB0aGUgZm9sbG93aW5nIHR3byBzb2x1dGlvbnM6XFxuJyArXG4gICAgICAgICctLSBzZXQgXFwnbG9jYWxob3N0XFwnIGFzIHRoZSB2YWx1ZSBvZiB0aGUgXFwnaG9zdG5hbWVcXCcgb3B0aW9uXFxuJyArXG4gICAgICAgICctLSBydW4gVGVzdENhZmUgb3ZlciBIVFRQU1xcbicsXG5cbiAgICBbUlVOVElNRV9FUlJPUlMuYnJvd3NlckNvbm5lY3Rpb25FcnJvcl06ICAgICAgICAgICAgICAgJ3tvcmlnaW5FcnJvck1lc3NhZ2V9XFxue251bU9mTm90T3BlbmVkQ29ubmVjdGlvbn0gb2Yge251bU9mQWxsQ29ubmVjdGlvbnN9IGJyb3dzZXIgY29ubmVjdGlvbnMgaGF2ZSBub3QgYmVlbiBlc3RhYmxpc2hlZDpcXG57bGlzdE9mTm90T3BlbmVkQ29ubmVjdGlvbnN9XFxuXFxuSGludHM6XFxue2xpc3RPZkhpbnRzfScsXG4gICAgW0Jyb3dzZXJDb25uZWN0aW9uRXJyb3JIaW50LlRvb0hpZ2hDb25jdXJyZW5jeUZhY3Rvcl06ICdUaGUgZXJyb3IgY2FuIGJlIGR1ZSB0byBhIGNvbmN1cnJlbmN5IGZhY3RvciB0aGF0IGlzIHRvbyBoaWdoIGZvciB0aGUgaG9zdCBtYWNoaW5l4oCZcyBwZXJmb3JtYW5jZSAodGhlIGZhY3RvciB2YWx1ZSB7Y29uY3VycmVuY3lGYWN0b3J9IHdhcyBzcGVjaWZpZWQpLiAnICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1RyeSB0byBkZWNyZWFzZSB0aGUgY29uY3VycmVuY3kgZmFjdG9yIG9yIGVuc3VyZSBtb3JlIHN5c3RlbSByZXNvdXJjZXMgYXJlIGF2YWlsYWJsZSBvbiB0aGUgaG9zdCBtYWNoaW5lLicsXG4gICAgW0Jyb3dzZXJDb25uZWN0aW9uRXJyb3JIaW50LlVzZUJyb3dzZXJJbml0T3B0aW9uXTogJ1VzZSB0aGUgXCJicm93c2VySW5pdFRpbWVvdXRcIiBvcHRpb24gdG8gYWxsb3cgbW9yZSB0aW1lIGZvciB0aGUgYnJvd3NlciB0byBzdGFydC4gVGhlIHRpbWVvdXQgaXMgc2V0IHRvIHticm93c2VySW5pdFRpbWVvdXRNc2d9LicsXG4gICAgW0Jyb3dzZXJDb25uZWN0aW9uRXJyb3JIaW50LlJlc3RFcnJvckNhdXNlc106ICAgICAgJ1RoZSBlcnJvciBjYW4gYWxzbyBiZSBjYXVzZWQgYnkgbmV0d29yayBpc3N1ZXMgb3IgcmVtb3RlIGRldmljZSBmYWlsdXJlLiBNYWtlIHN1cmUgdGhhdCB0aGUgY29ubmVjdGlvbiBpcyBzdGFibGUgYW5kIHRoZSByZW1vdGUgZGV2aWNlIGNhbiBiZSByZWFjaGVkLidcbn07XG4iXX0=
|
|
117
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVtcGxhdGVzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2Vycm9ycy9ydW50aW1lL3RlbXBsYXRlcy5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsZ0VBQWdFO0FBQ2hFLGdFQUFnRTtBQUNoRSwrQ0FBK0M7QUFDL0MsZ0VBQWdFOzs7OztBQUVoRSxvQ0FBMEM7QUFDMUMsdUZBQThFO0FBRTlFLE1BQU0sbUJBQW1CLEdBQUc7SUFDeEIscUJBQXFCLEVBQUUsc0hBQXNIO0lBQzdJLGVBQWUsRUFBUSxtR0FBbUc7Q0FDN0gsQ0FBQztBQUVGLGtCQUFlO0lBQ1gsQ0FBQyxzQkFBYyxDQUFDLG1DQUFtQyxDQUFDLEVBQUcsMkNBQTJDO0lBQ2xHLENBQUMsc0JBQWMsQ0FBQyxvQ0FBb0MsQ0FBQyxFQUFFLCtDQUErQztJQUN0RyxDQUFDLHNCQUFjLENBQUMsbUJBQW1CLENBQUMsRUFBbUIsNEhBQTRIO0lBQ25MLENBQUMsc0JBQWMsQ0FBQyxvQ0FBb0MsQ0FBQyxFQUFFLDJFQUEyRTtJQUNsSSxDQUFDLHNCQUFjLENBQUMsbUNBQW1DLENBQUMsRUFBRyxvREFBb0Q7SUFDM0csQ0FBQyxzQkFBYyxDQUFDLGdDQUFnQyxDQUFDLEVBQU0sdUVBQXVFO0lBQzlILENBQUMsc0JBQWMsQ0FBQyxpQkFBaUIsQ0FBQyxFQUFxQiwrRkFBK0Y7SUFDdEosQ0FBQyxzQkFBYyxDQUFDLHVCQUF1QixDQUFDLEVBQWUsZ0VBQWdFO0lBQ3ZILENBQUMsc0JBQWMsQ0FBQyxhQUFhLENBQUMsRUFBeUIsc0NBQXNDO0lBRTdGLENBQUMsc0JBQWMsQ0FBQyxpQkFBaUIsQ0FBQyxFQUFFLDZFQUE2RTtRQUM3RSxrQkFBa0I7UUFDbEIsb0VBQW9FO1FBQ3BFLGlGQUFpRjtRQUNqRiwwREFBMEQsbUJBQW1CLENBQUMscUJBQXFCLEdBQUc7SUFFMUksQ0FBQyxzQkFBYyxDQUFDLFlBQVksQ0FBQyxFQUFFLGlEQUFpRDtRQUNqRCxpRUFBaUU7SUFF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LDBGQUEwRjtRQUMxRixnRUFBZ0U7UUFDaEUsOEJBQThCO0lBRWxDLENBQUMsc0JBQWMsQ0FBQyxzQkFBc0IsQ0FBQyxFQUFnQixpTEFBaUw7SUFDeE8sQ0FBQyxxQkFBMEIsQ0FBQyx3QkFBd0IsQ0FBQyxFQUFFLHlKQUF5SjtRQUN6SiwyR0FBMkc7SUFDbEssQ0FBQyxxQkFBMEIsQ0FBQyxvQkFBb0IsQ0FBQyxFQUFFLGlJQUFpSTtJQUNwTCxDQUFDLHFCQUEwQixDQUFDLGVBQWUsQ0FBQyxFQUFPLHdKQUF3SjtDQUM5TSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gV0FSTklORzogdGhpcyBmaWxlIGlzIHVzZWQgYnkgYm90aCB0aGUgY2xpZW50IGFuZCB0aGUgc2VydmVyLlxuLy8gRG8gbm90IHVzZSBhbnkgYnJvd3NlciBvciBub2RlLXNwZWNpZmljIEFQSSFcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuaW1wb3J0IHsgUlVOVElNRV9FUlJPUlMgfSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQgQnJvd3NlckNvbm5lY3Rpb25FcnJvckhpbnQgZnJvbSAnLi4vLi4vYnJvd3Nlci9jb25uZWN0aW9uL2Vycm9yLWhpbnRzJztcblxuY29uc3QgRE9DVU1FTlRBVElPTl9MSU5LUyA9IHtcbiAgICBURVNUX1NPVVJDRV9QQVJBTUVURVI6ICdodHRwczovL2RldmV4cHJlc3MuZ2l0aHViLmlvL3Rlc3RjYWZlL2RvY3VtZW50YXRpb24vdXNpbmctdGVzdGNhZmUvY29tbWFuZC1saW5lLWludGVyZmFjZS5odG1sI2ZpbGUtcGF0aGdsb2ItcGF0dGVybicsXG4gICAgRklMVEVSX1NFVFRJTkdTOiAgICAgICAnaHR0cHM6Ly9kZXZleHByZXNzLmdpdGh1Yi5pby90ZXN0Y2FmZS9kb2N1bWVudGF0aW9uL3VzaW5nLXRlc3RjYWZlL2NvbmZpZ3VyYXRpb24tZmlsZS5odG1sI2ZpbHRlcidcbn07XG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgICBbUlVOVElNRV9FUlJPUlMuY2Fubm90Q3JlYXRlTXVsdGlwbGVMaXZlTW9kZVJ1bm5lcnNdOiAgJ0Nhbm5vdCBjcmVhdGUgbXVsdGlwbGUgbGl2ZSBtb2RlIHJ1bm5lcnMuJyxcbiAgICBbUlVOVElNRV9FUlJPUlMuY2Fubm90UnVuTGl2ZU1vZGVSdW5uZXJNdWx0aXBsZVRpbWVzXTogJ0Nhbm5vdCBydW4gYSBsaXZlIG1vZGUgcnVubmVyIG11bHRpcGxlIHRpbWVzLicsXG4gICAgW1JVTlRJTUVfRVJST1JTLmJyb3dzZXJEaXNjb25uZWN0ZWRdOiAgICAgICAgICAgICAgICAgICdUaGUge3VzZXJBZ2VudH0gYnJvd3NlciBkaXNjb25uZWN0ZWQuIFRoaXMgcHJvYmxlbSBtYXkgYXBwZWFyIHdoZW4gYSBicm93c2VyIGhhbmdzIG9yIGlzIGNsb3NlZCwgb3IgZHVlIHRvIG5ldHdvcmsgaXNzdWVzLicsXG4gICAgW1JVTlRJTUVfRVJST1JTLmNhbm5vdFJ1bkFnYWluc3REaXNjb25uZWN0ZWRCcm93c2Vyc106ICdUaGUgZm9sbG93aW5nIGJyb3dzZXJzIGRpc2Nvbm5lY3RlZDoge3VzZXJBZ2VudHN9LiBUZXN0cyB3aWxsIG5vdCBiZSBydW4uJyxcbiAgICBbUlVOVElNRV9FUlJPUlMudGVzdFJ1blJlcXVlc3RJbkRpc2Nvbm5lY3RlZEJyb3dzZXJdOiAgJ1wie2Jyb3dzZXJ9XCIgaGFzIGRpc2Nvbm5lY3RlZCBkdXJpbmcgdGVzdCBleGVjdXRpb24nLFxuICAgIFtSVU5USU1FX0VSUk9SUy5jYW5ub3RFc3RhYmxpc2hCcm93c2VyQ29ubmVjdGlvbl06ICAgICAnVW5hYmxlIHRvIGVzdGFibGlzaCBvbmUgb3IgbW9yZSBvZiB0aGUgc3BlY2lmaWVkIGJyb3dzZXIgY29ubmVjdGlvbnMuJyxcbiAgICBbUlVOVElNRV9FUlJPUlMuY2Fubm90RmluZEJyb3dzZXJdOiAgICAgICAgICAgICAgICAgICAgJ1VuYWJsZSB0byBmaW5kIHRoZSBicm93c2VyLiBcInticm93c2VyfVwiIGlzIG5vdCBhIGJyb3dzZXIgYWxpYXMgb3IgcGF0aCB0byBhbiBleGVjdXRhYmxlIGZpbGUuJyxcbiAgICBbUlVOVElNRV9FUlJPUlMuYnJvd3NlclByb3ZpZGVyTm90Rm91bmRdOiAgICAgICAgICAgICAgJ1RoZSBzcGVjaWZpZWQgXCJ7cHJvdmlkZXJOYW1lfVwiIGJyb3dzZXIgcHJvdmlkZXIgd2FzIG5vdCBmb3VuZC4nLFxuICAgIFtSVU5USU1FX0VSUk9SUy5icm93c2VyTm90U2V0XTogICAgICAgICAgICAgICAgICAgICAgICAnTm8gYnJvd3NlciBzZWxlY3RlZCB0byB0ZXN0IGFnYWluc3QuJyxcblxuICAgIFtSVU5USU1FX0VSUk9SUy50ZXN0RmlsZXNOb3RGb3VuZF06ICdUZXN0Q2FmZSBjb3VsZCBub3QgZmluZCB0aGUgdGVzdCBmaWxlcyB0aGF0IG1hdGNoIHRoZSBmb2xsb3dpbmcgcGF0dGVybnM6XFxuJyArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3tzb3VyY2VMaXN0fVxcblxcbicgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdUaGUgXCJ7Y3dkfVwiIGN1cnJlbnQgd29ya2luZyBkaXJlY3Rvcnkgd2FzIHVzZWQgYXMgdGhlIGJhc2UgcGF0aC5cXG4nICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnRW5zdXJlIHRoZSBmaWxlIHBhdHRlcm5zIGFyZSBjb3JyZWN0IG9yIGNoYW5nZSB0aGUgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeS5cXG4nICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gaG93IHRvIHNwZWNpZnkgdGVzdCBmaWxlcywgc2VlICR7RE9DVU1FTlRBVElPTl9MSU5LUy5URVNUX1NPVVJDRV9QQVJBTUVURVJ9LmAsXG5cbiAgICBbUlVOVElNRV9FUlJPUlMubm9UZXN0c1RvUnVuXTogJ05vIHRlc3RzIGZvdW5kIGluIHRoZSBzcGVjaWZpZWQgc291cmNlIGZpbGVzLlxcbicgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIkVuc3VyZSB0aGUgc291cmNlcyBjb250YWluIHRoZSAnZml4dHVyZScgYW5kICd0ZXN0JyBkaXJlY3RpdmVzLlwiLFxuXG4gICAgW1JVTlRJTUVfRVJST1JTLm5vVGVzdHNUb1J1bkR1ZUZpbHRlcmluZ106ICdUaGUgc3BlY2lmaWVkIGZpbHRlciBzZXR0aW5ncyBleGNsdWRlIGFsbCB0ZXN0cy5cXG4nICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ01vZGlmeSB0aGVzZSBzZXR0aW5ncyB0byBsZWF2ZSBhdCBsZWFzdCBvbmUgYXZhaWxhYmxlIHRlc3QuXFxuJyArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBob3cgdG8gc3BlY2lmeSBmaWx0ZXIgc2V0dGluZ3MsIHNlZSAke0RPQ1VNRU5UQVRJT05fTElOS1MuRklMVEVSX1NFVFRJTkdTfS5gLFxuXG4gICAgW1JVTlRJTUVfRVJST1JTLmNhbm5vdEZpbmRSZXBvcnRlckZvckFsaWFzXTogICAgICAgICAgICAgICAgICAgICAgICAgJ1RoZSBwcm92aWRlZCBcIntuYW1lfVwiIHJlcG9ydGVyIGRvZXMgbm90IGV4aXN0LiBDaGVjayB0aGF0IHlvdSBoYXZlIHNwZWNpZmllZCB0aGUgcmVwb3J0IGZvcm1hdCBjb3JyZWN0bHkuJyxcbiAgICBbUlVOVElNRV9FUlJPUlMubXVsdGlwbGVTYW1lU3RyZWFtUmVwb3J0ZXJzXTogICAgICAgICAgICAgICAgICAgICAgICAnVGhlIGZvbGxvd2luZyByZXBvcnRlcnMgYXR0ZW1wdGVkIHRvIHdyaXRlIHRvIHRoZSBzYW1lIG91dHB1dCBzdHJlYW06IFwie3JlcG9ydGVyc31cIi4gT25seSBvbmUgcmVwb3J0ZXIgY2FuIHdyaXRlIHRvIGEgc3RyZWFtLicsXG4gICAgW1JVTlRJTUVfRVJST1JTLm9wdGlvblZhbHVlSXNOb3RWYWxpZFJlZ0V4cF06ICAgICAgICAgICAgICAgICAgICAgICAgJ1RoZSBcIntvcHRpb25OYW1lfVwiIG9wdGlvbiB2YWx1ZSBpcyBub3QgYSB2YWxpZCByZWd1bGFyIGV4cHJlc3Npb24uJyxcbiAgICBbUlVOVElNRV9FUlJPUlMub3B0aW9uVmFsdWVJc05vdFZhbGlkS2V5VmFsdWVdOiAgICAgICAgICAgICAgICAgICAgICAnVGhlIFwie29wdGlvbk5hbWV9XCIgb3B0aW9uIHZhbHVlIGlzIG5vdCBhIHZhbGlkIGtleS12YWx1ZSBwYWlyLicsXG4gICAgW1JVTlRJTUVfRVJST1JTLmludmFsaWRRdWFyYW50aW5lT3B0aW9uXTogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1RoZSBcIntvcHRpb25OYW1lfVwiIG9wdGlvbiBzaG91bGQgYmUgZW1wdHksIG90aGVyd2lzZSBvbmUgb2YgXCJyZXRyeUNvdW50XCIgb3IgXCJwYXNzQ291bnRcIi4nLFxuICAgIFtSVU5USU1FX0VSUk9SUy5pbnZhbGlkUmV0cnlDb3VudFZhbHVlXTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICdUaGUgXCJyZXRyeUNvdW50XCIgdmFsdWUgc2hvdWxkIGJlIGdyZWF0ZXIgb3IgZXF1YWwgdG8gXCJwYXNzQ291bnRcIiAoe3Bhc3NDb3VudH0pLicsXG4gICAgW1JVTlRJTUVfRVJST1JTLmludmFsaWRTcGVlZFZhbHVlXTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1NwZWVkIHNob3VsZCBiZSBhIG51bWJlciBiZXR3ZWVuIDAuMDEgYW5kIDEuJyxcbiAgICBbUlVOVElNRV9FUlJPUlMuaW52YWxpZENvbmN1cnJlbmN5RmFjdG9yXTogICAgICAgICAgICAgICAgICAgICAgICAgICAnVGhlIGNvbmN1cnJlbmN5IGZhY3RvciBzaG91bGQgYmUgYW4gaW50ZWdlciBncmVhdGVyIG9yIGVxdWFsIHRvIDEuJyxcbiAgICBbUlVOVElNRV9FUlJPUlMuY2Fubm90RGl2aWRlUmVtb3Rlc0NvdW50QnlDb25jdXJyZW5jeV06ICAgICAgICAgICAgICAnVGhlIG51bWJlciBvZiByZW1vdGUgYnJvd3NlcnMgc2hvdWxkIGJlIGRpdmlzaWJsZSBieSB0aGUgZmFjdG9yIG9mIGNvbmN1cnJlbmN5LicsXG4gICAgW1JVTlRJTUVfRVJST1JTLnBvcnRzT3B0aW9uUmVxdWlyZXNUd29OdW1iZXJzXTogICAgICAgICAgICAgICAgICAgICAgJ1RoZSBcIi0tcG9ydHNcIiBvcHRpb24gcmVxdWlyZXMgdHdvIG51bWJlcnMgdG8gYmUgc3BlY2lmaWVkLicsXG4gICAgW1JVTlRJTUVfRVJST1JTLnBvcnRJc05vdEZyZWVdOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1RoZSBzcGVjaWZpZWQge3BvcnROdW19IHBvcnQgaXMgYWxyZWFkeSBpbiB1c2UgYnkgYW5vdGhlciBwcm9ncmFtLicsXG4gICAgW1JVTlRJTUVfRVJST1JTLmludmFsaWRIb3N0bmFtZV06ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1RoZSBzcGVjaWZpZWQgXCJ7aG9zdG5hbWV9XCIgaG9zdG5hbWUgY2Fubm90IGJlIHJlc29sdmVkIHRvIHRoZSBjdXJyZW50IG1hY2hpbmUuJyxcbiAgICBbUlVOVElNRV9FUlJPUlMuY2Fubm90RmluZFNwZWNpZmllZFRlc3RTb3VyY2VdOiAgICAgICAgICAgICAgICAgICAgICAnQ2Fubm90IGZpbmQgYSB0ZXN0IHNvdXJjZSBmaWxlIGF0IFwie3BhdGh9XCIuJyxcbiAgICBbUlVOVElNRV9FUlJPUlMuY2xpZW50RnVuY3Rpb25Db2RlSXNOb3RBRnVuY3Rpb25dOiAgICAgICAgICAgICAgICAgICAneyNpbnN0YW50aWF0aW9uQ2FsbHNpdGVOYW1lfSBjb2RlIGlzIGV4cGVjdGVkIHRvIGJlIHNwZWNpZmllZCBhcyBhIGZ1bmN0aW9uLCBidXQge3R5cGV9IHdhcyBwYXNzZWQuJyxcbiAgICBbUlVOVElNRV9FUlJPUlMuc2VsZWN0b3JJbml0aWFsaXplZFdpdGhXcm9uZ1R5cGVdOiAgICAgICAgICAgICAgICAgICAneyNpbnN0YW50aWF0aW9uQ2FsbHNpdGVOYW1lfSBpcyBleHBlY3RlZCB0byBiZSBpbml0aWFsaXplZCB3aXRoIGEgZnVuY3Rpb24sIENTUyBzZWxlY3RvciBzdHJpbmcsIGFub3RoZXIgU2VsZWN0b3IsIG5vZGUgc25hcHNob3Qgb3IgYSBQcm9taXNlIHJldHVybmVkIGJ5IGEgU2VsZWN0b3IsIGJ1dCB7dHlwZX0gd2FzIHBhc3NlZC4nLFxuICAgIFtSVU5USU1FX0VSUk9SUy5jbGllbnRGdW5jdGlvbkNhbm5vdFJlc29sdmVUZXN0UnVuXTogICAgICAgICAgICAgICAgIFwieyNpbnN0YW50aWF0aW9uQ2FsbHNpdGVOYW1lfSBjYW5ub3QgaW1wbGljaXRseSByZXNvbHZlIHRoZSB0ZXN0IHJ1biBpbiBjb250ZXh0IG9mIHdoaWNoIGl0IHNob3VsZCBiZSBleGVjdXRlZC4gSWYgeW91IG5lZWQgdG8gY2FsbCB7I2luc3RhbnRpYXRpb25DYWxsc2l0ZU5hbWV9IGZyb20gdGhlIE5vZGUuanMgQVBJIGNhbGxiYWNrLCBwYXNzIHRoZSB0ZXN0IGNvbnRyb2xsZXIgbWFudWFsbHkgdmlhIHsjaW5zdGFudGlhdGlvbkNhbGxzaXRlTmFtZX0ncyBgLndpdGgoeyBib3VuZFRlc3RSdW46IHQgfSlgIG1ldGhvZCBmaXJzdC4gTm90ZSB0aGF0IHlvdSBjYW5ub3QgZXhlY3V0ZSB7I2luc3RhbnRpYXRpb25DYWxsc2l0ZU5hbWV9IG91dHNpZGUgdGhlIHRlc3QgY29kZS5cIixcbiAgICBbUlVOVElNRV9FUlJPUlMucmVnZW5lcmF0b3JJbkNsaWVudEZ1bmN0aW9uQ29kZV06ICAgICAgICAgICAgICAgICAgICBgeyNpbnN0YW50aWF0aW9uQ2FsbHNpdGVOYW1lfSBjb2RlLCBhcmd1bWVudHMgb3IgZGVwZW5kZW5jaWVzIGNhbm5vdCBjb250YWluIGdlbmVyYXRvcnMgb3IgXCJhc3luYy9hd2FpdFwiIHN5bnRheCAodXNlIFByb21pc2VzIGluc3RlYWQpLmAsXG4gICAgW1JVTlRJTUVfRVJST1JTLmludmFsaWRDbGllbnRGdW5jdGlvblRlc3RSdW5CaW5kaW5nXTogICAgICAgICAgICAgICAgJ1RoZSBcImJvdW5kVGVzdFJ1blwiIG9wdGlvbiB2YWx1ZSBpcyBleHBlY3RlZCB0byBiZSBhIHRlc3QgY29udHJvbGxlci4nLFxuICAgIFtSVU5USU1FX0VSUk9SUy5pbnZhbGlkVmFsdWVUeXBlXTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd7c210aGd9IGlzIGV4cGVjdGVkIHRvIGJlIGEge3R5cGV9LCBidXQgaXQgd2FzIHthY3R1YWx9LicsXG4gICAgW1JVTlRJTUVfRVJST1JTLnVuc3VwcG9ydGVkVXJsUHJvdG9jb2xdOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1RoZSBzcGVjaWZpZWQgXCJ7dXJsfVwiIHRlc3QgcGFnZSBVUkwgdXNlcyBhbiB1bnN1cHBvcnRlZCB7cHJvdG9jb2x9Oi8vIHByb3RvY29sLiBPbmx5IHJlbGF0aXZlIFVSTHMgb3IgYWJzb2x1dGUgVVJMcyB3aXRoIGh0dHA6Ly8sIGh0dHBzOi8vIGFuZCBmaWxlOi8vIHByb3RvY29scyBhcmUgc3VwcG9ydGVkLicsXG4gICAgW1JVTlRJTUVfRVJST1JTLnRlc3RDb250cm9sbGVyUHJveHlDYW5ub3RSZXNvbHZlVGVzdFJ1bl06ICAgICAgICAgICAgYENhbm5vdCBpbXBsaWNpdGx5IHJlc29sdmUgdGhlIHRlc3QgcnVuIGluIHRoZSBjb250ZXh0IG9mIHdoaWNoIHRoZSB0ZXN0IGNvbnRyb2xsZXIgYWN0aW9uIHNob3VsZCBiZSBleGVjdXRlZC4gVXNlIHRlc3QgZnVuY3Rpb24ncyAndCcgYXJndW1lbnQgaW5zdGVhZC5gLFxuICAgIFtSVU5USU1FX0VSUk9SUy50aW1lTGltaXRlZFByb21pc2VUaW1lb3V0RXhwaXJlZF06ICAgICAgICAgICAgICAgICAgICdUaW1lb3V0IGV4cGlyZWQgZm9yIGEgdGltZSBsaW1pdGVkIHByb21pc2UnLFxuICAgIFtSVU5USU1FX0VSUk9SUy5jYW5ub3RTZXRWaWRlb09wdGlvbnNXaXRob3V0QmFzZVZpZGVvUGF0aFNwZWNpZmllZF06ICdVbmFibGUgdG8gc2V0IHZpZGVvIG9yIGVuY29kaW5nIG9wdGlvbnMgd2hlbiB2aWRlbyByZWNvcmRpbmcgaXMgZGlzYWJsZWQuIFNwZWNpZnkgdGhlIGJhc2UgcGF0aCB3aGVyZSB2aWRlbyBmaWxlcyBhcmUgc3RvcmVkIHRvIGVuYWJsZSByZWNvcmRpbmcuJyxcbiAgICBbUlVOVElNRV9FUlJPUlMubXVsdGlwbGVBUElNZXRob2RDYWxsRm9yYmlkZGVuXTogICAgICAgICAgICAgICAgICAgICAnWW91IGNhbm5vdCBjYWxsIHRoZSBcInttZXRob2ROYW1lfVwiIG1ldGhvZCBtb3JlIHRoYW4gb25jZS4gUGFzcyBhbiBhcnJheSBvZiBwYXJhbWV0ZXJzIHRvIHRoaXMgbWV0aG9kIGluc3RlYWQuJyxcbiAgICBbUlVOVElNRV9FUlJPUlMuaW52YWxpZFJlcG9ydGVyT3V0cHV0XTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIlNwZWNpZnkgYSBmaWxlIG5hbWUgb3IgYSB3cml0YWJsZSBzdHJlYW0gYXMgdGhlIHJlcG9ydGVyJ3Mgb3V0cHV0IHRhcmdldC5cIixcbiAgICBbUlVOVElNRV9FUlJPUlMuY2Fubm90UmVhZFNTTENlcnRGaWxlXTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnVW5hYmxlIHRvIHJlYWQgdGhlIFwie3BhdGh9XCIgZmlsZSwgc3BlY2lmaWVkIGJ5IHRoZSBcIntvcHRpb259XCIgc3NsIG9wdGlvbi4gRXJyb3IgZGV0YWlsczpcXG4nICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXFxuJyArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3tlcnJ9JyxcblxuICAgIFtSVU5USU1FX0VSUk9SUy5jYW5ub3RQcmVwYXJlVGVzdHNEdWVUb0Vycm9yXTogJ0Nhbm5vdCBwcmVwYXJlIHRlc3RzIGR1ZSB0byBhbiBlcnJvci5cXG4nICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcXG4nICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd7ZXJyTWVzc2FnZX0nLFxuXG4gICAgW1JVTlRJTUVfRVJST1JTLmNhbm5vdFBhcnNlUmF3RmlsZV06ICdDYW5ub3QgcGFyc2UgYSB0ZXN0IHNvdXJjZSBmaWxlIGluIHRoZSByYXcgZm9ybWF0IGF0IFwie3BhdGh9XCIgZHVlIHRvIGFuIGVycm9yLlxcbicgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXFxuJyArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd7ZXJyTWVzc2FnZX0nLFxuXG4gICAgW1JVTlRJTUVfRVJST1JTLnRlc3RlZEFwcEZhaWxlZFdpdGhFcnJvcl06ICdUZXN0ZWQgYXBwIGZhaWxlZCB3aXRoIGFuIGVycm9yOlxcbicgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXFxuJyArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd7ZXJyTWVzc2FnZX0nLFxuXG4gICAgW1JVTlRJTUVfRVJST1JTLnVuYWJsZVRvT3BlbkJyb3dzZXJdOiAnV2FzIHVuYWJsZSB0byBvcGVuIHRoZSBicm93c2VyIFwie2FsaWFzfVwiIGR1ZSB0byBlcnJvci5cXG4nICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcXG4nICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd7ZXJyTWVzc2FnZX0nLFxuXG4gICAgW1JVTlRJTUVfRVJST1JTLnJlcXVlc3RIb29rQ29uZmlndXJlQVBJRXJyb3JdOiAnVGhlcmUgd2FzIGFuIGVycm9yIHdoaWxlIGNvbmZpZ3VyaW5nIHRoZSByZXF1ZXN0IGhvb2s6XFxuJyArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXFxuJyArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAne3JlcXVlc3RIb29rTmFtZX06IHtlcnJNc2d9JyxcblxuICAgIFtSVU5USU1FX0VSUk9SUy5mb3JiaWRkZW5DaGFyYXRlcnNJblNjcmVlbnNob3RQYXRoXTogJ1RoZXJlIGFyZSBmb3JiaWRkZW4gY2hhcmFjdGVycyBpbiB0aGUgXCJ7c2NyZWVuc2hvdFBhdGh9XCIge3NjcmVlbnNob3RQYXRoVHlwZX06XFxuJyArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnIHtmb3JiaWRkZW5DaGFyc0Rlc2NyaXB0aW9ufScsXG5cbiAgICBbUlVOVElNRV9FUlJPUlMuY2Fubm90RmluZEZGTVBFR106ICdVbmFibGUgdG8gbG9jYXRlIHRoZSBGRm1wZWcgZXhlY3V0YWJsZSByZXF1aXJlZCB0byByZWNvcmQgdmlkZW9zLiBEbyBvbmUgb2YgdGhlIGZvbGxvd2luZzpcXG4nICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcXG4nICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcqIGFkZCB0aGUgRkZtcGVnIGluc3RhbGxhdGlvbiBkaXJlY3RvcnkgdG8gdGhlIFBBVEggZW52aXJvbm1lbnQgdmFyaWFibGUsXFxuJyArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnKiBzcGVjaWZ5IHRoZSBwYXRoIHRvIHRoZSBGRm1wZWcgZXhlY3V0YWJsZSBpbiB0aGUgRkZNUEVHX1BBVEggZW52aXJvbm1lbnQgdmFyaWFibGUgb3IgdGhlIGZmbXBlZ1BhdGggdmlkZW8gb3B0aW9uLFxcbicgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJyogaW5zdGFsbCB0aGUgQGZmbXBlZy1pbnN0YWxsZXIvZmZtcGVnIHBhY2thZ2UgZnJvbSBucG0uJyxcblxuICAgIFtSVU5USU1FX0VSUk9SUy5jYW5ub3RGaW5kVHlwZXNjcmlwdENvbmZpZ3VyYXRpb25GaWxlXTogICAgICAgICAgICAnVW5hYmxlIHRvIGZpbmQgdGhlIFR5cGVTY3JpcHQgY29uZmlndXJhdGlvbiBmaWxlIGluIFwie2ZpbGVQYXRofVwiJyxcbiAgICBbUlVOVElNRV9FUlJPUlMuY2xpZW50U2NyaXB0SW5pdGlhbGl6ZXJJc05vdFNwZWNpZmllZF06ICAgICAgICAgICAgJ1NwZWNpZnkgdGhlIEphdmFTY3JpcHQgZmlsZSBwYXRoLCBtb2R1bGUgbmFtZSBvciBzY3JpcHQgY29udGVudCB0byBpbmplY3QgYSBjbGllbnQgc2NyaXB0LicsXG4gICAgW1JVTlRJTUVfRVJST1JTLmNsaWVudFNjcmlwdEJhc2VQYXRoSXNOb3RTcGVjaWZpZWRdOiAgICAgICAgICAgICAgICdTcGVjaWZ5IHRoZSBiYXNlIHBhdGggZm9yIHRoZSBjbGllbnQgc2NyaXB0IGZpbGUuJyxcbiAgICBbUlVOVElNRV9FUlJPUlMuY2xpZW50U2NyaXB0SW5pdGlhbGl6ZXJNdWx0aXBsZUNvbnRlbnRTb3VyY2VzXTogICAgJ1lvdSBjYW5ub3QgY29tYmluZSB0aGUgZmlsZSBwYXRoLCBtb2R1bGUgbmFtZSBhbmQgc2NyaXB0IGNvbnRlbnQgd2hlbiB5b3Ugc3BlY2lmeSBhIGNsaWVudCBzY3JpcHQgdG8gaW5qZWN0LicsXG4gICAgW1JVTlRJTUVfRVJST1JTLmNhbm5vdExvYWRDbGllbnRTY3JpcHRGcm9tUGF0aF06ICAgICAgICAgICAgICAgICAgICdDYW5ub3QgbG9hZCBhIGNsaWVudCBzY3JpcHQgZnJvbSB7cGF0aH0uJyxcbiAgICBbUlVOVElNRV9FUlJPUlMuY2xpZW50U2NyaXB0TW9kdWxlRW50cnlQb2ludFBhdGhDYWxjdWxhdGlvbkVycm9yXTogJ0FuIGVycm9yIG9jY3VycmVkIHdoZW4gdHJ5aW5nIHRvIGxvY2F0ZSB0aGUgaW5qZWN0ZWQgY2xpZW50IHNjcmlwdCBtb2R1bGU6XFxuXFxue2Vycm9yTWVzc2FnZX0uJyxcbiAgICBbUlVOVElNRV9FUlJPUlMubWV0aG9kSXNOb3RBdmFpbGFibGVGb3JBbklQQ0hvc3RdOiAgICAgICAgICAgICAgICAgJ1RoaXMgbWV0aG9kIGNhbm5vdCBiZSBjYWxsZWQgb24gYSBzZXJ2aWNlIGhvc3QuJyxcbiAgICBbUlVOVElNRV9FUlJPUlMudG9vTGFyZ2VJUENQYXlsb2FkXTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1RoZSBzcGVjaWZpZWQgcGF5bG9hZCBpcyB0b28gbGFyZ2UgdG8gZm9ybSBhbiBJUEMgcGFja2V0LicsXG4gICAgW1JVTlRJTUVfRVJST1JTLm1hbGZvcm1lZElQQ01lc3NhZ2VdOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdDYW5ub3QgcHJvY2VzcyBhIG1hbGZvcm1lZCBJUEMgbWVzc2FnZS4nLFxuICAgIFtSVU5USU1FX0VSUk9SUy51bmV4cGVjdGVkSVBDSGVhZFBhY2tldF06ICAgICAgICAgICAgICAgICAgICAgICAgICAnQ2Fubm90IGNyZWF0ZSBhbiBJUEMgbWVzc2FnZSBkdWUgdG8gYW4gdW5leHBlY3RlZCBJUEMgaGVhZCBwYWNrZXQuJyxcbiAgICBbUlVOVElNRV9FUlJPUlMudW5leHBlY3RlZElQQ0JvZHlQYWNrZXRdOiAgICAgICAgICAgICAgICAgICAgICAgICAgJ0Nhbm5vdCBjcmVhdGUgYW4gSVBDIG1lc3NhZ2UgZHVlIHRvIGFuIHVuZXhwZWN0ZWQgSVBDIGJvZHkgcGFja2V0LicsXG4gICAgW1JVTlRJTUVfRVJST1JTLnVuZXhwZWN0ZWRJUENUYWlsUGFja2V0XTogICAgICAgICAgICAgICAgICAgICAgICAgICdDYW5ub3QgY3JlYXRlIGFuIElQQyBtZXNzYWdlIGR1ZSB0byBhbiB1bmV4cGVjdGVkIElQQyB0YWlsIHBhY2tldC4nLFxuICAgIFtSVU5USU1FX0VSUk9SUy5jYW5ub3RSdW5Mb2NhbE5vbkhlYWRsZXNzQnJvd3NlcldpdGhvdXREaXNwbGF5XTpcbiAgICAgICAgJ1lvdXIgTGludXggdmVyc2lvbiBkb2VzIG5vdCBoYXZlIGEgZ3JhcGhpYyBzdWJzeXN0ZW0gdG8gcnVuIHticm93c2VyQWxpYXN9IHdpdGggYSBHVUkuICcgK1xuICAgICAgICAnWW91IGNhbiBsYXVuY2ggdGhlIGJyb3dzZXIgaW4gaGVhZGxlc3MgbW9kZS4gJyArXG4gICAgICAgICdJZiB5b3UgdXNlIGEgcG9ydGFibGUgYnJvd3NlciB2ZXJzaW9uLCAnICtcbiAgICAgICAgJ3NwZWNpZnkgdGhlIGJyb3dzZXIgYWxpYXMgYmVmb3JlIHRoZSBwYXRoIGluc3RlYWQgb2YgdGhlIFxcJ3BhdGhcXCcgcHJlZml4LiAnICtcbiAgICAgICAgJ0ZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgaHR0cHM6Ly9kZXZleHByZXNzLmdpdGh1Yi5pby90ZXN0Y2FmZS9kb2N1bWVudGF0aW9uL2d1aWRlcy9jb25jZXB0cy9icm93c2Vycy5odG1sI3Rlc3QtaW4taGVhZGxlc3MtbW9kZScsXG5cbiAgICBbUlVOVElNRV9FUlJPUlMudW5jYXVnaHRFcnJvckluUmVwb3J0ZXJdOiAgICAgICAgICAgJ0FuIHVuY2F1Z2h0IGVycm9yIG9jY3VycmVkIGluIHRoZSBcIntyZXBvcnRlck5hbWV9XCIgcmVwb3J0ZXJcXCdzIFwie21ldGhvZE5hbWV9XCIgbWV0aG9kLiBFcnJvciBkZXRhaWxzOlxcbntvcmlnaW5hbEVycm9yfScsXG4gICAgW1JVTlRJTUVfRVJST1JTLnJvbGVJbml0aWFsaXplZFdpdGhSZWxhdGl2ZVVybF06ICAgICdZb3UgY2Fubm90IHNwZWNpZnkgcmVsYXRpdmUgbG9naW4gcGFnZSBVUkxzIGluIHRoZSBSb2xlIGNvbnN0cnVjdG9yLiBVc2UgYW4gYWJzb2x1dGUgVVJMLicsXG4gICAgW1JVTlRJTUVfRVJST1JTLnR5cGVTY3JpcHRDb21waWxlckxvYWRpbmdFcnJvcl06ICAgICdVbmFibGUgdG8gbG9hZCB0aGUgVHlwZVNjcmlwdCBjb21waWxlci5cXG57b3JpZ2luRXJyb3JNZXNzYWdlfS4nLFxuICAgIFtSVU5USU1FX0VSUk9SUy5jYW5ub3RDdXN0b21pemVTcGVjaWZpZWRDb21waWxlcnNdOiAnWW91IGNhbm5vdCBzcGVjaWZ5IG9wdGlvbnMgZm9yIHRoZSB7bm9uY3VzdG9taXphYmxlQ29tcGlsZXJMaXN0fSBjb21waWxlcntzdWZmaXh9LicsXG5cbiAgICBbUlVOVElNRV9FUlJPUlMuY2Fubm90RW5hYmxlUmV0cnlUZXN0UGFnZXNPcHRpb25dOlxuICAgICAgICAnQ2Fubm90IGVuYWJsZSB0aGUgXFwncmV0cnlUZXN0UGFnZXNcXCcgb3B0aW9uLiBBcHBseSBvbmUgb2YgdGhlIGZvbGxvd2luZyB0d28gc29sdXRpb25zOlxcbicgK1xuICAgICAgICAnLS0gc2V0IFxcJ2xvY2FsaG9zdFxcJyBhcyB0aGUgdmFsdWUgb2YgdGhlIFxcJ2hvc3RuYW1lXFwnIG9wdGlvblxcbicgK1xuICAgICAgICAnLS0gcnVuIFRlc3RDYWZlIG92ZXIgSFRUUFNcXG4nLFxuXG4gICAgW1JVTlRJTUVfRVJST1JTLmJyb3dzZXJDb25uZWN0aW9uRXJyb3JdOiAgICAgICAgICAgICAgICd7b3JpZ2luRXJyb3JNZXNzYWdlfVxcbntudW1PZk5vdE9wZW5lZENvbm5lY3Rpb259IG9mIHtudW1PZkFsbENvbm5lY3Rpb25zfSBicm93c2VyIGNvbm5lY3Rpb25zIGhhdmUgbm90IGJlZW4gZXN0YWJsaXNoZWQ6XFxue2xpc3RPZk5vdE9wZW5lZENvbm5lY3Rpb25zfVxcblxcbkhpbnRzOlxcbntsaXN0T2ZIaW50c30nLFxuICAgIFtCcm93c2VyQ29ubmVjdGlvbkVycm9ySGludC5Ub29IaWdoQ29uY3VycmVuY3lGYWN0b3JdOiAnVGhlIGVycm9yIGNhbiBiZSBkdWUgdG8gYSBjb25jdXJyZW5jeSBmYWN0b3IgdGhhdCBpcyB0b28gaGlnaCBmb3IgdGhlIGhvc3QgbWFjaGluZeKAmXMgcGVyZm9ybWFuY2UgKHRoZSBmYWN0b3IgdmFsdWUge2NvbmN1cnJlbmN5RmFjdG9yfSB3YXMgc3BlY2lmaWVkKS4gJyArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdUcnkgdG8gZGVjcmVhc2UgdGhlIGNvbmN1cnJlbmN5IGZhY3RvciBvciBlbnN1cmUgbW9yZSBzeXN0ZW0gcmVzb3VyY2VzIGFyZSBhdmFpbGFibGUgb24gdGhlIGhvc3QgbWFjaGluZS4nLFxuICAgIFtCcm93c2VyQ29ubmVjdGlvbkVycm9ySGludC5Vc2VCcm93c2VySW5pdE9wdGlvbl06ICdVc2UgdGhlIFwiYnJvd3NlckluaXRUaW1lb3V0XCIgb3B0aW9uIHRvIGFsbG93IG1vcmUgdGltZSBmb3IgdGhlIGJyb3dzZXIgdG8gc3RhcnQuIFRoZSB0aW1lb3V0IGlzIHNldCB0byB7YnJvd3NlckluaXRUaW1lb3V0TXNnfS4nLFxuICAgIFtCcm93c2VyQ29ubmVjdGlvbkVycm9ySGludC5SZXN0RXJyb3JDYXVzZXNdOiAgICAgICdUaGUgZXJyb3IgY2FuIGFsc28gYmUgY2F1c2VkIGJ5IG5ldHdvcmsgaXNzdWVzIG9yIHJlbW90ZSBkZXZpY2UgZmFpbHVyZS4gTWFrZSBzdXJlIHRoYXQgdGhlIGNvbm5lY3Rpb24gaXMgc3RhYmxlIGFuZCB0aGUgcmVtb3RlIGRldmljZSBjYW4gYmUgcmVhY2hlZC4nXG59O1xuIl19
|