@logixjs/sandbox 0.0.1 → 0.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (248) hide show
  1. package/LICENSE +201 -0
  2. package/package.json +3 -1
  3. package/public/sandbox/chunks/chunk-2AUQRESB.js +1114 -0
  4. package/public/sandbox/chunks/chunk-2F72LQKW.js +194 -0
  5. package/public/sandbox/chunks/chunk-2PYDGDD3.js +4071 -0
  6. package/public/sandbox/chunks/chunk-2UGKSXDZ.js +16 -0
  7. package/public/sandbox/chunks/chunk-2XVE7F26.js +153 -0
  8. package/public/sandbox/chunks/chunk-3A7TFNZN.js +219 -0
  9. package/public/sandbox/chunks/chunk-3BHC6JAV.js +1070 -0
  10. package/public/sandbox/chunks/chunk-3U4CAKCX.js +61 -0
  11. package/public/sandbox/chunks/chunk-3VU3JLZO.js +272 -0
  12. package/public/sandbox/chunks/chunk-4CPONKWY.js +1170 -0
  13. package/public/sandbox/chunks/chunk-4GMUQTWH.js +850 -0
  14. package/public/sandbox/chunks/chunk-4KIYG5E4.js +749 -0
  15. package/public/sandbox/chunks/chunk-4MY35XR3.js +175 -0
  16. package/public/sandbox/chunks/chunk-5DNHJMHA.js +69 -0
  17. package/public/sandbox/chunks/chunk-5EC4S7X6.js +42 -0
  18. package/public/sandbox/chunks/chunk-5FB7QFSH.js +227 -0
  19. package/public/sandbox/chunks/chunk-5GEYCJW2.js +206 -0
  20. package/public/sandbox/chunks/chunk-5PT7Q5SS.js +373 -0
  21. package/public/sandbox/chunks/chunk-5WN5IGKA.js +166 -0
  22. package/public/sandbox/chunks/chunk-5XOBKSOT.js +213 -0
  23. package/public/sandbox/chunks/chunk-67RVISUC.js +313 -0
  24. package/public/sandbox/chunks/chunk-6ELJEKZS.js +12 -0
  25. package/public/sandbox/chunks/chunk-6FKWRVP4.js +85 -0
  26. package/public/sandbox/chunks/chunk-6JRP52YT.js +34 -0
  27. package/public/sandbox/chunks/chunk-6JYAC3G6.js +42 -0
  28. package/public/sandbox/chunks/chunk-6TUOP63Q.js +86 -0
  29. package/public/sandbox/chunks/{chunk-A6JFUNQQ.js → chunk-74C5VW7Z.js} +2 -2
  30. package/public/sandbox/chunks/chunk-75DQFC5M.js +16 -0
  31. package/public/sandbox/chunks/{chunk-UCFEP3BH.js → chunk-7GPAF2UK.js} +1 -1
  32. package/public/sandbox/chunks/chunk-7KQFTS2Y.js +135 -0
  33. package/public/sandbox/chunks/chunk-7POKWYE3.js +112 -0
  34. package/public/sandbox/chunks/chunk-7VUEF5F3.js +395 -0
  35. package/public/sandbox/chunks/chunk-7W5APZS2.js +77 -0
  36. package/public/sandbox/chunks/chunk-A6OFCXDQ.js +397 -0
  37. package/public/sandbox/chunks/chunk-A7HLOSO6.js +216 -0
  38. package/public/sandbox/chunks/chunk-AGF4RRCB.js +408 -0
  39. package/public/sandbox/chunks/chunk-ASJSJAAL.js +122 -0
  40. package/public/sandbox/chunks/chunk-ASVMK364.js +283 -0
  41. package/public/sandbox/chunks/chunk-AUDTI2BQ.js +895 -0
  42. package/public/sandbox/chunks/chunk-B2SZTA3M.js +16 -0
  43. package/public/sandbox/chunks/chunk-B6YS2UMV.js +372 -0
  44. package/public/sandbox/chunks/chunk-BCEO3MGD.js +244 -0
  45. package/public/sandbox/chunks/chunk-BCOO65D4.js +373 -0
  46. package/public/sandbox/chunks/chunk-BJOWSSEL.js +38 -0
  47. package/public/sandbox/chunks/chunk-BS2WBFW4.js +373 -0
  48. package/public/sandbox/chunks/chunk-BUVHG3NJ.js +439 -0
  49. package/public/sandbox/chunks/chunk-BVE33AN6.js +42 -0
  50. package/public/sandbox/chunks/chunk-BWTGJZVP.js +19 -0
  51. package/public/sandbox/chunks/chunk-BXD7GZC3.js +1025 -0
  52. package/public/sandbox/chunks/chunk-BZH4EUUD.js +164 -0
  53. package/public/sandbox/chunks/{chunk-HFV5GJPK.js → chunk-C2MYMMO4.js} +3 -3
  54. package/public/sandbox/chunks/chunk-CRE4NJJ6.js +271 -0
  55. package/public/sandbox/chunks/chunk-CVZPRIDB.js +706 -0
  56. package/public/sandbox/chunks/chunk-CWOXD5NG.js +991 -0
  57. package/public/sandbox/chunks/chunk-D6DOC3BJ.js +373 -0
  58. package/public/sandbox/chunks/chunk-DEPSGFSY.js +1698 -0
  59. package/public/sandbox/chunks/chunk-DM7C5NP5.js +819 -0
  60. package/public/sandbox/chunks/chunk-DN33LMOF.js +1112 -0
  61. package/public/sandbox/chunks/{chunk-S46P7MC6.js → chunk-DT7YIIWE.js} +2 -2
  62. package/public/sandbox/chunks/chunk-DVB5WRCI.js +260 -0
  63. package/public/sandbox/chunks/{chunk-TOHCFMQS.js → chunk-E3EVW7NR.js} +11 -18
  64. package/public/sandbox/chunks/chunk-E5BV567Q.js +417 -0
  65. package/public/sandbox/chunks/chunk-E7BIWMQQ.js +203 -0
  66. package/public/sandbox/chunks/chunk-EAKGPSOQ.js +83 -0
  67. package/public/sandbox/chunks/chunk-EGUYL2ER.js +75 -0
  68. package/public/sandbox/chunks/chunk-EP5GQYZ5.js +85 -0
  69. package/public/sandbox/chunks/chunk-ET6CJEHC.js +221 -0
  70. package/public/sandbox/chunks/chunk-EU67YZHZ.js +1070 -0
  71. package/public/sandbox/chunks/{chunk-PTSJJANP.js → chunk-EYNDQLSB.js} +1 -1
  72. package/public/sandbox/chunks/{chunk-CEGSWZ5S.js → chunk-EZTMVCJF.js} +1 -1
  73. package/public/sandbox/chunks/chunk-F5CLVIS6.js +907 -0
  74. package/public/sandbox/chunks/chunk-F743SKYD.js +85 -0
  75. package/public/sandbox/chunks/chunk-FEGFZ5OX.js +86 -0
  76. package/public/sandbox/chunks/chunk-FG5B7ZX3.js +373 -0
  77. package/public/sandbox/chunks/chunk-FKZPYMDG.js +373 -0
  78. package/public/sandbox/chunks/chunk-FNLXHWIU.js +220 -0
  79. package/public/sandbox/chunks/chunk-FQRUTYAD.js +1991 -0
  80. package/public/sandbox/chunks/{chunk-VLYP4WUS.js → chunk-FY5A73NK.js} +5 -5
  81. package/public/sandbox/chunks/chunk-G7FAOG3O.js +221 -0
  82. package/public/sandbox/chunks/chunk-GFXHUC7Y.js +73 -0
  83. package/public/sandbox/chunks/chunk-GIPXUIZQ.js +534 -0
  84. package/public/sandbox/chunks/chunk-GP37MEGJ.js +52 -0
  85. package/public/sandbox/chunks/chunk-GXL5QCMF.js +4511 -0
  86. package/public/sandbox/chunks/chunk-GZ2NSE6A.js +177 -0
  87. package/public/sandbox/chunks/chunk-GZATW4YD.js +69 -0
  88. package/public/sandbox/chunks/chunk-H4EBXROQ.js +166 -0
  89. package/public/sandbox/chunks/chunk-HETCPK6Z.js +153 -0
  90. package/public/sandbox/chunks/chunk-HGUFQ2QC.js +4431 -0
  91. package/public/sandbox/chunks/chunk-HGV3VNH3.js +255 -0
  92. package/public/sandbox/chunks/chunk-HIJ67QWR.js +5397 -0
  93. package/public/sandbox/chunks/chunk-IDHERBKW.js +1114 -0
  94. package/public/sandbox/chunks/chunk-IDTK4FIY.js +102 -0
  95. package/public/sandbox/chunks/chunk-ILFVY7H5.js +164 -0
  96. package/public/sandbox/chunks/chunk-ISGSRYGO.js +57 -0
  97. package/public/sandbox/chunks/chunk-J45VPU24.js +408 -0
  98. package/public/sandbox/chunks/chunk-JAUIM3O5.js +42 -0
  99. package/public/sandbox/chunks/chunk-JB7OQEM6.js +373 -0
  100. package/public/sandbox/chunks/chunk-JCKW6NHD.js +15 -0
  101. package/public/sandbox/chunks/chunk-JMA7GY7Z.js +221 -0
  102. package/public/sandbox/chunks/chunk-JY46J6IL.js +836 -0
  103. package/public/sandbox/chunks/{chunk-X72PZOFA.js → chunk-K2MQ66O7.js} +1 -1
  104. package/public/sandbox/chunks/chunk-KA7PZA6F.js +464 -0
  105. package/public/sandbox/chunks/chunk-KDEQTUID.js +102 -0
  106. package/public/sandbox/chunks/chunk-KDJR27JV.js +1696 -0
  107. package/public/sandbox/chunks/chunk-KFE3JO6N.js +77 -0
  108. package/public/sandbox/chunks/chunk-KLDSYWT5.js +536 -0
  109. package/public/sandbox/chunks/chunk-KQWWFYBF.js +203 -0
  110. package/public/sandbox/chunks/chunk-KTFZSXOW.js +6473 -0
  111. package/public/sandbox/chunks/chunk-KXVIC55U.js +108 -0
  112. package/public/sandbox/chunks/{chunk-HNEDTEGQ.js → chunk-L4PNO2H6.js} +1 -1
  113. package/public/sandbox/chunks/{chunk-WE4STGO2.js → chunk-L4ZNW5DI.js} +2 -2
  114. package/public/sandbox/chunks/chunk-LBUINGZ4.js +836 -0
  115. package/public/sandbox/chunks/chunk-LIYPPU6I.js +112 -0
  116. package/public/sandbox/chunks/chunk-LJHTOJXW.js +221 -0
  117. package/public/sandbox/chunks/{chunk-BWSNPKO5.js → chunk-LQL23SWJ.js} +2 -2
  118. package/public/sandbox/chunks/chunk-LTFCYZQ6.js +46 -0
  119. package/public/sandbox/chunks/chunk-LTWLVCKQ.js +166 -0
  120. package/public/sandbox/chunks/chunk-LWI7BXFN.js +395 -0
  121. package/public/sandbox/chunks/chunk-LYBBX6WM.js +225 -0
  122. package/public/sandbox/chunks/chunk-MXE7HIBM.js +474 -0
  123. package/public/sandbox/chunks/chunk-MYBDYNK4.js +6004 -0
  124. package/public/sandbox/chunks/chunk-NC2MIWZX.js +732 -0
  125. package/public/sandbox/chunks/chunk-NE447XAF.js +597 -0
  126. package/public/sandbox/chunks/chunk-NEAYV5C2.js +255 -0
  127. package/public/sandbox/chunks/chunk-NMGFJZ4I.js +26 -0
  128. package/public/sandbox/chunks/chunk-NWCJJZNQ.js +71 -0
  129. package/public/sandbox/chunks/chunk-O57OZBDR.js +214 -0
  130. package/public/sandbox/chunks/chunk-OJJT664Q.js +731 -0
  131. package/public/sandbox/chunks/chunk-OKTBUTCH.js +1175 -0
  132. package/public/sandbox/chunks/chunk-OQ4SYV5D.js +534 -0
  133. package/public/sandbox/chunks/chunk-OTVVIHJD.js +219 -0
  134. package/public/sandbox/chunks/chunk-OWTMSCF7.js +1052 -0
  135. package/public/sandbox/chunks/chunk-P5ZQNFC3.js +122 -0
  136. package/public/sandbox/chunks/chunk-PBPT2U2N.js +1698 -0
  137. package/public/sandbox/chunks/chunk-PHBJLCP3.js +836 -0
  138. package/public/sandbox/chunks/chunk-PHV4HYHB.js +397 -0
  139. package/public/sandbox/chunks/chunk-PIXQ6SOX.js +4071 -0
  140. package/public/sandbox/chunks/chunk-PKJL6YLK.js +73 -0
  141. package/public/sandbox/chunks/chunk-PKPOITIU.js +221 -0
  142. package/public/sandbox/chunks/{chunk-NQW73ACJ.js → chunk-PMXBOYQI.js} +1 -1
  143. package/public/sandbox/chunks/chunk-PQLZD7NR.js +836 -0
  144. package/public/sandbox/chunks/chunk-QEESVOZU.js +16 -0
  145. package/public/sandbox/chunks/chunk-QGIM3FQK.js +159 -0
  146. package/public/sandbox/chunks/chunk-QL5JNEDO.js +69 -0
  147. package/public/sandbox/chunks/chunk-QQOZ3RMH.js +867 -0
  148. package/public/sandbox/chunks/chunk-QUMEVT2F.js +194 -0
  149. package/public/sandbox/chunks/chunk-QVZBXYVY.js +102 -0
  150. package/public/sandbox/chunks/chunk-R5HQS6RB.js +135 -0
  151. package/public/sandbox/chunks/chunk-R75Q2CTT.js +900 -0
  152. package/public/sandbox/chunks/chunk-RBB6SHW2.js +253 -0
  153. package/public/sandbox/chunks/chunk-RDHNRWQP.js +383 -0
  154. package/public/sandbox/chunks/chunk-RIWOEI3T.js +1101 -0
  155. package/public/sandbox/chunks/chunk-RS5FFPUV.js +103 -0
  156. package/public/sandbox/chunks/chunk-RYSSJBGX.js +203 -0
  157. package/public/sandbox/chunks/chunk-S3KBAE5Z.js +1114 -0
  158. package/public/sandbox/chunks/chunk-S6ZZHV6G.js +244 -0
  159. package/public/sandbox/chunks/chunk-SFXJ24HY.js +499 -0
  160. package/public/sandbox/chunks/chunk-SH7TP5CJ.js +1109 -0
  161. package/public/sandbox/chunks/chunk-SI5OKFFY.js +317 -0
  162. package/public/sandbox/chunks/chunk-SIXNQNIR.js +86 -0
  163. package/public/sandbox/chunks/chunk-ST353BOX.js +42 -0
  164. package/public/sandbox/chunks/chunk-SYEHKMLP.js +1140 -0
  165. package/public/sandbox/chunks/chunk-SZ4KQUJU.js +69 -0
  166. package/public/sandbox/chunks/{chunk-5SOP6EKV.js → chunk-SZI65PSP.js} +5 -10
  167. package/public/sandbox/chunks/chunk-T7RLTSMX.js +78 -0
  168. package/public/sandbox/chunks/chunk-TJ2RLUTW.js +57 -0
  169. package/public/sandbox/chunks/chunk-TJB73XPN.js +4071 -0
  170. package/public/sandbox/chunks/chunk-TXJCYO56.js +4046 -0
  171. package/public/sandbox/chunks/chunk-U5J3LCYI.js +731 -0
  172. package/public/sandbox/chunks/chunk-UABFN3NH.js +208 -0
  173. package/public/sandbox/chunks/chunk-UBMUY7WO.js +13 -0
  174. package/public/sandbox/chunks/chunk-UC27CE32.js +69 -0
  175. package/public/sandbox/chunks/chunk-UJGVDFZN.js +147 -0
  176. package/public/sandbox/chunks/chunk-UNVLTK4N.js +122 -0
  177. package/public/sandbox/chunks/chunk-UQKQ6V3V.js +208 -0
  178. package/public/sandbox/chunks/chunk-UZZBHWIO.js +703 -0
  179. package/public/sandbox/chunks/chunk-VKZIJERL.js +1114 -0
  180. package/public/sandbox/chunks/chunk-VQQEAGID.js +372 -0
  181. package/public/sandbox/chunks/{chunk-3LX3KIQQ.js → chunk-W365QUZ5.js} +3 -5
  182. package/public/sandbox/chunks/chunk-WJY2LSWG.js +1052 -0
  183. package/public/sandbox/chunks/chunk-WNOBN3DX.js +391 -0
  184. package/public/sandbox/chunks/chunk-X2Z5VYG3.js +245 -0
  185. package/public/sandbox/chunks/chunk-X74KU74D.js +959 -0
  186. package/public/sandbox/chunks/chunk-XE7ULSGQ.js +46 -0
  187. package/public/sandbox/chunks/chunk-XRXUJZ3X.js +431 -0
  188. package/public/sandbox/chunks/chunk-XWHIN7CC.js +85 -0
  189. package/public/sandbox/chunks/chunk-Y2TVGGVL.js +527 -0
  190. package/public/sandbox/chunks/chunk-YMVMZA3U.js +1395 -0
  191. package/public/sandbox/chunks/chunk-YOBLFWDV.js +431 -0
  192. package/public/sandbox/chunks/chunk-YR2RFEZA.js +11 -0
  193. package/public/sandbox/chunks/chunk-YTD6A35P.js +836 -0
  194. package/public/sandbox/chunks/chunk-Z5L7EZXS.js +81 -0
  195. package/public/sandbox/chunks/chunk-Z65I5ET2.js +108 -0
  196. package/public/sandbox/chunks/chunk-Z6LV34RO.js +390 -0
  197. package/public/sandbox/chunks/chunk-ZAKUP6QG.js +1634 -0
  198. package/public/sandbox/chunks/chunk-ZHNYE2YH.js +731 -0
  199. package/public/sandbox/chunks/chunk-ZHQX3B3Y.js +867 -0
  200. package/public/sandbox/chunks/chunk-ZIXDFRHJ.js +731 -0
  201. package/public/sandbox/chunks/chunk-ZPZ2MZ4D.js +528 -0
  202. package/public/sandbox/chunks/chunk-ZQD6NZXB.js +373 -0
  203. package/public/sandbox/chunks/chunk-ZVVBP7ON.js +16 -0
  204. package/public/sandbox/chunks/chunk-ZWE3P6X2.js +11 -0
  205. package/public/sandbox/logix-core/Bound.js +14 -14
  206. package/public/sandbox/logix-core/Debug.js +12 -10
  207. package/public/sandbox/logix-core/EffectOp.js +3 -4
  208. package/public/sandbox/logix-core/Env.js +5 -2
  209. package/public/sandbox/logix-core/ExternalStore.js +239 -0
  210. package/public/sandbox/logix-core/Flow.js +7 -8
  211. package/public/sandbox/logix-core/Kernel.js +7 -4
  212. package/public/sandbox/logix-core/Link.js +33 -25
  213. package/public/sandbox/logix-core/Middleware.js +13 -11
  214. package/public/sandbox/logix-core/Module.js +93 -30
  215. package/public/sandbox/logix-core/ModuleTag.js +28 -25
  216. package/public/sandbox/logix-core/Observability.js +21 -19
  217. package/public/sandbox/logix-core/Process.js +27 -22
  218. package/public/sandbox/logix-core/ReadQuery.js +7 -11
  219. package/public/sandbox/logix-core/Reflection.js +173 -53
  220. package/public/sandbox/logix-core/Resource.js +6 -3
  221. package/public/sandbox/logix-core/Root.js +7 -3
  222. package/public/sandbox/logix-core/Runtime.js +54 -40
  223. package/public/sandbox/logix-core/ScopeRegistry.js +6 -3
  224. package/public/sandbox/logix-core/StateTrait.js +17 -14
  225. package/public/sandbox/logix-core/TraitLifecycle.js +8 -8
  226. package/public/sandbox/logix-core/Workflow.js +332 -0
  227. package/public/sandbox/logix-core.js +11133 -6622
  228. package/public/sandbox/logix-core.manifest.json +4 -2
  229. package/public/sandbox/worker.js +3 -3
  230. package/public/sandbox/chunks/chunk-4LRLOTMA.js +0 -1698
  231. package/public/sandbox/chunks/chunk-CDLXJHXY.js +0 -120
  232. package/public/sandbox/chunks/chunk-CZRI7MHA.js +0 -46
  233. package/public/sandbox/chunks/chunk-EJDFUZ4B.js +0 -408
  234. package/public/sandbox/chunks/chunk-IP63FME6.js +0 -282
  235. package/public/sandbox/chunks/chunk-JIXTOQXJ.js +0 -1103
  236. package/public/sandbox/chunks/chunk-MPUSOFJ3.js +0 -1928
  237. package/public/sandbox/chunks/chunk-ON2LY6HJ.js +0 -135
  238. package/public/sandbox/chunks/chunk-POIBXAH5.js +0 -995
  239. package/public/sandbox/chunks/chunk-PQ652ULI.js +0 -6359
  240. package/public/sandbox/chunks/chunk-RJQ4PG2F.js +0 -77
  241. package/public/sandbox/chunks/chunk-S4EXG3OS.js +0 -533
  242. package/public/sandbox/chunks/chunk-SUXDGXVE.js +0 -390
  243. package/public/sandbox/chunks/chunk-TOQ6SJ6O.js +0 -244
  244. package/public/sandbox/chunks/chunk-UKYAF3NL.js +0 -1036
  245. package/public/sandbox/chunks/chunk-UMVN3AWO.js +0 -395
  246. package/public/sandbox/chunks/chunk-WFV5PPWJ.js +0 -194
  247. package/public/sandbox/chunks/chunk-YF6IO732.js +0 -206
  248. package/public/sandbox/chunks/chunk-ZUBABAAO.js +0 -86
