@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,1170 @@
1
+ // @logix/core subpath bundles for @logix/sandbox
2
+
3
+ import {
4
+ resolve
5
+ } from "./chunk-EGUYL2ER.js";
6
+ import {
7
+ makeMatch,
8
+ makeMatchTag
9
+ } from "./chunk-3U4CAKCX.js";
10
+ import {
11
+ create
12
+ } from "./chunk-Y5I45PEB.js";
13
+ import {
14
+ inSyncTransactionFiber,
15
+ makeTaskRunner
16
+ } from "./chunk-E7BIWMQQ.js";
17
+ import {
18
+ Tag
19
+ } from "./chunk-ZWE3P6X2.js";
20
+ import {
21
+ getRuntimeInternals,
22
+ setBoundInternals
23
+ } from "./chunk-6FKWRVP4.js";
24
+ import {
25
+ isDevEnv
26
+ } from "./chunk-GP37MEGJ.js";
27
+ import {
28
+ make
29
+ } from "./chunk-BZH4EUUD.js";
30
+ import {
31
+ currentDiagnosticsLevel,
32
+ record,
33
+ toSerializableErrorSummary
34
+ } from "./chunk-CVZPRIDB.js";
35
+ import {
36
+ RunSessionTag
37
+ } from "./chunk-A7HLOSO6.js";
38
+
39
+ // ../logix-core/src/internal/runtime/core/mutativePatches.ts
40
+ var toPatchPathString = (path) => {
41
+ if (typeof path === "string") {
42
+ const trimmed = path.trim();
43
+ return trimmed.length > 0 ? trimmed : void 0;
44
+ }
45
+ if (!Array.isArray(path)) return void 0;
46
+ const parts = [];
47
+ for (const seg of path) {
48
+ if (typeof seg === "string") {
49
+ if (seg.length > 0) parts.push(seg);
50
+ continue;
51
+ }
52
+ if (typeof seg === "number" && Number.isFinite(seg)) {
53
+ parts.push(String(Math.floor(seg)));
54
+ continue;
55
+ }
56
+ }
57
+ if (parts.length === 0) return "*";
58
+ return parts.join(".");
59
+ };
60
+ var mutateWithPatchPaths = (base, mutator) => {
61
+ const out = create(base, mutator, {
62
+ enablePatches: {
63
+ pathAsArray: true,
64
+ arrayLengthAssignment: false
65
+ }
66
+ });
67
+ if (!Array.isArray(out)) {
68
+ return { nextState: out, patchPaths: [] };
69
+ }
70
+ const nextState = out[0];
71
+ const patches = out[1] ?? [];
72
+ const set = /* @__PURE__ */ new Set();
73
+ for (const patch of patches) {
74
+ const p = toPatchPathString(patch?.path);
75
+ if (!p) continue;
76
+ set.add(p);
77
+ }
78
+ return {
79
+ nextState,
80
+ patchPaths: Array.from(set)
81
+ };
82
+ };
83
+
84
+ // ../logix-core/src/internal/runtime/BoundApiRuntime.ts
85
+ import { Context as Context3, Effect as Effect3, FiberRef, Option, Schema, Stream } from "../effect.js";
86
+
87
+ // ../logix-core/src/internal/runtime/core/Lifecycle.ts
88
+ import { Cause, Context, Effect, Ref } from "../effect.js";
89
+ var LifecycleContext = Context.GenericTag(
90
+ "@logix/LifecycleManager"
91
+ );
92
+ var safeRun = (label, eff) => eff.pipe(
93
+ Effect.matchCauseEffect({
94
+ onSuccess: () => Effect.void,
95
+ onFailure: (cause) => Effect.logError(`[${label}] failed: ${Cause.pretty(cause)}`)
96
+ })
97
+ );
98
+ var makeTaskId = (kind, order) => `${kind}:${order}`;
99
+ var makeLifecycleManager = (identity) => Effect.gen(function* () {
100
+ const budgets = {
101
+ maxEventsPerInstance: 20,
102
+ maxEventBytes: 4 * 1024
103
+ };
104
+ const statusRef = yield* Ref.make({
105
+ identity,
106
+ status: "creating"
107
+ });
108
+ const initRequired = [];
109
+ const start = [];
110
+ const destroy = [];
111
+ const platformSuspend = [];
112
+ const platformResume = [];
113
+ const platformReset = [];
114
+ const onErrorHandlers = [];
115
+ const getStatus = Ref.get(statusRef);
116
+ const recordPhase = (phase, name, payload) => record({
117
+ type: "lifecycle:phase",
118
+ moduleId: identity.moduleId,
119
+ instanceId: identity.instanceId,
120
+ phase,
121
+ name,
122
+ payload
123
+ });
124
+ const setStatus = (status, patch) => Ref.update(statusRef, (prev) => ({
125
+ ...prev,
126
+ identity: {
127
+ ...prev.identity,
128
+ ...patch?.runtimeLabel ? { runtimeLabel: patch.runtimeLabel } : null
129
+ },
130
+ status,
131
+ ...patch?.initOutcome !== void 0 ? { initOutcome: patch.initOutcome } : null,
132
+ ...patch?.initProgress !== void 0 ? { initProgress: patch.initProgress } : null
133
+ }));
134
+ const registerInitRequired = (effect, options) => {
135
+ const order = initRequired.length;
136
+ initRequired.push({
137
+ taskId: makeTaskId("initRequired", order),
138
+ kind: "initRequired",
139
+ order,
140
+ name: options?.name,
141
+ effect
142
+ });
143
+ };
144
+ const registerStart = (effect, options) => {
145
+ const order = start.length;
146
+ start.push({
147
+ taskId: makeTaskId("start", order),
148
+ kind: "start",
149
+ order,
150
+ name: options?.name,
151
+ fatalOnFailure: options?.fatalOnFailure,
152
+ effect
153
+ });
154
+ };
155
+ const registerDestroy = (effect, options) => {
156
+ const order = destroy.length;
157
+ destroy.push({
158
+ taskId: makeTaskId("destroy", order),
159
+ kind: "destroy",
160
+ order,
161
+ name: options?.name,
162
+ effect
163
+ });
164
+ };
165
+ const registerOnError = (handler) => {
166
+ onErrorHandlers.push(handler);
167
+ };
168
+ const registerPlatformSuspend = (effect, options) => {
169
+ const order = platformSuspend.length;
170
+ platformSuspend.push({
171
+ taskId: makeTaskId("platformSuspend", order),
172
+ kind: "platformSuspend",
173
+ order,
174
+ name: options?.name,
175
+ effect
176
+ });
177
+ };
178
+ const registerPlatformResume = (effect, options) => {
179
+ const order = platformResume.length;
180
+ platformResume.push({
181
+ taskId: makeTaskId("platformResume", order),
182
+ kind: "platformResume",
183
+ order,
184
+ name: options?.name,
185
+ effect
186
+ });
187
+ };
188
+ const registerPlatformReset = (effect, options) => {
189
+ const order = platformReset.length;
190
+ platformReset.push({
191
+ taskId: makeTaskId("platformReset", order),
192
+ kind: "platformReset",
193
+ order,
194
+ name: options?.name,
195
+ effect
196
+ });
197
+ };
198
+ const notifyError = (cause, context) => {
199
+ if (Cause.isInterrupted(cause)) {
200
+ return Effect.void;
201
+ }
202
+ return record({
203
+ type: "lifecycle:error",
204
+ moduleId: context.moduleId,
205
+ instanceId: context.instanceId,
206
+ cause,
207
+ phase: context.phase,
208
+ hook: context.hook,
209
+ taskId: context.taskId,
210
+ txnSeq: context.txnSeq,
211
+ opSeq: context.opSeq,
212
+ origin: context.origin
213
+ }).pipe(
214
+ Effect.zipRight(
215
+ Effect.forEach(
216
+ onErrorHandlers,
217
+ (handler) => handler(cause, context).pipe(
218
+ Effect.catchAllCause(
219
+ (inner) => Effect.logError(
220
+ `[lifecycle.onError] failed: ${Cause.pretty(inner)}`
221
+ )
222
+ )
223
+ ),
224
+ { discard: true }
225
+ )
226
+ )
227
+ );
228
+ };
229
+ const runInitRequired = Effect.gen(function* () {
230
+ const total = initRequired.length;
231
+ if (total === 0) {
232
+ yield* setStatus("ready", {
233
+ initProgress: { total: 0, completed: 0 },
234
+ initOutcome: { status: "success" }
235
+ });
236
+ return;
237
+ }
238
+ const startedAt = Date.now();
239
+ yield* recordPhase("init", "initRequired:start", { total });
240
+ yield* setStatus("initializing", {
241
+ initProgress: { total, completed: 0, current: 0, startedAt }
242
+ });
243
+ let completed = 0;
244
+ for (let i = 0; i < initRequired.length; i++) {
245
+ yield* setStatus("initializing", {
246
+ initProgress: { total, completed, current: i, startedAt }
247
+ });
248
+ const task = initRequired[i];
249
+ const exit = yield* Effect.exit(task.effect);
250
+ if (exit._tag === "Success") {
251
+ completed += 1;
252
+ yield* setStatus("initializing", {
253
+ initProgress: { total, completed, current: i + 1, startedAt }
254
+ });
255
+ continue;
256
+ }
257
+ const summary = toSerializableErrorSummary(exit.cause);
258
+ yield* notifyError(exit.cause, {
259
+ phase: "init",
260
+ hook: "initRequired",
261
+ moduleId: identity.moduleId,
262
+ instanceId: identity.instanceId,
263
+ taskId: task.taskId,
264
+ origin: "initRequired"
265
+ });
266
+ yield* setStatus("failed", {
267
+ initProgress: { total, completed, current: i, startedAt },
268
+ initOutcome: { status: "failure", error: summary.errorSummary }
269
+ });
270
+ return yield* Effect.failCause(exit.cause);
271
+ }
272
+ yield* recordPhase("init", "initRequired:success", { total });
273
+ yield* setStatus("ready", {
274
+ initProgress: { total, completed, current: total, startedAt },
275
+ initOutcome: { status: "success" }
276
+ });
277
+ });
278
+ const runStart = recordPhase("run", "start:schedule", {
279
+ total: start.length
280
+ }).pipe(
281
+ Effect.zipRight(
282
+ Effect.forEach(
283
+ start,
284
+ (task) => Effect.forkScoped(
285
+ task.effect.pipe(
286
+ Effect.catchAllCause(
287
+ (cause) => notifyError(cause, {
288
+ phase: "run",
289
+ hook: "start",
290
+ moduleId: identity.moduleId,
291
+ instanceId: identity.instanceId,
292
+ taskId: task.taskId,
293
+ origin: "start"
294
+ })
295
+ )
296
+ )
297
+ ).pipe(Effect.asVoid),
298
+ { discard: true, concurrency: "unbounded" }
299
+ )
300
+ )
301
+ );
302
+ const runDestroy = Effect.gen(function* () {
303
+ yield* recordPhase("destroy", "destroy:start", { total: destroy.length });
304
+ yield* setStatus("terminating");
305
+ for (let i = destroy.length - 1; i >= 0; i--) {
306
+ const task = destroy[i];
307
+ yield* safeRun(
308
+ "lifecycle.onDestroy",
309
+ task.effect.pipe(
310
+ Effect.catchAllCause(
311
+ (cause) => notifyError(cause, {
312
+ phase: "destroy",
313
+ hook: "destroy",
314
+ moduleId: identity.moduleId,
315
+ instanceId: identity.instanceId,
316
+ taskId: task.taskId,
317
+ origin: "destroy"
318
+ })
319
+ )
320
+ )
321
+ );
322
+ }
323
+ yield* setStatus("terminated");
324
+ yield* recordPhase("destroy", "destroy:done", { total: destroy.length });
325
+ });
326
+ const runPlatformSuspend = Effect.gen(function* () {
327
+ if (platformSuspend.length === 0) return;
328
+ yield* recordPhase("platform", "signal:suspend", { total: platformSuspend.length });
329
+ for (const task of platformSuspend) {
330
+ yield* safeRun(
331
+ "lifecycle.onSuspend",
332
+ task.effect.pipe(
333
+ Effect.catchAllCause(
334
+ (cause) => notifyError(cause, {
335
+ phase: "platform",
336
+ hook: "suspend",
337
+ moduleId: identity.moduleId,
338
+ instanceId: identity.instanceId,
339
+ taskId: task.taskId,
340
+ origin: "platform.suspend"
341
+ })
342
+ )
343
+ )
344
+ );
345
+ }
346
+ });
347
+ const runPlatformResume = Effect.gen(function* () {
348
+ if (platformResume.length === 0) return;
349
+ yield* recordPhase("platform", "signal:resume", { total: platformResume.length });
350
+ for (const task of platformResume) {
351
+ yield* safeRun(
352
+ "lifecycle.onResume",
353
+ task.effect.pipe(
354
+ Effect.catchAllCause(
355
+ (cause) => notifyError(cause, {
356
+ phase: "platform",
357
+ hook: "resume",
358
+ moduleId: identity.moduleId,
359
+ instanceId: identity.instanceId,
360
+ taskId: task.taskId,
361
+ origin: "platform.resume"
362
+ })
363
+ )
364
+ )
365
+ );
366
+ }
367
+ });
368
+ const runPlatformReset = Effect.gen(function* () {
369
+ if (platformReset.length === 0) return;
370
+ yield* recordPhase("platform", "signal:reset", { total: platformReset.length });
371
+ for (const task of platformReset) {
372
+ yield* safeRun(
373
+ "lifecycle.onReset",
374
+ task.effect.pipe(
375
+ Effect.catchAllCause(
376
+ (cause) => notifyError(cause, {
377
+ phase: "platform",
378
+ hook: "reset",
379
+ moduleId: identity.moduleId,
380
+ instanceId: identity.instanceId,
381
+ taskId: task.taskId,
382
+ origin: "platform.reset"
383
+ })
384
+ )
385
+ )
386
+ );
387
+ }
388
+ });
389
+ const getTaskSnapshot = Effect.sync(() => ({
390
+ initRequired: initRequired.map(({ effect: _eff, ...rest }) => rest),
391
+ start: start.map(({ effect: _eff, ...rest }) => rest),
392
+ destroy: destroy.map(({ effect: _eff, ...rest }) => rest),
393
+ platformSuspend: platformSuspend.map(({ effect: _eff, ...rest }) => rest),
394
+ platformResume: platformResume.map(({ effect: _eff, ...rest }) => rest),
395
+ platformReset: platformReset.map(({ effect: _eff, ...rest }) => rest)
396
+ }));
397
+ const hasOnErrorHandlers = Effect.sync(() => onErrorHandlers.length > 0);
398
+ return {
399
+ identity,
400
+ budgets,
401
+ registerPlatformSuspend,
402
+ registerPlatformResume,
403
+ registerPlatformReset,
404
+ registerInitRequired,
405
+ registerStart,
406
+ registerDestroy,
407
+ registerOnError,
408
+ getStatus,
409
+ setStatus,
410
+ notifyError,
411
+ runPlatformSuspend,
412
+ runPlatformResume,
413
+ runPlatformReset,
414
+ runInitRequired,
415
+ runStart,
416
+ runDestroy,
417
+ hasOnErrorHandlers,
418
+ getTaskSnapshot
419
+ };
420
+ });
421
+
422
+ // ../logix-core/src/internal/runtime/core/LogicDiagnostics.ts
423
+ import { Cause as Cause2, Context as Context2, Effect as Effect2 } from "../effect.js";
424
+ var phaseDiagnosticsEnabled = () => isDevEnv();
425
+ var SERVICE_NOT_FOUND_PREFIX = "Service not found:";
426
+ var emitEnvServiceNotFoundDiagnosticIfNeeded = (cause, moduleId) => Effect2.gen(function* () {
427
+ let pretty;
428
+ try {
429
+ pretty = Cause2.pretty(cause, { renderErrorCause: true });
430
+ } catch {
431
+ return;
432
+ }
433
+ if (!pretty.includes(SERVICE_NOT_FOUND_PREFIX)) {
434
+ return;
435
+ }
436
+ yield* record({
437
+ type: "diagnostic",
438
+ moduleId,
439
+ code: "logic::env_service_not_found",
440
+ severity: "warning",
441
+ message: pretty,
442
+ hint: "Logic \u5728\u521D\u59CB\u5316\u9636\u6BB5\u5C1D\u8BD5\u8BBF\u95EE\u5C1A\u672A\u63D0\u4F9B\u7684 Env Service\uFF0C\u901A\u5E38\u662F Runtime / React \u96C6\u6210\u4E2D\u7684\u5DF2\u77E5\u521D\u59CB\u5316\u566A\u97F3\u3002\u82E5\u53EA\u5728\u5E94\u7528\u542F\u52A8\u65E9\u671F\u51FA\u73B0\u4E00\u6B21\u4E14\u540E\u7EED\u72B6\u6001\u4E0E Env \u5747\u6B63\u5E38\uFF0C\u53EF\u6682\u89C6\u4E3A\u65E0\u5BB3\uFF1B\u82E5\u6301\u7EED\u51FA\u73B0\u6216\u4F34\u968F\u4E1A\u52A1\u5F02\u5E38\uFF0C\u8BF7\u68C0\u67E5 Runtime.make / RuntimeProvider.layer \u662F\u5426\u6B63\u786E\u63D0\u4F9B\u4E86\u5BF9\u5E94 Service\u3002"
443
+ });
444
+ yield* record({
445
+ type: "diagnostic",
446
+ moduleId,
447
+ code: "logic::invalid_phase",
448
+ severity: "error",
449
+ message: "$.use is not allowed before Env is fully ready.",
450
+ hint: "setup \u6BB5\u6216 Env \u672A\u5B8C\u5168\u5C31\u7EEA\u65F6\u8BF7\u907F\u514D\u76F4\u63A5\u8BFB\u53D6 Service\uFF1B\u5EFA\u8BAE\u5C06\u5BF9 Env \u7684\u8BBF\u95EE\u79FB\u52A8\u5230 Logic \u7684 run \u6BB5\uFF0C\u6216\u901A\u8FC7 $.lifecycle.onInitRequired \u5305\u88C5\u521D\u59CB\u5316\u6D41\u7A0B\u3002",
451
+ kind: "env_service_not_ready"
452
+ });
453
+ });
454
+ var LogicPhaseServiceTag = Context2.GenericTag(
455
+ "@logix/LogicPhaseService"
456
+ );
457
+ var LogicUnitServiceTag = class extends Context2.Tag("@logix/LogicUnitService")() {
458
+ };
459
+ var makeLogicPhaseError = (kind, api, phase, moduleId) => Object.assign(
460
+ new Error(
461
+ `[LogicPhaseError] ${api} is not allowed in ${phase} phase (kind=${kind}).`
462
+ ),
463
+ {
464
+ _tag: "LogicPhaseError",
465
+ kind,
466
+ api,
467
+ phase,
468
+ moduleId
469
+ }
470
+ );
471
+ var emitInvalidPhaseDiagnosticIfNeeded = (cause, moduleId) => Effect2.gen(function* () {
472
+ if (!phaseDiagnosticsEnabled()) {
473
+ return;
474
+ }
475
+ const allErrors = [
476
+ ...Cause2.failures(cause),
477
+ ...Cause2.defects(cause)
478
+ ];
479
+ for (const err of allErrors) {
480
+ const logicErr = err;
481
+ if (logicErr && logicErr._tag === "LogicPhaseError") {
482
+ const phaseErr = logicErr;
483
+ const hint = phaseErr.kind === "use_in_setup" || phaseErr.kind === "lifecycle_in_setup" ? "setup \u6BB5\u7981\u6B62\u8BFB\u53D6 Env/Service \u6216\u6267\u884C\u957F\u751F\u547D\u5468\u671F\u903B\u8F91\uFF0C\u8BF7\u5C06\u76F8\u5173\u8C03\u7528\u79FB\u52A8\u5230 run \u6BB5\u3002" : phaseErr.kind === "lifecycle_in_run" ? "run \u6BB5\u7981\u6B62\u6CE8\u518C $.lifecycle.*\uFF08setup-only\uFF09\u3002\u8BF7\u5C06\u751F\u547D\u5468\u671F\u6CE8\u518C\u79FB\u52A8\u5230 Module.logic builder \u7684\u540C\u6B65\u90E8\u5206\uFF08return \u4E4B\u524D\uFF09\u3002" : phaseErr.kind === "traits_in_run" || phaseErr.kind === "traits_declare_in_run" ? "setup \u7ED3\u675F\u540E traits \u5DF2\u51BB\u7ED3\uFF1B\u8BF7\u5C06 $.traits.declare \u79FB\u52A8\u5230 LogicPlan.setup \u6216 Module.logic builder \u7684 setup \u6CE8\u518C\u9636\u6BB5\u3002" : "\u8C03\u6574\u903B\u8F91\u5230 run \u6BB5\uFF0Csetup \u4EC5\u505A\u6CE8\u518C\u7C7B\u64CD\u4F5C\u3002";
484
+ yield* record({
485
+ type: "diagnostic",
486
+ moduleId: phaseErr.moduleId ?? moduleId,
487
+ code: "logic::invalid_phase",
488
+ severity: "error",
489
+ message: `${phaseErr.api ?? phaseErr.kind} is not allowed in ${phaseErr.phase} phase.`,
490
+ hint,
491
+ kind: phaseErr.kind
492
+ });
493
+ return;
494
+ }
495
+ }
496
+ });
497
+
498
+ // ../logix-core/src/internal/runtime/BoundApiRuntime.ts
499
+ var LogicBuilderFactory = (runtime, runtimeInternals) => {
500
+ const flowApi = make(runtime, runtimeInternals);
501
+ return (stream, triggerName) => {
502
+ const runWithStateTransaction = (origin, body) => runtimeInternals.txn.runWithStateTransaction(origin, body);
503
+ const taskRunnerRuntime = {
504
+ moduleId: runtime.moduleId,
505
+ instanceId: runtimeInternals.instanceId,
506
+ runWithStateTransaction,
507
+ resolveConcurrencyPolicy: runtimeInternals.concurrency.resolveConcurrencyPolicy
508
+ };
509
+ const builder = {
510
+ debounce: (ms) => LogicBuilderFactory(runtime, runtimeInternals)(
511
+ flowApi.debounce(ms)(stream),
512
+ triggerName
513
+ ),
514
+ throttle: (ms) => LogicBuilderFactory(runtime, runtimeInternals)(
515
+ flowApi.throttle(ms)(stream),
516
+ triggerName
517
+ ),
518
+ filter: (predicate) => LogicBuilderFactory(runtime, runtimeInternals)(
519
+ flowApi.filter(predicate)(stream),
520
+ triggerName
521
+ ),
522
+ map: (f) => LogicBuilderFactory(runtime, runtimeInternals)(
523
+ stream.pipe(Stream.map(f)),
524
+ triggerName
525
+ ),
526
+ run(eff, options) {
527
+ return flowApi.run(eff, options)(stream);
528
+ },
529
+ runLatest(eff, options) {
530
+ return flowApi.runLatest(eff, options)(stream);
531
+ },
532
+ runExhaust(eff, options) {
533
+ return flowApi.runExhaust(eff, options)(stream);
534
+ },
535
+ runParallel(eff, options) {
536
+ return flowApi.runParallel(eff, options)(stream);
537
+ },
538
+ runFork: (eff) => Effect3.forkScoped(flowApi.run(eff)(stream)).pipe(
539
+ Effect3.asVoid
540
+ ),
541
+ runParallelFork: (eff) => Effect3.forkScoped(
542
+ flowApi.runParallel(eff)(stream)
543
+ ).pipe(
544
+ Effect3.asVoid
545
+ ),
546
+ runTask: (config) => makeTaskRunner(
547
+ stream,
548
+ "task",
549
+ taskRunnerRuntime,
550
+ {
551
+ ...config,
552
+ triggerName: config.triggerName ?? triggerName
553
+ }
554
+ ),
555
+ runParallelTask: (config) => makeTaskRunner(
556
+ stream,
557
+ "parallel",
558
+ taskRunnerRuntime,
559
+ {
560
+ ...config,
561
+ triggerName: config.triggerName ?? triggerName
562
+ }
563
+ ),
564
+ runLatestTask: (config) => makeTaskRunner(
565
+ stream,
566
+ "latest",
567
+ taskRunnerRuntime,
568
+ {
569
+ ...config,
570
+ triggerName: config.triggerName ?? triggerName
571
+ }
572
+ ),
573
+ runExhaustTask: (config) => makeTaskRunner(
574
+ stream,
575
+ "exhaust",
576
+ taskRunnerRuntime,
577
+ {
578
+ ...config,
579
+ triggerName: config.triggerName ?? triggerName
580
+ }
581
+ ),
582
+ toStream: () => stream,
583
+ update: (reducer) => Stream.runForEach(
584
+ stream,
585
+ (payload) => taskRunnerRuntime.runWithStateTransaction(
586
+ {
587
+ kind: "watcher:update",
588
+ name: triggerName
589
+ },
590
+ () => Effect3.gen(function* () {
591
+ const prev = yield* runtime.getState;
592
+ const next = reducer(prev, payload);
593
+ if (Effect3.isEffect(next)) {
594
+ const exit = yield* Effect3.exit(
595
+ next
596
+ );
597
+ if (exit._tag === "Failure") {
598
+ yield* Effect3.logError("Flow error", exit.cause);
599
+ return;
600
+ }
601
+ yield* runtime.setState(exit.value);
602
+ return;
603
+ }
604
+ yield* runtime.setState(next);
605
+ })
606
+ )
607
+ ).pipe(
608
+ Effect3.catchAllCause(
609
+ (cause) => Effect3.logError("Flow error", cause)
610
+ )
611
+ ),
612
+ mutate: (reducer) => Stream.runForEach(
613
+ stream,
614
+ (payload) => taskRunnerRuntime.runWithStateTransaction(
615
+ {
616
+ kind: "watcher:mutate",
617
+ name: triggerName
618
+ },
619
+ () => Effect3.gen(function* () {
620
+ const prev = yield* runtime.getState;
621
+ const recordPatch = runtimeInternals?.txn.recordStatePatch;
622
+ const { nextState, patchPaths } = mutateWithPatchPaths(
623
+ prev,
624
+ (draft) => {
625
+ reducer(draft, payload);
626
+ }
627
+ );
628
+ for (const path of patchPaths) {
629
+ recordPatch?.({
630
+ path,
631
+ reason: "watcher:mutate"
632
+ });
633
+ }
634
+ yield* runtime.setState(nextState);
635
+ })
636
+ )
637
+ ).pipe(
638
+ Effect3.catchAllCause(
639
+ (cause) => Effect3.logError("Flow error", cause)
640
+ )
641
+ )
642
+ };
643
+ const andThen = (handlerOrEff) => {
644
+ if (typeof handlerOrEff === "function") {
645
+ if (handlerOrEff.length >= 2) {
646
+ return builder.update(handlerOrEff);
647
+ }
648
+ return builder.run(handlerOrEff);
649
+ }
650
+ return builder.run(handlerOrEff);
651
+ };
652
+ const pipe = function() {
653
+ const fns = arguments;
654
+ let acc = builder;
655
+ for (let i = 0; i < fns.length; i++) {
656
+ acc = fns[i](acc);
657
+ }
658
+ return acc;
659
+ };
660
+ return Object.assign(builder, { pipe, andThen });
661
+ };
662
+ };
663
+ function make2(shape, runtime, options) {
664
+ const runtimeInternals = getRuntimeInternals(runtime);
665
+ const getPhase = options?.getPhase ?? (() => "run");
666
+ const getCurrentPhase = () => {
667
+ const phaseService = options?.phaseService;
668
+ const phase = phaseService?.current ?? getPhase();
669
+ return phase === "setup" ? "setup" : "run";
670
+ };
671
+ const guardRunOnly = (kind, api2) => {
672
+ const phaseService = options?.phaseService;
673
+ const phase = phaseService?.current ?? getPhase();
674
+ if (phase === "setup") {
675
+ throw makeLogicPhaseError(
676
+ kind,
677
+ api2,
678
+ "setup",
679
+ options?.moduleId
680
+ );
681
+ }
682
+ };
683
+ const flowApi = make(runtime, runtimeInternals);
684
+ const makeIntentBuilder = (runtime_) => LogicBuilderFactory(runtime_, runtimeInternals);
685
+ const withLifecycle = (available, missing) => Effect3.serviceOption(LifecycleContext).pipe(
686
+ Effect3.flatMap(
687
+ (maybe) => Option.match(maybe, {
688
+ onSome: available,
689
+ onNone: missing
690
+ })
691
+ )
692
+ );
693
+ const withPlatform = (invoke) => Effect3.serviceOption(Tag).pipe(
694
+ Effect3.flatMap(
695
+ (maybe) => Option.match(maybe, {
696
+ onSome: invoke,
697
+ onNone: () => Effect3.void
698
+ })
699
+ )
700
+ );
701
+ const emitSetupOnlyViolation = (api2) => record({
702
+ type: "diagnostic",
703
+ moduleId: runtime.moduleId,
704
+ instanceId: runtime.instanceId,
705
+ code: "logic::invalid_phase",
706
+ severity: "error",
707
+ message: `${api2} is setup-only and is not allowed in run phase.`,
708
+ hint: "\u5C06 $.lifecycle.* \u8C03\u7528\u79FB\u52A8\u5230 Module.logic builder \u7684\u540C\u6B65\u90E8\u5206\uFF08return \u4E4B\u524D\uFF09\u7528\u4E8E\u6CE8\u518C\uFF1Brun \u6BB5\u9700\u8981\u52A8\u6001\u8D44\u6E90\u6E05\u7406\u65F6\uFF0C\u8BF7\u4F7F\u7528 Effect.acquireRelease / Scope finalizer\uFF0C\u800C\u4E0D\u662F late \u6CE8\u518C onDestroy\u3002",
709
+ kind: "lifecycle_in_run"
710
+ });
711
+ const createIntentBuilder = (stream, triggerName) => makeIntentBuilder(runtime)(stream, triggerName);
712
+ const onceInRunSession = (key) => Effect3.serviceOption(RunSessionTag).pipe(
713
+ Effect3.map(
714
+ (maybe) => Option.isSome(maybe) ? maybe.value.local.once(key) : true
715
+ )
716
+ );
717
+ let cachedDiagnosticsLevel;
718
+ const isModuleLike = (value) => Boolean(
719
+ value && typeof value === "object" && ((value._kind === "ModuleDef" || value._kind === "Module") && "tag" in value) && Context3.isTag(value.tag)
720
+ );
721
+ const buildModuleHandle = (tag, rt) => {
722
+ const actionsProxy = new Proxy(
723
+ {},
724
+ {
725
+ get: (_target, prop) => (payload) => rt.dispatch({
726
+ _tag: prop,
727
+ payload
728
+ })
729
+ }
730
+ );
731
+ const handle = {
732
+ read: (selector) => Effect3.map(rt.getState, selector),
733
+ changes: rt.changes,
734
+ dispatch: rt.dispatch,
735
+ actions$: rt.actions$,
736
+ actions: actionsProxy
737
+ };
738
+ const EXTEND_HANDLE = /* @__PURE__ */ Symbol.for("logix.module.handle.extend");
739
+ const extend = tag?.[EXTEND_HANDLE];
740
+ return typeof extend === "function" ? extend(rt, handle) ?? handle : handle;
741
+ };
742
+ const emitModuleDescriptorOnce = (module, rt) => Effect3.gen(function* () {
743
+ if (cachedDiagnosticsLevel === "off") return;
744
+ const key = `module_descriptor:${String(rt.instanceId ?? "unknown")}`;
745
+ const shouldEmit = yield* onceInRunSession(key);
746
+ if (!shouldEmit) return;
747
+ const actionKeys = Object.keys(module.tag?.shape?.actionMap ?? {});
748
+ const internalSymbol = /* @__PURE__ */ Symbol.for("logix.module.internal");
749
+ const internal = module[internalSymbol];
750
+ const logicUnits = (internal?.mounted ?? []).map((u) => ({
751
+ kind: String(u?.kind ?? "user"),
752
+ id: String(u?.id ?? ""),
753
+ derived: u?.derived ? true : void 0,
754
+ name: typeof u?.name === "string" ? u.name : void 0
755
+ }));
756
+ const schemaKeys = module.schemas && typeof module.schemas === "object" ? Object.keys(module.schemas) : void 0;
757
+ const meta = module.meta && typeof module.meta === "object" ? module.meta : void 0;
758
+ const source = module.dev?.source;
759
+ const traitsSnapshot = runtimeInternals.traits.getModuleTraitsSnapshot();
760
+ const traits = traitsSnapshot ? {
761
+ digest: traitsSnapshot.digest,
762
+ count: traitsSnapshot.traits.length
763
+ } : void 0;
764
+ const data = {
765
+ id: module.id,
766
+ moduleId: String(rt.moduleId),
767
+ instanceId: String(rt.instanceId),
768
+ actionKeys,
769
+ logicUnits,
770
+ schemaKeys,
771
+ meta,
772
+ source,
773
+ traits
774
+ };
775
+ yield* record({
776
+ type: "trace:module:descriptor",
777
+ moduleId: rt.moduleId,
778
+ instanceId: rt.instanceId,
779
+ data
780
+ });
781
+ });
782
+ const resolveModuleRuntime = (tag) => Effect3.gen(function* () {
783
+ const requestedModuleId = typeof tag?.id === "string" ? tag.id : void 0;
784
+ const fromModuleId = typeof options?.moduleId === "string" ? options.moduleId : runtime.moduleId;
785
+ if (requestedModuleId && requestedModuleId === runtime.moduleId) {
786
+ return runtime;
787
+ }
788
+ const fromImports = runtimeInternals.imports.get(
789
+ tag
790
+ );
791
+ if (fromImports) {
792
+ return fromImports;
793
+ }
794
+ if (typeof options?.moduleId !== "string") {
795
+ const fromEnv = yield* Effect3.serviceOption(tag);
796
+ if (Option.isSome(fromEnv)) {
797
+ return fromEnv.value;
798
+ }
799
+ }
800
+ const tokenId = requestedModuleId ?? "<unknown module id>";
801
+ const fix = isDevEnv() ? [
802
+ "- Provide the child implementation in the same scope (imports).",
803
+ ` Example: ${fromModuleId ?? "ParentModule"}.implement({ imports: [${requestedModuleId ?? "ChildModule"}.impl], ... })`,
804
+ "- If you intentionally want a root singleton, provide it at app root (Runtime.make(...,{ layer }) / root imports),",
805
+ " and use Root.resolve(ModuleTag) (instead of $.use) at the callsite."
806
+ ] : [];
807
+ const err = new Error(
808
+ isDevEnv() ? [
809
+ "[MissingModuleRuntimeError] Cannot resolve ModuleRuntime for ModuleTag.",
810
+ "",
811
+ `tokenId: ${tokenId}`,
812
+ "entrypoint: logic.$.use",
813
+ "mode: strict",
814
+ `from: ${fromModuleId ?? "<unknown module id>"}`,
815
+ `startScope: moduleId=${fromModuleId ?? "<unknown>"}, instanceId=${String(runtime.instanceId ?? "<unknown>")}`,
816
+ "",
817
+ "fix:",
818
+ ...fix
819
+ ].join("\n") : "[MissingModuleRuntimeError] module runtime not found"
820
+ );
821
+ err.tokenId = tokenId;
822
+ err.entrypoint = "logic.$.use";
823
+ err.mode = "strict";
824
+ err.from = fromModuleId;
825
+ err.startScope = {
826
+ moduleId: fromModuleId,
827
+ instanceId: String(runtime.instanceId ?? "<unknown>")
828
+ };
829
+ err.fix = fix;
830
+ err.name = "MissingModuleRuntimeError";
831
+ return yield* Effect3.die(err);
832
+ });
833
+ const stateApi = {
834
+ read: runtime.getState,
835
+ update: (f) => Effect3.gen(function* () {
836
+ const inTxn = yield* FiberRef.get(inSyncTransactionFiber);
837
+ if (inTxn) {
838
+ const prev = yield* runtime.getState;
839
+ return yield* runtime.setState(f(prev));
840
+ }
841
+ const body = () => Effect3.flatMap(runtime.getState, (prev) => runtime.setState(f(prev)));
842
+ return yield* runtimeInternals ? runtimeInternals.txn.runWithStateTransaction(
843
+ { kind: "state", name: "update" },
844
+ body
845
+ ) : body();
846
+ }),
847
+ mutate: (f) => Effect3.gen(function* () {
848
+ const recordPatch = runtimeInternals?.txn.recordStatePatch;
849
+ const inTxn = yield* FiberRef.get(inSyncTransactionFiber);
850
+ if (inTxn) {
851
+ const prev = yield* runtime.getState;
852
+ const { nextState, patchPaths } = mutateWithPatchPaths(
853
+ prev,
854
+ (draft) => {
855
+ f(draft);
856
+ }
857
+ );
858
+ for (const path of patchPaths) {
859
+ recordPatch?.({
860
+ path,
861
+ reason: "state:mutate"
862
+ });
863
+ }
864
+ return yield* runtime.setState(nextState);
865
+ }
866
+ const body = () => Effect3.flatMap(runtime.getState, (prev) => {
867
+ const { nextState, patchPaths } = mutateWithPatchPaths(
868
+ prev,
869
+ (draft) => {
870
+ f(draft);
871
+ }
872
+ );
873
+ for (const path of patchPaths) {
874
+ recordPatch?.({
875
+ path,
876
+ reason: "state:mutate"
877
+ });
878
+ }
879
+ return runtime.setState(nextState);
880
+ });
881
+ return yield* runtimeInternals ? runtimeInternals.txn.runWithStateTransaction(
882
+ { kind: "state", name: "mutate" },
883
+ body
884
+ ) : body();
885
+ }),
886
+ ref: runtime.ref
887
+ };
888
+ const actionsApi = new Proxy({}, {
889
+ get: (_target, prop) => {
890
+ if (prop === "dispatch") {
891
+ return (a) => runtime.dispatch(a);
892
+ }
893
+ if (prop === "actions$") {
894
+ return runtime.actions$;
895
+ }
896
+ return (payload) => runtime.dispatch({ _tag: prop, payload });
897
+ }
898
+ });
899
+ const matchApi = (value) => makeMatch(value);
900
+ const matchTagApi = (value) => makeMatchTag(value);
901
+ const reducer = (tag, fn) => {
902
+ return Effect3.sync(() => {
903
+ runtimeInternals.txn.registerReducer(String(tag), fn);
904
+ });
905
+ };
906
+ const api = {
907
+ root: {
908
+ resolve: (tag) => {
909
+ guardRunOnly("root_resolve_in_setup", "$.root.resolve");
910
+ return resolve(tag, {
911
+ entrypoint: "logic.$.root.resolve",
912
+ waitForReady: true
913
+ });
914
+ }
915
+ },
916
+ state: stateApi,
917
+ actions: actionsApi,
918
+ flow: flowApi,
919
+ match: matchApi,
920
+ matchTag: matchTagApi,
921
+ lifecycle: {
922
+ onInitRequired: (eff) => {
923
+ if (getCurrentPhase() === "run") {
924
+ return emitSetupOnlyViolation("$.lifecycle.onInitRequired");
925
+ }
926
+ runtimeInternals.lifecycle.registerInitRequired(eff);
927
+ return Effect3.void;
928
+ },
929
+ onStart: (eff) => {
930
+ if (getCurrentPhase() === "run") {
931
+ return emitSetupOnlyViolation("$.lifecycle.onStart");
932
+ }
933
+ runtimeInternals.lifecycle.registerStart(eff);
934
+ return Effect3.void;
935
+ },
936
+ onInit: (eff) => {
937
+ if (getCurrentPhase() === "run") {
938
+ return emitSetupOnlyViolation("$.lifecycle.onInit");
939
+ }
940
+ runtimeInternals.lifecycle.registerInitRequired(eff);
941
+ return Effect3.void;
942
+ },
943
+ onDestroy: (eff) => {
944
+ if (getCurrentPhase() === "run") {
945
+ return emitSetupOnlyViolation("$.lifecycle.onDestroy");
946
+ }
947
+ runtimeInternals.lifecycle.registerDestroy(eff);
948
+ return Effect3.void;
949
+ },
950
+ onError: (handler) => {
951
+ if (getCurrentPhase() === "run") {
952
+ return emitSetupOnlyViolation("$.lifecycle.onError");
953
+ }
954
+ runtimeInternals.lifecycle.registerOnError(handler);
955
+ return Effect3.void;
956
+ },
957
+ onSuspend: (eff) => {
958
+ if (getCurrentPhase() === "run") {
959
+ return emitSetupOnlyViolation("$.lifecycle.onSuspend");
960
+ }
961
+ runtimeInternals.lifecycle.registerPlatformSuspend(
962
+ Effect3.asVoid(eff)
963
+ );
964
+ return Effect3.void;
965
+ },
966
+ onResume: (eff) => {
967
+ if (getCurrentPhase() === "run") {
968
+ return emitSetupOnlyViolation("$.lifecycle.onResume");
969
+ }
970
+ runtimeInternals.lifecycle.registerPlatformResume(
971
+ Effect3.asVoid(eff)
972
+ );
973
+ return Effect3.void;
974
+ },
975
+ onReset: (eff) => {
976
+ if (getCurrentPhase() === "run") {
977
+ return emitSetupOnlyViolation("$.lifecycle.onReset");
978
+ }
979
+ runtimeInternals.lifecycle.registerPlatformReset(
980
+ Effect3.asVoid(eff)
981
+ );
982
+ return Effect3.void;
983
+ }
984
+ },
985
+ traits: {
986
+ declare: (traits) => {
987
+ if (getCurrentPhase() === "run") {
988
+ throw makeLogicPhaseError(
989
+ "traits_declare_in_run",
990
+ "$.traits.declare",
991
+ "run",
992
+ options?.moduleId
993
+ );
994
+ }
995
+ if (!traits || typeof traits !== "object") {
996
+ throw new Error(
997
+ "[InvalidTraitsDeclaration] $.traits.declare expects an object."
998
+ );
999
+ }
1000
+ const logicUnit = options?.logicUnit ?? {
1001
+ logicUnitId: "unknown",
1002
+ logicUnitIdKind: "derived",
1003
+ logicUnitLabel: "logicUnit:unknown",
1004
+ path: void 0
1005
+ };
1006
+ runtimeInternals.traits.registerModuleTraitsContribution({
1007
+ traits,
1008
+ provenance: {
1009
+ originType: "logicUnit",
1010
+ originId: logicUnit.logicUnitId,
1011
+ originIdKind: logicUnit.logicUnitIdKind,
1012
+ originLabel: logicUnit.logicUnitLabel,
1013
+ path: logicUnit.path
1014
+ }
1015
+ });
1016
+ },
1017
+ source: {
1018
+ refresh: (fieldPath) => Effect3.gen(function* () {
1019
+ const handler = runtimeInternals.traits.getSourceRefreshHandler(
1020
+ fieldPath
1021
+ );
1022
+ if (!handler) {
1023
+ return yield* Effect3.void;
1024
+ }
1025
+ const inTxn = yield* FiberRef.get(inSyncTransactionFiber);
1026
+ if (inTxn) {
1027
+ const state = yield* runtime.getState;
1028
+ return yield* handler(state);
1029
+ }
1030
+ return yield* runtimeInternals.txn.runWithStateTransaction(
1031
+ {
1032
+ kind: "source-refresh",
1033
+ name: fieldPath
1034
+ },
1035
+ () => Effect3.gen(function* () {
1036
+ const state = yield* runtime.getState;
1037
+ return yield* handler(state);
1038
+ })
1039
+ );
1040
+ })
1041
+ }
1042
+ },
1043
+ reducer,
1044
+ use: new Proxy(() => {
1045
+ }, {
1046
+ apply: (_target, _thisArg, [arg]) => {
1047
+ guardRunOnly("use_in_setup", "$.use");
1048
+ if (isModuleLike(arg)) {
1049
+ const domain = arg;
1050
+ const tag = domain.tag;
1051
+ const resolveAndBuild = resolveModuleRuntime(tag).pipe(
1052
+ Effect3.map((rt) => buildModuleHandle(tag, rt))
1053
+ );
1054
+ const resolveWithDescriptor = resolveModuleRuntime(tag).pipe(
1055
+ Effect3.tap((rt) => emitModuleDescriptorOnce(domain, rt)),
1056
+ Effect3.map((rt) => buildModuleHandle(tag, rt))
1057
+ );
1058
+ const detectAndSelect = FiberRef.get(currentDiagnosticsLevel).pipe(
1059
+ Effect3.tap((level) => {
1060
+ cachedDiagnosticsLevel = level;
1061
+ }),
1062
+ Effect3.flatMap(
1063
+ (level) => level === "off" ? resolveAndBuild : resolveWithDescriptor
1064
+ )
1065
+ );
1066
+ return Effect3.suspend(() => {
1067
+ if (cachedDiagnosticsLevel === "off") {
1068
+ return resolveAndBuild;
1069
+ }
1070
+ if (cachedDiagnosticsLevel !== void 0) {
1071
+ return resolveWithDescriptor;
1072
+ }
1073
+ return detectAndSelect;
1074
+ });
1075
+ }
1076
+ if (Context3.isTag(arg)) {
1077
+ const candidate = arg;
1078
+ if (candidate._kind === "ModuleTag") {
1079
+ return resolveModuleRuntime(arg).pipe(
1080
+ Effect3.map(
1081
+ (rt) => buildModuleHandle(arg, rt)
1082
+ )
1083
+ );
1084
+ }
1085
+ return arg;
1086
+ }
1087
+ return Effect3.die("BoundApi.use: unsupported argument");
1088
+ }
1089
+ }),
1090
+ onAction: new Proxy(() => {
1091
+ }, {
1092
+ apply: (_target, _thisArg, args) => {
1093
+ guardRunOnly("use_in_setup", "$.onAction");
1094
+ const arg = args[0];
1095
+ if (typeof arg === "function") {
1096
+ return createIntentBuilder(
1097
+ runtime.actions$.pipe(Stream.filter(arg))
1098
+ );
1099
+ }
1100
+ if (typeof arg === "string") {
1101
+ return createIntentBuilder(
1102
+ runtime.actions$.pipe(
1103
+ Stream.filter((a) => a._tag === arg || a.type === arg)
1104
+ ),
1105
+ arg
1106
+ );
1107
+ }
1108
+ if (typeof arg === "object" && arg !== null) {
1109
+ if ("_tag" in arg) {
1110
+ return createIntentBuilder(
1111
+ runtime.actions$.pipe(
1112
+ Stream.filter((a) => a._tag === arg._tag)
1113
+ ),
1114
+ String(arg._tag)
1115
+ );
1116
+ }
1117
+ if (Schema.isSchema(arg)) {
1118
+ return createIntentBuilder(
1119
+ runtime.actions$.pipe(
1120
+ Stream.filter((a) => {
1121
+ const result = Schema.decodeUnknownSync(
1122
+ arg
1123
+ )(a);
1124
+ return !!result;
1125
+ })
1126
+ )
1127
+ );
1128
+ }
1129
+ }
1130
+ return createIntentBuilder(runtime.actions$);
1131
+ },
1132
+ get: (_target, prop) => {
1133
+ guardRunOnly("use_in_setup", "$.onAction");
1134
+ if (typeof prop === "string") {
1135
+ return createIntentBuilder(
1136
+ runtime.actions$.pipe(
1137
+ Stream.filter(
1138
+ (a) => a._tag === prop || a.type === prop
1139
+ )
1140
+ ),
1141
+ prop
1142
+ );
1143
+ }
1144
+ return void 0;
1145
+ }
1146
+ }),
1147
+ onState: (selector) => {
1148
+ guardRunOnly("use_in_setup", "$.onState");
1149
+ return createIntentBuilder(runtime.changes(selector));
1150
+ },
1151
+ on: (stream) => {
1152
+ guardRunOnly("use_in_setup", "$.on");
1153
+ return createIntentBuilder(stream);
1154
+ }
1155
+ };
1156
+ setBoundInternals(api, runtimeInternals);
1157
+ return api;
1158
+ }
1159
+
1160
+ export {
1161
+ mutateWithPatchPaths,
1162
+ LifecycleContext,
1163
+ makeLifecycleManager,
1164
+ emitEnvServiceNotFoundDiagnosticIfNeeded,
1165
+ LogicPhaseServiceTag,
1166
+ LogicUnitServiceTag,
1167
+ emitInvalidPhaseDiagnosticIfNeeded,
1168
+ make2 as make
1169
+ };
1170
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vbG9naXgtY29yZS9zcmMvaW50ZXJuYWwvcnVudGltZS9jb3JlL211dGF0aXZlUGF0Y2hlcy50cyIsICIuLi8uLi8uLi8uLi9sb2dpeC1jb3JlL3NyYy9pbnRlcm5hbC9ydW50aW1lL0JvdW5kQXBpUnVudGltZS50cyIsICIuLi8uLi8uLi8uLi9sb2dpeC1jb3JlL3NyYy9pbnRlcm5hbC9ydW50aW1lL2NvcmUvTGlmZWN5Y2xlLnRzIiwgIi4uLy4uLy4uLy4uL2xvZ2l4LWNvcmUvc3JjL2ludGVybmFsL3J1bnRpbWUvY29yZS9Mb2dpY0RpYWdub3N0aWNzLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyJpbXBvcnQgeyBjcmVhdGUsIHR5cGUgUGF0Y2hlcyB9IGZyb20gXCJtdXRhdGl2ZVwiXG5cbmV4cG9ydCB0eXBlIFBhdGNoUGF0aCA9IHN0cmluZ1xuXG5jb25zdCB0b1BhdGNoUGF0aFN0cmluZyA9IChwYXRoOiB1bmtub3duKTogUGF0Y2hQYXRoIHwgXCIqXCIgfCB1bmRlZmluZWQgPT4ge1xuICBpZiAodHlwZW9mIHBhdGggPT09IFwic3RyaW5nXCIpIHtcbiAgICBjb25zdCB0cmltbWVkID0gcGF0aC50cmltKClcbiAgICByZXR1cm4gdHJpbW1lZC5sZW5ndGggPiAwID8gdHJpbW1lZCA6IHVuZGVmaW5lZFxuICB9XG5cbiAgaWYgKCFBcnJheS5pc0FycmF5KHBhdGgpKSByZXR1cm4gdW5kZWZpbmVkXG5cbiAgY29uc3QgcGFydHM6IEFycmF5PHN0cmluZz4gPSBbXVxuICBmb3IgKGNvbnN0IHNlZyBvZiBwYXRoKSB7XG4gICAgaWYgKHR5cGVvZiBzZWcgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgIGlmIChzZWcubGVuZ3RoID4gMCkgcGFydHMucHVzaChzZWcpXG4gICAgICBjb250aW51ZVxuICAgIH1cbiAgICBpZiAodHlwZW9mIHNlZyA9PT0gXCJudW1iZXJcIiAmJiBOdW1iZXIuaXNGaW5pdGUoc2VnKSkge1xuICAgICAgcGFydHMucHVzaChTdHJpbmcoTWF0aC5mbG9vcihzZWcpKSlcbiAgICAgIGNvbnRpbnVlXG4gICAgfVxuICB9XG5cbiAgaWYgKHBhcnRzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIFwiKlwiXG4gIHJldHVybiBwYXJ0cy5qb2luKFwiLlwiKVxufVxuXG5leHBvcnQgY29uc3QgbXV0YXRlV2l0aFBhdGNoUGF0aHMgPSA8Uz4oXG4gIGJhc2U6IFMsXG4gIG11dGF0b3I6IChkcmFmdDogUykgPT4gdm9pZCxcbik6IHsgcmVhZG9ubHkgbmV4dFN0YXRlOiBTOyByZWFkb25seSBwYXRjaFBhdGhzOiBSZWFkb25seUFycmF5PFBhdGNoUGF0aCB8IFwiKlwiPiB9ID0+IHtcbiAgY29uc3Qgb3V0ID0gY3JlYXRlKGJhc2UsIG11dGF0b3IgYXMgYW55LCB7XG4gICAgZW5hYmxlUGF0Y2hlczoge1xuICAgICAgcGF0aEFzQXJyYXk6IHRydWUsXG4gICAgICBhcnJheUxlbmd0aEFzc2lnbm1lbnQ6IGZhbHNlLFxuICAgIH0sXG4gIH0pIGFzIHVua25vd25cblxuICBpZiAoIUFycmF5LmlzQXJyYXkob3V0KSkge1xuICAgIHJldHVybiB7IG5leHRTdGF0ZTogb3V0IGFzIFMsIHBhdGNoUGF0aHM6IFtdIH1cbiAgfVxuXG4gIGNvbnN0IG5leHRTdGF0ZSA9IG91dFswXSBhcyBTXG4gIGNvbnN0IHBhdGNoZXMgPSAob3V0WzFdID8/IFtdKSBhcyBQYXRjaGVzPHsgcGF0aEFzQXJyYXk6IHRydWU7IGFycmF5TGVuZ3RoQXNzaWdubWVudDogZmFsc2UgfT5cblxuICBjb25zdCBzZXQgPSBuZXcgU2V0PFBhdGNoUGF0aCB8IFwiKlwiPigpXG4gIGZvciAoY29uc3QgcGF0Y2ggb2YgcGF0Y2hlcykge1xuICAgIGNvbnN0IHAgPSB0b1BhdGNoUGF0aFN0cmluZygocGF0Y2ggYXMgYW55KT8ucGF0aClcbiAgICBpZiAoIXApIGNvbnRpbnVlXG4gICAgc2V0LmFkZChwKVxuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBuZXh0U3RhdGUsXG4gICAgcGF0Y2hQYXRoczogQXJyYXkuZnJvbShzZXQpLFxuICB9XG59XG5cbiIsICJpbXBvcnQgeyBDb250ZXh0LCBFZmZlY3QsIEZpYmVyUmVmLCBPcHRpb24sIFNjaGVtYSwgU3RyZWFtLCBTdWJzY3JpcHRpb25SZWYgfSBmcm9tIFwiZWZmZWN0XCJcbmltcG9ydCB7IGNyZWF0ZSB9IGZyb20gXCJtdXRhdGl2ZVwiXG5pbXBvcnQgdHlwZSAqIGFzIExvZ2l4IGZyb20gXCIuL2NvcmUvbW9kdWxlLmpzXCJcbmltcG9ydCAqIGFzIExvZ2ljIGZyb20gXCIuL2NvcmUvTG9naWNNaWRkbGV3YXJlLmpzXCJcbmltcG9ydCAqIGFzIFRhc2tSdW5uZXIgZnJvbSBcIi4vY29yZS9UYXNrUnVubmVyLmpzXCJcbmltcG9ydCB7IG11dGF0ZVdpdGhQYXRjaFBhdGhzIH0gZnJvbSBcIi4vY29yZS9tdXRhdGl2ZVBhdGNoZXMuanNcIlxuaW1wb3J0ICogYXMgRmxvd1J1bnRpbWUgZnJvbSBcIi4vRmxvd1J1bnRpbWUuanNcIlxuaW1wb3J0ICogYXMgTWF0Y2hCdWlsZGVyIGZyb20gXCIuL2NvcmUvTWF0Y2hCdWlsZGVyLmpzXCJcbmltcG9ydCAqIGFzIFBsYXRmb3JtIGZyb20gXCIuL2NvcmUvUGxhdGZvcm0uanNcIlxuaW1wb3J0ICogYXMgTGlmZWN5Y2xlIGZyb20gXCIuL0xpZmVjeWNsZS5qc1wiXG5pbXBvcnQgKiBhcyBEZWJ1ZyBmcm9tIFwiLi9jb3JlL0RlYnVnU2luay5qc1wiXG5pbXBvcnQgKiBhcyBMb2dpY0RpYWdub3N0aWNzIGZyb20gXCIuL2NvcmUvTG9naWNEaWFnbm9zdGljcy5qc1wiXG5pbXBvcnQgeyBpc0RldkVudiB9IGZyb20gXCIuL2NvcmUvZW52LmpzXCJcbmltcG9ydCB7IFJ1blNlc3Npb25UYWcgfSBmcm9tIFwiLi4vb2JzZXJ2YWJpbGl0eS9ydW5TZXNzaW9uLmpzXCJcbmltcG9ydCAqIGFzIFJvb3QgZnJvbSBcIi4uLy4uL1Jvb3QuanNcIlxuaW1wb3J0IHR5cGUgeyBSdW50aW1lSW50ZXJuYWxzIH0gZnJvbSBcIi4vY29yZS9SdW50aW1lSW50ZXJuYWxzLmpzXCJcbmltcG9ydCB0eXBlICogYXMgTW9kdWxlVHJhaXRzIGZyb20gXCIuL2NvcmUvTW9kdWxlVHJhaXRzLmpzXCJcbmltcG9ydCB7XG4gIGdldFJ1bnRpbWVJbnRlcm5hbHMsXG4gIHNldEJvdW5kSW50ZXJuYWxzLFxufSBmcm9tIFwiLi9jb3JlL3J1bnRpbWVJbnRlcm5hbHNBY2Nlc3Nvci5qc1wiXG5pbXBvcnQgdHlwZSB7XG4gIEFueU1vZHVsZVNoYXBlLFxuICBNb2R1bGVSdW50aW1lLFxuICBTdGF0ZU9mLFxuICBBY3Rpb25PZixcbn0gZnJvbSBcIi4vY29yZS9tb2R1bGUuanNcIlxuXG4vLyBcdTY3MkNcdTU3MzBcdTY3ODRcdTkwMjAgSW50ZW50QnVpbGRlciBcdTVERTVcdTUzODJcdUZGMENcdTdCNDlcdTRFRjdcdTRFOEVcdTUzOUYgaW50ZXJuYWwvZHNsL0xvZ2ljQnVpbGRlci5tYWtlSW50ZW50QnVpbGRlckZhY3RvcnlcbmNvbnN0IExvZ2ljQnVpbGRlckZhY3RvcnkgPSA8U2ggZXh0ZW5kcyBBbnlNb2R1bGVTaGFwZSwgUiA9IG5ldmVyPihcbiAgcnVudGltZTogTW9kdWxlUnVudGltZTxTdGF0ZU9mPFNoPiwgQWN0aW9uT2Y8U2g+PixcbiAgcnVudGltZUludGVybmFsczogUnVudGltZUludGVybmFscyxcbikgPT4ge1xuICBjb25zdCBmbG93QXBpID0gRmxvd1J1bnRpbWUubWFrZTxTaCwgUj4ocnVudGltZSwgcnVudGltZUludGVybmFscylcblxuICByZXR1cm4gPFQ+KFxuICAgIHN0cmVhbTogU3RyZWFtLlN0cmVhbTxUPixcbiAgICB0cmlnZ2VyTmFtZT86IHN0cmluZyxcbiAgKTogTG9naWMuSW50ZW50QnVpbGRlcjxULCBTaCwgUj4gPT4ge1xuICAgIGNvbnN0IHJ1bldpdGhTdGF0ZVRyYW5zYWN0aW9uOiBUYXNrUnVubmVyLlRhc2tSdW5uZXJSdW50aW1lW1wicnVuV2l0aFN0YXRlVHJhbnNhY3Rpb25cIl0gPVxuICAgICAgKG9yaWdpbiwgYm9keSkgPT4gcnVudGltZUludGVybmFscy50eG4ucnVuV2l0aFN0YXRlVHJhbnNhY3Rpb24ob3JpZ2luIGFzIGFueSwgYm9keSlcblxuXHQgICAgY29uc3QgdGFza1J1bm5lclJ1bnRpbWU6IFRhc2tSdW5uZXIuVGFza1J1bm5lclJ1bnRpbWUgPSB7XG5cdCAgICAgIG1vZHVsZUlkOiBydW50aW1lLm1vZHVsZUlkLFxuXHQgICAgICBpbnN0YW5jZUlkOiBydW50aW1lSW50ZXJuYWxzLmluc3RhbmNlSWQsXG5cdCAgICAgIHJ1bldpdGhTdGF0ZVRyYW5zYWN0aW9uLFxuXHQgICAgICByZXNvbHZlQ29uY3VycmVuY3lQb2xpY3k6IHJ1bnRpbWVJbnRlcm5hbHMuY29uY3VycmVuY3kucmVzb2x2ZUNvbmN1cnJlbmN5UG9saWN5LFxuXHQgICAgfVxuXG5cdCAgICBjb25zdCBidWlsZGVyID0ge1xuXHQgICAgICBkZWJvdW5jZTogKG1zOiBudW1iZXIpID0+XG5cdCAgICAgICAgTG9naWNCdWlsZGVyRmFjdG9yeTxTaCwgUj4ocnVudGltZSwgcnVudGltZUludGVybmFscykoXG5cdCAgICAgICAgICBmbG93QXBpLmRlYm91bmNlPFQ+KG1zKShzdHJlYW0pLFxuXHQgICAgICAgICAgdHJpZ2dlck5hbWUsXG5cdCAgICAgICAgKSxcblx0ICAgICAgdGhyb3R0bGU6IChtczogbnVtYmVyKSA9PlxuXHQgICAgICAgIExvZ2ljQnVpbGRlckZhY3Rvcnk8U2gsIFI+KHJ1bnRpbWUsIHJ1bnRpbWVJbnRlcm5hbHMpKFxuXHQgICAgICAgICAgZmxvd0FwaS50aHJvdHRsZTxUPihtcykoc3RyZWFtKSxcblx0ICAgICAgICAgIHRyaWdnZXJOYW1lLFxuXHQgICAgICAgICksXG5cdCAgICAgIGZpbHRlcjogKHByZWRpY2F0ZTogKHZhbHVlOiBUKSA9PiBib29sZWFuKSA9PlxuXHQgICAgICAgIExvZ2ljQnVpbGRlckZhY3Rvcnk8U2gsIFI+KHJ1bnRpbWUsIHJ1bnRpbWVJbnRlcm5hbHMpKFxuXHQgICAgICAgICAgZmxvd0FwaS5maWx0ZXIocHJlZGljYXRlKShzdHJlYW0pLFxuXHQgICAgICAgICAgdHJpZ2dlck5hbWUsXG5cdCAgICAgICAgKSxcblx0ICAgICAgbWFwOiA8VT4oZjogKHZhbHVlOiBUKSA9PiBVKSA9PlxuXHQgICAgICAgIExvZ2ljQnVpbGRlckZhY3Rvcnk8U2gsIFI+KHJ1bnRpbWUsIHJ1bnRpbWVJbnRlcm5hbHMpKFxuXHQgICAgICAgICAgc3RyZWFtLnBpcGUoU3RyZWFtLm1hcChmKSksXG5cdCAgICAgICAgICB0cmlnZ2VyTmFtZSxcblx0ICAgICAgICApLFxuICAgICAgcnVuPEEgPSB2b2lkLCBFID0gbmV2ZXIsIFIyID0gdW5rbm93bj4oXG4gICAgICAgIGVmZjpcbiAgICAgICAgICB8IExvZ2ljLk9mPFNoLCBSICYgUjIsIEEsIEU+XG4gICAgICAgICAgfCAoKHA6IFQpID0+IExvZ2ljLk9mPFNoLCBSICYgUjIsIEEsIEU+KSxcbiAgICAgICAgb3B0aW9ucz86IExvZ2ljLk9wZXJhdGlvbk9wdGlvbnMsXG4gICAgICApOiBMb2dpYy5PZjxTaCwgUiAmIFIyLCB2b2lkLCBFPiB7XG4gICAgICAgIHJldHVybiBmbG93QXBpLnJ1bjxULCBBLCBFLCBSMj4oZWZmLCBvcHRpb25zKShzdHJlYW0pXG4gICAgICB9LFxuICAgICAgcnVuTGF0ZXN0PEEgPSB2b2lkLCBFID0gbmV2ZXIsIFIyID0gdW5rbm93bj4oXG4gICAgICAgIGVmZjpcbiAgICAgICAgICB8IExvZ2ljLk9mPFNoLCBSICYgUjIsIEEsIEU+XG4gICAgICAgICAgfCAoKHA6IFQpID0+IExvZ2ljLk9mPFNoLCBSICYgUjIsIEEsIEU+KSxcbiAgICAgICAgb3B0aW9ucz86IExvZ2ljLk9wZXJhdGlvbk9wdGlvbnMsXG4gICAgICApOiBMb2dpYy5PZjxTaCwgUiAmIFIyLCB2b2lkLCBFPiB7XG4gICAgICAgIHJldHVybiBmbG93QXBpLnJ1bkxhdGVzdDxULCBBLCBFLCBSMj4oZWZmLCBvcHRpb25zKShzdHJlYW0pXG4gICAgICB9LFxuICAgICAgcnVuRXhoYXVzdDxBID0gdm9pZCwgRSA9IG5ldmVyLCBSMiA9IHVua25vd24+KFxuICAgICAgICBlZmY6XG4gICAgICAgICAgfCBMb2dpYy5PZjxTaCwgUiAmIFIyLCBBLCBFPlxuICAgICAgICAgIHwgKChwOiBUKSA9PiBMb2dpYy5PZjxTaCwgUiAmIFIyLCBBLCBFPiksXG4gICAgICAgIG9wdGlvbnM/OiBMb2dpYy5PcGVyYXRpb25PcHRpb25zLFxuICAgICAgKTogTG9naWMuT2Y8U2gsIFIgJiBSMiwgdm9pZCwgRT4ge1xuICAgICAgICByZXR1cm4gZmxvd0FwaS5ydW5FeGhhdXN0PFQsIEEsIEUsIFIyPihlZmYsIG9wdGlvbnMpKHN0cmVhbSlcbiAgICAgIH0sXG4gICAgICBydW5QYXJhbGxlbDxBID0gdm9pZCwgRSA9IG5ldmVyLCBSMiA9IHVua25vd24+KFxuICAgICAgICBlZmY6XG4gICAgICAgICAgfCBMb2dpYy5PZjxTaCwgUiAmIFIyLCBBLCBFPlxuICAgICAgICAgIHwgKChwOiBUKSA9PiBMb2dpYy5PZjxTaCwgUiAmIFIyLCBBLCBFPiksXG4gICAgICAgIG9wdGlvbnM/OiBMb2dpYy5PcGVyYXRpb25PcHRpb25zLFxuICAgICAgKTogTG9naWMuT2Y8U2gsIFIgJiBSMiwgdm9pZCwgRT4ge1xuICAgICAgICByZXR1cm4gZmxvd0FwaS5ydW5QYXJhbGxlbDxULCBBLCBFLCBSMj4oZWZmLCBvcHRpb25zKShzdHJlYW0pXG4gICAgICB9LFxuICAgICAgcnVuRm9yazogPEEgPSB2b2lkLCBFID0gbmV2ZXIsIFIyID0gdW5rbm93bj4oXG4gICAgICAgIGVmZjpcbiAgICAgICAgICB8IExvZ2ljLk9mPFNoLCBSICYgUjIsIEEsIEU+XG4gICAgICAgICAgfCAoKHA6IFQpID0+IExvZ2ljLk9mPFNoLCBSICYgUjIsIEEsIEU+KVxuICAgICAgKTogTG9naWMuT2Y8U2gsIFIgJiBSMiwgdm9pZCwgRT4gPT5cbiAgICAgICAgRWZmZWN0LmZvcmtTY29wZWQoZmxvd0FwaS5ydW48VCwgQSwgRSwgUjI+KGVmZikoc3RyZWFtKSkucGlwZShcbiAgICAgICAgICBFZmZlY3QuYXNWb2lkLFxuICAgICAgICApIGFzIExvZ2ljLk9mPFNoLCBSICYgUjIsIHZvaWQsIEU+LFxuICAgICAgcnVuUGFyYWxsZWxGb3JrOiA8QSA9IHZvaWQsIEUgPSBuZXZlciwgUjIgPSB1bmtub3duPihcbiAgICAgICAgZWZmOlxuICAgICAgICAgIHwgTG9naWMuT2Y8U2gsIFIgJiBSMiwgQSwgRT5cbiAgICAgICAgICB8ICgocDogVCkgPT4gTG9naWMuT2Y8U2gsIFIgJiBSMiwgQSwgRT4pXG4gICAgICApOiBMb2dpYy5PZjxTaCwgUiAmIFIyLCB2b2lkLCBFPiA9PlxuICAgICAgICBFZmZlY3QuZm9ya1Njb3BlZChcbiAgICAgICAgICBmbG93QXBpLnJ1blBhcmFsbGVsPFQsIEEsIEUsIFIyPihlZmYpKHN0cmVhbSksXG4gICAgICAgICkucGlwZShcbiAgICAgICAgICBFZmZlY3QuYXNWb2lkLFxuICAgICAgICApIGFzIExvZ2ljLk9mPFNoLCBSICYgUjIsIHZvaWQsIEU+LFxuICAgICAgcnVuVGFzazogPEEgPSB2b2lkLCBFID0gbmV2ZXIsIFIyID0gdW5rbm93bj4oXG4gICAgICAgIGNvbmZpZzogVGFza1J1bm5lci5UYXNrUnVubmVyQ29uZmlnPFQsIFNoLCBSICYgUjIsIEEsIEU+LFxuICAgICAgKTogTG9naWMuT2Y8U2gsIFIgJiBSMiwgdm9pZCwgbmV2ZXI+ID0+XG4gICAgICAgIFRhc2tSdW5uZXIubWFrZVRhc2tSdW5uZXI8VCwgU2gsIFIgJiBSMiwgQSwgRT4oXG4gICAgICAgICAgc3RyZWFtLFxuICAgICAgICAgIFwidGFza1wiLFxuICAgICAgICAgIHRhc2tSdW5uZXJSdW50aW1lLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIC4uLmNvbmZpZyxcbiAgICAgICAgICAgIHRyaWdnZXJOYW1lOiBjb25maWcudHJpZ2dlck5hbWUgPz8gdHJpZ2dlck5hbWUsXG4gICAgICAgICAgfSxcbiAgICAgICAgKSBhcyBMb2dpYy5PZjxTaCwgUiAmIFIyLCB2b2lkLCBuZXZlcj4sXG4gICAgICBydW5QYXJhbGxlbFRhc2s6IDxBID0gdm9pZCwgRSA9IG5ldmVyLCBSMiA9IHVua25vd24+KFxuICAgICAgICBjb25maWc6IFRhc2tSdW5uZXIuVGFza1J1bm5lckNvbmZpZzxULCBTaCwgUiAmIFIyLCBBLCBFPixcbiAgICAgICk6IExvZ2ljLk9mPFNoLCBSICYgUjIsIHZvaWQsIG5ldmVyPiA9PlxuICAgICAgICBUYXNrUnVubmVyLm1ha2VUYXNrUnVubmVyPFQsIFNoLCBSICYgUjIsIEEsIEU+KFxuICAgICAgICAgIHN0cmVhbSxcbiAgICAgICAgICBcInBhcmFsbGVsXCIsXG4gICAgICAgICAgdGFza1J1bm5lclJ1bnRpbWUsXG4gICAgICAgICAge1xuICAgICAgICAgICAgLi4uY29uZmlnLFxuICAgICAgICAgICAgdHJpZ2dlck5hbWU6IGNvbmZpZy50cmlnZ2VyTmFtZSA/PyB0cmlnZ2VyTmFtZSxcbiAgICAgICAgICB9LFxuICAgICAgICApIGFzIExvZ2ljLk9mPFNoLCBSICYgUjIsIHZvaWQsIG5ldmVyPixcbiAgICAgIHJ1bkxhdGVzdFRhc2s6IDxBID0gdm9pZCwgRSA9IG5ldmVyLCBSMiA9IHVua25vd24+KFxuICAgICAgICBjb25maWc6IFRhc2tSdW5uZXIuVGFza1J1bm5lckNvbmZpZzxULCBTaCwgUiAmIFIyLCBBLCBFPixcbiAgICAgICk6IExvZ2ljLk9mPFNoLCBSICYgUjIsIHZvaWQsIG5ldmVyPiA9PlxuICAgICAgICBUYXNrUnVubmVyLm1ha2VUYXNrUnVubmVyPFQsIFNoLCBSICYgUjIsIEEsIEU+KFxuICAgICAgICAgIHN0cmVhbSxcbiAgICAgICAgICBcImxhdGVzdFwiLFxuICAgICAgICAgIHRhc2tSdW5uZXJSdW50aW1lLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIC4uLmNvbmZpZyxcbiAgICAgICAgICAgIHRyaWdnZXJOYW1lOiBjb25maWcudHJpZ2dlck5hbWUgPz8gdHJpZ2dlck5hbWUsXG4gICAgICAgICAgfSxcbiAgICAgICAgKSBhcyBMb2dpYy5PZjxTaCwgUiAmIFIyLCB2b2lkLCBuZXZlcj4sXG4gICAgICBydW5FeGhhdXN0VGFzazogPEEgPSB2b2lkLCBFID0gbmV2ZXIsIFIyID0gdW5rbm93bj4oXG4gICAgICAgIGNvbmZpZzogVGFza1J1bm5lci5UYXNrUnVubmVyQ29uZmlnPFQsIFNoLCBSICYgUjIsIEEsIEU+LFxuICAgICAgKTogTG9naWMuT2Y8U2gsIFIgJiBSMiwgdm9pZCwgbmV2ZXI+ID0+XG4gICAgICAgIFRhc2tSdW5uZXIubWFrZVRhc2tSdW5uZXI8VCwgU2gsIFIgJiBSMiwgQSwgRT4oXG4gICAgICAgICAgc3RyZWFtLFxuICAgICAgICAgIFwiZXhoYXVzdFwiLFxuICAgICAgICAgIHRhc2tSdW5uZXJSdW50aW1lLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIC4uLmNvbmZpZyxcbiAgICAgICAgICAgIHRyaWdnZXJOYW1lOiBjb25maWcudHJpZ2dlck5hbWUgPz8gdHJpZ2dlck5hbWUsXG4gICAgICAgICAgfSxcbiAgICAgICAgKSBhcyBMb2dpYy5PZjxTaCwgUiAmIFIyLCB2b2lkLCBuZXZlcj4sXG4gICAgICB0b1N0cmVhbTogKCkgPT4gc3RyZWFtLFxuICAgICAgdXBkYXRlOiAoXG4gICAgICAgIHJlZHVjZXI6IChcbiAgICAgICAgICBwcmV2OiBTdGF0ZU9mPFNoPixcbiAgICAgICAgICBwYXlsb2FkOiBUXG4gICAgICAgICkgPT5cbiAgICAgICAgICB8IFN0YXRlT2Y8U2g+XG4gICAgICAgICAgfCBFZmZlY3QuRWZmZWN0PFN0YXRlT2Y8U2g+LCBhbnksIGFueT5cbiAgICAgICk6IExvZ2ljLk9mPFNoLCBSLCB2b2lkLCBuZXZlcj4gPT5cbiAgICAgICAgU3RyZWFtLnJ1bkZvckVhY2goc3RyZWFtLCAocGF5bG9hZCkgPT5cbiAgICAgICAgICB0YXNrUnVubmVyUnVudGltZS5ydW5XaXRoU3RhdGVUcmFuc2FjdGlvbihcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAga2luZDogXCJ3YXRjaGVyOnVwZGF0ZVwiLFxuICAgICAgICAgICAgICBuYW1lOiB0cmlnZ2VyTmFtZSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAoKSA9PlxuICAgICAgICAgICAgICBFZmZlY3QuZ2VuKGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcHJldiA9ICh5aWVsZCogcnVudGltZS5nZXRTdGF0ZSkgYXMgU3RhdGVPZjxTaD5cbiAgICAgICAgICAgICAgICBjb25zdCBuZXh0ID0gcmVkdWNlcihwcmV2LCBwYXlsb2FkKVxuICAgICAgICAgICAgICAgIGlmIChFZmZlY3QuaXNFZmZlY3QobmV4dCkpIHtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IGV4aXQgPSB5aWVsZCogRWZmZWN0LmV4aXQoXG4gICAgICAgICAgICAgICAgICAgIG5leHQgYXMgRWZmZWN0LkVmZmVjdDxTdGF0ZU9mPFNoPiwgYW55LCBhbnk+LFxuICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgaWYgKGV4aXQuX3RhZyA9PT0gXCJGYWlsdXJlXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgeWllbGQqIEVmZmVjdC5sb2dFcnJvcihcIkZsb3cgZXJyb3JcIiwgZXhpdC5jYXVzZSlcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB5aWVsZCogcnVudGltZS5zZXRTdGF0ZShleGl0LnZhbHVlIGFzIFN0YXRlT2Y8U2g+KVxuICAgICAgICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHlpZWxkKiBydW50aW1lLnNldFN0YXRlKG5leHQgYXMgU3RhdGVPZjxTaD4pXG4gICAgICAgICAgICAgIH0pLFxuICAgICAgICAgIClcbiAgICAgICAgKS5waXBlKFxuICAgICAgICAgIEVmZmVjdC5jYXRjaEFsbENhdXNlKChjYXVzZSkgPT5cbiAgICAgICAgICAgIEVmZmVjdC5sb2dFcnJvcihcIkZsb3cgZXJyb3JcIiwgY2F1c2UpXG4gICAgICAgICAgKVxuICAgICAgICApIGFzIExvZ2ljLk9mPFNoLCBSLCB2b2lkLCBuZXZlcj4sXG4gICAgICBtdXRhdGU6IChcbiAgICAgICAgcmVkdWNlcjogKGRyYWZ0OiBMb2dpYy5EcmFmdDxTdGF0ZU9mPFNoPj4sIHBheWxvYWQ6IFQpID0+IHZvaWRcbiAgICAgICk6IExvZ2ljLk9mPFNoLCBSLCB2b2lkLCBuZXZlcj4gPT5cbiAgICAgICAgU3RyZWFtLnJ1bkZvckVhY2goc3RyZWFtLCAocGF5bG9hZCkgPT5cbiAgICAgICAgICB0YXNrUnVubmVyUnVudGltZS5ydW5XaXRoU3RhdGVUcmFuc2FjdGlvbihcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAga2luZDogXCJ3YXRjaGVyOm11dGF0ZVwiLFxuICAgICAgICAgICAgICBuYW1lOiB0cmlnZ2VyTmFtZSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAoKSA9PlxuICAgICAgICAgICAgICBFZmZlY3QuZ2VuKGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcHJldiA9ICh5aWVsZCogcnVudGltZS5nZXRTdGF0ZSkgYXMgU3RhdGVPZjxTaD5cbiAgICAgICAgICAgICAgICBjb25zdCByZWNvcmRQYXRjaCA9IHJ1bnRpbWVJbnRlcm5hbHM/LnR4bi5yZWNvcmRTdGF0ZVBhdGNoXG5cbiAgICAgICAgICAgICAgICBjb25zdCB7IG5leHRTdGF0ZSwgcGF0Y2hQYXRocyB9ID0gbXV0YXRlV2l0aFBhdGNoUGF0aHMoXG4gICAgICAgICAgICAgICAgICBwcmV2IGFzIFN0YXRlT2Y8U2g+LFxuICAgICAgICAgICAgICAgICAgKGRyYWZ0KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHJlZHVjZXIoZHJhZnQgYXMgTG9naWMuRHJhZnQ8U3RhdGVPZjxTaD4+LCBwYXlsb2FkKVxuICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICApXG5cbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHBhdGggb2YgcGF0Y2hQYXRocykge1xuICAgICAgICAgICAgICAgICAgcmVjb3JkUGF0Y2g/Lih7XG4gICAgICAgICAgICAgICAgICAgIHBhdGgsXG4gICAgICAgICAgICAgICAgICAgIHJlYXNvbjogXCJ3YXRjaGVyOm11dGF0ZVwiLFxuICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB5aWVsZCogcnVudGltZS5zZXRTdGF0ZShuZXh0U3RhdGUpXG4gICAgICAgICAgICAgIH0pLFxuICAgICAgICAgIClcbiAgICAgICAgKS5waXBlKFxuICAgICAgICAgIEVmZmVjdC5jYXRjaEFsbENhdXNlKChjYXVzZSkgPT5cbiAgICAgICAgICAgIEVmZmVjdC5sb2dFcnJvcihcIkZsb3cgZXJyb3JcIiwgY2F1c2UpXG4gICAgICAgICAgKVxuICAgICAgICApIGFzIExvZ2ljLk9mPFNoLCBSLCB2b2lkLCBuZXZlcj4sXG4gICAgfSBhcyBPbWl0PExvZ2ljLkludGVudEJ1aWxkZXI8VCwgU2gsIFI+LCBcInBpcGVcIiB8IFwiYW5kVGhlblwiPlxuXG4gICAgY29uc3QgYW5kVGhlbjogTG9naWMuSW50ZW50QnVpbGRlcjxULCBTaCwgUj5bXCJhbmRUaGVuXCJdID0gKFxuICAgICAgaGFuZGxlck9yRWZmOiBhbnksXG4gICAgKTogYW55ID0+IHtcbiAgICAgIGlmICh0eXBlb2YgaGFuZGxlck9yRWZmID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgaWYgKGhhbmRsZXJPckVmZi5sZW5ndGggPj0gMikge1xuICAgICAgICAgIHJldHVybiAoYnVpbGRlciBhcyBhbnkpLnVwZGF0ZShoYW5kbGVyT3JFZmYpXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIChidWlsZGVyIGFzIGFueSkucnVuKGhhbmRsZXJPckVmZilcbiAgICAgIH1cbiAgICAgIHJldHVybiAoYnVpbGRlciBhcyBhbnkpLnJ1bihoYW5kbGVyT3JFZmYpXG4gICAgfVxuXG4gICAgY29uc3QgcGlwZTogTG9naWMuSW50ZW50QnVpbGRlcjxULCBTaCwgUj5bXCJwaXBlXCJdID0gZnVuY3Rpb24gKHRoaXM6IHVua25vd24pIHtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBwcmVmZXItcmVzdC1wYXJhbXNcbiAgICAgIGNvbnN0IGZucyA9IGFyZ3VtZW50cyBhcyB1bmtub3duIGFzIFJlYWRvbmx5QXJyYXk8XG4gICAgICAgIChzZWxmOiBMb2dpYy5JbnRlbnRCdWlsZGVyPFQsIFNoLCBSPikgPT4gTG9naWMuSW50ZW50QnVpbGRlcjxULCBTaCwgUj5cbiAgICAgID5cbiAgICAgIGxldCBhY2M6IExvZ2ljLkludGVudEJ1aWxkZXI8VCwgU2gsIFI+ID0gYnVpbGRlciBhcyBMb2dpYy5JbnRlbnRCdWlsZGVyPFxuICAgICAgICBULFxuICAgICAgICBTaCxcbiAgICAgICAgUlxuICAgICAgPlxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBmbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgYWNjID0gZm5zW2ldKGFjYylcbiAgICAgIH1cbiAgICAgIHJldHVybiBhY2NcbiAgICB9XG5cbiAgICByZXR1cm4gT2JqZWN0LmFzc2lnbihidWlsZGVyLCB7IHBpcGUsIGFuZFRoZW4gfSkgYXMgTG9naWMuSW50ZW50QnVpbGRlcjxcbiAgICAgIFQsXG4gICAgICBTaCxcbiAgICAgIFJcbiAgICA+XG4gIH1cbn1cbmltcG9ydCB0eXBlIHsgQm91bmRBcGkgfSBmcm9tIFwiLi9jb3JlL21vZHVsZS5qc1wiXG5cbi8qKlxuICogQm91bmRBcGkgXHU1QjlFXHU3M0IwXHVGRjFBXHU0RTNBXHU2N0QwXHU0RTAwXHU3QzdCIFN0b3JlIFNoYXBlICsgUnVudGltZSBcdTUyMUJcdTVFRkFcdTk4ODRcdTdFRDFcdTVCOUFcdTc2ODQgYCRgXHUzMDAyXG4gKlxuICogXHU4QkY0XHU2NjBFXHVGRjFBXHU3QzdCXHU1NzhCXHU0RTBFXHU1MTY1XHU1M0UzXHU3QjdFXHU1NDBEXHU1NzI4IGFwaS9Cb3VuZEFwaS50cyBcdTRFMkRcdTU4RjBcdTY2MEVcdUZGMENcdThGRDlcdTkxQ0NcdTUzRUFcdTYyN0ZcdThGN0RcdTUxNzdcdTRGNTNcdTVCOUVcdTczQjBcdTMwMDJcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1ha2U8U2ggZXh0ZW5kcyBMb2dpeC5BbnlNb2R1bGVTaGFwZSwgUiA9IG5ldmVyPihcbiAgc2hhcGU6IFNoLFxuICBydW50aW1lOiBMb2dpeC5Nb2R1bGVSdW50aW1lPExvZ2l4LlN0YXRlT2Y8U2g+LCBMb2dpeC5BY3Rpb25PZjxTaD4+LFxuICBvcHRpb25zPzoge1xuICAgIHJlYWRvbmx5IGdldFBoYXNlPzogKCkgPT4gXCJzZXR1cFwiIHwgXCJydW5cIlxuICAgIHJlYWRvbmx5IHBoYXNlU2VydmljZT86IExvZ2ljRGlhZ25vc3RpY3MuTG9naWNQaGFzZVNlcnZpY2VcbiAgICByZWFkb25seSBtb2R1bGVJZD86IHN0cmluZ1xuICAgIHJlYWRvbmx5IGxvZ2ljVW5pdD86IExvZ2ljRGlhZ25vc3RpY3MuTG9naWNVbml0U2VydmljZVxuICB9XG4gICk6IEJvdW5kQXBpPFNoLCBSPiB7XG4gIGNvbnN0IHJ1bnRpbWVJbnRlcm5hbHMgPSBnZXRSdW50aW1lSW50ZXJuYWxzKHJ1bnRpbWUgYXMgYW55KVxuXG4gIGNvbnN0IGdldFBoYXNlID0gb3B0aW9ucz8uZ2V0UGhhc2UgPz8gKCgpID0+IFwicnVuXCIpXG4gIGNvbnN0IGdldEN1cnJlbnRQaGFzZSA9ICgpOiBcInNldHVwXCIgfCBcInJ1blwiID0+IHtcbiAgICBjb25zdCBwaGFzZVNlcnZpY2UgPSBvcHRpb25zPy5waGFzZVNlcnZpY2VcbiAgICBjb25zdCBwaGFzZSA9IHBoYXNlU2VydmljZT8uY3VycmVudCA/PyBnZXRQaGFzZSgpXG4gICAgcmV0dXJuIHBoYXNlID09PSBcInNldHVwXCIgPyBcInNldHVwXCIgOiBcInJ1blwiXG4gIH1cbiAgY29uc3QgZ3VhcmRSdW5Pbmx5ID0gKGtpbmQ6IHN0cmluZywgYXBpOiBzdHJpbmcpID0+IHtcbiAgICBjb25zdCBwaGFzZVNlcnZpY2UgPSBvcHRpb25zPy5waGFzZVNlcnZpY2VcbiAgICBjb25zdCBwaGFzZSA9IHBoYXNlU2VydmljZT8uY3VycmVudCA/PyBnZXRQaGFzZSgpXG4gICAgaWYgKHBoYXNlID09PSBcInNldHVwXCIpIHtcbiAgICAgIHRocm93IExvZ2ljRGlhZ25vc3RpY3MubWFrZUxvZ2ljUGhhc2VFcnJvcihcbiAgICAgICAga2luZCxcbiAgICAgICAgYXBpLFxuICAgICAgICBcInNldHVwXCIsXG4gICAgICAgIG9wdGlvbnM/Lm1vZHVsZUlkXG4gICAgICApXG4gICAgfVxuICB9XG4gIGNvbnN0IGZsb3dBcGkgPSBGbG93UnVudGltZS5tYWtlPFNoLCBSPihydW50aW1lLCBydW50aW1lSW50ZXJuYWxzKVxuXG4gIGNvbnN0IG1ha2VJbnRlbnRCdWlsZGVyID0gKHJ1bnRpbWVfOiBMb2dpeC5Nb2R1bGVSdW50aW1lPGFueSwgYW55PikgPT5cbiAgICBMb2dpY0J1aWxkZXJGYWN0b3J5PFNoLCBSPihydW50aW1lXywgcnVudGltZUludGVybmFscylcbiAgY29uc3Qgd2l0aExpZmVjeWNsZSA9IDxBPihcbiAgICBhdmFpbGFibGU6IChcbiAgICAgIG1hbmFnZXI6IExpZmVjeWNsZS5MaWZlY3ljbGVNYW5hZ2VyXG4gICAgKSA9PiBFZmZlY3QuRWZmZWN0PEEsIG5ldmVyLCBhbnk+LFxuICAgIG1pc3Npbmc6ICgpID0+IEVmZmVjdC5FZmZlY3Q8QSwgbmV2ZXIsIGFueT5cbiAgKSA9PlxuICAgIEVmZmVjdC5zZXJ2aWNlT3B0aW9uKExpZmVjeWNsZS5MaWZlY3ljbGVDb250ZXh0KS5waXBlKFxuICAgICAgRWZmZWN0LmZsYXRNYXAoKG1heWJlKSA9PlxuICAgICAgICBPcHRpb24ubWF0Y2gobWF5YmUsIHtcbiAgICAgICAgICBvblNvbWU6IGF2YWlsYWJsZSxcbiAgICAgICAgICBvbk5vbmU6IG1pc3NpbmcsXG4gICAgICAgIH0pXG4gICAgICApXG4gICAgKVxuICBjb25zdCB3aXRoUGxhdGZvcm0gPSAoXG4gICAgaW52b2tlOiAocGxhdGZvcm06IFBsYXRmb3JtLlNlcnZpY2UpID0+IEVmZmVjdC5FZmZlY3Q8dm9pZCwgbmV2ZXIsIGFueT5cbiAgKSA9PlxuICAgIEVmZmVjdC5zZXJ2aWNlT3B0aW9uKFBsYXRmb3JtLlRhZykucGlwZShcbiAgICAgIEVmZmVjdC5mbGF0TWFwKChtYXliZSkgPT5cbiAgICAgICAgT3B0aW9uLm1hdGNoKG1heWJlLCB7XG4gICAgICAgICAgb25Tb21lOiBpbnZva2UsXG4gICAgICAgICAgb25Ob25lOiAoKSA9PiBFZmZlY3Qudm9pZCxcbiAgICAgICAgfSlcbiAgICAgIClcbiAgICApXG5cbiAgY29uc3QgZW1pdFNldHVwT25seVZpb2xhdGlvbiA9IChhcGk6IHN0cmluZyk6IEVmZmVjdC5FZmZlY3Q8dm9pZD4gPT5cbiAgICBEZWJ1Zy5yZWNvcmQoe1xuICAgICAgdHlwZTogXCJkaWFnbm9zdGljXCIsXG4gICAgICBtb2R1bGVJZDogcnVudGltZS5tb2R1bGVJZCxcbiAgICAgIGluc3RhbmNlSWQ6IHJ1bnRpbWUuaW5zdGFuY2VJZCxcbiAgICAgIGNvZGU6IFwibG9naWM6OmludmFsaWRfcGhhc2VcIixcbiAgICAgIHNldmVyaXR5OiBcImVycm9yXCIsXG4gICAgICBtZXNzYWdlOiBgJHthcGl9IGlzIHNldHVwLW9ubHkgYW5kIGlzIG5vdCBhbGxvd2VkIGluIHJ1biBwaGFzZS5gLFxuICAgICAgaGludDpcbiAgICAgICAgXCJcdTVDMDYgJC5saWZlY3ljbGUuKiBcdThDMDNcdTc1MjhcdTc5RkJcdTUyQThcdTUyMzAgTW9kdWxlLmxvZ2ljIGJ1aWxkZXIgXHU3Njg0XHU1NDBDXHU2QjY1XHU5MEU4XHU1MjA2XHVGRjA4cmV0dXJuIFx1NEU0Qlx1NTI0RFx1RkYwOVx1NzUyOFx1NEU4RVx1NkNFOFx1NTE4Q1x1RkYxQlwiICtcbiAgICAgICAgXCJydW4gXHU2QkI1XHU5NzAwXHU4OTgxXHU1MkE4XHU2MDAxXHU4RDQ0XHU2RTkwXHU2RTA1XHU3NDA2XHU2NUY2XHVGRjBDXHU4QkY3XHU0RjdGXHU3NTI4IEVmZmVjdC5hY3F1aXJlUmVsZWFzZSAvIFNjb3BlIGZpbmFsaXplclx1RkYwQ1x1ODAwQ1x1NEUwRFx1NjYyRiBsYXRlIFx1NkNFOFx1NTE4QyBvbkRlc3Ryb3lcdTMwMDJcIixcbiAgICAgIGtpbmQ6IFwibGlmZWN5Y2xlX2luX3J1blwiLFxuICAgIH0pXG5cbiAgY29uc3QgY3JlYXRlSW50ZW50QnVpbGRlciA9IDxUPihcbiAgICBzdHJlYW06IFN0cmVhbS5TdHJlYW08VD4sXG4gICAgdHJpZ2dlck5hbWU/OiBzdHJpbmcsXG4gICkgPT4gbWFrZUludGVudEJ1aWxkZXIocnVudGltZSkoc3RyZWFtLCB0cmlnZ2VyTmFtZSlcblxuICBjb25zdCBvbmNlSW5SdW5TZXNzaW9uID0gKGtleTogc3RyaW5nKTogRWZmZWN0LkVmZmVjdDxib29sZWFuLCBuZXZlciwgYW55PiA9PlxuICAgIEVmZmVjdC5zZXJ2aWNlT3B0aW9uKFJ1blNlc3Npb25UYWcpLnBpcGUoXG4gICAgICBFZmZlY3QubWFwKChtYXliZSkgPT5cbiAgICAgICAgT3B0aW9uLmlzU29tZShtYXliZSkgPyBtYXliZS52YWx1ZS5sb2NhbC5vbmNlKGtleSkgOiB0cnVlLFxuICAgICAgKSxcbiAgICApXG5cbiAgbGV0IGNhY2hlZERpYWdub3N0aWNzTGV2ZWw6IERlYnVnLkRpYWdub3N0aWNzTGV2ZWwgfCB1bmRlZmluZWRcblxuICBjb25zdCBpc01vZHVsZUxpa2UgPSAoXG4gICAgdmFsdWU6IHVua25vd24sXG4gICk6IHZhbHVlIGlzIHtcbiAgICByZWFkb25seSBfa2luZDogXCJNb2R1bGVEZWZcIiB8IFwiTW9kdWxlXCJcbiAgICByZWFkb25seSBpZDogc3RyaW5nXG4gICAgcmVhZG9ubHkgdGFnOiBDb250ZXh0LlRhZzxhbnksIExvZ2l4Lk1vZHVsZVJ1bnRpbWU8YW55LCBhbnk+PlxuICAgIHJlYWRvbmx5IHNjaGVtYXM/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuICAgIHJlYWRvbmx5IG1ldGE/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuICAgIHJlYWRvbmx5IGRldj86IHsgcmVhZG9ubHkgc291cmNlPzogeyByZWFkb25seSBmaWxlOiBzdHJpbmc7IHJlYWRvbmx5IGxpbmU6IG51bWJlcjsgcmVhZG9ubHkgY29sdW1uOiBudW1iZXIgfSB9XG4gIH0gPT5cbiAgICBCb29sZWFuKFxuICAgICAgdmFsdWUgJiZcbiAgICAgICAgdHlwZW9mIHZhbHVlID09PSBcIm9iamVjdFwiICYmXG4gICAgICAgICgoKHZhbHVlIGFzIGFueSkuX2tpbmQgPT09IFwiTW9kdWxlRGVmXCIgfHwgKHZhbHVlIGFzIGFueSkuX2tpbmQgPT09IFwiTW9kdWxlXCIpICYmXG4gICAgICAgICAgXCJ0YWdcIiBpbiAodmFsdWUgYXMgb2JqZWN0KSkgJiZcbiAgICAgICAgQ29udGV4dC5pc1RhZygodmFsdWUgYXMgYW55KS50YWcpLFxuICAgIClcblxuICBjb25zdCBidWlsZE1vZHVsZUhhbmRsZSA9IChcbiAgICB0YWc6IENvbnRleHQuVGFnPGFueSwgTG9naXguTW9kdWxlUnVudGltZTxhbnksIGFueT4+LFxuICAgIHJ0OiBMb2dpeC5Nb2R1bGVSdW50aW1lPGFueSwgYW55PixcbiAgKTogdW5rbm93biA9PiB7XG4gICAgY29uc3QgYWN0aW9uc1Byb3h5OiBMb2dpeC5Nb2R1bGVIYW5kbGU8YW55PltcImFjdGlvbnNcIl0gPVxuICAgICAgbmV3IFByb3h5KFxuICAgICAgICB7fSxcbiAgICAgICAge1xuICAgICAgICAgIGdldDogKF90YXJnZXQsIHByb3ApID0+XG4gICAgICAgICAgICAocGF5bG9hZDogdW5rbm93bikgPT5cbiAgICAgICAgICAgICAgcnQuZGlzcGF0Y2goe1xuICAgICAgICAgICAgICAgIF90YWc6IHByb3AgYXMgc3RyaW5nLFxuICAgICAgICAgICAgICAgIHBheWxvYWQsXG4gICAgICAgICAgICAgIH0pLFxuICAgICAgICB9LFxuICAgICAgKSBhcyBMb2dpeC5Nb2R1bGVIYW5kbGU8YW55PltcImFjdGlvbnNcIl1cblxuICAgIGNvbnN0IGhhbmRsZTogTG9naXguTW9kdWxlSGFuZGxlPGFueT4gPSB7XG4gICAgICByZWFkOiAoc2VsZWN0b3IpID0+IEVmZmVjdC5tYXAocnQuZ2V0U3RhdGUsIHNlbGVjdG9yKSxcbiAgICAgIGNoYW5nZXM6IHJ0LmNoYW5nZXMsXG4gICAgICBkaXNwYXRjaDogcnQuZGlzcGF0Y2gsXG4gICAgICBhY3Rpb25zJDogcnQuYWN0aW9ucyQsXG4gICAgICBhY3Rpb25zOiBhY3Rpb25zUHJveHksXG4gICAgfVxuXG4gICAgY29uc3QgRVhURU5EX0hBTkRMRSA9IFN5bWJvbC5mb3IoXCJsb2dpeC5tb2R1bGUuaGFuZGxlLmV4dGVuZFwiKVxuICAgIGNvbnN0IGV4dGVuZCA9XG4gICAgICAodGFnIGFzIGFueSk/LltFWFRFTkRfSEFORExFXSBhc1xuICAgICAgICB8ICgoXG4gICAgICAgICAgICBydW50aW1lOiBMb2dpeC5Nb2R1bGVSdW50aW1lPGFueSwgYW55PixcbiAgICAgICAgICAgIGJhc2U6IExvZ2l4Lk1vZHVsZUhhbmRsZTxhbnk+LFxuICAgICAgICAgICkgPT4gdW5rbm93bilcbiAgICAgICAgfCB1bmRlZmluZWRcblxuICAgIHJldHVybiB0eXBlb2YgZXh0ZW5kID09PSBcImZ1bmN0aW9uXCIgPyAoZXh0ZW5kKHJ0LCBoYW5kbGUpID8/IGhhbmRsZSkgOiBoYW5kbGVcbiAgfVxuXG4gIGNvbnN0IGVtaXRNb2R1bGVEZXNjcmlwdG9yT25jZSA9IChcbiAgICBtb2R1bGU6IHtcbiAgICAgIHJlYWRvbmx5IGlkOiBzdHJpbmdcbiAgICAgIHJlYWRvbmx5IHRhZzogYW55XG4gICAgICByZWFkb25seSBzY2hlbWFzPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj5cbiAgICAgIHJlYWRvbmx5IG1ldGE/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuICAgICAgcmVhZG9ubHkgZGV2PzogeyByZWFkb25seSBzb3VyY2U/OiB7IHJlYWRvbmx5IGZpbGU6IHN0cmluZzsgcmVhZG9ubHkgbGluZTogbnVtYmVyOyByZWFkb25seSBjb2x1bW46IG51bWJlciB9IH1cbiAgICB9LFxuICAgIHJ0OiBMb2dpeC5Nb2R1bGVSdW50aW1lPGFueSwgYW55PixcbiAgKTogRWZmZWN0LkVmZmVjdDx2b2lkLCBuZXZlciwgYW55PiA9PlxuICAgIEVmZmVjdC5nZW4oZnVuY3Rpb24qICgpIHtcbiAgICAgIC8vIFx1NEUzQSBob3QtcGF0aCBcdTUxNUNcdTVFOTVcdUZGMUFcdThCQ0FcdTY1QURcdTdFQTdcdTUyMkJcdTRFM0Egb2ZmIFx1NjVGNlx1NkMzOFx1NEUwRFx1NTNEMVx1NEU4Qlx1NEVGNlx1MzAwMlxuICAgICAgaWYgKGNhY2hlZERpYWdub3N0aWNzTGV2ZWwgPT09IFwib2ZmXCIpIHJldHVyblxuXG4gICAgICBjb25zdCBrZXkgPSBgbW9kdWxlX2Rlc2NyaXB0b3I6JHtTdHJpbmcocnQuaW5zdGFuY2VJZCA/PyBcInVua25vd25cIil9YFxuICAgICAgY29uc3Qgc2hvdWxkRW1pdCA9IHlpZWxkKiBvbmNlSW5SdW5TZXNzaW9uKGtleSlcbiAgICAgIGlmICghc2hvdWxkRW1pdCkgcmV0dXJuXG5cbiAgICAgIGNvbnN0IGFjdGlvbktleXMgPSBPYmplY3Qua2V5cygobW9kdWxlLnRhZyBhcyBhbnkpPy5zaGFwZT8uYWN0aW9uTWFwID8/IHt9KVxuXG4gICAgICBjb25zdCBpbnRlcm5hbFN5bWJvbCA9IFN5bWJvbC5mb3IoXCJsb2dpeC5tb2R1bGUuaW50ZXJuYWxcIilcbiAgICAgIGNvbnN0IGludGVybmFsID0gKG1vZHVsZSBhcyBhbnkpW2ludGVybmFsU3ltYm9sXSBhc1xuICAgICAgICB8IHsgcmVhZG9ubHkgbW91bnRlZD86IFJlYWRvbmx5QXJyYXk8YW55PiB9XG4gICAgICAgIHwgdW5kZWZpbmVkXG5cbiAgICAgIGNvbnN0IGxvZ2ljVW5pdHMgPSAoaW50ZXJuYWw/Lm1vdW50ZWQgPz8gW10pLm1hcCgodTogYW55KSA9PiAoe1xuICAgICAgICBraW5kOiBTdHJpbmcodT8ua2luZCA/PyBcInVzZXJcIiksXG4gICAgICAgIGlkOiBTdHJpbmcodT8uaWQgPz8gXCJcIiksXG4gICAgICAgIGRlcml2ZWQ6IHU/LmRlcml2ZWQgPyB0cnVlIDogdW5kZWZpbmVkLFxuICAgICAgICBuYW1lOiB0eXBlb2YgdT8ubmFtZSA9PT0gXCJzdHJpbmdcIiA/IHUubmFtZSA6IHVuZGVmaW5lZCxcbiAgICAgIH0pKVxuXG4gICAgICBjb25zdCBzY2hlbWFLZXlzID1cbiAgICAgICAgbW9kdWxlLnNjaGVtYXMgJiYgdHlwZW9mIG1vZHVsZS5zY2hlbWFzID09PSBcIm9iamVjdFwiXG4gICAgICAgICAgPyBPYmplY3Qua2V5cyhtb2R1bGUuc2NoZW1hcylcbiAgICAgICAgICA6IHVuZGVmaW5lZFxuXG4gICAgICBjb25zdCBtZXRhID1cbiAgICAgICAgbW9kdWxlLm1ldGEgJiYgdHlwZW9mIG1vZHVsZS5tZXRhID09PSBcIm9iamVjdFwiID8gbW9kdWxlLm1ldGEgOiB1bmRlZmluZWRcblxuICAgICAgY29uc3Qgc291cmNlID0gbW9kdWxlLmRldj8uc291cmNlXG5cbiAgICAgIGNvbnN0IHRyYWl0c1NuYXBzaG90ID0gcnVudGltZUludGVybmFscy50cmFpdHMuZ2V0TW9kdWxlVHJhaXRzU25hcHNob3QoKVxuICAgICAgY29uc3QgdHJhaXRzID1cbiAgICAgICAgdHJhaXRzU25hcHNob3RcbiAgICAgICAgICA/IHtcbiAgICAgICAgICAgICAgZGlnZXN0OiB0cmFpdHNTbmFwc2hvdC5kaWdlc3QsXG4gICAgICAgICAgICAgIGNvdW50OiB0cmFpdHNTbmFwc2hvdC50cmFpdHMubGVuZ3RoLFxuICAgICAgICAgICAgfVxuICAgICAgICAgIDogdW5kZWZpbmVkXG5cbiAgICAgIGNvbnN0IGRhdGEgPSB7XG4gICAgICAgIGlkOiBtb2R1bGUuaWQsXG4gICAgICAgIG1vZHVsZUlkOiBTdHJpbmcocnQubW9kdWxlSWQpLFxuICAgICAgICBpbnN0YW5jZUlkOiBTdHJpbmcocnQuaW5zdGFuY2VJZCksXG4gICAgICAgIGFjdGlvbktleXMsXG4gICAgICAgIGxvZ2ljVW5pdHMsXG4gICAgICAgIHNjaGVtYUtleXMsXG4gICAgICAgIG1ldGEsXG4gICAgICAgIHNvdXJjZSxcbiAgICAgICAgdHJhaXRzLFxuICAgICAgfVxuXG4gICAgICB5aWVsZCogRGVidWcucmVjb3JkKHtcbiAgICAgICAgdHlwZTogXCJ0cmFjZTptb2R1bGU6ZGVzY3JpcHRvclwiLFxuICAgICAgICBtb2R1bGVJZDogcnQubW9kdWxlSWQsXG4gICAgICAgIGluc3RhbmNlSWQ6IHJ0Lmluc3RhbmNlSWQsXG4gICAgICAgIGRhdGEsXG4gICAgICB9IGFzIGFueSlcbiAgICB9KVxuXG4gIC8qKlxuICAgKiBzdHJpY3RcdUZGMUFcdTUzRUFcdTRFQ0VcdTIwMUNcdTVGNTNcdTUyNEQgRWZmZWN0IEVudlx1MjAxRFx1ODlFM1x1Njc5MFx1NjdEMFx1NEUyQSBNb2R1bGUgXHU3Njg0IFJ1bnRpbWVcdTMwMDJcbiAgICpcbiAgICogXHU4QkY0XHU2NjBFXHVGRjFBXG4gICAqIC0gXHU1OTFBIHJvb3QgLyBcdTU5MUFcdTVCOUVcdTRGOEJcdTU3M0FcdTY2NkZcdTRFMEJcdUZGMENcdTRFRkJcdTRGNTVcdThGREJcdTdBMEJcdTdFQTcgcmVnaXN0cnkgXHU5MEZEXHU2NUUwXHU2Q0Q1XHU4ODY4XHU4RkJFXHU2QjYzXHU3ODZFXHU4QkVEXHU0RTQ5XHVGRjFCXG4gICAqIC0gXHU3RjNBXHU1OTMxXHU2M0QwXHU0RjlCXHU4MDA1XHU1QzVFXHU0RThFXHU4OEM1XHU5MTREXHU5NTE5XHU4QkVGXHVGRjFBXHU1RkM1XHU5ODdCXHU3QTMzXHU1QjlBXHU1OTMxXHU4RDI1XHVGRjBDXHU1RTc2XHU3RUQ5XHU1MUZBXHU1M0VGXHU0RkVFXHU1OTBEXHU3Njg0XHU2M0QwXHU3OTNBXHVGRjA4ZGV2L3Rlc3QgXHU0RTBCXHU2NkY0XHU4QkU2XHU3RUM2XHVGRjA5XHUzMDAyXG4gICAqL1xuXHQgIGNvbnN0IHJlc29sdmVNb2R1bGVSdW50aW1lID0gKFxuXHQgICAgdGFnOiBDb250ZXh0LlRhZzxhbnksIExvZ2l4Lk1vZHVsZVJ1bnRpbWU8YW55LCBhbnk+PlxuXHQgICk6IEVmZmVjdC5FZmZlY3Q8TG9naXguTW9kdWxlUnVudGltZTxhbnksIGFueT4sIG5ldmVyLCBhbnk+ID0+XG5cdCAgICBFZmZlY3QuZ2VuKGZ1bmN0aW9uKiAoKSB7XG5cdCAgICAgIGNvbnN0IHJlcXVlc3RlZE1vZHVsZUlkID1cblx0ICAgICAgICB0eXBlb2YgKHRhZyBhcyBhbnkpPy5pZCA9PT0gXCJzdHJpbmdcIlxuXHQgICAgICAgICAgPyAoKHRhZyBhcyBhbnkpLmlkIGFzIHN0cmluZylcblx0ICAgICAgICAgIDogdW5kZWZpbmVkXG5cdCAgICAgIGNvbnN0IGZyb21Nb2R1bGVJZCA9XG5cdCAgICAgICAgdHlwZW9mIG9wdGlvbnM/Lm1vZHVsZUlkID09PSBcInN0cmluZ1wiID8gb3B0aW9ucy5tb2R1bGVJZCA6IHJ1bnRpbWUubW9kdWxlSWRcblxuXHQgICAgICAvLyBzZWxmXHVGRjFBXHU1OUNCXHU3RUM4XHU1MTQxXHU4QkI4XHU4OUUzXHU2NzkwXHU1MjMwXHU1RjUzXHU1MjREIE1vZHVsZVJ1bnRpbWVcdUZGMDhCb3VuZC5tYWtlIC8gcnVudGltZSBcdTZDRThcdTUxNjVcdTRFMjRcdTY3NjFcdThERUZcdTVGODRcdTkwRkRcdTYyMTBcdTdBQ0JcdUZGMDlcblx0ICAgICAgaWYgKHJlcXVlc3RlZE1vZHVsZUlkICYmIHJlcXVlc3RlZE1vZHVsZUlkID09PSBydW50aW1lLm1vZHVsZUlkKSB7XG5cdCAgICAgICAgcmV0dXJuIHJ1bnRpbWUgYXMgdW5rbm93biBhcyBMb2dpeC5Nb2R1bGVSdW50aW1lPGFueSwgYW55PlxuXHQgICAgICB9XG5cblx0ICAgICAgY29uc3QgZnJvbUltcG9ydHMgPSBydW50aW1lSW50ZXJuYWxzLmltcG9ydHMuZ2V0KFxuXHQgICAgICAgIHRhZyBhcyB1bmtub3duIGFzIENvbnRleHQuVGFnPGFueSwgYW55Pixcblx0ICAgICAgKVxuXHQgICAgICBpZiAoZnJvbUltcG9ydHMpIHtcblx0ICAgICAgICByZXR1cm4gZnJvbUltcG9ydHMgYXMgdW5rbm93biBhcyBMb2dpeC5Nb2R1bGVSdW50aW1lPGFueSwgYW55PlxuXHQgICAgICB9XG5cblx0ICAgICAgLy8gQm91bmQubWFrZVx1RkYwOFx1NjVFMCBtb2R1bGVJZCBcdTRFMEFcdTRFMEJcdTY1ODdcdUZGMDlcdTU3M0FcdTY2NkZcdUZGMUFcdTUxNDFcdThCQjhcdTRFQ0VcdTVGNTNcdTUyNEQgRWZmZWN0IEVudiBcdTg5RTNcdTY3OTAgbW9kdWxlIHJ1bnRpbWVcdUZGMDhcdTRGQkZcdTRFOEVcdTZENEJcdThCRDUvXHU4MTFBXHU2MjRCXHU2N0I2XHVGRjA5XHUzMDAyXG5cdCAgICAgIGlmICh0eXBlb2Ygb3B0aW9ucz8ubW9kdWxlSWQgIT09IFwic3RyaW5nXCIpIHtcblx0ICAgICAgICBjb25zdCBmcm9tRW52ID0geWllbGQqIEVmZmVjdC5zZXJ2aWNlT3B0aW9uKHRhZyBhcyBhbnkpXG5cdCAgICAgICAgaWYgKE9wdGlvbi5pc1NvbWUoZnJvbUVudikpIHtcblx0ICAgICAgICAgIHJldHVybiBmcm9tRW52LnZhbHVlIGFzIHVua25vd24gYXMgTG9naXguTW9kdWxlUnVudGltZTxhbnksIGFueT5cblx0ICAgICAgICB9XG5cdCAgICAgIH1cblxuXHQgICAgICAvLyAyKSBcdTY1RTBcdTZDRDVcdTYyN0VcdTUyMzBcdTY1RjZcdTc2RjRcdTYzQTUgZGllIFx1MjAxNFx1MjAxNCBcdThGRDlcdTY2MkZcdTkxNERcdTdGNkVcdTk1MTlcdThCRUZcdUZGMENcdTYzRDBcdTc5M0FcdThDMDNcdTc1MjhcdTY1QjlcdTRGRUVcdTZCNjNcdTg4QzVcdTkxNERcdTY1QjlcdTVGMEZcblx0ICAgICAgY29uc3QgdG9rZW5JZCA9IHJlcXVlc3RlZE1vZHVsZUlkID8/IFwiPHVua25vd24gbW9kdWxlIGlkPlwiXG4gICAgICBjb25zdCBmaXg6IHN0cmluZ1tdID0gaXNEZXZFbnYoKVxuICAgICAgICA/IFtcbiAgICAgICAgICAgIFwiLSBQcm92aWRlIHRoZSBjaGlsZCBpbXBsZW1lbnRhdGlvbiBpbiB0aGUgc2FtZSBzY29wZSAoaW1wb3J0cykuXCIsXG4gICAgICAgICAgICBgICBFeGFtcGxlOiAke2Zyb21Nb2R1bGVJZCA/PyBcIlBhcmVudE1vZHVsZVwifS5pbXBsZW1lbnQoeyBpbXBvcnRzOiBbJHtyZXF1ZXN0ZWRNb2R1bGVJZCA/PyBcIkNoaWxkTW9kdWxlXCJ9LmltcGxdLCAuLi4gfSlgLFxuICAgICAgICAgICAgXCItIElmIHlvdSBpbnRlbnRpb25hbGx5IHdhbnQgYSByb290IHNpbmdsZXRvbiwgcHJvdmlkZSBpdCBhdCBhcHAgcm9vdCAoUnVudGltZS5tYWtlKC4uLix7IGxheWVyIH0pIC8gcm9vdCBpbXBvcnRzKSxcIixcbiAgICAgICAgICAgIFwiICBhbmQgdXNlIFJvb3QucmVzb2x2ZShNb2R1bGVUYWcpIChpbnN0ZWFkIG9mICQudXNlKSBhdCB0aGUgY2FsbHNpdGUuXCIsXG4gICAgICAgICAgXVxuICAgICAgICA6IFtdXG5cbiAgICAgIGNvbnN0IGVyciA9IG5ldyBFcnJvcihcbiAgICAgICAgaXNEZXZFbnYoKVxuICAgICAgICAgID8gW1xuICAgICAgICAgICAgICBcIltNaXNzaW5nTW9kdWxlUnVudGltZUVycm9yXSBDYW5ub3QgcmVzb2x2ZSBNb2R1bGVSdW50aW1lIGZvciBNb2R1bGVUYWcuXCIsXG4gICAgICAgICAgICAgIFwiXCIsXG4gICAgICAgICAgICAgIGB0b2tlbklkOiAke3Rva2VuSWR9YCxcbiAgICAgICAgICAgICAgXCJlbnRyeXBvaW50OiBsb2dpYy4kLnVzZVwiLFxuICAgICAgICAgICAgICBcIm1vZGU6IHN0cmljdFwiLFxuICAgICAgICAgICAgICBgZnJvbTogJHtmcm9tTW9kdWxlSWQgPz8gXCI8dW5rbm93biBtb2R1bGUgaWQ+XCJ9YCxcbiAgICAgICAgICAgICAgYHN0YXJ0U2NvcGU6IG1vZHVsZUlkPSR7ZnJvbU1vZHVsZUlkID8/IFwiPHVua25vd24+XCJ9LCBpbnN0YW5jZUlkPSR7U3RyaW5nKHJ1bnRpbWUuaW5zdGFuY2VJZCA/PyBcIjx1bmtub3duPlwiKX1gLFxuICAgICAgICAgICAgICBcIlwiLFxuICAgICAgICAgICAgICBcImZpeDpcIixcbiAgICAgICAgICAgICAgLi4uZml4LFxuICAgICAgICAgICAgXS5qb2luKFwiXFxuXCIpXG4gICAgICAgICAgOiBcIltNaXNzaW5nTW9kdWxlUnVudGltZUVycm9yXSBtb2R1bGUgcnVudGltZSBub3QgZm91bmRcIixcbiAgICAgIClcblxuICAgICAgOyhlcnIgYXMgYW55KS50b2tlbklkID0gdG9rZW5JZFxuICAgICAgOyhlcnIgYXMgYW55KS5lbnRyeXBvaW50ID0gXCJsb2dpYy4kLnVzZVwiXG4gICAgICA7KGVyciBhcyBhbnkpLm1vZGUgPSBcInN0cmljdFwiXG4gICAgICA7KGVyciBhcyBhbnkpLmZyb20gPSBmcm9tTW9kdWxlSWRcbiAgICAgIDsoZXJyIGFzIGFueSkuc3RhcnRTY29wZSA9IHtcbiAgICAgICAgbW9kdWxlSWQ6IGZyb21Nb2R1bGVJZCxcbiAgICAgICAgaW5zdGFuY2VJZDogU3RyaW5nKHJ1bnRpbWUuaW5zdGFuY2VJZCA/PyBcIjx1bmtub3duPlwiKSxcbiAgICAgIH1cbiAgICAgIDsoZXJyIGFzIGFueSkuZml4ID0gZml4XG5cbiAgICAgIGVyci5uYW1lID0gXCJNaXNzaW5nTW9kdWxlUnVudGltZUVycm9yXCJcbiAgICAgIHJldHVybiB5aWVsZCogRWZmZWN0LmRpZShlcnIpXG4gICAgfSlcblxuICBjb25zdCBzdGF0ZUFwaTogQm91bmRBcGk8U2gsIFI+W1wic3RhdGVcIl0gPSB7XG4gICAgcmVhZDogcnVudGltZS5nZXRTdGF0ZSxcbiAgICB1cGRhdGU6IChmKSA9PlxuICAgICAgRWZmZWN0LmdlbihmdW5jdGlvbiogKCkge1xuICAgICAgICBjb25zdCBpblR4biA9IHlpZWxkKiBGaWJlclJlZi5nZXQoVGFza1J1bm5lci5pblN5bmNUcmFuc2FjdGlvbkZpYmVyKVxuICAgICAgICBpZiAoaW5UeG4pIHtcbiAgICAgICAgICBjb25zdCBwcmV2ID0geWllbGQqIHJ1bnRpbWUuZ2V0U3RhdGVcbiAgICAgICAgICByZXR1cm4geWllbGQqIHJ1bnRpbWUuc2V0U3RhdGUoZihwcmV2KSlcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGJvZHkgPSAoKSA9PlxuICAgICAgICAgIEVmZmVjdC5mbGF0TWFwKHJ1bnRpbWUuZ2V0U3RhdGUsIChwcmV2KSA9PiBydW50aW1lLnNldFN0YXRlKGYocHJldikpKVxuXG4gICAgICAgIHJldHVybiB5aWVsZCogKHJ1bnRpbWVJbnRlcm5hbHNcbiAgICAgICAgICA/IHJ1bnRpbWVJbnRlcm5hbHMudHhuLnJ1bldpdGhTdGF0ZVRyYW5zYWN0aW9uKFxuICAgICAgICAgICAgICB7IGtpbmQ6IFwic3RhdGVcIiwgbmFtZTogXCJ1cGRhdGVcIiB9IGFzIGFueSxcbiAgICAgICAgICAgICAgYm9keSxcbiAgICAgICAgICAgIClcbiAgICAgICAgICA6IGJvZHkoKSlcbiAgICAgIH0pLFxuICAgIG11dGF0ZTogKGYpID0+XG4gICAgICBFZmZlY3QuZ2VuKGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIGNvbnN0IHJlY29yZFBhdGNoID0gcnVudGltZUludGVybmFscz8udHhuLnJlY29yZFN0YXRlUGF0Y2hcblxuICAgICAgICBjb25zdCBpblR4biA9IHlpZWxkKiBGaWJlclJlZi5nZXQoVGFza1J1bm5lci5pblN5bmNUcmFuc2FjdGlvbkZpYmVyKVxuICAgICAgICBpZiAoaW5UeG4pIHtcbiAgICAgICAgICBjb25zdCBwcmV2ID0geWllbGQqIHJ1bnRpbWUuZ2V0U3RhdGVcbiAgICAgICAgICBjb25zdCB7IG5leHRTdGF0ZSwgcGF0Y2hQYXRocyB9ID0gbXV0YXRlV2l0aFBhdGNoUGF0aHMoXG4gICAgICAgICAgICBwcmV2IGFzIExvZ2l4LlN0YXRlT2Y8U2g+LFxuICAgICAgICAgICAgKGRyYWZ0KSA9PiB7XG4gICAgICAgICAgICAgIGYoZHJhZnQgYXMgTG9naWMuRHJhZnQ8TG9naXguU3RhdGVPZjxTaD4+KVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICApXG5cbiAgICAgICAgICBmb3IgKGNvbnN0IHBhdGggb2YgcGF0Y2hQYXRocykge1xuICAgICAgICAgICAgcmVjb3JkUGF0Y2g/Lih7XG4gICAgICAgICAgICAgIHBhdGgsXG4gICAgICAgICAgICAgIHJlYXNvbjogXCJzdGF0ZTptdXRhdGVcIixcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIHlpZWxkKiBydW50aW1lLnNldFN0YXRlKG5leHRTdGF0ZSlcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGJvZHkgPSAoKSA9PlxuICAgICAgICAgIEVmZmVjdC5mbGF0TWFwKHJ1bnRpbWUuZ2V0U3RhdGUsIChwcmV2KSA9PiB7XG4gICAgICAgICAgICBjb25zdCB7IG5leHRTdGF0ZSwgcGF0Y2hQYXRocyB9ID0gbXV0YXRlV2l0aFBhdGNoUGF0aHMoXG4gICAgICAgICAgICAgIHByZXYgYXMgTG9naXguU3RhdGVPZjxTaD4sXG4gICAgICAgICAgICAgIChkcmFmdCkgPT4ge1xuICAgICAgICAgICAgICAgIGYoZHJhZnQgYXMgTG9naWMuRHJhZnQ8TG9naXguU3RhdGVPZjxTaD4+KVxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgKVxuXG4gICAgICAgICAgICBmb3IgKGNvbnN0IHBhdGggb2YgcGF0Y2hQYXRocykge1xuICAgICAgICAgICAgICByZWNvcmRQYXRjaD8uKHtcbiAgICAgICAgICAgICAgICBwYXRoLFxuICAgICAgICAgICAgICAgIHJlYXNvbjogXCJzdGF0ZTptdXRhdGVcIixcbiAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIHJ1bnRpbWUuc2V0U3RhdGUobmV4dFN0YXRlKVxuICAgICAgICAgIH0pXG5cbiAgICAgICAgcmV0dXJuIHlpZWxkKiAocnVudGltZUludGVybmFsc1xuICAgICAgICAgID8gcnVudGltZUludGVybmFscy50eG4ucnVuV2l0aFN0YXRlVHJhbnNhY3Rpb24oXG4gICAgICAgICAgICAgIHsga2luZDogXCJzdGF0ZVwiLCBuYW1lOiBcIm11dGF0ZVwiIH0gYXMgYW55LFxuICAgICAgICAgICAgICBib2R5LFxuICAgICAgICAgICAgKVxuICAgICAgICAgIDogYm9keSgpKVxuICAgICAgfSksXG4gICAgcmVmOiBydW50aW1lLnJlZixcbiAgfVxuXG4gIGNvbnN0IGFjdGlvbnNBcGkgPSBuZXcgUHJveHkoe30gYXMgQm91bmRBcGk8U2gsIFI+W1wiYWN0aW9uc1wiXSwge1xuICAgIGdldDogKF90YXJnZXQsIHByb3ApID0+IHtcbiAgICAgIGlmIChwcm9wID09PSBcImRpc3BhdGNoXCIpIHtcbiAgICAgICAgcmV0dXJuIChhOiBMb2dpeC5BY3Rpb25PZjxTaD4pID0+IHJ1bnRpbWUuZGlzcGF0Y2goYSlcbiAgICAgIH1cbiAgICAgIGlmIChwcm9wID09PSBcImFjdGlvbnMkXCIpIHtcbiAgICAgICAgcmV0dXJuIHJ1bnRpbWUuYWN0aW9ucyRcbiAgICAgIH1cbiAgICAgIHJldHVybiAocGF5bG9hZDogYW55KSA9PlxuICAgICAgICBydW50aW1lLmRpc3BhdGNoKHsgX3RhZzogcHJvcCBhcyBzdHJpbmcsIHBheWxvYWQgfSBhcyBMb2dpeC5BY3Rpb25PZjxTaD4pXG4gICAgfSxcbiAgfSlcblxuICBjb25zdCBtYXRjaEFwaSA9IDxWPih2YWx1ZTogVik6IExvZ2ljLkZsdWVudE1hdGNoPFY+ID0+XG4gICAgTWF0Y2hCdWlsZGVyLm1ha2VNYXRjaCh2YWx1ZSlcblxuICBjb25zdCBtYXRjaFRhZ0FwaSA9IDxWIGV4dGVuZHMgeyBfdGFnOiBzdHJpbmcgfT4oXG4gICAgdmFsdWU6IFZcbiAgKTogTG9naWMuRmx1ZW50TWF0Y2hUYWc8Vj4gPT4gTWF0Y2hCdWlsZGVyLm1ha2VNYXRjaFRhZyh2YWx1ZSlcblxuICAvLyBQcmltYXJ5IFJlZHVjZXIgXHU2Q0U4XHU1MThDXHVGRjFBXHU5MDFBXHU4RkM3IHJ1bnRpbWUgXHU0RTBBXHU3Njg0XHU1MTg1XHU5MEU4XHU2Q0U4XHU1MThDXHU1MUZEXHU2NTcwXHVGRjA4XHU4MkU1XHU1QjU4XHU1NzI4XHVGRjA5XHU1MTk5XHU1MTY1IHJlZHVjZXIgXHU2NjIwXHU1QzA0XHUzMDAyXG4gIGNvbnN0IHJlZHVjZXI6IEJvdW5kQXBpPFNoLCBSPltcInJlZHVjZXJcIl0gPSAodGFnLCBmbikgPT4ge1xuICAgIHJldHVybiBFZmZlY3Quc3luYygoKSA9PiB7XG4gICAgICBydW50aW1lSW50ZXJuYWxzLnR4bi5yZWdpc3RlclJlZHVjZXIoU3RyaW5nKHRhZyksIGZuIGFzIGFueSlcbiAgICB9KSBhcyBhbnlcbiAgfVxuXG4gIGNvbnN0IGFwaTogQm91bmRBcGk8U2gsIFI+ID0ge1xuICAgIHJvb3Q6IHtcbiAgICAgIHJlc29sdmU6ICh0YWc6IGFueSkgPT4ge1xuICAgICAgICBndWFyZFJ1bk9ubHkoXCJyb290X3Jlc29sdmVfaW5fc2V0dXBcIiwgXCIkLnJvb3QucmVzb2x2ZVwiKVxuICAgICAgICByZXR1cm4gUm9vdC5yZXNvbHZlKHRhZywge1xuICAgICAgICAgIGVudHJ5cG9pbnQ6IFwibG9naWMuJC5yb290LnJlc29sdmVcIixcbiAgICAgICAgICB3YWl0Rm9yUmVhZHk6IHRydWUsXG4gICAgICAgIH0pIGFzIGFueVxuICAgICAgfSxcbiAgICB9LFxuICAgIHN0YXRlOiBzdGF0ZUFwaSxcbiAgICBhY3Rpb25zOiBhY3Rpb25zQXBpLFxuICAgIGZsb3c6IGZsb3dBcGksXG4gICAgbWF0Y2g6IG1hdGNoQXBpLFxuICAgIG1hdGNoVGFnOiBtYXRjaFRhZ0FwaSxcbiAgICBsaWZlY3ljbGU6IHtcbiAgICAgIG9uSW5pdFJlcXVpcmVkOiAoZWZmOiBMb2dpYy5PZjxTaCwgUiwgdm9pZCwgbmV2ZXI+KSA9PiB7XG4gICAgICAgIGlmIChnZXRDdXJyZW50UGhhc2UoKSA9PT0gXCJydW5cIikge1xuICAgICAgICAgIHJldHVybiBlbWl0U2V0dXBPbmx5VmlvbGF0aW9uKFwiJC5saWZlY3ljbGUub25Jbml0UmVxdWlyZWRcIikgYXMgYW55XG4gICAgICAgIH1cbiAgICAgICAgcnVudGltZUludGVybmFscy5saWZlY3ljbGUucmVnaXN0ZXJJbml0UmVxdWlyZWQoZWZmIGFzIGFueSlcbiAgICAgICAgcmV0dXJuIEVmZmVjdC52b2lkIGFzIGFueVxuICAgICAgfSxcbiAgICAgIG9uU3RhcnQ6IChlZmY6IExvZ2ljLk9mPFNoLCBSLCB2b2lkLCBuZXZlcj4pID0+IHtcbiAgICAgICAgaWYgKGdldEN1cnJlbnRQaGFzZSgpID09PSBcInJ1blwiKSB7XG4gICAgICAgICAgcmV0dXJuIGVtaXRTZXR1cE9ubHlWaW9sYXRpb24oXCIkLmxpZmVjeWNsZS5vblN0YXJ0XCIpIGFzIGFueVxuICAgICAgICB9XG4gICAgICAgIHJ1bnRpbWVJbnRlcm5hbHMubGlmZWN5Y2xlLnJlZ2lzdGVyU3RhcnQoZWZmIGFzIGFueSlcbiAgICAgICAgcmV0dXJuIEVmZmVjdC52b2lkIGFzIGFueVxuICAgICAgfSxcbiAgICAgIG9uSW5pdDogKGVmZjogTG9naWMuT2Y8U2gsIFIsIHZvaWQsIG5ldmVyPikgPT4ge1xuICAgICAgICAvLyBsZWdhY3kgYWxpYXNcdUZGMUFcdThCRURcdTRFNDlcdTdCNDlcdTU0MENcdTRFOEUgb25Jbml0UmVxdWlyZWRcdUZGMDhcdTRFM0FcdTRFODZcdThGQzFcdTc5RkJcdTY3MUZcdTUxQ0ZcdTVDMTFcdTY0NjlcdTY0RTZcdUZGMDlcdTMwMDJcbiAgICAgICAgaWYgKGdldEN1cnJlbnRQaGFzZSgpID09PSBcInJ1blwiKSB7XG4gICAgICAgICAgcmV0dXJuIGVtaXRTZXR1cE9ubHlWaW9sYXRpb24oXCIkLmxpZmVjeWNsZS5vbkluaXRcIikgYXMgYW55XG4gICAgICAgIH1cbiAgICAgICAgcnVudGltZUludGVybmFscy5saWZlY3ljbGUucmVnaXN0ZXJJbml0UmVxdWlyZWQoZWZmIGFzIGFueSlcbiAgICAgICAgcmV0dXJuIEVmZmVjdC52b2lkIGFzIGFueVxuICAgICAgfSxcbiAgICAgIG9uRGVzdHJveTogKGVmZjogTG9naWMuT2Y8U2gsIFIsIHZvaWQsIG5ldmVyPikgPT4ge1xuICAgICAgICBpZiAoZ2V0Q3VycmVudFBoYXNlKCkgPT09IFwicnVuXCIpIHtcbiAgICAgICAgICByZXR1cm4gZW1pdFNldHVwT25seVZpb2xhdGlvbihcIiQubGlmZWN5Y2xlLm9uRGVzdHJveVwiKSBhcyBhbnlcbiAgICAgICAgfVxuICAgICAgICBydW50aW1lSW50ZXJuYWxzLmxpZmVjeWNsZS5yZWdpc3RlckRlc3Ryb3koZWZmIGFzIGFueSlcbiAgICAgICAgcmV0dXJuIEVmZmVjdC52b2lkIGFzIGFueVxuICAgICAgfSxcbiAgICAgIG9uRXJyb3I6IChcbiAgICAgICAgaGFuZGxlcjogKFxuICAgICAgICAgIGNhdXNlOiBpbXBvcnQoXCJlZmZlY3RcIikuQ2F1c2UuQ2F1c2U8dW5rbm93bj4sXG4gICAgICAgICAgY29udGV4dDogTGlmZWN5Y2xlLkVycm9yQ29udGV4dCxcbiAgICAgICAgKSA9PiBFZmZlY3QuRWZmZWN0PHZvaWQsIG5ldmVyLCBSPixcbiAgICAgICkgPT4ge1xuICAgICAgICBpZiAoZ2V0Q3VycmVudFBoYXNlKCkgPT09IFwicnVuXCIpIHtcbiAgICAgICAgICByZXR1cm4gZW1pdFNldHVwT25seVZpb2xhdGlvbihcIiQubGlmZWN5Y2xlLm9uRXJyb3JcIikgYXMgYW55XG4gICAgICAgIH1cbiAgICAgICAgcnVudGltZUludGVybmFscy5saWZlY3ljbGUucmVnaXN0ZXJPbkVycm9yKGhhbmRsZXIgYXMgYW55KVxuICAgICAgICByZXR1cm4gRWZmZWN0LnZvaWQgYXMgYW55XG4gICAgICB9LFxuICAgICAgb25TdXNwZW5kOiAoXG4gICAgICAgIGVmZjogTG9naWMuT2Y8U2gsIFIsIHZvaWQsIG5ldmVyPixcbiAgICAgICkgPT4ge1xuICAgICAgICBpZiAoZ2V0Q3VycmVudFBoYXNlKCkgPT09IFwicnVuXCIpIHtcbiAgICAgICAgICByZXR1cm4gZW1pdFNldHVwT25seVZpb2xhdGlvbihcIiQubGlmZWN5Y2xlLm9uU3VzcGVuZFwiKSBhcyBhbnlcbiAgICAgICAgfVxuICAgICAgICBydW50aW1lSW50ZXJuYWxzLmxpZmVjeWNsZS5yZWdpc3RlclBsYXRmb3JtU3VzcGVuZChcbiAgICAgICAgICBFZmZlY3QuYXNWb2lkKGVmZiBhcyBFZmZlY3QuRWZmZWN0PHZvaWQsIG5ldmVyLCBhbnk+KSxcbiAgICAgICAgKVxuICAgICAgICByZXR1cm4gRWZmZWN0LnZvaWQgYXMgYW55XG4gICAgICB9LFxuICAgICAgb25SZXN1bWU6IChcbiAgICAgICAgZWZmOiBMb2dpYy5PZjxTaCwgUiwgdm9pZCwgbmV2ZXI+LFxuICAgICAgKSA9PiB7XG4gICAgICAgIGlmIChnZXRDdXJyZW50UGhhc2UoKSA9PT0gXCJydW5cIikge1xuICAgICAgICAgIHJldHVybiBlbWl0U2V0dXBPbmx5VmlvbGF0aW9uKFwiJC5saWZlY3ljbGUub25SZXN1bWVcIikgYXMgYW55XG4gICAgICAgIH1cbiAgICAgICAgcnVudGltZUludGVybmFscy5saWZlY3ljbGUucmVnaXN0ZXJQbGF0Zm9ybVJlc3VtZShcbiAgICAgICAgICBFZmZlY3QuYXNWb2lkKGVmZiBhcyBFZmZlY3QuRWZmZWN0PHZvaWQsIG5ldmVyLCBhbnk+KSxcbiAgICAgICAgKVxuICAgICAgICByZXR1cm4gRWZmZWN0LnZvaWQgYXMgYW55XG4gICAgICB9LFxuICAgICAgb25SZXNldDogKFxuICAgICAgICBlZmY6IExvZ2ljLk9mPFNoLCBSLCB2b2lkLCBuZXZlcj4sXG4gICAgICApID0+IHtcbiAgICAgICAgaWYgKGdldEN1cnJlbnRQaGFzZSgpID09PSBcInJ1blwiKSB7XG4gICAgICAgICAgcmV0dXJuIGVtaXRTZXR1cE9ubHlWaW9sYXRpb24oXCIkLmxpZmVjeWNsZS5vblJlc2V0XCIpIGFzIGFueVxuICAgICAgICB9XG4gICAgICAgIHJ1bnRpbWVJbnRlcm5hbHMubGlmZWN5Y2xlLnJlZ2lzdGVyUGxhdGZvcm1SZXNldChcbiAgICAgICAgICBFZmZlY3QuYXNWb2lkKGVmZiBhcyBFZmZlY3QuRWZmZWN0PHZvaWQsIG5ldmVyLCBhbnk+KSxcbiAgICAgICAgKVxuICAgICAgICByZXR1cm4gRWZmZWN0LnZvaWQgYXMgYW55XG4gICAgICB9LFxuICAgIH0sXG4gICAgdHJhaXRzOiB7XG4gICAgICBkZWNsYXJlOiAodHJhaXRzOiBNb2R1bGVUcmFpdHMuVHJhaXRTcGVjKSA9PiB7XG4gICAgICAgIGlmIChnZXRDdXJyZW50UGhhc2UoKSA9PT0gXCJydW5cIikge1xuICAgICAgICAgIHRocm93IExvZ2ljRGlhZ25vc3RpY3MubWFrZUxvZ2ljUGhhc2VFcnJvcihcbiAgICAgICAgICAgIFwidHJhaXRzX2RlY2xhcmVfaW5fcnVuXCIsXG4gICAgICAgICAgICBcIiQudHJhaXRzLmRlY2xhcmVcIixcbiAgICAgICAgICAgIFwicnVuXCIsXG4gICAgICAgICAgICBvcHRpb25zPy5tb2R1bGVJZCxcbiAgICAgICAgICApXG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXRyYWl0cyB8fCB0eXBlb2YgdHJhaXRzICE9PSBcIm9iamVjdFwiKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgXCJbSW52YWxpZFRyYWl0c0RlY2xhcmF0aW9uXSAkLnRyYWl0cy5kZWNsYXJlIGV4cGVjdHMgYW4gb2JqZWN0LlwiLFxuICAgICAgICAgIClcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGxvZ2ljVW5pdCA9IG9wdGlvbnM/LmxvZ2ljVW5pdCA/PyB7XG4gICAgICAgICAgbG9naWNVbml0SWQ6IFwidW5rbm93blwiLFxuICAgICAgICAgIGxvZ2ljVW5pdElkS2luZDogXCJkZXJpdmVkXCIgYXMgY29uc3QsXG4gICAgICAgICAgbG9naWNVbml0TGFiZWw6IFwibG9naWNVbml0OnVua25vd25cIixcbiAgICAgICAgICBwYXRoOiB1bmRlZmluZWQgYXMgc3RyaW5nIHwgdW5kZWZpbmVkLFxuICAgICAgICB9XG5cbiAgICAgICAgcnVudGltZUludGVybmFscy50cmFpdHMucmVnaXN0ZXJNb2R1bGVUcmFpdHNDb250cmlidXRpb24oe1xuICAgICAgICAgIHRyYWl0cyxcbiAgICAgICAgICBwcm92ZW5hbmNlOiB7XG4gICAgICAgICAgICBvcmlnaW5UeXBlOiBcImxvZ2ljVW5pdFwiLFxuICAgICAgICAgICAgb3JpZ2luSWQ6IGxvZ2ljVW5pdC5sb2dpY1VuaXRJZCxcbiAgICAgICAgICAgIG9yaWdpbklkS2luZDogbG9naWNVbml0LmxvZ2ljVW5pdElkS2luZCxcbiAgICAgICAgICAgIG9yaWdpbkxhYmVsOiBsb2dpY1VuaXQubG9naWNVbml0TGFiZWwsXG4gICAgICAgICAgICBwYXRoOiBsb2dpY1VuaXQucGF0aCxcbiAgICAgICAgICB9LFxuICAgICAgICB9KVxuICAgICAgfSxcbiAgICAgIHNvdXJjZToge1xuICAgICAgICByZWZyZXNoOiAoZmllbGRQYXRoOiBzdHJpbmcpID0+XG4gICAgICAgICAgRWZmZWN0LmdlbihmdW5jdGlvbiogKCkge1xuICAgICAgICAgICAgY29uc3QgaGFuZGxlciA9IChydW50aW1lSW50ZXJuYWxzLnRyYWl0cy5nZXRTb3VyY2VSZWZyZXNoSGFuZGxlcihcbiAgICAgICAgICAgICAgZmllbGRQYXRoLFxuICAgICAgICAgICAgKSBhc1xuICAgICAgICAgICAgICB8ICgoc3RhdGU6IExvZ2l4LlN0YXRlT2Y8U2g+KSA9PiBFZmZlY3QuRWZmZWN0PHZvaWQsIG5ldmVyLCBhbnk+KVxuICAgICAgICAgICAgICB8IHVuZGVmaW5lZClcbiAgICAgICAgICAgIGlmICghaGFuZGxlcikge1xuICAgICAgICAgICAgICAvLyBcdTgyRTVcdTY3MkFcdTZDRThcdTUxOENcdTUyMzdcdTY1QjBcdTkwM0JcdThGOTFcdUZGMENcdTUyMTlcdTg5QzZcdTRFM0Egbm8tb3BcdUZGMENcdTkwN0ZcdTUxNERcdTU3MjhcdTY3MkFcdTYzMDIgU3RhdGVUcmFpdFByb2dyYW0gXHU2NUY2XHU2MjlCXHU5NTE5XHUzMDAyXG4gICAgICAgICAgICAgIHJldHVybiB5aWVsZCogRWZmZWN0LnZvaWRcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gXHU0RThCXHU1MkExXHU3QTk3XHU1M0UzXHU1MTg1XHU3OTgxXHU2QjYyXHU1MThEXHU4RDcwIGVucXVldWVUcmFuc2FjdGlvblx1RkYwOFx1NEYxQVx1NUJGQ1x1ODFGNFx1NkI3Qlx1OTUwMVx1RkYwOVx1RkYxQVxuICAgICAgICAgICAgLy8gLSBcdTc2RjRcdTYzQTVcdTU3MjhcdTVGNTNcdTUyNERcdTRFOEJcdTUyQTFcdTUxODVcdTYyNjdcdTg4NEMgaGFuZGxlclx1RkYwQ1x1NEY3Rlx1NTE3Nlx1OTAxQVx1OEZDNyBib3VuZC5zdGF0ZS5tdXRhdGUgXHU1MTk5XHU1MTY1IGRyYWZ0XHVGRjFCXG4gICAgICAgICAgICAvLyAtIFx1NzUzMVx1NTkxNlx1NUM0Mlx1NTQwQ1x1NEUwMFx1NEU4Qlx1NTJBMVx1N0E5N1x1NTNFM1x1OEQxRlx1OEQyMyBjb21taXQgKyBkZWJ1ZyBcdTgwNUFcdTU0MDhcdTMwMDJcbiAgICAgICAgICAgIGNvbnN0IGluVHhuID0geWllbGQqIEZpYmVyUmVmLmdldChUYXNrUnVubmVyLmluU3luY1RyYW5zYWN0aW9uRmliZXIpXG4gICAgICAgICAgICBpZiAoaW5UeG4pIHtcbiAgICAgICAgICAgICAgY29uc3Qgc3RhdGUgPSAoeWllbGQqIHJ1bnRpbWUuZ2V0U3RhdGUpIGFzIExvZ2l4LlN0YXRlT2Y8U2g+XG4gICAgICAgICAgICAgIHJldHVybiB5aWVsZCogaGFuZGxlcihzdGF0ZSlcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gXHU1QzA2XHU0RTAwXHU2QjIxIHNvdXJjZS1yZWZyZXNoIFx1ODlDNlx1NEUzQVx1NTM1NVx1NzJFQ1x1NzY4NFx1NEU4Qlx1NTJBMVx1NTE2NVx1NTNFM1x1MzAwMlxuICAgICAgICAgICAgcmV0dXJuIHlpZWxkKiBydW50aW1lSW50ZXJuYWxzLnR4bi5ydW5XaXRoU3RhdGVUcmFuc2FjdGlvbihcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGtpbmQ6IFwic291cmNlLXJlZnJlc2hcIixcbiAgICAgICAgICAgICAgICBuYW1lOiBmaWVsZFBhdGgsXG4gICAgICAgICAgICAgIH0gYXMgYW55LFxuICAgICAgICAgICAgICAoKSA9PlxuICAgICAgICAgICAgICAgIEVmZmVjdC5nZW4oZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IHN0YXRlID0gKHlpZWxkKiBydW50aW1lLmdldFN0YXRlKSBhcyBMb2dpeC5TdGF0ZU9mPFNoPlxuICAgICAgICAgICAgICAgICAgcmV0dXJuIHlpZWxkKiBoYW5kbGVyKHN0YXRlKVxuICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgKVxuICAgICAgICAgIH0pLFxuICAgICAgfSxcbiAgICB9LFxuICAgIHJlZHVjZXIsXG4gICAgdXNlOiBuZXcgUHJveHkoKCkgPT4ge30sIHtcbiAgICAgIGFwcGx5OiAoX3RhcmdldCwgX3RoaXNBcmcsIFthcmddKSA9PiB7XG4gICAgICAgIGd1YXJkUnVuT25seShcInVzZV9pbl9zZXR1cFwiLCBcIiQudXNlXCIpXG4gICAgICAgIGlmIChpc01vZHVsZUxpa2UoYXJnKSkge1xuICAgICAgICAgIGNvbnN0IGRvbWFpbiA9IGFyZ1xuICAgICAgICAgIGNvbnN0IHRhZyA9IGRvbWFpbi50YWcgYXMgdW5rbm93biBhcyBDb250ZXh0LlRhZzxcbiAgICAgICAgICAgIGFueSxcbiAgICAgICAgICAgIExvZ2l4Lk1vZHVsZVJ1bnRpbWU8YW55LCBhbnk+XG4gICAgICAgICAgPlxuXG4gICAgICAgICAgY29uc3QgcmVzb2x2ZUFuZEJ1aWxkID0gcmVzb2x2ZU1vZHVsZVJ1bnRpbWUodGFnKS5waXBlKFxuICAgICAgICAgICAgRWZmZWN0Lm1hcCgocnQpID0+IGJ1aWxkTW9kdWxlSGFuZGxlKHRhZywgcnQpKSxcbiAgICAgICAgICApXG5cbiAgICAgICAgICBjb25zdCByZXNvbHZlV2l0aERlc2NyaXB0b3IgPSByZXNvbHZlTW9kdWxlUnVudGltZSh0YWcpLnBpcGUoXG4gICAgICAgICAgICBFZmZlY3QudGFwKChydCkgPT4gZW1pdE1vZHVsZURlc2NyaXB0b3JPbmNlKGRvbWFpbiwgcnQpKSxcbiAgICAgICAgICAgIEVmZmVjdC5tYXAoKHJ0KSA9PiBidWlsZE1vZHVsZUhhbmRsZSh0YWcsIHJ0KSksXG4gICAgICAgICAgKVxuXG4gICAgICAgICAgY29uc3QgZGV0ZWN0QW5kU2VsZWN0ID0gRmliZXJSZWYuZ2V0KERlYnVnLmN1cnJlbnREaWFnbm9zdGljc0xldmVsKS5waXBlKFxuICAgICAgICAgICAgRWZmZWN0LnRhcCgobGV2ZWwpID0+IHtcbiAgICAgICAgICAgICAgY2FjaGVkRGlhZ25vc3RpY3NMZXZlbCA9IGxldmVsXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIEVmZmVjdC5mbGF0TWFwKChsZXZlbCkgPT5cbiAgICAgICAgICAgICAgbGV2ZWwgPT09IFwib2ZmXCIgPyByZXNvbHZlQW5kQnVpbGQgOiByZXNvbHZlV2l0aERlc2NyaXB0b3IsXG4gICAgICAgICAgICApLFxuICAgICAgICAgIClcblxuICAgICAgICAgIC8vIDAyMiBwZXJmIGdhdGVcdUZGMUFkaWFnbm9zdGljcyBvZmYgXHU2NUY2XHVGRjBDJC51c2UobW9kdWxlKSBcdTRFMEUgJC51c2UobW9kdWxlLnRhZykgXHU1RkM1XHU5ODdCXHU3QjQ5XHU0RUY3XHU0RTE0XHU5NkY2XHU5ODlEXHU1OTE2XHU1RjAwXHU5NTAwXHUzMDAyXG4gICAgICAgICAgLy8gXHU3RUE2XHU2NzVGXHVGRjFBRWZmZWN0IFx1NjYyRlx1NTAzQ1x1RkYwOFx1NTNFRlx1NTkwRFx1NzUyOFx1RkYwOVx1RkYxQlx1NTZFMFx1NkI2NFx1NUZDNVx1OTg3Qlx1NTcyOFx1NjI2N1x1ODg0Q1x1NjcxRlx1NTA1QVx1NEUwMFx1NkIyMVx1NjAyN1x1N0YxM1x1NUI1OFx1RkYwQ1x1ODAwQ1x1NEUwRFx1ODBGRFx1NTcyOFx1Njc4NFx1OTAyMFx1NjcxRlx1NTZGQVx1NUI5QVx1NTIwNlx1NjUyRlx1MzAwMlxuXHQgICAgICAgICAgcmV0dXJuIEVmZmVjdC5zdXNwZW5kKCgpID0+IHtcblx0ICAgICAgICAgICAgaWYgKGNhY2hlZERpYWdub3N0aWNzTGV2ZWwgPT09IFwib2ZmXCIpIHtcblx0ICAgICAgICAgICAgICByZXR1cm4gcmVzb2x2ZUFuZEJ1aWxkXG5cdCAgICAgICAgICAgIH1cblxuXHQgICAgICAgICAgICBpZiAoY2FjaGVkRGlhZ25vc3RpY3NMZXZlbCAhPT0gdW5kZWZpbmVkKSB7XG5cdCAgICAgICAgICAgICAgcmV0dXJuIHJlc29sdmVXaXRoRGVzY3JpcHRvclxuXHQgICAgICAgICAgICB9XG5cblx0ICAgICAgICAgICAgcmV0dXJuIGRldGVjdEFuZFNlbGVjdFxuXHQgICAgICAgICAgfSkgYXMgdW5rbm93biBhcyBMb2dpYy5PZjxTaCwgUiwgYW55LCBuZXZlcj5cblx0ICAgICAgICB9XG4gICAgICAgIGlmIChDb250ZXh0LmlzVGFnKGFyZykpIHtcbiAgICAgICAgICBjb25zdCBjYW5kaWRhdGUgPSBhcmcgYXMgeyBfa2luZD86IHVua25vd24gfVxuXG4gICAgICAgICAgLy8gTW9kdWxlXHVGRjFBXHU4RkQ0XHU1NkRFXHU1M0VBXHU4QkZCIE1vZHVsZUhhbmRsZSBcdTg5QzZcdTU2RkVcbiAgICAgICAgICBpZiAoY2FuZGlkYXRlLl9raW5kID09PSBcIk1vZHVsZVRhZ1wiKSB7XG4gICAgICAgICAgICByZXR1cm4gcmVzb2x2ZU1vZHVsZVJ1bnRpbWUoYXJnIGFzIGFueSkucGlwZShcbiAgICAgICAgICAgICAgRWZmZWN0Lm1hcCgocnQ6IExvZ2l4Lk1vZHVsZVJ1bnRpbWU8YW55LCBhbnk+KSA9PlxuICAgICAgICAgICAgICAgIGJ1aWxkTW9kdWxlSGFuZGxlKGFyZyBhcyBhbnksIHJ0KSxcbiAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICkgYXMgdW5rbm93biBhcyBMb2dpYy5PZjxTaCwgUiwgYW55LCBuZXZlcj5cbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBcdTY2NkVcdTkwMUEgU2VydmljZSBUYWdcdUZGMUFcdTc2RjRcdTYzQTVcdTRFQ0UgRW52IFx1ODNCN1x1NTNENiBTZXJ2aWNlXG4gICAgICAgICAgcmV0dXJuIGFyZyBhcyB1bmtub3duIGFzIExvZ2ljLk9mPFNoLCBSLCBhbnksIG5ldmVyPlxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBFZmZlY3QuZGllKFwiQm91bmRBcGkudXNlOiB1bnN1cHBvcnRlZCBhcmd1bWVudFwiKSBhcyB1bmtub3duIGFzIExvZ2ljLk9mPFxuICAgICAgICAgIFNoLFxuICAgICAgICAgIFIsXG4gICAgICAgICAgYW55LFxuICAgICAgICAgIG5ldmVyXG4gICAgICAgID5cbiAgICAgIH0sXG4gICAgfSkgYXMgdW5rbm93biBhcyBCb3VuZEFwaTxTaCwgUj5bXCJ1c2VcIl0sXG4gICAgb25BY3Rpb246IG5ldyBQcm94eSgoKSA9PiB7fSwge1xuICAgICAgYXBwbHk6IChfdGFyZ2V0LCBfdGhpc0FyZywgYXJncykgPT4ge1xuICAgICAgICBndWFyZFJ1bk9ubHkoXCJ1c2VfaW5fc2V0dXBcIiwgXCIkLm9uQWN0aW9uXCIpXG4gICAgICAgIGNvbnN0IGFyZyA9IGFyZ3NbMF1cbiAgICAgICAgaWYgKHR5cGVvZiBhcmcgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgIHJldHVybiBjcmVhdGVJbnRlbnRCdWlsZGVyKFxuICAgICAgICAgICAgcnVudGltZS5hY3Rpb25zJC5waXBlKFN0cmVhbS5maWx0ZXIoYXJnKSlcbiAgICAgICAgICApXG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBhcmcgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICByZXR1cm4gY3JlYXRlSW50ZW50QnVpbGRlcihcbiAgICAgICAgICAgIHJ1bnRpbWUuYWN0aW9ucyQucGlwZShcbiAgICAgICAgICAgICAgU3RyZWFtLmZpbHRlcigoYTogYW55KSA9PiBhLl90YWcgPT09IGFyZyB8fCBhLnR5cGUgPT09IGFyZylcbiAgICAgICAgICAgICksXG4gICAgICAgICAgICBhcmcsXG4gICAgICAgICAgKVxuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgYXJnID09PSBcIm9iamVjdFwiICYmIGFyZyAhPT0gbnVsbCkge1xuICAgICAgICAgIGlmIChcIl90YWdcIiBpbiBhcmcpIHtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVJbnRlbnRCdWlsZGVyKFxuICAgICAgICAgICAgICBydW50aW1lLmFjdGlvbnMkLnBpcGUoXG4gICAgICAgICAgICAgICAgU3RyZWFtLmZpbHRlcigoYTogYW55KSA9PiBhLl90YWcgPT09IChhcmcgYXMgYW55KS5fdGFnKVxuICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICBTdHJpbmcoKGFyZyBhcyBhbnkpLl90YWcpLFxuICAgICAgICAgICAgKVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoU2NoZW1hLmlzU2NoZW1hKGFyZykpIHtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVJbnRlbnRCdWlsZGVyKFxuICAgICAgICAgICAgICBydW50aW1lLmFjdGlvbnMkLnBpcGUoXG4gICAgICAgICAgICAgICAgU3RyZWFtLmZpbHRlcigoYTogYW55KSA9PiB7XG4gICAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSBTY2hlbWEuZGVjb2RlVW5rbm93blN5bmMoXG4gICAgICAgICAgICAgICAgICAgIGFyZyBhcyBTY2hlbWEuU2NoZW1hPGFueSwgYW55LCBuZXZlcj5cbiAgICAgICAgICAgICAgICAgICkoYSlcbiAgICAgICAgICAgICAgICAgIHJldHVybiAhIXJlc3VsdFxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgIClcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNyZWF0ZUludGVudEJ1aWxkZXIocnVudGltZS5hY3Rpb25zJClcbiAgICAgIH0sXG4gICAgICBnZXQ6IChfdGFyZ2V0LCBwcm9wKSA9PiB7XG4gICAgICAgIGd1YXJkUnVuT25seShcInVzZV9pbl9zZXR1cFwiLCBcIiQub25BY3Rpb25cIilcbiAgICAgICAgaWYgKHR5cGVvZiBwcm9wID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgcmV0dXJuIGNyZWF0ZUludGVudEJ1aWxkZXIoXG4gICAgICAgICAgICBydW50aW1lLmFjdGlvbnMkLnBpcGUoXG4gICAgICAgICAgICAgIFN0cmVhbS5maWx0ZXIoXG4gICAgICAgICAgICAgICAgKGE6IGFueSkgPT4gYS5fdGFnID09PSBwcm9wIHx8IGEudHlwZSA9PT0gcHJvcFxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICApLFxuICAgICAgICAgICAgcHJvcCxcbiAgICAgICAgICApXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZFxuICAgICAgfSxcbiAgICB9KSBhcyB1bmtub3duIGFzIEJvdW5kQXBpPFNoLCBSPltcIm9uQWN0aW9uXCJdLFxuICAgIG9uU3RhdGU6IChcbiAgICAgIHNlbGVjdG9yOiAoczogTG9naXguU3RhdGVPZjxTaD4pID0+IGFueSxcbiAgICApID0+IHtcbiAgICAgIGd1YXJkUnVuT25seShcInVzZV9pbl9zZXR1cFwiLCBcIiQub25TdGF0ZVwiKVxuICAgICAgcmV0dXJuIGNyZWF0ZUludGVudEJ1aWxkZXIocnVudGltZS5jaGFuZ2VzKHNlbGVjdG9yKSlcbiAgICB9LFxuICAgIG9uOiAoXG4gICAgICBzdHJlYW06IFN0cmVhbS5TdHJlYW08YW55PixcbiAgICApID0+IHtcbiAgICAgIGd1YXJkUnVuT25seShcInVzZV9pbl9zZXR1cFwiLCBcIiQub25cIilcbiAgICAgIHJldHVybiBjcmVhdGVJbnRlbnRCdWlsZGVyKHN0cmVhbSlcbiAgICB9LFxuICB9IGFzIGFueVxuXG4gIHNldEJvdW5kSW50ZXJuYWxzKGFwaSBhcyBhbnksIHJ1bnRpbWVJbnRlcm5hbHMpXG5cbiAgcmV0dXJuIGFwaVxufVxuIiwgImltcG9ydCB7IENhdXNlLCBDb250ZXh0LCBFZmZlY3QsIFJlZiB9IGZyb20gXCJlZmZlY3RcIlxuaW1wb3J0IHsgdG9TZXJpYWxpemFibGVFcnJvclN1bW1hcnkgfSBmcm9tIFwiLi9lcnJvclN1bW1hcnkuanNcIlxuaW1wb3J0ICogYXMgRGVidWcgZnJvbSBcIi4vRGVidWdTaW5rLmpzXCJcblxuZXhwb3J0IHR5cGUgUGhhc2UgPSBcImluaXRcIiB8IFwicnVuXCIgfCBcImRlc3Ryb3lcIiB8IFwicGxhdGZvcm1cIlxuXG5leHBvcnQgdHlwZSBIb29rID1cbiAgfCBcImluaXRSZXF1aXJlZFwiXG4gIHwgXCJzdGFydFwiXG4gIHwgXCJkZXN0cm95XCJcbiAgfCBcInN1c3BlbmRcIlxuICB8IFwicmVzdW1lXCJcbiAgfCBcInJlc2V0XCJcbiAgfCBcInVua25vd25cIlxuXG5leHBvcnQgdHlwZSBUYXNrS2luZCA9XG4gIHwgXCJpbml0UmVxdWlyZWRcIlxuICB8IFwic3RhcnRcIlxuICB8IFwiZGVzdHJveVwiXG4gIHwgXCJwbGF0Zm9ybVN1c3BlbmRcIlxuICB8IFwicGxhdGZvcm1SZXN1bWVcIlxuICB8IFwicGxhdGZvcm1SZXNldFwiXG5cbmV4cG9ydCBpbnRlcmZhY2UgRXJyb3JDb250ZXh0IHtcbiAgcmVhZG9ubHkgcGhhc2U6IFBoYXNlXG4gIHJlYWRvbmx5IGhvb2s6IEhvb2tcbiAgcmVhZG9ubHkgbW9kdWxlSWQ6IHN0cmluZ1xuICByZWFkb25seSBpbnN0YW5jZUlkOiBzdHJpbmdcbiAgcmVhZG9ubHkgdGFza0lkPzogc3RyaW5nXG4gIHJlYWRvbmx5IHR4blNlcT86IG51bWJlclxuICByZWFkb25seSBvcFNlcT86IG51bWJlclxuICAvKipcbiAgICogXHU0RUM1XHU3NTI4XHU0RThFXHU4QkNBXHU2NUFEXHU4OUUzXHU5MUNBXHVGRjFBXHU4QkIwXHU1RjU1XHUyMDFDXHU5NTE5XHU4QkVGXHU0RUNFXHU1NEVBXHU5MUNDXHU1MTkyXHU1MUZBXHU2NzY1XHUyMDFEXHU3Njg0XHU1QjlFXHU3M0IwXHU0RkE3XHU2ODA3XHU4QkM2XHVGRjBDXG4gICAqIFx1NEY4Qlx1NTk4MiBcImxvZ2ljLmZvcmtcIiAvIFwiaW5pdFJlcXVpcmVkXCIgLyBcInN0YXJ0XCJcdTMwMDJcbiAgICpcbiAgICogXHU2Q0U4XHU2MTBGXHVGRjFBXHU4QkU1XHU1QjU3XHU2QkI1XHU1RkM1XHU5ODdCXHU1M0VGXHU1RThGXHU1MjE3XHU1MzE2XHVGRjBDXHU0RTE0XHU0RTBEXHU1RTk0XHU2MjEwXHU0RTNBXHU1MzRGXHU4QkFFXHU5NTFBXHU3MEI5XHUzMDAyXG4gICAqL1xuICByZWFkb25seSBvcmlnaW4/OiBzdHJpbmdcbn1cblxuZXhwb3J0IGludGVyZmFjZSBNb2R1bGVSdW50aW1lSWRlbnRpdHkge1xuICByZWFkb25seSBtb2R1bGVJZDogc3RyaW5nXG4gIHJlYWRvbmx5IGluc3RhbmNlSWQ6IHN0cmluZ1xuICByZWFkb25seSBydW50aW1lTGFiZWw/OiBzdHJpbmdcbn1cblxuZXhwb3J0IHR5cGUgSW5zdGFuY2VTdGF0dXMgPVxuICB8IFwiY3JlYXRpbmdcIlxuICB8IFwiaW5pdGlhbGl6aW5nXCJcbiAgfCBcInJlYWR5XCJcbiAgfCBcImZhaWxlZFwiXG4gIHwgXCJ0ZXJtaW5hdGluZ1wiXG4gIHwgXCJ0ZXJtaW5hdGVkXCJcblxuZXhwb3J0IGludGVyZmFjZSBJbml0UHJvZ3Jlc3Mge1xuICByZWFkb25seSB0b3RhbDogbnVtYmVyXG4gIHJlYWRvbmx5IGNvbXBsZXRlZDogbnVtYmVyXG4gIHJlYWRvbmx5IGN1cnJlbnQ/OiBudW1iZXJcbiAgcmVhZG9ubHkgc3RhcnRlZEF0PzogbnVtYmVyXG59XG5cbmV4cG9ydCB0eXBlIExpZmVjeWNsZU91dGNvbWUgPVxuICB8IHsgcmVhZG9ubHkgc3RhdHVzOiBcInN1Y2Nlc3NcIiB9XG4gIHwge1xuICAgICAgcmVhZG9ubHkgc3RhdHVzOiBcImZhaWx1cmVcIlxuICAgICAgcmVhZG9ubHkgZXJyb3I6IGltcG9ydChcIi4vZXJyb3JTdW1tYXJ5LmpzXCIpLlNlcmlhbGl6YWJsZUVycm9yU3VtbWFyeVxuICAgIH1cblxuZXhwb3J0IGludGVyZmFjZSBMaWZlY3ljbGVTdGF0dXMge1xuICByZWFkb25seSBpZGVudGl0eTogTW9kdWxlUnVudGltZUlkZW50aXR5XG4gIHJlYWRvbmx5IHN0YXR1czogSW5zdGFuY2VTdGF0dXNcbiAgcmVhZG9ubHkgaW5pdE91dGNvbWU/OiBMaWZlY3ljbGVPdXRjb21lXG4gIHJlYWRvbmx5IGluaXRQcm9ncmVzcz86IEluaXRQcm9ncmVzc1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFRhc2tSZWYge1xuICByZWFkb25seSB0YXNrSWQ6IHN0cmluZ1xuICByZWFkb25seSBraW5kOiBUYXNrS2luZFxuICByZWFkb25seSBvcmRlcjogbnVtYmVyXG4gIHJlYWRvbmx5IG5hbWU/OiBzdHJpbmdcbiAgcmVhZG9ubHkgZmF0YWxPbkZhaWx1cmU/OiBib29sZWFuXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTGlmZWN5Y2xlVGFzayBleHRlbmRzIFRhc2tSZWYge1xuICByZWFkb25seSBlZmZlY3Q6IEVmZmVjdC5FZmZlY3Q8dm9pZCwgbmV2ZXIsIGFueT5cbn1cblxuZXhwb3J0IGludGVyZmFjZSBCdWRnZXRzIHtcbiAgLyoqIFx1NTM1NVx1NUI5RVx1NEY4Qlx1NzUxRlx1NTQ3RFx1NTQ2OFx1NjcxRlx1NEU4Qlx1NEVGNlx1OTg4NFx1N0I5N1x1RkYxQVx1NUJGOVx1OUY1MCBzcGVjcy8wMTEgZGF0YS1tb2RlbFx1RkYwOFx1OUVEOFx1OEJBNCBcdTIyNjQyMFx1RkYwOVx1MzAwMiAqL1xuICByZWFkb25seSBtYXhFdmVudHNQZXJJbnN0YW5jZTogbnVtYmVyXG4gIC8qKiBcdTUzNTVcdTRFOEJcdTRFRjZcdTRGNTNcdTc5RUZcdTk4ODRcdTdCOTdcdUZGMUFcdTVCRjlcdTlGNTAgc3BlY3MvMDExIGRhdGEtbW9kZWxcdUZGMDhcdTlFRDhcdThCQTQgXHUyMjY0NEtCXHVGRjA5XHUzMDAyICovXG4gIHJlYWRvbmx5IG1heEV2ZW50Qnl0ZXM6IG51bWJlclxufVxuXG5leHBvcnQgaW50ZXJmYWNlIExpZmVjeWNsZU1hbmFnZXIge1xuICByZWFkb25seSBpZGVudGl0eTogTW9kdWxlUnVudGltZUlkZW50aXR5XG4gIHJlYWRvbmx5IGJ1ZGdldHM6IEJ1ZGdldHNcblxuICByZWFkb25seSByZWdpc3RlclBsYXRmb3JtU3VzcGVuZDogKFxuICAgIGVmZmVjdDogRWZmZWN0LkVmZmVjdDx2b2lkLCBuZXZlciwgYW55PixcbiAgICBvcHRpb25zPzogeyByZWFkb25seSBuYW1lPzogc3RyaW5nIH1cbiAgKSA9PiB2b2lkXG4gIHJlYWRvbmx5IHJlZ2lzdGVyUGxhdGZvcm1SZXN1bWU6IChcbiAgICBlZmZlY3Q6IEVmZmVjdC5FZmZlY3Q8dm9pZCwgbmV2ZXIsIGFueT4sXG4gICAgb3B0aW9ucz86IHsgcmVhZG9ubHkgbmFtZT86IHN0cmluZyB9XG4gICkgPT4gdm9pZFxuICByZWFkb25seSByZWdpc3RlclBsYXRmb3JtUmVzZXQ6IChcbiAgICBlZmZlY3Q6IEVmZmVjdC5FZmZlY3Q8dm9pZCwgbmV2ZXIsIGFueT4sXG4gICAgb3B0aW9ucz86IHsgcmVhZG9ubHkgbmFtZT86IHN0cmluZyB9XG4gICkgPT4gdm9pZFxuXG4gIHJlYWRvbmx5IHJlZ2lzdGVySW5pdFJlcXVpcmVkOiAoXG4gICAgZWZmZWN0OiBFZmZlY3QuRWZmZWN0PHZvaWQsIG5ldmVyLCBhbnk+LFxuICAgIG9wdGlvbnM/OiB7IHJlYWRvbmx5IG5hbWU/OiBzdHJpbmcgfVxuICApID0+IHZvaWRcbiAgcmVhZG9ubHkgcmVnaXN0ZXJTdGFydDogKFxuICAgIGVmZmVjdDogRWZmZWN0LkVmZmVjdDx2b2lkLCBuZXZlciwgYW55PixcbiAgICBvcHRpb25zPzogeyByZWFkb25seSBuYW1lPzogc3RyaW5nOyByZWFkb25seSBmYXRhbE9uRmFpbHVyZT86IGJvb2xlYW4gfVxuICApID0+IHZvaWRcbiAgcmVhZG9ubHkgcmVnaXN0ZXJEZXN0cm95OiAoXG4gICAgZWZmZWN0OiBFZmZlY3QuRWZmZWN0PHZvaWQsIG5ldmVyLCBhbnk+LFxuICAgIG9wdGlvbnM/OiB7IHJlYWRvbmx5IG5hbWU/OiBzdHJpbmcgfVxuICApID0+IHZvaWRcbiAgcmVhZG9ubHkgcmVnaXN0ZXJPbkVycm9yOiAoXG4gICAgaGFuZGxlcjogKFxuICAgICAgY2F1c2U6IENhdXNlLkNhdXNlPHVua25vd24+LFxuICAgICAgY29udGV4dDogRXJyb3JDb250ZXh0XG4gICAgKSA9PiBFZmZlY3QuRWZmZWN0PHZvaWQsIG5ldmVyLCBhbnk+XG4gICkgPT4gdm9pZFxuXG4gIHJlYWRvbmx5IGdldFN0YXR1czogRWZmZWN0LkVmZmVjdDxMaWZlY3ljbGVTdGF0dXM+XG4gIHJlYWRvbmx5IHNldFN0YXR1czogKFxuICAgIHN0YXR1czogSW5zdGFuY2VTdGF0dXMsXG4gICAgcGF0Y2g/OiB7XG4gICAgICByZWFkb25seSBpbml0T3V0Y29tZT86IExpZmVjeWNsZU91dGNvbWUgfCB1bmRlZmluZWRcbiAgICAgIHJlYWRvbmx5IGluaXRQcm9ncmVzcz86IEluaXRQcm9ncmVzcyB8IHVuZGVmaW5lZFxuICAgICAgcmVhZG9ubHkgcnVudGltZUxhYmVsPzogc3RyaW5nIHwgdW5kZWZpbmVkXG4gICAgfVxuICApID0+IEVmZmVjdC5FZmZlY3Q8dm9pZD5cblxuICByZWFkb25seSBub3RpZnlFcnJvcjogKFxuICAgIGNhdXNlOiBDYXVzZS5DYXVzZTx1bmtub3duPixcbiAgICBjb250ZXh0OiBFcnJvckNvbnRleHRcbiAgKSA9PiBFZmZlY3QuRWZmZWN0PHZvaWQsIG5ldmVyLCBhbnk+XG5cbiAgcmVhZG9ubHkgcnVuUGxhdGZvcm1TdXNwZW5kOiBFZmZlY3QuRWZmZWN0PHZvaWQsIG5ldmVyLCBhbnk+XG4gIHJlYWRvbmx5IHJ1blBsYXRmb3JtUmVzdW1lOiBFZmZlY3QuRWZmZWN0PHZvaWQsIG5ldmVyLCBhbnk+XG4gIHJlYWRvbmx5IHJ1blBsYXRmb3JtUmVzZXQ6IEVmZmVjdC5FZmZlY3Q8dm9pZCwgbmV2ZXIsIGFueT5cblxuICByZWFkb25seSBydW5Jbml0UmVxdWlyZWQ6IEVmZmVjdC5FZmZlY3Q8dm9pZCwgdW5rbm93biwgYW55PlxuICByZWFkb25seSBydW5TdGFydDogRWZmZWN0LkVmZmVjdDx2b2lkLCBuZXZlciwgYW55PlxuICByZWFkb25seSBydW5EZXN0cm95OiBFZmZlY3QuRWZmZWN0PHZvaWQsIG5ldmVyLCBhbnk+XG5cbiAgLyoqIFx1NEVDNVx1NzUyOFx1NEU4RVx1OEJDQVx1NjVBRFx1NzZFRVx1NzY4NFx1RkYxQVx1NjYyRlx1NTQyNlx1NURGMlx1NkNFOFx1NTE4Q1x1NEVGQlx1NjEwRiBvbkVycm9yIFx1NTkwNFx1NzQwNlx1NTY2OFx1MzAwMiAqL1xuICByZWFkb25seSBoYXNPbkVycm9ySGFuZGxlcnM6IEVmZmVjdC5FZmZlY3Q8Ym9vbGVhbj5cblxuICAvKiogXHU0RUM1XHU3NTI4XHU0RThFXHU2RDRCXHU4QkQ1L1x1OEJDQVx1NjVBRFx1RkYxQVx1OEJGQlx1NTNENlx1NURGMlx1NkNFOFx1NTE4Q1x1NzY4NFx1NEVGQlx1NTJBMVx1NUZFQlx1NzE2N1x1RkYwOFx1NEUwRFx1NTNFRlx1NTNEOFx1ODlDNlx1NTZGRVx1RkYwOVx1MzAwMiAqL1xuICByZWFkb25seSBnZXRUYXNrU25hcHNob3Q6IEVmZmVjdC5FZmZlY3Q8XG4gICAgUmVhZG9ubHk8e1xuICAgICAgcmVhZG9ubHkgaW5pdFJlcXVpcmVkOiBSZWFkb25seUFycmF5PFRhc2tSZWY+XG4gICAgICByZWFkb25seSBzdGFydDogUmVhZG9ubHlBcnJheTxUYXNrUmVmPlxuICAgICAgcmVhZG9ubHkgZGVzdHJveTogUmVhZG9ubHlBcnJheTxUYXNrUmVmPlxuICAgICAgcmVhZG9ubHkgcGxhdGZvcm1TdXNwZW5kOiBSZWFkb25seUFycmF5PFRhc2tSZWY+XG4gICAgICByZWFkb25seSBwbGF0Zm9ybVJlc3VtZTogUmVhZG9ubHlBcnJheTxUYXNrUmVmPlxuICAgICAgcmVhZG9ubHkgcGxhdGZvcm1SZXNldDogUmVhZG9ubHlBcnJheTxUYXNrUmVmPlxuICAgIH0+LFxuICAgIG5ldmVyLFxuICAgIG5ldmVyXG4gID5cbn1cblxuZXhwb3J0IGNvbnN0IExpZmVjeWNsZUNvbnRleHQgPSBDb250ZXh0LkdlbmVyaWNUYWc8TGlmZWN5Y2xlTWFuYWdlcj4oXG4gIFwiQGxvZ2l4L0xpZmVjeWNsZU1hbmFnZXJcIlxuKVxuXG5jb25zdCBzYWZlUnVuID0gKGxhYmVsOiBzdHJpbmcsIGVmZjogRWZmZWN0LkVmZmVjdDx2b2lkLCBhbnksIGFueT4pID0+XG4gIGVmZi5waXBlKFxuICAgIEVmZmVjdC5tYXRjaENhdXNlRWZmZWN0KHtcbiAgICAgIG9uU3VjY2VzczogKCkgPT4gRWZmZWN0LnZvaWQsXG4gICAgICBvbkZhaWx1cmU6IChjYXVzZSkgPT5cbiAgICAgICAgRWZmZWN0LmxvZ0Vycm9yKGBbJHtsYWJlbH1dIGZhaWxlZDogJHtDYXVzZS5wcmV0dHkoY2F1c2UpfWApLFxuICAgIH0pXG4gIClcblxuY29uc3QgbWFrZVRhc2tJZCA9IChraW5kOiBUYXNrS2luZCwgb3JkZXI6IG51bWJlcik6IHN0cmluZyA9PiBgJHtraW5kfToke29yZGVyfWBcblxuZXhwb3J0IGNvbnN0IG1ha2VMaWZlY3ljbGVNYW5hZ2VyID0gKFxuICBpZGVudGl0eTogTW9kdWxlUnVudGltZUlkZW50aXR5LFxuKTogRWZmZWN0LkVmZmVjdDxMaWZlY3ljbGVNYW5hZ2VyPiA9PlxuICBFZmZlY3QuZ2VuKGZ1bmN0aW9uKiAoKSB7XG4gICAgY29uc3QgYnVkZ2V0czogQnVkZ2V0cyA9IHtcbiAgICAgIG1heEV2ZW50c1Blckluc3RhbmNlOiAyMCxcbiAgICAgIG1heEV2ZW50Qnl0ZXM6IDQgKiAxMDI0LFxuICAgIH1cblxuICAgIGNvbnN0IHN0YXR1c1JlZiA9IHlpZWxkKiBSZWYubWFrZTxMaWZlY3ljbGVTdGF0dXM+KHtcbiAgICAgIGlkZW50aXR5LFxuICAgICAgc3RhdHVzOiBcImNyZWF0aW5nXCIsXG4gICAgfSlcblxuICAgIGNvbnN0IGluaXRSZXF1aXJlZDogTGlmZWN5Y2xlVGFza1tdID0gW11cbiAgICBjb25zdCBzdGFydDogTGlmZWN5Y2xlVGFza1tdID0gW11cbiAgICBjb25zdCBkZXN0cm95OiBMaWZlY3ljbGVUYXNrW10gPSBbXVxuICAgIGNvbnN0IHBsYXRmb3JtU3VzcGVuZDogTGlmZWN5Y2xlVGFza1tdID0gW11cbiAgICBjb25zdCBwbGF0Zm9ybVJlc3VtZTogTGlmZWN5Y2xlVGFza1tdID0gW11cbiAgICBjb25zdCBwbGF0Zm9ybVJlc2V0OiBMaWZlY3ljbGVUYXNrW10gPSBbXVxuICAgIGNvbnN0IG9uRXJyb3JIYW5kbGVyczogQXJyYXk8XG4gICAgICAoXG4gICAgICAgIGNhdXNlOiBDYXVzZS5DYXVzZTx1bmtub3duPixcbiAgICAgICAgY29udGV4dDogRXJyb3JDb250ZXh0XG4gICAgICApID0+IEVmZmVjdC5FZmZlY3Q8dm9pZCwgbmV2ZXIsIGFueT5cbiAgICA+ID0gW11cblxuICAgIGNvbnN0IGdldFN0YXR1czogRWZmZWN0LkVmZmVjdDxMaWZlY3ljbGVTdGF0dXM+ID0gUmVmLmdldChzdGF0dXNSZWYpXG5cbiAgICBjb25zdCByZWNvcmRQaGFzZSA9IChcbiAgICAgIHBoYXNlOiBQaGFzZSxcbiAgICAgIG5hbWU6IHN0cmluZyxcbiAgICAgIHBheWxvYWQ/OiB1bmtub3duLFxuICAgICk6IEVmZmVjdC5FZmZlY3Q8dm9pZCwgbmV2ZXIsIGFueT4gPT5cbiAgICAgIERlYnVnLnJlY29yZCh7XG4gICAgICAgIHR5cGU6IFwibGlmZWN5Y2xlOnBoYXNlXCIsXG4gICAgICAgIG1vZHVsZUlkOiBpZGVudGl0eS5tb2R1bGVJZCxcbiAgICAgICAgaW5zdGFuY2VJZDogaWRlbnRpdHkuaW5zdGFuY2VJZCxcbiAgICAgICAgcGhhc2UsXG4gICAgICAgIG5hbWUsXG4gICAgICAgIHBheWxvYWQsXG4gICAgICB9KVxuXG4gICAgY29uc3Qgc2V0U3RhdHVzID0gKFxuICAgICAgc3RhdHVzOiBJbnN0YW5jZVN0YXR1cyxcbiAgICAgIHBhdGNoPzoge1xuICAgICAgICByZWFkb25seSBpbml0T3V0Y29tZT86IExpZmVjeWNsZU91dGNvbWUgfCB1bmRlZmluZWRcbiAgICAgICAgcmVhZG9ubHkgaW5pdFByb2dyZXNzPzogSW5pdFByb2dyZXNzIHwgdW5kZWZpbmVkXG4gICAgICAgIHJlYWRvbmx5IHJ1bnRpbWVMYWJlbD86IHN0cmluZyB8IHVuZGVmaW5lZFxuICAgICAgfVxuICAgICkgPT5cbiAgICAgIFJlZi51cGRhdGUoc3RhdHVzUmVmLCAocHJldikgPT4gKHtcbiAgICAgICAgLi4ucHJldixcbiAgICAgICAgaWRlbnRpdHk6IHtcbiAgICAgICAgICAuLi5wcmV2LmlkZW50aXR5LFxuICAgICAgICAgIC4uLihwYXRjaD8ucnVudGltZUxhYmVsID8geyBydW50aW1lTGFiZWw6IHBhdGNoLnJ1bnRpbWVMYWJlbCB9IDogbnVsbCksXG4gICAgICAgIH0sXG4gICAgICAgIHN0YXR1cyxcbiAgICAgICAgLi4uKHBhdGNoPy5pbml0T3V0Y29tZSAhPT0gdW5kZWZpbmVkID8geyBpbml0T3V0Y29tZTogcGF0Y2guaW5pdE91dGNvbWUgfSA6IG51bGwpLFxuICAgICAgICAuLi4ocGF0Y2g/LmluaXRQcm9ncmVzcyAhPT0gdW5kZWZpbmVkID8geyBpbml0UHJvZ3Jlc3M6IHBhdGNoLmluaXRQcm9ncmVzcyB9IDogbnVsbCksXG4gICAgICB9KSlcblxuICAgIGNvbnN0IHJlZ2lzdGVySW5pdFJlcXVpcmVkID0gKFxuICAgICAgZWZmZWN0OiBFZmZlY3QuRWZmZWN0PHZvaWQsIG5ldmVyLCBhbnk+LFxuICAgICAgb3B0aW9ucz86IHsgcmVhZG9ubHkgbmFtZT86IHN0cmluZyB9XG4gICAgKSA9PiB7XG4gICAgICBjb25zdCBvcmRlciA9IGluaXRSZXF1aXJlZC5sZW5ndGhcbiAgICAgIGluaXRSZXF1aXJlZC5wdXNoKHtcbiAgICAgICAgdGFza0lkOiBtYWtlVGFza0lkKFwiaW5pdFJlcXVpcmVkXCIsIG9yZGVyKSxcbiAgICAgICAga2luZDogXCJpbml0UmVxdWlyZWRcIixcbiAgICAgICAgb3JkZXIsXG4gICAgICAgIG5hbWU6IG9wdGlvbnM/Lm5hbWUsXG4gICAgICAgIGVmZmVjdCxcbiAgICAgIH0pXG4gICAgfVxuXG4gICAgY29uc3QgcmVnaXN0ZXJTdGFydCA9IChcbiAgICAgIGVmZmVjdDogRWZmZWN0LkVmZmVjdDx2b2lkLCBuZXZlciwgYW55PixcbiAgICAgIG9wdGlvbnM/OiB7IHJlYWRvbmx5IG5hbWU/OiBzdHJpbmc7IHJlYWRvbmx5IGZhdGFsT25GYWlsdXJlPzogYm9vbGVhbiB9XG4gICAgKSA9PiB7XG4gICAgICBjb25zdCBvcmRlciA9IHN0YXJ0Lmxlbmd0aFxuICAgICAgc3RhcnQucHVzaCh7XG4gICAgICAgIHRhc2tJZDogbWFrZVRhc2tJZChcInN0YXJ0XCIsIG9yZGVyKSxcbiAgICAgICAga2luZDogXCJzdGFydFwiLFxuICAgICAgICBvcmRlcixcbiAgICAgICAgbmFtZTogb3B0aW9ucz8ubmFtZSxcbiAgICAgICAgZmF0YWxPbkZhaWx1cmU6IG9wdGlvbnM/LmZhdGFsT25GYWlsdXJlLFxuICAgICAgICBlZmZlY3QsXG4gICAgICB9KVxuICAgIH1cblxuICAgIGNvbnN0IHJlZ2lzdGVyRGVzdHJveSA9IChcbiAgICAgIGVmZmVjdDogRWZmZWN0LkVmZmVjdDx2b2lkLCBuZXZlciwgYW55PixcbiAgICAgIG9wdGlvbnM/OiB7IHJlYWRvbmx5IG5hbWU/OiBzdHJpbmcgfVxuICAgICkgPT4ge1xuICAgICAgY29uc3Qgb3JkZXIgPSBkZXN0cm95Lmxlbmd0aFxuICAgICAgZGVzdHJveS5wdXNoKHtcbiAgICAgICAgdGFza0lkOiBtYWtlVGFza0lkKFwiZGVzdHJveVwiLCBvcmRlciksXG4gICAgICAgIGtpbmQ6IFwiZGVzdHJveVwiLFxuICAgICAgICBvcmRlcixcbiAgICAgICAgbmFtZTogb3B0aW9ucz8ubmFtZSxcbiAgICAgICAgZWZmZWN0LFxuICAgICAgfSlcbiAgICB9XG5cbiAgICBjb25zdCByZWdpc3Rlck9uRXJyb3IgPSAoXG4gICAgICBoYW5kbGVyOiAoXG4gICAgICAgIGNhdXNlOiBDYXVzZS5DYXVzZTx1bmtub3duPixcbiAgICAgICAgY29udGV4dDogRXJyb3JDb250ZXh0XG4gICAgICApID0+IEVmZmVjdC5FZmZlY3Q8dm9pZCwgbmV2ZXIsIGFueT5cbiAgICApID0+IHtcbiAgICAgIG9uRXJyb3JIYW5kbGVycy5wdXNoKGhhbmRsZXIpXG4gICAgfVxuXG4gICAgY29uc3QgcmVnaXN0ZXJQbGF0Zm9ybVN1c3BlbmQgPSAoXG4gICAgICBlZmZlY3Q6IEVmZmVjdC5FZmZlY3Q8dm9pZCwgbmV2ZXIsIGFueT4sXG4gICAgICBvcHRpb25zPzogeyByZWFkb25seSBuYW1lPzogc3RyaW5nIH1cbiAgICApID0+IHtcbiAgICAgIGNvbnN0IG9yZGVyID0gcGxhdGZvcm1TdXNwZW5kLmxlbmd0aFxuICAgICAgcGxhdGZvcm1TdXNwZW5kLnB1c2goe1xuICAgICAgICB0YXNrSWQ6IG1ha2VUYXNrSWQoXCJwbGF0Zm9ybVN1c3BlbmRcIiwgb3JkZXIpLFxuICAgICAgICBraW5kOiBcInBsYXRmb3JtU3VzcGVuZFwiLFxuICAgICAgICBvcmRlcixcbiAgICAgICAgbmFtZTogb3B0aW9ucz8ubmFtZSxcbiAgICAgICAgZWZmZWN0LFxuICAgICAgfSlcbiAgICB9XG5cbiAgICBjb25zdCByZWdpc3RlclBsYXRmb3JtUmVzdW1lID0gKFxuICAgICAgZWZmZWN0OiBFZmZlY3QuRWZmZWN0PHZvaWQsIG5ldmVyLCBhbnk+LFxuICAgICAgb3B0aW9ucz86IHsgcmVhZG9ubHkgbmFtZT86IHN0cmluZyB9XG4gICAgKSA9PiB7XG4gICAgICBjb25zdCBvcmRlciA9IHBsYXRmb3JtUmVzdW1lLmxlbmd0aFxuICAgICAgcGxhdGZvcm1SZXN1bWUucHVzaCh7XG4gICAgICAgIHRhc2tJZDogbWFrZVRhc2tJZChcInBsYXRmb3JtUmVzdW1lXCIsIG9yZGVyKSxcbiAgICAgICAga2luZDogXCJwbGF0Zm9ybVJlc3VtZVwiLFxuICAgICAgICBvcmRlcixcbiAgICAgICAgbmFtZTogb3B0aW9ucz8ubmFtZSxcbiAgICAgICAgZWZmZWN0LFxuICAgICAgfSlcbiAgICB9XG5cbiAgICBjb25zdCByZWdpc3RlclBsYXRmb3JtUmVzZXQgPSAoXG4gICAgICBlZmZlY3Q6IEVmZmVjdC5FZmZlY3Q8dm9pZCwgbmV2ZXIsIGFueT4sXG4gICAgICBvcHRpb25zPzogeyByZWFkb25seSBuYW1lPzogc3RyaW5nIH1cbiAgICApID0+IHtcbiAgICAgIGNvbnN0IG9yZGVyID0gcGxhdGZvcm1SZXNldC5sZW5ndGhcbiAgICAgIHBsYXRmb3JtUmVzZXQucHVzaCh7XG4gICAgICAgIHRhc2tJZDogbWFrZVRhc2tJZChcInBsYXRmb3JtUmVzZXRcIiwgb3JkZXIpLFxuICAgICAgICBraW5kOiBcInBsYXRmb3JtUmVzZXRcIixcbiAgICAgICAgb3JkZXIsXG4gICAgICAgIG5hbWU6IG9wdGlvbnM/Lm5hbWUsXG4gICAgICAgIGVmZmVjdCxcbiAgICAgIH0pXG4gICAgfVxuXG4gICAgY29uc3Qgbm90aWZ5RXJyb3IgPSAoY2F1c2U6IENhdXNlLkNhdXNlPHVua25vd24+LCBjb250ZXh0OiBFcnJvckNvbnRleHQpID0+IHtcbiAgICAgIC8vIFx1NEUyRFx1NjVBRC9cdTUzRDZcdTZEODhcdTRFMERcdTVFOTRcdTg4QUJcdTVGNTNcdTRGNUNcdTk1MTlcdThCRUZcdTRFMEFcdTYyQTVcdTMwMDJcbiAgICAgIGlmIChDYXVzZS5pc0ludGVycnVwdGVkKGNhdXNlKSkge1xuICAgICAgICByZXR1cm4gRWZmZWN0LnZvaWRcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIERlYnVnLnJlY29yZCh7XG4gICAgICAgIHR5cGU6IFwibGlmZWN5Y2xlOmVycm9yXCIsXG4gICAgICAgIG1vZHVsZUlkOiBjb250ZXh0Lm1vZHVsZUlkLFxuICAgICAgICBpbnN0YW5jZUlkOiBjb250ZXh0Lmluc3RhbmNlSWQsXG4gICAgICAgIGNhdXNlLFxuICAgICAgICBwaGFzZTogY29udGV4dC5waGFzZSxcbiAgICAgICAgaG9vazogY29udGV4dC5ob29rLFxuICAgICAgICB0YXNrSWQ6IGNvbnRleHQudGFza0lkLFxuICAgICAgICB0eG5TZXE6IGNvbnRleHQudHhuU2VxLFxuICAgICAgICBvcFNlcTogY29udGV4dC5vcFNlcSxcbiAgICAgICAgb3JpZ2luOiBjb250ZXh0Lm9yaWdpbixcbiAgICAgIH0pLnBpcGUoXG4gICAgICAgIEVmZmVjdC56aXBSaWdodChcbiAgICAgICAgICBFZmZlY3QuZm9yRWFjaChcbiAgICAgICAgICAgIG9uRXJyb3JIYW5kbGVycyxcbiAgICAgICAgICAgIChoYW5kbGVyKSA9PlxuICAgICAgICAgICAgICBoYW5kbGVyKGNhdXNlLCBjb250ZXh0KS5waXBlKFxuICAgICAgICAgICAgICAgIEVmZmVjdC5jYXRjaEFsbENhdXNlKChpbm5lcikgPT5cbiAgICAgICAgICAgICAgICAgIEVmZmVjdC5sb2dFcnJvcihcbiAgICAgICAgICAgICAgICAgICAgYFtsaWZlY3ljbGUub25FcnJvcl0gZmFpbGVkOiAke0NhdXNlLnByZXR0eShpbm5lcil9YFxuICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgIHsgZGlzY2FyZDogdHJ1ZSB9XG4gICAgICAgICAgKVxuICAgICAgICApXG4gICAgICApXG4gICAgfVxuXG4gICAgY29uc3QgcnVuSW5pdFJlcXVpcmVkOiBFZmZlY3QuRWZmZWN0PHZvaWQsIHVua25vd24sIGFueT4gPSBFZmZlY3QuZ2VuKGZ1bmN0aW9uKiAoKSB7XG4gICAgICBjb25zdCB0b3RhbCA9IGluaXRSZXF1aXJlZC5sZW5ndGhcbiAgICAgIGlmICh0b3RhbCA9PT0gMCkge1xuICAgICAgICB5aWVsZCogc2V0U3RhdHVzKFwicmVhZHlcIiwge1xuICAgICAgICAgIGluaXRQcm9ncmVzczogeyB0b3RhbDogMCwgY29tcGxldGVkOiAwIH0sXG4gICAgICAgICAgaW5pdE91dGNvbWU6IHsgc3RhdHVzOiBcInN1Y2Nlc3NcIiB9LFxuICAgICAgICB9KVxuICAgICAgICByZXR1cm5cbiAgICAgIH1cblxuICAgICAgY29uc3Qgc3RhcnRlZEF0ID0gRGF0ZS5ub3coKVxuICAgICAgeWllbGQqIHJlY29yZFBoYXNlKFwiaW5pdFwiLCBcImluaXRSZXF1aXJlZDpzdGFydFwiLCB7IHRvdGFsIH0pXG4gICAgICB5aWVsZCogc2V0U3RhdHVzKFwiaW5pdGlhbGl6aW5nXCIsIHtcbiAgICAgICAgaW5pdFByb2dyZXNzOiB7IHRvdGFsLCBjb21wbGV0ZWQ6IDAsIGN1cnJlbnQ6IDAsIHN0YXJ0ZWRBdCB9LFxuICAgICAgfSlcblxuICAgICAgbGV0IGNvbXBsZXRlZCA9IDBcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaW5pdFJlcXVpcmVkLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHlpZWxkKiBzZXRTdGF0dXMoXCJpbml0aWFsaXppbmdcIiwge1xuICAgICAgICAgIGluaXRQcm9ncmVzczogeyB0b3RhbCwgY29tcGxldGVkLCBjdXJyZW50OiBpLCBzdGFydGVkQXQgfSxcbiAgICAgICAgfSlcblxuICAgICAgICBjb25zdCB0YXNrID0gaW5pdFJlcXVpcmVkW2ldXG4gICAgICAgIGNvbnN0IGV4aXQgPSB5aWVsZCogRWZmZWN0LmV4aXQodGFzay5lZmZlY3QpXG5cbiAgICAgICAgaWYgKGV4aXQuX3RhZyA9PT0gXCJTdWNjZXNzXCIpIHtcbiAgICAgICAgICBjb21wbGV0ZWQgKz0gMVxuICAgICAgICAgIHlpZWxkKiBzZXRTdGF0dXMoXCJpbml0aWFsaXppbmdcIiwge1xuICAgICAgICAgICAgaW5pdFByb2dyZXNzOiB7IHRvdGFsLCBjb21wbGV0ZWQsIGN1cnJlbnQ6IGkgKyAxLCBzdGFydGVkQXQgfSxcbiAgICAgICAgICB9KVxuICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBzdW1tYXJ5ID0gdG9TZXJpYWxpemFibGVFcnJvclN1bW1hcnkoZXhpdC5jYXVzZSlcbiAgICAgICAgeWllbGQqIG5vdGlmeUVycm9yKGV4aXQuY2F1c2UsIHtcbiAgICAgICAgICBwaGFzZTogXCJpbml0XCIsXG4gICAgICAgICAgaG9vazogXCJpbml0UmVxdWlyZWRcIixcbiAgICAgICAgICBtb2R1bGVJZDogaWRlbnRpdHkubW9kdWxlSWQsXG4gICAgICAgICAgaW5zdGFuY2VJZDogaWRlbnRpdHkuaW5zdGFuY2VJZCxcbiAgICAgICAgICB0YXNrSWQ6IHRhc2sudGFza0lkLFxuICAgICAgICAgIG9yaWdpbjogXCJpbml0UmVxdWlyZWRcIixcbiAgICAgICAgfSlcblxuICAgICAgICB5aWVsZCogc2V0U3RhdHVzKFwiZmFpbGVkXCIsIHtcbiAgICAgICAgICBpbml0UHJvZ3Jlc3M6IHsgdG90YWwsIGNvbXBsZXRlZCwgY3VycmVudDogaSwgc3RhcnRlZEF0IH0sXG4gICAgICAgICAgaW5pdE91dGNvbWU6IHsgc3RhdHVzOiBcImZhaWx1cmVcIiwgZXJyb3I6IHN1bW1hcnkuZXJyb3JTdW1tYXJ5IH0sXG4gICAgICAgIH0pXG5cbiAgICAgICAgcmV0dXJuIHlpZWxkKiBFZmZlY3QuZmFpbENhdXNlKGV4aXQuY2F1c2UpXG4gICAgICB9XG5cbiAgICAgIHlpZWxkKiByZWNvcmRQaGFzZShcImluaXRcIiwgXCJpbml0UmVxdWlyZWQ6c3VjY2Vzc1wiLCB7IHRvdGFsIH0pXG4gICAgICB5aWVsZCogc2V0U3RhdHVzKFwicmVhZHlcIiwge1xuICAgICAgICBpbml0UHJvZ3Jlc3M6IHsgdG90YWwsIGNvbXBsZXRlZCwgY3VycmVudDogdG90YWwsIHN0YXJ0ZWRBdCB9LFxuICAgICAgICBpbml0T3V0Y29tZTogeyBzdGF0dXM6IFwic3VjY2Vzc1wiIH0sXG4gICAgICB9KVxuICAgIH0pXG5cbiAgICBjb25zdCBydW5TdGFydDogRWZmZWN0LkVmZmVjdDx2b2lkLCBuZXZlciwgYW55PiA9IHJlY29yZFBoYXNlKFwicnVuXCIsIFwic3RhcnQ6c2NoZWR1bGVcIiwge1xuICAgICAgdG90YWw6IHN0YXJ0Lmxlbmd0aCxcbiAgICB9KS5waXBlKFxuICAgICAgRWZmZWN0LnppcFJpZ2h0KFxuICAgICAgICBFZmZlY3QuZm9yRWFjaChcbiAgICAgICAgICBzdGFydCxcbiAgICAgICAgICAodGFzaykgPT5cbiAgICAgICAgICAgIEVmZmVjdC5mb3JrU2NvcGVkKFxuICAgICAgICAgICAgICB0YXNrLmVmZmVjdC5waXBlKFxuICAgICAgICAgICAgICAgIEVmZmVjdC5jYXRjaEFsbENhdXNlKChjYXVzZSkgPT5cbiAgICAgICAgICAgICAgICAgIG5vdGlmeUVycm9yKGNhdXNlLCB7XG4gICAgICAgICAgICAgICAgICAgIHBoYXNlOiBcInJ1blwiLFxuICAgICAgICAgICAgICAgICAgICBob29rOiBcInN0YXJ0XCIsXG4gICAgICAgICAgICAgICAgICAgIG1vZHVsZUlkOiBpZGVudGl0eS5tb2R1bGVJZCxcbiAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2VJZDogaWRlbnRpdHkuaW5zdGFuY2VJZCxcbiAgICAgICAgICAgICAgICAgICAgdGFza0lkOiB0YXNrLnRhc2tJZCxcbiAgICAgICAgICAgICAgICAgICAgb3JpZ2luOiBcInN0YXJ0XCIsXG4gICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgKS5waXBlKEVmZmVjdC5hc1ZvaWQpLFxuICAgICAgICAgIHsgZGlzY2FyZDogdHJ1ZSwgY29uY3VycmVuY3k6IFwidW5ib3VuZGVkXCIgfVxuICAgICAgICApXG4gICAgICApXG4gICAgKVxuXG4gICAgY29uc3QgcnVuRGVzdHJveTogRWZmZWN0LkVmZmVjdDx2b2lkLCBuZXZlciwgYW55PiA9IEVmZmVjdC5nZW4oZnVuY3Rpb24qICgpIHtcbiAgICAgIHlpZWxkKiByZWNvcmRQaGFzZShcImRlc3Ryb3lcIiwgXCJkZXN0cm95OnN0YXJ0XCIsIHsgdG90YWw6IGRlc3Ryb3kubGVuZ3RoIH0pXG4gICAgICB5aWVsZCogc2V0U3RhdHVzKFwidGVybWluYXRpbmdcIilcblxuICAgICAgLy8gZGVzdHJveVx1RkYxQVx1NTQwRVx1NkNFOFx1NTE4Q1x1NTE0OFx1NjI2N1x1ODg0Q1x1RkYwOExJRk9cdUZGMDlcdUZGMENcdTRFMTQgYmVzdC1lZmZvcnRcdUZGMDhcdTUzNTVcdTRFMkFcdTU5MzFcdThEMjVcdTRFMERcdTk2M0JcdTU4NUVcdTU0MEVcdTdFRURcdUZGMDlcdTMwMDJcbiAgICAgIGZvciAobGV0IGkgPSBkZXN0cm95Lmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgIGNvbnN0IHRhc2sgPSBkZXN0cm95W2ldXG4gICAgICAgIHlpZWxkKiBzYWZlUnVuKFxuICAgICAgICAgIFwibGlmZWN5Y2xlLm9uRGVzdHJveVwiLFxuICAgICAgICAgIHRhc2suZWZmZWN0LnBpcGUoXG4gICAgICAgICAgICBFZmZlY3QuY2F0Y2hBbGxDYXVzZSgoY2F1c2UpID0+XG4gICAgICAgICAgICAgIG5vdGlmeUVycm9yKGNhdXNlLCB7XG4gICAgICAgICAgICAgICAgcGhhc2U6IFwiZGVzdHJveVwiLFxuICAgICAgICAgICAgICAgIGhvb2s6IFwiZGVzdHJveVwiLFxuICAgICAgICAgICAgICAgIG1vZHVsZUlkOiBpZGVudGl0eS5tb2R1bGVJZCxcbiAgICAgICAgICAgICAgICBpbnN0YW5jZUlkOiBpZGVudGl0eS5pbnN0YW5jZUlkLFxuICAgICAgICAgICAgICAgIHRhc2tJZDogdGFzay50YXNrSWQsXG4gICAgICAgICAgICAgICAgb3JpZ2luOiBcImRlc3Ryb3lcIixcbiAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIClcbiAgICAgICAgICApXG4gICAgICAgIClcbiAgICAgIH1cblxuICAgICAgeWllbGQqIHNldFN0YXR1cyhcInRlcm1pbmF0ZWRcIilcbiAgICAgIHlpZWxkKiByZWNvcmRQaGFzZShcImRlc3Ryb3lcIiwgXCJkZXN0cm95OmRvbmVcIiwgeyB0b3RhbDogZGVzdHJveS5sZW5ndGggfSlcbiAgICB9KVxuXG4gICAgY29uc3QgcnVuUGxhdGZvcm1TdXNwZW5kOiBFZmZlY3QuRWZmZWN0PHZvaWQsIG5ldmVyLCBhbnk+ID0gRWZmZWN0LmdlbihmdW5jdGlvbiogKCkge1xuICAgICAgaWYgKHBsYXRmb3JtU3VzcGVuZC5sZW5ndGggPT09IDApIHJldHVyblxuXG4gICAgICB5aWVsZCogcmVjb3JkUGhhc2UoXCJwbGF0Zm9ybVwiLCBcInNpZ25hbDpzdXNwZW5kXCIsIHsgdG90YWw6IHBsYXRmb3JtU3VzcGVuZC5sZW5ndGggfSlcbiAgICAgIGZvciAoY29uc3QgdGFzayBvZiBwbGF0Zm9ybVN1c3BlbmQpIHtcbiAgICAgICAgeWllbGQqIHNhZmVSdW4oXG4gICAgICAgICAgXCJsaWZlY3ljbGUub25TdXNwZW5kXCIsXG4gICAgICAgICAgdGFzay5lZmZlY3QucGlwZShcbiAgICAgICAgICAgIEVmZmVjdC5jYXRjaEFsbENhdXNlKChjYXVzZSkgPT5cbiAgICAgICAgICAgICAgbm90aWZ5RXJyb3IoY2F1c2UsIHtcbiAgICAgICAgICAgICAgICBwaGFzZTogXCJwbGF0Zm9ybVwiLFxuICAgICAgICAgICAgICAgIGhvb2s6IFwic3VzcGVuZFwiLFxuICAgICAgICAgICAgICAgIG1vZHVsZUlkOiBpZGVudGl0eS5tb2R1bGVJZCxcbiAgICAgICAgICAgICAgICBpbnN0YW5jZUlkOiBpZGVudGl0eS5pbnN0YW5jZUlkLFxuICAgICAgICAgICAgICAgIHRhc2tJZDogdGFzay50YXNrSWQsXG4gICAgICAgICAgICAgICAgb3JpZ2luOiBcInBsYXRmb3JtLnN1c3BlbmRcIixcbiAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIClcbiAgICAgICAgICApXG4gICAgICAgIClcbiAgICAgIH1cbiAgICB9KVxuXG4gICAgY29uc3QgcnVuUGxhdGZvcm1SZXN1bWU6IEVmZmVjdC5FZmZlY3Q8dm9pZCwgbmV2ZXIsIGFueT4gPSBFZmZlY3QuZ2VuKGZ1bmN0aW9uKiAoKSB7XG4gICAgICBpZiAocGxhdGZvcm1SZXN1bWUubGVuZ3RoID09PSAwKSByZXR1cm5cblxuICAgICAgeWllbGQqIHJlY29yZFBoYXNlKFwicGxhdGZvcm1cIiwgXCJzaWduYWw6cmVzdW1lXCIsIHsgdG90YWw6IHBsYXRmb3JtUmVzdW1lLmxlbmd0aCB9KVxuICAgICAgZm9yIChjb25zdCB0YXNrIG9mIHBsYXRmb3JtUmVzdW1lKSB7XG4gICAgICAgIHlpZWxkKiBzYWZlUnVuKFxuICAgICAgICAgIFwibGlmZWN5Y2xlLm9uUmVzdW1lXCIsXG4gICAgICAgICAgdGFzay5lZmZlY3QucGlwZShcbiAgICAgICAgICAgIEVmZmVjdC5jYXRjaEFsbENhdXNlKChjYXVzZSkgPT5cbiAgICAgICAgICAgICAgbm90aWZ5RXJyb3IoY2F1c2UsIHtcbiAgICAgICAgICAgICAgICBwaGFzZTogXCJwbGF0Zm9ybVwiLFxuICAgICAgICAgICAgICAgIGhvb2s6IFwicmVzdW1lXCIsXG4gICAgICAgICAgICAgICAgbW9kdWxlSWQ6IGlkZW50aXR5Lm1vZHVsZUlkLFxuICAgICAgICAgICAgICAgIGluc3RhbmNlSWQ6IGlkZW50aXR5Lmluc3RhbmNlSWQsXG4gICAgICAgICAgICAgICAgdGFza0lkOiB0YXNrLnRhc2tJZCxcbiAgICAgICAgICAgICAgICBvcmlnaW46IFwicGxhdGZvcm0ucmVzdW1lXCIsXG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICApXG4gICAgICAgICAgKVxuICAgICAgICApXG4gICAgICB9XG4gICAgfSlcblxuICAgIGNvbnN0IHJ1blBsYXRmb3JtUmVzZXQ6IEVmZmVjdC5FZmZlY3Q8dm9pZCwgbmV2ZXIsIGFueT4gPSBFZmZlY3QuZ2VuKGZ1bmN0aW9uKiAoKSB7XG4gICAgICBpZiAocGxhdGZvcm1SZXNldC5sZW5ndGggPT09IDApIHJldHVyblxuXG4gICAgICB5aWVsZCogcmVjb3JkUGhhc2UoXCJwbGF0Zm9ybVwiLCBcInNpZ25hbDpyZXNldFwiLCB7IHRvdGFsOiBwbGF0Zm9ybVJlc2V0Lmxlbmd0aCB9KVxuICAgICAgZm9yIChjb25zdCB0YXNrIG9mIHBsYXRmb3JtUmVzZXQpIHtcbiAgICAgICAgeWllbGQqIHNhZmVSdW4oXG4gICAgICAgICAgXCJsaWZlY3ljbGUub25SZXNldFwiLFxuICAgICAgICAgIHRhc2suZWZmZWN0LnBpcGUoXG4gICAgICAgICAgICBFZmZlY3QuY2F0Y2hBbGxDYXVzZSgoY2F1c2UpID0+XG4gICAgICAgICAgICAgIG5vdGlmeUVycm9yKGNhdXNlLCB7XG4gICAgICAgICAgICAgICAgcGhhc2U6IFwicGxhdGZvcm1cIixcbiAgICAgICAgICAgICAgICBob29rOiBcInJlc2V0XCIsXG4gICAgICAgICAgICAgICAgbW9kdWxlSWQ6IGlkZW50aXR5Lm1vZHVsZUlkLFxuICAgICAgICAgICAgICAgIGluc3RhbmNlSWQ6IGlkZW50aXR5Lmluc3RhbmNlSWQsXG4gICAgICAgICAgICAgICAgdGFza0lkOiB0YXNrLnRhc2tJZCxcbiAgICAgICAgICAgICAgICBvcmlnaW46IFwicGxhdGZvcm0ucmVzZXRcIixcbiAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIClcbiAgICAgICAgICApXG4gICAgICAgIClcbiAgICAgIH1cbiAgICB9KVxuXG4gICAgY29uc3QgZ2V0VGFza1NuYXBzaG90OiBMaWZlY3ljbGVNYW5hZ2VyW1wiZ2V0VGFza1NuYXBzaG90XCJdID0gRWZmZWN0LnN5bmMoKCkgPT4gKHtcbiAgICAgIGluaXRSZXF1aXJlZDogaW5pdFJlcXVpcmVkLm1hcCgoeyBlZmZlY3Q6IF9lZmYsIC4uLnJlc3QgfSkgPT4gcmVzdCksXG4gICAgICBzdGFydDogc3RhcnQubWFwKCh7IGVmZmVjdDogX2VmZiwgLi4ucmVzdCB9KSA9PiByZXN0KSxcbiAgICAgIGRlc3Ryb3k6IGRlc3Ryb3kubWFwKCh7IGVmZmVjdDogX2VmZiwgLi4ucmVzdCB9KSA9PiByZXN0KSxcbiAgICAgIHBsYXRmb3JtU3VzcGVuZDogcGxhdGZvcm1TdXNwZW5kLm1hcCgoeyBlZmZlY3Q6IF9lZmYsIC4uLnJlc3QgfSkgPT4gcmVzdCksXG4gICAgICBwbGF0Zm9ybVJlc3VtZTogcGxhdGZvcm1SZXN1bWUubWFwKCh7IGVmZmVjdDogX2VmZiwgLi4ucmVzdCB9KSA9PiByZXN0KSxcbiAgICAgIHBsYXRmb3JtUmVzZXQ6IHBsYXRmb3JtUmVzZXQubWFwKCh7IGVmZmVjdDogX2VmZiwgLi4ucmVzdCB9KSA9PiByZXN0KSxcbiAgICB9KSlcblxuICAgIGNvbnN0IGhhc09uRXJyb3JIYW5kbGVyczogTGlmZWN5Y2xlTWFuYWdlcltcImhhc09uRXJyb3JIYW5kbGVyc1wiXSA9IEVmZmVjdC5zeW5jKCgpID0+IG9uRXJyb3JIYW5kbGVycy5sZW5ndGggPiAwKVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIGlkZW50aXR5LFxuICAgICAgYnVkZ2V0cyxcbiAgICAgIHJlZ2lzdGVyUGxhdGZvcm1TdXNwZW5kLFxuICAgICAgcmVnaXN0ZXJQbGF0Zm9ybVJlc3VtZSxcbiAgICAgIHJlZ2lzdGVyUGxhdGZvcm1SZXNldCxcbiAgICAgIHJlZ2lzdGVySW5pdFJlcXVpcmVkLFxuICAgICAgcmVnaXN0ZXJTdGFydCxcbiAgICAgIHJlZ2lzdGVyRGVzdHJveSxcbiAgICAgIHJlZ2lzdGVyT25FcnJvcixcbiAgICAgIGdldFN0YXR1cyxcbiAgICAgIHNldFN0YXR1cyxcbiAgICAgIG5vdGlmeUVycm9yLFxuICAgICAgcnVuUGxhdGZvcm1TdXNwZW5kLFxuICAgICAgcnVuUGxhdGZvcm1SZXN1bWUsXG4gICAgICBydW5QbGF0Zm9ybVJlc2V0LFxuICAgICAgcnVuSW5pdFJlcXVpcmVkLFxuICAgICAgcnVuU3RhcnQsXG4gICAgICBydW5EZXN0cm95LFxuICAgICAgaGFzT25FcnJvckhhbmRsZXJzLFxuICAgICAgZ2V0VGFza1NuYXBzaG90LFxuICAgIH1cbiAgfSlcbiIsICJpbXBvcnQgeyBDYXVzZSwgQ29udGV4dCwgRWZmZWN0IH0gZnJvbSBcImVmZmVjdFwiXG5pbXBvcnQgKiBhcyBEZWJ1ZyBmcm9tIFwiLi9EZWJ1Z1NpbmsuanNcIlxuaW1wb3J0IHsgaXNEZXZFbnYgfSBmcm9tIFwiLi9lbnYuanNcIlxuXG5jb25zdCBwaGFzZURpYWdub3N0aWNzRW5hYmxlZCA9ICgpOiBib29sZWFuID0+IGlzRGV2RW52KClcblxuLyoqXG4gKiBMb2dpYyBcdTc2RjhcdTUxNzNcdThCQ0FcdTY1QURcdUZGMUFcbiAqIC0gXHU1RjUzXHU1MjREXHU4MDVBXHU3MTI2XHU0RThFIEVudiBTZXJ2aWNlIFx1N0YzQVx1NTkzMVx1NUJGQ1x1ODFGNFx1NzY4NFx1NTIxRFx1NTlDQlx1NTMxNlx1NTY2QVx1OTdGM1x1RkYwOFNlcnZpY2Ugbm90IGZvdW5kXHVGRjA5XHUzMDAyXG4gKlxuICogXHU4QkJFXHU4QkExXHU2MTBGXHU1NkZFXHVGRjFBXG4gKiAtIFx1NTcyOFx1NjNBOFx1ODM1MFx1NzUyOFx1NkNENVx1NEUwQlx1RkYwQ1J1bnRpbWUgLyBSZWFjdCBcdTVDNDJcdTRGMUFcdTZCNjNcdTc4NkVcdTYzRDBcdTRGOUIgRW52XHVGRjFCXG4gKiAtIFx1NEY0Nlx1NTcyOFx1NjdEMFx1NEU5Qlx1NTIxRFx1NTlDQlx1NTMxNlx1NjVGNlx1NUU4Rlx1NEUwQlx1RkYwQ0xvZ2ljIFx1NTNFRlx1ODBGRFx1NTcyOCBFbnYgXHU5NEZBXHU2RUUxXHU1MjREXHU1QzMxXHU1QzFEXHU4QkQ1XHU4QkZCXHU1M0Q2IFNlcnZpY2VcdUZGMUJcbiAqIC0gXHU4RkQ5XHU3QzdCXHU5NTE5XHU4QkVGXHU5MDFBXHU1RTM4XHU1M0VBXHU1MUZBXHU3M0IwXHU0RTAwXHU2QjIxXHVGRjBDXHU0RTBEXHU2NTM5XHU1M0Q4XHU2NzAwXHU3RUM4XHU4QkVEXHU0RTQ5XHVGRjBDXHU1Mzc0XHU0RjFBXHU2QzYxXHU2N0QzXHU2NUU1XHU1RkQ3XHUzMDAyXG4gKlxuICogXHU1NkUwXHU2QjY0XHU4RkQ5XHU5MUNDXHU1NzI4IERlYnVnIFx1NEZBN1x1NTNEMVx1NTFGQVx1NEUwMFx1Njc2MSB3YXJuaW5nIFx1N0VBNyBkaWFnbm9zdGljXHVGRjBDXHU4OUUzXHU5MUNBXHU1M0VGXHU4MEZEXHU1MzlGXHU1NkUwXHU0RTBFXHU2MzkyXHU2N0U1XHU4REVGXHU1Rjg0XHVGRjBDXG4gKiBcdTc3MUZcdTZCNjNcdTc2ODRcdTk1MTlcdThCRUZcdThCRURcdTRFNDlcdTRFQ0RcdTc1MzEgbGlmZWN5Y2xlLm9uRXJyb3IgLyBBcHBSdW50aW1lLm9uRXJyb3IgXHU1OTA0XHU3NDA2XHUzMDAyXG4gKi9cblxuY29uc3QgU0VSVklDRV9OT1RfRk9VTkRfUFJFRklYID0gXCJTZXJ2aWNlIG5vdCBmb3VuZDpcIlxuXG4vKipcbiAqIFx1ODJFNSBDYXVzZSBcdTRFMkRcdTUzMDVcdTU0MkIgYFNlcnZpY2Ugbm90IGZvdW5kOiAuLi5gIFx1OTUxOVx1OEJFRlx1RkYwQ1x1NTIxOVx1NTNEMVx1NTFGQVx1NEUwMFx1Njc2MSB3YXJuaW5nIFx1N0VBNyBkaWFnbm9zdGljXHVGRjFBXG4gKiAtIGNvZGU6IGxvZ2ljOjplbnZfc2VydmljZV9ub3RfZm91bmRcbiAqIC0gbWVzc2FnZTogXHU1MzlGXHU1OUNCXHU5NTE5XHU4QkVGIG1lc3NhZ2VcdUZGMUJcbiAqIC0gaGludDogXHU4QkY0XHU2NjBFXHU4RkQ5XHU2NjJGXHU1REYyXHU3N0U1XHU3Njg0XHU1MjFEXHU1OUNCXHU1MzE2XHU2NUY2XHU1RThGXHU1NjZBXHU5N0YzXHVGRjBDXHU1RTc2XHU3RUQ5XHU1MUZBXHU2MzkyXHU2N0U1XHU1RUZBXHU4QkFFXHUzMDAyXG4gKi9cbmV4cG9ydCBjb25zdCBlbWl0RW52U2VydmljZU5vdEZvdW5kRGlhZ25vc3RpY0lmTmVlZGVkID0gKFxuICBjYXVzZTogQ2F1c2UuQ2F1c2U8dW5rbm93bj4sXG4gIG1vZHVsZUlkPzogc3RyaW5nXG4pOiBFZmZlY3QuRWZmZWN0PHZvaWQ+ID0+XG4gIEVmZmVjdC5nZW4oZnVuY3Rpb24qICgpIHtcbiAgICBsZXQgcHJldHR5OiBzdHJpbmdcbiAgICB0cnkge1xuICAgICAgcHJldHR5ID0gQ2F1c2UucHJldHR5KGNhdXNlLCB7IHJlbmRlckVycm9yQ2F1c2U6IHRydWUgfSlcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGlmICghcHJldHR5LmluY2x1ZGVzKFNFUlZJQ0VfTk9UX0ZPVU5EX1BSRUZJWCkpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIC8vIDEpIEVudiBTZXJ2aWNlIFx1N0YzQVx1NTkzMVx1NjcyQ1x1OEVBQlx1NzY4NCB3YXJuaW5nIFx1OEJDQVx1NjVBRFxuICAgIHlpZWxkKiBEZWJ1Zy5yZWNvcmQoe1xuICAgICAgdHlwZTogXCJkaWFnbm9zdGljXCIsXG4gICAgICBtb2R1bGVJZCxcbiAgICAgIGNvZGU6IFwibG9naWM6OmVudl9zZXJ2aWNlX25vdF9mb3VuZFwiLFxuICAgICAgc2V2ZXJpdHk6IFwid2FybmluZ1wiLFxuICAgICAgbWVzc2FnZTogcHJldHR5LFxuICAgICAgaGludDpcbiAgICAgICAgXCJMb2dpYyBcdTU3MjhcdTUyMURcdTU5Q0JcdTUzMTZcdTk2MzZcdTZCQjVcdTVDMURcdThCRDVcdThCQkZcdTk1RUVcdTVDMUFcdTY3MkFcdTYzRDBcdTRGOUJcdTc2ODQgRW52IFNlcnZpY2VcdUZGMENcdTkwMUFcdTVFMzhcdTY2MkYgUnVudGltZSAvIFJlYWN0IFx1OTZDNlx1NjIxMFx1NEUyRFx1NzY4NFx1NURGMlx1NzdFNVx1NTIxRFx1NTlDQlx1NTMxNlx1NTY2QVx1OTdGM1x1MzAwMlwiICtcbiAgICAgICAgXCJcdTgyRTVcdTUzRUFcdTU3MjhcdTVFOTRcdTc1MjhcdTU0MkZcdTUyQThcdTY1RTlcdTY3MUZcdTUxRkFcdTczQjBcdTRFMDBcdTZCMjFcdTRFMTRcdTU0MEVcdTdFRURcdTcyQjZcdTYwMDFcdTRFMEUgRW52IFx1NTc0N1x1NkI2M1x1NUUzOFx1RkYwQ1x1NTNFRlx1NjY4Mlx1ODlDNlx1NEUzQVx1NjVFMFx1NUJCM1x1RkYxQlwiICtcbiAgICAgICAgXCJcdTgyRTVcdTYzMDFcdTdFRURcdTUxRkFcdTczQjBcdTYyMTZcdTRGMzRcdTk2OEZcdTRFMUFcdTUyQTFcdTVGMDJcdTVFMzhcdUZGMENcdThCRjdcdTY4QzBcdTY3RTUgUnVudGltZS5tYWtlIC8gUnVudGltZVByb3ZpZGVyLmxheWVyIFx1NjYyRlx1NTQyNlx1NkI2M1x1Nzg2RVx1NjNEMFx1NEY5Qlx1NEU4Nlx1NUJGOVx1NUU5NCBTZXJ2aWNlXHUzMDAyXCIsXG4gICAgfSlcblxuICAgIC8vIDIpIFx1NTcyOFx1NjdEMFx1NEU5Qlx1NTczQVx1NjY2Rlx1NEUwQlx1RkYwOFx1NEY4Qlx1NTk4MiBMb2dpYyBzZXR1cCBcdTZCQjVcdThGQzdcdTY1RTlcdThCQkZcdTk1RUUgRW52XHVGRjA5XHVGRjBDXHU2MjExXHU0RUVDXHU0RTVGXHU1RTBDXHU2NzFCXHU5MDFBXHU4RkM3XG4gICAgLy8gICAgbG9naWM6OmludmFsaWRfcGhhc2UgXHU2M0QwXHU5MTkyXHUyMDFDXHU4QkY3XHU1QzA2IEVudiBcdThCQkZcdTk1RUVcdTc5RkJcdTUyQThcdTUyMzAgcnVuIFx1NkJCNVx1MjAxRFx1MzAwMlxuICAgIC8vXG4gICAgLy8gXHU3NTMxXHU0RThFXHU1RjUzXHU1MjREXHU1QjlFXHU3M0IwXHU2NUUwXHU2Q0Q1XHU1NzI4XHU2QjY0XHU1OTA0XHU1M0VGXHU5NzYwXHU1MjI0XHU2NUFEXHU4QzAzXHU3NTI4XHU1M0QxXHU3NTFGXHU3Njg0IHBoYXNlXHVGRjBDXHU4RkQ5XHU5MUNDXHU1M0VBXHU2NjJGXHU2M0QwXHU0RjlCXHU0RTAwXHU0RTJBXHU4ODY1XHU1MTQ1XHU2MDI3XHU3Njg0XG4gICAgLy8gXHU4QkNBXHU2NUFEXHU0RkUxXHU1M0Y3XHVGRjBDXHU3NzFGXHU2QjYzXHU3Njg0IHBoYXNlIFx1NUI4OFx1NTM2Qlx1NEVDRFx1NzUzMSBMb2dpY1BoYXNlRXJyb3IgKyBlbWl0SW52YWxpZFBoYXNlRGlhZ25vc3RpY0lmTmVlZGVkIFx1NjI3Rlx1NjJDNVx1MzAwMlxuICAgIHlpZWxkKiBEZWJ1Zy5yZWNvcmQoe1xuICAgICAgdHlwZTogXCJkaWFnbm9zdGljXCIsXG4gICAgICBtb2R1bGVJZCxcbiAgICAgIGNvZGU6IFwibG9naWM6OmludmFsaWRfcGhhc2VcIixcbiAgICAgIHNldmVyaXR5OiBcImVycm9yXCIsXG4gICAgICBtZXNzYWdlOiBcIiQudXNlIGlzIG5vdCBhbGxvd2VkIGJlZm9yZSBFbnYgaXMgZnVsbHkgcmVhZHkuXCIsXG4gICAgICBoaW50OlxuICAgICAgICBcInNldHVwIFx1NkJCNVx1NjIxNiBFbnYgXHU2NzJBXHU1QjhDXHU1MTY4XHU1QzMxXHU3RUVBXHU2NUY2XHU4QkY3XHU5MDdGXHU1MTREXHU3NkY0XHU2M0E1XHU4QkZCXHU1M0Q2IFNlcnZpY2VcdUZGMUJcIiArXG4gICAgICAgIFwiXHU1RUZBXHU4QkFFXHU1QzA2XHU1QkY5IEVudiBcdTc2ODRcdThCQkZcdTk1RUVcdTc5RkJcdTUyQThcdTUyMzAgTG9naWMgXHU3Njg0IHJ1biBcdTZCQjVcdUZGMENcdTYyMTZcdTkwMUFcdThGQzcgJC5saWZlY3ljbGUub25Jbml0UmVxdWlyZWQgXHU1MzA1XHU4OEM1XHU1MjFEXHU1OUNCXHU1MzE2XHU2RDQxXHU3QTBCXHUzMDAyXCIsXG4gICAgICBraW5kOiBcImVudl9zZXJ2aWNlX25vdF9yZWFkeVwiLFxuICAgIH0pXG4gIH0pXG5cbmV4cG9ydCBpbnRlcmZhY2UgTG9naWNQaGFzZUVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICByZWFkb25seSBfdGFnOiBcIkxvZ2ljUGhhc2VFcnJvclwiXG4gIHJlYWRvbmx5IGtpbmQ6IHN0cmluZ1xuICByZWFkb25seSBhcGk/OiBzdHJpbmdcbiAgcmVhZG9ubHkgcGhhc2U6IFwic2V0dXBcIiB8IFwicnVuXCJcbiAgcmVhZG9ubHkgbW9kdWxlSWQ/OiBzdHJpbmdcbn1cblxuZXhwb3J0IGludGVyZmFjZSBMb2dpY1BoYXNlU2VydmljZSB7XG4gIHJlYWRvbmx5IGN1cnJlbnQ6IFwic2V0dXBcIiB8IFwicnVuXCJcbn1cblxuZXhwb3J0IGNvbnN0IExvZ2ljUGhhc2VTZXJ2aWNlVGFnID0gQ29udGV4dC5HZW5lcmljVGFnPExvZ2ljUGhhc2VTZXJ2aWNlPihcbiAgXCJAbG9naXgvTG9naWNQaGFzZVNlcnZpY2VcIlxuKVxuXG4vKipcbiAqIExvZ2ljVW5pdFNlcnZpY2VcdUZGMUFcbiAqIC0gXHU1NzI4XHU2MjY3XHU4ODRDXHU2QkNGXHU0RTJBIG1vdW50ZWQgbG9naWMgXHU2NUY2XHU2Q0U4XHU1MTY1XHVGRjA4c2NvcGUgPSBcdTUzNTVcdTRFMkEgbG9naWMgXHU3Njg0IHNldHVwL3J1biBmaWJlclx1RkYwOVx1RkYxQlxuICogLSBcdTc1MjhcdTRFOEUgdHJhaXRzIHByb3ZlbmFuY2UgXHU3QjQ5XHUyMDFDXHU0RTBFXHU1RjUzXHU1MjREXHU5MDNCXHU4RjkxXHU1MzU1XHU1MTQzXHU3RUQxXHU1QjlBXHUyMDFEXHU3Njg0XHU0RkUxXHU2MDZGXHVGRjA4XHU1QkY5XHU5RjUwIDAyMi1tb2R1bGUgXHU3Njg0IGxvZ2ljVW5pdElkXHVGRjA5XHUzMDAyXG4gKlxuICogXHU3RUE2XHU2NzVGXHVGRjFBXG4gKiAtIFx1N0VBRlx1NTNFQVx1OEJGQlx1RkYwOFx1NEUwRFx1NUY5N1x1NTE5OVx1NTE2NSBydW50aW1lIHN0YXRlXHVGRjA5XHVGRjFCXHU0RUM1XHU0RjVDXHU0RTNBIHByb3ZlbmFuY2UvXHU4QkNBXHU2NUFEXHU5NTFBXHU3MEI5XHUzMDAyXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTG9naWNVbml0U2VydmljZSB7XG4gIHJlYWRvbmx5IGxvZ2ljVW5pdElkOiBzdHJpbmdcbiAgcmVhZG9ubHkgbG9naWNVbml0SWRLaW5kOiBcImV4cGxpY2l0XCIgfCBcImRlcml2ZWRcIlxuICByZWFkb25seSBsb2dpY1VuaXRMYWJlbDogc3RyaW5nXG4gIHJlYWRvbmx5IHBhdGg/OiBzdHJpbmdcbn1cblxuZXhwb3J0IGNsYXNzIExvZ2ljVW5pdFNlcnZpY2VUYWcgZXh0ZW5kcyBDb250ZXh0LlRhZyhcIkBsb2dpeC9Mb2dpY1VuaXRTZXJ2aWNlXCIpPFxuICBMb2dpY1VuaXRTZXJ2aWNlVGFnLFxuICBMb2dpY1VuaXRTZXJ2aWNlXG4+KCkge31cblxuZXhwb3J0IGNvbnN0IG1ha2VMb2dpY1BoYXNlRXJyb3IgPSAoXG4gIGtpbmQ6IHN0cmluZyxcbiAgYXBpOiBzdHJpbmcsXG4gIHBoYXNlOiBcInNldHVwXCIgfCBcInJ1blwiLFxuICBtb2R1bGVJZD86IHN0cmluZ1xuKTogTG9naWNQaGFzZUVycm9yID0+XG4gIE9iamVjdC5hc3NpZ24oXG4gICAgbmV3IEVycm9yKFxuICAgICAgYFtMb2dpY1BoYXNlRXJyb3JdICR7YXBpfSBpcyBub3QgYWxsb3dlZCBpbiAke3BoYXNlfSBwaGFzZSAoa2luZD0ke2tpbmR9KS5gXG4gICAgKSxcbiAgICB7XG4gICAgICBfdGFnOiBcIkxvZ2ljUGhhc2VFcnJvclwiLFxuICAgICAga2luZCxcbiAgICAgIGFwaSxcbiAgICAgIHBoYXNlLFxuICAgICAgbW9kdWxlSWQsXG4gICAgfVxuICApIGFzIExvZ2ljUGhhc2VFcnJvclxuXG4vKipcbiAqIFx1NEVDRSBDYXVzZSBcdTRFMkRcdTYzRDBcdTUzRDYgTG9naWNQaGFzZUVycm9yXHVGRjBDXHU1RTc2XHU0RUU1IGRpYWdub3N0aWMgXHU1RjYyXHU1RjBGXHU1M0QxXHU1MUZBXHVGRjFBXG4gKiAtIGNvZGU6IGxvZ2ljOjppbnZhbGlkX3BoYXNlXG4gKiAtIGtpbmQ6IFx1NTE3N1x1NEY1M1x1OEZERFx1ODlDNFx1N0M3Qlx1NTc4Qlx1RkYwOFx1NTk4MiB1c2VfaW5fc2V0dXBcdUZGMDlcbiAqL1xuZXhwb3J0IGNvbnN0IGVtaXRJbnZhbGlkUGhhc2VEaWFnbm9zdGljSWZOZWVkZWQgPSAoXG4gIGNhdXNlOiBDYXVzZS5DYXVzZTx1bmtub3duPixcbiAgbW9kdWxlSWQ/OiBzdHJpbmdcbik6IEVmZmVjdC5FZmZlY3Q8dm9pZD4gPT5cbiAgRWZmZWN0LmdlbihmdW5jdGlvbiogKCkge1xuICAgIGlmICghcGhhc2VEaWFnbm9zdGljc0VuYWJsZWQoKSkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgY29uc3QgYWxsRXJyb3JzID0gW1xuICAgICAgLi4uQ2F1c2UuZmFpbHVyZXMoY2F1c2UpLFxuICAgICAgLi4uQ2F1c2UuZGVmZWN0cyhjYXVzZSksXG4gICAgXVxuXG4gICAgZm9yIChjb25zdCBlcnIgb2YgYWxsRXJyb3JzKSB7XG4gICAgICBjb25zdCBsb2dpY0VyciA9IGVyciBhcyBhbnlcbiAgICAgIGlmIChsb2dpY0VyciAmJiBsb2dpY0Vyci5fdGFnID09PSBcIkxvZ2ljUGhhc2VFcnJvclwiKSB7XG4gICAgICAgIGNvbnN0IHBoYXNlRXJyID0gbG9naWNFcnIgYXMgTG9naWNQaGFzZUVycm9yXG4gICAgICAgIGNvbnN0IGhpbnQgPVxuICAgICAgICAgIHBoYXNlRXJyLmtpbmQgPT09IFwidXNlX2luX3NldHVwXCIgfHxcbiAgICAgICAgICBwaGFzZUVyci5raW5kID09PSBcImxpZmVjeWNsZV9pbl9zZXR1cFwiXG4gICAgICAgICAgICA/IFwic2V0dXAgXHU2QkI1XHU3OTgxXHU2QjYyXHU4QkZCXHU1M0Q2IEVudi9TZXJ2aWNlIFx1NjIxNlx1NjI2N1x1ODg0Q1x1OTU3Rlx1NzUxRlx1NTQ3RFx1NTQ2OFx1NjcxRlx1OTAzQlx1OEY5MVx1RkYwQ1x1OEJGN1x1NUMwNlx1NzZGOFx1NTE3M1x1OEMwM1x1NzUyOFx1NzlGQlx1NTJBOFx1NTIzMCBydW4gXHU2QkI1XHUzMDAyXCJcbiAgICAgICAgICAgIDogcGhhc2VFcnIua2luZCA9PT0gXCJsaWZlY3ljbGVfaW5fcnVuXCJcbiAgICAgICAgICAgICAgPyBcInJ1biBcdTZCQjVcdTc5ODFcdTZCNjJcdTZDRThcdTUxOEMgJC5saWZlY3ljbGUuKlx1RkYwOHNldHVwLW9ubHlcdUZGMDlcdTMwMDJcdThCRjdcdTVDMDZcdTc1MUZcdTU0N0RcdTU0NjhcdTY3MUZcdTZDRThcdTUxOENcdTc5RkJcdTUyQThcdTUyMzAgTW9kdWxlLmxvZ2ljIGJ1aWxkZXIgXHU3Njg0XHU1NDBDXHU2QjY1XHU5MEU4XHU1MjA2XHVGRjA4cmV0dXJuIFx1NEU0Qlx1NTI0RFx1RkYwOVx1MzAwMlwiXG4gICAgICAgICAgICA6IHBoYXNlRXJyLmtpbmQgPT09IFwidHJhaXRzX2luX3J1blwiIHx8IHBoYXNlRXJyLmtpbmQgPT09IFwidHJhaXRzX2RlY2xhcmVfaW5fcnVuXCJcbiAgICAgICAgICAgICAgPyBcInNldHVwIFx1N0VEM1x1Njc1Rlx1NTQwRSB0cmFpdHMgXHU1REYyXHU1MUJCXHU3RUQzXHVGRjFCXHU4QkY3XHU1QzA2ICQudHJhaXRzLmRlY2xhcmUgXHU3OUZCXHU1MkE4XHU1MjMwIExvZ2ljUGxhbi5zZXR1cCBcdTYyMTYgTW9kdWxlLmxvZ2ljIGJ1aWxkZXIgXHU3Njg0IHNldHVwIFx1NkNFOFx1NTE4Q1x1OTYzNlx1NkJCNVx1MzAwMlwiXG4gICAgICAgICAgICA6IFwiXHU4QzAzXHU2NTc0XHU5MDNCXHU4RjkxXHU1MjMwIHJ1biBcdTZCQjVcdUZGMENzZXR1cCBcdTRFQzVcdTUwNUFcdTZDRThcdTUxOENcdTdDN0JcdTY0Q0RcdTRGNUNcdTMwMDJcIlxuXG4gICAgICAgIHlpZWxkKiBEZWJ1Zy5yZWNvcmQoe1xuICAgICAgICAgIHR5cGU6IFwiZGlhZ25vc3RpY1wiLFxuICAgICAgICAgIG1vZHVsZUlkOiBwaGFzZUVyci5tb2R1bGVJZCA/PyBtb2R1bGVJZCxcbiAgICAgICAgICBjb2RlOiBcImxvZ2ljOjppbnZhbGlkX3BoYXNlXCIsXG4gICAgICAgICAgc2V2ZXJpdHk6IFwiZXJyb3JcIixcbiAgICAgICAgICBtZXNzYWdlOiBgJHtwaGFzZUVyci5hcGkgPz8gcGhhc2VFcnIua2luZH0gaXMgbm90IGFsbG93ZWQgaW4gJHtwaGFzZUVyci5waGFzZX0gcGhhc2UuYCxcbiAgICAgICAgICBoaW50LFxuICAgICAgICAgIGtpbmQ6IHBoYXNlRXJyLmtpbmQsXG4gICAgICAgIH0pXG5cbiAgICAgICAgLy8gXHU1NDdEXHU0RTJEXHU5OTk2XHU0RTJBIExvZ2ljUGhhc2VFcnJvciBcdTUzNzNcdTUzRUZcdThGRDRcdTU2REVcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG4gICAgfVxuICB9KVxuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBSUEsSUFBTSxvQkFBb0IsQ0FBQyxTQUErQztBQUN4RSxNQUFJLE9BQU8sU0FBUyxVQUFVO0FBQzVCLFVBQU0sVUFBVSxLQUFLLEtBQUs7QUFDMUIsV0FBTyxRQUFRLFNBQVMsSUFBSSxVQUFVO0FBQUEsRUFDeEM7QUFFQSxNQUFJLENBQUMsTUFBTSxRQUFRLElBQUksRUFBRyxRQUFPO0FBRWpDLFFBQU0sUUFBdUIsQ0FBQztBQUM5QixhQUFXLE9BQU8sTUFBTTtBQUN0QixRQUFJLE9BQU8sUUFBUSxVQUFVO0FBQzNCLFVBQUksSUFBSSxTQUFTLEVBQUcsT0FBTSxLQUFLLEdBQUc7QUFDbEM7QUFBQSxJQUNGO0FBQ0EsUUFBSSxPQUFPLFFBQVEsWUFBWSxPQUFPLFNBQVMsR0FBRyxHQUFHO0FBQ25ELFlBQU0sS0FBSyxPQUFPLEtBQUssTUFBTSxHQUFHLENBQUMsQ0FBQztBQUNsQztBQUFBLElBQ0Y7QUFBQSxFQUNGO0FBRUEsTUFBSSxNQUFNLFdBQVcsRUFBRyxRQUFPO0FBQy9CLFNBQU8sTUFBTSxLQUFLLEdBQUc7QUFDdkI7QUFFTyxJQUFNLHVCQUF1QixDQUNsQyxNQUNBLFlBQ21GO0FBQ25GLFFBQU0sTUFBTSxPQUFPLE1BQU0sU0FBZ0I7QUFBQSxJQUN2QyxlQUFlO0FBQUEsTUFDYixhQUFhO0FBQUEsTUFDYix1QkFBdUI7QUFBQSxJQUN6QjtBQUFBLEVBQ0YsQ0FBQztBQUVELE1BQUksQ0FBQyxNQUFNLFFBQVEsR0FBRyxHQUFHO0FBQ3ZCLFdBQU8sRUFBRSxXQUFXLEtBQVUsWUFBWSxDQUFDLEVBQUU7QUFBQSxFQUMvQztBQUVBLFFBQU0sWUFBWSxJQUFJLENBQUM7QUFDdkIsUUFBTSxVQUFXLElBQUksQ0FBQyxLQUFLLENBQUM7QUFFNUIsUUFBTSxNQUFNLG9CQUFJLElBQXFC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RjtBQUFBLFFBQ0Y7QUFDQSxZQUFJLE9BQU8sUUFBUSxZQUFZLFFBQVEsTUFBTTtBQUMzQyxjQUFJLFVBQVUsS0FBSztBQUNqQixtQkFBTztBQUFBLGNBQ0wsUUFBUSxTQUFTO0FBQUEsZ0JBQ2YsT0FBTyxPQUFPLENBQUMsTUFBVyxFQUFFLFNBQVUsSUFBWSxJQUFJO0FBQUEsY0FDeEQ7QUFBQSxjQUNBLE9BQVEsSUFBWSxJQUFJO0FBQUEsWUFDMUI7QUFBQSxVQUNGO0FBQ0EsY0FBSSxPQUFPLFNBQVMsR0FBRyxHQUFHO0FBQ3hCLG1CQUFPO0FBQUEsY0FDTCxRQUFRLFNBQVM7QUFBQSxnQkFDZixPQUFPLE9BQU8sQ0FBQyxNQUFXO0FBQ3hCLHdCQUFNLFNBQVMsT0FBTztBQUFBLG9CQUNwQjtBQUFBLGtCQUNGLEVBQUUsQ0FBQztBQUNILHlCQUFPLENBQUMsQ0FBQztBQUFBLGdCQUNYLENBQUM7QUFBQSxjQUNIO0FBQUEsWUFDRjtBQUFBLFVBQ0Y7QUFBQSxRQUNGO0FBQ0EsZUFBTyxvQkFBb0IsUUFBUSxRQUFRO0FBQUEsTUFDN0M7QUFBQSxNQUNBLEtBQUssQ0FBQyxTQUFTLFNBQVM7QUFDdEIscUJBQWEsZ0JBQWdCLFlBQVk7QUFDekMsWUFBSSxPQUFPLFNBQVMsVUFBVTtBQUM1QixpQkFBTztBQUFBLFlBQ0wsUUFBUSxTQUFTO0FBQUEsY0FDZixPQUFPO0FBQUEsZ0JBQ0wsQ0FBQyxNQUFXLEVBQUUsU0FBUyxRQUFRLEVBQUUsU0FBUztBQUFBLGNBQzVDO0FBQUEsWUFDRjtBQUFBLFlBQ0E7QUFBQSxVQUNGO0FBQUEsUUFDRjtBQUNBLGVBQU87QUFBQSxNQUNUO0FBQUEsSUFDRixDQUFDO0FBQUEsSUFDRCxTQUFTLENBQ1AsYUFDRztBQUNILG1CQUFhLGdCQUFnQixXQUFXO0FBQ3hDLGFBQU8sb0JBQW9CLFFBQVEsUUFBUSxRQUFRLENBQUM7QUFBQSxJQUN0RDtBQUFBLElBQ0EsSUFBSSxDQUNGLFdBQ0c7QUFDSCxtQkFBYSxnQkFBZ0IsTUFBTTtBQUNuQyxhQUFPLG9CQUFvQixNQUFNO0FBQUEsSUFDbkM7QUFBQSxFQUNGO0FBRUEsb0JBQWtCLEtBQVksZ0JBQWdCO0FBRTlDLFNBQU87QUFDVDsiLAogICJuYW1lcyI6IFsiQ29udGV4dCIsICJFZmZlY3QiLCAiQ2F1c2UiLCAiQ29udGV4dCIsICJFZmZlY3QiLCAiRWZmZWN0IiwgIkNhdXNlIiwgIkNvbnRleHQiLCAiRWZmZWN0IiwgIm1ha2UiLCAiYXBpIiwgIkNvbnRleHQiXQp9Cg==