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

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 (317) hide show
  1. package/README.md +5 -0
  2. package/dist/attribute-changes.d.ts +5 -0
  3. package/dist/attribute-changes.d.ts.map +1 -0
  4. package/dist/attribute-changes.js +25 -0
  5. package/dist/capabilities.d.ts +35 -2
  6. package/dist/capabilities.d.ts.map +1 -1
  7. package/dist/capabilities.js +74 -5
  8. package/dist/capture-stack.d.ts +1 -1
  9. package/dist/capture-stack.js +2 -2
  10. package/dist/class-serialization.d.ts +32 -0
  11. package/dist/class-serialization.d.ts.map +1 -1
  12. package/dist/class-serialization.js +37 -1
  13. package/dist/classify-error.d.ts +19 -3
  14. package/dist/classify-error.d.ts.map +1 -1
  15. package/dist/classify-error.js +98 -6
  16. package/dist/context-violation-error.d.ts +5 -5
  17. package/dist/context-violation-error.d.ts.map +1 -1
  18. package/dist/context-violation-error.js +8 -6
  19. package/dist/create-hook.d.ts +72 -7
  20. package/dist/create-hook.d.ts.map +1 -1
  21. package/dist/create-hook.js +1 -1
  22. package/dist/define-hook.js +2 -2
  23. package/dist/describe-error.d.ts +7 -7
  24. package/dist/describe-error.d.ts.map +1 -1
  25. package/dist/describe-error.js +97 -12
  26. package/dist/encryption.d.ts +38 -4
  27. package/dist/encryption.d.ts.map +1 -1
  28. package/dist/encryption.js +96 -14
  29. package/dist/events-consumer.d.ts +297 -0
  30. package/dist/events-consumer.d.ts.map +1 -1
  31. package/dist/events-consumer.js +673 -42
  32. package/dist/flushable-stream.d.ts +97 -1
  33. package/dist/flushable-stream.d.ts.map +1 -1
  34. package/dist/flushable-stream.js +291 -11
  35. package/dist/global.d.ts +36 -2
  36. package/dist/global.d.ts.map +1 -1
  37. package/dist/global.js +21 -6
  38. package/dist/index.d.ts +2 -1
  39. package/dist/index.d.ts.map +1 -1
  40. package/dist/index.js +3 -2
  41. package/dist/log-format.d.ts +2 -2
  42. package/dist/log-format.js +19 -12
  43. package/dist/logger.d.ts +1 -0
  44. package/dist/logger.d.ts.map +1 -1
  45. package/dist/logger.js +10 -6
  46. package/dist/private.d.ts +226 -9
  47. package/dist/private.d.ts.map +1 -1
  48. package/dist/private.js +626 -7
  49. package/dist/replay-divergence.d.ts +25 -0
  50. package/dist/replay-divergence.d.ts.map +1 -0
  51. package/dist/replay-divergence.js +61 -0
  52. package/dist/replay-payload-cache.d.ts +64 -0
  53. package/dist/replay-payload-cache.d.ts.map +1 -0
  54. package/dist/replay-payload-cache.js +158 -0
  55. package/dist/runtime/compute-instance.d.ts +13 -0
  56. package/dist/runtime/compute-instance.d.ts.map +1 -0
  57. package/dist/runtime/compute-instance.js +14 -0
  58. package/dist/runtime/constants.d.ts +315 -0
  59. package/dist/runtime/constants.d.ts.map +1 -1
  60. package/dist/runtime/constants.js +502 -16
  61. package/dist/runtime/count-step-started-events.d.ts +52 -0
  62. package/dist/runtime/count-step-started-events.d.ts.map +1 -0
  63. package/dist/runtime/count-step-started-events.js +72 -0
  64. package/dist/runtime/deployment-guard.d.ts +99 -0
  65. package/dist/runtime/deployment-guard.d.ts.map +1 -0
  66. package/dist/runtime/deployment-guard.js +154 -0
  67. package/dist/runtime/get-port-lazy.d.ts +15 -0
  68. package/dist/runtime/get-port-lazy.d.ts.map +1 -1
  69. package/dist/runtime/get-port-lazy.js +75 -6
  70. package/dist/runtime/get-world-lazy.d.ts +5 -14
  71. package/dist/runtime/get-world-lazy.d.ts.map +1 -1
  72. package/dist/runtime/get-world-lazy.js +19 -29
  73. package/dist/runtime/helpers.d.ts +415 -29
  74. package/dist/runtime/helpers.d.ts.map +1 -1
  75. package/dist/runtime/helpers.js +686 -57
  76. package/dist/runtime/quickjs-assets.generated.d.ts +14 -0
  77. package/dist/runtime/quickjs-assets.generated.d.ts.map +1 -0
  78. package/dist/runtime/quickjs-assets.generated.js +30 -0
  79. package/dist/runtime/quickjs-entrypoint.d.ts +158 -0
  80. package/dist/runtime/quickjs-entrypoint.d.ts.map +1 -0
  81. package/dist/runtime/quickjs-entrypoint.js +1863 -0
  82. package/dist/runtime/quickjs-log-view.d.ts +129 -0
  83. package/dist/runtime/quickjs-log-view.d.ts.map +1 -0
  84. package/dist/runtime/quickjs-log-view.js +229 -0
  85. package/dist/runtime/quickjs-runtime.d.ts +244 -0
  86. package/dist/runtime/quickjs-runtime.d.ts.map +1 -0
  87. package/dist/runtime/quickjs-runtime.js +2427 -0
  88. package/dist/runtime/quickjs-serde.d.ts +107 -0
  89. package/dist/runtime/quickjs-serde.d.ts.map +1 -0
  90. package/dist/runtime/quickjs-serde.js +2159 -0
  91. package/dist/runtime/replay-budget.d.ts +97 -0
  92. package/dist/runtime/replay-budget.d.ts.map +1 -0
  93. package/dist/runtime/replay-budget.js +139 -0
  94. package/dist/runtime/replay-recovery-reporter.d.ts +36 -0
  95. package/dist/runtime/replay-recovery-reporter.d.ts.map +1 -0
  96. package/dist/runtime/replay-recovery-reporter.js +64 -0
  97. package/dist/runtime/resume-hook.d.ts +91 -8
  98. package/dist/runtime/resume-hook.d.ts.map +1 -1
  99. package/dist/runtime/resume-hook.js +512 -89
  100. package/dist/runtime/resume-latency.d.ts +150 -0
  101. package/dist/runtime/resume-latency.d.ts.map +1 -0
  102. package/dist/runtime/resume-latency.js +155 -0
  103. package/dist/runtime/run-id-time.d.ts +19 -0
  104. package/dist/runtime/run-id-time.d.ts.map +1 -0
  105. package/dist/runtime/run-id-time.js +42 -0
  106. package/dist/runtime/run.d.ts +72 -7
  107. package/dist/runtime/run.d.ts.map +1 -1
  108. package/dist/runtime/run.js +280 -53
  109. package/dist/runtime/runs.d.ts +54 -3
  110. package/dist/runtime/runs.d.ts.map +1 -1
  111. package/dist/runtime/runs.js +126 -16
  112. package/dist/runtime/start.d.ts +101 -2
  113. package/dist/runtime/start.d.ts.map +1 -1
  114. package/dist/runtime/start.js +352 -61
  115. package/dist/runtime/step-executor.d.ts +186 -5
  116. package/dist/runtime/step-executor.d.ts.map +1 -1
  117. package/dist/runtime/step-executor.js +768 -130
  118. package/dist/runtime/step-latency.d.ts +220 -0
  119. package/dist/runtime/step-latency.d.ts.map +1 -0
  120. package/dist/runtime/step-latency.js +215 -0
  121. package/dist/runtime/step-ownership.d.ts +72 -0
  122. package/dist/runtime/step-ownership.d.ts.map +1 -0
  123. package/dist/runtime/step-ownership.js +114 -0
  124. package/dist/runtime/step-single-flight.d.ts +12 -0
  125. package/dist/runtime/step-single-flight.d.ts.map +1 -0
  126. package/dist/runtime/step-single-flight.js +75 -0
  127. package/dist/runtime/suspension-handler.d.ts +247 -7
  128. package/dist/runtime/suspension-handler.d.ts.map +1 -1
  129. package/dist/runtime/suspension-handler.js +1304 -125
  130. package/dist/runtime/unserializable-step.d.ts +34 -0
  131. package/dist/runtime/unserializable-step.d.ts.map +1 -0
  132. package/dist/runtime/unserializable-step.js +52 -0
  133. package/dist/runtime/vm-mode.d.ts +44 -0
  134. package/dist/runtime/vm-mode.d.ts.map +1 -0
  135. package/dist/runtime/vm-mode.js +62 -0
  136. package/dist/runtime/vm-serde-bundle.generated.d.ts +14 -0
  137. package/dist/runtime/vm-serde-bundle.generated.d.ts.map +1 -0
  138. package/dist/runtime/vm-serde-bundle.generated.js +16 -0
  139. package/dist/runtime/wait-continuation.d.ts +106 -0
  140. package/dist/runtime/wait-continuation.d.ts.map +1 -0
  141. package/dist/runtime/wait-continuation.js +136 -0
  142. package/dist/runtime/wait-until.d.ts +18 -0
  143. package/dist/runtime/wait-until.d.ts.map +1 -0
  144. package/dist/runtime/wait-until.js +42 -0
  145. package/dist/runtime/world-compatibility.d.ts +32 -0
  146. package/dist/runtime/world-compatibility.d.ts.map +1 -0
  147. package/dist/runtime/world-compatibility.js +44 -0
  148. package/dist/runtime/world-init.d.ts +17 -42
  149. package/dist/runtime/world-init.d.ts.map +1 -1
  150. package/dist/runtime/world-init.js +18 -43
  151. package/dist/runtime/world.d.ts +14 -2
  152. package/dist/runtime/world.d.ts.map +1 -1
  153. package/dist/runtime/world.js +75 -19
  154. package/dist/runtime.d.ts +10 -6
  155. package/dist/runtime.d.ts.map +1 -1
  156. package/dist/runtime.js +3911 -489
  157. package/dist/sealed-box.d.ts +167 -0
  158. package/dist/sealed-box.d.ts.map +1 -0
  159. package/dist/sealed-box.js +571 -0
  160. package/dist/serialization/client.d.ts +3 -3
  161. package/dist/serialization/client.d.ts.map +1 -1
  162. package/dist/serialization/client.js +8 -4
  163. package/dist/serialization/codec-devalue-vm.d.ts +16 -0
  164. package/dist/serialization/codec-devalue-vm.d.ts.map +1 -0
  165. package/dist/serialization/codec-devalue-vm.js +148 -0
  166. package/dist/serialization/codec-devalue.d.ts +1 -1
  167. package/dist/serialization/codec-devalue.d.ts.map +1 -1
  168. package/dist/serialization/codec-devalue.js +24 -6
  169. package/dist/serialization/codec.d.ts +37 -2
  170. package/dist/serialization/codec.d.ts.map +1 -1
  171. package/dist/serialization/codec.js +2 -2
  172. package/dist/serialization/compression.d.ts +105 -0
  173. package/dist/serialization/compression.d.ts.map +1 -0
  174. package/dist/serialization/compression.js +261 -0
  175. package/dist/serialization/encryption.d.ts +119 -17
  176. package/dist/serialization/encryption.d.ts.map +1 -1
  177. package/dist/serialization/encryption.js +152 -17
  178. package/dist/serialization/errors.d.ts +13 -0
  179. package/dist/serialization/errors.d.ts.map +1 -1
  180. package/dist/serialization/errors.js +20 -2
  181. package/dist/serialization/format.d.ts +6 -6
  182. package/dist/serialization/format.js +7 -7
  183. package/dist/serialization/hardened.d.ts +156 -0
  184. package/dist/serialization/hardened.d.ts.map +1 -0
  185. package/dist/serialization/hardened.js +538 -0
  186. package/dist/serialization/index.d.ts +10 -8
  187. package/dist/serialization/index.d.ts.map +1 -1
  188. package/dist/serialization/index.js +10 -8
  189. package/dist/serialization/reducers/class-vm.d.ts +20 -0
  190. package/dist/serialization/reducers/class-vm.d.ts.map +1 -0
  191. package/dist/serialization/reducers/class-vm.js +77 -0
  192. package/dist/serialization/reducers/class.d.ts.map +1 -1
  193. package/dist/serialization/reducers/class.js +11 -6
  194. package/dist/serialization/reducers/common-vm.d.ts +15 -0
  195. package/dist/serialization/reducers/common-vm.d.ts.map +1 -0
  196. package/dist/serialization/reducers/common-vm.js +616 -0
  197. package/dist/serialization/reducers/common.d.ts +1 -1
  198. package/dist/serialization/reducers/common.d.ts.map +1 -1
  199. package/dist/serialization/reducers/common.js +202 -62
  200. package/dist/serialization/reducers/step-function-vm.d.ts +44 -0
  201. package/dist/serialization/reducers/step-function-vm.d.ts.map +1 -0
  202. package/dist/serialization/reducers/step-function-vm.js +97 -0
  203. package/dist/serialization/reducers/step-function.d.ts.map +1 -1
  204. package/dist/serialization/reducers/step-function.js +25 -9
  205. package/dist/serialization/step.d.ts +4 -4
  206. package/dist/serialization/step.d.ts.map +1 -1
  207. package/dist/serialization/step.js +9 -5
  208. package/dist/serialization/types.d.ts +80 -1
  209. package/dist/serialization/types.d.ts.map +1 -1
  210. package/dist/serialization/types.js +15 -1
  211. package/dist/serialization/workflow-vm.d.ts +29 -0
  212. package/dist/serialization/workflow-vm.d.ts.map +1 -0
  213. package/dist/serialization/workflow-vm.js +74 -0
  214. package/dist/serialization-format.d.ts +64 -8
  215. package/dist/serialization-format.d.ts.map +1 -1
  216. package/dist/serialization-format.js +225 -73
  217. package/dist/serialization.d.ts +262 -34
  218. package/dist/serialization.d.ts.map +1 -1
  219. package/dist/serialization.js +1885 -277
  220. package/dist/set-attributes.d.ts +13 -0
  221. package/dist/set-attributes.d.ts.map +1 -0
  222. package/dist/set-attributes.js +60 -0
  223. package/dist/source-map.d.ts +25 -0
  224. package/dist/source-map.d.ts.map +1 -1
  225. package/dist/source-map.js +154 -10
  226. package/dist/step/context-storage.d.ts +63 -2
  227. package/dist/step/context-storage.d.ts.map +1 -1
  228. package/dist/step/context-storage.js +7 -5
  229. package/dist/step/writable-stream.d.ts +3 -3
  230. package/dist/step/writable-stream.d.ts.map +1 -1
  231. package/dist/step/writable-stream.js +80 -13
  232. package/dist/step.d.ts.map +1 -1
  233. package/dist/step.js +148 -27
  234. package/dist/symbols.d.ts +50 -0
  235. package/dist/symbols.d.ts.map +1 -1
  236. package/dist/symbols.js +51 -1
  237. package/dist/telemetry/semantic-conventions.d.ts +433 -2
  238. package/dist/telemetry/semantic-conventions.d.ts.map +1 -1
  239. package/dist/telemetry/semantic-conventions.js +319 -3
  240. package/dist/telemetry.d.ts +91 -0
  241. package/dist/telemetry.d.ts.map +1 -1
  242. package/dist/telemetry.js +244 -17
  243. package/dist/test-support/orchestrator-context.d.ts +25 -0
  244. package/dist/test-support/orchestrator-context.d.ts.map +1 -0
  245. package/dist/test-support/orchestrator-context.js +107 -0
  246. package/dist/types.d.ts +6 -0
  247. package/dist/types.d.ts.map +1 -1
  248. package/dist/types.js +23 -1
  249. package/dist/util.d.ts +0 -5
  250. package/dist/util.d.ts.map +1 -1
  251. package/dist/util.js +1 -15
  252. package/dist/version.d.ts +1 -1
  253. package/dist/version.d.ts.map +1 -1
  254. package/dist/version.js +2 -2
  255. package/dist/vm/index.d.ts.map +1 -1
  256. package/dist/vm/index.js +84 -14
  257. package/dist/vm/script-cache.d.ts +26 -0
  258. package/dist/vm/script-cache.d.ts.map +1 -0
  259. package/dist/vm/script-cache.js +131 -0
  260. package/dist/vm/uint8array-base64.js +1 -1
  261. package/dist/workflow/abort-controller.d.ts +2 -2
  262. package/dist/workflow/abort-controller.d.ts.map +1 -1
  263. package/dist/workflow/abort-controller.js +88 -21
  264. package/dist/workflow/attribute-dispatcher.d.ts +6 -0
  265. package/dist/workflow/attribute-dispatcher.d.ts.map +1 -0
  266. package/dist/workflow/attribute-dispatcher.js +45 -0
  267. package/dist/workflow/create-hook.d.ts.map +1 -1
  268. package/dist/workflow/create-hook.js +24 -3
  269. package/dist/workflow/get-workflow-metadata.js +2 -2
  270. package/dist/workflow/hook.d.ts.map +1 -1
  271. package/dist/workflow/hook.js +304 -47
  272. package/dist/workflow/index.d.ts +1 -0
  273. package/dist/workflow/index.d.ts.map +1 -1
  274. package/dist/workflow/index.js +2 -1
  275. package/dist/workflow/set-attributes.d.ts +68 -0
  276. package/dist/workflow/set-attributes.d.ts.map +1 -0
  277. package/dist/workflow/set-attributes.js +60 -0
  278. package/dist/workflow/sleep.d.ts.map +1 -1
  279. package/dist/workflow/sleep.js +58 -12
  280. package/dist/workflow/world-init-stub.d.ts +3 -3
  281. package/dist/workflow/world-init-stub.js +4 -4
  282. package/dist/workflow.d.ts +95 -3
  283. package/dist/workflow.d.ts.map +1 -1
  284. package/dist/workflow.js +900 -561
  285. package/docs/api-reference/create-hook.mdx +89 -10
  286. package/docs/api-reference/create-webhook.mdx +16 -15
  287. package/docs/api-reference/define-hook.mdx +35 -33
  288. package/docs/api-reference/fatal-error.mdx +30 -8
  289. package/docs/api-reference/fetch.mdx +14 -10
  290. package/docs/api-reference/get-step-metadata.mdx +2 -2
  291. package/docs/api-reference/get-workflow-metadata.mdx +3 -3
  292. package/docs/api-reference/get-writable.mdx +7 -7
  293. package/docs/api-reference/index.mdx +4 -1
  294. package/docs/api-reference/retryable-error.mdx +1 -1
  295. package/docs/api-reference/set-attributes.mdx +61 -0
  296. package/docs/api-reference/sleep.mdx +4 -4
  297. package/docs/foundations/cancellation.mdx +31 -32
  298. package/docs/foundations/errors-and-retries.mdx +42 -11
  299. package/docs/foundations/hooks.mdx +64 -35
  300. package/docs/foundations/idempotency.mdx +244 -12
  301. package/docs/foundations/index.mdx +1 -23
  302. package/docs/foundations/meta.json +2 -1
  303. package/docs/foundations/serialization.mdx +21 -22
  304. package/docs/foundations/starting-workflows.mdx +106 -30
  305. package/docs/foundations/streaming.mdx +108 -60
  306. package/docs/foundations/versioning.mdx +263 -0
  307. package/docs/foundations/workflows-and-steps.mdx +9 -9
  308. package/docs/how-it-works/cancellation.mdx +63 -63
  309. package/docs/how-it-works/code-transform.mdx +83 -67
  310. package/docs/how-it-works/encryption.mdx +30 -26
  311. package/docs/how-it-works/event-sourcing.mdx +125 -34
  312. package/docs/how-it-works/framework-integrations.mdx +96 -337
  313. package/docs/how-it-works/understanding-directives.mdx +22 -22
  314. package/package.json +24 -15
  315. package/dist/runtime/step-handler.d.ts +0 -2
  316. package/dist/runtime/step-handler.d.ts.map +0 -1
  317. package/dist/runtime/step-handler.js +0 -776
@@ -0,0 +1,2159 @@
1
+ /**
2
+ * Host-side serialization for the QuickJS engine.
3
+ *
4
+ * Implements the workflow wire codec (format-prefixed devalue, identical to
5
+ * `codec-devalue-vm.ts` / the node:vm engine's workflow-mode codec) as
6
+ * host code operating on `JSValueHandle`s, using devalue 5.9's pluggable
7
+ * operations (quickjs-wasi's host-side introspection primitives underneath).
8
+ * The serde bundle previously evaluated inside the VM is gone: guest values
9
+ * are read and built through handles, so no serializer code lives in (or
10
+ * can be tampered with from) the guest realm.
11
+ *
12
+ * Side-effect discipline mirrors the node:vm engine's hardened codec
13
+ * (serialization/hardened.ts):
14
+ *
15
+ * - classification is by engine brand (`classId` against boot-captured
16
+ * samples, `isError`, `isProxy`), never `instanceof` or
17
+ * `Symbol.toStringTag`;
18
+ * - extraction goes through intrinsics captured at boot (before any user
19
+ * code runs) invoked with explicit receivers, or through own-property
20
+ * descriptor reads, so patched prototypes and inherited accessors never
21
+ * run;
22
+ * - the only guest code serialization can execute is the same code the
23
+ * previous in-VM codec executed by contract: a class's static
24
+ * `WORKFLOW_SERIALIZE` method, a step proxy's `__closureVarsFn`, and
25
+ * `WORKFLOW_USE_STEP` / `WORKFLOW_DESERIALIZE` on revival.
26
+ *
27
+ * Wire-format parity with the previous in-VM codec is REQUIRED and covered
28
+ * by tests: event logs written by either codec must be readable by the
29
+ * other (steps serialized by the node runtime feed VM revival and vice
30
+ * versa).
31
+ *
32
+ * Hybrid value space: reducers return host shapes (plain objects, strings,
33
+ * numbers) whose leaves may be guest handles, exactly how the node:vm
34
+ * codec mixes host shapes with sandbox-realm leaves. Every stringify
35
+ * operation therefore dispatches on `JSValueHandle` and falls back to
36
+ * devalue's default host operations for host values. Parse operations
37
+ * always build guest values, so the parse side is handle-only.
38
+ */
39
+ var __addDisposableResource = (this && this.__addDisposableResource) || function (env, value, async) {
40
+ if (value !== null && value !== void 0) {
41
+ if (typeof value !== "object" && typeof value !== "function") throw new TypeError("Object expected.");
42
+ var dispose, inner;
43
+ if (async) {
44
+ if (!Symbol.asyncDispose) throw new TypeError("Symbol.asyncDispose is not defined.");
45
+ dispose = value[Symbol.asyncDispose];
46
+ }
47
+ if (dispose === void 0) {
48
+ if (!Symbol.dispose) throw new TypeError("Symbol.dispose is not defined.");
49
+ dispose = value[Symbol.dispose];
50
+ if (async) inner = dispose;
51
+ }
52
+ if (typeof dispose !== "function") throw new TypeError("Object not disposable.");
53
+ if (inner) dispose = function() { try { inner.call(this); } catch (e) { return Promise.reject(e); } };
54
+ env.stack.push({ value: value, dispose: dispose, async: async });
55
+ }
56
+ else if (async) {
57
+ env.stack.push({ async: true });
58
+ }
59
+ return value;
60
+ };
61
+ var __disposeResources = (this && this.__disposeResources) || (function (SuppressedError) {
62
+ return function (env) {
63
+ function fail(e) {
64
+ env.error = env.hasError ? new SuppressedError(e, env.error, "An error was suppressed during disposal.") : e;
65
+ env.hasError = true;
66
+ }
67
+ var r, s = 0;
68
+ function next() {
69
+ while (r = env.stack.pop()) {
70
+ try {
71
+ if (!r.async && s === 1) return s = 0, env.stack.push(r), Promise.resolve().then(next);
72
+ if (r.dispose) {
73
+ var result = r.dispose.call(r.value);
74
+ if (r.async) return s |= 2, Promise.resolve(result).then(next, function(e) { fail(e); return next(); });
75
+ }
76
+ else s |= 1;
77
+ }
78
+ catch (e) {
79
+ fail(e);
80
+ }
81
+ }
82
+ if (s === 1) return env.hasError ? Promise.reject(env.error) : Promise.resolve();
83
+ if (env.hasError) throw env.error;
84
+ }
85
+ return next();
86
+ };
87
+ })(typeof SuppressedError === "function" ? SuppressedError : function (error, suppressed, message) {
88
+ var e = new Error(message);
89
+ return e.name = "SuppressedError", e.error = error, e.suppressed = suppressed, e;
90
+ });
91
+ import { defaultStringifyOperations, filterArrayIndices, parse, stringify, } from 'devalue';
92
+ import { JSValueHandle } from 'quickjs-wasi';
93
+ import { SerializationFormat } from '../serialization/types.js';
94
+ const encoder = new TextEncoder();
95
+ const decoder = new TextDecoder();
96
+ const FORMAT_PREFIX_LENGTH = 4;
97
+ const hasNativeBase64 = typeof Uint8Array.fromBase64 === 'function' &&
98
+ typeof Uint8Array.prototype.toBase64 === 'function';
99
+ const hasBuffer = typeof Buffer === 'function';
100
+ function bytesToBase64(bytes) {
101
+ if (bytes.length === 0)
102
+ return '.';
103
+ if (hasNativeBase64) {
104
+ return bytes.toBase64?.();
105
+ }
106
+ if (hasBuffer) {
107
+ return Buffer.from(bytes.buffer, bytes.byteOffset, bytes.byteLength).toString('base64');
108
+ }
109
+ let binary = '';
110
+ for (let idx = 0; idx < bytes.length; idx++) {
111
+ binary += String.fromCharCode(bytes[idx]);
112
+ }
113
+ return btoa(binary);
114
+ }
115
+ function base64ToBytes(value) {
116
+ if (value === '.')
117
+ return new Uint8Array(0);
118
+ if (hasNativeBase64) {
119
+ return Uint8Array.fromBase64?.(value);
120
+ }
121
+ if (hasBuffer) {
122
+ return new Uint8Array(Buffer.from(value, 'base64'));
123
+ }
124
+ const binary = atob(value);
125
+ const bytes = new Uint8Array(binary.length);
126
+ for (let idx = 0; idx < binary.length; idx++) {
127
+ bytes[idx] = binary.charCodeAt(idx);
128
+ }
129
+ return bytes;
130
+ }
131
+ // ---- boot-time captures ----
132
+ /** devalue tags decided by engine class id, sampled at boot. */
133
+ const BRANDED_SAMPLES = `({
134
+ Number: new Number(0),
135
+ String: new String(''),
136
+ Boolean: new Boolean(false),
137
+ BigInt: Object(0n),
138
+ Date: new Date(0),
139
+ RegExp: /x/,
140
+ Array: [],
141
+ Set: new Set(),
142
+ Map: new Map(),
143
+ ArrayBuffer: new ArrayBuffer(0),
144
+ DataView: new DataView(new ArrayBuffer(0)),
145
+ Int8Array: new Int8Array(0),
146
+ Uint8Array: new Uint8Array(0),
147
+ Uint8ClampedArray: new Uint8ClampedArray(0),
148
+ Int16Array: new Int16Array(0),
149
+ Uint16Array: new Uint16Array(0),
150
+ Int32Array: new Int32Array(0),
151
+ Uint32Array: new Uint32Array(0),
152
+ Float32Array: new Float32Array(0),
153
+ Float64Array: new Float64Array(0),
154
+ BigInt64Array: new BigInt64Array(0),
155
+ BigUint64Array: new BigUint64Array(0),
156
+ })`;
157
+ /**
158
+ * Intrinsics needed for reading and building, captured from the guest realm
159
+ * at serde creation (which the runtime does right after evaluating the
160
+ * bootstrap, before the workflow bundle). Held only on the host: later
161
+ * patching inside the VM cannot influence serialization.
162
+ *
163
+ * Globals installed by the extensions/bootstrap (Headers, Request,
164
+ * Response, ReadableStream, WritableStream, URL, URLSearchParams,
165
+ * DOMException, __WorkflowAbortSignal) are captured defensively: absent
166
+ * ones yield `undefined` and their reducers never match, exactly
167
+ * like the old in-VM reducers' `globalThis.X` probes.
168
+ */
169
+ const CAPTURE_INTRINSICS = `(() => {
170
+ const descriptor = (object, key) =>
171
+ Object.getOwnPropertyDescriptor(object, key);
172
+ const getter = (object, key) => {
173
+ const d = descriptor(object, key);
174
+ return d && d.get;
175
+ };
176
+ const TypedArray = Object.getPrototypeOf(Int8Array.prototype);
177
+ const maybeProto = (Cls) => (Cls ? Cls.prototype : undefined);
178
+ const g = globalThis;
179
+
180
+ return {
181
+ // --- reading (stringify) ---
182
+ dateGetTime: Date.prototype.getTime,
183
+ dateToISOString: Date.prototype.toISOString,
184
+ regExpSource: getter(RegExp.prototype, 'source'),
185
+ regExpFlags: getter(RegExp.prototype, 'flags'),
186
+ numberValueOf: Number.prototype.valueOf,
187
+ stringValueOf: String.prototype.valueOf,
188
+ booleanValueOf: Boolean.prototype.valueOf,
189
+ bigIntValueOf: BigInt.prototype.valueOf,
190
+ bigIntToString: BigInt.prototype.toString,
191
+ setForEach: Set.prototype.forEach,
192
+ mapForEach: Map.prototype.forEach,
193
+ headersForEach: g.Headers ? g.Headers.prototype.forEach : undefined,
194
+ urlHref: g.URL ? getter(g.URL.prototype, 'href') : undefined,
195
+ urlSearchParamsToString: g.URLSearchParams
196
+ ? g.URLSearchParams.prototype.toString
197
+ : undefined,
198
+ urlSearchParamsSize: g.URLSearchParams
199
+ ? getter(g.URLSearchParams.prototype, 'size')
200
+ : undefined,
201
+ viewBuffer: getter(TypedArray, 'buffer'),
202
+ viewByteOffset: getter(TypedArray, 'byteOffset'),
203
+ viewByteLength: getter(TypedArray, 'byteLength'),
204
+ viewLength: getter(TypedArray, 'length'),
205
+ dataViewBuffer: getter(DataView.prototype, 'buffer'),
206
+ dataViewByteOffset: getter(DataView.prototype, 'byteOffset'),
207
+ dataViewByteLength: getter(DataView.prototype, 'byteLength'),
208
+ arrayBufferByteLength: getter(ArrayBuffer.prototype, 'byteLength'),
209
+ objectPrototype: Object.prototype,
210
+ errorPrototype: Error.prototype,
211
+ domExceptionPrototype: maybeProto(g.DOMException),
212
+ headersPrototype: maybeProto(g.Headers),
213
+ requestPrototype: maybeProto(g.Request),
214
+ responsePrototype: maybeProto(g.Response),
215
+ readableStreamPrototype: maybeProto(g.ReadableStream),
216
+ writableStreamPrototype: maybeProto(g.WritableStream),
217
+ urlPrototype: maybeProto(g.URL),
218
+ urlSearchParamsPrototype: maybeProto(g.URLSearchParams),
219
+
220
+ // --- building (parse) ---
221
+ Date, RegExp, Set, Map, Array, Object, DataView,
222
+ Int8Array, Uint8Array, Uint8ClampedArray, Int16Array, Uint16Array,
223
+ Int32Array, Uint32Array, Float32Array, Float64Array,
224
+ BigInt64Array, BigUint64Array,
225
+ Error,
226
+ AggregateError: g.AggregateError,
227
+ EvalError, RangeError, ReferenceError, SyntaxError, TypeError, URIError,
228
+ DOMException: g.DOMException,
229
+ Headers: g.Headers,
230
+ Request: g.Request,
231
+ Response: g.Response,
232
+ ReadableStream: g.ReadableStream,
233
+ WritableStream: g.WritableStream,
234
+ URL: g.URL,
235
+ URLSearchParams: g.URLSearchParams,
236
+ setAdd: Set.prototype.add,
237
+ mapSet: Map.prototype.set,
238
+ objectCreate: Object.create,
239
+ defineProperty: Object.defineProperty,
240
+ dateNow: Date.now,
241
+ objectFreeze: Object.freeze,
242
+ functionBind: Function.prototype.bind,
243
+ makeSparseArray: (length) => {
244
+ const array = [];
245
+ array[4294967294] = undefined;
246
+ delete array[4294967294];
247
+ array.length = length;
248
+ return array;
249
+ },
250
+ // Builds the closure-vars thunk a revived step proxy carries. Must be a
251
+ // guest closure (the proxy stores and later calls it from guest code).
252
+ makeThunk: (vars) => () => vars,
253
+ };
254
+ })()`;
255
+ /**
256
+ * Well-known symbols the reducers/revivers read or stamp, captured as guest
257
+ * symbol handles so descriptor reads/writes can be keyed on them.
258
+ */
259
+ const SYMBOL_NAMES = [
260
+ 'WORKFLOW_ABORT_STREAM_NAME',
261
+ 'WORKFLOW_ABORT_HOOK_TOKEN',
262
+ 'BODY_INIT',
263
+ 'WORKFLOW_STREAM_NAME',
264
+ 'WORKFLOW_STREAM_TYPE',
265
+ 'WORKFLOW_STREAM_FRAMING',
266
+ 'WORKFLOW_STREAM_SERVER_RUN_ID',
267
+ 'WORKFLOW_STREAM_SERVER_DEPLOYMENT_ID',
268
+ 'WEBHOOK_RESPONSE_WRITABLE',
269
+ 'WORKFLOW_USE_STEP',
270
+ 'workflow-serialize', // @workflow/serde WORKFLOW_SERIALIZE
271
+ 'workflow-deserialize', // @workflow/serde WORKFLOW_DESERIALIZE
272
+ 'workflow-class-registry',
273
+ '@workflow/errors//FatalError',
274
+ '@workflow/errors//HookConflictError',
275
+ '@workflow/errors//RetryableError',
276
+ '@workflow/errors//RuntimeDecryptionError',
277
+ '@workflow/errors//StreamError',
278
+ ];
279
+ /**
280
+ * The single guest expression that performs EVERY guest-touching part of
281
+ * serde initialization: the intrinsics capture, the branded samples, and
282
+ * the well-known symbol lookups, bundled into one container object.
283
+ *
284
+ * Bundling matters for the baseline-snapshot path: the container is
285
+ * created BEFORE the workflow bundle evaluates (capture-before-user-code,
286
+ * same as the fresh path), its handle's box lives in the snapshot's
287
+ * linear memory, and every restored VM re-adopts it BY POINTER
288
+ * (`adoptSerdeRoot`), so serde initialization executes NO guest code
289
+ * after user code has run. Anything less lets a module-scope wrapper
290
+ * around e.g. `Object.getOwnPropertyDescriptor` observe (and be mutated
291
+ * by) a post-eval capture, diverging fresh and restored replays.
292
+ */
293
+ const CAPTURE_ROOT = `(() => ({
294
+ intrinsics: ${CAPTURE_INTRINSICS},
295
+ samples: ${BRANDED_SAMPLES},
296
+ symbols: {
297
+ ${SYMBOL_NAMES.map((name) => ` ${JSON.stringify(name)}: Symbol.for(${JSON.stringify(name)})`).join(',\n')}
298
+ },
299
+ }))()`;
300
+ /**
301
+ * Evaluate the serde capture root in a VM. Must run after the runtime
302
+ * bootstrap and BEFORE any user code. The returned handle owns the
303
+ * container; on the baseline-snapshot path its raw box pointer
304
+ * (`handle.ptr`) is recorded next to the snapshot and re-adopted per
305
+ * restored VM via {@link adoptSerdeRoot}. Do NOT dispose the handle
306
+ * before the snapshot is taken (the box must stay live in the memory
307
+ * image).
308
+ */
309
+ export function captureSerdeRoot(vm) {
310
+ return vm.evalCode(CAPTURE_ROOT);
311
+ }
312
+ /**
313
+ * Re-create the capture-root handle in a VM restored from a snapshot
314
+ * taken while the exported root was alive, via quickjs-wasi's
315
+ * snapshot-portable handle tokens (`importHandle` duplicates the
316
+ * underlying value: the returned handle is independently owned and the
317
+ * serde disposes it per restored VM). No guest code executes.
318
+ */
319
+ export function adoptSerdeRoot(vm, token) {
320
+ return vm.importHandle(token);
321
+ }
322
+ /**
323
+ * Export the capture root as a snapshot-portable token to record next to
324
+ * the baseline snapshot. The root handle must stay undisposed until the
325
+ * snapshot is taken (its box, and the reference it holds, must be part
326
+ * of the memory image).
327
+ */
328
+ export function exportSerdeRoot(vm, root) {
329
+ return vm.exportHandle(root);
330
+ }
331
+ /**
332
+ * Create the host-side serde for a VM. Must be called after the runtime
333
+ * bootstrap has been evaluated (so bootstrap-installed globals are
334
+ * capturable) and before the workflow bundle runs.
335
+ */
336
+ export function createQuickJSSerde(vm,
337
+ /**
338
+ * Pre-captured serde root (baseline-snapshot path): the container
339
+ * `captureSerdeRoot` created BEFORE user code, re-adopted from the
340
+ * restored memory image via `adoptSerdeRoot`. When omitted, the root
341
+ * is captured now; callers must guarantee no user code has run yet.
342
+ * Either way, initialization below performs only plain-data property
343
+ * reads and C-level classId reads on the container: NO guest code
344
+ * executes here, so nothing user-patchable can observe or perturb it.
345
+ */
346
+ capturedRoot) {
347
+ const disposables = [];
348
+ const keep = (handle) => {
349
+ disposables.push(handle);
350
+ return handle;
351
+ };
352
+ const isHandle = (value) => value instanceof JSValueHandle;
353
+ // --- boot capture ---
354
+ const root = keep(capturedRoot ?? captureSerdeRoot(vm));
355
+ const tagByClassId = new Map();
356
+ {
357
+ const samples = root.getProp('samples');
358
+ try {
359
+ for (const tag of samples.getOwnPropertyNames()) {
360
+ const sample = samples.getProp(tag);
361
+ tagByClassId.set(sample.classId, tag);
362
+ sample.dispose();
363
+ }
364
+ }
365
+ finally {
366
+ samples.dispose();
367
+ }
368
+ }
369
+ const intrinsics = keep(root.getProp('intrinsics'));
370
+ const at = (name) => keep(intrinsics.getProp(name));
371
+ /** Absent captures (extension/bootstrap global not installed). */
372
+ const optional = (name) => {
373
+ const handle = at(name);
374
+ return handle.isUndefined ? undefined : handle;
375
+ };
376
+ const i = {
377
+ dateGetTime: at('dateGetTime'),
378
+ dateToISOString: at('dateToISOString'),
379
+ regExpSource: at('regExpSource'),
380
+ regExpFlags: at('regExpFlags'),
381
+ numberValueOf: at('numberValueOf'),
382
+ stringValueOf: at('stringValueOf'),
383
+ booleanValueOf: at('booleanValueOf'),
384
+ bigIntValueOf: at('bigIntValueOf'),
385
+ bigIntToString: at('bigIntToString'),
386
+ setForEach: at('setForEach'),
387
+ mapForEach: at('mapForEach'),
388
+ headersForEach: optional('headersForEach'),
389
+ urlHref: optional('urlHref'),
390
+ urlSearchParamsToString: optional('urlSearchParamsToString'),
391
+ urlSearchParamsSize: optional('urlSearchParamsSize'),
392
+ viewBuffer: at('viewBuffer'),
393
+ viewByteOffset: at('viewByteOffset'),
394
+ viewByteLength: at('viewByteLength'),
395
+ viewLength: at('viewLength'),
396
+ dataViewBuffer: at('dataViewBuffer'),
397
+ dataViewByteOffset: at('dataViewByteOffset'),
398
+ dataViewByteLength: at('dataViewByteLength'),
399
+ arrayBufferByteLength: at('arrayBufferByteLength'),
400
+ objectPrototype: at('objectPrototype'),
401
+ errorPrototype: at('errorPrototype'),
402
+ domExceptionPrototype: optional('domExceptionPrototype'),
403
+ headersPrototype: optional('headersPrototype'),
404
+ requestPrototype: optional('requestPrototype'),
405
+ responsePrototype: optional('responsePrototype'),
406
+ readableStreamPrototype: optional('readableStreamPrototype'),
407
+ writableStreamPrototype: optional('writableStreamPrototype'),
408
+ urlPrototype: optional('urlPrototype'),
409
+ urlSearchParamsPrototype: optional('urlSearchParamsPrototype'),
410
+ Date: at('Date'),
411
+ RegExp: at('RegExp'),
412
+ Set: at('Set'),
413
+ Map: at('Map'),
414
+ Array: at('Array'),
415
+ Object: at('Object'),
416
+ Error: at('Error'),
417
+ AggregateError: optional('AggregateError'),
418
+ DOMException: optional('DOMException'),
419
+ Headers: optional('Headers'),
420
+ ReadableStream: optional('ReadableStream'),
421
+ WritableStream: optional('WritableStream'),
422
+ URL: optional('URL'),
423
+ URLSearchParams: optional('URLSearchParams'),
424
+ setAdd: at('setAdd'),
425
+ mapSet: at('mapSet'),
426
+ objectCreate: at('objectCreate'),
427
+ defineProperty: at('defineProperty'),
428
+ dateNow: at('dateNow'),
429
+ objectFreeze: at('objectFreeze'),
430
+ functionBind: at('functionBind'),
431
+ makeSparseArray: at('makeSparseArray'),
432
+ makeThunk: at('makeThunk'),
433
+ };
434
+ const errorConstructors = new Map();
435
+ for (const name of [
436
+ 'EvalError',
437
+ 'RangeError',
438
+ 'ReferenceError',
439
+ 'SyntaxError',
440
+ 'TypeError',
441
+ 'URIError',
442
+ ]) {
443
+ errorConstructors.set(name, at(name));
444
+ }
445
+ const typedArrayConstructors = new Map();
446
+ for (const name of [
447
+ 'Int8Array',
448
+ 'Uint8Array',
449
+ 'Uint8ClampedArray',
450
+ 'Int16Array',
451
+ 'Uint16Array',
452
+ 'Int32Array',
453
+ 'Uint32Array',
454
+ 'Float32Array',
455
+ 'Float64Array',
456
+ 'BigInt64Array',
457
+ 'BigUint64Array',
458
+ 'DataView',
459
+ ]) {
460
+ typedArrayConstructors.set(name, at(name));
461
+ }
462
+ const symbols = new Map();
463
+ {
464
+ const env_1 = { stack: [], error: void 0, hasError: false };
465
+ try {
466
+ const symbolsContainer = __addDisposableResource(env_1, root.getProp('symbols'), false);
467
+ for (const name of SYMBOL_NAMES) {
468
+ symbols.set(name, keep(symbolsContainer.getProp(name)));
469
+ }
470
+ }
471
+ catch (e_1) {
472
+ env_1.error = e_1;
473
+ env_1.hasError = true;
474
+ }
475
+ finally {
476
+ __disposeResources(env_1);
477
+ }
478
+ }
479
+ const sym = (name) => {
480
+ const handle = symbols.get(name);
481
+ if (!handle)
482
+ throw new Error(`unknown captured symbol: ${name}`);
483
+ return handle;
484
+ };
485
+ // --- handle helpers ---
486
+ const call = (fn, thisValue, ...args) => vm.callFunction(fn, thisValue, ...args);
487
+ const invoke = (fn, ...args) => vm.callFunction(fn, vm.undefined, ...args);
488
+ /**
489
+ * Guest own-property check through the handle's introspection method.
490
+ * MUST NOT be replaced with `Object.hasOwn`, which would interrogate the
491
+ * host JSValueHandle wrapper object (always false) instead of the guest
492
+ * value; biome's noPrototypeBuiltins auto-fix does exactly that, which
493
+ * is why this is centralized here with the suppression.
494
+ */
495
+ const guestHasOwn = (handle, key) =>
496
+ // biome-ignore lint/suspicious/noPrototypeBuiltins: JSValueHandle.hasOwnProperty is quickjs-wasi's guest-side introspection API, not Object.prototype.hasOwnProperty
497
+ handle.hasOwnProperty(key);
498
+ /**
499
+ * Own data-property read. Returns undefined for absent properties AND for
500
+ * accessor properties: an inherited or own getter is never invoked
501
+ * (matching the hardened node:vm codec's descriptor-based reads).
502
+ */
503
+ const own = (target, key) => {
504
+ const descriptor = target.getOwnPropertyDescriptor(key);
505
+ if (!descriptor)
506
+ return undefined;
507
+ descriptor.get?.dispose();
508
+ descriptor.set?.dispose();
509
+ return descriptor.value;
510
+ };
511
+ /**
512
+ * Data-property read following the prototype chain (the safe analogue of
513
+ * `value.name` on an Error instance, where `name`/`message` live on the
514
+ * prototype). Accessors anywhere on the chain are skipped, not invoked.
515
+ */
516
+ const chained = (target, key) => {
517
+ let current;
518
+ let owned = false; // whether `current` is ours to dispose
519
+ let cursor = target;
520
+ for (let depth = 0; depth < 32; depth++) {
521
+ const found = own(cursor, key);
522
+ if (found) {
523
+ if (owned)
524
+ cursor.dispose();
525
+ return found;
526
+ }
527
+ const proto = cursor.getPrototypeOf();
528
+ if (owned)
529
+ cursor.dispose();
530
+ if (proto.isNull || proto.isUndefined) {
531
+ proto.dispose();
532
+ return undefined;
533
+ }
534
+ cursor = proto;
535
+ owned = true;
536
+ current = proto;
537
+ }
538
+ if (owned && current)
539
+ current.dispose();
540
+ return undefined;
541
+ };
542
+ /** Host string from a data property (own-or-chain), or undefined. */
543
+ const chainedString = (target, key) => {
544
+ const handle = chained(target, key);
545
+ if (!handle)
546
+ return undefined;
547
+ const result = handle.isString ? handle.toString() : undefined;
548
+ handle.dispose();
549
+ return result;
550
+ };
551
+ const ownString = (target, key) => {
552
+ const handle = own(target, key);
553
+ if (!handle)
554
+ return undefined;
555
+ const result = handle.isString ? handle.toString() : undefined;
556
+ handle.dispose();
557
+ return result;
558
+ };
559
+ /**
560
+ * Whether `handle` has `prototypeHandle` anywhere on its prototype chain:
561
+ * the trap-free analogue of `instanceof` (which would fire
562
+ * `Symbol.hasInstance`).
563
+ */
564
+ const hasPrototype = (handle, prototypeHandle) => {
565
+ if (!prototypeHandle)
566
+ return false;
567
+ let cursor = handle.getPrototypeOf();
568
+ for (let depth = 0; depth < 32; depth++) {
569
+ if (cursor.isNull || cursor.isUndefined) {
570
+ cursor.dispose();
571
+ return false;
572
+ }
573
+ if (cursor.identity === prototypeHandle.identity) {
574
+ cursor.dispose();
575
+ return true;
576
+ }
577
+ const next = cursor.getPrototypeOf();
578
+ cursor.dispose();
579
+ cursor = next;
580
+ }
581
+ cursor.dispose();
582
+ return false;
583
+ };
584
+ /** `Object.defineProperty` write, immune to inherited setters. */
585
+ const define = (target, key, value) => {
586
+ const descriptor = vm.newObject();
587
+ try {
588
+ descriptor.setProp('value', value);
589
+ descriptor.setProp('writable', vm.true);
590
+ descriptor.setProp('enumerable', vm.true);
591
+ descriptor.setProp('configurable', vm.true);
592
+ if (typeof key === 'string') {
593
+ const keyHandle = vm.newString(key);
594
+ try {
595
+ call(i.defineProperty, vm.undefined, target, keyHandle, descriptor).dispose();
596
+ }
597
+ finally {
598
+ keyHandle.dispose();
599
+ }
600
+ }
601
+ else {
602
+ call(i.defineProperty, vm.undefined, target, key, descriptor).dispose();
603
+ }
604
+ }
605
+ finally {
606
+ descriptor.dispose();
607
+ }
608
+ };
609
+ const newGuestString = (value) => vm.newString(value);
610
+ /** Collect Set values / Map entries via captured forEach. */
611
+ const collect = (forEach, collection, arity) => {
612
+ const collected = [];
613
+ const visitor = vm.newEphemeralFunction((value, key) => {
614
+ // dup(): the visitor's own arg handles are borrowed (C-owned,
615
+ // scope-exempt as of quickjs-wasi 3.3.1); the dups are owned
616
+ // references, scope-tracked and swept at the pass boundary.
617
+ collected.push(arity === 1 ? value.dup() : [key.dup(), value.dup()]);
618
+ return vm.undefined;
619
+ });
620
+ try {
621
+ call(forEach, collection, visitor).dispose();
622
+ }
623
+ finally {
624
+ visitor.dispose();
625
+ }
626
+ return collected;
627
+ };
628
+ /** Copy a typed array / DataView's viewed bytes to the host. */
629
+ const viewBytes = (handle) => {
630
+ const isDataView = handle.isDataView;
631
+ const buffer = call(isDataView ? i.dataViewBuffer : i.viewBuffer, handle);
632
+ try {
633
+ const byteOffset = call(isDataView ? i.dataViewByteOffset : i.viewByteOffset, handle).consume((h) => h.toNumber());
634
+ const byteLength = call(isDataView ? i.dataViewByteLength : i.viewByteLength, handle).consume((h) => h.toNumber());
635
+ const bytes = new Uint8Array(buffer.toArrayBuffer());
636
+ return bytes.subarray(byteOffset, byteOffset + byteLength);
637
+ }
638
+ finally {
639
+ buffer.dispose();
640
+ }
641
+ };
642
+ const tagOfHandle = (handle) => {
643
+ if (handle.isProxy)
644
+ return 'Object';
645
+ return tagByClassId.get(handle.classId) ?? 'Object';
646
+ };
647
+ // --- identity ---
648
+ const identities = new Map();
649
+ const identityOf = (pointer) => {
650
+ let identity = identities.get(pointer);
651
+ if (!identity) {
652
+ identity = { pointer };
653
+ identities.set(pointer, identity);
654
+ }
655
+ return identity;
656
+ };
657
+ const primitiveOf = (handle) => {
658
+ if (handle.isUndefined)
659
+ return undefined;
660
+ if (handle.isNull)
661
+ return null;
662
+ if (handle.isBool)
663
+ return handle.toBoolean();
664
+ if (handle.isNumber)
665
+ return handle.toNumber();
666
+ if (handle.isBigInt)
667
+ return guestBigInt(handle);
668
+ return handle.toString();
669
+ };
670
+ /**
671
+ * Extract a guest bigint via the captured `BigInt.prototype.toString`,
672
+ * since `handle.toBigInt()` truncates to 64 bits.
673
+ */
674
+ const guestBigInt = (handle) => BigInt(call(i.bigIntToString, handle).consume((h) => h.toString()));
675
+ // --- hybrid stringify operations ---
676
+ // Handles take the introspection path; host values (reducer outputs)
677
+ // fall back to devalue's defaults.
678
+ const d = defaultStringifyOperations;
679
+ const stringifyOperations = {
680
+ identify: (value) => {
681
+ if (!isHandle(value))
682
+ return d.identify(value);
683
+ const pointer = value.identity;
684
+ if (pointer === 0 || value.isString)
685
+ return primitiveOf(value);
686
+ return identityOf(pointer);
687
+ },
688
+ typeOf: (value) => {
689
+ if (!isHandle(value))
690
+ return d.typeOf(value);
691
+ if (value.isNull)
692
+ return 'null';
693
+ return value.typeof;
694
+ },
695
+ toPrimitive: (value) => (isHandle(value) ? primitiveOf(value) : value),
696
+ tagOf: (value) => (isHandle(value) ? tagOfHandle(value) : d.tagOf(value)),
697
+ isThenable: (value) => isHandle(value) ? value.isPromise : d.isThenable(value),
698
+ toPromise: async (value) => {
699
+ if (!isHandle(value))
700
+ return d.toPromise(value);
701
+ const settled = await vm.resolvePromise(value);
702
+ if ('error' in settled)
703
+ throw settled.error;
704
+ return settled.value;
705
+ },
706
+ unbox: (value) => {
707
+ if (!isHandle(value))
708
+ return d.unbox(value);
709
+ switch (tagOfHandle(value)) {
710
+ case 'Number':
711
+ return call(i.numberValueOf, value);
712
+ case 'String':
713
+ return call(i.stringValueOf, value);
714
+ case 'Boolean':
715
+ return call(i.booleanValueOf, value);
716
+ default:
717
+ return call(i.bigIntValueOf, value);
718
+ }
719
+ },
720
+ toISOString: (value) => {
721
+ if (!isHandle(value))
722
+ return d.toISOString(value);
723
+ if (Number.isNaN(call(i.dateGetTime, value).consume((h) => h.toNumber()))) {
724
+ return '';
725
+ }
726
+ return call(i.dateToISOString, value).consume((h) => h.toString());
727
+ },
728
+ toStringValue: (value) => {
729
+ if (!isHandle(value))
730
+ return d.toStringValue(value);
731
+ // URL / URLSearchParams are matched by workflow reducers before
732
+ // devalue's native handling, and Temporal doesn't exist in the VM, so
733
+ // this is unreachable in practice. Refuse rather than invoke guest
734
+ // `toString`.
735
+ throw new Error(`no captured string conversion for ${tagOfHandle(value)} in the VM`);
736
+ },
737
+ regExpInfo: (value) => {
738
+ if (!isHandle(value))
739
+ return d.regExpInfo(value);
740
+ return {
741
+ source: call(i.regExpSource, value).consume((h) => h.toString()),
742
+ flags: call(i.regExpFlags, value).consume((h) => h.toString()),
743
+ };
744
+ },
745
+ valuesOf: (value) => isHandle(value) ? collect(i.setForEach, value, 1) : d.valuesOf(value),
746
+ entriesOf: (value) => isHandle(value)
747
+ ? collect(i.mapForEach, value, 2)
748
+ : d.entriesOf(value),
749
+ viewInfo: (value) => {
750
+ if (!isHandle(value))
751
+ return d.viewInfo(value);
752
+ const isDataView = value.isDataView;
753
+ const buffer = call(isDataView ? i.dataViewBuffer : i.viewBuffer, value);
754
+ const info = {
755
+ buffer,
756
+ byteOffset: call(isDataView ? i.dataViewByteOffset : i.viewByteOffset, value).consume((h) => h.toNumber()),
757
+ byteLength: call(isDataView ? i.dataViewByteLength : i.viewByteLength, value).consume((h) => h.toNumber()),
758
+ bufferByteLength: call(i.arrayBufferByteLength, buffer).consume((h) => h.toNumber()),
759
+ length: 0,
760
+ };
761
+ if (!isDataView) {
762
+ info.length = call(i.viewLength, value).consume((h) => h.toNumber());
763
+ }
764
+ return info;
765
+ },
766
+ toArrayBuffer: (value) => isHandle(value) ? value.toArrayBuffer() : d.toArrayBuffer(value),
767
+ lengthOf: (value) => {
768
+ if (!isHandle(value))
769
+ return d.lengthOf(value);
770
+ const length = own(value, 'length');
771
+ return length?.consume((h) => h.toNumber()) ?? 0;
772
+ },
773
+ hasOwn: (value, key) => isHandle(value) ? guestHasOwn(value, String(key)) : d.hasOwn(value, key),
774
+ indicesOf: (value) => isHandle(value) ? filterArrayIndices(value.keys()) : d.indicesOf(value),
775
+ shapeOf: (value) => {
776
+ if (!isHandle(value))
777
+ return d.shapeOf(value);
778
+ if (value.isProxy)
779
+ return { kind: 'not-plain' };
780
+ const prototype = value.getPrototypeOf();
781
+ try {
782
+ const isPlain = prototype.isNull || prototype.identity === i.objectPrototype.identity;
783
+ if (!isPlain)
784
+ return { kind: 'not-plain' };
785
+ const keys = [];
786
+ for (const key of value.getOwnPropertyKeys()) {
787
+ if (typeof key !== 'string') {
788
+ const enumerable = value.getOwnPropertyDescriptor(key)?.enumerable ?? false;
789
+ key.dispose();
790
+ if (enumerable)
791
+ return { kind: 'symbol-keys' };
792
+ continue;
793
+ }
794
+ if (value.propertyIsEnumerable(key))
795
+ keys.push(key);
796
+ }
797
+ return {
798
+ kind: prototype.isNull ? 'null-proto' : 'plain',
799
+ keys,
800
+ };
801
+ }
802
+ finally {
803
+ prototype.dispose();
804
+ }
805
+ },
806
+ get: (value, key) => {
807
+ if (!isHandle(value))
808
+ return d.get(value, key);
809
+ const descriptor = value.getOwnPropertyDescriptor(String(key));
810
+ if (!descriptor)
811
+ return undefined;
812
+ if (descriptor.get) {
813
+ // Parity with the hardened node:vm codec: getters are invoked (full
814
+ // compatibility with values whose shape depends on accessors), the
815
+ // difference from `[[Get]]` being that this is an explicit, single
816
+ // invocation of the accessor the descriptor names.
817
+ const result = call(descriptor.get, value);
818
+ descriptor.get.dispose();
819
+ descriptor.set?.dispose();
820
+ return result;
821
+ }
822
+ descriptor.set?.dispose();
823
+ return descriptor.value;
824
+ },
825
+ };
826
+ // --- workflow reducers (handle space) ---
827
+ /** Host shape for error-family reduction; leaves may be handles. */
828
+ const reduceErrorShape = (value) => {
829
+ const shape = {
830
+ message: chainedString(value, 'message') ?? '',
831
+ };
832
+ const stack = chainedString(value, 'stack');
833
+ if (stack !== undefined)
834
+ shape.stack = stack;
835
+ if (guestHasOwn(value, 'cause')) {
836
+ shape.cause = own(value, 'cause') ?? undefined;
837
+ }
838
+ return shape;
839
+ };
840
+ const namedErrorSubclassReducer = (subclassName) => (value) => {
841
+ if (!isHandle(value) || !value.isError)
842
+ return false;
843
+ if (chainedString(value, 'name') !== subclassName)
844
+ return false;
845
+ return reduceErrorShape(value);
846
+ };
847
+ /** Own symbol-keyed data read returning a host string, or undefined. */
848
+ const ownSymbolString = (value, name) => {
849
+ const handle = own(value, sym(name));
850
+ if (!handle)
851
+ return undefined;
852
+ const result = handle.isString ? handle.toString() : undefined;
853
+ handle.dispose();
854
+ return result;
855
+ };
856
+ const reduceAbort = (value) => {
857
+ // streamName/hookToken live on the signal (or the controller's signal).
858
+ const signal = own(value, 'signal');
859
+ const holder = signal ?? value;
860
+ const streamName = ownSymbolString(value, 'WORKFLOW_ABORT_STREAM_NAME') ??
861
+ ownSymbolString(holder, 'WORKFLOW_ABORT_STREAM_NAME');
862
+ const hookToken = ownSymbolString(value, 'WORKFLOW_ABORT_HOOK_TOKEN') ??
863
+ ownSymbolString(holder, 'WORKFLOW_ABORT_HOOK_TOKEN');
864
+ if (!streamName) {
865
+ signal?.dispose();
866
+ throw new Error('AbortController/AbortSignal stream name is not set');
867
+ }
868
+ const aborted = own(holder, 'aborted')?.consume((h) => h.toBoolean()) ?? false;
869
+ const reason = aborted ? own(holder, 'reason') : undefined;
870
+ if (signal && holder !== value)
871
+ signal.dispose();
872
+ return {
873
+ streamName,
874
+ hookToken,
875
+ aborted,
876
+ reason: aborted ? reason : undefined,
877
+ };
878
+ };
879
+ const reducers = {
880
+ // Order is wire-significant (first match wins) and mirrors
881
+ // codec-devalue-vm.ts getReducersForMode('workflow') exactly.
882
+ AbortController: (value) => {
883
+ if (!isHandle(value) || value.typeof !== 'object' || value.isNull) {
884
+ return false;
885
+ }
886
+ if (!guestHasOwn(value, 'signal'))
887
+ return false;
888
+ const hasStamp = ownSymbolString(value, 'WORKFLOW_ABORT_STREAM_NAME') !== undefined ||
889
+ own(value, 'signal')?.consume((signal) => ownSymbolString(signal, 'WORKFLOW_ABORT_STREAM_NAME') !== undefined);
890
+ if (!hasStamp)
891
+ return false;
892
+ return reduceAbort(value);
893
+ },
894
+ AbortSignal: (value) => {
895
+ if (!isHandle(value) || value.typeof !== 'object' || value.isNull) {
896
+ return false;
897
+ }
898
+ if (ownSymbolString(value, 'WORKFLOW_ABORT_STREAM_NAME') === undefined) {
899
+ return false;
900
+ }
901
+ return reduceAbort(value);
902
+ },
903
+ Class: (value) => {
904
+ if (!isHandle(value) || value.typeof !== 'function')
905
+ return false;
906
+ const classId = ownString(value, 'classId');
907
+ if (classId === undefined)
908
+ return false;
909
+ return { classId };
910
+ },
911
+ Instance: (value) => {
912
+ if (!isHandle(value) || value.typeof !== 'object' || value.isNull) {
913
+ return false;
914
+ }
915
+ const cls = chained(value, 'constructor');
916
+ if (!cls || cls.typeof !== 'function') {
917
+ cls?.dispose();
918
+ return false;
919
+ }
920
+ try {
921
+ const serializeMethod = chained(cls, sym('workflow-serialize'));
922
+ if (!serializeMethod || serializeMethod.typeof !== 'function') {
923
+ serializeMethod?.dispose();
924
+ return false;
925
+ }
926
+ try {
927
+ const classId = chainedString(cls, 'classId');
928
+ if (classId === undefined) {
929
+ const name = chainedString(cls, 'name') ?? '<anonymous>';
930
+ throw new Error(`Class "${name}" with Symbol(workflow-serialize) must have a static "classId" property.`);
931
+ }
932
+ // Guest code by contract: the class's own serializer runs, exactly
933
+ // as it did under the in-VM codec.
934
+ const data = call(serializeMethod, cls, value);
935
+ return { classId, data };
936
+ }
937
+ finally {
938
+ serializeMethod.dispose();
939
+ }
940
+ }
941
+ finally {
942
+ cls.dispose();
943
+ }
944
+ },
945
+ StepFunction: (value) => {
946
+ if (!isHandle(value) || value.typeof !== 'function')
947
+ return false;
948
+ const stepId = ownString(value, 'stepId');
949
+ if (stepId === undefined)
950
+ return false;
951
+ const payload = { stepId };
952
+ const closureVarsFn = own(value, '__closureVarsFn');
953
+ if (closureVarsFn) {
954
+ if (closureVarsFn.typeof === 'function') {
955
+ // Guest code by contract (same as the in-VM codec).
956
+ const closureVars = call(closureVarsFn, vm.undefined);
957
+ if (!closureVars.isUndefined)
958
+ payload.closureVars = closureVars;
959
+ else
960
+ closureVars.dispose();
961
+ }
962
+ closureVarsFn.dispose();
963
+ }
964
+ if (guestHasOwn(value, '__boundThis')) {
965
+ payload.boundThis = own(value, '__boundThis');
966
+ }
967
+ const boundArgs = own(value, '__boundArgs');
968
+ if (boundArgs) {
969
+ const length = own(boundArgs, 'length')?.consume((h) => h.toNumber()) ?? 0;
970
+ if (boundArgs.isArray && length > 0)
971
+ payload.boundArgs = boundArgs;
972
+ else
973
+ boundArgs.dispose();
974
+ }
975
+ return payload;
976
+ },
977
+ ArrayBuffer: (value) => {
978
+ if (!isHandle(value) || tagOfHandle(value) !== 'ArrayBuffer') {
979
+ return false;
980
+ }
981
+ return bytesToBase64(new Uint8Array(value.toArrayBuffer()));
982
+ },
983
+ BigInt: (value) => {
984
+ if (!isHandle(value) || !value.isBigInt)
985
+ return false;
986
+ return guestBigInt(value).toString();
987
+ },
988
+ BigInt64Array: (value) => isHandle(value) && tagOfHandle(value) === 'BigInt64Array'
989
+ ? bytesToBase64(viewBytes(value))
990
+ : false,
991
+ BigUint64Array: (value) => isHandle(value) && tagOfHandle(value) === 'BigUint64Array'
992
+ ? bytesToBase64(viewBytes(value))
993
+ : false,
994
+ Date: (value) => {
995
+ if (!isHandle(value) || tagOfHandle(value) !== 'Date')
996
+ return false;
997
+ const time = call(i.dateGetTime, value).consume((h) => h.toNumber());
998
+ if (Number.isNaN(time))
999
+ return '.';
1000
+ return call(i.dateToISOString, value).consume((h) => h.toString());
1001
+ },
1002
+ DOMException: (value) => {
1003
+ if (!isHandle(value) || !isHandle(value))
1004
+ return false;
1005
+ if (!i.domExceptionPrototype ||
1006
+ !hasPrototype(value, i.domExceptionPrototype)) {
1007
+ return false;
1008
+ }
1009
+ const shape = reduceErrorShape(value);
1010
+ return {
1011
+ message: shape.message,
1012
+ name: chainedString(value, 'name'),
1013
+ stack: shape.stack,
1014
+ ...(Object.hasOwn(shape, 'cause') ? { cause: shape.cause } : {}),
1015
+ };
1016
+ },
1017
+ AggregateError: (value) => {
1018
+ if (!isHandle(value) || !value.isError)
1019
+ return false;
1020
+ if (chainedString(value, 'name') !== 'AggregateError')
1021
+ return false;
1022
+ const shape = reduceErrorShape(value);
1023
+ return {
1024
+ message: shape.message,
1025
+ stack: shape.stack,
1026
+ errors: own(value, 'errors'),
1027
+ ...(Object.hasOwn(shape, 'cause') ? { cause: shape.cause } : {}),
1028
+ };
1029
+ },
1030
+ EvalError: namedErrorSubclassReducer('EvalError'),
1031
+ FatalError: namedErrorSubclassReducer('FatalError'),
1032
+ HookConflictError: (value) => {
1033
+ if (!isHandle(value) || !value.isError)
1034
+ return false;
1035
+ if (chainedString(value, 'name') !== 'HookConflictError')
1036
+ return false;
1037
+ const shape = reduceErrorShape(value);
1038
+ const reduced = {
1039
+ message: shape.message,
1040
+ stack: shape.stack,
1041
+ token: own(value, 'token'),
1042
+ };
1043
+ const conflictingRunId = own(value, 'conflictingRunId');
1044
+ if (conflictingRunId && !conflictingRunId.isUndefined) {
1045
+ reduced.conflictingRunId = conflictingRunId;
1046
+ }
1047
+ else {
1048
+ conflictingRunId?.dispose();
1049
+ }
1050
+ if (Object.hasOwn(shape, 'cause'))
1051
+ reduced.cause = shape.cause;
1052
+ return reduced;
1053
+ },
1054
+ RangeError: namedErrorSubclassReducer('RangeError'),
1055
+ ReferenceError: namedErrorSubclassReducer('ReferenceError'),
1056
+ RetryableError: (value) => {
1057
+ if (!isHandle(value) || !value.isError)
1058
+ return false;
1059
+ if (chainedString(value, 'name') !== 'RetryableError')
1060
+ return false;
1061
+ const shape = reduceErrorShape(value);
1062
+ // retryAfter is a guest Date (or string/number); normalize to an epoch
1063
+ // timestamp exactly like the in-VM reducer. The absent/invalid
1064
+ // fallback reads the GUEST clock (the deterministic replay clock at
1065
+ // the WASI layer), not the host wall clock: the in-VM reducer's
1066
+ // `Date.now()` was replay-stable by construction, and a host-side
1067
+ // `Date.now()` here would write different bytes on every replay of
1068
+ // the same value.
1069
+ let retryAfter = invoke(i.dateNow).consume((h) => h.toNumber()) + 1000;
1070
+ const raw = own(value, 'retryAfter');
1071
+ if (raw) {
1072
+ if (tagOfHandle(raw) === 'Date') {
1073
+ const t = call(i.dateGetTime, raw).consume((h) => h.toNumber());
1074
+ if (!Number.isNaN(t))
1075
+ retryAfter = t;
1076
+ }
1077
+ else if (raw.isString || raw.isNumber) {
1078
+ const t = new Date(raw.isString ? raw.toString() : raw.toNumber()).getTime();
1079
+ if (!Number.isNaN(t))
1080
+ retryAfter = t;
1081
+ }
1082
+ raw.dispose();
1083
+ }
1084
+ const reduced = {
1085
+ message: shape.message,
1086
+ stack: shape.stack,
1087
+ retryAfter,
1088
+ };
1089
+ if (Object.hasOwn(shape, 'cause'))
1090
+ reduced.cause = shape.cause;
1091
+ return reduced;
1092
+ },
1093
+ RuntimeDecryptionError: (value) => {
1094
+ if (!isHandle(value) || !value.isError)
1095
+ return false;
1096
+ if (chainedString(value, 'name') !== 'RuntimeDecryptionError') {
1097
+ return false;
1098
+ }
1099
+ const shape = reduceErrorShape(value);
1100
+ const reduced = {
1101
+ message: shape.message,
1102
+ stack: shape.stack,
1103
+ };
1104
+ const context = own(value, 'context');
1105
+ if (context && !context.isUndefined)
1106
+ reduced.context = context;
1107
+ else
1108
+ context?.dispose();
1109
+ if (Object.hasOwn(shape, 'cause'))
1110
+ reduced.cause = shape.cause;
1111
+ return reduced;
1112
+ },
1113
+ StreamError: (value) => {
1114
+ if (!isHandle(value) || !value.isError)
1115
+ return false;
1116
+ if (chainedString(value, 'name') !== 'StreamError')
1117
+ return false;
1118
+ const shape = reduceErrorShape(value);
1119
+ const reduced = {
1120
+ message: shape.message,
1121
+ stack: shape.stack,
1122
+ };
1123
+ if (Object.hasOwn(shape, 'cause'))
1124
+ reduced.cause = shape.cause;
1125
+ const status = own(value, 'status');
1126
+ if (status && !status.isUndefined)
1127
+ reduced.status = status;
1128
+ else
1129
+ status?.dispose();
1130
+ const url = own(value, 'url');
1131
+ if (url && !url.isUndefined)
1132
+ reduced.url = url;
1133
+ else
1134
+ url?.dispose();
1135
+ return reduced;
1136
+ },
1137
+ SyntaxError: namedErrorSubclassReducer('SyntaxError'),
1138
+ TypeError: namedErrorSubclassReducer('TypeError'),
1139
+ URIError: namedErrorSubclassReducer('URIError'),
1140
+ Error: (value) => {
1141
+ if (!isHandle(value) || !value.isError)
1142
+ return false;
1143
+ const shape = reduceErrorShape(value);
1144
+ return {
1145
+ name: chainedString(value, 'name') ?? 'Error',
1146
+ message: shape.message,
1147
+ stack: shape.stack,
1148
+ ...(Object.hasOwn(shape, 'cause') ? { cause: shape.cause } : {}),
1149
+ };
1150
+ },
1151
+ Float32Array: (value) => isHandle(value) && tagOfHandle(value) === 'Float32Array'
1152
+ ? bytesToBase64(viewBytes(value))
1153
+ : false,
1154
+ Float64Array: (value) => isHandle(value) && tagOfHandle(value) === 'Float64Array'
1155
+ ? bytesToBase64(viewBytes(value))
1156
+ : false,
1157
+ Int8Array: (value) => isHandle(value) && tagOfHandle(value) === 'Int8Array'
1158
+ ? bytesToBase64(viewBytes(value))
1159
+ : false,
1160
+ Int16Array: (value) => isHandle(value) && tagOfHandle(value) === 'Int16Array'
1161
+ ? bytesToBase64(viewBytes(value))
1162
+ : false,
1163
+ Int32Array: (value) => isHandle(value) && tagOfHandle(value) === 'Int32Array'
1164
+ ? bytesToBase64(viewBytes(value))
1165
+ : false,
1166
+ Map: (value) => isHandle(value) && tagOfHandle(value) === 'Map'
1167
+ ? collect(i.mapForEach, value, 2)
1168
+ : false,
1169
+ RegExp: (value) => {
1170
+ if (!isHandle(value) || tagOfHandle(value) !== 'RegExp')
1171
+ return false;
1172
+ return {
1173
+ source: call(i.regExpSource, value).consume((h) => h.toString()),
1174
+ flags: call(i.regExpFlags, value).consume((h) => h.toString()),
1175
+ };
1176
+ },
1177
+ Headers: (value) => {
1178
+ if (!isHandle(value) ||
1179
+ !i.headersPrototype ||
1180
+ !hasPrototype(value, i.headersPrototype) ||
1181
+ !i.headersForEach) {
1182
+ return false;
1183
+ }
1184
+ // Headers.forEach yields (value, key); normalize to [key, value]
1185
+ // pairs of host strings, matching Array.from(headers).
1186
+ const entries = [];
1187
+ const visitor = vm.newEphemeralFunction((headerValue, headerKey) => {
1188
+ entries.push([headerKey.toString(), headerValue.toString()]);
1189
+ return vm.undefined;
1190
+ });
1191
+ try {
1192
+ call(i.headersForEach, value, visitor).dispose();
1193
+ }
1194
+ finally {
1195
+ visitor.dispose();
1196
+ }
1197
+ return entries;
1198
+ },
1199
+ Request: (value) => {
1200
+ if (!isHandle(value) || value.typeof !== 'object' || value.isNull) {
1201
+ return false;
1202
+ }
1203
+ const isRequest = (i.requestPrototype && hasPrototype(value, i.requestPrototype)) ||
1204
+ own(value, 'json')?.consume((h) => h.typeof === 'function');
1205
+ if (!isRequest)
1206
+ return false;
1207
+ const method = own(value, 'method');
1208
+ if (!method || !method.isString) {
1209
+ method?.dispose();
1210
+ return false;
1211
+ }
1212
+ const data = {
1213
+ method,
1214
+ url: own(value, 'url'),
1215
+ headers: own(value, 'headers'),
1216
+ body: own(value, 'body'),
1217
+ duplex: own(value, 'duplex'),
1218
+ };
1219
+ const responseWritable = own(value, sym('WEBHOOK_RESPONSE_WRITABLE'));
1220
+ if (responseWritable && !responseWritable.isUndefined) {
1221
+ data.responseWritable = responseWritable;
1222
+ }
1223
+ else {
1224
+ responseWritable?.dispose();
1225
+ }
1226
+ return data;
1227
+ },
1228
+ Response: (value) => {
1229
+ if (!isHandle(value) || value.typeof !== 'object' || value.isNull) {
1230
+ return false;
1231
+ }
1232
+ const isResponse = (i.responsePrototype && hasPrototype(value, i.responsePrototype)) ||
1233
+ chained(value, 'clone')?.consume((h) => h.typeof === 'function');
1234
+ if (!isResponse)
1235
+ return false;
1236
+ const status = own(value, 'status');
1237
+ if (!status || !status.isNumber) {
1238
+ status?.dispose();
1239
+ return false;
1240
+ }
1241
+ return {
1242
+ type: own(value, 'type'),
1243
+ url: own(value, 'url'),
1244
+ status,
1245
+ statusText: own(value, 'statusText'),
1246
+ headers: own(value, 'headers'),
1247
+ body: own(value, 'body'),
1248
+ redirected: own(value, 'redirected'),
1249
+ };
1250
+ },
1251
+ ReadableStream: (value) => {
1252
+ if (!isHandle(value) ||
1253
+ value.typeof !== 'object' ||
1254
+ value.isNull ||
1255
+ !i.readableStreamPrototype ||
1256
+ !hasPrototype(value, i.readableStreamPrototype)) {
1257
+ return false;
1258
+ }
1259
+ const bodyInit = own(value, sym('BODY_INIT'));
1260
+ if (bodyInit && !bodyInit.isUndefined) {
1261
+ return { bodyInit };
1262
+ }
1263
+ bodyInit?.dispose();
1264
+ const name = ownSymbolString(value, 'WORKFLOW_STREAM_NAME');
1265
+ if (name) {
1266
+ const s = { name };
1267
+ const type = ownSymbolString(value, 'WORKFLOW_STREAM_TYPE');
1268
+ if (type)
1269
+ s.type = type;
1270
+ const framing = ownSymbolString(value, 'WORKFLOW_STREAM_FRAMING');
1271
+ if (framing)
1272
+ s.framing = framing;
1273
+ return s;
1274
+ }
1275
+ return { name: '__empty' };
1276
+ },
1277
+ WritableStream: (value) => {
1278
+ if (!isHandle(value) ||
1279
+ value.typeof !== 'object' ||
1280
+ value.isNull ||
1281
+ !i.writableStreamPrototype ||
1282
+ !hasPrototype(value, i.writableStreamPrototype)) {
1283
+ return false;
1284
+ }
1285
+ const s = {
1286
+ name: ownSymbolString(value, 'WORKFLOW_STREAM_NAME') || '__empty',
1287
+ };
1288
+ const runId = ownSymbolString(value, 'WORKFLOW_STREAM_SERVER_RUN_ID');
1289
+ if (runId)
1290
+ s.runId = runId;
1291
+ const deploymentId = ownSymbolString(value, 'WORKFLOW_STREAM_SERVER_DEPLOYMENT_ID');
1292
+ if (deploymentId)
1293
+ s.deploymentId = deploymentId;
1294
+ return s;
1295
+ },
1296
+ Set: (value) => isHandle(value) && tagOfHandle(value) === 'Set'
1297
+ ? collect(i.setForEach, value, 1)
1298
+ : false,
1299
+ URL: (value) => {
1300
+ if (!isHandle(value) ||
1301
+ !i.urlPrototype ||
1302
+ !hasPrototype(value, i.urlPrototype) ||
1303
+ !i.urlHref) {
1304
+ return false;
1305
+ }
1306
+ return call(i.urlHref, value).consume((h) => h.toString());
1307
+ },
1308
+ WorkflowFunction: (value) => {
1309
+ if (!isHandle(value) || value.typeof !== 'function')
1310
+ return false;
1311
+ const workflowId = ownString(value, 'workflowId');
1312
+ if (workflowId === undefined)
1313
+ return false;
1314
+ return { workflowId };
1315
+ },
1316
+ URLSearchParams: (value) => {
1317
+ if (!isHandle(value) ||
1318
+ !i.urlSearchParamsPrototype ||
1319
+ !hasPrototype(value, i.urlSearchParamsPrototype) ||
1320
+ !i.urlSearchParamsToString) {
1321
+ return false;
1322
+ }
1323
+ const size = i.urlSearchParamsSize
1324
+ ? call(i.urlSearchParamsSize, value).consume((h) => h.toNumber())
1325
+ : Number.NaN;
1326
+ if (size === 0)
1327
+ return '.';
1328
+ return call(i.urlSearchParamsToString, value).consume((h) => h.toString());
1329
+ },
1330
+ Uint8Array: (value) => isHandle(value) && tagOfHandle(value) === 'Uint8Array'
1331
+ ? bytesToBase64(viewBytes(value))
1332
+ : false,
1333
+ Uint8ClampedArray: (value) => isHandle(value) && tagOfHandle(value) === 'Uint8ClampedArray'
1334
+ ? bytesToBase64(viewBytes(value))
1335
+ : false,
1336
+ Uint16Array: (value) => isHandle(value) && tagOfHandle(value) === 'Uint16Array'
1337
+ ? bytesToBase64(viewBytes(value))
1338
+ : false,
1339
+ Uint32Array: (value) => isHandle(value) && tagOfHandle(value) === 'Uint32Array'
1340
+ ? bytesToBase64(viewBytes(value))
1341
+ : false,
1342
+ };
1343
+ // --- parse operations (handle-only: everything is built in the VM) ---
1344
+ const parseOperations = {
1345
+ fromPrimitive: (value) => typeof value === 'bigint' ? vm.newBigInt(value) : vm.hostToHandle(value),
1346
+ fromISOString: (iso) => {
1347
+ const argument = iso === '' ? vm.newNumber(Number.NaN) : vm.newString(iso);
1348
+ try {
1349
+ return vm.construct(i.Date, argument);
1350
+ }
1351
+ finally {
1352
+ argument.dispose();
1353
+ }
1354
+ },
1355
+ fromStringValue: (tag, _string) => {
1356
+ throw new Error(`${tag} cannot be revived in the VM`);
1357
+ },
1358
+ fromArrayBuffer: (buffer) => vm.newArrayBuffer(buffer),
1359
+ fromRegExpInfo: (source, flags) => {
1360
+ const sourceHandle = vm.newString(source);
1361
+ try {
1362
+ if (!flags)
1363
+ return vm.construct(i.RegExp, sourceHandle);
1364
+ const flagsHandle = vm.newString(flags);
1365
+ try {
1366
+ return vm.construct(i.RegExp, sourceHandle, flagsHandle);
1367
+ }
1368
+ finally {
1369
+ flagsHandle.dispose();
1370
+ }
1371
+ }
1372
+ finally {
1373
+ sourceHandle.dispose();
1374
+ }
1375
+ },
1376
+ fromViewInfo: (tag, buffer, byteOffset, length) => {
1377
+ const Constructor = typedArrayConstructors.get(tag);
1378
+ if (!Constructor)
1379
+ throw new Error(`${tag} is not available in the VM`);
1380
+ if (byteOffset === undefined) {
1381
+ return vm.construct(Constructor, buffer);
1382
+ }
1383
+ const offsetHandle = vm.newNumber(byteOffset);
1384
+ const lengthHandle = vm.newNumber(length ?? 0);
1385
+ try {
1386
+ return vm.construct(Constructor, buffer, offsetHandle, lengthHandle);
1387
+ }
1388
+ finally {
1389
+ offsetHandle.dispose();
1390
+ lengthHandle.dispose();
1391
+ }
1392
+ },
1393
+ box: (value) => vm.construct(i.Object, value),
1394
+ createArray: (length) => {
1395
+ const lengthHandle = vm.newNumber(length);
1396
+ try {
1397
+ return vm.construct(i.Array, lengthHandle);
1398
+ }
1399
+ finally {
1400
+ lengthHandle.dispose();
1401
+ }
1402
+ },
1403
+ createSparseArray: (length) => {
1404
+ const lengthHandle = vm.newNumber(length);
1405
+ try {
1406
+ return invoke(i.makeSparseArray, lengthHandle);
1407
+ }
1408
+ finally {
1409
+ lengthHandle.dispose();
1410
+ }
1411
+ },
1412
+ createObject: () => vm.newObject(),
1413
+ createNullPrototypeObject: () => call(i.objectCreate, vm.undefined, vm.null),
1414
+ createSet: () => vm.construct(i.Set),
1415
+ createMap: () => vm.construct(i.Map),
1416
+ set: (target, key, value) => define(target, String(key), value),
1417
+ addValue: (set, value) => {
1418
+ call(i.setAdd, set, value).dispose();
1419
+ },
1420
+ addEntry: (map, key, value) => {
1421
+ call(i.mapSet, map, key, value).dispose();
1422
+ },
1423
+ };
1424
+ // --- workflow revivers (handle space) ---
1425
+ /** Guest lookup of a registered error class on globalThis, by symbol. */
1426
+ const registeredErrorClass = (name) => {
1427
+ const cls = own(vm.global, sym(name));
1428
+ if (!cls || cls.typeof !== 'function') {
1429
+ cls?.dispose();
1430
+ return undefined;
1431
+ }
1432
+ return cls;
1433
+ };
1434
+ /** Construct a guest Error via `ctor(message)` + define stack/cause. */
1435
+ const buildError = (ctor, value, opts = {}) => {
1436
+ const message = own(value, 'message') ?? vm.undefined;
1437
+ const error = vm.construct(ctor, message, ...(opts.extraCtorArgs ?? []));
1438
+ if (message !== vm.undefined)
1439
+ message.dispose();
1440
+ if (opts.name !== undefined) {
1441
+ const nameHandle = newGuestString(opts.name);
1442
+ define(error, 'name', nameHandle);
1443
+ nameHandle.dispose();
1444
+ }
1445
+ const stack = own(value, 'stack');
1446
+ if (stack && !stack.isUndefined)
1447
+ define(error, 'stack', stack);
1448
+ stack?.dispose();
1449
+ if (guestHasOwn(value, 'cause')) {
1450
+ const cause = own(value, 'cause') ?? vm.undefined;
1451
+ define(error, 'cause', cause);
1452
+ if (cause !== vm.undefined)
1453
+ cause.dispose();
1454
+ }
1455
+ return error;
1456
+ };
1457
+ const namedErrorSubclassReviver = (subclassName) => (value) => {
1458
+ const ctor = errorConstructors.get(subclassName);
1459
+ if (ctor)
1460
+ return buildError(ctor, value);
1461
+ return buildError(i.Error, value, { name: subclassName });
1462
+ };
1463
+ const reviveAbortSignal = (value) => {
1464
+ const cls = own(vm.global, '__WorkflowAbortSignal');
1465
+ if (!cls || cls.typeof !== 'function') {
1466
+ cls?.dispose();
1467
+ throw new Error('WorkflowAbortSignal is not registered in the VM (bootstrap not evaluated)');
1468
+ }
1469
+ try {
1470
+ const streamName = own(value, 'streamName') ?? vm.undefined;
1471
+ const hookToken = own(value, 'hookToken') ?? vm.undefined;
1472
+ const signal = vm.construct(cls, streamName, hookToken);
1473
+ if (streamName !== vm.undefined)
1474
+ streamName.dispose();
1475
+ if (hookToken !== vm.undefined)
1476
+ hookToken.dispose();
1477
+ const aborted = own(value, 'aborted');
1478
+ if (aborted?.toBoolean()) {
1479
+ const setAborted = chained(signal, '_setAborted');
1480
+ if (setAborted) {
1481
+ const reason = own(value, 'reason') ?? vm.undefined;
1482
+ call(setAborted, signal, reason).dispose();
1483
+ if (reason !== vm.undefined)
1484
+ reason.dispose();
1485
+ setAborted.dispose();
1486
+ }
1487
+ }
1488
+ aborted?.dispose();
1489
+ return signal;
1490
+ }
1491
+ finally {
1492
+ cls.dispose();
1493
+ }
1494
+ };
1495
+ const revivers = {
1496
+ AbortController: (value) => {
1497
+ const controller = vm.newObject();
1498
+ const streamName = own(value, 'streamName') ?? vm.undefined;
1499
+ define(controller, sym('WORKFLOW_ABORT_STREAM_NAME'), streamName);
1500
+ if (streamName !== vm.undefined)
1501
+ streamName.dispose();
1502
+ const hookToken = own(value, 'hookToken') ?? vm.undefined;
1503
+ define(controller, sym('WORKFLOW_ABORT_HOOK_TOKEN'), hookToken);
1504
+ if (hookToken !== vm.undefined)
1505
+ hookToken.dispose();
1506
+ const signal = reviveAbortSignal(value);
1507
+ define(controller, 'signal', signal);
1508
+ signal.dispose();
1509
+ const noop = vm.evalCode('(function(){})');
1510
+ define(controller, 'abort', noop);
1511
+ noop.dispose();
1512
+ return controller;
1513
+ },
1514
+ AbortSignal: (value) => reviveAbortSignal(value),
1515
+ Class: (value) => {
1516
+ const classId = ownString(value, 'classId');
1517
+ const cls = lookupRegisteredClass(classId);
1518
+ if (!cls) {
1519
+ throw new Error(`Class "${classId}" not found. Make sure the class is registered with registerSerializationClass.`);
1520
+ }
1521
+ return cls;
1522
+ },
1523
+ Instance: (value) => {
1524
+ const classId = ownString(value, 'classId');
1525
+ const cls = lookupRegisteredClass(classId);
1526
+ if (!cls) {
1527
+ throw new Error(`Class "${classId}" not found. Make sure the class is registered with registerSerializationClass.`);
1528
+ }
1529
+ try {
1530
+ const deserializeMethod = chained(cls, sym('workflow-deserialize'));
1531
+ if (!deserializeMethod || deserializeMethod.typeof !== 'function') {
1532
+ deserializeMethod?.dispose();
1533
+ throw new Error(`Class "${classId}" does not have a static Symbol(workflow-deserialize) method.`);
1534
+ }
1535
+ try {
1536
+ const data = own(value, 'data') ?? vm.undefined;
1537
+ const result = call(deserializeMethod, cls, data);
1538
+ if (data !== vm.undefined)
1539
+ data.dispose();
1540
+ return result;
1541
+ }
1542
+ finally {
1543
+ deserializeMethod.dispose();
1544
+ }
1545
+ }
1546
+ finally {
1547
+ cls.dispose();
1548
+ }
1549
+ },
1550
+ StepFunction: (value) => {
1551
+ const useStep = own(vm.global, sym('WORKFLOW_USE_STEP'));
1552
+ if (!useStep || useStep.typeof !== 'function') {
1553
+ useStep?.dispose();
1554
+ throw new Error('WORKFLOW_USE_STEP not found on global object. Step functions cannot be deserialized outside workflow context.');
1555
+ }
1556
+ try {
1557
+ const stepId = own(value, 'stepId') ?? vm.undefined;
1558
+ const closureVars = own(value, 'closureVars');
1559
+ let proxy;
1560
+ if (closureVars && !closureVars.isUndefined) {
1561
+ const thunk = invoke(i.makeThunk, closureVars);
1562
+ proxy = invoke(useStep, stepId, thunk);
1563
+ thunk.dispose();
1564
+ }
1565
+ else {
1566
+ proxy = invoke(useStep, stepId);
1567
+ }
1568
+ closureVars?.dispose();
1569
+ if (stepId !== vm.undefined)
1570
+ stepId.dispose();
1571
+ if (guestHasOwn(value, 'boundThis')) {
1572
+ // Re-bind through the proxy's own (overridden) `.bind`, which is
1573
+ // an own data property stamped by WORKFLOW_USE_STEP.
1574
+ const bind = own(proxy, 'bind') ?? chained(proxy, 'bind');
1575
+ const boundThis = own(value, 'boundThis') ?? vm.undefined;
1576
+ const boundArgs = own(value, 'boundArgs');
1577
+ const args = [boundThis];
1578
+ const argHandles = [];
1579
+ if (boundArgs && boundArgs.isArray) {
1580
+ const length = own(boundArgs, 'length')?.consume((h) => h.toNumber()) ?? 0;
1581
+ for (let index = 0; index < length; index++) {
1582
+ const element = own(boundArgs, String(index)) ?? vm.undefined;
1583
+ args.push(element);
1584
+ if (element !== vm.undefined)
1585
+ argHandles.push(element);
1586
+ }
1587
+ }
1588
+ boundArgs?.dispose();
1589
+ if (bind) {
1590
+ const bound = call(bind, proxy, ...args);
1591
+ bind.dispose();
1592
+ proxy.dispose();
1593
+ proxy = bound;
1594
+ }
1595
+ if (boundThis !== vm.undefined)
1596
+ boundThis.dispose();
1597
+ for (const handle of argHandles)
1598
+ handle.dispose();
1599
+ }
1600
+ return proxy;
1601
+ }
1602
+ finally {
1603
+ useStep.dispose();
1604
+ }
1605
+ },
1606
+ ArrayBuffer: (value) => vm.newArrayBuffer(base64ToBytes(isHandle(value) ? value.toString() : value)
1607
+ .buffer),
1608
+ BigInt: (value) => vm.newBigInt(BigInt(isHandle(value) ? value.toString() : value)),
1609
+ BigInt64Array: (value) => buildTypedArray('BigInt64Array', value),
1610
+ BigUint64Array: (value) => buildTypedArray('BigUint64Array', value),
1611
+ Date: (value) => {
1612
+ // The reducer emits '.' for invalid dates and an ISO string otherwise.
1613
+ const iso = isHandle(value) ? value.toString() : value;
1614
+ const argument = iso === '.' ? vm.newNumber(Number.NaN) : vm.newString(iso);
1615
+ try {
1616
+ return vm.construct(i.Date, argument);
1617
+ }
1618
+ finally {
1619
+ argument.dispose();
1620
+ if (isHandle(value))
1621
+ value.dispose();
1622
+ }
1623
+ },
1624
+ DOMException: (value) => {
1625
+ if (i.DOMException) {
1626
+ const message = own(value, 'message') ?? vm.undefined;
1627
+ const name = own(value, 'name') ?? vm.undefined;
1628
+ const error = vm.construct(i.DOMException, message, name);
1629
+ if (message !== vm.undefined)
1630
+ message.dispose();
1631
+ if (name !== vm.undefined)
1632
+ name.dispose();
1633
+ const stack = own(value, 'stack');
1634
+ if (stack && !stack.isUndefined)
1635
+ define(error, 'stack', stack);
1636
+ stack?.dispose();
1637
+ if (guestHasOwn(value, 'cause')) {
1638
+ const cause = own(value, 'cause') ?? vm.undefined;
1639
+ define(error, 'cause', cause);
1640
+ if (cause !== vm.undefined)
1641
+ cause.dispose();
1642
+ }
1643
+ return error;
1644
+ }
1645
+ return buildError(i.Error, value, {
1646
+ name: ownString(value, 'name') ?? 'DOMException',
1647
+ });
1648
+ },
1649
+ AggregateError: (value) => {
1650
+ const errors = own(value, 'errors');
1651
+ const errorsArg = errors && !errors.isUndefined ? errors : vm.evalCode('([])');
1652
+ const message = own(value, 'message') ?? vm.undefined;
1653
+ const ctor = i.AggregateError ?? i.Error;
1654
+ const error = ctor === i.AggregateError
1655
+ ? vm.construct(ctor, errorsArg, message)
1656
+ : buildError(i.Error, value, { name: 'AggregateError' });
1657
+ if (ctor === i.AggregateError) {
1658
+ const stack = own(value, 'stack');
1659
+ if (stack && !stack.isUndefined)
1660
+ define(error, 'stack', stack);
1661
+ stack?.dispose();
1662
+ if (guestHasOwn(value, 'cause')) {
1663
+ const cause = own(value, 'cause') ?? vm.undefined;
1664
+ define(error, 'cause', cause);
1665
+ if (cause !== vm.undefined)
1666
+ cause.dispose();
1667
+ }
1668
+ }
1669
+ if (message !== vm.undefined)
1670
+ message.dispose();
1671
+ errorsArg.dispose();
1672
+ return error;
1673
+ },
1674
+ EvalError: namedErrorSubclassReviver('EvalError'),
1675
+ FatalError: (value) => {
1676
+ const cls = registeredErrorClass('@workflow/errors//FatalError');
1677
+ const error = cls
1678
+ ? buildError(cls, value)
1679
+ : buildError(i.Error, value, { name: 'FatalError' });
1680
+ cls?.dispose();
1681
+ return error;
1682
+ },
1683
+ HookConflictError: (value) => {
1684
+ const cls = registeredErrorClass('@workflow/errors//HookConflictError');
1685
+ let error;
1686
+ if (cls) {
1687
+ // Constructor takes (token, conflictingRunId).
1688
+ const token = own(value, 'token') ?? vm.undefined;
1689
+ const conflictingRunId = own(value, 'conflictingRunId') ?? vm.undefined;
1690
+ error = vm.construct(cls, token, conflictingRunId);
1691
+ if (token !== vm.undefined)
1692
+ token.dispose();
1693
+ if (conflictingRunId !== vm.undefined)
1694
+ conflictingRunId.dispose();
1695
+ const stack = own(value, 'stack');
1696
+ if (stack && !stack.isUndefined)
1697
+ define(error, 'stack', stack);
1698
+ stack?.dispose();
1699
+ if (guestHasOwn(value, 'cause')) {
1700
+ const cause = own(value, 'cause') ?? vm.undefined;
1701
+ define(error, 'cause', cause);
1702
+ if (cause !== vm.undefined)
1703
+ cause.dispose();
1704
+ }
1705
+ cls.dispose();
1706
+ }
1707
+ else {
1708
+ error = buildError(i.Error, value, { name: 'HookConflictError' });
1709
+ const token = own(value, 'token');
1710
+ if (token) {
1711
+ define(error, 'token', token);
1712
+ token.dispose();
1713
+ }
1714
+ const conflictingRunId = own(value, 'conflictingRunId');
1715
+ if (conflictingRunId && !conflictingRunId.isUndefined) {
1716
+ define(error, 'conflictingRunId', conflictingRunId);
1717
+ }
1718
+ conflictingRunId?.dispose();
1719
+ }
1720
+ return error;
1721
+ },
1722
+ RangeError: namedErrorSubclassReviver('RangeError'),
1723
+ ReferenceError: namedErrorSubclassReviver('ReferenceError'),
1724
+ RetryableError: (value) => {
1725
+ const retryAfterMs = own(value, 'retryAfter')?.consume((h) => h.isNumber ? h.toNumber() : Number.NaN) ?? Number.NaN;
1726
+ const timeHandle = vm.newNumber(retryAfterMs);
1727
+ const retryAfterDate = vm.construct(i.Date, timeHandle);
1728
+ timeHandle.dispose();
1729
+ const cls = registeredErrorClass('@workflow/errors//RetryableError');
1730
+ let error;
1731
+ if (cls) {
1732
+ // Constructor takes (message, { retryAfter }).
1733
+ const options = vm.newObject();
1734
+ options.setProp('retryAfter', retryAfterDate);
1735
+ const message = own(value, 'message') ?? vm.undefined;
1736
+ error = vm.construct(cls, message, options);
1737
+ if (message !== vm.undefined)
1738
+ message.dispose();
1739
+ options.dispose();
1740
+ const stack = own(value, 'stack');
1741
+ if (stack && !stack.isUndefined)
1742
+ define(error, 'stack', stack);
1743
+ stack?.dispose();
1744
+ if (guestHasOwn(value, 'cause')) {
1745
+ const cause = own(value, 'cause') ?? vm.undefined;
1746
+ define(error, 'cause', cause);
1747
+ if (cause !== vm.undefined)
1748
+ cause.dispose();
1749
+ }
1750
+ cls.dispose();
1751
+ }
1752
+ else {
1753
+ error = buildError(i.Error, value, { name: 'RetryableError' });
1754
+ define(error, 'retryAfter', retryAfterDate);
1755
+ }
1756
+ retryAfterDate.dispose();
1757
+ return error;
1758
+ },
1759
+ RuntimeDecryptionError: (value) => {
1760
+ const cls = registeredErrorClass('@workflow/errors//RuntimeDecryptionError');
1761
+ let error;
1762
+ if (cls) {
1763
+ // Constructor takes (message, { cause, context }).
1764
+ const options = vm.newObject();
1765
+ const context = own(value, 'context');
1766
+ if (context && !context.isUndefined) {
1767
+ options.setProp('context', context);
1768
+ }
1769
+ context?.dispose();
1770
+ if (guestHasOwn(value, 'cause')) {
1771
+ const cause = own(value, 'cause') ?? vm.undefined;
1772
+ options.setProp('cause', cause);
1773
+ if (cause !== vm.undefined)
1774
+ cause.dispose();
1775
+ }
1776
+ const message = own(value, 'message') ?? vm.undefined;
1777
+ error = vm.construct(cls, message, options);
1778
+ if (message !== vm.undefined)
1779
+ message.dispose();
1780
+ options.dispose();
1781
+ const stack = own(value, 'stack');
1782
+ if (stack && !stack.isUndefined)
1783
+ define(error, 'stack', stack);
1784
+ stack?.dispose();
1785
+ cls.dispose();
1786
+ }
1787
+ else {
1788
+ error = buildError(i.Error, value, { name: 'RuntimeDecryptionError' });
1789
+ const context = own(value, 'context');
1790
+ if (context && !context.isUndefined) {
1791
+ define(error, 'context', context);
1792
+ }
1793
+ context?.dispose();
1794
+ }
1795
+ return error;
1796
+ },
1797
+ StreamError: (value) => {
1798
+ const cls = registeredErrorClass('@workflow/errors//StreamError');
1799
+ let error;
1800
+ if (cls) {
1801
+ const options = vm.newObject();
1802
+ for (const property of ['cause', 'status', 'url']) {
1803
+ if (!guestHasOwn(value, property))
1804
+ continue;
1805
+ const propertyValue = own(value, property) ?? vm.undefined;
1806
+ options.setProp(property, propertyValue);
1807
+ if (propertyValue !== vm.undefined)
1808
+ propertyValue.dispose();
1809
+ }
1810
+ const message = own(value, 'message') ?? vm.undefined;
1811
+ error = vm.construct(cls, message, options);
1812
+ if (message !== vm.undefined)
1813
+ message.dispose();
1814
+ options.dispose();
1815
+ const stack = own(value, 'stack');
1816
+ if (stack && !stack.isUndefined)
1817
+ define(error, 'stack', stack);
1818
+ stack?.dispose();
1819
+ cls.dispose();
1820
+ }
1821
+ else {
1822
+ error = buildError(i.Error, value, { name: 'StreamError' });
1823
+ for (const property of ['status', 'url']) {
1824
+ const propertyValue = own(value, property);
1825
+ if (propertyValue && !propertyValue.isUndefined) {
1826
+ define(error, property, propertyValue);
1827
+ }
1828
+ propertyValue?.dispose();
1829
+ }
1830
+ }
1831
+ return error;
1832
+ },
1833
+ SyntaxError: namedErrorSubclassReviver('SyntaxError'),
1834
+ TypeError: namedErrorSubclassReviver('TypeError'),
1835
+ URIError: namedErrorSubclassReviver('URIError'),
1836
+ Error: (value) => buildError(i.Error, value, {
1837
+ name: ownString(value, 'name') ?? 'Error',
1838
+ }),
1839
+ Float32Array: (value) => buildTypedArray('Float32Array', value),
1840
+ Float64Array: (value) => buildTypedArray('Float64Array', value),
1841
+ Int8Array: (value) => buildTypedArray('Int8Array', value),
1842
+ Int16Array: (value) => buildTypedArray('Int16Array', value),
1843
+ Int32Array: (value) => buildTypedArray('Int32Array', value),
1844
+ Map: (value) => {
1845
+ // value is a guest array of [k, v] arrays.
1846
+ const map = vm.construct(i.Map);
1847
+ const length = own(value, 'length')?.consume((h) => h.toNumber()) ?? 0;
1848
+ for (let index = 0; index < length; index++) {
1849
+ const entry = own(value, String(index));
1850
+ if (!entry)
1851
+ continue;
1852
+ const key = own(entry, '0') ?? vm.undefined;
1853
+ const entryValue = own(entry, '1') ?? vm.undefined;
1854
+ call(i.mapSet, map, key, entryValue).dispose();
1855
+ if (key !== vm.undefined)
1856
+ key.dispose();
1857
+ if (entryValue !== vm.undefined)
1858
+ entryValue.dispose();
1859
+ entry.dispose();
1860
+ }
1861
+ return map;
1862
+ },
1863
+ RegExp: (value) => {
1864
+ const source = own(value, 'source') ?? vm.undefined;
1865
+ const flags = own(value, 'flags') ?? vm.undefined;
1866
+ const regexp = vm.construct(i.RegExp, source, flags);
1867
+ if (source !== vm.undefined)
1868
+ source.dispose();
1869
+ if (flags !== vm.undefined)
1870
+ flags.dispose();
1871
+ return regexp;
1872
+ },
1873
+ Set: (value) => {
1874
+ const set = vm.construct(i.Set);
1875
+ const length = own(value, 'length')?.consume((h) => h.toNumber()) ?? 0;
1876
+ for (let index = 0; index < length; index++) {
1877
+ const element = own(value, String(index)) ?? vm.undefined;
1878
+ call(i.setAdd, set, element).dispose();
1879
+ if (element !== vm.undefined)
1880
+ element.dispose();
1881
+ }
1882
+ return set;
1883
+ },
1884
+ URL: (value) => {
1885
+ if (!i.URL)
1886
+ throw new Error('URL is not available in the VM');
1887
+ const href = isHandle(value) ? value : vm.newString(value);
1888
+ try {
1889
+ return vm.construct(i.URL, href);
1890
+ }
1891
+ finally {
1892
+ if (!isHandle(value))
1893
+ href.dispose();
1894
+ }
1895
+ },
1896
+ WorkflowFunction: (value) => {
1897
+ const workflowId = own(value, 'workflowId') ?? vm.undefined;
1898
+ const throwerFactory = vm.evalCode(`(function(workflowId) {
1899
+ var f = function() {
1900
+ throw new Error('Workflow functions cannot be called directly. Use start() to invoke them.');
1901
+ };
1902
+ f.workflowId = workflowId;
1903
+ return f;
1904
+ })`);
1905
+ try {
1906
+ return invoke(throwerFactory, workflowId);
1907
+ }
1908
+ finally {
1909
+ throwerFactory.dispose();
1910
+ if (workflowId !== vm.undefined)
1911
+ workflowId.dispose();
1912
+ }
1913
+ },
1914
+ URLSearchParams: (value) => {
1915
+ if (!i.URLSearchParams) {
1916
+ throw new Error('URLSearchParams is not available in the VM');
1917
+ }
1918
+ const raw = isHandle(value) ? value.toString() : value;
1919
+ const init = vm.newString(raw === '.' ? '' : raw);
1920
+ try {
1921
+ return vm.construct(i.URLSearchParams, init);
1922
+ }
1923
+ finally {
1924
+ init.dispose();
1925
+ if (isHandle(value))
1926
+ value.dispose();
1927
+ }
1928
+ },
1929
+ Uint8Array: (value) => buildTypedArray('Uint8Array', value),
1930
+ Uint8ClampedArray: (value) => buildTypedArray('Uint8ClampedArray', value),
1931
+ Uint16Array: (value) => buildTypedArray('Uint16Array', value),
1932
+ Uint32Array: (value) => buildTypedArray('Uint32Array', value),
1933
+ Headers: (value) => {
1934
+ if (!i.Headers)
1935
+ throw new Error('Headers is not available in the VM');
1936
+ return vm.construct(i.Headers, value);
1937
+ },
1938
+ Request: (value) => {
1939
+ // Mirror the in-VM reviver: mutate the parsed object into a
1940
+ // Request-alike by attaching the prototype methods directly.
1941
+ if (i.requestPrototype) {
1942
+ for (const method of ['json', 'text', 'arrayBuffer']) {
1943
+ const fn = own(i.requestPrototype, method);
1944
+ if (fn && fn.typeof === 'function')
1945
+ define(value, method, fn);
1946
+ fn?.dispose();
1947
+ }
1948
+ }
1949
+ const responseWritable = own(value, 'responseWritable');
1950
+ if (responseWritable && !responseWritable.isUndefined) {
1951
+ define(value, sym('WEBHOOK_RESPONSE_WRITABLE'), responseWritable);
1952
+ }
1953
+ responseWritable?.dispose();
1954
+ return value.dup();
1955
+ },
1956
+ Response: (value) => {
1957
+ if (i.responsePrototype) {
1958
+ for (const method of [
1959
+ 'json',
1960
+ 'text',
1961
+ 'arrayBuffer',
1962
+ 'bytes',
1963
+ 'clone',
1964
+ ]) {
1965
+ const fn = own(i.responsePrototype, method);
1966
+ if (fn && fn.typeof === 'function')
1967
+ define(value, method, fn);
1968
+ fn?.dispose();
1969
+ }
1970
+ }
1971
+ const body = own(value, 'body') ?? vm.undefined;
1972
+ define(value, '_body', body);
1973
+ if (body !== vm.undefined)
1974
+ body.dispose();
1975
+ const status = own(value, 'status')?.consume((h) => h.toNumber()) ?? 0;
1976
+ const ok = status >= 200 && status < 300 ? vm.true : vm.false;
1977
+ define(value, 'ok', ok);
1978
+ define(value, 'bodyUsed', vm.false);
1979
+ return value.dup();
1980
+ },
1981
+ ReadableStream: (value) => {
1982
+ const prototype = i.readableStreamPrototype ?? vm.null;
1983
+ const stream = call(i.objectCreate, vm.undefined, prototype);
1984
+ const bodyInit = own(value, 'bodyInit');
1985
+ if (bodyInit && !bodyInit.isUndefined) {
1986
+ define(stream, sym('BODY_INIT'), bodyInit);
1987
+ bodyInit.dispose();
1988
+ return stream;
1989
+ }
1990
+ bodyInit?.dispose();
1991
+ const name = own(value, 'name');
1992
+ if (name && !name.isUndefined) {
1993
+ define(stream, sym('WORKFLOW_STREAM_NAME'), name);
1994
+ const type = own(value, 'type');
1995
+ if (type && !type.isUndefined) {
1996
+ define(stream, sym('WORKFLOW_STREAM_TYPE'), type);
1997
+ }
1998
+ type?.dispose();
1999
+ const framing = own(value, 'framing');
2000
+ if (framing && !framing.isUndefined) {
2001
+ define(stream, sym('WORKFLOW_STREAM_FRAMING'), framing);
2002
+ }
2003
+ framing?.dispose();
2004
+ }
2005
+ name?.dispose();
2006
+ return stream;
2007
+ },
2008
+ WritableStream: (value) => {
2009
+ const prototype = i.writableStreamPrototype ?? vm.null;
2010
+ const stream = call(i.objectCreate, vm.undefined, prototype);
2011
+ const name = own(value, 'name');
2012
+ if (name && !name.isUndefined) {
2013
+ define(stream, sym('WORKFLOW_STREAM_NAME'), name);
2014
+ }
2015
+ name?.dispose();
2016
+ const runId = own(value, 'runId');
2017
+ if (runId?.isString) {
2018
+ define(stream, sym('WORKFLOW_STREAM_SERVER_RUN_ID'), runId);
2019
+ }
2020
+ runId?.dispose();
2021
+ const deploymentId = own(value, 'deploymentId');
2022
+ if (deploymentId?.isString) {
2023
+ define(stream, sym('WORKFLOW_STREAM_SERVER_DEPLOYMENT_ID'), deploymentId);
2024
+ }
2025
+ deploymentId?.dispose();
2026
+ return stream;
2027
+ },
2028
+ };
2029
+ function buildTypedArray(tag, base64) {
2030
+ const Constructor = typedArrayConstructors.get(tag);
2031
+ if (!Constructor)
2032
+ throw new Error(`${tag} is not available in the VM`);
2033
+ // Parse operations build guest values, so a reduced base64 payload
2034
+ // arrives as a guest string handle.
2035
+ const raw = isHandle(base64) ? base64.toString() : base64;
2036
+ const bytes = base64ToBytes(raw);
2037
+ const buffer = vm.newArrayBuffer(bytes.buffer.slice(bytes.byteOffset, bytes.byteOffset + bytes.byteLength));
2038
+ try {
2039
+ return vm.construct(Constructor, buffer);
2040
+ }
2041
+ finally {
2042
+ buffer.dispose();
2043
+ }
2044
+ }
2045
+ function lookupRegisteredClass(classId) {
2046
+ if (classId === undefined)
2047
+ return undefined;
2048
+ const registry = own(vm.global, sym('workflow-class-registry'));
2049
+ if (!registry || registry.isUndefined) {
2050
+ registry?.dispose();
2051
+ return undefined;
2052
+ }
2053
+ try {
2054
+ const getMethod = chained(registry, 'get');
2055
+ if (!getMethod)
2056
+ return undefined;
2057
+ try {
2058
+ const key = vm.newString(classId);
2059
+ const cls = call(getMethod, registry, key);
2060
+ key.dispose();
2061
+ if (cls.isUndefined || cls.typeof !== 'function') {
2062
+ cls.dispose();
2063
+ return undefined;
2064
+ }
2065
+ return cls;
2066
+ }
2067
+ finally {
2068
+ getMethod.dispose();
2069
+ }
2070
+ }
2071
+ finally {
2072
+ registry.dispose();
2073
+ }
2074
+ }
2075
+ // --- public API ---
2076
+ return {
2077
+ reducerKeys: Object.keys(reducers),
2078
+ reviverKeys: Object.keys(revivers),
2079
+ installProcessEnv(env) {
2080
+ const env_2 = { stack: [], error: void 0, hasError: false };
2081
+ try {
2082
+ const plain = {};
2083
+ for (const [key, value] of Object.entries(env)) {
2084
+ if (typeof value === 'string')
2085
+ plain[key] = value;
2086
+ }
2087
+ const envHandle = __addDisposableResource(env_2, vm.hostToHandle(plain), false);
2088
+ call(i.objectFreeze, vm.undefined, envHandle).dispose();
2089
+ const processHandle = __addDisposableResource(env_2, vm.newObject(), false);
2090
+ define(processHandle, 'env', envHandle);
2091
+ vm.setProp(vm.global, 'process', processHandle);
2092
+ }
2093
+ catch (e_2) {
2094
+ env_2.error = e_2;
2095
+ env_2.hasError = true;
2096
+ }
2097
+ finally {
2098
+ __disposeResources(env_2);
2099
+ }
2100
+ },
2101
+ serialize(value) {
2102
+ // Handle scope: reducers and the hybrid operations mint one handle
2103
+ // per visited value node (descriptor reads, dup()s, intrinsic call
2104
+ // results) and nothing disposes them individually. Without the
2105
+ // scope each serialize leaks ~one handle per node for the VM's
2106
+ // lifetime, which compounds across an inline-loop session's whole
2107
+ // batch. Requires quickjs-wasi >= 3.3.1: earlier versions also
2108
+ // scope-tracked the handles the host-callback trampoline wraps
2109
+ // around C-owned argv pointers, and disposing those (Map/Set/
2110
+ // Headers forEach visitors run mid-pass) corrupted the guest heap;
2111
+ // 3.3.1 marks them borrowed and scope-exempt. The input handle is
2112
+ // caller-owned (created before the scope) and the output is host
2113
+ // bytes, so nothing escapes.
2114
+ //
2115
+ // `identities` must be cleared per pass ONCE handles are bulk-freed:
2116
+ // it keys object identity on the raw guest pointer, and freeing
2117
+ // handles lets QuickJS reuse pointers, so a stale entry from an
2118
+ // earlier pass could then alias a different object and corrupt the
2119
+ // dedup/cycle detection. Identity only needs stability within one
2120
+ // stringify pass.
2121
+ try {
2122
+ const payload = vm.withScope(() => encoder.encode(stringify(value, reducers, { operations: stringifyOperations })));
2123
+ const prefix = encoder.encode(SerializationFormat.DEVALUE_V1);
2124
+ const result = new Uint8Array(prefix.length + payload.length);
2125
+ result.set(prefix, 0);
2126
+ result.set(payload, prefix.length);
2127
+ return result;
2128
+ }
2129
+ finally {
2130
+ identities.clear();
2131
+ }
2132
+ },
2133
+ deserialize(data) {
2134
+ if (data.length < FORMAT_PREFIX_LENGTH) {
2135
+ throw new Error('Data too short to contain format prefix');
2136
+ }
2137
+ const prefix = decoder.decode(data.subarray(0, FORMAT_PREFIX_LENGTH));
2138
+ if (prefix !== SerializationFormat.DEVALUE_V1) {
2139
+ throw new Error(`Unsupported serialization format: ${prefix}`);
2140
+ }
2141
+ const payload = decoder.decode(data.subarray(FORMAT_PREFIX_LENGTH));
2142
+ // Handle scope, mirroring serialize(): revivers mint intermediate
2143
+ // handles (children already attached to their parents, intrinsic
2144
+ // call results) that are safe to free once the graph is built:
2145
+ // guest values are refcounted, so parents keep their children
2146
+ // alive. Only the root escapes to the caller.
2147
+ return vm.withScope((scope) => scope.escape(parse(payload, revivers, {
2148
+ operations: parseOperations,
2149
+ })));
2150
+ },
2151
+ dispose() {
2152
+ for (const handle of disposables.reverse())
2153
+ handle.dispose();
2154
+ disposables.length = 0;
2155
+ identities.clear();
2156
+ },
2157
+ };
2158
+ }
2159
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicXVpY2tqcy1zZXJkZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9ydW50aW1lL3F1aWNranMtc2VyZGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FxQ0c7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBRUgsT0FBTyxFQUNMLDBCQUEwQixFQUMxQixrQkFBa0IsRUFFbEIsS0FBSyxFQUVMLFNBQVMsR0FDVixNQUFNLFNBQVMsQ0FBQztBQUNqQixPQUFPLEVBQUUsYUFBYSxFQUFnQixNQUFNLGNBQWMsQ0FBQztBQUMzRCxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUVoRSxNQUFNLE9BQU8sR0FBRyxJQUFJLFdBQVcsRUFBRSxDQUFDO0FBQ2xDLE1BQU0sT0FBTyxHQUFHLElBQUksV0FBVyxFQUFFLENBQUM7QUFDbEMsTUFBTSxvQkFBb0IsR0FBRyxDQUFDLENBQUM7QUFlL0IsTUFBTSxlQUFlLEdBQ25CLE9BQVEsVUFBbUMsQ0FBQyxVQUFVLEtBQUssVUFBVTtJQUNyRSxPQUFRLFVBQVUsQ0FBQyxTQUE4QixDQUFDLFFBQVEsS0FBSyxVQUFVLENBQUM7QUFDNUUsTUFBTSxTQUFTLEdBQUcsT0FBTyxNQUFNLEtBQUssVUFBVSxDQUFDO0FBRS9DLFNBQVMsYUFBYSxDQUFDLEtBQWlCO0lBQ3RDLElBQUksS0FBSyxDQUFDLE1BQU0sS0FBSyxDQUFDO1FBQUUsT0FBTyxHQUFHLENBQUM7SUFDbkMsSUFBSSxlQUFlLEVBQUUsQ0FBQztRQUNwQixPQUFRLEtBQTBCLENBQUMsUUFBUSxFQUFFLEVBQVksQ0FBQztJQUM1RCxDQUFDO0lBQ0QsSUFBSSxTQUFTLEVBQUUsQ0FBQztRQUNkLE9BQU8sTUFBTSxDQUFDLElBQUksQ0FDaEIsS0FBSyxDQUFDLE1BQU0sRUFDWixLQUFLLENB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LENBQUMsSUFBZ0I7WUFDMUIsSUFBSSxJQUFJLENBQUMsTUFBTSxHQUFHLG9CQUFvQixFQUFFLENBQUM7Z0JBQ3ZDLE1BQU0sSUFBSSxLQUFLLENBQUMseUNBQXlDLENBQUMsQ0FBQztZQUM3RCxDQUFDO1lBQ0QsTUFBTSxNQUFNLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxvQkFBb0IsQ0FBQyxDQUFDLENBQUM7WUFDdEUsSUFBSSxNQUFNLEtBQUssbUJBQW1CLENBQUMsVUFBVSxFQUFFLENBQUM7Z0JBQzlDLE1BQU0sSUFBSSxLQUFLLENBQUMscUNBQXFDLE1BQU0sRUFBRSxDQUFDLENBQUM7WUFDakUsQ0FBQztZQUNELE1BQU0sT0FBTyxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDLENBQUM7WUFDcEUsa0VBQWtFO1lBQ2xFLGlFQUFpRTtZQUNqRSwrREFBK0Q7WUFDL0QsOERBQThEO1lBQzlELDhDQUE4QztZQUM5QyxPQUFPLEVBQUUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUM1QixLQUFLLENBQUMsTUFBTSxDQUNWLEtBQUssQ0FBQyxPQUFPLEVBQUUsUUFBUSxFQUFFO2dCQUN2QixVQUFVLEVBQUUsZUFBZTthQUM1QixDQUFrQixDQUNwQixDQUNGLENBQUM7UUFDSixDQUFDO1FBQ0QsT0FBTztZQUNMLEtBQUssTUFBTSxNQUFNLElBQUksV0FBVyxDQUFDLE9BQU8sRUFBRTtnQkFBRSxNQUFNLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDN0QsV0FBVyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7WUFDdkIsVUFBVSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ3JCLENBQUM7S0FDRixDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogSG9zdC1zaWRlIHNlcmlhbGl6YXRpb24gZm9yIHRoZSBRdWlja0pTIGVuZ2luZS5cbiAqXG4gKiBJbXBsZW1lbnRzIHRoZSB3b3JrZmxvdyB3aXJlIGNvZGVjIChmb3JtYXQtcHJlZml4ZWQgZGV2YWx1ZSwgaWRlbnRpY2FsIHRvXG4gKiBgY29kZWMtZGV2YWx1ZS12bS50c2AgLyB0aGUgbm9kZTp2bSBlbmdpbmUncyB3b3JrZmxvdy1tb2RlIGNvZGVjKSBhc1xuICogaG9zdCBjb2RlIG9wZXJhdGluZyBvbiBgSlNWYWx1ZUhhbmRsZWBzLCB1c2luZyBkZXZhbHVlIDUuOSdzIHBsdWdnYWJsZVxuICogb3BlcmF0aW9ucyAocXVpY2tqcy13YXNpJ3MgaG9zdC1zaWRlIGludHJvc3BlY3Rpb24gcHJpbWl0aXZlcyB1bmRlcm5lYXRoKS5cbiAqIFRoZSBzZXJkZSBidW5kbGUgcHJldmlvdXNseSBldmFsdWF0ZWQgaW5zaWRlIHRoZSBWTSBpcyBnb25lOiBndWVzdCB2YWx1ZXNcbiAqIGFyZSByZWFkIGFuZCBidWlsdCB0aHJvdWdoIGhhbmRsZXMsIHNvIG5vIHNlcmlhbGl6ZXIgY29kZSBsaXZlcyBpbiAob3JcbiAqIGNhbiBiZSB0YW1wZXJlZCB3aXRoIGZyb20pIHRoZSBndWVzdCByZWFsbS5cbiAqXG4gKiBTaWRlLWVmZmVjdCBkaXNjaXBsaW5lIG1pcnJvcnMgdGhlIG5vZGU6dm0gZW5naW5lJ3MgaGFyZGVuZWQgY29kZWNcbiAqIChzZXJpYWxpemF0aW9uL2hhcmRlbmVkLnRzKTpcbiAqXG4gKiAtIGNsYXNzaWZpY2F0aW9uIGlzIGJ5IGVuZ2luZSBicmFuZCAoYGNsYXNzSWRgIGFnYWluc3QgYm9vdC1jYXB0dXJlZFxuICogICBzYW1wbGVzLCBgaXNFcnJvcmAsIGBpc1Byb3h5YCksIG5ldmVyIGBpbnN0YW5jZW9mYCBvclxuICogICBgU3ltYm9sLnRvU3RyaW5nVGFnYDtcbiAqIC0gZXh0cmFjdGlvbiBnb2VzIHRocm91Z2ggaW50cmluc2ljcyBjYXB0dXJlZCBhdCBib290IChiZWZvcmUgYW55IHVzZXJcbiAqICAgY29kZSBydW5zKSBpbnZva2VkIHdpdGggZXhwbGljaXQgcmVjZWl2ZXJzLCBvciB0aHJvdWdoIG93bi1wcm9wZXJ0eVxuICogICBkZXNjcmlwdG9yIHJlYWRzLCBzbyBwYXRjaGVkIHByb3RvdHlwZXMgYW5kIGluaGVyaXRlZCBhY2Nlc3NvcnMgbmV2ZXJcbiAqICAgcnVuO1xuICogLSB0aGUgb25seSBndWVzdCBjb2RlIHNlcmlhbGl6YXRpb24gY2FuIGV4ZWN1dGUgaXMgdGhlIHNhbWUgY29kZSB0aGVcbiAqICAgcHJldmlvdXMgaW4tVk0gY29kZWMgZXhlY3V0ZWQgYnkgY29udHJhY3Q6IGEgY2xhc3MncyBzdGF0aWNcbiAqICAgYFdPUktGTE9XX1NFUklBTElaRWAgbWV0aG9kLCBhIHN0ZXAgcHJveHkncyBgX19jbG9zdXJlVmFyc0ZuYCwgYW5kXG4gKiAgIGBXT1JLRkxPV19VU0VfU1RFUGAgLyBgV09SS0ZMT1dfREVTRVJJQUxJWkVgIG9uIHJldml2YWwuXG4gKlxuICogV2lyZS1mb3JtYXQgcGFyaXR5IHdpdGggdGhlIHByZXZpb3VzIGluLVZNIGNvZGVjIGlzIFJFUVVJUkVEIGFuZCBjb3ZlcmVkXG4gKiBieSB0ZXN0czogZXZlbnQgbG9ncyB3cml0dGVuIGJ5IGVpdGhlciBjb2RlYyBtdXN0IGJlIHJlYWRhYmxlIGJ5IHRoZVxuICogb3RoZXIgKHN0ZXBzIHNlcmlhbGl6ZWQgYnkgdGhlIG5vZGUgcnVudGltZSBmZWVkIFZNIHJldml2YWwgYW5kIHZpY2VcbiAqIHZlcnNhKS5cbiAqXG4gKiBIeWJyaWQgdmFsdWUgc3BhY2U6IHJlZHVjZXJzIHJldHVybiBob3N0IHNoYXBlcyAocGxhaW4gb2JqZWN0cywgc3RyaW5ncyxcbiAqIG51bWJlcnMpIHdob3NlIGxlYXZlcyBtYXkgYmUgZ3Vlc3QgaGFuZGxlcywgZXhhY3RseSBob3cgdGhlIG5vZGU6dm1cbiAqIGNvZGVjIG1peGVzIGhvc3Qgc2hhcGVzIHdpdGggc2FuZGJveC1yZWFsbSBsZWF2ZXMuIEV2ZXJ5IHN0cmluZ2lmeVxuICogb3BlcmF0aW9uIHRoZXJlZm9yZSBkaXNwYXRjaGVzIG9uIGBKU1ZhbHVlSGFuZGxlYCBhbmQgZmFsbHMgYmFjayB0b1xuICogZGV2YWx1ZSdzIGRlZmF1bHQgaG9zdCBvcGVyYXRpb25zIGZvciBob3N0IHZhbHVlcy4gUGFyc2Ugb3BlcmF0aW9uc1xuICogYWx3YXlzIGJ1aWxkIGd1ZXN0IHZhbHVlcywgc28gdGhlIHBhcnNlIHNpZGUgaXMgaGFuZGxlLW9ubHkuXG4gKi9cblxuaW1wb3J0IHtcbiAgZGVmYXVsdFN0cmluZ2lmeU9wZXJhdGlvbnMsXG4gIGZpbHRlckFycmF5SW5kaWNlcyxcbiAgdHlwZSBQYXJzZU9wZXJhdGlvbnMsXG4gIHBhcnNlLFxuICB0eXBlIFN0cmluZ2lmeU9wZXJhdGlvbnMsXG4gIHN0cmluZ2lmeSxcbn0gZnJvbSAnZGV2YWx1ZSc7XG5pbXBvcnQgeyBKU1ZhbHVlSGFuZGxlLCB0eXBlIFF1aWNrSlMgfSBmcm9tICdxdWlja2pzLXdhc2knO1xuaW1wb3J0IHsgU2VyaWFsaXphdGlvbkZvcm1hdCB9IGZyb20gJy4uL3NlcmlhbGl6YXRpb24vdHlwZXMuanMnO1xuXG5jb25zdCBlbmNvZGVyID0gbmV3IFRleHRFbmNvZGVyKCk7XG5jb25zdCBkZWNvZGVyID0gbmV3IFRleHREZWNvZGVyKCk7XG5jb25zdCBGT1JNQVRfUFJFRklYX0xFTkdUSCA9IDQ7XG5cbi8vIC0tLS0gYmFzZTY0IChob3N0LXNpZGU7IHdpcmUtY29tcGF0aWJsZSB3aXRoIHRoZSBvbGQgaW4tVk0gYnRvYSBwYXRoKSAtLS0tXG4vL1xuLy8gRmVhdHVyZS1kZXRlY3RlZCBzbyB0aGUgY29kZWMgY2FycmllcyBubyB1bmNvbmRpdGlvbmFsIE5vZGUgZGVwZW5kZW5jeVxuLy8gKHRoZSBRdWlja0pTIGVuZ2luZSB0YXJnZXRzIFdBU00tY2FwYWJsZSBub24tTm9kZSBob3N0cyB0b28pOiB0aGVcbi8vIEVTLXByb3Bvc2FsIFVpbnQ4QXJyYXkgYmFzZTY0IG1ldGhvZHMgd2hlbiBwcmVzZW50LCBOb2RlJ3MgQnVmZmVyIHdoZW5cbi8vIHByZXNlbnQsIGFuZCBhIGJ0b2EvYXRvYiBsb29wIG90aGVyd2lzZSAodW5pdmVyc2FsbHkgYXZhaWxhYmxlIG9uIHdlYlxuLy8gcnVudGltZXMpLlxuXG50eXBlIEJhc2U2NFVpbnQ4QXJyYXlDdG9yID0gVWludDhBcnJheUNvbnN0cnVjdG9yICYge1xuICBmcm9tQmFzZTY0PzogKHZhbHVlOiBzdHJpbmcpID0+IFVpbnQ4QXJyYXk7XG59O1xudHlwZSBCYXNlNjRVaW50OEFycmF5ID0gVWludDhBcnJheSAmIHsgdG9CYXNlNjQ/OiAoKSA9PiBzdHJpbmcgfTtcblxuY29uc3QgaGFzTmF0aXZlQmFzZTY0ID1cbiAgdHlwZW9mIChVaW50OEFycmF5IGFzIEJhc2U2NFVpbnQ4QXJyYXlDdG9yKS5mcm9tQmFzZTY0ID09PSAnZnVuY3Rpb24nICYmXG4gIHR5cGVvZiAoVWludDhBcnJheS5wcm90b3R5cGUgYXMgQmFzZTY0VWludDhBcnJheSkudG9CYXNlNjQgPT09ICdmdW5jdGlvbic7XG5jb25zdCBoYXNCdWZmZXIgPSB0eXBlb2YgQnVmZmVyID09PSAnZnVuY3Rpb24nO1xuXG5mdW5jdGlvbiBieXRlc1RvQmFzZTY0KGJ5dGVzOiBVaW50OEFycmF5KTogc3RyaW5nIHtcbiAgaWYgKGJ5dGVzLmxlbmd0aCA9PT0gMCkgcmV0dXJuICcuJztcbiAgaWYgKGhhc05hdGl2ZUJhc2U2NCkge1xuICAgIHJldHVybiAoYnl0ZXMgYXMgQmFzZTY0VWludDhBcnJheSkudG9CYXNlNjQ/LigpIGFzIHN0cmluZztcbiAgfVxuICBpZiAoaGFzQnVmZmVyKSB7XG4gICAgcmV0dXJuIEJ1ZmZlci5mcm9tKFxuICAgICAgYnl0ZXMuYnVmZmVyLFxuICAgICAgYnl0ZXMuYnl0ZU9mZnNldCxcbiAgICAgIGJ5dGVzLmJ5dGVMZW5ndGhcbiAgICApLnRvU3RyaW5nKCdiYXNlNjQnKTtcbiAgfVxuICBsZXQgYmluYXJ5ID0gJyc7XG4gIGZvciAobGV0IGlkeCA9IDA7IGlkeCA8IGJ5dGVzLmxlbmd0aDsgaWR4KyspIHtcbiAgICBiaW5hcnkgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShieXRlc1tpZHhdKTtcbiAgfVxuICByZXR1cm4gYnRvYShiaW5hcnkpO1xufVxuXG5mdW5jdGlvbiBiYXNlNjRUb0J5dGVzKHZhbHVlOiBzdHJpbmcpOiBVaW50OEFycmF5IHtcbiAgaWYgKHZhbHVlID09PSAnLicpIHJldHVybiBuZXcgVWludDhBcnJheSgwKTtcbiAgaWYgKGhhc05hdGl2ZUJhc2U2NCkge1xuICAgIHJldHVybiAoVWludDhBcnJheSBhcyBCYXNlNjRVaW50OEFycmF5Q3RvcikuZnJvbUJhc2U2ND8uKFxuICAgICAgdmFsdWVcbiAgICApIGFzIFVpbnQ4QXJyYXk7XG4gIH1cbiAgaWYgKGhhc0J1ZmZlcikge1xuICAgIHJldHVybiBuZXcgVWludDhBcnJheShCdWZmZXIuZnJvbSh2YWx1ZSwgJ2Jhc2U2NCcpKTtcbiAgfVxuICBjb25zdCBiaW5hcnkgPSBhdG9iKHZhbHVlKTtcbiAgY29uc3QgYnl0ZXMgPSBuZXcgVWludDhBcnJheShiaW5hcnkubGVuZ3RoKTtcbiAgZm9yIChsZXQgaWR4ID0gMDsgaWR4IDwgYmluYXJ5Lmxlbmd0aDsgaWR4KyspIHtcbiAgICBieXRlc1tpZHhdID0gYmluYXJ5LmNoYXJDb2RlQXQoaWR4KTtcbiAgfVxuICByZXR1cm4gYnl0ZXM7XG59XG5cbi8vIC0tLS0gYm9vdC10aW1lIGNhcHR1cmVzIC0tLS1cblxuLyoqIGRldmFsdWUgdGFncyBkZWNpZGVkIGJ5IGVuZ2luZSBjbGFzcyBpZCwgc2FtcGxlZCBhdCBib290LiAqL1xuY29uc3QgQlJBTkRFRF9TQU1QTEVTID0gYCh7XG4gIE51bWJlcjogbmV3IE51bWJlcigwKSxcbiAgU3RyaW5nOiBuZXcgU3RyaW5nKCcnKSxcbiAgQm9vbGVhbjogbmV3IEJvb2xlYW4oZmFsc2UpLFxuICBCaWdJbnQ6IE9iamVjdCgwbiksXG4gIERhdGU6IG5ldyBEYXRlKDApLFxuICBSZWdFeHA6IC94LyxcbiAgQXJyYXk6IFtdLFxuICBTZXQ6IG5ldyBTZXQoKSxcbiAgTWFwOiBuZXcgTWFwKCksXG4gIEFycmF5QnVmZmVyOiBuZXcgQXJyYXlCdWZmZXIoMCksXG4gIERhdGFWaWV3OiBuZXcgRGF0YVZpZXcobmV3IEFycmF5QnVmZmVyKDApKSxcbiAgSW50OEFycmF5OiBuZXcgSW50OEFycmF5KDApLFxuICBVaW50OEFycmF5OiBuZXcgVWludDhBcnJheSgwKSxcbiAgVWludDhDbGFtcGVkQXJyYXk6IG5ldyBVaW50OENsYW1wZWRBcnJheSgwKSxcbiAgSW50MTZBcnJheTogbmV3IEludDE2QXJyYXkoMCksXG4gIFVpbnQxNkFycmF5OiBuZXcgVWludDE2QXJyYXkoMCksXG4gIEludDMyQXJyYXk6IG5ldyBJbnQzMkFycmF5KDApLFxuICBVaW50MzJBcnJheTogbmV3IFVpbnQzMkFycmF5KDApLFxuICBGbG9hdDMyQXJyYXk6IG5ldyBGbG9hdDMyQXJyYXkoMCksXG4gIEZsb2F0NjRBcnJheTogbmV3IEZsb2F0NjRBcnJheSgwKSxcbiAgQmlnSW50NjRBcnJheTogbmV3IEJpZ0ludDY0QXJyYXkoMCksXG4gIEJpZ1VpbnQ2NEFycmF5OiBuZXcgQmlnVWludDY0QXJyYXkoMCksXG59KWA7XG5cbi8qKlxuICogSW50cmluc2ljcyBuZWVkZWQgZm9yIHJlYWRpbmcgYW5kIGJ1aWxkaW5nLCBjYXB0dXJlZCBmcm9tIHRoZSBndWVzdCByZWFsbVxuICogYXQgc2VyZGUgY3JlYXRpb24gKHdoaWNoIHRoZSBydW50aW1lIGRvZXMgcmlnaHQgYWZ0ZXIgZXZhbHVhdGluZyB0aGVcbiAqIGJvb3RzdHJhcCwgYmVmb3JlIHRoZSB3b3JrZmxvdyBidW5kbGUpLiBIZWxkIG9ubHkgb24gdGhlIGhvc3Q6IGxhdGVyXG4gKiBwYXRjaGluZyBpbnNpZGUgdGhlIFZNIGNhbm5vdCBpbmZsdWVuY2Ugc2VyaWFsaXphdGlvbi5cbiAqXG4gKiBHbG9iYWxzIGluc3RhbGxlZCBieSB0aGUgZXh0ZW5zaW9ucy9ib290c3RyYXAgKEhlYWRlcnMsIFJlcXVlc3QsXG4gKiBSZXNwb25zZSwgUmVhZGFibGVTdHJlYW0sIFdyaXRhYmxlU3RyZWFtLCBVUkwsIFVSTFNlYXJjaFBhcmFtcyxcbiAqIERPTUV4Y2VwdGlvbiwgX19Xb3JrZmxvd0Fib3J0U2lnbmFsKSBhcmUgY2FwdHVyZWQgZGVmZW5zaXZlbHk6IGFic2VudFxuICogb25lcyB5aWVsZCBgdW5kZWZpbmVkYCBhbmQgdGhlaXIgcmVkdWNlcnMgbmV2ZXIgbWF0Y2gsIGV4YWN0bHlcbiAqIGxpa2UgdGhlIG9sZCBpbi1WTSByZWR1Y2VycycgYGdsb2JhbFRoaXMuWGAgcHJvYmVzLlxuICovXG5jb25zdCBDQVBUVVJFX0lOVFJJTlNJQ1MgPSBgKCgpID0+IHtcbiAgY29uc3QgZGVzY3JpcHRvciA9IChvYmplY3QsIGtleSkgPT5cbiAgICBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCwga2V5KTtcbiAgY29uc3QgZ2V0dGVyID0gKG9iamVjdCwga2V5KSA9PiB7XG4gICAgY29uc3QgZCA9IGRlc2NyaXB0b3Iob2JqZWN0LCBrZXkpO1xuICAgIHJldHVybiBkICYmIGQuZ2V0O1xuICB9O1xuICBjb25zdCBUeXBlZEFycmF5ID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKEludDhBcnJheS5wcm90b3R5cGUpO1xuICBjb25zdCBtYXliZVByb3RvID0gKENscykgPT4gKENscyA/IENscy5wcm90b3R5cGUgOiB1bmRlZmluZWQpO1xuICBjb25zdCBnID0gZ2xvYmFsVGhpcztcblxuICByZXR1cm4ge1xuICAgIC8vIC0tLSByZWFkaW5nIChzdHJpbmdpZnkpIC0tLVxuICAgIGRhdGVHZXRUaW1lOiBEYXRlLnByb3RvdHlwZS5nZXRUaW1lLFxuICAgIGRhdGVUb0lTT1N0cmluZzogRGF0ZS5wcm90b3R5cGUudG9JU09TdHJpbmcsXG4gICAgcmVnRXhwU291cmNlOiBnZXR0ZXIoUmVnRXhwLnByb3RvdHlwZSwgJ3NvdXJjZScpLFxuICAgIHJlZ0V4cEZsYWdzOiBnZXR0ZXIoUmVnRXhwLnByb3RvdHlwZSwgJ2ZsYWdzJyksXG4gICAgbnVtYmVyVmFsdWVPZjogTnVtYmVyLnByb3RvdHlwZS52YWx1ZU9mLFxuICAgIHN0cmluZ1ZhbHVlT2Y6IFN0cmluZy5wcm90b3R5cGUudmFsdWVPZixcbiAgICBib29sZWFuVmFsdWVPZjogQm9vbGVhbi5wcm90b3R5cGUudmFsdWVPZixcbiAgICBiaWdJbnRWYWx1ZU9mOiBCaWdJbnQucHJvdG90eXBlLnZhbHVlT2YsXG4gICAgYmlnSW50VG9TdHJpbmc6IEJpZ0ludC5wcm90b3R5cGUudG9TdHJpbmcsXG4gICAgc2V0Rm9yRWFjaDogU2V0LnByb3RvdHlwZS5mb3JFYWNoLFxuICAgIG1hcEZvckVhY2g6IE1hcC5wcm90b3R5cGUuZm9yRWFjaCxcbiAgICBoZWFkZXJzRm9yRWFjaDogZy5IZWFkZXJzID8gZy5IZWFkZXJzLnByb3RvdHlwZS5mb3JFYWNoIDogdW5kZWZpbmVkLFxuICAgIHVybEhyZWY6IGcuVVJMID8gZ2V0dGVyKGcuVVJMLnByb3RvdHlwZSwgJ2hyZWYnKSA6IHVuZGVmaW5lZCxcbiAgICB1cmxTZWFyY2hQYXJhbXNUb1N0cmluZzogZy5VUkxTZWFyY2hQYXJhbXNcbiAgICAgID8gZy5VUkxTZWFyY2hQYXJhbXMucHJvdG90eXBlLnRvU3RyaW5nXG4gICAgICA6IHVuZGVmaW5lZCxcbiAgICB1cmxTZWFyY2hQYXJhbXNTaXplOiBnLlVSTFNlYXJjaFBhcmFtc1xuICAgICAgPyBnZXR0ZXIoZy5VUkxTZWFyY2hQYXJhbXMucHJvdG90eXBlLCAnc2l6ZScpXG4gICAgICA6IHVuZGVmaW5lZCxcbiAgICB2aWV3QnVmZmVyOiBnZXR0ZXIoVHlwZWRBcnJheSwgJ2J1ZmZlcicpLFxuICAgIHZpZXdCeXRlT2Zmc2V0OiBnZXR0ZXIoVHlwZWRBcnJheSwgJ2J5dGVPZmZzZXQnKSxcbiAgICB2aWV3Qnl0ZUxlbmd0aDogZ2V0dGVyKFR5cGVkQXJyYXksICdieXRlTGVuZ3RoJyksXG4gICAgdmlld0xlbmd0aDogZ2V0dGVyKFR5cGVkQXJyYXksICdsZW5ndGgnKSxcbiAgICBkYXRhVmlld0J1ZmZlcjogZ2V0dGVyKERhdGFWaWV3LnByb3RvdHlwZSwgJ2J1ZmZlcicpLFxuICAgIGRhdGFWaWV3Qnl0ZU9mZnNldDogZ2V0dGVyKERhdGFWaWV3LnByb3RvdHlwZSwgJ2J5dGVPZmZzZXQnKSxcbiAgICBkYXRhVmlld0J5dGVMZW5ndGg6IGdldHRlcihEYXRhVmlldy5wcm90b3R5cGUsICdieXRlTGVuZ3RoJyksXG4gICAgYXJyYXlCdWZmZXJCeXRlTGVuZ3RoOiBnZXR0ZXIoQXJyYXlCdWZmZXIucHJvdG90eXBlLCAnYnl0ZUxlbmd0aCcpLFxuICAgIG9iamVjdFByb3RvdHlwZTogT2JqZWN0LnByb3RvdHlwZSxcbiAgICBlcnJvclByb3RvdHlwZTogRXJyb3IucHJvdG90eXBlLFxuICAgIGRvbUV4Y2VwdGlvblByb3RvdHlwZTogbWF5YmVQcm90byhnLkRPTUV4Y2VwdGlvbiksXG4gICAgaGVhZGVyc1Byb3RvdHlwZTogbWF5YmVQcm90byhnLkhlYWRlcnMpLFxuICAgIHJlcXVlc3RQcm90b3R5cGU6IG1heWJlUHJvdG8oZy5SZXF1ZXN0KSxcbiAgICByZXNwb25zZVByb3RvdHlwZTogbWF5YmVQcm90byhnLlJlc3BvbnNlKSxcbiAgICByZWFkYWJsZVN0cmVhbVByb3RvdHlwZTogbWF5YmVQcm90byhnLlJlYWRhYmxlU3RyZWFtKSxcbiAgICB3cml0YWJsZVN0cmVhbVByb3RvdHlwZTogbWF5YmVQcm90byhnLldyaXRhYmxlU3RyZWFtKSxcbiAgICB1cmxQcm90b3R5cGU6IG1heWJlUHJvdG8oZy5VUkwpLFxuICAgIHVybFNlYXJjaFBhcmFtc1Byb3RvdHlwZTogbWF5YmVQcm90byhnLlVSTFNlYXJjaFBhcmFtcyksXG5cbiAgICAvLyAtLS0gYnVpbGRpbmcgKHBhcnNlKSAtLS1cbiAgICBEYXRlLCBSZWdFeHAsIFNldCwgTWFwLCBBcnJheSwgT2JqZWN0LCBEYXRhVmlldyxcbiAgICBJbnQ4QXJyYXksIFVpbnQ4QXJyYXksIFVpbnQ4Q2xhbXBlZEFycmF5LCBJbnQxNkFycmF5LCBVaW50MTZBcnJheSxcbiAgICBJbnQzMkFycmF5LCBVaW50MzJBcnJheSwgRmxvYXQzMkFycmF5LCBGbG9hdDY0QXJyYXksXG4gICAgQmlnSW50NjRBcnJheSwgQmlnVWludDY0QXJyYXksXG4gICAgRXJyb3IsXG4gICAgQWdncmVnYXRlRXJyb3I6IGcuQWdncmVnYXRlRXJyb3IsXG4gICAgRXZhbEVycm9yLCBSYW5nZUVycm9yLCBSZWZlcmVuY2VFcnJvciwgU3ludGF4RXJyb3IsIFR5cGVFcnJvciwgVVJJRXJyb3IsXG4gICAgRE9NRXhjZXB0aW9uOiBnLkRPTUV4Y2VwdGlvbixcbiAgICBIZWFkZXJzOiBnLkhlYWRlcnMsXG4gICAgUmVxdWVzdDogZy5SZXF1ZXN0LFxuICAgIFJlc3BvbnNlOiBnLlJlc3BvbnNlLFxuICAgIFJlYWRhYmxlU3RyZWFtOiBnLlJlYWRhYmxlU3RyZWFtLFxuICAgIFdyaXRhYmxlU3RyZWFtOiBnLldyaXRhYmxlU3RyZWFtLFxuICAgIFVSTDogZy5VUkwsXG4gICAgVVJMU2VhcmNoUGFyYW1zOiBnLlVSTFNlYXJjaFBhcmFtcyxcbiAgICBzZXRBZGQ6IFNldC5wcm90b3R5cGUuYWRkLFxuICAgIG1hcFNldDogTWFwLnByb3RvdHlwZS5zZXQsXG4gICAgb2JqZWN0Q3JlYXRlOiBPYmplY3QuY3JlYXRlLFxuICAgIGRlZmluZVByb3BlcnR5OiBPYmplY3QuZGVmaW5lUHJvcGVydHksXG4gICAgZGF0ZU5vdzogRGF0ZS5ub3csXG4gICAgb2JqZWN0RnJlZXplOiBPYmplY3QuZnJlZXplLFxuICAgIGZ1bmN0aW9uQmluZDogRnVuY3Rpb24ucHJvdG90eXBlLmJpbmQsXG4gICAgbWFrZVNwYXJzZUFycmF5OiAobGVuZ3RoKSA9PiB7XG4gICAgICBjb25zdCBhcnJheSA9IFtdO1xuICAgICAgYXJyYXlbNDI5NDk2NzI5NF0gPSB1bmRlZmluZWQ7XG4gICAgICBkZWxldGUgYXJyYXlbNDI5NDk2NzI5NF07XG4gICAgICBhcnJheS5sZW5ndGggPSBsZW5ndGg7XG4gICAgICByZXR1cm4gYXJyYXk7XG4gICAgfSxcbiAgICAvLyBCdWlsZHMgdGhlIGNsb3N1cmUtdmFycyB0aHVuayBhIHJldml2ZWQgc3RlcCBwcm94eSBjYXJyaWVzLiBNdXN0IGJlIGFcbiAgICAvLyBndWVzdCBjbG9zdXJlICh0aGUgcHJveHkgc3RvcmVzIGFuZCBsYXRlciBjYWxscyBpdCBmcm9tIGd1ZXN0IGNvZGUpLlxuICAgIG1ha2VUaHVuazogKHZhcnMpID0+ICgpID0+IHZhcnMsXG4gIH07XG59KSgpYDtcblxuLyoqXG4gKiBXZWxsLWtub3duIHN5bWJvbHMgdGhlIHJlZHVjZXJzL3Jldml2ZXJzIHJlYWQgb3Igc3RhbXAsIGNhcHR1cmVkIGFzIGd1ZXN0XG4gKiBzeW1ib2wgaGFuZGxlcyBzbyBkZXNjcmlwdG9yIHJlYWRzL3dyaXRlcyBjYW4gYmUga2V5ZWQgb24gdGhlbS5cbiAqL1xuY29uc3QgU1lNQk9MX05BTUVTID0gW1xuICAnV09SS0ZMT1dfQUJPUlRfU1RSRUFNX05BTUUnLFxuICAnV09SS0ZMT1dfQUJPUlRfSE9PS19UT0tFTicsXG4gICdCT0RZX0lOSVQnLFxuICAnV09SS0ZMT1dfU1RSRUFNX05BTUUnLFxuICAnV09SS0ZMT1dfU1RSRUFNX1RZUEUnLFxuICAnV09SS0ZMT1dfU1RSRUFNX0ZSQU1JTkcnLFxuICAnV09SS0ZMT1dfU1RSRUFNX1NFUlZFUl9SVU5fSUQnLFxuICAnV09SS0ZMT1dfU1RSRUFNX1NFUlZFUl9ERVBMT1lNRU5UX0lEJyxcbiAgJ1dFQkhPT0tfUkVTUE9OU0VfV1JJVEFCTEUnLFxuICAnV09SS0ZMT1dfVVNFX1NURVAnLFxuICAnd29ya2Zsb3ctc2VyaWFsaXplJywgLy8gQHdvcmtmbG93L3NlcmRlIFdPUktGTE9XX1NFUklBTElaRVxuICAnd29ya2Zsb3ctZGVzZXJpYWxpemUnLCAvLyBAd29ya2Zsb3cvc2VyZGUgV09SS0ZMT1dfREVTRVJJQUxJWkVcbiAgJ3dvcmtmbG93LWNsYXNzLXJlZ2lzdHJ5JyxcbiAgJ0B3b3JrZmxvdy9lcnJvcnMvL0ZhdGFsRXJyb3InLFxuICAnQHdvcmtmbG93L2Vycm9ycy8vSG9va0NvbmZsaWN0RXJyb3InLFxuICAnQHdvcmtmbG93L2Vycm9ycy8vUmV0cnlhYmxlRXJyb3InLFxuICAnQHdvcmtmbG93L2Vycm9ycy8vUnVudGltZURlY3J5cHRpb25FcnJvcicsXG4gICdAd29ya2Zsb3cvZXJyb3JzLy9TdHJlYW1FcnJvcicsXG5dIGFzIGNvbnN0O1xudHlwZSBTeW1ib2xOYW1lID0gKHR5cGVvZiBTWU1CT0xfTkFNRVMpW251bWJlcl07XG5cbi8qKlxuICogVGhlIHNpbmdsZSBndWVzdCBleHByZXNzaW9uIHRoYXQgcGVyZm9ybXMgRVZFUlkgZ3Vlc3QtdG91Y2hpbmcgcGFydCBvZlxuICogc2VyZGUgaW5pdGlhbGl6YXRpb246IHRoZSBpbnRyaW5zaWNzIGNhcHR1cmUsIHRoZSBicmFuZGVkIHNhbXBsZXMsIGFuZFxuICogdGhlIHdlbGwta25vd24gc3ltYm9sIGxvb2t1cHMsIGJ1bmRsZWQgaW50byBvbmUgY29udGFpbmVyIG9iamVjdC5cbiAqXG4gKiBCdW5kbGluZyBtYXR0ZXJzIGZvciB0aGUgYmFzZWxpbmUtc25hcHNob3QgcGF0aDogdGhlIGNvbnRhaW5lciBpc1xuICogY3JlYXRlZCBCRUZPUkUgdGhlIHdvcmtmbG93IGJ1bmRsZSBldmFsdWF0ZXMgKGNhcHR1cmUtYmVmb3JlLXVzZXItY29kZSxcbiAqIHNhbWUgYXMgdGhlIGZyZXNoIHBhdGgpLCBpdHMgaGFuZGxlJ3MgYm94IGxpdmVzIGluIHRoZSBzbmFwc2hvdCdzXG4gKiBsaW5lYXIgbWVtb3J5LCBhbmQgZXZlcnkgcmVzdG9yZWQgVk0gcmUtYWRvcHRzIGl0IEJZIFBPSU5URVJcbiAqIChgYWRvcHRTZXJkZVJvb3RgKSwgc28gc2VyZGUgaW5pdGlhbGl6YXRpb24gZXhlY3V0ZXMgTk8gZ3Vlc3QgY29kZVxuICogYWZ0ZXIgdXNlciBjb2RlIGhhcyBydW4uIEFueXRoaW5nIGxlc3MgbGV0cyBhIG1vZHVsZS1zY29wZSB3cmFwcGVyXG4gKiBhcm91bmQgZS5nLiBgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcmAgb2JzZXJ2ZSAoYW5kIGJlIG11dGF0ZWRcbiAqIGJ5KSBhIHBvc3QtZXZhbCBjYXB0dXJlLCBkaXZlcmdpbmcgZnJlc2ggYW5kIHJlc3RvcmVkIHJlcGxheXMuXG4gKi9cbmNvbnN0IENBUFRVUkVfUk9PVCA9IGAoKCkgPT4gKHtcbiAgaW50cmluc2ljczogJHtDQVBUVVJFX0lOVFJJTlNJQ1N9LFxuICBzYW1wbGVzOiAke0JSQU5ERURfU0FNUExFU30sXG4gIHN5bWJvbHM6IHtcbiR7U1lNQk9MX05BTUVTLm1hcChcbiAgKG5hbWUpID0+IGAgICAgJHtKU09OLnN0cmluZ2lmeShuYW1lKX06IFN5bWJvbC5mb3IoJHtKU09OLnN0cmluZ2lmeShuYW1lKX0pYFxuKS5qb2luKCcsXFxuJyl9XG4gIH0sXG59KSkoKWA7XG5cbi8qKlxuICogRXZhbHVhdGUgdGhlIHNlcmRlIGNhcHR1cmUgcm9vdCBpbiBhIFZNLiBNdXN0IHJ1biBhZnRlciB0aGUgcnVudGltZVxuICogYm9vdHN0cmFwIGFuZCBCRUZPUkUgYW55IHVzZXIgY29kZS4gVGhlIHJldHVybmVkIGhhbmRsZSBvd25zIHRoZVxuICogY29udGFpbmVyOyBvbiB0aGUgYmFzZWxpbmUtc25hcHNob3QgcGF0aCBpdHMgcmF3IGJveCBwb2ludGVyXG4gKiAoYGhhbmRsZS5wdHJgKSBpcyByZWNvcmRlZCBuZXh0IHRvIHRoZSBzbmFwc2hvdCBhbmQgcmUtYWRvcHRlZCBwZXJcbiAqIHJlc3RvcmVkIFZNIHZpYSB7QGxpbmsgYWRvcHRTZXJkZVJvb3R9LiBEbyBOT1QgZGlzcG9zZSB0aGUgaGFuZGxlXG4gKiBiZWZvcmUgdGhlIHNuYXBzaG90IGlzIHRha2VuICh0aGUgYm94IG11c3Qgc3RheSBsaXZlIGluIHRoZSBtZW1vcnlcbiAqIGltYWdlKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNhcHR1cmVTZXJkZVJvb3Qodm06IFF1aWNrSlMpOiBKU1ZhbHVlSGFuZGxlIHtcbiAgcmV0dXJuIHZtLmV2YWxDb2RlKENBUFRVUkVfUk9PVCk7XG59XG5cbi8qKlxuICogUmUtY3JlYXRlIHRoZSBjYXB0dXJlLXJvb3QgaGFuZGxlIGluIGEgVk0gcmVzdG9yZWQgZnJvbSBhIHNuYXBzaG90XG4gKiB0YWtlbiB3aGlsZSB0aGUgZXhwb3J0ZWQgcm9vdCB3YXMgYWxpdmUsIHZpYSBxdWlja2pzLXdhc2knc1xuICogc25hcHNob3QtcG9ydGFibGUgaGFuZGxlIHRva2VucyAoYGltcG9ydEhhbmRsZWAgZHVwbGljYXRlcyB0aGVcbiAqIHVuZGVybHlpbmcgdmFsdWU6IHRoZSByZXR1cm5lZCBoYW5kbGUgaXMgaW5kZXBlbmRlbnRseSBvd25lZCBhbmQgdGhlXG4gKiBzZXJkZSBkaXNwb3NlcyBpdCBwZXIgcmVzdG9yZWQgVk0pLiBObyBndWVzdCBjb2RlIGV4ZWN1dGVzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYWRvcHRTZXJkZVJvb3Qodm06IFF1aWNrSlMsIHRva2VuOiBudW1iZXIpOiBKU1ZhbHVlSGFuZGxlIHtcbiAgcmV0dXJuIHZtLmltcG9ydEhhbmRsZSh0b2tlbik7XG59XG5cbi8qKlxuICogRXhwb3J0IHRoZSBjYXB0dXJlIHJvb3QgYXMgYSBzbmFwc2hvdC1wb3J0YWJsZSB0b2tlbiB0byByZWNvcmQgbmV4dCB0b1xuICogdGhlIGJhc2VsaW5lIHNuYXBzaG90LiBUaGUgcm9vdCBoYW5kbGUgbXVzdCBzdGF5IHVuZGlzcG9zZWQgdW50aWwgdGhlXG4gKiBzbmFwc2hvdCBpcyB0YWtlbiAoaXRzIGJveCwgYW5kIHRoZSByZWZlcmVuY2UgaXQgaG9sZHMsIG11c3QgYmUgcGFydFxuICogb2YgdGhlIG1lbW9yeSBpbWFnZSkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBleHBvcnRTZXJkZVJvb3Qodm06IFF1aWNrSlMsIHJvb3Q6IEpTVmFsdWVIYW5kbGUpOiBudW1iZXIge1xuICByZXR1cm4gdm0uZXhwb3J0SGFuZGxlKHJvb3QpO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFF1aWNrSlNTZXJkZSB7XG4gIC8qKiBTZXJpYWxpemUgYSBndWVzdCB2YWx1ZSBoYW5kbGUgdG8gZm9ybWF0LXByZWZpeGVkIHdpcmUgYnl0ZXMuICovXG4gIHNlcmlhbGl6ZSh2YWx1ZTogSlNWYWx1ZUhhbmRsZSk6IFVpbnQ4QXJyYXk7XG4gIC8qKiBCdWlsZCBhIGd1ZXN0IHZhbHVlIGluIHRoZSBWTSBmcm9tIGZvcm1hdC1wcmVmaXhlZCB3aXJlIGJ5dGVzLiAqL1xuICBkZXNlcmlhbGl6ZShkYXRhOiBVaW50OEFycmF5KTogSlNWYWx1ZUhhbmRsZTtcbiAgLyoqXG4gICAqIFRoZSByZWR1Y2VyIG5hbWVzIHRoaXMgY29kZWMgYXBwbGllcywgaW4gcmVnaXN0cmF0aW9uIG9yZGVyLiBFeHBvc2VkXG4gICAqIHNvIHRlc3RzIGNhbiBhc3NlcnQgZXhoYXVzdGl2ZW5lc3MgYWdhaW5zdCB0aGUgc2hhcmVkIHZhbHVlLXNwYWNlXG4gICAqIGNvZGVjIChjb2RlYy1kZXZhbHVlLXZtKTogYSByZWR1Y2VyIGFkZGVkIHRoZXJlIGJ1dCBub3QgaGVyZSB3b3VsZFxuICAgKiBvdGhlcndpc2Ugc2lsZW50bHkgcm91bmQtdHJpcCB2YWx1ZXMgYXMgcGxhaW4gb2JqZWN0cy5cbiAgICovXG4gIHJlZHVjZXJLZXlzOiByZWFkb25seSBzdHJpbmdbXTtcbiAgLyoqIFJldml2ZXIgbmFtZXMsIGZvciB0aGUgc2FtZSBleGhhdXN0aXZlbmVzcyBjaGVjay4gKi9cbiAgcmV2aXZlcktleXM6IHJlYWRvbmx5IHN0cmluZ1tdO1xuICAvKipcbiAgICogSW5zdGFsbCBgZ2xvYmFsVGhpcy5wcm9jZXNzID0geyBlbnY6IE9iamVjdC5mcmVlemUoey4uLn0pIH1gIGluIHRoZVxuICAgKiBWTSB0aHJvdWdoIGhhbmRsZXMgYW5kIGJvb3QtY2FwdHVyZWQgaW50cmluc2ljcyBvbmx5OiBubyBndWVzdFxuICAgKiBzb3VyY2UgaXMgZXZhbHVhdGVkLCBzbyBhIG1vZHVsZS1zY29wZSB3cmFwcGVyIGFyb3VuZCBKU09OLnBhcnNlIC9cbiAgICogT2JqZWN0LmZyZWV6ZSBjYW5ub3Qgb2JzZXJ2ZSB0aGUgaW5qZWN0aW9uLiBUaGlzIG1hdHRlcnMgb24gdGhlXG4gICAqIGJhc2VsaW5lLXNuYXBzaG90IHBhdGgsIHdoZXJlIGVudiBpbmplY3Rpb24gaGFwcGVucyBhZnRlciB1c2VyIGNvZGVcbiAgICogcmFuOyBldmFsdWF0aW5nIGd1ZXN0IHNvdXJjZSB0aGVyZSB3b3VsZCBsZXQgcGF0Y2hlZCBnbG9iYWxzIHNlZVxuICAgKiAoYW5kIHBlcnR1cmIpIGl0LCBkaXZlcmdpbmcgZnJvbSB0aGUgZnJlc2ggcGF0aC5cbiAgICovXG4gIGluc3RhbGxQcm9jZXNzRW52KGVudjogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgdW5kZWZpbmVkPik6IHZvaWQ7XG4gIGRpc3Bvc2UoKTogdm9pZDtcbn1cblxuLyoqXG4gKiBDcmVhdGUgdGhlIGhvc3Qtc2lkZSBzZXJkZSBmb3IgYSBWTS4gTXVzdCBiZSBjYWxsZWQgYWZ0ZXIgdGhlIHJ1bnRpbWVcbiAqIGJvb3RzdHJhcCBoYXMgYmVlbiBldmFsdWF0ZWQgKHNvIGJvb3RzdHJhcC1pbnN0YWxsZWQgZ2xvYmFscyBhcmVcbiAqIGNhcHR1cmFibGUpIGFuZCBiZWZvcmUgdGhlIHdvcmtmbG93IGJ1bmRsZSBydW5zLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlUXVpY2tKU1NlcmRlKFxuICB2bTogUXVpY2tKUyxcbiAgLyoqXG4gICAqIFByZS1jYXB0dXJlZCBzZXJkZSByb290IChiYXNlbGluZS1zbmFwc2hvdCBwYXRoKTogdGhlIGNvbnRhaW5lclxuICAgKiBgY2FwdHVyZVNlcmRlUm9vdGAgY3JlYXRlZCBCRUZPUkUgdXNlciBjb2RlLCByZS1hZG9wdGVkIGZyb20gdGhlXG4gICAqIHJlc3RvcmVkIG1lbW9yeSBpbWFnZSB2aWEgYGFkb3B0U2VyZGVSb290YC4gV2hlbiBvbWl0dGVkLCB0aGUgcm9vdFxuICAgKiBpcyBjYXB0dXJlZCBub3c7IGNhbGxlcnMgbXVzdCBndWFyYW50ZWUgbm8gdXNlciBjb2RlIGhhcyBydW4geWV0LlxuICAgKiBFaXRoZXIgd2F5LCBpbml0aWFsaXphdGlvbiBiZWxvdyBwZXJmb3JtcyBvbmx5IHBsYWluLWRhdGEgcHJvcGVydHlcbiAgICogcmVhZHMgYW5kIEMtbGV2ZWwgY2xhc3NJZCByZWFkcyBvbiB0aGUgY29udGFpbmVyOiBOTyBndWVzdCBjb2RlXG4gICAqIGV4ZWN1dGVzIGhlcmUsIHNvIG5vdGhpbmcgdXNlci1wYXRjaGFibGUgY2FuIG9ic2VydmUgb3IgcGVydHVyYiBpdC5cbiAgICovXG4gIGNhcHR1cmVkUm9vdD86IEpTVmFsdWVIYW5kbGVcbik6IFF1aWNrSlNTZXJkZSB7XG4gIGNvbnN0IGRpc3Bvc2FibGVzOiBKU1ZhbHVlSGFuZGxlW10gPSBbXTtcbiAgY29uc3Qga2VlcCA9IChoYW5kbGU6IEpTVmFsdWVIYW5kbGUpOiBKU1ZhbHVlSGFuZGxlID0+IHtcbiAgICBkaXNwb3NhYmxlcy5wdXNoKGhhbmRsZSk7XG4gICAgcmV0dXJuIGhhbmRsZTtcbiAgfTtcbiAgY29uc3QgaXNIYW5kbGUgPSAodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBKU1ZhbHVlSGFuZGxlID0+XG4gICAgdmFsdWUgaW5zdGFuY2VvZiBKU1ZhbHVlSGFuZGxlO1xuXG4gIC8vIC0tLSBib290IGNhcHR1cmUgLS0tXG5cbiAgY29uc3Qgcm9vdCA9IGtlZXAoY2FwdHVyZWRSb290ID8/IGNhcHR1cmVTZXJkZVJvb3Qodm0pKTtcblxuICBjb25zdCB0YWdCeUNsYXNzSWQgPSBuZXcgTWFwPG51bWJlciwgc3RyaW5nPigpO1xuICB7XG4gICAgY29uc3Qgc2FtcGxlcyA9IHJvb3QuZ2V0UHJvcCgnc2FtcGxlcycpO1xuICAgIHRyeSB7XG4gICAgICBmb3IgKGNvbnN0IHRhZyBvZiBzYW1wbGVzLmdldE93blByb3BlcnR5TmFtZXMoKSkge1xuICAgICAgICBjb25zdCBzYW1wbGUgPSBzYW1wbGVzLmdldFByb3AodGFnKTtcbiAgICAgICAgdGFnQnlDbGFzc0lkLnNldChzYW1wbGUuY2xhc3NJZCwgdGFnKTtcbiAgICAgICAgc2FtcGxlLmRpc3Bvc2UoKTtcbiAgICAgIH1cbiAgICB9IGZpbmFsbHkge1xuICAgICAgc2FtcGxlcy5kaXNwb3NlKCk7XG4gICAgfVxuICB9XG5cbiAgY29uc3QgaW50cmluc2ljcyA9IGtlZXAocm9vdC5nZXRQcm9wKCdpbnRyaW5zaWNzJykpO1xuICBjb25zdCBhdCA9IChuYW1lOiBzdHJpbmcpOiBKU1ZhbHVlSGFuZGxlID0+IGtlZXAoaW50cmluc2ljcy5nZXRQcm9wKG5hbWUpKTtcbiAgLyoqIEFic2VudCBjYXB0dXJlcyAoZXh0ZW5zaW9uL2Jvb3RzdHJhcCBnbG9iYWwgbm90IGluc3RhbGxlZCkuICovXG4gIGNvbnN0IG9wdGlvbmFsID0gKG5hbWU6IHN0cmluZyk6IEpTVmFsdWVIYW5kbGUgfCB1bmRlZmluZWQgPT4ge1xuICAgIGNvbnN0IGhhbmRsZSA9IGF0KG5hbWUpO1xuICAgIHJldHVybiBoYW5kbGUuaXNVbmRlZmluZWQgPyB1bmRlZmluZWQgOiBoYW5kbGU7XG4gIH07XG5cbiAgY29uc3QgaSA9IHtcbiAgICBkYXRlR2V0VGltZTogYXQoJ2RhdGVHZXRUaW1lJyksXG4gICAgZGF0ZVRvSVNPU3RyaW5nOiBhdCgnZGF0ZVRvSVNPU3RyaW5nJyksXG4gICAgcmVnRXhwU291cmNlOiBhdCgncmVnRXhwU291cmNlJyksXG4gICAgcmVnRXhwRmxhZ3M6IGF0KCdyZWdFeHBGbGFncycpLFxuICAgIG51bWJlclZhbHVlT2Y6IGF0KCdudW1iZXJWYWx1ZU9mJyksXG4gICAgc3RyaW5nVmFsdWVPZjogYXQoJ3N0cmluZ1ZhbHVlT2YnKSxcbiAgICBib29sZWFuVmFsdWVPZjogYXQoJ2Jvb2xlYW5WYWx1ZU9mJyksXG4gICAgYmlnSW50VmFsdWVPZjogYXQoJ2JpZ0ludFZhbHVlT2YnKSxcbiAgICBiaWdJbnRUb1N0cmluZzogYXQoJ2JpZ0ludFRvU3RyaW5nJyksXG4gICAgc2V0Rm9yRWFjaDogYXQoJ3NldEZvckVhY2gnKSxcbiAgICBtYXBGb3JFYWNoOiBhdCgnbWFwRm9yRWFjaCcpLFxuICAgIGhlYWRlcnNGb3JFYWNoOiBvcHRpb25hbCgnaGVhZGVyc0ZvckVhY2gnKSxcbiAgICB1cmxIcmVmOiBvcHRpb25hbCgndXJsSHJlZicpLFxuICAgIHVybFNlYXJjaFBhcmFtc1RvU3RyaW5nOiBvcHRpb25hbCgndXJsU2VhcmNoUGFyYW1zVG9TdHJpbmcnKSxcbiAgICB1cmxTZWFyY2hQYXJhbXNTaXplOiBvcHRpb25hbCgndXJsU2VhcmNoUGFyYW1zU2l6ZScpLFxuICAgIHZpZXdCdWZmZXI6IGF0KCd2aWV3QnVmZmVyJyksXG4gICAgdmlld0J5dGVPZmZzZXQ6IGF0KCd2aWV3Qnl0ZU9mZnNldCcpLFxuICAgIHZpZXdCeXRlTGVuZ3RoOiBhdCgndmlld0J5dGVMZW5ndGgnKSxcbiAgICB2aWV3TGVuZ3RoOiBhdCgndmlld0xlbmd0aCcpLFxuICAgIGRhdGFWaWV3QnVmZmVyOiBhdCgnZGF0YVZpZXdCdWZmZXInKSxcbiAgICBkYXRhVmlld0J5dGVPZmZzZXQ6IGF0KCdkYXRhVmlld0J5dGVPZmZzZXQnKSxcbiAgICBkYXRhVmlld0J5dGVMZW5ndGg6IGF0KCdkYXRhVmlld0J5dGVMZW5ndGgnKSxcbiAgICBhcnJheUJ1ZmZlckJ5dGVMZW5ndGg6IGF0KCdhcnJheUJ1ZmZlckJ5dGVMZW5ndGgnKSxcbiAgICBvYmplY3RQcm90b3R5cGU6IGF0KCdvYmplY3RQcm90b3R5cGUnKSxcbiAgICBlcnJvclByb3RvdHlwZTogYXQoJ2Vycm9yUHJvdG90eXBlJyksXG4gICAgZG9tRXhjZXB0aW9uUHJvdG90eXBlOiBvcHRpb25hbCgnZG9tRXhjZXB0aW9uUHJvdG90eXBlJyksXG4gICAgaGVhZGVyc1Byb3RvdHlwZTogb3B0aW9uYWwoJ2hlYWRlcnNQcm90b3R5cGUnKSxcbiAgICByZXF1ZXN0UHJvdG90eXBlOiBvcHRpb25hbCgncmVxdWVzdFByb3RvdHlwZScpLFxuICAgIHJlc3BvbnNlUHJvdG90eXBlOiBvcHRpb25hbCgncmVzcG9uc2VQcm90b3R5cGUnKSxcbiAgICByZWFkYWJsZVN0cmVhbVByb3RvdHlwZTogb3B0aW9uYWwoJ3JlYWRhYmxlU3RyZWFtUHJvdG90eXBlJyksXG4gICAgd3JpdGFibGVTdHJlYW1Qcm90b3R5cGU6IG9wdGlvbmFsKCd3cml0YWJsZVN0cmVhbVByb3RvdHlwZScpLFxuICAgIHVybFByb3RvdHlwZTogb3B0aW9uYWwoJ3VybFByb3RvdHlwZScpLFxuICAgIHVybFNlYXJjaFBhcmFtc1Byb3RvdHlwZTogb3B0aW9uYWwoJ3VybFNlYXJjaFBhcmFtc1Byb3RvdHlwZScpLFxuICAgIERhdGU6IGF0KCdEYXRlJyksXG4gICAgUmVnRXhwOiBhdCgnUmVnRXhwJyksXG4gICAgU2V0OiBhdCgnU2V0JyksXG4gICAgTWFwOiBhdCgnTWFwJyksXG4gICAgQXJyYXk6IGF0KCdBcnJheScpLFxuICAgIE9iamVjdDogYXQoJ09iamVjdCcpLFxuICAgIEVycm9yOiBhdCgnRXJyb3InKSxcbiAgICBBZ2dyZWdhdGVFcnJvcjogb3B0aW9uYWwoJ0FnZ3JlZ2F0ZUVycm9yJyksXG4gICAgRE9NRXhjZXB0aW9uOiBvcHRpb25hbCgnRE9NRXhjZXB0aW9uJyksXG4gICAgSGVhZGVyczogb3B0aW9uYWwoJ0hlYWRlcnMnKSxcbiAgICBSZWFkYWJsZVN0cmVhbTogb3B0aW9uYWwoJ1JlYWRhYmxlU3RyZWFtJyksXG4gICAgV3JpdGFibGVTdHJlYW06IG9wdGlvbmFsKCdXcml0YWJsZVN0cmVhbScpLFxuICAgIFVSTDogb3B0aW9uYWwoJ1VSTCcpLFxuICAgIFVSTFNlYXJjaFBhcmFtczogb3B0aW9uYWwoJ1VSTFNlYXJjaFBhcmFtcycpLFxuICAgIHNldEFkZDogYXQoJ3NldEFkZCcpLFxuICAgIG1hcFNldDogYXQoJ21hcFNldCcpLFxuICAgIG9iamVjdENyZWF0ZTogYXQoJ29iamVjdENyZWF0ZScpLFxuICAgIGRlZmluZVByb3BlcnR5OiBhdCgnZGVmaW5lUHJvcGVydHknKSxcbiAgICBkYXRlTm93OiBhdCgnZGF0ZU5vdycpLFxuICAgIG9iamVjdEZyZWV6ZTogYXQoJ29iamVjdEZyZWV6ZScpLFxuICAgIGZ1bmN0aW9uQmluZDogYXQoJ2Z1bmN0aW9uQmluZCcpLFxuICAgIG1ha2VTcGFyc2VBcnJheTogYXQoJ21ha2VTcGFyc2VBcnJheScpLFxuICAgIG1ha2VUaHVuazogYXQoJ21ha2VUaHVuaycpLFxuICB9O1xuXG4gIGNvbnN0IGVycm9yQ29uc3RydWN0b3JzID0gbmV3IE1hcDxzdHJpbmcsIEpTVmFsdWVIYW5kbGU+KCk7XG4gIGZvciAoY29uc3QgbmFtZSBvZiBbXG4gICAgJ0V2YWxFcnJvcicsXG4gICAgJ1JhbmdlRXJyb3InLFxuICAgICdSZWZlcmVuY2VFcnJvcicsXG4gICAgJ1N5bnRheEVycm9yJyxcbiAgICAnVHlwZUVycm9yJyxcbiAgICAnVVJJRXJyb3InLFxuICBdKSB7XG4gICAgZXJyb3JDb25zdHJ1Y3RvcnMuc2V0KG5hbWUsIGF0KG5hbWUpKTtcbiAgfVxuXG4gIGNvbnN0IHR5cGVkQXJyYXlDb25zdHJ1Y3RvcnMgPSBuZXcgTWFwPHN0cmluZywgSlNWYWx1ZUhhbmRsZT4oKTtcbiAgZm9yIChjb25zdCBuYW1lIG9mIFtcbiAgICAnSW50OEFycmF5JyxcbiAgICAnVWludDhBcnJheScsXG4gICAgJ1VpbnQ4Q2xhbXBlZEFycmF5JyxcbiAgICAnSW50MTZBcnJheScsXG4gICAgJ1VpbnQxNkFycmF5JyxcbiAgICAnSW50MzJBcnJheScsXG4gICAgJ1VpbnQzMkFycmF5JyxcbiAgICAnRmxvYXQzMkFycmF5JyxcbiAgICAnRmxvYXQ2NEFycmF5JyxcbiAgICAnQmlnSW50NjRBcnJheScsXG4gICAgJ0JpZ1VpbnQ2NEFycmF5JyxcbiAgICAnRGF0YVZpZXcnLFxuICBdKSB7XG4gICAgdHlwZWRBcnJheUNvbnN0cnVjdG9ycy5zZXQobmFtZSwgYXQobmFtZSkpO1xuICB9XG5cbiAgY29uc3Qgc3ltYm9scyA9IG5ldyBNYXA8U3ltYm9sTmFtZSwgSlNWYWx1ZUhhbmRsZT4oKTtcbiAge1xuICAgIHVzaW5nIHN5bWJvbHNDb250YWluZXIgPSByb290LmdldFByb3AoJ3N5bWJvbHMnKTtcbiAgICBmb3IgKGNvbnN0IG5hbWUgb2YgU1lNQk9MX05BTUVTKSB7XG4gICAgICBzeW1ib2xzLnNldChuYW1lLCBrZWVwKHN5bWJvbHNDb250YWluZXIuZ2V0UHJvcChuYW1lKSkpO1xuICAgIH1cbiAgfVxuICBjb25zdCBzeW0gPSAobmFtZTogU3ltYm9sTmFtZSk6IEpTVmFsdWVIYW5kbGUgPT4ge1xuICAgIGNvbnN0IGhhbmRsZSA9IHN5bWJvbHMuZ2V0KG5hbWUpO1xuICAgIGlmICghaGFuZGxlKSB0aHJvdyBuZXcgRXJyb3IoYHVua25vd24gY2FwdHVyZWQgc3ltYm9sOiAke25hbWV9YCk7XG4gICAgcmV0dXJuIGhhbmRsZTtcbiAgfTtcblxuICAvLyAtLS0gaGFuZGxlIGhlbHBlcnMgLS0tXG5cbiAgY29uc3QgY2FsbCA9IChcbiAgICBmbjogSlNWYWx1ZUhhbmRsZSxcbiAgICB0aGlzVmFsdWU6IEpTVmFsdWVIYW5kbGUsXG4gICAgLi4uYXJnczogSlNWYWx1ZUhhbmRsZVtdXG4gICk6IEpTVmFsdWVIYW5kbGUgPT4gdm0uY2FsbEZ1bmN0aW9uKGZuLCB0aGlzVmFsdWUsIC4uLmFyZ3MpO1xuXG4gIGNvbnN0IGludm9rZSA9IChmbjogSlNWYWx1ZUhhbmRsZSwgLi4uYXJnczogSlNWYWx1ZUhhbmRsZVtdKTogSlNWYWx1ZUhhbmRsZSA9PlxuICAgIHZtLmNhbGxGdW5jdGlvbihmbiwgdm0udW5kZWZpbmVkLCAuLi5hcmdzKTtcblxuICAvKipcbiAgICogR3Vlc3Qgb3duLXByb3BlcnR5IGNoZWNrIHRocm91Z2ggdGhlIGhhbmRsZSdzIGludHJvc3BlY3Rpb24gbWV0aG9kLlxuICAgKiBNVVNUIE5PVCBiZSByZXBsYWNlZCB3aXRoIGBPYmplY3QuaGFzT3duYCwgd2hpY2ggd291bGQgaW50ZXJyb2dhdGUgdGhlXG4gICAqIGhvc3QgSlNWYWx1ZUhhbmRsZSB3cmFwcGVyIG9iamVjdCAoYWx3YXlzIGZhbHNlKSBpbnN0ZWFkIG9mIHRoZSBndWVzdFxuICAgKiB2YWx1ZTsgYmlvbWUncyBub1Byb3RvdHlwZUJ1aWx0aW5zIGF1dG8tZml4IGRvZXMgZXhhY3RseSB0aGF0LCB3aGljaFxuICAgKiBpcyB3aHkgdGhpcyBpcyBjZW50cmFsaXplZCBoZXJlIHdpdGggdGhlIHN1cHByZXNzaW9uLlxuICAgKi9cbiAgY29uc3QgZ3Vlc3RIYXNPd24gPSAoaGFuZGxlOiBKU1ZhbHVlSGFuZGxlLCBrZXk6IHN0cmluZyk6IGJvb2xlYW4gPT5cbiAgICAvLyBiaW9tZS1pZ25vcmUgbGludC9zdXNwaWNpb3VzL25vUHJvdG90eXBlQnVpbHRpbnM6IEpTVmFsdWVIYW5kbGUuaGFzT3duUHJvcGVydHkgaXMgcXVpY2tqcy13YXNpJ3MgZ3Vlc3Qtc2lkZSBpbnRyb3NwZWN0aW9uIEFQSSwgbm90IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHlcbiAgICBoYW5kbGUuaGFzT3duUHJvcGVydHkoa2V5KTtcblxuICAvKipcbiAgICogT3duIGRhdGEtcHJvcGVydHkgcmVhZC4gUmV0dXJucyB1bmRlZmluZWQgZm9yIGFic2VudCBwcm9wZXJ0aWVzIEFORCBmb3JcbiAgICogYWNjZXNzb3IgcHJvcGVydGllczogYW4gaW5oZXJpdGVkIG9yIG93biBnZXR0ZXIgaXMgbmV2ZXIgaW52b2tlZFxuICAgKiAobWF0Y2hpbmcgdGhlIGhhcmRlbmVkIG5vZGU6dm0gY29kZWMncyBkZXNjcmlwdG9yLWJhc2VkIHJlYWRzKS5cbiAgICovXG4gIGNvbnN0IG93biA9IChcbiAgICB0YXJnZXQ6IEpTVmFsdWVIYW5kbGUsXG4gICAga2V5OiBzdHJpbmcgfCBKU1ZhbHVlSGFuZGxlXG4gICk6IEpTVmFsdWVIYW5kbGUgfCB1bmRlZmluZWQgPT4ge1xuICAgIGNvbnN0IGRlc2NyaXB0b3IgPSB0YXJnZXQuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGtleSBhcyBzdHJpbmcpO1xuICAgIGlmICghZGVzY3JpcHRvcikgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICBkZXNjcmlwdG9yLmdldD8uZGlzcG9zZSgpO1xuICAgIGRlc2NyaXB0b3Iuc2V0Py5kaXNwb3NlKCk7XG4gICAgcmV0dXJuIGRlc2NyaXB0b3IudmFsdWU7XG4gIH07XG5cbiAgLyoqXG4gICAqIERhdGEtcHJvcGVydHkgcmVhZCBmb2xsb3dpbmcgdGhlIHByb3RvdHlwZSBjaGFpbiAodGhlIHNhZmUgYW5hbG9ndWUgb2ZcbiAgICogYHZhbHVlLm5hbWVgIG9uIGFuIEVycm9yIGluc3RhbmNlLCB3aGVyZSBgbmFtZWAvYG1lc3NhZ2VgIGxpdmUgb24gdGhlXG4gICAqIHByb3RvdHlwZSkuIEFjY2Vzc29ycyBhbnl3aGVyZSBvbiB0aGUgY2hhaW4gYXJlIHNraXBwZWQsIG5vdCBpbnZva2VkLlxuICAgKi9cbiAgY29uc3QgY2hhaW5lZCA9IChcbiAgICB0YXJnZXQ6IEpTVmFsdWVIYW5kbGUsXG4gICAga2V5OiBzdHJpbmcgfCBKU1ZhbHVlSGFuZGxlXG4gICk6IEpTVmFsdWVIYW5kbGUgfCB1bmRlZmluZWQgPT4ge1xuICAgIGxldCBjdXJyZW50OiBKU1ZhbHVlSGFuZGxlIHwgdW5kZWZpbmVkO1xuICAgIGxldCBvd25lZCA9IGZhbHNlOyAvLyB3aGV0aGVyIGBjdXJyZW50YCBpcyBvdXJzIHRvIGRpc3Bvc2VcbiAgICBsZXQgY3Vyc29yID0gdGFyZ2V0O1xuICAgIGZvciAobGV0IGRlcHRoID0gMDsgZGVwdGggPCAzMjsgZGVwdGgrKykge1xuICAgICAgY29uc3QgZm91bmQgPSBvd24oY3Vyc29yLCBrZXkpO1xuICAgICAgaWYgKGZvdW5kKSB7XG4gICAgICAgIGlmIChvd25lZCkgKGN1cnNvciBhcyBKU1ZhbHVlSGFuZGxlKS5kaXNwb3NlKCk7XG4gICAgICAgIHJldHVybiBmb3VuZDtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHByb3RvID0gY3Vyc29yLmdldFByb3RvdHlwZU9mKCk7XG4gICAgICBpZiAob3duZWQpIChjdXJzb3IgYXMgSlNWYWx1ZUhhbmRsZSkuZGlzcG9zZSgpO1xuICAgICAgaWYgKHByb3RvLmlzTnVsbCB8fCBwcm90by5pc1VuZGVmaW5lZCkge1xuICAgICAgICBwcm90by5kaXNwb3NlKCk7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgICBjdXJzb3IgPSBwcm90bztcbiAgICAgIG93bmVkID0gdHJ1ZTtcbiAgICAgIGN1cnJlbnQgPSBwcm90bztcbiAgICB9XG4gICAgaWYgKG93bmVkICYmIGN1cnJlbnQpIGN1cnJlbnQuZGlzcG9zZSgpO1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH07XG5cbiAgLyoqIEhvc3Qgc3RyaW5nIGZyb20gYSBkYXRhIHByb3BlcnR5IChvd24tb3ItY2hhaW4pLCBvciB1bmRlZmluZWQuICovXG4gIGNvbnN0IGNoYWluZWRTdHJpbmcgPSAoXG4gICAgdGFyZ2V0OiBKU1ZhbHVlSGFuZGxlLFxuICAgIGtleTogc3RyaW5nIHwgSlNWYWx1ZUhhbmRsZVxuICApOiBzdHJpbmcgfCB1bmRlZmluZWQgPT4ge1xuICAgIGNvbnN0IGhhbmRsZSA9IGNoYWluZWQodGFyZ2V0LCBrZXkpO1xuICAgIGlmICghaGFuZGxlKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIGNvbnN0IHJlc3VsdCA9IGhhbmRsZS5pc1N0cmluZyA/IGhhbmRsZS50b1N0cmluZygpIDogdW5kZWZpbmVkO1xuICAgIGhhbmRsZS5kaXNwb3NlKCk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfTtcblxuICBjb25zdCBvd25TdHJpbmcgPSAoXG4gICAgdGFyZ2V0OiBKU1ZhbHVlSGFuZGxlLFxuICAgIGtleTogc3RyaW5nIHwgSlNWYWx1ZUhhbmRsZVxuICApOiBzdHJpbmcgfCB1bmRlZmluZWQgPT4ge1xuICAgIGNvbnN0IGhhbmRsZSA9IG93bih0YXJnZXQsIGtleSk7XG4gICAgaWYgKCFoYW5kbGUpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgY29uc3QgcmVzdWx0ID0gaGFuZGxlLmlzU3RyaW5nID8gaGFuZGxlLnRvU3RyaW5nKCkgOiB1bmRlZmluZWQ7XG4gICAgaGFuZGxlLmRpc3Bvc2UoKTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9O1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIGBoYW5kbGVgIGhhcyBgcHJvdG90eXBlSGFuZGxlYCBhbnl3aGVyZSBvbiBpdHMgcHJvdG90eXBlIGNoYWluOlxuICAgKiB0aGUgdHJhcC1mcmVlIGFuYWxvZ3VlIG9mIGBpbnN0YW5jZW9mYCAod2hpY2ggd291bGQgZmlyZVxuICAgKiBgU3ltYm9sLmhhc0luc3RhbmNlYCkuXG4gICAqL1xuICBjb25zdCBoYXNQcm90b3R5cGUgPSAoXG4gICAgaGFuZGxlOiBKU1ZhbHVlSGFuZGxlLFxuICAgIHByb3RvdHlwZUhhbmRsZTogSlNWYWx1ZUhhbmRsZSB8IHVuZGVmaW5lZFxuICApOiBib29sZWFuID0+IHtcbiAgICBpZiAoIXByb3RvdHlwZUhhbmRsZSkgcmV0dXJuIGZhbHNlO1xuICAgIGxldCBjdXJzb3IgPSBoYW5kbGUuZ2V0UHJvdG90eXBlT2YoKTtcbiAgICBmb3IgKGxldCBkZXB0aCA9IDA7IGRlcHRoIDwgMzI7IGRlcHRoKyspIHtcbiAgICAgIGlmIChjdXJzb3IuaXNOdWxsIHx8IGN1cnNvci5pc1VuZGVmaW5lZCkge1xuICAgICAgICBjdXJzb3IuZGlzcG9zZSgpO1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICBpZiAoY3Vyc29yLmlkZW50aXR5ID09PSBwcm90b3R5cGVIYW5kbGUuaWRlbnRpdHkpIHtcbiAgICAgICAgY3Vyc29yLmRpc3Bvc2UoKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgICBjb25zdCBuZXh0ID0gY3Vyc29yLmdldFByb3RvdHlwZU9mKCk7XG4gICAgICBjdXJzb3IuZGlzcG9zZSgpO1xuICAgICAgY3Vyc29yID0gbmV4dDtcbiAgICB9XG4gICAgY3Vyc29yLmRpc3Bvc2UoKTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH07XG5cbiAgLyoqIGBPYmplY3QuZGVmaW5lUHJvcGVydHlgIHdyaXRlLCBpbW11bmUgdG8gaW5oZXJpdGVkIHNldHRlcnMuICovXG4gIGNvbnN0IGRlZmluZSA9IChcbiAgICB0YXJnZXQ6IEpTVmFsdWVIYW5kbGUsXG4gICAga2V5OiBzdHJpbmcgfCBKU1ZhbHVlSGFuZGxlLFxuICAgIHZhbHVlOiBKU1ZhbHVlSGFuZGxlXG4gICk6IHZvaWQgPT4ge1xuICAgIGNvbnN0IGRlc2NyaXB0b3IgPSB2bS5uZXdPYmplY3QoKTtcbiAgICB0cnkge1xuICAgICAgZGVzY3JpcHRvci5zZXRQcm9wKCd2YWx1ZScsIHZhbHVlKTtcbiAgICAgIGRlc2NyaXB0b3Iuc2V0UHJvcCgnd3JpdGFibGUnLCB2bS50cnVlKTtcbiAgICAgIGRlc2NyaXB0b3Iuc2V0UHJvcCgnZW51bWVyYWJsZScsIHZtLnRydWUpO1xuICAgICAgZGVzY3JpcHRvci5zZXRQcm9wKCdjb25maWd1cmFibGUnLCB2bS50cnVlKTtcbiAgICAgIGlmICh0eXBlb2Yga2V5ID09PSAnc3RyaW5nJykge1xuICAgICAgICBjb25zdCBrZXlIYW5kbGUgPSB2bS5uZXdTdHJpbmcoa2V5KTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjYWxsKFxuICAgICAgICAgICAgaS5kZWZpbmVQcm9wZXJ0eSxcbiAgICAgICAgICAgIHZtLnVuZGVmaW5lZCxcbiAgICAgICAgICAgIHRhcmdldCxcbiAgICAgICAgICAgIGtleUhhbmRsZSxcbiAgICAgICAgICAgIGRlc2NyaXB0b3JcbiAgICAgICAgICApLmRpc3Bvc2UoKTtcbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICBrZXlIYW5kbGUuZGlzcG9zZSgpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjYWxsKGkuZGVmaW5lUHJvcGVydHksIHZtLnVuZGVmaW5lZCwgdGFyZ2V0LCBrZXksIGRlc2NyaXB0b3IpLmRpc3Bvc2UoKTtcbiAgICAgIH1cbiAgICB9IGZpbmFsbHkge1xuICAgICAgZGVzY3JpcHRvci5kaXNwb3NlKCk7XG4gICAgfVxuICB9O1xuXG4gIGNvbnN0IG5ld0d1ZXN0U3RyaW5nID0gKHZhbHVlOiBzdHJpbmcpOiBKU1ZhbHVlSGFuZGxlID0+IHZtLm5ld1N0cmluZyh2YWx1ZSk7XG5cbiAgLyoqIENvbGxlY3QgU2V0IHZhbHVlcyAvIE1hcCBlbnRyaWVzIHZpYSBjYXB0dXJlZCBmb3JFYWNoLiAqL1xuICBjb25zdCBjb2xsZWN0ID0gKFxuICAgIGZvckVhY2g6IEpTVmFsdWVIYW5kbGUsXG4gICAgY29sbGVjdGlvbjogSlNWYWx1ZUhhbmRsZSxcbiAgICBhcml0eTogMSB8IDJcbiAgKTogdW5rbm93bltdID0+IHtcbiAgICBjb25zdCBjb2xsZWN0ZWQ6IHVua25vd25bXSA9IFtdO1xuICAgIGNvbnN0IHZpc2l0b3IgPSB2bS5uZXdFcGhlbWVyYWxGdW5jdGlvbihcbiAgICAgICh2YWx1ZTogSlNWYWx1ZUhhbmRsZSwga2V5OiBKU1ZhbHVlSGFuZGxlKSA9PiB7XG4gICAgICAgIC8vIGR1cCgpOiB0aGUgdmlzaXRvcidzIG93biBhcmcgaGFuZGxlcyBhcmUgYm9ycm93ZWQgKEMtb3duZWQsXG4gICAgICAgIC8vIHNjb3BlLWV4ZW1wdCBhcyBvZiBxdWlja2pzLXdhc2kgMy4zLjEpOyB0aGUgZHVwcyBhcmUgb3duZWRcbiAgICAgICAgLy8gcmVmZXJlbmNlcywgc2NvcGUtdHJhY2tlZCBhbmQgc3dlcHQgYXQgdGhlIHBhc3MgYm91bmRhcnkuXG4gICAgICAgIGNvbGxlY3RlZC5wdXNoKGFyaXR5ID09PSAxID8gdmFsdWUuZHVwKCkgOiBba2V5LmR1cCgpLCB2YWx1ZS5kdXAoKV0pO1xuICAgICAgICByZXR1cm4gdm0udW5kZWZpbmVkO1xuICAgICAgfVxuICAgICk7XG4gICAgdHJ5IHtcbiAgICAgIGNhbGwoZm9yRWFjaCwgY29sbGVjdGlvbiwgdmlzaXRvcikuZGlzcG9zZSgpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICB2aXNpdG9yLmRpc3Bvc2UoKTtcbiAgICB9XG4gICAgcmV0dXJuIGNvbGxlY3RlZDtcbiAgfTtcblxuICAvKiogQ29weSBhIHR5cGVkIGFycmF5IC8gRGF0YVZpZXcncyB2aWV3ZWQgYnl0ZXMgdG8gdGhlIGhvc3QuICovXG4gIGNvbnN0IHZpZXdCeXRlcyA9IChoYW5kbGU6IEpTVmFsdWVIYW5kbGUpOiBVaW50OEFycmF5ID0+IHtcbiAgICBjb25zdCBpc0RhdGFWaWV3ID0gaGFuZGxlLmlzRGF0YVZpZXc7XG4gICAgY29uc3QgYnVmZmVyID0gY2FsbChpc0RhdGFWaWV3ID8gaS5kYXRhVmlld0J1ZmZlciA6IGkudmlld0J1ZmZlciwgaGFuZGxlKTtcbiAgICB0cnkge1xuICAgICAgY29uc3QgYnl0ZU9mZnNldCA9IGNhbGwoXG4gICAgICAgIGlzRGF0YVZpZXcgPyBpLmRhdGFWaWV3Qnl0ZU9mZnNldCA6IGkudmlld0J5dGVPZmZzZXQsXG4gICAgICAgIGhhbmRsZVxuICAgICAgKS5jb25zdW1lKChoKSA9PiBoLnRvTnVtYmVyKCkpO1xuICAgICAgY29uc3QgYnl0ZUxlbmd0aCA9IGNhbGwoXG4gICAgICAgIGlzRGF0YVZpZXcgPyBpLmRhdGFWaWV3Qnl0ZUxlbmd0aCA6IGkudmlld0J5dGVMZW5ndGgsXG4gICAgICAgIGhhbmRsZVxuICAgICAgKS5jb25zdW1lKChoKSA9PiBoLnRvTnVtYmVyKCkpO1xuICAgICAgY29uc3QgYnl0ZXMgPSBuZXcgVWludDhBcnJheShidWZmZXIudG9BcnJheUJ1ZmZlcigpKTtcbiAgICAgIHJldHVybiBieXRlcy5zdWJhcnJheShieXRlT2Zmc2V0LCBieXRlT2Zmc2V0ICsgYnl0ZUxlbmd0aCk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGJ1ZmZlci5kaXNwb3NlKCk7XG4gICAgfVxuICB9O1xuXG4gIGNvbnN0IHRhZ09mSGFuZGxlID0gKGhhbmRsZTogSlNWYWx1ZUhhbmRsZSk6IHN0cmluZyA9PiB7XG4gICAgaWYgKGhhbmRsZS5pc1Byb3h5KSByZXR1cm4gJ09iamVjdCc7XG4gICAgcmV0dXJuIHRhZ0J5Q2xhc3NJZC5nZXQoaGFuZGxlLmNsYXNzSWQpID8/ICdPYmplY3QnO1xuICB9O1xuXG4gIC8vIC0tLSBpZGVudGl0eSAtLS1cblxuICBjb25zdCBpZGVudGl0aWVzID0gbmV3IE1hcDxudW1iZXIsIG9iamVjdD4oKTtcbiAgY29uc3QgaWRlbnRpdHlPZiA9IChwb2ludGVyOiBudW1iZXIpOiBvYmplY3QgPT4ge1xuICAgIGxldCBpZGVudGl0eSA9IGlkZW50aXRpZXMuZ2V0KHBvaW50ZXIpO1xuICAgIGlmICghaWRlbnRpdHkpIHtcbiAgICAgIGlkZW50aXR5ID0geyBwb2ludGVyIH07XG4gICAgICBpZGVudGl0aWVzLnNldChwb2ludGVyLCBpZGVudGl0eSk7XG4gICAgfVxuICAgIHJldHVybiBpZGVudGl0eTtcbiAgfTtcblxuICBjb25zdCBwcmltaXRpdmVPZiA9IChoYW5kbGU6IEpTVmFsdWVIYW5kbGUpOiB1bmtub3duID0+IHtcbiAgICBpZiAoaGFuZGxlLmlzVW5kZWZpbmVkKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIGlmIChoYW5kbGUuaXNOdWxsKSByZXR1cm4gbnVsbDtcbiAgICBpZiAoaGFuZGxlLmlzQm9vbCkgcmV0dXJuIGhhbmRsZS50b0Jvb2xlYW4oKTtcbiAgICBpZiAoaGFuZGxlLmlzTnVtYmVyKSByZXR1cm4gaGFuZGxlLnRvTnVtYmVyKCk7XG4gICAgaWYgKGhhbmRsZS5pc0JpZ0ludCkgcmV0dXJuIGd1ZXN0QmlnSW50KGhhbmRsZSk7XG4gICAgcmV0dXJuIGhhbmRsZS50b1N0cmluZygpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBFeHRyYWN0IGEgZ3Vlc3QgYmlnaW50IHZpYSB0aGUgY2FwdHVyZWQgYEJpZ0ludC5wcm90b3R5cGUudG9TdHJpbmdgLFxuICAgKiBzaW5jZSBgaGFuZGxlLnRvQmlnSW50KClgIHRydW5jYXRlcyB0byA2NCBiaXRzLlxuICAgKi9cbiAgY29uc3QgZ3Vlc3RCaWdJbnQgPSAoaGFuZGxlOiBKU1ZhbHVlSGFuZGxlKTogYmlnaW50ID0+XG4gICAgQmlnSW50KGNhbGwoaS5iaWdJbnRUb1N0cmluZywgaGFuZGxlKS5jb25zdW1lKChoKSA9PiBoLnRvU3RyaW5nKCkpKTtcblxuICAvLyAtLS0gaHlicmlkIHN0cmluZ2lmeSBvcGVyYXRpb25zIC0tLVxuICAvLyBIYW5kbGVzIHRha2UgdGhlIGludHJvc3BlY3Rpb24gcGF0aDsgaG9zdCB2YWx1ZXMgKHJlZHVjZXIgb3V0cHV0cylcbiAgLy8gZmFsbCBiYWNrIHRvIGRldmFsdWUncyBkZWZhdWx0cy5cblxuICBjb25zdCBkID0gZGVmYXVsdFN0cmluZ2lmeU9wZXJhdGlvbnM7XG5cbiAgY29uc3Qgc3RyaW5naWZ5T3BlcmF0aW9uczogU3RyaW5naWZ5T3BlcmF0aW9ucyA9IHtcbiAgICBpZGVudGlmeTogKHZhbHVlKSA9PiB7XG4gICAgICBpZiAoIWlzSGFuZGxlKHZhbHVlKSkgcmV0dXJuIGQuaWRlbnRpZnkodmFsdWUpO1xuICAgICAgY29uc3QgcG9pbnRlciA9IHZhbHVlLmlkZW50aXR5O1xuICAgICAgaWYgKHBvaW50ZXIgPT09IDAgfHwgdmFsdWUuaXNTdHJpbmcpIHJldHVybiBwcmltaXRpdmVPZih2YWx1ZSk7XG4gICAgICByZXR1cm4gaWRlbnRpdHlPZihwb2ludGVyKTtcbiAgICB9LFxuICAgIHR5cGVPZjogKHZhbHVlKSA9PiB7XG4gICAgICBpZiAoIWlzSGFuZGxlKHZhbHVlKSkgcmV0dXJuIGQudHlwZU9mKHZhbHVlKTtcbiAgICAgIGlmICh2YWx1ZS5pc051bGwpIHJldHVybiAnbnVsbCc7XG4gICAgICByZXR1cm4gdmFsdWUudHlwZW9mIGFzIFJldHVyblR5cGU8U3RyaW5naWZ5T3BlcmF0aW9uc1sndHlwZU9mJ10+O1xuICAgIH0sXG4gICAgdG9QcmltaXRpdmU6ICh2YWx1ZSkgPT4gKGlzSGFuZGxlKHZhbHVlKSA/IHByaW1pdGl2ZU9mKHZhbHVlKSA6IHZhbHVlKSxcbiAgICB0YWdPZjogKHZhbHVlKSA9PiAoaXNIYW5kbGUodmFsdWUpID8gdGFnT2ZIYW5kbGUodmFsdWUpIDogZC50YWdPZih2YWx1ZSkpLFxuICAgIGlzVGhlbmFibGU6ICh2YWx1ZSkgPT5cbiAgICAgIGlzSGFuZGxlKHZhbHVlKSA/IHZhbHVlLmlzUHJvbWlzZSA6IGQuaXNUaGVuYWJsZSh2YWx1ZSksXG4gICAgdG9Qcm9taXNlOiBhc3luYyAodmFsdWUpID0+IHtcbiAgICAgIGlmICghaXNIYW5kbGUodmFsdWUpKSByZXR1cm4gZC50b1Byb21pc2UodmFsdWUpO1xuICAgICAgY29uc3Qgc2V0dGxlZCA9IGF3YWl0IHZtLnJlc29sdmVQcm9taXNlKHZhbHVlKTtcbiAgICAgIGlmICgnZXJyb3InIGluIHNldHRsZWQpIHRocm93IHNldHRsZWQuZXJyb3I7XG4gICAgICByZXR1cm4gc2V0dGxlZC52YWx1ZTtcbiAgICB9LFxuICAgIHVuYm94OiAodmFsdWUpID0+IHtcbiAgICAgIGlmICghaXNIYW5kbGUodmFsdWUpKSByZXR1cm4gZC51bmJveCh2YWx1ZSk7XG4gICAgICBzd2l0Y2ggKHRhZ09mSGFuZGxlKHZhbHVlKSkge1xuICAgICAgICBjYXNlICdOdW1iZXInOlxuICAgICAgICAgIHJldHVybiBjYWxsKGkubnVtYmVyVmFsdWVPZiwgdmFsdWUpO1xuICAgICAgICBjYXNlICdTdHJpbmcnOlxuICAgICAgICAgIHJldHVybiBjYWxsKGkuc3RyaW5nVmFsdWVPZiwgdmFsdWUpO1xuICAgICAgICBjYXNlICdCb29sZWFuJzpcbiAgICAgICAgICByZXR1cm4gY2FsbChpLmJvb2xlYW5WYWx1ZU9mLCB2YWx1ZSk7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgcmV0dXJuIGNhbGwoaS5iaWdJbnRWYWx1ZU9mLCB2YWx1ZSk7XG4gICAgICB9XG4gICAgfSxcbiAgICB0b0lTT1N0cmluZzogKHZhbHVlKSA9PiB7XG4gICAgICBpZiAoIWlzSGFuZGxlKHZhbHVlKSkgcmV0dXJuIGQudG9JU09TdHJpbmcodmFsdWUpO1xuICAgICAgaWYgKFxuICAgICAgICBOdW1iZXIuaXNOYU4oY2FsbChpLmRhdGVHZXRUaW1lLCB2YWx1ZSkuY29uc3VtZSgoaCkgPT4gaC50b051bWJlcigpKSlcbiAgICAgICkge1xuICAgICAgICByZXR1cm4gJyc7XG4gICAgICB9XG4gICAgICByZXR1cm4gY2FsbChpLmRhdGVUb0lTT1N0cmluZywgdmFsdWUpLmNvbnN1bWUoKGgpID0+IGgudG9TdHJpbmcoKSk7XG4gICAgfSxcbiAgICB0b1N0cmluZ1ZhbHVlOiAodmFsdWUpID0+IHtcbiAgICAgIGlmICghaXNIYW5kbGUodmFsdWUpKSByZXR1cm4gZC50b1N0cmluZ1ZhbHVlKHZhbHVlKTtcbiAgICAgIC8vIFVSTCAvIFVSTFNlYXJjaFBhcmFtcyBhcmUgbWF0Y2hlZCBieSB3b3JrZmxvdyByZWR1Y2VycyBiZWZvcmVcbiAgICAgIC8vIGRldmFsdWUncyBuYXRpdmUgaGFuZGxpbmcsIGFuZCBUZW1wb3JhbCBkb2Vzbid0IGV4aXN0IGluIHRoZSBWTSwgc29cbiAgICAgIC8vIHRoaXMgaXMgdW5yZWFjaGFibGUgaW4gcHJhY3RpY2UuIFJlZnVzZSByYXRoZXIgdGhhbiBpbnZva2UgZ3Vlc3RcbiAgICAgIC8vIGB0b1N0cmluZ2AuXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBubyBjYXB0dXJlZCBzdHJpbmcgY29udmVyc2lvbiBmb3IgJHt0YWdPZkhhbmRsZSh2YWx1ZSl9IGluIHRoZSBWTWBcbiAgICAgICk7XG4gICAgfSxcbiAgICByZWdFeHBJbmZvOiAodmFsdWUpID0+IHtcbiAgICAgIGlmICghaXNIYW5kbGUodmFsdWUpKSByZXR1cm4gZC5yZWdFeHBJbmZvKHZhbHVlKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHNvdXJjZTogY2FsbChpLnJlZ0V4cFNvdXJjZSwgdmFsdWUpLmNvbnN1bWUoKGgpID0+IGgudG9TdHJpbmcoKSksXG4gICAgICAgIGZsYWdzOiBjYWxsKGkucmVnRXhwRmxhZ3MsIHZhbHVlKS5jb25zdW1lKChoKSA9PiBoLnRvU3RyaW5nKCkpLFxuICAgICAgfTtcbiAgICB9LFxuICAgIHZhbHVlc09mOiAodmFsdWUpID0+XG4gICAgICBpc0hhbmRsZSh2YWx1ZSkgPyBjb2xsZWN0KGkuc2V0Rm9yRWFjaCwgdmFsdWUsIDEpIDogZC52YWx1ZXNPZih2YWx1ZSksXG4gICAgZW50cmllc09mOiAodmFsdWUpID0+XG4gICAgICBpc0hhbmRsZSh2YWx1ZSlcbiAgICAgICAgPyAoY29sbGVjdChpLm1hcEZvckVhY2gsIHZhbHVlLCAyKSBhcyBJdGVyYWJsZTxbdW5rbm93biwgdW5rbm93bl0+KVxuICAgICAgICA6IGQuZW50cmllc09mKHZhbHVlKSxcbiAgICB2aWV3SW5mbzogKHZhbHVlKSA9PiB7XG4gICAgICBpZiAoIWlzSGFuZGxlKHZhbHVlKSkgcmV0dXJuIGQudmlld0luZm8odmFsdWUpO1xuICAgICAgY29uc3QgaXNEYXRhVmlldyA9IHZhbHVlLmlzRGF0YVZpZXc7XG4gICAgICBjb25zdCBidWZmZXIgPSBjYWxsKGlzRGF0YVZpZXcgPyBpLmRhdGFWaWV3QnVmZmVyIDogaS52aWV3QnVmZmVyLCB2YWx1ZSk7XG4gICAgICBjb25zdCBpbmZvID0ge1xuICAgICAgICBidWZmZXIsXG4gICAgICAgIGJ5dGVPZmZzZXQ6IGNhbGwoXG4gICAgICAgICAgaXNEYXRhVmlldyA/IGkuZGF0YVZpZXdCeXRlT2Zmc2V0IDogaS52aWV3Qnl0ZU9mZnNldCxcbiAgICAgICAgICB2YWx1ZVxuICAgICAgICApLmNvbnN1bWUoKGgpID0+IGgudG9OdW1iZXIoKSksXG4gICAgICAgIGJ5dGVMZW5ndGg6IGNhbGwoXG4gICAgICAgICAgaXNEYXRhVmlldyA/IGkuZGF0YVZpZXdCeXRlTGVuZ3RoIDogaS52aWV3Qnl0ZUxlbmd0aCxcbiAgICAgICAgICB2YWx1ZVxuICAgICAgICApLmNvbnN1bWUoKGgpID0+IGgudG9OdW1iZXIoKSksXG4gICAgICAgIGJ1ZmZlckJ5dGVMZW5ndGg6IGNhbGwoaS5hcnJheUJ1ZmZlckJ5dGVMZW5ndGgsIGJ1ZmZlcikuY29uc3VtZSgoaCkgPT5cbiAgICAgICAgICBoLnRvTnVtYmVyKClcbiAgICAgICAgKSxcbiAgICAgICAgbGVuZ3RoOiAwLFxuICAgICAgfTtcbiAgICAgIGlmICghaXNEYXRhVmlldykge1xuICAgICAgICBpbmZvLmxlbmd0aCA9IGNhbGwoaS52aWV3TGVuZ3RoLCB2YWx1ZSkuY29uc3VtZSgoaCkgPT4gaC50b051bWJlcigpKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBpbmZvO1xuICAgIH0sXG4gICAgdG9BcnJheUJ1ZmZlcjogKHZhbHVlKSA9PlxuICAgICAgaXNIYW5kbGUodmFsdWUpID8gdmFsdWUudG9BcnJheUJ1ZmZlcigpIDogZC50b0FycmF5QnVmZmVyKHZhbHVlKSxcbiAgICBsZW5ndGhPZjogKHZhbHVlKSA9PiB7XG4gICAgICBpZiAoIWlzSGFuZGxlKHZhbHVlKSkgcmV0dXJuIGQubGVuZ3RoT2YodmFsdWUpO1xuICAgICAgY29uc3QgbGVuZ3RoID0gb3duKHZhbHVlLCAnbGVuZ3RoJyk7XG4gICAgICByZXR1cm4gbGVuZ3RoPy5jb25zdW1lKChoKSA9PiBoLnRvTnVtYmVyKCkpID8/IDA7XG4gICAgfSxcbiAgICBoYXNPd246ICh2YWx1ZSwga2V5KSA9PlxuICAgICAgaXNIYW5kbGUodmFsdWUpID8gZ3Vlc3RIYXNPd24odmFsdWUsIFN0cmluZyhrZXkpKSA6IGQuaGFzT3duKHZhbHVlLCBrZXkpLFxuICAgIGluZGljZXNPZjogKHZhbHVlKSA9PlxuICAgICAgaXNIYW5kbGUodmFsdWUpID8gZmlsdGVyQXJyYXlJbmRpY2VzKHZhbHVlLmtleXMoKSkgOiBkLmluZGljZXNPZih2YWx1ZSksXG4gICAgc2hhcGVPZjogKHZhbHVlKSA9PiB7XG4gICAgICBpZiAoIWlzSGFuZGxlKHZhbHVlKSkgcmV0dXJuIGQuc2hhcGVPZih2YWx1ZSk7XG4gICAgICBpZiAodmFsdWUuaXNQcm94eSkgcmV0dXJuIHsga2luZDogJ25vdC1wbGFpbicgYXMgY29uc3QgfTtcbiAgICAgIGNvbnN0IHByb3RvdHlwZSA9IHZhbHVlLmdldFByb3RvdHlwZU9mKCk7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBpc1BsYWluID1cbiAgICAgICAgICBwcm90b3R5cGUuaXNOdWxsIHx8IHByb3RvdHlwZS5pZGVudGl0eSA9PT0gaS5vYmplY3RQcm90b3R5cGUuaWRlbnRpdHk7XG4gICAgICAgIGlmICghaXNQbGFpbikgcmV0dXJuIHsga2luZDogJ25vdC1wbGFpbicgYXMgY29uc3QgfTtcbiAgICAgICAgY29uc3Qga2V5czogc3RyaW5nW10gPSBbXTtcbiAgICAgICAgZm9yIChjb25zdCBrZXkgb2YgdmFsdWUuZ2V0T3duUHJvcGVydHlLZXlzKCkpIHtcbiAgICAgICAgICBpZiAodHlwZW9mIGtleSAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIGNvbnN0IGVudW1lcmFibGUgPVxuICAgICAgICAgICAgICB2YWx1ZS5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Ioa2V5KT8uZW51bWVyYWJsZSA/PyBmYWxzZTtcbiAgICAgICAgICAgIGtleS5kaXNwb3NlKCk7XG4gICAgICAgICAgICBpZiAoZW51bWVyYWJsZSkgcmV0dXJuIHsga2luZDogJ3N5bWJvbC1rZXlzJyBhcyBjb25zdCB9O1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICh2YWx1ZS5wcm9wZXJ0eUlzRW51bWVyYWJsZShrZXkpKSBrZXlzLnB1c2goa2V5KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGtpbmQ6IHByb3RvdHlwZS5pc051bGwgPyAoJ251bGwtcHJvdG8nIGFzIGNvbnN0KSA6ICgncGxhaW4nIGFzIGNvbnN0KSxcbiAgICAgICAgICBrZXlzLFxuICAgICAgICB9O1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgcHJvdG90eXBlLmRpc3Bvc2UoKTtcbiAgICAgIH1cbiAgICB9LFxuICAgIGdldDogKHZhbHVlLCBrZXkpID0+IHtcbiAgICAgIGlmICghaXNIYW5kbGUodmFsdWUpKSByZXR1cm4gZC5nZXQodmFsdWUsIGtleSk7XG4gICAgICBjb25zdCBkZXNjcmlwdG9yID0gdmFsdWUuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKFN0cmluZyhrZXkpKTtcbiAgICAgIGlmICghZGVzY3JpcHRvcikgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgIGlmIChkZXNjcmlwdG9yLmdldCkge1xuICAgICAgICAvLyBQYXJpdHkgd2l0aCB0aGUgaGFyZGVuZWQgbm9kZTp2bSBjb2RlYzogZ2V0dGVycyBhcmUgaW52b2tlZCAoZnVsbFxuICAgICAgICAvLyBjb21wYXRpYmlsaXR5IHdpdGggdmFsdWVzIHdob3NlIHNoYXBlIGRlcGVuZHMgb24gYWNjZXNzb3JzKSwgdGhlXG4gICAgICAgIC8vIGRpZmZlcmVuY2UgZnJvbSBgW1tHZXRdXWAgYmVpbmcgdGhhdCB0aGlzIGlzIGFuIGV4cGxpY2l0LCBzaW5nbGVcbiAgICAgICAgLy8gaW52b2NhdGlvbiBvZiB0aGUgYWNjZXNzb3IgdGhlIGRlc2NyaXB0b3IgbmFtZXMuXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGNhbGwoZGVzY3JpcHRvci5nZXQsIHZhbHVlKTtcbiAgICAgICAgZGVzY3JpcHRvci5nZXQuZGlzcG9zZSgpO1xuICAgICAgICBkZXNjcmlwdG9yLnNldD8uZGlzcG9zZSgpO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfVxuICAgICAgZGVzY3JpcHRvci5zZXQ/LmRpc3Bvc2UoKTtcbiAgICAgIHJldHVybiBkZXNjcmlwdG9yLnZhbHVlO1xuICAgIH0sXG4gIH07XG5cbiAgLy8gLS0tIHdvcmtmbG93IHJlZHVjZXJzIChoYW5kbGUgc3BhY2UpIC0tLVxuXG4gIC8qKiBIb3N0IHNoYXBlIGZvciBlcnJvci1mYW1pbHkgcmVkdWN0aW9uOyBsZWF2ZXMgbWF5IGJlIGhhbmRsZXMuICovXG4gIGNvbnN0IHJlZHVjZUVycm9yU2hhcGUgPSAoXG4gICAgdmFsdWU6IEpTVmFsdWVIYW5kbGVcbiAgKTogeyBtZXNzYWdlOiBzdHJpbmc7IHN0YWNrPzogc3RyaW5nOyBjYXVzZT86IHVua25vd24gfSA9PiB7XG4gICAgY29uc3Qgc2hhcGU6IHsgbWVzc2FnZTogc3RyaW5nOyBzdGFjaz86IHN0cmluZzsgY2F1c2U/OiB1bmtub3duIH0gPSB7XG4gICAgICBtZXNzYWdlOiBjaGFpbmVkU3RyaW5nKHZhbHVlLCAnbWVzc2FnZScpID8/ICcnLFxuICAgIH07XG4gICAgY29uc3Qgc3RhY2sgPSBjaGFpbmVkU3RyaW5nKHZhbHVlLCAnc3RhY2snKTtcbiAgICBpZiAoc3RhY2sgIT09IHVuZGVmaW5lZCkgc2hhcGUuc3RhY2sgPSBzdGFjaztcbiAgICBpZiAoZ3Vlc3RIYXNPd24odmFsdWUsICdjYXVzZScpKSB7XG4gICAgICBzaGFwZS5jYXVzZSA9IG93bih2YWx1ZSwgJ2NhdXNlJykgPz8gdW5kZWZpbmVkO1xuICAgIH1cbiAgICByZXR1cm4gc2hhcGU7XG4gIH07XG5cbiAgY29uc3QgbmFtZWRFcnJvclN1YmNsYXNzUmVkdWNlciA9XG4gICAgKHN1YmNsYXNzTmFtZTogc3RyaW5nKSA9PiAodmFsdWU6IHVua25vd24pID0+IHtcbiAgICAgIGlmICghaXNIYW5kbGUodmFsdWUpIHx8ICF2YWx1ZS5pc0Vycm9yKSByZXR1cm4gZmFsc2U7XG4gICAgICBpZiAoY2hhaW5lZFN0cmluZyh2YWx1ZSwgJ25hbWUnKSAhPT0gc3ViY2xhc3NOYW1lKSByZXR1cm4gZmFsc2U7XG4gICAgICByZXR1cm4gcmVkdWNlRXJyb3JTaGFwZSh2YWx1ZSk7XG4gICAgfTtcblxuICAvKiogT3duIHN5bWJvbC1rZXllZCBkYXRhIHJlYWQgcmV0dXJuaW5nIGEgaG9zdCBzdHJpbmcsIG9yIHVuZGVmaW5lZC4gKi9cbiAgY29uc3Qgb3duU3ltYm9sU3RyaW5nID0gKFxuICAgIHZhbHVlOiBKU1ZhbHVlSGFuZGxlLFxuICAgIG5hbWU6IFN5bWJvbE5hbWVcbiAgKTogc3RyaW5nIHwgdW5kZWZpbmVkID0+IHtcbiAgICBjb25zdCBoYW5kbGUgPSBvd24odmFsdWUsIHN5bShuYW1lKSk7XG4gICAgaWYgKCFoYW5kbGUpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgY29uc3QgcmVzdWx0ID0gaGFuZGxlLmlzU3RyaW5nID8gaGFuZGxlLnRvU3RyaW5nKCkgOiB1bmRlZmluZWQ7XG4gICAgaGFuZGxlLmRpc3Bvc2UoKTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9O1xuXG4gIGNvbnN0IHJlZHVjZUFib3J0ID0gKHZhbHVlOiBKU1ZhbHVlSGFuZGxlKTogdW5rbm93biA9PiB7XG4gICAgLy8gc3RyZWFtTmFtZS9ob29rVG9rZW4gbGl2ZSBvbiB0aGUgc2lnbmFsIChvciB0aGUgY29udHJvbGxlcidzIHNpZ25hbCkuXG4gICAgY29uc3Qgc2lnbmFsID0gb3duKHZhbHVlLCAnc2lnbmFsJyk7XG4gICAgY29uc3QgaG9sZGVyID0gc2lnbmFsID8/IHZhbHVlO1xuICAgIGNvbnN0IHN0cmVhbU5hbWUgPVxuICAgICAgb3duU3ltYm9sU3RyaW5nKHZhbHVlLCAnV09SS0ZMT1dfQUJPUlRfU1RSRUFNX05BTUUnKSA/P1xuICAgICAgb3duU3ltYm9sU3RyaW5nKGhvbGRlciwgJ1dPUktGTE9XX0FCT1JUX1NUUkVBTV9OQU1FJyk7XG4gICAgY29uc3QgaG9va1Rva2VuID1cbiAgICAgIG93blN5bWJvbFN0cmluZyh2YWx1ZSwgJ1dPUktGTE9XX0FCT1JUX0hPT0tfVE9LRU4nKSA/P1xuICAgICAgb3duU3ltYm9sU3RyaW5nKGhvbGRlciwgJ1dPUktGTE9XX0FCT1JUX0hPT0tfVE9LRU4nKTtcbiAgICBpZiAoIXN0cmVhbU5hbWUpIHtcbiAgICAgIHNpZ25hbD8uZGlzcG9zZSgpO1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdBYm9ydENvbnRyb2xsZXIvQWJvcnRTaWduYWwgc3RyZWFtIG5hbWUgaXMgbm90IHNldCcpO1xuICAgIH1cbiAgICBjb25zdCBhYm9ydGVkID1cbiAgICAgIG93bihob2xkZXIsICdhYm9ydGVkJyk/LmNvbnN1bWUoKGgpID0+IGgudG9Cb29sZWFuKCkpID8/IGZhbHNlO1xuICAgIGNvbnN0IHJlYXNvbiA9IGFib3J0ZWQgPyBvd24oaG9sZGVyLCAncmVhc29uJykgOiB1bmRlZmluZWQ7XG4gICAgaWYgKHNpZ25hbCAmJiBob2xkZXIgIT09IHZhbHVlKSBzaWduYWwuZGlzcG9zZSgpO1xuICAgIHJldHVybiB7XG4gICAgICBzdHJlYW1OYW1lLFxuICAgICAgaG9va1Rva2VuLFxuICAgICAgYWJvcnRlZCxcbiAgICAgIHJlYXNvbjogYWJvcnRlZCA/IHJlYXNvbiA6IHVuZGVmaW5lZCxcbiAgICB9O1xuICB9O1xuXG4gIGNvbnN0IHJlZHVjZXJzOiBSZWNvcmQ8c3RyaW5nLCAodmFsdWU6IGFueSkgPT4gYW55PiA9IHtcbiAgICAvLyBPcmRlciBpcyB3aXJlLXNpZ25pZmljYW50IChmaXJzdCBtYXRjaCB3aW5zKSBhbmQgbWlycm9yc1xuICAgIC8vIGNvZGVjLWRldmFsdWUtdm0udHMgZ2V0UmVkdWNlcnNGb3JNb2RlKCd3b3JrZmxvdycpIGV4YWN0bHkuXG4gICAgQWJvcnRDb250cm9sbGVyOiAodmFsdWUpID0+IHtcbiAgICAgIGlmICghaXNIYW5kbGUodmFsdWUpIHx8IHZhbHVlLnR5cGVvZiAhPT0gJ29iamVjdCcgfHwgdmFsdWUuaXNOdWxsKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIGlmICghZ3Vlc3RIYXNPd24odmFsdWUsICdzaWduYWwnKSkgcmV0dXJuIGZhbHNlO1xuICAgICAgY29uc3QgaGFzU3RhbXAgPVxuICAgICAgICBvd25TeW1ib2xTdHJpbmcodmFsdWUsICdXT1JLRkxPV19BQk9SVF9TVFJFQU1fTkFNRScpICE9PSB1bmRlZmluZWQgfHxcbiAgICAgICAgb3duKHZhbHVlLCAnc2lnbmFsJyk/LmNvbnN1bWUoXG4gICAgICAgICAgKHNpZ25hbCkgPT5cbiAgICAgICAgICAgIG93blN5bWJvbFN0cmluZyhzaWduYWwsICdXT1JLRkxPV19BQk9SVF9TVFJFQU1fTkFNRScpICE9PSB1bmRlZmluZWRcbiAgICAgICAgKTtcbiAgICAgIGlmICghaGFzU3RhbXApIHJldHVybiBmYWxzZTtcbiAgICAgIHJldHVybiByZWR1Y2VBYm9ydCh2YWx1ZSk7XG4gICAgfSxcbiAgICBBYm9ydFNpZ25hbDogKHZhbHVlKSA9PiB7XG4gICAgICBpZiAoIWlzSGFuZGxlKHZhbHVlKSB8fCB2YWx1ZS50eXBlb2YgIT09ICdvYmplY3QnIHx8IHZhbHVlLmlzTnVsbCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICBpZiAob3duU3ltYm9sU3RyaW5nKHZhbHVlLCAnV09SS0ZMT1dfQUJPUlRfU1RSRUFNX05BTUUnKSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZWR1Y2VBYm9ydCh2YWx1ZSk7XG4gICAgfSxcbiAgICBDbGFzczogKHZhbHVlKSA9PiB7XG4gICAgICBpZiAoIWlzSGFuZGxlKHZhbHVlKSB8fCB2YWx1ZS50eXBlb2YgIT09ICdmdW5jdGlvbicpIHJldHVybiBmYWxzZTtcbiAgICAgIGNvbnN0IGNsYXNzSWQgPSBvd25TdHJpbmcodmFsdWUsICdjbGFzc0lkJyk7XG4gICAgICBpZiAoY2xhc3NJZCA9PT0gdW5kZWZpbmVkKSByZXR1cm4gZmFsc2U7XG4gICAgICByZXR1cm4geyBjbGFzc0lkIH07XG4gICAgfSxcbiAgICBJbnN0YW5jZTogKHZhbHVlKSA9PiB7XG4gICAgICBpZiAoIWlzSGFuZGxlKHZhbHVlKSB8fCB2YWx1ZS50eXBlb2YgIT09ICdvYmplY3QnIHx8IHZhbHVlLmlzTnVsbCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICBjb25zdCBjbHMgPSBjaGFpbmVkKHZhbHVlLCAnY29uc3RydWN0b3InKTtcbiAgICAgIGlmICghY2xzIHx8IGNscy50eXBlb2YgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgY2xzPy5kaXNwb3NlKCk7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHNlcmlhbGl6ZU1ldGhvZCA9IGNoYWluZWQoY2xzLCBzeW0oJ3dvcmtmbG93LXNlcmlhbGl6ZScpKTtcbiAgICAgICAgaWYgKCFzZXJpYWxpemVNZXRob2QgfHwgc2VyaWFsaXplTWV0aG9kLnR5cGVvZiAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIHNlcmlhbGl6ZU1ldGhvZD8uZGlzcG9zZSgpO1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IGNsYXNzSWQgPSBjaGFpbmVkU3RyaW5nKGNscywgJ2NsYXNzSWQnKTtcbiAgICAgICAgICBpZiAoY2xhc3NJZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBjb25zdCBuYW1lID0gY2hhaW5lZFN0cmluZyhjbHMsICduYW1lJykgPz8gJzxhbm9ueW1vdXM+JztcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgICAgYENsYXNzIFwiJHtuYW1lfVwiIHdpdGggU3ltYm9sKHdvcmtmbG93LXNlcmlhbGl6ZSkgbXVzdCBoYXZlIGEgc3RhdGljIFwiY2xhc3NJZFwiIHByb3BlcnR5LmBcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vIEd1ZXN0IGNvZGUgYnkgY29udHJhY3Q6IHRoZSBjbGFzcydzIG93biBzZXJpYWxpemVyIHJ1bnMsIGV4YWN0bHlcbiAgICAgICAgICAvLyBhcyBpdCBkaWQgdW5kZXIgdGhlIGluLVZNIGNvZGVjLlxuICAgICAgICAgIGNvbnN0IGRhdGEgPSBjYWxsKHNlcmlhbGl6ZU1ldGhvZCwgY2xzLCB2YWx1ZSk7XG4gICAgICAgICAgcmV0dXJuIHsgY2xhc3NJZCwgZGF0YSB9O1xuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgIHNlcmlhbGl6ZU1ldGhvZC5kaXNwb3NlKCk7XG4gICAgICAgIH1cbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIGNscy5kaXNwb3NlKCk7XG4gICAgICB9XG4gICAgfSxcbiAgICBTdGVwRnVuY3Rpb246ICh2YWx1ZSkgPT4ge1xuICAgICAgaWYgKCFpc0hhbmRsZSh2YWx1ZSkgfHwgdmFsdWUudHlwZW9mICE9PSAnZnVuY3Rpb24nKSByZXR1cm4gZmFsc2U7XG4gICAgICBjb25zdCBzdGVwSWQgPSBvd25TdHJpbmcodmFsdWUsICdzdGVwSWQnKTtcbiAgICAgIGlmIChzdGVwSWQgPT09IHVuZGVmaW5lZCkgcmV0dXJuIGZhbHNlO1xuICAgICAgY29uc3QgcGF5bG9hZDoge1xuICAgICAgICBzdGVwSWQ6IHN0cmluZztcbiAgICAgICAgY2xvc3VyZVZhcnM/OiB1bmtub3duO1xuICAgICAgICBib3VuZFRoaXM/OiB1bmtub3duO1xuICAgICAgICBib3VuZEFyZ3M/OiB1bmtub3duO1xuICAgICAgfSA9IHsgc3RlcElkIH07XG4gICAgICBjb25zdCBjbG9zdXJlVmFyc0ZuID0gb3duKHZhbHVlLCAnX19jbG9zdXJlVmFyc0ZuJyk7XG4gICAgICBpZiAoY2xvc3VyZVZhcnNGbikge1xuICAgICAgICBpZiAoY2xvc3VyZVZhcnNGbi50eXBlb2YgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAvLyBHdWVzdCBjb2RlIGJ5IGNvbnRyYWN0IChzYW1lIGFzIHRoZSBpbi1WTSBjb2RlYykuXG4gICAgICAgICAgY29uc3QgY2xvc3VyZVZhcnMgPSBjYWxsKGNsb3N1cmVWYXJzRm4sIHZtLnVuZGVmaW5lZCk7XG4gICAgICAgICAgaWYgKCFjbG9zdXJlVmFycy5pc1VuZGVmaW5lZCkgcGF5bG9hZC5jbG9zdXJlVmFycyA9IGNsb3N1cmVWYXJzO1xuICAgICAgICAgIGVsc2UgY2xvc3VyZVZhcnMuZGlzcG9zZSgpO1xuICAgICAgICB9XG4gICAgICAgIGNsb3N1cmVWYXJzRm4uZGlzcG9zZSgpO1xuICAgICAgfVxuICAgICAgaWYgKGd1ZXN0SGFzT3duKHZhbHVlLCAnX19ib3VuZFRoaXMnKSkge1xuICAgICAgICBwYXlsb2FkLmJvdW5kVGhpcyA9IG93bih2YWx1ZSwgJ19fYm91bmRUaGlzJyk7XG4gICAgICB9XG4gICAgICBjb25zdCBib3VuZEFyZ3MgPSBvd24odmFsdWUsICdfX2JvdW5kQXJncycpO1xuICAgICAgaWYgKGJvdW5kQXJncykge1xuICAgICAgICBjb25zdCBsZW5ndGggPVxuICAgICAgICAgIG93bihib3VuZEFyZ3MsICdsZW5ndGgnKT8uY29uc3VtZSgoaCkgPT4gaC50b051bWJlcigpKSA/PyAwO1xuICAgICAgICBpZiAoYm91bmRBcmdzLmlzQXJyYXkgJiYgbGVuZ3RoID4gMCkgcGF5bG9hZC5ib3VuZEFyZ3MgPSBib3VuZEFyZ3M7XG4gICAgICAgIGVsc2UgYm91bmRBcmdzLmRpc3Bvc2UoKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBwYXlsb2FkO1xuICAgIH0sXG4gICAgQXJyYXlCdWZmZXI6ICh2YWx1ZSkgPT4ge1xuICAgICAgaWYgKCFpc0hhbmRsZSh2YWx1ZSkgfHwgdGFnT2ZIYW5kbGUodmFsdWUpICE9PSAnQXJyYXlCdWZmZXInKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBieXRlc1RvQmFzZTY0KG5ldyBVaW50OEFycmF5KHZhbHVlLnRvQXJyYXlCdWZmZXIoKSkpO1xuICAgIH0sXG4gICAgQmlnSW50OiAodmFsdWUpID0+IHtcbiAgICAgIGlmICghaXNIYW5kbGUodmFsdWUpIHx8ICF2YWx1ZS5pc0JpZ0ludCkgcmV0dXJuIGZhbHNlO1xuICAgICAgcmV0dXJuIGd1ZXN0QmlnSW50KHZhbHVlKS50b1N0cmluZygpO1xuICAgIH0sXG4gICAgQmlnSW50NjRBcnJheTogKHZhbHVlKSA9PlxuICAgICAgaXNIYW5kbGUodmFsdWUpICYmIHRhZ09mSGFuZGxlKHZhbHVlKSA9PT0gJ0JpZ0ludDY0QXJyYXknXG4gICAgICAgID8gYnl0ZXNUb0Jhc2U2NCh2aWV3Qnl0ZXModmFsdWUpKVxuICAgICAgICA6IGZhbHNlLFxuICAgIEJpZ1VpbnQ2NEFycmF5OiAodmFsdWUpID0+XG4gICAgICBpc0hhbmRsZSh2YWx1ZSkgJiYgdGFnT2ZIYW5kbGUodmFsdWUpID09PSAnQmlnVWludDY0QXJyYXknXG4gICAgICAgID8gYnl0ZXNUb0Jhc2U2NCh2aWV3Qnl0ZXModmFsdWUpKVxuICAgICAgICA6IGZhbHNlLFxuICAgIERhdGU6ICh2YWx1ZSkgPT4ge1xuICAgICAgaWYgKCFpc0hhbmRsZSh2YWx1ZSkgfHwgdGFnT2ZIYW5kbGUodmFsdWUpICE9PSAnRGF0ZScpIHJldHVybiBmYWxzZTtcbiAgICAgIGNvbnN0IHRpbWUgPSBjYWxsKGkuZGF0ZUdldFRpbWUsIHZhbHVlKS5jb25zdW1lKChoKSA9PiBoLnRvTnVtYmVyKCkpO1xuICAgICAgaWYgKE51bWJlci5pc05hTih0aW1lKSkgcmV0dXJuICcuJztcbiAgICAgIHJldHVybiBjYWxsKGkuZGF0ZVRvSVNPU3RyaW5nLCB2YWx1ZSkuY29uc3VtZSgoaCkgPT4gaC50b1N0cmluZygpKTtcbiAgICB9LFxuICAgIERPTUV4Y2VwdGlvbjogKHZhbHVlKSA9PiB7XG4gICAgICBpZiAoIWlzSGFuZGxlKHZhbHVlKSB8fCAhaXNIYW5kbGUodmFsdWUpKSByZXR1cm4gZmFsc2U7XG4gICAgICBpZiAoXG4gICAgICAgICFpLmRvbUV4Y2VwdGlvblByb3RvdHlwZSB8fFxuICAgICAgICAhaGFzUHJvdG90eXBlKHZhbHVlLCBpLmRvbUV4Y2VwdGlvblByb3RvdHlwZSlcbiAgICAgICkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICBjb25zdCBzaGFwZSA9IHJlZHVjZUVycm9yU2hhcGUodmFsdWUpIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgbWVzc2FnZTogc2hhcGUubWVzc2FnZSxcbiAgICAgICAgbmFtZTogY2hhaW5lZFN0cmluZyh2YWx1ZSwgJ25hbWUnKSxcbiAgICAgICAgc3RhY2s6IHNoYXBlLnN0YWNrLFxuICAgICAgICAuLi4oT2JqZWN0Lmhhc093bihzaGFwZSwgJ2NhdXNlJykgPyB7IGNhdXNlOiBzaGFwZS5jYXVzZSB9IDoge30pLFxuICAgICAgfTtcbiAgICB9LFxuICAgIEFnZ3JlZ2F0ZUVycm9yOiAodmFsdWUpID0+IHtcbiAgICAgIGlmICghaXNIYW5kbGUodmFsdWUpIHx8ICF2YWx1ZS5pc0Vycm9yKSByZXR1cm4gZmFsc2U7XG4gICAgICBpZiAoY2hhaW5lZFN0cmluZyh2YWx1ZSwgJ25hbWUnKSAhPT0gJ0FnZ3JlZ2F0ZUVycm9yJykgcmV0dXJuIGZhbHNlO1xuICAgICAgY29uc3Qgc2hhcGUgPSByZWR1Y2VFcnJvclNoYXBlKHZhbHVlKSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIG1lc3NhZ2U6IHNoYXBlLm1lc3NhZ2UsXG4gICAgICAgIHN0YWNrOiBzaGFwZS5zdGFjayxcbiAgICAgICAgZXJyb3JzOiBvd24odmFsdWUsICdlcnJvcnMnKSxcbiAgICAgICAgLi4uKE9iamVjdC5oYXNPd24oc2hhcGUsICdjYXVzZScpID8geyBjYXVzZTogc2hhcGUuY2F1c2UgfSA6IHt9KSxcbiAgICAgIH07XG4gICAgfSxcbiAgICBFdmFsRXJyb3I6IG5hbWVkRXJyb3JTdWJjbGFzc1JlZHVjZXIoJ0V2YWxFcnJvcicpLFxuICAgIEZhdGFsRXJyb3I6IG5hbWVkRXJyb3JTdWJjbGFzc1JlZHVjZXIoJ0ZhdGFsRXJyb3InKSxcbiAgICBIb29rQ29uZmxpY3RFcnJvcjogKHZhbHVlKSA9PiB7XG4gICAgICBpZiAoIWlzSGFuZGxlKHZhbHVlKSB8fCAhdmFsdWUuaXNFcnJvcikgcmV0dXJuIGZhbHNlO1xuICAgICAgaWYgKGNoYWluZWRTdHJpbmcodmFsdWUsICduYW1lJykgIT09ICdIb29rQ29uZmxpY3RFcnJvcicpIHJldHVybiBmYWxzZTtcbiAgICAgIGNvbnN0IHNoYXBlID0gcmVkdWNlRXJyb3JTaGFwZSh2YWx1ZSkgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gICAgICBjb25zdCByZWR1Y2VkOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHtcbiAgICAgICAgbWVzc2FnZTogc2hhcGUubWVzc2FnZSxcbiAgICAgICAgc3RhY2s6IHNoYXBlLnN0YWNrLFxuICAgICAgICB0b2tlbjogb3duKHZhbHVlLCAndG9rZW4nKSxcbiAgICAgIH07XG4gICAgICBjb25zdCBjb25mbGljdGluZ1J1bklkID0gb3duKHZhbHVlLCAnY29uZmxpY3RpbmdSdW5JZCcpO1xuICAgICAgaWYgKGNvbmZsaWN0aW5nUnVuSWQgJiYgIWNvbmZsaWN0aW5nUnVuSWQuaXNVbmRlZmluZWQpIHtcbiAgICAgICAgcmVkdWNlZC5jb25mbGljdGluZ1J1bklkID0gY29uZmxpY3RpbmdSdW5JZDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbmZsaWN0aW5nUnVuSWQ/LmRpc3Bvc2UoKTtcbiAgICAgIH1cbiAgICAgIGlmIChPYmplY3QuaGFzT3duKHNoYXBlLCAnY2F1c2UnKSkgcmVkdWNlZC5jYXVzZSA9IHNoYXBlLmNhdXNlO1xuICAgICAgcmV0dXJuIHJlZHVjZWQ7XG4gICAgfSxcbiAgICBSYW5nZUVycm9yOiBuYW1lZEVycm9yU3ViY2xhc3NSZWR1Y2VyKCdSYW5nZUVycm9yJyksXG4gICAgUmVmZXJlbmNlRXJyb3I6IG5hbWVkRXJyb3JTdWJjbGFzc1JlZHVjZXIoJ1JlZmVyZW5jZUVycm9yJyksXG4gICAgUmV0cnlhYmxlRXJyb3I6ICh2YWx1ZSkgPT4ge1xuICAgICAgaWYgKCFpc0hhbmRsZSh2YWx1ZSkgfHwgIXZhbHVlLmlzRXJyb3IpIHJldHVybiBmYWxzZTtcbiAgICAgIGlmIChjaGFpbmVkU3RyaW5nKHZhbHVlLCAnbmFtZScpICE9PSAnUmV0cnlhYmxlRXJyb3InKSByZXR1cm4gZmFsc2U7XG4gICAgICBjb25zdCBzaGFwZSA9IHJlZHVjZUVycm9yU2hhcGUodmFsdWUpIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAgICAgLy8gcmV0cnlBZnRlciBpcyBhIGd1ZXN0IERhdGUgKG9yIHN0cmluZy9udW1iZXIpOyBub3JtYWxpemUgdG8gYW4gZXBvY2hcbiAgICAgIC8vIHRpbWVzdGFtcCBleGFjdGx5IGxpa2UgdGhlIGluLVZNIHJlZHVjZXIuIFRoZSBhYnNlbnQvaW52YWxpZFxuICAgICAgLy8gZmFsbGJhY2sgcmVhZHMgdGhlIEdVRVNUIGNsb2NrICh0aGUgZGV0ZXJtaW5pc3RpYyByZXBsYXkgY2xvY2sgYXRcbiAgICAgIC8vIHRoZSBXQVNJIGxheWVyKSwgbm90IHRoZSBob3N0IHdhbGwgY2xvY2s6IHRoZSBpbi1WTSByZWR1Y2VyJ3NcbiAgICAgIC8vIGBEYXRlLm5vdygpYCB3YXMgcmVwbGF5LXN0YWJsZSBieSBjb25zdHJ1Y3Rpb24sIGFuZCBhIGhvc3Qtc2lkZVxuICAgICAgLy8gYERhdGUubm93KClgIGhlcmUgd291bGQgd3JpdGUgZGlmZmVyZW50IGJ5dGVzIG9uIGV2ZXJ5IHJlcGxheSBvZlxuICAgICAgLy8gdGhlIHNhbWUgdmFsdWUuXG4gICAgICBsZXQgcmV0cnlBZnRlciA9IGludm9rZShpLmRhdGVOb3cpLmNvbnN1bWUoKGgpID0+IGgudG9OdW1iZXIoKSkgKyAxMDAwO1xuICAgICAgY29uc3QgcmF3ID0gb3duKHZhbHVlLCAncmV0cnlBZnRlcicpO1xuICAgICAgaWYgKHJhdykge1xuICAgICAgICBpZiAodGFnT2ZIYW5kbGUocmF3KSA9PT0gJ0RhdGUnKSB7XG4gICAgICAgICAgY29uc3QgdCA9IGNhbGwoaS5kYXRlR2V0VGltZSwgcmF3KS5jb25zdW1lKChoKSA9PiBoLnRvTnVtYmVyKCkpO1xuICAgICAgICAgIGlmICghTnVtYmVyLmlzTmFOKHQpKSByZXRyeUFmdGVyID0gdDtcbiAgICAgICAgfSBlbHNlIGlmIChyYXcuaXNTdHJpbmcgfHwgcmF3LmlzTnVtYmVyKSB7XG4gICAgICAgICAgY29uc3QgdCA9IG5ldyBEYXRlKFxuICAgICAgICAgICAgcmF3LmlzU3RyaW5nID8gcmF3LnRvU3RyaW5nKCkgOiByYXcudG9OdW1iZXIoKVxuICAgICAgICAgICkuZ2V0VGltZSgpO1xuICAgICAgICAgIGlmICghTnVtYmVyLmlzTmFOKHQpKSByZXRyeUFmdGVyID0gdDtcbiAgICAgICAgfVxuICAgICAgICByYXcuZGlzcG9zZSgpO1xuICAgICAgfVxuICAgICAgY29uc3QgcmVkdWNlZDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7XG4gICAgICAgIG1lc3NhZ2U6IHNoYXBlLm1lc3NhZ2UsXG4gICAgICAgIHN0YWNrOiBzaGFwZS5zdGFjayxcbiAgICAgICAgcmV0cnlBZnRlcixcbiAgICAgIH07XG4gICAgICBpZiAoT2JqZWN0Lmhhc093bihzaGFwZSwgJ2NhdXNlJykpIHJlZHVjZWQuY2F1c2UgPSBzaGFwZS5jYXVzZTtcbiAgICAgIHJldHVybiByZWR1Y2VkO1xuICAgIH0sXG4gICAgUnVudGltZURlY3J5cHRpb25FcnJvcjogKHZhbHVlKSA9PiB7XG4gICAgICBpZiAoIWlzSGFuZGxlKHZhbHVlKSB8fCAhdmFsdWUuaXNFcnJvcikgcmV0dXJuIGZhbHNlO1xuICAgICAgaWYgKGNoYWluZWRTdHJpbmcodmFsdWUsICduYW1lJykgIT09ICdSdW50aW1lRGVjcnlwdGlvbkVycm9yJykge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICBjb25zdCBzaGFwZSA9IHJlZHVjZUVycm9yU2hhcGUodmFsdWUpIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAgICAgY29uc3QgcmVkdWNlZDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7XG4gICAgICAgIG1lc3NhZ2U6IHNoYXBlLm1lc3NhZ2UsXG4gICAgICAgIHN0YWNrOiBzaGFwZS5zdGFjayxcbiAgICAgIH07XG4gICAgICBjb25zdCBjb250ZXh0ID0gb3duKHZhbHVlLCAnY29udGV4dCcpO1xuICAgICAgaWYgKGNvbnRleHQgJiYgIWNvbnRleHQuaXNVbmRlZmluZWQpIHJlZHVjZWQuY29udGV4dCA9IGNvbnRleHQ7XG4gICAgICBlbHNlIGNvbnRleHQ/LmRpc3Bvc2UoKTtcbiAgICAgIGlmIChPYmplY3QuaGFzT3duKHNoYXBlLCAnY2F1c2UnKSkgcmVkdWNlZC5jYXVzZSA9IHNoYXBlLmNhdXNlO1xuICAgICAgcmV0dXJuIHJlZHVjZWQ7XG4gICAgfSxcbiAgICBTdHJlYW1FcnJvcjogKHZhbHVlKSA9PiB7XG4gICAgICBpZiAoIWlzSGFuZGxlKHZhbHVlKSB8fCAhdmFsdWUuaXNFcnJvcikgcmV0dXJuIGZhbHNlO1xuICAgICAgaWYgKGNoYWluZWRTdHJpbmcodmFsdWUsICduYW1lJykgIT09ICdTdHJlYW1FcnJvcicpIHJldHVybiBmYWxzZTtcbiAgICAgIGNvbnN0IHNoYXBlID0gcmVkdWNlRXJyb3JTaGFwZSh2YWx1ZSkgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gICAgICBjb25zdCByZWR1Y2VkOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHtcbiAgICAgICAgbWVzc2FnZTogc2hhcGUubWVzc2FnZSxcbiAgICAgICAgc3RhY2s6IHNoYXBlLnN0YWNrLFxuICAgICAgfTtcbiAgICAgIGlmIChPYmplY3QuaGFzT3duKHNoYXBlLCAnY2F1c2UnKSkgcmVkdWNlZC5jYXVzZSA9IHNoYXBlLmNhdXNlO1xuICAgICAgY29uc3Qgc3RhdHVzID0gb3duKHZhbHVlLCAnc3RhdHVzJyk7XG4gICAgICBpZiAoc3RhdHVzICYmICFzdGF0dXMuaXNVbmRlZmluZWQpIHJlZHVjZWQuc3RhdHVzID0gc3RhdHVzO1xuICAgICAgZWxzZSBzdGF0dXM/LmRpc3Bvc2UoKTtcbiAgICAgIGNvbnN0IHVybCA9IG93bih2YWx1ZSwgJ3VybCcpO1xuICAgICAgaWYgKHVybCAmJiAhdXJsLmlzVW5kZWZpbmVkKSByZWR1Y2VkLnVybCA9IHVybDtcbiAgICAgIGVsc2UgdXJsPy5kaXNwb3NlKCk7XG4gICAgICByZXR1cm4gcmVkdWNlZDtcbiAgICB9LFxuICAgIFN5bnRheEVycm9yOiBuYW1lZEVycm9yU3ViY2xhc3NSZWR1Y2VyKCdTeW50YXhFcnJvcicpLFxuICAgIFR5cGVFcnJvcjogbmFtZWRFcnJvclN1YmNsYXNzUmVkdWNlcignVHlwZUVycm9yJyksXG4gICAgVVJJRXJyb3I6IG5hbWVkRXJyb3JTdWJjbGFzc1JlZHVjZXIoJ1VSSUVycm9yJyksXG4gICAgRXJyb3I6ICh2YWx1ZSkgPT4ge1xuICAgICAgaWYgKCFpc0hhbmRsZSh2YWx1ZSkgfHwgIXZhbHVlLmlzRXJyb3IpIHJldHVybiBmYWxzZTtcbiAgICAgIGNvbnN0IHNoYXBlID0gcmVkdWNlRXJyb3JTaGFwZSh2YWx1ZSkgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gICAgICByZXR1cm4ge1xuICAgICAgICBuYW1lOiBjaGFpbmVkU3RyaW5nKHZhbHVlLCAnbmFtZScpID8/ICdFcnJvcicsXG4gICAgICAgIG1lc3NhZ2U6IHNoYXBlLm1lc3NhZ2UsXG4gICAgICAgIHN0YWNrOiBzaGFwZS5zdGFjayxcbiAgICAgICAgLi4uKE9iamVjdC5oYXNPd24oc2hhcGUsICdjYXVzZScpID8geyBjYXVzZTogc2hhcGUuY2F1c2UgfSA6IHt9KSxcbiAgICAgIH07XG4gICAgfSxcbiAgICBGbG9hdDMyQXJyYXk6ICh2YWx1ZSkgPT5cbiAgICAgIGlzSGFuZGxlKHZhbHVlKSAmJiB0YWdPZkhhbmRsZSh2YWx1ZSkgPT09ICdGbG9hdDMyQXJyYXknXG4gICAgICAgID8gYnl0ZXNUb0Jhc2U2NCh2aWV3Qnl0ZXModmFsdWUpKVxuICAgICAgICA6IGZhbHNlLFxuICAgIEZsb2F0NjRBcnJheTogKHZhbHVlKSA9PlxuICAgICAgaXNIYW5kbGUodmFsdWUpICYmIHRhZ09mSGFuZGxlKHZhbHVlKSA9PT0gJ0Zsb2F0NjRBcnJheSdcbiAgICAgICAgPyBieXRlc1RvQmFzZTY0KHZpZXdCeXRlcyh2YWx1ZSkpXG4gICAgICAgIDogZmFsc2UsXG4gICAgSW50OEFycmF5OiAodmFsdWUpID0+XG4gICAgICBpc0hhbmRsZSh2YWx1ZSkgJiYgdGFnT2ZIYW5kbGUodmFsdWUpID09PSAnSW50OEFycmF5J1xuICAgICAgICA/IGJ5dGVzVG9CYXNlNjQodmlld0J5dGVzKHZhbHVlKSlcbiAgICAgICAgOiBmYWxzZSxcbiAgICBJbnQxNkFycmF5OiAodmFsdWUpID0+XG4gICAgICBpc0hhbmRsZSh2YWx1ZSkgJiYgdGFnT2ZIYW5kbGUodmFsdWUpID09PSAnSW50MTZBcnJheSdcbiAgICAgICAgPyBieXRlc1RvQmFzZTY0KHZpZXdCeXRlcyh2YWx1ZSkpXG4gICAgICAgIDogZmFsc2UsXG4gICAgSW50MzJBcnJheTogKHZhbHVlKSA9PlxuICAgICAgaXNIYW5kbGUodmFsdWUpICYmIHRhZ09mSGFuZGxlKHZhbHVlKSA9PT0gJ0ludDMyQXJyYXknXG4gICAgICAgID8gYnl0ZXNUb0Jhc2U2NCh2aWV3Qnl0ZXModmFsdWUpKVxuICAgICAgICA6IGZhbHNlLFxuICAgIE1hcDogKHZhbHVlKSA9PlxuICAgICAgaXNIYW5kbGUodmFsdWUpICYmIHRhZ09mSGFuZGxlKHZhbHVlKSA9PT0gJ01hcCdcbiAgICAgICAgPyBjb2xsZWN0KGkubWFwRm9yRWFjaCwgdmFsdWUsIDIpXG4gICAgICAgIDogZmFsc2UsXG4gICAgUmVnRXhwOiAodmFsdWUpID0+IHtcbiAgICAgIGlmICghaXNIYW5kbGUodmFsdWUpIHx8IHRhZ09mSGFuZGxlKHZhbHVlKSAhPT0gJ1JlZ0V4cCcpIHJldHVybiBmYWxzZTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHNvdXJjZTogY2FsbChpLnJlZ0V4cFNvdXJjZSwgdmFsdWUpLmNvbnN1bWUoKGgpID0+IGgudG9TdHJpbmcoKSksXG4gICAgICAgIGZsYWdzOiBjYWxsKGkucmVnRXhwRmxhZ3MsIHZhbHVlKS5jb25zdW1lKChoKSA9PiBoLnRvU3RyaW5nKCkpLFxuICAgICAgfTtcbiAgICB9LFxuICAgIEhlYWRlcnM6ICh2YWx1ZSkgPT4ge1xuICAgICAgaWYgKFxuICAgICAgICAhaXNIYW5kbGUodmFsdWUpIHx8XG4gICAgICAgICFpLmhlYWRlcnNQcm90b3R5cGUgfHxcbiAgICAgICAgIWhhc1Byb3RvdHlwZSh2YWx1ZSwgaS5oZWFkZXJzUHJvdG90eXBlKSB8fFxuICAgICAgICAhaS5oZWFkZXJzRm9yRWFjaFxuICAgICAgKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIC8vIEhlYWRlcnMuZm9yRWFjaCB5aWVsZHMgKHZhbHVlLCBrZXkpOyBub3JtYWxpemUgdG8gW2tleSwgdmFsdWVdXG4gICAgICAvLyBwYWlycyBvZiBob3N0IHN0cmluZ3MsIG1hdGNoaW5nIEFycmF5LmZyb20oaGVhZGVycykuXG4gICAgICBjb25zdCBlbnRyaWVzOiBbc3RyaW5nLCBzdHJpbmddW10gPSBbXTtcbiAgICAgIGNvbnN0IHZpc2l0b3IgPSB2bS5uZXdFcGhlbWVyYWxGdW5jdGlvbihcbiAgICAgICAgKGhlYWRlclZhbHVlOiBKU1ZhbHVlSGFuZGxlLCBoZWFkZXJLZXk6IEpTVmFsdWVIYW5kbGUpID0+IHtcbiAgICAgICAgICBlbnRyaWVzLnB1c2goW2hlYWRlcktleS50b1N0cmluZygpLCBoZWFkZXJWYWx1ZS50b1N0cmluZygpXSk7XG4gICAgICAgICAgcmV0dXJuIHZtLnVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgKTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNhbGwoaS5oZWFkZXJzRm9yRWFjaCwgdmFsdWUsIHZpc2l0b3IpLmRpc3Bvc2UoKTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIHZpc2l0b3IuZGlzcG9zZSgpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGVudHJpZXM7XG4gICAgfSxcbiAgICBSZXF1ZXN0OiAodmFsdWUpID0+IHtcbiAgICAgIGlmICghaXNIYW5kbGUodmFsdWUpIHx8IHZhbHVlLnR5cGVvZiAhPT0gJ29iamVjdCcgfHwgdmFsdWUuaXNOdWxsKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGlzUmVxdWVzdCA9XG4gICAgICAgIChpLnJlcXVlc3RQcm90b3R5cGUgJiYgaGFzUHJvdG90eXBlKHZhbHVlLCBpLnJlcXVlc3RQcm90b3R5cGUpKSB8fFxuICAgICAgICBvd24odmFsdWUsICdqc29uJyk/LmNvbnN1bWUoKGgpID0+IGgudHlwZW9mID09PSAnZnVuY3Rpb24nKTtcbiAgICAgIGlmICghaXNSZXF1ZXN0KSByZXR1cm4gZmFsc2U7XG4gICAgICBjb25zdCBtZXRob2QgPSBvd24odmFsdWUsICdtZXRob2QnKTtcbiAgICAgIGlmICghbWV0aG9kIHx8ICFtZXRob2QuaXNTdHJpbmcpIHtcbiAgICAgICAgbWV0aG9kPy5kaXNwb3NlKCk7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGRhdGE6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge1xuICAgICAgICBtZXRob2QsXG4gICAgICAgIHVybDogb3duKHZhbHVlLCAndXJsJyksXG4gICAgICAgIGhlYWRlcnM6IG93bih2YWx1ZSwgJ2hlYWRlcnMnKSxcbiAgICAgICAgYm9keTogb3duKHZhbHVlLCAnYm9keScpLFxuICAgICAgICBkdXBsZXg6IG93bih2YWx1ZSwgJ2R1cGxleCcpLFxuICAgICAgfTtcbiAgICAgIGNvbnN0IHJlc3BvbnNlV3JpdGFibGUgPSBvd24odmFsdWUsIHN5bSgnV0VCSE9PS19SRVNQT05TRV9XUklUQUJMRScpKTtcbiAgICAgIGlmIChyZXNwb25zZVdyaXRhYmxlICYmICFyZXNwb25zZVdyaXRhYmxlLmlzVW5kZWZpbmVkKSB7XG4gICAgICAgIGRhdGEucmVzcG9uc2VXcml0YWJsZSA9IHJlc3BvbnNlV3JpdGFibGU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXNwb25zZVdyaXRhYmxlPy5kaXNwb3NlKCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gZGF0YTtcbiAgICB9LFxuICAgIFJlc3BvbnNlOiAodmFsdWUpID0+IHtcbiAgICAgIGlmICghaXNIYW5kbGUodmFsdWUpIHx8IHZhbHVlLnR5cGVvZiAhPT0gJ29iamVjdCcgfHwgdmFsdWUuaXNOdWxsKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGlzUmVzcG9uc2UgPVxuICAgICAgICAoaS5yZXNwb25zZVByb3RvdHlwZSAmJiBoYXNQcm90b3R5cGUodmFsdWUsIGkucmVzcG9uc2VQcm90b3R5cGUpKSB8fFxuICAgICAgICBjaGFpbmVkKHZhbHVlLCAnY2xvbmUnKT8uY29uc3VtZSgoaCkgPT4gaC50eXBlb2YgPT09ICdmdW5jdGlvbicpO1xuICAgICAgaWYgKCFpc1Jlc3BvbnNlKSByZXR1cm4gZmFsc2U7XG4gICAgICBjb25zdCBzdGF0dXMgPSBvd24odmFsdWUsICdzdGF0dXMnKTtcbiAgICAgIGlmICghc3RhdHVzIHx8ICFzdGF0dXMuaXNOdW1iZXIpIHtcbiAgICAgICAgc3RhdHVzPy5kaXNwb3NlKCk7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB7XG4gICAgICAgIHR5cGU6IG93bih2YWx1ZSwgJ3R5cGUnKSxcbiAgICAgICAgdXJsOiBvd24odmFsdWUsICd1cmwnKSxcbiAgICAgICAgc3RhdHVzLFxuICAgICAgICBzdGF0dXNUZXh0OiBvd24odmFsdWUsICdzdGF0dXNUZXh0JyksXG4gICAgICAgIGhlYWRlcnM6IG93bih2YWx1ZSwgJ2hlYWRlcnMnKSxcbiAgICAgICAgYm9keTogb3duKHZhbHVlLCAnYm9keScpLFxuICAgICAgICByZWRpcmVjdGVkOiBvd24odmFsdWUsICdyZWRpcmVjdGVkJyksXG4gICAgICB9O1xuICAgIH0sXG4gICAgUmVhZGFibGVTdHJlYW06ICh2YWx1ZSkgPT4ge1xuICAgICAgaWYgKFxuICAgICAgICAhaXNIYW5kbGUodmFsdWUpIHx8XG4gICAgICAgIHZhbHVlLnR5cGVvZiAhPT0gJ29iamVjdCcgfHxcbiAgICAgICAgdmFsdWUuaXNOdWxsIHx8XG4gICAgICAgICFpLnJlYWRhYmxlU3RyZWFtUHJvdG90eXBlIHx8XG4gICAgICAgICFoYXNQcm90b3R5cGUodmFsdWUsIGkucmVhZGFibGVTdHJlYW1Qcm90b3R5cGUpXG4gICAgICApIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgY29uc3QgYm9keUluaXQgPSBvd24odmFsdWUsIHN5bSgnQk9EWV9JTklUJykpO1xuICAgICAgaWYgKGJvZHlJbml0ICYmICFib2R5SW5pdC5pc1VuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4geyBib2R5SW5pdCB9O1xuICAgICAgfVxuICAgICAgYm9keUluaXQ/LmRpc3Bvc2UoKTtcbiAgICAgIGNvbnN0IG5hbWUgPSBvd25TeW1ib2xTdHJpbmcodmFsdWUsICdXT1JLRkxPV19TVFJFQU1fTkFNRScpO1xuICAgICAgaWYgKG5hbWUpIHtcbiAgICAgICAgY29uc3QgczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7IG5hbWUgfTtcbiAgICAgICAgY29uc3QgdHlwZSA9IG93blN5bWJvbFN0cmluZyh2YWx1ZSwgJ1dPUktGTE9XX1NUUkVBTV9UWVBFJyk7XG4gICAgICAgIGlmICh0eXBlKSBzLnR5cGUgPSB0eXBlO1xuICAgICAgICBjb25zdCBmcmFtaW5nID0gb3duU3ltYm9sU3RyaW5nKHZhbHVlLCAnV09SS0ZMT1dfU1RSRUFNX0ZSQU1JTkcnKTtcbiAgICAgICAgaWYgKGZyYW1pbmcpIHMuZnJhbWluZyA9IGZyYW1pbmc7XG4gICAgICAgIHJldHVybiBzO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHsgbmFtZTogJ19fZW1wdHknIH07XG4gICAgfSxcbiAgICBXcml0YWJsZVN0cmVhbTogKHZhbHVlKSA9PiB7XG4gICAgICBpZiAoXG4gICAgICAgICFpc0hhbmRsZSh2YWx1ZSkgfHxcbiAgICAgICAgdmFsdWUudHlwZW9mICE9PSAnb2JqZWN0JyB8fFxuICAgICAgICB2YWx1ZS5pc051bGwgfHxcbiAgICAgICAgIWkud3JpdGFibGVTdHJlYW1Qcm90b3R5cGUgfHxcbiAgICAgICAgIWhhc1Byb3RvdHlwZSh2YWx1ZSwgaS53cml0YWJsZVN0cmVhbVByb3RvdHlwZSlcbiAgICAgICkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICBjb25zdCBzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHtcbiAgICAgICAgbmFtZTogb3duU3ltYm9sU3RyaW5nKHZhbHVlLCAnV09SS0ZMT1dfU1RSRUFNX05BTUUnKSB8fCAnX19lbXB0eScsXG4gICAgICB9O1xuICAgICAgY29uc3QgcnVuSWQgPSBvd25TeW1ib2xTdHJpbmcodmFsdWUsICdXT1JLRkxPV19TVFJFQU1fU0VSVkVSX1JVTl9JRCcpO1xuICAgICAgaWYgKHJ1bklkKSBzLnJ1bklkID0gcnVuSWQ7XG4gICAgICBjb25zdCBkZXBsb3ltZW50SWQgPSBvd25TeW1ib2xTdHJpbmcoXG4gICAgICAgIHZhbHVlLFxuICAgICAgICAnV09SS0ZMT1dfU1RSRUFNX1NFUlZFUl9ERVBMT1lNRU5UX0lEJ1xuICAgICAgKTtcbiAgICAgIGlmIChkZXBsb3ltZW50SWQpIHMuZGVwbG95bWVudElkID0gZGVwbG95bWVudElkO1xuICAgICAgcmV0dXJuIHM7XG4gICAgfSxcbiAgICBTZXQ6ICh2YWx1ZSkgPT5cbiAgICAgIGlzSGFuZGxlKHZhbHVlKSAmJiB0YWdPZkhhbmRsZSh2YWx1ZSkgPT09ICdTZXQnXG4gICAgICAgID8gY29sbGVjdChpLnNldEZvckVhY2gsIHZhbHVlLCAxKVxuICAgICAgICA6IGZhbHNlLFxuICAgIFVSTDogKHZhbHVlKSA9PiB7XG4gICAgICBpZiAoXG4gICAgICAgICFpc0hhbmRsZSh2YWx1ZSkgfHxcbiAgICAgICAgIWkudXJsUHJvdG90eXBlIHx8XG4gICAgICAgICFoYXNQcm90b3R5cGUodmFsdWUsIGkudXJsUHJvdG90eXBlKSB8fFxuICAgICAgICAhaS51cmxIcmVmXG4gICAgICApIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGNhbGwoaS51cmxIcmVmLCB2YWx1ZSkuY29uc3VtZSgoaCkgPT4gaC50b1N0cmluZygpKTtcbiAgICB9LFxuICAgIFdvcmtmbG93RnVuY3Rpb246ICh2YWx1ZSkgPT4ge1xuICAgICAgaWYgKCFpc0hhbmRsZSh2YWx1ZSkgfHwgdmFsdWUudHlwZW9mICE9PSAnZnVuY3Rpb24nKSByZXR1cm4gZmFsc2U7XG4gICAgICBjb25zdCB3b3JrZmxvd0lkID0gb3duU3RyaW5nKHZhbHVlLCAnd29ya2Zsb3dJZCcpO1xuICAgICAgaWYgKHdvcmtmbG93SWQgPT09IHVuZGVmaW5lZCkgcmV0dXJuIGZhbHNlO1xuICAgICAgcmV0dXJuIHsgd29ya2Zsb3dJZCB9O1xuICAgIH0sXG4gICAgVVJMU2VhcmNoUGFyYW1zOiAodmFsdWUpID0+IHtcbiAgICAgIGlmIChcbiAgICAgICAgIWlzSGFuZGxlKHZhbHVlKSB8fFxuICAgICAgICAhaS51cmxTZWFyY2hQYXJhbXNQcm90b3R5cGUgfHxcbiAgICAgICAgIWhhc1Byb3RvdHlwZSh2YWx1ZSwgaS51cmxTZWFyY2hQYXJhbXNQcm90b3R5cGUpIHx8XG4gICAgICAgICFpLnVybFNlYXJjaFBhcmFtc1RvU3RyaW5nXG4gICAgICApIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgY29uc3Qgc2l6ZSA9IGkudXJsU2VhcmNoUGFyYW1zU2l6ZVxuICAgICAgICA/IGNhbGwoaS51cmxTZWFyY2hQYXJhbXNTaXplLCB2YWx1ZSkuY29uc3VtZSgoaCkgPT4gaC50b051bWJlcigpKVxuICAgICAgICA6IE51bWJlci5OYU47XG4gICAgICBpZiAoc2l6ZSA9PT0gMCkgcmV0dXJuICcuJztcbiAgICAgIHJldHVybiBjYWxsKGkudXJsU2VhcmNoUGFyYW1zVG9TdHJpbmcsIHZhbHVlKS5jb25zdW1lKChoKSA9PlxuICAgICAgICBoLnRvU3RyaW5nKClcbiAgICAgICk7XG4gICAgfSxcbiAgICBVaW50OEFycmF5OiAodmFsdWUpID0+XG4gICAgICBpc0hhbmRsZSh2YWx1ZSkgJiYgdGFnT2ZIYW5kbGUodmFsdWUpID09PSAnVWludDhBcnJheSdcbiAgICAgICAgPyBieXRlc1RvQmFzZTY0KHZpZXdCeXRlcyh2YWx1ZSkpXG4gICAgICAgIDogZmFsc2UsXG4gICAgVWludDhDbGFtcGVkQXJyYXk6ICh2YWx1ZSkgPT5cbiAgICAgIGlzSGFuZGxlKHZhbHVlKSAmJiB0YWdPZkhhbmRsZSh2YWx1ZSkgPT09ICdVaW50OENsYW1wZWRBcnJheSdcbiAgICAgICAgPyBieXRlc1RvQmFzZTY0KHZpZXdCeXRlcyh2YWx1ZSkpXG4gICAgICAgIDogZmFsc2UsXG4gICAgVWludDE2QXJyYXk6ICh2YWx1ZSkgPT5cbiAgICAgIGlzSGFuZGxlKHZhbHVlKSAmJiB0YWdPZkhhbmRsZSh2YWx1ZSkgPT09ICdVaW50MTZBcnJheSdcbiAgICAgICAgPyBieXRlc1RvQmFzZTY0KHZpZXdCeXRlcyh2YWx1ZSkpXG4gICAgICAgIDogZmFsc2UsXG4gICAgVWludDMyQXJyYXk6ICh2YWx1ZSkgPT5cbiAgICAgIGlzSGFuZGxlKHZhbHVlKSAmJiB0YWdPZkhhbmRsZSh2YWx1ZSkgPT09ICdVaW50MzJBcnJheSdcbiAgICAgICAgPyBieXRlc1RvQmFzZTY0KHZpZXdCeXRlcyh2YWx1ZSkpXG4gICAgICAgIDogZmFsc2UsXG4gIH07XG5cbiAgLy8gLS0tIHBhcnNlIG9wZXJhdGlvbnMgKGhhbmRsZS1vbmx5OiBldmVyeXRoaW5nIGlzIGJ1aWx0IGluIHRoZSBWTSkgLS0tXG5cbiAgY29uc3QgcGFyc2VPcGVyYXRpb25zOiBQYXJzZU9wZXJhdGlvbnMgPSB7XG4gICAgZnJvbVByaW1pdGl2ZTogKHZhbHVlKSA9PlxuICAgICAgdHlwZW9mIHZhbHVlID09PSAnYmlnaW50JyA/IHZtLm5ld0JpZ0ludCh2YWx1ZSkgOiB2bS5ob3N0VG9IYW5kbGUodmFsdWUpLFxuICAgIGZyb21JU09TdHJpbmc6IChpc28pID0+IHtcbiAgICAgIGNvbnN0IGFyZ3VtZW50ID1cbiAgICAgICAgaXNvID09PSAnJyA/IHZtLm5ld051bWJlcihOdW1iZXIuTmFOKSA6IHZtLm5ld1N0cmluZyhpc28pO1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIHZtLmNvbnN0cnVjdChpLkRhdGUsIGFyZ3VtZW50KTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIGFyZ3VtZW50LmRpc3Bvc2UoKTtcbiAgICAgIH1cbiAgICB9LFxuICAgIGZyb21TdHJpbmdWYWx1ZTogKHRhZywgX3N0cmluZykgPT4ge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGAke3RhZ30gY2Fubm90IGJlIHJldml2ZWQgaW4gdGhlIFZNYCk7XG4gICAgfSxcbiAgICBmcm9tQXJyYXlCdWZmZXI6IChidWZmZXIpID0+IHZtLm5ld0FycmF5QnVmZmVyKGJ1ZmZlciksXG4gICAgZnJvbVJlZ0V4cEluZm86IChzb3VyY2UsIGZsYWdzKSA9PiB7XG4gICAgICBjb25zdCBzb3VyY2VIYW5kbGUgPSB2bS5uZXdTdHJpbmcoc291cmNlKTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGlmICghZmxhZ3MpIHJldHVybiB2bS5jb25zdHJ1Y3QoaS5SZWdFeHAsIHNvdXJjZUhhbmRsZSk7XG4gICAgICAgIGNvbnN0IGZsYWdzSGFuZGxlID0gdm0ubmV3U3RyaW5nKGZsYWdzKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICByZXR1cm4gdm0uY29uc3RydWN0KGkuUmVnRXhwLCBzb3VyY2VIYW5kbGUsIGZsYWdzSGFuZGxlKTtcbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICBmbGFnc0hhbmRsZS5kaXNwb3NlKCk7XG4gICAgICAgIH1cbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIHNvdXJjZUhhbmRsZS5kaXNwb3NlKCk7XG4gICAgICB9XG4gICAgfSxcbiAgICBmcm9tVmlld0luZm86ICh0YWcsIGJ1ZmZlciwgYnl0ZU9mZnNldCwgbGVuZ3RoKSA9PiB7XG4gICAgICBjb25zdCBDb25zdHJ1Y3RvciA9IHR5cGVkQXJyYXlDb25zdHJ1Y3RvcnMuZ2V0KHRhZyk7XG4gICAgICBpZiAoIUNvbnN0cnVjdG9yKSB0aHJvdyBuZXcgRXJyb3IoYCR7dGFnfSBpcyBub3QgYXZhaWxhYmxlIGluIHRoZSBWTWApO1xuICAgICAgaWYgKGJ5dGVPZmZzZXQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gdm0uY29uc3RydWN0KENvbnN0cnVjdG9yLCBidWZmZXIgYXMgSlNWYWx1ZUhhbmRsZSk7XG4gICAgICB9XG4gICAgICBjb25zdCBvZmZzZXRIYW5kbGUgPSB2bS5uZXdOdW1iZXIoYnl0ZU9mZnNldCk7XG4gICAgICBjb25zdCBsZW5ndGhIYW5kbGUgPSB2bS5uZXdOdW1iZXIobGVuZ3RoID8/IDApO1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIHZtLmNvbnN0cnVjdChcbiAgICAgICAgICBDb25zdHJ1Y3RvcixcbiAgICAgICAgICBidWZmZXIgYXMgSlNWYWx1ZUhhbmRsZSxcbiAgICAgICAgICBvZmZzZXRIYW5kbGUsXG4gICAgICAgICAgbGVuZ3RoSGFuZGxlXG4gICAgICAgICk7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBvZmZzZXRIYW5kbGUuZGlzcG9zZSgpO1xuICAgICAgICBsZW5ndGhIYW5kbGUuZGlzcG9zZSgpO1xuICAgICAgfVxuICAgIH0sXG4gICAgYm94OiAodmFsdWUpID0+IHZtLmNvbnN0cnVjdChpLk9iamVjdCwgdmFsdWUgYXMgSlNWYWx1ZUhhbmRsZSksXG4gICAgY3JlYXRlQXJyYXk6IChsZW5ndGgpID0+IHtcbiAgICAgIGNvbnN0IGxlbmd0aEhhbmRsZSA9IHZtLm5ld051bWJlcihsZW5ndGgpO1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIHZtLmNvbnN0cnVjdChpLkFycmF5LCBsZW5ndGhIYW5kbGUpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgbGVuZ3RoSGFuZGxlLmRpc3Bvc2UoKTtcbiAgICAgIH1cbiAgICB9LFxuICAgIGNyZWF0ZVNwYXJzZUFycmF5OiAobGVuZ3RoKSA9PiB7XG4gICAgICBjb25zdCBsZW5ndGhIYW5kbGUgPSB2bS5uZXdOdW1iZXIobGVuZ3RoKTtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBpbnZva2UoaS5tYWtlU3BhcnNlQXJyYXksIGxlbmd0aEhhbmRsZSk7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBsZW5ndGhIYW5kbGUuZGlzcG9zZSgpO1xuICAgICAgfVxuICAgIH0sXG4gICAgY3JlYXRlT2JqZWN0OiAoKSA9PiB2bS5uZXdPYmplY3QoKSxcbiAgICBjcmVhdGVOdWxsUHJvdG90eXBlT2JqZWN0OiAoKSA9PlxuICAgICAgY2FsbChpLm9iamVjdENyZWF0ZSwgdm0udW5kZWZpbmVkLCB2bS5udWxsKSxcbiAgICBjcmVhdGVTZXQ6ICgpID0+IHZtLmNvbnN0cnVjdChpLlNldCksXG4gICAgY3JlYXRlTWFwOiAoKSA9PiB2bS5jb25zdHJ1Y3QoaS5NYXApLFxuICAgIHNldDogKHRhcmdldCwga2V5LCB2YWx1ZSkgPT5cbiAgICAgIGRlZmluZSh0YXJnZXQgYXMgSlNWYWx1ZUhhbmRsZSwgU3RyaW5nKGtleSksIHZhbHVlIGFzIEpTVmFsdWVIYW5kbGUpLFxuICAgIGFkZFZhbHVlOiAoc2V0LCB2YWx1ZSkgPT4ge1xuICAgICAgY2FsbChpLnNldEFkZCwgc2V0IGFzIEpTVmFsdWVIYW5kbGUsIHZhbHVlIGFzIEpTVmFsdWVIYW5kbGUpLmRpc3Bvc2UoKTtcbiAgICB9LFxuICAgIGFkZEVudHJ5OiAobWFwLCBrZXksIHZhbHVlKSA9PiB7XG4gICAgICBjYWxsKFxuICAgICAgICBpLm1hcFNldCxcbiAgICAgICAgbWFwIGFzIEpTVmFsdWVIYW5kbGUsXG4gICAgICAgIGtleSBhcyBKU1ZhbHVlSGFuZGxlLFxuICAgICAgICB2YWx1ZSBhcyBKU1ZhbHVlSGFuZGxlXG4gICAgICApLmRpc3Bvc2UoKTtcbiAgICB9LFxuICB9O1xuXG4gIC8vIC0tLSB3b3JrZmxvdyByZXZpdmVycyAoaGFuZGxlIHNwYWNlKSAtLS1cblxuICAvKiogR3Vlc3QgbG9va3VwIG9mIGEgcmVnaXN0ZXJlZCBlcnJvciBjbGFzcyBvbiBnbG9iYWxUaGlzLCBieSBzeW1ib2wuICovXG4gIGNvbnN0IHJlZ2lzdGVyZWRFcnJvckNsYXNzID0gKFxuICAgIG5hbWU6IFN5bWJvbE5hbWVcbiAgKTogSlNWYWx1ZUhhbmRsZSB8IHVuZGVmaW5lZCA9PiB7XG4gICAgY29uc3QgY2xzID0gb3duKHZtLmdsb2JhbCwgc3ltKG5hbWUpKTtcbiAgICBpZiAoIWNscyB8fCBjbHMudHlwZW9mICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICBjbHM/LmRpc3Bvc2UoKTtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIHJldHVybiBjbHM7XG4gIH07XG5cbiAgLyoqIENvbnN0cnVjdCBhIGd1ZXN0IEVycm9yIHZpYSBgY3RvcihtZXNzYWdlKWAgKyBkZWZpbmUgc3RhY2svY2F1c2UuICovXG4gIGNvbnN0IGJ1aWxkRXJyb3IgPSAoXG4gICAgY3RvcjogSlNWYWx1ZUhhbmRsZSxcbiAgICB2YWx1ZTogSlNWYWx1ZUhhbmRsZSxcbiAgICBvcHRzOiB7IG5hbWU/OiBzdHJpbmc7IGV4dHJhQ3RvckFyZ3M/OiBKU1ZhbHVlSGFuZGxlW10gfSA9IHt9XG4gICk6IEpTVmFsdWVIYW5kbGUgPT4ge1xuICAgIGNvbnN0IG1lc3NhZ2UgPSBvd24odmFsdWUsICdtZXNzYWdlJykgPz8gdm0udW5kZWZpbmVkO1xuICAgIGNvbnN0IGVycm9yID0gdm0uY29uc3RydWN0KGN0b3IsIG1lc3NhZ2UsIC4uLihvcHRzLmV4dHJhQ3RvckFyZ3MgPz8gW10pKTtcbiAgICBpZiAobWVzc2FnZSAhPT0gdm0udW5kZWZpbmVkKSBtZXNzYWdlLmRpc3Bvc2UoKTtcbiAgICBpZiAob3B0cy5uYW1lICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnN0IG5hbWVIYW5kbGUgPSBuZXdHdWVzdFN0cmluZyhvcHRzLm5hbWUpO1xuICAgICAgZGVmaW5lKGVycm9yLCAnbmFtZScsIG5hbWVIYW5kbGUpO1xuICAgICAgbmFtZUhhbmRsZS5kaXNwb3NlKCk7XG4gICAgfVxuICAgIGNvbnN0IHN0YWNrID0gb3duKHZhbHVlLCAnc3RhY2snKTtcbiAgICBpZiAoc3RhY2sgJiYgIXN0YWNrLmlzVW5kZWZpbmVkKSBkZWZpbmUoZXJyb3IsICdzdGFjaycsIHN0YWNrKTtcbiAgICBzdGFjaz8uZGlzcG9zZSgpO1xuICAgIGlmIChndWVzdEhhc093bih2YWx1ZSwgJ2NhdXNlJykpIHtcbiAgICAgIGNvbnN0IGNhdXNlID0gb3duKHZhbHVlLCAnY2F1c2UnKSA/PyB2bS51bmRlZmluZWQ7XG4gICAgICBkZWZpbmUoZXJyb3IsICdjYXVzZScsIGNhdXNlKTtcbiAgICAgIGlmIChjYXVzZSAhPT0gdm0udW5kZWZpbmVkKSBjYXVzZS5kaXNwb3NlKCk7XG4gICAgfVxuICAgIHJldHVybiBlcnJvcjtcbiAgfTtcblxuICBjb25zdCBuYW1lZEVycm9yU3ViY2xhc3NSZXZpdmVyID1cbiAgICAoc3ViY2xhc3NOYW1lOiBzdHJpbmcpID0+ICh2YWx1ZTogSlNWYWx1ZUhhbmRsZSkgPT4ge1xuICAgICAgY29uc3QgY3RvciA9IGVycm9yQ29uc3RydWN0b3JzLmdldChzdWJjbGFzc05hbWUpO1xuICAgICAgaWYgKGN0b3IpIHJldHVybiBidWlsZEVycm9yKGN0b3IsIHZhbHVlKTtcbiAgICAgIHJldHVybiBidWlsZEVycm9yKGkuRXJyb3IsIHZhbHVlLCB7IG5hbWU6IHN1YmNsYXNzTmFtZSB9KTtcbiAgICB9O1xuXG4gIGNvbnN0IHJldml2ZUFib3J0U2lnbmFsID0gKHZhbHVlOiBKU1ZhbHVlSGFuZGxlKTogSlNWYWx1ZUhhbmRsZSA9PiB7XG4gICAgY29uc3QgY2xzID0gb3duKHZtLmdsb2JhbCwgJ19fV29ya2Zsb3dBYm9ydFNpZ25hbCcpO1xuICAgIGlmICghY2xzIHx8IGNscy50eXBlb2YgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGNscz8uZGlzcG9zZSgpO1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAnV29ya2Zsb3dBYm9ydFNpZ25hbCBpcyBub3QgcmVnaXN0ZXJlZCBpbiB0aGUgVk0gKGJvb3RzdHJhcCBub3QgZXZhbHVhdGVkKSdcbiAgICAgICk7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICBjb25zdCBzdHJlYW1OYW1lID0gb3duKHZhbHVlLCAnc3RyZWFtTmFtZScpID8/IHZtLnVuZGVmaW5lZDtcbiAgICAgIGNvbnN0IGhvb2tUb2tlbiA9IG93bih2YWx1ZSwgJ2hvb2tUb2tlbicpID8/IHZtLnVuZGVmaW5lZDtcbiAgICAgIGNvbnN0IHNpZ25hbCA9IHZtLmNvbnN0cnVjdChjbHMsIHN0cmVhbU5hbWUsIGhvb2tUb2tlbik7XG4gICAgICBpZiAoc3RyZWFtTmFtZSAhPT0gdm0udW5kZWZpbmVkKSBzdHJlYW1OYW1lLmRpc3Bvc2UoKTtcbiAgICAgIGlmIChob29rVG9rZW4gIT09IHZtLnVuZGVmaW5lZCkgaG9va1Rva2VuLmRpc3Bvc2UoKTtcbiAgICAgIGNvbnN0IGFib3J0ZWQgPSBvd24odmFsdWUsICdhYm9ydGVkJyk7XG4gICAgICBpZiAoYWJvcnRlZD8udG9Cb29sZWFuKCkpIHtcbiAgICAgICAgY29uc3Qgc2V0QWJvcnRlZCA9IGNoYWluZWQoc2lnbmFsLCAnX3NldEFib3J0ZWQnKTtcbiAgICAgICAgaWYgKHNldEFib3J0ZWQpIHtcbiAgICAgICAgICBjb25zdCByZWFzb24gPSBvd24odmFsdWUsICdyZWFzb24nKSA/PyB2bS51bmRlZmluZWQ7XG4gICAgICAgICAgY2FsbChzZXRBYm9ydGVkLCBzaWduYWwsIHJlYXNvbikuZGlzcG9zZSgpO1xuICAgICAgICAgIGlmIChyZWFzb24gIT09IHZtLnVuZGVmaW5lZCkgcmVhc29uLmRpc3Bvc2UoKTtcbiAgICAgICAgICBzZXRBYm9ydGVkLmRpc3Bvc2UoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgYWJvcnRlZD8uZGlzcG9zZSgpO1xuICAgICAgcmV0dXJuIHNpZ25hbDtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgY2xzLmRpc3Bvc2UoKTtcbiAgICB9XG4gIH07XG5cbiAgY29uc3QgcmV2aXZlcnM6IFJlY29yZDxzdHJpbmcsICh2YWx1ZTogYW55KSA9PiBhbnk+ID0ge1xuICAgIEFib3J0Q29udHJvbGxlcjogKHZhbHVlOiBKU1ZhbHVlSGFuZGxlKSA9PiB7XG4gICAgICBjb25zdCBjb250cm9sbGVyID0gdm0ubmV3T2JqZWN0KCk7XG4gICAgICBjb25zdCBzdHJlYW1OYW1lID0gb3duKHZhbHVlLCAnc3RyZWFtTmFtZScpID8/IHZtLnVuZGVmaW5lZDtcbiAgICAgIGRlZmluZShjb250cm9sbGVyLCBzeW0oJ1dPUktGTE9XX0FCT1JUX1NUUkVBTV9OQU1FJyksIHN0cmVhbU5hbWUpO1xuICAgICAgaWYgKHN0cmVhbU5hbWUgIT09IHZtLnVuZGVmaW5lZCkgc3RyZWFtTmFtZS5kaXNwb3NlKCk7XG4gICAgICBjb25zdCBob29rVG9rZW4gPSBvd24odmFsdWUsICdob29rVG9rZW4nKSA/PyB2bS51bmRlZmluZWQ7XG4gICAgICBkZWZpbmUoY29udHJvbGxlciwgc3ltKCdXT1JLRkxPV19BQk9SVF9IT09LX1RPS0VOJyksIGhvb2tUb2tlbik7XG4gICAgICBpZiAoaG9va1Rva2VuICE9PSB2bS51bmRlZmluZWQpIGhvb2tUb2tlbi5kaXNwb3NlKCk7XG4gICAgICBjb25zdCBzaWduYWwgPSByZXZpdmVBYm9ydFNpZ25hbCh2YWx1ZSk7XG4gICAgICBkZWZpbmUoY29udHJvbGxlciwgJ3NpZ25hbCcsIHNpZ25hbCk7XG4gICAgICBzaWduYWwuZGlzcG9zZSgpO1xuICAgICAgY29uc3Qgbm9vcCA9IHZtLmV2YWxDb2RlKCcoZnVuY3Rpb24oKXt9KScpO1xuICAgICAgZGVmaW5lKGNvbnRyb2xsZXIsICdhYm9ydCcsIG5vb3ApO1xuICAgICAgbm9vcC5kaXNwb3NlKCk7XG4gICAgICByZXR1cm4gY29udHJvbGxlcjtcbiAgICB9LFxuICAgIEFib3J0U2lnbmFsOiAodmFsdWU6IEpTVmFsdWVIYW5kbGUpID0+IHJldml2ZUFib3J0U2lnbmFsKHZhbHVlKSxcbiAgICBDbGFzczogKHZhbHVlOiBKU1ZhbHVlSGFuZGxlKSA9PiB7XG4gICAgICBjb25zdCBjbGFzc0lkID0gb3duU3RyaW5nKHZhbHVlLCAnY2xhc3NJZCcpO1xuICAgICAgY29uc3QgY2xzID0gbG9va3VwUmVnaXN0ZXJlZENsYXNzKGNsYXNzSWQpO1xuICAgICAgaWYgKCFjbHMpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBDbGFzcyBcIiR7Y2xhc3NJZH1cIiBub3QgZm91bmQuIE1ha2Ugc3VyZSB0aGUgY2xhc3MgaXMgcmVnaXN0ZXJlZCB3aXRoIHJlZ2lzdGVyU2VyaWFsaXphdGlvbkNsYXNzLmBcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBjbHM7XG4gICAgfSxcbiAgICBJbnN0YW5jZTogKHZhbHVlOiBKU1ZhbHVlSGFuZGxlKSA9PiB7XG4gICAgICBjb25zdCBjbGFzc0lkID0gb3duU3RyaW5nKHZhbHVlLCAnY2xhc3NJZCcpO1xuICAgICAgY29uc3QgY2xzID0gbG9va3VwUmVnaXN0ZXJlZENsYXNzKGNsYXNzSWQpO1xuICAgICAgaWYgKCFjbHMpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBDbGFzcyBcIiR7Y2xhc3NJZH1cIiBub3QgZm91bmQuIE1ha2Ugc3VyZSB0aGUgY2xhc3MgaXMgcmVnaXN0ZXJlZCB3aXRoIHJlZ2lzdGVyU2VyaWFsaXphdGlvbkNsYXNzLmBcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGRlc2VyaWFsaXplTWV0aG9kID0gY2hhaW5lZChjbHMsIHN5bSgnd29ya2Zsb3ctZGVzZXJpYWxpemUnKSk7XG4gICAgICAgIGlmICghZGVzZXJpYWxpemVNZXRob2QgfHwgZGVzZXJpYWxpemVNZXRob2QudHlwZW9mICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgZGVzZXJpYWxpemVNZXRob2Q/LmRpc3Bvc2UoKTtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICBgQ2xhc3MgXCIke2NsYXNzSWR9XCIgZG9lcyBub3QgaGF2ZSBhIHN0YXRpYyBTeW1ib2wod29ya2Zsb3ctZGVzZXJpYWxpemUpIG1ldGhvZC5gXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IGRhdGEgPSBvd24odmFsdWUsICdkYXRhJykgPz8gdm0udW5kZWZpbmVkO1xuICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGNhbGwoZGVzZXJpYWxpemVNZXRob2QsIGNscywgZGF0YSk7XG4gICAgICAgICAgaWYgKGRhdGEgIT09IHZtLnVuZGVmaW5lZCkgZGF0YS5kaXNwb3NlKCk7XG4gICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICBkZXNlcmlhbGl6ZU1ldGhvZC5kaXNwb3NlKCk7XG4gICAgICAgIH1cbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIGNscy5kaXNwb3NlKCk7XG4gICAgICB9XG4gICAgfSxcbiAgICBTdGVwRnVuY3Rpb246ICh2YWx1ZTogSlNWYWx1ZUhhbmRsZSkgPT4ge1xuICAgICAgY29uc3QgdXNlU3RlcCA9IG93bih2bS5nbG9iYWwsIHN5bSgnV09SS0ZMT1dfVVNFX1NURVAnKSk7XG4gICAgICBpZiAoIXVzZVN0ZXAgfHwgdXNlU3RlcC50eXBlb2YgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgdXNlU3RlcD8uZGlzcG9zZSgpO1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgJ1dPUktGTE9XX1VTRV9TVEVQIG5vdCBmb3VuZCBvbiBnbG9iYWwgb2JqZWN0LiBTdGVwIGZ1bmN0aW9ucyBjYW5ub3QgYmUgZGVzZXJpYWxpemVkIG91dHNpZGUgd29ya2Zsb3cgY29udGV4dC4nXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBzdGVwSWQgPSBvd24odmFsdWUsICdzdGVwSWQnKSA/PyB2bS51bmRlZmluZWQ7XG4gICAgICAgIGNvbnN0IGNsb3N1cmVWYXJzID0gb3duKHZhbHVlLCAnY2xvc3VyZVZhcnMnKTtcbiAgICAgICAgbGV0IHByb3h5OiBKU1ZhbHVlSGFuZGxlO1xuICAgICAgICBpZiAoY2xvc3VyZVZhcnMgJiYgIWNsb3N1cmVWYXJzLmlzVW5kZWZpbmVkKSB7XG4gICAgICAgICAgY29uc3QgdGh1bmsgPSBpbnZva2UoaS5tYWtlVGh1bmssIGNsb3N1cmVWYXJzKTtcbiAgICAgICAgICBwcm94eSA9IGludm9rZSh1c2VTdGVwLCBzdGVwSWQsIHRodW5rKTtcbiAgICAgICAgICB0aHVuay5kaXNwb3NlKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcHJveHkgPSBpbnZva2UodXNlU3RlcCwgc3RlcElkKTtcbiAgICAgICAgfVxuICAgICAgICBjbG9zdXJlVmFycz8uZGlzcG9zZSgpO1xuICAgICAgICBpZiAoc3RlcElkICE9PSB2bS51bmRlZmluZWQpIHN0ZXBJZC5kaXNwb3NlKCk7XG4gICAgICAgIGlmIChndWVzdEhhc093bih2YWx1ZSwgJ2JvdW5kVGhpcycpKSB7XG4gICAgICAgICAgLy8gUmUtYmluZCB0aHJvdWdoIHRoZSBwcm94eSdzIG93biAob3ZlcnJpZGRlbikgYC5iaW5kYCwgd2hpY2ggaXNcbiAgICAgICAgICAvLyBhbiBvd24gZGF0YSBwcm9wZXJ0eSBzdGFtcGVkIGJ5IFdPUktGTE9XX1VTRV9TVEVQLlxuICAgICAgICAgIGNvbnN0IGJpbmQgPSBvd24ocHJveHksICdiaW5kJykgPz8gY2hhaW5lZChwcm94eSwgJ2JpbmQnKTtcbiAgICAgICAgICBjb25zdCBib3VuZFRoaXMgPSBvd24odmFsdWUsICdib3VuZFRoaXMnKSA/PyB2bS51bmRlZmluZWQ7XG4gICAgICAgICAgY29uc3QgYm91bmRBcmdzID0gb3duKHZhbHVlLCAnYm91bmRBcmdzJyk7XG4gICAgICAgICAgY29uc3QgYXJnczogSlNWYWx1ZUhhbmRsZVtdID0gW2JvdW5kVGhpc107XG4gICAgICAgICAgY29uc3QgYXJnSGFuZGxlczogSlNWYWx1ZUhhbmRsZVtdID0gW107XG4gICAgICAgICAgaWYgKGJvdW5kQXJncyAmJiBib3VuZEFyZ3MuaXNBcnJheSkge1xuICAgICAgICAgICAgY29uc3QgbGVuZ3RoID1cbiAgICAgICAgICAgICAgb3duKGJvdW5kQXJncywgJ2xlbmd0aCcpPy5jb25zdW1lKChoKSA9PiBoLnRvTnVtYmVyKCkpID8/IDA7XG4gICAgICAgICAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgbGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgICAgICAgICAgIGNvbnN0IGVsZW1lbnQgPSBvd24oYm91bmRBcmdzLCBTdHJpbmcoaW5kZXgpKSA/PyB2bS51bmRlZmluZWQ7XG4gICAgICAgICAgICAgIGFyZ3MucHVzaChlbGVtZW50KTtcbiAgICAgICAgICAgICAgaWYgKGVsZW1lbnQgIT09IHZtLnVuZGVmaW5lZCkgYXJnSGFuZGxlcy5wdXNoKGVsZW1lbnQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBib3VuZEFyZ3M/LmRpc3Bvc2UoKTtcbiAgICAgICAgICBpZiAoYmluZCkge1xuICAgICAgICAgICAgY29uc3QgYm91bmQgPSBjYWxsKGJpbmQsIHByb3h5LCAuLi5hcmdzKTtcbiAgICAgICAgICAgIGJpbmQuZGlzcG9zZSgpO1xuICAgICAgICAgICAgcHJveHkuZGlzcG9zZSgpO1xuICAgICAgICAgICAgcHJveHkgPSBib3VuZDtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGJvdW5kVGhpcyAhPT0gdm0udW5kZWZpbmVkKSBib3VuZFRoaXMuZGlzcG9zZSgpO1xuICAgICAgICAgIGZvciAoY29uc3QgaGFuZGxlIG9mIGFyZ0hhbmRsZXMpIGhhbmRsZS5kaXNwb3NlKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHByb3h5O1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgdXNlU3RlcC5kaXNwb3NlKCk7XG4gICAgICB9XG4gICAgfSxcbiAgICBBcnJheUJ1ZmZlcjogKHZhbHVlOiBzdHJpbmcgfCBKU1ZhbHVlSGFuZGxlKSA9PlxuICAgICAgdm0ubmV3QXJyYXlCdWZmZXIoXG4gICAgICAgIGJhc2U2NFRvQnl0ZXMoaXNIYW5kbGUodmFsdWUpID8gdmFsdWUudG9TdHJpbmcoKSA6IHZhbHVlKVxuICAgICAgICAgIC5idWZmZXIgYXMgQXJyYXlCdWZmZXJcbiAgICAgICksXG4gICAgQmlnSW50OiAodmFsdWU6IHN0cmluZyB8IEpTVmFsdWVIYW5kbGUpID0+XG4gICAgICB2bS5uZXdCaWdJbnQoQmlnSW50KGlzSGFuZGxlKHZhbHVlKSA/IHZhbHVlLnRvU3RyaW5nKCkgOiB2YWx1ZSkpLFxuICAgIEJpZ0ludDY0QXJyYXk6ICh2YWx1ZTogc3RyaW5nIHwgSlNWYWx1ZUhhbmRsZSkgPT5cbiAgICAgIGJ1aWxkVHlwZWRBcnJheSgnQmlnSW50NjRBcnJheScsIHZhbHVlKSxcbiAgICBCaWdVaW50NjRBcnJheTogKHZhbHVlOiBzdHJpbmcgfCBKU1ZhbHVlSGFuZGxlKSA9PlxuICAgICAgYnVpbGRUeXBlZEFycmF5KCdCaWdVaW50NjRBcnJheScsIHZhbHVlKSxcbiAgICBEYXRlOiAodmFsdWU6IEpTVmFsdWVIYW5kbGUgfCBzdHJpbmcpID0+IHtcbiAgICAgIC8vIFRoZSByZWR1Y2VyIGVtaXRzICcuJyBmb3IgaW52YWxpZCBkYXRlcyBhbmQgYW4gSVNPIHN0cmluZyBvdGhlcndpc2UuXG4gICAgICBjb25zdCBpc28gPSBpc0hhbmRsZSh2YWx1ZSkgPyB2YWx1ZS50b1N0cmluZygpIDogdmFsdWU7XG4gICAgICBjb25zdCBhcmd1bWVudCA9XG4gICAgICAgIGlzbyA9PT0gJy4nID8gdm0ubmV3TnVtYmVyKE51bWJlci5OYU4pIDogdm0ubmV3U3RyaW5nKGlzbyk7XG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gdm0uY29uc3RydWN0KGkuRGF0ZSwgYXJndW1lbnQpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgYXJndW1lbnQuZGlzcG9zZSgpO1xuICAgICAgICBpZiAoaXNIYW5kbGUodmFsdWUpKSB2YWx1ZS5kaXNwb3NlKCk7XG4gICAgICB9XG4gICAgfSxcbiAgICBET01FeGNlcHRpb246ICh2YWx1ZTogSlNWYWx1ZUhhbmRsZSkgPT4ge1xuICAgICAgaWYgKGkuRE9NRXhjZXB0aW9uKSB7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBvd24odmFsdWUsICdtZXNzYWdlJykgPz8gdm0udW5kZWZpbmVkO1xuICAgICAgICBjb25zdCBuYW1lID0gb3duKHZhbHVlLCAnbmFtZScpID8/IHZtLnVuZGVmaW5lZDtcbiAgICAgICAgY29uc3QgZXJyb3IgPSB2bS5jb25zdHJ1Y3QoaS5ET01FeGNlcHRpb24sIG1lc3NhZ2UsIG5hbWUpO1xuICAgICAgICBpZiAobWVzc2FnZSAhPT0gdm0udW5kZWZpbmVkKSBtZXNzYWdlLmRpc3Bvc2UoKTtcbiAgICAgICAgaWYgKG5hbWUgIT09IHZtLnVuZGVmaW5lZCkgbmFtZS5kaXNwb3NlKCk7XG4gICAgICAgIGNvbnN0IHN0YWNrID0gb3duKHZhbHVlLCAnc3RhY2snKTtcbiAgICAgICAgaWYgKHN0YWNrICYmICFzdGFjay5pc1VuZGVmaW5lZCkgZGVmaW5lKGVycm9yLCAnc3RhY2snLCBzdGFjayk7XG4gICAgICAgIHN0YWNrPy5kaXNwb3NlKCk7XG4gICAgICAgIGlmIChndWVzdEhhc093bih2YWx1ZSwgJ2NhdXNlJykpIHtcbiAgICAgICAgICBjb25zdCBjYXVzZSA9IG93bih2YWx1ZSwgJ2NhdXNlJykgPz8gdm0udW5kZWZpbmVkO1xuICAgICAgICAgIGRlZmluZShlcnJvciwgJ2NhdXNlJywgY2F1c2UpO1xuICAgICAgICAgIGlmIChjYXVzZSAhPT0gdm0udW5kZWZpbmVkKSBjYXVzZS5kaXNwb3NlKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGVycm9yO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGJ1aWxkRXJyb3IoaS5FcnJvciwgdmFsdWUsIHtcbiAgICAgICAgbmFtZTogb3duU3RyaW5nKHZhbHVlLCAnbmFtZScpID8/ICdET01FeGNlcHRpb24nLFxuICAgICAgfSk7XG4gICAgfSxcbiAgICBBZ2dyZWdhdGVFcnJvcjogKHZhbHVlOiBKU1ZhbHVlSGFuZGxlKSA9PiB7XG4gICAgICBjb25zdCBlcnJvcnMgPSBvd24odmFsdWUsICdlcnJvcnMnKTtcbiAgICAgIGNvbnN0IGVycm9yc0FyZyA9XG4gICAgICAgIGVycm9ycyAmJiAhZXJyb3JzLmlzVW5kZWZpbmVkID8gZXJyb3JzIDogdm0uZXZhbENvZGUoJyhbXSknKTtcbiAgICAgIGNvbnN0IG1lc3NhZ2UgPSBvd24odmFsdWUsICdtZXNzYWdlJykgPz8gdm0udW5kZWZpbmVkO1xuICAgICAgY29uc3QgY3RvciA9IGkuQWdncmVnYXRlRXJyb3IgPz8gaS5FcnJvcjtcbiAgICAgIGNvbnN0IGVycm9yID1cbiAgICAgICAgY3RvciA9PT0gaS5BZ2dyZWdhdGVFcnJvclxuICAgICAgICAgID8gdm0uY29uc3RydWN0KGN0b3IsIGVycm9yc0FyZywgbWVzc2FnZSlcbiAgICAgICAgICA6IGJ1aWxkRXJyb3IoaS5FcnJvciwgdmFsdWUsIHsgbmFtZTogJ0FnZ3JlZ2F0ZUVycm9yJyB9KTtcbiAgICAgIGlmIChjdG9yID09PSBpLkFnZ3JlZ2F0ZUVycm9yKSB7XG4gICAgICAgIGNvbnN0IHN0YWNrID0gb3duKHZhbHVlLCAnc3RhY2snKTtcbiAgICAgICAgaWYgKHN0YWNrICYmICFzdGFjay5pc1VuZGVmaW5lZCkgZGVmaW5lKGVycm9yLCAnc3RhY2snLCBzdGFjayk7XG4gICAgICAgIHN0YWNrPy5kaXNwb3NlKCk7XG4gICAgICAgIGlmIChndWVzdEhhc093bih2YWx1ZSwgJ2NhdXNlJykpIHtcbiAgICAgICAgICBjb25zdCBjYXVzZSA9IG93bih2YWx1ZSwgJ2NhdXNlJykgPz8gdm0udW5kZWZpbmVkO1xuICAgICAgICAgIGRlZmluZShlcnJvciwgJ2NhdXNlJywgY2F1c2UpO1xuICAgICAgICAgIGlmIChjYXVzZSAhPT0gdm0udW5kZWZpbmVkKSBjYXVzZS5kaXNwb3NlKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChtZXNzYWdlICE9PSB2bS51bmRlZmluZWQpIG1lc3NhZ2UuZGlzcG9zZSgpO1xuICAgICAgZXJyb3JzQXJnLmRpc3Bvc2UoKTtcbiAgICAgIHJldHVybiBlcnJvcjtcbiAgICB9LFxuICAgIEV2YWxFcnJvcjogbmFtZWRFcnJvclN1YmNsYXNzUmV2aXZlcignRXZhbEVycm9yJyksXG4gICAgRmF0YWxFcnJvcjogKHZhbHVlOiBKU1ZhbHVlSGFuZGxlKSA9PiB7XG4gICAgICBjb25zdCBjbHMgPSByZWdpc3RlcmVkRXJyb3JDbGFzcygnQHdvcmtmbG93L2Vycm9ycy8vRmF0YWxFcnJvcicpO1xuICAgICAgY29uc3QgZXJyb3IgPSBjbHNcbiAgICAgICAgPyBidWlsZEVycm9yKGNscywgdmFsdWUpXG4gICAgICAgIDogYnVpbGRFcnJvcihpLkVycm9yLCB2YWx1ZSwgeyBuYW1lOiAnRmF0YWxFcnJvcicgfSk7XG4gICAgICBjbHM/LmRpc3Bvc2UoKTtcbiAgICAgIHJldHVybiBlcnJvcjtcbiAgICB9LFxuICAgIEhvb2tDb25mbGljdEVycm9yOiAodmFsdWU6IEpTVmFsdWVIYW5kbGUpID0+IHtcbiAgICAgIGNvbnN0IGNscyA9IHJlZ2lzdGVyZWRFcnJvckNsYXNzKCdAd29ya2Zsb3cvZXJyb3JzLy9Ib29rQ29uZmxpY3RFcnJvcicpO1xuICAgICAgbGV0IGVycm9yOiBKU1ZhbHVlSGFuZGxlO1xuICAgICAgaWYgKGNscykge1xuICAgICAgICAvLyBDb25zdHJ1Y3RvciB0YWtlcyAodG9rZW4sIGNvbmZsaWN0aW5nUnVuSWQpLlxuICAgICAgICBjb25zdCB0b2tlbiA9IG93bih2YWx1ZSwgJ3Rva2VuJykgPz8gdm0udW5kZWZpbmVkO1xuICAgICAgICBjb25zdCBjb25mbGljdGluZ1J1bklkID0gb3duKHZhbHVlLCAnY29uZmxpY3RpbmdSdW5JZCcpID8/IHZtLnVuZGVmaW5lZDtcbiAgICAgICAgZXJyb3IgPSB2bS5jb25zdHJ1Y3QoY2xzLCB0b2tlbiwgY29uZmxpY3RpbmdSdW5JZCk7XG4gICAgICAgIGlmICh0b2tlbiAhPT0gdm0udW5kZWZpbmVkKSB0b2tlbi5kaXNwb3NlKCk7XG4gICAgICAgIGlmIChjb25mbGljdGluZ1J1bklkICE9PSB2bS51bmRlZmluZWQpIGNvbmZsaWN0aW5nUnVuSWQuZGlzcG9zZSgpO1xuICAgICAgICBjb25zdCBzdGFjayA9IG93bih2YWx1ZSwgJ3N0YWNrJyk7XG4gICAgICAgIGlmIChzdGFjayAmJiAhc3RhY2suaXNVbmRlZmluZWQpIGRlZmluZShlcnJvciwgJ3N0YWNrJywgc3RhY2spO1xuICAgICAgICBzdGFjaz8uZGlzcG9zZSgpO1xuICAgICAgICBpZiAoZ3Vlc3RIYXNPd24odmFsdWUsICdjYXVzZScpKSB7XG4gICAgICAgICAgY29uc3QgY2F1c2UgPSBvd24odmFsdWUsICdjYXVzZScpID8/IHZtLnVuZGVmaW5lZDtcbiAgICAgICAgICBkZWZpbmUoZXJyb3IsICdjYXVzZScsIGNhdXNlKTtcbiAgICAgICAgICBpZiAoY2F1c2UgIT09IHZtLnVuZGVmaW5lZCkgY2F1c2UuZGlzcG9zZSgpO1xuICAgICAgICB9XG4gICAgICAgIGNscy5kaXNwb3NlKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBlcnJvciA9IGJ1aWxkRXJyb3IoaS5FcnJvciwgdmFsdWUsIHsgbmFtZTogJ0hvb2tDb25mbGljdEVycm9yJyB9KTtcbiAgICAgICAgY29uc3QgdG9rZW4gPSBvd24odmFsdWUsICd0b2tlbicpO1xuICAgICAgICBpZiAodG9rZW4pIHtcbiAgICAgICAgICBkZWZpbmUoZXJyb3IsICd0b2tlbicsIHRva2VuKTtcbiAgICAgICAgICB0b2tlbi5kaXNwb3NlKCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgY29uZmxpY3RpbmdSdW5JZCA9IG93bih2YWx1ZSwgJ2NvbmZsaWN0aW5nUnVuSWQnKTtcbiAgICAgICAgaWYgKGNvbmZsaWN0aW5nUnVuSWQgJiYgIWNvbmZsaWN0aW5nUnVuSWQuaXNVbmRlZmluZWQpIHtcbiAgICAgICAgICBkZWZpbmUoZXJyb3IsICdjb25mbGljdGluZ1J1bklkJywgY29uZmxpY3RpbmdSdW5JZCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uZmxpY3RpbmdSdW5JZD8uZGlzcG9zZSgpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGVycm9yO1xuICAgIH0sXG4gICAgUmFuZ2VFcnJvcjogbmFtZWRFcnJvclN1YmNsYXNzUmV2aXZlcignUmFuZ2VFcnJvcicpLFxuICAgIFJlZmVyZW5jZUVycm9yOiBuYW1lZEVycm9yU3ViY2xhc3NSZXZpdmVyKCdSZWZlcmVuY2VFcnJvcicpLFxuICAgIFJldHJ5YWJsZUVycm9yOiAodmFsdWU6IEpTVmFsdWVIYW5kbGUpID0+IHtcbiAgICAgIGNvbnN0IHJldHJ5QWZ0ZXJNcyA9XG4gICAgICAgIG93bih2YWx1ZSwgJ3JldHJ5QWZ0ZXInKT8uY29uc3VtZSgoaCkgPT5cbiAgICAgICAgICBoLmlzTnVtYmVyID8gaC50b051bWJlcigpIDogTnVtYmVyLk5hTlxuICAgICAgICApID8/IE51bWJlci5OYU47XG4gICAgICBjb25zdCB0aW1lSGFuZGxlID0gdm0ubmV3TnVtYmVyKHJldHJ5QWZ0ZXJNcyk7XG4gICAgICBjb25zdCByZXRyeUFmdGVyRGF0ZSA9IHZtLmNvbnN0cnVjdChpLkRhdGUsIHRpbWVIYW5kbGUpO1xuICAgICAgdGltZUhhbmRsZS5kaXNwb3NlKCk7XG4gICAgICBjb25zdCBjbHMgPSByZWdpc3RlcmVkRXJyb3JDbGFzcygnQHdvcmtmbG93L2Vycm9ycy8vUmV0cnlhYmxlRXJyb3InKTtcbiAgICAgIGxldCBlcnJvcjogSlNWYWx1ZUhhbmRsZTtcbiAgICAgIGlmIChjbHMpIHtcbiAgICAgICAgLy8gQ29uc3RydWN0b3IgdGFrZXMgKG1lc3NhZ2UsIHsgcmV0cnlBZnRlciB9KS5cbiAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHZtLm5ld09iamVjdCgpO1xuICAgICAgICBvcHRpb25zLnNldFByb3AoJ3JldHJ5QWZ0ZXInLCByZXRyeUFmdGVyRGF0ZSk7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBvd24odmFsdWUsICdtZXNzYWdlJykgPz8gdm0udW5kZWZpbmVkO1xuICAgICAgICBlcnJvciA9IHZtLmNvbnN0cnVjdChjbHMsIG1lc3NhZ2UsIG9wdGlvbnMpO1xuICAgICAgICBpZiAobWVzc2FnZSAhPT0gdm0udW5kZWZpbmVkKSBtZXNzYWdlLmRpc3Bvc2UoKTtcbiAgICAgICAgb3B0aW9ucy5kaXNwb3NlKCk7XG4gICAgICAgIGNvbnN0IHN0YWNrID0gb3duKHZhbHVlLCAnc3RhY2snKTtcbiAgICAgICAgaWYgKHN0YWNrICYmICFzdGFjay5pc1VuZGVmaW5lZCkgZGVmaW5lKGVycm9yLCAnc3RhY2snLCBzdGFjayk7XG4gICAgICAgIHN0YWNrPy5kaXNwb3NlKCk7XG4gICAgICAgIGlmIChndWVzdEhhc093bih2YWx1ZSwgJ2NhdXNlJykpIHtcbiAgICAgICAgICBjb25zdCBjYXVzZSA9IG93bih2YWx1ZSwgJ2NhdXNlJykgPz8gdm0udW5kZWZpbmVkO1xuICAgICAgICAgIGRlZmluZShlcnJvciwgJ2NhdXNlJywgY2F1c2UpO1xuICAgICAgICAgIGlmIChjYXVzZSAhPT0gdm0udW5kZWZpbmVkKSBjYXVzZS5kaXNwb3NlKCk7XG4gICAgICAgIH1cbiAgICAgICAgY2xzLmRpc3Bvc2UoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGVycm9yID0gYnVpbGRFcnJvcihpLkVycm9yLCB2YWx1ZSwgeyBuYW1lOiAnUmV0cnlhYmxlRXJyb3InIH0pO1xuICAgICAgICBkZWZpbmUoZXJyb3IsICdyZXRyeUFmdGVyJywgcmV0cnlBZnRlckRhdGUpO1xuICAgICAgfVxuICAgICAgcmV0cnlBZnRlckRhdGUuZGlzcG9zZSgpO1xuICAgICAgcmV0dXJuIGVycm9yO1xuICAgIH0sXG4gICAgUnVudGltZURlY3J5cHRpb25FcnJvcjogKHZhbHVlOiBKU1ZhbHVlSGFuZGxlKSA9PiB7XG4gICAgICBjb25zdCBjbHMgPSByZWdpc3RlcmVkRXJyb3JDbGFzcyhcbiAgICAgICAgJ0B3b3JrZmxvdy9lcnJvcnMvL1J1bnRpbWVEZWNyeXB0aW9uRXJyb3InXG4gICAgICApO1xuICAgICAgbGV0IGVycm9yOiBKU1ZhbHVlSGFuZGxlO1xuICAgICAgaWYgKGNscykge1xuICAgICAgICAvLyBDb25zdHJ1Y3RvciB0YWtlcyAobWVzc2FnZSwgeyBjYXVzZSwgY29udGV4dCB9KS5cbiAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHZtLm5ld09iamVjdCgpO1xuICAgICAgICBjb25zdCBjb250ZXh0ID0gb3duKHZhbHVlLCAnY29udGV4dCcpO1xuICAgICAgICBpZiAoY29udGV4dCAmJiAhY29udGV4dC5pc1VuZGVmaW5lZCkge1xuICAgICAgICAgIG9wdGlvbnMuc2V0UHJvcCgnY29udGV4dCcsIGNvbnRleHQpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnRleHQ/LmRpc3Bvc2UoKTtcbiAgICAgICAgaWYgKGd1ZXN0SGFzT3duKHZhbHVlLCAnY2F1c2UnKSkge1xuICAgICAgICAgIGNvbnN0IGNhdXNlID0gb3duKHZhbHVlLCAnY2F1c2UnKSA/PyB2bS51bmRlZmluZWQ7XG4gICAgICAgICAgb3B0aW9ucy5zZXRQcm9wKCdjYXVzZScsIGNhdXNlKTtcbiAgICAgICAgICBpZiAoY2F1c2UgIT09IHZtLnVuZGVmaW5lZCkgY2F1c2UuZGlzcG9zZSgpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBvd24odmFsdWUsICdtZXNzYWdlJykgPz8gdm0udW5kZWZpbmVkO1xuICAgICAgICBlcnJvciA9IHZtLmNvbnN0cnVjdChjbHMsIG1lc3NhZ2UsIG9wdGlvbnMpO1xuICAgICAgICBpZiAobWVzc2FnZSAhPT0gdm0udW5kZWZpbmVkKSBtZXNzYWdlLmRpc3Bvc2UoKTtcbiAgICAgICAgb3B0aW9ucy5kaXNwb3NlKCk7XG4gICAgICAgIGNvbnN0IHN0YWNrID0gb3duKHZhbHVlLCAnc3RhY2snKTtcbiAgICAgICAgaWYgKHN0YWNrICYmICFzdGFjay5pc1VuZGVmaW5lZCkgZGVmaW5lKGVycm9yLCAnc3RhY2snLCBzdGFjayk7XG4gICAgICAgIHN0YWNrPy5kaXNwb3NlKCk7XG4gICAgICAgIGNscy5kaXNwb3NlKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBlcnJvciA9IGJ1aWxkRXJyb3IoaS5FcnJvciwgdmFsdWUsIHsgbmFtZTogJ1J1bnRpbWVEZWNyeXB0aW9uRXJyb3InIH0pO1xuICAgICAgICBjb25zdCBjb250ZXh0ID0gb3duKHZhbHVlLCAnY29udGV4dCcpO1xuICAgICAgICBpZiAoY29udGV4dCAmJiAhY29udGV4dC5pc1VuZGVmaW5lZCkge1xuICAgICAgICAgIGRlZmluZShlcnJvciwgJ2NvbnRleHQnLCBjb250ZXh0KTtcbiAgICAgICAgfVxuICAgICAgICBjb250ZXh0Py5kaXNwb3NlKCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gZXJyb3I7XG4gICAgfSxcbiAgICBTdHJlYW1FcnJvcjogKHZhbHVlOiBKU1ZhbHVlSGFuZGxlKSA9PiB7XG4gICAgICBjb25zdCBjbHMgPSByZWdpc3RlcmVkRXJyb3JDbGFzcygnQHdvcmtmbG93L2Vycm9ycy8vU3RyZWFtRXJyb3InKTtcbiAgICAgIGxldCBlcnJvcjogSlNWYWx1ZUhhbmRsZTtcbiAgICAgIGlmIChjbHMpIHtcbiAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHZtLm5ld09iamVjdCgpO1xuICAgICAgICBmb3IgKGNvbnN0IHByb3BlcnR5IG9mIFsnY2F1c2UnLCAnc3RhdHVzJywgJ3VybCddIGFzIGNvbnN0KSB7XG4gICAgICAgICAgaWYgKCFndWVzdEhhc093bih2YWx1ZSwgcHJvcGVydHkpKSBjb250aW51ZTtcbiAgICAgICAgICBjb25zdCBwcm9wZXJ0eVZhbHVlID0gb3duKHZhbHVlLCBwcm9wZXJ0eSkgPz8gdm0udW5kZWZpbmVkO1xuICAgICAgICAgIG9wdGlvbnMuc2V0UHJvcChwcm9wZXJ0eSwgcHJvcGVydHlWYWx1ZSk7XG4gICAgICAgICAgaWYgKHByb3BlcnR5VmFsdWUgIT09IHZtLnVuZGVmaW5lZCkgcHJvcGVydHlWYWx1ZS5kaXNwb3NlKCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IG93bih2YWx1ZSwgJ21lc3NhZ2UnKSA/PyB2bS51bmRlZmluZWQ7XG4gICAgICAgIGVycm9yID0gdm0uY29uc3RydWN0KGNscywgbWVzc2FnZSwgb3B0aW9ucyk7XG4gICAgICAgIGlmIChtZXNzYWdlICE9PSB2bS51bmRlZmluZWQpIG1lc3NhZ2UuZGlzcG9zZSgpO1xuICAgICAgICBvcHRpb25zLmRpc3Bvc2UoKTtcbiAgICAgICAgY29uc3Qgc3RhY2sgPSBvd24odmFsdWUsICdzdGFjaycpO1xuICAgICAgICBpZiAoc3RhY2sgJiYgIXN0YWNrLmlzVW5kZWZpbmVkKSBkZWZpbmUoZXJyb3IsICdzdGFjaycsIHN0YWNrKTtcbiAgICAgICAgc3RhY2s/LmRpc3Bvc2UoKTtcbiAgICAgICAgY2xzLmRpc3Bvc2UoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGVycm9yID0gYnVpbGRFcnJvcihpLkVycm9yLCB2YWx1ZSwgeyBuYW1lOiAnU3RyZWFtRXJyb3InIH0pO1xuICAgICAgICBmb3IgKGNvbnN0IHByb3BlcnR5IG9mIFsnc3RhdHVzJywgJ3VybCddIGFzIGNvbnN0KSB7XG4gICAgICAgICAgY29uc3QgcHJvcGVydHlWYWx1ZSA9IG93bih2YWx1ZSwgcHJvcGVydHkpO1xuICAgICAgICAgIGlmIChwcm9wZXJ0eVZhbHVlICYmICFwcm9wZXJ0eVZhbHVlLmlzVW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBkZWZpbmUoZXJyb3IsIHByb3BlcnR5LCBwcm9wZXJ0eVZhbHVlKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcHJvcGVydHlWYWx1ZT8uZGlzcG9zZSgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gZXJyb3I7XG4gICAgfSxcbiAgICBTeW50YXhFcnJvcjogbmFtZWRFcnJvclN1YmNsYXNzUmV2aXZlcignU3ludGF4RXJyb3InKSxcbiAgICBUeXBlRXJyb3I6IG5hbWVkRXJyb3JTdWJjbGFzc1Jldml2ZXIoJ1R5cGVFcnJvcicpLFxuICAgIFVSSUVycm9yOiBuYW1lZEVycm9yU3ViY2xhc3NSZXZpdmVyKCdVUklFcnJvcicpLFxuICAgIEVycm9yOiAodmFsdWU6IEpTVmFsdWVIYW5kbGUpID0+XG4gICAgICBidWlsZEVycm9yKGkuRXJyb3IsIHZhbHVlLCB7XG4gICAgICAgIG5hbWU6IG93blN0cmluZyh2YWx1ZSwgJ25hbWUnKSA/PyAnRXJyb3InLFxuICAgICAgfSksXG4gICAgRmxvYXQzMkFycmF5OiAodmFsdWU6IHN0cmluZyB8IEpTVmFsdWVIYW5kbGUpID0+XG4gICAgICBidWlsZFR5cGVkQXJyYXkoJ0Zsb2F0MzJBcnJheScsIHZhbHVlKSxcbiAgICBGbG9hdDY0QXJyYXk6ICh2YWx1ZTogc3RyaW5nIHwgSlNWYWx1ZUhhbmRsZSkgPT5cbiAgICAgIGJ1aWxkVHlwZWRBcnJheSgnRmxvYXQ2NEFycmF5JywgdmFsdWUpLFxuICAgIEludDhBcnJheTogKHZhbHVlOiBzdHJpbmcgfCBKU1ZhbHVlSGFuZGxlKSA9PlxuICAgICAgYnVpbGRUeXBlZEFycmF5KCdJbnQ4QXJyYXknLCB2YWx1ZSksXG4gICAgSW50MTZBcnJheTogKHZhbHVlOiBzdHJpbmcgfCBKU1ZhbHVlSGFuZGxlKSA9PlxuICAgICAgYnVpbGRUeXBlZEFycmF5KCdJbnQxNkFycmF5JywgdmFsdWUpLFxuICAgIEludDMyQXJyYXk6ICh2YWx1ZTogc3RyaW5nIHwgSlNWYWx1ZUhhbmRsZSkgPT5cbiAgICAgIGJ1aWxkVHlwZWRBcnJheSgnSW50MzJBcnJheScsIHZhbHVlKSxcbiAgICBNYXA6ICh2YWx1ZTogSlNWYWx1ZUhhbmRsZSkgPT4ge1xuICAgICAgLy8gdmFsdWUgaXMgYSBndWVzdCBhcnJheSBvZiBbaywgdl0gYXJyYXlzLlxuICAgICAgY29uc3QgbWFwID0gdm0uY29uc3RydWN0KGkuTWFwKTtcbiAgICAgIGNvbnN0IGxlbmd0aCA9IG93bih2YWx1ZSwgJ2xlbmd0aCcpPy5jb25zdW1lKChoKSA9PiBoLnRvTnVtYmVyKCkpID8/IDA7XG4gICAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgbGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgICAgIGNvbnN0IGVudHJ5ID0gb3duKHZhbHVlLCBTdHJpbmcoaW5kZXgpKTtcbiAgICAgICAgaWYgKCFlbnRyeSkgY29udGludWU7XG4gICAgICAgIGNvbnN0IGtleSA9IG93bihlbnRyeSwgJzAnKSA/PyB2bS51bmRlZmluZWQ7XG4gICAgICAgIGNvbnN0IGVudHJ5VmFsdWUgPSBvd24oZW50cnksICcxJykgPz8gdm0udW5kZWZpbmVkO1xuICAgICAgICBjYWxsKGkubWFwU2V0LCBtYXAsIGtleSwgZW50cnlWYWx1ZSkuZGlzcG9zZSgpO1xuICAgICAgICBpZiAoa2V5ICE9PSB2bS51bmRlZmluZWQpIGtleS5kaXNwb3NlKCk7XG4gICAgICAgIGlmIChlbnRyeVZhbHVlICE9PSB2bS51bmRlZmluZWQpIGVudHJ5VmFsdWUuZGlzcG9zZSgpO1xuICAgICAgICBlbnRyeS5kaXNwb3NlKCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gbWFwO1xuICAgIH0sXG4gICAgUmVnRXhwOiAodmFsdWU6IEpTVmFsdWVIYW5kbGUpID0+IHtcbiAgICAgIGNvbnN0IHNvdXJjZSA9IG93bih2YWx1ZSwgJ3NvdXJjZScpID8/IHZtLnVuZGVmaW5lZDtcbiAgICAgIGNvbnN0IGZsYWdzID0gb3duKHZhbHVlLCAnZmxhZ3MnKSA/PyB2bS51bmRlZmluZWQ7XG4gICAgICBjb25zdCByZWdleHAgPSB2bS5jb25zdHJ1Y3QoaS5SZWdFeHAsIHNvdXJjZSwgZmxhZ3MpO1xuICAgICAgaWYgKHNvdXJjZSAhPT0gdm0udW5kZWZpbmVkKSBzb3VyY2UuZGlzcG9zZSgpO1xuICAgICAgaWYgKGZsYWdzICE9PSB2bS51bmRlZmluZWQpIGZsYWdzLmRpc3Bvc2UoKTtcbiAgICAgIHJldHVybiByZWdleHA7XG4gICAgfSxcbiAgICBTZXQ6ICh2YWx1ZTogSlNWYWx1ZUhhbmRsZSkgPT4ge1xuICAgICAgY29uc3Qgc2V0ID0gdm0uY29uc3RydWN0KGkuU2V0KTtcbiAgICAgIGNvbnN0IGxlbmd0aCA9IG93bih2YWx1ZSwgJ2xlbmd0aCcpPy5jb25zdW1lKChoKSA9PiBoLnRvTnVtYmVyKCkpID8/IDA7XG4gICAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgbGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgICAgIGNvbnN0IGVsZW1lbnQgPSBvd24odmFsdWUsIFN0cmluZyhpbmRleCkpID8/IHZtLnVuZGVmaW5lZDtcbiAgICAgICAgY2FsbChpLnNldEFkZCwgc2V0LCBlbGVtZW50KS5kaXNwb3NlKCk7XG4gICAgICAgIGlmIChlbGVtZW50ICE9PSB2bS51bmRlZmluZWQpIGVsZW1lbnQuZGlzcG9zZSgpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHNldDtcbiAgICB9LFxuICAgIFVSTDogKHZhbHVlOiBKU1ZhbHVlSGFuZGxlIHwgc3RyaW5nKSA9PiB7XG4gICAgICBpZiAoIWkuVVJMKSB0aHJvdyBuZXcgRXJyb3IoJ1VSTCBpcyBub3QgYXZhaWxhYmxlIGluIHRoZSBWTScpO1xuICAgICAgY29uc3QgaHJlZiA9IGlzSGFuZGxlKHZhbHVlKSA/IHZhbHVlIDogdm0ubmV3U3RyaW5nKHZhbHVlKTtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiB2bS5jb25zdHJ1Y3QoaS5VUkwsIGhyZWYpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgaWYgKCFpc0hhbmRsZSh2YWx1ZSkpIGhyZWYuZGlzcG9zZSgpO1xuICAgICAgfVxuICAgIH0sXG4gICAgV29ya2Zsb3dGdW5jdGlvbjogKHZhbHVlOiBKU1ZhbHVlSGFuZGxlKSA9PiB7XG4gICAgICBjb25zdCB3b3JrZmxvd0lkID0gb3duKHZhbHVlLCAnd29ya2Zsb3dJZCcpID8/IHZtLnVuZGVmaW5lZDtcbiAgICAgIGNvbnN0IHRocm93ZXJGYWN0b3J5ID0gdm0uZXZhbENvZGUoXG4gICAgICAgIGAoZnVuY3Rpb24od29ya2Zsb3dJZCkge1xuICAgICAgICAgIHZhciBmID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1dvcmtmbG93IGZ1bmN0aW9ucyBjYW5ub3QgYmUgY2FsbGVkIGRpcmVjdGx5LiBVc2Ugc3RhcnQoKSB0byBpbnZva2UgdGhlbS4nKTtcbiAgICAgICAgICB9O1xuICAgICAgICAgIGYud29ya2Zsb3dJZCA9IHdvcmtmbG93SWQ7XG4gICAgICAgICAgcmV0dXJuIGY7XG4gICAgICAgIH0pYFxuICAgICAgKTtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBpbnZva2UodGhyb3dlckZhY3RvcnksIHdvcmtmbG93SWQpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgdGhyb3dlckZhY3RvcnkuZGlzcG9zZSgpO1xuICAgICAgICBpZiAod29ya2Zsb3dJZCAhPT0gdm0udW5kZWZpbmVkKSB3b3JrZmxvd0lkLmRpc3Bvc2UoKTtcbiAgICAgIH1cbiAgICB9LFxuICAgIFVSTFNlYXJjaFBhcmFtczogKHZhbHVlOiBKU1ZhbHVlSGFuZGxlIHwgc3RyaW5nKSA9PiB7XG4gICAgICBpZiAoIWkuVVJMU2VhcmNoUGFyYW1zKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignVVJMU2VhcmNoUGFyYW1zIGlzIG5vdCBhdmFpbGFibGUgaW4gdGhlIFZNJyk7XG4gICAgICB9XG4gICAgICBjb25zdCByYXcgPSBpc0hhbmRsZSh2YWx1ZSkgPyB2YWx1ZS50b1N0cmluZygpIDogdmFsdWU7XG4gICAgICBjb25zdCBpbml0ID0gdm0ubmV3U3RyaW5nKHJhdyA9PT0gJy4nID8gJycgOiByYXcpO1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIHZtLmNvbnN0cnVjdChpLlVSTFNlYXJjaFBhcmFtcywgaW5pdCk7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBpbml0LmRpc3Bvc2UoKTtcbiAgICAgICAgaWYgKGlzSGFuZGxlKHZhbHVlKSkgdmFsdWUuZGlzcG9zZSgpO1xuICAgICAgfVxuICAgIH0sXG4gICAgVWludDhBcnJheTogKHZhbHVlOiBzdHJpbmcgfCBKU1ZhbHVlSGFuZGxlKSA9PlxuICAgICAgYnVpbGRUeXBlZEFycmF5KCdVaW50OEFycmF5JywgdmFsdWUpLFxuICAgIFVpbnQ4Q2xhbXBlZEFycmF5OiAodmFsdWU6IHN0cmluZyB8IEpTVmFsdWVIYW5kbGUpID0+XG4gICAgICBidWlsZFR5cGVkQXJyYXkoJ1VpbnQ4Q2xhbXBlZEFycmF5JywgdmFsdWUpLFxuICAgIFVpbnQxNkFycmF5OiAodmFsdWU6IHN0cmluZyB8IEpTVmFsdWVIYW5kbGUpID0+XG4gICAgICBidWlsZFR5cGVkQXJyYXkoJ1VpbnQxNkFycmF5JywgdmFsdWUpLFxuICAgIFVpbnQzMkFycmF5OiAodmFsdWU6IHN0cmluZyB8IEpTVmFsdWVIYW5kbGUpID0+XG4gICAgICBidWlsZFR5cGVkQXJyYXkoJ1VpbnQzMkFycmF5JywgdmFsdWUpLFxuICAgIEhlYWRlcnM6ICh2YWx1ZTogSlNWYWx1ZUhhbmRsZSkgPT4ge1xuICAgICAgaWYgKCFpLkhlYWRlcnMpIHRocm93IG5ldyBFcnJvcignSGVhZGVycyBpcyBub3QgYXZhaWxhYmxlIGluIHRoZSBWTScpO1xuICAgICAgcmV0dXJuIHZtLmNvbnN0cnVjdChpLkhlYWRlcnMsIHZhbHVlKTtcbiAgICB9LFxuICAgIFJlcXVlc3Q6ICh2YWx1ZTogSlNWYWx1ZUhhbmRsZSkgPT4ge1xuICAgICAgLy8gTWlycm9yIHRoZSBpbi1WTSByZXZpdmVyOiBtdXRhdGUgdGhlIHBhcnNlZCBvYmplY3QgaW50byBhXG4gICAgICAvLyBSZXF1ZXN0LWFsaWtlIGJ5IGF0dGFjaGluZyB0aGUgcHJvdG90eXBlIG1ldGhvZHMgZGlyZWN0bHkuXG4gICAgICBpZiAoaS5yZXF1ZXN0UHJvdG90eXBlKSB7XG4gICAgICAgIGZvciAoY29uc3QgbWV0aG9kIG9mIFsnanNvbicsICd0ZXh0JywgJ2FycmF5QnVmZmVyJ10pIHtcbiAgICAgICAgICBjb25zdCBmbiA9IG93bihpLnJlcXVlc3RQcm90b3R5cGUsIG1ldGhvZCk7XG4gICAgICAgICAgaWYgKGZuICYmIGZuLnR5cGVvZiA9PT0gJ2Z1bmN0aW9uJykgZGVmaW5lKHZhbHVlLCBtZXRob2QsIGZuKTtcbiAgICAgICAgICBmbj8uZGlzcG9zZSgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBjb25zdCByZXNwb25zZVdyaXRhYmxlID0gb3duKHZhbHVlLCAncmVzcG9uc2VXcml0YWJsZScpO1xuICAgICAgaWYgKHJlc3BvbnNlV3JpdGFibGUgJiYgIXJlc3BvbnNlV3JpdGFibGUuaXNVbmRlZmluZWQpIHtcbiAgICAgICAgZGVmaW5lKHZhbHVlLCBzeW0oJ1dFQkhPT0tfUkVTUE9OU0VfV1JJVEFCTEUnKSwgcmVzcG9uc2VXcml0YWJsZSk7XG4gICAgICB9XG4gICAgICByZXNwb25zZVdyaXRhYmxlPy5kaXNwb3NlKCk7XG4gICAgICByZXR1cm4gdmFsdWUuZHVwKCk7XG4gICAgfSxcbiAgICBSZXNwb25zZTogKHZhbHVlOiBKU1ZhbHVlSGFuZGxlKSA9PiB7XG4gICAgICBpZiAoaS5yZXNwb25zZVByb3RvdHlwZSkge1xuICAgICAgICBmb3IgKGNvbnN0IG1ldGhvZCBvZiBbXG4gICAgICAgICAgJ2pzb24nLFxuICAgICAgICAgICd0ZXh0JyxcbiAgICAgICAgICAnYXJyYXlCdWZmZXInLFxuICAgICAgICAgICdieXRlcycsXG4gICAgICAgICAgJ2Nsb25lJyxcbiAgICAgICAgXSkge1xuICAgICAgICAgIGNvbnN0IGZuID0gb3duKGkucmVzcG9uc2VQcm90b3R5cGUsIG1ldGhvZCk7XG4gICAgICAgICAgaWYgKGZuICYmIGZuLnR5cGVvZiA9PT0gJ2Z1bmN0aW9uJykgZGVmaW5lKHZhbHVlLCBtZXRob2QsIGZuKTtcbiAgICAgICAgICBmbj8uZGlzcG9zZSgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBjb25zdCBib2R5ID0gb3duKHZhbHVlLCAnYm9keScpID8/IHZtLnVuZGVmaW5lZDtcbiAgICAgIGRlZmluZSh2YWx1ZSwgJ19ib2R5JywgYm9keSk7XG4gICAgICBpZiAoYm9keSAhPT0gdm0udW5kZWZpbmVkKSBib2R5LmRpc3Bvc2UoKTtcbiAgICAgIGNvbnN0IHN0YXR1cyA9IG93bih2YWx1ZSwgJ3N0YXR1cycpPy5jb25zdW1lKChoKSA9PiBoLnRvTnVtYmVyKCkpID8/IDA7XG4gICAgICBjb25zdCBvayA9IHN0YXR1cyA+PSAyMDAgJiYgc3RhdHVzIDwgMzAwID8gdm0udHJ1ZSA6IHZtLmZhbHNlO1xuICAgICAgZGVmaW5lKHZhbHVlLCAnb2snLCBvayk7XG4gICAgICBkZWZpbmUodmFsdWUsICdib2R5VXNlZCcsIHZtLmZhbHNlKTtcbiAgICAgIHJldHVybiB2YWx1ZS5kdXAoKTtcbiAgICB9LFxuICAgIFJlYWRhYmxlU3RyZWFtOiAodmFsdWU6IEpTVmFsdWVIYW5kbGUpID0+IHtcbiAgICAgIGNvbnN0IHByb3RvdHlwZSA9IGkucmVhZGFibGVTdHJlYW1Qcm90b3R5cGUgPz8gdm0ubnVsbDtcbiAgICAgIGNvbnN0IHN0cmVhbSA9IGNhbGwoaS5vYmplY3RDcmVhdGUsIHZtLnVuZGVmaW5lZCwgcHJvdG90eXBlKTtcbiAgICAgIGNvbnN0IGJvZHlJbml0ID0gb3duKHZhbHVlLCAnYm9keUluaXQnKTtcbiAgICAgIGlmIChib2R5SW5pdCAmJiAhYm9keUluaXQuaXNVbmRlZmluZWQpIHtcbiAgICAgICAgZGVmaW5lKHN0cmVhbSwgc3ltKCdCT0RZX0lOSVQnKSwgYm9keUluaXQpO1xuICAgICAgICBib2R5SW5pdC5kaXNwb3NlKCk7XG4gICAgICAgIHJldHVybiBzdHJlYW07XG4gICAgICB9XG4gICAgICBib2R5SW5pdD8uZGlzcG9zZSgpO1xuICAgICAgY29uc3QgbmFtZSA9IG93bih2YWx1ZSwgJ25hbWUnKTtcbiAgICAgIGlmIChuYW1lICYmICFuYW1lLmlzVW5kZWZpbmVkKSB7XG4gICAgICAgIGRlZmluZShzdHJlYW0sIHN5bSgnV09SS0ZMT1dfU1RSRUFNX05BTUUnKSwgbmFtZSk7XG4gICAgICAgIGNvbnN0IHR5cGUgPSBvd24odmFsdWUsICd0eXBlJyk7XG4gICAgICAgIGlmICh0eXBlICYmICF0eXBlLmlzVW5kZWZpbmVkKSB7XG4gICAgICAgICAgZGVmaW5lKHN0cmVhbSwgc3ltKCdXT1JLRkxPV19TVFJFQU1fVFlQRScpLCB0eXBlKTtcbiAgICAgICAgfVxuICAgICAgICB0eXBlPy5kaXNwb3NlKCk7XG4gICAgICAgIGNvbnN0IGZyYW1pbmcgPSBvd24odmFsdWUsICdmcmFtaW5nJyk7XG4gICAgICAgIGlmIChmcmFtaW5nICYmICFmcmFtaW5nLmlzVW5kZWZpbmVkKSB7XG4gICAgICAgICAgZGVmaW5lKHN0cmVhbSwgc3ltKCdXT1JLRkxPV19TVFJFQU1fRlJBTUlORycpLCBmcmFtaW5nKTtcbiAgICAgICAgfVxuICAgICAgICBmcmFtaW5nPy5kaXNwb3NlKCk7XG4gICAgICB9XG4gICAgICBuYW1lPy5kaXNwb3NlKCk7XG4gICAgICByZXR1cm4gc3RyZWFtO1xuICAgIH0sXG4gICAgV3JpdGFibGVTdHJlYW06ICh2YWx1ZTogSlNWYWx1ZUhhbmRsZSkgPT4ge1xuICAgICAgY29uc3QgcHJvdG90eXBlID0gaS53cml0YWJsZVN0cmVhbVByb3RvdHlwZSA/PyB2bS5udWxsO1xuICAgICAgY29uc3Qgc3RyZWFtID0gY2FsbChpLm9iamVjdENyZWF0ZSwgdm0udW5kZWZpbmVkLCBwcm90b3R5cGUpO1xuICAgICAgY29uc3QgbmFtZSA9IG93bih2YWx1ZSwgJ25hbWUnKTtcbiAgICAgIGlmIChuYW1lICYmICFuYW1lLmlzVW5kZWZpbmVkKSB7XG4gICAgICAgIGRlZmluZShzdHJlYW0sIHN5bSgnV09SS0ZMT1dfU1RSRUFNX05BTUUnKSwgbmFtZSk7XG4gICAgICB9XG4gICAgICBuYW1lPy5kaXNwb3NlKCk7XG4gICAgICBjb25zdCBydW5JZCA9IG93bih2YWx1ZSwgJ3J1bklkJyk7XG4gICAgICBpZiAocnVuSWQ/LmlzU3RyaW5nKSB7XG4gICAgICAgIGRlZmluZShzdHJlYW0sIHN5bSgnV09SS0ZMT1dfU1RSRUFNX1NFUlZFUl9SVU5fSUQnKSwgcnVuSWQpO1xuICAgICAgfVxuICAgICAgcnVuSWQ/LmRpc3Bvc2UoKTtcbiAgICAgIGNvbnN0IGRlcGxveW1lbnRJZCA9IG93bih2YWx1ZSwgJ2RlcGxveW1lbnRJZCcpO1xuICAgICAgaWYgKGRlcGxveW1lbnRJZD8uaXNTdHJpbmcpIHtcbiAgICAgICAgZGVmaW5lKFxuICAgICAgICAgIHN0cmVhbSxcbiAgICAgICAgICBzeW0oJ1dPUktGTE9XX1NUUkVBTV9TRVJWRVJfREVQTE9ZTUVOVF9JRCcpLFxuICAgICAgICAgIGRlcGxveW1lbnRJZFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgZGVwbG95bWVudElkPy5kaXNwb3NlKCk7XG4gICAgICByZXR1cm4gc3RyZWFtO1xuICAgIH0sXG4gIH07XG5cbiAgZnVuY3Rpb24gYnVpbGRUeXBlZEFycmF5KFxuICAgIHRhZzogc3RyaW5nLFxuICAgIGJhc2U2NDogc3RyaW5nIHwgSlNWYWx1ZUhhbmRsZVxuICApOiBKU1ZhbHVlSGFuZGxlIHtcbiAgICBjb25zdCBDb25zdHJ1Y3RvciA9IHR5cGVkQXJyYXlDb25zdHJ1Y3RvcnMuZ2V0KHRhZyk7XG4gICAgaWYgKCFDb25zdHJ1Y3RvcikgdGhyb3cgbmV3IEVycm9yKGAke3RhZ30gaXMgbm90IGF2YWlsYWJsZSBpbiB0aGUgVk1gKTtcbiAgICAvLyBQYXJzZSBvcGVyYXRpb25zIGJ1aWxkIGd1ZXN0IHZhbHVlcywgc28gYSByZWR1Y2VkIGJhc2U2NCBwYXlsb2FkXG4gICAgLy8gYXJyaXZlcyBhcyBhIGd1ZXN0IHN0cmluZyBoYW5kbGUuXG4gICAgY29uc3QgcmF3ID0gaXNIYW5kbGUoYmFzZTY0KSA/IGJhc2U2NC50b1N0cmluZygpIDogYmFzZTY0O1xuICAgIGNvbnN0IGJ5dGVzID0gYmFzZTY0VG9CeXRlcyhyYXcpO1xuICAgIGNvbnN0IGJ1ZmZlciA9IHZtLm5ld0FycmF5QnVmZmVyKFxuICAgICAgYnl0ZXMuYnVmZmVyLnNsaWNlKFxuICAgICAgICBieXRlcy5ieXRlT2Zmc2V0LFxuICAgICAgICBieXRlcy5ieXRlT2Zmc2V0ICsgYnl0ZXMuYnl0ZUxlbmd0aFxuICAgICAgKSBhcyBBcnJheUJ1ZmZlclxuICAgICk7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiB2bS5jb25zdHJ1Y3QoQ29uc3RydWN0b3IsIGJ1ZmZlcik7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGJ1ZmZlci5kaXNwb3NlKCk7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gbG9va3VwUmVnaXN0ZXJlZENsYXNzKFxuICAgIGNsYXNzSWQ6IHN0cmluZyB8IHVuZGVmaW5lZFxuICApOiBKU1ZhbHVlSGFuZGxlIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAoY2xhc3NJZCA9PT0gdW5kZWZpbmVkKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIGNvbnN0IHJlZ2lzdHJ5ID0gb3duKHZtLmdsb2JhbCwgc3ltKCd3b3JrZmxvdy1jbGFzcy1yZWdpc3RyeScpKTtcbiAgICBpZiAoIXJlZ2lzdHJ5IHx8IHJlZ2lzdHJ5LmlzVW5kZWZpbmVkKSB7XG4gICAgICByZWdpc3RyeT8uZGlzcG9zZSgpO1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGdldE1ldGhvZCA9IGNoYWluZWQocmVnaXN0cnksICdnZXQnKTtcbiAgICAgIGlmICghZ2V0TWV0aG9kKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3Qga2V5ID0gdm0ubmV3U3RyaW5nKGNsYXNzSWQpO1xuICAgICAgICBjb25zdCBjbHMgPSBjYWxsKGdldE1ldGhvZCwgcmVnaXN0cnksIGtleSk7XG4gICAgICAgIGtleS5kaXNwb3NlKCk7XG4gICAgICAgIGlmIChjbHMuaXNVbmRlZmluZWQgfHwgY2xzLnR5cGVvZiAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIGNscy5kaXNwb3NlKCk7XG4gICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY2xzO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgZ2V0TWV0aG9kLmRpc3Bvc2UoKTtcbiAgICAgIH1cbiAgICB9IGZpbmFsbHkge1xuICAgICAgcmVnaXN0cnkuZGlzcG9zZSgpO1xuICAgIH1cbiAgfVxuXG4gIC8vIC0tLSBwdWJsaWMgQVBJIC0tLVxuXG4gIHJldHVybiB7XG4gICAgcmVkdWNlcktleXM6IE9iamVjdC5rZXlzKHJlZHVjZXJzKSxcbiAgICByZXZpdmVyS2V5czogT2JqZWN0LmtleXMocmV2aXZlcnMpLFxuICAgIGluc3RhbGxQcm9jZXNzRW52KGVudjogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgdW5kZWZpbmVkPik6IHZvaWQge1xuICAgICAgY29uc3QgcGxhaW46IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcbiAgICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGVudikpIHtcbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHBsYWluW2tleV0gPSB2YWx1ZTtcbiAgICAgIH1cbiAgICAgIHVzaW5nIGVudkhhbmRsZSA9IHZtLmhvc3RUb0hhbmRsZShwbGFpbik7XG4gICAgICBjYWxsKGkub2JqZWN0RnJlZXplLCB2bS51bmRlZmluZWQsIGVudkhhbmRsZSkuZGlzcG9zZSgpO1xuICAgICAgdXNpbmcgcHJvY2Vzc0hhbmRsZSA9IHZtLm5ld09iamVjdCgpO1xuICAgICAgZGVmaW5lKHByb2Nlc3NIYW5kbGUsICdlbnYnLCBlbnZIYW5kbGUpO1xuICAgICAgdm0uc2V0UHJvcCh2bS5nbG9iYWwsICdwcm9jZXNzJywgcHJvY2Vzc0hhbmRsZSk7XG4gICAgfSxcbiAgICBzZXJpYWxpemUodmFsdWU6IEpTVmFsdWVIYW5kbGUpOiBVaW50OEFycmF5IHtcbiAgICAgIC8vIEhhbmRsZSBzY29wZTogcmVkdWNlcnMgYW5kIHRoZSBoeWJyaWQgb3BlcmF0aW9ucyBtaW50IG9uZSBoYW5kbGVcbiAgICAgIC8vIHBlciB2aXNpdGVkIHZhbHVlIG5vZGUgKGRlc2NyaXB0b3IgcmVhZHMsIGR1cCgpcywgaW50cmluc2ljIGNhbGxcbiAgICAgIC8vIHJlc3VsdHMpIGFuZCBub3RoaW5nIGRpc3Bvc2VzIHRoZW0gaW5kaXZpZHVhbGx5LiBXaXRob3V0IHRoZVxuICAgICAgLy8gc2NvcGUgZWFjaCBzZXJpYWxpemUgbGVha3Mgfm9uZSBoYW5kbGUgcGVyIG5vZGUgZm9yIHRoZSBWTSdzXG4gICAgICAvLyBsaWZldGltZSwgd2hpY2ggY29tcG91bmRzIGFjcm9zcyBhbiBpbmxpbmUtbG9vcCBzZXNzaW9uJ3Mgd2hvbGVcbiAgICAgIC8vIGJhdGNoLiBSZXF1aXJlcyBxdWlja2pzLXdhc2kgPj0gMy4zLjE6IGVhcmxpZXIgdmVyc2lvbnMgYWxzb1xuICAgICAgLy8gc2NvcGUtdHJhY2tlZCB0aGUgaGFuZGxlcyB0aGUgaG9zdC1jYWxsYmFjayB0cmFtcG9saW5lIHdyYXBzXG4gICAgICAvLyBhcm91bmQgQy1vd25lZCBhcmd2IHBvaW50ZXJzLCBhbmQgZGlzcG9zaW5nIHRob3NlIChNYXAvU2V0L1xuICAgICAgLy8gSGVhZGVycyBmb3JFYWNoIHZpc2l0b3JzIHJ1biBtaWQtcGFzcykgY29ycnVwdGVkIHRoZSBndWVzdCBoZWFwO1xuICAgICAgLy8gMy4zLjEgbWFya3MgdGhlbSBib3Jyb3dlZCBhbmQgc2NvcGUtZXhlbXB0LiBUaGUgaW5wdXQgaGFuZGxlIGlzXG4gICAgICAvLyBjYWxsZXItb3duZWQgKGNyZWF0ZWQgYmVmb3JlIHRoZSBzY29wZSkgYW5kIHRoZSBvdXRwdXQgaXMgaG9zdFxuICAgICAgLy8gYnl0ZXMsIHNvIG5vdGhpbmcgZXNjYXBlcy5cbiAgICAgIC8vXG4gICAgICAvLyBgaWRlbnRpdGllc2AgbXVzdCBiZSBjbGVhcmVkIHBlciBwYXNzIE9OQ0UgaGFuZGxlcyBhcmUgYnVsay1mcmVlZDpcbiAgICAgIC8vIGl0IGtleXMgb2JqZWN0IGlkZW50aXR5IG9uIHRoZSByYXcgZ3Vlc3QgcG9pbnRlciwgYW5kIGZyZWVpbmdcbiAgICAgIC8vIGhhbmRsZXMgbGV0cyBRdWlja0pTIHJldXNlIHBvaW50ZXJzLCBzbyBhIHN0YWxlIGVudHJ5IGZyb20gYW5cbiAgICAgIC8vIGVhcmxpZXIgcGFzcyBjb3VsZCB0aGVuIGFsaWFzIGEgZGlmZmVyZW50IG9iamVjdCBhbmQgY29ycnVwdCB0aGVcbiAgICAgIC8vIGRlZHVwL2N5Y2xlIGRldGVjdGlvbi4gSWRlbnRpdHkgb25seSBuZWVkcyBzdGFiaWxpdHkgd2l0aGluIG9uZVxuICAgICAgLy8gc3RyaW5naWZ5IHBhc3MuXG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBwYXlsb2FkID0gdm0ud2l0aFNjb3BlKCgpID0+XG4gICAgICAgICAgZW5jb2Rlci5lbmNvZGUoXG4gICAgICAgICAgICBzdHJpbmdpZnkodmFsdWUsIHJlZHVjZXJzLCB7IG9wZXJhdGlvbnM6IHN0cmluZ2lmeU9wZXJhdGlvbnMgfSlcbiAgICAgICAgICApXG4gICAgICAgICk7XG4gICAgICAgIGNvbnN0IHByZWZpeCA9IGVuY29kZXIuZW5jb2RlKFNlcmlhbGl6YXRpb25Gb3JtYXQuREVWQUxVRV9WMSk7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IG5ldyBVaW50OEFycmF5KHByZWZpeC5sZW5ndGggKyBwYXlsb2FkLmxlbmd0aCk7XG4gICAgICAgIHJlc3VsdC5zZXQocHJlZml4LCAwKTtcbiAgICAgICAgcmVzdWx0LnNldChwYXlsb2FkLCBwcmVmaXgubGVuZ3RoKTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIGlkZW50aXRpZXMuY2xlYXIoKTtcbiAgICAgIH1cbiAgICB9LFxuICAgIGRlc2VyaWFsaXplKGRhdGE6IFVpbnQ4QXJyYXkpOiBKU1ZhbHVlSGFuZGxlIHtcbiAgICAgIGlmIChkYXRhLmxlbmd0aCA8IEZPUk1BVF9QUkVGSVhfTEVOR1RIKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignRGF0YSB0b28gc2hvcnQgdG8gY29udGFpbiBmb3JtYXQgcHJlZml4Jyk7XG4gICAgICB9XG4gICAgICBjb25zdCBwcmVmaXggPSBkZWNvZGVyLmRlY29kZShkYXRhLnN1YmFycmF5KDAsIEZPUk1BVF9QUkVGSVhfTEVOR1RIKSk7XG4gICAgICBpZiAocHJlZml4ICE9PSBTZXJpYWxpemF0aW9uRm9ybWF0LkRFVkFMVUVfVjEpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbnN1cHBvcnRlZCBzZXJpYWxpemF0aW9uIGZvcm1hdDogJHtwcmVmaXh9YCk7XG4gICAgICB9XG4gICAgICBjb25zdCBwYXlsb2FkID0gZGVjb2Rlci5kZWNvZGUoZGF0YS5zdWJhcnJheShGT1JNQVRfUFJFRklYX0xFTkdUSCkpO1xuICAgICAgLy8gSGFuZGxlIHNjb3BlLCBtaXJyb3Jpbmcgc2VyaWFsaXplKCk6IHJldml2ZXJzIG1pbnQgaW50ZXJtZWRpYXRlXG4gICAgICAvLyBoYW5kbGVzIChjaGlsZHJlbiBhbHJlYWR5IGF0dGFjaGVkIHRvIHRoZWlyIHBhcmVudHMsIGludHJpbnNpY1xuICAgICAgLy8gY2FsbCByZXN1bHRzKSB0aGF0IGFyZSBzYWZlIHRvIGZyZWUgb25jZSB0aGUgZ3JhcGggaXMgYnVpbHQ6XG4gICAgICAvLyBndWVzdCB2YWx1ZXMgYXJlIHJlZmNvdW50ZWQsIHNvIHBhcmVudHMga2VlcCB0aGVpciBjaGlsZHJlblxuICAgICAgLy8gYWxpdmUuIE9ubHkgdGhlIHJvb3QgZXNjYXBlcyB0byB0aGUgY2FsbGVyLlxuICAgICAgcmV0dXJuIHZtLndpdGhTY29wZSgoc2NvcGUpID0+XG4gICAgICAgIHNjb3BlLmVzY2FwZShcbiAgICAgICAgICBwYXJzZShwYXlsb2FkLCByZXZpdmVycywge1xuICAgICAgICAgICAgb3BlcmF0aW9uczogcGFyc2VPcGVyYXRpb25zLFxuICAgICAgICAgIH0pIGFzIEpTVmFsdWVIYW5kbGVcbiAgICAgICAgKVxuICAgICAgKTtcbiAgICB9LFxuICAgIGRpc3Bvc2UoKSB7XG4gICAgICBmb3IgKGNvbnN0IGhhbmRsZSBvZiBkaXNwb3NhYmxlcy5yZXZlcnNlKCkpIGhhbmRsZS5kaXNwb3NlKCk7XG4gICAgICBkaXNwb3NhYmxlcy5sZW5ndGggPSAwO1xuICAgICAgaWRlbnRpdGllcy5jbGVhcigpO1xuICAgIH0sXG4gIH07XG59XG4iXX0=