oxygen-cli 1.25.0-beta.2 → 1.25.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 (265) hide show
  1. package/.husky/pre-commit +4 -0
  2. package/CHANGELOG.md +65 -0
  3. package/build/core/OxygenCore.js +36 -257
  4. package/build/core/OxygenEvents.js +1 -11
  5. package/build/core/OxygenModule.js +1 -14
  6. package/build/core/OxygenService.js +1 -12
  7. package/build/core/OxygenSubModule.js +1 -10
  8. package/build/core/WebDriverModule.js +1 -30
  9. package/build/core/utils.js +1 -17
  10. package/build/errors/HookError.js +1 -7
  11. package/build/errors/ModuleError.js +1 -7
  12. package/build/errors/ModuleUnavailableError.js +1 -3
  13. package/build/errors/OxygenError.js +1 -33
  14. package/build/errors/ScriptNotFound.js +1 -7
  15. package/build/errors/helper.js +46 -77
  16. package/build/index.js +6 -18
  17. package/build/lib/cli-util.js +28 -90
  18. package/build/lib/cli.js +1 -23
  19. package/build/lib/debugger.js +1 -144
  20. package/build/lib/img-merge.js +1 -15
  21. package/build/lib/launcher.js +1 -28
  22. package/build/lib/moduleRequire.js +1 -4
  23. package/build/lib/param-manager.js +1 -28
  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/util.js +3 -58
  28. package/build/model/case-result.js +1 -2
  29. package/build/model/failure.js +1 -2
  30. package/build/model/status.js +1 -2
  31. package/build/model/step-result.js +1 -2
  32. package/build/model/suite-result.js +1 -2
  33. package/build/model/test-result.js +1 -2
  34. package/build/model/testcase.js +1 -2
  35. package/build/model/testsuite.js +1 -2
  36. package/build/ox_modules/index.js +13 -33
  37. package/build/ox_modules/module-assert.js +8 -24
  38. package/build/ox_modules/module-date.js +3 -8
  39. package/build/ox_modules/module-db.js +7 -28
  40. package/build/ox_modules/module-email.js +10 -36
  41. package/build/ox_modules/module-eyes.js +5 -46
  42. package/build/ox_modules/module-http.js +42 -104
  43. package/build/ox_modules/module-log.js +5 -22
  44. package/build/ox_modules/module-mailinator.js +10 -32
  45. package/build/ox_modules/module-mob/commands/alertAccept.js +1 -2
  46. package/build/ox_modules/module-mob/commands/alertDismiss.js +1 -2
  47. package/build/ox_modules/module-mob/commands/assertAlert.js +1 -6
  48. package/build/ox_modules/module-mob/commands/assertText.js +1 -3
  49. package/build/ox_modules/module-mob/commands/assertTitle.js +1 -4
  50. package/build/ox_modules/module-mob/commands/assertValue.js +9 -15
  51. package/build/ox_modules/module-mob/commands/back.js +1 -2
  52. package/build/ox_modules/module-mob/commands/clear.js +1 -4
  53. package/build/ox_modules/module-mob/commands/click.js +3 -4
  54. package/build/ox_modules/module-mob/commands/clickHidden.js +3 -9
  55. package/build/ox_modules/module-mob/commands/clickLong.js +1 -2
  56. package/build/ox_modules/module-mob/commands/clickMultipleTimes.js +1 -4
  57. package/build/ox_modules/module-mob/commands/closeApp.js +1 -2
  58. package/build/ox_modules/module-mob/commands/debug.js +2 -2
  59. package/build/ox_modules/module-mob/commands/dragAndDrop.js +1 -2
  60. package/build/ox_modules/module-mob/commands/enableNetwork.js +4 -12
  61. package/build/ox_modules/module-mob/commands/execute.js +1 -2
  62. package/build/ox_modules/module-mob/commands/findElement.js +1 -3
  63. package/build/ox_modules/module-mob/commands/findElements.js +1 -4
  64. package/build/ox_modules/module-mob/commands/getAlertText.js +1 -2
  65. package/build/ox_modules/module-mob/commands/getAppiumLogs.js +1 -2
  66. package/build/ox_modules/module-mob/commands/getBrowserLogs.js +1 -10
  67. package/build/ox_modules/module-mob/commands/getCurrentActivity.js +1 -2
  68. package/build/ox_modules/module-mob/commands/getCurrentPackage.js +1 -2
  69. package/build/ox_modules/module-mob/commands/getDeviceLogs.js +1 -9
  70. package/build/ox_modules/module-mob/commands/getDeviceTime.js +1 -2
  71. package/build/ox_modules/module-mob/commands/getLocation.js +1 -2
  72. package/build/ox_modules/module-mob/commands/getSource.js +1 -2
  73. package/build/ox_modules/module-mob/commands/getText.js +1 -4
  74. package/build/ox_modules/module-mob/commands/getTitle.js +1 -2
  75. package/build/ox_modules/module-mob/commands/getUrl.js +1 -2
  76. package/build/ox_modules/module-mob/commands/getValue.js +5 -9
  77. package/build/ox_modules/module-mob/commands/getWindowHandles.js +1 -2
  78. package/build/ox_modules/module-mob/commands/hideKeyboard.js +1 -2
  79. package/build/ox_modules/module-mob/commands/index.js +19 -94
  80. package/build/ox_modules/module-mob/commands/installApp.js +1 -2
  81. package/build/ox_modules/module-mob/commands/isAppInstalled.js +1 -2
  82. package/build/ox_modules/module-mob/commands/isCheckable.js +1 -2
  83. package/build/ox_modules/module-mob/commands/isChecked.js +1 -2
  84. package/build/ox_modules/module-mob/commands/isClickable.js +1 -2
  85. package/build/ox_modules/module-mob/commands/isExist.js +1 -3
  86. package/build/ox_modules/module-mob/commands/isSelected.js +1 -2
  87. package/build/ox_modules/module-mob/commands/isVisible.js +1 -3
  88. package/build/ox_modules/module-mob/commands/isWebViewContext.js +1 -2
  89. package/build/ox_modules/module-mob/commands/launchApp.js +1 -2
  90. package/build/ox_modules/module-mob/commands/longPressKeyCode.js +1 -2
  91. package/build/ox_modules/module-mob/commands/open.js +1 -3
  92. package/build/ox_modules/module-mob/commands/pause.js +1 -2
  93. package/build/ox_modules/module-mob/commands/removeApp.js +1 -2
  94. package/build/ox_modules/module-mob/commands/resetApp.js +1 -2
  95. package/build/ox_modules/module-mob/commands/scrollIntoElement.js +1 -6
  96. package/build/ox_modules/module-mob/commands/scrollIntoView.js +1 -2
  97. package/build/ox_modules/module-mob/commands/select.js +1 -4
  98. package/build/ox_modules/module-mob/commands/selectFrame.js +1 -4
  99. package/build/ox_modules/module-mob/commands/selectWindow.js +5 -26
  100. package/build/ox_modules/module-mob/commands/sendKeys.js +6 -9
  101. package/build/ox_modules/module-mob/commands/setContext.js +1 -2
  102. package/build/ox_modules/module-mob/commands/setNativeContext.js +1 -2
  103. package/build/ox_modules/module-mob/commands/setTimeout.js +1 -2
  104. package/build/ox_modules/module-mob/commands/setWebViewContext.js +3 -6
  105. package/build/ox_modules/module-mob/commands/shake.js +1 -2
  106. package/build/ox_modules/module-mob/commands/smsClickLink.js +1 -2
  107. package/build/ox_modules/module-mob/commands/smsGetText.js +3 -6
  108. package/build/ox_modules/module-mob/commands/swipe.js +1 -2
  109. package/build/ox_modules/module-mob/commands/swipeElement.js +1 -2
  110. package/build/ox_modules/module-mob/commands/swipeScreen.js +1 -2
  111. package/build/ox_modules/module-mob/commands/takeScreenshot.js +1 -2
  112. package/build/ox_modules/module-mob/commands/tap.js +1 -2
  113. package/build/ox_modules/module-mob/commands/type.js +3 -7
  114. package/build/ox_modules/module-mob/commands/unlockPattern.js +9 -10
  115. package/build/ox_modules/module-mob/commands/waitForExist.js +1 -2
  116. package/build/ox_modules/module-mob/commands/waitForInteractable.js +1 -3
  117. package/build/ox_modules/module-mob/commands/waitForVisible.js +1 -2
  118. package/build/ox_modules/module-mob.js +72 -142
  119. package/build/ox_modules/module-pdf.js +23 -62
  120. package/build/ox_modules/module-proxy.js +8 -68
  121. package/build/ox_modules/module-serial.js +7 -32
  122. package/build/ox_modules/module-shell.js +8 -27
  123. package/build/ox_modules/module-soap.js +14 -47
  124. package/build/ox_modules/module-twilio.js +10 -53
  125. package/build/ox_modules/module-utils.js +16 -51
  126. package/build/ox_modules/module-web/commands/alertAccept.js +1 -2
  127. package/build/ox_modules/module-web/commands/alertDismiss.js +1 -2
  128. package/build/ox_modules/module-web/commands/assertAlert.js +1 -6
  129. package/build/ox_modules/module-web/commands/assertExist.js +1 -2
  130. package/build/ox_modules/module-web/commands/assertSelectedLabel.js +1 -4
  131. package/build/ox_modules/module-web/commands/assertSelectedValue.js +1 -3
  132. package/build/ox_modules/module-web/commands/assertText.js +1 -3
  133. package/build/ox_modules/module-web/commands/assertTextNotPresent.js +1 -6
  134. package/build/ox_modules/module-web/commands/assertTextPresent.js +1 -6
  135. package/build/ox_modules/module-web/commands/assertTitle.js +1 -3
  136. package/build/ox_modules/module-web/commands/assertValue.js +1 -3
  137. package/build/ox_modules/module-web/commands/back.js +1 -2
  138. package/build/ox_modules/module-web/commands/clear.js +1 -5
  139. package/build/ox_modules/module-web/commands/click.js +4 -13
  140. package/build/ox_modules/module-web/commands/clickHidden.js +2 -7
  141. package/build/ox_modules/module-web/commands/closeWindow.js +1 -2
  142. package/build/ox_modules/module-web/commands/debug.js +2 -2
  143. package/build/ox_modules/module-web/commands/deleteCookies.js +1 -2
  144. package/build/ox_modules/module-web/commands/deselect.js +1 -2
  145. package/build/ox_modules/module-web/commands/doubleClick.js +3 -9
  146. package/build/ox_modules/module-web/commands/dragAndDrop.js +1 -2
  147. package/build/ox_modules/module-web/commands/execute.js +1 -2
  148. package/build/ox_modules/module-web/commands/fileBrowse.js +4 -10
  149. package/build/ox_modules/module-web/commands/findElement.js +1 -3
  150. package/build/ox_modules/module-web/commands/findElements.js +1 -4
  151. package/build/ox_modules/module-web/commands/fullscreenWindow.js +1 -2
  152. package/build/ox_modules/module-web/commands/getAlertText.js +1 -2
  153. package/build/ox_modules/module-web/commands/getAttribute.js +1 -4
  154. package/build/ox_modules/module-web/commands/getBrowserLogs.js +1 -3
  155. package/build/ox_modules/module-web/commands/getCookies.js +1 -2
  156. package/build/ox_modules/module-web/commands/getCssValue.js +1 -4
  157. package/build/ox_modules/module-web/commands/getElementCount.js +1 -2
  158. package/build/ox_modules/module-web/commands/getHTML.js +1 -2
  159. package/build/ox_modules/module-web/commands/getSource.js +1 -2
  160. package/build/ox_modules/module-web/commands/getText.js +1 -4
  161. package/build/ox_modules/module-web/commands/getTitle.js +1 -2
  162. package/build/ox_modules/module-web/commands/getUrl.js +1 -2
  163. package/build/ox_modules/module-web/commands/getValue.js +1 -5
  164. package/build/ox_modules/module-web/commands/getWindowHandles.js +1 -2
  165. package/build/ox_modules/module-web/commands/getWindowSize.js +1 -2
  166. package/build/ox_modules/module-web/commands/getXMLPageSource.js +1 -5
  167. package/build/ox_modules/module-web/commands/index.js +26 -99
  168. package/build/ox_modules/module-web/commands/isAlertPresent.js +1 -2
  169. package/build/ox_modules/module-web/commands/isChecked.js +1 -2
  170. package/build/ox_modules/module-web/commands/isExist.js +1 -3
  171. package/build/ox_modules/module-web/commands/isInteractable.js +33 -0
  172. package/build/ox_modules/module-web/commands/isSelected.js +1 -2
  173. package/build/ox_modules/module-web/commands/isVisible.js +1 -3
  174. package/build/ox_modules/module-web/commands/makeVisible.js +2 -10
  175. package/build/ox_modules/module-web/commands/maximizeWindow.js +1 -2
  176. package/build/ox_modules/module-web/commands/minimizeWindow.js +1 -2
  177. package/build/ox_modules/module-web/commands/newWindow.js +1 -2
  178. package/build/ox_modules/module-web/commands/open.js +1 -4
  179. package/build/ox_modules/module-web/commands/pause.js +1 -2
  180. package/build/ox_modules/module-web/commands/point.js +1 -2
  181. package/build/ox_modules/module-web/commands/pointJS.js +2 -8
  182. package/build/ox_modules/module-web/commands/refresh.js +1 -2
  183. package/build/ox_modules/module-web/commands/rightClick.js +3 -8
  184. package/build/ox_modules/module-web/commands/rightClickActions.js +1 -2
  185. package/build/ox_modules/module-web/commands/scrollToElement.js +1 -2
  186. package/build/ox_modules/module-web/commands/select.js +1 -5
  187. package/build/ox_modules/module-web/commands/selectFrame.js +1 -3
  188. package/build/ox_modules/module-web/commands/selectWindow.js +5 -26
  189. package/build/ox_modules/module-web/commands/sendKeys.js +3 -6
  190. package/build/ox_modules/module-web/commands/setAutoWaitForAngular.js +2 -2
  191. package/build/ox_modules/module-web/commands/setTimeout.js +1 -2
  192. package/build/ox_modules/module-web/commands/setWindowSize.js +1 -2
  193. package/build/ox_modules/module-web/commands/takeScreenshot.js +3 -5
  194. package/build/ox_modules/module-web/commands/type.js +1 -5
  195. package/build/ox_modules/module-web/commands/waitForAngular.js +6 -11
  196. package/build/ox_modules/module-web/commands/waitForExist.js +1 -2
  197. package/build/ox_modules/module-web/commands/waitForInteractable.js +1 -2
  198. package/build/ox_modules/module-web/commands/waitForNotExist.js +1 -8
  199. package/build/ox_modules/module-web/commands/waitForNotText.js +3 -5
  200. package/build/ox_modules/module-web/commands/waitForNotValue.js +3 -5
  201. package/build/ox_modules/module-web/commands/waitForText.js +3 -5
  202. package/build/ox_modules/module-web/commands/waitForValue.js +3 -5
  203. package/build/ox_modules/module-web/commands/waitForVisible.js +1 -2
  204. package/build/ox_modules/module-web/commands/waitForWindow.js +4 -21
  205. package/build/ox_modules/module-web.js +86 -192
  206. package/build/ox_modules/module-win/commands/assertText.js +1 -3
  207. package/build/ox_modules/module-win/commands/assertTitle.js +1 -4
  208. package/build/ox_modules/module-win/commands/assertValue.js +9 -15
  209. package/build/ox_modules/module-win/commands/back.js +1 -2
  210. package/build/ox_modules/module-win/commands/clear.js +1 -4
  211. package/build/ox_modules/module-win/commands/click.js +1 -2
  212. package/build/ox_modules/module-win/commands/clickLong.js +1 -2
  213. package/build/ox_modules/module-win/commands/clickMultipleTimes.js +1 -4
  214. package/build/ox_modules/module-win/commands/findElement.js +1 -3
  215. package/build/ox_modules/module-win/commands/findElements.js +1 -4
  216. package/build/ox_modules/module-win/commands/getAppiumLogs.js +1 -2
  217. package/build/ox_modules/module-win/commands/getCurrentWindowHandle.js +1 -2
  218. package/build/ox_modules/module-win/commands/getLocation.js +1 -2
  219. package/build/ox_modules/module-win/commands/getSource.js +1 -2
  220. package/build/ox_modules/module-win/commands/getText.js +1 -4
  221. package/build/ox_modules/module-win/commands/getValue.js +5 -9
  222. package/build/ox_modules/module-win/commands/getWindowHandles.js +1 -2
  223. package/build/ox_modules/module-win/commands/index.js +5 -43
  224. package/build/ox_modules/module-win/commands/isCheckable.js +1 -2
  225. package/build/ox_modules/module-win/commands/isChecked.js +1 -2
  226. package/build/ox_modules/module-win/commands/isClickable.js +1 -2
  227. package/build/ox_modules/module-win/commands/isExist.js +1 -3
  228. package/build/ox_modules/module-win/commands/isSelected.js +1 -2
  229. package/build/ox_modules/module-win/commands/isVisible.js +1 -3
  230. package/build/ox_modules/module-win/commands/open.js +1 -2
  231. package/build/ox_modules/module-win/commands/pause.js +1 -2
  232. package/build/ox_modules/module-win/commands/rightClick.js +1 -2
  233. package/build/ox_modules/module-win/commands/selectWindow.js +1 -15
  234. package/build/ox_modules/module-win/commands/sendKeys.js +1 -4
  235. package/build/ox_modules/module-win/commands/setTimeout.js +1 -2
  236. package/build/ox_modules/module-win/commands/takeScreenshot.js +1 -2
  237. package/build/ox_modules/module-win/commands/tap.js +1 -2
  238. package/build/ox_modules/module-win/commands/type.js +1 -4
  239. package/build/ox_modules/module-win/commands/waitForExist.js +1 -2
  240. package/build/ox_modules/module-win/commands/waitForInteractable.js +1 -4
  241. package/build/ox_modules/module-win/commands/waitForVisible.js +1 -2
  242. package/build/ox_modules/module-win.js +48 -87
  243. package/build/ox_modules/utils.js +22 -76
  244. package/build/ox_reporters/reporter-excel.js +1 -58
  245. package/build/ox_reporters/reporter-html.js +1 -28
  246. package/build/ox_reporters/reporter-json.js +1 -14
  247. package/build/ox_reporters/reporter-junit.js +1 -24
  248. package/build/ox_reporters/reporter-pdf.js +1 -19
  249. package/build/ox_reporters/reporter-xml.js +1 -17
  250. package/build/ox_services/service-devtools/submodule-network.js +3 -84
  251. package/build/ox_services/service-devtools.js +1 -23
  252. package/build/reporter/FileReporterBase.js +5 -44
  253. package/build/reporter/ReportAggregator.js +1 -65
  254. package/build/reporter/ReporterBase.js +1 -6
  255. package/build/runners/WorkerProcess.js +1 -99
  256. package/build/runners/cucumber/CucumberEventListener.js +4 -29
  257. package/build/runners/cucumber/CucumberReporter.js +1 -56
  258. package/build/runners/cucumber/CucumberWorker.js +1 -66
  259. package/build/runners/cucumber/index.js +1 -30
  260. package/build/runners/cucumber/worker.js +1 -18
  261. package/build/runners/index.js +1 -6
  262. package/build/runners/oxygen/OxygenWorker.js +20 -54
  263. package/build/runners/oxygen/index.js +17 -177
  264. package/build/runners/oxygen/worker.js +2 -25
  265. package/package.json +28 -29
@@ -4,39 +4,28 @@ 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 _logger = _interopRequireDefault(require("../lib/logger"));
11
-
12
9
  var _url = _interopRequireDefault(require("url"));
13
-
14
10
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
15
-
16
11
  const log = (0, _logger.default)('Debugger');
17
-
18
12
  const {
19
13
  EventEmitter
20
14
  } = require('events');
21
-
22
15
  const CDP = require('@oxygenhq/chrome-remote-interface');
23
-
24
16
  const CONNECT_RETRIES = 4;
25
17
  const CONNECT_SNOOZE_INTERVAL_MULT = 2;
26
18
  const MAX_DEPTH = 5;
27
19
  const IGNORE_SCOPE_CHAIN_VARIABLES = ['exports', 'require', 'module', '__filename', '__dirname'];
28
20
  let maxFindedDepth = 0;
