@workflow/core 5.0.0-beta.5 → 5.0.0-beta.50

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 (310) hide show
  1. package/dist/attribute-changes.d.ts +5 -0
  2. package/dist/attribute-changes.d.ts.map +1 -0
  3. package/dist/attribute-changes.js +25 -0
  4. package/dist/capabilities.d.ts +35 -2
  5. package/dist/capabilities.d.ts.map +1 -1
  6. package/dist/capabilities.js +74 -5
  7. package/dist/capture-stack.d.ts +1 -1
  8. package/dist/capture-stack.js +2 -2
  9. package/dist/class-serialization.d.ts +32 -0
  10. package/dist/class-serialization.d.ts.map +1 -1
  11. package/dist/class-serialization.js +37 -1
  12. package/dist/classify-error.d.ts +19 -3
  13. package/dist/classify-error.d.ts.map +1 -1
  14. package/dist/classify-error.js +98 -6
  15. package/dist/context-violation-error.d.ts +5 -5
  16. package/dist/context-violation-error.d.ts.map +1 -1
  17. package/dist/context-violation-error.js +8 -6
  18. package/dist/create-hook.d.ts +72 -7
  19. package/dist/create-hook.d.ts.map +1 -1
  20. package/dist/create-hook.js +1 -1
  21. package/dist/define-hook.js +2 -2
  22. package/dist/describe-error.d.ts +7 -7
  23. package/dist/describe-error.d.ts.map +1 -1
  24. package/dist/describe-error.js +97 -12
  25. package/dist/encryption.d.ts +38 -4
  26. package/dist/encryption.d.ts.map +1 -1
  27. package/dist/encryption.js +96 -14
  28. package/dist/events-consumer.d.ts +271 -0
  29. package/dist/events-consumer.d.ts.map +1 -1
  30. package/dist/events-consumer.js +646 -42
  31. package/dist/flushable-stream.d.ts +56 -1
  32. package/dist/flushable-stream.d.ts.map +1 -1
  33. package/dist/flushable-stream.js +123 -11
  34. package/dist/global.d.ts +36 -2
  35. package/dist/global.d.ts.map +1 -1
  36. package/dist/global.js +21 -6
  37. package/dist/index.d.ts +2 -1
  38. package/dist/index.d.ts.map +1 -1
  39. package/dist/index.js +3 -2
  40. package/dist/log-format.d.ts +2 -2
  41. package/dist/log-format.js +7 -7
  42. package/dist/logger.d.ts +1 -0
  43. package/dist/logger.d.ts.map +1 -1
  44. package/dist/logger.js +10 -6
  45. package/dist/private.d.ts +226 -9
  46. package/dist/private.d.ts.map +1 -1
  47. package/dist/private.js +626 -7
  48. package/dist/replay-payload-cache.d.ts +64 -0
  49. package/dist/replay-payload-cache.d.ts.map +1 -0
  50. package/dist/replay-payload-cache.js +158 -0
  51. package/dist/runtime/compute-instance.d.ts +13 -0
  52. package/dist/runtime/compute-instance.d.ts.map +1 -0
  53. package/dist/runtime/compute-instance.js +14 -0
  54. package/dist/runtime/constants.d.ts +315 -0
  55. package/dist/runtime/constants.d.ts.map +1 -1
  56. package/dist/runtime/constants.js +502 -16
  57. package/dist/runtime/count-step-started-events.d.ts +52 -0
  58. package/dist/runtime/count-step-started-events.d.ts.map +1 -0
  59. package/dist/runtime/count-step-started-events.js +72 -0
  60. package/dist/runtime/deployment-guard.d.ts +99 -0
  61. package/dist/runtime/deployment-guard.d.ts.map +1 -0
  62. package/dist/runtime/deployment-guard.js +154 -0
  63. package/dist/runtime/get-port-lazy.d.ts +15 -0
  64. package/dist/runtime/get-port-lazy.d.ts.map +1 -1
  65. package/dist/runtime/get-port-lazy.js +75 -6
  66. package/dist/runtime/get-world-lazy.d.ts +5 -14
  67. package/dist/runtime/get-world-lazy.d.ts.map +1 -1
  68. package/dist/runtime/get-world-lazy.js +19 -29
  69. package/dist/runtime/helpers.d.ts +341 -29
  70. package/dist/runtime/helpers.d.ts.map +1 -1
  71. package/dist/runtime/helpers.js +559 -57
  72. package/dist/runtime/quickjs-assets.generated.d.ts +14 -0
  73. package/dist/runtime/quickjs-assets.generated.d.ts.map +1 -0
  74. package/dist/runtime/quickjs-assets.generated.js +30 -0
  75. package/dist/runtime/quickjs-entrypoint.d.ts +136 -0
  76. package/dist/runtime/quickjs-entrypoint.d.ts.map +1 -0
  77. package/dist/runtime/quickjs-entrypoint.js +1686 -0
  78. package/dist/runtime/quickjs-runtime.d.ts +244 -0
  79. package/dist/runtime/quickjs-runtime.d.ts.map +1 -0
  80. package/dist/runtime/quickjs-runtime.js +2427 -0
  81. package/dist/runtime/quickjs-serde.d.ts +107 -0
  82. package/dist/runtime/quickjs-serde.d.ts.map +1 -0
  83. package/dist/runtime/quickjs-serde.js +2159 -0
  84. package/dist/runtime/replay-budget.d.ts +97 -0
  85. package/dist/runtime/replay-budget.d.ts.map +1 -0
  86. package/dist/runtime/replay-budget.js +139 -0
  87. package/dist/runtime/replay-recovery-reporter.d.ts +36 -0
  88. package/dist/runtime/replay-recovery-reporter.d.ts.map +1 -0
  89. package/dist/runtime/replay-recovery-reporter.js +64 -0
  90. package/dist/runtime/resume-hook.d.ts +91 -8
  91. package/dist/runtime/resume-hook.d.ts.map +1 -1
  92. package/dist/runtime/resume-hook.js +512 -89
  93. package/dist/runtime/resume-latency.d.ts +150 -0
  94. package/dist/runtime/resume-latency.d.ts.map +1 -0
  95. package/dist/runtime/resume-latency.js +155 -0
  96. package/dist/runtime/run-id-time.d.ts +19 -0
  97. package/dist/runtime/run-id-time.d.ts.map +1 -0
  98. package/dist/runtime/run-id-time.js +42 -0
  99. package/dist/runtime/run.d.ts +72 -7
  100. package/dist/runtime/run.d.ts.map +1 -1
  101. package/dist/runtime/run.js +280 -53
  102. package/dist/runtime/runs.d.ts +54 -3
  103. package/dist/runtime/runs.d.ts.map +1 -1
  104. package/dist/runtime/runs.js +126 -16
  105. package/dist/runtime/start.d.ts +101 -2
  106. package/dist/runtime/start.d.ts.map +1 -1
  107. package/dist/runtime/start.js +352 -61
  108. package/dist/runtime/step-executor.d.ts +205 -5
  109. package/dist/runtime/step-executor.d.ts.map +1 -1
  110. package/dist/runtime/step-executor.js +760 -127
  111. package/dist/runtime/step-latency.d.ts +220 -0
  112. package/dist/runtime/step-latency.d.ts.map +1 -0
  113. package/dist/runtime/step-latency.js +215 -0
  114. package/dist/runtime/step-ownership.d.ts +72 -0
  115. package/dist/runtime/step-ownership.d.ts.map +1 -0
  116. package/dist/runtime/step-ownership.js +114 -0
  117. package/dist/runtime/step-single-flight.d.ts +12 -0
  118. package/dist/runtime/step-single-flight.d.ts.map +1 -0
  119. package/dist/runtime/step-single-flight.js +75 -0
  120. package/dist/runtime/suspension-handler.d.ts +269 -7
  121. package/dist/runtime/suspension-handler.d.ts.map +1 -1
  122. package/dist/runtime/suspension-handler.js +1253 -125
  123. package/dist/runtime/unserializable-step.d.ts +34 -0
  124. package/dist/runtime/unserializable-step.d.ts.map +1 -0
  125. package/dist/runtime/unserializable-step.js +52 -0
  126. package/dist/runtime/vm-mode.d.ts +44 -0
  127. package/dist/runtime/vm-mode.d.ts.map +1 -0
  128. package/dist/runtime/vm-mode.js +62 -0
  129. package/dist/runtime/vm-serde-bundle.generated.d.ts +14 -0
  130. package/dist/runtime/vm-serde-bundle.generated.d.ts.map +1 -0
  131. package/dist/runtime/vm-serde-bundle.generated.js +16 -0
  132. package/dist/runtime/wait-continuation.d.ts +106 -0
  133. package/dist/runtime/wait-continuation.d.ts.map +1 -0
  134. package/dist/runtime/wait-continuation.js +136 -0
  135. package/dist/runtime/wait-until.d.ts +18 -0
  136. package/dist/runtime/wait-until.d.ts.map +1 -0
  137. package/dist/runtime/wait-until.js +42 -0
  138. package/dist/runtime/world-compatibility.d.ts +32 -0
  139. package/dist/runtime/world-compatibility.d.ts.map +1 -0
  140. package/dist/runtime/world-compatibility.js +44 -0
  141. package/dist/runtime/world-init.d.ts +17 -42
  142. package/dist/runtime/world-init.d.ts.map +1 -1
  143. package/dist/runtime/world-init.js +18 -43
  144. package/dist/runtime/world.d.ts +14 -2
  145. package/dist/runtime/world.d.ts.map +1 -1
  146. package/dist/runtime/world.js +75 -19
  147. package/dist/runtime.d.ts +10 -6
  148. package/dist/runtime.d.ts.map +1 -1
  149. package/dist/runtime.js +3741 -490
  150. package/dist/sealed-box.d.ts +167 -0
  151. package/dist/sealed-box.d.ts.map +1 -0
  152. package/dist/sealed-box.js +571 -0
  153. package/dist/serialization/client.d.ts +3 -3
  154. package/dist/serialization/client.d.ts.map +1 -1
  155. package/dist/serialization/client.js +8 -4
  156. package/dist/serialization/codec-devalue-vm.d.ts +16 -0
  157. package/dist/serialization/codec-devalue-vm.d.ts.map +1 -0
  158. package/dist/serialization/codec-devalue-vm.js +148 -0
  159. package/dist/serialization/codec-devalue.d.ts +1 -1
  160. package/dist/serialization/codec-devalue.d.ts.map +1 -1
  161. package/dist/serialization/codec-devalue.js +24 -6
  162. package/dist/serialization/codec.d.ts +37 -2
  163. package/dist/serialization/codec.d.ts.map +1 -1
  164. package/dist/serialization/codec.js +2 -2
  165. package/dist/serialization/compression.d.ts +105 -0
  166. package/dist/serialization/compression.d.ts.map +1 -0
  167. package/dist/serialization/compression.js +261 -0
  168. package/dist/serialization/encryption.d.ts +119 -17
  169. package/dist/serialization/encryption.d.ts.map +1 -1
  170. package/dist/serialization/encryption.js +152 -17
  171. package/dist/serialization/errors.d.ts +13 -0
  172. package/dist/serialization/errors.d.ts.map +1 -1
  173. package/dist/serialization/errors.js +20 -2
  174. package/dist/serialization/format.d.ts +6 -6
  175. package/dist/serialization/format.js +7 -7
  176. package/dist/serialization/hardened.d.ts +156 -0
  177. package/dist/serialization/hardened.d.ts.map +1 -0
  178. package/dist/serialization/hardened.js +538 -0
  179. package/dist/serialization/index.d.ts +10 -8
  180. package/dist/serialization/index.d.ts.map +1 -1
  181. package/dist/serialization/index.js +10 -8
  182. package/dist/serialization/reducers/class-vm.d.ts +20 -0
  183. package/dist/serialization/reducers/class-vm.d.ts.map +1 -0
  184. package/dist/serialization/reducers/class-vm.js +77 -0
  185. package/dist/serialization/reducers/class.d.ts.map +1 -1
  186. package/dist/serialization/reducers/class.js +11 -6
  187. package/dist/serialization/reducers/common-vm.d.ts +15 -0
  188. package/dist/serialization/reducers/common-vm.d.ts.map +1 -0
  189. package/dist/serialization/reducers/common-vm.js +616 -0
  190. package/dist/serialization/reducers/common.d.ts +1 -1
  191. package/dist/serialization/reducers/common.d.ts.map +1 -1
  192. package/dist/serialization/reducers/common.js +202 -62
  193. package/dist/serialization/reducers/step-function-vm.d.ts +44 -0
  194. package/dist/serialization/reducers/step-function-vm.d.ts.map +1 -0
  195. package/dist/serialization/reducers/step-function-vm.js +97 -0
  196. package/dist/serialization/reducers/step-function.d.ts.map +1 -1
  197. package/dist/serialization/reducers/step-function.js +25 -9
  198. package/dist/serialization/step.d.ts +4 -4
  199. package/dist/serialization/step.d.ts.map +1 -1
  200. package/dist/serialization/step.js +9 -5
  201. package/dist/serialization/types.d.ts +80 -1
  202. package/dist/serialization/types.d.ts.map +1 -1
  203. package/dist/serialization/types.js +15 -1
  204. package/dist/serialization/workflow-vm.d.ts +29 -0
  205. package/dist/serialization/workflow-vm.d.ts.map +1 -0
  206. package/dist/serialization/workflow-vm.js +74 -0
  207. package/dist/serialization-format.d.ts +64 -8
  208. package/dist/serialization-format.d.ts.map +1 -1
  209. package/dist/serialization-format.js +225 -73
  210. package/dist/serialization.d.ts +262 -34
  211. package/dist/serialization.d.ts.map +1 -1
  212. package/dist/serialization.js +1879 -274
  213. package/dist/set-attributes.d.ts +13 -0
  214. package/dist/set-attributes.d.ts.map +1 -0
  215. package/dist/set-attributes.js +60 -0
  216. package/dist/source-map.d.ts +25 -0
  217. package/dist/source-map.d.ts.map +1 -1
  218. package/dist/source-map.js +154 -10
  219. package/dist/step/context-storage.d.ts +61 -2
  220. package/dist/step/context-storage.d.ts.map +1 -1
  221. package/dist/step/context-storage.js +7 -5
  222. package/dist/step/writable-stream.d.ts +3 -3
  223. package/dist/step/writable-stream.d.ts.map +1 -1
  224. package/dist/step/writable-stream.js +72 -9
  225. package/dist/step.d.ts.map +1 -1
  226. package/dist/step.js +148 -27
  227. package/dist/symbols.d.ts +50 -0
  228. package/dist/symbols.d.ts.map +1 -1
  229. package/dist/symbols.js +51 -1
  230. package/dist/telemetry/semantic-conventions.d.ts +397 -2
  231. package/dist/telemetry/semantic-conventions.d.ts.map +1 -1
  232. package/dist/telemetry/semantic-conventions.js +297 -3
  233. package/dist/telemetry.d.ts +91 -0
  234. package/dist/telemetry.d.ts.map +1 -1
  235. package/dist/telemetry.js +244 -17
  236. package/dist/test-support/orchestrator-context.d.ts +25 -0
  237. package/dist/test-support/orchestrator-context.d.ts.map +1 -0
  238. package/dist/test-support/orchestrator-context.js +101 -0
  239. package/dist/types.d.ts +6 -0
  240. package/dist/types.d.ts.map +1 -1
  241. package/dist/types.js +23 -1
  242. package/dist/util.d.ts +0 -5
  243. package/dist/util.d.ts.map +1 -1
  244. package/dist/util.js +1 -15
  245. package/dist/version.d.ts +1 -1
  246. package/dist/version.d.ts.map +1 -1
  247. package/dist/version.js +2 -2
  248. package/dist/vm/index.d.ts.map +1 -1
  249. package/dist/vm/index.js +84 -14
  250. package/dist/vm/script-cache.d.ts +26 -0
  251. package/dist/vm/script-cache.d.ts.map +1 -0
  252. package/dist/vm/script-cache.js +131 -0
  253. package/dist/vm/uint8array-base64.js +1 -1
  254. package/dist/workflow/abort-controller.d.ts +2 -2
  255. package/dist/workflow/abort-controller.d.ts.map +1 -1
  256. package/dist/workflow/abort-controller.js +88 -21
  257. package/dist/workflow/attribute-dispatcher.d.ts +6 -0
  258. package/dist/workflow/attribute-dispatcher.d.ts.map +1 -0
  259. package/dist/workflow/attribute-dispatcher.js +45 -0
  260. package/dist/workflow/create-hook.d.ts.map +1 -1
  261. package/dist/workflow/create-hook.js +24 -3
  262. package/dist/workflow/get-workflow-metadata.js +2 -2
  263. package/dist/workflow/hook.d.ts.map +1 -1
  264. package/dist/workflow/hook.js +304 -47
  265. package/dist/workflow/index.d.ts +1 -0
  266. package/dist/workflow/index.d.ts.map +1 -1
  267. package/dist/workflow/index.js +2 -1
  268. package/dist/workflow/set-attributes.d.ts +68 -0
  269. package/dist/workflow/set-attributes.d.ts.map +1 -0
  270. package/dist/workflow/set-attributes.js +60 -0
  271. package/dist/workflow/sleep.d.ts.map +1 -1
  272. package/dist/workflow/sleep.js +58 -12
  273. package/dist/workflow/world-init-stub.d.ts +3 -3
  274. package/dist/workflow/world-init-stub.js +4 -4
  275. package/dist/workflow.d.ts +95 -3
  276. package/dist/workflow.d.ts.map +1 -1
  277. package/dist/workflow.js +895 -561
  278. package/docs/api-reference/create-hook.mdx +89 -10
  279. package/docs/api-reference/create-webhook.mdx +16 -15
  280. package/docs/api-reference/define-hook.mdx +35 -33
  281. package/docs/api-reference/fatal-error.mdx +30 -8
  282. package/docs/api-reference/fetch.mdx +14 -10
  283. package/docs/api-reference/get-step-metadata.mdx +2 -2
  284. package/docs/api-reference/get-workflow-metadata.mdx +3 -3
  285. package/docs/api-reference/get-writable.mdx +7 -7
  286. package/docs/api-reference/index.mdx +4 -1
  287. package/docs/api-reference/retryable-error.mdx +1 -1
  288. package/docs/api-reference/set-attributes.mdx +61 -0
  289. package/docs/api-reference/sleep.mdx +4 -4
  290. package/docs/foundations/cancellation.mdx +31 -32
  291. package/docs/foundations/errors-and-retries.mdx +42 -11
  292. package/docs/foundations/hooks.mdx +64 -35
  293. package/docs/foundations/idempotency.mdx +244 -12
  294. package/docs/foundations/index.mdx +1 -23
  295. package/docs/foundations/meta.json +2 -1
  296. package/docs/foundations/serialization.mdx +21 -22
  297. package/docs/foundations/starting-workflows.mdx +106 -30
  298. package/docs/foundations/streaming.mdx +107 -59
  299. package/docs/foundations/versioning.mdx +263 -0
  300. package/docs/foundations/workflows-and-steps.mdx +9 -9
  301. package/docs/how-it-works/cancellation.mdx +63 -63
  302. package/docs/how-it-works/code-transform.mdx +83 -67
  303. package/docs/how-it-works/encryption.mdx +30 -26
  304. package/docs/how-it-works/event-sourcing.mdx +98 -34
  305. package/docs/how-it-works/framework-integrations.mdx +96 -337
  306. package/docs/how-it-works/understanding-directives.mdx +22 -22
  307. package/package.json +24 -15
  308. package/dist/runtime/step-handler.d.ts +0 -2
  309. package/dist/runtime/step-handler.d.ts.map +0 -1
  310. package/dist/runtime/step-handler.js +0 -776
@@ -9,7 +9,8 @@
9
9
  * implementation will be needed.
10
10
  */
11
11
  import { types } from 'node:util';
12
- import { FatalError, RetryableError } from '@workflow/errors';
12
+ import { FatalError, HookConflictError, RetryableError, RuntimeDecryptionError, StreamError, } from '@workflow/errors';
13
+ import { arrayBufferByteLength, dateGetDate, dateGetTime, dateToISOString, hasProperty, headersToEntries, isInstanceOfPrototype, mapToEntries, readProperty, recordGuestCode, regExpFlags, regExpSource, setToValues, urlHref, urlSearchParamsToString, viewInfo, } from '../hardened.js';
13
14
  // ---- Base64 helpers ----
