testcafe 1.20.0 → 1.20.1

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 (69) hide show
  1. package/CHANGELOG.md +27 -18
  2. package/README.md +1 -0
  3. package/lib/api/test-controller/execution-context.js +2 -2
  4. package/lib/browser/connection/browser-connection-tracker.js +16 -0
  5. package/lib/browser/connection/gateway.js +3 -4
  6. package/lib/browser/connection/index.js +35 -17
  7. package/lib/browser/provider/built-in/dedicated/chrome/cdp-client/index.js +19 -8
  8. package/lib/browser/provider/built-in/dedicated/chrome/index.js +14 -2
  9. package/lib/browser/provider/built-in/dedicated/chrome/requests-interceptor.js +69 -0
  10. package/lib/browser/provider/index.js +4 -1
  11. package/lib/browser/provider/plugin-host.js +3 -1
  12. package/lib/client/automation/index.js +3434 -3047
  13. package/lib/client/automation/index.min.js +1 -1
  14. package/lib/client/core/index.js +1016 -1170
  15. package/lib/client/core/index.min.js +1 -1
  16. package/lib/client/core/utils/dom.js +11 -8
  17. package/lib/client/core/utils/position.js +242 -0
  18. package/lib/client/core/utils/style.js +94 -0
  19. package/lib/client/core/utils/values/axis-values.js +43 -0
  20. package/lib/client/core/utils/values/boundary-values.js +41 -0
  21. package/lib/client/core/utils/values/dimensions.js +17 -0
  22. package/lib/client/driver/command-executors/client-functions/selector-executor/utils.js +4 -3
  23. package/lib/client/driver/index.js +570 -306
  24. package/lib/client/driver/index.min.js +1 -1
  25. package/lib/client/test-run/index.js.mustache +3 -1
  26. package/lib/compiler/test-file/api-based.js +2 -2
  27. package/lib/compiler/test-file/formats/dev-tools/compiler.js +7 -2
  28. package/lib/configuration/testcafe-configuration.js +2 -1
  29. package/lib/errors/process-test-fn-error.js +2 -2
  30. package/lib/live/file-watcher/index.js +2 -2
  31. package/lib/live/file-watcher/modules-graph.js +2 -2
  32. package/lib/runner/browser-job.js +4 -1
  33. package/lib/test-run/index.js +2 -1
  34. package/lib/utils/node-modules-folder-name.js +6 -0
  35. package/lib/video-recorder/process.js +5 -1
  36. package/package.json +2 -2
  37. package/lib/client/automation/deps/hammerhead.js +0 -16
  38. package/lib/client/automation/deps/testcafe-core.js +0 -16
  39. package/lib/client/core/utils/delay.js +0 -13
  40. package/lib/client/driver/barriers/complex-barrier.js +0 -29
  41. package/lib/client/driver/barriers/request.js +0 -79
  42. package/lib/client/driver/barriers/script-execution.js +0 -73
  43. package/lib/shared/actions/action-executor.js +0 -161
  44. package/lib/shared/actions/automations/click/index.js +0 -55
  45. package/lib/shared/actions/automations/click/mouse-click-strategy-base.js +0 -19
  46. package/lib/shared/actions/automations/last-hovered-element-holder.js +0 -13
  47. package/lib/shared/actions/automations/move.js +0 -227
  48. package/lib/shared/actions/automations/settings.js +0 -31
  49. package/lib/shared/actions/automations/visible-element-automation.js +0 -185
  50. package/lib/shared/actions/cursor.js +0 -64
  51. package/lib/shared/actions/get-element.js +0 -91
  52. package/lib/shared/actions/utils/get-automation-point.js +0 -44
  53. package/lib/shared/actions/utils/get-device-point.js +0 -24
  54. package/lib/shared/actions/utils/is-window-iframe.js +0 -8
  55. package/lib/shared/actions/utils/offsets.js +0 -33
  56. package/lib/shared/actions/utils/screen-point-to-client.js +0 -15
  57. package/lib/shared/adapter/index.js +0 -14
  58. package/lib/shared/node-modules-folder-name.js +0 -6
  59. package/lib/shared/utils/delay.js +0 -11
  60. package/lib/shared/utils/elements-retriever.js +0 -47
  61. package/lib/shared/utils/event-emitter.js +0 -53
  62. package/lib/shared/utils/get-line-rect-intersection.js +0 -42
  63. package/lib/shared/utils/next-tick.js +0 -12
  64. package/lib/shared/utils/node-type-descriptions.js +0 -19
  65. package/lib/shared/utils/position.js +0 -20
  66. package/lib/shared/utils/promise.js +0 -14
  67. package/lib/shared/utils/values/axis-values.js +0 -44
  68. package/lib/shared/utils/values/boundary-values.js +0 -42
  69. package/lib/shared/utils/values/dimensions.js +0 -18
package/CHANGELOG.md CHANGED
@@ -1,6 +1,15 @@
1
1
  # Changelog
2
2
 
