oxygen-cli 1.22.0 → 1.99.0-alpha.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (232) hide show
  1. package/CHANGELOG.md +0 -50
  2. package/build/core/OxygenCore.js +56 -145
  3. package/build/errors/OxygenError.js +5 -15
  4. package/build/errors/helper.js +45 -49
  5. package/build/index.js +14 -6
  6. package/build/lib/cli-util.js +19 -19
  7. package/build/lib/cli.js +4 -2
  8. package/build/lib/parallel-launcher.js +333 -0
  9. package/build/lib/param-manager.js +66 -47
  10. package/build/lib/util.js +38 -9
  11. package/build/ox_modules/index.js +1 -97
  12. package/build/ox_modules/module-assert.js +19 -9
  13. package/build/ox_modules/module-dns.js +220 -0
  14. package/build/ox_modules/module-http.js +39 -51
  15. package/build/ox_modules/module-shell.js +19 -75
  16. package/build/ox_modules/module-utils.js +1 -108
  17. package/build/ox_modules/utils.js +1 -357
  18. package/build/reporter/FileReporterBase.js +5 -5
  19. package/build/reporter/ReportAggregator.js +127 -4
  20. package/build/runners/WorkerProcess.js +15 -28
  21. package/build/runners/index.js +2 -6
  22. package/build/runners/oxygen/OxygenWorker.js +8 -8
  23. package/build/runners/oxygen/index.js +17 -18
  24. package/build/runners/oxygen/worker.js +10 -8
  25. package/package.json +12 -46
  26. package/build/lib/img-merge.js +0 -163
  27. package/build/ox_modules/module-db.js +0 -146
  28. package/build/ox_modules/module-email.js +0 -212
  29. package/build/ox_modules/module-eyes.js +0 -189
  30. package/build/ox_modules/module-mailinator.js +0 -207
  31. package/build/ox_modules/module-mob/commands/alertAccept.js +0 -35
  32. package/build/ox_modules/module-mob/commands/alertDismiss.js +0 -35
  33. package/build/ox_modules/module-mob/commands/assertAlert.js +0 -56
  34. package/build/ox_modules/module-mob/commands/assertText.js +0 -45
  35. package/build/ox_modules/module-mob/commands/assertTitle.js +0 -43
  36. package/build/ox_modules/module-mob/commands/assertValue.js +0 -66
  37. package/build/ox_modules/module-mob/commands/back.js +0 -27
  38. package/build/ox_modules/module-mob/commands/clear.js +0 -40
  39. package/build/ox_modules/module-mob/commands/click.js +0 -35
  40. package/build/ox_modules/module-mob/commands/clickHidden.js +0 -52
  41. package/build/ox_modules/module-mob/commands/clickLong.js +0 -34
  42. package/build/ox_modules/module-mob/commands/clickMultipleTimes.js +0 -37
  43. package/build/ox_modules/module-mob/commands/closeApp.js +0 -27
  44. package/build/ox_modules/module-mob/commands/debug.js +0 -26
  45. package/build/ox_modules/module-mob/commands/dragAndDrop.js +0 -38
  46. package/build/ox_modules/module-mob/commands/enableNetwork.js +0 -75
  47. package/build/ox_modules/module-mob/commands/execute.js +0 -32
  48. package/build/ox_modules/module-mob/commands/findElement.js +0 -36
  49. package/build/ox_modules/module-mob/commands/findElements.js +0 -39
  50. package/build/ox_modules/module-mob/commands/getAlertText.js +0 -31
  51. package/build/ox_modules/module-mob/commands/getAppiumLogs.js +0 -26
  52. package/build/ox_modules/module-mob/commands/getBrowserLogs.js +0 -66
  53. package/build/ox_modules/module-mob/commands/getCurrentActivity.js +0 -26
  54. package/build/ox_modules/module-mob/commands/getCurrentPackage.js +0 -26
  55. package/build/ox_modules/module-mob/commands/getDeviceLogs.js +0 -57
  56. package/build/ox_modules/module-mob/commands/getDeviceTime.js +0 -27
  57. package/build/ox_modules/module-mob/commands/getLocation.js +0 -32
  58. package/build/ox_modules/module-mob/commands/getSource.js +0 -26
  59. package/build/ox_modules/module-mob/commands/getText.js +0 -36
  60. package/build/ox_modules/module-mob/commands/getTitle.js +0 -24
  61. package/build/ox_modules/module-mob/commands/getUrl.js +0 -28
  62. package/build/ox_modules/module-mob/commands/getValue.js +0 -50
  63. package/build/ox_modules/module-mob/commands/getWindowHandles.js +0 -27
  64. package/build/ox_modules/module-mob/commands/hideKeyboard.js +0 -33
  65. package/build/ox_modules/module-mob/commands/index.js +0 -594
  66. package/build/ox_modules/module-mob/commands/installApp.js +0 -28
  67. package/build/ox_modules/module-mob/commands/isAppInstalled.js +0 -28
  68. package/build/ox_modules/module-mob/commands/isCheckable.js +0 -31
  69. package/build/ox_modules/module-mob/commands/isChecked.js +0 -31
  70. package/build/ox_modules/module-mob/commands/isClickable.js +0 -31
  71. package/build/ox_modules/module-mob/commands/isExist.js +0 -36
  72. package/build/ox_modules/module-mob/commands/isSelected.js +0 -36
  73. package/build/ox_modules/module-mob/commands/isVisible.js +0 -36
  74. package/build/ox_modules/module-mob/commands/isWebViewContext.js +0 -27
  75. package/build/ox_modules/module-mob/commands/launchApp.js +0 -26
  76. package/build/ox_modules/module-mob/commands/longPressKeyCode.js +0 -30
  77. package/build/ox_modules/module-mob/commands/open.js +0 -43
  78. package/build/ox_modules/module-mob/commands/pause.js +0 -27
  79. package/build/ox_modules/module-mob/commands/removeApp.js +0 -28
  80. package/build/ox_modules/module-mob/commands/resetApp.js +0 -26
  81. package/build/ox_modules/module-mob/commands/scrollIntoElement.js +0 -86
  82. package/build/ox_modules/module-mob/commands/scrollIntoView.js +0 -40
  83. package/build/ox_modules/module-mob/commands/select.js +0 -54
  84. package/build/ox_modules/module-mob/commands/selectFrame.js +0 -53
  85. package/build/ox_modules/module-mob/commands/selectWindow.js +0 -149
  86. package/build/ox_modules/module-mob/commands/sendKeys.js +0 -84
  87. package/build/ox_modules/module-mob/commands/setContext.js +0 -28
  88. package/build/ox_modules/module-mob/commands/setNativeContext.js +0 -26
  89. package/build/ox_modules/module-mob/commands/setTimeout.js +0 -33
  90. package/build/ox_modules/module-mob/commands/setWebViewContext.js +0 -39
  91. package/build/ox_modules/module-mob/commands/shake.js +0 -27
  92. package/build/ox_modules/module-mob/commands/smsClickLink.js +0 -32
  93. package/build/ox_modules/module-mob/commands/smsGetText.js +0 -45
  94. package/build/ox_modules/module-mob/commands/swipe.js +0 -58
  95. package/build/ox_modules/module-mob/commands/swipeElement.js +0 -58
  96. package/build/ox_modules/module-mob/commands/swipeScreen.js +0 -56
  97. package/build/ox_modules/module-mob/commands/takeScreenshot.js +0 -27
  98. package/build/ox_modules/module-mob/commands/tap.js +0 -34
  99. package/build/ox_modules/module-mob/commands/type.js +0 -67
  100. package/build/ox_modules/module-mob/commands/unlockPattern.js +0 -92
  101. package/build/ox_modules/module-mob/commands/waitForExist.js +0 -29
  102. package/build/ox_modules/module-mob/commands/waitForInteractable.js +0 -42
  103. package/build/ox_modules/module-mob/commands/waitForVisible.js +0 -28
  104. package/build/ox_modules/module-mob.js +0 -699
  105. package/build/ox_modules/module-pdf.js +0 -328
  106. package/build/ox_modules/module-proxy.js +0 -324
  107. package/build/ox_modules/module-serial.js +0 -187
  108. package/build/ox_modules/module-soap.js +0 -260
  109. package/build/ox_modules/module-twilio.js +0 -192
  110. package/build/ox_modules/module-web/commands/alertAccept.js +0 -35
  111. package/build/ox_modules/module-web/commands/alertDismiss.js +0 -35
  112. package/build/ox_modules/module-web/commands/assertAlert.js +0 -55
  113. package/build/ox_modules/module-web/commands/assertExist.js +0 -28
  114. package/build/ox_modules/module-web/commands/assertSelectedLabel.js +0 -51
  115. package/build/ox_modules/module-web/commands/assertSelectedValue.js +0 -45
  116. package/build/ox_modules/module-web/commands/assertText.js +0 -45
  117. package/build/ox_modules/module-web/commands/assertTextNotPresent.js +0 -56
  118. package/build/ox_modules/module-web/commands/assertTextPresent.js +0 -52
  119. package/build/ox_modules/module-web/commands/assertTitle.js +0 -42
  120. package/build/ox_modules/module-web/commands/assertValue.js +0 -44
  121. package/build/ox_modules/module-web/commands/back.js +0 -27
  122. package/build/ox_modules/module-web/commands/clear.js +0 -41
  123. package/build/ox_modules/module-web/commands/click.js +0 -112
  124. package/build/ox_modules/module-web/commands/clickHidden.js +0 -79
  125. package/build/ox_modules/module-web/commands/closeWindow.js +0 -25
  126. package/build/ox_modules/module-web/commands/debug.js +0 -25
  127. package/build/ox_modules/module-web/commands/deleteCookies.js +0 -22
  128. package/build/ox_modules/module-web/commands/deselect.js +0 -34
  129. package/build/ox_modules/module-web/commands/doubleClick.js +0 -65
  130. package/build/ox_modules/module-web/commands/dragAndDrop.js +0 -36
  131. package/build/ox_modules/module-web/commands/execute.js +0 -36
  132. package/build/ox_modules/module-web/commands/fileBrowse.js +0 -72
  133. package/build/ox_modules/module-web/commands/findElement.js +0 -35
  134. package/build/ox_modules/module-web/commands/findElements.js +0 -38
  135. package/build/ox_modules/module-web/commands/fullscreenWindow.js +0 -24
  136. package/build/ox_modules/module-web/commands/getAlertText.js +0 -30
  137. package/build/ox_modules/module-web/commands/getAttribute.js +0 -38
  138. package/build/ox_modules/module-web/commands/getBrowserLogs.js +0 -34
  139. package/build/ox_modules/module-web/commands/getCookies.js +0 -23
  140. package/build/ox_modules/module-web/commands/getCssValue.js +0 -38
  141. package/build/ox_modules/module-web/commands/getElementCount.js +0 -29
  142. package/build/ox_modules/module-web/commands/getHTML.js +0 -30
  143. package/build/ox_modules/module-web/commands/getSource.js +0 -26
  144. package/build/ox_modules/module-web/commands/getText.js +0 -36
  145. package/build/ox_modules/module-web/commands/getTitle.js +0 -22
  146. package/build/ox_modules/module-web/commands/getUrl.js +0 -26
  147. package/build/ox_modules/module-web/commands/getValue.js +0 -43
  148. package/build/ox_modules/module-web/commands/getWindowHandles.js +0 -26
  149. package/build/ox_modules/module-web/commands/getWindowSize.js +0 -26
  150. package/build/ox_modules/module-web/commands/getXMLPageSource.js +0 -51
  151. package/build/ox_modules/module-web/commands/index.js +0 -634
  152. package/build/ox_modules/module-web/commands/isAlertPresent.js +0 -31
  153. package/build/ox_modules/module-web/commands/isChecked.js +0 -30
  154. package/build/ox_modules/module-web/commands/isExist.js +0 -36
  155. package/build/ox_modules/module-web/commands/isSelected.js +0 -35
  156. package/build/ox_modules/module-web/commands/isVisible.js +0 -36
  157. package/build/ox_modules/module-web/commands/makeVisible.js +0 -74
  158. package/build/ox_modules/module-web/commands/maximizeWindow.js +0 -24
  159. package/build/ox_modules/module-web/commands/minimizeWindow.js +0 -24
  160. package/build/ox_modules/module-web/commands/newWindow.js +0 -27
  161. package/build/ox_modules/module-web/commands/open.js +0 -42
  162. package/build/ox_modules/module-web/commands/pause.js +0 -26
  163. package/build/ox_modules/module-web/commands/point.js +0 -37
  164. package/build/ox_modules/module-web/commands/pointJS.js +0 -56
  165. package/build/ox_modules/module-web/commands/refresh.js +0 -26
  166. package/build/ox_modules/module-web/commands/rightClick.js +0 -61
  167. package/build/ox_modules/module-web/commands/rightClickActions.js +0 -57
  168. package/build/ox_modules/module-web/commands/scrollToElement.js +0 -33
  169. package/build/ox_modules/module-web/commands/select.js +0 -55
  170. package/build/ox_modules/module-web/commands/selectFrame.js +0 -52
  171. package/build/ox_modules/module-web/commands/selectWindow.js +0 -148
  172. package/build/ox_modules/module-web/commands/sendKeys.js +0 -56
  173. package/build/ox_modules/module-web/commands/setAutoWaitForAngular.js +0 -33
  174. package/build/ox_modules/module-web/commands/setTimeout.js +0 -33
  175. package/build/ox_modules/module-web/commands/setWindowSize.js +0 -29
  176. package/build/ox_modules/module-web/commands/takeScreenshot.js +0 -37
  177. package/build/ox_modules/module-web/commands/type.js +0 -52
  178. package/build/ox_modules/module-web/commands/waitForAngular.js +0 -83
  179. package/build/ox_modules/module-web/commands/waitForExist.js +0 -28
  180. package/build/ox_modules/module-web/commands/waitForInteractable.js +0 -31
  181. package/build/ox_modules/module-web/commands/waitForNotExist.js +0 -57
  182. package/build/ox_modules/module-web/commands/waitForNotText.js +0 -45
  183. package/build/ox_modules/module-web/commands/waitForNotValue.js +0 -45
  184. package/build/ox_modules/module-web/commands/waitForText.js +0 -45
  185. package/build/ox_modules/module-web/commands/waitForValue.js +0 -45
  186. package/build/ox_modules/module-web/commands/waitForVisible.js +0 -28
  187. package/build/ox_modules/module-web/commands/waitForWindow.js +0 -118
  188. package/build/ox_modules/module-web.js +0 -909
  189. package/build/ox_modules/module-win/commands/assertText.js +0 -41
  190. package/build/ox_modules/module-win/commands/assertTitle.js +0 -38
  191. package/build/ox_modules/module-win/commands/assertValue.js +0 -62
  192. package/build/ox_modules/module-win/commands/back.js +0 -21
  193. package/build/ox_modules/module-win/commands/clear.js +0 -34
  194. package/build/ox_modules/module-win/commands/click.js +0 -25
  195. package/build/ox_modules/module-win/commands/clickLong.js +0 -30
  196. package/build/ox_modules/module-win/commands/clickMultipleTimes.js +0 -33
  197. package/build/ox_modules/module-win/commands/findElement.js +0 -31
  198. package/build/ox_modules/module-win/commands/findElements.js +0 -31
  199. package/build/ox_modules/module-win/commands/getAppiumLogs.js +0 -22
  200. package/build/ox_modules/module-win/commands/getCurrentWindowHandle.js +0 -25
  201. package/build/ox_modules/module-win/commands/getLocation.js +0 -26
  202. package/build/ox_modules/module-win/commands/getSource.js +0 -22
  203. package/build/ox_modules/module-win/commands/getText.js +0 -32
  204. package/build/ox_modules/module-win/commands/getValue.js +0 -46
  205. package/build/ox_modules/module-win/commands/getWindowHandles.js +0 -25
  206. package/build/ox_modules/module-win/commands/index.js +0 -298
  207. package/build/ox_modules/module-win/commands/isCheckable.js +0 -26
  208. package/build/ox_modules/module-win/commands/isChecked.js +0 -26
  209. package/build/ox_modules/module-win/commands/isClickable.js +0 -26
  210. package/build/ox_modules/module-win/commands/isExist.js +0 -32
  211. package/build/ox_modules/module-win/commands/isSelected.js +0 -26
  212. package/build/ox_modules/module-win/commands/isVisible.js +0 -32
  213. package/build/ox_modules/module-win/commands/open.js +0 -24
  214. package/build/ox_modules/module-win/commands/pause.js +0 -23
  215. package/build/ox_modules/module-win/commands/rightClick.js +0 -30
  216. package/build/ox_modules/module-win/commands/selectWindow.js +0 -97
  217. package/build/ox_modules/module-win/commands/sendKeys.js +0 -50
  218. package/build/ox_modules/module-win/commands/setTimeout.js +0 -29
  219. package/build/ox_modules/module-win/commands/takeScreenshot.js +0 -26
  220. package/build/ox_modules/module-win/commands/tap.js +0 -29
  221. package/build/ox_modules/module-win/commands/type.js +0 -38
  222. package/build/ox_modules/module-win/commands/waitForExist.js +0 -25
  223. package/build/ox_modules/module-win/commands/waitForInteractable.js +0 -43
  224. package/build/ox_modules/module-win/commands/waitForVisible.js +0 -24
  225. package/build/ox_modules/module-win.js +0 -367
  226. package/build/ox_services/service-devtools/submodule-network.js +0 -338
  227. package/build/ox_services/service-devtools.js +0 -83
  228. package/build/runners/cucumber/CucumberEventListener.js +0 -181
  229. package/build/runners/cucumber/CucumberReporter.js +0 -277
  230. package/build/runners/cucumber/CucumberWorker.js +0 -337
  231. package/build/runners/cucumber/index.js +0 -159
  232. package/build/runners/cucumber/worker.js +0 -184
