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.
Files changed (336) hide show
  1. package/CHANGELOG.md +88 -10
  2. package/LICENSE +21 -21
  3. package/README.md +52 -48
  4. package/bin/testcafe-with-v8-flag-filter.js +0 -0
  5. package/lib/api/exportable-lib/index.js +50 -50
  6. package/lib/api/request-hooks/assert-type.js +7 -7
  7. package/lib/api/request-hooks/hook-method-names.js +11 -0
  8. package/lib/api/request-hooks/hook.js +33 -39
  9. package/lib/api/request-hooks/interfaces.js +3 -3
  10. package/lib/api/request-hooks/request-logger.js +113 -111
  11. package/lib/api/request-hooks/request-mock/create-request-mock.js +12 -0
  12. package/lib/api/request-hooks/request-mock/index.js +46 -0
  13. package/lib/api/request-hooks/request-mock.js +47 -48
  14. package/lib/api/structure/base-unit.js +11 -11
  15. package/lib/api/structure/fixture.js +75 -75
  16. package/lib/api/structure/interfaces.js +2 -2
  17. package/lib/api/structure/test-file.js +31 -31
  18. package/lib/api/structure/test-timeout.js +9 -9
  19. package/lib/api/structure/test.js +85 -85
  20. package/lib/api/structure/testing-unit.js +89 -89
  21. package/lib/api/structure/unit-type.js +9 -9
  22. package/lib/api/test-controller/assertion.js +88 -88
  23. package/lib/api/test-controller/execution-context.js +82 -82
  24. package/lib/api/test-controller/index.js +359 -319
  25. package/lib/api/test-controller/proxy.js +28 -28
  26. package/lib/api/test-page-url.js +60 -60
  27. package/lib/api/test-run-tracker.js +68 -68
  28. package/lib/api/wrap-test-function.js +49 -49
  29. package/lib/assertions/executor.js +74 -74
  30. package/lib/assertions/get-fn.js +46 -46
  31. package/lib/assertions/type.js +20 -20
  32. package/lib/assets/content-types.js +9 -9
  33. package/lib/assets/injectables.js +18 -18
  34. package/lib/browser/connection/command.js +10 -10
  35. package/lib/browser/connection/error-hints.js +9 -9
  36. package/lib/browser/connection/gateway.js +159 -159
  37. package/lib/browser/connection/get-hints.js +33 -33
  38. package/lib/browser/connection/heartbeat-status.js +8 -8
  39. package/lib/browser/connection/index.js +328 -328
  40. package/lib/browser/connection/remotes-queue.js +46 -46
  41. package/lib/browser/connection/service-routes.js +12 -12
  42. package/lib/browser/connection/status.js +12 -12
  43. package/lib/browser/interfaces.js +2 -2
  44. package/lib/browser/provider/built-in/dedicated/base.js +80 -80
  45. package/lib/browser/provider/built-in/dedicated/chrome/browser-client.js +204 -204
  46. package/lib/browser/provider/built-in/dedicated/chrome/build-chrome-args.js +17 -17
  47. package/lib/browser/provider/built-in/dedicated/chrome/config.js +110 -110
  48. package/lib/browser/provider/built-in/dedicated/chrome/create-temp-profile.js +45 -45
  49. package/lib/browser/provider/built-in/dedicated/chrome/elapsed-upperbounds.js +15 -15
  50. package/lib/browser/provider/built-in/dedicated/chrome/index.js +102 -102
  51. package/lib/browser/provider/built-in/dedicated/chrome/interfaces.js +2 -2
  52. package/lib/browser/provider/built-in/dedicated/chrome/local-chrome.js +24 -24
  53. package/lib/browser/provider/built-in/dedicated/chrome/runtime-info.js +29 -29
  54. package/lib/browser/provider/built-in/dedicated/edge/index.js +10 -10
  55. package/lib/browser/provider/built-in/dedicated/edge/runtime-info.js +29 -29
  56. package/lib/browser/provider/built-in/dedicated/firefox/config.js +33 -33
  57. package/lib/browser/provider/built-in/dedicated/firefox/create-temp-profile.js +78 -78
  58. package/lib/browser/provider/built-in/dedicated/firefox/index.js +73 -73
  59. package/lib/browser/provider/built-in/dedicated/firefox/local-firefox.js +36 -36
  60. package/lib/browser/provider/built-in/dedicated/firefox/marionette-client/commands.js +13 -13
  61. package/lib/browser/provider/built-in/dedicated/firefox/marionette-client/index.js +200 -200
  62. package/lib/browser/provider/built-in/dedicated/firefox/runtime-info.js +17 -17
  63. package/lib/browser/provider/built-in/index.js +21 -21
  64. package/lib/browser/provider/built-in/locally-installed.js +30 -30
  65. package/lib/browser/provider/built-in/path.js +47 -47
  66. package/lib/browser/provider/built-in/remote.js +58 -58
  67. package/lib/browser/provider/index.js +303 -303
  68. package/lib/browser/provider/parse-provider-name.js +16 -16
  69. package/lib/browser/provider/plugin-host.js +121 -121
  70. package/lib/browser/provider/pool.js +115 -115
  71. package/lib/browser/provider/utils/argument-parsing.js +74 -74
  72. package/lib/browser/provider/utils/browser-starter.js +34 -34
  73. package/lib/browser/provider/utils/client-functions.js +24 -24
  74. package/lib/browser/provider/utils/get-maximized-headless-window-size.js +9 -9
  75. package/lib/cli/argument-parser.js +284 -279
  76. package/lib/cli/authentication-helper.js +35 -35
  77. package/lib/cli/cli.js +134 -134
  78. package/lib/cli/correct-browsers-and-sources.js +40 -40
  79. package/lib/cli/index.js +19 -19
  80. package/lib/cli/log.js +43 -43
  81. package/lib/cli/remotes-wizard.js +36 -36
  82. package/lib/cli/termination-handler.js +38 -38
  83. package/lib/client/automation/index.js +144 -46
  84. package/lib/client/automation/index.min.js +1 -1
  85. package/lib/client/browser/idle-page/index.html.mustache +35 -35
  86. package/lib/client/browser/idle-page/logo.svg +86 -86
  87. package/lib/client/browser/service-worker.js +4 -6
  88. package/lib/client/core/index.js +19 -13
  89. package/lib/client/core/index.min.js +1 -1
  90. package/lib/client/driver/index.js +1807 -451
  91. package/lib/client/driver/index.min.js +1 -1
  92. package/lib/client/driver/internal-properties.js +9 -9
  93. package/lib/client/test-run/iframe.js.mustache +17 -17
  94. package/lib/client/test-run/index.js.mustache +51 -51
  95. package/lib/client/ui/index.js +14 -12
  96. package/lib/client/ui/index.min.js +1 -1
  97. package/lib/client/ui/sprite.svg +42 -42
  98. package/lib/client-functions/builder-symbol.js +4 -4
  99. package/lib/client-functions/client-function-builder.js +156 -135
  100. package/lib/client-functions/replicator.js +61 -61
  101. package/lib/client-functions/return-single-prop-mode.js +8 -8
  102. package/lib/client-functions/selector-api-execution-mode.js +22 -0
  103. package/lib/client-functions/selectors/add-api.js +646 -588
  104. package/lib/client-functions/selectors/create-snapshot-methods.js +13 -13
  105. package/lib/client-functions/selectors/prepare-api-args.js +20 -20
  106. package/lib/client-functions/selectors/selector-attribute-filter.js +22 -22
  107. package/lib/client-functions/selectors/selector-builder.js +154 -150
  108. package/lib/client-functions/selectors/selector-text-filter.js +43 -43
  109. package/lib/client-functions/selectors/snapshot-properties.js +48 -48
  110. package/lib/client-functions/types.js +18 -18
  111. package/lib/compiler/babel/format-babel-produced-code.js +10 -10
  112. package/lib/compiler/babel/get-base-babel-options.js +11 -11
  113. package/lib/compiler/babel/load-libs.js +64 -62
  114. package/lib/compiler/babel/preset-stage-2.js +19 -19
  115. package/lib/compiler/compile-client-function.js +73 -73
  116. package/lib/compiler/compilers.js +33 -33
  117. package/lib/compiler/index.js +92 -92
  118. package/lib/compiler/interfaces.js +2 -2
  119. package/lib/compiler/test-file/api-based.js +146 -146
  120. package/lib/compiler/test-file/base.js +36 -36
  121. package/lib/compiler/test-file/exportble-lib-path.js +5 -5
  122. package/lib/compiler/test-file/formats/coffeescript/compiler.js +38 -38
  123. package/lib/compiler/test-file/formats/coffeescript/get-test-list.js +29 -29
  124. package/lib/compiler/test-file/formats/es-next/compiler.js +43 -43
  125. package/lib/compiler/test-file/formats/es-next/get-test-list.js +166 -166
  126. package/lib/compiler/test-file/formats/es-next/is-flow-code.js +7 -7
  127. package/lib/compiler/test-file/formats/raw.js +85 -85
  128. package/lib/compiler/test-file/formats/typescript/compiler.js +135 -135
  129. package/lib/compiler/test-file/formats/typescript/get-test-list.js +185 -185
  130. package/lib/compiler/test-file/test-file-parser-base.js +214 -214
  131. package/lib/configuration/configuration-base.js +165 -165
  132. package/lib/configuration/constants.js +9 -9
  133. package/lib/configuration/customizable-compilers.js +7 -7
  134. package/lib/configuration/default-values.js +51 -51
  135. package/lib/configuration/interfaces.js +3 -3
  136. package/lib/configuration/option-names.js +53 -53
  137. package/lib/configuration/option-source.js +9 -9
  138. package/lib/configuration/option.js +14 -14
  139. package/lib/configuration/quarantine-option-names.js +10 -0
  140. package/lib/configuration/run-option-names.js +26 -26
  141. package/lib/configuration/screenshot-option-names.js +10 -10
  142. package/lib/configuration/testcafe-configuration.js +164 -165
  143. package/lib/configuration/types.js +2 -2
  144. package/lib/configuration/typescript-configuration.js +62 -62
  145. package/lib/custom-client-scripts/assert-type.js +7 -7
  146. package/lib/custom-client-scripts/client-script-init.js +3 -3
  147. package/lib/custom-client-scripts/client-script.js +107 -108
  148. package/lib/custom-client-scripts/get-code.js +11 -11
  149. package/lib/custom-client-scripts/get-url.js +6 -6
  150. package/lib/custom-client-scripts/load.js +15 -15
  151. package/lib/custom-client-scripts/problematic-scripts.js +2 -2
  152. package/lib/custom-client-scripts/routing.js +36 -36
  153. package/lib/custom-client-scripts/utils.js +60 -60
  154. package/lib/embedding-utils.js +83 -83
  155. package/lib/errors/create-stack-filter.js +18 -18
  156. package/lib/errors/error-list.js +26 -26
  157. package/lib/errors/get-callsite.js +31 -31
  158. package/lib/errors/internal-modules-prefix.js +8 -8
  159. package/lib/errors/is-internal-stack-frame.js +46 -46
  160. package/lib/errors/process-test-fn-error.js +37 -37
  161. package/lib/errors/runtime/index.js +123 -123
  162. package/lib/errors/runtime/templates.js +116 -114
  163. package/lib/errors/runtime/type-assertions.js +112 -112
  164. package/lib/errors/stack-cleaning-hook.js +64 -64
  165. package/lib/errors/test-run/formattable-adapter.js +59 -59
  166. package/lib/errors/test-run/index.js +302 -302
  167. package/lib/errors/test-run/render-error-template.js +31 -31
  168. package/lib/errors/test-run/templates.js +93 -95
  169. package/lib/errors/test-run/utils.js +90 -85
  170. package/lib/errors/types.js +157 -155
  171. package/lib/index.js +81 -81
  172. package/lib/live/bootstrapper.js +44 -44
  173. package/lib/live/controller.js +107 -107
  174. package/lib/live/file-watcher/index.js +67 -67
  175. package/lib/live/file-watcher/modules-graph.js +58 -58
  176. package/lib/live/keyboard-observer.js +76 -76
  177. package/lib/live/logger/index.js +64 -64
  178. package/lib/live/test-run-controller.js +96 -96
  179. package/lib/live/test-run-state.js +6 -6
  180. package/lib/live/test-run.js +56 -56
  181. package/lib/live/test-runner.js +168 -168
  182. package/lib/load-assets.js +29 -29
  183. package/lib/notifications/add-rendered-warning.js +16 -16
  184. package/lib/notifications/debug-logger.js +78 -78
  185. package/lib/notifications/deprecated.js +24 -24
  186. package/lib/notifications/information-message.js +12 -12
  187. package/lib/notifications/warning-log.js +32 -31
  188. package/lib/notifications/warning-message.js +48 -48
  189. package/lib/reporter/command/command-formatter.js +120 -109
  190. package/lib/reporter/command/format-command.js +8 -8
  191. package/lib/reporter/command/interfaces.js +2 -2
  192. package/lib/reporter/index.js +319 -314
  193. package/lib/reporter/interfaces.js +2 -2
  194. package/lib/reporter/plugin-host.js +136 -137
  195. package/lib/reporter/plugin-methods.js +12 -12
  196. package/lib/role/index.js +74 -74
  197. package/lib/role/marker-symbol.js +7 -7
  198. package/lib/role/phase.js +9 -9
  199. package/lib/runner/bootstrapper.js +272 -272
  200. package/lib/runner/browser-job-result.js +9 -9
  201. package/lib/runner/browser-job.js +153 -123
  202. package/lib/runner/browser-set.js +114 -114
  203. package/lib/runner/fixture-hook-controller.js +85 -85
  204. package/lib/runner/index.js +450 -442
  205. package/lib/runner/interfaces.js +3 -3
  206. package/lib/runner/reporter-stream-controller.js +28 -28
  207. package/lib/runner/task/index.js +152 -133
  208. package/lib/runner/task/phase.js +9 -9
  209. package/lib/runner/test-run-controller.js +166 -185
  210. package/lib/runner/tested-app.js +73 -72
  211. package/lib/screenshots/capturer.js +141 -141
  212. package/lib/screenshots/constants.js +11 -11
  213. package/lib/screenshots/crop.js +111 -111
  214. package/lib/screenshots/default-extension.js +4 -4
  215. package/lib/screenshots/index.js +67 -67
  216. package/lib/screenshots/utils.js +39 -39
  217. package/lib/services/compiler/host.js +190 -106
  218. package/lib/services/compiler/io.js +9 -9
  219. package/lib/services/compiler/protocol.js +17 -16
  220. package/lib/services/compiler/service.js +225 -106
  221. package/lib/services/compiler/test-run-proxy.js +111 -73
  222. package/lib/services/interfaces.js +3 -0
  223. package/lib/services/process-title.js +8 -8
  224. package/lib/services/serialization/prepare-options.js +17 -17
  225. package/lib/services/serialization/replicator/create-replicator.js +27 -0
  226. package/lib/services/serialization/replicator/custom-error-transform.js +28 -0
  227. package/lib/services/serialization/test-structure.js +93 -77
  228. package/lib/services/utils/ipc/interfaces.js +30 -30
  229. package/lib/services/utils/ipc/io.js +108 -108
  230. package/lib/services/utils/ipc/message.js +76 -73
  231. package/lib/services/utils/ipc/packet.js +55 -55
  232. package/lib/services/utils/ipc/proxy.js +110 -118
  233. package/lib/services/utils/ipc/transport.js +64 -64
  234. package/lib/shared/errors/index.js +382 -382
  235. package/lib/shared/node-modules-folder-name.js +4 -4
  236. package/lib/test-run/bookmark.js +90 -90
  237. package/lib/test-run/browser-console-messages.js +73 -73
  238. package/lib/test-run/browser-manipulation-queue.js +92 -92
  239. package/lib/test-run/client-messages.js +9 -9
  240. package/lib/test-run/commands/actions.js +486 -425
  241. package/lib/test-run/commands/assertion.js +45 -45
  242. package/lib/test-run/commands/base.js +14 -14
  243. package/lib/test-run/commands/browser-manipulation.js +95 -95
  244. package/lib/test-run/commands/from-object.js +82 -82
  245. package/lib/test-run/commands/observation.js +61 -61
  246. package/lib/test-run/commands/options.js +231 -215
  247. package/lib/test-run/commands/service.js +54 -48
  248. package/lib/test-run/commands/type.js +65 -60
  249. package/lib/test-run/commands/utils.js +87 -87
  250. package/lib/test-run/commands/validations/argument.js +90 -90
  251. package/lib/test-run/commands/validations/factories.js +47 -47
  252. package/lib/test-run/commands/validations/initializers.js +44 -44
  253. package/lib/test-run/debug-log.js +32 -32
  254. package/lib/test-run/execute-js-expression.js +74 -74
  255. package/lib/test-run/index.js +823 -752
  256. package/lib/test-run/marker-symbol.js +7 -7
  257. package/lib/test-run/observed-callsites-storage.js +17 -17
  258. package/lib/test-run/phase.js +16 -16
  259. package/lib/test-run/session-controller.js +104 -104
  260. package/lib/testcafe.js +119 -114
  261. package/lib/utils/assignable.js +39 -39
  262. package/lib/utils/async-event-emitter.js +28 -28
  263. package/lib/utils/async-queue.js +14 -14
  264. package/lib/utils/browser-connection-timeouts.js +19 -19
  265. package/lib/utils/callsite.js +17 -17
  266. package/lib/utils/check-file-path.js +31 -31
  267. package/lib/utils/check-url.js +51 -51
  268. package/lib/utils/convert-to-best-fit-type.js +16 -16
  269. package/lib/utils/correct-file-path.js +21 -21
  270. package/lib/utils/define-lazy-property.js +13 -13
  271. package/lib/utils/delay.js +6 -6
  272. package/lib/utils/delegated-api.js +44 -44
  273. package/lib/utils/detect-display.js +6 -6
  274. package/lib/utils/detect-ffmpeg.js +44 -44
  275. package/lib/utils/diff/colors.js +29 -29
  276. package/lib/utils/diff/index.js +53 -53
  277. package/lib/utils/diff/util.js +24 -22
  278. package/lib/utils/diff.js +29 -29
  279. package/lib/utils/escape-user-agent.js +10 -10
  280. package/lib/utils/flag-list.js +17 -17
  281. package/lib/utils/get-any-key.js +8 -8
  282. package/lib/utils/get-browser.js +8 -8
  283. package/lib/utils/get-common-path.js +34 -34
  284. package/lib/utils/get-filter-fn.js +40 -40
  285. package/lib/utils/get-options/base.js +36 -36
  286. package/lib/utils/get-options/compiler.js +33 -33
  287. package/lib/utils/get-options/grep.js +15 -15
  288. package/lib/utils/get-options/index.js +21 -19
  289. package/lib/utils/get-options/meta.js +22 -22
  290. package/lib/utils/get-options/quarantine.js +92 -0
  291. package/lib/utils/get-options/screenshot.js +17 -17
  292. package/lib/utils/get-options/ssl.js +45 -45
  293. package/lib/utils/get-options/video.js +10 -10
  294. package/lib/utils/get-viewport-width.js +18 -18
  295. package/lib/utils/guard-time-execution.js +10 -10
  296. package/lib/utils/handle-errors.js +74 -74
  297. package/lib/utils/handle-tag-args.js +8 -8
  298. package/lib/utils/http.js +30 -30
  299. package/lib/utils/is-localhost.js +11 -11
  300. package/lib/utils/is-password-input.js +11 -0
  301. package/lib/utils/is-repl.js +12 -0
  302. package/lib/utils/is-window-in-iframe.js +6 -6
  303. package/lib/utils/limit-number.js +10 -10
  304. package/lib/utils/make-reg-exp.js +7 -7
  305. package/lib/utils/moment-loader.js +20 -20
  306. package/lib/utils/parse-file-list.js +71 -71
  307. package/lib/utils/parse-user-agent.js +55 -55
  308. package/lib/utils/path-pattern.js +114 -114
  309. package/lib/utils/prepare-reporters.js +30 -30
  310. package/lib/utils/prerender-callsite.js +18 -18
  311. package/lib/utils/process.js +119 -119
  312. package/lib/utils/promisified-functions.js +46 -46
  313. package/lib/utils/re-executable-promise.js +39 -39
  314. package/lib/utils/render-callsite-sync.js +29 -29
  315. package/lib/utils/render-template.js +10 -10
  316. package/lib/utils/reporter.js +30 -30
  317. package/lib/utils/resolve-path-relatively-cwd.js +7 -7
  318. package/lib/utils/string.js +105 -105
  319. package/lib/utils/temp-directory/cleanup-process/commands.js +7 -7
  320. package/lib/utils/temp-directory/cleanup-process/index.js +143 -143
  321. package/lib/utils/temp-directory/cleanup-process/worker.js +58 -58
  322. package/lib/utils/temp-directory/index.js +87 -87
  323. package/lib/utils/temp-directory/lockfile.js +56 -56
  324. package/lib/utils/thennable.js +7 -7
  325. package/lib/utils/timer.js +15 -15
  326. package/lib/utils/to-posix-path.js +8 -8
  327. package/lib/utils/types.js +2 -2
  328. package/lib/video-recorder/interfaces.js +2 -2
  329. package/lib/video-recorder/process.js +126 -126
  330. package/lib/video-recorder/recorder.js +136 -136
  331. package/lib/video-recorder/test-run-video-recorder.js +69 -69
  332. package/lib/video-recorder/videos.js +37 -37
  333. package/package.json +7 -7
  334. package/ts-defs/index.d.ts +109 -17
  335. package/ts-defs/selectors.d.ts +95 -7
  336. 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.invalidSpeedValue]: 'Speed should be a number between 0.01 and 1.',