14
15
  function arrayBufferToBase64(value, offset, length) {
15
16
  // Avoid returning falsy value for zero-length buffers
@@ -20,7 +21,12 @@ function arrayBufferToBase64(value, offset, length) {
20
21
  return Buffer.from(uint8).toString('base64');
21
22
  }
22
23
  function viewToBase64(value) {
23
- return arrayBufferToBase64(value.buffer, value.byteOffset, value.byteLength);
24
+ // Read the view's range through internal-slot getters (see hardened.ts):
25
+ // own properties shadowing `buffer`/`byteOffset`/`byteLength` (or patched
26
+ // prototype getters in the sandbox realm) cannot change which bytes are
27
+ // serialized.
28
+ const info = viewInfo(value);
29
+ return arrayBufferToBase64(info.buffer, info.byteOffset, info.byteLength);
24
30
  }
25
31
  function reviveArrayBuffer(value, global) {
26
32
  const base64 = value === '.' ? '' : value;
@@ -37,6 +43,28 @@ function revive(str) {
37
43
  // with JSON.parse yields the flattened form that unflatten() expects.
38
44
  return JSON.parse(str);
39
45
  }
46
+ /**
47
+ * Reads `error.stack` for serialization. A natural V8 error carries `stack`
48
+ * as an own *accessor* whose first invocation formats and caches the trace.
49
+ * That read is not passive: it executes `Error.prepareStackTrace` when the
50
+ * realm has one installed, and the format-and-cache itself is
51
+ * workflow-visible (a formatter installed later never runs for an
52
+ * already-materialized error). A cold replay repeats neither (it skips
53
+ * dehydration entirely), so the read is recorded as guest code. A
54
+ * data-property `stack` (rehydrated errors, workflow-assigned strings)
55
+ * reads passively.
56
+ */
57
+ function readErrorStack(value) {
58
+ const descriptor = Object.getOwnPropertyDescriptor(value, 'stack');
59
+ if (descriptor && 'value' in descriptor) {
60
+ return descriptor.value;
61
+ }
62
+ recordGuestCode('getter', 'stack');
63
+ if (descriptor?.get) {
64
+ return descriptor.get.call(value);
65
+ }
66
+ return readProperty(value, 'stack');
67
+ }
40
68
  /**
41
69
  * Reduces any native Error instance to the shared `BaseErrorPayload` shape,
42
70
  * preserving `cause` only when present (to distinguish "no cause" from
@@ -50,12 +78,15 @@ function revive(str) {
50
78
  function reduceErrorBase(value) {
51
79
  if (!types.isNativeError(value))
52
80
  return false;
81
+ // `message`/`cause` are own data properties on natural errors, so the
82
+ // descriptor-based reads cost nothing; a sandbox-defined accessor
83
+ // (e.g. a getter on an Error subclass) is still invoked but recorded.
53
84
  const reduced = {
54
- message: value.message,
55
- stack: value.stack,
85
+ message: readProperty(value, 'message'),
86
+ stack: readErrorStack(value),
56
87
  };
57
- if ('cause' in value)
58
- reduced.cause = value.cause;
88
+ if (hasProperty(value, 'cause'))
89
+ reduced.cause = readProperty(value, 'cause');
59
90
  return reduced;
60
91
  }
61
92
  /**
@@ -66,8 +97,8 @@ function reduceErrorBase(value) {
66
97
  * - Inline reducers for subclasses that extend the shape with additional
67
98
  * fields (e.g. `AggregateError.errors`, `RetryableError.retryAfter`).
68
99
  *
69
- * Matching by `value.name` (instead of `value.constructor?.name`) is robust
70
- * to bundlers that emit the class as an anonymous expression — e.g. Turbopack
100
+ * Matching by `value.name` (instead of `value.constructor?.name`) works with
101
+ * bundlers that emit the class as an anonymous expression. E.g. Turbopack
71
102
  * compiles `export class FatalError extends Error {…}` to a registration call
72
103
  * like `e.s(["FatalError", 0, class extends Error {…}])`, and the resulting
73
104
  * constructor has `name === ''`. Since every Error subclass we care about
@@ -79,7 +110,7 @@ function reduceErrorBase(value) {
79
110
  function reduceNamedErrorSubclassBase(subclassName, value) {
80
111
  if (!types.isNativeError(value))
81
112
  return false;
82
- if (value.name !== subclassName)
113
+ if (readProperty(value, 'name') !== subclassName)
83
114
  return false;
84
115
  return reduceErrorBase(value);
85
116
  }
@@ -115,18 +146,30 @@ function makeErrorSubclassReviver(global, ctorName) {
115
146
  };
116
147
  }
117
148
  // ---- Reducers ----
118
- export function getCommonReducers(global = globalThis) {
149
+ export function getCommonReducers(
150
+ // The `global` parameter is retained for API compatibility, but the
151
+ // reducers no longer perform `instanceof global.X` checks: classification
152
+ // is done with engine-level brand checks (realm-agnostic, immune to
153
+ // reassigned sandbox globals and `Symbol.hasInstance`), and extraction
154
+ // goes through intrinsics captured at host boot. See ../hardened.ts.
155
+ _global = globalThis) {
119
156
  return {
120
- ArrayBuffer: (value) => value instanceof global.ArrayBuffer &&
121
- arrayBufferToBase64(value, 0, value.byteLength),
122
- BigInt: (value) => typeof value === 'bigint' && value.toString(),
123
- BigInt64Array: (value) => value instanceof global.BigInt64Array && viewToBase64(value),
124
- BigUint64Array: (value) => value instanceof global.BigUint64Array && viewToBase64(value),
157
+ ArrayBuffer: (value) => types.isArrayBuffer(value) &&
158
+ arrayBufferToBase64(value, 0, arrayBufferByteLength(value)),
159
+ BigInt: (value) =>
160
+ // String(bigint) is a spec-internal numeric conversion: unlike
161
+ // `value.toString()`, it never consults BigInt.prototype.
162
+ typeof value === 'bigint' && String(value),
163
+ BigInt64Array: (value) => types.isBigInt64Array(value) && viewToBase64(value),
164
+ BigUint64Array: (value) => types.isBigUint64Array(value) && viewToBase64(value),
125
165
  Date: (value) => {
126
- if (!(value instanceof global.Date))
166
+ // Brand check + captured intrinsics: a sandbox-side patch of
167
+ // `Date.prototype.toISOString` (e.g. a Temporal polyfill wrapping it)
168
+ // is never executed, and cannot perturb VM state during serialization.
169
+ if (!types.isDate(value))
127
170
  return false;
128
- const valid = !Number.isNaN(value.getDate());
129
- return valid ? value.toISOString() : '.';
171
+ const valid = !Number.isNaN(dateGetDate(value));
172
+ return valid ? dateToISOString(value) : '.';
130
173
  },
131
174
  // DOMException is a special case: it `instanceof Error` is true in Node,
132
175
  // but `types.isNativeError()` returns FALSE for it, so the generic Error
@@ -137,17 +180,17 @@ export function getCommonReducers(global = globalThis) {
137
180
  DOMException: (value) => {
138
181
  if (value === null || typeof value !== 'object')
139
182
  return false;
140
- if (value.constructor?.name !==
141
- 'DOMException')
183
+ const ctor = readProperty(value, 'constructor');
184
+ if (!ctor || readProperty(ctor, 'name') !== 'DOMException')
142
185
  return false;
143
- const e = value;
144
186
  const reduced = {
145
- message: e.message,
146
- name: e.name,
147
- stack: e.stack,
187
+ message: readProperty(value, 'message'),
188
+ name: readProperty(value, 'name'),
189
+ stack: readErrorStack(value),
148
190
  };
149
- if ('cause' in e)
150
- reduced.cause = e.cause;
191
+ if (hasProperty(value, 'cause')) {
192
+ reduced.cause = readProperty(value, 'cause');
193
+ }
151
194
  return reduced;
152
195
  },
153
196
  // Error subclass reducers are intentionally placed before the base Error
@@ -157,6 +200,20 @@ export function getCommonReducers(global = globalThis) {
157
200
  // See `makeErrorSubclassReducer` for implementation details.
158
201
  EvalError: makeErrorSubclassReducer('EvalError'),
159
202
  FatalError: makeErrorSubclassReducer('FatalError'),
203
+ HookConflictError: (value) => {
204
+ const base = reduceNamedErrorSubclassBase('HookConflictError', value);
205
+ if (!base)
206
+ return false;
207
+ const reduced = {
208
+ ...base,
209
+ token: readProperty(value, 'token'),
210
+ };
211
+ const conflictingRunId = readProperty(value, 'conflictingRunId');
212
+ if (conflictingRunId !== undefined) {
213
+ reduced.conflictingRunId = conflictingRunId;
214
+ }
215
+ return reduced;
216
+ },
160
217
  RangeError: makeErrorSubclassReducer('RangeError'),
161
218
  ReferenceError: makeErrorSubclassReducer('ReferenceError'),
162
219
  // RetryableError carries an extra `retryAfter` Date that we serialize as
@@ -167,14 +224,25 @@ export function getCommonReducers(global = globalThis) {
167
224
  const base = reduceNamedErrorSubclassBase('RetryableError', value);
168
225
  if (!base)
169
226
  return false;
170
- const retryAfterRaw = value.retryAfter;
227
+ const retryAfterRaw = readProperty(value, 'retryAfter');
171
228
  let retryAfter;
172
- if (retryAfterRaw &&
173
- typeof retryAfterRaw === 'object' &&
174
- typeof retryAfterRaw.getTime === 'function') {
175
- const t = retryAfterRaw.getTime();
229
+ if (types.isDate(retryAfterRaw)) {
230
+ // Genuine Date (any realm): read the epoch through the intrinsic.
231
+ const t = dateGetTime(retryAfterRaw);
176
232
  retryAfter = Number.isNaN(t) ? Date.now() + 1000 : t;
177
233
  }
234
+ else if (retryAfterRaw && typeof retryAfterRaw === 'object') {
235
+ // Duck-typed date-like: invoking its getTime() runs workflow code.
236
+ const getTime = readProperty(retryAfterRaw, 'getTime');
237
+ if (typeof getTime === 'function') {
238
+ recordGuestCode('method', 'getTime');
239
+ const t = getTime.call(retryAfterRaw);
240
+ retryAfter = Number.isNaN(t) ? Date.now() + 1000 : t;
241
+ }
242
+ else {
243
+ retryAfter = Date.now() + 1000;
244
+ }
245
+ }
178
246
  else if (typeof retryAfterRaw === 'string' ||
179
247
  typeof retryAfterRaw === 'number') {
180
248
  const t = new Date(retryAfterRaw).getTime();
@@ -188,6 +256,35 @@ export function getCommonReducers(global = globalThis) {
188
256
  retryAfter,
189
257
  };
190
258
  },
259
+ // RuntimeDecryptionError carries an extra `context` object (operation,
260
+ // byteLength, formatPrefix) that the generic Error reducer would drop.
261
+ // Preserve it so the diagnostic data survives the run-error round trip.
262
+ RuntimeDecryptionError: (value) => {
263
+ const base = reduceNamedErrorSubclassBase('RuntimeDecryptionError', value);
264
+ if (!base)
265
+ return false;
266
+ const reduced = {
267
+ ...base,
268
+ };
269
+ const context = readProperty(value, 'context');
270
+ if (context !== undefined) {
271
+ reduced.context = context;
272
+ }
273
+ return reduced;
274
+ },
275
+ StreamError: (value) => {
276
+ const base = reduceNamedErrorSubclassBase('StreamError', value);
277
+ if (!base)
278
+ return false;
279
+ const reduced = { ...base };
280
+ const status = readProperty(value, 'status');
281
+ const url = readProperty(value, 'url');
282
+ if (typeof status === 'number')
283
+ reduced.status = status;
284
+ if (typeof url === 'string')
285
+ reduced.url = url;
286
+ return reduced;
287
+ },
191
288
  SyntaxError: makeErrorSubclassReducer('SyntaxError'),
192
289
  TypeError: makeErrorSubclassReducer('TypeError'),
193
290
  URIError: makeErrorSubclassReducer('URIError'),
@@ -199,10 +296,10 @@ export function getCommonReducers(global = globalThis) {
199
296
  return false;
200
297
  return {
201
298
  ...base,
202
- errors: value.errors,
299
+ errors: readProperty(value, 'errors'),
203
300
  };
204
301
  },
205
- // Base Error reducer catch-all for any Error instance not matched by a
302
+ // Base Error reducer: catch-all for any Error instance not matched by a
206
303
  // specific subclass reducer above (including user Error subclasses without
207
304
  // WORKFLOW_SERIALIZE). Preserves `name` so the error's identity is retained
208
305
  // even though the exact class cannot be reconstructed.
@@ -210,54 +307,61 @@ export function getCommonReducers(global = globalThis) {
210
307
  if (!types.isNativeError(value))
211
308
  return false;
212
309
  const reduced = {
213
- name: value.name,
214
- message: value.message,
215
- stack: value.stack,
310
+ name: readProperty(value, 'name'),
311
+ message: readProperty(value, 'message'),
312
+ stack: readErrorStack(value),
216
313
  };
217
- if ('cause' in value)
218
- reduced.cause = value.cause;
314
+ if (hasProperty(value, 'cause')) {
315
+ reduced.cause = readProperty(value, 'cause');
316
+ }
219
317
  return reduced;
220
318
  },
221
- Float32Array: (value) => value instanceof global.Float32Array && viewToBase64(value),
222
- Float64Array: (value) => value instanceof global.Float64Array && viewToBase64(value),
223
- Headers: (value) => value instanceof global.Headers && Array.from(value),
224
- Int8Array: (value) => value instanceof global.Int8Array && viewToBase64(value),
225
- Int16Array: (value) => value instanceof global.Int16Array && viewToBase64(value),
226
- Int32Array: (value) => value instanceof global.Int32Array && viewToBase64(value),
227
- Map: (value) => value instanceof global.Map && Array.from(value),
228
- RegExp: (value) => value instanceof global.RegExp && {
229
- source: value.source,
230
- flags: value.flags,
319
+ Float32Array: (value) => types.isFloat32Array(value) && viewToBase64(value),
320
+ Float64Array: (value) => types.isFloat64Array(value) && viewToBase64(value),
321
+ // Headers is a host class injected into the sandbox, so its (shared)
322
+ // prototype is reachable from workflow code; iterate through the
323
+ // boot-captured iterator instead of a live Symbol.iterator lookup.
324
+ Headers: (value) => isInstanceOfPrototype(value, Headers.prototype) &&
325
+ headersToEntries(value),
326
+ Int8Array: (value) => types.isInt8Array(value) && viewToBase64(value),
327
+ Int16Array: (value) => types.isInt16Array(value) && viewToBase64(value),
328
+ Int32Array: (value) => types.isInt32Array(value) && viewToBase64(value),
329
+ // Engine brand check + host-realm iteration: a patched
330
+ // `Map.prototype[Symbol.iterator]` in the sandbox is never consulted.
331
+ Map: (value) => types.isMap(value) && mapToEntries(value),
332
+ RegExp: (value) => types.isRegExp(value) && {
333
+ source: regExpSource(value),
334
+ flags: regExpFlags(value),
231
335
  },
232
336
  // Request and Response are intentionally NOT in common reducers.
233
337
  // They require mode-specific revivers (stream handling, etc.) and
234
338
  // including them here without matching revivers would cause them
235
339
  // to deserialize as plain objects.
236
- Set: (value) => value instanceof global.Set && Array.from(value),
237
- URL: (value) => value instanceof global.URL && value.href,
340
+ Set: (value) => types.isSet(value) && setToValues(value),
341
+ URL: (value) => isInstanceOfPrototype(value, URL.prototype) && urlHref(value),
238
342
  WorkflowFunction: (value) => {
239
343
  // Only match function references with a workflowId property (set by
240
344
  // the SWC compiler on workflow functions). Plain { workflowId } objects
241
- // are NOT matched this prevents infinite recursion since the reduced
345
+ // are NOT matched; this prevents infinite recursion since the reduced
242
346
  // form { workflowId } is a plain object, not a function.
243
347
  if (typeof value !== 'function')
244
348
  return false;
245
- const workflowId = value.workflowId;
349
+ const workflowId = readProperty(value, 'workflowId');
246
350
  if (typeof workflowId !== 'string')
247
351
  return false;
248
352
  return { workflowId };
249
353
  },
250
354
  URLSearchParams: (value) => {
251
- if (!(value instanceof global.URLSearchParams))
355
+ if (!isInstanceOfPrototype(value, URLSearchParams.prototype)) {
252
356
  return false;
253
- if (value.size === 0)
254
- return '.';
255
- return String(value);
357
+ }
358
+ const text = urlSearchParamsToString(value);
359
+ return text === '' ? '.' : text;
256
360
  },
257
- Uint8Array: (value) => value instanceof global.Uint8Array && viewToBase64(value),
258
- Uint8ClampedArray: (value) => value instanceof global.Uint8ClampedArray && viewToBase64(value),
259
- Uint16Array: (value) => value instanceof global.Uint16Array && viewToBase64(value),
260
- Uint32Array: (value) => value instanceof global.Uint32Array && viewToBase64(value),
361
+ Uint8Array: (value) => types.isUint8Array(value) && viewToBase64(value),
362
+ Uint8ClampedArray: (value) => types.isUint8ClampedArray(value) && viewToBase64(value),
363
+ Uint16Array: (value) => types.isUint16Array(value) && viewToBase64(value),
364
+ Uint32Array: (value) => types.isUint32Array(value) && viewToBase64(value),
261
365
  };
262
366
  }
263
367
  // ---- Revivers ----
@@ -299,6 +403,16 @@ export function getCommonRevivers(global = globalThis) {
299
403
  error.cause = value.cause;
300
404
  return error;
301
405
  },
406
+ HookConflictError: (value) => {
407
+ const Ctor = global[Symbol.for('@workflow/errors//HookConflictError')] ?? HookConflictError;
408
+ const error = new Ctor(value.token, value.conflictingRunId);
409
+ if (value.stack !== undefined)
410
+ error.stack = value.stack;
411
+ if ('cause' in value) {
412
+ error.cause = value.cause;
413
+ }
414
+ return error;
415
+ },
302
416
  RangeError: makeErrorSubclassReviver(global, 'RangeError'),
303
417
  ReferenceError: makeErrorSubclassReviver(global, 'ReferenceError'),
304
418
  RetryableError: (value) => {
@@ -317,6 +431,32 @@ export function getCommonRevivers(global = globalThis) {
317
431
  error.cause = value.cause;
318
432
  return error;
319
433
  },
434
+ RuntimeDecryptionError: (value) => {
435
+ // Resolve from the consumer's globalThis (see the FatalError reviver
436
+ // above) so `instanceof RuntimeDecryptionError` holds across realms.
437
+ const Ctor = global[Symbol.for('@workflow/errors//RuntimeDecryptionError')] ??
438
+ RuntimeDecryptionError;
439
+ const opts = {};
440
+ if ('cause' in value)
441
+ opts.cause = value.cause;
442
+ if (value.context !== undefined)
443
+ opts.context = value.context;
444
+ const error = new Ctor(value.message, opts);
445
+ if (value.stack !== undefined)
446
+ error.stack = value.stack;
447
+ return error;
448
+ },
449
+ StreamError: (value) => {
450
+ const Ctor = global[Symbol.for('@workflow/errors//StreamError')] ?? StreamError;
451
+ const error = new Ctor(value.message, {
452
+ ...('cause' in value ? { cause: value.cause } : {}),
453
+ status: value.status,
454
+ url: value.url,
455
+ });
456
+ if (value.stack !== undefined)
457
+ error.stack = value.stack;
458
+ return error;
459
+ },
320
460
  SyntaxError: makeErrorSubclassReviver(global, 'SyntaxError'),
321
461
  TypeError: makeErrorSubclassReviver(global, 'TypeError'),
322
462
  URIError: makeErrorSubclassReviver(global, 'URIError'),
@@ -327,7 +467,7 @@ export function getCommonRevivers(global = globalThis) {
327
467
  error.stack = value.stack;
328
468
  return error;
329
469
  },
330
- // Base Error reviver used for plain Error instances and unrecognized
470
+ // Base Error reviver: used for plain Error instances and unrecognized
331
471
  // Error subclasses. Preserves `name` so the error's identity is retained.
332
472
  Error: (value) => {
333
473
  const opts = 'cause' in value ? { cause: value.cause } : undefined;
@@ -359,4 +499,4 @@ export function getCommonRevivers(global = globalThis) {
359
499
  }
360
500
  // Re-export for use in legacy compat
361
501
  export { revive };
362
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tbW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3NlcmlhbGl6YXRpb24vcmVkdWNlcnMvY29tbW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7R0FTRztBQUVILE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFDbEMsT0FBTyxFQUFFLFVBQVUsRUFBRSxjQUFjLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUc5RCwyQkFBMkI7QUFFM0IsU0FBUyxtQkFBbUIsQ0FDMUIsS0FBc0IsRUFDdEIsTUFBYyxFQUNkLE1BQWM7SUFFZCxzREFBc0Q7SUFDdEQsSUFBSSxNQUFNLEtBQUssQ0FBQztRQUFFLE9BQU8sR0FBRyxDQUFDO0lBQzdCLDhEQUE4RDtJQUM5RCxNQUFNLEtBQUssR0FBRyxJQUFJLFVBQVUsQ0FBQyxLQUFLLEVBQUUsTUFBTSxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQ3BELE9BQU8sTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLENBQUM7QUFDL0MsQ0FBQztBQUVELFNBQVMsWUFBWSxDQUFDLEtBQXNCO0lBQzFDLE9BQU8sbUJBQW1CLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRSxLQUFLLENBQUMsVUFBVSxFQUFFLEtBQUssQ0FBQyxVQUFVLENBQUMsQ0FBQztBQUMvRSxDQUFDO0FBRUQsU0FBUyxpQkFBaUIsQ0FDeEIsS0FBYSxFQUNiLE1BQTJCO0lBRTNCLE1BQU0sTUFBTSxHQUFHLEtBQUssS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDO0lBQzFDLE1BQU0sTUFBTSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLFFBQVEsQ0FBQyxDQUFDO0lBQzdDLE1BQU0sV0FBVyxHQUFHLElBQUksTUFBTSxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsTUFB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LEVBQUUsQ0FBQyxLQUFhLEVBQUUsRUFBRSxDQUNuQyxJQUFJLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxpQkFBaUIsQ0FBQyxLQUFLLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFDaEUsV0FBVyxFQUFFLENBQUMsS0FBYSxFQUFFLEVBQUUsQ0FDN0IsSUFBSSxNQUFNLENBQUMsV0FBVyxDQUFDLGlCQUFpQixDQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsQ0FBQztRQUMxRCxXQUFXLEVBQUUsQ0FBQyxLQUFhLEVBQUUsRUFBRSxDQUM3QixJQUFJLE1BQU0sQ0FBQyxXQUFXLENBQUMsaUJBQWlCLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxDQUFDO0tBQzNELENBQUM7QUFDSixDQUFDO0FBRUQscUNBQXFDO0FBQ3JDLE9BQU8sRUFBRSxNQUFNLEVBQUUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQ29tbW9uIHJlZHVjZXJzIGFuZCByZXZpdmVycyBmb3IgdHlwZXMgc2hhcmVkIGFjcm9zcyBhbGwgc2VyaWFsaXphdGlvbiBtb2Rlcy5cbiAqXG4gKiBIYW5kbGVzOiBBcnJheUJ1ZmZlciwgQmlnSW50LCB0eXBlZCBhcnJheXMsIERhdGUsIEVycm9yLCBIZWFkZXJzLCBNYXAsIFNldCxcbiAqIFJlZ0V4cCwgUmVxdWVzdCwgUmVzcG9uc2UsIFVSTCwgVVJMU2VhcmNoUGFyYW1zLlxuICpcbiAqIE5vdGU6IFVzZXMgTm9kZS5qcyBCdWZmZXIgZm9yIGJhc2U2NCBlbmNvZGluZy9kZWNvZGluZy4gRm9yIGVudmlyb25tZW50c1xuICogd2l0aG91dCBCdWZmZXIgKGUuZy4gUXVpY2tKUyBWTSksIGEgcG9seWZpbGwgb3IgYWx0ZXJuYXRpdmUgYmFzZTY0XG4gKiBpbXBsZW1lbnRhdGlvbiB3aWxsIGJlIG5lZWRlZC5cbiAqL1xuXG5pbXBvcnQgeyB0eXBlcyB9IGZyb20gJ25vZGU6dXRpbCc7XG5pbXBvcnQgeyBGYXRhbEVycm9yLCBSZXRyeWFibGVFcnJvciB9IGZyb20gJ0B3b3JrZmxvdy9lcnJvcnMnO1xuaW1wb3J0IHR5cGUgeyBSZWR1Y2VycywgUmV2aXZlcnMsIFNlcmlhbGl6YWJsZVNwZWNpYWwgfSBmcm9tICcuLi90eXBlcy5qcyc7XG5cbi8vIC0tLS0gQmFzZTY0IGhlbHBlcnMgLS0tLVxuXG5mdW5jdGlvbiBhcnJheUJ1ZmZlclRvQmFzZTY0KFxuICB2YWx1ZTogQXJyYXlCdWZmZXJMaWtlLFxuICBvZmZzZXQ6IG51bWJlcixcbiAgbGVuZ3RoOiBudW1iZXJcbik6IHN0cmluZyB7XG4gIC8vIEF2b2lkIHJldHVybmluZyBmYWxzeSB2YWx1ZSBmb3IgemVyby1sZW5ndGggYnVmZmVyc1xuICBpZiAobGVuZ3RoID09PSAwKSByZXR1cm4gJy4nO1xuICAvLyBDcmVhdGUgYSBwcm9wZXIgY29weSB0byBhdm9pZCBBcnJheUJ1ZmZlciBkZXRhY2htZW50IGlzc3Vlc1xuICBjb25zdCB1aW50OCA9IG5ldyBVaW50OEFycmF5KHZhbHVlLCBvZmZzZXQsIGxlbmd0aCk7XG4gIHJldHVybiBCdWZmZXIuZnJvbSh1aW50OCkudG9TdHJpbmcoJ2Jhc2U2NCcpO1xufVxuXG5mdW5jdGlvbiB2aWV3VG9CYXNlNjQodmFsdWU6IEFycmF5QnVmZmVyVmlldyk6IHN0cmluZyB7XG4gIHJldHVybiBhcnJheUJ1ZmZlclRvQmFzZTY0KHZhbHVlLmJ1ZmZlciwgdmFsdWUuYnl0ZU9mZnNldCwgdmFsdWUuYnl0ZUxlbmd0aCk7XG59XG5cbmZ1bmN0aW9uIHJldml2ZUFycmF5QnVmZmVyKFxuICB2YWx1ZTogc3RyaW5nLFxuICBnbG9iYWw6IFJlY29yZDxzdHJpbmcsIGFueT5cbik6IEFycmF5QnVmZmVyIHtcbiAgY29uc3QgYmFzZTY0ID0gdmFsdWUgPT09ICcuJyA/ICcnIDogdmFsdWU7XG4gIGNvbnN0IGJ1ZmZlciA9IEJ1ZmZlci5mcm9tKGJhc2U2NCwgJ2Jhc2U2NCcpO1xuICBjb25zdCBhcnJheUJ1ZmZlciA9IG5ldyBnbG9iYWwuQXJyYXlCdWZmZXIoYnVmZmVyLmxlbmd0aCk7XG4gIGNvbnN0IHVpbnQ4QXJyYXkgPSBuZXcgZ2xvYmFsLlVpbnQ4QXJyYXkoYXJyYXlCdWZmZXIpO1xuICB1aW50OEFycmF5LnNldChidWZmZXIpO1xuICByZXR1cm4gYXJyYXlCdWZmZXI7XG59XG5cbmZ1bmN0aW9uIHJldml2ZShzdHI6IHN0cmluZykge1xuICAvLyBkZXZhbHVlLnN0cmluZ2lmeSgpIGFsd2F5cyBwcm9kdWNlcyB2YWxpZCBKU09OOiBzcGVjaWFsIHZhbHVlc1xuICAvLyAodW5kZWZpbmVkLCBOYU4sIEluZmluaXR5LCAtMCkgYXJlIGVuY29kZWQgYXMgbmVnYXRpdmUgaW50ZWdlclxuICAvLyBzZW50aW5lbHMgYW5kIHRoZSByZW1haW5pbmcgc3RydWN0dXJlIGlzIG9yZGluYXJ5IEpTT04uIFBhcnNpbmdcbiAgLy8gd2l0aCBKU09OLnBhcnNlIHlpZWxkcyB0aGUgZmxhdHRlbmVkIGZvcm0gdGhhdCB1bmZsYXR0ZW4oKSBleHBlY3RzLlxuICByZXR1cm4gSlNPTi5wYXJzZShzdHIpO1xufVxuXG4vLyAtLS0tIEVycm9yIHN1YmNsYXNzIGhlbHBlcnMgLS0tLVxuXG4vKipcbiAqIFRoZSBzaGFyZWQgc2hhcGUgdGhhdCBldmVyeSBFcnJvci1zdWJjbGFzcyByZWR1Y2VyIGluIHRoaXMgbW9kdWxlXG4gKiBwcm9kdWNlcy4gU29tZSBzdWJjbGFzc2VzIChlLmcuIGBBZ2dyZWdhdGVFcnJvcmAsIGBSZXRyeWFibGVFcnJvcmApIGV4dGVuZFxuICogdGhpcyB3aXRoIGFkZGl0aW9uYWwgZmllbGRzIGJ5IHNwcmVhZGluZyB0aGUgYmFzZSBwYXlsb2FkLlxuICovXG50eXBlIEJhc2VFcnJvclBheWxvYWQgPSB7XG4gIG1lc3NhZ2U6IHN0cmluZztcbiAgc3RhY2s/OiBzdHJpbmc7XG4gIGNhdXNlPzogdW5rbm93bjtcbn07XG5cbi8qKlxuICogU3Vic2V0IG9mIGBTZXJpYWxpemFibGVTcGVjaWFsYCBrZXlzIHdob3NlIHBheWxvYWQgc2hhcGUgaXMgZXhhY3RseSB0aGVcbiAqIGBCYXNlRXJyb3JQYXlsb2FkYC4gYG1ha2VFcnJvclN1YmNsYXNzUmVkdWNlcmAgaXMgY29uc3RyYWluZWQgdG8gb25seVxuICogdGhlc2Uga2V5cyBzbyBpdHMgcmV0dXJuIHR5cGUgaXMgc291bmQg4oCUIHN1YmNsYXNzZXMgdGhhdCBuZWVkIGV4dHJhXG4gKiBmaWVsZHMgKGxpa2UgYEFnZ3JlZ2F0ZUVycm9yLmVycm9yc2Agb3IgYFJldHJ5YWJsZUVycm9yLnJldHJ5QWZ0ZXJgKSB1c2VcbiAqIGByZWR1Y2VFcnJvckJhc2VgIGRpcmVjdGx5IGFuZCBleHRlbmQgdGhlIHJlc3VsdC5cbiAqL1xudHlwZSBTaW1wbGVFcnJvclN1YmNsYXNzS2V5ID0ge1xuICBbSyBpbiBrZXlvZiBTZXJpYWxpemFibGVTcGVjaWFsXTogU2VyaWFsaXphYmxlU3BlY2lhbFtLXSBleHRlbmRzIEJhc2VFcnJvclBheWxvYWRcbiAgICA/IEJhc2VFcnJvclBheWxvYWQgZXh0ZW5kcyBTZXJpYWxpemFibGVTcGVjaWFsW0tdXG4gICAgICA/IEtcbiAgICAgIDogbmV2ZXJcbiAgICA6IG5ldmVyO1xufVtrZXlvZiBTZXJpYWxpemFibGVTcGVjaWFsXTtcblxuLyoqXG4gKiBSZWR1Y2VzIGFueSBuYXRpdmUgRXJyb3IgaW5zdGFuY2UgdG8gdGhlIHNoYXJlZCBgQmFzZUVycm9yUGF5bG9hZGAgc2hhcGUsXG4gKiBwcmVzZXJ2aW5nIGBjYXVzZWAgb25seSB3aGVuIHByZXNlbnQgKHRvIGRpc3Rpbmd1aXNoIFwibm8gY2F1c2VcIiBmcm9tXG4gKiBcImNhdXNlIGlzIHVuZGVmaW5lZFwiKS4gVXNlZCBkaXJlY3RseSBieSByZWR1Y2VycyBmb3Igc3ViY2xhc3NlcyB0aGF0IG5lZWRcbiAqIHRvIGV4dGVuZCB0aGUgc2hhcGUgd2l0aCBhZGRpdGlvbmFsIGZpZWxkcy5cbiAqXG4gKiBgdHlwZXMuaXNOYXRpdmVFcnJvcigpYCBpcyB1c2VkIGluc3RlYWQgb2YgYGluc3RhbmNlb2ZgIGZvciBjcm9zcy1WTSBzYWZldHk6XG4gKiBlcnJvcnMgbWF5IG9yaWdpbmF0ZSBmcm9tIGEgZGlmZmVyZW50IFZNIGNvbnRleHQsIGFuZCBgaW5zdGFuY2VvZmAgZmFpbHNcbiAqIGFjcm9zcyBWTSBib3VuZGFyaWVzIHNpbmNlIGVhY2ggY29udGV4dCBoYXMgaXRzIG93biBFcnJvciBjb25zdHJ1Y3Rvci5cbiAqL1xuZnVuY3Rpb24gcmVkdWNlRXJyb3JCYXNlKHZhbHVlOiB1bmtub3duKTogQmFzZUVycm9yUGF5bG9hZCB8IGZhbHNlIHtcbiAgaWYgKCF0eXBlcy5pc05hdGl2ZUVycm9yKHZhbHVlKSkgcmV0dXJuIGZhbHNlO1xuICBjb25zdCByZWR1Y2VkOiBCYXNlRXJyb3JQYXlsb2FkID0ge1xuICAgIG1lc3NhZ2U6IHZhbHVlLm1lc3NhZ2UsXG4gICAgc3RhY2s6IHZhbHVlLnN0YWNrLFxuICB9O1xuICBpZiAoJ2NhdXNlJyBpbiB2YWx1ZSkgcmVkdWNlZC5jYXVzZSA9ICh2YWx1ZSBhcyB7IGNhdXNlOiB1bmtub3duIH0pLmNhdXNlO1xuICByZXR1cm4gcmVkdWNlZDtcbn1cblxuLyoqXG4gKiBSZWR1Y2VzIGEgbmF0aXZlIGVycm9yIHRvIHRoZSBzaGFyZWQgYEJhc2VFcnJvclBheWxvYWRgLCBidXQgb25seSB3aGVuIGl0c1xuICogYG5hbWVgIGluc3RhbmNlIHByb3BlcnR5IG1hdGNoZXMgYHN1YmNsYXNzTmFtZWAuIFVzZWQgYnk6XG4gKiAgIC0gYG1ha2VFcnJvclN1YmNsYXNzUmVkdWNlcmAsIGZvciBzdWJjbGFzc2VzIHdob3NlIHNlcmlhbGl6ZWQgc2hhcGUgaXNcbiAqICAgICBleGFjdGx5IGBCYXNlRXJyb3JQYXlsb2FkYC5cbiAqICAgLSBJbmxpbmUgcmVkdWNlcnMgZm9yIHN1YmNsYXNzZXMgdGhhdCBleHRlbmQgdGhlIHNoYXBlIHdpdGggYWRkaXRpb25hbFxuICogICAgIGZpZWxkcyAoZS5nLiBgQWdncmVnYXRlRXJyb3IuZXJyb3JzYCwgYFJldHJ5YWJsZUVycm9yLnJldHJ5QWZ0ZXJgKS5cbiAqXG4gKiBNYXRjaGluZyBieSBgdmFsdWUubmFtZWAgKGluc3RlYWQgb2YgYHZhbHVlLmNvbnN0cnVjdG9yPy5uYW1lYCkgaXMgcm9idXN0XG4gKiB0byBidW5kbGVycyB0aGF0IGVtaXQgdGhlIGNsYXNzIGFzIGFuIGFub255bW91cyBleHByZXNzaW9uIOKAlCBlLmcuIFR1cmJvcGFja1xuICogY29tcGlsZXMgYGV4cG9ydCBjbGFzcyBGYXRhbEVycm9yIGV4dGVuZHMgRXJyb3Ige+KApn1gIHRvIGEgcmVnaXN0cmF0aW9uIGNhbGxcbiAqIGxpa2UgYGUucyhbXCJGYXRhbEVycm9yXCIsIDAsIGNsYXNzIGV4dGVuZHMgRXJyb3Ige+KApn1dKWAsIGFuZCB0aGUgcmVzdWx0aW5nXG4gKiBjb25zdHJ1Y3RvciBoYXMgYG5hbWUgPT09ICcnYC4gU2luY2UgZXZlcnkgRXJyb3Igc3ViY2xhc3Mgd2UgY2FyZSBhYm91dFxuICogc2V0cyBgdGhpcy5uYW1lYCBleHBsaWNpdGx5IGluIGl0cyBjb25zdHJ1Y3RvciAoYnVpbHQtaW4gc3ViY2xhc3NlcyBkbyB0aGlzXG4gKiBhdXRvbWF0aWNhbGx5OyBgRmF0YWxFcnJvcmAvYFJldHJ5YWJsZUVycm9yYCBkbyBpdCBpbiB1c2VyIGNvZGUpLCB0aGVcbiAqIGluc3RhbmNlIHByb3BlcnR5IGlzIHRoZSByZWxpYWJsZSBpZGVudGl0eSBtYXJrZXIgYWNyb3NzIHJlYWxtcyBhbmRcbiAqIGJ1bmRsZXJzLlxuICovXG5mdW5jdGlvbiByZWR1Y2VOYW1lZEVycm9yU3ViY2xhc3NCYXNlKFxuICBzdWJjbGFzc05hbWU6IHN0cmluZyxcbiAgdmFsdWU6IHVua25vd25cbik6IEJhc2VFcnJvclBheWxvYWQgfCBmYWxzZSB7XG4gIGlmICghdHlwZXMuaXNOYXRpdmVFcnJvcih2YWx1ZSkpIHJldHVybiBmYWxzZTtcbiAgaWYgKHZhbHVlLm5hbWUgIT09IHN1YmNsYXNzTmFtZSkgcmV0dXJuIGZhbHNlO1xuICByZXR1cm4gcmVkdWNlRXJyb3JCYXNlKHZhbHVlKTtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgcmVkdWNlciBmb3IgYSBidWlsdC1pbiBFcnJvciBzdWJjbGFzcyB3aG9zZSBzZXJpYWxpemVkIHNoYXBlIGlzXG4gKiBleGFjdGx5IGBCYXNlRXJyb3JQYXlsb2FkYCAobm8gZXh0cmEgZmllbGRzKS4gVGhlIHJlZHVjZXIgbWF0Y2hlcyBieVxuICogY29uc3RydWN0b3IgbmFtZSAoYWZ0ZXIgdGhlIGlzTmF0aXZlRXJyb3IgZ2F0ZSksIHNpbmNlIGBpbnN0YW5jZW9mYCBtYXlcbiAqIGZhaWwgYWNyb3NzIFZNIGJvdW5kYXJpZXMuXG4gKi9cbmZ1bmN0aW9uIG1ha2VFcnJvclN1YmNsYXNzUmVkdWNlcjxLIGV4dGVuZHMgU2ltcGxlRXJyb3JTdWJjbGFzc0tleT4oXG4gIHN1YmNsYXNzTmFtZTogS1xuKSB7XG4gIHJldHVybiAodmFsdWU6IHVua25vd24pOiBTZXJpYWxpemFibGVTcGVjaWFsW0tdIHwgZmFsc2UgPT4ge1xuICAgIGNvbnN0IGJhc2UgPSByZWR1Y2VOYW1lZEVycm9yU3ViY2xhc3NCYXNlKHN1YmNsYXNzTmFtZSwgdmFsdWUpO1xuICAgIGlmICghYmFzZSkgcmV0dXJuIGZhbHNlO1xuICAgIHJldHVybiBiYXNlIGFzIFNlcmlhbGl6YWJsZVNwZWNpYWxbS107XG4gIH07XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIHJldml2ZXIgZm9yIGEgYnVpbHQtaW4gRXJyb3Igc3ViY2xhc3MuIFJlY29uc3RydWN0cyB0aGUgY29ycmVjdFxuICogYnVpbHQtaW4gRXJyb3IgdHlwZSB1c2luZyB0aGUgY29udGV4dCdzIGNvbnN0cnVjdG9yLiBUaGUgYGNhdXNlYCBvcHRpb24gaXNcbiAqIG9ubHkgcGFzc2VkIHdoZW4gdGhlIHNlcmlhbGl6ZWQgZGF0YSBpbmNsdWRlcyBpdCwgcHJlc2VydmluZyB0aGUgZGlzdGluY3Rpb25cbiAqIGJldHdlZW4gXCJubyBjYXVzZVwiIGFuZCBcImNhdXNlIGlzIHVuZGVmaW5lZFwiLlxuICovXG5mdW5jdGlvbiBtYWtlRXJyb3JTdWJjbGFzc1Jldml2ZXI8SyBleHRlbmRzIGtleW9mIFNlcmlhbGl6YWJsZVNwZWNpYWw+KFxuICBnbG9iYWw6IFJlY29yZDxzdHJpbmcsIGFueT4sXG4gIGN0b3JOYW1lOiBzdHJpbmdcbikge1xuICByZXR1cm4gKHZhbHVlOiBTZXJpYWxpemFibGVTcGVjaWFsW0tdKSA9PiB7XG4gICAgY29uc3QgdiA9IHZhbHVlIGFzIEJhc2VFcnJvclBheWxvYWQ7XG4gICAgY29uc3Qgb3B0cyA9ICdjYXVzZScgaW4gdiA/IHsgY2F1c2U6IHYuY2F1c2UgfSA6IHVuZGVmaW5lZDtcbiAgICBjb25zdCBDdG9yID0gZ2xvYmFsW2N0b3JOYW1lXTtcbiAgICBjb25zdCBlcnJvcjogRXJyb3IgPSBuZXcgQ3Rvcih2Lm1lc3NhZ2UsIG9wdHMpO1xuICAgIGlmICh2LnN0YWNrICE9PSB1bmRlZmluZWQpIGVycm9yLnN0YWNrID0gdi5zdGFjaztcbiAgICByZXR1cm4gZXJyb3I7XG4gIH07XG59XG5cbi8vIC0tLS0gUmVkdWNlcnMgLS0tLVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0Q29tbW9uUmVkdWNlcnMoXG4gIGdsb2JhbDogUmVjb3JkPHN0cmluZywgYW55PiA9IGdsb2JhbFRoaXNcbik6IFBhcnRpYWw8UmVkdWNlcnM+IHtcbiAgcmV0dXJuIHtcbiAgICBBcnJheUJ1ZmZlcjogKHZhbHVlKSA9PlxuICAgICAgdmFsdWUgaW5zdGFuY2VvZiBnbG9iYWwuQXJyYXlCdWZmZXIgJiZcbiAgICAgIGFycmF5QnVmZmVyVG9CYXNlNjQodmFsdWUsIDAsIHZhbHVlLmJ5dGVMZW5ndGgpLFxuICAgIEJpZ0ludDogKHZhbHVlKSA9PiB0eXBlb2YgdmFsdWUgPT09ICdiaWdpbnQnICYmIHZhbHVlLnRvU3RyaW5nKCksXG4gICAgQmlnSW50NjRBcnJheTogKHZhbHVlKSA9PlxuICAgICAgdmFsdWUgaW5zdGFuY2VvZiBnbG9iYWwuQmlnSW50NjRBcnJheSAmJiB2aWV3VG9CYXNlNjQodmFsdWUpLFxuICAgIEJpZ1VpbnQ2NEFycmF5OiAodmFsdWUpID0+XG4gICAgICB2YWx1ZSBpbnN0YW5jZW9mIGdsb2JhbC5CaWdVaW50NjRBcnJheSAmJiB2aWV3VG9CYXNlNjQodmFsdWUpLFxuICAgIERhdGU6ICh2YWx1ZSkgPT4ge1xuICAgICAgaWYgKCEodmFsdWUgaW5zdGFuY2VvZiBnbG9iYWwuRGF0ZSkpIHJldHVybiBmYWxzZTtcbiAgICAgIGNvbnN0IHZhbGlkID0gIU51bWJlci5pc05hTih2YWx1ZS5nZXREYXRlKCkpO1xuICAgICAgcmV0dXJuIHZhbGlkID8gdmFsdWUudG9JU09TdHJpbmcoKSA6ICcuJztcbiAgICB9LFxuICAgIC8vIERPTUV4Y2VwdGlvbiBpcyBhIHNwZWNpYWwgY2FzZTogaXQgYGluc3RhbmNlb2YgRXJyb3JgIGlzIHRydWUgaW4gTm9kZSxcbiAgICAvLyBidXQgYHR5cGVzLmlzTmF0aXZlRXJyb3IoKWAgcmV0dXJucyBGQUxTRSBmb3IgaXQsIHNvIHRoZSBnZW5lcmljIEVycm9yXG4gICAgLy8gcmVkdWNlciAod2hpY2ggZ2F0ZXMgb24gaXNOYXRpdmVFcnJvcikgd29uJ3QgbWF0Y2guIENoZWNrIGl0IGV4cGxpY2l0bHlcbiAgICAvLyBieSBjb25zdHJ1Y3RvciBuYW1lICsgRXJyb3IgaW5oZXJpdGFuY2Ugc28gd2UgY2F0Y2ggRE9NRXhjZXB0aW9ucyBmcm9tXG4gICAgLy8gYW55IHJlYWxtIChjcm9zcy1WTSBzYWZldHk6IGluc3RhbmNlb2YgZ2xvYmFsLkRPTUV4Y2VwdGlvbiB3b3VsZCBmYWlsXG4gICAgLy8gZm9yIGluc3RhbmNlcyBtaW50ZWQgaW4gYW5vdGhlciBjb250ZXh0KS5cbiAgICBET01FeGNlcHRpb246ICh2YWx1ZSkgPT4ge1xuICAgICAgaWYgKHZhbHVlID09PSBudWxsIHx8IHR5cGVvZiB2YWx1ZSAhPT0gJ29iamVjdCcpIHJldHVybiBmYWxzZTtcbiAgICAgIGlmIChcbiAgICAgICAgKHZhbHVlIGFzIHsgY29uc3RydWN0b3I/OiB7IG5hbWU/OiBzdHJpbmcgfSB9KS5jb25zdHJ1Y3Rvcj8ubmFtZSAhPT1cbiAgICAgICAgJ0RPTUV4Y2VwdGlvbidcbiAgICAgIClcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgY29uc3QgZSA9IHZhbHVlIGFzIEVycm9yICYgeyBjYXVzZT86IHVua25vd24gfTtcbiAgICAgIGNvbnN0IHJlZHVjZWQ6IFNlcmlhbGl6YWJsZVNwZWNpYWxbJ0RPTUV4Y2VwdGlvbiddID0ge1xuICAgICAgICBtZXNzYWdlOiBlLm1lc3NhZ2UsXG4gICAgICAgIG5hbWU6IGUubmFtZSxcbiAgICAgICAgc3RhY2s6IGUuc3RhY2ssXG4gICAgICB9O1xuICAgICAgaWYgKCdjYXVzZScgaW4gZSkgcmVkdWNlZC5jYXVzZSA9IGUuY2F1c2U7XG4gICAgICByZXR1cm4gcmVkdWNlZDtcbiAgICB9LFxuICAgIC8vIEVycm9yIHN1YmNsYXNzIHJlZHVjZXJzIGFyZSBpbnRlbnRpb25hbGx5IHBsYWNlZCBiZWZvcmUgdGhlIGJhc2UgRXJyb3JcbiAgICAvLyByZWR1Y2VyIGJlY2F1c2UgZGV2YWx1ZSB1c2VzIGZpcnN0LW1hdGNoLXdpbnMuIFN1YmNsYXNzLXNwZWNpZmljIHJlZHVjZXJzXG4gICAgLy8gbXVzdCBiZSBjaGVja2VkIGZpcnN0IHNvIHRoYXQgZS5nLiBhIFR5cGVFcnJvciBpcyBzZXJpYWxpemVkIGFzIFwiVHlwZUVycm9yXCJcbiAgICAvLyByYXRoZXIgdGhhbiBmYWxsaW5nIHRocm91Z2ggdG8gdGhlIGdlbmVyaWMgXCJFcnJvclwiIHJlZHVjZXIuXG4gICAgLy8gU2VlIGBtYWtlRXJyb3JTdWJjbGFzc1JlZHVjZXJgIGZvciBpbXBsZW1lbnRhdGlvbiBkZXRhaWxzLlxuICAgIEV2YWxFcnJvcjogbWFrZUVycm9yU3ViY2xhc3NSZWR1Y2VyKCdFdmFsRXJyb3InKSxcbiAgICBGYXRhbEVycm9yOiBtYWtlRXJyb3JTdWJjbGFzc1JlZHVjZXIoJ0ZhdGFsRXJyb3InKSxcbiAgICBSYW5nZUVycm9yOiBtYWtlRXJyb3JTdWJjbGFzc1JlZHVjZXIoJ1JhbmdlRXJyb3InKSxcbiAgICBSZWZlcmVuY2VFcnJvcjogbWFrZUVycm9yU3ViY2xhc3NSZWR1Y2VyKCdSZWZlcmVuY2VFcnJvcicpLFxuICAgIC8vIFJldHJ5YWJsZUVycm9yIGNhcnJpZXMgYW4gZXh0cmEgYHJldHJ5QWZ0ZXJgIERhdGUgdGhhdCB3ZSBzZXJpYWxpemUgYXNcbiAgICAvLyBhIG51bWVyaWMgZXBvY2ggdGltZXN0YW1wLiBUaGUgRGF0ZSByZWR1Y2VyIHVzZXMgYGluc3RhbmNlb2YgZ2xvYmFsLkRhdGVgLFxuICAgIC8vIHdoaWNoIGZhaWxzIGZvciBEYXRlcyBmcm9tIGEgZGlmZmVyZW50IFZNIHJlYWxtOyBzZXJpYWxpemluZyBhcyBhXG4gICAgLy8gbnVtYmVyIHNpZGVzdGVwcyB0aGF0IGlzc3VlLlxuICAgIFJldHJ5YWJsZUVycm9yOiAodmFsdWUpID0+IHtcbiAgICAgIGNvbnN0IGJhc2UgPSByZWR1Y2VOYW1lZEVycm9yU3ViY2xhc3NCYXNlKCdSZXRyeWFibGVFcnJvcicsIHZhbHVlKTtcbiAgICAgIGlmICghYmFzZSkgcmV0dXJuIGZhbHNlO1xuICAgICAgY29uc3QgcmV0cnlBZnRlclJhdyA9ICh2YWx1ZSBhcyBSZXRyeWFibGVFcnJvcikucmV0cnlBZnRlciBhcyB1bmtub3duO1xuICAgICAgbGV0IHJldHJ5QWZ0ZXI6IG51bWJlcjtcbiAgICAgIGlmIChcbiAgICAgICAgcmV0cnlBZnRlclJhdyAmJlxuICAgICAgICB0eXBlb2YgcmV0cnlBZnRlclJhdyA9PT0gJ29iamVjdCcgJiZcbiAgICAgICAgdHlwZW9mIChyZXRyeUFmdGVyUmF3IGFzIHsgZ2V0VGltZT86IHVua25vd24gfSkuZ2V0VGltZSA9PT0gJ2Z1bmN0aW9uJ1xuICAgICAgKSB7XG4gICAgICAgIGNvbnN0IHQgPSAocmV0cnlBZnRlclJhdyBhcyBEYXRlKS5nZXRUaW1lKCk7XG4gICAgICAgIHJldHJ5QWZ0ZXIgPSBOdW1iZXIuaXNOYU4odCkgPyBEYXRlLm5vdygpICsgMTAwMCA6IHQ7XG4gICAgICB9IGVsc2UgaWYgKFxuICAgICAgICB0eXBlb2YgcmV0cnlBZnRlclJhdyA9PT0gJ3N0cmluZycgfHxcbiAgICAgICAgdHlwZW9mIHJldHJ5QWZ0ZXJSYXcgPT09ICdudW1iZXInXG4gICAgICApIHtcbiAgICAgICAgY29uc3QgdCA9IG5ldyBEYXRlKHJldHJ5QWZ0ZXJSYXcpLmdldFRpbWUoKTtcbiAgICAgICAgcmV0cnlBZnRlciA9IE51bWJlci5pc05hTih0KSA/IERhdGUubm93KCkgKyAxMDAwIDogdDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHJ5QWZ0ZXIgPSBEYXRlLm5vdygpICsgMTAwMDtcbiAgICAgIH1cbiAgICAgIHJldHVybiB7XG4gICAgICAgIC4uLmJhc2UsXG4gICAgICAgIHJldHJ5QWZ0ZXIsXG4gICAgICB9IHNhdGlzZmllcyBTZXJpYWxpemFibGVTcGVjaWFsWydSZXRyeWFibGVFcnJvciddO1xuICAgIH0sXG4gICAgU3ludGF4RXJyb3I6IG1ha2VFcnJvclN1YmNsYXNzUmVkdWNlcignU3ludGF4RXJyb3InKSxcbiAgICBUeXBlRXJyb3I6IG1ha2VFcnJvclN1YmNsYXNzUmVkdWNlcignVHlwZUVycm9yJyksXG4gICAgVVJJRXJyb3I6IG1ha2VFcnJvclN1YmNsYXNzUmVkdWNlcignVVJJRXJyb3InKSxcbiAgICAvLyBBZ2dyZWdhdGVFcnJvciBpcyBzaW1pbGFyIHRvIG90aGVyIHN1YmNsYXNzZXMgYnV0IGFsc28gcHJlc2VydmVzIHRoZVxuICAgIC8vIGBlcnJvcnNgIGFycmF5LiBXZSBleHRlbmQgdGhlIGJhc2UgaGVscGVyJ3Mgb3V0cHV0IGhlcmUuXG4gICAgQWdncmVnYXRlRXJyb3I6ICh2YWx1ZSkgPT4ge1xuICAgICAgY29uc3QgYmFzZSA9IHJlZHVjZU5hbWVkRXJyb3JTdWJjbGFzc0Jhc2UoJ0FnZ3JlZ2F0ZUVycm9yJywgdmFsdWUpO1xuICAgICAgaWYgKCFiYXNlKSByZXR1cm4gZmFsc2U7XG4gICAgICByZXR1cm4ge1xuICAgICAgICAuLi5iYXNlLFxuICAgICAgICBlcnJvcnM6ICh2YWx1ZSBhcyBBZ2dyZWdhdGVFcnJvcikuZXJyb3JzLFxuICAgICAgfSBzYXRpc2ZpZXMgU2VyaWFsaXphYmxlU3BlY2lhbFsnQWdncmVnYXRlRXJyb3InXTtcbiAgICB9LFxuICAgIC8vIEJhc2UgRXJyb3IgcmVkdWNlciDigJQgY2F0Y2gtYWxsIGZvciBhbnkgRXJyb3IgaW5zdGFuY2Ugbm90IG1hdGNoZWQgYnkgYVxuICAgIC8vIHNwZWNpZmljIHN1YmNsYXNzIHJlZHVjZXIgYWJvdmUgKGluY2x1ZGluZyB1c2VyIEVycm9yIHN1YmNsYXNzZXMgd2l0aG91dFxuICAgIC8vIFdPUktGTE9XX1NFUklBTElaRSkuIFByZXNlcnZlcyBgbmFtZWAgc28gdGhlIGVycm9yJ3MgaWRlbnRpdHkgaXMgcmV0YWluZWRcbiAgICAvLyBldmVuIHRob3VnaCB0aGUgZXhhY3QgY2xhc3MgY2Fubm90IGJlIHJlY29uc3RydWN0ZWQuXG4gICAgRXJyb3I6ICh2YWx1ZSkgPT4ge1xuICAgICAgaWYgKCF0eXBlcy5pc05hdGl2ZUVycm9yKHZhbHVlKSkgcmV0dXJuIGZhbHNlO1xuICAgICAgY29uc3QgcmVkdWNlZDogU2VyaWFsaXphYmxlU3BlY2lhbFsnRXJyb3InXSA9IHtcbiAgICAgICAgbmFtZTogdmFsdWUubmFtZSxcbiAgICAgICAgbWVzc2FnZTogdmFsdWUubWVzc2FnZSxcbiAgICAgICAgc3RhY2s6IHZhbHVlLnN0YWNrLFxuICAgICAgfTtcbiAgICAgIGlmICgnY2F1c2UnIGluIHZhbHVlKSByZWR1Y2VkLmNhdXNlID0gdmFsdWUuY2F1c2U7XG4gICAgICByZXR1cm4gcmVkdWNlZDtcbiAgICB9LFxuICAgIEZsb2F0MzJBcnJheTogKHZhbHVlKSA9PlxuICAgICAgdmFsdWUgaW5zdGFuY2VvZiBnbG9iYWwuRmxvYXQzMkFycmF5ICYmIHZpZXdUb0Jhc2U2NCh2YWx1ZSksXG4gICAgRmxvYXQ2NEFycmF5OiAodmFsdWUpID0+XG4gICAgICB2YWx1ZSBpbnN0YW5jZW9mIGdsb2JhbC5GbG9hdDY0QXJyYXkgJiYgdmlld1RvQmFzZTY0KHZhbHVlKSxcbiAgICBIZWFkZXJzOiAodmFsdWUpID0+IHZhbHVlIGluc3RhbmNlb2YgZ2xvYmFsLkhlYWRlcnMgJiYgQXJyYXkuZnJvbSh2YWx1ZSksXG4gICAgSW50OEFycmF5OiAodmFsdWUpID0+XG4gICAgICB2YWx1ZSBpbnN0YW5jZW9mIGdsb2JhbC5JbnQ4QXJyYXkgJiYgdmlld1RvQmFzZTY0KHZhbHVlKSxcbiAgICBJbnQxNkFycmF5OiAodmFsdWUpID0+XG4gICAgICB2YWx1ZSBpbnN0YW5jZW9mIGdsb2JhbC5JbnQxNkFycmF5ICYmIHZpZXdUb0Jhc2U2NCh2YWx1ZSksXG4gICAgSW50MzJBcnJheTogKHZhbHVlKSA9PlxuICAgICAgdmFsdWUgaW5zdGFuY2VvZiBnbG9iYWwuSW50MzJBcnJheSAmJiB2aWV3VG9CYXNlNjQodmFsdWUpLFxuICAgIE1hcDogKHZhbHVlKSA9PiB2YWx1ZSBpbnN0YW5jZW9mIGdsb2JhbC5NYXAgJiYgQXJyYXkuZnJvbSh2YWx1ZSksXG4gICAgUmVnRXhwOiAodmFsdWUpID0+XG4gICAgICB2YWx1ZSBpbnN0YW5jZW9mIGdsb2JhbC5SZWdFeHAgJiYge1xuICAgICAgICBzb3VyY2U6IHZhbHVlLnNvdXJjZSxcbiAgICAgICAgZmxhZ3M6IHZhbHVlLmZsYWdzLFxuICAgICAgfSxcbiAgICAvLyBSZXF1ZXN0IGFuZCBSZXNwb25zZSBhcmUgaW50ZW50aW9uYWxseSBOT1QgaW4gY29tbW9uIHJlZHVjZXJzLlxuICAgIC8vIFRoZXkgcmVxdWlyZSBtb2RlLXNwZWNpZmljIHJldml2ZXJzIChzdHJlYW0gaGFuZGxpbmcsIGV0Yy4pIGFuZFxuICAgIC8vIGluY2x1ZGluZyB0aGVtIGhlcmUgd2l0aG91dCBtYXRjaGluZyByZXZpdmVycyB3b3VsZCBjYXVzZSB0aGVtXG4gICAgLy8gdG8gZGVzZXJpYWxpemUgYXMgcGxhaW4gb2JqZWN0cy5cbiAgICBTZXQ6ICh2YWx1ZSkgPT4gdmFsdWUgaW5zdGFuY2VvZiBnbG9iYWwuU2V0ICYmIEFycmF5LmZyb20odmFsdWUpLFxuICAgIFVSTDogKHZhbHVlKSA9PiB2YWx1ZSBpbnN0YW5jZW9mIGdsb2JhbC5VUkwgJiYgdmFsdWUuaHJlZixcbiAgICBXb3JrZmxvd0Z1bmN0aW9uOiAodmFsdWUpID0+IHtcbiAgICAgIC8vIE9ubHkgbWF0Y2ggZnVuY3Rpb24gcmVmZXJlbmNlcyB3aXRoIGEgd29ya2Zsb3dJZCBwcm9wZXJ0eSAoc2V0IGJ5XG4gICAgICAvLyB0aGUgU1dDIGNvbXBpbGVyIG9uIHdvcmtmbG93IGZ1bmN0aW9ucykuIFBsYWluIHsgd29ya2Zsb3dJZCB9IG9iamVjdHNcbiAgICAgIC8vIGFyZSBOT1QgbWF0Y2hlZCDigJQgdGhpcyBwcmV2ZW50cyBpbmZpbml0ZSByZWN1cnNpb24gc2luY2UgdGhlIHJlZHVjZWRcbiAgICAgIC8vIGZvcm0geyB3b3JrZmxvd0lkIH0gaXMgYSBwbGFpbiBvYmplY3QsIG5vdCBhIGZ1bmN0aW9uLlxuICAgICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ2Z1bmN0aW9uJykgcmV0dXJuIGZhbHNlO1xuICAgICAgY29uc3Qgd29ya2Zsb3dJZCA9ICh2YWx1ZSBhcyBhbnkpLndvcmtmbG93SWQ7XG4gICAgICBpZiAodHlwZW9mIHdvcmtmbG93SWQgIT09ICdzdHJpbmcnKSByZXR1cm4gZmFsc2U7XG4gICAgICByZXR1cm4geyB3b3JrZmxvd0lkIH07XG4gICAgfSxcbiAgICBVUkxTZWFyY2hQYXJhbXM6ICh2YWx1ZSkgPT4ge1xuICAgICAgaWYgKCEodmFsdWUgaW5zdGFuY2VvZiBnbG9iYWwuVVJMU2VhcmNoUGFyYW1zKSkgcmV0dXJuIGZhbHNlO1xuICAgICAgaWYgKHZhbHVlLnNpemUgPT09IDApIHJldHVybiAnLic7XG4gICAgICByZXR1cm4gU3RyaW5nKHZhbHVlKTtcbiAgICB9LFxuICAgIFVpbnQ4QXJyYXk6ICh2YWx1ZSkgPT5cbiAgICAgIHZhbHVlIGluc3RhbmNlb2YgZ2xvYmFsLlVpbnQ4QXJyYXkgJiYgdmlld1RvQmFzZTY0KHZhbHVlKSxcbiAgICBVaW50OENsYW1wZWRBcnJheTogKHZhbHVlKSA9PlxuICAgICAgdmFsdWUgaW5zdGFuY2VvZiBnbG9iYWwuVWludDhDbGFtcGVkQXJyYXkgJiYgdmlld1RvQmFzZTY0KHZhbHVlKSxcbiAgICBVaW50MTZBcnJheTogKHZhbHVlKSA9PlxuICAgICAgdmFsdWUgaW5zdGFuY2VvZiBnbG9iYWwuVWludDE2QXJyYXkgJiYgdmlld1RvQmFzZTY0KHZhbHVlKSxcbiAgICBVaW50MzJBcnJheTogKHZhbHVlKSA9PlxuICAgICAgdmFsdWUgaW5zdGFuY2VvZiBnbG9iYWwuVWludDMyQXJyYXkgJiYgdmlld1RvQmFzZTY0KHZhbHVlKSxcbiAgfTtcbn1cblxuLy8gLS0tLSBSZXZpdmVycyAtLS0tXG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRDb21tb25SZXZpdmVycyhcbiAgZ2xvYmFsOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0gZ2xvYmFsVGhpc1xuKTogUGFydGlhbDxSZXZpdmVycz4ge1xuICByZXR1cm4ge1xuICAgIEFycmF5QnVmZmVyOiAodmFsdWU6IHN0cmluZykgPT4gcmV2aXZlQXJyYXlCdWZmZXIodmFsdWUsIGdsb2JhbCksXG4gICAgQmlnSW50OiAodmFsdWU6IHN0cmluZykgPT4gZ2xvYmFsLkJpZ0ludCh2YWx1ZSksXG4gICAgQmlnSW50NjRBcnJheTogKHZhbHVlOiBzdHJpbmcpID0+XG4gICAgICBuZXcgZ2xvYmFsLkJpZ0ludDY0QXJyYXkocmV2aXZlQXJyYXlCdWZmZXIodmFsdWUsIGdsb2JhbCkpLFxuICAgIEJpZ1VpbnQ2NEFycmF5OiAodmFsdWU6IHN0cmluZykgPT5cbiAgICAgIG5ldyBnbG9iYWwuQmlnVWludDY0QXJyYXkocmV2aXZlQXJyYXlCdWZmZXIodmFsdWUsIGdsb2JhbCkpLFxuICAgIERhdGU6ICh2YWx1ZSkgPT4gbmV3IGdsb2JhbC5EYXRlKHZhbHVlKSxcbiAgICBET01FeGNlcHRpb246ICh2YWx1ZSkgPT4ge1xuICAgICAgY29uc3QgZXJyb3IgPSBuZXcgZ2xvYmFsLkRPTUV4Y2VwdGlvbih2YWx1ZS5tZXNzYWdlLCB2YWx1ZS5uYW1lKTtcbiAgICAgIGlmICh2YWx1ZS5zdGFjayAhPT0gdW5kZWZpbmVkKSBlcnJvci5zdGFjayA9IHZhbHVlLnN0YWNrO1xuICAgICAgLy8gRE9NRXhjZXB0aW9uJ3MgY29uc3RydWN0b3IgZG9lc24ndCBhY2NlcHQgYSBjYXVzZSBvcHRpb24sIHNvXG4gICAgICAvLyB3ZSBzZXQgaXQgbWFudWFsbHkgd2hlbiBwcmVzZW50IGluIHRoZSBzZXJpYWxpemVkIGRhdGEuXG4gICAgICBpZiAoJ2NhdXNlJyBpbiB2YWx1ZSkgZXJyb3IuY2F1c2UgPSB2YWx1ZS5jYXVzZTtcbiAgICAgIHJldHVybiBlcnJvcjtcbiAgICB9LFxuICAgIC8vIEVycm9yIHN1YmNsYXNzIHJldml2ZXJzIHJlY29uc3RydWN0IHRoZSBjb3JyZWN0IGJ1aWx0LWluIEVycm9yIHR5cGUuXG4gICAgLy8gU2VlIGBtYWtlRXJyb3JTdWJjbGFzc1Jldml2ZXJgIGZvciBpbXBsZW1lbnRhdGlvbiBkZXRhaWxzLlxuICAgIEV2YWxFcnJvcjogbWFrZUVycm9yU3ViY2xhc3NSZXZpdmVyKGdsb2JhbCwgJ0V2YWxFcnJvcicpLFxuICAgIC8vIGBGYXRhbEVycm9yYCBhbmQgYFJldHJ5YWJsZUVycm9yYCBhcmUgbm90IGJ1aWx0LWlucywgc28gd2UgcmVzb2x2ZSB0aGVtXG4gICAgLy8gZnJvbSB0aGUgY29uc3VtZXIncyBgZ2xvYmFsVGhpc2AgdmlhIGEgYFN5bWJvbC5mb3IoLi4uKWAga2V5IHJlZ2lzdGVyZWRcbiAgICAvLyBieSBgQHdvcmtmbG93L2Vycm9yc2Agb24gbG9hZC4gVGhpcyBtYWtlcyBgaW5zdGFuY2VvZiBGYXRhbEVycm9yYCB3b3JrXG4gICAgLy8gaW4gdXNlciBjb2RlIHRoYXQgbGl2ZXMgaW4gYSBkaWZmZXJlbnQgcmVhbG0gdGhhbiB0aGlzIHJlZHVjZXIgbW9kdWxlXG4gICAgLy8gKGUuZy4gd2hlbiB0aGUgaG9zdCBoeWRyYXRlcyBhIHZhbHVlIGRlc3RpbmVkIGZvciBhIHdvcmtmbG93IFZNXG4gICAgLy8gY29udGV4dCkuIFNlZSB0aGUgcmVnaXN0cmF0aW9uIGJsb2NrIGF0IHRoZSBib3R0b20gb2ZcbiAgICAvLyBgcGFja2FnZXMvZXJyb3JzL3NyYy9pbmRleC50c2AgZm9yIGRldGFpbHMuIEZhbGxzIGJhY2sgdG8gdGhlIGltcG9ydGVkXG4gICAgLy8gY2xhc3MgZm9yIGVudmlyb25tZW50cyB3aGVyZSBubyBidW5kbGVkIGBAd29ya2Zsb3cvZXJyb3JzYCBoYXMgbG9hZGVkXG4gICAgLy8gaW4gdGhlIGNvbnN1bWVyIHJlYWxtLlxuICAgIEZhdGFsRXJyb3I6ICh2YWx1ZSkgPT4ge1xuICAgICAgY29uc3QgQ3RvciA9XG4gICAgICAgICgoZ2xvYmFsIGFzIFJlY29yZDxzeW1ib2wsIHVua25vd24+KVtcbiAgICAgICAgICBTeW1ib2wuZm9yKCdAd29ya2Zsb3cvZXJyb3JzLy9GYXRhbEVycm9yJylcbiAgICAgICAgXSBhcyB0eXBlb2YgRmF0YWxFcnJvciB8IHVuZGVmaW5lZCkgPz8gRmF0YWxFcnJvcjtcbiAgICAgIGNvbnN0IGVycm9yID0gbmV3IEN0b3IodmFsdWUubWVzc2FnZSk7XG4gICAgICBpZiAodmFsdWUuc3RhY2sgIT09IHVuZGVmaW5lZCkgZXJyb3Iuc3RhY2sgPSB2YWx1ZS5zdGFjaztcbiAgICAgIGlmICgnY2F1c2UnIGluIHZhbHVlKSBlcnJvci5jYXVzZSA9IHZhbHVlLmNhdXNlO1xuICAgICAgcmV0dXJuIGVycm9yO1xuICAgIH0sXG4gICAgUmFuZ2VFcnJvcjogbWFrZUVycm9yU3ViY2xhc3NSZXZpdmVyKGdsb2JhbCwgJ1JhbmdlRXJyb3InKSxcbiAgICBSZWZlcmVuY2VFcnJvcjogbWFrZUVycm9yU3ViY2xhc3NSZXZpdmVyKGdsb2JhbCwgJ1JlZmVyZW5jZUVycm9yJyksXG4gICAgUmV0cnlhYmxlRXJyb3I6ICh2YWx1ZSkgPT4ge1xuICAgICAgLy8gVXNlIHRoZSBjb250ZXh0J3MgYERhdGVgIGNvbnN0cnVjdG9yIChtYXRjaGluZyB0aGUgcmVzdCBvZiB0aGlzXG4gICAgICAvLyBtb2R1bGUpIHNvIHRoZSByZXN1bHRpbmcgYHJldHJ5QWZ0ZXJgIERhdGUgcGFzc2VzIGBpbnN0YW5jZW9mXG4gICAgICAvLyBnbG9iYWwuRGF0ZWAgY2hlY2tzIGluIHRoZSB0YXJnZXQgcmVhbG0uIFNlZSB0aGUgRmF0YWxFcnJvciByZXZpdmVyXG4gICAgICAvLyBhYm92ZSBmb3Igd2h5IHdlIHJlc29sdmUgYFJldHJ5YWJsZUVycm9yYCBmcm9tIHRoZSBjb25zdW1lcidzXG4gICAgICAvLyBnbG9iYWxUaGlzIGluc3RlYWQgb2YgdGhlIGltcG9ydGVkIGNsYXNzLlxuICAgICAgY29uc3QgQ3RvciA9XG4gICAgICAgICgoZ2xvYmFsIGFzIFJlY29yZDxzeW1ib2wsIHVua25vd24+KVtcbiAgICAgICAgICBTeW1ib2wuZm9yKCdAd29ya2Zsb3cvZXJyb3JzLy9SZXRyeWFibGVFcnJvcicpXG4gICAgICAgIF0gYXMgdHlwZW9mIFJldHJ5YWJsZUVycm9yIHwgdW5kZWZpbmVkKSA/PyBSZXRyeWFibGVFcnJvcjtcbiAgICAgIGNvbnN0IGVycm9yID0gbmV3IEN0b3IodmFsdWUubWVzc2FnZSwge1xuICAgICAgICByZXRyeUFmdGVyOiBuZXcgZ2xvYmFsLkRhdGUodmFsdWUucmV0cnlBZnRlciksXG4gICAgICB9KTtcbiAgICAgIGlmICh2YWx1ZS5zdGFjayAhPT0gdW5kZWZpbmVkKSBlcnJvci5zdGFjayA9IHZhbHVlLnN0YWNrO1xuICAgICAgaWYgKCdjYXVzZScgaW4gdmFsdWUpIGVycm9yLmNhdXNlID0gdmFsdWUuY2F1c2U7XG4gICAgICByZXR1cm4gZXJyb3I7XG4gICAgfSxcbiAgICBTeW50YXhFcnJvcjogbWFrZUVycm9yU3ViY2xhc3NSZXZpdmVyKGdsb2JhbCwgJ1N5bnRheEVycm9yJyksXG4gICAgVHlwZUVycm9yOiBtYWtlRXJyb3JTdWJjbGFzc1Jldml2ZXIoZ2xvYmFsLCAnVHlwZUVycm9yJyksXG4gICAgVVJJRXJyb3I6IG1ha2VFcnJvclN1YmNsYXNzUmV2aXZlcihnbG9iYWwsICdVUklFcnJvcicpLFxuICAgIEFnZ3JlZ2F0ZUVycm9yOiAodmFsdWUpID0+IHtcbiAgICAgIGNvbnN0IG9wdHMgPSAnY2F1c2UnIGluIHZhbHVlID8geyBjYXVzZTogdmFsdWUuY2F1c2UgfSA6IHVuZGVmaW5lZDtcbiAgICAgIGNvbnN0IGVycm9yID0gbmV3IGdsb2JhbC5BZ2dyZWdhdGVFcnJvcihcbiAgICAgICAgdmFsdWUuZXJyb3JzLFxuICAgICAgICB2YWx1ZS5tZXNzYWdlLFxuICAgICAgICBvcHRzXG4gICAgICApO1xuICAgICAgaWYgKHZhbHVlLnN0YWNrICE9PSB1bmRlZmluZWQpIGVycm9yLnN0YWNrID0gdmFsdWUuc3RhY2s7XG4gICAgICByZXR1cm4gZXJyb3I7XG4gICAgfSxcbiAgICAvLyBCYXNlIEVycm9yIHJldml2ZXIg4oCUIHVzZWQgZm9yIHBsYWluIEVycm9yIGluc3RhbmNlcyBhbmQgdW5yZWNvZ25pemVkXG4gICAgLy8gRXJyb3Igc3ViY2xhc3Nlcy4gUHJlc2VydmVzIGBuYW1lYCBzbyB0aGUgZXJyb3IncyBpZGVudGl0eSBpcyByZXRhaW5lZC5cbiAgICBFcnJvcjogKHZhbHVlKSA9PiB7XG4gICAgICBjb25zdCBvcHRzID0gJ2NhdXNlJyBpbiB2YWx1ZSA/IHsgY2F1c2U6IHZhbHVlLmNhdXNlIH0gOiB1bmRlZmluZWQ7XG4gICAgICBjb25zdCBlcnJvciA9IG5ldyBnbG9iYWwuRXJyb3IodmFsdWUubWVzc2FnZSwgb3B0cyk7XG4gICAgICBlcnJvci5uYW1lID0gdmFsdWUubmFtZTtcbiAgICAgIGlmICh2YWx1ZS5zdGFjayAhPT0gdW5kZWZpbmVkKSBlcnJvci5zdGFjayA9IHZhbHVlLnN0YWNrO1xuICAgICAgcmV0dXJuIGVycm9yO1xuICAgIH0sXG4gICAgRmxvYXQzMkFycmF5OiAodmFsdWU6IHN0cmluZykgPT5cbiAgICAgIG5ldyBnbG9iYWwuRmxvYXQzMkFycmF5KHJldml2ZUFycmF5QnVmZmVyKHZhbHVlLCBnbG9iYWwpKSxcbiAgICBGbG9hdDY0QXJyYXk6ICh2YWx1ZTogc3RyaW5nKSA9PlxuICAgICAgbmV3IGdsb2JhbC5GbG9hdDY0QXJyYXkocmV2aXZlQXJyYXlCdWZmZXIodmFsdWUsIGdsb2JhbCkpLFxuICAgIEhlYWRlcnM6ICh2YWx1ZSkgPT4gbmV3IGdsb2JhbC5IZWFkZXJzKHZhbHVlKSxcbiAgICBJbnQ4QXJyYXk6ICh2YWx1ZTogc3RyaW5nKSA9PlxuICAgICAgbmV3IGdsb2JhbC5JbnQ4QXJyYXkocmV2aXZlQXJyYXlCdWZmZXIodmFsdWUsIGdsb2JhbCkpLFxuICAgIEludDE2QXJyYXk6ICh2YWx1ZTogc3RyaW5nKSA9PlxuICAgICAgbmV3IGdsb2JhbC5JbnQxNkFycmF5KHJldml2ZUFycmF5QnVmZmVyKHZhbHVlLCBnbG9iYWwpKSxcbiAgICBJbnQzMkFycmF5OiAodmFsdWU6IHN0cmluZykgPT5cbiAgICAgIG5ldyBnbG9iYWwuSW50MzJBcnJheShyZXZpdmVBcnJheUJ1ZmZlcih2YWx1ZSwgZ2xvYmFsKSksXG4gICAgTWFwOiAodmFsdWUpID0+IG5ldyBnbG9iYWwuTWFwKHZhbHVlKSxcbiAgICBSZWdFeHA6ICh2YWx1ZSkgPT4gbmV3IGdsb2JhbC5SZWdFeHAodmFsdWUuc291cmNlLCB2YWx1ZS5mbGFncyksXG4gICAgU2V0OiAodmFsdWUpID0+IG5ldyBnbG9iYWwuU2V0KHZhbHVlKSxcbiAgICBVUkw6ICh2YWx1ZSkgPT4gbmV3IGdsb2JhbC5VUkwodmFsdWUpLFxuICAgIFdvcmtmbG93RnVuY3Rpb246ICh2YWx1ZSkgPT5cbiAgICAgIE9iamVjdC5hc3NpZ24oXG4gICAgICAgICgpID0+IHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICAnV29ya2Zsb3cgZnVuY3Rpb25zIGNhbm5vdCBiZSBjYWxsZWQgZGlyZWN0bHkuIFVzZSBzdGFydCgpIHRvIGludm9rZSB0aGVtLidcbiAgICAgICAgICApO1xuICAgICAgICB9LFxuICAgICAgICB7IHdvcmtmbG93SWQ6IHZhbHVlLndvcmtmbG93SWQgfVxuICAgICAgKSxcbiAgICBVUkxTZWFyY2hQYXJhbXM6ICh2YWx1ZSkgPT5cbiAgICAgIG5ldyBnbG9iYWwuVVJMU2VhcmNoUGFyYW1zKHZhbHVlID09PSAnLicgPyAnJyA6IHZhbHVlKSxcbiAgICBVaW50OEFycmF5OiAodmFsdWU6IHN0cmluZykgPT5cbiAgICAgIG5ldyBnbG9iYWwuVWludDhBcnJheShyZXZpdmVBcnJheUJ1ZmZlcih2YWx1ZSwgZ2xvYmFsKSksXG4gICAgVWludDhDbGFtcGVkQXJyYXk6ICh2YWx1ZTogc3RyaW5nKSA9PlxuICAgICAgbmV3IGdsb2JhbC5VaW50OENsYW1wZWRBcnJheShyZXZpdmVBcnJheUJ1ZmZlcih2YWx1ZSwgZ2xvYmFsKSksXG4gICAgVWludDE2QXJyYXk6ICh2YWx1ZTogc3RyaW5nKSA9PlxuICAgICAgbmV3IGdsb2JhbC5VaW50MTZBcnJheShyZXZpdmVBcnJheUJ1ZmZlcih2YWx1ZSwgZ2xvYmFsKSksXG4gICAgVWludDMyQXJyYXk6ICh2YWx1ZTogc3RyaW5nKSA9PlxuICAgICAgbmV3IGdsb2JhbC5VaW50MzJBcnJheShyZXZpdmVBcnJheUJ1ZmZlcih2YWx1ZSwgZ2xvYmFsKSksXG4gIH07XG59XG5cbi8vIFJlLWV4cG9ydCBmb3IgdXNlIGluIGxlZ2FjeSBjb21wYXRcbmV4cG9ydCB7IHJldml2ZSB9O1xuIl19
502
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tbW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3NlcmlhbGl6YXRpb24vcmVkdWNlcnMvY29tbW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7R0FTRztBQUVILE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFDbEMsT0FBTyxFQUNMLFVBQVUsRUFDVixpQkFBaUIsRUFDakIsY0FBYyxFQUNkLHNCQUFzQixFQUN0QixXQUFXLEdBQ1osTUFBTSxrQkFBa0IsQ0FBQztBQUMxQixPQUFPLEVBQ0wscUJBQXFCLEVBQ3JCLFdBQVcsRUFDWCxXQUFXLEVBQ1gsZUFBZSxFQUNmLFdBQVcsRUFDWCxnQkFBZ0IsRUFDaEIscUJBQXFCLEVBQ3JCLFlBQVksRUFDWixZQUFZLEVBQ1osZUFBZSxFQUNmLFdBQVcsRUFDWCxZQUFZLEVBQ1osV0FBVyxFQUNYLE9BQU8sRUFDUCx1QkFBdUIsRUFDdkIsUUFBUSxHQUNULE1BQU0sZ0JBQWdCLENBQUM7QUFHeEIsMkJBQTJCO0FBRTNCLFNBQVMsbUJBQW1CLENBQzFCLEtBQXNCLEVBQ3RCLE1BQWMsRUFDZCxNQUFjO0lBRWQsc0RBQXNEO0lBQ3RELElBQUksTUFBTSxLQUFLLENBQUM7UUFBRSxPQUFPLEdBQUcsQ0FBQztJQUM3Qiw4REFBOEQ7SUFDOUQsTUFBTSxLQUFLLEdBQUcsSUFBSSxVQUFVLENBQUMsS0FBSyxFQUFFLE1BQU0sRUFBRSxNQUFNLENBQUMsQ0FBQztJQUNwRCxPQUFPLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0FBQy9DLENBQUM7QUFFRCxTQUFTLFlBQVksQ0FBQyxLQUFzQjtJQUMxQyx5RUFBeUU7SUFDekUsMEVBQTBFO0lBQzFFLHdFQUF3RTtJQUN4RSxjQUFjO0lBQ2QsTUFBTSxJQUFJLEdBQUcsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQzdCLE9B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QUUsQ0FDNUIsSUFBSSxNQUFNLENBQUMsVUFBVSxDQUFDLGlCQUFpQixDQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsQ0FBQztRQUN6RCxpQkFBaUIsRUFBRSxDQUFDLEtBQWEsRUFBRSxFQUFFLENBQ25DLElBQUksTUFBTSxDQUFDLGlCQUFpQixDQUFDLGlCQUFpQixDQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsQ0FBQztRQUNoRSxXQUFXLEVBQUUsQ0FBQyxLQUFhLEVBQUUsRUFBRSxDQUM3QixJQUFJLE1BQU0sQ0FBQyxXQUFXLENBQUMsaUJBQWlCLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBQzFELFdBQVcsRUFBRSxDQUFDLEtBQWEsRUFBRSxFQUFFLENBQzdCLElBQUksTUFBTSxDQUFDLFdBQVcsQ0FBQyxpQkFBaUIsQ0FBQyxLQUFLLEVBQUUsTUFBTSxDQUFDLENBQUM7S0FDM0QsQ0FBQztBQUNKLENBQUM7QUFFRCxxQ0FBcUM7QUFDckMsT0FBTyxFQUFFLE1BQU0sRUFBRSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDb21tb24gcmVkdWNlcnMgYW5kIHJldml2ZXJzIGZvciB0eXBlcyBzaGFyZWQgYWNyb3NzIGFsbCBzZXJpYWxpemF0aW9uIG1vZGVzLlxuICpcbiAqIEhhbmRsZXM6IEFycmF5QnVmZmVyLCBCaWdJbnQsIHR5cGVkIGFycmF5cywgRGF0ZSwgRXJyb3IsIEhlYWRlcnMsIE1hcCwgU2V0LFxuICogUmVnRXhwLCBSZXF1ZXN0LCBSZXNwb25zZSwgVVJMLCBVUkxTZWFyY2hQYXJhbXMuXG4gKlxuICogTm90ZTogVXNlcyBOb2RlLmpzIEJ1ZmZlciBmb3IgYmFzZTY0IGVuY29kaW5nL2RlY29kaW5nLiBGb3IgZW52aXJvbm1lbnRzXG4gKiB3aXRob3V0IEJ1ZmZlciAoZS5nLiBRdWlja0pTIFZNKSwgYSBwb2x5ZmlsbCBvciBhbHRlcm5hdGl2ZSBiYXNlNjRcbiAqIGltcGxlbWVudGF0aW9uIHdpbGwgYmUgbmVlZGVkLlxuICovXG5cbmltcG9ydCB7IHR5cGVzIH0gZnJvbSAnbm9kZTp1dGlsJztcbmltcG9ydCB7XG4gIEZhdGFsRXJyb3IsXG4gIEhvb2tDb25mbGljdEVycm9yLFxuICBSZXRyeWFibGVFcnJvcixcbiAgUnVudGltZURlY3J5cHRpb25FcnJvcixcbiAgU3RyZWFtRXJyb3IsXG59IGZyb20gJ0B3b3JrZmxvdy9lcnJvcnMnO1xuaW1wb3J0IHtcbiAgYXJyYXlCdWZmZXJCeXRlTGVuZ3RoLFxuICBkYXRlR2V0RGF0ZSxcbiAgZGF0ZUdldFRpbWUsXG4gIGRhdGVUb0lTT1N0cmluZyxcbiAgaGFzUHJvcGVydHksXG4gIGhlYWRlcnNUb0VudHJpZXMsXG4gIGlzSW5zdGFuY2VPZlByb3RvdHlwZSxcbiAgbWFwVG9FbnRyaWVzLFxuICByZWFkUHJvcGVydHksXG4gIHJlY29yZEd1ZXN0Q29kZSxcbiAgcmVnRXhwRmxhZ3MsXG4gIHJlZ0V4cFNvdXJjZSxcbiAgc2V0VG9WYWx1ZXMsXG4gIHVybEhyZWYsXG4gIHVybFNlYXJjaFBhcmFtc1RvU3RyaW5nLFxuICB2aWV3SW5mbyxcbn0gZnJvbSAnLi4vaGFyZGVuZWQuanMnO1xuaW1wb3J0IHR5cGUgeyBSZWR1Y2VycywgUmV2aXZlcnMsIFNlcmlhbGl6YWJsZVNwZWNpYWwgfSBmcm9tICcuLi90eXBlcy5qcyc7XG5cbi8vIC0tLS0gQmFzZTY0IGhlbHBlcnMgLS0tLVxuXG5mdW5jdGlvbiBhcnJheUJ1ZmZlclRvQmFzZTY0KFxuICB2YWx1ZTogQXJyYXlCdWZmZXJMaWtlLFxuICBvZmZzZXQ6IG51bWJlcixcbiAgbGVuZ3RoOiBudW1iZXJcbik6IHN0cmluZyB7XG4gIC8vIEF2b2lkIHJldHVybmluZyBmYWxzeSB2YWx1ZSBmb3IgemVyby1sZW5ndGggYnVmZmVyc1xuICBpZiAobGVuZ3RoID09PSAwKSByZXR1cm4gJy4nO1xuICAvLyBDcmVhdGUgYSBwcm9wZXIgY29weSB0byBhdm9pZCBBcnJheUJ1ZmZlciBkZXRhY2htZW50IGlzc3Vlc1xuICBjb25zdCB1aW50OCA9IG5ldyBVaW50OEFycmF5KHZhbHVlLCBvZmZzZXQsIGxlbmd0aCk7XG4gIHJldHVybiBCdWZmZXIuZnJvbSh1aW50OCkudG9TdHJpbmcoJ2Jhc2U2NCcpO1xufVxuXG5mdW5jdGlvbiB2aWV3VG9CYXNlNjQodmFsdWU6IEFycmF5QnVmZmVyVmlldyk6IHN0cmluZyB7XG4gIC8vIFJlYWQgdGhlIHZpZXcncyByYW5nZSB0aHJvdWdoIGludGVybmFsLXNsb3QgZ2V0dGVycyAoc2VlIGhhcmRlbmVkLnRzKTpcbiAgLy8gb3duIHByb3BlcnRpZXMgc2hhZG93aW5nIGBidWZmZXJgL2BieXRlT2Zmc2V0YC9gYnl0ZUxlbmd0aGAgKG9yIHBhdGNoZWRcbiAgLy8gcHJvdG90eXBlIGdldHRlcnMgaW4gdGhlIHNhbmRib3ggcmVhbG0pIGNhbm5vdCBjaGFuZ2Ugd2hpY2ggYnl0ZXMgYXJlXG4gIC8vIHNlcmlhbGl6ZWQuXG4gIGNvbnN0IGluZm8gPSB2aWV3SW5mbyh2YWx1ZSk7XG4gIHJldHVybiBhcnJheUJ1ZmZlclRvQmFzZTY0KGluZm8uYnVmZmVyLCBpbmZvLmJ5dGVPZmZzZXQsIGluZm8uYnl0ZUxlbmd0aCk7XG59XG5cbmZ1bmN0aW9uIHJldml2ZUFycmF5QnVmZmVyKFxuICB2YWx1ZTogc3RyaW5nLFxuICBnbG9iYWw6IFJlY29yZDxzdHJpbmcsIGFueT5cbik6IEFycmF5QnVmZmVyIHtcbiAgY29uc3QgYmFzZTY0ID0gdmFsdWUgPT09ICcuJyA/ICcnIDogdmFsdWU7XG4gIGNvbnN0IGJ1ZmZlciA9IEJ1ZmZlci5mcm9tKGJhc2U2NCwgJ2Jhc2U2NCcpO1xuICBjb25zdCBhcnJheUJ1ZmZlciA9IG5ldyBnbG9iYWwuQXJyYXlCdWZmZXIoYnVmZmVyLmxlbmd0aCk7XG4gIGNvbnN0IHVpbnQ4QXJyYXkgPSBuZXcgZ2xvYmFsLlVpbnQ4QXJyYXkoYXJyYXlCdWZmZXIpO1xuICB1aW50OEFycmF5LnNldChidWZmZXIpO1xuICByZXR1cm4gYXJyYXlCdWZmZXI7XG59XG5cbmZ1bmN0aW9uIHJldml2ZShzdHI6IHN0cmluZykge1xuICAvLyBkZXZhbHVlLnN0cmluZ2lmeSgpIGFsd2F5cyBwcm9kdWNlcyB2YWxpZCBKU09OOiBzcGVjaWFsIHZhbHVlc1xuICAvLyAodW5kZWZpbmVkLCBOYU4sIEluZmluaXR5LCAtMCkgYXJlIGVuY29kZWQgYXMgbmVnYXRpdmUgaW50ZWdlclxuICAvLyBzZW50aW5lbHMgYW5kIHRoZSByZW1haW5pbmcgc3RydWN0dXJlIGlzIG9yZGluYXJ5IEpTT04uIFBhcnNpbmdcbiAgLy8gd2l0aCBKU09OLnBhcnNlIHlpZWxkcyB0aGUgZmxhdHRlbmVkIGZvcm0gdGhhdCB1bmZsYXR0ZW4oKSBleHBlY3RzLlxuICByZXR1cm4gSlNPTi5wYXJzZShzdHIpO1xufVxuXG4vLyAtLS0tIEVycm9yIHN1YmNsYXNzIGhlbHBlcnMgLS0tLVxuXG4vKipcbiAqIFRoZSBzaGFyZWQgc2hhcGUgdGhhdCBldmVyeSBFcnJvci1zdWJjbGFzcyByZWR1Y2VyIGluIHRoaXMgbW9kdWxlXG4gKiBwcm9kdWNlcy4gU29tZSBzdWJjbGFzc2VzIChlLmcuIGBBZ2dyZWdhdGVFcnJvcmAsIGBSZXRyeWFibGVFcnJvcmApIGV4dGVuZFxuICogdGhpcyB3aXRoIGFkZGl0aW9uYWwgZmllbGRzIGJ5IHNwcmVhZGluZyB0aGUgYmFzZSBwYXlsb2FkLlxuICovXG50eXBlIEJhc2VFcnJvclBheWxvYWQgPSB7XG4gIG1lc3NhZ2U6IHN0cmluZztcbiAgc3RhY2s/OiBzdHJpbmc7XG4gIGNhdXNlPzogdW5rbm93bjtcbn07XG5cbi8qKlxuICogU3Vic2V0IG9mIGBTZXJpYWxpemFibGVTcGVjaWFsYCBrZXlzIHdob3NlIHBheWxvYWQgc2hhcGUgaXMgZXhhY3RseSB0aGVcbiAqIGBCYXNlRXJyb3JQYXlsb2FkYC4gYG1ha2VFcnJvclN1YmNsYXNzUmVkdWNlcmAgaXMgY29uc3RyYWluZWQgdG8gb25seVxuICogdGhlc2Uga2V5cyBzbyBpdHMgcmV0dXJuIHR5cGUgaXMgc291bmQ7IHN1YmNsYXNzZXMgdGhhdCBuZWVkIGV4dHJhXG4gKiBmaWVsZHMgKGxpa2UgYEFnZ3JlZ2F0ZUVycm9yLmVycm9yc2Agb3IgYFJldHJ5YWJsZUVycm9yLnJldHJ5QWZ0ZXJgKSB1c2VcbiAqIGByZWR1Y2VFcnJvckJhc2VgIGRpcmVjdGx5IGFuZCBleHRlbmQgdGhlIHJlc3VsdC5cbiAqL1xudHlwZSBTaW1wbGVFcnJvclN1YmNsYXNzS2V5ID0ge1xuICBbSyBpbiBrZXlvZiBTZXJpYWxpemFibGVTcGVjaWFsXTogU2VyaWFsaXphYmxlU3BlY2lhbFtLXSBleHRlbmRzIEJhc2VFcnJvclBheWxvYWRcbiAgICA/IEJhc2VFcnJvclBheWxvYWQgZXh0ZW5kcyBTZXJpYWxpemFibGVTcGVjaWFsW0tdXG4gICAgICA/IEtcbiAgICAgIDogbmV2ZXJcbiAgICA6IG5ldmVyO1xufVtrZXlvZiBTZXJpYWxpemFibGVTcGVjaWFsXTtcblxuLyoqXG4gKiBSZWFkcyBgZXJyb3Iuc3RhY2tgIGZvciBzZXJpYWxpemF0aW9uLiBBIG5hdHVyYWwgVjggZXJyb3IgY2FycmllcyBgc3RhY2tgXG4gKiBhcyBhbiBvd24gKmFjY2Vzc29yKiB3aG9zZSBmaXJzdCBpbnZvY2F0aW9uIGZvcm1hdHMgYW5kIGNhY2hlcyB0aGUgdHJhY2UuXG4gKiBUaGF0IHJlYWQgaXMgbm90IHBhc3NpdmU6IGl0IGV4ZWN1dGVzIGBFcnJvci5wcmVwYXJlU3RhY2tUcmFjZWAgd2hlbiB0aGVcbiAqIHJlYWxtIGhhcyBvbmUgaW5zdGFsbGVkLCBhbmQgdGhlIGZvcm1hdC1hbmQtY2FjaGUgaXRzZWxmIGlzXG4gKiB3b3JrZmxvdy12aXNpYmxlIChhIGZvcm1hdHRlciBpbnN0YWxsZWQgbGF0ZXIgbmV2ZXIgcnVucyBmb3IgYW5cbiAqIGFscmVhZHktbWF0ZXJpYWxpemVkIGVycm9yKS4gQSBjb2xkIHJlcGxheSByZXBlYXRzIG5laXRoZXIgKGl0IHNraXBzXG4gKiBkZWh5ZHJhdGlvbiBlbnRpcmVseSksIHNvIHRoZSByZWFkIGlzIHJlY29yZGVkIGFzIGd1ZXN0IGNvZGUuIEFcbiAqIGRhdGEtcHJvcGVydHkgYHN0YWNrYCAocmVoeWRyYXRlZCBlcnJvcnMsIHdvcmtmbG93LWFzc2lnbmVkIHN0cmluZ3MpXG4gKiByZWFkcyBwYXNzaXZlbHkuXG4gKi9cbmZ1bmN0aW9uIHJlYWRFcnJvclN0YWNrKHZhbHVlOiB1bmtub3duKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgZGVzY3JpcHRvciA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodmFsdWUgYXMgb2JqZWN0LCAnc3RhY2snKTtcbiAgaWYgKGRlc2NyaXB0b3IgJiYgJ3ZhbHVlJyBpbiBkZXNjcmlwdG9yKSB7XG4gICAgcmV0dXJuIGRlc2NyaXB0b3IudmFsdWUgYXMgc3RyaW5nIHwgdW5kZWZpbmVkO1xuICB9XG4gIHJlY29yZEd1ZXN0Q29kZSgnZ2V0dGVyJywgJ3N0YWNrJyk7XG4gIGlmIChkZXNjcmlwdG9yPy5nZXQpIHtcbiAgICByZXR1cm4gZGVzY3JpcHRvci5nZXQuY2FsbCh2YWx1ZSkgYXMgc3RyaW5nIHwgdW5kZWZpbmVkO1xuICB9XG4gIHJldHVybiByZWFkUHJvcGVydHkodmFsdWUsICdzdGFjaycpIGFzIHN0cmluZyB8IHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBSZWR1Y2VzIGFueSBuYXRpdmUgRXJyb3IgaW5zdGFuY2UgdG8gdGhlIHNoYXJlZCBgQmFzZUVycm9yUGF5bG9hZGAgc2hhcGUsXG4gKiBwcmVzZXJ2aW5nIGBjYXVzZWAgb25seSB3aGVuIHByZXNlbnQgKHRvIGRpc3Rpbmd1aXNoIFwibm8gY2F1c2VcIiBmcm9tXG4gKiBcImNhdXNlIGlzIHVuZGVmaW5lZFwiKS4gVXNlZCBkaXJlY3RseSBieSByZWR1Y2VycyBmb3Igc3ViY2xhc3NlcyB0aGF0IG5lZWRcbiAqIHRvIGV4dGVuZCB0aGUgc2hhcGUgd2l0aCBhZGRpdGlvbmFsIGZpZWxkcy5cbiAqXG4gKiBgdHlwZXMuaXNOYXRpdmVFcnJvcigpYCBpcyB1c2VkIGluc3RlYWQgb2YgYGluc3RhbmNlb2ZgIGZvciBjcm9zcy1WTSBzYWZldHk6XG4gKiBlcnJvcnMgbWF5IG9yaWdpbmF0ZSBmcm9tIGEgZGlmZmVyZW50IFZNIGNvbnRleHQsIGFuZCBgaW5zdGFuY2VvZmAgZmFpbHNcbiAqIGFjcm9zcyBWTSBib3VuZGFyaWVzIHNpbmNlIGVhY2ggY29udGV4dCBoYXMgaXRzIG93biBFcnJvciBjb25zdHJ1Y3Rvci5cbiAqL1xuZnVuY3Rpb24gcmVkdWNlRXJyb3JCYXNlKHZhbHVlOiB1bmtub3duKTogQmFzZUVycm9yUGF5bG9hZCB8IGZhbHNlIHtcbiAgaWYgKCF0eXBlcy5pc05hdGl2ZUVycm9yKHZhbHVlKSkgcmV0dXJuIGZhbHNlO1xuICAvLyBgbWVzc2FnZWAvYGNhdXNlYCBhcmUgb3duIGRhdGEgcHJvcGVydGllcyBvbiBuYXR1cmFsIGVycm9ycywgc28gdGhlXG4gIC8vIGRlc2NyaXB0b3ItYmFzZWQgcmVhZHMgY29zdCBub3RoaW5nOyBhIHNhbmRib3gtZGVmaW5lZCBhY2Nlc3NvclxuICAvLyAoZS5nLiBhIGdldHRlciBvbiBhbiBFcnJvciBzdWJjbGFzcykgaXMgc3RpbGwgaW52b2tlZCBidXQgcmVjb3JkZWQuXG4gIGNvbnN0IHJlZHVjZWQ6IEJhc2VFcnJvclBheWxvYWQgPSB7XG4gICAgbWVzc2FnZTogcmVhZFByb3BlcnR5KHZhbHVlLCAnbWVzc2FnZScpIGFzIHN0cmluZyxcbiAgICBzdGFjazogcmVhZEVycm9yU3RhY2sodmFsdWUpLFxuICB9O1xuICBpZiAoaGFzUHJvcGVydHkodmFsdWUsICdjYXVzZScpKSByZWR1Y2VkLmNhdXNlID0gcmVhZFByb3BlcnR5KHZhbHVlLCAnY2F1c2UnKTtcbiAgcmV0dXJuIHJlZHVjZWQ7XG59XG5cbi8qKlxuICogUmVkdWNlcyBhIG5hdGl2ZSBlcnJvciB0byB0aGUgc2hhcmVkIGBCYXNlRXJyb3JQYXlsb2FkYCwgYnV0IG9ubHkgd2hlbiBpdHNcbiAqIGBuYW1lYCBpbnN0YW5jZSBwcm9wZXJ0eSBtYXRjaGVzIGBzdWJjbGFzc05hbWVgLiBVc2VkIGJ5OlxuICogICAtIGBtYWtlRXJyb3JTdWJjbGFzc1JlZHVjZXJgLCBmb3Igc3ViY2xhc3NlcyB3aG9zZSBzZXJpYWxpemVkIHNoYXBlIGlzXG4gKiAgICAgZXhhY3RseSBgQmFzZUVycm9yUGF5bG9hZGAuXG4gKiAgIC0gSW5saW5lIHJlZHVjZXJzIGZvciBzdWJjbGFzc2VzIHRoYXQgZXh0ZW5kIHRoZSBzaGFwZSB3aXRoIGFkZGl0aW9uYWxcbiAqICAgICBmaWVsZHMgKGUuZy4gYEFnZ3JlZ2F0ZUVycm9yLmVycm9yc2AsIGBSZXRyeWFibGVFcnJvci5yZXRyeUFmdGVyYCkuXG4gKlxuICogTWF0Y2hpbmcgYnkgYHZhbHVlLm5hbWVgIChpbnN0ZWFkIG9mIGB2YWx1ZS5jb25zdHJ1Y3Rvcj8ubmFtZWApIHdvcmtzIHdpdGhcbiAqIGJ1bmRsZXJzIHRoYXQgZW1pdCB0aGUgY2xhc3MgYXMgYW4gYW5vbnltb3VzIGV4cHJlc3Npb24uIEUuZy4gVHVyYm9wYWNrXG4gKiBjb21waWxlcyBgZXhwb3J0IGNsYXNzIEZhdGFsRXJyb3IgZXh0ZW5kcyBFcnJvciB74oCmfWAgdG8gYSByZWdpc3RyYXRpb24gY2FsbFxuICogbGlrZSBgZS5zKFtcIkZhdGFsRXJyb3JcIiwgMCwgY2xhc3MgZXh0ZW5kcyBFcnJvciB74oCmfV0pYCwgYW5kIHRoZSByZXN1bHRpbmdcbiAqIGNvbnN0cnVjdG9yIGhhcyBgbmFtZSA9PT0gJydgLiBTaW5jZSBldmVyeSBFcnJvciBzdWJjbGFzcyB3ZSBjYXJlIGFib3V0XG4gKiBzZXRzIGB0aGlzLm5hbWVgIGV4cGxpY2l0bHkgaW4gaXRzIGNvbnN0cnVjdG9yIChidWlsdC1pbiBzdWJjbGFzc2VzIGRvIHRoaXNcbiAqIGF1dG9tYXRpY2FsbHk7IGBGYXRhbEVycm9yYC9gUmV0cnlhYmxlRXJyb3JgIGRvIGl0IGluIHVzZXIgY29kZSksIHRoZVxuICogaW5zdGFuY2UgcHJvcGVydHkgaXMgdGhlIHJlbGlhYmxlIGlkZW50aXR5IG1hcmtlciBhY3Jvc3MgcmVhbG1zIGFuZFxuICogYnVuZGxlcnMuXG4gKi9cbmZ1bmN0aW9uIHJlZHVjZU5hbWVkRXJyb3JTdWJjbGFzc0Jhc2UoXG4gIHN1YmNsYXNzTmFtZTogc3RyaW5nLFxuICB2YWx1ZTogdW5rbm93blxuKTogQmFzZUVycm9yUGF5bG9hZCB8IGZhbHNlIHtcbiAgaWYgKCF0eXBlcy5pc05hdGl2ZUVycm9yKHZhbHVlKSkgcmV0dXJuIGZhbHNlO1xuICBpZiAocmVhZFByb3BlcnR5KHZhbHVlLCAnbmFtZScpICE9PSBzdWJjbGFzc05hbWUpIHJldHVybiBmYWxzZTtcbiAgcmV0dXJuIHJlZHVjZUVycm9yQmFzZSh2YWx1ZSk7XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIHJlZHVjZXIgZm9yIGEgYnVpbHQtaW4gRXJyb3Igc3ViY2xhc3Mgd2hvc2Ugc2VyaWFsaXplZCBzaGFwZSBpc1xuICogZXhhY3RseSBgQmFzZUVycm9yUGF5bG9hZGAgKG5vIGV4dHJhIGZpZWxkcykuIFRoZSByZWR1Y2VyIG1hdGNoZXMgYnlcbiAqIGNvbnN0cnVjdG9yIG5hbWUgKGFmdGVyIHRoZSBpc05hdGl2ZUVycm9yIGdhdGUpLCBzaW5jZSBgaW5zdGFuY2VvZmAgbWF5XG4gKiBmYWlsIGFjcm9zcyBWTSBib3VuZGFyaWVzLlxuICovXG5mdW5jdGlvbiBtYWtlRXJyb3JTdWJjbGFzc1JlZHVjZXI8SyBleHRlbmRzIFNpbXBsZUVycm9yU3ViY2xhc3NLZXk+KFxuICBzdWJjbGFzc05hbWU6IEtcbikge1xuICByZXR1cm4gKHZhbHVlOiB1bmtub3duKTogU2VyaWFsaXphYmxlU3BlY2lhbFtLXSB8IGZhbHNlID0+IHtcbiAgICBjb25zdCBiYXNlID0gcmVkdWNlTmFtZWRFcnJvclN1YmNsYXNzQmFzZShzdWJjbGFzc05hbWUsIHZhbHVlKTtcbiAgICBpZiAoIWJhc2UpIHJldHVybiBmYWxzZTtcbiAgICByZXR1cm4gYmFzZSBhcyBTZXJpYWxpemFibGVTcGVjaWFsW0tdO1xuICB9O1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYSByZXZpdmVyIGZvciBhIGJ1aWx0LWluIEVycm9yIHN1YmNsYXNzLiBSZWNvbnN0cnVjdHMgdGhlIGNvcnJlY3RcbiAqIGJ1aWx0LWluIEVycm9yIHR5cGUgdXNpbmcgdGhlIGNvbnRleHQncyBjb25zdHJ1Y3Rvci4gVGhlIGBjYXVzZWAgb3B0aW9uIGlzXG4gKiBvbmx5IHBhc3NlZCB3aGVuIHRoZSBzZXJpYWxpemVkIGRhdGEgaW5jbHVkZXMgaXQsIHByZXNlcnZpbmcgdGhlIGRpc3RpbmN0aW9uXG4gKiBiZXR3ZWVuIFwibm8gY2F1c2VcIiBhbmQgXCJjYXVzZSBpcyB1bmRlZmluZWRcIi5cbiAqL1xuZnVuY3Rpb24gbWFrZUVycm9yU3ViY2xhc3NSZXZpdmVyPEsgZXh0ZW5kcyBrZXlvZiBTZXJpYWxpemFibGVTcGVjaWFsPihcbiAgZ2xvYmFsOiBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxuICBjdG9yTmFtZTogc3RyaW5nXG4pIHtcbiAgcmV0dXJuICh2YWx1ZTogU2VyaWFsaXphYmxlU3BlY2lhbFtLXSkgPT4ge1xuICAgIGNvbnN0IHYgPSB2YWx1ZSBhcyBCYXNlRXJyb3JQYXlsb2FkO1xuICAgIGNvbnN0IG9wdHMgPSAnY2F1c2UnIGluIHYgPyB7IGNhdXNlOiB2LmNhdXNlIH0gOiB1bmRlZmluZWQ7XG4gICAgY29uc3QgQ3RvciA9IGdsb2JhbFtjdG9yTmFtZV07XG4gICAgY29uc3QgZXJyb3I6IEVycm9yID0gbmV3IEN0b3Iodi5tZXNzYWdlLCBvcHRzKTtcbiAgICBpZiAodi5zdGFjayAhPT0gdW5kZWZpbmVkKSBlcnJvci5zdGFjayA9IHYuc3RhY2s7XG4gICAgcmV0dXJuIGVycm9yO1xuICB9O1xufVxuXG4vLyAtLS0tIFJlZHVjZXJzIC0tLS1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldENvbW1vblJlZHVjZXJzKFxuICAvLyBUaGUgYGdsb2JhbGAgcGFyYW1ldGVyIGlzIHJldGFpbmVkIGZvciBBUEkgY29tcGF0aWJpbGl0eSwgYnV0IHRoZVxuICAvLyByZWR1Y2VycyBubyBsb25nZXIgcGVyZm9ybSBgaW5zdGFuY2VvZiBnbG9iYWwuWGAgY2hlY2tzOiBjbGFzc2lmaWNhdGlvblxuICAvLyBpcyBkb25lIHdpdGggZW5naW5lLWxldmVsIGJyYW5kIGNoZWNrcyAocmVhbG0tYWdub3N0aWMsIGltbXVuZSB0b1xuICAvLyByZWFzc2lnbmVkIHNhbmRib3ggZ2xvYmFscyBhbmQgYFN5bWJvbC5oYXNJbnN0YW5jZWApLCBhbmQgZXh0cmFjdGlvblxuICAvLyBnb2VzIHRocm91Z2ggaW50cmluc2ljcyBjYXB0dXJlZCBhdCBob3N0IGJvb3QuIFNlZSAuLi9oYXJkZW5lZC50cy5cbiAgX2dsb2JhbDogUmVjb3JkPHN0cmluZywgYW55PiA9IGdsb2JhbFRoaXNcbik6IFBhcnRpYWw8UmVkdWNlcnM+IHtcbiAgcmV0dXJuIHtcbiAgICBBcnJheUJ1ZmZlcjogKHZhbHVlKSA9PlxuICAgICAgdHlwZXMuaXNBcnJheUJ1ZmZlcih2YWx1ZSkgJiZcbiAgICAgIGFycmF5QnVmZmVyVG9CYXNlNjQodmFsdWUsIDAsIGFycmF5QnVmZmVyQnl0ZUxlbmd0aCh2YWx1ZSkpLFxuICAgIEJpZ0ludDogKHZhbHVlKSA9PlxuICAgICAgLy8gU3RyaW5nKGJpZ2ludCkgaXMgYSBzcGVjLWludGVybmFsIG51bWVyaWMgY29udmVyc2lvbjogdW5saWtlXG4gICAgICAvLyBgdmFsdWUudG9TdHJpbmcoKWAsIGl0IG5ldmVyIGNvbnN1bHRzIEJpZ0ludC5wcm90b3R5cGUuXG4gICAgICB0eXBlb2YgdmFsdWUgPT09ICdiaWdpbnQnICYmIFN0cmluZyh2YWx1ZSksXG4gICAgQmlnSW50NjRBcnJheTogKHZhbHVlKSA9PlxuICAgICAgdHlwZXMuaXNCaWdJbnQ2NEFycmF5KHZhbHVlKSAmJiB2aWV3VG9CYXNlNjQodmFsdWUpLFxuICAgIEJpZ1VpbnQ2NEFycmF5OiAodmFsdWUpID0+XG4gICAgICB0eXBlcy5pc0JpZ1VpbnQ2NEFycmF5KHZhbHVlKSAmJiB2aWV3VG9CYXNlNjQodmFsdWUpLFxuICAgIERhdGU6ICh2YWx1ZSkgPT4ge1xuICAgICAgLy8gQnJhbmQgY2hlY2sgKyBjYXB0dXJlZCBpbnRyaW5zaWNzOiBhIHNhbmRib3gtc2lkZSBwYXRjaCBvZlxuICAgICAgLy8gYERhdGUucHJvdG90eXBlLnRvSVNPU3RyaW5nYCAoZS5nLiBhIFRlbXBvcmFsIHBvbHlmaWxsIHdyYXBwaW5nIGl0KVxuICAgICAgLy8gaXMgbmV2ZXIgZXhlY3V0ZWQsIGFuZCBjYW5ub3QgcGVydHVyYiBWTSBzdGF0ZSBkdXJpbmcgc2VyaWFsaXphdGlvbi5cbiAgICAgIGlmICghdHlwZXMuaXNEYXRlKHZhbHVlKSkgcmV0dXJuIGZhbHNlO1xuICAgICAgY29uc3QgdmFsaWQgPSAhTnVtYmVyLmlzTmFOKGRhdGVHZXREYXRlKHZhbHVlKSk7XG4gICAgICByZXR1cm4gdmFsaWQgPyBkYXRlVG9JU09TdHJpbmcodmFsdWUpIDogJy4nO1xuICAgIH0sXG4gICAgLy8gRE9NRXhjZXB0aW9uIGlzIGEgc3BlY2lhbCBjYXNlOiBpdCBgaW5zdGFuY2VvZiBFcnJvcmAgaXMgdHJ1ZSBpbiBOb2RlLFxuICAgIC8vIGJ1dCBgdHlwZXMuaXNOYXRpdmVFcnJvcigpYCByZXR1cm5zIEZBTFNFIGZvciBpdCwgc28gdGhlIGdlbmVyaWMgRXJyb3JcbiAgICAvLyByZWR1Y2VyICh3aGljaCBnYXRlcyBvbiBpc05hdGl2ZUVycm9yKSB3b24ndCBtYXRjaC4gQ2hlY2sgaXQgZXhwbGljaXRseVxuICAgIC8vIGJ5IGNvbnN0cnVjdG9yIG5hbWUgKyBFcnJvciBpbmhlcml0YW5jZSBzbyB3ZSBjYXRjaCBET01FeGNlcHRpb25zIGZyb21cbiAgICAvLyBhbnkgcmVhbG0gKGNyb3NzLVZNIHNhZmV0eTogaW5zdGFuY2VvZiBnbG9iYWwuRE9NRXhjZXB0aW9uIHdvdWxkIGZhaWxcbiAgICAvLyBmb3IgaW5zdGFuY2VzIG1pbnRlZCBpbiBhbm90aGVyIGNvbnRleHQpLlxuICAgIERPTUV4Y2VwdGlvbjogKHZhbHVlKSA9PiB7XG4gICAgICBpZiAodmFsdWUgPT09IG51bGwgfHwgdHlwZW9mIHZhbHVlICE9PSAnb2JqZWN0JykgcmV0dXJuIGZhbHNlO1xuICAgICAgY29uc3QgY3RvciA9IHJlYWRQcm9wZXJ0eSh2YWx1ZSwgJ2NvbnN0cnVjdG9yJyk7XG4gICAgICBpZiAoIWN0b3IgfHwgcmVhZFByb3BlcnR5KGN0b3IsICduYW1lJykgIT09ICdET01FeGNlcHRpb24nKSByZXR1cm4gZmFsc2U7XG4gICAgICBjb25zdCByZWR1Y2VkOiBTZXJpYWxpemFibGVTcGVjaWFsWydET01FeGNlcHRpb24nXSA9IHtcbiAgICAgICAgbWVzc2FnZTogcmVhZFByb3BlcnR5KHZhbHVlLCAnbWVzc2FnZScpIGFzIHN0cmluZyxcbiAgICAgICAgbmFtZTogcmVhZFByb3BlcnR5KHZhbHVlLCAnbmFtZScpIGFzIHN0cmluZyxcbiAgICAgICAgc3RhY2s6IHJlYWRFcnJvclN0YWNrKHZhbHVlKSxcbiAgICAgIH07XG4gICAgICBpZiAoaGFzUHJvcGVydHkodmFsdWUsICdjYXVzZScpKSB7XG4gICAgICAgIHJlZHVjZWQuY2F1c2UgPSByZWFkUHJvcGVydHkodmFsdWUsICdjYXVzZScpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlZHVjZWQ7XG4gICAgfSxcbiAgICAvLyBFcnJvciBzdWJjbGFzcyByZWR1Y2VycyBhcmUgaW50ZW50aW9uYWxseSBwbGFjZWQgYmVmb3JlIHRoZSBiYXNlIEVycm9yXG4gICAgLy8gcmVkdWNlciBiZWNhdXNlIGRldmFsdWUgdXNlcyBmaXJzdC1tYXRjaC13aW5zLiBTdWJjbGFzcy1zcGVjaWZpYyByZWR1Y2Vyc1xuICAgIC8vIG11c3QgYmUgY2hlY2tlZCBmaXJzdCBzbyB0aGF0IGUuZy4gYSBUeXBlRXJyb3IgaXMgc2VyaWFsaXplZCBhcyBcIlR5cGVFcnJvclwiXG4gICAgLy8gcmF0aGVyIHRoYW4gZmFsbGluZyB0aHJvdWdoIHRvIHRoZSBnZW5lcmljIFwiRXJyb3JcIiByZWR1Y2VyLlxuICAgIC8vIFNlZSBgbWFrZUVycm9yU3ViY2xhc3NSZWR1Y2VyYCBmb3IgaW1wbGVtZW50YXRpb24gZGV0YWlscy5cbiAgICBFdmFsRXJyb3I6IG1ha2VFcnJvclN1YmNsYXNzUmVkdWNlcignRXZhbEVycm9yJyksXG4gICAgRmF0YWxFcnJvcjogbWFrZUVycm9yU3ViY2xhc3NSZWR1Y2VyKCdGYXRhbEVycm9yJyksXG4gICAgSG9va0NvbmZsaWN0RXJyb3I6ICh2YWx1ZSkgPT4ge1xuICAgICAgY29uc3QgYmFzZSA9IHJlZHVjZU5hbWVkRXJyb3JTdWJjbGFzc0Jhc2UoJ0hvb2tDb25mbGljdEVycm9yJywgdmFsdWUpO1xuICAgICAgaWYgKCFiYXNlKSByZXR1cm4gZmFsc2U7XG4gICAgICBjb25zdCByZWR1Y2VkOiBTZXJpYWxpemFibGVTcGVjaWFsWydIb29rQ29uZmxpY3RFcnJvciddID0ge1xuICAgICAgICAuLi5iYXNlLFxuICAgICAgICB0b2tlbjogcmVhZFByb3BlcnR5KHZhbHVlLCAndG9rZW4nKSBhcyBIb29rQ29uZmxpY3RFcnJvclsndG9rZW4nXSxcbiAgICAgIH07XG4gICAgICBjb25zdCBjb25mbGljdGluZ1J1bklkID0gcmVhZFByb3BlcnR5KHZhbHVlLCAnY29uZmxpY3RpbmdSdW5JZCcpIGFzXG4gICAgICAgIHwgSG9va0NvbmZsaWN0RXJyb3JbJ2NvbmZsaWN0aW5nUnVuSWQnXVxuICAgICAgICB8IHVuZGVmaW5lZDtcbiAgICAgIGlmIChjb25mbGljdGluZ1J1bklkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmVkdWNlZC5jb25mbGljdGluZ1J1bklkID0gY29uZmxpY3RpbmdSdW5JZDtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZWR1Y2VkO1xuICAgIH0sXG4gICAgUmFuZ2VFcnJvcjogbWFrZUVycm9yU3ViY2xhc3NSZWR1Y2VyKCdSYW5nZUVycm9yJyksXG4gICAgUmVmZXJlbmNlRXJyb3I6IG1ha2VFcnJvclN1YmNsYXNzUmVkdWNlcignUmVmZXJlbmNlRXJyb3InKSxcbiAgICAvLyBSZXRyeWFibGVFcnJvciBjYXJyaWVzIGFuIGV4dHJhIGByZXRyeUFmdGVyYCBEYXRlIHRoYXQgd2Ugc2VyaWFsaXplIGFzXG4gICAgLy8gYSBudW1lcmljIGVwb2NoIHRpbWVzdGFtcC4gVGhlIERhdGUgcmVkdWNlciB1c2VzIGBpbnN0YW5jZW9mIGdsb2JhbC5EYXRlYCxcbiAgICAvLyB3aGljaCBmYWlscyBmb3IgRGF0ZXMgZnJvbSBhIGRpZmZlcmVudCBWTSByZWFsbTsgc2VyaWFsaXppbmcgYXMgYVxuICAgIC8vIG51bWJlciBzaWRlc3RlcHMgdGhhdCBpc3N1ZS5cbiAgICBSZXRyeWFibGVFcnJvcjogKHZhbHVlKSA9PiB7XG4gICAgICBjb25zdCBiYXNlID0gcmVkdWNlTmFtZWRFcnJvclN1YmNsYXNzQmFzZSgnUmV0cnlhYmxlRXJyb3InLCB2YWx1ZSk7XG4gICAgICBpZiAoIWJhc2UpIHJldHVybiBmYWxzZTtcbiAgICAgIGNvbnN0IHJldHJ5QWZ0ZXJSYXcgPSByZWFkUHJvcGVydHkodmFsdWUsICdyZXRyeUFmdGVyJyk7XG4gICAgICBsZXQgcmV0cnlBZnRlcjogbnVtYmVyO1xuICAgICAgaWYgKHR5cGVzLmlzRGF0ZShyZXRyeUFmdGVyUmF3KSkge1xuICAgICAgICAvLyBHZW51aW5lIERhdGUgKGFueSByZWFsbSk6IHJlYWQgdGhlIGVwb2NoIHRocm91Z2ggdGhlIGludHJpbnNpYy5cbiAgICAgICAgY29uc3QgdCA9IGRhdGVHZXRUaW1lKHJldHJ5QWZ0ZXJSYXcpO1xuICAgICAgICByZXRyeUFmdGVyID0gTnVtYmVyLmlzTmFOKHQpID8gRGF0ZS5ub3coKSArIDEwMDAgOiB0O1xuICAgICAgfSBlbHNlIGlmIChyZXRyeUFmdGVyUmF3ICYmIHR5cGVvZiByZXRyeUFmdGVyUmF3ID09PSAnb2JqZWN0Jykge1xuICAgICAgICAvLyBEdWNrLXR5cGVkIGRhdGUtbGlrZTogaW52b2tpbmcgaXRzIGdldFRpbWUoKSBydW5zIHdvcmtmbG93IGNvZGUuXG4gICAgICAgIGNvbnN0IGdldFRpbWUgPSByZWFkUHJvcGVydHkocmV0cnlBZnRlclJhdywgJ2dldFRpbWUnKTtcbiAgICAgICAgaWYgKHR5cGVvZiBnZXRUaW1lID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgcmVjb3JkR3Vlc3RDb2RlKCdtZXRob2QnLCAnZ2V0VGltZScpO1xuICAgICAgICAgIGNvbnN0IHQgPSAoZ2V0VGltZSBhcyAodGhpczogdW5rbm93bikgPT4gbnVtYmVyKS5jYWxsKHJldHJ5QWZ0ZXJSYXcpO1xuICAgICAgICAgIHJldHJ5QWZ0ZXIgPSBOdW1iZXIuaXNOYU4odCkgPyBEYXRlLm5vdygpICsgMTAwMCA6IHQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0cnlBZnRlciA9IERhdGUubm93KCkgKyAxMDAwO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKFxuICAgICAgICB0eXBlb2YgcmV0cnlBZnRlclJhdyA9PT0gJ3N0cmluZycgfHxcbiAgICAgICAgdHlwZW9mIHJldHJ5QWZ0ZXJSYXcgPT09ICdudW1iZXInXG4gICAgICApIHtcbiAgICAgICAgY29uc3QgdCA9IG5ldyBEYXRlKHJldHJ5QWZ0ZXJSYXcpLmdldFRpbWUoKTtcbiAgICAgICAgcmV0cnlBZnRlciA9IE51bWJlci5pc05hTih0KSA/IERhdGUubm93KCkgKyAxMDAwIDogdDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHJ5QWZ0ZXIgPSBEYXRlLm5vdygpICsgMTAwMDtcbiAgICAgIH1cbiAgICAgIHJldHVybiB7XG4gICAgICAgIC4uLmJhc2UsXG4gICAgICAgIHJldHJ5QWZ0ZXIsXG4gICAgICB9IHNhdGlzZmllcyBTZXJpYWxpemFibGVTcGVjaWFsWydSZXRyeWFibGVFcnJvciddO1xuICAgIH0sXG4gICAgLy8gUnVudGltZURlY3J5cHRpb25FcnJvciBjYXJyaWVzIGFuIGV4dHJhIGBjb250ZXh0YCBvYmplY3QgKG9wZXJhdGlvbixcbiAgICAvLyBieXRlTGVuZ3RoLCBmb3JtYXRQcmVmaXgpIHRoYXQgdGhlIGdlbmVyaWMgRXJyb3IgcmVkdWNlciB3b3VsZCBkcm9wLlxuICAgIC8vIFByZXNlcnZlIGl0IHNvIHRoZSBkaWFnbm9zdGljIGRhdGEgc3Vydml2ZXMgdGhlIHJ1bi1lcnJvciByb3VuZCB0cmlwLlxuICAgIFJ1bnRpbWVEZWNyeXB0aW9uRXJyb3I6ICh2YWx1ZSkgPT4ge1xuICAgICAgY29uc3QgYmFzZSA9IHJlZHVjZU5hbWVkRXJyb3JTdWJjbGFzc0Jhc2UoXG4gICAgICAgICdSdW50aW1lRGVjcnlwdGlvbkVycm9yJyxcbiAgICAgICAgdmFsdWVcbiAgICAgICk7XG4gICAgICBpZiAoIWJhc2UpIHJldHVybiBmYWxzZTtcbiAgICAgIGNvbnN0IHJlZHVjZWQ6IFNlcmlhbGl6YWJsZVNwZWNpYWxbJ1J1bnRpbWVEZWNyeXB0aW9uRXJyb3InXSA9IHtcbiAgICAgICAgLi4uYmFzZSxcbiAgICAgIH07XG4gICAgICBjb25zdCBjb250ZXh0ID0gcmVhZFByb3BlcnR5KHZhbHVlLCAnY29udGV4dCcpIGFzXG4gICAgICAgIHwgUnVudGltZURlY3J5cHRpb25FcnJvclsnY29udGV4dCddXG4gICAgICAgIHwgdW5kZWZpbmVkO1xuICAgICAgaWYgKGNvbnRleHQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZWR1Y2VkLmNvbnRleHQgPSBjb250ZXh0O1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlZHVjZWQ7XG4gICAgfSxcbiAgICBTdHJlYW1FcnJvcjogKHZhbHVlKSA9PiB7XG4gICAgICBjb25zdCBiYXNlID0gcmVkdWNlTmFtZWRFcnJvclN1YmNsYXNzQmFzZSgnU3RyZWFtRXJyb3InLCB2YWx1ZSk7XG4gICAgICBpZiAoIWJhc2UpIHJldHVybiBmYWxzZTtcbiAgICAgIGNvbnN0IHJlZHVjZWQ6IFNlcmlhbGl6YWJsZVNwZWNpYWxbJ1N0cmVhbUVycm9yJ10gPSB7IC4uLmJhc2UgfTtcbiAgICAgIGNvbnN0IHN0YXR1cyA9IHJlYWRQcm9wZXJ0eSh2YWx1ZSwgJ3N0YXR1cycpO1xuICAgICAgY29uc3QgdXJsID0gcmVhZFByb3BlcnR5KHZhbHVlLCAndXJsJyk7XG4gICAgICBpZiAodHlwZW9mIHN0YXR1cyA9PT0gJ251bWJlcicpIHJlZHVjZWQuc3RhdHVzID0gc3RhdHVzO1xuICAgICAgaWYgKHR5cGVvZiB1cmwgPT09ICdzdHJpbmcnKSByZWR1Y2VkLnVybCA9IHVybDtcbiAgICAgIHJldHVybiByZWR1Y2VkO1xuICAgIH0sXG4gICAgU3ludGF4RXJyb3I6IG1ha2VFcnJvclN1YmNsYXNzUmVkdWNlcignU3ludGF4RXJyb3InKSxcbiAgICBUeXBlRXJyb3I6IG1ha2VFcnJvclN1YmNsYXNzUmVkdWNlcignVHlwZUVycm9yJyksXG4gICAgVVJJRXJyb3I6IG1ha2VFcnJvclN1YmNsYXNzUmVkdWNlcignVVJJRXJyb3InKSxcbiAgICAvLyBBZ2dyZWdhdGVFcnJvciBpcyBzaW1pbGFyIHRvIG90aGVyIHN1YmNsYXNzZXMgYnV0IGFsc28gcHJlc2VydmVzIHRoZVxuICAgIC8vIGBlcnJvcnNgIGFycmF5LiBXZSBleHRlbmQgdGhlIGJhc2UgaGVscGVyJ3Mgb3V0cHV0IGhlcmUuXG4gICAgQWdncmVnYXRlRXJyb3I6ICh2YWx1ZSkgPT4ge1xuICAgICAgY29uc3QgYmFzZSA9IHJlZHVjZU5hbWVkRXJyb3JTdWJjbGFzc0Jhc2UoJ0FnZ3JlZ2F0ZUVycm9yJywgdmFsdWUpO1xuICAgICAgaWYgKCFiYXNlKSByZXR1cm4gZmFsc2U7XG4gICAgICByZXR1cm4ge1xuICAgICAgICAuLi5iYXNlLFxuICAgICAgICBlcnJvcnM6IHJlYWRQcm9wZXJ0eSh2YWx1ZSwgJ2Vycm9ycycpIGFzIEFnZ3JlZ2F0ZUVycm9yWydlcnJvcnMnXSxcbiAgICAgIH0gc2F0aXNmaWVzIFNlcmlhbGl6YWJsZVNwZWNpYWxbJ0FnZ3JlZ2F0ZUVycm9yJ107XG4gICAgfSxcbiAgICAvLyBCYXNlIEVycm9yIHJlZHVjZXI6IGNhdGNoLWFsbCBmb3IgYW55IEVycm9yIGluc3RhbmNlIG5vdCBtYXRjaGVkIGJ5IGFcbiAgICAvLyBzcGVjaWZpYyBzdWJjbGFzcyByZWR1Y2VyIGFib3ZlIChpbmNsdWRpbmcgdXNlciBFcnJvciBzdWJjbGFzc2VzIHdpdGhvdXRcbiAgICAvLyBXT1JLRkxPV19TRVJJQUxJWkUpLiBQcmVzZXJ2ZXMgYG5hbWVgIHNvIHRoZSBlcnJvcidzIGlkZW50aXR5IGlzIHJldGFpbmVkXG4gICAgLy8gZXZlbiB0aG91Z2ggdGhlIGV4YWN0IGNsYXNzIGNhbm5vdCBiZSByZWNvbnN0cnVjdGVkLlxuICAgIEVycm9yOiAodmFsdWUpID0+IHtcbiAgICAgIGlmICghdHlwZXMuaXNOYXRpdmVFcnJvcih2YWx1ZSkpIHJldHVybiBmYWxzZTtcbiAgICAgIGNvbnN0IHJlZHVjZWQ6IFNlcmlhbGl6YWJsZVNwZWNpYWxbJ0Vycm9yJ10gPSB7XG4gICAgICAgIG5hbWU6IHJlYWRQcm9wZXJ0eSh2YWx1ZSwgJ25hbWUnKSBhcyBzdHJpbmcsXG4gICAgICAgIG1lc3NhZ2U6IHJlYWRQcm9wZXJ0eSh2YWx1ZSwgJ21lc3NhZ2UnKSBhcyBzdHJpbmcsXG4gICAgICAgIHN0YWNrOiByZWFkRXJyb3JTdGFjayh2YWx1ZSksXG4gICAgICB9O1xuICAgICAgaWYgKGhhc1Byb3BlcnR5KHZhbHVlLCAnY2F1c2UnKSkge1xuICAgICAgICByZWR1Y2VkLmNhdXNlID0gcmVhZFByb3BlcnR5KHZhbHVlLCAnY2F1c2UnKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZWR1Y2VkO1xuICAgIH0sXG4gICAgRmxvYXQzMkFycmF5OiAodmFsdWUpID0+IHR5cGVzLmlzRmxvYXQzMkFycmF5KHZhbHVlKSAmJiB2aWV3VG9CYXNlNjQodmFsdWUpLFxuICAgIEZsb2F0NjRBcnJheTogKHZhbHVlKSA9PiB0eXBlcy5pc0Zsb2F0NjRBcnJheSh2YWx1ZSkgJiYgdmlld1RvQmFzZTY0KHZhbHVlKSxcbiAgICAvLyBIZWFkZXJzIGlzIGEgaG9zdCBjbGFzcyBpbmplY3RlZCBpbnRvIHRoZSBzYW5kYm94LCBzbyBpdHMgKHNoYXJlZClcbiAgICAvLyBwcm90b3R5cGUgaXMgcmVhY2hhYmxlIGZyb20gd29ya2Zsb3cgY29kZTsgaXRlcmF0ZSB0aHJvdWdoIHRoZVxuICAgIC8vIGJvb3QtY2FwdHVyZWQgaXRlcmF0b3IgaW5zdGVhZCBvZiBhIGxpdmUgU3ltYm9sLml0ZXJhdG9yIGxvb2t1cC5cbiAgICBIZWFkZXJzOiAodmFsdWUpID0+XG4gICAgICBpc0luc3RhbmNlT2ZQcm90b3R5cGUodmFsdWUsIEhlYWRlcnMucHJvdG90eXBlKSAmJlxuICAgICAgaGVhZGVyc1RvRW50cmllcyh2YWx1ZSBhcyBIZWFkZXJzKSxcbiAgICBJbnQ4QXJyYXk6ICh2YWx1ZSkgPT4gdHlwZXMuaXNJbnQ4QXJyYXkodmFsdWUpICYmIHZpZXdUb0Jhc2U2NCh2YWx1ZSksXG4gICAgSW50MTZBcnJheTogKHZhbHVlKSA9PiB0eXBlcy5pc0ludDE2QXJyYXkodmFsdWUpICYmIHZpZXdUb0Jhc2U2NCh2YWx1ZSksXG4gICAgSW50MzJBcnJheTogKHZhbHVlKSA9PiB0eXBlcy5pc0ludDMyQXJyYXkodmFsdWUpICYmIHZpZXdUb0Jhc2U2NCh2YWx1ZSksXG4gICAgLy8gRW5naW5lIGJyYW5kIGNoZWNrICsgaG9zdC1yZWFsbSBpdGVyYXRpb246IGEgcGF0Y2hlZFxuICAgIC8vIGBNYXAucHJvdG90eXBlW1N5bWJvbC5pdGVyYXRvcl1gIGluIHRoZSBzYW5kYm94IGlzIG5ldmVyIGNvbnN1bHRlZC5cbiAgICBNYXA6ICh2YWx1ZSkgPT5cbiAgICAgIHR5cGVzLmlzTWFwKHZhbHVlKSAmJiBtYXBUb0VudHJpZXModmFsdWUgYXMgTWFwPHVua25vd24sIHVua25vd24+KSxcbiAgICBSZWdFeHA6ICh2YWx1ZSkgPT5cbiAgICAgIHR5cGVzLmlzUmVnRXhwKHZhbHVlKSAmJiB7XG4gICAgICAgIHNvdXJjZTogcmVnRXhwU291cmNlKHZhbHVlKSxcbiAgICAgICAgZmxhZ3M6IHJlZ0V4cEZsYWdzKHZhbHVlKSxcbiAgICAgIH0sXG4gICAgLy8gUmVxdWVzdCBhbmQgUmVzcG9uc2UgYXJlIGludGVudGlvbmFsbHkgTk9UIGluIGNvbW1vbiByZWR1Y2Vycy5cbiAgICAvLyBUaGV5IHJlcXVpcmUgbW9kZS1zcGVjaWZpYyByZXZpdmVycyAoc3RyZWFtIGhhbmRsaW5nLCBldGMuKSBhbmRcbiAgICAvLyBpbmNsdWRpbmcgdGhlbSBoZXJlIHdpdGhvdXQgbWF0Y2hpbmcgcmV2aXZlcnMgd291bGQgY2F1c2UgdGhlbVxuICAgIC8vIHRvIGRlc2VyaWFsaXplIGFzIHBsYWluIG9iamVjdHMuXG4gICAgU2V0OiAodmFsdWUpID0+IHR5cGVzLmlzU2V0KHZhbHVlKSAmJiBzZXRUb1ZhbHVlcyh2YWx1ZSBhcyBTZXQ8dW5rbm93bj4pLFxuICAgIFVSTDogKHZhbHVlKSA9PlxuICAgICAgaXNJbnN0YW5jZU9mUHJvdG90eXBlKHZhbHVlLCBVUkwucHJvdG90eXBlKSAmJiB1cmxIcmVmKHZhbHVlIGFzIFVSTCksXG4gICAgV29ya2Zsb3dGdW5jdGlvbjogKHZhbHVlKSA9PiB7XG4gICAgICAvLyBPbmx5IG1hdGNoIGZ1bmN0aW9uIHJlZmVyZW5jZXMgd2l0aCBhIHdvcmtmbG93SWQgcHJvcGVydHkgKHNldCBieVxuICAgICAgLy8gdGhlIFNXQyBjb21waWxlciBvbiB3b3JrZmxvdyBmdW5jdGlvbnMpLiBQbGFpbiB7IHdvcmtmbG93SWQgfSBvYmplY3RzXG4gICAgICAvLyBhcmUgTk9UIG1hdGNoZWQ7IHRoaXMgcHJldmVudHMgaW5maW5pdGUgcmVjdXJzaW9uIHNpbmNlIHRoZSByZWR1Y2VkXG4gICAgICAvLyBmb3JtIHsgd29ya2Zsb3dJZCB9IGlzIGEgcGxhaW4gb2JqZWN0LCBub3QgYSBmdW5jdGlvbi5cbiAgICAgIGlmICh0eXBlb2YgdmFsdWUgIT09ICdmdW5jdGlvbicpIHJldHVybiBmYWxzZTtcbiAgICAgIGNvbnN0IHdvcmtmbG93SWQgPSByZWFkUHJvcGVydHkodmFsdWUsICd3b3JrZmxvd0lkJyk7XG4gICAgICBpZiAodHlwZW9mIHdvcmtmbG93SWQgIT09ICdzdHJpbmcnKSByZXR1cm4gZmFsc2U7XG4gICAgICByZXR1cm4geyB3b3JrZmxvd0lkIH07XG4gICAgfSxcbiAgICBVUkxTZWFyY2hQYXJhbXM6ICh2YWx1ZSkgPT4ge1xuICAgICAgaWYgKCFpc0luc3RhbmNlT2ZQcm90b3R5cGUodmFsdWUsIFVSTFNlYXJjaFBhcmFtcy5wcm90b3R5cGUpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHRleHQgPSB1cmxTZWFyY2hQYXJhbXNUb1N0cmluZyh2YWx1ZSBhcyBVUkxTZWFyY2hQYXJhbXMpO1xuICAgICAgcmV0dXJuIHRleHQgPT09ICcnID8gJy4nIDogdGV4dDtcbiAgICB9LFxuICAgIFVpbnQ4QXJyYXk6ICh2YWx1ZSkgPT4gdHlwZXMuaXNVaW50OEFycmF5KHZhbHVlKSAmJiB2aWV3VG9CYXNlNjQodmFsdWUpLFxuICAgIFVpbnQ4Q2xhbXBlZEFycmF5OiAodmFsdWUpID0+XG4gICAgICB0eXBlcy5pc1VpbnQ4Q2xhbXBlZEFycmF5KHZhbHVlKSAmJiB2aWV3VG9CYXNlNjQodmFsdWUpLFxuICAgIFVpbnQxNkFycmF5OiAodmFsdWUpID0+IHR5cGVzLmlzVWludDE2QXJyYXkodmFsdWUpICYmIHZpZXdUb0Jhc2U2NCh2YWx1ZSksXG4gICAgVWludDMyQXJyYXk6ICh2YWx1ZSkgPT4gdHlwZXMuaXNVaW50MzJBcnJheSh2YWx1ZSkgJiYgdmlld1RvQmFzZTY0KHZhbHVlKSxcbiAgfTtcbn1cblxuLy8gLS0tLSBSZXZpdmVycyAtLS0tXG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRDb21tb25SZXZpdmVycyhcbiAgZ2xvYmFsOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0gZ2xvYmFsVGhpc1xuKTogUGFydGlhbDxSZXZpdmVycz4ge1xuICByZXR1cm4ge1xuICAgIEFycmF5QnVmZmVyOiAodmFsdWU6IHN0cmluZykgPT4gcmV2aXZlQXJyYXlCdWZmZXIodmFsdWUsIGdsb2JhbCksXG4gICAgQmlnSW50OiAodmFsdWU6IHN0cmluZykgPT4gZ2xvYmFsLkJpZ0ludCh2YWx1ZSksXG4gICAgQmlnSW50NjRBcnJheTogKHZhbHVlOiBzdHJpbmcpID0+XG4gICAgICBuZXcgZ2xvYmFsLkJpZ0ludDY0QXJyYXkocmV2aXZlQXJyYXlCdWZmZXIodmFsdWUsIGdsb2JhbCkpLFxuICAgIEJpZ1VpbnQ2NEFycmF5OiAodmFsdWU6IHN0cmluZykgPT5cbiAgICAgIG5ldyBnbG9iYWwuQmlnVWludDY0QXJyYXkocmV2aXZlQXJyYXlCdWZmZXIodmFsdWUsIGdsb2JhbCkpLFxuICAgIERhdGU6ICh2YWx1ZSkgPT4gbmV3IGdsb2JhbC5EYXRlKHZhbHVlKSxcbiAgICBET01FeGNlcHRpb246ICh2YWx1ZSkgPT4ge1xuICAgICAgY29uc3QgZXJyb3IgPSBuZXcgZ2xvYmFsLkRPTUV4Y2VwdGlvbih2YWx1ZS5tZXNzYWdlLCB2YWx1ZS5uYW1lKTtcbiAgICAgIGlmICh2YWx1ZS5zdGFjayAhPT0gdW5kZWZpbmVkKSBlcnJvci5zdGFjayA9IHZhbHVlLnN0YWNrO1xuICAgICAgLy8gRE9NRXhjZXB0aW9uJ3MgY29uc3RydWN0b3IgZG9lc24ndCBhY2NlcHQgYSBjYXVzZSBvcHRpb24sIHNvXG4gICAgICAvLyB3ZSBzZXQgaXQgbWFudWFsbHkgd2hlbiBwcmVzZW50IGluIHRoZSBzZXJpYWxpemVkIGRhdGEuXG4gICAgICBpZiAoJ2NhdXNlJyBpbiB2YWx1ZSkgZXJyb3IuY2F1c2UgPSB2YWx1ZS5jYXVzZTtcbiAgICAgIHJldHVybiBlcnJvcjtcbiAgICB9LFxuICAgIC8vIEVycm9yIHN1YmNsYXNzIHJldml2ZXJzIHJlY29uc3RydWN0IHRoZSBjb3JyZWN0IGJ1aWx0LWluIEVycm9yIHR5cGUuXG4gICAgLy8gU2VlIGBtYWtlRXJyb3JTdWJjbGFzc1Jldml2ZXJgIGZvciBpbXBsZW1lbnRhdGlvbiBkZXRhaWxzLlxuICAgIEV2YWxFcnJvcjogbWFrZUVycm9yU3ViY2xhc3NSZXZpdmVyKGdsb2JhbCwgJ0V2YWxFcnJvcicpLFxuICAgIC8vIGBGYXRhbEVycm9yYCBhbmQgYFJldHJ5YWJsZUVycm9yYCBhcmUgbm90IGJ1aWx0LWlucywgc28gd2UgcmVzb2x2ZSB0aGVtXG4gICAgLy8gZnJvbSB0aGUgY29uc3VtZXIncyBgZ2xvYmFsVGhpc2AgdmlhIGEgYFN5bWJvbC5mb3IoLi4uKWAga2V5IHJlZ2lzdGVyZWRcbiAgICAvLyBieSBgQHdvcmtmbG93L2Vycm9yc2Agb24gbG9hZC4gVGhpcyBtYWtlcyBgaW5zdGFuY2VvZiBGYXRhbEVycm9yYCB3b3JrXG4gICAgLy8gaW4gdXNlciBjb2RlIHRoYXQgbGl2ZXMgaW4gYSBkaWZmZXJlbnQgcmVhbG0gdGhhbiB0aGlzIHJlZHVjZXIgbW9kdWxlXG4gICAgLy8gKGUuZy4gd2hlbiB0aGUgaG9zdCBoeWRyYXRlcyBhIHZhbHVlIGRlc3RpbmVkIGZvciBhIHdvcmtmbG93IFZNXG4gICAgLy8gY29udGV4dCkuIFNlZSB0aGUgcmVnaXN0cmF0aW9uIGJsb2NrIGF0IHRoZSBib3R0b20gb2ZcbiAgICAvLyBgcGFja2FnZXMvZXJyb3JzL3NyYy9pbmRleC50c2AgZm9yIGRldGFpbHMuIEZhbGxzIGJhY2sgdG8gdGhlIGltcG9ydGVkXG4gICAgLy8gY2xhc3MgZm9yIGVudmlyb25tZW50cyB3aGVyZSBubyBidW5kbGVkIGBAd29ya2Zsb3cvZXJyb3JzYCBoYXMgbG9hZGVkXG4gICAgLy8gaW4gdGhlIGNvbnN1bWVyIHJlYWxtLlxuICAgIEZhdGFsRXJyb3I6ICh2YWx1ZSkgPT4ge1xuICAgICAgY29uc3QgQ3RvciA9XG4gICAgICAgICgoZ2xvYmFsIGFzIFJlY29yZDxzeW1ib2wsIHVua25vd24+KVtcbiAgICAgICAgICBTeW1ib2wuZm9yKCdAd29ya2Zsb3cvZXJyb3JzLy9GYXRhbEVycm9yJylcbiAgICAgICAgXSBhcyB0eXBlb2YgRmF0YWxFcnJvciB8IHVuZGVmaW5lZCkgPz8gRmF0YWxFcnJvcjtcbiAgICAgIGNvbnN0IGVycm9yID0gbmV3IEN0b3IodmFsdWUubWVzc2FnZSk7XG4gICAgICBpZiAodmFsdWUuc3RhY2sgIT09IHVuZGVmaW5lZCkgZXJyb3Iuc3RhY2sgPSB2YWx1ZS5zdGFjaztcbiAgICAgIGlmICgnY2F1c2UnIGluIHZhbHVlKSBlcnJvci5jYXVzZSA9IHZhbHVlLmNhdXNlO1xuICAgICAgcmV0dXJuIGVycm9yO1xuICAgIH0sXG4gICAgSG9va0NvbmZsaWN0RXJyb3I6ICh2YWx1ZSkgPT4ge1xuICAgICAgY29uc3QgQ3RvciA9XG4gICAgICAgICgoZ2xvYmFsIGFzIFJlY29yZDxzeW1ib2wsIHVua25vd24+KVtcbiAgICAgICAgICBTeW1ib2wuZm9yKCdAd29ya2Zsb3cvZXJyb3JzLy9Ib29rQ29uZmxpY3RFcnJvcicpXG4gICAgICAgIF0gYXMgdHlwZW9mIEhvb2tDb25mbGljdEVycm9yIHwgdW5kZWZpbmVkKSA/PyBIb29rQ29uZmxpY3RFcnJvcjtcbiAgICAgIGNvbnN0IGVycm9yID0gbmV3IEN0b3IodmFsdWUudG9rZW4sIHZhbHVlLmNvbmZsaWN0aW5nUnVuSWQpO1xuICAgICAgaWYgKHZhbHVlLnN0YWNrICE9PSB1bmRlZmluZWQpIGVycm9yLnN0YWNrID0gdmFsdWUuc3RhY2s7XG4gICAgICBpZiAoJ2NhdXNlJyBpbiB2YWx1ZSkge1xuICAgICAgICAoZXJyb3IgYXMgRXJyb3IgJiB7IGNhdXNlPzogdW5rbm93biB9KS5jYXVzZSA9IHZhbHVlLmNhdXNlO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGVycm9yO1xuICAgIH0sXG4gICAgUmFuZ2VFcnJvcjogbWFrZUVycm9yU3ViY2xhc3NSZXZpdmVyKGdsb2JhbCwgJ1JhbmdlRXJyb3InKSxcbiAgICBSZWZlcmVuY2VFcnJvcjogbWFrZUVycm9yU3ViY2xhc3NSZXZpdmVyKGdsb2JhbCwgJ1JlZmVyZW5jZUVycm9yJyksXG4gICAgUmV0cnlhYmxlRXJyb3I6ICh2YWx1ZSkgPT4ge1xuICAgICAgLy8gVXNlIHRoZSBjb250ZXh0J3MgYERhdGVgIGNvbnN0cnVjdG9yIChtYXRjaGluZyB0aGUgcmVzdCBvZiB0aGlzXG4gICAgICAvLyBtb2R1bGUpIHNvIHRoZSByZXN1bHRpbmcgYHJldHJ5QWZ0ZXJgIERhdGUgcGFzc2VzIGBpbnN0YW5jZW9mXG4gICAgICAvLyBnbG9iYWwuRGF0ZWAgY2hlY2tzIGluIHRoZSB0YXJnZXQgcmVhbG0uIFNlZSB0aGUgRmF0YWxFcnJvciByZXZpdmVyXG4gICAgICAvLyBhYm92ZSBmb3Igd2h5IHdlIHJlc29sdmUgYFJldHJ5YWJsZUVycm9yYCBmcm9tIHRoZSBjb25zdW1lcidzXG4gICAgICAvLyBnbG9iYWxUaGlzIGluc3RlYWQgb2YgdGhlIGltcG9ydGVkIGNsYXNzLlxuICAgICAgY29uc3QgQ3RvciA9XG4gICAgICAgICgoZ2xvYmFsIGFzIFJlY29yZDxzeW1ib2wsIHVua25vd24+KVtcbiAgICAgICAgICBTeW1ib2wuZm9yKCdAd29ya2Zsb3cvZXJyb3JzLy9SZXRyeWFibGVFcnJvcicpXG4gICAgICAgIF0gYXMgdHlwZW9mIFJldHJ5YWJsZUVycm9yIHwgdW5kZWZpbmVkKSA/PyBSZXRyeWFibGVFcnJvcjtcbiAgICAgIGNvbnN0IGVycm9yID0gbmV3IEN0b3IodmFsdWUubWVzc2FnZSwge1xuICAgICAgICByZXRyeUFmdGVyOiBuZXcgZ2xvYmFsLkRhdGUodmFsdWUucmV0cnlBZnRlciksXG4gICAgICB9KTtcbiAgICAgIGlmICh2YWx1ZS5zdGFjayAhPT0gdW5kZWZpbmVkKSBlcnJvci5zdGFjayA9IHZhbHVlLnN0YWNrO1xuICAgICAgaWYgKCdjYXVzZScgaW4gdmFsdWUpIGVycm9yLmNhdXNlID0gdmFsdWUuY2F1c2U7XG4gICAgICByZXR1cm4gZXJyb3I7XG4gICAgfSxcbiAgICBSdW50aW1lRGVjcnlwdGlvbkVycm9yOiAodmFsdWUpID0+IHtcbiAgICAgIC8vIFJlc29sdmUgZnJvbSB0aGUgY29uc3VtZXIncyBnbG9iYWxUaGlzIChzZWUgdGhlIEZhdGFsRXJyb3IgcmV2aXZlclxuICAgICAgLy8gYWJvdmUpIHNvIGBpbnN0YW5jZW9mIFJ1bnRpbWVEZWNyeXB0aW9uRXJyb3JgIGhvbGRzIGFjcm9zcyByZWFsbXMuXG4gICAgICBjb25zdCBDdG9yID1cbiAgICAgICAgKChnbG9iYWwgYXMgUmVjb3JkPHN5bWJvbCwgdW5rbm93bj4pW1xuICAgICAgICAgIFN5bWJvbC5mb3IoJ0B3b3JrZmxvdy9lcnJvcnMvL1J1bnRpbWVEZWNyeXB0aW9uRXJyb3InKVxuICAgICAgICBdIGFzIHR5cGVvZiBSdW50aW1lRGVjcnlwdGlvbkVycm9yIHwgdW5kZWZpbmVkKSA/P1xuICAgICAgICBSdW50aW1lRGVjcnlwdGlvbkVycm9yO1xuICAgICAgY29uc3Qgb3B0czogQ29uc3RydWN0b3JQYXJhbWV0ZXJzPHR5cGVvZiBSdW50aW1lRGVjcnlwdGlvbkVycm9yPlsxXSA9IHt9O1xuICAgICAgaWYgKCdjYXVzZScgaW4gdmFsdWUpIG9wdHMuY2F1c2UgPSB2YWx1ZS5jYXVzZTtcbiAgICAgIGlmICh2YWx1ZS5jb250ZXh0ICE9PSB1bmRlZmluZWQpIG9wdHMuY29udGV4dCA9IHZhbHVlLmNvbnRleHQ7XG4gICAgICBjb25zdCBlcnJvciA9IG5ldyBDdG9yKHZhbHVlLm1lc3NhZ2UsIG9wdHMpO1xuICAgICAgaWYgKHZhbHVlLnN0YWNrICE9PSB1bmRlZmluZWQpIGVycm9yLnN0YWNrID0gdmFsdWUuc3RhY2s7XG4gICAgICByZXR1cm4gZXJyb3I7XG4gICAgfSxcbiAgICBTdHJlYW1FcnJvcjogKHZhbHVlKSA9PiB7XG4gICAgICBjb25zdCBDdG9yID1cbiAgICAgICAgKChnbG9iYWwgYXMgUmVjb3JkPHN5bWJvbCwgdW5rbm93bj4pW1xuICAgICAgICAgIFN5bWJvbC5mb3IoJ0B3b3JrZmxvdy9lcnJvcnMvL1N0cmVhbUVycm9yJylcbiAgICAgICAgXSBhcyB0eXBlb2YgU3RyZWFtRXJyb3IgfCB1bmRlZmluZWQpID8/IFN0cmVhbUVycm9yO1xuICAgICAgY29uc3QgZXJyb3IgPSBuZXcgQ3Rvcih2YWx1ZS5tZXNzYWdlLCB7XG4gICAgICAgIC4uLignY2F1c2UnIGluIHZhbHVlID8geyBjYXVzZTogdmFsdWUuY2F1c2UgfSA6IHt9KSxcbiAgICAgICAgc3RhdHVzOiB2YWx1ZS5zdGF0dXMsXG4gICAgICAgIHVybDogdmFsdWUudXJsLFxuICAgICAgfSk7XG4gICAgICBpZiAodmFsdWUuc3RhY2sgIT09IHVuZGVmaW5lZCkgZXJyb3Iuc3RhY2sgPSB2YWx1ZS5zdGFjaztcbiAgICAgIHJldHVybiBlcnJvcjtcbiAgICB9LFxuICAgIFN5bnRheEVycm9yOiBtYWtlRXJyb3JTdWJjbGFzc1Jldml2ZXIoZ2xvYmFsLCAnU3ludGF4RXJyb3InKSxcbiAgICBUeXBlRXJyb3I6IG1ha2VFcnJvclN1YmNsYXNzUmV2aXZlcihnbG9iYWwsICdUeXBlRXJyb3InKSxcbiAgICBVUklFcnJvcjogbWFrZUVycm9yU3ViY2xhc3NSZXZpdmVyKGdsb2JhbCwgJ1VSSUVycm9yJyksXG4gICAgQWdncmVnYXRlRXJyb3I6ICh2YWx1ZSkgPT4ge1xuICAgICAgY29uc3Qgb3B0cyA9ICdjYXVzZScgaW4gdmFsdWUgPyB7IGNhdXNlOiB2YWx1ZS5jYXVzZSB9IDogdW5kZWZpbmVkO1xuICAgICAgY29uc3QgZXJyb3IgPSBuZXcgZ2xvYmFsLkFnZ3JlZ2F0ZUVycm9yKFxuICAgICAgICB2YWx1ZS5lcnJvcnMsXG4gICAgICAgIHZhbHVlLm1lc3NhZ2UsXG4gICAgICAgIG9wdHNcbiAgICAgICk7XG4gICAgICBpZiAodmFsdWUuc3RhY2sgIT09IHVuZGVmaW5lZCkgZXJyb3Iuc3RhY2sgPSB2YWx1ZS5zdGFjaztcbiAgICAgIHJldHVybiBlcnJvcjtcbiAgICB9LFxuICAgIC8vIEJhc2UgRXJyb3IgcmV2aXZlcjogdXNlZCBmb3IgcGxhaW4gRXJyb3IgaW5zdGFuY2VzIGFuZCB1bnJlY29nbml6ZWRcbiAgICAvLyBFcnJvciBzdWJjbGFzc2VzLiBQcmVzZXJ2ZXMgYG5hbWVgIHNvIHRoZSBlcnJvcidzIGlkZW50aXR5IGlzIHJldGFpbmVkLlxuICAgIEVycm9yOiAodmFsdWUpID0+IHtcbiAgICAgIGNvbnN0IG9wdHMgPSAnY2F1c2UnIGluIHZhbHVlID8geyBjYXVzZTogdmFsdWUuY2F1c2UgfSA6IHVuZGVmaW5lZDtcbiAgICAgIGNvbnN0IGVycm9yID0gbmV3IGdsb2JhbC5FcnJvcih2YWx1ZS5tZXNzYWdlLCBvcHRzKTtcbiAgICAgIGVycm9yLm5hbWUgPSB2YWx1ZS5uYW1lO1xuICAgICAgaWYgKHZhbHVlLnN0YWNrICE9PSB1bmRlZmluZWQpIGVycm9yLnN0YWNrID0gdmFsdWUuc3RhY2s7XG4gICAgICByZXR1cm4gZXJyb3I7XG4gICAgfSxcbiAgICBGbG9hdDMyQXJyYXk6ICh2YWx1ZTogc3RyaW5nKSA9PlxuICAgICAgbmV3IGdsb2JhbC5GbG9hdDMyQXJyYXkocmV2aXZlQXJyYXlCdWZmZXIodmFsdWUsIGdsb2JhbCkpLFxuICAgIEZsb2F0NjRBcnJheTogKHZhbHVlOiBzdHJpbmcpID0+XG4gICAgICBuZXcgZ2xvYmFsLkZsb2F0NjRBcnJheShyZXZpdmVBcnJheUJ1ZmZlcih2YWx1ZSwgZ2xvYmFsKSksXG4gICAgSGVhZGVyczogKHZhbHVlKSA9PiBuZXcgZ2xvYmFsLkhlYWRlcnModmFsdWUpLFxuICAgIEludDhBcnJheTogKHZhbHVlOiBzdHJpbmcpID0+XG4gICAgICBuZXcgZ2xvYmFsLkludDhBcnJheShyZXZpdmVBcnJheUJ1ZmZlcih2YWx1ZSwgZ2xvYmFsKSksXG4gICAgSW50MTZBcnJheTogKHZhbHVlOiBzdHJpbmcpID0+XG4gICAgICBuZXcgZ2xvYmFsLkludDE2QXJyYXkocmV2aXZlQXJyYXlCdWZmZXIodmFsdWUsIGdsb2JhbCkpLFxuICAgIEludDMyQXJyYXk6ICh2YWx1ZTogc3RyaW5nKSA9PlxuICAgICAgbmV3IGdsb2JhbC5JbnQzMkFycmF5KHJldml2ZUFycmF5QnVmZmVyKHZhbHVlLCBnbG9iYWwpKSxcbiAgICBNYXA6ICh2YWx1ZSkgPT4gbmV3IGdsb2JhbC5NYXAodmFsdWUpLFxuICAgIFJlZ0V4cDogKHZhbHVlKSA9PiBuZXcgZ2xvYmFsLlJlZ0V4cCh2YWx1ZS5zb3VyY2UsIHZhbHVlLmZsYWdzKSxcbiAgICBTZXQ6ICh2YWx1ZSkgPT4gbmV3IGdsb2JhbC5TZXQodmFsdWUpLFxuICAgIFVSTDogKHZhbHVlKSA9PiBuZXcgZ2xvYmFsLlVSTCh2YWx1ZSksXG4gICAgV29ya2Zsb3dGdW5jdGlvbjogKHZhbHVlKSA9PlxuICAgICAgT2JqZWN0LmFzc2lnbihcbiAgICAgICAgKCkgPT4ge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgICdXb3JrZmxvdyBmdW5jdGlvbnMgY2Fubm90IGJlIGNhbGxlZCBkaXJlY3RseS4gVXNlIHN0YXJ0KCkgdG8gaW52b2tlIHRoZW0uJ1xuICAgICAgICAgICk7XG4gICAgICAgIH0sXG4gICAgICAgIHsgd29ya2Zsb3dJZDogdmFsdWUud29ya2Zsb3dJZCB9XG4gICAgICApLFxuICAgIFVSTFNlYXJjaFBhcmFtczogKHZhbHVlKSA9PlxuICAgICAgbmV3IGdsb2JhbC5VUkxTZWFyY2hQYXJhbXModmFsdWUgPT09ICcuJyA/ICcnIDogdmFsdWUpLFxuICAgIFVpbnQ4QXJyYXk6ICh2YWx1ZTogc3RyaW5nKSA9PlxuICAgICAgbmV3IGdsb2JhbC5VaW50OEFycmF5KHJldml2ZUFycmF5QnVmZmVyKHZhbHVlLCBnbG9iYWwpKSxcbiAgICBVaW50OENsYW1wZWRBcnJheTogKHZhbHVlOiBzdHJpbmcpID0+XG4gICAgICBuZXcgZ2xvYmFsLlVpbnQ4Q2xhbXBlZEFycmF5KHJldml2ZUFycmF5QnVmZmVyKHZhbHVlLCBnbG9iYWwpKSxcbiAgICBVaW50MTZBcnJheTogKHZhbHVlOiBzdHJpbmcpID0+XG4gICAgICBuZXcgZ2xvYmFsLlVpbnQxNkFycmF5KHJldml2ZUFycmF5QnVmZmVyKHZhbHVlLCBnbG9iYWwpKSxcbiAgICBVaW50MzJBcnJheTogKHZhbHVlOiBzdHJpbmcpID0+XG4gICAgICBuZXcgZ2xvYmFsLlVpbnQzMkFycmF5KHJldml2ZUFycmF5QnVmZmVyKHZhbHVlLCBnbG9iYWwpKSxcbiAgfTtcbn1cblxuLy8gUmUtZXhwb3J0IGZvciB1c2UgaW4gbGVnYWN5IGNvbXBhdFxuZXhwb3J0IHsgcmV2aXZlIH07XG4iXX0=