@@ -0,0 +1,333 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = void 0;
7
+
8
+ require("source-map-support/register");
9
+
10
+ var Runners = _interopRequireWildcard(require("../runners"));
11
+
12
+ var _parallelLimit = _interopRequireDefault(require("async/parallelLimit"));
13
+
14
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
15
+
16
+ function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
17
+
18
+ function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
19
+
20
+ var Duration = require('duration');
21
+
22
+ const PARALLEL_COUNT = 50;
23
+
24
+ class ParallelLauncher {
25
+ constructor(config, reporter) {
26
+ this._config = config;
27
+ this.reporter = reporter;
28
+ this._queue = null;
29
+ this._activeThreads = 0;
30
+ this.runners = [];
31
+ this.createdRunnersStat = [];
32
+ }
33
+
34
+ async run(capsSet) {
35
+ const collection = [];
36
+
37
+ if (!this._config.parallel) {
38
+ throw new Error('Cannot start the parallel testing - "parallel" settings are missing.');
39
+ }
40
+
41
+ const concurrency = !isNaN(this._config.parallel.concurrency) ? this._config.parallel.concurrency : 1;
42
+ const suites = this._config.suites;
43
+
44
+ if (!suites || !Array.isArray(suites)) {
45
+ throw new Error('Cannot start the parallel testing - no suites are defined.');
46
+ }
47
+
48
+ let workersConfig = [];
49
+ const testCaps = capsSet ? Array.isArray(capsSet) ? capsSet[0] : capsSet : null;
50
+ let suiteIndex = 0;
51
+ suites.forEach(suiteDef => {
52
+ const suiteKey = suiteDef.key || suiteDef.id || suiteDef.name;
53
+
54
+ if (concurrency == 0) {
55
+ if (suiteDef.paramManager) {
56
+ for (let i = 0; i < suiteDef.paramManager.rows; i++) {
57
+ const mockParamManager = new ParamManagerMock(suiteDef.paramManager.getValues());
58
+ suiteDef.paramManager.readNext();
59
+ const workerId = `${suiteKey}-${suiteIndex}/${i}`;
60
+ const suiteCopy = { ...suiteDef,
61
+ iterationCount: 1,
62
+ paramManager: mockParamManager
63
+ };
64
+ const testConfig = { ...this._config,
65
+ suites: [suiteCopy],
66
+ _groupResult: {
67
+ suiteKey: suiteKey,
68
+ _meta: {
69
+ suiteIterationNum: i + 1
70
+ }
71
+ }
72
+ };
73
+ workersConfig.push({
74
+ workerId,
75
+ testConfig,
76
+ testCaps,
77
+ startupDelay: 200
78
+ });
79
+ const self = this;
80
+ collection.push(function (callback) {
81
+ const cb = error => {
82
+ if (error) {
83
+ callback(error, null);
84
+ }
85
+ };
86
+
87
+ self._launchTest({
88
+ workerId,
89
+ testConfig,
90
+ testCaps,
91
+ startupDelay: 200
92
+ }, cb).then(result => {
93
+ callback(null, result);
94
+ }).catch(error => {
95
+ callback(error, null);
96
+ });
97
+ });
98
+ }
99
+ } else {
100
+ const workerId = `${suiteKey}-${suiteIndex}`;
101
+ const suiteCopy = { ...suiteDef,
102
+ iterationCount: 1
103
+ };
104
+ const testConfig = { ...this._config,
105
+ suites: [suiteCopy],
106
+ _groupResult: {
107
+ suiteKey: suiteKey,
108
+ _meta: {
109
+ suiteIterationNum: 1
110
+ }
111
+ }
112
+ };
113
+ workersConfig.push({
114
+ workerId,
115
+ testConfig,
116
+ testCaps,
117
+ startupDelay: 200
118
+ });
119
+ const self = this;
120
+ collection.push(function (callback) {
121
+ const cb = error => {
122
+ if (error) {
123
+ callback(error, null);
124
+ }
125
+ };
126
+
127
+ self._launchTest({
128
+ workerId,
129
+ testConfig,
130
+ testCaps,
131
+ startupDelay: 200
132
+ }, cb).then(result => {
133
+ callback(null, result);
134
+ }).catch(error => {
135
+ callback(error, null);
136
+ });
137
+ });
138
+ }
139
+ } else if (concurrency == 0 && Array.isArray(suiteDef.cases)) {
140
+ let caseIndex = 0;
141
+ suiteDef.cases.forEach(caseDef => {
142
+ const caseKey = caseDef.key || caseDef.id || caseDef.name;
143
+
144
+ if (caseDef.paramManager) {
145
+ for (let i = 0; i < caseDef.paramManager.rows; i++) {
146
+ const mockParamManager = new ParamManagerMock(caseDef.paramManager.getValues());
147
+ caseDef.paramManager.readNext();
148
+ const workerId = `${caseKey}-${suiteIndex}/${caseIndex}/${i}`;
149
+ const caseCopy = { ...caseDef,
150
+ iterationCount: 1,
151
+ paramManager: mockParamManager
152
+ };
153
+ const suiteCopy = { ...suiteDef,
154
+ cases: [caseCopy]
155
+ };
156
+ const testConfig = { ...this._config,
157
+ suites: [suiteCopy],
158
+ _groupResult: {
159
+ suiteKey: suiteKey,
160
+ caseKey: caseKey,
161
+ _meta: {
162
+ caseIterationNum: i + 1
163
+ }
164
+ }
165
+ };
166
+ workersConfig.push({
167
+ workerId,
168
+ testConfig,
169
+ testCaps,
170
+ startupDelay: 0
171
+ });
172
+ }
173
+ } else {
174
+ const workerId = `${caseKey}-${suiteIndex}/${caseIndex}`;
175
+ const suiteCopy = { ...suiteDef,
176
+ cases: [caseDef]
177
+ };
178
+ const testConfig = { ...this._config,
179
+ suites: [suiteCopy]
180
+ };
181
+ workersConfig.push({
182
+ workerId,
183
+ testConfig,
184
+ testCaps,
185
+ startupDelay: 0
186
+ });
187
+ }
188
+
189
+ caseIndex++;
190
+ });
191
+ } else {
192
+ const suiteKey = suiteDef.key || suiteDef.id || suiteDef.name;
193
+ const workerId = `${suiteKey}-${suiteIndex}`;
194
+ const testConfig = { ...this._config,
195
+ suites: [suiteDef]
196
+ };
197
+ workersConfig.push({
198
+ workerId,
199
+ testConfig,
200
+ testCaps,
201
+ startupDelay: 0
202
+ });
203
+ }
204
+
205
+ suiteIndex++;
206
+ });
207
+ this.reporter.onBeforeStart(collection.length);
208
+ console.log('Collections length', collection.length);
209
+ const start = new Date();
210
+ await (0, _parallelLimit.default)(collection, PARALLEL_COUNT);
211
+ let total = 0;
212
+ console.log('Created Runners Stat', this.createdRunnersStat);
213
+ const runnersIds = Object.keys(this.createdRunnersStat);
214
+ console.log('Created Runners count', runnersIds.length);
215
+ runnersIds.map(item => {
216
+ const cazes = this.createdRunnersStat[item].length;
217
+ total += cazes;
218
+ console.log('Runner', item, ' run ', cazes, ' cases');
219
+ });
220
+ console.log('Parallel count', PARALLEL_COUNT);
221
+ console.log('Total: ', total);
222
+ const end = new Date();
223
+ const duration = new Duration(start, end);
224
+ console.log('Duration: ', duration.toString(1));
225
+ this.reporter.onAfterEnd();
226
+ }
227
+
228
+ _instantiateRunner() {
229
+ if (this._config.framework && typeof this._config.framework === 'string') {
230
+ if (Object.prototype.hasOwnProperty.call(Runners, this._config.framework)) {
231
+ return new Runners[this._config.framework]();
232
+ }
233
+
234
+ return null;
235
+ }
236
+
237
+ return new Runners.oxygen();
238
+ }
239
+
240
+ async _launchTest({
241
+ workerId,
242
+ testConfig,
243
+ testCaps,
244
+ startupDelay
245
+ }, callback) {
246
+ if (!callback) {
247
+ return;
248
+ }
249
+
250
+ await this._sleep(startupDelay);
251
+ this._activeThreads++;
252
+ let runner;
253
+
254
+ if (PARALLEL_COUNT <= this.runners.length) {
255
+ runner = this.runners.shift();
256
+ let arr = this.createdRunnersStat[runner._id];
257
+ let newArray;
258
+
259
+ if (Array.isArray(arr)) {
260
+ newArray = [...arr, workerId];
261
+ } else {
262
+ newArray = [workerId];
263
+ }
264
+
265
+ this.createdRunnersStat[runner._id] = newArray;
266
+ } else {
267
+ runner = this._instantiateRunner();
268
+ this.createdRunnersStat[runner._id] = [workerId];
269
+ }
270
+
271
+ if (!runner) {
272
+ const framework = this._config.framework;
273
+ callback(new Error(`Cannot find runner for the specified framework: ${framework}.`));
274
+ return;
275
+ }
276
+
277
+ try {
278
+ await runner.init(testConfig, testCaps, this.reporter);
279
+ const result = await runner.run();
280
+ await runner.dispose(result.status || null);
281
+ callback();
282
+ } catch (e) {
283
+ console.error('Failed to launch the test:', e);
284
+
285
+ if (this._queue) {
286
+ this._queue.kill();
287
+ }
288
+
289
+ if (e.error) {
290
+ var errMsg = '';
291
+ var err = e.error;
292
+ if (err.type) errMsg += err.type + ' - ';
293
+ if (err.message) errMsg += err.message;else errMsg = err.toString();
294
+ callback(new Error(errMsg));
295
+ } else {
296
+ callback(e);
297
+ }
298
+ }
299
+
300
+ this.runners.push(runner);
301
+ }
302
+
303
+ _sleep(duration) {
304
+ return new Promise(resolve => setTimeout(resolve, duration));
305
+ }
306
+
307
+ }
308
+
309
+ exports.default = ParallelLauncher;
310
+
311
+ class ParamManagerMock {
312
+ constructor(values) {
313
+ this.values = values;
314
+ }
315
+
316
+ init() {}
317
+
318
+ getMode() {}
319
+
320
+ readNext() {}
321
+
322
+ readPrev() {}
323
+
324
+ getValues() {
325
+ return this.values;
326
+ }
327
+
328
+ get rows() {
329
+ return 1;
330
+ }
331
+
332
+ }
333
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9saWIvcGFyYWxsZWwtbGF1bmNoZXIuanMiXSwibmFtZXMiOlsiRHVyYXRpb24iLCJyZXF1aXJlIiwiUEFSQUxMRUxfQ09VTlQiLCJQYXJhbGxlbExhdW5jaGVyIiwiY29uc3RydWN0b3IiLCJjb25maWciLCJyZXBvcnRlciIsIl9jb25maWciLCJfcXVldWUiLCJfYWN0aXZlVGhyZWFkcyIsInJ1bm5lcnMiLCJjcmVhdGVkUnVubmVyc1N0YXQiLCJydW4iLCJjYXBzU2V0IiwiY29sbGVjdGlvbiIsInBhcmFsbGVsIiwiRXJyb3IiLCJjb25jdXJyZW5jeSIsImlzTmFOIiwic3VpdGVzIiwiQXJyYXkiLCJpc0FycmF5Iiwid29ya2Vyc0NvbmZpZyIsInRlc3RDYXBzIiwic3VpdGVJbmRleCIsImZvckVhY2giLCJzdWl0ZURlZiIsInN1aXRlS2V5Iiwia2V5IiwiaWQiLCJuYW1lIiwicGFyYW1NYW5hZ2VyIiwiaSIsInJvd3MiLCJtb2NrUGFyYW1NYW5hZ2VyIiwiUGFyYW1NYW5hZ2VyTW9jayIsImdldFZhbHVlcyIsInJlYWROZXh0Iiwid29ya2VySWQiLCJzdWl0ZUNvcHkiLCJpdGVyYXRpb25Db3VudCIsInRlc3RDb25maWciLCJfZ3JvdXBSZXN1bHQiLCJfbWV0YSIsInN1aXRlSXRlcmF0aW9uTnVtIiwicHVzaCIsInN0YXJ0dXBEZWxheSIsInNlbGYiLCJjYWxsYmFjayIsImNiIiwiZXJyb3IiLCJfbGF1bmNoVGVzdCIsInRoZW4iLCJyZXN1bHQiLCJjYXRjaCIsImNhc2VzIiwiY2FzZUluZGV4IiwiY2FzZURlZiIsImNhc2VLZXkiLCJjYXNlQ29weSIsImNhc2VJdGVyYXRpb25OdW0iLCJvbkJlZm9yZVN0YXJ0IiwibGVuZ3RoIiwiY29uc29sZSIsImxvZyIsInN0YXJ0IiwiRGF0ZSIsInRvdGFsIiwicnVubmVyc0lkcyIsIk9iamVjdCIsImtleXMiLCJtYXAiLCJpdGVtIiwiY2F6ZXMiLCJlbmQiLCJkdXJhdGlvbiIsInRvU3RyaW5nIiwib25BZnRlckVuZCIsIl9pbnN0YW50aWF0ZVJ1bm5lciIsImZyYW1ld29yayIsInByb3RvdHlwZSIsImhhc093blByb3BlcnR5IiwiY2FsbCIsIlJ1bm5lcnMiLCJveHlnZW4iLCJfc2xlZXAiLCJydW5uZXIiLCJzaGlmdCIsImFyciIsIl9pZCIsIm5ld0FycmF5IiwiaW5pdCIsImRpc3Bvc2UiLCJzdGF0dXMiLCJlIiwia2lsbCIsImVyck1zZyIsImVyciIsInR5cGUiLCJtZXNzYWdlIiwiUHJvbWlzZSIsInJlc29sdmUiLCJzZXRUaW1lb3V0IiwidmFsdWVzIiwiZ2V0TW9kZSIsInJlYWRQcmV2Il0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7QUFVQTs7QUFFQTs7Ozs7Ozs7QUFHQSxJQUFJQSxRQUFRLEdBQUdDLE9BQU8sQ0FBQyxVQUFELENBQXRCOztBQUlBLE1BQU1DLGNBQWMsR0FBRyxFQUF2Qjs7QUFFZSxNQUFNQyxnQkFBTixDQUF1QjtBQUNsQ0MsRUFBQUEsV0FBVyxDQUFDQyxNQUFELEVBQVNDLFFBQVQsRUFBbUI7QUFDMUIsU0FBS0MsT0FBTCxHQUFlRixNQUFmO0FBQ0EsU0FBS0MsUUFBTCxHQUFnQkEsUUFBaEI7QUFDQSxTQUFLRSxNQUFMLEdBQWMsSUFBZDtBQUNBLFNBQUtDLGNBQUwsR0FBc0IsQ0FBdEI7QUFDQSxTQUFLQyxPQUFMLEdBQWUsRUFBZjtBQUNBLFNBQUtDLGtCQUFMLEdBQTBCLEVBQTFCO0FBQ0g7O0FBRVEsUUFBSEMsR0FBRyxDQUFDQyxPQUFELEVBQVU7QUFDZixVQUFNQyxVQUFVLEdBQUcsRUFBbkI7O0FBSUEsUUFBSSxDQUFDLEtBQUtQLE9BQUwsQ0FBYVEsUUFBbEIsRUFBNEI7QUFDeEIsWUFBTSxJQUFJQyxLQUFKLENBQVUsc0VBQVYsQ0FBTjtBQUNIOztBQUNELFVBQU1DLFdBQVcsR0FBRyxDQUFDQyxLQUFLLENBQUMsS0FBS1gsT0FBTCxDQUFhUSxRQUFiLENBQXNCRSxXQUF2QixDQUFOLEdBQTRDLEtBQUtWLE9BQUwsQ0FBYVEsUUFBYixDQUFzQkUsV0FB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RyxDQUVOOztBQUVEYSxFQUFBQSxPQUFPLEdBQUcsQ0FFVDs7QUFFRG5FLEVBQUFBLFFBQVEsR0FBRyxDQUVWOztBQUVEb0UsRUFBQUEsUUFBUSxHQUFHLENBRVY7O0FBRURyRSxFQUFBQSxTQUFTLEdBQUc7QUFDUixXQUFPLEtBQUttRSxNQUFaO0FBQ0g7O0FBRU8sTUFBSnRFLElBQUksR0FBRztBQUNQLFdBQU8sQ0FBUDtBQUNIOztBQTNCa0IiLCJzb3VyY2VzQ29udGVudCI6WyIvKlxyXG4gKiBDb3B5cmlnaHQgKEMpIDIwMTUtcHJlc2VudCBDbG91ZEJlYXQgTGltaXRlZFxyXG4gKlxyXG4gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeVxyXG4gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieVxyXG4gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvclxyXG4gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLlxyXG4gKi9cclxuXHJcbi8vIGltcG9ydCBfIGZyb20gJ2xvZGFzaCc7XHJcbmltcG9ydCAqIGFzIFJ1bm5lcnMgZnJvbSAnLi4vcnVubmVycyc7XHJcbi8vIGltcG9ydCBxdWV1ZSBmcm9tICdhc3luYy9xdWV1ZSc7XHJcbmltcG9ydCBwYXJhbGxlbExpbWl0IGZyb20gJ2FzeW5jL3BhcmFsbGVsTGltaXQnO1xyXG4vLyBpbXBvcnQgeyBwYXJzZVVybEVuY29kZWQgfSBmcm9tICdjaHJvbWUtaGFyL2xpYi91dGlsJztcclxuLy8gaW1wb3J0IG94dXRpbCBmcm9tICcuL3V0aWwnO1xyXG52YXIgRHVyYXRpb24gPSByZXF1aXJlKCdkdXJhdGlvbicpO1xyXG4vLyBjb25zdCBTQ09QRV9TVUlURSA9ICdzdWl0ZSc7XHJcbi8vIGNvbnN0IFNDT1BFX0NBU0UgPSAnY2FzZSc7XHJcblxyXG5jb25zdCBQQVJBTExFTF9DT1VOVCA9IDUwO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUGFyYWxsZWxMYXVuY2hlciB7XHJcbiAgICBjb25zdHJ1Y3Rvcihjb25maWcsIHJlcG9ydGVyKSB7XHJcbiAgICAgICAgdGhpcy5fY29uZmlnID0gY29uZmlnO1xyXG4gICAgICAgIHRoaXMucmVwb3J0ZXIgPSByZXBvcnRlcjtcclxuICAgICAgICB0aGlzLl9xdWV1ZSA9IG51bGw7XHJcbiAgICAgICAgdGhpcy5fYWN0aXZlVGhyZWFkcyA9IDA7XHJcbiAgICAgICAgdGhpcy5ydW5uZXJzID0gW107XHJcbiAgICAgICAgdGhpcy5jcmVhdGVkUnVubmVyc1N0YXQgPSBbXTtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBydW4oY2Fwc1NldCkge1xyXG4gICAgICAgIGNvbnN0IGNvbGxlY3Rpb24gPSBbXTtcclxuICAgICAgICAvLyBjb25zb2xlLmxvZygnfn50aGlzLl9jb25maWcnLCBKU09OLnN0cmluZ2lmeSh0aGlzLl9jb25maWcsIG51bGwsIDIpKTtcclxuICAgICAgICAvLyBjb25zb2xlLmxvZygnfn5jYXBzU2V0JywgY2Fwc1NldCk7XHJcblxyXG4gICAgICAgIGlmICghdGhpcy5fY29uZmlnLnBhcmFsbGVsKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IHN0YXJ0IHRoZSBwYXJhbGxlbCB0ZXN0aW5nIC0gXCJwYXJhbGxlbFwiIHNldHRpbmdzIGFyZSBtaXNzaW5nLicpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBjb25jdXJyZW5jeSA9ICFpc05hTih0aGlzLl9jb25maWcucGFyYWxsZWwuY29uY3VycmVuY3kpID8gdGhpcy5fY29uZmlnLnBhcmFsbGVsLmNvbmN1cnJlbmN5IDogMTtcclxuICAgICAgICAvLyBjb25zdCBzY29wZSA9IHRoaXMuX2NvbmZpZy5wYXJhbGxlbC5zY29wZTtcclxuICAgICAgICAvLyBmbGF0dGVuIGFsbCBzdWl0ZXMgYW5kIGNyZWF0ZSBvbmUgdW5pZmllZCBhcnJheSBvZiBhbGwgdGhlIHRlc3QgY2FzZXNcclxuICAgICAgICBjb25zdCBzdWl0ZXMgPSB0aGlzLl9jb25maWcuc3VpdGVzO1xyXG4gICAgICAgIGlmICghc3VpdGVzIHx8ICFBcnJheS5pc0FycmF5KHN1aXRlcykpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdDYW5ub3Qgc3RhcnQgdGhlIHBhcmFsbGVsIHRlc3RpbmcgLSBubyBzdWl0ZXMgYXJlIGRlZmluZWQuJyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGxldCB3b3JrZXJzQ29uZmlnID0gW107XHJcbiAgICAgICAgLy8gbGV0IHdvcmtlcnNDb3VudCA9IGNvbmN1cnJlbmN5O1xyXG4gICAgICAgIC8vIGlmIG5vIGNhcGFiaWxpdGllcyBhcmUgc3BlY2lmaWVkLCBydW4gc2luZ2xlIGluc3RhbmNlIHdpdGggZGVmYXVsdCBhcmd1bWVudHNcclxuICAgICAgICAvLyBhbHRlcm5hdGl2ZWx5LCBwaWNrIHRoZSBmaXJzdCBjYXBhYmlsaXRpZXMgc2V0IChsb2FkIHRlc3QgaXMgbGltaXRlZCB0byBhIHNpbmdsZSBicm93c2VyIHR5cGUpXHJcbiAgICAgICAgY29uc3QgdGVzdENhcHMgPSBjYXBzU2V0ID8gKEFycmF5LmlzQXJyYXkoY2Fwc1NldCkgPyBjYXBzU2V0WzBdIDogY2Fwc1NldCkgOiBudWxsO1xyXG4gICAgICAgIC8vIGlmIGNvbmN1cnJlbmN5IHNldCB0byBtYXggYW5kIHBhcmFtZXRlciBmaWxlIGlzIGRlZmluZWQsIFxyXG4gICAgICAgIC8vIHRoZW4gcnVuIGFzIG1hbnkgcGFyYWxsZWwgdGVzdHMgYXMgcm93cyBpbiB0aGUgZmlsZVxyXG4gICAgICAgIGxldCBzdWl0ZUluZGV4ID0gMDtcclxuXHJcbiAgICAgICAgc3VpdGVzLmZvckVhY2goc3VpdGVEZWYgPT4ge1xyXG5cclxuICAgICAgICAgICAgLy8gY29uc29sZS5sb2coJ35+c3VpdGVEZWYnLCBzdWl0ZURlZik7XHJcbiAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKCd+fnN1aXRlRGVmLnBhcmFtTWFuYWdlcicsIHN1aXRlRGVmLnBhcmFtTWFuYWdlcik7XHJcbiAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKCd+fmNvbmN1cnJlbmN5JywgY29uY3VycmVuY3kpO1xyXG5cclxuICAgICAgICAgICAgY29uc3Qgc3VpdGVLZXkgPSBzdWl0ZURlZi5rZXkgfHwgc3VpdGVEZWYuaWQgfHwgc3VpdGVEZWYubmFtZTtcclxuICAgICAgICAgICAgaWYgKGNvbmN1cnJlbmN5ID09IDApIHtcclxuICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKCd+fmlmJyk7XHJcbiAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZygnfn5zdWl0ZURlZi5wYXJhbU1hbmFnZXIucm93cycsIHN1aXRlRGVmLnBhcmFtTWFuYWdlci5yb3dzKTtcclxuICAgICAgICAgICAgICAgIGlmIChzdWl0ZURlZi5wYXJhbU1hbmFnZXIpIHtcclxuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHN1aXRlRGVmLnBhcmFtTWFuYWdlci5yb3dzOyBpKyspIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbW9ja1BhcmFtTWFuYWdlciA9IG5ldyBQYXJhbU1hbmFnZXJNb2NrKHN1aXRlRGVmLnBhcmFtTWFuYWdlci5nZXRWYWx1ZXMoKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHN1aXRlRGVmLnBhcmFtTWFuYWdlci5yZWFkTmV4dCgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB3b3JrZXJJZCA9IGAke3N1aXRlS2V5fS0ke3N1aXRlSW5kZXh9LyR7aX1gO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdWl0ZUNvcHkgPSB7IC4uLnN1aXRlRGVmLCBpdGVyYXRpb25Db3VudDogMSwgcGFyYW1NYW5hZ2VyOiBtb2NrUGFyYW1NYW5hZ2VyIH07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHRlc3RDb25maWcgPSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi50aGlzLl9jb25maWcsIHN1aXRlczogWyBzdWl0ZUNvcHkgXSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9ncm91cFJlc3VsdDoge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1aXRlS2V5OiBzdWl0ZUtleSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfbWV0YTogeyBzdWl0ZUl0ZXJhdGlvbk51bTogaSArIDEgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB3b3JrZXJzQ29uZmlnLnB1c2goeyB3b3JrZXJJZCwgdGVzdENvbmZpZywgdGVzdENhcHMsIHN0YXJ0dXBEZWxheTogMjAwIH0pO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2VsZiA9IHRoaXM7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbGxlY3Rpb24ucHVzaChmdW5jdGlvbihjYWxsYmFjaykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2IgPSAoZXJyb3IpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXJyb3IpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coJ35+Y2IgZXJyb3InLCBlcnJvcik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKGVycm9yLCBudWxsKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fbGF1bmNoVGVzdCh7IHdvcmtlcklkLCB0ZXN0Q29uZmlnLCB0ZXN0Q2Fwcywgc3RhcnR1cERlbGF5OiAyMDAgfSwgY2IpLnRoZW4oKHJlc3VsdCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKG51bGwsIHJlc3VsdCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KS5jYXRjaChlcnJvciA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soZXJyb3IsIG51bGwpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gd29ya2Vyc0NvdW50Kys7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCB3b3JrZXJJZCA9IGAke3N1aXRlS2V5fS0ke3N1aXRlSW5kZXh9YDtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBzdWl0ZUNvcHkgPSB7IC4uLnN1aXRlRGVmLCBpdGVyYXRpb25Db3VudDogMSB9O1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHRlc3RDb25maWcgPSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC4uLnRoaXMuX2NvbmZpZywgc3VpdGVzOiBbIHN1aXRlQ29weSBdLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBfZ3JvdXBSZXN1bHQ6IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1aXRlS2V5OiBzdWl0ZUtleSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9tZXRhOiB7IHN1aXRlSXRlcmF0aW9uTnVtOiAxIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgICAgICAgICAgd29ya2Vyc0NvbmZpZy5wdXNoKHsgd29ya2VySWQsIHRlc3RDb25maWcsIHRlc3RDYXBzLCBzdGFydHVwRGVsYXk6IDIwMCB9KTtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBzZWxmID0gdGhpcztcclxuICAgICAgICAgICAgICAgICAgICBjb2xsZWN0aW9uLnB1c2goZnVuY3Rpb24oY2FsbGJhY2spIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2IgPSAoZXJyb3IpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlcnJvcikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKCd+fmNiIGVycm9yJywgZXJyb3IpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKGVycm9yLCBudWxsKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fbGF1bmNoVGVzdCh7IHdvcmtlcklkLCB0ZXN0Q29uZmlnLCB0ZXN0Q2Fwcywgc3RhcnR1cERlbGF5OiAyMDAgfSwgY2IpLnRoZW4oKHJlc3VsdCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2sobnVsbCwgcmVzdWx0KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSkuY2F0Y2goZXJyb3IgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soZXJyb3IsIG51bGwpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAvLyBjaGVjayBpZiBhbnkgb2YgY2FzZXMgaGF2ZSBwYXJhbSBmaWxlIGF0dGFjaGVkXHJcbiAgICAgICAgICAgIGVsc2UgaWYgKGNvbmN1cnJlbmN5ID09IDAgJiYgQXJyYXkuaXNBcnJheShzdWl0ZURlZi5jYXNlcykpIHtcclxuICAgICAgICAgICAgICAgIGxldCBjYXNlSW5kZXggPSAwO1xyXG4gICAgICAgICAgICAgICAgc3VpdGVEZWYuY2FzZXMuZm9yRWFjaChjYXNlRGVmID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBjYXNlS2V5ID0gY2FzZURlZi5rZXkgfHwgY2FzZURlZi5pZCB8fCBjYXNlRGVmLm5hbWU7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNhc2VEZWYucGFyYW1NYW5hZ2VyKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vd29ya2Vyc0NvdW50ICs9IGNhc2VEZWYucGFyYW1NYW5hZ2VyLnJvd3M7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY2FzZURlZi5wYXJhbU1hbmFnZXIucm93czsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBtb2NrUGFyYW1NYW5hZ2VyID0gbmV3IFBhcmFtTWFuYWdlck1vY2soY2FzZURlZi5wYXJhbU1hbmFnZXIuZ2V0VmFsdWVzKCkpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZURlZi5wYXJhbU1hbmFnZXIucmVhZE5leHQoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHdvcmtlcklkID0gYCR7Y2FzZUtleX0tJHtzdWl0ZUluZGV4fS8ke2Nhc2VJbmRleH0vJHtpfWA7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjYXNlQ29weSA9IHsgLi4uY2FzZURlZiwgaXRlcmF0aW9uQ291bnQ6IDEsIHBhcmFtTWFuYWdlcjogbW9ja1BhcmFtTWFuYWdlciB9O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3VpdGVDb3B5ID0geyAuLi5zdWl0ZURlZiwgY2FzZXM6IFsgY2FzZUNvcHkgXX07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0ZXN0Q29uZmlnID0ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLnRoaXMuX2NvbmZpZywgc3VpdGVzOiBbIHN1aXRlQ29weSBdLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9ncm91cFJlc3VsdDoge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWl0ZUtleTogc3VpdGVLZXksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2VLZXk6IGNhc2VLZXksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9tZXRhOiB7IGNhc2VJdGVyYXRpb25OdW06IGkgKyAxIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgd29ya2Vyc0NvbmZpZy5wdXNoKHsgd29ya2VySWQsIHRlc3RDb25maWcsIHRlc3RDYXBzLCBzdGFydHVwRGVsYXk6IDAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3b3JrZXJzQ291bnQrKztcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgd29ya2VySWQgPSBgJHtjYXNlS2V5fS0ke3N1aXRlSW5kZXh9LyR7Y2FzZUluZGV4fWA7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN1aXRlQ29weSA9IHsgLi4uc3VpdGVEZWYsIGNhc2VzOiBbIGNhc2VEZWYgXX07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHRlc3RDb25maWcgPSB7IC4uLnRoaXMuX2NvbmZpZywgc3VpdGVzOiBbIHN1aXRlQ29weSBdIH07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtlcnNDb25maWcucHVzaCh7IHdvcmtlcklkLCB0ZXN0Q29uZmlnLCB0ZXN0Q2Fwcywgc3RhcnR1cERlbGF5OiAwIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB3b3JrZXJzQ291bnQrKztcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgY2FzZUluZGV4Kys7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIC8vIHdvcmtlcnNDb3VudCsrO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgY29uc3Qgc3VpdGVLZXkgPSBzdWl0ZURlZi5rZXkgfHwgc3VpdGVEZWYuaWQgfHwgc3VpdGVEZWYubmFtZTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHdvcmtlcklkID0gYCR7c3VpdGVLZXl9LSR7c3VpdGVJbmRleH1gO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgdGVzdENvbmZpZyA9IHsgLi4udGhpcy5fY29uZmlnLCBzdWl0ZXM6IFsgc3VpdGVEZWYgXSB9O1xyXG4gICAgICAgICAgICAgICAgd29ya2Vyc0NvbmZpZy5wdXNoKHsgd29ya2VySWQsIHRlc3RDb25maWcsIHRlc3RDYXBzLCBzdGFydHVwRGVsYXk6IDAgfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgc3VpdGVJbmRleCsrO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICAvLyBjb25zb2xlLmxvZygnd29ya2Vyc0NvbmZpZycsIEpTT04uc3RyaW5naWZ5KHdvcmtlcnNDb25maWcsIG51bGwsIDQpKTtcclxuXHJcbiAgICAgICAgLy8gY29uc29sZS5sb2coJ35+d29ya2Vyc0NvdW50Jywgd29ya2Vyc0NvdW50KTtcclxuXHJcbiAgICAgICAgLy8gdGhpcy5fcXVldWUgPSBxdWV1ZSgodGFzaywgY2IpID0+IHRoaXMuX2xhdW5jaFRlc3QodGFzaywgY2IpLCB3b3JrZXJzQ291bnQpO1xyXG4gICAgICAgIC8vIHRoaXMuX3F1ZXVlLmVycm9yKChlcnIsIHRhc2spID0+IHtcclxuICAgICAgICAvLyAgICAgY29uc29sZS5sb2coJ0Vycm9yIGluIHF1ZXVlOicsIGVycik7XHJcbiAgICAgICAgLy8gfSk7XHJcblxyXG4gICAgICAgIHRoaXMucmVwb3J0ZXIub25CZWZvcmVTdGFydChjb2xsZWN0aW9uLmxlbmd0aCk7XHJcblxyXG4gICAgICAgIGNvbnNvbGUubG9nKCdDb2xsZWN0aW9ucyBsZW5ndGgnLCBjb2xsZWN0aW9uLmxlbmd0aCk7XHJcblxyXG4gICAgICAgIGNvbnN0IHN0YXJ0ID0gbmV3IERhdGUoKTtcclxuICAgICAgICBhd2FpdCBwYXJhbGxlbExpbWl0KGNvbGxlY3Rpb24sIFBBUkFMTEVMX0NPVU5UKTtcclxuXHJcbiAgICAgICAgbGV0IHRvdGFsID0gMDtcclxuICAgICAgICBjb25zb2xlLmxvZygnQ3JlYXRlZCBSdW5uZXJzIFN0YXQnLCB0aGlzLmNyZWF0ZWRSdW5uZXJzU3RhdCk7XHJcbiAgICAgICAgY29uc3QgcnVubmVyc0lkcyA9IE9iamVjdC5rZXlzKHRoaXMuY3JlYXRlZFJ1bm5lcnNTdGF0KTtcclxuICAgICAgICBjb25zb2xlLmxvZygnQ3JlYXRlZCBSdW5uZXJzIGNvdW50JywgcnVubmVyc0lkcy5sZW5ndGgpO1xyXG5cclxuICAgICAgICBydW5uZXJzSWRzLm1hcCgoaXRlbSkgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBjYXplcyA9IHRoaXMuY3JlYXRlZFJ1bm5lcnNTdGF0W2l0ZW1dLmxlbmd0aDtcclxuICAgICAgICAgICAgdG90YWwgKz0gY2F6ZXM7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdSdW5uZXInLCBpdGVtLCAnIHJ1biAnLCBjYXplcywgJyBjYXNlcycpO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBjb25zb2xlLmxvZygnUGFyYWxsZWwgY291bnQnLCBQQVJBTExFTF9DT1VOVCk7XHJcbiAgICAgICAgY29uc29sZS5sb2coJ1RvdGFsOiAnLCB0b3RhbCk7XHJcbiAgICAgICAgY29uc3QgZW5kID0gbmV3IERhdGUoKTtcclxuICAgICAgICBjb25zdCBkdXJhdGlvbiA9IG5ldyBEdXJhdGlvbihzdGFydCwgZW5kKTtcclxuICAgICAgICBjb25zb2xlLmxvZygnRHVyYXRpb246ICcsIGR1cmF0aW9uLnRvU3RyaW5nKDEpKTtcclxuXHJcbiAgICAgICAgLy8gLy8gcHVzaCBhbGwgd29ya2VycyB0byB0aGUgcXVldWVcclxuICAgICAgICAvLyB3b3JrZXJzQ29uZmlnLmZvckVhY2god29ya2VyQ29uZmlnID0+IHRoaXMuX3F1ZXVlLnB1c2god29ya2VyQ29uZmlnKSk7XHJcblxyXG4gICAgICAgIC8vIGF3YWl0IHRoaXMuX3F1ZXVlLmRyYWluKCk7XHJcblxyXG4gICAgICAgIHRoaXMucmVwb3J0ZXIub25BZnRlckVuZCgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcclxuICAgICAqIFByaXZhdGUgbWV0aG9kc1xyXG4gICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cclxuICAgIF9pbnN0YW50aWF0ZVJ1bm5lcigpIHtcclxuICAgICAgICBpZiAodGhpcy5fY29uZmlnLmZyYW1ld29yayAmJiB0eXBlb2YgdGhpcy5fY29uZmlnLmZyYW1ld29yayA9PT0gJ3N0cmluZycpIHtcclxuICAgICAgICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChSdW5uZXJzLCB0aGlzLl9jb25maWcuZnJhbWV3b3JrKSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBSdW5uZXJzW3RoaXMuX2NvbmZpZy5mcmFtZXdvcmtdKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBuZXcgUnVubmVycy5veHlnZW4oKTtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBfbGF1bmNoVGVzdCh7IHdvcmtlcklkLCB0ZXN0Q29uZmlnLCB0ZXN0Q2Fwcywgc3RhcnR1cERlbGF5IH0sIGNhbGxiYWNrKSB7XHJcbiAgICAgICAgLy8gY29uc29sZS5sb2coJ35+X2xhdW5jaFRlc3QnLCBhcmd1bWVudHMpO1xyXG4gICAgICAgIGlmICghY2FsbGJhY2spIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBhd2FpdCB0aGlzLl9zbGVlcChzdGFydHVwRGVsYXkpO1xyXG4gICAgICAgIHRoaXMuX2FjdGl2ZVRocmVhZHMrKztcclxuXHJcbiAgICAgICAgbGV0IHJ1bm5lcjtcclxuXHJcbiAgICAgICAgaWYgKFBBUkFMTEVMX0NPVU5UIDw9IHRoaXMucnVubmVycy5sZW5ndGgpIHtcclxuICAgICAgICAgICAgcnVubmVyID0gdGhpcy5ydW5uZXJzLnNoaWZ0KCk7XHJcblxyXG4gICAgICAgICAgICBsZXQgYXJyID0gdGhpcy5jcmVhdGVkUnVubmVyc1N0YXRbcnVubmVyLl9pZF07XHJcbiAgICAgICAgICAgIGxldCBuZXdBcnJheTtcclxuXHJcbiAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGFycikpIHtcclxuICAgICAgICAgICAgICAgIG5ld0FycmF5ID0gWy4uLmFyciwgd29ya2VySWRdO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgbmV3QXJyYXkgPSBbd29ya2VySWRdO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB0aGlzLmNyZWF0ZWRSdW5uZXJzU3RhdFtydW5uZXIuX2lkXSA9IG5ld0FycmF5O1xyXG5cclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBydW5uZXIgPSB0aGlzLl9pbnN0YW50aWF0ZVJ1bm5lcigpO1xyXG4gICAgICAgICAgICB0aGlzLmNyZWF0ZWRSdW5uZXJzU3RhdFtydW5uZXIuX2lkXSA9IFt3b3JrZXJJZF07XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoIXJ1bm5lcikge1xyXG4gICAgICAgICAgICBjb25zdCBmcmFtZXdvcmsgPSB0aGlzLl9jb25maWcuZnJhbWV3b3JrO1xyXG4gICAgICAgICAgICBjYWxsYmFjayhuZXcgRXJyb3IoYENhbm5vdCBmaW5kIHJ1bm5lciBmb3IgdGhlIHNwZWNpZmllZCBmcmFtZXdvcms6ICR7ZnJhbWV3b3JrfS5gKSk7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgLy8gZ2VuZXJhdGUgZmlyZWZveCBcInByb2ZpbGVcIiB2YWx1ZSBpZiBwcm9maWxlIG9wdGlvbnMgYXJlIHNwZWNpZmllZFxyXG4gICAgICAgICAgICAvL2F3YWl0IG94dXRpbC5nZW5lcmF0ZUZpcmVmb3hPcHRpb25zUHJvZmlsZSh0ZXN0Q2Fwcyk7XHJcbiAgICAgICAgICAgIC8vIGluaXRpYWxpemUgb3h5Z2VuXHJcblxyXG4gICAgICAgICAgICBhd2FpdCBydW5uZXIuaW5pdCh0ZXN0Q29uZmlnLCB0ZXN0Q2FwcywgdGhpcy5yZXBvcnRlcik7XHJcbiAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKCd+fmluaXRSdicsIGluaXRSdik7XHJcblxyXG4gICAgICAgICAgICAvLyBydW4gT3h5Z2VuIHRlc3QgXHJcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHJ1bm5lci5ydW4oKTtcclxuICAgICAgICAgICAgLy8gY29uc29sZS5sb2coJ35+cmVzdWx0JywgcmVzdWx0KTtcclxuXHJcbiAgICAgICAgICAgIGF3YWl0IHJ1bm5lci5kaXNwb3NlKHJlc3VsdC5zdGF0dXMgfHwgbnVsbCk7XHJcbiAgICAgICAgICAgIGNhbGxiYWNrKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0ZhaWxlZCB0byBsYXVuY2ggdGhlIHRlc3Q6JywgZSk7XHJcbiAgICAgICAgICAgIC8vIHN0b3AgcHJvY2Vzc2luZyB0aGUgcXVldWVcclxuICAgICAgICAgICAgaWYgKHRoaXMuX3F1ZXVlKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9xdWV1ZS5raWxsKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgLy8gaWYgdGhpcyBpcyBjdXN0b20gZXJyb3IgbWVzc2FnZVxyXG4gICAgICAgICAgICBpZiAoZS5lcnJvcikge1xyXG4gICAgICAgICAgICAgICAgdmFyIGVyck1zZyA9ICcnO1xyXG4gICAgICAgICAgICAgICAgdmFyIGVyciA9IGUuZXJyb3I7XHJcbiAgICAgICAgICAgICAgICBpZiAoZXJyLnR5cGUpXHJcbiAgICAgICAgICAgICAgICAgICAgZXJyTXNnICs9IGVyci50eXBlICsgJyAtICc7XHJcbiAgICAgICAgICAgICAgICBpZiAoZXJyLm1lc3NhZ2UpXHJcbiAgICAgICAgICAgICAgICAgICAgZXJyTXNnICs9IGVyci5tZXNzYWdlO1xyXG4gICAgICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICAgICAgICAgIGVyck1zZyA9IGVyci50b1N0cmluZygpO1xyXG4gICAgICAgICAgICAgICAgY2FsbGJhY2sobmV3IEVycm9yKGVyck1zZykpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgY2FsbGJhY2soZSk7ICAgIC8vIGNhbGwgYmFjayB3aXRoIHRoZSBvcmlnaW5hbCBleGNlcHRpb25cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5ydW5uZXJzLnB1c2gocnVubmVyKTtcclxuICAgIH1cclxuXHJcbiAgICBfc2xlZXAoZHVyYXRpb24pIHtcclxuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgZHVyYXRpb24pKTtcclxuICAgIH1cclxufVxyXG5cclxuY2xhc3MgUGFyYW1NYW5hZ2VyTW9jayB7XHJcbiAgICBjb25zdHJ1Y3Rvcih2YWx1ZXMpIHtcclxuICAgICAgICB0aGlzLnZhbHVlcyA9IHZhbHVlcztcclxuICAgIH1cclxuXHJcbiAgICBpbml0KCkge1xyXG5cclxuICAgIH1cclxuXHJcbiAgICBnZXRNb2RlKCkge1xyXG5cclxuICAgIH1cclxuXHJcbiAgICByZWFkTmV4dCgpIHtcclxuXHJcbiAgICB9XHJcblxyXG4gICAgcmVhZFByZXYoKSB7XHJcblxyXG4gICAgfVxyXG5cclxuICAgIGdldFZhbHVlcygpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy52YWx1ZXM7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IHJvd3MoKSB7XHJcbiAgICAgICAgcmV0dXJuIDE7XHJcbiAgICB9XHJcbn1cclxuIl19
@@ -1,37 +1,60 @@
1
1
  "use strict";
