@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
@@ -1,390 +0,0 @@
1
- // @logixjs/core subpath bundles for @logixjs/sandbox
2
-
3
- import {
4
- build,
5
- install
6
- } from "./chunk-CDLXJHXY.js";
7
- import {
8
- Module
9
- } from "./chunk-YF6IO732.js";
10
- import {
11
- attachLogicUnitMeta
12
- } from "./chunk-PQ652ULI.js";
13
- import {
14
- mutateWithPatchPaths,
15
- mutateWithoutPatches
16
- } from "./chunk-JIXTOQXJ.js";
17
- import {
18
- normalizeActions
19
- } from "./chunk-DOBF6YTQ.js";
20
- import {
21
- registerModuleProgram
22
- } from "./chunk-A6JFUNQQ.js";
23
- import {
24
- getBoundInternals,
25
- setModuleTraitsProgram
26
- } from "./chunk-UCFEP3BH.js";
27
- import {
28
- currentDiagnosticsLevel,
29
- record
30
- } from "./chunk-UKYAF3NL.js";
31
- import {
32
- fnv1a32,
33
- stableStringify
34
- } from "./chunk-S46P7MC6.js";
35
-
36
- // ../logix-core/src/ModuleTag.ts
37
- import { Effect, FiberRef } from "../effect.js";
38
-
39
- // ../logix-core/src/internal/runtime/core/ModuleTraits.ts
40
- var ModuleTraitsConflictError = class extends Error {
41
- constructor(moduleId, conflicts) {
42
- super(
43
- [
44
- `[ModuleTraitsConflictError] Conflicting traitIds found (moduleId=${moduleId}).`,
45
- ...conflicts.map(
46
- (c) => c.kind === "duplicate_traitId" ? `- duplicate ${c.traitId}: ${c.sources.map((s) => `${s.originType}:${s.originId}`).join(", ")}` : c.kind === "missing_requires" ? `- missing requires for ${c.traitId}: ${(c.missing ?? []).join(", ")}; sources=${c.sources.map((s) => `${s.originType}:${s.originId}`).join(", ")}` : `- excludes violation for ${c.traitId}: present=${(c.present ?? []).join(", ")}; sources=${c.sources.map((s) => `${s.originType}:${s.originId}`).join(", ")}`
47
- )
48
- ].join("\n")
49
- );
50
- this.moduleId = moduleId;
51
- this.conflicts = conflicts;
52
- this._tag = "ModuleTraitsConflictError";
53
- }
54
- };
55
- var toProvenanceKey = (p) => `${p.originType}:${p.originId}:${p.originIdKind}:${p.originLabel}:${p.path ?? ""}`;
56
- var compareProvenance = (a, b) => {
57
- const type = a.originType.localeCompare(b.originType);
58
- if (type !== 0) return type;
59
- const id = a.originId.localeCompare(b.originId);
60
- if (id !== 0) return id;
61
- const kind = a.originIdKind.localeCompare(b.originIdKind);
62
- if (kind !== 0) return kind;
63
- const label = a.originLabel.localeCompare(b.originLabel);
64
- if (label !== 0) return label;
65
- return String(a.path ?? "").localeCompare(String(b.path ?? ""));
66
- };
67
- var originTypeOrder = (t) => t === "module" ? 0 : 1;
68
- var compareTraitIdByProvenance = (a, b) => {
69
- const ta = originTypeOrder(a.provenance.originType) - originTypeOrder(b.provenance.originType);
70
- if (ta !== 0) return ta;
71
- const oa = a.provenance.originId.localeCompare(b.provenance.originId);
72
- if (oa !== 0) return oa;
73
- return a.traitId.localeCompare(b.traitId);
74
- };
75
- var extractStringArray = (value) => {
76
- if (!Array.isArray(value)) return [];
77
- const out = [];
78
- for (const v of value) {
79
- if (typeof v !== "string") continue;
80
- const s = v.trim();
81
- if (!s) continue;
82
- out.push(s);
83
- }
84
- return out;
85
- };
86
- var getTraitRequires = (value) => {
87
- if (!value || typeof value !== "object") return [];
88
- const direct = extractStringArray(value.requires);
89
- return direct;
90
- };
91
- var getTraitExcludes = (value) => {
92
- if (!value || typeof value !== "object") return [];
93
- const direct = extractStringArray(value.excludes);
94
- return direct;
95
- };
96
- var getTraitName = (traitId, value) => {
97
- if (value && typeof value === "object") {
98
- const n = value.name;
99
- if (typeof n === "string" && n.trim().length > 0) return n.trim();
100
- }
101
- return traitId;
102
- };
103
- var getTraitDescription = (value) => {
104
- if (value && typeof value === "object") {
105
- const d = value.description;
106
- if (typeof d === "string" && d.trim().length > 0) return d.trim();
107
- }
108
- return void 0;
109
- };
110
- var finalizeTraitContributions = (args) => {
111
- const traitById = /* @__PURE__ */ new Map();
112
- const duplicateSources = /* @__PURE__ */ new Map();
113
- const contributions = [...args.contributions].sort((a, b) => compareProvenance(a.provenance, b.provenance));
114
- for (const c of contributions) {
115
- const traits2 = c.traits;
116
- if (!traits2 || typeof traits2 !== "object") continue;
117
- for (const traitId of Object.keys(traits2).sort((a, b) => a.localeCompare(b))) {
118
- const value = traits2[traitId];
119
- if (value === void 0) continue;
120
- const prev = traitById.get(traitId);
121
- if (!prev) {
122
- traitById.set(traitId, { value, provenance: c.provenance });
123
- continue;
124
- }
125
- const sources = duplicateSources.get(traitId) ?? [prev.provenance];
126
- sources.push(c.provenance);
127
- duplicateSources.set(traitId, sources);
128
- }
129
- }
130
- const conflicts = [];
131
- const registerConflict = (conflict) => {
132
- const unique = /* @__PURE__ */ new Map();
133
- for (const s of conflict.sources) {
134
- unique.set(toProvenanceKey(s), s);
135
- }
136
- conflicts.push({
137
- ...conflict,
138
- sources: Array.from(unique.values()).sort(compareProvenance)
139
- });
140
- };
141
- for (const traitId of Array.from(duplicateSources.keys()).sort((a, b) => a.localeCompare(b))) {
142
- registerConflict({
143
- kind: "duplicate_traitId",
144
- traitId,
145
- sources: duplicateSources.get(traitId) ?? []
146
- });
147
- }
148
- const merged = {};
149
- const provenanceIndex = {};
150
- const traits = [];
151
- const entries = [];
152
- for (const traitId of traitById.keys()) {
153
- const entry = traitById.get(traitId);
154
- if (!entry) continue;
155
- entries.push({ traitId, value: entry.value, provenance: entry.provenance });
156
- }
157
- const ids = entries.slice().sort(compareTraitIdByProvenance).map((e) => e.traitId);
158
- for (const traitId of ids) {
159
- const entry = traitById.get(traitId);
160
- if (!entry) continue;
161
- merged[traitId] = entry.value;
162
- provenanceIndex[traitId] = entry.provenance;
163
- traits.push({
164
- traitId,
165
- name: getTraitName(traitId, entry.value),
166
- description: getTraitDescription(entry.value)
167
- });
168
- }
169
- const present = new Set(ids);
170
- for (const traitId of ids) {
171
- const entry = traitById.get(traitId);
172
- if (!entry) continue;
173
- const requires = getTraitRequires(entry.value);
174
- if (requires.length > 0) {
175
- const missing = requires.filter((r) => !present.has(r));
176
- if (missing.length > 0) {
177
- registerConflict({
178
- kind: "missing_requires",
179
- traitId,
180
- missing: Array.from(new Set(missing)).sort((a, b) => a.localeCompare(b)),
181
- sources: [entry.provenance]
182
- });
183
- }
184
- }
185
- const excludes = getTraitExcludes(entry.value);
186
- if (excludes.length > 0) {
187
- const presentExcluded = excludes.filter((e) => present.has(e));
188
- if (presentExcluded.length > 0) {
189
- const otherSources = [];
190
- for (const otherId of presentExcluded) {
191
- const other = traitById.get(otherId);
192
- if (other) otherSources.push(other.provenance);
193
- }
194
- registerConflict({
195
- kind: "excludes_violation",
196
- traitId,
197
- present: Array.from(new Set(presentExcluded)).sort((a, b) => a.localeCompare(b)),
198
- sources: [entry.provenance, ...otherSources]
199
- });
200
- }
201
- }
202
- }
203
- if (conflicts.length > 0) {
204
- const kindOrder = {
205
- duplicate_traitId: 0,
206
- missing_requires: 1,
207
- excludes_violation: 2
208
- };
209
- conflicts.sort((a, b) => {
210
- const k = kindOrder[a.kind] - kindOrder[b.kind];
211
- if (k !== 0) return k;
212
- return a.traitId.localeCompare(b.traitId);
213
- });
214
- throw new ModuleTraitsConflictError(args.moduleId, conflicts);
215
- }
216
- const digestBase = {
217
- moduleId: args.moduleId,
218
- traits,
219
- provenanceIndex
220
- };
221
- const digest = `mtraits:023:${fnv1a32(stableStringify(digestBase))}`;
222
- return {
223
- merged,
224
- snapshot: {
225
- moduleId: args.moduleId,
226
- digest,
227
- traits,
228
- provenanceIndex
229
- }
230
- };
231
- };
232
-
233
- // ../logix-core/src/ModuleTag.ts
234
- var Reducer = {
235
- mutate: (mutator) => (state, action, sink) => {
236
- const payload = action?.payload;
237
- if (!sink) {
238
- return mutateWithoutPatches(state, (draft) => {
239
- mutator(draft, payload);
240
- });
241
- }
242
- const { nextState, patchPaths } = mutateWithPatchPaths(state, (draft) => {
243
- mutator(draft, payload);
244
- });
245
- for (const path of patchPaths) {
246
- sink(path);
247
- }
248
- return nextState;
249
- },
250
- mutateMap: (mutators) => {
251
- const out = {};
252
- for (const key of Object.keys(mutators)) {
253
- const mutator = mutators[key];
254
- if (typeof mutator !== "function") continue;
255
- out[key] = Reducer.mutate(mutator);
256
- }
257
- return out;
258
- }
259
- };
260
- var makeImpl = (id, def) => Module(id, def);
261
- var make = (id, def) => {
262
- const actions = normalizeActions(def.actions);
263
- const moduleTag = makeImpl(id, {
264
- state: def.state,
265
- actions,
266
- reducers: def.reducers
267
- });
268
- const stateSchema = def.state;
269
- const moduleTraitsSpec = def.traits;
270
- const baseProgram = moduleTraitsSpec ? build(stateSchema, moduleTraitsSpec) : void 0;
271
- if (baseProgram) {
272
- setModuleTraitsProgram(moduleTag, baseProgram);
273
- registerModuleProgram(id, baseProgram);
274
- }
275
- const makeModuleTraitsContributionLogic = (traits) => {
276
- const logic = moduleTag.logic(($) => ({
277
- setup: Effect.sync(() => {
278
- if (!traits || typeof traits !== "object") return;
279
- const internals = getBoundInternals($);
280
- internals.traits.registerModuleTraitsContribution({
281
- traits,
282
- provenance: {
283
- originType: "module",
284
- originId: id,
285
- originIdKind: "explicit",
286
- originLabel: `module:${id}`
287
- }
288
- });
289
- }),
290
- run: Effect.void
291
- }));
292
- attachLogicUnitMeta(logic, {
293
- id: "__logix_internal:traits:module_contrib",
294
- kind: "internal",
295
- name: "traits:module_contrib",
296
- moduleId: id
297
- });
298
- return logic;
299
- };
300
- const makeFinalizeTraitsLogic = () => {
301
- const logic = moduleTag.logic(($) => ({
302
- setup: Effect.gen(function* () {
303
- const internals = getBoundInternals($);
304
- const diagnosticsLevel = yield* FiberRef.get(currentDiagnosticsLevel);
305
- const contributions = internals.traits.getModuleTraitsContributions();
306
- let merged;
307
- let snapshot;
308
- try {
309
- ;
310
- ({ merged, snapshot } = finalizeTraitContributions({
311
- moduleId: id,
312
- contributions
313
- }));
314
- } catch (cause) {
315
- if (diagnosticsLevel !== "off" && cause && typeof cause === "object" && cause._tag === "ModuleTraitsConflictError") {
316
- const conflicts = Array.isArray(cause.conflicts) ? cause.conflicts : [];
317
- const traitIds = conflicts.map((c) => c && typeof c === "object" ? c.traitId : void 0).filter((t) => typeof t === "string" && t.length > 0).slice(0, 20);
318
- const data = diagnosticsLevel === "full" ? {
319
- conflictCount: conflicts.length,
320
- conflicts
321
- } : {
322
- conflictCount: conflicts.length,
323
- traitIds
324
- };
325
- yield* record({
326
- type: "trace:module:traits:conflict",
327
- moduleId: id,
328
- instanceId: internals.instanceId,
329
- data
330
- });
331
- }
332
- throw cause;
333
- }
334
- internals.traits.setModuleTraitsSnapshot(snapshot);
335
- internals.traits.freezeModuleTraits();
336
- if (diagnosticsLevel !== "off") {
337
- const data = diagnosticsLevel === "full" ? {
338
- digest: snapshot.digest,
339
- count: snapshot.traits.length,
340
- traits: snapshot.traits,
341
- provenanceIndex: snapshot.provenanceIndex
342
- } : {
343
- digest: snapshot.digest,
344
- count: snapshot.traits.length
345
- };
346
- yield* record({
347
- type: "trace:module:traits",
348
- moduleId: id,
349
- instanceId: internals.instanceId,
350
- data
351
- });
352
- }
353
- if (Object.keys(merged).length === 0) {
354
- return;
355
- }
356
- const onlyModuleLevel = contributions.length === 1 && contributions[0]?.provenance?.originType === "module";
357
- const program = onlyModuleLevel && baseProgram ? baseProgram : build(stateSchema, merged);
358
- setModuleTraitsProgram(moduleTag, program);
359
- registerModuleProgram(id, program);
360
- yield* install($, program);
361
- }),
362
- run: Effect.void
363
- }));
364
- attachLogicUnitMeta(logic, {
365
- id: "__logix_internal:traits:finalize",
366
- kind: "internal",
367
- name: "traits:finalize",
368
- moduleId: id
369
- });
370
- return logic;
371
- };
372
- const originalImplement = moduleTag.implement;
373
- moduleTag.implement = ((config) => {
374
- const userLogics = config.logics ?? [];
375
- const moduleLevel = def.traits ? [makeModuleTraitsContributionLogic(def.traits)] : [];
376
- const finalize = makeFinalizeTraitsLogic();
377
- const mergedLogics = [...moduleLevel, ...userLogics, finalize];
378
- return originalImplement({
379
- ...config,
380
- logics: mergedLogics
381
- });
382
- });
383
- return moduleTag;
384
- };
385
-
386
- export {
387
- Reducer,
388
- make
389
- };
390
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vbG9naXgtY29yZS9zcmMvTW9kdWxlVGFnLnRzIiwgIi4uLy4uLy4uLy4uL2xvZ2l4LWNvcmUvc3JjL2ludGVybmFsL3J1bnRpbWUvY29yZS9Nb2R1bGVUcmFpdHMudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbImltcG9ydCB7IEVmZmVjdCwgRmliZXJSZWYsIExheWVyLCBTY2hlbWEgfSBmcm9tICdlZmZlY3QnXG5pbXBvcnQgKiBhcyBMb2dpYyBmcm9tICcuL0xvZ2ljLmpzJ1xuaW1wb3J0ICogYXMgQWN0aW9uIGZyb20gJy4vaW50ZXJuYWwvYWN0aW9uLmpzJ1xuaW1wb3J0ICogYXMgTW9kdWxlRmFjdG9yeSBmcm9tICcuL2ludGVybmFsL3J1bnRpbWUvTW9kdWxlRmFjdG9yeS5qcydcbmltcG9ydCB0eXBlIHsgRmllbGRQYXRoIH0gZnJvbSAnLi9pbnRlcm5hbC9maWVsZC1wYXRoLmpzJ1xuaW1wb3J0IHsgbXV0YXRlV2l0aG91dFBhdGNoZXMsIG11dGF0ZVdpdGhQYXRjaFBhdGhzIH0gZnJvbSAnLi9pbnRlcm5hbC9ydW50aW1lL2NvcmUvbXV0YXRpdmVQYXRjaGVzLmpzJ1xuaW1wb3J0IHsgZ2V0Qm91bmRJbnRlcm5hbHMsIHNldE1vZHVsZVRyYWl0c1Byb2dyYW0gfSBmcm9tICcuL2ludGVybmFsL3J1bnRpbWUvY29yZS9ydW50aW1lSW50ZXJuYWxzQWNjZXNzb3IuanMnXG5pbXBvcnQgKiBhcyBEZWJ1ZyBmcm9tICcuL2ludGVybmFsL3J1bnRpbWUvY29yZS9EZWJ1Z1NpbmsuanMnXG5pbXBvcnQgKiBhcyBMb2dpY1VuaXRNZXRhIGZyb20gJy4vaW50ZXJuYWwvcnVudGltZS9jb3JlL0xvZ2ljVW5pdE1ldGEuanMnXG5pbXBvcnQgdHlwZSB7XG4gIEFjdGlvbnNGcm9tTWFwLFxuICBBbnlNb2R1bGVTaGFwZSxcbiAgQW55U2NoZW1hLFxuICBCb3VuZEFwaSxcbiAgQWN0aW9uT2YsXG4gIE1vZHVsZUltcGwsXG4gIE1vZHVsZUxvZ2ljLFxuICBNb2R1bGVTaGFwZSxcbiAgTW9kdWxlUnVudGltZSxcbiAgTW9kdWxlVGFnLFxuICBNb2R1bGVIYW5kbGUsXG4gIE1vZHVsZUhhbmRsZVVuaW9uLFxuICBTdGF0ZUNoYW5nZVdpdGhNZXRhLFxuICBTdGF0ZUNvbW1pdE1ldGEsXG4gIFN0YXRlQ29tbWl0TW9kZSxcbiAgU3RhdGVDb21taXRQcmlvcml0eSxcbiAgUmVkdWNlcnNGcm9tTWFwLFxuICBTdGF0ZU9mLFxufSBmcm9tICcuL2ludGVybmFsL21vZHVsZS5qcydcbmltcG9ydCAqIGFzIFN0YXRlVHJhaXQgZnJvbSAnLi9TdGF0ZVRyYWl0LmpzJ1xuaW1wb3J0IHR5cGUgeyBTdGF0ZVRyYWl0UHJvZ3JhbSB9IGZyb20gJy4vU3RhdGVUcmFpdC5qcydcbmltcG9ydCAqIGFzIE1vZHVsZVRyYWl0c1JlZ2lzdHJ5IGZyb20gJy4vaW50ZXJuYWwvZGVidWcvTW9kdWxlVHJhaXRzUmVnaXN0cnkuanMnXG5pbXBvcnQgKiBhcyBNb2R1bGVUcmFpdHMgZnJvbSAnLi9pbnRlcm5hbC9ydW50aW1lL2NvcmUvTW9kdWxlVHJhaXRzLmpzJ1xuXG50eXBlIE5vSW5mZXJfPFQ+ID0gW1RdW1QgZXh0ZW5kcyBhbnkgPyAwIDogbmV2ZXJdXG5cbi8qKlxuICogUHVibGljIGV4cG9ydHMgZm9yIGNvcmUgdHlwZSBkZWZpbml0aW9ucyBzdWNoIGFzIE1vZHVsZVRhZyAvIE1vZHVsZVJ1bnRpbWUgLyBNb2R1bGVJbXBsLlxuICpcbiAqIEtlcHQgYWxpZ25lZCB3aXRoIGAuY29kZXgvc2tpbGxzL3Byb2plY3QtZ3VpZGUvcmVmZXJlbmNlcy9ydW50aW1lLWxvZ2l4L2xvZ2l4LWNvcmUvYXBpLzAyLW1vZHVsZS1hbmQtbG9naWMtYXBpLm1kYC5cbiAqIENvbmNyZXRlIHR5cGUgZGVmaW5pdGlvbnMgbGl2ZSBpbiBpbnRlcm5hbC9tb2R1bGUudHM7IHRoaXMgbW9kdWxlIHdpcmVzIHRoZSBmYWN0b3J5IGltcGxlbWVudGF0aW9uLlxuICovXG5leHBvcnQgdHlwZSB7XG4gIEFueVNjaGVtYSxcbiAgQW55TW9kdWxlU2hhcGUsXG4gIE1vZHVsZVNoYXBlLFxuICBNb2R1bGVMb2dpYyxcbiAgTW9kdWxlSW1wbCxcbiAgTW9kdWxlUnVudGltZSxcbiAgTW9kdWxlVGFnLFxuICBNb2R1bGVIYW5kbGUsXG4gIE1vZHVsZUhhbmRsZVVuaW9uLFxuICBTdGF0ZU9mLFxuICBBY3Rpb25zRnJvbU1hcCxcbiAgUmVkdWNlcnNGcm9tTWFwLFxuICBCb3VuZEFwaSxcbiAgQWN0aW9uT2YsXG4gIFN0YXRlQ29tbWl0TW9kZSxcbiAgU3RhdGVDb21taXRQcmlvcml0eSxcbiAgU3RhdGVDb21taXRNZXRhLFxuICBTdGF0ZUNoYW5nZVdpdGhNZXRhLFxufSBmcm9tICcuL2ludGVybmFsL21vZHVsZS5qcydcblxuLyoqXG4gKiBSZWR1Y2VyIGhlbHBlcjpcbiAqIC0gYFJlZHVjZXIubXV0YXRlYCBwcm92aWRlcyB0aGUgc2FtZSBtdXRhdGl2ZSBzdHlsZSBhcyBgJC5zdGF0ZS5tdXRhdGVgLlxuICogLSBJbnRlcm5hbGx5IHVzZXMgbXV0YXRpdmUtYmFzZWQgaW1tdXRhYmxlIHVwZGF0ZXMgdG8gbWFwIFwiaW4tcGxhY2UgZHJhZnQgbXV0YXRpb25cIiBpbnRvIGEgcHVyZSBgKHN0YXRlLCBhY3Rpb24pID0+IHN0YXRlYC5cbiAqXG4gKiBAZXhhbXBsZVxuICpcbiAqICAgY29uc3QgQ291bnRlciA9IExvZ2l4Lk1vZHVsZVRhZy5tYWtlKFwiQ291bnRlclwiLCB7XG4gKiAgICAgc3RhdGU6IENvdW50ZXJTdGF0ZSxcbiAqICAgICBhY3Rpb25zOiBDb3VudGVyQWN0aW9ucyxcbiAqICAgICByZWR1Y2Vyczoge1xuICogICAgICAgaW5jOiBMb2dpeC5Nb2R1bGVUYWcuUmVkdWNlci5tdXRhdGUoKGRyYWZ0LCBfcGF5bG9hZCkgPT4ge1xuICogICAgICAgICBkcmFmdC5jb3VudCArPSAxXG4gKiAgICAgICB9KSxcbiAqICAgICB9LFxuICogICB9KVxuICpcbiAqICAgeWllbGQqICQucmVkdWNlcihcbiAqICAgICBcInNldFZhbHVlXCIsXG4gKiAgICAgTG9naXguTW9kdWxlVGFnLlJlZHVjZXIubXV0YXRlKChkcmFmdCwgcGF5bG9hZCkgPT4ge1xuICogICAgICAgZHJhZnQudmFsdWUgPSBwYXlsb2FkXG4gKiAgICAgfSksXG4gKiAgIClcbiAqL1xuZXhwb3J0IGNvbnN0IFJlZHVjZXIgPSB7XG4gIG11dGF0ZTpcbiAgICA8UywgQSBleHRlbmRzIHsgcmVhZG9ubHkgcGF5bG9hZD86IGFueSB9PihcbiAgICAgIG11dGF0b3I6IChkcmFmdDogTG9naWMuRHJhZnQ8Uz4sIHBheWxvYWQ6IEFbJ3BheWxvYWQnXSkgPT4gdm9pZCxcbiAgICApOiAoKHN0YXRlOiBTLCBhY3Rpb246IEEsIHNpbms/OiAocGF0aDogc3RyaW5nIHwgRmllbGRQYXRoKSA9PiB2b2lkKSA9PiBTKSA9PlxuICAgIChzdGF0ZSwgYWN0aW9uLCBzaW5rKSA9PiB7XG4gICAgICBjb25zdCBwYXlsb2FkID0gKGFjdGlvbiBhcyBhbnkpPy5wYXlsb2FkIGFzIEFbJ3BheWxvYWQnXVxuICAgICAgaWYgKCFzaW5rKSB7XG4gICAgICAgIHJldHVybiBtdXRhdGVXaXRob3V0UGF0Y2hlcyhzdGF0ZSBhcyBTLCAoZHJhZnQpID0+IHtcbiAgICAgICAgICBtdXRhdG9yKGRyYWZ0IGFzIExvZ2ljLkRyYWZ0PFM+LCBwYXlsb2FkKVxuICAgICAgICB9KVxuICAgICAgfVxuXG4gICAgICBjb25zdCB7IG5leHRTdGF0ZSwgcGF0Y2hQYXRocyB9ID0gbXV0YXRlV2l0aFBhdGNoUGF0aHMoc3RhdGUgYXMgUywgKGRyYWZ0KSA9PiB7XG4gICAgICAgIG11dGF0b3IoZHJhZnQgYXMgTG9naWMuRHJhZnQ8Uz4sIHBheWxvYWQpXG4gICAgICB9KVxuXG4gICAgICBmb3IgKGNvbnN0IHBhdGggb2YgcGF0Y2hQYXRocykge1xuICAgICAgICBzaW5rKHBhdGgpXG4gICAgICB9XG5cbiAgICAgIHJldHVybiBuZXh0U3RhdGVcbiAgICB9LFxuXG4gIG11dGF0ZU1hcDogPFxuICAgIFIgZXh0ZW5kcyBSZWFkb25seTxcbiAgICAgIFJlY29yZDxzdHJpbmcsICgoc3RhdGU6IGFueSwgYWN0aW9uOiBhbnksIHNpbms/OiAocGF0aDogc3RyaW5nIHwgRmllbGRQYXRoKSA9PiB2b2lkKSA9PiBhbnkpIHwgdW5kZWZpbmVkPlxuICAgID4sXG4gID4obXV0YXRvcnM6IHtcbiAgICByZWFkb25seSBbSyBpbiBrZXlvZiBOb0luZmVyXzxSPl0/OiAoXG4gICAgICBkcmFmdDogTG9naWMuRHJhZnQ8UGFyYW1ldGVyczxOb25OdWxsYWJsZTxOb0luZmVyXzxSPltLXT4+WzBdPixcbiAgICAgIHBheWxvYWQ6IFBhcmFtZXRlcnM8Tm9uTnVsbGFibGU8Tm9JbmZlcl88Uj5bS10+PlsxXSBleHRlbmRzIHsgcmVhZG9ubHkgcGF5bG9hZDogaW5mZXIgUCB9XG4gICAgICAgID8gUFxuICAgICAgICA6IFBhcmFtZXRlcnM8Tm9uTnVsbGFibGU8Tm9JbmZlcl88Uj5bS10+PlsxXSBleHRlbmRzIHsgcmVhZG9ubHkgcGF5bG9hZD86IGluZmVyIFAgfVxuICAgICAgICAgID8gUCB8IHVuZGVmaW5lZFxuICAgICAgICAgIDogbmV2ZXIsXG4gICAgKSA9PiB2b2lkXG4gIH0pOiBSID0+IHtcbiAgICBjb25zdCBvdXQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge31cbiAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhtdXRhdG9ycykpIHtcbiAgICAgIGNvbnN0IG11dGF0b3IgPSAobXV0YXRvcnMgYXMgYW55KVtrZXldXG4gICAgICBpZiAodHlwZW9mIG11dGF0b3IgIT09ICdmdW5jdGlvbicpIGNvbnRpbnVlXG4gICAgICBvdXRba2V5XSA9IFJlZHVjZXIubXV0YXRlKG11dGF0b3IgYXMgYW55KVxuICAgIH1cbiAgICByZXR1cm4gb3V0IGFzIGFueVxuICB9LFxufVxuXG4vKipcbiAqIEEgc2ltcGxpZmllZCBTaGFwZSBkZWZpbml0aW9uIGhlbHBlciwgZGVzaWduZWQgZm9yIEFjdGlvbiBNYXBzLlxuICogQGV4YW1wbGUgdHlwZSBNeVNoYXBlID0gU2hhcGU8dHlwZW9mIE15U3RhdGUsIHR5cGVvZiBNeUFjdGlvbk1hcD5cbiAqL1xuZXhwb3J0IHR5cGUgU2hhcGU8UyBleHRlbmRzIEFueVNjaGVtYSwgTSBleHRlbmRzIFJlY29yZDxzdHJpbmcsIEFueVNjaGVtYT4+ID0gTW9kdWxlU2hhcGU8XG4gIFMsXG4gIFNjaGVtYS5TY2hlbWE8QWN0aW9uc0Zyb21NYXA8QWN0aW9uLk5vcm1hbGl6ZWRBY3Rpb25Ub2tlbnM8TSAmIEFjdGlvbi5BY3Rpb25EZWZzPj4+LFxuICBBY3Rpb24uTm9ybWFsaXplZEFjdGlvblRva2VuczxNICYgQWN0aW9uLkFjdGlvbkRlZnM+XG4+XG5cbmNvbnN0IG1ha2VJbXBsID0gPElkIGV4dGVuZHMgc3RyaW5nLCBTU2NoZW1hIGV4dGVuZHMgQW55U2NoZW1hLCBBTWFwIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgQWN0aW9uLkFueUFjdGlvblRva2VuPj4oXG4gIGlkOiBJZCxcbiAgZGVmOiB7XG4gICAgcmVhZG9ubHkgc3RhdGU6IFNTY2hlbWFcbiAgICByZWFkb25seSBhY3Rpb25zOiBBTWFwXG4gICAgcmVhZG9ubHkgcmVkdWNlcnM/OiBSZWR1Y2Vyc0Zyb21NYXA8U1NjaGVtYSwgQU1hcD5cbiAgfSxcbik6IE1vZHVsZVRhZzxJZCwgTW9kdWxlU2hhcGU8U1NjaGVtYSwgU2NoZW1hLlNjaGVtYTxBY3Rpb25zRnJvbU1hcDxBTWFwPj4sIEFNYXA+PiA9PlxuICBNb2R1bGVGYWN0b3J5Lk1vZHVsZShpZCwgZGVmKSBhcyBNb2R1bGVUYWc8SWQsIE1vZHVsZVNoYXBlPFNTY2hlbWEsIFNjaGVtYS5TY2hlbWE8QWN0aW9uc0Zyb21NYXA8QU1hcD4+LCBBTWFwPj5cblxuLyoqXG4gKiBNb2R1bGVUYWcubWFrZVx1RkYxQVxuICogLSBEZWZpbmVzIGEgZG9tYWluIG1vZHVsZSBUYWcgdXNpbmcgdGhlIGdpdmVuIGlkIGFuZCBzdGF0ZS9hY3Rpb25zL3JlZHVjZXJzLlxuICogLSBUaGUgcmV0dXJuZWQgTW9kdWxlVGFnIGlzIGJvdGggYSBDb250ZXh0LlRhZyBhbmQgYSBmYWN0b3J5IGNhcnJ5aW5nIGl0cyBTaGFwZS5cbiAqXG4gKiBOb3RlOiBzaW5jZSAwMjIsIHRoZSBvbGQgYE1vZHVsZWAgKFRhZyBpZGVudGl0eSkgd2FzIHJlbmFtZWQgdG8gYE1vZHVsZVRhZ2A7IHVzZSBgTG9naXguTW9kdWxlYCBmb3IgbW9kdWxlIGRlZmluaXRpb24gb2JqZWN0cy5cbiAqL1xuZXhwb3J0IGNvbnN0IG1ha2UgPSA8SWQgZXh0ZW5kcyBzdHJpbmcsIFNTY2hlbWEgZXh0ZW5kcyBBbnlTY2hlbWEsIEFEZWZzIGV4dGVuZHMgQWN0aW9uLkFjdGlvbkRlZnM+KFxuICBpZDogSWQsXG4gIGRlZjoge1xuICAgIHJlYWRvbmx5IHN0YXRlOiBTU2NoZW1hXG4gICAgcmVhZG9ubHkgYWN0aW9uczogQURlZnNcbiAgICByZWFkb25seSByZWR1Y2Vycz86IFJlZHVjZXJzRnJvbU1hcDxTU2NoZW1hLCBBRGVmcz5cbiAgICAvKipcbiAgICAgKiB0cmFpdHNcdUZGMUFcbiAgICAgKiAtIFVzZWQgdG8gYXR0YWNoIGEgU3RhdGVUcmFpdFNwZWMgKHNlZSBzcGVjcy8wMDAtbW9kdWxlLXRyYWl0cy1ydW50aW1lKS5cbiAgICAgKiAtIFRoZSBjdXJyZW50IGltcGxlbWVudGF0aW9uIGJ1aWxkcyBhIFByb2dyYW0gZHVyaW5nIE1vZHVsZVRhZy5tYWtlLCBhbmQgaW5qZWN0cyBhIHNldHVwLW9ubHkgTG9naWMgaW4gYE1vZHVsZVRhZy5pbXBsZW1lbnRgXG4gICAgICogICB0byBjYWxsIGBTdGF0ZVRyYWl0Lmluc3RhbGxgLlxuICAgICAqICAgKE5vdGU6IGlmIHlvdSB1c2UgYE1vZHVsZVRhZy5saXZlYCB0byBleHBvcnQgYSBMYXllciBhbmQgd2FudCB0cmFpdCBiZWhhdmlvciwgY2FsbCBgU3RhdGVUcmFpdC5pbnN0YWxsYCBleHBsaWNpdGx5IGluIGxvZ2ljcyxcbiAgICAgKiAgIG9yIHVzZSBgTW9kdWxlVGFnLmltcGxlbWVudGAgaW5zdGVhZC4pXG4gICAgICovXG4gICAgcmVhZG9ubHkgdHJhaXRzPzogdW5rbm93blxuICB9LFxuKTogTW9kdWxlVGFnPFxuICBJZCxcbiAgTW9kdWxlU2hhcGU8XG4gICAgU1NjaGVtYSxcbiAgICBTY2hlbWEuU2NoZW1hPEFjdGlvbnNGcm9tTWFwPEFjdGlvbi5Ob3JtYWxpemVkQWN0aW9uVG9rZW5zPEFEZWZzPj4+LFxuICAgIEFjdGlvbi5Ob3JtYWxpemVkQWN0aW9uVG9rZW5zPEFEZWZzPlxuICA+XG4+ID0+IHtcbiAgY29uc3QgYWN0aW9ucyA9IEFjdGlvbi5ub3JtYWxpemVBY3Rpb25zKGRlZi5hY3Rpb25zKVxuICBjb25zdCBtb2R1bGVUYWcgPSBtYWtlSW1wbChpZCwge1xuICAgIHN0YXRlOiBkZWYuc3RhdGUsXG4gICAgYWN0aW9ucyxcbiAgICByZWR1Y2VyczogZGVmLnJlZHVjZXJzIGFzIGFueSxcbiAgfSlcblxuICB0eXBlIFNoID0gTW9kdWxlU2hhcGU8XG4gICAgU1NjaGVtYSxcbiAgICBTY2hlbWEuU2NoZW1hPEFjdGlvbnNGcm9tTWFwPEFjdGlvbi5Ob3JtYWxpemVkQWN0aW9uVG9rZW5zPEFEZWZzPj4+LFxuICAgIEFjdGlvbi5Ob3JtYWxpemVkQWN0aW9uVG9rZW5zPEFEZWZzPlxuICA+XG5cbiAgY29uc3Qgc3RhdGVTY2hlbWEgPSBkZWYuc3RhdGUgYXMgU2NoZW1hLlNjaGVtYTxhbnksIGFueT5cbiAgY29uc3QgbW9kdWxlVHJhaXRzU3BlYyA9IGRlZi50cmFpdHMgYXMgU3RhdGVUcmFpdC5TdGF0ZVRyYWl0U3BlYzxhbnk+IHwgdW5kZWZpbmVkXG4gIGNvbnN0IGJhc2VQcm9ncmFtOiBTdGF0ZVRyYWl0UHJvZ3JhbTxhbnk+IHwgdW5kZWZpbmVkID0gbW9kdWxlVHJhaXRzU3BlY1xuICAgID8gU3RhdGVUcmFpdC5idWlsZChzdGF0ZVNjaGVtYSBhcyBhbnksIG1vZHVsZVRyYWl0c1NwZWMgYXMgYW55KVxuICAgIDogdW5kZWZpbmVkXG5cbiAgaWYgKGJhc2VQcm9ncmFtKSB7XG4gICAgLy8gRm9yIFRyYWl0TGlmZWN5Y2xlL0RlYnVnL0RldnRvb2xzIHJlYWRzIChkZWZpbml0aW9uLXNpZGUgaGlkZGVuIHNsb3QpLlxuICAgIHNldE1vZHVsZVRyYWl0c1Byb2dyYW0obW9kdWxlVGFnIGFzIGFueSwgYmFzZVByb2dyYW0pXG4gICAgTW9kdWxlVHJhaXRzUmVnaXN0cnkucmVnaXN0ZXJNb2R1bGVQcm9ncmFtKGlkLCBiYXNlUHJvZ3JhbSBhcyBTdGF0ZVRyYWl0UHJvZ3JhbTxhbnk+KVxuICB9XG5cbiAgLy8gMDIzOiBjb25zb2xpZGF0ZSB0aGUgdHJhaXQgXCJkZWNsYXJhdGlvbi9tZXJnZSBlbnRyeSBwb2ludHNcIiBpbnRvIHRoZSBzZXR1cCBwaGFzZTpcbiAgLy8gLSBtb2R1bGUtbGV2ZWwgdHJhaXRzIHJlZ2lzdGVyIGFzIGNvbnRyaWJ1dGlvbnMgZmlyc3Q7XG4gIC8vIC0gbG9naWMtbGV2ZWwgZGVjbGFyZXMgdmlhICQudHJhaXRzLmRlY2xhcmU7XG4gIC8vIC0gZmluYWxseSwgZmluYWxpemUgXHUyMTkyIGZyZWV6ZSBcdTIxOTIgYnVpbGQvaW5zdGFsbCBpbiBvbmUgc2hvdC5cblxuICBjb25zdCBtYWtlTW9kdWxlVHJhaXRzQ29udHJpYnV0aW9uTG9naWMgPSAodHJhaXRzOiB1bmtub3duKTogTW9kdWxlTG9naWM8U2gsIG5ldmVyLCBuZXZlcj4gPT4ge1xuICAgIGNvbnN0IGxvZ2ljID0gbW9kdWxlVGFnLmxvZ2ljKCgkKSA9PiAoe1xuICAgICAgc2V0dXA6IEVmZmVjdC5zeW5jKCgpID0+IHtcbiAgICAgICAgaWYgKCF0cmFpdHMgfHwgdHlwZW9mIHRyYWl0cyAhPT0gJ29iamVjdCcpIHJldHVyblxuICAgICAgICAvLyBtb2R1bGUtbGV2ZWwgcHJvdmVuYW5jZSB1c2VzIG1vZHVsZUlkIGFzIHRoZSBzdGFibGUgYW5jaG9yXG4gICAgICAgIC8vIChhbGlnbmVkIHdpdGggMDIzIGRhdGEtbW9kZWw6IG9yaWdpblR5cGU9bW9kdWxlLCBvcmlnaW5JZD1tb2R1bGVJZCkuXG4gICAgICAgIC8vIE5vdGU6IHRyYWl0c1NwZWMgc3RpbGwgcmV1c2VzIFN0YXRlVHJhaXRTcGVjOyBkbyBub3QgaW50cm9kdWNlIGEgc2Vjb25kIElSLlxuICAgICAgICBjb25zdCBpbnRlcm5hbHMgPSBnZXRCb3VuZEludGVybmFscygkIGFzIGFueSlcbiAgICAgICAgaW50ZXJuYWxzLnRyYWl0cy5yZWdpc3Rlck1vZHVsZVRyYWl0c0NvbnRyaWJ1dGlvbih7XG4gICAgICAgICAgdHJhaXRzLFxuICAgICAgICAgIHByb3ZlbmFuY2U6IHtcbiAgICAgICAgICAgIG9yaWdpblR5cGU6ICdtb2R1bGUnLFxuICAgICAgICAgICAgb3JpZ2luSWQ6IGlkLFxuICAgICAgICAgICAgb3JpZ2luSWRLaW5kOiAnZXhwbGljaXQnLFxuICAgICAgICAgICAgb3JpZ2luTGFiZWw6IGBtb2R1bGU6JHtpZH1gLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0pXG4gICAgICB9KSxcbiAgICAgIHJ1bjogRWZmZWN0LnZvaWQsXG4gICAgfSkpIGFzIE1vZHVsZUxvZ2ljPFNoLCBuZXZlciwgbmV2ZXI+XG5cbiAgICBMb2dpY1VuaXRNZXRhLmF0dGFjaExvZ2ljVW5pdE1ldGEobG9naWMgYXMgYW55LCB7XG4gICAgICBpZDogJ19fbG9naXhfaW50ZXJuYWw6dHJhaXRzOm1vZHVsZV9jb250cmliJyxcbiAgICAgIGtpbmQ6ICdpbnRlcm5hbCcsXG4gICAgICBuYW1lOiAndHJhaXRzOm1vZHVsZV9jb250cmliJyxcbiAgICAgIG1vZHVsZUlkOiBpZCxcbiAgICB9KVxuICAgIHJldHVybiBsb2dpY1xuICB9XG5cbiAgY29uc3QgbWFrZUZpbmFsaXplVHJhaXRzTG9naWMgPSAoKTogTW9kdWxlTG9naWM8U2gsIG5ldmVyLCBuZXZlcj4gPT4ge1xuICAgIGNvbnN0IGxvZ2ljID0gbW9kdWxlVGFnLmxvZ2ljKCgkKSA9PiAoe1xuICAgICAgc2V0dXA6IEVmZmVjdC5nZW4oZnVuY3Rpb24qICgpIHtcbiAgICAgICAgY29uc3QgaW50ZXJuYWxzID0gZ2V0Qm91bmRJbnRlcm5hbHMoJCBhcyBhbnkpXG4gICAgICAgIGNvbnN0IGRpYWdub3N0aWNzTGV2ZWwgPSB5aWVsZCogRmliZXJSZWYuZ2V0KERlYnVnLmN1cnJlbnREaWFnbm9zdGljc0xldmVsKVxuXG4gICAgICAgIGNvbnN0IGNvbnRyaWJ1dGlvbnMgPSBpbnRlcm5hbHMudHJhaXRzLmdldE1vZHVsZVRyYWl0c0NvbnRyaWJ1dGlvbnMoKVxuICAgICAgICBsZXQgbWVyZ2VkOiBNb2R1bGVUcmFpdHMuVHJhaXRTcGVjXG4gICAgICAgIGxldCBzbmFwc2hvdDogTW9kdWxlVHJhaXRzLk1vZHVsZVRyYWl0c1NuYXBzaG90XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICA7KHsgbWVyZ2VkLCBzbmFwc2hvdCB9ID0gTW9kdWxlVHJhaXRzLmZpbmFsaXplVHJhaXRDb250cmlidXRpb25zKHtcbiAgICAgICAgICAgIG1vZHVsZUlkOiBpZCxcbiAgICAgICAgICAgIGNvbnRyaWJ1dGlvbnMsXG4gICAgICAgICAgfSkpXG4gICAgICAgIH0gY2F0Y2ggKGNhdXNlKSB7XG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgZGlhZ25vc3RpY3NMZXZlbCAhPT0gJ29mZicgJiZcbiAgICAgICAgICAgIGNhdXNlICYmXG4gICAgICAgICAgICB0eXBlb2YgY2F1c2UgPT09ICdvYmplY3QnICYmXG4gICAgICAgICAgICAoY2F1c2UgYXMgYW55KS5fdGFnID09PSAnTW9kdWxlVHJhaXRzQ29uZmxpY3RFcnJvcidcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIGNvbnN0IGNvbmZsaWN0cyA9IEFycmF5LmlzQXJyYXkoKGNhdXNlIGFzIGFueSkuY29uZmxpY3RzKVxuICAgICAgICAgICAgICA/ICgoY2F1c2UgYXMgYW55KS5jb25mbGljdHMgYXMgUmVhZG9ubHlBcnJheTx1bmtub3duPilcbiAgICAgICAgICAgICAgOiBbXVxuICAgICAgICAgICAgY29uc3QgdHJhaXRJZHMgPSBjb25mbGljdHNcbiAgICAgICAgICAgICAgLm1hcCgoYzogYW55KSA9PiAoYyAmJiB0eXBlb2YgYyA9PT0gJ29iamVjdCcgPyAoYyBhcyBhbnkpLnRyYWl0SWQgOiB1bmRlZmluZWQpKVxuICAgICAgICAgICAgICAuZmlsdGVyKCh0KTogdCBpcyBzdHJpbmcgPT4gdHlwZW9mIHQgPT09ICdzdHJpbmcnICYmIHQubGVuZ3RoID4gMClcbiAgICAgICAgICAgICAgLnNsaWNlKDAsIDIwKVxuXG4gICAgICAgICAgICBjb25zdCBkYXRhID1cbiAgICAgICAgICAgICAgZGlhZ25vc3RpY3NMZXZlbCA9PT0gJ2Z1bGwnXG4gICAgICAgICAgICAgICAgPyB7XG4gICAgICAgICAgICAgICAgICAgIGNvbmZsaWN0Q291bnQ6IGNvbmZsaWN0cy5sZW5ndGgsXG4gICAgICAgICAgICAgICAgICAgIGNvbmZsaWN0cyxcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICA6IHtcbiAgICAgICAgICAgICAgICAgICAgY29uZmxpY3RDb3VudDogY29uZmxpY3RzLmxlbmd0aCxcbiAgICAgICAgICAgICAgICAgICAgdHJhaXRJZHMsXG4gICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHlpZWxkKiBEZWJ1Zy5yZWNvcmQoe1xuICAgICAgICAgICAgICB0eXBlOiAndHJhY2U6bW9kdWxlOnRyYWl0czpjb25mbGljdCcsXG4gICAgICAgICAgICAgIG1vZHVsZUlkOiBpZCxcbiAgICAgICAgICAgICAgaW5zdGFuY2VJZDogaW50ZXJuYWxzLmluc3RhbmNlSWQsXG4gICAgICAgICAgICAgIGRhdGEsXG4gICAgICAgICAgICB9IGFzIGFueSlcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB0aHJvdyBjYXVzZVxuICAgICAgICB9XG5cbiAgICAgICAgaW50ZXJuYWxzLnRyYWl0cy5zZXRNb2R1bGVUcmFpdHNTbmFwc2hvdChzbmFwc2hvdClcbiAgICAgICAgaW50ZXJuYWxzLnRyYWl0cy5mcmVlemVNb2R1bGVUcmFpdHMoKVxuXG4gICAgICAgIGlmIChkaWFnbm9zdGljc0xldmVsICE9PSAnb2ZmJykge1xuICAgICAgICAgIGNvbnN0IGRhdGEgPVxuICAgICAgICAgICAgZGlhZ25vc3RpY3NMZXZlbCA9PT0gJ2Z1bGwnXG4gICAgICAgICAgICAgID8ge1xuICAgICAgICAgICAgICAgICAgZGlnZXN0OiBzbmFwc2hvdC5kaWdlc3QsXG4gICAgICAgICAgICAgICAgICBjb3VudDogc25hcHNob3QudHJhaXRzLmxlbmd0aCxcbiAgICAgICAgICAgICAgICAgIHRyYWl0czogc25hcHNob3QudHJhaXRzLFxuICAgICAgICAgICAgICAgICAgcHJvdmVuYW5jZUluZGV4OiBzbmFwc2hvdC5wcm92ZW5hbmNlSW5kZXgsXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICA6IHtcbiAgICAgICAgICAgICAgICAgIGRpZ2VzdDogc25hcHNob3QuZGlnZXN0LFxuICAgICAgICAgICAgICAgICAgY291bnQ6IHNuYXBzaG90LnRyYWl0cy5sZW5ndGgsXG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgeWllbGQqIERlYnVnLnJlY29yZCh7XG4gICAgICAgICAgICB0eXBlOiAndHJhY2U6bW9kdWxlOnRyYWl0cycsXG4gICAgICAgICAgICBtb2R1bGVJZDogaWQsXG4gICAgICAgICAgICBpbnN0YW5jZUlkOiBpbnRlcm5hbHMuaW5zdGFuY2VJZCxcbiAgICAgICAgICAgIGRhdGEsXG4gICAgICAgICAgfSBhcyBhbnkpXG4gICAgICAgIH1cblxuICAgICAgICBpZiAoT2JqZWN0LmtleXMobWVyZ2VkKS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IG9ubHlNb2R1bGVMZXZlbCA9IGNvbnRyaWJ1dGlvbnMubGVuZ3RoID09PSAxICYmIGNvbnRyaWJ1dGlvbnNbMF0/LnByb3ZlbmFuY2U/Lm9yaWdpblR5cGUgPT09ICdtb2R1bGUnXG5cbiAgICAgICAgLy8gQnVpbGQgYSBvbmUtc2hvdCBQcm9ncmFtIGZyb20gdGhlIGZpbmFsIG1lcmdlZCBTcGVjLCBhbmQgaW5zdGFsbCBpdCBkdXJpbmcgaW5pdGlhbGl6YXRpb24uXG4gICAgICAgIC8vIC0gSWYgdGhlcmUgaXMgb25seSBhIG1vZHVsZS1sZXZlbCBjb250cmlidXRpb24sIHJldXNlIHRoZSBwcm9ncmFtIGJ1aWx0IGluIE1vZHVsZVRhZy5tYWtlICh1c2VmdWwgZm9yIERlYnVnL1RyYWl0TGlmZWN5Y2xlKS5cbiAgICAgICAgY29uc3QgcHJvZ3JhbSA9XG4gICAgICAgICAgb25seU1vZHVsZUxldmVsICYmIGJhc2VQcm9ncmFtID8gYmFzZVByb2dyYW0gOiBTdGF0ZVRyYWl0LmJ1aWxkKHN0YXRlU2NoZW1hIGFzIGFueSwgbWVyZ2VkIGFzIGFueSlcblxuICAgICAgICAvLyBGb3IgVHJhaXRMaWZlY3ljbGUvRGVidWcvRGV2dG9vbHMgcmVhZHMgKGRlZmluaXRpb24tc2lkZSBoaWRkZW4gc2xvdCkuXG4gICAgICAgIHNldE1vZHVsZVRyYWl0c1Byb2dyYW0obW9kdWxlVGFnIGFzIGFueSwgcHJvZ3JhbSlcbiAgICAgICAgTW9kdWxlVHJhaXRzUmVnaXN0cnkucmVnaXN0ZXJNb2R1bGVQcm9ncmFtKGlkLCBwcm9ncmFtIGFzIFN0YXRlVHJhaXRQcm9ncmFtPGFueT4pXG5cbiAgICAgICAgeWllbGQqIFN0YXRlVHJhaXQuaW5zdGFsbCgkIGFzIHVua25vd24gYXMgQm91bmRBcGk8YW55LCBhbnk+LCBwcm9ncmFtKVxuICAgICAgfSksXG4gICAgICBydW46IEVmZmVjdC52b2lkLFxuICAgIH0pKSBhcyBNb2R1bGVMb2dpYzxTaCwgbmV2ZXIsIG5ldmVyPlxuXG4gICAgTG9naWNVbml0TWV0YS5hdHRhY2hMb2dpY1VuaXRNZXRhKGxvZ2ljIGFzIGFueSwge1xuICAgICAgaWQ6ICdfX2xvZ2l4X2ludGVybmFsOnRyYWl0czpmaW5hbGl6ZScsXG4gICAgICBraW5kOiAnaW50ZXJuYWwnLFxuICAgICAgbmFtZTogJ3RyYWl0czpmaW5hbGl6ZScsXG4gICAgICBtb2R1bGVJZDogaWQsXG4gICAgfSlcblxuICAgIHJldHVybiBsb2dpY1xuICB9XG5cbiAgLy8gV3JhcCBpbXBsZW1lbnQ6IGluamVjdCAoMSkgb3B0aW9uYWwgbW9kdWxlLWxldmVsIGNvbnRyaWJ1dGlvbiBsb2dpYywgYW5kICgyKSByZXF1aXJlZCBmaW5hbGl6ZStpbnN0YWxsIGxvZ2ljLlxuICBjb25zdCBvcmlnaW5hbEltcGxlbWVudCA9IG1vZHVsZVRhZy5pbXBsZW1lbnRcbiAgOyhtb2R1bGVUYWcgYXMgYW55KS5pbXBsZW1lbnQgPSAoPFIgPSBuZXZlcj4oY29uZmlnOiB7XG4gICAgaW5pdGlhbDogU3RhdGVPZjx0eXBlb2YgbW9kdWxlVGFnLnNoYXBlPlxuICAgIGxvZ2ljcz86IEFycmF5PE1vZHVsZUxvZ2ljPHR5cGVvZiBtb2R1bGVUYWcuc2hhcGUsIFIsIGFueT4+XG4gICAgaW1wb3J0cz86IFJlYWRvbmx5QXJyYXk8TGF5ZXIuTGF5ZXI8YW55LCBhbnksIGFueT4gfCBNb2R1bGVJbXBsPGFueSwgQW55TW9kdWxlU2hhcGUsIGFueT4+XG4gICAgcHJvY2Vzc2VzPzogUmVhZG9ubHlBcnJheTxFZmZlY3QuRWZmZWN0PHZvaWQsIGFueSwgYW55Pj5cbiAgfSkgPT4ge1xuICAgIGNvbnN0IHVzZXJMb2dpY3MgPSAoY29uZmlnLmxvZ2ljcyA/PyBbXSkgYXMgQXJyYXk8TW9kdWxlTG9naWM8dHlwZW9mIG1vZHVsZVRhZy5zaGFwZSwgUiwgYW55Pj5cblxuICAgIGNvbnN0IG1vZHVsZUxldmVsID0gZGVmLnRyYWl0cyA/IFttYWtlTW9kdWxlVHJhaXRzQ29udHJpYnV0aW9uTG9naWMoZGVmLnRyYWl0cykgYXMgYW55XSA6IFtdXG5cbiAgICBjb25zdCBmaW5hbGl6ZSA9IG1ha2VGaW5hbGl6ZVRyYWl0c0xvZ2ljKCkgYXMgTW9kdWxlTG9naWM8dHlwZW9mIG1vZHVsZVRhZy5zaGFwZSwgUiwgYW55PlxuXG4gICAgY29uc3QgbWVyZ2VkTG9naWNzID0gWy4uLm1vZHVsZUxldmVsLCAuLi51c2VyTG9naWNzLCBmaW5hbGl6ZV1cblxuICAgIHJldHVybiBvcmlnaW5hbEltcGxlbWVudDxSPih7XG4gICAgICAuLi5jb25maWcsXG4gICAgICBsb2dpY3M6IG1lcmdlZExvZ2ljcyxcbiAgICB9KVxuICB9KSBhcyB0eXBlb2YgbW9kdWxlVGFnLmltcGxlbWVudFxuXG4gIHJldHVybiBtb2R1bGVUYWdcbn1cbiIsICJpbXBvcnQgeyBmbnYxYTMyLCBzdGFibGVTdHJpbmdpZnkgfSBmcm9tICcuLi8uLi9kaWdlc3QuanMnXG5cbmV4cG9ydCB0eXBlIFRyYWl0SWQgPSBzdHJpbmdcblxuZXhwb3J0IHR5cGUgVHJhaXRPcmlnaW5UeXBlID0gJ21vZHVsZScgfCAnbG9naWNVbml0J1xuZXhwb3J0IHR5cGUgVHJhaXRPcmlnaW5JZEtpbmQgPSAnZXhwbGljaXQnIHwgJ2Rlcml2ZWQnXG5cbmV4cG9ydCBpbnRlcmZhY2UgVHJhaXRQcm92ZW5hbmNlIHtcbiAgcmVhZG9ubHkgb3JpZ2luVHlwZTogVHJhaXRPcmlnaW5UeXBlXG4gIHJlYWRvbmx5IG9yaWdpbklkOiBzdHJpbmdcbiAgcmVhZG9ubHkgb3JpZ2luSWRLaW5kOiBUcmFpdE9yaWdpbklkS2luZFxuICAvKipcbiAgICogSHVtYW4tcmVhZGFibGUgbGFiZWwgZm9yIERldnRvb2xzL2Vycm9yIG1lc3NhZ2VzIChlLmcuIFwibG9naWNVbml0OlByb2ZpbGUjMVwiKS5cbiAgICovXG4gIHJlYWRvbmx5IG9yaWdpbkxhYmVsOiBzdHJpbmdcbiAgLyoqXG4gICAqIE9wdGlvbmFsIGxvY2F0aW9uIHN1bW1hcnkgKGUuZy4gZmlsZSBwYXRoIC8gY2FsbHNpdGUpOyBmb3IgbmF2aWdhdGlvbiBvbmx5IGFuZCBub3QgdXNlZCBmb3Igc2VtYW50aWMgZGVjaXNpb25zLlxuICAgKi9cbiAgcmVhZG9ubHkgcGF0aD86IHN0cmluZ1xufVxuXG4vKipcbiAqIFRyYWl0U3BlY1x1RkYxQVxuICogLSBNaW5pbWFsIHJlcHJlc2VudGF0aW9uIG9mIFwidHJhaXQgZGVjbGFyYXRpb25zXCI6IGEgcmVjb3JkIGtleWVkIGJ5IHRyYWl0SWQuXG4gKiAtIFRoZSBjb25jcmV0ZSB2YWx1ZSBzaGFwZSBpcyBkZWZpbmVkIGJ5IHRoZSBzcGVjaWZpYyB0cmFpdCBzeXN0ZW0gKGUuZy4gU3RhdGVUcmFpdFNwZWMpLlxuICogLSBWYWx1ZSBzZXJpYWxpemFiaWxpdHkgaXMgbm90IGNvbnN0cmFpbmVkIGhlcmUgKHJ1bnRpbWUgaW5zdGFsbCBtYXkgZGVwZW5kIG9uIGZ1bmN0aW9ucyksIGJ1dCBzbmFwc2hvdHMvZXZpZGVuY2UgZXhwb3J0c1xuICogICBtdXN0IG9ubHkgaW5jbHVkZSBzZXJpYWxpemFibGUgc3Vic2V0cy5cbiAqL1xuZXhwb3J0IHR5cGUgVHJhaXRTcGVjID0gb2JqZWN0XG5cbmV4cG9ydCBpbnRlcmZhY2UgVHJhaXRDb250cmlidXRpb24ge1xuICByZWFkb25seSB0cmFpdHM6IFRyYWl0U3BlY1xuICByZWFkb25seSBwcm92ZW5hbmNlOiBUcmFpdFByb3ZlbmFuY2Vcbn1cblxuZXhwb3J0IGludGVyZmFjZSBNb2R1bGVUcmFpdEl0ZW0ge1xuICByZWFkb25seSB0cmFpdElkOiBUcmFpdElkXG4gIHJlYWRvbmx5IG5hbWU6IHN0cmluZ1xuICByZWFkb25seSBkZXNjcmlwdGlvbj86IHN0cmluZ1xufVxuXG5leHBvcnQgdHlwZSBUcmFpdENvbmZsaWN0S2luZCA9ICdkdXBsaWNhdGVfdHJhaXRJZCcgfCAnbWlzc2luZ19yZXF1aXJlcycgfCAnZXhjbHVkZXNfdmlvbGF0aW9uJ1xuXG5leHBvcnQgaW50ZXJmYWNlIFRyYWl0Q29uZmxpY3Qge1xuICByZWFkb25seSBraW5kOiBUcmFpdENvbmZsaWN0S2luZFxuICByZWFkb25seSB0cmFpdElkOiBUcmFpdElkXG4gIHJlYWRvbmx5IHNvdXJjZXM6IFJlYWRvbmx5QXJyYXk8VHJhaXRQcm92ZW5hbmNlPlxuICByZWFkb25seSBtaXNzaW5nPzogUmVhZG9ubHlBcnJheTxUcmFpdElkPlxuICByZWFkb25seSBwcmVzZW50PzogUmVhZG9ubHlBcnJheTxUcmFpdElkPlxufVxuXG5leHBvcnQgY2xhc3MgTW9kdWxlVHJhaXRzQ29uZmxpY3RFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgcmVhZG9ubHkgX3RhZyA9ICdNb2R1bGVUcmFpdHNDb25mbGljdEVycm9yJ1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHJlYWRvbmx5IG1vZHVsZUlkOiBzdHJpbmcsXG4gICAgcmVhZG9ubHkgY29uZmxpY3RzOiBSZWFkb25seUFycmF5PFRyYWl0Q29uZmxpY3Q+LFxuICApIHtcbiAgICBzdXBlcihcbiAgICAgIFtcbiAgICAgICAgYFtNb2R1bGVUcmFpdHNDb25mbGljdEVycm9yXSBDb25mbGljdGluZyB0cmFpdElkcyBmb3VuZCAobW9kdWxlSWQ9JHttb2R1bGVJZH0pLmAsXG4gICAgICAgIC4uLmNvbmZsaWN0cy5tYXAoKGMpID0+XG4gICAgICAgICAgYy5raW5kID09PSAnZHVwbGljYXRlX3RyYWl0SWQnXG4gICAgICAgICAgICA/IGAtIGR1cGxpY2F0ZSAke2MudHJhaXRJZH06ICR7Yy5zb3VyY2VzLm1hcCgocykgPT4gYCR7cy5vcmlnaW5UeXBlfToke3Mub3JpZ2luSWR9YCkuam9pbignLCAnKX1gXG4gICAgICAgICAgICA6IGMua2luZCA9PT0gJ21pc3NpbmdfcmVxdWlyZXMnXG4gICAgICAgICAgICAgID8gYC0gbWlzc2luZyByZXF1aXJlcyBmb3IgJHtjLnRyYWl0SWR9OiAkeyhjLm1pc3NpbmcgPz8gW10pLmpvaW4oJywgJyl9OyBzb3VyY2VzPSR7Yy5zb3VyY2VzXG4gICAgICAgICAgICAgICAgICAubWFwKChzKSA9PiBgJHtzLm9yaWdpblR5cGV9OiR7cy5vcmlnaW5JZH1gKVxuICAgICAgICAgICAgICAgICAgLmpvaW4oJywgJyl9YFxuICAgICAgICAgICAgICA6IGAtIGV4Y2x1ZGVzIHZpb2xhdGlvbiBmb3IgJHtjLnRyYWl0SWR9OiBwcmVzZW50PSR7KGMucHJlc2VudCA/PyBbXSkuam9pbignLCAnKX07IHNvdXJjZXM9JHtjLnNvdXJjZXNcbiAgICAgICAgICAgICAgICAgIC5tYXAoKHMpID0+IGAke3Mub3JpZ2luVHlwZX06JHtzLm9yaWdpbklkfWApXG4gICAgICAgICAgICAgICAgICAuam9pbignLCAnKX1gLFxuICAgICAgICApLFxuICAgICAgXS5qb2luKCdcXG4nKSxcbiAgICApXG4gIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBNb2R1bGVUcmFpdHNTbmFwc2hvdCB7XG4gIHJlYWRvbmx5IG1vZHVsZUlkOiBzdHJpbmdcbiAgcmVhZG9ubHkgZGlnZXN0OiBzdHJpbmdcbiAgcmVhZG9ubHkgdHJhaXRzOiBSZWFkb25seUFycmF5PE1vZHVsZVRyYWl0SXRlbT5cbiAgcmVhZG9ubHkgcHJvdmVuYW5jZUluZGV4OiBSZWNvcmQ8VHJhaXRJZCwgVHJhaXRQcm92ZW5hbmNlPlxufVxuXG5jb25zdCB0b1Byb3ZlbmFuY2VLZXkgPSAocDogVHJhaXRQcm92ZW5hbmNlKTogc3RyaW5nID0+XG4gIGAke3Aub3JpZ2luVHlwZX06JHtwLm9yaWdpbklkfToke3Aub3JpZ2luSWRLaW5kfToke3Aub3JpZ2luTGFiZWx9OiR7cC5wYXRoID8/ICcnfWBcblxuY29uc3QgY29tcGFyZVByb3ZlbmFuY2UgPSAoYTogVHJhaXRQcm92ZW5hbmNlLCBiOiBUcmFpdFByb3ZlbmFuY2UpOiBudW1iZXIgPT4ge1xuICBjb25zdCB0eXBlID0gYS5vcmlnaW5UeXBlLmxvY2FsZUNvbXBhcmUoYi5vcmlnaW5UeXBlKVxuICBpZiAodHlwZSAhPT0gMCkgcmV0dXJuIHR5cGVcbiAgY29uc3QgaWQgPSBhLm9yaWdpbklkLmxvY2FsZUNvbXBhcmUoYi5vcmlnaW5JZClcbiAgaWYgKGlkICE9PSAwKSByZXR1cm4gaWRcbiAgY29uc3Qga2luZCA9IGEub3JpZ2luSWRLaW5kLmxvY2FsZUNvbXBhcmUoYi5vcmlnaW5JZEtpbmQpXG4gIGlmIChraW5kICE9PSAwKSByZXR1cm4ga2luZFxuICBjb25zdCBsYWJlbCA9IGEub3JpZ2luTGFiZWwubG9jYWxlQ29tcGFyZShiLm9yaWdpbkxhYmVsKVxuICBpZiAobGFiZWwgIT09IDApIHJldHVybiBsYWJlbFxuICByZXR1cm4gU3RyaW5nKGEucGF0aCA/PyAnJykubG9jYWxlQ29tcGFyZShTdHJpbmcoYi5wYXRoID8/ICcnKSlcbn1cblxuY29uc3Qgb3JpZ2luVHlwZU9yZGVyID0gKHQ6IFRyYWl0T3JpZ2luVHlwZSk6IG51bWJlciA9PiAodCA9PT0gJ21vZHVsZScgPyAwIDogMSlcblxuY29uc3QgY29tcGFyZVRyYWl0SWRCeVByb3ZlbmFuY2UgPSAoXG4gIGE6IHsgcmVhZG9ubHkgdHJhaXRJZDogVHJhaXRJZDsgcmVhZG9ubHkgcHJvdmVuYW5jZTogVHJhaXRQcm92ZW5hbmNlIH0sXG4gIGI6IHsgcmVhZG9ubHkgdHJhaXRJZDogVHJhaXRJZDsgcmVhZG9ubHkgcHJvdmVuYW5jZTogVHJhaXRQcm92ZW5hbmNlIH0sXG4pOiBudW1iZXIgPT4ge1xuICBjb25zdCB0YSA9IG9yaWdpblR5cGVPcmRlcihhLnByb3ZlbmFuY2Uub3JpZ2luVHlwZSkgLSBvcmlnaW5UeXBlT3JkZXIoYi5wcm92ZW5hbmNlLm9yaWdpblR5cGUpXG4gIGlmICh0YSAhPT0gMCkgcmV0dXJuIHRhXG4gIGNvbnN0IG9hID0gYS5wcm92ZW5hbmNlLm9yaWdpbklkLmxvY2FsZUNvbXBhcmUoYi5wcm92ZW5hbmNlLm9yaWdpbklkKVxuICBpZiAob2EgIT09IDApIHJldHVybiBvYVxuICByZXR1cm4gYS50cmFpdElkLmxvY2FsZUNvbXBhcmUoYi50cmFpdElkKVxufVxuXG5jb25zdCBleHRyYWN0U3RyaW5nQXJyYXkgPSAodmFsdWU6IHVua25vd24pOiBSZWFkb25seUFycmF5PHN0cmluZz4gPT4ge1xuICBpZiAoIUFycmF5LmlzQXJyYXkodmFsdWUpKSByZXR1cm4gW11cbiAgY29uc3Qgb3V0OiBBcnJheTxzdHJpbmc+ID0gW11cbiAgZm9yIChjb25zdCB2IG9mIHZhbHVlKSB7XG4gICAgaWYgKHR5cGVvZiB2ICE9PSAnc3RyaW5nJykgY29udGludWVcbiAgICBjb25zdCBzID0gdi50cmltKClcbiAgICBpZiAoIXMpIGNvbnRpbnVlXG4gICAgb3V0LnB1c2gocylcbiAgfVxuICByZXR1cm4gb3V0XG59XG5cbmNvbnN0IGdldFRyYWl0UmVxdWlyZXMgPSAodmFsdWU6IHVua25vd24pOiBSZWFkb25seUFycmF5PFRyYWl0SWQ+ID0+IHtcbiAgaWYgKCF2YWx1ZSB8fCB0eXBlb2YgdmFsdWUgIT09ICdvYmplY3QnKSByZXR1cm4gW11cbiAgY29uc3QgZGlyZWN0ID0gZXh0cmFjdFN0cmluZ0FycmF5KCh2YWx1ZSBhcyBhbnkpLnJlcXVpcmVzKVxuICByZXR1cm4gZGlyZWN0XG59XG5cbmNvbnN0IGdldFRyYWl0RXhjbHVkZXMgPSAodmFsdWU6IHVua25vd24pOiBSZWFkb25seUFycmF5PFRyYWl0SWQ+ID0+IHtcbiAgaWYgKCF2YWx1ZSB8fCB0eXBlb2YgdmFsdWUgIT09ICdvYmplY3QnKSByZXR1cm4gW11cbiAgY29uc3QgZGlyZWN0ID0gZXh0cmFjdFN0cmluZ0FycmF5KCh2YWx1ZSBhcyBhbnkpLmV4Y2x1ZGVzKVxuICByZXR1cm4gZGlyZWN0XG59XG5cbmNvbnN0IGdldFRyYWl0TmFtZSA9ICh0cmFpdElkOiBUcmFpdElkLCB2YWx1ZTogdW5rbm93bik6IHN0cmluZyA9PiB7XG4gIGlmICh2YWx1ZSAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnKSB7XG4gICAgY29uc3QgbiA9ICh2YWx1ZSBhcyBhbnkpLm5hbWVcbiAgICBpZiAodHlwZW9mIG4gPT09ICdzdHJpbmcnICYmIG4udHJpbSgpLmxlbmd0aCA+IDApIHJldHVybiBuLnRyaW0oKVxuICB9XG4gIHJldHVybiB0cmFpdElkXG59XG5cbmNvbnN0IGdldFRyYWl0RGVzY3JpcHRpb24gPSAodmFsdWU6IHVua25vd24pOiBzdHJpbmcgfCB1bmRlZmluZWQgPT4ge1xuICBpZiAodmFsdWUgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0Jykge1xuICAgIGNvbnN0IGQgPSAodmFsdWUgYXMgYW55KS5kZXNjcmlwdGlvblxuICAgIGlmICh0eXBlb2YgZCA9PT0gJ3N0cmluZycgJiYgZC50cmltKCkubGVuZ3RoID4gMCkgcmV0dXJuIGQudHJpbSgpXG4gIH1cbiAgcmV0dXJuIHVuZGVmaW5lZFxufVxuXG5leHBvcnQgY29uc3QgZmluYWxpemVUcmFpdENvbnRyaWJ1dGlvbnMgPSAoYXJnczoge1xuICByZWFkb25seSBtb2R1bGVJZDogc3RyaW5nXG4gIHJlYWRvbmx5IGNvbnRyaWJ1dGlvbnM6IFJlYWRvbmx5QXJyYXk8VHJhaXRDb250cmlidXRpb24+XG59KTogeyByZWFkb25seSBtZXJnZWQ6IFRyYWl0U3BlYzsgcmVhZG9ubHkgc25hcHNob3Q6IE1vZHVsZVRyYWl0c1NuYXBzaG90IH0gPT4ge1xuICBjb25zdCB0cmFpdEJ5SWQgPSBuZXcgTWFwPFRyYWl0SWQsIHsgcmVhZG9ubHkgdmFsdWU6IHVua25vd247IHJlYWRvbmx5IHByb3ZlbmFuY2U6IFRyYWl0UHJvdmVuYW5jZSB9PigpXG5cbiAgY29uc3QgZHVwbGljYXRlU291cmNlcyA9IG5ldyBNYXA8VHJhaXRJZCwgQXJyYXk8VHJhaXRQcm92ZW5hbmNlPj4oKVxuXG4gIGNvbnN0IGNvbnRyaWJ1dGlvbnMgPSBbLi4uYXJncy5jb250cmlidXRpb25zXS5zb3J0KChhLCBiKSA9PiBjb21wYXJlUHJvdmVuYW5jZShhLnByb3ZlbmFuY2UsIGIucHJvdmVuYW5jZSkpXG5cbiAgZm9yIChjb25zdCBjIG9mIGNvbnRyaWJ1dGlvbnMpIHtcbiAgICBjb25zdCB0cmFpdHMgPSBjLnRyYWl0c1xuICAgIGlmICghdHJhaXRzIHx8IHR5cGVvZiB0cmFpdHMgIT09ICdvYmplY3QnKSBjb250aW51ZVxuICAgIGZvciAoY29uc3QgdHJhaXRJZCBvZiBPYmplY3Qua2V5cyh0cmFpdHMpLnNvcnQoKGEsIGIpID0+IGEubG9jYWxlQ29tcGFyZShiKSkpIHtcbiAgICAgIGNvbnN0IHZhbHVlID0gKHRyYWl0cyBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPilbdHJhaXRJZF1cbiAgICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSBjb250aW51ZVxuXG4gICAgICBjb25zdCBwcmV2ID0gdHJhaXRCeUlkLmdldCh0cmFpdElkKVxuICAgICAgaWYgKCFwcmV2KSB7XG4gICAgICAgIHRyYWl0QnlJZC5zZXQodHJhaXRJZCwgeyB2YWx1ZSwgcHJvdmVuYW5jZTogYy5wcm92ZW5hbmNlIH0pXG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHNvdXJjZXMgPSBkdXBsaWNhdGVTb3VyY2VzLmdldCh0cmFpdElkKSA/PyBbcHJldi5wcm92ZW5hbmNlXVxuICAgICAgc291cmNlcy5wdXNoKGMucHJvdmVuYW5jZSlcbiAgICAgIGR1cGxpY2F0ZVNvdXJjZXMuc2V0KHRyYWl0SWQsIHNvdXJjZXMpXG4gICAgfVxuICB9XG5cbiAgY29uc3QgY29uZmxpY3RzOiBBcnJheTxUcmFpdENvbmZsaWN0PiA9IFtdXG4gIGNvbnN0IHJlZ2lzdGVyQ29uZmxpY3QgPSAoY29uZmxpY3Q6IFRyYWl0Q29uZmxpY3QpID0+IHtcbiAgICBjb25zdCB1bmlxdWUgPSBuZXcgTWFwPHN0cmluZywgVHJhaXRQcm92ZW5hbmNlPigpXG4gICAgZm9yIChjb25zdCBzIG9mIGNvbmZsaWN0LnNvdXJjZXMpIHtcbiAgICAgIHVuaXF1ZS5zZXQodG9Qcm92ZW5hbmNlS2V5KHMpLCBzKVxuICAgIH1cbiAgICBjb25mbGljdHMucHVzaCh7XG4gICAgICAuLi5jb25mbGljdCxcbiAgICAgIHNvdXJjZXM6IEFycmF5LmZyb20odW5pcXVlLnZhbHVlcygpKS5zb3J0KGNvbXBhcmVQcm92ZW5hbmNlKSxcbiAgICB9KVxuICB9XG5cbiAgLy8gMSkgZHVwbGljYXRlIHRyYWl0SWQgY29uZmxpY3RzXG4gIGZvciAoY29uc3QgdHJhaXRJZCBvZiBBcnJheS5mcm9tKGR1cGxpY2F0ZVNvdXJjZXMua2V5cygpKS5zb3J0KChhLCBiKSA9PiBhLmxvY2FsZUNvbXBhcmUoYikpKSB7XG4gICAgcmVnaXN0ZXJDb25mbGljdCh7XG4gICAgICBraW5kOiAnZHVwbGljYXRlX3RyYWl0SWQnLFxuICAgICAgdHJhaXRJZCxcbiAgICAgIHNvdXJjZXM6IGR1cGxpY2F0ZVNvdXJjZXMuZ2V0KHRyYWl0SWQpID8/IFtdLFxuICAgIH0pXG4gIH1cblxuICBjb25zdCBtZXJnZWQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge31cbiAgY29uc3QgcHJvdmVuYW5jZUluZGV4OiBSZWNvcmQ8c3RyaW5nLCBUcmFpdFByb3ZlbmFuY2U+ID0ge31cbiAgY29uc3QgdHJhaXRzOiBBcnJheTxNb2R1bGVUcmFpdEl0ZW0+ID0gW11cblxuICBjb25zdCBlbnRyaWVzOiBBcnJheTx7IHJlYWRvbmx5IHRyYWl0SWQ6IFRyYWl0SWQ7IHJlYWRvbmx5IHZhbHVlOiB1bmtub3duOyByZWFkb25seSBwcm92ZW5hbmNlOiBUcmFpdFByb3ZlbmFuY2UgfT4gPVxuICAgIFtdXG4gIGZvciAoY29uc3QgdHJhaXRJZCBvZiB0cmFpdEJ5SWQua2V5cygpKSB7XG4gICAgY29uc3QgZW50cnkgPSB0cmFpdEJ5SWQuZ2V0KHRyYWl0SWQpXG4gICAgaWYgKCFlbnRyeSkgY29udGludWVcbiAgICBlbnRyaWVzLnB1c2goeyB0cmFpdElkLCB2YWx1ZTogZW50cnkudmFsdWUsIHByb3ZlbmFuY2U6IGVudHJ5LnByb3ZlbmFuY2UgfSlcbiAgfVxuXG4gIGNvbnN0IGlkcyA9IGVudHJpZXNcbiAgICAuc2xpY2UoKVxuICAgIC5zb3J0KGNvbXBhcmVUcmFpdElkQnlQcm92ZW5hbmNlKVxuICAgIC5tYXAoKGUpID0+IGUudHJhaXRJZClcblxuICBmb3IgKGNvbnN0IHRyYWl0SWQgb2YgaWRzKSB7XG4gICAgY29uc3QgZW50cnkgPSB0cmFpdEJ5SWQuZ2V0KHRyYWl0SWQpXG4gICAgaWYgKCFlbnRyeSkgY29udGludWVcbiAgICBtZXJnZWRbdHJhaXRJZF0gPSBlbnRyeS52YWx1ZVxuICAgIHByb3ZlbmFuY2VJbmRleFt0cmFpdElkXSA9IGVudHJ5LnByb3ZlbmFuY2VcbiAgICB0cmFpdHMucHVzaCh7XG4gICAgICB0cmFpdElkLFxuICAgICAgbmFtZTogZ2V0VHJhaXROYW1lKHRyYWl0SWQsIGVudHJ5LnZhbHVlKSxcbiAgICAgIGRlc2NyaXB0aW9uOiBnZXRUcmFpdERlc2NyaXB0aW9uKGVudHJ5LnZhbHVlKSxcbiAgICB9KVxuICB9XG5cbiAgLy8gMikgY29uc2lzdGVuY3kgY2hlY2tzIChGUi0wMDcpOiByZXF1aXJlcyAvIGV4Y2x1ZGVzXG4gIGNvbnN0IHByZXNlbnQgPSBuZXcgU2V0KGlkcylcblxuICBmb3IgKGNvbnN0IHRyYWl0SWQgb2YgaWRzKSB7XG4gICAgY29uc3QgZW50cnkgPSB0cmFpdEJ5SWQuZ2V0KHRyYWl0SWQpXG4gICAgaWYgKCFlbnRyeSkgY29udGludWVcblxuICAgIGNvbnN0IHJlcXVpcmVzID0gZ2V0VHJhaXRSZXF1aXJlcyhlbnRyeS52YWx1ZSlcbiAgICBpZiAocmVxdWlyZXMubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgbWlzc2luZyA9IHJlcXVpcmVzLmZpbHRlcigocikgPT4gIXByZXNlbnQuaGFzKHIpKVxuICAgICAgaWYgKG1pc3NpbmcubGVuZ3RoID4gMCkge1xuICAgICAgICByZWdpc3RlckNvbmZsaWN0KHtcbiAgICAgICAgICBraW5kOiAnbWlzc2luZ19yZXF1aXJlcycsXG4gICAgICAgICAgdHJhaXRJZCxcbiAgICAgICAgICBtaXNzaW5nOiBBcnJheS5mcm9tKG5ldyBTZXQobWlzc2luZykpLnNvcnQoKGEsIGIpID0+IGEubG9jYWxlQ29tcGFyZShiKSksXG4gICAgICAgICAgc291cmNlczogW2VudHJ5LnByb3ZlbmFuY2VdLFxuICAgICAgICB9KVxuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGV4Y2x1ZGVzID0gZ2V0VHJhaXRFeGNsdWRlcyhlbnRyeS52YWx1ZSlcbiAgICBpZiAoZXhjbHVkZXMubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgcHJlc2VudEV4Y2x1ZGVkID0gZXhjbHVkZXMuZmlsdGVyKChlKSA9PiBwcmVzZW50LmhhcyhlKSlcbiAgICAgIGlmIChwcmVzZW50RXhjbHVkZWQubGVuZ3RoID4gMCkge1xuICAgICAgICBjb25zdCBvdGhlclNvdXJjZXM6IEFycmF5PFRyYWl0UHJvdmVuYW5jZT4gPSBbXVxuICAgICAgICBmb3IgKGNvbnN0IG90aGVySWQgb2YgcHJlc2VudEV4Y2x1ZGVkKSB7XG4gICAgICAgICAgY29uc3Qgb3RoZXIgPSB0cmFpdEJ5SWQuZ2V0KG90aGVySWQpXG4gICAgICAgICAgaWYgKG90aGVyKSBvdGhlclNvdXJjZXMucHVzaChvdGhlci5wcm92ZW5hbmNlKVxuICAgICAgICB9XG4gICAgICAgIHJlZ2lzdGVyQ29uZmxpY3Qoe1xuICAgICAgICAgIGtpbmQ6ICdleGNsdWRlc192aW9sYXRpb24nLFxuICAgICAgICAgIHRyYWl0SWQsXG4gICAgICAgICAgcHJlc2VudDogQXJyYXkuZnJvbShuZXcgU2V0KHByZXNlbnRFeGNsdWRlZCkpLnNvcnQoKGEsIGIpID0+IGEubG9jYWxlQ29tcGFyZShiKSksXG4gICAgICAgICAgc291cmNlczogW2VudHJ5LnByb3ZlbmFuY2UsIC4uLm90aGVyU291cmNlc10sXG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgaWYgKGNvbmZsaWN0cy5sZW5ndGggPiAwKSB7XG4gICAgY29uc3Qga2luZE9yZGVyOiBSZWNvcmQ8VHJhaXRDb25mbGljdEtpbmQsIG51bWJlcj4gPSB7XG4gICAgICBkdXBsaWNhdGVfdHJhaXRJZDogMCxcbiAgICAgIG1pc3NpbmdfcmVxdWlyZXM6IDEsXG4gICAgICBleGNsdWRlc192aW9sYXRpb246IDIsXG4gICAgfVxuICAgIGNvbmZsaWN0cy5zb3J0KChhLCBiKSA9PiB7XG4gICAgICBjb25zdCBrID0ga2luZE9yZGVyW2Eua2luZF0gLSBraW5kT3JkZXJbYi5raW5kXVxuICAgICAgaWYgKGsgIT09IDApIHJldHVybiBrXG4gICAgICByZXR1cm4gYS50cmFpdElkLmxvY2FsZUNvbXBhcmUoYi50cmFpdElkKVxuICAgIH0pXG4gICAgdGhyb3cgbmV3IE1vZHVsZVRyYWl0c0NvbmZsaWN0RXJyb3IoYXJncy5tb2R1bGVJZCwgY29uZmxpY3RzKVxuICB9XG5cbiAgY29uc3QgZGlnZXN0QmFzZSA9IHtcbiAgICBtb2R1bGVJZDogYXJncy5tb2R1bGVJZCxcbiAgICB0cmFpdHMsXG4gICAgcHJvdmVuYW5jZUluZGV4LFxuICB9IGFzIGNvbnN0XG5cbiAgY29uc3QgZGlnZXN0ID0gYG10cmFpdHM6MDIzOiR7Zm52MWEzMihzdGFibGVTdHJpbmdpZnkoZGlnZXN0QmFzZSkpfWBcblxuICByZXR1cm4ge1xuICAgIG1lcmdlZCxcbiAgICBzbmFwc2hvdDoge1xuICAgICAgbW9kdWxlSWQ6IGFyZ3MubW9kdWxlSWQsXG4gICAgICBkaWdlc3QsXG4gICAgICB0cmFpdHMsXG4gICAgICBwcm92ZW5hbmNlSW5kZXgsXG4gICAgfSxcbiAgfVxufVxuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsU0FBUyxRQUFRLGdCQUErQjs7O0FDbUR6QyxJQUFNLDRCQUFOLGNBQXdDLE1BQU07QUFBQSxFQUduRCxZQUNXLFVBQ0EsV0FDVDtBQUNBO0FBQUEsTUFDRTtBQUFBLFFBQ0Usb0VBQW9FLFFBQVE7QUFBQSxRQUM1RSxHQUFHLFVBQVU7QUFBQSxVQUFJLENBQUMsTUFDaEIsRUFBRSxTQUFTLHNCQUNQLGVBQWUsRUFBRSxPQUFPLEtBQUssRUFBRSxRQUFRLElBQUksQ0FBQyxNQUFNLEdBQUcsRUFBRSxVQUFVLElBQUksRUFBRSxRQUFRLEVBQUUsRUFBRSxLQUFLLElBQUksQ0FBQyxLQUM3RixFQUFFLFNBQVMscUJBQ1QsMEJBQTBCLEVBQUUsT0FBTyxNQUFNLEVBQUUsV0FBVyxDQUFDLEdBQUcsS0FBSyxJQUFJLENB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QUFVO0FBQUEsY0FDVixZQUFZLFVBQVU7QUFBQSxjQUN0QjtBQUFBLFlBQ0YsQ0FBUTtBQUFBLFVBQ1Y7QUFFQSxnQkFBTTtBQUFBLFFBQ1I7QUFFQSxrQkFBVSxPQUFPLHdCQUF3QixRQUFRO0FBQ2pELGtCQUFVLE9BQU8sbUJBQW1CO0FBRXBDLFlBQUkscUJBQXFCLE9BQU87QUFDOUIsZ0JBQU0sT0FDSixxQkFBcUIsU0FDakI7QUFBQSxZQUNFLFFBQVEsU0FBUztBQUFBLFlBQ2pCLE9BQU8sU0FBUyxPQUFPO0FBQUEsWUFDdkIsUUFBUSxTQUFTO0FBQUEsWUFDakIsaUJBQWlCLFNBQVM7QUFBQSxVQUM1QixJQUNBO0FBQUEsWUFDRSxRQUFRLFNBQVM7QUFBQSxZQUNqQixPQUFPLFNBQVMsT0FBTztBQUFBLFVBQ3pCO0FBRU4saUJBQWEsT0FBTztBQUFBLFlBQ2xCLE1BQU07QUFBQSxZQUNOLFVBQVU7QUFBQSxZQUNWLFlBQVksVUFBVTtBQUFBLFlBQ3RCO0FBQUEsVUFDRixDQUFRO0FBQUEsUUFDVjtBQUVBLFlBQUksT0FBTyxLQUFLLE1BQU0sRUFBRSxXQUFXLEdBQUc7QUFDcEM7QUFBQSxRQUNGO0FBRUEsY0FBTSxrQkFBa0IsY0FBYyxXQUFXLEtBQUssY0FBYyxDQUFDLEdBQUcsWUFBWSxlQUFlO0FBSW5HLGNBQU0sVUFDSixtQkFBbUIsY0FBYyxjQUF5QixNQUFNLGFBQW9CLE1BQWE7QUFHbkcsK0JBQXVCLFdBQWtCLE9BQU87QUFDaEQsUUFBcUIsc0JBQXNCLElBQUksT0FBaUM7QUFFaEYsZUFBa0IsUUFBUSxHQUFvQyxPQUFPO0FBQUEsTUFDdkUsQ0FBQztBQUFBLE1BQ0QsS0FBSyxPQUFPO0FBQUEsSUFDZCxFQUFFO0FBRUYsSUFBYyxvQkFBb0IsT0FBYztBQUFBLE1BQzlDLElBQUk7QUFBQSxNQUNKLE1BQU07QUFBQSxNQUNOLE1BQU07QUFBQSxNQUNOLFVBQVU7QUFBQSxJQUNaLENBQUM7QUFFRCxXQUFPO0FBQUEsRUFDVDtBQUdBLFFBQU0sb0JBQW9CLFVBQVU7QUFDbkMsRUFBQyxVQUFrQixhQUFhLENBQVksV0FLdkM7QUFDSixVQUFNLGFBQWMsT0FBTyxVQUFVLENBQUM7QUFFdEMsVUFBTSxjQUFjLElBQUksU0FBUyxDQUFDLGtDQUFrQyxJQUFJLE1BQU0sQ0FBUSxJQUFJLENBQUM7QUFFM0YsVUFBTSxXQUFXLHdCQUF3QjtBQUV6QyxVQUFNLGVBQWUsQ0FBQyxHQUFHLGFBQWEsR0FBRyxZQUFZLFFBQVE7QUFFN0QsV0FBTyxrQkFBcUI7QUFBQSxNQUMxQixHQUFHO0FBQUEsTUFDSCxRQUFRO0FBQUEsSUFDVixDQUFDO0FBQUEsRUFDSDtBQUVBLFNBQU87QUFDVDsiLAogICJuYW1lcyI6IFsidHJhaXRzIl0KfQo=