testcafe 2.2.0 → 2.3.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 (93) hide show
  1. package/CHANGELOG.md +82 -0
  2. package/bin/testcafe-with-v8-flag-filter.js +16 -3
  3. package/lib/api/exportable-lib/index.mjs +27 -0
  4. package/lib/api/structure/fixture.js +7 -3
  5. package/lib/api/structure/test.js +8 -3
  6. package/lib/api/structure/testing-unit.js +15 -1
  7. package/lib/api/test-controller/index.js +4 -4
  8. package/lib/browser/connection/gateway.js +13 -1
  9. package/lib/browser/connection/index.js +10 -1
  10. package/lib/browser/connection/service-routes.js +2 -1
  11. package/lib/browser/provider/built-in/dedicated/chrome/index.js +6 -1
  12. package/lib/browser/provider/index.js +4 -1
  13. package/lib/cli/argument-parser/index.js +58 -59
  14. package/lib/cli/cli.js +3 -2
  15. package/lib/client/automation/index.js +90 -4
  16. package/lib/client/automation/index.min.js +1 -1
  17. package/lib/client/browser/idle-page/index.js +7 -5
  18. package/lib/client/core/deps/hammerhead.js +24 -0
  19. package/lib/client/core/index.js +42 -7
  20. package/lib/client/core/index.min.js +1 -1
  21. package/lib/client/core/utils/values/axis-values.js +43 -0
  22. package/lib/client/driver/index.js +336 -211
  23. package/lib/client/driver/index.min.js +1 -1
  24. package/lib/client/test-run/iframe.js.mustache +2 -1
  25. package/lib/client/test-run/index.js.mustache +30 -28
  26. package/lib/client/ui/index.js +33 -23
  27. package/lib/client/ui/index.min.js +1 -1
  28. package/lib/compiler/babel/load-libs.js +10 -9
  29. package/lib/compiler/compilers.js +7 -7
  30. package/lib/compiler/esm-loader.js +38 -0
  31. package/lib/compiler/index.js +8 -7
  32. package/lib/compiler/interfaces.js +1 -1
  33. package/lib/compiler/prevent-module-caching-suffix.js +6 -0
  34. package/lib/compiler/test-file/add-export-api.js +3 -9
  35. package/lib/compiler/test-file/api-based.js +30 -14
  36. package/lib/compiler/test-file/base.js +4 -1
  37. package/lib/compiler/test-file/formats/coffeescript/compiler.js +5 -4
  38. package/lib/compiler/test-file/formats/es-next/compiler.js +21 -11
  39. package/lib/compiler/test-file/formats/extensions.js +15 -0
  40. package/lib/compiler/test-file/formats/typescript/compiler.js +27 -17
  41. package/lib/compiler/test-file/get-exportable-lib-path.js +17 -0
  42. package/lib/configuration/option-names.js +2 -1
  43. package/lib/custom-client-scripts/get-code.js +4 -3
  44. package/lib/custom-client-scripts/routing.js +3 -3
  45. package/lib/errors/is-internal-stack-frame.js +3 -2
  46. package/lib/errors/process-test-fn-error.js +3 -2
  47. package/lib/errors/runtime/index.js +18 -4
  48. package/lib/errors/runtime/templates.js +2 -1
  49. package/lib/errors/test-run/utils.js +8 -3
  50. package/lib/errors/types.js +2 -1
  51. package/lib/proxyless/api-base.js +25 -0
  52. package/lib/proxyless/client/event-simulator.js +40 -0
  53. package/lib/proxyless/client/types.js +11 -0
  54. package/lib/proxyless/client/utils.js +24 -0
  55. package/lib/proxyless/cookie-provider.js +3 -3
  56. package/lib/proxyless/index.js +20 -2
  57. package/lib/proxyless/request-hooks/event-factory/frame-navigated-event-based.js +40 -0
  58. package/lib/proxyless/request-hooks/event-factory/request-paused-event-based.js +95 -0
  59. package/lib/proxyless/request-hooks/event-provider.js +6 -54
  60. package/lib/proxyless/request-pipeline/context-info.js +55 -0
  61. package/lib/proxyless/request-pipeline/index.js +73 -31
  62. package/lib/proxyless/request-pipeline/resendAuthRequest.js +23 -0
  63. package/lib/proxyless/request-pipeline/special-handlers.js +2 -2
  64. package/lib/proxyless/request-pipeline/test-run-bridge.js +45 -0
  65. package/lib/proxyless/resource-injector.js +41 -29
  66. package/lib/proxyless/session-storage/index.js +39 -0
  67. package/lib/proxyless/storages-provider.js +17 -0
  68. package/lib/proxyless/types.js +8 -1
  69. package/lib/proxyless/utils/cdp.js +29 -2
  70. package/lib/proxyless/utils/get-active-client.js +8 -0
  71. package/lib/runner/bootstrapper.js +3 -2
  72. package/lib/runner/browser-job.js +1 -1
  73. package/lib/runner/task/index.js +2 -2
  74. package/lib/services/compiler/service.js +4 -4
  75. package/lib/services/utils/ipc/interfaces.js +1 -1
  76. package/lib/services/utils/ipc/proxy.js +1 -4
  77. package/lib/shared/utils/is-file-protocol.js +9 -0
  78. package/lib/test-run/commands/actions.js +2 -2
  79. package/lib/test-run/index.js +21 -6
  80. package/lib/test-run/request/send.js +20 -13
  81. package/lib/test-run/storages/base.js +16 -0
  82. package/lib/test-run/storages/factory.js +12 -0
  83. package/lib/testcafe.js +3 -3
  84. package/lib/utils/async-event-emitter.js +1 -1
  85. package/lib/utils/convert-to-best-fit-type.js +1 -1
  86. package/lib/utils/get-options/base.js +1 -1
  87. package/lib/utils/setup-sourcemap-support.js +10 -4
  88. package/package.json +13 -8
  89. package/ts-defs/index.d.ts +4 -4
  90. package/ts-defs/selectors.d.ts +2 -2
  91. package/ts-defs/testcafe-scripts.d.ts +2 -2
  92. package/lib/compiler/test-file/exportble-lib-path.js +0 -7
  93. package/lib/proxyless/request-hooks/event-factory.js +0 -95
@@ -0,0 +1,45 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const connection_1 = __importDefault(require("../../browser/connection"));
7
+ class TestRunBridge {
8
+ constructor(browserId) {
9
+ this._browserId = browserId;
10
+ }
11
+ getBrowserConnection() {
12
+ return connection_1.default.getById(this._browserId);
13
+ }
14
+ getCurrentTestRun() {
15
+ const browserConnection = this.getBrowserConnection();
16
+ return browserConnection.getCurrentTestRun();
17
+ }
18
+ getSessionId() {
19
+ var _a;
20
+ return ((_a = this.getCurrentTestRun()) === null || _a === void 0 ? void 0 : _a.id) || '';
21
+ }
22
+ getUserScripts() {
23
+ const currentTestRun = this.getCurrentTestRun();
24
+ if (!currentTestRun)
25
+ return [];
26
+ return currentTestRun.injectable.userScripts;
27
+ }
28
+ async getTaskScript({ isIframe }) {
29
+ const browserConnection = this.getBrowserConnection();
30
+ const proxy = browserConnection.browserConnectionGateway.proxy;
31
+ const windowId = browserConnection.activeWindowId;
32
+ // @ts-ignore
33
+ return await this.getCurrentTestRun().session.getTaskScript({
34
+ referer: '',
35
+ cookieUrl: '',
36
+ withPayload: true,
37
+ serverInfo: proxy.server1Info,
38
+ windowId,
39
+ isIframe,
40
+ });
41
+ }
42
+ }
43
+ exports.default = TestRunBridge;
44
+ module.exports = exports.default;
45
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVzdC1ydW4tYnJpZGdlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3Byb3h5bGVzcy9yZXF1ZXN0LXBpcGVsaW5lL3Rlc3QtcnVuLWJyaWRnZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUNBLDBFQUF5RDtBQUl6RCxNQUFxQixhQUFhO0lBRTlCLFlBQW9CLFNBQWlCO1FBQ2pDLElBQUksQ0FBQyxVQUFVLEdBQUcsU0FBUyxDQUFDO0lBQ2hDLENBQUM7SUFFTSxvQkFBb0I7UUFDdkIsT0FBTyxvQkFBaUIsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBc0IsQ0FBQztJQUMzRSxDQUFDO0lBRU0saUJBQWlCO1FBQ3BCLE1BQU0saUJBQWlCLEdBQUcsSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUM7UUFFdEQsT0FBTyxpQkFBaUIsQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO0lBQ2pELENBQUM7SUFFTSxZQUFZOztRQUNmLE9BQU8sQ0FBQSxNQUFBLElBQUksQ0FBQyxpQkFBaUIsRUFBRSwwQ0FBRSxFQUFFLEtBQUksRUFBRSxDQUFDO0lBQzlDLENBQUM7SUFFTSxjQUFjO1FBQ2pCLE1BQU0sY0FBYyxHQUFHLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1FBRWhELElBQUksQ0FBQyxjQUFjO1lBQ2YsT0FBTyxFQUFFLENBQUM7UUFFZCxPQUFPLGNBQWMsQ0FBQyxVQUFVLENBQUMsV0FBVyxDQUFDO0lBQ2pELENBQUM7SUFFTSxLQUFLLENBQUMsYUFBYSxDQUFFLEVBQUUsUUFBUSxFQUE4QjtRQUNoRSxNQUFNLGlCQUFpQixHQUFHLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO1FBQ3RELE1BQU0sS0FBSyxHQUFlLGlCQUFpQixDQUFDLHdCQUF3QixDQUFDLEtBQUssQ0FBQztRQUMzRSxNQUFNLFFBQVEsR0FBWSxpQkFBaUIsQ0FBQyxjQUFjLENBQUM7UUFFM0QsYUFBYTtRQUNiLE9BQU8sTUFBTSxJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDO1lBQ3hELE9BQU8sRUFBTSxFQUFFO1lBQ2YsU0FBUyxFQUFJLEVBQUU7WUFDZixXQUFXLEVBQUUsSUFBSTtZQUNqQixVQUFVLEVBQUcsS0FBSyxDQUFDLFdBQVc7WUFDOUIsUUFBUTtZQUNSLFFBQVE7U0FDWCxDQUFDLENBQUM7SUFDUCxDQUFDO0NBQ0o7QUE1Q0QsZ0NBNENDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IFRlc3RSdW4gZnJvbSAnLi4vLi4vdGVzdC1ydW4nO1xuaW1wb3J0IEJyb3dzZXJDb25uZWN0aW9uIGZyb20gJy4uLy4uL2Jyb3dzZXIvY29ubmVjdGlvbic7XG5pbXBvcnQgeyBVc2VyU2NyaXB0IH0gZnJvbSAndGVzdGNhZmUtaGFtbWVyaGVhZCc7XG5pbXBvcnQgeyBJbmplY3RhYmxlUmVzb3VyY2VzT3B0aW9ucyB9IGZyb20gJy4uL3R5cGVzJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVGVzdFJ1bkJyaWRnZSB7XG4gICAgcHJpdmF0ZSByZWFkb25seSBfYnJvd3NlcklkOiBzdHJpbmc7XG4gICAgcHVibGljIGNvbnN0cnVjdG9yIChicm93c2VySWQ6IHN0cmluZykge1xuICAgICAgICB0aGlzLl9icm93c2VySWQgPSBicm93c2VySWQ7XG4gICAgfVxuXG4gICAgcHVibGljIGdldEJyb3dzZXJDb25uZWN0aW9uICgpOiBCcm93c2VyQ29ubmVjdGlvbiB7XG4gICAgICAgIHJldHVybiBCcm93c2VyQ29ubmVjdGlvbi5nZXRCeUlkKHRoaXMuX2Jyb3dzZXJJZCkgYXMgQnJvd3NlckNvbm5lY3Rpb247XG4gICAgfVxuXG4gICAgcHVibGljIGdldEN1cnJlbnRUZXN0UnVuICgpOiBUZXN0UnVuIHtcbiAgICAgICAgY29uc3QgYnJvd3NlckNvbm5lY3Rpb24gPSB0aGlzLmdldEJyb3dzZXJDb25uZWN0aW9uKCk7XG5cbiAgICAgICAgcmV0dXJuIGJyb3dzZXJDb25uZWN0aW9uLmdldEN1cnJlbnRUZXN0UnVuKCk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldFNlc3Npb25JZCAoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0Q3VycmVudFRlc3RSdW4oKT8uaWQgfHwgJyc7XG4gICAgfVxuXG4gICAgcHVibGljIGdldFVzZXJTY3JpcHRzICgpOiBVc2VyU2NyaXB0W10ge1xuICAgICAgICBjb25zdCBjdXJyZW50VGVzdFJ1biA9IHRoaXMuZ2V0Q3VycmVudFRlc3RSdW4oKTtcblxuICAgICAgICBpZiAoIWN1cnJlbnRUZXN0UnVuKVxuICAgICAgICAgICAgcmV0dXJuIFtdO1xuXG4gICAgICAgIHJldHVybiBjdXJyZW50VGVzdFJ1bi5pbmplY3RhYmxlLnVzZXJTY3JpcHRzO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBnZXRUYXNrU2NyaXB0ICh7IGlzSWZyYW1lIH06IEluamVjdGFibGVSZXNvdXJjZXNPcHRpb25zKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICAgICAgY29uc3QgYnJvd3NlckNvbm5lY3Rpb24gPSB0aGlzLmdldEJyb3dzZXJDb25uZWN0aW9uKCk7XG4gICAgICAgIGNvbnN0IHByb3h5ICAgICAgICAgICAgID0gYnJvd3NlckNvbm5lY3Rpb24uYnJvd3NlckNvbm5lY3Rpb25HYXRld2F5LnByb3h5O1xuICAgICAgICBjb25zdCB3aW5kb3dJZCAgICAgICAgICA9IGJyb3dzZXJDb25uZWN0aW9uLmFjdGl2ZVdpbmRvd0lkO1xuXG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuZ2V0Q3VycmVudFRlc3RSdW4oKS5zZXNzaW9uLmdldFRhc2tTY3JpcHQoe1xuICAgICAgICAgICAgcmVmZXJlcjogICAgICcnLFxuICAgICAgICAgICAgY29va2llVXJsOiAgICcnLFxuICAgICAgICAgICAgd2l0aFBheWxvYWQ6IHRydWUsXG4gICAgICAgICAgICBzZXJ2ZXJJbmZvOiAgcHJveHkuc2VydmVyMUluZm8sXG4gICAgICAgICAgICB3aW5kb3dJZCxcbiAgICAgICAgICAgIGlzSWZyYW1lLFxuICAgICAgICB9KTtcbiAgICB9XG59XG4iXX0=
@@ -4,7 +4,6 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
6
  const testcafe_hammerhead_1 = require("testcafe-hammerhead");
7
- const connection_1 = __importDefault(require("../browser/connection"));
8
7
  const injectables_1 = require("../assets/injectables");
9
8
  const empty_page_markup_1 = __importDefault(require("./empty-page-markup"));
10
9
  const http_status_codes_1 = require("http-status-codes");
@@ -19,31 +18,43 @@ const RESPONSE_REMOVED_HEADERS = [
19
18
  'cross-origin-resource-policy',
20
19
  ];
