@logixjs/sandbox 0.0.1 → 0.0.2

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 (248) hide show
  1. package/LICENSE +201 -0
  2. package/package.json +3 -1
  3. package/public/sandbox/chunks/chunk-2AUQRESB.js +1114 -0
  4. package/public/sandbox/chunks/chunk-2F72LQKW.js +194 -0
  5. package/public/sandbox/chunks/chunk-2PYDGDD3.js +4071 -0
  6. package/public/sandbox/chunks/chunk-2UGKSXDZ.js +16 -0
  7. package/public/sandbox/chunks/chunk-2XVE7F26.js +153 -0
  8. package/public/sandbox/chunks/chunk-3A7TFNZN.js +219 -0
  9. package/public/sandbox/chunks/chunk-3BHC6JAV.js +1070 -0
  10. package/public/sandbox/chunks/chunk-3U4CAKCX.js +61 -0
  11. package/public/sandbox/chunks/chunk-3VU3JLZO.js +272 -0
  12. package/public/sandbox/chunks/chunk-4CPONKWY.js +1170 -0
  13. package/public/sandbox/chunks/chunk-4GMUQTWH.js +850 -0
  14. package/public/sandbox/chunks/chunk-4KIYG5E4.js +749 -0
  15. package/public/sandbox/chunks/chunk-4MY35XR3.js +175 -0
  16. package/public/sandbox/chunks/chunk-5DNHJMHA.js +69 -0
  17. package/public/sandbox/chunks/chunk-5EC4S7X6.js +42 -0
  18. package/public/sandbox/chunks/chunk-5FB7QFSH.js +227 -0
  19. package/public/sandbox/chunks/chunk-5GEYCJW2.js +206 -0
  20. package/public/sandbox/chunks/chunk-5PT7Q5SS.js +373 -0
  21. package/public/sandbox/chunks/chunk-5WN5IGKA.js +166 -0
  22. package/public/sandbox/chunks/chunk-5XOBKSOT.js +213 -0
  23. package/public/sandbox/chunks/chunk-67RVISUC.js +313 -0
  24. package/public/sandbox/chunks/chunk-6ELJEKZS.js +12 -0
  25. package/public/sandbox/chunks/chunk-6FKWRVP4.js +85 -0
  26. package/public/sandbox/chunks/chunk-6JRP52YT.js +34 -0
  27. package/public/sandbox/chunks/chunk-6JYAC3G6.js +42 -0
  28. package/public/sandbox/chunks/chunk-6TUOP63Q.js +86 -0
  29. package/public/sandbox/chunks/{chunk-A6JFUNQQ.js → chunk-74C5VW7Z.js} +2 -2
  30. package/public/sandbox/chunks/chunk-75DQFC5M.js +16 -0
  31. package/public/sandbox/chunks/{chunk-UCFEP3BH.js → chunk-7GPAF2UK.js} +1 -1
  32. package/public/sandbox/chunks/chunk-7KQFTS2Y.js +135 -0
  33. package/public/sandbox/chunks/chunk-7POKWYE3.js +112 -0
  34. package/public/sandbox/chunks/chunk-7VUEF5F3.js +395 -0
  35. package/public/sandbox/chunks/chunk-7W5APZS2.js +77 -0
  36. package/public/sandbox/chunks/chunk-A6OFCXDQ.js +397 -0
  37. package/public/sandbox/chunks/chunk-A7HLOSO6.js +216 -0
  38. package/public/sandbox/chunks/chunk-AGF4RRCB.js +408 -0
  39. package/public/sandbox/chunks/chunk-ASJSJAAL.js +122 -0
  40. package/public/sandbox/chunks/chunk-ASVMK364.js +283 -0
  41. package/public/sandbox/chunks/chunk-AUDTI2BQ.js +895 -0
  42. package/public/sandbox/chunks/chunk-B2SZTA3M.js +16 -0
  43. package/public/sandbox/chunks/chunk-B6YS2UMV.js +372 -0
  44. package/public/sandbox/chunks/chunk-BCEO3MGD.js +244 -0
  45. package/public/sandbox/chunks/chunk-BCOO65D4.js +373 -0
  46. package/public/sandbox/chunks/chunk-BJOWSSEL.js +38 -0
  47. package/public/sandbox/chunks/chunk-BS2WBFW4.js +373 -0
  48. package/public/sandbox/chunks/chunk-BUVHG3NJ.js +439 -0
  49. package/public/sandbox/chunks/chunk-BVE33AN6.js +42 -0
  50. package/public/sandbox/chunks/chunk-BWTGJZVP.js +19 -0
  51. package/public/sandbox/chunks/chunk-BXD7GZC3.js +1025 -0
  52. package/public/sandbox/chunks/chunk-BZH4EUUD.js +164 -0
  53. package/public/sandbox/chunks/{chunk-HFV5GJPK.js → chunk-C2MYMMO4.js} +3 -3
  54. package/public/sandbox/chunks/chunk-CRE4NJJ6.js +271 -0
  55. package/public/sandbox/chunks/chunk-CVZPRIDB.js +706 -0
  56. package/public/sandbox/chunks/chunk-CWOXD5NG.js +991 -0
  57. package/public/sandbox/chunks/chunk-D6DOC3BJ.js +373 -0
  58. package/public/sandbox/chunks/chunk-DEPSGFSY.js +1698 -0
  59. package/public/sandbox/chunks/chunk-DM7C5NP5.js +819 -0
  60. package/public/sandbox/chunks/chunk-DN33LMOF.js +1112 -0
  61. package/public/sandbox/chunks/{chunk-S46P7MC6.js → chunk-DT7YIIWE.js} +2 -2
  62. package/public/sandbox/chunks/chunk-DVB5WRCI.js +260 -0
  63. package/public/sandbox/chunks/{chunk-TOHCFMQS.js → chunk-E3EVW7NR.js} +11 -18
  64. package/public/sandbox/chunks/chunk-E5BV567Q.js +417 -0
  65. package/public/sandbox/chunks/chunk-E7BIWMQQ.js +203 -0
  66. package/public/sandbox/chunks/chunk-EAKGPSOQ.js +83 -0
  67. package/public/sandbox/chunks/chunk-EGUYL2ER.js +75 -0
  68. package/public/sandbox/chunks/chunk-EP5GQYZ5.js +85 -0
  69. package/public/sandbox/chunks/chunk-ET6CJEHC.js +221 -0
  70. package/public/sandbox/chunks/chunk-EU67YZHZ.js +1070 -0
  71. package/public/sandbox/chunks/{chunk-PTSJJANP.js → chunk-EYNDQLSB.js} +1 -1
  72. package/public/sandbox/chunks/{chunk-CEGSWZ5S.js → chunk-EZTMVCJF.js} +1 -1
  73. package/public/sandbox/chunks/chunk-F5CLVIS6.js +907 -0
  74. package/public/sandbox/chunks/chunk-F743SKYD.js +85 -0
  75. package/public/sandbox/chunks/chunk-FEGFZ5OX.js +86 -0
  76. package/public/sandbox/chunks/chunk-FG5B7ZX3.js +373 -0
  77. package/public/sandbox/chunks/chunk-FKZPYMDG.js +373 -0
  78. package/public/sandbox/chunks/chunk-FNLXHWIU.js +220 -0
  79. package/public/sandbox/chunks/chunk-FQRUTYAD.js +1991 -0
  80. package/public/sandbox/chunks/{chunk-VLYP4WUS.js → chunk-FY5A73NK.js} +5 -5
  81. package/public/sandbox/chunks/chunk-G7FAOG3O.js +221 -0
  82. package/public/sandbox/chunks/chunk-GFXHUC7Y.js +73 -0
  83. package/public/sandbox/chunks/chunk-GIPXUIZQ.js +534 -0
  84. package/public/sandbox/chunks/chunk-GP37MEGJ.js +52 -0
  85. package/public/sandbox/chunks/chunk-GXL5QCMF.js +4511 -0
  86. package/public/sandbox/chunks/chunk-GZ2NSE6A.js +177 -0
  87. package/public/sandbox/chunks/chunk-GZATW4YD.js +69 -0
  88. package/public/sandbox/chunks/chunk-H4EBXROQ.js +166 -0
  89. package/public/sandbox/chunks/chunk-HETCPK6Z.js +153 -0
  90. package/public/sandbox/chunks/chunk-HGUFQ2QC.js +4431 -0
  91. package/public/sandbox/chunks/chunk-HGV3VNH3.js +255 -0
  92. package/public/sandbox/chunks/chunk-HIJ67QWR.js +5397 -0
  93. package/public/sandbox/chunks/chunk-IDHERBKW.js +1114 -0
  94. package/public/sandbox/chunks/chunk-IDTK4FIY.js +102 -0
  95. package/public/sandbox/chunks/chunk-ILFVY7H5.js +164 -0
  96. package/public/sandbox/chunks/chunk-ISGSRYGO.js +57 -0
  97. package/public/sandbox/chunks/chunk-J45VPU24.js +408 -0
  98. package/public/sandbox/chunks/chunk-JAUIM3O5.js +42 -0
  99. package/public/sandbox/chunks/chunk-JB7OQEM6.js +373 -0
  100. package/public/sandbox/chunks/chunk-JCKW6NHD.js +15 -0
  101. package/public/sandbox/chunks/chunk-JMA7GY7Z.js +221 -0
  102. package/public/sandbox/chunks/chunk-JY46J6IL.js +836 -0
  103. package/public/sandbox/chunks/{chunk-X72PZOFA.js → chunk-K2MQ66O7.js} +1 -1
  104. package/public/sandbox/chunks/chunk-KA7PZA6F.js +464 -0
  105. package/public/sandbox/chunks/chunk-KDEQTUID.js +102 -0
  106. package/public/sandbox/chunks/chunk-KDJR27JV.js +1696 -0
  107. package/public/sandbox/chunks/chunk-KFE3JO6N.js +77 -0
  108. package/public/sandbox/chunks/chunk-KLDSYWT5.js +536 -0
  109. package/public/sandbox/chunks/chunk-KQWWFYBF.js +203 -0
  110. package/public/sandbox/chunks/chunk-KTFZSXOW.js +6473 -0
  111. package/public/sandbox/chunks/chunk-KXVIC55U.js +108 -0
  112. package/public/sandbox/chunks/{chunk-HNEDTEGQ.js → chunk-L4PNO2H6.js} +1 -1
  113. package/public/sandbox/chunks/{chunk-WE4STGO2.js → chunk-L4ZNW5DI.js} +2 -2
  114. package/public/sandbox/chunks/chunk-LBUINGZ4.js +836 -0
  115. package/public/sandbox/chunks/chunk-LIYPPU6I.js +112 -0
  116. package/public/sandbox/chunks/chunk-LJHTOJXW.js +221 -0
  117. package/public/sandbox/chunks/{chunk-BWSNPKO5.js → chunk-LQL23SWJ.js} +2 -2
  118. package/public/sandbox/chunks/chunk-LTFCYZQ6.js +46 -0
  119. package/public/sandbox/chunks/chunk-LTWLVCKQ.js +166 -0
  120. package/public/sandbox/chunks/chunk-LWI7BXFN.js +395 -0
  121. package/public/sandbox/chunks/chunk-LYBBX6WM.js +225 -0
  122. package/public/sandbox/chunks/chunk-MXE7HIBM.js +474 -0
  123. package/public/sandbox/chunks/chunk-MYBDYNK4.js +6004 -0
  124. package/public/sandbox/chunks/chunk-NC2MIWZX.js +732 -0
  125. package/public/sandbox/chunks/chunk-NE447XAF.js +597 -0
  126. package/public/sandbox/chunks/chunk-NEAYV5C2.js +255 -0
  127. package/public/sandbox/chunks/chunk-NMGFJZ4I.js +26 -0
  128. package/public/sandbox/chunks/chunk-NWCJJZNQ.js +71 -0
  129. package/public/sandbox/chunks/chunk-O57OZBDR.js +214 -0
  130. package/public/sandbox/chunks/chunk-OJJT664Q.js +731 -0
  131. package/public/sandbox/chunks/chunk-OKTBUTCH.js +1175 -0
  132. package/public/sandbox/chunks/chunk-OQ4SYV5D.js +534 -0
  133. package/public/sandbox/chunks/chunk-OTVVIHJD.js +219 -0
  134. package/public/sandbox/chunks/chunk-OWTMSCF7.js +1052 -0
  135. package/public/sandbox/chunks/chunk-P5ZQNFC3.js +122 -0
  136. package/public/sandbox/chunks/chunk-PBPT2U2N.js +1698 -0
  137. package/public/sandbox/chunks/chunk-PHBJLCP3.js +836 -0
  138. package/public/sandbox/chunks/chunk-PHV4HYHB.js +397 -0
  139. package/public/sandbox/chunks/chunk-PIXQ6SOX.js +4071 -0
  140. package/public/sandbox/chunks/chunk-PKJL6YLK.js +73 -0
  141. package/public/sandbox/chunks/chunk-PKPOITIU.js +221 -0
  142. package/public/sandbox/chunks/{chunk-NQW73ACJ.js → chunk-PMXBOYQI.js} +1 -1
  143. package/public/sandbox/chunks/chunk-PQLZD7NR.js +836 -0
  144. package/public/sandbox/chunks/chunk-QEESVOZU.js +16 -0
  145. package/public/sandbox/chunks/chunk-QGIM3FQK.js +159 -0
  146. package/public/sandbox/chunks/chunk-QL5JNEDO.js +69 -0
  147. package/public/sandbox/chunks/chunk-QQOZ3RMH.js +867 -0
  148. package/public/sandbox/chunks/chunk-QUMEVT2F.js +194 -0
  149. package/public/sandbox/chunks/chunk-QVZBXYVY.js +102 -0
  150. package/public/sandbox/chunks/chunk-R5HQS6RB.js +135 -0
  151. package/public/sandbox/chunks/chunk-R75Q2CTT.js +900 -0
  152. package/public/sandbox/chunks/chunk-RBB6SHW2.js +253 -0
  153. package/public/sandbox/chunks/chunk-RDHNRWQP.js +383 -0
  154. package/public/sandbox/chunks/chunk-RIWOEI3T.js +1101 -0
  155. package/public/sandbox/chunks/chunk-RS5FFPUV.js +103 -0
  156. package/public/sandbox/chunks/chunk-RYSSJBGX.js +203 -0
  157. package/public/sandbox/chunks/chunk-S3KBAE5Z.js +1114 -0
  158. package/public/sandbox/chunks/chunk-S6ZZHV6G.js +244 -0
  159. package/public/sandbox/chunks/chunk-SFXJ24HY.js +499 -0
  160. package/public/sandbox/chunks/chunk-SH7TP5CJ.js +1109 -0
  161. package/public/sandbox/chunks/chunk-SI5OKFFY.js +317 -0
  162. package/public/sandbox/chunks/chunk-SIXNQNIR.js +86 -0
  163. package/public/sandbox/chunks/chunk-ST353BOX.js +42 -0
  164. package/public/sandbox/chunks/chunk-SYEHKMLP.js +1140 -0
  165. package/public/sandbox/chunks/chunk-SZ4KQUJU.js +69 -0
  166. package/public/sandbox/chunks/{chunk-5SOP6EKV.js → chunk-SZI65PSP.js} +5 -10
  167. package/public/sandbox/chunks/chunk-T7RLTSMX.js +78 -0
  168. package/public/sandbox/chunks/chunk-TJ2RLUTW.js +57 -0
  169. package/public/sandbox/chunks/chunk-TJB73XPN.js +4071 -0
  170. package/public/sandbox/chunks/chunk-TXJCYO56.js +4046 -0
  171. package/public/sandbox/chunks/chunk-U5J3LCYI.js +731 -0
  172. package/public/sandbox/chunks/chunk-UABFN3NH.js +208 -0
  173. package/public/sandbox/chunks/chunk-UBMUY7WO.js +13 -0
  174. package/public/sandbox/chunks/chunk-UC27CE32.js +69 -0
  175. package/public/sandbox/chunks/chunk-UJGVDFZN.js +147 -0
  176. package/public/sandbox/chunks/chunk-UNVLTK4N.js +122 -0
  177. package/public/sandbox/chunks/chunk-UQKQ6V3V.js +208 -0
  178. package/public/sandbox/chunks/chunk-UZZBHWIO.js +703 -0
  179. package/public/sandbox/chunks/chunk-VKZIJERL.js +1114 -0
  180. package/public/sandbox/chunks/chunk-VQQEAGID.js +372 -0
  181. package/public/sandbox/chunks/{chunk-3LX3KIQQ.js → chunk-W365QUZ5.js} +3 -5
  182. package/public/sandbox/chunks/chunk-WJY2LSWG.js +1052 -0
  183. package/public/sandbox/chunks/chunk-WNOBN3DX.js +391 -0
  184. package/public/sandbox/chunks/chunk-X2Z5VYG3.js +245 -0
  185. package/public/sandbox/chunks/chunk-X74KU74D.js +959 -0
  186. package/public/sandbox/chunks/chunk-XE7ULSGQ.js +46 -0
  187. package/public/sandbox/chunks/chunk-XRXUJZ3X.js +431 -0
  188. package/public/sandbox/chunks/chunk-XWHIN7CC.js +85 -0
  189. package/public/sandbox/chunks/chunk-Y2TVGGVL.js +527 -0
  190. package/public/sandbox/chunks/chunk-YMVMZA3U.js +1395 -0
  191. package/public/sandbox/chunks/chunk-YOBLFWDV.js +431 -0
  192. package/public/sandbox/chunks/chunk-YR2RFEZA.js +11 -0
  193. package/public/sandbox/chunks/chunk-YTD6A35P.js +836 -0
  194. package/public/sandbox/chunks/chunk-Z5L7EZXS.js +81 -0
  195. package/public/sandbox/chunks/chunk-Z65I5ET2.js +108 -0
  196. package/public/sandbox/chunks/chunk-Z6LV34RO.js +390 -0
  197. package/public/sandbox/chunks/chunk-ZAKUP6QG.js +1634 -0
  198. package/public/sandbox/chunks/chunk-ZHNYE2YH.js +731 -0
  199. package/public/sandbox/chunks/chunk-ZHQX3B3Y.js +867 -0
  200. package/public/sandbox/chunks/chunk-ZIXDFRHJ.js +731 -0
  201. package/public/sandbox/chunks/chunk-ZPZ2MZ4D.js +528 -0
  202. package/public/sandbox/chunks/chunk-ZQD6NZXB.js +373 -0
  203. package/public/sandbox/chunks/chunk-ZVVBP7ON.js +16 -0
  204. package/public/sandbox/chunks/chunk-ZWE3P6X2.js +11 -0
  205. package/public/sandbox/logix-core/Bound.js +14 -14
  206. package/public/sandbox/logix-core/Debug.js +12 -10
  207. package/public/sandbox/logix-core/EffectOp.js +3 -4
  208. package/public/sandbox/logix-core/Env.js +5 -2
  209. package/public/sandbox/logix-core/ExternalStore.js +239 -0
  210. package/public/sandbox/logix-core/Flow.js +7 -8
  211. package/public/sandbox/logix-core/Kernel.js +7 -4
  212. package/public/sandbox/logix-core/Link.js +33 -25
  213. package/public/sandbox/logix-core/Middleware.js +13 -11
  214. package/public/sandbox/logix-core/Module.js +93 -30
  215. package/public/sandbox/logix-core/ModuleTag.js +28 -25
  216. package/public/sandbox/logix-core/Observability.js +21 -19
  217. package/public/sandbox/logix-core/Process.js +27 -22
  218. package/public/sandbox/logix-core/ReadQuery.js +7 -11
  219. package/public/sandbox/logix-core/Reflection.js +173 -53
  220. package/public/sandbox/logix-core/Resource.js +6 -3
  221. package/public/sandbox/logix-core/Root.js +7 -3
  222. package/public/sandbox/logix-core/Runtime.js +54 -40
  223. package/public/sandbox/logix-core/ScopeRegistry.js +6 -3
  224. package/public/sandbox/logix-core/StateTrait.js +17 -14
  225. package/public/sandbox/logix-core/TraitLifecycle.js +8 -8
  226. package/public/sandbox/logix-core/Workflow.js +332 -0
  227. package/public/sandbox/logix-core.js +11133 -6622
  228. package/public/sandbox/logix-core.manifest.json +4 -2
  229. package/public/sandbox/worker.js +3 -3
  230. package/public/sandbox/chunks/chunk-4LRLOTMA.js +0 -1698
  231. package/public/sandbox/chunks/chunk-CDLXJHXY.js +0 -120
  232. package/public/sandbox/chunks/chunk-CZRI7MHA.js +0 -46
  233. package/public/sandbox/chunks/chunk-EJDFUZ4B.js +0 -408
  234. package/public/sandbox/chunks/chunk-IP63FME6.js +0 -282
  235. package/public/sandbox/chunks/chunk-JIXTOQXJ.js +0 -1103
  236. package/public/sandbox/chunks/chunk-MPUSOFJ3.js +0 -1928
  237. package/public/sandbox/chunks/chunk-ON2LY6HJ.js +0 -135
  238. package/public/sandbox/chunks/chunk-POIBXAH5.js +0 -995
  239. package/public/sandbox/chunks/chunk-PQ652ULI.js +0 -6359
  240. package/public/sandbox/chunks/chunk-RJQ4PG2F.js +0 -77
  241. package/public/sandbox/chunks/chunk-S4EXG3OS.js +0 -533
  242. package/public/sandbox/chunks/chunk-SUXDGXVE.js +0 -390
  243. package/public/sandbox/chunks/chunk-TOQ6SJ6O.js +0 -244
  244. package/public/sandbox/chunks/chunk-UKYAF3NL.js +0 -1036
  245. package/public/sandbox/chunks/chunk-UMVN3AWO.js +0 -395
  246. package/public/sandbox/chunks/chunk-WFV5PPWJ.js +0 -194
  247. package/public/sandbox/chunks/chunk-YF6IO732.js +0 -206
  248. package/public/sandbox/chunks/chunk-ZUBABAAO.js +0 -86
