@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,474 @@
1
+ // @logix/core subpath bundles for @logix/sandbox
2
+
3
+ import {
4
+ exportStaticIr,
5
+ fnv1a32,
6
+ stableStringify
7
+ } from "./chunk-QGIM3FQK.js";
8
+ import {
9
+ getModuleTraitsProgram
10
+ } from "./chunk-6FKWRVP4.js";
11
+ import {
12
+ isJsonValue
13
+ } from "./chunk-RYSSJBGX.js";
14
+
15
+ // ../logix-core/src/internal/reflection/staticIr.ts
16
+ var isRecord = (value) => typeof value === "object" && value !== null && !Array.isArray(value);
17
+ var isModuleImpl = (value) => isRecord(value) && value._tag === "ModuleImpl" && isRecord(value.module);
18
+ var resolveModuleId = (input) => {
19
+ if (isModuleImpl(input)) {
20
+ const id = input.module.id;
21
+ return typeof id === "string" && id.length > 0 ? id : "unknown";
22
+ }
23
+ if (isRecord(input)) {
24
+ const id = input.id;
25
+ if (typeof id === "string" && id.length > 0) return id;
26
+ const tag = input.tag;
27
+ if (tag && (typeof tag === "object" || typeof tag === "function")) {
28
+ const tagId = tag.id;
29
+ if (typeof tagId === "string" && tagId.length > 0) return tagId;
30
+ }
31
+ }
32
+ return "unknown";
33
+ };
34
+ var resolveModuleTag = (input) => {
35
+ if (isModuleImpl(input)) return input.module;
36
+ if (isRecord(input) && input.tag) return input.tag;
37
+ return void 0;
38
+ };
39
+ var exportStaticIr2 = (module) => {
40
+ const tag = resolveModuleTag(module);
41
+ if (!tag) return void 0;
42
+ const program = getModuleTraitsProgram(tag);
43
+ if (!program) return void 0;
44
+ return exportStaticIr({
45
+ program,
46
+ moduleId: resolveModuleId(module)
47
+ });
48
+ };
49
+
50
+ // ../logix-core/src/internal/reflection/manifest.ts
51
+ var isRecord2 = (value) => typeof value === "object" && value !== null && !Array.isArray(value);
52
+ var isModuleImpl2 = (value) => isRecord2(value) && value._tag === "ModuleImpl" && isRecord2(value.module);
53
+ var resolveModuleId2 = (input) => {
54
+ if (isModuleImpl2(input)) {
55
+ const id = input.module.id;
56
+ return typeof id === "string" && id.length > 0 ? id : "unknown";
57
+ }
58
+ if (isRecord2(input)) {
59
+ const id = input.id;
60
+ if (typeof id === "string" && id.length > 0) return id;
61
+ const tag = input.tag;
62
+ if (tag && (typeof tag === "object" || typeof tag === "function")) {
63
+ const tagId = tag.id;
64
+ if (typeof tagId === "string" && tagId.length > 0) return tagId;
65
+ }
66
+ }
67
+ return "unknown";
68
+ };
69
+ var resolveActionKeys = (input) => {
70
+ const tag = isModuleImpl2(input) ? input.module : input?.tag;
71
+ const actionMap = tag?.shape?.actionMap;
72
+ if (!isRecord2(actionMap)) return [];
73
+ return Object.keys(actionMap).sort();
74
+ };
75
+ var resolveSchemaKeys = (input) => {
76
+ if (!isRecord2(input)) return void 0;
77
+ const schemas = input.schemas;
78
+ if (!isRecord2(schemas)) return void 0;
79
+ return Object.keys(schemas).sort();
80
+ };
81
+ var resolveSource = (input) => {
82
+ if (!isRecord2(input)) return void 0;
83
+ const dev = input.dev;
84
+ const source = dev?.source;
85
+ if (!isRecord2(source)) return void 0;
86
+ const file = source.file;
87
+ const line = source.line;
88
+ const column = source.column;
89
+ if (typeof file !== "string" || file.length === 0) return void 0;
90
+ if (typeof line !== "number" || !Number.isInteger(line) || line < 1) return void 0;
91
+ if (typeof column !== "number" || !Number.isInteger(column) || column < 1) return void 0;
92
+ return { file, line, column };
93
+ };
94
+ var resolveMeta = (input) => {
95
+ if (!isRecord2(input)) return void 0;
96
+ const meta = input.meta;
97
+ if (!isRecord2(meta)) return void 0;
98
+ const out = {};
99
+ for (const key of Object.keys(meta).sort()) {
100
+ const value = meta[key];
101
+ if (isJsonValue(value)) {
102
+ out[key] = value;
103
+ }
104
+ }
105
+ return Object.keys(out).length > 0 ? out : void 0;
106
+ };
107
+ var MODULE_INTERNAL = /* @__PURE__ */ Symbol.for("logix.module.internal");
108
+ var resolveLogicUnits = (input) => {
109
+ if (!isRecord2(input)) return void 0;
110
+ const internal = input[MODULE_INTERNAL];
111
+ const mounted = internal?.mounted;
112
+ if (!Array.isArray(mounted)) return void 0;
113
+ const out = [];
114
+ for (const unit of mounted) {
115
+ if (!isRecord2(unit)) continue;
116
+ const kind = unit.kind;
117
+ const id = unit.id;
118
+ if (typeof kind !== "string" || kind.length === 0) continue;
119
+ if (typeof id !== "string" || id.length === 0) continue;
120
+ const derived = unit.derived === true ? true : void 0;
121
+ const name = typeof unit.name === "string" ? unit.name : void 0;
122
+ out.push({ kind, id, derived, name });
123
+ }
124
+ out.sort((a, b) => a.id < b.id ? -1 : a.id > b.id ? 1 : a.kind.localeCompare(b.kind));
125
+ return out.length > 0 ? out : void 0;
126
+ };
127
+ var digestOf = (base) => `manifest:025:${fnv1a32(stableStringify(base))}`;
128
+ var utf8ByteLength = (value) => {
129
+ const json = JSON.stringify(value);
130
+ if (typeof TextEncoder !== "undefined") {
131
+ return new TextEncoder().encode(json).length;
132
+ }
133
+ return json.length;
134
+ };
135
+ var applyMaxBytes = (manifest, maxBytes) => {
136
+ const originalBytes = utf8ByteLength(manifest);
137
+ if (originalBytes <= maxBytes) return manifest;
138
+ const dropped = [];
139
+ const truncatedArrays = [];
140
+ const baseMarker = () => ({
141
+ truncated: true,
142
+ maxBytes,
143
+ originalBytes,
144
+ dropped,
145
+ truncatedArrays
146
+ });
147
+ const withMarker = (next2) => {
148
+ const meta = {
149
+ __logix: baseMarker()
150
+ };
151
+ return { ...next2, meta };
152
+ };
153
+ let next = withMarker(manifest);
154
+ const dropField = (field) => {
155
+ if (next[field] !== void 0) {
156
+ dropped.push(String(field));
157
+ next = withMarker({ ...next, [field]: void 0 });
158
+ }
159
+ };
160
+ dropField("meta");
161
+ if (utf8ByteLength(next) <= maxBytes) return next;
162
+ dropField("source");
163
+ if (utf8ByteLength(next) <= maxBytes) return next;
164
+ dropField("staticIr");
165
+ if (utf8ByteLength(next) <= maxBytes) return next;
166
+ dropField("logicUnits");
167
+ if (utf8ByteLength(next) <= maxBytes) return next;
168
+ dropField("schemaKeys");
169
+ if (utf8ByteLength(next) <= maxBytes) return next;
170
+ while (utf8ByteLength(next) > maxBytes && next.actionKeys.length > 1) {
171
+ truncatedArrays.push("actionKeys");
172
+ next = withMarker({
173
+ ...next,
174
+ actionKeys: next.actionKeys.slice(0, Math.ceil(next.actionKeys.length / 2))
175
+ });
176
+ }
177
+ return next;
178
+ };
179
+ var extractManifest = (module, options) => {
180
+ const manifestVersion = "025";
181
+ const moduleId = resolveModuleId2(module);
182
+ const actionKeys = resolveActionKeys(module);
183
+ const schemaKeys = resolveSchemaKeys(module);
184
+ const logicUnits = resolveLogicUnits(module);
185
+ const source = resolveSource(module);
186
+ const meta = resolveMeta(module);
187
+ const staticIr = options?.includeStaticIr ? exportStaticIr2(module) : void 0;
188
+ const digestBase = {
189
+ manifestVersion,
190
+ moduleId,
191
+ actionKeys,
192
+ schemaKeys,
193
+ logicUnits,
194
+ staticIrDigest: staticIr?.digest
195
+ };
196
+ const digest = digestOf(digestBase);
197
+ const manifest = {
198
+ manifestVersion,
199
+ moduleId,
200
+ actionKeys,
201
+ schemaKeys,
202
+ logicUnits,
203
+ source,
204
+ meta,
205
+ staticIr,
206
+ digest
207
+ };
208
+ const maxBytes = options?.budgets?.maxBytes;
209
+ if (typeof maxBytes === "number" && Number.isFinite(maxBytes) && maxBytes > 0) {
210
+ return applyMaxBytes(manifest, maxBytes);
211
+ }
212
+ return manifest;
213
+ };
214
+
215
+ // ../logix-core/src/internal/reflection/diff.ts
216
+ var SEVERITY_RANK = {
217
+ BREAKING: 0,
218
+ RISKY: 1,
219
+ INFO: 2
220
+ };
221
+ var uniqSorted = (input) => {
222
+ const out = Array.from(new Set(input.filter((x) => typeof x === "string" && x.length > 0)));
223
+ out.sort((a, b) => a.localeCompare(b));
224
+ return out;
225
+ };
226
+ var diffStringKeys = (before, after) => {
227
+ const beforeSet = new Set(uniqSorted(before ?? []));
228
+ const afterSet = new Set(uniqSorted(after ?? []));
229
+ const removed = [];
230
+ for (const k of beforeSet) {
231
+ if (!afterSet.has(k)) removed.push(k);
232
+ }
233
+ removed.sort((a, b) => a.localeCompare(b));
234
+ const added = [];
235
+ for (const k of afterSet) {
236
+ if (!beforeSet.has(k)) added.push(k);
237
+ }
238
+ added.sort((a, b) => a.localeCompare(b));
239
+ return { removed, added };
240
+ };
241
+ var eqJsonValue = (a, b) => stableStringify(a) === stableStringify(b);
242
+ var indexLogicUnits = (input) => {
243
+ const map = /* @__PURE__ */ new Map();
244
+ for (const unit of input ?? []) {
245
+ if (!unit || typeof unit !== "object") continue;
246
+ const id = unit.id;
247
+ if (typeof id !== "string" || id.length === 0) continue;
248
+ map.set(id, unit);
249
+ }
250
+ return map;
251
+ };
252
+ var diffManifest = (before, after, options) => {
253
+ const changes = [];
254
+ if (before.moduleId !== after.moduleId) {
255
+ changes.push({
256
+ severity: "BREAKING",
257
+ code: "moduleId.changed",
258
+ message: `moduleId changed (${before.moduleId} -> ${after.moduleId})`,
259
+ pointer: "/moduleId",
260
+ details: {
261
+ before: before.moduleId,
262
+ after: after.moduleId
263
+ }
264
+ });
265
+ }
266
+ if (before.manifestVersion !== after.manifestVersion) {
267
+ changes.push({
268
+ severity: "INFO",
269
+ code: "manifestVersion.changed",
270
+ message: `manifestVersion changed (${before.manifestVersion} -> ${after.manifestVersion})`,
271
+ pointer: "/manifestVersion",
272
+ details: {
273
+ before: before.manifestVersion,
274
+ after: after.manifestVersion
275
+ }
276
+ });
277
+ }
278
+ {
279
+ const { removed, added } = diffStringKeys(before.actionKeys, after.actionKeys);
280
+ if (removed.length > 0 || added.length > 0) {
281
+ changes.push({
282
+ severity: removed.length > 0 ? "BREAKING" : "INFO",
283
+ code: "actionKeys.changed",
284
+ message: removed.length > 0 ? `actionKeys removed: ${removed.join(", ")}` : `actionKeys added: ${added.join(", ")}`,
285
+ pointer: "/actionKeys",
286
+ details: { removed, added }
287
+ });
288
+ }
289
+ }
290
+ {
291
+ const { removed, added } = diffStringKeys(before.schemaKeys, after.schemaKeys);
292
+ if (removed.length > 0 || added.length > 0) {
293
+ changes.push({
294
+ severity: removed.length > 0 ? "BREAKING" : "INFO",
295
+ code: "schemaKeys.changed",
296
+ message: removed.length > 0 ? `schemaKeys removed: ${removed.join(", ")}` : `schemaKeys added: ${added.join(", ")}`,
297
+ pointer: "/schemaKeys",
298
+ details: { removed, added }
299
+ });
300
+ }
301
+ }
302
+ {
303
+ const beforeById = indexLogicUnits(before.logicUnits);
304
+ const afterById = indexLogicUnits(after.logicUnits);
305
+ const removed = [];
306
+ const added = [];
307
+ const kindChanged = [];
308
+ const riskyChanged = [];
309
+ for (const id of beforeById.keys()) {
310
+ if (!afterById.has(id)) removed.push(id);
311
+ }
312
+ for (const id of afterById.keys()) {
313
+ if (!beforeById.has(id)) added.push(id);
314
+ }
315
+ removed.sort((a, b) => a.localeCompare(b));
316
+ added.sort((a, b) => a.localeCompare(b));
317
+ for (const id of beforeById.keys()) {
318
+ const b = beforeById.get(id);
319
+ const a = afterById.get(id);
320
+ if (!b || !a) continue;
321
+ const fields = [];
322
+ if (b.kind !== a.kind) {
323
+ kindChanged.push({ id, before: b.kind, after: a.kind });
324
+ continue;
325
+ }
326
+ if (b.name !== a.name) fields.push("name");
327
+ if (b.derived !== a.derived) fields.push("derived");
328
+ if (fields.length > 0) riskyChanged.push({ id, fields });
329
+ }
330
+ kindChanged.sort((x, y) => x.id.localeCompare(y.id));
331
+ riskyChanged.sort((x, y) => x.id.localeCompare(y.id));
332
+ if (removed.length > 0) {
333
+ changes.push({
334
+ severity: "BREAKING",
335
+ code: "logicUnits.removed",
336
+ message: `logicUnits removed: ${removed.join(", ")}`,
337
+ pointer: "/logicUnits",
338
+ details: { removed }
339
+ });
340
+ }
341
+ if (kindChanged.length > 0) {
342
+ changes.push({
343
+ severity: "BREAKING",
344
+ code: "logicUnits.kindChanged",
345
+ message: `logicUnits kind changed: ${kindChanged.map((x) => x.id).join(", ")}`,
346
+ pointer: "/logicUnits",
347
+ details: { kindChanged }
348
+ });
349
+ }
350
+ if (added.length > 0) {
351
+ changes.push({
352
+ severity: "INFO",
353
+ code: "logicUnits.added",
354
+ message: `logicUnits added: ${added.join(", ")}`,
355
+ pointer: "/logicUnits",
356
+ details: { added }
357
+ });
358
+ }
359
+ if (riskyChanged.length > 0) {
360
+ changes.push({
361
+ severity: "RISKY",
362
+ code: "logicUnits.changed",
363
+ message: `logicUnits changed: ${riskyChanged.map((x) => x.id).join(", ")}`,
364
+ pointer: "/logicUnits",
365
+ details: { changed: riskyChanged }
366
+ });
367
+ }
368
+ }
369
+ {
370
+ const beforeDigest = before.staticIr?.digest;
371
+ const afterDigest = after.staticIr?.digest;
372
+ if (beforeDigest !== afterDigest) {
373
+ changes.push({
374
+ severity: "RISKY",
375
+ code: "staticIr.digestChanged",
376
+ message: "staticIr.digest changed",
377
+ pointer: "/staticIr/digest",
378
+ details: {
379
+ before: beforeDigest ?? null,
380
+ after: afterDigest ?? null
381
+ }
382
+ });
383
+ }
384
+ }
385
+ {
386
+ const metaBefore = before.meta ?? {};
387
+ const metaAfter = after.meta ?? {};
388
+ const allowlist = options?.metaAllowlist;
389
+ const keys = allowlist != null ? uniqSorted(allowlist) : uniqSorted([...Object.keys(metaBefore), ...Object.keys(metaAfter)]);
390
+ const changed = [];
391
+ for (const key of keys) {
392
+ const b = key in metaBefore ? metaBefore[key] : void 0;
393
+ const a = key in metaAfter ? metaAfter[key] : void 0;
394
+ if (!eqJsonValue(b, a)) {
395
+ changed.push({
396
+ key,
397
+ before: b ?? null,
398
+ after: a ?? null
399
+ });
400
+ }
401
+ }
402
+ if (changed.length > 0) {
403
+ changes.push({
404
+ severity: "RISKY",
405
+ code: "meta.changed",
406
+ message: "meta changed",
407
+ pointer: "/meta",
408
+ details: {
409
+ keys: changed.map((x) => x.key),
410
+ changed
411
+ }
412
+ });
413
+ }
414
+ }
415
+ {
416
+ const b = before.source;
417
+ const a = after.source;
418
+ if (!eqJsonValue(b ?? null, a ?? null)) {
419
+ changes.push({
420
+ severity: "INFO",
421
+ code: "source.changed",
422
+ message: "source changed",
423
+ pointer: "/source",
424
+ details: {
425
+ before: b ?? null,
426
+ after: a ?? null
427
+ }
428
+ });
429
+ }
430
+ }
431
+ changes.sort((a, b) => {
432
+ const ra = SEVERITY_RANK[a.severity];
433
+ const rb = SEVERITY_RANK[b.severity];
434
+ if (ra !== rb) return ra - rb;
435
+ const ca = a.code.localeCompare(b.code);
436
+ if (ca !== 0) return ca;
437
+ const pa = a.pointer ?? "";
438
+ const pb = b.pointer ?? "";
439
+ return pa.localeCompare(pb);
440
+ });
441
+ const summary = {
442
+ breaking: changes.filter((c) => c.severity === "BREAKING").length,
443
+ risky: changes.filter((c) => c.severity === "RISKY").length,
444
+ info: changes.filter((c) => c.severity === "INFO").length
445
+ };
446
+ const verdict = summary.breaking > 0 ? "FAIL" : summary.risky > 0 ? "WARN" : "PASS";
447
+ return {
448
+ version: "025",
449
+ moduleId: after.moduleId,
450
+ before: {
451
+ digest: before.digest,
452
+ manifestVersion: before.manifestVersion
453
+ },
454
+ after: {
455
+ digest: after.digest,
456
+ manifestVersion: after.manifestVersion
457
+ },
458
+ verdict,
459
+ changes,
460
+ summary
461
+ };
462
+ };
463
+
464
+ // ../logix-core/src/Reflection.ts
465
+ var extractManifest2 = (module, options) => extractManifest(module, options);
466
+ var diffManifest2 = (before, after, options) => diffManifest(before, after, options);
467
+ var exportStaticIr3 = (module) => exportStaticIr2(module);
468
+
469
+ export {
470
+ extractManifest2 as extractManifest,
471
+ diffManifest2 as diffManifest,
472
+ exportStaticIr3 as exportStaticIr
473
+ };
474
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vbG9naXgtY29yZS9zcmMvaW50ZXJuYWwvcmVmbGVjdGlvbi9zdGF0aWNJci50cyIsICIuLi8uLi8uLi8uLi9sb2dpeC1jb3JlL3NyYy9pbnRlcm5hbC9yZWZsZWN0aW9uL21hbmlmZXN0LnRzIiwgIi4uLy4uLy4uLy4uL2xvZ2l4LWNvcmUvc3JjL2ludGVybmFsL3JlZmxlY3Rpb24vZGlmZi50cyIsICIuLi8uLi8uLi8uLi9sb2dpeC1jb3JlL3NyYy9SZWZsZWN0aW9uLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyJpbXBvcnQgdHlwZSB7IEFueU1vZHVsZVNoYXBlLCBNb2R1bGVJbXBsIH0gZnJvbSBcIi4uL3J1bnRpbWUvY29yZS9tb2R1bGUuanNcIlxuaW1wb3J0IHsgZ2V0TW9kdWxlVHJhaXRzUHJvZ3JhbSB9IGZyb20gXCIuLi9ydW50aW1lL2NvcmUvcnVudGltZUludGVybmFsc0FjY2Vzc29yLmpzXCJcbmltcG9ydCB0eXBlIHsgU3RhdGljSXIgfSBmcm9tIFwiLi4vc3RhdGUtdHJhaXQvaXIuanNcIlxuaW1wb3J0IHR5cGUgeyBTdGF0ZVRyYWl0UHJvZ3JhbSB9IGZyb20gXCIuLi9zdGF0ZS10cmFpdC9tb2RlbC5qc1wiXG5pbXBvcnQgeyBleHBvcnRTdGF0aWNJciBhcyBleHBvcnRTdGF0ZVRyYWl0U3RhdGljSXIgfSBmcm9tIFwiLi4vc3RhdGUtdHJhaXQvaXIuanNcIlxuXG5jb25zdCBpc1JlY29yZCA9ICh2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0+XG4gIHR5cGVvZiB2YWx1ZSA9PT0gXCJvYmplY3RcIiAmJiB2YWx1ZSAhPT0gbnVsbCAmJiAhQXJyYXkuaXNBcnJheSh2YWx1ZSlcblxuY29uc3QgaXNNb2R1bGVJbXBsID0gKHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgTW9kdWxlSW1wbDxhbnksIEFueU1vZHVsZVNoYXBlLCBhbnk+ID0+XG4gIGlzUmVjb3JkKHZhbHVlKSAmJiB2YWx1ZS5fdGFnID09PSBcIk1vZHVsZUltcGxcIiAmJiBpc1JlY29yZCh2YWx1ZS5tb2R1bGUpXG5cbmNvbnN0IHJlc29sdmVNb2R1bGVJZCA9IChpbnB1dDogdW5rbm93bik6IHN0cmluZyA9PiB7XG4gIGlmIChpc01vZHVsZUltcGwoaW5wdXQpKSB7XG4gICAgY29uc3QgaWQgPSAoaW5wdXQubW9kdWxlIGFzIGFueSkuaWRcbiAgICByZXR1cm4gdHlwZW9mIGlkID09PSBcInN0cmluZ1wiICYmIGlkLmxlbmd0aCA+IDAgPyBpZCA6IFwidW5rbm93blwiXG4gIH1cblxuICBpZiAoaXNSZWNvcmQoaW5wdXQpKSB7XG4gICAgY29uc3QgaWQgPSBpbnB1dC5pZFxuICAgIGlmICh0eXBlb2YgaWQgPT09IFwic3RyaW5nXCIgJiYgaWQubGVuZ3RoID4gMCkgcmV0dXJuIGlkXG4gICAgY29uc3QgdGFnID0gKGlucHV0IGFzIGFueSkudGFnXG4gICAgaWYgKHRhZyAmJiAodHlwZW9mIHRhZyA9PT0gXCJvYmplY3RcIiB8fCB0eXBlb2YgdGFnID09PSBcImZ1bmN0aW9uXCIpKSB7XG4gICAgICBjb25zdCB0YWdJZCA9ICh0YWcgYXMgYW55KS5pZFxuICAgICAgaWYgKHR5cGVvZiB0YWdJZCA9PT0gXCJzdHJpbmdcIiAmJiB0YWdJZC5sZW5ndGggPiAwKSByZXR1cm4gdGFnSWRcbiAgICB9XG4gIH1cblxuICByZXR1cm4gXCJ1bmtub3duXCJcbn1cblxuY29uc3QgcmVzb2x2ZU1vZHVsZVRhZyA9IChpbnB1dDogdW5rbm93bik6IHVua25vd24gPT4ge1xuICBpZiAoaXNNb2R1bGVJbXBsKGlucHV0KSkgcmV0dXJuIGlucHV0Lm1vZHVsZVxuICBpZiAoaXNSZWNvcmQoaW5wdXQpICYmIChpbnB1dCBhcyBhbnkpLnRhZykgcmV0dXJuIChpbnB1dCBhcyBhbnkpLnRhZ1xuICByZXR1cm4gdW5kZWZpbmVkXG59XG5cbmV4cG9ydCBjb25zdCBleHBvcnRTdGF0aWNJciA9IChtb2R1bGU6IHVua25vd24pOiBTdGF0aWNJciB8IHVuZGVmaW5lZCA9PiB7XG4gIGNvbnN0IHRhZyA9IHJlc29sdmVNb2R1bGVUYWcobW9kdWxlKVxuICBpZiAoIXRhZykgcmV0dXJuIHVuZGVmaW5lZFxuXG4gIGNvbnN0IHByb2dyYW0gPSBnZXRNb2R1bGVUcmFpdHNQcm9ncmFtKHRhZykgYXMgU3RhdGVUcmFpdFByb2dyYW08YW55PiB8IHVuZGVmaW5lZFxuICBpZiAoIXByb2dyYW0pIHJldHVybiB1bmRlZmluZWRcblxuICByZXR1cm4gZXhwb3J0U3RhdGVUcmFpdFN0YXRpY0lyKHtcbiAgICBwcm9ncmFtLFxuICAgIG1vZHVsZUlkOiByZXNvbHZlTW9kdWxlSWQobW9kdWxlKSxcbiAgfSlcbn1cblxuIiwgImltcG9ydCB0eXBlIHsgQW55TW9kdWxlU2hhcGUsIE1vZHVsZUltcGwgfSBmcm9tIFwiLi4vcnVudGltZS9jb3JlL21vZHVsZS5qc1wiXG5pbXBvcnQgeyBzdGFibGVTdHJpbmdpZnksIGZudjFhMzIgfSBmcm9tIFwiLi4vZGlnZXN0LmpzXCJcbmltcG9ydCB7IGlzSnNvblZhbHVlLCB0eXBlIEpzb25WYWx1ZSB9IGZyb20gXCIuLi9vYnNlcnZhYmlsaXR5L2pzb25WYWx1ZS5qc1wiXG5pbXBvcnQgeyBleHBvcnRTdGF0aWNJciB9IGZyb20gXCIuL3N0YXRpY0lyLmpzXCJcblxuZXhwb3J0IGludGVyZmFjZSBNYW5pZmVzdEJ1ZGdldHMge1xuICByZWFkb25seSBtYXhCeXRlcz86IG51bWJlclxufVxuXG5leHBvcnQgaW50ZXJmYWNlIEV4dHJhY3RNYW5pZmVzdE9wdGlvbnMge1xuICByZWFkb25seSBpbmNsdWRlU3RhdGljSXI/OiBib29sZWFuXG4gIHJlYWRvbmx5IGJ1ZGdldHM/OiBNYW5pZmVzdEJ1ZGdldHNcbn1cblxuZXhwb3J0IGludGVyZmFjZSBNb2R1bGVNYW5pZmVzdExvZ2ljVW5pdCB7XG4gIHJlYWRvbmx5IGtpbmQ6IHN0cmluZ1xuICByZWFkb25seSBpZDogc3RyaW5nXG4gIHJlYWRvbmx5IGRlcml2ZWQ/OiBib29sZWFuXG4gIHJlYWRvbmx5IG5hbWU/OiBzdHJpbmdcbn1cblxuZXhwb3J0IGludGVyZmFjZSBNb2R1bGVNYW5pZmVzdCB7XG4gIHJlYWRvbmx5IG1hbmlmZXN0VmVyc2lvbjogc3RyaW5nXG4gIHJlYWRvbmx5IG1vZHVsZUlkOiBzdHJpbmdcbiAgcmVhZG9ubHkgYWN0aW9uS2V5czogUmVhZG9ubHlBcnJheTxzdHJpbmc+XG4gIHJlYWRvbmx5IHNjaGVtYUtleXM/OiBSZWFkb25seUFycmF5PHN0cmluZz5cbiAgcmVhZG9ubHkgbG9naWNVbml0cz86IFJlYWRvbmx5QXJyYXk8TW9kdWxlTWFuaWZlc3RMb2dpY1VuaXQ+XG4gIHJlYWRvbmx5IHNvdXJjZT86IHtcbiAgICByZWFkb25seSBmaWxlOiBzdHJpbmdcbiAgICByZWFkb25seSBsaW5lOiBudW1iZXJcbiAgICByZWFkb25seSBjb2x1bW46IG51bWJlclxuICB9XG4gIHJlYWRvbmx5IG1ldGE/OiBSZWNvcmQ8c3RyaW5nLCBKc29uVmFsdWU+XG4gIHJlYWRvbmx5IHN0YXRpY0lyPzogUmV0dXJuVHlwZTx0eXBlb2YgZXhwb3J0U3RhdGljSXI+XG4gIHJlYWRvbmx5IGRpZ2VzdDogc3RyaW5nXG59XG5cbmNvbnN0IGlzUmVjb3JkID0gKHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPT5cbiAgdHlwZW9mIHZhbHVlID09PSBcIm9iamVjdFwiICYmIHZhbHVlICE9PSBudWxsICYmICFBcnJheS5pc0FycmF5KHZhbHVlKVxuXG5jb25zdCBpc01vZHVsZUltcGwgPSAodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBNb2R1bGVJbXBsPGFueSwgQW55TW9kdWxlU2hhcGUsIGFueT4gPT5cbiAgaXNSZWNvcmQodmFsdWUpICYmIHZhbHVlLl90YWcgPT09IFwiTW9kdWxlSW1wbFwiICYmIGlzUmVjb3JkKHZhbHVlLm1vZHVsZSlcblxuY29uc3QgcmVzb2x2ZU1vZHVsZUlkID0gKGlucHV0OiB1bmtub3duKTogc3RyaW5nID0+IHtcbiAgaWYgKGlzTW9kdWxlSW1wbChpbnB1dCkpIHtcbiAgICBjb25zdCBpZCA9IChpbnB1dC5tb2R1bGUgYXMgYW55KS5pZFxuICAgIHJldHVybiB0eXBlb2YgaWQgPT09IFwic3RyaW5nXCIgJiYgaWQubGVuZ3RoID4gMCA/IGlkIDogXCJ1bmtub3duXCJcbiAgfVxuXG4gIGlmIChpc1JlY29yZChpbnB1dCkpIHtcbiAgICBjb25zdCBpZCA9IGlucHV0LmlkXG4gICAgaWYgKHR5cGVvZiBpZCA9PT0gXCJzdHJpbmdcIiAmJiBpZC5sZW5ndGggPiAwKSByZXR1cm4gaWRcbiAgICBjb25zdCB0YWcgPSAoaW5wdXQgYXMgYW55KS50YWdcbiAgICBpZiAodGFnICYmICh0eXBlb2YgdGFnID09PSBcIm9iamVjdFwiIHx8IHR5cGVvZiB0YWcgPT09IFwiZnVuY3Rpb25cIikpIHtcbiAgICAgIGNvbnN0IHRhZ0lkID0gKHRhZyBhcyBhbnkpLmlkXG4gICAgICBpZiAodHlwZW9mIHRhZ0lkID09PSBcInN0cmluZ1wiICYmIHRhZ0lkLmxlbmd0aCA+IDApIHJldHVybiB0YWdJZFxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBcInVua25vd25cIlxufVxuXG5jb25zdCByZXNvbHZlQWN0aW9uS2V5cyA9IChpbnB1dDogdW5rbm93bik6IFJlYWRvbmx5QXJyYXk8c3RyaW5nPiA9PiB7XG4gIGNvbnN0IHRhZyA9IGlzTW9kdWxlSW1wbChpbnB1dCkgPyAoaW5wdXQubW9kdWxlIGFzIGFueSkgOiAoaW5wdXQgYXMgYW55KT8udGFnXG4gIGNvbnN0IGFjdGlvbk1hcCA9IHRhZz8uc2hhcGU/LmFjdGlvbk1hcFxuICBpZiAoIWlzUmVjb3JkKGFjdGlvbk1hcCkpIHJldHVybiBbXVxuICByZXR1cm4gT2JqZWN0LmtleXMoYWN0aW9uTWFwKS5zb3J0KClcbn1cblxuY29uc3QgcmVzb2x2ZVNjaGVtYUtleXMgPSAoaW5wdXQ6IHVua25vd24pOiBSZWFkb25seUFycmF5PHN0cmluZz4gfCB1bmRlZmluZWQgPT4ge1xuICBpZiAoIWlzUmVjb3JkKGlucHV0KSkgcmV0dXJuIHVuZGVmaW5lZFxuICBjb25zdCBzY2hlbWFzID0gKGlucHV0IGFzIGFueSkuc2NoZW1hc1xuICBpZiAoIWlzUmVjb3JkKHNjaGVtYXMpKSByZXR1cm4gdW5kZWZpbmVkXG4gIHJldHVybiBPYmplY3Qua2V5cyhzY2hlbWFzKS5zb3J0KClcbn1cblxuY29uc3QgcmVzb2x2ZVNvdXJjZSA9IChpbnB1dDogdW5rbm93bik6IE1vZHVsZU1hbmlmZXN0W1wic291cmNlXCJdIHwgdW5kZWZpbmVkID0+IHtcbiAgaWYgKCFpc1JlY29yZChpbnB1dCkpIHJldHVybiB1bmRlZmluZWRcbiAgY29uc3QgZGV2ID0gKGlucHV0IGFzIGFueSkuZGV2XG4gIGNvbnN0IHNvdXJjZSA9IGRldj8uc291cmNlXG4gIGlmICghaXNSZWNvcmQoc291cmNlKSkgcmV0dXJuIHVuZGVmaW5lZFxuICBjb25zdCBmaWxlID0gc291cmNlLmZpbGVcbiAgY29uc3QgbGluZSA9IHNvdXJjZS5saW5lXG4gIGNvbnN0IGNvbHVtbiA9IHNvdXJjZS5jb2x1bW5cbiAgaWYgKHR5cGVvZiBmaWxlICE9PSBcInN0cmluZ1wiIHx8IGZpbGUubGVuZ3RoID09PSAwKSByZXR1cm4gdW5kZWZpbmVkXG4gIGlmICh0eXBlb2YgbGluZSAhPT0gXCJudW1iZXJcIiB8fCAhTnVtYmVyLmlzSW50ZWdlcihsaW5lKSB8fCBsaW5lIDwgMSkgcmV0dXJuIHVuZGVmaW5lZFxuICBpZiAodHlwZW9mIGNvbHVtbiAhPT0gXCJudW1iZXJcIiB8fCAhTnVtYmVyLmlzSW50ZWdlcihjb2x1bW4pIHx8IGNvbHVtbiA8IDEpIHJldHVybiB1bmRlZmluZWRcbiAgcmV0dXJuIHsgZmlsZSwgbGluZSwgY29sdW1uIH1cbn1cblxuY29uc3QgcmVzb2x2ZU1ldGEgPSAoaW5wdXQ6IHVua25vd24pOiBSZWNvcmQ8c3RyaW5nLCBKc29uVmFsdWU+IHwgdW5kZWZpbmVkID0+IHtcbiAgaWYgKCFpc1JlY29yZChpbnB1dCkpIHJldHVybiB1bmRlZmluZWRcbiAgY29uc3QgbWV0YSA9IChpbnB1dCBhcyBhbnkpLm1ldGFcbiAgaWYgKCFpc1JlY29yZChtZXRhKSkgcmV0dXJuIHVuZGVmaW5lZFxuXG4gIGNvbnN0IG91dDogUmVjb3JkPHN0cmluZywgSnNvblZhbHVlPiA9IHt9XG4gIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKG1ldGEpLnNvcnQoKSkge1xuICAgIGNvbnN0IHZhbHVlID0gbWV0YVtrZXldXG4gICAgaWYgKGlzSnNvblZhbHVlKHZhbHVlKSkge1xuICAgICAgb3V0W2tleV0gPSB2YWx1ZVxuICAgIH1cbiAgfVxuICByZXR1cm4gT2JqZWN0LmtleXMob3V0KS5sZW5ndGggPiAwID8gb3V0IDogdW5kZWZpbmVkXG59XG5cbmNvbnN0IE1PRFVMRV9JTlRFUk5BTCA9IFN5bWJvbC5mb3IoXCJsb2dpeC5tb2R1bGUuaW50ZXJuYWxcIilcblxuY29uc3QgcmVzb2x2ZUxvZ2ljVW5pdHMgPSAoXG4gIGlucHV0OiB1bmtub3duLFxuKTogUmVhZG9ubHlBcnJheTxNb2R1bGVNYW5pZmVzdExvZ2ljVW5pdD4gfCB1bmRlZmluZWQgPT4ge1xuICBpZiAoIWlzUmVjb3JkKGlucHV0KSkgcmV0dXJuIHVuZGVmaW5lZFxuICBjb25zdCBpbnRlcm5hbCA9IChpbnB1dCBhcyBhbnkpW01PRFVMRV9JTlRFUk5BTF1cbiAgY29uc3QgbW91bnRlZCA9IGludGVybmFsPy5tb3VudGVkXG4gIGlmICghQXJyYXkuaXNBcnJheShtb3VudGVkKSkgcmV0dXJuIHVuZGVmaW5lZFxuXG4gIGNvbnN0IG91dDogQXJyYXk8TW9kdWxlTWFuaWZlc3RMb2dpY1VuaXQ+ID0gW11cbiAgZm9yIChjb25zdCB1bml0IG9mIG1vdW50ZWQpIHtcbiAgICBpZiAoIWlzUmVjb3JkKHVuaXQpKSBjb250aW51ZVxuICAgIGNvbnN0IGtpbmQgPSB1bml0LmtpbmRcbiAgICBjb25zdCBpZCA9IHVuaXQuaWRcbiAgICBpZiAodHlwZW9mIGtpbmQgIT09IFwic3RyaW5nXCIgfHwga2luZC5sZW5ndGggPT09IDApIGNvbnRpbnVlXG4gICAgaWYgKHR5cGVvZiBpZCAhPT0gXCJzdHJpbmdcIiB8fCBpZC5sZW5ndGggPT09IDApIGNvbnRpbnVlXG5cbiAgICBjb25zdCBkZXJpdmVkID0gdW5pdC5kZXJpdmVkID09PSB0cnVlID8gdHJ1ZSA6IHVuZGVmaW5lZFxuICAgIGNvbnN0IG5hbWUgPSB0eXBlb2YgdW5pdC5uYW1lID09PSBcInN0cmluZ1wiID8gdW5pdC5uYW1lIDogdW5kZWZpbmVkXG4gICAgb3V0LnB1c2goeyBraW5kLCBpZCwgZGVyaXZlZCwgbmFtZSB9KVxuICB9XG5cbiAgb3V0LnNvcnQoKGEsIGIpID0+IChhLmlkIDwgYi5pZCA/IC0xIDogYS5pZCA+IGIuaWQgPyAxIDogYS5raW5kLmxvY2FsZUNvbXBhcmUoYi5raW5kKSkpXG4gIHJldHVybiBvdXQubGVuZ3RoID4gMCA/IG91dCA6IHVuZGVmaW5lZFxufVxuXG50eXBlIERpZ2VzdEJhc2UgPSB7XG4gIHJlYWRvbmx5IG1hbmlmZXN0VmVyc2lvbjogc3RyaW5nXG4gIHJlYWRvbmx5IG1vZHVsZUlkOiBzdHJpbmdcbiAgcmVhZG9ubHkgYWN0aW9uS2V5czogUmVhZG9ubHlBcnJheTxzdHJpbmc+XG4gIHJlYWRvbmx5IHNjaGVtYUtleXM/OiBSZWFkb25seUFycmF5PHN0cmluZz5cbiAgcmVhZG9ubHkgbG9naWNVbml0cz86IFJlYWRvbmx5QXJyYXk8TW9kdWxlTWFuaWZlc3RMb2dpY1VuaXQ+XG4gIHJlYWRvbmx5IHN0YXRpY0lyRGlnZXN0Pzogc3RyaW5nXG59XG5cbmNvbnN0IGRpZ2VzdE9mID0gKGJhc2U6IERpZ2VzdEJhc2UpOiBzdHJpbmcgPT5cbiAgYG1hbmlmZXN0OjAyNToke2ZudjFhMzIoc3RhYmxlU3RyaW5naWZ5KGJhc2UpKX1gXG5cbmNvbnN0IHV0ZjhCeXRlTGVuZ3RoID0gKHZhbHVlOiB1bmtub3duKTogbnVtYmVyID0+IHtcbiAgY29uc3QganNvbiA9IEpTT04uc3RyaW5naWZ5KHZhbHVlKVxuICBpZiAodHlwZW9mIFRleHRFbmNvZGVyICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgcmV0dXJuIG5ldyBUZXh0RW5jb2RlcigpLmVuY29kZShqc29uKS5sZW5ndGhcbiAgfVxuICByZXR1cm4ganNvbi5sZW5ndGhcbn1cblxuY29uc3QgYXBwbHlNYXhCeXRlcyA9IChtYW5pZmVzdDogTW9kdWxlTWFuaWZlc3QsIG1heEJ5dGVzOiBudW1iZXIpOiBNb2R1bGVNYW5pZmVzdCA9PiB7XG4gIGNvbnN0IG9yaWdpbmFsQnl0ZXMgPSB1dGY4Qnl0ZUxlbmd0aChtYW5pZmVzdClcbiAgaWYgKG9yaWdpbmFsQnl0ZXMgPD0gbWF4Qnl0ZXMpIHJldHVybiBtYW5pZmVzdFxuXG4gIGNvbnN0IGRyb3BwZWQ6IEFycmF5PHN0cmluZz4gPSBbXVxuICBjb25zdCB0cnVuY2F0ZWRBcnJheXM6IEFycmF5PHN0cmluZz4gPSBbXVxuXG4gIGNvbnN0IGJhc2VNYXJrZXIgPSAoKTogSnNvblZhbHVlID0+ICh7XG4gICAgdHJ1bmNhdGVkOiB0cnVlLFxuICAgIG1heEJ5dGVzLFxuICAgIG9yaWdpbmFsQnl0ZXMsXG4gICAgZHJvcHBlZCxcbiAgICB0cnVuY2F0ZWRBcnJheXMsXG4gIH0pXG5cbiAgY29uc3Qgd2l0aE1hcmtlciA9IChuZXh0OiBNb2R1bGVNYW5pZmVzdCk6IE1vZHVsZU1hbmlmZXN0ID0+IHtcbiAgICBjb25zdCBtZXRhOiBSZWNvcmQ8c3RyaW5nLCBKc29uVmFsdWU+ID0ge1xuICAgICAgX19sb2dpeDogYmFzZU1hcmtlcigpLFxuICAgIH1cbiAgICByZXR1cm4geyAuLi5uZXh0LCBtZXRhIH1cbiAgfVxuXG4gIGxldCBuZXh0OiBNb2R1bGVNYW5pZmVzdCA9IHdpdGhNYXJrZXIobWFuaWZlc3QpXG5cbiAgY29uc3QgZHJvcEZpZWxkID0gKGZpZWxkOiBrZXlvZiBNb2R1bGVNYW5pZmVzdCk6IHZvaWQgPT4ge1xuICAgIGlmICgobmV4dCBhcyBhbnkpW2ZpZWxkXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBkcm9wcGVkLnB1c2goU3RyaW5nKGZpZWxkKSlcbiAgICAgIG5leHQgPSB3aXRoTWFya2VyKHsgLi4uKG5leHQgYXMgYW55KSwgW2ZpZWxkXTogdW5kZWZpbmVkIH0pXG4gICAgfVxuICB9XG5cbiAgLy8gRGV0ZXJtaW5pc3RpYyB0cmltbWluZyBvcmRlciAobGVhc3QgdmFsdWFibGUgZmlyc3QpLlxuICBkcm9wRmllbGQoXCJtZXRhXCIpXG4gIGlmICh1dGY4Qnl0ZUxlbmd0aChuZXh0KSA8PSBtYXhCeXRlcykgcmV0dXJuIG5leHRcblxuICBkcm9wRmllbGQoXCJzb3VyY2VcIilcbiAgaWYgKHV0ZjhCeXRlTGVuZ3RoKG5leHQpIDw9IG1heEJ5dGVzKSByZXR1cm4gbmV4dFxuXG4gIGRyb3BGaWVsZChcInN0YXRpY0lyXCIpXG4gIGlmICh1dGY4Qnl0ZUxlbmd0aChuZXh0KSA8PSBtYXhCeXRlcykgcmV0dXJuIG5leHRcblxuICBkcm9wRmllbGQoXCJsb2dpY1VuaXRzXCIpXG4gIGlmICh1dGY4Qnl0ZUxlbmd0aChuZXh0KSA8PSBtYXhCeXRlcykgcmV0dXJuIG5leHRcblxuICBkcm9wRmllbGQoXCJzY2hlbWFLZXlzXCIpXG4gIGlmICh1dGY4Qnl0ZUxlbmd0aChuZXh0KSA8PSBtYXhCeXRlcykgcmV0dXJuIG5leHRcblxuICAvLyBMYXN0IHJlc29ydDogdHJ1bmNhdGUgYWN0aW9uS2V5cyAoc3RpbGwgZGV0ZXJtaW5pc3RpYywgYnV0IHNpZ25hbHMgdHJ1bmNhdGlvbikuXG4gIHdoaWxlICh1dGY4Qnl0ZUxlbmd0aChuZXh0KSA+IG1heEJ5dGVzICYmIG5leHQuYWN0aW9uS2V5cy5sZW5ndGggPiAxKSB7XG4gICAgdHJ1bmNhdGVkQXJyYXlzLnB1c2goXCJhY3Rpb25LZXlzXCIpXG4gICAgbmV4dCA9IHdpdGhNYXJrZXIoe1xuICAgICAgLi4ubmV4dCxcbiAgICAgIGFjdGlvbktleXM6IG5leHQuYWN0aW9uS2V5cy5zbGljZSgwLCBNYXRoLmNlaWwobmV4dC5hY3Rpb25LZXlzLmxlbmd0aCAvIDIpKSxcbiAgICB9KVxuICB9XG5cbiAgcmV0dXJuIG5leHRcbn1cblxuZXhwb3J0IGNvbnN0IGV4dHJhY3RNYW5pZmVzdCA9IChcbiAgbW9kdWxlOiB1bmtub3duLFxuICBvcHRpb25zPzogRXh0cmFjdE1hbmlmZXN0T3B0aW9ucyxcbik6IE1vZHVsZU1hbmlmZXN0ID0+IHtcbiAgY29uc3QgbWFuaWZlc3RWZXJzaW9uID0gXCIwMjVcIlxuICBjb25zdCBtb2R1bGVJZCA9IHJlc29sdmVNb2R1bGVJZChtb2R1bGUpXG4gIGNvbnN0IGFjdGlvbktleXMgPSByZXNvbHZlQWN0aW9uS2V5cyhtb2R1bGUpXG5cbiAgY29uc3Qgc2NoZW1hS2V5cyA9IHJlc29sdmVTY2hlbWFLZXlzKG1vZHVsZSlcbiAgY29uc3QgbG9naWNVbml0cyA9IHJlc29sdmVMb2dpY1VuaXRzKG1vZHVsZSlcbiAgY29uc3Qgc291cmNlID0gcmVzb2x2ZVNvdXJjZShtb2R1bGUpXG4gIGNvbnN0IG1ldGEgPSByZXNvbHZlTWV0YShtb2R1bGUpXG5cbiAgY29uc3Qgc3RhdGljSXIgPSBvcHRpb25zPy5pbmNsdWRlU3RhdGljSXIgPyBleHBvcnRTdGF0aWNJcihtb2R1bGUpIDogdW5kZWZpbmVkXG5cbiAgY29uc3QgZGlnZXN0QmFzZTogRGlnZXN0QmFzZSA9IHtcbiAgICBtYW5pZmVzdFZlcnNpb24sXG4gICAgbW9kdWxlSWQsXG4gICAgYWN0aW9uS2V5cyxcbiAgICBzY2hlbWFLZXlzLFxuICAgIGxvZ2ljVW5pdHMsXG4gICAgc3RhdGljSXJEaWdlc3Q6IHN0YXRpY0lyPy5kaWdlc3QsXG4gIH1cblxuICBjb25zdCBkaWdlc3QgPSBkaWdlc3RPZihkaWdlc3RCYXNlKVxuXG4gIGNvbnN0IG1hbmlmZXN0OiBNb2R1bGVNYW5pZmVzdCA9IHtcbiAgICBtYW5pZmVzdFZlcnNpb24sXG4gICAgbW9kdWxlSWQsXG4gICAgYWN0aW9uS2V5cyxcbiAgICBzY2hlbWFLZXlzLFxuICAgIGxvZ2ljVW5pdHMsXG4gICAgc291cmNlLFxuICAgIG1ldGEsXG4gICAgc3RhdGljSXIsXG4gICAgZGlnZXN0LFxuICB9XG5cbiAgY29uc3QgbWF4Qnl0ZXMgPSBvcHRpb25zPy5idWRnZXRzPy5tYXhCeXRlc1xuICBpZiAodHlwZW9mIG1heEJ5dGVzID09PSBcIm51bWJlclwiICYmIE51bWJlci5pc0Zpbml0ZShtYXhCeXRlcykgJiYgbWF4Qnl0ZXMgPiAwKSB7XG4gICAgcmV0dXJuIGFwcGx5TWF4Qnl0ZXMobWFuaWZlc3QsIG1heEJ5dGVzKVxuICB9XG5cbiAgcmV0dXJuIG1hbmlmZXN0XG59XG4iLCAiaW1wb3J0IHsgc3RhYmxlU3RyaW5naWZ5IH0gZnJvbSBcIi4uL2RpZ2VzdC5qc1wiXG5pbXBvcnQgdHlwZSB7IEpzb25WYWx1ZSB9IGZyb20gXCIuLi9vYnNlcnZhYmlsaXR5L2pzb25WYWx1ZS5qc1wiXG5pbXBvcnQgdHlwZSB7IE1vZHVsZU1hbmlmZXN0LCBNb2R1bGVNYW5pZmVzdExvZ2ljVW5pdCB9IGZyb20gXCIuL21hbmlmZXN0LmpzXCJcblxuZXhwb3J0IHR5cGUgTWFuaWZlc3REaWZmU2V2ZXJpdHkgPSBcIkJSRUFLSU5HXCIgfCBcIlJJU0tZXCIgfCBcIklORk9cIlxuZXhwb3J0IHR5cGUgTWFuaWZlc3REaWZmVmVyZGljdCA9IFwiUEFTU1wiIHwgXCJXQVJOXCIgfCBcIkZBSUxcIlxuXG5leHBvcnQgaW50ZXJmYWNlIE1vZHVsZU1hbmlmZXN0RGlmZkNoYW5nZSB7XG4gIHJlYWRvbmx5IHNldmVyaXR5OiBNYW5pZmVzdERpZmZTZXZlcml0eVxuICByZWFkb25seSBjb2RlOiBzdHJpbmdcbiAgcmVhZG9ubHkgbWVzc2FnZT86IHN0cmluZ1xuICByZWFkb25seSBwb2ludGVyPzogc3RyaW5nXG4gIHJlYWRvbmx5IGRldGFpbHM/OiBKc29uVmFsdWVcbn1cblxuZXhwb3J0IGludGVyZmFjZSBNb2R1bGVNYW5pZmVzdERpZmZTdW1tYXJ5IHtcbiAgcmVhZG9ubHkgYnJlYWtpbmc6IG51bWJlclxuICByZWFkb25seSByaXNreTogbnVtYmVyXG4gIHJlYWRvbmx5IGluZm86IG51bWJlclxufVxuXG5leHBvcnQgaW50ZXJmYWNlIE1vZHVsZU1hbmlmZXN0RGlmZiB7XG4gIHJlYWRvbmx5IHZlcnNpb246IHN0cmluZ1xuICByZWFkb25seSBtb2R1bGVJZDogc3RyaW5nXG4gIHJlYWRvbmx5IGJlZm9yZToge1xuICAgIHJlYWRvbmx5IGRpZ2VzdDogc3RyaW5nXG4gICAgcmVhZG9ubHkgbWFuaWZlc3RWZXJzaW9uPzogc3RyaW5nXG4gIH1cbiAgcmVhZG9ubHkgYWZ0ZXI6IHtcbiAgICByZWFkb25seSBkaWdlc3Q6IHN0cmluZ1xuICAgIHJlYWRvbmx5IG1hbmlmZXN0VmVyc2lvbj86IHN0cmluZ1xuICB9XG4gIHJlYWRvbmx5IHZlcmRpY3Q6IE1hbmlmZXN0RGlmZlZlcmRpY3RcbiAgcmVhZG9ubHkgY2hhbmdlczogUmVhZG9ubHlBcnJheTxNb2R1bGVNYW5pZmVzdERpZmZDaGFuZ2U+XG4gIHJlYWRvbmx5IHN1bW1hcnk6IE1vZHVsZU1hbmlmZXN0RGlmZlN1bW1hcnlcbn1cblxuZXhwb3J0IGludGVyZmFjZSBEaWZmTWFuaWZlc3RPcHRpb25zIHtcbiAgLyoqXG4gICAqIG1ldGFBbGxvd2xpc3RcdUZGMUFcbiAgICogLSBcdTRFMERcdTYzRDBcdTRGOUJcdUZGMUFtZXRhIFx1NTE2OFx1OTFDRlx1NUJGOVx1NkJENFx1RkYwOFx1OUVEOFx1OEJBNFx1OTBGRFx1ODlDNlx1NEUzQSBSSVNLWVx1RkYwOVx1MzAwMlxuICAgKiAtIFx1NjNEMFx1NEY5Qlx1RkYxQVx1NEVDNVx1NUJGOSBhbGxvd2xpc3QgXHU1MTg1IGtleSBcdTUwNUEgbWV0YSBkaWZmXHVGRjA4XHU1MTc2XHU0RjU5XHU1RkZEXHU3NTY1XHVGRjA5XHUzMDAyXG4gICAqL1xuICByZWFkb25seSBtZXRhQWxsb3dsaXN0PzogUmVhZG9ubHlBcnJheTxzdHJpbmc+XG59XG5cbmNvbnN0IFNFVkVSSVRZX1JBTks6IFJlY29yZDxNYW5pZmVzdERpZmZTZXZlcml0eSwgbnVtYmVyPiA9IHtcbiAgQlJFQUtJTkc6IDAsXG4gIFJJU0tZOiAxLFxuICBJTkZPOiAyLFxufVxuXG5jb25zdCB1bmlxU29ydGVkID0gKGlucHV0OiBSZWFkb25seUFycmF5PHN0cmluZz4pOiBSZWFkb25seUFycmF5PHN0cmluZz4gPT4ge1xuICBjb25zdCBvdXQgPSBBcnJheS5mcm9tKG5ldyBTZXQoaW5wdXQuZmlsdGVyKCh4KSA9PiB0eXBlb2YgeCA9PT0gXCJzdHJpbmdcIiAmJiB4Lmxlbmd0aCA+IDApKSlcbiAgb3V0LnNvcnQoKGEsIGIpID0+IGEubG9jYWxlQ29tcGFyZShiKSlcbiAgcmV0dXJuIG91dFxufVxuXG5jb25zdCBkaWZmU3RyaW5nS2V5cyA9IChcbiAgYmVmb3JlOiBSZWFkb25seUFycmF5PHN0cmluZz4gfCB1bmRlZmluZWQsXG4gIGFmdGVyOiBSZWFkb25seUFycmF5PHN0cmluZz4gfCB1bmRlZmluZWQsXG4pOiB7IHJlYWRvbmx5IHJlbW92ZWQ6IFJlYWRvbmx5QXJyYXk8c3RyaW5nPjsgcmVhZG9ubHkgYWRkZWQ6IFJlYWRvbmx5QXJyYXk8c3RyaW5nPiB9ID0+IHtcbiAgY29uc3QgYmVmb3JlU2V0ID0gbmV3IFNldCh1bmlxU29ydGVkKGJlZm9yZSA/PyBbXSkpXG4gIGNvbnN0IGFmdGVyU2V0ID0gbmV3IFNldCh1bmlxU29ydGVkKGFmdGVyID8/IFtdKSlcblxuICBjb25zdCByZW1vdmVkOiBzdHJpbmdbXSA9IFtdXG4gIGZvciAoY29uc3QgayBvZiBiZWZvcmVTZXQpIHtcbiAgICBpZiAoIWFmdGVyU2V0LmhhcyhrKSkgcmVtb3ZlZC5wdXNoKGspXG4gIH1cbiAgcmVtb3ZlZC5zb3J0KChhLCBiKSA9PiBhLmxvY2FsZUNvbXBhcmUoYikpXG5cbiAgY29uc3QgYWRkZWQ6IHN0cmluZ1tdID0gW11cbiAgZm9yIChjb25zdCBrIG9mIGFmdGVyU2V0KSB7XG4gICAgaWYgKCFiZWZvcmVTZXQuaGFzKGspKSBhZGRlZC5wdXNoKGspXG4gIH1cbiAgYWRkZWQuc29ydCgoYSwgYikgPT4gYS5sb2NhbGVDb21wYXJlKGIpKVxuXG4gIHJldHVybiB7IHJlbW92ZWQsIGFkZGVkIH1cbn1cblxuY29uc3QgZXFKc29uVmFsdWUgPSAoYTogdW5rbm93biwgYjogdW5rbm93bik6IGJvb2xlYW4gPT4gc3RhYmxlU3RyaW5naWZ5KGEpID09PSBzdGFibGVTdHJpbmdpZnkoYilcblxuY29uc3QgaW5kZXhMb2dpY1VuaXRzID0gKFxuICBpbnB1dDogUmVhZG9ubHlBcnJheTxNb2R1bGVNYW5pZmVzdExvZ2ljVW5pdD4gfCB1bmRlZmluZWQsXG4pOiBSZWFkb25seU1hcDxzdHJpbmcsIE1vZHVsZU1hbmlmZXN0TG9naWNVbml0PiA9PiB7XG4gIGNvbnN0IG1hcCA9IG5ldyBNYXA8c3RyaW5nLCBNb2R1bGVNYW5pZmVzdExvZ2ljVW5pdD4oKVxuICBmb3IgKGNvbnN0IHVuaXQgb2YgaW5wdXQgPz8gW10pIHtcbiAgICBpZiAoIXVuaXQgfHwgdHlwZW9mIHVuaXQgIT09IFwib2JqZWN0XCIpIGNvbnRpbnVlXG4gICAgY29uc3QgaWQgPSAodW5pdCBhcyBhbnkpLmlkXG4gICAgaWYgKHR5cGVvZiBpZCAhPT0gXCJzdHJpbmdcIiB8fCBpZC5sZW5ndGggPT09IDApIGNvbnRpbnVlXG4gICAgbWFwLnNldChpZCwgdW5pdClcbiAgfVxuICByZXR1cm4gbWFwXG59XG5cbmV4cG9ydCBjb25zdCBkaWZmTWFuaWZlc3QgPSAoXG4gIGJlZm9yZTogTW9kdWxlTWFuaWZlc3QsXG4gIGFmdGVyOiBNb2R1bGVNYW5pZmVzdCxcbiAgb3B0aW9ucz86IERpZmZNYW5pZmVzdE9wdGlvbnMsXG4pOiBNb2R1bGVNYW5pZmVzdERpZmYgPT4ge1xuICBjb25zdCBjaGFuZ2VzOiBNb2R1bGVNYW5pZmVzdERpZmZDaGFuZ2VbXSA9IFtdXG5cbiAgLy8gSWRlbnRpdHkgLyBwcm90b2NvbFxuICBpZiAoYmVmb3JlLm1vZHVsZUlkICE9PSBhZnRlci5tb2R1bGVJZCkge1xuICAgIGNoYW5nZXMucHVzaCh7XG4gICAgICBzZXZlcml0eTogXCJCUkVBS0lOR1wiLFxuICAgICAgY29kZTogXCJtb2R1bGVJZC5jaGFuZ2VkXCIsXG4gICAgICBtZXNzYWdlOiBgbW9kdWxlSWQgY2hhbmdlZCAoJHtiZWZvcmUubW9kdWxlSWR9IC0+ICR7YWZ0ZXIubW9kdWxlSWR9KWAsXG4gICAgICBwb2ludGVyOiBcIi9tb2R1bGVJZFwiLFxuICAgICAgZGV0YWlsczoge1xuICAgICAgICBiZWZvcmU6IGJlZm9yZS5tb2R1bGVJZCxcbiAgICAgICAgYWZ0ZXI6IGFmdGVyLm1vZHVsZUlkLFxuICAgICAgfSxcbiAgICB9KVxuICB9XG5cbiAgaWYgKGJlZm9yZS5tYW5pZmVzdFZlcnNpb24gIT09IGFmdGVyLm1hbmlmZXN0VmVyc2lvbikge1xuICAgIGNoYW5nZXMucHVzaCh7XG4gICAgICBzZXZlcml0eTogXCJJTkZPXCIsXG4gICAgICBjb2RlOiBcIm1hbmlmZXN0VmVyc2lvbi5jaGFuZ2VkXCIsXG4gICAgICBtZXNzYWdlOiBgbWFuaWZlc3RWZXJzaW9uIGNoYW5nZWQgKCR7YmVmb3JlLm1hbmlmZXN0VmVyc2lvbn0gLT4gJHthZnRlci5tYW5pZmVzdFZlcnNpb259KWAsXG4gICAgICBwb2ludGVyOiBcIi9tYW5pZmVzdFZlcnNpb25cIixcbiAgICAgIGRldGFpbHM6IHtcbiAgICAgICAgYmVmb3JlOiBiZWZvcmUubWFuaWZlc3RWZXJzaW9uLFxuICAgICAgICBhZnRlcjogYWZ0ZXIubWFuaWZlc3RWZXJzaW9uLFxuICAgICAgfSxcbiAgICB9KVxuICB9XG5cbiAgLy8gYWN0aW9uS2V5c1xuICB7XG4gICAgY29uc3QgeyByZW1vdmVkLCBhZGRlZCB9ID0gZGlmZlN0cmluZ0tleXMoYmVmb3JlLmFjdGlvbktleXMsIGFmdGVyLmFjdGlvbktleXMpXG4gICAgaWYgKHJlbW92ZWQubGVuZ3RoID4gMCB8fCBhZGRlZC5sZW5ndGggPiAwKSB7XG4gICAgICBjaGFuZ2VzLnB1c2goe1xuICAgICAgICBzZXZlcml0eTogcmVtb3ZlZC5sZW5ndGggPiAwID8gXCJCUkVBS0lOR1wiIDogXCJJTkZPXCIsXG4gICAgICAgIGNvZGU6IFwiYWN0aW9uS2V5cy5jaGFuZ2VkXCIsXG4gICAgICAgIG1lc3NhZ2U6XG4gICAgICAgICAgcmVtb3ZlZC5sZW5ndGggPiAwXG4gICAgICAgICAgICA/IGBhY3Rpb25LZXlzIHJlbW92ZWQ6ICR7cmVtb3ZlZC5qb2luKFwiLCBcIil9YFxuICAgICAgICAgICAgOiBgYWN0aW9uS2V5cyBhZGRlZDogJHthZGRlZC5qb2luKFwiLCBcIil9YCxcbiAgICAgICAgcG9pbnRlcjogXCIvYWN0aW9uS2V5c1wiLFxuICAgICAgICBkZXRhaWxzOiB7IHJlbW92ZWQsIGFkZGVkIH0sXG4gICAgICB9KVxuICAgIH1cbiAgfVxuXG4gIC8vIHNjaGVtYUtleXNcbiAge1xuICAgIGNvbnN0IHsgcmVtb3ZlZCwgYWRkZWQgfSA9IGRpZmZTdHJpbmdLZXlzKGJlZm9yZS5zY2hlbWFLZXlzLCBhZnRlci5zY2hlbWFLZXlzKVxuICAgIGlmIChyZW1vdmVkLmxlbmd0aCA+IDAgfHwgYWRkZWQubGVuZ3RoID4gMCkge1xuICAgICAgY2hhbmdlcy5wdXNoKHtcbiAgICAgICAgc2V2ZXJpdHk6IHJlbW92ZWQubGVuZ3RoID4gMCA/IFwiQlJFQUtJTkdcIiA6IFwiSU5GT1wiLFxuICAgICAgICBjb2RlOiBcInNjaGVtYUtleXMuY2hhbmdlZFwiLFxuICAgICAgICBtZXNzYWdlOlxuICAgICAgICAgIHJlbW92ZWQubGVuZ3RoID4gMFxuICAgICAgICAgICAgPyBgc2NoZW1hS2V5cyByZW1vdmVkOiAke3JlbW92ZWQuam9pbihcIiwgXCIpfWBcbiAgICAgICAgICAgIDogYHNjaGVtYUtleXMgYWRkZWQ6ICR7YWRkZWQuam9pbihcIiwgXCIpfWAsXG4gICAgICAgIHBvaW50ZXI6IFwiL3NjaGVtYUtleXNcIixcbiAgICAgICAgZGV0YWlsczogeyByZW1vdmVkLCBhZGRlZCB9LFxuICAgICAgfSlcbiAgICB9XG4gIH1cblxuICAvLyBsb2dpY1VuaXRzIChzbG90cylcbiAge1xuICAgIGNvbnN0IGJlZm9yZUJ5SWQgPSBpbmRleExvZ2ljVW5pdHMoYmVmb3JlLmxvZ2ljVW5pdHMpXG4gICAgY29uc3QgYWZ0ZXJCeUlkID0gaW5kZXhMb2dpY1VuaXRzKGFmdGVyLmxvZ2ljVW5pdHMpXG5cbiAgICBjb25zdCByZW1vdmVkOiBzdHJpbmdbXSA9IFtdXG4gICAgY29uc3QgYWRkZWQ6IHN0cmluZ1tdID0gW11cbiAgICBjb25zdCBraW5kQ2hhbmdlZDogQXJyYXk8eyByZWFkb25seSBpZDogc3RyaW5nOyByZWFkb25seSBiZWZvcmU6IHN0cmluZzsgcmVhZG9ubHkgYWZ0ZXI6IHN0cmluZyB9PiA9XG4gICAgICBbXVxuICAgIGNvbnN0IHJpc2t5Q2hhbmdlZDogQXJyYXk8eyByZWFkb25seSBpZDogc3RyaW5nOyByZWFkb25seSBmaWVsZHM6IFJlYWRvbmx5QXJyYXk8c3RyaW5nPiB9PiA9IFtdXG5cbiAgICBmb3IgKGNvbnN0IGlkIG9mIGJlZm9yZUJ5SWQua2V5cygpKSB7XG4gICAgICBpZiAoIWFmdGVyQnlJZC5oYXMoaWQpKSByZW1vdmVkLnB1c2goaWQpXG4gICAgfVxuICAgIGZvciAoY29uc3QgaWQgb2YgYWZ0ZXJCeUlkLmtleXMoKSkge1xuICAgICAgaWYgKCFiZWZvcmVCeUlkLmhhcyhpZCkpIGFkZGVkLnB1c2goaWQpXG4gICAgfVxuXG4gICAgcmVtb3ZlZC5zb3J0KChhLCBiKSA9PiBhLmxvY2FsZUNvbXBhcmUoYikpXG4gICAgYWRkZWQuc29ydCgoYSwgYikgPT4gYS5sb2NhbGVDb21wYXJlKGIpKVxuXG4gICAgZm9yIChjb25zdCBpZCBvZiBiZWZvcmVCeUlkLmtleXMoKSkge1xuICAgICAgY29uc3QgYiA9IGJlZm9yZUJ5SWQuZ2V0KGlkKVxuICAgICAgY29uc3QgYSA9IGFmdGVyQnlJZC5nZXQoaWQpXG4gICAgICBpZiAoIWIgfHwgIWEpIGNvbnRpbnVlXG5cbiAgICAgIGNvbnN0IGZpZWxkczogc3RyaW5nW10gPSBbXVxuICAgICAgaWYgKGIua2luZCAhPT0gYS5raW5kKSB7XG4gICAgICAgIGtpbmRDaGFuZ2VkLnB1c2goeyBpZCwgYmVmb3JlOiBiLmtpbmQsIGFmdGVyOiBhLmtpbmQgfSlcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cbiAgICAgIGlmIChiLm5hbWUgIT09IGEubmFtZSkgZmllbGRzLnB1c2goXCJuYW1lXCIpXG4gICAgICBpZiAoYi5kZXJpdmVkICE9PSBhLmRlcml2ZWQpIGZpZWxkcy5wdXNoKFwiZGVyaXZlZFwiKVxuICAgICAgaWYgKGZpZWxkcy5sZW5ndGggPiAwKSByaXNreUNoYW5nZWQucHVzaCh7IGlkLCBmaWVsZHMgfSlcbiAgICB9XG5cbiAgICBraW5kQ2hhbmdlZC5zb3J0KCh4LCB5KSA9PiB4LmlkLmxvY2FsZUNvbXBhcmUoeS5pZCkpXG4gICAgcmlza3lDaGFuZ2VkLnNvcnQoKHgsIHkpID0+IHguaWQubG9jYWxlQ29tcGFyZSh5LmlkKSlcblxuICAgIGlmIChyZW1vdmVkLmxlbmd0aCA+IDApIHtcbiAgICAgIGNoYW5nZXMucHVzaCh7XG4gICAgICAgIHNldmVyaXR5OiBcIkJSRUFLSU5HXCIsXG4gICAgICAgIGNvZGU6IFwibG9naWNVbml0cy5yZW1vdmVkXCIsXG4gICAgICAgIG1lc3NhZ2U6IGBsb2dpY1VuaXRzIHJlbW92ZWQ6ICR7cmVtb3ZlZC5qb2luKFwiLCBcIil9YCxcbiAgICAgICAgcG9pbnRlcjogXCIvbG9naWNVbml0c1wiLFxuICAgICAgICBkZXRhaWxzOiB7IHJlbW92ZWQgfSxcbiAgICAgIH0pXG4gICAgfVxuXG4gICAgaWYgKGtpbmRDaGFuZ2VkLmxlbmd0aCA+IDApIHtcbiAgICAgIGNoYW5nZXMucHVzaCh7XG4gICAgICAgIHNldmVyaXR5OiBcIkJSRUFLSU5HXCIsXG4gICAgICAgIGNvZGU6IFwibG9naWNVbml0cy5raW5kQ2hhbmdlZFwiLFxuICAgICAgICBtZXNzYWdlOiBgbG9naWNVbml0cyBraW5kIGNoYW5nZWQ6ICR7a2luZENoYW5nZWQubWFwKCh4KSA9PiB4LmlkKS5qb2luKFwiLCBcIil9YCxcbiAgICAgICAgcG9pbnRlcjogXCIvbG9naWNVbml0c1wiLFxuICAgICAgICBkZXRhaWxzOiB7IGtpbmRDaGFuZ2VkIH0sXG4gICAgICB9KVxuICAgIH1cblxuICAgIGlmIChhZGRlZC5sZW5ndGggPiAwKSB7XG4gICAgICBjaGFuZ2VzLnB1c2goe1xuICAgICAgICBzZXZlcml0eTogXCJJTkZPXCIsXG4gICAgICAgIGNvZGU6IFwibG9naWNVbml0cy5hZGRlZFwiLFxuICAgICAgICBtZXNzYWdlOiBgbG9naWNVbml0cyBhZGRlZDogJHthZGRlZC5qb2luKFwiLCBcIil9YCxcbiAgICAgICAgcG9pbnRlcjogXCIvbG9naWNVbml0c1wiLFxuICAgICAgICBkZXRhaWxzOiB7IGFkZGVkIH0sXG4gICAgICB9KVxuICAgIH1cblxuICAgIGlmIChyaXNreUNoYW5nZWQubGVuZ3RoID4gMCkge1xuICAgICAgY2hhbmdlcy5wdXNoKHtcbiAgICAgICAgc2V2ZXJpdHk6IFwiUklTS1lcIixcbiAgICAgICAgY29kZTogXCJsb2dpY1VuaXRzLmNoYW5nZWRcIixcbiAgICAgICAgbWVzc2FnZTogYGxvZ2ljVW5pdHMgY2hhbmdlZDogJHtyaXNreUNoYW5nZWQubWFwKCh4KSA9PiB4LmlkKS5qb2luKFwiLCBcIil9YCxcbiAgICAgICAgcG9pbnRlcjogXCIvbG9naWNVbml0c1wiLFxuICAgICAgICBkZXRhaWxzOiB7IGNoYW5nZWQ6IHJpc2t5Q2hhbmdlZCB9LFxuICAgICAgfSlcbiAgICB9XG4gIH1cblxuICAvLyBzdGF0aWNJci5kaWdlc3RcbiAge1xuICAgIGNvbnN0IGJlZm9yZURpZ2VzdCA9IGJlZm9yZS5zdGF0aWNJcj8uZGlnZXN0XG4gICAgY29uc3QgYWZ0ZXJEaWdlc3QgPSBhZnRlci5zdGF0aWNJcj8uZGlnZXN0XG4gICAgaWYgKGJlZm9yZURpZ2VzdCAhPT0gYWZ0ZXJEaWdlc3QpIHtcbiAgICAgIGNoYW5nZXMucHVzaCh7XG4gICAgICAgIHNldmVyaXR5OiBcIlJJU0tZXCIsXG4gICAgICAgIGNvZGU6IFwic3RhdGljSXIuZGlnZXN0Q2hhbmdlZFwiLFxuICAgICAgICBtZXNzYWdlOiBcInN0YXRpY0lyLmRpZ2VzdCBjaGFuZ2VkXCIsXG4gICAgICAgIHBvaW50ZXI6IFwiL3N0YXRpY0lyL2RpZ2VzdFwiLFxuICAgICAgICBkZXRhaWxzOiB7XG4gICAgICAgICAgYmVmb3JlOiBiZWZvcmVEaWdlc3QgPz8gbnVsbCxcbiAgICAgICAgICBhZnRlcjogYWZ0ZXJEaWdlc3QgPz8gbnVsbCxcbiAgICAgICAgfSxcbiAgICAgIH0pXG4gICAgfVxuICB9XG5cbiAgLy8gbWV0YSAoZGVmYXVsdDogUklTS1ksIGFsbG93bGlzdCBzdXBwb3J0ZWQpXG4gIHtcbiAgICBjb25zdCBtZXRhQmVmb3JlID0gYmVmb3JlLm1ldGEgPz8ge31cbiAgICBjb25zdCBtZXRhQWZ0ZXIgPSBhZnRlci5tZXRhID8/IHt9XG5cbiAgICBjb25zdCBhbGxvd2xpc3QgPSBvcHRpb25zPy5tZXRhQWxsb3dsaXN0XG4gICAgY29uc3Qga2V5cyA9XG4gICAgICBhbGxvd2xpc3QgIT0gbnVsbFxuICAgICAgICA/IHVuaXFTb3J0ZWQoYWxsb3dsaXN0KVxuICAgICAgICA6IHVuaXFTb3J0ZWQoWy4uLk9iamVjdC5rZXlzKG1ldGFCZWZvcmUpLCAuLi5PYmplY3Qua2V5cyhtZXRhQWZ0ZXIpXSlcblxuICAgIGNvbnN0IGNoYW5nZWQ6IEFycmF5PHsgcmVhZG9ubHkga2V5OiBzdHJpbmc7IHJlYWRvbmx5IGJlZm9yZTogSnNvblZhbHVlIHwgbnVsbDsgcmVhZG9ubHkgYWZ0ZXI6IEpzb25WYWx1ZSB8IG51bGwgfT4gPVxuICAgICAgW11cblxuICAgIGZvciAoY29uc3Qga2V5IG9mIGtleXMpIHtcbiAgICAgIGNvbnN0IGIgPSBrZXkgaW4gbWV0YUJlZm9yZSA/IChtZXRhQmVmb3JlIGFzIGFueSlba2V5XSA6IHVuZGVmaW5lZFxuICAgICAgY29uc3QgYSA9IGtleSBpbiBtZXRhQWZ0ZXIgPyAobWV0YUFmdGVyIGFzIGFueSlba2V5XSA6IHVuZGVmaW5lZFxuICAgICAgaWYgKCFlcUpzb25WYWx1ZShiLCBhKSkge1xuICAgICAgICBjaGFuZ2VkLnB1c2goe1xuICAgICAgICAgIGtleSxcbiAgICAgICAgICBiZWZvcmU6IChiID8/IG51bGwpIGFzIEpzb25WYWx1ZSB8IG51bGwsXG4gICAgICAgICAgYWZ0ZXI6IChhID8/IG51bGwpIGFzIEpzb25WYWx1ZSB8IG51bGwsXG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGNoYW5nZWQubGVuZ3RoID4gMCkge1xuICAgICAgY2hhbmdlcy5wdXNoKHtcbiAgICAgICAgc2V2ZXJpdHk6IFwiUklTS1lcIixcbiAgICAgICAgY29kZTogXCJtZXRhLmNoYW5nZWRcIixcbiAgICAgICAgbWVzc2FnZTogXCJtZXRhIGNoYW5nZWRcIixcbiAgICAgICAgcG9pbnRlcjogXCIvbWV0YVwiLFxuICAgICAgICBkZXRhaWxzOiB7XG4gICAgICAgICAga2V5czogY2hhbmdlZC5tYXAoKHgpID0+IHgua2V5KSxcbiAgICAgICAgICBjaGFuZ2VkLFxuICAgICAgICB9LFxuICAgICAgfSlcbiAgICB9XG4gIH1cblxuICAvLyBzb3VyY2UgKGRlZmF1bHQ6IElORk8pXG4gIHtcbiAgICBjb25zdCBiID0gYmVmb3JlLnNvdXJjZVxuICAgIGNvbnN0IGEgPSBhZnRlci5zb3VyY2VcbiAgICBpZiAoIWVxSnNvblZhbHVlKGIgPz8gbnVsbCwgYSA/PyBudWxsKSkge1xuICAgICAgY2hhbmdlcy5wdXNoKHtcbiAgICAgICAgc2V2ZXJpdHk6IFwiSU5GT1wiLFxuICAgICAgICBjb2RlOiBcInNvdXJjZS5jaGFuZ2VkXCIsXG4gICAgICAgIG1lc3NhZ2U6IFwic291cmNlIGNoYW5nZWRcIixcbiAgICAgICAgcG9pbnRlcjogXCIvc291cmNlXCIsXG4gICAgICAgIGRldGFpbHM6IHtcbiAgICAgICAgICBiZWZvcmU6IGIgPz8gbnVsbCxcbiAgICAgICAgICBhZnRlcjogYSA/PyBudWxsLFxuICAgICAgICB9LFxuICAgICAgfSlcbiAgICB9XG4gIH1cblxuICBjaGFuZ2VzLnNvcnQoKGEsIGIpID0+IHtcbiAgICBjb25zdCByYSA9IFNFVkVSSVRZX1JBTktbYS5zZXZlcml0eV1cbiAgICBjb25zdCByYiA9IFNFVkVSSVRZX1JBTktbYi5zZXZlcml0eV1cbiAgICBpZiAocmEgIT09IHJiKSByZXR1cm4gcmEgLSByYlxuICAgIGNvbnN0IGNhID0gYS5jb2RlLmxvY2FsZUNvbXBhcmUoYi5jb2RlKVxuICAgIGlmIChjYSAhPT0gMCkgcmV0dXJuIGNhXG4gICAgY29uc3QgcGEgPSBhLnBvaW50ZXIgPz8gXCJcIlxuICAgIGNvbnN0IHBiID0gYi5wb2ludGVyID8/IFwiXCJcbiAgICByZXR1cm4gcGEubG9jYWxlQ29tcGFyZShwYilcbiAgfSlcblxuICBjb25zdCBzdW1tYXJ5OiBNb2R1bGVNYW5pZmVzdERpZmZTdW1tYXJ5ID0ge1xuICAgIGJyZWFraW5nOiBjaGFuZ2VzLmZpbHRlcigoYykgPT4gYy5zZXZlcml0eSA9PT0gXCJCUkVBS0lOR1wiKS5sZW5ndGgsXG4gICAgcmlza3k6IGNoYW5nZXMuZmlsdGVyKChjKSA9PiBjLnNldmVyaXR5ID09PSBcIlJJU0tZXCIpLmxlbmd0aCxcbiAgICBpbmZvOiBjaGFuZ2VzLmZpbHRlcigoYykgPT4gYy5zZXZlcml0eSA9PT0gXCJJTkZPXCIpLmxlbmd0aCxcbiAgfVxuXG4gIGNvbnN0IHZlcmRpY3Q6IE1hbmlmZXN0RGlmZlZlcmRpY3QgPVxuICAgIHN1bW1hcnkuYnJlYWtpbmcgPiAwID8gXCJGQUlMXCIgOiBzdW1tYXJ5LnJpc2t5ID4gMCA/IFwiV0FSTlwiIDogXCJQQVNTXCJcblxuICByZXR1cm4ge1xuICAgIHZlcnNpb246IFwiMDI1XCIsXG4gICAgbW9kdWxlSWQ6IGFmdGVyLm1vZHVsZUlkLFxuICAgIGJlZm9yZToge1xuICAgICAgZGlnZXN0OiBiZWZvcmUuZGlnZXN0LFxuICAgICAgbWFuaWZlc3RWZXJzaW9uOiBiZWZvcmUubWFuaWZlc3RWZXJzaW9uLFxuICAgIH0sXG4gICAgYWZ0ZXI6IHtcbiAgICAgIGRpZ2VzdDogYWZ0ZXIuZGlnZXN0LFxuICAgICAgbWFuaWZlc3RWZXJzaW9uOiBhZnRlci5tYW5pZmVzdFZlcnNpb24sXG4gICAgfSxcbiAgICB2ZXJkaWN0LFxuICAgIGNoYW5nZXMsXG4gICAgc3VtbWFyeSxcbiAgfVxufVxuXG4iLCAiaW1wb3J0IHR5cGUgeyBBbnlNb2R1bGVTaGFwZSwgTW9kdWxlSW1wbCB9IGZyb20gXCIuL2ludGVybmFsL21vZHVsZS5qc1wiXG5pbXBvcnQgdHlwZSB7IEFueU1vZHVsZSB9IGZyb20gXCIuL01vZHVsZS5qc1wiXG5pbXBvcnQgdHlwZSB7IFN0YXRpY0lyIH0gZnJvbSBcIi4vaW50ZXJuYWwvc3RhdGUtdHJhaXQvaXIuanNcIlxuaW1wb3J0IHR5cGUgeyBFeHRyYWN0TWFuaWZlc3RPcHRpb25zLCBNb2R1bGVNYW5pZmVzdCB9IGZyb20gXCIuL2ludGVybmFsL3JlZmxlY3Rpb24vbWFuaWZlc3QuanNcIlxuaW1wb3J0ICogYXMgTWFuaWZlc3QgZnJvbSBcIi4vaW50ZXJuYWwvcmVmbGVjdGlvbi9tYW5pZmVzdC5qc1wiXG5pbXBvcnQgKiBhcyBTdGF0aWNJckV4cG9ydCBmcm9tIFwiLi9pbnRlcm5hbC9yZWZsZWN0aW9uL3N0YXRpY0lyLmpzXCJcbmltcG9ydCB0eXBlIHtcbiAgRGlmZk1hbmlmZXN0T3B0aW9ucyxcbiAgTW9kdWxlTWFuaWZlc3REaWZmLFxufSBmcm9tIFwiLi9pbnRlcm5hbC9yZWZsZWN0aW9uL2RpZmYuanNcIlxuaW1wb3J0ICogYXMgTWFuaWZlc3REaWZmIGZyb20gXCIuL2ludGVybmFsL3JlZmxlY3Rpb24vZGlmZi5qc1wiXG5cbmV4cG9ydCB0eXBlIHtcbiAgTW9kdWxlTWFuaWZlc3QsXG4gIEV4dHJhY3RNYW5pZmVzdE9wdGlvbnMsXG4gIE1vZHVsZU1hbmlmZXN0RGlmZixcbiAgRGlmZk1hbmlmZXN0T3B0aW9ucyxcbn1cblxuLyoqXG4gKiBSZWZsZWN0aW9uLmV4dHJhY3RNYW5pZmVzdFxuICpcbiAqIFx1NEVDRVx1NjcwMFx1N0VDOFx1NkEyMVx1NTc1N1x1NUJGOVx1OEM2MVx1RkYwOGBBbnlNb2R1bGVgIC8gYE1vZHVsZUltcGxgXHVGRjA5XHU2M0QwXHU1M0Q2XHU1RTczXHU1M0YwXHU1M0VGXHU2RDg4XHU4RDM5XHU3Njg0IE1hbmlmZXN0IElSXHVGRjA4SlNPTlx1RkYwQ1x1NTNFRiBkaWZmXHVGRjA5XHUzMDAyXG4gKi9cbmV4cG9ydCBjb25zdCBleHRyYWN0TWFuaWZlc3QgPSAoXG4gIG1vZHVsZTogTW9kdWxlSW1wbDxhbnksIEFueU1vZHVsZVNoYXBlLCBhbnk+IHwgQW55TW9kdWxlLFxuICBvcHRpb25zPzogRXh0cmFjdE1hbmlmZXN0T3B0aW9ucyxcbik6IE1vZHVsZU1hbmlmZXN0ID0+IE1hbmlmZXN0LmV4dHJhY3RNYW5pZmVzdChtb2R1bGUsIG9wdGlvbnMpXG5cbi8qKlxuICogUmVmbGVjdGlvbi5kaWZmTWFuaWZlc3RcbiAqXG4gKiBcdTVCRjlcdTZCRDRcdTRFMjRcdTRFRkQgTWFuaWZlc3RcdUZGMENcdTRFQTdcdTUxRkFcdTdBMzNcdTVCOUFcdTMwMDFcdTUzRUZcdTY3M0FcdThCRkJcdTc2ODRcdTVERUVcdTVGMDJcdTY0NThcdTg5ODFcdUZGMDhDSSBDb250cmFjdCBHdWFyZCAvIFVJIFx1NTkwRFx1NzUyOFx1RkYwOVx1MzAwMlxuICovXG5leHBvcnQgY29uc3QgZGlmZk1hbmlmZXN0ID0gKFxuICBiZWZvcmU6IE1vZHVsZU1hbmlmZXN0LFxuICBhZnRlcjogTW9kdWxlTWFuaWZlc3QsXG4gIG9wdGlvbnM/OiBEaWZmTWFuaWZlc3RPcHRpb25zLFxuKTogTW9kdWxlTWFuaWZlc3REaWZmID0+IE1hbmlmZXN0RGlmZi5kaWZmTWFuaWZlc3QoYmVmb3JlLCBhZnRlciwgb3B0aW9ucylcblxuLyoqXG4gKiBSZWZsZWN0aW9uLmV4cG9ydFN0YXRpY0lyXG4gKlxuICogXHU4MkU1IG1vZHVsZSBcdTU0MkIgU3RhdGVUcmFpdCBwcm9ncmFtXHVGRjBDXHU1MjE5XHU1QkZDXHU1MUZBIGNhbm9uaWNhbCBTdGF0aWNJUlx1RkYwOFx1NTkwRFx1NzUyOCBTdGF0ZVRyYWl0LmV4cG9ydFN0YXRpY0lyIFx1NzY4NFx1NUY2Mlx1NjAwMVx1NEUwRSBkaWdlc3RcdUZGMDlcdTMwMDJcbiAqL1xuZXhwb3J0IGNvbnN0IGV4cG9ydFN0YXRpY0lyID0gKFxuICBtb2R1bGU6IE1vZHVsZUltcGw8YW55LCBBbnlNb2R1bGVTaGFwZSwgYW55PiB8IEFueU1vZHVsZSxcbik6IFN0YXRpY0lyIHwgdW5kZWZpbmVkID0+IFN0YXRpY0lyRXhwb3J0LmV4cG9ydFN0YXRpY0lyKG1vZHVsZSlcbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7OztBQU1BLElBQU0sV0FBVyxDQUFDLFVBQ2hCLE9BQU8sVUFBVSxZQUFZLFVBQVUsUUFBUSxDQUFDLE1BQU0sUUFBUSxLQUFLO0FBRXJFLElBQU0sZUFBZSxDQUFDLFVBQ3BCLFNBQVMsS0FBSyxLQUFLLE1BQU0sU0FBUyxnQkFBZ0IsU0FBUyxNQUFNLE1BQU07QUFFekUsSUFBTSxrQkFBa0IsQ0FBQyxVQUEyQjtBQUNsRCxNQUFJLGFBQWEsS0FBSyxHQUFHO0FBQ3ZCLFVBQU0sS0FBTSxNQUFNLE9BQWU7QUFDakMsV0FBTyxPQUFPLE9BQU8sWUFBWSxHQUFHLFNBQVMsSUFBSSxLQUFLO0FBQUEsRUFDeEQ7QUFFQSxNQUFJLFNBQVMsS0FBSyxHQUFHO0FBQ25CLFVBQU0sS0FBSyxNQUFNO0FBQ2pCLFFBQUksT0FBTyxPQUFPLFlBQVksR0FBRyxTQUFTLEVBQUcsUUFBTztBQUNwRCxVQUFNLE1BQU8sTUFBYztBQUMzQixRQUFJLFFBQVEsT0FBTyxRQUFRLFlBQVksT0FBTyxRQUFRLGFBQWE7QUFDakUsWUFBTSxRQUFTLElBQVk7QUFDM0IsVUFBSSxPQUFPLFVBQVUsWUFBWSxNQUFNLFNBQVMsRUFBRyxRQUFPO0FBQUEsSUFDNUQ7QUFBQSxFQUNGO0FBRUEsU0FBTztBQUNUO0FBRUEsSUFBTSxtQkFBbUIs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QUk7QUFDdEMsUUFBSSxPQUFPLEVBQUcsUUFBTztBQUNyQixVQUFNLEtBQUssRUFBRSxXQUFXO0FBQ3hCLFVBQU0sS0FBSyxFQUFFLFdBQVc7QUFDeEIsV0FBTyxHQUFHLGNBQWMsRUFBRTtBQUFBLEVBQzVCLENBQUM7QUFFRCxRQUFNLFVBQXFDO0FBQUEsSUFDekMsVUFBVSxRQUFRLE9BQU8sQ0FBQyxNQUFNLEVBQUUsYUFBYSxVQUFVLEVBQUU7QUFBQSxJQUMzRCxPQUFPLFFBQVEsT0FBTyxDQUFDLE1BQU0sRUFBRSxhQUFhLE9BQU8sRUFBRTtBQUFBLElBQ3JELE1BQU0sUUFBUSxPQUFPLENBQUMsTUFBTSxFQUFFLGFBQWEsTUFBTSxFQUFFO0FBQUEsRUFDckQ7QUFFQSxRQUFNLFVBQ0osUUFBUSxXQUFXLElBQUksU0FBUyxRQUFRLFFBQVEsSUFBSSxTQUFTO0FBRS9ELFNBQU87QUFBQSxJQUNMLFNBQVM7QUFBQSxJQUNULFVBQVUsTUFBTTtBQUFBLElBQ2hCLFFBQVE7QUFBQSxNQUNOLFFBQVEsT0FBTztBQUFBLE1BQ2YsaUJBQWlCLE9BQU87QUFBQSxJQUMxQjtBQUFBLElBQ0EsT0FBTztBQUFBLE1BQ0wsUUFBUSxNQUFNO0FBQUEsTUFDZCxpQkFBaUIsTUFBTTtBQUFBLElBQ3pCO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsRUFDRjtBQUNGOzs7QUMxVU8sSUFBTUMsbUJBQWtCLENBQzdCLFFBQ0EsWUFDNEIsZ0JBQWdCLFFBQVEsT0FBTztBQU90RCxJQUFNQyxnQkFBZSxDQUMxQixRQUNBLE9BQ0EsWUFDb0MsYUFBYSxRQUFRLE9BQU8sT0FBTztBQU9sRSxJQUFNQyxrQkFBaUIsQ0FDNUIsV0FDd0NBLGdCQUFlLE1BQU07IiwKICAibmFtZXMiOiBbImV4cG9ydFN0YXRpY0lyIiwgImlzUmVjb3JkIiwgImlzTW9kdWxlSW1wbCIsICJyZXNvbHZlTW9kdWxlSWQiLCAibmV4dCIsICJleHBvcnRTdGF0aWNJciIsICJleHRyYWN0TWFuaWZlc3QiLCAiZGlmZk1hbmlmZXN0IiwgImV4cG9ydFN0YXRpY0lyIl0KfQo=