@@ -0,0 +1,850 @@
1
+ // @logix/core subpath bundles for @logix/sandbox
2
+
3
+ import {
4
+ currentLinkId,
5
+ projectJsonValue
6
+ } from "./chunk-S6ZZHV6G.js";
7
+
8
+ // ../logix-core/src/internal/runtime/core/DebugSink.ts
9
+ import { Cause as Cause2, Effect, FiberRef, Layer, Logger } from "../effect.js";
10
+
11
+ // ../logix-core/src/internal/runtime/core/errorSummary.ts
12
+ import { Cause } from "../effect.js";
13
+ var truncate = (value, maxLen) => {
14
+ if (value.length <= maxLen) return { value, truncated: false };
15
+ return { value: value.slice(0, maxLen), truncated: true };
16
+ };
17
+ var safeStringify = (value) => {
18
+ try {
19
+ return { ok: true, json: JSON.stringify(value) };
20
+ } catch {
21
+ return { ok: false };
22
+ }
23
+ };
24
+ var getMessageFromUnknown = (cause) => {
25
+ if (typeof cause === "string") return cause;
26
+ if (typeof cause === "number" || typeof cause === "boolean" || typeof cause === "bigint") return String(cause);
27
+ if (cause instanceof Error) return cause.message || cause.name || "Error";
28
+ if (cause && typeof cause === "object" && "message" in cause && typeof cause.message === "string") {
29
+ return cause.message;
30
+ }
31
+ try {
32
+ const pretty = Cause.pretty(cause, { renderErrorCause: true });
33
+ if (typeof pretty === "string" && pretty.length > 0) return pretty;
34
+ } catch {
35
+ }
36
+ return "Unknown error";
37
+ };
38
+ var toSerializableErrorSummary = (cause, options) => {
39
+ const maxMessageLength = options?.maxMessageLength ?? 256;
40
+ const messageRaw = getMessageFromUnknown(cause);
41
+ const { value: message, truncated } = truncate(messageRaw, maxMessageLength);
42
+ const summary = {
43
+ message
44
+ };
45
+ if (cause instanceof Error) {
46
+ if (cause.name && cause.name !== "Error") summary.name = cause.name;
47
+ const anyCause = cause;
48
+ if (typeof anyCause.code === "string" && anyCause.code.length > 0) summary.code = anyCause.code;
49
+ else if (typeof anyCause.code === "number" && Number.isFinite(anyCause.code)) summary.code = String(anyCause.code);
50
+ if (typeof anyCause.hint === "string" && anyCause.hint.length > 0) summary.hint = anyCause.hint;
51
+ return {
52
+ errorSummary: summary,
53
+ downgrade: truncated ? "oversized" : void 0
54
+ };
55
+ }
56
+ if (cause && typeof cause === "object") {
57
+ const anyCause = cause;
58
+ if (typeof anyCause.name === "string" && anyCause.name.length > 0) summary.name = anyCause.name;
59
+ if (typeof anyCause.code === "string" && anyCause.code.length > 0) summary.code = anyCause.code;
60
+ if (typeof anyCause.hint === "string" && anyCause.hint.length > 0) summary.hint = anyCause.hint;
61
+ }
62
+ const stringifyResult = safeStringify(cause);
63
+ if (!stringifyResult.ok) {
64
+ return {
65
+ errorSummary: summary,
66
+ downgrade: "non_serializable"
67
+ };
68
+ }
69
+ if (truncated) {
70
+ return {
71
+ errorSummary: summary,
72
+ downgrade: "oversized"
73
+ };
74
+ }
75
+ if (message === "Unknown error") {
76
+ return {
77
+ errorSummary: summary,
78
+ downgrade: "unknown"
79
+ };
80
+ }
81
+ return { errorSummary: summary };
82
+ };
83
+
84
+ // ../logix-core/src/internal/runtime/core/DebugSink.ts
85
+ var currentDebugSinks = FiberRef.unsafeMake([]);
86
+ var currentRuntimeLabel = FiberRef.unsafeMake(void 0);
87
+ var currentTxnId = FiberRef.unsafeMake(void 0);
88
+ var currentDiagnosticsLevel = FiberRef.unsafeMake("off");
89
+ var diagnosticsLevel = (level) => Layer.fiberRefLocallyScopedWith(currentDiagnosticsLevel, () => level);
90
+ var currentTraitConvergeDiagnosticsSampling = FiberRef.unsafeMake({
91
+ sampleEveryN: 32,
92
+ topK: 3
93
+ });
94
+ var traitConvergeDiagnosticsSampling = (config) => Layer.fiberRefLocallyScopedWith(currentTraitConvergeDiagnosticsSampling, () => config);
95
+ var appendSinks = (sinks) => Layer.fiberRefLocallyScopedWith(currentDebugSinks, (current) => [...current, ...sinks]);
96
+ var nextGlobalEventSeq = 0;
97
+ var clearRuntimeDebugEventSeq = () => {
98
+ nextGlobalEventSeq = 0;
99
+ };
100
+ var nextEventSeq = () => {
101
+ nextGlobalEventSeq += 1;
102
+ return nextGlobalEventSeq;
103
+ };
104
+ var makeEventId = (instanceId, eventSeq) => `${instanceId}::e${eventSeq}`;
105
+ var mergeDowngrade = (current, next) => {
106
+ if (!current) return next;
107
+ if (!next) return current;
108
+ if (current === "non_serializable" || next === "non_serializable") return "non_serializable";
109
+ if (current === "oversized" || next === "oversized") return "oversized";
110
+ return "unknown";
111
+ };
112
+ var browserLifecycleSeen = /* @__PURE__ */ new Set();
113
+ var browserDiagnosticSeen = /* @__PURE__ */ new Set();
114
+ var lastTxnByInstance = /* @__PURE__ */ new Map();
115
+ var lifecycleErrorLog = (event) => {
116
+ const moduleId = event.moduleId ?? "unknown";
117
+ const causePretty = (() => {
118
+ try {
119
+ return Cause2.pretty(event.cause, {
120
+ renderErrorCause: true
121
+ });
122
+ } catch {
123
+ try {
124
+ return JSON.stringify(event.cause, null, 2);
125
+ } catch {
126
+ return String(event.cause);
127
+ }
128
+ }
129
+ })();
130
+ const message = `[Logix][module=${moduleId}] lifecycle:error
131
+ ${causePretty}`;
132
+ return Effect.logError(message).pipe(
133
+ Effect.annotateLogs({
134
+ "logix.moduleId": moduleId,
135
+ "logix.event": "lifecycle:error",
136
+ "logix.cause": causePretty
137
+ })
138
+ );
139
+ };
140
+ var diagnosticLog = (event) => {
141
+ const moduleId = event.moduleId ?? "unknown";
142
+ const header = `[Logix][module=${moduleId}] diagnostic(${event.severity})`;
143
+ const detail = `code=${event.code} message=${event.message}${event.actionTag ? ` action=${event.actionTag}` : ""}${event.hint ? `
144
+ hint: ${event.hint}` : ""}`;
145
+ const msg = `${header}
146
+ ${detail}`;
147
+ const base = event.severity === "warning" ? Effect.logWarning(msg) : event.severity === "info" ? Effect.logInfo(msg) : Effect.logError(msg);
148
+ const annotations = {
149
+ "logix.moduleId": moduleId,
150
+ "logix.event": `diagnostic(${event.severity})`,
151
+ "logix.diagnostic.code": event.code,
152
+ "logix.diagnostic.message": event.message
153
+ };
154
+ if (event.hint) {
155
+ annotations["logix.diagnostic.hint"] = event.hint;
156
+ }
157
+ if (event.actionTag) {
158
+ annotations["logix.diagnostic.actionTag"] = event.actionTag;
159
+ }
160
+ return base.pipe(Effect.annotateLogs(annotations));
161
+ };
162
+ var noopLayer = Layer.locallyScoped(currentDebugSinks, []);
163
+ var errorOnlySink = {
164
+ record: (event) => event.type === "lifecycle:error" ? lifecycleErrorLog(event) : event.type === "diagnostic" && event.severity !== "info" ? diagnosticLog(event) : Effect.void
165
+ };
166
+ var errorOnlyLayer = Layer.locallyScoped(currentDebugSinks, [errorOnlySink]);
167
+ var consoleSink = {
168
+ record: (event) => event.type === "lifecycle:error" ? lifecycleErrorLog(event) : event.type === "diagnostic" ? diagnosticLog(event) : Effect.logDebug({ debugEvent: event })
169
+ };
170
+ var consoleLayer = Layer.locallyScoped(currentDebugSinks, [consoleSink]);
171
+ var isBrowser = typeof window !== "undefined" && typeof document !== "undefined";
172
+ var renderBrowserConsoleEvent = (event) => {
173
+ if (typeof event.type === "string" && event.type.startsWith("trace:")) {
174
+ const moduleId = event.moduleId ?? "unknown";
175
+ const type = event.type;
176
+ return Effect.sync(() => {
177
+ console.groupCollapsed(
178
+ "%c[Logix]%c trace %c" + moduleId + "%c " + String(type),
179
+ "color:#6b7280;font-weight:bold",
180
+ // tag
181
+ "color:#3b82f6",
182
+ // label
183
+ "color:#9ca3af",
184
+ // module id
185
+ "color:#6b7280"
186
+ // type
187
+ );
188
+ console.log(event);
189
+ console.groupEnd();
190
+ });
191
+ }
192
+ if (event.type === "lifecycle:error") {
193
+ const moduleId = event.moduleId ?? "unknown";
194
+ const causePretty = (() => {
195
+ try {
196
+ return Cause2.pretty(event.cause, { renderErrorCause: true });
197
+ } catch {
198
+ try {
199
+ return JSON.stringify(event.cause, null, 2);
200
+ } catch {
201
+ return String(event.cause);
202
+ }
203
+ }
204
+ })();
205
+ const key = `${moduleId}|${causePretty}`;
206
+ if (browserLifecycleSeen.has(key)) {
207
+ return Effect.void;
208
+ }
209
+ browserLifecycleSeen.add(key);
210
+ return Effect.sync(() => {
211
+ console.groupCollapsed(
212
+ "%c[Logix]%c lifecycle:error %c" + moduleId,
213
+ "color:#ef4444;font-weight:bold",
214
+ // tag
215
+ "color:#ef4444",
216
+ // label
217
+ "color:#9ca3af"
218
+ // module id
219
+ );
220
+ console.error(causePretty);
221
+ console.groupEnd();
222
+ });
223
+ }
224
+ if (event.type === "diagnostic") {
225
+ const moduleId = event.moduleId ?? "unknown";
226
+ const detail = `code=${event.code} message=${event.message}${event.actionTag ? ` action=${event.actionTag}` : ""}${event.hint ? `
227
+ hint: ${event.hint}` : ""}`;
228
+ const color = event.severity === "warning" ? "color:#d97706" : event.severity === "info" ? "color:#3b82f6" : "color:#ef4444";
229
+ const label = event.severity === "warning" ? "diagnostic(warning)" : event.severity === "info" ? "diagnostic(info)" : "diagnostic(error)";
230
+ const key = `${moduleId}|${event.code}|${event.message}`;
231
+ if (browserDiagnosticSeen.has(key)) {
232
+ return Effect.void;
233
+ }
234
+ browserDiagnosticSeen.add(key);
235
+ return Effect.sync(() => {
236
+ console.groupCollapsed(
237
+ "%c[Logix]%c " + label + "%c module=" + moduleId,
238
+ "color:#6b7280;font-weight:bold",
239
+ color,
240
+ "color:#9ca3af"
241
+ );
242
+ console.log(detail);
243
+ console.groupEnd();
244
+ });
245
+ }
246
+ return Effect.void;
247
+ };
248
+ var browserConsoleSink = {
249
+ record: (event) => {
250
+ if (!isBrowser) {
251
+ return event.type === "lifecycle:error" ? lifecycleErrorLog(event) : event.type === "diagnostic" ? diagnosticLog(event) : Effect.logDebug({ debugEvent: event });
252
+ }
253
+ return renderBrowserConsoleEvent(event);
254
+ }
255
+ };
256
+ var browserConsoleLayer = Layer.locallyScoped(currentDebugSinks, [browserConsoleSink]);
257
+ var browserPrettyLoggerLayer = Logger.replace(
258
+ Logger.defaultLogger,
259
+ Logger.prettyLogger({ mode: "browser", colors: true })
260
+ );
261
+ var record = (event) => Effect.gen(function* () {
262
+ const sinks = yield* FiberRef.get(currentDebugSinks);
263
+ if (sinks.length === 0) {
264
+ if (isBrowser) {
265
+ if (event.type === "lifecycle:error" || event.type === "diagnostic") {
266
+ yield* renderBrowserConsoleEvent(event);
267
+ return;
268
+ }
269
+ yield* Effect.void;
270
+ return;
271
+ }
272
+ if (event.type === "lifecycle:error") {
273
+ yield* lifecycleErrorLog(event);
274
+ return;
275
+ }
276
+ if (event.type === "diagnostic") {
277
+ yield* diagnosticLog(event);
278
+ return;
279
+ }
280
+ yield* Effect.void;
281
+ return;
282
+ }
283
+ const now = Date.now();
284
+ const enriched = event;
285
+ if (enriched.timestamp === void 0) {
286
+ ;
287
+ enriched.timestamp = now;
288
+ }
289
+ if (enriched.runtimeLabel === void 0) {
290
+ const runtimeLabel = yield* FiberRef.get(currentRuntimeLabel);
291
+ if (runtimeLabel) {
292
+ ;
293
+ enriched.runtimeLabel = runtimeLabel;
294
+ }
295
+ }
296
+ if (enriched.type === "diagnostic" && enriched.txnId === void 0) {
297
+ const txnId = yield* FiberRef.get(currentTxnId);
298
+ if (txnId) {
299
+ ;
300
+ enriched.txnId = txnId;
301
+ }
302
+ }
303
+ if (enriched.type === "trace:effectop" && enriched.linkId === void 0) {
304
+ const linkId = yield* FiberRef.get(currentLinkId);
305
+ if (linkId) {
306
+ ;
307
+ enriched.linkId = linkId;
308
+ }
309
+ }
310
+ if (sinks.length === 1) {
311
+ yield* sinks[0].record(enriched);
312
+ return;
313
+ }
314
+ yield* Effect.forEach(sinks, (sink) => sink.record(enriched), { discard: true });
315
+ });
316
+ var toRuntimeDebugEventRef = (event, options) => {
317
+ const diagnosticsLevel2 = options?.diagnosticsLevel ?? "full";
318
+ if (diagnosticsLevel2 === "off") {
319
+ return void 0;
320
+ }
321
+ const isLightLike = diagnosticsLevel2 === "light" || diagnosticsLevel2 === "sampled";
322
+ const timestamp = typeof event.timestamp === "number" && Number.isFinite(event.timestamp) ? event.timestamp : Date.now();
323
+ const moduleIdRaw = event.moduleId;
324
+ const moduleId = typeof moduleIdRaw === "string" && moduleIdRaw.length > 0 ? moduleIdRaw : "unknown";
325
+ const instanceIdRaw = event.instanceId;
326
+ const instanceId = typeof instanceIdRaw === "string" && instanceIdRaw.length > 0 ? instanceIdRaw : "unknown";
327
+ const runtimeLabelRaw = event.runtimeLabel;
328
+ const runtimeLabel = typeof runtimeLabelRaw === "string" && runtimeLabelRaw.length > 0 ? runtimeLabelRaw : void 0;
329
+ const txnSeqRaw = event.txnSeq;
330
+ const txnSeq = typeof txnSeqRaw === "number" && Number.isFinite(txnSeqRaw) && txnSeqRaw >= 0 ? Math.floor(txnSeqRaw) : 0;
331
+ const txnIdRaw = event.txnId;
332
+ const txnId = typeof txnIdRaw === "string" && txnIdRaw.length > 0 ? txnIdRaw : txnSeq > 0 ? `${instanceId}::t${txnSeq}` : void 0;
333
+ const linkId = (() => {
334
+ const linkIdRaw = event.linkId;
335
+ if (typeof linkIdRaw === "string" && linkIdRaw.length > 0) return linkIdRaw;
336
+ if (typeof event.type !== "string" || !event.type.startsWith("trace:")) {
337
+ return void 0;
338
+ }
339
+ const data = event.data;
340
+ const meta = data?.meta;
341
+ const linkIdFromMeta = meta?.linkId;
342
+ if (typeof linkIdFromMeta === "string" && linkIdFromMeta.length > 0) return linkIdFromMeta;
343
+ return void 0;
344
+ })();
345
+ const eventSeqRaw = options?.eventSeq;
346
+ const eventSeq = typeof eventSeqRaw === "number" && Number.isFinite(eventSeqRaw) && eventSeqRaw > 0 ? Math.floor(eventSeqRaw) : nextEventSeq();
347
+ const eventId = makeEventId(instanceId, eventSeq);
348
+ const base = {
349
+ eventId,
350
+ eventSeq,
351
+ moduleId,
352
+ instanceId,
353
+ runtimeLabel,
354
+ txnSeq,
355
+ txnId,
356
+ linkId,
357
+ timestamp
358
+ };
359
+ let downgrade;
360
+ const withDowngrade = (ref) => {
361
+ if (!downgrade) return ref;
362
+ return { ...ref, downgrade: { reason: downgrade } };
363
+ };
364
+ switch (event.type) {
365
+ case "module:init":
366
+ return withDowngrade({
367
+ ...base,
368
+ kind: "lifecycle",
369
+ label: "module:init"
370
+ });
371
+ case "module:destroy":
372
+ return withDowngrade({
373
+ ...base,
374
+ kind: "lifecycle",
375
+ label: "module:destroy"
376
+ });
377
+ case "lifecycle:phase": {
378
+ const e = event;
379
+ const metaInput = isLightLike ? { type: "lifecycle:phase", phase: e.phase, name: e.name } : { type: "lifecycle:phase", phase: e.phase, name: e.name, payload: e.payload };
380
+ const metaProjection = projectJsonValue(metaInput);
381
+ options?.onMetaProjection?.({
382
+ stats: metaProjection.stats,
383
+ downgrade: metaProjection.downgrade
384
+ });
385
+ downgrade = mergeDowngrade(downgrade, metaProjection.downgrade);
386
+ return withDowngrade({
387
+ ...base,
388
+ kind: "lifecycle",
389
+ label: e.name,
390
+ meta: metaProjection.value
391
+ });
392
+ }
393
+ case "action:dispatch": {
394
+ const action = event.action;
395
+ const tag = action?._tag ?? action?.type ?? "action:dispatch";
396
+ const label = String(tag);
397
+ const metaInput = isLightLike ? { actionTag: label } : { action };
398
+ const metaProjection = projectJsonValue(metaInput);
399
+ options?.onMetaProjection?.({
400
+ stats: metaProjection.stats,
401
+ downgrade: metaProjection.downgrade
402
+ });
403
+ downgrade = mergeDowngrade(downgrade, metaProjection.downgrade);
404
+ return withDowngrade({
405
+ ...base,
406
+ kind: "action",
407
+ label,
408
+ meta: metaProjection.value
409
+ });
410
+ }
411
+ case "state:update": {
412
+ const e = event;
413
+ const metaInput = isLightLike ? {
414
+ state: e.state,
415
+ dirtySet: e.dirtySet,
416
+ patchCount: e.patchCount,
417
+ commitMode: e.commitMode,
418
+ priority: e.priority,
419
+ originKind: e.originKind,
420
+ originName: e.originName
421
+ } : {
422
+ state: e.state,
423
+ dirtySet: e.dirtySet,
424
+ patchCount: e.patchCount,
425
+ commitMode: e.commitMode,
426
+ priority: e.priority,
427
+ originKind: e.originKind,
428
+ originName: e.originName,
429
+ traitSummary: e.traitSummary,
430
+ replayEvent: e.replayEvent
431
+ };
432
+ const metaProjection = projectJsonValue(metaInput);
433
+ options?.onMetaProjection?.({
434
+ stats: metaProjection.stats,
435
+ downgrade: metaProjection.downgrade
436
+ });
437
+ downgrade = mergeDowngrade(downgrade, metaProjection.downgrade);
438
+ if (txnId) {
439
+ lastTxnByInstance.set(instanceId, { txnId, txnSeq });
440
+ }
441
+ return withDowngrade({
442
+ ...base,
443
+ kind: "state",
444
+ label: "state:update",
445
+ meta: metaProjection.value
446
+ });
447
+ }
448
+ case "process:start":
449
+ case "process:stop":
450
+ case "process:restart":
451
+ case "process:trigger":
452
+ case "process:dispatch":
453
+ case "process:error": {
454
+ const e = event;
455
+ const ts2 = typeof e.timestampMs === "number" && Number.isFinite(e.timestampMs) ? e.timestampMs : timestamp;
456
+ const metaInput = {
457
+ identity: e.identity,
458
+ severity: e.severity,
459
+ eventSeq: e.eventSeq,
460
+ timestampMs: e.timestampMs,
461
+ trigger: e.trigger,
462
+ dispatch: e.dispatch,
463
+ error: e.error
464
+ };
465
+ const metaProjection = projectJsonValue(metaInput);
466
+ options?.onMetaProjection?.({
467
+ stats: metaProjection.stats,
468
+ downgrade: metaProjection.downgrade
469
+ });
470
+ downgrade = mergeDowngrade(downgrade, metaProjection.downgrade);
471
+ const errorSummary = e.type === "process:error" || e.type === "process:restart" ? e.error : void 0;
472
+ return withDowngrade({
473
+ ...base,
474
+ timestamp: ts2,
475
+ kind: "process",
476
+ label: e.type,
477
+ meta: metaProjection.value,
478
+ errorSummary
479
+ });
480
+ }
481
+ case "lifecycle:error": {
482
+ const e = event;
483
+ const summary = toSerializableErrorSummary(e.cause);
484
+ downgrade = mergeDowngrade(downgrade, summary.downgrade);
485
+ const metaInput = isLightLike ? { type: "lifecycle:error", phase: e.phase, name: e.hook } : {
486
+ type: "lifecycle:error",
487
+ phase: e.phase,
488
+ name: e.hook,
489
+ hook: e.hook,
490
+ taskId: e.taskId,
491
+ origin: e.origin,
492
+ txnSeq: e.txnSeq,
493
+ opSeq: e.opSeq
494
+ };
495
+ const metaProjection = projectJsonValue(metaInput);
496
+ options?.onMetaProjection?.({
497
+ stats: metaProjection.stats,
498
+ downgrade: metaProjection.downgrade
499
+ });
500
+ downgrade = mergeDowngrade(downgrade, metaProjection.downgrade);
501
+ return withDowngrade({
502
+ ...base,
503
+ kind: "lifecycle",
504
+ label: "lifecycle:error",
505
+ meta: metaProjection.value,
506
+ errorSummary: summary.errorSummary
507
+ });
508
+ }
509
+ case "diagnostic": {
510
+ const e = event;
511
+ const metaInput = {
512
+ code: e.code,
513
+ severity: e.severity,
514
+ message: e.message,
515
+ hint: e.hint,
516
+ actionTag: e.actionTag,
517
+ kind: e.kind,
518
+ trigger: e.trigger
519
+ };
520
+ const metaProjection = projectJsonValue(metaInput);
521
+ options?.onMetaProjection?.({
522
+ stats: metaProjection.stats,
523
+ downgrade: metaProjection.downgrade
524
+ });
525
+ downgrade = mergeDowngrade(downgrade, metaProjection.downgrade);
526
+ return withDowngrade({
527
+ ...base,
528
+ kind: "diagnostic",
529
+ label: e.code,
530
+ meta: metaProjection.value
531
+ });
532
+ }
533
+ default: {
534
+ if (typeof event.type !== "string" || !event.type.startsWith("trace:")) {
535
+ return void 0;
536
+ }
537
+ if (event.type === "trace:react-render" || event.type === "trace:react-selector") {
538
+ const data = event.data;
539
+ const metaProjection2 = projectJsonValue(
540
+ isLightLike ? {
541
+ componentLabel: data?.componentLabel,
542
+ selectorKey: data?.selectorKey,
543
+ fieldPaths: data?.fieldPaths,
544
+ selectorId: data?.selectorId,
545
+ lane: data?.lane,
546
+ producer: data?.producer,
547
+ fallbackReason: data?.fallbackReason,
548
+ readsDigest: data?.readsDigest,
549
+ equalsKind: data?.equalsKind,
550
+ strictModePhase: data?.strictModePhase
551
+ } : {
552
+ componentLabel: data?.componentLabel,
553
+ selectorKey: data?.selectorKey,
554
+ fieldPaths: data?.fieldPaths,
555
+ selectorId: data?.selectorId,
556
+ lane: data?.lane,
557
+ producer: data?.producer,
558
+ fallbackReason: data?.fallbackReason,
559
+ readsDigest: data?.readsDigest,
560
+ equalsKind: data?.equalsKind,
561
+ strictModePhase: data?.strictModePhase,
562
+ meta: data?.meta
563
+ }
564
+ );
565
+ options?.onMetaProjection?.({
566
+ stats: metaProjection2.stats,
567
+ downgrade: metaProjection2.downgrade
568
+ });
569
+ downgrade = mergeDowngrade(downgrade, metaProjection2.downgrade);
570
+ const label = typeof data?.componentLabel === "string" && data.componentLabel.length > 0 ? data.componentLabel : event.type === "trace:react-selector" ? "react-selector" : "react-render";
571
+ const last = lastTxnByInstance.get(instanceId);
572
+ const txnSeqFromMeta = typeof data?.meta?.txnSeq === "number" && Number.isFinite(data.meta.txnSeq) && data.meta.txnSeq >= 0 ? Math.floor(data.meta.txnSeq) : void 0;
573
+ const txnIdFromMeta = typeof data?.meta?.txnId === "string" && data.meta.txnId.length > 0 ? data.meta.txnId : void 0;
574
+ const txnIdAligned = txnIdFromMeta ?? base.txnId ?? last?.txnId;
575
+ const txnSeqAligned = txnSeqFromMeta ?? (base.txnSeq > 0 ? base.txnSeq : last?.txnSeq ?? base.txnSeq);
576
+ return withDowngrade({
577
+ ...base,
578
+ txnId: txnIdAligned,
579
+ txnSeq: txnSeqAligned,
580
+ kind: event.type === "trace:react-selector" ? "react-selector" : "react-render",
581
+ label,
582
+ meta: metaProjection2.value
583
+ });
584
+ }
585
+ if (event.type === "trace:selector:eval") {
586
+ const data = event.data;
587
+ const metaInput = {
588
+ selectorId: data?.selectorId,
589
+ lane: data?.lane,
590
+ producer: data?.producer,
591
+ fallbackReason: data?.fallbackReason,
592
+ readsDigest: data?.readsDigest,
593
+ equalsKind: data?.equalsKind,
594
+ changed: data?.changed
595
+ };
596
+ const metaProjection2 = projectJsonValue(metaInput);
597
+ options?.onMetaProjection?.({
598
+ stats: metaProjection2.stats,
599
+ downgrade: metaProjection2.downgrade
600
+ });
601
+ downgrade = mergeDowngrade(downgrade, metaProjection2.downgrade);
602
+ return withDowngrade({
603
+ ...base,
604
+ kind: "devtools",
605
+ label: event.type,
606
+ meta: metaProjection2.value
607
+ });
608
+ }
609
+ if (event.type === "trace:exec-vm") {
610
+ const data = event.data;
611
+ const metaInput = {
612
+ version: data?.version,
613
+ stage: data?.stage,
614
+ hit: data?.hit,
615
+ reason: data?.reason,
616
+ serviceId: data?.serviceId,
617
+ implId: data?.implId
618
+ };
619
+ const metaProjection2 = projectJsonValue(metaInput);
620
+ options?.onMetaProjection?.({
621
+ stats: metaProjection2.stats,
622
+ downgrade: metaProjection2.downgrade
623
+ });
624
+ downgrade = mergeDowngrade(downgrade, metaProjection2.downgrade);
625
+ return withDowngrade({
626
+ ...base,
627
+ kind: "devtools",
628
+ label: event.type,
629
+ meta: metaProjection2.value
630
+ });
631
+ }
632
+ if (event.type === "trace:trait:converge") {
633
+ const stripHeavyLight = (value) => {
634
+ if (!value || typeof value !== "object" || Array.isArray(value)) return value;
635
+ const anyValue = value;
636
+ const dirty = anyValue.dirty;
637
+ const dirtySlim = dirty && typeof dirty === "object" && !Array.isArray(dirty) ? {
638
+ dirtyAll: dirty.dirtyAll,
639
+ ...typeof dirty.reason === "string" ? { reason: dirty.reason } : null
640
+ } : void 0;
641
+ const { top3, dirtyRoots, ...rest } = anyValue;
642
+ return dirtySlim ? { ...rest, dirty: dirtySlim } : rest;
643
+ };
644
+ const stripHeavySampled = (value) => {
645
+ if (!value || typeof value !== "object" || Array.isArray(value)) return value;
646
+ const anyValue = value;
647
+ const dirty = anyValue.dirty;
648
+ const dirtySlim = dirty && typeof dirty === "object" && !Array.isArray(dirty) ? {
649
+ dirtyAll: dirty.dirtyAll,
650
+ ...typeof dirty.reason === "string" ? { reason: dirty.reason } : null
651
+ } : void 0;
652
+ const { dirtyRoots, ...rest } = anyValue;
653
+ return dirtySlim ? { ...rest, dirty: dirtySlim } : rest;
654
+ };
655
+ const data = event.data;
656
+ const metaInput = diagnosticsLevel2 === "light" ? stripHeavyLight(data) : diagnosticsLevel2 === "sampled" ? stripHeavySampled(data) : data;
657
+ const metaProjection2 = projectJsonValue(metaInput);
658
+ options?.onMetaProjection?.({
659
+ stats: metaProjection2.stats,
660
+ downgrade: metaProjection2.downgrade
661
+ });
662
+ downgrade = mergeDowngrade(downgrade, metaProjection2.downgrade);
663
+ return withDowngrade({
664
+ ...base,
665
+ kind: "trait:converge",
666
+ label: "trait:converge",
667
+ meta: metaProjection2.value
668
+ });
669
+ }
670
+ if (event.type === "trace:trait:check") {
671
+ const stripHeavy = (value) => {
672
+ if (!value || typeof value !== "object" || Array.isArray(value)) return value;
673
+ const anyValue = value;
674
+ const degraded = anyValue.degraded;
675
+ const degradedSlim = degraded && typeof degraded === "object" && !Array.isArray(degraded) ? { kind: degraded.kind } : void 0;
676
+ const { degraded: _degraded, ...rest } = anyValue;
677
+ return degradedSlim ? { ...rest, degraded: degradedSlim } : rest;
678
+ };
679
+ const data = event.data;
680
+ const metaInput = isLightLike ? stripHeavy(data) : data;
681
+ const metaProjection2 = projectJsonValue(metaInput);
682
+ options?.onMetaProjection?.({
683
+ stats: metaProjection2.stats,
684
+ downgrade: metaProjection2.downgrade
685
+ });
686
+ downgrade = mergeDowngrade(downgrade, metaProjection2.downgrade);
687
+ return withDowngrade({
688
+ ...base,
689
+ kind: "trait:check",
690
+ label: "trait:check",
691
+ meta: metaProjection2.value
692
+ });
693
+ }
694
+ if (event.type === "trace:trait:validate") {
695
+ const data = event.data;
696
+ const metaProjection2 = projectJsonValue(data);
697
+ options?.onMetaProjection?.({
698
+ stats: metaProjection2.stats,
699
+ downgrade: metaProjection2.downgrade
700
+ });
701
+ downgrade = mergeDowngrade(downgrade, metaProjection2.downgrade);
702
+ return withDowngrade({
703
+ ...base,
704
+ kind: "trait:validate",
705
+ label: "trait:validate",
706
+ meta: metaProjection2.value
707
+ });
708
+ }
709
+ if (event.type === "trace:module:traits") {
710
+ const data = event.data;
711
+ const metaInput = isLightLike ? {
712
+ digest: data?.digest,
713
+ count: data?.count
714
+ } : {
715
+ digest: data?.digest,
716
+ count: data?.count,
717
+ traits: data?.traits,
718
+ provenanceIndex: data?.provenanceIndex
719
+ };
720
+ const metaProjection2 = projectJsonValue(metaInput);
721
+ options?.onMetaProjection?.({
722
+ stats: metaProjection2.stats,
723
+ downgrade: metaProjection2.downgrade
724
+ });
725
+ downgrade = mergeDowngrade(downgrade, metaProjection2.downgrade);
726
+ return withDowngrade({
727
+ ...base,
728
+ kind: "devtools",
729
+ label: event.type,
730
+ meta: metaProjection2.value
731
+ });
732
+ }
733
+ if (event.type === "trace:module:traits:conflict") {
734
+ const data = event.data;
735
+ const metaInput = isLightLike ? {
736
+ conflictCount: data?.conflictCount,
737
+ traitIds: data?.traitIds
738
+ } : {
739
+ conflictCount: data?.conflictCount,
740
+ conflicts: data?.conflicts
741
+ };
742
+ const metaProjection2 = projectJsonValue(metaInput);
743
+ options?.onMetaProjection?.({
744
+ stats: metaProjection2.stats,
745
+ downgrade: metaProjection2.downgrade
746
+ });
747
+ downgrade = mergeDowngrade(downgrade, metaProjection2.downgrade);
748
+ return withDowngrade({
749
+ ...base,
750
+ kind: "devtools",
751
+ label: event.type,
752
+ meta: metaProjection2.value
753
+ });
754
+ }
755
+ if (event.type === "trace:module:descriptor") {
756
+ const data = event.data;
757
+ const metaInput = isLightLike ? {
758
+ id: data?.id,
759
+ traits: data?.traits,
760
+ source: data?.source
761
+ } : { data };
762
+ const metaProjection2 = projectJsonValue(metaInput);
763
+ options?.onMetaProjection?.({
764
+ stats: metaProjection2.stats,
765
+ downgrade: metaProjection2.downgrade
766
+ });
767
+ downgrade = mergeDowngrade(downgrade, metaProjection2.downgrade);
768
+ return withDowngrade({
769
+ ...base,
770
+ kind: "devtools",
771
+ label: event.type,
772
+ meta: metaProjection2.value
773
+ });
774
+ }
775
+ if (event.type === "trace:effectop") {
776
+ const data = event.data;
777
+ const opMeta = data?.meta;
778
+ const opKind = data?.kind ?? "service";
779
+ const label = typeof data?.name === "string" ? data.name : "effectop";
780
+ const moduleId2 = typeof opMeta?.moduleId === "string" ? opMeta.moduleId : moduleId;
781
+ const txnId2 = typeof opMeta?.txnId === "string" && opMeta.txnId.length > 0 ? opMeta.txnId : base.txnId;
782
+ const txnSeq2 = typeof opMeta?.txnSeq === "number" && Number.isFinite(opMeta.txnSeq) && opMeta.txnSeq >= 0 ? Math.floor(opMeta.txnSeq) : base.txnSeq;
783
+ const metaInput = isLightLike ? {
784
+ id: data?.id,
785
+ kind: data?.kind,
786
+ name: data?.name,
787
+ meta: opMeta
788
+ } : {
789
+ id: data?.id,
790
+ kind: data?.kind,
791
+ name: data?.name,
792
+ payload: data?.payload,
793
+ meta: opMeta
794
+ };
795
+ const metaProjection2 = projectJsonValue(metaInput);
796
+ options?.onMetaProjection?.({
797
+ stats: metaProjection2.stats,
798
+ downgrade: metaProjection2.downgrade
799
+ });
800
+ downgrade = mergeDowngrade(downgrade, metaProjection2.downgrade);
801
+ return withDowngrade({
802
+ ...base,
803
+ moduleId: moduleId2,
804
+ txnId: txnId2,
805
+ txnSeq: txnSeq2,
806
+ kind: opKind,
807
+ label,
808
+ meta: metaProjection2.value
809
+ });
810
+ }
811
+ const metaProjection = projectJsonValue(
812
+ isLightLike ? {
813
+ data: void 0
814
+ } : {
815
+ data: event.data
816
+ }
817
+ );
818
+ options?.onMetaProjection?.({
819
+ stats: metaProjection.stats,
820
+ downgrade: metaProjection.downgrade
821
+ });
822
+ downgrade = mergeDowngrade(downgrade, metaProjection.downgrade);
823
+ return withDowngrade({
824
+ ...base,
825
+ kind: "devtools",
826
+ label: event.type,
827
+ meta: metaProjection.value
828
+ });
829
+ }
830
+ }
831
+ };
832
+
833
+ export {
834
+ toSerializableErrorSummary,
835
+ currentDebugSinks,
836
+ currentRuntimeLabel,
837
+ currentTxnId,
838
+ currentDiagnosticsLevel,
839
+ diagnosticsLevel,
840
+ currentTraitConvergeDiagnosticsSampling,
841
+ traitConvergeDiagnosticsSampling,
842
+ appendSinks,
843
+ clearRuntimeDebugEventSeq,
844
+ noopLayer,
845
+ errorOnlyLayer,
846
+ browserConsoleLayer,
847
+ record,
848
+ toRuntimeDebugEventRef
849
+ };
850
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vbG9naXgtY29yZS9zcmMvaW50ZXJuYWwvcnVudGltZS9jb3JlL0RlYnVnU2luay50cyIsICIuLi8uLi8uLi8uLi9sb2dpeC1jb3JlL3NyYy9pbnRlcm5hbC9ydW50aW1lL2NvcmUvZXJyb3JTdW1tYXJ5LnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyJpbXBvcnQgeyBDYXVzZSwgRWZmZWN0LCBGaWJlclJlZiwgTGF5ZXIsIExvZ2dlciB9IGZyb20gJ2VmZmVjdCdcbmltcG9ydCB7XG4gIHByb2plY3RKc29uVmFsdWUsXG4gIHR5cGUgRG93bmdyYWRlUmVhc29uIGFzIEpzb25Eb3duZ3JhZGVSZWFzb24sXG4gIHR5cGUgSnNvblZhbHVlLFxuICB0eXBlIEpzb25WYWx1ZVByb2plY3Rpb25TdGF0cyxcbn0gZnJvbSAnLi4vLi4vb2JzZXJ2YWJpbGl0eS9qc29uVmFsdWUuanMnXG5pbXBvcnQgdHlwZSAqIGFzIFJlcGxheUxvZyBmcm9tICcuL1JlcGxheUxvZy5qcydcbmltcG9ydCB7XG4gIHRvU2VyaWFsaXphYmxlRXJyb3JTdW1tYXJ5LFxuICB0eXBlIERvd25ncmFkZVJlYXNvbiBhcyBFcnJvckRvd25ncmFkZVJlYXNvbixcbiAgdHlwZSBTZXJpYWxpemFibGVFcnJvclN1bW1hcnksXG59IGZyb20gJy4vZXJyb3JTdW1tYXJ5LmpzJ1xuaW1wb3J0ICogYXMgRWZmZWN0T3BDb3JlIGZyb20gJy4vRWZmZWN0T3BDb3JlLmpzJ1xuaW1wb3J0IHR5cGUgKiBhcyBQcm9jZXNzUHJvdG9jb2wgZnJvbSAnLi9wcm9jZXNzL3Byb3RvY29sLmpzJ1xuXG5leHBvcnQgaW50ZXJmYWNlIFRyaWdnZXJSZWYge1xuICByZWFkb25seSBraW5kOiBzdHJpbmdcbiAgcmVhZG9ubHkgbmFtZT86IHN0cmluZ1xuICByZWFkb25seSBkZXRhaWxzPzogdW5rbm93blxufVxuXG50eXBlIFRyYWNlRXZlbnRUeXBlID0gYHRyYWNlOiR7c3RyaW5nfWBcbnR5cGUgR2VuZXJpY1RyYWNlRXZlbnRUeXBlID0gRXhjbHVkZTxcbiAgVHJhY2VFdmVudFR5cGUsXG4gICd0cmFjZTp0cmFpdDpjb252ZXJnZScgfCAndHJhY2U6dHJhaXQ6Y2hlY2snIHwgJ3RyYWNlOnRyYWl0OnZhbGlkYXRlJ1xuPlxuXG4vKipcbiAqIFJlcGxheUV2ZW50UmVmXHVGRjFBXG4gKiAtIERlYnVnIFx1NEU4Qlx1NEVGNlx1NEZBN1x1NUYxNVx1NzUyOFx1NzY4NFx1MjAxQ1x1NTZERVx1NjUzRVx1NEU4Qlx1NEVGNlx1MjAxRFx1N0VEM1x1Njc4NFx1RkYxQlxuICogLSBcdTU3RkFcdTRFOEUgUmVwbGF5TG9nLkV2ZW50XHVGRjBDXHU1RTc2XHU4ODY1XHU5RjUwIHR4bi90cmlnZ2VyIFx1N0I0OVx1NTE3M1x1ODA1NFx1NUI1N1x1NkJCNVx1NEVFNVx1NEZCRlx1NEU4RVx1NTcyOCBEZXZ0b29scyBcdTRFMkRcdTUwNUFcdTgwNUFcdTU0MDhcdTRFMEVcdTg5RTNcdTkxQ0FcdTMwMDJcbiAqL1xuZXhwb3J0IHR5cGUgUmVwbGF5RXZlbnRSZWYgPSBSZXBsYXlMb2cuUmVwbGF5TG9nRXZlbnQgJiB7XG4gIHJlYWRvbmx5IHR4bklkPzogc3RyaW5nXG4gIHJlYWRvbmx5IHRyaWdnZXI/OiBUcmlnZ2VyUmVmXG59XG5cbmV4cG9ydCB0eXBlIEV2ZW50ID1cbiAgfCB7XG4gICAgICByZWFkb25seSB0eXBlOiAnbW9kdWxlOmluaXQnXG4gICAgICByZWFkb25seSBtb2R1bGVJZD86IHN0cmluZ1xuICAgICAgcmVhZG9ubHkgaW5zdGFuY2VJZD86IHN0cmluZ1xuICAgICAgcmVhZG9ubHkgcnVudGltZUxhYmVsPzogc3RyaW5nXG4gICAgICByZWFkb25seSB0aW1lc3RhbXA/OiBudW1iZXJcbiAgICB9XG4gIHwge1xuICAgICAgcmVhZG9ubHkgdHlwZTogJ21vZHVsZTpkZXN0cm95J1xuICAgICAgcmVhZG9ubHkgbW9kdWxlSWQ/OiBzdHJpbmdcbiAgICAgIHJlYWRvbmx5IGluc3RhbmNlSWQ/OiBzdHJpbmdcbiAgICAgIHJlYWRvbmx5IHJ1bnRpbWVMYWJlbD86IHN0cmluZ1xuICAgICAgcmVhZG9ubHkgdGltZXN0YW1wPzogbnVtYmVyXG4gICAgfVxuICB8IHtcbiAgICAgIHJlYWRvbmx5IHR5cGU6ICdsaWZlY3ljbGU6cGhhc2UnXG4gICAgICByZWFkb25seSBtb2R1bGVJZD86IHN0cmluZ1xuICAgICAgcmVhZG9ubHkgaW5zdGFuY2VJZD86IHN0cmluZ1xuICAgICAgcmVhZG9ubHkgcGhhc2U6ICdpbml0JyB8ICdydW4nIHwgJ2Rlc3Ryb3knIHwgJ3BsYXRmb3JtJ1xuICAgICAgcmVhZG9ubHkgbmFtZTogc3RyaW5nXG4gICAgICByZWFkb25seSBwYXlsb2FkPzogdW5rbm93blxuICAgICAgcmVhZG9ubHkgcnVudGltZUxhYmVsPzogc3RyaW5nXG4gICAgICByZWFkb25seSB0aW1lc3RhbXA/OiBudW1iZXJcbiAgICB9XG4gIHwge1xuICAgICAgcmVhZG9ubHkgdHlwZTogJ2FjdGlvbjpkaXNwYXRjaCdcbiAgICAgIHJlYWRvbmx5IG1vZHVsZUlkPzogc3RyaW5nXG4gICAgICByZWFkb25seSBpbnN0YW5jZUlkPzogc3RyaW5nXG4gICAgICByZWFkb25seSBhY3Rpb246IHVua25vd25cbiAgICAgIHJlYWRvbmx5IHR4blNlcT86IG51bWJlclxuICAgICAgcmVhZG9ubHkgdHhuSWQ/OiBzdHJpbmdcbiAgICAgIHJlYWRvbmx5IHJ1bnRpbWVMYWJlbD86IHN0cmluZ1xuICAgICAgcmVhZG9ubHkgdGltZXN0YW1wPzogbnVtYmVyXG4gICAgfVxuICB8IHtcbiAgICAgIHJlYWRvbmx5IHR5cGU6ICdzdGF0ZTp1cGRhdGUnXG4gICAgICByZWFkb25seSBtb2R1bGVJZD86IHN0cmluZ1xuICAgICAgcmVhZG9ubHkgaW5zdGFuY2VJZD86IHN0cmluZ1xuICAgICAgcmVhZG9ubHkgc3RhdGU6IHVua25vd25cbiAgICAgIHJlYWRvbmx5IHR4blNlcT86IG51bWJlclxuICAgICAgcmVhZG9ubHkgdHhuSWQ/OiBzdHJpbmdcbiAgICAgIC8qKlxuICAgICAgICogXHU1M0VGXHU5MDA5XHVGRjFBXHU2NzJDXHU2QjIxXHU2M0QwXHU0RUE0XHU4MDVBXHU1NDA4XHU3Njg0XHU1RjcxXHU1NENEXHU1N0RGXHVGRjA4XHU1QjU3XHU2QkI1XHU3RUE3IGRpcnR5LXNldFx1RkYwOVx1MzAwMlxuICAgICAgICogLSBcdTc1MzEgUnVudGltZSBcdTU3MjggY29tbWl0IFx1NzBCOVx1NTg2Qlx1NTE0NVx1RkYxQlxuICAgICAgICogLSBcdTVGQzVcdTk4N0JcdTRGRERcdTYzMDEgU2xpbSBcdTRFMTRcdTUzRUZcdTVFOEZcdTUyMTdcdTUzMTZcdUZGMUJcbiAgICAgICAqIC0gXHU1M0VGXHU4OEFCIERldnRvb2xzIFx1NzUyOFx1NEU4RSBleHBsYWluIFx1MjAxQ1x1NEUzQVx1NEY1NVx1ODlFNlx1NTNEMSBjb252ZXJnZS92YWxpZGF0ZS9cdTRFM0FcdTRGNTVcdTkwMDBcdTUzMTYgZnVsbFx1MjAxRFx1MzAwMlxuICAgICAgICovXG4gICAgICByZWFkb25seSBkaXJ0eVNldD86IHVua25vd25cbiAgICAgIC8qKlxuICAgICAgICogXHU1M0VGXHU5MDA5XHVGRjFBXHU2NzJDXHU2QjIxXHU2M0QwXHU0RUE0XHU4MDVBXHU1NDA4XHU3Njg0IFBhdGNoIFx1NjU3MFx1OTFDRlx1RkYwOFx1Njc2NVx1ODFFQSBTdGF0ZVRyYW5zYWN0aW9uXHVGRjA5XHVGRjFCXG4gICAgICAgKiAtIFx1NEVDNVx1NTcyOFx1NEU4Qlx1NTJBMVx1OERFRlx1NUY4NFx1NEUwQlx1NzUzMSBSdW50aW1lIFx1NTg2Qlx1NTE0NVx1RkYxQlxuICAgICAgICogLSBEZXZ0b29scyBcdTUzRUZcdTc1MjhcdTRGNUNcdTRFOEJcdTUyQTFcdTY5ODJcdTg5ODFcdTRGRTFcdTYwNkZcdTc2ODRcdThGN0JcdTkxQ0ZcdTYzMDdcdTY4MDdcdTMwMDJcbiAgICAgICAqL1xuICAgICAgcmVhZG9ubHkgcGF0Y2hDb3VudD86IG51bWJlclxuICAgICAgLyoqXG4gICAgICAgKiBcdTUzRUZcdTkwMDlcdUZGMUFcdTYzRDBcdTRFQTRcdTZBMjFcdTVGMEZcdUZGMDhcdTY2NkVcdTkwMUEvXHU2Mjc5XHU1OTA0XHU3NDA2L1x1NEY0RVx1NEYxOFx1NTE0OFx1N0VBN1x1N0I0OVx1RkYwOVx1MzAwMlxuICAgICAgICogLSBcdTc1MzEgUnVudGltZSBcdTU4NkJcdTUxNDVcdUZGMUJcbiAgICAgICAqIC0gXHU5RUQ4XHU4QkE0XHU1MDNDXHU3NTMxXHU4QzAzXHU3NTI4XHU2NUI5XHU1MUIzXHU1QjlBXHVGRjA4XHU5MDFBXHU1RTM4XHU0RTNBIFwibm9ybWFsXCJcdUZGMDlcdTMwMDJcbiAgICAgICAqL1xuICAgICAgcmVhZG9ubHkgY29tbWl0TW9kZT86IHN0cmluZ1xuICAgICAgLyoqXG4gICAgICAgKiBcdTUzRUZcdTkwMDlcdUZGMUFcdTVCRjlcdTU5MTZcdTUzRUZcdTg5QzFcdTYwMjdcdTRGMThcdTUxNDhcdTdFQTdcdUZGMDhub3JtYWwvbG93XHVGRjA5XHUzMDAyXG4gICAgICAgKiAtIFx1NzUzMSBSdW50aW1lIFx1NTg2Qlx1NTE0NVx1RkYxQlxuICAgICAgICogLSBcdTRFM0JcdTg5ODFcdTc1MjhcdTRFOEUgUmVhY3QgXHU1OTE2XHU5MEU4XHU4QkEyXHU5NjA1XHU4QzAzXHU1RUE2XHVGRjA4XHU5MDdGXHU1MTREXHU5NzVFXHU1RkM1XHU4OTgxIHJlbmRlclx1RkYwOVx1MzAwMlxuICAgICAgICovXG4gICAgICByZWFkb25seSBwcmlvcml0eT86IHN0cmluZ1xuICAgICAgLyoqXG4gICAgICAgKiBcdTUzRUZcdTkwMDlcdUZGMUFcdTg5RTZcdTUzRDFcdTY3MkNcdTZCMjFcdTcyQjZcdTYwMDFcdTYzRDBcdTRFQTRcdTc2ODRcdTRFOEJcdTUyQTFcdTY3NjVcdTZFOTBcdTc5Q0RcdTdDN0JcdUZGMDhvcmlnaW4ua2luZFx1RkYwOVx1RkYxQVxuICAgICAgICogLSBcdTRGOEJcdTU5ODIgXCJhY3Rpb25cIiAvIFwic291cmNlLXJlZnJlc2hcIiAvIFwic2VydmljZS1jYWxsYmFja1wiIC8gXCJkZXZ0b29sc1wiXHVGRjFCXG4gICAgICAgKiAtIFx1NEVDNVx1NTcyOFx1NTdGQVx1NEU4RSBTdGF0ZVRyYW5zYWN0aW9uIFx1NzY4NFx1OERFRlx1NUY4NFx1NEUwQlx1NzUzMSBSdW50aW1lIFx1NTg2Qlx1NTE0NVx1RkYxQlxuICAgICAgICogLSBEZXZ0b29scyBcdTUzRUZcdTYzNkVcdTZCNjRcdTUzM0FcdTUyMDZcdTRFMUFcdTUyQTFcdTRFOEJcdTUyQTFcdTRFMEUgRGV2dG9vbHMgdGltZS10cmF2ZWwgXHU2NENEXHU0RjVDXHUzMDAyXG4gICAgICAgKi9cbiAgICAgIHJlYWRvbmx5IG9yaWdpbktpbmQ/OiBzdHJpbmdcbiAgICAgIC8qKlxuICAgICAgICogXHU1M0VGXHU5MDA5XHVGRjFBXHU4OUU2XHU1M0QxXHU2NzJDXHU2QjIxXHU3MkI2XHU2MDAxXHU2M0QwXHU0RUE0XHU3Njg0XHU0RThCXHU1MkExXHU2NzY1XHU2RTkwXHU1NDBEXHU3OUYwXHVGRjA4b3JpZ2luLm5hbWVcdUZGMDlcdUZGMUFcbiAgICAgICAqIC0gXHU0RjhCXHU1OTgyIGFjdGlvbiBkaXNwYXRjaCAvIGZpZWxkUGF0aCAvIHRhc2s6c3VjY2Vzcy90YXNrOmZhaWx1cmUgXHU3QjQ5XHVGRjFCXG4gICAgICAgKiAtIFx1NEVDNVx1NTcyOFx1NTdGQVx1NEU4RSBTdGF0ZVRyYW5zYWN0aW9uIFx1NzY4NFx1OERFRlx1NUY4NFx1NEUwQlx1NzUzMSBSdW50aW1lIFx1NTg2Qlx1NTE0NVx1MzAwMlxuICAgICAgICovXG4gICAgICByZWFkb25seSBvcmlnaW5OYW1lPzogc3RyaW5nXG4gICAgICAvKipcbiAgICAgICAqIFx1OTg4NFx1NzU1OVx1RkYxQVRyYWl0IFx1NjUzNlx1NjU1Qlx1NjQ1OFx1ODk4MVx1RkYwOFx1NzUyOFx1NEU4RSBEZXZ0b29scyBcdTVDNTVcdTc5M0FcdTdBOTdcdTUzRTNcdTdFQTdcdTdFREZcdThCQTEvVG9wTiBcdTYyMTBcdTY3MkMvXHU5NjREXHU3RUE3XHU1MzlGXHU1NkUwXHU3QjQ5XHVGRjA5XHUzMDAyXG4gICAgICAgKiAtIFBoYXNlIDJcdUZGMUFcdTRFQzVcdTU2RkFcdTUzMTZcdTVCNTdcdTZCQjVcdTRGNERcdUZGMENcdTRFMERcdTk1MDFcdTZCN0JcdTdFRDNcdTY3ODRcdUZGMUJcbiAgICAgICAqIC0gXHU1NDBFXHU3RUVEIFBoYXNlIFx1NEYxQVx1NEUwRSBUcmFpdC9SZXBsYXkgXHU0RThCXHU0RUY2XHU2QTIxXHU1NzhCXHU1QkY5XHU5RjUwXHU0RTNBXHU1M0VGXHU4OUUzXHU5MUNBXHU3RUQzXHU2Nzg0XHUzMDAyXG4gICAgICAgKi9cbiAgICAgIHJlYWRvbmx5IHRyYWl0U3VtbWFyeT86IHVua25vd25cbiAgICAgIC8qKlxuICAgICAgICogXHU5ODg0XHU3NTU5XHVGRjFBXHU2NzJDXHU2QjIxXHU0RThCXHU1MkExXHU1MTczXHU4MDU0XHU3Njg0XHU1NkRFXHU2NTNFXHU0RThCXHU0RUY2XHVGRjA4UmVwbGF5TG9nIFx1NEZBN1x1NzY4NCByZS1lbWl0IFx1NEU4Qlx1NUI5RVx1NkU5MFx1RkYwOVx1MzAwMlxuICAgICAgICogLSBQaGFzZSAyXHVGRjFBXHU0RUM1XHU1NkZBXHU1MzE2XHU1QjU3XHU2QkI1XHU0RjREXHVGRjFCXG4gICAgICAgKiAtIFx1NTQwRVx1N0VFRCBQaGFzZSBcdTRGMUFcdTRFMEUgUmVwbGF5TG9nLkV2ZW50IFx1N0VEM1x1Njc4NFx1NUJGOVx1OUY1MFx1MzAwMlxuICAgICAgICovXG4gICAgICByZWFkb25seSByZXBsYXlFdmVudD86IFJlcGxheUV2ZW50UmVmXG4gICAgICByZWFkb25seSBydW50aW1lTGFiZWw/OiBzdHJpbmdcbiAgICAgIHJlYWRvbmx5IHRpbWVzdGFtcD86IG51bWJlclxuICAgIH1cbiAgfCB7XG4gICAgICByZWFkb25seSB0eXBlOlxuICAgICAgICB8ICdwcm9jZXNzOnN0YXJ0J1xuICAgICAgICB8ICdwcm9jZXNzOnN0b3AnXG4gICAgICAgIHwgJ3Byb2Nlc3M6cmVzdGFydCdcbiAgICAgICAgfCAncHJvY2Vzczp0cmlnZ2VyJ1xuICAgICAgICB8ICdwcm9jZXNzOmRpc3BhdGNoJ1xuICAgICAgICB8ICdwcm9jZXNzOmVycm9yJ1xuICAgICAgcmVhZG9ubHkgbW9kdWxlSWQ/OiBzdHJpbmdcbiAgICAgIHJlYWRvbmx5IGluc3RhbmNlSWQ/OiBzdHJpbmdcbiAgICAgIHJlYWRvbmx5IGlkZW50aXR5OiBQcm9jZXNzUHJvdG9jb2wuUHJvY2Vzc0luc3RhbmNlSWRlbnRpdHlcbiAgICAgIHJlYWRvbmx5IHNldmVyaXR5OiAnaW5mbycgfCAnd2FybmluZycgfCAnZXJyb3InXG4gICAgICByZWFkb25seSBldmVudFNlcTogbnVtYmVyXG4gICAgICByZWFkb25seSB0aW1lc3RhbXBNczogbnVtYmVyXG4gICAgICByZWFkb25seSB0cmlnZ2VyPzogUHJvY2Vzc1Byb3RvY29sLlByb2Nlc3NUcmlnZ2VyXG4gICAgICByZWFkb25seSBkaXNwYXRjaD86IHtcbiAgICAgICAgcmVhZG9ubHkgbW9kdWxlSWQ6IHN0cmluZ1xuICAgICAgICByZWFkb25seSBpbnN0YW5jZUlkOiBzdHJpbmdcbiAgICAgICAgcmVhZG9ubHkgYWN0aW9uSWQ6IHN0cmluZ1xuICAgICAgfVxuICAgICAgcmVhZG9ubHkgZXJyb3I/OiBQcm9jZXNzUHJvdG9jb2wuU2VyaWFsaXphYmxlRXJyb3JTdW1tYXJ5XG4gICAgICByZWFkb25seSB0eG5TZXE/OiBudW1iZXJcbiAgICAgIHJlYWRvbmx5IHR4bklkPzogc3RyaW5nXG4gICAgICByZWFkb25seSBydW50aW1lTGFiZWw/OiBzdHJpbmdcbiAgICAgIHJlYWRvbmx5IHRpbWVzdGFtcD86IG51bWJlclxuICAgIH1cbiAgfCB7XG4gICAgICByZWFkb25seSB0eXBlOiAnbGlmZWN5Y2xlOmVycm9yJ1xuICAgICAgcmVhZG9ubHkgbW9kdWxlSWQ/OiBzdHJpbmdcbiAgICAgIHJlYWRvbmx5IGluc3RhbmNlSWQ/OiBzdHJpbmdcbiAgICAgIHJlYWRvbmx5IGNhdXNlOiB1bmtub3duXG4gICAgICByZWFkb25seSBwaGFzZT86ICdpbml0JyB8ICdydW4nIHwgJ2Rlc3Ryb3knIHwgJ3BsYXRmb3JtJ1xuICAgICAgcmVhZG9ubHkgaG9vaz86ICdpbml0UmVxdWlyZWQnIHwgJ3N0YXJ0JyB8ICdkZXN0cm95JyB8ICdzdXNwZW5kJyB8ICdyZXN1bWUnIHwgJ3Jlc2V0JyB8ICd1bmtub3duJ1xuICAgICAgcmVhZG9ubHkgdGFza0lkPzogc3RyaW5nXG4gICAgICByZWFkb25seSBvcFNlcT86IG51bWJlclxuICAgICAgcmVhZG9ubHkgb3JpZ2luPzogc3RyaW5nXG4gICAgICByZWFkb25seSB0eG5TZXE/OiBudW1iZXJcbiAgICAgIHJlYWRvbmx5IHJ1bnRpbWVMYWJlbD86IHN0cmluZ1xuICAgICAgcmVhZG9ubHkgdGltZXN0YW1wPzogbnVtYmVyXG4gICAgfVxuICB8IHtcbiAgICAgIHJlYWRvbmx5IHR5cGU6ICdkaWFnbm9zdGljJ1xuICAgICAgcmVhZG9ubHkgbW9kdWxlSWQ/OiBzdHJpbmdcbiAgICAgIHJlYWRvbmx5IGluc3RhbmNlSWQ/OiBzdHJpbmdcbiAgICAgIHJlYWRvbmx5IGNvZGU6IHN0cmluZ1xuICAgICAgcmVhZG9ubHkgc2V2ZXJpdHk6ICdlcnJvcicgfCAnd2FybmluZycgfCAnaW5mbydcbiAgICAgIHJlYWRvbmx5IG1lc3NhZ2U6IHN0cmluZ1xuICAgICAgcmVhZG9ubHkgaGludD86IHN0cmluZ1xuICAgICAgcmVhZG9ubHkgYWN0aW9uVGFnPzogc3RyaW5nXG4gICAgICByZWFkb25seSBraW5kPzogc3RyaW5nXG4gICAgICByZWFkb25seSB0eG5TZXE/OiBudW1iZXJcbiAgICAgIHJlYWRvbmx5IHR4bklkPzogc3RyaW5nXG4gICAgICByZWFkb25seSB0cmlnZ2VyPzogVHJpZ2dlclJlZlxuICAgICAgcmVhZG9ubHkgcnVudGltZUxhYmVsPzogc3RyaW5nXG4gICAgICByZWFkb25seSB0aW1lc3RhbXA/OiBudW1iZXJcbiAgICB9XG4gIC8qKlxuICAgKiB0cmFjZToqIFx1NEU4Qlx1NEVGNlx1RkYxQVxuICAgKiAtIFx1NEY1Q1x1NEUzQVx1OEZEMFx1ODg0Q1x1NjVGNiB0cmFjZSAvIFBsYXlncm91bmQgLyBBbGlnbm1lbnQgTGFiIFx1NzY4NFx1NjI2OVx1NUM1NVx1OTRBOVx1NUI1MFx1RkYxQlxuICAgKiAtIFx1NUY1M1x1NTI0RFx1NTNFQVx1N0VBNlx1NUI5QSB0eXBlIFx1NTI0RFx1N0YwMFx1NEUwRSBtb2R1bGVJZFx1RkYwQ1x1NTE3N1x1NEY1MyBwYXlsb2FkIFx1N0VEM1x1Njc4NFx1NzUzMVx1NEUwQVx1NUM0Mlx1N0VBNlx1NUI5QVx1RkYwOFx1NEY4Qlx1NTk4MiBkYXRhIFx1NTE4NVx1NjMwMiBzcGFuSWQvYXR0cmlidXRlcyBcdTdCNDlcdUZGMDlcdTMwMDJcbiAgICovXG4gIHwge1xuICAgICAgcmVhZG9ubHkgdHlwZTogJ3RyYWNlOnRyYWl0OmNvbnZlcmdlJ1xuICAgICAgcmVhZG9ubHkgbW9kdWxlSWQ/OiBzdHJpbmdcbiAgICAgIHJlYWRvbmx5IGluc3RhbmNlSWQ/OiBzdHJpbmdcbiAgICAgIHJlYWRvbmx5IGRhdGE6IEpzb25WYWx1ZVxuICAgICAgcmVhZG9ubHkgdHhuU2VxPzogbnVtYmVyXG4gICAgICByZWFkb25seSB0eG5JZD86IHN0cmluZ1xuICAgICAgcmVhZG9ubHkgcnVudGltZUxhYmVsPzogc3RyaW5nXG4gICAgICByZWFkb25seSB0aW1lc3RhbXA/OiBudW1iZXJcbiAgICB9XG4gIHwge1xuICAgICAgcmVhZG9ubHkgdHlwZTogJ3RyYWNlOnRyYWl0OmNoZWNrJ1xuICAgICAgcmVhZG9ubHkgbW9kdWxlSWQ/OiBzdHJpbmdcbiAgICAgIHJlYWRvbmx5IGluc3RhbmNlSWQ/OiBzdHJpbmdcbiAgICAgIHJlYWRvbmx5IGRhdGE6IEpzb25WYWx1ZVxuICAgICAgcmVhZG9ubHkgdHhuU2VxPzogbnVtYmVyXG4gICAgICByZWFkb25seSB0eG5JZD86IHN0cmluZ1xuICAgICAgcmVhZG9ubHkgcnVudGltZUxhYmVsPzogc3RyaW5nXG4gICAgICByZWFkb25seSB0aW1lc3RhbXA/OiBudW1iZXJcbiAgICB9XG4gIHwge1xuICAgICAgcmVhZG9ubHkgdHlwZTogJ3RyYWNlOnRyYWl0OnZhbGlkYXRlJ1xuICAgICAgcmVhZG9ubHkgbW9kdWxlSWQ/OiBzdHJpbmdcbiAgICAgIHJlYWRvbmx5IGluc3RhbmNlSWQ/OiBzdHJpbmdcbiAgICAgIHJlYWRvbmx5IGRhdGE6IEpzb25WYWx1ZVxuICAgICAgcmVhZG9ubHkgdHhuU2VxPzogbnVtYmVyXG4gICAgICByZWFkb25seSB0eG5JZD86IHN0cmluZ1xuICAgICAgcmVhZG9ubHkgcnVudGltZUxhYmVsPzogc3RyaW5nXG4gICAgICByZWFkb25seSB0aW1lc3RhbXA/OiBudW1iZXJcbiAgICB9XG4gIHwge1xuICAgICAgcmVhZG9ubHkgdHlwZTogR2VuZXJpY1RyYWNlRXZlbnRUeXBlXG4gICAgICByZWFkb25seSBtb2R1bGVJZD86IHN0cmluZ1xuICAgICAgcmVhZG9ubHkgaW5zdGFuY2VJZD86IHN0cmluZ1xuICAgICAgcmVhZG9ubHkgZGF0YT86IHVua25vd25cbiAgICAgIHJlYWRvbmx5IHR4blNlcT86IG51bWJlclxuICAgICAgcmVhZG9ubHkgcnVudGltZUxhYmVsPzogc3RyaW5nXG4gICAgICByZWFkb25seSB0aW1lc3RhbXA/OiBudW1iZXJcbiAgICB9XG5cbmV4cG9ydCBpbnRlcmZhY2UgU2luayB7XG4gIHJlYWRvbmx5IHJlY29yZDogKGV2ZW50OiBFdmVudCkgPT4gRWZmZWN0LkVmZmVjdDx2b2lkPlxufVxuZXhwb3J0IGNvbnN0IGN1cnJlbnREZWJ1Z1NpbmtzID0gRmliZXJSZWYudW5zYWZlTWFrZTxSZWFkb25seUFycmF5PFNpbms+PihbXSlcbmV4cG9ydCBjb25zdCBjdXJyZW50UnVudGltZUxhYmVsID0gRmliZXJSZWYudW5zYWZlTWFrZTxzdHJpbmcgfCB1bmRlZmluZWQ+KHVuZGVmaW5lZClcbmV4cG9ydCBjb25zdCBjdXJyZW50VHhuSWQgPSBGaWJlclJlZi51bnNhZmVNYWtlPHN0cmluZyB8IHVuZGVmaW5lZD4odW5kZWZpbmVkKVxuZXhwb3J0IHR5cGUgRGlhZ25vc3RpY3NMZXZlbCA9ICdvZmYnIHwgJ2xpZ2h0JyB8ICdzYW1wbGVkJyB8ICdmdWxsJ1xuZXhwb3J0IGNvbnN0IGN1cnJlbnREaWFnbm9zdGljc0xldmVsID0gRmliZXJSZWYudW5zYWZlTWFrZTxEaWFnbm9zdGljc0xldmVsPignb2ZmJylcblxuZXhwb3J0IGNvbnN0IGRpYWdub3N0aWNzTGV2ZWwgPSAobGV2ZWw6IERpYWdub3N0aWNzTGV2ZWwpOiBMYXllci5MYXllcjxhbnksIG5ldmVyLCBuZXZlcj4gPT5cbiAgTGF5ZXIuZmliZXJSZWZMb2NhbGx5U2NvcGVkV2l0aChjdXJyZW50RGlhZ25vc3RpY3NMZXZlbCBhcyBhbnksICgpID0+IGxldmVsKSBhcyBMYXllci5MYXllcjxhbnksIG5ldmVyLCBuZXZlcj5cblxuZXhwb3J0IGludGVyZmFjZSBUcmFpdENvbnZlcmdlRGlhZ25vc3RpY3NTYW1wbGluZ0NvbmZpZyB7XG4gIC8qKlxuICAgKiBcdTZCQ0ZcdTk2OTQgTiBcdTRFMkEgdHhuIFx1OTFDN1x1NjgzN1x1NEUwMFx1NkIyMVx1RkYwOFx1Nzg2RVx1NUI5QVx1NjAyN1x1RkYwQ1x1NTdGQVx1NEU4RVx1N0EzM1x1NUI5QSB0eG5TZXFcdUZGMDlcdTMwMDJcbiAgICogLSAxXHVGRjFBXHU2QkNGXHU2QjIxXHU5MEZEXHU5MUM3XHU2ODM3XHVGRjA4XHU3QjQ5XHU0RUY3IGZ1bGwgXHU3Njg0XHU4QkExXHU2NUY2XHU3QzkyXHU1RUE2XHVGRjBDXHU0RjQ2IHBheWxvYWQgXHU0RUNEXHU0RkREXHU2MzAxIHNsaW1cdUZGMDlcbiAgICovXG4gIHJlYWRvbmx5IHNhbXBsZUV2ZXJ5TjogbnVtYmVyXG4gIC8qKlxuICAgKiBcdThGOTNcdTUxRkFcdTc2ODQgVG9wSyBob3RzcG90cyBcdTY1NzBcdTkxQ0ZcdTRFMEFcdTk2NTBcdUZGMDhcdTVFRkFcdThCQUUgXHUyMjY0M1x1RkYwOVx1MzAwMlxuICAgKi9cbiAgcmVhZG9ubHkgdG9wSzogbnVtYmVyXG59XG5cbmV4cG9ydCBjb25zdCBjdXJyZW50VHJhaXRDb252ZXJnZURpYWdub3N0aWNzU2FtcGxpbmcgPSBGaWJlclJlZi51bnNhZmVNYWtlPFRyYWl0Q29udmVyZ2VEaWFnbm9zdGljc1NhbXBsaW5nQ29uZmlnPih7XG4gIHNhbXBsZUV2ZXJ5TjogMzIsXG4gIHRvcEs6IDMsXG59KVxuXG5leHBvcnQgY29uc3QgdHJhaXRDb252ZXJnZURpYWdub3N0aWNzU2FtcGxpbmcgPSAoXG4gIGNvbmZpZzogVHJhaXRDb252ZXJnZURpYWdub3N0aWNzU2FtcGxpbmdDb25maWcsXG4pOiBMYXllci5MYXllcjxhbnksIG5ldmVyLCBuZXZlcj4gPT5cbiAgTGF5ZXIuZmliZXJSZWZMb2NhbGx5U2NvcGVkV2l0aChjdXJyZW50VHJhaXRDb252ZXJnZURpYWdub3N0aWNzU2FtcGxpbmcgYXMgYW55LCAoKSA9PiBjb25maWcpIGFzIExheWVyLkxheWVyPFxuICAgIGFueSxcbiAgICBuZXZlcixcbiAgICBuZXZlclxuICA+XG5cbmV4cG9ydCBjb25zdCBhcHBlbmRTaW5rcyA9IChzaW5rczogUmVhZG9ubHlBcnJheTxTaW5rPik6IExheWVyLkxheWVyPGFueSwgbmV2ZXIsIG5ldmVyPiA9PlxuICBMYXllci5maWJlclJlZkxvY2FsbHlTY29wZWRXaXRoKGN1cnJlbnREZWJ1Z1NpbmtzLCAoY3VycmVudCkgPT4gWy4uLmN1cnJlbnQsIC4uLnNpbmtzXSkgYXMgTGF5ZXIuTGF5ZXI8XG4gICAgYW55LFxuICAgIG5ldmVyLFxuICAgIG5ldmVyXG4gID5cblxuZXhwb3J0IHR5cGUgUnVudGltZURlYnVnRXZlbnRLaW5kID1cbiAgfCAnYWN0aW9uJ1xuICB8ICdzdGF0ZSdcbiAgfCAnc2VydmljZSdcbiAgfCAncHJvY2VzcydcbiAgfCAndHJhaXQtY29tcHV0ZWQnXG4gIHwgJ3RyYWl0LWxpbmsnXG4gIHwgJ3RyYWl0LXNvdXJjZSdcbiAgfCAnbGlmZWN5Y2xlJ1xuICB8ICdyZWFjdC1yZW5kZXInXG4gIHwgJ2RldnRvb2xzJ1xuICB8ICdkaWFnbm9zdGljJ1xuICB8IChzdHJpbmcgJiB7fSlcblxuZXhwb3J0IGludGVyZmFjZSBSdW50aW1lRGVidWdFdmVudFJlZiB7XG4gIHJlYWRvbmx5IGV2ZW50SWQ6IHN0cmluZ1xuICByZWFkb25seSBldmVudFNlcTogbnVtYmVyXG4gIHJlYWRvbmx5IG1vZHVsZUlkOiBzdHJpbmdcbiAgcmVhZG9ubHkgaW5zdGFuY2VJZDogc3RyaW5nXG4gIHJlYWRvbmx5IHJ1bnRpbWVMYWJlbD86IHN0cmluZ1xuICByZWFkb25seSB0eG5TZXE6IG51bWJlclxuICByZWFkb25seSB0eG5JZD86IHN0cmluZ1xuICAvKipcbiAgICogbGlua0lkXHVGRjFBXG4gICAqIC0gXHU1RjUzXHU1MjREXHU2NENEXHU0RjVDXHU5NEZFXHU4REVGIGlkXHVGRjA4XHU1NDBDXHU0RTAwXHU5NEZFXHU4REVGXHU0RTBCXHU3Njg0XHU4RkI5XHU3NTRDXHU2NENEXHU0RjVDXHU1MTcxXHU0RUFCXHVGRjA5XHVGRjFCXG4gICAqIC0gXHU3NTMxIFJ1bnRpbWUgXHU1NzI4XHU4RkI5XHU3NTRDXHU4RDc3XHU3MEI5XHU1MjFCXHU1RUZBXHVGRjBDXHU1RTc2XHU5MDFBXHU4RkM3IEZpYmVyUmVmIFx1NTcyOFx1NUQ0Q1x1NTk1Ny9cdThERThcdTZBMjFcdTU3NTdcdTk0RkVcdThERUZcdTRFMkRcdTRGMjBcdTkwMTJcdTMwMDJcbiAgICovXG4gIHJlYWRvbmx5IGxpbmtJZD86IHN0cmluZ1xuICByZWFkb25seSB0aW1lc3RhbXA6IG51bWJlclxuICByZWFkb25seSBraW5kOiBSdW50aW1lRGVidWdFdmVudEtpbmRcbiAgcmVhZG9ubHkgbGFiZWw6IHN0cmluZ1xuICByZWFkb25seSBtZXRhPzogSnNvblZhbHVlXG4gIHJlYWRvbmx5IGVycm9yU3VtbWFyeT86IFNlcmlhbGl6YWJsZUVycm9yU3VtbWFyeVxuICByZWFkb25seSBkb3duZ3JhZGU/OiB7XG4gICAgcmVhZG9ubHkgcmVhc29uPzogJ25vbl9zZXJpYWxpemFibGUnIHwgJ292ZXJzaXplZCcgfCAndW5rbm93bidcbiAgfVxufVxuXG5sZXQgbmV4dEdsb2JhbEV2ZW50U2VxID0gMFxuXG5leHBvcnQgY29uc3QgY2xlYXJSdW50aW1lRGVidWdFdmVudFNlcSA9ICgpOiB2b2lkID0+IHtcbiAgbmV4dEdsb2JhbEV2ZW50U2VxID0gMFxufVxuXG5jb25zdCBuZXh0RXZlbnRTZXEgPSAoKTogbnVtYmVyID0+IHtcbiAgbmV4dEdsb2JhbEV2ZW50U2VxICs9IDFcbiAgcmV0dXJuIG5leHRHbG9iYWxFdmVudFNlcVxufVxuXG5jb25zdCBtYWtlRXZlbnRJZCA9IChpbnN0YW5jZUlkOiBzdHJpbmcsIGV2ZW50U2VxOiBudW1iZXIpOiBzdHJpbmcgPT4gYCR7aW5zdGFuY2VJZH06OmUke2V2ZW50U2VxfWBcblxudHlwZSBEb3duZ3JhZGVSZWFzb24gPSBKc29uRG93bmdyYWRlUmVhc29uIHwgRXJyb3JEb3duZ3JhZGVSZWFzb25cblxuY29uc3QgbWVyZ2VEb3duZ3JhZGUgPSAoXG4gIGN1cnJlbnQ6IERvd25ncmFkZVJlYXNvbiB8IHVuZGVmaW5lZCxcbiAgbmV4dDogRG93bmdyYWRlUmVhc29uIHwgdW5kZWZpbmVkLFxuKTogRG93bmdyYWRlUmVhc29uIHwgdW5kZWZpbmVkID0+IHtcbiAgaWYgKCFjdXJyZW50KSByZXR1cm4gbmV4dFxuICBpZiAoIW5leHQpIHJldHVybiBjdXJyZW50XG4gIGlmIChjdXJyZW50ID09PSAnbm9uX3NlcmlhbGl6YWJsZScgfHwgbmV4dCA9PT0gJ25vbl9zZXJpYWxpemFibGUnKSByZXR1cm4gJ25vbl9zZXJpYWxpemFibGUnXG4gIGlmIChjdXJyZW50ID09PSAnb3ZlcnNpemVkJyB8fCBuZXh0ID09PSAnb3ZlcnNpemVkJykgcmV0dXJuICdvdmVyc2l6ZWQnXG4gIHJldHVybiAndW5rbm93bidcbn1cblxuLy8gXHU2RDRGXHU4OUM4XHU1NjY4XHU3M0FGXHU1ODgzXHU0RTBCXHVGRjBDXHU0RTNBXHU0RTg2XHU1MUNGXHU1QzExIFJlYWN0IFN0cmljdE1vZGUgXHU3QjQ5XHU1QkZDXHU4MUY0XHU3Njg0XHU5MUNEXHU1OTBEXHU2NUU1XHU1RkQ3XHU1NjZBXHU5N0YzXHVGRjBDXG4vLyBcdTVCRjkgbGlmZWN5Y2xlOmVycm9yIFx1NEUwRSBkaWFnbm9zdGljIFx1NEU4Qlx1NEVGNlx1NTA1QVx1NEUwMFx1NkIyMVx1N0I4MFx1NTM1NVx1NTNCQlx1OTFDRFx1RkYxQVx1NTQwQ1x1NEUwMCBtb2R1bGVJZCtwYXlsb2FkIFx1NTNFQVx1NjI1M1x1NTM3MFx1NEUwMFx1NkIyMVx1MzAwMlxuY29uc3QgYnJvd3NlckxpZmVjeWNsZVNlZW4gPSBuZXcgU2V0PHN0cmluZz4oKVxuY29uc3QgYnJvd3NlckRpYWdub3N0aWNTZWVuID0gbmV3IFNldDxzdHJpbmc+KClcblxuLy8gXHU3NTI4XHU0RThFXHU1QzA2IHRyYWNlOnJlYWN0LXJlbmRlciBcdTRFOEJcdTRFRjZcdTRFMEVcdTY3MDBcdThGRDFcdTRFMDBcdTZCMjEgc3RhdGU6dXBkYXRlIFx1NEU4Qlx1NTJBMVx1NUJGOVx1OUY1MFx1RkYwOFx1NEVDNVx1NEY1Q1x1NEUzQSBVSSBcdThGODVcdTUyQTlcdTUxNzNcdTgwNTRcdUZGMDlcdTMwMDJcbmNvbnN0IGxhc3RUeG5CeUluc3RhbmNlID0gbmV3IE1hcDxzdHJpbmcsIHsgcmVhZG9ubHkgdHhuSWQ6IHN0cmluZzsgcmVhZG9ubHkgdHhuU2VxOiBudW1iZXIgfT4oKVxuXG5jb25zdCBsaWZlY3ljbGVFcnJvckxvZyA9IChldmVudDogRXh0cmFjdDxFdmVudCwgeyByZWFkb25seSB0eXBlOiAnbGlmZWN5Y2xlOmVycm9yJyB9PikgPT4ge1xuICBjb25zdCBtb2R1bGVJZCA9IGV2ZW50Lm1vZHVsZUlkID8/ICd1bmtub3duJ1xuICBjb25zdCBjYXVzZVByZXR0eSA9ICgoKSA9PiB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBDYXVzZS5wcmV0dHkoZXZlbnQuY2F1c2UgYXMgQ2F1c2UuQ2F1c2U8dW5rbm93bj4sIHtcbiAgICAgICAgcmVuZGVyRXJyb3JDYXVzZTogdHJ1ZSxcbiAgICAgIH0pXG4gICAgfSBjYXRjaCB7XG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoZXZlbnQuY2F1c2UsIG51bGwsIDIpXG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgcmV0dXJuIFN0cmluZyhldmVudC5jYXVzZSlcbiAgICAgIH1cbiAgICB9XG4gIH0pKClcblxuICBjb25zdCBtZXNzYWdlID0gYFtMb2dpeF1bbW9kdWxlPSR7bW9kdWxlSWR9XSBsaWZlY3ljbGU6ZXJyb3JcXG4ke2NhdXNlUHJldHR5fWBcblxuICByZXR1cm4gRWZmZWN0LmxvZ0Vycm9yKG1lc3NhZ2UpLnBpcGUoXG4gICAgRWZmZWN0LmFubm90YXRlTG9ncyh7XG4gICAgICAnbG9naXgubW9kdWxlSWQnOiBtb2R1bGVJZCxcbiAgICAgICdsb2dpeC5ldmVudCc6ICdsaWZlY3ljbGU6ZXJyb3InLFxuICAgICAgJ2xvZ2l4LmNhdXNlJzogY2F1c2VQcmV0dHksXG4gICAgfSksXG4gIClcbn1cblxuY29uc3QgZGlhZ25vc3RpY0xvZyA9IChldmVudDogRXh0cmFjdDxFdmVudCwgeyByZWFkb25seSB0eXBlOiAnZGlhZ25vc3RpYycgfT4pID0+IHtcbiAgY29uc3QgbW9kdWxlSWQgPSBldmVudC5tb2R1bGVJZCA/PyAndW5rbm93bidcbiAgY29uc3QgaGVhZGVyID0gYFtMb2dpeF1bbW9kdWxlPSR7bW9kdWxlSWR9XSBkaWFnbm9zdGljKCR7ZXZlbnQuc2V2ZXJpdHl9KWBcbiAgY29uc3QgZGV0YWlsID0gYGNvZGU9JHtldmVudC5jb2RlfSBtZXNzYWdlPSR7ZXZlbnQubWVzc2FnZX0ke1xuICAgIGV2ZW50LmFjdGlvblRhZyA/IGAgYWN0aW9uPSR7ZXZlbnQuYWN0aW9uVGFnfWAgOiAnJ1xuICB9JHtldmVudC5oaW50ID8gYFxcbmhpbnQ6ICR7ZXZlbnQuaGludH1gIDogJyd9YFxuICBjb25zdCBtc2cgPSBgJHtoZWFkZXJ9XFxuJHtkZXRhaWx9YFxuXG4gIGNvbnN0IGJhc2UgPVxuICAgIGV2ZW50LnNldmVyaXR5ID09PSAnd2FybmluZydcbiAgICAgID8gRWZmZWN0LmxvZ1dhcm5pbmcobXNnKVxuICAgICAgOiBldmVudC5zZXZlcml0eSA9PT0gJ2luZm8nXG4gICAgICAgID8gRWZmZWN0LmxvZ0luZm8obXNnKVxuICAgICAgICA6IEVmZmVjdC5sb2dFcnJvcihtc2cpXG5cbiAgY29uc3QgYW5ub3RhdGlvbnM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge1xuICAgICdsb2dpeC5tb2R1bGVJZCc6IG1vZHVsZUlkLFxuICAgICdsb2dpeC5ldmVudCc6IGBkaWFnbm9zdGljKCR7ZXZlbnQuc2V2ZXJpdHl9KWAsXG4gICAgJ2xvZ2l4LmRpYWdub3N0aWMuY29kZSc6IGV2ZW50LmNvZGUsXG4gICAgJ2xvZ2l4LmRpYWdub3N0aWMubWVzc2FnZSc6IGV2ZW50Lm1lc3NhZ2UsXG4gIH1cbiAgaWYgKGV2ZW50LmhpbnQpIHtcbiAgICBhbm5vdGF0aW9uc1snbG9naXguZGlhZ25vc3RpYy5oaW50J10gPSBldmVudC5oaW50XG4gIH1cbiAgaWYgKGV2ZW50LmFjdGlvblRhZykge1xuICAgIGFubm90YXRpb25zWydsb2dpeC5kaWFnbm9zdGljLmFjdGlvblRhZyddID0gZXZlbnQuYWN0aW9uVGFnXG4gIH1cblxuICByZXR1cm4gYmFzZS5waXBlKEVmZmVjdC5hbm5vdGF0ZUxvZ3MoYW5ub3RhdGlvbnMpKVxufVxuXG4vKipcbiAqIFx1NTdGQVx1NEU4RSBGaWJlclJlZi5jdXJyZW50RGVidWdTaW5rcyBcdTc2ODRcdTlFRDhcdThCQTQgTGF5ZXIgXHU3RUM0XHU1NDA4XHVGRjFBXG4gKiAtIFx1NEY3Rlx1NzUyOCBMYXllci5sb2NhbGx5U2NvcGVkIFx1Nzg2RVx1NEZERCBEZWJ1ZyBzaW5rcyBcdTRGNUNcdTRFM0EgRmliZXJSZWYgXHU3MkI2XHU2MDAxXHU2Q0U4XHU1MTY1XHVGRjBDXG4gKiAtIFx1NEUwRFx1NTE4RFx1NUMwNiBGaWJlclJlZiBcdThCRUZcdTc1MjhcdTRFM0EgQ29udGV4dC5UYWdcdTMwMDJcbiAqL1xuZXhwb3J0IGNvbnN0IG5vb3BMYXllciA9IExheWVyLmxvY2FsbHlTY29wZWQoY3VycmVudERlYnVnU2lua3MsIFtdKVxuXG4vKipcbiAqIGVycm9yT25seUxheWVyXHVGRjFBXG4gKiAtIFx1OUVEOFx1OEJBNFx1NzY4NCBEZWJ1Z1NpbmsgXHU1QjlFXHU3M0IwXHVGRjBDXHU0RUM1XHU1MTczXHU1RkMzIGxpZmVjeWNsZTplcnJvciBcdTRFOEJcdTRFRjZcdUZGMUJcbiAqIC0gXHU5MDAyXHU1NDA4XHU0RjVDXHU0RTNBIFJ1bnRpbWUgXHU3Njg0XHUyMDFDXHU2NzAwXHU0RjRFXHU5NjUwXHU1RUE2XHU4OUMyXHU2RDRCXHUyMDFEXHU1QzQyXHVGRjBDXHU0RkREXHU4QkMxXHU4MUY0XHU1NDdEXHU5NTE5XHU4QkVGXHU0RTBEXHU0RjFBXHU2MDg0XHU3MTM2XHU2RDg4XHU1OTMxXHVGRjFCXG4gKiAtIFx1NTE3Nlx1NEVENlx1NEU4Qlx1NEVGNlx1RkYwOG1vZHVsZTppbml0L2Rlc3Ryb3lcdTMwMDFhY3Rpb246ZGlzcGF0Y2hcdTMwMDFzdGF0ZTp1cGRhdGVcdUZGMDlcdTlFRDhcdThCQTRcdTRFMERcdThCQjBcdTVGNTVcdTMwMDJcbiAqL1xuY29uc3QgZXJyb3JPbmx5U2luazogU2luayA9IHtcbiAgcmVjb3JkOiAoZXZlbnQ6IEV2ZW50KSA9PlxuICAgIGV2ZW50LnR5cGUgPT09ICdsaWZlY3ljbGU6ZXJyb3InXG4gICAgICA/IGxpZmVjeWNsZUVycm9yTG9nKGV2ZW50KVxuICAgICAgOiBldmVudC50eXBlID09PSAnZGlhZ25vc3RpYycgJiYgZXZlbnQuc2V2ZXJpdHkgIT09ICdpbmZvJ1xuICAgICAgICA/IGRpYWdub3N0aWNMb2coZXZlbnQpXG4gICAgICAgIDogRWZmZWN0LnZvaWQsXG59XG5cbmV4cG9ydCBjb25zdCBlcnJvck9ubHlMYXllciA9IExheWVyLmxvY2FsbHlTY29wZWQoY3VycmVudERlYnVnU2lua3MsIFtlcnJvck9ubHlTaW5rXSlcblxuLyoqXG4gKiBjb25zb2xlTGF5ZXJcdUZGMUFcbiAqIC0gXHU1MTY4XHU5MUNGXHU4QzAzXHU4QkQ1XHU1QzQyXHVGRjBDXHU1QzA2XHU2MjQwXHU2NzA5IERlYnVnIFx1NEU4Qlx1NEVGNlx1NEVFNSBFZmZlY3QgXHU2NUU1XHU1RkQ3XHU1RjYyXHU1RjBGXHU4RjkzXHU1MUZBXHVGRjA4bG9nZm10IC8gc3RydWN0dXJlZFx1RkYwOVx1RkYwQ1xuICogLSBcdTkwMDJcdTU0MDhcdTRGNUNcdTRFM0FcdTkwMUFcdTc1MjhcdTczQUZcdTU4ODNcdUZGMDhOb2RlIC8gXHU2RDRCXHU4QkQ1XHU3M0FGXHU1ODgzXHVGRjA5XHU3Njg0XHU4OUMyXHU2RDRCXHU1QzQyXHUzMDAyXG4gKi9cbmNvbnN0IGNvbnNvbGVTaW5rOiBTaW5rID0ge1xuICByZWNvcmQ6IChldmVudDogRXZlbnQpID0+XG4gICAgZXZlbnQudHlwZSA9PT0gJ2xpZmVjeWNsZTplcnJvcidcbiAgICAgID8gbGlmZWN5Y2xlRXJyb3JMb2coZXZlbnQpXG4gICAgICA6IGV2ZW50LnR5cGUgPT09ICdkaWFnbm9zdGljJ1xuICAgICAgICA/IGRpYWdub3N0aWNMb2coZXZlbnQpXG4gICAgICAgIDogRWZmZWN0LmxvZ0RlYnVnKHsgZGVidWdFdmVudDogZXZlbnQgfSksXG59XG5cbmV4cG9ydCBjb25zdCBjb25zb2xlTGF5ZXIgPSBMYXllci5sb2NhbGx5U2NvcGVkKGN1cnJlbnREZWJ1Z1NpbmtzLCBbY29uc29sZVNpbmtdKVxuXG5jb25zdCBpc0Jyb3dzZXIgPSB0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlb2YgZG9jdW1lbnQgIT09ICd1bmRlZmluZWQnXG5cbi8vIFx1NkQ0Rlx1ODlDOFx1NTY2OFx1NzNBRlx1NTg4M1x1NEUwQlx1N0VERlx1NEUwMFx1NzY4NCBDb25zb2xlIFx1NkUzMlx1NjdEM1x1OTAzQlx1OEY5MVx1RkYwQ1x1NzUyOFx1NEU4RSBEZWJ1Z1NpbmsgXHU3RjNBXHU3NzAxXHU1QjlFXHU3M0IwXHU0RTBFIGJyb3dzZXJDb25zb2xlTGF5ZXJcdTMwMDJcbmNvbnN0IHJlbmRlckJyb3dzZXJDb25zb2xlRXZlbnQgPSAoZXZlbnQ6IEV2ZW50KTogRWZmZWN0LkVmZmVjdDx2b2lkPiA9PiB7XG4gIC8vIHRyYWNlOiogXHU0RThCXHU0RUY2XHVGRjFBXHU1NzI4XHU2RDRGXHU4OUM4XHU1NjY4XHU0RTJEXHU0RUU1XHU3MkVDXHU3QUNCXHU1MjA2XHU3RUM0XHU1QzU1XHU3OTNBXHVGRjBDXHU0RkJGXHU0RThFIFBsYXlncm91bmQgLyBEZXZUb29scyBcdTg5QzJcdTZENEJcdTMwMDJcbiAgaWYgKHR5cGVvZiAoZXZlbnQgYXMgYW55KS50eXBlID09PSAnc3RyaW5nJyAmJiAoZXZlbnQgYXMgYW55KS50eXBlLnN0YXJ0c1dpdGgoJ3RyYWNlOicpKSB7XG4gICAgY29uc3QgbW9kdWxlSWQgPSAoZXZlbnQgYXMgYW55KS5tb2R1bGVJZCA/PyAndW5rbm93bidcbiAgICBjb25zdCB0eXBlID0gKGV2ZW50IGFzIGFueSkudHlwZVxuXG4gICAgcmV0dXJuIEVmZmVjdC5zeW5jKCgpID0+IHtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zb2xlXG4gICAgICBjb25zb2xlLmdyb3VwQ29sbGFwc2VkKFxuICAgICAgICAnJWNbTG9naXhdJWMgdHJhY2UgJWMnICsgbW9kdWxlSWQgKyAnJWMgJyArIFN0cmluZyh0eXBlKSxcbiAgICAgICAgJ2NvbG9yOiM2YjcyODA7Zm9udC13ZWlnaHQ6Ym9sZCcsIC8vIHRhZ1xuICAgICAgICAnY29sb3I6IzNiODJmNicsIC8vIGxhYmVsXG4gICAgICAgICdjb2xvcjojOWNhM2FmJywgLy8gbW9kdWxlIGlkXG4gICAgICAgICdjb2xvcjojNmI3MjgwJywgLy8gdHlwZVxuICAgICAgKVxuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnNvbGVcbiAgICAgIGNvbnNvbGUubG9nKGV2ZW50KVxuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnNvbGVcbiAgICAgIGNvbnNvbGUuZ3JvdXBFbmQoKVxuICAgIH0pXG4gIH1cblxuICBpZiAoZXZlbnQudHlwZSA9PT0gJ2xpZmVjeWNsZTplcnJvcicpIHtcbiAgICBjb25zdCBtb2R1bGVJZCA9IGV2ZW50Lm1vZHVsZUlkID8/ICd1bmtub3duJ1xuICAgIGNvbnN0IGNhdXNlUHJldHR5ID0gKCgpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBDYXVzZS5wcmV0dHkoZXZlbnQuY2F1c2UgYXMgQ2F1c2UuQ2F1c2U8dW5rbm93bj4sIHsgcmVuZGVyRXJyb3JDYXVzZTogdHJ1ZSB9KVxuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KGV2ZW50LmNhdXNlLCBudWxsLCAyKVxuICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICByZXR1cm4gU3RyaW5nKGV2ZW50LmNhdXNlKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSkoKVxuXG4gICAgY29uc3Qga2V5ID0gYCR7bW9kdWxlSWR9fCR7Y2F1c2VQcmV0dHl9YFxuICAgIGlmIChicm93c2VyTGlmZWN5Y2xlU2Vlbi5oYXMoa2V5KSkge1xuICAgICAgcmV0dXJuIEVmZmVjdC52b2lkXG4gICAgfVxuICAgIGJyb3dzZXJMaWZlY3ljbGVTZWVuLmFkZChrZXkpXG5cbiAgICByZXR1cm4gRWZmZWN0LnN5bmMoKCkgPT4ge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnNvbGVcbiAgICAgIGNvbnNvbGUuZ3JvdXBDb2xsYXBzZWQoXG4gICAgICAgICclY1tMb2dpeF0lYyBsaWZlY3ljbGU6ZXJyb3IgJWMnICsgbW9kdWxlSWQsXG4gICAgICAgICdjb2xvcjojZWY0NDQ0O2ZvbnQtd2VpZ2h0OmJvbGQnLCAvLyB0YWdcbiAgICAgICAgJ2NvbG9yOiNlZjQ0NDQnLCAvLyBsYWJlbFxuICAgICAgICAnY29sb3I6IzljYTNhZicsIC8vIG1vZHVsZSBpZFxuICAgICAgKVxuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnNvbGVcbiAgICAgIGNvbnNvbGUuZXJyb3IoY2F1c2VQcmV0dHkpXG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc29sZVxuICAgICAgY29uc29sZS5ncm91cEVuZCgpXG4gICAgfSlcbiAgfVxuXG4gIGlmIChldmVudC50eXBlID09PSAnZGlhZ25vc3RpYycpIHtcbiAgICBjb25zdCBtb2R1bGVJZCA9IGV2ZW50Lm1vZHVsZUlkID8/ICd1bmtub3duJ1xuICAgIGNvbnN0IGRldGFpbCA9IGBjb2RlPSR7ZXZlbnQuY29kZX0gbWVzc2FnZT0ke2V2ZW50Lm1lc3NhZ2V9JHtcbiAgICAgIGV2ZW50LmFjdGlvblRhZyA/IGAgYWN0aW9uPSR7ZXZlbnQuYWN0aW9uVGFnfWAgOiAnJ1xuICAgIH0ke2V2ZW50LmhpbnQgPyBgXFxuaGludDogJHtldmVudC5oaW50fWAgOiAnJ31gXG5cbiAgICBjb25zdCBjb2xvciA9XG4gICAgICBldmVudC5zZXZlcml0eSA9PT0gJ3dhcm5pbmcnID8gJ2NvbG9yOiNkOTc3MDYnIDogZXZlbnQuc2V2ZXJpdHkgPT09ICdpbmZvJyA/ICdjb2xvcjojM2I4MmY2JyA6ICdjb2xvcjojZWY0NDQ0J1xuXG4gICAgY29uc3QgbGFiZWwgPVxuICAgICAgZXZlbnQuc2V2ZXJpdHkgPT09ICd3YXJuaW5nJ1xuICAgICAgICA/ICdkaWFnbm9zdGljKHdhcm5pbmcpJ1xuICAgICAgICA6IGV2ZW50LnNldmVyaXR5ID09PSAnaW5mbydcbiAgICAgICAgICA/ICdkaWFnbm9zdGljKGluZm8pJ1xuICAgICAgICAgIDogJ2RpYWdub3N0aWMoZXJyb3IpJ1xuXG4gICAgY29uc3Qga2V5ID0gYCR7bW9kdWxlSWR9fCR7ZXZlbnQuY29kZX18JHtldmVudC5tZXNzYWdlfWBcbiAgICBpZiAoYnJvd3NlckRpYWdub3N0aWNTZWVuLmhhcyhrZXkpKSB7XG4gICAgICByZXR1cm4gRWZmZWN0LnZvaWRcbiAgICB9XG4gICAgYnJvd3NlckRpYWdub3N0aWNTZWVuLmFkZChrZXkpXG5cbiAgICByZXR1cm4gRWZmZWN0LnN5bmMoKCkgPT4ge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnNvbGVcbiAgICAgIGNvbnNvbGUuZ3JvdXBDb2xsYXBzZWQoXG4gICAgICAgICclY1tMb2dpeF0lYyAnICsgbGFiZWwgKyAnJWMgbW9kdWxlPScgKyBtb2R1bGVJZCxcbiAgICAgICAgJ2NvbG9yOiM2YjcyODA7Zm9udC13ZWlnaHQ6Ym9sZCcsXG4gICAgICAgIGNvbG9yLFxuICAgICAgICAnY29sb3I6IzljYTNhZicsXG4gICAgICApXG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc29sZVxuICAgICAgY29uc29sZS5sb2coZGV0YWlsKVxuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnNvbGVcbiAgICAgIGNvbnNvbGUuZ3JvdXBFbmQoKVxuICAgIH0pXG4gIH1cblxuICAvLyBcdTUxNzZcdTRFRDZcdTRFOEJcdTRFRjZcdUZGMUFcdTlFRDhcdThCQTRcdTRFMERcdTU3MjhcdTZENEZcdTg5QzhcdTU2NjhcdTYzQTdcdTUyMzZcdTUzRjBcdThGOTNcdTUxRkFcdUZGMENcdTRFRTVcdTUxNERcdTU3MjhcdTRFMUFcdTUyQTFcdTVGMDBcdTUzRDFcdTU3M0FcdTY2NkZcdTRFMkRcdThGQzdcdTRFOEVcdTU0MzVcdTk1RjlcdUZGMUJcbiAgLy8gXHU1OTgyXHU5NzAwXHU2N0U1XHU3NzBCXHU1MTg1XHU5MEU4XHU4QzAzXHU4QkQ1XHU0RThCXHU0RUY2XHVGRjBDXHU1M0VGXHU5MDFBXHU4RkM3XHU4MUVBXHU1QjlBXHU0RTQ5IERlYnVnIFNpbmsgXHU2MjE2XHU1NzI4IE5vZGUgXHU3M0FGXHU1ODgzXHU0RTBCXHU0RjdGXHU3NTI4IGNvbnNvbGVMYXllclx1MzAwMlxuICByZXR1cm4gRWZmZWN0LnZvaWRcbn1cblxuLyoqXG4gKiBcdTZENEZcdTg5QzhcdTU2NjggQ29uc29sZSBcdThDMDNcdThCRDVcdTVDNDJcdUZGMUFcbiAqIC0gXHU1NzI4XHU2RDRGXHU4OUM4XHU1NjY4XHU3M0FGXHU1ODgzXHU0RTBCXHU0RjdGXHU3NTI4IGNvbnNvbGUuZ3JvdXBDb2xsYXBzZWQgKyBcdTVGNjlcdTgyNzIgbGFiZWwgXHU2QTIxXHU2MkRGIHByZXR0eSBsb2dnZXIgXHU3Njg0XHU1MjA2XHU3RUM0XHU2NTQ4XHU2NzlDXHVGRjFCXG4gKiAtIFx1NTcyOFx1OTc1RVx1NkQ0Rlx1ODlDOFx1NTY2OFx1NzNBRlx1NTg4M1x1NEUwQlx1NTZERVx1OTAwMFx1NTIzMCBjb25zb2xlTGF5ZXIgXHU3Njg0IEVmZmVjdCBcdTY1RTVcdTVGRDdcdTVCOUVcdTczQjBcdTMwMDJcbiAqL1xuY29uc3QgYnJvd3NlckNvbnNvbGVTaW5rOiBTaW5rID0ge1xuICByZWNvcmQ6IChldmVudDogRXZlbnQpID0+IHtcbiAgICBpZiAoIWlzQnJvd3Nlcikge1xuICAgICAgLy8gXHU5NzVFXHU2RDRGXHU4OUM4XHU1NjY4XHU3M0FGXHU1ODgzXHVGRjFBXHU5MDAwXHU1NkRFXHU1MjMwIEVmZmVjdC5sb2cqIFx1NzY4NCBjb25zb2xlTGF5ZXIgXHU4ODRDXHU0RTNBXG4gICAgICByZXR1cm4gZXZlbnQudHlwZSA9PT0gJ2xpZmVjeWNsZTplcnJvcidcbiAgICAgICAgPyBsaWZlY3ljbGVFcnJvckxvZyhldmVudClcbiAgICAgICAgOiBldmVudC50eXBlID09PSAnZGlhZ25vc3RpYydcbiAgICAgICAgICA/IGRpYWdub3N0aWNMb2coZXZlbnQpXG4gICAgICAgICAgOiBFZmZlY3QubG9nRGVidWcoeyBkZWJ1Z0V2ZW50OiBldmVudCB9KVxuICAgIH1cblxuICAgIHJldHVybiByZW5kZXJCcm93c2VyQ29uc29sZUV2ZW50KGV2ZW50KVxuICB9LFxufVxuXG5leHBvcnQgY29uc3QgYnJvd3NlckNvbnNvbGVMYXllciA9IExheWVyLmxvY2FsbHlTY29wZWQoY3VycmVudERlYnVnU2lua3MsIFticm93c2VyQ29uc29sZVNpbmtdKVxuXG4vKipcbiAqIFx1NkQ0Rlx1ODlDOFx1NTY2OFx1NTNDQlx1NTk3RFx1NzY4NCBMb2dnZXIgXHU1QzQyXHVGRjFBXHU0RjdGXHU3NTI4IEVmZmVjdCBcdTVCOThcdTY1QjlcdTc2ODQgcHJldHR5IGxvZ2dlclx1RkYwOGJyb3dzZXIgXHU2QTIxXHU1RjBGXHVGRjA5XHU2NkZGXHU2MzYyXHU5RUQ4XHU4QkE0IGxvZ2dlclx1MzAwMlxuICogLSBcdTRFMERcdTUxOERcdTYyNEJcdTUxOTkgY29uc29sZSBcdTY4MzdcdTVGMEZcdUZGMENcdTc2RjRcdTYzQTVcdTU5MERcdTc1MjggRWZmZWN0IFx1NzY4NFx1NUY2OVx1ODI3Mi9cdTUyMDZcdTdFQzRcdTY4M0NcdTVGMEZcdUZGMUJcbiAqIC0gXHU1NzI4XHU2NzBEXHU1MkExXHU3QUVGXHU3M0FGXHU1ODgzXHU0RTBCXHU0RTVGXHU4MEZEXHU1Qjg5XHU1MTY4XHU5MDAwXHU1MzE2XHU0RTNBXHU5RUQ4XHU4QkE0IGxvZ2dlclx1MzAwMlxuICovXG5leHBvcnQgY29uc3QgYnJvd3NlclByZXR0eUxvZ2dlckxheWVyID0gTG9nZ2VyLnJlcGxhY2UoXG4gIExvZ2dlci5kZWZhdWx0TG9nZ2VyLFxuICBMb2dnZXIucHJldHR5TG9nZ2VyKHsgbW9kZTogJ2Jyb3dzZXInLCBjb2xvcnM6IHRydWUgfSksXG4pXG5cbi8qKlxuICogZGVmYXVsdExheWVyXHVGRjFBXG4gKiAtIFx1NTE2Q1x1NTE3MVx1OUVEOFx1OEJBNFx1NUM0Mlx1RkYwQ1x1NUY1M1x1NTI0RFx1N0I0OVx1NTQwQ1x1NEU4RSBlcnJvck9ubHlMYXllclx1RkYxQlxuICogLSBcdTRFQzVcdThCQjBcdTVGNTUgbGlmZWN5Y2xlOmVycm9yXHVGRjBDXHU5MDdGXHU1MTREXHU1NzI4XHU5RUQ4XHU4QkE0XHU2MEM1XHU1MUI1XHU0RTBCXHU1QkY5IGFjdGlvbi9zdGF0ZSBcdTYyNTNcdTUzNzBcdTU5MjdcdTkxQ0ZcdTY1RTVcdTVGRDdcdTMwMDJcbiAqL1xuZXhwb3J0IGNvbnN0IGRlZmF1bHRMYXllciA9IGVycm9yT25seUxheWVyXG5cbmV4cG9ydCBjb25zdCByZWNvcmQgPSAoZXZlbnQ6IEV2ZW50KSA9PlxuICBFZmZlY3QuZ2VuKGZ1bmN0aW9uKiAoKSB7XG4gICAgY29uc3Qgc2lua3MgPSB5aWVsZCogRmliZXJSZWYuZ2V0KGN1cnJlbnREZWJ1Z1NpbmtzKVxuXG4gICAgLy8gRmFzdCBwYXRoOiB3aGVuIG5vIHNpbmtzIGFyZSBpbnN0YWxsZWQsIG9ubHkgYSBzbWFsbCBzdWJzZXQgb2YgZXZlbnRzIGFyZSBldmVyIHN1cmZhY2VkLlxuICAgIC8vIEF2b2lkIHBheWluZyBwZXItZXZlbnQgRmliZXJSZWYgKyBlbnJpY2htZW50IGNvc3RzIGZvciBoaWdoLWZyZXF1ZW5jeSBldmVudHMgbGlrZSBzdGF0ZTp1cGRhdGUuXG4gICAgaWYgKHNpbmtzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgaWYgKGlzQnJvd3Nlcikge1xuICAgICAgICBpZiAoZXZlbnQudHlwZSA9PT0gJ2xpZmVjeWNsZTplcnJvcicgfHwgZXZlbnQudHlwZSA9PT0gJ2RpYWdub3N0aWMnKSB7XG4gICAgICAgICAgeWllbGQqIHJlbmRlckJyb3dzZXJDb25zb2xlRXZlbnQoZXZlbnQpXG4gICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cbiAgICAgICAgeWllbGQqIEVmZmVjdC52b2lkXG4gICAgICAgIHJldHVyblxuICAgICAgfVxuXG4gICAgICBpZiAoZXZlbnQudHlwZSA9PT0gJ2xpZmVjeWNsZTplcnJvcicpIHtcbiAgICAgICAgeWllbGQqIGxpZmVjeWNsZUVycm9yTG9nKGV2ZW50KVxuICAgICAgICByZXR1cm5cbiAgICAgIH1cbiAgICAgIGlmIChldmVudC50eXBlID09PSAnZGlhZ25vc3RpYycpIHtcbiAgICAgICAgeWllbGQqIGRpYWdub3N0aWNMb2coZXZlbnQpXG4gICAgICAgIHJldHVyblxuICAgICAgfVxuICAgICAgeWllbGQqIEVmZmVjdC52b2lkXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICAvLyBcdTRFM0EgRGVidWcuRXZlbnQgXHU4ODY1XHU1MTY4XHU1N0ZBXHU3ODQwXHU1QjU3XHU2QkI1XHVGRjFBXG4gICAgLy8gLSB0aW1lc3RhbXBcdUZGMUFcdTc1MjhcdTRFOEUgRGV2dG9vbHMvVGltZWxpbmUvT3ZlcnZpZXcgXHU1MDVBXHU2NUY2XHU5NUY0XHU4MDVBXHU1NDA4XHVGRjBDXHU5MDdGXHU1MTREIFVJIFx1NEZBN1x1NzUyOCBEYXRlLm5vdygpXHUyMDFDXHU5OTk2XHU2QjIxXHU4OUMyXHU1QkRGXHU2NUY2XHU5NUY0XHUyMDFEXHU1QkZDXHU4MUY0XHU1OTMxXHU3NzFGXHVGRjFCXG4gICAgLy8gLSBydW50aW1lTGFiZWxcdUZGMUFcdTY3NjVcdTgxRUEgRmliZXJSZWZcdUZGMENcdTRGQkZcdTRFOEVcdTYzMDkgcnVudGltZSBcdTdFRjRcdTVFQTZcdTUyMDZcdTdFQzRcdUZGMDhcdTRFQzVcdTU3MjhcdTRFOEJcdTRFRjZcdTY3MkFcdTY2M0VcdTVGMEZcdTYzRDBcdTRGOUJcdTY1RjZcdTZDRThcdTUxNjVcdUZGMDlcdTMwMDJcbiAgICBjb25zdCBub3cgPSBEYXRlLm5vdygpXG4gICAgY29uc3QgZW5yaWNoZWQgPSBldmVudCBhcyBFdmVudFxuICAgIGlmIChlbnJpY2hlZC50aW1lc3RhbXAgPT09IHVuZGVmaW5lZCkge1xuICAgICAgOyhlbnJpY2hlZCBhcyBhbnkpLnRpbWVzdGFtcCA9IG5vd1xuICAgIH1cbiAgICBpZiAoZW5yaWNoZWQucnVudGltZUxhYmVsID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnN0IHJ1bnRpbWVMYWJlbCA9IHlpZWxkKiBGaWJlclJlZi5nZXQoY3VycmVudFJ1bnRpbWVMYWJlbClcbiAgICAgIGlmIChydW50aW1lTGFiZWwpIHtcbiAgICAgICAgOyhlbnJpY2hlZCBhcyBhbnkpLnJ1bnRpbWVMYWJlbCA9IHJ1bnRpbWVMYWJlbFxuICAgICAgfVxuICAgIH1cbiAgICBpZiAoZW5yaWNoZWQudHlwZSA9PT0gJ2RpYWdub3N0aWMnICYmIChlbnJpY2hlZCBhcyBhbnkpLnR4bklkID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnN0IHR4bklkID0geWllbGQqIEZpYmVyUmVmLmdldChjdXJyZW50VHhuSWQpXG4gICAgICBpZiAodHhuSWQpIHtcbiAgICAgICAgOyhlbnJpY2hlZCBhcyBhbnkpLnR4bklkID0gdHhuSWRcbiAgICAgIH1cbiAgICB9XG4gICAgLy8gbGlua0lkIFx1NEVDNVx1NUJGOSBFZmZlY3RPcCBcdTRFOEJcdTRFRjZcdTY3MDlcdTYxMEZcdTRFNDlcdUZGMUFcdTkwN0ZcdTUxNERcdTU3MjhcdTlBRDhcdTk4OTFcdTRFOEJcdTRFRjZcdUZGMDhzdGF0ZTp1cGRhdGUgXHU3QjQ5XHVGRjA5XHU0RTBBXHU5ODlEXHU1OTE2XHU4QkZCXHU1M0Q2IEZpYmVyUmVmXHUzMDAyXG4gICAgaWYgKChlbnJpY2hlZCBhcyBhbnkpLnR5cGUgPT09ICd0cmFjZTplZmZlY3RvcCcgJiYgKGVucmljaGVkIGFzIGFueSkubGlua0lkID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnN0IGxpbmtJZCA9IHlpZWxkKiBGaWJlclJlZi5nZXQoRWZmZWN0T3BDb3JlLmN1cnJlbnRMaW5rSWQpXG4gICAgICBpZiAobGlua0lkKSB7XG4gICAgICAgIDsoZW5yaWNoZWQgYXMgYW55KS5saW5rSWQgPSBsaW5rSWRcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoc2lua3MubGVuZ3RoID09PSAxKSB7XG4gICAgICB5aWVsZCogc2lua3NbMF0hLnJlY29yZChlbnJpY2hlZClcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIHlpZWxkKiBFZmZlY3QuZm9yRWFjaChzaW5rcywgKHNpbmspID0+IHNpbmsucmVjb3JkKGVucmljaGVkKSwgeyBkaXNjYXJkOiB0cnVlIH0pXG4gIH0pXG5cbi8qKlxuICogXHU1QzA2XHU1MTg1XHU5MEU4IERlYnVnLkV2ZW50IFx1NUY1Mlx1NEUwMFx1NTMxNlx1NEUzQSBSdW50aW1lRGVidWdFdmVudFJlZlx1RkYxQVxuICogLSBcdTRGQkZcdTRFOEUgRGV2dG9vbHMgLyBSdW50aW1lIFx1N0VERlx1NEUwMFx1NkQ4OFx1OEQzOSBEZWJ1ZyBcdTRFOEJcdTRFRjZcdUZGMUJcbiAqIC0gXHU0RTBEXHU2NTM5XHU1M0Q4XHU1MzlGXHU2NzA5IERlYnVnU2luayBcdTg4NENcdTRFM0FcdUZGMENcdTRFQzVcdTYzRDBcdTRGOUJcdTdFRDNcdTY3ODRcdTUzMTZcdTg5QzZcdTU2RkVcdTMwMDJcbiAqL1xuZXhwb3J0IGNvbnN0IHRvUnVudGltZURlYnVnRXZlbnRSZWYgPSAoXG4gIGV2ZW50OiBFdmVudCxcbiAgb3B0aW9ucz86IHtcbiAgICByZWFkb25seSBkaWFnbm9zdGljc0xldmVsPzogRGlhZ25vc3RpY3NMZXZlbFxuICAgIHJlYWRvbmx5IGV2ZW50U2VxPzogbnVtYmVyXG4gICAgcmVhZG9ubHkgb25NZXRhUHJvamVjdGlvbj86IChwcm9qZWN0aW9uOiB7XG4gICAgICByZWFkb25seSBzdGF0czogSnNvblZhbHVlUHJvamVjdGlvblN0YXRzXG4gICAgICByZWFkb25seSBkb3duZ3JhZGU/OiBKc29uRG93bmdyYWRlUmVhc29uXG4gICAgfSkgPT4gdm9pZFxuICB9LFxuKTogUnVudGltZURlYnVnRXZlbnRSZWYgfCB1bmRlZmluZWQgPT4ge1xuICBjb25zdCBkaWFnbm9zdGljc0xldmVsID0gb3B0aW9ucz8uZGlhZ25vc3RpY3NMZXZlbCA/PyAnZnVsbCdcbiAgaWYgKGRpYWdub3N0aWNzTGV2ZWwgPT09ICdvZmYnKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZFxuICB9XG5cbiAgY29uc3QgaXNMaWdodExpa2UgPSBkaWFnbm9zdGljc0xldmVsID09PSAnbGlnaHQnIHx8IGRpYWdub3N0aWNzTGV2ZWwgPT09ICdzYW1wbGVkJ1xuXG4gIGNvbnN0IHRpbWVzdGFtcCA9XG4gICAgdHlwZW9mIGV2ZW50LnRpbWVzdGFtcCA9PT0gJ251bWJlcicgJiYgTnVtYmVyLmlzRmluaXRlKGV2ZW50LnRpbWVzdGFtcCkgPyBldmVudC50aW1lc3RhbXAgOiBEYXRlLm5vdygpXG5cbiAgY29uc3QgbW9kdWxlSWRSYXcgPSAoZXZlbnQgYXMgYW55KS5tb2R1bGVJZFxuICBjb25zdCBtb2R1bGVJZCA9IHR5cGVvZiBtb2R1bGVJZFJhdyA9PT0gJ3N0cmluZycgJiYgbW9kdWxlSWRSYXcubGVuZ3RoID4gMCA/IG1vZHVsZUlkUmF3IDogJ3Vua25vd24nXG5cbiAgY29uc3QgaW5zdGFuY2VJZFJhdyA9IChldmVudCBhcyBhbnkpLmluc3RhbmNlSWRcbiAgY29uc3QgaW5zdGFuY2VJZCA9IHR5cGVvZiBpbnN0YW5jZUlkUmF3ID09PSAnc3RyaW5nJyAmJiBpbnN0YW5jZUlkUmF3Lmxlbmd0aCA+IDAgPyBpbnN0YW5jZUlkUmF3IDogJ3Vua25vd24nXG5cbiAgY29uc3QgcnVudGltZUxhYmVsUmF3ID0gKGV2ZW50IGFzIGFueSkucnVudGltZUxhYmVsXG4gIGNvbnN0IHJ1bnRpbWVMYWJlbCA9IHR5cGVvZiBydW50aW1lTGFiZWxSYXcgPT09ICdzdHJpbmcnICYmIHJ1bnRpbWVMYWJlbFJhdy5sZW5ndGggPiAwID8gcnVudGltZUxhYmVsUmF3IDogdW5kZWZpbmVkXG5cbiAgY29uc3QgdHhuU2VxUmF3ID0gKGV2ZW50IGFzIGFueSkudHhuU2VxXG4gIGNvbnN0IHR4blNlcSA9XG4gICAgdHlwZW9mIHR4blNlcVJhdyA9PT0gJ251bWJlcicgJiYgTnVtYmVyLmlzRmluaXRlKHR4blNlcVJhdykgJiYgdHhuU2VxUmF3ID49IDAgPyBNYXRoLmZsb29yKHR4blNlcVJhdykgOiAwXG5cbiAgY29uc3QgdHhuSWRSYXcgPSAoZXZlbnQgYXMgYW55KS50eG5JZFxuICBjb25zdCB0eG5JZCA9XG4gICAgdHlwZW9mIHR4bklkUmF3ID09PSAnc3RyaW5nJyAmJiB0eG5JZFJhdy5sZW5ndGggPiAwXG4gICAgICA/IHR4bklkUmF3XG4gICAgICA6IHR4blNlcSA+IDBcbiAgICAgICAgPyBgJHtpbnN0YW5jZUlkfTo6dCR7dHhuU2VxfWBcbiAgICAgICAgOiB1bmRlZmluZWRcblxuICBjb25zdCBsaW5rSWQgPSAoKCkgPT4ge1xuICAgIGNvbnN0IGxpbmtJZFJhdyA9IChldmVudCBhcyBhbnkpLmxpbmtJZFxuICAgIGlmICh0eXBlb2YgbGlua0lkUmF3ID09PSAnc3RyaW5nJyAmJiBsaW5rSWRSYXcubGVuZ3RoID4gMCkgcmV0dXJuIGxpbmtJZFJhd1xuXG4gICAgLy8gdHJhY2U6Klx1RkYxQVx1NTE0MVx1OEJCOFx1NEVDRSBkYXRhLm1ldGEubGlua0lkIFx1NTE1Q1x1NUU5NVx1NjNEMFx1NTNENlx1RkYwOFx1OTA3Rlx1NTE0RCBVSSBcdTRGQTdcdTZERjFcdTUxNjUgbWV0YSBcdTZERjFcdTZFMEFcdUZGMDlcdTMwMDJcbiAgICBpZiAodHlwZW9mIChldmVudCBhcyBhbnkpLnR5cGUgIT09ICdzdHJpbmcnIHx8ICEoZXZlbnQgYXMgYW55KS50eXBlLnN0YXJ0c1dpdGgoJ3RyYWNlOicpKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkXG4gICAgfVxuXG4gICAgY29uc3QgZGF0YTogYW55ID0gKGV2ZW50IGFzIGFueSkuZGF0YVxuICAgIGNvbnN0IG1ldGE6IGFueSA9IGRhdGE/Lm1ldGFcbiAgICBjb25zdCBsaW5rSWRGcm9tTWV0YSA9IG1ldGE/LmxpbmtJZFxuICAgIGlmICh0eXBlb2YgbGlua0lkRnJvbU1ldGEgPT09ICdzdHJpbmcnICYmIGxpbmtJZEZyb21NZXRhLmxlbmd0aCA+IDApIHJldHVybiBsaW5rSWRGcm9tTWV0YVxuXG4gICAgcmV0dXJuIHVuZGVmaW5lZFxuICB9KSgpXG5cbiAgY29uc3QgZXZlbnRTZXFSYXcgPSBvcHRpb25zPy5ldmVudFNlcVxuICBjb25zdCBldmVudFNlcSA9XG4gICAgdHlwZW9mIGV2ZW50U2VxUmF3ID09PSAnbnVtYmVyJyAmJiBOdW1iZXIuaXNGaW5pdGUoZXZlbnRTZXFSYXcpICYmIGV2ZW50U2VxUmF3ID4gMFxuICAgICAgPyBNYXRoLmZsb29yKGV2ZW50U2VxUmF3KVxuICAgICAgOiBuZXh0RXZlbnRTZXEoKVxuICBjb25zdCBldmVudElkID0gbWFrZUV2ZW50SWQoaW5zdGFuY2VJZCwgZXZlbnRTZXEpXG5cbiAgY29uc3QgYmFzZSA9IHtcbiAgICBldmVudElkLFxuICAgIGV2ZW50U2VxLFxuICAgIG1vZHVsZUlkLFxuICAgIGluc3RhbmNlSWQsXG4gICAgcnVudGltZUxhYmVsLFxuICAgIHR4blNlcSxcbiAgICB0eG5JZCxcbiAgICBsaW5rSWQsXG4gICAgdGltZXN0YW1wLFxuICB9IGFzIGNvbnN0XG5cbiAgbGV0IGRvd25ncmFkZTogRG93bmdyYWRlUmVhc29uIHwgdW5kZWZpbmVkXG5cbiAgY29uc3Qgd2l0aERvd25ncmFkZSA9IChyZWY6IE9taXQ8UnVudGltZURlYnVnRXZlbnRSZWYsICdkb3duZ3JhZGUnPik6IFJ1bnRpbWVEZWJ1Z0V2ZW50UmVmID0+IHtcbiAgICBpZiAoIWRvd25ncmFkZSkgcmV0dXJuIHJlZlxuICAgIHJldHVybiB7IC4uLnJlZiwgZG93bmdyYWRlOiB7IHJlYXNvbjogZG93bmdyYWRlIH0gfVxuICB9XG5cbiAgc3dpdGNoIChldmVudC50eXBlKSB7XG4gICAgY2FzZSAnbW9kdWxlOmluaXQnOlxuICAgICAgcmV0dXJuIHdpdGhEb3duZ3JhZGUoe1xuICAgICAgICAuLi5iYXNlLFxuICAgICAgICBraW5kOiAnbGlmZWN5Y2xlJyxcbiAgICAgICAgbGFiZWw6ICdtb2R1bGU6aW5pdCcsXG4gICAgICB9KVxuICAgIGNhc2UgJ21vZHVsZTpkZXN0cm95JzpcbiAgICAgIHJldHVybiB3aXRoRG93bmdyYWRlKHtcbiAgICAgICAgLi4uYmFzZSxcbiAgICAgICAga2luZDogJ2xpZmVjeWNsZScsXG4gICAgICAgIGxhYmVsOiAnbW9kdWxlOmRlc3Ryb3knLFxuICAgICAgfSlcbiAgICBjYXNlICdsaWZlY3ljbGU6cGhhc2UnOiB7XG4gICAgICBjb25zdCBlID0gZXZlbnQgYXMgRXh0cmFjdDxFdmVudCwgeyByZWFkb25seSB0eXBlOiAnbGlmZWN5Y2xlOnBoYXNlJyB9PlxuICAgICAgY29uc3QgbWV0YUlucHV0ID1cbiAgICAgICAgaXNMaWdodExpa2VcbiAgICAgICAgICA/IHsgdHlwZTogJ2xpZmVjeWNsZTpwaGFzZScsIHBoYXNlOiBlLnBoYXNlLCBuYW1lOiBlLm5hbWUgfVxuICAgICAgICAgIDogeyB0eXBlOiAnbGlmZWN5Y2xlOnBoYXNlJywgcGhhc2U6IGUucGhhc2UsIG5hbWU6IGUubmFtZSwgcGF5bG9hZDogZS5wYXlsb2FkIH1cbiAgICAgIGNvbnN0IG1ldGFQcm9qZWN0aW9uID0gcHJvamVjdEpzb25WYWx1ZShtZXRhSW5wdXQpXG4gICAgICBvcHRpb25zPy5vbk1ldGFQcm9qZWN0aW9uPy4oe1xuICAgICAgICBzdGF0czogbWV0YVByb2plY3Rpb24uc3RhdHMsXG4gICAgICAgIGRvd25ncmFkZTogbWV0YVByb2plY3Rpb24uZG93bmdyYWRlLFxuICAgICAgfSlcbiAgICAgIGRvd25ncmFkZSA9IG1lcmdlRG93bmdyYWRlKGRvd25ncmFkZSwgbWV0YVByb2plY3Rpb24uZG93bmdyYWRlKVxuICAgICAgcmV0dXJuIHdpdGhEb3duZ3JhZGUoe1xuICAgICAgICAuLi5iYXNlLFxuICAgICAgICBraW5kOiAnbGlmZWN5Y2xlJyxcbiAgICAgICAgbGFiZWw6IGUubmFtZSxcbiAgICAgICAgbWV0YTogbWV0YVByb2plY3Rpb24udmFsdWUsXG4gICAgICB9KVxuICAgIH1cbiAgICBjYXNlICdhY3Rpb246ZGlzcGF0Y2gnOiB7XG4gICAgICBjb25zdCBhY3Rpb246IGFueSA9IChldmVudCBhcyBhbnkpLmFjdGlvblxuICAgICAgY29uc3QgdGFnID0gYWN0aW9uPy5fdGFnID8/IGFjdGlvbj8udHlwZSA/PyAnYWN0aW9uOmRpc3BhdGNoJ1xuICAgICAgY29uc3QgbGFiZWwgPSBTdHJpbmcodGFnKVxuICAgICAgY29uc3QgbWV0YUlucHV0ID0gaXNMaWdodExpa2UgPyB7IGFjdGlvblRhZzogbGFiZWwgfSA6IHsgYWN0aW9uIH1cbiAgICAgIGNvbnN0IG1ldGFQcm9qZWN0aW9uID0gcHJvamVjdEpzb25WYWx1ZShtZXRhSW5wdXQpXG4gICAgICBvcHRpb25zPy5vbk1ldGFQcm9qZWN0aW9uPy4oe1xuICAgICAgICBzdGF0czogbWV0YVByb2plY3Rpb24uc3RhdHMsXG4gICAgICAgIGRvd25ncmFkZTogbWV0YVByb2plY3Rpb24uZG93bmdyYWRlLFxuICAgICAgfSlcbiAgICAgIGRvd25ncmFkZSA9IG1lcmdlRG93bmdyYWRlKGRvd25ncmFkZSwgbWV0YVByb2plY3Rpb24uZG93bmdyYWRlKVxuICAgICAgcmV0dXJuIHdpdGhEb3duZ3JhZGUoe1xuICAgICAgICAuLi5iYXNlLFxuICAgICAgICBraW5kOiAnYWN0aW9uJyxcbiAgICAgICAgbGFiZWwsXG4gICAgICAgIG1ldGE6IG1ldGFQcm9qZWN0aW9uLnZhbHVlLFxuICAgICAgfSlcbiAgICB9XG5cdCAgICBjYXNlICdzdGF0ZTp1cGRhdGUnOiB7XG5cdCAgICAgIGNvbnN0IGUgPSBldmVudCBhcyBFeHRyYWN0PEV2ZW50LCB7IHJlYWRvbmx5IHR5cGU6ICdzdGF0ZTp1cGRhdGUnIH0+XG5cdCAgICAgIGNvbnN0IG1ldGFJbnB1dCA9XG5cdCAgICAgICAgaXNMaWdodExpa2Vcblx0ICAgICAgICAgID8ge1xuXHQgICAgICAgICAgICAgIHN0YXRlOiBlLnN0YXRlLFxuXHQgICAgICAgICAgICAgIGRpcnR5U2V0OiBlLmRpcnR5U2V0LFxuICAgICAgICAgICAgICBwYXRjaENvdW50OiBlLnBhdGNoQ291bnQsXG4gICAgICAgICAgICAgIGNvbW1pdE1vZGU6IGUuY29tbWl0TW9kZSxcbiAgICAgICAgICAgICAgcHJpb3JpdHk6IGUucHJpb3JpdHksXG4gICAgICAgICAgICAgIG9yaWdpbktpbmQ6IGUub3JpZ2luS2luZCxcbiAgICAgICAgICAgICAgb3JpZ2luTmFtZTogZS5vcmlnaW5OYW1lLFxuICAgICAgICAgICAgfVxuICAgICAgICAgIDoge1xuICAgICAgICAgICAgICBzdGF0ZTogZS5zdGF0ZSxcbiAgICAgICAgICAgICAgZGlydHlTZXQ6IGUuZGlydHlTZXQsXG4gICAgICAgICAgICAgIHBhdGNoQ291bnQ6IGUucGF0Y2hDb3VudCxcbiAgICAgICAgICAgICAgY29tbWl0TW9kZTogZS5jb21taXRNb2RlLFxuICAgICAgICAgICAgICBwcmlvcml0eTogZS5wcmlvcml0eSxcbiAgICAgICAgICAgICAgb3JpZ2luS2luZDogZS5vcmlnaW5LaW5kLFxuICAgICAgICAgICAgICBvcmlnaW5OYW1lOiBlLm9yaWdpbk5hbWUsXG4gICAgICAgICAgICAgIHRyYWl0U3VtbWFyeTogZS50cmFpdFN1bW1hcnksXG4gICAgICAgICAgICAgIHJlcGxheUV2ZW50OiBlLnJlcGxheUV2ZW50LFxuICAgICAgICAgICAgfVxuICAgICAgY29uc3QgbWV0YVByb2plY3Rpb24gPSBwcm9qZWN0SnNvblZhbHVlKG1ldGFJbnB1dClcbiAgICAgIG9wdGlvbnM/Lm9uTWV0YVByb2plY3Rpb24/Lih7XG4gICAgICAgIHN0YXRzOiBtZXRhUHJvamVjdGlvbi5zdGF0cyxcbiAgICAgICAgZG93bmdyYWRlOiBtZXRhUHJvamVjdGlvbi5kb3duZ3JhZGUsXG4gICAgICB9KVxuICAgICAgZG93bmdyYWRlID0gbWVyZ2VEb3duZ3JhZGUoZG93bmdyYWRlLCBtZXRhUHJvamVjdGlvbi5kb3duZ3JhZGUpXG4gICAgICBpZiAodHhuSWQpIHtcbiAgICAgICAgbGFzdFR4bkJ5SW5zdGFuY2Uuc2V0KGluc3RhbmNlSWQsIHsgdHhuSWQsIHR4blNlcSB9KVxuICAgICAgfVxuICAgICAgcmV0dXJuIHdpdGhEb3duZ3JhZGUoe1xuICAgICAgICAuLi5iYXNlLFxuICAgICAgICBraW5kOiAnc3RhdGUnLFxuICAgICAgICBsYWJlbDogJ3N0YXRlOnVwZGF0ZScsXG4gICAgICAgIG1ldGE6IG1ldGFQcm9qZWN0aW9uLnZhbHVlLFxuICAgICAgfSlcbiAgICB9XG4gICAgY2FzZSAncHJvY2VzczpzdGFydCc6XG4gICAgY2FzZSAncHJvY2VzczpzdG9wJzpcbiAgICBjYXNlICdwcm9jZXNzOnJlc3RhcnQnOlxuICAgIGNhc2UgJ3Byb2Nlc3M6dHJpZ2dlcic6XG4gICAgY2FzZSAncHJvY2VzczpkaXNwYXRjaCc6XG4gICAgY2FzZSAncHJvY2VzczplcnJvcic6IHtcbiAgICAgIGNvbnN0IGUgPSBldmVudCBhcyBFeHRyYWN0PFxuICAgICAgICBFdmVudCxcbiAgICAgICAge1xuICAgICAgICAgIHJlYWRvbmx5IHR5cGU6XG4gICAgICAgICAgICB8ICdwcm9jZXNzOnN0YXJ0J1xuICAgICAgICAgICAgfCAncHJvY2VzczpzdG9wJ1xuICAgICAgICAgICAgfCAncHJvY2VzczpyZXN0YXJ0J1xuICAgICAgICAgICAgfCAncHJvY2Vzczp0cmlnZ2VyJ1xuICAgICAgICAgICAgfCAncHJvY2VzczpkaXNwYXRjaCdcbiAgICAgICAgICAgIHwgJ3Byb2Nlc3M6ZXJyb3InXG4gICAgICAgIH1cbiAgICAgID5cblxuICAgICAgY29uc3QgdHMyID0gdHlwZW9mIGUudGltZXN0YW1wTXMgPT09ICdudW1iZXInICYmIE51bWJlci5pc0Zpbml0ZShlLnRpbWVzdGFtcE1zKSA/IGUudGltZXN0YW1wTXMgOiB0aW1lc3RhbXBcblxuICAgICAgY29uc3QgbWV0YUlucHV0ID0ge1xuICAgICAgICBpZGVudGl0eTogZS5pZGVudGl0eSxcbiAgICAgICAgc2V2ZXJpdHk6IGUuc2V2ZXJpdHksXG4gICAgICAgIGV2ZW50U2VxOiBlLmV2ZW50U2VxLFxuICAgICAgICB0aW1lc3RhbXBNczogZS50aW1lc3RhbXBNcyxcbiAgICAgICAgdHJpZ2dlcjogZS50cmlnZ2VyLFxuICAgICAgICBkaXNwYXRjaDogZS5kaXNwYXRjaCxcbiAgICAgICAgZXJyb3I6IGUuZXJyb3IsXG4gICAgICB9XG4gICAgICBjb25zdCBtZXRhUHJvamVjdGlvbiA9IHByb2plY3RKc29uVmFsdWUobWV0YUlucHV0KVxuICAgICAgb3B0aW9ucz8ub25NZXRhUHJvamVjdGlvbj8uKHtcbiAgICAgICAgc3RhdHM6IG1ldGFQcm9qZWN0aW9uLnN0YXRzLFxuICAgICAgICBkb3duZ3JhZGU6IG1ldGFQcm9qZWN0aW9uLmRvd25ncmFkZSxcbiAgICAgIH0pXG4gICAgICBkb3duZ3JhZGUgPSBtZXJnZURvd25ncmFkZShkb3duZ3JhZGUsIG1ldGFQcm9qZWN0aW9uLmRvd25ncmFkZSlcblxuICAgICAgY29uc3QgZXJyb3JTdW1tYXJ5ID1cbiAgICAgICAgZS50eXBlID09PSAncHJvY2VzczplcnJvcicgfHwgZS50eXBlID09PSAncHJvY2VzczpyZXN0YXJ0J1xuICAgICAgICAgID8gKGUuZXJyb3IgYXMgYW55IGFzIFNlcmlhbGl6YWJsZUVycm9yU3VtbWFyeSB8IHVuZGVmaW5lZClcbiAgICAgICAgICA6IHVuZGVmaW5lZFxuXG4gICAgICByZXR1cm4gd2l0aERvd25ncmFkZSh7XG4gICAgICAgIC4uLmJhc2UsXG4gICAgICAgIHRpbWVzdGFtcDogdHMyLFxuICAgICAgICBraW5kOiAncHJvY2VzcycsXG4gICAgICAgIGxhYmVsOiBlLnR5cGUsXG4gICAgICAgIG1ldGE6IG1ldGFQcm9qZWN0aW9uLnZhbHVlLFxuICAgICAgICBlcnJvclN1bW1hcnksXG4gICAgICB9KVxuICAgIH1cblx0ICAgIGNhc2UgJ2xpZmVjeWNsZTplcnJvcic6IHtcblx0ICAgICAgY29uc3QgZSA9IGV2ZW50IGFzIEV4dHJhY3Q8RXZlbnQsIHsgcmVhZG9ubHkgdHlwZTogJ2xpZmVjeWNsZTplcnJvcicgfT5cblx0ICAgICAgY29uc3Qgc3VtbWFyeSA9IHRvU2VyaWFsaXphYmxlRXJyb3JTdW1tYXJ5KGUuY2F1c2UpXG5cdCAgICAgIGRvd25ncmFkZSA9IG1lcmdlRG93bmdyYWRlKGRvd25ncmFkZSwgc3VtbWFyeS5kb3duZ3JhZGUpXG5cdCAgICAgIGNvbnN0IG1ldGFJbnB1dCA9XG5cdCAgICAgICAgaXNMaWdodExpa2Vcblx0ICAgICAgICAgID8geyB0eXBlOiAnbGlmZWN5Y2xlOmVycm9yJywgcGhhc2U6IGUucGhhc2UsIG5hbWU6IGUuaG9vayB9XG5cdCAgICAgICAgICA6IHtcblx0ICAgICAgICAgICAgICB0eXBlOiAnbGlmZWN5Y2xlOmVycm9yJyxcblx0ICAgICAgICAgICAgICBwaGFzZTogZS5waGFzZSxcbiAgICAgICAgICAgICAgbmFtZTogZS5ob29rLFxuICAgICAgICAgICAgICBob29rOiBlLmhvb2ssXG4gICAgICAgICAgICAgIHRhc2tJZDogZS50YXNrSWQsXG4gICAgICAgICAgICAgIG9yaWdpbjogZS5vcmlnaW4sXG4gICAgICAgICAgICAgIHR4blNlcTogZS50eG5TZXEsXG4gICAgICAgICAgICAgIG9wU2VxOiBlLm9wU2VxLFxuICAgICAgICAgICAgfVxuICAgICAgY29uc3QgbWV0YVByb2plY3Rpb24gPSBwcm9qZWN0SnNvblZhbHVlKG1ldGFJbnB1dClcbiAgICAgIG9wdGlvbnM/Lm9uTWV0YVByb2plY3Rpb24/Lih7XG4gICAgICAgIHN0YXRzOiBtZXRhUHJvamVjdGlvbi5zdGF0cyxcbiAgICAgICAgZG93bmdyYWRlOiBtZXRhUHJvamVjdGlvbi5kb3duZ3JhZGUsXG4gICAgICB9KVxuICAgICAgZG93bmdyYWRlID0gbWVyZ2VEb3duZ3JhZGUoZG93bmdyYWRlLCBtZXRhUHJvamVjdGlvbi5kb3duZ3JhZGUpXG4gICAgICByZXR1cm4gd2l0aERvd25ncmFkZSh7XG4gICAgICAgIC4uLmJhc2UsXG4gICAgICAgIGtpbmQ6ICdsaWZlY3ljbGUnLFxuICAgICAgICBsYWJlbDogJ2xpZmVjeWNsZTplcnJvcicsXG4gICAgICAgIG1ldGE6IG1ldGFQcm9qZWN0aW9uLnZhbHVlLFxuICAgICAgICBlcnJvclN1bW1hcnk6IHN1bW1hcnkuZXJyb3JTdW1tYXJ5LFxuICAgICAgfSlcbiAgICB9XG4gICAgY2FzZSAnZGlhZ25vc3RpYyc6IHtcbiAgICAgIGNvbnN0IGUgPSBldmVudCBhcyBFeHRyYWN0PEV2ZW50LCB7IHJlYWRvbmx5IHR5cGU6ICdkaWFnbm9zdGljJyB9PlxuICAgICAgY29uc3QgbWV0YUlucHV0ID0ge1xuICAgICAgICBjb2RlOiBlLmNvZGUsXG4gICAgICAgIHNldmVyaXR5OiBlLnNldmVyaXR5LFxuICAgICAgICBtZXNzYWdlOiBlLm1lc3NhZ2UsXG4gICAgICAgIGhpbnQ6IGUuaGludCxcbiAgICAgICAgYWN0aW9uVGFnOiBlLmFjdGlvblRhZyxcbiAgICAgICAga2luZDogZS5raW5kLFxuICAgICAgICB0cmlnZ2VyOiBlLnRyaWdnZXIsXG4gICAgICB9XG4gICAgICBjb25zdCBtZXRhUHJvamVjdGlvbiA9IHByb2plY3RKc29uVmFsdWUobWV0YUlucHV0KVxuICAgICAgb3B0aW9ucz8ub25NZXRhUHJvamVjdGlvbj8uKHtcbiAgICAgICAgc3RhdHM6IG1ldGFQcm9qZWN0aW9uLnN0YXRzLFxuICAgICAgICBkb3duZ3JhZGU6IG1ldGFQcm9qZWN0aW9uLmRvd25ncmFkZSxcbiAgICAgIH0pXG4gICAgICBkb3duZ3JhZGUgPSBtZXJnZURvd25ncmFkZShkb3duZ3JhZGUsIG1ldGFQcm9qZWN0aW9uLmRvd25ncmFkZSlcbiAgICAgIHJldHVybiB3aXRoRG93bmdyYWRlKHtcbiAgICAgICAgLi4uYmFzZSxcbiAgICAgICAga2luZDogJ2RpYWdub3N0aWMnLFxuICAgICAgICBsYWJlbDogZS5jb2RlLFxuICAgICAgICBtZXRhOiBtZXRhUHJvamVjdGlvbi52YWx1ZSxcbiAgICAgIH0pXG4gICAgfVxuICAgIGRlZmF1bHQ6IHtcbiAgICAgIGlmICh0eXBlb2YgZXZlbnQudHlwZSAhPT0gJ3N0cmluZycgfHwgIWV2ZW50LnR5cGUuc3RhcnRzV2l0aCgndHJhY2U6JykpIHtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZFxuICAgICAgfVxuXG4gICAgICAvLyB0cmFjZTpyZWFjdC1yZW5kZXIgLyB0cmFjZTpyZWFjdC1zZWxlY3Rvclx1RkYxQVx1NTNFQVx1NEZERFx1NzU1OSBTbGltIG1ldGFcdUZGMDhcdTVCNTdcdTZCQjVcdTg4QzFcdTUyNkFcdTc1MzEgSnNvblZhbHVlIFx1NjI5NVx1NUY3MVx1NjI3Rlx1NjJDNVx1RkYwOVx1MzAwMlxuICAgICAgaWYgKGV2ZW50LnR5cGUgPT09ICd0cmFjZTpyZWFjdC1yZW5kZXInIHx8IGV2ZW50LnR5cGUgPT09ICd0cmFjZTpyZWFjdC1zZWxlY3RvcicpIHtcbiAgICAgICAgY29uc3QgZGF0YTogYW55ID0gKGV2ZW50IGFzIGFueSkuZGF0YVxuICAgICAgICBjb25zdCBtZXRhUHJvamVjdGlvbiA9IHByb2plY3RKc29uVmFsdWUoXG4gICAgICAgICAgaXNMaWdodExpa2VcbiAgICAgICAgICAgID8ge1xuICAgICAgICAgICAgICAgIGNvbXBvbmVudExhYmVsOiBkYXRhPy5jb21wb25lbnRMYWJlbCxcbiAgICAgICAgICAgICAgICBzZWxlY3RvcktleTogZGF0YT8uc2VsZWN0b3JLZXksXG4gICAgICAgICAgICAgICAgZmllbGRQYXRoczogZGF0YT8uZmllbGRQYXRocyxcbiAgICAgICAgICAgICAgICBzZWxlY3RvcklkOiBkYXRhPy5zZWxlY3RvcklkLFxuICAgICAgICAgICAgICAgIGxhbmU6IGRhdGE/LmxhbmUsXG4gICAgICAgICAgICAgICAgcHJvZHVjZXI6IGRhdGE/LnByb2R1Y2VyLFxuICAgICAgICAgICAgICAgIGZhbGxiYWNrUmVhc29uOiBkYXRhPy5mYWxsYmFja1JlYXNvbixcbiAgICAgICAgICAgICAgICByZWFkc0RpZ2VzdDogZGF0YT8ucmVhZHNEaWdlc3QsXG4gICAgICAgICAgICAgICAgZXF1YWxzS2luZDogZGF0YT8uZXF1YWxzS2luZCxcbiAgICAgICAgICAgICAgICBzdHJpY3RNb2RlUGhhc2U6IGRhdGE/LnN0cmljdE1vZGVQaGFzZSxcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgOiB7XG4gICAgICAgICAgICAgICAgY29tcG9uZW50TGFiZWw6IGRhdGE/LmNvbXBvbmVudExhYmVsLFxuICAgICAgICAgICAgICAgIHNlbGVjdG9yS2V5OiBkYXRhPy5zZWxlY3RvcktleSxcbiAgICAgICAgICAgICAgICBmaWVsZFBhdGhzOiBkYXRhPy5maWVsZFBhdGhzLFxuICAgICAgICAgICAgICAgIHNlbGVjdG9ySWQ6IGRhdGE/LnNlbGVjdG9ySWQsXG4gICAgICAgICAgICAgICAgbGFuZTogZGF0YT8ubGFuZSxcbiAgICAgICAgICAgICAgICBwcm9kdWNlcjogZGF0YT8ucHJvZHVjZXIsXG4gICAgICAgICAgICAgICAgZmFsbGJhY2tSZWFzb246IGRhdGE/LmZhbGxiYWNrUmVhc29uLFxuICAgICAgICAgICAgICAgIHJlYWRzRGlnZXN0OiBkYXRhPy5yZWFkc0RpZ2VzdCxcbiAgICAgICAgICAgICAgICBlcXVhbHNLaW5kOiBkYXRhPy5lcXVhbHNLaW5kLFxuICAgICAgICAgICAgICAgIHN0cmljdE1vZGVQaGFzZTogZGF0YT8uc3RyaWN0TW9kZVBoYXNlLFxuICAgICAgICAgICAgICAgIG1ldGE6IGRhdGE/Lm1ldGEsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgIClcbiAgICAgICAgb3B0aW9ucz8ub25NZXRhUHJvamVjdGlvbj8uKHtcbiAgICAgICAgICBzdGF0czogbWV0YVByb2plY3Rpb24uc3RhdHMsXG4gICAgICAgICAgZG93bmdyYWRlOiBtZXRhUHJvamVjdGlvbi5kb3duZ3JhZGUsXG4gICAgICAgIH0pXG4gICAgICAgIGRvd25ncmFkZSA9IG1lcmdlRG93bmdyYWRlKGRvd25ncmFkZSwgbWV0YVByb2plY3Rpb24uZG93bmdyYWRlKVxuICAgICAgICBjb25zdCBsYWJlbCA9XG4gICAgICAgICAgdHlwZW9mIGRhdGE/LmNvbXBvbmVudExhYmVsID09PSAnc3RyaW5nJyAmJiBkYXRhLmNvbXBvbmVudExhYmVsLmxlbmd0aCA+IDBcbiAgICAgICAgICAgID8gZGF0YS5jb21wb25lbnRMYWJlbFxuICAgICAgICAgICAgOiBldmVudC50eXBlID09PSAndHJhY2U6cmVhY3Qtc2VsZWN0b3InXG4gICAgICAgICAgICAgID8gJ3JlYWN0LXNlbGVjdG9yJ1xuICAgICAgICAgICAgICA6ICdyZWFjdC1yZW5kZXInXG4gICAgICAgIGNvbnN0IGxhc3QgPSBsYXN0VHhuQnlJbnN0YW5jZS5nZXQoaW5zdGFuY2VJZClcbiAgICAgICAgY29uc3QgdHhuU2VxRnJvbU1ldGEgPVxuICAgICAgICAgIHR5cGVvZiBkYXRhPy5tZXRhPy50eG5TZXEgPT09ICdudW1iZXInICYmIE51bWJlci5pc0Zpbml0ZShkYXRhLm1ldGEudHhuU2VxKSAmJiBkYXRhLm1ldGEudHhuU2VxID49IDBcbiAgICAgICAgICAgID8gTWF0aC5mbG9vcihkYXRhLm1ldGEudHhuU2VxKVxuICAgICAgICAgICAgOiB1bmRlZmluZWRcbiAgICAgICAgY29uc3QgdHhuSWRGcm9tTWV0YSA9IHR5cGVvZiBkYXRhPy5tZXRhPy50eG5JZCA9PT0gJ3N0cmluZycgJiYgZGF0YS5tZXRhLnR4bklkLmxlbmd0aCA+IDAgPyBkYXRhLm1ldGEudHhuSWQgOiB1bmRlZmluZWRcbiAgICAgICAgY29uc3QgdHhuSWRBbGlnbmVkID0gdHhuSWRGcm9tTWV0YSA/PyBiYXNlLnR4bklkID8/IGxhc3Q/LnR4bklkXG4gICAgICAgIGNvbnN0IHR4blNlcUFsaWduZWQgPSB0eG5TZXFGcm9tTWV0YSA/PyAoYmFzZS50eG5TZXEgPiAwID8gYmFzZS50eG5TZXEgOiAobGFzdD8udHhuU2VxID8/IGJhc2UudHhuU2VxKSlcbiAgICAgICAgcmV0dXJuIHdpdGhEb3duZ3JhZGUoe1xuICAgICAgICAgIC4uLmJhc2UsXG4gICAgICAgICAgdHhuSWQ6IHR4bklkQWxpZ25lZCxcbiAgICAgICAgICB0eG5TZXE6IHR4blNlcUFsaWduZWQsXG4gICAgICAgICAga2luZDogZXZlbnQudHlwZSA9PT0gJ3RyYWNlOnJlYWN0LXNlbGVjdG9yJyA/ICdyZWFjdC1zZWxlY3RvcicgOiAncmVhY3QtcmVuZGVyJyxcbiAgICAgICAgICBsYWJlbCxcbiAgICAgICAgICBtZXRhOiBtZXRhUHJvamVjdGlvbi52YWx1ZSxcbiAgICAgICAgfSlcbiAgICAgIH1cblxuICAgICAgLy8gdHJhY2U6c2VsZWN0b3I6ZXZhbFx1RkYxQVNlbGVjdG9yR3JhcGggXHU1NzI4IGNvbW1pdCBcdTUxODVcdTc2ODRcdTkxQ0RcdTdCOTcvXHU1NDdEXHU0RTJEXHU4QkMxXHU2MzZFXHVGRjA4XHU3NTI4XHU0RThFIHR4blx1MjE5MnNlbGVjdG9yXHUyMTkycmVuZGVyIFx1NTZFMFx1Njc5Q1x1OTRGRVx1RkYwOVx1MzAwMlxuICAgICAgaWYgKGV2ZW50LnR5cGUgPT09ICd0cmFjZTpzZWxlY3RvcjpldmFsJykge1xuICAgICAgICBjb25zdCBkYXRhOiBhbnkgPSAoZXZlbnQgYXMgYW55KS5kYXRhXG4gICAgICAgIGNvbnN0IG1ldGFJbnB1dCA9IHtcbiAgICAgICAgICBzZWxlY3RvcklkOiBkYXRhPy5zZWxlY3RvcklkLFxuICAgICAgICAgIGxhbmU6IGRhdGE/LmxhbmUsXG4gICAgICAgICAgcHJvZHVjZXI6IGRhdGE/LnByb2R1Y2VyLFxuICAgICAgICAgIGZhbGxiYWNrUmVhc29uOiBkYXRhPy5mYWxsYmFja1JlYXNvbixcbiAgICAgICAgICByZWFkc0RpZ2VzdDogZGF0YT8ucmVhZHNEaWdlc3QsXG4gICAgICAgICAgZXF1YWxzS2luZDogZGF0YT8uZXF1YWxzS2luZCxcbiAgICAgICAgICBjaGFuZ2VkOiBkYXRhPy5jaGFuZ2VkLFxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgbWV0YVByb2plY3Rpb24gPSBwcm9qZWN0SnNvblZhbHVlKG1ldGFJbnB1dClcbiAgICAgICAgb3B0aW9ucz8ub25NZXRhUHJvamVjdGlvbj8uKHtcbiAgICAgICAgICBzdGF0czogbWV0YVByb2plY3Rpb24uc3RhdHMsXG4gICAgICAgICAgZG93bmdyYWRlOiBtZXRhUHJvamVjdGlvbi5kb3duZ3JhZGUsXG4gICAgICAgIH0pXG4gICAgICAgIGRvd25ncmFkZSA9IG1lcmdlRG93bmdyYWRlKGRvd25ncmFkZSwgbWV0YVByb2plY3Rpb24uZG93bmdyYWRlKVxuXG4gICAgICAgIHJldHVybiB3aXRoRG93bmdyYWRlKHtcbiAgICAgICAgICAuLi5iYXNlLFxuICAgICAgICAgIGtpbmQ6ICdkZXZ0b29scycsXG4gICAgICAgICAgbGFiZWw6IGV2ZW50LnR5cGUsXG4gICAgICAgICAgbWV0YTogbWV0YVByb2plY3Rpb24udmFsdWUsXG4gICAgICAgIH0pXG4gICAgICB9XG5cbiAgICAgIC8vIHRyYWNlOmV4ZWMtdm1cdUZGMUFFeGVjIFZNIFx1NTQ3RFx1NEUyRC9cdTY3MkFcdTU0N0RcdTRFMkRcdThCQzFcdTYzNkVcdUZGMDgwNDlcdUZGMDlcdTMwMDJsaWdodCBcdTY4NjNcdTRGNERcdTRFNUZcdTRGRERcdTc1NTlcdTY3MDBcdTVDMEZcdTY0NThcdTg5ODFcdTVCNTdcdTZCQjVcdTMwMDJcbiAgICAgIGlmIChldmVudC50eXBlID09PSAndHJhY2U6ZXhlYy12bScpIHtcbiAgICAgICAgY29uc3QgZGF0YTogYW55ID0gKGV2ZW50IGFzIGFueSkuZGF0YVxuICAgICAgICBjb25zdCBtZXRhSW5wdXQgPSB7XG4gICAgICAgICAgdmVyc2lvbjogZGF0YT8udmVyc2lvbixcbiAgICAgICAgICBzdGFnZTogZGF0YT8uc3RhZ2UsXG4gICAgICAgICAgaGl0OiBkYXRhPy5oaXQsXG4gICAgICAgICAgcmVhc29uOiBkYXRhPy5yZWFzb24sXG4gICAgICAgICAgc2VydmljZUlkOiBkYXRhPy5zZXJ2aWNlSWQsXG4gICAgICAgICAgaW1wbElkOiBkYXRhPy5pbXBsSWQsXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBtZXRhUHJvamVjdGlvbiA9IHByb2plY3RKc29uVmFsdWUobWV0YUlucHV0KVxuICAgICAgICBvcHRpb25zPy5vbk1ldGFQcm9qZWN0aW9uPy4oe1xuICAgICAgICAgIHN0YXRzOiBtZXRhUHJvamVjdGlvbi5zdGF0cyxcbiAgICAgICAgICBkb3duZ3JhZGU6IG1ldGFQcm9qZWN0aW9uLmRvd25ncmFkZSxcbiAgICAgICAgfSlcbiAgICAgICAgZG93bmdyYWRlID0gbWVyZ2VEb3duZ3JhZGUoZG93bmdyYWRlLCBtZXRhUHJvamVjdGlvbi5kb3duZ3JhZGUpXG5cbiAgICAgICAgcmV0dXJuIHdpdGhEb3duZ3JhZGUoe1xuICAgICAgICAgIC4uLmJhc2UsXG4gICAgICAgICAga2luZDogJ2RldnRvb2xzJyxcbiAgICAgICAgICBsYWJlbDogZXZlbnQudHlwZSxcbiAgICAgICAgICBtZXRhOiBtZXRhUHJvamVjdGlvbi52YWx1ZSxcbiAgICAgICAgfSlcbiAgICAgIH1cblxuXHQgICAgICAvLyB0cmFjZTp0cmFpdDpjb252ZXJnZVx1RkYxQVx1NjUzNlx1NjU1Qlx1OEJDMVx1NjM2RVx1NUZDNVx1OTg3Qlx1NTNFRlx1NUJGQ1x1NTFGQVx1RkYwOEpzb25WYWx1ZSBcdTc4NkNcdTk1RThcdUZGMDlcdUZGMENcdTVFNzZcdTU3MjggbGlnaHQgXHU2ODYzXHU0RjREXHU4OEMxXHU1MjZBXHU5MUNEXHU1QjU3XHU2QkI1XHUzMDAyXG5cdCAgICAgIGlmIChldmVudC50eXBlID09PSAndHJhY2U6dHJhaXQ6Y29udmVyZ2UnKSB7XG5cdCAgICAgICAgY29uc3Qgc3RyaXBIZWF2eUxpZ2h0ID0gKHZhbHVlOiBKc29uVmFsdWUpOiBKc29uVmFsdWUgPT4ge1xuXHQgICAgICAgICAgaWYgKCF2YWx1ZSB8fCB0eXBlb2YgdmFsdWUgIT09ICdvYmplY3QnIHx8IEFycmF5LmlzQXJyYXkodmFsdWUpKSByZXR1cm4gdmFsdWVcblxuXHQgICAgICAgICAgY29uc3QgYW55VmFsdWUgPSB2YWx1ZSBhcyBhbnlcblx0ICAgICAgICAgIGNvbnN0IGRpcnR5ID0gYW55VmFsdWUuZGlydHlcbiAgICAgICAgICBjb25zdCBkaXJ0eVNsaW0gPVxuICAgICAgICAgICAgZGlydHkgJiYgdHlwZW9mIGRpcnR5ID09PSAnb2JqZWN0JyAmJiAhQXJyYXkuaXNBcnJheShkaXJ0eSlcbiAgICAgICAgICAgICAgPyB7XG4gICAgICAgICAgICAgICAgICBkaXJ0eUFsbDogKGRpcnR5IGFzIGFueSkuZGlydHlBbGwsXG4gICAgICAgICAgICAgICAgICAuLi4odHlwZW9mIChkaXJ0eSBhcyBhbnkpLnJlYXNvbiA9PT0gJ3N0cmluZycgPyB7IHJlYXNvbjogKGRpcnR5IGFzIGFueSkucmVhc29uIH0gOiBudWxsKSxcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIDogdW5kZWZpbmVkXG5cblx0ICAgICAgICAgIGNvbnN0IHsgdG9wMywgZGlydHlSb290cywgLi4ucmVzdCB9ID0gYW55VmFsdWVcblx0ICAgICAgICAgIHJldHVybiAoZGlydHlTbGltID8geyAuLi5yZXN0LCBkaXJ0eTogZGlydHlTbGltIH0gOiByZXN0KSBhcyBKc29uVmFsdWVcblx0ICAgICAgICB9XG5cblx0ICAgICAgICBjb25zdCBzdHJpcEhlYXZ5U2FtcGxlZCA9ICh2YWx1ZTogSnNvblZhbHVlKTogSnNvblZhbHVlID0+IHtcblx0ICAgICAgICAgIGlmICghdmFsdWUgfHwgdHlwZW9mIHZhbHVlICE9PSAnb2JqZWN0JyB8fCBBcnJheS5pc0FycmF5KHZhbHVlKSkgcmV0dXJuIHZhbHVlXG5cblx0ICAgICAgICAgIGNvbnN0IGFueVZhbHVlID0gdmFsdWUgYXMgYW55XG5cdCAgICAgICAgICBjb25zdCBkaXJ0eSA9IGFueVZhbHVlLmRpcnR5XG5cdCAgICAgICAgICBjb25zdCBkaXJ0eVNsaW0gPVxuXHQgICAgICAgICAgICBkaXJ0eSAmJiB0eXBlb2YgZGlydHkgPT09ICdvYmplY3QnICYmICFBcnJheS5pc0FycmF5KGRpcnR5KVxuXHQgICAgICAgICAgICAgID8ge1xuXHQgICAgICAgICAgICAgICAgICBkaXJ0eUFsbDogKGRpcnR5IGFzIGFueSkuZGlydHlBbGwsXG5cdCAgICAgICAgICAgICAgICAgIC4uLih0eXBlb2YgKGRpcnR5IGFzIGFueSkucmVhc29uID09PSAnc3RyaW5nJyA/IHsgcmVhc29uOiAoZGlydHkgYXMgYW55KS5yZWFzb24gfSA6IG51bGwpLFxuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgIDogdW5kZWZpbmVkXG5cblx0ICAgICAgICAgIGNvbnN0IHsgZGlydHlSb290cywgLi4ucmVzdCB9ID0gYW55VmFsdWVcblx0ICAgICAgICAgIHJldHVybiAoZGlydHlTbGltID8geyAuLi5yZXN0LCBkaXJ0eTogZGlydHlTbGltIH0gOiByZXN0KSBhcyBKc29uVmFsdWVcblx0ICAgICAgICB9XG5cblx0ICAgICAgICBjb25zdCBkYXRhID0gKGV2ZW50IGFzIEV4dHJhY3Q8RXZlbnQsIHsgcmVhZG9ubHkgdHlwZTogJ3RyYWNlOnRyYWl0OmNvbnZlcmdlJyB9PikuZGF0YVxuXHQgICAgICAgIGNvbnN0IG1ldGFJbnB1dCA9XG5cdCAgICAgICAgICBkaWFnbm9zdGljc0xldmVsID09PSAnbGlnaHQnXG5cdCAgICAgICAgICAgID8gc3RyaXBIZWF2eUxpZ2h0KGRhdGEpXG5cdCAgICAgICAgICAgIDogZGlhZ25vc3RpY3NMZXZlbCA9PT0gJ3NhbXBsZWQnXG5cdCAgICAgICAgICAgICAgPyBzdHJpcEhlYXZ5U2FtcGxlZChkYXRhKVxuXHQgICAgICAgICAgICAgIDogZGF0YVxuXHQgICAgICAgIGNvbnN0IG1ldGFQcm9qZWN0aW9uID0gcHJvamVjdEpzb25WYWx1ZShtZXRhSW5wdXQpXG5cdCAgICAgICAgb3B0aW9ucz8ub25NZXRhUHJvamVjdGlvbj8uKHtcblx0ICAgICAgICAgIHN0YXRzOiBtZXRhUHJvamVjdGlvbi5zdGF0cyxcblx0ICAgICAgICAgIGRvd25ncmFkZTogbWV0YVByb2plY3Rpb24uZG93bmdyYWRlLFxuICAgICAgICB9KVxuICAgICAgICBkb3duZ3JhZGUgPSBtZXJnZURvd25ncmFkZShkb3duZ3JhZGUsIG1ldGFQcm9qZWN0aW9uLmRvd25ncmFkZSlcblxuICAgICAgICByZXR1cm4gd2l0aERvd25ncmFkZSh7XG4gICAgICAgICAgLi4uYmFzZSxcbiAgICAgICAgICBraW5kOiAndHJhaXQ6Y29udmVyZ2UnLFxuICAgICAgICAgIGxhYmVsOiAndHJhaXQ6Y29udmVyZ2UnLFxuICAgICAgICAgIG1ldGE6IG1ldGFQcm9qZWN0aW9uLnZhbHVlLFxuICAgICAgICB9KVxuICAgICAgfVxuXG4gICAgICAvLyB0cmFjZTp0cmFpdDpjaGVja1x1RkYxQVx1NjgyMVx1OUE4Q1x1OEJDQVx1NjVBRFx1NUZDNVx1OTg3Qlx1NTNFRlx1NUJGQ1x1NTFGQVx1RkYwQ1x1NUU3Nlx1NTcyOCBsaWdodCBcdTY4NjNcdTRGNERcdTRGRERcdTYzMDEgU2xpbVx1RkYwOFx1NEUwRFx1NEUyMlx1NTE3M1x1OTUyRVx1NUI1N1x1NkJCNVx1RkYwOVx1MzAwMlxuICAgICAgaWYgKGV2ZW50LnR5cGUgPT09ICd0cmFjZTp0cmFpdDpjaGVjaycpIHtcblx0ICAgICAgICBjb25zdCBzdHJpcEhlYXZ5ID0gKHZhbHVlOiBKc29uVmFsdWUpOiBKc29uVmFsdWUgPT4ge1xuXHQgICAgICAgICAgaWYgKCF2YWx1ZSB8fCB0eXBlb2YgdmFsdWUgIT09ICdvYmplY3QnIHx8IEFycmF5LmlzQXJyYXkodmFsdWUpKSByZXR1cm4gdmFsdWVcbiAgICAgICAgICBjb25zdCBhbnlWYWx1ZSA9IHZhbHVlIGFzIGFueVxuICAgICAgICAgIGNvbnN0IGRlZ3JhZGVkID0gYW55VmFsdWUuZGVncmFkZWRcbiAgICAgICAgICBjb25zdCBkZWdyYWRlZFNsaW0gPVxuICAgICAgICAgICAgZGVncmFkZWQgJiYgdHlwZW9mIGRlZ3JhZGVkID09PSAnb2JqZWN0JyAmJiAhQXJyYXkuaXNBcnJheShkZWdyYWRlZClcbiAgICAgICAgICAgICAgPyB7IGtpbmQ6IChkZWdyYWRlZCBhcyBhbnkpLmtpbmQgfVxuICAgICAgICAgICAgICA6IHVuZGVmaW5lZFxuXG4gICAgICAgICAgY29uc3QgeyBkZWdyYWRlZDogX2RlZ3JhZGVkLCAuLi5yZXN0IH0gPSBhbnlWYWx1ZVxuICAgICAgICAgIHJldHVybiAoZGVncmFkZWRTbGltID8geyAuLi5yZXN0LCBkZWdyYWRlZDogZGVncmFkZWRTbGltIH0gOiByZXN0KSBhcyBKc29uVmFsdWVcblx0ICAgICAgICB9XG5cblx0ICAgICAgICBjb25zdCBkYXRhID0gKGV2ZW50IGFzIEV4dHJhY3Q8RXZlbnQsIHsgcmVhZG9ubHkgdHlwZTogJ3RyYWNlOnRyYWl0OmNoZWNrJyB9PikuZGF0YVxuXHQgICAgICAgIGNvbnN0IG1ldGFJbnB1dCA9IGlzTGlnaHRMaWtlID8gc3RyaXBIZWF2eShkYXRhKSA6IGRhdGFcblx0ICAgICAgICBjb25zdCBtZXRhUHJvamVjdGlvbiA9IHByb2plY3RKc29uVmFsdWUobWV0YUlucHV0KVxuICAgICAgICBvcHRpb25zPy5vbk1ldGFQcm9qZWN0aW9uPy4oe1xuICAgICAgICAgIHN0YXRzOiBtZXRhUHJvamVjdGlvbi5zdGF0cyxcbiAgICAgICAgICBkb3duZ3JhZGU6IG1ldGFQcm9qZWN0aW9uLmRvd25ncmFkZSxcbiAgICAgICAgfSlcbiAgICAgICAgZG93bmdyYWRlID0gbWVyZ2VEb3duZ3JhZGUoZG93bmdyYWRlLCBtZXRhUHJvamVjdGlvbi5kb3duZ3JhZGUpXG5cbiAgICAgICAgcmV0dXJuIHdpdGhEb3duZ3JhZGUoe1xuICAgICAgICAgIC4uLmJhc2UsXG4gICAgICAgICAga2luZDogJ3RyYWl0OmNoZWNrJyxcbiAgICAgICAgICBsYWJlbDogJ3RyYWl0OmNoZWNrJyxcbiAgICAgICAgICBtZXRhOiBtZXRhUHJvamVjdGlvbi52YWx1ZSxcbiAgICAgICAgfSlcbiAgICAgIH1cblxuICAgICAgLy8gdHJhY2U6dHJhaXQ6dmFsaWRhdGVcdUZGMUFcdTY4MjFcdTlBOENcdTUxQjNcdTdCNTZcdTY0NThcdTg5ODFcdTVGQzVcdTk4N0JcdTUzRUZcdTVCRkNcdTUxRkFcdUZGMENcdTRFMTRcdTU3MjggbGlnaHQgXHU2ODYzXHU0RjREXHU0RkREXHU2MzAxIFNsaW1cdUZGMDhcdTlFRDhcdThCQTRcdTRFMERcdTY0M0FcdTVFMjZcdTkxQ0RcdTVCNTdcdTZCQjVcdUZGMDlcdTMwMDJcbiAgICAgIGlmIChldmVudC50eXBlID09PSAndHJhY2U6dHJhaXQ6dmFsaWRhdGUnKSB7XG4gICAgICAgIGNvbnN0IGRhdGEgPSAoZXZlbnQgYXMgRXh0cmFjdDxFdmVudCwgeyByZWFkb25seSB0eXBlOiAndHJhY2U6dHJhaXQ6dmFsaWRhdGUnIH0+KS5kYXRhXG4gICAgICAgIGNvbnN0IG1ldGFQcm9qZWN0aW9uID0gcHJvamVjdEpzb25WYWx1ZShkYXRhKVxuICAgICAgICBvcHRpb25zPy5vbk1ldGFQcm9qZWN0aW9uPy4oe1xuICAgICAgICAgIHN0YXRzOiBtZXRhUHJvamVjdGlvbi5zdGF0cyxcbiAgICAgICAgICBkb3duZ3JhZGU6IG1ldGFQcm9qZWN0aW9uLmRvd25ncmFkZSxcbiAgICAgICAgfSlcbiAgICAgICAgZG93bmdyYWRlID0gbWVyZ2VEb3duZ3JhZGUoZG93bmdyYWRlLCBtZXRhUHJvamVjdGlvbi5kb3duZ3JhZGUpXG5cbiAgICAgICAgcmV0dXJuIHdpdGhEb3duZ3JhZGUoe1xuICAgICAgICAgIC4uLmJhc2UsXG4gICAgICAgICAga2luZDogJ3RyYWl0OnZhbGlkYXRlJyxcbiAgICAgICAgICBsYWJlbDogJ3RyYWl0OnZhbGlkYXRlJyxcbiAgICAgICAgICBtZXRhOiBtZXRhUHJvamVjdGlvbi52YWx1ZSxcbiAgICAgICAgfSlcbiAgICAgIH1cblxuICAgICAgLy8gdHJhY2U6bW9kdWxlOnRyYWl0c1x1RkYxQXRyYWl0cyBcdTY3MDBcdTdFQzhcdTVGRUJcdTcxNjdcdTVGQzVcdTk4N0JcdTUzRUZcdTVCRkNcdTUxRkFcdUZGMENcdTVFNzZcdTU3MjggbGlnaHQgXHU2ODYzXHU0RjREXHU0RkREXHU2MzAxIFNsaW1cdUZGMDhkaWdlc3QvY291bnRcdUZGMDlcdTMwMDJcblx0ICAgICAgaWYgKGV2ZW50LnR5cGUgPT09ICd0cmFjZTptb2R1bGU6dHJhaXRzJykge1xuXHQgICAgICAgIGNvbnN0IGRhdGE6IGFueSA9IChldmVudCBhcyBhbnkpLmRhdGFcblx0ICAgICAgICBjb25zdCBtZXRhSW5wdXQgPVxuXHQgICAgICAgICAgaXNMaWdodExpa2Vcblx0ICAgICAgICAgICAgPyB7XG5cdCAgICAgICAgICAgICAgICBkaWdlc3Q6IGRhdGE/LmRpZ2VzdCxcblx0ICAgICAgICAgICAgICAgIGNvdW50OiBkYXRhPy5jb3VudCxcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgOiB7XG4gICAgICAgICAgICAgICAgZGlnZXN0OiBkYXRhPy5kaWdlc3QsXG4gICAgICAgICAgICAgICAgY291bnQ6IGRhdGE/LmNvdW50LFxuICAgICAgICAgICAgICAgIHRyYWl0czogZGF0YT8udHJhaXRzLFxuICAgICAgICAgICAgICAgIHByb3ZlbmFuY2VJbmRleDogZGF0YT8ucHJvdmVuYW5jZUluZGV4LFxuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgbWV0YVByb2plY3Rpb24gPSBwcm9qZWN0SnNvblZhbHVlKG1ldGFJbnB1dClcbiAgICAgICAgb3B0aW9ucz8ub25NZXRhUHJvamVjdGlvbj8uKHtcbiAgICAgICAgICBzdGF0czogbWV0YVByb2plY3Rpb24uc3RhdHMsXG4gICAgICAgICAgZG93bmdyYWRlOiBtZXRhUHJvamVjdGlvbi5kb3duZ3JhZGUsXG4gICAgICAgIH0pXG4gICAgICAgIGRvd25ncmFkZSA9IG1lcmdlRG93bmdyYWRlKGRvd25ncmFkZSwgbWV0YVByb2plY3Rpb24uZG93bmdyYWRlKVxuXG4gICAgICAgIHJldHVybiB3aXRoRG93bmdyYWRlKHtcbiAgICAgICAgICAuLi5iYXNlLFxuICAgICAgICAgIGtpbmQ6ICdkZXZ0b29scycsXG4gICAgICAgICAgbGFiZWw6IGV2ZW50LnR5cGUsXG4gICAgICAgICAgbWV0YTogbWV0YVByb2plY3Rpb24udmFsdWUsXG4gICAgICAgIH0pXG4gICAgICB9XG5cbiAgICAgIC8vIHRyYWNlOm1vZHVsZTp0cmFpdHM6Y29uZmxpY3RcdUZGMUFcdTUxQjJcdTdBODFcdTdFQzZcdTgyODJcdTVGQzVcdTk4N0JcdTUzRUZcdTVCRkNcdTUxRkFcdUZGMENcdTkwN0ZcdTUxNERcdTRGOURcdThENTYgbGlmZWN5Y2xlOmVycm9yIFx1NzY4NFx1NjIyQVx1NjVBRCBtZXNzYWdlXHUzMDAyXG5cdCAgICAgIGlmIChldmVudC50eXBlID09PSAndHJhY2U6bW9kdWxlOnRyYWl0czpjb25mbGljdCcpIHtcblx0ICAgICAgICBjb25zdCBkYXRhOiBhbnkgPSAoZXZlbnQgYXMgYW55KS5kYXRhXG5cdCAgICAgICAgY29uc3QgbWV0YUlucHV0ID1cblx0ICAgICAgICAgIGlzTGlnaHRMaWtlXG5cdCAgICAgICAgICAgID8ge1xuXHQgICAgICAgICAgICAgICAgY29uZmxpY3RDb3VudDogZGF0YT8uY29uZmxpY3RDb3VudCxcblx0ICAgICAgICAgICAgICAgIHRyYWl0SWRzOiBkYXRhPy50cmFpdElkcyxcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgOiB7XG4gICAgICAgICAgICAgICAgY29uZmxpY3RDb3VudDogZGF0YT8uY29uZmxpY3RDb3VudCxcbiAgICAgICAgICAgICAgICBjb25mbGljdHM6IGRhdGE/LmNvbmZsaWN0cyxcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IG1ldGFQcm9qZWN0aW9uID0gcHJvamVjdEpzb25WYWx1ZShtZXRhSW5wdXQpXG4gICAgICAgIG9wdGlvbnM/Lm9uTWV0YVByb2plY3Rpb24/Lih7XG4gICAgICAgICAgc3RhdHM6IG1ldGFQcm9qZWN0aW9uLnN0YXRzLFxuICAgICAgICAgIGRvd25ncmFkZTogbWV0YVByb2plY3Rpb24uZG93bmdyYWRlLFxuICAgICAgICB9KVxuICAgICAgICBkb3duZ3JhZGUgPSBtZXJnZURvd25ncmFkZShkb3duZ3JhZGUsIG1ldGFQcm9qZWN0aW9uLmRvd25ncmFkZSlcblxuICAgICAgICByZXR1cm4gd2l0aERvd25ncmFkZSh7XG4gICAgICAgICAgLi4uYmFzZSxcbiAgICAgICAgICBraW5kOiAnZGV2dG9vbHMnLFxuICAgICAgICAgIGxhYmVsOiBldmVudC50eXBlLFxuICAgICAgICAgIG1ldGE6IG1ldGFQcm9qZWN0aW9uLnZhbHVlLFxuICAgICAgICB9KVxuICAgICAgfVxuXG4gICAgICAvLyB0cmFjZTptb2R1bGU6ZGVzY3JpcHRvclx1RkYxQVx1NTcyOCBsaWdodCBcdTY4NjNcdTRGNERcdTRFNUZcdTRGRERcdTc1NTlcdTUxNzNcdTk1MkVcdTk1MUFcdTcwQjlcdUZGMDhcdTkwN0ZcdTUxNEQgZGF0YSBcdTg4QUJcdTVCOENcdTUxNjhcdTg4QzFcdTUyNkFcdUZGMDlcdTMwMDJcblx0ICAgICAgaWYgKGV2ZW50LnR5cGUgPT09ICd0cmFjZTptb2R1bGU6ZGVzY3JpcHRvcicpIHtcblx0ICAgICAgICBjb25zdCBkYXRhOiBhbnkgPSAoZXZlbnQgYXMgYW55KS5kYXRhXG5cdCAgICAgICAgY29uc3QgbWV0YUlucHV0ID1cblx0ICAgICAgICAgIGlzTGlnaHRMaWtlXG5cdCAgICAgICAgICAgID8ge1xuXHQgICAgICAgICAgICAgICAgaWQ6IGRhdGE/LmlkLFxuXHQgICAgICAgICAgICAgICAgdHJhaXRzOiBkYXRhPy50cmFpdHMsXG5cdCAgICAgICAgICAgICAgICBzb3VyY2U6IGRhdGE/LnNvdXJjZSxcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgOiB7IGRhdGEgfVxuXG4gICAgICAgIGNvbnN0IG1ldGFQcm9qZWN0aW9uID0gcHJvamVjdEpzb25WYWx1ZShtZXRhSW5wdXQpXG4gICAgICAgIG9wdGlvbnM/Lm9uTWV0YVByb2plY3Rpb24/Lih7XG4gICAgICAgICAgc3RhdHM6IG1ldGFQcm9qZWN0aW9uLnN0YXRzLFxuICAgICAgICAgIGRvd25ncmFkZTogbWV0YVByb2plY3Rpb24uZG93bmdyYWRlLFxuICAgICAgICB9KVxuICAgICAgICBkb3duZ3JhZGUgPSBtZXJnZURvd25ncmFkZShkb3duZ3JhZGUsIG1ldGFQcm9qZWN0aW9uLmRvd25ncmFkZSlcblxuICAgICAgICByZXR1cm4gd2l0aERvd25ncmFkZSh7XG4gICAgICAgICAgLi4uYmFzZSxcbiAgICAgICAgICBraW5kOiAnZGV2dG9vbHMnLFxuICAgICAgICAgIGxhYmVsOiBldmVudC50eXBlLFxuICAgICAgICAgIG1ldGE6IG1ldGFQcm9qZWN0aW9uLnZhbHVlLFxuICAgICAgICB9KVxuICAgICAgfVxuXG4gICAgICAvLyB0cmFjZTplZmZlY3RvcFx1RkYxQVx1NEZERFx1NzU1OSBTbGltIG9wIG1ldGFcdUZGMENcdTVFNzZcdTRGMThcdTUxNDhcdTRGN0ZcdTc1MjggRWZmZWN0T3AubWV0YS5tb2R1bGVJZFx1RkYwOFx1ODJFNVx1NUI1OFx1NTcyOFx1RkYwOVx1MzAwMlxuICAgICAgaWYgKGV2ZW50LnR5cGUgPT09ICd0cmFjZTplZmZlY3RvcCcpIHtcbiAgICAgICAgY29uc3QgZGF0YTogYW55ID0gKGV2ZW50IGFzIGFueSkuZGF0YVxuICAgICAgICBjb25zdCBvcE1ldGE6IGFueSA9IGRhdGE/Lm1ldGFcbiAgICAgICAgY29uc3Qgb3BLaW5kID0gKGRhdGE/LmtpbmQgPz8gJ3NlcnZpY2UnKSBhcyBSdW50aW1lRGVidWdFdmVudEtpbmRcbiAgICAgICAgY29uc3QgbGFiZWwgPSB0eXBlb2YgZGF0YT8ubmFtZSA9PT0gJ3N0cmluZycgPyBkYXRhLm5hbWUgOiAnZWZmZWN0b3AnXG4gICAgICAgIGNvbnN0IG1vZHVsZUlkMiA9IHR5cGVvZiBvcE1ldGE/Lm1vZHVsZUlkID09PSAnc3RyaW5nJyA/IG9wTWV0YS5tb2R1bGVJZCA6IG1vZHVsZUlkXG4gICAgICAgIGNvbnN0IHR4bklkMiA9IHR5cGVvZiBvcE1ldGE/LnR4bklkID09PSAnc3RyaW5nJyAmJiBvcE1ldGEudHhuSWQubGVuZ3RoID4gMCA/IG9wTWV0YS50eG5JZCA6IGJhc2UudHhuSWRcbiAgICAgICAgY29uc3QgdHhuU2VxMiA9XG4gICAgICAgICAgdHlwZW9mIG9wTWV0YT8udHhuU2VxID09PSAnbnVtYmVyJyAmJiBOdW1iZXIuaXNGaW5pdGUob3BNZXRhLnR4blNlcSkgJiYgb3BNZXRhLnR4blNlcSA+PSAwXG4gICAgICAgICAgICA/IE1hdGguZmxvb3Iob3BNZXRhLnR4blNlcSlcbiAgICAgICAgICAgIDogYmFzZS50eG5TZXFcblxuXHQgICAgICAgIGNvbnN0IG1ldGFJbnB1dCA9XG5cdCAgICAgICAgICBpc0xpZ2h0TGlrZVxuXHQgICAgICAgICAgICA/IHtcblx0ICAgICAgICAgICAgICAgIGlkOiBkYXRhPy5pZCxcblx0ICAgICAgICAgICAgICAgIGtpbmQ6IGRhdGE/LmtpbmQsXG5cdCAgICAgICAgICAgICAgICBuYW1lOiBkYXRhPy5uYW1lLFxuICAgICAgICAgICAgICAgIG1ldGE6IG9wTWV0YSxcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgOiB7XG4gICAgICAgICAgICAgICAgaWQ6IGRhdGE/LmlkLFxuICAgICAgICAgICAgICAgIGtpbmQ6IGRhdGE/LmtpbmQsXG4gICAgICAgICAgICAgICAgbmFtZTogZGF0YT8ubmFtZSxcbiAgICAgICAgICAgICAgICBwYXlsb2FkOiBkYXRhPy5wYXlsb2FkLFxuICAgICAgICAgICAgICAgIG1ldGE6IG9wTWV0YSxcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IG1ldGFQcm9qZWN0aW9uID0gcHJvamVjdEpzb25WYWx1ZShtZXRhSW5wdXQpXG4gICAgICAgIG9wdGlvbnM/Lm9uTWV0YVByb2plY3Rpb24/Lih7XG4gICAgICAgICAgc3RhdHM6IG1ldGFQcm9qZWN0aW9uLnN0YXRzLFxuICAgICAgICAgIGRvd25ncmFkZTogbWV0YVByb2plY3Rpb24uZG93bmdyYWRlLFxuICAgICAgICB9KVxuICAgICAgICBkb3duZ3JhZGUgPSBtZXJnZURvd25ncmFkZShkb3duZ3JhZGUsIG1ldGFQcm9qZWN0aW9uLmRvd25ncmFkZSlcblxuICAgICAgICByZXR1cm4gd2l0aERvd25ncmFkZSh7XG4gICAgICAgICAgLi4uYmFzZSxcbiAgICAgICAgICBtb2R1bGVJZDogbW9kdWxlSWQyLFxuICAgICAgICAgIHR4bklkOiB0eG5JZDIsXG4gICAgICAgICAgdHhuU2VxOiB0eG5TZXEyLFxuICAgICAgICAgIGtpbmQ6IG9wS2luZCxcbiAgICAgICAgICBsYWJlbCxcbiAgICAgICAgICBtZXRhOiBtZXRhUHJvamVjdGlvbi52YWx1ZSxcbiAgICAgICAgfSlcbiAgICAgIH1cblxuXHQgICAgICAvLyBcdTUxNzZcdTRFRDYgdHJhY2U6Klx1RkYxQVx1N0VERlx1NEUwMFx1NUY1Mlx1N0M3Qlx1NEUzQSBkZXZ0b29sc1x1RkYwQ1x1NUU3Nlx1NjMwOVx1Njg2M1x1NEY0RFx1ODhDMVx1NTI2QSBtZXRhXHUzMDAyXG5cdCAgICAgIGNvbnN0IG1ldGFQcm9qZWN0aW9uID0gcHJvamVjdEpzb25WYWx1ZShcblx0ICAgICAgICBpc0xpZ2h0TGlrZVxuXHQgICAgICAgICAgPyB7XG5cdCAgICAgICAgICAgICAgZGF0YTogdW5kZWZpbmVkLFxuXHQgICAgICAgICAgICB9XG4gICAgICAgICAgOiB7XG4gICAgICAgICAgICAgIGRhdGE6IChldmVudCBhcyBhbnkpLmRhdGEsXG4gICAgICAgICAgICB9LFxuICAgICAgKVxuICAgICAgb3B0aW9ucz8ub25NZXRhUHJvamVjdGlvbj8uKHtcbiAgICAgICAgc3RhdHM6IG1ldGFQcm9qZWN0aW9uLnN0YXRzLFxuICAgICAgICBkb3duZ3JhZGU6IG1ldGFQcm9qZWN0aW9uLmRvd25ncmFkZSxcbiAgICAgIH0pXG4gICAgICBkb3duZ3JhZGUgPSBtZXJnZURvd25ncmFkZShkb3duZ3JhZGUsIG1ldGFQcm9qZWN0aW9uLmRvd25ncmFkZSlcbiAgICAgIHJldHVybiB3aXRoRG93bmdyYWRlKHtcbiAgICAgICAgLi4uYmFzZSxcbiAgICAgICAga2luZDogJ2RldnRvb2xzJyxcbiAgICAgICAgbGFiZWw6IGV2ZW50LnR5cGUsXG4gICAgICAgIG1ldGE6IG1ldGFQcm9qZWN0aW9uLnZhbHVlLFxuICAgICAgfSlcbiAgICB9XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBDYXVzZSB9IGZyb20gJ2VmZmVjdCdcblxuZXhwb3J0IHR5cGUgRG93bmdyYWRlUmVhc29uID0gJ25vbl9zZXJpYWxpemFibGUnIHwgJ292ZXJzaXplZCcgfCAndW5rbm93bidcblxuZXhwb3J0IGludGVyZmFjZSBTZXJpYWxpemFibGVFcnJvclN1bW1hcnkge1xuICByZWFkb25seSBtZXNzYWdlOiBzdHJpbmdcbiAgcmVhZG9ubHkgbmFtZT86IHN0cmluZ1xuICByZWFkb25seSBjb2RlPzogc3RyaW5nXG4gIHJlYWRvbmx5IGhpbnQ/OiBzdHJpbmdcbn1cblxuZXhwb3J0IGludGVyZmFjZSBFcnJvclN1bW1hcnlSZXN1bHQge1xuICByZWFkb25seSBlcnJvclN1bW1hcnk6IFNlcmlhbGl6YWJsZUVycm9yU3VtbWFyeVxuICByZWFkb25seSBkb3duZ3JhZGU/OiBEb3duZ3JhZGVSZWFzb25cbn1cblxuY29uc3QgdHJ1bmNhdGUgPSAodmFsdWU6IHN0cmluZywgbWF4TGVuOiBudW1iZXIpOiB7IHJlYWRvbmx5IHZhbHVlOiBzdHJpbmc7IHJlYWRvbmx5IHRydW5jYXRlZDogYm9vbGVhbiB9ID0+IHtcbiAgaWYgKHZhbHVlLmxlbmd0aCA8PSBtYXhMZW4pIHJldHVybiB7IHZhbHVlLCB0cnVuY2F0ZWQ6IGZhbHNlIH1cbiAgcmV0dXJuIHsgdmFsdWU6IHZhbHVlLnNsaWNlKDAsIG1heExlbiksIHRydW5jYXRlZDogdHJ1ZSB9XG59XG5cbmNvbnN0IHNhZmVTdHJpbmdpZnkgPSAodmFsdWU6IHVua25vd24pOiB7IHJlYWRvbmx5IG9rOiB0cnVlOyByZWFkb25seSBqc29uOiBzdHJpbmcgfSB8IHsgcmVhZG9ubHkgb2s6IGZhbHNlIH0gPT4ge1xuICB0cnkge1xuICAgIHJldHVybiB7IG9rOiB0cnVlLCBqc29uOiBKU09OLnN0cmluZ2lmeSh2YWx1ZSkgfVxuICB9IGNhdGNoIHtcbiAgICByZXR1cm4geyBvazogZmFsc2UgfVxuICB9XG59XG5cbmNvbnN0IGdldE1lc3NhZ2VGcm9tVW5rbm93biA9IChjYXVzZTogdW5rbm93bik6IHN0cmluZyA9PiB7XG4gIGlmICh0eXBlb2YgY2F1c2UgPT09ICdzdHJpbmcnKSByZXR1cm4gY2F1c2VcbiAgaWYgKHR5cGVvZiBjYXVzZSA9PT0gJ251bWJlcicgfHwgdHlwZW9mIGNhdXNlID09PSAnYm9vbGVhbicgfHwgdHlwZW9mIGNhdXNlID09PSAnYmlnaW50JykgcmV0dXJuIFN0cmluZyhjYXVzZSlcbiAgaWYgKGNhdXNlIGluc3RhbmNlb2YgRXJyb3IpIHJldHVybiBjYXVzZS5tZXNzYWdlIHx8IGNhdXNlLm5hbWUgfHwgJ0Vycm9yJ1xuICBpZiAoY2F1c2UgJiYgdHlwZW9mIGNhdXNlID09PSAnb2JqZWN0JyAmJiAnbWVzc2FnZScgaW4gKGNhdXNlIGFzIGFueSkgJiYgdHlwZW9mIChjYXVzZSBhcyBhbnkpLm1lc3NhZ2UgPT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIChjYXVzZSBhcyBhbnkpLm1lc3NhZ2UgYXMgc3RyaW5nXG4gIH1cblxuICAvLyBUcnkgRWZmZWN0IENhdXNlIHByZXR0eSAoYmVzdC1lZmZvcnQpLiBUaGlzIG1heSBpbmNsdWRlIG1vcmUgZGV0YWlscyB0aGFuIG5lZWRlZCxcbiAgLy8gc28gY2FsbGVycyBNVVNUIHN0aWxsIHRyZWF0IGl0IGFzIGFuIHVudHJ1c3RlZC9vdmVyc2l6ZWQgc3RyaW5nIGFuZCB0cnVuY2F0ZS5cbiAgdHJ5IHtcbiAgICBjb25zdCBwcmV0dHkgPSBDYXVzZS5wcmV0dHkoY2F1c2UgYXMgQ2F1c2UuQ2F1c2U8dW5rbm93bj4sIHsgcmVuZGVyRXJyb3JDYXVzZTogdHJ1ZSB9KVxuICAgIGlmICh0eXBlb2YgcHJldHR5ID09PSAnc3RyaW5nJyAmJiBwcmV0dHkubGVuZ3RoID4gMCkgcmV0dXJuIHByZXR0eVxuICB9IGNhdGNoIHtcbiAgICAvLyBpZ25vcmVcbiAgfVxuXG4gIHJldHVybiAnVW5rbm93biBlcnJvcidcbn1cblxuZXhwb3J0IGNvbnN0IHRvU2VyaWFsaXphYmxlRXJyb3JTdW1tYXJ5ID0gKFxuICBjYXVzZTogdW5rbm93bixcbiAgb3B0aW9ucz86IHtcbiAgICByZWFkb25seSBtYXhNZXNzYWdlTGVuZ3RoPzogbnVtYmVyXG4gIH0sXG4pOiBFcnJvclN1bW1hcnlSZXN1bHQgPT4ge1xuICBjb25zdCBtYXhNZXNzYWdlTGVuZ3RoID0gb3B0aW9ucz8ubWF4TWVzc2FnZUxlbmd0aCA/PyAyNTZcblxuICBjb25zdCBtZXNzYWdlUmF3ID0gZ2V0TWVzc2FnZUZyb21Vbmtub3duKGNhdXNlKVxuICBjb25zdCB7IHZhbHVlOiBtZXNzYWdlLCB0cnVuY2F0ZWQgfSA9IHRydW5jYXRlKG1lc3NhZ2VSYXcsIG1heE1lc3NhZ2VMZW5ndGgpXG5cbiAgY29uc3Qgc3VtbWFyeTogeyBtZXNzYWdlOiBzdHJpbmc7IG5hbWU/OiBzdHJpbmc7IGNvZGU/OiBzdHJpbmc7IGhpbnQ/OiBzdHJpbmcgfSA9IHtcbiAgICBtZXNzYWdlLFxuICB9XG5cbiAgaWYgKGNhdXNlIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICBpZiAoY2F1c2UubmFtZSAmJiBjYXVzZS5uYW1lICE9PSAnRXJyb3InKSBzdW1tYXJ5Lm5hbWUgPSBjYXVzZS5uYW1lXG4gICAgY29uc3QgYW55Q2F1c2UgPSBjYXVzZSBhcyBhbnlcbiAgICBpZiAodHlwZW9mIGFueUNhdXNlLmNvZGUgPT09ICdzdHJpbmcnICYmIGFueUNhdXNlLmNvZGUubGVuZ3RoID4gMCkgc3VtbWFyeS5jb2RlID0gYW55Q2F1c2UuY29kZVxuICAgIGVsc2UgaWYgKHR5cGVvZiBhbnlDYXVzZS5jb2RlID09PSAnbnVtYmVyJyAmJiBOdW1iZXIuaXNGaW5pdGUoYW55Q2F1c2UuY29kZSkpIHN1bW1hcnkuY29kZSA9IFN0cmluZyhhbnlDYXVzZS5jb2RlKVxuICAgIGlmICh0eXBlb2YgYW55Q2F1c2UuaGludCA9PT0gJ3N0cmluZycgJiYgYW55Q2F1c2UuaGludC5sZW5ndGggPiAwKSBzdW1tYXJ5LmhpbnQgPSBhbnlDYXVzZS5oaW50XG4gICAgcmV0dXJuIHtcbiAgICAgIGVycm9yU3VtbWFyeTogc3VtbWFyeSxcbiAgICAgIGRvd25ncmFkZTogdHJ1bmNhdGVkID8gJ292ZXJzaXplZCcgOiB1bmRlZmluZWQsXG4gICAgfVxuICB9XG5cbiAgaWYgKGNhdXNlICYmIHR5cGVvZiBjYXVzZSA9PT0gJ29iamVjdCcpIHtcbiAgICBjb25zdCBhbnlDYXVzZSA9IGNhdXNlIGFzIGFueVxuICAgIGlmICh0eXBlb2YgYW55Q2F1c2UubmFtZSA9PT0gJ3N0cmluZycgJiYgYW55Q2F1c2UubmFtZS5sZW5ndGggPiAwKSBzdW1tYXJ5Lm5hbWUgPSBhbnlDYXVzZS5uYW1lXG4gICAgaWYgKHR5cGVvZiBhbnlDYXVzZS5jb2RlID09PSAnc3RyaW5nJyAmJiBhbnlDYXVzZS5jb2RlLmxlbmd0aCA+IDApIHN1bW1hcnkuY29kZSA9IGFueUNhdXNlLmNvZGVcbiAgICBpZiAodHlwZW9mIGFueUNhdXNlLmhpbnQgPT09ICdzdHJpbmcnICYmIGFueUNhdXNlLmhpbnQubGVuZ3RoID4gMCkgc3VtbWFyeS5oaW50ID0gYW55Q2F1c2UuaGludFxuICB9XG5cbiAgLy8gSWYgdGhlIG9yaWdpbmFsIGNhdXNlIGlzbid0IEpTT04tc2VyaWFsaXphYmxlLCBtYXJrIGl0IGV4cGxpY2l0bHkuXG4gIGNvbnN0IHN0cmluZ2lmeVJlc3VsdCA9IHNhZmVTdHJpbmdpZnkoY2F1c2UpXG4gIGlmICghc3RyaW5naWZ5UmVzdWx0Lm9rKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGVycm9yU3VtbWFyeTogc3VtbWFyeSxcbiAgICAgIGRvd25ncmFkZTogJ25vbl9zZXJpYWxpemFibGUnLFxuICAgIH1cbiAgfVxuXG4gIGlmICh0cnVuY2F0ZWQpIHtcbiAgICByZXR1cm4ge1xuICAgICAgZXJyb3JTdW1tYXJ5OiBzdW1tYXJ5LFxuICAgICAgZG93bmdyYWRlOiAnb3ZlcnNpemVkJyxcbiAgICB9XG4gIH1cblxuICBpZiAobWVzc2FnZSA9PT0gJ1Vua25vd24gZXJyb3InKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGVycm9yU3VtbWFyeTogc3VtbWFyeSxcbiAgICAgIGRvd25ncmFkZTogJ3Vua25vd24nLFxuICAgIH1cbiAgfVxuXG4g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Q25DLGNBQU0sT0FBYSxNQUFjO0FBQ2pDLGNBQU0sU0FBYyxNQUFNO0FBQzFCLGNBQU0sU0FBVSxNQUFNLFFBQVE7QUFDOUIsY0FBTSxRQUFRLE9BQU8sTUFBTSxTQUFTLFdBQVcsS0FBSyxPQUFPO0FBQzNELGNBQU0sWUFBWSxPQUFPLFFBQVEsYUFBYSxXQUFXLE9BQU8sV0FBVztBQUMzRSxjQUFNLFNBQVMsT0FBTyxRQUFRLFVBQVUsWUFBWSxPQUFPLE1BQU0sU0FBUyxJQUFJLE9BQU8sUUFBUSxLQUFLO0FBQ2xHLGNBQU0sVUFDSixPQUFPLFFBQVEsV0FBVyxZQUFZLE9BQU8sU0FBUyxPQUFPLE1BQU0sS0FBSyxPQUFPLFVBQVUsSUFDckYsS0FBSyxNQUFNLE9BQU8sTUFBTSxJQUN4QixLQUFLO0FBRVYsY0FBTSxZQUNKLGNBQ0k7QUFBQSxVQUNFLElBQUksTUFBTTtBQUFBLFVBQ1YsTUFBTSxNQUFNO0FBQUEsVUFDWixNQUFNLE1BQU07QUFBQSxVQUNiLE1BQU07QUFBQSxRQUNSLElBQ0E7QUFBQSxVQUNFLElBQUksTUFBTTtBQUFBLFVBQ1YsTUFBTSxNQUFNO0FBQUEsVUFDWixNQUFNLE1BQU07QUFBQSxVQUNaLFNBQVMsTUFBTTtBQUFBLFVBQ2YsTUFBTTtBQUFBLFFBQ1I7QUFFTixjQUFNQSxrQkFBaUIsaUJBQWlCLFNBQVM7QUFDakQsaUJBQVMsbUJBQW1CO0FBQUEsVUFDMUIsT0FBT0EsZ0JBQWU7QUFBQSxVQUN0QixXQUFXQSxnQkFBZTtBQUFBLFFBQzVCLENBQUM7QUFDRCxvQkFBWSxlQUFlLFdBQVdBLGdCQUFlLFNBQVM7QUFFOUQsZUFBTyxjQUFjO0FBQUEsVUFDbkIsR0FBRztBQUFBLFVBQ0gsVUFBVTtBQUFBLFVBQ1YsT0FBTztBQUFBLFVBQ1AsUUFBUTtBQUFBLFVBQ1IsTUFBTTtBQUFBLFVBQ047QUFBQSxVQUNBLE1BQU1BLGdCQUFlO0FBQUEsUUFDdkIsQ0FBQztBQUFBLE1BQ0g7QUFHQyxZQUFNLGlCQUFpQjtBQUFBLFFBQ3JCLGNBQ0k7QUFBQSxVQUNFLE1BQU07QUFBQSxRQUNSLElBQ0Q7QUFBQSxVQUNFLE1BQU8sTUFBYztBQUFBLFFBQ3ZCO0FBQUEsTUFDTjtBQUNBLGVBQVMsbUJBQW1CO0FBQUEsUUFDMUIsT0FBTyxlQUFlO0FBQUEsUUFDdEIsV0FBVyxlQUFlO0FBQUEsTUFDNUIsQ0FBQztBQUNELGtCQUFZLGVBQWUsV0FBVyxlQUFlLFNBQVM7QUFDOUQsYUFBTyxjQUFjO0FBQUEsUUFDbkIsR0FBRztBQUFBLFFBQ0gsTUFBTTtBQUFBLFFBQ04sT0FBTyxNQUFNO0FBQUEsUUFDYixNQUFNLGVBQWU7QUFBQSxNQUN2QixDQUFDO0FBQUEsSUFDSDtBQUFBLEVBQ0Y7QUFDRjsiLAogICJuYW1lcyI6IFsiQ2F1c2UiLCAiQ2F1c2UiLCAiZGlhZ25vc3RpY3NMZXZlbCIsICJtZXRhUHJvamVjdGlvbiJdCn0K