oxygen-cli 1.41.0 → 1.42.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 (285) hide show
  1. package/CHANGELOG.md +8 -0
  2. package/build/core/OxygenCore.js +41 -274
  3. package/build/core/OxygenEvents.js +2 -12
  4. package/build/core/OxygenModule.js +1 -16
  5. package/build/core/OxygenService.js +1 -12
  6. package/build/core/OxygenSubModule.js +1 -10
  7. package/build/core/WebDriverModule.js +2 -32
  8. package/build/core/utils.js +2 -21
  9. package/build/errors/HookError.js +2 -8
  10. package/build/errors/ModuleError.js +2 -8
  11. package/build/errors/ModuleUnavailableError.js +1 -3
  12. package/build/errors/OxygenError.js +3 -36
  13. package/build/errors/ScriptNotFound.js +2 -8
  14. package/build/errors/helper.js +50 -82
  15. package/build/index.js +8 -22
  16. package/build/lib/cli-util.js +35 -105
  17. package/build/lib/cli.js +3 -30
  18. package/build/lib/debugger.js +2 -145
  19. package/build/lib/img-merge.js +2 -16
  20. package/build/lib/launcher.js +3 -31
  21. package/build/lib/moduleRequire.js +1 -4
  22. package/build/lib/parallel-launcher.js +44 -84
  23. package/build/lib/param-manager.js +2 -29
  24. package/build/lib/param-reader-csv.js +1 -15
  25. package/build/lib/param-reader-excel.js +1 -14
  26. package/build/lib/param-reader-json.js +1 -10
  27. package/build/lib/text-to-image.js +5 -26
  28. package/build/lib/util.js +4 -75
  29. package/build/model/case-result.js +1 -2
  30. package/build/model/failure.js +1 -2
  31. package/build/model/status.js +1 -2
  32. package/build/model/step-result.js +1 -2
  33. package/build/model/suite-result.js +1 -2
  34. package/build/model/test-result.js +1 -2
  35. package/build/model/testcase.js +1 -2
  36. package/build/model/testsuite.js +1 -2
  37. package/build/ox_modules/index.js +20 -41
  38. package/build/ox_modules/module-assert.js +9 -28
  39. package/build/ox_modules/module-date.js +3 -8
  40. package/build/ox_modules/module-db.js +8 -29
  41. package/build/ox_modules/module-email.js +14 -45
  42. package/build/ox_modules/module-eyes.js +6 -47
  43. package/build/ox_modules/module-http/ntlm-util.js +3 -7
  44. package/build/ox_modules/module-http/ntlm.js +9 -78
  45. package/build/ox_modules/module-http.js +69 -172
  46. package/build/ox_modules/module-log.js +10 -23
  47. package/build/ox_modules/module-mailinator.js +11 -33
  48. package/build/ox_modules/module-mob/commands/alertAccept.js +1 -3
  49. package/build/ox_modules/module-mob/commands/alertDismiss.js +1 -3
  50. package/build/ox_modules/module-mob/commands/assertAlert.js +1 -7
  51. package/build/ox_modules/module-mob/commands/assertText.js +1 -4
  52. package/build/ox_modules/module-mob/commands/assertTitle.js +1 -5
  53. package/build/ox_modules/module-mob/commands/assertValue.js +9 -17
  54. package/build/ox_modules/module-mob/commands/back.js +1 -3
  55. package/build/ox_modules/module-mob/commands/clear.js +1 -5
  56. package/build/ox_modules/module-mob/commands/click.js +3 -5
  57. package/build/ox_modules/module-mob/commands/clickHidden.js +3 -10
  58. package/build/ox_modules/module-mob/commands/clickLong.js +1 -3
  59. package/build/ox_modules/module-mob/commands/clickMultipleTimes.js +1 -5
  60. package/build/ox_modules/module-mob/commands/closeApp.js +1 -3
  61. package/build/ox_modules/module-mob/commands/debug.js +2 -3
  62. package/build/ox_modules/module-mob/commands/dragAndDrop.js +1 -3
  63. package/build/ox_modules/module-mob/commands/enableNetwork.js +4 -13
  64. package/build/ox_modules/module-mob/commands/execute.js +1 -3
  65. package/build/ox_modules/module-mob/commands/findElement.js +1 -4
  66. package/build/ox_modules/module-mob/commands/findElements.js +1 -5
  67. package/build/ox_modules/module-mob/commands/getAlertText.js +1 -3
  68. package/build/ox_modules/module-mob/commands/getAppiumLogs.js +1 -3
  69. package/build/ox_modules/module-mob/commands/getBrowserLogs.js +1 -11
  70. package/build/ox_modules/module-mob/commands/getCurrentActivity.js +1 -3
  71. package/build/ox_modules/module-mob/commands/getCurrentPackage.js +1 -3
  72. package/build/ox_modules/module-mob/commands/getDeviceLogs.js +1 -10
  73. package/build/ox_modules/module-mob/commands/getDeviceTime.js +1 -3
  74. package/build/ox_modules/module-mob/commands/getLocation.js +1 -3
  75. package/build/ox_modules/module-mob/commands/getSource.js +1 -3
  76. package/build/ox_modules/module-mob/commands/getText.js +1 -5
  77. package/build/ox_modules/module-mob/commands/getTitle.js +1 -3
  78. package/build/ox_modules/module-mob/commands/getUrl.js +1 -3
  79. package/build/ox_modules/module-mob/commands/getValue.js +5 -10
  80. package/build/ox_modules/module-mob/commands/getWindowHandles.js +1 -3
  81. package/build/ox_modules/module-mob/commands/hideKeyboard.js +1 -3
  82. package/build/ox_modules/module-mob/commands/index.js +1 -148
  83. package/build/ox_modules/module-mob/commands/installApp.js +1 -3
  84. package/build/ox_modules/module-mob/commands/isAppInstalled.js +1 -3
  85. package/build/ox_modules/module-mob/commands/isCheckable.js +1 -3
  86. package/build/ox_modules/module-mob/commands/isChecked.js +1 -3
  87. package/build/ox_modules/module-mob/commands/isClickable.js +1 -3
  88. package/build/ox_modules/module-mob/commands/isExist.js +1 -4
  89. package/build/ox_modules/module-mob/commands/isSelected.js +1 -3
  90. package/build/ox_modules/module-mob/commands/isVisible.js +1 -4
  91. package/build/ox_modules/module-mob/commands/isWebViewContext.js +1 -3
  92. package/build/ox_modules/module-mob/commands/launchApp.js +1 -3
  93. package/build/ox_modules/module-mob/commands/longPressKeyCode.js +1 -3
  94. package/build/ox_modules/module-mob/commands/open.js +1 -4
  95. package/build/ox_modules/module-mob/commands/pause.js +1 -3
  96. package/build/ox_modules/module-mob/commands/removeApp.js +1 -3
  97. package/build/ox_modules/module-mob/commands/resetApp.js +1 -3
  98. package/build/ox_modules/module-mob/commands/scrollIntoElement.js +1 -7
  99. package/build/ox_modules/module-mob/commands/scrollIntoView.js +1 -3
  100. package/build/ox_modules/module-mob/commands/select.js +1 -5
  101. package/build/ox_modules/module-mob/commands/selectFrame.js +1 -5
  102. package/build/ox_modules/module-mob/commands/selectWindow.js +5 -27
  103. package/build/ox_modules/module-mob/commands/sendKeys.js +6 -10
  104. package/build/ox_modules/module-mob/commands/setContext.js +1 -3
  105. package/build/ox_modules/module-mob/commands/setNativeContext.js +1 -3
  106. package/build/ox_modules/module-mob/commands/setTimeout.js +1 -3
  107. package/build/ox_modules/module-mob/commands/setWebViewContext.js +3 -7
  108. package/build/ox_modules/module-mob/commands/shake.js +1 -3
  109. package/build/ox_modules/module-mob/commands/smsClickLink.js +1 -3
  110. package/build/ox_modules/module-mob/commands/smsGetText.js +3 -7
  111. package/build/ox_modules/module-mob/commands/swipe.js +1 -3
  112. package/build/ox_modules/module-mob/commands/swipeElement.js +1 -3
  113. package/build/ox_modules/module-mob/commands/swipeScreen.js +1 -3
  114. package/build/ox_modules/module-mob/commands/takeScreenshot.js +1 -3
  115. package/build/ox_modules/module-mob/commands/tap.js +1 -3
  116. package/build/ox_modules/module-mob/commands/type.js +3 -8
  117. package/build/ox_modules/module-mob/commands/unlockPattern.js +9 -11
  118. package/build/ox_modules/module-mob/commands/waitForExist.js +1 -3
  119. package/build/ox_modules/module-mob/commands/waitForInteractable.js +1 -4
  120. package/build/ox_modules/module-mob/commands/waitForVisible.js +1 -3
  121. package/build/ox_modules/module-mob.js +74 -216
  122. package/build/ox_modules/module-mongo.js +14 -51
  123. package/build/ox_modules/module-pdf.js +24 -65
  124. package/build/ox_modules/module-proxy.js +9 -69
  125. package/build/ox_modules/module-serial.js +8 -33
  126. package/build/ox_modules/module-shell.js +10 -30
  127. package/build/ox_modules/module-soap.js +17 -52
  128. package/build/ox_modules/module-twilio.js +11 -54
  129. package/build/ox_modules/module-utils.js +22 -58
  130. package/build/ox_modules/module-web/commands/alertAccept.js +1 -3
  131. package/build/ox_modules/module-web/commands/alertDismiss.js +1 -3
  132. package/build/ox_modules/module-web/commands/assertAlert.js +1 -7
  133. package/build/ox_modules/module-web/commands/assertExist.js +1 -3
  134. package/build/ox_modules/module-web/commands/assertSelectedLabel.js +1 -5
  135. package/build/ox_modules/module-web/commands/assertSelectedValue.js +1 -4
  136. package/build/ox_modules/module-web/commands/assertText.js +1 -4
  137. package/build/ox_modules/module-web/commands/assertTextNotPresent.js +1 -7
  138. package/build/ox_modules/module-web/commands/assertTextPresent.js +1 -7
  139. package/build/ox_modules/module-web/commands/assertTitle.js +1 -4
  140. package/build/ox_modules/module-web/commands/assertValue.js +1 -4
  141. package/build/ox_modules/module-web/commands/back.js +1 -3
  142. package/build/ox_modules/module-web/commands/clear.js +1 -6
  143. package/build/ox_modules/module-web/commands/click.js +4 -15
  144. package/build/ox_modules/module-web/commands/clickHidden.js +2 -8
  145. package/build/ox_modules/module-web/commands/closeWindow.js +1 -3
  146. package/build/ox_modules/module-web/commands/debug.js +2 -3
  147. package/build/ox_modules/module-web/commands/deleteCookies.js +1 -3
  148. package/build/ox_modules/module-web/commands/deselect.js +1 -3
  149. package/build/ox_modules/module-web/commands/doubleClick.js +3 -10
  150. package/build/ox_modules/module-web/commands/dragAndDrop.js +1 -3
  151. package/build/ox_modules/module-web/commands/execute.js +1 -3
  152. package/build/ox_modules/module-web/commands/fileBrowse.js +4 -11
  153. package/build/ox_modules/module-web/commands/findElement.js +1 -4
  154. package/build/ox_modules/module-web/commands/findElements.js +1 -5
  155. package/build/ox_modules/module-web/commands/fullscreenWindow.js +1 -3
  156. package/build/ox_modules/module-web/commands/getAlertText.js +1 -3
  157. package/build/ox_modules/module-web/commands/getAttribute.js +1 -5
  158. package/build/ox_modules/module-web/commands/getBrowserLogs.js +1 -4
  159. package/build/ox_modules/module-web/commands/getCookies.js +1 -3
  160. package/build/ox_modules/module-web/commands/getCssValue.js +1 -5
  161. package/build/ox_modules/module-web/commands/getElementCount.js +1 -3
  162. package/build/ox_modules/module-web/commands/getHTML.js +1 -3
  163. package/build/ox_modules/module-web/commands/getSource.js +1 -3
  164. package/build/ox_modules/module-web/commands/getText.js +1 -5
  165. package/build/ox_modules/module-web/commands/getTitle.js +1 -3
  166. package/build/ox_modules/module-web/commands/getUrl.js +1 -3
  167. package/build/ox_modules/module-web/commands/getValue.js +1 -6
  168. package/build/ox_modules/module-web/commands/getWindowHandles.js +1 -3
  169. package/build/ox_modules/module-web/commands/getWindowSize.js +1 -3
  170. package/build/ox_modules/module-web/commands/getXMLPageSource.js +1 -6
  171. package/build/ox_modules/module-web/commands/index.js +1 -184
  172. package/build/ox_modules/module-web/commands/isAlertPresent.js +1 -3
  173. package/build/ox_modules/module-web/commands/isChecked.js +1 -3
  174. package/build/ox_modules/module-web/commands/isExist.js +1 -4
  175. package/build/ox_modules/module-web/commands/isInteractable.js +1 -3
  176. package/build/ox_modules/module-web/commands/isSelected.js +1 -3
  177. package/build/ox_modules/module-web/commands/isVisible.js +1 -4
  178. package/build/ox_modules/module-web/commands/makeVisible.js +2 -11
  179. package/build/ox_modules/module-web/commands/maximizeWindow.js +1 -3
  180. package/build/ox_modules/module-web/commands/minimizeWindow.js +1 -3
  181. package/build/ox_modules/module-web/commands/mock.js +1 -3
  182. package/build/ox_modules/module-web/commands/mockClearAll.js +1 -3
  183. package/build/ox_modules/module-web/commands/mockRestoreAll.js +1 -3
  184. package/build/ox_modules/module-web/commands/newWindow.js +1 -3
  185. package/build/ox_modules/module-web/commands/open.js +1 -5
  186. package/build/ox_modules/module-web/commands/pause.js +1 -3
  187. package/build/ox_modules/module-web/commands/point.js +1 -3
  188. package/build/ox_modules/module-web/commands/pointJS.js +2 -9
  189. package/build/ox_modules/module-web/commands/refresh.js +1 -3
  190. package/build/ox_modules/module-web/commands/rightClick.js +3 -9
  191. package/build/ox_modules/module-web/commands/rightClickActions.js +1 -3
  192. package/build/ox_modules/module-web/commands/scrollToElement.js +1 -3
  193. package/build/ox_modules/module-web/commands/select.js +1 -6
  194. package/build/ox_modules/module-web/commands/selectFrame.js +1 -4
  195. package/build/ox_modules/module-web/commands/selectWindow.js +5 -27
  196. package/build/ox_modules/module-web/commands/sendKeys.js +3 -7
  197. package/build/ox_modules/module-web/commands/setAutoWaitForAngular.js +2 -3
  198. package/build/ox_modules/module-web/commands/setTimeout.js +1 -3
  199. package/build/ox_modules/module-web/commands/setWindowSize.js +1 -3
  200. package/build/ox_modules/module-web/commands/takeScreenshot.js +3 -6
  201. package/build/ox_modules/module-web/commands/type.js +1 -6
  202. package/build/ox_modules/module-web/commands/verifyAlert.js +1 -7
  203. package/build/ox_modules/module-web/commands/verifyExist.js +2 -7
  204. package/build/ox_modules/module-web/commands/verifySelectedLabel.js +1 -5
  205. package/build/ox_modules/module-web/commands/verifySelectedValue.js +1 -4
  206. package/build/ox_modules/module-web/commands/verifyText.js +1 -4
  207. package/build/ox_modules/module-web/commands/verifyTextNotPresent.js +1 -7
  208. package/build/ox_modules/module-web/commands/verifyTextPresent.js +1 -7
  209. package/build/ox_modules/module-web/commands/verifyTitle.js +1 -4
  210. package/build/ox_modules/module-web/commands/verifyValue.js +1 -4
  211. package/build/ox_modules/module-web/commands/waitForAngular.js +11 -14
  212. package/build/ox_modules/module-web/commands/waitForExist.js +1 -3
  213. package/build/ox_modules/module-web/commands/waitForInteractable.js +1 -3
  214. package/build/ox_modules/module-web/commands/waitForNotExist.js +1 -9
  215. package/build/ox_modules/module-web/commands/waitForNotText.js +1 -4
  216. package/build/ox_modules/module-web/commands/waitForNotValue.js +1 -4
  217. package/build/ox_modules/module-web/commands/waitForText.js +1 -4
  218. package/build/ox_modules/module-web/commands/waitForValue.js +1 -4
  219. package/build/ox_modules/module-web/commands/waitForVisible.js +1 -3
  220. package/build/ox_modules/module-web/commands/waitForWindow.js +4 -22
  221. package/build/ox_modules/module-web/webdriver/ChromeWDM.js +287 -0
  222. package/build/ox_modules/module-web/webdriver/auto-start.js +25 -0
  223. package/build/ox_modules/module-web.js +112 -232
  224. package/build/ox_modules/module-win/commands/assertText.js +1 -4
  225. package/build/ox_modules/module-win/commands/assertTitle.js +1 -5
  226. package/build/ox_modules/module-win/commands/assertValue.js +9 -17
  227. package/build/ox_modules/module-win/commands/back.js +1 -3
  228. package/build/ox_modules/module-win/commands/clear.js +1 -5
  229. package/build/ox_modules/module-win/commands/click.js +1 -3
  230. package/build/ox_modules/module-win/commands/clickLong.js +1 -3
  231. package/build/ox_modules/module-win/commands/clickMultipleTimes.js +1 -5
  232. package/build/ox_modules/module-win/commands/findElement.js +1 -4
  233. package/build/ox_modules/module-win/commands/findElements.js +1 -5
  234. package/build/ox_modules/module-win/commands/getAppiumLogs.js +1 -3
  235. package/build/ox_modules/module-win/commands/getCurrentWindowHandle.js +1 -3
  236. package/build/ox_modules/module-win/commands/getLocation.js +1 -3
  237. package/build/ox_modules/module-win/commands/getSource.js +1 -3
  238. package/build/ox_modules/module-win/commands/getText.js +1 -5
  239. package/build/ox_modules/module-win/commands/getValue.js +5 -10
  240. package/build/ox_modules/module-win/commands/getWindowHandles.js +1 -3
  241. package/build/ox_modules/module-win/commands/index.js +1 -74
  242. package/build/ox_modules/module-win/commands/isCheckable.js +1 -3
  243. package/build/ox_modules/module-win/commands/isChecked.js +1 -3
  244. package/build/ox_modules/module-win/commands/isClickable.js +1 -3
  245. package/build/ox_modules/module-win/commands/isExist.js +1 -4
  246. package/build/ox_modules/module-win/commands/isSelected.js +1 -3
  247. package/build/ox_modules/module-win/commands/isVisible.js +1 -4
  248. package/build/ox_modules/module-win/commands/open.js +1 -3
  249. package/build/ox_modules/module-win/commands/pause.js +1 -3
  250. package/build/ox_modules/module-win/commands/rightClick.js +1 -3
  251. package/build/ox_modules/module-win/commands/selectWindow.js +1 -16
  252. package/build/ox_modules/module-win/commands/sendKeys.js +1 -5
  253. package/build/ox_modules/module-win/commands/setTimeout.js +1 -3
  254. package/build/ox_modules/module-win/commands/takeScreenshot.js +1 -3
  255. package/build/ox_modules/module-win/commands/tap.js +1 -3
  256. package/build/ox_modules/module-win/commands/type.js +1 -5
  257. package/build/ox_modules/module-win/commands/waitForExist.js +1 -3
  258. package/build/ox_modules/module-win/commands/waitForInteractable.js +1 -5
  259. package/build/ox_modules/module-win/commands/waitForVisible.js +1 -3
  260. package/build/ox_modules/module-win.js +54 -95
  261. package/build/ox_modules/utils.js +91 -79
  262. package/build/ox_reporters/reporter-excel.js +2 -59
  263. package/build/ox_reporters/reporter-html.js +2 -29
  264. package/build/ox_reporters/reporter-json.js +2 -15
  265. package/build/ox_reporters/reporter-junit.js +2 -25
  266. package/build/ox_reporters/reporter-pdf.js +2 -20
  267. package/build/ox_reporters/reporter-rp.js +2 -91
  268. package/build/ox_reporters/reporter-xml.js +2 -18
  269. package/build/ox_services/service-devtools/submodule-network.js +4 -86
  270. package/build/ox_services/service-devtools.js +2 -24
  271. package/build/reporter/FileReporterBase.js +6 -45
  272. package/build/reporter/ReportAggregator.js +7 -121
  273. package/build/reporter/ReporterBase.js +1 -6
  274. package/build/reporter/WebSocketReporter.js +1 -39
  275. package/build/runners/WorkerProcess.js +2 -107
  276. package/build/runners/cucumber/CucumberEventListener.js +4 -29
  277. package/build/runners/cucumber/CucumberReporter.js +2 -57
  278. package/build/runners/cucumber/CucumberWorker.js +3 -69
  279. package/build/runners/cucumber/index.js +2 -31
  280. package/build/runners/cucumber/worker.js +2 -19
  281. package/build/runners/index.js +4 -11
  282. package/build/runners/oxygen/OxygenWorker.js +3 -61
  283. package/build/runners/oxygen/index.js +18 -179
  284. package/build/runners/oxygen/worker.js +3 -27
  285. package/package.json +3 -1