3
- ## v1.20.0 (2022-07-14)
3
+ ## v1.20.1 (2022-08-08)
4
+
5
+ ### Bug Fixes
6
+
7
+ * Running 11 or more tests concurrently causes a memory leak ([#7188](https://github.com/DevExpress/testcafe/issues/7188)).
8
+ * TestCafe cannot switch to iframes that descend from a shadowRoot element ([#3673](https://github.com/DevExpress/testcafe/issues/3673)).
9
+ * TestCafe attempts to execute JSON files without `fixture` and `test` definitions (PR [#7187](https://github.com/DevExpress/testcafe/pull/7187)).
10
+ * TestCafe incorrectly processes request hooks that return status code 500 ([#7213](https://github.com/DevExpress/testcafe/issues/7213))
11
+
12
+ ## v1.20.0 (2022-07-14)
4
13
 
5
14
  > :warning:
6
15
  > Warning: [Impending breaking change](#coming-in-testcafe-20-typescript-4).
@@ -14,10 +23,10 @@ TestCafe v1.20.0 includes two major capabilities: an [API testing toolkit](#api-
14
23
  TestCafe v1.20.0 includes a comprehensive set of server-side API testing tools. You can add dedicated API tests to your test suite, or include API testing methods in existing functional tests.
15
24
 
16
25
  The new [Request](https://testcafe.io/documentation/403981/reference/test-api/testcontroller/request) test action executes an HTTP request and returns the server's response.
17
-
26
+
18
27
  ```js
19
28
  const responseBody = await t.request(`http://localhost:3000/helloworld`).body;
20
-
29
+
21
30
  t.expect(responseBody).contains('Hello World') // true
22
31
  ```
23
32
 
@@ -46,9 +55,9 @@ fixture`Test structure`
46
55
 
47
56
  ### Experimental: Chrome User Flow Replays
48
57
 
49
- TestCafe v1.20.0 introduces **experimental, limited** support for [Google Chrome user flow recordings](https://developer.chrome.com/docs/devtools/recorder/).
58
+ TestCafe v1.20.0 introduces **experimental, limited** support for [Google Chrome user flow recordings](https://developer.chrome.com/docs/devtools/recorder/).
50
59
 
51
- Record page actions in Google Chrome and export the recording as a JSON file. TestCafe will play the recording back just like it would a generate a test report
60
+ Record page actions in Google Chrome and export the recording as a JSON file. TestCafe will play the recording back just like it would a generate a test report
52
61
 
53
62
  Read the [User Flow Recordings](https://testcafe.io/documentation/403998/guides/experimental-capabilities/chrome-replay-support) guide to learn more.
54
63
 
@@ -168,17 +177,17 @@ Read the [Request Hooks guide](https://testcafe.io/documentation/402842/guides/a
168
177
  ### Bug Fixes
169
178
 
170
179
  * The t.scrollIntoView method causes the "Element is not visible" error when the target's `overflow` property is `hidden` ([#6601](https://github.com/DevExpress/testcafe/issues/6601))
171
-
180
+
172
181
  * TestCafe triggers click events for label elements even when the input is disabled ([#6949](https://github.com/DevExpress/testcafe/issues/6949))
173
-
182
+
174
183
  * TestCafe hangs when you change the active window between two consecutive assertions ([#6037](https://github.com/DevExpress/testcafe/issues/6037))
175
-
184
+
176
185
  * TestCafe cannot take screenshots when using the LambdaTest browser provider ([#6887](https://github.com/DevExpress/testcafe/issues/6887))
177
-
186
+
178
187
  * Pages that target a missing `<iframe>`([testcafe-hammerhead/#2178](https://github.com/DevExpress/testcafe-hammerhead/issues/2178) element with the `Element.focus` method yield a ""TypeError: window.location.toString is not a function" error.
179
-
188
+
180
189
  * TestCafe causes errors when it encounters XMLHTTPRequest calls that fetch resources from `blob:` URLs ([testcafe-hammerhead/#2634](https://github.com/DevExpress/testcafe-hammerhead/issues/2634))
181
-
190
+
182
191
  * `HTMLElement.removeAttributeNode` method calls yield unjustified exceptions ([PR testcafe-hammerhead/#2742](https://github.com/DevExpress/testcafe-hammerhead/pull/2742) by @TrevorKarjanis)
183
192
 
184
193
  ## v1.18.4 (2022-02-21)
@@ -186,14 +195,14 @@ Read the [Request Hooks guide](https://testcafe.io/documentation/402842/guides/a
186
195
  ### Bug Fixes
187
196
 
188
197
  * TestCafe does not display reporter output during initialization ([#6842](https://github.com/DevExpress/testcafe/issues/6842))
189
-
198
+
190
199
  * TestCafe uses outdated automation scripts after cache expiration ([testcafe-hammerhead/#2738](https://github.com/DevExpress/testcafe-hammerhead/issues/2738), [PR](https://github.com/DevExpress/testcafe-hammerhead/issues/2739) by @rr13k)
191
200
 
192
201
  * The `Node.append` method causes the `Illegal invocation` error ([PR testcafe-hammerhead/#2730](https://github.com/DevExpress/testcafe-hammerhead/pull/2730) by @danieltroger)
193
-
202
+
194
203
  * Scripts in SVG documents cause the `Illegal invocation` error ([testcafe-hammerhead/#2735](https://github.com/DevExpress/testcafe-hammerhead/issues/2735
195
204
  ))
196
-
205
+
197
206
  ## v1.18.3 (2022-01-25)
198
207
 
199
208
  ### Bug Fixes
@@ -307,7 +316,7 @@ module.exports = {
307
316
 
308
317
  #### Execution Timeouts
309
318
 
310
- You can now specify custom timeouts for tests and test runs. If a test/test run is idle or unresponsive for the specified length of time, TestCafe terminates it. Specify these timeouts in the [configuration file](https://testcafe.io/documentation/402638/reference/configuration-file) or from the [command line](https://testcafe.io/documentation/402639/reference/command-line-interface).
319
+ You can now specify custom timeouts for tests and test runs. If a test/test run is idle or unresponsive for the specified length of time, TestCafe terminates it. Specify these timeouts in the [configuration file](https://testcafe.io/documentation/402638/reference/configuration-file) or from the [command line](https://testcafe.io/documentation/402639/reference/command-line-interface).
311
320
 
312
321
  **Command line interface**
313
322
 
@@ -426,17 +435,17 @@ test('Type text', async t => {
426
435
 
427
436
  ### Bug Fixes
428
437
 
429
- * The `Element.getAttribute` method returns an incorrect value ([#5984](https://github.com/DevExpress/testcafe/issues/5984)).
438
+ * The `Element.getAttribute` method returns an incorrect value ([#5984](https://github.com/DevExpress/testcafe/issues/5984)).
430
439
  * TestCafe test fails when you forget to include the `await` keyword before the assertion statement ([#4613](https://github.com/DevExpress/testcafe/issues/4613)).
431
440
  * TestCafe fails to focus an element inside a shadow DOM ([#4988](https://github.com/DevExpress/testcafe/issues/4988)).
432
441
  * TestCafe fails to focus SVG elements ([#6262](https://github.com/DevExpress/testcafe/issues/6262)).
433
442
  * TestCafe raises the blur event when you focus a non-focusable element ([#6236](https://github.com/DevExpress/testcafe/pull/6236)).
434
443
  * TestCafe test hangs when you click a link within a cross-domain iframe ([#6331](https://github.com/DevExpress/testcafe/pull/6331)).
435
- * TestCafe loads the Babel compiler libraries multiple times ([#6310](https://github.com/DevExpress/testcafe/pull/6310)).
444
+ * TestCafe loads the Babel compiler libraries multiple times ([#6310](https://github.com/DevExpress/testcafe/pull/6310)).
436
445
  * TestCafe incorrectly parses the meta refresh tags ([PR testcafe-hammerhead/#2663](https://github.com/DevExpress/testcafe-hammerhead/pull/2663))
437
446
  * TestCafe incorrectly processes iframe elements with the "srcdoc" attribute ([testcafe-hammerhead/#2647](https://github.com/DevExpress/testcafe-hammerhead/issues/2647)).
438
447
  * TestCafe incorrectly specifies the Referer HTTP request header if you use the "navigateTo" action ([testcafe-hammerhead/#2607](https://github.com/DevExpress/testcafe-hammerhead/issues/2607)).
439
- * An error related to the [bug in Node.js](https://github.com/nodejs/node/issues/37849) occurs ([testcafe-hammerhead/#2655](https://github.com/DevExpress/testcafe-hammerhead/pull/2655)).
448
+ * An error related to the [bug in Node.js](https://github.com/nodejs/node/issues/37849) occurs ([testcafe-hammerhead/#2655](https://github.com/DevExpress/testcafe-hammerhead/pull/2655)).
440
449
 
441
450
  ## v1.15.0 (2021-07-08)
442
451
 
package/README.md CHANGED
@@ -299,6 +299,7 @@ TestCafe developers and community members made these plugins:
299
299
  * [Slack](https://github.com/Shafied/testcafe-reporter-slack) (by [@Shafied](https://github.com/Shafied))
300
300
  * [NUnit](https://github.com/AndreyBelym/testcafe-reporter-nunit) (by [@AndreyBelym](https://github.com/AndreyBelym))
301
301
  * [TimeCafe](https://github.com/jimthedev/timecafe) (by [@jimthedev](https://github.com/jimthedev))
302
+ * [Tesults](https://github.com/tesults/testcafe-reporter-tesults) (by [@Tesults](https://github.com/tesults))
302
303
 
303
304
  * **GitHub Action**<br/>
304
305
  Run TestCafe tests in GitHub Actions workflows.
@@ -8,7 +8,7 @@ const vm_1 = require("vm");
8
8
  const module_1 = __importDefault(require("module"));
9
9
  const path_1 = __importDefault(require("path"));
10
10
  const exportable_lib_1 = __importDefault(require("../exportable-lib"));
11
- const node_modules_folder_name_1 = __importDefault(require("../../shared/node-modules-folder-name"));
11
+ const node_modules_folder_name_1 = __importDefault(require("../../utils/node-modules-folder-name"));
12
12
  const OPTIONS_KEY = Symbol('options');
13
13
  exports.DEFAULT_CONTEXT_OPTIONS = {
14
14
  skipVisibilityCheck: false,
@@ -86,4 +86,4 @@ function createExecutionContext(testRun) {
86
86
  }));
87
87
  }
88
88
  exports.createExecutionContext = createExecutionContext;
89
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXhlY3V0aW9uLWNvbnRleHQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvYXBpL3Rlc3QtY29udHJvbGxlci9leGVjdXRpb24tY29udGV4dC5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSwyQkFBbUM7QUFDbkMsb0RBQTRCO0FBQzVCLGdEQUF3QjtBQUN4Qix1RUFBOEM7QUFDOUMscUdBQWlFO0FBRWpFLE1BQU0sV0FBVyxHQUFHLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQztBQUV6QixRQUFBLHVCQUF1QixHQUFHO0lBQ25DLG1CQUFtQixFQUFFLEtBQUs7SUFDMUIsY0FBYyxFQUFPLEtBQUs7Q0FDN0IsQ0FBQztBQUVGLFNBQVMsa0JBQWtCLENBQUUsV0FBVztJQUNwQyxNQUFNLFNBQVMsR0FBRyxFQUFFLENBQUM7SUFDckIsSUFBSSxTQUFTLEdBQUssY0FBSSxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUU1QyxPQUFPLFdBQVcsS0FBSyxTQUFTLEVBQUU7UUFDOUIsV0FBVyxHQUFHLFNBQVMsQ0FBQztRQUN4QixTQUFTLEdBQUssY0FBSSxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUV4QyxTQUFTLENBQUMsSUFBSSxDQUFDLGNBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLGtDQUFZLENBQUMsQ0FBQyxDQUFDO0tBQ3hEO0lBRUQsT0FBTyxTQUFTLENBQUM7QUFDckIsQ0FBQztBQUVELFNBQVMsYUFBYSxDQUFFLFFBQVE7SUFDNUIsZ0NBQWdDO0lBQ2hDLElBQUksZ0JBQU0sQ0FBQyxxQkFBcUI7UUFDNUIsT0FBTyxnQkFBTSxDQUFDLHFCQUFxQixDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBRWxELElBQUksZ0JBQU0sQ0FBQyxhQUFhO1FBQ3BCLE9BQU8sZ0JBQU0sQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLENBQUM7SUFFMUMsTUFBTSxXQUFXLEdBQVksSUFBSSxnQkFB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LENBQUM7WUFFNUIsTUFBTSxJQUFJLEtBQUssQ0FBQyxHQUFHLFFBQVEsaUJBQWlCLENBQUMsQ0FBQztRQUNsRCxDQUFDO0tBQ0osQ0FBQyxDQUFDLENBQUM7QUFDUixDQUFDO0FBN0JELHdEQTZCQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGNyZWF0ZUNvbnRleHQgfSBmcm9tICd2bSc7XG5pbXBvcnQgTW9kdWxlIGZyb20gJ21vZHVsZSc7XG5pbXBvcnQgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCBleHBvcnRhYmxlTGliIGZyb20gJy4uL2V4cG9ydGFibGUtbGliJztcbmltcG9ydCBOT0RFX01PRFVMRVMgZnJvbSAnLi4vLi4vc2hhcmVkL25vZGUtbW9kdWxlcy1mb2xkZXItbmFtZSc7XG5cbmNvbnN0IE9QVElPTlNfS0VZID0gU3ltYm9sKCdvcHRpb25zJyk7XG5cbmV4cG9ydCBjb25zdCBERUZBVUxUX0NPTlRFWFRfT1BUSU9OUyA9IHtcbiAgICBza2lwVmlzaWJpbGl0eUNoZWNrOiBmYWxzZSxcbiAgICBjb2xsZWN0aW9uTW9kZTogICAgICBmYWxzZSxcbn07XG5cbmZ1bmN0aW9uIGdldE1vZHVsZUJhc2VQYXRocyAoY3VycmVudFBhdGgpIHtcbiAgICBjb25zdCBub2RlUGF0aHMgPSBbXTtcbiAgICBsZXQgcGFyZW50RGlyICAgPSBwYXRoLmRpcm5hbWUoY3VycmVudFBhdGgpO1xuXG4gICAgd2hpbGUgKGN1cnJlbnRQYXRoICE9PSBwYXJlbnREaXIpIHtcbiAgICAgICAgY3VycmVudFBhdGggPSBwYXJlbnREaXI7XG4gICAgICAgIHBhcmVudERpciAgID0gcGF0aC5kaXJuYW1lKGN1cnJlbnRQYXRoKTtcblxuICAgICAgICBub2RlUGF0aHMucHVzaChwYXRoLmpvaW4oY3VycmVudFBhdGgsIE5PREVfTU9EVUxFUykpO1xuICAgIH1cblxuICAgIHJldHVybiBub2RlUGF0aHM7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZVJlcXVpcmUgKGZpbGVuYW1lKSB7XG4gICAgLy9EZXByZWNhdGVkIHNpbmNlOiBOb2RlIHYxMi4yLjBcbiAgICBpZiAoTW9kdWxlLmNyZWF0ZVJlcXVpcmVGcm9tUGF0aClcbiAgICAgICAgcmV0dXJuIE1vZHVsZS5jcmVhdGVSZXF1aXJlRnJvbVBhdGgoZmlsZW5hbWUpO1xuXG4gICAgaWYgKE1vZHVsZS5jcmVhdGVSZXF1aXJlKVxuICAgICAgICByZXR1cm4gTW9kdWxlLmNyZWF0ZVJlcXVpcmUoZmlsZW5hbWUpO1xuXG4gICAgY29uc3QgZHVtbXlNb2R1bGUgICAgICAgICAgPSBuZXcgTW9kdWxlKGZpbGVuYW1lLCBtb2R1bGUpO1xuICAgIGNvbnN0IGxvY2FsTW9kdWxlc1BhdGhzICAgID0gZ2V0TW9kdWxlQmFzZVBhdGhzKGZpbGVuYW1lKTtcblxuICAgIGR1bW15TW9kdWxlLmZpbGVuYW1lID0gZmlsZW5hbWU7XG4gICAgZHVtbXlNb2R1bGUucGF0aHMgICAgPSBsb2NhbE1vZHVsZXNQYXRocy5jb25jYXQobW9kdWxlLnBhdGhzKTtcblxuICAgIHJldHVybiBpZCA9PiBkdW1teU1vZHVsZS5yZXF1aXJlKGlkKTtcbn1cblxuZnVuY3Rpb24gY3JlYXRlU2VsZWN0b3JEZWZpbml0aW9uICh0ZXN0UnVuKSB7XG4gICAgcmV0dXJuIChmbiwgb3B0aW9ucyA9IHt9KSA9PiB7XG4gICAgICAgIGNvbnN0IHsgc2tpcFZpc2liaWxpdHlDaGVjaywgY29sbGVjdGlvbk1vZGUgfSA9IHRlc3RSdW4uY29udHJvbGxlci5nZXRFeGVjdXRpb25Db250ZXh0KClbT1BUSU9OU19LRVldO1xuXG4gICAgICAgIGlmIChza2lwVmlzaWJpbGl0eUNoZWNrKVxuICAgICAgICAgICAgb3B0aW9ucy52aXNpYmlsaXR5Q2hlY2sgPSBmYWxzZTtcblxuICAgICAgICBpZiAodGVzdFJ1biAmJiB0ZXN0UnVuLmlkKVxuICAgICAgICAgICAgb3B0aW9ucy5ib3VuZFRlc3RSdW4gPSB0ZXN0UnVuO1xuXG4gICAgICAgIGlmIChjb2xsZWN0aW9uTW9kZSlcbiAgICAgICAgICAgIG9wdGlvbnMuY29sbGVjdGlvbk1vZGUgPSBjb2xsZWN0aW9uTW9kZTtcblxuICAgICAgICByZXR1cm4gZXhwb3J0YWJsZUxpYi5TZWxlY3Rvcihmbiwgb3B0aW9ucyk7XG4gICAgfTtcbn1cblxuZnVuY3Rpb24gY3JlYXRlQ2xpZW50RnVuY3Rpb25EZWZpbml0aW9uICh0ZXN0UnVuKSB7XG4gICAgcmV0dXJuIChmbiwgb3B0aW9ucyA9IHt9KSA9PiB7XG4gICAgICAgIGlmICh0ZXN0UnVuICYmIHRlc3RSdW4uaWQpXG4gICAgICAgICAgICBvcHRpb25zLmJvdW5kVGVzdFJ1biA9IHRlc3RSdW47XG5cbiAgICAgICAgcmV0dXJuIGV4cG9ydGFibGVMaWIuQ2xpZW50RnVuY3Rpb24oZm4sIG9wdGlvbnMpO1xuICAgIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzZXRDb250ZXh0T3B0aW9ucyAoY29udGV4dCwgb3B0aW9ucykge1xuICAgIGNvbnRleHRbT1BUSU9OU19LRVldID0gb3B0aW9ucztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUV4ZWN1dGlvbkNvbnRleHQgKHRlc3RSdW4pIHtcbiAgICBjb25zdCBmaWxlbmFtZSA9IHRlc3RSdW4udGVzdC50ZXN0RmlsZS5maWxlbmFtZTtcblxuICAgIGNvbnN0IHJlcGxhY2VycyA9IHtcbiAgICAgICAgcmVxdWlyZTogICAgICAgIGNyZWF0ZVJlcXVpcmUoZmlsZW5hbWUpLFxuICAgICAgICBfX2ZpbGVuYW1lOiAgICAgZmlsZW5hbWUsXG4gICAgICAgIF9fZGlybmFtZTogICAgICBwYXRoLmRpcm5hbWUoZmlsZW5hbWUpLFxuICAgICAgICB0OiAgICAgICAgICAgICAgdGVzdFJ1bi5jb250cm9sbGVyLFxuICAgICAgICBTZWxlY3RvcjogICAgICAgY3JlYXRlU2VsZWN0b3JEZWZpbml0aW9uKHRlc3RSdW4pLFxuICAgICAgICBDbGllbnRGdW5jdGlvbjogY3JlYXRlQ2xpZW50RnVuY3Rpb25EZWZpbml0aW9uKHRlc3RSdW4pLFxuICAgICAgICBSb2xlOiAgICAgICAgICAgZXhwb3J0YWJsZUxpYi5Sb2xlLFxuICAgICAgICBSZXF1ZXN0TG9nZ2VyOiAgZXhwb3J0YWJsZUxpYi5SZXF1ZXN0TG9nZ2VyLFxuICAgICAgICBSZXF1ZXN0TW9jazogICAgZXhwb3J0YWJsZUxpYi5SZXF1ZXN0TW9jayxcbiAgICAgICAgUmVxdWVzdEhvb2s6ICAgIGV4cG9ydGFibGVMaWIuUmVxdWVzdEhvb2ssXG4gICAgICAgIFtPUFRJT05TX0tFWV06ICBERUZBVUxUX0NPTlRFWFRfT1BUSU9OUyxcbiAgICAgICAgdXNlclZhcmlhYmxlczogIGV4cG9ydGFibGVMaWIudXNlclZhcmlhYmxlcyxcbiAgICB9O1xuXG4gICAgcmV0dXJuIGNyZWF0ZUNvbnRleHQobmV3IFByb3h5KHJlcGxhY2Vycywge1xuICAgICAgICBnZXQ6ICh0YXJnZXQsIHByb3BlcnR5KSA9PiB7XG4gICAgICAgICAgICBpZiAocmVwbGFjZXJzLmhhc093blByb3BlcnR5KHByb3BlcnR5KSlcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVwbGFjZXJzW3Byb3BlcnR5XTtcblxuICAgICAgICAgICAgaWYgKGdsb2JhbC5oYXNPd25Qcm9wZXJ0eShwcm9wZXJ0eSkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGdsb2JhbFtwcm9wZXJ0eV07XG5cbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgJHtwcm9wZXJ0eX0gaXMgbm90IGRlZmluZWRgKTtcbiAgICAgICAgfSxcbiAgICB9KSk7XG59XG4iXX0=
89
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXhlY3V0aW9uLWNvbnRleHQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvYXBpL3Rlc3QtY29udHJvbGxlci9leGVjdXRpb24tY29udGV4dC5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSwyQkFBbUM7QUFDbkMsb0RBQTRCO0FBQzVCLGdEQUF3QjtBQUN4Qix1RUFBOEM7QUFDOUMsb0dBQWdFO0FBRWhFLE1BQU0sV0FBVyxHQUFHLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQztBQUV6QixRQUFBLHVCQUF1QixHQUFHO0lBQ25DLG1CQUFtQixFQUFFLEtBQUs7SUFDMUIsY0FBYyxFQUFPLEtBQUs7Q0FDN0IsQ0FBQztBQUVGLFNBQVMsa0JBQWtCLENBQUUsV0FBVztJQUNwQyxNQUFNLFNBQVMsR0FBRyxFQUFFLENBQUM7SUFDckIsSUFBSSxTQUFTLEdBQUssY0FBSSxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUU1QyxPQUFPLFdBQVcsS0FBSyxTQUFTLEVBQUU7UUFDOUIsV0FBVyxHQUFHLFNBQVMsQ0FBQztRQUN4QixTQUFTLEdBQUssY0FBSSxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUV4QyxTQUFTLENBQUMsSUFBSSxDQUFDLGNBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLGtDQUFZLENBQUMsQ0FBQyxDQUFDO0tBQ3hEO0lBRUQsT0FBTyxTQUFTLENBQUM7QUFDckIsQ0FBQztBQUVELFNBQVMsYUFBYSxDQUFFLFFBQVE7SUFDNUIsZ0NBQWdDO0lBQ2hDLElBQUksZ0JBQU0sQ0FBQyxxQkFBcUI7UUFDNUIsT0FBTyxnQkFBTSxDQUFDLHFCQUFxQixDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBRWxELElBQUksZ0JBQU0sQ0FBQyxhQUFhO1FBQ3BCLE9BQU8sZ0JBQU0sQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLENBQUM7SUFFMUMsTUFBTSxXQUFXLEdBQVksSUFBSSxnQkFB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LENBQUM7WUFFNUIsTUFBTSxJQUFJLEtBQUssQ0FBQyxHQUFHLFFBQVEsaUJBQWlCLENBQUMsQ0FBQztRQUNsRCxDQUFDO0tBQ0osQ0FBQyxDQUFDLENBQUM7QUFDUixDQUFDO0FBN0JELHdEQTZCQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGNyZWF0ZUNvbnRleHQgfSBmcm9tICd2bSc7XG5pbXBvcnQgTW9kdWxlIGZyb20gJ21vZHVsZSc7XG5pbXBvcnQgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCBleHBvcnRhYmxlTGliIGZyb20gJy4uL2V4cG9ydGFibGUtbGliJztcbmltcG9ydCBOT0RFX01PRFVMRVMgZnJvbSAnLi4vLi4vdXRpbHMvbm9kZS1tb2R1bGVzLWZvbGRlci1uYW1lJztcblxuY29uc3QgT1BUSU9OU19LRVkgPSBTeW1ib2woJ29wdGlvbnMnKTtcblxuZXhwb3J0IGNvbnN0IERFRkFVTFRfQ09OVEVYVF9PUFRJT05TID0ge1xuICAgIHNraXBWaXNpYmlsaXR5Q2hlY2s6IGZhbHNlLFxuICAgIGNvbGxlY3Rpb25Nb2RlOiAgICAgIGZhbHNlLFxufTtcblxuZnVuY3Rpb24gZ2V0TW9kdWxlQmFzZVBhdGhzIChjdXJyZW50UGF0aCkge1xuICAgIGNvbnN0IG5vZGVQYXRocyA9IFtdO1xuICAgIGxldCBwYXJlbnREaXIgICA9IHBhdGguZGlybmFtZShjdXJyZW50UGF0aCk7XG5cbiAgICB3aGlsZSAoY3VycmVudFBhdGggIT09IHBhcmVudERpcikge1xuICAgICAgICBjdXJyZW50UGF0aCA9IHBhcmVudERpcjtcbiAgICAgICAgcGFyZW50RGlyICAgPSBwYXRoLmRpcm5hbWUoY3VycmVudFBhdGgpO1xuXG4gICAgICAgIG5vZGVQYXRocy5wdXNoKHBhdGguam9pbihjdXJyZW50UGF0aCwgTk9ERV9NT0RVTEVTKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5vZGVQYXRocztcbn1cblxuZnVuY3Rpb24gY3JlYXRlUmVxdWlyZSAoZmlsZW5hbWUpIHtcbiAgICAvL0RlcHJlY2F0ZWQgc2luY2U6IE5vZGUgdjEyLjIuMFxuICAgIGlmIChNb2R1bGUuY3JlYXRlUmVxdWlyZUZyb21QYXRoKVxuICAgICAgICByZXR1cm4gTW9kdWxlLmNyZWF0ZVJlcXVpcmVGcm9tUGF0aChmaWxlbmFtZSk7XG5cbiAgICBpZiAoTW9kdWxlLmNyZWF0ZVJlcXVpcmUpXG4gICAgICAgIHJldHVybiBNb2R1bGUuY3JlYXRlUmVxdWlyZShmaWxlbmFtZSk7XG5cbiAgICBjb25zdCBkdW1teU1vZHVsZSAgICAgICAgICA9IG5ldyBNb2R1bGUoZmlsZW5hbWUsIG1vZHVsZSk7XG4gICAgY29uc3QgbG9jYWxNb2R1bGVzUGF0aHMgICAgPSBnZXRNb2R1bGVCYXNlUGF0aHMoZmlsZW5hbWUpO1xuXG4gICAgZHVtbXlNb2R1bGUuZmlsZW5hbWUgPSBmaWxlbmFtZTtcbiAgICBkdW1teU1vZHVsZS5wYXRocyAgICA9IGxvY2FsTW9kdWxlc1BhdGhzLmNvbmNhdChtb2R1bGUucGF0aHMpO1xuXG4gICAgcmV0dXJuIGlkID0+IGR1bW15TW9kdWxlLnJlcXVpcmUoaWQpO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVTZWxlY3RvckRlZmluaXRpb24gKHRlc3RSdW4pIHtcbiAgICByZXR1cm4gKGZuLCBvcHRpb25zID0ge30pID0+IHtcbiAgICAgICAgY29uc3QgeyBza2lwVmlzaWJpbGl0eUNoZWNrLCBjb2xsZWN0aW9uTW9kZSB9ID0gdGVzdFJ1bi5jb250cm9sbGVyLmdldEV4ZWN1dGlvbkNvbnRleHQoKVtPUFRJT05TX0tFWV07XG5cbiAgICAgICAgaWYgKHNraXBWaXNpYmlsaXR5Q2hlY2spXG4gICAgICAgICAgICBvcHRpb25zLnZpc2liaWxpdHlDaGVjayA9IGZhbHNlO1xuXG4gICAgICAgIGlmICh0ZXN0UnVuICYmIHRlc3RSdW4uaWQpXG4gICAgICAgICAgICBvcHRpb25zLmJvdW5kVGVzdFJ1biA9IHRlc3RSdW47XG5cbiAgICAgICAgaWYgKGNvbGxlY3Rpb25Nb2RlKVxuICAgICAgICAgICAgb3B0aW9ucy5jb2xsZWN0aW9uTW9kZSA9IGNvbGxlY3Rpb25Nb2RlO1xuXG4gICAgICAgIHJldHVybiBleHBvcnRhYmxlTGliLlNlbGVjdG9yKGZuLCBvcHRpb25zKTtcbiAgICB9O1xufVxuXG5mdW5jdGlvbiBjcmVhdGVDbGllbnRGdW5jdGlvbkRlZmluaXRpb24gKHRlc3RSdW4pIHtcbiAgICByZXR1cm4gKGZuLCBvcHRpb25zID0ge30pID0+IHtcbiAgICAgICAgaWYgKHRlc3RSdW4gJiYgdGVzdFJ1bi5pZClcbiAgICAgICAgICAgIG9wdGlvbnMuYm91bmRUZXN0UnVuID0gdGVzdFJ1bjtcblxuICAgICAgICByZXR1cm4gZXhwb3J0YWJsZUxpYi5DbGllbnRGdW5jdGlvbihmbiwgb3B0aW9ucyk7XG4gICAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNldENvbnRleHRPcHRpb25zIChjb250ZXh0LCBvcHRpb25zKSB7XG4gICAgY29udGV4dFtPUFRJT05TX0tFWV0gPSBvcHRpb25zO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlRXhlY3V0aW9uQ29udGV4dCAodGVzdFJ1bikge1xuICAgIGNvbnN0IGZpbGVuYW1lID0gdGVzdFJ1bi50ZXN0LnRlc3RGaWxlLmZpbGVuYW1lO1xuXG4gICAgY29uc3QgcmVwbGFjZXJzID0ge1xuICAgICAgICByZXF1aXJlOiAgICAgICAgY3JlYXRlUmVxdWlyZShmaWxlbmFtZSksXG4gICAgICAgIF9fZmlsZW5hbWU6ICAgICBmaWxlbmFtZSxcbiAgICAgICAgX19kaXJuYW1lOiAgICAgIHBhdGguZGlybmFtZShmaWxlbmFtZSksXG4gICAgICAgIHQ6ICAgICAgICAgICAgICB0ZXN0UnVuLmNvbnRyb2xsZXIsXG4gICAgICAgIFNlbGVjdG9yOiAgICAgICBjcmVhdGVTZWxlY3RvckRlZmluaXRpb24odGVzdFJ1biksXG4gICAgICAgIENsaWVudEZ1bmN0aW9uOiBjcmVhdGVDbGllbnRGdW5jdGlvbkRlZmluaXRpb24odGVzdFJ1biksXG4gICAgICAgIFJvbGU6ICAgICAgICAgICBleHBvcnRhYmxlTGliLlJvbGUsXG4gICAgICAgIFJlcXVlc3RMb2dnZXI6ICBleHBvcnRhYmxlTGliLlJlcXVlc3RMb2dnZXIsXG4gICAgICAgIFJlcXVlc3RNb2NrOiAgICBleHBvcnRhYmxlTGliLlJlcXVlc3RNb2NrLFxuICAgICAgICBSZXF1ZXN0SG9vazogICAgZXhwb3J0YWJsZUxpYi5SZXF1ZXN0SG9vayxcbiAgICAgICAgW09QVElPTlNfS0VZXTogIERFRkFVTFRfQ09OVEVYVF9PUFRJT05TLFxuICAgICAgICB1c2VyVmFyaWFibGVzOiAgZXhwb3J0YWJsZUxpYi51c2VyVmFyaWFibGVzLFxuICAgIH07XG5cbiAgICByZXR1cm4gY3JlYXRlQ29udGV4dChuZXcgUHJveHkocmVwbGFjZXJzLCB7XG4gICAgICAgIGdldDogKHRhcmdldCwgcHJvcGVydHkpID0+IHtcbiAgICAgICAgICAgIGlmIChyZXBsYWNlcnMuaGFzT3duUHJvcGVydHkocHJvcGVydHkpKVxuICAgICAgICAgICAgICAgIHJldHVybiByZXBsYWNlcnNbcHJvcGVydHldO1xuXG4gICAgICAgICAgICBpZiAoZ2xvYmFsLmhhc093blByb3BlcnR5KHByb3BlcnR5KSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZ2xvYmFsW3Byb3BlcnR5XTtcblxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAke3Byb3BlcnR5fSBpcyBub3QgZGVmaW5lZGApO1xuICAgICAgICB9LFxuICAgIH0pKTtcbn1cbiJdfQ==
@@ -0,0 +1,16 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ class BrowserConnectionTracker {
4
+ constructor() {
5
+ this.activeBrowserConnections = {};
6
+ }
7
+ add(connection) {
8
+ this.activeBrowserConnections[connection.id] = connection;
9
+ }
10
+ remove(connection) {
11
+ delete this.activeBrowserConnections[connection.id];
12
+ }
13
+ }
14
+ exports.default = new BrowserConnectionTracker();
15
+ module.exports = exports.default;
16
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnJvd3Nlci1jb25uZWN0aW9uLXRyYWNrZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvYnJvd3Nlci9jb25uZWN0aW9uL2Jyb3dzZXItY29ubmVjdGlvbi10cmFja2VyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBRUEsTUFBTSx3QkFBd0I7SUFHMUI7UUFDSSxJQUFJLENBQUMsd0JBQXdCLEdBQUcsRUFBRSxDQUFDO0lBQ3ZDLENBQUM7SUFFTSxHQUFHLENBQUUsVUFBNkI7UUFDckMsSUFBSSxDQUFDLHdCQUF3QixDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUMsR0FBRyxVQUFVLENBQUM7SUFDOUQsQ0FBQztJQUVNLE1BQU0sQ0FBRSxVQUE2QjtRQUN4QyxPQUFPLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDeEQsQ0FBQztDQUNKO0FBRUQsa0JBQWUsSUFBSSx3QkFBd0IsRUFBRSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IEJyb3dzZXJDb25uZWN0aW9uIGZyb20gJy4vaW5kZXgnO1xuXG5jbGFzcyBCcm93c2VyQ29ubmVjdGlvblRyYWNrZXIge1xuICAgIHB1YmxpYyBhY3RpdmVCcm93c2VyQ29ubmVjdGlvbnM6IHsgW2lkOiBzdHJpbmddOiBCcm93c2VyQ29ubmVjdGlvbiB9O1xuXG4gICAgcHVibGljIGNvbnN0cnVjdG9yICgpIHtcbiAgICAgICAgdGhpcy5hY3RpdmVCcm93c2VyQ29ubmVjdGlvbnMgPSB7fTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYWRkIChjb25uZWN0aW9uOiBCcm93c2VyQ29ubmVjdGlvbik6IHZvaWQge1xuICAgICAgICB0aGlzLmFjdGl2ZUJyb3dzZXJDb25uZWN0aW9uc1tjb25uZWN0aW9uLmlkXSA9IGNvbm5lY3Rpb247XG4gICAgfVxuXG4gICAgcHVibGljIHJlbW92ZSAoY29ubmVjdGlvbjogQnJvd3NlckNvbm5lY3Rpb24pOiB2b2lkIHtcbiAgICAgICAgZGVsZXRlIHRoaXMuYWN0aXZlQnJvd3NlckNvbm5lY3Rpb25zW2Nvbm5lY3Rpb24uaWRdO1xuICAgIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgbmV3IEJyb3dzZXJDb25uZWN0aW9uVHJhY2tlcigpO1xuIl19
@@ -11,10 +11,9 @@ class BrowserConnectionGateway {
11
11
  constructor(proxy, options) {
12
12
  this._connections = {};
13
13
  this._remotesQueue = new remotes_queue_1.default();
14
- // @ts-ignore Need to improve typings of the 'testcafe-hammerhead' module
15
- this.domain = proxy.server1Info.domain;
16
- this.connectUrl = `${this.domain}/browser/connect`;
14
+ this.connectUrl = proxy.resolveRelativeServiceUrl('/browser/connect');
17
15
  this.retryTestPages = options.retryTestPages;
16
+ this.proxy = proxy;
18
17
  this._registerRoutes(proxy);
19
18
  }
20
19
  _dispatch(url, proxy, handler, method = 'GET') {
@@ -167,4 +166,4 @@ class BrowserConnectionGateway {
167
166
  }
168
167
  exports.default = BrowserConnectionGateway;
169
168
  module.exports = exports.default;
170
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2F0ZXdheS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9icm93c2VyL2Nvbm5lY3Rpb24vZ2F0ZXdheS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLG9FQUEyQztBQUMzQywyQ0FNMEI7QUFFMUIsb0VBQTJDO0FBSzNDLHNFQUE4QztBQUc5QyxNQUFxQix3QkFBd0I7SUFPekMsWUFBb0IsS0FBWSxFQUFFLE9BQW9DO1FBTjlELGlCQUFZLEdBQWtDLEVBQUUsQ0FBQztRQU9yRCxJQUFJLENBQUMsYUFBYSxHQUFLLElBQUksdUJBQVksRUFBRSxDQUFDO1FBQzFDLHlFQUF5RTtRQUN6RSxJQUFJLENBQUMsTUFBTSxHQUFhLEtBQWEsQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDO1FBQ3pELElBQUksQ0FBQyxVQUFVLEdBQVEsR0FBRyxJQUFJLENBQUMsTUFBTSxrQkFBa0IsQ0FBQztRQUN4RCxJQUFJLENBQUMsY0FBYyxHQUFJLE9BQU8sQ0FBQyxjQUFjLENBQUM7UUFFOUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNoQyxDQUFDO0lBRU8sU0FBUyxDQUFFLEdBQVcsRUFBRSxLQUFZLEVBQUUsT0FBaUIsRUFBRSxNQUFNLEdBQUcsS0FBSztRQUMzRSx5RUFBeUU7UUFDekUsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLEdBQW9CLEVBQUUsR0FBbUIsRUFBRSxVQUFVLEVBQUUsTUFBMEIsRUFBRSxFQUFFO1lBQ3JHLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBRWhELHFCQUFjLENBQUMsR0FBRyxDQUFDLENBQUM7WUFFcEIsSUFBSSxVQUFVO2dCQUNWLE9BQU8sQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLFVBQVUsQ0FBQyxDQUFDOztnQkFFOUIsaUJBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQztR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QUMsRUFBRSxDQUFDLEdBQUcsVUFBVSxDQUFDO1FBRTlDLElBQUksVUFBVSxDQUFDLFdBQVcsQ0FBQyxZQUFZLEtBQUssUUFBUTtZQUNoRCxJQUFJLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUMzQyxDQUFDO0lBRU0scUJBQXFCLENBQUUsVUFBNkI7UUFDdkQsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUV4QyxJQUFJLFVBQVUsQ0FBQyxXQUFXLENBQUMsWUFBWSxLQUFLLFFBQVE7WUFDaEQsSUFBSSxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDOUMsQ0FBQztJQUVNLEtBQUssQ0FBQyxLQUFLO1FBQ2QsS0FBSyxNQUFNLEVBQUUsSUFBSSxJQUFJLENBQUMsWUFBWTtZQUM5QixNQUFNLElBQUksQ0FBQyxZQUFZLENBQUMsRUFBRSxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUM7SUFDNUMsQ0FBQztDQUNKO0FBbE5ELDJDQWtOQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBsb2FkQXNzZXRzIGZyb20gJy4uLy4uL2xvYWQtYXNzZXRzJztcbmltcG9ydCB7XG4gICAgcmVzcG9uZDQwNCxcbiAgICByZXNwb25kNTAwLFxuICAgIHJlc3BvbmRXaXRoSlNPTixcbiAgICByZWRpcmVjdCxcbiAgICBwcmV2ZW50Q2FjaGluZyxcbn0gZnJvbSAnLi4vLi4vdXRpbHMvaHR0cCc7XG5cbmltcG9ydCBSZW1vdGVzUXVldWUgZnJvbSAnLi9yZW1vdGVzLXF1ZXVlJztcbmltcG9ydCB7IFByb3h5IH0gZnJvbSAndGVzdGNhZmUtaGFtbWVyaGVhZCc7XG5pbXBvcnQgeyBEaWN0aW9uYXJ5IH0gZnJvbSAnLi4vLi4vY29uZmlndXJhdGlvbi9pbnRlcmZhY2VzJztcbmltcG9ydCBCcm93c2VyQ29ubmVjdGlvbiBmcm9tICcuL2luZGV4JztcbmltcG9ydCB7IEluY29taW5nTWVzc2FnZSwgU2VydmVyUmVzcG9uc2UgfSBmcm9tICdodHRwJztcbmltcG9ydCBTRVJWSUNFX1JPVVRFUyBmcm9tICcuL3NlcnZpY2Utcm91dGVzJztcblxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBCcm93c2VyQ29ubmVjdGlvbkdhdGV3YXkge1xuICAgIHByaXZhdGUgX2Nvbm5lY3Rpb25zOiBEaWN0aW9uYXJ5PEJyb3dzZXJDb25uZWN0aW9uPiA9IHt9O1xuICAgIHByaXZhdGUgX3JlbW90ZXNRdWV1ZTogUmVtb3Rlc1F1ZXVlO1xuICAgIHB1YmxpYyByZWFkb25seSBkb21haW46IHN0cmluZztcbiAgICBwdWJsaWMgcmVhZG9ubHkgY29ubmVjdFVybDogc3RyaW5nO1xuICAgIHB1YmxpYyByZXRyeVRlc3RQYWdlczogYm9vbGVhbjtcblxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvciAocHJveHk6IFByb3h5LCBvcHRpb25zOiB7IHJldHJ5VGVzdFBhZ2VzOiBib29sZWFuIH0pIHtcbiAgICAgICAgdGhpcy5fcmVtb3Rlc1F1ZXVlICAgPSBuZXcgUmVtb3Rlc1F1ZXVlKCk7XG4gICAgICAgIC8vIEB0cy1pZ25vcmUgTmVlZCB0byBpbXByb3ZlIHR5cGluZ3Mgb2YgdGhlICd0ZXN0Y2FmZS1oYW1tZXJoZWFkJyBtb2R1bGVcbiAgICAgICAgdGhpcy5kb21haW4gICAgICAgICAgPSAocHJveHkgYXMgYW55KS5zZXJ2ZXIxSW5mby5kb21haW47XG4gICAgICAgIHRoaXMuY29ubmVjdFVybCAgICAgID0gYCR7dGhpcy5kb21haW59L2Jyb3dzZXIvY29ubmVjdGA7XG4gICAgICAgIHRoaXMucmV0cnlUZXN0UGFnZXMgID0gb3B0aW9ucy5yZXRyeVRlc3RQYWdlcztcblxuICAgICAgICB0aGlzLl9yZWdpc3RlclJvdXRlcyhwcm94eSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfZGlzcGF0Y2ggKHVybDogc3RyaW5nLCBwcm94eTogUHJveHksIGhhbmRsZXI6IEZ1bmN0aW9uLCBtZXRob2QgPSAnR0VUJyk6IHZvaWQge1xuICAgICAgICAvLyBAdHMtaWdub3JlIE5lZWQgdG8gaW1wcm92ZSB0eXBpbmdzIG9mIHRoZSAndGVzdGNhZmUtaGFtbWVyaGVhZCcgbW9kdWxlXG4gICAgICAgIHByb3h5W21ldGhvZF0odXJsLCAocmVxOiBJbmNvbWluZ01lc3NhZ2UsIHJlczogU2VydmVyUmVzcG9uc2UsIHNlcnZlckluZm8sIHBhcmFtczogRGljdGlvbmFyeTxzdHJpbmc+KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBjb25uZWN0aW9uID0gdGhpcy5fY29ubmVjdGlvbnNbcGFyYW1zLmlkXTtcblxuICAgICAgICAgICAgcHJldmVudENhY2hpbmcocmVzKTtcblxuICAgICAgICAgICAgaWYgKGNvbm5lY3Rpb24pXG4gICAgICAgICAgICAgICAgaGFuZGxlcihyZXEsIHJlcywgY29ubmVjdGlvbik7XG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgcmVzcG9uZDQwNChyZXMpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9yZWdpc3RlclJvdXRlcyAocHJveHk6IFByb3h5KTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHtcbiAgICAgICAgICAgIGlkbGVQYWdlU2NyaXB0LFxuICAgICAgICAgICAgaWRsZVBhZ2VTdHlsZSxcbiAgICAgICAgICAgIGlkbGVQYWdlTG9nbyxcbiAgICAgICAgICAgIHNlcnZpY2VXb3JrZXJTY3JpcHQsXG4gICAgICAgIH0gPSBsb2FkQXNzZXRzKCk7XG5cbiAgICAgICAgdGhpcy5fZGlzcGF0Y2goJy9icm93c2VyL2Nvbm5lY3Qve2lkfScsIHByb3h5LCBCcm93c2VyQ29ubmVjdGlvbkdhdGV3YXkuX29uQ29ubmVjdGlvbik7XG4gICAgICAgIHRoaXMuX2Rpc3BhdGNoKCcvYnJvd3Nlci9oZWFydGJlYXQve2lkfScsIHByb3h5LCBCcm93c2VyQ29ubmVjdGlvbkdhdGV3YXkuX29uSGVhcnRiZWF0KTtcbiAgICAgICAgdGhpcy5fZGlzcGF0Y2goJy9icm93c2VyL2lkbGUve2lkfScsIHByb3h5LCBCcm93c2VyQ29ubmVjdGlvbkdhdGV3YXkuX29uSWRsZSk7XG4gICAgICAgIHRoaXMuX2Rpc3BhdGNoKCcvYnJvd3Nlci9pZGxlLWZvcmNlZC97aWR9JywgcHJveHksIEJyb3dzZXJDb25uZWN0aW9uR2F0ZXdheS5fb25JZGxlRm9yY2VkKTtcbiAgICAgICAgdGhpcy5fZGlzcGF0Y2goJy9icm93c2VyL3N0YXR1cy97aWR9JywgcHJveHksIEJyb3dzZXJDb25uZWN0aW9uR2F0ZXdheS5fb25TdGF0dXNSZXF1ZXN0KTtcbiAgICAgICAgdGhpcy5fZGlzcGF0Y2goJy9icm93c2VyL3N0YXR1cy1kb25lL3tpZH0nLCBwcm94eSwgQnJvd3NlckNvbm5lY3Rpb25HYXRld2F5Ll9vblN0YXR1c1JlcXVlc3RPblRlc3REb25lKTtcbiAgICAgICAgdGhpcy5fZGlzcGF0Y2goJy9icm93c2VyL2luaXQtc2NyaXB0L3tpZH0nLCBwcm94eSwgQnJvd3NlckNvbm5lY3Rpb25HYXRld2F5Ll9vbkluaXRTY3JpcHRSZXF1ZXN0KTtcbiAgICAgICAgdGhpcy5fZGlzcGF0Y2goJy9icm93c2VyL2luaXQtc2NyaXB0L3tpZH0nLCBwcm94eSwgQnJvd3NlckNvbm5lY3Rpb25HYXRld2F5Ll9vbkluaXRTY3JpcHRSZXNwb25zZSwgJ1BPU1QnKTtcbiAgICAgICAgdGhpcy5fZGlzcGF0Y2goJy9icm93c2VyL2FjdGl2ZS13aW5kb3ctaWQve2lkfScsIHByb3h5LCBCcm93c2VyQ29ubmVjdGlvbkdhdGV3YXkuX29uR2V0QWN0aXZlV2luZG93SWRSZXF1ZXN0KTtcbiAgICAgICAgdGhpcy5fZGlzcGF0Y2goJy9icm93c2VyL2FjdGl2ZS13aW5kb3ctaWQve2lkfScsIHByb3h5LCBCcm93c2VyQ29ubmVjdGlvbkdhdGV3YXkuX29uU2V0QWN0aXZlV2luZG93SWRSZXF1ZXN0LCAnUE9TVCcpO1xuICAgICAgICB0aGlzLl9kaXNwYXRjaCgnL2Jyb3dzZXIvY2xvc2Utd2luZG93L3tpZH0nLCBwcm94eSwgQnJvd3NlckNvbm5lY3Rpb25HYXRld2F5Ll9vbkNsb3NlV2luZG93UmVxdWVzdCwgJ1BPU1QnKTtcblxuXG4gICAgICAgIHByb3h5LkdFVChTRVJWSUNFX1JPVVRFUy5jb25uZWN0LCAocmVxOiBJbmNvbWluZ01lc3NhZ2UsIHJlczogU2VydmVyUmVzcG9uc2UpID0+IHRoaXMuX2Nvbm5lY3ROZXh0UmVtb3RlQnJvd3NlcihyZXEsIHJlcykpO1xuICAgICAgICBwcm94eS5HRVQoU0VSVklDRV9ST1VURVMuY29ubmVjdFdpdGhUcmFpbGluZ1NsYXNoLCAocmVxOiBJbmNvbWluZ01lc3NhZ2UsIHJlczogU2VydmVyUmVzcG9uc2UpID0+IHRoaXMuX2Nvbm5lY3ROZXh0UmVtb3RlQnJvd3NlcihyZXEsIHJlcykpO1xuXG4gICAgICAgIHByb3h5LkdFVChTRVJWSUNFX1JPVVRFUy5zZXJ2aWNlV29ya2VyLCB7IGNvbnRlbnQ6IHNlcnZpY2VXb3JrZXJTY3JpcHQsIGNvbnRlbnRUeXBlOiAnYXBwbGljYXRpb24veC1qYXZhc2NyaXB0JyB9KTtcbiAgICAgICAgcHJveHkuR0VUKFNFUlZJQ0VfUk9VVEVTLmFzc2V0cy5pbmRleCwgeyBjb250ZW50OiBpZGxlUGFnZVNjcmlwdCwgY29udGVudFR5cGU6ICdhcHBsaWNhdGlvbi94LWphdmFzY3JpcHQnIH0pO1xuICAgICAgICBwcm94eS5HRVQoU0VSVklDRV9ST1VURVMuYXNzZXRzLnN0eWxlcywgeyBjb250ZW50OiBpZGxlUGFnZVN0eWxlLCBjb250ZW50VHlwZTogJ3RleHQvY3NzJyB9KTtcbiAgICAgICAgcHJveHkuR0VUKFNFUlZJQ0VfUk9VVEVTLmFzc2V0cy5sb2dvLCB7IGNvbnRlbnQ6IGlkbGVQYWdlTG9nbywgY29udGVudFR5cGU6ICdpbWFnZS9zdmcreG1sJyB9KTtcbiAgICB9XG5cbiAgICAvLyBIZWxwZXJzXG4gICAgcHJpdmF0ZSBzdGF0aWMgX2Vuc3VyZUNvbm5lY3Rpb25SZWFkeSAocmVzOiBTZXJ2ZXJSZXNwb25zZSwgY29ubmVjdGlvbjogQnJvd3NlckNvbm5lY3Rpb24pOiBib29sZWFuIHtcbiAgICAgICAgaWYgKCFjb25uZWN0aW9uLmlzUmVhZHkoKSkge1xuICAgICAgICAgICAgcmVzcG9uZDUwMChyZXMsICdUaGUgY29ubmVjdGlvbiBpcyBub3QgcmVhZHkgeWV0LicpO1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzdGF0aWMgX2ZldGNoUmVxdWVzdERhdGEgKHJlcTogSW5jb21pbmdNZXNzYWdlLCBjYWxsYmFjazogKGRhdGE6IHN0cmluZykgPT4gdm9pZCk6IHZvaWQge1xuICAgICAgICBsZXQgZGF0YSA9ICcnO1xuXG4gICAgICAgIHJlcS5vbignZGF0YScsIGNodW5rID0+IHtcbiAgICAgICAgICAgIGRhdGEgKz0gY2h1bms7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJlcS5vbignZW5kJywgKCkgPT4ge1xuICAgICAgICAgICAgY2FsbGJhY2soZGF0YS50b1N0cmluZygpKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gUm91dGUgaGFuZGxlcnNcbiAgICBwcml2YXRlIHN0YXRpYyBhc3luYyBfb25Db25uZWN0aW9uIChyZXE6IEluY29taW5nTWVzc2FnZSwgcmVzOiBTZXJ2ZXJSZXNwb25zZSwgY29ubmVjdGlvbjogQnJvd3NlckNvbm5lY3Rpb24pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgaWYgKGNvbm5lY3Rpb24uaXNSZWFkeSgpKVxuICAgICAgICAgICAgcmVzcG9uZDUwMChyZXMsICdUaGUgY29ubmVjdGlvbiBpcyBhbHJlYWR5IGVzdGFibGlzaGVkLicpO1xuXG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgdXNlckFnZW50ID0gcmVxLmhlYWRlcnNbJ3VzZXItYWdlbnQnXSBhcyBzdHJpbmc7XG5cbiAgICAgICAgICAgIGF3YWl0IGNvbm5lY3Rpb24uZXN0YWJsaXNoKHVzZXJBZ2VudCk7XG4gICAgICAgICAgICByZWRpcmVjdChyZXMsIGNvbm5lY3Rpb24uaWRsZVVybCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIHN0YXRpYyBfb25IZWFydGJlYXQgKHJlcTogSW5jb21pbmdNZXNzYWdlLCByZXM6IFNlcnZlclJlc3BvbnNlLCBjb25uZWN0aW9uOiBCcm93c2VyQ29ubmVjdGlvbik6IHZvaWQge1xuICAgICAgICBpZiAoQnJvd3NlckNvbm5lY3Rpb25HYXRld2F5Ll9lbnN1cmVDb25uZWN0aW9uUmVhZHkocmVzLCBjb25uZWN0aW9uKSkge1xuICAgICAgICAgICAgY29uc3Qgc3RhdHVzID0gY29ubmVjdGlvbi5oZWFydGJlYXQoKTtcblxuICAgICAgICAgICAgcmVzcG9uZFdpdGhKU09OKHJlcywgc3RhdHVzKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgc3RhdGljIF9vbklkbGUgKHJlcTogSW5jb21pbmdNZXNzYWdlLCByZXM6IFNlcnZlclJlc3BvbnNlLCBjb25uZWN0aW9uOiBCcm93c2VyQ29ubmVjdGlvbik6IHZvaWQge1xuICAgICAgICBpZiAoQnJvd3NlckNvbm5lY3Rpb25HYXRld2F5Ll9lbnN1cmVDb25uZWN0aW9uUmVhZHkocmVzLCBjb25uZWN0aW9uKSlcbiAgICAgICAgICAgIHJlcy5lbmQoY29ubmVjdGlvbi5yZW5kZXJJZGxlUGFnZSgpKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHN0YXRpYyBhc3luYyBfb25JZGxlRm9yY2VkIChyZXE6IEluY29taW5nTWVzc2FnZSwgcmVzOiBTZXJ2ZXJSZXNwb25zZSwgY29ubmVjdGlvbjogQnJvd3NlckNvbm5lY3Rpb24pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgaWYgKEJyb3dzZXJDb25uZWN0aW9uR2F0ZXdheS5fZW5zdXJlQ29ubmVjdGlvblJlYWR5KHJlcywgY29ubmVjdGlvbikpIHtcbiAgICAgICAgICAgIGNvbnN0IHN0YXR1cyA9IGF3YWl0IGNvbm5lY3Rpb24uZ2V0U3RhdHVzKHRydWUpO1xuXG4gICAgICAgICAgICByZWRpcmVjdChyZXMsIHN0YXR1cy51cmwpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzdGF0aWMgYXN5bmMgX29uU3RhdHVzUmVxdWVzdCAocmVxOiBJbmNvbWluZ01lc3NhZ2UsIHJlczogU2VydmVyUmVzcG9uc2UsIGNvbm5lY3Rpb246IEJyb3dzZXJDb25uZWN0aW9uKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIHJldHVybiBCcm93c2VyQ29ubmVjdGlvbkdhdGV3YXkuX29uU3RhdHVzUmVxdWVzdENvcmUocmVxLCByZXMsIGNvbm5lY3Rpb24sIGZhbHNlKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHN0YXRpYyBhc3luYyBfb25TdGF0dXNSZXF1ZXN0T25UZXN0RG9uZSAocmVxOiBJbmNvbWluZ01lc3NhZ2UsIHJlczogU2VydmVyUmVzcG9uc2UsIGNvbm5lY3Rpb246IEJyb3dzZXJDb25uZWN0aW9uKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIHJldHVybiBCcm93c2VyQ29ubmVjdGlvbkdhdGV3YXkuX29uU3RhdHVzUmVxdWVzdENvcmUocmVxLCByZXMsIGNvbm5lY3Rpb24sIHRydWUpO1xuICAgIH1cblxuICAgIHByaXZhdGUgc3RhdGljIGFzeW5jIF9vblN0YXR1c1JlcXVlc3RDb3JlIChyZXE6IEluY29taW5nTWVzc2FnZSwgcmVzOiBTZXJ2ZXJSZXNwb25zZSwgY29ubmVjdGlvbjogQnJvd3NlckNvbm5lY3Rpb24sIGlzVGVzdERvbmU6IGJvb2xlYW4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgaWYgKEJyb3dzZXJDb25uZWN0aW9uR2F0ZXdheS5fZW5zdXJlQ29ubmVjdGlvblJlYWR5KHJlcywgY29ubmVjdGlvbikpIHtcbiAgICAgICAgICAgIGNvbnN0IHN0YXR1cyA9IGF3YWl0IGNvbm5lY3Rpb24uZ2V0U3RhdHVzKGlzVGVzdERvbmUpO1xuXG4gICAgICAgICAgICByZXNwb25kV2l0aEpTT04ocmVzLCBzdGF0dXMpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzdGF0aWMgX29uSW5pdFNjcmlwdFJlcXVlc3QgKHJlcTogSW5jb21pbmdNZXNzYWdlLCByZXM6IFNlcnZlclJlc3BvbnNlLCBjb25uZWN0aW9uOiBCcm93c2VyQ29ubmVjdGlvbik6IHZvaWQge1xuICAgICAgICBpZiAoQnJvd3NlckNvbm5lY3Rpb25HYXRld2F5Ll9lbnN1cmVDb25uZWN0aW9uUmVhZHkocmVzLCBjb25uZWN0aW9uKSkge1xuICAgICAgICAgICAgY29uc3Qgc2NyaXB0ID0gY29ubmVjdGlvbi5nZXRJbml0U2NyaXB0KCk7XG5cbiAgICAgICAgICAgIHJlc3BvbmRXaXRoSlNPTihyZXMsIHNjcmlwdCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIHN0YXRpYyBfb25Jbml0U2NyaXB0UmVzcG9uc2UgKHJlcTogSW5jb21pbmdNZXNzYWdlLCByZXM6IFNlcnZlclJlc3BvbnNlLCBjb25uZWN0aW9uOiBCcm93c2VyQ29ubmVjdGlvbik6IHZvaWQge1xuICAgICAgICBpZiAoQnJvd3NlckNvbm5lY3Rpb25HYXRld2F5Ll9lbnN1cmVDb25uZWN0aW9uUmVhZHkocmVzLCBjb25uZWN0aW9uKSkge1xuICAgICAgICAgICAgQnJvd3NlckNvbm5lY3Rpb25HYXRld2F5Ll9mZXRjaFJlcXVlc3REYXRhKHJlcSwgZGF0YSA9PiB7XG4gICAgICAgICAgICAgICAgY29ubmVjdGlvbi5oYW5kbGVJbml0U2NyaXB0UmVzdWx0KGRhdGEpO1xuXG4gICAgICAgICAgICAgICAgcmVzLmVuZCgpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIHN0YXRpYyBfb25HZXRBY3RpdmVXaW5kb3dJZFJlcXVlc3QgKHJlcTogSW5jb21pbmdNZXNzYWdlLCByZXM6IFNlcnZlclJlc3BvbnNlLCBjb25uZWN0aW9uOiBCcm93c2VyQ29ubmVjdGlvbik6IHZvaWQge1xuICAgICAgICBpZiAoQnJvd3NlckNvbm5lY3Rpb25HYXRld2F5Ll9lbnN1cmVDb25uZWN0aW9uUmVhZHkocmVzLCBjb25uZWN0aW9uKSkge1xuICAgICAgICAgICAgcmVzcG9uZFdpdGhKU09OKHJlcywge1xuICAgICAgICAgICAgICAgIGFjdGl2ZVdpbmRvd0lkOiBjb25uZWN0aW9uLmFjdGl2ZVdpbmRvd0lkLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIHN0YXRpYyBfb25TZXRBY3RpdmVXaW5kb3dJZFJlcXVlc3QgKHJlcTogSW5jb21pbmdNZXNzYWdlLCByZXM6IFNlcnZlclJlc3BvbnNlLCBjb25uZWN0aW9uOiBCcm93c2VyQ29ubmVjdGlvbik6IHZvaWQge1xuICAgICAgICBpZiAoQnJvd3NlckNvbm5lY3Rpb25HYXRld2F5Ll9lbnN1cmVDb25uZWN0aW9uUmVhZHkocmVzLCBjb25uZWN0aW9uKSkge1xuICAgICAgICAgICAgQnJvd3NlckNvbm5lY3Rpb25HYXRld2F5Ll9mZXRjaFJlcXVlc3REYXRhKHJlcSwgZGF0YSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgcGFyc2VkRGF0YSA9IEpTT04ucGFyc2UoZGF0YSk7XG5cbiAgICAgICAgICAgICAgICBjb25uZWN0aW9uLmFjdGl2ZVdpbmRvd0lkID0gcGFyc2VkRGF0YS53aW5kb3dJZDtcblxuICAgICAgICAgICAgICAgIHJlc3BvbmRXaXRoSlNPTihyZXMpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIHN0YXRpYyBfb25DbG9zZVdpbmRvd1JlcXVlc3QgKHJlcTogSW5jb21pbmdNZXNzYWdlLCByZXM6IFNlcnZlclJlc3BvbnNlLCBjb25uZWN0aW9uOiBCcm93c2VyQ29ubmVjdGlvbik6IHZvaWQge1xuICAgICAgICBpZiAoQnJvd3NlckNvbm5lY3Rpb25HYXRld2F5Ll9lbnN1cmVDb25uZWN0aW9uUmVhZHkocmVzLCBjb25uZWN0aW9uKSkge1xuICAgICAgICAgICAgY29ubmVjdGlvbi5wcm92aWRlci5jbG9zZUJyb3dzZXJDaGlsZFdpbmRvdyhjb25uZWN0aW9uLmlkKVxuICAgICAgICAgICAgICAgIC50aGVuKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmVzcG9uZFdpdGhKU09OKHJlcyk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIF9jb25uZWN0TmV4dFJlbW90ZUJyb3dzZXIgKHJlcTogSW5jb21pbmdNZXNzYWdlLCByZXM6IFNlcnZlclJlc3BvbnNlKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIHByZXZlbnRDYWNoaW5nKHJlcyk7XG5cbiAgICAgICAgY29uc3QgcmVtb3RlQ29ubmVjdGlvbiA9IGF3YWl0IHRoaXMuX3JlbW90ZXNRdWV1ZS5zaGlmdCgpO1xuXG4gICAgICAgIGlmIChyZW1vdGVDb25uZWN0aW9uKVxuICAgICAgICAgICAgcmVkaXJlY3QocmVzLCByZW1vdGVDb25uZWN0aW9uLnVybCk7XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIHJlc3BvbmQ1MDAocmVzLCAnVGhlcmUgYXJlIG5vIGF2YWlsYWJsZSBfY29ubmVjdGlvbnMgdG8gZXN0YWJsaXNoLicpO1xuICAgIH1cblxuICAgIC8vIEFQSVxuICAgIHB1YmxpYyBzdGFydFNlcnZpbmdDb25uZWN0aW9uIChjb25uZWN0aW9uOiBCcm93c2VyQ29ubmVjdGlvbik6IHZvaWQge1xuICAgICAgICB0aGlzLl9jb25uZWN0aW9uc1tjb25uZWN0aW9uLmlkXSA9IGNvbm5lY3Rpb247XG5cbiAgICAgICAgaWYgKGNvbm5lY3Rpb24uYnJvd3NlckluZm8ucHJvdmlkZXJOYW1lID09PSAncmVtb3RlJylcbiAgICAgICAgICAgIHRoaXMuX3JlbW90ZXNRdWV1ZS5hZGQoY29ubmVjdGlvbik7XG4gICAgfVxuXG4gICAgcHVibGljIHN0b3BTZXJ2aW5nQ29ubmVjdGlvbiAoY29ubmVjdGlvbjogQnJvd3NlckNvbm5lY3Rpb24pOiB2b2lkIHtcbiAgICAgICAgZGVsZXRlIHRoaXMuX2Nvbm5lY3Rpb25zW2Nvbm5lY3Rpb24uaWRdO1xuXG4gICAgICAgIGlmIChjb25uZWN0aW9uLmJyb3dzZXJJbmZvLnByb3ZpZGVyTmFtZSA9PT0gJ3JlbW90ZScpXG4gICAgICAgICAgICB0aGlzLl9yZW1vdGVzUXVldWUucmVtb3ZlKGNvbm5lY3Rpb24pO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBjbG9zZSAoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGZvciAoY29uc3QgaWQgaW4gdGhpcy5fY29ubmVjdGlvbnMpXG4gICAgICAgICAgICBhd2FpdCB0aGlzLl9jb25uZWN0aW9uc1tpZF0uY2xvc2UoKTtcbiAgICB9XG59XG5cbiJdfQ==
169
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2F0ZXdheS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9icm93c2VyL2Nvbm5lY3Rpb24vZ2F0ZXdheS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLG9FQUEyQztBQUMzQywyQ0FNMEI7QUFFMUIsb0VBQTJDO0FBSzNDLHNFQUE4QztBQUc5QyxNQUFxQix3QkFBd0I7SUFPekMsWUFBb0IsS0FBWSxFQUFFLE9BQW9DO1FBTjlELGlCQUFZLEdBQWtDLEVBQUUsQ0FBQztRQU9yRCxJQUFJLENBQUMsYUFBYSxHQUFLLElBQUksdUJBQVksRUFBRSxDQUFDO1FBQzFDLElBQUksQ0FBQyxVQUFVLEdBQVEsS0FBSyxDQUFDLHlCQUF5QixDQUFDLGtCQUFrQixDQUFDLENBQUM7UUFDM0UsSUFBSSxDQUFDLGNBQWMsR0FBSSxPQUFPLENBQUMsY0FBYyxDQUFDO1FBQzlDLElBQUksQ0FBQyxLQUFLLEdBQWEsS0FBSyxDQUFDO1FBRTdCLElBQUksQ0FBQyxlQUFlLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDaEMsQ0FBQztJQUVPLFNBQVMsQ0FBRSxHQUFXLEVBQUUsS0FBWSxFQUFFLE9BQWlCLEVBQUUsTUFBTSxHQUFHLEtBQUs7UUFDM0UseUVBQXlFO1FBQ3pFLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxHQUFvQixFQUFFLEdBQW1CLEVBQUUsVUFBVSxFQUFFLE1BQTBCLEVBQUUsRUFBRTtZQUNyRyxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUVoRCxxQkFBYyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBRXBCLElBQUksVUFBVTtnQkFDVixPQUFPLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxVQUFVLENBQUMsQ0FBQzs7Z0JBRTlCLGlCQUFVLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDeEIsQ0FBQyxDQUFDLENBQUM7SUFDUCxD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QztRQUU5QyxJQUFJLFVBQVUsQ0FBQyxXQUFXLENBQUMsWUFBWSxLQUFLLFFBQVE7WUFDaEQsSUFBSSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDM0MsQ0FBQztJQUVNLHFCQUFxQixDQUFFLFVBQTZCO1FBQ3ZELE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDLENBQUM7UUFFeEMsSUFBSSxVQUFVLENBQUMsV0FBVyxDQUFDLFlBQVksS0FBSyxRQUFRO1lBQ2hELElBQUksQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQzlDLENBQUM7SUFFTSxLQUFLLENBQUMsS0FBSztRQUNkLEtBQUssTUFBTSxFQUFFLElBQUksSUFBSSxDQUFDLFlBQVk7WUFDOUIsTUFBTSxJQUFJLENBQUMsWUFBWSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDO0lBQzVDLENBQUM7Q0FDSjtBQWpORCwyQ0FpTkMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgbG9hZEFzc2V0cyBmcm9tICcuLi8uLi9sb2FkLWFzc2V0cyc7XG5pbXBvcnQge1xuICAgIHJlc3BvbmQ0MDQsXG4gICAgcmVzcG9uZDUwMCxcbiAgICByZXNwb25kV2l0aEpTT04sXG4gICAgcmVkaXJlY3QsXG4gICAgcHJldmVudENhY2hpbmcsXG59IGZyb20gJy4uLy4uL3V0aWxzL2h0dHAnO1xuXG5pbXBvcnQgUmVtb3Rlc1F1ZXVlIGZyb20gJy4vcmVtb3Rlcy1xdWV1ZSc7XG5pbXBvcnQgeyBQcm94eSB9IGZyb20gJ3Rlc3RjYWZlLWhhbW1lcmhlYWQnO1xuaW1wb3J0IHsgRGljdGlvbmFyeSB9IGZyb20gJy4uLy4uL2NvbmZpZ3VyYXRpb24vaW50ZXJmYWNlcyc7XG5pbXBvcnQgQnJvd3NlckNvbm5lY3Rpb24gZnJvbSAnLi9pbmRleCc7XG5pbXBvcnQgeyBJbmNvbWluZ01lc3NhZ2UsIFNlcnZlclJlc3BvbnNlIH0gZnJvbSAnaHR0cCc7XG5pbXBvcnQgU0VSVklDRV9ST1VURVMgZnJvbSAnLi9zZXJ2aWNlLXJvdXRlcyc7XG5cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQnJvd3NlckNvbm5lY3Rpb25HYXRld2F5IHtcbiAgICBwcml2YXRlIF9jb25uZWN0aW9uczogRGljdGlvbmFyeTxCcm93c2VyQ29ubmVjdGlvbj4gPSB7fTtcbiAgICBwcml2YXRlIF9yZW1vdGVzUXVldWU6IFJlbW90ZXNRdWV1ZTtcbiAgICBwdWJsaWMgcmVhZG9ubHkgY29ubmVjdFVybDogc3RyaW5nO1xuICAgIHB1YmxpYyByZXRyeVRlc3RQYWdlczogYm9vbGVhbjtcbiAgICBwdWJsaWMgcmVhZG9ubHkgcHJveHk6IFByb3h5O1xuXG4gICAgcHVibGljIGNvbnN0cnVjdG9yIChwcm94eTogUHJveHksIG9wdGlvbnM6IHsgcmV0cnlUZXN0UGFnZXM6IGJvb2xlYW4gfSkge1xuICAgICAgICB0aGlzLl9yZW1vdGVzUXVldWUgICA9IG5ldyBSZW1vdGVzUXVldWUoKTtcbiAgICAgICAgdGhpcy5jb25uZWN0VXJsICAgICAgPSBwcm94eS5yZXNvbHZlUmVsYXRpdmVTZXJ2aWNlVXJsKCcvYnJvd3Nlci9jb25uZWN0Jyk7XG4gICAgICAgIHRoaXMucmV0cnlUZXN0UGFnZXMgID0gb3B0aW9ucy5yZXRyeVRlc3RQYWdlcztcbiAgICAgICAgdGhpcy5wcm94eSAgICAgICAgICAgPSBwcm94eTtcblxuICAgICAgICB0aGlzLl9yZWdpc3RlclJvdXRlcyhwcm94eSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfZGlzcGF0Y2ggKHVybDogc3RyaW5nLCBwcm94eTogUHJveHksIGhhbmRsZXI6IEZ1bmN0aW9uLCBtZXRob2QgPSAnR0VUJyk6IHZvaWQge1xuICAgICAgICAvLyBAdHMtaWdub3JlIE5lZWQgdG8gaW1wcm92ZSB0eXBpbmdzIG9mIHRoZSAndGVzdGNhZmUtaGFtbWVyaGVhZCcgbW9kdWxlXG4gICAgICAgIHByb3h5W21ldGhvZF0odXJsLCAocmVxOiBJbmNvbWluZ01lc3NhZ2UsIHJlczogU2VydmVyUmVzcG9uc2UsIHNlcnZlckluZm8sIHBhcmFtczogRGljdGlvbmFyeTxzdHJpbmc+KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBjb25uZWN0aW9uID0gdGhpcy5fY29ubmVjdGlvbnNbcGFyYW1zLmlkXTtcblxuICAgICAgICAgICAgcHJldmVudENhY2hpbmcocmVzKTtcblxuICAgICAgICAgICAgaWYgKGNvbm5lY3Rpb24pXG4gICAgICAgICAgICAgICAgaGFuZGxlcihyZXEsIHJlcywgY29ubmVjdGlvbik7XG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgcmVzcG9uZDQwNChyZXMpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9yZWdpc3RlclJvdXRlcyAocHJveHk6IFByb3h5KTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHtcbiAgICAgICAgICAgIGlkbGVQYWdlU2NyaXB0LFxuICAgICAgICAgICAgaWRsZVBhZ2VTdHlsZSxcbiAgICAgICAgICAgIGlkbGVQYWdlTG9nbyxcbiAgICAgICAgICAgIHNlcnZpY2VXb3JrZXJTY3JpcHQsXG4gICAgICAgIH0gPSBsb2FkQXNzZXRzKCk7XG5cbiAgICAgICAgdGhpcy5fZGlzcGF0Y2goJy9icm93c2VyL2Nvbm5lY3Qve2lkfScsIHByb3h5LCBCcm93c2VyQ29ubmVjdGlvbkdhdGV3YXkuX29uQ29ubmVjdGlvbik7XG4gICAgICAgIHRoaXMuX2Rpc3BhdGNoKCcvYnJvd3Nlci9oZWFydGJlYXQve2lkfScsIHByb3h5LCBCcm93c2VyQ29ubmVjdGlvbkdhdGV3YXkuX29uSGVhcnRiZWF0KTtcbiAgICAgICAgdGhpcy5fZGlzcGF0Y2goJy9icm93c2VyL2lkbGUve2lkfScsIHByb3h5LCBCcm93c2VyQ29ubmVjdGlvbkdhdGV3YXkuX29uSWRsZSk7XG4gICAgICAgIHRoaXMuX2Rpc3BhdGNoKCcvYnJvd3Nlci9pZGxlLWZvcmNlZC97aWR9JywgcHJveHksIEJyb3dzZXJDb25uZWN0aW9uR2F0ZXdheS5fb25JZGxlRm9yY2VkKTtcbiAgICAgICAgdGhpcy5fZGlzcGF0Y2goJy9icm93c2VyL3N0YXR1cy97aWR9JywgcHJveHksIEJyb3dzZXJDb25uZWN0aW9uR2F0ZXdheS5fb25TdGF0dXNSZXF1ZXN0KTtcbiAgICAgICAgdGhpcy5fZGlzcGF0Y2goJy9icm93c2VyL3N0YXR1cy1kb25lL3tpZH0nLCBwcm94eSwgQnJvd3NlckNvbm5lY3Rpb25HYXRld2F5Ll9vblN0YXR1c1JlcXVlc3RPblRlc3REb25lKTtcbiAgICAgICAgdGhpcy5fZGlzcGF0Y2goJy9icm93c2VyL2luaXQtc2NyaXB0L3tpZH0nLCBwcm94eSwgQnJvd3NlckNvbm5lY3Rpb25HYXRld2F5Ll9vbkluaXRTY3JpcHRSZXF1ZXN0KTtcbiAgICAgICAgdGhpcy5fZGlzcGF0Y2goJy9icm93c2VyL2luaXQtc2NyaXB0L3tpZH0nLCBwcm94eSwgQnJvd3NlckNvbm5lY3Rpb25HYXRld2F5Ll9vbkluaXRTY3JpcHRSZXNwb25zZSwgJ1BPU1QnKTtcbiAgICAgICAgdGhpcy5fZGlzcGF0Y2goJy9icm93c2VyL2FjdGl2ZS13aW5kb3ctaWQve2lkfScsIHByb3h5LCBCcm93c2VyQ29ubmVjdGlvbkdhdGV3YXkuX29uR2V0QWN0aXZlV2luZG93SWRSZXF1ZXN0KTtcbiAgICAgICAgdGhpcy5fZGlzcGF0Y2goJy9icm93c2VyL2FjdGl2ZS13aW5kb3ctaWQve2lkfScsIHByb3h5LCBCcm93c2VyQ29ubmVjdGlvbkdhdGV3YXkuX29uU2V0QWN0aXZlV2luZG93SWRSZXF1ZXN0LCAnUE9TVCcpO1xuICAgICAgICB0aGlzLl9kaXNwYXRjaCgnL2Jyb3dzZXIvY2xvc2Utd2luZG93L3tpZH0nLCBwcm94eSwgQnJvd3NlckNvbm5lY3Rpb25HYXRld2F5Ll9vbkNsb3NlV2luZG93UmVxdWVzdCwgJ1BPU1QnKTtcblxuXG4gICAgICAgIHByb3h5LkdFVChTRVJWSUNFX1JPVVRFUy5jb25uZWN0LCAocmVxOiBJbmNvbWluZ01lc3NhZ2UsIHJlczogU2VydmVyUmVzcG9uc2UpID0+IHRoaXMuX2Nvbm5lY3ROZXh0UmVtb3RlQnJvd3NlcihyZXEsIHJlcykpO1xuICAgICAgICBwcm94eS5HRVQoU0VSVklDRV9ST1VURVMuY29ubmVjdFdpdGhUcmFpbGluZ1NsYXNoLCAocmVxOiBJbmNvbWluZ01lc3NhZ2UsIHJlczogU2VydmVyUmVzcG9uc2UpID0+IHRoaXMuX2Nvbm5lY3ROZXh0UmVtb3RlQnJvd3NlcihyZXEsIHJlcykpO1xuXG4gICAgICAgIHByb3h5LkdFVChTRVJWSUNFX1JPVVRFUy5zZXJ2aWNlV29ya2VyLCB7IGNvbnRlbnQ6IHNlcnZpY2VXb3JrZXJTY3JpcHQsIGNvbnRlbnRUeXBlOiAnYXBwbGljYXRpb24veC1qYXZhc2NyaXB0JyB9KTtcbiAgICAgICAgcHJveHkuR0VUKFNFUlZJQ0VfUk9VVEVTLmFzc2V0cy5pbmRleCwgeyBjb250ZW50OiBpZGxlUGFnZVNjcmlwdCwgY29udGVudFR5cGU6ICdhcHBsaWNhdGlvbi94LWphdmFzY3JpcHQnIH0pO1xuICAgICAgICBwcm94eS5HRVQoU0VSVklDRV9ST1VURVMuYXNzZXRzLnN0eWxlcywgeyBjb250ZW50OiBpZGxlUGFnZVN0eWxlLCBjb250ZW50VHlwZTogJ3RleHQvY3NzJyB9KTtcbiAgICAgICAgcHJveHkuR0VUKFNFUlZJQ0VfUk9VVEVTLmFzc2V0cy5sb2dvLCB7IGNvbnRlbnQ6IGlkbGVQYWdlTG9nbywgY29udGVudFR5cGU6ICdpbWFnZS9zdmcreG1sJyB9KTtcbiAgICB9XG5cbiAgICAvLyBIZWxwZXJzXG4gICAgcHJpdmF0ZSBzdGF0aWMgX2Vuc3VyZUNvbm5lY3Rpb25SZWFkeSAocmVzOiBTZXJ2ZXJSZXNwb25zZSwgY29ubmVjdGlvbjogQnJvd3NlckNvbm5lY3Rpb24pOiBib29sZWFuIHtcbiAgICAgICAgaWYgKCFjb25uZWN0aW9uLmlzUmVhZHkoKSkge1xuICAgICAgICAgICAgcmVzcG9uZDUwMChyZXMsICdUaGUgY29ubmVjdGlvbiBpcyBub3QgcmVhZHkgeWV0LicpO1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzdGF0aWMgX2ZldGNoUmVxdWVzdERhdGEgKHJlcTogSW5jb21pbmdNZXNzYWdlLCBjYWxsYmFjazogKGRhdGE6IHN0cmluZykgPT4gdm9pZCk6IHZvaWQge1xuICAgICAgICBsZXQgZGF0YSA9ICcnO1xuXG4gICAgICAgIHJlcS5vbignZGF0YScsIGNodW5rID0+IHtcbiAgICAgICAgICAgIGRhdGEgKz0gY2h1bms7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJlcS5vbignZW5kJywgKCkgPT4ge1xuICAgICAgICAgICAgY2FsbGJhY2soZGF0YS50b1N0cmluZygpKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gUm91dGUgaGFuZGxlcnNcbiAgICBwcml2YXRlIHN0YXRpYyBhc3luYyBfb25Db25uZWN0aW9uIChyZXE6IEluY29taW5nTWVzc2FnZSwgcmVzOiBTZXJ2ZXJSZXNwb25zZSwgY29ubmVjdGlvbjogQnJvd3NlckNvbm5lY3Rpb24pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgaWYgKGNvbm5lY3Rpb24uaXNSZWFkeSgpKVxuICAgICAgICAgICAgcmVzcG9uZDUwMChyZXMsICdUaGUgY29ubmVjdGlvbiBpcyBhbHJlYWR5IGVzdGFibGlzaGVkLicpO1xuXG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgdXNlckFnZW50ID0gcmVxLmhlYWRlcnNbJ3VzZXItYWdlbnQnXSBhcyBzdHJpbmc7XG5cbiAgICAgICAgICAgIGF3YWl0IGNvbm5lY3Rpb24uZXN0YWJsaXNoKHVzZXJBZ2VudCk7XG4gICAgICAgICAgICByZWRpcmVjdChyZXMsIGNvbm5lY3Rpb24uaWRsZVVybCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIHN0YXRpYyBfb25IZWFydGJlYXQgKHJlcTogSW5jb21pbmdNZXNzYWdlLCByZXM6IFNlcnZlclJlc3BvbnNlLCBjb25uZWN0aW9uOiBCcm93c2VyQ29ubmVjdGlvbik6IHZvaWQge1xuICAgICAgICBpZiAoQnJvd3NlckNvbm5lY3Rpb25HYXRld2F5Ll9lbnN1cmVDb25uZWN0aW9uUmVhZHkocmVzLCBjb25uZWN0aW9uKSkge1xuICAgICAgICAgICAgY29uc3Qgc3RhdHVzID0gY29ubmVjdGlvbi5oZWFydGJlYXQoKTtcblxuICAgICAgICAgICAgcmVzcG9uZFdpdGhKU09OKHJlcywgc3RhdHVzKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgc3RhdGljIF9vbklkbGUgKHJlcTogSW5jb21pbmdNZXNzYWdlLCByZXM6IFNlcnZlclJlc3BvbnNlLCBjb25uZWN0aW9uOiBCcm93c2VyQ29ubmVjdGlvbik6IHZvaWQge1xuICAgICAgICBpZiAoQnJvd3NlckNvbm5lY3Rpb25HYXRld2F5Ll9lbnN1cmVDb25uZWN0aW9uUmVhZHkocmVzLCBjb25uZWN0aW9uKSlcbiAgICAgICAgICAgIHJlcy5lbmQoY29ubmVjdGlvbi5yZW5kZXJJZGxlUGFnZSgpKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHN0YXRpYyBhc3luYyBfb25JZGxlRm9yY2VkIChyZXE6IEluY29taW5nTWVzc2FnZSwgcmVzOiBTZXJ2ZXJSZXNwb25zZSwgY29ubmVjdGlvbjogQnJvd3NlckNvbm5lY3Rpb24pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgaWYgKEJyb3dzZXJDb25uZWN0aW9uR2F0ZXdheS5fZW5zdXJlQ29ubmVjdGlvblJlYWR5KHJlcywgY29ubmVjdGlvbikpIHtcbiAgICAgICAgICAgIGNvbnN0IHN0YXR1cyA9IGF3YWl0IGNvbm5lY3Rpb24uZ2V0U3RhdHVzKHRydWUpO1xuXG4gICAgICAgICAgICByZWRpcmVjdChyZXMsIHN0YXR1cy51cmwpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzdGF0aWMgYXN5bmMgX29uU3RhdHVzUmVxdWVzdCAocmVxOiBJbmNvbWluZ01lc3NhZ2UsIHJlczogU2VydmVyUmVzcG9uc2UsIGNvbm5lY3Rpb246IEJyb3dzZXJDb25uZWN0aW9uKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIHJldHVybiBCcm93c2VyQ29ubmVjdGlvbkdhdGV3YXkuX29uU3RhdHVzUmVxdWVzdENvcmUocmVxLCByZXMsIGNvbm5lY3Rpb24sIGZhbHNlKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHN0YXRpYyBhc3luYyBfb25TdGF0dXNSZXF1ZXN0T25UZXN0RG9uZSAocmVxOiBJbmNvbWluZ01lc3NhZ2UsIHJlczogU2VydmVyUmVzcG9uc2UsIGNvbm5lY3Rpb246IEJyb3dzZXJDb25uZWN0aW9uKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIHJldHVybiBCcm93c2VyQ29ubmVjdGlvbkdhdGV3YXkuX29uU3RhdHVzUmVxdWVzdENvcmUocmVxLCByZXMsIGNvbm5lY3Rpb24sIHRydWUpO1xuICAgIH1cblxuICAgIHByaXZhdGUgc3RhdGljIGFzeW5jIF9vblN0YXR1c1JlcXVlc3RDb3JlIChyZXE6IEluY29taW5nTWVzc2FnZSwgcmVzOiBTZXJ2ZXJSZXNwb25zZSwgY29ubmVjdGlvbjogQnJvd3NlckNvbm5lY3Rpb24sIGlzVGVzdERvbmU6IGJvb2xlYW4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgaWYgKEJyb3dzZXJDb25uZWN0aW9uR2F0ZXdheS5fZW5zdXJlQ29ubmVjdGlvblJlYWR5KHJlcywgY29ubmVjdGlvbikpIHtcbiAgICAgICAgICAgIGNvbnN0IHN0YXR1cyA9IGF3YWl0IGNvbm5lY3Rpb24uZ2V0U3RhdHVzKGlzVGVzdERvbmUpO1xuXG4gICAgICAgICAgICByZXNwb25kV2l0aEpTT04ocmVzLCBzdGF0dXMpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzdGF0aWMgX29uSW5pdFNjcmlwdFJlcXVlc3QgKHJlcTogSW5jb21pbmdNZXNzYWdlLCByZXM6IFNlcnZlclJlc3BvbnNlLCBjb25uZWN0aW9uOiBCcm93c2VyQ29ubmVjdGlvbik6IHZvaWQge1xuICAgICAgICBpZiAoQnJvd3NlckNvbm5lY3Rpb25HYXRld2F5Ll9lbnN1cmVDb25uZWN0aW9uUmVhZHkocmVzLCBjb25uZWN0aW9uKSkge1xuICAgICAgICAgICAgY29uc3Qgc2NyaXB0ID0gY29ubmVjdGlvbi5nZXRJbml0U2NyaXB0KCk7XG5cbiAgICAgICAgICAgIHJlc3BvbmRXaXRoSlNPTihyZXMsIHNjcmlwdCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIHN0YXRpYyBfb25Jbml0U2NyaXB0UmVzcG9uc2UgKHJlcTogSW5jb21pbmdNZXNzYWdlLCByZXM6IFNlcnZlclJlc3BvbnNlLCBjb25uZWN0aW9uOiBCcm93c2VyQ29ubmVjdGlvbik6IHZvaWQge1xuICAgICAgICBpZiAoQnJvd3NlckNvbm5lY3Rpb25HYXRld2F5Ll9lbnN1cmVDb25uZWN0aW9uUmVhZHkocmVzLCBjb25uZWN0aW9uKSkge1xuICAgICAgICAgICAgQnJvd3NlckNvbm5lY3Rpb25HYXRld2F5Ll9mZXRjaFJlcXVlc3REYXRhKHJlcSwgZGF0YSA9PiB7XG4gICAgICAgICAgICAgICAgY29ubmVjdGlvbi5oYW5kbGVJbml0U2NyaXB0UmVzdWx0KGRhdGEpO1xuXG4gICAgICAgICAgICAgICAgcmVzLmVuZCgpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIHN0YXRpYyBfb25HZXRBY3RpdmVXaW5kb3dJZFJlcXVlc3QgKHJlcTogSW5jb21pbmdNZXNzYWdlLCByZXM6IFNlcnZlclJlc3BvbnNlLCBjb25uZWN0aW9uOiBCcm93c2VyQ29ubmVjdGlvbik6IHZvaWQge1xuICAgICAgICBpZiAoQnJvd3NlckNvbm5lY3Rpb25HYXRld2F5Ll9lbnN1cmVDb25uZWN0aW9uUmVhZHkocmVzLCBjb25uZWN0aW9uKSkge1xuICAgICAgICAgICAgcmVzcG9uZFdpdGhKU09OKHJlcywge1xuICAgICAgICAgICAgICAgIGFjdGl2ZVdpbmRvd0lkOiBjb25uZWN0aW9uLmFjdGl2ZVdpbmRvd0lkLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIHN0YXRpYyBfb25TZXRBY3RpdmVXaW5kb3dJZFJlcXVlc3QgKHJlcTogSW5jb21pbmdNZXNzYWdlLCByZXM6IFNlcnZlclJlc3BvbnNlLCBjb25uZWN0aW9uOiBCcm93c2VyQ29ubmVjdGlvbik6IHZvaWQge1xuICAgICAgICBpZiAoQnJvd3NlckNvbm5lY3Rpb25HYXRld2F5Ll9lbnN1cmVDb25uZWN0aW9uUmVhZHkocmVzLCBjb25uZWN0aW9uKSkge1xuICAgICAgICAgICAgQnJvd3NlckNvbm5lY3Rpb25HYXRld2F5Ll9mZXRjaFJlcXVlc3REYXRhKHJlcSwgZGF0YSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgcGFyc2VkRGF0YSA9IEpTT04ucGFyc2UoZGF0YSk7XG5cbiAgICAgICAgICAgICAgICBjb25uZWN0aW9uLmFjdGl2ZVdpbmRvd0lkID0gcGFyc2VkRGF0YS53aW5kb3dJZDtcblxuICAgICAgICAgICAgICAgIHJlc3BvbmRXaXRoSlNPTihyZXMpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIHN0YXRpYyBfb25DbG9zZVdpbmRvd1JlcXVlc3QgKHJlcTogSW5jb21pbmdNZXNzYWdlLCByZXM6IFNlcnZlclJlc3BvbnNlLCBjb25uZWN0aW9uOiBCcm93c2VyQ29ubmVjdGlvbik6IHZvaWQge1xuICAgICAgICBpZiAoQnJvd3NlckNvbm5lY3Rpb25HYXRld2F5Ll9lbnN1cmVDb25uZWN0aW9uUmVhZHkocmVzLCBjb25uZWN0aW9uKSkge1xuICAgICAgICAgICAgY29ubmVjdGlvbi5wcm92aWRlci5jbG9zZUJyb3dzZXJDaGlsZFdpbmRvdyhjb25uZWN0aW9uLmlkKVxuICAgICAgICAgICAgICAgIC50aGVuKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmVzcG9uZFdpdGhKU09OKHJlcyk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIF9jb25uZWN0TmV4dFJlbW90ZUJyb3dzZXIgKHJlcTogSW5jb21pbmdNZXNzYWdlLCByZXM6IFNlcnZlclJlc3BvbnNlKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIHByZXZlbnRDYWNoaW5nKHJlcyk7XG5cbiAgICAgICAgY29uc3QgcmVtb3RlQ29ubmVjdGlvbiA9IGF3YWl0IHRoaXMuX3JlbW90ZXNRdWV1ZS5zaGlmdCgpO1xuXG4gICAgICAgIGlmIChyZW1vdGVDb25uZWN0aW9uKVxuICAgICAgICAgICAgcmVkaXJlY3QocmVzLCByZW1vdGVDb25uZWN0aW9uLnVybCk7XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIHJlc3BvbmQ1MDAocmVzLCAnVGhlcmUgYXJlIG5vIGF2YWlsYWJsZSBfY29ubmVjdGlvbnMgdG8gZXN0YWJsaXNoLicpO1xuICAgIH1cblxuICAgIC8vIEFQSVxuICAgIHB1YmxpYyBzdGFydFNlcnZpbmdDb25uZWN0aW9uIChjb25uZWN0aW9uOiBCcm93c2VyQ29ubmVjdGlvbik6IHZvaWQge1xuICAgICAgICB0aGlzLl9jb25uZWN0aW9uc1tjb25uZWN0aW9uLmlkXSA9IGNvbm5lY3Rpb247XG5cbiAgICAgICAgaWYgKGNvbm5lY3Rpb24uYnJvd3NlckluZm8ucHJvdmlkZXJOYW1lID09PSAncmVtb3RlJylcbiAgICAgICAgICAgIHRoaXMuX3JlbW90ZXNRdWV1ZS5hZGQoY29ubmVjdGlvbik7XG4gICAgfVxuXG4gICAgcHVibGljIHN0b3BTZXJ2aW5nQ29ubmVjdGlvbiAoY29ubmVjdGlvbjogQnJvd3NlckNvbm5lY3Rpb24pOiB2b2lkIHtcbiAgICAgICAgZGVsZXRlIHRoaXMuX2Nvbm5lY3Rpb25zW2Nvbm5lY3Rpb24uaWRdO1xuXG4gICAgICAgIGlmIChjb25uZWN0aW9uLmJyb3dzZXJJbmZvLnByb3ZpZGVyTmFtZSA9PT0gJ3JlbW90ZScpXG4gICAgICAgICAgICB0aGlzLl9yZW1vdGVzUXVldWUucmVtb3ZlKGNvbm5lY3Rpb24pO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBjbG9zZSAoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGZvciAoY29uc3QgaWQgaW4gdGhpcy5fY29ubmVjdGlvbnMpXG4gICAgICAgICAgICBhd2FpdCB0aGlzLl9jb25uZWN0aW9uc1tpZF0uY2xvc2UoKTtcbiAgICB9XG59XG5cbiJdfQ==
@@ -19,12 +19,24 @@ const runtime_1 = require("../../errors/runtime");
19
19
  const types_1 = require("../../errors/types");
20
20
  const warning_log_1 = __importDefault(require("../../notifications/warning-log"));
21
21
  const browser_connection_timeouts_1 = require("../../utils/browser-connection-timeouts");
22
+ const browser_connection_tracker_1 = __importDefault(require("./browser-connection-tracker"));
22
23
  const getBrowserConnectionDebugScope = (id) => `testcafe:browser:connection:${id}`;
23
24
  const IDLE_PAGE_TEMPLATE = read_file_relative_1.readSync('../../client/browser/idle-page/index.html.mustache');
24
- const connections = {};
25
25
  class BrowserConnection extends events_1.EventEmitter {
26
26
  constructor(gateway, browserInfo, permanent, disableMultipleWindows = false, proxyless = false, messageBus) {
27
27
  super();
28
+ this.url = '';
29
+ this.idleUrl = '';
30
+ this.forcedIdleUrl = '';
31
+ this.initScriptUrl = '';
32
+ this.heartbeatUrl = '';
33
+ this.statusUrl = '';
34
+ this.activeWindowIdUrl = '';
35
+ this.closeWindowUrl = '';
36
+ this.statusDoneUrl = '';
37
+ this.heartbeatRelativeUrl = '';
38
+ this.statusRelativeUrl = '';
39
+ this.statusDoneRelativeUrl = '';
28
40
  this.osInfo = null;
29
41
  this.HEARTBEAT_TIMEOUT = browser_connection_timeouts_1.HEARTBEAT_TIMEOUT;
30
42
  this.BROWSER_CLOSE_TIMEOUT = browser_connection_timeouts_1.BROWSER_CLOSE_TIMEOUT;
@@ -48,25 +60,28 @@ class BrowserConnection extends events_1.EventEmitter {
48
60
  this.pendingTestRunUrl = null;
49
61
  this.disableMultipleWindows = disableMultipleWindows;
50
62
  this.proxyless = proxyless;
51
- this.url = `${gateway.domain}/browser/connect/${this.id}`;
52
- this.idleUrl = `${gateway.domain}/browser/idle/${this.id}`;
53
- this.forcedIdleUrl = `${gateway.domain}/browser/idle-forced/${this.id}`;
54
- this.initScriptUrl = `${gateway.domain}/browser/init-script/${this.id}`;
55
- this.heartbeatRelativeUrl = `/browser/heartbeat/${this.id}`;
56
- this.statusRelativeUrl = `/browser/status/${this.id}`;
57
- this.statusDoneRelativeUrl = `/browser/status-done/${this.id}`;
58
- this.activeWindowIdUrl = `/browser/active-window-id/${this.id}`;
59
- this.closeWindowUrl = `/browser/close-window/${this.id}`;
60
- this.heartbeatUrl = `${gateway.domain}${this.heartbeatRelativeUrl}`;
61
- this.statusUrl = `${gateway.domain}${this.statusRelativeUrl}`;
62
- this.statusDoneUrl = `${gateway.domain}${this.statusDoneRelativeUrl}`;
63
+ this._buildCommunicationUrls(gateway.proxy);
63
64
  this._setEventHandlers();
64
- connections[this.id] = this;
65
+ browser_connection_tracker_1.default.add(this);
65
66
  this.previousActiveWindowId = null;
66
67
  this.browserConnectionGateway.startServingConnection(this);
67
68
  // NOTE: Give a caller time to assign event listeners
68
69
  process.nextTick(() => this._runBrowser());
69
70
  }
71
+ _buildCommunicationUrls(proxy) {
72
+ this.url = proxy.resolveRelativeServiceUrl(`/browser/connect/${this.id}`);
73
+ this.idleUrl = proxy.resolveRelativeServiceUrl(`/browser/idle/${this.id}`);
74
+ this.forcedIdleUrl = proxy.resolveRelativeServiceUrl(`/browser/idle-forced/${this.id}`);
75
+ this.initScriptUrl = proxy.resolveRelativeServiceUrl(`/browser/init-script/${this.id}`);
76
+ this.heartbeatRelativeUrl = `/browser/heartbeat/${this.id}`;
77
+ this.statusRelativeUrl = `/browser/status/${this.id}`;
78
+ this.statusDoneRelativeUrl = `/browser/status-done/${this.id}`;
79
+ this.activeWindowIdUrl = `/browser/active-window-id/${this.id}`;
80
+ this.closeWindowUrl = `/browser/close-window/${this.id}`;
81
+ this.heartbeatUrl = proxy.resolveRelativeServiceUrl(this.heartbeatRelativeUrl);
82
+ this.statusUrl = proxy.resolveRelativeServiceUrl(this.statusRelativeUrl);
83
+ this.statusDoneUrl = proxy.resolveRelativeServiceUrl(this.statusDoneRelativeUrl);
84
+ }
70
85
  set messageBus(messageBus) {
71
86
  this._messageBus = messageBus;
72
87
  this.warningLog.callback = warning_log_1.default.createAddWarningCallback(this._messageBus);
@@ -138,8 +153,11 @@ class BrowserConnection extends events_1.EventEmitter {
138
153
  this.jobQueue.shift();
139
154
  return this.hasQueuedJobs ? await this.currentJob.popNextTestRunUrl(this) : null;
140
155
  }
156
+ getCurrentTestRun() {
157
+ return this.currentJob ? this.currentJob.currentTestRun : null;
158
+ }
141
159
  static getById(id) {
142
- return connections[id] || null;
160
+ return browser_connection_tracker_1.default.activeBrowserConnections[id] || null;
143
161
  }
144
162
  async _restartBrowser() {
145
163
  this.status = status_1.default.uninitialized;
@@ -269,7 +287,7 @@ class BrowserConnection extends events_1.EventEmitter {
269
287
  this.browserConnectionGateway.stopServingConnection(this);
270
288
  if (this.heartbeatTimeout)
271
289
  clearTimeout(this.heartbeatTimeout);
272
- delete connections[this.id];
290
+ browser_connection_tracker_1.default.remove(this);
273
291
  this.status = status_1.default.closed;
274
292
  this.emit(status_1.default.closed);
275
293
  }
@@ -346,4 +364,4 @@ class BrowserConnection extends events_1.EventEmitter {
346
364
  }
347
365
  exports.default = BrowserConnection;
348
366
  module.exports = exports.default;
349
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvYnJvd3Nlci9jb25uZWN0aW9uL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsa0RBQTBCO0FBQzFCLDRFQUEyQztBQUMzQyxtQ0FBc0M7QUFDdEMsd0RBQWdDO0FBQ2hDLG1DQUF3QztBQUN4QyxtRUFLc0M7QUFDdEMsMkRBQXNEO0FBQ3RELHNFQUE2QztBQUM3QyxtQ0FBZ0M7QUFDaEMsd0RBQWdDO0FBQ2hDLHNEQUErQztBQUMvQywwRUFBaUQ7QUFDakQsa0RBQWtFO0FBQ2xFLDhDQUFvRDtBQUlwRCxrRkFBeUQ7QUFJekQseUZBTWlEO0FBR2pELE1BQU0sOEJBQThCLEdBQUcsQ0FBQyxFQUFVLEVBQVUsRUFBRSxDQUFDLCtCQUErQixFQUFFLEVBQUUsQ0FBQztBQUVuRyxNQUFNLGtCQUFrQixHQUEyQiw2QkFBSSxDQUFDLG9EQUFvRCxDQUFDLENBQUM7QUFDOUcsTUFBTSxXQUFXLEdBQWtDLEVBQUUsQ0FBQztBQTJDdEQsTUFBcUIsaUJBQWtCLFNBQVEscUJBQVk7SUF3Q3ZELFlBQ0ksT0FBaUMsRUFDakMsV0FBd0IsRUFDeEIsU0FBa0IsRUFDbEIsc0JBQXNCLEdBQUcsS0FBSyxFQUM5QixTQUFTLEdBQUcsS0FBSyxFQUNqQixVQUF1QjtRQUN2QixLQUFLLEVBQUUsQ0FBQztRQWpCSixXQUFNLEdBQWtCLElBQUksQ0FBQztRQW1CakMsSUFBSSxDQUFDLGlCQUFpQixHQUFTLCtDQUFpQixDQUFDO1FBQ2pELElBQUksQ0FBQyxxQkFBcUIsR0FBSyxtREFBcUIsQ0FBQztRQUNyRCxJQUFJLENBQUMsdUJBQXVCLEdBQUcscURBQXVCLENBQUM7UUFFdkQsSUFBSSxDQUFDLEVBQUUsR0FBeUIsaUJBQWlCLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDaEUsSUFBSSxDQUFDLFFBQVEsR0FBbUIsRUFBRSxDQUFDO1FBQ25DLElBQUksQ0FBQyxnQkFB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JztcbmltcG9ydCB0aW1lTGltaXQgZnJvbSAndGltZS1saW1pdC1wcm9taXNlJztcbmltcG9ydCB7IEV2ZW50RW1pdHRlciB9IGZyb20gJ2V2ZW50cyc7XG5pbXBvcnQgTXVzdGFjaGUgZnJvbSAnbXVzdGFjaGUnO1xuaW1wb3J0IHsgcHVsbCBhcyByZW1vdmUgfSBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHtcbiAgICBjYWxjdWxhdGVQcmV0dHlVc2VyQWdlbnQsXG4gICAgZXh0cmFjdE1ldGFJbmZvLFxuICAgIFBhcnNlZFVzZXJBZ2VudCxcbiAgICBwYXJzZVVzZXJBZ2VudCxcbn0gZnJvbSAnLi4vLi4vdXRpbHMvcGFyc2UtdXNlci1hZ2VudCc7XG5pbXBvcnQgeyByZWFkU3luYyBhcyByZWFkIH0gZnJvbSAncmVhZC1maWxlLXJlbGF0aXZlJztcbmltcG9ydCBwcm9taXNpZnlFdmVudCBmcm9tICdwcm9taXNpZnktZXZlbnQnO1xuaW1wb3J0IHsgbmFub2lkIH0gZnJvbSAnbmFub2lkJztcbmltcG9ydCBDT01NQU5EIGZyb20gJy4vY29tbWFuZCc7XG5pbXBvcnQgQnJvd3NlckNvbm5lY3Rpb25TdGF0dXMgZnJvbSAnLi9zdGF0dXMnO1xuaW1wb3J0IEhlYXJ0YmVhdFN0YXR1cyBmcm9tICcuL2hlYXJ0YmVhdC1zdGF0dXMnO1xuaW1wb3J0IHsgR2VuZXJhbEVycm9yLCBUaW1lb3V0RXJyb3IgfSBmcm9tICcuLi8uLi9lcnJvcnMvcnVudGltZSc7XG5pbXBvcnQgeyBSVU5USU1FX0VSUk9SUyB9IGZyb20gJy4uLy4uL2Vycm9ycy90eXBlcyc7XG5pbXBvcnQgeyBEaWN0aW9uYXJ5IH0gZnJvbSAnLi4vLi4vY29uZmlndXJhdGlvbi9pbnRlcmZhY2VzJztcbmltcG9ydCBCcm93c2VyQ29ubmVjdGlvbkdhdGV3YXkgZnJvbSAnLi9nYXRld2F5JztcbmltcG9ydCBCcm93c2VySm9iIGZyb20gJy4uLy4uL3J1bm5lci9icm93c2VyLWpvYic7XG5pbXBvcnQgV2FybmluZ0xvZyBmcm9tICcuLi8uLi9ub3RpZmljYXRpb25zL3dhcm5pbmctbG9nJztcbmltcG9ydCBCcm93c2VyUHJvdmlkZXIgZnJvbSAnLi4vcHJvdmlkZXInO1xuaW1wb3J0IHsgT1NJbmZvIH0gZnJvbSAnZ2V0LW9zLWluZm8nO1xuXG5pbXBvcnQge1xuICAgIEJST1dTRVJfUkVTVEFSVF9USU1FT1VULFxuICAgIEJST1dTRVJfQ0xPU0VfVElNRU9VVCxcbiAgICBIRUFSVEJFQVRfVElNRU9VVCxcbiAgICBMT0NBTF9CUk9XU0VSX0lOSVRfVElNRU9VVCxcbiAgICBSRU1PVEVfQlJPV1NFUl9JTklUX1RJTUVPVVQsXG59IGZyb20gJy4uLy4uL3V0aWxzL2Jyb3dzZXItY29ubmVjdGlvbi10aW1lb3V0cyc7XG5pbXBvcnQgTWVzc2FnZUJ1cyBmcm9tICcuLi8uLi91dGlscy9tZXNzYWdlLWJ1cyc7XG5cbmNvbnN0IGdldEJyb3dzZXJDb25uZWN0aW9uRGVidWdTY29wZSA9IChpZDogc3RyaW5nKTogc3RyaW5nID0+IGB0ZXN0Y2FmZTpicm93c2VyOmNvbm5lY3Rpb246JHtpZH1gO1xuXG5jb25zdCBJRExFX1BBR0VfVEVNUExBVEUgICAgICAgICAgICAgICAgICAgICAgICAgPSByZWFkKCcuLi8uLi9jbGllbnQvYnJvd3Nlci9pZGxlLXBhZ2UvaW5kZXguaHRtbC5tdXN0YWNoZScpO1xuY29uc3QgY29ubmVjdGlvbnM6IERpY3Rpb25hcnk8QnJvd3NlckNvbm5lY3Rpb24+ID0ge307XG5cbmludGVyZmFjZSBEaXNjb25uZWN0aW9uUHJvbWlzZTxUPiBleHRlbmRzIFByb21pc2U8VD4ge1xuICAgIHJlc29sdmU6IEZ1bmN0aW9uO1xuICAgIHJlamVjdDogRnVuY3Rpb247XG59XG5cbmludGVyZmFjZSBCcm93c2VyQ29ubmVjdGlvblN0YXR1c1Jlc3VsdCB7XG4gICAgY21kOiBzdHJpbmc7XG4gICAgdXJsOiBzdHJpbmc7XG59XG5cbmludGVyZmFjZSBIZWFydGJlYXRTdGF0dXNSZXN1bHQge1xuICAgIGNvZGU6IEhlYXJ0YmVhdFN0YXR1cztcbiAgICB1cmw6IHN0cmluZztcbn1cblxuaW50ZXJmYWNlIEluaXRTY3JpcHQge1xuICAgIGNvZGU6IHN0cmluZyB8IG51bGw7XG59XG5cbmludGVyZmFjZSBJbml0U2NyaXB0VGFzayBleHRlbmRzIEluaXRTY3JpcHQge1xuICAgIHJlc29sdmU6IEZ1bmN0aW9uO1xufVxuXG5pbnRlcmZhY2UgUHJvdmlkZXJNZXRhSW5mb09wdGlvbnMge1xuICAgIGFwcGVuZFRvVXNlckFnZW50PzogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBCcm93c2VyQ2xvc2luZ0luZm8ge1xuICAgIGlzUmVzdGFydGluZz86IGJvb2xlYW47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQnJvd3NlckluZm8ge1xuICAgIGFsaWFzOiBzdHJpbmc7XG4gICAgYnJvd3Nlck5hbWU6IHN0cmluZztcbiAgICBicm93c2VyT3B0aW9uOiB1bmtub3duO1xuICAgIHByb3ZpZGVyTmFtZTogc3RyaW5nO1xuICAgIHByb3ZpZGVyOiBCcm93c2VyUHJvdmlkZXI7XG4gICAgdXNlckFnZW50UHJvdmlkZXJNZXRhSW5mbzogc3RyaW5nO1xuICAgIHBhcnNlZFVzZXJBZ2VudDogUGFyc2VkVXNlckFnZW50O1xufVxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBCcm93c2VyQ29ubmVjdGlvbiBleHRlbmRzIEV2ZW50RW1pdHRlciB7XG4gICAgcHVibGljIHBlcm1hbmVudDogYm9vbGVhbjtcbiAgICBwdWJsaWMgcHJldmlvdXNBY3RpdmVXaW5kb3dJZDogc3RyaW5nIHwgbnVsbDtcbiAgICBwcml2YXRlIHJlYWRvbmx5IGRpc2FibGVNdWx0aXBsZVdpbmRvd3M6IGJvb2xlYW47XG4gICAgcHJpdmF0ZSByZWFkb25seSBwcm94eWxlc3M6IGJvb2xlYW47XG4gICAgcHJpdmF0ZSByZWFkb25seSBIRUFSVEJFQVRfVElNRU9VVDogbnVtYmVyO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgQlJPV1NFUl9DTE9TRV9USU1FT1VUOiBudW1iZXI7XG4gICAgcHJpdmF0ZSByZWFkb25seSBCUk9XU0VSX1JFU1RBUlRfVElNRU9VVDogbnVtYmVyO1xuICAgIHB1YmxpYyByZWFkb25seSBpZDogc3RyaW5nO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgam9iUXVldWU6IEJyb3dzZXJKb2JbXTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IGluaXRTY3JpcHRzUXVldWU6IEluaXRTY3JpcHRUYXNrW107XG4gICAgcHJpdmF0ZSBicm93c2VyQ29ubmVjdGlvbkdhdGV3YXk6IEJyb3dzZXJDb25uZWN0aW9uR2F0ZXdheTtcbiAgICBwcml2YXRlIGRpc2Nvbm5lY3Rpb25Qcm9taXNlOiBEaXNjb25uZWN0aW9uUHJvbWlzZTx2b2lkPiB8IG51bGw7XG4gICAgcHJpdmF0ZSB0ZXN0UnVuQWJvcnRlZDogYm9vbGVhbjtcbiAgICBwdWJsaWMgc3RhdHVzOiBCcm93c2VyQ29ubmVjdGlvblN0YXR1cztcbiAgICBwcml2YXRlIGhlYXJ0YmVhdFRpbWVvdXQ6IE5vZGVKUy5UaW1lb3V0IHwgbnVsbDtcbiAgICBwcml2YXRlIHBlbmRpbmdUZXN0UnVuVXJsOiBzdHJpbmcgfCBudWxsO1xuICAgIHB1YmxpYyByZWFkb25seSB1cmw6IHN0cmluZztcbiAgICBwdWJsaWMgcmVhZG9ubHkgaWRsZVVybDogc3RyaW5nO1xuICAgIHByaXZhdGUgZm9yY2VkSWRsZVVybDogc3RyaW5nO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgaW5pdFNjcmlwdFVybDogc3RyaW5nO1xuICAgIHB1YmxpYyByZWFkb25seSBoZWFydGJlYXRSZWxhdGl2ZVVybDogc3RyaW5nO1xuICAgIHB1YmxpYyByZWFkb25seSBzdGF0dXNSZWxhdGl2ZVVybDogc3RyaW5nO1xuICAgIHB1YmxpYyByZWFkb25seSBzdGF0dXNEb25lUmVsYXRpdmVVcmw6IHN0cmluZztcbiAgICBwcml2YXRlIHJlYWRvbmx5IGhlYXJ0YmVhdFVybDogc3RyaW5nO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgc3RhdHVzVXJsOiBzdHJpbmc7XG4gICAgcHVibGljIHJlYWRvbmx5IGFjdGl2ZVdpbmRvd0lkVXJsOiBzdHJpbmc7XG4gICAgcHVibGljIHJlYWRvbmx5IGNsb3NlV2luZG93VXJsOiBzdHJpbmc7XG4gICAgcHJpdmF0ZSBzdGF0dXNEb25lVXJsOiBzdHJpbmc7XG4gICAgcHJpdmF0ZSByZWFkb25seSBkZWJ1Z0xvZ2dlcjogZGVidWcuRGVidWdnZXI7XG4gICAgcHJpdmF0ZSBvc0luZm86IE9TSW5mbyB8IG51bGwgPSBudWxsO1xuXG4gICAgcHVibGljIHJlYWRvbmx5IHdhcm5pbmdMb2c6IFdhcm5pbmdMb2c7XG4gICAgcHJpdmF0ZSBfbWVzc2FnZUJ1cz86IE1lc3NhZ2VCdXM7XG5cbiAgICBwdWJsaWMgaWRsZTogYm9vbGVhbjtcblxuICAgIHB1YmxpYyBicm93c2VySW5mbzogQnJvd3NlckluZm87XG4gICAgcHVibGljIHByb3ZpZGVyOiBhbnk7XG5cbiAgICBwdWJsaWMgY29uc3RydWN0b3IgKFxuICAgICAgICBnYXRld2F5OiBCcm93c2VyQ29ubmVjdGlvbkdhdGV3YXksXG4gICAgICAgIGJyb3dzZXJJbmZvOiBCcm93c2VySW5mbyxcbiAgICAgICAgcGVybWFuZW50OiBib29sZWFuLFxuICAgICAgICBkaXNhYmxlTXVsdGlwbGVXaW5kb3dzID0gZmFsc2UsXG4gICAgICAgIHByb3h5bGVzcyA9IGZhbHNlLFxuICAgICAgICBtZXNzYWdlQnVzPzogTWVzc2FnZUJ1cykge1xuICAgICAgICBzdXBlcigpO1xuXG4gICAgICAgIHRoaXMuSEVBUlRCRUFUX1RJTUVPVVQgICAgICAgPSBIRUFSVEJFQVRfVElNRU9VVDtcbiAgICAgICAgdGhpcy5CUk9XU0VSX0NMT1NFX1RJTUVPVVQgICA9IEJST1dTRVJfQ0xPU0VfVElNRU9VVDtcbiAgICAgICAgdGhpcy5CUk9XU0VSX1JFU1RBUlRfVElNRU9VVCA9IEJST1dTRVJfUkVTVEFSVF9USU1FT1VUO1xuXG4gICAgICAgIHRoaXMuaWQgICAgICAgICAgICAgICAgICAgICAgID0gQnJvd3NlckNvbm5lY3Rpb24uX2dlbmVyYXRlSWQoKTtcbiAgICAgICAgdGhpcy5qb2JRdWV1ZSAgICAgICAgICAgICAgICAgPSBbXTtcbiAgICAgICAgdGhpcy5pbml0U2NyaXB0c1F1ZXVlICAgICAgICAgPSBbXTtcbiAgICAgICAgdGhpcy5icm93c2VyQ29ubmVjdGlvbkdhdGV3YXkgPSBnYXRld2F5O1xuICAgICAgICB0aGlzLmRpc2Nvbm5lY3Rpb25Qcm9taXNlICAgICA9IG51bGw7XG4gICAgICAgIHRoaXMudGVzdFJ1bkFib3J0ZWQgICAgICAgICAgID0gZmFsc2U7XG4gICAgICAgIHRoaXMuX21lc3NhZ2VCdXMgICAgICAgICAgICAgID0gbWVzc2FnZUJ1cztcbiAgICAgICAgdGhpcy53YXJuaW5nTG9nICAgICAgICAgICAgICAgPSBuZXcgV2FybmluZ0xvZyhudWxsLCBXYXJuaW5nTG9nLmNyZWF0ZUFkZFdhcm5pbmdDYWxsYmFjayh0aGlzLl9tZXNzYWdlQnVzKSk7XG4gICAgICAgIHRoaXMuZGVidWdMb2dnZXIgICAgICAgICAgICAgID0gZGVidWcoZ2V0QnJvd3NlckNvbm5lY3Rpb25EZWJ1Z1Njb3BlKHRoaXMuaWQpKTtcblxuICAgICAgICB0aGlzLmJyb3dzZXJJbmZvICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBicm93c2VySW5mbztcbiAgICAgICAgdGhpcy5icm93c2VySW5mby51c2VyQWdlbnRQcm92aWRlck1ldGFJbmZvID0gJyc7XG5cbiAgICAgICAgdGhpcy5wcm92aWRlciA9IGJyb3dzZXJJbmZvLnByb3ZpZGVyO1xuXG4gICAgICAgIHRoaXMucGVybWFuZW50ICAgICAgICAgICAgICA9IHBlcm1hbmVudDtcbiAgICAgICAgdGhpcy5zdGF0dXMgICAgICAgICAgICAgICAgID0gQnJvd3NlckNvbm5lY3Rpb25TdGF0dXMudW5pbml0aWFsaXplZDtcbiAgICAgICAgdGhpcy5pZGxlICAgICAgICAgICAgICAgICAgID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5oZWFydGJlYXRUaW1lb3V0ICAgICAgID0gbnVsbDtcbiAgICAgICAgdGhpcy5wZW5kaW5nVGVzdFJ1blVybCAgICAgID0gbnVsbDtcbiAgICAgICAgdGhpcy5kaXNhYmxlTXVsdGlwbGVXaW5kb3dzID0gZGlzYWJsZU11bHRpcGxlV2luZG93cztcbiAgICAgICAgdGhpcy5wcm94eWxlc3MgICAgICAgICAgICAgID0gcHJveHlsZXNzO1xuXG4gICAgICAgIHRoaXMudXJsICAgICAgICAgICA9IGAke2dhdGV3YXkuZG9tYWlufS9icm93c2VyL2Nvbm5lY3QvJHt0aGlzLmlkfWA7XG4gICAgICAgIHRoaXMuaWRsZVVybCAgICAgICA9IGAke2dhdGV3YXkuZG9tYWlufS9icm93c2VyL2lkbGUvJHt0aGlzLmlkfWA7XG4gICAgICAgIHRoaXMuZm9yY2VkSWRsZVVybCA9IGAke2dhdGV3YXkuZG9tYWlufS9icm93c2VyL2lkbGUtZm9yY2VkLyR7dGhpcy5pZH1gO1xuICAgICAgICB0aGlzLmluaXRTY3JpcHRVcmwgPSBgJHtnYXRld2F5LmRvbWFpbn0vYnJvd3Nlci9pbml0LXNjcmlwdC8ke3RoaXMuaWR9YDtcblxuICAgICAgICB0aGlzLmhlYXJ0YmVhdFJlbGF0aXZlVXJsICA9IGAvYnJvd3Nlci9oZWFydGJlYXQvJHt0aGlzLmlkfWA7XG4gICAgICAgIHRoaXMuc3RhdHVzUmVsYXRpdmVVcmwgICAgID0gYC9icm93c2VyL3N0YXR1cy8ke3RoaXMuaWR9YDtcbiAgICAgICAgdGhpcy5zdGF0dXNEb25lUmVsYXRpdmVVcmwgPSBgL2Jyb3dzZXIvc3RhdHVzLWRvbmUvJHt0aGlzLmlkfWA7XG4gICAgICAgIHRoaXMuYWN0aXZlV2luZG93SWRVcmwgICAgID0gYC9icm93c2VyL2FjdGl2ZS13aW5kb3ctaWQvJHt0aGlzLmlkfWA7XG4gICAgICAgIHRoaXMuY2xvc2VXaW5kb3dVcmwgICAgICAgID0gYC9icm93c2VyL2Nsb3NlLXdpbmRvdy8ke3RoaXMuaWR9YDtcblxuICAgICAgICB0aGlzLmhlYXJ0YmVhdFVybCAgPSBgJHtnYXRld2F5LmRvbWFpbn0ke3RoaXMuaGVhcnRiZWF0UmVsYXRpdmVVcmx9YDtcbiAgICAgICAgdGhpcy5zdGF0dXNVcmwgICAgID0gYCR7Z2F0ZXdheS5kb21haW59JHt0aGlzLnN0YXR1c1JlbGF0aXZlVXJsfWA7XG4gICAgICAgIHRoaXMuc3RhdHVzRG9uZVVybCA9IGAke2dhdGV3YXkuZG9tYWlufSR7dGhpcy5zdGF0dXNEb25lUmVsYXRpdmVVcmx9YDtcblxuICAgICAgICB0aGlzLl9zZXRFdmVudEhhbmRsZXJzKCk7XG5cbiAgICAgICAgY29ubmVjdGlvbnNbdGhpcy5pZF0gPSB0aGlzO1xuXG4gICAgICAgIHRoaXMucHJldmlvdXNBY3RpdmVXaW5kb3dJZCA9IG51bGw7XG5cbiAgICAgICAgdGhpcy5icm93c2VyQ29ubmVjdGlvbkdhdGV3YXkuc3RhcnRTZXJ2aW5nQ29ubmVjdGlvbih0aGlzKTtcblxuICAgICAgICAvLyBOT1RFOiBHaXZlIGEgY2FsbGVyIHRpbWUgdG8gYXNzaWduIGV2ZW50IGxpc3RlbmVyc1xuICAgICAgICBwcm9jZXNzLm5leHRUaWNrKCgpID0+IHRoaXMuX3J1bkJyb3dzZXIoKSk7XG4gICAgfVxuXG4gICAgcHVibGljIHNldCBtZXNzYWdlQnVzIChtZXNzYWdlQnVzOiBNZXNzYWdlQnVzKSB7XG4gICAgICAgIHRoaXMuX21lc3NhZ2VCdXMgICAgICAgICA9IG1lc3NhZ2VCdXM7XG4gICAgICAgIHRoaXMud2FybmluZ0xvZy5jYWxsYmFjayA9IFdhcm5pbmdMb2cuY3JlYXRlQWRkV2FybmluZ0NhbGxiYWNrKHRoaXMuX21lc3NhZ2VCdXMpO1xuICAgIH1cblxuICAgIHByaXZhdGUgX3NldEV2ZW50SGFuZGxlcnMgKCk6IHZvaWQge1xuICAgICAgICB0aGlzLm9uKCdlcnJvcicsIGUgPT4ge1xuICAgICAgICAgICAgdGhpcy5kZWJ1Z0xvZ2dlcihlKTtcbiAgICAgICAgICAgIHRoaXMuX2ZvcmNlSWRsZSgpO1xuICAgICAgICAgICAgdGhpcy5jbG9zZSgpO1xuICAgICAgICB9KTtcblxuICAgICAgICBmb3IgKGNvbnN0IG5hbWUgaW4gQnJvd3NlckNvbm5lY3Rpb25TdGF0dXMpIHtcbiAgICAgICAgICAgIGNvbnN0IHN0YXR1cyA9IEJyb3dzZXJDb25uZWN0aW9uU3RhdHVzW25hbWUgYXMga2V5b2YgdHlwZW9mIEJyb3dzZXJDb25uZWN0aW9uU3RhdHVzXTtcblxuICAgICAgICAgICAgdGhpcy5vbihzdGF0dXMsICgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmRlYnVnTG9nZ2VyKGBzdGF0dXMgY2hhbmdlZCB0byAnJHtzdGF0dXN9J2ApO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIHN0YXRpYyBfZ2VuZXJhdGVJZCAoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIG5hbm9pZCg3KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIF9ydW5Ccm93c2VyICgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMucHJvdmlkZXIub3BlbkJyb3dzZXIodGhpcy5pZCwgdGhpcy51cmwsIHRoaXMuYnJvd3NlckluZm8uYnJvd3Nlck9wdGlvbiwgdGhpcy5kaXNhYmxlTXVsdGlwbGVXaW5kb3dzLCB0aGlzLnByb3h5bGVzcyk7XG5cbiAgICAgICAgICAgIGlmICh0aGlzLnN0YXR1cyAhPT0gQnJvd3NlckNvbm5lY3Rpb25TdGF0dXMucmVhZHkpXG4gICAgICAgICAgICAgICAgYXdhaXQgcHJvbWlzaWZ5RXZlbnQodGhpcywgJ3JlYWR5Jyk7XG5cbiAgICAgICAgICAgIHRoaXMuc3RhdHVzID0gQnJvd3NlckNvbm5lY3Rpb25TdGF0dXMub3BlbmVkO1xuICAgICAgICAgICAgdGhpcy5lbWl0KCdvcGVuZWQnKTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICB0aGlzLmVtaXQoJ2Vycm9yJywgbmV3IEdlbmVyYWxFcnJvcihcbiAgICAgICAgICAgICAgICBSVU5USU1FX0VSUk9SUy51bmFibGVUb09wZW5Ccm93c2VyLFxuICAgICAgICAgICAgICAgIHRoaXMuYnJvd3NlckluZm8ucHJvdmlkZXJOYW1lICsgJzonICsgdGhpcy5icm93c2VySW5mby5icm93c2VyTmFtZSxcbiAgICAgICAgICAgICAgICBlcnIuc3RhY2tcbiAgICAgICAgICAgICkpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBfY2xvc2VCcm93c2VyIChkYXRhOiBCcm93c2VyQ2xvc2luZ0luZm8gPSB7fSk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBpZiAoIXRoaXMuaWRsZSlcbiAgICAgICAgICAgIGF3YWl0IHByb21pc2lmeUV2ZW50KHRoaXMsICdpZGxlJyk7XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMucHJvdmlkZXIuY2xvc2VCcm93c2VyKHRoaXMuaWQsIGRhdGEpO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgIC8vIE5PVEU6IEEgd2FybmluZyB3b3VsZCBiZSByZWFsbHkgbmljZSBoZXJlLCBidXQgaXQgY2FuJ3QgYmUgZG9uZSB3aGlsZSBsb2cgaXMgc3RvcmVkIGluIGEgdGFzay5cbiAgICAgICAgICAgIHRoaXMuZGVidWdMb2dnZXIoZXJyKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgX2ZvcmNlSWRsZSAoKTogdm9pZCB7XG4gICAgICAgIGlmICghdGhpcy5pZGxlKSB7XG4gICAgICAgICAgICB0aGlzLmlkbGUgPSB0cnVlO1xuXG4gICAgICAgICAgICB0aGlzLmVtaXQoJ2lkbGUnKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgX2NyZWF0ZUJyb3dzZXJEaXNjb25uZWN0ZWRFcnJvciAoKTogR2VuZXJhbEVycm9yIHtcbiAgICAgICAgcmV0dXJuIG5ldyBHZW5lcmFsRXJyb3IoUlVOVElNRV9FUlJPUlMuYnJvd3NlckRpc2Nvbm5lY3RlZCwgdGhpcy51c2VyQWdlbnQpO1xuICAgIH1cblxuICAgIHByaXZhdGUgX3dhaXRGb3JIZWFydGJlYXQgKCk6IHZvaWQge1xuICAgICAgICB0aGlzLmhlYXJ0YmVhdFRpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGVyciA9IHRoaXMuX2NyZWF0ZUJyb3dzZXJEaXNjb25uZWN0ZWRFcnJvcigpO1xuXG4gICAgICAgICAgICB0aGlzLnN0YXR1cyAgICAgICAgID0gQnJvd3NlckNvbm5lY3Rpb25TdGF0dXMuZGlzY29ubmVjdGVkO1xuICAgICAgICAgICAgdGhpcy50ZXN0UnVuQWJvcnRlZCA9IHRydWU7XG5cbiAgICAgICAgICAgIHRoaXMuZW1pdCgnZGlzY29ubmVjdGVkJywgZXJyKTtcblxuICAgICAgICAgICAgdGhpcy5fcmVzdGFydEJyb3dzZXJPbkRpc2Nvbm5lY3QoZXJyKTtcbiAgICAgICAgfSwgdGhpcy5IRUFSVEJFQVRfVElNRU9VVCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBfZ2V0VGVzdFJ1blVybCAobmVlZFBvcE5leHQ6IGJvb2xlYW4pOiBQcm9taXNlPHN0cmluZz4ge1xuICAgICAgICBpZiAobmVlZFBvcE5leHQgfHwgIXRoaXMucGVuZGluZ1Rlc3RSdW5VcmwpXG4gICAgICAgICAgICB0aGlzLnBlbmRpbmdUZXN0UnVuVXJsID0gYXdhaXQgdGhpcy5fcG9wTmV4dFRlc3RSdW5VcmwoKTtcblxuICAgICAgICByZXR1cm4gdGhpcy5wZW5kaW5nVGVzdFJ1blVybCBhcyBzdHJpbmc7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBfcG9wTmV4dFRlc3RSdW5VcmwgKCk6IFByb21pc2U8c3RyaW5nIHwgbnVsbD4ge1xuICAgICAgICB3aGlsZSAodGhpcy5oYXNRdWV1ZWRKb2JzICYmICF0aGlzLmN1cnJlbnRKb2IuaGFzUXVldWVkVGVzdFJ1bnMpXG4gICAgICAgICAgICB0aGlzLmpvYlF1ZXVlLnNoaWZ0KCk7XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuaGFzUXVldWVkSm9icyA/IGF3YWl0IHRoaXMuY3VycmVudEpvYi5wb3BOZXh0VGVzdFJ1blVybCh0aGlzKSA6IG51bGw7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBnZXRCeUlkIChpZDogc3RyaW5nKTogQnJvd3NlckNvbm5lY3Rpb24gfCBudWxsIHtcbiAgICAgICAgcmV0dXJuIGNvbm5lY3Rpb25zW2lkXSB8fCBudWxsO1xuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgX3Jlc3RhcnRCcm93c2VyICgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgdGhpcy5zdGF0dXMgPSBCcm93c2VyQ29ubmVjdGlvblN0YXR1cy51bmluaXRpYWxpemVkO1xuXG4gICAgICAgIHRoaXMuX2ZvcmNlSWRsZSgpO1xuXG4gICAgICAgIGxldCByZXNvbHZlVGltZW91dDogRnVuY3Rpb24gfCBudWxsID0gbnVsbDtcbiAgICAgICAgbGV0IGlzVGltZW91dEV4cGlyZWQgICAgICAgICAgICAgICAgPSBmYWxzZTtcbiAgICAgICAgbGV0IHRpbWVvdXQ6IE5vZGVKUy5UaW1lb3V0IHwgbnVsbCAgPSBudWxsO1xuXG4gICAgICAgIGNvbnN0IHJlc3RhcnRQcm9taXNlID0gdGltZUxpbWl0KHRoaXMuX2Nsb3NlQnJvd3Nlcih7IGlzUmVzdGFydGluZzogdHJ1ZSB9KSwgdGhpcy5CUk9XU0VSX0NMT1NFX1RJTUVPVVQsIHsgcmVqZWN0V2l0aDogbmV3IFRpbWVvdXRFcnJvcigpIH0pXG4gICAgICAgICAgICAuY2F0Y2goZXJyID0+IHRoaXMuZGVidWdMb2dnZXIoZXJyKSlcbiAgICAgICAgICAgIC50aGVuKCgpID0+IHRoaXMuX3J1bkJyb3dzZXIoKSk7XG5cbiAgICAgICAgY29uc3QgdGltZW91dFByb21pc2UgPSBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHtcbiAgICAgICAgICAgIHJlc29sdmVUaW1lb3V0ID0gcmVzb2x2ZTtcblxuICAgICAgICAgICAgdGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgIGlzVGltZW91dEV4cGlyZWQgPSB0cnVlO1xuXG4gICAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgICAgfSwgdGhpcy5CUk9XU0VSX1JFU1RBUlRfVElNRU9VVCk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiBQcm9taXNlLnJhY2UoW3Jlc3RhcnRQcm9taXNlLCB0aW1lb3V0UHJvbWlzZV0pXG4gICAgICAgICAgICAudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVvdXQgYXMgTm9kZUpTLlRpbWVvdXQpO1xuXG4gICAgICAgICAgICAgICAgaWYgKGlzVGltZW91dEV4cGlyZWQpXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZW1pdCgnZXJyb3InLCB0aGlzLl9jcmVhdGVCcm93c2VyRGlzY29ubmVjdGVkRXJyb3IoKSk7XG4gICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICAocmVzb2x2ZVRpbWVvdXQgYXMgRnVuY3Rpb24pKCk7XG4gICAgICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9yZXN0YXJ0QnJvd3Nlck9uRGlzY29ubmVjdCAoZXJyOiBFcnJvcik6IHZvaWQge1xuICAgICAgICBsZXQgcmVzb2x2ZUZuOiBGdW5jdGlvbiB8IG51bGwgPSBudWxsO1xuICAgICAgICBsZXQgcmVqZWN0Rm46IEZ1bmN0aW9uIHwgbnVsbCAgPSBudWxsO1xuXG4gICAgICAgIHRoaXMuZGlzY29ubmVjdGlvblByb21pc2UgPSBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICByZXNvbHZlRm4gPSByZXNvbHZlO1xuXG4gICAgICAgICAgICByZWplY3RGbiA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICByZWplY3QoZXJyKTtcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgIChyZWplY3RGbiBhcyBGdW5jdGlvbikoKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KVxuICAgICAgICAgICAgLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9yZXN0YXJ0QnJvd3NlcigpO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIC5jYXRjaChlID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmVtaXQoJ2Vycm9yJywgZSk7XG4gICAgICAgICAgICB9KSBhcyBEaXNjb25uZWN0aW9uUHJvbWlzZTx2b2lkPjtcblxuICAgICAgICB0aGlzLmRpc2Nvbm5lY3Rpb25Qcm9taXNlLnJlc29sdmUgPSByZXNvbHZlRm4gYXMgdW5rbm93biBhcyBGdW5jdGlvbjtcbiAgICAgICAgdGhpcy5kaXNjb25uZWN0aW9uUHJvbWlzZS5yZWplY3QgID0gcmVqZWN0Rm4gYXMgdW5rbm93biBhcyBGdW5jdGlvbjtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgZ2V0RGVmYXVsdEJyb3dzZXJJbml0VGltZW91dCAoKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgICAgICAgY29uc3QgaXNMb2NhbEJyb3dzZXIgPSBhd2FpdCB0aGlzLnByb3ZpZGVyLmlzTG9jYWxCcm93c2VyKHRoaXMuaWQsIHRoaXMuYnJvd3NlckluZm8uYnJvd3Nlck5hbWUpO1xuXG4gICAgICAgIHJldHVybiBpc0xvY2FsQnJvd3NlciA/IExPQ0FMX0JST1dTRVJfSU5JVF9USU1FT1VUIDogUkVNT1RFX0JST1dTRVJfSU5JVF9USU1FT1VUO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBwcm9jZXNzRGlzY29ubmVjdGlvbiAoZGlzY29ubmVjdGlvblRocmVzaG9sZEV4Y2VlZGVkOiBib29sZWFuKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGNvbnN0IHsgcmVzb2x2ZSwgcmVqZWN0IH0gPSB0aGlzLmRpc2Nvbm5lY3Rpb25Qcm9taXNlIGFzIERpc2Nvbm5lY3Rpb25Qcm9taXNlPHZvaWQ+O1xuXG4gICAgICAgIGlmIChkaXNjb25uZWN0aW9uVGhyZXNob2xkRXhjZWVkZWQpXG4gICAgICAgICAgICByZWplY3QoKTtcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgIH1cblxuICAgIHB1YmxpYyBhZGRXYXJuaW5nIChtZXNzYWdlOiBzdHJpbmcsIC4uLmFyZ3M6IGFueVtdKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLmN1cnJlbnRKb2IpXG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRKb2Iud2FybmluZ0xvZy5hZGRXYXJuaW5nKG1lc3NhZ2UsIC4uLmFyZ3MpO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgICB0aGlzLndhcm5pbmdMb2cuYWRkV2FybmluZyhtZXNzYWdlLCAuLi5hcmdzKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9hcHBlbmRUb1ByZXR0eVVzZXJBZ2VudCAoc3RyOiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5icm93c2VySW5mby5wYXJzZWRVc2VyQWdlbnQucHJldHR5VXNlckFnZW50ICs9IGAgKCR7c3RyfSlgO1xuICAgIH1cblxuICAgIHByaXZhdGUgX21vdmVXYXJuaW5nTG9nVG9Kb2IgKGpvYjogQnJvd3NlckpvYik6IHZvaWQge1xuICAgICAgICBqb2Iud2FybmluZ0xvZy5jb3B5RnJvbSh0aGlzLndhcm5pbmdMb2cpO1xuICAgICAgICB0aGlzLndhcm5pbmdMb2cuY2xlYXIoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0UHJvdmlkZXJNZXRhSW5mbyAoc3RyOiBzdHJpbmcsIG9wdGlvbnM/OiBQcm92aWRlck1ldGFJbmZvT3B0aW9ucyk6IHZvaWQge1xuICAgICAgICBjb25zdCBhcHBlbmRUb1VzZXJBZ2VudCA9IG9wdGlvbnM/LmFwcGVuZFRvVXNlckFnZW50IGFzIGJvb2xlYW47XG5cbiAgICAgICAgaWYgKGFwcGVuZFRvVXNlckFnZW50KSB7XG4gICAgICAgICAgICAvLyBOT1RFOlxuICAgICAgICAgICAgLy8gY2hhbmdlIHByZXR0eVVzZXJBZ2VudCBvbmx5IHdoZW4gY29ubmVjdGlvbiBhbHJlYWR5IHdhcyBlc3RhYmxpc2hlZFxuICAgICAgICAgICAgaWYgKHRoaXMuaXNSZWFkeSgpKVxuICAgICAgICAgICAgICAgIHRoaXMuX2FwcGVuZFRvUHJldHR5VXNlckFnZW50KHN0cik7XG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgdGhpcy5vbigncmVhZHknLCAoKSA9PiB0aGlzLl9hcHBlbmRUb1ByZXR0eVVzZXJBZ2VudChzdHIpKTtcblxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5icm93c2VySW5mby51c2VyQWdlbnRQcm92aWRlck1ldGFJbmZvID0gc3RyO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgdXNlckFnZW50ICgpOiBzdHJpbmcge1xuICAgICAgICBsZXQgdXNlckFnZW50ID0gdGhpcy5icm93c2VySW5mby5wYXJzZWRVc2VyQWdlbnQucHJldHR5VXNlckFnZW50O1xuXG4gICAgICAgIGlmICh0aGlzLmJyb3dzZXJJbmZvLnVzZXJBZ2VudFByb3ZpZGVyTWV0YUluZm8pXG4gICAgICAgICAgICB1c2VyQWdlbnQgKz0gYCAoJHt0aGlzLmJyb3dzZXJJbmZvLnVzZXJBZ2VudFByb3ZpZGVyTWV0YUluZm99KWA7XG5cbiAgICAgICAgcmV0dXJuIHVzZXJBZ2VudDtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGNvbm5lY3Rpb25JbmZvICgpOiBzdHJpbmcge1xuICAgICAgICBpZiAoIXRoaXMub3NJbmZvKVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMudXNlckFnZW50O1xuXG4gICAgICAgIGNvbnN0IHsgbmFtZSwgdmVyc2lvbiB9ID0gdGhpcy5icm93c2VySW5mby5wYXJzZWRVc2VyQWdlbnQ7XG4gICAgICAgIGxldCBjb25uZWN0aW9uSW5mbyAgICAgID0gY2FsY3VsYXRlUHJldHR5VXNlckFnZW50KHsgbmFtZSwgdmVyc2lvbiB9LCB0aGlzLm9zSW5mbyk7XG4gICAgICAgIGNvbnN0IG1ldGFJbmZvICAgICAgICAgID0gdGhpcy5icm93c2VySW5mby51c2VyQWdlbnRQcm92aWRlck1ldGFJbmZvIHx8IGV4dHJhY3RNZXRhSW5mbyh0aGlzLmJyb3dzZXJJbmZvLnBhcnNlZFVzZXJBZ2VudC5wcmV0dHlVc2VyQWdlbnQpO1xuXG4gICAgICAgIGlmIChtZXRhSW5mbylcbiAgICAgICAgICAgIGNvbm5lY3Rpb25JbmZvICs9IGAgKCR7IG1ldGFJbmZvIH0pYDtcblxuICAgICAgICByZXR1cm4gY29ubmVjdGlvbkluZm87XG4gICAgfVxuXG4gICAgcHVibGljIGdldCByZXRyeVRlc3RQYWdlcyAoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLmJyb3dzZXJDb25uZWN0aW9uR2F0ZXdheS5yZXRyeVRlc3RQYWdlcztcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGhhc1F1ZXVlZEpvYnMgKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gISF0aGlzLmpvYlF1ZXVlLmxlbmd0aDtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGN1cnJlbnRKb2IgKCk6IEJyb3dzZXJKb2Ige1xuICAgICAgICByZXR1cm4gdGhpcy5qb2JRdWV1ZVswXTtcbiAgICB9XG5cbiAgICAvLyBBUElcbiAgICBwdWJsaWMgcnVuSW5pdFNjcmlwdCAoY29kZTogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmcgfCB1bmtub3duPiB7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHRoaXMuaW5pdFNjcmlwdHNRdWV1ZS5wdXNoKHsgY29kZSwgcmVzb2x2ZSB9KSk7XG4gICAgfVxuXG4gICAgcHVibGljIGFkZEpvYiAoam9iOiBCcm93c2VySm9iKTogdm9pZCB7XG4gICAgICAgIHRoaXMuam9iUXVldWUucHVzaChqb2IpO1xuXG4gICAgICAgIHRoaXMuX21vdmVXYXJuaW5nTG9nVG9Kb2Ioam9iKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgcmVtb3ZlSm9iIChqb2I6IEJyb3dzZXJKb2IpOiB2b2lkIHtcbiAgICAgICAgcmVtb3ZlKHRoaXMuam9iUXVldWUsIGpvYik7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGNsb3NlICgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgaWYgKHRoaXMuc3RhdHVzID09PSBCcm93c2VyQ29ubmVjdGlvblN0YXR1cy5jbG9zaW5nIHx8IHRoaXMuc3RhdHVzID09PSBCcm93c2VyQ29ubmVjdGlvblN0YXR1cy5jbG9zZWQpXG4gICAgICAgICAgICByZXR1cm47XG5cbiAgICAgICAgdGhpcy5zdGF0dXMgPSBCcm93c2VyQ29ubmVjdGlvblN0YXR1cy5jbG9zaW5nO1xuICAgICAgICB0aGlzLmVtaXQoQnJvd3NlckNvbm5lY3Rpb25TdGF0dXMuY2xvc2luZyk7XG5cbiAgICAgICAgYXdhaXQgdGhpcy5fY2xvc2VCcm93c2VyKCk7XG5cbiAgICAgICAgdGhpcy5icm93c2VyQ29ubmVjdGlvbkdhdGV3YXkuc3RvcFNlcnZpbmdDb25uZWN0aW9uKHRoaXMpO1xuXG4gICAgICAgIGlmICh0aGlzLmhlYXJ0YmVhdFRpbWVvdXQpXG4gICAgICAgICAgICBjbGVhclRpbWVvdXQodGhpcy5oZWFydGJlYXRUaW1lb3V0KTtcblxuICAgICAgICBkZWxldGUgY29ubmVjdGlvbnNbdGhpcy5pZF07XG5cbiAgICAgICAgdGhpcy5zdGF0dXMgPSBCcm93c2VyQ29ubmVjdGlvblN0YXR1cy5jbG9zZWQ7XG4gICAgICAgIHRoaXMuZW1pdChCcm93c2VyQ29ubmVjdGlvblN0YXR1cy5jbG9zZWQpO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBlc3RhYmxpc2ggKHVzZXJBZ2VudDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIHRoaXMuc3RhdHVzICAgICAgICAgICAgICAgICAgICAgID0gQnJvd3NlckNvbm5lY3Rpb25TdGF0dXMucmVhZHk7XG4gICAgICAgIHRoaXMuYnJvd3NlckluZm8ucGFyc2VkVXNlckFnZW50ID0gcGFyc2VVc2VyQWdlbnQodXNlckFnZW50KTtcbiAgICAgICAgdGhpcy5vc0luZm8gICAgICAgICAgICAgICAgICAgICAgPSBhd2FpdCB0aGlzLnByb3ZpZGVyLmdldE9TSW5mbyh0aGlzLmlkKTtcblxuICAgICAgICB0aGlzLl93YWl0Rm9ySGVhcnRiZWF0KCk7XG4gICAgICAgIHRoaXMuZW1pdCgncmVhZHknKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgaGVhcnRiZWF0ICgpOiBIZWFydGJlYXRTdGF0dXNSZXN1bHQge1xuICAgICAgICBpZiAodGhpcy5oZWFydGJlYXRUaW1lb3V0KVxuICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuaGVhcnRiZWF0VGltZW91dCk7XG5cbiAgICAgICAgdGhpcy5fd2FpdEZvckhlYXJ0YmVhdCgpO1xuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBjb2RlOiB0aGlzLnN0YXR1cyA9PT0gQnJvd3NlckNvbm5lY3Rpb25TdGF0dXMuY2xvc2luZyA/IEhlYXJ0YmVhdFN0YXR1cy5jbG9zaW5nIDogSGVhcnRiZWF0U3RhdHVzLm9rLFxuICAgICAgICAgICAgdXJsOiAgdGhpcy5zdGF0dXMgPT09IEJyb3dzZXJDb25uZWN0aW9uU3RhdHVzLmNsb3NpbmcgPyB0aGlzLmlkbGVVcmwgOiAnJyxcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBwdWJsaWMgcmVuZGVySWRsZVBhZ2UgKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiBNdXN0YWNoZS5yZW5kZXIoSURMRV9QQUdFX1RFTVBMQVRFIGFzIHN0cmluZywge1xuICAgICAgICAgICAgdXNlckFnZW50OiAgICAgIHRoaXMuY29ubmVjdGlvbkluZm8sXG4gICAgICAgICAgICBzdGF0dXNVcmw6ICAgICAgdGhpcy5zdGF0dXNVcmwsXG4gICAgICAgICAgICBoZWFydGJlYXRVcmw6ICAgdGhpcy5oZWFydGJlYXRVcmwsXG4gICAgICAgICAgICBpbml0U2NyaXB0VXJsOiAgdGhpcy5pbml0U2NyaXB0VXJsLFxuICAgICAgICAgICAgcmV0cnlUZXN0UGFnZXM6ICEhdGhpcy5icm93c2VyQ29ubmVjdGlvbkdhdGV3YXkucmV0cnlUZXN0UGFnZXMsXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRJbml0U2NyaXB0ICgpOiBJbml0U2NyaXB0IHtcbiAgICAgICAgY29uc3QgaW5pdFNjcmlwdFByb21pc2UgPSB0aGlzLmluaXRTY3JpcHRzUXVldWVbMF07XG5cbiAgICAgICAgcmV0dXJuIHsgY29kZTogaW5pdFNjcmlwdFByb21pc2UgPyBpbml0U2NyaXB0UHJvbWlzZS5jb2RlIDogbnVsbCB9O1xuICAgIH1cblxuICAgIHB1YmxpYyBoYW5kbGVJbml0U2NyaXB0UmVzdWx0IChkYXRhOiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgaW5pdFNjcmlwdFByb21pc2UgPSB0aGlzLmluaXRTY3JpcHRzUXVldWUuc2hpZnQoKTtcblxuICAgICAgICBpZiAoaW5pdFNjcmlwdFByb21pc2UpXG4gICAgICAgICAgICBpbml0U2NyaXB0UHJvbWlzZS5yZXNvbHZlKEpTT04ucGFyc2UoZGF0YSkpO1xuICAgIH1cblxuICAgIHB1YmxpYyBpc0hlYWRsZXNzQnJvd3NlciAoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLnByb3ZpZGVyLmlzSGVhZGxlc3NCcm93c2VyKHRoaXMuaWQpO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyByZXBvcnRKb2JSZXN1bHQgKHN0YXR1czogc3RyaW5nLCBkYXRhOiBhbnkpOiBQcm9taXNlPGFueT4ge1xuICAgICAgICBhd2FpdCB0aGlzLnByb3ZpZGVyLnJlcG9ydEpvYlJlc3VsdCh0aGlzLmlkLCBzdGF0dXMsIGRhdGEpO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBnZXRTdGF0dXMgKGlzVGVzdERvbmU6IGJvb2xlYW4pOiBQcm9taXNlPEJyb3dzZXJDb25uZWN0aW9uU3RhdHVzUmVzdWx0PiB7XG4gICAgICAgIGlmICghdGhpcy5pZGxlICYmICFpc1Rlc3REb25lKSB7XG4gICAgICAgICAgICB0aGlzLmlkbGUgPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy5lbWl0KCdpZGxlJyk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5zdGF0dXMgPT09IEJyb3dzZXJDb25uZWN0aW9uU3RhdHVzLm9wZW5lZCkge1xuICAgICAgICAgICAgY29uc3QgdGVzdFJ1blVybCA9IGF3YWl0IHRoaXMuX2dldFRlc3RSdW5VcmwoaXNUZXN0RG9uZSB8fCB0aGlzLnRlc3RSdW5BYm9ydGVkKTtcblxuICAgICAgICAgICAgdGhpcy50ZXN0UnVuQWJvcnRlZCA9IGZhbHNlO1xuXG4gICAgICAgICAgICBpZiAodGVzdFJ1blVybCkge1xuICAgICAgICAgICAgICAgIHRoaXMuaWRsZSA9IGZhbHNlO1xuXG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgY21kOiBDT01NQU5ELnJ1biwgdXJsOiB0ZXN0UnVuVXJsIH07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4geyBjbWQ6IENPTU1BTkQuaWRsZSwgdXJsOiB0aGlzLmlkbGVVcmwgfTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGFjdGl2ZVdpbmRvd0lkICgpOiBudWxsIHwgc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucHJvdmlkZXIuZ2V0QWN0aXZlV2luZG93SWQodGhpcy5pZCk7XG4gICAgfVxuXG4gICAgcHVibGljIHNldCBhY3RpdmVXaW5kb3dJZCAodmFsKSB7XG4gICAgICAgIHRoaXMucHJldmlvdXNBY3RpdmVXaW5kb3dJZCA9IHRoaXMuYWN0aXZlV2luZG93SWQ7XG5cbiAgICAgICAgdGhpcy5wcm92aWRlci5zZXRBY3RpdmVXaW5kb3dJZCh0aGlzLmlkLCB2YWwpO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBjYW5Vc2VEZWZhdWx0V2luZG93QWN0aW9ucyAoKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgICAgIHJldHVybiB0aGlzLnByb3ZpZGVyLmNhblVzZURlZmF1bHRXaW5kb3dBY3Rpb25zKHRoaXMuaWQpO1xuICAgIH1cblxuICAgIHB1YmxpYyBpc1JlYWR5ICgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3RhdHVzID09PSBCcm93c2VyQ29ubmVjdGlvblN0YXR1cy5yZWFkeSB8fFxuICAgICAgICAgICAgdGhpcy5zdGF0dXMgPT09IEJyb3dzZXJDb25uZWN0aW9uU3RhdHVzLm9wZW5lZCB8fFxuICAgICAgICAgICAgdGhpcy5zdGF0dXMgPT09IEJyb3dzZXJDb25uZWN0aW9uU3RhdHVzLmNsb3Npbmc7XG4gICAgfVxufVxuIl19
367
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvYnJvd3Nlci9jb25uZWN0aW9uL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsa0RBQTBCO0FBQzFCLDRFQUEyQztBQUMzQyxtQ0FBc0M7QUFDdEMsd0RBQWdDO0FBQ2hDLG1DQUF3QztBQUN4QyxtRUFLc0M7QUFDdEMsMkRBQXNEO0FBQ3RELHNFQUE2QztBQUM3QyxtQ0FBZ0M7QUFDaEMsd0RBQWdDO0FBQ2hDLHNEQUErQztBQUMvQywwRUFBaUQ7QUFDakQsa0RBQWtFO0FBQ2xFLDhDQUFvRDtBQUdwRCxrRkFBeUQ7QUFJekQseUZBTWlEO0FBRWpELDhGQUFvRTtBQU1wRSxNQUFNLDhCQUE4QixHQUFHLENBQUMsRUFBVSxFQUFVLEVBQUUsQ0FBQywrQkFBK0IsRUFBRSxFQUFFLENBQUM7QUFFbkcsTUFBTSxrQkFBa0IsR0FBRyw2QkFBSSxDQUFDLG9EQUFvRCxDQUFDLENBQUM7QUE0Q3RGLE1BQXFCLGlCQUFrQixTQUFRLHFCQUFZO0lBd0N2RCxZQUNJLE9BQWlDLEVBQ2pDLFdBQXdCLEVBQ3hCLFNBQWtCLEVBQ2xCLHNCQUFzQixHQUFHLEtBQUssRUFDOUIsU0FBUyxHQUFHLEtBQUssRUFDakIsVUFBdUI7UUFDdkIsS0FBSyxFQUFFLENBQUM7UUE5QkwsUUFBRyxHQUFHLEVBQUUsQ0FBQztRQUNULFlBQU8sR0FBRyxFQUFFLENBQUM7UUFDWixrQkFBYSxHQUFHLEVBQUUsQ0FBQztRQUNuQixrQkFBYSxHQUFHLEVBQUUsQ0FBQztRQUNwQixpQkFBWSxHQUFHLEVBQUUsQ0FBQztRQUNsQixjQUFTLEdBQUcsRUFBRSxDQUFDO1FBQ2Ysc0JBQWlCLEdBQUcsRUFBRSxDQUFDO1FBQ3ZCLG1CQUFjLEdBQUcsRUFBRSxDQUFDO1FBQ3BCLGtCQUFhLEdBQUcsRUFBRSxDQUFDO1FBQ25CLHlCQUFvQixHQUFHLEVBQUUsQ0FBQztRQUMxQixzQkFBaUIs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QUFpQixDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUNwRCxDQUFDO0lBRUQsSUFBVyxjQUFjLENBQUUsR0FBRztRQUMxQixJQUFJLENBQUMsc0JBQXNCLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQztRQUVsRCxJQUFJLENBQUMsUUFBUSxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFDbEQsQ0FBQztJQUVNLEtBQUssQ0FBQywwQkFBMEI7UUFDbkMsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLDBCQUEwQixDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUM3RCxDQUFDO0lBRU0sT0FBTztRQUNWLE9BQU8sSUFBSSxDQUFDLE1BQU0sS0FBSyxnQkFBdUIsQ0FBQyxLQUFLO1lBQ2hELElBQUksQ0FBQyxNQUFNLEtBQUssZ0JBQXVCLENBQUMsTUFBTTtZQUM5QyxJQUFJLENBQUMsTUFBTSxLQUFLLGdCQUF1QixDQUFDLE9BQU8sQ0FBQztJQUN4RCxDQUFDO0NBQ0o7QUFqZUQsb0NBaWVDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGRlYnVnIGZyb20gJ2RlYnVnJztcbmltcG9ydCB0aW1lTGltaXQgZnJvbSAndGltZS1saW1pdC1wcm9taXNlJztcbmltcG9ydCB7IEV2ZW50RW1pdHRlciB9IGZyb20gJ2V2ZW50cyc7XG5pbXBvcnQgTXVzdGFjaGUgZnJvbSAnbXVzdGFjaGUnO1xuaW1wb3J0IHsgcHVsbCBhcyByZW1vdmUgfSBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHtcbiAgICBjYWxjdWxhdGVQcmV0dHlVc2VyQWdlbnQsXG4gICAgZXh0cmFjdE1ldGFJbmZvLFxuICAgIFBhcnNlZFVzZXJBZ2VudCxcbiAgICBwYXJzZVVzZXJBZ2VudCxcbn0gZnJvbSAnLi4vLi4vdXRpbHMvcGFyc2UtdXNlci1hZ2VudCc7XG5pbXBvcnQgeyByZWFkU3luYyBhcyByZWFkIH0gZnJvbSAncmVhZC1maWxlLXJlbGF0aXZlJztcbmltcG9ydCBwcm9taXNpZnlFdmVudCBmcm9tICdwcm9taXNpZnktZXZlbnQnO1xuaW1wb3J0IHsgbmFub2lkIH0gZnJvbSAnbmFub2lkJztcbmltcG9ydCBDT01NQU5EIGZyb20gJy4vY29tbWFuZCc7XG5pbXBvcnQgQnJvd3NlckNvbm5lY3Rpb25TdGF0dXMgZnJvbSAnLi9zdGF0dXMnO1xuaW1wb3J0IEhlYXJ0YmVhdFN0YXR1cyBmcm9tICcuL2hlYXJ0YmVhdC1zdGF0dXMnO1xuaW1wb3J0IHsgR2VuZXJhbEVycm9yLCBUaW1lb3V0RXJyb3IgfSBmcm9tICcuLi8uLi9lcnJvcnMvcnVudGltZSc7XG5pbXBvcnQgeyBSVU5USU1FX0VSUk9SUyB9IGZyb20gJy4uLy4uL2Vycm9ycy90eXBlcyc7XG5pbXBvcnQgQnJvd3NlckNvbm5lY3Rpb25HYXRld2F5IGZyb20gJy4vZ2F0ZXdheSc7XG5pbXBvcnQgQnJvd3NlckpvYiBmcm9tICcuLi8uLi9ydW5uZXIvYnJvd3Nlci1qb2InO1xuaW1wb3J0IFdhcm5pbmdMb2cgZnJvbSAnLi4vLi4vbm90aWZpY2F0aW9ucy93YXJuaW5nLWxvZyc7XG5pbXBvcnQgQnJvd3NlclByb3ZpZGVyIGZyb20gJy4uL3Byb3ZpZGVyJztcbmltcG9ydCB7IE9TSW5mbyB9IGZyb20gJ2dldC1vcy1pbmZvJztcblxuaW1wb3J0IHtcbiAgICBCUk9XU0VSX1JFU1RBUlRfVElNRU9VVCxcbiAgICBCUk9XU0VSX0NMT1NFX1RJTUVPVVQsXG4gICAgSEVBUlRCRUFUX1RJTUVPVVQsXG4gICAgTE9DQUxfQlJPV1NFUl9JTklUX1RJTUVPVVQsXG4gICAgUkVNT1RFX0JST1dTRVJfSU5JVF9USU1FT1VULFxufSBmcm9tICcuLi8uLi91dGlscy9icm93c2VyLWNvbm5lY3Rpb24tdGltZW91dHMnO1xuaW1wb3J0IE1lc3NhZ2VCdXMgZnJvbSAnLi4vLi4vdXRpbHMvbWVzc2FnZS1idXMnO1xuaW1wb3J0IEJyb3dzZXJDb25uZWN0aW9uVHJhY2tlciBmcm9tICcuL2Jyb3dzZXItY29ubmVjdGlvbi10cmFja2VyJztcbmltcG9ydCBUZXN0UnVuIGZyb20gJy4uLy4uL3Rlc3QtcnVuJztcbi8vIEB0cy1pZ25vcmVcbmltcG9ydCB7IFRlc3RSdW4gYXMgTGVnYWN5VGVzdFJ1biB9IGZyb20gJ3Rlc3RjYWZlLWxlZ2FjeS1hcGknO1xuaW1wb3J0IHsgUHJveHkgfSBmcm9tICd0ZXN0Y2FmZS1oYW1tZXJoZWFkJztcblxuY29uc3QgZ2V0QnJvd3NlckNvbm5lY3Rpb25EZWJ1Z1Njb3BlID0gKGlkOiBzdHJpbmcpOiBzdHJpbmcgPT4gYHRlc3RjYWZlOmJyb3dzZXI6Y29ubmVjdGlvbjoke2lkfWA7XG5cbmNvbnN0IElETEVfUEFHRV9URU1QTEFURSA9IHJlYWQoJy4uLy4uL2NsaWVudC9icm93c2VyL2lkbGUtcGFnZS9pbmRleC5odG1sLm11c3RhY2hlJyk7XG5cblxuaW50ZXJmYWNlIERpc2Nvbm5lY3Rpb25Qcm9taXNlPFQ+IGV4dGVuZHMgUHJvbWlzZTxUPiB7XG4gICAgcmVzb2x2ZTogRnVuY3Rpb247XG4gICAgcmVqZWN0OiBGdW5jdGlvbjtcbn1cblxuaW50ZXJmYWNlIEJyb3dzZXJDb25uZWN0aW9uU3RhdHVzUmVzdWx0IHtcbiAgICBjbWQ6IHN0cmluZztcbiAgICB1cmw6IHN0cmluZztcbn1cblxuaW50ZXJmYWNlIEhlYXJ0YmVhdFN0YXR1c1Jlc3VsdCB7XG4gICAgY29kZTogSGVhcnRiZWF0U3RhdHVzO1xuICAgIHVybDogc3RyaW5nO1xufVxuXG5pbnRlcmZhY2UgSW5pdFNjcmlwdCB7XG4gICAgY29kZTogc3RyaW5nIHwgbnVsbDtcbn1cblxuaW50ZXJmYWNlIEluaXRTY3JpcHRUYXNrIGV4dGVuZHMgSW5pdFNjcmlwdCB7XG4gICAgcmVzb2x2ZTogRnVuY3Rpb247XG59XG5cbmludGVyZmFjZSBQcm92aWRlck1ldGFJbmZvT3B0aW9ucyB7XG4gICAgYXBwZW5kVG9Vc2VyQWdlbnQ/OiBib29sZWFuO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEJyb3dzZXJDbG9zaW5nSW5mbyB7XG4gICAgaXNSZXN0YXJ0aW5nPzogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBCcm93c2VySW5mbyB7XG4gICAgYWxpYXM6IHN0cmluZztcbiAgICBicm93c2VyTmFtZTogc3RyaW5nO1xuICAgIGJyb3dzZXJPcHRpb246IHVua25vd247XG4gICAgcHJvdmlkZXJOYW1lOiBzdHJpbmc7XG4gICAgcHJvdmlkZXI6IEJyb3dzZXJQcm92aWRlcjtcbiAgICB1c2VyQWdlbnRQcm92aWRlck1ldGFJbmZvOiBzdHJpbmc7XG4gICAgcGFyc2VkVXNlckFnZW50OiBQYXJzZWRVc2VyQWdlbnQ7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEJyb3dzZXJDb25uZWN0aW9uIGV4dGVuZHMgRXZlbnRFbWl0dGVyIHtcbiAgICBwdWJsaWMgcGVybWFuZW50OiBib29sZWFuO1xuICAgIHB1YmxpYyBwcmV2aW91c0FjdGl2ZVdpbmRvd0lkOiBzdHJpbmcgfCBudWxsO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgZGlzYWJsZU11bHRpcGxlV2luZG93czogYm9vbGVhbjtcbiAgICBwdWJsaWMgcmVhZG9ubHkgcHJveHlsZXNzOiBib29sZWFuO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgSEVBUlRCRUFUX1RJTUVPVVQ6IG51bWJlcjtcbiAgICBwcml2YXRlIHJlYWRvbmx5IEJST1dTRVJfQ0xPU0VfVElNRU9VVDogbnVtYmVyO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgQlJPV1NFUl9SRVNUQVJUX1RJTUVPVVQ6IG51bWJlcjtcbiAgICBwdWJsaWMgcmVhZG9ubHkgaWQ6IHN0cmluZztcbiAgICBwcml2YXRlIHJlYWRvbmx5IGpvYlF1ZXVlOiBCcm93c2VySm9iW107XG4gICAgcHJpdmF0ZSByZWFkb25seSBpbml0U2NyaXB0c1F1ZXVlOiBJbml0U2NyaXB0VGFza1tdO1xuICAgIHB1YmxpYyBicm93c2VyQ29ubmVjdGlvbkdhdGV3YXk6IEJyb3dzZXJDb25uZWN0aW9uR2F0ZXdheTtcbiAgICBwcml2YXRlIGRpc2Nvbm5lY3Rpb25Qcm9taXNlOiBEaXNjb25uZWN0aW9uUHJvbWlzZTx2b2lkPiB8IG51bGw7XG4gICAgcHJpdmF0ZSB0ZXN0UnVuQWJvcnRlZDogYm9vbGVhbjtcbiAgICBwdWJsaWMgc3RhdHVzOiBCcm93c2VyQ29ubmVjdGlvblN0YXR1cztcbiAgICBwcml2YXRlIGhlYXJ0YmVhdFRpbWVvdXQ6IE5vZGVKUy5UaW1lb3V0IHwgbnVsbDtcbiAgICBwcml2YXRlIHBlbmRpbmdUZXN0UnVuVXJsOiBzdHJpbmcgfCBudWxsO1xuICAgIHB1YmxpYyB1cmwgPSAnJztcbiAgICBwdWJsaWMgaWRsZVVybCA9ICcnO1xuICAgIHByaXZhdGUgZm9yY2VkSWRsZVVybCA9ICcnO1xuICAgIHByaXZhdGUgaW5pdFNjcmlwdFVybCA9ICcnO1xuICAgIHB1YmxpYyBoZWFydGJlYXRVcmwgPSAnJztcbiAgICBwdWJsaWMgc3RhdHVzVXJsID0gJyc7XG4gICAgcHVibGljIGFjdGl2ZVdpbmRvd0lkVXJsID0gJyc7XG4gICAgcHVibGljIGNsb3NlV2luZG93VXJsID0gJyc7XG4gICAgcHVibGljIHN0YXR1c0RvbmVVcmwgPSAnJztcbiAgICBwdWJsaWMgaGVhcnRiZWF0UmVsYXRpdmVVcmwgPSAnJztcbiAgICBwdWJsaWMgc3RhdHVzUmVsYXRpdmVVcmwgPSAnJztcbiAgICBwdWJsaWMgc3RhdHVzRG9uZVJlbGF0aXZlVXJsID0gJyc7XG4gICAgcHJpdmF0ZSByZWFkb25seSBkZWJ1Z0xvZ2dlcjogZGVidWcuRGVidWdnZXI7XG4gICAgcHJpdmF0ZSBvc0luZm86IE9TSW5mbyB8IG51bGwgPSBudWxsO1xuXG4gICAgcHVibGljIHJlYWRvbmx5IHdhcm5pbmdMb2c6IFdhcm5pbmdMb2c7XG4gICAgcHJpdmF0ZSBfbWVzc2FnZUJ1cz86IE1lc3NhZ2VCdXM7XG5cbiAgICBwdWJsaWMgaWRsZTogYm9vbGVhbjtcblxuICAgIHB1YmxpYyBicm93c2VySW5mbzogQnJvd3NlckluZm87XG4gICAgcHVibGljIHByb3ZpZGVyOiBhbnk7XG5cbiAgICBwdWJsaWMgY29uc3RydWN0b3IgKFxuICAgICAgICBnYXRld2F5OiBCcm93c2VyQ29ubmVjdGlvbkdhdGV3YXksXG4gICAgICAgIGJyb3dzZXJJbmZvOiBCcm93c2VySW5mbyxcbiAgICAgICAgcGVybWFuZW50OiBib29sZWFuLFxuICAgICAgICBkaXNhYmxlTXVsdGlwbGVXaW5kb3dzID0gZmFsc2UsXG4gICAgICAgIHByb3h5bGVzcyA9IGZhbHNlLFxuICAgICAgICBtZXNzYWdlQnVzPzogTWVzc2FnZUJ1cykge1xuICAgICAgICBzdXBlcigpO1xuXG4gICAgICAgIHRoaXMuSEVBUlRCRUFUX1RJTUVPVVQgICAgICAgPSBIRUFSVEJFQVRfVElNRU9VVDtcbiAgICAgICAgdGhpcy5CUk9XU0VSX0NMT1NFX1RJTUVPVVQgICA9IEJST1dTRVJfQ0xPU0VfVElNRU9VVDtcbiAgICAgICAgdGhpcy5CUk9XU0VSX1JFU1RBUlRfVElNRU9VVCA9IEJST1dTRVJfUkVTVEFSVF9USU1FT1VUO1xuXG4gICAgICAgIHRoaXMuaWQgICAgICAgICAgICAgICAgICAgICAgID0gQnJvd3NlckNvbm5lY3Rpb24uX2dlbmVyYXRlSWQoKTtcbiAgICAgICAgdGhpcy5qb2JRdWV1ZSAgICAgICAgICAgICAgICAgPSBbXTtcbiAgICAgICAgdGhpcy5pbml0U2NyaXB0c1F1ZXVlICAgICAgICAgPSBbXTtcbiAgICAgICAgdGhpcy5icm93c2VyQ29ubmVjdGlvbkdhdGV3YXkgPSBnYXRld2F5O1xuICAgICAgICB0aGlzLmRpc2Nvbm5lY3Rpb25Qcm9taXNlICAgICA9IG51bGw7XG4gICAgICAgIHRoaXMudGVzdFJ1bkFib3J0ZWQgICAgICAgICAgID0gZmFsc2U7XG4gICAgICAgIHRoaXMuX21lc3NhZ2VCdXMgICAgICAgICAgICAgID0gbWVzc2FnZUJ1cztcbiAgICAgICAgdGhpcy53YXJuaW5nTG9nICAgICAgICAgICAgICAgPSBuZXcgV2FybmluZ0xvZyhudWxsLCBXYXJuaW5nTG9nLmNyZWF0ZUFkZFdhcm5pbmdDYWxsYmFjayh0aGlzLl9tZXNzYWdlQnVzKSk7XG4gICAgICAgIHRoaXMuZGVidWdMb2dnZXIgICAgICAgICAgICAgID0gZGVidWcoZ2V0QnJvd3NlckNvbm5lY3Rpb25EZWJ1Z1Njb3BlKHRoaXMuaWQpKTtcblxuICAgICAgICB0aGlzLmJyb3dzZXJJbmZvICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBicm93c2VySW5mbztcbiAgICAgICAgdGhpcy5icm93c2VySW5mby51c2VyQWdlbnRQcm92aWRlck1ldGFJbmZvID0gJyc7XG5cbiAgICAgICAgdGhpcy5wcm92aWRlciA9IGJyb3dzZXJJbmZvLnByb3ZpZGVyO1xuXG4gICAgICAgIHRoaXMucGVybWFuZW50ICAgICAgICAgICAgICA9IHBlcm1hbmVudDtcbiAgICAgICAgdGhpcy5zdGF0dXMgICAgICAgICAgICAgICAgID0gQnJvd3NlckNvbm5lY3Rpb25TdGF0dXMudW5pbml0aWFsaXplZDtcbiAgICAgICAgdGhpcy5pZGxlICAgICAgICAgICAgICAgICAgID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5oZWFydGJlYXRUaW1lb3V0ICAgICAgID0gbnVsbDtcbiAgICAgICAgdGhpcy5wZW5kaW5nVGVzdFJ1blVybCAgICAgID0gbnVsbDtcbiAgICAgICAgdGhpcy5kaXNhYmxlTXVsdGlwbGVXaW5kb3dzID0gZGlzYWJsZU11bHRpcGxlV2luZG93cztcbiAgICAgICAgdGhpcy5wcm94eWxlc3MgICAgICAgICAgICAgID0gcHJveHlsZXNzO1xuXG4gICAgICAgIHRoaXMuX2J1aWxkQ29tbXVuaWNhdGlvblVybHMoZ2F0ZXdheS5wcm94eSk7XG4gICAgICAgIHRoaXMuX3NldEV2ZW50SGFuZGxlcnMoKTtcblxuICAgICAgICBCcm93c2VyQ29ubmVjdGlvblRyYWNrZXIuYWRkKHRoaXMpO1xuXG4gICAgICAgIHRoaXMucHJldmlvdXNBY3RpdmVXaW5kb3dJZCA9IG51bGw7XG5cbiAgICAgICAgdGhpcy5icm93c2VyQ29ubmVjdGlvbkdhdGV3YXkuc3RhcnRTZXJ2aW5nQ29ubmVjdGlvbih0aGlzKTtcblxuICAgICAgICAvLyBOT1RFOiBHaXZlIGEgY2FsbGVyIHRpbWUgdG8gYXNzaWduIGV2ZW50IGxpc3RlbmVyc1xuICAgICAgICBwcm9jZXNzLm5leHRUaWNrKCgpID0+IHRoaXMuX3J1bkJyb3dzZXIoKSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfYnVpbGRDb21tdW5pY2F0aW9uVXJscyAocHJveHk6IFByb3h5KTogdm9pZCB7XG4gICAgICAgIHRoaXMudXJsICAgICAgICAgICAgICAgPSBwcm94eS5yZXNvbHZlUmVsYXRpdmVTZXJ2aWNlVXJsKGAvYnJvd3Nlci9jb25uZWN0LyR7dGhpcy5pZH1gKTtcbiAgICAgICAgdGhpcy5pZGxlVXJsICAgICAgICAgICA9IHByb3h5LnJlc29sdmVSZWxhdGl2ZVNlcnZpY2VVcmwoYC9icm93c2VyL2lkbGUvJHt0aGlzLmlkfWApO1xuICAgICAgICB0aGlzLmZvcmNlZElkbGVVcmwgICAgID0gcHJveHkucmVzb2x2ZVJlbGF0aXZlU2VydmljZVVybChgL2Jyb3dzZXIvaWRsZS1mb3JjZWQvJHt0aGlzLmlkfWApO1xuICAgICAgICB0aGlzLmluaXRTY3JpcHRVcmwgICAgID0gcHJveHkucmVzb2x2ZVJlbGF0aXZlU2VydmljZVVybChgL2Jyb3dzZXIvaW5pdC1zY3JpcHQvJHt0aGlzLmlkfWApO1xuXG4gICAgICAgIHRoaXMuaGVhcnRiZWF0UmVsYXRpdmVVcmwgID0gYC9icm93c2VyL2hlYXJ0YmVhdC8ke3RoaXMuaWR9YDtcbiAgICAgICAgdGhpcy5zdGF0dXNSZWxhdGl2ZVVybCAgICAgPSBgL2Jyb3dzZXIvc3RhdHVzLyR7dGhpcy5pZH1gO1xuICAgICAgICB0aGlzLnN0YXR1c0RvbmVSZWxhdGl2ZVVybCA9IGAvYnJvd3Nlci9zdGF0dXMtZG9uZS8ke3RoaXMuaWR9YDtcbiAgICAgICAgdGhpcy5hY3RpdmVXaW5kb3dJZFVybCAgICAgPSBgL2Jyb3dzZXIvYWN0aXZlLXdpbmRvdy1pZC8ke3RoaXMuaWR9YDtcbiAgICAgICAgdGhpcy5jbG9zZVdpbmRvd1VybCAgICAgICAgPSBgL2Jyb3dzZXIvY2xvc2Utd2luZG93LyR7dGhpcy5pZH1gO1xuXG4gICAgICAgIHRoaXMuaGVhcnRiZWF0VXJsICAgICAgPSBwcm94eS5yZXNvbHZlUmVsYXRpdmVTZXJ2aWNlVXJsKHRoaXMuaGVhcnRiZWF0UmVsYXRpdmVVcmwpO1xuICAgICAgICB0aGlzLnN0YXR1c1VybCAgICAgICAgID0gcHJveHkucmVzb2x2ZVJlbGF0aXZlU2VydmljZVVybCh0aGlzLnN0YXR1c1JlbGF0aXZlVXJsKTtcbiAgICAgICAgdGhpcy5zdGF0dXNEb25lVXJsICAgICA9IHByb3h5LnJlc29sdmVSZWxhdGl2ZVNlcnZpY2VVcmwodGhpcy5zdGF0dXNEb25lUmVsYXRpdmVVcmwpO1xuXG4gICAgfVxuXG4gICAgcHVibGljIHNldCBtZXNzYWdlQnVzIChtZXNzYWdlQnVzOiBNZXNzYWdlQnVzKSB7XG4gICAgICAgIHRoaXMuX21lc3NhZ2VCdXMgICAgICAgICA9IG1lc3NhZ2VCdXM7XG4gICAgICAgIHRoaXMud2FybmluZ0xvZy5jYWxsYmFjayA9IFdhcm5pbmdMb2cuY3JlYXRlQWRkV2FybmluZ0NhbGxiYWNrKHRoaXMuX21lc3NhZ2VCdXMpO1xuICAgIH1cblxuICAgIHByaXZhdGUgX3NldEV2ZW50SGFuZGxlcnMgKCk6IHZvaWQge1xuICAgICAgICB0aGlzLm9uKCdlcnJvcicsIGUgPT4ge1xuICAgICAgICAgICAgdGhpcy5kZWJ1Z0xvZ2dlcihlKTtcbiAgICAgICAgICAgIHRoaXMuX2ZvcmNlSWRsZSgpO1xuICAgICAgICAgICAgdGhpcy5jbG9zZSgpO1xuICAgICAgICB9KTtcblxuICAgICAgICBmb3IgKGNvbnN0IG5hbWUgaW4gQnJvd3NlckNvbm5lY3Rpb25TdGF0dXMpIHtcbiAgICAgICAgICAgIGNvbnN0IHN0YXR1cyA9IEJyb3dzZXJDb25uZWN0aW9uU3RhdHVzW25hbWUgYXMga2V5b2YgdHlwZW9mIEJyb3dzZXJDb25uZWN0aW9uU3RhdHVzXTtcblxuICAgICAgICAgICAgdGhpcy5vbihzdGF0dXMsICgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmRlYnVnTG9nZ2VyKGBzdGF0dXMgY2hhbmdlZCB0byAnJHtzdGF0dXN9J2ApO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIHN0YXRpYyBfZ2VuZXJhdGVJZCAoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIG5hbm9pZCg3KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIF9ydW5Ccm93c2VyICgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMucHJvdmlkZXIub3BlbkJyb3dzZXIodGhpcy5pZCwgdGhpcy51cmwsIHRoaXMuYnJvd3NlckluZm8uYnJvd3Nlck9wdGlvbiwgdGhpcy5kaXNhYmxlTXVsdGlwbGVXaW5kb3dzLCB0aGlzLnByb3h5bGVzcyk7XG5cbiAgICAgICAgICAgIGlmICh0aGlzLnN0YXR1cyAhPT0gQnJvd3NlckNvbm5lY3Rpb25TdGF0dXMucmVhZHkpXG4gICAgICAgICAgICAgICAgYXdhaXQgcHJvbWlzaWZ5RXZlbnQodGhpcywgJ3JlYWR5Jyk7XG5cbiAgICAgICAgICAgIHRoaXMuc3RhdHVzID0gQnJvd3NlckNvbm5lY3Rpb25TdGF0dXMub3BlbmVkO1xuICAgICAgICAgICAgdGhpcy5lbWl0KCdvcGVuZWQnKTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICB0aGlzLmVtaXQoJ2Vycm9yJywgbmV3IEdlbmVyYWxFcnJvcihcbiAgICAgICAgICAgICAgICBSVU5USU1FX0VSUk9SUy51bmFibGVUb09wZW5Ccm93c2VyLFxuICAgICAgICAgICAgICAgIHRoaXMuYnJvd3NlckluZm8ucHJvdmlkZXJOYW1lICsgJzonICsgdGhpcy5icm93c2VySW5mby5icm93c2VyTmFtZSxcbiAgICAgICAgICAgICAgICBlcnIuc3RhY2tcbiAgICAgICAgICAgICkpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBfY2xvc2VCcm93c2VyIChkYXRhOiBCcm93c2VyQ2xvc2luZ0luZm8gPSB7fSk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBpZiAoIXRoaXMuaWRsZSlcbiAgICAgICAgICAgIGF3YWl0IHByb21pc2lmeUV2ZW50KHRoaXMsICdpZGxlJyk7XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMucHJvdmlkZXIuY2xvc2VCcm93c2VyKHRoaXMuaWQsIGRhdGEpO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgIC8vIE5PVEU6IEEgd2FybmluZyB3b3VsZCBiZSByZWFsbHkgbmljZSBoZXJlLCBidXQgaXQgY2FuJ3QgYmUgZG9uZSB3aGlsZSBsb2cgaXMgc3RvcmVkIGluIGEgdGFzay5cbiAgICAgICAgICAgIHRoaXMuZGVidWdMb2dnZXIoZXJyKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgX2ZvcmNlSWRsZSAoKTogdm9pZCB7XG4gICAgICAgIGlmICghdGhpcy5pZGxlKSB7XG4gICAgICAgICAgICB0aGlzLmlkbGUgPSB0cnVlO1xuXG4gICAgICAgICAgICB0aGlzLmVtaXQoJ2lkbGUnKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgX2NyZWF0ZUJyb3dzZXJEaXNjb25uZWN0ZWRFcnJvciAoKTogR2VuZXJhbEVycm9yIHtcbiAgICAgICAgcmV0dXJuIG5ldyBHZW5lcmFsRXJyb3IoUlVOVElNRV9FUlJPUlMuYnJvd3NlckRpc2Nvbm5lY3RlZCwgdGhpcy51c2VyQWdlbnQpO1xuICAgIH1cblxuICAgIHByaXZhdGUgX3dhaXRGb3JIZWFydGJlYXQgKCk6IHZvaWQge1xuICAgICAgICB0aGlzLmhlYXJ0YmVhdFRpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGVyciA9IHRoaXMuX2NyZWF0ZUJyb3dzZXJEaXNjb25uZWN0ZWRFcnJvcigpO1xuXG4gICAgICAgICAgICB0aGlzLnN0YXR1cyAgICAgICAgID0gQnJvd3NlckNvbm5lY3Rpb25TdGF0dXMuZGlzY29ubmVjdGVkO1xuICAgICAgICAgICAgdGhpcy50ZXN0UnVuQWJvcnRlZCA9IHRydWU7XG5cbiAgICAgICAgICAgIHRoaXMuZW1pdCgnZGlzY29ubmVjdGVkJywgZXJyKTtcblxuICAgICAgICAgICAgdGhpcy5fcmVzdGFydEJyb3dzZXJPbkRpc2Nvbm5lY3QoZXJyKTtcbiAgICAgICAgfSwgdGhpcy5IRUFSVEJFQVRfVElNRU9VVCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBfZ2V0VGVzdFJ1blVybCAobmVlZFBvcE5leHQ6IGJvb2xlYW4pOiBQcm9taXNlPHN0cmluZz4ge1xuICAgICAgICBpZiAobmVlZFBvcE5leHQgfHwgIXRoaXMucGVuZGluZ1Rlc3RSdW5VcmwpXG4gICAgICAgICAgICB0aGlzLnBlbmRpbmdUZXN0UnVuVXJsID0gYXdhaXQgdGhpcy5fcG9wTmV4dFRlc3RSdW5VcmwoKTtcblxuICAgICAgICByZXR1cm4gdGhpcy5wZW5kaW5nVGVzdFJ1blVybCBhcyBzdHJpbmc7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBfcG9wTmV4dFRlc3RSdW5VcmwgKCk6IFByb21pc2U8c3RyaW5nIHwgbnVsbD4ge1xuICAgICAgICB3aGlsZSAodGhpcy5oYXNRdWV1ZWRKb2JzICYmICF0aGlzLmN1cnJlbnRKb2IuaGFzUXVldWVkVGVzdFJ1bnMpXG4gICAgICAgICAgICB0aGlzLmpvYlF1ZXVlLnNoaWZ0KCk7XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuaGFzUXVldWVkSm9icyA/IGF3YWl0IHRoaXMuY3VycmVudEpvYi5wb3BOZXh0VGVzdFJ1blVybCh0aGlzKSA6IG51bGw7XG4gICAgfVxuXG4gICAgcHVibGljIGdldEN1cnJlbnRUZXN0UnVuICgpOiBMZWdhY3lUZXN0UnVuIHwgVGVzdFJ1biB8IG51bGwge1xuICAgICAgICByZXR1cm4gdGhpcy5jdXJyZW50Sm9iID8gdGhpcy5jdXJyZW50Sm9iLmN1cnJlbnRUZXN0UnVuIDogbnVsbDtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGdldEJ5SWQgKGlkOiBzdHJpbmcpOiBCcm93c2VyQ29ubmVjdGlvbiB8IG51bGwge1xuICAgICAgICByZXR1cm4gQnJvd3NlckNvbm5lY3Rpb25UcmFja2VyLmFjdGl2ZUJyb3dzZXJDb25uZWN0aW9uc1tpZF0gfHwgbnVsbDtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIF9yZXN0YXJ0QnJvd3NlciAoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIHRoaXMuc3RhdHVzID0gQnJvd3NlckNvbm5lY3Rpb25TdGF0dXMudW5pbml0aWFsaXplZDtcblxuICAgICAgICB0aGlzLl9mb3JjZUlkbGUoKTtcblxuICAgICAgICBsZXQgcmVzb2x2ZVRpbWVvdXQ6IEZ1bmN0aW9uIHwgbnVsbCA9IG51bGw7XG4gICAgICAgIGxldCBpc1RpbWVvdXRFeHBpcmVkICAgICAgICAgICAgICAgID0gZmFsc2U7XG4gICAgICAgIGxldCB0aW1lb3V0OiBOb2RlSlMuVGltZW91dCB8IG51bGwgID0gbnVsbDtcblxuICAgICAgICBjb25zdCByZXN0YXJ0UHJvbWlzZSA9IHRpbWVMaW1pdCh0aGlzLl9jbG9zZUJyb3dzZXIoeyBpc1Jlc3RhcnRpbmc6IHRydWUgfSksIHRoaXMuQlJPV1NFUl9DTE9TRV9USU1FT1VULCB7IHJlamVjdFdpdGg6IG5ldyBUaW1lb3V0RXJyb3IoKSB9KVxuICAgICAgICAgICAgLmNhdGNoKGVyciA9PiB0aGlzLmRlYnVnTG9nZ2VyKGVycikpXG4gICAgICAgICAgICAudGhlbigoKSA9PiB0aGlzLl9ydW5Ccm93c2VyKCkpO1xuXG4gICAgICAgIGNvbnN0IHRpbWVvdXRQcm9taXNlID0gbmV3IFByb21pc2UocmVzb2x2ZSA9PiB7XG4gICAgICAgICAgICByZXNvbHZlVGltZW91dCA9IHJlc29sdmU7XG5cbiAgICAgICAgICAgIHRpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICBpc1RpbWVvdXRFeHBpcmVkID0gdHJ1ZTtcblxuICAgICAgICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgICAgIH0sIHRoaXMuQlJPV1NFUl9SRVNUQVJUX1RJTUVPVVQpO1xuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gUHJvbWlzZS5yYWNlKFtyZXN0YXJ0UHJvbWlzZSwgdGltZW91dFByb21pc2VdKVxuICAgICAgICAgICAgLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aW1lb3V0IGFzIE5vZGVKUy5UaW1lb3V0KTtcblxuICAgICAgICAgICAgICAgIGlmIChpc1RpbWVvdXRFeHBpcmVkKVxuICAgICAgICAgICAgICAgICAgICB0aGlzLmVtaXQoJ2Vycm9yJywgdGhpcy5fY3JlYXRlQnJvd3NlckRpc2Nvbm5lY3RlZEVycm9yKCkpO1xuICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgKHJlc29sdmVUaW1lb3V0IGFzIEZ1bmN0aW9uKSgpO1xuICAgICAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfcmVzdGFydEJyb3dzZXJPbkRpc2Nvbm5lY3QgKGVycjogRXJyb3IpOiB2b2lkIHtcbiAgICAgICAgbGV0IHJlc29sdmVGbjogRnVuY3Rpb24gfCBudWxsID0gbnVsbDtcbiAgICAgICAgbGV0IHJlamVjdEZuOiBGdW5jdGlvbiB8IG51bGwgID0gbnVsbDtcblxuICAgICAgICB0aGlzLmRpc2Nvbm5lY3Rpb25Qcm9taXNlID0gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgcmVzb2x2ZUZuID0gcmVzb2x2ZTtcblxuICAgICAgICAgICAgcmVqZWN0Rm4gPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgcmVqZWN0KGVycik7XG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICAocmVqZWN0Rm4gYXMgRnVuY3Rpb24pKCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSlcbiAgICAgICAgICAgIC50aGVuKCgpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fcmVzdGFydEJyb3dzZXIoKTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAuY2F0Y2goZSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5lbWl0KCdlcnJvcicsIGUpO1xuICAgICAgICAgICAgfSkgYXMgRGlzY29ubmVjdGlvblByb21pc2U8dm9pZD47XG5cbiAgICAgICAgdGhpcy5kaXNjb25uZWN0aW9uUHJvbWlzZS5yZXNvbHZlID0gcmVzb2x2ZUZuIGFzIHVua25vd24gYXMgRnVuY3Rpb247XG4gICAgICAgIHRoaXMuZGlzY29ubmVjdGlvblByb21pc2UucmVqZWN0ICA9IHJlamVjdEZuIGFzIHVua25vd24gYXMgRnVuY3Rpb247XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGdldERlZmF1bHRCcm93c2VySW5pdFRpbWVvdXQgKCk6IFByb21pc2U8bnVtYmVyPiB7XG4gICAgICAgIGNvbnN0IGlzTG9jYWxCcm93c2VyID0gYXdhaXQgdGhpcy5wcm92aWRlci5pc0xvY2FsQnJvd3Nlcih0aGlzLmlkLCB0aGlzLmJyb3dzZXJJbmZvLmJyb3dzZXJOYW1lKTtcblxuICAgICAgICByZXR1cm4gaXNMb2NhbEJyb3dzZXIgPyBMT0NBTF9CUk9XU0VSX0lOSVRfVElNRU9VVCA6IFJFTU9URV9CUk9XU0VSX0lOSVRfVElNRU9VVDtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgcHJvY2Vzc0Rpc2Nvbm5lY3Rpb24gKGRpc2Nvbm5lY3Rpb25UaHJlc2hvbGRFeGNlZWRlZDogYm9vbGVhbik6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBjb25zdCB7IHJlc29sdmUsIHJlamVjdCB9ID0gdGhpcy5kaXNjb25uZWN0aW9uUHJvbWlzZSBhcyBEaXNjb25uZWN0aW9uUHJvbWlzZTx2b2lkPjtcblxuICAgICAgICBpZiAoZGlzY29ubmVjdGlvblRocmVzaG9sZEV4Y2VlZGVkKVxuICAgICAgICAgICAgcmVqZWN0KCk7XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIHJlc29sdmUoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYWRkV2FybmluZyAobWVzc2FnZTogc3RyaW5nLCAuLi5hcmdzOiBhbnlbXSk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5jdXJyZW50Sm9iKVxuICAgICAgICAgICAgdGhpcy5jdXJyZW50Sm9iLndhcm5pbmdMb2cuYWRkV2FybmluZyhtZXNzYWdlLCAuLi5hcmdzKTtcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgdGhpcy53YXJuaW5nTG9nLmFkZFdhcm5pbmcobWVzc2FnZSwgLi4uYXJncyk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfYXBwZW5kVG9QcmV0dHlVc2VyQWdlbnQgKHN0cjogc3RyaW5nKTogdm9pZCB7XG4gICAgICAgIHRoaXMuYnJvd3NlckluZm8ucGFyc2VkVXNlckFnZW50LnByZXR0eVVzZXJBZ2VudCArPSBgICgke3N0cn0pYDtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9tb3ZlV2FybmluZ0xvZ1RvSm9iIChqb2I6IEJyb3dzZXJKb2IpOiB2b2lkIHtcbiAgICAgICAgam9iLndhcm5pbmdMb2cuY29weUZyb20odGhpcy53YXJuaW5nTG9nKTtcbiAgICAgICAgdGhpcy53YXJuaW5nTG9nLmNsZWFyKCk7XG4gICAgfVxuXG4gICAgcHVibGljIHNldFByb3ZpZGVyTWV0YUluZm8gKHN0cjogc3RyaW5nLCBvcHRpb25zPzogUHJvdmlkZXJNZXRhSW5mb09wdGlvbnMpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgYXBwZW5kVG9Vc2VyQWdlbnQgPSBvcHRpb25zPy5hcHBlbmRUb1VzZXJBZ2VudCBhcyBib29sZWFuO1xuXG4gICAgICAgIGlmIChhcHBlbmRUb1VzZXJBZ2VudCkge1xuICAgICAgICAgICAgLy8gTk9URTpcbiAgICAgICAgICAgIC8vIGNoYW5nZSBwcmV0dHlVc2VyQWdlbnQgb25seSB3aGVuIGNvbm5lY3Rpb24gYWxyZWFkeSB3YXMgZXN0YWJsaXNoZWRcbiAgICAgICAgICAgIGlmICh0aGlzLmlzUmVhZHkoKSlcbiAgICAgICAgICAgICAgICB0aGlzLl9hcHBlbmRUb1ByZXR0eVVzZXJBZ2VudChzdHIpO1xuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgIHRoaXMub24oJ3JlYWR5JywgKCkgPT4gdGhpcy5fYXBwZW5kVG9QcmV0dHlVc2VyQWdlbnQoc3RyKSk7XG5cbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuYnJvd3NlckluZm8udXNlckFnZW50UHJvdmlkZXJNZXRhSW5mbyA9IHN0cjtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IHVzZXJBZ2VudCAoKTogc3RyaW5nIHtcbiAgICAgICAgbGV0IHVzZXJBZ2VudCA9IHRoaXMuYnJvd3NlckluZm8ucGFyc2VkVXNlckFnZW50LnByZXR0eVVzZXJBZ2VudDtcblxuICAgICAgICBpZiAodGhpcy5icm93c2VySW5mby51c2VyQWdlbnRQcm92aWRlck1ldGFJbmZvKVxuICAgICAgICAgICAgdXNlckFnZW50ICs9IGAgKCR7dGhpcy5icm93c2VySW5mby51c2VyQWdlbnRQcm92aWRlck1ldGFJbmZvfSlgO1xuXG4gICAgICAgIHJldHVybiB1c2VyQWdlbnQ7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBjb25uZWN0aW9uSW5mbyAoKTogc3RyaW5nIHtcbiAgICAgICAgaWYgKCF0aGlzLm9zSW5mbylcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnVzZXJBZ2VudDtcblxuICAgICAgICBjb25zdCB7IG5hbWUsIHZlcnNpb24gfSA9IHRoaXMuYnJvd3NlckluZm8ucGFyc2VkVXNlckFnZW50O1xuICAgICAgICBsZXQgY29ubmVjdGlvbkluZm8gICAgICA9IGNhbGN1bGF0ZVByZXR0eVVzZXJBZ2VudCh7IG5hbWUsIHZlcnNpb24gfSwgdGhpcy5vc0luZm8pO1xuICAgICAgICBjb25zdCBtZXRhSW5mbyAgICAgICAgICA9IHRoaXMuYnJvd3NlckluZm8udXNlckFnZW50UHJvdmlkZXJNZXRhSW5mbyB8fCBleHRyYWN0TWV0YUluZm8odGhpcy5icm93c2VySW5mby5wYXJzZWRVc2VyQWdlbnQucHJldHR5VXNlckFnZW50KTtcblxuICAgICAgICBpZiAobWV0YUluZm8pXG4gICAgICAgICAgICBjb25uZWN0aW9uSW5mbyArPSBgICgkeyBtZXRhSW5mbyB9KWA7XG5cbiAgICAgICAgcmV0dXJuIGNvbm5lY3Rpb25JbmZvO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgcmV0cnlUZXN0UGFnZXMgKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5icm93c2VyQ29ubmVjdGlvbkdhdGV3YXkucmV0cnlUZXN0UGFnZXM7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBoYXNRdWV1ZWRKb2JzICgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuICEhdGhpcy5qb2JRdWV1ZS5sZW5ndGg7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBjdXJyZW50Sm9iICgpOiBCcm93c2VySm9iIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuam9iUXVldWVbMF07XG4gICAgfVxuXG4gICAgLy8gQVBJXG4gICAgcHVibGljIHJ1bkluaXRTY3JpcHQgKGNvZGU6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nIHwgdW5rbm93bj4ge1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UocmVzb2x2ZSA9PiB0aGlzLmluaXRTY3JpcHRzUXVldWUucHVzaCh7IGNvZGUsIHJlc29sdmUgfSkpO1xuICAgIH1cblxuICAgIHB1YmxpYyBhZGRKb2IgKGpvYjogQnJvd3NlckpvYik6IHZvaWQge1xuICAgICAgICB0aGlzLmpvYlF1ZXVlLnB1c2goam9iKTtcblxuICAgICAgICB0aGlzLl9tb3ZlV2FybmluZ0xvZ1RvSm9iKGpvYik7XG4gICAgfVxuXG4gICAgcHVibGljIHJlbW92ZUpvYiAoam9iOiBCcm93c2VySm9iKTogdm9pZCB7XG4gICAgICAgIHJlbW92ZSh0aGlzLmpvYlF1ZXVlLCBqb2IpO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBjbG9zZSAoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGlmICh0aGlzLnN0YXR1cyA9PT0gQnJvd3NlckNvbm5lY3Rpb25TdGF0dXMuY2xvc2luZyB8fCB0aGlzLnN0YXR1cyA9PT0gQnJvd3NlckNvbm5lY3Rpb25TdGF0dXMuY2xvc2VkKVxuICAgICAgICAgICAgcmV0dXJuO1xuXG4gICAgICAgIHRoaXMuc3RhdHVzID0gQnJvd3NlckNvbm5lY3Rpb25TdGF0dXMuY2xvc2luZztcbiAgICAgICAgdGhpcy5lbWl0KEJyb3dzZXJDb25uZWN0aW9uU3RhdHVzLmNsb3NpbmcpO1xuXG4gICAgICAgIGF3YWl0IHRoaXMuX2Nsb3NlQnJvd3NlcigpO1xuXG4gICAgICAgIHRoaXMuYnJvd3NlckNvbm5lY3Rpb25HYXRld2F5LnN0b3BTZXJ2aW5nQ29ubmVjdGlvbih0aGlzKTtcblxuICAgICAgICBpZiAodGhpcy5oZWFydGJlYXRUaW1lb3V0KVxuICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuaGVhcnRiZWF0VGltZW91dCk7XG5cbiAgICAgICAgQnJvd3NlckNvbm5lY3Rpb25UcmFja2VyLnJlbW92ZSh0aGlzKTtcblxuICAgICAgICB0aGlzLnN0YXR1cyA9IEJyb3dzZXJDb25uZWN0aW9uU3RhdHVzLmNsb3NlZDtcbiAgICAgICAgdGhpcy5lbWl0KEJyb3dzZXJDb25uZWN0aW9uU3RhdHVzLmNsb3NlZCk7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGVzdGFibGlzaCAodXNlckFnZW50OiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgdGhpcy5zdGF0dXMgICAgICAgICAgICAgICAgICAgICAgPSBCcm93c2VyQ29ubmVjdGlvblN0YXR1cy5yZWFkeTtcbiAgICAgICAgdGhpcy5icm93c2VySW5mby5wYXJzZWRVc2VyQWdlbnQgPSBwYXJzZVVzZXJBZ2VudCh1c2VyQWdlbnQpO1xuICAgICAgICB0aGlzLm9zSW5mbyAgICAgICAgICAgICAgICAgICAgICA9IGF3YWl0IHRoaXMucHJvdmlkZXIuZ2V0T1NJbmZvKHRoaXMuaWQpO1xuXG4gICAgICAgIHRoaXMuX3dhaXRGb3JIZWFydGJlYXQoKTtcbiAgICAgICAgdGhpcy5lbWl0KCdyZWFkeScpO1xuICAgIH1cblxuICAgIHB1YmxpYyBoZWFydGJlYXQgKCk6IEhlYXJ0YmVhdFN0YXR1c1Jlc3VsdCB7XG4gICAgICAgIGlmICh0aGlzLmhlYXJ0YmVhdFRpbWVvdXQpXG4gICAgICAgICAgICBjbGVhclRpbWVvdXQodGhpcy5oZWFydGJlYXRUaW1lb3V0KTtcblxuICAgICAgICB0aGlzLl93YWl0Rm9ySGVhcnRiZWF0KCk7XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGNvZGU6IHRoaXMuc3RhdHVzID09PSBCcm93c2VyQ29ubmVjdGlvblN0YXR1cy5jbG9zaW5nID8gSGVhcnRiZWF0U3RhdHVzLmNsb3NpbmcgOiBIZWFydGJlYXRTdGF0dXMub2ssXG4gICAgICAgICAgICB1cmw6ICB0aGlzLnN0YXR1cyA9PT0gQnJvd3NlckNvbm5lY3Rpb25TdGF0dXMuY2xvc2luZyA/IHRoaXMuaWRsZVVybCA6ICcnLFxuICAgICAgICB9O1xuICAgIH1cblxuICAgIHB1YmxpYyByZW5kZXJJZGxlUGFnZSAoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIE11c3RhY2hlLnJlbmRlcihJRExFX1BBR0VfVEVNUExBVEUgYXMgc3RyaW5nLCB7XG4gICAgICAgICAgICB1c2VyQWdlbnQ6ICAgICAgdGhpcy5jb25uZWN0aW9uSW5mbyxcbiAgICAgICAgICAgIHN0YXR1c1VybDogICAgICB0aGlzLnN0YXR1c1VybCxcbiAgICAgICAgICAgIGhlYXJ0YmVhdFVybDogICB0aGlzLmhlYXJ0YmVhdFVybCxcbiAgICAgICAgICAgIGluaXRTY3JpcHRVcmw6ICB0aGlzLmluaXRTY3JpcHRVcmwsXG4gICAgICAgICAgICByZXRyeVRlc3RQYWdlczogISF0aGlzLmJyb3dzZXJDb25uZWN0aW9uR2F0ZXdheS5yZXRyeVRlc3RQYWdlcyxcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldEluaXRTY3JpcHQgKCk6IEluaXRTY3JpcHQge1xuICAgICAgICBjb25zdCBpbml0U2NyaXB0UHJvbWlzZSA9IHRoaXMuaW5pdFNjcmlwdHNRdWV1ZVswXTtcblxuICAgICAgICByZXR1cm4geyBjb2RlOiBpbml0U2NyaXB0UHJvbWlzZSA/IGluaXRTY3JpcHRQcm9taXNlLmNvZGUgOiBudWxsIH07XG4gICAgfVxuXG4gICAgcHVibGljIGhhbmRsZUluaXRTY3JpcHRSZXN1bHQgKGRhdGE6IHN0cmluZyk6IHZvaWQge1xuICAgICAgICBjb25zdCBpbml0U2NyaXB0UHJvbWlzZSA9IHRoaXMuaW5pdFNjcmlwdHNRdWV1ZS5zaGlmdCgpO1xuXG4gICAgICAgIGlmIChpbml0U2NyaXB0UHJvbWlzZSlcbiAgICAgICAgICAgIGluaXRTY3JpcHRQcm9taXNlLnJlc29sdmUoSlNPTi5wYXJzZShkYXRhKSk7XG4gICAgfVxuXG4gICAgcHVibGljIGlzSGVhZGxlc3NCcm93c2VyICgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucHJvdmlkZXIuaXNIZWFkbGVzc0Jyb3dzZXIodGhpcy5pZCk7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIHJlcG9ydEpvYlJlc3VsdCAoc3RhdHVzOiBzdHJpbmcsIGRhdGE6IGFueSk6IFByb21pc2U8YW55PiB7XG4gICAgICAgIGF3YWl0IHRoaXMucHJvdmlkZXIucmVwb3J0Sm9iUmVzdWx0KHRoaXMuaWQsIHN0YXR1cywgZGF0YSk7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGdldFN0YXR1cyAoaXNUZXN0RG9uZTogYm9vbGVhbik6IFByb21pc2U8QnJvd3NlckNvbm5lY3Rpb25TdGF0dXNSZXN1bHQ+IHtcbiAgICAgICAgaWYgKCF0aGlzLmlkbGUgJiYgIWlzVGVzdERvbmUpIHtcbiAgICAgICAgICAgIHRoaXMuaWRsZSA9IHRydWU7XG4gICAgICAgICAgICB0aGlzLmVtaXQoJ2lkbGUnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLnN0YXR1cyA9PT0gQnJvd3NlckNvbm5lY3Rpb25TdGF0dXMub3BlbmVkKSB7XG4gICAgICAgICAgICBjb25zdCB0ZXN0UnVuVXJsID0gYXdhaXQgdGhpcy5fZ2V0VGVzdFJ1blVybChpc1Rlc3REb25lIHx8IHRoaXMudGVzdFJ1bkFib3J0ZWQpO1xuXG4gICAgICAgICAgICB0aGlzLnRlc3RSdW5BYm9ydGVkID0gZmFsc2U7XG5cbiAgICAgICAgICAgIGlmICh0ZXN0UnVuVXJsKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5pZGxlID0gZmFsc2U7XG5cbiAgICAgICAgICAgICAgICByZXR1cm4geyBjbWQ6IENPTU1BTkQucnVuLCB1cmw6IHRlc3RSdW5VcmwgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB7IGNtZDogQ09NTUFORC5pZGxlLCB1cmw6IHRoaXMuaWRsZVVybCB9O1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgYWN0aXZlV2luZG93SWQgKCk6IG51bGwgfCBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy5wcm92aWRlci5nZXRBY3RpdmVXaW5kb3dJZCh0aGlzLmlkKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0IGFjdGl2ZVdpbmRvd0lkICh2YWwpIHtcbiAgICAgICAgdGhpcy5wcmV2aW91c0FjdGl2ZVdpbmRvd0lkID0gdGhpcy5hY3RpdmVXaW5kb3dJZDtcblxuICAgICAgICB0aGlzLnByb3ZpZGVyLnNldEFjdGl2ZVdpbmRvd0lkKHRoaXMuaWQsIHZhbCk7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGNhblVzZURlZmF1bHRXaW5kb3dBY3Rpb25zICgpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMucHJvdmlkZXIuY2FuVXNlRGVmYXVsdFdpbmRvd0FjdGlvbnModGhpcy5pZCk7XG4gICAgfVxuXG4gICAgcHVibGljIGlzUmVhZHkgKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5zdGF0dXMgPT09IEJyb3dzZXJDb25uZWN0aW9uU3RhdHVzLnJlYWR5IHx8XG4gICAgICAgICAgICB0aGlzLnN0YXR1cyA9PT0gQnJvd3NlckNvbm5lY3Rpb25TdGF0dXMub3BlbmVkIHx8XG4gICAgICAgICAgICB0aGlzLnN0YXR1cyA9PT0gQnJvd3NlckNvbm5lY3Rpb25TdGF0dXMuY2xvc2luZztcbiAgICB9XG59XG4iXX0=