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,27 +4,16 @@ 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 _child_process = require("child_process");
11
-
12
9
  var _events = require("events");
13
-
14
10
  var _when = require("when");
15
-
16
11
  var _logger = _interopRequireDefault(require("../lib/logger"));
17
-
18
12
  var _debugger = _interopRequireDefault(require("../lib/debugger"));
19
-
20
13
  var _util = _interopRequireDefault(require("../lib/util"));
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
  const log = (0, _logger.default)('WorkerProcess');
25
-
26
16
  const snooze = ms => new Promise(resolve => setTimeout(resolve, ms));
27
-
28
17
  class WorkerProcess extends _events.EventEmitter {
29
18
  constructor(pid, workerPath, debugMode, debugPort, name = null, npmGRootExecution = true) {
30
19
  super();
@@ -43,7 +32,6 @@ class WorkerProcess extends _events.EventEmitter {
43
32
  this._calls = {};
44
33
  this._eventHandlers = {};
45
34
  }
46
-
47
35
  async start() {
48
36
  const env = Object.assign(process.env, {
49
37
  OX_WORKER: true,
@@ -57,17 +45,13 @@ class WorkerProcess extends _events.EventEmitter {
57
45
  execArgv: [],
58
46
  detached: false
59
47
  };
60
-
61
48
  if (this._debugPort) {
62
49
  forkOpts.execArgv = Object.assign(forkOpts.execArgv, ['--inspect-brk=' + this._debugPort]);
63
50
  }
64
-
65
51
  forkOpts.execArgv.push('--trace-warnings');
66
-
67
52
  if (this._npmGRootExecution) {
68
53
  try {
69
54
  let globalNpmModulesPath;
70
-
71
55
  if (process.platform === 'darwin') {
72
56
  await (() => {
73
57
  return new Promise((resolve, reject) => {
@@ -79,7 +63,6 @@ class WorkerProcess extends _events.EventEmitter {
79
63
  console.log('darwin npm root error:', err);
80
64
  resolve();
81
65
  }
82
-
83
66
  if (stdout && stdout.toString) {
84
67
  globalNpmModulesPath = stdout.toString().trim();
85
68
  resolve();
@@ -92,12 +75,10 @@ class WorkerProcess extends _events.EventEmitter {
92
75
  })();
93
76
  } else {
94
77
  const execResult = (0, _child_process.execSync)('npm root -g');
95
-
96
78
  if (execResult && execResult.toString) {
97
79
  globalNpmModulesPath = execResult.toString().trim();
98
80
  }
99
81
  }
100
-
101
82
  if (globalNpmModulesPath && forkOpts && forkOpts.env) {
102
83
  forkOpts.env.NODE_PATH = globalNpmModulesPath;
103
84
  }
@@ -105,31 +86,23 @@ class WorkerProcess extends _events.EventEmitter {
105
86
  console.log('npm root error:', e);
106
87
  }
107
88
  }
108
-
109
89
  this._childProc = (0, _child_process.fork)(this._workerPath, forkOpts);
110
-
111
90
  this._hookChildProcEvents();
112
-
113
91
  this._isRunning = true;
114
92
  return this._childProc;
115
93
  }
116
-
117
94
  async startDebugger() {
118
95
  if (this._debugMode) {
119
96
  await this._initializeDebugger();
120
97
  }
121
98
  }
122
-
123
99
  async stopDebugger() {
124
100
  if (this._debugger) {
125
101
  await this._debugger.close();
126
-
127
102
  this._debugger.removeAllListeners();
128
-
129
103
  this._debugger = null;
130
104
  }
131
105
  }
132
-
133
106
  async stop(status = null) {
134
107
  if (this._isInitialized && this._childProc) {
135
108
  if (this._debugger && this._debugger._paused) {
@@ -139,33 +112,26 @@ class WorkerProcess extends _events.EventEmitter {
139
112
  await this._debugger.resumeTerminate();
140
113
  }
141
114
  }
142
-
143
115
  await this.invoke('dispose', status);
144
116
  await snooze(100);
145
117
  } else if (this._childProc) {
146
118
  await snooze(100);
147
119
  }
148
-
149
120
  if (this._debugger) {
150
121
  await this._debugger.close();
151
122
  }
152
-
153
123
  this._send({
154
124
  type: 'exit',
155
125
  status: status
156
126
  });
157
-
158
127
  this.kill();
159
-
160
128
  this._reset();
161
129
  }
162
-
163
130
  kill() {
164
131
  if (this._childProc) {
165
132
  this._childProc.kill('SIGINT');
166
133
  }
167
134
  }
168
-
169
135
  async initOxygen(rid, options, caps) {
170
136
  if (!this._isInitialized) {
171
137
  const beforeTime = new Date().getTime();
@@ -174,25 +140,19 @@ class WorkerProcess extends _events.EventEmitter {
174
140
  const duration = afterTime - beforeTime;
175
141
  this._isInitialized = true;
176
142
  let start = '';
177
-
178
143
  if (this._name) {
179
144
  start = this._name + ' ';
180
145
  }
181
-
182
146
  log.info(start + 'Worker initialized in ' + duration + ' ms');
183
147
  }
184
148
  }
185
-
186
149
  async startSession() {
187
150
  let start = '';
188
-
189
151
  if (this._name) {
190
152
  start = this._name + ' ';
191
153
  }
192
-
193
154
  log.info(start + 'Session started');
194
155
  }
195
-
196
156
  async endSession(status = null, disposeModules = true) {
197
157
  if (this._childProc) {
198
158
  const beforeTime = new Date().getTime();
@@ -200,115 +160,89 @@ class WorkerProcess extends _events.EventEmitter {
200
160
  const afterTime = new Date().getTime();
201
161
  const duration = afterTime - beforeTime;
202
162
  let start = '';
203
-
204
163
  if (this._name) {
205
164
  start = this._name + ' ';
206
165
  }
207
-
208
166
  log.info(start + 'Session ended in ' + duration + ' ms');
209
167
  }
210
168
  }
211
-
212
169
  async dispose(status = null) {
213
170
  if (this._debugger) {
214
171
  await this._debugger.close();
215
172
  }
216
-
217
173
  if (this._isInitialized && this._childProc) {
218
174
  this._isInitialized = false;
219
175
  await this.invoke('dispose', status);
220
-
221
176
  this._send({
222
177
  type: 'exit',
223
178
  status: status
224
179
  });
225
-
226
180
  this.kill();
227
181
  } else if (this._childProc) {
228
182
  this._isInitialized = false;
229
-
230
183
  this._send({
231
184
  type: 'exit',
232
185
  status: status
233
186
  });
234
-
235
187
  this.kill();
236
188
  }
237
189
  }
238
-
239
190
  get debugger() {
240
191
  return this._debugger;
241
192
  }
242
-
243
193
  get isRunning() {
244
194
  return this._isRunning;
245
195
  }
246
-
247
196
  get isInitialized() {
248
197
  return this._isInitialized;
249
198
  }
250
-
251
199
  async run(runOpts) {
252
200
  return await this.invoke('run', runOpts);
253
201
  }
254
-
255
202
  subscribe(eventName, handler) {
256
203
  if (!this._eventHandlers[eventName] && typeof handler === 'function') {
257
204
  this._eventHandlers[eventName] = handler;
258
-
259
205
  this._send({
260
206
  type: 'subscribe',
261
207
  event: eventName
262
208
  });
263
209
  }
264
210
  }
265
-
266
211
  async invoke(method) {
267
212
  let args = Array.prototype.slice.call(arguments);
268
-
269
213
  if (args.length > 0) {
270
214
  args.shift();
271
215
  }
272
-
273
216
  if (this._childProc) {
274
217
  const callId = _util.default.generateUniqueId();
275
-
276
218
  this._send({
277
219
  type: 'invoke',
278
220
  method: method,
279
221
  callId: callId,
280
222
  args: args
281
223
  });
282
-
283
224
  this._calls[callId] = (0, _when.defer)();
284
225
  return this._calls[callId].promise;
285
226
  }
286
227
  }
287
-
288
228
  async invokeTestHook(hookName, hookArgs) {
289
229
  const callId = _util.default.generateUniqueId();
290
-
291
230
  this._send({
292
231
  type: 'invoke:hook',
293
232
  method: hookName,
294
233
  callId: callId,
295
234
  args: hookArgs
296
235
  });
297
-
298
236
  this._calls[callId] = (0, _when.defer)();
299
237
  return this._calls[callId].promise;
300
238
  }
301
-
302
239
  _send(message) {
303
240
  if (!this._childProc) {
304
241
  return false;
305
242
  }
306
-
307
243
  this._childProc.send(message);
308
-
309
244
  return true;
310
245
  }
311
-
312
246
  _reset() {
313
247
  this._childProc = null;
314
248
  this._debugger = null;
@@ -320,43 +254,31 @@ class WorkerProcess extends _events.EventEmitter {
320
254
  this._whenModulesDisposed = null;
321
255
  this._isInitialized = false;
322
256
  }
323
-
324
257
  _hookChildProcEvents() {
325
258
  if (!this._childProc) {
326
259
  return;
327
260
  }
328
-
329
261
  this._childProc.on('message', this._handleChildMessage.bind(this));
330
-
331
262
  this._childProc.on('error', this._handleChildError.bind(this));
332
-
333
263
  this._childProc.on('exit', this._handleChildExit.bind(this));
334
-
335
264
  this._childProc.on('disconnect', this._handleChildDisconnect.bind(this));
336
-
337
265
  this._childProc.on('uncaughtException', this._handleChildUncaughtException.bind(this));
338
-
339
266
  this._childProc.on('SIGINT', this._handleChildSigInt.bind(this));
340
267
  }
341
-
342
268
  _handleChildMessage(msg) {
343
269
  if (msg.event) {
344
270
  switch (msg.event) {
345
271
  case 'invoke:result':
346
272
  if (msg.callId && Object.prototype.hasOwnProperty.call(this._calls, msg.callId)) {
347
273
  const promise = this._calls[msg.callId];
348
-
349
274
  if (msg.error) {
350
275
  promise.reject(msg.error);
351
276
  } else {
352
277
  promise.resolve(msg.retval);
353
278
  }
354
-
355
279
  delete this._calls[msg.callId];
356
280
  }
357
-
358
281
  break;
359
-
360
282
  case 'reporter':
361
283
  if (msg.method) {
362
284
  this.emit('reporter', {
@@ -365,21 +287,16 @@ class WorkerProcess extends _events.EventEmitter {
365
287
  args: msg.args
366
288
  });
367
289
  }
368
-
369
290
  break;
370
-
371
291
  case 'event':
372
292
  this._handleWorkerEvent(msg.name, msg.args);
373
-
374
293
  break;
375
294
  }
376
295
  }
377
-
378
296
  this.emit('message', Object.assign(msg, {
379
297
  pid: this._pid
380
298
  }));
381
299
  }
382
-
383
300
  async _handleWorkerEvent(name, args) {
384
301
  if (name && this._eventHandlers && this._eventHandlers[name]) {
385
302
  try {
@@ -389,7 +306,6 @@ class WorkerProcess extends _events.EventEmitter {
389
306
  }
390
307
  }
391
308
  }
392
-
393
309
  _handleChildError(error) {
394
310
  log.debug(`Worker ${this._pid} thrown an error: ${error}.`);
395
311
  this.emit('error', Object.assign({
@@ -398,28 +314,21 @@ class WorkerProcess extends _events.EventEmitter {
398
314
  pid: this._pid
399
315
  }));
400
316
  }
401
-
402
317
  _handleChildExit(exitCode, signal) {
403
318
  log.debug(`Worker ${this._pid} finished with exit code ${exitCode} and signal ${signal}.`);
404
-
405
319
  this._reset();
406
-
407
320
  this.emit('exit', {
408
321
  pid: this._pid,
409
322
  exitCode,
410
323
  signal
411
324
  });
412
325
  }
413
-
414
326
  _handleChildDisconnect() {
415
327
  log.debug(`Worker ${this._pid} disconnected.`);
416
328
  }
417
-
418
329
  _handleChildUncaughtException(error) {
419
330
  log.debug(`Worker ${this._pid} thrown an uncaught error: ${error}.`);
420
-
421
331
  this._reset();
422
-
423
332
  this.emit('error', Object.assign({
424
333
  error: error
425
334
  }, {
@@ -430,50 +339,39 @@ class WorkerProcess extends _events.EventEmitter {
430
339
  exitCode: 1
431
340
  });
432
341
  }
433
-
434
342
  _handleChildSigInt() {
435
343
  log.debug(`Worker ${this._pid} received SIGINT signal.`);
436
344
  }
437
-
438
345
  async _initializeDebugger() {
439
346
  this._debugger = new _debugger.default(this._pid);
440
347
  let whenDebuggerReady = (0, _when.defer)();
441
-
442
348
  const _this = this;
443
-
444
349
  this._debugger.on('ready', function (err) {
445
350
  if (_this._debugger && _this._debugger.continue) {
446
351
  _this._debugger.continue();
447
352
  }
448
-
449
353
  whenDebuggerReady.resolve();
450
354
  });
451
-
452
355
  this._debugger.on('error', function (err) {
453
356
  log.error('Debugger error :', err);
454
357
  this.emit('debugger:error', Object.assign(err, {
455
358
  pid: this._pid
456
359
  }));
457
-
458
360
  if (!whenDebuggerReady.isResolved) {
459
361
  whenDebuggerReady.reject(err.message);
460
362
  }
461
363
  });
462
-
463
364
  this._debugger.on('break', function (breakpointData) {
464
365
  this.emit('debugger:break', breakpointData);
465
366
  });
466
-
467
367
  this._debugger.on('breakError', async function (breakError) {
468
368
  if (breakError && breakError.message) {
469
369
  if (_this._breakpointErrors.includes(breakError.message)) {} else {
470
370
  _this._breakpointErrors.push(breakError.message);
471
-
472
371
  this.emit('debugger:breakError', breakError);
473
372
  }
474
373
  }
475
374
  });
476
-
477
375
  try {
478
376
  log.info(`Connecting to debugger on port ${this._debugPort}...`);
479
377
  await this._debugger.connect(this._debugPort, '127.0.0.1');
@@ -482,11 +380,8 @@ class WorkerProcess extends _events.EventEmitter {
482
380
  const message = 'Cannot connect to the debugger: ' + e.message;
483
381
  whenDebuggerReady.reject(message);
484
382
  }
485
-
486
383
  return whenDebuggerReady.promise;
487
384
  }
488
-
489
385
  }
490
-
491
386
  exports.default = WorkerProcess;
492
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9ydW5uZXJzL1dvcmtlclByb2Nlc3MuanMiXSwibmFtZXMiOlsibG9nIiwic25vb3plIiwibXMiLCJQcm9taXNlIiwicmVzb2x2ZSIsInNldFRpbWVvdXQiLCJXb3JrZXJQcm9jZXNzIiwiRXZlbnRFbWl0dGVyIiwiY29uc3RydWN0b3IiLCJwaWQiLCJ3b3JrZXJQYXRoIiwiZGVidWdNb2RlIiwiZGVidWdQb3J0IiwibmFtZSIsIm5wbUdSb290RXhlY3V0aW9uIiwiX25hbWUiLCJfaXNSdW5uaW5nIiwiX2lzSW5pdGlhbGl6ZWQiLCJfc3RvcHBlZEJ5VXNlciIsIl9waWQiLCJfY2hpbGRQcm9jIiwiX2RlYnVnTW9kZSIsIl9kZWJ1Z1BvcnQiLCJfZGVidWdnZXIiLCJfd29ya2VyUGF0aCIsIl9ucG1HUm9vdEV4ZWN1dGlvbiIsIl9icmVha3BvaW50RXJyb3JzIiwiX2NhbGxzIiwiX2V2ZW50SGFuZGxlcnMiLCJzdGFydCIsImVudiIsIk9iamVjdCIsImFzc2lnbiIsInByb2Nlc3MiLCJPWF9XT1JLRVIiLCJERUJVRyIsImlzTmFOIiwiTk9fVVBEQVRFX05PVElGSUVSIiwiaW5mbyIsImZvcmtPcHRzIiwiY3dkIiwiZXhlY0FyZ3YiLCJkZXRhY2hlZCIsInB1c2giLCJnbG9iYWxOcG1Nb2R1bGVzUGF0aCIsInBsYXRmb3JtIiwicmVqZWN0IiwiZXJyIiwic3Rkb3V0IiwiY29uc29sZSIsInRvU3RyaW5nIiwidHJpbSIsImUiLCJleGVjUmVzdWx0IiwiTk9ERV9QQVRIIiwiX2hvb2tDaGlsZFByb2NFdmVudHMiLCJzdGFydERlYnVnZ2VyIiwiX2luaXRpYWxpemVEZWJ1Z2dlciIsInN0b3BEZWJ1Z2dlciIsImNsb3NlIiwicmVtb3ZlQWxsTGlzdGVuZXJzIiwic3RvcCIsInN0YXR1cyIsIl9wYXVzZWQiLCJkaXNhYmxlIiwicmVzdW1lVGVybWluYXRlIiwiaW52b2tlIiwiX3NlbmQiLCJ0eXBlIiwia2lsbCIsIl9yZXNldCIsImluaXRPeHlnZW4iLCJyaWQiLCJvcHRpb25zIiwiY2FwcyIsImJlZm9yZVRpbWUiLCJEYXRlIiwiZ2V0VGltZSIsImFmdGVyVGltZSIsImR1cmF0aW9uIiwic3RhcnRTZXNzaW9uIiwiZW5kU2Vzc2lvbiIsImRpc3Bvc2VNb2R1bGVzIiwiZGlzcG9zZSIsImRlYnVnZ2VyIiwiaXNSdW5uaW5nIiwiaXNJbml0aWFsaXplZCIsInJ1biIsInJ1bk9wdHMiLCJzdWJzY3JpYmUiLCJldmVudE5hbWUiLCJoYW5kbGVyIiwiZXZlbnQiLCJtZXRob2QiLCJhcmdzIiwiQXJyYXkiLCJwcm90b3R5cGUiLCJzbGljZSIsImNhbGwiLCJhcmd1bWVudHMiLCJsZW5ndGgiLCJzaGlmdCIsImNhbGxJZCIsIm94dXRpbCIsImdlbmVyYXRlVW5pcXVlSWQiLCJwcm9taXNlIiwiaW52b2tlVGVzdEhvb2siLCJob29rTmFtZSIsImhvb2tBcmdzIiwibWVzc2FnZSIsInNlbmQiLCJfd2hlbk94eWdlbkRpc3Bvc2VkIiwiX3doZW5PeHlnZW5Jbml0aWFsaXplZCIsIl93aGVuTW9kdWxlc0Rpc3Bvc2VkIiwib24iLCJfaGFuZGxlQ2hpbGRNZXNzYWdlIiwiYmluZCIsIl9oYW5kbGVDaGlsZEVycm9yIiwiX2hhbmRsZUNoaWxkRXhpdCIsIl9oYW5kbGVDaGlsZERpc2Nvbm5lY3QiLCJfaGFuZGxlQ2hpbGRVbmNhdWdodEV4Y2VwdGlvbiIsIl9oYW5kbGVDaGlsZFNpZ0ludCIsIm1zZyIsImhhc093blByb3BlcnR5IiwiZXJyb3IiLCJyZXR2YWwiLCJlbWl0IiwiX2hhbmRsZVdvcmtlckV2ZW50IiwiYXBwbHkiLCJ1bmRlZmluZWQiLCJkZWJ1ZyIsImV4aXRDb2RlIiwic2lnbmFsIiwiRGVidWdnZXIiLCJ3aGVuRGVidWdnZXJSZWFkeSIsIl90aGlzIiwiY29udGludWUiLCJpc1Jlc29sdmVkIiwiYnJlYWtwb2ludERhdGEiLCJicmVha0Vycm9yIiwiaW5jbHVkZXMiLCJjb25uZWN0Il0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7QUFBQTs7QUFDQTs7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QUt0RixTQUFMLENBQWUyRixFQUFmLENBQWtCLE9BQWxCLEVBQTJCLFVBQVN3QixjQUFULEVBQXlCO0FBQ2hELFdBQUtaLElBQUwsQ0FBVSxnQkFBVixFQUE0QlksY0FBNUI7QUFDSCxLQUZEOztBQUdBLFNBQUtuSCxTQUFMLENBQWUyRixFQUFmLENBQWtCLFlBQWxCLEVBQWdDLGdCQUFleUIsVUFBZixFQUEyQjtBQUV2RCxVQUFJQSxVQUFVLElBQUlBLFVBQVUsQ0FBQzlCLE9BQTdCLEVBQXNDO0FBQ2xDLFlBQUkwQixLQUFLLENBQUM3RyxpQkFBTixDQUF3QmtILFFBQXhCLENBQWlDRCxVQUFVLENBQUM5QixPQUE1QyxDQUFKLEVBQTBELENBRXpELENBRkQsTUFFTztBQUNIMEIsVUFBQUEsS0FBSyxDQUFDN0csaUJBQU4sQ0FBd0JpQixJQUF4QixDQUE2QmdHLFVBQVUsQ0FBQzlCLE9BQXhDOztBQUNBLGVBQUtpQixJQUFMLENBQVUscUJBQVYsRUFBaUNhLFVBQWpDO0FBQ0g7QUFDSjtBQUNKLEtBVkQ7O0FBWUEsUUFBSTtBQUNBM0ksTUFBQUEsR0FBRyxDQUFDc0MsSUFBSixDQUFVLGtDQUFpQyxLQUFLaEIsVUFBVyxLQUEzRDtBQUNBLFlBQU0sS0FBS0MsU0FBTCxDQUFlc0gsT0FBZixDQUF1QixLQUFLdkgsVUFBNUIsRUFBd0MsV0FBeEMsQ0FBTjtBQUNILEtBSEQsQ0FHRSxPQUFPOEIsQ0FBUCxFQUFVO0FBQ1JwRCxNQUFBQSxHQUFHLENBQUM0SCxLQUFKLENBQVUsa0NBQVYsRUFBOEN4RSxDQUE5QztBQUNBLFlBQU15RCxPQUFPLEdBQUcscUNBQXFDekQsQ0FBQyxDQUFDeUQsT0FBdkQ7QUFDQXlCLE1BQUFBLGlCQUFpQixDQUFDeEYsTUFBbEIsQ0FBeUIrRCxPQUF6QjtBQUNIOztBQUVELFdBQU95QixpQkFBaUIsQ0FBQzdCLE9BQXpCO0FBQ0g7O0FBcFptRCIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGZvcmssIGV4ZWNTeW5jLCBleGVjIH0gZnJvbSAnY2hpbGRfcHJvY2Vzcyc7XHJcbmltcG9ydCB7IEV2ZW50RW1pdHRlciB9IGZyb20gJ2V2ZW50cyc7XHJcbmltcG9ydCB7IGRlZmVyIH0gZnJvbSAnd2hlbic7XHJcblxyXG4vLyBzZXR1cCBsb2dnZXJcclxuaW1wb3J0IGxvZ2dlciBmcm9tICcuLi9saWIvbG9nZ2VyJztcclxuY29uc3QgbG9nID0gbG9nZ2VyKCdXb3JrZXJQcm9jZXNzJyk7XHJcblxyXG5pbXBvcnQgRGVidWdnZXIgZnJvbSAnLi4vbGliL2RlYnVnZ2VyJztcclxuaW1wb3J0IG94dXRpbCBmcm9tICcuLi9saWIvdXRpbCc7XHJcblxyXG4vLyBzbm9vemUgZnVuY3Rpb24gLSBhc3luYyB3cmFwcGVyIGFyb3VuZCBzZXRUaW1lb3V0IGZ1bmN0aW9uXHJcbmNvbnN0IHNub296ZSA9IG1zID0+IG5ldyBQcm9taXNlKHJlc29sdmUgPT4gc2V0VGltZW91dChyZXNvbHZlLCBtcykpO1xyXG5cclxuLyoqXHJcbiAqIFdvcmtlclByb2Nlc3MgcmVzcG9uc2libGUgZm9yIHNwYXduaW5nIGEgd29ya2VyIHByb2Nlc3MgdGhlIHRlc3QgaW5zdGFuY2UuXHJcbiAqL1xyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBXb3JrZXJQcm9jZXNzIGV4dGVuZHMgRXZlbnRFbWl0dGVyIHtcclxuICAgIGNvbnN0cnVjdG9yKHBpZCwgd29ya2VyUGF0aCwgZGVidWdNb2RlLCBkZWJ1Z1BvcnQsIG5hbWUgPSBudWxsLCBucG1HUm9vdEV4ZWN1dGlvbiA9IHRydWUpIHtcclxuICAgICAgICBzdXBlcigpO1xyXG4gICAgICAgIHRoaXMuX25hbWUgPSBuYW1lO1xyXG4gICAgICAgIHRoaXMuX2lzUnVubmluZyA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMuX2lzSW5pdGlhbGl6ZWQgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLl9zdG9wcGVkQnlVc2VyID0gdHJ1ZTtcclxuICAgICAgICB0aGlzLl9waWQgPSBwaWQ7XHJcbiAgICAgICAgdGhpcy5fY2hpbGRQcm9jID0gbnVsbDtcclxuICAgICAgICB0aGlzLl9kZWJ1Z01vZGUgPSBkZWJ1Z01vZGU7XHJcbiAgICAgICAgdGhpcy5fZGVidWdQb3J0ID0gZGVidWdQb3J0O1xyXG4gICAgICAgIHRoaXMuX2RlYnVnZ2VyID0gbnVsbDtcclxuICAgICAgICB0aGlzLl93b3JrZXJQYXRoID0gd29ya2VyUGF0aDtcclxuICAgICAgICB0aGlzLl9ucG1HUm9vdEV4ZWN1dGlvbiA9IG5wbUdSb290RXhlY3V0aW9uO1xyXG4gICAgICAgIHRoaXMuX2JyZWFrcG9pbnRFcnJvcnMgPSBbXTtcclxuICAgICAgICAvLyBob2xkIHRoZSByZW1vdGUgaW52b2NhdGlvbiBwcm9taXNlXHJcbiAgICAgICAgdGhpcy5fY2FsbHMgPSB7fTtcclxuICAgICAgICB0aGlzLl9ldmVudEhhbmRsZXJzID0ge307XHJcbiAgICB9XHJcbiAgICBhc3luYyBzdGFydCgpIHtcclxuICAgICAgICBjb25zdCBlbnYgPSBPYmplY3QuYXNzaWduKHByb2Nlc3MuZW52LCB7XHJcbiAgICAgICAgICAgIE9YX1dPUktFUjogdHJ1ZSxcclxuICAgICAgICAgICAgREVCVUc6ICFpc05hTih0aGlzLl9kZWJ1Z1BvcnQpLFxyXG4gICAgICAgICAgICBOT19VUERBVEVfTk9USUZJRVI6IHRydWVcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgbG9nLmluZm8oYFN0YXJ0aW5nIHdvcmtlciBwcm9jZXNzICR7dGhpcy5fcGlkfS5gKTtcclxuICAgICAgICBsZXQgZm9ya09wdHMgPSB7XHJcbiAgICAgICAgICAgIGN3ZDogcHJvY2Vzcy5jd2QoKSxcclxuICAgICAgICAgICAgZW52LFxyXG4gICAgICAgICAgICBleGVjQXJndjogW10sXHJcbiAgICAgICAgICAgIGRldGFjaGVkOiBmYWxzZSxcclxuICAgICAgICAgICAgLy9zaWxlbnQ6IGZhbHNlXHJcbiAgICAgICAgfTtcclxuICAgICAgICBpZiAodGhpcy5fZGVidWdQb3J0KSB7XHJcbiAgICAgICAgICAgIC8vIGFkZCAtLWluc3BlY3QtYnJrIGFyZ3VtZW50IGlmIGRlYnVnIHBvcnQgaXMgc3BlY2lmaWVkXHJcbiAgICAgICAgICAgIGZvcmtPcHRzLmV4ZWNBcmd2ID0gT2JqZWN0LmFzc2lnbihmb3JrT3B0cy5leGVjQXJndiwgWyctLWluc3BlY3QtYnJrPScgKyB0aGlzLl9kZWJ1Z1BvcnRdKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIHByaW50IG1vcmUgaW5mb3JtYXRpb24gZm9yIG5vZGVqcyBlcnJvcnNcclxuICAgICAgICBmb3JrT3B0cy5leGVjQXJndi5wdXNoKCctLXRyYWNlLXdhcm5pbmdzJyk7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLl9ucG1HUm9vdEV4ZWN1dGlvbikge1xyXG4gICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgbGV0IGdsb2JhbE5wbU1vZHVsZXNQYXRoO1xyXG5cclxuICAgICAgICAgICAgICAgIGlmIChwcm9jZXNzLnBsYXRmb3JtID09PSAnZGFyd2luJykge1xyXG4gICAgICAgICAgICAgICAgICAgIGF3YWl0ICgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWMoJ25wbSByb290IC1nJywge2N3ZDogcHJvY2Vzcy5jd2QoKX0sIGZ1bmN0aW9uIChlcnIsIHN0ZG91dCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXJyKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnZGFyd2luIG5wbSByb290IGVycm9yOicsIGVycik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0ZG91dCAmJiBzdGRvdXQudG9TdHJpbmcpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdsb2JhbE5wbU1vZHVsZXNQYXRoID0gc3Rkb3V0LnRvU3RyaW5nKCkudHJpbSgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0KGUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICB9KSgpO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBleGVjUmVzdWx0ID0gZXhlY1N5bmMoJ25wbSByb290IC1nJyk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChleGVjUmVzdWx0ICYmIGV4ZWNSZXN1bHQudG9TdHJpbmcpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZ2xvYmFsTnBtTW9kdWxlc1BhdGggPSBleGVjUmVzdWx0LnRvU3RyaW5nKCkudHJpbSgpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoXHJcbiAgICAgICAgICAgICAgICAgICAgZ2xvYmFsTnBtTW9kdWxlc1BhdGggJiZcclxuICAgICAgICAgICAgICAgICAgICBmb3JrT3B0cyAmJlxyXG4gICAgICAgICAgICAgICAgICAgIGZvcmtPcHRzLmVudlxyXG4gICAgICAgICAgICAgICAgKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZm9ya09wdHMuZW52Lk5PREVfUEFUSCA9IGdsb2JhbE5wbU1vZHVsZXNQYXRoO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnbnBtIHJvb3QgZXJyb3I6JywgZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIGZvcmsgd29ya2VyXHJcbiAgICAgICAgdGhpcy5fY2hpbGRQcm9jID0gZm9yayh0aGlzLl93b3JrZXJQYXRoLCBmb3JrT3B0cyk7XHJcblxyXG4gICAgICAgIHRoaXMuX2hvb2tDaGlsZFByb2NFdmVudHMoKTtcclxuICAgICAgICAvLyBpZiB3ZSBhcmUgaW4gZGVidWcgbW9kZSwgaW5pdGlhbGl6ZSBkZWJ1Z2dlciBhbmQgb25seSB0aGVuIHN0YXJ0IG1vZHVsZXMgJ2luaXQnXHJcblxyXG4gICAgICAgIHRoaXMuX2lzUnVubmluZyA9IHRydWU7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2NoaWxkUHJvYztcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBzdGFydERlYnVnZ2VyKCkge1xyXG4gICAgICAgIGlmICh0aGlzLl9kZWJ1Z01vZGUpIHtcclxuICAgICAgICAgICAgYXdhaXQgdGhpcy5faW5pdGlhbGl6ZURlYnVnZ2VyKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIHN0b3BEZWJ1Z2dlcigpIHtcclxuICAgICAgICBpZiAodGhpcy5fZGVidWdnZXIpIHtcclxuICAgICAgICAgICAgYXdhaXQgdGhpcy5fZGVidWdnZXIuY2xvc2UoKTtcclxuICAgICAgICAgICAgdGhpcy5fZGVidWdnZXIucmVtb3ZlQWxsTGlzdGVuZXJzKCk7XHJcbiAgICAgICAgICAgIHRoaXMuX2RlYnVnZ2VyID0gbnVsbDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgc3RvcChzdGF0dXMgPSBudWxsKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuX2lzSW5pdGlhbGl6ZWQgJiYgdGhpcy5fY2hpbGRQcm9jKSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLl9kZWJ1Z2dlciAmJiB0aGlzLl9kZWJ1Z2dlci5fcGF1c2VkKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoJ0NBTkNFTEVEJyA9PT0gc3RhdHVzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5fZGVidWdnZXIuZGlzYWJsZSgpO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLl9kZWJ1Z2dlci5yZXN1bWVUZXJtaW5hdGUoKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBhd2FpdCB0aGlzLmludm9rZSgnZGlzcG9zZScsIHN0YXR1cyk7XHJcbiAgICAgICAgICAgIGF3YWl0IHNub296ZSgxMDApO1xyXG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5fY2hpbGRQcm9jKSB7XHJcbiAgICAgICAgICAgIGF3YWl0IHNub296ZSgxMDApO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodGhpcy5fZGVidWdnZXIpIHtcclxuICAgICAgICAgICAgYXdhaXQgdGhpcy5fZGVidWdnZXIuY2xvc2UoKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuX3NlbmQoe1xyXG4gICAgICAgICAgICB0eXBlOiAnZXhpdCcsXHJcbiAgICAgICAgICAgIHN0YXR1czogc3RhdHVzLFxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHRoaXMua2lsbCgpO1xyXG4gICAgICAgIHRoaXMuX3Jlc2V0KCk7XHJcbiAgICB9XHJcblxyXG4gICAga2lsbCgpIHtcclxuICAgICAgICBpZiAodGhpcy5fY2hpbGRQcm9jKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2NoaWxkUHJvYy5raWxsKCdTSUdJTlQnKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgaW5pdE94eWdlbihyaWQsIG9wdGlvbnMsIGNhcHMpIHtcclxuICAgICAgICBpZiAoIXRoaXMuX2lzSW5pdGlhbGl6ZWQpIHtcclxuICAgICAgICAgICAgY29uc3QgYmVmb3JlVGltZSA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpO1xyXG4gICAgICAgICAgICBhd2FpdCB0aGlzLmludm9rZSgnaW5pdCcsIHJpZCwgb3B0aW9ucywgY2Fwcyk7XHJcblxyXG4gICAgICAgICAgICBjb25zdCBhZnRlclRpbWUgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKTtcclxuICAgICAgICAgICAgY29uc3QgZHVyYXRpb24gPSBhZnRlclRpbWUgLSBiZWZvcmVUaW1lO1xyXG4gICAgICAgICAgICB0aGlzLl9pc0luaXRpYWxpemVkID0gdHJ1ZTtcclxuICAgICAgICAgICAgbGV0IHN0YXJ0ID0gJyc7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLl9uYW1lKSB7XHJcbiAgICAgICAgICAgICAgICBzdGFydCA9IHRoaXMuX25hbWUgKyAnICc7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgbG9nLmluZm8oc3RhcnQgKyAnV29ya2VyIGluaXRpYWxpemVkIGluICcgKyBkdXJhdGlvbiArICcgbXMnKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgc3RhcnRTZXNzaW9uKCkge1xyXG4gICAgICAgIGxldCBzdGFydCA9ICcnO1xyXG4gICAgICAgIGlmICh0aGlzLl9uYW1lKSB7XHJcbiAgICAgICAgICAgIHN0YXJ0ID0gdGhpcy5fbmFtZSArICcgJztcclxuICAgICAgICB9XHJcbiAgICAgICAgbG9nLmluZm8oc3RhcnQgKyAnU2Vzc2lvbiBzdGFydGVkJyk7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgZW5kU2Vzc2lvbihzdGF0dXMgPSBudWxsLCBkaXNwb3NlTW9kdWxlcyA9IHRydWUpIHtcclxuICAgICAgICBpZiAodGhpcy5fY2hpbGRQcm9jKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGJlZm9yZVRpbWUgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKTtcclxuICAgICAgICAgICAgYXdhaXQgdGhpcy5pbnZva2UoJ2VuZFNlc3Npb24nLCBzdGF0dXMsIGRpc3Bvc2VNb2R1bGVzKTtcclxuICAgICAgICAgICAgY29uc3QgYWZ0ZXJUaW1lID0gbmV3IERhdGUoKS5nZXRUaW1lKCk7XHJcbiAgICAgICAgICAgIGNvbnN0IGR1cmF0aW9uID0gYWZ0ZXJUaW1lIC0gYmVmb3JlVGltZTtcclxuICAgICAgICAgICAgbGV0IHN0YXJ0ID0gJyc7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLl9uYW1lKSB7XHJcbiAgICAgICAgICAgICAgICBzdGFydCA9IHRoaXMuX25hbWUgKyAnICc7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgbG9nLmluZm8oc3RhcnQgKyAnU2Vzc2lvbiBlbmRlZCBpbiAnICsgZHVyYXRpb24gKyAnIG1zJyk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIGRpc3Bvc2Uoc3RhdHVzID0gbnVsbCkge1xyXG4gICAgICAgIGlmICh0aGlzLl9kZWJ1Z2dlcikge1xyXG4gICAgICAgICAgICBhd2FpdCB0aGlzLl9kZWJ1Z2dlci5jbG9zZSgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodGhpcy5faXNJbml0aWFsaXplZCAmJiB0aGlzLl9jaGlsZFByb2MpIHtcclxuICAgICAgICAgICAgdGhpcy5faXNJbml0aWFsaXplZCA9IGZhbHNlO1xyXG5cclxuICAgICAgICAgICAgYXdhaXQgdGhpcy5pbnZva2UoJ2Rpc3Bvc2UnLCBzdGF0dXMpO1xyXG4gICAgICAgICAgICB0aGlzLl9zZW5kKHtcclxuICAgICAgICAgICAgICAgIHR5cGU6ICdleGl0JyxcclxuICAgICAgICAgICAgICAgIHN0YXR1czogc3RhdHVzLFxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgdGhpcy5raWxsKCk7XHJcblxyXG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5fY2hpbGRQcm9jKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2lzSW5pdGlhbGl6ZWQgPSBmYWxzZTtcclxuICAgICAgICAgICAgdGhpcy5fc2VuZCh7XHJcbiAgICAgICAgICAgICAgICB0eXBlOiAnZXhpdCcsXHJcbiAgICAgICAgICAgICAgICBzdGF0dXM6IHN0YXR1cyxcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIHRoaXMua2lsbCgpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBnZXQgZGVidWdnZXIgKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9kZWJ1Z2dlcjtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgaXNSdW5uaW5nICgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5faXNSdW5uaW5nO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBpc0luaXRpYWxpemVkKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9pc0luaXRpYWxpemVkO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIHJ1bihydW5PcHRzKSB7XHJcbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuaW52b2tlKCdydW4nLCBydW5PcHRzKTtcclxuICAgIH1cclxuXHJcbiAgICBzdWJzY3JpYmUoZXZlbnROYW1lLCBoYW5kbGVyKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLl9ldmVudEhhbmRsZXJzW2V2ZW50TmFtZV0gJiYgdHlwZW9mIGhhbmRsZXIgPT09ICdmdW5jdGlvbicpIHtcclxuICAgICAgICAgICAgdGhpcy5fZXZlbnRIYW5kbGVyc1tldmVudE5hbWVdID0gaGFuZGxlcjtcclxuICAgICAgICAgICAgdGhpcy5fc2VuZCh7XHJcbiAgICAgICAgICAgICAgICB0eXBlOiAnc3Vic2NyaWJlJyxcclxuICAgICAgICAgICAgICAgIGV2ZW50OiBldmVudE5hbWUsXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBpbnZva2UobWV0aG9kKSB7XHJcbiAgICAgICAgbGV0IGFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO1xyXG4gICAgICAgIC8vIGlnbm9yZSBmaXJzdCBhcmd1bWVudCAtIGUuZy4gbWV0aG9kXHJcbiAgICAgICAgaWYgKGFyZ3MubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICBhcmdzLnNoaWZ0KCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0aGlzLl9jaGlsZFByb2MpIHtcclxuICAgICAgICAgICAgY29uc3QgY2FsbElkID0gb3h1dGlsLmdlbmVyYXRlVW5pcXVlSWQoKTtcclxuICAgICAgICAgICAgdGhpcy5fc2VuZCh7XHJcbiAgICAgICAgICAgICAgICB0eXBlOiAnaW52b2tlJyxcclxuICAgICAgICAgICAgICAgIG1ldGhvZDogbWV0aG9kLFxyXG4gICAgICAgICAgICAgICAgY2FsbElkOiBjYWxsSWQsXHJcbiAgICAgICAgICAgICAgICBhcmdzOiBhcmdzXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB0aGlzLl9jYWxsc1tjYWxsSWRdID0gZGVmZXIoKTtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2NhbGxzW2NhbGxJZF0ucHJvbWlzZTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgaW52b2tlVGVzdEhvb2soaG9va05hbWUsIGhvb2tBcmdzKSB7XHJcbiAgICAgICAgY29uc3QgY2FsbElkID0gb3h1dGlsLmdlbmVyYXRlVW5pcXVlSWQoKTtcclxuICAgICAgICB0aGlzLl9zZW5kKHtcclxuICAgICAgICAgICAgdHlwZTogJ2ludm9rZTpob29rJyxcclxuICAgICAgICAgICAgbWV0aG9kOiBob29rTmFtZSxcclxuICAgICAgICAgICAgY2FsbElkOiBjYWxsSWQsXHJcbiAgICAgICAgICAgIGFyZ3M6IGhvb2tBcmdzXHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgdGhpcy5fY2FsbHNbY2FsbElkXSA9IGRlZmVyKCk7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2NhbGxzW2NhbGxJZF0ucHJvbWlzZTtcclxuICAgIH1cclxuXHJcbiAgICBfc2VuZChtZXNzYWdlKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLl9jaGlsZFByb2MpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLl9jaGlsZFByb2Muc2VuZChtZXNzYWdlKTtcclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICBfcmVzZXQoKSB7XHJcbiAgICAgICAgdGhpcy5fY2hpbGRQcm9jID0gbnVsbDtcclxuICAgICAgICB0aGlzLl9kZWJ1Z2dlciA9IG51bGw7XHJcbiAgICAgICAgdGhpcy5faXNSdW5uaW5nID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5fZGVidWdNb2RlID0gbnVsbDtcclxuICAgICAgICB0aGlzLl9kZWJ1Z1BvcnQgPSBudWxsO1xyXG4gICAgICAgIHRoaXMuX3doZW5PeHlnZW5EaXNwb3NlZCA9IG51bGw7XHJcbiAgICAgICAgdGhpcy5fd2hlbk94eWdlbkluaXRpYWxpemVkID0gbnVsbDtcclxuICAgICAgICB0aGlzLl93aGVuTW9kdWxlc0Rpc3Bvc2VkID0gbnVsbDtcclxuICAgICAgICB0aGlzLl9pc0luaXRpYWxpemVkID0gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgX2hvb2tDaGlsZFByb2NFdmVudHMoKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLl9jaGlsZFByb2MpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLl9jaGlsZFByb2Mub24oJ21lc3NhZ2UnLCB0aGlzLl9oYW5kbGVDaGlsZE1lc3NhZ2UuYmluZCh0aGlzKSk7XHJcbiAgICAgICAgdGhpcy5fY2hpbGRQcm9jLm9uKCdlcnJvcicsIHRoaXMuX2hhbmRsZUNoaWxkRXJyb3IuYmluZCh0aGlzKSk7XHJcbiAgICAgICAgdGhpcy5fY2hpbGRQcm9jLm9uKCdleGl0JywgdGhpcy5faGFuZGxlQ2hpbGRFeGl0LmJpbmQodGhpcykpO1xyXG4gICAgICAgIHRoaXMuX2NoaWxkUHJvYy5vbignZGlzY29ubmVjdCcsIHRoaXMuX2hhbmRsZUNoaWxkRGlzY29ubmVjdC5iaW5kKHRoaXMpKTtcclxuICAgICAgICB0aGlzLl9jaGlsZFByb2Mub24oJ3VuY2F1Z2h0RXhjZXB0aW9uJywgdGhpcy5faGFuZGxlQ2hpbGRVbmNhdWdodEV4Y2VwdGlvbi5iaW5kKHRoaXMpKTtcclxuICAgICAgICB0aGlzLl9jaGlsZFByb2Mub24oJ1NJR0lOVCcsIHRoaXMuX2hhbmRsZUNoaWxkU2lnSW50LmJpbmQodGhpcykpO1xyXG4gICAgfVxyXG5cclxuICAgIF9oYW5kbGVDaGlsZE1lc3NhZ2UobXNnKSB7XHJcbiAgICAgICAgaWYgKG1zZy5ldmVudCkge1xyXG4gICAgICAgICAgICBzd2l0Y2ggKG1zZy5ldmVudCkge1xyXG4gICAgICAgICAgICAgICAgY2FzZSAnaW52b2tlOnJlc3VsdCc6XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKG1zZy5jYWxsSWQgJiYgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHRoaXMuX2NhbGxzLCBtc2cuY2FsbElkKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwcm9taXNlID0gdGhpcy5fY2FsbHNbbXNnLmNhbGxJZF07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtc2cuZXJyb3IpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb21pc2UucmVqZWN0KG1zZy5lcnJvcik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9taXNlLnJlc29sdmUobXNnLnJldHZhbCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHRoaXMuX2NhbGxzW21zZy5jYWxsSWRdO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIGNhc2UgJ3JlcG9ydGVyJzpcclxuICAgICAgICAgICAgICAgICAgICBpZiAobXNnLm1ldGhvZCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmVtaXQoJ3JlcG9ydGVyJywgeyBwaWQ6IHRoaXMuX3BpZCwgbWV0aG9kOiBtc2cubWV0aG9kLCBhcmdzOiBtc2cuYXJncyB9KTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICBjYXNlICdldmVudCc6XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5faGFuZGxlV29ya2VyRXZlbnQobXNnLm5hbWUsIG1zZy5hcmdzKTtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmVtaXQoJ21lc3NhZ2UnLCBPYmplY3QuYXNzaWduKG1zZywgeyBwaWQ6IHRoaXMuX3BpZCB9KSk7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgX2hhbmRsZVdvcmtlckV2ZW50KG5hbWUsIGFyZ3MpIHtcclxuICAgICAgICBpZiAobmFtZSAmJiB0aGlzLl9ldmVudEhhbmRsZXJzICYmIHRoaXMuX2V2ZW50SGFuZGxlcnNbbmFtZV0pIHtcclxuICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuX2V2ZW50SGFuZGxlcnNbbmFtZV0uYXBwbHkodW5kZWZpbmVkLCBhcmdzKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICAgICAgbG9nLmVycm9yKCdFcnJvciB0aHJvd24gYnkgd29ya2VyIGV2ZW50IGhhbmRsZXIgXCIke25hbWV9OicsIGUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIF9oYW5kbGVDaGlsZEVycm9yKGVycm9yKSB7XHJcbiAgICAgICAgbG9nLmRlYnVnKGBXb3JrZXIgJHt0aGlzLl9waWR9IHRocm93biBhbiBlcnJvcjogJHtlcnJvcn0uYCk7XHJcbiAgICAgICAgdGhpcy5lbWl0KCdlcnJvcicsIE9iamVjdC5hc3NpZ24oeyBlcnJvciA6IGVycm9yIH0sIHsgcGlkOiB0aGlzLl9waWQgfSkpO1xyXG4gICAgfVxyXG5cclxuICAgIF9oYW5kbGVDaGlsZEV4aXQoZXhpdENvZGUsIHNpZ25hbCkge1xyXG4gICAgICAgIGxvZy5kZWJ1ZyhgV29ya2VyICR7dGhpcy5fcGlkfSBmaW5pc2hlZCB3aXRoIGV4aXQgY29kZSAke2V4aXRDb2RlfSBhbmQgc2lnbmFsICR7c2lnbmFsfS5gKTtcclxuICAgICAgICB0aGlzLl9yZXNldCgpO1xyXG4gICAgICAgIHRoaXMuZW1pdCgnZXhpdCcsIHsgcGlkOiB0aGlzLl9waWQsIGV4aXRDb2RlLCBzaWduYWwgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgX2hhbmRsZUNoaWxkRGlzY29ubmVjdCgpIHtcclxuICAgICAgICBsb2cuZGVidWcoYFdvcmtlciAke3RoaXMuX3BpZH0gZGlzY29ubmVjdGVkLmApO1xyXG4gICAgfVxyXG5cclxuICAgIF9oYW5kbGVDaGlsZFVuY2F1Z2h0RXhjZXB0aW9uKGVycm9yKSB7XHJcbiAgICAgICAgbG9nLmRlYnVnKGBXb3JrZXIgJHt0aGlzLl9waWR9IHRocm93biBhbiB1bmNhdWdodCBlcnJvcjogJHtlcnJvcn0uYCk7XHJcbiAgICAgICAgdGhpcy5fcmVzZXQoKTtcclxuICAgICAgICB0aGlzLmVtaXQoJ2Vycm9yJywgT2JqZWN0LmFzc2lnbih7IGVycm9yIDogZXJyb3IgfSwgeyBwaWQ6IHRoaXMuX3BpZCB9KSk7XHJcbiAgICAgICAgdGhpcy5lbWl0KCdleGl0JywgeyBwaWQ6IHRoaXMuX3BpZCwgZXhpdENvZGU6IDEgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgX2hhbmRsZUNoaWxkU2lnSW50KCkge1xyXG4gICAgICAgIGxvZy5kZWJ1ZyhgV29ya2VyICR7dGhpcy5fcGlkfSByZWNlaXZlZCBTSUdJTlQgc2lnbmFsLmApO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIF9pbml0aWFsaXplRGVidWdnZXIoKSB7XHJcbiAgICAgICAgdGhpcy5fZGVidWdnZXIgPSBuZXcgRGVidWdnZXIodGhpcy5fcGlkKTtcclxuICAgICAgICBsZXQgd2hlbkRlYnVnZ2VyUmVhZHkgPSBkZWZlcigpO1xyXG4gICAgICAgIGNvbnN0IF90aGlzID0gdGhpcztcclxuICAgICAgICAvLyBoYW5kbGUgZGVidWdnZXIgZXZlbnRzXHJcbiAgICAgICAgdGhpcy5fZGVidWdnZXIub24oJ3JlYWR5JywgZnVuY3Rpb24oZXJyKSB7XHJcbiAgICAgICAgICAgIC8vIHJlc3VtZSB0aGUgZmlyc3QgYnJlYWtwb2ludCB3aGljaCBpcyBhdXRvbWF0aWNhbGx5IGFkZGVkIGJ5IHRoZSBkZWJ1Z2dlclxyXG4gICAgICAgICAgICBpZiAoX3RoaXMuX2RlYnVnZ2VyICYmIF90aGlzLl9kZWJ1Z2dlci5jb250aW51ZSkge1xyXG4gICAgICAgICAgICAgICAgX3RoaXMuX2RlYnVnZ2VyLmNvbnRpbnVlKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgd2hlbkRlYnVnZ2VyUmVhZHkucmVzb2x2ZSgpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHRoaXMuX2RlYnVnZ2VyLm9uKCdlcnJvcicsIGZ1bmN0aW9uKGVycikge1xyXG5cclxuICAgICAgICAgICAgbG9nLmVycm9yKCdEZWJ1Z2dlciBlcnJvciA6JywgZXJyKTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuZW1pdCgnZGVidWdnZXI6ZXJyb3InLCBPYmplY3QuYXNzaWduKGVyciwgeyBwaWQ6IHRoaXMuX3BpZCB9KSk7XHJcbiAgICAgICAgICAgIC8vIHJlamVjdCB0aGUgcHJvbWlzZSBvbmx5IGlmIHdlIGdvdCBhbiBlcnJvciByaWdodCBhZnRlciBfZGVidWdnZXIuY29ubmVjdCgpIGNhbGwgYmVsb3cgLSB3ZSBuZWVkIHRoaXMgdG8gaW5kaWNhdGUgZGVidWdnZXIgaW5pdGlhbGl6YXRpb24gZXJyb3JcclxuICAgICAgICAgICAgaWYgKCF3aGVuRGVidWdnZXJSZWFkeS5pc1Jlc29sdmVkKSB7XHJcbiAgICAgICAgICAgICAgICB3aGVuRGVidWdnZXJSZWFkeS5yZWplY3QoZXJyLm1lc3NhZ2UpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgdGhpcy5fZGVidWdnZXIub24oJ2JyZWFrJywgZnVuY3Rpb24oYnJlYWtwb2ludERhdGEpIHtcclxuICAgICAgICAgICAgdGhpcy5lbWl0KCdkZWJ1Z2dlcjpicmVhaycsIGJyZWFrcG9pbnREYXRhKTtcclxuICAgICAgICB9KTtcclxuICAgICAgICB0aGlzLl9kZWJ1Z2dlci5vbignYnJlYWtFcnJvcicsIGFzeW5jIGZ1bmN0aW9uKGJyZWFrRXJyb3IpIHtcclxuXHJcbiAgICAgICAgICAgIGlmIChicmVha0Vycm9yICYmIGJyZWFrRXJyb3IubWVzc2FnZSkge1xyXG4gICAgICAgICAgICAgICAgaWYgKF90aGlzLl9icmVha3BvaW50RXJyb3JzLmluY2x1ZGVzKGJyZWFrRXJyb3IubWVzc2FnZSkpIHtcclxuICAgICAgICAgICAgICAgICAgICAvLyBpZ25vcmVcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgX3RoaXMuX2JyZWFrcG9pbnRFcnJvcnMucHVzaChicmVha0Vycm9yLm1lc3NhZ2UpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZW1pdCgnZGVidWdnZXI6YnJlYWtFcnJvcicsIGJyZWFrRXJyb3IpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGxvZy5pbmZvKGBDb25uZWN0aW5nIHRvIGRlYnVnZ2VyIG9uIHBvcnQgJHt0aGlzLl9kZWJ1Z1BvcnR9Li4uYCk7XHJcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuX2RlYnVnZ2VyLmNvbm5lY3QodGhpcy5fZGVidWdQb3J0LCAnMTI3LjAuMC4xJyk7XHJcbiAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICBsb2cuZXJyb3IoJ0Nhbm5vdCBjb25uZWN0IHRvIHRoZSBkZWJ1Z2dlcjogJywgZSk7XHJcbiAgICAgICAgICAgIGNvbnN0IG1lc3NhZ2UgPSAnQ2Fubm90IGNvbm5lY3QgdG8gdGhlIGRlYnVnZ2VyOiAnICsgZS5tZXNzYWdlO1xyXG4gICAgICAgICAgICB3aGVuRGVidWdnZXJSZWFkeS5yZWplY3QobWVzc2FnZSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gd2hlbkRlYnVnZ2VyUmVhZHkucHJvbWlzZTtcclxuICAgIH1cclxufSJdfQ==
387
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfY2hpbGRfcHJvY2VzcyIsInJlcXVpcmUiLCJfZXZlbnRzIiwiX3doZW4iLCJfbG9nZ2VyIiwiX2ludGVyb3BSZXF1aXJlRGVmYXVsdCIsIl9kZWJ1Z2dlciIsIl91dGlsIiwiZSIsIl9fZXNNb2R1bGUiLCJkZWZhdWx0IiwibG9nIiwibG9nZ2VyIiwic25vb3plIiwibXMiLCJQcm9taXNlIiwicmVzb2x2ZSIsInNldFRpbWVvdXQiLCJXb3JrZXJQcm9jZXNzIiwiRXZlbnRFbWl0dGVyIiwiY29uc3RydWN0b3IiLCJwaWQiLCJ3b3JrZXJQYXRoIiwiZGVidWdNb2RlIiwiZGVidWdQb3J0IiwibmFtZSIsIm5wbUdSb290RXhlY3V0aW9uIiwiX25hbWUiLCJfaXNSdW5uaW5nIiwiX2lzSW5pdGlhbGl6ZWQiLCJfc3RvcHBlZEJ5VXNlciIsIl9waWQiLCJfY2hpbGRQcm9jIiwiX2RlYnVnTW9kZSIsIl9kZWJ1Z1BvcnQiLCJfd29ya2VyUGF0aCIsIl9ucG1HUm9vdEV4ZWN1dGlvbiIsIl9icmVha3BvaW50RXJyb3JzIiwiX2NhbGxzIiwiX2V2ZW50SGFuZGxlcnMiLCJzdGFydCIsImVudiIsIk9iamVjdCIsImFzc2lnbiIsInByb2Nlc3MiLCJPWF9XT1JLRVIiLCJERUJVRyIsImlzTmFOIiwiTk9fVVBEQVRFX05PVElGSUVSIiwiaW5mbyIsImZvcmtPcHRzIiwiY3dkIiwiZXhlY0FyZ3YiLCJkZXRhY2hlZCIsInB1c2giLCJnbG9iYWxOcG1Nb2R1bGVzUGF0aCIsInBsYXRmb3JtIiwicmVqZWN0IiwiZXhlYyIsImVyciIsInN0ZG91dCIsImNvbnNvbGUiLCJ0b1N0cmluZyIsInRyaW0iLCJleGVjUmVzdWx0IiwiZXhlY1N5bmMiLCJOT0RFX1BBVEgiLCJmb3JrIiwiX2hvb2tDaGlsZFByb2NFdmVudHMiLCJzdGFydERlYnVnZ2VyIiwiX2luaXRpYWxpemVEZWJ1Z2dlciIsInN0b3BEZWJ1Z2dlciIsImNsb3NlIiwicmVtb3ZlQWxsTGlzdGVuZXJzIiwic3RvcCIsInN0YXR1cyIsIl9wYXVzZWQiLCJkaXNhYmxlIiwicmVzdW1lVGVybWluYXRlIiwiaW52b2tlIiwiX3NlbmQiLCJ0eXBlIiwia2lsbCIsIl9yZXNldCIsImluaXRPeHlnZW4iLCJyaWQiLCJvcHRpb25zIiwiY2FwcyIsImJlZm9yZVRpbWUiLCJEYXRlIiwiZ2V0VGltZSIsImFmdGVyVGltZSIsImR1cmF0aW9uIiwic3RhcnRTZXNzaW9uIiwiZW5kU2Vzc2lvbiIsImRpc3Bvc2VNb2R1bGVzIiwiZGlzcG9zZSIsImRlYnVnZ2VyIiwiaXNSdW5uaW5nIiwiaXNJbml0aWFsaXplZCIsInJ1biIsInJ1bk9wdHMiLCJzdWJzY3JpYmUiLCJldmVudE5hbWUiLCJoYW5kbGVyIiwiZXZlbnQiLCJtZXRob2QiLCJhcmdzIiwiQXJyYXkiLCJwcm90b3R5cGUiLCJzbGljZSIsImNhbGwiLCJhcmd1bWVudHMiLCJsZW5ndGgiLCJzaGlmdCIsImNhbGxJZCIsIm94dXRpbCIsImdlbmVyYXRlVW5pcXVlSWQiLCJkZWZlciIsInByb21pc2UiLCJpbnZva2VUZXN0SG9vayIsImhvb2tOYW1lIiwiaG9va0FyZ3MiLCJtZXNzYWdlIiwic2VuZCIsIl93aGVuT3h5Z2VuRGlzcG9zZWQiLCJfd2hlbk94eWdlbkluaXRpYWxpemVkIiwiX3doZW5Nb2R1bGVzRGlzcG9zZWQiLCJvbiIsIl9oYW5kbGVDaGlsZE1lc3NhZ2UiLCJiaW5kIiwiX2hhbmRsZUNoaWxkRXJyb3IiLCJfaGFuZGxlQ2hpbGRFeGl0IiwiX2hhbmRsZUNoaWxkRGlzY29ubmVjdCIsIl9oYW5kbGVDaGlsZFVuY2F1Z2h0RXhjZXB0aW9uIiwiX2hhbmRsZUNoaWxkU2lnSW50IiwibXNnIiwiaGFzT3duUHJvcGVydHkiLCJlcnJvciIsInJldHZhbCIsImVtaXQiLCJfaGFuZGxlV29ya2VyRXZlbnQiLCJhcHBseSIsInVuZGVmaW5lZCIsImRlYnVnIiwiZXhpdENvZGUiLCJzaWduYWwiLCJEZWJ1Z2dlciIsIndoZW5EZWJ1Z2dlclJlYWR5IiwiX3RoaXMiLCJjb250aW51ZSIsImlzUmVzb2x2ZWQiLCJicmVha3BvaW50RGF0YSIsImJyZWFrRXJyb3IiLCJpbmNsdWRlcyIsImNvbm5lY3QiLCJleHBvcnRzIl0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL3J1bm5lcnMvV29ya2VyUHJvY2Vzcy5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBmb3JrLCBleGVjU3luYywgZXhlYyB9IGZyb20gJ2NoaWxkX3Byb2Nlc3MnO1xyXG5pbXBvcnQgeyBFdmVudEVtaXR0ZXIgfSBmcm9tICdldmVudHMnO1xyXG5pbXBvcnQgeyBkZWZlciB9IGZyb20gJ3doZW4nO1xyXG5cclxuLy8gc2V0dXAgbG9nZ2VyXHJcbmltcG9ydCBsb2dnZXIgZnJvbSAnLi4vbGliL2xvZ2dlcic7XHJcbmNvbnN0IGxvZyA9IGxvZ2dlcignV29ya2VyUHJvY2VzcycpO1xyXG5cclxuaW1wb3J0IERlYnVnZ2VyIGZyb20gJy4uL2xpYi9kZWJ1Z2dlcic7XHJcbmltcG9ydCBveHV0aWwgZnJvbSAnLi4vbGliL3V0aWwnO1xyXG5cclxuLy8gc25vb3plIGZ1bmN0aW9uIC0gYXN5bmMgd3JhcHBlciBhcm91bmQgc2V0VGltZW91dCBmdW5jdGlvblxyXG5jb25zdCBzbm9vemUgPSBtcyA9PiBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgbXMpKTtcclxuXHJcbi8qKlxyXG4gKiBXb3JrZXJQcm9jZXNzIHJlc3BvbnNpYmxlIGZvciBzcGF3bmluZyBhIHdvcmtlciBwcm9jZXNzIHRoZSB0ZXN0IGluc3RhbmNlLlxyXG4gKi9cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgV29ya2VyUHJvY2VzcyBleHRlbmRzIEV2ZW50RW1pdHRlciB7XHJcbiAgICBjb25zdHJ1Y3RvcihwaWQsIHdvcmtlclBhdGgsIGRlYnVnTW9kZSwgZGVidWdQb3J0LCBuYW1lID0gbnVsbCwgbnBtR1Jvb3RFeGVjdXRpb24gPSB0cnVlKSB7XHJcbiAgICAgICAgc3VwZXIoKTtcclxuICAgICAgICB0aGlzLl9uYW1lID0gbmFtZTtcclxuICAgICAgICB0aGlzLl9pc1J1bm5pbmcgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLl9pc0luaXRpYWxpemVkID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5fc3RvcHBlZEJ5VXNlciA9IHRydWU7XHJcbiAgICAgICAgdGhpcy5fcGlkID0gcGlkO1xyXG4gICAgICAgIHRoaXMuX2NoaWxkUHJvYyA9IG51bGw7XHJcbiAgICAgICAgdGhpcy5fZGVidWdNb2RlID0gZGVidWdNb2RlO1xyXG4gICAgICAgIHRoaXMuX2RlYnVnUG9ydCA9IGRlYnVnUG9ydDtcclxuICAgICAgICB0aGlzLl9kZWJ1Z2dlciA9IG51bGw7XHJcbiAgICAgICAgdGhpcy5fd29ya2VyUGF0aCA9IHdvcmtlclBhdGg7XHJcbiAgICAgICAgdGhpcy5fbnBtR1Jvb3RFeGVjdXRpb24gPSBucG1HUm9vdEV4ZWN1dGlvbjtcclxuICAgICAgICB0aGlzLl9icmVha3BvaW50RXJyb3JzID0gW107XHJcbiAgICAgICAgLy8gaG9sZCB0aGUgcmVtb3RlIGludm9jYXRpb24gcHJvbWlzZVxyXG4gICAgICAgIHRoaXMuX2NhbGxzID0ge307XHJcbiAgICAgICAgdGhpcy5fZXZlbnRIYW5kbGVycyA9IHt9O1xyXG4gICAgfVxyXG4gICAgYXN5bmMgc3RhcnQoKSB7XHJcbiAgICAgICAgY29uc3QgZW52ID0gT2JqZWN0LmFzc2lnbihwcm9jZXNzLmVudiwge1xyXG4gICAgICAgICAgICBPWF9XT1JLRVI6IHRydWUsXHJcbiAgICAgICAgICAgIERFQlVHOiAhaXNOYU4odGhpcy5fZGVidWdQb3J0KSxcclxuICAgICAgICAgICAgTk9fVVBEQVRFX05PVElGSUVSOiB0cnVlXHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIGxvZy5pbmZvKGBTdGFydGluZyB3b3JrZXIgcHJvY2VzcyAke3RoaXMuX3BpZH0uYCk7XHJcbiAgICAgICAgbGV0IGZvcmtPcHRzID0ge1xyXG4gICAgICAgICAgICBjd2Q6IHByb2Nlc3MuY3dkKCksXHJcbiAgICAgICAgICAgIGVudixcclxuICAgICAgICAgICAgZXhlY0FyZ3Y6IFtdLFxyXG4gICAgICAgICAgICBkZXRhY2hlZDogZmFsc2UsXHJcbiAgICAgICAgICAgIC8vc2lsZW50OiBmYWxzZVxyXG4gICAgICAgIH07XHJcbiAgICAgICAgaWYgKHRoaXMuX2RlYnVnUG9ydCkge1xyXG4gICAgICAgICAgICAvLyBhZGQgLS1pbnNwZWN0LWJyayBhcmd1bWVudCBpZiBkZWJ1ZyBwb3J0IGlzIHNwZWNpZmllZFxyXG4gICAgICAgICAgICBmb3JrT3B0cy5leGVjQXJndiA9IE9iamVjdC5hc3NpZ24oZm9ya09wdHMuZXhlY0FyZ3YsIFsnLS1pbnNwZWN0LWJyaz0nICsgdGhpcy5fZGVidWdQb3J0XSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBwcmludCBtb3JlIGluZm9ybWF0aW9uIGZvciBub2RlanMgZXJyb3JzXHJcbiAgICAgICAgZm9ya09wdHMuZXhlY0FyZ3YucHVzaCgnLS10cmFjZS13YXJuaW5ncycpO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5fbnBtR1Jvb3RFeGVjdXRpb24pIHtcclxuICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgIGxldCBnbG9iYWxOcG1Nb2R1bGVzUGF0aDtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAocHJvY2Vzcy5wbGF0Zm9ybSA9PT0gJ2RhcndpbicpIHtcclxuICAgICAgICAgICAgICAgICAgICBhd2FpdCAoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGVjKCducG0gcm9vdCAtZycsIHtjd2Q6IHByb2Nlc3MuY3dkKCl9LCBmdW5jdGlvbiAoZXJyLCBzdGRvdXQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVycikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ2RhcndpbiBucG0gcm9vdCBlcnJvcjonLCBlcnIpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdGRvdXQgJiYgc3Rkb3V0LnRvU3RyaW5nKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnbG9iYWxOcG1Nb2R1bGVzUGF0aCA9IHN0ZG91dC50b1N0cmluZygpLnRyaW0oKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdChlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSkoKTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZXhlY1Jlc3VsdCA9IGV4ZWNTeW5jKCducG0gcm9vdCAtZycpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBpZiAoZXhlY1Jlc3VsdCAmJiBleGVjUmVzdWx0LnRvU3RyaW5nKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGdsb2JhbE5wbU1vZHVsZXNQYXRoID0gZXhlY1Jlc3VsdC50b1N0cmluZygpLnRyaW0oKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKFxyXG4gICAgICAgICAgICAgICAgICAgIGdsb2JhbE5wbU1vZHVsZXNQYXRoICYmXHJcbiAgICAgICAgICAgICAgICAgICAgZm9ya09wdHMgJiZcclxuICAgICAgICAgICAgICAgICAgICBmb3JrT3B0cy5lbnZcclxuICAgICAgICAgICAgICAgICkge1xyXG4gICAgICAgICAgICAgICAgICAgIGZvcmtPcHRzLmVudi5OT0RFX1BBVEggPSBnbG9iYWxOcG1Nb2R1bGVzUGF0aDtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ25wbSByb290IGVycm9yOicsIGUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBmb3JrIHdvcmtlclxyXG4gICAgICAgIHRoaXMuX2NoaWxkUHJvYyA9IGZvcmsodGhpcy5fd29ya2VyUGF0aCwgZm9ya09wdHMpO1xyXG5cclxuICAgICAgICB0aGlzLl9ob29rQ2hpbGRQcm9jRXZlbnRzKCk7XHJcbiAgICAgICAgLy8gaWYgd2UgYXJlIGluIGRlYnVnIG1vZGUsIGluaXRpYWxpemUgZGVidWdnZXIgYW5kIG9ubHkgdGhlbiBzdGFydCBtb2R1bGVzICdpbml0J1xyXG5cclxuICAgICAgICB0aGlzLl9pc1J1bm5pbmcgPSB0cnVlO1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9jaGlsZFByb2M7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgc3RhcnREZWJ1Z2dlcigpIHtcclxuICAgICAgICBpZiAodGhpcy5fZGVidWdNb2RlKSB7XHJcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuX2luaXRpYWxpemVEZWJ1Z2dlcigpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBzdG9wRGVidWdnZXIoKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuX2RlYnVnZ2VyKSB7XHJcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuX2RlYnVnZ2VyLmNsb3NlKCk7XHJcbiAgICAgICAgICAgIHRoaXMuX2RlYnVnZ2VyLnJlbW92ZUFsbExpc3RlbmVycygpO1xyXG4gICAgICAgICAgICB0aGlzLl9kZWJ1Z2dlciA9IG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIHN0b3Aoc3RhdHVzID0gbnVsbCkge1xyXG4gICAgICAgIGlmICh0aGlzLl9pc0luaXRpYWxpemVkICYmIHRoaXMuX2NoaWxkUHJvYykge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5fZGVidWdnZXIgJiYgdGhpcy5fZGVidWdnZXIuX3BhdXNlZCkge1xyXG4gICAgICAgICAgICAgICAgaWYgKCdDQU5DRUxFRCcgPT09IHN0YXR1cykge1xyXG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuX2RlYnVnZ2VyLmRpc2FibGUoKTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5fZGVidWdnZXIucmVzdW1lVGVybWluYXRlKCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgYXdhaXQgdGhpcy5pbnZva2UoJ2Rpc3Bvc2UnLCBzdGF0dXMpO1xyXG4gICAgICAgICAgICBhd2FpdCBzbm9vemUoMTAwKTtcclxuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuX2NoaWxkUHJvYykge1xyXG4gICAgICAgICAgICBhd2FpdCBzbm9vemUoMTAwKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHRoaXMuX2RlYnVnZ2VyKSB7XHJcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuX2RlYnVnZ2VyLmNsb3NlKCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLl9zZW5kKHtcclxuICAgICAgICAgICAgdHlwZTogJ2V4aXQnLFxyXG4gICAgICAgICAgICBzdGF0dXM6IHN0YXR1cyxcclxuICAgICAgICB9KTtcclxuICAgICAgICB0aGlzLmtpbGwoKTtcclxuICAgICAgICB0aGlzLl9yZXNldCgpO1xyXG4gICAgfVxyXG5cclxuICAgIGtpbGwoKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuX2NoaWxkUHJvYykge1xyXG4gICAgICAgICAgICB0aGlzLl9jaGlsZFByb2Mua2lsbCgnU0lHSU5UJyk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIGluaXRPeHlnZW4ocmlkLCBvcHRpb25zLCBjYXBzKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLl9pc0luaXRpYWxpemVkKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGJlZm9yZVRpbWUgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKTtcclxuICAgICAgICAgICAgYXdhaXQgdGhpcy5pbnZva2UoJ2luaXQnLCByaWQsIG9wdGlvbnMsIGNhcHMpO1xyXG5cclxuICAgICAgICAgICAgY29uc3QgYWZ0ZXJUaW1lID0gbmV3IERhdGUoKS5nZXRUaW1lKCk7XHJcbiAgICAgICAgICAgIGNvbnN0IGR1cmF0aW9uID0gYWZ0ZXJUaW1lIC0gYmVmb3JlVGltZTtcclxuICAgICAgICAgICAgdGhpcy5faXNJbml0aWFsaXplZCA9IHRydWU7XHJcbiAgICAgICAgICAgIGxldCBzdGFydCA9ICcnO1xyXG4gICAgICAgICAgICBpZiAodGhpcy5fbmFtZSkge1xyXG4gICAgICAgICAgICAgICAgc3RhcnQgPSB0aGlzLl9uYW1lICsgJyAnO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGxvZy5pbmZvKHN0YXJ0ICsgJ1dvcmtlciBpbml0aWFsaXplZCBpbiAnICsgZHVyYXRpb24gKyAnIG1zJyk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIHN0YXJ0U2Vzc2lvbigpIHtcclxuICAgICAgICBsZXQgc3RhcnQgPSAnJztcclxuICAgICAgICBpZiAodGhpcy5fbmFtZSkge1xyXG4gICAgICAgICAgICBzdGFydCA9IHRoaXMuX25hbWUgKyAnICc7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGxvZy5pbmZvKHN0YXJ0ICsgJ1Nlc3Npb24gc3RhcnRlZCcpO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIGVuZFNlc3Npb24oc3RhdHVzID0gbnVsbCwgZGlzcG9zZU1vZHVsZXMgPSB0cnVlKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuX2NoaWxkUHJvYykge1xyXG4gICAgICAgICAgICBjb25zdCBiZWZvcmVUaW1lID0gbmV3IERhdGUoKS5nZXRUaW1lKCk7XHJcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuaW52b2tlKCdlbmRTZXNzaW9uJywgc3RhdHVzLCBkaXNwb3NlTW9kdWxlcyk7XHJcbiAgICAgICAgICAgIGNvbnN0IGFmdGVyVGltZSA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpO1xyXG4gICAgICAgICAgICBjb25zdCBkdXJhdGlvbiA9IGFmdGVyVGltZSAtIGJlZm9yZVRpbWU7XHJcbiAgICAgICAgICAgIGxldCBzdGFydCA9ICcnO1xyXG4gICAgICAgICAgICBpZiAodGhpcy5fbmFtZSkge1xyXG4gICAgICAgICAgICAgICAgc3RhcnQgPSB0aGlzLl9uYW1lICsgJyAnO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGxvZy5pbmZvKHN0YXJ0ICsgJ1Nlc3Npb24gZW5kZWQgaW4gJyArIGR1cmF0aW9uICsgJyBtcycpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBkaXNwb3NlKHN0YXR1cyA9IG51bGwpIHtcclxuICAgICAgICBpZiAodGhpcy5fZGVidWdnZXIpIHtcclxuICAgICAgICAgICAgYXdhaXQgdGhpcy5fZGVidWdnZXIuY2xvc2UoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHRoaXMuX2lzSW5pdGlhbGl6ZWQgJiYgdGhpcy5fY2hpbGRQcm9jKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2lzSW5pdGlhbGl6ZWQgPSBmYWxzZTtcclxuXHJcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuaW52b2tlKCdkaXNwb3NlJywgc3RhdHVzKTtcclxuICAgICAgICAgICAgdGhpcy5fc2VuZCh7XHJcbiAgICAgICAgICAgICAgICB0eXBlOiAnZXhpdCcsXHJcbiAgICAgICAgICAgICAgICBzdGF0dXM6IHN0YXR1cyxcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIHRoaXMua2lsbCgpO1xyXG5cclxuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuX2NoaWxkUHJvYykge1xyXG4gICAgICAgICAgICB0aGlzLl9pc0luaXRpYWxpemVkID0gZmFsc2U7XHJcbiAgICAgICAgICAgIHRoaXMuX3NlbmQoe1xyXG4gICAgICAgICAgICAgICAgdHlwZTogJ2V4aXQnLFxyXG4gICAgICAgICAgICAgICAgc3RhdHVzOiBzdGF0dXMsXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB0aGlzLmtpbGwoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IGRlYnVnZ2VyICgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fZGVidWdnZXI7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IGlzUnVubmluZyAoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2lzUnVubmluZztcclxuICAgIH1cclxuXHJcbiAgICBnZXQgaXNJbml0aWFsaXplZCgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5faXNJbml0aWFsaXplZDtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBydW4ocnVuT3B0cykge1xyXG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmludm9rZSgncnVuJywgcnVuT3B0cyk7XHJcbiAgICB9XHJcblxyXG4gICAgc3Vic2NyaWJlKGV2ZW50TmFtZSwgaGFuZGxlcikge1xyXG4gICAgICAgIGlmICghdGhpcy5fZXZlbnRIYW5kbGVyc1tldmVudE5hbWVdICYmIHR5cGVvZiBoYW5kbGVyID09PSAnZnVuY3Rpb24nKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2V2ZW50SGFuZGxlcnNbZXZlbnROYW1lXSA9IGhhbmRsZXI7XHJcbiAgICAgICAgICAgIHRoaXMuX3NlbmQoe1xyXG4gICAgICAgICAgICAgICAgdHlwZTogJ3N1YnNjcmliZScsXHJcbiAgICAgICAgICAgICAgICBldmVudDogZXZlbnROYW1lLFxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgaW52b2tlKG1ldGhvZCkge1xyXG4gICAgICAgIGxldCBhcmdzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTtcclxuICAgICAgICAvLyBpZ25vcmUgZmlyc3QgYXJndW1lbnQgLSBlLmcuIG1ldGhvZFxyXG4gICAgICAgIGlmIChhcmdzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgYXJncy5zaGlmdCgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodGhpcy5fY2hpbGRQcm9jKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGNhbGxJZCA9IG94dXRpbC5nZW5lcmF0ZVVuaXF1ZUlkKCk7XHJcbiAgICAgICAgICAgIHRoaXMuX3NlbmQoe1xyXG4gICAgICAgICAgICAgICAgdHlwZTogJ2ludm9rZScsXHJcbiAgICAgICAgICAgICAgICBtZXRob2Q6IG1ldGhvZCxcclxuICAgICAgICAgICAgICAgIGNhbGxJZDogY2FsbElkLFxyXG4gICAgICAgICAgICAgICAgYXJnczogYXJnc1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgdGhpcy5fY2FsbHNbY2FsbElkXSA9IGRlZmVyKCk7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9jYWxsc1tjYWxsSWRdLnByb21pc2U7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIGludm9rZVRlc3RIb29rKGhvb2tOYW1lLCBob29rQXJncykge1xyXG4gICAgICAgIGNvbnN0IGNhbGxJZCA9IG94dXRpbC5nZW5lcmF0ZVVuaXF1ZUlkKCk7XHJcbiAgICAgICAgdGhpcy5fc2VuZCh7XHJcbiAgICAgICAgICAgIHR5cGU6ICdpbnZva2U6aG9vaycsXHJcbiAgICAgICAgICAgIG1ldGhvZDogaG9va05hbWUsXHJcbiAgICAgICAgICAgIGNhbGxJZDogY2FsbElkLFxyXG4gICAgICAgICAgICBhcmdzOiBob29rQXJnc1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHRoaXMuX2NhbGxzW2NhbGxJZF0gPSBkZWZlcigpO1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9jYWxsc1tjYWxsSWRdLnByb21pc2U7XHJcbiAgICB9XHJcblxyXG4gICAgX3NlbmQobWVzc2FnZSkge1xyXG4gICAgICAgIGlmICghdGhpcy5fY2hpbGRQcm9jKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5fY2hpbGRQcm9jLnNlbmQobWVzc2FnZSk7XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgX3Jlc2V0KCkge1xyXG4gICAgICAgIHRoaXMuX2NoaWxkUHJvYyA9IG51bGw7XHJcbiAgICAgICAgdGhpcy5fZGVidWdnZXIgPSBudWxsO1xyXG4gICAgICAgIHRoaXMuX2lzUnVubmluZyA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMuX2RlYnVnTW9kZSA9IG51bGw7XHJcbiAgICAgICAgdGhpcy5fZGVidWdQb3J0ID0gbnVsbDtcclxuICAgICAgICB0aGlzLl93aGVuT3h5Z2VuRGlzcG9zZWQgPSBudWxsO1xyXG4gICAgICAgIHRoaXMuX3doZW5PeHlnZW5Jbml0aWFsaXplZCA9IG51bGw7XHJcbiAgICAgICAgdGhpcy5fd2hlbk1vZHVsZXNEaXNwb3NlZCA9IG51bGw7XHJcbiAgICAgICAgdGhpcy5faXNJbml0aWFsaXplZCA9IGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIF9ob29rQ2hpbGRQcm9jRXZlbnRzKCkge1xyXG4gICAgICAgIGlmICghdGhpcy5fY2hpbGRQcm9jKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5fY2hpbGRQcm9jLm9uKCdtZXNzYWdlJywgdGhpcy5faGFuZGxlQ2hpbGRNZXNzYWdlLmJpbmQodGhpcykpO1xyXG4gICAgICAgIHRoaXMuX2NoaWxkUHJvYy5vbignZXJyb3InLCB0aGlzLl9oYW5kbGVDaGlsZEVycm9yLmJpbmQodGhpcykpO1xyXG4gICAgICAgIHRoaXMuX2NoaWxkUHJvYy5vbignZXhpdCcsIHRoaXMuX2hhbmRsZUNoaWxkRXhpdC5iaW5kKHRoaXMpKTtcclxuICAgICAgICB0aGlzLl9jaGlsZFByb2Mub24oJ2Rpc2Nvbm5lY3QnLCB0aGlzLl9oYW5kbGVDaGlsZERpc2Nvbm5lY3QuYmluZCh0aGlzKSk7XHJcbiAgICAgICAgdGhpcy5fY2hpbGRQcm9jLm9uKCd1bmNhdWdodEV4Y2VwdGlvbicsIHRoaXMuX2hhbmRsZUNoaWxkVW5jYXVnaHRFeGNlcHRpb24uYmluZCh0aGlzKSk7XHJcbiAgICAgICAgdGhpcy5fY2hpbGRQcm9jLm9uKCdTSUdJTlQnLCB0aGlzLl9oYW5kbGVDaGlsZFNpZ0ludC5iaW5kKHRoaXMpKTtcclxuICAgIH1cclxuXHJcbiAgICBfaGFuZGxlQ2hpbGRNZXNzYWdlKG1zZykge1xyXG4gICAgICAgIGlmIChtc2cuZXZlbnQpIHtcclxuICAgICAgICAgICAgc3dpdGNoIChtc2cuZXZlbnQpIHtcclxuICAgICAgICAgICAgICAgIGNhc2UgJ2ludm9rZTpyZXN1bHQnOlxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChtc2cuY2FsbElkICYmIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0aGlzLl9jYWxscywgbXNnLmNhbGxJZCkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcHJvbWlzZSA9IHRoaXMuX2NhbGxzW21zZy5jYWxsSWRdO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobXNnLmVycm9yKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9taXNlLnJlamVjdChtc2cuZXJyb3IpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvbWlzZS5yZXNvbHZlKG1zZy5yZXR2YWwpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGlzLl9jYWxsc1ttc2cuY2FsbElkXTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICBjYXNlICdyZXBvcnRlcic6XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKG1zZy5tZXRob2QpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5lbWl0KCdyZXBvcnRlcicsIHsgcGlkOiB0aGlzLl9waWQsIG1ldGhvZDogbXNnLm1ldGhvZCwgYXJnczogbXNnLmFyZ3MgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgY2FzZSAnZXZlbnQnOlxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2hhbmRsZVdvcmtlckV2ZW50KG1zZy5uYW1lLCBtc2cuYXJncyk7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5lbWl0KCdtZXNzYWdlJywgT2JqZWN0LmFzc2lnbihtc2csIHsgcGlkOiB0aGlzLl9waWQgfSkpO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIF9oYW5kbGVXb3JrZXJFdmVudChuYW1lLCBhcmdzKSB7XHJcbiAgICAgICAgaWYgKG5hbWUgJiYgdGhpcy5fZXZlbnRIYW5kbGVycyAmJiB0aGlzLl9ldmVudEhhbmRsZXJzW25hbWVdKSB7XHJcbiAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLl9ldmVudEhhbmRsZXJzW25hbWVdLmFwcGx5KHVuZGVmaW5lZCwgYXJncyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgICAgIGxvZy5lcnJvcignRXJyb3IgdGhyb3duIGJ5IHdvcmtlciBldmVudCBoYW5kbGVyIFwiJHtuYW1lfTonLCBlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBfaGFuZGxlQ2hpbGRFcnJvcihlcnJvcikge1xyXG4gICAgICAgIGxvZy5kZWJ1ZyhgV29ya2VyICR7dGhpcy5fcGlkfSB0aHJvd24gYW4gZXJyb3I6ICR7ZXJyb3J9LmApO1xyXG4gICAgICAgIHRoaXMuZW1pdCgnZXJyb3InLCBPYmplY3QuYXNzaWduKHsgZXJyb3IgOiBlcnJvciB9LCB7IHBpZDogdGhpcy5fcGlkIH0pKTtcclxuICAgIH1cclxuXHJcbiAgICBfaGFuZGxlQ2hpbGRFeGl0KGV4aXRDb2RlLCBzaWduYWwpIHtcclxuICAgICAgICBsb2cuZGVidWcoYFdvcmtlciAke3RoaXMuX3BpZH0gZmluaXNoZWQgd2l0aCBleGl0IGNvZGUgJHtleGl0Q29kZX0gYW5kIHNpZ25hbCAke3NpZ25hbH0uYCk7XHJcbiAgICAgICAgdGhpcy5fcmVzZXQoKTtcclxuICAgICAgICB0aGlzLmVtaXQoJ2V4aXQnLCB7IHBpZDogdGhpcy5fcGlkLCBleGl0Q29kZSwgc2lnbmFsIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIF9oYW5kbGVDaGlsZERpc2Nvbm5lY3QoKSB7XHJcbiAgICAgICAgbG9nLmRlYnVnKGBXb3JrZXIgJHt0aGlzLl9waWR9IGRpc2Nvbm5lY3RlZC5gKTtcclxuICAgIH1cclxuXHJcbiAgICBfaGFuZGxlQ2hpbGRVbmNhdWdodEV4Y2VwdGlvbihlcnJvcikge1xyXG4gICAgICAgIGxvZy5kZWJ1ZyhgV29ya2VyICR7dGhpcy5fcGlkfSB0aHJvd24gYW4gdW5jYXVnaHQgZXJyb3I6ICR7ZXJyb3J9LmApO1xyXG4gICAgICAgIHRoaXMuX3Jlc2V0KCk7XHJcbiAgICAgICAgdGhpcy5lbWl0KCdlcnJvcicsIE9iamVjdC5hc3NpZ24oeyBlcnJvciA6IGVycm9yIH0sIHsgcGlkOiB0aGlzLl9waWQgfSkpO1xyXG4gICAgICAgIHRoaXMuZW1pdCgnZXhpdCcsIHsgcGlkOiB0aGlzLl9waWQsIGV4aXRDb2RlOiAxIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIF9oYW5kbGVDaGlsZFNpZ0ludCgpIHtcclxuICAgICAgICBsb2cuZGVidWcoYFdvcmtlciAke3RoaXMuX3BpZH0gcmVjZWl2ZWQgU0lHSU5UIHNpZ25hbC5gKTtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBfaW5pdGlhbGl6ZURlYnVnZ2VyKCkge1xyXG4gICAgICAgIHRoaXMuX2RlYnVnZ2VyID0gbmV3IERlYnVnZ2VyKHRoaXMuX3BpZCk7XHJcbiAgICAgICAgbGV0IHdoZW5EZWJ1Z2dlclJlYWR5ID0gZGVmZXIoKTtcclxuICAgICAgICBjb25zdCBfdGhpcyA9IHRoaXM7XHJcbiAgICAgICAgLy8gaGFuZGxlIGRlYnVnZ2VyIGV2ZW50c1xyXG4gICAgICAgIHRoaXMuX2RlYnVnZ2VyLm9uKCdyZWFkeScsIGZ1bmN0aW9uKGVycikge1xyXG4gICAgICAgICAgICAvLyByZXN1bWUgdGhlIGZpcnN0IGJyZWFrcG9pbnQgd2hpY2ggaXMgYXV0b21hdGljYWxseSBhZGRlZCBieSB0aGUgZGVidWdnZXJcclxuICAgICAgICAgICAgaWYgKF90aGlzLl9kZWJ1Z2dlciAmJiBfdGhpcy5fZGVidWdnZXIuY29udGludWUpIHtcclxuICAgICAgICAgICAgICAgIF90aGlzLl9kZWJ1Z2dlci5jb250aW51ZSgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHdoZW5EZWJ1Z2dlclJlYWR5LnJlc29sdmUoKTtcclxuICAgICAgICB9KTtcclxuICAgICAgICB0aGlzLl9kZWJ1Z2dlci5vbignZXJyb3InLCBmdW5jdGlvbihlcnIpIHtcclxuXHJcbiAgICAgICAgICAgIGxvZy5lcnJvcignRGVidWdnZXIgZXJyb3IgOicsIGVycik7XHJcblxyXG4gICAgICAgICAgICB0aGlzLmVtaXQoJ2RlYnVnZ2VyOmVycm9yJywgT2JqZWN0LmFzc2lnbihlcnIsIHsgcGlkOiB0aGlzLl9waWQgfSkpO1xyXG4gICAgICAgICAgICAvLyByZWplY3QgdGhlIHByb21pc2Ugb25seSBpZiB3ZSBnb3QgYW4gZXJyb3IgcmlnaHQgYWZ0ZXIgX2RlYnVnZ2VyLmNvbm5lY3QoKSBjYWxsIGJlbG93IC0gd2UgbmVlZCB0aGlzIHRvIGluZGljYXRlIGRlYnVnZ2VyIGluaXRpYWxpemF0aW9uIGVycm9yXHJcbiAgICAgICAgICAgIGlmICghd2hlbkRlYnVnZ2VyUmVhZHkuaXNSZXNvbHZlZCkge1xyXG4gICAgICAgICAgICAgICAgd2hlbkRlYnVnZ2VyUmVhZHkucmVqZWN0KGVyci5tZXNzYWdlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHRoaXMuX2RlYnVnZ2VyLm9uKCdicmVhaycsIGZ1bmN0aW9uKGJyZWFrcG9pbnREYXRhKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZW1pdCgnZGVidWdnZXI6YnJlYWsnLCBicmVha3BvaW50RGF0YSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgdGhpcy5fZGVidWdnZXIub24oJ2JyZWFrRXJyb3InLCBhc3luYyBmdW5jdGlvbihicmVha0Vycm9yKSB7XHJcblxyXG4gICAgICAgICAgICBpZiAoYnJlYWtFcnJvciAmJiBicmVha0Vycm9yLm1lc3NhZ2UpIHtcclxuICAgICAgICAgICAgICAgIGlmIChfdGhpcy5fYnJlYWtwb2ludEVycm9ycy5pbmNsdWRlcyhicmVha0Vycm9yLm1lc3NhZ2UpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gaWdub3JlXHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIF90aGlzLl9icmVha3BvaW50RXJyb3JzLnB1c2goYnJlYWtFcnJvci5tZXNzYWdlKTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmVtaXQoJ2RlYnVnZ2VyOmJyZWFrRXJyb3InLCBicmVha0Vycm9yKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBsb2cuaW5mbyhgQ29ubmVjdGluZyB0byBkZWJ1Z2dlciBvbiBwb3J0ICR7dGhpcy5fZGVidWdQb3J0fS4uLmApO1xyXG4gICAgICAgICAgICBhd2FpdCB0aGlzLl9kZWJ1Z2dlci5jb25uZWN0KHRoaXMuX2RlYnVnUG9ydCwgJzEyNy4wLjAuMScpO1xyXG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgbG9nLmVycm9yKCdDYW5ub3QgY29ubmVjdCB0byB0aGUgZGVidWdnZXI6ICcsIGUpO1xyXG4gICAgICAgICAgICBjb25zdCBtZXNzYWdlID0gJ0Nhbm5vdCBjb25uZWN0IHRvIHRoZSBkZWJ1Z2dlcjogJyArIGUubWVzc2FnZTtcclxuICAgICAgICAgICAgd2hlbkRlYnVnZ2VyUmVhZHkucmVqZWN0KG1lc3NhZ2UpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHdoZW5EZWJ1Z2dlclJlYWR5LnByb21pc2U7XHJcbiAgICB9XHJcbn0iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7QUFBQSxJQUFBQSxjQUFBLEdBQUFDLE9BQUE7QUFDQSxJQUFBQyxPQUFBLEdBQUFELE9BQUE7QUFDQSxJQUFBRSxLQUFBLEdBQUFGLE9BQUE7QUFHQSxJ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