@@ -0,0 +1,703 @@
1
+ // @logixjs/core subpath bundles for @logixjs/sandbox
2
+
3
+ import {
4
+ isJsonValue,
5
+ projectJsonValue
6
+ } from "./chunk-SI5OKFFY.js";
7
+ import {
8
+ fnv1a32,
9
+ stableStringify
10
+ } from "./chunk-DT7YIIWE.js";
11
+
12
+ // ../logix-core/src/internal/workflow/errors.ts
13
+ var toJsonValue = (detail) => {
14
+ if (isJsonValue(detail)) return detail;
15
+ return projectJsonValue(detail).value;
16
+ };
17
+ var makeWorkflowError = (args) => {
18
+ const detailJson = args.detail !== void 0 ? toJsonValue(args.detail) : void 0;
19
+ const msg = args.detail !== void 0 ? `${args.message}
20
+ (detail=${stableStringify(detailJson)})` : args.message;
21
+ return Object.assign(new Error(msg), {
22
+ _tag: "WorkflowError",
23
+ code: args.code,
24
+ programId: args.programId,
25
+ source: args.source,
26
+ detail: detailJson
27
+ });
28
+ };
29
+
30
+ // ../logix-core/src/internal/workflow/inputExpr.ts
31
+ var decodePointerToken = (raw) => raw.replace(/~1/g, "/").replace(/~0/g, "~");
32
+ var isIndexToken = (token) => token === "0" || !token.startsWith("0") && /^\d+$/.test(token);
33
+ var isRecord = (value) => typeof value === "object" && value !== null && !Array.isArray(value);
34
+ var parseJsonPointer = (pointer) => {
35
+ if (pointer === "") return [];
36
+ if (!pointer.startsWith("/")) {
37
+ throw makeWorkflowError({
38
+ code: "WORKFLOW_INVALID_JSON_POINTER",
39
+ message: 'Invalid JSON Pointer (must be "" or start with "/").',
40
+ detail: { pointer }
41
+ });
42
+ }
43
+ const raw = pointer.split("/").slice(1);
44
+ const out = [];
45
+ for (const part of raw) {
46
+ const decoded = decodePointerToken(part);
47
+ out.push(isIndexToken(decoded) ? Number(decoded) : decoded);
48
+ }
49
+ return out;
50
+ };
51
+ var compileInputExpr = (expr, pathForError) => {
52
+ switch (expr.kind) {
53
+ case "payload":
54
+ return { kind: "payload" };
55
+ case "payload.path": {
56
+ const pointer = expr.pointer;
57
+ if (typeof pointer !== "string") {
58
+ throw makeWorkflowError({
59
+ code: "WORKFLOW_INVALID_INPUT_EXPR",
60
+ message: "InputExpr.payload.path.pointer must be a string.",
61
+ source: { stepKey: pathForError?.stepKey },
62
+ detail: { pointer }
63
+ });
64
+ }
65
+ return { kind: "payload.path", pointer, tokens: parseJsonPointer(pointer) };
66
+ }
67
+ case "const": {
68
+ const value = expr.value;
69
+ if (!isJsonValue(value)) {
70
+ throw makeWorkflowError({
71
+ code: "WORKFLOW_INVALID_INPUT_EXPR",
72
+ message: "InputExpr.const.value must be JSON-serializable.",
73
+ source: { stepKey: pathForError?.stepKey },
74
+ detail: { value }
75
+ });
76
+ }
77
+ return { kind: "const", value };
78
+ }
79
+ case "object": {
80
+ const fields = expr.fields;
81
+ if (!fields || typeof fields !== "object" || Array.isArray(fields)) {
82
+ throw makeWorkflowError({
83
+ code: "WORKFLOW_INVALID_INPUT_EXPR",
84
+ message: "InputExpr.object.fields must be a record.",
85
+ source: { stepKey: pathForError?.stepKey }
86
+ });
87
+ }
88
+ const entries = Object.entries(fields).sort(([a], [b]) => a < b ? -1 : a > b ? 1 : 0);
89
+ return {
90
+ kind: "object",
91
+ fields: entries.map(([k, v]) => [k, compileInputExpr(v, pathForError)])
92
+ };
93
+ }
94
+ case "merge": {
95
+ const items = expr.items;
96
+ if (!Array.isArray(items)) {
97
+ throw makeWorkflowError({
98
+ code: "WORKFLOW_INVALID_INPUT_EXPR",
99
+ message: "InputExpr.merge.items must be an array.",
100
+ source: { stepKey: pathForError?.stepKey }
101
+ });
102
+ }
103
+ for (const item of items) {
104
+ const kind = isRecord(item) ? item.kind : void 0;
105
+ if (kind !== "object") {
106
+ throw makeWorkflowError({
107
+ code: "WORKFLOW_INVALID_MERGE_ITEMS",
108
+ message: "InputExpr.merge.items must all be InputExpr.object.",
109
+ source: { stepKey: pathForError?.stepKey },
110
+ detail: { kind }
111
+ });
112
+ }
113
+ }
114
+ return {
115
+ kind: "merge",
116
+ items: items.map((i) => compileInputExpr(i, pathForError))
117
+ };
118
+ }
119
+ }
120
+ };
121
+ var isPlainRecord = (value) => {
122
+ if (typeof value !== "object" || value === null) return false;
123
+ if (Array.isArray(value)) return false;
124
+ const proto = Object.getPrototypeOf(value);
125
+ return proto === Object.prototype || proto === null;
126
+ };
127
+ var evalPointer = (root, tokens) => {
128
+ let current = root;
129
+ for (const token of tokens) {
130
+ if (current == null) return void 0;
131
+ if (Array.isArray(current) && typeof token === "number") {
132
+ current = current[token];
133
+ continue;
134
+ }
135
+ if (typeof current !== "object") return void 0;
136
+ const key = typeof token === "number" ? String(token) : token;
137
+ current = current[key];
138
+ }
139
+ return current;
140
+ };
141
+ var evalInputExpr = (expr, payload) => {
142
+ switch (expr.kind) {
143
+ case "payload":
144
+ return payload;
145
+ case "payload.path":
146
+ return evalPointer(payload, expr.tokens);
147
+ case "const":
148
+ return expr.value;
149
+ case "object": {
150
+ const out = {};
151
+ for (const [k, v] of expr.fields) {
152
+ out[k] = evalInputExpr(v, payload);
153
+ }
154
+ return out;
155
+ }
156
+ case "merge": {
157
+ const out = {};
158
+ for (const item of expr.items) {
159
+ const value = evalInputExpr(item, payload);
160
+ if (isPlainRecord(value)) {
161
+ for (const [k, v] of Object.entries(value)) {
162
+ out[k] = v;
163
+ }
164
+ }
165
+ }
166
+ return out;
167
+ }
168
+ }
169
+ };
170
+
171
+ // ../logix-core/src/internal/workflow/compiler.ts
172
+ var isRecord2 = (value) => typeof value === "object" && value !== null && !Array.isArray(value);
173
+ var asNonEmptyString = (value) => typeof value === "string" && value.trim().length > 0 ? value.trim() : void 0;
174
+ var asNonNegInt = (value) => {
175
+ if (typeof value !== "number" || !Number.isFinite(value)) return void 0;
176
+ const n = Math.floor(value);
177
+ return n >= 0 ? n : void 0;
178
+ };
179
+ var asPosInt = (value) => {
180
+ if (typeof value !== "number" || !Number.isFinite(value)) return void 0;
181
+ const n = Math.floor(value);
182
+ return n > 0 ? n : void 0;
183
+ };
184
+ var normalizeWorkflowDefV1 = (input) => {
185
+ const normalizeStep = (step) => {
186
+ if (!isRecord2(step)) return step;
187
+ if (step.kind !== "call") return step;
188
+ const raw = step;
189
+ const onSuccessRaw = Array.isArray(raw.onSuccess) ? raw.onSuccess : [];
190
+ const onFailureRaw = Array.isArray(raw.onFailure) ? raw.onFailure : [];
191
+ return {
192
+ ...step,
193
+ onSuccess: onSuccessRaw.map(normalizeStep),
194
+ onFailure: onFailureRaw.map(normalizeStep)
195
+ };
196
+ };
197
+ const normalizeSteps = (steps) => steps.map(normalizeStep);
198
+ return {
199
+ ...input,
200
+ steps: normalizeSteps(input.steps)
201
+ };
202
+ };
203
+ function validateWorkflowDefV1(def, options) {
204
+ if (!isRecord2(def)) {
205
+ throw makeWorkflowError({
206
+ code: "WORKFLOW_INVALID_DEF",
207
+ message: "WorkflowDef must be an object.",
208
+ detail: { def }
209
+ });
210
+ }
211
+ if (def.astVersion !== 1) {
212
+ throw makeWorkflowError({
213
+ code: "WORKFLOW_UNSUPPORTED_VERSION",
214
+ message: "Unsupported workflow astVersion.",
215
+ detail: { astVersion: def.astVersion }
216
+ });
217
+ }
218
+ if (!asNonEmptyString(def.localId)) {
219
+ throw makeWorkflowError({
220
+ code: "WORKFLOW_INVALID_DEF",
221
+ message: "WorkflowDef.localId must be a non-empty string.",
222
+ detail: { localId: def.localId }
223
+ });
224
+ }
225
+ const trigger = def.trigger;
226
+ if (!isRecord2(trigger)) {
227
+ throw makeWorkflowError({
228
+ code: "WORKFLOW_INVALID_TRIGGER",
229
+ message: "Workflow trigger must be an object.",
230
+ detail: { trigger }
231
+ });
232
+ }
233
+ if (trigger.kind === "action") {
234
+ if (!asNonEmptyString(trigger.actionTag)) {
235
+ throw makeWorkflowError({
236
+ code: "WORKFLOW_INVALID_TRIGGER",
237
+ message: "Workflow trigger.actionTag must be a non-empty string.",
238
+ detail: { trigger }
239
+ });
240
+ }
241
+ } else if (trigger.kind === "lifecycle") {
242
+ const phase = trigger.phase;
243
+ if (phase !== "onStart" && phase !== "onInit") {
244
+ throw makeWorkflowError({
245
+ code: "WORKFLOW_INVALID_TRIGGER",
246
+ message: 'Workflow trigger.phase must be "onStart" or "onInit".',
247
+ detail: { trigger }
248
+ });
249
+ }
250
+ } else {
251
+ throw makeWorkflowError({
252
+ code: "WORKFLOW_INVALID_TRIGGER",
253
+ message: 'Workflow trigger.kind must be "action" or "lifecycle".',
254
+ detail: { trigger }
255
+ });
256
+ }
257
+ if (!Array.isArray(def.steps)) {
258
+ throw makeWorkflowError({
259
+ code: "WORKFLOW_INVALID_DEF",
260
+ message: "WorkflowDef.steps must be an array.",
261
+ detail: { steps: def.steps }
262
+ });
263
+ }
264
+ const seenKeys = /* @__PURE__ */ new Set();
265
+ const visit = (step, fragmentId) => {
266
+ if (!isRecord2(step)) {
267
+ throw makeWorkflowError({
268
+ code: "WORKFLOW_INVALID_STEP",
269
+ message: "Workflow step must be an object.",
270
+ detail: { step },
271
+ source: fragmentId ? { fragmentId } : void 0
272
+ });
273
+ }
274
+ const key = asNonEmptyString(step.key);
275
+ if (!key) {
276
+ throw makeWorkflowError({
277
+ code: "WORKFLOW_INVALID_STEP",
278
+ message: "Workflow step.key must be a non-empty string.",
279
+ detail: { stepKey: step.key, kind: step.kind },
280
+ source: fragmentId ? { fragmentId } : void 0
281
+ });
282
+ }
283
+ if (seenKeys.has(key)) {
284
+ throw makeWorkflowError({
285
+ code: "WORKFLOW_DUPLICATE_STEP_KEY",
286
+ message: `Duplicate stepKey "${key}" detected.`,
287
+ detail: { duplicateKey: key },
288
+ source: { stepKey: key, ...fragmentId ? { fragmentId } : null }
289
+ });
290
+ }
291
+ seenKeys.add(key);
292
+ if (step.kind === "dispatch") {
293
+ if (!asNonEmptyString(step.actionTag)) {
294
+ throw makeWorkflowError({
295
+ code: "WORKFLOW_INVALID_STEP",
296
+ message: "dispatch.actionTag must be a non-empty string.",
297
+ source: { stepKey: key, ...fragmentId ? { fragmentId } : null },
298
+ detail: { actionTag: step.actionTag }
299
+ });
300
+ }
301
+ const payload = step.payload;
302
+ if (payload !== void 0) {
303
+ validateInputExpr(payload, { stepKey: key });
304
+ }
305
+ return;
306
+ }
307
+ if (step.kind === "delay") {
308
+ const ms = asNonNegInt(step.ms);
309
+ if (ms === void 0) {
310
+ throw makeWorkflowError({
311
+ code: "WORKFLOW_INVALID_STEP",
312
+ message: "delay.ms must be a non-negative integer.",
313
+ source: { stepKey: key, ...fragmentId ? { fragmentId } : null },
314
+ detail: { ms: step.ms }
315
+ });
316
+ }
317
+ return;
318
+ }
319
+ if (step.kind === "call") {
320
+ if (!asNonEmptyString(step.serviceId)) {
321
+ throw makeWorkflowError({
322
+ code: "WORKFLOW_INVALID_SERVICE_ID",
323
+ message: "call.serviceId must be a non-empty string.",
324
+ source: { stepKey: key, ...fragmentId ? { fragmentId } : null },
325
+ detail: { serviceId: step.serviceId }
326
+ });
327
+ }
328
+ const inputExpr = step.input;
329
+ if (inputExpr !== void 0) {
330
+ validateInputExpr(inputExpr, { stepKey: key });
331
+ }
332
+ const timeoutMsRaw = step.timeoutMs;
333
+ if (timeoutMsRaw !== void 0 && asPosInt(timeoutMsRaw) === void 0) {
334
+ throw makeWorkflowError({
335
+ code: "WORKFLOW_INVALID_STEP",
336
+ message: "call.timeoutMs must be a positive integer (milliseconds).",
337
+ source: { stepKey: key, ...fragmentId ? { fragmentId } : null },
338
+ detail: { timeoutMs: timeoutMsRaw }
339
+ });
340
+ }
341
+ const retryRaw = step.retry;
342
+ if (retryRaw !== void 0) {
343
+ const times = isRecord2(retryRaw) ? asPosInt(retryRaw.times) : void 0;
344
+ if (times === void 0) {
345
+ throw makeWorkflowError({
346
+ code: "WORKFLOW_INVALID_STEP",
347
+ message: "call.retry.times must be a positive integer.",
348
+ source: { stepKey: key, ...fragmentId ? { fragmentId } : null },
349
+ detail: { retry: retryRaw }
350
+ });
351
+ }
352
+ }
353
+ const onSuccess = Array.isArray(step.onSuccess) ? step.onSuccess : [];
354
+ const onFailure = Array.isArray(step.onFailure) ? step.onFailure : [];
355
+ for (const inner of onSuccess) visit(inner, fragmentId);
356
+ for (const inner of onFailure) visit(inner, fragmentId);
357
+ return;
358
+ }
359
+ throw makeWorkflowError({
360
+ code: "WORKFLOW_INVALID_STEP",
361
+ message: "Unknown step kind.",
362
+ source: { stepKey: key, ...fragmentId ? { fragmentId } : null },
363
+ detail: { kind: step.kind }
364
+ });
365
+ };
366
+ const sources = def.sources;
367
+ const fragmentByStepKey = /* @__PURE__ */ new Map();
368
+ if (sources && typeof sources === "object") {
369
+ for (const [k, v] of Object.entries(sources)) {
370
+ fragmentByStepKey.set(k, isRecord2(v) ? asNonEmptyString(v.fragmentId) : void 0);
371
+ }
372
+ }
373
+ for (const step of def.steps) {
374
+ const key = isRecord2(step) ? asNonEmptyString(step.key) : void 0;
375
+ const fragmentId = key ? fragmentByStepKey.get(key) : void 0;
376
+ visit(step, fragmentId);
377
+ }
378
+ const generator = isRecord2(def.meta) ? def.meta.generator : void 0;
379
+ if (generator !== void 0 && !isJsonValue(generator)) {
380
+ throw makeWorkflowError({
381
+ code: "WORKFLOW_INVALID_DEF",
382
+ message: "WorkflowDef.meta.generator must be JSON-serializable.",
383
+ detail: { generator }
384
+ });
385
+ }
386
+ const policy = isRecord2(def.policy) ? def.policy : void 0;
387
+ if (policy) {
388
+ const concurrency = policy.concurrency;
389
+ if (concurrency !== void 0 && concurrency !== "latest" && concurrency !== "exhaust" && concurrency !== "parallel") {
390
+ throw makeWorkflowError({
391
+ code: "WORKFLOW_INVALID_DEF",
392
+ message: "policy.concurrency must be latest|exhaust|parallel.",
393
+ detail: { concurrency }
394
+ });
395
+ }
396
+ const priority = policy.priority;
397
+ if (priority !== void 0 && priority !== "urgent" && priority !== "nonUrgent") {
398
+ throw makeWorkflowError({
399
+ code: "WORKFLOW_INVALID_DEF",
400
+ message: "policy.priority must be urgent|nonUrgent.",
401
+ detail: { priority }
402
+ });
403
+ }
404
+ }
405
+ void options?.moduleId;
406
+ }
407
+ var validateInputExpr = (expr, options) => {
408
+ const visit = (e) => {
409
+ if (!isRecord2(e)) {
410
+ throw makeWorkflowError({
411
+ code: "WORKFLOW_INVALID_INPUT_EXPR",
412
+ message: "InputExpr must be an object.",
413
+ source: { stepKey: options?.stepKey },
414
+ detail: { expr: e }
415
+ });
416
+ }
417
+ const kind = e.kind;
418
+ switch (kind) {
419
+ case "payload":
420
+ return;
421
+ case "payload.path": {
422
+ const pointer = e.pointer;
423
+ if (typeof pointer !== "string") {
424
+ throw makeWorkflowError({
425
+ code: "WORKFLOW_INVALID_INPUT_EXPR",
426
+ message: "InputExpr.payload.path.pointer must be a string.",
427
+ source: { stepKey: options?.stepKey },
428
+ detail: { pointer }
429
+ });
430
+ }
431
+ return;
432
+ }
433
+ case "const": {
434
+ const value = e.value;
435
+ if (!isJsonValue(value)) {
436
+ throw makeWorkflowError({
437
+ code: "WORKFLOW_INVALID_INPUT_EXPR",
438
+ message: "InputExpr.const.value must be JSON-serializable.",
439
+ source: { stepKey: options?.stepKey }
440
+ });
441
+ }
442
+ return;
443
+ }
444
+ case "object": {
445
+ const fields = e.fields;
446
+ if (!isRecord2(fields)) {
447
+ throw makeWorkflowError({
448
+ code: "WORKFLOW_INVALID_INPUT_EXPR",
449
+ message: "InputExpr.object.fields must be a record.",
450
+ source: { stepKey: options?.stepKey }
451
+ });
452
+ }
453
+ for (const v of Object.values(fields)) {
454
+ visit(v);
455
+ }
456
+ return;
457
+ }
458
+ case "merge": {
459
+ const items = e.items;
460
+ if (!Array.isArray(items)) {
461
+ throw makeWorkflowError({
462
+ code: "WORKFLOW_INVALID_INPUT_EXPR",
463
+ message: "InputExpr.merge.items must be an array.",
464
+ source: { stepKey: options?.stepKey }
465
+ });
466
+ }
467
+ for (const item of items) {
468
+ visit(item);
469
+ }
470
+ return;
471
+ }
472
+ default:
473
+ throw makeWorkflowError({
474
+ code: "WORKFLOW_INVALID_INPUT_EXPR",
475
+ message: "Unknown InputExpr kind.",
476
+ source: { stepKey: options?.stepKey },
477
+ detail: { kind }
478
+ });
479
+ }
480
+ };
481
+ visit(expr);
482
+ };
483
+ var makeDigest = (prefix, value) => `${prefix}:${fnv1a32(stableStringify(value))}`;
484
+ var makeTriggerNodeId = (programId) => `wf_trigger_v1:${fnv1a32(programId)}`;
485
+ var makeStepNodeId = (programId, stepKey, kind) => `wf_node_v1:${fnv1a32(`${programId}\0${stepKey}\0${kind}`)}`;
486
+ var budgetJsonValue = (value) => projectJsonValue(value).value;
487
+ var budgetInputExpr = (expr) => {
488
+ switch (expr.kind) {
489
+ case "payload":
490
+ case "payload.path":
491
+ return expr;
492
+ case "const": {
493
+ const value = expr.value;
494
+ if (!isJsonValue(value)) return expr;
495
+ return { ...expr, value: budgetJsonValue(expr.value) };
496
+ }
497
+ case "object": {
498
+ const out = {};
499
+ for (const k of Object.keys(expr.fields).sort()) {
500
+ out[k] = budgetInputExpr(expr.fields[k]);
501
+ }
502
+ return { ...expr, fields: out };
503
+ }
504
+ case "merge":
505
+ return { ...expr, items: expr.items.map(budgetInputExpr) };
506
+ }
507
+ };
508
+ var toStaticStep = (step) => {
509
+ switch (step.kind) {
510
+ case "dispatch":
511
+ return {
512
+ kind: "dispatch",
513
+ actionTag: step.actionTag,
514
+ ...step.payload ? { payload: budgetInputExpr(step.payload) } : null
515
+ };
516
+ case "delay":
517
+ return { kind: "delay", ms: step.ms };
518
+ case "call": {
519
+ const policy = step.timeoutMs !== void 0 || step.retry !== void 0 ? {
520
+ ...step.timeoutMs !== void 0 ? { timeoutMs: step.timeoutMs } : null,
521
+ ...step.retry !== void 0 ? { retry: { times: step.retry.times } } : null
522
+ } : void 0;
523
+ return {
524
+ kind: "call",
525
+ serviceId: step.serviceId,
526
+ ...step.input ? { input: budgetInputExpr(step.input) } : null,
527
+ ...policy ? { policy } : null
528
+ };
529
+ }
530
+ }
531
+ };
532
+ var compileWorkflowStaticIrV1 = (args) => {
533
+ const normalized = normalizeWorkflowDefV1(args.def);
534
+ validateWorkflowDefV1(normalized, { moduleId: args.moduleId });
535
+ const programId = `${args.moduleId}.${normalized.localId}`;
536
+ const triggerNodeId = makeTriggerNodeId(programId);
537
+ const fragmentByStepKey = /* @__PURE__ */ new Map();
538
+ if (normalized.sources && typeof normalized.sources === "object") {
539
+ for (const [k, v] of Object.entries(normalized.sources)) {
540
+ fragmentByStepKey.set(k, isRecord2(v) ? asNonEmptyString(v.fragmentId) : void 0);
541
+ }
542
+ }
543
+ const nodesByKey = /* @__PURE__ */ new Map();
544
+ const collectNodes = (steps) => {
545
+ for (const step of steps) {
546
+ const id = makeStepNodeId(programId, step.key, step.kind);
547
+ nodesByKey.set(step.key, id);
548
+ if (step.kind === "call") {
549
+ collectNodes(step.onSuccess);
550
+ collectNodes(step.onFailure);
551
+ }
552
+ }
553
+ };
554
+ collectNodes(normalized.steps);
555
+ const nodes = [
556
+ {
557
+ id: triggerNodeId,
558
+ kind: "trigger",
559
+ trigger: normalized.trigger
560
+ }
561
+ ];
562
+ const addStepNodes = (steps) => {
563
+ for (const step of steps) {
564
+ const id = nodesByKey.get(step.key);
565
+ if (!id) continue;
566
+ const fragmentId = fragmentByStepKey.get(step.key);
567
+ nodes.push({
568
+ id,
569
+ kind: "step",
570
+ step: toStaticStep(step),
571
+ source: {
572
+ stepKey: step.key,
573
+ ...fragmentId ? { fragmentId } : null
574
+ }
575
+ });
576
+ if (step.kind === "call") {
577
+ addStepNodes(step.onSuccess);
578
+ addStepNodes(step.onFailure);
579
+ }
580
+ }
581
+ };
582
+ addStepNodes(normalized.steps);
583
+ const edges = [];
584
+ const pushEdge = (from, to, kind) => {
585
+ edges.push({ from, to, kind });
586
+ };
587
+ const compileBlock = (args2) => {
588
+ if (args2.steps.length === 0) {
589
+ if (args2.continuation) {
590
+ for (const from of args2.entryFrom) {
591
+ pushEdge(from, args2.continuation, args2.entryKind);
592
+ }
593
+ }
594
+ return;
595
+ }
596
+ const first = args2.steps[0];
597
+ const firstId = nodesByKey.get(first.key);
598
+ if (!firstId) {
599
+ throw makeWorkflowError({
600
+ code: "WORKFLOW_INVALID_STEP",
601
+ message: "Internal error: missing node id for stepKey.",
602
+ programId,
603
+ source: { stepKey: first.key }
604
+ });
605
+ }
606
+ for (const from of args2.entryFrom) {
607
+ pushEdge(from, firstId, args2.entryKind);
608
+ }
609
+ const compileStepAndTail = (step, tail, continuation) => {
610
+ const stepId = nodesByKey.get(step.key);
611
+ if (!stepId) return;
612
+ if (step.kind !== "call") {
613
+ compileBlock({ steps: tail, entryFrom: [stepId], entryKind: "next", continuation });
614
+ return;
615
+ }
616
+ const cont = tail.length > 0 ? nodesByKey.get(tail[0].key) : continuation;
617
+ compileBlock({
618
+ steps: step.onSuccess,
619
+ entryFrom: [stepId],
620
+ entryKind: "success",
621
+ continuation: cont
622
+ });
623
+ compileBlock({
624
+ steps: step.onFailure,
625
+ entryFrom: [stepId],
626
+ entryKind: "failure",
627
+ continuation: cont
628
+ });
629
+ compileBlock({ steps: tail, entryFrom: [], entryKind: "next", continuation });
630
+ };
631
+ compileStepAndTail(first, args2.steps.slice(1), args2.continuation);
632
+ };
633
+ compileBlock({ steps: normalized.steps, entryFrom: [triggerNodeId], entryKind: "next", continuation: void 0 });
634
+ nodes.sort((a, b) => a.id < b.id ? -1 : a.id > b.id ? 1 : 0);
635
+ edges.sort((a, b) => {
636
+ if (a.from !== b.from) return a.from < b.from ? -1 : 1;
637
+ if (a.to !== b.to) return a.to < b.to ? -1 : 1;
638
+ const ak = String(a.kind ?? "");
639
+ const bk = String(b.kind ?? "");
640
+ if (ak !== bk) return ak < bk ? -1 : 1;
641
+ return 0;
642
+ });
643
+ const meta = (() => {
644
+ const generator = normalized.meta?.generator;
645
+ if (generator === void 0) return void 0;
646
+ return { generator: budgetJsonValue(generator) };
647
+ })();
648
+ const irNoDigest = {
649
+ version: 1,
650
+ programId,
651
+ nodes,
652
+ edges,
653
+ policy: normalized.policy,
654
+ meta
655
+ };
656
+ const digest = makeDigest("workflow_ir_v1", irNoDigest);
657
+ return {
658
+ ...irNoDigest,
659
+ digest
660
+ };
661
+ };
662
+ var compileWorkflowRuntimeStepsV1 = (args) => {
663
+ const normalized = normalizeWorkflowDefV1(args.def);
664
+ validateWorkflowDefV1(normalized);
665
+ const compileStep = (step) => {
666
+ const stepKey = step.key;
667
+ switch (step.kind) {
668
+ case "dispatch":
669
+ return {
670
+ kind: "dispatch",
671
+ key: step.key,
672
+ actionTag: step.actionTag,
673
+ ...step.payload ? { payload: compileInputExpr(step.payload, { stepKey }) } : null
674
+ };
675
+ case "delay":
676
+ return { kind: "delay", key: step.key, ms: step.ms };
677
+ case "call": {
678
+ const retryTimes = step.retry?.times;
679
+ return {
680
+ kind: "call",
681
+ key: step.key,
682
+ serviceId: step.serviceId,
683
+ ...step.input ? { input: compileInputExpr(step.input, { stepKey }) } : null,
684
+ ...step.timeoutMs !== void 0 ? { timeoutMs: step.timeoutMs } : null,
685
+ ...retryTimes !== void 0 ? { retryTimes } : null,
686
+ onSuccess: step.onSuccess.map(compileStep),
687
+ onFailure: step.onFailure.map(compileStep)
688
+ };
689
+ }
690
+ }
691
+ };
692
+ return normalized.steps.map(compileStep);
693
+ };
694
+
695
+ export {
696
+ makeWorkflowError,
697
+ evalInputExpr,
698
+ normalizeWorkflowDefV1,
699
+ validateWorkflowDefV1,
700
+ compileWorkflowStaticIrV1,
701
+ compileWorkflowRuntimeStepsV1
702
+ };
703
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vbG9naXgtY29yZS9zcmMvaW50ZXJuYWwvd29ya2Zsb3cvZXJyb3JzLnRzIiwgIi4uLy4uLy4uLy4uL2xvZ2l4LWNvcmUvc3JjL2ludGVybmFsL3dvcmtmbG93L2lucHV0RXhwci50cyIsICIuLi8uLi8uLi8uLi9sb2dpeC1jb3JlL3NyYy9pbnRlcm5hbC93b3JrZmxvdy9jb21waWxlci50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiaW1wb3J0IHsgc3RhYmxlU3RyaW5naWZ5IH0gZnJvbSAnLi4vZGlnZXN0LmpzJ1xuaW1wb3J0IHsgaXNKc29uVmFsdWUsIHR5cGUgSnNvblZhbHVlLCBwcm9qZWN0SnNvblZhbHVlIH0gZnJvbSAnLi4vb2JzZXJ2YWJpbGl0eS9qc29uVmFsdWUuanMnXG5cbmV4cG9ydCB0eXBlIFdvcmtmbG93RXJyb3JDb2RlID1cbiAgfCAnV09SS0ZMT1dfVU5TVVBQT1JURURfVkVSU0lPTidcbiAgfCAnV09SS0ZMT1dfSU5WQUxJRF9ERUYnXG4gIHwgJ1dPUktGTE9XX0lOVkFMSURfVFJJR0dFUidcbiAgfCAnV09SS0ZMT1dfSU5WQUxJRF9TVEVQJ1xuICB8ICdXT1JLRkxPV19EVVBMSUNBVEVfU1RFUF9LRVknXG4gIHwgJ1dPUktGTE9XX0lOVkFMSURfSU5QVVRfRVhQUidcbiAgfCAnV09SS0ZMT1dfSU5WQUxJRF9KU09OX1BPSU5URVInXG4gIHwgJ1dPUktGTE9XX0lOVkFMSURfTUVSR0VfSVRFTVMnXG4gIHwgJ1dPUktGTE9XX0lOVkFMSURfU0VSVklDRV9JRCdcbiAgfCAnV09SS0ZMT1dfTUlTU0lOR19TRVJWSUNFJ1xuICB8ICdXT1JLRkxPV19JTlZBTElEX1NFUlZJQ0VfUE9SVCdcbiAgfCAnV09SS0ZMT1dfQ0FMTF9USU1FT1VUJ1xuXG5leHBvcnQgaW50ZXJmYWNlIFdvcmtmbG93RXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gIHJlYWRvbmx5IF90YWc6ICdXb3JrZmxvd0Vycm9yJ1xuICByZWFkb25seSBjb2RlOiBXb3JrZmxvd0Vycm9yQ29kZVxuICByZWFkb25seSBwcm9ncmFtSWQ/OiBzdHJpbmdcbiAgcmVhZG9ubHkgc291cmNlPzoge1xuICAgIHJlYWRvbmx5IHN0ZXBLZXk/OiBzdHJpbmdcbiAgICByZWFkb25seSBmcmFnbWVudElkPzogc3RyaW5nXG4gIH1cbiAgcmVhZG9ubHkgZGV0YWlsPzogSnNvblZhbHVlXG59XG5cbmNvbnN0IHRvSnNvblZhbHVlID0gKGRldGFpbDogdW5rbm93bik6IEpzb25WYWx1ZSA9PiB7XG4gIGlmIChpc0pzb25WYWx1ZShkZXRhaWwpKSByZXR1cm4gZGV0YWlsXG4gIHJldHVybiBwcm9qZWN0SnNvblZhbHVlKGRldGFpbCkudmFsdWVcbn1cblxuZXhwb3J0IGNvbnN0IG1ha2VXb3JrZmxvd0Vycm9yID0gKGFyZ3M6IHtcbiAgcmVhZG9ubHkgY29kZTogV29ya2Zsb3dFcnJvckNvZGVcbiAgcmVhZG9ubHkgbWVzc2FnZTogc3RyaW5nXG4gIHJlYWRvbmx5IHByb2dyYW1JZD86IHN0cmluZ1xuICByZWFkb25seSBzb3VyY2U/OiBXb3JrZmxvd0Vycm9yWydzb3VyY2UnXVxuICByZWFkb25seSBkZXRhaWw/OiB1bmtub3duXG59KTogV29ya2Zsb3dFcnJvciA9PiB7XG4gIGNvbnN0IGRldGFpbEpzb24gPSBhcmdzLmRldGFpbCAhPT0gdW5kZWZpbmVkID8gdG9Kc29uVmFsdWUoYXJncy5kZXRhaWwpIDogdW5kZWZpbmVkXG4gIGNvbnN0IG1zZyA9IGFyZ3MuZGV0YWlsICE9PSB1bmRlZmluZWQgPyBgJHthcmdzLm1lc3NhZ2V9XFxuKGRldGFpbD0ke3N0YWJsZVN0cmluZ2lmeShkZXRhaWxKc29uKX0pYCA6IGFyZ3MubWVzc2FnZVxuXG4gIHJldHVybiBPYmplY3QuYXNzaWduKG5ldyBFcnJvcihtc2cpLCB7XG4gICAgX3RhZzogJ1dvcmtmbG93RXJyb3InIGFzIGNvbnN0LFxuICAgIGNvZGU6IGFyZ3MuY29kZSxcbiAgICBwcm9ncmFtSWQ6IGFyZ3MucHJvZ3JhbUlkLFxuICAgIHNvdXJjZTogYXJncy5zb3VyY2UsXG4gICAgZGV0YWlsOiBkZXRhaWxKc29uLFxuICB9KSBhcyBXb3JrZmxvd0Vycm9yXG59XG4iLCAiaW1wb3J0IHsgaXNKc29uVmFsdWUgfSBmcm9tICcuLi9vYnNlcnZhYmlsaXR5L2pzb25WYWx1ZS5qcydcbmltcG9ydCB7IG1ha2VXb3JrZmxvd0Vycm9yIH0gZnJvbSAnLi9lcnJvcnMuanMnXG5pbXBvcnQgdHlwZSB7IElucHV0RXhwclYxIH0gZnJvbSAnLi9tb2RlbC5qcydcblxuZXhwb3J0IHR5cGUgSnNvblBvaW50ZXJUb2tlbiA9IHN0cmluZyB8IG51bWJlclxuXG5jb25zdCBkZWNvZGVQb2ludGVyVG9rZW4gPSAocmF3OiBzdHJpbmcpOiBzdHJpbmcgPT4gcmF3LnJlcGxhY2UoL34xL2csICcvJykucmVwbGFjZSgvfjAvZywgJ34nKVxuXG5jb25zdCBpc0luZGV4VG9rZW4gPSAodG9rZW46IHN0cmluZyk6IGJvb2xlYW4gPT4gdG9rZW4gPT09ICcwJyB8fCAoIXRva2VuLnN0YXJ0c1dpdGgoJzAnKSAmJiAvXlxcZCskLy50ZXN0KHRva2VuKSlcblxuY29uc3QgaXNSZWNvcmQgPSAodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9PlxuICB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIHZhbHVlICE9PSBudWxsICYmICFBcnJheS5pc0FycmF5KHZhbHVlKVxuXG5leHBvcnQgY29uc3QgcGFyc2VKc29uUG9pbnRlciA9IChwb2ludGVyOiBzdHJpbmcpOiBSZWFkb25seUFycmF5PEpzb25Qb2ludGVyVG9rZW4+ID0+IHtcbiAgaWYgKHBvaW50ZXIgPT09ICcnKSByZXR1cm4gW11cbiAgaWYgKCFwb2ludGVyLnN0YXJ0c1dpdGgoJy8nKSkge1xuICAgIHRocm93IG1ha2VXb3JrZmxvd0Vycm9yKHtcbiAgICAgIGNvZGU6ICdXT1JLRkxPV19JTlZBTElEX0pTT05fUE9JTlRFUicsXG4gICAgICBtZXNzYWdlOiAnSW52YWxpZCBKU09OIFBvaW50ZXIgKG11c3QgYmUgXCJcIiBvciBzdGFydCB3aXRoIFwiL1wiKS4nLFxuICAgICAgZGV0YWlsOiB7IHBvaW50ZXIgfSxcbiAgICB9KVxuICB9XG5cbiAgY29uc3QgcmF3ID0gcG9pbnRlci5zcGxpdCgnLycpLnNsaWNlKDEpXG4gIGNvbnN0IG91dDogSnNvblBvaW50ZXJUb2tlbltdID0gW11cbiAgZm9yIChjb25zdCBwYXJ0IG9mIHJhdykge1xuICAgIGNvbnN0IGRlY29kZWQgPSBkZWNvZGVQb2ludGVyVG9rZW4ocGFydClcbiAgICBvdXQucHVzaChpc0luZGV4VG9rZW4oZGVjb2RlZCkgPyBOdW1iZXIoZGVjb2RlZCkgOiBkZWNvZGVkKVxuICB9XG4gIHJldHVybiBvdXRcbn1cblxuZXhwb3J0IHR5cGUgQ29tcGlsZWRJbnB1dEV4cHIgPVxuICB8IHsgcmVhZG9ubHkga2luZDogJ3BheWxvYWQnIH1cbiAgfCB7IHJlYWRvbmx5IGtpbmQ6ICdwYXlsb2FkLnBhdGgnOyByZWFkb25seSBwb2ludGVyOiBzdHJpbmc7IHJlYWRvbmx5IHRva2VuczogUmVhZG9ubHlBcnJheTxKc29uUG9pbnRlclRva2VuPiB9XG4gIHwgeyByZWFkb25seSBraW5kOiAnY29uc3QnOyByZWFkb25seSB2YWx1ZTogdW5rbm93biB9XG4gIHwgeyByZWFkb25seSBraW5kOiAnb2JqZWN0JzsgcmVhZG9ubHkgZmllbGRzOiBSZWFkb25seUFycmF5PHJlYWRvbmx5IFtzdHJpbmcsIENvbXBpbGVkSW5wdXRFeHByXT4gfVxuICB8IHsgcmVhZG9ubHkga2luZDogJ21lcmdlJzsgcmVhZG9ubHkgaXRlbXM6IFJlYWRvbmx5QXJyYXk8Q29tcGlsZWRJbnB1dEV4cHI+IH1cblxuZXhwb3J0IGNvbnN0IGNvbXBpbGVJbnB1dEV4cHIgPSAoZXhwcjogSW5wdXRFeHByVjEsIHBhdGhGb3JFcnJvcj86IHsgcmVhZG9ubHkgc3RlcEtleT86IHN0cmluZyB9KTogQ29tcGlsZWRJbnB1dEV4cHIgPT4ge1xuICBzd2l0Y2ggKGV4cHIua2luZCkge1xuICAgIGNhc2UgJ3BheWxvYWQnOlxuICAgICAgcmV0dXJuIHsga2luZDogJ3BheWxvYWQnIH1cbiAgICBjYXNlICdwYXlsb2FkLnBhdGgnOiB7XG4gICAgICBjb25zdCBwb2ludGVyID0gZXhwci5wb2ludGVyXG4gICAgICBpZiAodHlwZW9mIHBvaW50ZXIgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHRocm93IG1ha2VXb3JrZmxvd0Vycm9yKHtcbiAgICAgICAgICBjb2RlOiAnV09SS0ZMT1dfSU5WQUxJRF9JTlBVVF9FWFBSJyxcbiAgICAgICAgICBtZXNzYWdlOiAnSW5wdXRFeHByLnBheWxvYWQucGF0aC5wb2ludGVyIG11c3QgYmUgYSBzdHJpbmcuJyxcbiAgICAgICAgICBzb3VyY2U6IHsgc3RlcEtleTogcGF0aEZvckVycm9yPy5zdGVwS2V5IH0sXG4gICAgICAgICAgZGV0YWlsOiB7IHBvaW50ZXIgfSxcbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICAgIHJldHVybiB7IGtpbmQ6ICdwYXlsb2FkLnBhdGgnLCBwb2ludGVyLCB0b2tlbnM6IHBhcnNlSnNvblBvaW50ZXIocG9pbnRlcikgfVxuICAgIH1cbiAgICBjYXNlICdjb25zdCc6IHtcbiAgICAgIGNvbnN0IHZhbHVlOiB1bmtub3duID0gZXhwci52YWx1ZVxuICAgICAgaWYgKCFpc0pzb25WYWx1ZSh2YWx1ZSkpIHtcbiAgICAgICAgdGhyb3cgbWFrZVdvcmtmbG93RXJyb3Ioe1xuICAgICAgICAgIGNvZGU6ICdXT1JLRkxPV19JTlZBTElEX0lOUFVUX0VYUFInLFxuICAgICAgICAgIG1lc3NhZ2U6ICdJbnB1dEV4cHIuY29uc3QudmFsdWUgbXVzdCBiZSBKU09OLXNlcmlhbGl6YWJsZS4nLFxuICAgICAgICAgIHNvdXJjZTogeyBzdGVwS2V5OiBwYXRoRm9yRXJyb3I/LnN0ZXBLZXkgfSxcbiAgICAgICAgICBkZXRhaWw6IHsgdmFsdWUgfSxcbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICAgIHJldHVybiB7IGtpbmQ6ICdjb25zdCcsIHZhbHVlIH1cbiAgICB9XG4gICAgY2FzZSAnb2JqZWN0Jzoge1xuICAgICAgY29uc3QgZmllbGRzOiB1bmtub3duID0gZXhwci5maWVsZHNcbiAgICAgIGlmICghZmllbGRzIHx8IHR5cGVvZiBmaWVsZHMgIT09ICdvYmplY3QnIHx8IEFycmF5LmlzQXJyYXkoZmllbGRzKSkge1xuICAgICAgICB0aHJvdyBtYWtlV29ya2Zsb3dFcnJvcih7XG4gICAgICAgICAgY29kZTogJ1dPUktGTE9XX0lOVkFMSURfSU5QVVRfRVhQUicsXG4gICAgICAgICAgbWVzc2FnZTogJ0lucHV0RXhwci5vYmplY3QuZmllbGRzIG11c3QgYmUgYSByZWNvcmQuJyxcbiAgICAgICAgICBzb3VyY2U6IHsgc3RlcEtleTogcGF0aEZvckVycm9yPy5zdGVwS2V5IH0sXG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgICBjb25zdCBlbnRyaWVzID0gT2JqZWN0LmVudHJpZXMoZmllbGRzIGFzIFJlY29yZDxzdHJpbmcsIElucHV0RXhwclYxPikuc29ydCgoW2FdLCBbYl0pID0+IChhIDwgYiA/IC0xIDogYSA+IGIgPyAxIDogMCkpXG4gICAgICByZXR1cm4ge1xuICAgICAgICBraW5kOiAnb2JqZWN0JyxcbiAgICAgICAgZmllbGRzOiBlbnRyaWVzLm1hcCgoW2ssIHZdKSA9PiBbaywgY29tcGlsZUlucHV0RXhwcih2LCBwYXRoRm9yRXJyb3IpXSBhcyBjb25zdCksXG4gICAgICB9XG4gICAgfVxuICAgIGNhc2UgJ21lcmdlJzoge1xuICAgICAgY29uc3QgaXRlbXM6IHVua25vd24gPSBleHByLml0ZW1zXG4gICAgICBpZiAoIUFycmF5LmlzQXJyYXkoaXRlbXMpKSB7XG4gICAgICAgIHRocm93IG1ha2VXb3JrZmxvd0Vycm9yKHtcbiAgICAgICAgICBjb2RlOiAnV09SS0ZMT1dfSU5WQUxJRF9JTlBVVF9FWFBSJyxcbiAgICAgICAgICBtZXNzYWdlOiAnSW5wdXRFeHByLm1lcmdlLml0ZW1zIG11c3QgYmUgYW4gYXJyYXkuJyxcbiAgICAgICAgICBzb3VyY2U6IHsgc3RlcEtleTogcGF0aEZvckVycm9yPy5zdGVwS2V5IH0sXG4gICAgICAgIH0pXG4gICAgICB9XG5cbiAgICAgIC8vIEhhcmQgZ2F0ZTogbWVyZ2UuaXRlbXMgbXVzdCBhbGwgYmUgb2JqZWN0IChlbmZvcmNlZCBhdCBjb21waWxlLXRpbWU7IHJ1bnRpbWUgc2hvdWxkIG5vdCBicmFuY2gpLlxuICAgICAgZm9yIChjb25zdCBpdGVtIG9mIGl0ZW1zKSB7XG4gICAgICAgIGNvbnN0IGtpbmQgPSBpc1JlY29yZChpdGVtKSA/IGl0ZW0ua2luZCA6IHVuZGVmaW5lZFxuICAgICAgICBpZiAoa2luZCAhPT0gJ29iamVjdCcpIHtcbiAgICAgICAgICB0aHJvdyBtYWtlV29ya2Zsb3dFcnJvcih7XG4gICAgICAgICAgICBjb2RlOiAnV09SS0ZMT1dfSU5WQUxJRF9NRVJHRV9JVEVNUycsXG4gICAgICAgICAgICBtZXNzYWdlOiAnSW5wdXRFeHByLm1lcmdlLml0ZW1zIG11c3QgYWxsIGJlIElucHV0RXhwci5vYmplY3QuJyxcbiAgICAgICAgICAgIHNvdXJjZTogeyBzdGVwS2V5OiBwYXRoRm9yRXJyb3I/LnN0ZXBLZXkgfSxcbiAgICAgICAgICAgIGRldGFpbDogeyBraW5kIH0sXG4gICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBraW5kOiAnbWVyZ2UnLFxuICAgICAgICBpdGVtczogKGl0ZW1zIGFzIFJlYWRvbmx5QXJyYXk8SW5wdXRFeHByVjE+KS5tYXAoKGkpID0+IGNvbXBpbGVJbnB1dEV4cHIoaSwgcGF0aEZvckVycm9yKSksXG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbmNvbnN0IGlzUGxhaW5SZWNvcmQgPSAodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9PiB7XG4gIGlmICh0eXBlb2YgdmFsdWUgIT09ICdvYmplY3QnIHx8IHZhbHVlID09PSBudWxsKSByZXR1cm4gZmFsc2VcbiAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSByZXR1cm4gZmFsc2VcbiAgY29uc3QgcHJvdG8gPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YodmFsdWUpXG4gIHJldHVybiBwcm90byA9PT0gT2JqZWN0LnByb3RvdHlwZSB8fCBwcm90byA9PT0gbnVsbFxufVxuXG5jb25zdCBldmFsUG9pbnRlciA9IChyb290OiB1bmtub3duLCB0b2tlbnM6IFJlYWRvbmx5QXJyYXk8SnNvblBvaW50ZXJUb2tlbj4pOiB1bmtub3duID0+IHtcbiAgbGV0IGN1cnJlbnQ6IHVua25vd24gPSByb290XG4gIGZvciAoY29uc3QgdG9rZW4gb2YgdG9rZW5zKSB7XG4gICAgaWYgKGN1cnJlbnQgPT0gbnVsbCkgcmV0dXJuIHVuZGVmaW5lZFxuICAgIGlmIChBcnJheS5pc0FycmF5KGN1cnJlbnQpICYmIHR5cGVvZiB0b2tlbiA9PT0gJ251bWJlcicpIHtcbiAgICAgIGN1cnJlbnQgPSBjdXJyZW50W3Rva2VuXVxuICAgICAgY29udGludWVcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBjdXJyZW50ICE9PSAnb2JqZWN0JykgcmV0dXJuIHVuZGVmaW5lZFxuICAgIGNvbnN0IGtleSA9IHR5cGVvZiB0b2tlbiA9PT0gJ251bWJlcicgPyBTdHJpbmcodG9rZW4pIDogdG9rZW5cbiAgICBjdXJyZW50ID0gKGN1cnJlbnQgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pW2tleV1cbiAgfVxuICByZXR1cm4gY3VycmVudFxufVxuXG5leHBvcnQgY29uc3QgZXZhbElucHV0RXhwciA9IChleHByOiBDb21waWxlZElucHV0RXhwciwgcGF5bG9hZDogdW5rbm93bik6IHVua25vd24gPT4ge1xuICBzd2l0Y2ggKGV4cHIua2luZCkge1xuICAgIGNhc2UgJ3BheWxvYWQnOlxuICAgICAgcmV0dXJuIHBheWxvYWRcbiAgICBjYXNlICdwYXlsb2FkLnBhdGgnOlxuICAgICAgcmV0dXJuIGV2YWxQb2ludGVyKHBheWxvYWQsIGV4cHIudG9rZW5zKVxuICAgIGNhc2UgJ2NvbnN0JzpcbiAgICAgIHJldHVybiBleHByLnZhbHVlXG4gICAgY2FzZSAnb2JqZWN0Jzoge1xuICAgICAgY29uc3Qgb3V0OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHt9XG4gICAgICBmb3IgKGNvbnN0IFtrLCB2XSBvZiBleHByLmZpZWxkcykge1xuICAgICAgICBvdXRba10gPSBldmFsSW5wdXRFeHByKHYsIHBheWxvYWQpXG4gICAgICB9XG4gICAgICByZXR1cm4gb3V0XG4gICAgfVxuICAgIGNhc2UgJ21lcmdlJzoge1xuICAgICAgY29uc3Qgb3V0OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHt9XG4gICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgZXhwci5pdGVtcykge1xuICAgICAgICBjb25zdCB2YWx1ZSA9IGV2YWxJbnB1dEV4cHIoaXRlbSwgcGF5bG9hZClcbiAgICAgICAgaWYgKGlzUGxhaW5SZWNvcmQodmFsdWUpKSB7XG4gICAgICAgICAgZm9yIChjb25zdCBbaywgdl0gb2YgT2JqZWN0LmVudHJpZXModmFsdWUpKSB7XG4gICAgICAgICAgICBvdXRba10gPSB2XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gb3V0XG4gICAgfVxuICB9XG59XG4iLCAiaW1wb3J0IHsgZm52MWEzMiwgc3RhYmxlU3RyaW5naWZ5IH0gZnJvbSAnLi4vZGlnZXN0LmpzJ1xuaW1wb3J0IHsgaXNKc29uVmFsdWUsIHByb2plY3RKc29uVmFsdWUsIHR5cGUgSnNvblZhbHVlIH0gZnJvbSAnLi4vb2JzZXJ2YWJpbGl0eS9qc29uVmFsdWUuanMnXG5pbXBvcnQgeyBtYWtlV29ya2Zsb3dFcnJvciB9IGZyb20gJy4vZXJyb3JzLmpzJ1xuaW1wb3J0IHR5cGUge1xuICBJbnB1dEV4cHJWMSxcbiAgU3RlcEtleSxcbiAgV29ya2Zsb3dEZWZWMSxcbiAgV29ya2Zsb3dTdGVwVjEsXG4gIFdvcmtmbG93U3RhdGljSXJWMSxcbiAgV29ya2Zsb3dTdGF0aWNOb2RlLFxuICBXb3JrZmxvd1N0YXRpY1N0ZXAsXG4gIFdvcmtmbG93VHJpZ2dlclYxLFxuICBXb3JrZmxvd1N0YWJsZUlkLFxuICBXb3JrZmxvd05vZGVJZCxcbiAgV29ya2Zsb3dFZGdlLFxuICBXb3JrZmxvd0VkZ2VLaW5kLFxufSBmcm9tICcuL21vZGVsLmpzJ1xuaW1wb3J0IHsgY29tcGlsZUlucHV0RXhwciwgdHlwZSBDb21waWxlZElucHV0RXhwciB9IGZyb20gJy4vaW5wdXRFeHByLmpzJ1xuXG5jb25zdCBpc1JlY29yZCA9ICh2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0+XG4gIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgdmFsdWUgIT09IG51bGwgJiYgIUFycmF5LmlzQXJyYXkodmFsdWUpXG5cbmNvbnN0IGFzTm9uRW1wdHlTdHJpbmcgPSAodmFsdWU6IHVua25vd24pOiBzdHJpbmcgfCB1bmRlZmluZWQgPT5cbiAgdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyAmJiB2YWx1ZS50cmltKCkubGVuZ3RoID4gMCA/IHZhbHVlLnRyaW0oKSA6IHVuZGVmaW5lZFxuXG5jb25zdCBhc05vbk5lZ0ludCA9ICh2YWx1ZTogdW5rbm93bik6IG51bWJlciB8IHVuZGVmaW5lZCA9PiB7XG4gIGlmICh0eXBlb2YgdmFsdWUgIT09ICdudW1iZXInIHx8ICFOdW1iZXIuaXNGaW5pdGUodmFsdWUpKSByZXR1cm4gdW5kZWZpbmVkXG4gIGNvbnN0IG4gPSBNYXRoLmZsb29yKHZhbHVlKVxuICByZXR1cm4gbiA+PSAwID8gbiA6IHVuZGVmaW5lZFxufVxuXG5jb25zdCBhc1Bvc0ludCA9ICh2YWx1ZTogdW5rbm93bik6IG51bWJlciB8IHVuZGVmaW5lZCA9PiB7XG4gIGlmICh0eXBlb2YgdmFsdWUgIT09ICdudW1iZXInIHx8ICFOdW1iZXIuaXNGaW5pdGUodmFsdWUpKSByZXR1cm4gdW5kZWZpbmVkXG4gIGNvbnN0IG4gPSBNYXRoLmZsb29yKHZhbHVlKVxuICByZXR1cm4gbiA+IDAgPyBuIDogdW5kZWZpbmVkXG59XG5cbmV4cG9ydCBjb25zdCBub3JtYWxpemVXb3JrZmxvd0RlZlYxID0gKGlucHV0OiBXb3JrZmxvd0RlZlYxKTogV29ya2Zsb3dEZWZWMSA9PiB7XG4gIC8vIEZpbGwgdHJpdmlhbCBkZWZhdWx0cyAoY2Fub25pY2FsIHNoYXBlKTpcbiAgLy8gLSBjYWxsLm9uU3VjY2Vzcy9vbkZhaWx1cmUgbXVzdCBiZSBleHBsaWNpdCBhcnJheXMuXG4gIC8vIC0gVGhlIG5vcm1hbGl6YXRpb24gbXVzdCBiZSBkZWVwOiBuZXN0ZWQgY2FsbCBzdGVwcyBtYXkgY29tZSBmcm9tIGRlZi1saWtlIGlucHV0cyBhbmQgbWlzcyB0aGUgYXJyYXlzLlxuICBjb25zdCBub3JtYWxpemVTdGVwID0gKHN0ZXA6IFdvcmtmbG93U3RlcFYxKTogV29ya2Zsb3dTdGVwVjEgPT4ge1xuICAgIGlmICghaXNSZWNvcmQoc3RlcCkpIHJldHVybiBzdGVwXG4gICAgaWYgKHN0ZXAua2luZCAhPT0gJ2NhbGwnKSByZXR1cm4gc3RlcFxuXG4gICAgY29uc3QgcmF3ID0gc3RlcCBhcyB1bmtub3duIGFzIHsgcmVhZG9ubHkgb25TdWNjZXNzPzogdW5rbm93bjsgcmVhZG9ubHkgb25GYWlsdXJlPzogdW5rbm93biB9XG4gICAgY29uc3Qgb25TdWNjZXNzUmF3ID0gQXJyYXkuaXNBcnJheShyYXcub25TdWNjZXNzKSA/IChyYXcub25TdWNjZXNzIGFzIFJlYWRvbmx5QXJyYXk8V29ya2Zsb3dTdGVwVjE+KSA6IFtdXG4gICAgY29uc3Qgb25GYWlsdXJlUmF3ID0gQXJyYXkuaXNBcnJheShyYXcub25GYWlsdXJlKSA/IChyYXcub25GYWlsdXJlIGFzIFJlYWRvbmx5QXJyYXk8V29ya2Zsb3dTdGVwVjE+KSA6IFtdXG5cbiAgICByZXR1cm4ge1xuICAgICAgLi4uc3RlcCxcbiAgICAgIG9uU3VjY2Vzczogb25TdWNjZXNzUmF3Lm1hcChub3JtYWxpemVTdGVwKSxcbiAgICAgIG9uRmFpbHVyZTogb25GYWlsdXJlUmF3Lm1hcChub3JtYWxpemVTdGVwKSxcbiAgICB9XG4gIH1cblxuICBjb25zdCBub3JtYWxpemVTdGVwcyA9IChzdGVwczogUmVhZG9ubHlBcnJheTxXb3JrZmxvd1N0ZXBWMT4pOiBSZWFkb25seUFycmF5PFdvcmtmbG93U3RlcFYxPiA9PiBzdGVwcy5tYXAobm9ybWFsaXplU3RlcClcblxuICByZXR1cm4ge1xuICAgIC4uLmlucHV0LFxuICAgIHN0ZXBzOiBub3JtYWxpemVTdGVwcyhpbnB1dC5zdGVwcyksXG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHZhbGlkYXRlV29ya2Zsb3dEZWZWMShkZWY6IHVua25vd24sIG9wdGlvbnM/OiB7IHJlYWRvbmx5IG1vZHVsZUlkPzogc3RyaW5nIH0pOiBhc3NlcnRzIGRlZiBpcyBXb3JrZmxvd0RlZlYxIHtcbiAgaWYgKCFpc1JlY29yZChkZWYpKSB7XG4gICAgdGhyb3cgbWFrZVdvcmtmbG93RXJyb3Ioe1xuICAgICAgY29kZTogJ1dPUktGTE9XX0lOVkFMSURfREVGJyxcbiAgICAgIG1lc3NhZ2U6ICdXb3JrZmxvd0RlZiBtdXN0IGJlIGFuIG9iamVjdC4nLFxuICAgICAgZGV0YWlsOiB7IGRlZiB9LFxuICAgIH0pXG4gIH1cblxuICBpZiAoZGVmLmFzdFZlcnNpb24gIT09IDEpIHtcbiAgICB0aHJvdyBtYWtlV29ya2Zsb3dFcnJvcih7XG4gICAgICBjb2RlOiAnV09SS0ZMT1dfVU5TVVBQT1JURURfVkVSU0lPTicsXG4gICAgICBtZXNzYWdlOiAnVW5zdXBwb3J0ZWQgd29ya2Zsb3cgYXN0VmVyc2lvbi4nLFxuICAgICAgZGV0YWlsOiB7IGFzdFZlcnNpb246IGRlZi5hc3RWZXJzaW9uIH0sXG4gICAgfSlcbiAgfVxuXG4gIGlmICghYXNOb25FbXB0eVN0cmluZyhkZWYubG9jYWxJZCkpIHtcbiAgICB0aHJvdyBtYWtlV29ya2Zsb3dFcnJvcih7XG4gICAgICBjb2RlOiAnV09SS0ZMT1dfSU5WQUxJRF9ERUYnLFxuICAgICAgbWVzc2FnZTogJ1dvcmtmbG93RGVmLmxvY2FsSWQgbXVzdCBiZSBhIG5vbi1lbXB0eSBzdHJpbmcuJyxcbiAgICAgIGRldGFpbDogeyBsb2NhbElkOiBkZWYubG9jYWxJZCB9LFxuICAgIH0pXG4gIH1cblxuICBjb25zdCB0cmlnZ2VyID0gZGVmLnRyaWdnZXJcbiAgaWYgKCFpc1JlY29yZCh0cmlnZ2VyKSkge1xuICAgIHRocm93IG1ha2VXb3JrZmxvd0Vycm9yKHtcbiAgICAgIGNvZGU6ICdXT1JLRkxPV19JTlZBTElEX1RSSUdHRVInLFxuICAgICAgbWVzc2FnZTogJ1dvcmtmbG93IHRyaWdnZXIgbXVzdCBiZSBhbiBvYmplY3QuJyxcbiAgICAgIGRldGFpbDogeyB0cmlnZ2VyIH0sXG4gICAgfSlcbiAgfVxuICBpZiAodHJpZ2dlci5raW5kID09PSAnYWN0aW9uJykge1xuICAgIGlmICghYXNOb25FbXB0eVN0cmluZyh0cmlnZ2VyLmFjdGlvblRhZykpIHtcbiAgICAgIHRocm93IG1ha2VXb3JrZmxvd0Vycm9yKHtcbiAgICAgICAgY29kZTogJ1dPUktGTE9XX0lOVkFMSURfVFJJR0dFUicsXG4gICAgICAgIG1lc3NhZ2U6ICdXb3JrZmxvdyB0cmlnZ2VyLmFjdGlvblRhZyBtdXN0IGJlIGEgbm9uLWVtcHR5IHN0cmluZy4nLFxuICAgICAgICBkZXRhaWw6IHsgdHJpZ2dlciB9LFxuICAgICAgfSlcbiAgICB9XG4gIH0gZWxzZSBpZiAodHJpZ2dlci5raW5kID09PSAnbGlmZWN5Y2xlJykge1xuICAgIGNvbnN0IHBoYXNlID0gdHJpZ2dlci5waGFzZVxuICAgIGlmIChwaGFzZSAhPT0gJ29uU3RhcnQnICYmIHBoYXNlICE9PSAnb25Jbml0Jykge1xuICAgICAgdGhyb3cgbWFrZVdvcmtmbG93RXJyb3Ioe1xuICAgICAgICBjb2RlOiAnV09SS0ZMT1dfSU5WQUxJRF9UUklHR0VSJyxcbiAgICAgICAgbWVzc2FnZTogJ1dvcmtmbG93IHRyaWdnZXIucGhhc2UgbXVzdCBiZSBcIm9uU3RhcnRcIiBvciBcIm9uSW5pdFwiLicsXG4gICAgICAgIGRldGFpbDogeyB0cmlnZ2VyIH0sXG4gICAgICB9KVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICB0aHJvdyBtYWtlV29ya2Zsb3dFcnJvcih7XG4gICAgICBjb2RlOiAnV09SS0ZMT1dfSU5WQUxJRF9UUklHR0VSJyxcbiAgICAgIG1lc3NhZ2U6ICdXb3JrZmxvdyB0cmlnZ2VyLmtpbmQgbXVzdCBiZSBcImFjdGlvblwiIG9yIFwibGlmZWN5Y2xlXCIuJyxcbiAgICAgIGRldGFpbDogeyB0cmlnZ2VyIH0sXG4gICAgfSlcbiAgfVxuXG4gIGlmICghQXJyYXkuaXNBcnJheShkZWYuc3RlcHMpKSB7XG4gICAgdGhyb3cgbWFrZVdvcmtmbG93RXJyb3Ioe1xuICAgICAgY29kZTogJ1dPUktGTE9XX0lOVkFMSURfREVGJyxcbiAgICAgIG1lc3NhZ2U6ICdXb3JrZmxvd0RlZi5zdGVwcyBtdXN0IGJlIGFuIGFycmF5LicsXG4gICAgICBkZXRhaWw6IHsgc3RlcHM6IGRlZi5zdGVwcyB9LFxuICAgIH0pXG4gIH1cblxuICBjb25zdCBzZWVuS2V5cyA9IG5ldyBTZXQ8c3RyaW5nPigpXG4gIGNvbnN0IHZpc2l0ID0gKHN0ZXA6IHVua25vd24sIGZyYWdtZW50SWQ/OiBzdHJpbmcpOiB2b2lkID0+IHtcbiAgICBpZiAoIWlzUmVjb3JkKHN0ZXApKSB7XG4gICAgICB0aHJvdyBtYWtlV29ya2Zsb3dFcnJvcih7XG4gICAgICAgIGNvZGU6ICdXT1JLRkxPV19JTlZBTElEX1NURVAnLFxuICAgICAgICBtZXNzYWdlOiAnV29ya2Zsb3cgc3RlcCBtdXN0IGJlIGFuIG9iamVjdC4nLFxuICAgICAgICBkZXRhaWw6IHsgc3RlcCB9LFxuICAgICAgICBzb3VyY2U6IGZyYWdtZW50SWQgPyB7IGZyYWdtZW50SWQgfSA6IHVuZGVmaW5lZCxcbiAgICAgIH0pXG4gICAgfVxuXG4gICAgY29uc3Qga2V5ID0gYXNOb25FbXB0eVN0cmluZyhzdGVwLmtleSlcbiAgICBpZiAoIWtleSkge1xuICAgICAgdGhyb3cgbWFrZVdvcmtmbG93RXJyb3Ioe1xuICAgICAgICBjb2RlOiAnV09SS0ZMT1dfSU5WQUxJRF9TVEVQJyxcbiAgICAgICAgbWVzc2FnZTogJ1dvcmtmbG93IHN0ZXAua2V5IG11c3QgYmUgYSBub24tZW1wdHkgc3RyaW5nLicsXG4gICAgICAgIGRldGFpbDogeyBzdGVwS2V5OiBzdGVwLmtleSwga2luZDogc3RlcC5raW5kIH0sXG4gICAgICAgIHNvdXJjZTogZnJhZ21lbnRJZCA/IHsgZnJhZ21lbnRJZCB9IDogdW5kZWZpbmVkLFxuICAgICAgfSlcbiAgICB9XG5cbiAgICBpZiAoc2VlbktleXMuaGFzKGtleSkpIHtcbiAgICAgIHRocm93IG1ha2VXb3JrZmxvd0Vycm9yKHtcbiAgICAgICAgY29kZTogJ1dPUktGTE9XX0RVUExJQ0FURV9TVEVQX0tFWScsXG4gICAgICAgIG1lc3NhZ2U6IGBEdXBsaWNhdGUgc3RlcEtleSBcIiR7a2V5fVwiIGRldGVjdGVkLmAsXG4gICAgICAgIGRldGFpbDogeyBkdXBsaWNhdGVLZXk6IGtleSB9LFxuICAgICAgICBzb3VyY2U6IHsgc3RlcEtleToga2V5LCAuLi4oZnJhZ21lbnRJZCA/IHsgZnJhZ21lbnRJZCB9IDogbnVsbCkgfSxcbiAgICAgIH0pXG4gICAgfVxuICAgIHNlZW5LZXlzLmFkZChrZXkpXG5cbiAgICBpZiAoc3RlcC5raW5kID09PSAnZGlzcGF0Y2gnKSB7XG4gICAgICBpZiAoIWFzTm9uRW1wdHlTdHJpbmcoc3RlcC5hY3Rpb25UYWcpKSB7XG4gICAgICAgIHRocm93IG1ha2VXb3JrZmxvd0Vycm9yKHtcbiAgICAgICAgICBjb2RlOiAnV09SS0ZMT1dfSU5WQUxJRF9TVEVQJyxcbiAgICAgICAgICBtZXNzYWdlOiAnZGlzcGF0Y2guYWN0aW9uVGFnIG11c3QgYmUgYSBub24tZW1wdHkgc3RyaW5nLicsXG4gICAgICAgICAgc291cmNlOiB7IHN0ZXBLZXk6IGtleSwgLi4uKGZyYWdtZW50SWQgPyB7IGZyYWdtZW50SWQgfSA6IG51bGwpIH0sXG4gICAgICAgICAgZGV0YWlsOiB7IGFjdGlvblRhZzogc3RlcC5hY3Rpb25UYWcgfSxcbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICAgIGNvbnN0IHBheWxvYWQgPSBzdGVwLnBheWxvYWRcbiAgICAgIGlmIChwYXlsb2FkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdmFsaWRhdGVJbnB1dEV4cHIocGF5bG9hZCwgeyBzdGVwS2V5OiBrZXkgfSlcbiAgICAgIH1cbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGlmIChzdGVwLmtpbmQgPT09ICdkZWxheScpIHtcbiAgICAgIGNvbnN0IG1zID0gYXNOb25OZWdJbnQoc3RlcC5tcylcbiAgICAgIGlmIChtcyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRocm93IG1ha2VXb3JrZmxvd0Vycm9yKHtcbiAgICAgICAgICBjb2RlOiAnV09SS0ZMT1dfSU5WQUxJRF9TVEVQJyxcbiAgICAgICAgICBtZXNzYWdlOiAnZGVsYXkubXMgbXVzdCBiZSBhIG5vbi1uZWdhdGl2ZSBpbnRlZ2VyLicsXG4gICAgICAgICAgc291cmNlOiB7IHN0ZXBLZXk6IGtleSwgLi4uKGZyYWdtZW50SWQgPyB7IGZyYWdtZW50SWQgfSA6IG51bGwpIH0sXG4gICAgICAgICAgZGV0YWlsOiB7IG1zOiBzdGVwLm1zIH0sXG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBpZiAoc3RlcC5raW5kID09PSAnY2FsbCcpIHtcbiAgICAgIGlmICghYXNOb25FbXB0eVN0cmluZyhzdGVwLnNlcnZpY2VJZCkpIHtcbiAgICAgICAgdGhyb3cgbWFrZVdvcmtmbG93RXJyb3Ioe1xuICAgICAgICAgIGNvZGU6ICdXT1JLRkxPV19JTlZBTElEX1NFUlZJQ0VfSUQnLFxuICAgICAgICAgIG1lc3NhZ2U6ICdjYWxsLnNlcnZpY2VJZCBtdXN0IGJlIGEgbm9uLWVtcHR5IHN0cmluZy4nLFxuICAgICAgICAgIHNvdXJjZTogeyBzdGVwS2V5OiBrZXksIC4uLihmcmFnbWVudElkID8geyBmcmFnbWVudElkIH0gOiBudWxsKSB9LFxuICAgICAgICAgIGRldGFpbDogeyBzZXJ2aWNlSWQ6IHN0ZXAuc2VydmljZUlkIH0sXG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgICBjb25zdCBpbnB1dEV4cHIgPSBzdGVwLmlucHV0XG4gICAgICBpZiAoaW5wdXRFeHByICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdmFsaWRhdGVJbnB1dEV4cHIoaW5wdXRFeHByLCB7IHN0ZXBLZXk6IGtleSB9KVxuICAgICAgfVxuICAgICAgY29uc3QgdGltZW91dE1zUmF3ID0gc3RlcC50aW1lb3V0TXNcbiAgICAgIGlmICh0aW1lb3V0TXNSYXcgIT09IHVuZGVmaW5lZCAmJiBhc1Bvc0ludCh0aW1lb3V0TXNSYXcpID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhyb3cgbWFrZVdvcmtmbG93RXJyb3Ioe1xuICAgICAgICAgIGNvZGU6ICdXT1JLRkxPV19JTlZBTElEX1NURVAnLFxuICAgICAgICAgIG1lc3NhZ2U6ICdjYWxsLnRpbWVvdXRNcyBtdXN0IGJlIGEgcG9zaXRpdmUgaW50ZWdlciAobWlsbGlzZWNvbmRzKS4nLFxuICAgICAgICAgIHNvdXJjZTogeyBzdGVwS2V5OiBrZXksIC4uLihmcmFnbWVudElkID8geyBmcmFnbWVudElkIH0gOiBudWxsKSB9LFxuICAgICAgICAgIGRldGFpbDogeyB0aW1lb3V0TXM6IHRpbWVvdXRNc1JhdyB9LFxuICAgICAgICB9KVxuICAgICAgfVxuICAgICAgY29uc3QgcmV0cnlSYXcgPSBzdGVwLnJldHJ5XG4gICAgICBpZiAocmV0cnlSYXcgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBjb25zdCB0aW1lcyA9IGlzUmVjb3JkKHJldHJ5UmF3KSA/IGFzUG9zSW50KHJldHJ5UmF3LnRpbWVzKSA6IHVuZGVmaW5lZFxuICAgICAgICBpZiAodGltZXMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHRocm93IG1ha2VXb3JrZmxvd0Vycm9yKHtcbiAgICAgICAgICAgIGNvZGU6ICdXT1JLRkxPV19JTlZBTElEX1NURVAnLFxuICAgICAgICAgICAgbWVzc2FnZTogJ2NhbGwucmV0cnkudGltZXMgbXVzdCBiZSBhIHBvc2l0aXZlIGludGVnZXIuJyxcbiAgICAgICAgICAgIHNvdXJjZTogeyBzdGVwS2V5OiBrZXksIC4uLihmcmFnbWVudElkID8geyBmcmFnbWVudElkIH0gOiBudWxsKSB9LFxuICAgICAgICAgICAgZGV0YWlsOiB7IHJldHJ5OiByZXRyeVJhdyB9LFxuICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgY29uc3Qgb25TdWNjZXNzID0gQXJyYXkuaXNBcnJheShzdGVwLm9uU3VjY2VzcykgPyBzdGVwLm9uU3VjY2VzcyA6IFtdXG4gICAgICBjb25zdCBvbkZhaWx1cmUgPSBBcnJheS5pc0FycmF5KHN0ZXAub25GYWlsdXJlKSA/IHN0ZXAub25GYWlsdXJlIDogW11cbiAgICAgIGZvciAoY29uc3QgaW5uZXIgb2Ygb25TdWNjZXNzKSB2aXNpdChpbm5lciwgZnJhZ21lbnRJZClcbiAgICAgIGZvciAoY29uc3QgaW5uZXIgb2Ygb25GYWlsdXJlKSB2aXNpdChpbm5lciwgZnJhZ21lbnRJZClcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIHRocm93IG1ha2VXb3JrZmxvd0Vycm9yKHtcbiAgICAgIGNvZGU6ICdXT1JLRkxPV19JTlZBTElEX1NURVAnLFxuICAgICAgbWVzc2FnZTogJ1Vua25vd24gc3RlcCBraW5kLicsXG4gICAgICBzb3VyY2U6IHsgc3RlcEtleToga2V5LCAuLi4oZnJhZ21lbnRJZCA/IHsgZnJhZ21lbnRJZCB9IDogbnVsbCkgfSxcbiAgICAgIGRldGFpbDogeyBraW5kOiBzdGVwLmtpbmQgfSxcbiAgICB9KVxuICB9XG5cbiAgY29uc3Qgc291cmNlcyA9IGRlZi5zb3VyY2VzXG4gIGNvbnN0IGZyYWdtZW50QnlTdGVwS2V5ID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD4oKVxuICBpZiAoc291cmNlcyAmJiB0eXBlb2Ygc291cmNlcyA9PT0gJ29iamVjdCcpIHtcbiAgICBmb3IgKGNvbnN0IFtrLCB2XSBvZiBPYmplY3QuZW50cmllcyhzb3VyY2VzKSkge1xuICAgICAgZnJhZ21lbnRCeVN0ZXBLZXkuc2V0KGssIGlzUmVjb3JkKHYpID8gYXNOb25FbXB0eVN0cmluZyh2LmZyYWdtZW50SWQpIDogdW5kZWZpbmVkKVxuICAgIH1cbiAgfVxuXG4gIGZvciAoY29uc3Qgc3RlcCBvZiBkZWYuc3RlcHMpIHtcbiAgICBjb25zdCBrZXkgPSBpc1JlY29yZChzdGVwKSA/IGFzTm9uRW1wdHlTdHJpbmcoc3RlcC5rZXkpIDogdW5kZWZpbmVkXG4gICAgY29uc3QgZnJhZ21lbnRJZCA9IGtleSA/IGZyYWdtZW50QnlTdGVwS2V5LmdldChrZXkpIDogdW5kZWZpbmVkXG4gICAgdmlzaXQoc3RlcCwgZnJhZ21lbnRJZClcbiAgfVxuXG4gIC8vIG1ldGEuZ2VuZXJhdG9yIG11c3Qgc3RheSBKU09OLW9ubHkuXG4gIGNvbnN0IGdlbmVyYXRvciA9IGlzUmVjb3JkKGRlZi5tZXRhKSA/IGRlZi5tZXRhLmdlbmVyYXRvciA6IHVuZGVmaW5lZFxuICBpZiAoZ2VuZXJhdG9yICE9PSB1bmRlZmluZWQgJiYgIWlzSnNvblZhbHVlKGdlbmVyYXRvcikpIHtcbiAgICB0aHJvdyBtYWtlV29ya2Zsb3dFcnJvcih7XG4gICAgICBjb2RlOiAnV09SS0ZMT1dfSU5WQUxJRF9ERUYnLFxuICAgICAgbWVzc2FnZTogJ1dvcmtmbG93RGVmLm1ldGEuZ2VuZXJhdG9yIG11c3QgYmUgSlNPTi1zZXJpYWxpemFibGUuJyxcbiAgICAgIGRldGFpbDogeyBnZW5lcmF0b3IgfSxcbiAgICB9KVxuICB9XG5cbiAgLy8gcG9saWN5IHZhbGlkYXRpb24gKG1pbmltYWwpXG4gIGNvbnN0IHBvbGljeSA9IGlzUmVjb3JkKGRlZi5wb2xpY3kpID8gZGVmLnBvbGljeSA6IHVuZGVmaW5lZFxuICBpZiAocG9saWN5KSB7XG4gICAgY29uc3QgY29uY3VycmVuY3kgPSBwb2xpY3kuY29uY3VycmVuY3lcbiAgICBpZiAoY29uY3VycmVuY3kgIT09IHVuZGVmaW5lZCAmJiBjb25jdXJyZW5jeSAhPT0gJ2xhdGVzdCcgJiYgY29uY3VycmVuY3kgIT09ICdleGhhdXN0JyAmJiBjb25jdXJyZW5jeSAhPT0gJ3BhcmFsbGVsJykge1xuICAgICAgdGhyb3cgbWFrZVdvcmtmbG93RXJyb3Ioe1xuICAgICAgICBjb2RlOiAnV09SS0ZMT1dfSU5WQUxJRF9ERUYnLFxuICAgICAgICBtZXNzYWdlOiAncG9saWN5LmNvbmN1cnJlbmN5IG11c3QgYmUgbGF0ZXN0fGV4aGF1c3R8cGFyYWxsZWwuJyxcbiAgICAgICAgZGV0YWlsOiB7IGNvbmN1cnJlbmN5IH0sXG4gICAgICB9KVxuICAgIH1cbiAgICBjb25zdCBwcmlvcml0eSA9IHBvbGljeS5wcmlvcml0eVxuICAgIGlmIChwcmlvcml0eSAhPT0gdW5kZWZpbmVkICYmIHByaW9yaXR5ICE9PSAndXJnZW50JyAmJiBwcmlvcml0eSAhPT0gJ25vblVyZ2VudCcpIHtcbiAgICAgIHRocm93IG1ha2VXb3JrZmxvd0Vycm9yKHtcbiAgICAgICAgY29kZTogJ1dPUktGTE9XX0lOVkFMSURfREVGJyxcbiAgICAgICAgbWVzc2FnZTogJ3BvbGljeS5wcmlvcml0eSBtdXN0IGJlIHVyZ2VudHxub25VcmdlbnQuJyxcbiAgICAgICAgZGV0YWlsOiB7IHByaW9yaXR5IH0sXG4gICAgICB9KVxuICAgIH1cbiAgfVxuXG4gIC8vIG1vZHVsZUlkIGlzIG9ubHkgdXNlZCB0byBpbXByb3ZlIGVycm9yIGNvbnRleHQ7IG5vIGFkZGl0aW9uYWwgdmFsaWRhdGlvbiBoZXJlLlxuICB2b2lkIG9wdGlvbnM/Lm1vZHVsZUlkXG59XG5cbmNvbnN0IHZhbGlkYXRlSW5wdXRFeHByID0gKGV4cHI6IHVua25vd24sIG9wdGlvbnM/OiB7IHJlYWRvbmx5IHN0ZXBLZXk/OiBzdHJpbmcgfSk6IHZvaWQgPT4ge1xuICBjb25zdCB2aXNpdCA9IChlOiB1bmtub3duKTogdm9pZCA9PiB7XG4gICAgaWYgKCFpc1JlY29yZChlKSkge1xuICAgICAgdGhyb3cgbWFrZVdvcmtmbG93RXJyb3Ioe1xuICAgICAgICBjb2RlOiAnV09SS0ZMT1dfSU5WQUxJRF9JTlBVVF9FWFBSJyxcbiAgICAgICAgbWVzc2FnZTogJ0lucHV0RXhwciBtdXN0IGJlIGFuIG9iamVjdC4nLFxuICAgICAgICBzb3VyY2U6IHsgc3RlcEtleTogb3B0aW9ucz8uc3RlcEtleSB9LFxuICAgICAgICBkZXRhaWw6IHsgZXhwcjogZSB9LFxuICAgICAgfSlcbiAgICB9XG4gICAgY29uc3Qga2luZCA9IGUua2luZFxuICAgIHN3aXRjaCAoa2luZCkge1xuICAgICAgY2FzZSAncGF5bG9hZCc6XG4gICAgICAgIHJldHVyblxuICAgICAgY2FzZSAncGF5bG9hZC5wYXRoJzoge1xuICAgICAgICBjb25zdCBwb2ludGVyID0gZS5wb2ludGVyXG4gICAgICAgIGlmICh0eXBlb2YgcG9pbnRlciAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICB0aHJvdyBtYWtlV29ya2Zsb3dFcnJvcih7XG4gICAgICAgICAgICBjb2RlOiAnV09SS0ZMT1dfSU5WQUxJRF9JTlBVVF9FWFBSJyxcbiAgICAgICAgICAgIG1lc3NhZ2U6ICdJbnB1dEV4cHIucGF5bG9hZC5wYXRoLnBvaW50ZXIgbXVzdCBiZSBhIHN0cmluZy4nLFxuICAgICAgICAgICAgc291cmNlOiB7IHN0ZXBLZXk6IG9wdGlvbnM/LnN0ZXBLZXkgfSxcbiAgICAgICAgICAgIGRldGFpbDogeyBwb2ludGVyIH0sXG4gICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgICAgICByZXR1cm5cbiAgICAgIH1cbiAgICAgIGNhc2UgJ2NvbnN0Jzoge1xuICAgICAgICBjb25zdCB2YWx1ZSA9IGUudmFsdWVcbiAgICAgICAgaWYgKCFpc0pzb25WYWx1ZSh2YWx1ZSkpIHtcbiAgICAgICAgICB0aHJvdyBtYWtlV29ya2Zsb3dFcnJvcih7XG4gICAgICAgICAgICBjb2RlOiAnV09SS0ZMT1dfSU5WQUxJRF9JTlBVVF9FWFBSJyxcbiAgICAgICAgICAgIG1lc3NhZ2U6ICdJbnB1dEV4cHIuY29uc3QudmFsdWUgbXVzdCBiZSBKU09OLXNlcmlhbGl6YWJsZS4nLFxuICAgICAgICAgICAgc291cmNlOiB7IHN0ZXBLZXk6IG9wdGlvbnM/LnN0ZXBLZXkgfSxcbiAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgICAgIHJldHVyblxuICAgICAgfVxuICAgICAgY2FzZSAnb2JqZWN0Jzoge1xuICAgICAgICBjb25zdCBmaWVsZHMgPSBlLmZpZWxkc1xuICAgICAgICBpZiAoIWlzUmVjb3JkKGZpZWxkcykpIHtcbiAgICAgICAgICB0aHJvdyBtYWtlV29ya2Zsb3dFcnJvcih7XG4gICAgICAgICAgICBjb2RlOiAnV09SS0ZMT1dfSU5WQUxJRF9JTlBVVF9FWFBSJyxcbiAgICAgICAgICAgIG1lc3NhZ2U6ICdJbnB1dEV4cHIub2JqZWN0LmZpZWxkcyBtdXN0IGJlIGEgcmVjb3JkLicsXG4gICAgICAgICAgICBzb3VyY2U6IHsgc3RlcEtleTogb3B0aW9ucz8uc3RlcEtleSB9LFxuICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICAgICAgZm9yIChjb25zdCB2IG9mIE9iamVjdC52YWx1ZXMoZmllbGRzKSkge1xuICAgICAgICAgIHZpc2l0KHYpXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG4gICAgICBjYXNlICdtZXJnZSc6IHtcbiAgICAgICAgY29uc3QgaXRlbXMgPSBlLml0ZW1zXG4gICAgICAgIGlmICghQXJyYXkuaXNBcnJheShpdGVtcykpIHtcbiAgICAgICAgICB0aHJvdyBtYWtlV29ya2Zsb3dFcnJvcih7XG4gICAgICAgICAgICBjb2RlOiAnV09SS0ZMT1dfSU5WQUxJRF9JTlBVVF9FWFBSJyxcbiAgICAgICAgICAgIG1lc3NhZ2U6ICdJbnB1dEV4cHIubWVyZ2UuaXRlbXMgbXVzdCBiZSBhbiBhcnJheS4nLFxuICAgICAgICAgICAgc291cmNlOiB7IHN0ZXBLZXk6IG9wdGlvbnM/LnN0ZXBLZXkgfSxcbiAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgICAgIGZvciAoY29uc3QgaXRlbSBvZiBpdGVtcykge1xuICAgICAgICAgIHZpc2l0KGl0ZW0pXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBtYWtlV29ya2Zsb3dFcnJvcih7XG4gICAgICAgICAgY29kZTogJ1dPUktGTE9XX0lOVkFMSURfSU5QVVRfRVhQUicsXG4gICAgICAgICAgbWVzc2FnZTogJ1Vua25vd24gSW5wdXRFeHByIGtpbmQuJyxcbiAgICAgICAgICBzb3VyY2U6IHsgc3RlcEtleTogb3B0aW9ucz8uc3RlcEtleSB9LFxuICAgICAgICAgIGRldGFpbDogeyBraW5kIH0sXG4gICAgICAgIH0pXG4gICAgfVxuICB9XG5cbiAgdmlzaXQoZXhwcilcbn1cblxuLy8gLS0tLSBTdGF0aWMgSVIgY29tcGlsYXRpb24gLS0tLVxuXG5jb25zdCBtYWtlRGlnZXN0ID0gKHByZWZpeDogc3RyaW5nLCB2YWx1ZTogdW5rbm93bik6IHN0cmluZyA9PiBgJHtwcmVmaXh9OiR7Zm52MWEzMihzdGFibGVTdHJpbmdpZnkodmFsdWUpKX1gXG5cbmNvbnN0IG1ha2VUcmlnZ2VyTm9kZUlkID0gKHByb2dyYW1JZDogc3RyaW5nKTogV29ya2Zsb3dOb2RlSWQgPT4gYHdmX3RyaWdnZXJfdjE6JHtmbnYxYTMyKHByb2dyYW1JZCl9YFxuXG5jb25zdCBtYWtlU3RlcE5vZGVJZCA9IChwcm9ncmFtSWQ6IHN0cmluZywgc3RlcEtleTogU3RlcEtleSwga2luZDogc3RyaW5nKTogV29ya2Zsb3dOb2RlSWQgPT5cbiAgYHdmX25vZGVfdjE6JHtmbnYxYTMyKGAke3Byb2dyYW1JZH1cXHUwMDAwJHtzdGVwS2V5fVxcdTAwMDAke2tpbmR9YCl9YFxuXG5jb25zdCBidWRnZXRKc29uVmFsdWUgPSAodmFsdWU6IEpzb25WYWx1ZSk6IEpzb25WYWx1ZSA9PiBwcm9qZWN0SnNvblZhbHVlKHZhbHVlKS52YWx1ZVxuXG5jb25zdCBidWRnZXRJbnB1dEV4cHIgPSAoZXhwcjogSW5wdXRFeHByVjEpOiBJbnB1dEV4cHJWMSA9PiB7XG4gIHN3aXRjaCAoZXhwci5raW5kKSB7XG4gICAgY2FzZSAncGF5bG9hZCc6XG4gICAgY2FzZSAncGF5bG9hZC5wYXRoJzpcbiAgICAgIHJldHVybiBleHByXG4gICAgY2FzZSAnY29uc3QnOiB7XG4gICAgICBjb25zdCB2YWx1ZTogdW5rbm93biA9IGV4cHIudmFsdWVcbiAgICAgIGlmICghaXNKc29uVmFsdWUodmFsdWUpKSByZXR1cm4gZXhwclxuICAgICAgcmV0dXJuIHsgLi4uZXhwciwgdmFsdWU6IGJ1ZGdldEpzb25WYWx1ZShleHByLnZhbHVlKSB9XG4gICAgfVxuICAgIGNhc2UgJ29iamVjdCc6IHtcbiAgICAgIGNvbnN0IG91dDogeyBbazogc3RyaW5nXTogSW5wdXRFeHByVjEgfSA9IHt9XG4gICAgICBmb3IgKGNvbnN0IGsgb2YgT2JqZWN0LmtleXMoZXhwci5maWVsZHMpLnNvcnQoKSkge1xuICAgICAgICBvdXRba10gPSBidWRnZXRJbnB1dEV4cHIoZXhwci5maWVsZHNba10hKVxuICAgICAgfVxuICAgICAgcmV0dXJuIHsgLi4uZXhwciwgZmllbGRzOiBvdXQgfVxuICAgIH1cbiAgICBjYXNlICdtZXJnZSc6XG4gICAgICByZXR1cm4geyAuLi5leHByLCBpdGVtczogZXhwci5pdGVtcy5tYXAoYnVkZ2V0SW5wdXRFeHByKSB9XG4gIH1cbn1cblxuY29uc3QgdG9TdGF0aWNTdGVwID0gKHN0ZXA6IFdvcmtmbG93U3RlcFYxKTogV29ya2Zsb3dTdGF0aWNTdGVwID0+IHtcbiAgc3dpdGNoIChzdGVwLmtpbmQpIHtcbiAgICBjYXNlICdkaXNwYXRjaCc6XG4gICAgICByZXR1cm4ge1xuICAgICAgICBraW5kOiAnZGlzcGF0Y2gnLFxuICAgICAgICBhY3Rpb25UYWc6IHN0ZXAuYWN0aW9uVGFnLFxuICAgICAgICAuLi4oc3RlcC5wYXlsb2FkID8geyBwYXlsb2FkOiBidWRnZXRJbnB1dEV4cHIoc3RlcC5wYXlsb2FkKSB9IDogbnVsbCksXG4gICAgICB9XG4gICAgY2FzZSAnZGVsYXknOlxuICAgICAgcmV0dXJuIHsga2luZDogJ2RlbGF5JywgbXM6IHN0ZXAubXMgfVxuICAgIGNhc2UgJ2NhbGwnOiB7XG4gICAgICBjb25zdCBwb2xpY3kgPVxuICAgICAgICBzdGVwLnRpbWVvdXRNcyAhPT0gdW5kZWZpbmVkIHx8IHN0ZXAucmV0cnkgIT09IHVuZGVmaW5lZFxuICAgICAgICAgID8ge1xuICAgICAgICAgICAgICAuLi4oc3RlcC50aW1lb3V0TXMgIT09IHVuZGVmaW5lZCA/IHsgdGltZW91dE1zOiBzdGVwLnRpbWVvdXRNcyB9IDogbnVsbCksXG4gICAgICAgICAgICAgIC4uLihzdGVwLnJldHJ5ICE9PSB1bmRlZmluZWQgPyB7IHJldHJ5OiB7IHRpbWVzOiBzdGVwLnJldHJ5LnRpbWVzIH0gfSA6IG51bGwpLFxuICAgICAgICAgICAgfVxuICAgICAgICAgIDogdW5kZWZpbmVkXG4gICAgICByZXR1cm4ge1xuICAgICAgICBraW5kOiAnY2FsbCcsXG4gICAgICAgIHNlcnZpY2VJZDogc3RlcC5zZXJ2aWNlSWQsXG4gICAgICAgIC4uLihzdGVwLmlucHV0ID8geyBpbnB1dDogYnVkZ2V0SW5wdXRFeHByKHN0ZXAuaW5wdXQpIH0gOiBudWxsKSxcbiAgICAgICAgLi4uKHBvbGljeSA/IHsgcG9saWN5IH0gOiBudWxsKSxcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IGNvbXBpbGVXb3JrZmxvd1N0YXRpY0lyVjEgPSAoYXJnczoge1xuICByZWFkb25seSBtb2R1bGVJZDogc3RyaW5nXG4gIHJlYWRvbmx5IGRlZjogV29ya2Zsb3dEZWZWMVxufSk6IFdvcmtmbG93U3RhdGljSXJWMSA9PiB7XG4gIGNvbnN0IG5vcm1hbGl6ZWQgPSBub3JtYWxpemVXb3JrZmxvd0RlZlYxKGFyZ3MuZGVmKVxuICB2YWxpZGF0ZVdvcmtmbG93RGVmVjEobm9ybWFsaXplZCwgeyBtb2R1bGVJZDogYXJncy5tb2R1bGVJZCB9KVxuXG4gIGNvbnN0IHByb2dyYW1JZDogV29ya2Zsb3dTdGFibGVJZCA9IGAke2FyZ3MubW9kdWxlSWR9LiR7bm9ybWFsaXplZC5sb2NhbElkfWBcbiAgY29uc3QgdHJpZ2dlck5vZGVJZCA9IG1ha2VUcmlnZ2VyTm9kZUlkKHByb2dyYW1JZClcblxuICBjb25zdCBmcmFnbWVudEJ5U3RlcEtleSA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmcgfCB1bmRlZmluZWQ+KClcbiAgaWYgKG5vcm1hbGl6ZWQuc291cmNlcyAmJiB0eXBlb2Ygbm9ybWFsaXplZC5zb3VyY2VzID09PSAnb2JqZWN0Jykge1xuICAgIGZvciAoY29uc3QgW2ssIHZdIG9mIE9iamVjdC5lbnRyaWVzKG5vcm1hbGl6ZWQuc291cmNlcykpIHtcbiAgICAgIGZyYWdtZW50QnlTdGVwS2V5LnNldChrLCBpc1JlY29yZCh2KSA/IGFzTm9uRW1wdHlTdHJpbmcodi5mcmFnbWVudElkKSA6IHVuZGVmaW5lZClcbiAgICB9XG4gIH1cblxuICBjb25zdCBub2Rlc0J5S2V5ID0gbmV3IE1hcDxzdHJpbmcsIFdvcmtmbG93Tm9kZUlkPigpXG5cbiAgY29uc3QgY29sbGVjdE5vZGVzID0gKHN0ZXBzOiBSZWFkb25seUFycmF5PFdvcmtmbG93U3RlcFYxPikgPT4ge1xuICAgIGZvciAoY29uc3Qgc3RlcCBvZiBzdGVwcykge1xuICAgICAgY29uc3QgaWQgPSBtYWtlU3RlcE5vZGVJZChwcm9ncmFtSWQsIHN0ZXAua2V5LCBzdGVwLmtpbmQpXG4gICAgICBub2Rlc0J5S2V5LnNldChzdGVwLmtleSwgaWQpXG4gICAgICBpZiAoc3RlcC5raW5kID09PSAnY2FsbCcpIHtcbiAgICAgICAgY29sbGVjdE5vZGVzKHN0ZXAub25TdWNjZXNzKVxuICAgICAgICBjb2xsZWN0Tm9kZXMoc3RlcC5vbkZhaWx1cmUpXG4gICAgICB9XG4gICAgfVxuICB9XG4gIGNvbGxlY3ROb2Rlcyhub3JtYWxpemVkLnN0ZXBzKVxuXG4gIGNvbnN0IG5vZGVzOiBXb3JrZmxvd1N0YXRpY05vZGVbXSA9IFtcbiAgICB7XG4gICAgICBpZDogdHJpZ2dlck5vZGVJZCxcbiAgICAgIGtpbmQ6ICd0cmlnZ2VyJyxcbiAgICAgIHRyaWdnZXI6IG5vcm1hbGl6ZWQudHJpZ2dlcixcbiAgICB9LFxuICBdXG5cbiAgY29uc3QgYWRkU3RlcE5vZGVzID0gKHN0ZXBzOiBSZWFkb25seUFycmF5PFdvcmtmbG93U3RlcFYxPikgPT4ge1xuICAgIGZvciAoY29uc3Qgc3RlcCBvZiBzdGVwcykge1xuICAgICAgY29uc3QgaWQgPSBub2Rlc0J5S2V5LmdldChzdGVwLmtleSlcbiAgICAgIGlmICghaWQpIGNvbnRpbnVlXG4gICAgICBjb25zdCBmcmFnbWVudElkID0gZnJhZ21lbnRCeVN0ZXBLZXkuZ2V0KHN0ZXAua2V5KVxuICAgICAgbm9kZXMucHVzaCh7XG4gICAgICAgIGlkLFxuICAgICAgICBraW5kOiAnc3RlcCcsXG4gICAgICAgIHN0ZXA6IHRvU3RhdGljU3RlcChzdGVwKSxcbiAgICAgICAgc291cmNlOiB7XG4gICAgICAgICAgc3RlcEtleTogc3RlcC5rZXksXG4gICAgICAgICAgLi4uKGZyYWdtZW50SWQgPyB7IGZyYWdtZW50SWQgfSA6IG51bGwpLFxuICAgICAgICB9LFxuICAgICAgfSlcbiAgICAgIGlmIChzdGVwLmtpbmQgPT09ICdjYWxsJykge1xuICAgICAgICBhZGRTdGVwTm9kZXMoc3RlcC5vblN1Y2Nlc3MpXG4gICAgICAgIGFkZFN0ZXBOb2RlcyhzdGVwLm9uRmFpbHVyZSlcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgYWRkU3RlcE5vZGVzKG5vcm1hbGl6ZWQuc3RlcHMpXG5cbiAgY29uc3QgZWRnZXM6IFdvcmtmbG93RWRnZVtdID0gW11cblxuICBjb25zdCBwdXNoRWRnZSA9IChmcm9tOiBXb3JrZmxvd05vZGVJZCwgdG86IFdvcmtmbG93Tm9kZUlkLCBraW5kOiBXb3JrZmxvd0VkZ2VLaW5kKTogdm9pZCA9PiB7XG4gICAgZWRnZXMucHVzaCh7IGZyb20sIHRvLCBraW5kIH0pXG4gIH1cblxuICBjb25zdCBjb21waWxlQmxvY2sgPSAoYXJnczoge1xuICAgIHJlYWRvbmx5IHN0ZXBzOiBSZWFkb25seUFycmF5PFdvcmtmbG93U3RlcFYxPlxuICAgIHJlYWRvbmx5IGVudHJ5RnJvbTogUmVhZG9ubHlBcnJheTxXb3JrZmxvd05vZGVJZD5cbiAgICByZWFkb25seSBlbnRyeUtpbmQ6IFdvcmtmbG93RWRnZUtpbmRcbiAgICByZWFkb25seSBjb250aW51YXRpb24/OiBXb3JrZmxvd05vZGVJZFxuICB9KTogdm9pZCA9PiB7XG4gICAgaWYgKGFyZ3Muc3RlcHMubGVuZ3RoID09PSAwKSB7XG4gICAgICBpZiAoYXJncy5jb250aW51YXRpb24pIHtcbiAgICAgICAgZm9yIChjb25zdCBmcm9tIG9mIGFyZ3MuZW50cnlGcm9tKSB7XG4gICAgICAgICAgcHVzaEVkZ2UoZnJvbSwgYXJncy5jb250aW51YXRpb24sIGFyZ3MuZW50cnlLaW5kKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBjb25zdCBmaXJzdCA9IGFyZ3Muc3RlcHNbMF0hXG4gICAgY29uc3QgZmlyc3RJZCA9IG5vZGVzQnlLZXkuZ2V0KGZpcnN0LmtleSlcbiAgICBpZiAoIWZpcnN0SWQpIHtcbiAgICAgIHRocm93IG1ha2VXb3JrZmxvd0Vycm9yKHtcbiAgICAgICAgY29kZTogJ1dPUktGTE9XX0lOVkFMSURfU1RFUCcsXG4gICAgICAgIG1lc3NhZ2U6ICdJbnRlcm5hbCBlcnJvcjogbWlzc2luZyBub2RlIGlkIGZvciBzdGVwS2V5LicsXG4gICAgICAgIHByb2dyYW1JZCxcbiAgICAgICAgc291cmNlOiB7IHN0ZXBLZXk6IGZpcnN0LmtleSB9LFxuICAgICAgfSlcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IGZyb20gb2YgYXJncy5lbnRyeUZyb20pIHtcbiAgICAgIHB1c2hFZGdlKGZyb20sIGZpcnN0SWQsIGFyZ3MuZW50cnlLaW5kKVxuICAgIH1cblxuICAgIGNvbnN0IGNvbXBpbGVTdGVwQW5kVGFpbCA9IChzdGVwOiBXb3JrZmxvd1N0ZXBWMSwgdGFpbDogUmVhZG9ubHlBcnJheTxXb3JrZmxvd1N0ZXBWMT4sIGNvbnRpbnVhdGlvbj86IFdvcmtmbG93Tm9kZUlkKSA9PiB7XG4gICAgICBjb25zdCBzdGVwSWQgPSBub2Rlc0J5S2V5LmdldChzdGVwLmtleSlcbiAgICAgIGlmICghc3RlcElkKSByZXR1cm5cblxuICAgICAgaWYgKHN0ZXAua2luZCAhPT0gJ2NhbGwnKSB7XG4gICAgICAgIGNvbXBpbGVCbG9jayh7IHN0ZXBzOiB0YWlsLCBlbnRyeUZyb206IFtzdGVwSWRdLCBlbnRyeUtpbmQ6ICduZXh0JywgY29udGludWF0aW9uIH0pXG4gICAgICAgIHJldHVyblxuICAgICAgfVxuXG4gICAgICBjb25zdCBjb250ID0gdGFpbC5sZW5ndGggPiAwID8gbm9kZXNCeUtleS5nZXQodGFpbFswXSEua2V5KSA6IGNvbnRpbnVhdGlvblxuXG4gICAgICBjb21waWxlQmxvY2soe1xuICAgICAgICBzdGVwczogc3RlcC5vblN1Y2Nlc3MsXG4gICAgICAgIGVudHJ5RnJvbTogW3N0ZXBJZF0sXG4gICAgICAgIGVudHJ5S2luZDogJ3N1Y2Nlc3MnLFxuICAgICAgICBjb250aW51YXRpb246IGNvbnQsXG4gICAgICB9KVxuICAgICAgY29tcGlsZUJsb2NrKHtcbiAgICAgICAgc3RlcHM6IHN0ZXAub25GYWlsdXJlLFxuICAgICAgICBlbnRyeUZyb206IFtzdGVwSWRdLFxuICAgICAgICBlbnRyeUtpbmQ6ICdmYWlsdXJlJyxcbiAgICAgICAgY29udGludWF0aW9uOiBjb250LFxuICAgICAgfSlcblxuICAgICAgY29tcGlsZUJsb2NrKHsgc3RlcHM6IHRhaWwsIGVudHJ5RnJvbTogW10sIGVudHJ5S2luZDogJ25leHQnLCBjb250aW51YXRpb24gfSlcbiAgICB9XG5cbiAgICBjb21waWxlU3RlcEFuZFRhaWwoZmlyc3QsIGFyZ3Muc3RlcHMuc2xpY2UoMSksIGFyZ3MuY29udGludWF0aW9uKVxuICB9XG5cbiAgY29tcGlsZUJsb2NrKHsgc3RlcHM6IG5vcm1hbGl6ZWQuc3RlcHMsIGVudHJ5RnJvbTogW3RyaWdnZXJOb2RlSWRdLCBlbnRyeUtpbmQ6ICduZXh0JywgY29udGludWF0aW9uOiB1bmRlZmluZWQgfSlcblxuICAvLyBTdGFibGUgb3JkZXJpbmcgKGZvciBkaWZmL2RpZ2VzdCkuXG4gIG5vZGVzLnNvcnQoKGEsIGIpID0+IChhLmlkIDwgYi5pZCA/IC0xIDogYS5pZCA+IGIuaWQgPyAxIDogMCkpXG4gIGVkZ2VzLnNvcnQoKGEsIGIpID0+IHtcbiAgICBpZiAoYS5mcm9tICE9PSBiLmZyb20pIHJldHVybiBhLmZyb20gPCBiLmZyb20gPyAtMSA6IDFcbiAgICBpZiAoYS50byAhPT0gYi50bykgcmV0dXJuIGEudG8gPCBiLnRvID8gLTEgOiAxXG4gICAgY29uc3QgYWsgPSBTdHJpbmcoYS5raW5kID8/ICcnKVxuICAgIGNvbnN0IGJrID0gU3RyaW5nKGIua2luZCA/PyAnJylcbiAgICBpZiAoYWsgIT09IGJrKSByZXR1cm4gYWsgPCBiayA/IC0xIDogMVxuICAgIHJldHVybiAwXG4gIH0pXG5cbiAgY29uc3QgbWV0YTogUmVjb3JkPHN0cmluZywgSnNvblZhbHVlPiB8IHVuZGVmaW5lZCA9ICgoKSA9PiB7XG4gICAgY29uc3QgZ2VuZXJhdG9yID0gbm9ybWFsaXplZC5tZXRhPy5nZW5lcmF0b3JcbiAgICBpZiAoZ2VuZXJhdG9yID09PSB1bmRlZmluZWQpIHJldHVybiB1bmRlZmluZWRcbiAgICByZXR1cm4geyBnZW5lcmF0b3I6IGJ1ZGdldEpzb25WYWx1ZShnZW5lcmF0b3IpIH1cbiAgfSkoKVxuXG4gIGNvbnN0IGlyTm9EaWdlc3QgPSB7XG4gICAgdmVyc2lvbjogMSxcbiAgICBwcm9ncmFtSWQsXG4gICAgbm9kZXMsXG4gICAgZWRnZXMsXG4gICAgcG9saWN5OiBub3JtYWxpemVkLnBvbGljeSxcbiAgICBtZXRhLFxuICB9IGFzIGNvbnN0XG5cbiAgY29uc3QgZGlnZXN0ID0gbWFrZURpZ2VzdCgnd29ya2Zsb3dfaXJfdjEnLCBpck5vRGlnZXN0KVxuXG4gIHJldHVybiB7XG4gICAgLi4uaXJOb0RpZ2VzdCxcbiAgICBkaWdlc3QsXG4gIH1cbn1cblxuLy8gLS0tLSBSdW50aW1lIGNvbXBpbGF0aW9uIChJbnB1dEV4cHIgcHJlY29tcGlsZSArIHNoYXBlIGNoZWNrcykgLS0tLVxuXG5leHBvcnQgdHlwZSBDb21waWxlZFdvcmtmbG93U3RlcCA9XG4gIHwgeyByZWFkb25seSBraW5kOiAnZGlzcGF0Y2gnOyByZWFkb25seSBrZXk6IFN0ZXBLZXk7IHJlYWRvbmx5IGFjdGlvblRhZzogc3RyaW5nOyByZWFkb25seSBwYXlsb2FkPzogQ29tcGlsZWRJbnB1dEV4cHIgfVxuICB8IHsgcmVhZG9ubHkga2luZDogJ2RlbGF5JzsgcmVhZG9ubHkga2V5OiBTdGVwS2V5OyByZWFkb25seSBtczogbnVtYmVyIH1cbiAgfCB7XG4gICAgICByZWFkb25seSBraW5kOiAnY2FsbCdcbiAgICAgIHJlYWRvbmx5IGtleTogU3RlcEtleVxuICAgICAgcmVhZG9ubHkgc2VydmljZUlkOiBzdHJpbmdcbiAgICAgIHJlYWRvbmx5IGlucHV0PzogQ29tcGlsZWRJbnB1dEV4cHJcbiAgICAgIHJlYWRvbmx5IHRpbWVvdXRNcz86IG51bWJlclxuICAgICAgcmVhZG9ubHkgcmV0cnlUaW1lcz86IG51bWJlclxuICAgICAgcmVhZG9ubHkgb25TdWNjZXNzOiBSZWFkb25seUFycmF5PENvbXBpbGVkV29ya2Zsb3dTdGVwPlxuICAgICAgcmVhZG9ubHkgb25GYWlsdXJlOiBSZWFkb25seUFycmF5PENvbXBpbGVkV29ya2Zsb3dTdGVwPlxuICAgIH1cblxuZXhwb3J0IGNvbnN0IGNvbXBpbGVXb3JrZmxvd1J1bnRpbWVTdGVwc1YxID0gKGFyZ3M6IHtcbiAgcmVhZG9ubHkgZGVmOiBXb3JrZmxvd0RlZlYxXG59KTogUmVhZG9ubHlBcnJheTxDb21waWxlZFdvcmtmbG93U3RlcD4gPT4ge1xuICBjb25zdCBub3JtYWxpemVkID0gbm9ybWFsaXplV29ya2Zsb3dEZWZWMShhcmdzLmRlZilcbiAgdmFsaWRhdGVXb3JrZmxvd0RlZlYxKG5vcm1hbGl6ZWQpXG5cbiAgY29uc3QgY29tcGlsZVN0ZXAgPSAoc3RlcDogV29ya2Zsb3dTdGVwVjEpOiBDb21waWxlZFdvcmtmbG93U3RlcCA9PiB7XG4gICAgY29uc3Qgc3RlcEtleSA9IHN0ZXAua2V5XG4gICAgc3dpdGNoIChzdGVwLmtpbmQpIHtcbiAgICAgIGNhc2UgJ2Rpc3BhdGNoJzpcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBraW5kOiAnZGlzcGF0Y2gnLFxuICAgICAgICAgIGtleTogc3RlcC5rZXksXG4gICAgICAgICAgYWN0aW9uVGFnOiBzdGVwLmFjdGlvblRhZyxcbiAgICAgICAgICAuLi4oc3RlcC5wYXlsb2FkID8geyBwYXlsb2FkOiBjb21waWxlSW5wdXRFeHByKHN0ZXAucGF5bG9hZCwgeyBzdGVwS2V5IH0pIH0gOiBudWxsKSxcbiAgICAgICAgfVxuICAgICAgY2FzZSAnZGVsYXknOlxuICAgICAgICByZXR1cm4geyBraW5kOiAnZGVsYXknLCBrZXk6IHN0ZXAua2V5LCBtczogc3RlcC5tcyB9XG4gICAgICBjYXNlICdjYWxsJzoge1xuICAgICAgICBjb25zdCByZXRyeVRpbWVzID0gc3RlcC5yZXRyeT8udGltZXNcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBraW5kOiAnY2FsbCcsXG4gICAgICAgICAga2V5OiBzdGVwLmtleSxcbiAgICAgICAgICBzZXJ2aWNlSWQ6IHN0ZXAuc2VydmljZUlkLFxuICAgICAgICAgIC4uLihzdGVwLmlucHV0ID8geyBpbnB1dDogY29tcGlsZUlucHV0RXhwcihzdGVwLmlucHV0LCB7IHN0ZXBLZXkgfSkgfSA6IG51bGwpLFxuICAgICAgICAgIC4uLihzdGVwLnRpbWVvdXRNcyAhPT0gdW5kZWZpbmVkID8geyB0aW1lb3V0TXM6IHN0ZXAudGltZW91dE1zIH0gOiBudWxsKSxcbiAgICAgICAgICAuLi4ocmV0cnlUaW1lcyAhPT0gdW5kZWZpbmVkID8geyByZXRyeVRpbWVzIH0gOiBudWxsKSxcbiAgICAgICAgICBvblN1Y2Nlc3M6IHN0ZXAub25TdWNjZXNzLm1hcChjb21waWxlU3RlcCksXG4gICAgICAgICAgb25GYWlsdXJlOiBzdGVwLm9uRmFpbHVyZS5tYXAoY29tcGlsZVN0ZXApLFxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG5vcm1hbGl6ZWQuc3RlcHMubWFwKGNvbXBpbGVTdGVwKVxufVxuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7O0FBNEJBLElBQU0sY0FBYyxDQUFDLFdBQStCO0FBQ2xELE1BQUksWUFBWSxNQUFNLEVBQUcsUUFBTztBQUNoQyxTQUFPLGlCQUFpQixNQUFNLEVBQUU7QUFDbEM7QUFFTyxJQUFNLG9CQUFvQixDQUFDLFNBTWI7QUFDbkIsUUFBTSxhQUFhLEtBQUssV0FBVyxTQUFZLFlBQVksS0FBSyxNQUFNLElBQUk7QUFDMUUsUUFBTSxNQUFNLEtBQUssV0FBVyxTQUFZLEdBQUcsS0FBSyxPQUFPO0FBQUEsVUFBYSxnQkFBZ0IsVUFBVSxDQUFDLE1BQU0sS0FBSztBQUUxRyxTQUFPLE9BQU8sT0FBTyxJQUFJLE1BQU0sR0FBRyxHQUFHO0FBQUEsSUFDbkMsTUFBTTtBQUFBLElBQ04sTUFBTSxLQUFLO0FBQUEsSUFDWCxXQUFXLEtBQUs7QUFBQSxJQUNoQixRQUFRLEtBQUs7QUFBQSxJQUNiLFFBQVE7QUFBQSxFQUNWLENBQUM7QUFDSDs7O0FDNUNBLElBQU0scUJBQXFCLENBQUMsUUFBd0IsSUFBSSxRQUFRLE9B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QixRQUFJLE9BQU8sR0FBSSxRQUFPLEtBQUssS0FBSyxLQUFLO0FBQ3JDLFdBQU87QUFBQSxFQUNULENBQUM7QUFFRCxRQUFNLFFBQStDLE1BQU07QUFDekQsVUFBTSxZQUFZLFdBQVcsTUFBTTtBQUNuQyxRQUFJLGNBQWMsT0FBVyxRQUFPO0FBQ3BDLFdBQU8sRUFBRSxXQUFXLGdCQUFnQixTQUFTLEVBQUU7QUFBQSxFQUNqRCxHQUFHO0FBRUgsUUFBTSxhQUFhO0FBQUEsSUFDakIsU0FBUztBQUFBLElBQ1Q7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0EsUUFBUSxXQUFXO0FBQUEsSUFDbkI7QUFBQSxFQUNGO0FBRUEsUUFBTSxTQUFTLFdBQVcsa0JBQWtCLFVBQVU7QUFFdEQsU0FBTztBQUFBLElBQ0wsR0FBRztBQUFBLElBQ0g7QUFBQSxFQUNGO0FBQ0Y7QUFrQk8sSUFBTSxnQ0FBZ0MsQ0FBQyxTQUVIO0FBQ3pDLFFBQU0sYUFBYSx1QkFBdUIsS0FBSyxHQUFHO0FBQ2xELHdCQUFzQixVQUFVO0FBRWhDLFFBQU0sY0FBYyxDQUFDLFNBQStDO0FBQ2xFLFVBQU0sVUFBVSxLQUFLO0FBQ3JCLFlBQVEsS0FBSyxNQUFNO0FBQUEsTUFDakIsS0FBSztBQUNILGVBQU87QUFBQSxVQUNMLE1BQU07QUFBQSxVQUNOLEtBQUssS0FBSztBQUFBLFVBQ1YsV0FBVyxLQUFLO0FBQUEsVUFDaEIsR0FBSSxLQUFLLFVBQVUsRUFBRSxTQUFTLGlCQUFpQixLQUFLLFNBQVMsRUFBRSxRQUFRLENBQUMsRUFBRSxJQUFJO0FBQUEsUUFDaEY7QUFBQSxNQUNGLEtBQUs7QUFDSCxlQUFPLEVBQUUsTUFBTSxTQUFTLEtBQUssS0FBSyxLQUFLLElBQUksS0FBSyxHQUFHO0FBQUEsTUFDckQsS0FBSyxRQUFRO0FBQ1gsY0FBTSxhQUFhLEtBQUssT0FBTztBQUMvQixlQUFPO0FBQUEsVUFDTCxNQUFNO0FBQUEsVUFDTixLQUFLLEtBQUs7QUFBQSxVQUNWLFdBQVcsS0FBSztBQUFBLFVBQ2hCLEdBQUksS0FBSyxRQUFRLEVBQUUsT0FBTyxpQkFBaUIsS0FBSyxPQUFPLEVBQUUsUUFBUSxDQUFDLEVBQUUsSUFBSTtBQUFBLFVBQ3hFLEdBQUksS0FBSyxjQUFjLFNBQVksRUFBRSxXQUFXLEtBQUssVUFBVSxJQUFJO0FBQUEsVUFDbkUsR0FBSSxlQUFlLFNBQVksRUFBRSxXQUFXLElBQUk7QUFBQSxVQUNoRCxXQUFXLEtBQUssVUFBVSxJQUFJLFdBQVc7QUFBQSxVQUN6QyxXQUFXLEtBQUssVUFBVSxJQUFJLFdBQVc7QUFBQSxRQUMzQztBQUFBLE1BQ0Y7QUFBQSxJQUNGO0FBQUEsRUFDRjtBQUVBLFNBQU8sV0FBVyxNQUFNLElBQUksV0FBVztBQUN6QzsiLAogICJuYW1lcyI6IFsiaXNSZWNvcmQiLCAiYXJncyJdCn0K