oxygen-cli 1.25.0 → 1.27.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 (269) hide show
  1. package/CHANGELOG.md +14 -0
  2. package/build/core/OxygenCore.js +266 -37
  3. package/build/core/OxygenEvents.js +11 -1
  4. package/build/core/OxygenModule.js +14 -1
  5. package/build/core/OxygenService.js +12 -1
  6. package/build/core/OxygenSubModule.js +10 -1
  7. package/build/core/WebDriverModule.js +30 -1
  8. package/build/core/utils.js +17 -1
  9. package/build/errors/HookError.js +7 -1
  10. package/build/errors/ModuleError.js +7 -1
  11. package/build/errors/ModuleUnavailableError.js +3 -1
  12. package/build/errors/OxygenError.js +33 -1
  13. package/build/errors/ScriptNotFound.js +7 -1
  14. package/build/errors/helper.js +77 -45
  15. package/build/index.js +18 -6
  16. package/build/lib/cli-util.js +90 -28
  17. package/build/lib/cli.js +23 -1
  18. package/build/lib/debugger.js +144 -1
  19. package/build/lib/img-merge.js +15 -1
  20. package/build/lib/launcher.js +28 -1
  21. package/build/lib/moduleRequire.js +4 -1
  22. package/build/lib/param-manager.js +28 -1
  23. package/build/lib/param-reader-csv.js +15 -1
  24. package/build/lib/param-reader-excel.js +14 -1
  25. package/build/lib/param-reader-json.js +10 -1
  26. package/build/lib/text-to-image.js +183 -0
  27. package/build/lib/util.js +58 -3
  28. package/build/model/case-result.js +4 -2
  29. package/build/model/failure.js +2 -1
  30. package/build/model/status.js +2 -1
  31. package/build/model/step-result.js +2 -1
  32. package/build/model/suite-result.js +2 -1
  33. package/build/model/test-result.js +2 -1
  34. package/build/model/testcase.js +2 -1
  35. package/build/model/testsuite.js +2 -1
  36. package/build/ox_modules/index.js +33 -13
  37. package/build/ox_modules/module-assert.js +24 -8
  38. package/build/ox_modules/module-date.js +8 -3
  39. package/build/ox_modules/module-db.js +28 -7
  40. package/build/ox_modules/module-email.js +36 -10
  41. package/build/ox_modules/module-eyes.js +46 -5
  42. package/build/ox_modules/module-http.js +102 -41
  43. package/build/ox_modules/module-log.js +22 -5
  44. package/build/ox_modules/module-mailinator.js +32 -10
  45. package/build/ox_modules/module-mob/commands/alertAccept.js +2 -1
  46. package/build/ox_modules/module-mob/commands/alertDismiss.js +2 -1
  47. package/build/ox_modules/module-mob/commands/assertAlert.js +6 -1
  48. package/build/ox_modules/module-mob/commands/assertText.js +3 -1
  49. package/build/ox_modules/module-mob/commands/assertTitle.js +4 -1
  50. package/build/ox_modules/module-mob/commands/assertValue.js +15 -9
  51. package/build/ox_modules/module-mob/commands/back.js +2 -1
  52. package/build/ox_modules/module-mob/commands/clear.js +4 -1
  53. package/build/ox_modules/module-mob/commands/click.js +4 -3
  54. package/build/ox_modules/module-mob/commands/clickHidden.js +9 -3
  55. package/build/ox_modules/module-mob/commands/clickLong.js +2 -1
  56. package/build/ox_modules/module-mob/commands/clickMultipleTimes.js +4 -1
  57. package/build/ox_modules/module-mob/commands/closeApp.js +2 -1
  58. package/build/ox_modules/module-mob/commands/debug.js +2 -2
  59. package/build/ox_modules/module-mob/commands/dragAndDrop.js +2 -1
  60. package/build/ox_modules/module-mob/commands/enableNetwork.js +12 -4
  61. package/build/ox_modules/module-mob/commands/execute.js +2 -1
  62. package/build/ox_modules/module-mob/commands/findElement.js +3 -1
  63. package/build/ox_modules/module-mob/commands/findElements.js +4 -1
  64. package/build/ox_modules/module-mob/commands/getAlertText.js +2 -1
  65. package/build/ox_modules/module-mob/commands/getAppiumLogs.js +2 -1
  66. package/build/ox_modules/module-mob/commands/getBrowserLogs.js +10 -1
  67. package/build/ox_modules/module-mob/commands/getCurrentActivity.js +2 -1
  68. package/build/ox_modules/module-mob/commands/getCurrentPackage.js +2 -1
  69. package/build/ox_modules/module-mob/commands/getDeviceLogs.js +9 -1
  70. package/build/ox_modules/module-mob/commands/getDeviceTime.js +2 -1
  71. package/build/ox_modules/module-mob/commands/getLocation.js +2 -1
  72. package/build/ox_modules/module-mob/commands/getSource.js +2 -1
  73. package/build/ox_modules/module-mob/commands/getText.js +4 -1
  74. package/build/ox_modules/module-mob/commands/getTitle.js +2 -1
  75. package/build/ox_modules/module-mob/commands/getUrl.js +2 -1
  76. package/build/ox_modules/module-mob/commands/getValue.js +9 -5
  77. package/build/ox_modules/module-mob/commands/getWindowHandles.js +2 -1
  78. package/build/ox_modules/module-mob/commands/hideKeyboard.js +2 -1
  79. package/build/ox_modules/module-mob/commands/index.js +94 -19
  80. package/build/ox_modules/module-mob/commands/installApp.js +2 -1
  81. package/build/ox_modules/module-mob/commands/isAppInstalled.js +2 -1
  82. package/build/ox_modules/module-mob/commands/isCheckable.js +2 -1
  83. package/build/ox_modules/module-mob/commands/isChecked.js +2 -1
  84. package/build/ox_modules/module-mob/commands/isClickable.js +2 -1
  85. package/build/ox_modules/module-mob/commands/isExist.js +3 -1
  86. package/build/ox_modules/module-mob/commands/isSelected.js +2 -1
  87. package/build/ox_modules/module-mob/commands/isVisible.js +3 -1
  88. package/build/ox_modules/module-mob/commands/isWebViewContext.js +2 -1
  89. package/build/ox_modules/module-mob/commands/launchApp.js +2 -1
  90. package/build/ox_modules/module-mob/commands/longPressKeyCode.js +2 -1
  91. package/build/ox_modules/module-mob/commands/open.js +3 -1
  92. package/build/ox_modules/module-mob/commands/pause.js +2 -1
  93. package/build/ox_modules/module-mob/commands/removeApp.js +2 -1
  94. package/build/ox_modules/module-mob/commands/resetApp.js +2 -1
  95. package/build/ox_modules/module-mob/commands/scrollIntoElement.js +6 -1
  96. package/build/ox_modules/module-mob/commands/scrollIntoView.js +2 -1
  97. package/build/ox_modules/module-mob/commands/select.js +4 -1
  98. package/build/ox_modules/module-mob/commands/selectFrame.js +4 -1
  99. package/build/ox_modules/module-mob/commands/selectWindow.js +26 -5
  100. package/build/ox_modules/module-mob/commands/sendKeys.js +9 -6
  101. package/build/ox_modules/module-mob/commands/setContext.js +2 -1
  102. package/build/ox_modules/module-mob/commands/setNativeContext.js +2 -1
  103. package/build/ox_modules/module-mob/commands/setTimeout.js +2 -1
  104. package/build/ox_modules/module-mob/commands/setWebViewContext.js +6 -3
  105. package/build/ox_modules/module-mob/commands/shake.js +2 -1
  106. package/build/ox_modules/module-mob/commands/smsClickLink.js +2 -1
  107. package/build/ox_modules/module-mob/commands/smsGetText.js +6 -3
  108. package/build/ox_modules/module-mob/commands/swipe.js +2 -1
  109. package/build/ox_modules/module-mob/commands/swipeElement.js +2 -1
  110. package/build/ox_modules/module-mob/commands/swipeScreen.js +2 -1
  111. package/build/ox_modules/module-mob/commands/takeScreenshot.js +2 -1
  112. package/build/ox_modules/module-mob/commands/tap.js +2 -1
  113. package/build/ox_modules/module-mob/commands/type.js +7 -3
  114. package/build/ox_modules/module-mob/commands/unlockPattern.js +10 -9
  115. package/build/ox_modules/module-mob/commands/waitForExist.js +2 -1
  116. package/build/ox_modules/module-mob/commands/waitForInteractable.js +3 -1
  117. package/build/ox_modules/module-mob/commands/waitForVisible.js +2 -1
  118. package/build/ox_modules/module-mob.js +141 -72
  119. package/build/ox_modules/module-pdf.js +62 -23
  120. package/build/ox_modules/module-proxy.js +68 -8
  121. package/build/ox_modules/module-serial.js +32 -7
  122. package/build/ox_modules/module-shell.js +27 -8
  123. package/build/ox_modules/module-soap.js +47 -14
  124. package/build/ox_modules/module-twilio.js +53 -10
  125. package/build/ox_modules/module-utils.js +51 -16
  126. package/build/ox_modules/module-web/commands/alertAccept.js +2 -1
  127. package/build/ox_modules/module-web/commands/alertDismiss.js +2 -1
  128. package/build/ox_modules/module-web/commands/assertAlert.js +6 -1
  129. package/build/ox_modules/module-web/commands/assertExist.js +2 -1
  130. package/build/ox_modules/module-web/commands/assertSelectedLabel.js +4 -1
  131. package/build/ox_modules/module-web/commands/assertSelectedValue.js +3 -1
  132. package/build/ox_modules/module-web/commands/assertText.js +3 -1
  133. package/build/ox_modules/module-web/commands/assertTextNotPresent.js +6 -1
  134. package/build/ox_modules/module-web/commands/assertTextPresent.js +6 -1
  135. package/build/ox_modules/module-web/commands/assertTitle.js +3 -1
  136. package/build/ox_modules/module-web/commands/assertValue.js +3 -1
  137. package/build/ox_modules/module-web/commands/back.js +2 -1
  138. package/build/ox_modules/module-web/commands/clear.js +5 -1
  139. package/build/ox_modules/module-web/commands/click.js +13 -4
  140. package/build/ox_modules/module-web/commands/clickHidden.js +7 -2
  141. package/build/ox_modules/module-web/commands/closeWindow.js +2 -1
  142. package/build/ox_modules/module-web/commands/debug.js +2 -2
  143. package/build/ox_modules/module-web/commands/deleteCookies.js +2 -1
  144. package/build/ox_modules/module-web/commands/deselect.js +2 -1
  145. package/build/ox_modules/module-web/commands/doubleClick.js +9 -3
  146. package/build/ox_modules/module-web/commands/dragAndDrop.js +2 -1
  147. package/build/ox_modules/module-web/commands/execute.js +2 -1
  148. package/build/ox_modules/module-web/commands/fileBrowse.js +10 -4
  149. package/build/ox_modules/module-web/commands/findElement.js +3 -1
  150. package/build/ox_modules/module-web/commands/findElements.js +4 -1
  151. package/build/ox_modules/module-web/commands/fullscreenWindow.js +2 -1
  152. package/build/ox_modules/module-web/commands/getAlertText.js +2 -1
  153. package/build/ox_modules/module-web/commands/getAttribute.js +4 -1
  154. package/build/ox_modules/module-web/commands/getBrowserLogs.js +3 -1
  155. package/build/ox_modules/module-web/commands/getCookies.js +2 -1
  156. package/build/ox_modules/module-web/commands/getCssValue.js +4 -1
  157. package/build/ox_modules/module-web/commands/getElementCount.js +2 -1
  158. package/build/ox_modules/module-web/commands/getHTML.js +2 -1
  159. package/build/ox_modules/module-web/commands/getSource.js +2 -1
  160. package/build/ox_modules/module-web/commands/getText.js +4 -1
  161. package/build/ox_modules/module-web/commands/getTitle.js +2 -1
  162. package/build/ox_modules/module-web/commands/getUrl.js +2 -1
  163. package/build/ox_modules/module-web/commands/getValue.js +5 -1
  164. package/build/ox_modules/module-web/commands/getWindowHandles.js +2 -1
  165. package/build/ox_modules/module-web/commands/getWindowSize.js +2 -1
  166. package/build/ox_modules/module-web/commands/getXMLPageSource.js +5 -1
  167. package/build/ox_modules/module-web/commands/index.js +100 -19
  168. package/build/ox_modules/module-web/commands/isAlertPresent.js +2 -1
  169. package/build/ox_modules/module-web/commands/isChecked.js +2 -1
  170. package/build/ox_modules/module-web/commands/isExist.js +3 -1
  171. package/build/ox_modules/module-web/commands/isInteractable.js +2 -1
  172. package/build/ox_modules/module-web/commands/isSelected.js +2 -1
  173. package/build/ox_modules/module-web/commands/isVisible.js +3 -1
  174. package/build/ox_modules/module-web/commands/makeVisible.js +10 -2
  175. package/build/ox_modules/module-web/commands/maximizeWindow.js +2 -1
  176. package/build/ox_modules/module-web/commands/minimizeWindow.js +2 -1
  177. package/build/ox_modules/module-web/commands/newWindow.js +2 -1
  178. package/build/ox_modules/module-web/commands/open.js +4 -1
  179. package/build/ox_modules/module-web/commands/pause.js +2 -1
  180. package/build/ox_modules/module-web/commands/point.js +2 -1
  181. package/build/ox_modules/module-web/commands/pointJS.js +8 -2
  182. package/build/ox_modules/module-web/commands/refresh.js +2 -1
  183. package/build/ox_modules/module-web/commands/rightClick.js +8 -3
  184. package/build/ox_modules/module-web/commands/rightClickActions.js +2 -1
  185. package/build/ox_modules/module-web/commands/scrollToElement.js +2 -1
  186. package/build/ox_modules/module-web/commands/select.js +5 -1
  187. package/build/ox_modules/module-web/commands/selectFrame.js +3 -1
  188. package/build/ox_modules/module-web/commands/selectWindow.js +26 -5
  189. package/build/ox_modules/module-web/commands/sendKeys.js +6 -3
  190. package/build/ox_modules/module-web/commands/setAutoWaitForAngular.js +2 -2
  191. package/build/ox_modules/module-web/commands/setTimeout.js +2 -1
  192. package/build/ox_modules/module-web/commands/setWindowSize.js +2 -1
  193. package/build/ox_modules/module-web/commands/takeScreenshot.js +5 -3
  194. package/build/ox_modules/module-web/commands/type.js +5 -1
  195. package/build/ox_modules/module-web/commands/waitForAngular.js +11 -6
  196. package/build/ox_modules/module-web/commands/waitForExist.js +2 -1
  197. package/build/ox_modules/module-web/commands/waitForInteractable.js +2 -1
  198. package/build/ox_modules/module-web/commands/waitForNotExist.js +8 -1
  199. package/build/ox_modules/module-web/commands/waitForNotText.js +3 -1
  200. package/build/ox_modules/module-web/commands/waitForNotValue.js +3 -1
  201. package/build/ox_modules/module-web/commands/waitForText.js +3 -1
  202. package/build/ox_modules/module-web/commands/waitForValue.js +3 -1
  203. package/build/ox_modules/module-web/commands/waitForVisible.js +2 -1
  204. package/build/ox_modules/module-web/commands/waitForWindow.js +21 -4
  205. package/build/ox_modules/module-web.js +181 -82
  206. package/build/ox_modules/module-win/commands/assertText.js +3 -1
  207. package/build/ox_modules/module-win/commands/assertTitle.js +4 -1
  208. package/build/ox_modules/module-win/commands/assertValue.js +15 -9
  209. package/build/ox_modules/module-win/commands/back.js +2 -1
  210. package/build/ox_modules/module-win/commands/clear.js +4 -1
  211. package/build/ox_modules/module-win/commands/click.js +2 -1
  212. package/build/ox_modules/module-win/commands/clickLong.js +2 -1
  213. package/build/ox_modules/module-win/commands/clickMultipleTimes.js +4 -1
  214. package/build/ox_modules/module-win/commands/findElement.js +3 -1
  215. package/build/ox_modules/module-win/commands/findElements.js +4 -1
  216. package/build/ox_modules/module-win/commands/getAppiumLogs.js +2 -1
  217. package/build/ox_modules/module-win/commands/getCurrentWindowHandle.js +2 -1
  218. package/build/ox_modules/module-win/commands/getLocation.js +2 -1
  219. package/build/ox_modules/module-win/commands/getSource.js +2 -1
  220. package/build/ox_modules/module-win/commands/getText.js +4 -1
  221. package/build/ox_modules/module-win/commands/getValue.js +9 -5
  222. package/build/ox_modules/module-win/commands/getWindowHandles.js +2 -1
  223. package/build/ox_modules/module-win/commands/index.js +43 -5
  224. package/build/ox_modules/module-win/commands/isCheckable.js +2 -1
  225. package/build/ox_modules/module-win/commands/isChecked.js +2 -1
  226. package/build/ox_modules/module-win/commands/isClickable.js +2 -1
  227. package/build/ox_modules/module-win/commands/isExist.js +3 -1
  228. package/build/ox_modules/module-win/commands/isSelected.js +2 -1
  229. package/build/ox_modules/module-win/commands/isVisible.js +3 -1
  230. package/build/ox_modules/module-win/commands/open.js +2 -1
  231. package/build/ox_modules/module-win/commands/pause.js +2 -1
  232. package/build/ox_modules/module-win/commands/rightClick.js +2 -1
  233. package/build/ox_modules/module-win/commands/selectWindow.js +15 -1
  234. package/build/ox_modules/module-win/commands/sendKeys.js +4 -1
  235. package/build/ox_modules/module-win/commands/setTimeout.js +2 -1
  236. package/build/ox_modules/module-win/commands/takeScreenshot.js +2 -1
  237. package/build/ox_modules/module-win/commands/tap.js +2 -1
  238. package/build/ox_modules/module-win/commands/type.js +4 -1
  239. package/build/ox_modules/module-win/commands/waitForExist.js +2 -1
  240. package/build/ox_modules/module-win/commands/waitForInteractable.js +4 -1
  241. package/build/ox_modules/module-win/commands/waitForVisible.js +2 -1
  242. package/build/ox_modules/module-win.js +87 -48
  243. package/build/ox_modules/utils.js +76 -22
  244. package/build/ox_reporters/reporter-excel.js +58 -1
  245. package/build/ox_reporters/reporter-html.js +28 -1
  246. package/build/ox_reporters/reporter-json.js +14 -1
  247. package/build/ox_reporters/reporter-junit.js +24 -1
  248. package/build/ox_reporters/reporter-pdf.js +19 -1
  249. package/build/ox_reporters/reporter-xml.js +17 -1
  250. package/build/ox_services/service-devtools/submodule-network.js +91 -4
  251. package/build/ox_services/service-devtools.js +23 -1
  252. package/build/reporter/FileReporterBase.js +44 -5
  253. package/build/reporter/ReportAggregator.js +65 -1
  254. package/build/reporter/ReporterBase.js +6 -1
  255. package/build/runners/WorkerProcess.js +99 -1
  256. package/build/runners/cucumber/CucumberEventListener.js +29 -4
  257. package/build/runners/cucumber/CucumberReporter.js +56 -1
  258. package/build/runners/cucumber/CucumberWorker.js +66 -1
  259. package/build/runners/cucumber/index.js +30 -1
  260. package/build/runners/cucumber/worker.js +18 -1
  261. package/build/runners/index.js +6 -1
  262. package/build/runners/oxygen/OxygenWorker.js +60 -3
  263. package/build/runners/oxygen/index.js +178 -17
  264. package/build/runners/oxygen/worker.js +25 -2
  265. package/package.json +8 -8
  266. package/.babelrc +0 -28
  267. package/.eslintrc.json +0 -25
  268. package/.husky/pre-commit +0 -4
  269. package/CONTRIBUTE.md +0 -1