@@ -4,23 +4,14 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.default = void 0;
7
-
8
7
  require("source-map-support/register");
9
-
10
8
  var _suiteResult = _interopRequireDefault(require("../../model/suite-result"));
11
-
12
9
  var _caseResult = _interopRequireDefault(require("../../model/case-result"));
13
-
14
10
  var _stepResult = _interopRequireDefault(require("../../model/step-result"));
15
-
16
11
  var _status = _interopRequireDefault(require("../../model/status"));
17
-
18
12
  var _util = _interopRequireDefault(require("../../lib/util"));
19
-
20
13
  var _helper = _interopRequireDefault(require("../../errors/helper"));
21
-
22
- function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
23
-
14
+ function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
24
15
  class CucumberReporter {
25
16
  constructor(runnerId, options, cucumberEventListener, oxygenEventListener, reportDispatcher, testHooks) {
26
17
  this.runnerId = runnerId;
@@ -44,7 +35,6 @@ class CucumberReporter {
44
35
  this.testHooks = testHooks;
45
36
  this.hookEvents();
46
37
  }
47
-
48
38
  hookEvents() {
49
39
  this.cucumberEventListener.on('feature:before', this.onBeforeFeature);
50
40
  this.cucumberEventListener.on('feature:after', this.onAfterFeature);
@@ -57,25 +47,20 @@ class CucumberReporter {
57
47
  this.oxygenEventListener.on('command:after', this.onAfterOxygenCommand);
58
48
  this.oxygenEventListener.on('log', this.onOxygenLog);
59
49
  }
60
-
61
50
  onBeforeOxygenCommand(e) {}
62
-
63
51
  onAfterOxygenCommand(e) {
64
52
  if (this.currentStep && e.result) {
65
53
  if (!this.currentStep.steps) {
66
54
  this.currentStep.steps = [];
67
55
  }
68
-
69
56
  this.currentStep.steps.push(e.result);
70
57
  }
71
58
  }
72
-
73
59
  onOxygenLog(log) {
74
60
  if (this.currentCase) {
75
61
  if (!this.currentCase.logs) {
76
62
  this.currentCase.logs = [];
77
63
  }
78
-
79
64
  this.currentCase.logs.push({
80
65
  time: log.time,
81
66
  level: log.level.toUpperCase(),
@@ -83,12 +68,10 @@ class CucumberReporter {
83
68
  src: log.src
84
69
  });
85
70
  }
86
-
87
71
  if (this.reportDispatcher.onLogEntry && typeof this.reportDispatcher.onLogEntry === 'function') {
88
72
  this.reportDispatcher.onLogEntry(log.time, log.level, log.message, log.src);
89
73
  }
90
74
  }
91
-
92
75
  onBeforeFeature(uri, feature) {
93
76
  const location = `${uri}:${feature.location.line}`;
94
77
  const suiteResult = this.suites[location] = new _suiteResult.default();
@@ -96,37 +79,29 @@ class CucumberReporter {
96
79
  suiteResult.tags = this.simplifyCucumberTags(feature.tags);
97
80
  suiteResult.location = location;
98
81
  suiteResult.startTime = _util.default.getTimeStamp();
99
-
100
82
  if (typeof this.testHooks.beforeSuite === 'function') {
101
83
  this.testHooks.beforeSuite(this.runnerId, suiteResult);
102
84
  }
103
-
104
85
  if (this.reportDispatcher.onSuiteStart && typeof this.reportDispatcher.onSuiteStart === 'function') {
105
86
  this.reportDispatcher.onSuiteStart(this.runnerId, uri, suiteResult);
106
87
  }
107
88
  }
108
-
109
89
  onAfterFeature(uri, feature) {
110
90
  const location = `${uri}:${feature.location.line}`;
111
91
  const suiteResult = this.suites[location];
112
-
113
92
  if (!suiteResult) {
114
93
  return;
115
94
  }
116
-
117
95
  suiteResult.endTime = _util.default.getTimeStamp();
118
96
  suiteResult.duration = suiteResult.endTime - suiteResult.startTime;
119
97
  suiteResult.status = this.determineSuiteStatus(suiteResult);
120
-
121
98
  if (typeof this.testHooks.afterSuite === 'function') {
122
99
  this.testHooks.afterSuite(this.runnerId, suiteResult);
123
100
  }
124
-
125
101
  if (this.reportDispatcher.onSuiteEnd && typeof this.reportDispatcher.onSuiteEnd === 'function') {
126
102
  this.reportDispatcher.onSuiteEnd(this.runnerId, uri, suiteResult);
127
103
  }
128
104
  }
129
-
130
105
  async onBeforeScenario(uri, feature, scenario) {
131
106
  const suiteId = `${uri}:${feature.location.line}`;
132
107
  const caseLocation = scenario.locations.length > 0 ? scenario.locations[0] : {
@@ -141,50 +116,40 @@ class CucumberReporter {
141
116
  caseResult.location = caseId;
142
117
  caseResult.startTime = _util.default.getTimeStamp();
143
118
  cases.push(caseResult);
144
-
145
119
  if (typeof this.oxygenEventListener.onBeforeCase === 'function') {
146
120
  await this.oxygenEventListener.onBeforeCase();
147
121
  }
148
-
149
122
  if (typeof this.testHooks.beforeCase === 'function') {
150
123
  this.testHooks.beforeCase(this.runnerId, scenario);
151
124
  }
152
-
153
125
  if (this.reportDispatcher.onCaseStart && typeof this.reportDispatcher.onCaseStart === 'function') {
154
126
  this.reportDispatcher.onCaseStart(this.runnerId, uri, caseId, scenario);
155
127
  }
156
128
  }
157
-
158
129
  async onAfterScenario(uri, feature, scenario, sourceLocation) {
159
130
  const suiteId = `${uri}:${feature.location.line}`;
160
131
  const caseId = `${uri}:${sourceLocation.line}`;
161
132
  const suiteResult = this.suites[suiteId];
162
133
  const cases = suiteResult.cases;
163
134
  const caseResult = cases.find(x => x.location === caseId);
164
-
165
135
  if (!caseResult) {
166
136
  return;
167
137
  }
168
-
169
138
  caseResult.endTime = _util.default.getTimeStamp();
170
139
  caseResult.duration = caseResult.endTime - caseResult.startTime;
171
140
  caseResult.status = this.determineCaseStatus(caseResult);
172
141
  caseResult.logs = this.oxygenEventListener.resultStore && this.oxygenEventListener.resultStore.logs ? this.oxygenEventListener.resultStore.logs : [];
173
142
  caseResult.har = this.oxygenEventListener.resultStore && this.oxygenEventListener.resultStore.har ? this.oxygenEventListener.resultStore.har : null;
174
-
175
143
  if (typeof this.oxygenEventListener.onAfterCase === 'function') {
176
144
  await this.oxygenEventListener.onAfterCase();
177
145
  }
178
-
179
146
  if (typeof this.testHooks.afterCase === 'function') {
180
147
  this.testHooks.afterCase(this.runnerId, caseResult);
181
148
  }
182
-
183
149
  if (this.reportDispatcher.onCaseEnd && typeof this.reportDispatcher.onCaseEnd === 'function') {
184
150
  this.reportDispatcher.onCaseEnd(this.runnerId, uri, caseId, caseResult);
185
151
  }
186
152
  }
187
-
188
153
  onBeforeStep(uri, feature, scenario, step, sourceLocation) {
189
154
  const suiteId = `${uri}:${feature.location.line}`;
190
155
  const caseId = `${uri}:${sourceLocation.line}`;
@@ -196,16 +161,13 @@ class CucumberReporter {
196
161
  stepResult.name = step.text;
197
162
  stepResult.startTime = _util.default.getTimeStamp();
198
163
  stepResult.location = `${uri}:${step.location.line}`;
199
-
200
164
  if (typeof this.testHooks.beforeStep === 'function') {
201
165
  this.testHooks.beforeStep(this.runnerId, step);
202
166
  }
203
-
204
167
  if (this.reportDispatcher.onStepStart && typeof this.reportDispatcher.onStepStart === 'function') {
205
168
  this.reportDispatcher.onStepStart(this.runnerId, stepResult);
206
169
  }
207
170
  }
208
-
209
171
  onAfterStep(uri, feature, scenario, step, result, sourceLocation) {
210
172
  const suiteId = `${uri}:${feature.location.line}`;
211
173
  const caseId = `${uri}:${sourceLocation.line}`;
@@ -217,61 +179,44 @@ class CucumberReporter {
217
179
  stepResult.endTime = _util.default.getTimeStamp();
218
180
  stepResult.duration = stepResult.endTime - stepResult.startTime;
219
181
  stepResult.status = result.status;
220
-
221
182
  if (result.exception) {
222
183
  stepResult.failure = _helper.default.getFailureFromError(result.exception);
223
-
224
184
  if (this.currentStep && this.currentStep.location) {
225
185
  stepResult.failure.cucumberLocation = this.currentStep.location;
226
186
  }
227
187
  }
228
-
229
188
  if (typeof this.testHooks.afterStep === 'function') {
230
189
  this.testHooks.afterStep(this.runnerId, stepResult, result.exception);
231
190
  }
232
-
233
191
  if (this.reportDispatcher.onStepEnd && typeof this.reportDispatcher.onStepEnd === 'function') {
234
192
  this.reportDispatcher.onStepEnd(this.runnerId, stepResult);
235
193
  }
236
194
  }
237
-
238
195
  onTestEnd(result) {}
239
-
240
196
  determineCaseStatus(caseResult) {
241
197
  const hasFailedStep = caseResult.steps.some(x => x.status === _status.default.FAILED);
242
-
243
198
  if (hasFailedStep) {
244
199
  return _status.default.FAILED;
245
200
  }
246
-
247
201
  return _status.default.PASSED;
248
202
  }
249
-
250
203
  determineSuiteStatus(suiteResult) {
251
204
  const hasFailedCase = suiteResult.cases.some(x => x.status === _status.default.FAILED);
252
-
253
205
  if (hasFailedCase) {
254
206
  return _status.default.FAILED;
255
207
  }
256
-
257
208
  return _status.default.PASSED;
258
209
  }
259
-
260
210
  simplifyCucumberTags(tags) {
261
211
  if (!Array.isArray(tags) || tags.length == 0) {
262
212
  return tags;
263
213
  }
264
-
265
214
  const simpleTags = [];
266
-
267
215
  for (let tag of tags) {
268
216
  simpleTags.push(tag.name);
269
217
  }
270
-
271
218
  return simpleTags;
272
219
  }
273
-
274
220
  }
275
-
276
221
  exports.default = CucumberReporter;
277
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9ydW5uZXJzL2N1Y3VtYmVyL0N1Y3VtYmVyUmVwb3J0ZXIuanMiXSwibmFtZXMiOlsiQ3VjdW1iZXJSZXBvcnRlciIsImNvbnN0cnVjdG9yIiwicnVubmVySWQiLCJvcHRpb25zIiwiY3VjdW1iZXJFdmVudExpc3RlbmVyIiwib3h5Z2VuRXZlbnRMaXN0ZW5lciIsInJlcG9ydERpc3BhdGNoZXIiLCJ0ZXN0SG9va3MiLCJzdWl0ZXMiLCJjdXJyZW50U3RlcCIsImN1cnJlbnRDYXNlIiwib25CZWZvcmVGZWF0dXJlIiwiYmluZCIsIm9uQWZ0ZXJGZWF0dXJlIiwib25CZWZvcmVTY2VuYXJpbyIsIm9uQWZ0ZXJTY2VuYXJpbyIsIm9uQmVmb3JlU3RlcCIsIm9uQWZ0ZXJTdGVwIiwib25UZXN0RW5kIiwib25CZWZvcmVPeHlnZW5Db21tYW5kIiwib25BZnRlck94eWdlbkNvbW1hbmQiLCJvbk94eWdlbkxvZyIsImhvb2tFdmVudHMiLCJvbiIsImUiLCJyZXN1bHQiLCJzdGVwcyIsInB1c2giLCJsb2ciLCJsb2dzIiwidGltZSIsImxldmVsIiwidG9VcHBlckNhc2UiLCJtc2ciLCJtZXNzYWdlIiwic3JjIiwib25Mb2dFbnRyeSIsInVyaSIsImZlYXR1cmUiLCJsb2NhdGlvbiIsImxpbmUiLCJzdWl0ZVJlc3VsdCIsIlRlc3RTdWl0ZVJlc3VsdCIsIm5hbWUiLCJ0YWdzIiwic2ltcGxpZnlDdWN1bWJlclRhZ3MiLCJzdGFydFRpbWUiLCJveHV0aWwiLCJnZXRUaW1lU3RhbXAiLCJiZWZvcmVTdWl0ZSIsIm9uU3VpdGVTdGFydCIsImVuZFRpbWUiLCJkdXJhdGlvbiIsInN0YXR1cyIsImRldGVybWluZVN1aXRlU3RhdHVzIiwiYWZ0ZXJTdWl0ZSIsIm9uU3VpdGVFbmQiLCJzY2VuYXJpbyIsInN1aXRlSWQiLCJjYXNlTG9jYXRpb24iLCJsb2NhdGlvbnMiLCJsZW5ndGgiLCJjYXNlSWQiLCJjYXNlcyIsImNhc2VSZXN1bHQiLCJUZXN0Q2FzZVJlc3VsdCIsIm9uQmVmb3JlQ2FzZSIsImJlZm9yZUNhc2UiLCJvbkNhc2VTdGFydCIsInNvdXJjZUxvY2F0aW9uIiwiZmluZCIsIngiLCJkZXRlcm1pbmVDYXNlU3RhdHVzIiwicmVzdWx0U3RvcmUiLCJoYXIiLCJvbkFmdGVyQ2FzZSIsImFmdGVyQ2FzZSIsIm9uQ2FzZUVuZCIsInN0ZXAiLCJzdGVwUmVzdWx0IiwiVGVzdFN0ZXBSZXN1bHQiLCJ0ZXh0IiwiYmVmb3JlU3RlcCIsIm9uU3RlcFN0YXJ0Iiwic3RlcExvY2F0aW9uIiwiZXhjZXB0aW9uIiwiZmFpbHVyZSIsImVycm9ySGVscGVyIiwiZ2V0RmFpbHVyZUZyb21FcnJvciIsImN1Y3VtYmVyTG9jYXRpb24iLCJhZnRlclN0ZXAiLCJvblN0ZXBFbmQiLCJoYXNGYWlsZWRTdGVwIiwic29tZSIsIlN0YXR1cyIsIkZBSUxFRCIsIlBBU1NFRCIsImhhc0ZhaWxlZENhc2UiLCJBcnJheSIsImlzQXJyYXkiLCJzaW1wbGVUYWdzIiwidGFnIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7QUFBQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7OztBQUVlLE1BQU1BLGdCQUFOLENBQXVCO0FBQ2xDQyxFQUFBQSxXQUFXLENBQUNDLFFBQUQsRUFBV0MsT0FBWCxFQUFvQkMscUJBQXBCLEVBQTJDQyxtQkFBM0MsRUFBZ0VDLGdCQUFoRSxFQUFrRkMsU0FBbEYsRUFBNkY7QUFDcEcsU0FBS0wsUUFBTCxHQUFnQkEsUUFBaEI7QUFDQSxTQUFLTSxNQUFMLEdBQWMsRUFBZDtBQUNBLFNBQUtDLFdBQUwsR0FBbUIsSUFBbkI7QUFDQSxTQUFLQyxXQUFMLEdBQW1CLElBQW5CO0FBQ0EsU0FBS04scUJBQUwsR0FBNkJBLHFCQUE3QjtBQUNBLFNBQUtDLG1CQUFMLEdBQTJCQSxtQkFBM0I7QUFDQSxTQUFLQyxnQkFBTCxHQUF3QkEsZ0JBQXhCO0FBQ0EsU0FBS0gsT0FBTCxHQUFlQSxPQUFmO0FBRUEsU0FBS1EsZUFBTCxHQUF1QixLQUFLQSxlQUFMLENB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eEQsV0FBVyxDQUFDc0IsS0FBWixDQUFrQjhCLElBQWxCLENBQXVCdEIsQ0FBQyxJQUFJQSxDQUFDLENBQUNsQixNQUFGLEtBQWF5QyxnQkFBT0MsTUFBaEQsQ0FBdEI7O0FBQ0EsUUFBSUUsYUFBSixFQUFtQjtBQUNmLGFBQU9ILGdCQUFPQyxNQUFkO0FBQ0g7O0FBQ0QsV0FBT0QsZ0JBQU9FLE1BQWQ7QUFDSDs7QUFHRG5ELEVBQUFBLG9CQUFvQixDQUFDRCxJQUFELEVBQU87QUFDdkIsUUFBSSxDQUFDc0QsS0FBSyxDQUFDQyxPQUFOLENBQWN2RCxJQUFkLENBQUQsSUFBd0JBLElBQUksQ0FBQ2lCLE1BQUwsSUFBZSxDQUEzQyxFQUE4QztBQUMxQyxhQUFPakIsSUFBUDtBQUNIOztBQUNELFVBQU13RCxVQUFVLEdBQUcsRUFBbkI7O0FBQ0EsU0FBSyxJQUFJQyxHQUFULElBQWdCekQsSUFBaEIsRUFBc0I7QUFDbEJ3RCxNQUFBQSxVQUFVLENBQUN6RSxJQUFYLENBQWdCMEUsR0FBRyxDQUFDMUQsSUFBcEI7QUFDSDs7QUFDRCxXQUFPeUQsVUFBUDtBQUNIOztBQXhQaUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgVGVzdFN1aXRlUmVzdWx0IGZyb20gJy4uLy4uL21vZGVsL3N1aXRlLXJlc3VsdCc7XHJcbmltcG9ydCBUZXN0Q2FzZVJlc3VsdCBmcm9tICcuLi8uLi9tb2RlbC9jYXNlLXJlc3VsdCc7XHJcbmltcG9ydCBUZXN0U3RlcFJlc3VsdCBmcm9tICcuLi8uLi9tb2RlbC9zdGVwLXJlc3VsdCc7XHJcbmltcG9ydCBTdGF0dXMgZnJvbSAnLi4vLi4vbW9kZWwvc3RhdHVzJztcclxuaW1wb3J0IG94dXRpbCBmcm9tICcuLi8uLi9saWIvdXRpbCc7XHJcbmltcG9ydCBlcnJvckhlbHBlciBmcm9tICcuLi8uLi9lcnJvcnMvaGVscGVyJztcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEN1Y3VtYmVyUmVwb3J0ZXIge1xyXG4gICAgY29uc3RydWN0b3IocnVubmVySWQsIG9wdGlvbnMsIGN1Y3VtYmVyRXZlbnRMaXN0ZW5lciwgb3h5Z2VuRXZlbnRMaXN0ZW5lciwgcmVwb3J0RGlzcGF0Y2hlciwgdGVzdEhvb2tzKSB7XHJcbiAgICAgICAgdGhpcy5ydW5uZXJJZCA9IHJ1bm5lcklkO1xyXG4gICAgICAgIHRoaXMuc3VpdGVzID0ge307XHJcbiAgICAgICAgdGhpcy5jdXJyZW50U3RlcCA9IG51bGw7XHJcbiAgICAgICAgdGhpcy5jdXJyZW50Q2FzZSA9IG51bGw7XHJcbiAgICAgICAgdGhpcy5jdWN1bWJlckV2ZW50TGlzdGVuZXIgPSBjdWN1bWJlckV2ZW50TGlzdGVuZXI7XHJcbiAgICAgICAgdGhpcy5veHlnZW5FdmVudExpc3RlbmVyID0gb3h5Z2VuRXZlbnRMaXN0ZW5lcjtcclxuICAgICAgICB0aGlzLnJlcG9ydERpc3BhdGNoZXIgPSByZXBvcnREaXNwYXRjaGVyO1xyXG4gICAgICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7XHJcblxyXG4gICAgICAgIHRoaXMub25CZWZvcmVGZWF0dXJlID0gdGhpcy5vbkJlZm9yZUZlYXR1cmUuYmluZCh0aGlzKTtcclxuICAgICAgICB0aGlzLm9uQWZ0ZXJGZWF0dXJlID0gdGhpcy5vbkFmdGVyRmVhdHVyZS5iaW5kKHRoaXMpO1xyXG4gICAgICAgIHRoaXMub25CZWZvcmVTY2VuYXJpbyA9IHRoaXMub25CZWZvcmVTY2VuYXJpby5iaW5kKHRoaXMpO1xyXG4gICAgICAgIHRoaXMub25BZnRlclNjZW5hcmlvID0gdGhpcy5vbkFmdGVyU2NlbmFyaW8uYmluZCh0aGlzKTtcclxuICAgICAgICB0aGlzLm9uQmVmb3JlU3RlcCA9IHRoaXMub25CZWZvcmVTdGVwLmJpbmQodGhpcyk7XHJcbiAgICAgICAgdGhpcy5vbkFmdGVyU3RlcCA9IHRoaXMub25BZnRlclN0ZXAuYmluZCh0aGlzKTtcclxuICAgICAgICB0aGlzLm9uVGVzdEVuZCA9IHRoaXMub25UZXN0RW5kLmJpbmQodGhpcyk7XHJcbiAgICAgICAgdGhpcy5vbkJlZm9yZU94eWdlbkNvbW1hbmQgPSB0aGlzLm9uQmVmb3JlT3h5Z2VuQ29tbWFuZC5iaW5kKHRoaXMpO1xyXG4gICAgICAgIHRoaXMub25BZnRlck94eWdlbkNvbW1hbmQgPSB0aGlzLm9uQWZ0ZXJPeHlnZW5Db21tYW5kLmJpbmQodGhpcyk7XHJcbiAgICAgICAgdGhpcy5vbk94eWdlbkxvZyA9IHRoaXMub25PeHlnZW5Mb2cuYmluZCh0aGlzKTtcclxuXHJcbiAgICAgICAgdGhpcy50ZXN0SG9va3MgPSB0ZXN0SG9va3M7XHJcblxyXG4gICAgICAgIHRoaXMuaG9va0V2ZW50cygpO1xyXG4gICAgfVxyXG5cclxuICAgIGhvb2tFdmVudHMoKSB7XHJcbiAgICAgICAgdGhpcy5jdWN1bWJlckV2ZW50TGlzdGVuZXIub24oJ2ZlYXR1cmU6YmVmb3JlJywgdGhpcy5vbkJlZm9yZUZlYXR1cmUpO1xyXG4gICAgICAgIHRoaXMuY3VjdW1iZXJFdmVudExpc3RlbmVyLm9uKCdmZWF0dXJlOmFmdGVyJywgdGhpcy5vbkFmdGVyRmVhdHVyZSk7XHJcbiAgICAgICAgdGhpcy5jdWN1bWJlckV2ZW50TGlzdGVuZXIub24oJ3NjZW5hcmlvOmJlZm9yZScsIHRoaXMub25CZWZvcmVTY2VuYXJpbyk7XHJcbiAgICAgICAgdGhpcy5jdWN1bWJlckV2ZW50TGlzdGVuZXIub24oJ3NjZW5hcmlvOmFmdGVyJywgdGhpcy5vbkFmdGVyU2NlbmFyaW8pO1xyXG4gICAgICAgIHRoaXMuY3VjdW1iZXJFdmVudExpc3RlbmVyLm9uKCdzdGVwOmJlZm9yZScsIHRoaXMub25CZWZvcmVTdGVwKTtcclxuICAgICAgICB0aGlzLmN1Y3VtYmVyRXZlbnRMaXN0ZW5lci5vbignc3RlcDphZnRlcicsIHRoaXMub25BZnRlclN0ZXApO1xyXG4gICAgICAgIHRoaXMuY3VjdW1iZXJFdmVudExpc3RlbmVyLm9uKCd0ZXN0OmVuZCcsIHRoaXMub25UZXN0RW5kKTtcclxuXHJcbiAgICAgICAgdGhpcy5veHlnZW5FdmVudExpc3RlbmVyLm9uKCdjb21tYW5kOmJlZm9yZScsIHRoaXMub25CZWZvcmVPeHlnZW5Db21tYW5kKTtcclxuICAgICAgICB0aGlzLm94eWdlbkV2ZW50TGlzdGVuZXIub24oJ2NvbW1hbmQ6YWZ0ZXInLCB0aGlzLm9uQWZ0ZXJPeHlnZW5Db21tYW5kKTtcclxuICAgICAgICB0aGlzLm94eWdlbkV2ZW50TGlzdGVuZXIub24oJ2xvZycsIHRoaXMub25PeHlnZW5Mb2cpO1xyXG4gICAgfVxyXG5cclxuICAgIG9uQmVmb3JlT3h5Z2VuQ29tbWFuZChlKSB7XHJcbiAgICB9XHJcblxyXG4gICAgb25BZnRlck94eWdlbkNvbW1hbmQoZSkge1xyXG4gICAgICAgIGlmICh0aGlzLmN1cnJlbnRTdGVwICYmIGUucmVzdWx0KSB7XHJcbiAgICAgICAgICAgIGlmICghdGhpcy5jdXJyZW50U3RlcC5zdGVwcykge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50U3RlcC5zdGVwcyA9IFtdO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRoaXMuY3VycmVudFN0ZXAuc3RlcHMucHVzaChlLnJlc3VsdCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIG9uT3h5Z2VuTG9nKGxvZykge1xyXG4gICAgICAgIGlmICh0aGlzLmN1cnJlbnRDYXNlKSB7XHJcbiAgICAgICAgICAgIGlmICghdGhpcy5jdXJyZW50Q2FzZS5sb2dzKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnRDYXNlLmxvZ3MgPSBbXTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRDYXNlLmxvZ3MucHVzaCh7XHJcbiAgICAgICAgICAgICAgICB0aW1lOiBsb2cudGltZSxcclxuICAgICAgICAgICAgICAgIGxldmVsOiBsb2cubGV2ZWwudG9VcHBlckNhc2UoKSxcclxuICAgICAgICAgICAgICAgIG1zZzogbG9nLm1lc3NhZ2UsXHJcbiAgICAgICAgICAgICAgICBzcmM6IGxvZy5zcmNcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0aGlzLnJlcG9ydERpc3BhdGNoZXIub25Mb2dFbnRyeSAmJiB0eXBlb2YgdGhpcy5yZXBvcnREaXNwYXRjaGVyLm9uTG9nRW50cnkgPT09ICdmdW5jdGlvbicpIHtcclxuICAgICAgICAgICAgdGhpcy5yZXBvcnREaXNwYXRjaGVyLm9uTG9nRW50cnkobG9nLnRpbWUsIGxvZy5sZXZlbCwgbG9nLm1lc3NhZ2UsIGxvZy5zcmMpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBvbkJlZm9yZUZlYXR1cmUodXJpLCBmZWF0dXJlKSB7XHJcbiAgICAgICAgY29uc3QgbG9jYXRpb24gPSBgJHt1cml9OiR7ZmVhdHVyZS5sb2NhdGlvbi5saW5lfWA7XHJcbiAgICAgICAgY29uc3Qgc3VpdGVSZXN1bHQgPSB0aGlzLnN1aXRlc1tsb2NhdGlvbl0gPSBuZXcgVGVzdFN1aXRlUmVzdWx0KCk7XHJcbiAgICAgICAgc3VpdGVSZXN1bHQubmFtZSA9IGZlYXR1cmUubmFtZTtcclxuICAgICAgICBzdWl0ZVJlc3VsdC50YWdzID0gdGhpcy5zaW1wbGlmeUN1Y3VtYmVyVGFncyhmZWF0dXJlLnRhZ3MpO1xyXG4gICAgICAgIHN1aXRlUmVzdWx0LmxvY2F0aW9uID0gbG9jYXRpb247XHJcbiAgICAgICAgc3VpdGVSZXN1bHQuc3RhcnRUaW1lID0gb3h1dGlsLmdldFRpbWVTdGFtcCgpO1xyXG5cclxuICAgICAgICAvLyBjYWxsIHRlc3QgaG9vayBpZiBkZWZpbmVkXHJcbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLnRlc3RIb29rcy5iZWZvcmVTdWl0ZSA9PT0gJ2Z1bmN0aW9uJykge1xyXG4gICAgICAgICAgICB0aGlzLnRlc3RIb29rcy5iZWZvcmVTdWl0ZSh0aGlzLnJ1bm5lcklkLCBzdWl0ZVJlc3VsdCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIGNhbGwgcmVwb3J0IGdlbmVyYXRvclxyXG4gICAgICAgIGlmICh0aGlzLnJlcG9ydERpc3BhdGNoZXIub25TdWl0ZVN0YXJ0ICYmIHR5cGVvZiB0aGlzLnJlcG9ydERpc3BhdGNoZXIub25TdWl0ZVN0YXJ0ID09PSAnZnVuY3Rpb24nKSB7XHJcbiAgICAgICAgICAgIHRoaXMucmVwb3J0RGlzcGF0Y2hlci5vblN1aXRlU3RhcnQodGhpcy5ydW5uZXJJZCwgdXJpLCBzdWl0ZVJlc3VsdCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgIH1cclxuXHJcbiAgICBvbkFmdGVyRmVhdHVyZSh1cmksIGZlYXR1cmUpIHtcclxuICAgICAgICBjb25zdCBsb2NhdGlvbiA9IGAke3VyaX06JHtmZWF0dXJlLmxvY2F0aW9uLmxpbmV9YDtcclxuICAgICAgICBjb25zdCBzdWl0ZVJlc3VsdCA9IHRoaXMuc3VpdGVzW2xvY2F0aW9uXTtcclxuICAgICAgICBpZiAoIXN1aXRlUmVzdWx0KSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy9kZWxldGUgdGhpcy5zdWl0ZXNbbG9jYXRpb25dXHJcbiAgICAgICAgc3VpdGVSZXN1bHQuZW5kVGltZSA9IG94dXRpbC5nZXRUaW1lU3RhbXAoKTtcclxuICAgICAgICBzdWl0ZVJlc3VsdC5kdXJhdGlvbiA9IHN1aXRlUmVzdWx0LmVuZFRpbWUgLSBzdWl0ZVJlc3VsdC5zdGFydFRpbWU7XHJcbiAgICAgICAgc3VpdGVSZXN1bHQuc3RhdHVzID0gdGhpcy5kZXRlcm1pbmVTdWl0ZVN0YXR1cyhzdWl0ZVJlc3VsdCk7XHJcbiAgICAgICAgLy8gY2FsbCB0ZXN0IGhvb2sgaWYgZGVmaW5lZFxyXG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy50ZXN0SG9va3MuYWZ0ZXJTdWl0ZSA9PT0gJ2Z1bmN0aW9uJykge1xyXG4gICAgICAgICAgICB0aGlzLnRlc3RIb29rcy5hZnRlclN1aXRlKHRoaXMucnVubmVySWQsIHN1aXRlUmVzdWx0KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gY2FsbCByZXBvcnQgZ2VuZXJhdG9yXHJcbiAgICAgICAgaWYgKHRoaXMucmVwb3J0RGlzcGF0Y2hlci5vblN1aXRlRW5kICYmIHR5cGVvZiB0aGlzLnJlcG9ydERpc3BhdGNoZXIub25TdWl0ZUVuZCA9PT0gJ2Z1bmN0aW9uJykge1xyXG4gICAgICAgICAgICB0aGlzLnJlcG9ydERpc3BhdGNoZXIub25TdWl0ZUVuZCh0aGlzLnJ1bm5lcklkLCB1cmksIHN1aXRlUmVzdWx0KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgb25CZWZvcmVTY2VuYXJpbyh1cmksIGZlYXR1cmUsIHNjZW5hcmlvKSB7XHJcbiAgICAgICAgY29uc3Qgc3VpdGVJZCA9IGAke3VyaX06JHtmZWF0dXJlLmxvY2F0aW9uLmxpbmV9YDtcclxuICAgICAgICBjb25zdCBjYXNlTG9jYXRpb24gPSBzY2VuYXJpby5sb2NhdGlvbnMubGVuZ3RoID4gMCA/IHNjZW5hcmlvLmxvY2F0aW9uc1swXSA6IHsgbGluZTogMSB9O1xyXG4gICAgICAgIGNvbnN0IGNhc2VJZCA9IGAke3VyaX06JHtjYXNlTG9jYXRpb24ubGluZX1gO1xyXG4gICAgICAgIGNvbnN0IHN1aXRlUmVzdWx0ID0gdGhpcy5zdWl0ZXNbc3VpdGVJZF07XHJcbiAgICAgICAgY29uc3QgY2FzZXMgPSBzdWl0ZVJlc3VsdC5jYXNlcztcclxuICAgICAgICBjb25zdCBjYXNlUmVzdWx0ID0gdGhpcy5jdXJyZW50Q2FzZSA9IG5ldyBUZXN0Q2FzZVJlc3VsdCgpO1xyXG4gICAgICAgIGNhc2VSZXN1bHQubmFtZSA9IHNjZW5hcmlvLm5hbWU7XHJcbiAgICAgICAgY2FzZVJlc3VsdC50YWdzID0gdGhpcy5zaW1wbGlmeUN1Y3VtYmVyVGFncyhzY2VuYXJpby50YWdzKTtcclxuICAgICAgICBjYXNlUmVzdWx0LmxvY2F0aW9uID0gY2FzZUlkO1xyXG4gICAgICAgIGNhc2VSZXN1bHQuc3RhcnRUaW1lID0gb3h1dGlsLmdldFRpbWVTdGFtcCgpO1xyXG4gICAgICAgIGNhc2VzLnB1c2goY2FzZVJlc3VsdCk7XHJcblxyXG4gICAgICAgIC8vIGNhbGwgb3h5Z2VuIG9uQmVmb3JlQ2FzZSBpZiBkZWZpbmVkXHJcbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLm94eWdlbkV2ZW50TGlzdGVuZXIub25CZWZvcmVDYXNlID09PSAnZnVuY3Rpb24nKSB7XHJcbiAgICAgICAgICAgIGF3YWl0IHRoaXMub3h5Z2VuRXZlbnRMaXN0ZW5lci5vbkJlZm9yZUNhc2UoKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIGNhbGwgdGVzdCBob29rIGlmIGRlZmluZWRcclxuICAgICAgICBpZiAodHlwZW9mIHRoaXMudGVzdEhvb2tzLmJlZm9yZUNhc2UgPT09ICdmdW5jdGlvbicpIHtcclxuICAgICAgICAgICAgdGhpcy50ZXN0SG9va3MuYmVmb3JlQ2FzZSh0aGlzLnJ1bm5lcklkLCBzY2VuYXJpbyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIGNhbGwgcmVwb3J0IGdlbmVyYXRvclxyXG4gICAgICAgIGlmICh0aGlzLnJlcG9ydERpc3BhdGNoZXIub25DYXNlU3RhcnQgJiYgdHlwZW9mIHRoaXMucmVwb3J0RGlzcGF0Y2hlci5vbkNhc2VTdGFydCA9PT0gJ2Z1bmN0aW9uJykge1xyXG4gICAgICAgICAgICB0aGlzLnJlcG9ydERpc3BhdGNoZXIub25DYXNlU3RhcnQodGhpcy5ydW5uZXJJZCwgdXJpLCBjYXNlSWQsIHNjZW5hcmlvKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgb25BZnRlclNjZW5hcmlvKHVyaSwgZmVhdHVyZSwgc2NlbmFyaW8sIHNvdXJjZUxvY2F0aW9uKSB7XHJcbiAgICAgICAgY29uc3Qgc3VpdGVJZCA9IGAke3VyaX06JHtmZWF0dXJlLmxvY2F0aW9uLmxpbmV9YDtcclxuICAgICAgICBjb25zdCBjYXNlSWQgPSBgJHt1cml9OiR7c291cmNlTG9jYXRpb24ubGluZX1gO1xyXG4gICAgICAgIGNvbnN0IHN1aXRlUmVzdWx0ID0gdGhpcy5zdWl0ZXNbc3VpdGVJZF07XHJcbiAgICAgICAgY29uc3QgY2FzZXMgPSBzdWl0ZVJlc3VsdC5jYXNlcztcclxuICAgICAgICBjb25zdCBjYXNlUmVzdWx0ID0gY2FzZXMuZmluZCh4ID0+IHgubG9jYXRpb24gPT09IGNhc2VJZCk7XHJcbiAgICAgICAgaWYgKCFjYXNlUmVzdWx0KSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgY2FzZVJlc3VsdC5lbmRUaW1lID0gb3h1dGlsLmdldFRpbWVTdGFtcCgpO1xyXG4gICAgICAgIGNhc2VSZXN1bHQuZHVyYXRpb24gPSBjYXNlUmVzdWx0LmVuZFRpbWUgLSBjYXNlUmVzdWx0LnN0YXJ0VGltZTtcclxuICAgICAgICBjYXNlUmVzdWx0LnN0YXR1cyA9IHRoaXMuZGV0ZXJtaW5lQ2FzZVN0YXR1cyhjYXNlUmVzdWx0KTtcclxuICAgICAgICBjYXNlUmVzdWx0LmxvZ3MgPSB0aGlzLm94eWdlbkV2ZW50TGlzdGVuZXIucmVzdWx0U3RvcmUgJiYgdGhpcy5veHlnZW5FdmVudExpc3RlbmVyLnJlc3VsdFN0b3JlLmxvZ3MgPyB0aGlzLm94eWdlbkV2ZW50TGlzdGVuZXIucmVzdWx0U3RvcmUubG9ncyA6IFtdO1xyXG4gICAgICAgIGNhc2VSZXN1bHQuaGFyID0gdGhpcy5veHlnZW5FdmVudExpc3RlbmVyLnJlc3VsdFN0b3JlICYmIHRoaXMub3h5Z2VuRXZlbnRMaXN0ZW5lci5yZXN1bHRTdG9yZS5oYXIgPyB0aGlzLm94eWdlbkV2ZW50TGlzdGVuZXIucmVzdWx0U3RvcmUuaGFyIDogbnVsbDtcclxuXHJcbiAgICAgICAgLy8gY2FsbCBveHlnZW4gb25BZnRlckNhc2UgaWYgZGVmaW5lZFxyXG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5veHlnZW5FdmVudExpc3RlbmVyLm9uQWZ0ZXJDYXNlID09PSAnZnVuY3Rpb24nKSB7XHJcbiAgICAgICAgICAgIGF3YWl0IHRoaXMub3h5Z2VuRXZlbnRMaXN0ZW5lci5vbkFmdGVyQ2FzZSgpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gY2FsbCB0ZXN0IGhvb2sgaWYgZGVmaW5lZFxyXG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy50ZXN0SG9va3MuYWZ0ZXJDYXNlID09PSAnZnVuY3Rpb24nKSB7XHJcbiAgICAgICAgICAgIHRoaXMudGVzdEhvb2tzLmFmdGVyQ2FzZSh0aGlzLnJ1bm5lcklkLCBjYXNlUmVzdWx0KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gY2FsbCByZXBvcnQgZ2VuZXJhdG9yXHJcbiAgICAgICAgaWYgKHRoaXMucmVwb3J0RGlzcGF0Y2hlci5vbkNhc2VFbmQgJiYgdHlwZW9mIHRoaXMucmVwb3J0RGlzcGF0Y2hlci5vbkNhc2VFbmQgPT09ICdmdW5jdGlvbicpIHtcclxuICAgICAgICAgICAgdGhpcy5yZXBvcnREaXNwYXRjaGVyLm9uQ2FzZUVuZCh0aGlzLnJ1bm5lcklkLCB1cmksIGNhc2VJZCwgY2FzZVJlc3VsdCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIG9uQmVmb3JlU3RlcCh1cmksIGZlYXR1cmUsIHNjZW5hcmlvLCBzdGVwLCBzb3VyY2VMb2NhdGlvbikge1xyXG4gICAgICAgIGNvbnN0IHN1aXRlSWQgPSBgJHt1cml9OiR7ZmVhdHVyZS5sb2NhdGlvbi5saW5lfWA7XHJcbiAgICAgICAgY29uc3QgY2FzZUlkID0gYCR7dXJpfToke3NvdXJjZUxvY2F0aW9uLmxpbmV9YDtcclxuICAgICAgICBjb25zdCBzdWl0ZVJlc3VsdCA9IHRoaXMuc3VpdGVzW3N1aXRlSWRdO1xyXG4gICAgICAgIGNvbnN0IGNhc2VzID0gc3VpdGVSZXN1bHQuY2FzZXM7XHJcbiAgICAgICAgY29uc3QgY2FzZVJlc3VsdCA9IGNhc2VzLmZpbmQoeCA9PiB4LmxvY2F0aW9uID09PSBjYXNlSWQpO1xyXG4gICAgICAgIGNvbnN0IHN0ZXBSZXN1bHQgPSB0aGlzLmN1cnJlbnRTdGVwID0gbmV3IFRlc3RTdGVwUmVzdWx0KCk7XHJcbiAgICAgICAgY2FzZVJlc3VsdC5zdGVwcy5wdXNoKHN0ZXBSZXN1bHQpO1xyXG5cclxuICAgICAgICBzdGVwUmVzdWx0Lm5hbWUgPSBzdGVwLnRleHQ7XHJcbiAgICAgICAgc3RlcFJlc3VsdC5zdGFydFRpbWUgPSBveHV0aWwuZ2V0VGltZVN0YW1wKCk7XHJcbiAgICAgICAgc3RlcFJlc3VsdC5sb2NhdGlvbiA9IGAke3VyaX06JHtzdGVwLmxvY2F0aW9uLmxpbmV9YDtcclxuICAgICAgICAvLyBjYWxsIHRlc3QgaG9vayBpZiBkZWZpbmVkXHJcbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLnRlc3RIb29rcy5iZWZvcmVTdGVwID09PSAnZnVuY3Rpb24nKSB7XHJcbiAgICAgICAgICAgIHRoaXMudGVzdEhvb2tzLmJlZm9yZVN0ZXAodGhpcy5ydW5uZXJJZCwgc3RlcCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIGNhbGwgcmVwb3J0IGdlbmVyYXRvclxyXG4gICAgICAgIGlmICh0aGlzLnJlcG9ydERpc3BhdGNoZXIub25TdGVwU3RhcnQgJiYgdHlwZW9mIHRoaXMucmVwb3J0RGlzcGF0Y2hlci5vblN0ZXBTdGFydCA9PT0gJ2Z1bmN0aW9uJykge1xyXG4gICAgICAgICAgICB0aGlzLnJlcG9ydERpc3BhdGNoZXIub25TdGVwU3RhcnQodGhpcy5ydW5uZXJJZCwgc3RlcFJlc3VsdCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIG9uQWZ0ZXJTdGVwKHVyaSwgZmVhdHVyZSwgc2NlbmFyaW8sIHN0ZXAsIHJlc3VsdCwgc291cmNlTG9jYXRpb24pIHtcclxuICAgICAgICBjb25zdCBzdWl0ZUlkID0gYCR7dXJpfToke2ZlYXR1cmUubG9jYXRpb24ubGluZX1gO1xyXG4gICAgICAgIGNvbnN0IGNhc2VJZCA9IGAke3VyaX06JHtzb3VyY2VMb2NhdGlvbi5saW5lfWA7XHJcbiAgICAgICAgY29uc3Qgc3VpdGVSZXN1bHQgPSB0aGlzLnN1aXRlc1tzdWl0ZUlkXTtcclxuICAgICAgICBjb25zdCBjYXNlcyA9IHN1aXRlUmVzdWx0LmNhc2VzO1xyXG4gICAgICAgIGNvbnN0IGNhc2VSZXN1bHQgPSBjYXNlcy5maW5kKHggPT4geC5sb2NhdGlvbiA9PT0gY2FzZUlkKTtcclxuICAgICAgICBjb25zdCBzdGVwTG9jYXRpb24gPSBgJHt1cml9OiR7c3RlcC5sb2NhdGlvbi5saW5lfWA7XHJcbiAgICAgICAgY29uc3Qgc3RlcFJlc3VsdCA9IGNhc2VSZXN1bHQuc3RlcHMuZmluZCh4ID0+IHgubG9jYXRpb24gPT09IHN0ZXBMb2NhdGlvbik7XHJcblxyXG4gICAgICAgIHN0ZXBSZXN1bHQuZW5kVGltZSA9IG94dXRpbC5nZXRUaW1lU3RhbXAoKTtcclxuICAgICAgICBzdGVwUmVzdWx0LmR1cmF0aW9uID0gc3RlcFJlc3VsdC5lbmRUaW1lIC0gc3RlcFJlc3VsdC5zdGFydFRpbWU7XHJcbiAgICAgICAgc3RlcFJlc3VsdC5zdGF0dXMgPSByZXN1bHQuc3RhdHVzO1xyXG4gICAgICAgIC8vIGdldCBmYWlsdXJlIGRldGFpbHMgaWYgZXJyb3Igd2FzIHRocm93biBpbiB0aGUgc3RlcFxyXG4gICAgICAgIGlmIChyZXN1bHQuZXhjZXB0aW9uKSB7XHJcbiAgICAgICAgICAgIHN0ZXBSZXN1bHQuZmFpbHVyZSA9IGVycm9ySGVscGVyLmdldEZhaWx1cmVGcm9tRXJyb3IocmVzdWx0LmV4Y2VwdGlvbik7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmN1cnJlbnRTdGVwICYmIHRoaXMuY3VycmVudFN0ZXAubG9jYXRpb24pIHtcclxuICAgICAgICAgICAgICAgIHN0ZXBSZXN1bHQuZmFpbHVyZS5jdWN1bWJlckxvY2F0aW9uID0gdGhpcy5jdXJyZW50U3RlcC5sb2NhdGlvbjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBjYWxsIHRlc3QgaG9vayBpZiBkZWZpbmVkXHJcbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLnRlc3RIb29rcy5hZnRlclN0ZXAgPT09ICdmdW5jdGlvbicpIHtcclxuICAgICAgICAgICAgdGhpcy50ZXN0SG9va3MuYWZ0ZXJTdGVwKHRoaXMucnVubmVySWQsIHN0ZXBSZXN1bHQsIHJlc3VsdC5leGNlcHRpb24pO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBjYWxsIHJlcG9ydCBnZW5lcmF0b3JcclxuICAgICAgICBpZiAodGhpcy5yZXBvcnREaXNwYXRjaGVyLm9uU3RlcEVuZCAmJiB0eXBlb2YgdGhpcy5yZXBvcnREaXNwYXRjaGVyLm9uU3RlcEVuZCA9PT0gJ2Z1bmN0aW9uJykge1xyXG4gICAgICAgICAgICB0aGlzLnJlcG9ydERpc3BhdGNoZXIub25TdGVwRW5kKHRoaXMucnVubmVySWQsIHN0ZXBSZXN1bHQpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBvblRlc3RFbmQocmVzdWx0KSB7XHJcblxyXG4gICAgfVxyXG5cclxuICAgIGRldGVybWluZUNhc2VTdGF0dXMoY2FzZVJlc3VsdCkge1xyXG4gICAgICAgIGNvbnN0IGhhc0ZhaWxlZFN0ZXAgPSBjYXNlUmVzdWx0LnN0ZXBzLnNvbWUoeCA9PiB4LnN0YXR1cyA9PT0gU3RhdHVzLkZBSUxFRCk7XHJcbiAgICAgICAgaWYgKGhhc0ZhaWxlZFN0ZXApIHtcclxuICAgICAgICAgICAgcmV0dXJuIFN0YXR1cy5GQUlMRUQ7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBTdGF0dXMuUEFTU0VEO1xyXG4gICAgfVxyXG5cclxuICAgIGRldGVybWluZVN1aXRlU3RhdHVzKHN1aXRlUmVzdWx0KSB7XHJcbiAgICAgICAgY29uc3QgaGFzRmFpbGVkQ2FzZSA9IHN1aXRlUmVzdWx0LmNhc2VzLnNvbWUoeCA9PiB4LnN0YXR1cyA9PT0gU3RhdHVzLkZBSUxFRCk7XHJcbiAgICAgICAgaWYgKGhhc0ZhaWxlZENhc2UpIHtcclxuICAgICAgICAgICAgcmV0dXJuIFN0YXR1cy5GQUlMRUQ7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBTdGF0dXMuUEFTU0VEO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIHJlbW92ZXMgYWxsIHVubmVjZXNzYXJ5IG1ldGFkYXRhIGZyb20gQ3VjdW1iZXIgdGFncywgcmV0dXJuaW5nIGEgc2ltcGxlIGFycmF5IG9mIHRhZyBuYW1lc1xyXG4gICAgc2ltcGxpZnlDdWN1bWJlclRhZ3ModGFncykge1xyXG4gICAgICAgIGlmICghQXJyYXkuaXNBcnJheSh0YWdzKSB8fCB0YWdzLmxlbmd0aCA9PSAwKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0YWdzO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBzaW1wbGVUYWdzID0gW107XHJcbiAgICAgICAgZm9yIChsZXQgdGFnIG9mIHRhZ3MpIHtcclxuICAgICAgICAgICAgc2ltcGxlVGFncy5wdXNoKHRhZy5uYW1lKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHNpbXBsZVRhZ3M7XHJcbiAgICB9XHJcbn0iXX0=
222
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfc3VpdGVSZXN1bHQiLCJfaW50ZXJvcFJlcXVpcmVEZWZhdWx0IiwicmVxdWlyZSIsIl9jYXNlUmVzdWx0IiwiX3N0ZXBSZXN1bHQiLCJfc3RhdHVzIiwiX3V0aWwiLCJfaGVscGVyIiwiZSIsIl9fZXNNb2R1bGUiLCJkZWZhdWx0IiwiQ3VjdW1iZXJSZXBvcnRlciIsImNvbnN0cnVjdG9yIiwicnVubmVySWQiLCJvcHRpb25zIiwiY3VjdW1iZXJFdmVudExpc3RlbmVyIiwib3h5Z2VuRXZlbnRMaXN0ZW5lciIsInJlcG9ydERpc3BhdGNoZXIiLCJ0ZXN0SG9va3MiLCJzdWl0ZXMiLCJjdXJyZW50U3RlcCIsImN1cnJlbnRDYXNlIiwib25CZWZvcmVGZWF0dXJlIiwiYmluZCIsIm9uQWZ0ZXJGZWF0dXJlIiwib25CZWZvcmVTY2VuYXJpbyIsIm9uQWZ0ZXJTY2VuYXJpbyIsIm9uQmVmb3JlU3RlcCIsIm9uQWZ0ZXJTdGVwIiwib25UZXN0RW5kIiwib25CZWZvcmVPeHlnZW5Db21tYW5kIiwib25BZnRlck94eWdlbkNvbW1hbmQiLCJvbk94eWdlbkxvZyIsImhvb2tFdmVudHMiLCJvbiIsInJlc3VsdCIsInN0ZXBzIiwicHVzaCIsImxvZyIsImxvZ3MiLCJ0aW1lIiwibGV2ZWwiLCJ0b1VwcGVyQ2FzZSIsIm1zZyIsIm1lc3NhZ2UiLCJzcmMiLCJvbkxvZ0VudHJ5IiwidXJpIiwiZmVhdHVyZSIsImxvY2F0aW9uIiwibGluZSIsInN1aXRlUmVzdWx0IiwiVGVzdFN1aXRlUmVzdWx0IiwibmFtZSIsInRhZ3MiLCJzaW1wbGlmeUN1Y3VtYmVyVGFncyIsInN0YXJ0VGltZSIsIm94dXRpbCIsImdldFRpbWVTdGFtcCIsImJlZm9yZVN1aXRlIiwib25TdWl0ZVN0YXJ0IiwiZW5kVGltZSIsImR1cmF0aW9uIiwic3RhdHVzIiwiZGV0ZXJtaW5lU3VpdGVTdGF0dXMiLCJhZnRlclN1aXRlIiwib25TdWl0ZUVuZCIsInNjZW5hcmlvIiwic3VpdGVJZCIsImNhc2VMb2NhdGlvbiIsImxvY2F0aW9ucyIsImxlbmd0aCIsImNhc2VJZCIsImNhc2VzIiwiY2FzZVJlc3VsdCIsIlRlc3RDYXNlUmVzdWx0Iiwib25CZWZvcmVDYXNlIiwiYmVmb3JlQ2FzZSIsIm9uQ2FzZVN0YXJ0Iiwic291cmNlTG9jYXRpb24iLCJmaW5kIiwieCIsImRldGVybWluZUNhc2VTdGF0dXMiLCJyZXN1bHRTdG9yZSIsImhhciIsIm9uQWZ0ZXJDYXNlIiwiYWZ0ZXJDYXNlIiwib25DYXNlRW5kIiwic3RlcCIsInN0ZXBSZXN1bHQiLCJUZXN0U3RlcFJlc3VsdCIsInRleHQiLCJiZWZvcmVTdGVwIiwib25TdGVwU3RhcnQiLCJzdGVwTG9jYXRpb24iLCJleGNlcHRpb24iLCJmYWlsdXJlIiwiZXJyb3JIZWxwZXIiLCJnZXRGYWlsdXJlRnJvbUVycm9yIiwiY3VjdW1iZXJMb2NhdGlvbiIsImFmdGVyU3RlcCIsIm9uU3RlcEVuZCIsImhhc0ZhaWxlZFN0ZXAiLCJzb21lIiwiU3RhdHVzIiwiRkFJTEVEIiwiUEFTU0VEIiwiaGFzRmFpbGVkQ2FzZSIsIkFycmF5IiwiaXNBcnJheSIsInNpbXBsZVRhZ3MiLCJ0YWciLCJleHBvcnRzIl0sInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3J1bm5lcnMvY3VjdW1iZXIvQ3VjdW1iZXJSZXBvcnRlci5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgVGVzdFN1aXRlUmVzdWx0IGZyb20gJy4uLy4uL21vZGVsL3N1aXRlLXJlc3VsdCc7XHJcbmltcG9ydCBUZXN0Q2FzZVJlc3VsdCBmcm9tICcuLi8uLi9tb2RlbC9jYXNlLXJlc3VsdCc7XHJcbmltcG9ydCBUZXN0U3RlcFJlc3VsdCBmcm9tICcuLi8uLi9tb2RlbC9zdGVwLXJlc3VsdCc7XHJcbmltcG9ydCBTdGF0dXMgZnJvbSAnLi4vLi4vbW9kZWwvc3RhdHVzJztcclxuaW1wb3J0IG94dXRpbCBmcm9tICcuLi8uLi9saWIvdXRpbCc7XHJcbmltcG9ydCBlcnJvckhlbHBlciBmcm9tICcuLi8uLi9lcnJvcnMvaGVscGVyJztcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEN1Y3VtYmVyUmVwb3J0ZXIge1xyXG4gICAgY29uc3RydWN0b3IocnVubmVySWQsIG9wdGlvbnMsIGN1Y3VtYmVyRXZlbnRMaXN0ZW5lciwgb3h5Z2VuRXZlbnRMaXN0ZW5lciwgcmVwb3J0RGlzcGF0Y2hlciwgdGVzdEhvb2tzKSB7XHJcbiAgICAgICAgdGhpcy5ydW5uZXJJZCA9IHJ1bm5lcklkO1xyXG4gICAgICAgIHRoaXMuc3VpdGVzID0ge307XHJcbiAgICAgICAgdGhpcy5jdXJyZW50U3RlcCA9IG51bGw7XHJcbiAgICAgICAgdGhpcy5jdXJyZW50Q2FzZSA9IG51bGw7XHJcbiAgICAgICAgdGhpcy5jdWN1bWJlckV2ZW50TGlzdGVuZXIgPSBjdWN1bWJlckV2ZW50TGlzdGVuZXI7XHJcbiAgICAgICAgdGhpcy5veHlnZW5FdmVudExpc3RlbmVyID0gb3h5Z2VuRXZlbnRMaXN0ZW5lcjtcclxuICAgICAgICB0aGlzLnJlcG9ydERpc3BhdGNoZXIgPSByZXBvcnREaXNwYXRjaGVyO1xyXG4gICAgICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7XHJcblxyXG4gICAgICAgIHRoaXMub25CZWZvcmVGZWF0dXJlID0gdGhpcy5vbkJlZm9yZUZlYXR1cmUuYmluZCh0aGlzKTtcclxuICAgICAgICB0aGlzLm9uQWZ0ZXJGZWF0dXJlID0gdGhpcy5vbkFmdGVyRmVhdHVyZS5iaW5kKHRoaXMpO1xyXG4gICAgICAgIHRoaXMub25CZWZvcmVTY2VuYXJpbyA9IHRoaXMub25CZWZvcmVTY2VuYXJpby5iaW5kKHRoaXMpO1xyXG4gICAgICAgIHRoaXMub25BZnRlclNjZW5hcmlvID0gdGhpcy5vbkFmdGVyU2NlbmFyaW8uYmluZCh0aGlzKTtcclxuICAgICAgICB0aGlzLm9uQmVmb3JlU3RlcCA9IHRoaXMub25CZWZvcmVTdGVwLmJpbmQodGhpcyk7XHJcbiAgICAgICAgdGhpcy5vbkFmdGVyU3RlcCA9IHRoaXMub25BZnRlclN0ZXAuYmluZCh0aGlzKTtcclxuICAgICAgICB0aGlzLm9uVGVzdEVuZCA9IHRoaXMub25UZXN0RW5kLmJpbmQodGhpcyk7XHJcbiAgICAgICAgdGhpcy5vbkJlZm9yZU94eWdlbkNvbW1hbmQgPSB0aGlzLm9uQmVmb3JlT3h5Z2VuQ29tbWFuZC5iaW5kKHRoaXMpO1xyXG4gICAgICAgIHRoaXMub25BZnRlck94eWdlbkNvbW1hbmQgPSB0aGlzLm9uQWZ0ZXJPeHlnZW5Db21tYW5kLmJpbmQodGhpcyk7XHJcbiAgICAgICAgdGhpcy5vbk94eWdlbkxvZyA9IHRoaXMub25PeHlnZW5Mb2cuYmluZCh0aGlzKTtcclxuXHJcbiAgICAgICAgdGhpcy50ZXN0SG9va3MgPSB0ZXN0SG9va3M7XHJcblxyXG4gICAgICAgIHRoaXMuaG9va0V2ZW50cygpO1xyXG4gICAgfVxyXG5cclxuICAgIGhvb2tFdmVudHMoKSB7XHJcbiAgICAgICAgdGhpcy5jdWN1bWJlckV2ZW50TGlzdGVuZXIub24oJ2ZlYXR1cmU6YmVmb3JlJywgdGhpcy5vbkJlZm9yZUZlYXR1cmUpO1xyXG4gICAgICAgIHRoaXMuY3VjdW1iZXJFdmVudExpc3RlbmVyLm9uKCdmZWF0dXJlOmFmdGVyJywgdGhpcy5vbkFmdGVyRmVhdHVyZSk7XHJcbiAgICAgICAgdGhpcy5jdWN1bWJlckV2ZW50TGlzdGVuZXIub24oJ3NjZW5hcmlvOmJlZm9yZScsIHRoaXMub25CZWZvcmVTY2VuYXJpbyk7XHJcbiAgICAgICAgdGhpcy5jdWN1bWJlckV2ZW50TGlzdGVuZXIub24oJ3NjZW5hcmlvOmFmdGVyJywgdGhpcy5vbkFmdGVyU2NlbmFyaW8pO1xyXG4gICAgICAgIHRoaXMuY3VjdW1iZXJFdmVudExpc3RlbmVyLm9uKCdzdGVwOmJlZm9yZScsIHRoaXMub25CZWZvcmVTdGVwKTtcclxuICAgICAgICB0aGlzLmN1Y3VtYmVyRXZlbnRMaXN0ZW5lci5vbignc3RlcDphZnRlcicsIHRoaXMub25BZnRlclN0ZXApO1xyXG4gICAgICAgIHRoaXMuY3VjdW1iZXJFdmVudExpc3RlbmVyLm9uKCd0ZXN0OmVuZCcsIHRoaXMub25UZXN0RW5kKTtcclxuXHJcbiAgICAgICAgdGhpcy5veHlnZW5FdmVudExpc3RlbmVyLm9uKCdjb21tYW5kOmJlZm9yZScsIHRoaXMub25CZWZvcmVPeHlnZW5Db21tYW5kKTtcclxuICAgICAgICB0aGlzLm94eWdlbkV2ZW50TGlzdGVuZXIub24oJ2NvbW1hbmQ6YWZ0ZXInLCB0aGlzLm9uQWZ0ZXJPeHlnZW5Db21tYW5kKTtcclxuICAgICAgICB0aGlzLm94eWdlbkV2ZW50TGlzdGVuZXIub24oJ2xvZycsIHRoaXMub25PeHlnZW5Mb2cpO1xyXG4gICAgfVxyXG5cclxuICAgIG9uQmVmb3JlT3h5Z2VuQ29tbWFuZChlKSB7XHJcbiAgICB9XHJcblxyXG4gICAgb25BZnRlck94eWdlbkNvbW1hbmQoZSkge1xyXG4gICAgICAgIGlmICh0aGlzLmN1cnJlbnRTdGVwICYmIGUucmVzdWx0KSB7XHJcbiAgICAgICAgICAgIGlmICghdGhpcy5jdXJyZW50U3RlcC5zdGVwcykge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50U3RlcC5zdGVwcyA9IFtdO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRoaXMuY3VycmVudFN0ZXAuc3RlcHMucHVzaChlLnJlc3VsdCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIG9uT3h5Z2VuTG9nKGxvZykge1xyXG4gICAgICAgIGlmICh0aGlzLmN1cnJlbnRDYXNlKSB7XHJcbiAgICAgICAgICAgIGlmICghdGhpcy5jdXJyZW50Q2FzZS5sb2dzKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnRDYXNlLmxvZ3MgPSBbXTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRDYXNlLmxvZ3MucHVzaCh7XHJcbiAgICAgICAgICAgICAgICB0aW1lOiBsb2cudGltZSxcclxuICAgICAgICAgICAgICAgIGxldmVsOiBsb2cubGV2ZWwudG9VcHBlckNhc2UoKSxcclxuICAgICAgICAgICAgICAgIG1zZzogbG9nLm1lc3NhZ2UsXHJcbiAgICAgICAgICAgICAgICBzcmM6IGxvZy5zcmNcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0aGlzLnJlcG9ydERpc3BhdGNoZXIub25Mb2dFbnRyeSAmJiB0eXBlb2YgdGhpcy5yZXBvcnREaXNwYXRjaGVyLm9uTG9nRW50cnkgPT09ICdmdW5jdGlvbicpIHtcclxuICAgICAgICAgICAgdGhpcy5yZXBvcnREaXNwYXRjaGVyLm9uTG9nRW50cnkobG9nLnRpbWUsIGxvZy5sZXZlbCwgbG9nLm1lc3NhZ2UsIGxvZy5zcmMpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBvbkJlZm9yZUZlYXR1cmUodXJpLCBmZWF0dXJlKSB7XHJcbiAgICAgICAgY29uc3QgbG9jYXRpb24gPSBgJHt1cml9OiR7ZmVhdHVyZS5sb2NhdGlvbi5saW5lfWA7XHJcbiAgICAgICAgY29uc3Qgc3VpdGVSZXN1bHQgPSB0aGlzLnN1aXRlc1tsb2NhdGlvbl0gPSBuZXcgVGVzdFN1aXRlUmVzdWx0KCk7XHJcbiAgICAgICAgc3VpdGVSZXN1bHQubmFtZSA9IGZlYXR1cmUubmFtZTtcclxuICAgICAgICBzdWl0ZVJlc3VsdC50YWdzID0gdGhpcy5zaW1wbGlmeUN1Y3VtYmVyVGFncyhmZWF0dXJlLnRhZ3MpO1xyXG4gICAgICAgIHN1aXRlUmVzdWx0LmxvY2F0aW9uID0gbG9jYXRpb247XHJcbiAgICAgICAgc3VpdGVSZXN1bHQuc3RhcnRUaW1lID0gb3h1dGlsLmdldFRpbWVTdGFtcCgpO1xyXG5cclxuICAgICAgICAvLyBjYWxsIHRlc3QgaG9vayBpZiBkZWZpbmVkXHJcbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLnRlc3RIb29rcy5iZWZvcmVTdWl0ZSA9PT0gJ2Z1bmN0aW9uJykge1xyXG4gICAgICAgICAgICB0aGlzLnRlc3RIb29rcy5iZWZvcmVTdWl0ZSh0aGlzLnJ1bm5lcklkLCBzdWl0ZVJlc3VsdCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIGNhbGwgcmVwb3J0IGdlbmVyYXRvclxyXG4gICAgICAgIGlmICh0aGlzLnJlcG9ydERpc3BhdGNoZXIub25TdWl0ZVN0YXJ0ICYmIHR5cGVvZiB0aGlzLnJlcG9ydERpc3BhdGNoZXIub25TdWl0ZVN0YXJ0ID09PSAnZnVuY3Rpb24nKSB7XHJcbiAgICAgICAgICAgIHRoaXMucmVwb3J0RGlzcGF0Y2hlci5vblN1aXRlU3RhcnQodGhpcy5ydW5uZXJJZCwgdXJpLCBzdWl0ZVJlc3VsdCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgIH1cclxuXHJcbiAgICBvbkFmdGVyRmVhdHVyZSh1cmksIGZlYXR1cmUpIHtcclxuICAgICAgICBjb25zdCBsb2NhdGlvbiA9IGAke3VyaX06JHtmZWF0dXJlLmxvY2F0aW9uLmxpbmV9YDtcclxuICAgICAgICBjb25zdCBzdWl0ZVJlc3VsdCA9IHRoaXMuc3VpdGVzW2xvY2F0aW9uXTtcclxuICAgICAgICBpZiAoIXN1aXRlUmVzdWx0KSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy9kZWxldGUgdGhpcy5zdWl0ZXNbbG9jYXRpb25dXHJcbiAgICAgICAgc3VpdGVSZXN1bHQuZW5kVGltZSA9IG94dXRpbC5nZXRUaW1lU3RhbXAoKTtcclxuICAgICAgICBzdWl0ZVJlc3VsdC5kdXJhdGlvbiA9IHN1aXRlUmVzdWx0LmVuZFRpbWUgLSBzdWl0ZVJlc3VsdC5zdGFydFRpbWU7XHJcbiAgICAgICAgc3VpdGVSZXN1bHQuc3RhdHVzID0gdGhpcy5kZXRlcm1pbmVTdWl0ZVN0YXR1cyhzdWl0ZVJlc3VsdCk7XHJcbiAgICAgICAgLy8gY2FsbCB0ZXN0IGhvb2sgaWYgZGVmaW5lZFxyXG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy50ZXN0SG9va3MuYWZ0ZXJTdWl0ZSA9PT0gJ2Z1bmN0aW9uJykge1xyXG4gICAgICAgICAgICB0aGlzLnRlc3RIb29rcy5hZnRlclN1aXRlKHRoaXMucnVubmVySWQsIHN1aXRlUmVzdWx0KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gY2FsbCByZXBvcnQgZ2VuZXJhdG9yXHJcbiAgICAgICAgaWYgKHRoaXMucmVwb3J0RGlzcGF0Y2hlci5vblN1aXRlRW5kICYmIHR5cGVvZiB0aGlzLnJlcG9ydERpc3BhdGNoZXIub25TdWl0ZUVuZCA9PT0gJ2Z1bmN0aW9uJykge1xyXG4gICAgICAgICAgICB0aGlzLnJlcG9ydERpc3BhdGNoZXIub25TdWl0ZUVuZCh0aGlzLnJ1bm5lcklkLCB1cmksIHN1aXRlUmVzdWx0KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgb25CZWZvcmVTY2VuYXJpbyh1cmksIGZlYXR1cmUsIHNjZW5hcmlvKSB7XHJcbiAgICAgICAgY29uc3Qgc3VpdGVJZCA9IGAke3VyaX06JHtmZWF0dXJlLmxvY2F0aW9uLmxpbmV9YDtcclxuICAgICAgICBjb25zdCBjYXNlTG9jYXRpb24gPSBzY2VuYXJpby5sb2NhdGlvbnMubGVuZ3RoID4gMCA/IHNjZW5hcmlvLmxvY2F0aW9uc1swXSA6IHsgbGluZTogMSB9O1xyXG4gICAgICAgIGNvbnN0IGNhc2VJZCA9IGAke3VyaX06JHtjYXNlTG9jYXRpb24ubGluZX1gO1xyXG4gICAgICAgIGNvbnN0IHN1aXRlUmVzdWx0ID0gdGhpcy5zdWl0ZXNbc3VpdGVJZF07XHJcbiAgICAgICAgY29uc3QgY2FzZXMgPSBzdWl0ZVJlc3VsdC5jYXNlcztcclxuICAgICAgICBjb25zdCBjYXNlUmVzdWx0ID0gdGhpcy5jdXJyZW50Q2FzZSA9IG5ldyBUZXN0Q2FzZVJlc3VsdCgpO1xyXG4gICAgICAgIGNhc2VSZXN1bHQubmFtZSA9IHNjZW5hcmlvLm5hbWU7XHJcbiAgICAgICAgY2FzZVJlc3VsdC50YWdzID0gdGhpcy5zaW1wbGlmeUN1Y3VtYmVyVGFncyhzY2VuYXJpby50YWdzKTtcclxuICAgICAgICBjYXNlUmVzdWx0LmxvY2F0aW9uID0gY2FzZUlkO1xyXG4gICAgICAgIGNhc2VSZXN1bHQuc3RhcnRUaW1lID0gb3h1dGlsLmdldFRpbWVTdGFtcCgpO1xyXG4gICAgICAgIGNhc2VzLnB1c2goY2FzZVJlc3VsdCk7XHJcblxyXG4gICAgICAgIC8vIGNhbGwgb3h5Z2VuIG9uQmVmb3JlQ2FzZSBpZiBkZWZpbmVkXHJcbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLm94eWdlbkV2ZW50TGlzdGVuZXIub25CZWZvcmVDYXNlID09PSAnZnVuY3Rpb24nKSB7XHJcbiAgICAgICAgICAgIGF3YWl0IHRoaXMub3h5Z2VuRXZlbnRMaXN0ZW5lci5vbkJlZm9yZUNhc2UoKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIGNhbGwgdGVzdCBob29rIGlmIGRlZmluZWRcclxuICAgICAgICBpZiAodHlwZW9mIHRoaXMudGVzdEhvb2tzLmJlZm9yZUNhc2UgPT09ICdmdW5jdGlvbicpIHtcclxuICAgICAgICAgICAgdGhpcy50ZXN0SG9va3MuYmVmb3JlQ2FzZSh0aGlzLnJ1bm5lcklkLCBzY2VuYXJpbyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIGNhbGwgcmVwb3J0IGdlbmVyYXRvclxyXG4gICAgICAgIGlmICh0aGlzLnJlcG9ydERpc3BhdGNoZXIub25DYXNlU3RhcnQgJiYgdHlwZW9mIHRoaXMucmVwb3J0RGlzcGF0Y2hlci5vbkNhc2VTdGFydCA9PT0gJ2Z1bmN0aW9uJykge1xyXG4gICAgICAgICAgICB0aGlzLnJlcG9ydERpc3BhdGNoZXIub25DYXNlU3RhcnQodGhpcy5ydW5uZXJJZCwgdXJpLCBjYXNlSWQsIHNjZW5hcmlvKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgb25BZnRlclNjZW5hcmlvKHVyaSwgZmVhdHVyZSwgc2NlbmFyaW8sIHNvdXJjZUxvY2F0aW9uKSB7XHJcbiAgICAgICAgY29uc3Qgc3VpdGVJZCA9IGAke3VyaX06JHtmZWF0dXJlLmxvY2F0aW9uLmxpbmV9YDtcclxuICAgICAgICBjb25zdCBjYXNlSWQgPSBgJHt1cml9OiR7c291cmNlTG9jYXRpb24ubGluZX1gO1xyXG4gICAgICAgIGNvbnN0IHN1aXRlUmVzdWx0ID0gdGhpcy5zdWl0ZXNbc3VpdGVJZF07XHJcbiAgICAgICAgY29uc3QgY2FzZXMgPSBzdWl0ZVJlc3VsdC5jYXNlcztcclxuICAgICAgICBjb25zdCBjYXNlUmVzdWx0ID0gY2FzZXMuZmluZCh4ID0+IHgubG9jYXRpb24gPT09IGNhc2VJZCk7XHJcbiAgICAgICAgaWYgKCFjYXNlUmVzdWx0KSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgY2FzZVJlc3VsdC5lbmRUaW1lID0gb3h1dGlsLmdldFRpbWVTdGFtcCgpO1xyXG4gICAgICAgIGNhc2VSZXN1bHQuZHVyYXRpb24gPSBjYXNlUmVzdWx0LmVuZFRpbWUgLSBjYXNlUmVzdWx0LnN0YXJ0VGltZTtcclxuICAgICAgICBjYXNlUmVzdWx0LnN0YXR1cyA9IHRoaXMuZGV0ZXJtaW5lQ2FzZVN0YXR1cyhjYXNlUmVzdWx0KTtcclxuICAgICAgICBjYXNlUmVzdWx0LmxvZ3MgPSB0aGlzLm94eWdlbkV2ZW50TGlzdGVuZXIucmVzdWx0U3RvcmUgJiYgdGhpcy5veHlnZW5FdmVudExpc3RlbmVyLnJlc3VsdFN0b3JlLmxvZ3MgPyB0aGlzLm94eWdlbkV2ZW50TGlzdGVuZXIucmVzdWx0U3RvcmUubG9ncyA6IFtdO1xyXG4gICAgICAgIGNhc2VSZXN1bHQuaGFyID0gdGhpcy5veHlnZW5FdmVudExpc3RlbmVyLnJlc3VsdFN0b3JlICYmIHRoaXMub3h5Z2VuRXZlbnRMaXN0ZW5lci5yZXN1bHRTdG9yZS5oYXIgPyB0aGlzLm94eWdlbkV2ZW50TGlzdGVuZXIucmVzdWx0U3RvcmUuaGFyIDogbnVsbDtcclxuXHJcbiAgICAgICAgLy8gY2FsbCBveHlnZW4gb25BZnRlckNhc2UgaWYgZGVmaW5lZFxyXG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5veHlnZW5FdmVudExpc3RlbmVyLm9uQWZ0ZXJDYXNlID09PSAnZnVuY3Rpb24nKSB7XHJcbiAgICAgICAgICAgIGF3YWl0IHRoaXMub3h5Z2VuRXZlbnRMaXN0ZW5lci5vbkFmdGVyQ2FzZSgpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gY2FsbCB0ZXN0IGhvb2sgaWYgZGVmaW5lZFxyXG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy50ZXN0SG9va3MuYWZ0ZXJDYXNlID09PSAnZnVuY3Rpb24nKSB7XHJcbiAgICAgICAgICAgIHRoaXMudGVzdEhvb2tzLmFmdGVyQ2FzZSh0aGlzLnJ1bm5lcklkLCBjYXNlUmVzdWx0KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gY2FsbCByZXBvcnQgZ2VuZXJhdG9yXHJcbiAgICAgICAgaWYgKHRoaXMucmVwb3J0RGlzcGF0Y2hlci5vbkNhc2VFbmQgJiYgdHlwZW9mIHRoaXMucmVwb3J0RGlzcGF0Y2hlci5vbkNhc2VFbmQgPT09ICdmdW5jdGlvbicpIHtcclxuICAgICAgICAgICAgdGhpcy5yZXBvcnREaXNwYXRjaGVyLm9uQ2FzZUVuZCh0aGlzLnJ1bm5lcklkLCB1cmksIGNhc2VJZCwgY2FzZVJlc3VsdCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIG9uQmVmb3JlU3RlcCh1cmksIGZlYXR1cmUsIHNjZW5hcmlvLCBzdGVwLCBzb3VyY2VMb2NhdGlvbikge1xyXG4gICAgICAgIGNvbnN0IHN1aXRlSWQgPSBgJHt1cml9OiR7ZmVhdHVyZS5sb2NhdGlvbi5saW5lfWA7XHJcbiAgICAgICAgY29uc3QgY2FzZUlkID0gYCR7dXJpfToke3NvdXJjZUxvY2F0aW9uLmxpbmV9YDtcclxuICAgICAgICBjb25zdCBzdWl0ZVJlc3VsdCA9IHRoaXMuc3VpdGVzW3N1aXRlSWRdO1xyXG4gICAgICAgIGNvbnN0IGNhc2VzID0gc3VpdGVSZXN1bHQuY2FzZXM7XHJcbiAgICAgICAgY29uc3QgY2FzZVJlc3VsdCA9IGNhc2VzLmZpbmQoeCA9PiB4LmxvY2F0aW9uID09PSBjYXNlSWQpO1xyXG4gICAgICAgIGNvbnN0IHN0ZXBSZXN1bHQgPSB0aGlzLmN1cnJlbnRTdGVwID0gbmV3IFRlc3RTdGVwUmVzdWx0KCk7XHJcbiAgICAgICAgY2FzZVJlc3VsdC5zdGVwcy5wdXNoKHN0ZXBSZXN1bHQpO1xyXG5cclxuICAgICAgICBzdGVwUmVzdWx0Lm5hbWUgPSBzdGVwLnRleHQ7XHJcbiAgICAgICAgc3RlcFJlc3VsdC5zdGFydFRpbWUgPSBveHV0aWwuZ2V0VGltZVN0YW1wKCk7XHJcbiAgICAgICAgc3RlcFJlc3VsdC5sb2NhdGlvbiA9IGAke3VyaX06JHtzdGVwLmxvY2F0aW9uLmxpbmV9YDtcclxuICAgICAgICAvLyBjYWxsIHRlc3QgaG9vayBpZiBkZWZpbmVkXHJcbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLnRlc3RIb29rcy5iZWZvcmVTdGVwID09PSAnZnVuY3Rpb24nKSB7XHJcbiAgICAgICAgICAgIHRoaXMudGVzdEhvb2tzLmJlZm9yZVN0ZXAodGhpcy5ydW5uZXJJZCwgc3RlcCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIGNhbGwgcmVwb3J0IGdlbmVyYXRvclxyXG4gICAgICAgIGlmICh0aGlzLnJlcG9ydERpc3BhdGNoZXIub25TdGVwU3RhcnQgJiYgdHlwZW9mIHRoaXMucmVwb3J0RGlzcGF0Y2hlci5vblN0ZXBTdGFydCA9PT0gJ2Z1bmN0aW9uJykge1xyXG4gICAgICAgICAgICB0aGlzLnJlcG9ydERpc3BhdGNoZXIub25TdGVwU3RhcnQodGhpcy5ydW5uZXJJZCwgc3RlcFJlc3VsdCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIG9uQWZ0ZXJTdGVwKHVyaSwgZmVhdHVyZSwgc2NlbmFyaW8sIHN0ZXAsIHJlc3VsdCwgc291cmNlTG9jYXRpb24pIHtcclxuICAgICAgICBjb25zdCBzdWl0ZUlkID0gYCR7dXJpfToke2ZlYXR1cmUubG9jYXRpb24ubGluZX1gO1xyXG4gICAgICAgIGNvbnN0IGNhc2VJZCA9IGAke3VyaX06JHtzb3VyY2VMb2NhdGlvbi5saW5lfWA7XHJcbiAgICAgICAgY29uc3Qgc3VpdGVSZXN1bHQgPSB0aGlzLnN1aXRlc1tzdWl0ZUlkXTtcclxuICAgICAgICBjb25zdCBjYXNlcyA9IHN1aXRlUmVzdWx0LmNhc2VzO1xyXG4gICAgICAgIGNvbnN0IGNhc2VSZXN1bHQgPSBjYXNlcy5maW5kKHggPT4geC5sb2NhdGlvbiA9PT0gY2FzZUlkKTtcclxuICAgICAgICBjb25zdCBzdGVwTG9jYXRpb24gPSBgJHt1cml9OiR7c3RlcC5sb2NhdGlvbi5saW5lfWA7XHJcbiAgICAgICAgY29uc3Qgc3RlcFJlc3VsdCA9IGNhc2VSZXN1bHQuc3RlcHMuZmluZCh4ID0+IHgubG9jYXRpb24gPT09IHN0ZXBMb2NhdGlvbik7XHJcblxyXG4gICAgICAgIHN0ZXBSZXN1bHQuZW5kVGltZSA9IG94dXRpbC5nZXRUaW1lU3RhbXAoKTtcclxuICAgICAgICBzdGVwUmVzdWx0LmR1cmF0aW9uID0gc3RlcFJlc3VsdC5lbmRUaW1lIC0gc3RlcFJlc3VsdC5zdGFydFRpbWU7XHJcbiAgICAgICAgc3RlcFJlc3VsdC5zdGF0dXMgPSByZXN1bHQuc3RhdHVzO1xyXG4gICAgICAgIC8vIGdldCBmYWlsdXJlIGRldGFpbHMgaWYgZXJyb3Igd2FzIHRocm93biBpbiB0aGUgc3RlcFxyXG4gICAgICAgIGlmIChyZXN1bHQuZXhjZXB0aW9uKSB7XHJcbiAgICAgICAgICAgIHN0ZXBSZXN1bHQuZmFpbHVyZSA9IGVycm9ySGVscGVyLmdldEZhaWx1cmVGcm9tRXJyb3IocmVzdWx0LmV4Y2VwdGlvbik7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmN1cnJlbnRTdGVwICYmIHRoaXMuY3VycmVudFN0ZXAubG9jYXRpb24pIHtcclxuICAgICAgICAgICAgICAgIHN0ZXBSZXN1bHQuZmFpbHVyZS5jdWN1bWJlckxvY2F0aW9uID0gdGhpcy5jdXJyZW50U3RlcC5sb2NhdGlvbjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBjYWxsIHRlc3QgaG9vayBpZiBkZWZpbmVkXHJcbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLnRlc3RIb29rcy5hZnRlclN0ZXAgPT09ICdmdW5jdGlvbicpIHtcclxuICAgICAgICAgICAgdGhpcy50ZXN0SG9va3MuYWZ0ZXJTdGVwKHRoaXMucnVubmVySWQsIHN0ZXBSZXN1bHQsIHJlc3VsdC5leGNlcHRpb24pO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBjYWxsIHJlcG9ydCBnZW5lcmF0b3JcclxuICAgICAgICBpZiAodGhpcy5yZXBvcnREaXNwYXRjaGVyLm9uU3RlcEVuZCAmJiB0eXBlb2YgdGhpcy5yZXBvcnREaXNwYXRjaGVyLm9uU3RlcEVuZCA9PT0gJ2Z1bmN0aW9uJykge1xyXG4gICAgICAgICAgICB0aGlzLnJlcG9ydERpc3BhdGNoZXIub25TdGVwRW5kKHRoaXMucnVubmVySWQsIHN0ZXBSZXN1bHQpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBvblRlc3RFbmQocmVzdWx0KSB7XHJcblxyXG4gICAgfVxyXG5cclxuICAgIGRldGVybWluZUNhc2VTdGF0dXMoY2FzZVJlc3VsdCkge1xyXG4gICAgICAgIGNvbnN0IGhhc0ZhaWxlZFN0ZXAgPSBjYXNlUmVzdWx0LnN0ZXBzLnNvbWUoeCA9PiB4LnN0YXR1cyA9PT0gU3RhdHVzLkZBSUxFRCk7XHJcbiAgICAgICAgaWYgKGhhc0ZhaWxlZFN0ZXApIHtcclxuICAgICAgICAgICAgcmV0dXJuIFN0YXR1cy5GQUlMRUQ7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBTdGF0dXMuUEFTU0VEO1xyXG4gICAgfVxyXG5cclxuICAgIGRldGVybWluZVN1aXRlU3RhdHVzKHN1aXRlUmVzdWx0KSB7XHJcbiAgICAgICAgY29uc3QgaGFzRmFpbGVkQ2FzZSA9IHN1aXRlUmVzdWx0LmNhc2VzLnNvbWUoeCA9PiB4LnN0YXR1cyA9PT0gU3RhdHVzLkZBSUxFRCk7XHJcbiAgICAgICAgaWYgKGhhc0ZhaWxlZENhc2UpIHtcclxuICAgICAgICAgICAgcmV0dXJuIFN0YXR1cy5GQUlMRUQ7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBTdGF0dXMuUEFTU0VEO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIHJlbW92ZXMgYWxsIHVubmVjZXNzYXJ5IG1ldGFkYXRhIGZyb20gQ3VjdW1iZXIgdGFncywgcmV0dXJuaW5nIGEgc2ltcGxlIGFycmF5IG9mIHRhZyBuYW1lc1xyXG4gICAgc2ltcGxpZnlDdWN1bWJlclRhZ3ModGFncykge1xyXG4gICAgICAgIGlmICghQXJyYXkuaXNBcnJheSh0YWdzKSB8fCB0YWdzLmxlbmd0aCA9PSAwKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0YWdzO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBzaW1wbGVUYWdzID0gW107XHJcbiAgICAgICAgZm9yIChsZXQgdGFnIG9mIHRhZ3MpIHtcclxuICAgICAgICAgICAgc2ltcGxlVGFncy5wdXNoKHRhZy5uYW1lKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHNpbXBsZVRhZ3M7XHJcbiAgICB9XHJcbn0iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7QUFBQSxJQUFBQSxZQUFBLEdBQUFDLHNCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBQyxXQUFBLEdBQUFGLHNCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBRSxXQUFBLEdBQUFILHNCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBRyxPQUFBLEdBQUFKLHNCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBSSxLQUFBLEdBQUFMLHNCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBSyxPQUFBLEdBQUFOLHNCQUFBLENBQUFDLE9BQUE7QUFBOEMsU0FBQUQsdUJBQUFPLENBQUEsV0FBQUEsQ0FBQSxJQUFBQSxDQUFBLENBQUFDLFVBQUEsR0FBQUQsQ0FBQSxLQUFBRSxPQUFBLEVBQUFGLENBQUE7QUFFL0IsTUFBTUcsZ0JBQWdCLENBQUM7RUFDbENDLFdBQVdBLENBQUNDLFFBQVEs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RUFBRTtNQUNoRCxJQUFJLENBQUNsRixTQUFTLENBQUNrRixTQUFTLENBQUMsSUFBSSxDQUFDdkYsUUFBUSxFQUFFNEUsVUFBVSxFQUFFdEQsTUFBTSxDQUFDNEQsU0FBUyxDQUFDO0lBQ3pFO0lBRUEsSUFBSSxJQUFJLENBQUM5RSxnQkFBZ0IsQ0FBQ29GLFNBQVMsSUFBSSxPQUFPLElBQUksQ0FBQ3BGLGdCQUFnQixDQUFDb0YsU0FBUyxLQUFLLFVBQVUsRUFBRTtNQUMxRixJQUFJLENBQUNwRixnQkFBZ0IsQ0FBQ29GLFNBQVMsQ0FBQyxJQUFJLENBQUN4RixRQUFRLEVBQUU0RSxVQUFVLENBQUM7SUFDOUQ7RUFDSjtFQUVBNUQsU0FBU0EsQ0FBQ00sTUFBTSxFQUFFLENBRWxCO0VBRUErQyxtQkFBbUJBLENBQUNSLFVBQVUsRUFBRTtJQUM1QixNQUFNNEIsYUFBYSxHQUFHNUIsVUFBVSxDQUFDdEMsS0FBSyxDQUFDbUUsSUFBSSxDQUFDdEIsQ0FBQyxJQUFJQSxDQUFDLENBQUNsQixNQUFNLEtBQUt5QyxlQUFNLENBQUNDLE1BQU0sQ0FBQztJQUM1RSxJQUFJSCxhQUFhLEVBQUU7TUFDZixPQUFPRSxlQUFNLENBQUNDLE1BQU07SUFDeEI7SUFDQSxPQUFPRCxlQUFNLENBQUNFLE1BQU07RUFDeEI7RUFFQTFDLG9CQUFvQkEsQ0FBQ2IsV0FBVyxFQUFFO0lBQzlCLE1BQU13RCxhQUFhLEdBQUd4RCxXQUFXLENBQUNzQixLQUFLLENBQUM4QixJQUFJLENBQUN0QixDQUFDLElBQUlBLENBQUMsQ0FBQ2xCLE1BQU0sS0FBS3lDLGVBQU0sQ0FBQ0MsTUFBTSxDQUFDO0lBQzdFLElBQUlFLGFBQWEsRUFBRTtNQUNmLE9BQU9ILGVBQU0sQ0FBQ0MsTUFBTTtJQUN4QjtJQUNBLE9BQU9ELGVBQU0sQ0FBQ0UsTUFBTTtFQUN4QjtFQUdBbkQsb0JBQW9CQSxDQUFDRCxJQUFJLEVBQUU7SUFDdkIsSUFBSSxDQUFDc0QsS0FBSyxDQUFDQyxPQUFPLENBQUN2RCxJQUFJLENBQUMsSUFBSUEsSUFBSSxDQUFDaUIsTUFBTSxJQUFJLENBQUMsRUFBRTtNQUMxQyxPQUFPakIsSUFBSTtJQUNmO0lBQ0EsTUFBTXdELFVBQVUsR0FBRyxFQUFFO0lBQ3JCLEtBQUssSUFBSUMsR0FBRyxJQUFJekQsSUFBSSxFQUFFO01BQ2xCd0QsVUFBVSxDQUFDekUsSUFBSSxDQUFDMEUsR0FBRyxDQUFDMUQsSUFBSSxDQUFDO0lBQzdCO0lBQ0EsT0FBT3lELFVBQVU7RUFDckI7QUFDSjtBQUFDRSxPQUFBLENBQUF0RyxPQUFBLEdBQUFDLGdCQUFBIiwiaWdub3JlTGlzdCI6W119