@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,1070 @@
1
+ // @logix/core subpath bundles for @logix/sandbox
2
+
3
+ import {
4
+ ReplayLog,
5
+ getAtPath,
6
+ parseListItemFieldPath,
7
+ setAtPathMutating,
8
+ toListItemValuePath
9
+ } from "./chunk-Z6LV34RO.js";
10
+ import {
11
+ Snapshot,
12
+ internal,
13
+ keyHash
14
+ } from "./chunk-KXVIC55U.js";
15
+ import {
16
+ create
17
+ } from "./chunk-Y5I45PEB.js";
18
+ import {
19
+ forceSourceRefresh,
20
+ inSyncTransactionFiber
21
+ } from "./chunk-2F72LQKW.js";
22
+ import {
23
+ getBoundInternals
24
+ } from "./chunk-EP5GQYZ5.js";
25
+ import {
26
+ record
27
+ } from "./chunk-4GMUQTWH.js";
28
+ import {
29
+ RunSessionTag,
30
+ make,
31
+ run
32
+ } from "./chunk-GZ2NSE6A.js";
33
+ import {
34
+ EffectOpMiddlewareTag
35
+ } from "./chunk-S6ZZHV6G.js";
36
+ import {
37
+ ReplayModeConfigTag,
38
+ isDevEnv
39
+ } from "./chunk-XE7ULSGQ.js";
40
+
41
+ // ../logix-core/src/internal/state-trait/source.ts
42
+ import { Effect, Fiber, FiberRef, Option } from "../effect.js";
43
+
44
+ // ../logix-core/src/internal/state-trait/deps-trace.ts
45
+ var isTraceableObject = (value) => {
46
+ if (!value || typeof value !== "object") return false;
47
+ if (Array.isArray(value)) return true;
48
+ if (value instanceof Date) return false;
49
+ if (value instanceof RegExp) return false;
50
+ if (value instanceof Error) return false;
51
+ if (value instanceof Map) return false;
52
+ if (value instanceof Set) return false;
53
+ if (value instanceof WeakMap) return false;
54
+ if (value instanceof WeakSet) return false;
55
+ return true;
56
+ };
57
+ var shouldIgnoreKey = (key) => key === "__proto__" || key === "prototype" || key === "constructor";
58
+ var normalizeReads = (reads) => {
59
+ const all = Array.from(reads).filter((p) => typeof p === "string" && p.length > 0);
60
+ all.sort();
61
+ const isPrefix = (prefix, full) => full !== prefix && full.startsWith(prefix + ".");
62
+ const pruned = [];
63
+ for (const p of all) {
64
+ let hasMoreSpecific = false;
65
+ for (const other of all) {
66
+ if (isPrefix(p, other)) {
67
+ hasMoreSpecific = true;
68
+ break;
69
+ }
70
+ }
71
+ if (!hasMoreSpecific) {
72
+ pruned.push(p);
73
+ }
74
+ }
75
+ pruned.sort();
76
+ return pruned;
77
+ };
78
+ var covers = (declared, read) => declared === read || read.startsWith(declared + ".");
79
+ var diffDeps = (declared, reads) => {
80
+ const declaredList = Array.from(new Set(declared)).filter((p) => typeof p === "string" && p.length > 0);
81
+ declaredList.sort();
82
+ const readList = Array.from(new Set(reads)).filter((p) => typeof p === "string" && p.length > 0);
83
+ readList.sort();
84
+ const missing = readList.filter((r) => declaredList.every((d) => !covers(d, r)));
85
+ const unused = declaredList.filter((d) => readList.every((r) => !covers(d, r)));
86
+ if (missing.length === 0 && unused.length === 0) return void 0;
87
+ return {
88
+ reads: readList,
89
+ declared: declaredList,
90
+ missing,
91
+ unused
92
+ };
93
+ };
94
+ var trace = (fn, state) => {
95
+ if (!isTraceableObject(state)) {
96
+ return { value: fn(state), reads: [] };
97
+ }
98
+ const reads = /* @__PURE__ */ new Set();
99
+ const proxyCache = /* @__PURE__ */ new WeakMap();
100
+ const proxyToTarget = /* @__PURE__ */ new WeakMap();
101
+ const wrap = (value2, path) => {
102
+ if (!isTraceableObject(value2)) return value2;
103
+ return getProxy(value2, path);
104
+ };
105
+ const unwrap = (value2) => {
106
+ if (value2 && (typeof value2 === "object" || typeof value2 === "function")) {
107
+ const target = proxyToTarget.get(value2);
108
+ if (target) return target;
109
+ }
110
+ return value2;
111
+ };
112
+ const getProxy = (target, basePath) => {
113
+ let byPath = proxyCache.get(target);
114
+ if (!byPath) {
115
+ byPath = /* @__PURE__ */ new Map();
116
+ proxyCache.set(target, byPath);
117
+ }
118
+ const cached = byPath.get(basePath);
119
+ if (cached) return cached;
120
+ const record2 = (path) => {
121
+ if (path) reads.add(path);
122
+ };
123
+ const proxy = new Proxy(target, {
124
+ get: (t, prop, receiver) => {
125
+ if (typeof prop === "symbol") {
126
+ return Reflect.get(t, prop, receiver);
127
+ }
128
+ const key = String(prop);
129
+ if (shouldIgnoreKey(key)) {
130
+ return Reflect.get(t, prop, receiver);
131
+ }
132
+ const nextPath = basePath ? `${basePath}.${key}` : key;
133
+ record2(nextPath);
134
+ const value2 = Reflect.get(t, prop, receiver);
135
+ return wrap(value2, nextPath);
136
+ },
137
+ has: (t, prop) => {
138
+ if (typeof prop === "symbol") return Reflect.has(t, prop);
139
+ const key = String(prop);
140
+ if (!shouldIgnoreKey(key)) {
141
+ const nextPath = basePath ? `${basePath}.${key}` : key;
142
+ record2(nextPath);
143
+ }
144
+ return Reflect.has(t, prop);
145
+ },
146
+ ownKeys: (t) => {
147
+ if (basePath) record2(basePath);
148
+ return Reflect.ownKeys(t);
149
+ },
150
+ getOwnPropertyDescriptor: (t, prop) => {
151
+ if (typeof prop === "symbol") {
152
+ return Reflect.getOwnPropertyDescriptor(t, prop);
153
+ }
154
+ const key = String(prop);
155
+ if (!shouldIgnoreKey(key)) {
156
+ const nextPath = basePath ? `${basePath}.${key}` : key;
157
+ record2(nextPath);
158
+ }
159
+ return Reflect.getOwnPropertyDescriptor(t, prop);
160
+ },
161
+ set: () => {
162
+ throw new Error(
163
+ "[deps-trace] Attempted to mutate state during deps tracing (state is readonly in dev-mode diagnostics)."
164
+ );
165
+ },
166
+ defineProperty: () => {
167
+ throw new Error(
168
+ "[deps-trace] Attempted to define property on state during deps tracing (state is readonly in dev-mode diagnostics)."
169
+ );
170
+ },
171
+ deleteProperty: () => {
172
+ throw new Error(
173
+ "[deps-trace] Attempted to delete property on state during deps tracing (state is readonly in dev-mode diagnostics)."
174
+ );
175
+ }
176
+ });
177
+ byPath.set(basePath, proxy);
178
+ proxyToTarget.set(proxy, target);
179
+ return proxy;
180
+ };
181
+ const root = getProxy(state, "");
182
+ const value = unwrap(fn(root));
183
+ return {
184
+ value,
185
+ reads: normalizeReads(reads)
186
+ };
187
+ };
188
+
189
+ // ../logix-core/src/internal/state-trait/source.ts
190
+ var onceInRunSession = (key) => Effect.serviceOption(RunSessionTag).pipe(
191
+ Effect.map((maybe) => Option.isSome(maybe) ? maybe.value.local.once(key) : true)
192
+ );
193
+ var formatList = (items, limit = 10) => {
194
+ if (items.length === 0) return "";
195
+ if (items.length <= limit) return items.join(", ");
196
+ return `${items.slice(0, limit).join(", ")}, \u2026(+${items.length - limit})`;
197
+ };
198
+ var emitDepsMismatch = (params) => Effect.gen(function* () {
199
+ const key = `${params.instanceId ?? "unknown"}::${params.kind}::${params.fieldPath}`;
200
+ const shouldEmit = yield* onceInRunSession(`deps_mismatch:${key}`);
201
+ if (!shouldEmit) return;
202
+ yield* record({
203
+ type: "diagnostic",
204
+ moduleId: params.moduleId,
205
+ instanceId: params.instanceId,
206
+ code: "state_trait::deps_mismatch",
207
+ severity: "warning",
208
+ message: `[deps] ${params.kind} "${params.fieldPath}" declared=[${formatList(params.diff.declared)}] reads=[${formatList(params.diff.reads)}] missing=[${formatList(params.diff.missing)}] unused=[${formatList(params.diff.unused)}]`,
209
+ hint: 'deps is the single source of truth for dependencies: incremental scheduling / reverse closures / performance optimizations rely on deps only. Keep deps consistent with actual reads; if you really depend on the whole object, declare a coarser-grained dep (e.g. "profile") to cover sub-field reads.',
210
+ kind: `deps_mismatch:${params.kind}`
211
+ });
212
+ });
213
+ var getMiddlewareStack = () => Effect.serviceOption(EffectOpMiddlewareTag).pipe(
214
+ Effect.map((maybe) => Option.isSome(maybe) ? maybe.value.stack : [])
215
+ );
216
+ var recordTraitPatch = (bound, path, reason, from, to, traitNodeId, stepId) => {
217
+ try {
218
+ const internals = getBoundInternals(bound);
219
+ internals.txn.recordStatePatch(path, reason, from, to, traitNodeId, stepId);
220
+ } catch {
221
+ }
222
+ };
223
+ var recordReplayEvent = (bound, event) => {
224
+ try {
225
+ const internals = getBoundInternals(bound);
226
+ internals.txn.recordReplayEvent(event);
227
+ } catch {
228
+ }
229
+ };
230
+ var getBoundScope = (bound) => {
231
+ try {
232
+ const internals = getBoundInternals(bound);
233
+ return { moduleId: internals.moduleId, instanceId: internals.instanceId };
234
+ } catch {
235
+ return { moduleId: void 0, instanceId: void 0 };
236
+ }
237
+ };
238
+ var setSnapshotInTxn = (bound, fieldPath, next, reason, stepId, traitNodeId) => Effect.gen(function* () {
239
+ let wrote = false;
240
+ yield* bound.state.mutate((draft) => {
241
+ const prev = getAtPath(draft, fieldPath);
242
+ if (Object.is(prev, next)) return;
243
+ wrote = true;
244
+ setAtPathMutating(draft, fieldPath, next);
245
+ recordTraitPatch(bound, fieldPath, reason, prev, next, traitNodeId, stepId);
246
+ });
247
+ return wrote;
248
+ });
249
+ var writebackIfCurrentKeyHash = (bound, fieldPath, keyHash2, next, reason, stepId, traitNodeId, replayEvent) => Effect.gen(function* () {
250
+ let wrote = false;
251
+ yield* bound.state.mutate((draft) => {
252
+ const current = getAtPath(draft, fieldPath);
253
+ const currentKeyHash = current && typeof current === "object" ? current.keyHash : void 0;
254
+ if (currentKeyHash !== keyHash2) return;
255
+ const prev = current;
256
+ if (Object.is(prev, next)) return;
257
+ wrote = true;
258
+ setAtPathMutating(draft, fieldPath, next);
259
+ if (replayEvent) {
260
+ recordReplayEvent(bound, replayEvent);
261
+ }
262
+ recordTraitPatch(bound, fieldPath, reason, prev, next, traitNodeId, stepId);
263
+ });
264
+ return wrote;
265
+ });
266
+ var syncIdleInTransaction = (program, ctx) => Effect.sync(() => {
267
+ const draft = ctx.getDraft();
268
+ const updates = [];
269
+ for (const entry of program.entries) {
270
+ if (entry.kind !== "source") continue;
271
+ const fieldPath = entry.fieldPath;
272
+ const listItem = parseListItemFieldPath(fieldPath);
273
+ if (listItem) {
274
+ const listValue = getAtPath(draft, listItem.listPath);
275
+ const items = Array.isArray(listValue) ? listValue : [];
276
+ for (let index = 0; index < items.length; index++) {
277
+ const item = items[index];
278
+ let key2;
279
+ try {
280
+ key2 = entry.meta.key(item);
281
+ } catch {
282
+ continue;
283
+ }
284
+ if (key2 !== void 0) continue;
285
+ const concretePath = toListItemValuePath(listItem.listPath, index, listItem.itemPath);
286
+ const prev2 = getAtPath(draft, concretePath);
287
+ const prevStatus2 = prev2 && typeof prev2 === "object" ? prev2.status : void 0;
288
+ if (prevStatus2 === "idle") {
289
+ const data = prev2?.data;
290
+ const error = prev2?.error;
291
+ if (data === void 0 && error === void 0) {
292
+ continue;
293
+ }
294
+ }
295
+ updates.push({ fieldPath: concretePath, prev: prev2 });
296
+ }
297
+ continue;
298
+ }
299
+ let key;
300
+ try {
301
+ key = entry.meta.key(draft);
302
+ } catch {
303
+ continue;
304
+ }
305
+ if (key !== void 0) continue;
306
+ const prev = getAtPath(draft, fieldPath);
307
+ const prevStatus = prev && typeof prev === "object" ? prev.status : void 0;
308
+ if (prevStatus === "idle") {
309
+ const data = prev?.data;
310
+ const error = prev?.error;
311
+ if (data === void 0 && error === void 0) {
312
+ continue;
313
+ }
314
+ }
315
+ updates.push({ fieldPath, prev });
316
+ }
317
+ if (updates.length === 0) return;
318
+ const reason = "source:idle";
319
+ const nextDraft = create(draft, (next) => {
320
+ for (const u of updates) {
321
+ setAtPathMutating(next, u.fieldPath, Snapshot.idle());
322
+ }
323
+ });
324
+ ctx.setDraft(nextDraft);
325
+ for (const u of updates) {
326
+ ctx.recordPatch(u.fieldPath, reason, u.prev, Snapshot.idle(), void 0, `source:${u.fieldPath}:idle`);
327
+ }
328
+ });
329
+ var installSourceRefresh = (bound, step, entry) => {
330
+ if (!step.targetFieldPath) return Effect.void;
331
+ const fieldPath = step.targetFieldPath;
332
+ const resourceId = step.resourceId ?? entry.meta.resource;
333
+ const listItem = parseListItemFieldPath(fieldPath);
334
+ let internals;
335
+ try {
336
+ internals = getBoundInternals(bound);
337
+ } catch {
338
+ return Effect.void;
339
+ }
340
+ const register = internals.traits.registerSourceRefresh;
341
+ const recordSnapshot = (replayMode, replayLog, input) => {
342
+ if (!replayLog) return Effect.void;
343
+ if (replayMode !== "live") return Effect.void;
344
+ const event = input && typeof input === "object" && input._tag === "ResourceSnapshot" ? input : {
345
+ _tag: "ResourceSnapshot",
346
+ resourceId,
347
+ fieldPath: input.fieldPath,
348
+ keyHash: input.keyHash,
349
+ concurrency: input.concurrency,
350
+ phase: input.phase,
351
+ snapshot: input.snapshot,
352
+ timestamp: Date.now(),
353
+ moduleId: input.moduleId,
354
+ instanceId: input.instanceId
355
+ };
356
+ return replayLog.record(event);
357
+ };
358
+ if (listItem) {
359
+ const store = internals.traits.rowIdStore;
360
+ if (!store) {
361
+ return Effect.void;
362
+ }
363
+ const listPath = listItem.listPath;
364
+ const itemPath = listItem.itemPath;
365
+ if (!itemPath) {
366
+ return Effect.void;
367
+ }
368
+ const concurrency2 = entry.meta.concurrency;
369
+ const mode2 = concurrency2 ?? "switch";
370
+ const inFlight2 = /* @__PURE__ */ new Map();
371
+ const trailing2 = /* @__PURE__ */ new Map();
372
+ let gen2 = 0;
373
+ store.onRemoved(listPath, (rowId) => {
374
+ trailing2.delete(rowId);
375
+ inFlight2.delete(rowId);
376
+ });
377
+ const setSnapshotForRowInTxn = (rowId, next, reason, stepId) => Effect.gen(function* () {
378
+ let wrotePath;
379
+ yield* bound.state.mutate((draft) => {
380
+ const index = store.getIndex(listPath, rowId);
381
+ if (index === void 0) return;
382
+ const concretePath = toListItemValuePath(listPath, index, itemPath);
383
+ const prev = getAtPath(draft, concretePath);
384
+ if (Object.is(prev, next)) return;
385
+ wrotePath = concretePath;
386
+ setAtPathMutating(draft, concretePath, next);
387
+ recordTraitPatch(bound, concretePath, reason, prev, next, step.debugInfo?.graphNodeId, stepId);
388
+ });
389
+ return wrotePath;
390
+ });
391
+ const writebackIfCurrentKeyHashForRow = (rowId, keyHash2, next, reason, stepId, phase) => Effect.gen(function* () {
392
+ let wrotePath;
393
+ yield* bound.state.mutate((draft) => {
394
+ const index = store.getIndex(listPath, rowId);
395
+ if (index === void 0) return;
396
+ const concretePath = toListItemValuePath(listPath, index, itemPath);
397
+ const current = getAtPath(draft, concretePath);
398
+ const currentKeyHash = current && typeof current === "object" ? current.keyHash : void 0;
399
+ if (currentKeyHash !== keyHash2) return;
400
+ const prev = current;
401
+ if (Object.is(prev, next)) return;
402
+ wrotePath = concretePath;
403
+ setAtPathMutating(draft, concretePath, next);
404
+ if (phase) {
405
+ const { moduleId, instanceId } = getBoundScope(bound);
406
+ recordReplayEvent(bound, {
407
+ _tag: "ResourceSnapshot",
408
+ resourceId,
409
+ fieldPath: concretePath,
410
+ keyHash: keyHash2,
411
+ concurrency: mode2,
412
+ phase,
413
+ snapshot: next,
414
+ timestamp: Date.now(),
415
+ moduleId,
416
+ instanceId
417
+ });
418
+ }
419
+ recordTraitPatch(bound, concretePath, reason, prev, next, step.debugInfo?.graphNodeId, stepId);
420
+ });
421
+ return wrotePath;
422
+ });
423
+ const startFetch2 = (rowId, key, keyHash2, replayMode, replayLog) => Effect.gen(function* () {
424
+ const { moduleId, instanceId } = getBoundScope(bound);
425
+ const indexForLog = store.getIndex(listPath, rowId);
426
+ const logFieldPath = indexForLog === void 0 ? void 0 : toListItemValuePath(listPath, indexForLog, itemPath);
427
+ let loadingSnapshot = Snapshot.loading({ keyHash: keyHash2 });
428
+ if (replayMode === "replay" && replayLog && logFieldPath) {
429
+ const replayLoading = yield* replayLog.consumeNextResourceSnapshot({
430
+ resourceId,
431
+ fieldPath: logFieldPath,
432
+ keyHash: keyHash2,
433
+ phase: "loading"
434
+ });
435
+ if (replayLoading) {
436
+ loadingSnapshot = replayLoading.snapshot;
437
+ }
438
+ }
439
+ const wroteLoadingPath = yield* setSnapshotForRowInTxn(
440
+ rowId,
441
+ loadingSnapshot,
442
+ "source:loading",
443
+ `source:${fieldPath}:${rowId}:loading`
444
+ );
445
+ if (wroteLoadingPath) {
446
+ const event = {
447
+ _tag: "ResourceSnapshot",
448
+ resourceId,
449
+ fieldPath: wroteLoadingPath,
450
+ keyHash: keyHash2,
451
+ concurrency: mode2,
452
+ phase: "loading",
453
+ snapshot: loadingSnapshot,
454
+ timestamp: Date.now(),
455
+ moduleId,
456
+ instanceId
457
+ };
458
+ recordReplayEvent(bound, event);
459
+ yield* recordSnapshot(replayMode, replayLog, event);
460
+ }
461
+ const io = Effect.gen(function* () {
462
+ if (replayMode === "replay" && replayLog) {
463
+ yield* Effect.yieldNow();
464
+ const consumePath = wroteLoadingPath ?? logFieldPath;
465
+ if (!consumePath) return yield* Effect.void;
466
+ const replayed = yield* replayLog.consumeNextResourceSnapshot({
467
+ resourceId,
468
+ fieldPath: consumePath,
469
+ keyHash: keyHash2
470
+ });
471
+ if (!replayed) return yield* Effect.void;
472
+ if (replayed.phase === "success") {
473
+ yield* writebackIfCurrentKeyHashForRow(
474
+ rowId,
475
+ keyHash2,
476
+ replayed.snapshot,
477
+ "source:success",
478
+ `source:${fieldPath}:${rowId}:success`,
479
+ "success"
480
+ );
481
+ } else if (replayed.phase === "error") {
482
+ yield* writebackIfCurrentKeyHashForRow(
483
+ rowId,
484
+ keyHash2,
485
+ replayed.snapshot,
486
+ "source:error",
487
+ `source:${fieldPath}:${rowId}:error`,
488
+ "error"
489
+ );
490
+ }
491
+ return yield* Effect.void;
492
+ }
493
+ const stack = yield* getMiddlewareStack();
494
+ const registryOpt = yield* Effect.serviceOption(internal.ResourceRegistryTag);
495
+ const registry = Option.isSome(registryOpt) ? registryOpt.value : void 0;
496
+ const spec = registry?.specs.get(resourceId);
497
+ if (!spec) {
498
+ return yield* Effect.void;
499
+ }
500
+ const loadEffect = spec.load(key);
501
+ const meta = {
502
+ moduleId,
503
+ instanceId,
504
+ fieldPath,
505
+ resourceId,
506
+ key,
507
+ keyHash: keyHash2,
508
+ rowId,
509
+ traitNodeId: step.debugInfo?.graphNodeId,
510
+ stepId: step.id
511
+ };
512
+ if (!(typeof meta.opSeq === "number" && Number.isFinite(meta.opSeq))) {
513
+ const sessionOpt = yield* Effect.serviceOption(RunSessionTag);
514
+ if (Option.isSome(sessionOpt)) {
515
+ const seqKey = instanceId ?? "global";
516
+ meta.opSeq = sessionOpt.value.local.nextSeq("opSeq", seqKey);
517
+ }
518
+ }
519
+ const op = make({
520
+ kind: "service",
521
+ name: resourceId,
522
+ effect: loadEffect,
523
+ meta
524
+ });
525
+ const exit = yield* Effect.exit(run(op, stack));
526
+ if (exit._tag === "Success") {
527
+ const successSnapshot = Snapshot.success({ keyHash: keyHash2, data: exit.value });
528
+ const wroteSuccessPath = yield* writebackIfCurrentKeyHashForRow(
529
+ rowId,
530
+ keyHash2,
531
+ successSnapshot,
532
+ "source:success",
533
+ `source:${fieldPath}:${rowId}:success`,
534
+ "success"
535
+ );
536
+ if (wroteSuccessPath) {
537
+ yield* recordSnapshot(replayMode, replayLog, {
538
+ _tag: "ResourceSnapshot",
539
+ resourceId,
540
+ fieldPath: wroteSuccessPath,
541
+ keyHash: keyHash2,
542
+ concurrency: mode2,
543
+ phase: "success",
544
+ snapshot: successSnapshot,
545
+ timestamp: Date.now(),
546
+ moduleId,
547
+ instanceId
548
+ });
549
+ }
550
+ } else {
551
+ const errorSnapshot = Snapshot.error({ keyHash: keyHash2, error: exit.cause });
552
+ const wroteErrorPath = yield* writebackIfCurrentKeyHashForRow(
553
+ rowId,
554
+ keyHash2,
555
+ errorSnapshot,
556
+ "source:error",
557
+ `source:${fieldPath}:${rowId}:error`,
558
+ "error"
559
+ );
560
+ if (wroteErrorPath) {
561
+ yield* recordSnapshot(replayMode, replayLog, {
562
+ _tag: "ResourceSnapshot",
563
+ resourceId,
564
+ fieldPath: wroteErrorPath,
565
+ keyHash: keyHash2,
566
+ concurrency: mode2,
567
+ phase: "error",
568
+ snapshot: errorSnapshot,
569
+ timestamp: Date.now(),
570
+ moduleId,
571
+ instanceId
572
+ });
573
+ }
574
+ }
575
+ }).pipe(Effect.catchAllCause(() => Effect.void));
576
+ const fiber = yield* Effect.forkScoped(Effect.locally(inSyncTransactionFiber, false)(io));
577
+ const myGen = gen2 += 1;
578
+ inFlight2.set(rowId, { gen: myGen, fiber, keyHash: keyHash2 });
579
+ yield* Effect.forkScoped(
580
+ Effect.locally(
581
+ inSyncTransactionFiber,
582
+ false
583
+ )(
584
+ Fiber.await(fiber).pipe(
585
+ Effect.zipRight(
586
+ Effect.sync(() => {
587
+ const current = inFlight2.get(rowId);
588
+ if (current && current.gen === myGen) {
589
+ inFlight2.delete(rowId);
590
+ }
591
+ })
592
+ ),
593
+ Effect.zipRight(
594
+ mode2 === "exhaust-trailing" ? Effect.gen(function* () {
595
+ const next = trailing2.get(rowId);
596
+ trailing2.delete(rowId);
597
+ if (next) {
598
+ yield* startFetch2(rowId, next.key, next.keyHash, replayMode, replayLog);
599
+ }
600
+ }) : Effect.void
601
+ ),
602
+ Effect.catchAllCause(() => Effect.void)
603
+ )
604
+ )
605
+ );
606
+ });
607
+ register(
608
+ fieldPath,
609
+ (state) => Effect.gen(function* () {
610
+ const { moduleId, instanceId } = getBoundScope(bound);
611
+ const replayModeOpt = yield* Effect.serviceOption(ReplayModeConfigTag);
612
+ const replayMode = Option.isSome(replayModeOpt) ? replayModeOpt.value.mode : "live";
613
+ const replayLogOpt = yield* Effect.serviceOption(ReplayLog);
614
+ const replayLog = Option.isSome(replayLogOpt) ? replayLogOpt.value : void 0;
615
+ const force = yield* FiberRef.get(forceSourceRefresh);
616
+ const listValue = getAtPath(state, listPath);
617
+ const items = Array.isArray(listValue) ? listValue : [];
618
+ const ids = store.ensureList(listPath, items);
619
+ const traceKey = `${instanceId ?? "unknown"}::source::${fieldPath}`;
620
+ if (isDevEnv() && (yield* onceInRunSession(`deps_trace_settled:${traceKey}`))) {
621
+ try {
622
+ const sample = items[0];
623
+ if (sample !== void 0) {
624
+ const traced = trace((s) => entry.meta.key(s), sample);
625
+ const prefixedReads = traced.reads.map((r) => r ? `${listPath}[].${r}` : `${listPath}[]`);
626
+ const diff = diffDeps(entry.meta.deps ?? [], prefixedReads);
627
+ if (diff) {
628
+ yield* emitDepsMismatch({
629
+ moduleId,
630
+ instanceId,
631
+ kind: "source",
632
+ fieldPath,
633
+ diff
634
+ });
635
+ }
636
+ }
637
+ } catch {
638
+ }
639
+ }
640
+ for (let index = 0; index < items.length; index++) {
641
+ const rowId = ids[index];
642
+ if (!rowId) continue;
643
+ const concretePath = toListItemValuePath(listPath, index, itemPath);
644
+ const prevSnapshot = getAtPath(state, concretePath);
645
+ let key;
646
+ try {
647
+ key = entry.meta.key(items[index]);
648
+ } catch {
649
+ key = void 0;
650
+ }
651
+ const current = inFlight2.get(rowId);
652
+ if (key === void 0) {
653
+ trailing2.delete(rowId);
654
+ inFlight2.delete(rowId);
655
+ if (prevSnapshot && typeof prevSnapshot === "object" && prevSnapshot.status === "idle" && prevSnapshot.data === void 0 && prevSnapshot.error === void 0) {
656
+ continue;
657
+ }
658
+ const idleSnapshot = Snapshot.idle();
659
+ const wroteIdlePath = yield* setSnapshotForRowInTxn(
660
+ rowId,
661
+ idleSnapshot,
662
+ "source:idle",
663
+ `source:${fieldPath}:${rowId}:idle`
664
+ );
665
+ if (wroteIdlePath) {
666
+ const event = {
667
+ _tag: "ResourceSnapshot",
668
+ resourceId,
669
+ fieldPath: wroteIdlePath,
670
+ keyHash: void 0,
671
+ concurrency: mode2,
672
+ phase: "idle",
673
+ snapshot: idleSnapshot,
674
+ timestamp: Date.now(),
675
+ moduleId,
676
+ instanceId
677
+ };
678
+ recordReplayEvent(bound, event);
679
+ yield* recordSnapshot(replayMode, replayLog, event);
680
+ }
681
+ continue;
682
+ }
683
+ const h = keyHash(key);
684
+ if (!force && current && current.keyHash === h) {
685
+ continue;
686
+ }
687
+ const prevKeyHash = prevSnapshot && typeof prevSnapshot === "object" ? prevSnapshot.keyHash : void 0;
688
+ if (!force && !current && prevKeyHash === h) {
689
+ continue;
690
+ }
691
+ if (mode2 === "exhaust-trailing" && current) {
692
+ trailing2.set(rowId, { key, keyHash: h });
693
+ const loadingSnapshot = Snapshot.loading({ keyHash: h });
694
+ const wroteLoadingPath = yield* setSnapshotForRowInTxn(
695
+ rowId,
696
+ loadingSnapshot,
697
+ "source:loading",
698
+ `source:${fieldPath}:${rowId}:loading`
699
+ );
700
+ if (wroteLoadingPath) {
701
+ const event = {
702
+ _tag: "ResourceSnapshot",
703
+ resourceId,
704
+ fieldPath: wroteLoadingPath,
705
+ keyHash: h,
706
+ concurrency: mode2,
707
+ phase: "loading",
708
+ snapshot: loadingSnapshot,
709
+ timestamp: Date.now(),
710
+ moduleId,
711
+ instanceId
712
+ };
713
+ recordReplayEvent(bound, event);
714
+ yield* recordSnapshot(replayMode, replayLog, event);
715
+ }
716
+ continue;
717
+ }
718
+ if (mode2 === "switch" && current) {
719
+ trailing2.delete(rowId);
720
+ inFlight2.delete(rowId);
721
+ }
722
+ yield* startFetch2(rowId, key, h, replayMode, replayLog);
723
+ }
724
+ })
725
+ );
726
+ return Effect.void;
727
+ }
728
+ let inFlight;
729
+ let gen = 0;
730
+ let trailing;
731
+ const concurrency = entry.meta.concurrency;
732
+ const mode = concurrency ?? "switch";
733
+ const startFetch = (key, keyHash2, replayMode, replayLog) => Effect.gen(function* () {
734
+ const { moduleId, instanceId } = getBoundScope(bound);
735
+ let loadingSnapshot = Snapshot.loading({ keyHash: keyHash2 });
736
+ if (replayMode === "replay" && replayLog) {
737
+ const replayLoading = yield* replayLog.consumeNextResourceSnapshot({
738
+ resourceId,
739
+ fieldPath,
740
+ keyHash: keyHash2,
741
+ phase: "loading"
742
+ });
743
+ if (replayLoading) {
744
+ loadingSnapshot = replayLoading.snapshot;
745
+ }
746
+ }
747
+ const wroteLoading = yield* setSnapshotInTxn(
748
+ bound,
749
+ fieldPath,
750
+ loadingSnapshot,
751
+ "source:loading",
752
+ `source:${fieldPath}:loading`,
753
+ step.debugInfo?.graphNodeId
754
+ );
755
+ if (wroteLoading) {
756
+ const event = {
757
+ _tag: "ResourceSnapshot",
758
+ resourceId,
759
+ fieldPath,
760
+ keyHash: keyHash2,
761
+ concurrency: mode,
762
+ phase: "loading",
763
+ snapshot: loadingSnapshot,
764
+ timestamp: Date.now(),
765
+ moduleId,
766
+ instanceId
767
+ };
768
+ recordReplayEvent(bound, event);
769
+ yield* recordSnapshot(replayMode, replayLog, event);
770
+ }
771
+ const io = Effect.gen(function* () {
772
+ if (replayMode === "replay" && replayLog) {
773
+ yield* Effect.yieldNow();
774
+ const replayed = yield* replayLog.consumeNextResourceSnapshot({
775
+ resourceId,
776
+ fieldPath,
777
+ keyHash: keyHash2
778
+ });
779
+ if (!replayed) return yield* Effect.void;
780
+ if (replayed.phase === "success") {
781
+ const event = {
782
+ _tag: "ResourceSnapshot",
783
+ resourceId,
784
+ fieldPath,
785
+ keyHash: keyHash2,
786
+ concurrency: mode,
787
+ phase: "success",
788
+ snapshot: replayed.snapshot,
789
+ timestamp: Date.now(),
790
+ moduleId,
791
+ instanceId
792
+ };
793
+ yield* writebackIfCurrentKeyHash(
794
+ bound,
795
+ fieldPath,
796
+ keyHash2,
797
+ replayed.snapshot,
798
+ "source:success",
799
+ `source:${fieldPath}:success`,
800
+ step.debugInfo?.graphNodeId,
801
+ event
802
+ );
803
+ } else if (replayed.phase === "error") {
804
+ const event = {
805
+ _tag: "ResourceSnapshot",
806
+ resourceId,
807
+ fieldPath,
808
+ keyHash: keyHash2,
809
+ concurrency: mode,
810
+ phase: "error",
811
+ snapshot: replayed.snapshot,
812
+ timestamp: Date.now(),
813
+ moduleId,
814
+ instanceId
815
+ };
816
+ yield* writebackIfCurrentKeyHash(
817
+ bound,
818
+ fieldPath,
819
+ keyHash2,
820
+ replayed.snapshot,
821
+ "source:error",
822
+ `source:${fieldPath}:error`,
823
+ step.debugInfo?.graphNodeId,
824
+ event
825
+ );
826
+ }
827
+ return yield* Effect.void;
828
+ }
829
+ const stack = yield* getMiddlewareStack();
830
+ const registryOpt = yield* Effect.serviceOption(internal.ResourceRegistryTag);
831
+ const registry = Option.isSome(registryOpt) ? registryOpt.value : void 0;
832
+ const spec = registry?.specs.get(resourceId);
833
+ if (!spec) {
834
+ return yield* Effect.void;
835
+ }
836
+ const loadEffect = spec.load(key);
837
+ const meta = {
838
+ moduleId,
839
+ instanceId,
840
+ fieldPath,
841
+ resourceId,
842
+ key,
843
+ keyHash: keyHash2,
844
+ traitNodeId: step.debugInfo?.graphNodeId,
845
+ stepId: step.id
846
+ };
847
+ if (!(typeof meta.opSeq === "number" && Number.isFinite(meta.opSeq))) {
848
+ const sessionOpt = yield* Effect.serviceOption(RunSessionTag);
849
+ if (Option.isSome(sessionOpt)) {
850
+ const seqKey = instanceId ?? "global";
851
+ meta.opSeq = sessionOpt.value.local.nextSeq("opSeq", seqKey);
852
+ }
853
+ }
854
+ const op = make({
855
+ kind: "trait-source",
856
+ name: resourceId,
857
+ effect: loadEffect,
858
+ meta
859
+ });
860
+ const exit = yield* Effect.exit(run(op, stack));
861
+ if (exit._tag === "Success") {
862
+ const successSnapshot = Snapshot.success({ keyHash: keyHash2, data: exit.value });
863
+ const event = {
864
+ _tag: "ResourceSnapshot",
865
+ resourceId,
866
+ fieldPath,
867
+ keyHash: keyHash2,
868
+ concurrency: mode,
869
+ phase: "success",
870
+ snapshot: successSnapshot,
871
+ timestamp: Date.now(),
872
+ moduleId,
873
+ instanceId
874
+ };
875
+ const wroteSuccess = yield* writebackIfCurrentKeyHash(
876
+ bound,
877
+ fieldPath,
878
+ keyHash2,
879
+ successSnapshot,
880
+ "source:success",
881
+ `source:${fieldPath}:success`,
882
+ step.debugInfo?.graphNodeId,
883
+ event
884
+ );
885
+ if (wroteSuccess) {
886
+ yield* recordSnapshot(replayMode, replayLog, event);
887
+ }
888
+ } else {
889
+ const errorSnapshot = Snapshot.error({ keyHash: keyHash2, error: exit.cause });
890
+ const event = {
891
+ _tag: "ResourceSnapshot",
892
+ resourceId,
893
+ fieldPath,
894
+ keyHash: keyHash2,
895
+ concurrency: mode,
896
+ phase: "error",
897
+ snapshot: errorSnapshot,
898
+ timestamp: Date.now(),
899
+ moduleId,
900
+ instanceId
901
+ };
902
+ const wroteError = yield* writebackIfCurrentKeyHash(
903
+ bound,
904
+ fieldPath,
905
+ keyHash2,
906
+ errorSnapshot,
907
+ "source:error",
908
+ `source:${fieldPath}:error`,
909
+ step.debugInfo?.graphNodeId,
910
+ event
911
+ );
912
+ if (wroteError) {
913
+ yield* recordSnapshot(replayMode, replayLog, event);
914
+ }
915
+ }
916
+ }).pipe(Effect.catchAllCause(() => Effect.void));
917
+ const fiber = yield* Effect.forkScoped(Effect.locally(inSyncTransactionFiber, false)(io));
918
+ const myGen = gen += 1;
919
+ inFlight = { gen: myGen, fiber, keyHash: keyHash2 };
920
+ yield* Effect.forkScoped(
921
+ Effect.locally(
922
+ inSyncTransactionFiber,
923
+ false
924
+ )(
925
+ Fiber.await(fiber).pipe(
926
+ Effect.zipRight(
927
+ Effect.sync(() => {
928
+ if (inFlight && inFlight.gen === myGen) {
929
+ inFlight = void 0;
930
+ }
931
+ })
932
+ ),
933
+ Effect.zipRight(
934
+ mode === "exhaust-trailing" ? Effect.gen(function* () {
935
+ const next = trailing;
936
+ trailing = void 0;
937
+ if (next) {
938
+ yield* startFetch(next.key, next.keyHash, replayMode, replayLog);
939
+ }
940
+ }) : Effect.void
941
+ ),
942
+ Effect.catchAllCause(() => Effect.void)
943
+ )
944
+ )
945
+ );
946
+ });
947
+ register(
948
+ fieldPath,
949
+ (state) => Effect.gen(function* () {
950
+ const { moduleId, instanceId } = getBoundScope(bound);
951
+ const replayModeOpt = yield* Effect.serviceOption(ReplayModeConfigTag);
952
+ const replayMode = Option.isSome(replayModeOpt) ? replayModeOpt.value.mode : "live";
953
+ const replayLogOpt = yield* Effect.serviceOption(ReplayLog);
954
+ const replayLog = Option.isSome(replayLogOpt) ? replayLogOpt.value : void 0;
955
+ const force = yield* FiberRef.get(forceSourceRefresh);
956
+ let key;
957
+ try {
958
+ key = entry.meta.key(state);
959
+ } catch {
960
+ key = void 0;
961
+ }
962
+ const traceKey = `${instanceId ?? "unknown"}::source::${fieldPath}`;
963
+ if (isDevEnv() && (yield* onceInRunSession(`deps_trace_settled:${traceKey}`))) {
964
+ try {
965
+ const traced = trace((s) => entry.meta.key(s), state);
966
+ const diff = diffDeps(entry.meta.deps ?? [], traced.reads);
967
+ if (diff) {
968
+ yield* emitDepsMismatch({
969
+ moduleId,
970
+ instanceId,
971
+ kind: "source",
972
+ fieldPath,
973
+ diff
974
+ });
975
+ }
976
+ } catch {
977
+ }
978
+ }
979
+ if (key === void 0) {
980
+ if (inFlight) {
981
+ yield* Fiber.interruptFork(inFlight.fiber);
982
+ inFlight = void 0;
983
+ }
984
+ trailing = void 0;
985
+ const idleSnapshot = Snapshot.idle();
986
+ const wroteIdle = yield* setSnapshotInTxn(
987
+ bound,
988
+ fieldPath,
989
+ idleSnapshot,
990
+ "source:idle",
991
+ `source:${fieldPath}:idle`,
992
+ step.debugInfo?.graphNodeId
993
+ );
994
+ if (wroteIdle) {
995
+ const event = {
996
+ _tag: "ResourceSnapshot",
997
+ resourceId,
998
+ fieldPath,
999
+ keyHash: void 0,
1000
+ concurrency: mode,
1001
+ phase: "idle",
1002
+ snapshot: idleSnapshot,
1003
+ timestamp: Date.now(),
1004
+ moduleId,
1005
+ instanceId
1006
+ };
1007
+ recordReplayEvent(bound, event);
1008
+ yield* recordSnapshot(replayMode, replayLog, event);
1009
+ }
1010
+ return;
1011
+ }
1012
+ const h = keyHash(key);
1013
+ if (!force) {
1014
+ if (inFlight && inFlight.keyHash === h) {
1015
+ return;
1016
+ }
1017
+ const currentSnapshot = getAtPath(state, fieldPath);
1018
+ const currentKeyHash = currentSnapshot && typeof currentSnapshot === "object" ? currentSnapshot.keyHash : void 0;
1019
+ const currentStatus = currentSnapshot && typeof currentSnapshot === "object" ? currentSnapshot.status : void 0;
1020
+ if (currentStatus && currentStatus !== "idle" && currentKeyHash === h) {
1021
+ return;
1022
+ }
1023
+ }
1024
+ if (mode === "exhaust-trailing" && inFlight) {
1025
+ trailing = { key, keyHash: h };
1026
+ const loadingSnapshot = Snapshot.loading({ keyHash: h });
1027
+ const wroteLoading = yield* setSnapshotInTxn(
1028
+ bound,
1029
+ fieldPath,
1030
+ loadingSnapshot,
1031
+ "source:loading",
1032
+ `source:${fieldPath}:loading`,
1033
+ step.debugInfo?.graphNodeId
1034
+ );
1035
+ if (wroteLoading) {
1036
+ const event = {
1037
+ _tag: "ResourceSnapshot",
1038
+ resourceId,
1039
+ fieldPath,
1040
+ keyHash: h,
1041
+ concurrency: mode,
1042
+ phase: "loading",
1043
+ snapshot: loadingSnapshot,
1044
+ timestamp: Date.now(),
1045
+ moduleId,
1046
+ instanceId
1047
+ };
1048
+ recordReplayEvent(bound, event);
1049
+ yield* recordSnapshot(replayMode, replayLog, event);
1050
+ }
1051
+ return;
1052
+ }
1053
+ if (mode === "switch" && inFlight) {
1054
+ yield* Fiber.interruptFork(inFlight.fiber);
1055
+ inFlight = void 0;
1056
+ trailing = void 0;
1057
+ }
1058
+ yield* startFetch(key, h, replayMode, replayLog);
1059
+ })
1060
+ );
1061
+ return Effect.void;
1062
+ };
1063
+
1064
+ export {
1065
+ diffDeps,
1066
+ trace,
1067
+ syncIdleInTransaction,
1068
+ installSourceRefresh
1069
+ };
1070
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vbG9naXgtY29yZS9zcmMvaW50ZXJuYWwvc3RhdGUtdHJhaXQvc291cmNlLnRzIiwgIi4uLy4uLy4uLy4uL2xvZ2l4LWNvcmUvc3JjL2ludGVybmFsL3N0YXRlLXRyYWl0L2RlcHMtdHJhY2UudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbImltcG9ydCB7IEVmZmVjdCwgRmliZXIsIEZpYmVyUmVmLCBPcHRpb24gfSBmcm9tICdlZmZlY3QnXG5pbXBvcnQgeyBjcmVhdGUgfSBmcm9tICdtdXRhdGl2ZSdcbmltcG9ydCAqIGFzIEVmZmVjdE9wIGZyb20gJy4uL2VmZmVjdC1vcC5qcydcbmltcG9ydCB7IFNuYXBzaG90LCBpbnRlcm5hbCBhcyBSZXNvdXJjZUludGVybmFsLCBrZXlIYXNoIGFzIGhhc2hLZXkgfSBmcm9tICcuLi9yZXNvdXJjZS5qcydcbmltcG9ydCAqIGFzIEVmZmVjdE9wQ29yZSBmcm9tICcuLi9ydW50aW1lL2NvcmUvRWZmZWN0T3BDb3JlLmpzJ1xuaW1wb3J0ICogYXMgRGVidWcgZnJvbSAnLi4vcnVudGltZS9jb3JlL0RlYnVnU2luay5qcydcbmltcG9ydCAqIGFzIFRhc2tSdW5uZXIgZnJvbSAnLi4vcnVudGltZS9jb3JlL1Rhc2tSdW5uZXIuanMnXG5pbXBvcnQgeyBpc0RldkVudiwgUmVwbGF5TW9kZUNvbmZpZ1RhZyB9IGZyb20gJy4uL3J1bnRpbWUvY29yZS9lbnYuanMnXG5pbXBvcnQgKiBhcyBSZXBsYXlMb2cgZnJvbSAnLi4vcnVudGltZS9jb3JlL1JlcGxheUxvZy5qcydcbmltcG9ydCB0eXBlIHsgUGF0Y2hSZWFzb24gfSBmcm9tICcuLi9ydW50aW1lL2NvcmUvU3RhdGVUcmFuc2FjdGlvbi5qcydcbmltcG9ydCB0eXBlIHsgRmllbGRQYXRoIH0gZnJvbSAnLi4vZmllbGQtcGF0aC5qcydcbmltcG9ydCB0eXBlIHsgQm91bmRBcGkgfSBmcm9tICcuLi9ydW50aW1lL2NvcmUvbW9kdWxlLmpzJ1xuaW1wb3J0IHsgZ2V0Qm91bmRJbnRlcm5hbHMgfSBmcm9tICcuLi9ydW50aW1lL2NvcmUvcnVudGltZUludGVybmFsc0FjY2Vzc29yLmpzJ1xuaW1wb3J0IHsgUnVuU2Vzc2lvblRhZyB9IGZyb20gJy4uL29ic2VydmFiaWxpdHkvcnVuU2Vzc2lvbi5qcydcbmltcG9ydCAqIGFzIERlcHNUcmFjZSBmcm9tICcuL2RlcHMtdHJhY2UuanMnXG5pbXBvcnQgKiBhcyBSb3dJZCBmcm9tICcuL3Jvd2lkLmpzJ1xuaW1wb3J0IHR5cGUgeyBTdGF0ZVRyYWl0RW50cnksIFN0YXRlVHJhaXRQbGFuU3RlcCwgU3RhdGVUcmFpdFByb2dyYW0gfSBmcm9tICcuL21vZGVsLmpzJ1xuXG5leHBvcnQgaW50ZXJmYWNlIFNvdXJjZVN5bmNDb250ZXh0PFM+IHtcbiAgcmVhZG9ubHkgbW9kdWxlSWQ/OiBzdHJpbmdcbiAgcmVhZG9ubHkgaW5zdGFuY2VJZD86IHN0cmluZ1xuICByZWFkb25seSBnZXREcmFmdDogKCkgPT4gU1xuICByZWFkb25seSBzZXREcmFmdDogKG5leHQ6IFMpID0+IHZvaWRcbiAgcmVhZG9ubHkgcmVjb3JkUGF0Y2g6IChcbiAgICBwYXRoOiBzdHJpbmcgfCBGaWVsZFBhdGggfCB1bmRlZmluZWQsXG4gICAgcmVhc29uOiBQYXRjaFJlYXNvbixcbiAgICBmcm9tPzogdW5rbm93bixcbiAgICB0bz86IHVua25vd24sXG4gICAgdHJhaXROb2RlSWQ/OiBzdHJpbmcsXG4gICAgc3RlcElkPzogc3RyaW5nLFxuICApID0+IHZvaWRcbn1cblxuY29uc3Qgb25jZUluUnVuU2Vzc2lvbiA9IChrZXk6IHN0cmluZyk6IEVmZmVjdC5FZmZlY3Q8Ym9vbGVhbiwgbmV2ZXIsIGFueT4gPT5cbiAgRWZmZWN0LnNlcnZpY2VPcHRpb24oUnVuU2Vzc2lvblRhZykucGlwZShcbiAgICBFZmZlY3QubWFwKChtYXliZSkgPT4gKE9wdGlvbi5pc1NvbWUobWF5YmUpID8gbWF5YmUudmFsdWUubG9jYWwub25jZShrZXkpIDogdHJ1ZSkpLFxuICApXG5cbmNvbnN0IGZvcm1hdExpc3QgPSAoaXRlbXM6IFJlYWRvbmx5QXJyYXk8c3RyaW5nPiwgbGltaXQgPSAxMCk6IHN0cmluZyA9PiB7XG4gIGlmIChpdGVtcy5sZW5ndGggPT09IDApIHJldHVybiAnJ1xuICBpZiAoaXRlbXMubGVuZ3RoIDw9IGxpbWl0KSByZXR1cm4gaXRlbXMuam9pbignLCAnKVxuICByZXR1cm4gYCR7aXRlbXMuc2xpY2UoMCwgbGltaXQpLmpvaW4oJywgJyl9LCBcdTIwMjYoKyR7aXRlbXMubGVuZ3RoIC0gbGltaXR9KWBcbn1cblxuY29uc3QgZW1pdERlcHNNaXNtYXRjaCA9IChwYXJhbXM6IHtcbiAgcmVhZG9ubHkgbW9kdWxlSWQ/OiBzdHJpbmdcbiAgcmVhZG9ubHkgaW5zdGFuY2VJZD86IHN0cmluZ1xuICByZWFkb25seSBraW5kOiAnY29tcHV0ZWQnIHwgJ3NvdXJjZSdcbiAgcmVhZG9ubHkgZmllbGRQYXRoOiBzdHJpbmdcbiAgcmVhZG9ubHkgZGlmZjogRGVwc1RyYWNlLkRlcHNEaWZmXG59KTogRWZmZWN0LkVmZmVjdDx2b2lkLCBuZXZlciwgYW55PiA9PlxuICBFZmZlY3QuZ2VuKGZ1bmN0aW9uKiAoKSB7XG4gICAgY29uc3Qga2V5ID0gYCR7cGFyYW1zLmluc3RhbmNlSWQgPz8gJ3Vua25vd24nfTo6JHtwYXJhbXMua2luZH06OiR7cGFyYW1zLmZpZWxkUGF0aH1gXG4gICAgY29uc3Qgc2hvdWxkRW1pdCA9IHlpZWxkKiBvbmNlSW5SdW5TZXNzaW9uKGBkZXBzX21pc21hdGNoOiR7a2V5fWApXG4gICAgaWYgKCFzaG91bGRFbWl0KSByZXR1cm5cblxuICAgIHlpZWxkKiBEZWJ1Zy5yZWNvcmQoe1xuICAgICAgdHlwZTogJ2RpYWdub3N0aWMnLFxuICAgICAgbW9kdWxlSWQ6IHBhcmFtcy5tb2R1bGVJZCxcbiAgICAgIGluc3RhbmNlSWQ6IHBhcmFtcy5pbnN0YW5jZUlkLFxuICAgICAgY29kZTogJ3N0YXRlX3RyYWl0OjpkZXBzX21pc21hdGNoJyxcbiAgICAgIHNldmVyaXR5OiAnd2FybmluZycsXG4gICAgICBtZXNzYWdlOlxuICAgICAgICBgW2RlcHNdICR7cGFyYW1zLmtpbmR9IFwiJHtwYXJhbXMuZmllbGRQYXRofVwiIGRlY2xhcmVkPVske2Zvcm1hdExpc3QocGFyYW1zLmRpZmYuZGVjbGFyZWQpfV0gYCArXG4gICAgICAgIGByZWFkcz1bJHtmb3JtYXRMaXN0KHBhcmFtcy5kaWZmLnJlYWRzKX1dIG1pc3Npbmc9WyR7Zm9ybWF0TGlzdChwYXJhbXMuZGlmZi5taXNzaW5nKX1dIGAgK1xuICAgICAgICBgdW51c2VkPVske2Zvcm1hdExpc3QocGFyYW1zLmRpZmYudW51c2VkKX1dYCxcbiAgICAgIGhpbnQ6XG4gICAgICAgICdkZXBzIGlzIHRoZSBzaW5nbGUgc291cmNlIG9mIHRydXRoIGZvciBkZXBlbmRlbmNpZXM6IGluY3JlbWVudGFsIHNjaGVkdWxpbmcgLyByZXZlcnNlIGNsb3N1cmVzIC8gcGVyZm9ybWFuY2Ugb3B0aW1pemF0aW9ucyByZWx5IG9uIGRlcHMgb25seS4gJyArXG4gICAgICAgICdLZWVwIGRlcHMgY29uc2lzdGVudCB3aXRoIGFjdHVhbCByZWFkczsgaWYgeW91IHJlYWxseSBkZXBlbmQgb24gdGhlIHdob2xlIG9iamVjdCwgZGVjbGFyZSBhIGNvYXJzZXItZ3JhaW5lZCBkZXAgKGUuZy4gXCJwcm9maWxlXCIpIHRvIGNvdmVyIHN1Yi1maWVsZCByZWFkcy4nLFxuICAgICAga2luZDogYGRlcHNfbWlzbWF0Y2g6JHtwYXJhbXMua2luZH1gLFxuICAgIH0pXG4gIH0pXG5cbmNvbnN0IGdldE1pZGRsZXdhcmVTdGFjayA9ICgpOiBFZmZlY3QuRWZmZWN0PEVmZmVjdE9wLk1pZGRsZXdhcmVTdGFjaywgbmV2ZXIsIGFueT4gPT5cbiAgRWZmZWN0LnNlcnZpY2VPcHRpb24oRWZmZWN0T3BDb3JlLkVmZmVjdE9wTWlkZGxld2FyZVRhZykucGlwZShcbiAgICBFZmZlY3QubWFwKChtYXliZSkgPT4gKE9wdGlvbi5pc1NvbWUobWF5YmUpID8gbWF5YmUudmFsdWUuc3RhY2sgOiBbXSkpLFxuICApXG5cbmNvbnN0IHJlY29yZFRyYWl0UGF0Y2ggPSAoXG4gIGJvdW5kOiBCb3VuZEFwaTxhbnksIGFueT4sXG4gIHBhdGg6IHN0cmluZyxcbiAgcmVhc29uOiBQYXRjaFJlYXNvbixcbiAgZnJvbT86IHVua25vd24sXG4gIHRvPzogdW5rbm93bixcbiAgdHJhaXROb2RlSWQ/OiBzdHJpbmcsXG4gIHN0ZXBJZD86IHN0cmluZyxcbik6IHZvaWQgPT4ge1xuICB0cnkge1xuICAgIGNvbnN0IGludGVybmFscyA9IGdldEJvdW5kSW50ZXJuYWxzKGJvdW5kIGFzIGFueSlcbiAgICBpbnRlcm5hbHMudHhuLnJlY29yZFN0YXRlUGF0Y2gocGF0aCwgcmVhc29uLCBmcm9tLCB0bywgdHJhaXROb2RlSWQsIHN0ZXBJZClcbiAgfSBjYXRjaCB7XG4gICAgLy8gbm8tb3AgZm9yIGxlZ2FjeS9tb2NrZWQgYm91bmRcbiAgfVxufVxuXG5jb25zdCByZWNvcmRSZXBsYXlFdmVudCA9IChib3VuZDogQm91bmRBcGk8YW55LCBhbnk+LCBldmVudDogUmVwbGF5TG9nLlJlcGxheUxvZ0V2ZW50KTogdm9pZCA9PiB7XG4gIHRyeSB7XG4gICAgY29uc3QgaW50ZXJuYWxzID0gZ2V0Qm91bmRJbnRlcm5hbHMoYm91bmQgYXMgYW55KVxuICAgIGludGVybmFscy50eG4ucmVjb3JkUmVwbGF5RXZlbnQoZXZlbnQpXG4gIH0gY2F0Y2gge1xuICAgIC8vIG5vLW9wIGZvciBsZWdhY3kvbW9ja2VkIGJvdW5kXG4gIH1cbn1cblxuY29uc3QgZ2V0Qm91bmRTY29wZSA9IChib3VuZDogQm91bmRBcGk8YW55LCBhbnk+KTogeyByZWFkb25seSBtb2R1bGVJZD86IHN0cmluZzsgcmVhZG9ubHkgaW5zdGFuY2VJZD86IHN0cmluZyB9ID0+IHtcbiAgdHJ5IHtcbiAgICBjb25zdCBpbnRlcm5hbHMgPSBnZXRCb3VuZEludGVybmFscyhib3VuZCBhcyBhbnkpXG4gICAgcmV0dXJuIHsgbW9kdWxlSWQ6IGludGVybmFscy5tb2R1bGVJZCwgaW5zdGFuY2VJZDogaW50ZXJuYWxzLmluc3RhbmNlSWQgfVxuICB9IGNhdGNoIHtcbiAgICByZXR1cm4geyBtb2R1bGVJZDogdW5kZWZpbmVkLCBpbnN0YW5jZUlkOiB1bmRlZmluZWQgfVxuICB9XG59XG5cbmNvbnN0IHNldFNuYXBzaG90SW5UeG4gPSAoXG4gIGJvdW5kOiBCb3VuZEFwaTxhbnksIGFueT4sXG4gIGZpZWxkUGF0aDogc3RyaW5nLFxuICBuZXh0OiB1bmtub3duLFxuICByZWFzb246IFBhdGNoUmVhc29uLFxuICBzdGVwSWQ6IHN0cmluZyxcbiAgdHJhaXROb2RlSWQ/OiBzdHJpbmcsXG4pOiBFZmZlY3QuRWZmZWN0PGJvb2xlYW4sIG5ldmVyLCBhbnk+ID0+XG4gIEVmZmVjdC5nZW4oZnVuY3Rpb24qICgpIHtcbiAgICBsZXQgd3JvdGUgPSBmYWxzZVxuICAgIHlpZWxkKiBib3VuZC5zdGF0ZS5tdXRhdGUoKGRyYWZ0OiBhbnkpID0+IHtcbiAgICAgIGNvbnN0IHByZXYgPSBSb3dJZC5nZXRBdFBhdGgoZHJhZnQsIGZpZWxkUGF0aClcbiAgICAgIGlmIChPYmplY3QuaXMocHJldiwgbmV4dCkpIHJldHVyblxuICAgICAgd3JvdGUgPSB0cnVlXG4gICAgICBSb3dJZC5zZXRBdFBhdGhNdXRhdGluZyhkcmFmdCwgZmllbGRQYXRoLCBuZXh0KVxuICAgICAgcmVjb3JkVHJhaXRQYXRjaChib3VuZCwgZmllbGRQYXRoLCByZWFzb24sIHByZXYsIG5leHQsIHRyYWl0Tm9kZUlkLCBzdGVwSWQpXG4gICAgfSkgYXMgRWZmZWN0LkVmZmVjdDx2b2lkLCBuZXZlciwgYW55PlxuICAgIHJldHVybiB3cm90ZVxuICB9KVxuXG5jb25zdCB3cml0ZWJhY2tJZkN1cnJlbnRLZXlIYXNoID0gKFxuICBib3VuZDogQm91bmRBcGk8YW55LCBhbnk+LFxuICBmaWVsZFBhdGg6IHN0cmluZyxcbiAga2V5SGFzaDogc3RyaW5nLFxuICBuZXh0OiB1bmtub3duLFxuICByZWFzb246IFBhdGNoUmVhc29uLFxuICBzdGVwSWQ6IHN0cmluZyxcbiAgdHJhaXROb2RlSWQ/OiBzdHJpbmcsXG4gIHJlcGxheUV2ZW50PzogUmVwbGF5TG9nLlJlcGxheUxvZ0V2ZW50LFxuKTogRWZmZWN0LkVmZmVjdDxib29sZWFuLCBuZXZlciwgYW55PiA9PlxuICBFZmZlY3QuZ2VuKGZ1bmN0aW9uKiAoKSB7XG4gICAgbGV0IHdyb3RlID0gZmFsc2VcbiAgICB5aWVsZCogYm91bmQuc3RhdGUubXV0YXRlKChkcmFmdDogYW55KSA9PiB7XG4gICAgICBjb25zdCBjdXJyZW50ID0gUm93SWQuZ2V0QXRQYXRoKGRyYWZ0LCBmaWVsZFBhdGgpXG4gICAgICBjb25zdCBjdXJyZW50S2V5SGFzaCA9IGN1cnJlbnQgJiYgdHlwZW9mIGN1cnJlbnQgPT09ICdvYmplY3QnID8gKGN1cnJlbnQgYXMgYW55KS5rZXlIYXNoIDogdW5kZWZpbmVkXG4gICAgICBpZiAoY3VycmVudEtleUhhc2ggIT09IGtleUhhc2gpIHJldHVyblxuXG4gICAgICBjb25zdCBwcmV2ID0gY3VycmVudFxuICAgICAgaWYgKE9iamVjdC5pcyhwcmV2LCBuZXh0KSkgcmV0dXJuXG5cbiAgICAgIHdyb3RlID0gdHJ1ZVxuICAgICAgUm93SWQuc2V0QXRQYXRoTXV0YXRpbmcoZHJhZnQsIGZpZWxkUGF0aCwgbmV4dClcbiAgICAgIGlmIChyZXBsYXlFdmVudCkge1xuICAgICAgICByZWNvcmRSZXBsYXlFdmVudChib3VuZCwgcmVwbGF5RXZlbnQpXG4gICAgICB9XG4gICAgICByZWNvcmRUcmFpdFBhdGNoKGJvdW5kLCBmaWVsZFBhdGgsIHJlYXNvbiwgcHJldiwgbmV4dCwgdHJhaXROb2RlSWQsIHN0ZXBJZClcbiAgICB9KSBhcyBFZmZlY3QuRWZmZWN0PHZvaWQsIG5ldmVyLCBhbnk+XG4gICAgcmV0dXJuIHdyb3RlXG4gIH0pXG5cbi8qKlxuICogc3luY0lkbGVJblRyYW5zYWN0aW9uXHVGRjFBXG4gKiAtIFx1NTcyOFx1NEU4Qlx1NTJBMVx1N0E5N1x1NTNFM1x1NTE4NVx1NTQwQ1x1NkI2NVx1OEJDNFx1NEYzMFx1NjI0MFx1NjcwOSBzb3VyY2Uua2V5KHN0YXRlKVx1RkYxQlxuICogLSBcdTgyRTUga2V5IFx1NTNEOFx1NEUzQVx1N0E3QVx1RkYwOHVuZGVmaW5lZFx1RkYwOVx1RkYwQ1x1NTIxOVx1NTQwQ1x1NkI2NVx1NUMwNlx1NUJGOVx1NUU5NFx1NUI1N1x1NkJCNVx1OTFDRFx1N0Y2RVx1NEUzQSBpZGxlIHNuYXBzaG90XHVGRjA4XHU5MDdGXHU1MTREIHRlYXJpbmdcdUZGMDlcdTMwMDJcbiAqL1xuZXhwb3J0IGNvbnN0IHN5bmNJZGxlSW5UcmFuc2FjdGlvbiA9IDxTIGV4dGVuZHMgb2JqZWN0PihcbiAgcHJvZ3JhbTogU3RhdGVUcmFpdFByb2dyYW08Uz4sXG4gIGN0eDogU291cmNlU3luY0NvbnRleHQ8Uz4sXG4pOiBFZmZlY3QuRWZmZWN0PHZvaWQ+ID0+XG4gIEVmZmVjdC5zeW5jKCgpID0+IHtcbiAgICBjb25zdCBkcmFmdCA9IGN0eC5nZXREcmFmdCgpIGFzIGFueVxuICAgIGNvbnN0IHVwZGF0ZXM6IEFycmF5PHsgcmVhZG9ubHkgZmllbGRQYXRoOiBzdHJpbmc7IHJlYWRvbmx5IHByZXY6IHVua25vd24gfT4gPSBbXVxuXG4gICAgZm9yIChjb25zdCBlbnRyeSBvZiBwcm9ncmFtLmVudHJpZXMpIHtcbiAgICAgIGlmIChlbnRyeS5raW5kICE9PSAnc291cmNlJykgY29udGludWVcbiAgICAgIGNvbnN0IGZpZWxkUGF0aCA9IGVudHJ5LmZpZWxkUGF0aFxuICAgICAgY29uc3QgbGlzdEl0ZW0gPSBSb3dJZC5wYXJzZUxpc3RJdGVtRmllbGRQYXRoKGZpZWxkUGF0aClcblxuICAgICAgaWYgKGxpc3RJdGVtKSB7XG4gICAgICAgIC8vIGxpc3QuaXRlbSBzY29wZVx1RkYxQVx1NjMwOSBpbmRleCBcdTkwMTBcdTg4NENcdThCQzRcdTRGMzAga2V5XHVGRjBDXHU1RTc2XHU1QkY5XHU2NzJBXHU2RkMwXHU2RDNCXHU4ODRDXHU1NDBDXHU2QjY1XHU1MTk5XHU1NkRFIGlkbGVcdTMwMDJcbiAgICAgICAgY29uc3QgbGlzdFZhbHVlID0gUm93SWQuZ2V0QXRQYXRoKGRyYWZ0LCBsaXN0SXRlbS5saXN0UGF0aClcbiAgICAgICAgY29uc3QgaXRlbXM6IFJlYWRvbmx5QXJyYXk8dW5rbm93bj4gPSBBcnJheS5pc0FycmF5KGxpc3RWYWx1ZSkgPyBsaXN0VmFsdWUgOiBbXVxuXG4gICAgICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBpdGVtcy5sZW5ndGg7IGluZGV4KyspIHtcbiAgICAgICAgICBjb25zdCBpdGVtID0gaXRlbXNbaW5kZXhdXG5cbiAgICAgICAgICBsZXQga2V5OiB1bmtub3duXG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGtleSA9IChlbnRyeS5tZXRhIGFzIGFueSkua2V5KGl0ZW0pXG4gICAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICBjb250aW51ZVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChrZXkgIT09IHVuZGVmaW5lZCkgY29udGludWVcblxuICAgICAgICAgIGNvbnN0IGNvbmNyZXRlUGF0aCA9IFJvd0lkLnRvTGlzdEl0ZW1WYWx1ZVBhdGgobGlzdEl0ZW0ubGlzdFBhdGgsIGluZGV4LCBsaXN0SXRlbS5pdGVtUGF0aClcbiAgICAgICAgICBjb25zdCBwcmV2ID0gUm93SWQuZ2V0QXRQYXRoKGRyYWZ0LCBjb25jcmV0ZVBhdGgpXG4gICAgICAgICAgY29uc3QgcHJldlN0YXR1cyA9IHByZXYgJiYgdHlwZW9mIHByZXYgPT09ICdvYmplY3QnID8gKHByZXYgYXMgYW55KS5zdGF0dXMgOiB1bmRlZmluZWRcbiAgICAgICAgICBpZiAocHJldlN0YXR1cyA9PT0gJ2lkbGUnKSB7XG4gICAgICAgICAgICBjb25zdCBkYXRhID0gKHByZXYgYXMgYW55KT8uZGF0YVxuICAgICAgICAgICAgY29uc3QgZXJyb3IgPSAocHJldiBhcyBhbnkpPy5lcnJvclxuICAgICAgICAgICAgaWYgKGRhdGEgPT09IHVuZGVmaW5lZCAmJiBlcnJvciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdXBkYXRlcy5wdXNoKHsgZmllbGRQYXRoOiBjb25jcmV0ZVBhdGgsIHByZXYgfSlcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIGxldCBrZXk6IHVua25vd25cbiAgICAgIHRyeSB7XG4gICAgICAgIGtleSA9IChlbnRyeS5tZXRhIGFzIGFueSkua2V5KGRyYWZ0KVxuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIGlmIChrZXkgIT09IHVuZGVmaW5lZCkgY29udGludWVcblxuICAgICAgY29uc3QgcHJldiA9IFJvd0lkLmdldEF0UGF0aChkcmFmdCwgZmllbGRQYXRoKVxuICAgICAgY29uc3QgcHJldlN0YXR1cyA9IHByZXYgJiYgdHlwZW9mIHByZXYgPT09ICdvYmplY3QnID8gKHByZXYgYXMgYW55KS5zdGF0dXMgOiB1bmRlZmluZWRcbiAgICAgIGlmIChwcmV2U3RhdHVzID09PSAnaWRsZScpIHtcbiAgICAgICAgLy8gXHU0RUNEXHU5NzAwXHU3ODZFXHU0RkREIGRhdGEvZXJyb3IgXHU4OEFCXHU2RTA1XHU3QTdBXG4gICAgICAgIGNvbnN0IGRhdGEgPSAocHJldiBhcyBhbnkpPy5kYXRhXG4gICAgICAgIGNvbnN0IGVycm9yID0gKHByZXYgYXMgYW55KT8uZXJyb3JcbiAgICAgICAgaWYgKGRhdGEgPT09IHVuZGVmaW5lZCAmJiBlcnJvciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgY29udGludWVcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICB1cGRhdGVzLnB1c2goeyBmaWVsZFBhdGgsIHByZXYgfSlcbiAgICB9XG5cbiAgICBpZiAodXBkYXRlcy5sZW5ndGggPT09IDApIHJldHVyblxuXG4gICAgY29uc3QgcmVhc29uOiBQYXRjaFJlYXNvbiA9ICdzb3VyY2U6aWRsZSdcblxuICAgIGNvbnN0IG5leHREcmFmdCA9IGNyZWF0ZShkcmFmdCwgKG5leHQ6IGFueSkgPT4ge1xuICAgICAgZm9yIChjb25zdCB1IG9mIHVwZGF0ZXMpIHtcbiAgICAgICAgUm93SWQuc2V0QXRQYXRoTXV0YXRpbmcobmV4dCwgdS5maWVsZFBhdGgsIFNuYXBzaG90LmlkbGUoKSlcbiAgICAgIH1cbiAgICB9KVxuXG4gICAgY3R4LnNldERyYWZ0KG5leHREcmFmdCBhcyBTKVxuXG4gICAgZm9yIChjb25zdCB1IG9mIHVwZGF0ZXMpIHtcbiAgICAgIGN0eC5yZWNvcmRQYXRjaCh1LmZpZWxkUGF0aCwgcmVhc29uLCB1LnByZXYsIFNuYXBzaG90LmlkbGUoKSwgdW5kZWZpbmVkLCBgc291cmNlOiR7dS5maWVsZFBhdGh9OmlkbGVgKVxuICAgIH1cbiAgfSlcblxuLyoqXG4gKiBpbnN0YWxsU291cmNlUmVmcmVzaFx1RkYxQVxuICogLSBcdTRFM0FcdTUzNTVcdTRFMkEgc291cmNlIFx1NUI1N1x1NkJCNVx1NkNFOFx1NTE4Q1x1NTIzN1x1NjVCMFx1NUI5RVx1NzNCMFx1RkYwOFJlc291cmNlU25hcHNob3QgKyBrZXlIYXNoIGdhdGUgKyBjb25jdXJyZW5jeVx1RkYwOVx1MzAwMlxuICovXG5leHBvcnQgY29uc3QgaW5zdGFsbFNvdXJjZVJlZnJlc2ggPSA8Uz4oXG4gIGJvdW5kOiBCb3VuZEFwaTxhbnksIGFueT4sXG4gIHN0ZXA6IFN0YXRlVHJhaXRQbGFuU3RlcCxcbiAgZW50cnk6IEV4dHJhY3Q8U3RhdGVUcmFpdEVudHJ5PFMsIHN0cmluZz4sIHsgcmVhZG9ubHkga2luZDogJ3NvdXJjZScgfT4sXG4pOiBFZmZlY3QuRWZmZWN0PHZvaWQsIG5ldmVyLCBhbnk+ID0+IHtcbiAgaWYgKCFzdGVwLnRhcmdldEZpZWxkUGF0aCkgcmV0dXJuIEVmZmVjdC52b2lkXG5cbiAgY29uc3QgZmllbGRQYXRoID0gc3RlcC50YXJnZXRGaWVsZFBhdGhcbiAgY29uc3QgcmVzb3VyY2VJZCA9IHN0ZXAucmVzb3VyY2VJZCA/PyBlbnRyeS5tZXRhLnJlc291cmNlXG4gIGNvbnN0IGxpc3RJdGVtID0gUm93SWQucGFyc2VMaXN0SXRlbUZpZWxkUGF0aChmaWVsZFBhdGgpXG5cbiAgbGV0IGludGVybmFsczogUmV0dXJuVHlwZTx0eXBlb2YgZ2V0Qm91bmRJbnRlcm5hbHM+IHwgdW5kZWZpbmVkXG4gIHRyeSB7XG4gICAgaW50ZXJuYWxzID0gZ2V0Qm91bmRJbnRlcm5hbHMoYm91bmQgYXMgYW55KVxuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gRWZmZWN0LnZvaWRcbiAgfVxuXG4gIGNvbnN0IHJlZ2lzdGVyID0gaW50ZXJuYWxzLnRyYWl0cy5yZWdpc3RlclNvdXJjZVJlZnJlc2hcblxuICBjb25zdCByZWNvcmRTbmFwc2hvdCA9IChcbiAgICByZXBsYXlNb2RlOiAnbGl2ZScgfCAncmVwbGF5JyxcbiAgICByZXBsYXlMb2c6IFJlcGxheUxvZy5SZXBsYXlMb2dTZXJ2aWNlIHwgdW5kZWZpbmVkLFxuICAgIGlucHV0OlxuICAgICAgfCBSZXBsYXlMb2cuUmVwbGF5TG9nRXZlbnRcbiAgICAgIHwge1xuICAgICAgICAgIHJlYWRvbmx5IG1vZHVsZUlkPzogc3RyaW5nXG4gICAgICAgICAgcmVhZG9ubHkgaW5zdGFuY2VJZD86IHN0cmluZ1xuICAgICAgICAgIHJlYWRvbmx5IGZpZWxkUGF0aDogc3RyaW5nXG4gICAgICAgICAgcmVhZG9ubHkga2V5SGFzaD86IHN0cmluZ1xuICAgICAgICAgIHJlYWRvbmx5IGNvbmN1cnJlbmN5Pzogc3RyaW5nXG4gICAgICAgICAgcmVhZG9ubHkgcGhhc2U6IFJlcGxheUxvZy5SZXNvdXJjZVNuYXBzaG90UGhhc2VcbiAgICAgICAgICByZWFkb25seSBzbmFwc2hvdDogdW5rbm93blxuICAgICAgICB9LFxuICApOiBFZmZlY3QuRWZmZWN0PHZvaWQsIG5ldmVyLCBhbnk+ID0+IHtcbiAgICBpZiAoIXJlcGxheUxvZykgcmV0dXJuIEVmZmVjdC52b2lkXG4gICAgaWYgKHJlcGxheU1vZGUgIT09ICdsaXZlJykgcmV0dXJuIEVmZmVjdC52b2lkXG4gICAgY29uc3QgZXZlbnQ6IFJlcGxheUxvZy5SZXBsYXlMb2dFdmVudCA9XG4gICAgICBpbnB1dCAmJiB0eXBlb2YgaW5wdXQgPT09ICdvYmplY3QnICYmIChpbnB1dCBhcyBhbnkpLl90YWcgPT09ICdSZXNvdXJjZVNuYXBzaG90J1xuICAgICAgICA/IChpbnB1dCBhcyBSZXBsYXlMb2cuUmVwbGF5TG9nRXZlbnQpXG4gICAgICAgIDoge1xuICAgICAgICAgICAgX3RhZzogJ1Jlc291cmNlU25hcHNob3QnLFxuICAgICAgICAgICAgcmVzb3VyY2VJZCxcbiAgICAgICAgICAgIGZpZWxkUGF0aDogKGlucHV0IGFzIGFueSkuZmllbGRQYXRoLFxuICAgICAgICAgICAga2V5SGFzaDogKGlucHV0IGFzIGFueSkua2V5SGFzaCxcbiAgICAgICAgICAgIGNvbmN1cnJlbmN5OiAoaW5wdXQgYXMgYW55KS5jb25jdXJyZW5jeSxcbiAgICAgICAgICAgIHBoYXNlOiAoaW5wdXQgYXMgYW55KS5waGFzZSxcbiAgICAgICAgICAgIHNuYXBzaG90OiAoaW5wdXQgYXMgYW55KS5zbmFwc2hvdCxcbiAgICAgICAgICAgIHRpbWVzdGFtcDogRGF0ZS5ub3coKSxcbiAgICAgICAgICAgIG1vZHVsZUlkOiAoaW5wdXQgYXMgYW55KS5tb2R1bGVJZCxcbiAgICAgICAgICAgIGluc3RhbmNlSWQ6IChpbnB1dCBhcyBhbnkpLmluc3RhbmNlSWQsXG4gICAgICAgICAgfVxuICAgIHJldHVybiByZXBsYXlMb2cucmVjb3JkKGV2ZW50KVxuICB9XG5cbiAgLy8gbGlzdC5pdGVtIHNjb3BlXHVGRjFBXHU2MzA5IFJvd0lEIFx1NTA1QSBpbi1mbGlnaHQgXHU5NUU4XHU2M0E3XHVGRjA4XHU5MDdGXHU1MTREIGluc2VydC9yZW1vdmUvcmVvcmRlciBcdTRFMEJcdTUxOTlcdTk1MTlcdTg4NENcdUZGMDlcdTMwMDJcbiAgaWYgKGxpc3RJdGVtKSB7XG4gICAgY29uc3Qgc3RvcmUgPSBpbnRlcm5hbHMudHJhaXRzLnJvd0lkU3RvcmUgYXMgUm93SWQuUm93SWRTdG9yZSB8IHVuZGVmaW5lZFxuICAgIGlmICghc3RvcmUpIHtcbiAgICAgIHJldHVybiBFZmZlY3Qudm9pZFxuICAgIH1cblxuICAgIGNvbnN0IGxpc3RQYXRoID0gbGlzdEl0ZW0ubGlzdFBhdGhcbiAgICBjb25zdCBpdGVtUGF0aCA9IGxpc3RJdGVtLml0ZW1QYXRoXG4gICAgaWYgKCFpdGVtUGF0aCkge1xuICAgICAgLy8gXHU3OTgxXHU2QjYyXHU2MjhBIHNuYXBzaG90IFx1NTE5OVx1NTZERVx1NTIzMFx1NjU3NFx1NEUyQSBpdGVtXHVGRjA4XHU0RjFBXHU4OTg2XHU3NkQ2XHU0RTFBXHU1MkExIHZhbHVlc1x1RkYwOVx1MzAwMlxuICAgICAgcmV0dXJuIEVmZmVjdC52b2lkXG4gICAgfVxuXG4gICAgY29uc3QgY29uY3VycmVuY3kgPSAoZW50cnkubWV0YSBhcyBhbnkpLmNvbmN1cnJlbmN5IGFzICdzd2l0Y2gnIHwgJ2V4aGF1c3QtdHJhaWxpbmcnIHwgdW5kZWZpbmVkXG4gICAgY29uc3QgbW9kZSA9IGNvbmN1cnJlbmN5ID8/ICdzd2l0Y2gnXG5cbiAgICBjb25zdCBpbkZsaWdodCA9IG5ldyBNYXA8XG4gICAgICBSb3dJZC5Sb3dJZCxcbiAgICAgIHtcbiAgICAgICAgcmVhZG9ubHkgZ2VuOiBudW1iZXJcbiAgICAgICAgcmVhZG9ubHkgZmliZXI6IEZpYmVyLlJ1bnRpbWVGaWJlcjx2b2lkLCBuZXZlcj5cbiAgICAgICAgcmVhZG9ubHkga2V5SGFzaDogc3RyaW5nXG4gICAgICB9XG4gICAgPigpXG4gICAgY29uc3QgdHJhaWxpbmcgPSBuZXcgTWFwPFJvd0lkLlJvd0lkLCB7IHJlYWRvbmx5IGtleTogdW5rbm93bjsgcmVhZG9ubHkga2V5SGFzaDogc3RyaW5nIH0+KClcbiAgICBsZXQgZ2VuID0gMFxuXG4gICAgLy8gcm93IFx1ODhBQlx1NzlGQlx1OTY2NFx1RkYxQVx1NkUwNVx1NzQwNiB0cmFpbGluZy9pbkZsaWdodCBcdTVGMTVcdTc1MjhcdUZGMENcdTkwN0ZcdTUxNERcdTU0MEVcdTdFRURcdTk1MTlcdThCRUZcdTVGNTJcdTVDNUVcdTYyMTZcdTUxODVcdTVCNThcdTZDQzRcdTZGMEZcdTMwMDJcbiAgICBzdG9yZS5vblJlbW92ZWQobGlzdFBhdGgsIChyb3dJZCkgPT4ge1xuICAgICAgdHJhaWxpbmcuZGVsZXRlKHJvd0lkKVxuICAgICAgaW5GbGlnaHQuZGVsZXRlKHJvd0lkKVxuICAgIH0pXG5cbiAgICBjb25zdCBzZXRTbmFwc2hvdEZvclJvd0luVHhuID0gKFxuICAgICAgcm93SWQ6IFJvd0lkLlJvd0lkLFxuICAgICAgbmV4dDogdW5rbm93bixcbiAgICAgIHJlYXNvbjogUGF0Y2hSZWFzb24sXG4gICAgICBzdGVwSWQ6IHN0cmluZyxcbiAgICApOiBFZmZlY3QuRWZmZWN0PHN0cmluZyB8IHVuZGVmaW5lZCwgbmV2ZXIsIGFueT4gPT5cbiAgICAgIEVmZmVjdC5nZW4oZnVuY3Rpb24qICgpIHtcbiAgICAgICAgbGV0IHdyb3RlUGF0aDogc3RyaW5nIHwgdW5kZWZpbmVkXG4gICAgICAgIHlpZWxkKiBib3VuZC5zdGF0ZS5tdXRhdGUoKGRyYWZ0OiBhbnkpID0+IHtcbiAgICAgICAgICBjb25zdCBpbmRleCA9IHN0b3JlLmdldEluZGV4KGxpc3RQYXRoLCByb3dJZClcbiAgICAgICAgICBpZiAoaW5kZXggPT09IHVuZGVmaW5lZCkgcmV0dXJuXG4gICAgICAgICAgY29uc3QgY29uY3JldGVQYXRoID0gUm93SWQudG9MaXN0SXRlbVZhbHVlUGF0aChsaXN0UGF0aCwgaW5kZXgsIGl0ZW1QYXRoKVxuICAgICAgICAgIGNvbnN0IHByZXYgPSBSb3dJZC5nZXRBdFBhdGgoZHJhZnQsIGNvbmNyZXRlUGF0aClcbiAgICAgICAgICBpZiAoT2JqZWN0LmlzKHByZXYsIG5leHQpKSByZXR1cm5cbiAgICAgICAgICB3cm90ZVBhdGggPSBjb25jcmV0ZVBhdGhcbiAgICAgICAgICBSb3dJZC5zZXRBdFBhdGhNdXRhdGluZyhkcmFmdCwgY29uY3JldGVQYXRoLCBuZXh0KVxuICAgICAgICAgIHJlY29yZFRyYWl0UGF0Y2goYm91bmQsIGNvbmNyZXRlUGF0aCwgcmVhc29uLCBwcmV2LCBuZXh0LCBzdGVwLmRlYnVnSW5mbz8uZ3JhcGhOb2RlSWQsIHN0ZXBJZClcbiAgICAgICAgfSkgYXMgRWZmZWN0LkVmZmVjdDx2b2lkLCBuZXZlciwgYW55PlxuICAgICAgICByZXR1cm4gd3JvdGVQYXRoXG4gICAgICB9KVxuXG4gICAgY29uc3Qgd3JpdGViYWNrSWZDdXJyZW50S2V5SGFzaEZvclJvdyA9IChcbiAgICAgIHJvd0lkOiBSb3dJZC5Sb3dJZCxcbiAgICAgIGtleUhhc2g6IHN0cmluZyxcbiAgICAgIG5leHQ6IHVua25vd24sXG4gICAgICByZWFzb246IFBhdGNoUmVhc29uLFxuICAgICAgc3RlcElkOiBzdHJpbmcsXG4gICAgICBwaGFzZT86IFJlcGxheUxvZy5SZXNvdXJjZVNuYXBzaG90UGhhc2UsXG4gICAgKTogRWZmZWN0LkVmZmVjdDxzdHJpbmcgfCB1bmRlZmluZWQsIG5ldmVyLCBhbnk+ID0+XG4gICAgICBFZmZlY3QuZ2VuKGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIGxldCB3cm90ZVBhdGg6IHN0cmluZyB8IHVuZGVmaW5lZFxuICAgICAgICB5aWVsZCogYm91bmQuc3RhdGUubXV0YXRlKChkcmFmdDogYW55KSA9PiB7XG4gICAgICAgICAgY29uc3QgaW5kZXggPSBzdG9yZS5nZXRJbmRleChsaXN0UGF0aCwgcm93SWQpXG4gICAgICAgICAgaWYgKGluZGV4ID09PSB1bmRlZmluZWQpIHJldHVyblxuICAgICAgICAgIGNvbnN0IGNvbmNyZXRlUGF0aCA9IFJvd0lkLnRvTGlzdEl0ZW1WYWx1ZVBhdGgobGlzdFBhdGgsIGluZGV4LCBpdGVtUGF0aClcblxuICAgICAgICAgIGNvbnN0IGN1cnJlbnQgPSBSb3dJZC5nZXRBdFBhdGgoZHJhZnQsIGNvbmNyZXRlUGF0aClcbiAgICAgICAgICBjb25zdCBjdXJyZW50S2V5SGFzaCA9IGN1cnJlbnQgJiYgdHlwZW9mIGN1cnJlbnQgPT09ICdvYmplY3QnID8gKGN1cnJlbnQgYXMgYW55KS5rZXlIYXNoIDogdW5kZWZpbmVkXG4gICAgICAgICAgaWYgKGN1cnJlbnRLZXlIYXNoICE9PSBrZXlIYXNoKSByZXR1cm5cblxuICAgICAgICAgIGNvbnN0IHByZXYgPSBjdXJyZW50XG4gICAgICAgICAgaWYgKE9iamVjdC5pcyhwcmV2LCBuZXh0KSkgcmV0dXJuXG5cbiAgICAgICAgICB3cm90ZVBhdGggPSBjb25jcmV0ZVBhdGhcbiAgICAgICAgICBSb3dJZC5zZXRBdFBhdGhNdXRhdGluZyhkcmFmdCwgY29uY3JldGVQYXRoLCBuZXh0KVxuICAgICAgICAgIGlmIChwaGFzZSkge1xuICAgICAgICAgICAgY29uc3QgeyBtb2R1bGVJZCwgaW5zdGFuY2VJZCB9ID0gZ2V0Qm91bmRTY29wZShib3VuZClcbiAgICAgICAgICAgIHJlY29yZFJlcGxheUV2ZW50KGJvdW5kLCB7XG4gICAgICAgICAgICAgIF90YWc6ICdSZXNvdXJjZVNuYXBzaG90JyxcbiAgICAgICAgICAgICAgcmVzb3VyY2VJZCxcbiAgICAgICAgICAgICAgZmllbGRQYXRoOiBjb25jcmV0ZVBhdGgsXG4gICAgICAgICAgICAgIGtleUhhc2gsXG4gICAgICAgICAgICAgIGNvbmN1cnJlbmN5OiBtb2RlLFxuICAgICAgICAgICAgICBwaGFzZSxcbiAgICAgICAgICAgICAgc25hcHNob3Q6IG5leHQsXG4gICAgICAgICAgICAgIHRpbWVzdGFtcDogRGF0ZS5ub3coKSxcbiAgICAgICAgICAgICAgbW9kdWxlSWQsXG4gICAgICAgICAgICAgIGluc3RhbmNlSWQsXG4gICAgICAgICAgICB9KVxuICAgICAgICAgIH1cbiAgICAgICAgICByZWNvcmRUcmFpdFBhdGNoKGJvdW5kLCBjb25jcmV0ZVBhdGgsIHJlYXNvbiwgcHJldiwgbmV4dCwgc3RlcC5kZWJ1Z0luZm8/LmdyYXBoTm9kZUlkLCBzdGVwSWQpXG4gICAgICAgIH0pIGFzIEVmZmVjdC5FZmZlY3Q8dm9pZCwgbmV2ZXIsIGFueT5cbiAgICAgICAgcmV0dXJuIHdyb3RlUGF0aFxuICAgICAgfSlcblxuICAgIGNvbnN0IHN0YXJ0RmV0Y2ggPSAoXG4gICAgICByb3dJZDogUm93SWQuUm93SWQsXG4gICAgICBrZXk6IHVua25vd24sXG4gICAgICBrZXlIYXNoOiBzdHJpbmcsXG4gICAgICByZXBsYXlNb2RlOiAnbGl2ZScgfCAncmVwbGF5JyxcbiAgICAgIHJlcGxheUxvZzogUmVwbGF5TG9nLlJlcGxheUxvZ1NlcnZpY2UgfCB1bmRlZmluZWQsXG4gICAgKTogRWZmZWN0LkVmZmVjdDx2b2lkLCBuZXZlciwgYW55PiA9PlxuICAgICAgRWZmZWN0LmdlbihmdW5jdGlvbiogKCkge1xuICAgICAgICBjb25zdCB7IG1vZHVsZUlkLCBpbnN0YW5jZUlkIH0gPSBnZXRCb3VuZFNjb3BlKGJvdW5kKVxuXG4gICAgICAgIGNvbnN0IGluZGV4Rm9yTG9nID0gc3RvcmUuZ2V0SW5kZXgobGlzdFBhdGgsIHJvd0lkKVxuICAgICAgICBjb25zdCBsb2dGaWVsZFBhdGggPVxuICAgICAgICAgIGluZGV4Rm9yTG9nID09PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiBSb3dJZC50b0xpc3RJdGVtVmFsdWVQYXRoKGxpc3RQYXRoLCBpbmRleEZvckxvZywgaXRlbVBhdGgpXG5cbiAgICAgICAgbGV0IGxvYWRpbmdTbmFwc2hvdDogdW5rbm93biA9IFNuYXBzaG90LmxvYWRpbmcoeyBrZXlIYXNoIH0pXG4gICAgICAgIGlmIChyZXBsYXlNb2RlID09PSAncmVwbGF5JyAmJiByZXBsYXlMb2cgJiYgbG9nRmllbGRQYXRoKSB7XG4gICAgICAgICAgY29uc3QgcmVwbGF5TG9hZGluZyA9IHlpZWxkKiByZXBsYXlMb2cuY29uc3VtZU5leHRSZXNvdXJjZVNuYXBzaG90KHtcbiAgICAgICAgICAgIHJlc291cmNlSWQsXG4gICAgICAgICAgICBmaWVsZFBhdGg6IGxvZ0ZpZWxkUGF0aCxcbiAgICAgICAgICAgIGtleUhhc2gsXG4gICAgICAgICAgICBwaGFzZTogJ2xvYWRpbmcnLFxuICAgICAgICAgIH0pXG4gICAgICAgICAgaWYgKHJlcGxheUxvYWRpbmcpIHtcbiAgICAgICAgICAgIGxvYWRpbmdTbmFwc2hvdCA9IHJlcGxheUxvYWRpbmcuc25hcHNob3RcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgd3JvdGVMb2FkaW5nUGF0aCA9IHlpZWxkKiBzZXRTbmFwc2hvdEZvclJvd0luVHhuKFxuICAgICAgICAgIHJvd0lkLFxuICAgICAgICAgIGxvYWRpbmdTbmFwc2hvdCxcbiAgICAgICAgICAnc291cmNlOmxvYWRpbmcnLFxuICAgICAgICAgIGBzb3VyY2U6JHtmaWVsZFBhdGh9OiR7cm93SWR9OmxvYWRpbmdgLFxuICAgICAgICApXG4gICAgICAgIGlmICh3cm90ZUxvYWRpbmdQYXRoKSB7XG4gICAgICAgICAgY29uc3QgZXZlbnQ6IFJlcGxheUxvZy5SZXBsYXlMb2dFdmVudCA9IHtcbiAgICAgICAgICAgIF90YWc6ICdSZXNvdXJjZVNuYXBzaG90JyxcbiAgICAgICAgICAgIHJlc291cmNlSWQsXG4gICAgICAgICAgICBmaWVsZFBhdGg6IHdyb3RlTG9hZGluZ1BhdGgsXG4gICAgICAgICAgICBrZXlIYXNoLFxuICAgICAgICAgICAgY29uY3VycmVuY3k6IG1vZGUsXG4gICAgICAgICAgICBwaGFzZTogJ2xvYWRpbmcnLFxuICAgICAgICAgICAgc25hcHNob3Q6IGxvYWRpbmdTbmFwc2hvdCxcbiAgICAgICAgICAgIHRpbWVzdGFtcDogRGF0ZS5ub3coKSxcbiAgICAgICAgICAgIG1vZHVsZUlkLFxuICAgICAgICAgICAgaW5zdGFuY2VJZCxcbiAgICAgICAgICB9XG4gICAgICAgICAgcmVjb3JkUmVwbGF5RXZlbnQoYm91bmQsIGV2ZW50KVxuICAgICAgICAgIHlpZWxkKiByZWNvcmRTbmFwc2hvdChyZXBsYXlNb2RlLCByZXBsYXlMb2csIGV2ZW50KVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgaW8gPSBFZmZlY3QuZ2VuKGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgaWYgKHJlcGxheU1vZGUgPT09ICdyZXBsYXknICYmIHJlcGxheUxvZykge1xuICAgICAgICAgICAgLy8gXHU4QkE5IGxvYWRpbmcgXHU2M0QwXHU0RUE0XHU1MTQ4XHU1M0VGXHU4OUMxXHVGRjBDXHU1MThEXHU5MUNEXHU4RDVCXHU3RUM4XHU2MDAxXHVGRjA4XHU0RkREXHU2MzAxXHUyMDFDXHU1RjAyXHU2QjY1XHU4RDQ0XHU2RTkwXHUyMDFEXHU3Njg0XHU2NUY2XHU5NUY0XHU3RUJGXHU3RUQzXHU2Nzg0XHVGRjA5XHUzMDAyXG4gICAgICAgICAgICB5aWVsZCogRWZmZWN0LnlpZWxkTm93KClcbiAgICAgICAgICAgIGNvbnN0IGNvbnN1bWVQYXRoID0gd3JvdGVMb2FkaW5nUGF0aCA/PyBsb2dGaWVsZFBhdGhcbiAgICAgICAgICAgIGlmICghY29uc3VtZVBhdGgpIHJldHVybiB5aWVsZCogRWZmZWN0LnZvaWRcblxuICAgICAgICAgICAgY29uc3QgcmVwbGF5ZWQgPSB5aWVsZCogcmVwbGF5TG9nLmNvbnN1bWVOZXh0UmVzb3VyY2VTbmFwc2hvdCh7XG4gICAgICAgICAgICAgIHJlc291cmNlSWQsXG4gICAgICAgICAgICAgIGZpZWxkUGF0aDogY29uc3VtZVBhdGgsXG4gICAgICAgICAgICAgIGtleUhhc2gsXG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgaWYgKCFyZXBsYXllZCkgcmV0dXJuIHlpZWxkKiBFZmZlY3Qudm9pZFxuXG4gICAgICAgICAgICBpZiAocmVwbGF5ZWQucGhhc2UgPT09ICdzdWNjZXNzJykge1xuICAgICAgICAgICAgICB5aWVsZCogd3JpdGViYWNrSWZDdXJyZW50S2V5SGFzaEZvclJvdyhcbiAgICAgICAgICAgICAgICByb3dJZCxcbiAgICAgICAgICAgICAgICBrZXlIYXNoLFxuICAgICAgICAgICAgICAgIHJlcGxheWVkLnNuYXBzaG90LFxuICAgICAgICAgICAgICAgICdzb3VyY2U6c3VjY2VzcycsXG4gICAgICAgICAgICAgICAgYHNvdXJjZToke2ZpZWxkUGF0aH06JHtyb3dJZH06c3VjY2Vzc2AsXG4gICAgICAgICAgICAgICAgJ3N1Y2Nlc3MnLFxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHJlcGxheWVkLnBoYXNlID09PSAnZXJyb3InKSB7XG4gICAgICAgICAgICAgIHlpZWxkKiB3cml0ZWJhY2tJZkN1cnJlbnRLZXlIYXNoRm9yUm93KFxuICAgICAgICAgICAgICAgIHJvd0lkLFxuICAgICAgICAgICAgICAgIGtleUhhc2gsXG4gICAgICAgICAgICAgICAgcmVwbGF5ZWQuc25hcHNob3QsXG4gICAgICAgICAgICAgICAgJ3NvdXJjZTplcnJvcicsXG4gICAgICAgICAgICAgICAgYHNvdXJjZToke2ZpZWxkUGF0aH06JHtyb3dJZH06ZXJyb3JgLFxuICAgICAgICAgICAgICAgICdlcnJvcicsXG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIHlpZWxkKiBFZmZlY3Qudm9pZFxuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IHN0YWNrID0geWllbGQqIGdldE1pZGRsZXdhcmVTdGFjaygpXG5cbiAgICAgICAgICBjb25zdCByZWdpc3RyeU9wdCA9IHlpZWxkKiBFZmZlY3Quc2VydmljZU9wdGlvbihSZXNvdXJjZUludGVybmFsLlJlc291cmNlUmVnaXN0cnlUYWcpXG4gICAgICAgICAgY29uc3QgcmVnaXN0cnkgPSBPcHRpb24uaXNTb21lKHJlZ2lzdHJ5T3B0KSA/IHJlZ2lzdHJ5T3B0LnZhbHVlIDogdW5kZWZpbmVkXG4gICAgICAgICAgY29uc3Qgc3BlYyA9IHJlZ2lzdHJ5Py5zcGVjcy5nZXQocmVzb3VyY2VJZClcblxuICAgICAgICAgIGlmICghc3BlYykge1xuICAgICAgICAgICAgcmV0dXJuIHlpZWxkKiBFZmZlY3Qudm9pZFxuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IGxvYWRFZmZlY3QgPSAoc3BlYy5sb2FkIGFzIGFueSkoa2V5KSBhcyBFZmZlY3QuRWZmZWN0PGFueSwgYW55LCBhbnk+XG5cbiAgICAgICAgICBjb25zdCBtZXRhOiBhbnkgPSB7XG4gICAgICAgICAgICBtb2R1bGVJZCxcbiAgICAgICAgICAgIGluc3RhbmNlSWQsXG4gICAgICAgICAgICBmaWVsZFBhdGgsXG4gICAgICAgICAgICByZXNvdXJjZUlkLFxuICAgICAgICAgICAga2V5LFxuICAgICAgICAgICAga2V5SGFzaCxcbiAgICAgICAgICAgIHJvd0lkLFxuICAgICAgICAgICAgdHJhaXROb2RlSWQ6IHN0ZXAuZGVidWdJbmZvPy5ncmFwaE5vZGVJZCxcbiAgICAgICAgICAgIHN0ZXBJZDogc3RlcC5pZCxcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoISh0eXBlb2YgbWV0YS5vcFNlcSA9PT0gJ251bWJlcicgJiYgTnVtYmVyLmlzRmluaXRlKG1ldGEub3BTZXEpKSkge1xuICAgICAgICAgICAgY29uc3Qgc2Vzc2lvbk9wdCA9IHlpZWxkKiBFZmZlY3Quc2VydmljZU9wdGlvbihSdW5TZXNzaW9uVGFnKVxuICAgICAgICAgICAgaWYgKE9wdGlvbi5pc1NvbWUoc2Vzc2lvbk9wdCkpIHtcbiAgICAgICAgICAgICAgY29uc3Qgc2VxS2V5ID0gaW5zdGFuY2VJZCA/PyAnZ2xvYmFsJ1xuICAgICAgICAgICAgICBtZXRhLm9wU2VxID0gc2Vzc2lvbk9wdC52YWx1ZS5sb2NhbC5uZXh0U2VxKCdvcFNlcScsIHNlcUtleSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25zdCBvcCA9IEVmZmVjdE9wLm1ha2U8YW55LCBhbnksIGFueT4oe1xuICAgICAgICAgICAga2luZDogJ3NlcnZpY2UnLFxuICAgICAgICAgICAgbmFtZTogcmVzb3VyY2VJZCxcbiAgICAgICAgICAgIGVmZmVjdDogbG9hZEVmZmVjdCxcbiAgICAgICAgICAgIG1ldGEsXG4gICAgICAgICAgfSlcblxuICAgICAgICAgIGNvbnN0IGV4aXQgPSB5aWVsZCogRWZmZWN0LmV4aXQoRWZmZWN0T3AucnVuKG9wLCBzdGFjaykpXG5cbiAgICAgICAgICBpZiAoZXhpdC5fdGFnID09PSAnU3VjY2VzcycpIHtcbiAgICAgICAgICAgIGNvbnN0IHN1Y2Nlc3NTbmFwc2hvdCA9IFNuYXBzaG90LnN1Y2Nlc3MoeyBrZXlIYXNoLCBkYXRhOiBleGl0LnZhbHVlIH0pXG4gICAgICAgICAgICBjb25zdCB3cm90ZVN1Y2Nlc3NQYXRoID0geWllbGQqIHdyaXRlYmFja0lmQ3VycmVudEtleUhhc2hGb3JSb3coXG4gICAgICAgICAgICAgIHJvd0lkLFxuICAgICAgICAgICAgICBrZXlIYXNoLFxuICAgICAgICAgICAgICBzdWNjZXNzU25hcHNob3QsXG4gICAgICAgICAgICAgICdzb3VyY2U6c3VjY2VzcycsXG4gICAgICAgICAgICAgIGBzb3VyY2U6JHtmaWVsZFBhdGh9OiR7cm93SWR9OnN1Y2Nlc3NgLFxuICAgICAgICAgICAgICAnc3VjY2VzcycsXG4gICAgICAgICAgICApXG4gICAgICAgICAgICBpZiAod3JvdGVTdWNjZXNzUGF0aCkge1xuICAgICAgICAgICAgICB5aWVsZCogcmVjb3JkU25hcHNob3QocmVwbGF5TW9kZSwgcmVwbGF5TG9nLCB7XG4gICAgICAgICAgICAgICAgX3RhZzogJ1Jlc291cmNlU25hcHNob3QnLFxuICAgICAgICAgICAgICAgIHJlc291cmNlSWQsXG4gICAgICAgICAgICAgICAgZmllbGRQYXRoOiB3cm90ZVN1Y2Nlc3NQYXRoLFxuICAgICAgICAgICAgICAgIGtleUhhc2gsXG4gICAgICAgICAgICAgICAgY29uY3VycmVuY3k6IG1vZGUsXG4gICAgICAgICAgICAgICAgcGhhc2U6ICdzdWNjZXNzJyxcbiAgICAgICAgICAgICAgICBzbmFwc2hvdDogc3VjY2Vzc1NuYXBzaG90LFxuICAgICAgICAgICAgICAgIHRpbWVzdGFtcDogRGF0ZS5ub3coKSxcbiAgICAgICAgICAgICAgICBtb2R1bGVJZCxcbiAgICAgICAgICAgICAgICBpbnN0YW5jZUlkLFxuICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBlcnJvclNuYXBzaG90ID0gU25hcHNob3QuZXJyb3IoeyBrZXlIYXNoLCBlcnJvcjogZXhpdC5jYXVzZSB9KVxuICAgICAgICAgICAgY29uc3Qgd3JvdGVFcnJvclBhdGggPSB5aWVsZCogd3JpdGViYWNrSWZDdXJyZW50S2V5SGFzaEZvclJvdyhcbiAgICAgICAgICAgICAgcm93SWQsXG4gICAgICAgICAgICAgIGtleUhhc2gsXG4gICAgICAgICAgICAgIGVycm9yU25hcHNob3QsXG4gICAgICAgICAgICAgICdzb3VyY2U6ZXJyb3InLFxuICAgICAgICAgICAgICBgc291cmNlOiR7ZmllbGRQYXRofToke3Jvd0lkfTplcnJvcmAsXG4gICAgICAgICAgICAgICdlcnJvcicsXG4gICAgICAgICAgICApXG4gICAgICAgICAgICBpZiAod3JvdGVFcnJvclBhdGgpIHtcbiAgICAgICAgICAgICAgeWllbGQqIHJlY29yZFNuYXBzaG90KHJlcGxheU1vZGUsIHJlcGxheUxvZywge1xuICAgICAgICAgICAgICAgIF90YWc6ICdSZXNvdXJjZVNuYXBzaG90JyxcbiAgICAgICAgICAgICAgICByZXNvdXJjZUlkLFxuICAgICAgICAgICAgICAgIGZpZWxkUGF0aDogd3JvdGVFcnJvclBhdGgsXG4gICAgICAgICAgICAgICAga2V5SGFzaCxcbiAgICAgICAgICAgICAgICBjb25jdXJyZW5jeTogbW9kZSxcbiAgICAgICAgICAgICAgICBwaGFzZTogJ2Vycm9yJyxcbiAgICAgICAgICAgICAgICBzbmFwc2hvdDogZXJyb3JTbmFwc2hvdCxcbiAgICAgICAgICAgICAgICB0aW1lc3RhbXA6IERhdGUubm93KCksXG4gICAgICAgICAgICAgICAgbW9kdWxlSWQsXG4gICAgICAgICAgICAgICAgaW5zdGFuY2VJZCxcbiAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0pLnBpcGUoRWZmZWN0LmNhdGNoQWxsQ2F1c2UoKCkgPT4gRWZmZWN0LnZvaWQpKVxuXG4gICAgICAgIC8vIGxpc3QuaXRlbVx1RkYxQUlPIGZpYmVyIFx1NUZDNVx1OTg3Qlx1ODEzMVx1NzlCQlx1NTQwQ1x1NkI2NVx1NEU4Qlx1NTJBMSBGaWJlclJlZlx1RkYwQ1x1NTQyNlx1NTIxOVx1NEYxQVx1ODhBQlx1OEJFRlx1NTIyNFx1NEUzQVx1MjAxQ1x1NEU4Qlx1NTJBMVx1N0E5N1x1NTNFM1x1NTE4NVx1MjAxRFx1RkYwQ1x1NEVDRVx1ODAwQ1x1OTYzQlx1NjVBRFx1NTQwRVx1N0VFRFx1NTE5OVx1NTZERVx1NTE2NVx1NTNFM1x1MzAwMlxuICAgICAgICBjb25zdCBmaWJlciA9IHlpZWxkKiBFZmZlY3QuZm9ya1Njb3BlZChFZmZlY3QubG9jYWxseShUYXNrUnVubmVyLmluU3luY1RyYW5zYWN0aW9uRmliZXIsIGZhbHNlKShpbykpXG4gICAgICAgIGNvbnN0IG15R2VuID0gKGdlbiArPSAxKVxuICAgICAgICBpbkZsaWdodC5zZXQocm93SWQsIHsgZ2VuOiBteUdlbiwgZmliZXIsIGtleUhhc2ggfSlcblxuICAgICAgICB5aWVsZCogRWZmZWN0LmZvcmtTY29wZWQoXG4gICAgICAgICAgRWZmZWN0LmxvY2FsbHkoXG4gICAgICAgICAgICBUYXNrUnVubmVyLmluU3luY1RyYW5zYWN0aW9uRmliZXIsXG4gICAgICAgICAgICBmYWxzZSxcbiAgICAgICAgICApKFxuICAgICAgICAgICAgRmliZXIuYXdhaXQoZmliZXIpLnBpcGUoXG4gICAgICAgICAgICAgIEVmZmVjdC56aXBSaWdodChcbiAgICAgICAgICAgICAgICBFZmZlY3Quc3luYygoKSA9PiB7XG4gICAgICAgICAgICAgICAgICBjb25zdCBjdXJyZW50ID0gaW5GbGlnaHQuZ2V0KHJvd0lkKVxuICAgICAgICAgICAgICAgICAgaWYgKGN1cnJlbnQgJiYgY3VycmVudC5nZW4gPT09IG15R2VuKSB7XG4gICAgICAgICAgICAgICAgICAgIGluRmxpZ2h0LmRlbGV0ZShyb3dJZClcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgRWZmZWN0LnppcFJpZ2h0KFxuICAgICAgICAgICAgICAgIG1vZGUgPT09ICdleGhhdXN0LXRyYWlsaW5nJ1xuICAgICAgICAgICAgICAgICAgPyBFZmZlY3QuZ2VuKGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgY29uc3QgbmV4dCA9IHRyYWlsaW5nLmdldChyb3dJZClcbiAgICAgICAgICAgICAgICAgICAgICB0cmFpbGluZy5kZWxldGUocm93SWQpXG4gICAgICAgICAgICAgICAgICAgICAgaWYgKG5leHQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHlpZWxkKiBzdGFydEZldGNoKHJvd0lkLCBuZXh0LmtleSwgbmV4dC5rZXlIYXNoLCByZXBsYXlNb2RlLCByZXBsYXlMb2cpXG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgOiBFZmZlY3Qudm9pZCxcbiAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgRWZmZWN0LmNhdGNoQWxsQ2F1c2UoKCkgPT4gRWZmZWN0LnZvaWQpLFxuICAgICAgICAgICAgKSxcbiAgICAgICAgICApLFxuICAgICAgICApXG4gICAgICB9KVxuXG4gICAgcmVnaXN0ZXIoZmllbGRQYXRoLCAoc3RhdGU6IGFueSkgPT5cbiAgICAgIEVmZmVjdC5nZW4oZnVuY3Rpb24qICgpIHtcbiAgICAgICAgY29uc3QgeyBtb2R1bGVJZCwgaW5zdGFuY2VJZCB9ID0gZ2V0Qm91bmRTY29wZShib3VuZClcbiAgICAgICAgY29uc3QgcmVwbGF5TW9kZU9wdCA9IHlpZWxkKiBFZmZlY3Quc2VydmljZU9wdGlvbihSZXBsYXlNb2RlQ29uZmlnVGFnKVxuICAgICAgICBjb25zdCByZXBsYXlNb2RlID0gT3B0aW9uLmlzU29tZShyZXBsYXlNb2RlT3B0KSA/IHJlcGxheU1vZGVPcHQudmFsdWUubW9kZSA6ICdsaXZlJ1xuICAgICAgICBjb25zdCByZXBsYXlMb2dPcHQgPSB5aWVsZCogRWZmZWN0LnNlcnZpY2VPcHRpb24oUmVwbGF5TG9nLlJlcGxheUxvZylcbiAgICAgICAgY29uc3QgcmVwbGF5TG9nID0gT3B0aW9uLmlzU29tZShyZXBsYXlMb2dPcHQpID8gcmVwbGF5TG9nT3B0LnZhbHVlIDogdW5kZWZpbmVkXG4gICAgICAgIGNvbnN0IGZvcmNlID0geWllbGQqIEZpYmVyUmVmLmdldChUYXNrUnVubmVyLmZvcmNlU291cmNlUmVmcmVzaClcblxuICAgICAgICBjb25zdCBsaXN0VmFsdWUgPSBSb3dJZC5nZXRBdFBhdGgoc3RhdGUsIGxpc3RQYXRoKVxuICAgICAgICBjb25zdCBpdGVtczogUmVhZG9ubHlBcnJheTx1bmtub3duPiA9IEFycmF5LmlzQXJyYXkobGlzdFZhbHVlKSA/IGxpc3RWYWx1ZSA6IFtdXG4gICAgICAgIGNvbnN0IGlkcyA9IHN0b3JlLmVuc3VyZUxpc3QobGlzdFBhdGgsIGl0ZW1zKVxuXG4gICAgICAgIC8vIGRldi1tb2RlXHVGRjFBXHU1QkY5XHU5OTk2XHU4ODRDXHU1MDVBXHU0RTAwXHU2QjIxIGRlcHMgdHJhY2VcdUZGMDhcdTUzRUFcdTUwNUFcdThCQ0FcdTY1QURcdUZGMENcdTRFMERcdTVGNzFcdTU0Q0RcdTYyNjdcdTg4NENcdThCRURcdTRFNDlcdUZGMDlcdTMwMDJcbiAgICAgICAgY29uc3QgdHJhY2VLZXkgPSBgJHtpbnN0YW5jZUlkID8/ICd1bmtub3duJ306OnNvdXJjZTo6JHtmaWVsZFBhdGh9YFxuICAgICAgICBpZiAoaXNEZXZFbnYoKSAmJiAoeWllbGQqIG9uY2VJblJ1blNlc3Npb24oYGRlcHNfdHJhY2Vfc2V0dGxlZDoke3RyYWNlS2V5fWApKSkge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBzYW1wbGUgPSBpdGVtc1swXVxuICAgICAgICAgICAgaWYgKHNhbXBsZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgIGNvbnN0IHRyYWNlZCA9IERlcHNUcmFjZS50cmFjZSgocykgPT4gKGVudHJ5Lm1ldGEgYXMgYW55KS5rZXkocyksIHNhbXBsZSBhcyBhbnkpXG4gICAgICAgICAgICAgIGNvbnN0IHByZWZpeGVkUmVhZHMgPSB0cmFjZWQucmVhZHMubWFwKChyKSA9PiAociA/IGAke2xpc3RQYXRofVtdLiR7cn1gIDogYCR7bGlzdFBhdGh9W11gKSlcbiAgICAgICAgICAgICAgY29uc3QgZGlmZiA9IERlcHNUcmFjZS5kaWZmRGVwcygoKGVudHJ5Lm1ldGEgYXMgYW55KS5kZXBzID8/IFtdKSBhcyBSZWFkb25seUFycmF5PHN0cmluZz4sIHByZWZpeGVkUmVhZHMpXG4gICAgICAgICAgICAgIGlmIChkaWZmKSB7XG4gICAgICAgICAgICAgICAgeWllbGQqIGVtaXREZXBzTWlzbWF0Y2goe1xuICAgICAgICAgICAgICAgICAgbW9kdWxlSWQsXG4gICAgICAgICAgICAgICAgICBpbnN0YW5jZUlkLFxuICAgICAgICAgICAgICAgICAga2luZDogJ3NvdXJjZScsXG4gICAgICAgICAgICAgICAgICBmaWVsZFBhdGgsXG4gICAgICAgICAgICAgICAgICBkaWZmLFxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgIC8vIHRyYWNpbmcgZmFpbHVyZSBzaG91bGQgbmV2ZXIgYnJlYWsgcmVmcmVzaCBmbG93XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IGl0ZW1zLmxlbmd0aDsgaW5kZXgrKykge1xuICAgICAgICAgIGNvbnN0IHJvd0lkID0gaWRzW2luZGV4XVxuICAgICAgICAgIGlmICghcm93SWQpIGNvbnRpbnVlXG5cbiAgICAgICAgICBjb25zdCBjb25jcmV0ZVBhdGggPSBSb3dJZC50b0xpc3RJdGVtVmFsdWVQYXRoKGxpc3RQYXRoLCBpbmRleCwgaXRlbVBhdGgpXG4gICAgICAgICAgY29uc3QgcHJldlNuYXBzaG90ID0gUm93SWQuZ2V0QXRQYXRoKHN0YXRlLCBjb25jcmV0ZVBhdGgpIGFzIGFueVxuXG4gICAgICAgICAgbGV0IGtleTogdW5rbm93blxuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBrZXkgPSAoZW50cnkubWV0YSBhcyBhbnkpLmtleShpdGVtc1tpbmRleF0pXG4gICAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICBrZXkgPSB1bmRlZmluZWRcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25zdCBjdXJyZW50ID0gaW5GbGlnaHQuZ2V0KHJvd0lkKVxuXG4gICAgICAgICAgaWYgKGtleSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0cmFpbGluZy5kZWxldGUocm93SWQpXG4gICAgICAgICAgICBpbkZsaWdodC5kZWxldGUocm93SWQpXG5cbiAgICAgICAgICAgIC8vIFx1ODJFNVx1NURGMlx1NjYyRiBjbGVhbiBpZGxlXHVGRjBDXHU1MjE5XHU2NUUwXHU5NzAwXHU5MUNEXHU1OTBEXHU1MTk5XHU1NkRFXHVGRjA4XHU5MDdGXHU1MTREXHU2NUUwXHU2MTBGXHU0RTQ5IHBhdGNoIFx1NUJGQ1x1ODFGNCBVSSBcdTYyOTZcdTUyQThcdUZGMDlcdTMwMDJcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgcHJldlNuYXBzaG90ICYmXG4gICAgICAgICAgICAgIHR5cGVvZiBwcmV2U25hcHNob3QgPT09ICdvYmplY3QnICYmXG4gICAgICAgICAgICAgIHByZXZTbmFwc2hvdC5zdGF0dXMgPT09ICdpZGxlJyAmJlxuICAgICAgICAgICAgICBwcmV2U25hcHNob3QuZGF0YSA9PT0gdW5kZWZpbmVkICYmXG4gICAgICAgICAgICAgIHByZXZTbmFwc2hvdC5lcnJvciA9PT0gdW5kZWZpbmVkXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgY29udGludWVcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgaWRsZVNuYXBzaG90ID0gU25hcHNob3QuaWRsZSgpXG4gICAgICAgICAgICBjb25zdCB3cm90ZUlkbGVQYXRoID0geWllbGQqIHNldFNuYXBzaG90Rm9yUm93SW5UeG4oXG4gICAgICAgICAgICAgIHJvd0lkLFxuICAgICAgICAgICAgICBpZGxlU25hcHNob3QsXG4gICAgICAgICAgICAgICdzb3VyY2U6aWRsZScsXG4gICAgICAgICAgICAgIGBzb3VyY2U6JHtmaWVsZFBhdGh9OiR7cm93SWR9OmlkbGVgLFxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgaWYgKHdyb3RlSWRsZVBhdGgpIHtcbiAgICAgICAgICAgICAgY29uc3QgZXZlbnQ6IFJlcGxheUxvZy5SZXBsYXlMb2dFdmVudCA9IHtcbiAgICAgICAgICAgICAgICBfdGFnOiAnUmVzb3VyY2VTbmFwc2hvdCcsXG4gICAgICAgICAgICAgICAgcmVzb3VyY2VJZCxcbiAgICAgICAgICAgICAgICBmaWVsZFBhdGg6IHdyb3RlSWRsZVBhdGgsXG4gICAgICAgICAgICAgICAga2V5SGFzaDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgIGNvbmN1cnJlbmN5OiBtb2RlLFxuICAgICAgICAgICAgICAgIHBoYXNlOiAnaWRsZScsXG4gICAgICAgICAgICAgICAgc25hcHNob3Q6IGlkbGVTbmFwc2hvdCxcbiAgICAgICAgICAgICAgICB0aW1lc3RhbXA6IERhdGUubm93KCksXG4gICAgICAgICAgICAgICAgbW9kdWxlSWQsXG4gICAgICAgICAgICAgICAgaW5zdGFuY2VJZCxcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICByZWNvcmRSZXBsYXlFdmVudChib3VuZCwgZXZlbnQpXG4gICAgICAgICAgICAgIHlpZWxkKiByZWNvcmRTbmFwc2hvdChyZXBsYXlNb2RlLCByZXBsYXlMb2csIGV2ZW50KVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29udGludWVcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25zdCBoID0gaGFzaEtleShrZXkpXG5cbiAgICAgICAgICAvLyBrZXlIYXNoIFx1NjcyQVx1NTNEOFx1NTMxNlx1RkYxQVx1OTA3Rlx1NTE0RFx1NjVFMFx1NjEwRlx1NEU0OVx1OTFDRFx1NTkwRFx1NTIzN1x1NjVCMFx1RkYwOFx1NTQwQ1x1NjVGNlx1NEZERFx1NEY0RiBpbi1mbGlnaHRcdUZGMDlcdTMwMDJcbiAgICAgICAgICBpZiAoIWZvcmNlICYmIGN1cnJlbnQgJiYgY3VycmVudC5rZXlIYXNoID09PSBoKSB7XG4gICAgICAgICAgICBjb250aW51ZVxuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIFx1OTc1RSBpbi1mbGlnaHRcdUZGMUFcdTgyRTVcdTVGNTNcdTUyNEQgc25hcHNob3Qua2V5SGFzaCBcdTVERjJcdTUzMzlcdTkxNERcdUZGMENcdTUyMTlcdTg5QzZcdTRFM0FcdTVERjJcdTY2MkZcdTY3MDBcdTY1QjBcdTY1NzBcdTYzNkVcdUZGMDhcdTkwN0ZcdTUxNERcdTUxNjhcdTkxQ0YgcmVmcmVzaCBcdTkwMjBcdTYyMTBcdTYyNDBcdTY3MDlcdTg4NENcdTYyOTZcdTUyQThcdUZGMDlcdTMwMDJcbiAgICAgICAgICBjb25zdCBwcmV2S2V5SGFzaCA9XG4gICAgICAgICAgICBwcmV2U25hcHNob3QgJiYgdHlwZW9mIHByZXZTbmFwc2hvdCA9PT0gJ29iamVjdCcgPyAocHJldlNuYXBzaG90IGFzIGFueSkua2V5SGFzaCA6IHVuZGVmaW5lZFxuICAgICAgICAgIGlmICghZm9yY2UgJiYgIWN1cnJlbnQgJiYgcHJldktleUhhc2ggPT09IGgpIHtcbiAgICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKG1vZGUgPT09ICdleGhhdXN0LXRyYWlsaW5nJyAmJiBjdXJyZW50KSB7XG4gICAgICAgICAgICB0cmFpbGluZy5zZXQocm93SWQsIHsga2V5LCBrZXlIYXNoOiBoIH0pXG4gICAgICAgICAgICBjb25zdCBsb2FkaW5nU25hcHNob3QgPSBTbmFwc2hvdC5sb2FkaW5nKHsga2V5SGFzaDogaCB9KVxuICAgICAgICAgICAgY29uc3Qgd3JvdGVMb2FkaW5nUGF0aCA9IHlpZWxkKiBzZXRTbmFwc2hvdEZvclJvd0luVHhuKFxuICAgICAgICAgICAgICByb3dJZCxcbiAgICAgICAgICAgICAgbG9hZGluZ1NuYXBzaG90LFxuICAgICAgICAgICAgICAnc291cmNlOmxvYWRpbmcnLFxuICAgICAgICAgICAgICBgc291cmNlOiR7ZmllbGRQYXRofToke3Jvd0lkfTpsb2FkaW5nYCxcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIGlmICh3cm90ZUxvYWRpbmdQYXRoKSB7XG4gICAgICAgICAgICAgIGNvbnN0IGV2ZW50OiBSZXBsYXlMb2cuUmVwbGF5TG9nRXZlbnQgPSB7XG4gICAgICAgICAgICAgICAgX3RhZzogJ1Jlc291cmNlU25hcHNob3QnLFxuICAgICAgICAgICAgICAgIHJlc291cmNlSWQsXG4gICAgICAgICAgICAgICAgZmllbGRQYXRoOiB3cm90ZUxvYWRpbmdQYXRoLFxuICAgICAgICAgICAgICAgIGtleUhhc2g6IGgsXG4gICAgICAgICAgICAgICAgY29uY3VycmVuY3k6IG1vZGUsXG4gICAgICAgICAgICAgICAgcGhhc2U6ICdsb2FkaW5nJyxcbiAgICAgICAgICAgICAgICBzbmFwc2hvdDogbG9hZGluZ1NuYXBzaG90LFxuICAgICAgICAgICAgICAgIHRpbWVzdGFtcDogRGF0ZS5ub3coKSxcbiAgICAgICAgICAgICAgICBtb2R1bGVJZCxcbiAgICAgICAgICAgICAgICBpbnN0YW5jZUlkLFxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHJlY29yZFJlcGxheUV2ZW50KGJvdW5kLCBldmVudClcbiAgICAgICAgICAgICAgeWllbGQqIHJlY29yZFNuYXBzaG90KHJlcGxheU1vZGUsIHJlcGxheUxvZywgZXZlbnQpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb250aW51ZVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChtb2RlID09PSAnc3dpdGNoJyAmJiBjdXJyZW50KSB7XG4gICAgICAgICAgICAvLyBcdTRFMERcdTRGOURcdThENTZcdTUzRDZcdTZEODhcdTZCNjNcdTc4NkVcdTYwMjdcdUZGMUFcdTY1RTdcdTdFRDNcdTY3OUNcdTUxOTlcdTU2REVcdTRGMUFcdTg4QUIga2V5SGFzaCBnYXRlIFx1NEUyMlx1NUYwM1x1MzAwMlxuICAgICAgICAgICAgdHJhaWxpbmcuZGVsZXRlKHJvd0lkKVxuICAgICAgICAgICAgaW5GbGlnaHQuZGVsZXRlKHJvd0lkKVxuICAgICAgICAgIH1cblxuICAgICAgICAgIHlpZWxkKiBzdGFydEZldGNoKHJvd0lkLCBrZXksIGgsIHJlcGxheU1vZGUsIHJlcGxheUxvZylcbiAgICAgICAgfVxuICAgICAgfSksXG4gICAgKVxuXG4gICAgcmV0dXJuIEVmZmVjdC52b2lkXG4gIH1cblxuICAvLyBpbi1mbGlnaHQgc3RhdGUgKHBlciBmaWVsZClcbiAgbGV0IGluRmxpZ2h0OlxuICAgIHwge1xuICAgICAgICByZWFkb25seSBnZW46IG51bWJlclxuICAgICAgICByZWFkb25seSBmaWJlcjogRmliZXIuUnVudGltZUZpYmVyPHZvaWQsIG5ldmVyPlxuICAgICAgICByZWFkb25seSBrZXlIYXNoOiBzdHJpbmdcbiAgICAgIH1cbiAgICB8IHVuZGVmaW5lZFxuICBsZXQgZ2VuID0gMFxuICBsZXQgdHJhaWxpbmc6IHsgcmVhZG9ubHkga2V5OiB1bmtub3duOyByZWFkb25seSBrZXlIYXNoOiBzdHJpbmcgfSB8IHVuZGVmaW5lZFxuXG4gIGNvbnN0IGNvbmN1cnJlbmN5ID0gKGVudHJ5Lm1ldGEgYXMgYW55KS5jb25jdXJyZW5jeSBhcyAnc3dpdGNoJyB8ICdleGhhdXN0LXRyYWlsaW5nJyB8IHVuZGVmaW5lZFxuICBjb25zdCBtb2RlID0gY29uY3VycmVuY3kgPz8gJ3N3aXRjaCdcblxuICBjb25zdCBzdGFydEZldGNoID0gKFxuICAgIGtleTogdW5rbm93bixcbiAgICBrZXlIYXNoOiBzdHJpbmcsXG4gICAgcmVwbGF5TW9kZTogJ2xpdmUnIHwgJ3JlcGxheScsXG4gICAgcmVwbGF5TG9nOiBSZXBsYXlMb2cuUmVwbGF5TG9nU2VydmljZSB8IHVuZGVmaW5lZCxcbiAgKTogRWZmZWN0LkVmZmVjdDx2b2lkLCBuZXZlciwgYW55PiA9PlxuICAgIEVmZmVjdC5nZW4oZnVuY3Rpb24qICgpIHtcbiAgICAgIGNvbnN0IHsgbW9kdWxlSWQsIGluc3RhbmNlSWQgfSA9IGdldEJvdW5kU2NvcGUoYm91bmQpXG5cbiAgICAgIC8vIDEpIHBlbmRpbmdcdUZGMUFcdTU0MENcdTZCNjVcdTUxOTlcdTUxNjUgbG9hZGluZyBzbmFwc2hvdFx1RkYwOFx1ODQzRFx1NTcyOFx1NUY1M1x1NTI0RFx1NEU4Qlx1NTJBMVx1N0E5N1x1NTNFM1x1RkYwOVx1MzAwMlxuICAgICAgbGV0IGxvYWRpbmdTbmFwc2hvdDogdW5rbm93biA9IFNuYXBzaG90LmxvYWRpbmcoeyBrZXlIYXNoIH0pXG4gICAgICBpZiAocmVwbGF5TW9kZSA9PT0gJ3JlcGxheScgJiYgcmVwbGF5TG9nKSB7XG4gICAgICAgIGNvbnN0IHJlcGxheUxvYWRpbmcgPSB5aWVsZCogcmVwbGF5TG9nLmNvbnN1bWVOZXh0UmVzb3VyY2VTbmFwc2hvdCh7XG4gICAgICAgICAgcmVzb3VyY2VJZCxcbiAgICAgICAgICBmaWVsZFBhdGgsXG4gICAgICAgICAga2V5SGFzaCxcbiAgICAgICAgICBwaGFzZTogJ2xvYWRpbmcnLFxuICAgICAgICB9KVxuICAgICAgICBpZiAocmVwbGF5TG9hZGluZykge1xuICAgICAgICAgIGxvYWRpbmdTbmFwc2hvdCA9IHJlcGxheUxvYWRpbmcuc25hcHNob3RcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgY29uc3Qgd3JvdGVMb2FkaW5nID0geWllbGQqIHNldFNuYXBzaG90SW5UeG4oXG4gICAgICAgIGJvdW5kLFxuICAgICAgICBmaWVsZFBhdGgsXG4gICAgICAgIGxvYWRpbmdTbmFwc2hvdCxcbiAgICAgICAgJ3NvdXJjZTpsb2FkaW5nJyxcbiAgICAgICAgYHNvdXJjZToke2ZpZWxkUGF0aH06bG9hZGluZ2AsXG4gICAgICAgIHN0ZXAuZGVidWdJbmZvPy5ncmFwaE5vZGVJZCxcbiAgICAgIClcbiAgICAgIGlmICh3cm90ZUxvYWRpbmcpIHtcbiAgICAgICAgY29uc3QgZXZlbnQ6IFJlcGxheUxvZy5SZXBsYXlMb2dFdmVudCA9IHtcbiAgICAgICAgICBfdGFnOiAnUmVzb3VyY2VTbmFwc2hvdCcsXG4gICAgICAgICAgcmVzb3VyY2VJZCxcbiAgICAgICAgICBmaWVsZFBhdGgsXG4gICAgICAgICAga2V5SGFzaCxcbiAgICAgICAgICBjb25jdXJyZW5jeTogbW9kZSxcbiAgICAgICAgICBwaGFzZTogJ2xvYWRpbmcnLFxuICAgICAgICAgIHNuYXBzaG90OiBsb2FkaW5nU25hcHNob3QsXG4gICAgICAgICAgdGltZXN0YW1wOiBEYXRlLm5vdygpLFxuICAgICAgICAgIG1vZHVsZUlkLFxuICAgICAgICAgIGluc3RhbmNlSWQsXG4gICAgICAgIH1cbiAgICAgICAgcmVjb3JkUmVwbGF5RXZlbnQoYm91bmQsIGV2ZW50KVxuICAgICAgICB5aWVsZCogcmVjb3JkU25hcHNob3QocmVwbGF5TW9kZSwgcmVwbGF5TG9nLCBldmVudClcbiAgICAgIH1cblxuICAgICAgLy8gMikgSU9cdUZGMUFcdTU3MjhcdTU0MEVcdTUzRjAgZmliZXIgXHU0RTJEXHU4RkQwXHU4ODRDXHVGRjA4XHU5MDdGXHU1MTREXHU5NjNCXHU1ODVFXHU1RjUzXHU1MjREXHU0RThCXHU1MkExXHVGRjA5XHUzMDAyXG4gICAgICBjb25zdCBpbyA9IEVmZmVjdC5nZW4oZnVuY3Rpb24qICgpIHtcbiAgICAgICAgaWYgKHJlcGxheU1vZGUgPT09ICdyZXBsYXknICYmIHJlcGxheUxvZykge1xuICAgICAgICAgIC8vIFx1OEJBOSBsb2FkaW5nIFx1NjNEMFx1NEVBNFx1NTE0OFx1NTNFRlx1ODlDMVx1RkYwQ1x1NTE4RFx1OTFDRFx1OEQ1Qlx1N0VDOFx1NjAwMVx1RkYwOFx1NEZERFx1NjMwMVx1MjAxQ1x1NUYwMlx1NkI2NVx1OEQ0NFx1NkU5MFx1MjAxRFx1NzY4NFx1NjVGNlx1OTVGNFx1N0VCRlx1N0VEM1x1Njc4NFx1RkYwOVx1MzAwMlxuICAgICAgICAgIHlpZWxkKiBFZmZlY3QueWllbGROb3coKVxuICAgICAgICAgIGNvbnN0IHJlcGxheWVkID0geWllbGQqIHJlcGxheUxvZy5jb25zdW1lTmV4dFJlc291cmNlU25hcHNob3Qoe1xuICAgICAgICAgICAgcmVzb3VyY2VJZCxcbiAgICAgICAgICAgIGZpZWxkUGF0aCxcbiAgICAgICAgICAgIGtleUhhc2gsXG4gICAgICAgICAgfSlcbiAgICAgICAgICBpZiAoIXJlcGxheWVkKSByZXR1cm4geWllbGQqIEVmZmVjdC52b2lkXG5cbiAgICAgICAgICBpZiAocmVwbGF5ZWQucGhhc2UgPT09ICdzdWNjZXNzJykge1xuICAgICAgICAgICAgY29uc3QgZXZlbnQ6IFJlcGxheUxvZy5SZXBsYXlMb2dFdmVudCA9IHtcbiAgICAgICAgICAgICAgX3RhZzogJ1Jlc291cmNlU25hcHNob3QnLFxuICAgICAgICAgICAgICByZXNvdXJjZUlkLFxuICAgICAgICAgICAgICBmaWVsZFBhdGgsXG4gICAgICAgICAgICAgIGtleUhhc2gsXG4gICAgICAgICAgICAgIGNvbmN1cnJlbmN5OiBtb2RlLFxuICAgICAgICAgICAgICBwaGFzZTogJ3N1Y2Nlc3MnLFxuICAgICAgICAgICAgICBzbmFwc2hvdDogcmVwbGF5ZWQuc25hcHNob3QsXG4gICAgICAgICAgICAgIHRpbWVzdGFtcDogRGF0ZS5ub3coKSxcbiAgICAgICAgICAgICAgbW9kdWxlSWQsXG4gICAgICAgICAgICAgIGluc3RhbmNlSWQsXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB5aWVsZCogd3JpdGViYWNrSWZDdXJyZW50S2V5SGFzaChcbiAgICAgICAgICAgICAgYm91bmQsXG4gICAgICAgICAgICAgIGZpZWxkUGF0aCxcbiAgICAgICAgICAgICAga2V5SGFzaCxcbiAgICAgICAgICAgICAgcmVwbGF5ZWQuc25hcHNob3QsXG4gICAgICAgICAgICAgICdzb3VyY2U6c3VjY2VzcycsXG4gICAgICAgICAgICAgIGBzb3VyY2U6JHtmaWVsZFBhdGh9OnN1Y2Nlc3NgLFxuICAgICAgICAgICAgICBzdGVwLmRlYnVnSW5mbz8uZ3JhcGhOb2RlSWQsXG4gICAgICAgICAgICAgIGV2ZW50LFxuICAgICAgICAgICAgKVxuICAgICAgICAgIH0gZWxzZSBpZiAocmVwbGF5ZWQucGhhc2UgPT09ICdlcnJvcicpIHtcbiAgICAgICAgICAgIGNvbnN0IGV2ZW50OiBSZXBsYXlMb2cuUmVwbGF5TG9nRXZlbnQgPSB7XG4gICAgICAgICAgICAgIF90YWc6ICdSZXNvdXJjZVNuYXBzaG90JyxcbiAgICAgICAgICAgICAgcmVzb3VyY2VJZCxcbiAgICAgICAgICAgICAgZmllbGRQYXRoLFxuICAgICAgICAgICAgICBrZXlIYXNoLFxuICAgICAgICAgICAgICBjb25jdXJyZW5jeTogbW9kZSxcbiAgICAgICAgICAgICAgcGhhc2U6ICdlcnJvcicsXG4gICAgICAgICAgICAgIHNuYXBzaG90OiByZXBsYXllZC5zbmFwc2hvdCxcbiAgICAgICAgICAgICAgdGltZXN0YW1wOiBEYXRlLm5vdygpLFxuICAgICAgICAgICAgICBtb2R1bGVJZCxcbiAgICAgICAgICAgICAgaW5zdGFuY2VJZCxcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHlpZWxkKiB3cml0ZWJhY2tJZkN1cnJlbnRLZXlIYXNoKFxuICAgICAgICAgICAgICBib3VuZCxcbiAgICAgICAgICAgICAgZmllbGRQYXRoLFxuICAgICAgICAgICAgICBrZXlIYXNoLFxuICAgICAgICAgICAgICByZXBsYXllZC5zbmFwc2hvdCxcbiAgICAgICAgICAgICAgJ3NvdXJjZTplcnJvcicsXG4gICAgICAgICAgICAgIGBzb3VyY2U6JHtmaWVsZFBhdGh9OmVycm9yYCxcbiAgICAgICAgICAgICAgc3RlcC5kZWJ1Z0luZm8/LmdyYXBoTm9kZUlkLFxuICAgICAgICAgICAgICBldmVudCxcbiAgICAgICAgICAgIClcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4geWllbGQqIEVmZmVjdC52b2lkXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBzdGFjayA9IHlpZWxkKiBnZXRNaWRkbGV3YXJlU3RhY2soKVxuXG4gICAgICAgIGNvbnN0IHJlZ2lzdHJ5T3B0ID0geWllbGQqIEVmZmVjdC5zZXJ2aWNlT3B0aW9uKFJlc291cmNlSW50ZXJuYWwuUmVzb3VyY2VSZWdpc3RyeVRhZylcbiAgICAgICAgY29uc3QgcmVnaXN0cnkgPSBPcHRpb24uaXNTb21lKHJlZ2lzdHJ5T3B0KSA/IHJlZ2lzdHJ5T3B0LnZhbHVlIDogdW5kZWZpbmVkXG4gICAgICAgIGNvbnN0IHNwZWMgPSByZWdpc3RyeT8uc3BlY3MuZ2V0KHJlc291cmNlSWQpXG5cbiAgICAgICAgaWYgKCFzcGVjKSB7XG4gICAgICAgICAgcmV0dXJuIHlpZWxkKiBFZmZlY3Qudm9pZFxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgbG9hZEVmZmVjdCA9IChzcGVjLmxvYWQgYXMgYW55KShrZXkpIGFzIEVmZmVjdC5FZmZlY3Q8YW55LCBhbnksIGFueT5cblxuICAgICAgICBjb25zdCBtZXRhOiBhbnkgPSB7XG4gICAgICAgICAgbW9kdWxlSWQsXG4gICAgICAgICAgaW5zdGFuY2VJZCxcbiAgICAgICAgICBmaWVsZFBhdGgsXG4gICAgICAgICAgcmVzb3VyY2VJZCxcbiAgICAgICAgICBrZXksXG4gICAgICAgICAga2V5SGFzaCxcbiAgICAgICAgICB0cmFpdE5vZGVJZDogc3RlcC5kZWJ1Z0luZm8/LmdyYXBoTm9kZUlkLFxuICAgICAgICAgIHN0ZXBJZDogc3RlcC5pZCxcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghKHR5cGVvZiBtZXRhLm9wU2VxID09PSAnbnVtYmVyJyAmJiBOdW1iZXIuaXNGaW5pdGUobWV0YS5vcFNlcSkpKSB7XG4gICAgICAgICAgY29uc3Qgc2Vzc2lvbk9wdCA9IHlpZWxkKiBFZmZlY3Quc2VydmljZU9wdGlvbihSdW5TZXNzaW9uVGFnKVxuICAgICAgICAgIGlmIChPcHRpb24uaXNTb21lKHNlc3Npb25PcHQpKSB7XG4gICAgICAgICAgICBjb25zdCBzZXFLZXkgPSBpbnN0YW5jZUlkID8/ICdnbG9iYWwnXG4gICAgICAgICAgICBtZXRhLm9wU2VxID0gc2Vzc2lvbk9wdC52YWx1ZS5sb2NhbC5uZXh0U2VxKCdvcFNlcScsIHNlcUtleSlcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBvcCA9IEVmZmVjdE9wLm1ha2U8YW55LCBhbnksIGFueT4oe1xuICAgICAgICAgIGtpbmQ6ICd0cmFpdC1zb3VyY2UnLFxuICAgICAgICAgIG5hbWU6IHJlc291cmNlSWQsXG4gICAgICAgICAgZWZmZWN0OiBsb2FkRWZmZWN0LFxuICAgICAgICAgIG1ldGEsXG4gICAgICAgIH0pXG5cbiAgICAgICAgY29uc3QgZXhpdCA9IHlpZWxkKiBFZmZlY3QuZXhpdChFZmZlY3RPcC5ydW4ob3AsIHN0YWNrKSlcblxuICAgICAgICAvLyAzKSB3cml0ZWJhY2tcdUZGMUFcdTRFRTUga2V5SGFzaCBnYXRlIFx1OTYzMlx1NkI2Mlx1NjVFN1x1N0VEM1x1Njc5Q1x1NTZERVx1NTE5OVx1NTIzMFx1NjVCMCBrZXkgXHU0RTBBXHUzMDAyXG4gICAgICAgIGlmIChleGl0Ll90YWcgPT09ICdTdWNjZXNzJykge1xuICAgICAgICAgIGNvbnN0IHN1Y2Nlc3NTbmFwc2hvdCA9IFNuYXBzaG90LnN1Y2Nlc3MoeyBrZXlIYXNoLCBkYXRhOiBleGl0LnZhbHVlIH0pXG4gICAgICAgICAgY29uc3QgZXZlbnQ6IFJlcGxheUxvZy5SZXBsYXlMb2dFdmVudCA9IHtcbiAgICAgICAgICAgIF90YWc6ICdSZXNvdXJjZVNuYXBzaG90JyxcbiAgICAgICAgICAgIHJlc291cmNlSWQsXG4gICAgICAgICAgICBmaWVsZFBhdGgsXG4gICAgICAgICAgICBrZXlIYXNoLFxuICAgICAgICAgICAgY29uY3VycmVuY3k6IG1vZGUsXG4gICAgICAgICAgICBwaGFzZTogJ3N1Y2Nlc3MnLFxuICAgICAgICAgICAgc25hcHNob3Q6IHN1Y2Nlc3NTbmFwc2hvdCxcbiAgICAgICAgICAgIHRpbWVzdGFtcDogRGF0ZS5ub3coKSxcbiAgICAgICAgICAgIG1vZHVsZUlkLFxuICAgICAgICAgICAgaW5zdGFuY2VJZCxcbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3Qgd3JvdGVTdWNjZXNzID0geWllbGQqIHdyaXRlYmFja0lmQ3VycmVudEtleUhhc2goXG4gICAgICAgICAgICBib3VuZCxcbiAgICAgICAgICAgIGZpZWxkUGF0aCxcbiAgICAgICAgICAgIGtleUhhc2gsXG4gICAgICAgICAgICBzdWNjZXNzU25hcHNob3QsXG4gICAgICAgICAgICAnc291cmNlOnN1Y2Nlc3MnLFxuICAgICAgICAgICAgYHNvdXJjZToke2ZpZWxkUGF0aH06c3VjY2Vzc2AsXG4gICAgICAgICAgICBzdGVwLmRlYnVnSW5mbz8uZ3JhcGhOb2RlSWQsXG4gICAgICAgICAgICBldmVudCxcbiAgICAgICAgICApXG4gICAgICAgICAgaWYgKHdyb3RlU3VjY2Vzcykge1xuICAgICAgICAgICAgeWllbGQqIHJlY29yZFNuYXBzaG90KHJlcGxheU1vZGUsIHJlcGxheUxvZywgZXZlbnQpXG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnN0IGVycm9yU25hcHNob3QgPSBTbmFwc2hvdC5lcnJvcih7IGtleUhhc2gsIGVycm9yOiBleGl0LmNhdXNlIH0pXG4gICAgICAgICAgY29uc3QgZXZlbnQ6IFJlcGxheUxvZy5SZXBsYXlMb2dFdmVudCA9IHtcbiAgICAgICAgICAgIF90YWc6ICdSZXNvdXJjZVNuYXBzaG90JyxcbiAgICAgICAgICAgIHJlc291cmNlSWQsXG4gICAgICAgICAgICBmaWVsZFBhdGgsXG4gICAgICAgICAgICBrZXlIYXNoLFxuICAgICAgICAgICAgY29uY3VycmVuY3k6IG1vZGUsXG4gICAgICAgICAgICBwaGFzZTogJ2Vycm9yJyxcbiAgICAgICAgICAgIHNuYXBzaG90OiBlcnJvclNuYXBzaG90LFxuICAgICAgICAgICAgdGltZXN0YW1wOiBEYXRlLm5vdygpLFxuICAgICAgICAgICAgbW9kdWxlSWQsXG4gICAgICAgICAgICBpbnN0YW5jZUlkLFxuICAgICAgICAgIH1cbiAgICAgICAgICBjb25zdCB3cm90ZUVycm9yID0geWllbGQqIHdyaXRlYmFja0lmQ3VycmVudEtleUhhc2goXG4gICAgICAgICAgICBib3VuZCxcbiAgICAgICAgICAgIGZpZWxkUGF0aCxcbiAgICAgICAgICAgIGtleUhhc2gsXG4gICAgICAgICAgICBlcnJvclNuYXBzaG90LFxuICAgICAgICAgICAgJ3NvdXJjZTplcnJvcicsXG4gICAgICAgICAgICBgc291cmNlOiR7ZmllbGRQYXRofTplcnJvcmAsXG4gICAgICAgICAgICBzdGVwLmRlYnVnSW5mbz8uZ3JhcGhOb2RlSWQsXG4gICAgICAgICAgICBldmVudCxcbiAgICAgICAgICApXG4gICAgICAgICAgaWYgKHdyb3RlRXJyb3IpIHtcbiAgICAgICAgICAgIHlpZWxkKiByZWNvcmRTbmFwc2hvdChyZXBsYXlNb2RlLCByZXBsYXlMb2csIGV2ZW50KVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSkucGlwZShFZmZlY3QuY2F0Y2hBbGxDYXVzZSgoKSA9PiBFZmZlY3Qudm9pZCkpXG5cbiAgICAgIC8vIFx1NEUwRFx1N0I0OVx1NUY4NSBJTyBcdTVCOENcdTYyMTBcdUZGMUFmb3JrU2NvcGVkIFx1NjMwMlx1NTIzMCBydW50aW1lIHNjb3BlXHVGRjBDXHU0RkREXHU4QkMxXHU1Mzc4XHU4RjdEXHU2NUY2XHU4MUVBXHU1MkE4IGludGVycnVwdFx1MzAwMlxuICAgICAgY29uc3QgZmliZXIgPSB5aWVsZCogRWZmZWN0LmZvcmtTY29wZWQoRWZmZWN0LmxvY2FsbHkoVGFza1J1bm5lci5pblN5bmNUcmFuc2FjdGlvbkZpYmVyLCBmYWxzZSkoaW8pKVxuICAgICAgY29uc3QgbXlHZW4gPSAoZ2VuICs9IDEpXG4gICAgICBpbkZsaWdodCA9IHsgZ2VuOiBteUdlbiwgZmliZXIsIGtleUhhc2ggfVxuXG4gICAgICAvLyBpbi1mbGlnaHQgXHU3RUQzXHU2NzVGXHU1NDBFXHU2RTA1XHU3NDA2XHVGRjBDXHU1RTc2XHU1NzI4IGV4aGF1c3QtdHJhaWxpbmcgXHU2QTIxXHU1RjBGXHU0RTBCXHU4ODY1XHU4REQxXHU0RTAwXHU2QjIxIHRyYWlsaW5nXHUzMDAyXG4gICAgICB5aWVsZCogRWZmZWN0LmZvcmtTY29wZWQoXG4gICAgICAgIEVmZmVjdC5sb2NhbGx5KFxuICAgICAgICAgIFRhc2tSdW5uZXIuaW5TeW5jVHJhbnNhY3Rpb25GaWJlcixcbiAgICAgICAgICBmYWxzZSxcbiAgICAgICAgKShcbiAgICAgICAgICBGaWJlci5hd2FpdChmaWJlcikucGlwZShcbiAgICAgICAgICAgIEVmZmVjdC56aXBSaWdodChcbiAgICAgICAgICAgICAgRWZmZWN0LnN5bmMoKCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChpbkZsaWdodCAmJiBpbkZsaWdodC5nZW4gPT09IG15R2VuKSB7XG4gICAgICAgICAgICAgICAgICBpbkZsaWdodCA9IHVuZGVmaW5lZFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICApLFxuICAgICAgICAgICAgRWZmZWN0LnppcFJpZ2h0KFxuICAgICAgICAgICAgICBtb2RlID09PSAnZXhoYXVzdC10cmFpbGluZydcbiAgICAgICAgICAgICAgICA/IEVmZmVjdC5nZW4oZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbmV4dCA9IHRyYWlsaW5nXG4gICAgICAgICAgICAgICAgICAgIHRyYWlsaW5nID0gdW5kZWZpbmVkXG4gICAgICAgICAgICAgICAgICAgIGlmIChuZXh0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgeWllbGQqIHN0YXJ0RmV0Y2gobmV4dC5rZXksIG5leHQua2V5SGFzaCwgcmVwbGF5TW9kZSwgcmVwbGF5TG9nKVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIDogRWZmZWN0LnZvaWQsXG4gICAgICAgICAgICApLFxuICAgICAgICAgICAgRWZmZWN0LmNhdGNoQWxsQ2F1c2UoKCkgPT4gRWZmZWN0LnZvaWQpLFxuICAgICAgICAgICksXG4gICAgICAgICksXG4gICAgICApXG4gICAgfSlcblxuICByZWdpc3RlcihmaWVsZFBhdGgsIChzdGF0ZTogYW55KSA9PlxuICAgIEVmZmVjdC5nZW4oZnVuY3Rpb24qICgpIHtcbiAgICAgIGNvbnN0IHsgbW9kdWxlSWQsIGluc3RhbmNlSWQgfSA9IGdldEJvdW5kU2NvcGUoYm91bmQpXG4gICAgICBjb25zdCByZXBsYXlNb2RlT3B0ID0geWllbGQqIEVmZmVjdC5zZXJ2aWNlT3B0aW9uKFJlcGxheU1vZGVDb25maWdUYWcpXG4gICAgICBjb25zdCByZXBsYXlNb2RlID0gT3B0aW9uLmlzU29tZShyZXBsYXlNb2RlT3B0KSA/IHJlcGxheU1vZGVPcHQudmFsdWUubW9kZSA6ICdsaXZlJ1xuICAgICAgY29uc3QgcmVwbGF5TG9nT3B0ID0geWllbGQqIEVmZmVjdC5zZXJ2aWNlT3B0aW9uKFJlcGxheUxvZy5SZXBsYXlMb2cpXG4gICAgICBjb25zdCByZXBsYXlMb2cgPSBPcHRpb24uaXNTb21lKHJlcGxheUxvZ09wdCkgPyByZXBsYXlMb2dPcHQudmFsdWUgOiB1bmRlZmluZWRcbiAgICAgIGNvbnN0IGZvcmNlID0geWllbGQqIEZpYmVyUmVmLmdldChUYXNrUnVubmVyLmZvcmNlU291cmNlUmVmcmVzaClcblxuICAgICAgbGV0IGtleTogdW5rbm93blxuICAgICAgdHJ5IHtcbiAgICAgICAga2V5ID0gKGVudHJ5Lm1ldGEgYXMgYW55KS5rZXkoc3RhdGUpXG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAga2V5ID0gdW5kZWZpbmVkXG4gICAgICB9XG5cbiAgICAgIC8vIGRldi1tb2RlXHVGRjFBXHU0RkE2XHU2RDRCIGtleVNlbGVjdG9yIFx1NzY4NFx1NUI5RVx1OTY0NVx1OEJGQlx1NTNENlx1OERFRlx1NUY4NFx1NEUwRVx1NThGMFx1NjYwRSBkZXBzIFx1NzY4NFx1NURFRVx1NUYwMlx1RkYwOFx1NEVDNVx1NTA1QVx1OEJDQVx1NjVBRFx1RkYwQ1x1NEUwRFx1NUY3MVx1NTRDRFx1NjI2N1x1ODg0Q1x1OEJFRFx1NEU0OVx1RkYwOVx1MzAwMlxuICAgICAgY29uc3QgdHJhY2VLZXkgPSBgJHtpbnN0YW5jZUlkID8/ICd1bmtub3duJ306OnNvdXJjZTo6JHtmaWVsZFBhdGh9YFxuICAgICAgaWYgKGlzRGV2RW52KCkgJiYgKHlpZWxkKiBvbmNlSW5SdW5TZXNzaW9uKGBkZXBzX3RyYWNlX3NldHRsZWQ6JHt0cmFjZUtleX1gKSkpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCB0cmFjZWQgPSBEZXBzVHJhY2UudHJhY2UoKHMpID0+IChlbnRyeS5tZXRhIGFzIGFueSkua2V5KHMpLCBzdGF0ZSlcbiAgICAgICAgICBjb25zdCBkaWZmID0gRGVwc1RyYWNlLmRpZmZEZXBzKCgoZW50cnkubWV0YSBhcyBhbnkpLmRlcHMgPz8gW10pIGFzIFJlYWRvbmx5QXJyYXk8c3RyaW5nPiwgdHJhY2VkLnJlYWRzKVxuICAgICAgICAgIGlmIChkaWZmKSB7XG4gICAgICAgICAgICB5aWVsZCogZW1pdERlcHNNaXNtYXRjaCh7XG4gICAgICAgICAgICAgIG1vZHVsZUlkLFxuICAgICAgICAgICAgICBpbnN0YW5jZUlkLFxuICAgICAgICAgICAgICBraW5kOiAnc291cmNlJyxcbiAgICAgICAgICAgICAgZmllbGRQYXRoLFxuICAgICAgICAgICAgICBkaWZmLFxuICAgICAgICAgICAgfSlcbiAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgIC8vIHRyYWNpbmcgZmFpbHVyZSBzaG91bGQgbmV2ZXIgYnJlYWsgcmVmcmVzaCBmbG93XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8ga2V5IFx1NTNEOFx1N0E3QVx1RkYxQVx1NTQwQ1x1NkI2NSBpZGxlIFx1NkUwNVx1N0E3QVx1RkYwOFx1NUU3Nlx1NEUyRFx1NjVBRCBpbi1mbGlnaHRcdUZGMDlcdTMwMDJcbiAgICAgIGlmIChrZXkgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBpZiAoaW5GbGlnaHQpIHtcbiAgICAgICAgICB5aWVsZCogRmliZXIuaW50ZXJydXB0Rm9yayhpbkZsaWdodC5maWJlcilcbiAgICAgICAgICBpbkZsaWdodCA9IHVuZGVmaW5lZFxuICAgICAgICB9XG4gICAgICAgIHRyYWlsaW5nID0gdW5kZWZpbmVkXG5cbiAgICAgICAgY29uc3QgaWRsZVNuYXBzaG90ID0gU25hcHNob3QuaWRsZSgpXG4gICAgICAgIGNvbnN0IHdyb3RlSWRsZSA9IHlpZWxkKiBzZXRTbmFwc2hvdEluVHhuKFxuICAgICAgICAgIGJvdW5kLFxuICAgICAgICAgIGZpZWxkUGF0aCxcbiAgICAgICAgICBpZGxlU25hcHNob3QsXG4gICAgICAgICAgJ3NvdXJjZTppZGxlJyxcbiAgICAgICAgICBgc291cmNlOiR7ZmllbGRQYXRofTppZGxlYCxcbiAgICAgICAgICBzdGVwLmRlYnVnSW5mbz8uZ3JhcGhOb2RlSWQsXG4gICAgICAgIClcbiAgICAgICAgaWYgKHdyb3RlSWRsZSkge1xuICAgICAgICAgIGNvbnN0IGV2ZW50OiBSZXBsYXlMb2cuUmVwbGF5TG9nRXZlbnQgPSB7XG4gICAgICAgICAgICBfdGFnOiAnUmVzb3VyY2VTbmFwc2hvdCcsXG4gICAgICAgICAgICByZXNvdXJjZUlkLFxuICAgICAgICAgICAgZmllbGRQYXRoLFxuICAgICAgICAgICAga2V5SGFzaDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgY29uY3VycmVuY3k6IG1vZGUsXG4gICAgICAgICAgICBwaGFzZTogJ2lkbGUnLFxuICAgICAgICAgICAgc25hcHNob3Q6IGlkbGVTbmFwc2hvdCxcbiAgICAgICAgICAgIHRpbWVzdGFtcDogRGF0ZS5ub3coKSxcbiAgICAgICAgICAgIG1vZHVsZUlkLFxuICAgICAgICAgICAgaW5zdGFuY2VJZCxcbiAgICAgICAgICB9XG4gICAgICAgICAgcmVjb3JkUmVwbGF5RXZlbnQoYm91bmQsIGV2ZW50KVxuICAgICAgICAgIHlpZWxkKiByZWNvcmRTbmFwc2hvdChyZXBsYXlNb2RlLCByZXBsYXlMb2csIGV2ZW50KVxuICAgICAgICB9XG4gICAgICAgIHJldHVyblxuICAgICAgfVxuXG4gICAgICBjb25zdCBoID0gaGFzaEtleShrZXkpXG5cbiAgICAgIC8vIFx1OUVEOFx1OEJBNFx1OEJFRFx1NEU0OVx1RkYxQVx1NTQwQ1x1NEUwMCBrZXlIYXNoIFx1NURGMlx1NjcwOVx1OTc1RSBpZGxlIFx1NUZFQlx1NzE2N1x1NjVGNlx1RkYwQ3JlZnJlc2ggXHU1QzNEXHU5MUNGIG5vLW9wXHVGRjA4XHU5MDdGXHU1MTREXHU5MUNEXHU1OTBEIElPL1x1NTE5OVx1NTZERVx1RkYwOVx1MzAwMlxuICAgICAgLy8gXHU2NjNFXHU1RjBGIHJlZnJlc2ggLyBpbnZhbGlkYXRlIFx1NTNFRlx1OTAxQVx1OEZDNyBmb3JjZSBcdTdFRDVcdThGQzdcdThCRTVcdTRGMThcdTUzMTZcdTMwMDJcbiAgICAgIGlmICghZm9yY2UpIHtcbiAgICAgICAgaWYgKGluRmxpZ2h0ICYmIGluRmxpZ2h0LmtleUhhc2ggPT09IGgpIHtcbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGN1cnJlbnRTbmFwc2hvdCA9IFJvd0lkLmdldEF0UGF0aChzdGF0ZSwgZmllbGRQYXRoKSBhcyBhbnlcbiAgICAgICAgY29uc3QgY3VycmVudEtleUhhc2ggPVxuICAgICAgICAgIGN1cnJlbnRTbmFwc2hvdCAmJiB0eXBlb2YgY3VycmVudFNuYXBzaG90ID09PSAnb2JqZWN0JyA/IChjdXJyZW50U25hcHNob3QgYXMgYW55KS5rZXlIYXNoIDogdW5kZWZpbmVkXG4gICAgICAgIGNvbnN0IGN1cnJlbnRTdGF0dXMgPVxuICAgICAgICAgIGN1cnJlbnRTbmFwc2hvdCAmJiB0eXBlb2YgY3VycmVudFNuYXBzaG90ID09PSAnb2JqZWN0JyA/IChjdXJyZW50U25hcHNob3QgYXMgYW55KS5zdGF0dXMgOiB1bmRlZmluZWRcbiAgICAgICAgaWYgKGN1cnJlbnRTdGF0dXMgJiYgY3VycmVudFN0YXR1cyAhPT0gJ2lkbGUnICYmIGN1cnJlbnRLZXlIYXNoID09PSBoKSB7XG4gICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKG1vZGUgPT09ICdleGhhdXN0LXRyYWlsaW5nJyAmJiBpbkZsaWdodCkge1xuICAgICAgICAvLyBcdTVGRDlcdTc4OENcdTY1RjZcdUZGMUFcdThCQjBcdTVGNTUgdHJhaWxpbmdcdUZGMENcdTVFNzZcdTdBQ0JcdTUzNzNcdTY2RjRcdTY1QjBcdTUyMzBcdTY3MDBcdTY1QjAgbG9hZGluZ1x1RkYwOFx1NjVFNyBpbi1mbGlnaHQgXHU1MTk5XHU1NkRFXHU0RjFBXHU4OEFCIGtleUhhc2ggZ2F0ZSBcdTYyRTZcdTRGNEZcdUZGMDlcdTMwMDJcbiAgICAgICAgdHJhaWxpbmcgPSB7IGtleSwga2V5SGFzaDogaCB9XG4gICAgICAgIGNvbnN0IGxvYWRpbmdTbmFwc2hvdCA9IFNuYXBzaG90LmxvYWRpbmcoeyBrZXlIYXNoOiBoIH0pXG4gICAgICAgIGNvbnN0IHdyb3RlTG9hZGluZyA9IHlpZWxkKiBzZXRTbmFwc2hvdEluVHhuKFxuICAgICAgICAgIGJvdW5kLFxuICAgICAgICAgIGZpZWxkUGF0aCxcbiAgICAgICAgICBsb2FkaW5nU25hcHNob3QsXG4gICAgICAgICAgJ3NvdXJjZTpsb2FkaW5nJyxcbiAgICAgICAgICBgc291cmNlOiR7ZmllbGRQYXRofTpsb2FkaW5nYCxcbiAgICAgICAgICBzdGVwLmRlYnVnSW5mbz8uZ3JhcGhOb2RlSWQsXG4gICAgICAgIClcbiAgICAgICAgaWYgKHdyb3RlTG9hZGluZykge1xuICAgICAgICAgIGNvbnN0IGV2ZW50OiBSZXBsYXlMb2cuUmVwbGF5TG9nRXZlbnQgPSB7XG4gICAgICAgICAgICBfdGFnOiAnUmVzb3VyY2VTbmFwc2hvdCcsXG4gICAgICAgICAgICByZXNvdXJjZUlkLFxuICAgICAgICAgICAgZmllbGRQYXRoLFxuICAgICAgICAgICAga2V5SGFzaDogaCxcbiAgICAgICAgICAgIGNvbmN1cnJlbmN5OiBtb2RlLFxuICAgICAgICAgICAgcGhhc2U6ICdsb2FkaW5nJyxcbiAgICAgICAgICAgIHNuYXBzaG90OiBsb2FkaW5nU25hcHNob3QsXG4gICAgICAgICAgICB0aW1lc3RhbXA6IERhdGUubm93KCksXG4gICAgICAgICAgICBtb2R1bGVJZCxcbiAgICAgICAgICAgIGluc3RhbmNlSWQsXG4gICAgICAgICAgfVxuICAgICAgICAgIHJlY29yZFJlcGxheUV2ZW50KGJvdW5kLCBldmVudClcbiAgICAgICAgICB5aWVsZCogcmVjb3JkU25hcHNob3QocmVwbGF5TW9kZSwgcmVwbGF5TG9nLCBldmVudClcbiAgICAgICAgfVxuICAgICAgICByZXR1cm5cbiAgICAgIH1cblxuICAgICAgaWYgKG1vZGUgPT09ICdzd2l0Y2gnICYmIGluRmxpZ2h0KSB7XG4gICAgICAgIHlpZWxkKiBGaWJlci5pbnRlcnJ1cHRGb3JrKGluRmxpZ2h0LmZpYmVyKVxuICAgICAgICBpbkZsaWdodCA9IHVuZGVmaW5lZFxuICAgICAgICB0cmFpbGluZyA9IHVuZGVmaW5lZFxuICAgICAgfVxuXG4gICAgICAvLyBzdGFydCBmZXRjaCAocGVuZGluZyB0eCArIGZvcmsgSU8pXG4gICAgICB5aWVsZCogc3RhcnRGZXRjaChrZXksIGgsIHJlcGxheU1vZGUsIHJlcGxheUxvZylcbiAgICB9KSxcbiAgKVxuXG4gIHJldHVybiBFZmZlY3Qudm9pZFxufVxuIiwgImV4cG9ydCBpbnRlcmZhY2UgRGVwc1RyYWNlUmVzdWx0PFQ+IHtcbiAgcmVhZG9ubHkgdmFsdWU6IFRcbiAgcmVhZG9ubHkgcmVhZHM6IFJlYWRvbmx5QXJyYXk8c3RyaW5nPlxufVxuXG5leHBvcnQgaW50ZXJmYWNlIERlcHNEaWZmIHtcbiAgcmVhZG9ubHkgcmVhZHM6IFJlYWRvbmx5QXJyYXk8c3RyaW5nPlxuICByZWFkb25seSBkZWNsYXJlZDogUmVhZG9ubHlBcnJheTxzdHJpbmc+XG4gIHJlYWRvbmx5IG1pc3Npbmc6IFJlYWRvbmx5QXJyYXk8c3RyaW5nPlxuICByZWFkb25seSB1bnVzZWQ6IFJlYWRvbmx5QXJyYXk8c3RyaW5nPlxufVxuXG5jb25zdCBpc1RyYWNlYWJsZU9iamVjdCA9ICh2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIG9iamVjdCA9PiB7XG4gIGlmICghdmFsdWUgfHwgdHlwZW9mIHZhbHVlICE9PSAnb2JqZWN0JykgcmV0dXJuIGZhbHNlXG4gIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkgcmV0dXJuIHRydWVcbiAgaWYgKHZhbHVlIGluc3RhbmNlb2YgRGF0ZSkgcmV0dXJuIGZhbHNlXG4gIGlmICh2YWx1ZSBpbnN0YW5jZW9mIFJlZ0V4cCkgcmV0dXJuIGZhbHNlXG4gIGlmICh2YWx1ZSBpbnN0YW5jZW9mIEVycm9yKSByZXR1cm4gZmFsc2VcbiAgaWYgKHZhbHVlIGluc3RhbmNlb2YgTWFwKSByZXR1cm4gZmFsc2VcbiAgaWYgKHZhbHVlIGluc3RhbmNlb2YgU2V0KSByZXR1cm4gZmFsc2VcbiAgaWYgKHZhbHVlIGluc3RhbmNlb2YgV2Vha01hcCkgcmV0dXJuIGZhbHNlXG4gIGlmICh2YWx1ZSBpbnN0YW5jZW9mIFdlYWtTZXQpIHJldHVybiBmYWxzZVxuICByZXR1cm4gdHJ1ZVxufVxuXG5jb25zdCBzaG91bGRJZ25vcmVLZXkgPSAoa2V5OiBzdHJpbmcpOiBib29sZWFuID0+IGtleSA9PT0gJ19fcHJvdG9fXycgfHwga2V5ID09PSAncHJvdG90eXBlJyB8fCBrZXkgPT09ICdjb25zdHJ1Y3RvcidcblxuY29uc3Qgbm9ybWFsaXplUmVhZHMgPSAocmVhZHM6IFJlYWRvbmx5U2V0PHN0cmluZz4pOiBSZWFkb25seUFycmF5PHN0cmluZz4gPT4ge1xuICBjb25zdCBhbGwgPSBBcnJheS5mcm9tKHJlYWRzKS5maWx0ZXIoKHApID0+IHR5cGVvZiBwID09PSAnc3RyaW5nJyAmJiBwLmxlbmd0aCA+IDApXG4gIGFsbC5zb3J0KClcblxuICAvLyBcdTUzQkJcdTYzODlcdTRFMjVcdTY4M0NcdTUyNERcdTdGMDBcdThERUZcdTVGODRcdUZGMDhcdTRGOEJcdTU5ODJcdTU0MENcdTY1RjZcdThCRkJcdTRFODYgcHJvZmlsZSBcdTRFMEUgcHJvZmlsZS5pZCBcdTY1RjZcdUZGMENcdTUzRUFcdTRGRERcdTc1NTlcdTY2RjRcdTUxNzdcdTRGNTNcdTc2ODQgcHJvZmlsZS5pZFx1RkYwOVx1MzAwMlxuICBjb25zdCBpc1ByZWZpeCA9IChwcmVmaXg6IHN0cmluZywgZnVsbDogc3RyaW5nKTogYm9vbGVhbiA9PiBmdWxsICE9PSBwcmVmaXggJiYgZnVsbC5zdGFydHNXaXRoKHByZWZpeCArICcuJylcblxuICBjb25zdCBwcnVuZWQ6IEFycmF5PHN0cmluZz4gPSBbXVxuICBmb3IgKGNvbnN0IHAgb2YgYWxsKSB7XG4gICAgbGV0IGhhc01vcmVTcGVjaWZpYyA9IGZhbHNlXG4gICAgZm9yIChjb25zdCBvdGhlciBvZiBhbGwpIHtcbiAgICAgIGlmIChpc1ByZWZpeChwLCBvdGhlcikpIHtcbiAgICAgICAgaGFzTW9yZVNwZWNpZmljID0gdHJ1ZVxuICAgICAgICBicmVha1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoIWhhc01vcmVTcGVjaWZpYykge1xuICAgICAgcHJ1bmVkLnB1c2gocClcbiAgICB9XG4gIH1cblxuICBwcnVuZWQuc29ydCgpXG4gIHJldHVybiBwcnVuZWRcbn1cblxuY29uc3QgY292ZXJzID0gKGRlY2xhcmVkOiBzdHJpbmcsIHJlYWQ6IHN0cmluZyk6IGJvb2xlYW4gPT4gZGVjbGFyZWQgPT09IHJlYWQgfHwgcmVhZC5zdGFydHNXaXRoKGRlY2xhcmVkICsgJy4nKVxuXG5leHBvcnQgY29uc3QgZGlmZkRlcHMgPSAoZGVjbGFyZWQ6IFJlYWRvbmx5QXJyYXk8c3RyaW5nPiwgcmVhZHM6IFJlYWRvbmx5QXJyYXk8c3RyaW5nPik6IERlcHNEaWZmIHwgdW5kZWZpbmVkID0+IHtcbiAgY29uc3QgZGVjbGFyZWRMaXN0ID0gQXJyYXkuZnJvbShuZXcgU2V0KGRlY2xhcmVkKSkuZmlsdGVyKChwKSA9PiB0eXBlb2YgcCA9PT0gJ3N0cmluZycgJiYgcC5sZW5ndGggPiAwKVxuICBkZWNsYXJlZExpc3Quc29ydCgpXG4gIGNvbnN0IHJlYWRMaXN0ID0gQXJyYXkuZnJvbShuZXcgU2V0KHJlYWRzKSkuZmlsdGVyKChwKSA9PiB0eXBlb2YgcCA9PT0gJ3N0cmluZycgJiYgcC5sZW5ndGggPiAwKVxuICByZWFkTGlzdC5zb3J0KClcblxuICBjb25zdCBtaXNzaW5nID0gcmVhZExpc3QuZmlsdGVyKChyKSA9PiBkZWNsYXJlZExpc3QuZXZlcnkoKGQpID0+ICFjb3ZlcnMoZCwgcikpKVxuICBjb25zdCB1bnVzZWQgPSBkZWNsYXJlZExpc3QuZmlsdGVyKChkKSA9PiByZWFkTGlzdC5ldmVyeSgocikgPT4gIWNvdmVycyhkLCByKSkpXG5cbiAgaWYgKG1pc3NpbmcubGVuZ3RoID09PSAwICYmIHVudXNlZC5sZW5ndGggPT09IDApIHJldHVybiB1bmRlZmluZWRcblxuICByZXR1cm4ge1xuICAgIHJlYWRzOiByZWFkTGlzdCxcbiAgICBkZWNsYXJlZDogZGVjbGFyZWRMaXN0LFxuICAgIG1pc3NpbmcsXG4gICAgdW51c2VkLFxuICB9XG59XG5cbmV4cG9ydCBjb25zdCB0cmFjZSA9IDxUPihmbjogKHN0YXRlOiBhbnkpID0+IFQsIHN0YXRlOiB1bmtub3duKTogRGVwc1RyYWNlUmVzdWx0PFQ+ID0+IHtcbiAgaWYgKCFpc1RyYWNlYWJsZU9iamVjdChzdGF0ZSkpIHtcbiAgICByZXR1cm4geyB2YWx1ZTogZm4oc3RhdGUgYXMgYW55KSwgcmVhZHM6IFtdIH1cbiAgfVxuXG4gIGNvbnN0IHJlYWRzID0gbmV3IFNldDxzdHJpbmc+KClcblxuICAvLyBwZXItdHJhY2UgY2FjaGVzIHRvIHByZXNlcnZlIHJlZmVyZW5jZSBpZGVudGl0eSB3aXRoaW4gdGhlIHRyYWNlZCBjYWxsLlxuICBjb25zdCBwcm94eUNhY2hlID0gbmV3IFdlYWtNYXA8b2JqZWN0LCBNYXA8c3RyaW5nLCBhbnk+PigpXG4gIGNvbnN0IHByb3h5VG9UYXJnZXQgPSBuZXcgV2Vha01hcDxvYmplY3QsIG9iamVjdD4oKVxuXG4gIGNvbnN0IHdyYXAgPSAodmFsdWU6IHVua25vd24sIHBhdGg6IHN0cmluZyk6IHVua25vd24gPT4ge1xuICAgIGlmICghaXNUcmFjZWFibGVPYmplY3QodmFsdWUpKSByZXR1cm4gdmFsdWVcbiAgICByZXR1cm4gZ2V0UHJveHkodmFsdWUgYXMgYW55LCBwYXRoKVxuICB9XG5cbiAgY29uc3QgdW53cmFwID0gPFY+KHZhbHVlOiBWKTogViA9PiB7XG4gICAgaWYgKHZhbHVlICYmICh0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnIHx8IHR5cGVvZiB2YWx1ZSA9PT0gJ2Z1bmN0aW9uJykpIHtcbiAgICAgIGNvbnN0IHRhcmdldCA9IHByb3h5VG9UYXJnZXQuZ2V0KHZhbHVlIGFzIGFueSlcbiAgICAgIGlmICh0YXJnZXQpIHJldHVybiB0YXJnZXQgYXMgYW55IGFzIFZcbiAgICB9XG4gICAgcmV0dXJuIHZhbHVlXG4gIH1cblxuICBjb25zdCBnZXRQcm94eSA9ICh0YXJnZXQ6IG9iamVjdCwgYmFzZVBhdGg6IHN0cmluZyk6IGFueSA9PiB7XG4gICAgbGV0IGJ5UGF0aCA9IHByb3h5Q2FjaGUuZ2V0KHRhcmdldClcbiAgICBpZiAoIWJ5UGF0aCkge1xuICAgICAgYnlQYXRoID0gbmV3IE1hcCgpXG4gICAgICBwcm94eUNhY2hlLnNldCh0YXJnZXQsIGJ5UGF0aClcbiAgICB9XG5cbiAgICBjb25zdCBjYWNoZWQgPSBieVBhdGguZ2V0KGJhc2VQYXRoKVxuICAgIGlmIChjYWNoZWQpIHJldHVybiBjYWNoZWRcblxuICAgIGNvbnN0IHJlY29yZCA9IChwYXRoOiBzdHJpbmcpID0+IHtcbiAgICAgIGlmIChwYXRoKSByZWFkcy5hZGQocGF0aClcbiAgICB9XG5cbiAgICBjb25zdCBwcm94eSA9IG5ldyBQcm94eSh0YXJnZXQgYXMgYW55LCB7XG4gICAgICBnZXQ6ICh0LCBwcm9wLCByZWNlaXZlcikgPT4ge1xuICAgICAgICBpZiAodHlwZW9mIHByb3AgPT09ICdzeW1ib2wnKSB7XG4gICAgICAgICAgcmV0dXJuIFJlZmxlY3QuZ2V0KHQsIHByb3AsIHJlY2VpdmVyKVxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGtleSA9IFN0cmluZyhwcm9wKVxuICAgICAgICBpZiAoc2hvdWxkSWdub3JlS2V5KGtleSkpIHtcbiAgICAgICAgICByZXR1cm4gUmVmbGVjdC5nZXQodCwgcHJvcCwgcmVjZWl2ZXIpXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBuZXh0UGF0aCA9IGJhc2VQYXRoID8gYCR7YmFzZVBhdGh9LiR7a2V5fWAgOiBrZXlcbiAgICAgICAgcmVjb3JkKG5leHRQYXRoKVxuXG4gICAgICAgIGNvbnN0IHZhbHVlID0gUmVmbGVjdC5nZXQodCwgcHJvcCwgcmVjZWl2ZXIpIGFzIHVua25vd25cbiAgICAgICAgcmV0dXJuIHdyYXAodmFsdWUsIG5leHRQYXRoKVxuICAgICAgfSxcbiAgICAgIGhhczogKHQsIHByb3ApID0+IHtcbiAgICAgICAgaWYgKHR5cGVvZiBwcm9wID09PSAnc3ltYm9sJykgcmV0dXJuIFJlZmxlY3QuaGFzKHQsIHByb3ApXG4gICAgICAgIGNvbnN0IGtleSA9IFN0cmluZyhwcm9wKVxuICAgICAgICBpZiAoIXNob3VsZElnbm9yZUtleShrZXkpKSB7XG4gICAgICAgICAgY29uc3QgbmV4dFBhdGggPSBiYXNlUGF0aCA/IGAke2Jhc2VQYXRofS4ke2tleX1gIDoga2V5XG4gICAgICAgICAgcmVjb3JkKG5leHRQYXRoKVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBSZWZsZWN0Lmhhcyh0LCBwcm9wKVxuICAgICAgfSxcbiAgICAgIG93bktleXM6ICh0KSA9PiB7XG4gICAgICAgIGlmIChiYXNlUGF0aCkgcmVjb3JkKGJhc2VQYXRoKVxuICAgICAgICByZXR1cm4gUmVmbGVjdC5vd25LZXlzKHQpXG4gICAgICB9LFxuICAgICAgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yOiAodCwgcHJvcCkgPT4ge1xuICAgICAgICBpZiAodHlwZW9mIHByb3AgPT09ICdzeW1ib2wnKSB7XG4gICAgICAgICAgcmV0dXJuIFJlZmxlY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHQsIHByb3ApXG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qga2V5ID0gU3RyaW5nKHByb3ApXG4gICAgICAgIGlmICghc2hvdWxkSWdub3JlS2V5KGtleSkpIHtcbiAgICAgICAgICBjb25zdCBuZXh0UGF0aCA9IGJhc2VQYXRoID8gYCR7YmFzZVBhdGh9LiR7a2V5fWAgOiBrZXlcbiAgICAgICAgICByZWNvcmQobmV4dFBhdGgpXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFJlZmxlY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHQsIHByb3ApXG4gICAgICB9LFxuICAgICAgc2V0OiAoKSA9PiB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAnW2RlcHMtdHJhY2VdIEF0dGVtcHRlZCB0byBtdXRhdGUgc3RhdGUgZHVyaW5nIGRlcHMgdHJhY2luZyAoc3RhdGUgaXMgcmVhZG9ubHkgaW4gZGV2LW1vZGUgZGlhZ25vc3RpY3MpLicsXG4gICAgICAgIClcbiAgICAgIH0sXG4gICAgICBkZWZpbmVQcm9wZXJ0eTogKCkgPT4ge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgJ1tkZXBzLXRyYWNlXSBBdHRlbXB0ZWQgdG8gZGVmaW5lIHByb3BlcnR5IG9uIHN0YXRlIGR1cmluZyBkZXBzIHRyYWNpbmcgKHN0YXRlIGlzIHJlYWRvbmx5IGluIGRldi1tb2RlIGRpYWdub3N0aWNzKS4nLFxuICAgICAgICApXG4gICAgICB9LFxuICAgICAgZGVsZXRlUHJvcGVydHk6ICgpID0+IHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICdbZGVwcy10cmFjZV0gQXR0ZW1wdGVkIHRvIGRlbGV0ZSBwcm9wZXJ0eSBvbiBzdGF0ZSBkdXJpbmcgZGVwcyB0cmFjaW5nIChzdGF0ZSBpcyByZWFkb25seSBpbiBkZXYtbW9kZSBkaWFnbm9zdGljcykuJyxcbiAgICAgICAgKVxuICAgICAgfSxcbiAgICB9KVxuXG4gICAgYnlQYXRoLnNldChiYXNlUGF0aCwgcHJveHkpXG4gICAgcHJveHlUb1RhcmdldC5zZXQocHJveHksIHRhcmdldClcbiAgICByZXR1cm4gcHJveHlcbiAgfVxuXG4gIGNvbnN0IHJvb3QgPSBnZXRQcm94eShzdGF0ZSBhcyBhbnksICcnKVxuICBjb25zdCB2YWx1ZSA9IHVud3JhcChmbihyb290KSlcblxuICByZXR1cm4ge1xuICAgIHZhbHVlLFxuICAgIHJlYWRzOiBub3JtYWxpemVSZWFkcyhyZWFkcyksXG4gIH1cbn1cbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsU0FBUyxRQUFRLE9BQU8sVUFBVSxjQUFjOzs7QUNZaEQsSUFBTSxvQkFBb0IsQ0FBQyxVQUFvQztBQUM3RCxNQUFJLENBQUMsU0FBUyxP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USxFQUFFLFNBQVMsRUFBRSxDQUFDO0FBQ3ZELGNBQU0sZUFBZSxPQUFPO0FBQUEsVUFDMUI7QUFBQSxVQUNBO0FBQUEsVUFDQTtBQUFBLFVBQ0E7QUFBQSxVQUNBLFVBQVUsU0FBUztBQUFBLFVBQ25CLEtBQUssV0FBVztBQUFBLFFBQ2xCO0FBQ0EsWUFBSSxjQUFjO0FBQ2hCLGdCQUFNLFFBQWtDO0FBQUEsWUFDdEMsTUFBTTtBQUFBLFlBQ047QUFBQSxZQUNBO0FBQUEsWUFDQSxTQUFTO0FBQUEsWUFDVCxhQUFhO0FBQUEsWUFDYixPQUFPO0FBQUEsWUFDUCxVQUFVO0FBQUEsWUFDVixXQUFXLEtBQUssSUFBSTtBQUFBLFlBQ3BCO0FBQUEsWUFDQTtBQUFBLFVBQ0Y7QUFDQSw0QkFBa0IsT0FBTyxLQUFLO0FBQzlCLGlCQUFPLGVBQWUsWUFBWSxXQUFXLEtBQUs7QUFBQSxRQUNwRDtBQUNBO0FBQUEsTUFDRjtBQUVBLFVBQUksU0FBUyxZQUFZLFVBQVU7QUFDakMsZUFBTyxNQUFNLGNBQWMsU0FBUyxLQUFLO0FBQ3pDLG1CQUFXO0FBQ1gsbUJBQVc7QUFBQSxNQUNiO0FBR0EsYUFBTyxXQUFXLEtBQUssR0FBRyxZQUFZLFNBQVM7QUFBQSxJQUNqRCxDQUFDO0FBQUEsRUFDSDtBQUVBLFNBQU8sT0FBTztBQUNoQjsiLAogICJuYW1lcyI6IFsidmFsdWUiLCAicmVjb3JkIiwgImtleUhhc2giLCAia2V5IiwgInByZXYiLCAicHJldlN0YXR1cyIsICJjb25jdXJyZW5jeSIsICJtb2RlIiwgImluRmxpZ2h0IiwgInRyYWlsaW5nIiwgImdlbiIsICJzdGFydEZldGNoIl0KfQo=