@@ -1,15 +1,21 @@
1
1
  "use strict";
2
2
 
3
3
  require("source-map-support/register");
4
+
4
5
  var _CucumberWorker = _interopRequireDefault(require("./CucumberWorker"));
6
+
5
7
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
8
+
6
9
  const oxutil = require('../../lib/util');
10
+
7
11
  const errorHelper = require('../../errors/helper');
12
+
8
13
  const {
9
14
  LEVELS,
10
15
  DEFAULT_LOGGER_ISSUER,
11
16
  ISSUERS
12
17
  } = require('../../lib/logger');
18
+
13
19
  global.browser = {};
14
20
  const logger = {
15
21
  info: function (message, src = DEFAULT_LOGGER_ISSUER) {
@@ -80,10 +86,13 @@ const reporter = {
80
86
  emitReporterEvent('onLogEntry', args);
81
87
  }
82
88
  };
89
+
83
90
  function stringify(obj) {
84
91
  return typeof obj === 'string' || obj instanceof String ? obj : JSON.stringify(obj, null, 2);
85
92
  }
93
+
86
94
  let _worker = new _CucumberWorker.default(reporter);
95
+
87
96
  oxutil.hookLogs(logger);
88
97
  process.on('uncaughtException', async (err, origin) => {
89
98
  logger.error(err.message, ISSUERS.USER);
@@ -101,6 +110,7 @@ process.on('message', async function (msg) {
101
110
  if (!msg.type) {
102
111
  return;
103
112
  }
113
+
104
114
  if (msg.type === 'invoke' && msg.method) {
105
115
  const {
106
116
  callId,
@@ -122,6 +132,7 @@ process.on('message', async function (msg) {
122
132
  dispose(msg.status || null);
123
133
  }
124
134
  });
135
+
125
136
  function processSend(msg) {
126
137
  try {
127
138
  process.send({
@@ -130,6 +141,7 @@ function processSend(msg) {
130
141
  });
131
142
  } catch (e) {}
132
143
  }
144
+
133
145
  function emitReporterEvent(method, args) {
134
146
  processSend({
135
147
  event: 'reporter',
@@ -137,6 +149,7 @@ function emitReporterEvent(method, args) {
137
149
  args: args
138
150
  });
139
151
  }
152
+
140
153
  async function dispose(status = null) {
141
154
  if (_worker) {
142
155
  try {
@@ -144,8 +157,10 @@ async function dispose(status = null) {
144
157
  } catch (e) {}
145
158
  }
146
159
  }
160
+
147
161
  async function invoke(method, args) {
148
162
  let retval, error;
163
+
149
164
  if (_worker && _worker[method] && typeof _worker[method] === 'function') {
150
165
  try {
151
166
  retval = await _worker[method].apply(_worker, args || []);
@@ -156,12 +171,14 @@ async function invoke(method, args) {
156
171
  } else {
157
172
  error = new Error(`Method "${method}" does not exist`);
158
173
  }
174
+
159
175
  if (error) {
160
176
  error = errorHelper.getFailureFromError(error);
161
177
  }
178
+
162
179
  return {
163
180
  retval,
164
181
  error
165
182
  };
166
183
  }
167
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJveHV0aWwiLCJyZXF1aXJlIiwiZXJyb3JIZWxwZXIiLCJMRVZFTFMiLCJERUZBVUxUX0xPR0dFUl9JU1NVRVIiLCJJU1NVRVJTIiwiZ2xvYmFsIiwiYnJvd3NlciIsImxvZ2dlciIsImluZm8iLCJtZXNzYWdlIiwic3JjIiwidHMiLCJnZXRUaW1lU3RhbXAiLCJwcm9jZXNzU2VuZCIsInRpbWUiLCJldmVudCIsImxldmVsIiwiSU5GTyIsIm1zZyIsInN0cmluZ2lmeSIsImRlYnVnIiwiREVCVUciLCJlcnJvciIsImVyciIsIkVSUk9SIiwid2FybiIsIldBUk4iLCJyZXBvcnRlciIsIm9uU3VpdGVTdGFydCIsImFyZ3MiLCJlbWl0UmVwb3J0ZXJFdmVudCIsIm9uU3VpdGVFbmQiLCJvbkNhc2VTdGFydCIsIm9uQ2FzZUVuZCIsIm9uU3RlcFN0YXJ0Iiwib25TdGVwRW5kIiwib25SdW5uZXJFbmQiLCJvbkxvZ0VudHJ5Iiwib2JqIiwiU3RyaW5nIiwiSlNPTiIsIl93b3JrZXIiLCJDdWN1bWJlcldvcmtlciIsImhvb2tMb2dzIiwicHJvY2VzcyIsIm9uIiwib3JpZ2luIiwiVVNFUiIsImVyck1lc3NhZ2UiLCJjb25zb2xlIiwibG9nIiwiZGlzcG9zZSIsImV4aXQiLCJ0eXBlIiwibWV0aG9kIiwiY2FsbElkIiwicmV0dmFsIiwiaW52b2tlIiwic3RhdHVzIiwic2VuZCIsImUiLCJhcHBseSIsIkVycm9yIiwiZ2V0RmFpbHVyZUZyb21FcnJvciJdLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9ydW5uZXJzL2N1Y3VtYmVyL3dvcmtlci5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJjb25zdCBveHV0aWwgPSByZXF1aXJlKCcuLi8uLi9saWIvdXRpbCcpO1xyXG5jb25zdCBlcnJvckhlbHBlciA9IHJlcXVpcmUoJy4uLy4uL2Vycm9ycy9oZWxwZXInKTtcclxuY29uc3QgeyBMRVZFTFMsIERFRkFVTFRfTE9HR0VSX0lTU1VFUiwgSVNTVUVSUyB9ID0gcmVxdWlyZSgnLi4vLi4vbGliL2xvZ2dlcicpO1xyXG5pbXBvcnQgQ3VjdW1iZXJXb3JrZXIgIGZyb20gJy4vQ3VjdW1iZXJXb3JrZXInO1xyXG5cclxuLy8gbW9ja3VwIGdsb2JiYWwuYnJvd3NlciBvYmplY3QgZm9yIGludGVybmFsIFdESU8gZnVuY3Rpb25zIHRvIHdvcmsgcHJvcGVybHlcclxuZ2xvYmFsLmJyb3dzZXIgPSB7fTtcclxuXHJcbmNvbnN0IGxvZ2dlciA9IHtcclxuICAgIGluZm86IGZ1bmN0aW9uKG1lc3NhZ2UsIHNyYyA9IERFRkFVTFRfTE9HR0VSX0lTU1VFUikge1xyXG4gICAgICAgIGNvbnN0IHRzID0gb3h1dGlsLmdldFRpbWVTdGFtcCgpO1xyXG4gICAgICAgIHByb2Nlc3NTZW5kKHsgdGltZTogdHMsIGV2ZW50OiAnbG9nJywgbGV2ZWw6IExFVkVMUy5JTkZPLCBtc2c6IHN0cmluZ2lmeShtZXNzYWdlKSwgc3JjIH0pO1xyXG4gICAgfSxcclxuICAgIGRlYnVnOiBmdW5jdGlvbihtZXNzYWdlLCBzcmMgPSBERUZBVUxUX0xPR0dFUl9JU1NVRVIpIHtcclxuICAgICAgICBjb25zdCB0cyA9IG94dXRpbC5nZXRUaW1lU3RhbXAoKTtcclxuICAgICAgICBwcm9jZXNzU2VuZCh7IHRpbWU6IHRzLCBldmVudDogJ2xvZycsIGxldmVsOiBMRVZFTFMuREVCVUcsIG1zZzogc3RyaW5naWZ5KG1lc3NhZ2UpLCBzcmMgfSk7XHJcbiAgICB9LFxyXG4gICAgZXJyb3I6IGZ1bmN0aW9uKG1lc3NhZ2UsIHNyYyA9IERFRkFVTFRfTE9HR0VSX0lTU1VFUiwgZXJyID0gbnVsbCkge1xyXG4gICAgICAgIGNvbnN0IHRzID0gb3h1dGlsLmdldFRpbWVTdGFtcCgpO1xyXG4gICAgICAgIHByb2Nlc3NTZW5kKHsgdGltZTogdHMsIGV2ZW50OiAnbG9nJywgbGV2ZWw6IExFVkVMUy5FUlJPUiwgbXNnOiBzdHJpbmdpZnkobWVzc2FnZSksIHNyYywgZXJyOiBlcnIgfSk7XHJcbiAgICB9LFxyXG4gICAgd2FybjogZnVuY3Rpb24obWVzc2FnZSwgc3JjID0gREVGQVVMVF9MT0dHRVJfSVNTVUVSKSB7XHJcbiAgICAgICAgY29uc3QgdHMgPSBveHV0aWwuZ2V0VGltZVN0YW1wKCk7XHJcbiAgICAgICAgcHJvY2Vzc1NlbmQoeyB0aW1lOiB0cywgZXZlbnQ6ICdsb2cnLCBsZXZlbDogTEVWRUxTLldBUk4sIG1zZzogc3RyaW5naWZ5KG1lc3NhZ2UpLCBzcmMgfSk7XHJcbiAgICB9XHJcbn07XHJcblxyXG5jb25zdCByZXBvcnRlciA9IHtcclxuICAgIG9uU3VpdGVTdGFydDogZnVuY3Rpb24oLi4uYXJncykge1xyXG4gICAgICAgIGVtaXRSZXBvcnRlckV2ZW50KCdvblN1aXRlU3RhcnQnLCBhcmdzKTtcclxuICAgIH0sXHJcbiAgICBvblN1aXRlRW5kOiBmdW5jdGlvbiguLi5hcmdzKSB7XHJcbiAgICAgICAgZW1pdFJlcG9ydGVyRXZlbnQoJ29uU3VpdGVFbmQnLCBhcmdzKTtcclxuICAgIH0sXHJcbiAgICBvbkNhc2VTdGFydDogZnVuY3Rpb24oLi4uYXJncykge1xyXG4gICAgICAgIGVtaXRSZXBvcnRlckV2ZW50KCdvbkNhc2VTdGFydCcsIGFyZ3MpO1xyXG4gICAgfSxcclxuICAgIG9uQ2FzZUVuZDogZnVuY3Rpb24oLi4uYXJncykge1xyXG4gICAgICAgIGVtaXRSZXBvcnRlckV2ZW50KCdvbkNhc2VFbmQnLCBhcmdzKTtcclxuICAgIH0sXHJcbiAgICBvblN0ZXBTdGFydDogZnVuY3Rpb24oLi4uYXJncykge1xyXG4gICAgICAgIGVtaXRSZXBvcnRlckV2ZW50KCdvblN0ZXBTdGFydCcsIGFyZ3MpO1xyXG4gICAgfSxcclxuICAgIG9uU3RlcEVuZDogZnVuY3Rpb24oLi4uYXJncykge1xyXG4gICAgICAgIGVtaXRSZXBvcnRlckV2ZW50KCdvblN0ZXBFbmQnLCBhcmdzKTtcclxuICAgIH0sXHJcbiAgICBvblJ1bm5lckVuZDogZnVuY3Rpb24oLi4uYXJncykge1xyXG4gICAgICAgIGVtaXRSZXBvcnRlckV2ZW50KCdvblJ1bm5lckVuZCcsIGFyZ3MpO1xyXG4gICAgfSxcclxuICAgIG9uTG9nRW50cnk6IGZ1bmN0aW9uKC4uLmFyZ3MpIHtcclxuICAgICAgICBlbWl0UmVwb3J0ZXJFdmVudCgnb25Mb2dFbnRyeScsIGFyZ3MpO1xyXG4gICAgfVxyXG59O1xyXG5cclxuZnVuY3Rpb24gc3RyaW5naWZ5KG9iaikge1xyXG4gICAgcmV0dXJuICh0eXBlb2Ygb2JqID09PSAnc3RyaW5nJyB8fCBvYmogaW5zdGFuY2VvZiBTdHJpbmcgPyBvYmogOiBKU09OLnN0cmluZ2lmeShvYmosIG51bGwsIDIpKTtcclxufVxyXG5cclxuLy8gcmVkaXJlY3Qgc3Rkb3V0IGFuZCBzdGRlcnIgdG8gdGhlIGxvZ2dlclxyXG4vL3Byb2Nlc3Muc3Rkb3V0LndyaXRlID0gbG9nZ2VyLmRlYnVnO1xyXG4vL3Byb2Nlc3Muc3RkZXJyLndyaXRlID0gbG9nZ2VyLmVycm9yO1xyXG5cclxubGV0IF93b3JrZXIgPSBuZXcgQ3VjdW1iZXJXb3JrZXIocmVwb3J0ZXIpO1xyXG5cclxub3h1dGlsLmhvb2tMb2dzKGxvZ2dlcik7XHJcblxyXG5wcm9jZXNzLm9uKCd1bmNhdWdodEV4Y2VwdGlvbicsIGFzeW5jKGVyciwgb3JpZ2luKSA9PiB7XHJcbiAgICBsb2dnZXIuZXJyb3IoZXJyLm1lc3NhZ2UsIElTU1VFUlMuVVNFUik7XHJcbiAgICBwcm9jZXNzU2VuZCh7XHJcbiAgICAgICAgZXZlbnQ6ICd3b3JrZXJFcnJvcicsXHJcbiAgICAgICAgZXJyTWVzc2FnZTogZXJyLm1lc3NhZ2UsXHJcbiAgICB9KTtcclxufSk7XHJcblxyXG5wcm9jZXNzLm9uKCdTSUdJTlQnLCBhc3luYyBmdW5jdGlvbigpIHtcclxuICAgIGNvbnNvbGUubG9nKCdTSUdJTlQgcmVjZWl2ZWQnKTtcclxuICAgIGF3YWl0IGRpc3Bvc2UoJ0NBTkNFTEVEJyk7XHJcbiAgICBwcm9jZXNzLmV4aXQoMCk7XHJcbn0pO1xyXG5cclxucHJvY2Vzcy5vbignbWVzc2FnZScsIGFzeW5jIGZ1bmN0aW9uIChtc2cpIHtcclxuICAgIGlmICghbXNnLnR5cGUpIHtcclxuICAgICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBpZiAobXNnLnR5cGUgPT09ICdpbnZva2UnICYmIG1zZy5tZXRob2QpIHtcclxuICAgICAgICBjb25zdCB7IGNhbGxJZCwgbWV0aG9kLCBhcmdzIH0gPSBtc2c7XHJcbiAgICAgICAgY29uc3QgeyByZXR2YWwsIGVycm9yIH0gPSBhd2FpdCBpbnZva2UobWV0aG9kLCBhcmdzKTtcclxuICAgICAgICBwcm9jZXNzU2VuZCh7XHJcbiAgICAgICAgICAgIGV2ZW50OiAnaW52b2tlOnJlc3VsdCcsXHJcbiAgICAgICAgICAgIG1ldGhvZDogbWV0aG9kLFxyXG4gICAgICAgICAgICBjYWxsSWQ6IGNhbGxJZCxcclxuICAgICAgICAgICAgZXJyb3I6IGVycm9yLFxyXG4gICAgICAgICAgICByZXR2YWw6IHJldHZhbFxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgZWxzZSBpZiAobXNnLnR5cGUgPT09ICdleGl0Jykge1xyXG4gICAgICAgIGRpc3Bvc2UobXNnLnN0YXR1cyB8fCBudWxsKTtcclxuICAgIH1cclxufSk7XHJcblxyXG5mdW5jdGlvbiBwcm9jZXNzU2VuZChtc2cpIHtcclxuICAgIC8vIHdyYXAgcHJvY2Vzcy5zZW5kIHdpdGggdHJ5L2NhdGNoIGFzIHNvbWV0aW1lcyB3ZSBtaWdodCBjYWxsIHByb2Nlc3Muc2VuZCBcclxuICAgIC8vIHdoZW4gcGFyZW50IHByb2Nlc3MgaXMgYWxyZWFkeSBkaXNjb25uZWN0ZWQgKHdoZW4gdXNlIGtpbGxzIHRoZSBtYWluIHByb2Nlc3MpXHJcbiAgICB0cnkge1xyXG4gICAgICAgIC8vIGFkZCB1dGMgdGltZXN0YW1wXHJcbiAgICAgICAgcHJvY2Vzcy5zZW5kKHsgdGltZTogb3h1dGlsLmdldFRpbWVTdGFtcCgpLCAuLi5tc2cgfSk7XHJcbiAgICB9XHJcbiAgICBjYXRjaCAoZSkge1xyXG4gICAgICAgIC8vIGlnbm9yZVxyXG4gICAgfVxyXG59XHJcblxyXG5mdW5jdGlvbiBlbWl0UmVwb3J0ZXJFdmVudChtZXRob2QsIGFyZ3MpIHtcclxuICAgIHByb2Nlc3NTZW5kKHtcclxuICAgICAgICBldmVudDogJ3JlcG9ydGVyJyxcclxuICAgICAgICBtZXRob2Q6IG1ldGhvZCxcclxuICAgICAgICBhcmdzOiBhcmdzXHJcbiAgICB9KTtcclxufVxyXG5cclxuYXN5bmMgZnVuY3Rpb24gZGlzcG9zZShzdGF0dXM9IG51bGwpIHtcclxuICAgIGlmIChfd29ya2VyKSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgYXdhaXQgX3dvcmtlci5kaXNwb3NlKHN0YXR1cyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgIC8vIGlnbm9yZVxyXG4gICAgICAgIH1cclxuICAgIH1cclxufVxyXG5cclxuYXN5bmMgZnVuY3Rpb24gaW52b2tlKG1ldGhvZCwgYXJncykge1xyXG4gICAgbGV0IHJldHZhbCwgZXJyb3I7XHJcbiAgICBpZiAoX3dvcmtlciAmJiBfd29ya2VyW21ldGhvZF0gJiYgdHlwZW9mIF93b3JrZXJbbWV0aG9kXSA9PT0gJ2Z1bmN0aW9uJykge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIHJldHZhbCA9IGF3YWl0IF93b3JrZXJbbWV0aG9kXS5hcHBseShfd29ya2VyLCBhcmdzIHx8IFtdKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coYEZhaWxlZCB0byBpbnZva2UgXCIke21ldGhvZH1cIiBtZXRob2Q6YCwgZSk7XHJcbiAgICAgICAgICAgIGVycm9yID0gZTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgICBlcnJvciA9IG5ldyBFcnJvcihgTWV0aG9kIFwiJHttZXRob2R9XCIgZG9lcyBub3QgZXhpc3RgKTtcclxuICAgIH1cclxuICAgIC8vIGNvbnZlcnQgSlMgZXJyb3IgdG8gT3h5Z2VuIEZhaWx1cmUgb2JqZWN0XHJcbiAgICBpZiAoZXJyb3IpIHtcclxuICAgICAgICBlcnJvciA9IGVycm9ySGVscGVyLmdldEZhaWx1cmVGcm9tRXJyb3IoZXJyb3IpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHsgcmV0dmFsLCBlcnJvciB9O1xyXG59Il0sIm1hcHBpbmdzIjoiOzs7QUFHQTtBQUErQztBQUgvQyxNQUFNQSxNQUFNLEdBQUdDLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQztBQUN4QyxNQUFNQyxXQUFXLEdBQUdELE9BQU8sQ0FBQyxxQkFBcUIsQ0FBQztBQUNsRCxNQUFNO0VBQUVFLE1BQU07RUFBRUMscUJBQXFCO0VBQUVDO0FBQVEsQ0FBQyxHQUFHSixPQUFPLENBQUMsa0JBQWtCLENBQUM7QUFJOUVLLE1BQU0sQ0FBQ0MsT0FBTyxHQUFHLENBQUMsQ0FBQztBQUVuQixNQUFNQyxNQUFNLEdBQUc7RUFDWEMsSUFBSSxFQUFFLFVBQVNDLE9BQU8sRUFBRUMsR0FBRyxHQUFHUCxxQkFBcUIsRUFBRTtJQUNqRCxNQUFNUSxFQUFFLEdBQUdaLE1BQU0sQ0FBQ2EsWUFBWSxFQUFFO0lBQ2hDQyxXQUFXLENBQUM7TUFBRUMsSUFBSSxFQUFFSCxFQUFFO01BQUVJLEtBQUssRUFBRSxLQUFLO01BQUVDLEtBQUssRUFBRWQsTUFBTSxDQUFDZSxJQUFJO01BQUVDLEdBQUcsRUFBRUMsU0FBUyxDQUFDVixPQUFPLENBQUM7TUFBRUM7SUFBSSxDQUFDLENBQUM7RUFDN0YsQ0FBQztFQUNEVSxLQUFLLEVBQUUsVUFBU1gsT0FBTyxFQUFFQyxHQUFHLEdBQUdQLHFCQUFxQixFQUFFO0lBQ2xELE1BQU1RLEVBQUUsR0FBR1osTUFBTSxDQUFDYSxZQUFZLEVBQUU7SUFDaENDLFdBQVcsQ0FBQztNQUFFQyxJQUFJLEVBQUVILEVBQUU7TUFBRUksS0FBSyxFQUFFLEtBQUs7TUFBRUMsS0FBSyxFQUFFZCxNQUFNLENBQUNtQixLQUFLO01BQUVILEdB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
184
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9ydW5uZXJzL2N1Y3VtYmVyL3dvcmtlci5qcyJdLCJuYW1lcyI6WyJveHV0aWwiLCJyZXF1aXJlIiwiZXJyb3JIZWxwZXIiLCJMRVZFTFMiLCJERUZBVUxUX0xPR0dFUl9JU1NVRVIiLCJJU1NVRVJTIiwiZ2xvYmFsIiwiYnJvd3NlciIsImxvZ2dlciIsImluZm8iLCJtZXNzYWdlIiwic3JjIiwidHMiLCJnZXRUaW1lU3RhbXAiLCJwcm9jZXNzU2VuZCIsInRpbWUiLCJldmVudCIsImxldmVsIiwiSU5GTyIsIm1zZyIsInN0cmluZ2lmeSIsImRlYnVnIiwiREVCVUciLCJlcnJvciIsImVyciIsIkVSUk9SIiwid2FybiIsIldBUk4iLCJyZXBvcnRlciIsIm9uU3VpdGVTdGFydCIsImFyZ3MiLCJlbWl0UmVwb3J0ZXJFdmVudCIsIm9uU3VpdGVFbmQiLCJvbkNhc2VTdGFydCIsIm9uQ2FzZUVuZCIsIm9uU3RlcFN0YXJ0Iiwib25TdGVwRW5kIiwib25SdW5uZXJFbmQiLCJvbkxvZ0VudHJ5Iiwib2JqIiwiU3RyaW5nIiwiSlNPTiIsIl93b3JrZXIiLCJDdWN1bWJlcldvcmtlciIsImhvb2tMb2dzIiwicHJvY2VzcyIsIm9uIiwib3JpZ2luIiwiVVNFUiIsImVyck1lc3NhZ2UiLCJjb25zb2xlIiwibG9nIiwiZGlzcG9zZSIsImV4aXQiLCJ0eXBlIiwibWV0aG9kIiwiY2FsbElkIiwicmV0dmFsIiwiaW52b2tlIiwic3RhdHVzIiwic2VuZCIsImUiLCJhcHBseSIsIkVycm9yIiwiZ2V0RmFpbHVyZUZyb21FcnJvciJdLCJtYXBwaW5ncyI6Ijs7OztBQUdBOzs7O0FBSEEsTUFBTUEsTUFBTSxHQUFHQyxPQUFPLENBQUMsZ0JBQUQsQ0FBdEI7O0FBQ0EsTUFBTUMsV0FBVyxHQUFHRCxPQUFPLENBQUMscUJBQUQsQ0FBM0I7O0FBQ0EsTUFBTTtBQUFFRSxFQUFBQSxNQUFGO0FBQVVDLEVBQUFBLHFCQUFWO0FBQWlDQyxFQUFBQTtBQUFqQyxJ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LE1BQU8sV0FBeEMsRUFBb0RNLENBQXBEO0FBQ0F0QyxNQUFBQSxLQUFLLEdBQUdzQyxDQUFSO0FBQ0g7QUFDSixHQVJELE1BU0s7QUFDRHRDLElBQUFBLEtBQUssR0FBRyxJQUFJd0MsS0FBSixDQUFXLFdBQVVSLE1BQU8sa0JBQTVCLENBQVI7QUFDSDs7QUFFRCxNQUFJaEMsS0FBSixFQUFXO0FBQ1BBLElBQUFBLEtBQUssR0FBR3JCLFdBQVcsQ0FBQzhELG1CQUFaLENBQWdDekMsS0FBaEMsQ0FBUjtBQUNIOztBQUNELFNBQU87QUFBRWtDLElBQUFBLE1BQUY7QUFBVWxDLElBQUFBO0FBQVYsR0FBUDtBQUNIIiwic291cmNlc0NvbnRlbnQiOlsiY29uc3Qgb3h1dGlsID0gcmVxdWlyZSgnLi4vLi4vbGliL3V0aWwnKTtcclxuY29uc3QgZXJyb3JIZWxwZXIgPSByZXF1aXJlKCcuLi8uLi9lcnJvcnMvaGVscGVyJyk7XHJcbmNvbnN0IHsgTEVWRUxTLCBERUZBVUxUX0xPR0dFUl9JU1NVRVIsIElTU1VFUlMgfSA9IHJlcXVpcmUoJy4uLy4uL2xpYi9sb2dnZXInKTtcclxuaW1wb3J0IEN1Y3VtYmVyV29ya2VyICBmcm9tICcuL0N1Y3VtYmVyV29ya2VyJztcclxuXHJcbi8vIG1vY2t1cCBnbG9iYmFsLmJyb3dzZXIgb2JqZWN0IGZvciBpbnRlcm5hbCBXRElPIGZ1bmN0aW9ucyB0byB3b3JrIHByb3Blcmx5XHJcbmdsb2JhbC5icm93c2VyID0ge307XHJcblxyXG5jb25zdCBsb2dnZXIgPSB7XHJcbiAgICBpbmZvOiBmdW5jdGlvbihtZXNzYWdlLCBzcmMgPSBERUZBVUxUX0xPR0dFUl9JU1NVRVIpIHtcclxuICAgICAgICBjb25zdCB0cyA9IG94dXRpbC5nZXRUaW1lU3RhbXAoKTtcclxuICAgICAgICBwcm9jZXNzU2VuZCh7IHRpbWU6IHRzLCBldmVudDogJ2xvZycsIGxldmVsOiBMRVZFTFMuSU5GTywgbXNnOiBzdHJpbmdpZnkobWVzc2FnZSksIHNyYyB9KTtcclxuICAgIH0sXHJcbiAgICBkZWJ1ZzogZnVuY3Rpb24obWVzc2FnZSwgc3JjID0gREVGQVVMVF9MT0dHRVJfSVNTVUVSKSB7XHJcbiAgICAgICAgY29uc3QgdHMgPSBveHV0aWwuZ2V0VGltZVN0YW1wKCk7XHJcbiAgICAgICAgcHJvY2Vzc1NlbmQoeyB0aW1lOiB0cywgZXZlbnQ6ICdsb2cnLCBsZXZlbDogTEVWRUxTLkRFQlVHLCBtc2c6IHN0cmluZ2lmeShtZXNzYWdlKSwgc3JjIH0pO1xyXG4gICAgfSxcclxuICAgIGVycm9yOiBmdW5jdGlvbihtZXNzYWdlLCBzcmMgPSBERUZBVUxUX0xPR0dFUl9JU1NVRVIsIGVyciA9IG51bGwpIHtcclxuICAgICAgICBjb25zdCB0cyA9IG94dXRpbC5nZXRUaW1lU3RhbXAoKTtcclxuICAgICAgICBwcm9jZXNzU2VuZCh7IHRpbWU6IHRzLCBldmVudDogJ2xvZycsIGxldmVsOiBMRVZFTFMuRVJST1IsIG1zZzogc3RyaW5naWZ5KG1lc3NhZ2UpLCBzcmMsIGVycjogZXJyIH0pO1xyXG4gICAgfSxcclxuICAgIHdhcm46IGZ1bmN0aW9uKG1lc3NhZ2UsIHNyYyA9IERFRkFVTFRfTE9HR0VSX0lTU1VFUikge1xyXG4gICAgICAgIGNvbnN0IHRzID0gb3h1dGlsLmdldFRpbWVTdGFtcCgpO1xyXG4gICAgICAgIHByb2Nlc3NTZW5kKHsgdGltZTogdHMsIGV2ZW50OiAnbG9nJywgbGV2ZWw6IExFVkVMUy5XQVJOLCBtc2c6IHN0cmluZ2lmeShtZXNzYWdlKSwgc3JjIH0pO1xyXG4gICAgfVxyXG59O1xyXG5cclxuY29uc3QgcmVwb3J0ZXIgPSB7XHJcbiAgICBvblN1aXRlU3RhcnQ6IGZ1bmN0aW9uKC4uLmFyZ3MpIHtcclxuICAgICAgICBlbWl0UmVwb3J0ZXJFdmVudCgnb25TdWl0ZVN0YXJ0JywgYXJncyk7XHJcbiAgICB9LFxyXG4gICAgb25TdWl0ZUVuZDogZnVuY3Rpb24oLi4uYXJncykge1xyXG4gICAgICAgIGVtaXRSZXBvcnRlckV2ZW50KCdvblN1aXRlRW5kJywgYXJncyk7XHJcbiAgICB9LFxyXG4gICAgb25DYXNlU3RhcnQ6IGZ1bmN0aW9uKC4uLmFyZ3MpIHtcclxuICAgICAgICBlbWl0UmVwb3J0ZXJFdmVudCgnb25DYXNlU3RhcnQnLCBhcmdzKTtcclxuICAgIH0sXHJcbiAgICBvbkNhc2VFbmQ6IGZ1bmN0aW9uKC4uLmFyZ3MpIHtcclxuICAgICAgICBlbWl0UmVwb3J0ZXJFdmVudCgnb25DYXNlRW5kJywgYXJncyk7XHJcbiAgICB9LFxyXG4gICAgb25TdGVwU3RhcnQ6IGZ1bmN0aW9uKC4uLmFyZ3MpIHtcclxuICAgICAgICBlbWl0UmVwb3J0ZXJFdmVudCgnb25TdGVwU3RhcnQnLCBhcmdzKTtcclxuICAgIH0sXHJcbiAgICBvblN0ZXBFbmQ6IGZ1bmN0aW9uKC4uLmFyZ3MpIHtcclxuICAgICAgICBlbWl0UmVwb3J0ZXJFdmVudCgnb25TdGVwRW5kJywgYXJncyk7XHJcbiAgICB9LFxyXG4gICAgb25SdW5uZXJFbmQ6IGZ1bmN0aW9uKC4uLmFyZ3MpIHtcclxuICAgICAgICBlbWl0UmVwb3J0ZXJFdmVudCgnb25SdW5uZXJFbmQnLCBhcmdzKTtcclxuICAgIH0sXHJcbiAgICBvbkxvZ0VudHJ5OiBmdW5jdGlvbiguLi5hcmdzKSB7XHJcbiAgICAgICAgZW1pdFJlcG9ydGVyRXZlbnQoJ29uTG9nRW50cnknLCBhcmdzKTtcclxuICAgIH1cclxufTtcclxuXHJcbmZ1bmN0aW9uIHN0cmluZ2lmeShvYmopIHtcclxuICAgIHJldHVybiAodHlwZW9mIG9iaiA9PT0gJ3N0cmluZycgfHwgb2JqIGluc3RhbmNlb2YgU3RyaW5nID8gb2JqIDogSlNPTi5zdHJpbmdpZnkob2JqLCBudWxsLCAyKSk7XHJcbn1cclxuXHJcbi8vIHJlZGlyZWN0IHN0ZG91dCBhbmQgc3RkZXJyIHRvIHRoZSBsb2dnZXJcclxuLy9wcm9jZXNzLnN0ZG91dC53cml0ZSA9IGxvZ2dlci5kZWJ1ZztcclxuLy9wcm9jZXNzLnN0ZGVyci53cml0ZSA9IGxvZ2dlci5lcnJvcjtcclxuXHJcbmxldCBfd29ya2VyID0gbmV3IEN1Y3VtYmVyV29ya2VyKHJlcG9ydGVyKTtcclxuXHJcbm94dXRpbC5ob29rTG9ncyhsb2dnZXIpO1xyXG5cclxucHJvY2Vzcy5vbigndW5jYXVnaHRFeGNlcHRpb24nLCBhc3luYyhlcnIsIG9yaWdpbikgPT4ge1xyXG4gICAgbG9nZ2VyLmVycm9yKGVyci5tZXNzYWdlLCBJU1NVRVJTLlVTRVIpO1xyXG4gICAgcHJvY2Vzc1NlbmQoe1xyXG4gICAgICAgIGV2ZW50OiAnd29ya2VyRXJyb3InLFxyXG4gICAgICAgIGVyck1lc3NhZ2U6IGVyci5tZXNzYWdlLFxyXG4gICAgfSk7XHJcbn0pO1xyXG5cclxucHJvY2Vzcy5vbignU0lHSU5UJywgYXN5bmMgZnVuY3Rpb24oKSB7XHJcbiAgICBjb25zb2xlLmxvZygnU0lHSU5UIHJlY2VpdmVkJyk7XHJcbiAgICBhd2FpdCBkaXNwb3NlKCdDQU5DRUxFRCcpO1xyXG4gICAgcHJvY2Vzcy5leGl0KDApO1xyXG59KTtcclxuXHJcbnByb2Nlc3Mub24oJ21lc3NhZ2UnLCBhc3luYyBmdW5jdGlvbiAobXNnKSB7XHJcbiAgICBpZiAoIW1zZy50eXBlKSB7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgaWYgKG1zZy50eXBlID09PSAnaW52b2tlJyAmJiBtc2cubWV0aG9kKSB7XHJcbiAgICAgICAgY29uc3QgeyBjYWxsSWQsIG1ldGhvZCwgYXJncyB9ID0gbXNnO1xyXG4gICAgICAgIGNvbnN0IHsgcmV0dmFsLCBlcnJvciB9ID0gYXdhaXQgaW52b2tlKG1ldGhvZCwgYXJncyk7XHJcbiAgICAgICAgcHJvY2Vzc1NlbmQoe1xyXG4gICAgICAgICAgICBldmVudDogJ2ludm9rZTpyZXN1bHQnLFxyXG4gICAgICAgICAgICBtZXRob2Q6IG1ldGhvZCxcclxuICAgICAgICAgICAgY2FsbElkOiBjYWxsSWQsXHJcbiAgICAgICAgICAgIGVycm9yOiBlcnJvcixcclxuICAgICAgICAgICAgcmV0dmFsOiByZXR2YWxcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuICAgIGVsc2UgaWYgKG1zZy50eXBlID09PSAnZXhpdCcpIHtcclxuICAgICAgICBkaXNwb3NlKG1zZy5zdGF0dXMgfHwgbnVsbCk7XHJcbiAgICB9XHJcbn0pO1xyXG5cclxuZnVuY3Rpb24gcHJvY2Vzc1NlbmQobXNnKSB7XHJcbiAgICAvLyB3cmFwIHByb2Nlc3Muc2VuZCB3aXRoIHRyeS9jYXRjaCBhcyBzb21ldGltZXMgd2UgbWlnaHQgY2FsbCBwcm9jZXNzLnNlbmQgXHJcbiAgICAvLyB3aGVuIHBhcmVudCBwcm9jZXNzIGlzIGFscmVhZHkgZGlzY29ubmVjdGVkICh3aGVuIHVzZSBraWxscyB0aGUgbWFpbiBwcm9jZXNzKVxyXG4gICAgdHJ5IHtcclxuICAgICAgICAvLyBhZGQgdXRjIHRpbWVzdGFtcFxyXG4gICAgICAgIHByb2Nlc3Muc2VuZCh7IHRpbWU6IG94dXRpbC5nZXRUaW1lU3RhbXAoKSwgLi4ubXNnIH0pO1xyXG4gICAgfVxyXG4gICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAvLyBpZ25vcmVcclxuICAgIH1cclxufVxyXG5cclxuZnVuY3Rpb24gZW1pdFJlcG9ydGVyRXZlbnQobWV0aG9kLCBhcmdzKSB7XHJcbiAgICBwcm9jZXNzU2VuZCh7XHJcbiAgICAgICAgZXZlbnQ6ICdyZXBvcnRlcicsXHJcbiAgICAgICAgbWV0aG9kOiBtZXRob2QsXHJcbiAgICAgICAgYXJnczogYXJnc1xyXG4gICAgfSk7XHJcbn1cclxuXHJcbmFzeW5jIGZ1bmN0aW9uIGRpc3Bvc2Uoc3RhdHVzPSBudWxsKSB7XHJcbiAgICBpZiAoX3dvcmtlcikge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGF3YWl0IF93b3JrZXIuZGlzcG9zZShzdGF0dXMpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICAvLyBpZ25vcmVcclxuICAgICAgICB9XHJcbiAgICB9XHJcbn1cclxuXHJcbmFzeW5jIGZ1bmN0aW9uIGludm9rZShtZXRob2QsIGFyZ3MpIHtcclxuICAgIGxldCByZXR2YWwsIGVycm9yO1xyXG4gICAgaWYgKF93b3JrZXIgJiYgX3dvcmtlclttZXRob2RdICYmIHR5cGVvZiBfd29ya2VyW21ldGhvZF0gPT09ICdmdW5jdGlvbicpIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICByZXR2YWwgPSBhd2FpdCBfd29ya2VyW21ldGhvZF0uYXBwbHkoX3dvcmtlciwgYXJncyB8fCBbXSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGBGYWlsZWQgdG8gaW52b2tlIFwiJHttZXRob2R9XCIgbWV0aG9kOmAsIGUpO1xyXG4gICAgICAgICAgICBlcnJvciA9IGU7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgICAgZXJyb3IgPSBuZXcgRXJyb3IoYE1ldGhvZCBcIiR7bWV0aG9kfVwiIGRvZXMgbm90IGV4aXN0YCk7XHJcbiAgICB9XHJcbiAgICAvLyBjb252ZXJ0IEpTIGVycm9yIHRvIE94eWdlbiBGYWlsdXJlIG9iamVjdFxyXG4gICAgaWYgKGVycm9yKSB7XHJcbiAgICAgICAgZXJyb3IgPSBlcnJvckhlbHBlci5nZXRGYWlsdXJlRnJvbUVycm9yKGVycm9yKTtcclxuICAgIH1cclxuICAgIHJldHVybiB7IHJldHZhbCwgZXJyb3IgfTtcclxufSJdfQ==
@@ -4,12 +4,17 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.oxygen = exports.cucumber = void 0;
7
+
7
8
  require("source-map-support/register");
9
+
8
10
  var _cucumber = _interopRequireDefault(require("./cucumber"));
11
+
9
12
  var _oxygen = _interopRequireDefault(require("./oxygen"));
13
+
10
14
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
15
+
11
16
  const cucumber = _cucumber.default;
12
17
  exports.cucumber = cucumber;
13
18
  const oxygen = _oxygen.default;
14
19
  exports.oxygen = oxygen;
15
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJjdWN1bWJlciIsIkN1Y3VtYmVyUnVubmVyIiwib3h5Z2VuIiwiT3h5Z2VuUnVubmVyIl0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL3J1bm5lcnMvaW5kZXguanMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IEN1Y3VtYmVyUnVubmVyIGZyb20gJy4vY3VjdW1iZXInO1xyXG5pbXBvcnQgT3h5Z2VuUnVubmVyIGZyb20gJy4vb3h5Z2VuJztcclxuXHJcbmV4cG9ydCBjb25zdCBjdWN1bWJlciA9IEN1Y3VtYmVyUnVubmVyO1xyXG5leHBvcnQgY29uc3Qgb3h5Z2VuID0gT3h5Z2VuUnVubmVyO1xyXG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7QUFBQTtBQUNBO0FBQW9DO0FBRTdCLE1BQU1BLFFBQVEsR0FBR0MsaUJBQWM7QUFBQztBQUNoQyxNQUFNQyxNQUFNLEdBQUdDLGVBQVk7QUFBQyJ9
20
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9ydW5uZXJzL2luZGV4LmpzIl0sIm5hbWVzIjpbImN1Y3VtYmVyIiwiQ3VjdW1iZXJSdW5uZXIiLCJveHlnZW4iLCJPeHlnZW5SdW5uZXIiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7OztBQUFBOztBQUNBOzs7O0FBRU8sTUFBTUEsUUFBUSxHQUFHQyxpQkFBakI7O0FBQ0EsTUFBTUMsTUFBTSxHQUFHQyxlQUFmIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IEN1Y3VtYmVyUnVubmVyIGZyb20gJy4vY3VjdW1iZXInO1xyXG5pbXBvcnQgT3h5Z2VuUnVubmVyIGZyb20gJy4vb3h5Z2VuJztcclxuXHJcbmV4cG9ydCBjb25zdCBjdWN1bWJlciA9IEN1Y3VtYmVyUnVubmVyO1xyXG5leHBvcnQgY29uc3Qgb3h5Z2VuID0gT3h5Z2VuUnVubmVyO1xyXG4iXX0=
@@ -4,18 +4,28 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.default = void 0;
7
+
7
8
  require("source-map-support/register");
9
+
8
10
  const Fiber = require('fibers');
11
+
9
12
  const path = require('path');
13
+
10
14
  const fs = require('fs');
15
+
11
16
  const {
12
17
  EventEmitter
13
18
  } = require('events');
19
+
14
20
  const Oxygen = require('../../core/OxygenCore').default;
21
+
15
22
  const oxutil = require('../../lib/util');
23
+
16
24
  const errorHelper = require('../../errors/helper');
25
+
17
26
  require = require('esm')(module);
18
27
  global.browser = {};
28
+
19
29
  class OxygenWorker extends EventEmitter {
20
30
  constructor(reporter, logger) {
21
31
  super();
@@ -26,25 +36,34 @@ class OxygenWorker extends EventEmitter {
26
36
  this._reporter = reporter;
27
37
  this._runId = null;
28
38
  }
39
+
29
40
  async init(runId, options, caps) {
30
41
  this._runId = runId;
31
42
  this._opts = options;
32
43
  this._cwd = this._opts.cwd || process.cwd();
44
+
33
45
  if (!this._oxygen) {
34
46
  try {
35
47
  this._oxygen = new Oxygen();
48
+
36
49
  this._oxygen.on('command:before', this._handleBeforeCommand.bind(this));
50
+
37
51
  this._oxygen.on('command:after', this._handleAfterCommand.bind(this));
52
+
38
53
  this._oxygen.on('log', this._handleLogEntry.bind(this));
54
+
39
55
  await this._oxygen.init(options, caps);
40
56
  this._testHooks = oxutil.loadTestHooks(options);
57
+
41
58
  this._logger.debug('Oxygen initialization completed');
42
59
  } catch (e) {
43
60
  this._logger.debug(`Oxygen initialization failed: ${e.toString()}`);
61
+
44
62
  throw e;
45
63
  }
46
64
  }
47
65
  }
66
+
48
67
  async run({
49
68
  scriptPath,
50
69
  context,
@@ -53,23 +72,33 @@ class OxygenWorker extends EventEmitter {
53
72
  if (!this._oxygen) {
54
73
  throw Error('Oxygen is not initialized');
55
74
  }
75
+
56
76
  this._oxygen.context = context;
77
+
57
78
  this._oxygen.loadPageObjectFile(poFile);
79
+
58
80
  this._steps = [];
81
+
59
82
  if (this._cwd && !path.isAbsolute(scriptPath)) {
60
83
  scriptPath = path.resolve(this._cwd, scriptPath);
61
84
  }
85
+
62
86
  let error = null;
63
87
  let cwd = fs.realpathSync(this._cwd);
88
+
64
89
  try {
65
90
  this._oxygen && this._oxygen.onBeforeCase && (await this._oxygen.onBeforeCase(context));
66
91
  await this._runFnInFiberContext(() => {
67
92
  try {
68
93
  require.cache[require.resolve(scriptPath)] && delete require.cache[require.resolve(scriptPath)];
94
+
69
95
  const Module = require('module');
96
+
70
97
  const originalRequire = Module.prototype.require;
98
+
71
99
  Module.prototype.require = function () {
72
100
  const script = arguments['0'];
101
+
73
102
  if (script && script.startsWith('.')) {
74
103
  for (const key in require.cache) {
75
104
  if (key.startsWith && key.startsWith(cwd)) {
@@ -79,8 +108,10 @@ class OxygenWorker extends EventEmitter {
79
108
  }
80
109
  }
81
110
  }
111
+
82
112
  return originalRequire.apply(this, arguments);
83
113
  };
114
+
84
115
  require(scriptPath);
85
116
  } catch (e) {
86
117
  if (e && e.type && e.type === errorHelper.errorCode.ASSERT_PASSED) {} else {
@@ -91,29 +122,38 @@ class OxygenWorker extends EventEmitter {
91
122
  } catch (e) {
92
123
  error = e;
93
124
  }
125
+
94
126
  await this._oxygen._waitStepResult();
127
+
95
128
  if (error) {
96
129
  error = errorHelper.getFailureFromError(error);
97
130
  }
131
+
98
132
  let moduleCaps = {};
133
+
99
134
  if (this._oxygen && this._oxygen.getModulesCapabilities) {
100
135
  moduleCaps = this._oxygen.getModulesCapabilities();
101
136
  }
137
+
102
138
  this._oxygen && this._oxygen.onAfterCase && (await this._oxygen.onAfterCase(error));
103
139
  let resultStore = {};
140
+
104
141
  if (this._oxygen && this._oxygen.results) {
105
- resultStore = {
106
- ...this._oxygen.results
142
+ resultStore = { ...this._oxygen.results
107
143
  };
108
144
  }
145
+
109
146
  if (this._oxygen && this._oxygen.resetResults) {
110
147
  this._oxygen.resetResults();
111
148
  }
149
+
112
150
  this._steps = null;
113
151
  let oxContext = {};
152
+
114
153
  if (this._oxygen && this._oxygen.context) {
115
154
  oxContext = this._oxygen.context;
116
155
  }
156
+
117
157
  oxContext.vars = global.vars;
118
158
  return {
119
159
  error,
@@ -122,6 +162,7 @@ class OxygenWorker extends EventEmitter {
122
162
  context: oxContext
123
163
  };
124
164
  }
165
+
125
166
  async dispose(status = null) {
126
167
  if (this._oxygen) {
127
168
  try {
@@ -133,6 +174,7 @@ class OxygenWorker extends EventEmitter {
133
174
  }
134
175
  }
135
176
  }
177
+
136
178
  async disposeModules(status = null) {
137
179
  if (this._oxygen) {
138
180
  try {
@@ -144,12 +186,15 @@ class OxygenWorker extends EventEmitter {
144
186
  }
145
187
  }
146
188
  }
189
+
147
190
  async callTestHook(hookName, hookArgs) {
148
191
  if (!this._testHooks || !this._testHooks[hookName] || typeof this._testHooks[hookName] !== 'function') {
149
192
  throw new Error(`Hook does not exist: ${hookName}`);
150
193
  }
194
+
151
195
  await oxutil.executeTestHook(this._testHooks, hookName, hookArgs);
152
196
  }
197
+
153
198
  async _runFnInFiberContext(fn) {
154
199
  return new Promise((resolve, reject) => Fiber(() => {
155
200
  try {
@@ -160,18 +205,22 @@ class OxygenWorker extends EventEmitter {
160
205
  }
161
206
  }).run());
162
207
  }
208
+
163
209
  async replStart() {
164
210
  let commandResolve = () => {};
211
+
165
212
  setTimeout(async () => {
166
213
  if (this._oxygen && this._oxygen.modules) {
167
214
  const keys = Object.keys(this._oxygen.modules);
168
215
  let debug;
169
216
  keys.map(item => {
170
217
  const driver = this._oxygen.modules[item]['getDriver'] && this._oxygen.modules[item]['getDriver']();
218
+
171
219
  if (driver) {
172
220
  debug = this._oxygen.modules[item]['debug'];
173
221
  }
174
222
  });
223
+
175
224
  if (debug) {
176
225
  await debug();
177
226
  commandResolve();
@@ -184,29 +233,37 @@ class OxygenWorker extends EventEmitter {
184
233
  }, 10);
185
234
  return new Promise(resolve => commandResolve = resolve);
186
235
  }
236
+
187
237
  _handleBeforeCommand(e) {
188
238
  if (!e) {
189
239
  return;
190
240
  }
241
+
191
242
  this.emit('command:before', e);
192
243
  }
244
+
193
245
  _handleAfterCommand(e) {
194
246
  if (!e || !e.result) {
195
247
  return;
196
248
  }
249
+
197
250
  this._steps && this._steps.push(e.result);
198
251
  this.emit('command:after', e);
199
252
  }
253
+
200
254
  _handleLogEntry(e) {
201
255
  if (!e || !e.level || !e.message) {
202
256
  return;
203
257
  }
258
+
204
259
  if (e && e.level && e.level === 'error') {
205
260
  this._logger[e.level](e.message, e.src, e.err);
206
261
  } else {
207
262
  this._logger[e.level](e.message, e.src);
208
263
  }
209
264
  }
265
+
210
266
  }
267
+
211
268
  exports.default = OxygenWorker;
212
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJGaWJlciIsInJlcXVpcmUiLCJwYXRoIiwiZnMiLCJFdmVudEVtaXR0ZXIiLCJPeHlnZW4iLCJkZWZhdWx0Iiwib3h1dGlsIiwiZXJyb3JIZWxwZXIiLCJtb2R1bGUiLCJnbG9iYWwiLCJicm93c2VyIiwiT3h5Z2VuV29ya2VyIiwiY29uc3RydWN0b3IiLCJyZXBvcnRlciIsImxvZ2dlciIsIl9veHlnZW4iLCJfb3B0cyIsIl9sb2dnZXIiLCJfdGVzdEhvb2tzIiwiX3JlcG9ydGVyIiwiX3J1bklkIiwiaW5pdCIsInJ1bklkIiwib3B0aW9ucyIsImNhcHMiLCJfY3dkIiwiY3dkIiwicHJvY2VzcyIsIm9uIiwiX2hhbmRsZUJlZm9yZUNvbW1hbmQiLCJiaW5kIiwiX2hhbmRsZUFmdGVyQ29tbWFuZCIsIl9oYW5kbGVMb2dFbnRyeSIsImxvYWRUZXN0SG9va3MiLCJkZWJ1ZyIsImUiLCJ0b1N0cmluZyIsInJ1biIsInNjcmlwdFBhdGgiLCJjb250ZXh0IiwicG9GaWxlIiwiRXJyb3IiLCJsb2FkUGFnZU9iamVjdEZpbGUiLCJfc3RlcHMiLCJpc0Fic29sdXRlIiwicmVzb2x2ZSIsImVycm9yIiwicmVhbHBhdGhTeW5jIiwib25CZWZvcmVDYXNlIiwiX3J1bkZuSW5GaWJlckNvbnRleHQiLCJjYWNoZSIsIk1vZHVsZSIsIm9yaWdpbmFsUmVxdWlyZSIsInByb3RvdHlwZSIsInNjcmlwdCIsImFyZ3VtZW50cyIsInN0YXJ0c1dpdGgiLCJrZXkiLCJleGkiLCJhcHBseSIsInR5cGUiLCJlcnJvckNvZGUiLCJBU1NFUlRfUEFTU0VEIiwiX3dhaXRTdGVwUmVzdWx0IiwiZ2V0RmFpbHVyZUZyb21FcnJvciIsIm1vZHVsZUNhcHMiLCJnZXRNb2R1bGVzQ2FwYWJpbGl0aWVzIiwib25BZnRlckNhc2UiLCJyZXN1bHRTdG9yZSIsInJlc3VsdHMiLCJyZXNldFJlc3VsdHMiLCJveENvbnRleHQiLCJ2YXJzIiwiZGlzcG9zZSIsInN0YXR1cyIsImRpc3Bvc2VNb2R1bGVzIiwiY2FsbFRlc3RIb29rIiwiaG9va05hbWUiLCJob29rQXJncyIsImV4ZWN1dGVUZXN0SG9vayIsImZuIiwiUHJvbWlzZSIsInJlamVjdCIsInJlc3VsdCIsImVyciIsInJlcGxTdGFydCIsImNvbW1hbmRSZXNvbHZlIiwic2V0VGltZW91dCIsIm1vZHVsZXMiLCJrZXlzIiwiT2JqZWN0IiwibWFwIiwiaXRlbSIsImRyaXZlciIsImVtaXQiLCJwdXNoIiwibGV2ZWwiLCJtZXNzYWdlIiwic3JjIl0sInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3J1bm5lcnMvb3h5Z2VuL094eWdlbldvcmtlci5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKlxyXG4gKiBDb3B5cmlnaHQgKEMpIDIwMTktcHJlc2VudCBDbG91ZEJlYXQgTGltaXRlZFxyXG4gKlxyXG4gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeVxyXG4gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieVxyXG4gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvclxyXG4gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLlxyXG4gKlxyXG4gKiBCYXNlZCBvbjpcclxuICogQ29weXJpZ2h0IChjKSBPcGVuSlMgRm91bmRhdGlvbiBhbmQgb3RoZXIgY29udHJpYnV0b3JzLiBMaWNlbnNlZCB1bmRlciBNSVQuXHJcbiAqL1xyXG5cclxuY29uc3QgRmliZXIgPSByZXF1aXJlKCdmaWJlcnMnKTtcclxuY29uc3QgcGF0aCA9IHJlcXVpcmUoJ3BhdGgnKTtcclxuY29uc3QgZnMgPSByZXF1aXJlKCdmcycpO1xyXG5jb25zdCB7IEV2ZW50RW1pdHRlciB9ID0gcmVxdWlyZSgnZXZlbnRzJyk7XHJcblxyXG5jb25zdCBPeHlnZW4gPSByZXF1aXJlKCcuLi8uLi9jb3JlL094eWdlbkNvcmUnKS5kZWZhdWx0O1xyXG5jb25zdCBveHV0aWwgPSByZXF1aXJlKCcuLi8uLi9saWIvdXRpbCcpO1xyXG5jb25zdCBlcnJvckhlbHBlciA9IHJlcXVpcmUoJy4uLy4uL2Vycm9ycy9oZWxwZXInKTtcclxuXHJcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1nbG9iYWwtYXNzaWduXHJcbnJlcXVpcmUgPSByZXF1aXJlKCdlc20nKShtb2R1bGUpO1xyXG5cclxuLy8gbW9ja3VwIGdsb2JiYWwuYnJvd3NlciBvYmplY3QgZm9yIGludGVybmFsIFdESU8gZnVuY3Rpb25zIHRvIHdvcmsgcHJvcGVybHlcclxuZ2xvYmFsLmJyb3dzZXIgPSB7fTtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIE94eWdlbldvcmtlciBleHRlbmRzIEV2ZW50RW1pdHRlciB7XHJcbiAgICBjb25zdHJ1Y3RvciAocmVwb3J0ZXIsIGxvZ2dlcikge1xyXG4gICAgICAgIHN1cGVyKCk7XHJcbiAgICAgICAgdGhpcy5fb3h5Z2VuID0gbnVsbDtcclxuICAgICAgICB0aGlzLl9vcHRzID0gbnVsbDtcclxuICAgICAgICB0aGlzLl9sb2dnZXIgPSBsb2dnZXI7XHJcbiAgICAgICAgdGhpcy5fdGVzdEhvb2tzID0ge307XHJcbiAgICAgICAgdGhpcy5fcmVwb3J0ZXIgPSByZXBvcnRlcjtcclxuICAgICAgICB0aGlzLl9ydW5JZCA9IG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgaW5pdChydW5JZCwgb3B0aW9ucywgY2Fwcykge1xyXG4gICAgICAgIHRoaXMuX3J1bklkID0gcnVuSWQ7XHJcbiAgICAgICAgdGhpcy5fb3B0cyA9IG9wdGlvbnM7XHJcbiAgICAgICAgdGhpcy5fY3dkID0gdGhpcy5fb3B0cy5jd2QgfHwgcHJvY2Vzcy5jd2QoKTtcclxuXHJcbiAgICAgICAgaWYgKCF0aGlzLl9veHlnZW4pIHtcclxuICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX294eWdlbiA9IG5ldyBPeHlnZW4oKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuX294eWdlbi5vbignY29tbWFuZDpiZWZvcmUnLCB0aGlzLl9oYW5kbGVCZWZvcmVDb21tYW5kLmJpbmQodGhpcykpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fb3h5Z2VuLm9uKCdjb21tYW5kOmFmdGVyJywgdGhpcy5faGFuZGxlQWZ0ZXJDb21tYW5kLmJpbmQodGhpcykpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fb3h5Z2VuLm9uKCdsb2cnLCB0aGlzLl9oYW5kbGVMb2dFbnRyeS5iaW5kKHRoaXMpKTtcclxuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuX294eWdlbi5pbml0KG9wdGlvbnMsIGNhcHMpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fdGVzdEhvb2tzID0gb3h1dGlsLmxvYWRUZXN0SG9va3Mob3B0aW9ucyk7XHJcbiAgICAgICAgICAgICAgICAvL21ha2VNb2R1bGVzR2xvYmFsKG9wdGlvbnMpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fbG9nZ2VyLmRlYnVnKCdPeHlnZW4gaW5pdGlhbGl6YXRpb24gY29tcGxldGVkJyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX2xvZ2dlci5kZWJ1ZyhgT3h5Z2VuIGluaXRpYWxpemF0aW9uIGZhaWxlZDogJHtlLnRvU3RyaW5nKCl9YCk7XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIHJ1bih7IHNjcmlwdFBhdGgsIGNvbnRleHQsIHBvRmlsZSA9IG51bGwgfSkge1xyXG4gICAgICAgIC8vIGFzc2lnbiB1cCB0byBkYXRlIGNvbnRleHQgdG8gT3h5Z2VuIENvcmUgdG8gcmVmbGVjdCBuZXcgcGFyYW1ldGVycyBhbmQgb3RoZXIgY29udGV4dCBkYXRhXHJcbiAgICAgICAgaWYgKCF0aGlzLl9veHlnZW4pIHtcclxuICAgICAgICAgICAgdGhyb3cgRXJyb3IgKCdPeHlnZW4gaXMgbm90IGluaXRpYWxpemVkJyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuX294eWdlbi5jb250ZXh0ID0gY29udGV4dDtcclxuICAgICAgICB0aGlzLl9veHlnZW4ubG9hZFBhZ2VPYmplY3RGaWxlKHBvRmlsZSk7XHJcbiAgICAgICAgdGhpcy5fc3RlcHMgPSBbXTtcclxuICAgICAgICBpZiAodGhpcy5fY3dkICYmICFwYXRoLmlzQWJzb2x1dGUoc2NyaXB0UGF0aCkpIHtcclxuICAgICAgICAgICAgc2NyaXB0UGF0aCA9IHBhdGgucmVzb2x2ZSh0aGlzLl9jd2QsIHNjcmlwdFBhdGgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBsZXQgZXJyb3IgPSBudWxsO1xyXG5cclxuICAgICAgICAvLyBvbiBPU1ggY3dkIHdpbGwgYmUgYSBzeW1saW5rOiBcIi92YXIvZm9sZGVycy8uLlwiIGluc3RlYWQgb2YgXCIvcHJpdmF0ZS92YXIvZm9sZGVycy8uLlwiICh0aGlzIGNvdWxkIGFsc28gaGFwcGVuIG9uIG90aGVyIHBsYXRmb3JtcyB0b28pXHJcbiAgICAgICAgLy8gc28gd2UgbmVlZCB0byByZXNvbHZlIGl0IHRvIHJlYWwgcGF0aFxyXG4gICAgICAgIGxldCBjd2QgPSBmcy5yZWFscGF0aFN5bmModGhpcy5fY3dkKTtcclxuXHJcbiAgICAgICAgLy8gbG9hZCBhbmQgcnVuIHRoZSB0ZXN0IHNjcmlwdFxyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIHRoaXMuX294eWdlbiAmJiB0aGlzLl9veHlnZW4ub25CZWZvcmVDYXNlICYmIGF3YWl0IHRoaXMuX294eWdlbi5vbkJlZm9yZUNhc2UoY29udGV4dCk7XHJcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuX3J1bkZuSW5GaWJlckNvbnRleHQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgICAgICAvLyBtYWtlIHN1cmUgdG8gY2xlYXIgcmVxdWlyZSBjYWNoZSBzbyB0aGUgc2NyaXB0IHdpbGwgYmUgZXhlY3V0ZWQgb24gZWFjaCBpdGVyYXRpb25cclxuICAgICAgICAgICAgICAgICAgICByZXF1aXJlLmNhY2hlW3JlcXVpcmUucmVzb2x2ZShzY3JpcHRQYXRoKV0gJiYgZGVsZXRlIHJlcXVpcmUuY2FjaGVbcmVxdWlyZS5yZXNvbHZlKHNjcmlwdFBhdGgpXTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgLy8gaWYgdXNlciB1c2VzIHJlcXVpcmUoJy4vc29tZXNjcmlwdC5qcycpIGluIG11bHRpcGxlIHRlc3Qgc2NyaXB0cyAoY2FzZXMpLCBhbmQgc29tZXNjcmlwdC5qcyBjb250YWlucyB3ZWIvbW9iLmluaXRcclxuICAgICAgICAgICAgICAgICAgICAvLyB0aGVuLCB3aGVuIHRob3NlIHNjcmlwdHMgYXJlIGV4ZWN1dGVkIGluIGEgc3VpdGUsIG9ubHkgZmlyc3QgY2FzZSB3aWxsIHBhc3MsIHRoZSByZXN0IHdpbGwgZmFpbCB3aXRoIE1PRFVMRV9OT1RfSU5JVElBTElaRUQgZXJyb3IuXHJcbiAgICAgICAgICAgICAgICAgICAgLy8gdGhpcyBpcyBiZWNhdXNlICdyZXF1aXJlJyBpcyBjYWNoZWQsIGFuZCB3aGVuIHRoZSBmaXJzdCBjYXNlIGlzIGZpbmlzaGVkLCB0aGUgbW9kdWxlIGlzIG1hcmtlZCBhcyBpc0luaXRpYWxpemVkID0gZmFsc2VcclxuICAgICAgICAgICAgICAgICAgICAvLyBhbmQgbm90IHJlLWluaXRpYWxpemVkIGJhY2sgb24gbmV4dCBjYXNlLlxyXG4gICAgICAgICAgICAgICAgICAgIC8vIHRodXMgd2UgY2xlYW4gdXNlciBsZXZlbCBzY3JpcHRzIGZyb20gJ3JlcXVpcmUnIGNhY2hlLlxyXG4gICAgICAgICAgICAgICAgICAgIC8vIEZJWE1FOiB3ZWIuaW5pdCBhbmQgb3RoZXIgbW9kdWxlcyBzaG91bGQgYmUgcHJvYmFibHkgZml4ZWQgKHByb3Blcmx5IGRpc3Bvc2VkKVxyXG4gICAgICAgICAgICAgICAgICAgIC8vIE5PVEU6IHRoaXMgb2J2aW91c2x5IHJlbGF0ZXMgbm90IG9ubHkgdG8gd2ViLCBldGMgbW9kdWxlLiB0aGlzIGlzIGEgZ2VuZXJhbCBpc3N1ZS5cclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBNb2R1bGUgPSByZXF1aXJlKCdtb2R1bGUnKTtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBvcmlnaW5hbFJlcXVpcmUgPSBNb2R1bGUucHJvdG90eXBlLnJlcXVpcmU7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIE1vZHVsZS5wcm90b3R5cGUucmVxdWlyZSA9IGZ1bmN0aW9uKCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzY3JpcHQgPSBhcmd1bWVudHNbJzAnXTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGludmFsaWRhdGUgY2FjaGUgb25seSB3aGVuIHdlIHRyeSB0byBsb2FkIHVzZXItbGV2ZWwgc2NyaXB0cyAodGhvc2Ugc3RhcnRpbmcgd2l0aCAnLi8nIG9yICcuLi8nKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2NyaXB0ICYmIHNjcmlwdC5zdGFydHNXaXRoKCcuJykpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlbW92ZSBldmVyeXRoaW5nIHVzZXIgcmVsYXRlZCBmcm9tIHRoZSBjYWNoZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gcmVxdWlyZS5jYWNoZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChrZXkuc3RhcnRzV2l0aCAmJiBrZXkuc3RhcnRzV2l0aChjd2QpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgcmVxdWlyZS5jYWNoZVtrZXldO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChleGkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlnbm9yZWRcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9yaWdpbmFsUmVxdWlyZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xyXG4gICAgICAgICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgICAgICAgICAgcmVxdWlyZShzY3JpcHRQYXRoKTtcclxuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgICAgICAgICAvLyBlcnJvciA9IGUuY29kZSAmJiBlLmNvZGUgPT09ICdNT0RVTEVfTk9UX0ZPVU5EJyA/IG5ldyBTY3JpcHROb3RGb3VuZEVycm9yKHNjcmlwdFBhdGgpIDogZTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGUgJiYgZS50eXBlICYmIGUudHlwZSA9PT0gZXJyb3JIZWxwZXIuZXJyb3JDb2RlLkFTU0VSVF9QQVNTRUQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy9pZ25vcmVcclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBlcnJvciA9IGU7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgIGVycm9yID0gZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIEluIHNvbWUgY2FzZXMgc3RlcCByZXN1bHQgZ2VuZXJhdGlvbiB0YWtlcyBzb21lIHRpbWUgdG8gbWFrZSBzY3JlZW5zaG90XHJcbiAgICAgICAgYXdhaXQgdGhpcy5fb3h5Z2VuLl93YWl0U3RlcFJlc3VsdCgpO1xyXG5cclxuICAgICAgICBpZiAoZXJyb3IpIHtcclxuICAgICAgICAgICAgZXJyb3IgPSBlcnJvckhlbHBlci5nZXRGYWlsdXJlRnJvbUVycm9yKGVycm9yKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGxldCBtb2R1bGVDYXBzID0ge307XHJcblxyXG4gICAgICAgIGlmICh0aGlzLl9veHlnZW4gJiYgdGhpcy5fb3h5Z2VuLmdldE1vZHVsZXNDYXBhYmlsaXRpZXMpIHtcclxuICAgICAgICAgICAgbW9kdWxlQ2FwcyA9IHRoaXMuX294eWdlbi5nZXRNb2R1bGVzQ2FwYWJpbGl0aWVzKCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLl9veHlnZW4gJiYgdGhpcy5fb3h5Z2VuLm9uQWZ0ZXJDYXNlICYmIGF3YWl0IHRoaXMuX294eWdlbi5vbkFmdGVyQ2FzZShlcnJvcik7XHJcblxyXG4gICAgICAgIC8vIGNsb25lIHRoZSByZXN1bHRzLCBvdGhlcndpc2UgcmVzdWx0U3RvcmUgd2lsbCBiZSBlbXB0eSBhZnRlciB0aGUgZm9sbG93aW5nIHRoaXMuX294eWdlbi5yZXNldFJlc3VsdHMoKSBjYWxsXHJcblxyXG4gICAgICAgIGxldCByZXN1bHRTdG9yZSA9IHt9O1xyXG5cclxuICAgICAgICBpZiAodGhpcy5fb3h5Z2VuICYmIHRoaXMuX294eWdlbi5yZXN1bHRzKSB7XHJcbiAgICAgICAgICAgIHJlc3VsdFN0b3JlID0geyAuLi50aGlzLl9veHlnZW4ucmVzdWx0cyB9O1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHRoaXMuX294eWdlbiAmJiB0aGlzLl9veHlnZW4ucmVzZXRSZXN1bHRzKSB7XHJcbiAgICAgICAgICAgIC8vIHJlc2V0IHN0ZXBzIGFuZCBvdGhlciByZXN1bHQgZGF0YVxyXG4gICAgICAgICAgICB0aGlzLl9veHlnZW4ucmVzZXRSZXN1bHRzKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuX3N0ZXBzID0gbnVsbDtcclxuXHJcbiAgICAgICAgbGV0IG94Q29udGV4dCA9IHt9O1xyXG4gICAgICAgIGlmICh0aGlzLl9veHlnZW4gJiYgdGhpcy5fb3h5Z2VuLmNvbnRleHQpIHtcclxuICAgICAgICAgICAgb3hDb250ZXh0ID0gdGhpcy5fb3h5Z2VuLmNvbnRleHQ7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIG94Q29udGV4dC52YXJzID0gZ2xvYmFsLnZhcnM7XHJcblxyXG4gICAgICAgIHJldHVybiB7IGVycm9yLCBtb2R1bGVDYXBzLCByZXN1bHRTdG9yZSwgY29udGV4dDogb3hDb250ZXh0IH07XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgZGlzcG9zZShzdGF0dXMgPSBudWxsKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuX294eWdlbikge1xyXG4gICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5fb3h5Z2VuLmRpc3Bvc2Uoc3RhdHVzKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKCdGYWlsZWQgdG8gZGlzcG9zZSBPeHlnZW4nLCBudWxsLCBlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBmaW5hbGx5IHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX3N0ZXBzID0gbnVsbDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBkaXNwb3NlTW9kdWxlcyhzdGF0dXMgPSBudWxsKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuX294eWdlbikge1xyXG4gICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5fb3h5Z2VuLmRpc3Bvc2VNb2R1bGVzKHN0YXR1cyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcignRmFpbGVkIHRvIGRpc3Bvc2UgT3h5Z2VuIG1vZHVsZXMnLCBudWxsLCBlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBmaW5hbGx5IHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX294eWdlbi5yZXNldFJlc3VsdHMoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBjYWxsVGVzdEhvb2soaG9va05hbWUsIGhvb2tBcmdzKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLl90ZXN0SG9va3MgfHwgIXRoaXMuX3Rlc3RIb29rc1tob29rTmFtZV0gfHwgdHlwZW9mIHRoaXMuX3Rlc3RIb29rc1tob29rTmFtZV0gIT09ICdmdW5jdGlvbicpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBIb29rIGRvZXMgbm90IGV4aXN0OiAke2hvb2tOYW1lfWApO1xyXG4gICAgICAgIH1cclxuICAgICAgICBhd2FpdCBveHV0aWwuZXhlY3V0ZVRlc3RIb29rKHRoaXMuX3Rlc3RIb29rcywgaG9va05hbWUsIGhvb2tBcmdzKTtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBfcnVuRm5JbkZpYmVyQ29udGV4dCAoZm4pIHtcclxuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4gRmliZXIoKCkgPT4ge1xyXG4gICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gZm4uYXBwbHkodGhpcyk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzb2x2ZShyZXN1bHQpO1xyXG4gICAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiByZWplY3QoZXJyKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pLnJ1bigpKTtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyByZXBsU3RhcnQoKSB7XHJcbiAgICAgICAgbGV0IGNvbW1hbmRSZXNvbHZlID0gKCkgPT4geyB9O1xyXG5cclxuICAgICAgICBzZXRUaW1lb3V0KGFzeW5jKCkgPT4ge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5fb3h5Z2VuICYmIHRoaXMuX294eWdlbi5tb2R1bGVzKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXModGhpcy5fb3h5Z2VuLm1vZHVsZXMpO1xyXG4gICAgICAgICAgICAgICAgbGV0IGRlYnVnO1xyXG4gICAgICAgICAgICAgICAga2V5cy5tYXAoKGl0ZW0pID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBkcml2ZXIgPSB0aGlzLl9veHlnZW4ubW9kdWxlc1tpdGVtXVsnZ2V0RHJpdmVyJ10gJiYgdGhpcy5fb3h5Z2VuLm1vZHVsZXNbaXRlbV1bJ2dldERyaXZlciddKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGRyaXZlcikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBkZWJ1ZyA9IHRoaXMuX294eWdlbi5tb2R1bGVzW2l0ZW1dWydkZWJ1ZyddO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgICAgIGlmIChkZWJ1Zykge1xyXG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IGRlYnVnKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgY29tbWFuZFJlc29sdmUoKTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29tbWFuZFJlc29sdmUoKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGNvbW1hbmRSZXNvbHZlKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9LCAxMCk7XHJcblxyXG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4gKGNvbW1hbmRSZXNvbHZlID0gcmVzb2x2ZSkpO1xyXG4gICAgfVxyXG5cclxuICAgIF9oYW5kbGVCZWZvcmVDb21tYW5kKGUpIHtcclxuICAgICAgICBpZiAoIWUpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmVtaXQoJ2NvbW1hbmQ6YmVmb3JlJywgZSk7XHJcbiAgICB9XHJcblxyXG4gICAgX2hhbmRsZUFmdGVyQ29tbWFuZChlKSB7XHJcbiAgICAgICAgaWYgKCFlIHx8ICFlLnJlc3VsdCkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLl9zdGVwcyAmJiB0aGlzLl9zdGVwcy5wdXNoKGUucmVzdWx0KTtcclxuICAgICAgICB0aGlzLmVtaXQoJ2NvbW1hbmQ6YWZ0ZXInLCBlKTtcclxuICAgIH1cclxuXHJcbiAgICBfaGFuZGxlTG9nRW50cnkoZSkge1xyXG4gICAgICAgIGlmICghZSB8fCAhZS5sZXZlbCB8fCAhZS5tZXNzYWdlKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGUgJiYgZS5sZXZlbCAmJiBlLmxldmVsID09PSAnZXJyb3InKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2xvZ2dlcltlLmxldmVsXShlLm1lc3NhZ2UsIGUuc3JjLCBlLmVycik7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5fbG9nZ2VyW2UubGV2ZWxdKGUubWVzc2FnZSwgZS5zcmMpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxufVxyXG4i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
269
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9ydW5uZXJzL294eWdlbi9PeHlnZW5Xb3JrZXIuanMiXSwibmFtZXMiOlsiRmliZXIiLCJyZXF1aXJlIiwicGF0aCIsImZzIiwiRXZlbnRFbWl0dGVyIiwiT3h5Z2VuIiwiZGVmYXVsdCIsIm94dXRpbCIsImVycm9ySGVscGVyIiwibW9kdWxlIiwiZ2xvYmFsIiwiYnJvd3NlciIsIk94eWdlbldvcmtlciIsImNvbnN0cnVjdG9yIiwicmVwb3J0ZXIiLCJsb2dnZXIiLCJfb3h5Z2VuIiwiX29wdHMiLCJfbG9nZ2VyIiwiX3Rlc3RIb29rcyIsIl9yZXBvcnRlciIsIl9ydW5JZCIsImluaXQiLCJydW5JZCIsIm9wdGlvbnMiLCJjYXBzIiwiX2N3ZCIsImN3ZCIsInByb2Nlc3MiLCJvbiIsIl9oYW5kbGVCZWZvcmVDb21tYW5kIiwiYmluZCIsIl9oYW5kbGVBZnRlckNvbW1hbmQiLCJfaGFuZGxlTG9nRW50cnkiLCJsb2FkVGVzdEhvb2tzIiwiZGVidWciLCJlIiwidG9TdHJpbmciLCJydW4iLCJzY3JpcHRQYXRoIiwiY29udGV4dCIsInBvRmlsZSIsIkVycm9yIiwibG9hZFBhZ2VPYmplY3RGaWxlIiwiX3N0ZXBzIiwiaXNBYnNvbHV0ZSIsInJlc29sdmUiLCJlcnJvciIsInJlYWxwYXRoU3luYyIsIm9uQmVmb3JlQ2FzZSIsIl9ydW5GbkluRmliZXJDb250ZXh0IiwiY2FjaGUiLCJNb2R1bGUiLCJvcmlnaW5hbFJlcXVpcmUiLCJwcm90b3R5cGUiLCJzY3JpcHQiLCJhcmd1bWVudHMiLCJzdGFydHNXaXRoIiwia2V5IiwiZXhpIiwiYXBwbHkiLCJ0eXBlIiwiZXJyb3JDb2RlIiwiQVNTRVJUX1BBU1NFRCIsIl93YWl0U3RlcFJlc3VsdCIsImdldEZhaWx1cmVGcm9tRXJyb3IiLCJtb2R1bGVDYXBzIiwiZ2V0TW9kdWxlc0NhcGFiaWxpdGllcyIsIm9uQWZ0ZXJDYXNlIiwicmVzdWx0U3RvcmUiLCJyZXN1bHRzIiwicmVzZXRSZXN1bHRzIiwib3hDb250ZXh0IiwidmFycyIsImRpc3Bvc2UiLCJzdGF0dXMiLCJkaXNwb3NlTW9kdWxlcyIsImNhbGxUZXN0SG9vayIsImhvb2tOYW1lIiwiaG9va0FyZ3MiLCJleGVjdXRlVGVzdEhvb2siLCJmbiIsIlByb21pc2UiLCJyZWplY3QiLCJyZXN1bHQiLCJlcnIiLCJyZXBsU3RhcnQiLCJjb21tYW5kUmVzb2x2ZSIsInNldFRpbWVvdXQiLCJtb2R1bGVzIiwia2V5cyIsIk9iamVjdCIsIm1hcCIsIml0ZW0iLCJkcml2ZXIiLCJlbWl0IiwicHVzaCIsImxldmVsIiwibWVzc2FnZSIsInNyYyJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7O0FBWUEsTUFBTUEsS0FBSyxHQUFHQyxPQUFPLENBQUMsUUFBRCxDQUFyQjs7QUFDQSxNQUFNQyxJQUFJLEdBQUdELE9BQU8sQ0FBQyxNQUFELENBQXBCOztBQUNBLE1BQU1FLEVBQUUsR0FBR0YsT0FBTyxDQUFDLElBQUQsQ0FBbEI7O0FBQ0EsTUFBTTtBQUFFRyxFQUFBQTtBQUFGLElBQW1CSCxPQUFPLENBQUMsUUFBRCxDQUFoQzs7QUFFQSxNQUFNSSxNQUFNLEdBQUdKLE9BQU8sQ0FBQyx1QkFBRCxDQUFQLENBQWlDSyxPQUFoRDs7QUFDQSxNQUFNQyxNQUFNLEdBQUdOLE9BQU8sQ0FBQyxnQkFBRCxDQUF0Qjs7QUFDQSxNQUFNTyxXQUFXLEdBQUdQLE9BQU8sQ0FBQyxxQkFBRCxDQUEzQjs7QUFHQUEsT0FBTyxHQUFHQSxPQUFPLENBQUMsS0FBRCxDQUFQLENBQWVRLE1BQWYsQ0FBVjtBQUdBQyxNQUFNLENBQUNDLE9BQVAsR0FBaUIsRUFBakI7O0FBRWUsTUFBTUMsWUFBTixTQUEyQlIsWUFBM0IsQ0FBd0M7QUFDbkRTLEVBQUFBLFdBQVcsQ0FBRUMsUUFBRixFQUFZQyxNQUFaLEVBQW9CO0FBQzNCO0FBQ0EsU0FBS0MsT0FBTCxHQUFlLElBQWY7QUFDQSxTQUFLQyxLQUFMLEdBQWEsSUFBYjtBQUNBLFNBQUtDLE9BQUwsR0FBZUgsTUFBZjtBQUNBLFNBQUtJ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bkUsT0FBTCxDQUFha0IsQ0FBQyxDQUFDNkQsS0FBZixFQUFzQjdELENBQUMsQ0FBQzhELE9BQXhCLEVBQWlDOUQsQ0FBQyxDQUFDK0QsR0FBbkM7QUFDSDtBQUNKOztBQWhQa0QiLCJzb3VyY2VzQ29udGVudCI6WyIvKlxyXG4gKiBDb3B5cmlnaHQgKEMpIDIwMTktcHJlc2VudCBDbG91ZEJlYXQgTGltaXRlZFxyXG4gKlxyXG4gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeVxyXG4gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieVxyXG4gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvclxyXG4gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLlxyXG4gKlxyXG4gKiBCYXNlZCBvbjpcclxuICogQ29weXJpZ2h0IChjKSBPcGVuSlMgRm91bmRhdGlvbiBhbmQgb3RoZXIgY29udHJpYnV0b3JzLiBMaWNlbnNlZCB1bmRlciBNSVQuXHJcbiAqL1xyXG5cclxuY29uc3QgRmliZXIgPSByZXF1aXJlKCdmaWJlcnMnKTtcclxuY29uc3QgcGF0aCA9IHJlcXVpcmUoJ3BhdGgnKTtcclxuY29uc3QgZnMgPSByZXF1aXJlKCdmcycpO1xyXG5jb25zdCB7IEV2ZW50RW1pdHRlciB9ID0gcmVxdWlyZSgnZXZlbnRzJyk7XHJcblxyXG5jb25zdCBPeHlnZW4gPSByZXF1aXJlKCcuLi8uLi9jb3JlL094eWdlbkNvcmUnKS5kZWZhdWx0O1xyXG5jb25zdCBveHV0aWwgPSByZXF1aXJlKCcuLi8uLi9saWIvdXRpbCcpO1xyXG5jb25zdCBlcnJvckhlbHBlciA9IHJlcXVpcmUoJy4uLy4uL2Vycm9ycy9oZWxwZXInKTtcclxuXHJcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1nbG9iYWwtYXNzaWduXHJcbnJlcXVpcmUgPSByZXF1aXJlKCdlc20nKShtb2R1bGUpO1xyXG5cclxuLy8gbW9ja3VwIGdsb2JiYWwuYnJvd3NlciBvYmplY3QgZm9yIGludGVybmFsIFdESU8gZnVuY3Rpb25zIHRvIHdvcmsgcHJvcGVybHlcclxuZ2xvYmFsLmJyb3dzZXIgPSB7fTtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIE94eWdlbldvcmtlciBleHRlbmRzIEV2ZW50RW1pdHRlciB7XHJcbiAgICBjb25zdHJ1Y3RvciAocmVwb3J0ZXIsIGxvZ2dlcikge1xyXG4gICAgICAgIHN1cGVyKCk7XHJcbiAgICAgICAgdGhpcy5fb3h5Z2VuID0gbnVsbDtcclxuICAgICAgICB0aGlzLl9vcHRzID0gbnVsbDtcclxuICAgICAgICB0aGlzLl9sb2dnZXIgPSBsb2dnZXI7XHJcbiAgICAgICAgdGhpcy5fdGVzdEhvb2tzID0ge307XHJcbiAgICAgICAgdGhpcy5fcmVwb3J0ZXIgPSByZXBvcnRlcjtcclxuICAgICAgICB0aGlzLl9ydW5JZCA9IG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgaW5pdChydW5JZCwgb3B0aW9ucywgY2Fwcykge1xyXG4gICAgICAgIHRoaXMuX3J1bklkID0gcnVuSWQ7XHJcbiAgICAgICAgdGhpcy5fb3B0cyA9IG9wdGlvbnM7XHJcbiAgICAgICAgdGhpcy5fY3dkID0gdGhpcy5fb3B0cy5jd2QgfHwgcHJvY2Vzcy5jd2QoKTtcclxuXHJcbiAgICAgICAgaWYgKCF0aGlzLl9veHlnZW4pIHtcclxuICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX294eWdlbiA9IG5ldyBPeHlnZW4oKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuX294eWdlbi5vbignY29tbWFuZDpiZWZvcmUnLCB0aGlzLl9oYW5kbGVCZWZvcmVDb21tYW5kLmJpbmQodGhpcykpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fb3h5Z2VuLm9uKCdjb21tYW5kOmFmdGVyJywgdGhpcy5faGFuZGxlQWZ0ZXJDb21tYW5kLmJpbmQodGhpcykpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fb3h5Z2VuLm9uKCdsb2cnLCB0aGlzLl9oYW5kbGVMb2dFbnRyeS5iaW5kKHRoaXMpKTtcclxuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuX294eWdlbi5pbml0KG9wdGlvbnMsIGNhcHMpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fdGVzdEhvb2tzID0gb3h1dGlsLmxvYWRUZXN0SG9va3Mob3B0aW9ucyk7XHJcbiAgICAgICAgICAgICAgICAvL21ha2VNb2R1bGVzR2xvYmFsKG9wdGlvbnMpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fbG9nZ2VyLmRlYnVnKCdPeHlnZW4gaW5pdGlhbGl6YXRpb24gY29tcGxldGVkJyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX2xvZ2dlci5kZWJ1ZyhgT3h5Z2VuIGluaXRpYWxpemF0aW9uIGZhaWxlZDogJHtlLnRvU3RyaW5nKCl9YCk7XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIHJ1bih7IHNjcmlwdFBhdGgsIGNvbnRleHQsIHBvRmlsZSA9IG51bGwgfSkge1xyXG4gICAgICAgIC8vIGFzc2lnbiB1cCB0byBkYXRlIGNvbnRleHQgdG8gT3h5Z2VuIENvcmUgdG8gcmVmbGVjdCBuZXcgcGFyYW1ldGVycyBhbmQgb3RoZXIgY29udGV4dCBkYXRhXHJcbiAgICAgICAgaWYgKCF0aGlzLl9veHlnZW4pIHtcclxuICAgICAgICAgICAgdGhyb3cgRXJyb3IgKCdPeHlnZW4gaXMgbm90IGluaXRpYWxpemVkJyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuX294eWdlbi5jb250ZXh0ID0gY29udGV4dDtcclxuICAgICAgICB0aGlzLl9veHlnZW4ubG9hZFBhZ2VPYmplY3RGaWxlKHBvRmlsZSk7XHJcbiAgICAgICAgdGhpcy5fc3RlcHMgPSBbXTtcclxuICAgICAgICBpZiAodGhpcy5fY3dkICYmICFwYXRoLmlzQWJzb2x1dGUoc2NyaXB0UGF0aCkpIHtcclxuICAgICAgICAgICAgc2NyaXB0UGF0aCA9IHBhdGgucmVzb2x2ZSh0aGlzLl9jd2QsIHNjcmlwdFBhdGgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBsZXQgZXJyb3IgPSBudWxsO1xyXG5cclxuICAgICAgICAvLyBvbiBPU1ggY3dkIHdpbGwgYmUgYSBzeW1saW5rOiBcIi92YXIvZm9sZGVycy8uLlwiIGluc3RlYWQgb2YgXCIvcHJpdmF0ZS92YXIvZm9sZGVycy8uLlwiICh0aGlzIGNvdWxkIGFsc28gaGFwcGVuIG9uIG90aGVyIHBsYXRmb3JtcyB0b28pXHJcbiAgICAgICAgLy8gc28gd2UgbmVlZCB0byByZXNvbHZlIGl0IHRvIHJlYWwgcGF0aFxyXG4gICAgICAgIGxldCBjd2QgPSBmcy5yZWFscGF0aFN5bmModGhpcy5fY3dkKTtcclxuXHJcbiAgICAgICAgLy8gbG9hZCBhbmQgcnVuIHRoZSB0ZXN0IHNjcmlwdFxyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIHRoaXMuX294eWdlbiAmJiB0aGlzLl9veHlnZW4ub25CZWZvcmVDYXNlICYmIGF3YWl0IHRoaXMuX294eWdlbi5vbkJlZm9yZUNhc2UoY29udGV4dCk7XHJcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuX3J1bkZuSW5GaWJlckNvbnRleHQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgICAgICAvLyBtYWtlIHN1cmUgdG8gY2xlYXIgcmVxdWlyZSBjYWNoZSBzbyB0aGUgc2NyaXB0IHdpbGwgYmUgZXhlY3V0ZWQgb24gZWFjaCBpdGVyYXRpb25cclxuICAgICAgICAgICAgICAgICAgICByZXF1aXJlLmNhY2hlW3JlcXVpcmUucmVzb2x2ZShzY3JpcHRQYXRoKV0gJiYgZGVsZXRlIHJlcXVpcmUuY2FjaGVbcmVxdWlyZS5yZXNvbHZlKHNjcmlwdFBhdGgpXTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgLy8gaWYgdXNlciB1c2VzIHJlcXVpcmUoJy4vc29tZXNjcmlwdC5qcycpIGluIG11bHRpcGxlIHRlc3Qgc2NyaXB0cyAoY2FzZXMpLCBhbmQgc29tZXNjcmlwdC5qcyBjb250YWlucyB3ZWIvbW9iLmluaXRcclxuICAgICAgICAgICAgICAgICAgICAvLyB0aGVuLCB3aGVuIHRob3NlIHNjcmlwdHMgYXJlIGV4ZWN1dGVkIGluIGEgc3VpdGUsIG9ubHkgZmlyc3QgY2FzZSB3aWxsIHBhc3MsIHRoZSByZXN0IHdpbGwgZmFpbCB3aXRoIE1PRFVMRV9OT1RfSU5JVElBTElaRUQgZXJyb3IuXHJcbiAgICAgICAgICAgICAgICAgICAgLy8gdGhpcyBpcyBiZWNhdXNlICdyZXF1aXJlJyBpcyBjYWNoZWQsIGFuZCB3aGVuIHRoZSBmaXJzdCBjYXNlIGlzIGZpbmlzaGVkLCB0aGUgbW9kdWxlIGlzIG1hcmtlZCBhcyBpc0luaXRpYWxpemVkID0gZmFsc2VcclxuICAgICAgICAgICAgICAgICAgICAvLyBhbmQgbm90IHJlLWluaXRpYWxpemVkIGJhY2sgb24gbmV4dCBjYXNlLlxyXG4gICAgICAgICAgICAgICAgICAgIC8vIHRodXMgd2UgY2xlYW4gdXNlciBsZXZlbCBzY3JpcHRzIGZyb20gJ3JlcXVpcmUnIGNhY2hlLlxyXG4gICAgICAgICAgICAgICAgICAgIC8vIEZJWE1FOiB3ZWIuaW5pdCBhbmQgb3RoZXIgbW9kdWxlcyBzaG91bGQgYmUgcHJvYmFibHkgZml4ZWQgKHByb3Blcmx5IGRpc3Bvc2VkKVxyXG4gICAgICAgICAgICAgICAgICAgIC8vIE5PVEU6IHRoaXMgb2J2aW91c2x5IHJlbGF0ZXMgbm90IG9ubHkgdG8gd2ViLCBldGMgbW9kdWxlLiB0aGlzIGlzIGEgZ2VuZXJhbCBpc3N1ZS5cclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBNb2R1bGUgPSByZXF1aXJlKCdtb2R1bGUnKTtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBvcmlnaW5hbFJlcXVpcmUgPSBNb2R1bGUucHJvdG90eXBlLnJlcXVpcmU7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIE1vZHVsZS5wcm90b3R5cGUucmVxdWlyZSA9IGZ1bmN0aW9uKCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzY3JpcHQgPSBhcmd1bWVudHNbJzAnXTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGludmFsaWRhdGUgY2FjaGUgb25seSB3aGVuIHdlIHRyeSB0byBsb2FkIHVzZXItbGV2ZWwgc2NyaXB0cyAodGhvc2Ugc3RhcnRpbmcgd2l0aCAnLi8nIG9yICcuLi8nKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2NyaXB0ICYmIHNjcmlwdC5zdGFydHNXaXRoKCcuJykpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlbW92ZSBldmVyeXRoaW5nIHVzZXIgcmVsYXRlZCBmcm9tIHRoZSBjYWNoZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gcmVxdWlyZS5jYWNoZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChrZXkuc3RhcnRzV2l0aCAmJiBrZXkuc3RhcnRzV2l0aChjd2QpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgcmVxdWlyZS5jYWNoZVtrZXldO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChleGkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlnbm9yZWRcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9yaWdpbmFsUmVxdWlyZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xyXG4gICAgICAgICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgICAgICAgICAgcmVxdWlyZShzY3JpcHRQYXRoKTtcclxuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgICAgICAgICAvLyBlcnJvciA9IGUuY29kZSAmJiBlLmNvZGUgPT09ICdNT0RVTEVfTk9UX0ZPVU5EJyA/IG5ldyBTY3JpcHROb3RGb3VuZEVycm9yKHNjcmlwdFBhdGgpIDogZTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGUgJiYgZS50eXBlICYmIGUudHlwZSA9PT0gZXJyb3JIZWxwZXIuZXJyb3JDb2RlLkFTU0VSVF9QQVNTRUQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy9pZ25vcmVcclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBlcnJvciA9IGU7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgIGVycm9yID0gZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIEluIHNvbWUgY2FzZXMgc3RlcCByZXN1bHQgZ2VuZXJhdGlvbiB0YWtlcyBzb21lIHRpbWUgdG8gbWFrZSBzY3JlZW5zaG90XHJcbiAgICAgICAgYXdhaXQgdGhpcy5fb3h5Z2VuLl93YWl0U3RlcFJlc3VsdCgpO1xyXG5cclxuICAgICAgICBpZiAoZXJyb3IpIHtcclxuICAgICAgICAgICAgZXJyb3IgPSBlcnJvckhlbHBlci5nZXRGYWlsdXJlRnJvbUVycm9yKGVycm9yKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGxldCBtb2R1bGVDYXBzID0ge307XHJcblxyXG4gICAgICAgIGlmICh0aGlzLl9veHlnZW4gJiYgdGhpcy5fb3h5Z2VuLmdldE1vZHVsZXNDYXBhYmlsaXRpZXMpIHtcclxuICAgICAgICAgICAgbW9kdWxlQ2FwcyA9IHRoaXMuX294eWdlbi5nZXRNb2R1bGVzQ2FwYWJpbGl0aWVzKCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLl9veHlnZW4gJiYgdGhpcy5fb3h5Z2VuLm9uQWZ0ZXJDYXNlICYmIGF3YWl0IHRoaXMuX294eWdlbi5vbkFmdGVyQ2FzZShlcnJvcik7XHJcblxyXG4gICAgICAgIC8vIGNsb25lIHRoZSByZXN1bHRzLCBvdGhlcndpc2UgcmVzdWx0U3RvcmUgd2lsbCBiZSBlbXB0eSBhZnRlciB0aGUgZm9sbG93aW5nIHRoaXMuX294eWdlbi5yZXNldFJlc3VsdHMoKSBjYWxsXHJcblxyXG4gICAgICAgIGxldCByZXN1bHRTdG9yZSA9IHt9O1xyXG5cclxuICAgICAgICBpZiAodGhpcy5fb3h5Z2VuICYmIHRoaXMuX294eWdlbi5yZXN1bHRzKSB7XHJcbiAgICAgICAgICAgIHJlc3VsdFN0b3JlID0geyAuLi50aGlzLl9veHlnZW4ucmVzdWx0cyB9O1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHRoaXMuX294eWdlbiAmJiB0aGlzLl9veHlnZW4ucmVzZXRSZXN1bHRzKSB7XHJcbiAgICAgICAgICAgIC8vIHJlc2V0IHN0ZXBzIGFuZCBvdGhlciByZXN1bHQgZGF0YVxyXG4gICAgICAgICAgICB0aGlzLl9veHlnZW4ucmVzZXRSZXN1bHRzKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuX3N0ZXBzID0gbnVsbDtcclxuXHJcbiAgICAgICAgbGV0IG94Q29udGV4dCA9IHt9O1xyXG4gICAgICAgIGlmICh0aGlzLl9veHlnZW4gJiYgdGhpcy5fb3h5Z2VuLmNvbnRleHQpIHtcclxuICAgICAgICAgICAgb3hDb250ZXh0ID0gdGhpcy5fb3h5Z2VuLmNvbnRleHQ7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIG94Q29udGV4dC52YXJzID0gZ2xvYmFsLnZhcnM7XHJcblxyXG4gICAgICAgIHJldHVybiB7IGVycm9yLCBtb2R1bGVDYXBzLCByZXN1bHRTdG9yZSwgY29udGV4dDogb3hDb250ZXh0IH07XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgZGlzcG9zZShzdGF0dXMgPSBudWxsKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuX294eWdlbikge1xyXG4gICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5fb3h5Z2VuLmRpc3Bvc2Uoc3RhdHVzKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKCdGYWlsZWQgdG8gZGlzcG9zZSBPeHlnZW4nLCBudWxsLCBlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBmaW5hbGx5IHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX3N0ZXBzID0gbnVsbDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBkaXNwb3NlTW9kdWxlcyhzdGF0dXMgPSBudWxsKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuX294eWdlbikge1xyXG4gICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5fb3h5Z2VuLmRpc3Bvc2VNb2R1bGVzKHN0YXR1cyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcignRmFpbGVkIHRvIGRpc3Bvc2UgT3h5Z2VuIG1vZHVsZXMnLCBudWxsLCBlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBmaW5hbGx5IHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX294eWdlbi5yZXNldFJlc3VsdHMoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBjYWxsVGVzdEhvb2soaG9va05hbWUsIGhvb2tBcmdzKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLl90ZXN0SG9va3MgfHwgIXRoaXMuX3Rlc3RIb29rc1tob29rTmFtZV0gfHwgdHlwZW9mIHRoaXMuX3Rlc3RIb29rc1tob29rTmFtZV0gIT09ICdmdW5jdGlvbicpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBIb29rIGRvZXMgbm90IGV4aXN0OiAke2hvb2tOYW1lfWApO1xyXG4gICAgICAgIH1cclxuICAgICAgICBhd2FpdCBveHV0aWwuZXhlY3V0ZVRlc3RIb29rKHRoaXMuX3Rlc3RIb29rcywgaG9va05hbWUsIGhvb2tBcmdzKTtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBfcnVuRm5JbkZpYmVyQ29udGV4dCAoZm4pIHtcclxuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4gRmliZXIoKCkgPT4ge1xyXG4gICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gZm4uYXBwbHkodGhpcyk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzb2x2ZShyZXN1bHQpO1xyXG4gICAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiByZWplY3QoZXJyKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pLnJ1bigpKTtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyByZXBsU3RhcnQoKSB7XHJcbiAgICAgICAgbGV0IGNvbW1hbmRSZXNvbHZlID0gKCkgPT4geyB9O1xyXG5cclxuICAgICAgICBzZXRUaW1lb3V0KGFzeW5jKCkgPT4ge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5fb3h5Z2VuICYmIHRoaXMuX294eWdlbi5tb2R1bGVzKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXModGhpcy5fb3h5Z2VuLm1vZHVsZXMpO1xyXG4gICAgICAgICAgICAgICAgbGV0IGRlYnVnO1xyXG4gICAgICAgICAgICAgICAga2V5cy5tYXAoKGl0ZW0pID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBkcml2ZXIgPSB0aGlzLl9veHlnZW4ubW9kdWxlc1tpdGVtXVsnZ2V0RHJpdmVyJ10gJiYgdGhpcy5fb3h5Z2VuLm1vZHVsZXNbaXRlbV1bJ2dldERyaXZlciddKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGRyaXZlcikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBkZWJ1ZyA9IHRoaXMuX294eWdlbi5tb2R1bGVzW2l0ZW1dWydkZWJ1ZyddO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgICAgIGlmIChkZWJ1Zykge1xyXG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IGRlYnVnKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgY29tbWFuZFJlc29sdmUoKTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29tbWFuZFJlc29sdmUoKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGNvbW1hbmRSZXNvbHZlKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9LCAxMCk7XHJcblxyXG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4gKGNvbW1hbmRSZXNvbHZlID0gcmVzb2x2ZSkpO1xyXG4gICAgfVxyXG5cclxuICAgIF9oYW5kbGVCZWZvcmVDb21tYW5kKGUpIHtcclxuICAgICAgICBpZiAoIWUpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmVtaXQoJ2NvbW1hbmQ6YmVmb3JlJywgZSk7XHJcbiAgICB9XHJcblxyXG4gICAgX2hhbmRsZUFmdGVyQ29tbWFuZChlKSB7XHJcbiAgICAgICAgaWYgKCFlIHx8ICFlLnJlc3VsdCkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLl9zdGVwcyAmJiB0aGlzLl9zdGVwcy5wdXNoKGUucmVzdWx0KTtcclxuICAgICAgICB0aGlzLmVtaXQoJ2NvbW1hbmQ6YWZ0ZXInLCBlKTtcclxuICAgIH1cclxuXHJcbiAgICBfaGFuZGxlTG9nRW50cnkoZSkge1xyXG4gICAgICAgIGlmICghZSB8fCAhZS5sZXZlbCB8fCAhZS5tZXNzYWdlKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGUgJiYgZS5sZXZlbCAmJiBlLmxldmVsID09PSAnZXJyb3InKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2xvZ2dlcltlLmxldmVsXShlLm1lc3NhZ2UsIGUuc3JjLCBlLmVycik7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5fbG9nZ2VyW2UubGV2ZWxdKGUubWVzc2FnZSwgZS5zcmMpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxufVxyXG4iXX0=