21
20
  class ResourceInjector {
22
- constructor(browserId, specialServiceRoutes) {
23
- this._browserId = browserId;
21
+ constructor(testRunBridge, specialServiceRoutes) {
24
22
  this._specialServiceRoutes = specialServiceRoutes;
23
+ this._testRunBridge = testRunBridge;
25
24
  }
26
- get _browserConnection() {
27
- return connection_1.default.getById(this._browserId);
25
+ _getRestoreContextStorageScript(contextStorage) {
26
+ const currentTestRun = this._testRunBridge.getCurrentTestRun();
27
+ const value = JSON.stringify((contextStorage === null || contextStorage === void 0 ? void 0 : contextStorage[currentTestRun.id]) || '');
28
+ return `Object.defineProperty(window, '%proxylessContextStorage%', { configurable: true, value: ${value} });`;
28
29
  }
29
- get _currentTestRun() {
30
- return this._browserConnection.getCurrentTestRun();
30
+ _getRestoreStoragesScript(restoringStorages) {
31
+ if (!restoringStorages)
32
+ return '(function() {})()';
33
+ return `(function() {
34
+ window.localStorage.clear();
35
+ window.sessionStorage.clear();
36
+
37
+ const snapshot = ${JSON.stringify(restoringStorages)};
38
+ const ls = JSON.parse(snapshot.localStorage);
39
+ const ss = JSON.parse(snapshot.sessionStorage);
40
+
41
+ for (let i = 0; i < ls[0].length; i++)
42
+ window.localStorage.setItem(ls[0][i], ls[1][i]);
43
+
44
+ for (let i = 0; i < ss[0].length; i++)
45
+ window.sessionStorage.setItem(ss[0][i], ss[1][i]);
46
+ })();
47
+ `;
31
48
  }
32
- async _prepareInjectableResources({ isIframe, restoringStorages }) {
33
- const proxy = this._browserConnection.browserConnectionGateway.proxy;
34
- const windowId = this._browserConnection.activeWindowId;
35
- if (!this._currentTestRun)
49
+ _resolveRelativeUrls(proxy, relativeUrls) {
50
+ return relativeUrls.map(url => proxy.resolveRelativeServiceUrl(url));
51
+ }
52
+ async _prepareInjectableResources({ isIframe, restoringStorages, contextStorage, userScripts }) {
53
+ if (!this._testRunBridge.getCurrentTestRun())
36
54
  return null;
37
- const taskScript = await this._currentTestRun.session.getTaskScript({
38
- referer: '',
39
- cookieUrl: '',
40
- withPayload: true,
41
- serverInfo: proxy.server1Info,
42
- windowId,
43
- isIframe,
44
- });
55
+ const taskScript = await this._testRunBridge.getTaskScript({ isIframe, restoringStorages, contextStorage, userScripts });
56
+ const proxy = this._testRunBridge.getBrowserConnection().browserConnectionGateway.proxy;
45
57
  const injectableResources = {
46
- storages: restoringStorages,
47
58
  stylesheets: [
48
59
  injectables_1.TESTCAFE_UI_STYLES,
49
60
  ],
@@ -51,10 +62,12 @@ class ResourceInjector {
51
62
  ...testcafe_hammerhead_1.INJECTABLE_SCRIPTS.map(hs => (0, testcafe_hammerhead_1.getAssetPath)(hs, proxy.options.developmentMode)),
52
63
  ...injectables_1.SCRIPTS.map(s => (0, testcafe_hammerhead_1.getAssetPath)(s, proxy.options.developmentMode)),
53
64
  ],
54
- embeddedScripts: [taskScript],
65
+ embeddedScripts: [this._getRestoreStoragesScript(restoringStorages), this._getRestoreContextStorageScript(contextStorage), taskScript],
66
+ userScripts: userScripts || [],
55
67
  };
56
- injectableResources.scripts = injectableResources.scripts.map(script => proxy.resolveRelativeServiceUrl(script));
57
- injectableResources.stylesheets = injectableResources.stylesheets.map(style => proxy.resolveRelativeServiceUrl(style));
68
+ injectableResources.scripts = this._resolveRelativeUrls(proxy, injectableResources.scripts);
69
+ injectableResources.userScripts = this._resolveRelativeUrls(proxy, injectableResources.userScripts);
70
+ injectableResources.stylesheets = this._resolveRelativeUrls(proxy, injectableResources.stylesheets);
58
71
  return injectableResources;
59
72
  }
60
73
  _processResponseHeaders(headers) {
@@ -73,8 +86,7 @@ class ResourceInjector {
73
86
  });
74
87
  }
75
88
  async redirectToErrorPage(client, err, url) {
76
- const browserConnection = connection_1.default.getById(this._browserId);
77
- const currentTestRun = browserConnection.getCurrentTestRun();
89
+ const currentTestRun = this._testRunBridge.getCurrentTestRun();
78
90
  if (!currentTestRun)
79
91
  return;
80
92
  currentTestRun.pendingPageError = new test_run_1.PageLoadError(err, url);
@@ -111,9 +123,9 @@ class ResourceInjector {
111
123
  };
112
124
  }
113
125
  }
114
- async processAboutBlankPage(event, client) {
126
+ async processAboutBlankPage(event, userScripts, client) {
115
127
  (0, debug_loggers_1.resourceInjectorLogger)('Handle page as about:blank. Origin url: %s', event.frame.url);
116
- const injectableResources = await this._prepareInjectableResources({ isIframe: false });
128
+ const injectableResources = await this._prepareInjectableResources({ isIframe: false, userScripts });
117
129
  const html = (0, testcafe_hammerhead_1.injectResources)(empty_page_markup_1.default, injectableResources);
118
130
  await client.Page.setDocumentContent({
119
131
  frameId: event.frame.id,
@@ -139,7 +151,7 @@ class ResourceInjector {
139
151
  if (url && restoringStorages) {
140
152
  return {
141
153
  host: new URL(url).host,
142
- sessionId: this._currentTestRun.session.id,
154
+ sessionId: this._testRunBridge.getSessionId(),
143
155
  };
144
156
  }
145
157
  return void 0;
@@ -147,4 +159,4 @@ class ResourceInjector {
147
159
  }
148
160
  exports.default = ResourceInjector;
149
161
  module.exports = exports.default;
150
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzb3VyY2UtaW5qZWN0b3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcHJveHlsZXNzL3Jlc291cmNlLWluamVjdG9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBUUEsNkRBTTZCO0FBQzdCLHVFQUFzRDtBQUN0RCx1REFBb0U7QUFDcEUsNEVBQW9EO0FBQ3BELHlEQUFnRDtBQUNoRCxpREFBbUQ7QUFDbkQscUNBQW1EO0FBUW5ELDBEQUFnRTtBQUNoRSwyQ0FJd0I7QUFDeEIsMERBQWlFO0FBR2pFLE1BQU0sd0JBQXdCLEdBQUc7SUFDN0IsOEJBQThCO0lBQzlCLDRCQUE0QjtJQUM1Qiw4QkFBOEI7Q0FDakMsQ0FBQztBQUVGLE1BQXFCLGdCQUFnQjtJQUlqQyxZQUFvQixTQUFpQixFQUFFLG9CQUEwQztRQUM3RSxJQUFJLENBQUMsVUFBVSxHQUFjLFNBQVMsQ0FBQztRQUN2QyxJQUFJLENBQUMscUJBQXFCLEdBQUcsb0JBQW9CLENBQUM7SUFDdEQsQ0FBQztJQUVELElBQVksa0JBQWtCO1FBQzFCLE9BQU8sb0JBQWlCLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQXNCLENBQUM7SUFDM0UsQ0FBQztJQUVELElBQVksZUFBZTtRQUN2QixPQUFPLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO0lBQ3ZELENBQUM7SUFFTyxLQUFLLENBQUMsMkJBQTJCLENBQUUsRUFBRSxRQUFRLEVBQUUsaUJBQWlCLEVBQThCO1FBQ2xHLE1BQU0sS0FBSyxHQUFNLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyx3QkFBd0IsQ0FBQyxLQUFLLENBQUM7UUFDeEUsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLGNBQWMsQ0FBQztRQUV4RCxJQUFJLENBQUMsSUFBSSxDQUFDLGVBQWU7WUFDckIsT0FBTyxJQUFJLENBQUM7UUFFaEIsTUFBTSxVQUFVLEdBQUcsTUFBTSxJQUFJLENB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aUJBQWlCLEVBQUUsR0FBRywwQkFBMEIsQ0FBQztRQUU5RCxJQUFJLEdBQUcsSUFBSSxpQkFBaUIsRUFBRTtZQUMxQixPQUFPO2dCQUNILElBQUksRUFBTyxJQUFJLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJO2dCQUM1QixTQUFTLEVBQUUsSUFBSSxDQUFDLGVBQWUsQ0FBQyxPQUFPLENBQUMsRUFBRTthQUM3QyxDQUFDO1NBQ0w7UUFFRCxPQUFPLEtBQUssQ0FBQyxDQUFDO0lBQ2xCLENBQUM7Q0FDSjtBQTNLRCxtQ0EyS0MiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBQcm90b2NvbEFwaSB9IGZyb20gJ2Nocm9tZS1yZW1vdGUtaW50ZXJmYWNlJztcbi8vIEB0cy1pZ25vcmVcbmltcG9ydCB7IFRlc3RSdW4gYXMgTGVnYWN5VGVzdFJ1biB9IGZyb20gJ3Rlc3RjYWZlLWxlZ2FjeS1hcGknO1xuaW1wb3J0IFByb3RvY29sIGZyb20gJ2RldnRvb2xzLXByb3RvY29sJztcbmltcG9ydCBSZXF1ZXN0UGF1c2VkRXZlbnQgPSBQcm90b2NvbC5GZXRjaC5SZXF1ZXN0UGF1c2VkRXZlbnQ7XG5pbXBvcnQgRnJhbWVOYXZpZ2F0ZWRFdmVudCA9IFByb3RvY29sLlBhZ2UuRnJhbWVOYXZpZ2F0ZWRFdmVudDtcbmltcG9ydCBGdWxmaWxsUmVxdWVzdFJlcXVlc3QgPSBQcm90b2NvbC5GZXRjaC5GdWxmaWxsUmVxdWVzdFJlcXVlc3Q7XG5pbXBvcnQgSGVhZGVyRW50cnkgPSBQcm90b2NvbC5GZXRjaC5IZWFkZXJFbnRyeTtcbmltcG9ydCB7XG4gICAgaW5qZWN0UmVzb3VyY2VzLFxuICAgIFBhZ2VJbmplY3RhYmxlUmVzb3VyY2VzLFxuICAgIElOSkVDVEFCTEVfU0NSSVBUUyBhcyBIQU1NRVJIRUFEX0lOSkVDVEFCTEVfU0NSSVBUUyxcbiAgICBnZXRBc3NldFBhdGgsXG4gICAgUGFnZVJlc3RvcmVTdG9yYWdlc09wdGlvbnMsXG59IGZyb20gJ3Rlc3RjYWZlLWhhbW1lcmhlYWQnO1xuaW1wb3J0IEJyb3dzZXJDb25uZWN0aW9uIGZyb20gJy4uL2Jyb3dzZXIvY29ubmVjdGlvbic7XG5pbXBvcnQgeyBTQ1JJUFRTLCBURVNUQ0FGRV9VSV9TVFlMRVMgfSBmcm9tICcuLi9hc3NldHMvaW5qZWN0YWJsZXMnO1xuaW1wb3J0IEVNUFRZX1BBR0VfTUFSS1VQIGZyb20gJy4vZW1wdHktcGFnZS1tYXJrdXAnO1xuaW1wb3J0IHsgU3RhdHVzQ29kZXMgfSBmcm9tICdodHRwLXN0YXR1cy1jb2Rlcyc7XG5pbXBvcnQgeyBQYWdlTG9hZEVycm9yIH0gZnJvbSAnLi4vZXJyb3JzL3Rlc3QtcnVuJztcbmltcG9ydCB7IHJlZGlyZWN0LCBuYXZpZ2F0ZVRvIH0gZnJvbSAnLi91dGlscy9jZHAnO1xuXG5pbXBvcnQge1xuICAgIERvY3VtZW50UmVzb3VyY2VJbmZvLFxuICAgIEluamVjdGFibGVSZXNvdXJjZXNPcHRpb25zLFxuICAgIFNwZWNpYWxTZXJ2aWNlUm91dGVzLFxufSBmcm9tICcuL3R5cGVzJztcblxuaW1wb3J0IHsgcmVzb3VyY2VJbmplY3RvckxvZ2dlciB9IGZyb20gJy4uL3V0aWxzL2RlYnVnLWxvZ2dlcnMnO1xuaW1wb3J0IHtcbiAgICBnZXRSZXNwb25zZUFzU3RyaW5nLFxuICAgIHN0cmluZ2lmeUhlYWRlclZhbHVlcyxcbiAgICB0b0Jhc2U2NFN0cmluZyxcbn0gZnJvbSAnLi91dGlscy9zdHJpbmcnO1xuaW1wb3J0IHsgc2FmZUZ1bGZpbGxSZXF1ZXN0IH0gZnJvbSAnLi9yZXF1ZXN0LXBpcGVsaW5lL3NhZmUtYXBpJztcbmltcG9ydCBUZXN0UnVuIGZyb20gJy4uL3Rlc3QtcnVuJztcblxuY29uc3QgUkVTUE9OU0VfUkVNT1ZFRF9IRUFERVJTID0gW1xuICAgICdjcm9zcy1vcmlnaW4tZW1iZWRkZXItcG9saWN5JyxcbiAgICAnY3Jvc3Mtb3JpZ2luLW9wZW5lci1wb2xpY3knLFxuICAgICdjcm9zcy1vcmlnaW4tcmVzb3VyY2UtcG9saWN5Jyxcbl07XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFJlc291cmNlSW5qZWN0b3Ige1xuICAgIHByaXZhdGUgcmVhZG9ubHkgX2Jyb3dzZXJJZDogc3RyaW5nO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgX3NwZWNpYWxTZXJ2aWNlUm91dGVzOiBTcGVjaWFsU2VydmljZVJvdXRlcztcblxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvciAoYnJvd3NlcklkOiBzdHJpbmcsIHNwZWNpYWxTZXJ2aWNlUm91dGVzOiBTcGVjaWFsU2VydmljZVJvdXRlcykge1xuICAgICAgICB0aGlzLl9icm93c2VySWQgICAgICAgICAgICA9IGJyb3dzZXJJZDtcbiAgICAgICAgdGhpcy5fc3BlY2lhbFNlcnZpY2VSb3V0ZXMgPSBzcGVjaWFsU2VydmljZVJvdXRlcztcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldCBfYnJvd3NlckNvbm5lY3Rpb24gKCk6IEJyb3dzZXJDb25uZWN0aW9uIHtcbiAgICAgICAgcmV0dXJuIEJyb3dzZXJDb25uZWN0aW9uLmdldEJ5SWQodGhpcy5fYnJvd3NlcklkKSBhcyBCcm93c2VyQ29ubmVjdGlvbjtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldCBfY3VycmVudFRlc3RSdW4gKCk6IExlZ2FjeVRlc3RSdW4gfCBUZXN0UnVuIHwgbnVsbCB7XG4gICAgICAgIHJldHVybiB0aGlzLl9icm93c2VyQ29ubmVjdGlvbi5nZXRDdXJyZW50VGVzdFJ1bigpO1xuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgX3ByZXBhcmVJbmplY3RhYmxlUmVzb3VyY2VzICh7IGlzSWZyYW1lLCByZXN0b3JpbmdTdG9yYWdlcyB9OiBJbmplY3RhYmxlUmVzb3VyY2VzT3B0aW9ucyk6IFByb21pc2U8UGFnZUluamVjdGFibGVSZXNvdXJjZXMgfCBudWxsPiB7XG4gICAgICAgIGNvbnN0IHByb3h5ICAgID0gdGhpcy5fYnJvd3NlckNvbm5lY3Rpb24uYnJvd3NlckNvbm5lY3Rpb25HYXRld2F5LnByb3h5O1xuICAgICAgICBjb25zdCB3aW5kb3dJZCA9IHRoaXMuX2Jyb3dzZXJDb25uZWN0aW9uLmFjdGl2ZVdpbmRvd0lkO1xuXG4gICAgICAgIGlmICghdGhpcy5fY3VycmVudFRlc3RSdW4pXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcblxuICAgICAgICBjb25zdCB0YXNrU2NyaXB0ID0gYXdhaXQgdGhpcy5fY3VycmVudFRlc3RSdW4uc2Vzc2lvbi5nZXRUYXNrU2NyaXB0KHtcbiAgICAgICAgICAgIHJlZmVyZXI6ICAgICAnJyxcbiAgICAgICAgICAgIGNvb2tpZVVybDogICAnJyxcbiAgICAgICAgICAgIHdpdGhQYXlsb2FkOiB0cnVlLFxuICAgICAgICAgICAgc2VydmVySW5mbzogIHByb3h5LnNlcnZlcjFJbmZvLFxuICAgICAgICAgICAgd2luZG93SWQsXG4gICAgICAgICAgICBpc0lmcmFtZSxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgY29uc3QgaW5qZWN0YWJsZVJlc291cmNlcyA9IHtcbiAgICAgICAgICAgIHN0b3JhZ2VzOiAgICByZXN0b3JpbmdTdG9yYWdlcyxcbiAgICAgICAgICAgIHN0eWxlc2hlZXRzOiBbXG4gICAgICAgICAgICAgICAgVEVTVENBRkVfVUlfU1RZTEVTLFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIHNjcmlwdHM6IFtcbiAgICAgICAgICAgICAgICAuLi5IQU1NRVJIRUFEX0lOSkVDVEFCTEVfU0NSSVBUUy5tYXAoaHMgPT4gZ2V0QXNzZXRQYXRoKGhzLCBwcm94eS5vcHRpb25zLmRldmVsb3BtZW50TW9kZSkpLFxuICAgICAgICAgICAgICAgIC4uLlNDUklQVFMubWFwKHMgPT4gZ2V0QXNzZXRQYXRoKHMsIHByb3h5Lm9wdGlvbnMuZGV2ZWxvcG1lbnRNb2RlKSksXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgZW1iZWRkZWRTY3JpcHRzOiBbdGFza1NjcmlwdF0sXG4gICAgICAgIH07XG5cbiAgICAgICAgaW5qZWN0YWJsZVJlc291cmNlcy5zY3JpcHRzICAgICA9IGluamVjdGFibGVSZXNvdXJjZXMuc2NyaXB0cy5tYXAoc2NyaXB0ID0+IHByb3h5LnJlc29sdmVSZWxhdGl2ZVNlcnZpY2VVcmwoc2NyaXB0KSk7XG4gICAgICAgIGluamVjdGFibGVSZXNvdXJjZXMuc3R5bGVzaGVldHMgPSBpbmplY3RhYmxlUmVzb3VyY2VzLnN0eWxlc2hlZXRzLm1hcChzdHlsZSA9PiBwcm94eS5yZXNvbHZlUmVsYXRpdmVTZXJ2aWNlVXJsKHN0eWxlKSk7XG5cbiAgICAgICAgcmV0dXJuIGluamVjdGFibGVSZXNvdXJjZXM7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfcHJvY2Vzc1Jlc3BvbnNlSGVhZGVycyAoaGVhZGVyczogSGVhZGVyRW50cnlbXSB8IHVuZGVmaW5lZCk6IEhlYWRlckVudHJ5W10ge1xuICAgICAgICBpZiAoIWhlYWRlcnMpXG4gICAgICAgICAgICByZXR1cm4gW107XG5cbiAgICAgICAgaGVhZGVycyA9IGhlYWRlcnMuZmlsdGVyKGhlYWRlciA9PiAhUkVTUE9OU0VfUkVNT1ZFRF9IRUFERVJTLmluY2x1ZGVzKGhlYWRlci5uYW1lLnRvTG93ZXJDYXNlKCkpKTtcblxuICAgICAgICByZXR1cm4gc3RyaW5naWZ5SGVhZGVyVmFsdWVzKGhlYWRlcnMpO1xuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgX2Z1bGZpbGxSZXF1ZXN0IChjbGllbnQ6IFByb3RvY29sQXBpLCBmdWxmaWxsUmVxdWVzdEluZm86IEZ1bGZpbGxSZXF1ZXN0UmVxdWVzdCwgYm9keTogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGF3YWl0IHNhZmVGdWxmaWxsUmVxdWVzdChjbGllbnQsIHtcbiAgICAgICAgICAgIHJlcXVlc3RJZDogICAgICAgZnVsZmlsbFJlcXVlc3RJbmZvLnJlcXVlc3RJZCxcbiAgICAgICAgICAgIHJlc3BvbnNlQ29kZTogICAgZnVsZmlsbFJlcXVlc3RJbmZvLnJlc3BvbnNlQ29kZSB8fCBTdGF0dXNDb2Rlcy5PSyxcbiAgICAgICAgICAgIHJlc3BvbnNlUGhyYXNlOiAgZnVsZmlsbFJlcXVlc3RJbmZvLnJlc3BvbnNlUGhyYXNlLFxuICAgICAgICAgICAgcmVzcG9uc2VIZWFkZXJzOiB0aGlzLl9wcm9jZXNzUmVzcG9uc2VIZWFkZXJzKGZ1bGZpbGxSZXF1ZXN0SW5mby5yZXNwb25zZUhlYWRlcnMpLFxuICAgICAgICAgICAgYm9keTogICAgICAgICAgICB0b0Jhc2U2NFN0cmluZyhib2R5KSxcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIHJlZGlyZWN0VG9FcnJvclBhZ2UgKGNsaWVudDogUHJvdG9jb2xBcGksIGVycjogRXJyb3IsIHVybDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGNvbnN0IGJyb3dzZXJDb25uZWN0aW9uID0gQnJvd3NlckNvbm5lY3Rpb24uZ2V0QnlJZCh0aGlzLl9icm93c2VySWQpIGFzIEJyb3dzZXJDb25uZWN0aW9uO1xuICAgICAgICBjb25zdCBjdXJyZW50VGVzdFJ1biAgICA9IGJyb3dzZXJDb25uZWN0aW9uLmdldEN1cnJlbnRUZXN0UnVuKCk7XG5cbiAgICAgICAgaWYgKCFjdXJyZW50VGVzdFJ1bilcbiAgICAgICAgICAgIHJldHVybjtcblxuICAgICAgICBjdXJyZW50VGVzdFJ1bi5wZW5kaW5nUGFnZUVycm9yID0gbmV3IFBhZ2VMb2FkRXJyb3IoZXJyLCB1cmwpO1xuXG4gICAgICAgIGF3YWl0IG5hdmlnYXRlVG8oY2xpZW50LCB0aGlzLl9zcGVjaWFsU2VydmljZVJvdXRlcy5lcnJvclBhZ2UxKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgZ2V0RG9jdW1lbnRSZXNvdXJjZUluZm8gKGV2ZW50OiBSZXF1ZXN0UGF1c2VkRXZlbnQsIGNsaWVudDogUHJvdG9jb2xBcGkpOiBQcm9taXNlPERvY3VtZW50UmVzb3VyY2VJbmZvPiB7XG4gICAgICAgIGNvbnN0IHtcbiAgICAgICAgICAgIHJlcXVlc3RJZCxcbiAgICAgICAgICAgIHJlcXVlc3QsXG4gICAgICAgICAgICByZXNwb25zZUVycm9yUmVhc29uLFxuICAgICAgICAgICAgcmVzb3VyY2VUeXBlLFxuICAgICAgICB9ID0gZXZlbnQ7XG5cbiAgICAgICAgaWYgKHJlc291cmNlVHlwZSAhPT0gJ0RvY3VtZW50Jykge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBlcnJvcjogbnVsbCxcbiAgICAgICAgICAgICAgICBib2R5OiAgbnVsbCxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cblxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgaWYgKHJlc3BvbnNlRXJyb3JSZWFzb24gPT09ICdOYW1lTm90UmVzb2x2ZWQnKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZXJyID0gbmV3IEVycm9yKGBGYWlsZWQgdG8gZmluZCBhIEROUy1yZWNvcmQgZm9yIHRoZSByZXNvdXJjZSBhdCBcIiR7ZXZlbnQucmVxdWVzdC51cmx9XCJgKTtcblxuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIGVycm9yOiBlcnIsXG4gICAgICAgICAgICAgICAgICAgIGJvZHk6ICBudWxsLFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlT2JqID0gYXdhaXQgY2xpZW50LkZldGNoLmdldFJlc3BvbnNlQm9keSh7IHJlcXVlc3RJZCB9KTtcbiAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlU3RyID0gZ2V0UmVzcG9uc2VBc1N0cmluZyhyZXNwb25zZU9iaik7XG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgZXJyb3I6IG51bGwsXG4gICAgICAgICAgICAgICAgYm9keTogIEJ1ZmZlci5mcm9tKHJlc3BvbnNlU3RyKSxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgcmVzb3VyY2VJbmplY3RvckxvZ2dlcignRmFpbGVkIHRvIHByb2Nlc3MgcmVxdWVzdDogJXMnLCByZXF1ZXN0LnVybCk7XG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgZXJyb3I6IGVycixcbiAgICAgICAgICAgICAgICBib2R5OiAgbnVsbCxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgcHJvY2Vzc0Fib3V0QmxhbmtQYWdlIChldmVudDogRnJhbWVOYXZpZ2F0ZWRFdmVudCwgY2xpZW50OiBQcm90b2NvbEFwaSk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICByZXNvdXJjZUluamVjdG9yTG9nZ2VyKCdIYW5kbGUgcGFnZSBhcyBhYm91dDpibGFuay4gT3JpZ2luIHVybDogJXMnLCBldmVudC5mcmFtZS51cmwpO1xuXG4gICAgICAgIGNvbnN0IGluamVjdGFibGVSZXNvdXJjZXMgPSBhd2FpdCB0aGlzLl9wcmVwYXJlSW5qZWN0YWJsZVJlc291cmNlcyh7IGlzSWZyYW1lOiBmYWxzZSB9KSBhcyBQYWdlSW5qZWN0YWJsZVJlc291cmNlcztcbiAgICAgICAgY29uc3QgaHRtbCAgICAgICAgICAgICAgICA9IGluamVjdFJlc291cmNlcyhFTVBUWV9QQUdFX01BUktVUCwgaW5qZWN0YWJsZVJlc291cmNlcyk7XG5cbiAgICAgICAgYXdhaXQgY2xpZW50LlBhZ2Uuc2V0RG9jdW1lbnRDb250ZW50KHtcbiAgICAgICAgICAgIGZyYW1lSWQ6IGV2ZW50LmZyYW1lLmlkLFxuICAgICAgICAgICAgaHRtbCxcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIHByb2Nlc3NIVE1MUGFnZUNvbnRlbnQgKGZ1bGZpbGxSZXF1ZXN0SW5mbzogRnVsZmlsbFJlcXVlc3RSZXF1ZXN0LCBpbmplY3RhYmxlUmVzb3VyY2VzT3B0aW9uczogSW5qZWN0YWJsZVJlc291cmNlc09wdGlvbnMsIGNsaWVudDogUHJvdG9jb2xBcGkpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgY29uc3QgaW5qZWN0YWJsZVJlc291cmNlcyA9IGF3YWl0IHRoaXMuX3ByZXBhcmVJbmplY3RhYmxlUmVzb3VyY2VzKGluamVjdGFibGVSZXNvdXJjZXNPcHRpb25zKTtcblxuICAgICAgICAvLyBOT1RFOiBhbiB1bmhhbmRsZWQgZXhjZXB0aW9uIGludGVycnVwdHMgdGhlIHRlc3QgZXhlY3V0aW9uLFxuICAgICAgICAvLyBhbmQgd2UgYXJlIGZvcmNlIHRvIHJlZGlyZWN0IG1hbnVhbGx5IHRvIHRoZSBpZGxlIHBhZ2UuXG4gICAgICAgIGlmICghaW5qZWN0YWJsZVJlc291cmNlcylcbiAgICAgICAgICAgIGF3YWl0IHJlZGlyZWN0KGNsaWVudCwgZnVsZmlsbFJlcXVlc3RJbmZvLnJlcXVlc3RJZCwgdGhpcy5fc3BlY2lhbFNlcnZpY2VSb3V0ZXMuaWRsZVBhZ2UpO1xuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IHVwZGF0ZWRSZXNwb25zZVN0ciA9IGluamVjdFJlc291cmNlcyhcbiAgICAgICAgICAgICAgICBmdWxmaWxsUmVxdWVzdEluZm8uYm9keSBhcyBzdHJpbmcsXG4gICAgICAgICAgICAgICAgaW5qZWN0YWJsZVJlc291cmNlcyxcbiAgICAgICAgICAgICAgICB0aGlzLl9nZXRQYWdlSW5qZWN0YWJsZVJlc291cmNlc09wdGlvbnMoaW5qZWN0YWJsZVJlc291cmNlc09wdGlvbnMpLFxuICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgYXdhaXQgdGhpcy5fZnVsZmlsbFJlcXVlc3QoY2xpZW50LCBmdWxmaWxsUmVxdWVzdEluZm8sIHVwZGF0ZWRSZXNwb25zZVN0cik7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgcHJvY2Vzc05vblByb3hpZWRDb250ZW50IChmdWxmaWxsUmVxdWVzdEluZm86IEZ1bGZpbGxSZXF1ZXN0UmVxdWVzdCwgY2xpZW50OiBQcm90b2NvbEFwaSk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBhd2FpdCB0aGlzLl9mdWxmaWxsUmVxdWVzdChjbGllbnQsIGZ1bGZpbGxSZXF1ZXN0SW5mbywgZnVsZmlsbFJlcXVlc3RJbmZvLmJvZHkgYXMgc3RyaW5nKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9nZXRQYWdlSW5qZWN0YWJsZVJlc291cmNlc09wdGlvbnMgKGluamVjdGFibGVSZXNvdXJjZXNPcHRpb25zOiBJbmplY3RhYmxlUmVzb3VyY2VzT3B0aW9ucyk6IFBhZ2VSZXN0b3JlU3RvcmFnZXNPcHRpb25zIHwgdW5kZWZpbmVkIHtcbiAgICAgICAgY29uc3QgeyB1cmwsIHJlc3RvcmluZ1N0b3JhZ2VzIH0gPSBpbmplY3RhYmxlUmVzb3VyY2VzT3B0aW9ucztcblxuICAgICAgICBpZiAodXJsICYmIHJlc3RvcmluZ1N0b3JhZ2VzKSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIGhvc3Q6ICAgICAgbmV3IFVSTCh1cmwpLmhvc3QsXG4gICAgICAgICAgICAgICAgc2Vzc2lvbklkOiB0aGlzLl9jdXJyZW50VGVzdFJ1bi5zZXNzaW9uLmlkLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB2b2lkIDA7XG4gICAgfVxufVxuIl19
162
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzb3VyY2UtaW5qZWN0b3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcHJveHlsZXNzL3Jlc291cmNlLWluamVjdG9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBTUEsNkRBUTZCO0FBQzdCLHVEQUFvRTtBQUNwRSw0RUFBb0Q7QUFDcEQseURBQWdEO0FBQ2hELGlEQUFtRDtBQUNuRCxxQ0FBbUQ7QUFTbkQsMERBQWdFO0FBQ2hFLDJDQUl3QjtBQUN4QiwwREFBaUU7QUFHakUsTUFBTSx3QkFBd0IsR0FBRztJQUM3Qiw4QkFBOEI7SUFDOUIsNEJBQTRCO0lBQzVCLDhCQUE4QjtDQUNqQyxDQUFDO0FBRUYsTUFBcUIsZ0JBQWdCO0lBSWpDLFlBQW9CLGFBQTRCLEVBQUUsb0JBQTBDO1FBQ3hGLElBQUksQ0FBQyxxQkFBcUIsR0FBRyxvQkFBb0IsQ0FBQztRQUNsRCxJQUFJLENBQUMsY0FBYyxHQUFVLGFBQWEsQ0FBQztJQUMvQyxDQUFDO0lBRU8sK0JBQStCLENBQUUsY0FBMEM7UUFDL0UsTUFBTSxjQUFjLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1FBQy9ELE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQSxjQUFjLGFBQWQsY0FBYyx1QkFBZCxjQUFjLENBQUcsY0FBYyxDQUFDLEVBQUUsQ0FBQyxLQUFJLEVBQUUsQ0FBQyxDQUFDO1FBRXhFLE9BQU8sMkZBQTJGLEtBQUssTUFBTSxDQUFDO0lBQ2xILENBQUM7SUFFTyx5QkFBeUIsQ0FBRSxpQkFBc0Q7UUFDckYsSUFBSSxDQUFDLGlCQUFpQjtZQUNsQixPQUFPLG1CQUFtQixDQUFDO1FBRS9CLE9BQU87Ozs7K0JBSWdCLElBQUksQ0FBQyxTQUFTLENBQUMsaUJBQWlCLENBQUM7Ozs7Ozs7Ozs7U0FVdkQsQ0FBQztJQUNOLENBQUM7SUFFTyxvQkFBb0IsQ0FBRSxLQUFZLEVBQUUsWUFBc0I7UUFDOUQs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QUNqQyxtQkFBbUIsRUFDbkIsSUFBSSxDQUFDLGtDQUFrQyxDQUFDLDBCQUEwQixDQUFDLENBQ3RFLENBQUM7WUFFRixNQUFNLElBQUksQ0FBQyxlQUFlLENBQUMsTUFBTSxFQUFFLGtCQUFrQixFQUFFLGtCQUFrQixDQUFDLENBQUM7U0FDOUU7SUFDTCxDQUFDO0lBRU0sS0FBSyxDQUFDLHdCQUF3QixDQUFFLGtCQUF5QyxFQUFFLE1BQW1CO1FBQ2pHLE1BQU0sSUFBSSxDQUFDLGVBQWUsQ0FBQyxNQUFNLEVBQUUsa0JBQWtCLEVBQUUsa0JBQWtCLENBQUMsSUFBYyxDQUFDLENBQUM7SUFDOUYsQ0FBQztJQUVPLGtDQUFrQyxDQUFFLDBCQUFzRDtRQUM5RixNQUFNLEVBQUUsR0FBRyxFQUFFLGlCQUFpQixFQUFFLEdBQUcsMEJBQTBCLENBQUM7UUFFOUQsSUFBSSxHQUFHLElBQUksaUJBQWlCLEVBQUU7WUFDMUIsT0FBTztnQkFDSCxJQUFJLEVBQU8sSUFBSSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSTtnQkFDNUIsU0FBUyxFQUFFLElBQUksQ0FBQyxjQUFjLENBQUMsWUFBWSxFQUFFO2FBQ2hELENBQUM7U0FDTDtRQUVELE9BQU8sS0FBSyxDQUFDLENBQUM7SUFDbEIsQ0FBQztDQUNKO0FBMUxELG1DQTBMQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFByb3RvY29sQXBpIH0gZnJvbSAnY2hyb21lLXJlbW90ZS1pbnRlcmZhY2UnO1xuaW1wb3J0IFByb3RvY29sIGZyb20gJ2RldnRvb2xzLXByb3RvY29sJztcbmltcG9ydCBSZXF1ZXN0UGF1c2VkRXZlbnQgPSBQcm90b2NvbC5GZXRjaC5SZXF1ZXN0UGF1c2VkRXZlbnQ7XG5pbXBvcnQgRnJhbWVOYXZpZ2F0ZWRFdmVudCA9IFByb3RvY29sLlBhZ2UuRnJhbWVOYXZpZ2F0ZWRFdmVudDtcbmltcG9ydCBGdWxmaWxsUmVxdWVzdFJlcXVlc3QgPSBQcm90b2NvbC5GZXRjaC5GdWxmaWxsUmVxdWVzdFJlcXVlc3Q7XG5pbXBvcnQgSGVhZGVyRW50cnkgPSBQcm90b2NvbC5GZXRjaC5IZWFkZXJFbnRyeTtcbmltcG9ydCB7XG4gICAgaW5qZWN0UmVzb3VyY2VzLFxuICAgIFBhZ2VJbmplY3RhYmxlUmVzb3VyY2VzLFxuICAgIElOSkVDVEFCTEVfU0NSSVBUUyBhcyBIQU1NRVJIRUFEX0lOSkVDVEFCTEVfU0NSSVBUUyxcbiAgICBnZXRBc3NldFBhdGgsXG4gICAgUGFnZVJlc3RvcmVTdG9yYWdlc09wdGlvbnMsXG4gICAgU3RvcmFnZXNTbmFwc2hvdCxcbiAgICBQcm94eSxcbn0gZnJvbSAndGVzdGNhZmUtaGFtbWVyaGVhZCc7XG5pbXBvcnQgeyBTQ1JJUFRTLCBURVNUQ0FGRV9VSV9TVFlMRVMgfSBmcm9tICcuLi9hc3NldHMvaW5qZWN0YWJsZXMnO1xuaW1wb3J0IEVNUFRZX1BBR0VfTUFSS1VQIGZyb20gJy4vZW1wdHktcGFnZS1tYXJrdXAnO1xuaW1wb3J0IHsgU3RhdHVzQ29kZXMgfSBmcm9tICdodHRwLXN0YXR1cy1jb2Rlcyc7XG5pbXBvcnQgeyBQYWdlTG9hZEVycm9yIH0gZnJvbSAnLi4vZXJyb3JzL3Rlc3QtcnVuJztcbmltcG9ydCB7IHJlZGlyZWN0LCBuYXZpZ2F0ZVRvIH0gZnJvbSAnLi91dGlscy9jZHAnO1xuXG5pbXBvcnQge1xuICAgIERvY3VtZW50UmVzb3VyY2VJbmZvLFxuICAgIEluamVjdGFibGVSZXNvdXJjZXNPcHRpb25zLFxuICAgIFNlc3Npb25TdG9yYWdlSW5mbyxcbiAgICBTcGVjaWFsU2VydmljZVJvdXRlcyxcbn0gZnJvbSAnLi90eXBlcyc7XG5cbmltcG9ydCB7IHJlc291cmNlSW5qZWN0b3JMb2dnZXIgfSBmcm9tICcuLi91dGlscy9kZWJ1Zy1sb2dnZXJzJztcbmltcG9ydCB7XG4gICAgZ2V0UmVzcG9uc2VBc1N0cmluZyxcbiAgICBzdHJpbmdpZnlIZWFkZXJWYWx1ZXMsXG4gICAgdG9CYXNlNjRTdHJpbmcsXG59IGZyb20gJy4vdXRpbHMvc3RyaW5nJztcbmltcG9ydCB7IHNhZmVGdWxmaWxsUmVxdWVzdCB9IGZyb20gJy4vcmVxdWVzdC1waXBlbGluZS9zYWZlLWFwaSc7XG5pbXBvcnQgVGVzdFJ1bkJyaWRnZSBmcm9tICcuL3JlcXVlc3QtcGlwZWxpbmUvdGVzdC1ydW4tYnJpZGdlJztcblxuY29uc3QgUkVTUE9OU0VfUkVNT1ZFRF9IRUFERVJTID0gW1xuICAgICdjcm9zcy1vcmlnaW4tZW1iZWRkZXItcG9saWN5JyxcbiAgICAnY3Jvc3Mtb3JpZ2luLW9wZW5lci1wb2xpY3knLFxuICAgICdjcm9zcy1vcmlnaW4tcmVzb3VyY2UtcG9saWN5Jyxcbl07XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFJlc291cmNlSW5qZWN0b3Ige1xuICAgIHByaXZhdGUgcmVhZG9ubHkgX3NwZWNpYWxTZXJ2aWNlUm91dGVzOiBTcGVjaWFsU2VydmljZVJvdXRlcztcbiAgICBwcml2YXRlIHJlYWRvbmx5IF90ZXN0UnVuQnJpZGdlOiBUZXN0UnVuQnJpZGdlO1xuXG4gICAgcHVibGljIGNvbnN0cnVjdG9yICh0ZXN0UnVuQnJpZGdlOiBUZXN0UnVuQnJpZGdlLCBzcGVjaWFsU2VydmljZVJvdXRlczogU3BlY2lhbFNlcnZpY2VSb3V0ZXMpIHtcbiAgICAgICAgdGhpcy5fc3BlY2lhbFNlcnZpY2VSb3V0ZXMgPSBzcGVjaWFsU2VydmljZVJvdXRlcztcbiAgICAgICAgdGhpcy5fdGVzdFJ1bkJyaWRnZSAgICAgICAgPSB0ZXN0UnVuQnJpZGdlO1xuICAgIH1cblxuICAgIHByaXZhdGUgX2dldFJlc3RvcmVDb250ZXh0U3RvcmFnZVNjcmlwdCAoY29udGV4dFN0b3JhZ2U/OiBTZXNzaW9uU3RvcmFnZUluZm8gfCBudWxsKTogc3RyaW5nIHtcbiAgICAgICAgY29uc3QgY3VycmVudFRlc3RSdW4gPSB0aGlzLl90ZXN0UnVuQnJpZGdlLmdldEN1cnJlbnRUZXN0UnVuKCk7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gSlNPTi5zdHJpbmdpZnkoY29udGV4dFN0b3JhZ2U/LltjdXJyZW50VGVzdFJ1bi5pZF0gfHwgJycpO1xuXG4gICAgICAgIHJldHVybiBgT2JqZWN0LmRlZmluZVByb3BlcnR5KHdpbmRvdywgJyVwcm94eWxlc3NDb250ZXh0U3RvcmFnZSUnLCB7IGNvbmZpZ3VyYWJsZTogdHJ1ZSwgdmFsdWU6ICR7dmFsdWV9IH0pO2A7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfZ2V0UmVzdG9yZVN0b3JhZ2VzU2NyaXB0IChyZXN0b3JpbmdTdG9yYWdlczogU3RvcmFnZXNTbmFwc2hvdCB8IG51bGwgfCB1bmRlZmluZWQpOiBzdHJpbmcge1xuICAgICAgICBpZiAoIXJlc3RvcmluZ1N0b3JhZ2VzKVxuICAgICAgICAgICAgcmV0dXJuICcoZnVuY3Rpb24oKSB7fSkoKSc7XG5cbiAgICAgICAgcmV0dXJuIGAoZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICB3aW5kb3cubG9jYWxTdG9yYWdlLmNsZWFyKCk7XG4gICAgICAgICAgICB3aW5kb3cuc2Vzc2lvblN0b3JhZ2UuY2xlYXIoKTtcblxuICAgICAgICAgICAgY29uc3Qgc25hcHNob3QgPSAke0pTT04uc3RyaW5naWZ5KHJlc3RvcmluZ1N0b3JhZ2VzKX07XG4gICAgICAgICAgICBjb25zdCBscyAgICAgICA9IEpTT04ucGFyc2Uoc25hcHNob3QubG9jYWxTdG9yYWdlKTtcbiAgICAgICAgICAgIGNvbnN0IHNzICAgICAgID0gSlNPTi5wYXJzZShzbmFwc2hvdC5zZXNzaW9uU3RvcmFnZSk7XG5cbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbHNbMF0ubGVuZ3RoOyBpKyspXG4gICAgICAgICAgICAgICAgd2luZG93LmxvY2FsU3RvcmFnZS5zZXRJdGVtKGxzWzBdW2ldLCBsc1sxXVtpXSk7XG5cbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc3NbMF0ubGVuZ3RoOyBpKyspXG4gICAgICAgICAgICAgICAgd2luZG93LnNlc3Npb25TdG9yYWdlLnNldEl0ZW0oc3NbMF1baV0sIHNzWzFdW2ldKTtcbiAgICAgICAgfSkoKTtcbiAgICAgICAgYDtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9yZXNvbHZlUmVsYXRpdmVVcmxzIChwcm94eTogUHJveHksIHJlbGF0aXZlVXJsczogc3RyaW5nW10pOiBzdHJpbmdbXSB7XG4gICAgICAgIHJldHVybiByZWxhdGl2ZVVybHMubWFwKHVybCA9PiBwcm94eS5yZXNvbHZlUmVsYXRpdmVTZXJ2aWNlVXJsKHVybCkpO1xuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgX3ByZXBhcmVJbmplY3RhYmxlUmVzb3VyY2VzICh7IGlzSWZyYW1lLCByZXN0b3JpbmdTdG9yYWdlcywgY29udGV4dFN0b3JhZ2UsIHVzZXJTY3JpcHRzIH06IEluamVjdGFibGVSZXNvdXJjZXNPcHRpb25zKTogUHJvbWlzZTxQYWdlSW5qZWN0YWJsZVJlc291cmNlcyB8IG51bGw+IHtcbiAgICAgICAgaWYgKCF0aGlzLl90ZXN0UnVuQnJpZGdlLmdldEN1cnJlbnRUZXN0UnVuKCkpXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcblxuICAgICAgICBjb25zdCB0YXNrU2NyaXB0ID0gYXdhaXQgdGhpcy5fdGVzdFJ1bkJyaWRnZS5nZXRUYXNrU2NyaXB0KHsgaXNJZnJhbWUsIHJlc3RvcmluZ1N0b3JhZ2VzLCBjb250ZXh0U3RvcmFnZSwgdXNlclNjcmlwdHMgfSk7XG4gICAgICAgIGNvbnN0IHByb3h5ICAgICAgPSB0aGlzLl90ZXN0UnVuQnJpZGdlLmdldEJyb3dzZXJDb25uZWN0aW9uKCkuYnJvd3NlckNvbm5lY3Rpb25HYXRld2F5LnByb3h5O1xuXG4gICAgICAgIGNvbnN0IGluamVjdGFibGVSZXNvdXJjZXMgPSB7XG4gICAgICAgICAgICBzdHlsZXNoZWV0czogW1xuICAgICAgICAgICAgICAgIFRFU1RDQUZFX1VJX1NUWUxFUyxcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBzY3JpcHRzOiBbXG4gICAgICAgICAgICAgICAgLi4uSEFNTUVSSEVBRF9JTkpFQ1RBQkxFX1NDUklQVFMubWFwKGhzID0+IGdldEFzc2V0UGF0aChocywgcHJveHkub3B0aW9ucy5kZXZlbG9wbWVudE1vZGUpKSxcbiAgICAgICAgICAgICAgICAuLi5TQ1JJUFRTLm1hcChzID0+IGdldEFzc2V0UGF0aChzLCBwcm94eS5vcHRpb25zLmRldmVsb3BtZW50TW9kZSkpLFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIGVtYmVkZGVkU2NyaXB0czogWyB0aGlzLl9nZXRSZXN0b3JlU3RvcmFnZXNTY3JpcHQocmVzdG9yaW5nU3RvcmFnZXMpLCB0aGlzLl9nZXRSZXN0b3JlQ29udGV4dFN0b3JhZ2VTY3JpcHQoY29udGV4dFN0b3JhZ2UpLCB0YXNrU2NyaXB0XSxcbiAgICAgICAgICAgIHVzZXJTY3JpcHRzOiAgICAgdXNlclNjcmlwdHMgfHwgW10sXG4gICAgICAgIH07XG5cbiAgICAgICAgaW5qZWN0YWJsZVJlc291cmNlcy5zY3JpcHRzICAgICA9IHRoaXMuX3Jlc29sdmVSZWxhdGl2ZVVybHMocHJveHksIGluamVjdGFibGVSZXNvdXJjZXMuc2NyaXB0cyk7XG4gICAgICAgIGluamVjdGFibGVSZXNvdXJjZXMudXNlclNjcmlwdHMgPSB0aGlzLl9yZXNvbHZlUmVsYXRpdmVVcmxzKHByb3h5LCBpbmplY3RhYmxlUmVzb3VyY2VzLnVzZXJTY3JpcHRzKTtcbiAgICAgICAgaW5qZWN0YWJsZVJlc291cmNlcy5zdHlsZXNoZWV0cyA9IHRoaXMuX3Jlc29sdmVSZWxhdGl2ZVVybHMocHJveHksIGluamVjdGFibGVSZXNvdXJjZXMuc3R5bGVzaGVldHMpO1xuXG4gICAgICAgIHJldHVybiBpbmplY3RhYmxlUmVzb3VyY2VzO1xuICAgIH1cblxuICAgIHByaXZhdGUgX3Byb2Nlc3NSZXNwb25zZUhlYWRlcnMgKGhlYWRlcnM6IEhlYWRlckVudHJ5W10gfCB1bmRlZmluZWQpOiBIZWFkZXJFbnRyeVtdIHtcbiAgICAgICAgaWYgKCFoZWFkZXJzKVxuICAgICAgICAgICAgcmV0dXJuIFtdO1xuXG4gICAgICAgIGhlYWRlcnMgPSBoZWFkZXJzLmZpbHRlcihoZWFkZXIgPT4gIVJFU1BPTlNFX1JFTU9WRURfSEVBREVSUy5pbmNsdWRlcyhoZWFkZXIubmFtZS50b0xvd2VyQ2FzZSgpKSk7XG5cbiAgICAgICAgcmV0dXJuIHN0cmluZ2lmeUhlYWRlclZhbHVlcyhoZWFkZXJzKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIF9mdWxmaWxsUmVxdWVzdCAoY2xpZW50OiBQcm90b2NvbEFwaSwgZnVsZmlsbFJlcXVlc3RJbmZvOiBGdWxmaWxsUmVxdWVzdFJlcXVlc3QsIGJvZHk6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBhd2FpdCBzYWZlRnVsZmlsbFJlcXVlc3QoY2xpZW50LCB7XG4gICAgICAgICAgICByZXF1ZXN0SWQ6ICAgICAgIGZ1bGZpbGxSZXF1ZXN0SW5mby5yZXF1ZXN0SWQsXG4gICAgICAgICAgICByZXNwb25zZUNvZGU6ICAgIGZ1bGZpbGxSZXF1ZXN0SW5mby5yZXNwb25zZUNvZGUgfHwgU3RhdHVzQ29kZXMuT0ssXG4gICAgICAgICAgICByZXNwb25zZVBocmFzZTogIGZ1bGZpbGxSZXF1ZXN0SW5mby5yZXNwb25zZVBocmFzZSxcbiAgICAgICAgICAgIHJlc3BvbnNlSGVhZGVyczogdGhpcy5fcHJvY2Vzc1Jlc3BvbnNlSGVhZGVycyhmdWxmaWxsUmVxdWVzdEluZm8ucmVzcG9uc2VIZWFkZXJzKSxcbiAgICAgICAgICAgIGJvZHk6ICAgICAgICAgICAgdG9CYXNlNjRTdHJpbmcoYm9keSksXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyByZWRpcmVjdFRvRXJyb3JQYWdlIChjbGllbnQ6IFByb3RvY29sQXBpLCBlcnI6IEVycm9yLCB1cmw6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBjb25zdCBjdXJyZW50VGVzdFJ1biA9IHRoaXMuX3Rlc3RSdW5CcmlkZ2UuZ2V0Q3VycmVudFRlc3RSdW4oKTtcblxuICAgICAgICBpZiAoIWN1cnJlbnRUZXN0UnVuKVxuICAgICAgICAgICAgcmV0dXJuO1xuXG4gICAgICAgIGN1cnJlbnRUZXN0UnVuLnBlbmRpbmdQYWdlRXJyb3IgPSBuZXcgUGFnZUxvYWRFcnJvcihlcnIsIHVybCk7XG5cbiAgICAgICAgYXdhaXQgbmF2aWdhdGVUbyhjbGllbnQsIHRoaXMuX3NwZWNpYWxTZXJ2aWNlUm91dGVzLmVycm9yUGFnZTEpO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBnZXREb2N1bWVudFJlc291cmNlSW5mbyAoZXZlbnQ6IFJlcXVlc3RQYXVzZWRFdmVudCwgY2xpZW50OiBQcm90b2NvbEFwaSk6IFByb21pc2U8RG9jdW1lbnRSZXNvdXJjZUluZm8+IHtcbiAgICAgICAgY29uc3Qge1xuICAgICAgICAgICAgcmVxdWVzdElkLFxuICAgICAgICAgICAgcmVxdWVzdCxcbiAgICAgICAgICAgIHJlc3BvbnNlRXJyb3JSZWFzb24sXG4gICAgICAgICAgICByZXNvdXJjZVR5cGUsXG4gICAgICAgIH0gPSBldmVudDtcblxuICAgICAgICBpZiAocmVzb3VyY2VUeXBlICE9PSAnRG9jdW1lbnQnKSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIGVycm9yOiBudWxsLFxuICAgICAgICAgICAgICAgIGJvZHk6ICBudWxsLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBpZiAocmVzcG9uc2VFcnJvclJlYXNvbiA9PT0gJ05hbWVOb3RSZXNvbHZlZCcpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBlcnIgPSBuZXcgRXJyb3IoYEZhaWxlZCB0byBmaW5kIGEgRE5TLXJlY29yZCBmb3IgdGhlIHJlc291cmNlIGF0IFwiJHtldmVudC5yZXF1ZXN0LnVybH1cImApO1xuXG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgZXJyb3I6IGVycixcbiAgICAgICAgICAgICAgICAgICAgYm9keTogIG51bGwsXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgcmVzcG9uc2VPYmogPSBhd2FpdCBjbGllbnQuRmV0Y2guZ2V0UmVzcG9uc2VCb2R5KHsgcmVxdWVzdElkIH0pO1xuICAgICAgICAgICAgY29uc3QgcmVzcG9uc2VTdHIgPSBnZXRSZXNwb25zZUFzU3RyaW5nKHJlc3BvbnNlT2JqKTtcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBlcnJvcjogbnVsbCxcbiAgICAgICAgICAgICAgICBib2R5OiAgQnVmZmVyLmZyb20ocmVzcG9uc2VTdHIpLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICByZXNvdXJjZUluamVjdG9yTG9nZ2VyKCdGYWlsZWQgdG8gcHJvY2VzcyByZXF1ZXN0OiAlcycsIHJlcXVlc3QudXJsKTtcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBlcnJvcjogZXJyLFxuICAgICAgICAgICAgICAgIGJvZHk6ICBudWxsLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBwcm9jZXNzQWJvdXRCbGFua1BhZ2UgKGV2ZW50OiBGcmFtZU5hdmlnYXRlZEV2ZW50LCB1c2VyU2NyaXB0czogc3RyaW5nW10sIGNsaWVudDogUHJvdG9jb2xBcGkpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgcmVzb3VyY2VJbmplY3RvckxvZ2dlcignSGFuZGxlIHBhZ2UgYXMgYWJvdXQ6YmxhbmsuIE9yaWdpbiB1cmw6ICVzJywgZXZlbnQuZnJhbWUudXJsKTtcblxuICAgICAgICBjb25zdCBpbmplY3RhYmxlUmVzb3VyY2VzID0gYXdhaXQgdGhpcy5fcHJlcGFyZUluamVjdGFibGVSZXNvdXJjZXMoeyBpc0lmcmFtZTogZmFsc2UsIHVzZXJTY3JpcHRzIH0pIGFzIFBhZ2VJbmplY3RhYmxlUmVzb3VyY2VzO1xuICAgICAgICBjb25zdCBodG1sICAgICAgICAgICAgICAgID0gaW5qZWN0UmVzb3VyY2VzKEVNUFRZX1BBR0VfTUFSS1VQLCBpbmplY3RhYmxlUmVzb3VyY2VzKTtcblxuICAgICAgICBhd2FpdCBjbGllbnQuUGFnZS5zZXREb2N1bWVudENvbnRlbnQoe1xuICAgICAgICAgICAgZnJhbWVJZDogZXZlbnQuZnJhbWUuaWQsXG4gICAgICAgICAgICBodG1sLFxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgcHJvY2Vzc0hUTUxQYWdlQ29udGVudCAoZnVsZmlsbFJlcXVlc3RJbmZvOiBGdWxmaWxsUmVxdWVzdFJlcXVlc3QsIGluamVjdGFibGVSZXNvdXJjZXNPcHRpb25zOiBJbmplY3RhYmxlUmVzb3VyY2VzT3B0aW9ucywgY2xpZW50OiBQcm90b2NvbEFwaSk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBjb25zdCBpbmplY3RhYmxlUmVzb3VyY2VzID0gYXdhaXQgdGhpcy5fcHJlcGFyZUluamVjdGFibGVSZXNvdXJjZXMoaW5qZWN0YWJsZVJlc291cmNlc09wdGlvbnMpO1xuXG4gICAgICAgIC8vIE5PVEU6IGFuIHVuaGFuZGxlZCBleGNlcHRpb24gaW50ZXJydXB0cyB0aGUgdGVzdCBleGVjdXRpb24sXG4gICAgICAgIC8vIGFuZCB3ZSBhcmUgZm9yY2UgdG8gcmVkaXJlY3QgbWFudWFsbHkgdG8gdGhlIGlkbGUgcGFnZS5cbiAgICAgICAgaWYgKCFpbmplY3RhYmxlUmVzb3VyY2VzKVxuICAgICAgICAgICAgYXdhaXQgcmVkaXJlY3QoY2xpZW50LCBmdWxmaWxsUmVxdWVzdEluZm8ucmVxdWVzdElkLCB0aGlzLl9zcGVjaWFsU2VydmljZVJvdXRlcy5pZGxlUGFnZSk7XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgdXBkYXRlZFJlc3BvbnNlU3RyID0gaW5qZWN0UmVzb3VyY2VzKFxuICAgICAgICAgICAgICAgIGZ1bGZpbGxSZXF1ZXN0SW5mby5ib2R5IGFzIHN0cmluZyxcbiAgICAgICAgICAgICAgICBpbmplY3RhYmxlUmVzb3VyY2VzLFxuICAgICAgICAgICAgICAgIHRoaXMuX2dldFBhZ2VJbmplY3RhYmxlUmVzb3VyY2VzT3B0aW9ucyhpbmplY3RhYmxlUmVzb3VyY2VzT3B0aW9ucyksXG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgICBhd2FpdCB0aGlzLl9mdWxmaWxsUmVxdWVzdChjbGllbnQsIGZ1bGZpbGxSZXF1ZXN0SW5mbywgdXBkYXRlZFJlc3BvbnNlU3RyKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBwcm9jZXNzTm9uUHJveGllZENvbnRlbnQgKGZ1bGZpbGxSZXF1ZXN0SW5mbzogRnVsZmlsbFJlcXVlc3RSZXF1ZXN0LCBjbGllbnQ6IFByb3RvY29sQXBpKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGF3YWl0IHRoaXMuX2Z1bGZpbGxSZXF1ZXN0KGNsaWVudCwgZnVsZmlsbFJlcXVlc3RJbmZvLCBmdWxmaWxsUmVxdWVzdEluZm8uYm9keSBhcyBzdHJpbmcpO1xuICAgIH1cblxuICAgIHByaXZhdGUgX2dldFBhZ2VJbmplY3RhYmxlUmVzb3VyY2VzT3B0aW9ucyAoaW5qZWN0YWJsZVJlc291cmNlc09wdGlvbnM6IEluamVjdGFibGVSZXNvdXJjZXNPcHRpb25zKTogUGFnZVJlc3RvcmVTdG9yYWdlc09wdGlvbnMgfCB1bmRlZmluZWQge1xuICAgICAgICBjb25zdCB7IHVybCwgcmVzdG9yaW5nU3RvcmFnZXMgfSA9IGluamVjdGFibGVSZXNvdXJjZXNPcHRpb25zO1xuXG4gICAgICAgIGlmICh1cmwgJiYgcmVzdG9yaW5nU3RvcmFnZXMpIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgaG9zdDogICAgICBuZXcgVVJMKHVybCkuaG9zdCxcbiAgICAgICAgICAgICAgICBzZXNzaW9uSWQ6IHRoaXMuX3Rlc3RSdW5CcmlkZ2UuZ2V0U2Vzc2lvbklkKCksXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHZvaWQgMDtcbiAgICB9XG59XG4iXX0=
@@ -0,0 +1,39 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const api_base_1 = __importDefault(require("../api-base"));
7
+ const async_event_emitter_1 = __importDefault(require("../../utils/async-event-emitter"));
8
+ const PROXYLESS_STORAGE_BINDING = 'PROXYLESS_STORAGE_BINDING';
9
+ class SessionStorage extends api_base_1.default {
10
+ constructor(browserId, client) {
11
+ super(browserId, client);
12
+ this._eventEmitter = new async_event_emitter_1.default();
13
+ if (this._browserConnection.messageBus)
14
+ this._addTestRunEventListeners(this._browserConnection.messageBus);
15
+ this._browserConnection.on('message-bus-initialized', messageBus => {
16
+ this._addTestRunEventListeners(messageBus);
17
+ });
18
+ }
19
+ _addTestRunEventListeners(messageBus) {
20
+ messageBus.on('test-run-done', testRun => {
21
+ this._eventEmitter.emit('contextStorageTestRunDone', { testRunId: testRun.id });
22
+ });
23
+ }
24
+ on(eventName, listener) {
25
+ return this._eventEmitter.on(eventName, listener);
26
+ }
27
+ async init() {
28
+ await this._client.Runtime.addBinding({ name: PROXYLESS_STORAGE_BINDING });
29
+ await this._client.Runtime.on('bindingCalled', (event) => {
30
+ if (event.name === PROXYLESS_STORAGE_BINDING) {
31
+ const { testRunId, frameDriverId, data } = JSON.parse(event.payload);
32
+ this._eventEmitter.emit('contextStorageSync', { sessionStorage: data, testRunId, frameDriverId });
33
+ }
34
+ });
35
+ }
36
+ }
37
+ exports.default = SessionStorage;
38
+ module.exports = exports.default;
39
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvcHJveHlsZXNzL3Nlc3Npb24tc3RvcmFnZS9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUVBLDJEQUEyQztBQUUzQywwRkFBZ0U7QUFJaEUsTUFBTSx5QkFBeUIsR0FBRywyQkFBMkIsQ0FBQztBQUU5RCxNQUFxQixjQUFlLFNBQVEsa0JBQWdCO0lBR3hELFlBQWEsU0FBaUIsRUFBRSxNQUFtQjtRQUMvQyxLQUFLLENBQUMsU0FBUyxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBRXpCLElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSw2QkFBaUIsRUFBRSxDQUFDO1FBRTdDLElBQUksSUFBSSxDQUFDLGtCQUFrQixDQUFDLFVBQVU7WUFDbEMsSUFBSSxDQUFDLHlCQUF5QixDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUV2RSxJQUFJLENBQUMsa0JBQWtCLENBQUMsRUFBRSxDQUFDLHlCQUF5QixFQUFFLFVBQVUsQ0FBQyxFQUFFO1lBQy9ELElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUMvQyxDQUFDLENBQUMsQ0FBQztJQUNQLENBQUM7SUFFTyx5QkFBeUIsQ0FBRSxVQUFzQjtRQUNyRCxVQUFVLENBQUMsRUFBRSxDQUFDLGVBQWUsRUFBRSxPQUFPLENBQUMsRUFBRTtZQUNyQyxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQywyQkFBMkIsRUFBRSxFQUFFLFNBQVMsRUFBRSxPQUFPLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUNwRixDQUFDLENBQUMsQ0FBQztJQUNQLENBQUM7SUFFTSxFQUFFLENBQUUsU0FBaUIsRUFBRSxRQUFrQztRQUM1RCxPQUFPLElBQUksQ0FBQyxhQUFhLENBQUMsRUFBRSxDQUFDLFNBQVMsRUFBRSxRQUFRLENBQUMsQ0FBQztJQUN0RCxDQUFDO0lBRU0sS0FBSyxDQUFDLElBQUk7UUFDYixNQUFNLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxFQUFFLElBQUksRUFBRSx5QkFBeUIsRUFBRSxDQUFDLENBQUM7UUFFM0UsTUFBTSxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsZUFBZSxFQUFFLENBQUMsS0FBeUIsRUFBRSxFQUFFO1lBQ3pFLElBQUksS0FBSyxDQUFDLElBQUksS0FBSyx5QkFBeUIsRUFBRTtnQkFDMUMsTUFBTSxFQUFFLFNBQVMsRUFBRSxhQUFhLEVBQUUsSUFBSSxFQUFFLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7Z0JBRXJFLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLG9CQUFvQixFQUFFLEVBQUUsY0FBYyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsYUFBYSxFQUFFLENBQUMsQ0FBQzthQUNyRztRQUNMLENBQUMsQ0FBQyxDQUFDO0lBQ1AsQ0FBQztDQUNKO0FBckNELGlDQXFDQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFByb3RvY29sQXBpIH0gZnJvbSAnY2hyb21lLXJlbW90ZS1pbnRlcmZhY2UnO1xuaW1wb3J0IFByb3RvY29sIGZyb20gJ2RldnRvb2xzLXByb3RvY29sJztcbmltcG9ydCBQcm94eWxlc3NBcGlCYXNlIGZyb20gJy4uL2FwaS1iYXNlJztcbmltcG9ydCBCaW5kaW5nQ2FsbGVkRXZlbnQgPSBQcm90b2NvbC5SdW50aW1lLkJpbmRpbmdDYWxsZWRFdmVudDtcbmltcG9ydCBBc3luY0V2ZW50RW1pdHRlciBmcm9tICcuLi8uLi91dGlscy9hc3luYy1ldmVudC1lbWl0dGVyJztcbmltcG9ydCBFbWl0dGVyeSBmcm9tICdlbWl0dGVyeSc7XG5pbXBvcnQgTWVzc2FnZUJ1cyBmcm9tICcuLi8uLi91dGlscy9tZXNzYWdlLWJ1cyc7XG5cbmNvbnN0IFBST1hZTEVTU19TVE9SQUdFX0JJTkRJTkcgPSAnUFJPWFlMRVNTX1NUT1JBR0VfQklORElORyc7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFNlc3Npb25TdG9yYWdlIGV4dGVuZHMgUHJveHlsZXNzQXBpQmFzZSB7XG4gICAgcHJpdmF0ZSBfZXZlbnRFbWl0dGVyOiBBc3luY0V2ZW50RW1pdHRlcjtcblxuICAgIGNvbnN0cnVjdG9yIChicm93c2VySWQ6IHN0cmluZywgY2xpZW50OiBQcm90b2NvbEFwaSkge1xuICAgICAgICBzdXBlcihicm93c2VySWQsIGNsaWVudCk7XG5cbiAgICAgICAgdGhpcy5fZXZlbnRFbWl0dGVyID0gbmV3IEFzeW5jRXZlbnRFbWl0dGVyKCk7XG5cbiAgICAgICAgaWYgKHRoaXMuX2Jyb3dzZXJDb25uZWN0aW9uLm1lc3NhZ2VCdXMpXG4gICAgICAgICAgICB0aGlzLl9hZGRUZXN0UnVuRXZlbnRMaXN0ZW5lcnModGhpcy5fYnJvd3NlckNvbm5lY3Rpb24ubWVzc2FnZUJ1cyk7XG5cbiAgICAgICAgdGhpcy5fYnJvd3NlckNvbm5lY3Rpb24ub24oJ21lc3NhZ2UtYnVzLWluaXRpYWxpemVkJywgbWVzc2FnZUJ1cyA9PiB7XG4gICAgICAgICAgICB0aGlzLl9hZGRUZXN0UnVuRXZlbnRMaXN0ZW5lcnMobWVzc2FnZUJ1cyk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgX2FkZFRlc3RSdW5FdmVudExpc3RlbmVycyAobWVzc2FnZUJ1czogTWVzc2FnZUJ1cyk6IHZvaWQge1xuICAgICAgICBtZXNzYWdlQnVzLm9uKCd0ZXN0LXJ1bi1kb25lJywgdGVzdFJ1biA9PiB7XG4gICAgICAgICAgICB0aGlzLl9ldmVudEVtaXR0ZXIuZW1pdCgnY29udGV4dFN0b3JhZ2VUZXN0UnVuRG9uZScsIHsgdGVzdFJ1bklkOiB0ZXN0UnVuLmlkIH0pO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgb24gKGV2ZW50TmFtZTogc3RyaW5nLCBsaXN0ZW5lcjogKGV2ZW50RGF0YT86IGFueSkgPT4gYW55KTogRW1pdHRlcnkuVW5zdWJzY3JpYmVGbiB7XG4gICAgICAgIHJldHVybiB0aGlzLl9ldmVudEVtaXR0ZXIub24oZXZlbnROYW1lLCBsaXN0ZW5lcik7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGluaXQgKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBhd2FpdCB0aGlzLl9jbGllbnQuUnVudGltZS5hZGRCaW5kaW5nKHsgbmFtZTogUFJPWFlMRVNTX1NUT1JBR0VfQklORElORyB9KTtcblxuICAgICAgICBhd2FpdCB0aGlzLl9jbGllbnQuUnVudGltZS5vbignYmluZGluZ0NhbGxlZCcsIChldmVudDogQmluZGluZ0NhbGxlZEV2ZW50KSA9PiB7XG4gICAgICAgICAgICBpZiAoZXZlbnQubmFtZSA9PT0gUFJPWFlMRVNTX1NUT1JBR0VfQklORElORykge1xuICAgICAgICAgICAgICAgIGNvbnN0IHsgdGVzdFJ1bklkLCBmcmFtZURyaXZlcklkLCBkYXRhIH0gPSBKU09OLnBhcnNlKGV2ZW50LnBheWxvYWQpO1xuXG4gICAgICAgICAgICAgICAgdGhpcy5fZXZlbnRFbWl0dGVyLmVtaXQoJ2NvbnRleHRTdG9yYWdlU3luYycsIHsgc2Vzc2lvblN0b3JhZ2U6IGRhdGEsIHRlc3RSdW5JZCwgZnJhbWVEcml2ZXJJZCB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxufVxuIl19
@@ -0,0 +1,17 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.CdpStoragesProvider = void 0;
4
+ const get_active_client_1 = require("./utils/get-active-client");
5
+ const base_1 = require("../test-run/storages/base");
6
+ class CdpStoragesProvider extends base_1.StoragesProviderBase {
7
+ async _getCdpClient() {
8
+ const browserConnection = this.testRun.browserConnection;
9
+ return (0, get_active_client_1.getActiveClient)(browserConnection);
10
+ }
11
+ async clearStorages() {
12
+ const client = await this._getCdpClient();
13
+ await client.Storage.clearDataForOrigin({ origin: '*', storageTypes: 'all' });
14
+ }
15
+ }
16
+ exports.CdpStoragesProvider = CdpStoragesProvider;
17
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RvcmFnZXMtcHJvdmlkZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcHJveHlsZXNzL3N0b3JhZ2VzLXByb3ZpZGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUNBLGlFQUE0RDtBQUM1RCxvREFBbUY7QUFFbkYsTUFBYSxtQkFBb0IsU0FBUSwyQkFBb0I7SUFDakQsS0FBSyxDQUFDLGFBQWE7UUFDdkIsTUFBTSxpQkFBaUIsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLGlCQUFpQixDQUFDO1FBRXpELE9BQU8sSUFBQSxtQ0FBZSxFQUFDLGlCQUFpQixDQUFDLENBQUM7SUFDOUMsQ0FBQztJQUVELEtBQUssQ0FBQyxhQUFhO1FBQ2YsTUFBTSxNQUFNLEdBQUcsTUFBTSxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7UUFFMUMsTUFBTSxNQUFNLENBQUMsT0FBTyxDQUFDLGtCQUFrQixDQUFDLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQztJQUNsRixDQUFDO0NBQ0o7QUFaRCxrREFZQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCByZW1vdGVDaHJvbWUgZnJvbSAnY2hyb21lLXJlbW90ZS1pbnRlcmZhY2UnO1xuaW1wb3J0IHsgZ2V0QWN0aXZlQ2xpZW50IH0gZnJvbSAnLi91dGlscy9nZXQtYWN0aXZlLWNsaWVudCc7XG5pbXBvcnQgeyBTdG9yYWdlc1Byb3ZpZGVyLCBTdG9yYWdlc1Byb3ZpZGVyQmFzZSB9IGZyb20gJy4uL3Rlc3QtcnVuL3N0b3JhZ2VzL2Jhc2UnO1xuXG5leHBvcnQgY2xhc3MgQ2RwU3RvcmFnZXNQcm92aWRlciBleHRlbmRzIFN0b3JhZ2VzUHJvdmlkZXJCYXNlIGltcGxlbWVudHMgU3RvcmFnZXNQcm92aWRlciB7XG4gICAgcHJpdmF0ZSBhc3luYyBfZ2V0Q2RwQ2xpZW50ICgpOiBQcm9taXNlPHJlbW90ZUNocm9tZS5Qcm90b2NvbEFwaT4ge1xuICAgICAgICBjb25zdCBicm93c2VyQ29ubmVjdGlvbiA9IHRoaXMudGVzdFJ1bi5icm93c2VyQ29ubmVjdGlvbjtcblxuICAgICAgICByZXR1cm4gZ2V0QWN0aXZlQ2xpZW50KGJyb3dzZXJDb25uZWN0aW9uKTtcbiAgICB9XG5cbiAgICBhc3luYyBjbGVhclN0b3JhZ2VzICgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgY29uc3QgY2xpZW50ID0gYXdhaXQgdGhpcy5fZ2V0Q2RwQ2xpZW50KCk7XG5cbiAgICAgICAgYXdhaXQgY2xpZW50LlN0b3JhZ2UuY2xlYXJEYXRhRm9yT3JpZ2luKHsgb3JpZ2luOiAnKicsIHN0b3JhZ2VUeXBlczogJ2FsbCcgfSk7XG4gICAgfVxufVxuIl19
@@ -1,3 +1,10 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcHJveHlsZXNzL3R5cGVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgUHJvdG9jb2wgZnJvbSAnZGV2dG9vbHMtcHJvdG9jb2wnO1xuaW1wb3J0IFJlcXVlc3RQYXVzZWRFdmVudCA9IFByb3RvY29sLkZldGNoLlJlcXVlc3RQYXVzZWRFdmVudDtcbmltcG9ydCB7IFByb3RvY29sQXBpIH0gZnJvbSAnY2hyb21lLXJlbW90ZS1pbnRlcmZhY2UnO1xuaW1wb3J0IHsgUHJveHlsZXNzU2V0dXBPcHRpb25zIH0gZnJvbSAnLi4vc2hhcmVkL3R5cGVzJztcbmltcG9ydCB7IFN0b3JhZ2VzU25hcHNob3QgfSBmcm9tICd0ZXN0Y2FmZS1oYW1tZXJoZWFkJztcblxuZXhwb3J0IGludGVyZmFjZSBTcGVjaWFsU2VydmljZVJvdXRlcyB7XG4gICAgZXJyb3JQYWdlMTogc3RyaW5nO1xuICAgIGVycm9yUGFnZTI6IHN0cmluZztcbiAgICBvcGVuRmlsZVByb3RvY29sVXJsOiBzdHJpbmc7XG4gICAgaWRsZVBhZ2U6IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBEb2N1bWVudFJlc291cmNlSW5mbyB7XG4gICAgZXJyb3I6IGFueTtcbiAgICBib2R5OiBCdWZmZXIgfCBudWxsO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFJlcXVlc3RIYW5kbGVyIHtcbiAgICBjb25kaXRpb246IChldmVudDogUmVxdWVzdFBhdXNlZEV2ZW50LCBvcHRpb25zPzogUHJveHlsZXNzU2V0dXBPcHRpb25zLCBzZXJ2aWNlUm91dGVzPzogU3BlY2lhbFNlcnZpY2VSb3V0ZXMpID0+IGJvb2xlYW47XG4gICAgaGFuZGxlcjogKGV2ZW50OiBSZXF1ZXN0UGF1c2VkRXZlbnQsIGNsaWVudDogUHJvdG9jb2xBcGksIG9wdGlvbnM/OiBQcm94eWxlc3NTZXR1cE9wdGlvbnMpID0+IFByb21pc2U8dm9pZD47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSW5qZWN0YWJsZVJlc291cmNlc09wdGlvbnMge1xuICAgIGlzSWZyYW1lOiBib29sZWFuO1xuICAgIHVybD86IHN0cmluZztcbiAgICByZXN0b3JpbmdTdG9yYWdlcz86IFN0b3JhZ2VzU25hcHNob3QgfCBudWxsO1xufVxuIl19
3
+ exports.EventType = void 0;
4
+ var EventType;
5
+ (function (EventType) {
6
+ EventType[EventType["Mouse"] = 0] = "Mouse";
7
+ EventType[EventType["Key"] = 1] = "Key";
8
+ EventType[EventType["Touch"] = 2] = "Touch";
9
+ })(EventType = exports.EventType || (exports.EventType = {}));
10
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcHJveHlsZXNzL3R5cGVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQWtDQSxJQUFZLFNBSVg7QUFKRCxXQUFZLFNBQVM7SUFDakIsMkNBQUssQ0FBQTtJQUNMLHVDQUFHLENBQUE7SUFDSCwyQ0FBSyxDQUFBO0FBQ1QsQ0FBQyxFQUpXLFNBQVMsR0FBVCxpQkFBUyxLQUFULGlCQUFTLFFBSXBCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IFByb3RvY29sIGZyb20gJ2RldnRvb2xzLXByb3RvY29sJztcbmltcG9ydCBSZXF1ZXN0UGF1c2VkRXZlbnQgPSBQcm90b2NvbC5GZXRjaC5SZXF1ZXN0UGF1c2VkRXZlbnQ7XG5pbXBvcnQgeyBQcm90b2NvbEFwaSB9IGZyb20gJ2Nocm9tZS1yZW1vdGUtaW50ZXJmYWNlJztcbmltcG9ydCB7IFByb3h5bGVzc1NldHVwT3B0aW9ucyB9IGZyb20gJy4uL3NoYXJlZC90eXBlcyc7XG5pbXBvcnQgeyBTdG9yYWdlc1NuYXBzaG90IH0gZnJvbSAndGVzdGNhZmUtaGFtbWVyaGVhZCc7XG5pbXBvcnQgeyBEaWN0aW9uYXJ5IH0gZnJvbSAnLi4vY29uZmlndXJhdGlvbi9pbnRlcmZhY2VzJztcblxuZXhwb3J0IGludGVyZmFjZSBTcGVjaWFsU2VydmljZVJvdXRlcyB7XG4gICAgZXJyb3JQYWdlMTogc3RyaW5nO1xuICAgIGVycm9yUGFnZTI6IHN0cmluZztcbiAgICBvcGVuRmlsZVByb3RvY29sVXJsOiBzdHJpbmc7XG4gICAgaWRsZVBhZ2U6IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBEb2N1bWVudFJlc291cmNlSW5mbyB7XG4gICAgZXJyb3I6IGFueTtcbiAgICBib2R5OiBCdWZmZXIgfCBudWxsO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFJlcXVlc3RIYW5kbGVyIHtcbiAgICBjb25kaXRpb246IChldmVudDogUmVxdWVzdFBhdXNlZEV2ZW50LCBvcHRpb25zPzogUHJveHlsZXNzU2V0dXBPcHRpb25zLCBzZXJ2aWNlUm91dGVzPzogU3BlY2lhbFNlcnZpY2VSb3V0ZXMpID0+IGJvb2xlYW47XG4gICAgaGFuZGxlcjogKGV2ZW50OiBSZXF1ZXN0UGF1c2VkRXZlbnQsIGNsaWVudDogUHJvdG9jb2xBcGksIG9wdGlvbnM/OiBQcm94eWxlc3NTZXR1cE9wdGlvbnMpID0+IFByb21pc2U8dm9pZD47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSW5qZWN0YWJsZVJlc291cmNlc09wdGlvbnMge1xuICAgIGlzSWZyYW1lOiBib29sZWFuO1xuICAgIHVybD86IHN0cmluZztcbiAgICByZXN0b3JpbmdTdG9yYWdlcz86IFN0b3JhZ2VzU25hcHNob3QgfCBudWxsO1xuICAgIGNvbnRleHRTdG9yYWdlPzogU2Vzc2lvblN0b3JhZ2VJbmZvO1xuICAgIHVzZXJTY3JpcHRzPzogc3RyaW5nW107XG59XG5cbmV4cG9ydCB0eXBlIFNlc3Npb25TdG9yYWdlSW5mbyA9IERpY3Rpb25hcnk8RGljdGlvbmFyeTxzdHJpbmc+PiB8IG51bGw7XG5cbmV4cG9ydCBlbnVtIEV2ZW50VHlwZSB7XG4gICAgTW91c2UsXG4gICAgS2V5LFxuICAgIFRvdWNoLFxufVxuIl19
@@ -1,8 +1,9 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.createRequestPausedEventForResponse = exports.isPreflightRequest = exports.isRequestPausedEvent = exports.isRequest = exports.navigateTo = exports.redirect = void 0;
3
+ exports.getRequestId = exports.createRequestPausedEventForResponse = exports.isPreflightRequest = exports.isRequestPausedEvent = exports.isUnauthorized = exports.isRequest = exports.dispatchEvent = exports.navigateTo = exports.redirect = void 0;
4
4
  const http_status_codes_1 = require("http-status-codes");
5
5
  const headers_1 = require("./headers");
6
+ const types_1 = require("../types");
6
7
  async function redirect(client, requestId, url) {
7
8
  await client.Fetch.fulfillRequest({
8
9
  requestId,
@@ -17,10 +18,30 @@ async function navigateTo(client, url) {
17
18
  await client.Page.navigate({ url });
18
19
  }
19
20
  exports.navigateTo = navigateTo;
21
+ async function dispatchEvent(client, type, options) {
22
+ switch (+type) {
23
+ case types_1.EventType.Mouse:
24
+ await client.Input.dispatchMouseEvent(options);
25
+ break;
26
+ case types_1.EventType.Key:
27
+ await client.Input.dispatchKeyEvent(options);
28
+ break;
29
+ case types_1.EventType.Touch:
30
+ await client.Input.dispatchTouchEvent(options);
31
+ break;
32
+ default:
33
+ throw new Error(`Unknown "${options.type}" event type`);
34
+ }
35
+ }
36
+ exports.dispatchEvent = dispatchEvent;
20
37
  function isRequest(event) {
21
38
  return event.responseStatusCode === void 0;
22
39
  }
23
40
  exports.isRequest = isRequest;
41
+ function isUnauthorized(statusCode) {
42
+ return statusCode === 401;
43
+ }
44
+ exports.isUnauthorized = isUnauthorized;
24
45
  function isRequestPausedEvent(val) {
25
46
  return val && val.frameId && typeof val.request === 'object';
26
47
  }
@@ -36,4 +57,10 @@ function createRequestPausedEventForResponse(mockedResponse, requestEvent) {
36
57
  });
37
58
  }
38
59
  exports.createRequestPausedEventForResponse = createRequestPausedEventForResponse;
39
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2RwLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3Byb3h5bGVzcy91dGlscy9jZHAudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQ0EseURBQWdEO0FBSWhELHVDQUFtRDtBQUc1QyxLQUFLLFVBQVUsUUFBUSxDQUFFLE1BQW1CLEVBQUUsU0FBaUIsRUFBRSxHQUFXO0lBQy9FLE1BQU0sTUFBTSxDQUFDLEtBQUssQ0FBQyxjQUFjLENBQUM7UUFDOUIsU0FBUztRQUNULFlBQVksRUFBSywrQkFBVyxDQUFDLGlCQUFpQjtRQUM5QyxlQUFlLEVBQUU7WUFDYixFQUFFLElBQUksRUFBRSxVQUFVLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRTtTQUNuQztLQUNKLENBQUMsQ0FBQztBQUNQLENBQUM7QUFSRCw0QkFRQztBQUVNLEtBQUssVUFBVSxVQUFVLENBQUUsTUFBbUIsRUFBRSxHQUFXO0lBQzlELE1BQU0sTUFBTSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDO0FBQ3hDLENBQUM7QUFGRCxnQ0FFQztBQUVELFNBQWdCLFNBQVMsQ0FBRSxLQUF5QjtJQUNoRCxPQUFPLEtBQUssQ0FBQyxrQkFBa0IsS0FBSyxLQUFLLENBQUMsQ0FBQztBQUMvQyxDQUFDO0FBRkQsOEJBRUM7QUFFRCxTQUFnQixvQkFBb0IsQ0FBRSxHQUFRO0lBQzFDLE9BQU8sR0FBRyxJQUFJLEdBQUcsQ0FBQyxPQUFPLElBQUksT0FBTyxHQUFHLENBQUMsT0FBTyxLQUFLLFFBQVEsQ0FBQztBQUNqRSxDQUFDO0FBRkQsb0RBRUM7QUFFRCxTQUFnQixrQkFBa0IsQ0FBRSxLQUF5QjtJQUN6RCxPQUFPLEtBQUssQ0FBQyxPQUFPLENBQUMsTUFBTSxLQUFLLFNBQVMsQ0FBQztBQUM5QyxDQUFDO0FBRkQsZ0RBRUM7QUFFRCxTQUFnQixtQ0FBbUMsQ0FBRSxjQUFtQyxFQUFFLFlBQWdDO0lBQ3RILE9BQU8sTUFBTSxDQUFDLE1BQU0sQ0FBQyxFQUFFLEVBQUUsWUFBWSxFQUFFO1FBQ25DLGtCQUFrQixFQUFFLGNBQWMsQ0FBQyxVQUFVO1FBQzdDLGVBQWUsRUFBSyxJQUFBLGdDQUFzQixFQUFDLGNBQWMsQ0FBQyxPQUFPLENBQUM7S0FDckUsQ0FBQyxDQUFDO0FBQ1AsQ0FBQztBQUxELGtGQUtDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgUHJvdG9jb2xBcGkgfSBmcm9tICdjaHJvbWUtcmVtb3RlLWludGVyZmFjZSc7XG5pbXBvcnQgeyBTdGF0dXNDb2RlcyB9IGZyb20gJ2h0dHAtc3RhdHVzLWNvZGVzJztcbmltcG9ydCBQcm90b2NvbCBmcm9tICdkZXZ0b29scy1wcm90b2NvbCc7XG5pbXBvcnQgUmVxdWVzdFBhdXNlZEV2ZW50ID0gUHJvdG9jb2wuRmV0Y2guUmVxdWVzdFBhdXNlZEV2ZW50O1xuaW1wb3J0IHsgSW5jb21pbmdNZXNzYWdlTGlrZSB9IGZyb20gJ3Rlc3RjYWZlLWhhbW1lcmhlYWQnO1xuaW1wb3J0IHsgY29udmVydFRvSGVhZGVyRW50cmllcyB9IGZyb20gJy4vaGVhZGVycyc7XG5cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlZGlyZWN0IChjbGllbnQ6IFByb3RvY29sQXBpLCByZXF1ZXN0SWQ6IHN0cmluZywgdXJsOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCBjbGllbnQuRmV0Y2guZnVsZmlsbFJlcXVlc3Qoe1xuICAgICAgICByZXF1ZXN0SWQsXG4gICAgICAgIHJlc3BvbnNlQ29kZTogICAgU3RhdHVzQ29kZXMuTU9WRURfUEVSTUFORU5UTFksXG4gICAgICAgIHJlc3BvbnNlSGVhZGVyczogW1xuICAgICAgICAgICAgeyBuYW1lOiAnbG9jYXRpb24nLCB2YWx1ZTogdXJsIH0sXG4gICAgICAgIF0sXG4gICAgfSk7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBuYXZpZ2F0ZVRvIChjbGllbnQ6IFByb3RvY29sQXBpLCB1cmw6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IGNsaWVudC5QYWdlLm5hdmlnYXRlKHsgdXJsIH0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNSZXF1ZXN0IChldmVudDogUmVxdWVzdFBhdXNlZEV2ZW50KTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGV2ZW50LnJlc3BvbnNlU3RhdHVzQ29kZSA9PT0gdm9pZCAwO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNSZXF1ZXN0UGF1c2VkRXZlbnQgKHZhbDogYW55KTogdmFsIGlzIFJlcXVlc3RQYXVzZWRFdmVudCB7XG4gICAgcmV0dXJuIHZhbCAmJiB2YWwuZnJhbWVJZCAmJiB0eXBlb2YgdmFsLnJlcXVlc3QgPT09ICdvYmplY3QnO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNQcmVmbGlnaHRSZXF1ZXN0IChldmVudDogUmVxdWVzdFBhdXNlZEV2ZW50KTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGV2ZW50LnJlcXVlc3QubWV0aG9kID09PSAnT1BUSU9OUyc7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVSZXF1ZXN0UGF1c2VkRXZlbnRGb3JSZXNwb25zZSAobW9ja2VkUmVzcG9uc2U6IEluY29taW5nTWVzc2FnZUxpa2UsIHJlcXVlc3RFdmVudDogUmVxdWVzdFBhdXNlZEV2ZW50KTogUmVxdWVzdFBhdXNlZEV2ZW50IHtcbiAgICByZXR1cm4gT2JqZWN0LmFzc2lnbih7fSwgcmVxdWVzdEV2ZW50LCB7XG4gICAgICAgIHJlc3BvbnNlU3RhdHVzQ29kZTogbW9ja2VkUmVzcG9uc2Uuc3RhdHVzQ29kZSxcbiAgICAgICAgcmVzcG9uc2VIZWFkZXJzOiAgICBjb252ZXJ0VG9IZWFkZXJFbnRyaWVzKG1vY2tlZFJlc3BvbnNlLmhlYWRlcnMpLFxuICAgIH0pO1xufVxuIl19
60
+ function getRequestId(event) {
61
+ if (isRequestPausedEvent(event))
62
+ return event.networkId;
63
+ return event.frame.loaderId;
64
+ }
65
+ exports.getRequestId = getRequestId;
66
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2RwLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3Byb3h5bGVzcy91dGlscy9jZHAudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQ0EseURBQWdEO0FBS2hELHVDQUFtRDtBQUNuRCxvQ0FBcUM7QUFHOUIsS0FBSyxVQUFVLFFBQVEsQ0FBRSxNQUFtQixFQUFFLFNBQWlCLEVBQUUsR0FBVztJQUMvRSxNQUFNLE1BQU0sQ0FBQyxLQUFLLENBQUMsY0FBYyxDQUFDO1FBQzlCLFNBQVM7UUFDVCxZQUFZLEVBQUssK0JBQVcsQ0FBQyxpQkFBaUI7UUFDOUMsZUFBZSxFQUFFO1lBQ2IsRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUU7U0FDbkM7S0FDSixDQUFDLENBQUM7QUFDUCxDQUFDO0FBUkQsNEJBUUM7QUFFTSxLQUFLLFVBQVUsVUFBVSxDQUFFLE1BQW1CLEVBQUUsR0FBVztJQUM5RCxNQUFNLE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQztBQUN4QyxDQUFDO0FBRkQsZ0NBRUM7QUFFTSxLQUFLLFVBQVUsYUFBYSxDQUFFLE1BQW1CLEVBQUUsSUFBZSxFQUFFLE9BQVk7SUFDbkYsUUFBUSxDQUFDLElBQUksRUFBRTtRQUNYLEtBQUssaUJBQVMsQ0FBQyxLQUFLO1lBQ2hCLE1BQU0sTUFBTSxDQUFDLEtBQUssQ0FBQyxrQkFBa0IsQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUMvQyxNQUFNO1FBQ1YsS0FBSyxpQkFBUyxDQUFDLEdBQUc7WUFDZCxNQUFNLE1BQU0sQ0FBQyxLQUFLLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDN0MsTUFBTTtRQUNWLEtBQUssaUJBQVMsQ0FBQyxLQUFLO1lBQ2hCLE1BQU0sTUFBTSxDQUFDLEtBQUssQ0FBQyxrQkFBa0IsQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUMvQyxNQUFNO1FBQ1Y7WUFDSSxNQUFNLElBQUksS0FBSyxDQUFDLFlBQVksT0FBTyxDQUFDLElBQUksY0FBYyxDQUFDLENBQUM7S0FDL0Q7QUFDTCxDQUFDO0FBZEQsc0NBY0M7QUFFRCxTQUFnQixTQUFTLENBQUUsS0FBeUI7SUFDaEQsT0FBTyxLQUFLLENBQUMsa0JBQWtCLEtBQUssS0FBSyxDQUFDLENBQUM7QUFDL0MsQ0FBQztBQUZELDhCQUVDO0FBRUQsU0FBZ0IsY0FBYyxDQUFFLFVBQWtCO0lBQzlDLE9BQU8sVUFBVSxLQUFLLEdBQUcsQ0FBQztBQUM5QixDQUFDO0FBRkQsd0NBRUM7QUFFRCxTQUFnQixvQkFBb0IsQ0FBRSxHQUFRO0lBQzFDLE9BQU8sR0FBRyxJQUFJLEdBQUcsQ0FBQyxPQUFPLElBQUksT0FBTyxHQUFHLENBQUMsT0FBTyxLQUFLLFFBQVEsQ0FBQztBQUNqRSxDQUFDO0FBRkQsb0RBRUM7QUFFRCxTQUFnQixrQkFBa0IsQ0FBRSxLQUF5QjtJQUN6RCxPQUFPLEtBQUssQ0FBQyxPQUFPLENBQUMsTUFBTSxLQUFLLFNBQVMsQ0FBQztBQUM5QyxDQUFDO0FBRkQsZ0RBRUM7QUFFRCxTQUFnQixtQ0FBbUMsQ0FBRSxjQUFtQyxFQUFFLFlBQWdDO0lBQ3RILE9BQU8sTUFBTSxDQUFDLE1BQU0sQ0FBQyxFQUFFLEVBQUUsWUFBWSxFQUFFO1FBQ25DLGtCQUFrQixFQUFFLGNBQWMsQ0FBQyxVQUFVO1FBQzdDLGVBQWUsRUFBSyxJQUFBLGdDQUFzQixFQUFDLGNBQWMsQ0FBQyxPQUFPLENBQUM7S0FDckUsQ0FBQyxDQUFDO0FBQ1AsQ0FBQztBQUxELGtGQUtDO0FBRUQsU0FBZ0IsWUFBWSxDQUFFLEtBQStDO0lBQ3pFLElBQUksb0JBQW9CLENBQUMsS0FBSyxDQUFDO1FBQzNCLE9BQU8sS0FBSyxDQUFDLFNBQW1CLENBQUM7SUFFckMsT0FBTyxLQUFLLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQztBQUNoQyxDQUFDO0FBTEQsb0NBS0MiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBQcm90b2NvbEFwaSB9IGZyb20gJ2Nocm9tZS1yZW1vdGUtaW50ZXJmYWNlJztcbmltcG9ydCB7IFN0YXR1c0NvZGVzIH0gZnJvbSAnaHR0cC1zdGF0dXMtY29kZXMnO1xuaW1wb3J0IFByb3RvY29sIGZyb20gJ2RldnRvb2xzLXByb3RvY29sJztcbmltcG9ydCBSZXF1ZXN0UGF1c2VkRXZlbnQgPSBQcm90b2NvbC5GZXRjaC5SZXF1ZXN0UGF1c2VkRXZlbnQ7XG5pbXBvcnQgRnJhbWVOYXZpZ2F0ZWRFdmVudCA9IFByb3RvY29sLlBhZ2UuRnJhbWVOYXZpZ2F0ZWRFdmVudDtcbmltcG9ydCB7IEluY29taW5nTWVzc2FnZUxpa2UgfSBmcm9tICd0ZXN0Y2FmZS1oYW1tZXJoZWFkJztcbmltcG9ydCB7IGNvbnZlcnRUb0hlYWRlckVudHJpZXMgfSBmcm9tICcuL2hlYWRlcnMnO1xuaW1wb3J0IHsgRXZlbnRUeXBlIH0gZnJvbSAnLi4vdHlwZXMnO1xuXG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZWRpcmVjdCAoY2xpZW50OiBQcm90b2NvbEFwaSwgcmVxdWVzdElkOiBzdHJpbmcsIHVybDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgY2xpZW50LkZldGNoLmZ1bGZpbGxSZXF1ZXN0KHtcbiAgICAgICAgcmVxdWVzdElkLFxuICAgICAgICByZXNwb25zZUNvZGU6ICAgIFN0YXR1c0NvZGVzLk1PVkVEX1BFUk1BTkVOVExZLFxuICAgICAgICByZXNwb25zZUhlYWRlcnM6IFtcbiAgICAgICAgICAgIHsgbmFtZTogJ2xvY2F0aW9uJywgdmFsdWU6IHVybCB9LFxuICAgICAgICBdLFxuICAgIH0pO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gbmF2aWdhdGVUbyAoY2xpZW50OiBQcm90b2NvbEFwaSwgdXJsOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCBjbGllbnQuUGFnZS5uYXZpZ2F0ZSh7IHVybCB9KTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGRpc3BhdGNoRXZlbnQgKGNsaWVudDogUHJvdG9jb2xBcGksIHR5cGU6IEV2ZW50VHlwZSwgb3B0aW9uczogYW55KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgc3dpdGNoICgrdHlwZSkge1xuICAgICAgICBjYXNlIEV2ZW50VHlwZS5Nb3VzZTpcbiAgICAgICAgICAgIGF3YWl0IGNsaWVudC5JbnB1dC5kaXNwYXRjaE1vdXNlRXZlbnQob3B0aW9ucyk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBFdmVudFR5cGUuS2V5OlxuICAgICAgICAgICAgYXdhaXQgY2xpZW50LklucHV0LmRpc3BhdGNoS2V5RXZlbnQob3B0aW9ucyk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBFdmVudFR5cGUuVG91Y2g6XG4gICAgICAgICAgICBhd2FpdCBjbGllbnQuSW5wdXQuZGlzcGF0Y2hUb3VjaEV2ZW50KG9wdGlvbnMpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gXCIke29wdGlvbnMudHlwZX1cIiBldmVudCB0eXBlYCk7XG4gICAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNSZXF1ZXN0IChldmVudDogUmVxdWVzdFBhdXNlZEV2ZW50KTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGV2ZW50LnJlc3BvbnNlU3RhdHVzQ29kZSA9PT0gdm9pZCAwO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNVbmF1dGhvcml6ZWQgKHN0YXR1c0NvZGU6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgIHJldHVybiBzdGF0dXNDb2RlID09PSA0MDE7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc1JlcXVlc3RQYXVzZWRFdmVudCAodmFsOiBhbnkpOiB2YWwgaXMgUmVxdWVzdFBhdXNlZEV2ZW50IHtcbiAgICByZXR1cm4gdmFsICYmIHZhbC5mcmFtZUlkICYmIHR5cGVvZiB2YWwucmVxdWVzdCA9PT0gJ29iamVjdCc7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc1ByZWZsaWdodFJlcXVlc3QgKGV2ZW50OiBSZXF1ZXN0UGF1c2VkRXZlbnQpOiBib29sZWFuIHtcbiAgICByZXR1cm4gZXZlbnQucmVxdWVzdC5tZXRob2QgPT09ICdPUFRJT05TJztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVJlcXVlc3RQYXVzZWRFdmVudEZvclJlc3BvbnNlIChtb2NrZWRSZXNwb25zZTogSW5jb21pbmdNZXNzYWdlTGlrZSwgcmVxdWVzdEV2ZW50OiBSZXF1ZXN0UGF1c2VkRXZlbnQpOiBSZXF1ZXN0UGF1c2VkRXZlbnQge1xuICAgIHJldHVybiBPYmplY3QuYXNzaWduKHt9LCByZXF1ZXN0RXZlbnQsIHtcbiAgICAgICAgcmVzcG9uc2VTdGF0dXNDb2RlOiBtb2NrZWRSZXNwb25zZS5zdGF0dXNDb2RlLFxuICAgICAgICByZXNwb25zZUhlYWRlcnM6ICAgIGNvbnZlcnRUb0hlYWRlckVudHJpZXMobW9ja2VkUmVzcG9uc2UuaGVhZGVycyksXG4gICAgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRSZXF1ZXN0SWQgKGV2ZW50OiBSZXF1ZXN0UGF1c2VkRXZlbnQgfCBGcmFtZU5hdmlnYXRlZEV2ZW50KTogc3RyaW5nIHtcbiAgICBpZiAoaXNSZXF1ZXN0UGF1c2VkRXZlbnQoZXZlbnQpKVxuICAgICAgICByZXR1cm4gZXZlbnQubmV0d29ya0lkIGFzIHN0cmluZztcblxuICAgIHJldHVybiBldmVudC5mcmFtZS5sb2FkZXJJZDtcbn1cbiJdfQ==
@@ -0,0 +1,8 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getActiveClient = void 0;
4
+ async function getActiveClient(connection) {
5
+ return connection.provider.plugin.openedBrowsers[connection.id].browserClient.getActiveClient();
6
+ }
7
+ exports.getActiveClient = getActiveClient;
8
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2V0LWFjdGl2ZS1jbGllbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvcHJveHlsZXNzL3V0aWxzL2dldC1hY3RpdmUtY2xpZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUdPLEtBQUssVUFBVSxlQUFlLENBQUUsVUFBNkI7SUFDaEUsT0FBTyxVQUFVLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxjQUFjLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxlQUFlLEVBQUUsQ0FBQztBQUNwRyxDQUFDO0FBRkQsMENBRUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgcmVtb3RlQ2hyb21lIGZyb20gJ2Nocm9tZS1yZW1vdGUtaW50ZXJmYWNlJztcbmltcG9ydCBCcm93c2VyQ29ubmVjdGlvbiBmcm9tICcuLi8uLi9icm93c2VyL2Nvbm5lY3Rpb24nO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0QWN0aXZlQ2xpZW50IChjb25uZWN0aW9uOiBCcm93c2VyQ29ubmVjdGlvbik6IFByb21pc2U8cmVtb3RlQ2hyb21lLlByb3RvY29sQXBpPiB7XG4gICAgcmV0dXJuIGNvbm5lY3Rpb24ucHJvdmlkZXIucGx1Z2luLm9wZW5lZEJyb3dzZXJzW2Nvbm5lY3Rpb24uaWRdLmJyb3dzZXJDbGllbnQuZ2V0QWN0aXZlQ2xpZW50KCk7XG59XG4iXX0=
@@ -99,12 +99,13 @@ class Bootstrapper {
99
99
  }
100
100
  async _compileTests({ sourceList, compilerOptions, runnableConfigurationId }) {
101
101
  const baseUrl = this.configuration.getOption(option_names_1.default.baseUrl);
102
+ const experimentalEsm = this.configuration.getOption(option_names_1.default.experimentalEsm);
102
103
  if (this.compilerService) {
103
104
  await this.compilerService.init();
104
105
  await this.compilerService.setUserVariables(user_variables_1.default.value);
105
106
  return this.compilerService.getTests({ sourceList, compilerOptions, runnableConfigurationId }, baseUrl);
106
107
  }
107
- const compiler = new compiler_1.default(sourceList, compilerOptions, { baseUrl, isCompilerServiceMode: false });
108
+ const compiler = new compiler_1.default(sourceList, compilerOptions, { baseUrl, isCompilerServiceMode: false, experimentalEsm });
108
109
  return compiler.getTests();
109
110
  }
110
111
  _assertGlobalHooks() {
@@ -239,4 +240,4 @@ class Bootstrapper {
239
240
  }
240
241
  exports.default = Bootstrapper;
241
242
  module.exports = exports.default;
242
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYm9vdHN0cmFwcGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3J1bm5lci9ib290c3RyYXBwZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxtQ0FNZ0I7QUFFaEIsa0RBQTBCO0FBQzFCLGtFQUF1QztBQUN2QywyREFBbUM7QUFDbkMsdUVBQXVFO0FBQ3ZFLGdFQUF1QztBQUN2QywrQ0FBaUQ7QUFDakQsMkNBQWlEO0FBQ2pELDhEQUFxQztBQUNyQywrRUFBcUQ7QUFDckQseUVBQThEO0FBQzlELDRDQUE4RDtBQVM5RCwrRUFBc0Q7QUFDdEQsdUZBQWdFO0FBQ2hFLHlGQUErRDtBQUMvRCx5RUFBZ0Q7QUFHaEQsbUZBQXlEO0FBQ3pELHVFQUFtRTtBQUNuRSw2REFBdUQ7QUFDdkQsbUZBQXFFO0FBQ3JFLDJFQUFrRDtBQUVsRCxpRkFBeUQ7QUFFekQsTUFBTSxXQUFXLEdBQUcsdUJBQXVCLENBQUM7QUEyQjVDLFNBQVMsY0FBYyxDQUE4QixLQUEwQjtJQUMzRSxPQUFRLEtBQXlCLENBQUMsS0FBSyxLQUFLLEtBQUssQ0FBQyxDQUFDO0FBQ3ZELENBQUM7QUFhRCxNQUFxQixZQUFZO0lBeUI3QixZQUFvQixFQUFFLHdCQUF3QixFQUFFLGVBQWUsRUFBRSxVQUFVLEVBQUUsYUFBYSxFQUFvQjtRQUMxRyxJQUFJLENBQUMsd0JBQXdCLEdBQUcsd0JBQXdCLENBQUM7UUFDekQsSUFBSSxDQUFDLFdBQVcsR0FBZ0IsQ0FBQyxDQUFDO1FBQ2xDLElBQUksQ0FBQyxPQUFPLEdBQW9CLEVBQUUsQ0FBQztRQUNuQyxJQUFJLENBQUMsUUFBUSxHQUFtQixFQUFFLENBQUM7UUFDbkMsSUFBSSxDQUFDLFNBQVMsR0FBa0IsRUFBRSxDQUFDO1FBQ25DLElBQUksQ0FBQyxNQUFNLEdBQXFCLEtBQUssQ0FBQyxDQUFDO1FBQ3ZDLElBQUksQ0FBQyxVQUFVLEdBQWlCLEtBQUssQ0FBQyxDQUFDO1FBQ3ZDLElBQUksQ0FBQyxZ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c291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgICBjaHVuayxcbiAgICB0aW1lcyxcbiAgICB1bmlvbixcbiAgICBjYXN0QXJyYXksXG4gICAgZmxhdHRlbkRlZXAgYXMgZmxhdHRlbixcbn0gZnJvbSAnbG9kYXNoJztcblxuaW1wb3J0IGRlYnVnIGZyb20gJ2RlYnVnJztcbmltcG9ydCBwcmV0dHlUaW1lIGZyb20gJ3ByZXR0eS1ocnRpbWUnO1xuaW1wb3J0IENvbXBpbGVyIGZyb20gJy4uL2NvbXBpbGVyJztcbmltcG9ydCBCcm93c2VyQ29ubmVjdGlvbiwgeyBCcm93c2VySW5mbyB9IGZyb20gJy4uL2Jyb3dzZXIvY29ubmVjdGlvbic7XG5pbXBvcnQgQnJvd3NlclNldCBmcm9tICcuL2Jyb3dzZXItc2V0JztcbmltcG9ydCB7IEdlbmVyYWxFcnJvciB9IGZyb20gJy4uL2Vycm9ycy9ydW50aW1lJztcbmltcG9ydCB7IFJVTlRJTUVfRVJST1JTIH0gZnJvbSAnLi4vZXJyb3JzL3R5cGVzJztcbmltcG9ydCBUZXN0ZWRBcHAgZnJvbSAnLi90ZXN0ZWQtYXBwJztcbmltcG9ydCBwYXJzZUZpbGVMaXN0IGZyb20gJy4uL3V0aWxzL3BhcnNlLWZpbGUtbGlzdCc7XG5pbXBvcnQgbG9hZENsaWVudFNjcmlwdHMgZnJvbSAnLi4vY3VzdG9tLWNsaWVudC1zY3JpcHRzL2xvYWQnO1xuaW1wb3J0IHsgZ2V0Q29uY2F0ZW5hdGVkVmFsdWVzU3RyaW5nIH0gZnJvbSAnLi4vdXRpbHMvc3RyaW5nJztcbmltcG9ydCB7IFJlcG9ydGVyU291cmNlIH0gZnJvbSAnLi4vcmVwb3J0ZXIvaW50ZXJmYWNlcyc7XG5pbXBvcnQgQ2xpZW50U2NyaXB0IGZyb20gJy4uL2N1c3RvbS1jbGllbnQtc2NyaXB0cy9jbGllbnQtc2NyaXB0JztcbmltcG9ydCBDbGllbnRTY3JpcHRJbml0IGZyb20gJy4uL2N1c3RvbS1jbGllbnQtc2NyaXB0cy9jbGllbnQtc2NyaXB0LWluaXQnO1xuaW1wb3J0IEJyb3dzZXJDb25uZWN0aW9uR2F0ZXdheSBmcm9tICcuLi9icm93c2VyL2Nvbm5lY3Rpb24vZ2F0ZXdheSc7XG5pbXBvcnQgeyBDb21waWxlckFyZ3VtZW50cyB9IGZyb20gJy4uL2NvbXBpbGVyL2ludGVyZmFjZXMnO1xuaW1wb3J0IENvbXBpbGVyU2VydmljZSBmcm9tICcuLi9zZXJ2aWNlcy9jb21waWxlci9ob3N0JztcbmltcG9ydCBUZXN0IGZyb20gJy4uL2FwaS9zdHJ1Y3R1cmUvdGVzdCc7XG5pbXBvcnQgeyBCb290c3RyYXBwZXJJbml0LCBCcm93c2VyU2V0T3B0aW9ucyB9IGZyb20gJy4vaW50ZXJmYWNlcyc7XG5pbXBvcnQgV2FybmluZ0xvZyBmcm9tICcuLi9ub3RpZmljYXRpb25zL3dhcm5pbmctbG9nJztcbmltcG9ydCBXQVJOSU5HX01FU1NBR0VTIGZyb20gJy4uL25vdGlmaWNhdGlvbnMvd2FybmluZy1tZXNzYWdlJztcbmltcG9ydCBndWFyZFRpbWVFeGVjdXRpb24gZnJvbSAnLi4vdXRpbHMvZ3VhcmQtdGltZS1leGVjdXRpb24nO1xuaW1wb3J0IGFzeW5jRmlsdGVyIGZyb20gJy4uL3V0aWxzL2FzeW5jLWZpbHRlcic7XG5pbXBvcnQgRml4dHVyZSBmcm9tICcuLi9hcGkvc3RydWN0dXJlL2ZpeHR1cmUnO1xuaW1wb3J0IE1lc3NhZ2VCdXMgZnJvbSAnLi4vdXRpbHMvbWVzc2FnZS1idXMnO1xuaW1wb3J0IHdyYXBUZXN0RnVuY3Rpb24gZnJvbSAnLi4vYXBpL3dyYXAtdGVzdC1mdW5jdGlvbic7XG5pbXBvcnQgeyBhc3NlcnRUeXBlLCBpcyB9IGZyb20gJy4uL2Vycm9ycy9ydW50aW1lL3R5cGUtYXNzZXJ0aW9ucyc7XG5pbXBvcnQgeyBnZW5lcmF0ZVVuaXF1ZUlkIH0gZnJvbSAndGVzdGNhZmUtaGFtbWVyaGVhZCc7XG5pbXBvcnQgYXNzZXJ0UmVxdWVzdEhvb2tUeXBlIGZyb20gJy4uL2FwaS9yZXF1ZXN0LWhvb2tzL2Fzc2VydC10eXBlJztcbmltcG9ydCB1c2VyVmFyaWFibGVzIGZyb20gJy4uL2FwaS91c2VyLXZhcmlhYmxlcyc7XG5pbXBvcnQgQ29uZmlndXJhdGlvbiBmcm9tICcuLi9jb25maWd1cmF0aW9uL2NvbmZpZ3VyYXRpb24tYmFzZSc7XG5pbXBvcnQgT1BUSU9OX05BTUVTIGZyb20gJy4uL2NvbmZpZ3VyYXRpb24vb3B0aW9uLW5hbWVzJztcblxuY29uc3QgREVCVUdfU0NPUEUgPSAndGVzdGNhZmU6Ym9vdHN0cmFwcGVyJztcblxudHlwZSBUZXN0U291cmNlID0gdW5rbm93bjtcblxudHlwZSBCcm93c2VySW5mb1NvdXJjZSA9IEJyb3dzZXJJbmZvIHwgQnJvd3NlckNvbm5lY3Rpb247XG5cbmludGVyZmFjZSBQcm9taXNlU3VjY2VzczxUPiB7XG4gICAgcmVzdWx0OiBUO1xufVxuXG5pbnRlcmZhY2UgUHJvbWlzZUVycm9yPEUgZXh0ZW5kcyBFcnJvciA9IEVycm9yPiB7XG4gICAgZXJyb3I6IEU7XG59XG5cbmludGVyZmFjZSBCYXNpY1J1bnRpbWVSZXNvdXJjZXMge1xuICAgIGJyb3dzZXJTZXQ6IEJyb3dzZXJTZXQ7XG4gICAgdGVzdHM6IFRlc3RbXTtcbiAgICB0ZXN0ZWRBcHA/OiBUZXN0ZWRBcHA7XG59XG5cbmludGVyZmFjZSBSdW5uYWJsZUNvbmZpZ3VyYXRpb24gZXh0ZW5kcyBCYXNpY1J1bnRpbWVSZXNvdXJjZXMge1xuICAgIGNvbW1vbkNsaWVudFNjcmlwdHM6IENsaWVudFNjcmlwdFtdO1xuICAgIGlkOiBzdHJpbmc7XG59XG5cbnR5cGUgUHJvbWlzZVJlc3VsdDxULCBFIGV4dGVuZHMgRXJyb3IgPSBFcnJvcj4gPSBQcm9taXNlU3VjY2VzczxUPiB8IFByb21pc2VFcnJvcjxFPjtcblxuZnVuY3Rpb24gaXNQcm9taXNlRXJyb3I8VCwgRSBleHRlbmRzIEVycm9yID0gRXJyb3I+ICh2YWx1ZTogUHJvbWlzZVJlc3VsdDxULCBFPik6IHZhbHVlIGlzIFByb21pc2VFcnJvcjxFPiB7XG4gICAgcmV0dXJuICh2YWx1ZSBhcyBQcm9taXNlRXJyb3I8RT4pLmVycm9yICE9PSB2b2lkIDA7XG59XG5cbmludGVyZmFjZSBTZXBhcmF0ZWRCcm93c2VySW5mbyB7XG4gICAgcmVtb3RlczogQnJvd3NlckNvbm5lY3Rpb25bXTtcbiAgICBhdXRvbWF0ZWQ6IEJyb3dzZXJJbmZvW107XG59XG5cbnR5cGUgUHJvbWlzZUNvbGxlY3Rpb248VD4gPSB7XG4gICAgW0sgaW4ga2V5b2YgVF06IFByb21pc2U8VFtLXT5cbn1cblxudHlwZSBSZXN1bHRDb2xsZWN0aW9uPFQ+ID0geyBbUCBpbiBrZXlvZiBUXTogUHJvbWlzZVJlc3VsdDxUW1BdPiB9O1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBCb290c3RyYXBwZXIge1xuICAgIHByaXZhdGUgcmVhZG9ubHkgYnJvd3NlckNvbm5lY3Rpb25HYXRld2F5OiBCcm93c2VyQ29ubmVjdGlvbkdhdGV3YXk7XG4gICAgcHVibGljIGNvbmN1cnJlbmN5OiBudW1iZXI7XG4gICAgcHVibGljIHNvdXJjZXM6IFRlc3RTb3VyY2VbXTtcbiAgICBwdWJsaWMgYnJvd3NlcnM6IEJyb3dzZXJJbmZvU291cmNlW107XG4gICAgcHVibGljIHJlcG9ydGVyczogUmVwb3J0ZXJTb3VyY2VbXTtcbiAgICBwdWJsaWMgZmlsdGVyPzogRmlsdGVyRnVuY3Rpb247XG4gICAgcHVibGljIGFwcENvbW1hbmQ/OiBzdHJpbmc7XG4gICAgcHVibGljIGFwcEluaXREZWxheT86IG51bWJlcjtcbiAgICBwdWJsaWMgdHNDb25maWdQYXRoPzogc3RyaW5nO1xuICAgIHB1YmxpYyBjbGllbnRTY3JpcHRzOiBDbGllbnRTY3JpcHRJbml0W107XG4gICAgcHVibGljIGRpc2FibGVNdWx0aXBsZVdpbmRvd3M6IGJvb2xlYW47XG4gICAgcHVibGljIHByb3h5bGVzczogYm9vbGVhbjtcbiAgICBwdWJsaWMgY29tcGlsZXJPcHRpb25zPzogQ29tcGlsZXJPcHRpb25zO1xuICAgIHB1YmxpYyBicm93c2VySW5pdFRpbWVvdXQ/OiBudW1iZXI7XG4gICAgcHVibGljIGhvb2tzPzogR2xvYmFsSG9va3M7XG4gICAgcHVibGljIGNvbmZpZ3VyYXRpb246IENvbmZpZ3VyYXRpb247XG5cbiAgICBwcml2YXRlIHJlYWRvbmx5IGNvbXBpbGVyU2VydmljZT86IENvbXBpbGVyU2VydmljZTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IGRlYnVnTG9nZ2VyOiBkZWJ1Zy5EZWJ1Z2dlcjtcbiAgICBwcml2YXRlIHJlYWRvbmx5IHdhcm5pbmdMb2c6IFdhcm5pbmdMb2c7XG4gICAgcHJpdmF0ZSByZWFkb25seSBtZXNzYWdlQnVzOiBNZXNzYWdlQnVzO1xuXG4gICAgcHJpdmF0ZSByZWFkb25seSBURVNUU19DT01QSUxBVElPTl9VUFBFUkJPVU5EOiBudW1iZXI7XG5cbiAgICBwdWJsaWMgY29uc3RydWN0b3IgKHsgYnJvd3NlckNvbm5lY3Rpb25HYXRld2F5LCBjb21waWxlclNlcnZpY2UsIG1lc3NhZ2VCdXMsIGNvbmZpZ3VyYXRpb24gfTogQm9vdHN0cmFwcGVySW5pdCkge1xuICAgICAgICB0aGlzLmJyb3dzZXJDb25uZWN0aW9uR2F0ZXdheSA9IGJyb3dzZXJDb25uZWN0aW9uR2F0ZXdheTtcbiAgICAgICAgdGhpcy5jb25jdXJyZW5jeSAgICAgICAgICAgICAgPSAxO1xuICAgICAgICB0aGlzLnNvdXJjZXMgICAgICAgICAgICAgICAgICA9IFtdO1xuICAgICAgICB0aGlzLmJyb3dzZXJzICAgICAgICAgICAgICAgICA9IFtdO1xuICAgICAgICB0aGlzLnJlcG9ydGVycyAgICAgICAgICAgICAgICA9IFtdO1xuICAgICAgICB0aGlzLmZpbHRlciAgICAgICAgICAgICAgICAgICA9IHZvaWQgMDtcbiAgICAgICAgdGhpcy5hcHBDb21tYW5kICAgICAgICAgICAgICAgPSB2b2lkIDA7XG4gICAgICAgIHRoaXMuYXBwSW5pdERlbGF5ICAgICAgICAgICAgID0gdm9pZCAwO1xuICAgICAgICB0aGlzLnRzQ29uZmlnUGF0aCAgICAgICAgICAgICA9IHZvaWQgMDtcbiAgICAgICAgdGhpcy5jbGllbnRTY3JpcHRzICAgICAgICAgICAgPSBbXTtcbiAgICAgICAgdGhpcy5kaXNhYmxlTXVsdGlwbGVXaW5kb3dzICAgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5wcm94eWxlc3MgICAgICAgICAgICAgICAgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5jb21waWxlck9wdGlvbnMgICAgICAgICAgPSB2b2lkIDA7XG4gICAgICAgIHRoaXMuZGVidWdMb2dnZXIgICAgICAgICAgICAgID0gZGVidWcoREVCVUdfU0NPUEUpO1xuICAgICAgICB0aGlzLndhcm5pbmdMb2cgICAgICAgICAgICAgICA9IG5ldyBXYXJuaW5nTG9nKG51bGwsIFdhcm5pbmdMb2cuY3JlYXRlQWRkV2FybmluZ0NhbGxiYWNrKG1lc3NhZ2VCdXMpKTtcbiAgICAgICAgdGhpcy5jb21waWxlclNlcnZpY2UgICAgICAgICAgPSBjb21waWxlclNlcnZpY2U7XG4gICAgICAgIHRoaXMubWVzc2FnZUJ1cyAgICAgICAgICAgICAgID0gbWVzc2FnZUJ1cztcbiAgICAgICAgdGhpcy5jb25maWd1cmF0aW9uICAgICAgICAgICAgPSBjb25maWd1cmF0aW9uO1xuXG4gICAgICAgIHRoaXMuVEVTVFNfQ09NUElMQVRJT05fVVBQRVJCT1VORCA9IDYwO1xuICAgIH1cblxuICAgIHByaXZhdGUgc3RhdGljIF9nZXRCcm93c2VyTmFtZSAoYnJvd3NlcjogQnJvd3NlckluZm9Tb3VyY2UpOiBzdHJpbmcge1xuICAgICAgICBpZiAoYnJvd3NlciBpbnN0YW5jZW9mIEJyb3dzZXJDb25uZWN0aW9uKVxuICAgICAgICAgICAgcmV0dXJuIGJyb3dzZXIuYnJvd3NlckluZm8uYnJvd3Nlck5hbWU7XG5cbiAgICAgICAgcmV0dXJuIGJyb3dzZXIuYnJvd3Nlck5hbWU7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzdGF0aWMgX3NwbGl0QnJvd3NlckluZm8gKGJyb3dzZXJJbmZvOiBCcm93c2VySW5mb1NvdXJjZVtdKTogU2VwYXJhdGVkQnJvd3NlckluZm8ge1xuICAgICAgICBjb25zdCByZW1vdGVzOiBCcm93c2VyQ29ubmVjdGlvbltdICA9IFtdO1xuICAgICAgICBjb25zdCBhdXRvbWF0ZWQ6IEJyb3dzZXJJbmZvW10gICAgICA9IFtdO1xuXG4gICAgICAgIGJyb3dzZXJJbmZvLmZvckVhY2goYnJvd3NlciA9PiB7XG4gICAgICAgICAgICBpZiAoYnJvd3NlciBpbnN0YW5jZW9mIEJyb3dzZXJDb25uZWN0aW9uKVxuICAgICAgICAgICAgICAgIHJlbW90ZXMucHVzaChicm93c2VyKTtcbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICBhdXRvbWF0ZWQucHVzaChicm93c2VyKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIHsgcmVtb3RlcywgYXV0b21hdGVkIH07XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfY3JlYXRlQXV0b21hdGVkQ29ubmVjdGlvbnMgKGJyb3dzZXJJbmZvOiBCcm93c2VySW5mb1tdKTogQnJvd3NlckNvbm5lY3Rpb25bXVtdIHtcbiAgICAgICAgaWYgKCFicm93c2VySW5mbylcbiAgICAgICAgICAgIHJldHVybiBbXTtcblxuICAgICAgICByZXR1cm4gYnJvd3NlckluZm9cbiAgICAgICAgICAgIC5tYXAoYnJvd3NlciA9PiB0aW1lcyh0aGlzLmNvbmN1cnJlbmN5LCAoKSA9PiBuZXcgQnJvd3NlckNvbm5lY3Rpb24oXG4gICAgICAgICAgICAgICAgdGhpcy5icm93c2VyQ29ubmVjdGlvbkdhdGV3YXksIHsgLi4uYnJvd3NlciB9LCBmYWxzZSwgdGhpcy5kaXNhYmxlTXVsdGlwbGVXaW5kb3dzLCB0aGlzLnByb3h5bGVzcywgdGhpcy5tZXNzYWdlQnVzKSkpO1xuICAgIH1cblxuICAgIHByaXZhdGUgX2dldEJyb3dzZXJTZXRPcHRpb25zICgpOiBCcm93c2VyU2V0T3B0aW9ucyB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBjb25jdXJyZW5jeTogICAgICAgIHRoaXMuY29uY3VycmVuY3ksXG4gICAgICAgICAgICBicm93c2VySW5pdFRpbWVvdXQ6IHRoaXMuYnJvd3NlckluaXRUaW1lb3V0LFxuICAgICAgICAgICAgd2FybmluZ0xvZzogICAgICAgICB0aGlzLndhcm5pbmdMb2csXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBfZ2V0QnJvd3NlckNvbm5lY3Rpb25zIChicm93c2VySW5mbzogQnJvd3NlckluZm9Tb3VyY2VbXSk6IFByb21pc2U8QnJvd3NlclNldD4ge1xuICAgICAgICBjb25zdCB7IGF1dG9tYXRlZCwgcmVtb3RlcyB9ID0gQm9vdHN0cmFwcGVyLl9zcGxpdEJyb3dzZXJJbmZvKGJyb3dzZXJJbmZvKTtcblxuICAgICAgICBpZiAocmVtb3RlcyAmJiByZW1vdGVzLmxlbmd0aCAlIHRoaXMuY29uY3VycmVuY3kpXG4gICAgICAgICAgICB0aHJvdyBuZXcgR2VuZXJhbEVycm9yKFJVTlRJTUVfRVJST1JTLmNhbm5vdERpdmlkZVJlbW90ZXNDb3VudEJ5Q29uY3VycmVuY3kpO1xuXG4gICAgICAgIGxldCBicm93c2VyQ29ubmVjdGlvbnMgPSB0aGlzLl9jcmVhdGVBdXRvbWF0ZWRDb25uZWN0aW9ucyhhdXRvbWF0ZWQpO1xuXG4gICAgICAgIHJlbW90ZXMuZm9yRWFjaChyZW1vdGVDb25uZWN0aW9uID0+IHtcbiAgICAgICAgICAgIHJlbW90ZUNvbm5lY3Rpb24ubWVzc2FnZUJ1cyA9IHRoaXMubWVzc2FnZUJ1cztcbiAgICAgICAgfSk7XG5cbiAgICAgICAgYnJvd3NlckNvbm5lY3Rpb25zID0gYnJvd3NlckNvbm5lY3Rpb25zLmNvbmNhdChjaHVuayhyZW1vdGVzLCB0aGlzLmNvbmN1cnJlbmN5KSk7XG5cbiAgICAgICAgcmV0dXJuIEJyb3dzZXJTZXQuZnJvbShicm93c2VyQ29ubmVjdGlvbnMsIHRoaXMuX2dldEJyb3dzZXJTZXRPcHRpb25zKCkpO1xuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgX2ZpbHRlclRlc3RzICh0ZXN0czogVGVzdFtdLCBwcmVkaWNhdGU6IEZpbHRlckZ1bmN0aW9uKTogUHJvbWlzZTxUZXN0W10+IHtcbiAgICAgICAgcmV0dXJuIGFzeW5jRmlsdGVyKHRlc3RzLCB0ZXN0ID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHRlc3RGaXh0dXJlID0gdGVzdC5maXh0dXJlIGFzIEZpeHR1cmU7XG5cbiAgICAgICAgICAgIHJldHVybiBwcmVkaWNhdGUoXG4gICAgICAgICAgICAgICAgdGVzdC5uYW1lIGFzIHN0cmluZyxcbiAgICAgICAgICAgICAgICB0ZXN0Rml4dHVyZS5uYW1lIGFzIHN0cmluZyxcbiAgICAgICAgICAgICAgICB0ZXN0Rml4dHVyZS5wYXRoLFxuICAgICAgICAgICAgICAgIHRlc3QubWV0YSxcbiAgICAgICAgICAgICAgICB0ZXN0Rml4dHVyZS5tZXRhKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBfY29tcGlsZVRlc3RzICh7IHNvdXJjZUxpc3QsIGNvbXBpbGVyT3B0aW9ucywgcnVubmFibGVDb25maWd1cmF0aW9uSWQgfTogQ29tcGlsZXJBcmd1bWVudHMpOiBQcm9taXNlPFRlc3RbXT4ge1xuICAgICAgICBjb25zdCBiYXNlVXJsICA9IHRoaXMuY29uZmlndXJhdGlvbi5nZXRPcHRpb24oT1BUSU9OX05BTUVTLmJhc2VVcmwpIGFzIHN0cmluZztcblxuICAgICAgICBpZiAodGhpcy5jb21waWxlclNlcnZpY2UpIHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuY29tcGlsZXJTZXJ2aWNlLmluaXQoKTtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuY29tcGlsZXJTZXJ2aWNlLnNldFVzZXJWYXJpYWJsZXModXNlclZhcmlhYmxlcy52YWx1ZSk7XG5cbiAgICAgICAgICAgIHJldHVybiB0aGlzLmNvbXBpbGVyU2VydmljZS5nZXRUZXN0cyh7IHNvdXJjZUxpc3QsIGNvbXBpbGVyT3B0aW9ucywgcnVubmFibGVDb25maWd1cmF0aW9uSWQgfSwgYmFzZVVybCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBjb21waWxlciA9IG5ldyBDb21waWxlcihzb3VyY2VMaXN0LCBjb21waWxlck9wdGlvbnMsIHsgYmFzZVVybCwgaXNDb21waWxlclNlcnZpY2VNb2RlOiBmYWxzZSB9KTtcblxuICAgICAgICByZXR1cm4gY29tcGlsZXIuZ2V0VGVzdHMoKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9hc3NlcnRHbG9iYWxIb29rcyAoKTogdm9pZCB7XG4gICAgICAgIGlmICghdGhpcy5ob29rcylcbiAgICAgICAgICAgIHJldHVybjtcblxuICAgICAgICBpZiAodGhpcy5ob29rcy5maXh0dXJlPy5iZWZvcmUpXG4gICAgICAgICAgICBhc3NlcnRUeXBlKGlzLmZ1bmN0aW9uLCAnZ2xvYmFsQmVmb3JlJywgJ1RoZSBmaXh0dXJlLmdsb2JhbEJlZm9yZSBob29rJywgdGhpcy5ob29rcy5maXh0dXJlLmJlZm9yZSk7XG5cbiAgICAgICAgaWYgKHRoaXMuaG9va3MuZml4dHVyZT8uYWZ0ZXIpXG4gICAgICAgICAgICBhc3NlcnRUeXBlKGlzLmZ1bmN0aW9uLCAnZ2xvYmFsQWZ0ZXInLCAnVGhlIGZpeHR1cmUuZ2xvYmFsQWZ0ZXIgaG9vaycsIHRoaXMuaG9va3MuZml4dHVyZS5hZnRlcik7XG5cbiAgICAgICAgaWYgKHRoaXMuaG9va3MudGVzdD8uYmVmb3JlKVxuICAgICAgICAgICAgYXNzZXJ0VHlwZShpcy5mdW5jdGlvbiwgJ2dsb2JhbEJlZm9yZScsICdUaGUgdGVzdC5nbG9iYWxCZWZvcmUgaG9vaycsIHRoaXMuaG9va3MudGVzdC5iZWZvcmUpO1xuXG4gICAgICAgIGlmICh0aGlzLmhvb2tzLnRlc3Q/LmFmdGVyKVxuICAgICAgICAgICAgYXNzZXJ0VHlwZShpcy5mdW5jdGlvbiwgJ2dsb2JhbEFmdGVyJywgJ1RoZSB0ZXN0Lmdsb2JhbEFmdGVyIGhvb2snLCB0aGlzLmhvb2tzLnRlc3QuYWZ0ZXIpO1xuXG4gICAgICAgIGlmICh0aGlzLmhvb2tzLnJlcXVlc3QpXG4gICAgICAgICAgICBhc3NlcnRSZXF1ZXN0SG9va1R5cGUoZmxhdHRlbihjYXN0QXJyYXkodGhpcy5ob29rcy5yZXF1ZXN0KSkpO1xuICAgIH1cblxuICAgIHByaXZhdGUgX3NldEdsb2JhbEhvb2tzVG9UZXN0cyAodGVzdHM6IFRlc3RbXSk6IHZvaWQge1xuICAgICAgICBpZiAoIXRoaXMuaG9va3MpXG4gICAgICAgICAgICByZXR1cm47XG5cbiAgICAgICAgdGhpcy5fYXNzZXJ0R2xvYmFsSG9va3MoKTtcblxuICAgICAgICBjb25zdCBmaXh0dXJlQmVmb3JlID0gdGhpcy5ob29rcy5maXh0dXJlPy5iZWZvcmUgfHwgbnVsbDtcbiAgICAgICAgY29uc3QgZml4dHVyZUFmdGVyICA9IHRoaXMuaG9va3MuZml4dHVyZT8uYWZ0ZXIgfHwgbnVsbDtcbiAgICAgICAgY29uc3QgdGVzdEJlZm9yZSAgICA9IHRoaXMuaG9va3MudGVzdD8uYmVmb3JlID8gd3JhcFRlc3RGdW5jdGlvbih0aGlzLmhvb2tzLnRlc3QuYmVmb3JlKSA6IG51bGw7XG4gICAgICAgIGNvbnN0IHRlc3RBZnRlciAgICAgPSB0aGlzLmhvb2tzLnRlc3Q/LmFmdGVyID8gd3JhcFRlc3RGdW5jdGlvbih0aGlzLmhvb2tzLnRlc3QuYWZ0ZXIpIDogbnVsbDtcbiAgICAgICAgY29uc3QgcmVxdWVzdCAgICAgICA9IHRoaXMuaG9va3MucmVxdWVzdCB8fCBbXTtcblxuICAgICAgICB0ZXN0cy5mb3JFYWNoKGl0ZW0gPT4ge1xuICAgICAgICAgICAgaWYgKGl0ZW0uZml4dHVyZSkge1xuICAgICAgICAgICAgICAgIGl0ZW0uZml4dHVyZS5nbG9iYWxCZWZvcmVGbiA9IGl0ZW0uZml4dHVyZS5nbG9iYWxCZWZvcmVGbiB8fCBmaXh0dXJlQmVmb3JlO1xuICAgICAgICAgICAgICAgIGl0ZW0uZml4dHVyZS5nbG9iYWxBZnRlckZuICA9IGl0ZW0uZml4dHVyZS5nbG9iYWxBZnRlckZuIHx8IGZpeHR1cmVBZnRlcjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaXRlbS5nbG9iYWxCZWZvcmVGbiA9IHRlc3RCZWZvcmU7XG4gICAgICAgICAgICBpdGVtLmdsb2JhbEFmdGVyRm4gID0gdGVzdEFmdGVyO1xuICAgICAgICAgICAgaXRlbS5yZXF1ZXN0SG9va3MgICA9IHVuaW9uKGZsYXR0ZW4oY2FzdEFycmF5KHJlcXVlc3QpKSwgaXRlbS5yZXF1ZXN0SG9va3MpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIF9nZXRUZXN0cyAoaWQ6IHN0cmluZyk6IFByb21pc2U8VGVzdFtdPiB7XG4gICAgICAgIGNvbnN0IGN3ZCAgICAgICAgPSBwcm9jZXNzLmN3ZCgpO1xuICAgICAgICBjb25zdCBzb3VyY2VMaXN0ID0gYXdhaXQgcGFyc2VGaWxlTGlzdCh0aGlzLnNvdXJjZXMsIGN3ZCk7XG5cbiAgICAgICAgaWYgKCFzb3VyY2VMaXN0Lmxlbmd0aClcbiAgICAgICAgICAgIHRocm93IG5ldyBHZW5lcmFsRXJyb3IoUlVOVElNRV9FUlJPUlMudGVzdEZpbGVzTm90Rm91bmQsIGN3ZCwgZ2V0Q29uY2F0ZW5hdGVkVmFsdWVzU3RyaW5nKHRoaXMuc291cmNlcywgJ1xcbicsICcnKSk7XG5cbiAgICAgICAgbGV0IHRlc3RzID0gYXdhaXQgZ3VhcmRUaW1lRXhlY3V0aW9uKFxuICAgICAgICAgICAgYXN5bmMgKCkgPT4gYXdhaXQgdGhpcy5fY29tcGlsZVRlc3RzKHsgc291cmNlTGlzdCwgY29tcGlsZXJPcHRpb25zOiB0aGlzLmNvbXBpbGVyT3B0aW9ucywgcnVubmFibGVDb25maWd1cmF0aW9uSWQ6IGlkIH0pLFxuICAgICAgICAgICAgZWxhcHNlZFRpbWUgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuZGVidWdMb2dnZXIoYHRlc3RzIGNvbXBpbGF0aW9uIHRvb2sgJHtwcmV0dHlUaW1lKGVsYXBzZWRUaW1lKX1gKTtcblxuICAgICAgICAgICAgICAgIGNvbnN0IFsgZWxhcHNlZFNlY29uZHMgXSA9IGVsYXBzZWRUaW1lO1xuXG4gICAgICAgICAgICAgICAgaWYgKGVsYXBzZWRTZWNvbmRzID4gdGhpcy5URVNUU19DT01QSUxBVElPTl9VUFBFUkJPVU5EKVxuICAgICAgICAgICAgICAgICAgICB0aGlzLndhcm5pbmdMb2cuYWRkV2FybmluZyhXQVJOSU5HX01FU1NBR0VTLnRlc3RzQ29tcGlsYXRpb25UYWtlc1Rvb0xvbmcsIHByZXR0eVRpbWUoZWxhcHNlZFRpbWUpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgKTtcblxuICAgICAgICBjb25zdCB0ZXN0c1dpdGhPbmx5RmxhZyA9IHRlc3RzLmZpbHRlcih0ZXN0ID0+IHRlc3Qub25seSk7XG5cbiAgICAgICAgaWYgKHRlc3RzV2l0aE9ubHlGbGFnLmxlbmd0aClcbiAgICAgICAgICAgIHRlc3RzID0gdGVzdHNXaXRoT25seUZsYWc7XG5cbiAgICAgICAgaWYgKCF0ZXN0cy5sZW5ndGgpXG4gICAgICAgICAgICB0aHJvdyBuZXcgR2VuZXJhbEVycm9yKFJVTlRJTUVfRVJST1JTLm5vVGVzdHNUb1J1bik7XG5cbiAgICAgICAgaWYgKHRoaXMuZmlsdGVyKVxuICAgICAgICAgICAgdGVzdHMgPSBhd2FpdCB0aGlzLl9maWx0ZXJUZXN0cyh0ZXN0cywgdGhpcy5maWx0ZXIpO1xuXG4gICAgICAgIGlmICghdGVzdHMubGVuZ3RoKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEdlbmVyYWxFcnJvcihSVU5USU1FX0VSUk9SUy5ub1Rlc3RzVG9SdW5EdWVGaWx0ZXJpbmcpO1xuXG4gICAgICAgIHRoaXMuX3NldEdsb2JhbEhvb2tzVG9UZXN0cyh0ZXN0cyk7XG5cbiAgICAgICAgcmV0dXJuIHRlc3RzO1xuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgX3N0YXJ0VGVzdGVkQXBwICgpOiBQcm9taXNlPFRlc3RlZEFwcHx1bmRlZmluZWQ+IHtcbiAgICAgICAgaWYgKCF0aGlzLmFwcENvbW1hbmQpXG4gICAgICAgICAgICByZXR1cm4gdm9pZCAwO1xuXG4gICAgICAgIGNvbnN0IHRlc3RlZEFwcCA9IG5ldyBUZXN0ZWRBcHAoKTtcblxuICAgICAgICBhd2FpdCB0ZXN0ZWRBcHAuc3RhcnQodGhpcy5hcHBDb21tYW5kLCB0aGlzLmFwcEluaXREZWxheSBhcyBudW1iZXIpO1xuXG4gICAgICAgIHJldHVybiB0ZXN0ZWRBcHA7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBfY2FuVXNlUGFyYWxsZWxCb290c3RyYXBwaW5nIChicm93c2VySW5mbzogQnJvd3NlckluZm9Tb3VyY2VbXSk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgICAgICBjb25zdCBpc0xvY2FsUHJvbWlzZXMgPSBicm93c2VySW5mby5tYXAoYnJvd3NlciA9PiBicm93c2VyLnByb3ZpZGVyLmlzTG9jYWxCcm93c2VyKHZvaWQgMCwgQm9vdHN0cmFwcGVyLl9nZXRCcm93c2VyTmFtZShicm93c2VyKSkpO1xuICAgICAgICBjb25zdCBpc0xvY2FsQnJvd3NlcnMgPSBhd2FpdCBQcm9taXNlLmFsbChpc0xvY2FsUHJvbWlzZXMpO1xuXG4gICAgICAgIHJldHVybiBpc0xvY2FsQnJvd3NlcnMuZXZlcnkocmVzdWx0ID0+IHJlc3VsdCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBfYm9vdHN0cmFwU2VxdWVuY2UgKGJyb3dzZXJJbmZvOiBCcm93c2VySW5mb1NvdXJjZVtdLCBpZDogc3RyaW5nKTogUHJvbWlzZTxCYXNpY1J1bnRpbWVSZXNvdXJjZXM+IHtcbiAgICAgICAgY29uc3QgdGVzdHMgICAgICAgPSBhd2FpdCB0aGlzLl9nZXRUZXN0cyhpZCk7XG4gICAgICAgIGNvbnN0IHRlc3RlZEFwcCAgID0gYXdhaXQgdGhpcy5fc3RhcnRUZXN0ZWRBcHAoKTtcbiAgICAgICAgY29uc3QgYnJvd3NlclNldCAgPSBhd2FpdCB0aGlzLl9nZXRCcm93c2VyQ29ubmVjdGlvbnMoYnJvd3NlckluZm8pO1xuXG4gICAgICAgIHJldHVybiB7IHRlc3RzLCB0ZXN0ZWRBcHAsIGJyb3dzZXJTZXQgfTtcbiAgICB9XG5cbiAgICBwcml2YXRlIF93cmFwQm9vdHN0cmFwcGluZ1Byb21pc2U8VD4gKHByb21pc2U6IFByb21pc2U8VD4pOiBQcm9taXNlPFByb21pc2VSZXN1bHQ8VD4+IHtcbiAgICAgICAgcmV0dXJuIHByb21pc2VcbiAgICAgICAgICAgIC50aGVuKHJlc3VsdCA9PiAoeyBlcnJvcjogdm9pZCAwLCByZXN1bHQgfSkpXG4gICAgICAgICAgICAuY2F0Y2goZXJyb3IgPT4gKHsgcmVzdWx0OiB2b2lkIDAsIGVycm9yIH0pKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIF9nZXRCb290c3RyYXBwaW5nRXJyb3IgKGJyb3dzZXJTZXRTdGF0dXM6IFByb21pc2VSZXN1bHQ8QnJvd3NlclNldD4sIHRlc3RzU3RhdHVzOiBQcm9taXNlUmVzdWx0PFRlc3RbXT4sIHRlc3RlZEFwcFN0YXR1czogUHJvbWlzZVJlc3VsdDxUZXN0ZWRBcHB8dW5kZWZpbmVkPik6IFByb21pc2U8RXJyb3I+IHtcbiAgICAgICAgaWYgKCFpc1Byb21pc2VFcnJvcihicm93c2VyU2V0U3RhdHVzKSlcbiAgICAgICAgICAgIGF3YWl0IGJyb3dzZXJTZXRTdGF0dXMucmVzdWx0LmRpc3Bvc2UoKTtcblxuICAgICAgICBpZiAoIWlzUHJvbWlzZUVycm9yKGJyb3dzZXJTZXRTdGF0dXMpICYmICFpc1Byb21pc2VFcnJvcih0ZXN0ZWRBcHBTdGF0dXMpICYmIHRlc3RlZEFwcFN0YXR1cy5yZXN1bHQpXG4gICAgICAgICAgICBhd2FpdCB0ZXN0ZWRBcHBTdGF0dXMucmVzdWx0LmtpbGwoKTtcblxuICAgICAgICBpZiAoaXNQcm9taXNlRXJyb3IodGVzdHNTdGF0dXMpKVxuICAgICAgICAgICAgcmV0dXJuIHRlc3RzU3RhdHVzLmVycm9yO1xuXG4gICAgICAgIGlmIChpc1Byb21pc2VFcnJvcih0ZXN0ZWRBcHBTdGF0dXMpKVxuICAgICAgICAgICAgcmV0dXJuIHRlc3RlZEFwcFN0YXR1cy5lcnJvcjtcblxuICAgICAgICBpZiAoaXNQcm9taXNlRXJyb3IoYnJvd3NlclNldFN0YXR1cykpXG4gICAgICAgICAgICByZXR1cm4gYnJvd3NlclNldFN0YXR1cy5lcnJvcjtcblxuICAgICAgICByZXR1cm4gbmV3IEVycm9yKCdVbmV4cGVjdGVkIGNhbGwnKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9nZXRCb290c3RyYXBwaW5nUHJvbWlzZXM8VD4gKGFyZzogUHJvbWlzZUNvbGxlY3Rpb248VD4pOiBQcm9taXNlQ29sbGVjdGlvbjxSZXN1bHRDb2xsZWN0aW9uPFQ+PiB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IHt9IGFzIHVua25vd24gYXMgUHJvbWlzZUNvbGxlY3Rpb248UmVzdWx0Q29sbGVjdGlvbjxUPj47XG5cbiAgICAgICAgZm9yIChjb25zdCBrIGluIGFyZylcbiAgICAgICAgICAgIHJlc3VsdFtrXSA9IHRoaXMuX3dyYXBCb290c3RyYXBwaW5nUHJvbWlzZShhcmdba10pO1xuXG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBfYm9vdHN0cmFwUGFyYWxsZWwgKGJyb3dzZXJJbmZvOiBCcm93c2VySW5mb1NvdXJjZVtdLCBpZDogc3RyaW5nKTogUHJvbWlzZTxCYXNpY1J1bnRpbWVSZXNvdXJjZXM+IHtcbiAgICAgICAgY29uc3QgYm9vdHN0cmFwcGluZ1Byb21pc2VzID0ge1xuICAgICAgICAgICAgYnJvd3NlclNldDogdGhpcy5fZ2V0QnJvd3NlckNvbm5lY3Rpb25zKGJyb3dzZXJJbmZvKSxcbiAgICAgICAgICAgIHRlc3RzOiAgICAgIHRoaXMuX2dldFRlc3RzKGlkKSxcbiAgICAgICAgICAgIGFwcDogICAgICAgIHRoaXMuX3N0YXJ0VGVzdGVkQXBwKCksXG4gICAgICAgIH07XG5cbiAgICAgICAgY29uc3QgYm9vdHN0cmFwcGluZ1Jlc3VsdFByb21pc2VzID0gdGhpcy5fZ2V0Qm9vdHN0cmFwcGluZ1Byb21pc2VzKGJvb3RzdHJhcHBpbmdQcm9taXNlcyk7XG5cbiAgICAgICAgY29uc3QgYm9vdHN0cmFwcGluZ1Jlc3VsdHMgPSBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgICAgICAgICBib290c3RyYXBwaW5nUmVzdWx0UHJvbWlzZXMuYnJvd3NlclNldCxcbiAgICAgICAgICAgIGJvb3RzdHJhcHBpbmdSZXN1bHRQcm9taXNlcy50ZXN0cyxcbiAgICAgICAgICAgIGJvb3RzdHJhcHBpbmdSZXN1bHRQcm9taXNlcy5hcHAsXG4gICAgICAgIF0pO1xuXG4gICAgICAgIGNvbnN0IFticm93c2VyU2V0UmVzdWx0cywgdGVzdFJlc3VsdHMsIGFwcFJlc3VsdHNdID0gYm9vdHN0cmFwcGluZ1Jlc3VsdHM7XG5cbiAgICAgICAgaWYgKGlzUHJvbWlzZUVycm9yKGJyb3dzZXJTZXRSZXN1bHRzKSB8fCBpc1Byb21pc2VFcnJvcih0ZXN0UmVzdWx0cykgfHwgaXNQcm9taXNlRXJyb3IoYXBwUmVzdWx0cykpXG4gICAgICAgICAgICB0aHJvdyBhd2FpdCB0aGlzLl9nZXRCb290c3RyYXBwaW5nRXJyb3IoLi4uYm9vdHN0cmFwcGluZ1Jlc3VsdHMpO1xuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBicm93c2VyU2V0OiBicm93c2VyU2V0UmVzdWx0cy5yZXN1bHQsXG4gICAgICAgICAgICB0ZXN0czogICAgICB0ZXN0UmVzdWx0cy5yZXN1bHQsXG4gICAgICAgICAgICB0ZXN0ZWRBcHA6ICBhcHBSZXN1bHRzLnJlc3VsdCxcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICAvLyBBUElcbiAgICBwdWJsaWMgYXN5bmMgY3JlYXRlUnVubmFibGVDb25maWd1cmF0aW9uICgpOiBQcm9taXNlPFJ1bm5hYmxlQ29uZmlndXJhdGlvbj4ge1xuICAgICAgICBjb25zdCBpZCAgICAgICAgICAgICAgICAgID0gZ2VuZXJhdGVVbmlxdWVJZCgpO1xuICAgICAgICBjb25zdCBjb21tb25DbGllbnRTY3JpcHRzID0gYXdhaXQgbG9hZENsaWVudFNjcmlwdHModGhpcy5jbGllbnRTY3JpcHRzKTtcblxuICAgICAgICBpZiAoYXdhaXQgdGhpcy5fY2FuVXNlUGFyYWxsZWxCb290c3RyYXBwaW5nKHRoaXMuYnJvd3NlcnMpKVxuICAgICAgICAgICAgcmV0dXJuIHsgLi4uYXdhaXQgdGhpcy5fYm9vdHN0cmFwUGFyYWxsZWwodGhpcy5icm93c2VycywgaWQpLCBjb21tb25DbGllbnRTY3JpcHRzLCBpZCB9O1xuXG4gICAgICAgIHJldHVybiB7IC4uLmF3YWl0IHRoaXMuX2Jvb3RzdHJhcFNlcXVlbmNlKHRoaXMuYnJvd3NlcnMsIGlkKSwgY29tbW9uQ2xpZW50U2NyaXB0cywgaWQgfTtcbiAgICB9XG59XG4iXX0=
243
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYm9vdHN0cmFwcGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3J1bm5lci9ib290c3RyYXBwZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxtQ0FNZ0I7QUFFaEIsa0RBQTBCO0FBQzFCLGtFQUF1QztBQUN2QywyREFBbUM7QUFDbkMsdUVBQXVFO0FBQ3ZFLGdFQUF1QztBQUN2QywrQ0FBaUQ7QUFDakQsMkNBQWlEO0FBQ2pELDhEQUFxQztBQUNyQywrRUFBcUQ7QUFDckQseUVBQThEO0FBQzlELDRDQUE4RDtBQVM5RCwrRUFBc0Q7QUFDdEQsdUZBQWdFO0FBQ2hFLHlGQUErRDtBQUMvRCx5RUFBZ0Q7QUFHaEQsbUZBQXlEO0FBQ3pELHVFQUFtRTtBQUNuRSw2REFBdUQ7QUFDdkQsbUZBQXFFO0FBQ3JFLDJFQUFrRDtBQUVsRCxpRkFBeUQ7QUFFekQsTUFBTSxXQUFXLEdBQUcsdUJBQXVCLENBQUM7QUEyQjVDLFNBQVMsY0FBYyxDQUE4QixLQUEwQjtJQUMzRSxPQUFRLEtBQXlCLENBQUMsS0FBSyxLQUFLLEtBQUssQ0FBQyxDQUFDO0FBQ3ZELENBQUM7QUFhRCxNQUFxQixZQUFZO0lBeUI3QixZQUFvQixFQUFFLHdCQUF3QixFQUFFLGVBQWUsRUFBRSxVQUFVLEVBQUUsYUFBYSxFQUFvQjtRQUMxRyxJQUFJLENBQUMsd0JBQXdCLEdBQUcsd0JBQXdCLENBQUM7UUFDekQsSUFBSSxDQUFDLFdBQVcsR0FBZ0IsQ0FBQyxDQUFDO1FBQ2xDLElBQUksQ0FBQyxPQUFPLEdBQW9CLEVBQUUsQ0FBQztRQUNuQyxJQUFJLENBQUMsUUFBUSxHQUFtQixFQUFFLENBQUM7UUFDbkMsSUFBSSxDQUFDLFNBQVMsR0FBa0IsRUFBRSxDQUFDO1FBQ25DLElBQUksQ0FBQyxNQUFNLEdBQXFCLEtBQUssQ0FBQyxDQUFDO1FBQ3ZDLElBQUksQ0FBQyxVQUFVLEdBQWlCLEtBQUssQ0FBQyxDQUFDO1FBQ3ZDLElBQUksQ0FBQyxZ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QUFJLENBQUMsUUFBUSxFQUFFLEVBQUUsQ0FBQyxLQUFFLG1CQUFtQixFQUFFLEVBQUUsSUFBRztJQUM1RixDQUFDO0NBQ0o7QUF2VEQsK0JBdVRDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgICBjaHVuayxcbiAgICB0aW1lcyxcbiAgICB1bmlvbixcbiAgICBjYXN0QXJyYXksXG4gICAgZmxhdHRlbkRlZXAgYXMgZmxhdHRlbixcbn0gZnJvbSAnbG9kYXNoJztcblxuaW1wb3J0IGRlYnVnIGZyb20gJ2RlYnVnJztcbmltcG9ydCBwcmV0dHlUaW1lIGZyb20gJ3ByZXR0eS1ocnRpbWUnO1xuaW1wb3J0IENvbXBpbGVyIGZyb20gJy4uL2NvbXBpbGVyJztcbmltcG9ydCBCcm93c2VyQ29ubmVjdGlvbiwgeyBCcm93c2VySW5mbyB9IGZyb20gJy4uL2Jyb3dzZXIvY29ubmVjdGlvbic7XG5pbXBvcnQgQnJvd3NlclNldCBmcm9tICcuL2Jyb3dzZXItc2V0JztcbmltcG9ydCB7IEdlbmVyYWxFcnJvciB9IGZyb20gJy4uL2Vycm9ycy9ydW50aW1lJztcbmltcG9ydCB7IFJVTlRJTUVfRVJST1JTIH0gZnJvbSAnLi4vZXJyb3JzL3R5cGVzJztcbmltcG9ydCBUZXN0ZWRBcHAgZnJvbSAnLi90ZXN0ZWQtYXBwJztcbmltcG9ydCBwYXJzZUZpbGVMaXN0IGZyb20gJy4uL3V0aWxzL3BhcnNlLWZpbGUtbGlzdCc7XG5pbXBvcnQgbG9hZENsaWVudFNjcmlwdHMgZnJvbSAnLi4vY3VzdG9tLWNsaWVudC1zY3JpcHRzL2xvYWQnO1xuaW1wb3J0IHsgZ2V0Q29uY2F0ZW5hdGVkVmFsdWVzU3RyaW5nIH0gZnJvbSAnLi4vdXRpbHMvc3RyaW5nJztcbmltcG9ydCB7IFJlcG9ydGVyU291cmNlIH0gZnJvbSAnLi4vcmVwb3J0ZXIvaW50ZXJmYWNlcyc7XG5pbXBvcnQgQ2xpZW50U2NyaXB0IGZyb20gJy4uL2N1c3RvbS1jbGllbnQtc2NyaXB0cy9jbGllbnQtc2NyaXB0JztcbmltcG9ydCBDbGllbnRTY3JpcHRJbml0IGZyb20gJy4uL2N1c3RvbS1jbGllbnQtc2NyaXB0cy9jbGllbnQtc2NyaXB0LWluaXQnO1xuaW1wb3J0IEJyb3dzZXJDb25uZWN0aW9uR2F0ZXdheSBmcm9tICcuLi9icm93c2VyL2Nvbm5lY3Rpb24vZ2F0ZXdheSc7XG5pbXBvcnQgeyBDb21waWxlckFyZ3VtZW50cyB9IGZyb20gJy4uL2NvbXBpbGVyL2ludGVyZmFjZXMnO1xuaW1wb3J0IENvbXBpbGVyU2VydmljZSBmcm9tICcuLi9zZXJ2aWNlcy9jb21waWxlci9ob3N0JztcbmltcG9ydCBUZXN0IGZyb20gJy4uL2FwaS9zdHJ1Y3R1cmUvdGVzdCc7XG5pbXBvcnQgeyBCb290c3RyYXBwZXJJbml0LCBCcm93c2VyU2V0T3B0aW9ucyB9IGZyb20gJy4vaW50ZXJmYWNlcyc7XG5pbXBvcnQgV2FybmluZ0xvZyBmcm9tICcuLi9ub3RpZmljYXRpb25zL3dhcm5pbmctbG9nJztcbmltcG9ydCBXQVJOSU5HX01FU1NBR0VTIGZyb20gJy4uL25vdGlmaWNhdGlvbnMvd2FybmluZy1tZXNzYWdlJztcbmltcG9ydCBndWFyZFRpbWVFeGVjdXRpb24gZnJvbSAnLi4vdXRpbHMvZ3VhcmQtdGltZS1leGVjdXRpb24nO1xuaW1wb3J0IGFzeW5jRmlsdGVyIGZyb20gJy4uL3V0aWxzL2FzeW5jLWZpbHRlcic7XG5pbXBvcnQgRml4dHVyZSBmcm9tICcuLi9hcGkvc3RydWN0dXJlL2ZpeHR1cmUnO1xuaW1wb3J0IE1lc3NhZ2VCdXMgZnJvbSAnLi4vdXRpbHMvbWVzc2FnZS1idXMnO1xuaW1wb3J0IHdyYXBUZXN0RnVuY3Rpb24gZnJvbSAnLi4vYXBpL3dyYXAtdGVzdC1mdW5jdGlvbic7XG5pbXBvcnQgeyBhc3NlcnRUeXBlLCBpcyB9IGZyb20gJy4uL2Vycm9ycy9ydW50aW1lL3R5cGUtYXNzZXJ0aW9ucyc7XG5pbXBvcnQgeyBnZW5lcmF0ZVVuaXF1ZUlkIH0gZnJvbSAndGVzdGNhZmUtaGFtbWVyaGVhZCc7XG5pbXBvcnQgYXNzZXJ0UmVxdWVzdEhvb2tUeXBlIGZyb20gJy4uL2FwaS9yZXF1ZXN0LWhvb2tzL2Fzc2VydC10eXBlJztcbmltcG9ydCB1c2VyVmFyaWFibGVzIGZyb20gJy4uL2FwaS91c2VyLXZhcmlhYmxlcyc7XG5pbXBvcnQgQ29uZmlndXJhdGlvbiBmcm9tICcuLi9jb25maWd1cmF0aW9uL2NvbmZpZ3VyYXRpb24tYmFzZSc7XG5pbXBvcnQgT1BUSU9OX05BTUVTIGZyb20gJy4uL2NvbmZpZ3VyYXRpb24vb3B0aW9uLW5hbWVzJztcblxuY29uc3QgREVCVUdfU0NPUEUgPSAndGVzdGNhZmU6Ym9vdHN0cmFwcGVyJztcblxudHlwZSBUZXN0U291cmNlID0gdW5rbm93bjtcblxudHlwZSBCcm93c2VySW5mb1NvdXJjZSA9IEJyb3dzZXJJbmZvIHwgQnJvd3NlckNvbm5lY3Rpb247XG5cbmludGVyZmFjZSBQcm9taXNlU3VjY2VzczxUPiB7XG4gICAgcmVzdWx0OiBUO1xufVxuXG5pbnRlcmZhY2UgUHJvbWlzZUVycm9yPEUgZXh0ZW5kcyBFcnJvciA9IEVycm9yPiB7XG4gICAgZXJyb3I6IEU7XG59XG5cbmludGVyZmFjZSBCYXNpY1J1bnRpbWVSZXNvdXJjZXMge1xuICAgIGJyb3dzZXJTZXQ6IEJyb3dzZXJTZXQ7XG4gICAgdGVzdHM6IFRlc3RbXTtcbiAgICB0ZXN0ZWRBcHA/OiBUZXN0ZWRBcHA7XG59XG5cbmludGVyZmFjZSBSdW5uYWJsZUNvbmZpZ3VyYXRpb24gZXh0ZW5kcyBCYXNpY1J1bnRpbWVSZXNvdXJjZXMge1xuICAgIGNvbW1vbkNsaWVudFNjcmlwdHM6IENsaWVudFNjcmlwdFtdO1xuICAgIGlkOiBzdHJpbmc7XG59XG5cbnR5cGUgUHJvbWlzZVJlc3VsdDxULCBFIGV4dGVuZHMgRXJyb3IgPSBFcnJvcj4gPSBQcm9taXNlU3VjY2VzczxUPiB8IFByb21pc2VFcnJvcjxFPjtcblxuZnVuY3Rpb24gaXNQcm9taXNlRXJyb3I8VCwgRSBleHRlbmRzIEVycm9yID0gRXJyb3I+ICh2YWx1ZTogUHJvbWlzZVJlc3VsdDxULCBFPik6IHZhbHVlIGlzIFByb21pc2VFcnJvcjxFPiB7XG4gICAgcmV0dXJuICh2YWx1ZSBhcyBQcm9taXNlRXJyb3I8RT4pLmVycm9yICE9PSB2b2lkIDA7XG59XG5cbmludGVyZmFjZSBTZXBhcmF0ZWRCcm93c2VySW5mbyB7XG4gICAgcmVtb3RlczogQnJvd3NlckNvbm5lY3Rpb25bXTtcbiAgICBhdXRvbWF0ZWQ6IEJyb3dzZXJJbmZvW107XG59XG5cbnR5cGUgUHJvbWlzZUNvbGxlY3Rpb248VD4gPSB7XG4gICAgW0sgaW4ga2V5b2YgVF06IFByb21pc2U8VFtLXT5cbn1cblxudHlwZSBSZXN1bHRDb2xsZWN0aW9uPFQ+ID0geyBbUCBpbiBrZXlvZiBUXTogUHJvbWlzZVJlc3VsdDxUW1BdPiB9O1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBCb290c3RyYXBwZXIge1xuICAgIHByaXZhdGUgcmVhZG9ubHkgYnJvd3NlckNvbm5lY3Rpb25HYXRld2F5OiBCcm93c2VyQ29ubmVjdGlvbkdhdGV3YXk7XG4gICAgcHVibGljIGNvbmN1cnJlbmN5OiBudW1iZXI7XG4gICAgcHVibGljIHNvdXJjZXM6IFRlc3RTb3VyY2VbXTtcbiAgICBwdWJsaWMgYnJvd3NlcnM6IEJyb3dzZXJJbmZvU291cmNlW107XG4gICAgcHVibGljIHJlcG9ydGVyczogUmVwb3J0ZXJTb3VyY2VbXTtcbiAgICBwdWJsaWMgZmlsdGVyPzogRmlsdGVyRnVuY3Rpb247XG4gICAgcHVibGljIGFwcENvbW1hbmQ/OiBzdHJpbmc7XG4gICAgcHVibGljIGFwcEluaXREZWxheT86IG51bWJlcjtcbiAgICBwdWJsaWMgdHNDb25maWdQYXRoPzogc3RyaW5nO1xuICAgIHB1YmxpYyBjbGllbnRTY3JpcHRzOiBDbGllbnRTY3JpcHRJbml0W107XG4gICAgcHVibGljIGRpc2FibGVNdWx0aXBsZVdpbmRvd3M6IGJvb2xlYW47XG4gICAgcHVibGljIHByb3h5bGVzczogYm9vbGVhbjtcbiAgICBwdWJsaWMgY29tcGlsZXJPcHRpb25zPzogQ29tcGlsZXJPcHRpb25zO1xuICAgIHB1YmxpYyBicm93c2VySW5pdFRpbWVvdXQ/OiBudW1iZXI7XG4gICAgcHVibGljIGhvb2tzPzogR2xvYmFsSG9va3M7XG4gICAgcHVibGljIGNvbmZpZ3VyYXRpb246IENvbmZpZ3VyYXRpb247XG5cbiAgICBwcml2YXRlIHJlYWRvbmx5IGNvbXBpbGVyU2VydmljZT86IENvbXBpbGVyU2VydmljZTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IGRlYnVnTG9nZ2VyOiBkZWJ1Zy5EZWJ1Z2dlcjtcbiAgICBwcml2YXRlIHJlYWRvbmx5IHdhcm5pbmdMb2c6IFdhcm5pbmdMb2c7XG4gICAgcHJpdmF0ZSByZWFkb25seSBtZXNzYWdlQnVzOiBNZXNzYWdlQnVzO1xuXG4gICAgcHJpdmF0ZSByZWFkb25seSBURVNUU19DT01QSUxBVElPTl9VUFBFUkJPVU5EOiBudW1iZXI7XG5cbiAgICBwdWJsaWMgY29uc3RydWN0b3IgKHsgYnJvd3NlckNvbm5lY3Rpb25HYXRld2F5LCBjb21waWxlclNlcnZpY2UsIG1lc3NhZ2VCdXMsIGNvbmZpZ3VyYXRpb24gfTogQm9vdHN0cmFwcGVySW5pdCkge1xuICAgICAgICB0aGlzLmJyb3dzZXJDb25uZWN0aW9uR2F0ZXdheSA9IGJyb3dzZXJDb25uZWN0aW9uR2F0ZXdheTtcbiAgICAgICAgdGhpcy5jb25jdXJyZW5jeSAgICAgICAgICAgICAgPSAxO1xuICAgICAgICB0aGlzLnNvdXJjZXMgICAgICAgICAgICAgICAgICA9IFtdO1xuICAgICAgICB0aGlzLmJyb3dzZXJzICAgICAgICAgICAgICAgICA9IFtdO1xuICAgICAgICB0aGlzLnJlcG9ydGVycyAgICAgICAgICAgICAgICA9IFtdO1xuICAgICAgICB0aGlzLmZpbHRlciAgICAgICAgICAgICAgICAgICA9IHZvaWQgMDtcbiAgICAgICAgdGhpcy5hcHBDb21tYW5kICAgICAgICAgICAgICAgPSB2b2lkIDA7XG4gICAgICAgIHRoaXMuYXBwSW5pdERlbGF5ICAgICAgICAgICAgID0gdm9pZCAwO1xuICAgICAgICB0aGlzLnRzQ29uZmlnUGF0aCAgICAgICAgICAgICA9IHZvaWQgMDtcbiAgICAgICAgdGhpcy5jbGllbnRTY3JpcHRzICAgICAgICAgICAgPSBbXTtcbiAgICAgICAgdGhpcy5kaXNhYmxlTXVsdGlwbGVXaW5kb3dzICAgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5wcm94eWxlc3MgICAgICAgICAgICAgICAgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5jb21waWxlck9wdGlvbnMgICAgICAgICAgPSB2b2lkIDA7XG4gICAgICAgIHRoaXMuZGVidWdMb2dnZXIgICAgICAgICAgICAgID0gZGVidWcoREVCVUdfU0NPUEUpO1xuICAgICAgICB0aGlzLndhcm5pbmdMb2cgICAgICAgICAgICAgICA9IG5ldyBXYXJuaW5nTG9nKG51bGwsIFdhcm5pbmdMb2cuY3JlYXRlQWRkV2FybmluZ0NhbGxiYWNrKG1lc3NhZ2VCdXMpKTtcbiAgICAgICAgdGhpcy5jb21waWxlclNlcnZpY2UgICAgICAgICAgPSBjb21waWxlclNlcnZpY2U7XG4gICAgICAgIHRoaXMubWVzc2FnZUJ1cyAgICAgICAgICAgICAgID0gbWVzc2FnZUJ1cztcbiAgICAgICAgdGhpcy5jb25maWd1cmF0aW9uICAgICAgICAgICAgPSBjb25maWd1cmF0aW9uO1xuXG4gICAgICAgIHRoaXMuVEVTVFNfQ09NUElMQVRJT05fVVBQRVJCT1VORCA9IDYwO1xuICAgIH1cblxuICAgIHByaXZhdGUgc3RhdGljIF9nZXRCcm93c2VyTmFtZSAoYnJvd3NlcjogQnJvd3NlckluZm9Tb3VyY2UpOiBzdHJpbmcge1xuICAgICAgICBpZiAoYnJvd3NlciBpbnN0YW5jZW9mIEJyb3dzZXJDb25uZWN0aW9uKVxuICAgICAgICAgICAgcmV0dXJuIGJyb3dzZXIuYnJvd3NlckluZm8uYnJvd3Nlck5hbWU7XG5cbiAgICAgICAgcmV0dXJuIGJyb3dzZXIuYnJvd3Nlck5hbWU7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzdGF0aWMgX3NwbGl0QnJvd3NlckluZm8gKGJyb3dzZXJJbmZvOiBCcm93c2VySW5mb1NvdXJjZVtdKTogU2VwYXJhdGVkQnJvd3NlckluZm8ge1xuICAgICAgICBjb25zdCByZW1vdGVzOiBCcm93c2VyQ29ubmVjdGlvbltdICA9IFtdO1xuICAgICAgICBjb25zdCBhdXRvbWF0ZWQ6IEJyb3dzZXJJbmZvW10gICAgICA9IFtdO1xuXG4gICAgICAgIGJyb3dzZXJJbmZvLmZvckVhY2goYnJvd3NlciA9PiB7XG4gICAgICAgICAgICBpZiAoYnJvd3NlciBpbnN0YW5jZW9mIEJyb3dzZXJDb25uZWN0aW9uKVxuICAgICAgICAgICAgICAgIHJlbW90ZXMucHVzaChicm93c2VyKTtcbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICBhdXRvbWF0ZWQucHVzaChicm93c2VyKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIHsgcmVtb3RlcywgYXV0b21hdGVkIH07XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfY3JlYXRlQXV0b21hdGVkQ29ubmVjdGlvbnMgKGJyb3dzZXJJbmZvOiBCcm93c2VySW5mb1tdKTogQnJvd3NlckNvbm5lY3Rpb25bXVtdIHtcbiAgICAgICAgaWYgKCFicm93c2VySW5mbylcbiAgICAgICAgICAgIHJldHVybiBbXTtcblxuICAgICAgICByZXR1cm4gYnJvd3NlckluZm9cbiAgICAgICAgICAgIC5tYXAoYnJvd3NlciA9PiB0aW1lcyh0aGlzLmNvbmN1cnJlbmN5LCAoKSA9PiBuZXcgQnJvd3NlckNvbm5lY3Rpb24oXG4gICAgICAgICAgICAgICAgdGhpcy5icm93c2VyQ29ubmVjdGlvbkdhdGV3YXksIHsgLi4uYnJvd3NlciB9LCBmYWxzZSwgdGhpcy5kaXNhYmxlTXVsdGlwbGVXaW5kb3dzLCB0aGlzLnByb3h5bGVzcywgdGhpcy5tZXNzYWdlQnVzKSkpO1xuICAgIH1cblxuICAgIHByaXZhdGUgX2dldEJyb3dzZXJTZXRPcHRpb25zICgpOiBCcm93c2VyU2V0T3B0aW9ucyB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBjb25jdXJyZW5jeTogICAgICAgIHRoaXMuY29uY3VycmVuY3ksXG4gICAgICAgICAgICBicm93c2VySW5pdFRpbWVvdXQ6IHRoaXMuYnJvd3NlckluaXRUaW1lb3V0LFxuICAgICAgICAgICAgd2FybmluZ0xvZzogICAgICAgICB0aGlzLndhcm5pbmdMb2csXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBfZ2V0QnJvd3NlckNvbm5lY3Rpb25zIChicm93c2VySW5mbzogQnJvd3NlckluZm9Tb3VyY2VbXSk6IFByb21pc2U8QnJvd3NlclNldD4ge1xuICAgICAgICBjb25zdCB7IGF1dG9tYXRlZCwgcmVtb3RlcyB9ID0gQm9vdHN0cmFwcGVyLl9zcGxpdEJyb3dzZXJJbmZvKGJyb3dzZXJJbmZvKTtcblxuICAgICAgICBpZiAocmVtb3RlcyAmJiByZW1vdGVzLmxlbmd0aCAlIHRoaXMuY29uY3VycmVuY3kpXG4gICAgICAgICAgICB0aHJvdyBuZXcgR2VuZXJhbEVycm9yKFJVTlRJTUVfRVJST1JTLmNhbm5vdERpdmlkZVJlbW90ZXNDb3VudEJ5Q29uY3VycmVuY3kpO1xuXG4gICAgICAgIGxldCBicm93c2VyQ29ubmVjdGlvbnMgPSB0aGlzLl9jcmVhdGVBdXRvbWF0ZWRDb25uZWN0aW9ucyhhdXRvbWF0ZWQpO1xuXG4gICAgICAgIHJlbW90ZXMuZm9yRWFjaChyZW1vdGVDb25uZWN0aW9uID0+IHtcbiAgICAgICAgICAgIHJlbW90ZUNvbm5lY3Rpb24ubWVzc2FnZUJ1cyA9IHRoaXMubWVzc2FnZUJ1cztcbiAgICAgICAgfSk7XG5cbiAgICAgICAgYnJvd3NlckNvbm5lY3Rpb25zID0gYnJvd3NlckNvbm5lY3Rpb25zLmNvbmNhdChjaHVuayhyZW1vdGVzLCB0aGlzLmNvbmN1cnJlbmN5KSk7XG5cbiAgICAgICAgcmV0dXJuIEJyb3dzZXJTZXQuZnJvbShicm93c2VyQ29ubmVjdGlvbnMsIHRoaXMuX2dldEJyb3dzZXJTZXRPcHRpb25zKCkpO1xuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgX2ZpbHRlclRlc3RzICh0ZXN0czogVGVzdFtdLCBwcmVkaWNhdGU6IEZpbHRlckZ1bmN0aW9uKTogUHJvbWlzZTxUZXN0W10+IHtcbiAgICAgICAgcmV0dXJuIGFzeW5jRmlsdGVyKHRlc3RzLCB0ZXN0ID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHRlc3RGaXh0dXJlID0gdGVzdC5maXh0dXJlIGFzIEZpeHR1cmU7XG5cbiAgICAgICAgICAgIHJldHVybiBwcmVkaWNhdGUoXG4gICAgICAgICAgICAgICAgdGVzdC5uYW1lIGFzIHN0cmluZyxcbiAgICAgICAgICAgICAgICB0ZXN0Rml4dHVyZS5uYW1lIGFzIHN0cmluZyxcbiAgICAgICAgICAgICAgICB0ZXN0Rml4dHVyZS5wYXRoLFxuICAgICAgICAgICAgICAgIHRlc3QubWV0YSxcbiAgICAgICAgICAgICAgICB0ZXN0Rml4dHVyZS5tZXRhKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBfY29tcGlsZVRlc3RzICh7IHNvdXJjZUxpc3QsIGNvbXBpbGVyT3B0aW9ucywgcnVubmFibGVDb25maWd1cmF0aW9uSWQgfTogQ29tcGlsZXJBcmd1bWVudHMpOiBQcm9taXNlPFRlc3RbXT4ge1xuICAgICAgICBjb25zdCBiYXNlVXJsICAgICAgICAgID0gdGhpcy5jb25maWd1cmF0aW9uLmdldE9wdGlvbihPUFRJT05fTkFNRVMuYmFzZVVybCkgYXMgc3RyaW5nO1xuICAgICAgICBjb25zdCBleHBlcmltZW50YWxFc20gID0gdGhpcy5jb25maWd1cmF0aW9uLmdldE9wdGlvbihPUFRJT05fTkFNRVMuZXhwZXJpbWVudGFsRXNtKSBhcyBib29sZWFuO1xuXG4gICAgICAgIGlmICh0aGlzLmNvbXBpbGVyU2VydmljZSkge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5jb21waWxlclNlcnZpY2UuaW5pdCgpO1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5jb21waWxlclNlcnZpY2Uuc2V0VXNlclZhcmlhYmxlcyh1c2VyVmFyaWFibGVzLnZhbHVlKTtcblxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuY29tcGlsZXJTZXJ2aWNlLmdldFRlc3RzKHsgc291cmNlTGlzdCwgY29tcGlsZXJPcHRpb25zLCBydW5uYWJsZUNvbmZpZ3VyYXRpb25JZCB9LCBiYXNlVXJsKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGNvbXBpbGVyID0gbmV3IENvbXBpbGVyKHNvdXJjZUxpc3QsIGNvbXBpbGVyT3B0aW9ucywgeyBiYXNlVXJsLCBpc0NvbXBpbGVyU2VydmljZU1vZGU6IGZhbHNlLCBleHBlcmltZW50YWxFc20gfSk7XG5cbiAgICAgICAgcmV0dXJuIGNvbXBpbGVyLmdldFRlc3RzKCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfYXNzZXJ0R2xvYmFsSG9va3MgKCk6IHZvaWQge1xuICAgICAgICBpZiAoIXRoaXMuaG9va3MpXG4gICAgICAgICAgICByZXR1cm47XG5cbiAgICAgICAgaWYgKHRoaXMuaG9va3MuZml4dHVyZT8uYmVmb3JlKVxuICAgICAgICAgICAgYXNzZXJ0VHlwZShpcy5mdW5jdGlvbiwgJ2dsb2JhbEJlZm9yZScsICdUaGUgZml4dHVyZS5nbG9iYWxCZWZvcmUgaG9vaycsIHRoaXMuaG9va3MuZml4dHVyZS5iZWZvcmUpO1xuXG4gICAgICAgIGlmICh0aGlzLmhvb2tzLmZpeHR1cmU/LmFmdGVyKVxuICAgICAgICAgICAgYXNzZXJ0VHlwZShpcy5mdW5jdGlvbiwgJ2dsb2JhbEFmdGVyJywgJ1RoZSBmaXh0dXJlLmdsb2JhbEFmdGVyIGhvb2snLCB0aGlzLmhvb2tzLmZpeHR1cmUuYWZ0ZXIpO1xuXG4gICAgICAgIGlmICh0aGlzLmhvb2tzLnRlc3Q/LmJlZm9yZSlcbiAgICAgICAgICAgIGFzc2VydFR5cGUoaXMuZnVuY3Rpb24sICdnbG9iYWxCZWZvcmUnLCAnVGhlIHRlc3QuZ2xvYmFsQmVmb3JlIGhvb2snLCB0aGlzLmhvb2tzLnRlc3QuYmVmb3JlKTtcblxuICAgICAgICBpZiAodGhpcy5ob29rcy50ZXN0Py5hZnRlcilcbiAgICAgICAgICAgIGFzc2VydFR5cGUoaXMuZnVuY3Rpb24sICdnbG9iYWxBZnRlcicsICdUaGUgdGVzdC5nbG9iYWxBZnRlciBob29rJywgdGhpcy5ob29rcy50ZXN0LmFmdGVyKTtcblxuICAgICAgICBpZiAodGhpcy5ob29rcy5yZXF1ZXN0KVxuICAgICAgICAgICAgYXNzZXJ0UmVxdWVzdEhvb2tUeXBlKGZsYXR0ZW4oY2FzdEFycmF5KHRoaXMuaG9va3MucmVxdWVzdCkpKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9zZXRHbG9iYWxIb29rc1RvVGVzdHMgKHRlc3RzOiBUZXN0W10pOiB2b2lkIHtcbiAgICAgICAgaWYgKCF0aGlzLmhvb2tzKVxuICAgICAgICAgICAgcmV0dXJuO1xuXG4gICAgICAgIHRoaXMuX2Fzc2VydEdsb2JhbEhvb2tzKCk7XG5cbiAgICAgICAgY29uc3QgZml4dHVyZUJlZm9yZSA9IHRoaXMuaG9va3MuZml4dHVyZT8uYmVmb3JlIHx8IG51bGw7XG4gICAgICAgIGNvbnN0IGZpeHR1cmVBZnRlciAgPSB0aGlzLmhvb2tzLmZpeHR1cmU/LmFmdGVyIHx8IG51bGw7XG4gICAgICAgIGNvbnN0IHRlc3RCZWZvcmUgICAgPSB0aGlzLmhvb2tzLnRlc3Q/LmJlZm9yZSA/IHdyYXBUZXN0RnVuY3Rpb24odGhpcy5ob29rcy50ZXN0LmJlZm9yZSkgOiBudWxsO1xuICAgICAgICBjb25zdCB0ZXN0QWZ0ZXIgICAgID0gdGhpcy5ob29rcy50ZXN0Py5hZnRlciA/IHdyYXBUZXN0RnVuY3Rpb24odGhpcy5ob29rcy50ZXN0LmFmdGVyKSA6IG51bGw7XG4gICAgICAgIGNvbnN0IHJlcXVlc3QgICAgICAgPSB0aGlzLmhvb2tzLnJlcXVlc3QgfHwgW107XG5cbiAgICAgICAgdGVzdHMuZm9yRWFjaChpdGVtID0+IHtcbiAgICAgICAgICAgIGlmIChpdGVtLmZpeHR1cmUpIHtcbiAgICAgICAgICAgICAgICBpdGVtLmZpeHR1cmUuZ2xvYmFsQmVmb3JlRm4gPSBpdGVtLmZpeHR1cmUuZ2xvYmFsQmVmb3JlRm4gfHwgZml4dHVyZUJlZm9yZTtcbiAgICAgICAgICAgICAgICBpdGVtLmZpeHR1cmUuZ2xvYmFsQWZ0ZXJGbiAgPSBpdGVtLmZpeHR1cmUuZ2xvYmFsQWZ0ZXJGbiB8fCBmaXh0dXJlQWZ0ZXI7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGl0ZW0uZ2xvYmFsQmVmb3JlRm4gPSB0ZXN0QmVmb3JlO1xuICAgICAgICAgICAgaXRlbS5nbG9iYWxBZnRlckZuICA9IHRlc3RBZnRlcjtcbiAgICAgICAgICAgIGl0ZW0ucmVxdWVzdEhvb2tzICAgPSB1bmlvbihmbGF0dGVuKGNhc3RBcnJheShyZXF1ZXN0KSksIGl0ZW0ucmVxdWVzdEhvb2tzKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBfZ2V0VGVzdHMgKGlkOiBzdHJpbmcpOiBQcm9taXNlPFRlc3RbXT4ge1xuICAgICAgICBjb25zdCBjd2QgICAgICAgID0gcHJvY2Vzcy5jd2QoKTtcbiAgICAgICAgY29uc3Qgc291cmNlTGlzdCA9IGF3YWl0IHBhcnNlRmlsZUxpc3QodGhpcy5zb3VyY2VzLCBjd2QpO1xuXG4gICAgICAgIGlmICghc291cmNlTGlzdC5sZW5ndGgpXG4gICAgICAgICAgICB0aHJvdyBuZXcgR2VuZXJhbEVycm9yKFJVTlRJTUVfRVJST1JTLnRlc3RGaWxlc05vdEZvdW5kLCBjd2QsIGdldENvbmNhdGVuYXRlZFZhbHVlc1N0cmluZyh0aGlzLnNvdXJjZXMsICdcXG4nLCAnJykpO1xuXG4gICAgICAgIGxldCB0ZXN0cyA9IGF3YWl0IGd1YXJkVGltZUV4ZWN1dGlvbihcbiAgICAgICAgICAgIGFzeW5jICgpID0+IGF3YWl0IHRoaXMuX2NvbXBpbGVUZXN0cyh7IHNvdXJjZUxpc3QsIGNvbXBpbGVyT3B0aW9uczogdGhpcy5jb21waWxlck9wdGlvbnMsIHJ1bm5hYmxlQ29uZmlndXJhdGlvbklkOiBpZCB9KSxcbiAgICAgICAgICAgIGVsYXBzZWRUaW1lID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmRlYnVnTG9nZ2VyKGB0ZXN0cyBjb21waWxhdGlvbiB0b29rICR7cHJldHR5VGltZShlbGFwc2VkVGltZSl9YCk7XG5cbiAgICAgICAgICAgICAgICBjb25zdCBbIGVsYXBzZWRTZWNvbmRzIF0gPSBlbGFwc2VkVGltZTtcblxuICAgICAgICAgICAgICAgIGlmIChlbGFwc2VkU2Vjb25kcyA+IHRoaXMuVEVTVFNfQ09NUElMQVRJT05fVVBQRVJCT1VORClcbiAgICAgICAgICAgICAgICAgICAgdGhpcy53YXJuaW5nTG9nLmFkZFdhcm5pbmcoV0FSTklOR19NRVNTQUdFUy50ZXN0c0NvbXBpbGF0aW9uVGFrZXNUb29Mb25nLCBwcmV0dHlUaW1lKGVsYXBzZWRUaW1lKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICk7XG5cbiAgICAgICAgY29uc3QgdGVzdHNXaXRoT25seUZsYWcgPSB0ZXN0cy5maWx0ZXIodGVzdCA9PiB0ZXN0Lm9ubHkpO1xuXG4gICAgICAgIGlmICh0ZXN0c1dpdGhPbmx5RmxhZy5sZW5ndGgpXG4gICAgICAgICAgICB0ZXN0cyA9IHRlc3RzV2l0aE9ubHlGbGFnO1xuXG4gICAgICAgIGlmICghdGVzdHMubGVuZ3RoKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEdlbmVyYWxFcnJvcihSVU5USU1FX0VSUk9SUy5ub1Rlc3RzVG9SdW4pO1xuXG4gICAgICAgIGlmICh0aGlzLmZpbHRlcilcbiAgICAgICAgICAgIHRlc3RzID0gYXdhaXQgdGhpcy5fZmlsdGVyVGVzdHModGVzdHMsIHRoaXMuZmlsdGVyKTtcblxuICAgICAgICBpZiAoIXRlc3RzLmxlbmd0aClcbiAgICAgICAgICAgIHRocm93IG5ldyBHZW5lcmFsRXJyb3IoUlVOVElNRV9FUlJPUlMubm9UZXN0c1RvUnVuRHVlRmlsdGVyaW5nKTtcblxuICAgICAgICB0aGlzLl9zZXRHbG9iYWxIb29rc1RvVGVzdHModGVzdHMpO1xuXG4gICAgICAgIHJldHVybiB0ZXN0cztcbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIF9zdGFydFRlc3RlZEFwcCAoKTogUHJvbWlzZTxUZXN0ZWRBcHB8dW5kZWZpbmVkPiB7XG4gICAgICAgIGlmICghdGhpcy5hcHBDb21tYW5kKVxuICAgICAgICAgICAgcmV0dXJuIHZvaWQgMDtcblxuICAgICAgICBjb25zdCB0ZXN0ZWRBcHAgPSBuZXcgVGVzdGVkQXBwKCk7XG5cbiAgICAgICAgYXdhaXQgdGVzdGVkQXBwLnN0YXJ0KHRoaXMuYXBwQ29tbWFuZCwgdGhpcy5hcHBJbml0RGVsYXkgYXMgbnVtYmVyKTtcblxuICAgICAgICByZXR1cm4gdGVzdGVkQXBwO1xuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgX2NhblVzZVBhcmFsbGVsQm9vdHN0cmFwcGluZyAoYnJvd3NlckluZm86IEJyb3dzZXJJbmZvU291cmNlW10pOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICAgICAgY29uc3QgaXNMb2NhbFByb21pc2VzID0gYnJvd3NlckluZm8ubWFwKGJyb3dzZXIgPT4gYnJvd3Nlci5wcm92aWRlci5pc0xvY2FsQnJvd3Nlcih2b2lkIDAsIEJvb3RzdHJhcHBlci5fZ2V0QnJvd3Nlck5hbWUoYnJvd3NlcikpKTtcbiAgICAgICAgY29uc3QgaXNMb2NhbEJyb3dzZXJzID0gYXdhaXQgUHJvbWlzZS5hbGwoaXNMb2NhbFByb21pc2VzKTtcblxuICAgICAgICByZXR1cm4gaXNMb2NhbEJyb3dzZXJzLmV2ZXJ5KHJlc3VsdCA9PiByZXN1bHQpO1xuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgX2Jvb3RzdHJhcFNlcXVlbmNlIChicm93c2VySW5mbzogQnJvd3NlckluZm9Tb3VyY2VbXSwgaWQ6IHN0cmluZyk6IFByb21pc2U8QmFzaWNSdW50aW1lUmVzb3VyY2VzPiB7XG4gICAgICAgIGNvbnN0IHRlc3RzICAgICAgID0gYXdhaXQgdGhpcy5fZ2V0VGVzdHMoaWQpO1xuICAgICAgICBjb25zdCB0ZXN0ZWRBcHAgICA9IGF3YWl0IHRoaXMuX3N0YXJ0VGVzdGVkQXBwKCk7XG4gICAgICAgIGNvbnN0IGJyb3dzZXJTZXQgID0gYXdhaXQgdGhpcy5fZ2V0QnJvd3NlckNvbm5lY3Rpb25zKGJyb3dzZXJJbmZvKTtcblxuICAgICAgICByZXR1cm4geyB0ZXN0cywgdGVzdGVkQXBwLCBicm93c2VyU2V0IH07XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfd3JhcEJvb3RzdHJhcHBpbmdQcm9taXNlPFQ+IChwcm9taXNlOiBQcm9taXNlPFQ+KTogUHJvbWlzZTxQcm9taXNlUmVzdWx0PFQ+PiB7XG4gICAgICAgIHJldHVybiBwcm9taXNlXG4gICAgICAgICAgICAudGhlbihyZXN1bHQgPT4gKHsgZXJyb3I6IHZvaWQgMCwgcmVzdWx0IH0pKVxuICAgICAgICAgICAgLmNhdGNoKGVycm9yID0+ICh7IHJlc3VsdDogdm9pZCAwLCBlcnJvciB9KSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBfZ2V0Qm9vdHN0cmFwcGluZ0Vycm9yIChicm93c2VyU2V0U3RhdHVzOiBQcm9taXNlUmVzdWx0PEJyb3dzZXJTZXQ+LCB0ZXN0c1N0YXR1czogUHJvbWlzZVJlc3VsdDxUZXN0W10+LCB0ZXN0ZWRBcHBTdGF0dXM6IFByb21pc2VSZXN1bHQ8VGVzdGVkQXBwfHVuZGVmaW5lZD4pOiBQcm9taXNlPEVycm9yPiB7XG4gICAgICAgIGlmICghaXNQcm9taXNlRXJyb3IoYnJvd3NlclNldFN0YXR1cykpXG4gICAgICAgICAgICBhd2FpdCBicm93c2VyU2V0U3RhdHVzLnJlc3VsdC5kaXNwb3NlKCk7XG5cbiAgICAgICAgaWYgKCFpc1Byb21pc2VFcnJvcihicm93c2VyU2V0U3RhdHVzKSAmJiAhaXNQcm9taXNlRXJyb3IodGVzdGVkQXBwU3RhdHVzKSAmJiB0ZXN0ZWRBcHBTdGF0dXMucmVzdWx0KVxuICAgICAgICAgICAgYXdhaXQgdGVzdGVkQXBwU3RhdHVzLnJlc3VsdC5raWxsKCk7XG5cbiAgICAgICAgaWYgKGlzUHJvbWlzZUVycm9yKHRlc3RzU3RhdHVzKSlcbiAgICAgICAgICAgIHJldHVybiB0ZXN0c1N0YXR1cy5lcnJvcjtcblxuICAgICAgICBpZiAoaXNQcm9taXNlRXJyb3IodGVzdGVkQXBwU3RhdHVzKSlcbiAgICAgICAgICAgIHJldHVybiB0ZXN0ZWRBcHBTdGF0dXMuZXJyb3I7XG5cbiAgICAgICAgaWYgKGlzUHJvbWlzZUVycm9yKGJyb3dzZXJTZXRTdGF0dXMpKVxuICAgICAgICAgICAgcmV0dXJuIGJyb3dzZXJTZXRTdGF0dXMuZXJyb3I7XG5cbiAgICAgICAgcmV0dXJuIG5ldyBFcnJvcignVW5leHBlY3RlZCBjYWxsJyk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfZ2V0Qm9vdHN0cmFwcGluZ1Byb21pc2VzPFQ+IChhcmc6IFByb21pc2VDb2xsZWN0aW9uPFQ+KTogUHJvbWlzZUNvbGxlY3Rpb248UmVzdWx0Q29sbGVjdGlvbjxUPj4ge1xuICAgICAgICBjb25zdCByZXN1bHQgPSB7fSBhcyB1bmtub3duIGFzIFByb21pc2VDb2xsZWN0aW9uPFJlc3VsdENvbGxlY3Rpb248VD4+O1xuXG4gICAgICAgIGZvciAoY29uc3QgayBpbiBhcmcpXG4gICAgICAgICAgICByZXN1bHRba10gPSB0aGlzLl93cmFwQm9vdHN0cmFwcGluZ1Byb21pc2UoYXJnW2tdKTtcblxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgX2Jvb3RzdHJhcFBhcmFsbGVsIChicm93c2VySW5mbzogQnJvd3NlckluZm9Tb3VyY2VbXSwgaWQ6IHN0cmluZyk6IFByb21pc2U8QmFzaWNSdW50aW1lUmVzb3VyY2VzPiB7XG4gICAgICAgIGNvbnN0IGJvb3RzdHJhcHBpbmdQcm9taXNlcyA9IHtcbiAgICAgICAgICAgIGJyb3dzZXJTZXQ6IHRoaXMuX2dldEJyb3dzZXJDb25uZWN0aW9ucyhicm93c2VySW5mbyksXG4gICAgICAgICAgICB0ZXN0czogICAgICB0aGlzLl9nZXRUZXN0cyhpZCksXG4gICAgICAgICAgICBhcHA6ICAgICAgICB0aGlzLl9zdGFydFRlc3RlZEFwcCgpLFxuICAgICAgICB9O1xuXG4gICAgICAgIGNvbnN0IGJvb3RzdHJhcHBpbmdSZXN1bHRQcm9taXNlcyA9IHRoaXMuX2dldEJvb3RzdHJhcHBpbmdQcm9taXNlcyhib290c3RyYXBwaW5nUHJvbWlzZXMpO1xuXG4gICAgICAgIGNvbnN0IGJvb3RzdHJhcHBpbmdSZXN1bHRzID0gYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgICAgICAgYm9vdHN0cmFwcGluZ1Jlc3VsdFByb21pc2VzLmJyb3dzZXJTZXQsXG4gICAgICAgICAgICBib290c3RyYXBwaW5nUmVzdWx0UHJvbWlzZXMudGVzdHMsXG4gICAgICAgICAgICBib290c3RyYXBwaW5nUmVzdWx0UHJvbWlzZXMuYXBwLFxuICAgICAgICBdKTtcblxuICAgICAgICBjb25zdCBbYnJvd3NlclNldFJlc3VsdHMsIHRlc3RSZXN1bHRzLCBhcHBSZXN1bHRzXSA9IGJvb3RzdHJhcHBpbmdSZXN1bHRzO1xuXG4gICAgICAgIGlmIChpc1Byb21pc2VFcnJvcihicm93c2VyU2V0UmVzdWx0cykgfHwgaXNQcm9taXNlRXJyb3IodGVzdFJlc3VsdHMpIHx8IGlzUHJvbWlzZUVycm9yKGFwcFJlc3VsdHMpKVxuICAgICAgICAgICAgdGhyb3cgYXdhaXQgdGhpcy5fZ2V0Qm9vdHN0cmFwcGluZ0Vycm9yKC4uLmJvb3RzdHJhcHBpbmdSZXN1bHRzKTtcblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgYnJvd3NlclNldDogYnJvd3NlclNldFJlc3VsdHMucmVzdWx0LFxuICAgICAgICAgICAgdGVzdHM6ICAgICAgdGVzdFJlc3VsdHMucmVzdWx0LFxuICAgICAgICAgICAgdGVzdGVkQXBwOiAgYXBwUmVzdWx0cy5yZXN1bHQsXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgLy8gQVBJXG4gICAgcHVibGljIGFzeW5jIGNyZWF0ZVJ1bm5hYmxlQ29uZmlndXJhdGlvbiAoKTogUHJvbWlzZTxSdW5uYWJsZUNvbmZpZ3VyYXRpb24+IHtcbiAgICAgICAgY29uc3QgaWQgICAgICAgICAgICAgICAgICA9IGdlbmVyYXRlVW5pcXVlSWQoKTtcbiAgICAgICAgY29uc3QgY29tbW9uQ2xpZW50U2NyaXB0cyA9IGF3YWl0IGxvYWRDbGllbnRTY3JpcHRzKHRoaXMuY2xpZW50U2NyaXB0cyk7XG5cbiAgICAgICAgaWYgKGF3YWl0IHRoaXMuX2NhblVzZVBhcmFsbGVsQm9vdHN0cmFwcGluZyh0aGlzLmJyb3dzZXJzKSlcbiAgICAgICAgICAgIHJldHVybiB7IC4uLmF3YWl0IHRoaXMuX2Jvb3RzdHJhcFBhcmFsbGVsKHRoaXMuYnJvd3NlcnMsIGlkKSwgY29tbW9uQ2xpZW50U2NyaXB0cywgaWQgfTtcblxuICAgICAgICByZXR1cm4geyAuLi5hd2FpdCB0aGlzLl9ib290c3RyYXBTZXF1ZW5jZSh0aGlzLmJyb3dzZXJzLCBpZCksIGNvbW1vbkNsaWVudFNjcmlwdHMsIGlkIH07XG4gICAgfVxufVxuIl19