29
-
30
21
  const transformToIDEStyle = fileName => {
31
22
  try {
32
23
  const uriIndex = fileName.indexOf('file:');
33
24
  const bpData = fileName.substring(0, uriIndex);
34
25
  let uri = fileName.substring(uriIndex);
35
-
36
26
  if (process.platform === 'win32' && uri.startsWith('file:///')) {
37
27
  uri = 'file://' + uri.substring('file:///'.length);
38
28
  }
39
-
40
29
  return bpData + _url.default.fileURLToPath(uri);
41
30
  } catch (e) {
42
31
  console.log('transformToIDEStyle fileName', fileName);
@@ -44,18 +33,14 @@ const transformToIDEStyle = fileName => {
44
33
  throw e;
45
34
  }
46
35
  };
47
-
48
36
  const snooze = ms => new Promise(resolve => setTimeout(resolve, ms));
49
-
50
37
  const deleteValues = (arr, depth) => {
51
38
  if (depth > maxFindedDepth) {
52
39
  maxFindedDepth = depth;
53
40
  }
54
-
55
41
  if (depth > MAX_DEPTH) {
56
42
  return [];
57
43
  }
58
-
59
44
  let result = arr.map(item => {
60
45
  if (item && item.value && item.value.className && item.value.className === 'Function') {
61
46
  const cloneValue = Object.assign(item.value);
@@ -71,12 +56,10 @@ const deleteValues = (arr, depth) => {
71
56
  });
72
57
  return result;
73
58
  };
74
-
75
59
  function extractBreakpointData(bpStr) {
76
60
  if (!bpStr || typeof bpStr !== 'string') {
77
61
  return null;
78
62
  }
79
-
80
63
  try {
81
64
  bpStr = transformToIDEStyle(bpStr);
82
65
  const parts = bpStr.split(':');
@@ -92,17 +75,14 @@ function extractBreakpointData(bpStr) {
92
75
  return null;
93
76
  }
94
77
  }
95
-
96
78
  function validateBreakpoint(breakpoint) {
97
79
  const brObj = extractBreakpointData(breakpoint.breakpointId);
98
80
  const brLineNumber = brObj.lineNumber + 1;
99
-
100
81
  if (breakpoint && breakpoint.locations && Array.isArray(breakpoint.locations) && breakpoint.locations.length > 0) {
101
82
  let result = null;
102
83
  breakpoint.locations.map(item => {
103
84
  const brFileName = brObj.fileName;
104
85
  const itemLineNumber = item.lineNumber + 1;
105
-
106
86
  if (brLineNumber !== itemLineNumber) {
107
87
  result = {
108
88
  msg: `Breakpoints warning : ${brFileName} Don't have opportunity to have breakpoint at line : `,
@@ -116,7 +96,6 @@ function validateBreakpoint(breakpoint) {
116
96
  return null;
117
97
  }
118
98
  }
119
-
120
99
  class Debugger extends EventEmitter {
121
100
  constructor(pid) {
122
101
  super();
@@ -130,60 +109,47 @@ class Debugger extends EventEmitter {
130
109
  this._fileNameAliases = [];
131
110
  this._breakpointErrors = [];
132
111
  }
133
-
134
112
  async reset() {
135
113
  if (this._client) {
136
114
  await this._client.close();
137
115
  this._client = null;
138
116
  this._paused = false;
139
117
  }
140
-
141
118
  this._breakpoints = [];
142
119
  this._fileNameAliases = [];
143
120
  }
144
-
145
121
  async getPropertiesByObjectId(objectId, depth, elm) {
146
122
  let data = {};
147
-
148
123
  try {
149
124
  data = await this._Runtime.getProperties({
150
125
  objectId: objectId
151
126
  });
152
127
  } catch (e) {}
153
-
154
128
  let clone = Object.assign({}, data);
155
-
156
129
  if (clone && clone && clone.result) {
157
130
  clone = Object.assign({}, clone, {
158
131
  result: deleteValues(clone.result, depth)
159
132
  });
160
133
  }
161
-
162
134
  return clone;
163
135
  }
164
-
165
136
  async getPromiceAllResult(mapResultFiltered) {
166
137
  let promiseAllPromise = await Promise.all(mapResultFiltered).then(value => {
167
138
  return value;
168
139
  });
169
-
170
140
  if (promiseAllPromise && Array.isArray(promiseAllPromise) && promiseAllPromise.length > 0) {
171
141
  promiseAllPromise = promiseAllPromise.filter(item => !!item);
172
142
  }
173
-
174
143
  return promiseAllPromise;
175
144
  }
176
-
177
145
  async getProperties(objectId, depth, elm) {
178
146
  const promises = [];
179
147
  const getPropertiesResult = await this.getPropertiesByObjectId(objectId, depth, elm);
180
-
181
148
  if (getPropertiesResult) {
182
149
  if (getPropertiesResult && getPropertiesResult.result && Array.isArray(getPropertiesResult.result)) {
183
150
  const mapResult = getPropertiesResult.result.map(async item => {
184
151
  if (item && item.value && item.value.objectId) {
185
152
  const getPropertiesInnerResult = await this.getProperties(item.value.objectId, depth + 1, item);
186
-
187
153
  if (item.scopeItem) {
188
154
  return null;
189
155
  } else {
@@ -199,10 +165,8 @@ class Debugger extends EventEmitter {
199
165
  objectId: objectId
200
166
  })
201
167
  };
202
-
203
168
  if (mapResultFiltered && Array.isArray(mapResultFiltered) && mapResultFiltered.length > 0) {
204
169
  const promiseAllPromise = await this.getPromiceAllResult(mapResultFiltered);
205
-
206
170
  if (promiseAllPromise && Array.isArray(promiseAllPromise) && promiseAllPromise.length > 0) {
207
171
  result.child = promiseAllPromise;
208
172
  return result;
@@ -222,7 +186,6 @@ class Debugger extends EventEmitter {
222
186
  };
223
187
  }
224
188
  }
225
-
226
189
  if (promises.length > 0) {
227
190
  return Promise.all(promises).then(values => {
228
191
  return values;
@@ -231,7 +194,6 @@ class Debugger extends EventEmitter {
231
194
  return false;
232
195
  }
233
196
  }
234
-
235
197
  async processScope(scopeChain, depth) {
236
198
  let scopeChainResult = await scopeChain.map(async chain => {
237
199
  if (chain && chain.object && chain.object.objectId) {
@@ -254,7 +216,6 @@ class Debugger extends EventEmitter {
254
216
  }
255
217
  });
256
218
  }
257
-
258
219
  async processCallFrames(callFrames, depth) {
259
220
  let callFramesMapResult = await callFrames.map(async callFrame => {
260
221
  if (callFrame && callFrame.scopeChain && Array.isArray(callFrame.scopeChain)) {
@@ -269,10 +230,8 @@ class Debugger extends EventEmitter {
269
230
  return values;
270
231
  });
271
232
  }
272
-
273
233
  inBreakpoints(itemUrl) {
274
234
  let result = false;
275
-
276
235
  if (this._breakpoints && Array.isArray(this._breakpoints) && this._breakpoints.length > 0) {
277
236
  this._breakpoints.map(bp => {
278
237
  if (itemUrl && itemUrl.toLowerCase && bp.origin && bp.origin.scriptPath && bp.origin.scriptPath.toLowerCase && itemUrl.toLowerCase() === bp.origin.scriptPath.toLowerCase()) {
@@ -280,13 +239,10 @@ class Debugger extends EventEmitter {
280
239
  }
281
240
  });
282
241
  }
283
-
284
242
  return result;
285
243
  }
286
-
287
244
  inFileNameAliases(fileName) {
288
245
  let result = false;
289
-
290
246
  if (this._fileNameAliases && Array.isArray(this._fileNameAliases) && this._fileNameAliases.length > 0) {
291
247
  this._fileNameAliases.map(alias => {
292
248
  if (alias && alias.toLowerCase && fileName && fileName.toLowerCase && alias.toLowerCase() === fileName.toLowerCase()) {
@@ -294,30 +250,23 @@ class Debugger extends EventEmitter {
294
250
  }
295
251
  });
296
252
  }
297
-
298
253
  return result;
299
254
  }
300
-
301
255
  async continueConnect() {
302
256
  this._client.on('Debugger.scriptParsed', async m => {
303
257
  if (m && m.url) {
304
258
  if (m.url.toLowerCase) {
305
259
  const filelc = m.url.toLowerCase();
306
260
  let breakpointForChange;
307
-
308
261
  const findResult = this._breakpoints.find(item => {
309
262
  if (item.origin && item.origin.scriptPath && item.origin.scriptPath.toLowerCase) {
310
263
  const breakpointlc = item.origin.scriptPath.toLowerCase();
311
-
312
264
  if (breakpointlc === filelc && item.origin.scriptPath !== m.url) {
313
265
  if (this._fileNameAliases.includes(m.url)) {} else {
314
266
  this._fileNameAliases.push(m.url);
315
267
  }
316
-
317
268
  this._paused = true;
318
-
319
269
  this._Debugger.pause();
320
-
321
270
  breakpointForChange = {
322
271
  breakpoint: item,
323
272
  mUrl: m.url
@@ -330,10 +279,8 @@ class Debugger extends EventEmitter {
330
279
  return false;
331
280
  }
332
281
  });
333
-
334
282
  if (findResult) {
335
283
  const breakpointsFromOldLocation = [];
336
-
337
284
  this._breakpoints.map(bp => {
338
285
  if (bp && bp.origin && bp.origin.scriptPath && breakpointForChange && breakpointForChange.mUrl && breakpointForChange.breakpoint && breakpointForChange.breakpoint.origin && breakpointForChange.breakpoint.origin.scriptPath && bp.origin.scriptPath === breakpointForChange.breakpoint.origin.scriptPath) {
339
286
  breakpointsFromOldLocation.push({
@@ -342,7 +289,6 @@ class Debugger extends EventEmitter {
342
289
  });
343
290
  }
344
291
  });
345
-
346
292
  if (breakpointsFromOldLocation && Array.isArray(breakpointsFromOldLocation) && breakpointsFromOldLocation.length > 0) {
347
293
  let breakpointsFromOldLocationResult = breakpointsFromOldLocation.map(async bp => {
348
294
  return await this.setBreakpoint(bp.scriptPath, bp.lineNumber);
@@ -358,16 +304,13 @@ class Debugger extends EventEmitter {
358
304
  }
359
305
  }
360
306
  });
361
-
362
307
  this._client.on('Debugger.paused', e => {
363
308
  this._paused = true;
364
-
365
309
  if (e.reason === 'Break on start') {
366
310
  this._brokeOnStart = true;
367
311
  } else {
368
312
  const possibleBreakpointsData = [];
369
313
  let eCallFrames = [];
370
-
371
314
  if (e && e.callFrames && Array.isArray(e.callFrames) && e.callFrames.length > 0) {
372
315
  e.callFrames.map(item => {
373
316
  if (item && item.url && this.inBreakpoints(item.url)) {
@@ -375,25 +318,20 @@ class Debugger extends EventEmitter {
375
318
  }
376
319
  });
377
320
  }
378
-
379
321
  let breakpointsMapResult = this._breakpoints.map(async bp => {
380
322
  if (bp && bp.locations && eCallFrames && eCallFrames[0] && bp.locations.length > 0 && bp.locations[0].scriptId === eCallFrames[0].location.scriptId && bp.locations[0].lineNumber === eCallFrames[0].location.lineNumber) {
381
323
  const initialDepth = 1;
382
-
383
324
  if (e && e.callFrames && Array.isArray(e.callFrames) && e.callFrames.length > 0) {
384
325
  const uniqueScriptIdArr = [];
385
326
  const callFrames = e.callFrames.filter(item => {
386
327
  if (item && item.url) {
387
328
  const finded = this._breakpoints.find(breakpoint => {
388
329
  let result = false;
389
-
390
330
  if (breakpoint.breakpointId.endsWith(item.url)) {
391
331
  result = true;
392
332
  }
393
-
394
333
  return result;
395
334
  });
396
-
397
335
  if (finded) {
398
336
  if (item.location && item.location.scriptId) {
399
337
  if (uniqueScriptIdArr.includes(item.location.scriptId)) {
@@ -412,18 +350,15 @@ class Debugger extends EventEmitter {
412
350
  return false;
413
351
  }
414
352
  });
415
-
416
353
  try {
417
354
  callFrames.map(async item => {
418
355
  let possibleBreakpoints = await this.getPossibleBreakpoints(item.location);
419
356
  const scriptSource = await this.getScriptSource(item.location.scriptId);
420
357
  const scriptSourceSplit = scriptSource.scriptSource.split('\n');
421
358
  let fileLineNumbersLength = 0;
422
-
423
359
  if (scriptSourceSplit && Array.isArray(scriptSourceSplit) && scriptSourceSplit.length > 0) {
424
360
  fileLineNumbersLength = scriptSourceSplit.length;
425
361
  }
426
-
427
362
  possibleBreakpointsData.push({
428
363
  breakpoints: possibleBreakpoints,
429
364
  file: item.url,
@@ -433,7 +368,6 @@ class Debugger extends EventEmitter {
433
368
  } catch (e) {
434
369
  console.log('getScriptSource e', e);
435
370
  }
436
-
437
371
  let callFramesMapResult = await this.processCallFrames(callFrames, initialDepth);
438
372
  callFramesMapResult = callFramesMapResult.filter(el => !!el);
439
373
  return callFramesMapResult;
@@ -444,13 +378,11 @@ class Debugger extends EventEmitter {
444
378
  return null;
445
379
  }
446
380
  });
447
-
448
381
  breakpointsMapResult = breakpointsMapResult.filter(el => !!el);
449
382
  Promise.all(breakpointsMapResult).then(async scopeChainTree => {
450
383
  if (scopeChainTree && Array.isArray(scopeChainTree) && scopeChainTree.length > 0) {
451
384
  scopeChainTree = scopeChainTree.filter(el => !!el);
452
385
  let breakpointData = null;
453
-
454
386
  if (eCallFrames && eCallFrames.length > 0) {
455
387
  breakpointData = {
456
388
  lineNumber: eCallFrames[0].location.lineNumber,
@@ -460,7 +392,6 @@ class Debugger extends EventEmitter {
460
392
  await this.addVariablesFromScopeChainTree(breakpointData.variables, scopeChainTree);
461
393
  await this.addOxygenVariablesFromGlobalScope(breakpointData.variables);
462
394
  }
463
-
464
395
  if (this._breakpointErrors && Array.isArray(this._breakpointErrors) && this._breakpointErrors.length > 0) {
465
396
  const isset = this._breakpoints.find(item => {
466
397
  if (item && item.origin && item.origin.lineNumber && parseInt(item.origin.lineNumber) + 1 === parseInt(breakpointData.lineNumber)) {
@@ -473,70 +404,55 @@ class Debugger extends EventEmitter {
473
404
  return false;
474
405
  }
475
406
  });
476
-
477
407
  if (isset) {
478
408
  let realBrfinded = false;
479
-
480
409
  this._breakpointErrors.map(breakpointError => {
481
410
  if (this._breakpoints && Array.isArray(this._breakpoints) && this._breakpoints.length > 0) {
482
411
  this._breakpoints.map(br => {
483
412
  const brFileName = transformToIDEStyle(br.origin.scriptPath);
484
413
  let possibleBreakpointData;
485
-
486
414
  if (possibleBreakpointsData && Array.isArray(possibleBreakpointsData) && possibleBreakpointsData.length > 0) {
487
415
  possibleBreakpointData = possibleBreakpointsData.find(item => item.file === eCallFrames[0].url);
488
416
  }
489
-
490
417
  if (brFileName === breakpointData.fileName && possibleBreakpointData && typeof possibleBreakpointData.fileLineNumbersLength !== 'undefined' && (breakpointData.lineNumber + 1 === br.origin.lineNumber || br.origin.lineNumber + 1 === possibleBreakpointData.fileLineNumbersLength)) {
491
418
  realBrfinded = true;
492
419
  }
493
420
  });
494
421
  }
495
422
  });
496
-
497
423
  if (!realBrfinded) {
498
424
  breakpointData.resolved = true;
499
425
  }
500
426
  }
501
427
  }
502
-
503
428
  let possibleBreakpointData;
504
-
505
429
  if (possibleBreakpointsData && Array.isArray(possibleBreakpointsData) && possibleBreakpointsData.length > 0) {
506
430
  possibleBreakpointData = possibleBreakpointsData.find(item => item.file === eCallFrames[0].url);
507
431
  }
508
-
509
432
  if (possibleBreakpointData && typeof possibleBreakpointData.fileLineNumbersLength !== 'undefined' && breakpointData.lineNumber + 1 >= possibleBreakpointData.fileLineNumbersLength) {
510
433
  breakpointData.lineNumber = possibleBreakpointData.fileLineNumbersLength - 2;
511
434
  }
512
-
513
435
  this.emit('break', breakpointData);
514
-
515
436
  if (this._breakpointErrors && Array.isArray(this._breakpointErrors) && this._breakpointErrors.length > 0) {
516
437
  this._breakpointErrors.map(breakpointError => {
517
438
  if (breakpointError && breakpointError.msg && breakpointError.fileName && breakpointError.line) {
518
439
  let msg;
519
440
  let ignore = false;
520
-
521
441
  if (possibleBreakpointsData && Array.isArray(possibleBreakpointsData) && possibleBreakpointsData.length > 0) {
522
442
  possibleBreakpointsData.map(item => {
523
443
  item.file = transformToIDEStyle(item.file);
524
-
525
444
  if (item && item.file === breakpointError.fileName && possibleBreakpointData && typeof item.fileLineNumbersLength !== 'undefined') {
526
445
  let line;
527
-
528
446
  if (breakpointError.line >= item.fileLineNumbersLength) {
529
447
  line = breakpointError.line - 2;
530
448
  } else {
531
449
  line = breakpointError.line;
532
450
  }
533
-
534
451
  if (item.breakpoints && Array.isArray(item.breakpoints) && item.breakpoints.length > 0) {
535
452
  if (breakpointError && breakpointError.msg && breakpointError.msg.includes('Possible breakpoint lines')) {} else {
536
453
  if (item.breakpoints.includes(line)) {
537
454
  ignore = true;
538
455
  }
539
-
540
456
  msg = breakpointError.msg;
541
457
  msg += `${line}. `;
542
458
  msg += ` Possible breakpoint lines : ${item.breakpoints.map(line => line).join(', ')}`;
@@ -551,7 +467,6 @@ class Debugger extends EventEmitter {
551
467
  }
552
468
  });
553
469
  }
554
-
555
470
  if (!ignore) {
556
471
  this.emit('breakError', {
557
472
  message: msg,
@@ -570,11 +485,9 @@ class Debugger extends EventEmitter {
570
485
  }, reason => {});
571
486
  }
572
487
  });
573
-
574
488
  this._client.on('Debugger.breakpointResolved', e => {
575
489
  this.onBreakpointResolved(e);
576
490
  });
577
-
578
491
  const {
579
492
  Debugger,
580
493
  Runtime
@@ -596,32 +509,27 @@ class Debugger extends EventEmitter {
596
509
  await this._Debugger.paused();
597
510
  this.emit('ready');
598
511
  }
599
-
600
512
  onBreakpointResolved(e) {
601
513
  for (var bp of this._breakpoints) {
602
514
  if (bp && e && bp.breakpointId === e.breakpointId) {
603
515
  let validateResult;
604
-
605
516
  if (e.location) {
606
517
  bp.locations = [e.location];
607
518
  validateResult = validateBreakpoint(bp);
608
519
  } else if (e.locations) {
609
520
  validateResult = validateBreakpoint(bp);
610
521
  }
611
-
612
522
  if (validateResult) {
613
523
  this._breakpointErrors.push(validateResult);
614
524
  }
615
525
  }
616
526
  }
617
527
  }
618
-
619
528
  async connect(port, host) {
620
529
  this._port = port;
621
530
  this._host = host || 'localhost';
622
531
  let snoozeTime = 1000;
623
532
  let lastError = null;
624
-
625
533
  for (let retries = 0; retries < CONNECT_RETRIES; retries++) {
626
534
  try {
627
535
  this._client = await CDP({
@@ -633,28 +541,22 @@ class Debugger extends EventEmitter {
633
541
  } catch (e) {
634
542
  lastError = e;
635
543
  }
636
-
637
544
  log.warn(`Debugger connection failed. Will retry in ${snoozeTime / 1000}s. Error: `, lastError);
638
545
  await snooze(snoozeTime);
639
546
  snoozeTime *= CONNECT_SNOOZE_INTERVAL_MULT;
640
547
  }
641
-
642
548
  if (lastError) {
643
549
  log.error('Failed to connect to the debugger: ', lastError);
644
550
  throw lastError;
645
551
  }
646
-
647
552
  await this.continueConnect();
648
553
  }
649
-
650
554
  async setBreakpoint(scriptPath, lineNumber) {
651
555
  let fileName = scriptPath;
652
556
  const aliasResult = this.inFileNameAliases(fileName);
653
-
654
557
  if (aliasResult) {
655
558
  fileName = aliasResult;
656
559
  }
657
-
658
560
  fileName = _url.default.pathToFileURL(fileName).toString();
659
561
  let err = null;
660
562
  let breakpoint = await this._Debugger.setBreakpointByUrl({
@@ -663,28 +565,22 @@ class Debugger extends EventEmitter {
663
565
  columnNumber: 0
664
566
  }).catch(e => {
665
567
  err = e;
666
-
667
568
  if (!e.response || e.response.message !== 'Breakpoint at specified location already exists.') {
668
569
  throw e;
669
570
  }
670
571
  });
671
-
672
572
  if (err) {} else {
673
573
  breakpoint.origin = {
674
574
  scriptPath: fileName,
675
575
  lineNumber: lineNumber
676
576
  };
677
-
678
577
  this._breakpoints.push(breakpoint);
679
-
680
578
  if (breakpoint) {
681
579
  this.onBreakpointResolved(breakpoint);
682
580
  }
683
581
  }
684
-
685
582
  return breakpoint;
686
583
  }
687
-
688
584
  async setBreakpointsActive(active) {
689
585
  if (this._Debugger && this._Debugger.setBreakpointsActive) {
690
586
  return await this._Debugger.setBreakpointsActive({
@@ -695,7 +591,6 @@ class Debugger extends EventEmitter {
695
591
  return await this.setBreakpointsActive(active);
696
592
  }
697
593
  }
698
-
699
594
  async removeBreakpoint(breakpointId) {
700
595
  this._breakpoints = this._breakpoints.filter(bp => {
701
596
  return bp.breakpointId !== breakpointId;
@@ -705,40 +600,34 @@ class Debugger extends EventEmitter {
705
600
  };
706
601
  return await this._Debugger.removeBreakpoint(removeBr);
707
602
  }
708
-
709
603
  async continue() {
710
604
  if (this._paused) {
711
605
  this._paused = false;
712
606
  return await this._Debugger.resume();
713
607
  }
714
608
  }
715
-
716
609
  async resume() {
717
610
  if (this._paused) {
718
611
  this._paused = false;
719
612
  return await this._Debugger.resume();
720
613
  }
721
614
  }
722
-
723
615
  async resumeTerminate() {
724
616
  if (this._paused) {
725
617
  this._paused = false;
726
618
  await this._Debugger.resume(true);
727
619
  }
728
620
  }
729
-
730
621
  async disable() {
731
622
  if (this._paused) {
732
623
  this._paused = false;
733
624
  await this._Debugger.disable(true);
734
625
  }
735
626
  }
736
-
737
627
  async removeBreakpointByValue(filePath, inputLine) {
738
628
  const filePathAlias = this.inFileNameAliases(filePath);
739
629
  const line = inputLine - 1;
740
630
  const self = this;
741
-
742
631
  if (this._breakpoints) {
743
632
  for (let b of this._breakpoints) {
744
633
  try {
@@ -746,7 +635,6 @@ class Debugger extends EventEmitter {
746
635
  const parts = b.breakpointId.split(':');
747
636
  let fileName;
748
637
  let lineNumber;
749
-
750
638
  if (process.platform === 'win32') {
751
639
  fileName = parts[parts.length - 2] + ':' + parts[parts.length - 1];
752
640
  lineNumber = parseInt(parts[1]);
@@ -754,7 +642,6 @@ class Debugger extends EventEmitter {
754
642
  fileName = parts[parts.length - 1];
755
643
  lineNumber = parseInt(parts[1]);
756
644
  }
757
-
758
645
  if ((fileName === filePath || fileName === filePathAlias) && lineNumber === line) {
759
646
  await self.removeBreakpoint(b.breakpointId);
760
647
  }
@@ -766,17 +653,14 @@ class Debugger extends EventEmitter {
766
653
  }
767
654
  }
768
655
  }
769
-
770
656
  async clearBreakpoints() {
771
657
  const self = this;
772
-
773
658
  if (this._breakpoints) {
774
659
  for (let b of this._breakpoints) {
775
660
  await self.removeBreakpoint(b.breakpointId);
776
661
  }
777
662
  }
778
663
  }
779
-
780
664
  async getPossibleBreakpoints(startLocation) {
781
665
  const result = [];
782
666
  const possibleBreakpoints = await this._Debugger.getPossibleBreakpoints({
@@ -786,69 +670,56 @@ class Debugger extends EventEmitter {
786
670
  columnNumber: 0
787
671
  }
788
672
  });
789
-
790
673
  if (possibleBreakpoints && possibleBreakpoints.locations && Array.isArray(possibleBreakpoints.locations) && possibleBreakpoints.locations.length > 0) {
791
674
  possibleBreakpoints.locations.map(item => {
792
675
  if (item && typeof item.lineNumber !== 'undefined') {
793
676
  const lineNumber = item.lineNumber + 1;
794
-
795
677
  if (result.includes(lineNumber)) {} else {
796
678
  result.push(lineNumber);
797
679
  }
798
680
  }
799
681
  });
800
682
  }
801
-
802
683
  if (result && Array.isArray(result) && result.length > 0) {
803
684
  let p = result.pop();
804
-
805
685
  if (result.includes(p - 1)) {} else {
806
686
  if (p - 1 > 1) {
807
687
  result.push(p - 1);
808
688
  }
809
689
  }
810
690
  }
811
-
812
691
  return result;
813
692
  }
814
-
815
693
  async getScriptSource(scriptId) {
816
694
  return await this._Debugger.getScriptSource({
817
695
  scriptId: scriptId
818
696
  });
819
697
  }
820
-
821
698
  async close() {
822
699
  await this.reset();
823
700
  }
824
-
825
701
  async addVariablesFromScopeChainTree(variables, scopeChainTree) {
826
702
  if (!Array.isArray(scopeChainTree) || scopeChainTree.length == 0 || !Array.isArray(scopeChainTree[0]) || scopeChainTree[0].length == 0 || !Array.isArray(scopeChainTree[0][0]) || scopeChainTree[0][0].length == 0) {
827
703
  return;
828
704
  }
829
-
830
705
  const {
831
706
  objectIdResponse
832
707
  } = scopeChainTree[0][0][0];
833
708
  const {
834
709
  result
835
710
  } = objectIdResponse;
836
-
837
711
  for (const scopeVar of result) {
838
712
  if (!IGNORE_SCOPE_CHAIN_VARIABLES.includes(scopeVar.name)) {
839
713
  var value;
840
714
  var type;
841
-
842
715
  if (scopeVar && scopeVar.value) {
843
716
  type = scopeVar.value.type;
844
-
845
717
  if (scopeVar.value.value) {
846
718
  value = scopeVar.value.value;
847
719
  } else {
848
720
  value = await this.tryToRetrieveObjectValue(scopeVar.value.objectId);
849
721
  }
850
722
  }
851
-
852
723
  variables.push({
853
724
  name: scopeVar.name,
854
725
  type: type || 'undefined',
@@ -857,19 +728,16 @@ class Debugger extends EventEmitter {
857
728
  }
858
729
  }
859
730
  }
860
-
861
731
  async tryToRetrieveObjectValue(objectId) {
862
732
  if (!objectId) {
863
733
  return undefined;
864
734
  }
865
-
866
735
  try {
867
736
  const {
868
737
  result
869
738
  } = await this._Runtime.getProperties({
870
739
  objectId
871
740
  });
872
-
873
741
  if (Array.isArray(result) && result.length > 0) {
874
742
  const objValue = {};
875
743
  result.forEach(propDesc => {
@@ -882,10 +750,8 @@ class Debugger extends EventEmitter {
882
750
  } catch (e) {
883
751
  console.error('Runtime.getProperties call failed', e);
884
752
  }
885
-
886
753
  return undefined;
887
754
  }
888
-
889
755
  async addOxygenVariablesFromGlobalScope(variables) {
890
756
  const {
891
757
  result: poEvalResult
@@ -919,7 +785,6 @@ class Debugger extends EventEmitter {
919
785
  };
920
786
  Object.keys(results).forEach(key => {
921
787
  const result = results[key];
922
-
923
788
  if (result.value) {
924
789
  variables.push({
925
790
  name: key,
@@ -929,15 +794,12 @@ class Debugger extends EventEmitter {
929
794
  }
930
795
  });
931
796
  }
932
-
933
797
  getBreakpoints(filePath) {
934
798
  var bps = [];
935
-
936
799
  for (let b of this._breakpoints) {
937
800
  const parts = b.breakpointId.split(':');
938
801
  let fileName;
939
802
  let lineNumber;
940
-
941
803
  if (process.platform === 'win32') {
942
804
  fileName = parts[parts.length - 2] + ':' + parts[parts.length - 1];
943
805
  lineNumber = parseInt(parts[1]) + 1;
@@ -945,22 +807,17 @@ class Debugger extends EventEmitter {
945
807
  fileName = parts[parts.length - 1];
946
808
  lineNumber = parseInt(parts[1]) + 1;
947
809
  }
948
-
949
810
  if (fileName === filePath) {
950
811
  bps.push(lineNumber);
951
812
  } else {
952
813
  const filePathAlias = this.inFileNameAliases(filePath);
953
-
954
814
  if (filePathAlias) {
955
815
  bps.push(lineNumber);
956
816
  }
957
817
  }
958
818
  }
959
-
960
819
  return bps;
961
820
  }
962
-
963
821
  }
964
-
965
822
  exports.default = Debugger;
966
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9saWIvZGVidWdnZXIuanMiXSwibmFtZXMiOlsibG9nIiwiRXZlbnRFbWl0dGVyIiwicmVxdWlyZSIsIkNEUCIsIkNPTk5FQ1RfUkVUUklFUyIsIkNPTk5FQ1RfU05PT1pFX0lOVEVSVkFMX01VTFQiLCJNQVhfREVQVEgiLCJJR05PUkVfU0NPUEVfQ0hBSU5fVkFSSUFCTEVTIiwibWF4RmluZGVkRGVwdGgiLCJ0cmFuc2Zvcm1Ub0lERVN0eWxlIiwiZmlsZU5hbWUiLCJ1cmlJbmRleCIsImluZGV4T2YiLCJicERhdGEiLCJzdWJzdHJpbmciLCJ1cmkiLCJwcm9jZXNzIiwicGxhdGZvcm0iLCJzdGFydHNXaXRoIiwibGVuZ3RoIiwidXJsIiwiZmlsZVVSTFRvUGF0aCIsImUiLCJjb25zb2xlIiwiZXJyb3IiLCJzbm9vemUiLCJtcyIsIlByb21pc2UiLCJyZXNvbHZlIiwic2V0VGltZW91dCIsImRlbGV0ZVZhbHVlcyIsImFyciIsImRlcHRoIiwicmVzdWx0IiwibWFwIiwiaXRlbSIsInZhbHVlIiwiY2xhc3NOYW1lIiwiY2xvbmVWYWx1ZSIsIk9iamVjdCIsImFzc2lnbiIsIm9iamVjdElkIiwiY2xvbmUiLCJleHRyYWN0QnJlYWtwb2ludERhdGEiLCJicFN0ciIsInBhcnRzIiwic3BsaXQiLCJsaW5lTnVtYmVyIiwicGFyc2VJbnQiLCJzcGxpY2UiLCJqb2luIiwidmFsaWRhdGVCcmVha3BvaW50IiwiYnJlYWtwb2ludCIsImJyT2JqIiwiYnJlYWtwb2ludElkIiwiYnJMaW5lTnVtYmVyIiwibG9jYXRpb25zIiwiQXJyYXkiLCJpc0FycmF5IiwiYnJGaWxlTmFtZSIsIml0ZW1MaW5lTnVtYmVyIiwibXNnIiwibGluZSIsIkRlYnVnZ2VyIiwiY29uc3RydWN0b3IiLCJwaWQiLCJfcGlkIiwiX3BvcnQiLCJ1bmRlZmluZWQiLCJfaG9zdCIsIl9icmVha3BvaW50cyIsIl9wZW5kaW5nQlAiLCJfcGF1c2VkIiwiX2NsaWVudCIsIl9maWxlTmFtZUFsaWFzZXMiLCJfYnJlYWtwb2ludEVycm9ycyIsInJlc2V0IiwiY2xvc2UiLCJnZXRQcm9wZXJ0aWVzQnlPYmplY3RJZCIsImVsbSIsImRhdGEiLCJfUnVudGltZSIsImdldFByb3BlcnRpZXMiLCJnZXRQcm9taWNlQWxsUmVzdWx0IiwibWFwUmVzdWx0RmlsdGVyZWQiLCJwcm9taXNlQWxsUHJvbWlzZSIsImFsbCIsInRoZW4iLCJmaWx0ZXIiLCJwcm9taXNlcyIsImdldFByb3BlcnRpZXNSZXN1bHQiLCJtYXBSZXN1bHQiLCJnZXRQcm9wZXJ0aWVzSW5uZXJSZXN1bHQiLCJzY29wZUl0ZW0iLCJvYmplY3RJZFJlc3BvbnNlIiwiY2hpbGQiLCJ2YWx1ZXMiLCJwcm9jZXNzU2NvcGUiLCJzY29wZUNoYWluIiwic2NvcGVDaGFpblJlc3VsdCIsImNoYWluIiwib2JqZWN0IiwidHlwZSIsImVsIiwicHJvY2Vzc0NhbGxGcmFtZXMiLCJjYWxsRnJhbWVzIiwiY2FsbEZyYW1lc01hcFJlc3VsdCIsImNhbGxGcmFtZSIsInByb2Nlc3NTY29wZVJlc3VsdCIsImluQnJlYWtwb2ludHMiLCJpdGVtVXJsIiwiYnAiLCJ0b0xvd2VyQ2FzZSIsIm9yaWdpbiIsInNjcmlwdFBhdGgiLCJpbkZpbGVOYW1lQWxpYXNlcyIsImFsaWFzIiwiY29udGludWVDb25uZWN0Iiwib24iLCJtIiwiZmlsZWxjIiwiYnJlYWtwb2ludEZvckNoYW5nZSIsImZpbmRSZXN1bHQiLCJmaW5kIiwiYnJlYWtwb2ludGxjIiwiaW5jbHVkZXMiLCJwdXNoIiwiX0RlYnVnZ2VyIiwicGF1c2UiLCJtVXJsIiwiYnJlYWtwb2ludHNGcm9tT2xkTG9jYXRpb24iLCJicmVha3BvaW50c0Zyb21PbGRMb2NhdGlvblJlc3VsdCIsInNldEJyZWFrcG9pbnQiLCJyZXN1bWUiLCJyZWFzb24iLCJfYnJva2VPblN0YXJ0IiwicG9zc2libGVCcmVha3BvaW50c0RhdGEiLCJlQ2FsbEZyYW1lcyIsImJyZWFrcG9pbnRzTWFwUmVzdWx0Iiwic2NyaXB0SWQiLCJsb2NhdGlvbiIsImluaXRpYWxEZXB0aCIsInVuaXF1ZVNjcmlwdElkQXJyIiwiZmluZGVkIiwiZW5kc1dpdGgiLCJwb3NzaWJsZUJyZWFrcG9pbnRzIiwiZ2V0UG9zc2libGVCcmVha3BvaW50cyIsInNjcmlwdFNvdXJjZSIsImdldFNjcmlwdFNvdXJjZSIsInNjcmlwdFNvdXJjZVNwbGl0IiwiZmlsZUxpbmVOdW1iZXJzTGVuZ3RoIiwiYnJlYWtwb2ludHMiLCJmaWxlIiwic2NvcGVDaGFpblRyZWUiLCJicmVha3BvaW50RGF0YSIsInZhcmlhYmxlcyIsImFkZFZhcmlhYmxlc0Zyb21TY29wZUNoYWluVHJlZSIsImFkZE94eWdlblZhcmlhYmxlc0Zyb21HbG9iYWxTY29wZSIsImlzc2V0IiwibG9jIiwicmVhbEJyZmluZGVkIiwiYnJlYWtwb2ludEVycm9yIiwiYnIiLCJwb3NzaWJsZUJyZWFrcG9pbnREYXRhIiwicmVzb2x2ZWQiLCJlbWl0IiwiaWdub3JlIiwibWVzc2FnZSIsImNvbnRpbnVlIiwib25CcmVha3BvaW50UmVzb2x2ZWQiLCJSdW50aW1lIiwiZW5hYmxlIiwic2V0UGF1c2VPbkV4Y2VwdGlvbnMiLCJzdGF0ZSIsInNldEFzeW5jQ2FsbFN0YWNrRGVwdGgiLCJtYXhEZXB0aCIsInNldEJsYWNrYm94UGF0dGVybnMiLCJwYXR0ZXJucyIsInJ1bklmV2FpdGluZ0ZvckRlYnVnZ2VyIiwicGF1c2VkIiwidmFsaWRhdGVSZXN1bHQiLCJjb25uZWN0IiwicG9ydCIsImhvc3QiLCJzbm9vemVUaW1lIiwibGFzdEVycm9yIiwicmV0cmllcyIsIndhcm4iLCJhbGlhc1Jlc3VsdCIsInBhdGhUb0ZpbGVVUkwiLCJ0b1N0cmluZyIsImVyciIsInNldEJyZWFrcG9pbnRCeVVybCIsImNvbHVtbk51bWJlciIsImNhdGNoIiwicmVzcG9uc2UiLCJzZXRCcmVha3BvaW50c0FjdGl2ZSIsImFjdGl2ZSIsInJlbW92ZUJyZWFrcG9pbnQiLCJyZW1vdmVCciIsInJlc3VtZVRlcm1pbmF0ZSIsImRpc2FibGUiLCJyZW1vdmVCcmVha3BvaW50QnlWYWx1ZSIsImZpbGVQYXRoIiwiaW5wdXRMaW5lIiwiZmlsZVBhdGhBbGlhcyIsInNlbGYiLCJiIiwiY2xlYXJCcmVha3BvaW50cyIsInN0YXJ0TG9jYXRpb24iLCJzdGFydCIsInAiLCJwb3AiLCJzY29wZVZhciIsIm5hbWUiLCJ0cnlUb1JldHJpZXZlT2JqZWN0VmFsdWUiLCJvYmpWYWx1ZSIsImZvckVhY2giLCJwcm9wRGVzYyIsInBvRXZhbFJlc3VsdCIsImV2YWx1YXRlIiwiZXhwcmVzc2lvbiIsInJldHVybkJ5VmFsdWUiLCJlbnZFdmFsUmVzdWx0IiwidmFyc0V2YWxSZXN1bHQiLCJwYXJhbXNFdmFsUmVzdWx0IiwicmVzdWx0cyIsInBvIiwiZW52IiwidmFycyIsInBhcmFtcyIsImtleXMiLCJrZXkiLCJnZXRCcmVha3BvaW50cyIsImJwcyJdLCJtYXBwaW5ncyI6IkFBYUE7Ozs7Ozs7OztBQUVBOztBQUlBOzs7O0FBSEEsTUFBTUEsR0FBRyxHQUFHLHFCQUFPLFVBQVAsQ0FBWjs7QUFDQSxNQUFNO0FBQUVDLEVBQUFBO0FBQUYsSUFBbUJDLE9BQU8sQ0FBQyxRQUFELENBQWhDOztBQUNBLE1BQU1DLEdBQUcsR0FBR0QsT0FBTyxDQUFDLG1DQUFELENBQW5COztBQUdBLE1BQU1FLGVBQWUsR0FBRyxDQUF4QjtBQUNBLE1BQU1DLDRCQUE0QixHQUFHLENBQXJDO0FBQ0EsTUFBTUMsU0FBUyxHQUFHLENBQWxCO0FBQ0EsTUFBTUMsNEJBQTRCLEdBQUcsQ0FDakMsU0FEaUMsRUFFakMsU0FGaUMsRUFHakMsUUFIaUMsRUFJakMsWUFKaUMsRUFLakMsV0FMaUMsQ0FBckM7QUFPQSxJQUFJQyxjQUFjLEdBQUcsQ0FBckI7O0FBRUEsTUFBTUMsbUJBQW1CLEdBQUlDLFFBQUQsSUFBYztBQUN0QyxNQUFJO0FBQ0EsVUFBTUMsUUFBUSxHQUFHRCxRQUFRLENBQUNFLE9BQVQsQ0FBaUIsT0FBakIsQ0FBakI7QUFDQSxVQUFNQyxNQUFNLEdBQUdILFFBQVEsQ0FB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Uy9FLFVBQVQ7QUFDSCxPQUZELE1BRU87QUFDSCxjQUFNOEosYUFBYSxHQUFHLEtBQUsxRixpQkFBTCxDQUF1QndGLFFBQXZCLENBQXRCOztBQUNBLFlBQUlFLGFBQUosRUFBbUI7QUFDZjZCLFVBQUFBLEdBQUcsQ0FBQzVHLElBQUosQ0FBUy9FLFVBQVQ7QUFDSDtBQUNKO0FBQ0o7O0FBQ0QsV0FBTzJMLEdBQVA7QUFDSDs7QUFuN0I4QyIsInNvdXJjZXNDb250ZW50IjpbIi8qXHJcbiAqIENvcHlyaWdodCAoQykgMjAxNS1wcmVzZW50IENsb3VkQmVhdCBMaW1pdGVkXHJcbiAqXHJcbiAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5XHJcbiAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5XHJcbiAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yXHJcbiAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uXHJcbiAqL1xyXG5cclxuLypcclxuICogVjggZGVidWdnZXIgY2xpZW50LlxyXG4gKi9cclxuXHJcbid1c2Ugc3RyaWN0JztcclxuXHJcbmltcG9ydCBsb2dnZXIgZnJvbSAnLi4vbGliL2xvZ2dlcic7XHJcbmNvbnN0IGxvZyA9IGxvZ2dlcignRGVidWdnZXInKTtcclxuY29uc3QgeyBFdmVudEVtaXR0ZXIgfSA9IHJlcXVpcmUoJ2V2ZW50cycpO1xyXG5jb25zdCBDRFAgPSByZXF1aXJlKCdAb3h5Z2VuaHEvY2hyb21lLXJlbW90ZS1pbnRlcmZhY2UnKTtcclxuaW1wb3J0IHVybCBmcm9tICd1cmwnO1xyXG5cclxuY29uc3QgQ09OTkVDVF9SRVRSSUVTID0gNDtcclxuY29uc3QgQ09OTkVDVF9TTk9PWkVfSU5URVJWQUxfTVVMVCA9IDI7XHJcbmNvbnN0IE1BWF9ERVBUSCA9IDU7XHJcbmNvbnN0IElHTk9SRV9TQ09QRV9DSEFJTl9WQVJJQUJMRVMgPSBbXHJcbiAgICAnZXhwb3J0cycsXHJcbiAgICAncmVxdWlyZScsXHJcbiAgICAnbW9kdWxlJyxcclxuICAgICdfX2ZpbGVuYW1lJyxcclxuICAgICdfX2Rpcm5hbWUnXHJcbl07XHJcbmxldCBtYXhGaW5kZWREZXB0aCA9IDA7XHJcblxyXG5jb25zdCB0cmFuc2Zvcm1Ub0lERVN0eWxlID0gKGZpbGVOYW1lKSA9PiB7XHJcbiAgICB0cnkge1xyXG4gICAgICAgIGNvbnN0IHVyaUluZGV4ID0gZmlsZU5hbWUuaW5kZXhPZignZmlsZTonKTtcclxuICAgICAgICBjb25zdCBicERhdGEgPSBmaWxlTmFtZS5zdWJzdHJpbmcoMCwgdXJpSW5kZXgpO1xyXG4gICAgICAgIGxldCB1cmkgPSBmaWxlTmFtZS5zdWJzdHJpbmcodXJpSW5kZXgpO1xyXG4gICAgICAgIC8vIGZpeCBVTkMgcGF0aHNcclxuICAgICAgICBpZiAocHJvY2Vzcy5wbGF0Zm9ybSA9PT0gJ3dpbjMyJyAmJiB1cmkuc3RhcnRzV2l0aCgnZmlsZTovLy8nKSkge1xyXG4gICAgICAgICAgICB1cmkgPSAnZmlsZTovLycgKyB1cmkuc3Vic3RyaW5nKCdmaWxlOi8vLycubGVuZ3RoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGJwRGF0YSArIHVybC5maWxlVVJMVG9QYXRoKHVyaSk7XHJcbiAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgY29uc29sZS5sb2coJ3RyYW5zZm9ybVRvSURFU3R5bGUgZmlsZU5hbWUnLCBmaWxlTmFtZSk7XHJcbiAgICAgICAgY29uc29sZS5lcnJvcigndHJhbnNmb3JtVG9JREVTdHlsZSBlcnJvcicsIGUpO1xyXG4gICAgICAgIHRocm93IGU7XHJcbiAgICB9XHJcbn07XHJcblxyXG4vLyBzbm9vemUgZnVuY3Rpb24gLSBhc3luYyB3cmFwcGVyIGFyb3VuZCBzZXRUaW1lb3V0IGZ1bmN0aW9uXHJcbmNvbnN0IHNub296ZSA9IG1zID0+IG5ldyBQcm9taXNlKHJlc29sdmUgPT4gc2V0VGltZW91dChyZXNvbHZlLCBtcykpO1xyXG5cclxuY29uc3QgZGVsZXRlVmFsdWVzID0gKGFyciwgZGVwdGgpID0+IHtcclxuXHJcbiAgICBpZiAoZGVwdGggPiBtYXhGaW5kZWREZXB0aCkge1xyXG4gICAgICAgIG1heEZpbmRlZERlcHRoID0gZGVwdGg7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGRlcHRoID4gTUFYX0RFUFRIKSB7XHJcbiAgICAgICAgcmV0dXJuIFtdO1xyXG4gICAgfVxyXG5cclxuICAgIGxldCByZXN1bHQgPSBhcnIubWFwKChpdGVtKSA9PiB7XHJcbiAgICAgICAgaWYgKGl0ZW0gJiYgaXRlbS52YWx1ZSAmJiBpdGVtLnZhbHVlLmNsYXNzTmFtZSAmJiBpdGVtLnZhbHVlLmNsYXNzTmFtZSA9PT0gJ0Z1bmN0aW9uJykge1xyXG4gICAgICAgICAgICBjb25zdCBjbG9uZVZhbHVlID0gT2JqZWN0LmFzc2lnbihpdGVtLnZhbHVlKTtcclxuICAgICAgICAgICAgZGVsZXRlIGNsb25lVmFsdWUub2JqZWN0SWQ7XHJcbiAgICAgICAgICAgIGNvbnN0IGNsb25lID0gT2JqZWN0LmFzc2lnbihpdGVtLCB7XHJcbiAgICAgICAgICAgICAgICB2YWx1ZTogY2xvbmVWYWx1ZVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgZGVsZXRlIGNsb25lLm9iamVjdElkO1xyXG4gICAgICAgICAgICByZXR1cm4gY2xvbmU7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgcmV0dXJuIGl0ZW07XHJcbiAgICAgICAgfVxyXG4gICAgfSk7XHJcblxyXG4gICAgcmV0dXJuIHJlc3VsdDtcclxufTtcclxuXHJcbmZ1bmN0aW9uIGV4dHJhY3RCcmVha3BvaW50RGF0YShicFN0cikge1xyXG4gICAgaWYgKCFicFN0ciB8fCB0eXBlb2YgYnBTdHIgIT09ICdzdHJpbmcnKSB7XHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgdHJ5IHtcclxuICAgICAgICBicFN0ciA9IHRyYW5zZm9ybVRvSURFU3R5bGUoYnBTdHIpO1xyXG4gICAgICAgIGNvbnN0IHBhcnRzID0gYnBTdHIuc3BsaXQoJzonKTtcclxuXHJcbiAgICAgICAgY29uc3QgbGluZU51bWJlciA9IHBhcnNlSW50KHBhcnRzWzFdKTtcclxuXHJcbiAgICAgICAgLy8gcm9tb3ZlIGZpbGUgbnVtYmVyLCBsaW5lIG51bWJlciwgY29sdW1uIG51bWJlclxyXG4gICAgICAgIHBhcnRzLnNwbGljZSgwLCAzKTtcclxuXHJcbiAgICAgICAgLy8gbG9va3MgbGluZSBuZWVkIG9ubHkgZm9yIHdpbmRvd3MgcGF0aCB3aGl0aCBkaXNrLCBsaWtlIEM6Ly9cclxuICAgICAgICAvLyBmb3Igd2luZG93cyBuZXR3b3JrIGZvbGRlcnMgYW5kIG1hYyBub3QgbmVlZFxyXG4gICAgICAgIGNvbnN0IGZpbGVOYW1lID0gcGFydHMuam9pbignOicpO1xyXG5cclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICBmaWxlTmFtZTogZmlsZU5hbWUsXHJcbiAgICAgICAgICAgIGxpbmVOdW1iZXI6IGxpbmVOdW1iZXJcclxuICAgICAgICB9O1xyXG5cclxuICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICBsb2cuZXJyb3IoYEZhaWxlZCB0byBleHRyYWN0IGJyZWFrcG9pbnQgZGF0YTogJHticFN0cn1gKTtcclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxufVxyXG5cclxuZnVuY3Rpb24gdmFsaWRhdGVCcmVha3BvaW50KGJyZWFrcG9pbnQpIHtcclxuICAgIGNvbnN0IGJyT2JqID0gZXh0cmFjdEJyZWFrcG9pbnREYXRhKGJyZWFrcG9pbnQuYnJlYWtwb2ludElkKTtcclxuXHJcbiAgICBjb25zdCBickxpbmVOdW1iZXIgPSBick9iai5saW5lTnVtYmVyICsgMTsgLy8gZnJvbSAwLWJhc2UgdG8gMSBiYXNlO1xyXG5cclxuICAgIGlmIChicmVha3BvaW50ICYmIGJyZWFrcG9pbnQubG9jYXRpb25zICYmIEFycmF5LmlzQXJyYXkoYnJlYWtwb2ludC5sb2NhdGlvbnMpICYmIGJyZWFrcG9pbnQubG9jYXRpb25zLmxlbmd0aCA+IDApIHtcclxuICAgICAgICBsZXQgcmVzdWx0ID0gbnVsbDtcclxuICAgICAgICBicmVha3BvaW50LmxvY2F0aW9ucy5tYXAoKGl0ZW0pID0+IHtcclxuICAgICAgICAgICAgY29uc3QgYnJGaWxlTmFtZSA9IGJyT2JqLmZpbGVOYW1lO1xyXG4gICAgICAgICAgICBjb25zdCBpdGVtTGluZU51bWJlciA9IGl0ZW0ubGluZU51bWJlciArIDE7IC8vIGZyb20gMC1iYXNlIHRvIDEgYmFzZTtcclxuXHJcbiAgICAgICAgICAgIGlmIChickxpbmVOdW1iZXIgIT09IGl0ZW1MaW5lTnVtYmVyKSB7XHJcbiAgICAgICAgICAgICAgICByZXN1bHQgPSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbXNnOiBgQnJlYWtwb2ludHMgd2FybmluZyA6ICR7YnJGaWxlTmFtZX0gRG9uJ3QgaGF2ZSBvcHBvcnR1bml0eSB0byBoYXZlIGJyZWFrcG9pbnQgYXQgbGluZSA6IGAsXHJcbiAgICAgICAgICAgICAgICAgICAgZmlsZU5hbWU6IGJyRmlsZU5hbWUsXHJcbiAgICAgICAgICAgICAgICAgICAgbGluZTogYnJMaW5lTnVtYmVyXHJcbiAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG5cclxufVxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBEZWJ1Z2dlciBleHRlbmRzIEV2ZW50RW1pdHRlciB7XHJcbiAgICBjb25zdHJ1Y3RvcihwaWQpIHtcclxuICAgICAgICBzdXBlcigpO1xyXG5cclxuICAgICAgICB0aGlzLl9waWQgPSBwaWQ7XHJcbiAgICAgICAgdGhpcy5fcG9ydCA9IHVuZGVmaW5lZDtcclxuICAgICAgICB0aGlzLl9ob3N0ID0gdW5kZWZpbmVkO1xyXG4gICAgICAgIHRoaXMuX2JyZWFrcG9pbnRzID0gW107XHJcbiAgICAgICAgdGhpcy5fcGVuZGluZ0JQID0gdW5kZWZpbmVkO1xyXG4gICAgICAgIHRoaXMuX3BhdXNlZCA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMuX2NsaWVudCA9IG51bGw7XHJcbiAgICAgICAgdGhpcy5fZmlsZU5hbWVBbGlhc2VzID0gW107XHJcbiAgICAgICAgdGhpcy5fYnJlYWtwb2ludEVycm9ycyA9IFtdO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIHJlc2V0KCkge1xyXG4gICAgICAgIGlmICh0aGlzLl9jbGllbnQpIHtcclxuICAgICAgICAgICAgYXdhaXQgdGhpcy5fY2xpZW50LmNsb3NlKCk7XHJcbiAgICAgICAgICAgIHRoaXMuX2NsaWVudCA9IG51bGw7XHJcbiAgICAgICAgICAgIHRoaXMuX3BhdXNlZCA9IGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLl9icmVha3BvaW50cyA9IFtdO1xyXG4gICAgICAgIHRoaXMuX2ZpbGVOYW1lQWxpYXNlcyA9IFtdO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIGdldFByb3BlcnRpZXNCeU9iamVjdElkKG9iamVjdElkLCBkZXB0aCwgZWxtKSB7XHJcbiAgICAgICAgbGV0IGRhdGEgPSB7fTtcclxuXHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgZGF0YSA9IGF3YWl0IHRoaXMuX1J1bnRpbWUuZ2V0UHJvcGVydGllcyh7XHJcbiAgICAgICAgICAgICAgICBvYmplY3RJZCA6IG9iamVjdElkXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgLy8gY29uc29sZS5sb2coJ2dldFByb3BlcnRpZXMgZWxtJywgZWxtKTtcclxuICAgICAgICAgICAgLy8gY29uc29sZS5sb2coJ2dldFByb3BlcnRpZXMgZScsIGUpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBsZXQgY2xvbmUgPSBPYmplY3QuYXNzaWduKHt9LCBkYXRhKTtcclxuXHJcbiAgICAgICAgaWYgKGNsb25lICYmIGNsb25lICYmIGNsb25lLnJlc3VsdCkge1xyXG4gICAgICAgICAgICBjbG9uZSA9IE9iamVjdC5hc3NpZ24oe30sIGNsb25lLCB7XHJcbiAgICAgICAgICAgICAgICByZXN1bHQ6IGRlbGV0ZVZhbHVlcyhjbG9uZS5yZXN1bHQsIGRlcHRoKVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBjbG9uZTtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBnZXRQcm9taWNlQWxsUmVzdWx0KG1hcFJlc3VsdEZpbHRlcmVkKSB7XHJcbiAgICAgICAgbGV0IHByb21pc2VBbGxQcm9taXNlID0gYXdhaXQgUHJvbWlzZS5hbGwobWFwUmVzdWx0RmlsdGVyZWQpLnRoZW4odmFsdWUgPT4ge1xyXG4gICAgICAgICAgICByZXR1cm4gdmFsdWU7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIGlmIChwcm9taXNlQWxsUHJvbWlzZSAmJiBBcnJheS5pc0FycmF5KHByb21pc2VBbGxQcm9taXNlKSAmJiBwcm9taXNlQWxsUHJvbWlzZS5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgIHByb21pc2VBbGxQcm9taXNlID0gcHJvbWlzZUFsbFByb21pc2UuZmlsdGVyKChpdGVtKSA9PiAhIWl0ZW0pO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHByb21pc2VBbGxQcm9taXNlO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIGdldFByb3BlcnRpZXMob2JqZWN0SWQsIGRlcHRoLCBlbG0pIHtcclxuICAgICAgICBjb25zdCBwcm9taXNlcyA9IFtdO1xyXG5cclxuICAgICAgICBjb25zdCBnZXRQcm9wZXJ0aWVzUmVzdWx0ID0gYXdhaXQgdGhpcy5nZXRQcm9wZXJ0aWVzQnlPYmplY3RJZChvYmplY3RJZCwgZGVwdGgsIGVsbSk7XHJcblxyXG4gICAgICAgIGlmIChnZXRQcm9wZXJ0aWVzUmVzdWx0KSB7XHJcbiAgICAgICAgICAgIGlmIChnZXRQcm9wZXJ0aWVzUmVzdWx0ICYmIGdldFByb3BlcnRpZXNSZXN1bHQucmVzdWx0ICYmIEFycmF5LmlzQXJyYXkoZ2V0UHJvcGVydGllc1Jlc3VsdC5yZXN1bHQpKSB7XHJcblxyXG4gICAgICAgICAgICAgICAgY29uc3QgbWFwUmVzdWx0ID0gZ2V0UHJvcGVydGllc1Jlc3VsdC5yZXN1bHQubWFwKGFzeW5jIChpdGVtKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGl0ZW0gJiYgaXRlbS52YWx1ZSAmJiBpdGVtLnZhbHVlLm9iamVjdElkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGdldFByb3BlcnRpZXNJbm5lclJlc3VsdCA9IGF3YWl0IHRoaXMuZ2V0UHJvcGVydGllcyhpdGVtLnZhbHVlLm9iamVjdElkLCBkZXB0aCsxLCBpdGVtKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpdGVtLnNjb3BlSXRlbSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ2V0UHJvcGVydGllc0lubmVyUmVzdWx0O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICAgICAgY29uc3QgbWFwUmVzdWx0RmlsdGVyZWQgPSBtYXBSZXN1bHQuZmlsdGVyKChpdGVtKSA9PiAhIWl0ZW0pO1xyXG5cclxuICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IHtcclxuICAgICAgICAgICAgICAgICAgICBkZXB0aDogZGVwdGgsXHJcbiAgICAgICAgICAgICAgICAgICAgb2JqZWN0SWQ6IG9iamVjdElkLFxyXG4gICAgICAgICAgICAgICAgICAgIG9iamVjdElkUmVzcG9uc2U6IE9iamVjdC5hc3NpZ24oe30sIGdldFByb3BlcnRpZXNSZXN1bHQsIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0SWQ6IG9iamVjdElkXHJcbiAgICAgICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICAgIH07XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKG1hcFJlc3VsdEZpbHRlcmVkICYmIEFycmF5LmlzQXJyYXkobWFwUmVzdWx0RmlsdGVyZWQpICYmIG1hcFJlc3VsdEZpbHRlcmVkLmxlbmd0aCA+IDApIHtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcHJvbWlzZUFsbFByb21pc2UgPSBhd2FpdCB0aGlzLmdldFByb21pY2VBbGxSZXN1bHQobWFwUmVzdWx0RmlsdGVyZWQpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBpZiAocHJvbWlzZUFsbFByb21pc2UgJiYgQXJyYXkuaXNBcnJheShwcm9taXNlQWxsUHJvbWlzZSkgJiYgcHJvbWlzZUFsbFByb21pc2UubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQuY2hpbGQgPSBwcm9taXNlQWxsUHJvbWlzZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgICAgICAgICBkZXB0aDogZGVwdGgsXHJcbiAgICAgICAgICAgICAgICAgICAgb2JqZWN0SWQ6IG9iamVjdElkLFxyXG4gICAgICAgICAgICAgICAgICAgIG9iamVjdElkUmVzcG9uc2U6IE9iamVjdC5hc3NpZ24oe30sIGdldFByb3BlcnRpZXNSZXN1bHQsIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0SWQ6IG9iamVjdElkXHJcbiAgICAgICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChwcm9taXNlcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLmFsbChwcm9taXNlcykudGhlbih2YWx1ZXMgPT4ge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlcztcclxuICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgcHJvY2Vzc1Njb3BlKHNjb3BlQ2hhaW4sIGRlcHRoKSB7XHJcbiAgICAgICAgbGV0IHNjb3BlQ2hhaW5SZXN1bHQgPSBhd2FpdCBzY29wZUNoYWluLm1hcChhc3luYyAoY2hhaW4pID0+IHtcclxuICAgICAgICAgICAgaWYgKGNoYWluICYmIGNoYWluLm9iamVjdCAmJiBjaGFpbi5vYmplY3Qub2JqZWN0SWQpIHtcclxuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgY2hhaW4ub2JqZWN0Lm9iamVjdElkID09PSAnc3RyaW5nJyAmJiBjaGFpbi50eXBlICE9PSAnZ2xvYmFsJykge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGdldFByb3BlcnRpZXNSZXN1bHQgPSBhd2FpdCB0aGlzLmdldFByb3BlcnRpZXMoY2hhaW4ub2JqZWN0Lm9iamVjdElkLCBkZXB0aCk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBnZXRQcm9wZXJ0aWVzUmVzdWx0O1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHNjb3BlQ2hhaW5SZXN1bHQgPSBzY29wZUNoYWluUmVzdWx0LmZpbHRlcigoZWwpID0+ICEhZWwpO1xyXG5cclxuICAgICAgICByZXR1cm4gUHJvbWlzZS5hbGwoc2NvcGVDaGFpblJlc3VsdCkudGhlbih2YWx1ZXMgPT4ge1xyXG4gICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZXMpKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWVzLmZpbHRlcigoZWwpID0+ICEhZWwpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlcztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIHByb2Nlc3NDYWxsRnJhbWVzKGNhbGxGcmFtZXMsIGRlcHRoKSB7XHJcbiAgICAgICAgbGV0IGNhbGxGcmFtZXNNYXBSZXN1bHQgPSBhd2FpdCBjYWxsRnJhbWVzLm1hcChhc3luYyhjYWxsRnJhbWUpID0+IHtcclxuICAgICAgICAgICAgaWYgKGNhbGxGcmFtZSAmJiBjYWxsRnJhbWUuc2NvcGVDaGFpbiAmJiBBcnJheS5pc0FycmF5KGNhbGxGcmFtZS5zY29wZUNoYWluKSkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgcHJvY2Vzc1Njb3BlUmVzdWx0ID0gYXdhaXQgdGhpcy5wcm9jZXNzU2NvcGUoY2FsbEZyYW1lLnNjb3BlQ2hhaW4sIGRlcHRoKTtcclxuICAgICAgICAgICAgICAgIHJldHVybiBwcm9jZXNzU2NvcGVSZXN1bHQ7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBjYWxsRnJhbWVzTWFwUmVzdWx0ID0gY2FsbEZyYW1lc01hcFJlc3VsdC5maWx0ZXIoKGVsKSA9PiAhIWVsKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIFByb21pc2UuYWxsKGNhbGxGcmFtZXNNYXBSZXN1bHQpLnRoZW4odmFsdWVzID0+IHtcclxuICAgICAgICAgICAgcmV0dXJuIHZhbHVlcztcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBpbkJyZWFrcG9pbnRzKGl0ZW1VcmwpIHtcclxuICAgICAgICBsZXQgcmVzdWx0ID0gZmFsc2U7XHJcbiAgICAgICAgaWYgKHRoaXMuX2JyZWFrcG9pbnRzICYmIEFycmF5LmlzQXJyYXkodGhpcy5fYnJlYWtwb2ludHMpICYmIHRoaXMuX2JyZWFrcG9pbnRzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgdGhpcy5fYnJlYWtwb2ludHMubWFwKChicCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgaWYgKFxyXG4gICAgICAgICAgICAgICAgICAgIGl0ZW1VcmwgJiZcclxuICAgICAgICAgICAgICAgICAgICBpdGVtVXJsLnRvTG93ZXJDYXNlICYmXHJcbiAgICAgICAgICAgICAgICAgICAgYnAub3JpZ2luICYmXHJcbiAgICAgICAgICAgICAgICAgICAgYnAub3JpZ2luLnNjcmlwdFBhdGggJiZcclxuICAgICAgICAgICAgICAgICAgICBicC5vcmlnaW4uc2NyaXB0UGF0aC50b0xvd2VyQ2FzZSAmJlxyXG4gICAgICAgICAgICAgICAgICAgIGl0ZW1VcmwudG9Mb3dlckNhc2UoKSA9PT0gYnAub3JpZ2luLnNjcmlwdFBhdGgudG9Mb3dlckNhc2UoKVxyXG4gICAgICAgICAgICAgICAgKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICB9XHJcblxyXG4gICAgaW5GaWxlTmFtZUFsaWFzZXMoZmlsZU5hbWUpIHtcclxuICAgICAgICBsZXQgcmVzdWx0ID0gZmFsc2U7XHJcbiAgICAgICAgaWYgKHRoaXMuX2ZpbGVOYW1lQWxpYXNlcyAmJiBBcnJheS5pc0FycmF5KHRoaXMuX2ZpbGVOYW1lQWxpYXNlcykgJiYgdGhpcy5fZmlsZU5hbWVBbGlhc2VzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgdGhpcy5fZmlsZU5hbWVBbGlhc2VzLm1hcCgoYWxpYXMpID0+IHtcclxuICAgICAgICAgICAgICAgIGlmIChcclxuICAgICAgICAgICAgICAgICAgICBhbGlhcyAmJlxyXG4gICAgICAgICAgICAgICAgICAgIGFsaWFzLnRvTG93ZXJDYXNlICYmXHJcbiAgICAgICAgICAgICAgICAgICAgZmlsZU5hbWUgJiZcclxuICAgICAgICAgICAgICAgICAgICBmaWxlTmFtZS50b0xvd2VyQ2FzZSAmJlxyXG4gICAgICAgICAgICAgICAgICAgIGFsaWFzLnRvTG93ZXJDYXNlKCkgPT09IGZpbGVOYW1lLnRvTG93ZXJDYXNlKClcclxuICAgICAgICAgICAgICAgICkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IGFsaWFzO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBjb250aW51ZUNvbm5lY3QoKSB7XHJcblxyXG4gICAgICAgIHRoaXMuX2NsaWVudC5vbignRGVidWdnZXIuc2NyaXB0UGFyc2VkJywgYXN5bmMobSkgPT4ge1xyXG4gICAgICAgICAgICBpZiAobSAmJiBtLnVybCkge1xyXG4gICAgICAgICAgICAgICAgaWYgKG0udXJsLnRvTG93ZXJDYXNlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZmlsZWxjID0gbS51cmwudG9Mb3dlckNhc2UoKTtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgYnJlYWtwb2ludEZvckNoYW5nZTtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBmaW5kUmVzdWx0ID0gdGhpcy5fYnJlYWtwb2ludHMuZmluZCgoaXRlbSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXRlbS5vcmlnaW4gJiYgaXRlbS5vcmlnaW4uc2NyaXB0UGF0aCAmJiBpdGVtLm9yaWdpbi5zY3JpcHRQYXRoLnRvTG93ZXJDYXNlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBicmVha3BvaW50bGMgPSBpdGVtLm9yaWdpbi5zY3JpcHRQYXRoLnRvTG93ZXJDYXNlKCk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJyZWFrcG9pbnRsYyA9PT0gZmlsZWxjICYmIGl0ZW0ub3JpZ2luLnNjcmlwdFBhdGggIT09IG0udXJsKSB7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLl9maWxlTmFtZUFsaWFzZXMuaW5jbHVkZXMobS51cmwpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlnbm9yZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2ZpbGVOYW1lQWxpYXNlcy5wdXNoKG0udXJsKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3BhdXNlZCA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fRGVidWdnZXIucGF1c2UoKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWtwb2ludEZvckNoYW5nZSA9IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWtwb2ludDogaXRlbSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVVybDogbS51cmxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGZpbmRSZXN1bHQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYnJlYWtwb2ludHNGcm9tT2xkTG9jYXRpb24gPSBbXTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2JyZWFrcG9pbnRzLm1hcCgoYnApID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicCAmJlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJwLm9yaWdpbiAmJlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJwLm9yaWdpbi5zY3JpcHRQYXRoICYmXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWtwb2ludEZvckNoYW5nZSAmJlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrcG9pbnRGb3JDaGFuZ2UubVVybCAmJlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrcG9pbnRGb3JDaGFuZ2UuYnJlYWtwb2ludCAmJlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrcG9pbnRGb3JDaGFuZ2UuYnJlYWtwb2ludC5vcmlnaW4gJiZcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVha3BvaW50Rm9yQ2hhbmdlLmJyZWFrcG9pbnQub3JpZ2luLnNjcmlwdFBhdGggJiZcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicC5vcmlnaW4uc2NyaXB0UGF0aCA9PT0gYnJlYWtwb2ludEZvckNoYW5nZS5icmVha3BvaW50Lm9yaWdpbi5zY3JpcHRQYXRoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVha3BvaW50c0Zyb21PbGRMb2NhdGlvbi5wdXNoKHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NyaXB0UGF0aDogYnJlYWtwb2ludEZvckNoYW5nZS5tVXJsLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lTnVtYmVyOiBicC5vcmlnaW4ubGluZU51bWJlclxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChicmVha3BvaW50c0Zyb21PbGRMb2NhdGlvbiAmJiBBcnJheS5pc0FycmF5KGJyZWFrcG9pbnRzRnJvbU9sZExvY2F0aW9uKSAmJiBicmVha3BvaW50c0Zyb21PbGRMb2NhdGlvbi5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgYnJlYWtwb2ludHNGcm9tT2xkTG9jYXRpb25SZXN1bHQgPSBicmVha3BvaW50c0Zyb21PbGRMb2NhdGlvbi5tYXAoYXN5bmMoYnApID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5zZXRCcmVha3BvaW50KGJwLnNjcmlwdFBhdGgsIGJwLmxpbmVOdW1iZXIpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWtwb2ludHNGcm9tT2xkTG9jYXRpb25SZXN1bHQgPSBicmVha3BvaW50c0Zyb21PbGRMb2NhdGlvblJlc3VsdC5maWx0ZXIoKGVsKSA9PiAhIWVsKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9taXNlLmFsbChicmVha3BvaW50c0Zyb21PbGRMb2NhdGlvblJlc3VsdCkudGhlbihhc3luYyh2YWx1ZSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuX0RlYnVnZ2VyLnJlc3VtZSgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3BhdXNlZCA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5fRGVidWdnZXIucGF1c2UoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICB0aGlzLl9jbGllbnQub24oJ0RlYnVnZ2VyLnBhdXNlZCcsIChlKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMuX3BhdXNlZCA9IHRydWU7XHJcbiAgICAgICAgICAgIGlmIChlLnJlYXNvbiA9PT0gJ0JyZWFrIG9uIHN0YXJ0Jykge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fYnJva2VPblN0YXJ0ID0gdHJ1ZTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIC8vIENocm9tZSBkZWJ1Z2dlciBkb2Vzbid0IHNlZW0gdG8gcmVtb3ZlIGJyZWFrcG9pbnRzIHdoZW4gdXNpbmcgcmVtb3ZlQnJlYWtwb2ludFxyXG4gICAgICAgICAgICAgICAgLy8gYW5kICdzb21ldGhpbmcnIGlzIHN0aWxsIGdldHRpbmcgaGl0LiBub3QgY2xlYXIgd2h5IHRoaXMgaXMgaGFwcGVuaW5nLlxyXG4gICAgICAgICAgICAgICAgLy8gdGh1cywgd2UgZW1pdCBicmVhayBldmVudCBvbmx5IGlmIG1hdGNoaW5nIGJyZWFrcG9pbnQgc3RpbGwgZXhpc3RzIGluIHRoaXMuX2JyZWFrcG9pbnRzXHJcblxyXG4gICAgICAgICAgICAgICAgY29uc3QgcG9zc2libGVCcmVha3BvaW50c0RhdGEgPSBbXTtcclxuICAgICAgICAgICAgICAgIGxldCBlQ2FsbEZyYW1lcyA9IFtdO1xyXG5cclxuICAgICAgICAgICAgICAgIGlmIChlICYmIGUuY2FsbEZyYW1lcyAmJiBBcnJheS5pc0FycmF5KGUuY2FsbEZyYW1lcykgJiYgZS5jYWxsRnJhbWVzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgICAgICBlLmNhbGxGcmFtZXMubWFwKChpdGVtKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpdGVtICYmIGl0ZW0udXJsICYmIHRoaXMuaW5CcmVha3BvaW50cyhpdGVtLnVybCkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVDYWxsRnJhbWVzLnB1c2goaXRlbSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBsZXQgYnJlYWtwb2ludHNNYXBSZXN1bHQgPSB0aGlzLl9icmVha3BvaW50cy5tYXAoYXN5bmMoYnApID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoYnAgJiZcclxuICAgICAgICAgICAgICAgICAgICAgICAgYnAubG9jYXRpb25zICYmXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGVDYWxsRnJhbWVzICYmXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGVDYWxsRnJhbWVzWzBdICYmXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJwLmxvY2F0aW9ucy5sZW5ndGggPiAwICYmXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJwLmxvY2F0aW9uc1swXS5zY3JpcHRJZCA9PT0gZUNhbGxGcmFtZXNbMF0ubG9jYXRpb24uc2NyaXB0SWQgJiZcclxuICAgICAgICAgICAgICAgICAgICAgICAgYnAubG9jYXRpb25zWzBdLmxpbmVOdW1iZXIgPT09IGVDYWxsRnJhbWVzWzBdLmxvY2F0aW9uLmxpbmVOdW1iZXIpIHtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGluaXRpYWxEZXB0aCA9IDE7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZSAmJiBlLmNhbGxGcmFtZXMgJiYgQXJyYXkuaXNBcnJheShlLmNhbGxGcmFtZXMpICYmIGUuY2FsbEZyYW1lcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1bmlxdWVTY3JpcHRJZEFyciA9IFtdO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2FsbEZyYW1lcyA9IGUuY2FsbEZyYW1lcy5maWx0ZXIoKGl0ZW0pID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXRlbSAmJiBpdGVtLnVybCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmaW5kZWQgPSB0aGlzLl9icmVha3BvaW50cy5maW5kKChicmVha3BvaW50KSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgcmVzdWx0ID0gZmFsc2U7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJyZWFrcG9pbnQuYnJlYWtwb2ludElkLmVuZHNXaXRoKGl0ZW0udXJsKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmluZGVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXRlbS5sb2NhdGlvbiAmJiBpdGVtLmxvY2F0aW9uLnNjcmlwdElkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHVuaXF1ZVNjcmlwdElkQXJyLmluY2x1ZGVzKGl0ZW0ubG9jYXRpb24uc2NyaXB0SWQpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmlxdWVTY3JpcHRJZEFyci5wdXNoKGl0ZW0ubG9jYXRpb24uc2NyaXB0SWQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmluZGVkO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbEZyYW1lcy5tYXAoYXN5bmMoaXRlbSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgcG9zc2libGVCcmVha3BvaW50cyA9IGF3YWl0IHRoaXMuZ2V0UG9zc2libGVCcmVha3BvaW50cyhpdGVtLmxvY2F0aW9uKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2NyaXB0U291cmNlID0gYXdhaXQgdGhpcy5nZXRTY3JpcHRTb3VyY2UoaXRlbS5sb2NhdGlvbi5zY3JpcHRJZCk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzY3JpcHRTb3VyY2VTcGxpdCA9IHNjcmlwdFNvdXJjZS5zY3JpcHRTb3VyY2Uuc3BsaXQoJ1xcbicpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGZpbGVMaW5lTnVtYmVyc0xlbmd0aCA9IDA7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzY3JpcHRTb3VyY2VTcGxpdCAmJiBBcnJheS5pc0FycmF5KHNjcmlwdFNvdXJjZVNwbGl0KSAmJiBzY3JpcHRTb3VyY2VTcGxpdC5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlTGluZU51bWJlcnNMZW5ndGggPSBzY3JpcHRTb3VyY2VTcGxpdC5sZW5ndGg7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0byBzZWUgaG93IGRlYmJ1Z2VyIHNlZSBzY3JpcHRcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzY3JpcHRTb3VyY2VTcGxpdC5tYXAoKHNjcmlwdFNvdXJjZUl0ZW0sIGlkeCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgIGNvbnNvbGUubG9nKChpZHgpICsgJyAnICsgc2NyaXB0U291cmNlSXRlbSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB9KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zc2libGVCcmVha3BvaW50c0RhdGEucHVzaCh7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVha3BvaW50czogcG9zc2libGVCcmVha3BvaW50cyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGU6IGl0ZW0udXJsLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZUxpbmVOdW1iZXJzTGVuZ3RoOiBmaWxlTGluZU51bWJlcnNMZW5ndGhcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdnZXRTY3JpcHRTb3VyY2UgZScsIGUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBjYWxsRnJhbWVzTWFwUmVzdWx0ID0gYXdhaXQgdGhpcy5wcm9jZXNzQ2FsbEZyYW1lcyhjYWxsRnJhbWVzLCBpbml0aWFsRGVwdGgpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxGcmFtZXNNYXBSZXN1bHQgPSBjYWxsRnJhbWVzTWFwUmVzdWx0LmZpbHRlcigoZWwpID0+ICEhZWwpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjYWxsRnJhbWVzTWFwUmVzdWx0O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICAgICAgYnJlYWtwb2ludHNNYXBSZXN1bHQgPSBicmVha3BvaW50c01hcFJlc3VsdC5maWx0ZXIoKGVsKSA9PiAhIWVsKTtcclxuXHJcbiAgICAgICAgICAgICAgICBQcm9taXNlLmFsbChicmVha3BvaW50c01hcFJlc3VsdCkudGhlbihhc3luYyAoc2NvcGVDaGFpblRyZWUpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoc2NvcGVDaGFpblRyZWUgJiYgQXJyYXkuaXNBcnJheShzY29wZUNoYWluVHJlZSkgJiYgc2NvcGVDaGFpblRyZWUubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBzY29wZUNoYWluVHJlZSA9IHNjb3BlQ2hhaW5UcmVlLmZpbHRlcigoZWwpID0+ICEhZWwpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgYnJlYWtwb2ludERhdGEgPSBudWxsO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYXNzdW1lIHdlIGFsd2F5cyBzZW5kIGJyZWFrcG9pbnQgb2YgdGhlIHRvcCBjYWxsIGZyYW1lXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlQ2FsbEZyYW1lcyAmJiBlQ2FsbEZyYW1lcy5sZW5ndGggPiAwKSB7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWtwb2ludERhdGEgPSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZU51bWJlcjogZUNhbGxGcmFtZXNbMF0ubG9jYXRpb24ubGluZU51bWJlcixcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlTmFtZTogdHJhbnNmb3JtVG9JREVTdHlsZShlQ2FsbEZyYW1lc1swXS51cmwpLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlczogW10sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9O1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuYWRkVmFyaWFibGVzRnJvbVNjb3BlQ2hhaW5UcmVlKGJyZWFrcG9pbnREYXRhLnZhcmlhYmxlcywgc2NvcGVDaGFpblRyZWUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5hZGRPeHlnZW5WYXJpYWJsZXNGcm9tR2xvYmFsU2NvcGUoYnJlYWtwb2ludERhdGEudmFyaWFibGVzKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fYnJlYWtwb2ludEVycm9ycyAmJlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXkuaXNBcnJheSh0aGlzLl9icmVha3BvaW50RXJyb3JzKSAmJlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fYnJlYWtwb2ludEVycm9ycy5sZW5ndGggPiAwXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaXNzZXQgPSB0aGlzLl9icmVha3BvaW50cy5maW5kKChpdGVtKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtICYmXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0ub3JpZ2luICYmXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0ub3JpZ2luLmxpbmVOdW1iZXIgJiZcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2VJbnQoaXRlbS5vcmlnaW4ubGluZU51bWJlcikrMSA9PT0gcGFyc2VJbnQoYnJlYWtwb2ludERhdGEubGluZU51bWJlcilcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGl0ZW07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbSAmJlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtLmxvY2F0aW9ucyAmJlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheS5pc0FycmF5KGl0ZW0ubG9jYXRpb25zKSAmJlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtLmxvY2F0aW9ucy5sZW5ndGggPiAwICYmXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0ubG9jYXRpb25zLmZpbmQobG9jID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBwYXJzZUludChsb2MubGluZU51bWJlcikgPT09IHBhcnNlSW50KGJyZWFrcG9pbnREYXRhLmxpbmVOdW1iZXIpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSAmJlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJzZUludChpdGVtLm9yaWdpbi5saW5lTnVtYmVyKSAhPT0gMSAmJlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJzZUludChicmVha3BvaW50RGF0YS5saW5lTnVtYmVyKSAhPT0gMVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaXRlbTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzc2V0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHJlYWxCcmZpbmRlZCA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2JyZWFrcG9pbnRFcnJvcnMubWFwKChicmVha3BvaW50RXJyb3IpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fYnJlYWtwb2ludHMgJiZcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5LmlzQXJyYXkodGhpcy5fYnJlYWtwb2ludHMpICYmXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9icmVha3BvaW50cy5sZW5ndGggPiAwXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fYnJlYWtwb2ludHMubWFwKChicikgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJyRmlsZU5hbWUgPSB0cmFuc2Zvcm1Ub0lERVN0eWxlKGJyLm9yaWdpbi5zY3JpcHRQYXRoKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHBvc3NpYmxlQnJlYWtwb2ludERhdGE7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3NzaWJsZUJyZWFrcG9pbnRzRGF0YSAmJlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheS5pc0FycmF5KHBvc3NpYmxlQnJlYWtwb2ludHNEYXRhKSAmJlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3NzaWJsZUJyZWFrcG9pbnRzRGF0YS5sZW5ndGggPiAwXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc3NpYmxlQnJlYWtwb2ludERhdGEgPSBwb3NzaWJsZUJyZWFrcG9pbnRzRGF0YS5maW5kKChpdGVtKSA9PiBpdGVtLmZpbGUgPT09IGVDYWxsRnJhbWVzWzBdLnVybCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyRmlsZU5hbWUgPT09IGJyZWFrcG9pbnREYXRhLmZpbGVOYW1lICYmXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc3NpYmxlQnJlYWtwb2ludERhdGEgJiZcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZW9mIHBvc3NpYmxlQnJlYWtwb2ludERhdGEuZmlsZUxpbmVOdW1iZXJzTGVuZ3RoICE9PSAndW5kZWZpbmVkJyAmJlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVha3BvaW50RGF0YS5saW5lTnVtYmVyKzEgPT09IGJyLm9yaWdpbi5saW5lTnVtYmVyIHx8XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBici5vcmlnaW4ubGluZU51bWJlcisxID09PSBwb3NzaWJsZUJyZWFrcG9pbnREYXRhLmZpbGVMaW5lTnVtYmVyc0xlbmd0aFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWxCcmZpbmRlZCA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFyZWFsQnJmaW5kZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWtwb2ludERhdGEucmVzb2x2ZWQgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHBvc3NpYmxlQnJlYWtwb2ludERhdGE7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3NzaWJsZUJyZWFrcG9pbnRzRGF0YSAmJlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXkuaXNBcnJheShwb3NzaWJsZUJyZWFrcG9pbnRzRGF0YSkgJiZcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc3NpYmxlQnJlYWtwb2ludHNEYXRhLmxlbmd0aCA+IDBcclxuICAgICAgICAgICAgICAgICAgICAgICAgKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3NzaWJsZUJyZWFrcG9pbnREYXRhID0gcG9zc2libGVCcmVha3BvaW50c0RhdGEuZmluZCgoaXRlbSkgPT4gaXRlbS5maWxlID09PSBlQ2FsbEZyYW1lc1swXS51cmwpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3NzaWJsZUJyZWFrcG9pbnREYXRhICYmXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlb2YgcG9zc2libGVCcmVha3BvaW50RGF0YS5maWxlTGluZU51bWJlcnNMZW5ndGggIT09ICd1bmRlZmluZWQnICYmXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVha3BvaW50RGF0YS5saW5lTnVtYmVyKzEgPj0gcG9zc2libGVCcmVha3BvaW50RGF0YS5maWxlTGluZU51bWJlcnNMZW5ndGhcclxuICAgICAgICAgICAgICAgICAgICAgICAgKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVha3BvaW50RGF0YS5saW5lTnVtYmVyID0gcG9zc2libGVCcmVha3BvaW50RGF0YS5maWxlTGluZU51bWJlcnNMZW5ndGggLSAyO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmVtaXQoJ2JyZWFrJywgYnJlYWtwb2ludERhdGEpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fYnJlYWtwb2ludEVycm9ycyAmJlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXkuaXNBcnJheSh0aGlzLl9icmVha3BvaW50RXJyb3JzKSAmJlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fYnJlYWtwb2ludEVycm9ycy5sZW5ndGggPiAwXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fYnJlYWtwb2ludEVycm9ycy5tYXAoKGJyZWFrcG9pbnRFcnJvcikgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChicmVha3BvaW50RXJyb3IgJiYgYnJlYWtwb2ludEVycm9yLm1zZyAmJiBicmVha3BvaW50RXJyb3IuZmlsZU5hbWUgJiYgYnJlYWtwb2ludEVycm9yLmxpbmUpIHtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBtc2c7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBpZ25vcmUgPSBmYWxzZTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwb3NzaWJsZUJyZWFrcG9pbnRzRGF0YSAmJiBBcnJheS5pc0FycmF5KHBvc3NpYmxlQnJlYWtwb2ludHNEYXRhKSAmJiBwb3NzaWJsZUJyZWFrcG9pbnRzRGF0YS5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3NzaWJsZUJyZWFrcG9pbnRzRGF0YS5tYXAoKGl0ZW0pID0+IHtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbS5maWxlID0gdHJhbnNmb3JtVG9JREVTdHlsZShpdGVtLmZpbGUpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0gJiZcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbS5maWxlID09PSBicmVha3BvaW50RXJyb3IuZmlsZU5hbWUgJiYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3NzaWJsZUJyZWFrcG9pbnREYXRhICYmXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVvZiBpdGVtLmZpbGVMaW5lTnVtYmVyc0xlbmd0aCAhPT0gJ3VuZGVmaW5lZCdcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGxpbmU7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYnJlYWtwb2ludEVycm9yLmxpbmUgPj0gaXRlbS5maWxlTGluZU51bWJlcnNMZW5ndGgpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmUgPSBicmVha3BvaW50RXJyb3IubGluZSAtIDI7IC8vIC8vIyBzb3VyY2VNYXBwaW5nVVJMIGFuZCB9LmNhbGwodGhpcywgZXhwb3J0cywgcmVxdWlyZSwgbW9kdWxlLCBfX2ZpbGVuYW1lLCBfX2Rpcm5hbWUpOyB9KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmUgPSBicmVha3BvaW50RXJyb3IubGluZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGl0ZW0uYnJlYWtwb2ludHMgJiYgQXJyYXkuaXNBcnJheShpdGVtLmJyZWFrcG9pbnRzKSAmJiBpdGVtLmJyZWFrcG9pbnRzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChicmVha3BvaW50RXJyb3IgJiYgYnJlYWtwb2ludEVycm9yLm1zZyAmJiBicmVha3BvaW50RXJyb3IubXNnLmluY2x1ZGVzKCdQb3NzaWJsZSBicmVha3BvaW50IGxpbmVzJykpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpZ25vcmVcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGl0ZW0uYnJlYWtwb2ludHMuaW5jbHVkZXMobGluZSkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWdub3JlID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1zZyA9IGJyZWFrcG9pbnRFcnJvci5tc2c7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXNnICs9IGAke2xpbmV9LiBgO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1zZyArPSBgIFBvc3NpYmxlIGJyZWFrcG9pbnQgbGluZXMgOiAke2l0ZW0uYnJlYWtwb2ludHMubWFwKChsaW5lKSA9PiBsaW5lKS5qb2luKCcsICcpfWA7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYnJlYWtwb2ludEVycm9yICYmIGJyZWFrcG9pbnRFcnJvci5tc2cgJiYgYnJlYWtwb2ludEVycm9yLm1zZy5pbmNsdWRlcygncG9zc2libGUgYnJlYWtwb2ludCBsaW5lcycpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWdub3JlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1zZyA9IGJyZWFrcG9pbnRFcnJvci5tc2c7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXNnICs9IGAke2xpbmV9LiBgO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1zZyArPSAnIEZpbGUgZG9uXFwndCBoYXZlIHBvc3NpYmxlIGJyZWFrcG9pbnQgbGluZXMnO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaWdub3JlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmVtaXQoJ2JyZWFrRXJyb3InLCB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogbXNnLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVOdW1iZXI6IGJyZWFrcG9pbnRFcnJvci5saW5lLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVOYW1lOiBicmVha3BvaW50RXJyb3IuZmlsZU5hbWVcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZS5yZWFzb24gPT09ICdPT00nKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBPdXQgb2YgbWVtb3J5IGxlYWtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY29udGludWUoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICB9LCByZWFzb24gPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKCdicmVha3BvaW50c01hcFJlc3VsdCByZXMgcmVhc29uJyAsIHJlYXNvbik7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgdGhpcy5fY2xpZW50Lm9uKCdEZWJ1Z2dlci5icmVha3BvaW50UmVzb2x2ZWQnLCAoZSkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLm9uQnJlYWtwb2ludFJlc29sdmVkKGUpO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBjb25zdCB7IERlYnVnZ2VyLCBSdW50aW1lIH0gPSB0aGlzLl9jbGllbnQ7XHJcbiAgICAgICAgdGhpcy5fRGVidWdnZXIgPSBEZWJ1Z2dlcjtcclxuICAgICAgICB0aGlzLl9SdW50aW1lID0gUnVudGltZTtcclxuICAgICAgICBSdW50aW1lLmVuYWJsZSgpO1xyXG4gICAgICAgIERlYnVnZ2VyLmVuYWJsZSgpO1xyXG4gICAgICAgIERlYnVnZ2VyLnNldFBhdXNlT25FeGNlcHRpb25zKHsgc3RhdGU6ICdub25lJyB9KTtcclxuICAgICAgICBEZWJ1Z2dlci5zZXRBc3luY0NhbGxTdGFja0RlcHRoKHsgbWF4RGVwdGg6IDMyIH0pO1xyXG4gICAgICAgIERlYnVnZ2VyLnNldEJsYWNrYm94UGF0dGVybnMoeyBwYXR0ZXJuczogW10gfSk7XHJcbiAgICAgICAgLy8gb25seSB1c2UgJ2F3YWl0JyBmb3IgdGhlIGxhc3QgY2FsbCwgYWxsIHByZXZpb3VzIGNhbGwgdG8gRGVidWdnZXIgb3IgUnVudGltZSB3aWxsIHN0YWNrIG90aGVyd2lzZVxyXG4gICAgICAgIGF3YWl0IFJ1bnRpbWUucnVuSWZXYWl0aW5nRm9yRGVidWdnZXIoKTtcclxuICAgICAgICAvLyBhd2FpdCBmb3IgdGhlIGZpcnN0IGJyZWFrcG9pbnQgd2hpY2ggaXMgcGxhY2VkIGJ5IHRoZSBkZWJ1Z2dlciBhdXRvbWF0aWNhbGx5IFxyXG4gICAgICAgIGF3YWl0IHRoaXMuX0RlYnVnZ2VyLnBhdXNlZCgpO1xyXG4gICAgICAgIHRoaXMuZW1pdCgncmVhZHknKTtcclxuICAgIH1cclxuXHJcbiAgICBvbkJyZWFrcG9pbnRSZXNvbHZlZChlKSB7XHJcbiAgICAgICAgLy8gYnJlYWtwb2ludHMgc2V0IGJlZm9yZSB0aGUgc2NyaXB0IHdhcyBsb2FkZWQgd2lsbCBiZSByZXNvbHZlZCBvbmNlIGl0IGxvYWRzXHJcbiAgICAgICAgZm9yICh2YXIgYnAgb2YgdGhpcy5fYnJlYWtwb2ludHMpIHtcclxuICAgICAgICAgICAgaWYgKFxyXG4gICAgICAgICAgICAgICAgYnAgJiZcclxuICAgICAgICAgICAgICAgIGUgJiZcclxuICAgICAgICAgICAgICAgIGJwLmJyZWFrcG9pbnRJZCA9PT0gZS5icmVha3BvaW50SWRcclxuICAgICAgICAgICAgKSB7XHJcblxyXG4gICAgICAgICAgICAgICAgbGV0IHZhbGlkYXRlUmVzdWx0O1xyXG4gICAgICAgICAgICAgICAgaWYgKCBlLmxvY2F0aW9uICkge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIHJlc29sdmVkIG9uIHJ1bnRpbWVcclxuICAgICAgICAgICAgICAgICAgICBicC5sb2NhdGlvbnMgPSBbZS5sb2NhdGlvbl07XHJcbiAgICAgICAgICAgICAgICAgICAgdmFsaWRhdGVSZXN1bHQgPSB2YWxpZGF0ZUJyZWFrcG9pbnQoYnApO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICggZS5sb2NhdGlvbnMgKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gcmVzb2x2ZWQgb24gcGF1c2VcclxuICAgICAgICAgICAgICAgICAgICB2YWxpZGF0ZVJlc3VsdCA9IHZhbGlkYXRlQnJlYWtwb2ludChicCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKHZhbGlkYXRlUmVzdWx0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fYnJlYWtwb2ludEVycm9ycy5wdXNoKHZhbGlkYXRlUmVzdWx0KTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIENvbm5lY3RzIHRvIGEgZGVidWdnZXIuIERvZXMgbm90aGluZyBpZiBhbHJlYWR5IGNvbm5lY3RlZC5cclxuICAgICAqIEBwYXJhbSB7SW50ZWdlcn0gRGVidWdnZXIgcG9ydC5cclxuICAgICAqL1xyXG4gICAgYXN5bmMgY29ubmVjdChwb3J0LCBob3N0KSB7XHJcbiAgICAgICAgdGhpcy5fcG9ydCA9IHBvcnQ7XHJcbiAgICAgICAgdGhpcy5faG9zdCA9IGhvc3QgfHwgJ2xvY2FsaG9zdCc7XHJcblxyXG4gICAgICAgIGxldCBzbm9vemVUaW1lID0gMTAwMDtcclxuICAgICAgICBsZXQgbGFzdEVycm9yID0gbnVsbDtcclxuXHJcbiAgICAgICAgZm9yIChsZXQgcmV0cmllcyA9IDA7IHJldHJpZXMgPCBDT05ORUNUX1JFVFJJRVM7IHJldHJpZXMrKykge1xyXG4gICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fY2xpZW50ID0gYXdhaXQgQ0RQKHsgcG9ydDogdGhpcy5fcG9ydCwgaG9zdDogdGhpcy5faG9zdCB9KTtcclxuICAgICAgICAgICAgICAgIGxhc3RFcnJvciA9IG51bGw7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICAgICAgbGFzdEVycm9yID0gZTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgbG9nLndhcm4oYERlYnVnZ2VyIGNvbm5lY3Rpb24gZmFpbGVkLiBXaWxsIHJldHJ5IGluICR7c25vb3plVGltZS8xMDAwfXMuIEVycm9yOiBgLCBsYXN0RXJyb3IpO1xyXG4gICAgICAgICAgICBhd2FpdCBzbm9vemUoc25vb3plVGltZSk7XHJcbiAgICAgICAgICAgIHNub296ZVRpbWUgKj0gQ09OTkVDVF9TTk9PWkVfSU5URVJWQUxfTVVMVDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChsYXN0RXJyb3IpIHtcclxuICAgICAgICAgICAgbG9nLmVycm9yKCdGYWlsZWQgdG8gY29ubmVjdCB0byB0aGUgZGVidWdnZXI6ICcsIGxhc3RFcnJvcik7XHJcbiAgICAgICAgICAgIHRocm93IGxhc3RFcnJvcjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGF3YWl0IHRoaXMuY29udGludWVDb25uZWN0KCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXQgYnJlYWtwb2ludCBmb3IgYSBwYXJ0aWN1bGFyIHNjcmlwdC5cclxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBTY3JpcHQgcGF0aC5cclxuICAgICAqIEBwYXJhbSB7SW50ZWdlcn0gTGluZSBudW1iZXIuXHJcbiAgICAgKi9cclxuICAgIGFzeW5jIHNldEJyZWFrcG9pbnQoc2NyaXB0UGF0aCwgbGluZU51bWJlcikge1xyXG4gICAgICAgIGxldCBmaWxlTmFtZSA9IHNjcmlwdFBhdGg7XHJcblxyXG4gICAgICAgIGNvbnN0IGFsaWFzUmVzdWx0ID0gdGhpcy5pbkZpbGVOYW1lQWxpYXNlcyhmaWxlTmFtZSk7XHJcblxyXG4gICAgICAgIGlmIChhbGlhc1Jlc3VsdCkge1xyXG4gICAgICAgICAgICBmaWxlTmFtZSA9IGFsaWFzUmVzdWx0O1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgZmlsZU5hbWUgPSB1cmwucGF0aFRvRmlsZVVSTChmaWxlTmFtZSkudG9TdHJpbmcoKTtcclxuICAgICAgICBsZXQgZXJyID0gbnVsbDtcclxuXHJcbiAgICAgICAgbGV0IGJyZWFrcG9pbnQgPSBhd2FpdCB0aGlzLl9EZWJ1Z2dlci5zZXRCcmVha3BvaW50QnlVcmwoe1xyXG4gICAgICAgICAgICB1cmw6IGZpbGVOYW1lLFxyXG4gICAgICAgICAgICBsaW5lTnVtYmVyOiBsaW5lTnVtYmVyLTEsIC8vIGZyb20gMS1iYXNlIHRvIDAtYmFzZVxyXG4gICAgICAgICAgICBjb2x1bW5OdW1iZXI6IDBcclxuICAgICAgICB9KS5jYXRjaChlID0+IHtcclxuICAgICAgICAgICAgZXJyID0gZTtcclxuICAgICAgICAgICAgLy8gaWdub3JlIGVycm9yIHdoZW4gdHJ5aW5nIHRvIHNldCBhbiBsYXJlYWR5IGV4aXN0aW5nIGJyZWFrcG9pbnRcclxuICAgICAgICAgICAgaWYgKCFlLnJlc3BvbnNlIHx8IGUucmVzcG9uc2UubWVzc2FnZSAhPT0gJ0JyZWFrcG9pbnQgYXQgc3BlY2lmaWVkIGxvY2F0aW9uIGFscmVhZHkgZXhpc3RzLicpIHtcclxuICAgICAgICAgICAgICAgIHRocm93IGU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgICAgICBpZiAoZXJyKSB7XHJcbiAgICAgICAgICAgIC8vIGlnbm9yZVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGJyZWFrcG9pbnQub3JpZ2luID0ge1xyXG4gICAgICAgICAgICAgICAgc2NyaXB0UGF0aDogZmlsZU5hbWUsXHJcbiAgICAgICAgICAgICAgICBsaW5lTnVtYmVyOiBsaW5lTnVtYmVyXHJcbiAgICAgICAgICAgIH07XHJcblxyXG4gICAgICAgICAgICB0aGlzLl9icmVha3BvaW50cy5wdXNoKGJyZWFrcG9pbnQpO1xyXG5cclxuICAgICAgICAgICAgaWYgKGJyZWFrcG9pbnQpIHtcclxuICAgICAgICAgICAgICAgIC8vIG5ldyBicmVhY2twb2ludCByZXNvbHZlZCBzdWNjZXNzXHJcbiAgICAgICAgICAgICAgICB0aGlzLm9uQnJlYWtwb2ludFJlc29sdmVkKGJyZWFrcG9pbnQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gYnJlYWtwb2ludDtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBzZXRCcmVha3BvaW50c0FjdGl2ZShhY3RpdmUpIHtcclxuICAgICAgICBpZiAodGhpcy5fRGVidWdnZXIgJiYgdGhpcy5fRGVidWdnZXIuc2V0QnJlYWtwb2ludHNBY3RpdmUpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuX0RlYnVnZ2VyLnNldEJyZWFrcG9pbnRzQWN0aXZlKHsnYWN0aXZlJzogYWN0aXZlfSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgYXdhaXQgc25vb3plKDUwMCk7XHJcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCB0aGlzLnNldEJyZWFrcG9pbnRzQWN0aXZlKGFjdGl2ZSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIHJlbW92ZUJyZWFrcG9pbnQoYnJlYWtwb2ludElkKSB7XHJcbiAgICAgICAgdGhpcy5fYnJlYWtwb2ludHMgPSB0aGlzLl9icmVha3BvaW50cy5maWx0ZXIoKGJwKSA9PiB7XHJcbiAgICAgICAgICAgIHJldHVybiBicC5icmVha3BvaW50SWQgIT09IGJyZWFrcG9pbnRJZDtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgY29uc3QgcmVtb3ZlQnIgPSB7IGJyZWFrcG9pbnRJZDogYnJlYWtwb2ludElkIH07XHJcblxyXG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLl9EZWJ1Z2dlci5yZW1vdmVCcmVha3BvaW50KHJlbW92ZUJyKTtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBjb250aW51ZSgpIHtcclxuICAgICAgICBpZiAodGhpcy5fcGF1c2VkKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX3BhdXNlZCA9IGZhbHNlO1xyXG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5fRGVidWdnZXIucmVzdW1lKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIHJlc3VtZSgpIHtcclxuICAgICAgICBpZiAodGhpcy5fcGF1c2VkKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX3BhdXNlZCA9IGZhbHNlO1xyXG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5fRGVidWdnZXIucmVzdW1lKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIHJlc3VtZVRlcm1pbmF0ZSgpIHtcclxuICAgICAgICBpZiAodGhpcy5fcGF1c2VkKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX3BhdXNlZCA9IGZhbHNlO1xyXG4gICAgICAgICAgICBhd2FpdCB0aGlzLl9EZWJ1Z2dlci5yZXN1bWUodHJ1ZSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIGRpc2FibGUoKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuX3BhdXNlZCkge1xyXG4gICAgICAgICAgICB0aGlzLl9wYXVzZWQgPSBmYWxzZTtcclxuICAgICAgICAgICAgYXdhaXQgdGhpcy5fRGVidWdnZXIuZGlzYWJsZSh0cnVlKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgcmVtb3ZlQnJlYWtwb2ludEJ5VmFsdWUoZmlsZVBhdGgsIGlucHV0TGluZSkge1xyXG5cclxuICAgICAgICBjb25zdCBmaWxlUGF0aEFsaWFzID0gdGhpcy5pbkZpbGVOYW1lQWxpYXNlcyhmaWxlUGF0aCk7XHJcblxyXG4gICAgICAgIGNvbnN0IGxpbmUgPSBpbnB1dExpbmUgLSAxOyAvLyBmcm9tIDEtYmFzZSB0byAwLWJhc2VcclxuICAgICAgICBjb25zdCBzZWxmID0gdGhpcztcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuX2JyZWFrcG9pbnRzKSB7XHJcbiAgICAgICAgICAgIGZvciAobGV0IGIgb2YgdGhpcy5fYnJlYWtwb2ludHMpIHtcclxuICAgICAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGIgJiYgYi5icmVha3BvaW50SWQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcGFydHMgPSBiLmJyZWFrcG9pbnRJZC5zcGxpdCgnOicpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgZmlsZU5hbWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBsaW5lTnVtYmVyO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByb2Nlc3MucGxhdGZvcm0gPT09ICd3aW4zMicpIHsgLy8gcGF0aCBtYXkgY29udGFpbiBhIERyaXZlIGxldHRlciBvbiB3aW4zMlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZU5hbWUgPSBwYXJ0c1twYXJ0cy5sZW5ndGgtMl0gKyAnOicgKyBwYXJ0c1twYXJ0cy5sZW5ndGgtMV07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lTnVtYmVyID0gcGFyc2VJbnQocGFydHNbMV0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZU5hbWUgPSBwYXJ0c1twYXJ0cy5sZW5ndGgtMV07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lTnVtYmVyID0gcGFyc2VJbnQocGFydHNbMV0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZmlsZU5hbWUgPT09IGZpbGVQYXRoIHx8IGZpbGVOYW1lID09PSBmaWxlUGF0aEFsaWFzKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgbGluZU51bWJlciA9PT0gbGluZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IHNlbGYucmVtb3ZlQnJlYWtwb2ludChiLmJyZWFrcG9pbnRJZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbG9nLmVycm9yKCdGYWlsZWQgd2hlbiB3b3JrIHdpdGggYnJlYWtwb2ludCBkYXRhOicsIGUpO1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBjbGVhckJyZWFrcG9pbnRzKCkge1xyXG4gICAgICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xyXG4gICAgICAgIGlmICh0aGlzLl9icmVha3BvaW50cykge1xyXG4gICAgICAgICAgICBmb3IgKGxldCBiIG9mIHRoaXMuX2JyZWFrcG9pbnRzKSB7XHJcbiAgICAgICAgICAgICAgICBhd2FpdCBzZWxmLnJlbW92ZUJyZWFrcG9pbnQoYi5icmVha3BvaW50SWQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIGdldFBvc3NpYmxlQnJlYWtwb2ludHMoc3RhcnRMb2NhdGlvbikge1xyXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IFtdO1xyXG4gICAgICAgIGNvbnN0IHBvc3NpYmxlQnJlYWtwb2ludHMgPSBhd2FpdCB0aGlzLl9EZWJ1Z2dlci5nZXRQb3NzaWJsZUJyZWFrcG9pbnRzKHtcclxuICAgICAgICAgICAgc3RhcnQ6IHtcclxuICAgICAgICAgICAgICAgIHNjcmlwdElkOiBzdGFydExvY2F0aW9uLnNjcmlwdElkLFxyXG4gICAgICAgICAgICAgICAgbGluZU51bWJlcjogMCxcclxuICAgICAgICAgICAgICAgIGNvbHVtbk51bWJlcjogMFxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIGlmIChwb3NzaWJsZUJyZWFrcG9pbnRzICYmIHBvc3NpYmxlQnJlYWtwb2ludHMubG9jYXRpb25zICYmIEFycmF5LmlzQXJyYXkocG9zc2libGVCcmVha3BvaW50cy5sb2NhdGlvbnMpICYmIHBvc3NpYmxlQnJlYWtwb2ludHMubG9jYXRpb25zLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgcG9zc2libGVCcmVha3BvaW50cy5sb2NhdGlvbnMubWFwKChpdGVtKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBpZiAoaXRlbSAmJiB0eXBlb2YgaXRlbS5saW5lTnVtYmVyICE9PSAndW5kZWZpbmVkJykge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGxpbmVOdW1iZXIgPSBpdGVtLmxpbmVOdW1iZXIgKyAxOyAvLyBmcm9tIDAtYmFzZSB0byAxLWJhc2VcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdC5pbmNsdWRlcyhsaW5lTnVtYmVyKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvL2lnbm9yZVxyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKGxpbmVOdW1iZXIpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAocmVzdWx0ICYmIEFycmF5LmlzQXJyYXkocmVzdWx0KSAmJiByZXN1bHQubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICBsZXQgcCA9IHJlc3VsdC5wb3AoKTtcclxuXHJcbiAgICAgICAgICAgIGlmIChyZXN1bHQuaW5jbHVkZXMocC0xKSkge1xyXG4gICAgICAgICAgICAgICAgLy9pbmdvcmVcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGlmIChwLTEgPiAxKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2gocC0xKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBnZXRTY3JpcHRTb3VyY2Uoc2NyaXB0SWQpIHtcclxuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5fRGVidWdnZXIuZ2V0U2NyaXB0U291cmNlKHsgc2NyaXB0SWQ6IHNjcmlwdElkIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIGNsb3NlKCkge1xyXG4gICAgICAgIGF3YWl0IHRoaXMucmVzZXQoKTtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBhZGRWYXJpYWJsZXNGcm9tU2NvcGVDaGFpblRyZWUodmFyaWFibGVzLCBzY29wZUNoYWluVHJlZSkge1xyXG4gICAgICAgIGlmIChcclxuICAgICAgICAgICAgIUFycmF5LmlzQXJyYXkoc2NvcGVDaGFpblRyZWUpXHJcbiAgICAgICAgICAgIHx8IHNjb3BlQ2hhaW5UcmVlLmxlbmd0aCA9PSAwXHJcbiAgICAgICAgICAgIHx8ICFBcnJheS5pc0FycmF5KHNjb3BlQ2hhaW5UcmVlWzBdKVxyXG4gICAgICAgICAgICB8fCBzY29wZUNoYWluVHJlZVswXS5sZW5ndGggPT0gMFxyXG4gICAgICAgICAgICB8fCAhQXJyYXkuaXNBcnJheShzY29wZUNoYWluVHJlZVswXVswXSlcclxuICAgICAgICAgICAgfHwgc2NvcGVDaGFpblRyZWVbMF1bMF0ubGVuZ3RoID09IDBcclxuICAgICAgICApIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCB7IG9iamVjdElkUmVzcG9uc2UgfSA9IHNjb3BlQ2hhaW5UcmVlWzBdWzBdWzBdO1xyXG4gICAgICAgIGNvbnN0IHsgcmVzdWx0IH0gPSBvYmplY3RJZFJlc3BvbnNlO1xyXG4gICAgICAgIGZvciAoY29uc3Qgc2NvcGVWYXIgb2YgcmVzdWx0KSB7XHJcbiAgICAgICAgICAgIGlmICghSUdOT1JFX1NDT1BFX0NIQUlOX1ZBUklBQkxFUy5pbmNsdWRlcyhzY29wZVZhci5uYW1lKSkge1xyXG4gICAgICAgICAgICAgICAgdmFyIHZhbHVlO1xyXG4gICAgICAgICAgICAgICAgdmFyIHR5cGU7XHJcbiAgICAgICAgICAgICAgICBpZiAoc2NvcGVWYXIgJiYgc2NvcGVWYXIudmFsdWUpIHtcclxuICAgICAgICAgICAgICAgICAgICB0eXBlID0gc2NvcGVWYXIudmFsdWUudHlwZTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoc2NvcGVWYXIudmFsdWUudmFsdWUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBzY29wZVZhci52YWx1ZS52YWx1ZTtcclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IGF3YWl0IHRoaXMudHJ5VG9SZXRyaWV2ZU9iamVjdFZhbHVlKHNjb3BlVmFyLnZhbHVlLm9iamVjdElkKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB2YXJpYWJsZXMucHVzaCh7XHJcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogc2NvcGVWYXIubmFtZSxcclxuICAgICAgICAgICAgICAgICAgICB0eXBlOiB0eXBlIHx8ICd1bmRlZmluZWQnLFxyXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlLFxyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgdHJ5VG9SZXRyaWV2ZU9iamVjdFZhbHVlKG9iamVjdElkKSB7XHJcbiAgICAgICAgaWYgKCFvYmplY3RJZCkge1xyXG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBjb25zdCB7IHJlc3VsdCB9ID0gYXdhaXQgdGhpcy5fUnVudGltZS5nZXRQcm9wZXJ0aWVzKHsgb2JqZWN0SWQgfSk7XHJcbiAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KHJlc3VsdCkgJiYgcmVzdWx0Lmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IG9ialZhbHVlID0ge307XHJcbiAgICAgICAgICAgICAgICByZXN1bHQuZm9yRWFjaChwcm9wRGVzYyA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHByb3BEZXNjLnZhbHVlICYmIHByb3BEZXNjLnZhbHVlLnZhbHVlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG9ialZhbHVlW3Byb3BEZXNjLm5hbWVdID0gcHJvcERlc2MudmFsdWUudmFsdWU7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gb2JqVmFsdWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgY29uc29sZS5lcnJvcignUnVudGltZS5nZXRQcm9wZXJ0aWVzIGNhbGwgZmFpbGVkJywgZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgYWRkT3h5Z2VuVmFyaWFibGVzRnJvbUdsb2JhbFNjb3BlKHZhcmlhYmxlcykge1xyXG4gICAgICAgIGNvbnN0IHsgcmVzdWx0OiBwb0V2YWxSZXN1bHQgfSA9IGF3YWl0IHRoaXMuX1J1bnRpbWUuZXZhbHVhdGUoeyBleHByZXNzaW9uOiAncG8nLCByZXR1cm5CeVZhbHVlOiB0cnVlIH0pO1xyXG4gICAgICAgIGNvbnN0IHsgcmVzdWx0OiBlbnZFdmFsUmVzdWx0IH0gPSBhd2FpdCB0aGlzLl9SdW50aW1lLmV2YWx1YXRlKHsgZXhwcmVzc2lvbjogJ2VudicsIHJldHVybkJ5VmFsdWU6IHRydWUgfSk7XHJcbiAgICAgICAgY29uc3QgeyByZXN1bHQ6IHZhcnNFdmFsUmVzdWx0IH0gPSBhd2FpdCB0aGlzLl9SdW50aW1lLmV2YWx1YXRlKHsgZXhwcmVzc2lvbjogJ3ZhcnMnLCByZXR1cm5CeVZhbHVlOiB0cnVlIH0pO1xyXG4gICAgICAgIGNvbnN0IHsgcmVzdWx0OiBwYXJhbXNFdmFsUmVzdWx0IH0gPSBhd2FpdCB0aGlzLl9SdW50aW1lLmV2YWx1YXRlKHsgZXhwcmVzc2lvbjogJ3BhcmFtcycsIHJldHVybkJ5VmFsdWU6IHRydWUgfSk7XHJcbiAgICAgICAgY29uc3QgcmVzdWx0cyA9IHtcclxuICAgICAgICAgICAgcG86IHBvRXZhbFJlc3VsdCxcclxuICAgICAgICAgICAgZW52OiBlbnZFdmFsUmVzdWx0LFxyXG4gICAgICAgICAgICB2YXJzOiB2YXJzRXZhbFJlc3VsdCxcclxuICAgICAgICAgICAgcGFyYW1zOiBwYXJhbXNFdmFsUmVzdWx0LFxyXG4gICAgICAgIH07XHJcbiAgICAgICAgT2JqZWN0LmtleXMocmVzdWx0cykuZm9yRWFjaChrZXkgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSByZXN1bHRzW2tleV07XHJcbiAgICAgICAgICAgIGlmIChyZXN1bHQudmFsdWUpIHtcclxuICAgICAgICAgICAgICAgIHZhcmlhYmxlcy5wdXNoKHtcclxuICAgICAgICAgICAgICAgICAgICBuYW1lOiBrZXksXHJcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogJ29iamVjdCcsXHJcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IHJlc3VsdC52YWx1ZSxcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0QnJlYWtwb2ludHMoZmlsZVBhdGgpIHtcclxuICAgICAgICB2YXIgYnBzID0gW107XHJcbiAgICAgICAgZm9yIChsZXQgYiBvZiB0aGlzLl9icmVha3BvaW50cykge1xyXG4gICAgICAgICAgICBjb25zdCBwYXJ0cyA9IGIuYnJlYWtwb2ludElkLnNwbGl0KCc6Jyk7XHJcbiAgICAgICAgICAgIGxldCBmaWxlTmFtZTtcclxuICAgICAgICAgICAgbGV0IGxpbmVOdW1iZXI7XHJcblxyXG4gICAgICAgICAgICBpZiAocHJvY2Vzcy5wbGF0Zm9ybSA9PT0gJ3dpbjMyJykgeyAvLyBwYXRoIG1heSBjb250YWluIGEgRHJpdmUgbGV0dGVyIG9uIHdpbjMyXHJcbiAgICAgICAgICAgICAgICBmaWxlTmFtZSA9IHBhcnRzW3BhcnRzLmxlbmd0aC0yXSArICc6JyArIHBhcnRzW3BhcnRzLmxlbmd0aC0xXTtcclxuICAgICAgICAgICAgICAgIGxpbmVOdW1iZXIgPSBwYXJzZUludChwYXJ0c1sxXSkrMTsgLy9mcm9tIDAtYmFzZSB0byAxLWJhc2VcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGZpbGVOYW1lID0gcGFydHNbcGFydHMubGVuZ3RoLTFdO1xyXG4gICAgICAgICAgICAgICAgbGluZU51bWJlciA9IHBhcnNlSW50KHBhcnRzWzFdKSsxOyAvL2Zyb20gMC1iYXNlIHRvIDEtYmFzZVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAoZmlsZU5hbWUgPT09IGZpbGVQYXRoKSB7XHJcbiAgICAgICAgICAgICAgICBicHMucHVzaChsaW5lTnVtYmVyKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGZpbGVQYXRoQWxpYXMgPSB0aGlzLmluRmlsZU5hbWVBbGlhc2VzKGZpbGVQYXRoKTtcclxuICAgICAgICAgICAgICAgIGlmIChmaWxlUGF0aEFsaWFzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgYnBzLnB1c2gobGluZU51bWJlcik7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGJwcztcclxuICAgIH1cclxufVxyXG4iXX0=
823
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJsb2ciLCJsb2dnZXIiLCJFdmVudEVtaXR0ZXIiLCJyZXF1aXJlIiwiQ0RQIiwiQ09OTkVDVF9SRVRSSUVTIiwiQ09OTkVDVF9TTk9PWkVfSU5URVJWQUxfTVVMVCIsIk1BWF9ERVBUSCIsIklHTk9SRV9TQ09QRV9DSEFJTl9WQVJJQUJMRVMiLCJtYXhGaW5kZWREZXB0aCIsInRyYW5zZm9ybVRvSURFU3R5bGUiLCJmaWxlTmFtZSIsInVyaUluZGV4IiwiaW5kZXhPZiIsImJwRGF0YSIsInN1YnN0cmluZyIsInVyaSIsInByb2Nlc3MiLCJwbGF0Zm9ybSIsInN0YXJ0c1dpdGgiLCJsZW5ndGgiLCJ1cmwiLCJmaWxlVVJMVG9QYXRoIiwiZSIsImNvbnNvbGUiLCJlcnJvciIsInNub296ZSIsIm1zIiwiUHJvbWlzZSIsInJlc29sdmUiLCJzZXRUaW1lb3V0IiwiZGVsZXRlVmFsdWVzIiwiYXJyIiwiZGVwdGgiLCJyZXN1bHQiLCJtYXAiLCJpdGVtIiwidmFsdWUiLCJjbGFzc05hbWUiLCJjbG9uZVZhbHVlIiwiT2JqZWN0IiwiYXNzaWduIiwib2JqZWN0SWQiLCJjbG9uZSIsImV4dHJhY3RCcmVha3BvaW50RGF0YSIsImJwU3RyIiwicGFydHMiLCJzcGxpdCIsImxpbmVOdW1iZXIiLCJwYXJzZUludCIsInNwbGljZSIsImpvaW4iLCJ2YWxpZGF0ZUJyZWFrcG9pbnQiLCJicmVha3BvaW50IiwiYnJPYmoiLCJicmVha3BvaW50SWQiLCJickxpbmVOdW1iZXIiLCJsb2NhdGlvbnMiLCJBcnJheSIsImlzQXJyYXkiLCJickZpbGVOYW1lIiwiaXRlbUxpbmVOdW1iZXIiLCJtc2ciLCJsaW5lIiwiRGVidWdnZXIiLCJjb25zdHJ1Y3RvciIsInBpZCIsIl9waWQiLCJfcG9ydCIsInVuZGVmaW5lZCIsIl9ob3N0IiwiX2JyZWFrcG9pbnRzIiwiX3BlbmRpbmdCUCIsIl9wYXVzZWQiLCJfY2xpZW50IiwiX2ZpbGVOYW1lQWxpYXNlcyIsIl9icmVha3BvaW50RXJyb3JzIiwicmVzZXQiLCJjbG9zZSIsImdldFByb3BlcnRpZXNCeU9iamVjdElkIiwiZWxtIiwiZGF0YSIsIl9SdW50aW1lIiwiZ2V0UHJvcGVydGllcyIsImdldFByb21pY2VBbGxSZXN1bHQiLCJtYXBSZXN1bHRGaWx0ZXJlZCIsInByb21pc2VBbGxQcm9taXNlIiwiYWxsIiwidGhlbiIsImZpbHRlciIsInByb21pc2VzIiwiZ2V0UHJvcGVydGllc1Jlc3VsdCIsIm1hcFJlc3VsdCIsImdldFByb3BlcnRpZXNJbm5lclJlc3VsdCIsInNjb3BlSXRlbSIsIm9iamVjdElkUmVzcG9uc2UiLCJjaGlsZCIsInZhbHVlcyIsInByb2Nlc3NTY29wZSIsInNjb3BlQ2hhaW4iLCJzY29wZUNoYWluUmVzdWx0IiwiY2hhaW4iLCJvYmplY3QiLCJ0eXBlIiwiZWwiLCJwcm9jZXNzQ2FsbEZyYW1lcyIsImNhbGxGcmFtZXMiLCJjYWxsRnJhbWVzTWFwUmVzdWx0IiwiY2FsbEZyYW1lIiwicHJvY2Vzc1Njb3BlUmVzdWx0IiwiaW5CcmVha3BvaW50cyIsIml0ZW1VcmwiLCJicCIsInRvTG93ZXJDYXNlIiwib3JpZ2luIiwic2NyaXB0UGF0aCIsImluRmlsZU5hbWVBbGlhc2VzIiwiYWxpYXMiLCJjb250aW51ZUNvbm5lY3QiLCJvbiIsIm0iLCJmaWxlbGMiLCJicmVha3BvaW50Rm9yQ2hhbmdlIiwiZmluZFJlc3VsdCIsImZpbmQiLCJicmVha3BvaW50bGMiLCJpbmNsdWRlcyIsInB1c2giLCJfRGVidWdnZXIiLCJwYXVzZSIsIm1VcmwiLCJicmVha3BvaW50c0Zyb21PbGRMb2NhdGlvbiIsImJyZWFrcG9pbnRzRnJvbU9sZExvY2F0aW9uUmVzdWx0Iiwic2V0QnJlYWtwb2ludCIsInJlc3VtZSIsInJlYXNvbiIsIl9icm9rZU9uU3RhcnQiLCJwb3NzaWJsZUJyZWFrcG9pbnRzRGF0YSIsImVDYWxsRnJhbWVzIiwiYnJlYWtwb2ludHNNYXBSZXN1bHQiLCJzY3JpcHRJZCIsImxvY2F0aW9uIiwiaW5pdGlhbERlcHRoIiwidW5pcXVlU2NyaXB0SWRBcnIiLCJmaW5kZWQiLCJlbmRzV2l0aCIsInBvc3NpYmxlQnJlYWtwb2ludHMiLCJnZXRQb3NzaWJsZUJyZWFrcG9pbnRzIiwic2NyaXB0U291cmNlIiwiZ2V0U2NyaXB0U291cmNlIiwic2NyaXB0U291cmNlU3BsaXQiLCJmaWxlTGluZU51bWJlcnNMZW5ndGgiLCJicmVha3BvaW50cyIsImZpbGUiLCJzY29wZUNoYWluVHJlZSIsImJyZWFrcG9pbnREYXRhIiwidmFyaWFibGVzIiwiYWRkVmFyaWFibGVzRnJvbVNjb3BlQ2hhaW5UcmVlIiwiYWRkT3h5Z2VuVmFyaWFibGVzRnJvbUdsb2JhbFNjb3BlIiwiaXNzZXQiLCJsb2MiLCJyZWFsQnJmaW5kZWQiLCJicmVha3BvaW50RXJyb3IiLCJiciIsInBvc3NpYmxlQnJlYWtwb2ludERhdGEiLCJyZXNvbHZlZCIsImVtaXQiLCJpZ25vcmUiLCJtZXNzYWdlIiwiY29udGludWUiLCJvbkJyZWFrcG9pbnRSZXNvbHZlZCIsIlJ1bnRpbWUiLCJlbmFibGUiLCJzZXRQYXVzZU9uRXhjZXB0aW9ucyIsInN0YXRlIiwic2V0QXN5bmNDYWxsU3RhY2tEZXB0aCIsIm1heERlcHRoIiwic2V0QmxhY2tib3hQYXR0ZXJucyIsInBhdHRlcm5zIiwicnVuSWZXYWl0aW5nRm9yRGVidWdnZXIiLCJwYXVzZWQiLCJ2YWxpZGF0ZVJlc3VsdCIsImNvbm5lY3QiLCJwb3J0IiwiaG9zdCIsInNub296ZVRpbWUiLCJsYXN0RXJyb3IiLCJyZXRyaWVzIiwid2FybiIsImFsaWFzUmVzdWx0IiwicGF0aFRvRmlsZVVSTCIsInRvU3RyaW5nIiwiZXJyIiwic2V0QnJlYWtwb2ludEJ5VXJsIiwiY29sdW1uTnVtYmVyIiwiY2F0Y2giLCJyZXNwb25zZSIsInNldEJyZWFrcG9pbnRzQWN0aXZlIiwiYWN0aXZlIiwicmVtb3ZlQnJlYWtwb2ludCIsInJlbW92ZUJyIiwicmVzdW1lVGVybWluYXRlIiwiZGlzYWJsZSIsInJlbW92ZUJyZWFrcG9pbnRCeVZhbHVlIiwiZmlsZVBhdGgiLCJpbnB1dExpbmUiLCJmaWxlUGF0aEFsaWFzIiwic2VsZiIsImIiLCJjbGVhckJyZWFrcG9pbnRzIiwic3RhcnRMb2NhdGlvbiIsInN0YXJ0IiwicCIsInBvcCIsInNjb3BlVmFyIiwibmFtZSIsInRyeVRvUmV0cmlldmVPYmplY3RWYWx1ZSIsIm9ialZhbHVlIiwiZm9yRWFjaCIsInByb3BEZXNjIiwicG9FdmFsUmVzdWx0IiwiZXZhbHVhdGUiLCJleHByZXNzaW9uIiwicmV0dXJuQnlWYWx1ZSIsImVudkV2YWxSZXN1bHQiLCJ2YXJzRXZhbFJlc3VsdCIsInBhcmFtc0V2YWxSZXN1bHQiLCJyZXN1bHRzIiwicG8iLCJlbnYiLCJ2YXJzIiwicGFyYW1zIiwia2V5cyIsImtleSIsImdldEJyZWFrcG9pbnRzIiwiYnBzIl0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL2xpYi9kZWJ1Z2dlci5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKlxyXG4gKiBDb3B5cmlnaHQgKEMpIDIwMTUtcHJlc2VudCBDbG91ZEJlYXQgTGltaXRlZFxyXG4gKlxyXG4gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeVxyXG4gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieVxyXG4gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvclxyXG4gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLlxyXG4gKi9cclxuXHJcbi8qXHJcbiAqIFY4IGRlYnVnZ2VyIGNsaWVudC5cclxuICovXHJcblxyXG4ndXNlIHN0cmljdCc7XHJcblxyXG5pbXBvcnQgbG9nZ2VyIGZyb20gJy4uL2xpYi9sb2dnZXInO1xyXG5jb25zdCBsb2cgPSBsb2dnZXIoJ0RlYnVnZ2VyJyk7XHJcbmNvbnN0IHsgRXZlbnRFbWl0dGVyIH0gPSByZXF1aXJlKCdldmVudHMnKTtcclxuY29uc3QgQ0RQID0gcmVxdWlyZSgnQG94eWdlbmhxL2Nocm9tZS1yZW1vdGUtaW50ZXJmYWNlJyk7XHJcbmltcG9ydCB1cmwgZnJvbSAndXJsJztcclxuXHJcbmNvbnN0IENPTk5FQ1RfUkVUUklFUyA9IDQ7XHJcbmNvbnN0IENPTk5FQ1RfU05PT1pFX0lOVEVSVkFMX01VTFQgPSAyO1xyXG5jb25zdCBNQVhfREVQVEggPSA1O1xyXG5jb25zdCBJR05PUkVfU0NPUEVfQ0hBSU5fVkFSSUFCTEVTID0gW1xyXG4gICAgJ2V4cG9ydHMnLFxyXG4gICAgJ3JlcXVpcmUnLFxyXG4gICAgJ21vZHVsZScsXHJcbiAgICAnX19maWxlbmFtZScsXHJcbiAgICAnX19kaXJuYW1lJ1xyXG5dO1xyXG5sZXQgbWF4RmluZGVkRGVwdGggPSAwO1xyXG5cclxuY29uc3QgdHJhbnNmb3JtVG9JREVTdHlsZSA9IChmaWxlTmFtZSkgPT4ge1xyXG4gICAgdHJ5IHtcclxuICAgICAgICBjb25zdCB1cmlJbmRleCA9IGZpbGVOYW1lLmluZGV4T2YoJ2ZpbGU6Jyk7XHJcbiAgICAgICAgY29uc3QgYnBEYXRhID0gZmlsZU5hbWUuc3Vic3RyaW5nKDAsIHVyaUluZGV4KTtcclxuICAgICAgICBsZXQgdXJpID0gZmlsZU5hbWUuc3Vic3RyaW5nKHVyaUluZGV4KTtcclxuICAgICAgICAvLyBmaXggVU5DIHBhdGhzXHJcbiAgICAgICAgaWYgKHByb2Nlc3MucGxhdGZvcm0gPT09ICd3aW4zMicgJiYgdXJpLnN0YXJ0c1dpdGgoJ2ZpbGU6Ly8vJykpIHtcclxuICAgICAgICAgICAgdXJpID0gJ2ZpbGU6Ly8nICsgdXJpLnN1YnN0cmluZygnZmlsZTovLy8nLmxlbmd0aCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBicERhdGEgKyB1cmwuZmlsZVVSTFRvUGF0aCh1cmkpO1xyXG4gICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgIGNvbnNvbGUubG9nKCd0cmFuc2Zvcm1Ub0lERVN0eWxlIGZpbGVOYW1lJywgZmlsZU5hbWUpO1xyXG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ3RyYW5zZm9ybVRvSURFU3R5bGUgZXJyb3InLCBlKTtcclxuICAgICAgICB0aHJvdyBlO1xyXG4gICAgfVxyXG59O1xyXG5cclxuLy8gc25vb3plIGZ1bmN0aW9uIC0gYXN5bmMgd3JhcHBlciBhcm91bmQgc2V0VGltZW91dCBmdW5jdGlvblxyXG5jb25zdCBzbm9vemUgPSBtcyA9PiBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgbXMpKTtcclxuXHJcbmNvbnN0IGRlbGV0ZVZhbHVlcyA9IChhcnIsIGRlcHRoKSA9PiB7XHJcblxyXG4gICAgaWYgKGRlcHRoID4gbWF4RmluZGVkRGVwdGgpIHtcclxuICAgICAgICBtYXhGaW5kZWREZXB0aCA9IGRlcHRoO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChkZXB0aCA+IE1BWF9ERVBUSCkge1xyXG4gICAgICAgIHJldHVybiBbXTtcclxuICAgIH1cclxuXHJcbiAgICBsZXQgcmVzdWx0ID0gYXJyLm1hcCgoaXRlbSkgPT4ge1xyXG4gICAgICAgIGlmIChpdGVtICYmIGl0ZW0udmFsdWUgJiYgaXRlbS52YWx1ZS5jbGFzc05hbWUgJiYgaXRlbS52YWx1ZS5jbGFzc05hbWUgPT09ICdGdW5jdGlvbicpIHtcclxuICAgICAgICAgICAgY29uc3QgY2xvbmVWYWx1ZSA9IE9iamVjdC5hc3NpZ24oaXRlbS52YWx1ZSk7XHJcbiAgICAgICAgICAgIGRlbGV0ZSBjbG9uZVZhbHVlLm9iamVjdElkO1xyXG4gICAgICAgICAgICBjb25zdCBjbG9uZSA9IE9iamVjdC5hc3NpZ24oaXRlbSwge1xyXG4gICAgICAgICAgICAgICAgdmFsdWU6IGNsb25lVmFsdWVcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIGRlbGV0ZSBjbG9uZS5vYmplY3RJZDtcclxuICAgICAgICAgICAgcmV0dXJuIGNsb25lO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHJldHVybiBpdGVtO1xyXG4gICAgICAgIH1cclxuICAgIH0pO1xyXG5cclxuICAgIHJldHVybiByZXN1bHQ7XHJcbn07XHJcblxyXG5mdW5jdGlvbiBleHRyYWN0QnJlYWtwb2ludERhdGEoYnBTdHIpIHtcclxuICAgIGlmICghYnBTdHIgfHwgdHlwZW9mIGJwU3RyICE9PSAnc3RyaW5nJykge1xyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIHRyeSB7XHJcbiAgICAgICAgYnBTdHIgPSB0cmFuc2Zvcm1Ub0lERVN0eWxlKGJwU3RyKTtcclxuICAgICAgICBjb25zdCBwYXJ0cyA9IGJwU3RyLnNwbGl0KCc6Jyk7XHJcblxyXG4gICAgICAgIGNvbnN0IGxpbmVOdW1iZXIgPSBwYXJzZUludChwYXJ0c1sxXSk7XHJcblxyXG4gICAgICAgIC8vIHJvbW92ZSBmaWxlIG51bWJlciwgbGluZSBudW1iZXIsIGNvbHVtbiBudW1iZXJcclxuICAgICAgICBwYXJ0cy5zcGxpY2UoMCwgMyk7XHJcblxyXG4gICAgICAgIC8vIGxvb2tzIGxpbmUgbmVlZCBvbmx5IGZvciB3aW5kb3dzIHBhdGggd2hpdGggZGlzaywgbGlrZSBDOi8vXHJcbiAgICAgICAgLy8gZm9yIHdpbmRvd3MgbmV0d29yayBmb2xkZXJzIGFuZCBtYWMgbm90IG5lZWRcclxuICAgICAgICBjb25zdCBmaWxlTmFtZSA9IHBhcnRzLmpvaW4oJzonKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgZmlsZU5hbWU6IGZpbGVOYW1lLFxyXG4gICAgICAgICAgICBsaW5lTnVtYmVyOiBsaW5lTnVtYmVyXHJcbiAgICAgICAgfTtcclxuXHJcbiAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgbG9nLmVycm9yKGBGYWlsZWQgdG8gZXh0cmFjdCBicmVha3BvaW50IGRhdGE6ICR7YnBTdHJ9YCk7XHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcbn1cclxuXHJcbmZ1bmN0aW9uIHZhbGlkYXRlQnJlYWtwb2ludChicmVha3BvaW50KSB7XHJcbiAgICBjb25zdCBick9iaiA9IGV4dHJhY3RCcmVha3BvaW50RGF0YShicmVha3BvaW50LmJyZWFrcG9pbnRJZCk7XHJcblxyXG4gICAgY29uc3QgYnJMaW5lTnVtYmVyID0gYnJPYmoubGluZU51bWJlciArIDE7IC8vIGZyb20gMC1iYXNlIHRvIDEgYmFzZTtcclxuXHJcbiAgICBpZiAoYnJlYWtwb2ludCAmJiBicmVha3BvaW50LmxvY2F0aW9ucyAmJiBBcnJheS5pc0FycmF5KGJyZWFrcG9pbnQubG9jYXRpb25zKSAmJiBicmVha3BvaW50LmxvY2F0aW9ucy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgbGV0IHJlc3VsdCA9IG51bGw7XHJcbiAgICAgICAgYnJlYWtwb2ludC5sb2NhdGlvbnMubWFwKChpdGVtKSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IGJyRmlsZU5hbWUgPSBick9iai5maWxlTmFtZTtcclxuICAgICAgICAgICAgY29uc3QgaXRlbUxpbmVOdW1iZXIgPSBpdGVtLmxpbmVOdW1iZXIgKyAxOyAvLyBmcm9tIDAtYmFzZSB0byAxIGJhc2U7XHJcblxyXG4gICAgICAgICAgICBpZiAoYnJMaW5lTnVtYmVyICE9PSBpdGVtTGluZU51bWJlcikge1xyXG4gICAgICAgICAgICAgICAgcmVzdWx0ID0ge1xyXG4gICAgICAgICAgICAgICAgICAgIG1zZzogYEJyZWFrcG9pbnRzIHdhcm5pbmcgOiAke2JyRmlsZU5hbWV9IERvbid0IGhhdmUgb3Bwb3J0dW5pdHkgdG8gaGF2ZSBicmVha3BvaW50IGF0IGxpbmUgOiBgLFxyXG4gICAgICAgICAgICAgICAgICAgIGZpbGVOYW1lOiBickZpbGVOYW1lLFxyXG4gICAgICAgICAgICAgICAgICAgIGxpbmU6IGJyTGluZU51bWJlclxyXG4gICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuXHJcbn1cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgRGVidWdnZXIgZXh0ZW5kcyBFdmVudEVtaXR0ZXIge1xyXG4gICAgY29uc3RydWN0b3IocGlkKSB7XHJcbiAgICAgICAgc3VwZXIoKTtcclxuXHJcbiAgICAgICAgdGhpcy5fcGlkID0gcGlkO1xyXG4gICAgICAgIHRoaXMuX3BvcnQgPSB1bmRlZmluZWQ7XHJcbiAgICAgICAgdGhpcy5faG9zdCA9IHVuZGVmaW5lZDtcclxuICAgICAgICB0aGlzLl9icmVha3BvaW50cyA9IFtdO1xyXG4gICAgICAgIHRoaXMuX3BlbmRpbmdCUCA9IHVuZGVmaW5lZDtcclxuICAgICAgICB0aGlzLl9wYXVzZWQgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLl9jbGllbnQgPSBudWxsO1xyXG4gICAgICAgIHRoaXMuX2ZpbGVOYW1lQWxpYXNlcyA9IFtdO1xyXG4gICAgICAgIHRoaXMuX2JyZWFrcG9pbnRFcnJvcnMgPSBbXTtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyByZXNldCgpIHtcclxuICAgICAgICBpZiAodGhpcy5fY2xpZW50KSB7XHJcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuX2NsaWVudC5jbG9zZSgpO1xyXG4gICAgICAgICAgICB0aGlzLl9jbGllbnQgPSBudWxsO1xyXG4gICAgICAgICAgICB0aGlzLl9wYXVzZWQgPSBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5fYnJlYWtwb2ludHMgPSBbXTtcclxuICAgICAgICB0aGlzLl9maWxlTmFtZUFsaWFzZXMgPSBbXTtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBnZXRQcm9wZXJ0aWVzQnlPYmplY3RJZChvYmplY3RJZCwgZGVwdGgsIGVsbSkge1xyXG4gICAgICAgIGxldCBkYXRhID0ge307XHJcblxyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGRhdGEgPSBhd2FpdCB0aGlzLl9SdW50aW1lLmdldFByb3BlcnRpZXMoe1xyXG4gICAgICAgICAgICAgICAgb2JqZWN0SWQgOiBvYmplY3RJZFxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKCdnZXRQcm9wZXJ0aWVzIGVsbScsIGVsbSk7XHJcbiAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKCdnZXRQcm9wZXJ0aWVzIGUnLCBlKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgbGV0IGNsb25lID0gT2JqZWN0LmFzc2lnbih7fSwgZGF0YSk7XHJcblxyXG4gICAgICAgIGlmIChjbG9uZSAmJiBjbG9uZSAmJiBjbG9uZS5yZXN1bHQpIHtcclxuICAgICAgICAgICAgY2xvbmUgPSBPYmplY3QuYXNzaWduKHt9LCBjbG9uZSwge1xyXG4gICAgICAgICAgICAgICAgcmVzdWx0OiBkZWxldGVWYWx1ZXMoY2xvbmUucmVzdWx0LCBkZXB0aClcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gY2xvbmU7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgZ2V0UHJvbWljZUFsbFJlc3VsdChtYXBSZXN1bHRGaWx0ZXJlZCkge1xyXG4gICAgICAgIGxldCBwcm9taXNlQWxsUHJvbWlzZSA9IGF3YWl0IFByb21pc2UuYWxsKG1hcFJlc3VsdEZpbHRlcmVkKS50aGVuKHZhbHVlID0+IHtcclxuICAgICAgICAgICAgcmV0dXJuIHZhbHVlO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBpZiAocHJvbWlzZUFsbFByb21pc2UgJiYgQXJyYXkuaXNBcnJheShwcm9taXNlQWxsUHJvbWlzZSkgJiYgcHJvbWlzZUFsbFByb21pc2UubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICBwcm9taXNlQWxsUHJvbWlzZSA9IHByb21pc2VBbGxQcm9taXNlLmZpbHRlcigoaXRlbSkgPT4gISFpdGVtKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBwcm9taXNlQWxsUHJvbWlzZTtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBnZXRQcm9wZXJ0aWVzKG9iamVjdElkLCBkZXB0aCwgZWxtKSB7XHJcbiAgICAgICAgY29uc3QgcHJvbWlzZXMgPSBbXTtcclxuXHJcbiAgICAgICAgY29uc3QgZ2V0UHJvcGVydGllc1Jlc3VsdCA9IGF3YWl0IHRoaXMuZ2V0UHJvcGVydGllc0J5T2JqZWN0SWQob2JqZWN0SWQsIGRlcHRoLCBlbG0pO1xyXG5cclxuICAgICAgICBpZiAoZ2V0UHJvcGVydGllc1Jlc3VsdCkge1xyXG4gICAgICAgICAgICBpZiAoZ2V0UHJvcGVydGllc1Jlc3VsdCAmJiBnZXRQcm9wZXJ0aWVzUmVzdWx0LnJlc3VsdCAmJiBBcnJheS5pc0FycmF5KGdldFByb3BlcnRpZXNSZXN1bHQucmVzdWx0KSkge1xyXG5cclxuICAgICAgICAgICAgICAgIGNvbnN0IG1hcFJlc3VsdCA9IGdldFByb3BlcnRpZXNSZXN1bHQucmVzdWx0Lm1hcChhc3luYyAoaXRlbSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChpdGVtICYmIGl0ZW0udmFsdWUgJiYgaXRlbS52YWx1ZS5vYmplY3RJZCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBnZXRQcm9wZXJ0aWVzSW5uZXJSZXN1bHQgPSBhd2FpdCB0aGlzLmdldFByb3BlcnRpZXMoaXRlbS52YWx1ZS5vYmplY3RJZCwgZGVwdGgrMSwgaXRlbSk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXRlbS5zY29wZUl0ZW0pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdldFByb3BlcnRpZXNJbm5lclJlc3VsdDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgICAgIGNvbnN0IG1hcFJlc3VsdEZpbHRlcmVkID0gbWFwUmVzdWx0LmZpbHRlcigoaXRlbSkgPT4gISFpdGVtKTtcclxuXHJcbiAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZGVwdGg6IGRlcHRoLFxyXG4gICAgICAgICAgICAgICAgICAgIG9iamVjdElkOiBvYmplY3RJZCxcclxuICAgICAgICAgICAgICAgICAgICBvYmplY3RJZFJlc3BvbnNlOiBPYmplY3QuYXNzaWduKHt9LCBnZXRQcm9wZXJ0aWVzUmVzdWx0LCB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdElkOiBvYmplY3RJZFxyXG4gICAgICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgICB9O1xyXG5cclxuICAgICAgICAgICAgICAgIGlmIChtYXBSZXN1bHRGaWx0ZXJlZCAmJiBBcnJheS5pc0FycmF5KG1hcFJlc3VsdEZpbHRlcmVkKSAmJiBtYXBSZXN1bHRGaWx0ZXJlZC5sZW5ndGggPiAwKSB7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHByb21pc2VBbGxQcm9taXNlID0gYXdhaXQgdGhpcy5nZXRQcm9taWNlQWxsUmVzdWx0KG1hcFJlc3VsdEZpbHRlcmVkKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHByb21pc2VBbGxQcm9taXNlICYmIEFycmF5LmlzQXJyYXkocHJvbWlzZUFsbFByb21pc2UpICYmIHByb21pc2VBbGxQcm9taXNlLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmNoaWxkID0gcHJvbWlzZUFsbFByb21pc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgICAgICAgICAgZGVwdGg6IGRlcHRoLFxyXG4gICAgICAgICAgICAgICAgICAgIG9iamVjdElkOiBvYmplY3RJZCxcclxuICAgICAgICAgICAgICAgICAgICBvYmplY3RJZFJlc3BvbnNlOiBPYmplY3QuYXNzaWduKHt9LCBnZXRQcm9wZXJ0aWVzUmVzdWx0LCB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdElkOiBvYmplY3RJZFxyXG4gICAgICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAocHJvbWlzZXMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5hbGwocHJvbWlzZXMpLnRoZW4odmFsdWVzID0+IHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZXM7XHJcbiAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIHByb2Nlc3NTY29wZShzY29wZUNoYWluLCBkZXB0aCkge1xyXG4gICAgICAgIGxldCBzY29wZUNoYWluUmVzdWx0ID0gYXdhaXQgc2NvcGVDaGFpbi5tYXAoYXN5bmMgKGNoYWluKSA9PiB7XHJcbiAgICAgICAgICAgIGlmIChjaGFpbiAmJiBjaGFpbi5vYmplY3QgJiYgY2hhaW4ub2JqZWN0Lm9iamVjdElkKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGNoYWluLm9iamVjdC5vYmplY3RJZCA9PT0gJ3N0cmluZycgJiYgY2hhaW4udHlwZSAhPT0gJ2dsb2JhbCcpIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBnZXRQcm9wZXJ0aWVzUmVzdWx0ID0gYXdhaXQgdGhpcy5nZXRQcm9wZXJ0aWVzKGNoYWluLm9iamVjdC5vYmplY3RJZCwgZGVwdGgpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ2V0UHJvcGVydGllc1Jlc3VsdDtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBzY29wZUNoYWluUmVzdWx0ID0gc2NvcGVDaGFpblJlc3VsdC5maWx0ZXIoKGVsKSA9PiAhIWVsKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIFByb21pc2UuYWxsKHNjb3BlQ2hhaW5SZXN1bHQpLnRoZW4odmFsdWVzID0+IHtcclxuICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWVzKSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlcy5maWx0ZXIoKGVsKSA9PiAhIWVsKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZXM7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBwcm9jZXNzQ2FsbEZyYW1lcyhjYWxsRnJhbWVzLCBkZXB0aCkge1xyXG4gICAgICAgIGxldCBjYWxsRnJhbWVzTWFwUmVzdWx0ID0gYXdhaXQgY2FsbEZyYW1lcy5tYXAoYXN5bmMoY2FsbEZyYW1lKSA9PiB7XHJcbiAgICAgICAgICAgIGlmIChjYWxsRnJhbWUgJiYgY2FsbEZyYW1lLnNjb3BlQ2hhaW4gJiYgQXJyYXkuaXNBcnJheShjYWxsRnJhbWUuc2NvcGVDaGFpbikpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHByb2Nlc3NTY29wZVJlc3VsdCA9IGF3YWl0IHRoaXMucHJvY2Vzc1Njb3BlKGNhbGxGcmFtZS5zY29wZUNoYWluLCBkZXB0aCk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gcHJvY2Vzc1Njb3BlUmVzdWx0O1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgY2FsbEZyYW1lc01hcFJlc3VsdCA9IGNhbGxGcmFtZXNNYXBSZXN1bHQuZmlsdGVyKChlbCkgPT4gISFlbCk7XHJcblxyXG4gICAgICAgIHJldHVybiBQcm9taXNlLmFsbChjYWxsRnJhbWVzTWFwUmVzdWx0KS50aGVuKHZhbHVlcyA9PiB7XHJcbiAgICAgICAgICAgIHJldHVybiB2YWx1ZXM7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgaW5CcmVha3BvaW50cyhpdGVtVXJsKSB7XHJcbiAgICAgICAgbGV0IHJlc3VsdCA9IGZhbHNlO1xyXG4gICAgICAgIGlmICh0aGlzLl9icmVha3BvaW50cyAmJiBBcnJheS5pc0FycmF5KHRoaXMuX2JyZWFrcG9pbnRzKSAmJiB0aGlzLl9icmVha3BvaW50cy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2JyZWFrcG9pbnRzLm1hcCgoYnApID0+IHtcclxuICAgICAgICAgICAgICAgIGlmIChcclxuICAgICAgICAgICAgICAgICAgICBpdGVtVXJsICYmXHJcbiAgICAgICAgICAgICAgICAgICAgaXRlbVVybC50b0xvd2VyQ2FzZSAmJlxyXG4gICAgICAgICAgICAgICAgICAgIGJwLm9yaWdpbiAmJlxyXG4gICAgICAgICAgICAgICAgICAgIGJwLm9yaWdpbi5zY3JpcHRQYXRoICYmXHJcbiAgICAgICAgICAgICAgICAgICAgYnAub3JpZ2luLnNjcmlwdFBhdGgudG9Mb3dlckNhc2UgJiZcclxuICAgICAgICAgICAgICAgICAgICBpdGVtVXJsLnRvTG93ZXJDYXNlKCkgPT09IGJwLm9yaWdpbi5zY3JpcHRQYXRoLnRvTG93ZXJDYXNlKClcclxuICAgICAgICAgICAgICAgICkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgfVxyXG5cclxuICAgIGluRmlsZU5hbWVBbGlhc2VzKGZpbGVOYW1lKSB7XHJcbiAgICAgICAgbGV0IHJlc3VsdCA9IGZhbHNlO1xyXG4gICAgICAgIGlmICh0aGlzLl9maWxlTmFtZUFsaWFzZXMgJiYgQXJyYXkuaXNBcnJheSh0aGlzLl9maWxlTmFtZUFsaWFzZXMpICYmIHRoaXMuX2ZpbGVOYW1lQWxpYXNlcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2ZpbGVOYW1lQWxpYXNlcy5tYXAoKGFsaWFzKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBpZiAoXHJcbiAgICAgICAgICAgICAgICAgICAgYWxpYXMgJiZcclxuICAgICAgICAgICAgICAgICAgICBhbGlhcy50b0xvd2VyQ2FzZSAmJlxyXG4gICAgICAgICAgICAgICAgICAgIGZpbGVOYW1lICYmXHJcbiAgICAgICAgICAgICAgICAgICAgZmlsZU5hbWUudG9Mb3dlckNhc2UgJiZcclxuICAgICAgICAgICAgICAgICAgICBhbGlhcy50b0xvd2VyQ2FzZSgpID09PSBmaWxlTmFtZS50b0xvd2VyQ2FzZSgpXHJcbiAgICAgICAgICAgICAgICApIHtcclxuICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBhbGlhcztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgY29udGludWVDb25uZWN0KCkge1xyXG5cclxuICAgICAgICB0aGlzLl9jbGllbnQub24oJ0RlYnVnZ2VyLnNjcmlwdFBhcnNlZCcsIGFzeW5jKG0pID0+IHtcclxuICAgICAgICAgICAgaWYgKG0gJiYgbS51cmwpIHtcclxuICAgICAgICAgICAgICAgIGlmIChtLnVybC50b0xvd2VyQ2FzZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGZpbGVsYyA9IG0udXJsLnRvTG93ZXJDYXNlKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IGJyZWFrcG9pbnRGb3JDaGFuZ2U7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZmluZFJlc3VsdCA9IHRoaXMuX2JyZWFrcG9pbnRzLmZpbmQoKGl0ZW0pID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGl0ZW0ub3JpZ2luICYmIGl0ZW0ub3JpZ2luLnNjcmlwdFBhdGggJiYgaXRlbS5vcmlnaW4uc2NyaXB0UGF0aC50b0xvd2VyQ2FzZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYnJlYWtwb2ludGxjID0gaXRlbS5vcmlnaW4uc2NyaXB0UGF0aC50b0xvd2VyQ2FzZSgpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChicmVha3BvaW50bGMgPT09IGZpbGVsYyAmJiBpdGVtLm9yaWdpbi5zY3JpcHRQYXRoICE9PSBtLnVybCkge1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5fZmlsZU5hbWVBbGlhc2VzLmluY2x1ZGVzKG0udXJsKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpZ25vcmVcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9maWxlTmFtZUFsaWFzZXMucHVzaChtLnVybCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9wYXVzZWQgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX0RlYnVnZ2VyLnBhdXNlKCk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrcG9pbnRGb3JDaGFuZ2UgPSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrcG9pbnQ6IGl0ZW0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Vcmw6IG0udXJsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChmaW5kUmVzdWx0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJyZWFrcG9pbnRzRnJvbU9sZExvY2F0aW9uID0gW107XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9icmVha3BvaW50cy5tYXAoKGJwKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnAgJiZcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicC5vcmlnaW4gJiZcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicC5vcmlnaW4uc2NyaXB0UGF0aCAmJlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrcG9pbnRGb3JDaGFuZ2UgJiZcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVha3BvaW50Rm9yQ2hhbmdlLm1VcmwgJiZcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVha3BvaW50Rm9yQ2hhbmdlLmJyZWFrcG9pbnQgJiZcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVha3BvaW50Rm9yQ2hhbmdlLmJyZWFrcG9pbnQub3JpZ2luICYmXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWtwb2ludEZvckNoYW5nZS5icmVha3BvaW50Lm9yaWdpbi5zY3JpcHRQYXRoICYmXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnAub3JpZ2luLnNjcmlwdFBhdGggPT09IGJyZWFrcG9pbnRGb3JDaGFuZ2UuYnJlYWtwb2ludC5vcmlnaW4uc2NyaXB0UGF0aFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWtwb2ludHNGcm9tT2xkTG9jYXRpb24ucHVzaCh7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjcmlwdFBhdGg6IGJyZWFrcG9pbnRGb3JDaGFuZ2UubVVybCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZU51bWJlcjogYnAub3JpZ2luLmxpbmVOdW1iZXJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYnJlYWtwb2ludHNGcm9tT2xkTG9jYXRpb24gJiYgQXJyYXkuaXNBcnJheShicmVha3BvaW50c0Zyb21PbGRMb2NhdGlvbikgJiYgYnJlYWtwb2ludHNGcm9tT2xkTG9jYXRpb24ubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGJyZWFrcG9pbnRzRnJvbU9sZExvY2F0aW9uUmVzdWx0ID0gYnJlYWtwb2ludHNGcm9tT2xkTG9jYXRpb24ubWFwKGFzeW5jKGJwKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuc2V0QnJlYWtwb2ludChicC5zY3JpcHRQYXRoLCBicC5saW5lTnVtYmVyKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrcG9pbnRzRnJvbU9sZExvY2F0aW9uUmVzdWx0ID0gYnJlYWtwb2ludHNGcm9tT2xkTG9jYXRpb25SZXN1bHQuZmlsdGVyKChlbCkgPT4gISFlbCk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvbWlzZS5hbGwoYnJlYWtwb2ludHNGcm9tT2xkTG9jYXRpb25SZXN1bHQpLnRoZW4oYXN5bmModmFsdWUpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLl9EZWJ1Z2dlci5yZXN1bWUoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9wYXVzZWQgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuX0RlYnVnZ2VyLnBhdXNlKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgdGhpcy5fY2xpZW50Lm9uKCdEZWJ1Z2dlci5wYXVzZWQnLCAoZSkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLl9wYXVzZWQgPSB0cnVlO1xyXG4gICAgICAgICAgICBpZiAoZS5yZWFzb24gPT09ICdCcmVhayBvbiBzdGFydCcpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX2Jyb2tlT25TdGFydCA9IHRydWU7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAvLyBDaHJvbWUgZGVidWdnZXIgZG9lc24ndCBzZWVtIHRvIHJlbW92ZSBicmVha3BvaW50cyB3aGVuIHVzaW5nIHJlbW92ZUJyZWFrcG9pbnRcclxuICAgICAgICAgICAgICAgIC8vIGFuZCAnc29tZXRoaW5nJyBpcyBzdGlsbCBnZXR0aW5nIGhpdC4gbm90IGNsZWFyIHdoeSB0aGlzIGlzIGhhcHBlbmluZy5cclxuICAgICAgICAgICAgICAgIC8vIHRodXMsIHdlIGVtaXQgYnJlYWsgZXZlbnQgb25seSBpZiBtYXRjaGluZyBicmVha3BvaW50IHN0aWxsIGV4aXN0cyBpbiB0aGlzLl9icmVha3BvaW50c1xyXG5cclxuICAgICAgICAgICAgICAgIGNvbnN0IHBvc3NpYmxlQnJlYWtwb2ludHNEYXRhID0gW107XHJcbiAgICAgICAgICAgICAgICBsZXQgZUNhbGxGcmFtZXMgPSBbXTtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoZSAmJiBlLmNhbGxGcmFtZXMgJiYgQXJyYXkuaXNBcnJheShlLmNhbGxGcmFtZXMpICYmIGUuY2FsbEZyYW1lcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZS5jYWxsRnJhbWVzLm1hcCgoaXRlbSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXRlbSAmJiBpdGVtLnVybCAmJiB0aGlzLmluQnJlYWtwb2ludHMoaXRlbS51cmwpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlQ2FsbEZyYW1lcy5wdXNoKGl0ZW0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgbGV0IGJyZWFrcG9pbnRzTWFwUmVzdWx0ID0gdGhpcy5fYnJlYWtwb2ludHMubWFwKGFzeW5jKGJwKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGJwICYmXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJwLmxvY2F0aW9ucyAmJlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBlQ2FsbEZyYW1lcyAmJlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBlQ2FsbEZyYW1lc1swXSAmJlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBicC5sb2NhdGlvbnMubGVuZ3RoID4gMCAmJlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBicC5sb2NhdGlvbnNbMF0uc2NyaXB0SWQgPT09IGVDYWxsRnJhbWVzWzBdLmxvY2F0aW9uLnNjcmlwdElkICYmXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJwLmxvY2F0aW9uc1swXS5saW5lTnVtYmVyID09PSBlQ2FsbEZyYW1lc1swXS5sb2NhdGlvbi5saW5lTnVtYmVyKSB7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbml0aWFsRGVwdGggPSAxO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGUgJiYgZS5jYWxsRnJhbWVzICYmIEFycmF5LmlzQXJyYXkoZS5jYWxsRnJhbWVzKSAmJiBlLmNhbGxGcmFtZXMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdW5pcXVlU2NyaXB0SWRBcnIgPSBbXTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNhbGxGcmFtZXMgPSBlLmNhbGxGcmFtZXMuZmlsdGVyKChpdGVtKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGl0ZW0gJiYgaXRlbS51cmwpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmluZGVkID0gdGhpcy5fYnJlYWtwb2ludHMuZmluZCgoYnJlYWtwb2ludCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHJlc3VsdCA9IGZhbHNlO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChicmVha3BvaW50LmJyZWFrcG9pbnRJZC5lbmRzV2l0aChpdGVtLnVybCkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZpbmRlZCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGl0ZW0ubG9jYXRpb24gJiYgaXRlbS5sb2NhdGlvbi5zY3JpcHRJZCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh1bmlxdWVTY3JpcHRJZEFyci5pbmNsdWRlcyhpdGVtLmxvY2F0aW9uLnNjcmlwdElkKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5pcXVlU2NyaXB0SWRBcnIucHVzaChpdGVtLmxvY2F0aW9uLnNjcmlwdElkKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZpbmRlZDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxGcmFtZXMubWFwKGFzeW5jKGl0ZW0pID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHBvc3NpYmxlQnJlYWtwb2ludHMgPSBhd2FpdCB0aGlzLmdldFBvc3NpYmxlQnJlYWtwb2ludHMoaXRlbS5sb2NhdGlvbik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNjcmlwdFNvdXJjZSA9IGF3YWl0IHRoaXMuZ2V0U2NyaXB0U291cmNlKGl0ZW0ubG9jYXRpb24uc2NyaXB0SWQpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2NyaXB0U291cmNlU3BsaXQgPSBzY3JpcHRTb3VyY2Uuc2NyaXB0U291cmNlLnNwbGl0KCdcXG4nKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBmaWxlTGluZU51bWJlcnNMZW5ndGggPSAwO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2NyaXB0U291cmNlU3BsaXQgJiYgQXJyYXkuaXNBcnJheShzY3JpcHRTb3VyY2VTcGxpdCkgJiYgc2NyaXB0U291cmNlU3BsaXQubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZUxpbmVOdW1iZXJzTGVuZ3RoID0gc2NyaXB0U291cmNlU3BsaXQubGVuZ3RoO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdG8gc2VlIGhvdyBkZWJidWdlciBzZWUgc2NyaXB0XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2NyaXB0U291cmNlU3BsaXQubWFwKChzY3JpcHRTb3VyY2VJdGVtLCBpZHgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICBjb25zb2xlLmxvZygoaWR4KSArICcgJyArIHNjcmlwdFNvdXJjZUl0ZW0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc3NpYmxlQnJlYWtwb2ludHNEYXRhLnB1c2goe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWtwb2ludHM6IHBvc3NpYmxlQnJlYWtwb2ludHMsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlOiBpdGVtLnVybCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVMaW5lTnVtYmVyc0xlbmd0aDogZmlsZUxpbmVOdW1iZXJzTGVuZ3RoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnZ2V0U2NyaXB0U291cmNlIGUnLCBlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgY2FsbEZyYW1lc01hcFJlc3VsdCA9IGF3YWl0IHRoaXMucHJvY2Vzc0NhbGxGcmFtZXMoY2FsbEZyYW1lcywgaW5pdGlhbERlcHRoKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsRnJhbWVzTWFwUmVzdWx0ID0gY2FsbEZyYW1lc01hcFJlc3VsdC5maWx0ZXIoKGVsKSA9PiAhIWVsKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2FsbEZyYW1lc01hcFJlc3VsdDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgICAgIGJyZWFrcG9pbnRzTWFwUmVzdWx0ID0gYnJlYWtwb2ludHNNYXBSZXN1bHQuZmlsdGVyKChlbCkgPT4gISFlbCk7XHJcblxyXG4gICAgICAgICAgICAgICAgUHJvbWlzZS5hbGwoYnJlYWtwb2ludHNNYXBSZXN1bHQpLnRoZW4oYXN5bmMgKHNjb3BlQ2hhaW5UcmVlKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHNjb3BlQ2hhaW5UcmVlICYmIEFycmF5LmlzQXJyYXkoc2NvcGVDaGFpblRyZWUpICYmIHNjb3BlQ2hhaW5UcmVlLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc2NvcGVDaGFpblRyZWUgPSBzY29wZUNoYWluVHJlZS5maWx0ZXIoKGVsKSA9PiAhIWVsKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGJyZWFrcG9pbnREYXRhID0gbnVsbDtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFzc3VtZSB3ZSBhbHdheXMgc2VuZCBicmVha3BvaW50IG9mIHRoZSB0b3AgY2FsbCBmcmFtZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZUNhbGxGcmFtZXMgJiYgZUNhbGxGcmFtZXMubGVuZ3RoID4gMCkge1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrcG9pbnREYXRhID0ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVOdW1iZXI6IGVDYWxsRnJhbWVzWzBdLmxvY2F0aW9uLmxpbmVOdW1iZXIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZU5hbWU6IHRyYW5zZm9ybVRvSURFU3R5bGUoZUNhbGxGcmFtZXNbMF0udXJsKSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZXM6IFtdLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmFkZFZhcmlhYmxlc0Zyb21TY29wZUNoYWluVHJlZShicmVha3BvaW50RGF0YS52YXJpYWJsZXMsIHNjb3BlQ2hhaW5UcmVlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuYWRkT3h5Z2VuVmFyaWFibGVzRnJvbUdsb2JhbFNjb3BlKGJyZWFrcG9pbnREYXRhLnZhcmlhYmxlcyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2JyZWFrcG9pbnRFcnJvcnMgJiZcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5LmlzQXJyYXkodGhpcy5fYnJlYWtwb2ludEVycm9ycykgJiZcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2JyZWFrcG9pbnRFcnJvcnMubGVuZ3RoID4gMFxyXG4gICAgICAgICAgICAgICAgICAgICAgICApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGlzc2V0ID0gdGhpcy5fYnJlYWtwb2ludHMuZmluZCgoaXRlbSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbSAmJlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtLm9yaWdpbiAmJlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtLm9yaWdpbi5saW5lTnVtYmVyICYmXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlSW50KGl0ZW0ub3JpZ2luLmxpbmVOdW1iZXIpKzEgPT09IHBhcnNlSW50KGJyZWFrcG9pbnREYXRhLmxpbmVOdW1iZXIpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpdGVtO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0gJiZcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbS5sb2NhdGlvbnMgJiZcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXkuaXNBcnJheShpdGVtLmxvY2F0aW9ucykgJiZcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbS5sb2NhdGlvbnMubGVuZ3RoID4gMCAmJlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtLmxvY2F0aW9ucy5maW5kKGxvYyA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcGFyc2VJbnQobG9jLmxpbmVOdW1iZXIpID09PSBwYXJzZUludChicmVha3BvaW50RGF0YS5saW5lTnVtYmVyKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkgJiZcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2VJbnQoaXRlbS5vcmlnaW4ubGluZU51bWJlcikgIT09IDEgJiZcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2VJbnQoYnJlYWtwb2ludERhdGEubGluZU51bWJlcikgIT09IDFcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGl0ZW07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpc3NldCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCByZWFsQnJmaW5kZWQgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9icmVha3BvaW50RXJyb3JzLm1hcCgoYnJlYWtwb2ludEVycm9yKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2JyZWFrcG9pbnRzICYmXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheS5pc0FycmF5KHRoaXMuX2JyZWFrcG9pbnRzKSAmJlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fYnJlYWtwb2ludHMubGVuZ3RoID4gMFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2JyZWFrcG9pbnRzLm1hcCgoYnIpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBickZpbGVOYW1lID0gdHJhbnNmb3JtVG9JREVTdHlsZShici5vcmlnaW4uc2NyaXB0UGF0aCk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBwb3NzaWJsZUJyZWFrcG9pbnREYXRhO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zc2libGVCcmVha3BvaW50c0RhdGEgJiZcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXkuaXNBcnJheShwb3NzaWJsZUJyZWFrcG9pbnRzRGF0YSkgJiZcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zc2libGVCcmVha3BvaW50c0RhdGEubGVuZ3RoID4gMFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3NzaWJsZUJyZWFrcG9pbnREYXRhID0gcG9zc2libGVCcmVha3BvaW50c0RhdGEuZmluZCgoaXRlbSkgPT4gaXRlbS5maWxlID09PSBlQ2FsbEZyYW1lc1swXS51cmwpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBickZpbGVOYW1lID09PSBicmVha3BvaW50RGF0YS5maWxlTmFtZSAmJlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3NzaWJsZUJyZWFrcG9pbnREYXRhICYmXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVvZiBwb3NzaWJsZUJyZWFrcG9pbnREYXRhLmZpbGVMaW5lTnVtYmVyc0xlbmd0aCAhPT0gJ3VuZGVmaW5lZCcgJiZcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWtwb2ludERhdGEubGluZU51bWJlcisxID09PSBici5vcmlnaW4ubGluZU51bWJlciB8fFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnIub3JpZ2luLmxpbmVOdW1iZXIrMSA9PT0gcG9zc2libGVCcmVha3BvaW50RGF0YS5maWxlTGluZU51bWJlcnNMZW5ndGhcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFsQnJmaW5kZWQgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcmVhbEJyZmluZGVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrcG9pbnREYXRhLnJlc29sdmVkID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBwb3NzaWJsZUJyZWFrcG9pbnREYXRhO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zc2libGVCcmVha3BvaW50c0RhdGEgJiZcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5LmlzQXJyYXkocG9zc2libGVCcmVha3BvaW50c0RhdGEpICYmXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3NzaWJsZUJyZWFrcG9pbnRzRGF0YS5sZW5ndGggPiAwXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zc2libGVCcmVha3BvaW50RGF0YSA9IHBvc3NpYmxlQnJlYWtwb2ludHNEYXRhLmZpbmQoKGl0ZW0pID0+IGl0ZW0uZmlsZSA9PT0gZUNhbGxGcmFtZXNbMF0udXJsKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zc2libGVCcmVha3BvaW50RGF0YSAmJlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZW9mIHBvc3NpYmxlQnJlYWtwb2ludERhdGEuZmlsZUxpbmVOdW1iZXJzTGVuZ3RoICE9PSAndW5kZWZpbmVkJyAmJlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWtwb2ludERhdGEubGluZU51bWJlcisxID49IHBvc3NpYmxlQnJlYWtwb2ludERhdGEuZmlsZUxpbmVOdW1iZXJzTGVuZ3RoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWtwb2ludERhdGEubGluZU51bWJlciA9IHBvc3NpYmxlQnJlYWtwb2ludERhdGEuZmlsZUxpbmVOdW1iZXJzTGVuZ3RoIC0gMjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5lbWl0KCdicmVhaycsIGJyZWFrcG9pbnREYXRhKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2JyZWFrcG9pbnRFcnJvcnMgJiZcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5LmlzQXJyYXkodGhpcy5fYnJlYWtwb2ludEVycm9ycykgJiZcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2JyZWFrcG9pbnRFcnJvcnMubGVuZ3RoID4gMFxyXG4gICAgICAgICAgICAgICAgICAgICAgICApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2JyZWFrcG9pbnRFcnJvcnMubWFwKChicmVha3BvaW50RXJyb3IpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYnJlYWtwb2ludEVycm9yICYmIGJyZWFrcG9pbnRFcnJvci5tc2cgJiYgYnJlYWtwb2ludEVycm9yLmZpbGVOYW1lICYmIGJyZWFrcG9pbnRFcnJvci5saW5lKSB7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgbXNnO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgaWdub3JlID0gZmFsc2U7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocG9zc2libGVCcmVha3BvaW50c0RhdGEgJiYgQXJyYXkuaXNBcnJheShwb3NzaWJsZUJyZWFrcG9pbnRzRGF0YSkgJiYgcG9zc2libGVCcmVha3BvaW50c0RhdGEubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zc2libGVCcmVha3BvaW50c0RhdGEubWFwKChpdGVtKSA9PiB7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0uZmlsZSA9IHRyYW5zZm9ybVRvSURFU3R5bGUoaXRlbS5maWxlKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtICYmXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0uZmlsZSA9PT0gYnJlYWtwb2ludEVycm9yLmZpbGVOYW1lICYmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zc2libGVCcmVha3BvaW50RGF0YSAmJlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlb2YgaXRlbS5maWxlTGluZU51bWJlcnNMZW5ndGggIT09ICd1bmRlZmluZWQnXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBsaW5lO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJyZWFrcG9pbnRFcnJvci5saW5lID49IGl0ZW0uZmlsZUxpbmVOdW1iZXJzTGVuZ3RoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lID0gYnJlYWtwb2ludEVycm9yLmxpbmUgLSAyOyAvLyAvLyMgc291cmNlTWFwcGluZ1VSTCBhbmQgfS5jYWxsKHRoaXMsIGV4cG9ydHMsIHJlcXVpcmUsIG1vZHVsZSwgX19maWxlbmFtZSwgX19kaXJuYW1lKTsgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lID0gYnJlYWtwb2ludEVycm9yLmxpbmU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpdGVtLmJyZWFrcG9pbnRzICYmIEFycmF5LmlzQXJyYXkoaXRlbS5icmVha3BvaW50cykgJiYgaXRlbS5icmVha3BvaW50cy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYnJlYWtwb2ludEVycm9yICYmIGJyZWFrcG9pbnRFcnJvci5tc2cgJiYgYnJlYWtwb2ludEVycm9yLm1zZy5pbmNsdWRlcygnUG9zc2libGUgYnJlYWtwb2ludCBsaW5lcycpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWdub3JlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpdGVtLmJyZWFrcG9pbnRzLmluY2x1ZGVzKGxpbmUpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlnbm9yZSA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtc2cgPSBicmVha3BvaW50RXJyb3IubXNnO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1zZyArPSBgJHtsaW5lfS4gYDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtc2cgKz0gYCBQb3NzaWJsZSBicmVha3BvaW50IGxpbmVzIDogJHtpdGVtLmJyZWFrcG9pbnRzLm1hcCgobGluZSkgPT4gbGluZSkuam9pbignLCAnKX1gO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJyZWFrcG9pbnRFcnJvciAmJiBicmVha3BvaW50RXJyb3IubXNnICYmIGJyZWFrcG9pbnRFcnJvci5tc2cuaW5jbHVkZXMoJ3Bvc3NpYmxlIGJyZWFrcG9pbnQgbGluZXMnKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlnbm9yZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtc2cgPSBicmVha3BvaW50RXJyb3IubXNnO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1zZyArPSBgJHtsaW5lfS4gYDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtc2cgKz0gJyBGaWxlIGRvblxcJ3QgaGF2ZSBwb3NzaWJsZSBicmVha3BvaW50IGxpbmVzJztcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWlnbm9yZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5lbWl0KCdicmVha0Vycm9yJywge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IG1zZyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lTnVtYmVyOiBicmVha3BvaW50RXJyb3IubGluZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlTmFtZTogYnJlYWtwb2ludEVycm9yLmZpbGVOYW1lXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGUucmVhc29uID09PSAnT09NJykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gT3V0IG9mIG1lbW9yeSBsZWFrXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbnRpbnVlKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgfSwgcmVhc29uID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZygnYnJlYWtwb2ludHNNYXBSZXN1bHQgcmVzIHJlYXNvbicgLCByZWFzb24pO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHRoaXMuX2NsaWVudC5vbignRGVidWdnZXIuYnJlYWtwb2ludFJlc29sdmVkJywgKGUpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5vbkJyZWFrcG9pbnRSZXNvbHZlZChlKTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgY29uc3QgeyBEZWJ1Z2dlciwgUnVudGltZSB9ID0gdGhpcy5fY2xpZW50O1xyXG4gICAgICAgIHRoaXMuX0RlYnVnZ2VyID0gRGVidWdnZXI7XHJcbiAgICAgICAgdGhpcy5fUnVudGltZSA9IFJ1bnRpbWU7XHJcbiAgICAgICAgUnVudGltZS5lbmFibGUoKTtcclxuICAgICAgICBEZWJ1Z2dlci5lbmFibGUoKTtcclxuICAgICAgICBEZWJ1Z2dlci5zZXRQYXVzZU9uRXhjZXB0aW9ucyh7IHN0YXRlOiAnbm9uZScgfSk7XHJcbiAgICAgICAgRGVidWdnZXIuc2V0QXN5bmNDYWxsU3RhY2tEZXB0aCh7IG1heERlcHRoOiAzMiB9KTtcclxuICAgICAgICBEZWJ1Z2dlci5zZXRCbGFja2JveFBhdHRlcm5zKHsgcGF0dGVybnM6IFtdIH0pO1xyXG4gICAgICAgIC8vIG9ubHkgdXNlICdhd2FpdCcgZm9yIHRoZSBsYXN0IGNhbGwsIGFsbCBwcmV2aW91cyBjYWxsIHRvIERlYnVnZ2VyIG9yIFJ1bnRpbWUgd2lsbCBzdGFjayBvdGhlcndpc2VcclxuICAgICAgICBhd2FpdCBSdW50aW1lLnJ1bklmV2FpdGluZ0ZvckRlYnVnZ2VyKCk7XHJcbiAgICAgICAgLy8gYXdhaXQgZm9yIHRoZSBmaXJzdCBicmVha3BvaW50IHdoaWNoIGlzIHBsYWNlZCBieSB0aGUgZGVidWdnZXIgYXV0b21hdGljYWxseSBcclxuICAgICAgICBhd2FpdCB0aGlzLl9EZWJ1Z2dlci5wYXVzZWQoKTtcclxuICAgICAgICB0aGlzLmVtaXQoJ3JlYWR5Jyk7XHJcbiAgICB9XHJcblxyXG4gICAgb25CcmVha3BvaW50UmVzb2x2ZWQoZSkge1xyXG4gICAgICAgIC8vIGJyZWFrcG9pbnRzIHNldCBiZWZvcmUgdGhlIHNjcmlwdCB3YXMgbG9hZGVkIHdpbGwgYmUgcmVzb2x2ZWQgb25jZSBpdCBsb2Fkc1xyXG4gICAgICAgIGZvciAodmFyIGJwIG9mIHRoaXMuX2JyZWFrcG9pbnRzKSB7XHJcbiAgICAgICAgICAgIGlmIChcclxuICAgICAgICAgICAgICAgIGJwICYmXHJcbiAgICAgICAgICAgICAgICBlICYmXHJcbiAgICAgICAgICAgICAgICBicC5icmVha3BvaW50SWQgPT09IGUuYnJlYWtwb2ludElkXHJcbiAgICAgICAgICAgICkge1xyXG5cclxuICAgICAgICAgICAgICAgIGxldCB2YWxpZGF0ZVJlc3VsdDtcclxuICAgICAgICAgICAgICAgIGlmICggZS5sb2NhdGlvbiApIHtcclxuICAgICAgICAgICAgICAgICAgICAvLyByZXNvbHZlZCBvbiBydW50aW1lXHJcbiAgICAgICAgICAgICAgICAgICAgYnAubG9jYXRpb25zID0gW2UubG9jYXRpb25dO1xyXG4gICAgICAgICAgICAgICAgICAgIHZhbGlkYXRlUmVzdWx0ID0gdmFsaWRhdGVCcmVha3BvaW50KGJwKTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIGUubG9jYXRpb25zICkge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIHJlc29sdmVkIG9uIHBhdXNlXHJcbiAgICAgICAgICAgICAgICAgICAgdmFsaWRhdGVSZXN1bHQgPSB2YWxpZGF0ZUJyZWFrcG9pbnQoYnApO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIGlmICh2YWxpZGF0ZVJlc3VsdCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2JyZWFrcG9pbnRFcnJvcnMucHVzaCh2YWxpZGF0ZVJlc3VsdCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDb25uZWN0cyB0byBhIGRlYnVnZ2VyLiBEb2VzIG5vdGhpbmcgaWYgYWxyZWFkeSBjb25uZWN0ZWQuXHJcbiAgICAgKiBAcGFyYW0ge0ludGVnZXJ9IERlYnVnZ2VyIHBvcnQuXHJcbiAgICAgKi9cclxuICAgIGFzeW5jIGNvbm5lY3QocG9ydCwgaG9zdCkge1xyXG4gICAgICAgIHRoaXMuX3BvcnQgPSBwb3J0O1xyXG4gICAgICAgIHRoaXMuX2hvc3QgPSBob3N0IHx8ICdsb2NhbGhvc3QnO1xyXG5cclxuICAgICAgICBsZXQgc25vb3plVGltZSA9IDEwMDA7XHJcbiAgICAgICAgbGV0IGxhc3RFcnJvciA9IG51bGw7XHJcblxyXG4gICAgICAgIGZvciAobGV0IHJldHJpZXMgPSAwOyByZXRyaWVzIDwgQ09OTkVDVF9SRVRSSUVTOyByZXRyaWVzKyspIHtcclxuICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX2NsaWVudCA9IGF3YWl0IENEUCh7IHBvcnQ6IHRoaXMuX3BvcnQsIGhvc3Q6IHRoaXMuX2hvc3QgfSk7XHJcbiAgICAgICAgICAgICAgICBsYXN0RXJyb3IgPSBudWxsO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgICAgIGxhc3RFcnJvciA9IGU7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGxvZy53YXJuKGBEZWJ1Z2dlciBjb25uZWN0aW9uIGZhaWxlZC4gV2lsbCByZXRyeSBpbiAke3Nub296ZVRpbWUvMTAwMH1zLiBFcnJvcjogYCwgbGFzdEVycm9yKTtcclxuICAgICAgICAgICAgYXdhaXQgc25vb3plKHNub296ZVRpbWUpO1xyXG4gICAgICAgICAgICBzbm9vemVUaW1lICo9IENPTk5FQ1RfU05PT1pFX0lOVEVSVkFMX01VTFQ7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAobGFzdEVycm9yKSB7XHJcbiAgICAgICAgICAgIGxvZy5lcnJvcignRmFpbGVkIHRvIGNvbm5lY3QgdG8gdGhlIGRlYnVnZ2VyOiAnLCBsYXN0RXJyb3IpO1xyXG4gICAgICAgICAgICB0aHJvdyBsYXN0RXJyb3I7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBhd2FpdCB0aGlzLmNvbnRpbnVlQ29ubmVjdCgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0IGJyZWFrcG9pbnQgZm9yIGEgcGFydGljdWxhciBzY3JpcHQuXHJcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gU2NyaXB0IHBhdGguXHJcbiAgICAgKiBAcGFyYW0ge0ludGVnZXJ9IExpbmUgbnVtYmVyLlxyXG4gICAgICovXHJcbiAgICBhc3luYyBzZXRCcmVha3BvaW50KHNjcmlwdFBhdGgsIGxpbmVOdW1iZXIpIHtcclxuICAgICAgICBsZXQgZmlsZU5hbWUgPSBzY3JpcHRQYXRoO1xyXG5cclxuICAgICAgICBjb25zdCBhbGlhc1Jlc3VsdCA9IHRoaXMuaW5GaWxlTmFtZUFsaWFzZXMoZmlsZU5hbWUpO1xyXG5cclxuICAgICAgICBpZiAoYWxpYXNSZXN1bHQpIHtcclxuICAgICAgICAgICAgZmlsZU5hbWUgPSBhbGlhc1Jlc3VsdDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGZpbGVOYW1lID0gdXJsLnBhdGhUb0ZpbGVVUkwoZmlsZU5hbWUpLnRvU3RyaW5nKCk7XHJcbiAgICAgICAgbGV0IGVyciA9IG51bGw7XHJcblxyXG4gICAgICAgIGxldCBicmVha3BvaW50ID0gYXdhaXQgdGhpcy5fRGVidWdnZXIuc2V0QnJlYWtwb2ludEJ5VXJsKHtcclxuICAgICAgICAgICAgdXJsOiBmaWxlTmFtZSxcclxuICAgICAgICAgICAgbGluZU51bWJlcjogbGluZU51bWJlci0xLCAvLyBmcm9tIDEtYmFzZSB0byAwLWJhc2VcclxuICAgICAgICAgICAgY29sdW1uTnVtYmVyOiAwXHJcbiAgICAgICAgfSkuY2F0Y2goZSA9PiB7XHJcbiAgICAgICAgICAgIGVyciA9IGU7XHJcbiAgICAgICAgICAgIC8vIGlnbm9yZSBlcnJvciB3aGVuIHRyeWluZyB0byBzZXQgYW4gbGFyZWFkeSBleGlzdGluZyBicmVha3BvaW50XHJcbiAgICAgICAgICAgIGlmICghZS5yZXNwb25zZSB8fCBlLnJlc3BvbnNlLm1lc3NhZ2UgIT09ICdCcmVha3BvaW50IGF0IHNwZWNpZmllZCBsb2NhdGlvbiBhbHJlYWR5IGV4aXN0cy4nKSB7XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgaWYgKGVycikge1xyXG4gICAgICAgICAgICAvLyBpZ25vcmVcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBicmVha3BvaW50Lm9yaWdpbiA9IHtcclxuICAgICAgICAgICAgICAgIHNjcmlwdFBhdGg6IGZpbGVOYW1lLFxyXG4gICAgICAgICAgICAgICAgbGluZU51bWJlcjogbGluZU51bWJlclxyXG4gICAgICAgICAgICB9O1xyXG5cclxuICAgICAgICAgICAgdGhpcy5fYnJlYWtwb2ludHMucHVzaChicmVha3BvaW50KTtcclxuXHJcbiAgICAgICAgICAgIGlmIChicmVha3BvaW50KSB7XHJcbiAgICAgICAgICAgICAgICAvLyBuZXcgYnJlYWNrcG9pbnQgcmVzb2x2ZWQgc3VjY2Vzc1xyXG4gICAgICAgICAgICAgICAgdGhpcy5vbkJyZWFrcG9pbnRSZXNvbHZlZChicmVha3BvaW50KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIGJyZWFrcG9pbnQ7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgc2V0QnJlYWtwb2ludHNBY3RpdmUoYWN0aXZlKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuX0RlYnVnZ2VyICYmIHRoaXMuX0RlYnVnZ2VyLnNldEJyZWFrcG9pbnRzQWN0aXZlKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCB0aGlzLl9EZWJ1Z2dlci5zZXRCcmVha3BvaW50c0FjdGl2ZSh7J2FjdGl2ZSc6IGFjdGl2ZX0pO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGF3YWl0IHNub296ZSg1MDApO1xyXG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5zZXRCcmVha3BvaW50c0FjdGl2ZShhY3RpdmUpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBhc3luYyByZW1vdmVCcmVha3BvaW50KGJyZWFrcG9pbnRJZCkge1xyXG4gICAgICAgIHRoaXMuX2JyZWFrcG9pbnRzID0gdGhpcy5fYnJlYWtwb2ludHMuZmlsdGVyKChicCkgPT4ge1xyXG4gICAgICAgICAgICByZXR1cm4gYnAuYnJlYWtwb2ludElkICE9PSBicmVha3BvaW50SWQ7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIGNvbnN0IHJlbW92ZUJyID0geyBicmVha3BvaW50SWQ6IGJyZWFrcG9pbnRJZCB9O1xyXG5cclxuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5fRGVidWdnZXIucmVtb3ZlQnJlYWtwb2ludChyZW1vdmVCcik7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgY29udGludWUoKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuX3BhdXNlZCkge1xyXG4gICAgICAgICAgICB0aGlzLl9wYXVzZWQgPSBmYWxzZTtcclxuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuX0RlYnVnZ2VyLnJlc3VtZSgpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBhc3luYyByZXN1bWUoKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuX3BhdXNlZCkge1xyXG4gICAgICAgICAgICB0aGlzLl9wYXVzZWQgPSBmYWxzZTtcclxuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuX0RlYnVnZ2VyLnJlc3VtZSgpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBhc3luYyByZXN1bWVUZXJtaW5hdGUoKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuX3BhdXNlZCkge1xyXG4gICAgICAgICAgICB0aGlzLl9wYXVzZWQgPSBmYWxzZTtcclxuICAgICAgICAgICAgYXdhaXQgdGhpcy5fRGVidWdnZXIucmVzdW1lKHRydWUpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBkaXNhYmxlKCkge1xyXG4gICAgICAgIGlmICh0aGlzLl9wYXVzZWQpIHtcclxuICAgICAgICAgICAgdGhpcy5fcGF1c2VkID0gZmFsc2U7XHJcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuX0RlYnVnZ2VyLmRpc2FibGUodHJ1ZSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIHJlbW92ZUJyZWFrcG9pbnRCeVZhbHVlKGZpbGVQYXRoLCBpbnB1dExpbmUpIHtcclxuXHJcbiAgICAgICAgY29uc3QgZmlsZVBhdGhBbGlhcyA9IHRoaXMuaW5GaWxlTmFtZUFsaWFzZXMoZmlsZVBhdGgpO1xyXG5cclxuICAgICAgICBjb25zdCBsaW5lID0gaW5wdXRMaW5lIC0gMTsgLy8gZnJvbSAxLWJhc2UgdG8gMC1iYXNlXHJcbiAgICAgICAgY29uc3Qgc2VsZiA9IHRoaXM7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLl9icmVha3BvaW50cykge1xyXG4gICAgICAgICAgICBmb3IgKGxldCBiIG9mIHRoaXMuX2JyZWFrcG9pbnRzKSB7XHJcbiAgICAgICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChiICYmIGIuYnJlYWtwb2ludElkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHBhcnRzID0gYi5icmVha3BvaW50SWQuc3BsaXQoJzonKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGZpbGVOYW1lO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgbGluZU51bWJlcjtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcm9jZXNzLnBsYXRmb3JtID09PSAnd2luMzInKSB7IC8vIHBhdGggbWF5IGNvbnRhaW4gYSBEcml2ZSBsZXR0ZXIgb24gd2luMzJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVOYW1lID0gcGFydHNbcGFydHMubGVuZ3RoLTJdICsgJzonICsgcGFydHNbcGFydHMubGVuZ3RoLTFdO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZU51bWJlciA9IHBhcnNlSW50KHBhcnRzWzFdKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVOYW1lID0gcGFydHNbcGFydHMubGVuZ3RoLTFdO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZU51bWJlciA9IHBhcnNlSW50KHBhcnRzWzFdKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGZpbGVOYW1lID09PSBmaWxlUGF0aCB8fCBmaWxlTmFtZSA9PT0gZmlsZVBhdGhBbGlhcylcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIGxpbmVOdW1iZXIgPT09IGxpbmVcclxuICAgICAgICAgICAgICAgICAgICAgICAgKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBzZWxmLnJlbW92ZUJyZWFrcG9pbnQoYi5icmVha3BvaW50SWQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGxvZy5lcnJvcignRmFpbGVkIHdoZW4gd29yayB3aXRoIGJyZWFrcG9pbnQgZGF0YTonLCBlKTtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgY2xlYXJCcmVha3BvaW50cygpIHtcclxuICAgICAgICBjb25zdCBzZWxmID0gdGhpcztcclxuICAgICAgICBpZiAodGhpcy5fYnJlYWtwb2ludHMpIHtcclxuICAgICAgICAgICAgZm9yIChsZXQgYiBvZiB0aGlzLl9icmVha3BvaW50cykge1xyXG4gICAgICAgICAgICAgICAgYXdhaXQgc2VsZi5yZW1vdmVCcmVha3BvaW50KGIuYnJlYWtwb2ludElkKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBnZXRQb3NzaWJsZUJyZWFrcG9pbnRzKHN0YXJ0TG9jYXRpb24pIHtcclxuICAgICAgICBjb25zdCByZXN1bHQgPSBbXTtcclxuICAgICAgICBjb25zdCBwb3NzaWJsZUJyZWFrcG9pbnRzID0gYXdhaXQgdGhpcy5fRGVidWdnZXIuZ2V0UG9zc2libGVCcmVha3BvaW50cyh7XHJcbiAgICAgICAgICAgIHN0YXJ0OiB7XHJcbiAgICAgICAgICAgICAgICBzY3JpcHRJZDogc3RhcnRMb2NhdGlvbi5zY3JpcHRJZCxcclxuICAgICAgICAgICAgICAgIGxpbmVOdW1iZXI6IDAsXHJcbiAgICAgICAgICAgICAgICBjb2x1bW5OdW1iZXI6IDBcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBpZiAocG9zc2libGVCcmVha3BvaW50cyAmJiBwb3NzaWJsZUJyZWFrcG9pbnRzLmxvY2F0aW9ucyAmJiBBcnJheS5pc0FycmF5KHBvc3NpYmxlQnJlYWtwb2ludHMubG9jYXRpb25zKSAmJiBwb3NzaWJsZUJyZWFrcG9pbnRzLmxvY2F0aW9ucy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgIHBvc3NpYmxlQnJlYWtwb2ludHMubG9jYXRpb25zLm1hcCgoaXRlbSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgaWYgKGl0ZW0gJiYgdHlwZW9mIGl0ZW0ubGluZU51bWJlciAhPT0gJ3VuZGVmaW5lZCcpIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBsaW5lTnVtYmVyID0gaXRlbS5saW5lTnVtYmVyICsgMTsgLy8gZnJvbSAwLWJhc2UgdG8gMS1iYXNlXHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChyZXN1bHQuaW5jbHVkZXMobGluZU51bWJlcikpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy9pZ25vcmVcclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaChsaW5lTnVtYmVyKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHJlc3VsdCAmJiBBcnJheS5pc0FycmF5KHJlc3VsdCkgJiYgcmVzdWx0Lmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgbGV0IHAgPSByZXN1bHQucG9wKCk7XHJcblxyXG4gICAgICAgICAgICBpZiAocmVzdWx0LmluY2x1ZGVzKHAtMSkpIHtcclxuICAgICAgICAgICAgICAgIC8vaW5nb3JlXHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBpZiAocC0xID4gMSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKHAtMSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgZ2V0U2NyaXB0U291cmNlKHNjcmlwdElkKSB7XHJcbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuX0RlYnVnZ2VyLmdldFNjcmlwdFNvdXJjZSh7IHNjcmlwdElkOiBzY3JpcHRJZCB9KTtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBjbG9zZSgpIHtcclxuICAgICAgICBhd2FpdCB0aGlzLnJlc2V0KCk7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgYWRkVmFyaWFibGVzRnJvbVNjb3BlQ2hhaW5UcmVlKHZhcmlhYmxlcywgc2NvcGVDaGFpblRyZWUpIHtcclxuICAgICAgICBpZiAoXHJcbiAgICAgICAgICAgICFBcnJheS5pc0FycmF5KHNjb3BlQ2hhaW5UcmVlKVxyXG4gICAgICAgICAgICB8fCBzY29wZUNoYWluVHJlZS5sZW5ndGggPT0gMFxyXG4gICAgICAgICAgICB8fCAhQXJyYXkuaXNBcnJheShzY29wZUNoYWluVHJlZVswXSlcclxuICAgICAgICAgICAgfHwgc2NvcGVDaGFpblRyZWVbMF0ubGVuZ3RoID09IDBcclxuICAgICAgICAgICAgfHwgIUFycmF5LmlzQXJyYXkoc2NvcGVDaGFpblRyZWVbMF1bMF0pXHJcbiAgICAgICAgICAgIHx8IHNjb3BlQ2hhaW5UcmVlWzBdWzBdLmxlbmd0aCA9PSAwXHJcbiAgICAgICAgKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgeyBvYmplY3RJZFJlc3BvbnNlIH0gPSBzY29wZUNoYWluVHJlZVswXVswXVswXTtcclxuICAgICAgICBjb25zdCB7IHJlc3VsdCB9ID0gb2JqZWN0SWRSZXNwb25zZTtcclxuICAgICAgICBmb3IgKGNvbnN0IHNjb3BlVmFyIG9mIHJlc3VsdCkge1xyXG4gICAgICAgICAgICBpZiAoIUlHTk9SRV9TQ09QRV9DSEFJTl9WQVJJQUJMRVMuaW5jbHVkZXMoc2NvcGVWYXIubmFtZSkpIHtcclxuICAgICAgICAgICAgICAgIHZhciB2YWx1ZTtcclxuICAgICAgICAgICAgICAgIHZhciB0eXBlO1xyXG4gICAgICAgICAgICAgICAgaWYgKHNjb3BlVmFyICYmIHNjb3BlVmFyLnZhbHVlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdHlwZSA9IHNjb3BlVmFyLnZhbHVlLnR5cGU7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHNjb3BlVmFyLnZhbHVlLnZhbHVlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gc2NvcGVWYXIudmFsdWUudmFsdWU7XHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBhd2FpdCB0aGlzLnRyeVRvUmV0cmlldmVPYmplY3RWYWx1ZShzY29wZVZhci52YWx1ZS5vYmplY3RJZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgdmFyaWFibGVzLnB1c2goe1xyXG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IHNjb3BlVmFyLm5hbWUsXHJcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogdHlwZSB8fCAndW5kZWZpbmVkJyxcclxuICAgICAgICAgICAgICAgICAgICB2YWx1ZSxcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIHRyeVRvUmV0cmlldmVPYmplY3RWYWx1ZShvYmplY3RJZCkge1xyXG4gICAgICAgIGlmICghb2JqZWN0SWQpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcclxuICAgICAgICB9XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgY29uc3QgeyByZXN1bHQgfSA9IGF3YWl0IHRoaXMuX1J1bnRpbWUuZ2V0UHJvcGVydGllcyh7IG9iamVjdElkIH0pO1xyXG4gICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShyZXN1bHQpICYmIHJlc3VsdC5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBvYmpWYWx1ZSA9IHt9O1xyXG4gICAgICAgICAgICAgICAgcmVzdWx0LmZvckVhY2gocHJvcERlc2MgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChwcm9wRGVzYy52YWx1ZSAmJiBwcm9wRGVzYy52YWx1ZS52YWx1ZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBvYmpWYWx1ZVtwcm9wRGVzYy5uYW1lXSA9IHByb3BEZXNjLnZhbHVlLnZhbHVlO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIG9ialZhbHVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ1J1bnRpbWUuZ2V0UHJvcGVydGllcyBjYWxsIGZhaWxlZCcsIGUpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIGFkZE94eWdlblZhcmlhYmxlc0Zyb21HbG9iYWxTY29wZSh2YXJpYWJsZXMpIHtcclxuICAgICAgICBjb25zdCB7IHJlc3VsdDogcG9FdmFsUmVzdWx0IH0gPSBhd2FpdCB0aGlzLl9SdW50aW1lLmV2YWx1YXRlKHsgZXhwcmVzc2lvbjogJ3BvJywgcmV0dXJuQnlWYWx1ZTogdHJ1ZSB9KTtcclxuICAgICAgICBjb25zdCB7IHJlc3VsdDogZW52RXZhbFJlc3VsdCB9ID0gYXdhaXQgdGhpcy5fUnVudGltZS5ldmFsdWF0ZSh7IGV4cHJlc3Npb246ICdlbnYnLCByZXR1cm5CeVZhbHVlOiB0cnVlIH0pO1xyXG4gICAgICAgIGNvbnN0IHsgcmVzdWx0OiB2YXJzRXZhbFJlc3VsdCB9ID0gYXdhaXQgdGhpcy5fUnVudGltZS5ldmFsdWF0ZSh7IGV4cHJlc3Npb246ICd2YXJzJywgcmV0dXJuQnlWYWx1ZTogdHJ1ZSB9KTtcclxuICAgICAgICBjb25zdCB7IHJlc3VsdDogcGFyYW1zRXZhbFJlc3VsdCB9ID0gYXdhaXQgdGhpcy5fUnVudGltZS5ldmFsdWF0ZSh7IGV4cHJlc3Npb246ICdwYXJhbXMnLCByZXR1cm5CeVZhbHVlOiB0cnVlIH0pO1xyXG4gICAgICAgIGNvbnN0IHJlc3VsdHMgPSB7XHJcbiAgICAgICAgICAgIHBvOiBwb0V2YWxSZXN1bHQsXHJcbiAgICAgICAgICAgIGVudjogZW52RXZhbFJlc3VsdCxcclxuICAgICAgICAgICAgdmFyczogdmFyc0V2YWxSZXN1bHQsXHJcbiAgICAgICAgICAgIHBhcmFtczogcGFyYW1zRXZhbFJlc3VsdCxcclxuICAgICAgICB9O1xyXG4gICAgICAgIE9iamVjdC5rZXlzKHJlc3VsdHMpLmZvckVhY2goa2V5ID0+IHtcclxuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gcmVzdWx0c1trZXldO1xyXG4gICAgICAgICAgICBpZiAocmVzdWx0LnZhbHVlKSB7XHJcbiAgICAgICAgICAgICAgICB2YXJpYWJsZXMucHVzaCh7XHJcbiAgICAgICAgICAgICAgICAgICAgbmFtZToga2V5LFxyXG4gICAgICAgICAgICAgICAgICAgIHR5cGU6ICdvYmplY3QnLFxyXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlOiByZXN1bHQudmFsdWUsXHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGdldEJyZWFrcG9pbnRzKGZpbGVQYXRoKSB7XHJcbiAgICAgICAgdmFyIGJwcyA9IFtdO1xyXG4gICAgICAgIGZvciAobGV0IGIgb2YgdGhpcy5fYnJlYWtwb2ludHMpIHtcclxuICAgICAgICAgICAgY29uc3QgcGFydHMgPSBiLmJyZWFrcG9pbnRJZC5zcGxpdCgnOicpO1xyXG4gICAgICAgICAgICBsZXQgZmlsZU5hbWU7XHJcbiAgICAgICAgICAgIGxldCBsaW5lTnVtYmVyO1xyXG5cclxuICAgICAgICAgICAgaWYgKHByb2Nlc3MucGxhdGZvcm0gPT09ICd3aW4zMicpIHsgLy8gcGF0aCBtYXkgY29udGFpbiBhIERyaXZlIGxldHRlciBvbiB3aW4zMlxyXG4gICAgICAgICAgICAgICAgZmlsZU5hbWUgPSBwYXJ0c1twYXJ0cy5sZW5ndGgtMl0gKyAnOicgKyBwYXJ0c1twYXJ0cy5sZW5ndGgtMV07XHJcbiAgICAgICAgICAgICAgICBsaW5lTnVtYmVyID0gcGFyc2VJbnQocGFydHNbMV0pKzE7IC8vZnJvbSAwLWJhc2UgdG8gMS1iYXNlXHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBmaWxlTmFtZSA9IHBhcnRzW3BhcnRzLmxlbmd0aC0xXTtcclxuICAgICAgICAgICAgICAgIGxpbmVOdW1iZXIgPSBwYXJzZUludChwYXJ0c1sxXSkrMTsgLy9mcm9tIDAtYmFzZSB0byAxLWJhc2VcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKGZpbGVOYW1lID09PSBmaWxlUGF0aCkge1xyXG4gICAgICAgICAgICAgICAgYnBzLnB1c2gobGluZU51bWJlcik7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBmaWxlUGF0aEFsaWFzID0gdGhpcy5pbkZpbGVOYW1lQWxpYXNlcyhmaWxlUGF0aCk7XHJcbiAgICAgICAgICAgICAgICBpZiAoZmlsZVBhdGhBbGlhcykge1xyXG4gICAgICAgICAgICAgICAgICAgIGJwcy5wdXNoKGxpbmVOdW1iZXIpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBicHM7XHJcbiAgICB9XHJcbn1cclxuIl0sIm1hcHBpbmdzIjoiQUFhQSxZQUFZOztBQUFDO0VBQUE7QUFBQTtBQUFBO0FBQUE7QUFFYjtBQUlBO0FBQXNCO0FBSHRCLE1BQU1BLEdBQUcsR0FBRyxJQUFBQyxlQUFNLEVBQUMsVUFBVSxDQUFDO0FBQzlCLE1BQU07RUFBRUM7QUFBYSxDQUFDLEdBQUdDLE9BQU8sQ0FBQyxRQUFRLENBQUM7QUFDMUMsTUFBTUMsR0FBRyxHQUFHRCxPQUFPLENBQUMsbUNBQW1DLENBQUM7QUFHeEQsTUFBTUUsZUFBZSxHQUFHLENBQUM7QUFDekIsTUFBTUMsNEJBQTRCLEdBQUcsQ0FBQztBQUN0QyxNQUFNQyxT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