@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,1052 @@
1
+ // @logix/core subpath bundles for @logix/sandbox
2
+
3
+ import {
4
+ resolve
5
+ } from "./chunk-7W5APZS2.js";
6
+ import {
7
+ create
8
+ } from "./chunk-Y5I45PEB.js";
9
+ import {
10
+ forceSourceRefresh,
11
+ inSyncTransactionFiber,
12
+ makeTaskRunner
13
+ } from "./chunk-QUMEVT2F.js";
14
+ import {
15
+ makeMatch,
16
+ makeMatchTag
17
+ } from "./chunk-ITONX5EI.js";
18
+ import {
19
+ Tag
20
+ } from "./chunk-YR2RFEZA.js";
21
+ import {
22
+ isFieldPathSegment
23
+ } from "./chunk-BCEO3MGD.js";
24
+ import {
25
+ getRuntimeInternals,
26
+ setBoundInternals
27
+ } from "./chunk-F743SKYD.js";
28
+ import {
29
+ make
30
+ } from "./chunk-FY5A73NK.js";
31
+ import {
32
+ currentDiagnosticsLevel,
33
+ record,
34
+ toSerializableErrorSummary
35
+ } from "./chunk-X74KU74D.js";
36
+ import {
37
+ RunSessionTag
38
+ } from "./chunk-GZ2NSE6A.js";
39
+ import {
40
+ isDevEnv
41
+ } from "./chunk-LTFCYZQ6.js";
42
+
43
+ // ../logix-core/src/internal/runtime/core/mutativePatches.ts
44
+ var mutateWithoutPatches = (base, mutator) => {
45
+ return create(base, mutator);
46
+ };
47
+ var toPatchFieldPath = (path) => {
48
+ if (typeof path === "string") {
49
+ const trimmed = path.trim();
50
+ return trimmed.length > 0 ? "*" : void 0;
51
+ }
52
+ if (!Array.isArray(path)) return void 0;
53
+ const parts = [];
54
+ for (const seg of path) {
55
+ if (typeof seg === "string") {
56
+ if (isFieldPathSegment(seg)) parts.push(seg);
57
+ continue;
58
+ }
59
+ }
60
+ if (parts.length === 0) return "*";
61
+ return parts;
62
+ };
63
+ var mutateWithPatchPaths = (base, mutator) => {
64
+ const out = create(base, mutator, {
65
+ enablePatches: {
66
+ pathAsArray: true,
67
+ arrayLengthAssignment: false
68
+ }
69
+ });
70
+ if (!Array.isArray(out)) {
71
+ return { nextState: out, patchPaths: [] };
72
+ }
73
+ const nextState = out[0];
74
+ const patches = out[1] ?? [];
75
+ const dedup = /* @__PURE__ */ new Map();
76
+ for (const patch of patches) {
77
+ const p = toPatchFieldPath(patch?.path);
78
+ if (!p) continue;
79
+ const key = p === "*" ? "*" : JSON.stringify(p);
80
+ if (!dedup.has(key)) dedup.set(key, p);
81
+ }
82
+ return {
83
+ nextState,
84
+ patchPaths: Array.from(dedup.values())
85
+ };
86
+ };
87
+
88
+ // ../logix-core/src/internal/runtime/core/BoundApiRuntime.ts
89
+ import { Context as Context3, Effect as Effect3, FiberRef, Option, Schema, Stream } from "../effect.js";
90
+
91
+ // ../logix-core/src/internal/runtime/core/Lifecycle.ts
92
+ import { Cause, Context, Effect, Ref } from "../effect.js";
93
+ var LifecycleContext = Context.GenericTag("@logix/LifecycleManager");
94
+ var safeRun = (label, eff) => eff.pipe(
95
+ Effect.matchCauseEffect({
96
+ onSuccess: () => Effect.void,
97
+ onFailure: (cause) => Effect.logError(`[${label}] failed: ${Cause.pretty(cause)}`)
98
+ })
99
+ );
100
+ var makeTaskId = (kind, order) => `${kind}:${order}`;
101
+ var makeLifecycleManager = (identity) => Effect.gen(function* () {
102
+ const budgets = {
103
+ maxEventsPerInstance: 20,
104
+ maxEventBytes: 4 * 1024
105
+ };
106
+ const statusRef = yield* Ref.make({
107
+ identity,
108
+ status: "creating"
109
+ });
110
+ const initRequired = [];
111
+ const start = [];
112
+ const destroy = [];
113
+ const platformSuspend = [];
114
+ const platformResume = [];
115
+ const platformReset = [];
116
+ const onErrorHandlers = [];
117
+ const getStatus = Ref.get(statusRef);
118
+ const recordPhase = (phase, name, payload) => record({
119
+ type: "lifecycle:phase",
120
+ moduleId: identity.moduleId,
121
+ instanceId: identity.instanceId,
122
+ phase,
123
+ name,
124
+ payload
125
+ });
126
+ const setStatus = (status, patch) => Ref.update(statusRef, (prev) => ({
127
+ ...prev,
128
+ identity: {
129
+ ...prev.identity,
130
+ ...patch?.runtimeLabel ? { runtimeLabel: patch.runtimeLabel } : null
131
+ },
132
+ status,
133
+ ...patch?.initOutcome !== void 0 ? { initOutcome: patch.initOutcome } : null,
134
+ ...patch?.initProgress !== void 0 ? { initProgress: patch.initProgress } : null
135
+ }));
136
+ const registerInitRequired = (effect, options) => {
137
+ const order = initRequired.length;
138
+ initRequired.push({
139
+ taskId: makeTaskId("initRequired", order),
140
+ kind: "initRequired",
141
+ order,
142
+ name: options?.name,
143
+ effect
144
+ });
145
+ };
146
+ const registerStart = (effect, options) => {
147
+ const order = start.length;
148
+ start.push({
149
+ taskId: makeTaskId("start", order),
150
+ kind: "start",
151
+ order,
152
+ name: options?.name,
153
+ fatalOnFailure: options?.fatalOnFailure,
154
+ effect
155
+ });
156
+ };
157
+ const registerDestroy = (effect, options) => {
158
+ const order = destroy.length;
159
+ destroy.push({
160
+ taskId: makeTaskId("destroy", order),
161
+ kind: "destroy",
162
+ order,
163
+ name: options?.name,
164
+ effect
165
+ });
166
+ };
167
+ const registerOnError = (handler) => {
168
+ onErrorHandlers.push(handler);
169
+ };
170
+ const registerPlatformSuspend = (effect, options) => {
171
+ const order = platformSuspend.length;
172
+ platformSuspend.push({
173
+ taskId: makeTaskId("platformSuspend", order),
174
+ kind: "platformSuspend",
175
+ order,
176
+ name: options?.name,
177
+ effect
178
+ });
179
+ };
180
+ const registerPlatformResume = (effect, options) => {
181
+ const order = platformResume.length;
182
+ platformResume.push({
183
+ taskId: makeTaskId("platformResume", order),
184
+ kind: "platformResume",
185
+ order,
186
+ name: options?.name,
187
+ effect
188
+ });
189
+ };
190
+ const registerPlatformReset = (effect, options) => {
191
+ const order = platformReset.length;
192
+ platformReset.push({
193
+ taskId: makeTaskId("platformReset", order),
194
+ kind: "platformReset",
195
+ order,
196
+ name: options?.name,
197
+ effect
198
+ });
199
+ };
200
+ const notifyError = (cause, context) => {
201
+ if (Cause.isInterrupted(cause)) {
202
+ return Effect.void;
203
+ }
204
+ return record({
205
+ type: "lifecycle:error",
206
+ moduleId: context.moduleId,
207
+ instanceId: context.instanceId,
208
+ cause,
209
+ phase: context.phase,
210
+ hook: context.hook,
211
+ taskId: context.taskId,
212
+ txnSeq: context.txnSeq,
213
+ opSeq: context.opSeq,
214
+ origin: context.origin
215
+ }).pipe(
216
+ Effect.zipRight(
217
+ Effect.forEach(
218
+ onErrorHandlers,
219
+ (handler) => handler(cause, context).pipe(
220
+ Effect.catchAllCause((inner) => Effect.logError(`[lifecycle.onError] failed: ${Cause.pretty(inner)}`))
221
+ ),
222
+ { discard: true }
223
+ )
224
+ )
225
+ );
226
+ };
227
+ const runInitRequired = Effect.gen(function* () {
228
+ const total = initRequired.length;
229
+ if (total === 0) {
230
+ yield* setStatus("ready", {
231
+ initProgress: { total: 0, completed: 0 },
232
+ initOutcome: { status: "success" }
233
+ });
234
+ return;
235
+ }
236
+ const startedAt = Date.now();
237
+ yield* recordPhase("init", "initRequired:start", { total });
238
+ yield* setStatus("initializing", {
239
+ initProgress: { total, completed: 0, current: 0, startedAt }
240
+ });
241
+ let completed = 0;
242
+ for (let i = 0; i < initRequired.length; i++) {
243
+ yield* setStatus("initializing", {
244
+ initProgress: { total, completed, current: i, startedAt }
245
+ });
246
+ const task = initRequired[i];
247
+ const exit = yield* Effect.exit(task.effect);
248
+ if (exit._tag === "Success") {
249
+ completed += 1;
250
+ yield* setStatus("initializing", {
251
+ initProgress: { total, completed, current: i + 1, startedAt }
252
+ });
253
+ continue;
254
+ }
255
+ const summary = toSerializableErrorSummary(exit.cause);
256
+ yield* notifyError(exit.cause, {
257
+ phase: "init",
258
+ hook: "initRequired",
259
+ moduleId: identity.moduleId,
260
+ instanceId: identity.instanceId,
261
+ taskId: task.taskId,
262
+ origin: "initRequired"
263
+ });
264
+ yield* setStatus("failed", {
265
+ initProgress: { total, completed, current: i, startedAt },
266
+ initOutcome: { status: "failure", error: summary.errorSummary }
267
+ });
268
+ return yield* Effect.failCause(exit.cause);
269
+ }
270
+ yield* recordPhase("init", "initRequired:success", { total });
271
+ yield* setStatus("ready", {
272
+ initProgress: { total, completed, current: total, startedAt },
273
+ initOutcome: { status: "success" }
274
+ });
275
+ });
276
+ const runStart = recordPhase("run", "start:schedule", {
277
+ total: start.length
278
+ }).pipe(
279
+ Effect.zipRight(
280
+ Effect.forEach(
281
+ start,
282
+ (task) => Effect.forkScoped(
283
+ task.effect.pipe(
284
+ Effect.catchAllCause(
285
+ (cause) => notifyError(cause, {
286
+ phase: "run",
287
+ hook: "start",
288
+ moduleId: identity.moduleId,
289
+ instanceId: identity.instanceId,
290
+ taskId: task.taskId,
291
+ origin: "start"
292
+ })
293
+ )
294
+ )
295
+ ).pipe(Effect.asVoid),
296
+ { discard: true, concurrency: "unbounded" }
297
+ )
298
+ )
299
+ );
300
+ const runDestroy = Effect.gen(function* () {
301
+ yield* recordPhase("destroy", "destroy:start", { total: destroy.length });
302
+ yield* setStatus("terminating");
303
+ for (let i = destroy.length - 1; i >= 0; i--) {
304
+ const task = destroy[i];
305
+ yield* safeRun(
306
+ "lifecycle.onDestroy",
307
+ task.effect.pipe(
308
+ Effect.catchAllCause(
309
+ (cause) => notifyError(cause, {
310
+ phase: "destroy",
311
+ hook: "destroy",
312
+ moduleId: identity.moduleId,
313
+ instanceId: identity.instanceId,
314
+ taskId: task.taskId,
315
+ origin: "destroy"
316
+ })
317
+ )
318
+ )
319
+ );
320
+ }
321
+ yield* setStatus("terminated");
322
+ yield* recordPhase("destroy", "destroy:done", { total: destroy.length });
323
+ });
324
+ const runPlatformSuspend = Effect.gen(function* () {
325
+ if (platformSuspend.length === 0) return;
326
+ yield* recordPhase("platform", "signal:suspend", { total: platformSuspend.length });
327
+ for (const task of platformSuspend) {
328
+ yield* safeRun(
329
+ "lifecycle.onSuspend",
330
+ task.effect.pipe(
331
+ Effect.catchAllCause(
332
+ (cause) => notifyError(cause, {
333
+ phase: "platform",
334
+ hook: "suspend",
335
+ moduleId: identity.moduleId,
336
+ instanceId: identity.instanceId,
337
+ taskId: task.taskId,
338
+ origin: "platform.suspend"
339
+ })
340
+ )
341
+ )
342
+ );
343
+ }
344
+ });
345
+ const runPlatformResume = Effect.gen(function* () {
346
+ if (platformResume.length === 0) return;
347
+ yield* recordPhase("platform", "signal:resume", { total: platformResume.length });
348
+ for (const task of platformResume) {
349
+ yield* safeRun(
350
+ "lifecycle.onResume",
351
+ task.effect.pipe(
352
+ Effect.catchAllCause(
353
+ (cause) => notifyError(cause, {
354
+ phase: "platform",
355
+ hook: "resume",
356
+ moduleId: identity.moduleId,
357
+ instanceId: identity.instanceId,
358
+ taskId: task.taskId,
359
+ origin: "platform.resume"
360
+ })
361
+ )
362
+ )
363
+ );
364
+ }
365
+ });
366
+ const runPlatformReset = Effect.gen(function* () {
367
+ if (platformReset.length === 0) return;
368
+ yield* recordPhase("platform", "signal:reset", { total: platformReset.length });
369
+ for (const task of platformReset) {
370
+ yield* safeRun(
371
+ "lifecycle.onReset",
372
+ task.effect.pipe(
373
+ Effect.catchAllCause(
374
+ (cause) => notifyError(cause, {
375
+ phase: "platform",
376
+ hook: "reset",
377
+ moduleId: identity.moduleId,
378
+ instanceId: identity.instanceId,
379
+ taskId: task.taskId,
380
+ origin: "platform.reset"
381
+ })
382
+ )
383
+ )
384
+ );
385
+ }
386
+ });
387
+ const getTaskSnapshot = Effect.sync(() => ({
388
+ initRequired: initRequired.map(({ effect: _eff, ...rest }) => rest),
389
+ start: start.map(({ effect: _eff, ...rest }) => rest),
390
+ destroy: destroy.map(({ effect: _eff, ...rest }) => rest),
391
+ platformSuspend: platformSuspend.map(({ effect: _eff, ...rest }) => rest),
392
+ platformResume: platformResume.map(({ effect: _eff, ...rest }) => rest),
393
+ platformReset: platformReset.map(({ effect: _eff, ...rest }) => rest)
394
+ }));
395
+ const hasOnErrorHandlers = Effect.sync(() => onErrorHandlers.length > 0);
396
+ return {
397
+ identity,
398
+ budgets,
399
+ registerPlatformSuspend,
400
+ registerPlatformResume,
401
+ registerPlatformReset,
402
+ registerInitRequired,
403
+ registerStart,
404
+ registerDestroy,
405
+ registerOnError,
406
+ getStatus,
407
+ setStatus,
408
+ notifyError,
409
+ runPlatformSuspend,
410
+ runPlatformResume,
411
+ runPlatformReset,
412
+ runInitRequired,
413
+ runStart,
414
+ runDestroy,
415
+ hasOnErrorHandlers,
416
+ getTaskSnapshot
417
+ };
418
+ });
419
+
420
+ // ../logix-core/src/internal/runtime/core/LogicDiagnostics.ts
421
+ import { Cause as Cause2, Context as Context2, Effect as Effect2 } from "../effect.js";
422
+ var phaseDiagnosticsEnabled = () => isDevEnv();
423
+ var SERVICE_NOT_FOUND_PREFIX = "Service not found:";
424
+ var emitEnvServiceNotFoundDiagnosticIfNeeded = (cause, moduleId) => Effect2.gen(function* () {
425
+ let pretty;
426
+ try {
427
+ pretty = Cause2.pretty(cause, { renderErrorCause: true });
428
+ } catch {
429
+ return;
430
+ }
431
+ if (!pretty.includes(SERVICE_NOT_FOUND_PREFIX)) {
432
+ return;
433
+ }
434
+ yield* record({
435
+ type: "diagnostic",
436
+ moduleId,
437
+ code: "logic::env_service_not_found",
438
+ severity: "warning",
439
+ message: pretty,
440
+ hint: "Logic attempted to access an Env service before it was provided. This is a known initialization timing noise in Runtime/React integration. If it happens once during early startup and everything works afterward, it's likely harmless; if it persists or correlates with app issues, verify Runtime.make / RuntimeProvider.layer provides the service."
441
+ });
442
+ yield* record({
443
+ type: "diagnostic",
444
+ moduleId,
445
+ code: "logic::invalid_phase",
446
+ severity: "error",
447
+ message: "$.use is not allowed before Env is fully ready.",
448
+ hint: "Avoid reading services during setup or before Env is ready; move Env access to the Logic run section, or wrap init via $.lifecycle.onInitRequired.",
449
+ kind: "env_service_not_ready"
450
+ });
451
+ });
452
+ var LogicPhaseServiceTag = Context2.GenericTag("@logix/LogicPhaseService");
453
+ var LogicUnitServiceTag = class extends Context2.Tag("@logix/LogicUnitService")() {
454
+ };
455
+ var makeLogicPhaseError = (kind, api, phase, moduleId) => Object.assign(new Error(`[LogicPhaseError] ${api} is not allowed in ${phase} phase (kind=${kind}).`), {
456
+ _tag: "LogicPhaseError",
457
+ kind,
458
+ api,
459
+ phase,
460
+ moduleId
461
+ });
462
+ var emitInvalidPhaseDiagnosticIfNeeded = (cause, moduleId) => Effect2.gen(function* () {
463
+ if (!phaseDiagnosticsEnabled()) {
464
+ return;
465
+ }
466
+ const allErrors = [...Cause2.failures(cause), ...Cause2.defects(cause)];
467
+ for (const err of allErrors) {
468
+ const logicErr = err;
469
+ if (logicErr && logicErr._tag === "LogicPhaseError") {
470
+ const phaseErr = logicErr;
471
+ const hint = phaseErr.kind === "use_in_setup" || phaseErr.kind === "lifecycle_in_setup" ? "The setup phase must not read Env/services or run long-lived logic; move the relevant calls to the run phase." : phaseErr.kind === "lifecycle_in_run" ? "Do not register $.lifecycle.* in the run phase (setup-only). Move lifecycle registrations to the synchronous part of Module.logic builder (before return)." : phaseErr.kind === "traits_in_run" || phaseErr.kind === "traits_declare_in_run" ? "Traits are frozen after setup; move $.traits.declare to LogicPlan.setup or the setup registration phase of Module.logic builder." : "Move logic to the run phase; keep setup for registrations only.";
472
+ yield* record({
473
+ type: "diagnostic",
474
+ moduleId: phaseErr.moduleId ?? moduleId,
475
+ code: "logic::invalid_phase",
476
+ severity: "error",
477
+ message: `${phaseErr.api ?? phaseErr.kind} is not allowed in ${phaseErr.phase} phase.`,
478
+ hint,
479
+ kind: phaseErr.kind
480
+ });
481
+ return;
482
+ }
483
+ }
484
+ });
485
+
486
+ // ../logix-core/src/internal/runtime/core/BoundApiRuntime.ts
487
+ var LogicBuilderFactory = (runtime, runtimeInternals) => {
488
+ const flowApi = make(runtime, runtimeInternals);
489
+ return (stream, triggerName) => {
490
+ const runWithStateTransaction = (origin, body) => runtimeInternals.txn.runWithStateTransaction(origin, body);
491
+ const taskRunnerRuntime = {
492
+ moduleId: runtime.moduleId,
493
+ instanceId: runtimeInternals.instanceId,
494
+ runWithStateTransaction,
495
+ resolveConcurrencyPolicy: runtimeInternals.concurrency.resolveConcurrencyPolicy
496
+ };
497
+ const builder = {
498
+ debounce: (ms) => LogicBuilderFactory(runtime, runtimeInternals)(flowApi.debounce(ms)(stream), triggerName),
499
+ throttle: (ms) => LogicBuilderFactory(runtime, runtimeInternals)(flowApi.throttle(ms)(stream), triggerName),
500
+ filter: (predicate) => LogicBuilderFactory(runtime, runtimeInternals)(flowApi.filter(predicate)(stream), triggerName),
501
+ map: (f) => LogicBuilderFactory(runtime, runtimeInternals)(stream.pipe(Stream.map(f)), triggerName),
502
+ run(eff, options) {
503
+ return flowApi.run(eff, options)(stream);
504
+ },
505
+ runLatest(eff, options) {
506
+ return flowApi.runLatest(eff, options)(stream);
507
+ },
508
+ runExhaust(eff, options) {
509
+ return flowApi.runExhaust(eff, options)(stream);
510
+ },
511
+ runParallel(eff, options) {
512
+ return flowApi.runParallel(eff, options)(stream);
513
+ },
514
+ runFork: (eff) => Effect3.forkScoped(flowApi.run(eff)(stream)).pipe(Effect3.asVoid),
515
+ runParallelFork: (eff) => Effect3.forkScoped(flowApi.runParallel(eff)(stream)).pipe(Effect3.asVoid),
516
+ runTask: (config) => makeTaskRunner(stream, "task", taskRunnerRuntime, {
517
+ ...config,
518
+ triggerName: config.triggerName ?? triggerName
519
+ }),
520
+ runParallelTask: (config) => makeTaskRunner(stream, "parallel", taskRunnerRuntime, {
521
+ ...config,
522
+ triggerName: config.triggerName ?? triggerName
523
+ }),
524
+ runLatestTask: (config) => makeTaskRunner(stream, "latest", taskRunnerRuntime, {
525
+ ...config,
526
+ triggerName: config.triggerName ?? triggerName
527
+ }),
528
+ runExhaustTask: (config) => makeTaskRunner(stream, "exhaust", taskRunnerRuntime, {
529
+ ...config,
530
+ triggerName: config.triggerName ?? triggerName
531
+ }),
532
+ toStream: () => stream,
533
+ update: (reducer) => Stream.runForEach(
534
+ stream,
535
+ (payload) => taskRunnerRuntime.runWithStateTransaction(
536
+ {
537
+ kind: "watcher:update",
538
+ name: triggerName
539
+ },
540
+ () => Effect3.gen(function* () {
541
+ const prev = yield* runtime.getState;
542
+ const next = reducer(prev, payload);
543
+ if (Effect3.isEffect(next)) {
544
+ const exit = yield* Effect3.exit(next);
545
+ if (exit._tag === "Failure") {
546
+ yield* Effect3.logError("Flow error", exit.cause);
547
+ return;
548
+ }
549
+ yield* runtime.setState(exit.value);
550
+ return;
551
+ }
552
+ yield* runtime.setState(next);
553
+ })
554
+ )
555
+ ).pipe(Effect3.catchAllCause((cause) => Effect3.logError("Flow error", cause))),
556
+ mutate: (reducer) => Stream.runForEach(
557
+ stream,
558
+ (payload) => taskRunnerRuntime.runWithStateTransaction(
559
+ {
560
+ kind: "watcher:mutate",
561
+ name: triggerName
562
+ },
563
+ () => Effect3.gen(function* () {
564
+ const prev = yield* runtime.getState;
565
+ const recordPatch = runtimeInternals?.txn.recordStatePatch;
566
+ const { nextState, patchPaths } = mutateWithPatchPaths(prev, (draft) => {
567
+ reducer(draft, payload);
568
+ });
569
+ for (const path of patchPaths) {
570
+ recordPatch?.(path, "watcher:mutate");
571
+ }
572
+ yield* runtime.setState(nextState);
573
+ })
574
+ )
575
+ ).pipe(Effect3.catchAllCause((cause) => Effect3.logError("Flow error", cause)))
576
+ };
577
+ const andThen = (handlerOrEff) => {
578
+ if (typeof handlerOrEff === "function") {
579
+ if (handlerOrEff.length >= 2) {
580
+ return builder.update(handlerOrEff);
581
+ }
582
+ return builder.run(handlerOrEff);
583
+ }
584
+ return builder.run(handlerOrEff);
585
+ };
586
+ const pipe = function() {
587
+ const fns = arguments;
588
+ let acc = builder;
589
+ for (let i = 0; i < fns.length; i++) {
590
+ acc = fns[i](acc);
591
+ }
592
+ return acc;
593
+ };
594
+ return Object.assign(builder, { pipe, andThen });
595
+ };
596
+ };
597
+ function make2(shape, runtime, options) {
598
+ const runtimeInternals = getRuntimeInternals(runtime);
599
+ const getPhase = options?.getPhase ?? (() => "run");
600
+ const getCurrentPhase = () => {
601
+ const phaseService = options?.phaseService;
602
+ const phase = phaseService?.current ?? getPhase();
603
+ return phase === "setup" ? "setup" : "run";
604
+ };
605
+ const guardRunOnly = (kind, api2) => {
606
+ const phaseService = options?.phaseService;
607
+ const phase = phaseService?.current ?? getPhase();
608
+ if (phase === "setup") {
609
+ throw makeLogicPhaseError(kind, api2, "setup", options?.moduleId);
610
+ }
611
+ };
612
+ const flowApi = make(runtime, runtimeInternals);
613
+ const makeIntentBuilder = (runtime_) => LogicBuilderFactory(runtime_, runtimeInternals);
614
+ const withLifecycle = (available, missing) => Effect3.serviceOption(LifecycleContext).pipe(
615
+ Effect3.flatMap(
616
+ (maybe) => Option.match(maybe, {
617
+ onSome: available,
618
+ onNone: missing
619
+ })
620
+ )
621
+ );
622
+ const withPlatform = (invoke) => Effect3.serviceOption(Tag).pipe(
623
+ Effect3.flatMap(
624
+ (maybe) => Option.match(maybe, {
625
+ onSome: invoke,
626
+ onNone: () => Effect3.void
627
+ })
628
+ )
629
+ );
630
+ const emitSetupOnlyViolation = (api2) => record({
631
+ type: "diagnostic",
632
+ moduleId: runtime.moduleId,
633
+ instanceId: runtime.instanceId,
634
+ code: "logic::invalid_phase",
635
+ severity: "error",
636
+ message: `${api2} is setup-only and is not allowed in run phase.`,
637
+ hint: "Move $.lifecycle.* calls to the synchronous part of Module.logic builder (before return) for registration; for dynamic resource cleanup in the run phase, use Effect.acquireRelease / Scope finalizer instead of registering onDestroy late.",
638
+ kind: "lifecycle_in_run"
639
+ });
640
+ const createIntentBuilder = (stream, triggerName) => makeIntentBuilder(runtime)(stream, triggerName);
641
+ const onceInRunSession = (key) => Effect3.serviceOption(RunSessionTag).pipe(
642
+ Effect3.map((maybe) => Option.isSome(maybe) ? maybe.value.local.once(key) : true)
643
+ );
644
+ let cachedDiagnosticsLevel;
645
+ const isModuleLike = (value) => Boolean(
646
+ value && typeof value === "object" && (value._kind === "ModuleDef" || value._kind === "Module") && "tag" in value && Context3.isTag(value.tag)
647
+ );
648
+ const buildModuleHandle = (tag, rt) => {
649
+ const actionsProxy = new Proxy(
650
+ {},
651
+ {
652
+ get: (_target, prop) => (payload) => rt.dispatch({
653
+ _tag: prop,
654
+ payload
655
+ })
656
+ }
657
+ );
658
+ const handle = {
659
+ read: (selector) => Effect3.map(rt.getState, selector),
660
+ changes: rt.changes,
661
+ dispatch: rt.dispatch,
662
+ actions$: rt.actions$,
663
+ actions: actionsProxy
664
+ };
665
+ const EXTEND_HANDLE = /* @__PURE__ */ Symbol.for("logix.module.handle.extend");
666
+ const extend = tag?.[EXTEND_HANDLE];
667
+ return typeof extend === "function" ? extend(rt, handle) ?? handle : handle;
668
+ };
669
+ const emitModuleDescriptorOnce = (module, rt) => Effect3.gen(function* () {
670
+ if (cachedDiagnosticsLevel === "off") return;
671
+ const key = `module_descriptor:${String(rt.instanceId ?? "unknown")}`;
672
+ const shouldEmit = yield* onceInRunSession(key);
673
+ if (!shouldEmit) return;
674
+ const actionKeys = Object.keys(module.tag?.shape?.actionMap ?? {});
675
+ const internalSymbol = /* @__PURE__ */ Symbol.for("logix.module.internal");
676
+ const internal = module[internalSymbol];
677
+ const logicUnits = (internal?.mounted ?? []).map((u) => ({
678
+ kind: String(u?.kind ?? "user"),
679
+ id: String(u?.id ?? ""),
680
+ derived: u?.derived ? true : void 0,
681
+ name: typeof u?.name === "string" ? u.name : void 0
682
+ }));
683
+ const schemaKeys = module.schemas && typeof module.schemas === "object" ? Object.keys(module.schemas) : void 0;
684
+ const meta = module.meta && typeof module.meta === "object" ? module.meta : void 0;
685
+ const source = module.dev?.source;
686
+ const traitsSnapshot = runtimeInternals.traits.getModuleTraitsSnapshot();
687
+ const traits = traitsSnapshot ? {
688
+ digest: traitsSnapshot.digest,
689
+ count: traitsSnapshot.traits.length
690
+ } : void 0;
691
+ const data = {
692
+ id: module.id,
693
+ moduleId: String(rt.moduleId),
694
+ instanceId: String(rt.instanceId),
695
+ actionKeys,
696
+ logicUnits,
697
+ schemaKeys,
698
+ meta,
699
+ source,
700
+ traits
701
+ };
702
+ yield* record({
703
+ type: "trace:module:descriptor",
704
+ moduleId: rt.moduleId,
705
+ instanceId: rt.instanceId,
706
+ data
707
+ });
708
+ });
709
+ const resolveModuleRuntime = (tag) => Effect3.gen(function* () {
710
+ const requestedModuleId = typeof tag?.id === "string" ? tag.id : void 0;
711
+ const fromModuleId = typeof options?.moduleId === "string" ? options.moduleId : runtime.moduleId;
712
+ if (requestedModuleId && requestedModuleId === runtime.moduleId) {
713
+ return runtime;
714
+ }
715
+ const fromImports = runtimeInternals.imports.get(tag);
716
+ if (fromImports) {
717
+ return fromImports;
718
+ }
719
+ if (typeof options?.moduleId !== "string") {
720
+ const fromEnv = yield* Effect3.serviceOption(tag);
721
+ if (Option.isSome(fromEnv)) {
722
+ return fromEnv.value;
723
+ }
724
+ }
725
+ const tokenId = requestedModuleId ?? "<unknown module id>";
726
+ const fix = isDevEnv() ? [
727
+ "- Provide the child implementation in the same scope (imports).",
728
+ ` Example: ${fromModuleId ?? "ParentModule"}.implement({ imports: [${requestedModuleId ?? "ChildModule"}.impl], ... })`,
729
+ "- If you intentionally want a root singleton, provide it at app root (Runtime.make(...,{ layer }) / root imports),",
730
+ " and use Root.resolve(ModuleTag) (instead of $.use) at the callsite."
731
+ ] : [];
732
+ const err = new Error(
733
+ isDevEnv() ? [
734
+ "[MissingModuleRuntimeError] Cannot resolve ModuleRuntime for ModuleTag.",
735
+ "",
736
+ `tokenId: ${tokenId}`,
737
+ "entrypoint: logic.$.use",
738
+ "mode: strict",
739
+ `from: ${fromModuleId ?? "<unknown module id>"}`,
740
+ `startScope: moduleId=${fromModuleId ?? "<unknown>"}, instanceId=${String(runtime.instanceId ?? "<unknown>")}`,
741
+ "",
742
+ "fix:",
743
+ ...fix
744
+ ].join("\n") : "[MissingModuleRuntimeError] module runtime not found"
745
+ );
746
+ err.tokenId = tokenId;
747
+ err.entrypoint = "logic.$.use";
748
+ err.mode = "strict";
749
+ err.from = fromModuleId;
750
+ err.startScope = {
751
+ moduleId: fromModuleId,
752
+ instanceId: String(runtime.instanceId ?? "<unknown>")
753
+ };
754
+ err.fix = fix;
755
+ err.name = "MissingModuleRuntimeError";
756
+ return yield* Effect3.die(err);
757
+ });
758
+ const stateApi = {
759
+ read: runtime.getState,
760
+ update: (f) => Effect3.gen(function* () {
761
+ const inTxn = yield* FiberRef.get(inSyncTransactionFiber);
762
+ if (inTxn) {
763
+ const prev = yield* runtime.getState;
764
+ return yield* runtime.setState(f(prev));
765
+ }
766
+ const body = () => Effect3.flatMap(runtime.getState, (prev) => runtime.setState(f(prev)));
767
+ return yield* runtimeInternals ? runtimeInternals.txn.runWithStateTransaction({ kind: "state", name: "update" }, body) : body();
768
+ }),
769
+ mutate: (f) => Effect3.gen(function* () {
770
+ const recordPatch = runtimeInternals?.txn.recordStatePatch;
771
+ const inTxn = yield* FiberRef.get(inSyncTransactionFiber);
772
+ if (inTxn) {
773
+ const prev = yield* runtime.getState;
774
+ const { nextState, patchPaths } = mutateWithPatchPaths(prev, (draft) => {
775
+ f(draft);
776
+ });
777
+ for (const path of patchPaths) {
778
+ recordPatch?.(path, "state:mutate");
779
+ }
780
+ return yield* runtime.setState(nextState);
781
+ }
782
+ const body = () => Effect3.flatMap(runtime.getState, (prev) => {
783
+ const { nextState, patchPaths } = mutateWithPatchPaths(prev, (draft) => {
784
+ f(draft);
785
+ });
786
+ for (const path of patchPaths) {
787
+ recordPatch?.(path, "state:mutate");
788
+ }
789
+ return runtime.setState(nextState);
790
+ });
791
+ return yield* runtimeInternals ? runtimeInternals.txn.runWithStateTransaction({ kind: "state", name: "mutate" }, body) : body();
792
+ }),
793
+ ref: runtime.ref
794
+ };
795
+ const actionsApi = new Proxy({}, {
796
+ get: (_target, prop) => {
797
+ if (prop === "dispatch") {
798
+ return (a) => runtime.dispatch(a);
799
+ }
800
+ if (prop === "actions$") {
801
+ return runtime.actions$;
802
+ }
803
+ return (payload) => runtime.dispatch({ _tag: prop, payload });
804
+ }
805
+ });
806
+ const matchApi = (value) => makeMatch(value);
807
+ const matchTagApi = (value) => makeMatchTag(value);
808
+ const reducer = (tag, fn) => {
809
+ return Effect3.sync(() => {
810
+ runtimeInternals.txn.registerReducer(String(tag), fn);
811
+ });
812
+ };
813
+ const api = {
814
+ root: {
815
+ resolve: (tag) => {
816
+ guardRunOnly("root_resolve_in_setup", "$.root.resolve");
817
+ return resolve(tag, {
818
+ entrypoint: "logic.$.root.resolve",
819
+ waitForReady: true
820
+ });
821
+ }
822
+ },
823
+ state: stateApi,
824
+ actions: actionsApi,
825
+ flow: flowApi,
826
+ match: matchApi,
827
+ matchTag: matchTagApi,
828
+ lifecycle: {
829
+ onInitRequired: (eff) => {
830
+ if (getCurrentPhase() === "run") {
831
+ return emitSetupOnlyViolation("$.lifecycle.onInitRequired");
832
+ }
833
+ runtimeInternals.lifecycle.registerInitRequired(eff);
834
+ return Effect3.void;
835
+ },
836
+ onStart: (eff) => {
837
+ if (getCurrentPhase() === "run") {
838
+ return emitSetupOnlyViolation("$.lifecycle.onStart");
839
+ }
840
+ runtimeInternals.lifecycle.registerStart(eff);
841
+ return Effect3.void;
842
+ },
843
+ onInit: (eff) => {
844
+ if (getCurrentPhase() === "run") {
845
+ return emitSetupOnlyViolation("$.lifecycle.onInit");
846
+ }
847
+ runtimeInternals.lifecycle.registerInitRequired(eff);
848
+ return Effect3.void;
849
+ },
850
+ onDestroy: (eff) => {
851
+ if (getCurrentPhase() === "run") {
852
+ return emitSetupOnlyViolation("$.lifecycle.onDestroy");
853
+ }
854
+ runtimeInternals.lifecycle.registerDestroy(eff);
855
+ return Effect3.void;
856
+ },
857
+ onError: (handler) => {
858
+ if (getCurrentPhase() === "run") {
859
+ return emitSetupOnlyViolation("$.lifecycle.onError");
860
+ }
861
+ runtimeInternals.lifecycle.registerOnError(handler);
862
+ return Effect3.void;
863
+ },
864
+ onSuspend: (eff) => {
865
+ if (getCurrentPhase() === "run") {
866
+ return emitSetupOnlyViolation("$.lifecycle.onSuspend");
867
+ }
868
+ runtimeInternals.lifecycle.registerPlatformSuspend(Effect3.asVoid(eff));
869
+ return Effect3.void;
870
+ },
871
+ onResume: (eff) => {
872
+ if (getCurrentPhase() === "run") {
873
+ return emitSetupOnlyViolation("$.lifecycle.onResume");
874
+ }
875
+ runtimeInternals.lifecycle.registerPlatformResume(Effect3.asVoid(eff));
876
+ return Effect3.void;
877
+ },
878
+ onReset: (eff) => {
879
+ if (getCurrentPhase() === "run") {
880
+ return emitSetupOnlyViolation("$.lifecycle.onReset");
881
+ }
882
+ runtimeInternals.lifecycle.registerPlatformReset(Effect3.asVoid(eff));
883
+ return Effect3.void;
884
+ }
885
+ },
886
+ traits: {
887
+ declare: (traits) => {
888
+ if (getCurrentPhase() === "run") {
889
+ throw makeLogicPhaseError(
890
+ "traits_declare_in_run",
891
+ "$.traits.declare",
892
+ "run",
893
+ options?.moduleId
894
+ );
895
+ }
896
+ if (!traits || typeof traits !== "object") {
897
+ throw new Error("[InvalidTraitsDeclaration] $.traits.declare expects an object.");
898
+ }
899
+ const logicUnit = options?.logicUnit ?? {
900
+ logicUnitId: "unknown",
901
+ logicUnitIdKind: "derived",
902
+ logicUnitLabel: "logicUnit:unknown",
903
+ path: void 0
904
+ };
905
+ runtimeInternals.traits.registerModuleTraitsContribution({
906
+ traits,
907
+ provenance: {
908
+ originType: "logicUnit",
909
+ originId: logicUnit.logicUnitId,
910
+ originIdKind: logicUnit.logicUnitIdKind,
911
+ originLabel: logicUnit.logicUnitLabel,
912
+ path: logicUnit.path
913
+ }
914
+ });
915
+ },
916
+ source: {
917
+ refresh: (fieldPath, options2) => Effect3.gen(function* () {
918
+ const handler = runtimeInternals.traits.getSourceRefreshHandler(fieldPath);
919
+ if (!handler) {
920
+ return yield* Effect3.void;
921
+ }
922
+ const force = options2?.force === true;
923
+ const runHandler = (state) => force ? Effect3.locally(forceSourceRefresh, true)(handler(state)) : handler(state);
924
+ const inTxn = yield* FiberRef.get(inSyncTransactionFiber);
925
+ if (inTxn) {
926
+ const state = yield* runtime.getState;
927
+ return yield* runHandler(state);
928
+ }
929
+ return yield* runtimeInternals.txn.runWithStateTransaction(
930
+ {
931
+ kind: "source-refresh",
932
+ name: fieldPath
933
+ },
934
+ () => Effect3.gen(function* () {
935
+ const state = yield* runtime.getState;
936
+ return yield* runHandler(state);
937
+ })
938
+ );
939
+ })
940
+ }
941
+ },
942
+ reducer,
943
+ use: new Proxy(() => {
944
+ }, {
945
+ apply: (_target, _thisArg, [arg]) => {
946
+ guardRunOnly("use_in_setup", "$.use");
947
+ if (isModuleLike(arg)) {
948
+ const domain = arg;
949
+ const tag = domain.tag;
950
+ const resolveAndBuild = resolveModuleRuntime(tag).pipe(Effect3.map((rt) => buildModuleHandle(tag, rt)));
951
+ const resolveWithDescriptor = resolveModuleRuntime(tag).pipe(
952
+ Effect3.tap((rt) => emitModuleDescriptorOnce(domain, rt)),
953
+ Effect3.map((rt) => buildModuleHandle(tag, rt))
954
+ );
955
+ const detectAndSelect = FiberRef.get(currentDiagnosticsLevel).pipe(
956
+ Effect3.tap((level) => {
957
+ cachedDiagnosticsLevel = level;
958
+ }),
959
+ Effect3.flatMap((level) => level === "off" ? resolveAndBuild : resolveWithDescriptor)
960
+ );
961
+ return Effect3.suspend(() => {
962
+ if (cachedDiagnosticsLevel === "off") {
963
+ return resolveAndBuild;
964
+ }
965
+ if (cachedDiagnosticsLevel !== void 0) {
966
+ return resolveWithDescriptor;
967
+ }
968
+ return detectAndSelect;
969
+ });
970
+ }
971
+ if (Context3.isTag(arg)) {
972
+ const candidate = arg;
973
+ if (candidate._kind === "ModuleTag") {
974
+ return resolveModuleRuntime(arg).pipe(
975
+ Effect3.map((rt) => buildModuleHandle(arg, rt))
976
+ );
977
+ }
978
+ return arg;
979
+ }
980
+ return Effect3.die("BoundApi.use: unsupported argument");
981
+ }
982
+ }),
983
+ onAction: new Proxy(() => {
984
+ }, {
985
+ apply: (_target, _thisArg, args) => {
986
+ guardRunOnly("use_in_setup", "$.onAction");
987
+ const arg = args[0];
988
+ if (typeof arg === "function") {
989
+ return createIntentBuilder(runtime.actions$.pipe(Stream.filter(arg)));
990
+ }
991
+ if (typeof arg === "string") {
992
+ return createIntentBuilder(
993
+ runtime.actions$.pipe(Stream.filter((a) => a._tag === arg || a.type === arg)),
994
+ arg
995
+ );
996
+ }
997
+ if (typeof arg === "object" && arg !== null) {
998
+ if ("_tag" in arg) {
999
+ return createIntentBuilder(
1000
+ runtime.actions$.pipe(Stream.filter((a) => a._tag === arg._tag)),
1001
+ String(arg._tag)
1002
+ );
1003
+ }
1004
+ if (Schema.isSchema(arg)) {
1005
+ return createIntentBuilder(
1006
+ runtime.actions$.pipe(
1007
+ Stream.filter((a) => {
1008
+ const result = Schema.decodeUnknownSync(arg)(a);
1009
+ return !!result;
1010
+ })
1011
+ )
1012
+ );
1013
+ }
1014
+ }
1015
+ return createIntentBuilder(runtime.actions$);
1016
+ },
1017
+ get: (_target, prop) => {
1018
+ guardRunOnly("use_in_setup", "$.onAction");
1019
+ if (typeof prop === "string") {
1020
+ return createIntentBuilder(
1021
+ runtime.actions$.pipe(Stream.filter((a) => a._tag === prop || a.type === prop)),
1022
+ prop
1023
+ );
1024
+ }
1025
+ return void 0;
1026
+ }
1027
+ }),
1028
+ onState: (selector) => {
1029
+ guardRunOnly("use_in_setup", "$.onState");
1030
+ return createIntentBuilder(runtime.changes(selector));
1031
+ },
1032
+ on: (stream) => {
1033
+ guardRunOnly("use_in_setup", "$.on");
1034
+ return createIntentBuilder(stream);
1035
+ }
1036
+ };
1037
+ setBoundInternals(api, runtimeInternals);
1038
+ return api;
1039
+ }
1040
+
1041
+ export {
1042
+ mutateWithoutPatches,
1043
+ mutateWithPatchPaths,
1044
+ LifecycleContext,
1045
+ makeLifecycleManager,
1046
+ emitEnvServiceNotFoundDiagnosticIfNeeded,
1047
+ LogicPhaseServiceTag,
1048
+ LogicUnitServiceTag,
1049
+ emitInvalidPhaseDiagnosticIfNeeded,
1050
+ make2 as make
1051
+ };
1052
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vbG9naXgtY29yZS9zcmMvaW50ZXJuYWwvcnVudGltZS9jb3JlL211dGF0aXZlUGF0Y2hlcy50cyIsICIuLi8uLi8uLi8uLi9sb2dpeC1jb3JlL3NyYy9pbnRlcm5hbC9ydW50aW1lL2NvcmUvQm91bmRBcGlSdW50aW1lLnRzIiwgIi4uLy4uLy4uLy4uL2xvZ2l4LWNvcmUvc3JjL2ludGVybmFsL3J1bnRpbWUvY29yZS9MaWZlY3ljbGUudHMiLCAiLi4vLi4vLi4vLi4vbG9naXgtY29yZS9zcmMvaW50ZXJuYWwvcnVudGltZS9jb3JlL0xvZ2ljRGlhZ25vc3RpY3MudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbImltcG9ydCB7IGNyZWF0ZSwgdHlwZSBQYXRjaGVzIH0gZnJvbSAnbXV0YXRpdmUnXG5pbXBvcnQgdHlwZSB7IEZpZWxkUGF0aCB9IGZyb20gJy4uLy4uL2ZpZWxkLXBhdGguanMnXG5pbXBvcnQgeyBpc0ZpZWxkUGF0aFNlZ21lbnQgfSBmcm9tICcuLi8uLi9maWVsZC1wYXRoLmpzJ1xuXG5leHBvcnQgdHlwZSBQYXRjaFBhdGggPSBGaWVsZFBhdGhcblxuZXhwb3J0IGNvbnN0IG11dGF0ZVdpdGhvdXRQYXRjaGVzID0gPFM+KGJhc2U6IFMsIG11dGF0b3I6IChkcmFmdDogUykgPT4gdm9pZCk6IFMgPT4ge1xuICByZXR1cm4gY3JlYXRlKGJhc2UsIG11dGF0b3IgYXMgYW55KSBhcyB1bmtub3duIGFzIFNcbn1cblxuY29uc3QgdG9QYXRjaEZpZWxkUGF0aCA9IChwYXRoOiB1bmtub3duKTogUGF0Y2hQYXRoIHwgJyonIHwgdW5kZWZpbmVkID0+IHtcbiAgaWYgKHR5cGVvZiBwYXRoID09PSAnc3RyaW5nJykge1xuICAgIGNvbnN0IHRyaW1tZWQgPSBwYXRoLnRyaW0oKVxuICAgIHJldHVybiB0cmltbWVkLmxlbmd0aCA+IDAgPyAnKicgOiB1bmRlZmluZWRcbiAgfVxuXG4gIGlmICghQXJyYXkuaXNBcnJheShwYXRoKSkgcmV0dXJuIHVuZGVmaW5lZFxuXG4gIGNvbnN0IHBhcnRzOiBBcnJheTxzdHJpbmc+ID0gW11cbiAgZm9yIChjb25zdCBzZWcgb2YgcGF0aCkge1xuICAgIGlmICh0eXBlb2Ygc2VnID09PSAnc3RyaW5nJykge1xuICAgICAgaWYgKGlzRmllbGRQYXRoU2VnbWVudChzZWcpKSBwYXJ0cy5wdXNoKHNlZylcbiAgICAgIGNvbnRpbnVlXG4gICAgfVxuICB9XG5cbiAgaWYgKHBhcnRzLmxlbmd0aCA9PT0gMCkgcmV0dXJuICcqJ1xuICByZXR1cm4gcGFydHNcbn1cblxuZXhwb3J0IGNvbnN0IG11dGF0ZVdpdGhQYXRjaFBhdGhzID0gPFM+KFxuICBiYXNlOiBTLFxuICBtdXRhdG9yOiAoZHJhZnQ6IFMpID0+IHZvaWQsXG4pOiB7IHJlYWRvbmx5IG5leHRTdGF0ZTogUzsgcmVhZG9ubHkgcGF0Y2hQYXRoczogUmVhZG9ubHlBcnJheTxQYXRjaFBhdGggfCAnKic+IH0gPT4ge1xuICBjb25zdCBvdXQgPSBjcmVhdGUoYmFzZSwgbXV0YXRvciBhcyBhbnksIHtcbiAgICBlbmFibGVQYXRjaGVzOiB7XG4gICAgICBwYXRoQXNBcnJheTogdHJ1ZSxcbiAgICAgIGFycmF5TGVuZ3RoQXNzaWdubWVudDogZmFsc2UsXG4gICAgfSxcbiAgfSkgYXMgdW5rbm93blxuXG4gIGlmICghQXJyYXkuaXNBcnJheShvdXQpKSB7XG4gICAgcmV0dXJuIHsgbmV4dFN0YXRlOiBvdXQgYXMgUywgcGF0Y2hQYXRoczogW10gfVxuICB9XG5cbiAgY29uc3QgbmV4dFN0YXRlID0gb3V0WzBdIGFzIFNcbiAgY29uc3QgcGF0Y2hlcyA9IChvdXRbMV0gPz8gW10pIGFzIFBhdGNoZXM8eyBwYXRoQXNBcnJheTogdHJ1ZTsgYXJyYXlMZW5ndGhBc3NpZ25tZW50OiBmYWxzZSB9PlxuXG4gIGNvbnN0IGRlZHVwID0gbmV3IE1hcDxzdHJpbmcsIFBhdGNoUGF0aCB8ICcqJz4oKVxuICBmb3IgKGNvbnN0IHBhdGNoIG9mIHBhdGNoZXMpIHtcbiAgICBjb25zdCBwID0gdG9QYXRjaEZpZWxkUGF0aCgocGF0Y2ggYXMgYW55KT8ucGF0aClcbiAgICBpZiAoIXApIGNvbnRpbnVlXG4gICAgY29uc3Qga2V5ID0gcCA9PT0gJyonID8gJyonIDogSlNPTi5zdHJpbmdpZnkocClcbiAgICBpZiAoIWRlZHVwLmhhcyhrZXkpKSBkZWR1cC5zZXQoa2V5LCBwKVxuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBuZXh0U3RhdGUsXG4gICAgcGF0Y2hQYXRoczogQXJyYXkuZnJvbShkZWR1cC52YWx1ZXMoKSksXG4gIH1cbn1cbiIsICJpbXBvcnQgeyBDb250ZXh0LCBFZmZlY3QsIEZpYmVyUmVmLCBPcHRpb24sIFNjaGVtYSwgU3RyZWFtLCBTdWJzY3JpcHRpb25SZWYgfSBmcm9tICdlZmZlY3QnXG5pbXBvcnQgeyBjcmVhdGUgfSBmcm9tICdtdXRhdGl2ZSdcbmltcG9ydCB0eXBlICogYXMgTG9naXggZnJvbSAnLi9tb2R1bGUuanMnXG5pbXBvcnQgKiBhcyBMb2dpYyBmcm9tICcuL0xvZ2ljTWlkZGxld2FyZS5qcydcbmltcG9ydCAqIGFzIFRhc2tSdW5uZXIgZnJvbSAnLi9UYXNrUnVubmVyLmpzJ1xuaW1wb3J0IHsgbXV0YXRlV2l0aFBhdGNoUGF0aHMgfSBmcm9tICcuL211dGF0aXZlUGF0Y2hlcy5qcydcbmltcG9ydCAqIGFzIEZsb3dSdW50aW1lIGZyb20gJy4vRmxvd1J1bnRpbWUuanMnXG5pbXBvcnQgKiBhcyBNYXRjaEJ1aWxkZXIgZnJvbSAnLi9NYXRjaEJ1aWxkZXIuanMnXG5pbXBvcnQgKiBhcyBQbGF0Zm9ybSBmcm9tICcuL1BsYXRmb3JtLmpzJ1xuaW1wb3J0ICogYXMgTGlmZWN5Y2xlIGZyb20gJy4vTGlmZWN5Y2xlLmpzJ1xuaW1wb3J0ICogYXMgRGVidWcgZnJvbSAnLi9EZWJ1Z1NpbmsuanMnXG5pbXBvcnQgKiBhcyBMb2dpY0RpYWdub3N0aWNzIGZyb20gJy4vTG9naWNEaWFnbm9zdGljcy5qcydcbmltcG9ydCB7IGlzRGV2RW52IH0gZnJvbSAnLi9lbnYuanMnXG5pbXBvcnQgeyBSdW5TZXNzaW9uVGFnIH0gZnJvbSAnLi4vLi4vb2JzZXJ2YWJpbGl0eS9ydW5TZXNzaW9uLmpzJ1xuaW1wb3J0ICogYXMgUm9vdCBmcm9tICcuLi8uLi9yb290LmpzJ1xuaW1wb3J0IHR5cGUgeyBSdW50aW1lSW50ZXJuYWxzIH0gZnJvbSAnLi9SdW50aW1lSW50ZXJuYWxzLmpzJ1xuaW1wb3J0IHR5cGUgKiBhcyBNb2R1bGVUcmFpdHMgZnJvbSAnLi9Nb2R1bGVUcmFpdHMuanMnXG5pbXBvcnQgeyBnZXRSdW50aW1lSW50ZXJuYWxzLCBzZXRCb3VuZEludGVybmFscyB9IGZyb20gJy4vcnVudGltZUludGVybmFsc0FjY2Vzc29yLmpzJ1xuaW1wb3J0IHR5cGUgeyBBbnlNb2R1bGVTaGFwZSwgTW9kdWxlUnVudGltZSwgU3RhdGVPZiwgQWN0aW9uT2YgfSBmcm9tICcuL21vZHVsZS5qcydcblxuLy8gXHU2NzJDXHU1NzMwXHU2Nzg0XHU5MDIwIEludGVudEJ1aWxkZXIgXHU1REU1XHU1MzgyXHVGRjBDXHU3QjQ5XHU0RUY3XHU0RThFXHU1MzlGIGludGVybmFsL2RzbC9Mb2dpY0J1aWxkZXIubWFrZUludGVudEJ1aWxkZXJGYWN0b3J5XG5jb25zdCBMb2dpY0J1aWxkZXJGYWN0b3J5ID0gPFNoIGV4dGVuZHMgQW55TW9kdWxlU2hhcGUsIFIgPSBuZXZlcj4oXG4gIHJ1bnRpbWU6IE1vZHVsZVJ1bnRpbWU8U3RhdGVPZjxTaD4sIEFjdGlvbk9mPFNoPj4sXG4gIHJ1bnRpbWVJbnRlcm5hbHM6IFJ1bnRpbWVJbnRlcm5hbHMsXG4pID0+IHtcbiAgY29uc3QgZmxvd0FwaSA9IEZsb3dSdW50aW1lLm1ha2U8U2gsIFI+KHJ1bnRpbWUsIHJ1bnRpbWVJbnRlcm5hbHMpXG5cbiAgcmV0dXJuIDxUPihzdHJlYW06IFN0cmVhbS5TdHJlYW08VD4sIHRyaWdnZXJOYW1lPzogc3RyaW5nKTogTG9naWMuSW50ZW50QnVpbGRlcjxULCBTaCwgUj4gPT4ge1xuICAgIGNvbnN0IHJ1bldpdGhTdGF0ZVRyYW5zYWN0aW9uOiBUYXNrUnVubmVyLlRhc2tSdW5uZXJSdW50aW1lWydydW5XaXRoU3RhdGVUcmFuc2FjdGlvbiddID0gKG9yaWdpbiwgYm9keSkgPT5cbiAgICAgIHJ1bnRpbWVJbnRlcm5hbHMudHhuLnJ1bldpdGhTdGF0ZVRyYW5zYWN0aW9uKG9yaWdpbiBhcyBhbnksIGJvZHkpXG5cbiAgICBjb25zdCB0YXNrUnVubmVyUnVudGltZTogVGFza1J1bm5lci5UYXNrUnVubmVyUnVudGltZSA9IHtcbiAgICAgIG1vZHVsZUlkOiBydW50aW1lLm1vZHVsZUlkLFxuICAgICAgaW5zdGFuY2VJZDogcnVudGltZUludGVybmFscy5pbnN0YW5jZUlkLFxuICAgICAgcnVuV2l0aFN0YXRlVHJhbnNhY3Rpb24sXG4gICAgICByZXNvbHZlQ29uY3VycmVuY3lQb2xpY3k6IHJ1bnRpbWVJbnRlcm5hbHMuY29uY3VycmVuY3kucmVzb2x2ZUNvbmN1cnJlbmN5UG9saWN5LFxuICAgIH1cblxuICAgIGNvbnN0IGJ1aWxkZXIgPSB7XG4gICAgICBkZWJvdW5jZTogKG1zOiBudW1iZXIpID0+XG4gICAgICAgIExvZ2ljQnVpbGRlckZhY3Rvcnk8U2gsIFI+KHJ1bnRpbWUsIHJ1bnRpbWVJbnRlcm5hbHMpKGZsb3dBcGkuZGVib3VuY2U8VD4obXMpKHN0cmVhbSksIHRyaWdnZXJOYW1lKSxcbiAgICAgIHRocm90dGxlOiAobXM6IG51bWJlcikgPT5cbiAgICAgICAgTG9naWNCdWlsZGVyRmFjdG9yeTxTaCwgUj4ocnVudGltZSwgcnVudGltZUludGVybmFscykoZmxvd0FwaS50aHJvdHRsZTxUPihtcykoc3RyZWFtKSwgdHJpZ2dlck5hbWUpLFxuICAgICAgZmlsdGVyOiAocHJlZGljYXRlOiAodmFsdWU6IFQpID0+IGJvb2xlYW4pID0+XG4gICAgICAgIExvZ2ljQnVpbGRlckZhY3Rvcnk8U2gsIFI+KHJ1bnRpbWUsIHJ1bnRpbWVJbnRlcm5hbHMpKGZsb3dBcGkuZmlsdGVyKHByZWRpY2F0ZSkoc3RyZWFtKSwgdHJpZ2dlck5hbWUpLFxuICAgICAgbWFwOiA8VT4oZjogKHZhbHVlOiBUKSA9PiBVKSA9PlxuICAgICAgICBMb2dpY0J1aWxkZXJGYWN0b3J5PFNoLCBSPihydW50aW1lLCBydW50aW1lSW50ZXJuYWxzKShzdHJlYW0ucGlwZShTdHJlYW0ubWFwKGYpKSwgdHJpZ2dlck5hbWUpLFxuICAgICAgcnVuPEEgPSB2b2lkLCBFID0gbmV2ZXIsIFIyID0gdW5rbm93bj4oXG4gICAgICAgIGVmZjogTG9naWMuT2Y8U2gsIFIgJiBSMiwgQSwgRT4gfCAoKHA6IFQpID0+IExvZ2ljLk9mPFNoLCBSICYgUjIsIEEsIEU+KSxcbiAgICAgICAgb3B0aW9ucz86IExvZ2ljLk9wZXJhdGlvbk9wdGlvbnMsXG4gICAgICApOiBMb2dpYy5PZjxTaCwgUiAmIFIyLCB2b2lkLCBFPiB7XG4gICAgICAgIHJldHVybiBmbG93QXBpLnJ1bjxULCBBLCBFLCBSMj4oZWZmLCBvcHRpb25zKShzdHJlYW0pXG4gICAgICB9LFxuICAgICAgcnVuTGF0ZXN0PEEgPSB2b2lkLCBFID0gbmV2ZXIsIFIyID0gdW5rbm93bj4oXG4gICAgICAgIGVmZjogTG9naWMuT2Y8U2gsIFIgJiBSMiwgQSwgRT4gfCAoKHA6IFQpID0+IExvZ2ljLk9mPFNoLCBSICYgUjIsIEEsIEU+KSxcbiAgICAgICAgb3B0aW9ucz86IExvZ2ljLk9wZXJhdGlvbk9wdGlvbnMsXG4gICAgICApOiBMb2dpYy5PZjxTaCwgUiAmIFIyLCB2b2lkLCBFPiB7XG4gICAgICAgIHJldHVybiBmbG93QXBpLnJ1bkxhdGVzdDxULCBBLCBFLCBSMj4oZWZmLCBvcHRpb25zKShzdHJlYW0pXG4gICAgICB9LFxuICAgICAgcnVuRXhoYXVzdDxBID0gdm9pZCwgRSA9IG5ldmVyLCBSMiA9IHVua25vd24+KFxuICAgICAgICBlZmY6IExvZ2ljLk9mPFNoLCBSICYgUjIsIEEsIEU+IHwgKChwOiBUKSA9PiBMb2dpYy5PZjxTaCwgUiAmIFIyLCBBLCBFPiksXG4gICAgICAgIG9wdGlvbnM/OiBMb2dpYy5PcGVyYXRpb25PcHRpb25zLFxuICAgICAgKTogTG9naWMuT2Y8U2gsIFIgJiBSMiwgdm9pZCwgRT4ge1xuICAgICAgICByZXR1cm4gZmxvd0FwaS5ydW5FeGhhdXN0PFQsIEEsIEUsIFIyPihlZmYsIG9wdGlvbnMpKHN0cmVhbSlcbiAgICAgIH0sXG4gICAgICBydW5QYXJhbGxlbDxBID0gdm9pZCwgRSA9IG5ldmVyLCBSMiA9IHVua25vd24+KFxuICAgICAgICBlZmY6IExvZ2ljLk9mPFNoLCBSICYgUjIsIEEsIEU+IHwgKChwOiBUKSA9PiBMb2dpYy5PZjxTaCwgUiAmIFIyLCBBLCBFPiksXG4gICAgICAgIG9wdGlvbnM/OiBMb2dpYy5PcGVyYXRpb25PcHRpb25zLFxuICAgICAgKTogTG9naWMuT2Y8U2gsIFIgJiBSMiwgdm9pZCwgRT4ge1xuICAgICAgICByZXR1cm4gZmxvd0FwaS5ydW5QYXJhbGxlbDxULCBBLCBFLCBSMj4oZWZmLCBvcHRpb25zKShzdHJlYW0pXG4gICAgICB9LFxuICAgICAgcnVuRm9yazogPEEgPSB2b2lkLCBFID0gbmV2ZXIsIFIyID0gdW5rbm93bj4oXG4gICAgICAgIGVmZjogTG9naWMuT2Y8U2gsIFIgJiBSMiwgQSwgRT4gfCAoKHA6IFQpID0+IExvZ2ljLk9mPFNoLCBSICYgUjIsIEEsIEU+KSxcbiAgICAgICk6IExvZ2ljLk9mPFNoLCBSICYgUjIsIHZvaWQsIEU+ID0+XG4gICAgICAgIEVmZmVjdC5mb3JrU2NvcGVkKGZsb3dBcGkucnVuPFQsIEEsIEUsIFIyPihlZmYpKHN0cmVhbSkpLnBpcGUoRWZmZWN0LmFzVm9pZCkgYXMgTG9naWMuT2Y8U2gsIFIgJiBSMiwgdm9pZCwgRT4sXG4gICAgICBydW5QYXJhbGxlbEZvcms6IDxBID0gdm9pZCwgRSA9IG5ldmVyLCBSMiA9IHVua25vd24+KFxuICAgICAgICBlZmY6IExvZ2ljLk9mPFNoLCBSICYgUjIsIEEsIEU+IHwgKChwOiBUKSA9PiBMb2dpYy5PZjxTaCwgUiAmIFIyLCBBLCBFPiksXG4gICAgICApOiBMb2dpYy5PZjxTaCwgUiAmIFIyLCB2b2lkLCBFPiA9PlxuICAgICAgICBFZmZlY3QuZm9ya1Njb3BlZChmbG93QXBpLnJ1blBhcmFsbGVsPFQsIEEsIEUsIFIyPihlZmYpKHN0cmVhbSkpLnBpcGUoRWZmZWN0LmFzVm9pZCkgYXMgTG9naWMuT2Y8XG4gICAgICAgICAgU2gsXG4gICAgICAgICAgUiAmIFIyLFxuICAgICAgICAgIHZvaWQsXG4gICAgICAgICAgRVxuICAgICAgICA+LFxuICAgICAgcnVuVGFzazogPEEgPSB2b2lkLCBFID0gbmV2ZXIsIFIyID0gdW5rbm93bj4oXG4gICAgICAgIGNvbmZpZzogVGFza1J1bm5lci5UYXNrUnVubmVyQ29uZmlnPFQsIFNoLCBSICYgUjIsIEEsIEU+LFxuICAgICAgKTogTG9naWMuT2Y8U2gsIFIgJiBSMiwgdm9pZCwgbmV2ZXI+ID0+XG4gICAgICAgIFRhc2tSdW5uZXIubWFrZVRhc2tSdW5uZXI8VCwgU2gsIFIgJiBSMiwgQSwgRT4oc3RyZWFtLCAndGFzaycsIHRhc2tSdW5uZXJSdW50aW1lLCB7XG4gICAgICAgICAgLi4uY29uZmlnLFxuICAgICAgICAgIHRyaWdnZXJOYW1lOiBjb25maWcudHJpZ2dlck5hbWUgPz8gdHJpZ2dlck5hbWUsXG4gICAgICAgIH0pIGFzIExvZ2ljLk9mPFNoLCBSICYgUjIsIHZvaWQsIG5ldmVyPixcbiAgICAgIHJ1blBhcmFsbGVsVGFzazogPEEgPSB2b2lkLCBFID0gbmV2ZXIsIFIyID0gdW5rbm93bj4oXG4gICAgICAgIGNvbmZpZzogVGFza1J1bm5lci5UYXNrUnVubmVyQ29uZmlnPFQsIFNoLCBSICYgUjIsIEEsIEU+LFxuICAgICAgKTogTG9naWMuT2Y8U2gsIFIgJiBSMiwgdm9pZCwgbmV2ZXI+ID0+XG4gICAgICAgIFRhc2tSdW5uZXIubWFrZVRhc2tSdW5uZXI8VCwgU2gsIFIgJiBSMiwgQSwgRT4oc3RyZWFtLCAncGFyYWxsZWwnLCB0YXNrUnVubmVyUnVudGltZSwge1xuICAgICAgICAgIC4uLmNvbmZpZyxcbiAgICAgICAgICB0cmlnZ2VyTmFtZTogY29uZmlnLnRyaWdnZXJOYW1lID8/IHRyaWdnZXJOYW1lLFxuICAgICAgICB9KSBhcyBMb2dpYy5PZjxTaCwgUiAmIFIyLCB2b2lkLCBuZXZlcj4sXG4gICAgICBydW5MYXRlc3RUYXNrOiA8QSA9IHZvaWQsIEUgPSBuZXZlciwgUjIgPSB1bmtub3duPihcbiAgICAgICAgY29uZmlnOiBUYXNrUnVubmVyLlRhc2tSdW5uZXJDb25maWc8VCwgU2gsIFIgJiBSMiwgQSwgRT4sXG4gICAgICApOiBMb2dpYy5PZjxTaCwgUiAmIFIyLCB2b2lkLCBuZXZlcj4gPT5cbiAgICAgICAgVGFza1J1bm5lci5tYWtlVGFza1J1bm5lcjxULCBTaCwgUiAmIFIyLCBBLCBFPihzdHJlYW0sICdsYXRlc3QnLCB0YXNrUnVubmVyUnVudGltZSwge1xuICAgICAgICAgIC4uLmNvbmZpZyxcbiAgICAgICAgICB0cmlnZ2VyTmFtZTogY29uZmlnLnRyaWdnZXJOYW1lID8/IHRyaWdnZXJOYW1lLFxuICAgICAgICB9KSBhcyBMb2dpYy5PZjxTaCwgUiAmIFIyLCB2b2lkLCBuZXZlcj4sXG4gICAgICBydW5FeGhhdXN0VGFzazogPEEgPSB2b2lkLCBFID0gbmV2ZXIsIFIyID0gdW5rbm93bj4oXG4gICAgICAgIGNvbmZpZzogVGFza1J1bm5lci5UYXNrUnVubmVyQ29uZmlnPFQsIFNoLCBSICYgUjIsIEEsIEU+LFxuICAgICAgKTogTG9naWMuT2Y8U2gsIFIgJiBSMiwgdm9pZCwgbmV2ZXI+ID0+XG4gICAgICAgIFRhc2tSdW5uZXIubWFrZVRhc2tSdW5uZXI8VCwgU2gsIFIgJiBSMiwgQSwgRT4oc3RyZWFtLCAnZXhoYXVzdCcsIHRhc2tSdW5uZXJSdW50aW1lLCB7XG4gICAgICAgICAgLi4uY29uZmlnLFxuICAgICAgICAgIHRyaWdnZXJOYW1lOiBjb25maWcudHJpZ2dlck5hbWUgPz8gdHJpZ2dlck5hbWUsXG4gICAgICAgIH0pIGFzIExvZ2ljLk9mPFNoLCBSICYgUjIsIHZvaWQsIG5ldmVyPixcbiAgICAgIHRvU3RyZWFtOiAoKSA9PiBzdHJlYW0sXG4gICAgICB1cGRhdGU6IChcbiAgICAgICAgcmVkdWNlcjogKHByZXY6IFN0YXRlT2Y8U2g+LCBwYXlsb2FkOiBUKSA9PiBTdGF0ZU9mPFNoPiB8IEVmZmVjdC5FZmZlY3Q8U3RhdGVPZjxTaD4sIGFueSwgYW55PixcbiAgICAgICk6IExvZ2ljLk9mPFNoLCBSLCB2b2lkLCBuZXZlcj4gPT5cbiAgICAgICAgU3RyZWFtLnJ1bkZvckVhY2goc3RyZWFtLCAocGF5bG9hZCkgPT5cbiAgICAgICAgICB0YXNrUnVubmVyUnVudGltZS5ydW5XaXRoU3RhdGVUcmFuc2FjdGlvbihcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAga2luZDogJ3dhdGNoZXI6dXBkYXRlJyxcbiAgICAgICAgICAgICAgbmFtZTogdHJpZ2dlck5hbWUsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgKCkgPT5cbiAgICAgICAgICAgICAgRWZmZWN0LmdlbihmdW5jdGlvbiogKCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHByZXYgPSAoeWllbGQqIHJ1bnRpbWUuZ2V0U3RhdGUpIGFzIFN0YXRlT2Y8U2g+XG4gICAgICAgICAgICAgICAgY29uc3QgbmV4dCA9IHJlZHVjZXIocHJldiwgcGF5bG9hZClcbiAgICAgICAgICAgICAgICBpZiAoRWZmZWN0LmlzRWZmZWN0KG5leHQpKSB7XG4gICAgICAgICAgICAgICAgICBjb25zdCBleGl0ID0geWllbGQqIEVmZmVjdC5leGl0KG5leHQgYXMgRWZmZWN0LkVmZmVjdDxTdGF0ZU9mPFNoPiwgYW55LCBhbnk+KVxuICAgICAgICAgICAgICAgICAgaWYgKGV4aXQuX3RhZyA9PT0gJ0ZhaWx1cmUnKSB7XG4gICAgICAgICAgICAgICAgICAgIHlpZWxkKiBFZmZlY3QubG9nRXJyb3IoJ0Zsb3cgZXJyb3InLCBleGl0LmNhdXNlKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIHlpZWxkKiBydW50aW1lLnNldFN0YXRlKGV4aXQudmFsdWUgYXMgU3RhdGVPZjxTaD4pXG4gICAgICAgICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgeWllbGQqIHJ1bnRpbWUuc2V0U3RhdGUobmV4dCBhcyBTdGF0ZU9mPFNoPilcbiAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgKSxcbiAgICAgICAgKS5waXBlKEVmZmVjdC5jYXRjaEFsbENhdXNlKChjYXVzZSkgPT4gRWZmZWN0LmxvZ0Vycm9yKCdGbG93IGVycm9yJywgY2F1c2UpKSkgYXMgTG9naWMuT2Y8U2gsIFIsIHZvaWQsIG5ldmVyPixcbiAgICAgIG11dGF0ZTogKHJlZHVjZXI6IChkcmFmdDogTG9naWMuRHJhZnQ8U3RhdGVPZjxTaD4+LCBwYXlsb2FkOiBUKSA9PiB2b2lkKTogTG9naWMuT2Y8U2gsIFIsIHZvaWQsIG5ldmVyPiA9PlxuICAgICAgICBTdHJlYW0ucnVuRm9yRWFjaChzdHJlYW0sIChwYXlsb2FkKSA9PlxuICAgICAgICAgIHRhc2tSdW5uZXJSdW50aW1lLnJ1bldpdGhTdGF0ZVRyYW5zYWN0aW9uKFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBraW5kOiAnd2F0Y2hlcjptdXRhdGUnLFxuICAgICAgICAgICAgICBuYW1lOiB0cmlnZ2VyTmFtZSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAoKSA9PlxuICAgICAgICAgICAgICBFZmZlY3QuZ2VuKGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcHJldiA9ICh5aWVsZCogcnVudGltZS5nZXRTdGF0ZSkgYXMgU3RhdGVPZjxTaD5cbiAgICAgICAgICAgICAgICBjb25zdCByZWNvcmRQYXRjaCA9IHJ1bnRpbWVJbnRlcm5hbHM/LnR4bi5yZWNvcmRTdGF0ZVBhdGNoXG5cbiAgICAgICAgICAgICAgICBjb25zdCB7IG5leHRTdGF0ZSwgcGF0Y2hQYXRocyB9ID0gbXV0YXRlV2l0aFBhdGNoUGF0aHMocHJldiBhcyBTdGF0ZU9mPFNoPiwgKGRyYWZ0KSA9PiB7XG4gICAgICAgICAgICAgICAgICByZWR1Y2VyKGRyYWZ0IGFzIExvZ2ljLkRyYWZ0PFN0YXRlT2Y8U2g+PiwgcGF5bG9hZClcbiAgICAgICAgICAgICAgICB9KVxuXG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBwYXRoIG9mIHBhdGNoUGF0aHMpIHtcbiAgICAgICAgICAgICAgICAgIHJlY29yZFBhdGNoPy4ocGF0aCwgJ3dhdGNoZXI6bXV0YXRlJylcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB5aWVsZCogcnVudGltZS5zZXRTdGF0ZShuZXh0U3RhdGUpXG4gICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICksXG4gICAgICAgICkucGlwZShFZmZlY3QuY2F0Y2hBbGxDYXVzZSgoY2F1c2UpID0+IEVmZmVjdC5sb2dFcnJvcignRmxvdyBlcnJvcicsIGNhdXNlKSkpIGFzIExvZ2ljLk9mPFNoLCBSLCB2b2lkLCBuZXZlcj4sXG4gICAgfSBhcyBPbWl0PExvZ2ljLkludGVudEJ1aWxkZXI8VCwgU2gsIFI+LCAncGlwZScgfCAnYW5kVGhlbic+XG5cbiAgICBjb25zdCBhbmRUaGVuOiBMb2dpYy5JbnRlbnRCdWlsZGVyPFQsIFNoLCBSPlsnYW5kVGhlbiddID0gKGhhbmRsZXJPckVmZjogYW55KTogYW55ID0+IHtcbiAgICAgIGlmICh0eXBlb2YgaGFuZGxlck9yRWZmID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIGlmIChoYW5kbGVyT3JFZmYubGVuZ3RoID49IDIpIHtcbiAgICAgICAgICByZXR1cm4gKGJ1aWxkZXIgYXMgYW55KS51cGRhdGUoaGFuZGxlck9yRWZmKVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiAoYnVpbGRlciBhcyBhbnkpLnJ1bihoYW5kbGVyT3JFZmYpXG4gICAgICB9XG4gICAgICByZXR1cm4gKGJ1aWxkZXIgYXMgYW55KS5ydW4oaGFuZGxlck9yRWZmKVxuICAgIH1cblxuICAgIGNvbnN0IHBpcGU6IExvZ2ljLkludGVudEJ1aWxkZXI8VCwgU2gsIFI+WydwaXBlJ10gPSBmdW5jdGlvbiAodGhpczogdW5rbm93bikge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHByZWZlci1yZXN0LXBhcmFtc1xuICAgICAgY29uc3QgZm5zID0gYXJndW1lbnRzIGFzIHVua25vd24gYXMgUmVhZG9ubHlBcnJheTxcbiAgICAgICAgKHNlbGY6IExvZ2ljLkludGVudEJ1aWxkZXI8VCwgU2gsIFI+KSA9PiBMb2dpYy5JbnRlbnRCdWlsZGVyPFQsIFNoLCBSPlxuICAgICAgPlxuICAgICAgbGV0IGFjYzogTG9naWMuSW50ZW50QnVpbGRlcjxULCBTaCwgUj4gPSBidWlsZGVyIGFzIExvZ2ljLkludGVudEJ1aWxkZXI8VCwgU2gsIFI+XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGZucy5sZW5ndGg7IGkrKykge1xuICAgICAgICBhY2MgPSBmbnNbaV0oYWNjKVxuICAgICAgfVxuICAgICAgcmV0dXJuIGFjY1xuICAgIH1cblxuICAgIHJldHVybiBPYmplY3QuYXNzaWduKGJ1aWxkZXIsIHsgcGlwZSwgYW5kVGhlbiB9KSBhcyBMb2dpYy5JbnRlbnRCdWlsZGVyPFQsIFNoLCBSPlxuICB9XG59XG5pbXBvcnQgdHlwZSB7IEJvdW5kQXBpIH0gZnJvbSAnLi9tb2R1bGUuanMnXG5cbi8qKlxuICogQm91bmRBcGkgXHU1QjlFXHU3M0IwXHVGRjFBXHU0RTNBXHU2N0QwXHU0RTAwXHU3QzdCIFN0b3JlIFNoYXBlICsgUnVudGltZSBcdTUyMUJcdTVFRkFcdTk4ODRcdTdFRDFcdTVCOUFcdTc2ODQgYCRgXHUzMDAyXG4gKlxuICogXHU4QkY0XHU2NjBFXHVGRjFBXHU3QzdCXHU1NzhCXHU0RTBFXHU1MTY1XHU1M0UzXHU3QjdFXHU1NDBEXHU1NzI4IGFwaS9Cb3VuZEFwaS50cyBcdTRFMkRcdTU4RjBcdTY2MEVcdUZGMENcdThGRDlcdTkxQ0NcdTUzRUFcdTYyN0ZcdThGN0RcdTUxNzdcdTRGNTNcdTVCOUVcdTczQjBcdTMwMDJcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1ha2U8U2ggZXh0ZW5kcyBMb2dpeC5BbnlNb2R1bGVTaGFwZSwgUiA9IG5ldmVyPihcbiAgc2hhcGU6IFNoLFxuICBydW50aW1lOiBMb2dpeC5Nb2R1bGVSdW50aW1lPExvZ2l4LlN0YXRlT2Y8U2g+LCBMb2dpeC5BY3Rpb25PZjxTaD4+LFxuICBvcHRpb25zPzoge1xuICAgIHJlYWRvbmx5IGdldFBoYXNlPzogKCkgPT4gJ3NldHVwJyB8ICdydW4nXG4gICAgcmVhZG9ubHkgcGhhc2VTZXJ2aWNlPzogTG9naWNEaWFnbm9zdGljcy5Mb2dpY1BoYXNlU2VydmljZVxuICAgIHJlYWRvbmx5IG1vZHVsZUlkPzogc3RyaW5nXG4gICAgcmVhZG9ubHkgbG9naWNVbml0PzogTG9naWNEaWFnbm9zdGljcy5Mb2dpY1VuaXRTZXJ2aWNlXG4gIH0sXG4pOiBCb3VuZEFwaTxTaCwgUj4ge1xuICBjb25zdCBydW50aW1lSW50ZXJuYWxzID0gZ2V0UnVudGltZUludGVybmFscyhydW50aW1lIGFzIGFueSlcblxuICBjb25zdCBnZXRQaGFzZSA9IG9wdGlvbnM/LmdldFBoYXNlID8/ICgoKSA9PiAncnVuJylcbiAgY29uc3QgZ2V0Q3VycmVudFBoYXNlID0gKCk6ICdzZXR1cCcgfCAncnVuJyA9PiB7XG4gICAgY29uc3QgcGhhc2VTZXJ2aWNlID0gb3B0aW9ucz8ucGhhc2VTZXJ2aWNlXG4gICAgY29uc3QgcGhhc2UgPSBwaGFzZVNlcnZpY2U/LmN1cnJlbnQgPz8gZ2V0UGhhc2UoKVxuICAgIHJldHVybiBwaGFzZSA9PT0gJ3NldHVwJyA/ICdzZXR1cCcgOiAncnVuJ1xuICB9XG4gIGNvbnN0IGd1YXJkUnVuT25seSA9IChraW5kOiBzdHJpbmcsIGFwaTogc3RyaW5nKSA9PiB7XG4gICAgY29uc3QgcGhhc2VTZXJ2aWNlID0gb3B0aW9ucz8ucGhhc2VTZXJ2aWNlXG4gICAgY29uc3QgcGhhc2UgPSBwaGFzZVNlcnZpY2U/LmN1cnJlbnQgPz8gZ2V0UGhhc2UoKVxuICAgIGlmIChwaGFzZSA9PT0gJ3NldHVwJykge1xuICAgICAgdGhyb3cgTG9naWNEaWFnbm9zdGljcy5tYWtlTG9naWNQaGFzZUVycm9yKGtpbmQsIGFwaSwgJ3NldHVwJywgb3B0aW9ucz8ubW9kdWxlSWQpXG4gICAgfVxuICB9XG4gIGNvbnN0IGZsb3dBcGkgPSBGbG93UnVudGltZS5tYWtlPFNoLCBSPihydW50aW1lLCBydW50aW1lSW50ZXJuYWxzKVxuXG4gIGNvbnN0IG1ha2VJbnRlbnRCdWlsZGVyID0gKHJ1bnRpbWVfOiBMb2dpeC5Nb2R1bGVSdW50aW1lPGFueSwgYW55PikgPT5cbiAgICBMb2dpY0J1aWxkZXJGYWN0b3J5PFNoLCBSPihydW50aW1lXywgcnVudGltZUludGVybmFscylcbiAgY29uc3Qgd2l0aExpZmVjeWNsZSA9IDxBPihcbiAgICBhdmFpbGFibGU6IChtYW5hZ2VyOiBMaWZlY3ljbGUuTGlmZWN5Y2xlTWFuYWdlcikgPT4gRWZmZWN0LkVmZmVjdDxBLCBuZXZlciwgYW55PixcbiAgICBtaXNzaW5nOiAoKSA9PiBFZmZlY3QuRWZmZWN0PEEsIG5ldmVyLCBhbnk+LFxuICApID0+XG4gICAgRWZmZWN0LnNlcnZpY2VPcHRpb24oTGlmZWN5Y2xlLkxpZmVjeWNsZUNvbnRleHQpLnBpcGUoXG4gICAgICBFZmZlY3QuZmxhdE1hcCgobWF5YmUpID0+XG4gICAgICAgIE9wdGlvbi5tYXRjaChtYXliZSwge1xuICAgICAgICAgIG9uU29tZTogYXZhaWxhYmxlLFxuICAgICAgICAgIG9uTm9uZTogbWlzc2luZyxcbiAgICAgICAgfSksXG4gICAgICApLFxuICAgIClcbiAgY29uc3Qgd2l0aFBsYXRmb3JtID0gKGludm9rZTogKHBsYXRmb3JtOiBQbGF0Zm9ybS5TZXJ2aWNlKSA9PiBFZmZlY3QuRWZmZWN0PHZvaWQsIG5ldmVyLCBhbnk+KSA9PlxuICAgIEVmZmVjdC5zZXJ2aWNlT3B0aW9uKFBsYXRmb3JtLlRhZykucGlwZShcbiAgICAgIEVmZmVjdC5mbGF0TWFwKChtYXliZSkgPT5cbiAgICAgICAgT3B0aW9uLm1hdGNoKG1heWJlLCB7XG4gICAgICAgICAgb25Tb21lOiBpbnZva2UsXG4gICAgICAgICAgb25Ob25lOiAoKSA9PiBFZmZlY3Qudm9pZCxcbiAgICAgICAgfSksXG4gICAgICApLFxuICAgIClcblxuICBjb25zdCBlbWl0U2V0dXBPbmx5VmlvbGF0aW9uID0gKGFwaTogc3RyaW5nKTogRWZmZWN0LkVmZmVjdDx2b2lkPiA9PlxuICAgIERlYnVnLnJlY29yZCh7XG4gICAgICB0eXBlOiAnZGlhZ25vc3RpYycsXG4gICAgICBtb2R1bGVJZDogcnVudGltZS5tb2R1bGVJZCxcbiAgICAgIGluc3RhbmNlSWQ6IHJ1bnRpbWUuaW5zdGFuY2VJZCxcbiAgICAgIGNvZGU6ICdsb2dpYzo6aW52YWxpZF9waGFzZScsXG4gICAgICBzZXZlcml0eTogJ2Vycm9yJyxcbiAgICAgIG1lc3NhZ2U6IGAke2FwaX0gaXMgc2V0dXAtb25seSBhbmQgaXMgbm90IGFsbG93ZWQgaW4gcnVuIHBoYXNlLmAsXG4gICAgICBoaW50OlxuICAgICAgICAnTW92ZSAkLmxpZmVjeWNsZS4qIGNhbGxzIHRvIHRoZSBzeW5jaHJvbm91cyBwYXJ0IG9mIE1vZHVsZS5sb2dpYyBidWlsZGVyIChiZWZvcmUgcmV0dXJuKSBmb3IgcmVnaXN0cmF0aW9uOyAnICtcbiAgICAgICAgJ2ZvciBkeW5hbWljIHJlc291cmNlIGNsZWFudXAgaW4gdGhlIHJ1biBwaGFzZSwgdXNlIEVmZmVjdC5hY3F1aXJlUmVsZWFzZSAvIFNjb3BlIGZpbmFsaXplciBpbnN0ZWFkIG9mIHJlZ2lzdGVyaW5nIG9uRGVzdHJveSBsYXRlLicsXG4gICAgICBraW5kOiAnbGlmZWN5Y2xlX2luX3J1bicsXG4gICAgfSlcblxuICBjb25zdCBjcmVhdGVJbnRlbnRCdWlsZGVyID0gPFQ+KHN0cmVhbTogU3RyZWFtLlN0cmVhbTxUPiwgdHJpZ2dlck5hbWU/OiBzdHJpbmcpID0+XG4gICAgbWFrZUludGVudEJ1aWxkZXIocnVudGltZSkoc3RyZWFtLCB0cmlnZ2VyTmFtZSlcblxuICBjb25zdCBvbmNlSW5SdW5TZXNzaW9uID0gKGtleTogc3RyaW5nKTogRWZmZWN0LkVmZmVjdDxib29sZWFuLCBuZXZlciwgYW55PiA9PlxuICAgIEVmZmVjdC5zZXJ2aWNlT3B0aW9uKFJ1blNlc3Npb25UYWcpLnBpcGUoXG4gICAgICBFZmZlY3QubWFwKChtYXliZSkgPT4gKE9wdGlvbi5pc1NvbWUobWF5YmUpID8gbWF5YmUudmFsdWUubG9jYWwub25jZShrZXkpIDogdHJ1ZSkpLFxuICAgIClcblxuICBsZXQgY2FjaGVkRGlhZ25vc3RpY3NMZXZlbDogRGVidWcuRGlhZ25vc3RpY3NMZXZlbCB8IHVuZGVmaW5lZFxuXG4gIGNvbnN0IGlzTW9kdWxlTGlrZSA9IChcbiAgICB2YWx1ZTogdW5rbm93bixcbiAgKTogdmFsdWUgaXMge1xuICAgIHJlYWRvbmx5IF9raW5kOiAnTW9kdWxlRGVmJyB8ICdNb2R1bGUnXG4gICAgcmVhZG9ubHkgaWQ6IHN0cmluZ1xuICAgIHJlYWRvbmx5IHRhZzogQ29udGV4dC5UYWc8YW55LCBMb2dpeC5Nb2R1bGVSdW50aW1lPGFueSwgYW55Pj5cbiAgICByZWFkb25seSBzY2hlbWFzPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj5cbiAgICByZWFkb25seSBtZXRhPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj5cbiAgICByZWFkb25seSBkZXY/OiB7IHJlYWRvbmx5IHNvdXJjZT86IHsgcmVhZG9ubHkgZmlsZTogc3RyaW5nOyByZWFkb25seSBsaW5lOiBudW1iZXI7IHJlYWRvbmx5IGNvbHVtbjogbnVtYmVyIH0gfVxuICB9ID0+XG4gICAgQm9vbGVhbihcbiAgICAgIHZhbHVlICYmXG4gICAgICB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmXG4gICAgICAoKHZhbHVlIGFzIGFueSkuX2tpbmQgPT09ICdNb2R1bGVEZWYnIHx8ICh2YWx1ZSBhcyBhbnkpLl9raW5kID09PSAnTW9kdWxlJykgJiZcbiAgICAgICd0YWcnIGluICh2YWx1ZSBhcyBvYmplY3QpICYmXG4gICAgICBDb250ZXh0LmlzVGFnKCh2YWx1ZSBhcyBhbnkpLnRhZyksXG4gICAgKVxuXG4gIGNvbnN0IGJ1aWxkTW9kdWxlSGFuZGxlID0gKFxuICAgIHRhZzogQ29udGV4dC5UYWc8YW55LCBMb2dpeC5Nb2R1bGVSdW50aW1lPGFueSwgYW55Pj4sXG4gICAgcnQ6IExvZ2l4Lk1vZHVsZVJ1bnRpbWU8YW55LCBhbnk+LFxuICApOiB1bmtub3duID0+IHtcbiAgICBjb25zdCBhY3Rpb25zUHJveHk6IExvZ2l4Lk1vZHVsZUhhbmRsZTxhbnk+WydhY3Rpb25zJ10gPSBuZXcgUHJveHkoXG4gICAgICB7fSxcbiAgICAgIHtcbiAgICAgICAgZ2V0OiAoX3RhcmdldCwgcHJvcCkgPT4gKHBheWxvYWQ6IHVua25vd24pID0+XG4gICAgICAgICAgcnQuZGlzcGF0Y2goe1xuICAgICAgICAgICAgX3RhZzogcHJvcCBhcyBzdHJpbmcsXG4gICAgICAgICAgICBwYXlsb2FkLFxuICAgICAgICAgIH0pLFxuICAgICAgfSxcbiAgICApIGFzIExvZ2l4Lk1vZHVsZUhhbmRsZTxhbnk+WydhY3Rpb25zJ11cblxuICAgIGNvbnN0IGhhbmRsZTogTG9naXguTW9kdWxlSGFuZGxlPGFueT4gPSB7XG4gICAgICByZWFkOiAoc2VsZWN0b3IpID0+IEVmZmVjdC5tYXAocnQuZ2V0U3RhdGUsIHNlbGVjdG9yKSxcbiAgICAgIGNoYW5nZXM6IHJ0LmNoYW5nZXMsXG4gICAgICBkaXNwYXRjaDogcnQuZGlzcGF0Y2gsXG4gICAgICBhY3Rpb25zJDogcnQuYWN0aW9ucyQsXG4gICAgICBhY3Rpb25zOiBhY3Rpb25zUHJveHksXG4gICAgfVxuXG4gICAgY29uc3QgRVhURU5EX0hBTkRMRSA9IFN5bWJvbC5mb3IoJ2xvZ2l4Lm1vZHVsZS5oYW5kbGUuZXh0ZW5kJylcbiAgICBjb25zdCBleHRlbmQgPSAodGFnIGFzIGFueSk/LltFWFRFTkRfSEFORExFXSBhc1xuICAgICAgfCAoKHJ1bnRpbWU6IExvZ2l4Lk1vZHVsZVJ1bnRpbWU8YW55LCBhbnk+LCBiYXNlOiBMb2dpeC5Nb2R1bGVIYW5kbGU8YW55PikgPT4gdW5rbm93bilcbiAgICAgIHwgdW5kZWZpbmVkXG5cbiAgICByZXR1cm4gdHlwZW9mIGV4dGVuZCA9PT0gJ2Z1bmN0aW9uJyA/IChleHRlbmQocnQsIGhhbmRsZSkgPz8gaGFuZGxlKSA6IGhhbmRsZVxuICB9XG5cbiAgY29uc3QgZW1pdE1vZHVsZURlc2NyaXB0b3JPbmNlID0gKFxuICAgIG1vZHVsZToge1xuICAgICAgcmVhZG9ubHkgaWQ6IHN0cmluZ1xuICAgICAgcmVhZG9ubHkgdGFnOiBhbnlcbiAgICAgIHJlYWRvbmx5IHNjaGVtYXM/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuICAgICAgcmVhZG9ubHkgbWV0YT86IFJlY29yZDxzdHJpbmcsIHVua25vd24+XG4gICAgICByZWFkb25seSBkZXY/OiB7IHJlYWRvbmx5IHNvdXJjZT86IHsgcmVhZG9ubHkgZmlsZTogc3RyaW5nOyByZWFkb25seSBsaW5lOiBudW1iZXI7IHJlYWRvbmx5IGNvbHVtbjogbnVtYmVyIH0gfVxuICAgIH0sXG4gICAgcnQ6IExvZ2l4Lk1vZHVsZVJ1bnRpbWU8YW55LCBhbnk+LFxuICApOiBFZmZlY3QuRWZmZWN0PHZvaWQsIG5ldmVyLCBhbnk+ID0+XG4gICAgRWZmZWN0LmdlbihmdW5jdGlvbiogKCkge1xuICAgICAgLy8gXHU0RTNBIGhvdC1wYXRoIFx1NTE1Q1x1NUU5NVx1RkYxQVx1OEJDQVx1NjVBRFx1N0VBN1x1NTIyQlx1NEUzQSBvZmYgXHU2NUY2XHU2QzM4XHU0RTBEXHU1M0QxXHU0RThCXHU0RUY2XHUzMDAyXG4gICAgICBpZiAoY2FjaGVkRGlhZ25vc3RpY3NMZXZlbCA9PT0gJ29mZicpIHJldHVyblxuXG4gICAgICBjb25zdCBrZXkgPSBgbW9kdWxlX2Rlc2NyaXB0b3I6JHtTdHJpbmcocnQuaW5zdGFuY2VJZCA/PyAndW5rbm93bicpfWBcbiAgICAgIGNvbnN0IHNob3VsZEVtaXQgPSB5aWVsZCogb25jZUluUnVuU2Vzc2lvbihrZXkpXG4gICAgICBpZiAoIXNob3VsZEVtaXQpIHJldHVyblxuXG4gICAgICBjb25zdCBhY3Rpb25LZXlzID0gT2JqZWN0LmtleXMoKG1vZHVsZS50YWcgYXMgYW55KT8uc2hhcGU/LmFjdGlvbk1hcCA/PyB7fSlcblxuICAgICAgY29uc3QgaW50ZXJuYWxTeW1ib2wgPSBTeW1ib2wuZm9yKCdsb2dpeC5tb2R1bGUuaW50ZXJuYWwnKVxuICAgICAgY29uc3QgaW50ZXJuYWwgPSAobW9kdWxlIGFzIGFueSlbaW50ZXJuYWxTeW1ib2xdIGFzIHsgcmVhZG9ubHkgbW91bnRlZD86IFJlYWRvbmx5QXJyYXk8YW55PiB9IHwgdW5kZWZpbmVkXG5cbiAgICAgIGNvbnN0IGxvZ2ljVW5pdHMgPSAoaW50ZXJuYWw/Lm1vdW50ZWQgPz8gW10pLm1hcCgodTogYW55KSA9PiAoe1xuICAgICAgICBraW5kOiBTdHJpbmcodT8ua2luZCA/PyAndXNlcicpLFxuICAgICAgICBpZDogU3RyaW5nKHU/LmlkID8/ICcnKSxcbiAgICAgICAgZGVyaXZlZDogdT8uZGVyaXZlZCA/IHRydWUgOiB1bmRlZmluZWQsXG4gICAgICAgIG5hbWU6IHR5cGVvZiB1Py5uYW1lID09PSAnc3RyaW5nJyA/IHUubmFtZSA6IHVuZGVmaW5lZCxcbiAgICAgIH0pKVxuXG4gICAgICBjb25zdCBzY2hlbWFLZXlzID0gbW9kdWxlLnNjaGVtYXMgJiYgdHlwZW9mIG1vZHVsZS5zY2hlbWFzID09PSAnb2JqZWN0JyA/IE9iamVjdC5rZXlzKG1vZHVsZS5zY2hlbWFzKSA6IHVuZGVmaW5lZFxuXG4gICAgICBjb25zdCBtZXRhID0gbW9kdWxlLm1ldGEgJiYgdHlwZW9mIG1vZHVsZS5tZXRhID09PSAnb2JqZWN0JyA/IG1vZHVsZS5tZXRhIDogdW5kZWZpbmVkXG5cbiAgICAgIGNvbnN0IHNvdXJjZSA9IG1vZHVsZS5kZXY/LnNvdXJjZVxuXG4gICAgICBjb25zdCB0cmFpdHNTbmFwc2hvdCA9IHJ1bnRpbWVJbnRlcm5hbHMudHJhaXRzLmdldE1vZHVsZVRyYWl0c1NuYXBzaG90KClcbiAgICAgIGNvbnN0IHRyYWl0cyA9IHRyYWl0c1NuYXBzaG90XG4gICAgICAgID8ge1xuICAgICAgICAgICAgZGlnZXN0OiB0cmFpdHNTbmFwc2hvdC5kaWdlc3QsXG4gICAgICAgICAgICBjb3VudDogdHJhaXRzU25hcHNob3QudHJhaXRzLmxlbmd0aCxcbiAgICAgICAgICB9XG4gICAgICAgIDogdW5kZWZpbmVkXG5cbiAgICAgIGNvbnN0IGRhdGEgPSB7XG4gICAgICAgIGlkOiBtb2R1bGUuaWQsXG4gICAgICAgIG1vZHVsZUlkOiBTdHJpbmcocnQubW9kdWxlSWQpLFxuICAgICAgICBpbnN0YW5jZUlkOiBTdHJpbmcocnQuaW5zdGFuY2VJZCksXG4gICAgICAgIGFjdGlvbktleXMsXG4gICAgICAgIGxvZ2ljVW5pdHMsXG4gICAgICAgIHNjaGVtYUtleXMsXG4gICAgICAgIG1ldGEsXG4gICAgICAgIHNvdXJjZSxcbiAgICAgICAgdHJhaXRzLFxuICAgICAgfVxuXG4gICAgICB5aWVsZCogRGVidWcucmVjb3JkKHtcbiAgICAgICAgdHlwZTogJ3RyYWNlOm1vZHVsZTpkZXNjcmlwdG9yJyxcbiAgICAgICAgbW9kdWxlSWQ6IHJ0Lm1vZHVsZUlkLFxuICAgICAgICBpbnN0YW5jZUlkOiBydC5pbnN0YW5jZUlkLFxuICAgICAgICBkYXRhLFxuICAgICAgfSBhcyBhbnkpXG4gICAgfSlcblxuICAvKipcbiAgICogc3RyaWN0XHVGRjFBXHU1M0VBXHU0RUNFXHUyMDFDXHU1RjUzXHU1MjREIEVmZmVjdCBFbnZcdTIwMURcdTg5RTNcdTY3OTBcdTY3RDBcdTRFMkEgTW9kdWxlIFx1NzY4NCBSdW50aW1lXHUzMDAyXG4gICAqXG4gICAqIFx1OEJGNFx1NjYwRVx1RkYxQVxuICAgKiAtIFx1NTkxQSByb290IC8gXHU1OTFBXHU1QjlFXHU0RjhCXHU1NzNBXHU2NjZGXHU0RTBCXHVGRjBDXHU0RUZCXHU0RjU1XHU4RkRCXHU3QTBCXHU3RUE3IHJlZ2lzdHJ5IFx1OTBGRFx1NjVFMFx1NkNENVx1ODg2OFx1OEZCRVx1NkI2M1x1Nzg2RVx1OEJFRFx1NEU0OVx1RkYxQlxuICAgKiAtIFx1N0YzQVx1NTkzMVx1NjNEMFx1NEY5Qlx1ODAwNVx1NUM1RVx1NEU4RVx1ODhDNVx1OTE0RFx1OTUxOVx1OEJFRlx1RkYxQVx1NUZDNVx1OTg3Qlx1N0EzM1x1NUI5QVx1NTkzMVx1OEQyNVx1RkYwQ1x1NUU3Nlx1N0VEOVx1NTFGQVx1NTNFRlx1NEZFRVx1NTkwRFx1NzY4NFx1NjNEMFx1NzkzQVx1RkYwOGRldi90ZXN0IFx1NEUwQlx1NjZGNFx1OEJFNlx1N0VDNlx1RkYwOVx1MzAwMlxuICAgKi9cbiAgY29uc3QgcmVzb2x2ZU1vZHVsZVJ1bnRpbWUgPSAoXG4gICAgdGFnOiBDb250ZXh0LlRhZzxhbnksIExvZ2l4Lk1vZHVsZVJ1bnRpbWU8YW55LCBhbnk+PixcbiAgKTogRWZmZWN0LkVmZmVjdDxMb2dpeC5Nb2R1bGVSdW50aW1lPGFueSwgYW55PiwgbmV2ZXIsIGFueT4gPT5cbiAgICBFZmZlY3QuZ2VuKGZ1bmN0aW9uKiAoKSB7XG4gICAgICBjb25zdCByZXF1ZXN0ZWRNb2R1bGVJZCA9IHR5cGVvZiAodGFnIGFzIGFueSk/LmlkID09PSAnc3RyaW5nJyA/ICgodGFnIGFzIGFueSkuaWQgYXMgc3RyaW5nKSA6IHVuZGVmaW5lZFxuICAgICAgY29uc3QgZnJvbU1vZHVsZUlkID0gdHlwZW9mIG9wdGlvbnM/Lm1vZHVsZUlkID09PSAnc3RyaW5nJyA/IG9wdGlvbnMubW9kdWxlSWQgOiBydW50aW1lLm1vZHVsZUlkXG5cbiAgICAgIC8vIHNlbGZcdUZGMUFcdTU5Q0JcdTdFQzhcdTUxNDFcdThCQjhcdTg5RTNcdTY3OTBcdTUyMzBcdTVGNTNcdTUyNEQgTW9kdWxlUnVudGltZVx1RkYwOEJvdW5kLm1ha2UgLyBydW50aW1lIFx1NkNFOFx1NTE2NVx1NEUyNFx1Njc2MVx1OERFRlx1NUY4NFx1OTBGRFx1NjIxMFx1N0FDQlx1RkYwOVxuICAgICAgaWYgKHJlcXVlc3RlZE1vZHVsZUlkICYmIHJlcXVlc3RlZE1vZHVsZUlkID09PSBydW50aW1lLm1vZHVsZUlkKSB7XG4gICAgICAgIHJldHVybiBydW50aW1lIGFzIHVua25vd24gYXMgTG9naXguTW9kdWxlUnVudGltZTxhbnksIGFueT5cbiAgICAgIH1cblxuICAgICAgY29uc3QgZnJvbUltcG9ydHMgPSBydW50aW1lSW50ZXJuYWxzLmltcG9ydHMuZ2V0KHRhZyBhcyB1bmtub3duIGFzIENvbnRleHQuVGFnPGFueSwgYW55PilcbiAgICAgIGlmIChmcm9tSW1wb3J0cykge1xuICAgICAgICByZXR1cm4gZnJvbUltcG9ydHMgYXMgdW5rbm93biBhcyBMb2dpeC5Nb2R1bGVSdW50aW1lPGFueSwgYW55PlxuICAgICAgfVxuXG4gICAgICAvLyBCb3VuZC5tYWtlXHVGRjA4XHU2NUUwIG1vZHVsZUlkIFx1NEUwQVx1NEUwQlx1NjU4N1x1RkYwOVx1NTczQVx1NjY2Rlx1RkYxQVx1NTE0MVx1OEJCOFx1NEVDRVx1NUY1M1x1NTI0RCBFZmZlY3QgRW52IFx1ODlFM1x1Njc5MCBtb2R1bGUgcnVudGltZVx1RkYwOFx1NEZCRlx1NEU4RVx1NkQ0Qlx1OEJENS9cdTgxMUFcdTYyNEJcdTY3QjZcdUZGMDlcdTMwMDJcbiAgICAgIGlmICh0eXBlb2Ygb3B0aW9ucz8ubW9kdWxlSWQgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgIGNvbnN0IGZyb21FbnYgPSB5aWVsZCogRWZmZWN0LnNlcnZpY2VPcHRpb24odGFnIGFzIGFueSlcbiAgICAgICAgaWYgKE9wdGlvbi5pc1NvbWUoZnJvbUVudikpIHtcbiAgICAgICAgICByZXR1cm4gZnJvbUVudi52YWx1ZSBhcyB1bmtub3duIGFzIExvZ2l4Lk1vZHVsZVJ1bnRpbWU8YW55LCBhbnk+XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gMikgXHU2NUUwXHU2Q0Q1XHU2MjdFXHU1MjMwXHU2NUY2XHU3NkY0XHU2M0E1IGRpZSBcdTIwMTRcdTIwMTQgXHU4RkQ5XHU2NjJGXHU5MTREXHU3RjZFXHU5NTE5XHU4QkVGXHVGRjBDXHU2M0QwXHU3OTNBXHU4QzAzXHU3NTI4XHU2NUI5XHU0RkVFXHU2QjYzXHU4OEM1XHU5MTREXHU2NUI5XHU1RjBGXG4gICAgICBjb25zdCB0b2tlbklkID0gcmVxdWVzdGVkTW9kdWxlSWQgPz8gJzx1bmtub3duIG1vZHVsZSBpZD4nXG4gICAgICBjb25zdCBmaXg6IHN0cmluZ1tdID0gaXNEZXZFbnYoKVxuICAgICAgICA/IFtcbiAgICAgICAgICAgICctIFByb3ZpZGUgdGhlIGNoaWxkIGltcGxlbWVudGF0aW9uIGluIHRoZSBzYW1lIHNjb3BlIChpbXBvcnRzKS4nLFxuICAgICAgICAgICAgYCAgRXhhbXBsZTogJHtmcm9tTW9kdWxlSWQgPz8gJ1BhcmVudE1vZHVsZSd9LmltcGxlbWVudCh7IGltcG9ydHM6IFske3JlcXVlc3RlZE1vZHVsZUlkID8/ICdDaGlsZE1vZHVsZSd9LmltcGxdLCAuLi4gfSlgLFxuICAgICAgICAgICAgJy0gSWYgeW91IGludGVudGlvbmFsbHkgd2FudCBhIHJvb3Qgc2luZ2xldG9uLCBwcm92aWRlIGl0IGF0IGFwcCByb290IChSdW50aW1lLm1ha2UoLi4uLHsgbGF5ZXIgfSkgLyByb290IGltcG9ydHMpLCcsXG4gICAgICAgICAgICAnICBhbmQgdXNlIFJvb3QucmVzb2x2ZShNb2R1bGVUYWcpIChpbnN0ZWFkIG9mICQudXNlKSBhdCB0aGUgY2FsbHNpdGUuJyxcbiAgICAgICAgICBdXG4gICAgICAgIDogW11cblxuICAgICAgY29uc3QgZXJyID0gbmV3IEVycm9yKFxuICAgICAgICBpc0RldkVudigpXG4gICAgICAgICAgPyBbXG4gICAgICAgICAgICAgICdbTWlzc2luZ01vZHVsZVJ1bnRpbWVFcnJvcl0gQ2Fubm90IHJlc29sdmUgTW9kdWxlUnVudGltZSBmb3IgTW9kdWxlVGFnLicsXG4gICAgICAgICAgICAgICcnLFxuICAgICAgICAgICAgICBgdG9rZW5JZDogJHt0b2tlbklkfWAsXG4gICAgICAgICAgICAgICdlbnRyeXBvaW50OiBsb2dpYy4kLnVzZScsXG4gICAgICAgICAgICAgICdtb2RlOiBzdHJpY3QnLFxuICAgICAgICAgICAgICBgZnJvbTogJHtmcm9tTW9kdWxlSWQgPz8gJzx1bmtub3duIG1vZHVsZSBpZD4nfWAsXG4gICAgICAgICAgICAgIGBzdGFydFNjb3BlOiBtb2R1bGVJZD0ke2Zyb21Nb2R1bGVJZCA/PyAnPHVua25vd24+J30sIGluc3RhbmNlSWQ9JHtTdHJpbmcocnVudGltZS5pbnN0YW5jZUlkID8/ICc8dW5rbm93bj4nKX1gLFxuICAgICAgICAgICAgICAnJyxcbiAgICAgICAgICAgICAgJ2ZpeDonLFxuICAgICAgICAgICAgICAuLi5maXgsXG4gICAgICAgICAgICBdLmpvaW4oJ1xcbicpXG4gICAgICAgICAgOiAnW01pc3NpbmdNb2R1bGVSdW50aW1lRXJyb3JdIG1vZHVsZSBydW50aW1lIG5vdCBmb3VuZCcsXG4gICAgICApXG5cbiAgICAgIDsoZXJyIGFzIGFueSkudG9rZW5JZCA9IHRva2VuSWRcbiAgICAgIDsoZXJyIGFzIGFueSkuZW50cnlwb2ludCA9ICdsb2dpYy4kLnVzZSdcbiAgICAgIDsoZXJyIGFzIGFueSkubW9kZSA9ICdzdHJpY3QnXG4gICAgICA7KGVyciBhcyBhbnkpLmZyb20gPSBmcm9tTW9kdWxlSWRcbiAgICAgIDsoZXJyIGFzIGFueSkuc3RhcnRTY29wZSA9IHtcbiAgICAgICAgbW9kdWxlSWQ6IGZyb21Nb2R1bGVJZCxcbiAgICAgICAgaW5zdGFuY2VJZDogU3RyaW5nKHJ1bnRpbWUuaW5zdGFuY2VJZCA/PyAnPHVua25vd24+JyksXG4gICAgICB9XG4gICAgICA7KGVyciBhcyBhbnkpLmZpeCA9IGZpeFxuXG4gICAgICBlcnIubmFtZSA9ICdNaXNzaW5nTW9kdWxlUnVudGltZUVycm9yJ1xuICAgICAgcmV0dXJuIHlpZWxkKiBFZmZlY3QuZGllKGVycilcbiAgICB9KVxuXG4gIGNvbnN0IHN0YXRlQXBpOiBCb3VuZEFwaTxTaCwgUj5bJ3N0YXRlJ10gPSB7XG4gICAgcmVhZDogcnVudGltZS5nZXRTdGF0ZSxcbiAgICB1cGRhdGU6IChmKSA9PlxuICAgICAgRWZmZWN0LmdlbihmdW5jdGlvbiogKCkge1xuICAgICAgICBjb25zdCBpblR4biA9IHlpZWxkKiBGaWJlclJlZi5nZXQoVGFza1J1bm5lci5pblN5bmNUcmFuc2FjdGlvbkZpYmVyKVxuICAgICAgICBpZiAoaW5UeG4pIHtcbiAgICAgICAgICBjb25zdCBwcmV2ID0geWllbGQqIHJ1bnRpbWUuZ2V0U3RhdGVcbiAgICAgICAgICByZXR1cm4geWllbGQqIHJ1bnRpbWUuc2V0U3RhdGUoZihwcmV2KSlcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGJvZHkgPSAoKSA9PiBFZmZlY3QuZmxhdE1hcChydW50aW1lLmdldFN0YXRlLCAocHJldikgPT4gcnVudGltZS5zZXRTdGF0ZShmKHByZXYpKSlcblxuICAgICAgICByZXR1cm4geWllbGQqIHJ1bnRpbWVJbnRlcm5hbHNcbiAgICAgICAgICA/IHJ1bnRpbWVJbnRlcm5hbHMudHhuLnJ1bldpdGhTdGF0ZVRyYW5zYWN0aW9uKHsga2luZDogJ3N0YXRlJywgbmFtZTogJ3VwZGF0ZScgfSBhcyBhbnksIGJvZHkpXG4gICAgICAgICAgOiBib2R5KClcbiAgICAgIH0pLFxuICAgIG11dGF0ZTogKGYpID0+XG4gICAgICBFZmZlY3QuZ2VuKGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIGNvbnN0IHJlY29yZFBhdGNoID0gcnVudGltZUludGVybmFscz8udHhuLnJlY29yZFN0YXRlUGF0Y2hcblxuICAgICAgICBjb25zdCBpblR4biA9IHlpZWxkKiBGaWJlclJlZi5nZXQoVGFza1J1bm5lci5pblN5bmNUcmFuc2FjdGlvbkZpYmVyKVxuICAgICAgICBpZiAoaW5UeG4pIHtcbiAgICAgICAgICBjb25zdCBwcmV2ID0geWllbGQqIHJ1bnRpbWUuZ2V0U3RhdGVcbiAgICAgICAgICBjb25zdCB7IG5leHRTdGF0ZSwgcGF0Y2hQYXRocyB9ID0gbXV0YXRlV2l0aFBhdGNoUGF0aHMocHJldiBhcyBMb2dpeC5TdGF0ZU9mPFNoPiwgKGRyYWZ0KSA9PiB7XG4gICAgICAgICAgICBmKGRyYWZ0IGFzIExvZ2ljLkRyYWZ0PExvZ2l4LlN0YXRlT2Y8U2g+PilcbiAgICAgICAgICB9KVxuXG4gICAgICAgICAgZm9yIChjb25zdCBwYXRoIG9mIHBhdGNoUGF0aHMpIHtcbiAgICAgICAgICAgIHJlY29yZFBhdGNoPy4ocGF0aCwgJ3N0YXRlOm11dGF0ZScpXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIHlpZWxkKiBydW50aW1lLnNldFN0YXRlKG5leHRTdGF0ZSlcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGJvZHkgPSAoKSA9PlxuICAgICAgICAgIEVmZmVjdC5mbGF0TWFwKHJ1bnRpbWUuZ2V0U3RhdGUsIChwcmV2KSA9PiB7XG4gICAgICAgICAgICBjb25zdCB7IG5leHRTdGF0ZSwgcGF0Y2hQYXRocyB9ID0gbXV0YXRlV2l0aFBhdGNoUGF0aHMocHJldiBhcyBMb2dpeC5TdGF0ZU9mPFNoPiwgKGRyYWZ0KSA9PiB7XG4gICAgICAgICAgICAgIGYoZHJhZnQgYXMgTG9naWMuRHJhZnQ8TG9naXguU3RhdGVPZjxTaD4+KVxuICAgICAgICAgICAgfSlcblxuICAgICAgICAgICAgZm9yIChjb25zdCBwYXRoIG9mIHBhdGNoUGF0aHMpIHtcbiAgICAgICAgICAgICAgcmVjb3JkUGF0Y2g/LihwYXRoLCAnc3RhdGU6bXV0YXRlJylcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIHJ1bnRpbWUuc2V0U3RhdGUobmV4dFN0YXRlKVxuICAgICAgICAgIH0pXG5cbiAgICAgICAgcmV0dXJuIHlpZWxkKiBydW50aW1lSW50ZXJuYWxzXG4gICAgICAgICAgPyBydW50aW1lSW50ZXJuYWxzLnR4bi5ydW5XaXRoU3RhdGVUcmFuc2FjdGlvbih7IGtpbmQ6ICdzdGF0ZScsIG5hbWU6ICdtdXRhdGUnIH0gYXMgYW55LCBib2R5KVxuICAgICAgICAgIDogYm9keSgpXG4gICAgICB9KSxcbiAgICByZWY6IHJ1bnRpbWUucmVmLFxuICB9XG5cbiAgY29uc3QgYWN0aW9uc0FwaSA9IG5ldyBQcm94eSh7fSBhcyBCb3VuZEFwaTxTaCwgUj5bJ2FjdGlvbnMnXSwge1xuICAgIGdldDogKF90YXJnZXQsIHByb3ApID0+IHtcbiAgICAgIGlmIChwcm9wID09PSAnZGlzcGF0Y2gnKSB7XG4gICAgICAgIHJldHVybiAoYTogTG9naXguQWN0aW9uT2Y8U2g+KSA9PiBydW50aW1lLmRpc3BhdGNoKGEpXG4gICAgICB9XG4gICAgICBpZiAocHJvcCA9PT0gJ2FjdGlvbnMkJykge1xuICAgICAgICByZXR1cm4gcnVudGltZS5hY3Rpb25zJFxuICAgICAgfVxuICAgICAgcmV0dXJuIChwYXlsb2FkOiBhbnkpID0+IHJ1bnRpbWUuZGlzcGF0Y2goeyBfdGFnOiBwcm9wIGFzIHN0cmluZywgcGF5bG9hZCB9IGFzIExvZ2l4LkFjdGlvbk9mPFNoPilcbiAgICB9LFxuICB9KVxuXG4gIGNvbnN0IG1hdGNoQXBpID0gPFY+KHZhbHVlOiBWKTogTG9naWMuRmx1ZW50TWF0Y2g8Vj4gPT4gTWF0Y2hCdWlsZGVyLm1ha2VNYXRjaCh2YWx1ZSlcblxuICBjb25zdCBtYXRjaFRhZ0FwaSA9IDxWIGV4dGVuZHMgeyBfdGFnOiBzdHJpbmcgfT4odmFsdWU6IFYpOiBMb2dpYy5GbHVlbnRNYXRjaFRhZzxWPiA9PlxuICAgIE1hdGNoQnVpbGRlci5tYWtlTWF0Y2hUYWcodmFsdWUpXG5cbiAgLy8gUHJpbWFyeSBSZWR1Y2VyIFx1NkNFOFx1NTE4Q1x1RkYxQVx1OTAxQVx1OEZDNyBydW50aW1lIFx1NEUwQVx1NzY4NFx1NTE4NVx1OTBFOFx1NkNFOFx1NTE4Q1x1NTFGRFx1NjU3MFx1RkYwOFx1ODJFNVx1NUI1OFx1NTcyOFx1RkYwOVx1NTE5OVx1NTE2NSByZWR1Y2VyIFx1NjYyMFx1NUMwNFx1MzAwMlxuICBjb25zdCByZWR1Y2VyOiBCb3VuZEFwaTxTaCwgUj5bJ3JlZHVjZXInXSA9ICh0YWcsIGZuKSA9PiB7XG4gICAgcmV0dXJuIEVmZmVjdC5zeW5jKCgpID0+IHtcbiAgICAgIHJ1bnRpbWVJbnRlcm5hbHMudHhuLnJlZ2lzdGVyUmVkdWNlcihTdHJpbmcodGFnKSwgZm4gYXMgYW55KVxuICAgIH0pIGFzIGFueVxuICB9XG5cbiAgY29uc3QgYXBpOiBCb3VuZEFwaTxTaCwgUj4gPSB7XG4gICAgcm9vdDoge1xuICAgICAgcmVzb2x2ZTogKHRhZzogYW55KSA9PiB7XG4gICAgICAgIGd1YXJkUnVuT25seSgncm9vdF9yZXNvbHZlX2luX3NldHVwJywgJyQucm9vdC5yZXNvbHZlJylcbiAgICAgICAgcmV0dXJuIFJvb3QucmVzb2x2ZSh0YWcsIHtcbiAgICAgICAgICBlbnRyeXBvaW50OiAnbG9naWMuJC5yb290LnJlc29sdmUnLFxuICAgICAgICAgIHdhaXRGb3JSZWFkeTogdHJ1ZSxcbiAgICAgICAgfSkgYXMgYW55XG4gICAgICB9LFxuICAgIH0sXG4gICAgc3RhdGU6IHN0YXRlQXBpLFxuICAgIGFjdGlvbnM6IGFjdGlvbnNBcGksXG4gICAgZmxvdzogZmxvd0FwaSxcbiAgICBtYXRjaDogbWF0Y2hBcGksXG4gICAgbWF0Y2hUYWc6IG1hdGNoVGFnQXBpLFxuICAgIGxpZmVjeWNsZToge1xuICAgICAgb25Jbml0UmVxdWlyZWQ6IChlZmY6IExvZ2ljLk9mPFNoLCBSLCB2b2lkLCBuZXZlcj4pID0+IHtcbiAgICAgICAgaWYgKGdldEN1cnJlbnRQaGFzZSgpID09PSAncnVuJykge1xuICAgICAgICAgIHJldHVybiBlbWl0U2V0dXBPbmx5VmlvbGF0aW9uKCckLmxpZmVjeWNsZS5vbkluaXRSZXF1aXJlZCcpIGFzIGFueVxuICAgICAgICB9XG4gICAgICAgIHJ1bnRpbWVJbnRlcm5hbHMubGlmZWN5Y2xlLnJlZ2lzdGVySW5pdFJlcXVpcmVkKGVmZiBhcyBhbnkpXG4gICAgICAgIHJldHVybiBFZmZlY3Qudm9pZCBhcyBhbnlcbiAgICAgIH0sXG4gICAgICBvblN0YXJ0OiAoZWZmOiBMb2dpYy5PZjxTaCwgUiwgdm9pZCwgbmV2ZXI+KSA9PiB7XG4gICAgICAgIGlmIChnZXRDdXJyZW50UGhhc2UoKSA9PT0gJ3J1bicpIHtcbiAgICAgICAgICByZXR1cm4gZW1pdFNldHVwT25seVZpb2xhdGlvbignJC5saWZlY3ljbGUub25TdGFydCcpIGFzIGFueVxuICAgICAgICB9XG4gICAgICAgIHJ1bnRpbWVJbnRlcm5hbHMubGlmZWN5Y2xlLnJlZ2lzdGVyU3RhcnQoZWZmIGFzIGFueSlcbiAgICAgICAgcmV0dXJuIEVmZmVjdC52b2lkIGFzIGFueVxuICAgICAgfSxcbiAgICAgIG9uSW5pdDogKGVmZjogTG9naWMuT2Y8U2gsIFIsIHZvaWQsIG5ldmVyPikgPT4ge1xuICAgICAgICAvLyBsZWdhY3kgYWxpYXNcdUZGMUFcdThCRURcdTRFNDlcdTdCNDlcdTU0MENcdTRFOEUgb25Jbml0UmVxdWlyZWRcdUZGMDhcdTRFM0FcdTRFODZcdThGQzFcdTc5RkJcdTY3MUZcdTUxQ0ZcdTVDMTFcdTY0NjlcdTY0RTZcdUZGMDlcdTMwMDJcbiAgICAgICAgaWYgKGdldEN1cnJlbnRQaGFzZSgpID09PSAncnVuJykge1xuICAgICAgICAgIHJldHVybiBlbWl0U2V0dXBPbmx5VmlvbGF0aW9uKCckLmxpZmVjeWNsZS5vbkluaXQnKSBhcyBhbnlcbiAgICAgICAgfVxuICAgICAgICBydW50aW1lSW50ZXJuYWxzLmxpZmVjeWNsZS5yZWdpc3RlckluaXRSZXF1aXJlZChlZmYgYXMgYW55KVxuICAgICAgICByZXR1cm4gRWZmZWN0LnZvaWQgYXMgYW55XG4gICAgICB9LFxuICAgICAgb25EZXN0cm95OiAoZWZmOiBMb2dpYy5PZjxTaCwgUiwgdm9pZCwgbmV2ZXI+KSA9PiB7XG4gICAgICAgIGlmIChnZXRDdXJyZW50UGhhc2UoKSA9PT0gJ3J1bicpIHtcbiAgICAgICAgICByZXR1cm4gZW1pdFNldHVwT25seVZpb2xhdGlvbignJC5saWZlY3ljbGUub25EZXN0cm95JykgYXMgYW55XG4gICAgICAgIH1cbiAgICAgICAgcnVudGltZUludGVybmFscy5saWZlY3ljbGUucmVnaXN0ZXJEZXN0cm95KGVmZiBhcyBhbnkpXG4gICAgICAgIHJldHVybiBFZmZlY3Qudm9pZCBhcyBhbnlcbiAgICAgIH0sXG4gICAgICBvbkVycm9yOiAoXG4gICAgICAgIGhhbmRsZXI6IChcbiAgICAgICAgICBjYXVzZTogaW1wb3J0KCdlZmZlY3QnKS5DYXVzZS5DYXVzZTx1bmtub3duPixcbiAgICAgICAgICBjb250ZXh0OiBMaWZlY3ljbGUuRXJyb3JDb250ZXh0LFxuICAgICAgICApID0+IEVmZmVjdC5FZmZlY3Q8dm9pZCwgbmV2ZXIsIFI+LFxuICAgICAgKSA9PiB7XG4gICAgICAgIGlmIChnZXRDdXJyZW50UGhhc2UoKSA9PT0gJ3J1bicpIHtcbiAgICAgICAgICByZXR1cm4gZW1pdFNldHVwT25seVZpb2xhdGlvbignJC5saWZlY3ljbGUub25FcnJvcicpIGFzIGFueVxuICAgICAgICB9XG4gICAgICAgIHJ1bnRpbWVJbnRlcm5hbHMubGlmZWN5Y2xlLnJlZ2lzdGVyT25FcnJvcihoYW5kbGVyIGFzIGFueSlcbiAgICAgICAgcmV0dXJuIEVmZmVjdC52b2lkIGFzIGFueVxuICAgICAgfSxcbiAgICAgIG9uU3VzcGVuZDogKGVmZjogTG9naWMuT2Y8U2gsIFIsIHZvaWQsIG5ldmVyPikgPT4ge1xuICAgICAgICBpZiAoZ2V0Q3VycmVudFBoYXNlKCkgPT09ICdydW4nKSB7XG4gICAgICAgICAgcmV0dXJuIGVtaXRTZXR1cE9ubHlWaW9sYXRpb24oJyQubGlmZWN5Y2xlLm9uU3VzcGVuZCcpIGFzIGFueVxuICAgICAgICB9XG4gICAgICAgIHJ1bnRpbWVJbnRlcm5hbHMubGlmZWN5Y2xlLnJlZ2lzdGVyUGxhdGZvcm1TdXNwZW5kKEVmZmVjdC5hc1ZvaWQoZWZmIGFzIEVmZmVjdC5FZmZlY3Q8dm9pZCwgbmV2ZXIsIGFueT4pKVxuICAgICAgICByZXR1cm4gRWZmZWN0LnZvaWQgYXMgYW55XG4gICAgICB9LFxuICAgICAgb25SZXN1bWU6IChlZmY6IExvZ2ljLk9mPFNoLCBSLCB2b2lkLCBuZXZlcj4pID0+IHtcbiAgICAgICAgaWYgKGdldEN1cnJlbnRQaGFzZSgpID09PSAncnVuJykge1xuICAgICAgICAgIHJldHVybiBlbWl0U2V0dXBPbmx5VmlvbGF0aW9uKCckLmxpZmVjeWNsZS5vblJlc3VtZScpIGFzIGFueVxuICAgICAgICB9XG4gICAgICAgIHJ1bnRpbWVJbnRlcm5hbHMubGlmZWN5Y2xlLnJlZ2lzdGVyUGxhdGZvcm1SZXN1bWUoRWZmZWN0LmFzVm9pZChlZmYgYXMgRWZmZWN0LkVmZmVjdDx2b2lkLCBuZXZlciwgYW55PikpXG4gICAgICAgIHJldHVybiBFZmZlY3Qudm9pZCBhcyBhbnlcbiAgICAgIH0sXG4gICAgICBvblJlc2V0OiAoZWZmOiBMb2dpYy5PZjxTaCwgUiwgdm9pZCwgbmV2ZXI+KSA9PiB7XG4gICAgICAgIGlmIChnZXRDdXJyZW50UGhhc2UoKSA9PT0gJ3J1bicpIHtcbiAgICAgICAgICByZXR1cm4gZW1pdFNldHVwT25seVZpb2xhdGlvbignJC5saWZlY3ljbGUub25SZXNldCcpIGFzIGFueVxuICAgICAgICB9XG4gICAgICAgIHJ1bnRpbWVJbnRlcm5hbHMubGlmZWN5Y2xlLnJlZ2lzdGVyUGxhdGZvcm1SZXNldChFZmZlY3QuYXNWb2lkKGVmZiBhcyBFZmZlY3QuRWZmZWN0PHZvaWQsIG5ldmVyLCBhbnk+KSlcbiAgICAgICAgcmV0dXJuIEVmZmVjdC52b2lkIGFzIGFueVxuICAgICAgfSxcbiAgICB9LFxuICAgIHRyYWl0czoge1xuICAgICAgZGVjbGFyZTogKHRyYWl0czogTW9kdWxlVHJhaXRzLlRyYWl0U3BlYykgPT4ge1xuICAgICAgICBpZiAoZ2V0Q3VycmVudFBoYXNlKCkgPT09ICdydW4nKSB7XG4gICAgICAgICAgdGhyb3cgTG9naWNEaWFnbm9zdGljcy5tYWtlTG9naWNQaGFzZUVycm9yKFxuICAgICAgICAgICAgJ3RyYWl0c19kZWNsYXJlX2luX3J1bicsXG4gICAgICAgICAgICAnJC50cmFpdHMuZGVjbGFyZScsXG4gICAgICAgICAgICAncnVuJyxcbiAgICAgICAgICAgIG9wdGlvbnM/Lm1vZHVsZUlkLFxuICAgICAgICAgIClcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghdHJhaXRzIHx8IHR5cGVvZiB0cmFpdHMgIT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdbSW52YWxpZFRyYWl0c0RlY2xhcmF0aW9uXSAkLnRyYWl0cy5kZWNsYXJlIGV4cGVjdHMgYW4gb2JqZWN0LicpXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBsb2dpY1VuaXQgPSBvcHRpb25zPy5sb2dpY1VuaXQgPz8ge1xuICAgICAgICAgIGxvZ2ljVW5pdElkOiAndW5rbm93bicsXG4gICAgICAgICAgbG9naWNVbml0SWRLaW5kOiAnZGVyaXZlZCcgYXMgY29uc3QsXG4gICAgICAgICAgbG9naWNVbml0TGFiZWw6ICdsb2dpY1VuaXQ6dW5rbm93bicsXG4gICAgICAgICAgcGF0aDogdW5kZWZpbmVkIGFzIHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgICAgICAgfVxuXG4gICAgICAgIHJ1bnRpbWVJbnRlcm5hbHMudHJhaXRzLnJlZ2lzdGVyTW9kdWxlVHJhaXRzQ29udHJpYnV0aW9uKHtcbiAgICAgICAgICB0cmFpdHMsXG4gICAgICAgICAgcHJvdmVuYW5jZToge1xuICAgICAgICAgICAgb3JpZ2luVHlwZTogJ2xvZ2ljVW5pdCcsXG4gICAgICAgICAgICBvcmlnaW5JZDogbG9naWNVbml0LmxvZ2ljVW5pdElkLFxuICAgICAgICAgICAgb3JpZ2luSWRLaW5kOiBsb2dpY1VuaXQubG9naWNVbml0SWRLaW5kLFxuICAgICAgICAgICAgb3JpZ2luTGFiZWw6IGxvZ2ljVW5pdC5sb2dpY1VuaXRMYWJlbCxcbiAgICAgICAgICAgIHBhdGg6IGxvZ2ljVW5pdC5wYXRoLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0pXG4gICAgICB9LFxuICAgICAgc291cmNlOiB7XG4gICAgICAgIHJlZnJlc2g6IChmaWVsZFBhdGg6IHN0cmluZywgb3B0aW9ucz86IHsgcmVhZG9ubHkgZm9yY2U/OiBib29sZWFuIH0pID0+XG4gICAgICAgICAgRWZmZWN0LmdlbihmdW5jdGlvbiogKCkge1xuICAgICAgICAgICAgY29uc3QgaGFuZGxlciA9IHJ1bnRpbWVJbnRlcm5hbHMudHJhaXRzLmdldFNvdXJjZVJlZnJlc2hIYW5kbGVyKGZpZWxkUGF0aCkgYXNcbiAgICAgICAgICAgICAgfCAoKHN0YXRlOiBMb2dpeC5TdGF0ZU9mPFNoPikgPT4gRWZmZWN0LkVmZmVjdDx2b2lkLCBuZXZlciwgYW55PilcbiAgICAgICAgICAgICAgfCB1bmRlZmluZWRcbiAgICAgICAgICAgIGlmICghaGFuZGxlcikge1xuICAgICAgICAgICAgICAvLyBcdTgyRTVcdTY3MkFcdTZDRThcdTUxOENcdTUyMzdcdTY1QjBcdTkwM0JcdThGOTFcdUZGMENcdTUyMTlcdTg5QzZcdTRFM0Egbm8tb3BcdUZGMENcdTkwN0ZcdTUxNERcdTU3MjhcdTY3MkFcdTYzMDIgU3RhdGVUcmFpdFByb2dyYW0gXHU2NUY2XHU2MjlCXHU5NTE5XHUzMDAyXG4gICAgICAgICAgICAgIHJldHVybiB5aWVsZCogRWZmZWN0LnZvaWRcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgZm9yY2UgPSBvcHRpb25zPy5mb3JjZSA9PT0gdHJ1ZVxuICAgICAgICAgICAgY29uc3QgcnVuSGFuZGxlciA9IChzdGF0ZTogTG9naXguU3RhdGVPZjxTaD4pID0+XG4gICAgICAgICAgICAgIGZvcmNlID8gRWZmZWN0LmxvY2FsbHkoVGFza1J1bm5lci5mb3JjZVNvdXJjZVJlZnJlc2gsIHRydWUpKGhhbmRsZXIoc3RhdGUpKSA6IGhhbmRsZXIoc3RhdGUpXG5cbiAgICAgICAgICAgIC8vIFx1NEU4Qlx1NTJBMVx1N0E5N1x1NTNFM1x1NTE4NVx1Nzk4MVx1NkI2Mlx1NTE4RFx1OEQ3MCBlbnF1ZXVlVHJhbnNhY3Rpb25cdUZGMDhcdTRGMUFcdTVCRkNcdTgxRjRcdTZCN0JcdTk1MDFcdUZGMDlcdUZGMUFcbiAgICAgICAgICAgIC8vIC0gXHU3NkY0XHU2M0E1XHU1NzI4XHU1RjUzXHU1MjREXHU0RThCXHU1MkExXHU1MTg1XHU2MjY3XHU4ODRDIGhhbmRsZXJcdUZGMENcdTRGN0ZcdTUxNzZcdTkwMUFcdThGQzcgYm91bmQuc3RhdGUubXV0YXRlIFx1NTE5OVx1NTE2NSBkcmFmdFx1RkYxQlxuICAgICAgICAgICAgLy8gLSBcdTc1MzFcdTU5MTZcdTVDNDJcdTU0MENcdTRFMDBcdTRFOEJcdTUyQTFcdTdBOTdcdTUzRTNcdThEMUZcdThEMjMgY29tbWl0ICsgZGVidWcgXHU4MDVBXHU1NDA4XHUzMDAyXG4gICAgICAgICAgICBjb25zdCBpblR4biA9IHlpZWxkKiBGaWJlclJlZi5nZXQoVGFza1J1bm5lci5pblN5bmNUcmFuc2FjdGlvbkZpYmVyKVxuICAgICAgICAgICAgaWYgKGluVHhuKSB7XG4gICAgICAgICAgICAgIGNvbnN0IHN0YXRlID0gKHlpZWxkKiBydW50aW1lLmdldFN0YXRlKSBhcyBMb2dpeC5TdGF0ZU9mPFNoPlxuICAgICAgICAgICAgICByZXR1cm4geWllbGQqIHJ1bkhhbmRsZXIoc3RhdGUpXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIFx1NUMwNlx1NEUwMFx1NkIyMSBzb3VyY2UtcmVmcmVzaCBcdTg5QzZcdTRFM0FcdTUzNTVcdTcyRUNcdTc2ODRcdTRFOEJcdTUyQTFcdTUxNjVcdTUzRTNcdTMwMDJcbiAgICAgICAgICAgIHJldHVybiB5aWVsZCogcnVudGltZUludGVybmFscy50eG4ucnVuV2l0aFN0YXRlVHJhbnNhY3Rpb24oXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBraW5kOiAnc291cmNlLXJlZnJlc2gnLFxuICAgICAgICAgICAgICAgIG5hbWU6IGZpZWxkUGF0aCxcbiAgICAgICAgICAgICAgfSBhcyBhbnksXG4gICAgICAgICAgICAgICgpID0+XG4gICAgICAgICAgICAgICAgRWZmZWN0LmdlbihmdW5jdGlvbiogKCkge1xuICAgICAgICAgICAgICAgICAgY29uc3Qgc3RhdGUgPSAoeWllbGQqIHJ1bnRpbWUuZ2V0U3RhdGUpIGFzIExvZ2l4LlN0YXRlT2Y8U2g+XG4gICAgICAgICAgICAgICAgICByZXR1cm4geWllbGQqIHJ1bkhhbmRsZXIoc3RhdGUpXG4gICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICApXG4gICAgICAgICAgfSksXG4gICAgICB9LFxuICAgIH0sXG4gICAgcmVkdWNlcixcbiAgICB1c2U6IG5ldyBQcm94eSgoKSA9PiB7fSwge1xuICAgICAgYXBwbHk6IChfdGFyZ2V0LCBfdGhpc0FyZywgW2FyZ10pID0+IHtcbiAgICAgICAgZ3VhcmRSdW5Pbmx5KCd1c2VfaW5fc2V0dXAnLCAnJC51c2UnKVxuICAgICAgICBpZiAoaXNNb2R1bGVMaWtlKGFyZykpIHtcbiAgICAgICAgICBjb25zdCBkb21haW4gPSBhcmdcbiAgICAgICAgICBjb25zdCB0YWcgPSBkb21haW4udGFnIGFzIHVua25vd24gYXMgQ29udGV4dC5UYWc8YW55LCBMb2dpeC5Nb2R1bGVSdW50aW1lPGFueSwgYW55Pj5cblxuICAgICAgICAgIGNvbnN0IHJlc29sdmVBbmRCdWlsZCA9IHJlc29sdmVNb2R1bGVSdW50aW1lKHRhZykucGlwZShFZmZlY3QubWFwKChydCkgPT4gYnVpbGRNb2R1bGVIYW5kbGUodGFnLCBydCkpKVxuXG4gICAgICAgICAgY29uc3QgcmVzb2x2ZVdpdGhEZXNjcmlwdG9yID0gcmVzb2x2ZU1vZHVsZVJ1bnRpbWUodGFnKS5waXBlKFxuICAgICAgICAgICAgRWZmZWN0LnRhcCgocnQpID0+IGVtaXRNb2R1bGVEZXNjcmlwdG9yT25jZShkb21haW4sIHJ0KSksXG4gICAgICAgICAgICBFZmZlY3QubWFwKChydCkgPT4gYnVpbGRNb2R1bGVIYW5kbGUodGFnLCBydCkpLFxuICAgICAgICAgIClcblxuICAgICAgICAgIGNvbnN0IGRldGVjdEFuZFNlbGVjdCA9IEZpYmVyUmVmLmdldChEZWJ1Zy5jdXJyZW50RGlhZ25vc3RpY3NMZXZlbCkucGlwZShcbiAgICAgICAgICAgIEVmZmVjdC50YXAoKGxldmVsKSA9PiB7XG4gICAgICAgICAgICAgIGNhY2hlZERpYWdub3N0aWNzTGV2ZWwgPSBsZXZlbFxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICBFZmZlY3QuZmxhdE1hcCgobGV2ZWwpID0+IChsZXZlbCA9PT0gJ29mZicgPyByZXNvbHZlQW5kQnVpbGQgOiByZXNvbHZlV2l0aERlc2NyaXB0b3IpKSxcbiAgICAgICAgICApXG5cbiAgICAgICAgICAvLyAwMjIgcGVyZiBnYXRlXHVGRjFBZGlhZ25vc3RpY3Mgb2ZmIFx1NjVGNlx1RkYwQyQudXNlKG1vZHVsZSkgXHU0RTBFICQudXNlKG1vZHVsZS50YWcpIFx1NUZDNVx1OTg3Qlx1N0I0OVx1NEVGN1x1NEUxNFx1OTZGNlx1OTg5RFx1NTkxNlx1NUYwMFx1OTUwMFx1MzAwMlxuICAgICAgICAgIC8vIFx1N0VBNlx1Njc1Rlx1RkYxQUVmZmVjdCBcdTY2MkZcdTUwM0NcdUZGMDhcdTUzRUZcdTU5MERcdTc1MjhcdUZGMDlcdUZGMUJcdTU2RTBcdTZCNjRcdTVGQzVcdTk4N0JcdTU3MjhcdTYyNjdcdTg4NENcdTY3MUZcdTUwNUFcdTRFMDBcdTZCMjFcdTYwMjdcdTdGMTNcdTVCNThcdUZGMENcdTgwMENcdTRFMERcdTgwRkRcdTU3MjhcdTY3ODRcdTkwMjBcdTY3MUZcdTU2RkFcdTVCOUFcdTUyMDZcdTY1MkZcdTMwMDJcbiAgICAgICAgICByZXR1cm4gRWZmZWN0LnN1c3BlbmQoKCkgPT4ge1xuICAgICAgICAgICAgaWYgKGNhY2hlZERpYWdub3N0aWNzTGV2ZWwgPT09ICdvZmYnKSB7XG4gICAgICAgICAgICAgIHJldHVybiByZXNvbHZlQW5kQnVpbGRcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGNhY2hlZERpYWdub3N0aWNzTGV2ZWwgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICByZXR1cm4gcmVzb2x2ZVdpdGhEZXNjcmlwdG9yXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiBkZXRlY3RBbmRTZWxlY3RcbiAgICAgICAgICB9KSBhcyB1bmtub3duIGFzIExvZ2ljLk9mPFNoLCBSLCBhbnksIG5ldmVyPlxuICAgICAgICB9XG4gICAgICAgIGlmIChDb250ZXh0LmlzVGFnKGFyZykpIHtcbiAgICAgICAgICBjb25zdCBjYW5kaWRhdGUgPSBhcmcgYXMgeyBfa2luZD86IHVua25vd24gfVxuXG4gICAgICAgICAgLy8gTW9kdWxlXHVGRjFBXHU4RkQ0XHU1NkRFXHU1M0VBXHU4QkZCIE1vZHVsZUhhbmRsZSBcdTg5QzZcdTU2RkVcbiAgICAgICAgICBpZiAoY2FuZGlkYXRlLl9raW5kID09PSAnTW9kdWxlVGFnJykge1xuICAgICAgICAgICAgcmV0dXJuIHJlc29sdmVNb2R1bGVSdW50aW1lKGFyZyBhcyBhbnkpLnBpcGUoXG4gICAgICAgICAgICAgIEVmZmVjdC5tYXAoKHJ0OiBMb2dpeC5Nb2R1bGVSdW50aW1lPGFueSwgYW55PikgPT4gYnVpbGRNb2R1bGVIYW5kbGUoYXJnIGFzIGFueSwgcnQpKSxcbiAgICAgICAgICAgICkgYXMgdW5rbm93biBhcyBMb2dpYy5PZjxTaCwgUiwgYW55LCBuZXZlcj5cbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBcdTY2NkVcdTkwMUEgU2VydmljZSBUYWdcdUZGMUFcdTc2RjRcdTYzQTVcdTRFQ0UgRW52IFx1ODNCN1x1NTNENiBTZXJ2aWNlXG4gICAgICAgICAgcmV0dXJuIGFyZyBhcyB1bmtub3duIGFzIExvZ2ljLk9mPFNoLCBSLCBhbnksIG5ldmVyPlxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBFZmZlY3QuZGllKCdCb3VuZEFwaS51c2U6IHVuc3VwcG9ydGVkIGFyZ3VtZW50JykgYXMgdW5rbm93biBhcyBMb2dpYy5PZjxTaCwgUiwgYW55LCBuZXZlcj5cbiAgICAgIH0sXG4gICAgfSkgYXMgdW5rbm93biBhcyBCb3VuZEFwaTxTaCwgUj5bJ3VzZSddLFxuICAgIG9uQWN0aW9uOiBuZXcgUHJveHkoKCkgPT4ge30sIHtcbiAgICAgIGFwcGx5OiAoX3RhcmdldCwgX3RoaXNBcmcsIGFyZ3MpID0+IHtcbiAgICAgICAgZ3VhcmRSdW5Pbmx5KCd1c2VfaW5fc2V0dXAnLCAnJC5vbkFjdGlvbicpXG4gICAgICAgIGNvbnN0IGFyZyA9IGFyZ3NbMF1cbiAgICAgICAgaWYgKHR5cGVvZiBhcmcgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICByZXR1cm4gY3JlYXRlSW50ZW50QnVpbGRlcihydW50aW1lLmFjdGlvbnMkLnBpcGUoU3RyZWFtLmZpbHRlcihhcmcpKSlcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIGFyZyA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICByZXR1cm4gY3JlYXRlSW50ZW50QnVpbGRlcihcbiAgICAgICAgICAgIHJ1bnRpbWUuYWN0aW9ucyQucGlwZShTdHJlYW0uZmlsdGVyKChhOiBhbnkpID0+IGEuX3RhZyA9PT0gYXJnIHx8IGEudHlwZSA9PT0gYXJnKSksXG4gICAgICAgICAgICBhcmcsXG4gICAgICAgICAgKVxuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgYXJnID09PSAnb2JqZWN0JyAmJiBhcmcgIT09IG51bGwpIHtcbiAgICAgICAgICBpZiAoJ190YWcnIGluIGFyZykge1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZUludGVudEJ1aWxkZXIoXG4gICAgICAgICAgICAgIHJ1bnRpbWUuYWN0aW9ucyQucGlwZShTdHJlYW0uZmlsdGVyKChhOiBhbnkpID0+IGEuX3RhZyA9PT0gKGFyZyBhcyBhbnkpLl90YWcpKSxcbiAgICAgICAgICAgICAgU3RyaW5nKChhcmcgYXMgYW55KS5fdGFnKSxcbiAgICAgICAgICAgIClcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKFNjaGVtYS5pc1NjaGVtYShhcmcpKSB7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlSW50ZW50QnVpbGRlcihcbiAgICAgICAgICAgICAgcnVudGltZS5hY3Rpb25zJC5waXBlKFxuICAgICAgICAgICAgICAgIFN0cmVhbS5maWx0ZXIoKGE6IGFueSkgPT4ge1xuICAgICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gU2NoZW1hLmRlY29kZVVua25vd25TeW5jKGFyZyBhcyBTY2hlbWEuU2NoZW1hPGFueSwgYW55LCBuZXZlcj4pKGEpXG4gICAgICAgICAgICAgICAgICByZXR1cm4gISFyZXN1bHRcbiAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgIClcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNyZWF0ZUludGVudEJ1aWxkZXIocnVudGltZS5hY3Rpb25zJClcbiAgICAgIH0sXG4gICAgICBnZXQ6IChfdGFyZ2V0LCBwcm9wKSA9PiB7XG4gICAgICAgIGd1YXJkUnVuT25seSgndXNlX2luX3NldHVwJywgJyQub25BY3Rpb24nKVxuICAgICAgICBpZiAodHlwZW9mIHByb3AgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgcmV0dXJuIGNyZWF0ZUludGVudEJ1aWxkZXIoXG4gICAgICAgICAgICBydW50aW1lLmFjdGlvbnMkLnBpcGUoU3RyZWFtLmZpbHRlcigoYTogYW55KSA9PiBhLl90YWcgPT09IHByb3AgfHwgYS50eXBlID09PSBwcm9wKSksXG4gICAgICAgICAgICBwcm9wLFxuICAgICAgICAgIClcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdW5kZWZpbmVkXG4gICAgICB9LFxuICAgIH0pIGFzIHVua25vd24gYXMgQm91bmRBcGk8U2gsIFI+WydvbkFjdGlvbiddLFxuICAgIG9uU3RhdGU6IChzZWxlY3RvcjogKHM6IExvZ2l4LlN0YXRlT2Y8U2g+KSA9PiBhbnkpID0+IHtcbiAgICAgIGd1YXJkUnVuT25seSgndXNlX2luX3NldHVwJywgJyQub25TdGF0ZScpXG4gICAgICByZXR1cm4gY3JlYXRlSW50ZW50QnVpbGRlcihydW50aW1lLmNoYW5nZXMoc2VsZWN0b3IpKVxuICAgIH0sXG4gICAgb246IChzdHJlYW06IFN0cmVhbS5TdHJlYW08YW55PikgPT4ge1xuICAgICAgZ3VhcmRSdW5Pbmx5KCd1c2VfaW5fc2V0dXAnLCAnJC5vbicpXG4gICAgICByZXR1cm4gY3JlYXRlSW50ZW50QnVpbGRlcihzdHJlYW0pXG4gICAgfSxcbiAgfSBhcyBhbnlcblxuICBzZXRCb3VuZEludGVybmFscyhhcGkgYXMgYW55LCBydW50aW1lSW50ZXJuYWxzKVxuXG4gIHJldHVybiBhcGlcbn1cbiIsICJpbXBvcnQgeyBDYXVzZSwgQ29udGV4dCwgRWZmZWN0LCBSZWYgfSBmcm9tICdlZmZlY3QnXG5pbXBvcnQgeyB0b1NlcmlhbGl6YWJsZUVycm9yU3VtbWFyeSB9IGZyb20gJy4vZXJyb3JTdW1tYXJ5LmpzJ1xuaW1wb3J0ICogYXMgRGVidWcgZnJvbSAnLi9EZWJ1Z1NpbmsuanMnXG5cbmV4cG9ydCB0eXBlIFBoYXNlID0gJ2luaXQnIHwgJ3J1bicgfCAnZGVzdHJveScgfCAncGxhdGZvcm0nXG5cbmV4cG9ydCB0eXBlIEhvb2sgPSAnaW5pdFJlcXVpcmVkJyB8ICdzdGFydCcgfCAnZGVzdHJveScgfCAnc3VzcGVuZCcgfCAncmVzdW1lJyB8ICdyZXNldCcgfCAndW5rbm93bidcblxuZXhwb3J0IHR5cGUgVGFza0tpbmQgPSAnaW5pdFJlcXVpcmVkJyB8ICdzdGFydCcgfCAnZGVzdHJveScgfCAncGxhdGZvcm1TdXNwZW5kJyB8ICdwbGF0Zm9ybVJlc3VtZScgfCAncGxhdGZvcm1SZXNldCdcblxuZXhwb3J0IGludGVyZmFjZSBFcnJvckNvbnRleHQge1xuICByZWFkb25seSBwaGFzZTogUGhhc2VcbiAgcmVhZG9ubHkgaG9vazogSG9va1xuICByZWFkb25seSBtb2R1bGVJZDogc3RyaW5nXG4gIHJlYWRvbmx5IGluc3RhbmNlSWQ6IHN0cmluZ1xuICByZWFkb25seSB0YXNrSWQ/OiBzdHJpbmdcbiAgcmVhZG9ubHkgdHhuU2VxPzogbnVtYmVyXG4gIHJlYWRvbmx5IG9wU2VxPzogbnVtYmVyXG4gIC8qKlxuICAgKiBcdTRFQzVcdTc1MjhcdTRFOEVcdThCQ0FcdTY1QURcdTg5RTNcdTkxQ0FcdUZGMUFcdThCQjBcdTVGNTVcdTIwMUNcdTk1MTlcdThCRUZcdTRFQ0VcdTU0RUFcdTkxQ0NcdTUxOTJcdTUxRkFcdTY3NjVcdTIwMURcdTc2ODRcdTVCOUVcdTczQjBcdTRGQTdcdTY4MDdcdThCQzZcdUZGMENcbiAgICogXHU0RjhCXHU1OTgyIFwibG9naWMuZm9ya1wiIC8gXCJpbml0UmVxdWlyZWRcIiAvIFwic3RhcnRcIlx1MzAwMlxuICAgKlxuICAgKiBcdTZDRThcdTYxMEZcdUZGMUFcdThCRTVcdTVCNTdcdTZCQjVcdTVGQzVcdTk4N0JcdTUzRUZcdTVFOEZcdTUyMTdcdTUzMTZcdUZGMENcdTRFMTRcdTRFMERcdTVFOTRcdTYyMTBcdTRFM0FcdTUzNEZcdThCQUVcdTk1MUFcdTcwQjlcdTMwMDJcbiAgICovXG4gIHJlYWRvbmx5IG9yaWdpbj86IHN0cmluZ1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIE1vZHVsZVJ1bnRpbWVJZGVudGl0eSB7XG4gIHJlYWRvbmx5IG1vZHVsZUlkOiBzdHJpbmdcbiAgcmVhZG9ubHkgaW5zdGFuY2VJZDogc3RyaW5nXG4gIHJlYWRvbmx5IHJ1bnRpbWVMYWJlbD86IHN0cmluZ1xufVxuXG5leHBvcnQgdHlwZSBJbnN0YW5jZVN0YXR1cyA9ICdjcmVhdGluZycgfCAnaW5pdGlhbGl6aW5nJyB8ICdyZWFkeScgfCAnZmFpbGVkJyB8ICd0ZXJtaW5hdGluZycgfCAndGVybWluYXRlZCdcblxuZXhwb3J0IGludGVyZmFjZSBJbml0UHJvZ3Jlc3Mge1xuICByZWFkb25seSB0b3RhbDogbnVtYmVyXG4gIHJlYWRvbmx5IGNvbXBsZXRlZDogbnVtYmVyXG4gIHJlYWRvbmx5IGN1cnJlbnQ/OiBudW1iZXJcbiAgcmVhZG9ubHkgc3RhcnRlZEF0PzogbnVtYmVyXG59XG5cbmV4cG9ydCB0eXBlIExpZmVjeWNsZU91dGNvbWUgPVxuICB8IHsgcmVhZG9ubHkgc3RhdHVzOiAnc3VjY2VzcycgfVxuICB8IHtcbiAgICAgIHJlYWRvbmx5IHN0YXR1czogJ2ZhaWx1cmUnXG4gICAgICByZWFkb25seSBlcnJvcjogaW1wb3J0KCcuL2Vycm9yU3VtbWFyeS5qcycpLlNlcmlhbGl6YWJsZUVycm9yU3VtbWFyeVxuICAgIH1cblxuZXhwb3J0IGludGVyZmFjZSBMaWZlY3ljbGVTdGF0dXMge1xuICByZWFkb25seSBpZGVudGl0eTogTW9kdWxlUnVudGltZUlkZW50aXR5XG4gIHJlYWRvbmx5IHN0YXR1czogSW5zdGFuY2VTdGF0dXNcbiAgcmVhZG9ubHkgaW5pdE91dGNvbWU/OiBMaWZlY3ljbGVPdXRjb21lXG4gIHJlYWRvbmx5IGluaXRQcm9ncmVzcz86IEluaXRQcm9ncmVzc1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFRhc2tSZWYge1xuICByZWFkb25seSB0YXNrSWQ6IHN0cmluZ1xuICByZWFkb25seSBraW5kOiBUYXNrS2luZFxuICByZWFkb25seSBvcmRlcjogbnVtYmVyXG4gIHJlYWRvbmx5IG5hbWU/OiBzdHJpbmdcbiAgcmVhZG9ubHkgZmF0YWxPbkZhaWx1cmU/OiBib29sZWFuXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTGlmZWN5Y2xlVGFzayBleHRlbmRzIFRhc2tSZWYge1xuICByZWFkb25seSBlZmZlY3Q6IEVmZmVjdC5FZmZlY3Q8dm9pZCwgbmV2ZXIsIGFueT5cbn1cblxuZXhwb3J0IGludGVyZmFjZSBCdWRnZXRzIHtcbiAgLyoqIFx1NTM1NVx1NUI5RVx1NEY4Qlx1NzUxRlx1NTQ3RFx1NTQ2OFx1NjcxRlx1NEU4Qlx1NEVGNlx1OTg4NFx1N0I5N1x1RkYxQVx1NUJGOVx1OUY1MCBzcGVjcy8wMTEgZGF0YS1tb2RlbFx1RkYwOFx1OUVEOFx1OEJBNCBcdTIyNjQyMFx1RkYwOVx1MzAwMiAqL1xuICByZWFkb25seSBtYXhFdmVudHNQZXJJbnN0YW5jZTogbnVtYmVyXG4gIC8qKiBcdTUzNTVcdTRFOEJcdTRFRjZcdTRGNTNcdTc5RUZcdTk4ODRcdTdCOTdcdUZGMUFcdTVCRjlcdTlGNTAgc3BlY3MvMDExIGRhdGEtbW9kZWxcdUZGMDhcdTlFRDhcdThCQTQgXHUyMjY0NEtCXHVGRjA5XHUzMDAyICovXG4gIHJlYWRvbmx5IG1heEV2ZW50Qnl0ZXM6IG51bWJlclxufVxuXG5leHBvcnQgaW50ZXJmYWNlIExpZmVjeWNsZU1hbmFnZXIge1xuICByZWFkb25seSBpZGVudGl0eTogTW9kdWxlUnVudGltZUlkZW50aXR5XG4gIHJlYWRvbmx5IGJ1ZGdldHM6IEJ1ZGdldHNcblxuICByZWFkb25seSByZWdpc3RlclBsYXRmb3JtU3VzcGVuZDogKFxuICAgIGVmZmVjdDogRWZmZWN0LkVmZmVjdDx2b2lkLCBuZXZlciwgYW55PixcbiAgICBvcHRpb25zPzogeyByZWFkb25seSBuYW1lPzogc3RyaW5nIH0sXG4gICkgPT4gdm9pZFxuICByZWFkb25seSByZWdpc3RlclBsYXRmb3JtUmVzdW1lOiAoXG4gICAgZWZmZWN0OiBFZmZlY3QuRWZmZWN0PHZvaWQsIG5ldmVyLCBhbnk+LFxuICAgIG9wdGlvbnM/OiB7IHJlYWRvbmx5IG5hbWU/OiBzdHJpbmcgfSxcbiAgKSA9PiB2b2lkXG4gIHJlYWRvbmx5IHJlZ2lzdGVyUGxhdGZvcm1SZXNldDogKFxuICAgIGVmZmVjdDogRWZmZWN0LkVmZmVjdDx2b2lkLCBuZXZlciwgYW55PixcbiAgICBvcHRpb25zPzogeyByZWFkb25seSBuYW1lPzogc3RyaW5nIH0sXG4gICkgPT4gdm9pZFxuXG4gIHJlYWRvbmx5IHJlZ2lzdGVySW5pdFJlcXVpcmVkOiAoZWZmZWN0OiBFZmZlY3QuRWZmZWN0PHZvaWQsIG5ldmVyLCBhbnk+LCBvcHRpb25zPzogeyByZWFkb25seSBuYW1lPzogc3RyaW5nIH0pID0+IHZvaWRcbiAgcmVhZG9ubHkgcmVnaXN0ZXJTdGFydDogKFxuICAgIGVmZmVjdDogRWZmZWN0LkVmZmVjdDx2b2lkLCBuZXZlciwgYW55PixcbiAgICBvcHRpb25zPzogeyByZWFkb25seSBuYW1lPzogc3RyaW5nOyByZWFkb25seSBmYXRhbE9uRmFpbHVyZT86IGJvb2xlYW4gfSxcbiAgKSA9PiB2b2lkXG4gIHJlYWRvbmx5IHJlZ2lzdGVyRGVzdHJveTogKGVmZmVjdDogRWZmZWN0LkVmZmVjdDx2b2lkLCBuZXZlciwgYW55Piwgb3B0aW9ucz86IHsgcmVhZG9ubHkgbmFtZT86IHN0cmluZyB9KSA9PiB2b2lkXG4gIHJlYWRvbmx5IHJlZ2lzdGVyT25FcnJvcjogKFxuICAgIGhhbmRsZXI6IChjYXVzZTogQ2F1c2UuQ2F1c2U8dW5rbm93bj4sIGNvbnRleHQ6IEVycm9yQ29udGV4dCkgPT4gRWZmZWN0LkVmZmVjdDx2b2lkLCBuZXZlciwgYW55PixcbiAgKSA9PiB2b2lkXG5cbiAgcmVhZG9ubHkgZ2V0U3RhdHVzOiBFZmZlY3QuRWZmZWN0PExpZmVjeWNsZVN0YXR1cz5cbiAgcmVhZG9ubHkgc2V0U3RhdHVzOiAoXG4gICAgc3RhdHVzOiBJbnN0YW5jZVN0YXR1cyxcbiAgICBwYXRjaD86IHtcbiAgICAgIHJlYWRvbmx5IGluaXRPdXRjb21lPzogTGlmZWN5Y2xlT3V0Y29tZSB8IHVuZGVmaW5lZFxuICAgICAgcmVhZG9ubHkgaW5pdFByb2dyZXNzPzogSW5pdFByb2dyZXNzIHwgdW5kZWZpbmVkXG4gICAgICByZWFkb25seSBydW50aW1lTGFiZWw/OiBzdHJpbmcgfCB1bmRlZmluZWRcbiAgICB9LFxuICApID0+IEVmZmVjdC5FZmZlY3Q8dm9pZD5cblxuICByZWFkb25seSBub3RpZnlFcnJvcjogKGNhdXNlOiBDYXVzZS5DYXVzZTx1bmtub3duPiwgY29udGV4dDogRXJyb3JDb250ZXh0KSA9PiBFZmZlY3QuRWZmZWN0PHZvaWQsIG5ldmVyLCBhbnk+XG5cbiAgcmVhZG9ubHkgcnVuUGxhdGZvcm1TdXNwZW5kOiBFZmZlY3QuRWZmZWN0PHZvaWQsIG5ldmVyLCBhbnk+XG4gIHJlYWRvbmx5IHJ1blBsYXRmb3JtUmVzdW1lOiBFZmZlY3QuRWZmZWN0PHZvaWQsIG5ldmVyLCBhbnk+XG4gIHJlYWRvbmx5IHJ1blBsYXRmb3JtUmVzZXQ6IEVmZmVjdC5FZmZlY3Q8dm9pZCwgbmV2ZXIsIGFueT5cblxuICByZWFkb25seSBydW5Jbml0UmVxdWlyZWQ6IEVmZmVjdC5FZmZlY3Q8dm9pZCwgdW5rbm93biwgYW55PlxuICByZWFkb25seSBydW5TdGFydDogRWZmZWN0LkVmZmVjdDx2b2lkLCBuZXZlciwgYW55PlxuICByZWFkb25seSBydW5EZXN0cm95OiBFZmZlY3QuRWZmZWN0PHZvaWQsIG5ldmVyLCBhbnk+XG5cbiAgLyoqIFx1NEVDNVx1NzUyOFx1NEU4RVx1OEJDQVx1NjVBRFx1NzZFRVx1NzY4NFx1RkYxQVx1NjYyRlx1NTQyNlx1NURGMlx1NkNFOFx1NTE4Q1x1NEVGQlx1NjEwRiBvbkVycm9yIFx1NTkwNFx1NzQwNlx1NTY2OFx1MzAwMiAqL1xuICByZWFkb25seSBoYXNPbkVycm9ySGFuZGxlcnM6IEVmZmVjdC5FZmZlY3Q8Ym9vbGVhbj5cblxuICAvKiogXHU0RUM1XHU3NTI4XHU0RThFXHU2RDRCXHU4QkQ1L1x1OEJDQVx1NjVBRFx1RkYxQVx1OEJGQlx1NTNENlx1NURGMlx1NkNFOFx1NTE4Q1x1NzY4NFx1NEVGQlx1NTJBMVx1NUZFQlx1NzE2N1x1RkYwOFx1NEUwRFx1NTNFRlx1NTNEOFx1ODlDNlx1NTZGRVx1RkYwOVx1MzAwMiAqL1xuICByZWFkb25seSBnZXRUYXNrU25hcHNob3Q6IEVmZmVjdC5FZmZlY3Q8XG4gICAgUmVhZG9ubHk8e1xuICAgICAgcmVhZG9ubHkgaW5pdFJlcXVpcmVkOiBSZWFkb25seUFycmF5PFRhc2tSZWY+XG4gICAgICByZWFkb25seSBzdGFydDogUmVhZG9ubHlBcnJheTxUYXNrUmVmPlxuICAgICAgcmVhZG9ubHkgZGVzdHJveTogUmVhZG9ubHlBcnJheTxUYXNrUmVmPlxuICAgICAgcmVhZG9ubHkgcGxhdGZvcm1TdXNwZW5kOiBSZWFkb25seUFycmF5PFRhc2tSZWY+XG4gICAgICByZWFkb25seSBwbGF0Zm9ybVJlc3VtZTogUmVhZG9ubHlBcnJheTxUYXNrUmVmPlxuICAgICAgcmVhZG9ubHkgcGxhdGZvcm1SZXNldDogUmVhZG9ubHlBcnJheTxUYXNrUmVmPlxuICAgIH0+LFxuICAgIG5ldmVyLFxuICAgIG5ldmVyXG4gID5cbn1cblxuZXhwb3J0IGNvbnN0IExpZmVjeWNsZUNvbnRleHQgPSBDb250ZXh0LkdlbmVyaWNUYWc8TGlmZWN5Y2xlTWFuYWdlcj4oJ0Bsb2dpeC9MaWZlY3ljbGVNYW5hZ2VyJylcblxuY29uc3Qgc2FmZVJ1biA9IChsYWJlbDogc3RyaW5nLCBlZmY6IEVmZmVjdC5FZmZlY3Q8dm9pZCwgYW55LCBhbnk+KSA9PlxuICBlZmYucGlwZShcbiAgICBFZmZlY3QubWF0Y2hDYXVzZUVmZmVjdCh7XG4gICAgICBvblN1Y2Nlc3M6ICgpID0+IEVmZmVjdC52b2lkLFxuICAgICAgb25GYWlsdXJlOiAoY2F1c2UpID0+IEVmZmVjdC5sb2dFcnJvcihgWyR7bGFiZWx9XSBmYWlsZWQ6ICR7Q2F1c2UucHJldHR5KGNhdXNlKX1gKSxcbiAgICB9KSxcbiAgKVxuXG5jb25zdCBtYWtlVGFza0lkID0gKGtpbmQ6IFRhc2tLaW5kLCBvcmRlcjogbnVtYmVyKTogc3RyaW5nID0+IGAke2tpbmR9OiR7b3JkZXJ9YFxuXG5leHBvcnQgY29uc3QgbWFrZUxpZmVjeWNsZU1hbmFnZXIgPSAoaWRlbnRpdHk6IE1vZHVsZVJ1bnRpbWVJZGVudGl0eSk6IEVmZmVjdC5FZmZlY3Q8TGlmZWN5Y2xlTWFuYWdlcj4gPT5cbiAgRWZmZWN0LmdlbihmdW5jdGlvbiogKCkge1xuICAgIGNvbnN0IGJ1ZGdldHM6IEJ1ZGdldHMgPSB7XG4gICAgICBtYXhFdmVudHNQZXJJbnN0YW5jZTogMjAsXG4gICAgICBtYXhFdmVudEJ5dGVzOiA0ICogMTAyNCxcbiAgICB9XG5cbiAgICBjb25zdCBzdGF0dXNSZWYgPSB5aWVsZCogUmVmLm1ha2U8TGlmZWN5Y2xlU3RhdHVzPih7XG4gICAgICBpZGVudGl0eSxcbiAgICAgIHN0YXR1czogJ2NyZWF0aW5nJyxcbiAgICB9KVxuXG4gICAgY29uc3QgaW5pdFJlcXVpcmVkOiBMaWZlY3ljbGVUYXNrW10gPSBbXVxuICAgIGNvbnN0IHN0YXJ0OiBMaWZlY3ljbGVUYXNrW10gPSBbXVxuICAgIGNvbnN0IGRlc3Ryb3k6IExpZmVjeWNsZVRhc2tbXSA9IFtdXG4gICAgY29uc3QgcGxhdGZvcm1TdXNwZW5kOiBMaWZlY3ljbGVUYXNrW10gPSBbXVxuICAgIGNvbnN0IHBsYXRmb3JtUmVzdW1lOiBMaWZlY3ljbGVUYXNrW10gPSBbXVxuICAgIGNvbnN0IHBsYXRmb3JtUmVzZXQ6IExpZmVjeWNsZVRhc2tbXSA9IFtdXG4gICAgY29uc3Qgb25FcnJvckhhbmRsZXJzOiBBcnJheTxcbiAgICAgIChjYXVzZTogQ2F1c2UuQ2F1c2U8dW5rbm93bj4sIGNvbnRleHQ6IEVycm9yQ29udGV4dCkgPT4gRWZmZWN0LkVmZmVjdDx2b2lkLCBuZXZlciwgYW55PlxuICAgID4gPSBbXVxuXG4gICAgY29uc3QgZ2V0U3RhdHVzOiBFZmZlY3QuRWZmZWN0PExpZmVjeWNsZVN0YXR1cz4gPSBSZWYuZ2V0KHN0YXR1c1JlZilcblxuICAgIGNvbnN0IHJlY29yZFBoYXNlID0gKHBoYXNlOiBQaGFzZSwgbmFtZTogc3RyaW5nLCBwYXlsb2FkPzogdW5rbm93bik6IEVmZmVjdC5FZmZlY3Q8dm9pZCwgbmV2ZXIsIGFueT4gPT5cbiAgICAgIERlYnVnLnJlY29yZCh7XG4gICAgICAgIHR5cGU6ICdsaWZlY3ljbGU6cGhhc2UnLFxuICAgICAgICBtb2R1bGVJZDogaWRlbnRpdHkubW9kdWxlSWQsXG4gICAgICAgIGluc3RhbmNlSWQ6IGlkZW50aXR5Lmluc3RhbmNlSWQsXG4gICAgICAgIHBoYXNlLFxuICAgICAgICBuYW1lLFxuICAgICAgICBwYXlsb2FkLFxuICAgICAgfSlcblxuICAgIGNvbnN0IHNldFN0YXR1cyA9IChcbiAgICAgIHN0YXR1czogSW5zdGFuY2VTdGF0dXMsXG4gICAgICBwYXRjaD86IHtcbiAgICAgICAgcmVhZG9ubHkgaW5pdE91dGNvbWU/OiBMaWZlY3ljbGVPdXRjb21lIHwgdW5kZWZpbmVkXG4gICAgICAgIHJlYWRvbmx5IGluaXRQcm9ncmVzcz86IEluaXRQcm9ncmVzcyB8IHVuZGVmaW5lZFxuICAgICAgICByZWFkb25seSBydW50aW1lTGFiZWw/OiBzdHJpbmcgfCB1bmRlZmluZWRcbiAgICAgIH0sXG4gICAgKSA9PlxuICAgICAgUmVmLnVwZGF0ZShzdGF0dXNSZWYsIChwcmV2KSA9PiAoe1xuICAgICAgICAuLi5wcmV2LFxuICAgICAgICBpZGVudGl0eToge1xuICAgICAgICAgIC4uLnByZXYuaWRlbnRpdHksXG4gICAgICAgICAgLi4uKHBhdGNoPy5ydW50aW1lTGFiZWwgPyB7IHJ1bnRpbWVMYWJlbDogcGF0Y2gucnVudGltZUxhYmVsIH0gOiBudWxsKSxcbiAgICAgICAgfSxcbiAgICAgICAgc3RhdHVzLFxuICAgICAgICAuLi4ocGF0Y2g/LmluaXRPdXRjb21lICE9PSB1bmRlZmluZWQgPyB7IGluaXRPdXRjb21lOiBwYXRjaC5pbml0T3V0Y29tZSB9IDogbnVsbCksXG4gICAgICAgIC4uLihwYXRjaD8uaW5pdFByb2dyZXNzICE9PSB1bmRlZmluZWQgPyB7IGluaXRQcm9ncmVzczogcGF0Y2guaW5pdFByb2dyZXNzIH0gOiBudWxsKSxcbiAgICAgIH0pKVxuXG4gICAgY29uc3QgcmVnaXN0ZXJJbml0UmVxdWlyZWQgPSAoZWZmZWN0OiBFZmZlY3QuRWZmZWN0PHZvaWQsIG5ldmVyLCBhbnk+LCBvcHRpb25zPzogeyByZWFkb25seSBuYW1lPzogc3RyaW5nIH0pID0+IHtcbiAgICAgIGNvbnN0IG9yZGVyID0gaW5pdFJlcXVpcmVkLmxlbmd0aFxuICAgICAgaW5pdFJlcXVpcmVkLnB1c2goe1xuICAgICAgICB0YXNrSWQ6IG1ha2VUYXNrSWQoJ2luaXRSZXF1aXJlZCcsIG9yZGVyKSxcbiAgICAgICAga2luZDogJ2luaXRSZXF1aXJlZCcsXG4gICAgICAgIG9yZGVyLFxuICAgICAgICBuYW1lOiBvcHRpb25zPy5uYW1lLFxuICAgICAgICBlZmZlY3QsXG4gICAgICB9KVxuICAgIH1cblxuICAgIGNvbnN0IHJlZ2lzdGVyU3RhcnQgPSAoXG4gICAgICBlZmZlY3Q6IEVmZmVjdC5FZmZlY3Q8dm9pZCwgbmV2ZXIsIGFueT4sXG4gICAgICBvcHRpb25zPzogeyByZWFkb25seSBuYW1lPzogc3RyaW5nOyByZWFkb25seSBmYXRhbE9uRmFpbHVyZT86IGJvb2xlYW4gfSxcbiAgICApID0+IHtcbiAgICAgIGNvbnN0IG9yZGVyID0gc3RhcnQubGVuZ3RoXG4gICAgICBzdGFydC5wdXNoKHtcbiAgICAgICAgdGFza0lkOiBtYWtlVGFza0lkKCdzdGFydCcsIG9yZGVyKSxcbiAgICAgICAga2luZDogJ3N0YXJ0JyxcbiAgICAgICAgb3JkZXIsXG4gICAgICAgIG5hbWU6IG9wdGlvbnM/Lm5hbWUsXG4gICAgICAgIGZhdGFsT25GYWlsdXJlOiBvcHRpb25zPy5mYXRhbE9uRmFpbHVyZSxcbiAgICAgICAgZWZmZWN0LFxuICAgICAgfSlcbiAgICB9XG5cbiAgICBjb25zdCByZWdpc3RlckRlc3Ryb3kgPSAoZWZmZWN0OiBFZmZlY3QuRWZmZWN0PHZvaWQsIG5ldmVyLCBhbnk+LCBvcHRpb25zPzogeyByZWFkb25seSBuYW1lPzogc3RyaW5nIH0pID0+IHtcbiAgICAgIGNvbnN0IG9yZGVyID0gZGVzdHJveS5sZW5ndGhcbiAgICAgIGRlc3Ryb3kucHVzaCh7XG4gICAgICAgIHRhc2tJZDogbWFrZVRhc2tJZCgnZGVzdHJveScsIG9yZGVyKSxcbiAgICAgICAga2luZDogJ2Rlc3Ryb3knLFxuICAgICAgICBvcmRlcixcbiAgICAgICAgbmFtZTogb3B0aW9ucz8ubmFtZSxcbiAgICAgICAgZWZmZWN0LFxuICAgICAgfSlcbiAgICB9XG5cbiAgICBjb25zdCByZWdpc3Rlck9uRXJyb3IgPSAoXG4gICAgICBoYW5kbGVyOiAoY2F1c2U6IENhdXNlLkNhdXNlPHVua25vd24+LCBjb250ZXh0OiBFcnJvckNvbnRleHQpID0+IEVmZmVjdC5FZmZlY3Q8dm9pZCwgbmV2ZXIsIGFueT4sXG4gICAgKSA9PiB7XG4gICAgICBvbkVycm9ySGFuZGxlcnMucHVzaChoYW5kbGVyKVxuICAgIH1cblxuICAgIGNvbnN0IHJlZ2lzdGVyUGxhdGZvcm1TdXNwZW5kID0gKGVmZmVjdDogRWZmZWN0LkVmZmVjdDx2b2lkLCBuZXZlciwgYW55Piwgb3B0aW9ucz86IHsgcmVhZG9ubHkgbmFtZT86IHN0cmluZyB9KSA9PiB7XG4gICAgICBjb25zdCBvcmRlciA9IHBsYXRmb3JtU3VzcGVuZC5sZW5ndGhcbiAgICAgIHBsYXRmb3JtU3VzcGVuZC5wdXNoKHtcbiAgICAgICAgdGFza0lkOiBtYWtlVGFza0lkKCdwbGF0Zm9ybVN1c3BlbmQnLCBvcmRlciksXG4gICAgICAgIGtpbmQ6ICdwbGF0Zm9ybVN1c3BlbmQnLFxuICAgICAgICBvcmRlcixcbiAgICAgICAgbmFtZTogb3B0aW9ucz8ubmFtZSxcbiAgICAgICAgZWZmZWN0LFxuICAgICAgfSlcbiAgICB9XG5cbiAgICBjb25zdCByZWdpc3RlclBsYXRmb3JtUmVzdW1lID0gKGVmZmVjdDogRWZmZWN0LkVmZmVjdDx2b2lkLCBuZXZlciwgYW55Piwgb3B0aW9ucz86IHsgcmVhZG9ubHkgbmFtZT86IHN0cmluZyB9KSA9PiB7XG4gICAgICBjb25zdCBvcmRlciA9IHBsYXRmb3JtUmVzdW1lLmxlbmd0aFxuICAgICAgcGxhdGZvcm1SZXN1bWUucHVzaCh7XG4gICAgICAgIHRhc2tJZDogbWFrZVRhc2tJZCgncGxhdGZvcm1SZXN1bWUnLCBvcmRlciksXG4gICAgICAgIGtpbmQ6ICdwbGF0Zm9ybVJlc3VtZScsXG4gICAgICAgIG9yZGVyLFxuICAgICAgICBuYW1lOiBvcHRpb25zPy5uYW1lLFxuICAgICAgICBlZmZlY3QsXG4gICAgICB9KVxuICAgIH1cblxuICAgIGNvbnN0IHJlZ2lzdGVyUGxhdGZvcm1SZXNldCA9IChlZmZlY3Q6IEVmZmVjdC5FZmZlY3Q8dm9pZCwgbmV2ZXIsIGFueT4sIG9wdGlvbnM/OiB7IHJlYWRvbmx5IG5hbWU/OiBzdHJpbmcgfSkgPT4ge1xuICAgICAgY29uc3Qgb3JkZXIgPSBwbGF0Zm9ybVJlc2V0Lmxlbmd0aFxuICAgICAgcGxhdGZvcm1SZXNldC5wdXNoKHtcbiAgICAgICAgdGFza0lkOiBtYWtlVGFza0lkKCdwbGF0Zm9ybVJlc2V0Jywgb3JkZXIpLFxuICAgICAgICBraW5kOiAncGxhdGZvcm1SZXNldCcsXG4gICAgICAgIG9yZGVyLFxuICAgICAgICBuYW1lOiBvcHRpb25zPy5uYW1lLFxuICAgICAgICBlZmZlY3QsXG4gICAgICB9KVxuICAgIH1cblxuICAgIGNvbnN0IG5vdGlmeUVycm9yID0gKGNhdXNlOiBDYXVzZS5DYXVzZTx1bmtub3duPiwgY29udGV4dDogRXJyb3JDb250ZXh0KSA9PiB7XG4gICAgICAvLyBcdTRFMkRcdTY1QUQvXHU1M0Q2XHU2RDg4XHU0RTBEXHU1RTk0XHU4OEFCXHU1RjUzXHU0RjVDXHU5NTE5XHU4QkVGXHU0RTBBXHU2MkE1XHUzMDAyXG4gICAgICBpZiAoQ2F1c2UuaXNJbnRlcnJ1cHRlZChjYXVzZSkpIHtcbiAgICAgICAgcmV0dXJuIEVmZmVjdC52b2lkXG4gICAgICB9XG5cbiAgICAgIHJldHVybiBEZWJ1Zy5yZWNvcmQoe1xuICAgICAgICB0eXBlOiAnbGlmZWN5Y2xlOmVycm9yJyxcbiAgICAgICAgbW9kdWxlSWQ6IGNvbnRleHQubW9kdWxlSWQsXG4gICAgICAgIGluc3RhbmNlSWQ6IGNvbnRleHQuaW5zdGFuY2VJZCxcbiAgICAgICAgY2F1c2UsXG4gICAgICAgIHBoYXNlOiBjb250ZXh0LnBoYXNlLFxuICAgICAgICBob29rOiBjb250ZXh0Lmhvb2ssXG4gICAgICAgIHRhc2tJZDogY29udGV4dC50YXNrSWQsXG4gICAgICAgIHR4blNlcTogY29udGV4dC50eG5TZXEsXG4gICAgICAgIG9wU2VxOiBjb250ZXh0Lm9wU2VxLFxuICAgICAgICBvcmlnaW46IGNvbnRleHQub3JpZ2luLFxuICAgICAgfSkucGlwZShcbiAgICAgICAgRWZmZWN0LnppcFJpZ2h0KFxuICAgICAgICAgIEVmZmVjdC5mb3JFYWNoKFxuICAgICAgICAgICAgb25FcnJvckhhbmRsZXJzLFxuICAgICAgICAgICAgKGhhbmRsZXIpID0+XG4gICAgICAgICAgICAgIGhhbmRsZXIoY2F1c2UsIGNvbnRleHQpLnBpcGUoXG4gICAgICAgICAgICAgICAgRWZmZWN0LmNhdGNoQWxsQ2F1c2UoKGlubmVyKSA9PiBFZmZlY3QubG9nRXJyb3IoYFtsaWZlY3ljbGUub25FcnJvcl0gZmFpbGVkOiAke0NhdXNlLnByZXR0eShpbm5lcil9YCkpLFxuICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgeyBkaXNjYXJkOiB0cnVlIH0sXG4gICAgICAgICAgKSxcbiAgICAgICAgKSxcbiAgICAgIClcbiAgICB9XG5cbiAgICBjb25zdCBydW5Jbml0UmVxdWlyZWQ6IEVmZmVjdC5FZmZlY3Q8dm9pZCwgdW5rbm93biwgYW55PiA9IEVmZmVjdC5nZW4oZnVuY3Rpb24qICgpIHtcbiAgICAgIGNvbnN0IHRvdGFsID0gaW5pdFJlcXVpcmVkLmxlbmd0aFxuICAgICAgaWYgKHRvdGFsID09PSAwKSB7XG4gICAgICAgIHlpZWxkKiBzZXRTdGF0dXMoJ3JlYWR5Jywge1xuICAgICAgICAgIGluaXRQcm9ncmVzczogeyB0b3RhbDogMCwgY29tcGxldGVkOiAwIH0sXG4gICAgICAgICAgaW5pdE91dGNvbWU6IHsgc3RhdHVzOiAnc3VjY2VzcycgfSxcbiAgICAgICAgfSlcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHN0YXJ0ZWRBdCA9IERhdGUubm93KClcbiAgICAgIHlpZWxkKiByZWNvcmRQaGFzZSgnaW5pdCcsICdpbml0UmVxdWlyZWQ6c3RhcnQnLCB7IHRvdGFsIH0pXG4gICAgICB5aWVsZCogc2V0U3RhdHVzKCdpbml0aWFsaXppbmcnLCB7XG4gICAgICAgIGluaXRQcm9ncmVzczogeyB0b3RhbCwgY29tcGxldGVkOiAwLCBjdXJyZW50OiAwLCBzdGFydGVkQXQgfSxcbiAgICAgIH0pXG5cbiAgICAgIGxldCBjb21wbGV0ZWQgPSAwXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGluaXRSZXF1aXJlZC5sZW5ndGg7IGkrKykge1xuICAgICAgICB5aWVsZCogc2V0U3RhdHVzKCdpbml0aWFsaXppbmcnLCB7XG4gICAgICAgICAgaW5pdFByb2dyZXNzOiB7IHRvdGFsLCBjb21wbGV0ZWQsIGN1cnJlbnQ6IGksIHN0YXJ0ZWRBdCB9LFxuICAgICAgICB9KVxuXG4gICAgICAgIGNvbnN0IHRhc2sgPSBpbml0UmVxdWlyZWRbaV1cbiAgICAgICAgY29uc3QgZXhpdCA9IHlpZWxkKiBFZmZlY3QuZXhpdCh0YXNrLmVmZmVjdClcblxuICAgICAgICBpZiAoZXhpdC5fdGFnID09PSAnU3VjY2VzcycpIHtcbiAgICAgICAgICBjb21wbGV0ZWQgKz0gMVxuICAgICAgICAgIHlpZWxkKiBzZXRTdGF0dXMoJ2luaXRpYWxpemluZycsIHtcbiAgICAgICAgICAgIGluaXRQcm9ncmVzczogeyB0b3RhbCwgY29tcGxldGVkLCBjdXJyZW50OiBpICsgMSwgc3RhcnRlZEF0IH0sXG4gICAgICAgICAgfSlcbiAgICAgICAgICBjb250aW51ZVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgc3VtbWFyeSA9IHRvU2VyaWFsaXphYmxlRXJyb3JTdW1tYXJ5KGV4aXQuY2F1c2UpXG4gICAgICAgIHlpZWxkKiBub3RpZnlFcnJvcihleGl0LmNhdXNlLCB7XG4gICAgICAgICAgcGhhc2U6ICdpbml0JyxcbiAgICAgICAgICBob29rOiAnaW5pdFJlcXVpcmVkJyxcbiAgICAgICAgICBtb2R1bGVJZDogaWRlbnRpdHkubW9kdWxlSWQsXG4gICAgICAgICAgaW5zdGFuY2VJZDogaWRlbnRpdHkuaW5zdGFuY2VJZCxcbiAgICAgICAgICB0YXNrSWQ6IHRhc2sudGFza0lkLFxuICAgICAgICAgIG9yaWdpbjogJ2luaXRSZXF1aXJlZCcsXG4gICAgICAgIH0pXG5cbiAgICAgICAgeWllbGQqIHNldFN0YXR1cygnZmFpbGVkJywge1xuICAgICAgICAgIGluaXRQcm9ncmVzczogeyB0b3RhbCwgY29tcGxldGVkLCBjdXJyZW50OiBpLCBzdGFydGVkQXQgfSxcbiAgICAgICAgICBpbml0T3V0Y29tZTogeyBzdGF0dXM6ICdmYWlsdXJlJywgZXJyb3I6IHN1bW1hcnkuZXJyb3JTdW1tYXJ5IH0sXG4gICAgICAgIH0pXG5cbiAgICAgICAgcmV0dXJuIHlpZWxkKiBFZmZlY3QuZmFpbENhdXNlKGV4aXQuY2F1c2UpXG4gICAgICB9XG5cbiAgICAgIHlpZWxkKiByZWNvcmRQaGFzZSgnaW5pdCcsICdpbml0UmVxdWlyZWQ6c3VjY2VzcycsIHsgdG90YWwgfSlcbiAgICAgIHlpZWxkKiBzZXRTdGF0dXMoJ3JlYWR5Jywge1xuICAgICAgICBpbml0UHJvZ3Jlc3M6IHsgdG90YWwsIGNvbXBsZXRlZCwgY3VycmVudDogdG90YWwsIHN0YXJ0ZWRBdCB9LFxuICAgICAgICBpbml0T3V0Y29tZTogeyBzdGF0dXM6ICdzdWNjZXNzJyB9LFxuICAgICAgfSlcbiAgICB9KVxuXG4gICAgY29uc3QgcnVuU3RhcnQ6IEVmZmVjdC5FZmZlY3Q8dm9pZCwgbmV2ZXIsIGFueT4gPSByZWNvcmRQaGFzZSgncnVuJywgJ3N0YXJ0OnNjaGVkdWxlJywge1xuICAgICAgdG90YWw6IHN0YXJ0Lmxlbmd0aCxcbiAgICB9KS5waXBlKFxuICAgICAgRWZmZWN0LnppcFJpZ2h0KFxuICAgICAgICBFZmZlY3QuZm9yRWFjaChcbiAgICAgICAgICBzdGFydCxcbiAgICAgICAgICAodGFzaykgPT5cbiAgICAgICAgICAgIEVmZmVjdC5mb3JrU2NvcGVkKFxuICAgICAgICAgICAgICB0YXNrLmVmZmVjdC5waXBlKFxuICAgICAgICAgICAgICAgIEVmZmVjdC5jYXRjaEFsbENhdXNlKChjYXVzZSkgPT5cbiAgICAgICAgICAgICAgICAgIG5vdGlmeUVycm9yKGNhdXNlLCB7XG4gICAgICAgICAgICAgICAgICAgIHBoYXNlOiAncnVuJyxcbiAgICAgICAgICAgICAgICAgICAgaG9vazogJ3N0YXJ0JyxcbiAgICAgICAgICAgICAgICAgICAgbW9kdWxlSWQ6IGlkZW50aXR5Lm1vZHVsZUlkLFxuICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZUlkOiBpZGVudGl0eS5pbnN0YW5jZUlkLFxuICAgICAgICAgICAgICAgICAgICB0YXNrSWQ6IHRhc2sudGFza0lkLFxuICAgICAgICAgICAgICAgICAgICBvcmlnaW46ICdzdGFydCcsXG4gICAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgKS5waXBlKEVmZmVjdC5hc1ZvaWQpLFxuICAgICAgICAgIHsgZGlzY2FyZDogdHJ1ZSwgY29uY3VycmVuY3k6ICd1bmJvdW5kZWQnIH0sXG4gICAgICAgICksXG4gICAgICApLFxuICAgIClcblxuICAgIGNvbnN0IHJ1bkRlc3Ryb3k6IEVmZmVjdC5FZmZlY3Q8dm9pZCwgbmV2ZXIsIGFueT4gPSBFZmZlY3QuZ2VuKGZ1bmN0aW9uKiAoKSB7XG4gICAgICB5aWVsZCogcmVjb3JkUGhhc2UoJ2Rlc3Ryb3knLCAnZGVzdHJveTpzdGFydCcsIHsgdG90YWw6IGRlc3Ryb3kubGVuZ3RoIH0pXG4gICAgICB5aWVsZCogc2V0U3RhdHVzKCd0ZXJtaW5hdGluZycpXG5cbiAgICAgIC8vIGRlc3Ryb3lcdUZGMUFcdTU0MEVcdTZDRThcdTUxOENcdTUxNDhcdTYyNjdcdTg4NENcdUZGMDhMSUZPXHVGRjA5XHVGRjBDXHU0RTE0IGJlc3QtZWZmb3J0XHVGRjA4XHU1MzU1XHU0RTJBXHU1OTMxXHU4RDI1XHU0RTBEXHU5NjNCXHU1ODVFXHU1NDBFXHU3RUVEXHVGRjA5XHUzMDAyXG4gICAgICBmb3IgKGxldCBpID0gZGVzdHJveS5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgICBjb25zdCB0YXNrID0gZGVzdHJveVtpXVxuICAgICAgICB5aWVsZCogc2FmZVJ1bihcbiAgICAgICAgICAnbGlmZWN5Y2xlLm9uRGVzdHJveScsXG4gICAgICAgICAgdGFzay5lZmZlY3QucGlwZShcbiAgICAgICAgICAgIEVmZmVjdC5jYXRjaEFsbENhdXNlKChjYXVzZSkgPT5cbiAgICAgICAgICAgICAgbm90aWZ5RXJyb3IoY2F1c2UsIHtcbiAgICAgICAgICAgICAgICBwaGFzZTogJ2Rlc3Ryb3knLFxuICAgICAgICAgICAgICAgIGhvb2s6ICdkZXN0cm95JyxcbiAgICAgICAgICAgICAgICBtb2R1bGVJZDogaWRlbnRpdHkubW9kdWxlSWQsXG4gICAgICAgICAgICAgICAgaW5zdGFuY2VJZDogaWRlbnRpdHkuaW5zdGFuY2VJZCxcbiAgICAgICAgICAgICAgICB0YXNrSWQ6IHRhc2sudGFza0lkLFxuICAgICAgICAgICAgICAgIG9yaWdpbjogJ2Rlc3Ryb3knLFxuICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICksXG4gICAgICAgICAgKSxcbiAgICAgICAgKVxuICAgICAgfVxuXG4gICAgICB5aWVsZCogc2V0U3RhdHVzKCd0ZXJtaW5hdGVkJylcbiAgICAgIHlpZWxkKiByZWNvcmRQaGFzZSgnZGVzdHJveScsICdkZXN0cm95OmRvbmUnLCB7IHRvdGFsOiBkZXN0cm95Lmxlbmd0aCB9KVxuICAgIH0pXG5cbiAgICBjb25zdCBydW5QbGF0Zm9ybVN1c3BlbmQ6IEVmZmVjdC5FZmZlY3Q8dm9pZCwgbmV2ZXIsIGFueT4gPSBFZmZlY3QuZ2VuKGZ1bmN0aW9uKiAoKSB7XG4gICAgICBpZiAocGxhdGZvcm1TdXNwZW5kLmxlbmd0aCA9PT0gMCkgcmV0dXJuXG5cbiAgICAgIHlpZWxkKiByZWNvcmRQaGFzZSgncGxhdGZvcm0nLCAnc2lnbmFsOnN1c3BlbmQnLCB7IHRvdGFsOiBwbGF0Zm9ybVN1c3BlbmQubGVuZ3RoIH0pXG4gICAgICBmb3IgKGNvbnN0IHRhc2sgb2YgcGxhdGZvcm1TdXNwZW5kKSB7XG4gICAgICAgIHlpZWxkKiBzYWZlUnVuKFxuICAgICAgICAgICdsaWZlY3ljbGUub25TdXNwZW5kJyxcbiAgICAgICAgICB0YXNrLmVmZmVjdC5waXBlKFxuICAgICAgICAgICAgRWZmZWN0LmNhdGNoQWxsQ2F1c2UoKGNhdXNlKSA9PlxuICAgICAgICAgICAgICBub3RpZnlFcnJvcihjYXVzZSwge1xuICAgICAgICAgICAgICAgIHBoYXNlOiAncGxhdGZvcm0nLFxuICAgICAgICAgICAgICAgIGhvb2s6ICdzdXNwZW5kJyxcbiAgICAgICAgICAgICAgICBtb2R1bGVJZDogaWRlbnRpdHkubW9kdWxlSWQsXG4gICAgICAgICAgICAgICAgaW5zdGFuY2VJZDogaWRlbnRpdHkuaW5zdGFuY2VJZCxcbiAgICAgICAgICAgICAgICB0YXNrSWQ6IHRhc2sudGFza0lkLFxuICAgICAgICAgICAgICAgIG9yaWdpbjogJ3BsYXRmb3JtLnN1c3BlbmQnLFxuICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICksXG4gICAgICAgICAgKSxcbiAgICAgICAgKVxuICAgICAgfVxuICAgIH0pXG5cbiAgICBjb25zdCBydW5QbGF0Zm9ybVJlc3VtZTogRWZmZWN0LkVmZmVjdDx2b2lkLCBuZXZlciwgYW55PiA9IEVmZmVjdC5nZW4oZnVuY3Rpb24qICgpIHtcbiAgICAgIGlmIChwbGF0Zm9ybVJlc3VtZS5sZW5ndGggPT09IDApIHJldHVyblxuXG4gICAgICB5aWVsZCogcmVjb3JkUGhhc2UoJ3BsYXRmb3JtJywgJ3NpZ25hbDpyZXN1bWUnLCB7IHRvdGFsOiBwbGF0Zm9ybVJlc3VtZS5sZW5ndGggfSlcbiAgICAgIGZvciAoY29uc3QgdGFzayBvZiBwbGF0Zm9ybVJlc3VtZSkge1xuICAgICAgICB5aWVsZCogc2FmZVJ1bihcbiAgICAgICAgICAnbGlmZWN5Y2xlLm9uUmVzdW1lJyxcbiAgICAgICAgICB0YXNrLmVmZmVjdC5waXBlKFxuICAgICAgICAgICAgRWZmZWN0LmNhdGNoQWxsQ2F1c2UoKGNhdXNlKSA9PlxuICAgICAgICAgICAgICBub3RpZnlFcnJvcihjYXVzZSwge1xuICAgICAgICAgICAgICAgIHBoYXNlOiAncGxhdGZvcm0nLFxuICAgICAgICAgICAgICAgIGhvb2s6ICdyZXN1bWUnLFxuICAgICAgICAgICAgICAgIG1vZHVsZUlkOiBpZGVudGl0eS5tb2R1bGVJZCxcbiAgICAgICAgICAgICAgICBpbnN0YW5jZUlkOiBpZGVudGl0eS5pbnN0YW5jZUlkLFxuICAgICAgICAgICAgICAgIHRhc2tJZDogdGFzay50YXNrSWQsXG4gICAgICAgICAgICAgICAgb3JpZ2luOiAncGxhdGZvcm0ucmVzdW1lJyxcbiAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICApLFxuICAgICAgICAgICksXG4gICAgICAgIClcbiAgICAgIH1cbiAgICB9KVxuXG4gICAgY29uc3QgcnVuUGxhdGZvcm1SZXNldDogRWZmZWN0LkVmZmVjdDx2b2lkLCBuZXZlciwgYW55PiA9IEVmZmVjdC5nZW4oZnVuY3Rpb24qICgpIHtcbiAgICAgIGlmIChwbGF0Zm9ybVJlc2V0Lmxlbmd0aCA9PT0gMCkgcmV0dXJuXG5cbiAgICAgIHlpZWxkKiByZWNvcmRQaGFzZSgncGxhdGZvcm0nLCAnc2lnbmFsOnJlc2V0JywgeyB0b3RhbDogcGxhdGZvcm1SZXNldC5sZW5ndGggfSlcbiAgICAgIGZvciAoY29uc3QgdGFzayBvZiBwbGF0Zm9ybVJlc2V0KSB7XG4gICAgICAgIHlpZWxkKiBzYWZlUnVuKFxuICAgICAgICAgICdsaWZlY3ljbGUub25SZXNldCcsXG4gICAgICAgICAgdGFzay5lZmZlY3QucGlwZShcbiAgICAgICAgICAgIEVmZmVjdC5jYXRjaEFsbENhdXNlKChjYXVzZSkgPT5cbiAgICAgICAgICAgICAgbm90aWZ5RXJyb3IoY2F1c2UsIHtcbiAgICAgICAgICAgICAgICBwaGFzZTogJ3BsYXRmb3JtJyxcbiAgICAgICAgICAgICAgICBob29rOiAncmVzZXQnLFxuICAgICAgICAgICAgICAgIG1vZHVsZUlkOiBpZGVudGl0eS5tb2R1bGVJZCxcbiAgICAgICAgICAgICAgICBpbnN0YW5jZUlkOiBpZGVudGl0eS5pbnN0YW5jZUlkLFxuICAgICAgICAgICAgICAgIHRhc2tJZDogdGFzay50YXNrSWQsXG4gICAgICAgICAgICAgICAgb3JpZ2luOiAncGxhdGZvcm0ucmVzZXQnLFxuICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICksXG4gICAgICAgICAgKSxcbiAgICAgICAgKVxuICAgICAgfVxuICAgIH0pXG5cbiAgICBjb25zdCBnZXRUYXNrU25hcHNob3Q6IExpZmVjeWNsZU1hbmFnZXJbJ2dldFRhc2tTbmFwc2hvdCddID0gRWZmZWN0LnN5bmMoKCkgPT4gKHtcbiAgICAgIGluaXRSZXF1aXJlZDogaW5pdFJlcXVpcmVkLm1hcCgoeyBlZmZlY3Q6IF9lZmYsIC4uLnJlc3QgfSkgPT4gcmVzdCksXG4gICAgICBzdGFydDogc3RhcnQubWFwKCh7IGVmZmVjdDogX2VmZiwgLi4ucmVzdCB9KSA9PiByZXN0KSxcbiAgICAgIGRlc3Ryb3k6IGRlc3Ryb3kubWFwKCh7IGVmZmVjdDogX2VmZiwgLi4ucmVzdCB9KSA9PiByZXN0KSxcbiAgICAgIHBsYXRmb3JtU3VzcGVuZDogcGxhdGZvcm1TdXNwZW5kLm1hcCgoeyBlZmZlY3Q6IF9lZmYsIC4uLnJlc3QgfSkgPT4gcmVzdCksXG4gICAgICBwbGF0Zm9ybVJlc3VtZTogcGxhdGZvcm1SZXN1bWUubWFwKCh7IGVmZmVjdDogX2VmZiwgLi4ucmVzdCB9KSA9PiByZXN0KSxcbiAgICAgIHBsYXRmb3JtUmVzZXQ6IHBsYXRmb3JtUmVzZXQubWFwKCh7IGVmZmVjdDogX2VmZiwgLi4ucmVzdCB9KSA9PiByZXN0KSxcbiAgICB9KSlcblxuICAgIGNvbnN0IGhhc09uRXJyb3JIYW5kbGVyczogTGlmZWN5Y2xlTWFuYWdlclsnaGFzT25FcnJvckhhbmRsZXJzJ10gPSBFZmZlY3Quc3luYygoKSA9PiBvbkVycm9ySGFuZGxlcnMubGVuZ3RoID4gMClcblxuICAgIHJldHVybiB7XG4gICAgICBpZGVudGl0eSxcbiAgICAgIGJ1ZGdldHMsXG4gICAgICByZWdpc3RlclBsYXRmb3JtU3VzcGVuZCxcbiAgICAgIHJlZ2lzdGVyUGxhdGZvcm1SZXN1bWUsXG4gICAgICByZWdpc3RlclBsYXRmb3JtUmVzZXQsXG4gICAgICByZWdpc3RlckluaXRSZXF1aXJlZCxcbiAgICAgIHJlZ2lzdGVyU3RhcnQsXG4gICAgICByZWdpc3RlckRlc3Ryb3ksXG4gICAgICByZWdpc3Rlck9uRXJyb3IsXG4gICAgICBnZXRTdGF0dXMsXG4gICAgICBzZXRTdGF0dXMsXG4gICAgICBub3RpZnlFcnJvcixcbiAgICAgIHJ1blBsYXRmb3JtU3VzcGVuZCxcbiAgICAgIHJ1blBsYXRmb3JtUmVzdW1lLFxuICAgICAgcnVuUGxhdGZvcm1SZXNldCxcbiAgICAgIHJ1bkluaXRSZXF1aXJlZCxcbiAgICAgIHJ1blN0YXJ0LFxuICAgICAgcnVuRGVzdHJveSxcbiAgICAgIGhhc09uRXJyb3JIYW5kbGVycyxcbiAgICAgIGdldFRhc2tTbmFwc2hvdCxcbiAgICB9XG4gIH0pXG4iLCAiaW1wb3J0IHsgQ2F1c2UsIENvbnRleHQsIEVmZmVjdCB9IGZyb20gJ2VmZmVjdCdcbmltcG9ydCAqIGFzIERlYnVnIGZyb20gJy4vRGVidWdTaW5rLmpzJ1xuaW1wb3J0IHsgaXNEZXZFbnYgfSBmcm9tICcuL2Vudi5qcydcblxuY29uc3QgcGhhc2VEaWFnbm9zdGljc0VuYWJsZWQgPSAoKTogYm9vbGVhbiA9PiBpc0RldkVudigpXG5cbi8qKlxuICogTG9naWMgXHU3NkY4XHU1MTczXHU4QkNBXHU2NUFEXHVGRjFBXG4gKiAtIFx1NUY1M1x1NTI0RFx1ODA1QVx1NzEyNlx1NEU4RSBFbnYgU2VydmljZSBcdTdGM0FcdTU5MzFcdTVCRkNcdTgxRjRcdTc2ODRcdTUyMURcdTU5Q0JcdTUzMTZcdTU2NkFcdTk3RjNcdUZGMDhTZXJ2aWNlIG5vdCBmb3VuZFx1RkYwOVx1MzAwMlxuICpcbiAqIFx1OEJCRVx1OEJBMVx1NjEwRlx1NTZGRVx1RkYxQVxuICogLSBcdTU3MjhcdTYzQThcdTgzNTBcdTc1MjhcdTZDRDVcdTRFMEJcdUZGMENSdW50aW1lIC8gUmVhY3QgXHU1QzQyXHU0RjFBXHU2QjYzXHU3ODZFXHU2M0QwXHU0RjlCIEVudlx1RkYxQlxuICogLSBcdTRGNDZcdTU3MjhcdTY3RDBcdTRFOUJcdTUyMURcdTU5Q0JcdTUzMTZcdTY1RjZcdTVFOEZcdTRFMEJcdUZGMENMb2dpYyBcdTUzRUZcdTgwRkRcdTU3MjggRW52IFx1OTRGQVx1NkVFMVx1NTI0RFx1NUMzMVx1NUMxRFx1OEJENVx1OEJGQlx1NTNENiBTZXJ2aWNlXHVGRjFCXG4gKiAtIFx1OEZEOVx1N0M3Qlx1OTUxOVx1OEJFRlx1OTAxQVx1NUUzOFx1NTNFQVx1NTFGQVx1NzNCMFx1NEUwMFx1NkIyMVx1RkYwQ1x1NEUwRFx1NjUzOVx1NTNEOFx1NjcwMFx1N0VDOFx1OEJFRFx1NEU0OVx1RkYwQ1x1NTM3NFx1NEYxQVx1NkM2MVx1NjdEM1x1NjVFNVx1NUZEN1x1MzAwMlxuICpcbiAqIFx1NTZFMFx1NkI2NFx1OEZEOVx1OTFDQ1x1NTcyOCBEZWJ1ZyBcdTRGQTdcdTUzRDFcdTUxRkFcdTRFMDBcdTY3NjEgd2FybmluZyBcdTdFQTcgZGlhZ25vc3RpY1x1RkYwQ1x1ODlFM1x1OTFDQVx1NTNFRlx1ODBGRFx1NTM5Rlx1NTZFMFx1NEUwRVx1NjM5Mlx1NjdFNVx1OERFRlx1NUY4NFx1RkYwQ1xuICogXHU3NzFGXHU2QjYzXHU3Njg0XHU5NTE5XHU4QkVGXHU4QkVEXHU0RTQ5XHU0RUNEXHU3NTMxIGxpZmVjeWNsZS5vbkVycm9yIC8gQXBwUnVudGltZS5vbkVycm9yIFx1NTkwNFx1NzQwNlx1MzAwMlxuICovXG5cbmNvbnN0IFNFUlZJQ0VfTk9UX0ZPVU5EX1BSRUZJWCA9ICdTZXJ2aWNlIG5vdCBmb3VuZDonXG5cbi8qKlxuICogXHU4MkU1IENhdXNlIFx1NEUyRFx1NTMwNVx1NTQyQiBgU2VydmljZSBub3QgZm91bmQ6IC4uLmAgXHU5NTE5XHU4QkVGXHVGRjBDXHU1MjE5XHU1M0QxXHU1MUZBXHU0RTAwXHU2NzYxIHdhcm5pbmcgXHU3RUE3IGRpYWdub3N0aWNcdUZGMUFcbiAqIC0gY29kZTogbG9naWM6OmVudl9zZXJ2aWNlX25vdF9mb3VuZFxuICogLSBtZXNzYWdlOiBcdTUzOUZcdTU5Q0JcdTk1MTlcdThCRUYgbWVzc2FnZVx1RkYxQlxuICogLSBoaW50OiBcdThCRjRcdTY2MEVcdThGRDlcdTY2MkZcdTVERjJcdTc3RTVcdTc2ODRcdTUyMURcdTU5Q0JcdTUzMTZcdTY1RjZcdTVFOEZcdTU2NkFcdTk3RjNcdUZGMENcdTVFNzZcdTdFRDlcdTUxRkFcdTYzOTJcdTY3RTVcdTVFRkFcdThCQUVcdTMwMDJcbiAqL1xuZXhwb3J0IGNvbnN0IGVtaXRFbnZTZXJ2aWNlTm90Rm91bmREaWFnbm9zdGljSWZOZWVkZWQgPSAoXG4gIGNhdXNlOiBDYXVzZS5DYXVzZTx1bmtub3duPixcbiAgbW9kdWxlSWQ/OiBzdHJpbmcsXG4pOiBFZmZlY3QuRWZmZWN0PHZvaWQ+ID0+XG4gIEVmZmVjdC5nZW4oZnVuY3Rpb24qICgpIHtcbiAgICBsZXQgcHJldHR5OiBzdHJpbmdcbiAgICB0cnkge1xuICAgICAgcHJldHR5ID0gQ2F1c2UucHJldHR5KGNhdXNlLCB7IHJlbmRlckVycm9yQ2F1c2U6IHRydWUgfSlcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGlmICghcHJldHR5LmluY2x1ZGVzKFNFUlZJQ0VfTk9UX0ZPVU5EX1BSRUZJWCkpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIC8vIDEpIEVudiBTZXJ2aWNlIFx1N0YzQVx1NTkzMVx1NjcyQ1x1OEVBQlx1NzY4NCB3YXJuaW5nIFx1OEJDQVx1NjVBRFxuICAgIHlpZWxkKiBEZWJ1Zy5yZWNvcmQoe1xuICAgICAgdHlwZTogJ2RpYWdub3N0aWMnLFxuICAgICAgbW9kdWxlSWQsXG4gICAgICBjb2RlOiAnbG9naWM6OmVudl9zZXJ2aWNlX25vdF9mb3VuZCcsXG4gICAgICBzZXZlcml0eTogJ3dhcm5pbmcnLFxuICAgICAgbWVzc2FnZTogcHJldHR5LFxuICAgICAgaGludDpcbiAgICAgICAgJ0xvZ2ljIGF0dGVtcHRlZCB0byBhY2Nlc3MgYW4gRW52IHNlcnZpY2UgYmVmb3JlIGl0IHdhcyBwcm92aWRlZC4gVGhpcyBpcyBhIGtub3duIGluaXRpYWxpemF0aW9uIHRpbWluZyBub2lzZSBpbiBSdW50aW1lL1JlYWN0IGludGVncmF0aW9uLiAnICtcbiAgICAgICAgXCJJZiBpdCBoYXBwZW5zIG9uY2UgZHVyaW5nIGVhcmx5IHN0YXJ0dXAgYW5kIGV2ZXJ5dGhpbmcgd29ya3MgYWZ0ZXJ3YXJkLCBpdCdzIGxpa2VseSBoYXJtbGVzczsgXCIgK1xuICAgICAgICAnaWYgaXQgcGVyc2lzdHMgb3IgY29ycmVsYXRlcyB3aXRoIGFwcCBpc3N1ZXMsIHZlcmlmeSBSdW50aW1lLm1ha2UgLyBSdW50aW1lUHJvdmlkZXIubGF5ZXIgcHJvdmlkZXMgdGhlIHNlcnZpY2UuJyxcbiAgICB9KVxuXG4gICAgLy8gMikgXHU1NzI4XHU2N0QwXHU0RTlCXHU1NzNBXHU2NjZGXHU0RTBCXHVGRjA4XHU0RjhCXHU1OTgyIExvZ2ljIHNldHVwIFx1NkJCNVx1OEZDN1x1NjVFOVx1OEJCRlx1OTVFRSBFbnZcdUZGMDlcdUZGMENcdTYyMTFcdTRFRUNcdTRFNUZcdTVFMENcdTY3MUJcdTkwMUFcdThGQzdcbiAgICAvLyAgICBsb2dpYzo6aW52YWxpZF9waGFzZSBcdTYzRDBcdTkxOTJcdTIwMUNcdThCRjdcdTVDMDYgRW52IFx1OEJCRlx1OTVFRVx1NzlGQlx1NTJBOFx1NTIzMCBydW4gXHU2QkI1XHUyMDFEXHUzMDAyXG4gICAgLy9cbiAgICAvLyBcdTc1MzFcdTRFOEVcdTVGNTNcdTUyNERcdTVCOUVcdTczQjBcdTY1RTBcdTZDRDVcdTU3MjhcdTZCNjRcdTU5MDRcdTUzRUZcdTk3NjBcdTUyMjRcdTY1QURcdThDMDNcdTc1MjhcdTUzRDFcdTc1MUZcdTc2ODQgcGhhc2VcdUZGMENcdThGRDlcdTkxQ0NcdTUzRUFcdTY2MkZcdTYzRDBcdTRGOUJcdTRFMDBcdTRFMkFcdTg4NjVcdTUxNDVcdTYwMjdcdTc2ODRcbiAgICAvLyBcdThCQ0FcdTY1QURcdTRGRTFcdTUzRjdcdUZGMENcdTc3MUZcdTZCNjNcdTc2ODQgcGhhc2UgXHU1Qjg4XHU1MzZCXHU0RUNEXHU3NTMxIExvZ2ljUGhhc2VFcnJvciArIGVtaXRJbnZhbGlkUGhhc2VEaWFnbm9zdGljSWZOZWVkZWQgXHU2MjdGXHU2MkM1XHUzMDAyXG4gICAgeWllbGQqIERlYnVnLnJlY29yZCh7XG4gICAgICB0eXBlOiAnZGlhZ25vc3RpYycsXG4gICAgICBtb2R1bGVJZCxcbiAgICAgIGNvZGU6ICdsb2dpYzo6aW52YWxpZF9waGFzZScsXG4gICAgICBzZXZlcml0eTogJ2Vycm9yJyxcbiAgICAgIG1lc3NhZ2U6ICckLnVzZSBpcyBub3QgYWxsb3dlZCBiZWZvcmUgRW52IGlzIGZ1bGx5IHJlYWR5LicsXG4gICAgICBoaW50OlxuICAgICAgICAnQXZvaWQgcmVhZGluZyBzZXJ2aWNlcyBkdXJpbmcgc2V0dXAgb3IgYmVmb3JlIEVudiBpcyByZWFkeTsgJyArXG4gICAgICAgICdtb3ZlIEVudiBhY2Nlc3MgdG8gdGhlIExvZ2ljIHJ1biBzZWN0aW9uLCBvciB3cmFwIGluaXQgdmlhICQubGlmZWN5Y2xlLm9uSW5pdFJlcXVpcmVkLicsXG4gICAgICBraW5kOiAnZW52X3NlcnZpY2Vfbm90X3JlYWR5JyxcbiAgICB9KVxuICB9KVxuXG5leHBvcnQgaW50ZXJmYWNlIExvZ2ljUGhhc2VFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgcmVhZG9ubHkgX3RhZzogJ0xvZ2ljUGhhc2VFcnJvcidcbiAgcmVhZG9ubHkga2luZDogc3RyaW5nXG4gIHJlYWRvbmx5IGFwaT86IHN0cmluZ1xuICByZWFkb25seSBwaGFzZTogJ3NldHVwJyB8ICdydW4nXG4gIHJlYWRvbmx5IG1vZHVsZUlkPzogc3RyaW5nXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTG9naWNQaGFzZVNlcnZpY2Uge1xuICByZWFkb25seSBjdXJyZW50OiAnc2V0dXAnIHwgJ3J1bidcbn1cblxuZXhwb3J0IGNvbnN0IExvZ2ljUGhhc2VTZXJ2aWNlVGFnID0gQ29udGV4dC5HZW5lcmljVGFnPExvZ2ljUGhhc2VTZXJ2aWNlPignQGxvZ2l4L0xvZ2ljUGhhc2VTZXJ2aWNlJylcblxuLyoqXG4gKiBMb2dpY1VuaXRTZXJ2aWNlXHVGRjFBXG4gKiAtIFx1NTcyOFx1NjI2N1x1ODg0Q1x1NkJDRlx1NEUyQSBtb3VudGVkIGxvZ2ljIFx1NjVGNlx1NkNFOFx1NTE2NVx1RkYwOHNjb3BlID0gXHU1MzU1XHU0RTJBIGxvZ2ljIFx1NzY4NCBzZXR1cC9ydW4gZmliZXJcdUZGMDlcdUZGMUJcbiAqIC0gXHU3NTI4XHU0RThFIHRyYWl0cyBwcm92ZW5hbmNlIFx1N0I0OVx1MjAxQ1x1NEUwRVx1NUY1M1x1NTI0RFx1OTAzQlx1OEY5MVx1NTM1NVx1NTE0M1x1N0VEMVx1NUI5QVx1MjAxRFx1NzY4NFx1NEZFMVx1NjA2Rlx1RkYwOFx1NUJGOVx1OUY1MCAwMjItbW9kdWxlIFx1NzY4NCBsb2dpY1VuaXRJZFx1RkYwOVx1MzAwMlxuICpcbiAqIFx1N0VBNlx1Njc1Rlx1RkYxQVxuICogLSBcdTdFQUZcdTUzRUFcdThCRkJcdUZGMDhcdTRFMERcdTVGOTdcdTUxOTlcdTUxNjUgcnVudGltZSBzdGF0ZVx1RkYwOVx1RkYxQlx1NEVDNVx1NEY1Q1x1NEUzQSBwcm92ZW5hbmNlL1x1OEJDQVx1NjVBRFx1OTUxQVx1NzBCOVx1MzAwMlxuICovXG5leHBvcnQgaW50ZXJmYWNlIExvZ2ljVW5pdFNlcnZpY2Uge1xuICByZWFkb25seSBsb2dpY1VuaXRJZDogc3RyaW5nXG4gIHJlYWRvbmx5IGxvZ2ljVW5pdElkS2luZDogJ2V4cGxpY2l0JyB8ICdkZXJpdmVkJ1xuICByZWFkb25seSBsb2dpY1VuaXRMYWJlbDogc3RyaW5nXG4gIHJlYWRvbmx5IHBhdGg/OiBzdHJpbmdcbn1cblxuZXhwb3J0IGNsYXNzIExvZ2ljVW5pdFNlcnZpY2VUYWcgZXh0ZW5kcyBDb250ZXh0LlRhZygnQGxvZ2l4L0xvZ2ljVW5pdFNlcnZpY2UnKTxcbiAgTG9naWNVbml0U2VydmljZVRhZyxcbiAgTG9naWNVbml0U2VydmljZVxuPigpIHt9XG5cbmV4cG9ydCBjb25zdCBtYWtlTG9naWNQaGFzZUVycm9yID0gKFxuICBraW5kOiBzdHJpbmcsXG4gIGFwaTogc3RyaW5nLFxuICBwaGFzZTogJ3NldHVwJyB8ICdydW4nLFxuICBtb2R1bGVJZD86IHN0cmluZyxcbik6IExvZ2ljUGhhc2VFcnJvciA9PlxuICBPYmplY3QuYXNzaWduKG5ldyBFcnJvcihgW0xvZ2ljUGhhc2VFcnJvcl0gJHthcGl9IGlzIG5vdCBhbGxvd2VkIGluICR7cGhhc2V9IHBoYXNlIChraW5kPSR7a2luZH0pLmApLCB7XG4gICAgX3RhZzogJ0xvZ2ljUGhhc2VFcnJvcicsXG4gICAga2luZCxcbiAgICBhcGksXG4gICAgcGhhc2UsXG4gICAgbW9kdWxlSWQsXG4gIH0pIGFzIExvZ2ljUGhhc2VFcnJvclxuXG4vKipcbiAqIFx1NEVDRSBDYXVzZSBcdTRFMkRcdTYzRDBcdTUzRDYgTG9naWNQaGFzZUVycm9yXHVGRjBDXHU1RTc2XHU0RUU1IGRpYWdub3N0aWMgXHU1RjYyXHU1RjBGXHU1M0QxXHU1MUZBXHVGRjFBXG4gKiAtIGNvZGU6IGxvZ2ljOjppbnZhbGlkX3BoYXNlXG4gKiAtIGtpbmQ6IFx1NTE3N1x1NEY1M1x1OEZERFx1ODlDNFx1N0M3Qlx1NTc4Qlx1RkYwOFx1NTk4MiB1c2VfaW5fc2V0dXBcdUZGMDlcbiAqL1xuZXhwb3J0IGNvbnN0IGVtaXRJbnZhbGlkUGhhc2VEaWFnbm9zdGljSWZOZWVkZWQgPSAoXG4gIGNhdXNlOiBDYXVzZS5DYXVzZTx1bmtub3duPixcbiAgbW9kdWxlSWQ/OiBzdHJpbmcsXG4pOiBFZmZlY3QuRWZmZWN0PHZvaWQ+ID0+XG4gIEVmZmVjdC5nZW4oZnVuY3Rpb24qICgpIHtcbiAgICBpZiAoIXBoYXNlRGlhZ25vc3RpY3NFbmFibGVkKCkpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGNvbnN0IGFsbEVycm9ycyA9IFsuLi5DYXVzZS5mYWlsdXJlcyhjYXVzZSksIC4uLkNhdXNlLmRlZmVjdHMoY2F1c2UpXVxuXG4gICAgZm9yIChjb25zdCBlcnIgb2YgYWxsRXJyb3JzKSB7XG4gICAgICBjb25zdCBsb2dpY0VyciA9IGVyciBhcyBhbnlcbiAgICAgIGlmIChsb2dpY0VyciAmJiBsb2dpY0Vyci5fdGFnID09PSAnTG9naWNQaGFzZUVycm9yJykge1xuICAgICAgICBjb25zdCBwaGFzZUVyciA9IGxvZ2ljRXJyIGFzIExvZ2ljUGhhc2VFcnJvclxuICAgICAgICBjb25zdCBoaW50ID1cbiAgICAgICAgICBwaGFzZUVyci5raW5kID09PSAndXNlX2luX3NldHVwJyB8fCBwaGFzZUVyci5raW5kID09PSAnbGlmZWN5Y2xlX2luX3NldHVwJ1xuICAgICAgICAgICAgPyAnVGhlIHNldHVwIHBoYXNlIG11c3Qgbm90IHJlYWQgRW52L3NlcnZpY2VzIG9yIHJ1biBsb25nLWxpdmVkIGxvZ2ljOyBtb3ZlIHRoZSByZWxldmFudCBjYWxscyB0byB0aGUgcnVuIHBoYXNlLidcbiAgICAgICAgICAgIDogcGhhc2VFcnIua2luZCA9PT0gJ2xpZmVjeWNsZV9pbl9ydW4nXG4gICAgICAgICAgICAgID8gJ0RvIG5vdCByZWdpc3RlciAkLmxpZmVjeWNsZS4qIGluIHRoZSBydW4gcGhhc2UgKHNldHVwLW9ubHkpLiBNb3ZlIGxpZmVjeWNsZSByZWdpc3RyYXRpb25zIHRvIHRoZSBzeW5jaHJvbm91cyBwYXJ0IG9mIE1vZHVsZS5sb2dpYyBidWlsZGVyIChiZWZvcmUgcmV0dXJuKS4nXG4gICAgICAgICAgICAgIDogcGhhc2VFcnIua2luZCA9PT0gJ3RyYWl0c19pbl9ydW4nIHx8IHBoYXNlRXJyLmtpbmQgPT09ICd0cmFpdHNfZGVjbGFyZV9pbl9ydW4nXG4gICAgICAgICAgICAgICAgPyAnVHJhaXRzIGFyZSBmcm96ZW4gYWZ0ZXIgc2V0dXA7IG1vdmUgJC50cmFpdHMuZGVjbGFyZSB0byBMb2dpY1BsYW4uc2V0dXAgb3IgdGhlIHNldHVwIHJlZ2lzdHJhdGlvbiBwaGFzZSBvZiBNb2R1bGUubG9naWMgYnVpbGRlci4nXG4gICAgICAgICAgICAgICAgOiAnTW92ZSBsb2dpYyB0byB0aGUgcnVuIHBoYXNlOyBrZWVwIHNldHVwIGZvciByZWdpc3RyYXRpb25zIG9ubHkuJ1xuXG4gICAgICAgIHlpZWxkKiBEZWJ1Zy5yZWNvcmQoe1xuICAgICAgICAgIHR5cGU6ICdkaWFnbm9zdGljJyxcbiAgICAgICAgICBtb2R1bGVJZDogcGhhc2VFcnIubW9kdWxlSWQgPz8gbW9kdWxlSWQsXG4gICAgICAgICAgY29kZTogJ2xvZ2ljOjppbnZhbGlkX3BoYXNlJyxcbiAgICAgICAgICBzZXZlcml0eTogJ2Vycm9yJyxcbiAgICAgICAgICBtZXNzYWdlOiBgJHtwaGFzZUVyci5hcGkgPz8gcGhhc2VFcnIua2luZH0gaXMgbm90IGFsbG93ZWQgaW4gJHtwaGFzZUVyci5waGFzZX0gcGhhc2UuYCxcbiAgICAgICAgICBoaW50LFxuICAgICAgICAgIGtpbmQ6IHBoYXNlRXJyLmtpbmQsXG4gICAgICAgIH0pXG5cbiAgICAgICAgLy8gXHU1NDdEXHU0RTJEXHU5OTk2XHU0RTJBIExvZ2ljUGhhc2VFcnJvciBcdTUzNzNcdTUzRUZcdThGRDRcdTU2REVcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG4gICAgfVxuICB9KVxuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQU1PLElBQU0sdUJBQXVCLENBQUksTUFBUyxZQUFtQztBQUNsRixTQUFPLE9BQU8sTUFBTSxPQUFjO0FBQ3BDO0FBRUEsSUFBTSxtQkFBbUIsQ0FBQyxTQUErQztBQUN2RSxNQUFJLE9B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LElBQUksQ0FBQztBQUFBLFlBQ25GO0FBQUEsVUFDRjtBQUFBLFFBQ0Y7QUFDQSxlQUFPO0FBQUEsTUFDVDtBQUFBLElBQ0YsQ0FBQztBQUFBLElBQ0QsU0FBUyxDQUFDLGFBQTRDO0FBQ3BELG1CQUFhLGdCQUFnQixXQUFXO0FBQ3hDLGFBQU8sb0JBQW9CLFFBQVEsUUFBUSxRQUFRLENBQUM7QUFBQSxJQUN0RDtBQUFBLElBQ0EsSUFBSSxDQUFDLFdBQStCO0FBQ2xDLG1CQUFhLGdCQUFnQixNQUFNO0FBQ25DLGFBQU8sb0JBQW9CLE1BQU07QUFBQSxJQUNuQztBQUFBLEVBQ0Y7QUFFQSxvQkFBa0IsS0FBWSxnQkFBZ0I7QUFFOUMsU0FBTztBQUNUOyIsCiAgIm5hbWVzIjogWyJDb250ZXh0IiwgIkVmZmVjdCIsICJDYXVzZSIsICJDb250ZXh0IiwgIkVmZmVjdCIsICJFZmZlY3QiLCAiQ2F1c2UiLCAiQ29udGV4dCIsICJFZmZlY3QiLCAibWFrZSIsICJhcGkiLCAiQ29udGV4dCIsICJvcHRpb25zIl0KfQo=