@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
@@ -5,32 +5,35 @@ import {
5
5
  build,
6
6
  computed,
7
7
  exportStaticIr,
8
+ externalStore,
8
9
  from,
9
10
  install,
10
11
  link,
11
12
  list,
12
13
  node,
13
14
  source
14
- } from "../chunks/chunk-CDLXJHXY.js";
15
- import "../chunks/chunk-MPUSOFJ3.js";
16
- import "../chunks/chunk-HFV5GJPK.js";
17
- import "../chunks/chunk-CEGSWZ5S.js";
15
+ } from "../chunks/chunk-NE447XAF.js";
16
+ import "../chunks/chunk-FQRUTYAD.js";
17
+ import "../chunks/chunk-C2MYMMO4.js";
18
+ import "../chunks/chunk-EZTMVCJF.js";
18
19
  import "../chunks/chunk-KE2H62D6.js";
19
- import "../chunks/chunk-WFV5PPWJ.js";
20
- import "../chunks/chunk-ON2LY6HJ.js";
21
- import "../chunks/chunk-IP63FME6.js";
22
- import "../chunks/chunk-UCFEP3BH.js";
23
- import "../chunks/chunk-CZRI7MHA.js";
24
- import "../chunks/chunk-UKYAF3NL.js";
25
- import "../chunks/chunk-S46P7MC6.js";
26
- import "../chunks/chunk-3LX3KIQQ.js";
27
- import "../chunks/chunk-BWSNPKO5.js";
28
- import "../chunks/chunk-TOQ6SJ6O.js";
20
+ import "../chunks/chunk-4MY35XR3.js";
21
+ import "../chunks/chunk-X2Z5VYG3.js";
22
+ import "../chunks/chunk-ASVMK364.js";
23
+ import "../chunks/chunk-7GPAF2UK.js";
24
+ import "../chunks/chunk-YMVMZA3U.js";
25
+ import "../chunks/chunk-NMGFJZ4I.js";
26
+ import "../chunks/chunk-UJGVDFZN.js";
27
+ import "../chunks/chunk-W365QUZ5.js";
28
+ import "../chunks/chunk-SH7TP5CJ.js";
29
+ import "../chunks/chunk-SI5OKFFY.js";
30
+ import "../chunks/chunk-DT7YIIWE.js";
29
31
  export {
30
32
  $root,
31
33
  build,
32
34
  computed,
33
35
  exportStaticIr,
36
+ externalStore,
34
37
  from,
35
38
  install,
36
39
  link,
@@ -3,17 +3,17 @@
3
3
  import {
4
4
  ReplayLog,
5
5
  unsetAtPathMutating
6
- } from "../chunks/chunk-HFV5GJPK.js";
7
- import {
8
- inSyncTransactionFiber
9
- } from "../chunks/chunk-WFV5PPWJ.js";
6
+ } from "../chunks/chunk-C2MYMMO4.js";
10
7
  import {
11
8
  getBoundInternals,
12
9
  getModuleTraitsProgram
13
- } from "../chunks/chunk-UCFEP3BH.js";
14
- import "../chunks/chunk-CZRI7MHA.js";
15
- import "../chunks/chunk-UKYAF3NL.js";
16
- import "../chunks/chunk-TOQ6SJ6O.js";
10
+ } from "../chunks/chunk-7GPAF2UK.js";
11
+ import {
12
+ inSyncTransactionFiber
13
+ } from "../chunks/chunk-YMVMZA3U.js";
14
+ import "../chunks/chunk-UJGVDFZN.js";
15
+ import "../chunks/chunk-SH7TP5CJ.js";
16
+ import "../chunks/chunk-SI5OKFFY.js";
17
17
 
18
18
  // ../logix-core/src/internal/trait-lifecycle/index.ts
19
19
  import { Effect, FiberRef, Option } from "../effect.js";