41
- [types_1.RUNTIME_ERRORS.invalidConcurrencyFactor]: 'The concurrency factor should be an integer greater or equal to 1.',
42
- [types_1.RUNTIME_ERRORS.cannotDivideRemotesCountByConcurrency]: 'The number of remote browsers should be divisible by the factor of concurrency.',
43
- [types_1.RUNTIME_ERRORS.portsOptionRequiresTwoNumbers]: 'The "--ports" option requires two numbers to be specified.',
44
- [types_1.RUNTIME_ERRORS.portIsNotFree]: 'The specified {portNum} port is already in use by another program.',
45
- [types_1.RUNTIME_ERRORS.invalidHostname]: 'The specified "{hostname}" hostname cannot be resolved to the current machine.',
46
- [types_1.RUNTIME_ERRORS.cannotFindSpecifiedTestSource]: 'Cannot find a test source file at "{path}".',
47
- [types_1.RUNTIME_ERRORS.clientFunctionCodeIsNotAFunction]: '{#instantiationCallsiteName} code is expected to be specified as a function, but {type} was passed.',
48
- [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.',
49
- [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.",
50
- [types_1.RUNTIME_ERRORS.regeneratorInClientFunctionCode]: `{#instantiationCallsiteName} code, arguments or dependencies cannot contain generators or "async/await" syntax (use Promises instead).`,
51
- [types_1.RUNTIME_ERRORS.invalidClientFunctionTestRunBinding]: 'The "boundTestRun" option value is expected to be a test controller.',
52
- [types_1.RUNTIME_ERRORS.invalidValueType]: '{smthg} is expected to be a {type}, but it was {actual}.',
53
- [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.',
54
- [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.`,
55
- [types_1.RUNTIME_ERRORS.timeLimitedPromiseTimeoutExpired]: 'Timeout expired for a time limited promise',
56
- [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.',
57
- [types_1.RUNTIME_ERRORS.multipleAPIMethodCallForbidden]: 'You cannot call the "{methodName}" method more than once. Pass an array of parameters to this method instead.',
58
- [types_1.RUNTIME_ERRORS.invalidReporterOutput]: "Specify a file name or a writable stream as the reporter's output target.",
59
- [types_1.RUNTIME_ERRORS.cannotReadSSLCertFile]: 'Unable to read the "{path}" file, specified by the "{option}" ssl option. Error details:\n' +
60
- '\n' +
61
- '{err}',
62
- [types_1.RUNTIME_ERRORS.cannotPrepareTestsDueToError]: 'Cannot prepare tests due to an error.\n' +
63
- '\n' +
64
- '{errMessage}',
65
- [types_1.RUNTIME_ERRORS.cannotParseRawFile]: 'Cannot parse a test source file in the raw format at "{path}" due to an error.\n' +
66
- '\n' +
67
- '{errMessage}',
68
- [types_1.RUNTIME_ERRORS.testedAppFailedWithError]: 'Tested app failed with an error:\n' +
69
- '\n' +
70
- '{errMessage}',
71
- [types_1.RUNTIME_ERRORS.unableToOpenBrowser]: 'Was unable to open the browser "{alias}" due to error.\n' +
72
- '\n' +
73
- '{errMessage}',
74
- [types_1.RUNTIME_ERRORS.requestHookConfigureAPIError]: 'There was an error while configuring the request hook:\n' +
75
- '\n' +
76
- '{requestHookName}: {errMsg}',
77
- [types_1.RUNTIME_ERRORS.forbiddenCharatersInScreenshotPath]: 'There are forbidden characters in the "{screenshotPath}" {screenshotPathType}:\n' +
78
- ' {forbiddenCharsDescription}',
79
- [types_1.RUNTIME_ERRORS.cannotFindFFMPEG]: 'Unable to locate the FFmpeg executable required to record videos. Do one of the following:\n' +
80
- '\n' +
81
- '* add the FFmpeg installation directory to the PATH environment variable,\n' +
82
- '* specify the path to the FFmpeg executable in the FFMPEG_PATH environment variable or the ffmpegPath video option,\n' +
83
- '* install the @ffmpeg-installer/ffmpeg package from npm.',
84
- [types_1.RUNTIME_ERRORS.cannotFindTypescriptConfigurationFile]: 'Unable to find the TypeScript configuration file in "{filePath}"',
85
- [types_1.RUNTIME_ERRORS.clientScriptInitializerIsNotSpecified]: 'Specify the JavaScript file path, module name or script content to inject a client script.',
86
- [types_1.RUNTIME_ERRORS.clientScriptBasePathIsNotSpecified]: 'Specify the base path for the client script file.',
87
- [types_1.RUNTIME_ERRORS.clientScriptInitializerMultipleContentSources]: 'You cannot combine the file path, module name and script content when you specify a client script to inject.',
88
- [types_1.RUNTIME_ERRORS.cannotLoadClientScriptFromPath]: 'Cannot load a client script from {path}.',
89
- [types_1.RUNTIME_ERRORS.clientScriptModuleEntryPointPathCalculationError]: 'An error occurred when trying to locate the injected client script module:\n\n{errorMessage}.',
90
- [types_1.RUNTIME_ERRORS.methodIsNotAvailableForAnIPCHost]: 'This method cannot be called on a service host.',
91
- [types_1.RUNTIME_ERRORS.tooLargeIPCPayload]: 'The specified payload is too large to form an IPC packet.',
92
- [types_1.RUNTIME_ERRORS.malformedIPCMessage]: 'Cannot process a malformed IPC message.',
93
- [types_1.RUNTIME_ERRORS.unexpectedIPCHeadPacket]: 'Cannot create an IPC message due to an unexpected IPC head packet.',
94
- [types_1.RUNTIME_ERRORS.unexpectedIPCBodyPacket]: 'Cannot create an IPC message due to an unexpected IPC body packet.',
95
- [types_1.RUNTIME_ERRORS.unexpectedIPCTailPacket]: 'Cannot create an IPC message due to an unexpected IPC tail packet.',
96
- [types_1.RUNTIME_ERRORS.cannotRunLocalNonHeadlessBrowserWithoutDisplay]: 'Your Linux version does not have a graphic subsystem to run {browserAlias} with a GUI. ' +
97
- 'You can launch the browser in headless mode. ' +
98
- 'If you use a portable browser version, ' +
99
- 'specify the browser alias before the path instead of the \'path\' prefix. ' +
100
- 'For more information, see https://devexpress.github.io/testcafe/documentation/guides/concepts/browsers.html#test-in-headless-mode',
101
- [types_1.RUNTIME_ERRORS.uncaughtErrorInReporter]: 'An uncaught error occurred in the "{reporterName}" reporter\'s "{methodName}" method. Error details:\n{originalError}',
102
- [types_1.RUNTIME_ERRORS.roleInitializedWithRelativeUrl]: 'You cannot specify relative login page URLs in the Role constructor. Use an absolute URL.',
103
- [types_1.RUNTIME_ERRORS.typeScriptCompilerLoadingError]: 'Unable to load the TypeScript compiler.\n{originErrorMessage}.',
104
- [types_1.RUNTIME_ERRORS.cannotCustomizeSpecifiedCompilers]: 'You cannot specify options for the {noncustomizableCompilerList} compiler{suffix}.',
105
- [types_1.RUNTIME_ERRORS.cannotEnableRetryTestPagesOption]: 'Cannot enable the \'retryTestPages\' option. Apply one of the following two solutions:\n' +
106
- '-- set \'localhost\' as the value of the \'hostname\' option\n' +
107
- '-- run TestCafe over HTTPS\n',
108
- [types_1.RUNTIME_ERRORS.browserConnectionError]: '{originErrorMessage}\n{numOfNotOpenedConnection} of {numOfAllConnections} browser connections have not been established:\n{listOfNotOpenedConnections}\n\nHints:\n{listOfHints}',
109
- [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). ' +
110
- 'Try to decrease the concurrency factor or ensure more system resources are available on the host machine.',
111
- [error_hints_1.default.UseBrowserInitOption]: 'Use the "browserInitTimeout" option to allow more time for the browser to start. The timeout is set to {browserInitTimeoutMsg}.',
112
- [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.'
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