@logixjs/sandbox 0.0.1 → 0.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (248) hide show
  1. package/LICENSE +201 -0
  2. package/package.json +3 -1
  3. package/public/sandbox/chunks/chunk-2AUQRESB.js +1114 -0
  4. package/public/sandbox/chunks/chunk-2F72LQKW.js +194 -0
  5. package/public/sandbox/chunks/chunk-2PYDGDD3.js +4071 -0
  6. package/public/sandbox/chunks/chunk-2UGKSXDZ.js +16 -0
  7. package/public/sandbox/chunks/chunk-2XVE7F26.js +153 -0
  8. package/public/sandbox/chunks/chunk-3A7TFNZN.js +219 -0
  9. package/public/sandbox/chunks/chunk-3BHC6JAV.js +1070 -0
  10. package/public/sandbox/chunks/chunk-3U4CAKCX.js +61 -0
  11. package/public/sandbox/chunks/chunk-3VU3JLZO.js +272 -0
  12. package/public/sandbox/chunks/chunk-4CPONKWY.js +1170 -0
  13. package/public/sandbox/chunks/chunk-4GMUQTWH.js +850 -0
  14. package/public/sandbox/chunks/chunk-4KIYG5E4.js +749 -0
  15. package/public/sandbox/chunks/chunk-4MY35XR3.js +175 -0
  16. package/public/sandbox/chunks/chunk-5DNHJMHA.js +69 -0
  17. package/public/sandbox/chunks/chunk-5EC4S7X6.js +42 -0
  18. package/public/sandbox/chunks/chunk-5FB7QFSH.js +227 -0
  19. package/public/sandbox/chunks/chunk-5GEYCJW2.js +206 -0
  20. package/public/sandbox/chunks/chunk-5PT7Q5SS.js +373 -0
  21. package/public/sandbox/chunks/chunk-5WN5IGKA.js +166 -0
  22. package/public/sandbox/chunks/chunk-5XOBKSOT.js +213 -0
  23. package/public/sandbox/chunks/chunk-67RVISUC.js +313 -0
  24. package/public/sandbox/chunks/chunk-6ELJEKZS.js +12 -0
  25. package/public/sandbox/chunks/chunk-6FKWRVP4.js +85 -0
  26. package/public/sandbox/chunks/chunk-6JRP52YT.js +34 -0
  27. package/public/sandbox/chunks/chunk-6JYAC3G6.js +42 -0
  28. package/public/sandbox/chunks/chunk-6TUOP63Q.js +86 -0
  29. package/public/sandbox/chunks/{chunk-A6JFUNQQ.js → chunk-74C5VW7Z.js} +2 -2
  30. package/public/sandbox/chunks/chunk-75DQFC5M.js +16 -0
  31. package/public/sandbox/chunks/{chunk-UCFEP3BH.js → chunk-7GPAF2UK.js} +1 -1
  32. package/public/sandbox/chunks/chunk-7KQFTS2Y.js +135 -0
  33. package/public/sandbox/chunks/chunk-7POKWYE3.js +112 -0
  34. package/public/sandbox/chunks/chunk-7VUEF5F3.js +395 -0
  35. package/public/sandbox/chunks/chunk-7W5APZS2.js +77 -0
  36. package/public/sandbox/chunks/chunk-A6OFCXDQ.js +397 -0
  37. package/public/sandbox/chunks/chunk-A7HLOSO6.js +216 -0
  38. package/public/sandbox/chunks/chunk-AGF4RRCB.js +408 -0
  39. package/public/sandbox/chunks/chunk-ASJSJAAL.js +122 -0
  40. package/public/sandbox/chunks/chunk-ASVMK364.js +283 -0
  41. package/public/sandbox/chunks/chunk-AUDTI2BQ.js +895 -0
  42. package/public/sandbox/chunks/chunk-B2SZTA3M.js +16 -0
  43. package/public/sandbox/chunks/chunk-B6YS2UMV.js +372 -0
  44. package/public/sandbox/chunks/chunk-BCEO3MGD.js +244 -0
  45. package/public/sandbox/chunks/chunk-BCOO65D4.js +373 -0
  46. package/public/sandbox/chunks/chunk-BJOWSSEL.js +38 -0
  47. package/public/sandbox/chunks/chunk-BS2WBFW4.js +373 -0
  48. package/public/sandbox/chunks/chunk-BUVHG3NJ.js +439 -0
  49. package/public/sandbox/chunks/chunk-BVE33AN6.js +42 -0
  50. package/public/sandbox/chunks/chunk-BWTGJZVP.js +19 -0
  51. package/public/sandbox/chunks/chunk-BXD7GZC3.js +1025 -0
  52. package/public/sandbox/chunks/chunk-BZH4EUUD.js +164 -0
  53. package/public/sandbox/chunks/{chunk-HFV5GJPK.js → chunk-C2MYMMO4.js} +3 -3
  54. package/public/sandbox/chunks/chunk-CRE4NJJ6.js +271 -0
  55. package/public/sandbox/chunks/chunk-CVZPRIDB.js +706 -0
  56. package/public/sandbox/chunks/chunk-CWOXD5NG.js +991 -0
  57. package/public/sandbox/chunks/chunk-D6DOC3BJ.js +373 -0
  58. package/public/sandbox/chunks/chunk-DEPSGFSY.js +1698 -0
  59. package/public/sandbox/chunks/chunk-DM7C5NP5.js +819 -0
  60. package/public/sandbox/chunks/chunk-DN33LMOF.js +1112 -0
  61. package/public/sandbox/chunks/{chunk-S46P7MC6.js → chunk-DT7YIIWE.js} +2 -2
  62. package/public/sandbox/chunks/chunk-DVB5WRCI.js +260 -0
  63. package/public/sandbox/chunks/{chunk-TOHCFMQS.js → chunk-E3EVW7NR.js} +11 -18
  64. package/public/sandbox/chunks/chunk-E5BV567Q.js +417 -0
  65. package/public/sandbox/chunks/chunk-E7BIWMQQ.js +203 -0
  66. package/public/sandbox/chunks/chunk-EAKGPSOQ.js +83 -0
  67. package/public/sandbox/chunks/chunk-EGUYL2ER.js +75 -0
  68. package/public/sandbox/chunks/chunk-EP5GQYZ5.js +85 -0
  69. package/public/sandbox/chunks/chunk-ET6CJEHC.js +221 -0
  70. package/public/sandbox/chunks/chunk-EU67YZHZ.js +1070 -0
  71. package/public/sandbox/chunks/{chunk-PTSJJANP.js → chunk-EYNDQLSB.js} +1 -1
  72. package/public/sandbox/chunks/{chunk-CEGSWZ5S.js → chunk-EZTMVCJF.js} +1 -1
  73. package/public/sandbox/chunks/chunk-F5CLVIS6.js +907 -0
  74. package/public/sandbox/chunks/chunk-F743SKYD.js +85 -0
  75. package/public/sandbox/chunks/chunk-FEGFZ5OX.js +86 -0
  76. package/public/sandbox/chunks/chunk-FG5B7ZX3.js +373 -0
  77. package/public/sandbox/chunks/chunk-FKZPYMDG.js +373 -0
  78. package/public/sandbox/chunks/chunk-FNLXHWIU.js +220 -0
  79. package/public/sandbox/chunks/chunk-FQRUTYAD.js +1991 -0
  80. package/public/sandbox/chunks/{chunk-VLYP4WUS.js → chunk-FY5A73NK.js} +5 -5
  81. package/public/sandbox/chunks/chunk-G7FAOG3O.js +221 -0
  82. package/public/sandbox/chunks/chunk-GFXHUC7Y.js +73 -0
  83. package/public/sandbox/chunks/chunk-GIPXUIZQ.js +534 -0
  84. package/public/sandbox/chunks/chunk-GP37MEGJ.js +52 -0
  85. package/public/sandbox/chunks/chunk-GXL5QCMF.js +4511 -0
  86. package/public/sandbox/chunks/chunk-GZ2NSE6A.js +177 -0
  87. package/public/sandbox/chunks/chunk-GZATW4YD.js +69 -0
  88. package/public/sandbox/chunks/chunk-H4EBXROQ.js +166 -0
  89. package/public/sandbox/chunks/chunk-HETCPK6Z.js +153 -0
  90. package/public/sandbox/chunks/chunk-HGUFQ2QC.js +4431 -0
  91. package/public/sandbox/chunks/chunk-HGV3VNH3.js +255 -0
  92. package/public/sandbox/chunks/chunk-HIJ67QWR.js +5397 -0
  93. package/public/sandbox/chunks/chunk-IDHERBKW.js +1114 -0
  94. package/public/sandbox/chunks/chunk-IDTK4FIY.js +102 -0
  95. package/public/sandbox/chunks/chunk-ILFVY7H5.js +164 -0
  96. package/public/sandbox/chunks/chunk-ISGSRYGO.js +57 -0
  97. package/public/sandbox/chunks/chunk-J45VPU24.js +408 -0
  98. package/public/sandbox/chunks/chunk-JAUIM3O5.js +42 -0
  99. package/public/sandbox/chunks/chunk-JB7OQEM6.js +373 -0
  100. package/public/sandbox/chunks/chunk-JCKW6NHD.js +15 -0
  101. package/public/sandbox/chunks/chunk-JMA7GY7Z.js +221 -0
  102. package/public/sandbox/chunks/chunk-JY46J6IL.js +836 -0
  103. package/public/sandbox/chunks/{chunk-X72PZOFA.js → chunk-K2MQ66O7.js} +1 -1
  104. package/public/sandbox/chunks/chunk-KA7PZA6F.js +464 -0
  105. package/public/sandbox/chunks/chunk-KDEQTUID.js +102 -0
  106. package/public/sandbox/chunks/chunk-KDJR27JV.js +1696 -0
  107. package/public/sandbox/chunks/chunk-KFE3JO6N.js +77 -0
  108. package/public/sandbox/chunks/chunk-KLDSYWT5.js +536 -0
  109. package/public/sandbox/chunks/chunk-KQWWFYBF.js +203 -0
  110. package/public/sandbox/chunks/chunk-KTFZSXOW.js +6473 -0
  111. package/public/sandbox/chunks/chunk-KXVIC55U.js +108 -0
  112. package/public/sandbox/chunks/{chunk-HNEDTEGQ.js → chunk-L4PNO2H6.js} +1 -1
  113. package/public/sandbox/chunks/{chunk-WE4STGO2.js → chunk-L4ZNW5DI.js} +2 -2
  114. package/public/sandbox/chunks/chunk-LBUINGZ4.js +836 -0
  115. package/public/sandbox/chunks/chunk-LIYPPU6I.js +112 -0
  116. package/public/sandbox/chunks/chunk-LJHTOJXW.js +221 -0
  117. package/public/sandbox/chunks/{chunk-BWSNPKO5.js → chunk-LQL23SWJ.js} +2 -2
  118. package/public/sandbox/chunks/chunk-LTFCYZQ6.js +46 -0
  119. package/public/sandbox/chunks/chunk-LTWLVCKQ.js +166 -0
  120. package/public/sandbox/chunks/chunk-LWI7BXFN.js +395 -0
  121. package/public/sandbox/chunks/chunk-LYBBX6WM.js +225 -0
  122. package/public/sandbox/chunks/chunk-MXE7HIBM.js +474 -0
  123. package/public/sandbox/chunks/chunk-MYBDYNK4.js +6004 -0
  124. package/public/sandbox/chunks/chunk-NC2MIWZX.js +732 -0
  125. package/public/sandbox/chunks/chunk-NE447XAF.js +597 -0
  126. package/public/sandbox/chunks/chunk-NEAYV5C2.js +255 -0
  127. package/public/sandbox/chunks/chunk-NMGFJZ4I.js +26 -0
  128. package/public/sandbox/chunks/chunk-NWCJJZNQ.js +71 -0
  129. package/public/sandbox/chunks/chunk-O57OZBDR.js +214 -0
  130. package/public/sandbox/chunks/chunk-OJJT664Q.js +731 -0
  131. package/public/sandbox/chunks/chunk-OKTBUTCH.js +1175 -0
  132. package/public/sandbox/chunks/chunk-OQ4SYV5D.js +534 -0
  133. package/public/sandbox/chunks/chunk-OTVVIHJD.js +219 -0
  134. package/public/sandbox/chunks/chunk-OWTMSCF7.js +1052 -0
  135. package/public/sandbox/chunks/chunk-P5ZQNFC3.js +122 -0
  136. package/public/sandbox/chunks/chunk-PBPT2U2N.js +1698 -0
  137. package/public/sandbox/chunks/chunk-PHBJLCP3.js +836 -0
  138. package/public/sandbox/chunks/chunk-PHV4HYHB.js +397 -0
  139. package/public/sandbox/chunks/chunk-PIXQ6SOX.js +4071 -0
  140. package/public/sandbox/chunks/chunk-PKJL6YLK.js +73 -0
  141. package/public/sandbox/chunks/chunk-PKPOITIU.js +221 -0
  142. package/public/sandbox/chunks/{chunk-NQW73ACJ.js → chunk-PMXBOYQI.js} +1 -1
  143. package/public/sandbox/chunks/chunk-PQLZD7NR.js +836 -0
  144. package/public/sandbox/chunks/chunk-QEESVOZU.js +16 -0
  145. package/public/sandbox/chunks/chunk-QGIM3FQK.js +159 -0
  146. package/public/sandbox/chunks/chunk-QL5JNEDO.js +69 -0
  147. package/public/sandbox/chunks/chunk-QQOZ3RMH.js +867 -0
  148. package/public/sandbox/chunks/chunk-QUMEVT2F.js +194 -0
  149. package/public/sandbox/chunks/chunk-QVZBXYVY.js +102 -0
  150. package/public/sandbox/chunks/chunk-R5HQS6RB.js +135 -0
  151. package/public/sandbox/chunks/chunk-R75Q2CTT.js +900 -0
  152. package/public/sandbox/chunks/chunk-RBB6SHW2.js +253 -0
  153. package/public/sandbox/chunks/chunk-RDHNRWQP.js +383 -0
  154. package/public/sandbox/chunks/chunk-RIWOEI3T.js +1101 -0
  155. package/public/sandbox/chunks/chunk-RS5FFPUV.js +103 -0
  156. package/public/sandbox/chunks/chunk-RYSSJBGX.js +203 -0
  157. package/public/sandbox/chunks/chunk-S3KBAE5Z.js +1114 -0
  158. package/public/sandbox/chunks/chunk-S6ZZHV6G.js +244 -0
  159. package/public/sandbox/chunks/chunk-SFXJ24HY.js +499 -0
  160. package/public/sandbox/chunks/chunk-SH7TP5CJ.js +1109 -0
  161. package/public/sandbox/chunks/chunk-SI5OKFFY.js +317 -0
  162. package/public/sandbox/chunks/chunk-SIXNQNIR.js +86 -0
  163. package/public/sandbox/chunks/chunk-ST353BOX.js +42 -0
  164. package/public/sandbox/chunks/chunk-SYEHKMLP.js +1140 -0
  165. package/public/sandbox/chunks/chunk-SZ4KQUJU.js +69 -0
  166. package/public/sandbox/chunks/{chunk-5SOP6EKV.js → chunk-SZI65PSP.js} +5 -10
  167. package/public/sandbox/chunks/chunk-T7RLTSMX.js +78 -0
  168. package/public/sandbox/chunks/chunk-TJ2RLUTW.js +57 -0
  169. package/public/sandbox/chunks/chunk-TJB73XPN.js +4071 -0
  170. package/public/sandbox/chunks/chunk-TXJCYO56.js +4046 -0
  171. package/public/sandbox/chunks/chunk-U5J3LCYI.js +731 -0
  172. package/public/sandbox/chunks/chunk-UABFN3NH.js +208 -0
  173. package/public/sandbox/chunks/chunk-UBMUY7WO.js +13 -0
  174. package/public/sandbox/chunks/chunk-UC27CE32.js +69 -0
  175. package/public/sandbox/chunks/chunk-UJGVDFZN.js +147 -0
  176. package/public/sandbox/chunks/chunk-UNVLTK4N.js +122 -0
  177. package/public/sandbox/chunks/chunk-UQKQ6V3V.js +208 -0
  178. package/public/sandbox/chunks/chunk-UZZBHWIO.js +703 -0
  179. package/public/sandbox/chunks/chunk-VKZIJERL.js +1114 -0
  180. package/public/sandbox/chunks/chunk-VQQEAGID.js +372 -0
  181. package/public/sandbox/chunks/{chunk-3LX3KIQQ.js → chunk-W365QUZ5.js} +3 -5
  182. package/public/sandbox/chunks/chunk-WJY2LSWG.js +1052 -0
  183. package/public/sandbox/chunks/chunk-WNOBN3DX.js +391 -0
  184. package/public/sandbox/chunks/chunk-X2Z5VYG3.js +245 -0
  185. package/public/sandbox/chunks/chunk-X74KU74D.js +959 -0
  186. package/public/sandbox/chunks/chunk-XE7ULSGQ.js +46 -0
  187. package/public/sandbox/chunks/chunk-XRXUJZ3X.js +431 -0
  188. package/public/sandbox/chunks/chunk-XWHIN7CC.js +85 -0
  189. package/public/sandbox/chunks/chunk-Y2TVGGVL.js +527 -0
  190. package/public/sandbox/chunks/chunk-YMVMZA3U.js +1395 -0
  191. package/public/sandbox/chunks/chunk-YOBLFWDV.js +431 -0
  192. package/public/sandbox/chunks/chunk-YR2RFEZA.js +11 -0
  193. package/public/sandbox/chunks/chunk-YTD6A35P.js +836 -0
  194. package/public/sandbox/chunks/chunk-Z5L7EZXS.js +81 -0
  195. package/public/sandbox/chunks/chunk-Z65I5ET2.js +108 -0
  196. package/public/sandbox/chunks/chunk-Z6LV34RO.js +390 -0
  197. package/public/sandbox/chunks/chunk-ZAKUP6QG.js +1634 -0
  198. package/public/sandbox/chunks/chunk-ZHNYE2YH.js +731 -0
  199. package/public/sandbox/chunks/chunk-ZHQX3B3Y.js +867 -0
  200. package/public/sandbox/chunks/chunk-ZIXDFRHJ.js +731 -0
  201. package/public/sandbox/chunks/chunk-ZPZ2MZ4D.js +528 -0
  202. package/public/sandbox/chunks/chunk-ZQD6NZXB.js +373 -0
  203. package/public/sandbox/chunks/chunk-ZVVBP7ON.js +16 -0
  204. package/public/sandbox/chunks/chunk-ZWE3P6X2.js +11 -0
  205. package/public/sandbox/logix-core/Bound.js +14 -14
  206. package/public/sandbox/logix-core/Debug.js +12 -10
  207. package/public/sandbox/logix-core/EffectOp.js +3 -4
  208. package/public/sandbox/logix-core/Env.js +5 -2
  209. package/public/sandbox/logix-core/ExternalStore.js +239 -0
  210. package/public/sandbox/logix-core/Flow.js +7 -8
  211. package/public/sandbox/logix-core/Kernel.js +7 -4
  212. package/public/sandbox/logix-core/Link.js +33 -25
  213. package/public/sandbox/logix-core/Middleware.js +13 -11
  214. package/public/sandbox/logix-core/Module.js +93 -30
  215. package/public/sandbox/logix-core/ModuleTag.js +28 -25
  216. package/public/sandbox/logix-core/Observability.js +21 -19
  217. package/public/sandbox/logix-core/Process.js +27 -22
  218. package/public/sandbox/logix-core/ReadQuery.js +7 -11
  219. package/public/sandbox/logix-core/Reflection.js +173 -53
  220. package/public/sandbox/logix-core/Resource.js +6 -3
  221. package/public/sandbox/logix-core/Root.js +7 -3
  222. package/public/sandbox/logix-core/Runtime.js +54 -40
  223. package/public/sandbox/logix-core/ScopeRegistry.js +6 -3
  224. package/public/sandbox/logix-core/StateTrait.js +17 -14
  225. package/public/sandbox/logix-core/TraitLifecycle.js +8 -8
  226. package/public/sandbox/logix-core/Workflow.js +332 -0
  227. package/public/sandbox/logix-core.js +11133 -6622
  228. package/public/sandbox/logix-core.manifest.json +4 -2
  229. package/public/sandbox/worker.js +3 -3
  230. package/public/sandbox/chunks/chunk-4LRLOTMA.js +0 -1698
  231. package/public/sandbox/chunks/chunk-CDLXJHXY.js +0 -120
  232. package/public/sandbox/chunks/chunk-CZRI7MHA.js +0 -46
  233. package/public/sandbox/chunks/chunk-EJDFUZ4B.js +0 -408
  234. package/public/sandbox/chunks/chunk-IP63FME6.js +0 -282
  235. package/public/sandbox/chunks/chunk-JIXTOQXJ.js +0 -1103
  236. package/public/sandbox/chunks/chunk-MPUSOFJ3.js +0 -1928
  237. package/public/sandbox/chunks/chunk-ON2LY6HJ.js +0 -135
  238. package/public/sandbox/chunks/chunk-POIBXAH5.js +0 -995
  239. package/public/sandbox/chunks/chunk-PQ652ULI.js +0 -6359
  240. package/public/sandbox/chunks/chunk-RJQ4PG2F.js +0 -77
  241. package/public/sandbox/chunks/chunk-S4EXG3OS.js +0 -533
  242. package/public/sandbox/chunks/chunk-SUXDGXVE.js +0 -390
  243. package/public/sandbox/chunks/chunk-TOQ6SJ6O.js +0 -244
  244. package/public/sandbox/chunks/chunk-UKYAF3NL.js +0 -1036
  245. package/public/sandbox/chunks/chunk-UMVN3AWO.js +0 -395
  246. package/public/sandbox/chunks/chunk-WFV5PPWJ.js +0 -194
  247. package/public/sandbox/chunks/chunk-YF6IO732.js +0 -206
  248. package/public/sandbox/chunks/chunk-ZUBABAAO.js +0 -86
@@ -1,1103 +0,0 @@
1
- // @logixjs/core subpath bundles for @logixjs/sandbox
2
-
3
- import {
4
- create
5
- } from "./chunk-KE2H62D6.js";
6
- import {
7
- forceSourceRefresh,
8
- inSyncTransactionFiber,
9
- makeTaskRunner
10
- } from "./chunk-WFV5PPWJ.js";
11
- import {
12
- Tag
13
- } from "./chunk-CTSYKMM6.js";
14
- import {
15
- resolve
16
- } from "./chunk-RJQ4PG2F.js";
17
- import {
18
- makeMatch,
19
- makeMatchTag
20
- } from "./chunk-GFOF7NCX.js";
21
- import {
22
- isActionToken
23
- } from "./chunk-DOBF6YTQ.js";
24
- import {
25
- isFieldPathSegment
26
- } from "./chunk-IP63FME6.js";
27
- import {
28
- getRuntimeInternals,
29
- setBoundInternals
30
- } from "./chunk-UCFEP3BH.js";
31
- import {
32
- isDevEnv
33
- } from "./chunk-CZRI7MHA.js";
34
- import {
35
- make
36
- } from "./chunk-VLYP4WUS.js";
37
- import {
38
- currentDiagnosticsLevel,
39
- record,
40
- toSerializableErrorSummary
41
- } from "./chunk-UKYAF3NL.js";
42
- import {
43
- RunSessionTag
44
- } from "./chunk-3LX3KIQQ.js";
45
-
46
- // ../logix-core/src/internal/runtime/core/mutativePatches.ts
47
- var mutateWithoutPatches = (base, mutator) => {
48
- return create(base, mutator);
49
- };
50
- var toPatchFieldPath = (path) => {
51
- if (typeof path === "string") {
52
- const trimmed = path.trim();
53
- return trimmed.length > 0 ? "*" : void 0;
54
- }
55
- if (!Array.isArray(path)) return void 0;
56
- const parts = [];
57
- for (const seg of path) {
58
- if (typeof seg === "string") {
59
- if (isFieldPathSegment(seg)) parts.push(seg);
60
- continue;
61
- }
62
- }
63
- if (parts.length === 0) return "*";
64
- return parts;
65
- };
66
- var mutateWithPatchPaths = (base, mutator) => {
67
- const out = create(base, mutator, {
68
- enablePatches: {
69
- pathAsArray: true,
70
- arrayLengthAssignment: false
71
- }
72
- });
73
- if (!Array.isArray(out)) {
74
- return { nextState: out, patchPaths: [] };
75
- }
76
- const nextState = out[0];
77
- const patches = out[1] ?? [];
78
- const dedup = /* @__PURE__ */ new Map();
79
- for (const patch of patches) {
80
- const p = toPatchFieldPath(patch?.path);
81
- if (!p) continue;
82
- const key = p === "*" ? "*" : JSON.stringify(p);
83
- if (!dedup.has(key)) dedup.set(key, p);
84
- }
85
- return {
86
- nextState,
87
- patchPaths: Array.from(dedup.values())
88
- };
89
- };
90
-
91
- // ../logix-core/src/internal/runtime/core/BoundApiRuntime.ts
92
- import { Context as Context3, Effect as Effect3, FiberRef, Option, Schema, Stream } from "../effect.js";
93
-
94
- // ../logix-core/src/internal/runtime/core/Lifecycle.ts
95
- import { Cause, Context, Effect, Ref } from "../effect.js";
96
- var LifecycleContext = Context.GenericTag("@logixjs/LifecycleManager");
97
- var safeRun = (label, eff) => eff.pipe(
98
- Effect.matchCauseEffect({
99
- onSuccess: () => Effect.void,
100
- onFailure: (cause) => Effect.logError(`[${label}] failed: ${Cause.pretty(cause)}`)
101
- })
102
- );
103
- var makeTaskId = (kind, order) => `${kind}:${order}`;
104
- var makeLifecycleManager = (identity) => Effect.gen(function* () {
105
- const budgets = {
106
- maxEventsPerInstance: 20,
107
- maxEventBytes: 4 * 1024
108
- };
109
- const statusRef = yield* Ref.make({
110
- identity,
111
- status: "creating"
112
- });
113
- const initRequired = [];
114
- const start = [];
115
- const destroy = [];
116
- const platformSuspend = [];
117
- const platformResume = [];
118
- const platformReset = [];
119
- const onErrorHandlers = [];
120
- const getStatus = Ref.get(statusRef);
121
- const recordPhase = (phase, name, payload) => record({
122
- type: "lifecycle:phase",
123
- moduleId: identity.moduleId,
124
- instanceId: identity.instanceId,
125
- phase,
126
- name,
127
- payload
128
- });
129
- const setStatus = (status, patch) => Ref.update(statusRef, (prev) => ({
130
- ...prev,
131
- identity: {
132
- ...prev.identity,
133
- ...patch?.runtimeLabel ? { runtimeLabel: patch.runtimeLabel } : null
134
- },
135
- status,
136
- ...patch?.initOutcome !== void 0 ? { initOutcome: patch.initOutcome } : null,
137
- ...patch?.initProgress !== void 0 ? { initProgress: patch.initProgress } : null
138
- }));
139
- const registerInitRequired = (effect, options) => {
140
- const order = initRequired.length;
141
- initRequired.push({
142
- taskId: makeTaskId("initRequired", order),
143
- kind: "initRequired",
144
- order,
145
- name: options?.name,
146
- effect
147
- });
148
- };
149
- const registerStart = (effect, options) => {
150
- const order = start.length;
151
- start.push({
152
- taskId: makeTaskId("start", order),
153
- kind: "start",
154
- order,
155
- name: options?.name,
156
- fatalOnFailure: options?.fatalOnFailure,
157
- effect
158
- });
159
- };
160
- const registerDestroy = (effect, options) => {
161
- const order = destroy.length;
162
- destroy.push({
163
- taskId: makeTaskId("destroy", order),
164
- kind: "destroy",
165
- order,
166
- name: options?.name,
167
- effect
168
- });
169
- };
170
- const registerOnError = (handler) => {
171
- onErrorHandlers.push(handler);
172
- };
173
- const registerPlatformSuspend = (effect, options) => {
174
- const order = platformSuspend.length;
175
- platformSuspend.push({
176
- taskId: makeTaskId("platformSuspend", order),
177
- kind: "platformSuspend",
178
- order,
179
- name: options?.name,
180
- effect
181
- });
182
- };
183
- const registerPlatformResume = (effect, options) => {
184
- const order = platformResume.length;
185
- platformResume.push({
186
- taskId: makeTaskId("platformResume", order),
187
- kind: "platformResume",
188
- order,
189
- name: options?.name,
190
- effect
191
- });
192
- };
193
- const registerPlatformReset = (effect, options) => {
194
- const order = platformReset.length;
195
- platformReset.push({
196
- taskId: makeTaskId("platformReset", order),
197
- kind: "platformReset",
198
- order,
199
- name: options?.name,
200
- effect
201
- });
202
- };
203
- const notifyError = (cause, context) => {
204
- if (Cause.isInterrupted(cause)) {
205
- return Effect.void;
206
- }
207
- return record({
208
- type: "lifecycle:error",
209
- moduleId: context.moduleId,
210
- instanceId: context.instanceId,
211
- cause,
212
- phase: context.phase,
213
- hook: context.hook,
214
- taskId: context.taskId,
215
- txnSeq: context.txnSeq,
216
- opSeq: context.opSeq,
217
- origin: context.origin
218
- }).pipe(
219
- Effect.zipRight(
220
- Effect.forEach(
221
- onErrorHandlers,
222
- (handler) => handler(cause, context).pipe(
223
- Effect.catchAllCause((inner) => Effect.logError(`[lifecycle.onError] failed: ${Cause.pretty(inner)}`))
224
- ),
225
- { discard: true }
226
- )
227
- )
228
- );
229
- };
230
- const runInitRequired = Effect.gen(function* () {
231
- const total = initRequired.length;
232
- if (total === 0) {
233
- yield* setStatus("ready", {
234
- initProgress: { total: 0, completed: 0 },
235
- initOutcome: { status: "success" }
236
- });
237
- return;
238
- }
239
- const startedAt = Date.now();
240
- yield* recordPhase("init", "initRequired:start", { total });
241
- yield* setStatus("initializing", {
242
- initProgress: { total, completed: 0, current: 0, startedAt }
243
- });
244
- let completed = 0;
245
- for (let i = 0; i < initRequired.length; i++) {
246
- yield* setStatus("initializing", {
247
- initProgress: { total, completed, current: i, startedAt }
248
- });
249
- const task = initRequired[i];
250
- const exit = yield* Effect.exit(task.effect);
251
- if (exit._tag === "Success") {
252
- completed += 1;
253
- yield* setStatus("initializing", {
254
- initProgress: { total, completed, current: i + 1, startedAt }
255
- });
256
- continue;
257
- }
258
- const summary = toSerializableErrorSummary(exit.cause);
259
- yield* notifyError(exit.cause, {
260
- phase: "init",
261
- hook: "initRequired",
262
- moduleId: identity.moduleId,
263
- instanceId: identity.instanceId,
264
- taskId: task.taskId,
265
- origin: "initRequired"
266
- });
267
- yield* setStatus("failed", {
268
- initProgress: { total, completed, current: i, startedAt },
269
- initOutcome: { status: "failure", error: summary.errorSummary }
270
- });
271
- return yield* Effect.failCause(exit.cause);
272
- }
273
- yield* recordPhase("init", "initRequired:success", { total });
274
- yield* setStatus("ready", {
275
- initProgress: { total, completed, current: total, startedAt },
276
- initOutcome: { status: "success" }
277
- });
278
- });
279
- const runStart = recordPhase("run", "start:schedule", {
280
- total: start.length
281
- }).pipe(
282
- Effect.zipRight(
283
- Effect.forEach(
284
- start,
285
- (task) => Effect.forkScoped(
286
- task.effect.pipe(
287
- Effect.catchAllCause(
288
- (cause) => notifyError(cause, {
289
- phase: "run",
290
- hook: "start",
291
- moduleId: identity.moduleId,
292
- instanceId: identity.instanceId,
293
- taskId: task.taskId,
294
- origin: "start"
295
- })
296
- )
297
- )
298
- ).pipe(Effect.asVoid),
299
- { discard: true, concurrency: "unbounded" }
300
- )
301
- )
302
- );
303
- const runDestroy = Effect.gen(function* () {
304
- yield* recordPhase("destroy", "destroy:start", { total: destroy.length });
305
- yield* setStatus("terminating");
306
- for (let i = destroy.length - 1; i >= 0; i--) {
307
- const task = destroy[i];
308
- yield* safeRun(
309
- "lifecycle.onDestroy",
310
- task.effect.pipe(
311
- Effect.catchAllCause(
312
- (cause) => notifyError(cause, {
313
- phase: "destroy",
314
- hook: "destroy",
315
- moduleId: identity.moduleId,
316
- instanceId: identity.instanceId,
317
- taskId: task.taskId,
318
- origin: "destroy"
319
- })
320
- )
321
- )
322
- );
323
- }
324
- yield* setStatus("terminated");
325
- yield* recordPhase("destroy", "destroy:done", { total: destroy.length });
326
- });
327
- const runPlatformSuspend = Effect.gen(function* () {
328
- if (platformSuspend.length === 0) return;
329
- yield* recordPhase("platform", "signal:suspend", { total: platformSuspend.length });
330
- for (const task of platformSuspend) {
331
- yield* safeRun(
332
- "lifecycle.onSuspend",
333
- task.effect.pipe(
334
- Effect.catchAllCause(
335
- (cause) => notifyError(cause, {
336
- phase: "platform",
337
- hook: "suspend",
338
- moduleId: identity.moduleId,
339
- instanceId: identity.instanceId,
340
- taskId: task.taskId,
341
- origin: "platform.suspend"
342
- })
343
- )
344
- )
345
- );
346
- }
347
- });
348
- const runPlatformResume = Effect.gen(function* () {
349
- if (platformResume.length === 0) return;
350
- yield* recordPhase("platform", "signal:resume", { total: platformResume.length });
351
- for (const task of platformResume) {
352
- yield* safeRun(
353
- "lifecycle.onResume",
354
- task.effect.pipe(
355
- Effect.catchAllCause(
356
- (cause) => notifyError(cause, {
357
- phase: "platform",
358
- hook: "resume",
359
- moduleId: identity.moduleId,
360
- instanceId: identity.instanceId,
361
- taskId: task.taskId,
362
- origin: "platform.resume"
363
- })
364
- )
365
- )
366
- );
367
- }
368
- });
369
- const runPlatformReset = Effect.gen(function* () {
370
- if (platformReset.length === 0) return;
371
- yield* recordPhase("platform", "signal:reset", { total: platformReset.length });
372
- for (const task of platformReset) {
373
- yield* safeRun(
374
- "lifecycle.onReset",
375
- task.effect.pipe(
376
- Effect.catchAllCause(
377
- (cause) => notifyError(cause, {
378
- phase: "platform",
379
- hook: "reset",
380
- moduleId: identity.moduleId,
381
- instanceId: identity.instanceId,
382
- taskId: task.taskId,
383
- origin: "platform.reset"
384
- })
385
- )
386
- )
387
- );
388
- }
389
- });
390
- const getTaskSnapshot = Effect.sync(() => ({
391
- initRequired: initRequired.map(({ effect: _eff, ...rest }) => rest),
392
- start: start.map(({ effect: _eff, ...rest }) => rest),
393
- destroy: destroy.map(({ effect: _eff, ...rest }) => rest),
394
- platformSuspend: platformSuspend.map(({ effect: _eff, ...rest }) => rest),
395
- platformResume: platformResume.map(({ effect: _eff, ...rest }) => rest),
396
- platformReset: platformReset.map(({ effect: _eff, ...rest }) => rest)
397
- }));
398
- const hasOnErrorHandlers = Effect.sync(() => onErrorHandlers.length > 0);
399
- return {
400
- identity,
401
- budgets,
402
- registerPlatformSuspend,
403
- registerPlatformResume,
404
- registerPlatformReset,
405
- registerInitRequired,
406
- registerStart,
407
- registerDestroy,
408
- registerOnError,
409
- getStatus,
410
- setStatus,
411
- notifyError,
412
- runPlatformSuspend,
413
- runPlatformResume,
414
- runPlatformReset,
415
- runInitRequired,
416
- runStart,
417
- runDestroy,
418
- hasOnErrorHandlers,
419
- getTaskSnapshot
420
- };
421
- });
422
-
423
- // ../logix-core/src/internal/runtime/core/LogicDiagnostics.ts
424
- import { Cause as Cause2, Context as Context2, Effect as Effect2 } from "../effect.js";
425
- var phaseDiagnosticsEnabled = () => isDevEnv();
426
- var SERVICE_NOT_FOUND_PREFIX = "Service not found:";
427
- var emitEnvServiceNotFoundDiagnosticIfNeeded = (cause, moduleId) => Effect2.gen(function* () {
428
- let pretty;
429
- try {
430
- pretty = Cause2.pretty(cause, { renderErrorCause: true });
431
- } catch {
432
- return;
433
- }
434
- if (!pretty.includes(SERVICE_NOT_FOUND_PREFIX)) {
435
- return;
436
- }
437
- yield* record({
438
- type: "diagnostic",
439
- moduleId,
440
- code: "logic::env_service_not_found",
441
- severity: "warning",
442
- message: pretty,
443
- hint: "Logic attempted to access an Env service before it was provided. This is a known initialization timing noise in Runtime/React integration. If it happens once during early startup and everything works afterward, it's likely harmless; if it persists or correlates with app issues, verify Runtime.make / RuntimeProvider.layer provides the service."
444
- });
445
- yield* record({
446
- type: "diagnostic",
447
- moduleId,
448
- code: "logic::invalid_phase",
449
- severity: "error",
450
- message: "$.use is not allowed before Env is fully ready.",
451
- hint: "Avoid reading services during setup or before Env is ready; move Env access to the Logic run section, or wrap init via $.lifecycle.onInitRequired.",
452
- kind: "env_service_not_ready"
453
- });
454
- });
455
- var LogicPhaseServiceTag = Context2.GenericTag("@logixjs/LogicPhaseService");
456
- var LogicUnitServiceTag = class extends Context2.Tag("@logixjs/LogicUnitService")() {
457
- };
458
- var makeLogicPhaseError = (kind, api, phase, moduleId) => Object.assign(new Error(`[LogicPhaseError] ${api} is not allowed in ${phase} phase (kind=${kind}).`), {
459
- _tag: "LogicPhaseError",
460
- kind,
461
- api,
462
- phase,
463
- moduleId
464
- });
465
- var emitInvalidPhaseDiagnosticIfNeeded = (cause, moduleId) => Effect2.gen(function* () {
466
- if (!phaseDiagnosticsEnabled()) {
467
- return;
468
- }
469
- const allErrors = [...Cause2.failures(cause), ...Cause2.defects(cause)];
470
- for (const err of allErrors) {
471
- const logicErr = err;
472
- if (logicErr && logicErr._tag === "LogicPhaseError") {
473
- const phaseErr = logicErr;
474
- const hint = phaseErr.kind === "use_in_setup" || phaseErr.kind === "lifecycle_in_setup" ? "The setup phase must not read Env/services or run long-lived logic; move the relevant calls to the run phase." : phaseErr.kind === "lifecycle_in_run" ? "Do not register $.lifecycle.* in the run phase (setup-only). Move lifecycle registrations to the synchronous part of Module.logic builder (before return)." : phaseErr.kind === "traits_in_run" || phaseErr.kind === "traits_declare_in_run" ? "Traits are frozen after setup; move $.traits.declare to LogicPlan.setup or the setup registration phase of Module.logic builder." : "Move logic to the run phase; keep setup for registrations only.";
475
- yield* record({
476
- type: "diagnostic",
477
- moduleId: phaseErr.moduleId ?? moduleId,
478
- code: "logic::invalid_phase",
479
- severity: "error",
480
- message: `${phaseErr.api ?? phaseErr.kind} is not allowed in ${phaseErr.phase} phase.`,
481
- hint,
482
- kind: phaseErr.kind
483
- });
484
- return;
485
- }
486
- }
487
- });
488
-
489
- // ../logix-core/src/internal/runtime/core/BoundApiRuntime.ts
490
- var LogicBuilderFactory = (runtime, runtimeInternals) => {
491
- const flowApi = make(runtime, runtimeInternals);
492
- return (stream, triggerName) => {
493
- const runWithStateTransaction = (origin, body) => runtimeInternals.txn.runWithStateTransaction(origin, body);
494
- const taskRunnerRuntime = {
495
- moduleId: runtime.moduleId,
496
- instanceId: runtimeInternals.instanceId,
497
- runWithStateTransaction,
498
- resolveConcurrencyPolicy: runtimeInternals.concurrency.resolveConcurrencyPolicy
499
- };
500
- const builder = {
501
- debounce: (ms) => LogicBuilderFactory(runtime, runtimeInternals)(flowApi.debounce(ms)(stream), triggerName),
502
- throttle: (ms) => LogicBuilderFactory(runtime, runtimeInternals)(flowApi.throttle(ms)(stream), triggerName),
503
- filter: (predicate) => LogicBuilderFactory(runtime, runtimeInternals)(flowApi.filter(predicate)(stream), triggerName),
504
- map: (f) => LogicBuilderFactory(runtime, runtimeInternals)(stream.pipe(Stream.map(f)), triggerName),
505
- run(eff, options) {
506
- return flowApi.run(eff, options)(stream);
507
- },
508
- runLatest(eff, options) {
509
- return flowApi.runLatest(eff, options)(stream);
510
- },
511
- runExhaust(eff, options) {
512
- return flowApi.runExhaust(eff, options)(stream);
513
- },
514
- runParallel(eff, options) {
515
- return flowApi.runParallel(eff, options)(stream);
516
- },
517
- runFork: (eff) => Effect3.forkScoped(flowApi.run(eff)(stream)).pipe(Effect3.asVoid),
518
- runParallelFork: (eff) => Effect3.forkScoped(flowApi.runParallel(eff)(stream)).pipe(Effect3.asVoid),
519
- runTask: (config) => makeTaskRunner(stream, "task", taskRunnerRuntime, {
520
- ...config,
521
- triggerName: config.triggerName ?? triggerName
522
- }),
523
- runParallelTask: (config) => makeTaskRunner(stream, "parallel", taskRunnerRuntime, {
524
- ...config,
525
- triggerName: config.triggerName ?? triggerName
526
- }),
527
- runLatestTask: (config) => makeTaskRunner(stream, "latest", taskRunnerRuntime, {
528
- ...config,
529
- triggerName: config.triggerName ?? triggerName
530
- }),
531
- runExhaustTask: (config) => makeTaskRunner(stream, "exhaust", taskRunnerRuntime, {
532
- ...config,
533
- triggerName: config.triggerName ?? triggerName
534
- }),
535
- toStream: () => stream,
536
- update: (reducer) => Stream.runForEach(
537
- stream,
538
- (payload) => taskRunnerRuntime.runWithStateTransaction(
539
- {
540
- kind: "watcher:update",
541
- name: triggerName
542
- },
543
- () => Effect3.gen(function* () {
544
- const prev = yield* runtime.getState;
545
- const next = reducer(prev, payload);
546
- if (Effect3.isEffect(next)) {
547
- const exit = yield* Effect3.exit(next);
548
- if (exit._tag === "Failure") {
549
- yield* Effect3.logError("Flow error", exit.cause);
550
- return;
551
- }
552
- yield* runtime.setState(exit.value);
553
- return;
554
- }
555
- yield* runtime.setState(next);
556
- })
557
- )
558
- ).pipe(Effect3.catchAllCause((cause) => Effect3.logError("Flow error", cause))),
559
- mutate: (reducer) => Stream.runForEach(
560
- stream,
561
- (payload) => taskRunnerRuntime.runWithStateTransaction(
562
- {
563
- kind: "watcher:mutate",
564
- name: triggerName
565
- },
566
- () => Effect3.gen(function* () {
567
- const prev = yield* runtime.getState;
568
- const recordPatch = runtimeInternals.txn.recordStatePatch;
569
- const updateDraft = runtimeInternals.txn.updateDraft;
570
- const { nextState, patchPaths } = mutateWithPatchPaths(prev, (draft) => {
571
- reducer(draft, payload);
572
- });
573
- for (const path of patchPaths) {
574
- recordPatch(path, "unknown");
575
- }
576
- updateDraft(nextState);
577
- })
578
- )
579
- ).pipe(Effect3.catchAllCause((cause) => Effect3.logError("Flow error", cause)))
580
- };
581
- const pipe = function() {
582
- const fns = arguments;
583
- let acc = builder;
584
- for (let i = 0; i < fns.length; i++) {
585
- acc = fns[i](acc);
586
- }
587
- return acc;
588
- };
589
- return Object.assign(builder, { pipe });
590
- };
591
- };
592
- function make2(shape, runtime, options) {
593
- const runtimeInternals = getRuntimeInternals(runtime);
594
- const getPhase = options?.getPhase ?? (() => "run");
595
- const getCurrentPhase = () => {
596
- const phaseService = options?.phaseService;
597
- const phase = phaseService?.current ?? getPhase();
598
- return phase === "setup" ? "setup" : "run";
599
- };
600
- const guardRunOnly = (kind, api2) => {
601
- const phaseService = options?.phaseService;
602
- const phase = phaseService?.current ?? getPhase();
603
- if (phase === "setup") {
604
- throw makeLogicPhaseError(kind, api2, "setup", options?.moduleId);
605
- }
606
- };
607
- const flowApi = make(runtime, runtimeInternals);
608
- const makeIntentBuilder = (runtime_) => LogicBuilderFactory(runtime_, runtimeInternals);
609
- const withLifecycle = (available, missing) => Effect3.serviceOption(LifecycleContext).pipe(
610
- Effect3.flatMap(
611
- (maybe) => Option.match(maybe, {
612
- onSome: available,
613
- onNone: missing
614
- })
615
- )
616
- );
617
- const withPlatform = (invoke) => Effect3.serviceOption(Tag).pipe(
618
- Effect3.flatMap(
619
- (maybe) => Option.match(maybe, {
620
- onSome: invoke,
621
- onNone: () => Effect3.void
622
- })
623
- )
624
- );
625
- const emitSetupOnlyViolation = (api2) => record({
626
- type: "diagnostic",
627
- moduleId: runtime.moduleId,
628
- instanceId: runtime.instanceId,
629
- code: "logic::invalid_phase",
630
- severity: "error",
631
- message: `${api2} is setup-only and is not allowed in run phase.`,
632
- hint: "Move $.lifecycle.* calls to the synchronous part of Module.logic builder (before return) for registration; for dynamic resource cleanup in the run phase, use Effect.acquireRelease / Scope finalizer instead of registering onDestroy late.",
633
- kind: "lifecycle_in_run"
634
- });
635
- const createIntentBuilder = (stream, triggerName) => makeIntentBuilder(runtime)(stream, triggerName);
636
- const onceInRunSession = (key) => Effect3.serviceOption(RunSessionTag).pipe(
637
- Effect3.map((maybe) => Option.isSome(maybe) ? maybe.value.local.once(key) : true)
638
- );
639
- let cachedDiagnosticsLevel;
640
- const isModuleLike = (value) => Boolean(
641
- value && typeof value === "object" && (value._kind === "ModuleDef" || value._kind === "Module") && "tag" in value && Context3.isTag(value.tag)
642
- );
643
- const buildModuleHandle = (tag, rt) => {
644
- const actionsProxy = new Proxy(
645
- {},
646
- {
647
- get: (_target, prop) => (payload) => rt.dispatch({
648
- _tag: prop,
649
- payload
650
- })
651
- }
652
- );
653
- const handle = {
654
- read: (selector) => Effect3.map(rt.getState, selector),
655
- changes: rt.changes,
656
- dispatch: rt.dispatch,
657
- actions$: rt.actions$,
658
- actions: actionsProxy
659
- };
660
- const EXTEND_HANDLE = /* @__PURE__ */ Symbol.for("logix.module.handle.extend");
661
- const extend = tag?.[EXTEND_HANDLE];
662
- return typeof extend === "function" ? extend(rt, handle) ?? handle : handle;
663
- };
664
- const emitModuleDescriptorOnce = (module, rt) => Effect3.gen(function* () {
665
- if (cachedDiagnosticsLevel === "off") return;
666
- const key = `module_descriptor:${String(rt.instanceId ?? "unknown")}`;
667
- const shouldEmit = yield* onceInRunSession(key);
668
- if (!shouldEmit) return;
669
- const actionKeys = Object.keys(module.tag?.shape?.actionMap ?? {});
670
- const internalSymbol = /* @__PURE__ */ Symbol.for("logix.module.internal");
671
- const internal = module[internalSymbol];
672
- const logicUnits = (internal?.mounted ?? []).map((u) => ({
673
- kind: String(u?.kind ?? "user"),
674
- id: String(u?.id ?? ""),
675
- derived: u?.derived ? true : void 0,
676
- name: typeof u?.name === "string" ? u.name : void 0
677
- }));
678
- const schemaKeys = module.schemas && typeof module.schemas === "object" ? Object.keys(module.schemas) : void 0;
679
- const meta = module.meta && typeof module.meta === "object" ? module.meta : void 0;
680
- const source = module.dev?.source;
681
- const traitsSnapshot = runtimeInternals.traits.getModuleTraitsSnapshot();
682
- const traits = traitsSnapshot ? {
683
- digest: traitsSnapshot.digest,
684
- count: traitsSnapshot.traits.length
685
- } : void 0;
686
- const data = {
687
- id: module.id,
688
- moduleId: String(rt.moduleId),
689
- instanceId: String(rt.instanceId),
690
- actionKeys,
691
- logicUnits,
692
- schemaKeys,
693
- meta,
694
- source,
695
- traits
696
- };
697
- yield* record({
698
- type: "trace:module:descriptor",
699
- moduleId: rt.moduleId,
700
- instanceId: rt.instanceId,
701
- data
702
- });
703
- });
704
- const resolveModuleRuntime = (tag) => Effect3.gen(function* () {
705
- const requestedModuleId = typeof tag?.id === "string" ? tag.id : void 0;
706
- const fromModuleId = typeof options?.moduleId === "string" ? options.moduleId : runtime.moduleId;
707
- if (requestedModuleId && requestedModuleId === runtime.moduleId) {
708
- return runtime;
709
- }
710
- const fromImports = runtimeInternals.imports.get(tag);
711
- if (fromImports) {
712
- return fromImports;
713
- }
714
- if (typeof options?.moduleId !== "string") {
715
- const fromEnv = yield* Effect3.serviceOption(tag);
716
- if (Option.isSome(fromEnv)) {
717
- return fromEnv.value;
718
- }
719
- }
720
- const tokenId = requestedModuleId ?? "<unknown module id>";
721
- const fix = isDevEnv() ? [
722
- "- Provide the child implementation in the same scope (imports).",
723
- ` Example: ${fromModuleId ?? "ParentModule"}.implement({ imports: [${requestedModuleId ?? "ChildModule"}.impl], ... })`,
724
- "- If you intentionally want a root singleton, provide it at app root (Runtime.make(...,{ layer }) / root imports),",
725
- " and use Root.resolve(ModuleTag) (instead of $.use) at the callsite."
726
- ] : [];
727
- const err = new Error(
728
- isDevEnv() ? [
729
- "[MissingModuleRuntimeError] Cannot resolve ModuleRuntime for ModuleTag.",
730
- "",
731
- `tokenId: ${tokenId}`,
732
- "entrypoint: logic.$.use",
733
- "mode: strict",
734
- `from: ${fromModuleId ?? "<unknown module id>"}`,
735
- `startScope: moduleId=${fromModuleId ?? "<unknown>"}, instanceId=${String(runtime.instanceId ?? "<unknown>")}`,
736
- "",
737
- "fix:",
738
- ...fix
739
- ].join("\n") : "[MissingModuleRuntimeError] module runtime not found"
740
- );
741
- err.tokenId = tokenId;
742
- err.entrypoint = "logic.$.use";
743
- err.mode = "strict";
744
- err.from = fromModuleId;
745
- err.startScope = {
746
- moduleId: fromModuleId,
747
- instanceId: String(runtime.instanceId ?? "<unknown>")
748
- };
749
- err.fix = fix;
750
- err.name = "MissingModuleRuntimeError";
751
- return yield* Effect3.die(err);
752
- });
753
- const stateApi = {
754
- read: runtime.getState,
755
- update: (f) => Effect3.gen(function* () {
756
- const inTxn = yield* FiberRef.get(inSyncTransactionFiber);
757
- if (inTxn) {
758
- const prev = yield* runtime.getState;
759
- return yield* runtime.setState(f(prev));
760
- }
761
- const body = () => Effect3.flatMap(runtime.getState, (prev) => runtime.setState(f(prev)));
762
- return yield* runtimeInternals ? runtimeInternals.txn.runWithStateTransaction({ kind: "state", name: "update" }, body) : body();
763
- }),
764
- mutate: (f) => Effect3.gen(function* () {
765
- const recordPatch = runtimeInternals?.txn.recordStatePatch;
766
- const updateDraft = runtimeInternals?.txn.updateDraft;
767
- const inTxn = yield* FiberRef.get(inSyncTransactionFiber);
768
- if (inTxn) {
769
- const prev = yield* runtime.getState;
770
- const { nextState, patchPaths } = mutateWithPatchPaths(prev, (draft) => {
771
- f(draft);
772
- });
773
- for (const path of patchPaths) {
774
- recordPatch?.(path, "unknown");
775
- }
776
- updateDraft?.(nextState);
777
- return;
778
- }
779
- const body = () => Effect3.gen(function* () {
780
- const prev = yield* runtime.getState;
781
- const { nextState, patchPaths } = mutateWithPatchPaths(prev, (draft) => {
782
- f(draft);
783
- });
784
- for (const path of patchPaths) {
785
- recordPatch?.(path, "unknown");
786
- }
787
- updateDraft?.(nextState);
788
- });
789
- return yield* runtimeInternals ? runtimeInternals.txn.runWithStateTransaction({ kind: "state", name: "mutate" }, body) : body();
790
- }),
791
- ref: runtime.ref
792
- };
793
- const actions = shape.actionMap;
794
- const dispatcherCache = /* @__PURE__ */ new Map();
795
- const hasAction = (key) => Object.prototype.hasOwnProperty.call(actions, key);
796
- const dispatchers = new Proxy({}, {
797
- get: (_target, prop) => {
798
- if (typeof prop !== "string") return void 0;
799
- if (!hasAction(prop)) return void 0;
800
- const cached = dispatcherCache.get(prop);
801
- if (cached) return cached;
802
- const token = actions[prop];
803
- const fn = (...args) => runtime.dispatch(token(...args));
804
- dispatcherCache.set(prop, fn);
805
- return fn;
806
- },
807
- has: (_target, prop) => typeof prop === "string" && hasAction(prop),
808
- ownKeys: () => Object.keys(actions),
809
- getOwnPropertyDescriptor: (_target, prop) => {
810
- if (typeof prop !== "string") return void 0;
811
- if (!hasAction(prop)) return void 0;
812
- return { enumerable: true, configurable: true };
813
- }
814
- });
815
- const dispatch = (...args) => {
816
- const [first, second] = args;
817
- if (typeof first === "string") {
818
- return runtime.dispatch({ _tag: first, payload: second });
819
- }
820
- if (isActionToken(first)) {
821
- return runtime.dispatch(first(second));
822
- }
823
- return runtime.dispatch(first);
824
- };
825
- const matchApi = (value) => makeMatch(value);
826
- const matchTagApi = (value) => makeMatchTag(value);
827
- const reducer = (tag, fn) => {
828
- return Effect3.sync(() => {
829
- runtimeInternals.txn.registerReducer(String(tag), fn);
830
- });
831
- };
832
- const effect = (token, handler) => Effect3.gen(function* () {
833
- if (!isActionToken(token)) {
834
- return yield* Effect3.dieMessage("[BoundApi.effect] token must be an ActionToken");
835
- }
836
- const phase = getCurrentPhase();
837
- const logicUnit = options?.logicUnit;
838
- yield* runtimeInternals.effects.registerEffect({
839
- actionTag: token.tag,
840
- handler,
841
- phase,
842
- ...logicUnit ? {
843
- logicUnit: {
844
- logicUnitId: logicUnit.logicUnitId,
845
- logicUnitLabel: logicUnit.logicUnitLabel,
846
- path: logicUnit.path
847
- }
848
- } : {}
849
- });
850
- });
851
- const api = {
852
- root: {
853
- resolve: (tag) => {
854
- guardRunOnly("root_resolve_in_setup", "$.root.resolve");
855
- return resolve(tag, {
856
- entrypoint: "logic.$.root.resolve",
857
- waitForReady: true
858
- });
859
- }
860
- },
861
- state: stateApi,
862
- actions,
863
- dispatchers,
864
- dispatch,
865
- flow: flowApi,
866
- match: matchApi,
867
- matchTag: matchTagApi,
868
- lifecycle: {
869
- onInitRequired: (eff) => {
870
- if (getCurrentPhase() === "run") {
871
- return emitSetupOnlyViolation("$.lifecycle.onInitRequired");
872
- }
873
- runtimeInternals.lifecycle.registerInitRequired(eff);
874
- return Effect3.void;
875
- },
876
- onStart: (eff) => {
877
- if (getCurrentPhase() === "run") {
878
- return emitSetupOnlyViolation("$.lifecycle.onStart");
879
- }
880
- runtimeInternals.lifecycle.registerStart(eff);
881
- return Effect3.void;
882
- },
883
- onInit: (eff) => {
884
- if (getCurrentPhase() === "run") {
885
- return emitSetupOnlyViolation("$.lifecycle.onInit");
886
- }
887
- runtimeInternals.lifecycle.registerInitRequired(eff);
888
- return Effect3.void;
889
- },
890
- onDestroy: (eff) => {
891
- if (getCurrentPhase() === "run") {
892
- return emitSetupOnlyViolation("$.lifecycle.onDestroy");
893
- }
894
- runtimeInternals.lifecycle.registerDestroy(eff);
895
- return Effect3.void;
896
- },
897
- onError: (handler) => {
898
- if (getCurrentPhase() === "run") {
899
- return emitSetupOnlyViolation("$.lifecycle.onError");
900
- }
901
- runtimeInternals.lifecycle.registerOnError(handler);
902
- return Effect3.void;
903
- },
904
- onSuspend: (eff) => {
905
- if (getCurrentPhase() === "run") {
906
- return emitSetupOnlyViolation("$.lifecycle.onSuspend");
907
- }
908
- runtimeInternals.lifecycle.registerPlatformSuspend(Effect3.asVoid(eff));
909
- return Effect3.void;
910
- },
911
- onResume: (eff) => {
912
- if (getCurrentPhase() === "run") {
913
- return emitSetupOnlyViolation("$.lifecycle.onResume");
914
- }
915
- runtimeInternals.lifecycle.registerPlatformResume(Effect3.asVoid(eff));
916
- return Effect3.void;
917
- },
918
- onReset: (eff) => {
919
- if (getCurrentPhase() === "run") {
920
- return emitSetupOnlyViolation("$.lifecycle.onReset");
921
- }
922
- runtimeInternals.lifecycle.registerPlatformReset(Effect3.asVoid(eff));
923
- return Effect3.void;
924
- }
925
- },
926
- traits: {
927
- declare: (traits) => {
928
- if (getCurrentPhase() === "run") {
929
- throw makeLogicPhaseError(
930
- "traits_declare_in_run",
931
- "$.traits.declare",
932
- "run",
933
- options?.moduleId
934
- );
935
- }
936
- if (!traits || typeof traits !== "object") {
937
- throw new Error("[InvalidTraitsDeclaration] $.traits.declare expects an object.");
938
- }
939
- const logicUnit = options?.logicUnit ?? {
940
- logicUnitId: "unknown",
941
- logicUnitIdKind: "derived",
942
- logicUnitLabel: "logicUnit:unknown",
943
- path: void 0
944
- };
945
- runtimeInternals.traits.registerModuleTraitsContribution({
946
- traits,
947
- provenance: {
948
- originType: "logicUnit",
949
- originId: logicUnit.logicUnitId,
950
- originIdKind: logicUnit.logicUnitIdKind,
951
- originLabel: logicUnit.logicUnitLabel,
952
- path: logicUnit.path
953
- }
954
- });
955
- },
956
- source: {
957
- refresh: (fieldPath, options2) => Effect3.gen(function* () {
958
- const handler = runtimeInternals.traits.getSourceRefreshHandler(fieldPath);
959
- if (!handler) {
960
- return yield* Effect3.void;
961
- }
962
- const force = options2?.force === true;
963
- const runHandler = (state) => force ? Effect3.locally(forceSourceRefresh, true)(handler(state)) : handler(state);
964
- const inTxn = yield* FiberRef.get(inSyncTransactionFiber);
965
- if (inTxn) {
966
- const state = yield* runtime.getState;
967
- return yield* runHandler(state);
968
- }
969
- return yield* runtimeInternals.txn.runWithStateTransaction(
970
- {
971
- kind: "source-refresh",
972
- name: fieldPath
973
- },
974
- () => Effect3.gen(function* () {
975
- const state = yield* runtime.getState;
976
- return yield* runHandler(state);
977
- })
978
- );
979
- })
980
- }
981
- },
982
- reducer,
983
- effect,
984
- use: new Proxy(() => {
985
- }, {
986
- apply: (_target, _thisArg, [arg]) => {
987
- guardRunOnly("use_in_setup", "$.use");
988
- if (isModuleLike(arg)) {
989
- const domain = arg;
990
- const tag = domain.tag;
991
- const resolveAndBuild = resolveModuleRuntime(tag).pipe(Effect3.map((rt) => buildModuleHandle(tag, rt)));
992
- const resolveWithDescriptor = resolveModuleRuntime(tag).pipe(
993
- Effect3.tap((rt) => emitModuleDescriptorOnce(domain, rt)),
994
- Effect3.map((rt) => buildModuleHandle(tag, rt))
995
- );
996
- const detectAndSelect = FiberRef.get(currentDiagnosticsLevel).pipe(
997
- Effect3.tap((level) => {
998
- cachedDiagnosticsLevel = level;
999
- }),
1000
- Effect3.flatMap((level) => level === "off" ? resolveAndBuild : resolveWithDescriptor)
1001
- );
1002
- return Effect3.suspend(() => {
1003
- if (cachedDiagnosticsLevel === "off") {
1004
- return resolveAndBuild;
1005
- }
1006
- if (cachedDiagnosticsLevel !== void 0) {
1007
- return resolveWithDescriptor;
1008
- }
1009
- return detectAndSelect;
1010
- });
1011
- }
1012
- if (Context3.isTag(arg)) {
1013
- const candidate = arg;
1014
- if (candidate._kind === "ModuleTag") {
1015
- return resolveModuleRuntime(arg).pipe(
1016
- Effect3.map((rt) => buildModuleHandle(arg, rt))
1017
- );
1018
- }
1019
- return arg;
1020
- }
1021
- return Effect3.die("BoundApi.use: unsupported argument");
1022
- }
1023
- }),
1024
- onAction: new Proxy(() => {
1025
- }, {
1026
- apply: (_target, _thisArg, args) => {
1027
- guardRunOnly("use_in_setup", "$.onAction");
1028
- const arg = args[0];
1029
- if (isActionToken(arg)) {
1030
- const tag = arg.tag;
1031
- return createIntentBuilder(
1032
- runtime.actions$.pipe(
1033
- Stream.filter((a) => a._tag === tag || a.type === tag),
1034
- Stream.map((a) => a.payload)
1035
- ),
1036
- tag
1037
- );
1038
- }
1039
- if (typeof arg === "function") {
1040
- return createIntentBuilder(runtime.actions$.pipe(Stream.filter(arg)));
1041
- }
1042
- if (typeof arg === "string") {
1043
- return createIntentBuilder(
1044
- runtime.actions$.pipe(Stream.filter((a) => a._tag === arg || a.type === arg)),
1045
- arg
1046
- );
1047
- }
1048
- if (typeof arg === "object" && arg !== null) {
1049
- if ("_tag" in arg) {
1050
- return createIntentBuilder(
1051
- runtime.actions$.pipe(Stream.filter((a) => a._tag === arg._tag)),
1052
- String(arg._tag)
1053
- );
1054
- }
1055
- if (Schema.isSchema(arg)) {
1056
- return createIntentBuilder(
1057
- runtime.actions$.pipe(
1058
- Stream.filter((a) => {
1059
- const result = Schema.decodeUnknownSync(arg)(a);
1060
- return !!result;
1061
- })
1062
- )
1063
- );
1064
- }
1065
- }
1066
- return createIntentBuilder(runtime.actions$);
1067
- },
1068
- get: (_target, prop) => {
1069
- guardRunOnly("use_in_setup", "$.onAction");
1070
- if (typeof prop === "string") {
1071
- return createIntentBuilder(
1072
- runtime.actions$.pipe(Stream.filter((a) => a._tag === prop || a.type === prop)),
1073
- prop
1074
- );
1075
- }
1076
- return void 0;
1077
- }
1078
- }),
1079
- onState: (selector) => {
1080
- guardRunOnly("use_in_setup", "$.onState");
1081
- return createIntentBuilder(runtime.changes(selector));
1082
- },
1083
- on: (stream) => {
1084
- guardRunOnly("use_in_setup", "$.on");
1085
- return createIntentBuilder(stream);
1086
- }
1087
- };
1088
- setBoundInternals(api, runtimeInternals);
1089
- return api;
1090
- }
1091
-
1092
- export {
1093
- mutateWithoutPatches,
1094
- mutateWithPatchPaths,
1095
- LifecycleContext,
1096
- makeLifecycleManager,
1097
- emitEnvServiceNotFoundDiagnosticIfNeeded,
1098
- LogicPhaseServiceTag,
1099
- LogicUnitServiceTag,
1100
- emitInvalidPhaseDiagnosticIfNeeded,
1101
- make2 as make
1102
- };
1103
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vbG9naXgtY29yZS9zcmMvaW50ZXJuYWwvcnVudGltZS9jb3JlL211dGF0aXZlUGF0Y2hlcy50cyIsICIuLi8uLi8uLi8uLi9sb2dpeC1jb3JlL3NyYy9pbnRlcm5hbC9ydW50aW1lL2NvcmUvQm91bmRBcGlSdW50aW1lLnRzIiwgIi4uLy4uLy4uLy4uL2xvZ2l4LWNvcmUvc3JjL2ludGVybmFsL3J1bnRpbWUvY29yZS9MaWZlY3ljbGUudHMiLCAiLi4vLi4vLi4vLi4vbG9naXgtY29yZS9zcmMvaW50ZXJuYWwvcnVudGltZS9jb3JlL0xvZ2ljRGlhZ25vc3RpY3MudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbImltcG9ydCB7IGNyZWF0ZSwgdHlwZSBQYXRjaGVzIH0gZnJvbSAnbXV0YXRpdmUnXG5pbXBvcnQgdHlwZSB7IEZpZWxkUGF0aCB9IGZyb20gJy4uLy4uL2ZpZWxkLXBhdGguanMnXG5pbXBvcnQgeyBpc0ZpZWxkUGF0aFNlZ21lbnQgfSBmcm9tICcuLi8uLi9maWVsZC1wYXRoLmpzJ1xuXG5leHBvcnQgdHlwZSBQYXRjaFBhdGggPSBGaWVsZFBhdGhcblxuZXhwb3J0IGNvbnN0IG11dGF0ZVdpdGhvdXRQYXRjaGVzID0gPFM+KGJhc2U6IFMsIG11dGF0b3I6IChkcmFmdDogUykgPT4gdm9pZCk6IFMgPT4ge1xuICByZXR1cm4gY3JlYXRlKGJhc2UsIG11dGF0b3IgYXMgYW55KSBhcyB1bmtub3duIGFzIFNcbn1cblxuY29uc3QgdG9QYXRjaEZpZWxkUGF0aCA9IChwYXRoOiB1bmtub3duKTogUGF0Y2hQYXRoIHwgJyonIHwgdW5kZWZpbmVkID0+IHtcbiAgaWYgKHR5cGVvZiBwYXRoID09PSAnc3RyaW5nJykge1xuICAgIGNvbnN0IHRyaW1tZWQgPSBwYXRoLnRyaW0oKVxuICAgIHJldHVybiB0cmltbWVkLmxlbmd0aCA+IDAgPyAnKicgOiB1bmRlZmluZWRcbiAgfVxuXG4gIGlmICghQXJyYXkuaXNBcnJheShwYXRoKSkgcmV0dXJuIHVuZGVmaW5lZFxuXG4gIGNvbnN0IHBhcnRzOiBBcnJheTxzdHJpbmc+ID0gW11cbiAgZm9yIChjb25zdCBzZWcgb2YgcGF0aCkge1xuICAgIGlmICh0eXBlb2Ygc2VnID09PSAnc3RyaW5nJykge1xuICAgICAgaWYgKGlzRmllbGRQYXRoU2VnbWVudChzZWcpKSBwYXJ0cy5wdXNoKHNlZylcbiAgICAgIGNvbnRpbnVlXG4gICAgfVxuICB9XG5cbiAgaWYgKHBhcnRzLmxlbmd0aCA9PT0gMCkgcmV0dXJuICcqJ1xuICByZXR1cm4gcGFydHNcbn1cblxuZXhwb3J0IGNvbnN0IG11dGF0ZVdpdGhQYXRjaFBhdGhzID0gPFM+KFxuICBiYXNlOiBTLFxuICBtdXRhdG9yOiAoZHJhZnQ6IFMpID0+IHZvaWQsXG4pOiB7IHJlYWRvbmx5IG5leHRTdGF0ZTogUzsgcmVhZG9ubHkgcGF0Y2hQYXRoczogUmVhZG9ubHlBcnJheTxQYXRjaFBhdGggfCAnKic+IH0gPT4ge1xuICBjb25zdCBvdXQgPSBjcmVhdGUoYmFzZSwgbXV0YXRvciBhcyBhbnksIHtcbiAgICBlbmFibGVQYXRjaGVzOiB7XG4gICAgICBwYXRoQXNBcnJheTogdHJ1ZSxcbiAgICAgIGFycmF5TGVuZ3RoQXNzaWdubWVudDogZmFsc2UsXG4gICAgfSxcbiAgfSkgYXMgdW5rbm93blxuXG4gIGlmICghQXJyYXkuaXNBcnJheShvdXQpKSB7XG4gICAgcmV0dXJuIHsgbmV4dFN0YXRlOiBvdXQgYXMgUywgcGF0Y2hQYXRoczogW10gfVxuICB9XG5cbiAgY29uc3QgbmV4dFN0YXRlID0gb3V0WzBdIGFzIFNcbiAgY29uc3QgcGF0Y2hlcyA9IChvdXRbMV0gPz8gW10pIGFzIFBhdGNoZXM8eyBwYXRoQXNBcnJheTogdHJ1ZTsgYXJyYXlMZW5ndGhBc3NpZ25tZW50OiBmYWxzZSB9PlxuXG4gIGNvbnN0IGRlZHVwID0gbmV3IE1hcDxzdHJpbmcsIFBhdGNoUGF0aCB8ICcqJz4oKVxuICBmb3IgKGNvbnN0IHBhdGNoIG9mIHBhdGNoZXMpIHtcbiAgICBjb25zdCBwID0gdG9QYXRjaEZpZWxkUGF0aCgocGF0Y2ggYXMgYW55KT8ucGF0aClcbiAgICBpZiAoIXApIGNvbnRpbnVlXG4gICAgY29uc3Qga2V5ID0gcCA9PT0gJyonID8gJyonIDogSlNPTi5zdHJpbmdpZnkocClcbiAgICBpZiAoIWRlZHVwLmhhcyhrZXkpKSBkZWR1cC5zZXQoa2V5LCBwKVxuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBuZXh0U3RhdGUsXG4gICAgcGF0Y2hQYXRoczogQXJyYXkuZnJvbShkZWR1cC52YWx1ZXMoKSksXG4gIH1cbn1cbiIsICJpbXBvcnQgeyBDb250ZXh0LCBFZmZlY3QsIEZpYmVyUmVmLCBPcHRpb24sIFNjaGVtYSwgU3RyZWFtLCBTdWJzY3JpcHRpb25SZWYgfSBmcm9tICdlZmZlY3QnXG5pbXBvcnQgeyBjcmVhdGUgfSBmcm9tICdtdXRhdGl2ZSdcbmltcG9ydCB0eXBlICogYXMgTG9naXggZnJvbSAnLi9tb2R1bGUuanMnXG5pbXBvcnQgKiBhcyBMb2dpYyBmcm9tICcuL0xvZ2ljTWlkZGxld2FyZS5qcydcbmltcG9ydCAqIGFzIEFjdGlvbiBmcm9tICcuLi8uLi9hY3Rpb24uanMnXG5pbXBvcnQgKiBhcyBUYXNrUnVubmVyIGZyb20gJy4vVGFza1J1bm5lci5qcydcbmltcG9ydCB7IG11dGF0ZVdpdGhQYXRjaFBhdGhzIH0gZnJvbSAnLi9tdXRhdGl2ZVBhdGNoZXMuanMnXG5pbXBvcnQgKiBhcyBGbG93UnVudGltZSBmcm9tICcuL0Zsb3dSdW50aW1lLmpzJ1xuaW1wb3J0ICogYXMgTWF0Y2hCdWlsZGVyIGZyb20gJy4vTWF0Y2hCdWlsZGVyLmpzJ1xuaW1wb3J0ICogYXMgUGxhdGZvcm0gZnJvbSAnLi9QbGF0Zm9ybS5qcydcbmltcG9ydCAqIGFzIExpZmVjeWNsZSBmcm9tICcuL0xpZmVjeWNsZS5qcydcbmltcG9ydCAqIGFzIERlYnVnIGZyb20gJy4vRGVidWdTaW5rLmpzJ1xuaW1wb3J0ICogYXMgTG9naWNEaWFnbm9zdGljcyBmcm9tICcuL0xvZ2ljRGlhZ25vc3RpY3MuanMnXG5pbXBvcnQgeyBpc0RldkVudiB9IGZyb20gJy4vZW52LmpzJ1xuaW1wb3J0IHsgUnVuU2Vzc2lvblRhZyB9IGZyb20gJy4uLy4uL29ic2VydmFiaWxpdHkvcnVuU2Vzc2lvbi5qcydcbmltcG9ydCAqIGFzIFJvb3QgZnJvbSAnLi4vLi4vcm9vdC5qcydcbmltcG9ydCB0eXBlIHsgUnVudGltZUludGVybmFscyB9IGZyb20gJy4vUnVudGltZUludGVybmFscy5qcydcbmltcG9ydCB0eXBlICogYXMgTW9kdWxlVHJhaXRzIGZyb20gJy4vTW9kdWxlVHJhaXRzLmpzJ1xuaW1wb3J0IHsgZ2V0UnVudGltZUludGVybmFscywgc2V0Qm91bmRJbnRlcm5hbHMgfSBmcm9tICcuL3J1bnRpbWVJbnRlcm5hbHNBY2Nlc3Nvci5qcydcbmltcG9ydCB0eXBlIHsgQW55TW9kdWxlU2hhcGUsIE1vZHVsZVJ1bnRpbWUsIFN0YXRlT2YsIEFjdGlvbk9mIH0gZnJvbSAnLi9tb2R1bGUuanMnXG5cbi8vIExvY2FsIEludGVudEJ1aWxkZXIgZmFjdG9yeTsgZXF1aXZhbGVudCB0byB0aGUgb2xkIGludGVybmFsL2RzbC9Mb2dpY0J1aWxkZXIubWFrZUludGVudEJ1aWxkZXJGYWN0b3J5LlxuY29uc3QgTG9naWNCdWlsZGVyRmFjdG9yeSA9IDxTaCBleHRlbmRzIEFueU1vZHVsZVNoYXBlLCBSID0gbmV2ZXI+KFxuICBydW50aW1lOiBNb2R1bGVSdW50aW1lPFN0YXRlT2Y8U2g+LCBBY3Rpb25PZjxTaD4+LFxuICBydW50aW1lSW50ZXJuYWxzOiBSdW50aW1lSW50ZXJuYWxzLFxuKSA9PiB7XG4gIGNvbnN0IGZsb3dBcGkgPSBGbG93UnVudGltZS5tYWtlPFNoLCBSPihydW50aW1lLCBydW50aW1lSW50ZXJuYWxzKVxuXG4gIHJldHVybiA8VD4oc3RyZWFtOiBTdHJlYW0uU3RyZWFtPFQ+LCB0cmlnZ2VyTmFtZT86IHN0cmluZyk6IExvZ2ljLkludGVudEJ1aWxkZXI8VCwgU2gsIFI+ID0+IHtcbiAgICBjb25zdCBydW5XaXRoU3RhdGVUcmFuc2FjdGlvbjogVGFza1J1bm5lci5UYXNrUnVubmVyUnVudGltZVsncnVuV2l0aFN0YXRlVHJhbnNhY3Rpb24nXSA9IChvcmlnaW4sIGJvZHkpID0+XG4gICAgICBydW50aW1lSW50ZXJuYWxzLnR4bi5ydW5XaXRoU3RhdGVUcmFuc2FjdGlvbihvcmlnaW4gYXMgYW55LCBib2R5KVxuXG4gICAgY29uc3QgdGFza1J1bm5lclJ1bnRpbWU6IFRhc2tSdW5uZXIuVGFza1J1bm5lclJ1bnRpbWUgPSB7XG4gICAgICBtb2R1bGVJZDogcnVudGltZS5tb2R1bGVJZCxcbiAgICAgIGluc3RhbmNlSWQ6IHJ1bnRpbWVJbnRlcm5hbHMuaW5zdGFuY2VJZCxcbiAgICAgIHJ1bldpdGhTdGF0ZVRyYW5zYWN0aW9uLFxuICAgICAgcmVzb2x2ZUNvbmN1cnJlbmN5UG9saWN5OiBydW50aW1lSW50ZXJuYWxzLmNvbmN1cnJlbmN5LnJlc29sdmVDb25jdXJyZW5jeVBvbGljeSxcbiAgICB9XG5cbiAgICBjb25zdCBidWlsZGVyID0ge1xuICAgICAgZGVib3VuY2U6IChtczogbnVtYmVyKSA9PlxuICAgICAgICBMb2dpY0J1aWxkZXJGYWN0b3J5PFNoLCBSPihydW50aW1lLCBydW50aW1lSW50ZXJuYWxzKShmbG93QXBpLmRlYm91bmNlPFQ+KG1zKShzdHJlYW0pLCB0cmlnZ2VyTmFtZSksXG4gICAgICB0aHJvdHRsZTogKG1zOiBudW1iZXIpID0+XG4gICAgICAgIExvZ2ljQnVpbGRlckZhY3Rvcnk8U2gsIFI+KHJ1bnRpbWUsIHJ1bnRpbWVJbnRlcm5hbHMpKGZsb3dBcGkudGhyb3R0bGU8VD4obXMpKHN0cmVhbSksIHRyaWdnZXJOYW1lKSxcbiAgICAgIGZpbHRlcjogKHByZWRpY2F0ZTogKHZhbHVlOiBUKSA9PiBib29sZWFuKSA9PlxuICAgICAgICBMb2dpY0J1aWxkZXJGYWN0b3J5PFNoLCBSPihydW50aW1lLCBydW50aW1lSW50ZXJuYWxzKShmbG93QXBpLmZpbHRlcihwcmVkaWNhdGUpKHN0cmVhbSksIHRyaWdnZXJOYW1lKSxcbiAgICAgIG1hcDogPFU+KGY6ICh2YWx1ZTogVCkgPT4gVSkgPT5cbiAgICAgICAgTG9naWNCdWlsZGVyRmFjdG9yeTxTaCwgUj4ocnVudGltZSwgcnVudGltZUludGVybmFscykoc3RyZWFtLnBpcGUoU3RyZWFtLm1hcChmKSksIHRyaWdnZXJOYW1lKSxcbiAgICAgIHJ1bjxBID0gdm9pZCwgRSA9IG5ldmVyLCBSMiA9IHVua25vd24+KFxuICAgICAgICBlZmY6IExvZ2ljLk9mPFNoLCBSICYgUjIsIEEsIEU+IHwgKChwOiBUKSA9PiBMb2dpYy5PZjxTaCwgUiAmIFIyLCBBLCBFPiksXG4gICAgICAgIG9wdGlvbnM/OiBMb2dpYy5PcGVyYXRpb25PcHRpb25zLFxuICAgICAgKTogTG9naWMuT2Y8U2gsIFIgJiBSMiwgdm9pZCwgRT4ge1xuICAgICAgICByZXR1cm4gZmxvd0FwaS5ydW48VCwgQSwgRSwgUjI+KGVmZiwgb3B0aW9ucykoc3RyZWFtKVxuICAgICAgfSxcbiAgICAgIHJ1bkxhdGVzdDxBID0gdm9pZCwgRSA9IG5ldmVyLCBSMiA9IHVua25vd24+KFxuICAgICAgICBlZmY6IExvZ2ljLk9mPFNoLCBSICYgUjIsIEEsIEU+IHwgKChwOiBUKSA9PiBMb2dpYy5PZjxTaCwgUiAmIFIyLCBBLCBFPiksXG4gICAgICAgIG9wdGlvbnM/OiBMb2dpYy5PcGVyYXRpb25PcHRpb25zLFxuICAgICAgKTogTG9naWMuT2Y8U2gsIFIgJiBSMiwgdm9pZCwgRT4ge1xuICAgICAgICByZXR1cm4gZmxvd0FwaS5ydW5MYXRlc3Q8VCwgQSwgRSwgUjI+KGVmZiwgb3B0aW9ucykoc3RyZWFtKVxuICAgICAgfSxcbiAgICAgIHJ1bkV4aGF1c3Q8QSA9IHZvaWQsIEUgPSBuZXZlciwgUjIgPSB1bmtub3duPihcbiAgICAgICAgZWZmOiBMb2dpYy5PZjxTaCwgUiAmIFIyLCBBLCBFPiB8ICgocDogVCkgPT4gTG9naWMuT2Y8U2gsIFIgJiBSMiwgQSwgRT4pLFxuICAgICAgICBvcHRpb25zPzogTG9naWMuT3BlcmF0aW9uT3B0aW9ucyxcbiAgICAgICk6IExvZ2ljLk9mPFNoLCBSICYgUjIsIHZvaWQsIEU+IHtcbiAgICAgICAgcmV0dXJuIGZsb3dBcGkucnVuRXhoYXVzdDxULCBBLCBFLCBSMj4oZWZmLCBvcHRpb25zKShzdHJlYW0pXG4gICAgICB9LFxuICAgICAgcnVuUGFyYWxsZWw8QSA9IHZvaWQsIEUgPSBuZXZlciwgUjIgPSB1bmtub3duPihcbiAgICAgICAgZWZmOiBMb2dpYy5PZjxTaCwgUiAmIFIyLCBBLCBFPiB8ICgocDogVCkgPT4gTG9naWMuT2Y8U2gsIFIgJiBSMiwgQSwgRT4pLFxuICAgICAgICBvcHRpb25zPzogTG9naWMuT3BlcmF0aW9uT3B0aW9ucyxcbiAgICAgICk6IExvZ2ljLk9mPFNoLCBSICYgUjIsIHZvaWQsIEU+IHtcbiAgICAgICAgcmV0dXJuIGZsb3dBcGkucnVuUGFyYWxsZWw8VCwgQSwgRSwgUjI+KGVmZiwgb3B0aW9ucykoc3RyZWFtKVxuICAgICAgfSxcbiAgICAgIHJ1bkZvcms6IDxBID0gdm9pZCwgRSA9IG5ldmVyLCBSMiA9IHVua25vd24+KFxuICAgICAgICBlZmY6IExvZ2ljLk9mPFNoLCBSICYgUjIsIEEsIEU+IHwgKChwOiBUKSA9PiBMb2dpYy5PZjxTaCwgUiAmIFIyLCBBLCBFPiksXG4gICAgICApOiBMb2dpYy5PZjxTaCwgUiAmIFIyLCB2b2lkLCBFPiA9PlxuICAgICAgICBFZmZlY3QuZm9ya1Njb3BlZChmbG93QXBpLnJ1bjxULCBBLCBFLCBSMj4oZWZmKShzdHJlYW0pKS5waXBlKEVmZmVjdC5hc1ZvaWQpIGFzIExvZ2ljLk9mPFNoLCBSICYgUjIsIHZvaWQsIEU+LFxuICAgICAgcnVuUGFyYWxsZWxGb3JrOiA8QSA9IHZvaWQsIEUgPSBuZXZlciwgUjIgPSB1bmtub3duPihcbiAgICAgICAgZWZmOiBMb2dpYy5PZjxTaCwgUiAmIFIyLCBBLCBFPiB8ICgocDogVCkgPT4gTG9naWMuT2Y8U2gsIFIgJiBSMiwgQSwgRT4pLFxuICAgICAgKTogTG9naWMuT2Y8U2gsIFIgJiBSMiwgdm9pZCwgRT4gPT5cbiAgICAgICAgRWZmZWN0LmZvcmtTY29wZWQoZmxvd0FwaS5ydW5QYXJhbGxlbDxULCBBLCBFLCBSMj4oZWZmKShzdHJlYW0pKS5waXBlKEVmZmVjdC5hc1ZvaWQpIGFzIExvZ2ljLk9mPFxuICAgICAgICAgIFNoLFxuICAgICAgICAgIFIgJiBSMixcbiAgICAgICAgICB2b2lkLFxuICAgICAgICAgIEVcbiAgICAgICAgPixcbiAgICAgIHJ1blRhc2s6IDxBID0gdm9pZCwgRSA9IG5ldmVyLCBSMiA9IHVua25vd24+KFxuICAgICAgICBjb25maWc6IFRhc2tSdW5uZXIuVGFza1J1bm5lckNvbmZpZzxULCBTaCwgUiAmIFIyLCBBLCBFPixcbiAgICAgICk6IExvZ2ljLk9mPFNoLCBSICYgUjIsIHZvaWQsIG5ldmVyPiA9PlxuICAgICAgICBUYXNrUnVubmVyLm1ha2VUYXNrUnVubmVyPFQsIFNoLCBSICYgUjIsIEEsIEU+KHN0cmVhbSwgJ3Rhc2snLCB0YXNrUnVubmVyUnVudGltZSwge1xuICAgICAgICAgIC4uLmNvbmZpZyxcbiAgICAgICAgICB0cmlnZ2VyTmFtZTogY29uZmlnLnRyaWdnZXJOYW1lID8/IHRyaWdnZXJOYW1lLFxuICAgICAgICB9KSBhcyBMb2dpYy5PZjxTaCwgUiAmIFIyLCB2b2lkLCBuZXZlcj4sXG4gICAgICBydW5QYXJhbGxlbFRhc2s6IDxBID0gdm9pZCwgRSA9IG5ldmVyLCBSMiA9IHVua25vd24+KFxuICAgICAgICBjb25maWc6IFRhc2tSdW5uZXIuVGFza1J1bm5lckNvbmZpZzxULCBTaCwgUiAmIFIyLCBBLCBFPixcbiAgICAgICk6IExvZ2ljLk9mPFNoLCBSICYgUjIsIHZvaWQsIG5ldmVyPiA9PlxuICAgICAgICBUYXNrUnVubmVyLm1ha2VUYXNrUnVubmVyPFQsIFNoLCBSICYgUjIsIEEsIEU+KHN0cmVhbSwgJ3BhcmFsbGVsJywgdGFza1J1bm5lclJ1bnRpbWUsIHtcbiAgICAgICAgICAuLi5jb25maWcsXG4gICAgICAgICAgdHJpZ2dlck5hbWU6IGNvbmZpZy50cmlnZ2VyTmFtZSA/PyB0cmlnZ2VyTmFtZSxcbiAgICAgICAgfSkgYXMgTG9naWMuT2Y8U2gsIFIgJiBSMiwgdm9pZCwgbmV2ZXI+LFxuICAgICAgcnVuTGF0ZXN0VGFzazogPEEgPSB2b2lkLCBFID0gbmV2ZXIsIFIyID0gdW5rbm93bj4oXG4gICAgICAgIGNvbmZpZzogVGFza1J1bm5lci5UYXNrUnVubmVyQ29uZmlnPFQsIFNoLCBSICYgUjIsIEEsIEU+LFxuICAgICAgKTogTG9naWMuT2Y8U2gsIFIgJiBSMiwgdm9pZCwgbmV2ZXI+ID0+XG4gICAgICAgIFRhc2tSdW5uZXIubWFrZVRhc2tSdW5uZXI8VCwgU2gsIFIgJiBSMiwgQSwgRT4oc3RyZWFtLCAnbGF0ZXN0JywgdGFza1J1bm5lclJ1bnRpbWUsIHtcbiAgICAgICAgICAuLi5jb25maWcsXG4gICAgICAgICAgdHJpZ2dlck5hbWU6IGNvbmZpZy50cmlnZ2VyTmFtZSA/PyB0cmlnZ2VyTmFtZSxcbiAgICAgICAgfSkgYXMgTG9naWMuT2Y8U2gsIFIgJiBSMiwgdm9pZCwgbmV2ZXI+LFxuICAgICAgcnVuRXhoYXVzdFRhc2s6IDxBID0gdm9pZCwgRSA9IG5ldmVyLCBSMiA9IHVua25vd24+KFxuICAgICAgICBjb25maWc6IFRhc2tSdW5uZXIuVGFza1J1bm5lckNvbmZpZzxULCBTaCwgUiAmIFIyLCBBLCBFPixcbiAgICAgICk6IExvZ2ljLk9mPFNoLCBSICYgUjIsIHZvaWQsIG5ldmVyPiA9PlxuICAgICAgICBUYXNrUnVubmVyLm1ha2VUYXNrUnVubmVyPFQsIFNoLCBSICYgUjIsIEEsIEU+KHN0cmVhbSwgJ2V4aGF1c3QnLCB0YXNrUnVubmVyUnVudGltZSwge1xuICAgICAgICAgIC4uLmNvbmZpZyxcbiAgICAgICAgICB0cmlnZ2VyTmFtZTogY29uZmlnLnRyaWdnZXJOYW1lID8/IHRyaWdnZXJOYW1lLFxuICAgICAgICB9KSBhcyBMb2dpYy5PZjxTaCwgUiAmIFIyLCB2b2lkLCBuZXZlcj4sXG4gICAgICB0b1N0cmVhbTogKCkgPT4gc3RyZWFtLFxuICAgICAgdXBkYXRlOiAoXG4gICAgICAgIHJlZHVjZXI6IChwcmV2OiBTdGF0ZU9mPFNoPiwgcGF5bG9hZDogVCkgPT4gU3RhdGVPZjxTaD4gfCBFZmZlY3QuRWZmZWN0PFN0YXRlT2Y8U2g+LCBhbnksIGFueT4sXG4gICAgICApOiBMb2dpYy5PZjxTaCwgUiwgdm9pZCwgbmV2ZXI+ID0+XG4gICAgICAgIFN0cmVhbS5ydW5Gb3JFYWNoKHN0cmVhbSwgKHBheWxvYWQpID0+XG4gICAgICAgICAgdGFza1J1bm5lclJ1bnRpbWUucnVuV2l0aFN0YXRlVHJhbnNhY3Rpb24oXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGtpbmQ6ICd3YXRjaGVyOnVwZGF0ZScsXG4gICAgICAgICAgICAgIG5hbWU6IHRyaWdnZXJOYW1lLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICgpID0+XG4gICAgICAgICAgICAgIEVmZmVjdC5nZW4oZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBwcmV2ID0gKHlpZWxkKiBydW50aW1lLmdldFN0YXRlKSBhcyBTdGF0ZU9mPFNoPlxuICAgICAgICAgICAgICAgIGNvbnN0IG5leHQgPSByZWR1Y2VyKHByZXYsIHBheWxvYWQpXG4gICAgICAgICAgICAgICAgaWYgKEVmZmVjdC5pc0VmZmVjdChuZXh0KSkge1xuICAgICAgICAgICAgICAgICAgY29uc3QgZXhpdCA9IHlpZWxkKiBFZmZlY3QuZXhpdChuZXh0IGFzIEVmZmVjdC5FZmZlY3Q8U3RhdGVPZjxTaD4sIGFueSwgYW55PilcbiAgICAgICAgICAgICAgICAgIGlmIChleGl0Ll90YWcgPT09ICdGYWlsdXJlJykge1xuICAgICAgICAgICAgICAgICAgICB5aWVsZCogRWZmZWN0LmxvZ0Vycm9yKCdGbG93IGVycm9yJywgZXhpdC5jYXVzZSlcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB5aWVsZCogcnVudGltZS5zZXRTdGF0ZShleGl0LnZhbHVlIGFzIFN0YXRlT2Y8U2g+KVxuICAgICAgICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHlpZWxkKiBydW50aW1lLnNldFN0YXRlKG5leHQgYXMgU3RhdGVPZjxTaD4pXG4gICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICksXG4gICAgICAgICkucGlwZShFZmZlY3QuY2F0Y2hBbGxDYXVzZSgoY2F1c2UpID0+IEVmZmVjdC5sb2dFcnJvcignRmxvdyBlcnJvcicsIGNhdXNlKSkpIGFzIExvZ2ljLk9mPFNoLCBSLCB2b2lkLCBuZXZlcj4sXG4gICAgICBtdXRhdGU6IChyZWR1Y2VyOiAoZHJhZnQ6IExvZ2ljLkRyYWZ0PFN0YXRlT2Y8U2g+PiwgcGF5bG9hZDogVCkgPT4gdm9pZCk6IExvZ2ljLk9mPFNoLCBSLCB2b2lkLCBuZXZlcj4gPT5cbiAgICAgICAgU3RyZWFtLnJ1bkZvckVhY2goc3RyZWFtLCAocGF5bG9hZCkgPT5cbiAgICAgICAgICB0YXNrUnVubmVyUnVudGltZS5ydW5XaXRoU3RhdGVUcmFuc2FjdGlvbihcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAga2luZDogJ3dhdGNoZXI6bXV0YXRlJyxcbiAgICAgICAgICAgICAgbmFtZTogdHJpZ2dlck5hbWUsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgKCkgPT5cbiAgICAgICAgICAgICAgRWZmZWN0LmdlbihmdW5jdGlvbiogKCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHByZXYgPSAoeWllbGQqIHJ1bnRpbWUuZ2V0U3RhdGUpIGFzIFN0YXRlT2Y8U2g+XG4gICAgICAgICAgICAgICAgY29uc3QgcmVjb3JkUGF0Y2ggPSBydW50aW1lSW50ZXJuYWxzLnR4bi5yZWNvcmRTdGF0ZVBhdGNoXG4gICAgICAgICAgICAgICAgY29uc3QgdXBkYXRlRHJhZnQgPSBydW50aW1lSW50ZXJuYWxzLnR4bi51cGRhdGVEcmFmdFxuXG4gICAgICAgICAgICAgICAgY29uc3QgeyBuZXh0U3RhdGUsIHBhdGNoUGF0aHMgfSA9IG11dGF0ZVdpdGhQYXRjaFBhdGhzKHByZXYgYXMgU3RhdGVPZjxTaD4sIChkcmFmdCkgPT4ge1xuICAgICAgICAgICAgICAgICAgcmVkdWNlcihkcmFmdCBhcyBMb2dpYy5EcmFmdDxTdGF0ZU9mPFNoPj4sIHBheWxvYWQpXG4gICAgICAgICAgICAgICAgfSlcblxuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgcGF0aCBvZiBwYXRjaFBhdGhzKSB7XG4gICAgICAgICAgICAgICAgICByZWNvcmRQYXRjaChwYXRoLCAndW5rbm93bicpXG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgdXBkYXRlRHJhZnQobmV4dFN0YXRlKVxuICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICApLFxuICAgICAgICApLnBpcGUoRWZmZWN0LmNhdGNoQWxsQ2F1c2UoKGNhdXNlKSA9PiBFZmZlY3QubG9nRXJyb3IoJ0Zsb3cgZXJyb3InLCBjYXVzZSkpKSBhcyBMb2dpYy5PZjxTaCwgUiwgdm9pZCwgbmV2ZXI+LFxuICAgIH0gYXMgT21pdDxMb2dpYy5JbnRlbnRCdWlsZGVyPFQsIFNoLCBSPiwgJ3BpcGUnPlxuXG4gICAgY29uc3QgcGlwZTogTG9naWMuSW50ZW50QnVpbGRlcjxULCBTaCwgUj5bJ3BpcGUnXSA9IGZ1bmN0aW9uICh0aGlzOiB1bmtub3duKSB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcHJlZmVyLXJlc3QtcGFyYW1zXG4gICAgICBjb25zdCBmbnMgPSBhcmd1bWVudHMgYXMgdW5rbm93biBhcyBSZWFkb25seUFycmF5PFxuICAgICAgICAoc2VsZjogTG9naWMuSW50ZW50QnVpbGRlcjxULCBTaCwgUj4pID0+IExvZ2ljLkludGVudEJ1aWxkZXI8VCwgU2gsIFI+XG4gICAgICA+XG4gICAgICBsZXQgYWNjOiBMb2dpYy5JbnRlbnRCdWlsZGVyPFQsIFNoLCBSPiA9IGJ1aWxkZXIgYXMgTG9naWMuSW50ZW50QnVpbGRlcjxULCBTaCwgUj5cbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZm5zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGFjYyA9IGZuc1tpXShhY2MpXG4gICAgICB9XG4gICAgICByZXR1cm4gYWNjXG4gICAgfVxuXG4gICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oYnVpbGRlciwgeyBwaXBlIH0pIGFzIExvZ2ljLkludGVudEJ1aWxkZXI8VCwgU2gsIFI+XG4gIH1cbn1cbmltcG9ydCB0eXBlIHsgQm91bmRBcGkgfSBmcm9tICcuL21vZHVsZS5qcydcblxuLyoqXG4gKiBCb3VuZEFwaSBpbXBsZW1lbnRhdGlvbjogY3JlYXRlcyBhIHByZS1ib3VuZCBgJGAgZm9yIGEgZ2l2ZW4gU3RvcmUgc2hhcGUgKyBydW50aW1lLlxuICpcbiAqIE5vdGU6IHB1YmxpYyB0eXBlcyBhbmQgZW50cnlwb2ludCBzaWduYXR1cmVzIGxpdmUgaW4gYXBpL0JvdW5kQXBpLnRzOyB0aGlzIGZpbGUgb25seSBob3N0cyB0aGUgaW1wbGVtZW50YXRpb24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtYWtlPFNoIGV4dGVuZHMgTG9naXguQW55TW9kdWxlU2hhcGUsIFIgPSBuZXZlcj4oXG4gIHNoYXBlOiBTaCxcbiAgcnVudGltZTogTG9naXguTW9kdWxlUnVudGltZTxMb2dpeC5TdGF0ZU9mPFNoPiwgTG9naXguQWN0aW9uT2Y8U2g+PixcbiAgb3B0aW9ucz86IHtcbiAgICByZWFkb25seSBnZXRQaGFzZT86ICgpID0+ICdzZXR1cCcgfCAncnVuJ1xuICAgIHJlYWRvbmx5IHBoYXNlU2VydmljZT86IExvZ2ljRGlhZ25vc3RpY3MuTG9naWNQaGFzZVNlcnZpY2VcbiAgICByZWFkb25seSBtb2R1bGVJZD86IHN0cmluZ1xuICAgIHJlYWRvbmx5IGxvZ2ljVW5pdD86IExvZ2ljRGlhZ25vc3RpY3MuTG9naWNVbml0U2VydmljZVxuICB9LFxuKTogQm91bmRBcGk8U2gsIFI+IHtcbiAgY29uc3QgcnVudGltZUludGVybmFscyA9IGdldFJ1bnRpbWVJbnRlcm5hbHMocnVudGltZSBhcyBhbnkpXG5cbiAgY29uc3QgZ2V0UGhhc2UgPSBvcHRpb25zPy5nZXRQaGFzZSA/PyAoKCkgPT4gJ3J1bicpXG4gIGNvbnN0IGdldEN1cnJlbnRQaGFzZSA9ICgpOiAnc2V0dXAnIHwgJ3J1bicgPT4ge1xuICAgIGNvbnN0IHBoYXNlU2VydmljZSA9IG9wdGlvbnM/LnBoYXNlU2VydmljZVxuICAgIGNvbnN0IHBoYXNlID0gcGhhc2VTZXJ2aWNlPy5jdXJyZW50ID8/IGdldFBoYXNlKClcbiAgICByZXR1cm4gcGhhc2UgPT09ICdzZXR1cCcgPyAnc2V0dXAnIDogJ3J1bidcbiAgfVxuICBjb25zdCBndWFyZFJ1bk9ubHkgPSAoa2luZDogc3RyaW5nLCBhcGk6IHN0cmluZykgPT4ge1xuICAgIGNvbnN0IHBoYXNlU2VydmljZSA9IG9wdGlvbnM/LnBoYXNlU2VydmljZVxuICAgIGNvbnN0IHBoYXNlID0gcGhhc2VTZXJ2aWNlPy5jdXJyZW50ID8/IGdldFBoYXNlKClcbiAgICBpZiAocGhhc2UgPT09ICdzZXR1cCcpIHtcbiAgICAgIHRocm93IExvZ2ljRGlhZ25vc3RpY3MubWFrZUxvZ2ljUGhhc2VFcnJvcihraW5kLCBhcGksICdzZXR1cCcsIG9wdGlvbnM/Lm1vZHVsZUlkKVxuICAgIH1cbiAgfVxuICBjb25zdCBmbG93QXBpID0gRmxvd1J1bnRpbWUubWFrZTxTaCwgUj4ocnVudGltZSwgcnVudGltZUludGVybmFscylcblxuICBjb25zdCBtYWtlSW50ZW50QnVpbGRlciA9IChydW50aW1lXzogTG9naXguTW9kdWxlUnVudGltZTxhbnksIGFueT4pID0+XG4gICAgTG9naWNCdWlsZGVyRmFjdG9yeTxTaCwgUj4ocnVudGltZV8sIHJ1bnRpbWVJbnRlcm5hbHMpXG4gIGNvbnN0IHdpdGhMaWZlY3ljbGUgPSA8QT4oXG4gICAgYXZhaWxhYmxlOiAobWFuYWdlcjogTGlmZWN5Y2xlLkxpZmVjeWNsZU1hbmFnZXIpID0+IEVmZmVjdC5FZmZlY3Q8QSwgbmV2ZXIsIGFueT4sXG4gICAgbWlzc2luZzogKCkgPT4gRWZmZWN0LkVmZmVjdDxBLCBuZXZlciwgYW55PixcbiAgKSA9PlxuICAgIEVmZmVjdC5zZXJ2aWNlT3B0aW9uKExpZmVjeWNsZS5MaWZlY3ljbGVDb250ZXh0KS5waXBlKFxuICAgICAgRWZmZWN0LmZsYXRNYXAoKG1heWJlKSA9PlxuICAgICAgICBPcHRpb24ubWF0Y2gobWF5YmUsIHtcbiAgICAgICAgICBvblNvbWU6IGF2YWlsYWJsZSxcbiAgICAgICAgICBvbk5vbmU6IG1pc3NpbmcsXG4gICAgICAgIH0pLFxuICAgICAgKSxcbiAgICApXG4gIGNvbnN0IHdpdGhQbGF0Zm9ybSA9IChpbnZva2U6IChwbGF0Zm9ybTogUGxhdGZvcm0uU2VydmljZSkgPT4gRWZmZWN0LkVmZmVjdDx2b2lkLCBuZXZlciwgYW55PikgPT5cbiAgICBFZmZlY3Quc2VydmljZU9wdGlvbihQbGF0Zm9ybS5UYWcpLnBpcGUoXG4gICAgICBFZmZlY3QuZmxhdE1hcCgobWF5YmUpID0+XG4gICAgICAgIE9wdGlvbi5tYXRjaChtYXliZSwge1xuICAgICAgICAgIG9uU29tZTogaW52b2tlLFxuICAgICAgICAgIG9uTm9uZTogKCkgPT4gRWZmZWN0LnZvaWQsXG4gICAgICAgIH0pLFxuICAgICAgKSxcbiAgICApXG5cbiAgY29uc3QgZW1pdFNldHVwT25seVZpb2xhdGlvbiA9IChhcGk6IHN0cmluZyk6IEVmZmVjdC5FZmZlY3Q8dm9pZD4gPT5cbiAgICBEZWJ1Zy5yZWNvcmQoe1xuICAgICAgdHlwZTogJ2RpYWdub3N0aWMnLFxuICAgICAgbW9kdWxlSWQ6IHJ1bnRpbWUubW9kdWxlSWQsXG4gICAgICBpbnN0YW5jZUlkOiBydW50aW1lLmluc3RhbmNlSWQsXG4gICAgICBjb2RlOiAnbG9naWM6OmludmFsaWRfcGhhc2UnLFxuICAgICAgc2V2ZXJpdHk6ICdlcnJvcicsXG4gICAgICBtZXNzYWdlOiBgJHthcGl9IGlzIHNldHVwLW9ubHkgYW5kIGlzIG5vdCBhbGxvd2VkIGluIHJ1biBwaGFzZS5gLFxuICAgICAgaGludDpcbiAgICAgICAgJ01vdmUgJC5saWZlY3ljbGUuKiBjYWxscyB0byB0aGUgc3luY2hyb25vdXMgcGFydCBvZiBNb2R1bGUubG9naWMgYnVpbGRlciAoYmVmb3JlIHJldHVybikgZm9yIHJlZ2lzdHJhdGlvbjsgJyArXG4gICAgICAgICdmb3IgZHluYW1pYyByZXNvdXJjZSBjbGVhbnVwIGluIHRoZSBydW4gcGhhc2UsIHVzZSBFZmZlY3QuYWNxdWlyZVJlbGVhc2UgLyBTY29wZSBmaW5hbGl6ZXIgaW5zdGVhZCBvZiByZWdpc3RlcmluZyBvbkRlc3Ryb3kgbGF0ZS4nLFxuICAgICAga2luZDogJ2xpZmVjeWNsZV9pbl9ydW4nLFxuICAgIH0pXG5cbiAgY29uc3QgY3JlYXRlSW50ZW50QnVpbGRlciA9IDxUPihzdHJlYW06IFN0cmVhbS5TdHJlYW08VD4sIHRyaWdnZXJOYW1lPzogc3RyaW5nKSA9PlxuICAgIG1ha2VJbnRlbnRCdWlsZGVyKHJ1bnRpbWUpKHN0cmVhbSwgdHJpZ2dlck5hbWUpXG5cbiAgY29uc3Qgb25jZUluUnVuU2Vzc2lvbiA9IChrZXk6IHN0cmluZyk6IEVmZmVjdC5FZmZlY3Q8Ym9vbGVhbiwgbmV2ZXIsIGFueT4gPT5cbiAgICBFZmZlY3Quc2VydmljZU9wdGlvbihSdW5TZXNzaW9uVGFnKS5waXBlKFxuICAgICAgRWZmZWN0Lm1hcCgobWF5YmUpID0+IChPcHRpb24uaXNTb21lKG1heWJlKSA/IG1heWJlLnZhbHVlLmxvY2FsLm9uY2Uoa2V5KSA6IHRydWUpKSxcbiAgICApXG5cbiAgbGV0IGNhY2hlZERpYWdub3N0aWNzTGV2ZWw6IERlYnVnLkRpYWdub3N0aWNzTGV2ZWwgfCB1bmRlZmluZWRcblxuICBjb25zdCBpc01vZHVsZUxpa2UgPSAoXG4gICAgdmFsdWU6IHVua25vd24sXG4gICk6IHZhbHVlIGlzIHtcbiAgICByZWFkb25seSBfa2luZDogJ01vZHVsZURlZicgfCAnTW9kdWxlJ1xuICAgIHJlYWRvbmx5IGlkOiBzdHJpbmdcbiAgICByZWFkb25seSB0YWc6IENvbnRleHQuVGFnPGFueSwgTG9naXguTW9kdWxlUnVudGltZTxhbnksIGFueT4+XG4gICAgcmVhZG9ubHkgc2NoZW1hcz86IFJlY29yZDxzdHJpbmcsIHVua25vd24+XG4gICAgcmVhZG9ubHkgbWV0YT86IFJlY29yZDxzdHJpbmcsIHVua25vd24+XG4gICAgcmVhZG9ubHkgZGV2PzogeyByZWFkb25seSBzb3VyY2U/OiB7IHJlYWRvbmx5IGZpbGU6IHN0cmluZzsgcmVhZG9ubHkgbGluZTogbnVtYmVyOyByZWFkb25seSBjb2x1bW46IG51bWJlciB9IH1cbiAgfSA9PlxuICAgIEJvb2xlYW4oXG4gICAgICB2YWx1ZSAmJlxuICAgICAgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJlxuICAgICAgKCh2YWx1ZSBhcyBhbnkpLl9raW5kID09PSAnTW9kdWxlRGVmJyB8fCAodmFsdWUgYXMgYW55KS5fa2luZCA9PT0gJ01vZHVsZScpICYmXG4gICAgICAndGFnJyBpbiAodmFsdWUgYXMgb2JqZWN0KSAmJlxuICAgICAgQ29udGV4dC5pc1RhZygodmFsdWUgYXMgYW55KS50YWcpLFxuICAgIClcblxuICBjb25zdCBidWlsZE1vZHVsZUhhbmRsZSA9IChcbiAgICB0YWc6IENvbnRleHQuVGFnPGFueSwgTG9naXguTW9kdWxlUnVudGltZTxhbnksIGFueT4+LFxuICAgIHJ0OiBMb2dpeC5Nb2R1bGVSdW50aW1lPGFueSwgYW55PixcbiAgKTogdW5rbm93biA9PiB7XG4gICAgY29uc3QgYWN0aW9uc1Byb3h5OiBMb2dpeC5Nb2R1bGVIYW5kbGU8YW55PlsnYWN0aW9ucyddID0gbmV3IFByb3h5KFxuICAgICAge30sXG4gICAgICB7XG4gICAgICAgIGdldDogKF90YXJnZXQsIHByb3ApID0+IChwYXlsb2FkOiB1bmtub3duKSA9PlxuICAgICAgICAgIHJ0LmRpc3BhdGNoKHtcbiAgICAgICAgICAgIF90YWc6IHByb3AgYXMgc3RyaW5nLFxuICAgICAgICAgICAgcGF5bG9hZCxcbiAgICAgICAgICB9KSxcbiAgICAgIH0sXG4gICAgKSBhcyBMb2dpeC5Nb2R1bGVIYW5kbGU8YW55PlsnYWN0aW9ucyddXG5cbiAgICBjb25zdCBoYW5kbGU6IExvZ2l4Lk1vZHVsZUhhbmRsZTxhbnk+ID0ge1xuICAgICAgcmVhZDogKHNlbGVjdG9yKSA9PiBFZmZlY3QubWFwKHJ0LmdldFN0YXRlLCBzZWxlY3RvciksXG4gICAgICBjaGFuZ2VzOiBydC5jaGFuZ2VzLFxuICAgICAgZGlzcGF0Y2g6IHJ0LmRpc3BhdGNoLFxuICAgICAgYWN0aW9ucyQ6IHJ0LmFjdGlvbnMkLFxuICAgICAgYWN0aW9uczogYWN0aW9uc1Byb3h5LFxuICAgIH1cblxuICAgIGNvbnN0IEVYVEVORF9IQU5ETEUgPSBTeW1ib2wuZm9yKCdsb2dpeC5tb2R1bGUuaGFuZGxlLmV4dGVuZCcpXG4gICAgY29uc3QgZXh0ZW5kID0gKHRhZyBhcyBhbnkpPy5bRVhURU5EX0hBTkRMRV0gYXNcbiAgICAgIHwgKChydW50aW1lOiBMb2dpeC5Nb2R1bGVSdW50aW1lPGFueSwgYW55PiwgYmFzZTogTG9naXguTW9kdWxlSGFuZGxlPGFueT4pID0+IHVua25vd24pXG4gICAgICB8IHVuZGVmaW5lZFxuXG4gICAgcmV0dXJuIHR5cGVvZiBleHRlbmQgPT09ICdmdW5jdGlvbicgPyAoZXh0ZW5kKHJ0LCBoYW5kbGUpID8/IGhhbmRsZSkgOiBoYW5kbGVcbiAgfVxuXG4gIGNvbnN0IGVtaXRNb2R1bGVEZXNjcmlwdG9yT25jZSA9IChcbiAgICBtb2R1bGU6IHtcbiAgICAgIHJlYWRvbmx5IGlkOiBzdHJpbmdcbiAgICAgIHJlYWRvbmx5IHRhZzogYW55XG4gICAgICByZWFkb25seSBzY2hlbWFzPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj5cbiAgICAgIHJlYWRvbmx5IG1ldGE/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuICAgICAgcmVhZG9ubHkgZGV2PzogeyByZWFkb25seSBzb3VyY2U/OiB7IHJlYWRvbmx5IGZpbGU6IHN0cmluZzsgcmVhZG9ubHkgbGluZTogbnVtYmVyOyByZWFkb25seSBjb2x1bW46IG51bWJlciB9IH1cbiAgICB9LFxuICAgIHJ0OiBMb2dpeC5Nb2R1bGVSdW50aW1lPGFueSwgYW55PixcbiAgKTogRWZmZWN0LkVmZmVjdDx2b2lkLCBuZXZlciwgYW55PiA9PlxuICAgIEVmZmVjdC5nZW4oZnVuY3Rpb24qICgpIHtcbiAgICAgIC8vIEhvdC1wYXRoIGd1YXJkOiBuZXZlciBlbWl0IGV2ZW50cyB3aGVuIGRpYWdub3N0aWNzIGFyZSBvZmYuXG4gICAgICBpZiAoY2FjaGVkRGlhZ25vc3RpY3NMZXZlbCA9PT0gJ29mZicpIHJldHVyblxuXG4gICAgICBjb25zdCBrZXkgPSBgbW9kdWxlX2Rlc2NyaXB0b3I6JHtTdHJpbmcocnQuaW5zdGFuY2VJZCA/PyAndW5rbm93bicpfWBcbiAgICAgIGNvbnN0IHNob3VsZEVtaXQgPSB5aWVsZCogb25jZUluUnVuU2Vzc2lvbihrZXkpXG4gICAgICBpZiAoIXNob3VsZEVtaXQpIHJldHVyblxuXG4gICAgICBjb25zdCBhY3Rpb25LZXlzID0gT2JqZWN0LmtleXMoKG1vZHVsZS50YWcgYXMgYW55KT8uc2hhcGU/LmFjdGlvbk1hcCA/PyB7fSlcblxuICAgICAgY29uc3QgaW50ZXJuYWxTeW1ib2wgPSBTeW1ib2wuZm9yKCdsb2dpeC5tb2R1bGUuaW50ZXJuYWwnKVxuICAgICAgY29uc3QgaW50ZXJuYWwgPSAobW9kdWxlIGFzIGFueSlbaW50ZXJuYWxTeW1ib2xdIGFzIHsgcmVhZG9ubHkgbW91bnRlZD86IFJlYWRvbmx5QXJyYXk8YW55PiB9IHwgdW5kZWZpbmVkXG5cbiAgICAgIGNvbnN0IGxvZ2ljVW5pdHMgPSAoaW50ZXJuYWw/Lm1vdW50ZWQgPz8gW10pLm1hcCgodTogYW55KSA9PiAoe1xuICAgICAgICBraW5kOiBTdHJpbmcodT8ua2luZCA/PyAndXNlcicpLFxuICAgICAgICBpZDogU3RyaW5nKHU/LmlkID8/ICcnKSxcbiAgICAgICAgZGVyaXZlZDogdT8uZGVyaXZlZCA/IHRydWUgOiB1bmRlZmluZWQsXG4gICAgICAgIG5hbWU6IHR5cGVvZiB1Py5uYW1lID09PSAnc3RyaW5nJyA/IHUubmFtZSA6IHVuZGVmaW5lZCxcbiAgICAgIH0pKVxuXG4gICAgICBjb25zdCBzY2hlbWFLZXlzID0gbW9kdWxlLnNjaGVtYXMgJiYgdHlwZW9mIG1vZHVsZS5zY2hlbWFzID09PSAnb2JqZWN0JyA/IE9iamVjdC5rZXlzKG1vZHVsZS5zY2hlbWFzKSA6IHVuZGVmaW5lZFxuXG4gICAgICBjb25zdCBtZXRhID0gbW9kdWxlLm1ldGEgJiYgdHlwZW9mIG1vZHVsZS5tZXRhID09PSAnb2JqZWN0JyA/IG1vZHVsZS5tZXRhIDogdW5kZWZpbmVkXG5cbiAgICAgIGNvbnN0IHNvdXJjZSA9IG1vZHVsZS5kZXY/LnNvdXJjZVxuXG4gICAgICBjb25zdCB0cmFpdHNTbmFwc2hvdCA9IHJ1bnRpbWVJbnRlcm5hbHMudHJhaXRzLmdldE1vZHVsZVRyYWl0c1NuYXBzaG90KClcbiAgICAgIGNvbnN0IHRyYWl0cyA9IHRyYWl0c1NuYXBzaG90XG4gICAgICAgID8ge1xuICAgICAgICAgICAgZGlnZXN0OiB0cmFpdHNTbmFwc2hvdC5kaWdlc3QsXG4gICAgICAgICAgICBjb3VudDogdHJhaXRzU25hcHNob3QudHJhaXRzLmxlbmd0aCxcbiAgICAgICAgICB9XG4gICAgICAgIDogdW5kZWZpbmVkXG5cbiAgICAgIGNvbnN0IGRhdGEgPSB7XG4gICAgICAgIGlkOiBtb2R1bGUuaWQsXG4gICAgICAgIG1vZHVsZUlkOiBTdHJpbmcocnQubW9kdWxlSWQpLFxuICAgICAgICBpbnN0YW5jZUlkOiBTdHJpbmcocnQuaW5zdGFuY2VJZCksXG4gICAgICAgIGFjdGlvbktleXMsXG4gICAgICAgIGxvZ2ljVW5pdHMsXG4gICAgICAgIHNjaGVtYUtleXMsXG4gICAgICAgIG1ldGEsXG4gICAgICAgIHNvdXJjZSxcbiAgICAgICAgdHJhaXRzLFxuICAgICAgfVxuXG4gICAgICB5aWVsZCogRGVidWcucmVjb3JkKHtcbiAgICAgICAgdHlwZTogJ3RyYWNlOm1vZHVsZTpkZXNjcmlwdG9yJyxcbiAgICAgICAgbW9kdWxlSWQ6IHJ0Lm1vZHVsZUlkLFxuICAgICAgICBpbnN0YW5jZUlkOiBydC5pbnN0YW5jZUlkLFxuICAgICAgICBkYXRhLFxuICAgICAgfSBhcyBhbnkpXG4gICAgfSlcblxuICAvKipcbiAgICogc3RyaWN0OiByZXNvbHZlIGEgTW9kdWxlIHJ1bnRpbWUgb25seSBmcm9tIHRoZSBjdXJyZW50IEVmZmVjdCBlbnZpcm9ubWVudC5cbiAgICpcbiAgICogTm90ZXM6XG4gICAqIC0gV2l0aCBtdWx0aXBsZSByb290cyAvIGluc3RhbmNlcywgYW55IHByb2Nlc3Mtd2lkZSByZWdpc3RyeSBjYW5ub3QgZXhwcmVzcyB0aGUgY29ycmVjdCBzZW1hbnRpY3MuXG4gICAqIC0gQSBtaXNzaW5nIHByb3ZpZGVyIGlzIGEgd2lyaW5nIGVycm9yOiBmYWlsIGRldGVybWluaXN0aWNhbGx5IGFuZCBwcm92aWRlIGFjdGlvbmFibGUgaGludHMgKG1vcmUgZGV0YWlscyBpbiBkZXYvdGVzdCkuXG4gICAqL1xuICBjb25zdCByZXNvbHZlTW9kdWxlUnVudGltZSA9IChcbiAgICB0YWc6IENvbnRleHQuVGFnPGFueSwgTG9naXguTW9kdWxlUnVudGltZTxhbnksIGFueT4+LFxuICApOiBFZmZlY3QuRWZmZWN0PExvZ2l4Lk1vZHVsZVJ1bnRpbWU8YW55LCBhbnk+LCBuZXZlciwgYW55PiA9PlxuICAgIEVmZmVjdC5nZW4oZnVuY3Rpb24qICgpIHtcbiAgICAgIGNvbnN0IHJlcXVlc3RlZE1vZHVsZUlkID0gdHlwZW9mICh0YWcgYXMgYW55KT8uaWQgPT09ICdzdHJpbmcnID8gKCh0YWcgYXMgYW55KS5pZCBhcyBzdHJpbmcpIDogdW5kZWZpbmVkXG4gICAgICBjb25zdCBmcm9tTW9kdWxlSWQgPSB0eXBlb2Ygb3B0aW9ucz8ubW9kdWxlSWQgPT09ICdzdHJpbmcnID8gb3B0aW9ucy5tb2R1bGVJZCA6IHJ1bnRpbWUubW9kdWxlSWRcblxuICAgICAgLy8gc2VsZjogYWx3YXlzIGFsbG93IHJlc29sdmluZyB0aGUgY3VycmVudCBNb2R1bGVSdW50aW1lIChib3RoIEJvdW5kLm1ha2UgYW5kIHJ1bnRpbWUgaW5qZWN0aW9uIHBhdGhzKS5cbiAgICAgIGlmIChyZXF1ZXN0ZWRNb2R1bGVJZCAmJiByZXF1ZXN0ZWRNb2R1bGVJZCA9PT0gcnVudGltZS5tb2R1bGVJZCkge1xuICAgICAgICByZXR1cm4gcnVudGltZSBhcyB1bmtub3duIGFzIExvZ2l4Lk1vZHVsZVJ1bnRpbWU8YW55LCBhbnk+XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGZyb21JbXBvcnRzID0gcnVudGltZUludGVybmFscy5pbXBvcnRzLmdldCh0YWcgYXMgdW5rbm93biBhcyBDb250ZXh0LlRhZzxhbnksIGFueT4pXG4gICAgICBpZiAoZnJvbUltcG9ydHMpIHtcbiAgICAgICAgcmV0dXJuIGZyb21JbXBvcnRzIGFzIHVua25vd24gYXMgTG9naXguTW9kdWxlUnVudGltZTxhbnksIGFueT5cbiAgICAgIH1cblxuICAgICAgLy8gQm91bmQubWFrZSAobm8gbW9kdWxlSWQgY29udGV4dCk6IGFsbG93IHJlc29sdmluZyBmcm9tIHRoZSBjdXJyZW50IEVmZmVjdCBlbnYgKHVzZWZ1bCBmb3IgdGVzdHMvc2NhZmZvbGRpbmcpLlxuICAgICAgaWYgKHR5cGVvZiBvcHRpb25zPy5tb2R1bGVJZCAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgY29uc3QgZnJvbUVudiA9IHlpZWxkKiBFZmZlY3Quc2VydmljZU9wdGlvbih0YWcgYXMgYW55KVxuICAgICAgICBpZiAoT3B0aW9uLmlzU29tZShmcm9tRW52KSkge1xuICAgICAgICAgIHJldHVybiBmcm9tRW52LnZhbHVlIGFzIHVua25vd24gYXMgTG9naXguTW9kdWxlUnVudGltZTxhbnksIGFueT5cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyAyKSBOb3QgZm91bmQ6IGRpZSBpbW1lZGlhdGVseSBcdTIwMTQgdGhpcyBpcyBhIHdpcmluZyBlcnJvcjsgZ3VpZGUgdGhlIGNhbGxlciB0byBmaXggdGhlIGNvbXBvc2l0aW9uLlxuICAgICAgY29uc3QgdG9rZW5JZCA9IHJlcXVlc3RlZE1vZHVsZUlkID8/ICc8dW5rbm93biBtb2R1bGUgaWQ+J1xuICAgICAgY29uc3QgZml4OiBzdHJpbmdbXSA9IGlzRGV2RW52KClcbiAgICAgICAgPyBbXG4gICAgICAgICAgICAnLSBQcm92aWRlIHRoZSBjaGlsZCBpbXBsZW1lbnRhdGlvbiBpbiB0aGUgc2FtZSBzY29wZSAoaW1wb3J0cykuJyxcbiAgICAgICAgICAgIGAgIEV4YW1wbGU6ICR7ZnJvbU1vZHVsZUlkID8/ICdQYXJlbnRNb2R1bGUnfS5pbXBsZW1lbnQoeyBpbXBvcnRzOiBbJHtyZXF1ZXN0ZWRNb2R1bGVJZCA/PyAnQ2hpbGRNb2R1bGUnfS5pbXBsXSwgLi4uIH0pYCxcbiAgICAgICAgICAgICctIElmIHlvdSBpbnRlbnRpb25hbGx5IHdhbnQgYSByb290IHNpbmdsZXRvbiwgcHJvdmlkZSBpdCBhdCBhcHAgcm9vdCAoUnVudGltZS5tYWtlKC4uLix7IGxheWVyIH0pIC8gcm9vdCBpbXBvcnRzKSwnLFxuICAgICAgICAgICAgJyAgYW5kIHVzZSBSb290LnJlc29sdmUoTW9kdWxlVGFnKSAoaW5zdGVhZCBvZiAkLnVzZSkgYXQgdGhlIGNhbGxzaXRlLicsXG4gICAgICAgICAgXVxuICAgICAgICA6IFtdXG5cbiAgICAgIGNvbnN0IGVyciA9IG5ldyBFcnJvcihcbiAgICAgICAgaXNEZXZFbnYoKVxuICAgICAgICAgID8gW1xuICAgICAgICAgICAgICAnW01pc3NpbmdNb2R1bGVSdW50aW1lRXJyb3JdIENhbm5vdCByZXNvbHZlIE1vZHVsZVJ1bnRpbWUgZm9yIE1vZHVsZVRhZy4nLFxuICAgICAgICAgICAgICAnJyxcbiAgICAgICAgICAgICAgYHRva2VuSWQ6ICR7dG9rZW5JZH1gLFxuICAgICAgICAgICAgICAnZW50cnlwb2ludDogbG9naWMuJC51c2UnLFxuICAgICAgICAgICAgICAnbW9kZTogc3RyaWN0JyxcbiAgICAgICAgICAgICAgYGZyb206ICR7ZnJvbU1vZHVsZUlkID8/ICc8dW5rbm93biBtb2R1bGUgaWQ+J31gLFxuICAgICAgICAgICAgICBgc3RhcnRTY29wZTogbW9kdWxlSWQ9JHtmcm9tTW9kdWxlSWQgPz8gJzx1bmtub3duPid9LCBpbnN0YW5jZUlkPSR7U3RyaW5nKHJ1bnRpbWUuaW5zdGFuY2VJZCA/PyAnPHVua25vd24+Jyl9YCxcbiAgICAgICAgICAgICAgJycsXG4gICAgICAgICAgICAgICdmaXg6JyxcbiAgICAgICAgICAgICAgLi4uZml4LFxuICAgICAgICAgICAgXS5qb2luKCdcXG4nKVxuICAgICAgICAgIDogJ1tNaXNzaW5nTW9kdWxlUnVudGltZUVycm9yXSBtb2R1bGUgcnVudGltZSBub3QgZm91bmQnLFxuICAgICAgKVxuXG4gICAgICA7KGVyciBhcyBhbnkpLnRva2VuSWQgPSB0b2tlbklkXG4gICAgICA7KGVyciBhcyBhbnkpLmVudHJ5cG9pbnQgPSAnbG9naWMuJC51c2UnXG4gICAgICA7KGVyciBhcyBhbnkpLm1vZGUgPSAnc3RyaWN0J1xuICAgICAgOyhlcnIgYXMgYW55KS5mcm9tID0gZnJvbU1vZHVsZUlkXG4gICAgICA7KGVyciBhcyBhbnkpLnN0YXJ0U2NvcGUgPSB7XG4gICAgICAgIG1vZHVsZUlkOiBmcm9tTW9kdWxlSWQsXG4gICAgICAgIGluc3RhbmNlSWQ6IFN0cmluZyhydW50aW1lLmluc3RhbmNlSWQgPz8gJzx1bmtub3duPicpLFxuICAgICAgfVxuICAgICAgOyhlcnIgYXMgYW55KS5maXggPSBmaXhcblxuICAgICAgZXJyLm5hbWUgPSAnTWlzc2luZ01vZHVsZVJ1bnRpbWVFcnJvcidcbiAgICAgIHJldHVybiB5aWVsZCogRWZmZWN0LmRpZShlcnIpXG4gICAgfSlcblxuICBjb25zdCBzdGF0ZUFwaTogQm91bmRBcGk8U2gsIFI+WydzdGF0ZSddID0ge1xuICAgIHJlYWQ6IHJ1bnRpbWUuZ2V0U3RhdGUsXG4gICAgdXBkYXRlOiAoZikgPT5cbiAgICAgIEVmZmVjdC5nZW4oZnVuY3Rpb24qICgpIHtcbiAgICAgICAgY29uc3QgaW5UeG4gPSB5aWVsZCogRmliZXJSZWYuZ2V0KFRhc2tSdW5uZXIuaW5TeW5jVHJhbnNhY3Rpb25GaWJlcilcbiAgICAgICAgaWYgKGluVHhuKSB7XG4gICAgICAgICAgY29uc3QgcHJldiA9IHlpZWxkKiBydW50aW1lLmdldFN0YXRlXG4gICAgICAgICAgcmV0dXJuIHlpZWxkKiBydW50aW1lLnNldFN0YXRlKGYocHJldikpXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBib2R5ID0gKCkgPT4gRWZmZWN0LmZsYXRNYXAocnVudGltZS5nZXRTdGF0ZSwgKHByZXYpID0+IHJ1bnRpbWUuc2V0U3RhdGUoZihwcmV2KSkpXG5cbiAgICAgICAgcmV0dXJuIHlpZWxkKiBydW50aW1lSW50ZXJuYWxzXG4gICAgICAgICAgPyBydW50aW1lSW50ZXJuYWxzLnR4bi5ydW5XaXRoU3RhdGVUcmFuc2FjdGlvbih7IGtpbmQ6ICdzdGF0ZScsIG5hbWU6ICd1cGRhdGUnIH0gYXMgYW55LCBib2R5KVxuICAgICAgICAgIDogYm9keSgpXG4gICAgICB9KSxcbiAgICBtdXRhdGU6IChmKSA9PlxuICAgICAgRWZmZWN0LmdlbihmdW5jdGlvbiogKCkge1xuICAgICAgICBjb25zdCByZWNvcmRQYXRjaCA9IHJ1bnRpbWVJbnRlcm5hbHM/LnR4bi5yZWNvcmRTdGF0ZVBhdGNoXG4gICAgICAgIGNvbnN0IHVwZGF0ZURyYWZ0ID0gcnVudGltZUludGVybmFscz8udHhuLnVwZGF0ZURyYWZ0XG5cbiAgICAgICAgY29uc3QgaW5UeG4gPSB5aWVsZCogRmliZXJSZWYuZ2V0KFRhc2tSdW5uZXIuaW5TeW5jVHJhbnNhY3Rpb25GaWJlcilcbiAgICAgICAgaWYgKGluVHhuKSB7XG4gICAgICAgICAgY29uc3QgcHJldiA9IHlpZWxkKiBydW50aW1lLmdldFN0YXRlXG4gICAgICAgICAgY29uc3QgeyBuZXh0U3RhdGUsIHBhdGNoUGF0aHMgfSA9IG11dGF0ZVdpdGhQYXRjaFBhdGhzKHByZXYgYXMgTG9naXguU3RhdGVPZjxTaD4sIChkcmFmdCkgPT4ge1xuICAgICAgICAgICAgZihkcmFmdCBhcyBMb2dpYy5EcmFmdDxMb2dpeC5TdGF0ZU9mPFNoPj4pXG4gICAgICAgICAgfSlcblxuICAgICAgICAgIGZvciAoY29uc3QgcGF0aCBvZiBwYXRjaFBhdGhzKSB7XG4gICAgICAgICAgICByZWNvcmRQYXRjaD8uKHBhdGgsICd1bmtub3duJylcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB1cGRhdGVEcmFmdD8uKG5leHRTdGF0ZSlcbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGJvZHkgPSAoKSA9PlxuICAgICAgICAgIEVmZmVjdC5nZW4oZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICAgIGNvbnN0IHByZXYgPSB5aWVsZCogcnVudGltZS5nZXRTdGF0ZVxuICAgICAgICAgICAgY29uc3QgeyBuZXh0U3RhdGUsIHBhdGNoUGF0aHMgfSA9IG11dGF0ZVdpdGhQYXRjaFBhdGhzKHByZXYgYXMgTG9naXguU3RhdGVPZjxTaD4sIChkcmFmdCkgPT4ge1xuICAgICAgICAgICAgICBmKGRyYWZ0IGFzIExvZ2ljLkRyYWZ0PExvZ2l4LlN0YXRlT2Y8U2g+PilcbiAgICAgICAgICAgIH0pXG5cbiAgICAgICAgICAgIGZvciAoY29uc3QgcGF0aCBvZiBwYXRjaFBhdGhzKSB7XG4gICAgICAgICAgICAgIHJlY29yZFBhdGNoPy4ocGF0aCwgJ3Vua25vd24nKVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB1cGRhdGVEcmFmdD8uKG5leHRTdGF0ZSlcbiAgICAgICAgICB9KVxuXG4gICAgICAgIHJldHVybiB5aWVsZCogcnVudGltZUludGVybmFsc1xuICAgICAgICAgID8gcnVudGltZUludGVybmFscy50eG4ucnVuV2l0aFN0YXRlVHJhbnNhY3Rpb24oeyBraW5kOiAnc3RhdGUnLCBuYW1lOiAnbXV0YXRlJyB9IGFzIGFueSwgYm9keSlcbiAgICAgICAgICA6IGJvZHkoKVxuICAgICAgfSksXG4gICAgcmVmOiBydW50aW1lLnJlZixcbiAgfVxuXG4gIGNvbnN0IGFjdGlvbnMgPSBzaGFwZS5hY3Rpb25NYXAgYXMgQm91bmRBcGk8U2gsIFI+WydhY3Rpb25zJ11cblxuICBjb25zdCBkaXNwYXRjaGVyQ2FjaGUgPSBuZXcgTWFwPHN0cmluZywgKC4uLmFyZ3M6IGFueVtdKSA9PiBFZmZlY3QuRWZmZWN0PHZvaWQsIGFueSwgYW55Pj4oKVxuXG4gIGNvbnN0IGhhc0FjdGlvbiA9IChrZXk6IHN0cmluZyk6IGJvb2xlYW4gPT4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGFjdGlvbnMgYXMgYW55LCBrZXkpXG5cbiAgY29uc3QgZGlzcGF0Y2hlcnM6IEJvdW5kQXBpPFNoLCBSPlsnZGlzcGF0Y2hlcnMnXSA9IG5ldyBQcm94eSh7fSBhcyBhbnksIHtcbiAgICBnZXQ6IChfdGFyZ2V0LCBwcm9wKSA9PiB7XG4gICAgICBpZiAodHlwZW9mIHByb3AgIT09ICdzdHJpbmcnKSByZXR1cm4gdW5kZWZpbmVkXG4gICAgICBpZiAoIWhhc0FjdGlvbihwcm9wKSkgcmV0dXJuIHVuZGVmaW5lZFxuXG4gICAgICBjb25zdCBjYWNoZWQgPSBkaXNwYXRjaGVyQ2FjaGUuZ2V0KHByb3ApXG4gICAgICBpZiAoY2FjaGVkKSByZXR1cm4gY2FjaGVkXG5cbiAgICAgIGNvbnN0IHRva2VuID0gKGFjdGlvbnMgYXMgYW55KVtwcm9wXSBhcyBBY3Rpb24uQW55QWN0aW9uVG9rZW5cbiAgICAgIGNvbnN0IGZuID0gKC4uLmFyZ3M6IGFueVtdKSA9PiBydW50aW1lLmRpc3BhdGNoKCh0b2tlbiBhcyBhbnkpKC4uLmFyZ3MpKVxuXG4gICAgICBkaXNwYXRjaGVyQ2FjaGUuc2V0KHByb3AsIGZuKVxuICAgICAgcmV0dXJuIGZuXG4gICAgfSxcbiAgICBoYXM6IChfdGFyZ2V0LCBwcm9wKSA9PiB0eXBlb2YgcHJvcCA9PT0gJ3N0cmluZycgJiYgaGFzQWN0aW9uKHByb3ApLFxuICAgIG93bktleXM6ICgpID0+IE9iamVjdC5rZXlzKGFjdGlvbnMgYXMgYW55KSxcbiAgICBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I6IChfdGFyZ2V0LCBwcm9wKSA9PiB7XG4gICAgICBpZiAodHlwZW9mIHByb3AgIT09ICdzdHJpbmcnKSByZXR1cm4gdW5kZWZpbmVkXG4gICAgICBpZiAoIWhhc0FjdGlvbihwcm9wKSkgcmV0dXJuIHVuZGVmaW5lZFxuICAgICAgcmV0dXJuIHsgZW51bWVyYWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlIH1cbiAgICB9LFxuICB9KSBhcyB1bmtub3duIGFzIEJvdW5kQXBpPFNoLCBSPlsnZGlzcGF0Y2hlcnMnXVxuXG4gIGNvbnN0IGRpc3BhdGNoOiBCb3VuZEFwaTxTaCwgUj5bJ2Rpc3BhdGNoJ10gPSAoLi4uYXJnczogYW55W10pID0+IHtcbiAgICBjb25zdCBbZmlyc3QsIHNlY29uZF0gPSBhcmdzXG5cbiAgICBpZiAodHlwZW9mIGZpcnN0ID09PSAnc3RyaW5nJykge1xuICAgICAgcmV0dXJuIHJ1bnRpbWUuZGlzcGF0Y2goeyBfdGFnOiBmaXJzdCwgcGF5bG9hZDogc2Vjb25kIH0gYXMgTG9naXguQWN0aW9uT2Y8U2g+KVxuICAgIH1cblxuICAgIGlmIChBY3Rpb24uaXNBY3Rpb25Ub2tlbihmaXJzdCkpIHtcbiAgICAgIHJldHVybiBydW50aW1lLmRpc3BhdGNoKChmaXJzdCBhcyBhbnkpKHNlY29uZCkpXG4gICAgfVxuXG4gICAgcmV0dXJuIHJ1bnRpbWUuZGlzcGF0Y2goZmlyc3QgYXMgTG9naXguQWN0aW9uT2Y8U2g+KVxuICB9XG5cbiAgY29uc3QgbWF0Y2hBcGkgPSA8Vj4odmFsdWU6IFYpOiBMb2dpYy5GbHVlbnRNYXRjaDxWPiA9PiBNYXRjaEJ1aWxkZXIubWFrZU1hdGNoKHZhbHVlKVxuXG4gIGNvbnN0IG1hdGNoVGFnQXBpID0gPFYgZXh0ZW5kcyB7IF90YWc6IHN0cmluZyB9Pih2YWx1ZTogVik6IExvZ2ljLkZsdWVudE1hdGNoVGFnPFY+ID0+XG4gICAgTWF0Y2hCdWlsZGVyLm1ha2VNYXRjaFRhZyh2YWx1ZSlcblxuICAvLyBQcmltYXJ5IHJlZHVjZXIgcmVnaXN0cmF0aW9uOiB3cml0ZSBpbnRvIHRoZSByZWR1Y2VyIG1hcCB2aWEgdGhlIHJ1bnRpbWUncyBpbnRlcm5hbCByZWdpc3RyYXIuXG4gIGNvbnN0IHJlZHVjZXI6IEJvdW5kQXBpPFNoLCBSPlsncmVkdWNlciddID0gKHRhZywgZm4pID0+IHtcbiAgICByZXR1cm4gRWZmZWN0LnN5bmMoKCkgPT4ge1xuICAgICAgcnVudGltZUludGVybmFscy50eG4ucmVnaXN0ZXJSZWR1Y2VyKFN0cmluZyh0YWcpLCBmbiBhcyBhbnkpXG4gICAgfSkgYXMgYW55XG4gIH1cblxuICBjb25zdCBlZmZlY3Q6IEJvdW5kQXBpPFNoLCBSPlsnZWZmZWN0J10gPSAodG9rZW4sIGhhbmRsZXIpID0+XG4gICAgRWZmZWN0LmdlbihmdW5jdGlvbiogKCkge1xuICAgICAgaWYgKCFBY3Rpb24uaXNBY3Rpb25Ub2tlbih0b2tlbikpIHtcbiAgICAgICAgcmV0dXJuIHlpZWxkKiBFZmZlY3QuZGllTWVzc2FnZSgnW0JvdW5kQXBpLmVmZmVjdF0gdG9rZW4gbXVzdCBiZSBhbiBBY3Rpb25Ub2tlbicpXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHBoYXNlID0gZ2V0Q3VycmVudFBoYXNlKClcbiAgICAgIGNvbnN0IGxvZ2ljVW5pdCA9IG9wdGlvbnM/LmxvZ2ljVW5pdFxuXG4gICAgICB5aWVsZCogcnVudGltZUludGVybmFscy5lZmZlY3RzLnJlZ2lzdGVyRWZmZWN0KHtcbiAgICAgICAgYWN0aW9uVGFnOiB0b2tlbi50YWcsXG4gICAgICAgIGhhbmRsZXI6IGhhbmRsZXIgYXMgYW55LFxuICAgICAgICBwaGFzZSxcbiAgICAgICAgLi4uKGxvZ2ljVW5pdFxuICAgICAgICAgID8ge1xuICAgICAgICAgICAgICBsb2dpY1VuaXQ6IHtcbiAgICAgICAgICAgICAgICBsb2dpY1VuaXRJZDogbG9naWNVbml0LmxvZ2ljVW5pdElkLFxuICAgICAgICAgICAgICAgIGxvZ2ljVW5pdExhYmVsOiBsb2dpY1VuaXQubG9naWNVbml0TGFiZWwsXG4gICAgICAgICAgICAgICAgcGF0aDogbG9naWNVbml0LnBhdGgsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9XG4gICAgICAgICAgOiB7fSksXG4gICAgICB9KVxuICAgIH0pIGFzIGFueVxuXG4gIGNvbnN0IGFwaTogQm91bmRBcGk8U2gsIFI+ID0ge1xuICAgIHJvb3Q6IHtcbiAgICAgIHJlc29sdmU6ICh0YWc6IGFueSkgPT4ge1xuICAgICAgICBndWFyZFJ1bk9ubHkoJ3Jvb3RfcmVzb2x2ZV9pbl9zZXR1cCcsICckLnJvb3QucmVzb2x2ZScpXG4gICAgICAgIHJldHVybiBSb290LnJlc29sdmUodGFnLCB7XG4gICAgICAgICAgZW50cnlwb2ludDogJ2xvZ2ljLiQucm9vdC5yZXNvbHZlJyxcbiAgICAgICAgICB3YWl0Rm9yUmVhZHk6IHRydWUsXG4gICAgICAgIH0pIGFzIGFueVxuICAgICAgfSxcbiAgICB9LFxuICAgIHN0YXRlOiBzdGF0ZUFwaSxcbiAgICBhY3Rpb25zLFxuICAgIGRpc3BhdGNoZXJzLFxuICAgIGRpc3BhdGNoLFxuICAgIGZsb3c6IGZsb3dBcGksXG4gICAgbWF0Y2g6IG1hdGNoQXBpLFxuICAgIG1hdGNoVGFnOiBtYXRjaFRhZ0FwaSxcbiAgICBsaWZlY3ljbGU6IHtcbiAgICAgIG9uSW5pdFJlcXVpcmVkOiAoZWZmOiBMb2dpYy5PZjxTaCwgUiwgdm9pZCwgbmV2ZXI+KSA9PiB7XG4gICAgICAgIGlmIChnZXRDdXJyZW50UGhhc2UoKSA9PT0gJ3J1bicpIHtcbiAgICAgICAgICByZXR1cm4gZW1pdFNldHVwT25seVZpb2xhdGlvbignJC5saWZlY3ljbGUub25Jbml0UmVxdWlyZWQnKSBhcyBhbnlcbiAgICAgICAgfVxuICAgICAgICBydW50aW1lSW50ZXJuYWxzLmxpZmVjeWNsZS5yZWdpc3RlckluaXRSZXF1aXJlZChlZmYgYXMgYW55KVxuICAgICAgICByZXR1cm4gRWZmZWN0LnZvaWQgYXMgYW55XG4gICAgICB9LFxuICAgICAgb25TdGFydDogKGVmZjogTG9naWMuT2Y8U2gsIFIsIHZvaWQsIG5ldmVyPikgPT4ge1xuICAgICAgICBpZiAoZ2V0Q3VycmVudFBoYXNlKCkgPT09ICdydW4nKSB7XG4gICAgICAgICAgcmV0dXJuIGVtaXRTZXR1cE9ubHlWaW9sYXRpb24oJyQubGlmZWN5Y2xlLm9uU3RhcnQnKSBhcyBhbnlcbiAgICAgICAgfVxuICAgICAgICBydW50aW1lSW50ZXJuYWxzLmxpZmVjeWNsZS5yZWdpc3RlclN0YXJ0KGVmZiBhcyBhbnkpXG4gICAgICAgIHJldHVybiBFZmZlY3Qudm9pZCBhcyBhbnlcbiAgICAgIH0sXG4gICAgICBvbkluaXQ6IChlZmY6IExvZ2ljLk9mPFNoLCBSLCB2b2lkLCBuZXZlcj4pID0+IHtcbiAgICAgICAgLy8gTGVnYWN5IGFsaWFzOiBzYW1lIHNlbWFudGljcyBhcyBvbkluaXRSZXF1aXJlZCAodG8gcmVkdWNlIG1pZ3JhdGlvbiBmcmljdGlvbikuXG4gICAgICAgIGlmIChnZXRDdXJyZW50UGhhc2UoKSA9PT0gJ3J1bicpIHtcbiAgICAgICAgICByZXR1cm4gZW1pdFNldHVwT25seVZpb2xhdGlvbignJC5saWZlY3ljbGUub25Jbml0JykgYXMgYW55XG4gICAgICAgIH1cbiAgICAgICAgcnVudGltZUludGVybmFscy5saWZlY3ljbGUucmVnaXN0ZXJJbml0UmVxdWlyZWQoZWZmIGFzIGFueSlcbiAgICAgICAgcmV0dXJuIEVmZmVjdC52b2lkIGFzIGFueVxuICAgICAgfSxcbiAgICAgIG9uRGVzdHJveTogKGVmZjogTG9naWMuT2Y8U2gsIFIsIHZvaWQsIG5ldmVyPikgPT4ge1xuICAgICAgICBpZiAoZ2V0Q3VycmVudFBoYXNlKCkgPT09ICdydW4nKSB7XG4gICAgICAgICAgcmV0dXJuIGVtaXRTZXR1cE9ubHlWaW9sYXRpb24oJyQubGlmZWN5Y2xlLm9uRGVzdHJveScpIGFzIGFueVxuICAgICAgICB9XG4gICAgICAgIHJ1bnRpbWVJbnRlcm5hbHMubGlmZWN5Y2xlLnJlZ2lzdGVyRGVzdHJveShlZmYgYXMgYW55KVxuICAgICAgICByZXR1cm4gRWZmZWN0LnZvaWQgYXMgYW55XG4gICAgICB9LFxuICAgICAgb25FcnJvcjogKFxuICAgICAgICBoYW5kbGVyOiAoXG4gICAgICAgICAgY2F1c2U6IGltcG9ydCgnZWZmZWN0JykuQ2F1c2UuQ2F1c2U8dW5rbm93bj4sXG4gICAgICAgICAgY29udGV4dDogTGlmZWN5Y2xlLkVycm9yQ29udGV4dCxcbiAgICAgICAgKSA9PiBFZmZlY3QuRWZmZWN0PHZvaWQsIG5ldmVyLCBSPixcbiAgICAgICkgPT4ge1xuICAgICAgICBpZiAoZ2V0Q3VycmVudFBoYXNlKCkgPT09ICdydW4nKSB7XG4gICAgICAgICAgcmV0dXJuIGVtaXRTZXR1cE9ubHlWaW9sYXRpb24oJyQubGlmZWN5Y2xlLm9uRXJyb3InKSBhcyBhbnlcbiAgICAgICAgfVxuICAgICAgICBydW50aW1lSW50ZXJuYWxzLmxpZmVjeWNsZS5yZWdpc3Rlck9uRXJyb3IoaGFuZGxlciBhcyBhbnkpXG4gICAgICAgIHJldHVybiBFZmZlY3Qudm9pZCBhcyBhbnlcbiAgICAgIH0sXG4gICAgICBvblN1c3BlbmQ6IChlZmY6IExvZ2ljLk9mPFNoLCBSLCB2b2lkLCBuZXZlcj4pID0+IHtcbiAgICAgICAgaWYgKGdldEN1cnJlbnRQaGFzZSgpID09PSAncnVuJykge1xuICAgICAgICAgIHJldHVybiBlbWl0U2V0dXBPbmx5VmlvbGF0aW9uKCckLmxpZmVjeWNsZS5vblN1c3BlbmQnKSBhcyBhbnlcbiAgICAgICAgfVxuICAgICAgICBydW50aW1lSW50ZXJuYWxzLmxpZmVjeWNsZS5yZWdpc3RlclBsYXRmb3JtU3VzcGVuZChFZmZlY3QuYXNWb2lkKGVmZiBhcyBFZmZlY3QuRWZmZWN0PHZvaWQsIG5ldmVyLCBhbnk+KSlcbiAgICAgICAgcmV0dXJuIEVmZmVjdC52b2lkIGFzIGFueVxuICAgICAgfSxcbiAgICAgIG9uUmVzdW1lOiAoZWZmOiBMb2dpYy5PZjxTaCwgUiwgdm9pZCwgbmV2ZXI+KSA9PiB7XG4gICAgICAgIGlmIChnZXRDdXJyZW50UGhhc2UoKSA9PT0gJ3J1bicpIHtcbiAgICAgICAgICByZXR1cm4gZW1pdFNldHVwT25seVZpb2xhdGlvbignJC5saWZlY3ljbGUub25SZXN1bWUnKSBhcyBhbnlcbiAgICAgICAgfVxuICAgICAgICBydW50aW1lSW50ZXJuYWxzLmxpZmVjeWNsZS5yZWdpc3RlclBsYXRmb3JtUmVzdW1lKEVmZmVjdC5hc1ZvaWQoZWZmIGFzIEVmZmVjdC5FZmZlY3Q8dm9pZCwgbmV2ZXIsIGFueT4pKVxuICAgICAgICByZXR1cm4gRWZmZWN0LnZvaWQgYXMgYW55XG4gICAgICB9LFxuICAgICAgb25SZXNldDogKGVmZjogTG9naWMuT2Y8U2gsIFIsIHZvaWQsIG5ldmVyPikgPT4ge1xuICAgICAgICBpZiAoZ2V0Q3VycmVudFBoYXNlKCkgPT09ICdydW4nKSB7XG4gICAgICAgICAgcmV0dXJuIGVtaXRTZXR1cE9ubHlWaW9sYXRpb24oJyQubGlmZWN5Y2xlLm9uUmVzZXQnKSBhcyBhbnlcbiAgICAgICAgfVxuICAgICAgICBydW50aW1lSW50ZXJuYWxzLmxpZmVjeWNsZS5yZWdpc3RlclBsYXRmb3JtUmVzZXQoRWZmZWN0LmFzVm9pZChlZmYgYXMgRWZmZWN0LkVmZmVjdDx2b2lkLCBuZXZlciwgYW55PikpXG4gICAgICAgIHJldHVybiBFZmZlY3Qudm9pZCBhcyBhbnlcbiAgICAgIH0sXG4gICAgfSxcbiAgICB0cmFpdHM6IHtcbiAgICAgIGRlY2xhcmU6ICh0cmFpdHM6IE1vZHVsZVRyYWl0cy5UcmFpdFNwZWMpID0+IHtcbiAgICAgICAgaWYgKGdldEN1cnJlbnRQaGFzZSgpID09PSAncnVuJykge1xuICAgICAgICAgIHRocm93IExvZ2ljRGlhZ25vc3RpY3MubWFrZUxvZ2ljUGhhc2VFcnJvcihcbiAgICAgICAgICAgICd0cmFpdHNfZGVjbGFyZV9pbl9ydW4nLFxuICAgICAgICAgICAgJyQudHJhaXRzLmRlY2xhcmUnLFxuICAgICAgICAgICAgJ3J1bicsXG4gICAgICAgICAgICBvcHRpb25zPy5tb2R1bGVJZCxcbiAgICAgICAgICApXG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXRyYWl0cyB8fCB0eXBlb2YgdHJhaXRzICE9PSAnb2JqZWN0Jykge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignW0ludmFsaWRUcmFpdHNEZWNsYXJhdGlvbl0gJC50cmFpdHMuZGVjbGFyZSBleHBlY3RzIGFuIG9iamVjdC4nKVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgbG9naWNVbml0ID0gb3B0aW9ucz8ubG9naWNVbml0ID8/IHtcbiAgICAgICAgICBsb2dpY1VuaXRJZDogJ3Vua25vd24nLFxuICAgICAgICAgIGxvZ2ljVW5pdElkS2luZDogJ2Rlcml2ZWQnIGFzIGNvbnN0LFxuICAgICAgICAgIGxvZ2ljVW5pdExhYmVsOiAnbG9naWNVbml0OnVua25vd24nLFxuICAgICAgICAgIHBhdGg6IHVuZGVmaW5lZCBhcyBzdHJpbmcgfCB1bmRlZmluZWQsXG4gICAgICAgIH1cblxuICAgICAgICBydW50aW1lSW50ZXJuYWxzLnRyYWl0cy5yZWdpc3Rlck1vZHVsZVRyYWl0c0NvbnRyaWJ1dGlvbih7XG4gICAgICAgICAgdHJhaXRzLFxuICAgICAgICAgIHByb3ZlbmFuY2U6IHtcbiAgICAgICAgICAgIG9yaWdpblR5cGU6ICdsb2dpY1VuaXQnLFxuICAgICAgICAgICAgb3JpZ2luSWQ6IGxvZ2ljVW5pdC5sb2dpY1VuaXRJZCxcbiAgICAgICAgICAgIG9yaWdpbklkS2luZDogbG9naWNVbml0LmxvZ2ljVW5pdElkS2luZCxcbiAgICAgICAgICAgIG9yaWdpbkxhYmVsOiBsb2dpY1VuaXQubG9naWNVbml0TGFiZWwsXG4gICAgICAgICAgICBwYXRoOiBsb2dpY1VuaXQucGF0aCxcbiAgICAgICAgICB9LFxuICAgICAgICB9KVxuICAgICAgfSxcbiAgICAgIHNvdXJjZToge1xuICAgICAgICByZWZyZXNoOiAoZmllbGRQYXRoOiBzdHJpbmcsIG9wdGlvbnM/OiB7IHJlYWRvbmx5IGZvcmNlPzogYm9vbGVhbiB9KSA9PlxuICAgICAgICAgIEVmZmVjdC5nZW4oZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICAgIGNvbnN0IGhhbmRsZXIgPSBydW50aW1lSW50ZXJuYWxzLnRyYWl0cy5nZXRTb3VyY2VSZWZyZXNoSGFuZGxlcihmaWVsZFBhdGgpIGFzXG4gICAgICAgICAgICAgIHwgKChzdGF0ZTogTG9naXguU3RhdGVPZjxTaD4pID0+IEVmZmVjdC5FZmZlY3Q8dm9pZCwgbmV2ZXIsIGFueT4pXG4gICAgICAgICAgICAgIHwgdW5kZWZpbmVkXG4gICAgICAgICAgICBpZiAoIWhhbmRsZXIpIHtcbiAgICAgICAgICAgICAgLy8gSWYgbm8gcmVmcmVzaCBoYW5kbGVyIGlzIHJlZ2lzdGVyZWQsIHRyZWF0IGl0IGFzIGEgbm8tb3AgdG8gYXZvaWQgdGhyb3dpbmcgd2hlbiBTdGF0ZVRyYWl0UHJvZ3JhbSBpcyBub3QgaW5zdGFsbGVkLlxuICAgICAgICAgICAgICByZXR1cm4geWllbGQqIEVmZmVjdC52b2lkXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGZvcmNlID0gb3B0aW9ucz8uZm9yY2UgPT09IHRydWVcbiAgICAgICAgICAgIGNvbnN0IHJ1bkhhbmRsZXIgPSAoc3RhdGU6IExvZ2l4LlN0YXRlT2Y8U2g+KSA9PlxuICAgICAgICAgICAgICBmb3JjZSA/IEVmZmVjdC5sb2NhbGx5KFRhc2tSdW5uZXIuZm9yY2VTb3VyY2VSZWZyZXNoLCB0cnVlKShoYW5kbGVyKHN0YXRlKSkgOiBoYW5kbGVyKHN0YXRlKVxuXG4gICAgICAgICAgICAvLyBOZXZlciBjYWxsIGVucXVldWVUcmFuc2FjdGlvbiBpbnNpZGUgdGhlIHRyYW5zYWN0aW9uIHdpbmRvdyAoaXQgY2FuIGRlYWRsb2NrKTpcbiAgICAgICAgICAgIC8vIC0gUnVuIHRoZSBoYW5kbGVyIGluc2lkZSB0aGUgY3VycmVudCB0cmFuc2FjdGlvbiBzbyBpdCB3cml0ZXMgdG8gdGhlIGRyYWZ0IHZpYSBib3VuZC5zdGF0ZS5tdXRhdGUuXG4gICAgICAgICAgICAvLyAtIFRoZSBvdXRlciB0cmFuc2FjdGlvbiB3aW5kb3cgaXMgcmVzcG9uc2libGUgZm9yIGNvbW1pdCArIGRlYnVnIGFnZ3JlZ2F0aW9uLlxuICAgICAgICAgICAgY29uc3QgaW5UeG4gPSB5aWVsZCogRmliZXJSZWYuZ2V0KFRhc2tSdW5uZXIuaW5TeW5jVHJhbnNhY3Rpb25GaWJlcilcbiAgICAgICAgICAgIGlmIChpblR4bikge1xuICAgICAgICAgICAgICBjb25zdCBzdGF0ZSA9ICh5aWVsZCogcnVudGltZS5nZXRTdGF0ZSkgYXMgTG9naXguU3RhdGVPZjxTaD5cbiAgICAgICAgICAgICAgcmV0dXJuIHlpZWxkKiBydW5IYW5kbGVyKHN0YXRlKVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBUcmVhdCBvbmUgc291cmNlLXJlZnJlc2ggYXMgYSBkZWRpY2F0ZWQgdHJhbnNhY3Rpb24gZW50cnkuXG4gICAgICAgICAgICByZXR1cm4geWllbGQqIHJ1bnRpbWVJbnRlcm5hbHMudHhuLnJ1bldpdGhTdGF0ZVRyYW5zYWN0aW9uKFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAga2luZDogJ3NvdXJjZS1yZWZyZXNoJyxcbiAgICAgICAgICAgICAgICBuYW1lOiBmaWVsZFBhdGgsXG4gICAgICAgICAgICAgIH0gYXMgYW55LFxuICAgICAgICAgICAgICAoKSA9PlxuICAgICAgICAgICAgICAgIEVmZmVjdC5nZW4oZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IHN0YXRlID0gKHlpZWxkKiBydW50aW1lLmdldFN0YXRlKSBhcyBMb2dpeC5TdGF0ZU9mPFNoPlxuICAgICAgICAgICAgICAgICAgcmV0dXJuIHlpZWxkKiBydW5IYW5kbGVyKHN0YXRlKVxuICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgKVxuICAgICAgICAgIH0pLFxuICAgICAgfSxcbiAgICB9LFxuICAgIHJlZHVjZXIsXG4gICAgZWZmZWN0LFxuICAgIHVzZTogbmV3IFByb3h5KCgpID0+IHt9LCB7XG4gICAgICBhcHBseTogKF90YXJnZXQsIF90aGlzQXJnLCBbYXJnXSkgPT4ge1xuICAgICAgICBndWFyZFJ1bk9ubHkoJ3VzZV9pbl9zZXR1cCcsICckLnVzZScpXG4gICAgICAgIGlmIChpc01vZHVsZUxpa2UoYXJnKSkge1xuICAgICAgICAgIGNvbnN0IGRvbWFpbiA9IGFyZ1xuICAgICAgICAgIGNvbnN0IHRhZyA9IGRvbWFpbi50YWcgYXMgdW5rbm93biBhcyBDb250ZXh0LlRhZzxhbnksIExvZ2l4Lk1vZHVsZVJ1bnRpbWU8YW55LCBhbnk+PlxuXG4gICAgICAgICAgY29uc3QgcmVzb2x2ZUFuZEJ1aWxkID0gcmVzb2x2ZU1vZHVsZVJ1bnRpbWUodGFnKS5waXBlKEVmZmVjdC5tYXAoKHJ0KSA9PiBidWlsZE1vZHVsZUhhbmRsZSh0YWcsIHJ0KSkpXG5cbiAgICAgICAgICBjb25zdCByZXNvbHZlV2l0aERlc2NyaXB0b3IgPSByZXNvbHZlTW9kdWxlUnVudGltZSh0YWcpLnBpcGUoXG4gICAgICAgICAgICBFZmZlY3QudGFwKChydCkgPT4gZW1pdE1vZHVsZURlc2NyaXB0b3JPbmNlKGRvbWFpbiwgcnQpKSxcbiAgICAgICAgICAgIEVmZmVjdC5tYXAoKHJ0KSA9PiBidWlsZE1vZHVsZUhhbmRsZSh0YWcsIHJ0KSksXG4gICAgICAgICAgKVxuXG4gICAgICAgICAgY29uc3QgZGV0ZWN0QW5kU2VsZWN0ID0gRmliZXJSZWYuZ2V0KERlYnVnLmN1cnJlbnREaWFnbm9zdGljc0xldmVsKS5waXBlKFxuICAgICAgICAgICAgRWZmZWN0LnRhcCgobGV2ZWwpID0+IHtcbiAgICAgICAgICAgICAgY2FjaGVkRGlhZ25vc3RpY3NMZXZlbCA9IGxldmVsXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIEVmZmVjdC5mbGF0TWFwKChsZXZlbCkgPT4gKGxldmVsID09PSAnb2ZmJyA/IHJlc29sdmVBbmRCdWlsZCA6IHJlc29sdmVXaXRoRGVzY3JpcHRvcikpLFxuICAgICAgICAgIClcblxuICAgICAgICAgIC8vIDAyMiBwZXJmIGdhdGU6IHdoZW4gZGlhZ25vc3RpY3MgYXJlIG9mZiwgJC51c2UobW9kdWxlKSBhbmQgJC51c2UobW9kdWxlLnRhZykgbXVzdCBiZSBlcXVpdmFsZW50IHdpdGggemVybyBleHRyYSBvdmVyaGVhZC5cbiAgICAgICAgICAvLyBDb25zdHJhaW50OiBFZmZlY3QgaXMgYSB2YWx1ZSAocmV1c2FibGUpLCBzbyB3ZSBtdXN0IG9uZS10aW1lIGNhY2hlIGF0IGV4ZWN1dGlvbiB0aW1lIGluc3RlYWQgb2YgYnJhbmNoaW5nIGF0IGNvbnN0cnVjdGlvbiB0aW1lLlxuICAgICAgICAgIHJldHVybiBFZmZlY3Quc3VzcGVuZCgoKSA9PiB7XG4gICAgICAgICAgICBpZiAoY2FjaGVkRGlhZ25vc3RpY3NMZXZlbCA9PT0gJ29mZicpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHJlc29sdmVBbmRCdWlsZFxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoY2FjaGVkRGlhZ25vc3RpY3NMZXZlbCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgIHJldHVybiByZXNvbHZlV2l0aERlc2NyaXB0b3JcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIGRldGVjdEFuZFNlbGVjdFxuICAgICAgICAgIH0pIGFzIHVua25vd24gYXMgTG9naWMuT2Y8U2gsIFIsIGFueSwgbmV2ZXI+XG4gICAgICAgIH1cbiAgICAgICAgaWYgKENvbnRleHQuaXNUYWcoYXJnKSkge1xuICAgICAgICAgIGNvbnN0IGNhbmRpZGF0ZSA9IGFyZyBhcyB7IF9raW5kPzogdW5rbm93biB9XG5cbiAgICAgICAgICAvLyBNb2R1bGU6IHJldHVybiBhIHJlYWQtb25seSBNb2R1bGVIYW5kbGUgdmlldy5cbiAgICAgICAgICBpZiAoY2FuZGlkYXRlLl9raW5kID09PSAnTW9kdWxlVGFnJykge1xuICAgICAgICAgICAgcmV0dXJuIHJlc29sdmVNb2R1bGVSdW50aW1lKGFyZyBhcyBhbnkpLnBpcGUoXG4gICAgICAgICAgICAgIEVmZmVjdC5tYXAoKHJ0OiBMb2dpeC5Nb2R1bGVSdW50aW1lPGFueSwgYW55PikgPT4gYnVpbGRNb2R1bGVIYW5kbGUoYXJnIGFzIGFueSwgcnQpKSxcbiAgICAgICAgICAgICkgYXMgdW5rbm93biBhcyBMb2dpYy5PZjxTaCwgUiwgYW55LCBuZXZlcj5cbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBSZWd1bGFyIHNlcnZpY2UgdGFnOiByZWFkIHRoZSBzZXJ2aWNlIGZyb20gRW52LlxuICAgICAgICAgIHJldHVybiBhcmcgYXMgdW5rbm93biBhcyBMb2dpYy5PZjxTaCwgUiwgYW55LCBuZXZlcj5cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gRWZmZWN0LmRpZSgnQm91bmRBcGkudXNlOiB1bnN1cHBvcnRlZCBhcmd1bWVudCcpIGFzIHVua25vd24gYXMgTG9naWMuT2Y8U2gsIFIsIGFueSwgbmV2ZXI+XG4gICAgICB9LFxuICAgIH0pIGFzIHVua25vd24gYXMgQm91bmRBcGk8U2gsIFI+Wyd1c2UnXSxcbiAgICBvbkFjdGlvbjogbmV3IFByb3h5KCgpID0+IHt9LCB7XG4gICAgICBhcHBseTogKF90YXJnZXQsIF90aGlzQXJnLCBhcmdzKSA9PiB7XG4gICAgICAgIGd1YXJkUnVuT25seSgndXNlX2luX3NldHVwJywgJyQub25BY3Rpb24nKVxuICAgICAgICBjb25zdCBhcmcgPSBhcmdzWzBdXG4gICAgICAgIGlmIChBY3Rpb24uaXNBY3Rpb25Ub2tlbihhcmcpKSB7XG4gICAgICAgICAgY29uc3QgdGFnID0gYXJnLnRhZ1xuICAgICAgICAgIHJldHVybiBjcmVhdGVJbnRlbnRCdWlsZGVyKFxuICAgICAgICAgICAgcnVudGltZS5hY3Rpb25zJC5waXBlKFxuICAgICAgICAgICAgICBTdHJlYW0uZmlsdGVyKChhOiBhbnkpID0+IGEuX3RhZyA9PT0gdGFnIHx8IGEudHlwZSA9PT0gdGFnKSxcbiAgICAgICAgICAgICAgU3RyZWFtLm1hcCgoYTogYW55KSA9PiBhLnBheWxvYWQpLFxuICAgICAgICAgICAgKSxcbiAgICAgICAgICAgIHRhZyxcbiAgICAgICAgICApXG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBhcmcgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICByZXR1cm4gY3JlYXRlSW50ZW50QnVpbGRlcihydW50aW1lLmFjdGlvbnMkLnBpcGUoU3RyZWFtLmZpbHRlcihhcmcpKSlcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIGFyZyA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICByZXR1cm4gY3JlYXRlSW50ZW50QnVpbGRlcihcbiAgICAgICAgICAgIHJ1bnRpbWUuYWN0aW9ucyQucGlwZShTdHJlYW0uZmlsdGVyKChhOiBhbnkpID0+IGEuX3RhZyA9PT0gYXJnIHx8IGEudHlwZSA9PT0gYXJnKSksXG4gICAgICAgICAgICBhcmcsXG4gICAgICAgICAgKVxuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgYXJnID09PSAnb2JqZWN0JyAmJiBhcmcgIT09IG51bGwpIHtcbiAgICAgICAgICBpZiAoJ190YWcnIGluIGFyZykge1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZUludGVudEJ1aWxkZXIoXG4gICAgICAgICAgICAgIHJ1bnRpbWUuYWN0aW9ucyQucGlwZShTdHJlYW0uZmlsdGVyKChhOiBhbnkpID0+IGEuX3RhZyA9PT0gKGFyZyBhcyBhbnkpLl90YWcpKSxcbiAgICAgICAgICAgICAgU3RyaW5nKChhcmcgYXMgYW55KS5fdGFnKSxcbiAgICAgICAgICAgIClcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKFNjaGVtYS5pc1NjaGVtYShhcmcpKSB7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlSW50ZW50QnVpbGRlcihcbiAgICAgICAgICAgICAgcnVudGltZS5hY3Rpb25zJC5waXBlKFxuICAgICAgICAgICAgICAgIFN0cmVhbS5maWx0ZXIoKGE6IGFueSkgPT4ge1xuICAgICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gU2NoZW1hLmRlY29kZVVua25vd25TeW5jKGFyZyBhcyBTY2hlbWEuU2NoZW1hPGFueSwgYW55LCBuZXZlcj4pKGEpXG4gICAgICAgICAgICAgICAgICByZXR1cm4gISFyZXN1bHRcbiAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgIClcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNyZWF0ZUludGVudEJ1aWxkZXIocnVudGltZS5hY3Rpb25zJClcbiAgICAgIH0sXG4gICAgICBnZXQ6IChfdGFyZ2V0LCBwcm9wKSA9PiB7XG4gICAgICAgIGd1YXJkUnVuT25seSgndXNlX2luX3NldHVwJywgJyQub25BY3Rpb24nKVxuICAgICAgICBpZiAodHlwZW9mIHByb3AgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgcmV0dXJuIGNyZWF0ZUludGVudEJ1aWxkZXIoXG4gICAgICAgICAgICBydW50aW1lLmFjdGlvbnMkLnBpcGUoU3RyZWFtLmZpbHRlcigoYTogYW55KSA9PiBhLl90YWcgPT09IHByb3AgfHwgYS50eXBlID09PSBwcm9wKSksXG4gICAgICAgICAgICBwcm9wLFxuICAgICAgICAgIClcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdW5kZWZpbmVkXG4gICAgICB9LFxuICAgIH0pIGFzIHVua25vd24gYXMgQm91bmRBcGk8U2gsIFI+WydvbkFjdGlvbiddLFxuICAgIG9uU3RhdGU6IChzZWxlY3RvcjogKHM6IExvZ2l4LlN0YXRlT2Y8U2g+KSA9PiBhbnkpID0+IHtcbiAgICAgIGd1YXJkUnVuT25seSgndXNlX2luX3NldHVwJywgJyQub25TdGF0ZScpXG4gICAgICByZXR1cm4gY3JlYXRlSW50ZW50QnVpbGRlcihydW50aW1lLmNoYW5nZXMoc2VsZWN0b3IpKVxuICAgIH0sXG4gICAgb246IChzdHJlYW06IFN0cmVhbS5TdHJlYW08YW55PikgPT4ge1xuICAgICAgZ3VhcmRSdW5Pbmx5KCd1c2VfaW5fc2V0dXAnLCAnJC5vbicpXG4gICAgICByZXR1cm4gY3JlYXRlSW50ZW50QnVpbGRlcihzdHJlYW0pXG4gICAgfSxcbiAgfSBhcyBhbnlcblxuICBzZXRCb3VuZEludGVybmFscyhhcGkgYXMgYW55LCBydW50aW1lSW50ZXJuYWxzKVxuXG4gIHJldHVybiBhcGlcbn1cbiIsICJpbXBvcnQgeyBDYXVzZSwgQ29udGV4dCwgRWZmZWN0LCBSZWYgfSBmcm9tICdlZmZlY3QnXG5pbXBvcnQgeyB0b1NlcmlhbGl6YWJsZUVycm9yU3VtbWFyeSB9IGZyb20gJy4vZXJyb3JTdW1tYXJ5LmpzJ1xuaW1wb3J0ICogYXMgRGVidWcgZnJvbSAnLi9EZWJ1Z1NpbmsuanMnXG5cbmV4cG9ydCB0eXBlIFBoYXNlID0gJ2luaXQnIHwgJ3J1bicgfCAnZGVzdHJveScgfCAncGxhdGZvcm0nXG5cbmV4cG9ydCB0eXBlIEhvb2sgPSAnaW5pdFJlcXVpcmVkJyB8ICdzdGFydCcgfCAnZGVzdHJveScgfCAnc3VzcGVuZCcgfCAncmVzdW1lJyB8ICdyZXNldCcgfCAndW5rbm93bidcblxuZXhwb3J0IHR5cGUgVGFza0tpbmQgPSAnaW5pdFJlcXVpcmVkJyB8ICdzdGFydCcgfCAnZGVzdHJveScgfCAncGxhdGZvcm1TdXNwZW5kJyB8ICdwbGF0Zm9ybVJlc3VtZScgfCAncGxhdGZvcm1SZXNldCdcblxuZXhwb3J0IGludGVyZmFjZSBFcnJvckNvbnRleHQge1xuICByZWFkb25seSBwaGFzZTogUGhhc2VcbiAgcmVhZG9ubHkgaG9vazogSG9va1xuICByZWFkb25seSBtb2R1bGVJZDogc3RyaW5nXG4gIHJlYWRvbmx5IGluc3RhbmNlSWQ6IHN0cmluZ1xuICByZWFkb25seSB0YXNrSWQ/OiBzdHJpbmdcbiAgcmVhZG9ubHkgdHhuU2VxPzogbnVtYmVyXG4gIHJlYWRvbmx5IG9wU2VxPzogbnVtYmVyXG4gIC8qKlxuICAgKiBGb3IgZGlhZ25vc3RpY3Mgb25seTogYW4gaW1wbGVtZW50YXRpb24tc2lkZSBtYXJrZXIgaW5kaWNhdGluZyB3aGVyZSB0aGUgZXJyb3Igb3JpZ2luYXRlZCxcbiAgICogZS5nLiBcImxvZ2ljLmZvcmtcIiAvIFwiaW5pdFJlcXVpcmVkXCIgLyBcInN0YXJ0XCIuXG4gICAqXG4gICAqIE5vdGU6IHRoaXMgZmllbGQgbXVzdCBiZSBzZXJpYWxpemFibGUgYW5kIG11c3Qgbm90IGJlY29tZSBhIHByb3RvY29sIGFuY2hvci5cbiAgICovXG4gIHJlYWRvbmx5IG9yaWdpbj86IHN0cmluZ1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIE1vZHVsZVJ1bnRpbWVJZGVudGl0eSB7XG4gIHJlYWRvbmx5IG1vZHVsZUlkOiBzdHJpbmdcbiAgcmVhZG9ubHkgaW5zdGFuY2VJZDogc3RyaW5nXG4gIHJlYWRvbmx5IHJ1bnRpbWVMYWJlbD86IHN0cmluZ1xufVxuXG5leHBvcnQgdHlwZSBJbnN0YW5jZVN0YXR1cyA9ICdjcmVhdGluZycgfCAnaW5pdGlhbGl6aW5nJyB8ICdyZWFkeScgfCAnZmFpbGVkJyB8ICd0ZXJtaW5hdGluZycgfCAndGVybWluYXRlZCdcblxuZXhwb3J0IGludGVyZmFjZSBJbml0UHJvZ3Jlc3Mge1xuICByZWFkb25seSB0b3RhbDogbnVtYmVyXG4gIHJlYWRvbmx5IGNvbXBsZXRlZDogbnVtYmVyXG4gIHJlYWRvbmx5IGN1cnJlbnQ/OiBudW1iZXJcbiAgcmVhZG9ubHkgc3RhcnRlZEF0PzogbnVtYmVyXG59XG5cbmV4cG9ydCB0eXBlIExpZmVjeWNsZU91dGNvbWUgPVxuICB8IHsgcmVhZG9ubHkgc3RhdHVzOiAnc3VjY2VzcycgfVxuICB8IHtcbiAgICAgIHJlYWRvbmx5IHN0YXR1czogJ2ZhaWx1cmUnXG4gICAgICByZWFkb25seSBlcnJvcjogaW1wb3J0KCcuL2Vycm9yU3VtbWFyeS5qcycpLlNlcmlhbGl6YWJsZUVycm9yU3VtbWFyeVxuICAgIH1cblxuZXhwb3J0IGludGVyZmFjZSBMaWZlY3ljbGVTdGF0dXMge1xuICByZWFkb25seSBpZGVudGl0eTogTW9kdWxlUnVudGltZUlkZW50aXR5XG4gIHJlYWRvbmx5IHN0YXR1czogSW5zdGFuY2VTdGF0dXNcbiAgcmVhZG9ubHkgaW5pdE91dGNvbWU/OiBMaWZlY3ljbGVPdXRjb21lXG4gIHJlYWRvbmx5IGluaXRQcm9ncmVzcz86IEluaXRQcm9ncmVzc1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFRhc2tSZWYge1xuICByZWFkb25seSB0YXNrSWQ6IHN0cmluZ1xuICByZWFkb25seSBraW5kOiBUYXNrS2luZFxuICByZWFkb25seSBvcmRlcjogbnVtYmVyXG4gIHJlYWRvbmx5IG5hbWU/OiBzdHJpbmdcbiAgcmVhZG9ubHkgZmF0YWxPbkZhaWx1cmU/OiBib29sZWFuXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTGlmZWN5Y2xlVGFzayBleHRlbmRzIFRhc2tSZWYge1xuICByZWFkb25seSBlZmZlY3Q6IEVmZmVjdC5FZmZlY3Q8dm9pZCwgbmV2ZXIsIGFueT5cbn1cblxuZXhwb3J0IGludGVyZmFjZSBCdWRnZXRzIHtcbiAgLyoqIFBlci1pbnN0YW5jZSBsaWZlY3ljbGUgZXZlbnQgYnVkZ2V0IChhbGlnbmVkIHdpdGggc3BlY3MvMDExIGRhdGEtbW9kZWw7IGRlZmF1bHQgXHUyMjY0IDIwKS4gKi9cbiAgcmVhZG9ubHkgbWF4RXZlbnRzUGVySW5zdGFuY2U6IG51bWJlclxuICAvKiogUGVyLWV2ZW50IHNpemUgYnVkZ2V0IChhbGlnbmVkIHdpdGggc3BlY3MvMDExIGRhdGEtbW9kZWw7IGRlZmF1bHQgXHUyMjY0IDRLQikuICovXG4gIHJlYWRvbmx5IG1heEV2ZW50Qnl0ZXM6IG51bWJlclxufVxuXG5leHBvcnQgaW50ZXJmYWNlIExpZmVjeWNsZU1hbmFnZXIge1xuICByZWFkb25seSBpZGVudGl0eTogTW9kdWxlUnVudGltZUlkZW50aXR5XG4gIHJlYWRvbmx5IGJ1ZGdldHM6IEJ1ZGdldHNcblxuICByZWFkb25seSByZWdpc3RlclBsYXRmb3JtU3VzcGVuZDogKFxuICAgIGVmZmVjdDogRWZmZWN0LkVmZmVjdDx2b2lkLCBuZXZlciwgYW55PixcbiAgICBvcHRpb25zPzogeyByZWFkb25seSBuYW1lPzogc3RyaW5nIH0sXG4gICkgPT4gdm9pZFxuICByZWFkb25seSByZWdpc3RlclBsYXRmb3JtUmVzdW1lOiAoXG4gICAgZWZmZWN0OiBFZmZlY3QuRWZmZWN0PHZvaWQsIG5ldmVyLCBhbnk+LFxuICAgIG9wdGlvbnM/OiB7IHJlYWRvbmx5IG5hbWU/OiBzdHJpbmcgfSxcbiAgKSA9PiB2b2lkXG4gIHJlYWRvbmx5IHJlZ2lzdGVyUGxhdGZvcm1SZXNldDogKFxuICAgIGVmZmVjdDogRWZmZWN0LkVmZmVjdDx2b2lkLCBuZXZlciwgYW55PixcbiAgICBvcHRpb25zPzogeyByZWFkb25seSBuYW1lPzogc3RyaW5nIH0sXG4gICkgPT4gdm9pZFxuXG4gIHJlYWRvbmx5IHJlZ2lzdGVySW5pdFJlcXVpcmVkOiAoZWZmZWN0OiBFZmZlY3QuRWZmZWN0PHZvaWQsIG5ldmVyLCBhbnk+LCBvcHRpb25zPzogeyByZWFkb25seSBuYW1lPzogc3RyaW5nIH0pID0+IHZvaWRcbiAgcmVhZG9ubHkgcmVnaXN0ZXJTdGFydDogKFxuICAgIGVmZmVjdDogRWZmZWN0LkVmZmVjdDx2b2lkLCBuZXZlciwgYW55PixcbiAgICBvcHRpb25zPzogeyByZWFkb25seSBuYW1lPzogc3RyaW5nOyByZWFkb25seSBmYXRhbE9uRmFpbHVyZT86IGJvb2xlYW4gfSxcbiAgKSA9PiB2b2lkXG4gIHJlYWRvbmx5IHJlZ2lzdGVyRGVzdHJveTogKGVmZmVjdDogRWZmZWN0LkVmZmVjdDx2b2lkLCBuZXZlciwgYW55Piwgb3B0aW9ucz86IHsgcmVhZG9ubHkgbmFtZT86IHN0cmluZyB9KSA9PiB2b2lkXG4gIHJlYWRvbmx5IHJlZ2lzdGVyT25FcnJvcjogKFxuICAgIGhhbmRsZXI6IChjYXVzZTogQ2F1c2UuQ2F1c2U8dW5rbm93bj4sIGNvbnRleHQ6IEVycm9yQ29udGV4dCkgPT4gRWZmZWN0LkVmZmVjdDx2b2lkLCBuZXZlciwgYW55PixcbiAgKSA9PiB2b2lkXG5cbiAgcmVhZG9ubHkgZ2V0U3RhdHVzOiBFZmZlY3QuRWZmZWN0PExpZmVjeWNsZVN0YXR1cz5cbiAgcmVhZG9ubHkgc2V0U3RhdHVzOiAoXG4gICAgc3RhdHVzOiBJbnN0YW5jZVN0YXR1cyxcbiAgICBwYXRjaD86IHtcbiAgICAgIHJlYWRvbmx5IGluaXRPdXRjb21lPzogTGlmZWN5Y2xlT3V0Y29tZSB8IHVuZGVmaW5lZFxuICAgICAgcmVhZG9ubHkgaW5pdFByb2dyZXNzPzogSW5pdFByb2dyZXNzIHwgdW5kZWZpbmVkXG4gICAgICByZWFkb25seSBydW50aW1lTGFiZWw/OiBzdHJpbmcgfCB1bmRlZmluZWRcbiAgICB9LFxuICApID0+IEVmZmVjdC5FZmZlY3Q8dm9pZD5cblxuICByZWFkb25seSBub3RpZnlFcnJvcjogKGNhdXNlOiBDYXVzZS5DYXVzZTx1bmtub3duPiwgY29udGV4dDogRXJyb3JDb250ZXh0KSA9PiBFZmZlY3QuRWZmZWN0PHZvaWQsIG5ldmVyLCBhbnk+XG5cbiAgcmVhZG9ubHkgcnVuUGxhdGZvcm1TdXNwZW5kOiBFZmZlY3QuRWZmZWN0PHZvaWQsIG5ldmVyLCBhbnk+XG4gIHJlYWRvbmx5IHJ1blBsYXRmb3JtUmVzdW1lOiBFZmZlY3QuRWZmZWN0PHZvaWQsIG5ldmVyLCBhbnk+XG4gIHJlYWRvbmx5IHJ1blBsYXRmb3JtUmVzZXQ6IEVmZmVjdC5FZmZlY3Q8dm9pZCwgbmV2ZXIsIGFueT5cblxuICByZWFkb25seSBydW5Jbml0UmVxdWlyZWQ6IEVmZmVjdC5FZmZlY3Q8dm9pZCwgdW5rbm93biwgYW55PlxuICByZWFkb25seSBydW5TdGFydDogRWZmZWN0LkVmZmVjdDx2b2lkLCBuZXZlciwgYW55PlxuICByZWFkb25seSBydW5EZXN0cm95OiBFZmZlY3QuRWZmZWN0PHZvaWQsIG5ldmVyLCBhbnk+XG5cbiAgLyoqIERpYWdub3N0aWNzIG9ubHk6IHdoZXRoZXIgYW55IG9uRXJyb3IgaGFuZGxlciBoYXMgYmVlbiByZWdpc3RlcmVkLiAqL1xuICByZWFkb25seSBoYXNPbkVycm9ySGFuZGxlcnM6IEVmZmVjdC5FZmZlY3Q8Ym9vbGVhbj5cblxuICAvKiogVGVzdHMvZGlhZ25vc3RpY3Mgb25seTogcmVhZCBhIHNuYXBzaG90IG9mIHJlZ2lzdGVyZWQgdGFza3MgKGltbXV0YWJsZSB2aWV3KS4gKi9cbiAgcmVhZG9ubHkgZ2V0VGFza1NuYXBzaG90OiBFZmZlY3QuRWZmZWN0PFxuICAgIFJlYWRvbmx5PHtcbiAgICAgIHJlYWRvbmx5IGluaXRSZXF1aXJlZDogUmVhZG9ubHlBcnJheTxUYXNrUmVmPlxuICAgICAgcmVhZG9ubHkgc3RhcnQ6IFJlYWRvbmx5QXJyYXk8VGFza1JlZj5cbiAgICAgIHJlYWRvbmx5IGRlc3Ryb3k6IFJlYWRvbmx5QXJyYXk8VGFza1JlZj5cbiAgICAgIHJlYWRvbmx5IHBsYXRmb3JtU3VzcGVuZDogUmVhZG9ubHlBcnJheTxUYXNrUmVmPlxuICAgICAgcmVhZG9ubHkgcGxhdGZvcm1SZXN1bWU6IFJlYWRvbmx5QXJyYXk8VGFza1JlZj5cbiAgICAgIHJlYWRvbmx5IHBsYXRmb3JtUmVzZXQ6IFJlYWRvbmx5QXJyYXk8VGFza1JlZj5cbiAgICB9PixcbiAgICBuZXZlcixcbiAgICBuZXZlclxuICA+XG59XG5cbmV4cG9ydCBjb25zdCBMaWZlY3ljbGVDb250ZXh0ID0gQ29udGV4dC5HZW5lcmljVGFnPExpZmVjeWNsZU1hbmFnZXI+KCdAbG9naXhqcy9MaWZlY3ljbGVNYW5hZ2VyJylcblxuY29uc3Qgc2FmZVJ1biA9IChsYWJlbDogc3RyaW5nLCBlZmY6IEVmZmVjdC5FZmZlY3Q8dm9pZCwgYW55LCBhbnk+KSA9PlxuICBlZmYucGlwZShcbiAgICBFZmZlY3QubWF0Y2hDYXVzZUVmZmVjdCh7XG4gICAgICBvblN1Y2Nlc3M6ICgpID0+IEVmZmVjdC52b2lkLFxuICAgICAgb25GYWlsdXJlOiAoY2F1c2UpID0+IEVmZmVjdC5sb2dFcnJvcihgWyR7bGFiZWx9XSBmYWlsZWQ6ICR7Q2F1c2UucHJldHR5KGNhdXNlKX1gKSxcbiAgICB9KSxcbiAgKVxuXG5jb25zdCBtYWtlVGFza0lkID0gKGtpbmQ6IFRhc2tLaW5kLCBvcmRlcjogbnVtYmVyKTogc3RyaW5nID0+IGAke2tpbmR9OiR7b3JkZXJ9YFxuXG5leHBvcnQgY29uc3QgbWFrZUxpZmVjeWNsZU1hbmFnZXIgPSAoaWRlbnRpdHk6IE1vZHVsZVJ1bnRpbWVJZGVudGl0eSk6IEVmZmVjdC5FZmZlY3Q8TGlmZWN5Y2xlTWFuYWdlcj4gPT5cbiAgRWZmZWN0LmdlbihmdW5jdGlvbiogKCkge1xuICAgIGNvbnN0IGJ1ZGdldHM6IEJ1ZGdldHMgPSB7XG4gICAgICBtYXhFdmVudHNQZXJJbnN0YW5jZTogMjAsXG4gICAgICBtYXhFdmVudEJ5dGVzOiA0ICogMTAyNCxcbiAgICB9XG5cbiAgICBjb25zdCBzdGF0dXNSZWYgPSB5aWVsZCogUmVmLm1ha2U8TGlmZWN5Y2xlU3RhdHVzPih7XG4gICAgICBpZGVudGl0eSxcbiAgICAgIHN0YXR1czogJ2NyZWF0aW5nJyxcbiAgICB9KVxuXG4gICAgY29uc3QgaW5pdFJlcXVpcmVkOiBMaWZlY3ljbGVUYXNrW10gPSBbXVxuICAgIGNvbnN0IHN0YXJ0OiBMaWZlY3ljbGVUYXNrW10gPSBbXVxuICAgIGNvbnN0IGRlc3Ryb3k6IExpZmVjeWNsZVRhc2tbXSA9IFtdXG4gICAgY29uc3QgcGxhdGZvcm1TdXNwZW5kOiBMaWZlY3ljbGVUYXNrW10gPSBbXVxuICAgIGNvbnN0IHBsYXRmb3JtUmVzdW1lOiBMaWZlY3ljbGVUYXNrW10gPSBbXVxuICAgIGNvbnN0IHBsYXRmb3JtUmVzZXQ6IExpZmVjeWNsZVRhc2tbXSA9IFtdXG4gICAgY29uc3Qgb25FcnJvckhhbmRsZXJzOiBBcnJheTxcbiAgICAgIChjYXVzZTogQ2F1c2UuQ2F1c2U8dW5rbm93bj4sIGNvbnRleHQ6IEVycm9yQ29udGV4dCkgPT4gRWZmZWN0LkVmZmVjdDx2b2lkLCBuZXZlciwgYW55PlxuICAgID4gPSBbXVxuXG4gICAgY29uc3QgZ2V0U3RhdHVzOiBFZmZlY3QuRWZmZWN0PExpZmVjeWNsZVN0YXR1cz4gPSBSZWYuZ2V0KHN0YXR1c1JlZilcblxuICAgIGNvbnN0IHJlY29yZFBoYXNlID0gKHBoYXNlOiBQaGFzZSwgbmFtZTogc3RyaW5nLCBwYXlsb2FkPzogdW5rbm93bik6IEVmZmVjdC5FZmZlY3Q8dm9pZCwgbmV2ZXIsIGFueT4gPT5cbiAgICAgIERlYnVnLnJlY29yZCh7XG4gICAgICAgIHR5cGU6ICdsaWZlY3ljbGU6cGhhc2UnLFxuICAgICAgICBtb2R1bGVJZDogaWRlbnRpdHkubW9kdWxlSWQsXG4gICAgICAgIGluc3RhbmNlSWQ6IGlkZW50aXR5Lmluc3RhbmNlSWQsXG4gICAgICAgIHBoYXNlLFxuICAgICAgICBuYW1lLFxuICAgICAgICBwYXlsb2FkLFxuICAgICAgfSlcblxuICAgIGNvbnN0IHNldFN0YXR1cyA9IChcbiAgICAgIHN0YXR1czogSW5zdGFuY2VTdGF0dXMsXG4gICAgICBwYXRjaD86IHtcbiAgICAgICAgcmVhZG9ubHkgaW5pdE91dGNvbWU/OiBMaWZlY3ljbGVPdXRjb21lIHwgdW5kZWZpbmVkXG4gICAgICAgIHJlYWRvbmx5IGluaXRQcm9ncmVzcz86IEluaXRQcm9ncmVzcyB8IHVuZGVmaW5lZFxuICAgICAgICByZWFkb25seSBydW50aW1lTGFiZWw/OiBzdHJpbmcgfCB1bmRlZmluZWRcbiAgICAgIH0sXG4gICAgKSA9PlxuICAgICAgUmVmLnVwZGF0ZShzdGF0dXNSZWYsIChwcmV2KSA9PiAoe1xuICAgICAgICAuLi5wcmV2LFxuICAgICAgICBpZGVudGl0eToge1xuICAgICAgICAgIC4uLnByZXYuaWRlbnRpdHksXG4gICAgICAgICAgLi4uKHBhdGNoPy5ydW50aW1lTGFiZWwgPyB7IHJ1bnRpbWVMYWJlbDogcGF0Y2gucnVudGltZUxhYmVsIH0gOiBudWxsKSxcbiAgICAgICAgfSxcbiAgICAgICAgc3RhdHVzLFxuICAgICAgICAuLi4ocGF0Y2g/LmluaXRPdXRjb21lICE9PSB1bmRlZmluZWQgPyB7IGluaXRPdXRjb21lOiBwYXRjaC5pbml0T3V0Y29tZSB9IDogbnVsbCksXG4gICAgICAgIC4uLihwYXRjaD8uaW5pdFByb2dyZXNzICE9PSB1bmRlZmluZWQgPyB7IGluaXRQcm9ncmVzczogcGF0Y2guaW5pdFByb2dyZXNzIH0gOiBudWxsKSxcbiAgICAgIH0pKVxuXG4gICAgY29uc3QgcmVnaXN0ZXJJbml0UmVxdWlyZWQgPSAoZWZmZWN0OiBFZmZlY3QuRWZmZWN0PHZvaWQsIG5ldmVyLCBhbnk+LCBvcHRpb25zPzogeyByZWFkb25seSBuYW1lPzogc3RyaW5nIH0pID0+IHtcbiAgICAgIGNvbnN0IG9yZGVyID0gaW5pdFJlcXVpcmVkLmxlbmd0aFxuICAgICAgaW5pdFJlcXVpcmVkLnB1c2goe1xuICAgICAgICB0YXNrSWQ6IG1ha2VUYXNrSWQoJ2luaXRSZXF1aXJlZCcsIG9yZGVyKSxcbiAgICAgICAga2luZDogJ2luaXRSZXF1aXJlZCcsXG4gICAgICAgIG9yZGVyLFxuICAgICAgICBuYW1lOiBvcHRpb25zPy5uYW1lLFxuICAgICAgICBlZmZlY3QsXG4gICAgICB9KVxuICAgIH1cblxuICAgIGNvbnN0IHJlZ2lzdGVyU3RhcnQgPSAoXG4gICAgICBlZmZlY3Q6IEVmZmVjdC5FZmZlY3Q8dm9pZCwgbmV2ZXIsIGFueT4sXG4gICAgICBvcHRpb25zPzogeyByZWFkb25seSBuYW1lPzogc3RyaW5nOyByZWFkb25seSBmYXRhbE9uRmFpbHVyZT86IGJvb2xlYW4gfSxcbiAgICApID0+IHtcbiAgICAgIGNvbnN0IG9yZGVyID0gc3RhcnQubGVuZ3RoXG4gICAgICBzdGFydC5wdXNoKHtcbiAgICAgICAgdGFza0lkOiBtYWtlVGFza0lkKCdzdGFydCcsIG9yZGVyKSxcbiAgICAgICAga2luZDogJ3N0YXJ0JyxcbiAgICAgICAgb3JkZXIsXG4gICAgICAgIG5hbWU6IG9wdGlvbnM/Lm5hbWUsXG4gICAgICAgIGZhdGFsT25GYWlsdXJlOiBvcHRpb25zPy5mYXRhbE9uRmFpbHVyZSxcbiAgICAgICAgZWZmZWN0LFxuICAgICAgfSlcbiAgICB9XG5cbiAgICBjb25zdCByZWdpc3RlckRlc3Ryb3kgPSAoZWZmZWN0OiBFZmZlY3QuRWZmZWN0PHZvaWQsIG5ldmVyLCBhbnk+LCBvcHRpb25zPzogeyByZWFkb25seSBuYW1lPzogc3RyaW5nIH0pID0+IHtcbiAgICAgIGNvbnN0IG9yZGVyID0gZGVzdHJveS5sZW5ndGhcbiAgICAgIGRlc3Ryb3kucHVzaCh7XG4gICAgICAgIHRhc2tJZDogbWFrZVRhc2tJZCgnZGVzdHJveScsIG9yZGVyKSxcbiAgICAgICAga2luZDogJ2Rlc3Ryb3knLFxuICAgICAgICBvcmRlcixcbiAgICAgICAgbmFtZTogb3B0aW9ucz8ubmFtZSxcbiAgICAgICAgZWZmZWN0LFxuICAgICAgfSlcbiAgICB9XG5cbiAgICBjb25zdCByZWdpc3Rlck9uRXJyb3IgPSAoXG4gICAgICBoYW5kbGVyOiAoY2F1c2U6IENhdXNlLkNhdXNlPHVua25vd24+LCBjb250ZXh0OiBFcnJvckNvbnRleHQpID0+IEVmZmVjdC5FZmZlY3Q8dm9pZCwgbmV2ZXIsIGFueT4sXG4gICAgKSA9PiB7XG4gICAgICBvbkVycm9ySGFuZGxlcnMucHVzaChoYW5kbGVyKVxuICAgIH1cblxuICAgIGNvbnN0IHJlZ2lzdGVyUGxhdGZvcm1TdXNwZW5kID0gKGVmZmVjdDogRWZmZWN0LkVmZmVjdDx2b2lkLCBuZXZlciwgYW55Piwgb3B0aW9ucz86IHsgcmVhZG9ubHkgbmFtZT86IHN0cmluZyB9KSA9PiB7XG4gICAgICBjb25zdCBvcmRlciA9IHBsYXRmb3JtU3VzcGVuZC5sZW5ndGhcbiAgICAgIHBsYXRmb3JtU3VzcGVuZC5wdXNoKHtcbiAgICAgICAgdGFza0lkOiBtYWtlVGFza0lkKCdwbGF0Zm9ybVN1c3BlbmQnLCBvcmRlciksXG4gICAgICAgIGtpbmQ6ICdwbGF0Zm9ybVN1c3BlbmQnLFxuICAgICAgICBvcmRlcixcbiAgICAgICAgbmFtZTogb3B0aW9ucz8ubmFtZSxcbiAgICAgICAgZWZmZWN0LFxuICAgICAgfSlcbiAgICB9XG5cbiAgICBjb25zdCByZWdpc3RlclBsYXRmb3JtUmVzdW1lID0gKGVmZmVjdDogRWZmZWN0LkVmZmVjdDx2b2lkLCBuZXZlciwgYW55Piwgb3B0aW9ucz86IHsgcmVhZG9ubHkgbmFtZT86IHN0cmluZyB9KSA9PiB7XG4gICAgICBjb25zdCBvcmRlciA9IHBsYXRmb3JtUmVzdW1lLmxlbmd0aFxuICAgICAgcGxhdGZvcm1SZXN1bWUucHVzaCh7XG4gICAgICAgIHRhc2tJZDogbWFrZVRhc2tJZCgncGxhdGZvcm1SZXN1bWUnLCBvcmRlciksXG4gICAgICAgIGtpbmQ6ICdwbGF0Zm9ybVJlc3VtZScsXG4gICAgICAgIG9yZGVyLFxuICAgICAgICBuYW1lOiBvcHRpb25zPy5uYW1lLFxuICAgICAgICBlZmZlY3QsXG4gICAgICB9KVxuICAgIH1cblxuICAgIGNvbnN0IHJlZ2lzdGVyUGxhdGZvcm1SZXNldCA9IChlZmZlY3Q6IEVmZmVjdC5FZmZlY3Q8dm9pZCwgbmV2ZXIsIGFueT4sIG9wdGlvbnM/OiB7IHJlYWRvbmx5IG5hbWU/OiBzdHJpbmcgfSkgPT4ge1xuICAgICAgY29uc3Qgb3JkZXIgPSBwbGF0Zm9ybVJlc2V0Lmxlbmd0aFxuICAgICAgcGxhdGZvcm1SZXNldC5wdXNoKHtcbiAgICAgICAgdGFza0lkOiBtYWtlVGFza0lkKCdwbGF0Zm9ybVJlc2V0Jywgb3JkZXIpLFxuICAgICAgICBraW5kOiAncGxhdGZvcm1SZXNldCcsXG4gICAgICAgIG9yZGVyLFxuICAgICAgICBuYW1lOiBvcHRpb25zPy5uYW1lLFxuICAgICAgICBlZmZlY3QsXG4gICAgICB9KVxuICAgIH1cblxuICAgIGNvbnN0IG5vdGlmeUVycm9yID0gKGNhdXNlOiBDYXVzZS5DYXVzZTx1bmtub3duPiwgY29udGV4dDogRXJyb3JDb250ZXh0KSA9PiB7XG4gICAgICAvLyBJbnRlcnJ1cHQvY2FuY2VsIHNob3VsZCBub3QgYmUgcmVwb3J0ZWQgYXMgYW4gZXJyb3IuXG4gICAgICBpZiAoQ2F1c2UuaXNJbnRlcnJ1cHRlZChjYXVzZSkpIHtcbiAgICAgICAgcmV0dXJuIEVmZmVjdC52b2lkXG4gICAgICB9XG5cbiAgICAgIHJldHVybiBEZWJ1Zy5yZWNvcmQoe1xuICAgICAgICB0eXBlOiAnbGlmZWN5Y2xlOmVycm9yJyxcbiAgICAgICAgbW9kdWxlSWQ6IGNvbnRleHQubW9kdWxlSWQsXG4gICAgICAgIGluc3RhbmNlSWQ6IGNvbnRleHQuaW5zdGFuY2VJZCxcbiAgICAgICAgY2F1c2UsXG4gICAgICAgIHBoYXNlOiBjb250ZXh0LnBoYXNlLFxuICAgICAgICBob29rOiBjb250ZXh0Lmhvb2ssXG4gICAgICAgIHRhc2tJZDogY29udGV4dC50YXNrSWQsXG4gICAgICAgIHR4blNlcTogY29udGV4dC50eG5TZXEsXG4gICAgICAgIG9wU2VxOiBjb250ZXh0Lm9wU2VxLFxuICAgICAgICBvcmlnaW46IGNvbnRleHQub3JpZ2luLFxuICAgICAgfSkucGlwZShcbiAgICAgICAgRWZmZWN0LnppcFJpZ2h0KFxuICAgICAgICAgIEVmZmVjdC5mb3JFYWNoKFxuICAgICAgICAgICAgb25FcnJvckhhbmRsZXJzLFxuICAgICAgICAgICAgKGhhbmRsZXIpID0+XG4gICAgICAgICAgICAgIGhhbmRsZXIoY2F1c2UsIGNvbnRleHQpLnBpcGUoXG4gICAgICAgICAgICAgICAgRWZmZWN0LmNhdGNoQWxsQ2F1c2UoKGlubmVyKSA9PiBFZmZlY3QubG9nRXJyb3IoYFtsaWZlY3ljbGUub25FcnJvcl0gZmFpbGVkOiAke0NhdXNlLnByZXR0eShpbm5lcil9YCkpLFxuICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgeyBkaXNjYXJkOiB0cnVlIH0sXG4gICAgICAgICAgKSxcbiAgICAgICAgKSxcbiAgICAgIClcbiAgICB9XG5cbiAgICBjb25zdCBydW5Jbml0UmVxdWlyZWQ6IEVmZmVjdC5FZmZlY3Q8dm9pZCwgdW5rbm93biwgYW55PiA9IEVmZmVjdC5nZW4oZnVuY3Rpb24qICgpIHtcbiAgICAgIGNvbnN0IHRvdGFsID0gaW5pdFJlcXVpcmVkLmxlbmd0aFxuICAgICAgaWYgKHRvdGFsID09PSAwKSB7XG4gICAgICAgIHlpZWxkKiBzZXRTdGF0dXMoJ3JlYWR5Jywge1xuICAgICAgICAgIGluaXRQcm9ncmVzczogeyB0b3RhbDogMCwgY29tcGxldGVkOiAwIH0sXG4gICAgICAgICAgaW5pdE91dGNvbWU6IHsgc3RhdHVzOiAnc3VjY2VzcycgfSxcbiAgICAgICAgfSlcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHN0YXJ0ZWRBdCA9IERhdGUubm93KClcbiAgICAgIHlpZWxkKiByZWNvcmRQaGFzZSgnaW5pdCcsICdpbml0UmVxdWlyZWQ6c3RhcnQnLCB7IHRvdGFsIH0pXG4gICAgICB5aWVsZCogc2V0U3RhdHVzKCdpbml0aWFsaXppbmcnLCB7XG4gICAgICAgIGluaXRQcm9ncmVzczogeyB0b3RhbCwgY29tcGxldGVkOiAwLCBjdXJyZW50OiAwLCBzdGFydGVkQXQgfSxcbiAgICAgIH0pXG5cbiAgICAgIGxldCBjb21wbGV0ZWQgPSAwXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGluaXRSZXF1aXJlZC5sZW5ndGg7IGkrKykge1xuICAgICAgICB5aWVsZCogc2V0U3RhdHVzKCdpbml0aWFsaXppbmcnLCB7XG4gICAgICAgICAgaW5pdFByb2dyZXNzOiB7IHRvdGFsLCBjb21wbGV0ZWQsIGN1cnJlbnQ6IGksIHN0YXJ0ZWRBdCB9LFxuICAgICAgICB9KVxuXG4gICAgICAgIGNvbnN0IHRhc2sgPSBpbml0UmVxdWlyZWRbaV1cbiAgICAgICAgY29uc3QgZXhpdCA9IHlpZWxkKiBFZmZlY3QuZXhpdCh0YXNrLmVmZmVjdClcblxuICAgICAgICBpZiAoZXhpdC5fdGFnID09PSAnU3VjY2VzcycpIHtcbiAgICAgICAgICBjb21wbGV0ZWQgKz0gMVxuICAgICAgICAgIHlpZWxkKiBzZXRTdGF0dXMoJ2luaXRpYWxpemluZycsIHtcbiAgICAgICAgICAgIGluaXRQcm9ncmVzczogeyB0b3RhbCwgY29tcGxldGVkLCBjdXJyZW50OiBpICsgMSwgc3RhcnRlZEF0IH0sXG4gICAgICAgICAgfSlcbiAgICAgICAgICBjb250aW51ZVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgc3VtbWFyeSA9IHRvU2VyaWFsaXphYmxlRXJyb3JTdW1tYXJ5KGV4aXQuY2F1c2UpXG4gICAgICAgIHlpZWxkKiBub3RpZnlFcnJvcihleGl0LmNhdXNlLCB7XG4gICAgICAgICAgcGhhc2U6ICdpbml0JyxcbiAgICAgICAgICBob29rOiAnaW5pdFJlcXVpcmVkJyxcbiAgICAgICAgICBtb2R1bGVJZDogaWRlbnRpdHkubW9kdWxlSWQsXG4gICAgICAgICAgaW5zdGFuY2VJZDogaWRlbnRpdHkuaW5zdGFuY2VJZCxcbiAgICAgICAgICB0YXNrSWQ6IHRhc2sudGFza0lkLFxuICAgICAgICAgIG9yaWdpbjogJ2luaXRSZXF1aXJlZCcsXG4gICAgICAgIH0pXG5cbiAgICAgICAgeWllbGQqIHNldFN0YXR1cygnZmFpbGVkJywge1xuICAgICAgICAgIGluaXRQcm9ncmVzczogeyB0b3RhbCwgY29tcGxldGVkLCBjdXJyZW50OiBpLCBzdGFydGVkQXQgfSxcbiAgICAgICAgICBpbml0T3V0Y29tZTogeyBzdGF0dXM6ICdmYWlsdXJlJywgZXJyb3I6IHN1bW1hcnkuZXJyb3JTdW1tYXJ5IH0sXG4gICAgICAgIH0pXG5cbiAgICAgICAgcmV0dXJuIHlpZWxkKiBFZmZlY3QuZmFpbENhdXNlKGV4aXQuY2F1c2UpXG4gICAgICB9XG5cbiAgICAgIHlpZWxkKiByZWNvcmRQaGFzZSgnaW5pdCcsICdpbml0UmVxdWlyZWQ6c3VjY2VzcycsIHsgdG90YWwgfSlcbiAgICAgIHlpZWxkKiBzZXRTdGF0dXMoJ3JlYWR5Jywge1xuICAgICAgICBpbml0UHJvZ3Jlc3M6IHsgdG90YWwsIGNvbXBsZXRlZCwgY3VycmVudDogdG90YWwsIHN0YXJ0ZWRBdCB9LFxuICAgICAgICBpbml0T3V0Y29tZTogeyBzdGF0dXM6ICdzdWNjZXNzJyB9LFxuICAgICAgfSlcbiAgICB9KVxuXG4gICAgY29uc3QgcnVuU3RhcnQ6IEVmZmVjdC5FZmZlY3Q8dm9pZCwgbmV2ZXIsIGFueT4gPSByZWNvcmRQaGFzZSgncnVuJywgJ3N0YXJ0OnNjaGVkdWxlJywge1xuICAgICAgdG90YWw6IHN0YXJ0Lmxlbmd0aCxcbiAgICB9KS5waXBlKFxuICAgICAgRWZmZWN0LnppcFJpZ2h0KFxuICAgICAgICBFZmZlY3QuZm9yRWFjaChcbiAgICAgICAgICBzdGFydCxcbiAgICAgICAgICAodGFzaykgPT5cbiAgICAgICAgICAgIEVmZmVjdC5mb3JrU2NvcGVkKFxuICAgICAgICAgICAgICB0YXNrLmVmZmVjdC5waXBlKFxuICAgICAgICAgICAgICAgIEVmZmVjdC5jYXRjaEFsbENhdXNlKChjYXVzZSkgPT5cbiAgICAgICAgICAgICAgICAgIG5vdGlmeUVycm9yKGNhdXNlLCB7XG4gICAgICAgICAgICAgICAgICAgIHBoYXNlOiAncnVuJyxcbiAgICAgICAgICAgICAgICAgICAgaG9vazogJ3N0YXJ0JyxcbiAgICAgICAgICAgICAgICAgICAgbW9kdWxlSWQ6IGlkZW50aXR5Lm1vZHVsZUlkLFxuICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZUlkOiBpZGVudGl0eS5pbnN0YW5jZUlkLFxuICAgICAgICAgICAgICAgICAgICB0YXNrSWQ6IHRhc2sudGFza0lkLFxuICAgICAgICAgICAgICAgICAgICBvcmlnaW46ICdzdGFydCcsXG4gICAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgKS5waXBlKEVmZmVjdC5hc1ZvaWQpLFxuICAgICAgICAgIHsgZGlzY2FyZDogdHJ1ZSwgY29uY3VycmVuY3k6ICd1bmJvdW5kZWQnIH0sXG4gICAgICAgICksXG4gICAgICApLFxuICAgIClcblxuICAgIGNvbnN0IHJ1bkRlc3Ryb3k6IEVmZmVjdC5FZmZlY3Q8dm9pZCwgbmV2ZXIsIGFueT4gPSBFZmZlY3QuZ2VuKGZ1bmN0aW9uKiAoKSB7XG4gICAgICB5aWVsZCogcmVjb3JkUGhhc2UoJ2Rlc3Ryb3knLCAnZGVzdHJveTpzdGFydCcsIHsgdG90YWw6IGRlc3Ryb3kubGVuZ3RoIH0pXG4gICAgICB5aWVsZCogc2V0U3RhdHVzKCd0ZXJtaW5hdGluZycpXG5cbiAgICAgIC8vIGRlc3Ryb3k6IHJ1biBpbiByZXZlcnNlIHJlZ2lzdHJhdGlvbiBvcmRlciAoTElGTyksIGJlc3QtZWZmb3J0IChvbmUgZmFpbHVyZSBkb2VzIG5vdCBibG9jayBvdGhlcnMpLlxuICAgICAgZm9yIChsZXQgaSA9IGRlc3Ryb3kubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgY29uc3QgdGFzayA9IGRlc3Ryb3lbaV1cbiAgICAgICAgeWllbGQqIHNhZmVSdW4oXG4gICAgICAgICAgJ2xpZmVjeWNsZS5vbkRlc3Ryb3knLFxuICAgICAgICAgIHRhc2suZWZmZWN0LnBpcGUoXG4gICAgICAgICAgICBFZmZlY3QuY2F0Y2hBbGxDYXVzZSgoY2F1c2UpID0+XG4gICAgICAgICAgICAgIG5vdGlmeUVycm9yKGNhdXNlLCB7XG4gICAgICAgICAgICAgICAgcGhhc2U6ICdkZXN0cm95JyxcbiAgICAgICAgICAgICAgICBob29rOiAnZGVzdHJveScsXG4gICAgICAgICAgICAgICAgbW9kdWxlSWQ6IGlkZW50aXR5Lm1vZHVsZUlkLFxuICAgICAgICAgICAgICAgIGluc3RhbmNlSWQ6IGlkZW50aXR5Lmluc3RhbmNlSWQsXG4gICAgICAgICAgICAgICAgdGFza0lkOiB0YXNrLnRhc2tJZCxcbiAgICAgICAgICAgICAgICBvcmlnaW46ICdkZXN0cm95JyxcbiAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICApLFxuICAgICAgICAgICksXG4gICAgICAgIClcbiAgICAgIH1cblxuICAgICAgeWllbGQqIHNldFN0YXR1cygndGVybWluYXRlZCcpXG4gICAgICB5aWVsZCogcmVjb3JkUGhhc2UoJ2Rlc3Ryb3knLCAnZGVzdHJveTpkb25lJywgeyB0b3RhbDogZGVzdHJveS5sZW5ndGggfSlcbiAgICB9KVxuXG4gICAgY29uc3QgcnVuUGxhdGZvcm1TdXNwZW5kOiBFZmZlY3QuRWZmZWN0PHZvaWQsIG5ldmVyLCBhbnk+ID0gRWZmZWN0LmdlbihmdW5jdGlvbiogKCkge1xuICAgICAgaWYgKHBsYXRmb3JtU3VzcGVuZC5sZW5ndGggPT09IDApIHJldHVyblxuXG4gICAgICB5aWVsZCogcmVjb3JkUGhhc2UoJ3BsYXRmb3JtJywgJ3NpZ25hbDpzdXNwZW5kJywgeyB0b3RhbDogcGxhdGZvcm1TdXNwZW5kLmxlbmd0aCB9KVxuICAgICAgZm9yIChjb25zdCB0YXNrIG9mIHBsYXRmb3JtU3VzcGVuZCkge1xuICAgICAgICB5aWVsZCogc2FmZVJ1bihcbiAgICAgICAgICAnbGlmZWN5Y2xlLm9uU3VzcGVuZCcsXG4gICAgICAgICAgdGFzay5lZmZlY3QucGlwZShcbiAgICAgICAgICAgIEVmZmVjdC5jYXRjaEFsbENhdXNlKChjYXVzZSkgPT5cbiAgICAgICAgICAgICAgbm90aWZ5RXJyb3IoY2F1c2UsIHtcbiAgICAgICAgICAgICAgICBwaGFzZTogJ3BsYXRmb3JtJyxcbiAgICAgICAgICAgICAgICBob29rOiAnc3VzcGVuZCcsXG4gICAgICAgICAgICAgICAgbW9kdWxlSWQ6IGlkZW50aXR5Lm1vZHVsZUlkLFxuICAgICAgICAgICAgICAgIGluc3RhbmNlSWQ6IGlkZW50aXR5Lmluc3RhbmNlSWQsXG4gICAgICAgICAgICAgICAgdGFza0lkOiB0YXNrLnRhc2tJZCxcbiAgICAgICAgICAgICAgICBvcmlnaW46ICdwbGF0Zm9ybS5zdXNwZW5kJyxcbiAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICApLFxuICAgICAgICAgICksXG4gICAgICAgIClcbiAgICAgIH1cbiAgICB9KVxuXG4gICAgY29uc3QgcnVuUGxhdGZvcm1SZXN1bWU6IEVmZmVjdC5FZmZlY3Q8dm9pZCwgbmV2ZXIsIGFueT4gPSBFZmZlY3QuZ2VuKGZ1bmN0aW9uKiAoKSB7XG4gICAgICBpZiAocGxhdGZvcm1SZXN1bWUubGVuZ3RoID09PSAwKSByZXR1cm5cblxuICAgICAgeWllbGQqIHJlY29yZFBoYXNlKCdwbGF0Zm9ybScsICdzaWduYWw6cmVzdW1lJywgeyB0b3RhbDogcGxhdGZvcm1SZXN1bWUubGVuZ3RoIH0pXG4gICAgICBmb3IgKGNvbnN0IHRhc2sgb2YgcGxhdGZvcm1SZXN1bWUpIHtcbiAgICAgICAgeWllbGQqIHNhZmVSdW4oXG4gICAgICAgICAgJ2xpZmVjeWNsZS5vblJlc3VtZScsXG4gICAgICAgICAgdGFzay5lZmZlY3QucGlwZShcbiAgICAgICAgICAgIEVmZmVjdC5jYXRjaEFsbENhdXNlKChjYXVzZSkgPT5cbiAgICAgICAgICAgICAgbm90aWZ5RXJyb3IoY2F1c2UsIHtcbiAgICAgICAgICAgICAgICBwaGFzZTogJ3BsYXRmb3JtJyxcbiAgICAgICAgICAgICAgICBob29rOiAncmVzdW1lJyxcbiAgICAgICAgICAgICAgICBtb2R1bGVJZDogaWRlbnRpdHkubW9kdWxlSWQsXG4gICAgICAgICAgICAgICAgaW5zdGFuY2VJZDogaWRlbnRpdHkuaW5zdGFuY2VJZCxcbiAgICAgICAgICAgICAgICB0YXNrSWQ6IHRhc2sudGFza0lkLFxuICAgICAgICAgICAgICAgIG9yaWdpbjogJ3BsYXRmb3JtLnJlc3VtZScsXG4gICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgKSxcbiAgICAgICAgICApLFxuICAgICAgICApXG4gICAgICB9XG4gICAgfSlcblxuICAgIGNvbnN0IHJ1blBsYXRmb3JtUmVzZXQ6IEVmZmVjdC5FZmZlY3Q8dm9pZCwgbmV2ZXIsIGFueT4gPSBFZmZlY3QuZ2VuKGZ1bmN0aW9uKiAoKSB7XG4gICAgICBpZiAocGxhdGZvcm1SZXNldC5sZW5ndGggPT09IDApIHJldHVyblxuXG4gICAgICB5aWVsZCogcmVjb3JkUGhhc2UoJ3BsYXRmb3JtJywgJ3NpZ25hbDpyZXNldCcsIHsgdG90YWw6IHBsYXRmb3JtUmVzZXQubGVuZ3RoIH0pXG4gICAgICBmb3IgKGNvbnN0IHRhc2sgb2YgcGxhdGZvcm1SZXNldCkge1xuICAgICAgICB5aWVsZCogc2FmZVJ1bihcbiAgICAgICAgICAnbGlmZWN5Y2xlLm9uUmVzZXQnLFxuICAgICAgICAgIHRhc2suZWZmZWN0LnBpcGUoXG4gICAgICAgICAgICBFZmZlY3QuY2F0Y2hBbGxDYXVzZSgoY2F1c2UpID0+XG4gICAgICAgICAgICAgIG5vdGlmeUVycm9yKGNhdXNlLCB7XG4gICAgICAgICAgICAgICAgcGhhc2U6ICdwbGF0Zm9ybScsXG4gICAgICAgICAgICAgICAgaG9vazogJ3Jlc2V0JyxcbiAgICAgICAgICAgICAgICBtb2R1bGVJZDogaWRlbnRpdHkubW9kdWxlSWQsXG4gICAgICAgICAgICAgICAgaW5zdGFuY2VJZDogaWRlbnRpdHkuaW5zdGFuY2VJZCxcbiAgICAgICAgICAgICAgICB0YXNrSWQ6IHRhc2sudGFza0lkLFxuICAgICAgICAgICAgICAgIG9yaWdpbjogJ3BsYXRmb3JtLnJlc2V0JyxcbiAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICApLFxuICAgICAgICAgICksXG4gICAgICAgIClcbiAgICAgIH1cbiAgICB9KVxuXG4gICAgY29uc3QgZ2V0VGFza1NuYXBzaG90OiBMaWZlY3ljbGVNYW5hZ2VyWydnZXRUYXNrU25hcHNob3QnXSA9IEVmZmVjdC5zeW5jKCgpID0+ICh7XG4gICAgICBpbml0UmVxdWlyZWQ6IGluaXRSZXF1aXJlZC5tYXAoKHsgZWZmZWN0OiBfZWZmLCAuLi5yZXN0IH0pID0+IHJlc3QpLFxuICAgICAgc3RhcnQ6IHN0YXJ0Lm1hcCgoeyBlZmZlY3Q6IF9lZmYsIC4uLnJlc3QgfSkgPT4gcmVzdCksXG4gICAgICBkZXN0cm95OiBkZXN0cm95Lm1hcCgoeyBlZmZlY3Q6IF9lZmYsIC4uLnJlc3QgfSkgPT4gcmVzdCksXG4gICAgICBwbGF0Zm9ybVN1c3BlbmQ6IHBsYXRmb3JtU3VzcGVuZC5tYXAoKHsgZWZmZWN0OiBfZWZmLCAuLi5yZXN0IH0pID0+IHJlc3QpLFxuICAgICAgcGxhdGZvcm1SZXN1bWU6IHBsYXRmb3JtUmVzdW1lLm1hcCgoeyBlZmZlY3Q6IF9lZmYsIC4uLnJlc3QgfSkgPT4gcmVzdCksXG4gICAgICBwbGF0Zm9ybVJlc2V0OiBwbGF0Zm9ybVJlc2V0Lm1hcCgoeyBlZmZlY3Q6IF9lZmYsIC4uLnJlc3QgfSkgPT4gcmVzdCksXG4gICAgfSkpXG5cbiAgICBjb25zdCBoYXNPbkVycm9ySGFuZGxlcnM6IExpZmVjeWNsZU1hbmFnZXJbJ2hhc09uRXJyb3JIYW5kbGVycyddID0gRWZmZWN0LnN5bmMoKCkgPT4gb25FcnJvckhhbmRsZXJzLmxlbmd0aCA+IDApXG5cbiAgICByZXR1cm4ge1xuICAgICAgaWRlbnRpdHksXG4gICAgICBidWRnZXRzLFxuICAgICAgcmVnaXN0ZXJQbGF0Zm9ybVN1c3BlbmQsXG4gICAgICByZWdpc3RlclBsYXRmb3JtUmVzdW1lLFxuICAgICAgcmVnaXN0ZXJQbGF0Zm9ybVJlc2V0LFxuICAgICAgcmVnaXN0ZXJJbml0UmVxdWlyZWQsXG4gICAgICByZWdpc3RlclN0YXJ0LFxuICAgICAgcmVnaXN0ZXJEZXN0cm95LFxuICAgICAgcmVnaXN0ZXJPbkVycm9yLFxuICAgICAgZ2V0U3RhdHVzLFxuICAgICAgc2V0U3RhdHVzLFxuICAgICAgbm90aWZ5RXJyb3IsXG4gICAgICBydW5QbGF0Zm9ybVN1c3BlbmQsXG4gICAgICBydW5QbGF0Zm9ybVJlc3VtZSxcbiAgICAgIHJ1blBsYXRmb3JtUmVzZXQsXG4gICAgICBydW5Jbml0UmVxdWlyZWQsXG4gICAgICBydW5TdGFydCxcbiAgICAgIHJ1bkRlc3Ryb3ksXG4gICAgICBoYXNPbkVycm9ySGFuZGxlcnMsXG4gICAgICBnZXRUYXNrU25hcHNob3QsXG4gICAgfVxuICB9KVxuIiwgImltcG9ydCB7IENhdXNlLCBDb250ZXh0LCBFZmZlY3QgfSBmcm9tICdlZmZlY3QnXG5pbXBvcnQgKiBhcyBEZWJ1ZyBmcm9tICcuL0RlYnVnU2luay5qcydcbmltcG9ydCB7IGlzRGV2RW52IH0gZnJvbSAnLi9lbnYuanMnXG5cbmNvbnN0IHBoYXNlRGlhZ25vc3RpY3NFbmFibGVkID0gKCk6IGJvb2xlYW4gPT4gaXNEZXZFbnYoKVxuXG4vKipcbiAqIExvZ2ljIGRpYWdub3N0aWNzOlxuICogLSBDdXJyZW50bHkgZm9jdXNlcyBvbiBpbml0aWFsaXphdGlvbiBub2lzZSBjYXVzZWQgYnkgbWlzc2luZyBFbnYgc2VydmljZXMgKFwiU2VydmljZSBub3QgZm91bmRcIikuXG4gKlxuICogRGVzaWduIGludGVudDpcbiAqIC0gSW4gcmVjb21tZW5kZWQgdXNhZ2UsIFJ1bnRpbWUgLyBSZWFjdCBsYXllcnMgcHJvdmlkZSBFbnYgY29ycmVjdGx5LlxuICogLSBJbiBzb21lIHN0YXJ0dXAgdGltaW5nIHdpbmRvd3MsIExvZ2ljIG1heSB0cnkgdG8gcmVhZCBzZXJ2aWNlcyBiZWZvcmUgRW52IGlzIGZ1bGx5IHByb3ZpZGVkLlxuICogLSBTdWNoIGVycm9ycyBvZnRlbiBvY2N1ciBvbmNlLCBkbyBub3QgY2hhbmdlIGZpbmFsIHNlbWFudGljcywgYnV0IHBvbGx1dGUgbG9ncy5cbiAqXG4gKiBUaGVyZWZvcmUgd2UgZW1pdCBhIHdhcm5pbmcgZGlhZ25vc3RpYyB2aWEgRGVidWcsIGV4cGxhaW5pbmcgbGlrZWx5IGNhdXNlcyBhbmQgaW52ZXN0aWdhdGlvbiBwYXRocy5cbiAqIFRoZSByZWFsIGVycm9yIHNlbWFudGljcyBhcmUgc3RpbGwgaGFuZGxlZCBieSBsaWZlY3ljbGUub25FcnJvciAvIEFwcFJ1bnRpbWUub25FcnJvci5cbiAqL1xuXG5jb25zdCBTRVJWSUNFX05PVF9GT1VORF9QUkVGSVggPSAnU2VydmljZSBub3QgZm91bmQ6J1xuXG4vKipcbiAqIElmIHRoZSBDYXVzZSBjb250YWlucyBhIGBTZXJ2aWNlIG5vdCBmb3VuZDogLi4uYCBlcnJvciwgZW1pdCBhIHdhcm5pbmcgZGlhZ25vc3RpYzpcbiAqIC0gY29kZTogbG9naWM6OmVudl9zZXJ2aWNlX25vdF9mb3VuZFxuICogLSBtZXNzYWdlOiB0aGUgb3JpZ2luYWwgZXJyb3IgbWVzc2FnZVxuICogLSBoaW50OiBleHBsYWlucyB0aGlzIGlzIGtub3duIHN0YXJ0dXAgdGltaW5nIG5vaXNlIGFuZCBzdWdnZXN0cyB3aGF0IHRvIGNoZWNrXG4gKi9cbmV4cG9ydCBjb25zdCBlbWl0RW52U2VydmljZU5vdEZvdW5kRGlhZ25vc3RpY0lmTmVlZGVkID0gKFxuICBjYXVzZTogQ2F1c2UuQ2F1c2U8dW5rbm93bj4sXG4gIG1vZHVsZUlkPzogc3RyaW5nLFxuKTogRWZmZWN0LkVmZmVjdDx2b2lkPiA9PlxuICBFZmZlY3QuZ2VuKGZ1bmN0aW9uKiAoKSB7XG4gICAgbGV0IHByZXR0eTogc3RyaW5nXG4gICAgdHJ5IHtcbiAgICAgIHByZXR0eSA9IENhdXNlLnByZXR0eShjYXVzZSwgeyByZW5kZXJFcnJvckNhdXNlOiB0cnVlIH0pXG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBpZiAoIXByZXR0eS5pbmNsdWRlcyhTRVJWSUNFX05PVF9GT1VORF9QUkVGSVgpKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICAvLyAxKSBXYXJuaW5nIGRpYWdub3N0aWMgZm9yIHRoZSBtaXNzaW5nIEVudiBzZXJ2aWNlIGl0c2VsZlxuICAgIHlpZWxkKiBEZWJ1Zy5yZWNvcmQoe1xuICAgICAgdHlwZTogJ2RpYWdub3N0aWMnLFxuICAgICAgbW9kdWxlSWQsXG4gICAgICBjb2RlOiAnbG9naWM6OmVudl9zZXJ2aWNlX25vdF9mb3VuZCcsXG4gICAgICBzZXZlcml0eTogJ3dhcm5pbmcnLFxuICAgICAgbWVzc2FnZTogcHJldHR5LFxuICAgICAgaGludDpcbiAgICAgICAgJ0xvZ2ljIGF0dGVtcHRlZCB0byBhY2Nlc3MgYW4gRW52IHNlcnZpY2UgYmVmb3JlIGl0IHdhcyBwcm92aWRlZC4gVGhpcyBpcyBhIGtub3duIGluaXRpYWxpemF0aW9uIHRpbWluZyBub2lzZSBpbiBSdW50aW1lL1JlYWN0IGludGVncmF0aW9uLiAnICtcbiAgICAgICAgXCJJZiBpdCBoYXBwZW5zIG9uY2UgZHVyaW5nIGVhcmx5IHN0YXJ0dXAgYW5kIGV2ZXJ5dGhpbmcgd29ya3MgYWZ0ZXJ3YXJkLCBpdCdzIGxpa2VseSBoYXJtbGVzczsgXCIgK1xuICAgICAgICAnaWYgaXQgcGVyc2lzdHMgb3IgY29ycmVsYXRlcyB3aXRoIGFwcCBpc3N1ZXMsIHZlcmlmeSBSdW50aW1lLm1ha2UgLyBSdW50aW1lUHJvdmlkZXIubGF5ZXIgcHJvdmlkZXMgdGhlIHNlcnZpY2UuJyxcbiAgICB9KVxuXG4gICAgLy8gMikgSW4gc29tZSBjYXNlcyAoZS5nLiBhY2Nlc3NpbmcgRW52IHRvbyBlYXJseSBkdXJpbmcgTG9naWMgc2V0dXApLCB3ZSBhbHNvIHdhbnQgdG8gc3VyZmFjZVxuICAgIC8vICAgIGxvZ2ljOjppbnZhbGlkX3BoYXNlIHRvIHN1Z2dlc3QgbW92aW5nIEVudiBhY2Nlc3MgdG8gdGhlIHJ1biBzZWN0aW9uLlxuICAgIC8vXG4gICAgLy8gQmVjYXVzZSB3ZSBjYW5ub3QgcmVsaWFibHkgZGV0ZXJtaW5lIHRoZSBwaGFzZSBhdCB0aGlzIHBvaW50LCB0aGlzIGlzIG9ubHkgYSBzdXBwbGVtZW50YWwgc2lnbmFsLlxuICAgIC8vIFRoZSByZWFsIHBoYXNlIGd1YXJkIGlzIHN0aWxsIGhhbmRsZWQgYnkgTG9naWNQaGFzZUVycm9yICsgZW1pdEludmFsaWRQaGFzZURpYWdub3N0aWNJZk5lZWRlZC5cbiAgICB5aWVsZCogRGVidWcucmVjb3JkKHtcbiAgICAgIHR5cGU6ICdkaWFnbm9zdGljJyxcbiAgICAgIG1vZHVsZUlkLFxuICAgICAgY29kZTogJ2xvZ2ljOjppbnZhbGlkX3BoYXNlJyxcbiAgICAgIHNldmVyaXR5OiAnZXJyb3InLFxuICAgICAgbWVzc2FnZTogJyQudXNlIGlzIG5vdCBhbGxvd2VkIGJlZm9yZSBFbnYgaXMgZnVsbHkgcmVhZHkuJyxcbiAgICAgIGhpbnQ6XG4gICAgICAgICdBdm9pZCByZWFkaW5nIHNlcnZpY2VzIGR1cmluZyBzZXR1cCBvciBiZWZvcmUgRW52IGlzIHJlYWR5OyAnICtcbiAgICAgICAgJ21vdmUgRW52IGFjY2VzcyB0byB0aGUgTG9naWMgcnVuIHNlY3Rpb24sIG9yIHdyYXAgaW5pdCB2aWEgJC5saWZlY3ljbGUub25Jbml0UmVxdWlyZWQuJyxcbiAgICAgIGtpbmQ6ICdlbnZfc2VydmljZV9ub3RfcmVhZHknLFxuICAgIH0pXG4gIH0pXG5cbmV4cG9ydCBpbnRlcmZhY2UgTG9naWNQaGFzZUVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICByZWFkb25seSBfdGFnOiAnTG9naWNQaGFzZUVycm9yJ1xuICByZWFkb25seSBraW5kOiBzdHJpbmdcbiAgcmVhZG9ubHkgYXBpPzogc3RyaW5nXG4gIHJlYWRvbmx5IHBoYXNlOiAnc2V0dXAnIHwgJ3J1bidcbiAgcmVhZG9ubHkgbW9kdWxlSWQ/OiBzdHJpbmdcbn1cblxuZXhwb3J0IGludGVyZmFjZSBMb2dpY1BoYXNlU2VydmljZSB7XG4gIHJlYWRvbmx5IGN1cnJlbnQ6ICdzZXR1cCcgfCAncnVuJ1xufVxuXG5leHBvcnQgY29uc3QgTG9naWNQaGFzZVNlcnZpY2VUYWcgPSBDb250ZXh0LkdlbmVyaWNUYWc8TG9naWNQaGFzZVNlcnZpY2U+KCdAbG9naXhqcy9Mb2dpY1BoYXNlU2VydmljZScpXG5cbi8qKlxuICogTG9naWNVbml0U2VydmljZTpcbiAqIC0gSW5qZWN0ZWQgd2hpbGUgZXhlY3V0aW5nIGVhY2ggbW91bnRlZCBsb2dpYyB1bml0IChzY29wZSA9IHRoZSBsb2dpYyB1bml0J3Mgc2V0dXAvcnVuIGZpYmVyKS5cbiAqIC0gVXNlZCBmb3IgdHJhaXQgcHJvdmVuYW5jZSBhbmQgb3RoZXIgXCJib3VuZCB0byB0aGUgY3VycmVudCBsb2dpYyB1bml0XCIgaW5mb3JtYXRpb24gKGFsaWduZWQgd2l0aCAwMjItbW9kdWxlIGxvZ2ljVW5pdElkKS5cbiAqXG4gKiBDb25zdHJhaW50czpcbiAqIC0gUmVhZC1vbmx5IChtdXN0IG5vdCBtdXRhdGUgcnVudGltZSBzdGF0ZSk7IG9ubHkgYSBwcm92ZW5hbmNlL2RpYWdub3N0aWNzIGFuY2hvci5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBMb2dpY1VuaXRTZXJ2aWNlIHtcbiAgcmVhZG9ubHkgbG9naWNVbml0SWQ6IHN0cmluZ1xuICByZWFkb25seSBsb2dpY1VuaXRJZEtpbmQ6ICdleHBsaWNpdCcgfCAnZGVyaXZlZCdcbiAgcmVhZG9ubHkgbG9naWNVbml0TGFiZWw6IHN0cmluZ1xuICByZWFkb25seSBwYXRoPzogc3RyaW5nXG59XG5cbmV4cG9ydCBjbGFzcyBMb2dpY1VuaXRTZXJ2aWNlVGFnIGV4dGVuZHMgQ29udGV4dC5UYWcoJ0Bsb2dpeGpzL0xvZ2ljVW5pdFNlcnZpY2UnKTxcbiAgTG9naWNVbml0U2VydmljZVRhZyxcbiAgTG9naWNVbml0U2VydmljZVxuPigpIHt9XG5cbmV4cG9ydCBjb25zdCBtYWtlTG9naWNQaGFzZUVycm9yID0gKFxuICBraW5kOiBzdHJpbmcsXG4gIGFwaTogc3RyaW5nLFxuICBwaGFzZTogJ3NldHVwJyB8ICdydW4nLFxuICBtb2R1bGVJZD86IHN0cmluZyxcbik6IExvZ2ljUGhhc2VFcnJvciA9PlxuICBPYmplY3QuYXNzaWduKG5ldyBFcnJvcihgW0xvZ2ljUGhhc2VFcnJvcl0gJHthcGl9IGlzIG5vdCBhbGxvd2VkIGluICR7cGhhc2V9IHBoYXNlIChraW5kPSR7a2luZH0pLmApLCB7XG4gICAgX3RhZzogJ0xvZ2ljUGhhc2VFcnJvcicsXG4gICAga2luZCxcbiAgICBhcGksXG4gICAgcGhhc2UsXG4gICAgbW9kdWxlSWQsXG4gIH0pIGFzIExvZ2ljUGhhc2VFcnJvclxuXG4vKipcbiAqIEV4dHJhY3RzIExvZ2ljUGhhc2VFcnJvciBmcm9tIGEgQ2F1c2UgYW5kIGVtaXRzIGl0IGFzIGEgZGlhZ25vc3RpYzpcbiAqIC0gY29kZTogbG9naWM6OmludmFsaWRfcGhhc2VcbiAqIC0ga2luZDogY29uY3JldGUgdmlvbGF0aW9uIGtpbmQgKGUuZy4gdXNlX2luX3NldHVwKVxuICovXG5leHBvcnQgY29uc3QgZW1pdEludmFsaWRQaGFzZURpYWdub3N0aWNJZk5lZWRlZCA9IChcbiAgY2F1c2U6IENhdXNlLkNhdXNlPHVua25vd24+LFxuICBtb2R1bGVJZD86IHN0cmluZyxcbik6IEVmZmVjdC5FZmZlY3Q8dm9pZD4gPT5cbiAgRWZmZWN0LmdlbihmdW5jdGlvbiogKCkge1xuICAgIGlmICghcGhhc2VEaWFnbm9zdGljc0VuYWJsZWQoKSkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgY29uc3QgYWxsRXJyb3JzID0gWy4uLkNhdXNlLmZhaWx1cmVzKGNhdXNlKSwgLi4uQ2F1c2UuZGVmZWN0cyhjYXVzZSldXG5cbiAgICBmb3IgKGNvbnN0IGVyciBvZiBhbGxFcnJvcnMpIHtcbiAgICAgIGNvbnN0IGxvZ2ljRXJyID0gZXJyIGFzIGFueVxuICAgICAgaWYgKGxvZ2ljRXJyICYmIGxvZ2ljRXJyLl90YWcgPT09ICdMb2dpY1BoYXNlRXJyb3InKSB7XG4gICAgICAgIGNvbnN0IHBoYXNlRXJyID0gbG9naWNFcnIgYXMgTG9naWNQaGFzZUVycm9yXG4gICAgICAgIGNvbnN0IGhpbnQgPVxuICAgICAgICAgIHBoYXNlRXJyLmtpbmQgPT09ICd1c2VfaW5fc2V0dXAnIHx8IHBoYXNlRXJyLmtpbmQgPT09ICdsaWZlY3ljbGVfaW5fc2V0dXAnXG4gICAgICAgICAgICA/ICdUaGUgc2V0dXAgcGhhc2UgbXVzdCBub3QgcmVhZCBFbnYvc2VydmljZXMgb3IgcnVuIGxvbmctbGl2ZWQgbG9naWM7IG1vdmUgdGhlIHJlbGV2YW50IGNhbGxzIHRvIHRoZSBydW4gcGhhc2UuJ1xuICAgICAgICAgICAgOiBwaGFzZUVyci5raW5kID09PSAnbGlmZWN5Y2xlX2luX3J1bidcbiAgICAgICAgICAgICAgPyAnRG8gbm90IHJlZ2lzdGVyICQubGlmZWN5Y2xlLiogaW4gdGhlIHJ1biBwaGFzZSAoc2V0dXAtb25seSkuIE1vdmUgbGlmZWN5Y2xlIHJlZ2lzdHJhdGlvbnMgdG8gdGhlIHN5bmNocm9ub3VzIHBhcnQgb2YgTW9kdWxlLmxvZ2ljIGJ1aWxkZXIgKGJlZm9yZSByZXR1cm4pLidcbiAgICAgICAgICAgICAgOiBwaGFzZUVyci5raW5kID09PSAndHJhaXRzX2luX3J1bicgfHwgcGhhc2VFcnIua2luZCA9PT0gJ3RyYWl0c19kZWNsYXJlX2luX3J1bidcbiAgICAgICAgICAgICAgICA/ICdUcmFpdHMgYXJlIGZyb3plbiBhZnRlciBzZXR1cDsgbW92ZSAkLnRyYWl0cy5kZWNsYXJlIHRvIExvZ2ljUGxhbi5zZXR1cCBvciB0aGUgc2V0dXAgcmVnaXN0cmF0aW9uIHBoYXNlIG9mIE1vZHVsZS5sb2dpYyBidWlsZGVyLidcbiAgICAgICAgICAgICAgICA6ICdNb3ZlIGxvZ2ljIHRvIHRoZSBydW4gcGhhc2U7IGtlZXAgc2V0dXAgZm9yIHJlZ2lzdHJhdGlvbnMgb25seS4nXG5cbiAgICAgICAgeWllbGQqIERlYnVnLnJlY29yZCh7XG4gICAgICAgICAgdHlwZTogJ2RpYWdub3N0aWMnLFxuICAgICAgICAgIG1vZHVsZUlkOiBwaGFzZUVyci5tb2R1bGVJZCA/PyBtb2R1bGVJZCxcbiAgICAgICAgICBjb2RlOiAnbG9naWM6OmludmFsaWRfcGhhc2UnLFxuICAgICAgICAgIHNldmVyaXR5OiAnZXJyb3InLFxuICAgICAgICAgIG1lc3NhZ2U6IGAke3BoYXNlRXJyLmFwaSA/PyBwaGFzZUVyci5raW5kfSBpcyBub3QgYWxsb3dlZCBpbiAke3BoYXNlRXJyLnBoYXNlfSBwaGFzZS5gLFxuICAgICAgICAgIGhpbnQsXG4gICAgICAgICAga2luZDogcGhhc2VFcnIua2luZCxcbiAgICAgICAgfSlcblxuICAgICAgICAvLyBSZXR1cm4gYWZ0ZXIgdGhlIGZpcnN0IExvZ2ljUGhhc2VFcnJvciBtYXRjaC5cbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG4gICAgfVxuICB9KVxuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQU1PLElBQU0sdUJBQXVCLENBQUksTUFBUyxZQUFtQztBQUNsRixTQUFPLE9BQU8sTUFBTSxPQUFjO0FBQ3BDO0FBRUEsSUFBTSxtQkFBbUIsQ0FBQyxTQUErQztBQUN2RSxNQUFJLE9BQU8sU0FBUyxVQUFVO0FBQzVCLFVBQU0sVUFBVSxLQUFLLEtBQUs7QUFDMUIsV0FBTyxRQUFRLFNBQVMsSUFBSSxNQUFNO0FBQUEsRUFDcEM7QUFFQSxNQUFJLENBQUMsTUFBTSxRQUFRLElBQUksRUFBRyxRQUFPO0FBRWpDLFFBQU0sUUFBdUIsQ0FBQztBQUM5QixhQUFXLE9BQU8sTUFBTTtBQUN0QixRQUFJLE9BQU8sUUFBUSxVQUFVO0FBQzNCLFVBQUksbUJBQW1CLEdBQUcsRUFBRyxPQUFNLEtBQUssR0FBRztBQUMzQztBQUFBLElBQ0Y7QUFBQSxFQUNGO0FBRUEsTUFBSSxNQUFNLFdBQVcsRUFBRyxRQUFPO0FBQy9CLFNBQU87QUFDVDtBQUVPLElBQU0sdUJBQXVCLENBQ2xDLE1BQ0EsWUFDbUY7QUFDbkYsUUFBTSxNQUFNLE9BQU8sTUFBTSxTQUFnQjtBQUFBLElBQ3ZDLGVBQWU7QUFBQSxNQUNiLGFBQWE7QUFBQSxNQUNiLHVCQUF1QjtBQUFBLElBQ3pCO0FBQUEsRUFDRixDQUFDO0FBRUQsTUFBSSxDQUFDLE1BQU0sUUFBUSxHQUFHLEdBQUc7QUFDdkIsV0FBTyxFQUFFLFdBQVcsS0FBVSxZQUFZLENBQUMsRUFBRTtBQUFBLEVBQy9DO0FBRUEsUUFBTSxZQUFZLElBQUksQ0FBQztBQUN2QixRQUFNLFVBQVcsSUFBSSxDQUFDLEtBQUssQ0FBQztBQUU1QixRQUFNLFFBQVEsb0JBQUksSUFBNkI7QUFDL0MsYUFBVyxTQUFTLFNBQVM7QUFDM0IsVUFBTSxJQUFJLGlCQUFrQixPQUFlLElBQUk7QUFDL0MsUUFBSSxDQUFDLEVBQUc7QUFDUixVQUFNLE1BQU0sTUFBTSxNQUFNLE1BQU0sS0FBSyxVQUFVLENBQUM7QUFDOUMsUUFBSSxDQUFDLE1BQU0sSUFBSSxHQUFHLEVBQUcsT0FBTSxJQUFJLEtBQUssQ0FBQztBQUFBLEVBQ3ZDO0FBRUEsU0FBTztBQUFBLElBQ0w7QUFBQSxJQUNBLFlBQVksTUFBTSxLQUFLLE1BQU0sT0FBTyxDQUFDO0FBQUEsRUFDdkM7QUFDRjs7O0FDNURBLFNBQVMsV0FBQUEsVUFBUyxVQUFBQyxTQUFRLFVBQVUsUUFBUSxRQUFRLGNBQStCOzs7QUNBbkYsU0FBUyxPQUFPLFNBQVMsUUFBUSxXQUFXO0FBNElyQyxJQUFNLG1CQUFtQixRQUFRLFdBQTZCLDJCQUEyQjtBQUVoRyxJQUFNLFVBQVUsQ0FBQyxPQUFlLFFBQzlCLElBQUk7QUFBQSxFQUNGLE9BQU8saUJBQWlCO0FBQUEsSUFDdEIsV0FBVyxNQUFNLE9BQU87QUFBQSxJQUN4QixXQUFXLENBQUMsVUFBVSxPQUFPLFNBQVMsSUFBSSxLQUFLLGFBQWEsTUFBTSxPQUFPLEtBQUssQ0FBQyxFQUFFO0FBQUEsRUFDbkYsQ0FBQztBQUNIO0FBRUYsSUFBTSxhQUFhLENBQUMsTUFBZ0IsVUFBMEIsR0FBRyxJQUFJLElBQUksS0FBSztBQUV2RSxJQUFNLHVCQUF1QixDQUFDLGFBQ25DLE9BQU8sSUFBSSxhQUFhO0FBQ3RCLFFBQU0sVUFBbUI7QUFBQSxJQUN2QixzQkFBc0I7QUFBQSxJQUN0QixlQUFlLElBQUk7QUFBQSxFQUNyQjtBQUVBLFFBQU0sWUFBWSxPQUFPLElBQUksS0FBc0I7QUFBQSxJQUNqRDtBQUFBLElBQ0EsUUFBUTtBQUFBLEVBQ1YsQ0FBQztBQUVELFFBQU0sZUFBZ0MsQ0FBQztBQUN2QyxRQUFNLFFBQXlCLENBQUM7QUFDaEMsUUFBTSxVQUEyQixDQUFDO0FBQ2xDLFFBQU0sa0JBQW1DLENBQUM7QUFDMUMsUUFBTSxpQkFBa0MsQ0FBQztBQUN6QyxRQUFNLGdCQUFpQyxDQUFDO0FBQ3hDLFFBQU0sa0JBRUYsQ0FBQztBQUVMLFFBQU0sWUFBNEMsSUFBSSxJQUFJLFNBQVM7QUFFbkUsUUFBTSxjQUFjLENBQUMsT0FBYyxNQUFjLFlBQ3pDLE9BQU87QUFBQSxJQUNYLE1BQU07QUFBQSxJQUNOLFVBQVUsU0FBUztBQUFBLElBQ25CLFlBQVksU0FBUztBQUFBLElBQ3JCO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxFQUNGLENBQUM7QUFFSCxRQUFNLFlBQVksQ0FDaEIsUUFDQSxVQU1BLElBQUksT0FBTyxXQUFXLENBQUMsVUFBVTtBQUFBLElBQy9CLEdBQUc7QUFBQSxJQUNILFVBQVU7QUFBQSxNQUNSLEdBQUcsS0FBSztBQUFBLE1BQ1IsR0FBSSxPQUFPLGVBQWUsRUFBRSxjQUFjLE1BQU0sYUFBYSxJQUFJO0FBQUEsSUFDbkU7QUFBQSxJQUNBO0FBQUEsSUFDQSxHQUFJLE9BQU8sZ0JBQWdCLFNBQVksRUFBRSxhQUFhLE1BQU0sWUFBWSxJQUFJO0FBQUEsSUFDNUUsR0FBSSxPQUFPLGlCQUFpQixTQUFZLEVBQUUsY0FBYyxNQUFNLGFBQWEsSUFBSTtBQUFBLEVBQ2pGLEVBQUU7QUFFSixRQUFNLHVCQUF1QixDQUFDLFFBQXlDLFlBQXlDO0FBQzlHLFVBQU0sUUFBUSxhQUFhO0FBQzNCLGlCQUFhLEtBQUs7QUFBQSxNQUNoQixRQUFRLFdBQVcsZ0JBQWdCLEtBQUs7QUFBQSxNQUN4QyxNQUFNO0FBQUEsTUFDTjtBQUFBLE1BQ0EsTUFBTSxTQUFTO0FBQUEsTUFDZjtBQUFBLElBQ0YsQ0FBQztBQUFBLEVBQ0g7QUFFQSxRQUFNLGdCQUFnQixDQUNwQixRQUNBLFlBQ0c7QUFDSCxVQUFNLFFBQVEsTUFBTTtBQUNwQixVQUFNLEtBQUs7QUFBQSxNQUNULFFBQVEsV0FBVyxTQUFTLEtBQUs7QUFBQSxNQUNqQyxNQUFNO0FBQUEsTUFDTjtBQUFBLE1BQ0EsTUFBTSxTQUFTO0FBQUEsTUFDZixnQkFBZ0IsU0FBUztBQUFBLE1BQ3pCO0FBQUEsSUFDRixDQUFDO0FBQUEsRUFDSDtBQUVBLFFBQU0sa0JBQWtCLENBQUMsUUFBeUMsWUFBeUM7QUFDekcsVUFBTSxRQUFRLFFBQVE7QUFDdEIsWUFBUSxLQUFLO0FBQUEsTUFDWCxRQUFRLFdBQVcsV0FBVyxLQUFLO0FBQUEsTUFDbkMsTUFBTTtBQUFBLE1BQ047QUFBQSxNQUNBLE1BQU0sU0FBUztBQUFBLE1BQ2Y7QUFBQSxJQUNGLENBQUM7QUFBQSxFQUNIO0FBRUEsUUFBTSxrQkFBa0IsQ0FDdEIsWUFDRztBQUNILG9CQUFnQixLQUFLLE9BQU87QUFBQSxFQUM5QjtBQUVBLFFBQU0sMEJBQTBCLENBQUMsUUFBeUMsWUFBeUM7QUFDakgsVUFBTSxRQUFRLGdCQUFnQjtBQUM5QixvQkFBZ0IsS0FBSztBQUFBLE1BQ25CLFFBQVEsV0FBVyxtQkFBbUIsS0FBSztBQUFBLE1BQzNDLE1BQU07QUFBQSxNQUNOO0FBQUEsTUFDQSxNQUFNLFNBQVM7QUFBQSxNQUNmO0FBQUEsSUFDRixDQUFDO0FBQUEsRUFDSDtBQUVBLFFBQU0seUJBQXlCLENBQUMsUUFBeUMsWUFBeUM7QUFDaEgsVUFBTSxRQUFRLGVBQWU7QUFDN0IsbUJBQWUsS0FBSztBQUFBLE1BQ2xCLFFBQVEsV0FBVyxrQkFBa0IsS0FBSztBQUFBLE1BQzFDLE1BQU07QUFBQSxNQUNOO0FBQUEsTUFDQSxNQUFNLFNBQVM7QUFBQSxNQUNmO0FBQUEsSUFDRixDQUFDO0FBQUEsRUFDSDtBQUVBLFFBQU0sd0JBQXdCLENBQUMsUUFBeUMsWUFBeUM7QUFDL0csVUFBTSxRQUFRLGNBQWM7QUFDNUIsa0JBQWMsS0FBSztBQUFBLE1BQ2pCLFFBQVEsV0FBVyxpQkFBaUIsS0FBSztBQUFBLE1BQ3pDLE1BQU07QUFBQSxNQUNOO0FBQUEsTUFDQSxNQUFNLFNBQVM7QUFBQSxNQUNmO0FBQUEsSUFDRixDQUFDO0FBQUEsRUFDSDtBQUVBLFFBQU0sY0FBYyxDQUFDLE9BQTZCLFlBQTBCO0FBRTFFLFFBQUksTUFBTSxjQUFjLEtBQUssR0FBRztBQUM5QixhQUFPLE9BQU87QUFBQSxJQUNoQjtBQUVBLFdBQWEsT0FBTztBQUFBLE1BQ2xCLE1BQU07QUFBQSxNQUNOLFVBQVUsUUFBUTtBQUFBLE1BQ2xCLFlBQVksUUFBUTtBQUFBLE1BQ3BCO0FBQUEsTUFDQSxPQUFPLFFBQVE7QUFBQSxNQUNmLE1BQU0sUUFBUTtBQUFBLE1BQ2QsUUFBUSxRQUFRO0FBQUEsTUFDaEIsUUFBUSxRQUFRO0FBQUEsTUFDaEIsT0FBTyxRQUFRO0FBQUEsTUFDZixRQUFRLFFBQVE7QUFBQSxJQUNsQixDQUFDLEVBQUU7QUFBQSxNQUNELE9BQU87QUFBQSxRQUNMLE9BQU87QUFBQSxVQUNMO0FBQUEsVUFDQSxDQUFDLFlBQ0MsUUFBUSxPQUFPLE9BQU8sRUFBRTtBQUFBLFlBQ3RCLE9BQU8sY0FBYyxDQUFDLFVBQVUsT0FBTyxTQUFTLCtCQUErQixNQUFNLE9BQU8sS0FBSyxDQUFDLEVBQUUsQ0FBQztBQUFBLFVBQ3ZHO0FBQUEsVUFDRixFQUFFLFNBQVMsS0FBSztBQUFBLFFBQ2xCO0FBQUEsTUFDRjtBQUFBLElBQ0Y7QUFBQSxFQUNGO0FBRUEsUUFBTSxrQkFBcUQsT0FBTyxJQUFJLGFBQWE7QUFDakYsVUFBTSxRQUFRLGFBQWE7QUFDM0IsUUFBSSxVQUFVLEdBQUc7QUFDZixhQUFPLFVBQVUsU0FBUztBQUFBLFFBQ3hCLGNBQWMsRUFBRSxPQUFPLEdBQUcsV0FBVyxFQUFFO0FBQUEsUUFDdkMsYUFBYSxFQUFFLFFBQVEsVUFBVTtBQUFBLE1BQ25DLENBQUM7QUFDRDtBQUFBLElBQ0Y7QUFFQSxVQUFNLFlBQVksS0FBSyxJQUFJO0FBQzNCLFdBQU8sWUFBWSxRQUFRLHNCQUFzQixFQUFFLE1BQU0sQ0FBQztBQUMxRCxXQUFPLFVBQVUsZ0JBQWdCO0FBQUEsTUFDL0IsY0FBYyxFQUFFLE9BQU8sV0FBVyxHQUFHLFNBQVMsR0FBRyxVQUFVO0FBQUEsSUFDN0QsQ0FBQztBQUVELFFBQUksWUFBWTtBQUNoQixhQUFTLElBQUksR0FBRyxJQUFJLGFBQWEsUUFBUSxLQUFLO0FBQzVDLGFBQU8sVUFBVSxnQkFBZ0I7QUFBQSxRQUMvQixjQUFjLEVBQUUsT0FBTyxXQUFXLFNBQVMsR0FBRyxVQUFVO0FBQUEsTUFDMUQsQ0FBQztBQUVELFlBQU0sT0FBTyxhQUFhLENBQUM7QUFDM0IsWUFBTSxPQUFPLE9BQU8sT0FBTyxLQUFLLEtBQUssTUFBTTtBQUUzQyxVQUFJLEtBQUssU0FBUyxXQUFXO0FBQzNCLHFCQUFhO0FBQ2IsZUFBTyxVQUFVLGdCQUFnQjtBQUFBLFVBQy9CLGNBQWMsRUFBRSxPQUFPLFdBQVcsU0FBUyxJQUFJLEdBQUcsVUFBVTtBQUFBLFFBQzlELENBQUM7QUFDRDtBQUFBLE1BQ0Y7QUFFQSxZQUFNLFVBQVUsMkJBQTJCLEtBQUssS0FBSztBQUNyRCxhQUFPLFlBQVksS0FBSyxPQUFPO0FBQUEsUUFDN0IsT0FBTztBQUFBLFFBQ1AsTUFBTTtBQUFBLFFBQ04sVUFBVSxTQUFTO0FBQUEsUUFDbkIsWUFBWSxTQUFTO0FBQUEsUUFDckIsUUFBUSxLQUFLO0FBQUEsUUFDYixRQUFRO0FBQUEsTUFDVixDQUFDO0FBRUQsYUFBTyxVQUFVLFVBQVU7QUFBQSxRQUN6QixjQUFjLEVBQUUsT0FBTyxXQUFXLFNBQVMsR0FBRyxVQUFVO0FBQUEsUUFDeEQsYUFBYSxFQUFFLFFBQVEsV0FBVyxPQUFPLFFBQVEsYUFBYTtBQUFBLE1BQ2hFLENBQUM7QUFFRCxhQUFPLE9BQU8sT0FBTyxVQUFVLEtBQUssS0FBSztBQUFBLElBQzNDO0FBRUEsV0FBTyxZQUFZLFFBQVEsd0JBQXdCLEVBQUUsTUFBTSxDQUFDO0FBQzVELFdBQU8sVUFBVSxTQUFTO0FBQUEsTUFDeEIsY0FBYyxFQUFFLE9BQU8sV0FBVyxTQUFTLE9BQU8sVUFBVTtBQUFBLE1BQzVELGFBQWEsRUFBRSxRQUFRLFVBQVU7QUFBQSxJQUNuQyxDQUFDO0FBQUEsRUFDSCxDQUFDO0FBRUQsUUFBTSxXQUE0QyxZQUFZLE9BQU8sa0JBQWtCO0FBQUEsSUFDckYsT0FBTyxNQUFNO0FBQUEsRUFDZixDQUFDLEVBQUU7QUFBQSxJQUNELE9BQU87QUFBQSxNQUNMLE9BQU87QUFBQSxRQUNMO0FBQUEsUUFDQSxDQUFDLFNBQ0MsT0FBTztBQUFBLFVBQ0wsS0FBSyxPQUFPO0FBQUEsWUFDVixPQUFPO0FBQUEsY0FBYyxDQUFDLFVBQ3BCLFlBQVksT0FBTztBQUFBLGdCQUNqQixPQUFPO0FBQUEsZ0JBQ1AsTUFBTTtBQUFBLGdCQUNOLFVBQVUsU0FBUztBQUFBLGdCQUNuQixZQUFZLFNBQVM7QUFBQSxnQkFDckIsUUFBUSxLQUFLO0FBQUEsZ0JBQ2IsUUFBUTtBQUFBLGNBQ1YsQ0FBQztBQUFBLFlBQ0g7QUFBQSxVQUNGO0FBQUEsUUFDRixFQUFFLEtBQUssT0FBTyxNQUFNO0FBQUEsUUFDdEIsRUFBRSxTQUFTLE1BQU0sYUFBYSxZQUFZO0FBQUEsTUFDNUM7QUFBQSxJQUNGO0FBQUEsRUFDRjtBQUVBLFFBQU0sYUFBOEMsT0FBTyxJQUFJLGFBQWE7QUFDMUUsV0FBTyxZQUFZLFdBQVcsaUJBQWlCLEVBQUUsT0FBTyxRQUFRLE9BQU8sQ0FBQztBQUN4RSxXQUFPLFVBQVUsYUFBYTtBQUc5QixhQUFTLElBQUksUUFBUSxTQUFTLEdBQUcsS0FBSyxHQUFHLEtBQUs7QUFDNUMsWUFBTSxPQUFPLFFBQVEsQ0FBQztBQUN0QixhQUFPO0FBQUEsUUFDTDtBQUFBLFFBQ0EsS0FBSyxPQUFPO0FBQUEsVUFDVixPQUFPO0FBQUEsWUFBYyxDQUFDLFVBQ3BCLFlBQVksT0FBTztBQUFBLGNBQ2pCLE9BQU87QUFBQSxjQUNQLE1BQU07QUFBQSxjQUNOLFVBQVUsU0FBUztBQUFBLGNBQ25CLFlBQVksU0FBUztBQUFBLGNBQ3JCLFFBQVEsS0FBSztBQUFBLGNBQ2IsUUFBUTtBQUFBLFlBQ1YsQ0FBQztBQUFBLFVBQ0g7QUFBQSxRQUNGO0FBQUEsTUFDRjtBQUFBLElBQ0Y7QUFFQSxXQUFPLFVBQVUsWUFBWTtBQUM3QixXQUFPLFlBQVksV0FBVyxnQkFBZ0IsRUFBRSxPQUFPLFFBQVEsT0FBTyxDQUFDO0FBQUEsRUFDekUsQ0FBQztBQUVELFFBQU0scUJBQXNELE9BQU8sSUFBSSxhQUFhO0FBQ2xGLFFBQUksZ0JBQWdCLFdBQVcsRUFBRztBQUVsQyxXQUFPLFlBQVksWUFBWSxrQkFBa0IsRUFBRSxPQUFPLGdCQUFnQixPQUFPLENBQUM7QUFDbEYsZUFBVyxRQUFRLGlCQUFpQjtBQUNsQyxhQUFPO0FBQUEsUUFDTDtBQUFBLFFBQ0EsS0FBSyxPQUFPO0FBQUEsVUFDVixPQUFPO0FBQUEsWUFBYyxDQUFDLFVBQ3BCLFlBQVksT0FBTztBQUFBLGNBQ2pCLE9BQU87QUFBQSxjQUNQLE1BQU07QUFBQSxjQUNOLFVBQVUsU0FBUztBQUFBLGNBQ25CLFlBQVksU0FBUztBQUFBLGNBQ3JCLFFBQVEsS0FBSztBQUFBLGNBQ2IsUUFBUTtBQUFBLFlBQ1YsQ0FBQztBQUFBLFVBQ0g7QUFBQSxRQUNGO0FBQUEsTUFDRjtBQUFBLElBQ0Y7QUFBQSxFQUNGLENBQUM7QUFFRCxRQUFNLG9CQUFxRCxPQUFPLElBQUksYUFBYTtBQUNqRixRQUFJLGVBQWUsV0FBVyxFQUFHO0FBRWpDLFdBQU8sWUFBWSxZQUFZLGlCQUFpQixFQUFFLE9BQU8sZUFBZSxPQUFPLENBQUM7QUFDaEYsZUFBVyxRQUFRLGdCQUFnQjtBQUNqQyxhQUFPO0FBQUEsUUFDTDtBQUFBLFFBQ0EsS0FBSyxPQUFPO0FBQUEsVUFDVixPQUFPO0FBQUEsWUFBYyxDQUFDLFVBQ3BCLFlBQVksT0FBTztBQUFBLGNBQ2pCLE9BQU87QUFBQSxjQUNQLE1BQU07QUFBQSxjQUNOLFVBQVUsU0FBUztBQUFBLGNBQ25CLFlBQVksU0FBUztBQUFBLGNBQ3JCLFFBQVEsS0FBSztBQUFBLGNBQ2IsUUFBUTtBQUFBLFlBQ1YsQ0FBQztBQUFBLFVBQ0g7QUFBQSxRQUNGO0FBQUEsTUFDRjtBQUFBLElBQ0Y7QUFBQSxFQUNGLENBQUM7QUFFRCxRQUFNLG1CQUFvRCxPQUFPLElBQUksYUFBYTtBQUNoRixRQUFJLGNBQWMsV0FBVyxFQUFHO0FBRWhDLFdBQU8sWUFBWSxZQUFZLGdCQUFnQixFQUFFLE9BQU8sY0FBYyxPQUFPLENBQUM7QUFDOUUsZUFBVyxRQUFRLGVBQWU7QUFDaEMsYUFBTztBQUFBLFFBQ0w7QUFBQSxRQUNBLEtBQUssT0FBTztBQUFBLFVBQ1YsT0FBTztBQUFBLFlBQWMsQ0FBQyxVQUNwQixZQUFZLE9BQU87QUFBQSxjQUNqQixPQUFPO0FBQUEsY0FDUCxNQUFNO0FBQUEsY0FDTixVQUFVLFNBQVM7QUFBQSxjQUNuQixZQUFZLFNBQVM7QUFBQSxjQUNyQixRQUFRLEtBQUs7QUFBQSxjQUNiLFFBQVE7QUFBQSxZQUNWLENBQUM7QUFBQSxVQUNIO0FBQUEsUUFDRjtBQUFBLE1BQ0Y7QUFBQSxJQUNGO0FBQUEsRUFDRixDQUFDO0FBRUQsUUFBTSxrQkFBdUQsT0FBTyxLQUFLLE9BQU87QUFBQSxJQUM5RSxjQUFjLGFBQWEsSUFBSSxDQUFDLEVBQUUsUUFBUSxNQUFNLEdBQUcsS0FBSyxNQUFNLElBQUk7QUFBQSxJQUNsRSxPQUFPLE1BQU0sSUFBSSxDQUFDLEVBQUUsUUFBUSxNQUFNLEdBQUcsS0FBSyxNQUFNLElBQUk7QUFBQSxJQUNwRCxTQUFTLFFBQVEsSUFBSSxDQUFDLEVBQUUsUUFBUSxNQUFNLEdBQUcsS0FBSyxNQUFNLElBQUk7QUFBQSxJQUN4RCxpQkFBaUIsZ0JBQWdCLElBQUksQ0FBQyxFQUFFLFFBQVEsTUFBTSxHQUFHLEtBQUssTUFBTSxJQUFJO0FBQUEsSUFDeEUsZ0JBQWdCLGVBQWUsSUFBSSxDQUFDLEVBQUUsUUFBUSxNQUFNLEdBQUcsS0FBSyxNQUFNLElBQUk7QUFBQSxJQUN0RSxlQUFlLGNBQWMsSUFBSSxDQUFDLEVBQUUsUUFBUSxNQUFNLEdBQUcsS0FBSyxNQUFNLElBQUk7QUFBQSxFQUN0RSxFQUFFO0FBRUYsUUFBTSxxQkFBNkQsT0FBTyxLQUFLLE1BQU0sZ0JBQWdCLFNBQVMsQ0FBQztBQUUvRyxTQUFPO0FBQUEsSUFDTDtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxFQUNGO0FBQ0YsQ0FBQzs7O0FDOWdCSCxTQUFTLFNBQUFDLFFBQU8sV0FBQUMsVUFBUyxVQUFBQyxlQUFjO0FBSXZDLElBQU0sMEJBQTBCLE1BQWUsU0FBUztBQWV4RCxJQUFNLDJCQUEyQjtBQVExQixJQUFNLDJDQUEyQyxDQUN0RCxPQUNBLGFBRUFDLFFBQU8sSUFBSSxhQUFhO0FBQ3RCLE1BQUk7QUFDSixNQUFJO0FBQ0YsYUFBU0MsT0FBTSxPQUFPLE9BQU8sRUFBRSxrQkFBa0IsS0FBSyxDQUFDO0FBQUEsRUFDekQsUUFBUTtBQUNOO0FBQUEsRUFDRjtBQUVBLE1BQUksQ0FBQyxPQUFPLFNBQVMsd0JBQXdCLEdBQUc7QUFDOUM7QUFBQSxFQUNGO0FBR0EsU0FBYSxPQUFPO0FBQUEsSUFDbEIsTUFBTTtBQUFBLElBQ047QUFBQSxJQUNBLE1BQU07QUFBQSxJQUNOLFVBQVU7QUFBQSxJQUNWLFNBQVM7QUFBQSxJQUNULE1BQ0U7QUFBQSxFQUdKLENBQUM7QUFPRCxTQUFhLE9BQU87QUFBQSxJQUNsQixNQUFNO0FBQUEsSUFDTjtBQUFBLElBQ0EsTUFBTTtBQUFBLElBQ04sVUFBVTtBQUFBLElBQ1YsU0FBUztBQUFBLElBQ1QsTUFDRTtBQUFBLElBRUYsTUFBTTtBQUFBLEVBQ1IsQ0FBQztBQUNILENBQUM7QUFjSSxJQUFNLHVCQUF1QkMsU0FBUSxXQUE4Qiw0QkFBNEI7QUFpQi9GLElBQU0sc0JBQU4sY0FBa0NBLFNBQVEsSUFBSSwyQkFBMkIsRUFHOUUsRUFBRTtBQUFDO0FBRUUsSUFBTSxzQkFBc0IsQ0FDakMsTUFDQSxLQUNBLE9BQ0EsYUFFQSxPQUFPLE9BQU8sSUFBSSxNQUFNLHFCQUFxQixHQUFHLHNCQUFzQixLQUFLLGdCQUFnQixJQUFJLElBQUksR0FBRztBQUFBLEVBQ3BHLE1BQU07QUFBQSxFQUNOO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQ0YsQ0FBQztBQU9JLElBQU0scUNBQXFDLENBQ2hELE9BQ0EsYUFFQUYsUUFBTyxJQUFJLGFBQWE7QUFDdEIsTUFBSSxDQUFDLHdCQUF3QixHQUFHO0FBQzlCO0FBQUEsRUFDRjtBQUVBLFFBQU0sWUFBWSxDQUFDLEdBQUdDLE9BQU0sU0FBUyxLQUFLLEdBQUcsR0FBR0EsT0FBTSxRQUFRLEtBQUssQ0FBQztBQUVwRSxhQUFXLE9BQU8sV0FBVztBQUMzQixVQUFNLFdBQVc7QUFDakIsUUFBSSxZQUFZLFNBQVMsU0FBUyxtQkFBbUI7QUFDbkQsWUFBTSxXQUFXO0FBQ2pCLFlBQU0sT0FDSixTQUFTLFNBQVMsa0JBQWtCLFNBQVMsU0FBUyx1QkFDbEQsa0hBQ0EsU0FBUyxTQUFTLHFCQUNoQiwrSkFDQSxTQUFTLFNBQVMsbUJBQW1CLFNBQVMsU0FBUywwQkFDckQscUlBQ0E7QUFFVixhQUFhLE9BQU87QUFBQSxRQUNsQixNQUFNO0FBQUEsUUFDTixVQUFVLFNBQVMsWUFBWTtBQUFBLFFBQy9CLE1BQU07QUFBQSxRQUNOLFVBQVU7QUFBQSxRQUNWLFNBQVMsR0FBRyxTQUFTLE9BQU8sU0FBUyxJQUFJLHNCQUFzQixTQUFTLEtBQUs7QUFBQSxRQUM3RTtBQUFBLFFBQ0EsTUFBTSxTQUFTO0FBQUEsTUFDakIsQ0FBQztBQUdEO0FBQUEsSUFDRjtBQUFBLEVBQ0Y7QUFDRixDQUFDOzs7QUYvSUgsSUFBTSxzQkFBc0IsQ0FDMUIsU0FDQSxxQkFDRztBQUNILFFBQU0sVUFBc0IsS0FBWSxTQUFTLGdCQUFnQjtBQUVqRSxTQUFPLENBQUksUUFBMEIsZ0JBQXdEO0FBQzNGLFVBQU0sMEJBQW1GLENBQUMsUUFBUSxTQUNoRyxpQkFBaUIsSUFBSSx3QkFBd0IsUUFBZSxJQUFJO0FBRWxFLFVBQU0sb0JBQWtEO0FBQUEsTUFDdEQsVUFBVSxRQUFRO0FBQUEsTUFDbEIsWUFBWSxpQkFBaUI7QUFBQSxNQUM3QjtBQUFBLE1BQ0EsMEJBQTBCLGlCQUFpQixZQUFZO0FBQUEsSUFDekQ7QUFFQSxVQUFNLFVBQVU7QUFBQSxNQUNkLFVBQVUsQ0FBQyxPQUNULG9CQUEyQixTQUFTLGdCQUFnQixFQUFFLFFBQVEsU0FBWSxFQUFFLEVBQUUsTUFBTSxHQUFHLFdBQVc7QUFBQSxNQUNwRyxVQUFVLENBQUMsT0FDVCxvQkFBMkIsU0FBUyxnQkFBZ0IsRUFBRSxRQUFRLFNBQVksRUFBRSxFQUFFLE1BQU0sR0FBRyxXQUFXO0FBQUEsTUFDcEcsUUFBUSxDQUFDLGNBQ1Asb0JBQTJCLFNBQVMsZ0JBQWdCLEVBQUUsUUFBUSxPQUFPLFNBQVMsRUFBRSxNQUFNLEdBQUcsV0FBVztBQUFBLE1BQ3RHLEtBQUssQ0FBSSxNQUNQLG9CQUEyQixTQUFTLGdCQUFnQixFQUFFLE9BQU8sS0FBSyxPQUFPLElBQUksQ0FBQyxDQUFDLEdBQUcsV0FBVztBQUFBLE1BQy9GLElBQ0UsS0FDQSxTQUMrQjtBQUMvQixlQUFPLFFBQVEsSUFBaUIsS0FBSyxPQUFPLEVBQUUsTUFBTTtBQUFBLE1BQ3REO0FBQUEsTUFDQSxVQUNFLEtBQ0EsU0FDK0I7QUFDL0IsZUFBTyxRQUFRLFVBQXVCLEtBQUssT0FBTyxFQUFFLE1BQU07QUFBQSxNQUM1RDtBQUFBLE1BQ0EsV0FDRSxLQUNBLFNBQytCO0FBQy9CLGVBQU8sUUFBUSxXQUF3QixLQUFLLE9BQU8sRUFBRSxNQUFNO0FBQUEsTUFDN0Q7QUFBQSxNQUNBLFlBQ0UsS0FDQSxTQUMrQjtBQUMvQixlQUFPLFFBQVEsWUFBeUIsS0FBSyxPQUFPLEVBQUUsTUFBTTtBQUFBLE1BQzlEO0FBQUEsTUFDQSxTQUFTLENBQ1AsUUFFQUUsUUFBTyxXQUFXLFFBQVEsSUFBaUIsR0FBRyxFQUFFLE1BQU0sQ0FBQyxFQUFFLEtBQUtBLFFBQU8sTUFBTTtBQUFBLE1BQzdFLGlCQUFpQixDQUNmLFFBRUFBLFFBQU8sV0FBVyxRQUFRLFlBQXlCLEdBQUcsRUFBRSxNQUFNLENBQUMsRUFBRSxLQUFLQSxRQUFPLE1BQU07QUFBQSxNQU1yRixTQUFTLENBQ1AsV0FFVyxlQUFvQyxRQUFRLFFBQVEsbUJBQW1CO0FBQUEsUUFDaEYsR0FBRztBQUFBLFFBQ0gsYUFBYSxPQUFPLGVBQWU7QUFBQSxNQUNyQyxDQUFDO0FBQUEsTUFDSCxpQkFBaUIsQ0FDZixXQUVXLGVBQW9DLFFBQVEsWUFBWSxtQkFBbUI7QUFBQSxRQUNwRixHQUFHO0FBQUEsUUFDSCxhQUFhLE9BQU8sZUFBZTtBQUFBLE1BQ3JDLENBQUM7QUFBQSxNQUNILGVBQWUsQ0FDYixXQUVXLGVBQW9DLFFBQVEsVUFBVSxtQkFBbUI7QUFBQSxRQUNsRixHQUFHO0FBQUEsUUFDSCxhQUFhLE9BQU8sZUFBZTtBQUFBLE1BQ3JDLENBQUM7QUFBQSxNQUNILGdCQUFnQixDQUNkLFdBRVcsZUFBb0MsUUFBUSxXQUFXLG1CQUFtQjtBQUFBLFFBQ25GLEdBQUc7QUFBQSxRQUNILGFBQWEsT0FBTyxlQUFlO0FBQUEsTUFDckMsQ0FBQztBQUFBLE1BQ0gsVUFBVSxNQUFNO0FBQUEsTUFDaEIsUUFBUSxDQUNOLFlBRUEsT0FBTztBQUFBLFFBQVc7QUFBQSxRQUFRLENBQUMsWUFDekIsa0JBQWtCO0FBQUEsVUFDaEI7QUFBQSxZQUNFLE1BQU07QUFBQSxZQUNOLE1BQU07QUFBQSxVQUNSO0FBQUEsVUFDQSxNQUNFQSxRQUFPLElBQUksYUFBYTtBQUN0QixrQkFBTSxPQUFRLE9BQU8sUUFBUTtBQUM3QixrQkFBTSxPQUFPLFFBQVEsTUFBTSxPQUFPO0FBQ2xDLGdCQUFJQSxRQUFPLFNBQVMsSUFBSSxHQUFHO0FBQ3pCLG9CQUFNLE9BQU8sT0FBT0EsUUFBTyxLQUFLLElBQTRDO0FBQzVFLGtCQUFJLEtBQUssU0FBUyxXQUFXO0FBQzNCLHVCQUFPQSxRQUFPLFNBQVMsY0FBYyxLQUFLLEtBQUs7QUFDL0M7QUFBQSxjQUNGO0FBQ0EscUJBQU8sUUFBUSxTQUFTLEtBQUssS0FBb0I7QUFDakQ7QUFBQSxZQUNGO0FBQ0EsbUJBQU8sUUFBUSxTQUFTLElBQW1CO0FBQUEsVUFDN0MsQ0FBQztBQUFBLFFBQ0w7QUFBQSxNQUNGLEVBQUUsS0FBS0EsUUFBTyxjQUFjLENBQUMsVUFBVUEsUUFBTyxTQUFTLGNBQWMsS0FBSyxDQUFDLENBQUM7QUFBQSxNQUM5RSxRQUFRLENBQUMsWUFDUCxPQUFPO0FBQUEsUUFBVztBQUFBLFFBQVEsQ0FBQyxZQUN6QixrQkFBa0I7QUFBQSxVQUNoQjtBQUFBLFlBQ0UsTUFBTTtBQUFBLFlBQ04sTUFBTTtBQUFBLFVBQ1I7QUFBQSxVQUNBLE1BQ0VBLFFBQU8sSUFBSSxhQUFhO0FBQ3RCLGtCQUFNLE9BQVEsT0FBTyxRQUFRO0FBQzdCLGtCQUFNLGNBQWMsaUJBQWlCLElBQUk7QUFDekMsa0JBQU0sY0FBYyxpQkFBaUIsSUFBSTtBQUV6QyxrQkFBTSxFQUFFLFdBQVcsV0FBVyxJQUFJLHFCQUFxQixNQUFxQixDQUFDLFVBQVU7QUFDckYsc0JBQVEsT0FBbUMsT0FBTztBQUFBLFlBQ3BELENBQUM7QUFFRCx1QkFBVyxRQUFRLFlBQVk7QUFDN0IsMEJBQVksTUFBTSxTQUFTO0FBQUEsWUFDN0I7QUFFQSx3QkFBWSxTQUFTO0FBQUEsVUFDdkIsQ0FBQztBQUFBLFFBQ0w7QUFBQSxNQUNGLEVBQUUsS0FBS0EsUUFBTyxjQUFjLENBQUMsVUFBVUEsUUFBTyxTQUFTLGNBQWMsS0FBSyxDQUFDLENBQUM7QUFBQSxJQUNoRjtBQUVBLFVBQU0sT0FBOEMsV0FBeUI7QUFFM0UsWUFBTSxNQUFNO0FBR1osVUFBSSxNQUFxQztBQUN6QyxlQUFTLElBQUksR0FBRyxJQUFJLElBQUksUUFBUSxLQUFLO0FBQ25DLGNBQU0sSUFBSSxDQUFDLEVBQUUsR0FBRztBQUFBLE1BQ2xCO0FBQ0EsYUFBTztBQUFBLElBQ1Q7QUFFQSxXQUFPLE9BQU8sT0FBTyxTQUFTLEVBQUUsS0FBSyxDQUFDO0FBQUEsRUFDeEM7QUFDRjtBQVFPLFNBQVNDLE1BQ2QsT0FDQSxTQUNBLFNBTWlCO0FBQ2pCLFFBQU0sbUJBQW1CLG9CQUFvQixPQUFjO0FBRTNELFFBQU0sV0FBVyxTQUFTLGFBQWEsTUFBTTtBQUM3QyxRQUFNLGtCQUFrQixNQUF1QjtBQUM3QyxVQUFNLGVBQWUsU0FBUztBQUM5QixVQUFNLFFBQVEsY0FBYyxXQUFXLFNBQVM7QUFDaEQsV0FBTyxVQUFVLFVBQVUsVUFBVTtBQUFBLEVBQ3ZDO0FBQ0EsUUFBTSxlQUFlLENBQUMsTUFBY0MsU0FBZ0I7QUFDbEQsVUFBTSxlQUFlLFNBQVM7QUFDOUIsVUFBTSxRQUFRLGNBQWMsV0FBVyxTQUFTO0FBQ2hELFFBQUksVUFBVSxTQUFTO0FBQ3JCLFlBQXVCLG9CQUFvQixNQUFNQSxNQUFLLFNBQVMsU0FBUyxRQUFRO0FBQUEsSUFDbEY7QUFBQSxFQUNGO0FBQ0EsUUFBTSxVQUFzQixLQUFZLFNBQVMsZ0JBQWdCO0FBRWpFLFFBQU0sb0JBQW9CLENBQUMsYUFDekIsb0JBQTJCLFVBQVUsZ0JBQWdCO0FBQ3ZELFFBQU0sZ0JBQWdCLENBQ3BCLFdBQ0EsWUFFQUYsUUFBTyxjQUF3QixnQkFBZ0IsRUFBRTtBQUFBLElBQy9DQSxRQUFPO0FBQUEsTUFBUSxDQUFDLFVBQ2QsT0FBTyxNQUFNLE9BQU87QUFBQSxRQUNsQixRQUFRO0FBQUEsUUFDUixRQUFRO0FBQUEsTUFDVixDQUFDO0FBQUEsSUFDSDtBQUFBLEVBQ0Y7QUFDRixRQUFNLGVBQWUsQ0FBQyxXQUNwQkEsUUFBTyxjQUF1QixHQUFHLEVBQUU7QUFBQSxJQUNqQ0EsUUFBTztBQUFBLE1BQVEsQ0FBQyxVQUNkLE9BQU8sTUFBTSxPQUFPO0FBQUEsUUFDbEIsUUFBUTtBQUFBLFFBQ1IsUUFBUSxNQUFNQSxRQUFPO0FBQUEsTUFDdkIsQ0FBQztBQUFBLElBQ0g7QUFBQSxFQUNGO0FBRUYsUUFBTSx5QkFBeUIsQ0FBQ0UsU0FDeEIsT0FBTztBQUFBLElBQ1gsTUFBTTtBQUFBLElBQ04sVUFBVSxRQUFRO0FBQUEsSUFDbEIsWUFBWSxRQUFRO0FBQUEsSUFDcEIsTUFBTTtBQUFBLElBQ04sVUFBVTtBQUFBLElBQ1YsU0FBUyxHQUFHQSxJQUFHO0FBQUEsSUFDZixNQUNFO0FBQUEsSUFFRixNQUFNO0FBQUEsRUFDUixDQUFDO0FBRUgsUUFBTSxzQkFBc0IsQ0FBSSxRQUEwQixnQkFDeEQsa0JBQWtCLE9BQU8sRUFBRSxRQUFRLFdBQVc7QUFFaEQsUUFBTSxtQkFBbUIsQ0FBQyxRQUN4QkYsUUFBTyxjQUFjLGFBQWEsRUFBRTtBQUFBLElBQ2xDQSxRQUFPLElBQUksQ0FBQyxVQUFXLE9BQU8sT0FBTyxLQUFLLElBQUksTUFBTSxNQUFNLE1BQU0sS0FBSyxHQUFHLElBQUksSUFBSztBQUFBLEVBQ25GO0FBRUYsTUFBSTtBQUVKLFFBQU0sZUFBZSxDQUNuQixVQVNBO0FBQUEsSUFDRSxTQUNBLE9BQU8sVUFBVSxhQUNmLE1BQWMsVUFBVSxlQUFnQixNQUFjLFVBQVUsYUFDbEUsU0FBVSxTQUNWRyxTQUFRLE1BQU8sTUFBYyxHQUFHO0FBQUEsRUFDbEM7QUFFRixRQUFNLG9CQUFvQixDQUN4QixLQUNBLE9BQ1k7QUFDWixVQUFNLGVBQW1ELElBQUk7QUFBQSxNQUMzRCxDQUFDO0FBQUEsTUFDRDtBQUFBLFFBQ0UsS0FBSyxDQUFDLFNBQVMsU0FBUyxDQUFDLFlBQ3ZCLEdBQUcsU0FBUztBQUFBLFVBQ1YsTUFBTTtBQUFBLFVBQ047QUFBQSxRQUNGLENBQUM7QUFBQSxNQUNMO0FBQUEsSUFDRjtBQUVBLFVBQU0sU0FBa0M7QUFBQSxNQUN0QyxNQUFNLENBQUMsYUFBYUgsUUFBTyxJQUFJLEdBQUcsVUFBVSxRQUFRO0FBQUEsTUFDcEQsU0FBUyxHQUFHO0FBQUEsTUFDWixVQUFVLEdBQUc7QUFBQSxNQUNiLFVBQVUsR0FBRztBQUFBLE1BQ2IsU0FBUztBQUFBLElBQ1g7QUFFQSxVQUFNLGdCQUFnQix1QkFBTyxJQUFJLDRCQUE0QjtBQUM3RCxVQUFNLFNBQVUsTUFBYyxhQUFhO0FBSTNDLFdBQU8sT0FBTyxXQUFXLGFBQWMsT0FBTyxJQUFJLE1BQU0sS0FBSyxTQUFVO0FBQUEsRUFDekU7QUFFQSxRQUFNLDJCQUEyQixDQUMvQixRQU9BLE9BRUFBLFFBQU8sSUFBSSxhQUFhO0FBRXRCLFFBQUksMkJBQTJCLE1BQU87QUFFdEMsVUFBTSxNQUFNLHFCQUFxQixPQUFPLEdBQUcsY0FBYyxTQUFTLENBQUM7QUFDbkUsVUFBTSxhQUFhLE9BQU8saUJBQWlCLEdBQUc7QUFDOUMsUUFBSSxDQUFDLFdBQVk7QUFFakIsVUFBTSxhQUFhLE9BQU8sS0FBTSxPQUFPLEtBQWEsT0FBTyxhQUFhLENBQUMsQ0FBQztBQUUxRSxVQUFNLGlCQUFpQix1QkFBTyxJQUFJLHVCQUF1QjtBQUN6RCxVQUFNLFdBQVksT0FBZSxjQUFjO0FBRS9DLFVBQU0sY0FBYyxVQUFVLFdBQVcsQ0FBQyxHQUFHLElBQUksQ0FBQyxPQUFZO0FBQUEsTUFDNUQsTUFBTSxPQUFPLEdBQUcsUUFBUSxNQUFNO0FBQUEsTUFDOUIsSUFBSSxPQUFPLEdBQUcsTUFBTSxFQUFFO0FBQUEsTUFDdEIsU0FBUyxHQUFHLFVBQVUsT0FBTztBQUFBLE1BQzdCLE1BQU0sT0FBTyxHQUFHLFNBQVMsV0FBVyxFQUFFLE9BQU87QUFBQSxJQUMvQyxFQUFFO0FBRUYsVUFBTSxhQUFhLE9BQU8sV0FBVyxPQUFPLE9BQU8sWUFBWSxXQUFXLE9BQU8sS0FBSyxPQUFPLE9BQU8sSUFBSTtBQUV4RyxVQUFNLE9BQU8sT0FBTyxRQUFRLE9BQU8sT0FBTyxTQUFTLFdBQVcsT0FBTyxPQUFPO0FBRTVFLFVBQU0sU0FBUyxPQUFPLEtBQUs7QUFFM0IsVUFBTSxpQkFBaUIsaUJBQWlCLE9BQU8sd0JBQXdCO0FBQ3ZFLFVBQU0sU0FBUyxpQkFDWDtBQUFBLE1BQ0UsUUFBUSxlQUFlO0FBQUEsTUFDdkIsT0FBTyxlQUFlLE9BQU87QUFBQSxJQUMvQixJQUNBO0FBRUosVUFBTSxPQUFPO0FBQUEsTUFDWCxJQUFJLE9BQU87QUFBQSxNQUNYLFVBQVUsT0FBTyxHQUFHLFFBQVE7QUFBQSxNQUM1QixZQUFZLE9BQU8sR0FBRyxVQUFVO0FBQUEsTUFDaEM7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLElBQ0Y7QUFFQSxXQUFhLE9BQU87QUFBQSxNQUNsQixNQUFNO0FBQUEsTUFDTixVQUFVLEdBQUc7QUFBQSxNQUNiLFlBQVksR0FBRztBQUFBLE1BQ2Y7QUFBQSxJQUNGLENBQVE7QUFBQSxFQUNWLENBQUM7QUFTSCxRQUFNLHVCQUF1QixDQUMzQixRQUVBQSxRQUFPLElBQUksYUFBYTtBQUN0QixVQUFNLG9CQUFvQixPQUFRLEtBQWEsT0FBTyxXQUFhLElBQVksS0FBZ0I7QUFDL0YsVUFBTSxlQUFlLE9BQU8sU0FBUyxhQUFhLFdBQVcsUUFBUSxXQUFXLFFBQVE7QUFHeEYsUUFBSSxxQkFBcUIsc0JBQXNCLFFBQVEsVUFBVTtBQUMvRCxhQUFPO0FBQUEsSUFDVDtBQUVBLFVBQU0sY0FBYyxpQkFBaUIsUUFBUSxJQUFJLEdBQXVDO0FBQ3hGLFFBQUksYUFBYTtBQUNmLGFBQU87QUFBQSxJQUNUO0FBR0EsUUFBSSxPQUFPLFNBQVMsYUFBYSxVQUFVO0FBQ3pDLFlBQU0sVUFBVSxPQUFPQSxRQUFPLGNBQWMsR0FBVTtBQUN0RCxVQUFJLE9BQU8sT0FBTyxPQUFPLEdBQUc7QUFDMUIsZUFBTyxRQUFRO0FBQUEsTUFDakI7QUFBQSxJQUNGO0FBR0EsVUFBTSxVQUFVLHFCQUFxQjtBQUNyQyxVQUFNLE1BQWdCLFNBQVMsSUFDM0I7QUFBQSxNQUNFO0FBQUEsTUFDQSxjQUFjLGdCQUFnQixjQUFjLDBCQUEwQixxQkFBcUIsYUFBYTtBQUFBLE1BQ3hHO0FBQUEsTUFDQTtBQUFBLElBQ0YsSUFDQSxDQUFDO0FBRUwsVUFBTSxNQUFNLElBQUk7QUFBQSxNQUNkLFNBQVMsSUFDTDtBQUFBLFFBQ0U7QUFBQSxRQUNBO0FBQUEsUUFDQSxZQUFZLE9BQU87QUFBQSxRQUNuQjtBQUFBLFFBQ0E7QUFBQSxRQUNBLFNBQVMsZ0JBQWdCLHFCQUFxQjtBQUFBLFFBQzlDLHdCQUF3QixnQkFBZ0IsV0FBVyxnQkFBZ0IsT0FBTyxRQUFRLGNBQWMsV0FBVyxDQUFDO0FBQUEsUUFDNUc7QUFBQSxRQUNBO0FBQUEsUUFDQSxHQUFHO0FBQUEsTUFDTCxFQUFFLEtBQUssSUFBSSxJQUNYO0FBQUEsSUFDTjtBQUVDLElBQUMsSUFBWSxVQUFVO0FBQ3ZCLElBQUMsSUFBWSxhQUFhO0FBQzFCLElBQUMsSUFBWSxPQUFPO0FBQ3BCLElBQUMsSUFBWSxPQUFPO0FBQ3BCLElBQUMsSUFBWSxhQUFhO0FBQUEsTUFDekIsVUFBVTtBQUFBLE1BQ1YsWUFBWSxPQUFPLFFBQVEsY0FBYyxXQUFXO0FBQUEsSUFDdEQ7QUFDQyxJQUFDLElBQVksTUFBTTtBQUVwQixRQUFJLE9BQU87QUFDWCxXQUFPLE9BQU9BLFFBQU8sSUFBSSxHQUFHO0FBQUEsRUFDOUIsQ0FBQztBQUVILFFBQU0sV0FBcUM7QUFBQSxJQUN6QyxNQUFNLFFBQVE7QUFBQSxJQUNkLFFBQVEsQ0FBQyxNQUNQQSxRQUFPLElBQUksYUFBYTtBQUN0QixZQUFNLFFBQVEsT0FBTyxTQUFTLElBQWUsc0JBQXNCO0FBQ25FLFVBQUksT0FBTztBQUNULGNBQU0sT0FBTyxPQUFPLFFBQVE7QUFDNUIsZUFBTyxPQUFPLFFBQVEsU0FBUyxFQUFFLElBQUksQ0FBQztBQUFBLE1BQ3hDO0FBRUEsWUFBTSxPQUFPLE1BQU1BLFFBQU8sUUFBUSxRQUFRLFVBQVUsQ0FBQyxTQUFTLFFBQVEsU0FBUyxFQUFFLElBQUksQ0FBQyxDQUFDO0FBRXZGLGFBQU8sT0FBTyxtQkFDVixpQkFBaUIsSUFBSSx3QkFBd0IsRUFBRSxNQUFNLFNBQVMsTUFBTSxTQUFTLEdBQVUsSUFBSSxJQUMzRixLQUFLO0FBQUEsSUFDWCxDQUFDO0FBQUEsSUFDSCxRQUFRLENBQUMsTUFDUEEsUUFBTyxJQUFJLGFBQWE7QUFDdEIsWUFBTSxjQUFjLGtCQUFrQixJQUFJO0FBQzFDLFlBQU0sY0FBYyxrQkFBa0IsSUFBSTtBQUUxQyxZQUFNLFFBQVEsT0FBTyxTQUFTLElBQWUsc0JBQXNCO0FBQ25FLFVBQUksT0FBTztBQUNULGNBQU0sT0FBTyxPQUFPLFFBQVE7QUFDNUIsY0FBTSxFQUFFLFdBQVcsV0FBVyxJQUFJLHFCQUFxQixNQUEyQixDQUFDLFVBQVU7QUFDM0YsWUFBRSxLQUF1QztBQUFBLFFBQzNDLENBQUM7QUFFRCxtQkFBVyxRQUFRLFlBQVk7QUFDN0Isd0JBQWMsTUFBTSxTQUFTO0FBQUEsUUFDL0I7QUFFQSxzQkFBYyxTQUFTO0FBQ3ZCO0FBQUEsTUFDRjtBQUVBLFlBQU0sT0FBTyxNQUNYQSxRQUFPLElBQUksYUFBYTtBQUN0QixjQUFNLE9BQU8sT0FBTyxRQUFRO0FBQzVCLGNBQU0sRUFBRSxXQUFXLFdBQVcsSUFBSSxxQkFBcUIsTUFBMkIsQ0FBQyxVQUFVO0FBQzNGLFlBQUUsS0FBdUM7QUFBQSxRQUMzQyxDQUFDO0FBRUQsbUJBQVcsUUFBUSxZQUFZO0FBQzdCLHdCQUFjLE1BQU0sU0FBUztBQUFBLFFBQy9CO0FBRUEsc0JBQWMsU0FBUztBQUFBLE1BQ3pCLENBQUM7QUFFSCxhQUFPLE9BQU8sbUJBQ1YsaUJBQWlCLElBQUksd0JBQXdCLEVBQUUsTUFBTSxTQUFTLE1BQU0sU0FBUyxHQUFVLElBQUksSUFDM0YsS0FBSztBQUFBLElBQ1gsQ0FBQztBQUFBLElBQ0gsS0FBSyxRQUFRO0FBQUEsRUFDZjtBQUVBLFFBQU0sVUFBVSxNQUFNO0FBRXRCLFFBQU0sa0JBQWtCLG9CQUFJLElBQStEO0FBRTNGLFFBQU0sWUFBWSxDQUFDLFFBQXlCLE9BQU8sVUFBVSxlQUFlLEtBQUssU0FBZ0IsR0FBRztBQUVwRyxRQUFNLGNBQThDLElBQUksTUFBTSxDQUFDLEdBQVU7QUFBQSxJQUN2RSxLQUFLLENBQUMsU0FBUyxTQUFTO0FBQ3RCLFVBQUksT0FBTyxTQUFTLFNBQVUsUUFBTztBQUNyQyxVQUFJLENBQUMsVUFBVSxJQUFJLEVBQUcsUUFBTztBQUU3QixZQUFNLFNBQVMsZ0JBQWdCLElBQUksSUFBSTtBQUN2QyxVQUFJLE9BQVEsUUFBTztBQUVuQixZQUFNLFFBQVMsUUFBZ0IsSUFBSTtBQUNuQyxZQUFNLEtBQUssSUFBSSxTQUFnQixRQUFRLFNBQVUsTUFBYyxHQUFHLElBQUksQ0FBQztBQUV2RSxzQkFBZ0IsSUFBSSxNQUFNLEVBQUU7QUFDNUIsYUFBTztBQUFBLElBQ1Q7QUFBQSxJQUNBLEtBQUssQ0FBQyxTQUFTLFNBQVMsT0FBTyxTQUFTLFlBQVksVUFBVSxJQUFJO0FBQUEsSUFDbEUsU0FBUyxNQUFNLE9BQU8sS0FBSyxPQUFjO0FBQUEsSUFDekMsMEJBQTBCLENBQUMsU0FBUyxTQUFTO0FBQzNDLFVBQUksT0FBTyxTQUFTLFNBQVUsUUFBTztBQUNyQyxVQUFJLENBQUMsVUFBVSxJQUFJLEVBQUcsUUFBTztBQUM3QixhQUFPLEVBQUUsWUFBWSxNQUFNLGNBQWMsS0FBSztBQUFBLElBQ2hEO0FBQUEsRUFDRixDQUFDO0FBRUQsUUFBTSxXQUF3QyxJQUFJLFNBQWdCO0FBQ2hFLFVBQU0sQ0FBQyxPQUFPLE1BQU0sSUFBSTtBQUV4QixRQUFJLE9BQU8sVUFBVSxVQUFVO0FBQzdCLGFBQU8sUUFBUSxTQUFTLEVBQUUsTUFBTSxPQUFPLFNBQVMsT0FBTyxDQUF1QjtBQUFBLElBQ2hGO0FBRUEsUUFBVyxjQUFjLEtBQUssR0FBRztBQUMvQixhQUFPLFFBQVEsU0FBVSxNQUFjLE1BQU0sQ0FBQztBQUFBLElBQ2hEO0FBRUEsV0FBTyxRQUFRLFNBQVMsS0FBMkI7QUFBQSxFQUNyRDtBQUVBLFFBQU0sV0FBVyxDQUFJLFVBQWdELFVBQVUsS0FBSztBQUVwRixRQUFNLGNBQWMsQ0FBNkIsVUFDbEMsYUFBYSxLQUFLO0FBR2pDLFFBQU0sVUFBc0MsQ0FBQyxLQUFLLE9BQU87QUFDdkQsV0FBT0EsUUFBTyxLQUFLLE1BQU07QUFDdkIsdUJBQWlCLElBQUksZ0JBQWdCLE9BQU8sR0FBRyxHQUFHLEVBQVM7QUFBQSxJQUM3RCxDQUFDO0FBQUEsRUFDSDtBQUVBLFFBQU0sU0FBb0MsQ0FBQyxPQUFPLFlBQ2hEQSxRQUFPLElBQUksYUFBYTtBQUN0QixRQUFJLENBQVEsY0FBYyxLQUFLLEdBQUc7QUFDaEMsYUFBTyxPQUFPQSxRQUFPLFdBQVcsZ0RBQWdEO0FBQUEsSUFDbEY7QUFFQSxVQUFNLFFBQVEsZ0JBQWdCO0FBQzlCLFVBQU0sWUFBWSxTQUFTO0FBRTNCLFdBQU8saUJBQWlCLFFBQVEsZUFBZTtBQUFBLE1BQzdDLFdBQVcsTUFBTTtBQUFBLE1BQ2pCO0FBQUEsTUFDQTtBQUFBLE1BQ0EsR0FBSSxZQUNBO0FBQUEsUUFDRSxXQUFXO0FBQUEsVUFDVCxhQUFhLFVBQVU7QUFBQSxVQUN2QixnQkFBZ0IsVUFBVTtBQUFBLFVBQzFCLE1BQU0sVUFBVTtBQUFBLFFBQ2xCO0FBQUEsTUFDRixJQUNBLENBQUM7QUFBQSxJQUNQLENBQUM7QUFBQSxFQUNILENBQUM7QUFFSCxRQUFNLE1BQXVCO0FBQUEsSUFDM0IsTUFBTTtBQUFBLE1BQ0osU0FBUyxDQUFDLFFBQWE7QUFDckIscUJBQWEseUJBQXlCLGdCQUFnQjtBQUN0RCxlQUFZLFFBQVEsS0FBSztBQUFBLFVBQ3ZCLFlBQVk7QUFBQSxVQUNaLGNBQWM7QUFBQSxRQUNoQixDQUFDO0FBQUEsTUFDSDtBQUFBLElBQ0Y7QUFBQSxJQUNBLE9BQU87QUFBQSxJQUNQO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBLE1BQU07QUFBQSxJQUNOLE9BQU87QUFBQSxJQUNQLFVBQVU7QUFBQSxJQUNWLFdBQVc7QUFBQSxNQUNULGdCQUFnQixDQUFDLFFBQXNDO0FBQ3JELFlBQUksZ0JBQWdCLE1BQU0sT0FBTztBQUMvQixpQkFBTyx1QkFBdUIsNEJBQTRCO0FBQUEsUUFDNUQ7QUFDQSx5QkFBaUIsVUFBVSxxQkFBcUIsR0FBVTtBQUMxRCxlQUFPQSxRQUFPO0FBQUEsTUFDaEI7QUFBQSxNQUNBLFNBQVMsQ0FBQyxRQUFzQztBQUM5QyxZQUFJLGdCQUFnQixNQUFNLE9BQU87QUFDL0IsaUJBQU8sdUJBQXVCLHFCQUFxQjtBQUFBLFFBQ3JEO0FBQ0EseUJBQWlCLFVBQVUsY0FBYyxHQUFVO0FBQ25ELGVBQU9BLFFBQU87QUFBQSxNQUNoQjtBQUFBLE1BQ0EsUUFBUSxDQUFDLFFBQXNDO0FBRTdDLFlBQUksZ0JBQWdCLE1BQU0sT0FBTztBQUMvQixpQkFBTyx1QkFBdUIsb0JBQW9CO0FBQUEsUUFDcEQ7QUFDQSx5QkFBaUIsVUFBVSxxQkFBcUIsR0FBVTtBQUMxRCxlQUFPQSxRQUFPO0FBQUEsTUFDaEI7QUFBQSxNQUNBLFdBQVcsQ0FBQyxRQUFzQztBQUNoRCxZQUFJLGdCQUFnQixNQUFNLE9BQU87QUFDL0IsaUJBQU8sdUJBQXVCLHVCQUF1QjtBQUFBLFFBQ3ZEO0FBQ0EseUJBQWlCLFVBQVUsZ0JBQWdCLEdBQVU7QUFDckQsZUFBT0EsUUFBTztBQUFBLE1BQ2hCO0FBQUEsTUFDQSxTQUFTLENBQ1AsWUFJRztBQUNILFlBQUksZ0JBQWdCLE1BQU0sT0FBTztBQUMvQixpQkFBTyx1QkFBdUIscUJBQXFCO0FBQUEsUUFDckQ7QUFDQSx5QkFBaUIsVUFBVSxnQkFBZ0IsT0FBYztBQUN6RCxlQUFPQSxRQUFPO0FBQUEsTUFDaEI7QUFBQSxNQUNBLFdBQVcsQ0FBQyxRQUFzQztBQUNoRCxZQUFJLGdCQUFnQixNQUFNLE9BQU87QUFDL0IsaUJBQU8sdUJBQXVCLHVCQUF1QjtBQUFBLFFBQ3ZEO0FBQ0EseUJBQWlCLFVBQVUsd0JBQXdCQSxRQUFPLE9BQU8sR0FBc0MsQ0FBQztBQUN4RyxlQUFPQSxRQUFPO0FBQUEsTUFDaEI7QUFBQSxNQUNBLFVBQVUsQ0FBQyxRQUFzQztBQUMvQyxZQUFJLGdCQUFnQixNQUFNLE9BQU87QUFDL0IsaUJBQU8sdUJBQXVCLHNCQUFzQjtBQUFBLFFBQ3REO0FBQ0EseUJBQWlCLFVBQVUsdUJBQXVCQSxRQUFPLE9BQU8sR0FBc0MsQ0FBQztBQUN2RyxlQUFPQSxRQUFPO0FBQUEsTUFDaEI7QUFBQSxNQUNBLFNBQVMsQ0FBQyxRQUFzQztBQUM5QyxZQUFJLGdCQUFnQixNQUFNLE9BQU87QUFDL0IsaUJBQU8sdUJBQXVCLHFCQUFxQjtBQUFBLFFBQ3JEO0FBQ0EseUJBQWlCLFVBQVUsc0JBQXNCQSxRQUFPLE9BQU8sR0FBc0MsQ0FBQztBQUN0RyxlQUFPQSxRQUFPO0FBQUEsTUFDaEI7QUFBQSxJQUNGO0FBQUEsSUFDQSxRQUFRO0FBQUEsTUFDTixTQUFTLENBQUMsV0FBbUM7QUFDM0MsWUFBSSxnQkFBZ0IsTUFBTSxPQUFPO0FBQy9CLGdCQUF1QjtBQUFBLFlBQ3JCO0FBQUEsWUFDQTtBQUFBLFlBQ0E7QUFBQSxZQUNBLFNBQVM7QUFBQSxVQUNYO0FBQUEsUUFDRjtBQUVBLFlBQUksQ0FBQyxVQUFVLE9BQU8sV0FBVyxVQUFVO0FBQ3pDLGdCQUFNLElBQUksTUFBTSxnRUFBZ0U7QUFBQSxRQUNsRjtBQUVBLGNBQU0sWUFBWSxTQUFTLGFBQWE7QUFBQSxVQUN0QyxhQUFhO0FBQUEsVUFDYixpQkFBaUI7QUFBQSxVQUNqQixnQkFBZ0I7QUFBQSxVQUNoQixNQUFNO0FBQUEsUUFDUjtBQUVBLHlCQUFpQixPQUFPLGlDQUFpQztBQUFBLFVBQ3ZEO0FBQUEsVUFDQSxZQUFZO0FBQUEsWUFDVixZQUFZO0FBQUEsWUFDWixVQUFVLFVBQVU7QUFBQSxZQUNwQixjQUFjLFVBQVU7QUFBQSxZQUN4QixhQUFhLFVBQVU7QUFBQSxZQUN2QixNQUFNLFVBQVU7QUFBQSxVQUNsQjtBQUFBLFFBQ0YsQ0FBQztBQUFBLE1BQ0g7QUFBQSxNQUNBLFFBQVE7QUFBQSxRQUNOLFNBQVMsQ0FBQyxXQUFtQkksYUFDM0JKLFFBQU8sSUFBSSxhQUFhO0FBQ3RCLGdCQUFNLFVBQVUsaUJBQWlCLE9BQU8sd0JBQXdCLFNBQVM7QUFHekUsY0FBSSxDQUFDLFNBQVM7QUFFWixtQkFBTyxPQUFPQSxRQUFPO0FBQUEsVUFDdkI7QUFFQSxnQkFBTSxRQUFRSSxVQUFTLFVBQVU7QUFDakMsZ0JBQU0sYUFBYSxDQUFDLFVBQ2xCLFFBQVFKLFFBQU8sUUFBbUIsb0JBQW9CLElBQUksRUFBRSxRQUFRLEtBQUssQ0FBQyxJQUFJLFFBQVEsS0FBSztBQUs3RixnQkFBTSxRQUFRLE9BQU8sU0FBUyxJQUFlLHNCQUFzQjtBQUNuRSxjQUFJLE9BQU87QUFDVCxrQkFBTSxRQUFTLE9BQU8sUUFBUTtBQUM5QixtQkFBTyxPQUFPLFdBQVcsS0FBSztBQUFBLFVBQ2hDO0FBR0EsaUJBQU8sT0FBTyxpQkFBaUIsSUFBSTtBQUFBLFlBQ2pDO0FBQUEsY0FDRSxNQUFNO0FBQUEsY0FDTixNQUFNO0FBQUEsWUFDUjtBQUFBLFlBQ0EsTUFDRUEsUUFBTyxJQUFJLGFBQWE7QUFDdEIsb0JBQU0sUUFBUyxPQUFPLFFBQVE7QUFDOUIscUJBQU8sT0FBTyxXQUFXLEtBQUs7QUFBQSxZQUNoQyxDQUFDO0FBQUEsVUFDTDtBQUFBLFFBQ0YsQ0FBQztBQUFBLE1BQ0w7QUFBQSxJQUNGO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBLEtBQUssSUFBSSxNQUFNLE1BQU07QUFBQSxJQUFDLEdBQUc7QUFBQSxNQUN2QixPQUFPLENBQUMsU0FBUyxVQUFVLENBQUMsR0FBRyxNQUFNO0FBQ25DLHFCQUFhLGdCQUFnQixPQUFPO0FBQ3BDLFlBQUksYUFBYSxHQUFHLEdBQUc7QUFDckIsZ0JBQU0sU0FBUztBQUNmLGdCQUFNLE1BQU0sT0FBTztBQUVuQixnQkFBTSxrQkFBa0IscUJBQXFCLEdBQUcsRUFBRSxLQUFLQSxRQUFPLElBQUksQ0FBQyxPQUFPLGtCQUFrQixLQUFLLEVBQUUsQ0FBQyxDQUFDO0FBRXJHLGdCQUFNLHdCQUF3QixxQkFBcUIsR0FBRyxFQUFFO0FBQUEsWUFDdERBLFFBQU8sSUFBSSxDQUFDLE9BQU8seUJBQXlCLFFBQVEsRUFBRSxDQUFDO0FBQUEsWUFDdkRBLFFBQU8sSUFBSSxDQUFDLE9BQU8sa0JBQWtCLEtBQUssRUFBRSxDQUFDO0FBQUEsVUFDL0M7QUFFQSxnQkFBTSxrQkFBa0IsU0FBUyxJQUFVLHVCQUF1QixFQUFFO0FBQUEsWUFDbEVBLFFBQU8sSUFBSSxDQUFDLFVBQVU7QUFDcEIsdUNBQXlCO0FBQUEsWUFDM0IsQ0FBQztBQUFBLFlBQ0RBLFFBQU8sUUFBUSxDQUFDLFVBQVcsVUFBVSxRQUFRLGtCQUFrQixxQkFBc0I7QUFBQSxVQUN2RjtBQUlBLGlCQUFPQSxRQUFPLFFBQVEsTUFBTTtBQUMxQixnQkFBSSwyQkFBMkIsT0FBTztBQUNwQyxxQkFBTztBQUFBLFlBQ1Q7QUFFQSxnQkFBSSwyQkFBMkIsUUFBVztBQUN4QyxxQkFBTztBQUFBLFlBQ1Q7QUFFQSxtQkFBTztBQUFBLFVBQ1QsQ0FBQztBQUFBLFFBQ0g7QUFDQSxZQUFJRyxTQUFRLE1BQU0sR0FBRyxHQUFHO0FBQ3RCLGdCQUFNLFlBQVk7QUFHbEIsY0FBSSxVQUFVLFVBQVUsYUFBYTtBQUNuQyxtQkFBTyxxQkFBcUIsR0FBVSxFQUFFO0FBQUEsY0FDdENILFFBQU8sSUFBSSxDQUFDLE9BQXNDLGtCQUFrQixLQUFZLEVBQUUsQ0FBQztBQUFBLFlBQ3JGO0FBQUEsVUFDRjtBQUdBLGlCQUFPO0FBQUEsUUFDVDtBQUNBLGVBQU9BLFFBQU8sSUFBSSxvQ0FBb0M7QUFBQSxNQUN4RDtBQUFBLElBQ0YsQ0FBQztBQUFBLElBQ0QsVUFBVSxJQUFJLE1BQU0sTUFBTTtBQUFBLElBQUMsR0FBRztBQUFBLE1BQzVCLE9BQU8sQ0FBQyxTQUFTLFVBQVUsU0FBUztBQUNsQyxxQkFBYSxnQkFBZ0IsWUFBWTtBQUN6QyxjQUFNLE1BQU0sS0FBSyxDQUFDO0FBQ2xCLFlBQVcsY0FBYyxHQUFHLEdBQUc7QUFDN0IsZ0JBQU0sTUFBTSxJQUFJO0FBQ2hCLGlCQUFPO0FBQUEsWUFDTCxRQUFRLFNBQVM7QUFBQSxjQUNmLE9BQU8sT0FBTyxDQUFDLE1BQVcsRUFBRSxTQUFTLE9BQU8sRUFBRSxTQUFTLEdBQUc7QUFBQSxjQUMxRCxPQUFPLElBQUksQ0FBQyxNQUFXLEVBQUUsT0FBTztBQUFBLFlBQ2xDO0FBQUEsWUFDQTtBQUFBLFVBQ0Y7QUFBQSxRQUNGO0FBQ0EsWUFBSSxPQUFPLFFBQVEsWUFBWTtBQUM3QixpQkFBTyxvQkFBb0IsUUFBUSxTQUFTLEtBQUssT0FBTyxPQUFPLEdBQUcsQ0FBQyxDQUFDO0FBQUEsUUFDdEU7QUFDQSxZQUFJLE9BQU8sUUFBUSxVQUFVO0FBQzNCLGlCQUFPO0FBQUEsWUFDTCxRQUFRLFNBQVMsS0FBSyxPQUFPLE9BQU8sQ0FBQyxNQUFXLEVBQUUsU0FBUyxPQUFPLEVBQUUsU0FBUyxHQUFHLENBQUM7QUFBQSxZQUNqRjtBQUFBLFVBQ0Y7QUFBQSxRQUNGO0FBQ0EsWUFBSSxPQUFPLFFBQVEsWUFBWSxRQUFRLE1BQU07QUFDM0MsY0FBSSxVQUFVLEtBQUs7QUFDakIsbUJBQU87QUFBQSxjQUNMLFFBQVEsU0FBUyxLQUFLLE9BQU8sT0FBTyxDQUFDLE1BQVcsRUFBRSxTQUFVLElBQVksSUFBSSxDQUFDO0FBQUEsY0FDN0UsT0FBUSxJQUFZLElBQUk7QUFBQSxZQUMxQjtBQUFBLFVBQ0Y7QUFDQSxjQUFJLE9BQU8sU0FBUyxHQUFHLEdBQUc7QUFDeEIsbUJBQU87QUFBQSxjQUNMLFFBQVEsU0FBUztBQUFBLGdCQUNmLE9BQU8sT0FBTyxDQUFDLE1BQVc7QUFDeEIsd0JBQU0sU0FBUyxPQUFPLGtCQUFrQixHQUFxQyxFQUFFLENBQUM7QUFDaEYseUJBQU8sQ0FBQyxDQUFDO0FBQUEsZ0JBQ1gsQ0FBQztBQUFBLGNBQ0g7QUFBQSxZQUNGO0FBQUEsVUFDRjtBQUFBLFFBQ0Y7QUFDQSxlQUFPLG9CQUFvQixRQUFRLFFBQVE7QUFBQSxNQUM3QztBQUFBLE1BQ0EsS0FBSyxDQUFDLFNBQVMsU0FBUztBQUN0QixxQkFBYSxnQkFBZ0IsWUFBWTtBQUN6QyxZQUFJLE9BQU8sU0FBUyxVQUFVO0FBQzVCLGlCQUFPO0FBQUEsWUFDTCxRQUFRLFNBQVMsS0FBSyxPQUFPLE9BQU8sQ0FBQyxNQUFXLEVBQUUsU0FBUyxRQUFRLEVBQUUsU0FBUyxJQUFJLENBQUM7QUFBQSxZQUNuRjtBQUFBLFVBQ0Y7QUFBQSxRQUNGO0FBQ0EsZUFBTztBQUFBLE1BQ1Q7QUFBQSxJQUNGLENBQUM7QUFBQSxJQUNELFNBQVMsQ0FBQyxhQUE0QztBQUNwRCxtQkFBYSxnQkFBZ0IsV0FBVztBQUN4QyxhQUFPLG9CQUFvQixRQUFRLFFBQVEsUUFBUSxDQUFDO0FBQUEsSUFDdEQ7QUFBQSxJQUNBLElBQUksQ0FBQyxXQUErQjtBQUNsQyxtQkFBYSxnQkFBZ0IsTUFBTTtBQUNuQyxhQUFPLG9CQUFvQixNQUFNO0FBQUEsSUFDbkM7QUFBQSxFQUNGO0FBRUEsb0JBQWtCLEtBQVksZ0JBQWdCO0FBRTlDLFNBQU87QUFDVDsiLAogICJuYW1lcyI6IFsiQ29udGV4dCIsICJFZmZlY3QiLCAiQ2F1c2UiLCAiQ29udGV4dCIsICJFZmZlY3QiLCAiRWZmZWN0IiwgIkNhdXNlIiwgIkNvbnRleHQiLCAiRWZmZWN0IiwgIm1ha2UiLCAiYXBpIiwgIkNvbnRleHQiLCAib3B0aW9ucyJdCn0K