@@ -0,0 +1,332 @@
1
+ // @logixjs/core subpath bundles for @logixjs/sandbox
2
+
3
+ import {
4
+ installOne
5
+ } from "../chunks/chunk-DM7C5NP5.js";
6
+ import {
7
+ compileWorkflowStaticIrV1,
8
+ makeWorkflowError,
9
+ normalizeWorkflowDefV1,
10
+ validateWorkflowDefV1
11
+ } from "../chunks/chunk-UZZBHWIO.js";
12
+ import "../chunks/chunk-BJOWSSEL.js";
13
+ import "../chunks/chunk-UBMUY7WO.js";
14
+ import "../chunks/chunk-7GPAF2UK.js";
15
+ import "../chunks/chunk-YMVMZA3U.js";
16
+ import "../chunks/chunk-UJGVDFZN.js";
17
+ import "../chunks/chunk-W365QUZ5.js";
18
+ import "../chunks/chunk-SH7TP5CJ.js";
19
+ import "../chunks/chunk-SI5OKFFY.js";
20
+ import "../chunks/chunk-DT7YIIWE.js";
21
+
22
+ // ../logix-core/src/Workflow.ts
23
+ import { Context } from "../effect.js";
24
+
25
+ // ../logix-core/src/internal/serviceId.ts
26
+ var asNonEmptyString = (value) => typeof value === "string" && value.length > 0 ? value : void 0;
27
+ var fromTag = (tag) => {
28
+ const anyTag = tag;
29
+ return asNonEmptyString(anyTag.key) ?? asNonEmptyString(anyTag.id) ?? asNonEmptyString(anyTag._id);
30
+ };
31
+
32
+ // ../logix-core/src/Workflow.ts
33
+ var KernelSourceRefreshPortTagImpl = class extends Context.Tag("logix/kernel/sourceRefresh")() {
34
+ };
35
+ var KernelPorts = {
36
+ sourceRefresh: KernelSourceRefreshPortTagImpl
37
+ };
38
+ var forModule = (_module) => {
39
+ return {
40
+ onAction: (actionTag) => onAction(actionTag),
41
+ onStart,
42
+ onInit,
43
+ payload,
44
+ payloadPath,
45
+ constValue,
46
+ object,
47
+ merge,
48
+ dispatch: (args) => dispatch(args),
49
+ delay,
50
+ callById: (args) => callById(args),
51
+ call: (args) => call(args),
52
+ fragment: (fragmentId, steps) => fragment(fragmentId, steps),
53
+ withPolicy: (patch, part) => withPolicy(patch, part),
54
+ compose: (...parts) => compose(...parts),
55
+ make: (input) => make(input),
56
+ fromJSON: (def) => fromJSON(def)
57
+ };
58
+ };
59
+ var isRecord = (value) => typeof value === "object" && value !== null && !Array.isArray(value);
60
+ var isReadonlyArray = (value) => Array.isArray(value);
61
+ var asNonEmptyString2 = (value) => typeof value === "string" && value.trim().length > 0 ? value.trim() : void 0;
62
+ var mergePolicy = (base, patch) => {
63
+ if (!base && !patch) return void 0;
64
+ return {
65
+ ...base ?? {},
66
+ ...patch ?? {}
67
+ };
68
+ };
69
+ var applyCallDefaults = (steps, patch) => {
70
+ const timeoutMsDefault = patch.timeoutMs;
71
+ const retryDefault = patch.retry;
72
+ const visit = (step) => {
73
+ if (step.kind !== "call") return step;
74
+ let changed = false;
75
+ const timeoutMs = step.timeoutMs ?? timeoutMsDefault;
76
+ if (timeoutMs !== step.timeoutMs) changed = true;
77
+ const retry = step.retry ?? retryDefault;
78
+ if (retry !== step.retry) changed = true;
79
+ const onSuccess = step.onSuccess.map(visit);
80
+ const onFailure = step.onFailure.map(visit);
81
+ if (onSuccess !== step.onSuccess) changed = true;
82
+ if (onFailure !== step.onFailure) changed = true;
83
+ if (!changed) return step;
84
+ return {
85
+ ...step,
86
+ ...timeoutMs !== void 0 ? { timeoutMs } : null,
87
+ ...retry !== void 0 ? { retry } : null,
88
+ onSuccess,
89
+ onFailure
90
+ };
91
+ };
92
+ return steps.map(visit);
93
+ };
94
+ var resolveStepsInput = (input) => {
95
+ if (Array.isArray(input)) {
96
+ return { steps: input };
97
+ }
98
+ if (isRecord(input) && Array.isArray(input.steps)) {
99
+ return input;
100
+ }
101
+ throw makeWorkflowError({
102
+ code: "WORKFLOW_INVALID_DEF",
103
+ message: 'Workflow.make: "steps" must be an array or a { steps, sources?, policy? } object.',
104
+ detail: { steps: input }
105
+ });
106
+ };
107
+ var recordSourcesForFragment = (sources, fragmentId, step) => {
108
+ sources[step.key] = { fragmentId };
109
+ if (step.kind !== "call") return;
110
+ for (const inner of step.onSuccess) recordSourcesForFragment(sources, fragmentId, inner);
111
+ for (const inner of step.onFailure) recordSourcesForFragment(sources, fragmentId, inner);
112
+ };
113
+ var onAction = (actionTag) => ({
114
+ kind: "action",
115
+ actionTag
116
+ });
117
+ var onStart = () => ({
118
+ kind: "lifecycle",
119
+ phase: "onStart"
120
+ });
121
+ var onInit = () => ({
122
+ kind: "lifecycle",
123
+ phase: "onInit"
124
+ });
125
+ var payload = () => ({ kind: "payload" });
126
+ var payloadPath = (pointer) => ({ kind: "payload.path", pointer });
127
+ var constValue = (value) => ({ kind: "const", value });
128
+ var object = (fields) => ({ kind: "object", fields });
129
+ var merge = (items) => ({ kind: "merge", items });
130
+ var dispatch = (args) => ({
131
+ kind: "dispatch",
132
+ key: args.key,
133
+ actionTag: args.actionTag,
134
+ ...args.payload ? { payload: args.payload } : null
135
+ });
136
+ var delay = (args) => ({
137
+ kind: "delay",
138
+ key: args.key,
139
+ ms: args.ms
140
+ });
141
+ var callById = (args) => ({
142
+ kind: "call",
143
+ key: args.key,
144
+ serviceId: args.serviceId,
145
+ ...args.input ? { input: args.input } : null,
146
+ ...args.timeoutMs !== void 0 ? { timeoutMs: args.timeoutMs } : null,
147
+ ...args.retry ? { retry: args.retry } : null,
148
+ onSuccess: args.onSuccess ?? [],
149
+ onFailure: args.onFailure ?? []
150
+ });
151
+ var call = (args) => {
152
+ const serviceId = fromTag(args.service);
153
+ if (!serviceId) {
154
+ throw makeWorkflowError({
155
+ code: "WORKFLOW_INVALID_SERVICE_ID",
156
+ message: "call(service): serviceId derived from tag must be a non-empty string (see 078 ServiceId contract).",
157
+ detail: { tag: String(args.service) }
158
+ });
159
+ }
160
+ return callById({
161
+ ...args,
162
+ serviceId
163
+ });
164
+ };
165
+ var fragment = (fragmentId, steps) => ({
166
+ fragmentId,
167
+ steps
168
+ });
169
+ var withPolicy = (patch, part) => {
170
+ let normalized;
171
+ if (isReadonlyArray(part)) {
172
+ normalized = { steps: part };
173
+ } else {
174
+ const partUnknown = part;
175
+ if (!isRecord(partUnknown) || !isReadonlyArray(partUnknown.steps)) {
176
+ throw makeWorkflowError({
177
+ code: "WORKFLOW_INVALID_DEF",
178
+ message: "withPolicy: invalid workflow part (expected steps[] / fragment / composeResult).",
179
+ detail: { part }
180
+ });
181
+ }
182
+ normalized = {
183
+ steps: part.steps,
184
+ ...part.sources ? { sources: part.sources } : null,
185
+ ...part.policy ? { policy: part.policy } : null
186
+ };
187
+ }
188
+ const steps = applyCallDefaults(normalized.steps, patch);
189
+ const patchPolicy = (() => {
190
+ const concurrency = patch.concurrency;
191
+ const priority = patch.priority;
192
+ return concurrency !== void 0 || priority !== void 0 ? { concurrency, priority } : void 0;
193
+ })();
194
+ const nextPolicy = mergePolicy(patchPolicy, normalized.policy);
195
+ return {
196
+ steps,
197
+ ...normalized.sources ? { sources: normalized.sources } : null,
198
+ ...nextPolicy ? { policy: nextPolicy } : null
199
+ };
200
+ };
201
+ var compose = (...parts) => {
202
+ const steps = [];
203
+ const sources = {};
204
+ let policy = void 0;
205
+ const ownersByKey = /* @__PURE__ */ new Map();
206
+ const recordOwner = (stepKey, fragmentId) => {
207
+ const list = ownersByKey.get(stepKey) ?? [];
208
+ list.push({ stepKey, ...fragmentId ? { fragmentId } : null });
209
+ ownersByKey.set(stepKey, list);
210
+ };
211
+ const recordOwners = (step, resolveFragmentId) => {
212
+ recordOwner(step.key, resolveFragmentId(step.key));
213
+ if (step.kind !== "call") return;
214
+ for (const inner of step.onSuccess) recordOwners(inner, resolveFragmentId);
215
+ for (const inner of step.onFailure) recordOwners(inner, resolveFragmentId);
216
+ };
217
+ for (const part of parts) {
218
+ if (isReadonlyArray(part)) {
219
+ steps.push(...part);
220
+ for (const step of part) recordOwners(step, () => void 0);
221
+ continue;
222
+ }
223
+ const partSteps = part.steps;
224
+ steps.push(...partSteps);
225
+ const partSources = part.sources;
226
+ if (partSources && typeof partSources === "object") {
227
+ for (const k of Object.keys(partSources).sort()) {
228
+ sources[k] = { ...partSources[k] };
229
+ }
230
+ }
231
+ const fragmentId = "fragmentId" in part ? part.fragmentId : void 0;
232
+ if (typeof fragmentId === "string" && fragmentId.length > 0) {
233
+ for (const step of partSteps) {
234
+ recordSourcesForFragment(sources, fragmentId, step);
235
+ }
236
+ }
237
+ const resolveFragmentIdForPart = (stepKey) => {
238
+ if (typeof fragmentId === "string" && fragmentId.length > 0) return fragmentId;
239
+ const fromSources = partSources?.[stepKey]?.fragmentId;
240
+ return typeof fromSources === "string" && fromSources.length > 0 ? fromSources : void 0;
241
+ };
242
+ for (const step of partSteps) recordOwners(step, resolveFragmentIdForPart);
243
+ policy = mergePolicy(policy, part.policy);
244
+ }
245
+ const finalSources = Object.keys(sources).length > 0 ? sources : void 0;
246
+ const duplicateKeys = Array.from(ownersByKey.entries()).filter(([, owners]) => owners.length > 1).map(([k]) => k).sort();
247
+ if (duplicateKeys.length > 0) {
248
+ const k = duplicateKeys[0];
249
+ throw makeWorkflowError({
250
+ code: "WORKFLOW_DUPLICATE_STEP_KEY",
251
+ message: `Duplicate stepKey "${k}" detected during composition.`,
252
+ source: { stepKey: k },
253
+ detail: { duplicateKey: k, owners: ownersByKey.get(k) ?? [] }
254
+ });
255
+ }
256
+ return {
257
+ steps,
258
+ ...finalSources ? { sources: finalSources } : null,
259
+ ...policy ? { policy } : null
260
+ };
261
+ };
262
+ var make = (input) => {
263
+ const localId = asNonEmptyString2(input.localId);
264
+ if (!localId) {
265
+ throw makeWorkflowError({
266
+ code: "WORKFLOW_INVALID_DEF",
267
+ message: "Workflow.make: localId must be a non-empty string.",
268
+ detail: { localId: input.localId }
269
+ });
270
+ }
271
+ const stepsInput = resolveStepsInput(input.steps);
272
+ const merged = mergePolicy(input.policy, stepsInput.policy);
273
+ const def = normalizeWorkflowDefV1({
274
+ astVersion: 1,
275
+ localId,
276
+ trigger: input.trigger,
277
+ ...merged ? { policy: merged } : null,
278
+ steps: stepsInput.steps,
279
+ ...stepsInput.sources ? { sources: stepsInput.sources } : null,
280
+ ...input.meta ? { meta: input.meta } : null
281
+ });
282
+ const staticIrCache = /* @__PURE__ */ new Map();
283
+ return {
284
+ _tag: "Workflow",
285
+ def,
286
+ toJSON: () => def,
287
+ validate: () => validateWorkflowDefV1(def),
288
+ exportStaticIr: (moduleId) => {
289
+ const cached = staticIrCache.get(moduleId);
290
+ if (cached) return cached;
291
+ const ir = compileWorkflowStaticIrV1({ moduleId, def });
292
+ staticIrCache.set(moduleId, ir);
293
+ return ir;
294
+ },
295
+ install: (moduleTag) => installOne({
296
+ moduleTag,
297
+ program: { _tag: "Workflow", def }
298
+ })
299
+ };
300
+ };
301
+ var fromJSON = (def) => make({
302
+ localId: def.localId,
303
+ trigger: def.trigger,
304
+ ...def.policy ? { policy: def.policy } : null,
305
+ steps: {
306
+ steps: def.steps,
307
+ ...def.sources ? { sources: def.sources } : null
308
+ },
309
+ ...def.meta ? { meta: def.meta } : null
310
+ });
311
+ export {
312
+ KernelPorts,
313
+ call,
314
+ callById,
315
+ compose,
316
+ constValue,
317
+ delay,
318
+ dispatch,
319
+ forModule,
320
+ fragment,
321
+ fromJSON,
322
+ make,
323
+ merge,
324
+ object,
325
+ onAction,
326
+ onInit,
327
+ onStart,
328
+ payload,
329
+ payloadPath,
330
+ withPolicy
331
+ };
332
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vbG9naXgtY29yZS9zcmMvV29ya2Zsb3cudHMiLCAiLi4vLi4vLi4vLi4vbG9naXgtY29yZS9zcmMvaW50ZXJuYWwvc2VydmljZUlkLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyJpbXBvcnQgeyBDb250ZXh0IH0gZnJvbSAnZWZmZWN0J1xuaW1wb3J0IHR5cGUgeyBKc29uVmFsdWUgfSBmcm9tICcuL2ludGVybmFsL29ic2VydmFiaWxpdHkvanNvblZhbHVlLmpzJ1xuaW1wb3J0IHsgZnJvbVRhZyBhcyBzZXJ2aWNlSWRGcm9tVGFnIH0gZnJvbSAnLi9pbnRlcm5hbC9zZXJ2aWNlSWQuanMnXG5pbXBvcnQgeyBtYWtlV29ya2Zsb3dFcnJvciB9IGZyb20gJy4vaW50ZXJuYWwvd29ya2Zsb3cvZXJyb3JzLmpzJ1xuaW1wb3J0IHR5cGUgeyBBbnlNb2R1bGVTaGFwZSwgTW9kdWxlTG9naWMsIE1vZHVsZVRhZyB9IGZyb20gJy4vaW50ZXJuYWwvbW9kdWxlLmpzJ1xuaW1wb3J0IHR5cGUge1xuICBJbnB1dEV4cHJWMSxcbiAgV29ya2Zsb3dDb21wb3NlUmVzdWx0VjEsXG4gIFdvcmtmbG93RGVmVjEsXG4gIFdvcmtmbG93RnJhZ21lbnRWMSxcbiAgV29ya2Zsb3dQYXJ0VjEsXG4gIFdvcmtmbG93UG9saWN5VjEsXG4gIFdvcmtmbG93U3RhdGljSXJWMSxcbiAgV29ya2Zsb3dTdGVwVjEsXG4gIFdvcmtmbG93VHJpZ2dlclYxLFxufSBmcm9tICcuL2ludGVybmFsL3dvcmtmbG93L21vZGVsLmpzJ1xuaW1wb3J0IHsgY29tcGlsZVdvcmtmbG93U3RhdGljSXJWMSwgbm9ybWFsaXplV29ya2Zsb3dEZWZWMSwgdmFsaWRhdGVXb3JrZmxvd0RlZlYxIH0gZnJvbSAnLi9pbnRlcm5hbC93b3JrZmxvdy9jb21waWxlci5qcydcbmltcG9ydCAqIGFzIFdvcmtmbG93UnVudGltZSBmcm9tICcuL2ludGVybmFsL3J1bnRpbWUvY29yZS9Xb3JrZmxvd1J1bnRpbWUuanMnXG5cbmV4cG9ydCB0eXBlIEFjdGlvblRhZ3NPZk1vZHVsZTxNPiA9IE0gZXh0ZW5kcyB7IHJlYWRvbmx5IGFjdGlvbnM6IGluZmVyIEEgfSA/IEV4dHJhY3Q8a2V5b2YgQSwgc3RyaW5nPiA6IHN0cmluZ1xuXG5leHBvcnQgdHlwZSBXb3JrZmxvd1RyaWdnZXI8QWN0aW9uVGFnIGV4dGVuZHMgc3RyaW5nID0gc3RyaW5nPiA9XG4gIHwgeyByZWFkb25seSBraW5kOiAnYWN0aW9uJzsgcmVhZG9ubHkgYWN0aW9uVGFnOiBBY3Rpb25UYWcgfVxuICB8IHsgcmVhZG9ubHkga2luZDogJ2xpZmVjeWNsZSc7IHJlYWRvbmx5IHBoYXNlOiAnb25TdGFydCcgfCAnb25Jbml0JyB9XG5cbmV4cG9ydCB0eXBlIFdvcmtmbG93UG9saWN5ID0gV29ya2Zsb3dQb2xpY3lWMVxuXG5leHBvcnQgdHlwZSBXb3JrZmxvd1N0ZXA8QWN0aW9uVGFnIGV4dGVuZHMgc3RyaW5nID0gc3RyaW5nPiA9XG4gIHwgeyByZWFkb25seSBraW5kOiAnZGlzcGF0Y2gnOyByZWFkb25seSBrZXk6IHN0cmluZzsgcmVhZG9ubHkgYWN0aW9uVGFnOiBBY3Rpb25UYWc7IHJlYWRvbmx5IHBheWxvYWQ/OiBJbnB1dEV4cHJWMSB9XG4gIHwgeyByZWFkb25seSBraW5kOiAnZGVsYXknOyByZWFkb25seSBrZXk6IHN0cmluZzsgcmVhZG9ubHkgbXM6IG51bWJlciB9XG4gIHwge1xuICAgICAgcmVhZG9ubHkga2luZDogJ2NhbGwnXG4gICAgICByZWFkb25seSBrZXk6IHN0cmluZ1xuICAgICAgcmVhZG9ubHkgc2VydmljZUlkOiBzdHJpbmdcbiAgICAgIHJlYWRvbmx5IGlucHV0PzogSW5wdXRFeHByVjFcbiAgICAgIHJlYWRvbmx5IHRpbWVvdXRNcz86IG51bWJlclxuICAgICAgcmVhZG9ubHkgcmV0cnk/OiB7IHJlYWRvbmx5IHRpbWVzOiBudW1iZXIgfVxuICAgICAgcmVhZG9ubHkgb25TdWNjZXNzOiBSZWFkb25seUFycmF5PFdvcmtmbG93U3RlcDxBY3Rpb25UYWc+PlxuICAgICAgcmVhZG9ubHkgb25GYWlsdXJlOiBSZWFkb25seUFycmF5PFdvcmtmbG93U3RlcDxBY3Rpb25UYWc+PlxuICAgIH1cblxuZXhwb3J0IHR5cGUgV29ya2Zsb3dEZWY8QWN0aW9uVGFnIGV4dGVuZHMgc3RyaW5nID0gc3RyaW5nPiA9IHtcbiAgcmVhZG9ubHkgYXN0VmVyc2lvbjogMVxuICByZWFkb25seSBsb2NhbElkOiBzdHJpbmdcbiAgcmVhZG9ubHkgdHJpZ2dlcjogV29ya2Zsb3dUcmlnZ2VyPEFjdGlvblRhZz5cbiAgcmVhZG9ubHkgcG9saWN5PzogV29ya2Zsb3dQb2xpY3lWMVxuICByZWFkb25seSBzdGVwczogUmVhZG9ubHlBcnJheTxXb3JrZmxvd1N0ZXA8QWN0aW9uVGFnPj5cbiAgcmVhZG9ubHkgc291cmNlcz86IFdvcmtmbG93RGVmVjFbJ3NvdXJjZXMnXVxuICByZWFkb25seSBtZXRhPzogeyByZWFkb25seSBnZW5lcmF0b3I/OiBKc29uVmFsdWUgfVxufVxuXG5leHBvcnQgdHlwZSBXb3JrZmxvd1N0YXRpY0lyID0gV29ya2Zsb3dTdGF0aWNJclYxXG5leHBvcnQgdHlwZSBJbnB1dEV4cHIgPSBJbnB1dEV4cHJWMVxuXG5leHBvcnQgdHlwZSBXb3JrZmxvd0ZyYWdtZW50PEFjdGlvblRhZyBleHRlbmRzIHN0cmluZyA9IHN0cmluZz4gPSB7XG4gIHJlYWRvbmx5IGZyYWdtZW50SWQ6IHN0cmluZ1xuICByZWFkb25seSBzdGVwczogUmVhZG9ubHlBcnJheTxXb3JrZmxvd1N0ZXA8QWN0aW9uVGFnPj5cbiAgcmVhZG9ubHkgc291cmNlcz86IFdvcmtmbG93RGVmVjFbJ3NvdXJjZXMnXVxuICByZWFkb25seSBwb2xpY3k/OiBXb3JrZmxvd1BvbGljeVYxXG59XG5cbmV4cG9ydCB0eXBlIFdvcmtmbG93Q29tcG9zZVJlc3VsdDxBY3Rpb25UYWcgZXh0ZW5kcyBzdHJpbmcgPSBzdHJpbmc+ID0ge1xuICByZWFkb25seSBzdGVwczogUmVhZG9ubHlBcnJheTxXb3JrZmxvd1N0ZXA8QWN0aW9uVGFnPj5cbiAgcmVhZG9ubHkgc291cmNlcz86IFdvcmtmbG93RGVmVjFbJ3NvdXJjZXMnXVxuICByZWFkb25seSBwb2xpY3k/OiBXb3JrZmxvd1BvbGljeVYxXG59XG5cbmV4cG9ydCB0eXBlIFdvcmtmbG93UGFydDxBY3Rpb25UYWcgZXh0ZW5kcyBzdHJpbmcgPSBzdHJpbmc+ID1cbiAgfCBSZWFkb25seUFycmF5PFdvcmtmbG93U3RlcDxBY3Rpb25UYWc+PlxuICB8IFdvcmtmbG93RnJhZ21lbnQ8QWN0aW9uVGFnPlxuICB8IFdvcmtmbG93Q29tcG9zZVJlc3VsdDxBY3Rpb25UYWc+XG5cbmNsYXNzIEtlcm5lbFNvdXJjZVJlZnJlc2hQb3J0VGFnSW1wbCBleHRlbmRzIENvbnRleHQuVGFnKCdsb2dpeC9rZXJuZWwvc291cmNlUmVmcmVzaCcpPFxuICBLZXJuZWxTb3VyY2VSZWZyZXNoUG9ydFRhZ0ltcGwsXG4gIHVua25vd25cbj4oKSB7fVxuXG5leHBvcnQgY29uc3QgS2VybmVsUG9ydHMgPSB7XG4gIHNvdXJjZVJlZnJlc2g6IEtlcm5lbFNvdXJjZVJlZnJlc2hQb3J0VGFnSW1wbCxcbn0gYXMgY29uc3RcblxuZXhwb3J0IGNvbnN0IGZvck1vZHVsZSA9IDxNIGV4dGVuZHMgeyByZWFkb25seSBhY3Rpb25zOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB9PihfbW9kdWxlOiBNKSA9PiB7XG4gIHR5cGUgQWN0aW9uVGFnID0gQWN0aW9uVGFnc09mTW9kdWxlPE0+XG5cbiAgcmV0dXJuIHtcbiAgICBvbkFjdGlvbjogKGFjdGlvblRhZzogQWN0aW9uVGFnKSA9PiBvbkFjdGlvbihhY3Rpb25UYWcpLFxuICAgIG9uU3RhcnQsXG4gICAgb25Jbml0LFxuICAgIHBheWxvYWQsXG4gICAgcGF5bG9hZFBhdGgsXG4gICAgY29uc3RWYWx1ZSxcbiAgICBvYmplY3QsXG4gICAgbWVyZ2UsXG4gICAgZGlzcGF0Y2g6IChhcmdzOiB7IHJlYWRvbmx5IGtleTogc3RyaW5nOyByZWFkb25seSBhY3Rpb25UYWc6IEFjdGlvblRhZzsgcmVhZG9ubHkgcGF5bG9hZD86IElucHV0RXhwciB9KSA9PiBkaXNwYXRjaChhcmdzKSxcbiAgICBkZWxheSxcbiAgICBjYWxsQnlJZDogKGFyZ3M6IHtcbiAgICAgIHJlYWRvbmx5IGtleTogc3RyaW5nXG4gICAgICByZWFkb25seSBzZXJ2aWNlSWQ6IHN0cmluZ1xuICAgICAgcmVhZG9ubHkgaW5wdXQ/OiBJbnB1dEV4cHJcbiAgICAgIHJlYWRvbmx5IHRpbWVvdXRNcz86IG51bWJlclxuICAgICAgcmVhZG9ubHkgcmV0cnk/OiB7IHJlYWRvbmx5IHRpbWVzOiBudW1iZXIgfVxuICAgICAgcmVhZG9ubHkgb25TdWNjZXNzPzogUmVhZG9ubHlBcnJheTxXb3JrZmxvd1N0ZXA8QWN0aW9uVGFnPj5cbiAgICAgIHJlYWRvbmx5IG9uRmFpbHVyZT86IFJlYWRvbmx5QXJyYXk8V29ya2Zsb3dTdGVwPEFjdGlvblRhZz4+XG4gICAgfSkgPT4gY2FsbEJ5SWQ8QWN0aW9uVGFnPihhcmdzKSxcbiAgICBjYWxsOiA8SWQsIFN2Yz4oYXJnczoge1xuICAgICAgcmVhZG9ubHkga2V5OiBzdHJpbmdcbiAgICAgIHJlYWRvbmx5IHNlcnZpY2U6IENvbnRleHQuVGFnPElkLCBTdmM+XG4gICAgICByZWFkb25seSBpbnB1dD86IElucHV0RXhwclxuICAgICAgcmVhZG9ubHkgdGltZW91dE1zPzogbnVtYmVyXG4gICAgICByZWFkb25seSByZXRyeT86IHsgcmVhZG9ubHkgdGltZXM6IG51bWJlciB9XG4gICAgICByZWFkb25seSBvblN1Y2Nlc3M/OiBSZWFkb25seUFycmF5PFdvcmtmbG93U3RlcDxBY3Rpb25UYWc+PlxuICAgICAgcmVhZG9ubHkgb25GYWlsdXJlPzogUmVhZG9ubHlBcnJheTxXb3JrZmxvd1N0ZXA8QWN0aW9uVGFnPj5cbiAgICB9KSA9PiBjYWxsKGFyZ3MpLFxuICAgIGZyYWdtZW50OiAoZnJhZ21lbnRJZDogc3RyaW5nLCBzdGVwczogUmVhZG9ubHlBcnJheTxXb3JrZmxvd1N0ZXA8QWN0aW9uVGFnPj4pID0+IGZyYWdtZW50PEFjdGlvblRhZz4oZnJhZ21lbnRJZCwgc3RlcHMpLFxuICAgIHdpdGhQb2xpY3k6IChwYXRjaDogV2l0aFBvbGljeVBhdGNoLCBwYXJ0OiBXb3JrZmxvd1BhcnQ8QWN0aW9uVGFnPikgPT4gd2l0aFBvbGljeTxBY3Rpb25UYWc+KHBhdGNoLCBwYXJ0KSxcbiAgICBjb21wb3NlOiAoLi4ucGFydHM6IFJlYWRvbmx5QXJyYXk8V29ya2Zsb3dQYXJ0PEFjdGlvblRhZz4+KSA9PiBjb21wb3NlPEFjdGlvblRhZz4oLi4ucGFydHMpLFxuICAgIG1ha2U6IChpbnB1dDoge1xuICAgICAgcmVhZG9ubHkgYXN0VmVyc2lvbj86IDFcbiAgICAgIHJlYWRvbmx5IGxvY2FsSWQ6IHN0cmluZ1xuICAgICAgcmVhZG9ubHkgdHJpZ2dlcjogV29ya2Zsb3dUcmlnZ2VyPEFjdGlvblRhZz5cbiAgICAgIHJlYWRvbmx5IHBvbGljeT86IFdvcmtmbG93UG9saWN5XG4gICAgICByZWFkb25seSBzdGVwczogV29ya2Zsb3dTdGVwc0lucHV0PEFjdGlvblRhZz5cbiAgICAgIHJlYWRvbmx5IG1ldGE/OiB7IHJlYWRvbmx5IGdlbmVyYXRvcj86IEpzb25WYWx1ZSB9XG4gICAgfSkgPT4gbWFrZTxNPihpbnB1dCksXG4gICAgZnJvbUpTT046IChkZWY6IFdvcmtmbG93RGVmPEFjdGlvblRhZz4pID0+IGZyb21KU09OPEFjdGlvblRhZz4oZGVmKSxcbiAgfSBhcyBjb25zdFxufVxuXG5leHBvcnQgdHlwZSBXaXRoUG9saWN5UGF0Y2ggPSB7XG4gIHJlYWRvbmx5IGNvbmN1cnJlbmN5PzogV29ya2Zsb3dQb2xpY3lWMVsnY29uY3VycmVuY3knXVxuICByZWFkb25seSBwcmlvcml0eT86IFdvcmtmbG93UG9saWN5VjFbJ3ByaW9yaXR5J11cbiAgLyoqIERlZmF1bHQgZm9yIGNhbGwudGltZW91dE1zIChvbmx5IGZpbGxzIHdoZW4gc3RlcC50aW1lb3V0TXMgaXMgbWlzc2luZykuICovXG4gIHJlYWRvbmx5IHRpbWVvdXRNcz86IG51bWJlclxuICAvKiogRGVmYXVsdCBmb3IgY2FsbC5yZXRyeS50aW1lcyAob25seSBmaWxscyB3aGVuIHN0ZXAucmV0cnkgaXMgbWlzc2luZykuICovXG4gIHJlYWRvbmx5IHJldHJ5PzogeyByZWFkb25seSB0aW1lczogbnVtYmVyIH1cbn1cblxuZXhwb3J0IHR5cGUgV29ya2Zsb3dTdGVwc0lucHV0PEFjdGlvblRhZyBleHRlbmRzIHN0cmluZyA9IHN0cmluZz4gPVxuICB8IFJlYWRvbmx5QXJyYXk8V29ya2Zsb3dTdGVwPEFjdGlvblRhZz4+XG4gIHwgKFdvcmtmbG93Q29tcG9zZVJlc3VsdDxBY3Rpb25UYWc+ICYge1xuICAgICAgcmVhZG9ubHkgc3RlcHM6IFJlYWRvbmx5QXJyYXk8V29ya2Zsb3dTdGVwPEFjdGlvblRhZz4+XG4gICAgfSlcblxuZXhwb3J0IGludGVyZmFjZSBXb3JrZmxvdyB7XG4gIHJlYWRvbmx5IF90YWc6ICdXb3JrZmxvdydcbiAgcmVhZG9ubHkgZGVmOiBXb3JrZmxvd0RlZlYxXG4gIHJlYWRvbmx5IHRvSlNPTjogKCkgPT4gV29ya2Zsb3dEZWZWMVxuICByZWFkb25seSB2YWxpZGF0ZTogKCkgPT4gdm9pZFxuICByZWFkb25seSBleHBvcnRTdGF0aWNJcjogKG1vZHVsZUlkOiBzdHJpbmcpID0+IFdvcmtmbG93U3RhdGljSXJWMVxuICByZWFkb25seSBpbnN0YWxsOiAobW9kdWxlVGFnOiBNb2R1bGVUYWc8c3RyaW5nLCBBbnlNb2R1bGVTaGFwZT4pID0+IE1vZHVsZUxvZ2ljPEFueU1vZHVsZVNoYXBlLCB1bmtub3duLCBuZXZlcj5cbn1cblxuY29uc3QgaXNSZWNvcmQgPSAodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9PlxuICB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIHZhbHVlICE9PSBudWxsICYmICFBcnJheS5pc0FycmF5KHZhbHVlKVxuXG5jb25zdCBpc1JlYWRvbmx5QXJyYXkgPSAodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBSZWFkb25seUFycmF5PHVua25vd24+ID0+IEFycmF5LmlzQXJyYXkodmFsdWUpXG5cbmNvbnN0IGFzTm9uRW1wdHlTdHJpbmcgPSAodmFsdWU6IHVua25vd24pOiBzdHJpbmcgfCB1bmRlZmluZWQgPT5cbiAgdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyAmJiB2YWx1ZS50cmltKCkubGVuZ3RoID4gMCA/IHZhbHVlLnRyaW0oKSA6IHVuZGVmaW5lZFxuXG5jb25zdCBtZXJnZVBvbGljeSA9IChiYXNlOiBXb3JrZmxvd1BvbGljeVYxIHwgdW5kZWZpbmVkLCBwYXRjaDogV29ya2Zsb3dQb2xpY3lWMSB8IHVuZGVmaW5lZCk6IFdvcmtmbG93UG9saWN5VjEgfCB1bmRlZmluZWQgPT4ge1xuICBpZiAoIWJhc2UgJiYgIXBhdGNoKSByZXR1cm4gdW5kZWZpbmVkXG4gIHJldHVybiB7XG4gICAgLi4uKGJhc2UgPz8ge30pLFxuICAgIC4uLihwYXRjaCA/PyB7fSksXG4gIH1cbn1cblxuY29uc3QgYXBwbHlDYWxsRGVmYXVsdHMgPSAoc3RlcHM6IFJlYWRvbmx5QXJyYXk8V29ya2Zsb3dTdGVwVjE+LCBwYXRjaDogV2l0aFBvbGljeVBhdGNoKTogUmVhZG9ubHlBcnJheTxXb3JrZmxvd1N0ZXBWMT4gPT4ge1xuICBjb25zdCB0aW1lb3V0TXNEZWZhdWx0ID0gcGF0Y2gudGltZW91dE1zXG4gIGNvbnN0IHJldHJ5RGVmYXVsdCA9IHBhdGNoLnJldHJ5XG5cbiAgY29uc3QgdmlzaXQgPSAoc3RlcDogV29ya2Zsb3dTdGVwVjEpOiBXb3JrZmxvd1N0ZXBWMSA9PiB7XG4gICAgaWYgKHN0ZXAua2luZCAhPT0gJ2NhbGwnKSByZXR1cm4gc3RlcFxuXG4gICAgbGV0IGNoYW5nZWQgPSBmYWxzZVxuICAgIGNvbnN0IHRpbWVvdXRNcyA9IHN0ZXAudGltZW91dE1zID8/IHRpbWVvdXRNc0RlZmF1bHRcbiAgICBpZiAodGltZW91dE1zICE9PSBzdGVwLnRpbWVvdXRNcykgY2hhbmdlZCA9IHRydWVcblxuICAgIGNvbnN0IHJldHJ5ID0gc3RlcC5yZXRyeSA/PyByZXRyeURlZmF1bHRcbiAgICBpZiAocmV0cnkgIT09IHN0ZXAucmV0cnkpIGNoYW5nZWQgPSB0cnVlXG5cbiAgICBjb25zdCBvblN1Y2Nlc3MgPSBzdGVwLm9uU3VjY2Vzcy5tYXAodmlzaXQpXG4gICAgY29uc3Qgb25GYWlsdXJlID0gc3RlcC5vbkZhaWx1cmUubWFwKHZpc2l0KVxuICAgIGlmIChvblN1Y2Nlc3MgIT09IHN0ZXAub25TdWNjZXNzKSBjaGFuZ2VkID0gdHJ1ZVxuICAgIGlmIChvbkZhaWx1cmUgIT09IHN0ZXAub25GYWlsdXJlKSBjaGFuZ2VkID0gdHJ1ZVxuXG4gICAgaWYgKCFjaGFuZ2VkKSByZXR1cm4gc3RlcFxuXG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLnN0ZXAsXG4gICAgICAuLi4odGltZW91dE1zICE9PSB1bmRlZmluZWQgPyB7IHRpbWVvdXRNcyB9IDogbnVsbCksXG4gICAgICAuLi4ocmV0cnkgIT09IHVuZGVmaW5lZCA/IHsgcmV0cnkgfSA6IG51bGwpLFxuICAgICAgb25TdWNjZXNzLFxuICAgICAgb25GYWlsdXJlLFxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBzdGVwcy5tYXAodmlzaXQpXG59XG5cbmNvbnN0IHJlc29sdmVTdGVwc0lucHV0ID0gKGlucHV0OiB1bmtub3duKTogV29ya2Zsb3dDb21wb3NlUmVzdWx0VjEgPT4ge1xuICBpZiAoQXJyYXkuaXNBcnJheShpbnB1dCkpIHtcbiAgICByZXR1cm4geyBzdGVwczogaW5wdXQgYXMgUmVhZG9ubHlBcnJheTxXb3JrZmxvd1N0ZXBWMT4gfVxuICB9XG4gIGlmIChpc1JlY29yZChpbnB1dCkgJiYgQXJyYXkuaXNBcnJheShpbnB1dC5zdGVwcykpIHtcbiAgICByZXR1cm4gaW5wdXQgYXMgV29ya2Zsb3dDb21wb3NlUmVzdWx0VjFcbiAgfVxuICB0aHJvdyBtYWtlV29ya2Zsb3dFcnJvcih7XG4gICAgY29kZTogJ1dPUktGTE9XX0lOVkFMSURfREVGJyxcbiAgICBtZXNzYWdlOiAnV29ya2Zsb3cubWFrZTogXCJzdGVwc1wiIG11c3QgYmUgYW4gYXJyYXkgb3IgYSB7IHN0ZXBzLCBzb3VyY2VzPywgcG9saWN5PyB9IG9iamVjdC4nLFxuICAgIGRldGFpbDogeyBzdGVwczogaW5wdXQgfSxcbiAgfSlcbn1cblxuY29uc3QgcmVjb3JkU291cmNlc0ZvckZyYWdtZW50ID0gKFxuICBzb3VyY2VzOiBSZWNvcmQ8c3RyaW5nLCB7IHJlYWRvbmx5IGZyYWdtZW50SWQ/OiBzdHJpbmcgfT4sXG4gIGZyYWdtZW50SWQ6IHN0cmluZyxcbiAgc3RlcDogV29ya2Zsb3dTdGVwVjEsXG4pOiB2b2lkID0+IHtcbiAgc291cmNlc1tzdGVwLmtleV0gPSB7IGZyYWdtZW50SWQgfVxuICBpZiAoc3RlcC5raW5kICE9PSAnY2FsbCcpIHJldHVyblxuICBmb3IgKGNvbnN0IGlubmVyIG9mIHN0ZXAub25TdWNjZXNzKSByZWNvcmRTb3VyY2VzRm9yRnJhZ21lbnQoc291cmNlcywgZnJhZ21lbnRJZCwgaW5uZXIpXG4gIGZvciAoY29uc3QgaW5uZXIgb2Ygc3RlcC5vbkZhaWx1cmUpIHJlY29yZFNvdXJjZXNGb3JGcmFnbWVudChzb3VyY2VzLCBmcmFnbWVudElkLCBpbm5lcilcbn1cblxuZXhwb3J0IGNvbnN0IG9uQWN0aW9uID0gPEFjdGlvblRhZyBleHRlbmRzIHN0cmluZz4oYWN0aW9uVGFnOiBBY3Rpb25UYWcpOiBFeHRyYWN0PFdvcmtmbG93VHJpZ2dlcjxBY3Rpb25UYWc+LCB7IGtpbmQ6ICdhY3Rpb24nIH0+ID0+ICh7XG4gIGtpbmQ6ICdhY3Rpb24nLFxuICBhY3Rpb25UYWcsXG59KVxuXG5leHBvcnQgY29uc3Qgb25TdGFydCA9ICgpOiB7IHJlYWRvbmx5IGtpbmQ6ICdsaWZlY3ljbGUnOyByZWFkb25seSBwaGFzZTogJ29uU3RhcnQnIH0gPT4gKHtcbiAga2luZDogJ2xpZmVjeWNsZScsXG4gIHBoYXNlOiAnb25TdGFydCcsXG59KVxuXG5leHBvcnQgY29uc3Qgb25Jbml0ID0gKCk6IHsgcmVhZG9ubHkga2luZDogJ2xpZmVjeWNsZSc7IHJlYWRvbmx5IHBoYXNlOiAnb25Jbml0JyB9ID0+ICh7XG4gIGtpbmQ6ICdsaWZlY3ljbGUnLFxuICBwaGFzZTogJ29uSW5pdCcsXG59KVxuXG5leHBvcnQgY29uc3QgcGF5bG9hZCA9ICgpOiBJbnB1dEV4cHJWMSA9PiAoeyBraW5kOiAncGF5bG9hZCcgfSlcblxuZXhwb3J0IGNvbnN0IHBheWxvYWRQYXRoID0gKHBvaW50ZXI6IHN0cmluZyk6IElucHV0RXhwclYxID0+ICh7IGtpbmQ6ICdwYXlsb2FkLnBhdGgnLCBwb2ludGVyIH0pXG5cbmV4cG9ydCBjb25zdCBjb25zdFZhbHVlID0gKHZhbHVlOiBKc29uVmFsdWUpOiBJbnB1dEV4cHJWMSA9PiAoeyBraW5kOiAnY29uc3QnLCB2YWx1ZSB9KVxuXG5leHBvcnQgY29uc3Qgb2JqZWN0ID0gKGZpZWxkczogUmVjb3JkPHN0cmluZywgSW5wdXRFeHByVjE+KTogSW5wdXRFeHByVjEgPT4gKHsga2luZDogJ29iamVjdCcsIGZpZWxkcyB9KVxuXG5leHBvcnQgY29uc3QgbWVyZ2UgPSAoaXRlbXM6IFJlYWRvbmx5QXJyYXk8SW5wdXRFeHByVjE+KTogSW5wdXRFeHByVjEgPT4gKHsga2luZDogJ21lcmdlJywgaXRlbXMgfSlcblxuZXhwb3J0IGNvbnN0IGRpc3BhdGNoID0gPEFjdGlvblRhZyBleHRlbmRzIHN0cmluZz4oYXJnczoge1xuICByZWFkb25seSBrZXk6IHN0cmluZ1xuICByZWFkb25seSBhY3Rpb25UYWc6IEFjdGlvblRhZ1xuICByZWFkb25seSBwYXlsb2FkPzogSW5wdXRFeHByVjFcbn0pOiBFeHRyYWN0PFdvcmtmbG93U3RlcDxBY3Rpb25UYWc+LCB7IGtpbmQ6ICdkaXNwYXRjaCcgfT4gPT4gKHtcbiAga2luZDogJ2Rpc3BhdGNoJyxcbiAga2V5OiBhcmdzLmtleSxcbiAgYWN0aW9uVGFnOiBhcmdzLmFjdGlvblRhZyxcbiAgLi4uKGFyZ3MucGF5bG9hZCA/IHsgcGF5bG9hZDogYXJncy5wYXlsb2FkIH0gOiBudWxsKSxcbn0pXG5cbmV4cG9ydCBjb25zdCBkZWxheSA9IChhcmdzOiB7IHJlYWRvbmx5IGtleTogc3RyaW5nOyByZWFkb25seSBtczogbnVtYmVyIH0pOiBFeHRyYWN0PFdvcmtmbG93U3RlcCwgeyBraW5kOiAnZGVsYXknIH0+ID0+ICh7XG4gIGtpbmQ6ICdkZWxheScsXG4gIGtleTogYXJncy5rZXksXG4gIG1zOiBhcmdzLm1zLFxufSlcblxuZXhwb3J0IGNvbnN0IGNhbGxCeUlkID0gPEFjdGlvblRhZyBleHRlbmRzIHN0cmluZyA9IG5ldmVyPihhcmdzOiB7XG4gIHJlYWRvbmx5IGtleTogc3RyaW5nXG4gIHJlYWRvbmx5IHNlcnZpY2VJZDogc3RyaW5nXG4gIHJlYWRvbmx5IGlucHV0PzogSW5wdXRFeHByVjFcbiAgcmVhZG9ubHkgdGltZW91dE1zPzogbnVtYmVyXG4gIHJlYWRvbmx5IHJldHJ5PzogeyByZWFkb25seSB0aW1lczogbnVtYmVyIH1cbiAgcmVhZG9ubHkgb25TdWNjZXNzPzogUmVhZG9ubHlBcnJheTxXb3JrZmxvd1N0ZXA8QWN0aW9uVGFnPj5cbiAgcmVhZG9ubHkgb25GYWlsdXJlPzogUmVhZG9ubHlBcnJheTxXb3JrZmxvd1N0ZXA8QWN0aW9uVGFnPj5cbn0pOiBFeHRyYWN0PFdvcmtmbG93U3RlcDxBY3Rpb25UYWc+LCB7IGtpbmQ6ICdjYWxsJyB9PiA9PiAoe1xuICBraW5kOiAnY2FsbCcsXG4gIGtleTogYXJncy5rZXksXG4gIHNlcnZpY2VJZDogYXJncy5zZXJ2aWNlSWQsXG4gIC4uLihhcmdzLmlucHV0ID8geyBpbnB1dDogYXJncy5pbnB1dCB9IDogbnVsbCksXG4gIC4uLihhcmdzLnRpbWVvdXRNcyAhPT0gdW5kZWZpbmVkID8geyB0aW1lb3V0TXM6IGFyZ3MudGltZW91dE1zIH0gOiBudWxsKSxcbiAgLi4uKGFyZ3MucmV0cnkgPyB7IHJldHJ5OiBhcmdzLnJldHJ5IH0gOiBudWxsKSxcbiAgb25TdWNjZXNzOiBhcmdzLm9uU3VjY2VzcyA/PyBbXSxcbiAgb25GYWlsdXJlOiBhcmdzLm9uRmFpbHVyZSA/PyBbXSxcbn0pXG5cbmV4cG9ydCBjb25zdCBjYWxsID0gPElkLCBTdmMsIEFjdGlvblRhZyBleHRlbmRzIHN0cmluZyA9IG5ldmVyPihhcmdzOiB7XG4gIHJlYWRvbmx5IGtleTogc3RyaW5nXG4gIHJlYWRvbmx5IHNlcnZpY2U6IENvbnRleHQuVGFnPElkLCBTdmM+XG4gIHJlYWRvbmx5IGlucHV0PzogSW5wdXRFeHByVjFcbiAgcmVhZG9ubHkgdGltZW91dE1zPzogbnVtYmVyXG4gIHJlYWRvbmx5IHJldHJ5PzogeyByZWFkb25seSB0aW1lczogbnVtYmVyIH1cbiAgcmVhZG9ubHkgb25TdWNjZXNzPzogUmVhZG9ubHlBcnJheTxXb3JrZmxvd1N0ZXA8QWN0aW9uVGFnPj5cbiAgcmVhZG9ubHkgb25GYWlsdXJlPzogUmVhZG9ubHlBcnJheTxXb3JrZmxvd1N0ZXA8QWN0aW9uVGFnPj5cbn0pOiBFeHRyYWN0PFdvcmtmbG93U3RlcDxBY3Rpb25UYWc+LCB7IGtpbmQ6ICdjYWxsJyB9PiA9PiB7XG4gIGNvbnN0IHNlcnZpY2VJZCA9IHNlcnZpY2VJZEZyb21UYWcoYXJncy5zZXJ2aWNlKVxuICBpZiAoIXNlcnZpY2VJZCkge1xuICAgIHRocm93IG1ha2VXb3JrZmxvd0Vycm9yKHtcbiAgICAgIGNvZGU6ICdXT1JLRkxPV19JTlZBTElEX1NFUlZJQ0VfSUQnLFxuICAgICAgbWVzc2FnZTogJ2NhbGwoc2VydmljZSk6IHNlcnZpY2VJZCBkZXJpdmVkIGZyb20gdGFnIG11c3QgYmUgYSBub24tZW1wdHkgc3RyaW5nIChzZWUgMDc4IFNlcnZpY2VJZCBjb250cmFjdCkuJyxcbiAgICAgIGRldGFpbDogeyB0YWc6IFN0cmluZyhhcmdzLnNlcnZpY2UpIH0sXG4gICAgfSlcbiAgfVxuXG4gIHJldHVybiBjYWxsQnlJZDxBY3Rpb25UYWc+KHtcbiAgICAuLi5hcmdzLFxuICAgIHNlcnZpY2VJZCxcbiAgfSlcbn1cblxuZXhwb3J0IGNvbnN0IGZyYWdtZW50ID0gPEFjdGlvblRhZyBleHRlbmRzIHN0cmluZyA9IG5ldmVyPihcbiAgZnJhZ21lbnRJZDogc3RyaW5nLFxuICBzdGVwczogUmVhZG9ubHlBcnJheTxXb3JrZmxvd1N0ZXA8QWN0aW9uVGFnPj4sXG4pOiBXb3JrZmxvd0ZyYWdtZW50PEFjdGlvblRhZz4gPT4gKHtcbiAgZnJhZ21lbnRJZCxcbiAgc3RlcHMsXG59KVxuXG5leHBvcnQgY29uc3Qgd2l0aFBvbGljeSA9IDxBY3Rpb25UYWcgZXh0ZW5kcyBzdHJpbmcgPSBuZXZlcj4oXG4gIHBhdGNoOiBXaXRoUG9saWN5UGF0Y2gsXG4gIHBhcnQ6IFdvcmtmbG93UGFydDxBY3Rpb25UYWc+LFxuKTogV29ya2Zsb3dDb21wb3NlUmVzdWx0PEFjdGlvblRhZz4gPT4ge1xuICBsZXQgbm9ybWFsaXplZDogV29ya2Zsb3dDb21wb3NlUmVzdWx0PEFjdGlvblRhZz5cbiAgaWYgKGlzUmVhZG9ubHlBcnJheShwYXJ0KSkge1xuICAgIG5vcm1hbGl6ZWQgPSB7IHN0ZXBzOiBwYXJ0IH1cbiAgfSBlbHNlIHtcbiAgICBjb25zdCBwYXJ0VW5rbm93bjogdW5rbm93biA9IHBhcnRcbiAgICBpZiAoIWlzUmVjb3JkKHBhcnRVbmtub3duKSB8fCAhaXNSZWFkb25seUFycmF5KHBhcnRVbmtub3duLnN0ZXBzKSkge1xuICAgICAgdGhyb3cgbWFrZVdvcmtmbG93RXJyb3Ioe1xuICAgICAgICBjb2RlOiAnV09SS0ZMT1dfSU5WQUxJRF9ERUYnLFxuICAgICAgICBtZXNzYWdlOiAnd2l0aFBvbGljeTogaW52YWxpZCB3b3JrZmxvdyBwYXJ0IChleHBlY3RlZCBzdGVwc1tdIC8gZnJhZ21lbnQgLyBjb21wb3NlUmVzdWx0KS4nLFxuICAgICAgICBkZXRhaWw6IHsgcGFydCB9LFxuICAgICAgfSlcbiAgICB9XG4gICAgbm9ybWFsaXplZCA9IHtcbiAgICAgIHN0ZXBzOiBwYXJ0LnN0ZXBzLFxuICAgICAgLi4uKHBhcnQuc291cmNlcyA/IHsgc291cmNlczogcGFydC5zb3VyY2VzIH0gOiBudWxsKSxcbiAgICAgIC4uLihwYXJ0LnBvbGljeSA/IHsgcG9saWN5OiBwYXJ0LnBvbGljeSB9IDogbnVsbCksXG4gICAgfVxuICB9XG5cbiAgY29uc3Qgc3RlcHMgPSBhcHBseUNhbGxEZWZhdWx0cyhub3JtYWxpemVkLnN0ZXBzIGFzIFJlYWRvbmx5QXJyYXk8V29ya2Zsb3dTdGVwVjE+LCBwYXRjaCkgYXMgUmVhZG9ubHlBcnJheTxXb3JrZmxvd1N0ZXA8QWN0aW9uVGFnPj5cbiAgY29uc3QgcGF0Y2hQb2xpY3k6IFdvcmtmbG93UG9saWN5VjEgfCB1bmRlZmluZWQgPSAoKCkgPT4ge1xuICAgIGNvbnN0IGNvbmN1cnJlbmN5ID0gcGF0Y2guY29uY3VycmVuY3lcbiAgICBjb25zdCBwcmlvcml0eSA9IHBhdGNoLnByaW9yaXR5XG4gICAgcmV0dXJuIGNvbmN1cnJlbmN5ICE9PSB1bmRlZmluZWQgfHwgcHJpb3JpdHkgIT09IHVuZGVmaW5lZCA/IHsgY29uY3VycmVuY3ksIHByaW9yaXR5IH0gOiB1bmRlZmluZWRcbiAgfSkoKVxuXG4gIC8vIE91dGVyIHdpdGhQb2xpY3kgaXMgd2Vha2VyIHRoYW4gaW5uZXIgKG5lc3RlZCkgcG9saWNpZXM6IG9ubHkgZmlsbCBtaXNzaW5nIHByb2dyYW0gcG9saWN5IGZpZWxkcy5cbiAgY29uc3QgbmV4dFBvbGljeSA9IG1lcmdlUG9saWN5KHBhdGNoUG9saWN5LCBub3JtYWxpemVkLnBvbGljeSlcblxuICByZXR1cm4ge1xuICAgIHN0ZXBzLFxuICAgIC4uLihub3JtYWxpemVkLnNvdXJjZXMgPyB7IHNvdXJjZXM6IG5vcm1hbGl6ZWQuc291cmNlcyB9IDogbnVsbCksXG4gICAgLi4uKG5leHRQb2xpY3kgPyB7IHBvbGljeTogbmV4dFBvbGljeSB9IDogbnVsbCksXG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IGNvbXBvc2UgPSA8QWN0aW9uVGFnIGV4dGVuZHMgc3RyaW5nID0gbmV2ZXI+KFxuICAuLi5wYXJ0czogUmVhZG9ubHlBcnJheTxXb3JrZmxvd1BhcnQ8QWN0aW9uVGFnPj5cbik6IFdvcmtmbG93Q29tcG9zZVJlc3VsdDxBY3Rpb25UYWc+ID0+IHtcbiAgY29uc3Qgc3RlcHM6IEFycmF5PFdvcmtmbG93U3RlcDxBY3Rpb25UYWc+PiA9IFtdXG4gIGNvbnN0IHNvdXJjZXM6IFJlY29yZDxzdHJpbmcsIHsgcmVhZG9ubHkgZnJhZ21lbnRJZD86IHN0cmluZyB9PiA9IHt9XG4gIGxldCBwb2xpY3k6IFdvcmtmbG93UG9saWN5VjEgfCB1bmRlZmluZWQgPSB1bmRlZmluZWRcblxuICBjb25zdCBvd25lcnNCeUtleSA9IG5ldyBNYXA8c3RyaW5nLCBBcnJheTx7IHJlYWRvbmx5IHN0ZXBLZXk6IHN0cmluZzsgcmVhZG9ubHkgZnJhZ21lbnRJZD86IHN0cmluZyB9Pj4oKVxuXG4gIGNvbnN0IHJlY29yZE93bmVyID0gKHN0ZXBLZXk6IHN0cmluZywgZnJhZ21lbnRJZDogc3RyaW5nIHwgdW5kZWZpbmVkKSA9PiB7XG4gICAgY29uc3QgbGlzdCA9IG93bmVyc0J5S2V5LmdldChzdGVwS2V5KSA/PyBbXVxuICAgIGxpc3QucHVzaCh7IHN0ZXBLZXksIC4uLihmcmFnbWVudElkID8geyBmcmFnbWVudElkIH0gOiBudWxsKSB9KVxuICAgIG93bmVyc0J5S2V5LnNldChzdGVwS2V5LCBsaXN0KVxuICB9XG5cbiAgY29uc3QgcmVjb3JkT3duZXJzID0gKFxuICAgIHN0ZXA6IFdvcmtmbG93U3RlcDxBY3Rpb25UYWc+LFxuICAgIHJlc29sdmVGcmFnbWVudElkOiAoc3RlcEtleTogc3RyaW5nKSA9PiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gICk6IHZvaWQgPT4ge1xuICAgIHJlY29yZE93bmVyKHN0ZXAua2V5LCByZXNvbHZlRnJhZ21lbnRJZChzdGVwLmtleSkpXG4gICAgaWYgKHN0ZXAua2luZCAhPT0gJ2NhbGwnKSByZXR1cm5cbiAgICBmb3IgKGNvbnN0IGlubmVyIG9mIHN0ZXAub25TdWNjZXNzKSByZWNvcmRPd25lcnMoaW5uZXIsIHJlc29sdmVGcmFnbWVudElkKVxuICAgIGZvciAoY29uc3QgaW5uZXIgb2Ygc3RlcC5vbkZhaWx1cmUpIHJlY29yZE93bmVycyhpbm5lciwgcmVzb2x2ZUZyYWdtZW50SWQpXG4gIH1cblxuICBmb3IgKGNvbnN0IHBhcnQgb2YgcGFydHMpIHtcbiAgICBpZiAoaXNSZWFkb25seUFycmF5KHBhcnQpKSB7XG4gICAgICBzdGVwcy5wdXNoKC4uLnBhcnQpXG4gICAgICBmb3IgKGNvbnN0IHN0ZXAgb2YgcGFydCkgcmVjb3JkT3duZXJzKHN0ZXAsICgpID0+IHVuZGVmaW5lZClcbiAgICAgIGNvbnRpbnVlXG4gICAgfVxuXG4gICAgLy8gZnJhZ21lbnQgLyBjb21wb3NlUmVzdWx0IChib3RoIGNhcnJ5IGBzdGVwc2ApXG4gICAgY29uc3QgcGFydFN0ZXBzID0gcGFydC5zdGVwc1xuICAgIHN0ZXBzLnB1c2goLi4ucGFydFN0ZXBzKVxuXG4gICAgY29uc3QgcGFydFNvdXJjZXMgPSBwYXJ0LnNvdXJjZXNcbiAgICBpZiAocGFydFNvdXJjZXMgJiYgdHlwZW9mIHBhcnRTb3VyY2VzID09PSAnb2JqZWN0Jykge1xuICAgICAgZm9yIChjb25zdCBrIG9mIE9iamVjdC5rZXlzKHBhcnRTb3VyY2VzKS5zb3J0KCkpIHtcbiAgICAgICAgc291cmNlc1trXSA9IHsgLi4ucGFydFNvdXJjZXNba10hIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBmcmFnbWVudElkID0gJ2ZyYWdtZW50SWQnIGluIHBhcnQgPyBwYXJ0LmZyYWdtZW50SWQgOiB1bmRlZmluZWRcbiAgICBpZiAodHlwZW9mIGZyYWdtZW50SWQgPT09ICdzdHJpbmcnICYmIGZyYWdtZW50SWQubGVuZ3RoID4gMCkge1xuICAgICAgZm9yIChjb25zdCBzdGVwIG9mIHBhcnRTdGVwcyBhcyBSZWFkb25seUFycmF5PFdvcmtmbG93U3RlcFYxPikge1xuICAgICAgICByZWNvcmRTb3VyY2VzRm9yRnJhZ21lbnQoc291cmNlcywgZnJhZ21lbnRJZCwgc3RlcClcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCByZXNvbHZlRnJhZ21lbnRJZEZvclBhcnQgPSAoc3RlcEtleTogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkID0+IHtcbiAgICAgIGlmICh0eXBlb2YgZnJhZ21lbnRJZCA9PT0gJ3N0cmluZycgJiYgZnJhZ21lbnRJZC5sZW5ndGggPiAwKSByZXR1cm4gZnJhZ21lbnRJZFxuICAgICAgY29uc3QgZnJvbVNvdXJjZXMgPSBwYXJ0U291cmNlcz8uW3N0ZXBLZXldPy5mcmFnbWVudElkXG4gICAgICByZXR1cm4gdHlwZW9mIGZyb21Tb3VyY2VzID09PSAnc3RyaW5nJyAmJiBmcm9tU291cmNlcy5sZW5ndGggPiAwID8gZnJvbVNvdXJjZXMgOiB1bmRlZmluZWRcbiAgICB9XG4gICAgZm9yIChjb25zdCBzdGVwIG9mIHBhcnRTdGVwcykgcmVjb3JkT3duZXJzKHN0ZXAsIHJlc29sdmVGcmFnbWVudElkRm9yUGFydClcblxuICAgIHBvbGljeSA9IG1lcmdlUG9saWN5KHBvbGljeSwgcGFydC5wb2xpY3kpXG4gIH1cblxuICBjb25zdCBmaW5hbFNvdXJjZXM6IFdvcmtmbG93RGVmVjFbJ3NvdXJjZXMnXSB8IHVuZGVmaW5lZCA9IE9iamVjdC5rZXlzKHNvdXJjZXMpLmxlbmd0aCA+IDAgPyBzb3VyY2VzIDogdW5kZWZpbmVkXG4gIGNvbnN0IGR1cGxpY2F0ZUtleXMgPSBBcnJheS5mcm9tKG93bmVyc0J5S2V5LmVudHJpZXMoKSlcbiAgICAuZmlsdGVyKChbLCBvd25lcnNdKSA9PiBvd25lcnMubGVuZ3RoID4gMSlcbiAgICAubWFwKChba10pID0+IGspXG4gICAgLnNvcnQoKVxuICBpZiAoZHVwbGljYXRlS2V5cy5sZW5ndGggPiAwKSB7XG4gICAgY29uc3QgayA9IGR1cGxpY2F0ZUtleXNbMF0hXG4gICAgdGhyb3cgbWFrZVdvcmtmbG93RXJyb3Ioe1xuICAgICAgY29kZTogJ1dPUktGTE9XX0RVUExJQ0FURV9TVEVQX0tFWScsXG4gICAgICBtZXNzYWdlOiBgRHVwbGljYXRlIHN0ZXBLZXkgXCIke2t9XCIgZGV0ZWN0ZWQgZHVyaW5nIGNvbXBvc2l0aW9uLmAsXG4gICAgICBzb3VyY2U6IHsgc3RlcEtleTogayB9LFxuICAgICAgZGV0YWlsOiB7IGR1cGxpY2F0ZUtleTogaywgb3duZXJzOiBvd25lcnNCeUtleS5nZXQoaykgPz8gW10gfSxcbiAgICB9KVxuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBzdGVwcyxcbiAgICAuLi4oZmluYWxTb3VyY2VzID8geyBzb3VyY2VzOiBmaW5hbFNvdXJjZXMgfSA6IG51bGwpLFxuICAgIC4uLihwb2xpY3kgPyB7IHBvbGljeSB9IDogbnVsbCksXG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IG1ha2UgPSA8TSA9IHVua25vd24+KGlucHV0OiB7XG4gIHJlYWRvbmx5IGFzdFZlcnNpb24/OiAxXG4gIHJlYWRvbmx5IGxvY2FsSWQ6IHN0cmluZ1xuICByZWFkb25seSB0cmlnZ2VyOiBXb3JrZmxvd1RyaWdnZXI8QWN0aW9uVGFnc09mTW9kdWxlPE0+PlxuICByZWFkb25seSBwb2xpY3k/OiBXb3JrZmxvd1BvbGljeVYxXG4gIHJlYWRvbmx5IHN0ZXBzOiBXb3JrZmxvd1N0ZXBzSW5wdXQ8QWN0aW9uVGFnc09mTW9kdWxlPE0+PlxuICByZWFkb25seSBtZXRhPzogeyByZWFkb25seSBnZW5lcmF0b3I/OiBKc29uVmFsdWUgfVxufSk6IFdvcmtmbG93ID0+IHtcbiAgY29uc3QgbG9jYWxJZCA9IGFzTm9uRW1wdHlTdHJpbmcoaW5wdXQubG9jYWxJZClcbiAgaWYgKCFsb2NhbElkKSB7XG4gICAgdGhyb3cgbWFrZVdvcmtmbG93RXJyb3Ioe1xuICAgICAgY29kZTogJ1dPUktGTE9XX0lOVkFMSURfREVGJyxcbiAgICAgIG1lc3NhZ2U6ICdXb3JrZmxvdy5tYWtlOiBsb2NhbElkIG11c3QgYmUgYSBub24tZW1wdHkgc3RyaW5nLicsXG4gICAgICBkZXRhaWw6IHsgbG9jYWxJZDogaW5wdXQubG9jYWxJZCB9LFxuICAgIH0pXG4gIH1cblxuICBjb25zdCBzdGVwc0lucHV0ID0gcmVzb2x2ZVN0ZXBzSW5wdXQoaW5wdXQuc3RlcHMpXG4gIGNvbnN0IG1lcmdlZCA9IG1lcmdlUG9saWN5KGlucHV0LnBvbGljeSwgc3RlcHNJbnB1dC5wb2xpY3kpXG5cbiAgY29uc3QgZGVmOiBXb3JrZmxvd0RlZlYxID0gbm9ybWFsaXplV29ya2Zsb3dEZWZWMSh7XG4gICAgYXN0VmVyc2lvbjogMSxcbiAgICBsb2NhbElkLFxuICAgIHRyaWdnZXI6IGlucHV0LnRyaWdnZXIsXG4gICAgLi4uKG1lcmdlZCA/IHsgcG9saWN5OiBtZXJnZWQgfSA6IG51bGwpLFxuICAgIHN0ZXBzOiBzdGVwc0lucHV0LnN0ZXBzLFxuICAgIC4uLihzdGVwc0lucHV0LnNvdXJjZXMgPyB7IHNvdXJjZXM6IHN0ZXBzSW5wdXQuc291cmNlcyB9IDogbnVsbCksXG4gICAgLi4uKGlucHV0Lm1ldGEgPyB7IG1ldGE6IGlucHV0Lm1ldGEgfSA6IG51bGwpLFxuICB9KVxuXG4gIGNvbnN0IHN0YXRpY0lyQ2FjaGUgPSBuZXcgTWFwPHN0cmluZywgV29ya2Zsb3dTdGF0aWNJclYxPigpXG5cbiAgcmV0dXJuIHtcbiAgICBfdGFnOiAnV29ya2Zsb3cnLFxuICAgIGRlZixcbiAgICB0b0pTT046ICgpID0+IGRlZixcbiAgICB2YWxpZGF0ZTogKCkgPT4gdmFsaWRhdGVXb3JrZmxvd0RlZlYxKGRlZiksXG4gICAgZXhwb3J0U3RhdGljSXI6IChtb2R1bGVJZCkgPT4ge1xuICAgICAgY29uc3QgY2FjaGVkID0gc3RhdGljSXJDYWNoZS5nZXQobW9kdWxlSWQpXG4gICAgICBpZiAoY2FjaGVkKSByZXR1cm4gY2FjaGVkXG4gICAgICBjb25zdCBpciA9IGNvbXBpbGVXb3JrZmxvd1N0YXRpY0lyVjEoeyBtb2R1bGVJZCwgZGVmIH0pXG4gICAgICBzdGF0aWNJckNhY2hlLnNldChtb2R1bGVJZCwgaXIpXG4gICAgICByZXR1cm4gaXJcbiAgICB9LFxuICAgIGluc3RhbGw6IChtb2R1bGVUYWcpID0+XG4gICAgICBXb3JrZmxvd1J1bnRpbWUuaW5zdGFsbE9uZSh7XG4gICAgICAgIG1vZHVsZVRhZzogbW9kdWxlVGFnIGFzIHVua25vd24gYXMgUGFyYW1ldGVyczx0eXBlb2YgV29ya2Zsb3dSdW50aW1lLmluc3RhbGxPbmU+WzBdWydtb2R1bGVUYWcnXSxcbiAgICAgICAgcHJvZ3JhbTogeyBfdGFnOiAnV29ya2Zsb3cnLCBkZWYgfSxcbiAgICAgIH0pLFxuICB9IHNhdGlzZmllcyBXb3JrZmxvd1xufVxuXG5leHBvcnQgY29uc3QgZnJvbUpTT04gPSA8QWN0aW9uVGFnIGV4dGVuZHMgc3RyaW5nID0gc3RyaW5nPihkZWY6IFdvcmtmbG93RGVmPEFjdGlvblRhZz4pOiBXb3JrZmxvdyA9PlxuICBtYWtlKHtcbiAgICBsb2NhbElkOiBkZWYubG9jYWxJZCxcbiAgICB0cmlnZ2VyOiBkZWYudHJpZ2dlcixcbiAgICAuLi4oZGVmLnBvbGljeSA/IHsgcG9saWN5OiBkZWYucG9saWN5IH0gOiBudWxsKSxcbiAgICBzdGVwczoge1xuICAgICAgc3RlcHM6IGRlZi5zdGVwcyxcbiAgICAgIC4uLihkZWYuc291cmNlcyA/IHsgc291cmNlczogZGVmLnNvdXJjZXMgfSA6IG51bGwpLFxuICAgIH0sXG4gICAgLi4uKGRlZi5tZXRhID8geyBtZXRhOiBkZWYubWV0YSB9IDogbnVsbCksXG4gIH0pXG4iLCAiaW1wb3J0IHR5cGUgeyBDb250ZXh0IH0gZnJvbSAnZWZmZWN0J1xuXG4vKipcbiAqIFNlcnZpY2VJZCBjb250cmFjdCAoc3BlY3MvMDc4LW1vZHVsZS1zZXJ2aWNlLW1hbmlmZXN0L2NvbnRyYWN0cy9zZXJ2aWNlLWlkLm1kKTpcbiAqIC0gU3RhYmxlIHN0cmluZyBkZXJpdmVkIGZyb20gQ29udGV4dC5UYWcgYnkgcHJpb3JpdHk6IHRhZy5rZXkgPz8gdGFnLmlkID8/IHRhZy5faWRcbiAqIC0gdGFnLnRvU3RyaW5nKCkgaXMgZm9yYmlkZGVuIGFzIGFuIGlkZW50aXR5IHNvdXJjZSAoZGlhZ25vc3RpY3Mgb25seSkuXG4gKi9cblxuZXhwb3J0IHR5cGUgU2VydmljZUlkID0gc3RyaW5nXG5cbmNvbnN0IGFzTm9uRW1wdHlTdHJpbmcgPSAodmFsdWU6IHVua25vd24pOiBzdHJpbmcgfCB1bmRlZmluZWQgPT5cbiAgdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyAmJiB2YWx1ZS5sZW5ndGggPiAwID8gdmFsdWUgOiB1bmRlZmluZWRcblxuZXhwb3J0IGNvbnN0IGZyb21UYWcgPSAodGFnOiBDb250ZXh0LlRhZzxhbnksIGFueT4pOiBTZXJ2aWNlSWQgfCB1bmRlZmluZWQgPT4ge1xuICBjb25zdCBhbnlUYWcgPSB0YWcgYXMgYW55XG4gIHJldHVybiBhc05vbkVtcHR5U3RyaW5nKGFueVRhZy5rZXkpID8/IGFzTm9uRW1wdHlTdHJpbmcoYW55VGFnLmlkKSA/PyBhc05vbkVtcHR5U3RyaW5nKGFueVRhZy5faWQpXG59XG5cbmV4cG9ydCBjb25zdCByZXF1aXJlRnJvbVRhZyA9ICh0YWc6IENvbnRleHQuVGFnPGFueSwgYW55Piwgb3B0aW9ucz86IHsgcmVhZG9ubHkgaGludD86IHN0cmluZyB9KTogU2VydmljZUlkID0+IHtcbiAgY29uc3QgaWQgPSBmcm9tVGFnKHRhZylcbiAgaWYgKGlkKSByZXR1cm4gaWRcblxuICBjb25zdCBoaW50ID1cbiAgICBvcHRpb25zPy5oaW50ID8/XG4gICAgJ0RlZmluZSB0aGUgVGFnIHdpdGggYSBzdGFibGUgc3RyaW5nIGtleSwgZS5nLiBgY2xhc3MgWCBleHRlbmRzIENvbnRleHQuVGFnKFwibXktc3ZjL3hcIik8WCwgU2VydmljZT4oKSB7fWAuJ1xuXG4gIHRocm93IG5ldyBFcnJvcihgW0ludmFsaWRTZXJ2aWNlSWRdIFRhZyBpcyBtaXNzaW5nIGEgc3RhYmxlIGlkICh0YWcua2V5L3RhZy5pZC90YWcuX2lkKS5cXG4ke2hpbnR9YClcbn1cbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxTQUFTLGVBQWU7OztBQ1V4QixJQUFNLG1CQUFtQixDQUFDLFVBQ3hCLE9BQU8sVUFBVSxZQUFZLE1BQU0sU0FBUyxJQUFJLFFBQVE7QUFFbkQsSUFBTSxVQUFVLENBQUMsUUFBc0Q7QUFDNUUsUUFBTSxTQUFTO0FBQ2YsU0FBTyxpQkFBaUIsT0FBTyxHQUFHLEtBQUssaUJBQWlCLE9BQU8sRUFBRSxLQUFLLGlCQUFpQixPQUFPLEdBQUc7QUFDbkc7OztBRHdEQSxJQUFNLGlDQUFOLGNBQTZDLFFBQVEsSUFBSSw0QkFBNEIsRUFHbkYsRUFBRTtBQUFDO0FBRUUsSUFBTSxjQUFjO0FBQUEsRUFDekIsZUFBZTtBQUNqQjtBQUVPLElBQU0sWUFBWSxDQUEwRCxZQUFlO0FBR2hHLFNBQU87QUFBQSxJQUNMLFVBQVUsQ0FBQyxjQUF5QixTQUFTLFNBQVM7QUFBQSxJQUN0RDtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0EsVUFBVSxDQUFDLFNBQWdHLFNBQVMsSUFBSTtBQUFBLElBQ3hIO0FBQUEsSUFDQSxVQUFVLENBQUMsU0FRTCxTQUFvQixJQUFJO0FBQUEsSUFDOUIsTUFBTSxDQUFVLFNBUVYsS0FBSyxJQUFJO0FBQUEsSUFDZixVQUFVLENBQUMsWUFBb0IsVUFBa0QsU0FBb0IsWUFBWSxLQUFLO0FBQUEsSUFDdEgsWUFBWSxDQUFDLE9BQXdCLFNBQWtDLFdBQXNCLE9BQU8sSUFBSTtBQUFBLElBQ3hHLFNBQVMsSUFBSSxVQUFrRCxRQUFtQixHQUFHLEtBQUs7QUFBQSxJQUMxRixNQUFNLENBQUMsVUFPRCxLQUFRLEtBQUs7QUFBQSxJQUNuQixVQUFVLENBQUMsUUFBZ0MsU0FBb0IsR0FBRztBQUFBLEVBQ3BFO0FBQ0Y7QUEwQkEsSUFBTSxXQUFXLENBQUMsVUFDaEIsT0FBTyxVQUFVLFlBQVksVUFBVSxRQUFRLENBQUMsTUFBTSxRQUFRLEtBQUs7QUFFckUsSUFBTSxrQkFBa0IsQ0FBQyxVQUFvRCxNQUFNLFFBQVEsS0FBSztBQUVoRyxJQUFNQSxvQkFBbUIsQ0FBQyxVQUN4QixPQUFPLFVBQVUsWUFBWSxNQUFNLEtBQUssRUFBRSxTQUFTLElBQUksTUFBTSxLQUFLLElBQUk7QUFFeEUsSUFBTSxjQUFjLENBQUMsTUFBb0MsVUFBc0U7QUFDN0gsTUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFPLFFBQU87QUFDNUIsU0FBTztBQUFBLElBQ0wsR0FBSSxRQUFRLENBQUM7QUFBQSxJQUNiLEdBQUksU0FBUyxDQUFDO0FBQUEsRUFDaEI7QUFDRjtBQUVBLElBQU0sb0JBQW9CLENBQUMsT0FBc0MsVUFBMEQ7QUFDekgsUUFBTSxtQkFBbUIsTUFBTTtBQUMvQixRQUFNLGVBQWUsTUFBTTtBQUUzQixRQUFNLFFBQVEsQ0FBQyxTQUF5QztBQUN0RCxRQUFJLEtBQUssU0FBUyxPQUFRLFFBQU87QUFFakMsUUFBSSxVQUFVO0FBQ2QsVUFBTSxZQUFZLEtBQUssYUFBYTtBQUNwQyxRQUFJLGNBQWMsS0FBSyxVQUFXLFdBQVU7QUFFNUMsVUFBTSxRQUFRLEtBQUssU0FBUztBQUM1QixRQUFJLFVBQVUsS0FBSyxNQUFPLFdBQVU7QUFFcEMsVUFBTSxZQUFZLEtBQUssVUFBVSxJQUFJLEtBQUs7QUFDMUMsVUFBTSxZQUFZLEtBQUssVUFBVSxJQUFJLEtBQUs7QUFDMUMsUUFBSSxjQUFjLEtBQUssVUFBVyxXQUFVO0FBQzVDLFFBQUksY0FBYyxLQUFLLFVBQVcsV0FBVTtBQUU1QyxRQUFJLENBQUMsUUFBUyxRQUFPO0FBRXJCLFdBQU87QUFBQSxNQUNMLEdBQUc7QUFBQSxNQUNILEdBQUksY0FBYyxTQUFZLEVBQUUsVUFBVSxJQUFJO0FBQUEsTUFDOUMsR0FBSSxVQUFVLFNBQVksRUFBRSxNQUFNLElBQUk7QUFBQSxNQUN0QztBQUFBLE1BQ0E7QUFBQSxJQUNGO0FBQUEsRUFDRjtBQUVBLFNBQU8sTUFBTSxJQUFJLEtBQUs7QUFDeEI7QUFFQSxJQUFNLG9CQUFvQixDQUFDLFVBQTRDO0FBQ3JFLE1BQUksTUFBTSxRQUFRLEtBQUssR0FBRztBQUN4QixXQUFPLEVBQUUsT0FBTyxNQUF1QztBQUFBLEVBQ3pEO0FBQ0EsTUFBSSxTQUFTLEtBQUssS0FBSyxNQUFNLFFBQVEsTUFBTSxLQUFLLEdBQUc7QUFDakQsV0FBTztBQUFBLEVBQ1Q7QUFDQSxRQUFNLGtCQUFrQjtBQUFBLElBQ3RCLE1BQU07QUFBQSxJQUNOLFNBQVM7QUFBQSxJQUNULFFBQVEsRUFBRSxPQUFPLE1BQU07QUFBQSxFQUN6QixDQUFDO0FBQ0g7QUFFQSxJQUFNLDJCQUEyQixDQUMvQixTQUNBLFlBQ0EsU0FDUztBQUNULFVBQVEsS0FBSyxHQUFHLElBQUksRUFBRSxXQUFXO0FBQ2pDLE1BQUksS0FBSyxTQUFTLE9BQVE7QUFDMUIsYUFBVyxTQUFTLEtBQUssVUFBVywwQkFBeUIsU0FBUyxZQUFZLEtBQUs7QUFDdkYsYUFBVyxTQUFTLEtBQUssVUFBVywwQkFBeUIsU0FBUyxZQUFZLEtBQUs7QUFDekY7QUFFTyxJQUFNLFdBQVcsQ0FBMkIsZUFBbUY7QUFBQSxFQUNwSSxNQUFNO0FBQUEsRUFDTjtBQUNGO0FBRU8sSUFBTSxVQUFVLE9BQWtFO0FBQUEsRUFDdkYsTUFBTTtBQUFBLEVBQ04sT0FBTztBQUNUO0FBRU8sSUFBTSxTQUFTLE9BQWlFO0FBQUEsRUFDckYsTUFBTTtBQUFBLEVBQ04sT0FBTztBQUNUO0FBRU8sSUFBTSxVQUFVLE9BQW9CLEVBQUUsTUFBTSxVQUFVO0FBRXRELElBQU0sY0FBYyxDQUFDLGFBQWtDLEVBQUUsTUFBTSxnQkFBZ0IsUUFBUTtBQUV2RixJQUFNLGFBQWEsQ0FBQyxXQUFtQyxFQUFFLE1BQU0sU0FBUyxNQUFNO0FBRTlFLElBQU0sU0FBUyxDQUFDLFlBQXNELEVBQUUsTUFBTSxVQUFVLE9BQU87QUFFL0YsSUFBTSxRQUFRLENBQUMsV0FBb0QsRUFBRSxNQUFNLFNBQVMsTUFBTTtBQUUxRixJQUFNLFdBQVcsQ0FBMkIsVUFJWTtBQUFBLEVBQzdELE1BQU07QUFBQSxFQUNOLEtBQUssS0FBSztBQUFBLEVBQ1YsV0FBVyxLQUFLO0FBQUEsRUFDaEIsR0FBSSxLQUFLLFVBQVUsRUFBRSxTQUFTLEtBQUssUUFBUSxJQUFJO0FBQ2pEO0FBRU8sSUFBTSxRQUFRLENBQUMsVUFBbUc7QUFBQSxFQUN2SCxNQUFNO0FBQUEsRUFDTixLQUFLLEtBQUs7QUFBQSxFQUNWLElBQUksS0FBSztBQUNYO0FBRU8sSUFBTSxXQUFXLENBQW1DLFVBUUE7QUFBQSxFQUN6RCxNQUFNO0FBQUEsRUFDTixLQUFLLEtBQUs7QUFBQSxFQUNWLFdBQVcsS0FBSztBQUFBLEVBQ2hCLEdBQUksS0FBSyxRQUFRLEVBQUUsT0FBTyxLQUFLLE1BQU0sSUFBSTtBQUFBLEVBQ3pDLEdBQUksS0FBSyxjQUFjLFNBQVksRUFBRSxXQUFXLEtBQUssVUFBVSxJQUFJO0FBQUEsRUFDbkUsR0FBSSxLQUFLLFFBQVEsRUFBRSxPQUFPLEtBQUssTUFBTSxJQUFJO0FBQUEsRUFDekMsV0FBVyxLQUFLLGFBQWEsQ0FBQztBQUFBLEVBQzlCLFdBQVcsS0FBSyxhQUFhLENBQUM7QUFDaEM7QUFFTyxJQUFNLE9BQU8sQ0FBNEMsU0FRTjtBQUN4RCxRQUFNLFlBQVksUUFBaUIsS0FBSyxPQUFPO0FBQy9DLE1BQUksQ0FBQyxXQUFXO0FBQ2QsVUFBTSxrQkFBa0I7QUFBQSxNQUN0QixNQUFNO0FBQUEsTUFDTixTQUFTO0FBQUEsTUFDVCxRQUFRLEVBQUUsS0FBSyxPQUFPLEtBQUssT0FBTyxFQUFFO0FBQUEsSUFDdEMsQ0FBQztBQUFBLEVBQ0g7QUFFQSxTQUFPLFNBQW9CO0FBQUEsSUFDekIsR0FBRztBQUFBLElBQ0g7QUFBQSxFQUNGLENBQUM7QUFDSDtBQUVPLElBQU0sV0FBVyxDQUN0QixZQUNBLFdBQ2lDO0FBQUEsRUFDakM7QUFBQSxFQUNBO0FBQ0Y7QUFFTyxJQUFNLGFBQWEsQ0FDeEIsT0FDQSxTQUNxQztBQUNyQyxNQUFJO0FBQ0osTUFBSSxnQkFBZ0IsSUFBSSxHQUFHO0FBQ3pCLGlCQUFhLEVBQUUsT0FBTyxLQUFLO0FBQUEsRUFDN0IsT0FBTztBQUNMLFVBQU0sY0FBdUI7QUFDN0IsUUFBSSxDQUFDLFNBQVMsV0FBVyxLQUFLLENBQUMsZ0JBQWdCLFlBQVksS0FBSyxHQUFHO0FBQ2pFLFlBQU0sa0JBQWtCO0FBQUEsUUFDdEIsTUFBTTtBQUFBLFFBQ04sU0FBUztBQUFBLFFBQ1QsUUFBUSxFQUFFLEtBQUs7QUFBQSxNQUNqQixDQUFDO0FBQUEsSUFDSDtBQUNBLGlCQUFhO0FBQUEsTUFDWCxPQUFPLEtBQUs7QUFBQSxNQUNaLEdBQUksS0FBSyxVQUFVLEVBQUUsU0FBUyxLQUFLLFFBQVEsSUFBSTtBQUFBLE1BQy9DLEdBQUksS0FBSyxTQUFTLEVBQUUsUUFBUSxLQUFLLE9BQU8sSUFBSTtBQUFBLElBQzlDO0FBQUEsRUFDRjtBQUVBLFFBQU0sUUFBUSxrQkFBa0IsV0FBVyxPQUF3QyxLQUFLO0FBQ3hGLFFBQU0sZUFBNkMsTUFBTTtBQUN2RCxVQUFNLGNBQWMsTUFBTTtBQUMxQixVQUFNLFdBQVcsTUFBTTtBQUN2QixXQUFPLGdCQUFnQixVQUFhLGFBQWEsU0FBWSxFQUFFLGFBQWEsU0FBUyxJQUFJO0FBQUEsRUFDM0YsR0FBRztBQUdILFFBQU0sYUFBYSxZQUFZLGFBQWEsV0FBVyxNQUFNO0FBRTdELFNBQU87QUFBQSxJQUNMO0FBQUEsSUFDQSxHQUFJLFdBQVcsVUFBVSxFQUFFLFNBQVMsV0FBVyxRQUFRLElBQUk7QUFBQSxJQUMzRCxHQUFJLGFBQWEsRUFBRSxRQUFRLFdBQVcsSUFBSTtBQUFBLEVBQzVDO0FBQ0Y7QUFFTyxJQUFNLFVBQVUsSUFDbEIsVUFDa0M7QUFDckMsUUFBTSxRQUF3QyxDQUFDO0FBQy9DLFFBQU0sVUFBNEQsQ0FBQztBQUNuRSxNQUFJLFNBQXVDO0FBRTNDLFFBQU0sY0FBYyxvQkFBSSxJQUErRTtBQUV2RyxRQUFNLGNBQWMsQ0FBQyxTQUFpQixlQUFtQztBQUN2RSxVQUFNLE9BQU8sWUFBWSxJQUFJLE9BQU8sS0FBSyxDQUFDO0FBQzFDLFNBQUssS0FBSyxFQUFFLFNBQVMsR0FBSSxhQUFhLEVBQUUsV0FBVyxJQUFJLEtBQU0sQ0FBQztBQUM5RCxnQkFBWSxJQUFJLFNBQVMsSUFBSTtBQUFBLEVBQy9CO0FBRUEsUUFBTSxlQUFlLENBQ25CLE1BQ0Esc0JBQ1M7QUFDVCxnQkFBWSxLQUFLLEtBQUssa0JBQWtCLEtBQUssR0FBRyxDQUFDO0FBQ2pELFFBQUksS0FBSyxTQUFTLE9BQVE7QUFDMUIsZUFBVyxTQUFTLEtBQUssVUFBVyxjQUFhLE9BQU8saUJBQWlCO0FBQ3pFLGVBQVcsU0FBUyxLQUFLLFVBQVcsY0FBYSxPQUFPLGlCQUFpQjtBQUFBLEVBQzNFO0FBRUEsYUFBVyxRQUFRLE9BQU87QUFDeEIsUUFBSSxnQkFBZ0IsSUFBSSxHQUFHO0FBQ3pCLFlBQU0sS0FBSyxHQUFHLElBQUk7QUFDbEIsaUJBQVcsUUFBUSxLQUFNLGNBQWEsTUFBTSxNQUFNLE1BQVM7QUFDM0Q7QUFBQSxJQUNGO0FBR0EsVUFBTSxZQUFZLEtBQUs7QUFDdkIsVUFBTSxLQUFLLEdBQUcsU0FBUztBQUV2QixVQUFNLGNBQWMsS0FBSztBQUN6QixRQUFJLGVBQWUsT0FBTyxnQkFBZ0IsVUFBVTtBQUNsRCxpQkFBVyxLQUFLLE9BQU8sS0FBSyxXQUFXLEVBQUUsS0FBSyxHQUFHO0FBQy9DLGdCQUFRLENBQUMsSUFBSSxFQUFFLEdBQUcsWUFBWSxDQUFDLEVBQUc7QUFBQSxNQUNwQztBQUFBLElBQ0Y7QUFFQSxVQUFNLGFBQWEsZ0JBQWdCLE9BQU8sS0FBSyxhQUFhO0FBQzVELFFBQUksT0FBTyxlQUFlLFlBQVksV0FBVyxTQUFTLEdBQUc7QUFDM0QsaUJBQVcsUUFBUSxXQUE0QztBQUM3RCxpQ0FBeUIsU0FBUyxZQUFZLElBQUk7QUFBQSxNQUNwRDtBQUFBLElBQ0Y7QUFFQSxVQUFNLDJCQUEyQixDQUFDLFlBQXdDO0FBQ3hFLFVBQUksT0FBTyxlQUFlLFlBQVksV0FBVyxTQUFTLEVBQUcsUUFBTztBQUNwRSxZQUFNLGNBQWMsY0FBYyxPQUFPLEdBQUc7QUFDNUMsYUFBTyxPQUFPLGdCQUFnQixZQUFZLFlBQVksU0FBUyxJQUFJLGNBQWM7QUFBQSxJQUNuRjtBQUNBLGVBQVcsUUFBUSxVQUFXLGNBQWEsTUFBTSx3QkFBd0I7QUFFekUsYUFBUyxZQUFZLFFBQVEsS0FBSyxNQUFNO0FBQUEsRUFDMUM7QUFFQSxRQUFNLGVBQXFELE9BQU8sS0FBSyxPQUFPLEVBQUUsU0FBUyxJQUFJLFVBQVU7QUFDdkcsUUFBTSxnQkFBZ0IsTUFBTSxLQUFLLFlBQVksUUFBUSxDQUFDLEVBQ25ELE9BQU8sQ0FBQyxDQUFDLEVBQUUsTUFBTSxNQUFNLE9BQU8sU0FBUyxDQUFDLEVBQ3hDLElBQUksQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEVBQ2QsS0FBSztBQUNSLE1BQUksY0FBYyxTQUFTLEdBQUc7QUFDNUIsVUFBTSxJQUFJLGNBQWMsQ0FBQztBQUN6QixVQUFNLGtCQUFrQjtBQUFBLE1BQ3RCLE1BQU07QUFBQSxNQUNOLFNBQVMsc0JBQXNCLENBQUM7QUFBQSxNQUNoQyxRQUFRLEVBQUUsU0FBUyxFQUFFO0FBQUEsTUFDckIsUUFBUSxFQUFFLGNBQWMsR0FBRyxRQUFRLFlBQVksSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFO0FBQUEsSUFDOUQsQ0FBQztBQUFBLEVBQ0g7QUFFQSxTQUFPO0FBQUEsSUFDTDtBQUFBLElBQ0EsR0FBSSxlQUFlLEVBQUUsU0FBUyxhQUFhLElBQUk7QUFBQSxJQUMvQyxHQUFJLFNBQVMsRUFBRSxPQUFPLElBQUk7QUFBQSxFQUM1QjtBQUNGO0FBRU8sSUFBTSxPQUFPLENBQWMsVUFPbEI7QUFDZCxRQUFNLFVBQVVBLGtCQUFpQixNQUFNLE9BQU87QUFDOUMsTUFBSSxDQUFDLFNBQVM7QUFDWixVQUFNLGtCQUFrQjtBQUFBLE1BQ3RCLE1BQU07QUFBQSxNQUNOLFNBQVM7QUFBQSxNQUNULFFBQVEsRUFBRSxTQUFTLE1BQU0sUUFBUTtBQUFBLElBQ25DLENBQUM7QUFBQSxFQUNIO0FBRUEsUUFBTSxhQUFhLGtCQUFrQixNQUFNLEtBQUs7QUFDaEQsUUFBTSxTQUFTLFlBQVksTUFBTSxRQUFRLFdBQVcsTUFBTTtBQUUxRCxRQUFNLE1BQXFCLHVCQUF1QjtBQUFBLElBQ2hELFlBQVk7QUFBQSxJQUNaO0FBQUEsSUFDQSxTQUFTLE1BQU07QUFBQSxJQUNmLEdBQUksU0FBUyxFQUFFLFFBQVEsT0FBTyxJQUFJO0FBQUEsSUFDbEMsT0FBTyxXQUFXO0FBQUEsSUFDbEIsR0FBSSxXQUFXLFVBQVUsRUFBRSxTQUFTLFdBQVcsUUFBUSxJQUFJO0FBQUEsSUFDM0QsR0FBSSxNQUFNLE9BQU8sRUFBRSxNQUFNLE1BQU0sS0FBSyxJQUFJO0FBQUEsRUFDMUMsQ0FBQztBQUVELFFBQU0sZ0JBQWdCLG9CQUFJLElBQWdDO0FBRTFELFNBQU87QUFBQSxJQUNMLE1BQU07QUFBQSxJQUNOO0FBQUEsSUFDQSxRQUFRLE1BQU07QUFBQSxJQUNkLFVBQVUsTUFBTSxzQkFBc0IsR0FBRztBQUFBLElBQ3pDLGdCQUFnQixDQUFDLGFBQWE7QUFDNUIsWUFBTSxTQUFTLGNBQWMsSUFBSSxRQUFRO0FBQ3pDLFVBQUksT0FBUSxRQUFPO0FBQ25CLFlBQU0sS0FBSywwQkFBMEIsRUFBRSxVQUFVLElBQUksQ0FBQztBQUN0RCxvQkFBYyxJQUFJLFVBQVUsRUFBRTtBQUM5QixhQUFPO0FBQUEsSUFDVDtBQUFBLElBQ0EsU0FBUyxDQUFDLGNBQ1EsV0FBVztBQUFBLE1BQ3pCO0FBQUEsTUFDQSxTQUFTLEVBQUUsTUFBTSxZQUFZLElBQUk7QUFBQSxJQUNuQyxDQUFDO0FBQUEsRUFDTDtBQUNGO0FBRU8sSUFBTSxXQUFXLENBQW9DLFFBQzFELEtBQUs7QUFBQSxFQUNILFNBQVMsSUFBSTtBQUFBLEVBQ2IsU0FBUyxJQUFJO0FBQUEsRUFDYixHQUFJLElBQUksU0FBUyxFQUFFLFFBQVEsSUFBSSxPQUFPLElBQUk7QUFBQSxFQUMxQyxPQUFPO0FBQUEsSUFDTCxPQUFPLElBQUk7QUFBQSxJQUNYLEdBQUksSUFBSSxVQUFVLEVBQUUsU0FBUyxJQUFJLFFBQVEsSUFBSTtBQUFBLEVBQy9DO0FBQUEsRUFDQSxHQUFJLElBQUksT0FBTyxFQUFFLE1BQU0sSUFBSSxLQUFLLElBQUk7QUFDdEMsQ0FBQzsiLAogICJuYW1lcyI6IFsiYXNOb25FbXB0eVN0cmluZyJdCn0K