2
2
 
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = void 0;
7
+
3
8
  require("source-map-support/register");
4
9
 
5
10
  var _OxygenError = _interopRequireDefault(require("../errors/OxygenError"));
6
11
 
7
12
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
8
13
 
9
- module.exports = function (filePath, mode, fileType) {
10
- var defer = require('when').defer;
14
+ const path = require('path');
15
+
16
+ const ExcelReader = require('./param-reader-excel');
11
17
 
12
- var path = require('path');
18
+ const CsvReader = require('./param-reader-csv');
13
19
 
14
- var ExcelReader = require('./param-reader-excel');
20
+ const JsonReader = require('./param-reader-json');
15
21
 
16
- var CsvReader = require('./param-reader-csv');
22
+ const errHelper = require('../errors/helper');
17
23
 
18
- var JsonReader = require('./param-reader-json');
24
+ const DEFAULT_MODE = 'seq';
19
25
 
20
- var errHelper = require('../errors/helper');
26
+ class ParameterManager {
27
+ constructor({
28
+ paramFile = null,
29
+ fileType = null,
30
+ paramMode = DEFAULT_MODE,
31
+ values = null
32
+ }) {
33
+ this.filePath = paramFile;
34
+ this.fileType = fileType;
35
+ this.mode = paramMode;
36
+ this.table = null;
37
+ this.currentRow = null;
38
+ this.prevRow = null;
21
39
 
22
- var module = {};
40
+ if (values && Array.isArray(values)) {
41
+ this.table = values;
42
+ this.currentRow = this.mode === 'random' ? random(0, this.table.length) : 0;
43
+ }
44
+ }
23
45
 
24
- var _whenInitialized = defer();
46
+ async init() {
47
+ if (!this.filePath) {
48
+ return;
49
+ }
25
50
 
26
- module.init = function () {
27
- var ext = path.extname(filePath);
51
+ let ext = path.extname(this.filePath);
28
52
 
29
- if (fileType) {
30
- ext = fileType;
53
+ if (this.fileType) {
54
+ ext = this.fileType;
31
55
  }
32
56
 
33
- var reader = null;
34
- var self = this;
57
+ let reader = null;
35
58
 
36
59
  if (ext === '.xlsx' || ext === '.xls') {
37
60
  reader = new ExcelReader();
@@ -40,29 +63,24 @@ module.exports = function (filePath, mode, fileType) {
40
63
  } else if (ext === '.json' || ext === '.js') {
41
64
  reader = new JsonReader();
42
65
  } else {
43
- _whenInitialized.reject(new _OxygenError.default(errHelper.errorCode.PARAMETERS_ERROR, 'Unsupported parameters file type: ' + ext));
44
-
45
- return _whenInitialized.promise;
66
+ new _OxygenError.default(errHelper.errorCode.PARAMETERS_ERROR, `Unsupported parameters file type: ${ext}`);
67
+ return;
46
68
  }
47
69
 
48
- this.mode = mode;
49
- reader.read(filePath, fileType || null).then(function (result) {
50
- self.table = result;
51
- self.currentRow = self.mode === 'random' ? random(0, self.table.length) : 0;
52
-
53
- _whenInitialized.resolve(null);
54
- }).catch(function (err) {
55
- _whenInitialized.reject(new _OxygenError.default(errHelper.errorCode.PARAMETERS_ERROR, `${errHelper.errorCode.PARAMETERS_ERROR}: Unable to load parameters file.
56
- ${err.message}`));
57
- });
58
- return _whenInitialized.promise;
59
- };
70
+ try {
71
+ const result = await reader.read(this.filePath, this.fileType || null);
72
+ this.table = result;
73
+ this.currentRow = this.mode === 'random' ? random(0, this.table.length) : 0;
74
+ } catch (e) {
75
+ new _OxygenError.default(errHelper.errorCode.PARAMETERS_ERROR, `${errHelper.errorCode.PARAMETERS_ERROR}: Unable to load parameters file.\n${e.message}`);
76
+ }
77
+ }
60
78
 
61
- module.getMode = function () {
79
+ getMode() {
62
80
  return this.mode;
63
- };
81
+ }
64
82
 
65
- module.readNext = function () {
83
+ readNext() {
66
84
  this.prevRow = this.currentRow;
67
85
 
68
86
  if (this.mode === 'random') {
@@ -74,30 +92,31 @@ ${err.message}`));
74
92
  if (this.currentRow > this.table.length - 1) {
75
93
  this.currentRow = 0;
76
94
  }
77
- };
95
+ }
78
96
 
79
- module.readPrev = function () {
80
- if (typeof this.prevRow !== 'undefined') {
97
+ readPrev() {
98
+ if (typeof this.prevRow !== 'undefined' && this.prevRow != null) {
81
99
  this.currentRow = this.prevRow;
82
100
  }
83
- };
101
+ }
84
102
 
85
- module.getValues = function () {
103
+ getValues() {
86
104
  if (!this.table || this.table.length === 0) {
87
105
  throw new _OxygenError.default(errHelper.errorCode.PARAMETERS_ERROR, 'Parameters table is empty');
88
106
  }
89
107
 
90
108
  return this.table[this.currentRow];
91
- };
109
+ }
92
110
 
93
- module.__defineGetter__('rows', function () {
111
+ get rows() {
94
112
  return this.table.length;
95
- });
96
-
97
- function random(min, max) {
98
- return Math.floor(Math.random() * (max - min)) + min;
99
113
  }
100
114
 
101
- return module;
102
- };
103
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9saWIvcGFyYW0tbWFuYWdlci5qcyJdLCJuYW1lcyI6WyJtb2R1bGUiLCJleHBvcnRzIiwiZmlsZVBhdGgiLCJtb2RlIiwiZmlsZVR5cGUiLCJkZWZlciIsInJlcXVpcmUiLCJwYXRoIiwiRXhjZWxSZWFkZXIiLCJDc3ZSZWFkZXIiLCJKc29uUmVhZGVyIiwiZXJySGVscGVyIiwiX3doZW5Jbml0aWFsaXplZCIsImluaXQiLCJleHQiLCJleHRuYW1lIiwicmVhZGVyIiwic2VsZiIsInJlamVjdCIsIk94RXJyb3IiLCJlcnJvckNvZGUiLCJQQVJBTUVURVJTX0VSUk9SIiwicHJvbWlzZSIsInJlYWQiLCJ0aGVuIiwicmVzdWx0IiwidGFibGUiLCJjdXJyZW50Um93IiwicmFuZG9tIiwibGVuZ3RoIiwicmVzb2x2ZSIsImNhdGNoIiwiZXJyIiwibWVzc2FnZSIsImdldE1vZGUiLCJyZWFkTmV4dCIsInByZXZSb3ciLCJyZWFkUHJldiIsImdldFZhbHVlcyIsIl9fZGVmaW5lR2V0dGVyX18iLCJtaW4iLCJtYXgiLCJNYXRoIiwiZmxvb3IiXSwibWFwcGluZ3MiOiI7Ozs7QUFRQTs7OztBQUNBQSxNQUFNLENBQUNDLE9BQVAsR0FBaUIsVUFBVUMsUUFBVixFQUFvQkMsSUFBcEIsRUFBMEJDLFFBQTFCLEVBQWlEO0FBQzlELE1BQUlDLEtBQUssR0FBR0MsT0FBTyxDQUFDLE1BQUQsQ0FBUCxDQUFnQkQsS0FBNUI7O0FBQ0EsTUFBSUUsSUFBSSxHQUFHRCxPQUFPLENBQUMsTUFBRCxDQUFsQjs7QUFDQSxNQUFJRSxXQUFXLEdBQUdGLE9BQU8sQ0FBQyxzQkFBRCxDQUF6Qjs7QUFDQSxNQUFJRyxTQUFTLEdBQUdILE9BQU8sQ0FBQyxvQkFBRCxDQUF2Qjs7QUFDQSxNQUFJSSxVQUFVLEdBQUdKLE9BQU8sQ0FBQyxxQkFBRCxDQUF4Qjs7QUFDQSxNQUFJSyxTQUFTLEdBQUdMLE9BQU8sQ0FBQyxrQkFBRCxDQUF2Qjs7QUFDQSxNQUFJTixNQUFNLEdB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QUF3QixXQUE1QixFQUF5QztBQUNyQyxXQUFLVCxVQUFMLEdBQWtCLEtBQUtTLE9BQXZCO0FBQ0g7QUFDSixHQUpEOztBQU1BcEMsRUFBQUEsTUFBTSxDQUFDc0MsU0FBUCxHQUFtQixZQUFXO0FBQzFCLFFBQUksQ0FBQyxLQUFLWixLQUFOLElBQWUsS0FBS0EsS0FBTCxDQUFXRyxNQUFYLEtBQXNCLENBQXpDLEVBQTRDO0FBQ3hDLFlBQU0sSUFBSVYsb0JBQUosQ0FBWVIsU0FBUyxDQUFDUyxTQUFWLENBQW9CQyxnQkFBaEMsRUFBa0QsMkJBQWxELENBQU47QUFDSDs7QUFDRCxXQUFPLEtBQUtLLEtBQUwsQ0FBVyxLQUFLQyxVQUFoQixDQUFQO0FBQ0gsR0FMRDs7QUFPQTNCLEVBQUFBLE1BQU0sQ0FBQ3VDLGdCQUFQLENBQXdCLE1BQXhCLEVBQWdDLFlBQVc7QUFDdkMsV0FBTyxLQUFLYixLQUFMLENBQVdHLE1BQWxCO0FBQ0gsR0FGRDs7QUFJQSxXQUFTRCxNQUFULENBQWdCWSxHQUFoQixFQUFxQkMsR0FBckIsRUFBMEI7QUFDdEIsV0FBT0MsSUFBSSxDQUFDQyxLQUFMLENBQVdELElBQUksQ0FBQ2QsTUFBTCxNQUFpQmEsR0FBRyxHQUFHRCxHQUF2QixDQUFYLElBQTBDQSxHQUFqRDtBQUNIOztBQUVELFNBQU94QyxNQUFQO0FBQ0gsQ0E5RkQiLCJzb3VyY2VzQ29udGVudCI6WyIvKlxyXG4gKiBDb3B5cmlnaHQgKEMpIDIwMTUtMjAxOCBDbG91ZEJlYXQgTGltaXRlZFxyXG4gKlxyXG4gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeVxyXG4gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieVxyXG4gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvclxyXG4gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLlxyXG4gKi9cclxuaW1wb3J0IE94RXJyb3IgZnJvbSAnLi4vZXJyb3JzL094eWdlbkVycm9yJztcclxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoZmlsZVBhdGgsIG1vZGUsIGZpbGVUeXBlIC8qb3B0aW9uYWwqLykge1xyXG4gICAgdmFyIGRlZmVyID0gcmVxdWlyZSgnd2hlbicpLmRlZmVyO1xyXG4gICAgdmFyIHBhdGggPSByZXF1aXJlKCdwYXRoJyk7XHJcbiAgICB2YXIgRXhjZWxSZWFkZXIgPSByZXF1aXJlKCcuL3BhcmFtLXJlYWRlci1leGNlbCcpO1xyXG4gICAgdmFyIENzdlJlYWRlciA9IHJlcXVpcmUoJy4vcGFyYW0tcmVhZGVyLWNzdicpO1xyXG4gICAgdmFyIEpzb25SZWFkZXIgPSByZXF1aXJlKCcuL3BhcmFtLXJlYWRlci1qc29uJyk7XHJcbiAgICB2YXIgZXJySGVscGVyID0gcmVxdWlyZSgnLi4vZXJyb3JzL2hlbHBlcicpO1xyXG4gICAgdmFyIG1vZHVsZSA9IHt9O1xyXG4gICAgdmFyIF93aGVuSW5pdGlhbGl6ZWQgPSBkZWZlcigpO1xyXG5cclxuICAgIG1vZHVsZS5pbml0ID0gZnVuY3Rpb24oKSB7XHJcbiAgICAgICAgdmFyIGV4dCA9IHBhdGguZXh0bmFtZShmaWxlUGF0aCk7XHJcblxyXG4gICAgICAgIGlmIChmaWxlVHlwZSkge1xyXG4gICAgICAgICAgICBleHQgPSBmaWxlVHlwZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdmFyIHJlYWRlciA9IG51bGw7XHJcbiAgICAgICAgdmFyIHNlbGYgPSB0aGlzO1xyXG4gICAgICAgIC8vIGNob29zZSB0aGUgcmlnaHQgY29udmVydGVyIGJhc2VkIG9uIGVpdGhlciB4bHMgb3IgeGxzeCBmaWxlIGV4dGVuc2lvblxyXG4gICAgICAgIGlmIChleHQgPT09ICcueGxzeCcgfHwgZXh0ID09PSAnLnhscycpIHtcclxuICAgICAgICAgICAgcmVhZGVyID0gbmV3IEV4Y2VsUmVhZGVyKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKGV4dCA9PT0gJy5jc3YnIHx8IGV4dCA9PT0gJy50eHQnKSB7XHJcbiAgICAgICAgICAgIHJlYWRlciA9IG5ldyBDc3ZSZWFkZXIoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAoZXh0ID09PSAnLmpzb24nIHx8IGV4dCA9PT0gJy5qcycpIHtcclxuICAgICAgICAgICAgcmVhZGVyID0gbmV3IEpzb25SZWFkZXIoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIF93aGVuSW5pdGlhbGl6ZWQucmVqZWN0KG5ldyBPeEVycm9yKGVyckhlbHBlci5lcnJvckNvZGUuUEFSQU1FVEVSU19FUlJPUiwgJ1Vuc3VwcG9ydGVkIHBhcmFtZXRlcnMgZmlsZSB0eXBlOiAnICsgZXh0KSk7XHJcbiAgICAgICAgICAgIHJldHVybiBfd2hlbkluaXRpYWxpemVkLnByb21pc2U7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLm1vZGUgPSBtb2RlO1xyXG5cclxuICAgICAgICByZWFkZXIucmVhZChmaWxlUGF0aCwgZmlsZVR5cGUgfHwgbnVsbClcclxuICAgICAgICAgICAgLnRoZW4oZnVuY3Rpb24ocmVzdWx0KSB7XHJcbiAgICAgICAgICAgICAgICBzZWxmLnRhYmxlID0gcmVzdWx0O1xyXG4gICAgICAgICAgICAgICAgLy8gaW5pdGlhbGl6ZSBjdXJyZW50Um93IGFjY29yZGluZyB3aXRoIHBhcmFtZXRlciByZWFkaW5nIG1vZGUgKHJhbmRvbSBvciBzZXF1ZW50aWFsKVxyXG4gICAgICAgICAgICAgICAgc2VsZi5jdXJyZW50Um93ID0gc2VsZi5tb2RlID09PSAncmFuZG9tJyA/IHJhbmRvbSgwLCBzZWxmLnRhYmxlLmxlbmd0aCkgOiAwO1xyXG4gICAgICAgICAgICAgICAgX3doZW5Jbml0aWFsaXplZC5yZXNvbHZlKG51bGwpO1xyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAuY2F0Y2goZnVuY3Rpb24oZXJyKSB7XHJcbiAgICAgICAgICAgICAgICBfd2hlbkluaXRpYWxpemVkLnJlamVjdChcclxuICAgICAgICAgICAgICAgICAgICBuZXcgT3hFcnJvcihcclxuICAgICAgICAgICAgICAgICAgICAgICAgZXJySGVscGVyLmVycm9yQ29kZS5QQVJBTUVURVJTX0VSUk9SLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBgJHtlcnJIZWxwZXIuZXJyb3JDb2RlLlBBUkFNRVRFUlNfRVJST1J9OiBVbmFibGUgdG8gbG9hZCBwYXJhbWV0ZXJzIGZpbGUuIFxyXG4ke2Vyci5tZXNzYWdlfWBcclxuICAgICAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgcmV0dXJuIF93aGVuSW5pdGlhbGl6ZWQucHJvbWlzZTtcclxuICAgIH07XHJcblxyXG4gICAgbW9kdWxlLmdldE1vZGUgPSBmdW5jdGlvbigpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5tb2RlO1xyXG4gICAgfTtcclxuXHJcbiAgICBtb2R1bGUucmVhZE5leHQgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgdGhpcy5wcmV2Um93ID0gdGhpcy5jdXJyZW50Um93O1xyXG4gICAgICAgIGlmICh0aGlzLm1vZGUgPT09ICdyYW5kb20nKSB7XHJcbiAgICAgICAgICAgIHRoaXMuY3VycmVudFJvdyA9IHJhbmRvbSgwLCB0aGlzLnRhYmxlLmxlbmd0aCk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5jdXJyZW50Um93Kys7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodGhpcy5jdXJyZW50Um93ID4gdGhpcy50YWJsZS5sZW5ndGggLSAxKSB7XHJcbiAgICAgICAgICAgIHRoaXMuY3VycmVudFJvdyA9IDA7XHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxuXHJcbiAgICBtb2R1bGUucmVhZFByZXYgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLnByZXZSb3cgIT09ICd1bmRlZmluZWQnKSB7XHJcbiAgICAgICAgICAgIHRoaXMuY3VycmVudFJvdyA9IHRoaXMucHJldlJvdztcclxuICAgICAgICB9XHJcbiAgICB9O1xyXG5cclxuICAgIG1vZHVsZS5nZXRWYWx1ZXMgPSBmdW5jdGlvbigpIHtcclxuICAgICAgICBpZiAoIXRoaXMudGFibGUgfHwgdGhpcy50YWJsZS5sZW5ndGggPT09IDApIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IE94RXJyb3IoZXJySGVscGVyLmVycm9yQ29kZS5QQVJBTUVURVJTX0VSUk9SLCAnUGFyYW1ldGVycyB0YWJsZSBpcyBlbXB0eScpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdGhpcy50YWJsZVt0aGlzLmN1cnJlbnRSb3ddO1xyXG4gICAgfTtcclxuXHJcbiAgICBtb2R1bGUuX19kZWZpbmVHZXR0ZXJfXygncm93cycsIGZ1bmN0aW9uKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLnRhYmxlLmxlbmd0aDtcclxuICAgIH0pO1xyXG5cclxuICAgIGZ1bmN0aW9uIHJhbmRvbShtaW4sIG1heCkge1xyXG4gICAgICAgIHJldHVybiBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiAobWF4IC0gbWluKSkgKyBtaW47XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIG1vZHVsZTtcclxufTtcclxuIl19
115
+ }
116
+
117
+ exports.default = ParameterManager;
118
+
119
+ function random(min, max) {
120
+ return Math.floor(Math.random() * (max - min)) + min;
121
+ }
122
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9saWIvcGFyYW0tbWFuYWdlci5qcyJdLCJuYW1lcyI6WyJwYXRoIiwicmVxdWlyZSIsIkV4Y2VsUmVhZGVyIiwiQ3N2UmVhZGVyIiwiSnNvblJlYWRlciIsImVyckhlbHBlciIsIkRFRkFVTFRfTU9ERSIsIlBhcmFtZXRlck1hbmFnZXIiLCJjb25zdHJ1Y3RvciIsInBhcmFtRmlsZSIsImZpbGVUeXBlIiwicGFyYW1Nb2RlIiwidmFsdWVzIiwiZmlsZVBhdGgiLCJtb2RlIiwidGFibGUiLCJjdXJyZW50Um93IiwicHJldlJvdyIsIkFycmF5IiwiaXNBcnJheSIsInJhbmRvbSIsImxlbmd0aCIsImluaXQiLCJleHQiLCJleHRuYW1lIiwicmVhZGVyIiwiT3hFcnJvciIsImVycm9yQ29kZSIsIlBBUkFNRVRFUlNfRVJST1IiLCJyZXN1bHQiLCJyZWFkIiwiZSIsIm1lc3NhZ2UiLCJnZXRNb2RlIiwicmVhZE5leHQiLCJyZWFkUHJldiIsImdldFZhbHVlcyIsInJvd3MiLCJtaW4iLCJtYXgiLCJNYXRoIiwiZmxvb3IiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7OztBQVFBOzs7O0FBR0EsTUFBTUEsSUFBSSxHQUFHQyxPQUFPLENBQUMsTUFBRCxDQUFwQjs7QUFDQSxNQUFNQyxXQUFXLEdBQUdELE9BQU8sQ0FBQyxzQkFBRCxDQUEzQjs7QUFDQSxNQUFNRSxTQUFTLEdBQUdGLE9BQU8sQ0FBQyxvQkFBRCxDQUF6Qjs7QUFDQSxNQUFNRyxVQUFVLEdBQUdILE9BQU8sQ0FBQyxxQkFBRCxDQUExQjs7QUFDQSxNQUFNSSxTQUFTLEdBQUdKLE9BQU8sQ0FBQyxrQkFBRCxDQUF6Qjs7QUFFQSxNQUFNSyxZQUFZLEdBQUcsS0FBckI7O0FBRWUsTUFBTUMsZ0JBQU4sQ0FBdUI7QUFDbENDLEVBQUFBLFdBQVcsQ0FBQztBQUFFQyxJQUFBQSxTQUFTLEdBQUcsSUFBZDtBQUFvQkMsSUFBQUEsUUFBUSxHQUFHLElBQS9CO0FBQXFDQyxJQUFBQSxTQUFTLEdBQUdM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QUFLTCxVQUFMLEdBQWtCLENBQWxCO0FBQ0g7QUFDSjs7QUFFRG1CLEVBQUFBLFFBQVEsR0FBRztBQUNQLFFBQUksT0FBTyxLQUFLbEIsT0FBWixLQUF3QixXQUF4QixJQUF1QyxLQUFLQSxPQUFMLElBQWdCLElBQTNELEVBQWlFO0FBQzdELFdBQUtELFVBQUwsR0FBa0IsS0FBS0MsT0FBdkI7QUFDSDtBQUNKOztBQUVEbUIsRUFBQUEsU0FBUyxHQUFHO0FBQ1IsUUFBSSxDQUFDLEtBQUtyQixLQUFOLElBQWUsS0FBS0EsS0FBTCxDQUFXTSxNQUFYLEtBQXNCLENBQXpDLEVBQTRDO0FBQ3hDLFlBQU0sSUFBSUssb0JBQUosQ0FBWXJCLFNBQVMsQ0FBQ3NCLFNBQVYsQ0FBb0JDLGdCQUFoQyxFQUFrRCwyQkFBbEQsQ0FBTjtBQUNIOztBQUNELFdBQU8sS0FBS2IsS0FBTCxDQUFXLEtBQUtDLFVBQWhCLENBQVA7QUFDSDs7QUFFTyxNQUFKcUIsSUFBSSxHQUFHO0FBQ1AsV0FBTyxLQUFLdEIsS0FBTCxDQUFXTSxNQUFsQjtBQUNIOztBQXRGaUM7Ozs7QUF5RnRDLFNBQVNELE1BQVQsQ0FBZ0JrQixHQUFoQixFQUFxQkMsR0FBckIsRUFBMEI7QUFDdEIsU0FBT0MsSUFBSSxDQUFDQyxLQUFMLENBQVdELElBQUksQ0FBQ3BCLE1BQUwsTUFBaUJtQixHQUFHLEdBQUdELEdBQXZCLENBQVgsSUFBMENBLEdBQWpEO0FBQ0giLCJzb3VyY2VzQ29udGVudCI6WyIvKlxyXG4gKiBDb3B5cmlnaHQgKEMpIDIwMTUtcHJlc2VudCBDbG91ZEJlYXQgTGltaXRlZFxyXG4gKlxyXG4gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeVxyXG4gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieVxyXG4gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvclxyXG4gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLlxyXG4gKi9cclxuaW1wb3J0IE94RXJyb3IgZnJvbSAnLi4vZXJyb3JzL094eWdlbkVycm9yJztcclxuXHJcbi8vIGNvbnN0IGRlZmVyID0gcmVxdWlyZSgnd2hlbicpLmRlZmVyO1xyXG5jb25zdCBwYXRoID0gcmVxdWlyZSgncGF0aCcpO1xyXG5jb25zdCBFeGNlbFJlYWRlciA9IHJlcXVpcmUoJy4vcGFyYW0tcmVhZGVyLWV4Y2VsJyk7XHJcbmNvbnN0IENzdlJlYWRlciA9IHJlcXVpcmUoJy4vcGFyYW0tcmVhZGVyLWNzdicpO1xyXG5jb25zdCBKc29uUmVhZGVyID0gcmVxdWlyZSgnLi9wYXJhbS1yZWFkZXItanNvbicpO1xyXG5jb25zdCBlcnJIZWxwZXIgPSByZXF1aXJlKCcuLi9lcnJvcnMvaGVscGVyJyk7XHJcblxyXG5jb25zdCBERUZBVUxUX01PREUgPSAnc2VxJztcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFBhcmFtZXRlck1hbmFnZXIge1xyXG4gICAgY29uc3RydWN0b3IoeyBwYXJhbUZpbGUgPSBudWxsLCBmaWxlVHlwZSA9IG51bGwsIHBhcmFtTW9kZSA9IERFRkFVTFRfTU9ERSwgdmFsdWVzID0gbnVsbH0pIHtcclxuICAgICAgICB0aGlzLmZpbGVQYXRoID0gcGFyYW1GaWxlO1xyXG4gICAgICAgIHRoaXMuZmlsZVR5cGUgPSBmaWxlVHlwZTtcclxuICAgICAgICB0aGlzLm1vZGUgPSBwYXJhbU1vZGU7XHJcbiAgICAgICAgdGhpcy50YWJsZSA9IG51bGw7XHJcbiAgICAgICAgdGhpcy5jdXJyZW50Um93ID0gbnVsbDtcclxuICAgICAgICB0aGlzLnByZXZSb3cgPSBudWxsO1xyXG4gICAgICAgIC8vIGlmIHZhbHVlcyB3ZXJlIHByb3ZpZGVkLCBpbml0aWFsaXplIG1hbmFnZXIgd2l0aCBwcmUtZGVmaW5lZCB0YWJsZVxyXG4gICAgICAgIGlmICh2YWx1ZXMgJiYgQXJyYXkuaXNBcnJheSh2YWx1ZXMpKSB7XHJcbiAgICAgICAgICAgIHRoaXMudGFibGUgPSB2YWx1ZXM7XHJcbiAgICAgICAgICAgIC8vIGluaXRpYWxpemUgY3VycmVudFJvdyBhY2NvcmRpbmcgd2l0aCBwYXJhbWV0ZXIgcmVhZGluZyBtb2RlIChyYW5kb20gb3Igc2VxdWVudGlhbClcclxuICAgICAgICAgICAgdGhpcy5jdXJyZW50Um93ID0gdGhpcy5tb2RlID09PSAncmFuZG9tJyA/IHJhbmRvbSgwLCB0aGlzLnRhYmxlLmxlbmd0aCkgOiAwO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBpbml0KCkge1xyXG4gICAgICAgIGlmICghdGhpcy5maWxlUGF0aCkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGxldCBleHQgPSBwYXRoLmV4dG5hbWUodGhpcy5maWxlUGF0aCk7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLmZpbGVUeXBlKSB7XHJcbiAgICAgICAgICAgIGV4dCA9IHRoaXMuZmlsZVR5cGU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGxldCByZWFkZXIgPSBudWxsO1xyXG4gICAgICAgIC8vIGNob29zZSB0aGUgcmlnaHQgY29udmVydGVyIGJhc2VkIG9uIGVpdGhlciB4bHMgb3IgeGxzeCBmaWxlIGV4dGVuc2lvblxyXG4gICAgICAgIGlmIChleHQgPT09ICcueGxzeCcgfHwgZXh0ID09PSAnLnhscycpIHtcclxuICAgICAgICAgICAgcmVhZGVyID0gbmV3IEV4Y2VsUmVhZGVyKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKGV4dCA9PT0gJy5jc3YnIHx8IGV4dCA9PT0gJy50eHQnKSB7XHJcbiAgICAgICAgICAgIHJlYWRlciA9IG5ldyBDc3ZSZWFkZXIoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAoZXh0ID09PSAnLmpzb24nIHx8IGV4dCA9PT0gJy5qcycpIHtcclxuICAgICAgICAgICAgcmVhZGVyID0gbmV3IEpzb25SZWFkZXIoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIG5ldyBPeEVycm9yKGVyckhlbHBlci5lcnJvckNvZGUuUEFSQU1FVEVSU19FUlJPUiwgYFVuc3VwcG9ydGVkIHBhcmFtZXRlcnMgZmlsZSB0eXBlOiAke2V4dH1gKTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcmVhZGVyLnJlYWQodGhpcy5maWxlUGF0aCwgdGhpcy5maWxlVHlwZSB8fCBudWxsKTtcclxuICAgICAgICAgICAgdGhpcy50YWJsZSA9IHJlc3VsdDtcclxuICAgICAgICAgICAgLy8gaW5pdGlhbGl6ZSBjdXJyZW50Um93IGFjY29yZGluZyB3aXRoIHBhcmFtZXRlciByZWFkaW5nIG1vZGUgKHJhbmRvbSBvciBzZXF1ZW50aWFsKVxyXG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRSb3cgPSB0aGlzLm1vZGUgPT09ICdyYW5kb20nID8gcmFuZG9tKDAsIHRoaXMudGFibGUubGVuZ3RoKSA6IDA7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgIG5ldyBPeEVycm9yKFxyXG4gICAgICAgICAgICAgICAgZXJySGVscGVyLmVycm9yQ29kZS5QQVJBTUVURVJTX0VSUk9SLFxyXG4gICAgICAgICAgICAgICAgYCR7ZXJySGVscGVyLmVycm9yQ29kZS5QQVJBTUVURVJTX0VSUk9SfTogVW5hYmxlIHRvIGxvYWQgcGFyYW1ldGVycyBmaWxlLlxcbiR7ZS5tZXNzYWdlfWBcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBnZXRNb2RlKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLm1vZGU7XHJcbiAgICB9XHJcblxyXG4gICAgcmVhZE5leHQoKSB7XHJcbiAgICAgICAgdGhpcy5wcmV2Um93ID0gdGhpcy5jdXJyZW50Um93O1xyXG4gICAgICAgIGlmICh0aGlzLm1vZGUgPT09ICdyYW5kb20nKSB7XHJcbiAgICAgICAgICAgIHRoaXMuY3VycmVudFJvdyA9IHJhbmRvbSgwLCB0aGlzLnRhYmxlLmxlbmd0aCk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5jdXJyZW50Um93Kys7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodGhpcy5jdXJyZW50Um93ID4gdGhpcy50YWJsZS5sZW5ndGggLSAxKSB7XHJcbiAgICAgICAgICAgIHRoaXMuY3VycmVudFJvdyA9IDA7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHJlYWRQcmV2KCkge1xyXG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5wcmV2Um93ICE9PSAndW5kZWZpbmVkJyAmJiB0aGlzLnByZXZSb3cgIT0gbnVsbCkge1xyXG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRSb3cgPSB0aGlzLnByZXZSb3c7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGdldFZhbHVlcygpIHtcclxuICAgICAgICBpZiAoIXRoaXMudGFibGUgfHwgdGhpcy50YWJsZS5sZW5ndGggPT09IDApIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IE94RXJyb3IoZXJySGVscGVyLmVycm9yQ29kZS5QQVJBTUVURVJTX0VSUk9SLCAnUGFyYW1ldGVycyB0YWJsZSBpcyBlbXB0eScpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdGhpcy50YWJsZVt0aGlzLmN1cnJlbnRSb3ddO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCByb3dzKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLnRhYmxlLmxlbmd0aDtcclxuICAgIH1cclxufVxyXG5cclxuZnVuY3Rpb24gcmFuZG9tKG1pbiwgbWF4KSB7XHJcbiAgICByZXR1cm4gTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogKG1heCAtIG1pbikpICsgbWluO1xyXG59Il19