@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,1696 @@
1
+ // @logixjs/core subpath bundles for @logixjs/sandbox
2
+
3
+ import {
4
+ getRuntimeInternals
5
+ } from "./chunk-7GPAF2UK.js";
6
+ import {
7
+ isDevEnv,
8
+ shouldNoopInSyncTransactionFiber
9
+ } from "./chunk-YMVMZA3U.js";
10
+ import {
11
+ makeEvidenceSink
12
+ } from "./chunk-W365QUZ5.js";
13
+ import {
14
+ currentDiagnosticsLevel,
15
+ record,
16
+ toRuntimeDebugEventRef,
17
+ toSerializableErrorSummary
18
+ } from "./chunk-SH7TP5CJ.js";
19
+ import {
20
+ projectJsonValue
21
+ } from "./chunk-SI5OKFFY.js";
22
+
23
+ // ../logix-core/src/internal/runtime/core/process/meta.ts
24
+ var PROCESS_META = /* @__PURE__ */ Symbol.for("@logixjs/core/processMeta");
25
+ var defineHidden = (target, key, value) => {
26
+ Object.defineProperty(target, key, {
27
+ value,
28
+ enumerable: false,
29
+ configurable: true,
30
+ writable: false
31
+ });
32
+ };
33
+ var getMeta = (effect) => effect[PROCESS_META];
34
+ var getDefinition = (effect) => getMeta(effect)?.definition;
35
+ var attachMeta = (effect, meta) => {
36
+ defineHidden(effect, PROCESS_META, meta);
37
+ return effect;
38
+ };
39
+
40
+ // ../logix-core/src/internal/observability/evidenceCollector.ts
41
+ import { Context, Effect, FiberRef, Layer } from "../effect.js";
42
+ var EvidenceCollectorTagImpl = class extends Context.Tag("@logixjs/core/EvidenceCollector")() {
43
+ };
44
+ var EvidenceCollectorTag = EvidenceCollectorTagImpl;
45
+ var evidenceCollectorLayer = (collector) => Layer.succeed(EvidenceCollectorTag, collector);
46
+ var isRecord = (value) => typeof value === "object" && value !== null && !Array.isArray(value);
47
+ var makeEvidenceCollector = (session) => {
48
+ const sink = makeEvidenceSink(session);
49
+ const convergeStaticIrByDigest = /* @__PURE__ */ new Map();
50
+ let kernelImplementationRef;
51
+ let runtimeServicesEvidence;
52
+ const exportBudget = {
53
+ dropped: 0,
54
+ oversized: 0,
55
+ nonSerializable: 0
56
+ };
57
+ const debugSink = {
58
+ record: (event) => Effect.gen(function* () {
59
+ const level = yield* FiberRef.get(currentDiagnosticsLevel);
60
+ const instanceIdRaw = event.instanceId;
61
+ const instanceId = typeof instanceIdRaw === "string" && instanceIdRaw.length > 0 ? instanceIdRaw : "unknown";
62
+ const eventSeq = level === "off" ? void 0 : session.local.nextSeq("eventSeq", instanceId);
63
+ const ref = toRuntimeDebugEventRef(event, {
64
+ diagnosticsLevel: level,
65
+ eventSeq,
66
+ onMetaProjection: ({ stats }) => {
67
+ exportBudget.dropped += stats.dropped;
68
+ exportBudget.oversized += stats.oversized;
69
+ }
70
+ });
71
+ if (!ref) return;
72
+ const projected = projectJsonValue(ref);
73
+ exportBudget.dropped += projected.stats.dropped;
74
+ exportBudget.oversized += projected.stats.oversized;
75
+ exportBudget.nonSerializable += projected.stats.nonSerializable;
76
+ sink.record("debug:event", projected.value, {
77
+ timestamp: ref.timestamp
78
+ });
79
+ })
80
+ };
81
+ const registerConvergeStaticIr = (staticIr) => {
82
+ if (!isRecord(staticIr)) return;
83
+ const digest = staticIr.staticIrDigest;
84
+ if (typeof digest !== "string" || digest.length === 0) return;
85
+ const projected = projectJsonValue(staticIr);
86
+ exportBudget.dropped += projected.stats.dropped;
87
+ exportBudget.oversized += projected.stats.oversized;
88
+ exportBudget.nonSerializable += projected.stats.nonSerializable;
89
+ convergeStaticIrByDigest.set(digest, projected.value);
90
+ };
91
+ const setKernelImplementationRef = (ref) => {
92
+ const projected = projectJsonValue(ref);
93
+ exportBudget.dropped += projected.stats.dropped;
94
+ exportBudget.oversized += projected.stats.oversized;
95
+ exportBudget.nonSerializable += projected.stats.nonSerializable;
96
+ kernelImplementationRef = projected.value;
97
+ };
98
+ const setRuntimeServicesEvidence = (evidence) => {
99
+ const projected = projectJsonValue(evidence);
100
+ exportBudget.dropped += projected.stats.dropped;
101
+ exportBudget.oversized += projected.stats.oversized;
102
+ exportBudget.nonSerializable += projected.stats.nonSerializable;
103
+ runtimeServicesEvidence = projected.value;
104
+ };
105
+ const exportEvidencePackage = (options) => {
106
+ const convergeSummary = convergeStaticIrByDigest.size > 0 ? {
107
+ staticIrByDigest: Object.fromEntries(convergeStaticIrByDigest)
108
+ } : void 0;
109
+ const runtimeSummary = kernelImplementationRef != null || runtimeServicesEvidence != null ? {
110
+ ...kernelImplementationRef != null ? { kernelImplementationRef } : {},
111
+ ...runtimeServicesEvidence != null ? { services: runtimeServicesEvidence } : {}
112
+ } : void 0;
113
+ const summary = convergeSummary != null || runtimeSummary != null ? {
114
+ ...convergeSummary != null ? { converge: convergeSummary } : {},
115
+ ...runtimeSummary != null ? { runtime: runtimeSummary } : {}
116
+ } : void 0;
117
+ return sink.export({
118
+ maxEvents: options?.maxEvents,
119
+ summary
120
+ });
121
+ };
122
+ const clear = () => {
123
+ sink.clear();
124
+ convergeStaticIrByDigest.clear();
125
+ kernelImplementationRef = void 0;
126
+ runtimeServicesEvidence = void 0;
127
+ exportBudget.dropped = 0;
128
+ exportBudget.oversized = 0;
129
+ exportBudget.nonSerializable = 0;
130
+ };
131
+ return {
132
+ session,
133
+ debugSink,
134
+ registerConvergeStaticIr,
135
+ setKernelImplementationRef,
136
+ setRuntimeServicesEvidence,
137
+ exportEvidencePackage,
138
+ clear
139
+ };
140
+ };
141
+
142
+ // ../logix-core/src/internal/runtime/core/process/ProcessRuntime.make.ts
143
+ import {
144
+ Cause,
145
+ Context as Context2,
146
+ Deferred,
147
+ Duration,
148
+ Effect as Effect3,
149
+ Fiber as Fiber2,
150
+ FiberRef as FiberRef2,
151
+ Layer as Layer2,
152
+ Option as Option2,
153
+ PubSub,
154
+ Queue,
155
+ Ref as Ref2,
156
+ Scope as Scope2,
157
+ Stream as Stream2
158
+ } from "../effect.js";
159
+
160
+ // ../logix-core/src/internal/runtime/core/process/identity.ts
161
+ var scopeKeyFromScope = (scope) => {
162
+ switch (scope.type) {
163
+ case "app":
164
+ return `app:${scope.appId}`;
165
+ case "moduleInstance":
166
+ return `moduleInstance:${scope.moduleId}::${scope.instanceId}`;
167
+ case "uiSubtree":
168
+ return `uiSubtree:${scope.subtreeId}`;
169
+ }
170
+ };
171
+ var installationKeyFromIdentity = (identity) => `${identity.processId}@@${scopeKeyFromScope(identity.scope)}`;
172
+ var processInstanceIdFromIdentity = (identity) => {
173
+ const scopeKey = scopeKeyFromScope(identity.identity.scope);
174
+ return `process:${identity.identity.processId}::${scopeKey}::r${identity.runSeq}`;
175
+ };
176
+
177
+ // ../logix-core/src/internal/runtime/core/process/concurrency.ts
178
+ import { Effect as Effect2, Fiber, Option, Ref, Stream } from "../effect.js";
179
+ var DEFAULT_SERIAL_QUEUE_GUARD_LIMIT = 4096;
180
+ var DEFAULT_PARALLEL_LIMIT = 16;
181
+ var resolveQueueLimit = (maxQueue, options) => {
182
+ const defaultGuard = options?.defaultGuard ?? DEFAULT_SERIAL_QUEUE_GUARD_LIMIT;
183
+ const configured = typeof maxQueue === "number" && Number.isFinite(maxQueue) && maxQueue >= 0 ? Math.floor(maxQueue) : "unbounded";
184
+ return {
185
+ configured,
186
+ guard: configured === "unbounded" ? defaultGuard : configured
187
+ };
188
+ };
189
+ var runProcessTriggerStream = (args) => Effect2.gen(function* () {
190
+ const policy = args.policy;
191
+ const defaultQueueGuard = args.defaultQueueGuard ?? DEFAULT_SERIAL_QUEUE_GUARD_LIMIT;
192
+ if (policy.mode === "latest") {
193
+ const stateRef = yield* Ref.make({ fiber: void 0, runningId: 0, nextId: 0 });
194
+ const onTrigger2 = (trigger0) => Effect2.gen(function* () {
195
+ const trigger = args.assignTriggerSeq(trigger0);
196
+ const [prevFiber, prevRunningId, runId] = yield* Ref.modify(stateRef, (s) => {
197
+ const nextId = s.nextId + 1;
198
+ return [[s.fiber, s.runningId, nextId], { ...s, nextId, runningId: nextId }];
199
+ });
200
+ if (prevFiber && prevRunningId !== 0) {
201
+ const done = yield* Fiber.poll(prevFiber);
202
+ if (Option.isNone(done)) {
203
+ yield* Fiber.interruptFork(prevFiber);
204
+ }
205
+ }
206
+ const fiber = yield* Effect2.forkScoped(
207
+ args.run(trigger).pipe(Effect2.ensuring(Ref.update(stateRef, (s) => s.runningId === runId ? { ...s, runningId: 0 } : s)))
208
+ );
209
+ yield* Ref.update(stateRef, (s) => ({ ...s, fiber }));
210
+ });
211
+ return yield* Stream.runForEach(args.stream, onTrigger2);
212
+ }
213
+ const busyRef = yield* Ref.make(false);
214
+ const serialStateRef = yield* Ref.make({
215
+ running: false,
216
+ queue: [],
217
+ peak: 0
218
+ });
219
+ const parallelStateRef = yield* Ref.make({
220
+ active: 0,
221
+ queue: [],
222
+ peak: 0
223
+ });
224
+ const serialQueueLimit = resolveQueueLimit(policy.maxQueue, { defaultGuard: defaultQueueGuard });
225
+ const parallelQueueLimit = resolveQueueLimit(void 0, { defaultGuard: defaultQueueGuard });
226
+ const parallelLimit = typeof policy.maxParallel === "number" && Number.isFinite(policy.maxParallel) && policy.maxParallel >= 1 ? Math.floor(policy.maxParallel) : args.defaultParallelLimit ?? DEFAULT_PARALLEL_LIMIT;
227
+ const drainSerial = () => Effect2.suspend(
228
+ () => Ref.modify(serialStateRef, (state) => {
229
+ if (state.running || state.queue.length === 0) {
230
+ return [Option.none(), state];
231
+ }
232
+ const [next, ...rest] = state.queue;
233
+ return [Option.some(next), { ...state, running: true, queue: rest }];
234
+ }).pipe(
235
+ Effect2.flatMap(
236
+ (next) => Option.match(next, {
237
+ onNone: () => Effect2.void,
238
+ onSome: (trigger) => Effect2.forkScoped(
239
+ args.run(trigger).pipe(
240
+ Effect2.ensuring(Ref.update(serialStateRef, (s) => ({ ...s, running: false }))),
241
+ Effect2.zipRight(drainSerial())
242
+ )
243
+ ).pipe(Effect2.asVoid)
244
+ })
245
+ )
246
+ )
247
+ );
248
+ const drainParallel = () => Effect2.suspend(
249
+ () => Ref.modify(parallelStateRef, (state) => {
250
+ if (state.active >= parallelLimit || state.queue.length === 0) {
251
+ return [Option.none(), state];
252
+ }
253
+ const [next, ...rest] = state.queue;
254
+ return [Option.some(next), { ...state, active: state.active + 1, queue: rest }];
255
+ }).pipe(
256
+ Effect2.flatMap(
257
+ (next) => Option.match(next, {
258
+ onNone: () => Effect2.void,
259
+ onSome: (trigger) => Effect2.forkScoped(
260
+ args.run(trigger).pipe(
261
+ Effect2.ensuring(
262
+ Ref.update(parallelStateRef, (s) => ({
263
+ ...s,
264
+ active: Math.max(0, s.active - 1)
265
+ }))
266
+ ),
267
+ Effect2.zipRight(drainParallel())
268
+ )
269
+ ).pipe(Effect2.asVoid, Effect2.zipRight(drainParallel()))
270
+ })
271
+ )
272
+ )
273
+ );
274
+ const onTrigger = (trigger0) => Effect2.gen(function* () {
275
+ const trigger = args.assignTriggerSeq(trigger0);
276
+ if (policy.mode === "drop") {
277
+ const acquired = yield* Ref.modify(
278
+ busyRef,
279
+ (busy) => busy ? [false, busy] : [true, true]
280
+ );
281
+ if (!acquired) {
282
+ yield* args.onDrop(trigger);
283
+ return;
284
+ }
285
+ yield* Effect2.forkScoped(args.run(trigger).pipe(Effect2.ensuring(Ref.set(busyRef, false))));
286
+ return;
287
+ }
288
+ if (policy.mode === "parallel") {
289
+ const nextSize2 = yield* Ref.modify(parallelStateRef, (state) => {
290
+ const queue = [...state.queue, trigger];
291
+ return [queue.length, { ...state, queue, peak: Math.max(state.peak, queue.length) }];
292
+ });
293
+ if (nextSize2 > parallelQueueLimit.guard) {
294
+ const state = yield* Ref.get(parallelStateRef);
295
+ yield* args.onQueueOverflow({
296
+ mode: "parallel",
297
+ currentLength: nextSize2,
298
+ peak: state.peak,
299
+ limit: parallelQueueLimit,
300
+ policy
301
+ });
302
+ return;
303
+ }
304
+ yield* drainParallel();
305
+ return;
306
+ }
307
+ const nextSize = yield* Ref.modify(serialStateRef, (state) => {
308
+ const queue = [...state.queue, trigger];
309
+ return [queue.length, { ...state, queue, peak: Math.max(state.peak, queue.length) }];
310
+ });
311
+ if (nextSize > serialQueueLimit.guard) {
312
+ const state = yield* Ref.get(serialStateRef);
313
+ yield* args.onQueueOverflow({
314
+ mode: "serial",
315
+ currentLength: nextSize,
316
+ peak: state.peak,
317
+ limit: serialQueueLimit,
318
+ policy
319
+ });
320
+ return;
321
+ }
322
+ yield* drainSerial();
323
+ });
324
+ return yield* Stream.runForEach(args.stream, onTrigger);
325
+ });
326
+
327
+ // ../logix-core/src/internal/runtime/core/process/events.ts
328
+ var PROCESS_EVENT_MAX_BYTES = 4 * 1024;
329
+ var PROCESS_EVENT_MAX_EVENTS_PER_RUN = 50;
330
+ var PROCESS_EVENT_RESERVED_EVENTS_FOR_SUMMARY = 1;
331
+ var makeProcessRunEventBudgetState = (options) => ({
332
+ maxEvents: typeof options?.maxEvents === "number" && Number.isFinite(options.maxEvents) && options.maxEvents >= 0 ? Math.floor(options.maxEvents) : PROCESS_EVENT_MAX_EVENTS_PER_RUN,
333
+ maxBytes: typeof options?.maxBytes === "number" && Number.isFinite(options.maxBytes) && options.maxBytes >= 0 ? Math.floor(options.maxBytes) : PROCESS_EVENT_MAX_BYTES,
334
+ emitted: 0,
335
+ dropped: 0,
336
+ downgraded: 0,
337
+ summaryEmitted: false
338
+ });
339
+ var makeBudgetSummaryEvent = (args) => ({
340
+ type: "process:trigger",
341
+ identity: args.sourceEvent.identity,
342
+ trigger: args.sourceEvent.trigger,
343
+ severity: "warning",
344
+ eventSeq: args.sourceEvent.eventSeq,
345
+ timestampMs: args.sourceEvent.timestampMs,
346
+ error: {
347
+ message: "Process run event budget exceeded; further trigger/dispatch events are suppressed.",
348
+ code: "process::event_budget_exceeded",
349
+ hint: `maxEvents=${args.maxEvents} maxBytes=${args.maxBytes} emitted=${args.emitted} dropped=${args.dropped} downgraded=${args.downgraded}`
350
+ }
351
+ });
352
+ var applyProcessRunEventBudget = (state, event) => {
353
+ const maxEvents = Math.max(0, state.maxEvents);
354
+ const maxBytes = Math.max(0, state.maxBytes);
355
+ if (state.summaryEmitted) {
356
+ return [
357
+ { _tag: "drop" },
358
+ {
359
+ ...state,
360
+ dropped: state.dropped + 1
361
+ }
362
+ ];
363
+ }
364
+ const reserve = PROCESS_EVENT_RESERVED_EVENTS_FOR_SUMMARY;
365
+ const allowedRegular = Math.max(0, maxEvents - reserve);
366
+ if (state.emitted < allowedRegular) {
367
+ const enforced = enforceProcessEventMaxBytes(event, { maxBytes });
368
+ return [
369
+ { _tag: "emit", event: enforced.event },
370
+ {
371
+ ...state,
372
+ emitted: state.emitted + 1,
373
+ downgraded: state.downgraded + (enforced.downgraded ? 1 : 0)
374
+ }
375
+ ];
376
+ }
377
+ const dropped = state.dropped + 1;
378
+ const summary = makeBudgetSummaryEvent({
379
+ sourceEvent: event,
380
+ maxEvents,
381
+ maxBytes,
382
+ emitted: state.emitted,
383
+ dropped,
384
+ downgraded: state.downgraded
385
+ });
386
+ const enforcedSummary = enforceProcessEventMaxBytes(summary, { maxBytes });
387
+ return [
388
+ { _tag: "emitSummary", event: enforcedSummary.event },
389
+ {
390
+ ...state,
391
+ emitted: Math.min(maxEvents, state.emitted + 1),
392
+ dropped,
393
+ downgraded: state.downgraded + (enforcedSummary.downgraded ? 1 : 0),
394
+ summaryEmitted: true
395
+ }
396
+ ];
397
+ };
398
+ var estimateEventBytes = (event) => {
399
+ const json = JSON.stringify(event);
400
+ return typeof Buffer !== "undefined" ? Buffer.byteLength(json, "utf8") : new TextEncoder().encode(json).length;
401
+ };
402
+ var truncateChars = (value, maxLen) => value.length <= maxLen ? value : value.slice(0, maxLen);
403
+ var normalizeErrorSummary = (error) => {
404
+ const message = typeof error.message === "string" && error.message.length > 0 ? error.message : "Error";
405
+ const hint = typeof error.hint === "string" && error.hint.length > 0 ? truncateChars(error.hint, 1024) : void 0;
406
+ return {
407
+ name: typeof error.name === "string" && error.name.length > 0 ? error.name : void 0,
408
+ message: truncateChars(message, 256),
409
+ code: typeof error.code === "string" && error.code.length > 0 ? error.code : void 0,
410
+ hint
411
+ };
412
+ };
413
+ var enforceProcessEventMaxBytes = (event, options) => {
414
+ const maxBytes = options?.maxBytes ?? PROCESS_EVENT_MAX_BYTES;
415
+ let downgraded = false;
416
+ let next = event;
417
+ if (event.error) {
418
+ const normalized = normalizeErrorSummary(event.error);
419
+ if (normalized.message !== event.error.message || normalized.hint !== event.error.hint || normalized.code !== event.error.code || normalized.name !== event.error.name) {
420
+ downgraded = true;
421
+ next = { ...event, error: normalized };
422
+ }
423
+ }
424
+ if (estimateEventBytes(next) <= maxBytes) {
425
+ return { event: next, downgraded };
426
+ }
427
+ if (!next.error?.hint) {
428
+ return { event: next, downgraded: true };
429
+ }
430
+ const hint = next.error.hint;
431
+ const steps = [512, 256, 128, 64, 32, 0];
432
+ for (const maxLen of steps) {
433
+ const trimmed = maxLen === 0 ? void 0 : truncateChars(hint, maxLen);
434
+ const candidate = {
435
+ ...next,
436
+ error: {
437
+ ...next.error,
438
+ hint: trimmed
439
+ }
440
+ };
441
+ if (estimateEventBytes(candidate) <= maxBytes) {
442
+ return { event: candidate, downgraded: true };
443
+ }
444
+ }
445
+ const fallback = next.error ? {
446
+ ...next,
447
+ error: {
448
+ ...next.error,
449
+ message: truncateChars(next.error.message, 96),
450
+ hint: void 0
451
+ }
452
+ } : next;
453
+ return { event: fallback, downgraded: true };
454
+ };
455
+
456
+ // ../logix-core/src/internal/runtime/core/process/selectorSchema.ts
457
+ import * as SchemaAST from "../effect/SchemaAST.js";
458
+ var isRecord2 = (value) => typeof value === "object" && value !== null;
459
+ var resolveSchemaAst = (schema) => {
460
+ if (!isRecord2(schema)) return void 0;
461
+ const ast = schema.ast;
462
+ if (!ast) return void 0;
463
+ if (typeof ast !== "object" && typeof ast !== "function") return void 0;
464
+ return ast;
465
+ };
466
+ var makeDotPathError = (path, message, hint) => {
467
+ const err = new Error(message);
468
+ err.code = "process::invalid_dot_path";
469
+ err.hint = hint ?? [
470
+ "Expected dot-path syntax: segments separated by '.', numeric segments represent array indices.",
471
+ `path: ${path}`,
472
+ "",
473
+ "examples:",
474
+ "- count",
475
+ "- user.name",
476
+ "- items.0.id"
477
+ ].join("\n");
478
+ return err;
479
+ };
480
+ var makeSchemaMismatchError = (path) => makeDotPathError(
481
+ path,
482
+ "Invalid dot-path: path does not match the state schema.",
483
+ [
484
+ "The module state schema does not contain the requested dot-path.",
485
+ `path: ${path}`,
486
+ "",
487
+ "fix:",
488
+ "- Ensure the path exists in the state schema.",
489
+ "- Use numeric segments for array indices (e.g. items.0.id)."
490
+ ].join("\n")
491
+ );
492
+ var parseDotPath = (path) => {
493
+ if (typeof path !== "string" || path.length === 0) {
494
+ return { ok: false, error: makeDotPathError(String(path), "dot-path must be a non-empty string") };
495
+ }
496
+ const raw = path.split(".");
497
+ if (raw.length === 0) {
498
+ return { ok: false, error: makeDotPathError(path, "dot-path must contain at least one segment") };
499
+ }
500
+ const segments = [];
501
+ for (let i = 0; i < raw.length; i++) {
502
+ const seg = raw[i];
503
+ if (seg.length === 0) {
504
+ return {
505
+ ok: false,
506
+ error: makeDotPathError(
507
+ path,
508
+ `Invalid dot-path: empty segment at index ${i}.`,
509
+ [
510
+ "Expected dot-path syntax: segments separated by '.', numeric segments represent array indices.",
511
+ `path: ${path}`,
512
+ "",
513
+ "examples:",
514
+ "- count",
515
+ "- user.name",
516
+ "- items.0.id",
517
+ "",
518
+ "fix:",
519
+ "- Remove consecutive dots or trailing dots."
520
+ ].join("\n")
521
+ )
522
+ };
523
+ }
524
+ if (/^[0-9]+$/.test(seg)) {
525
+ const n = Number(seg);
526
+ if (!Number.isFinite(n) || n < 0) {
527
+ return {
528
+ ok: false,
529
+ error: makeDotPathError(path, `Invalid array index segment "${seg}" at index ${i}.`)
530
+ };
531
+ }
532
+ segments.push(Math.floor(n));
533
+ continue;
534
+ }
535
+ segments.push(seg);
536
+ }
537
+ return { ok: true, segments };
538
+ };
539
+ var resolveAstForPath = (ast, segments, seen) => {
540
+ if (segments.length === 0) return ast;
541
+ let current = ast;
542
+ while (true) {
543
+ if (SchemaAST.isSuspend(current)) {
544
+ if (seen.has(current)) return void 0;
545
+ seen.add(current);
546
+ current = current.f();
547
+ continue;
548
+ }
549
+ if (SchemaAST.isRefinement(current)) {
550
+ current = current.from;
551
+ continue;
552
+ }
553
+ break;
554
+ }
555
+ if (SchemaAST.isTransformation(current)) {
556
+ const from = resolveAstForPath(current.from, segments, seen);
557
+ if (from) return from;
558
+ return resolveAstForPath(current.to, segments, seen);
559
+ }
560
+ if (SchemaAST.isUnion(current)) {
561
+ for (const node of current.types) {
562
+ const resolved = resolveAstForPath(node, segments, seen);
563
+ if (resolved) return resolved;
564
+ }
565
+ return void 0;
566
+ }
567
+ if (SchemaAST.isTupleType(current)) {
568
+ const [head, ...tail] = segments;
569
+ if (typeof head !== "number") return void 0;
570
+ const element = head < current.elements.length ? current.elements[head] : current.rest.length > 0 ? current.rest[0] : void 0;
571
+ return element ? resolveAstForPath(element.type, tail, seen) : void 0;
572
+ }
573
+ if (SchemaAST.isTypeLiteral(current)) {
574
+ const [head, ...tail] = segments;
575
+ if (head === void 0) return void 0;
576
+ if (typeof head === "string") {
577
+ for (const ps of current.propertySignatures) {
578
+ if (String(ps.name) !== head) continue;
579
+ return resolveAstForPath(ps.type, tail, seen);
580
+ }
581
+ }
582
+ for (const sig of current.indexSignatures) {
583
+ let param = sig.parameter;
584
+ while (SchemaAST.isRefinement(param)) {
585
+ param = param.from;
586
+ }
587
+ const tag2 = param?._tag;
588
+ const acceptsString = tag2 === "StringKeyword" || tag2 === "TemplateLiteral";
589
+ const acceptsNumber = tag2 === "NumberKeyword";
590
+ if (typeof head === "string" && acceptsString) {
591
+ return resolveAstForPath(sig.type, tail, seen);
592
+ }
593
+ if (typeof head === "number" && acceptsNumber) {
594
+ return resolveAstForPath(sig.type, tail, seen);
595
+ }
596
+ }
597
+ }
598
+ const tag = current?._tag;
599
+ if (tag === "AnyKeyword" || tag === "UnknownKeyword" || tag === "ObjectKeyword" || tag === "Declaration") {
600
+ return current;
601
+ }
602
+ return void 0;
603
+ };
604
+ var selectBySegments = (segments) => (state) => {
605
+ let current = state;
606
+ for (const seg of segments) {
607
+ if (current == null) return void 0;
608
+ if (typeof seg === "number") {
609
+ if (Array.isArray(current)) {
610
+ current = current[seg];
611
+ continue;
612
+ }
613
+ if (isRecord2(current)) {
614
+ current = current[String(seg)];
615
+ continue;
616
+ }
617
+ return void 0;
618
+ }
619
+ if (isRecord2(current)) {
620
+ current = current[seg];
621
+ continue;
622
+ }
623
+ return void 0;
624
+ }
625
+ return current;
626
+ };
627
+ var makeSchemaSelector = (path, schemaAst) => {
628
+ const parsed = parseDotPath(path);
629
+ if (!parsed.ok) return { ok: false, error: parsed.error };
630
+ if (schemaAst) {
631
+ const resolved = resolveAstForPath(schemaAst, parsed.segments, /* @__PURE__ */ new Set());
632
+ if (!resolved) {
633
+ return { ok: false, error: makeSchemaMismatchError(path) };
634
+ }
635
+ }
636
+ return {
637
+ ok: true,
638
+ selector: selectBySegments(parsed.segments),
639
+ segments: parsed.segments
640
+ };
641
+ };
642
+
643
+ // ../logix-core/src/internal/runtime/core/process/supervision.ts
644
+ var initialState = () => ({ failureTimes: [] });
645
+ var onFailure = (policy, state, nowMs) => {
646
+ if (policy.mode === "failStop") {
647
+ return {
648
+ decision: "stop",
649
+ nextState: state,
650
+ withinWindowFailures: state.failureTimes.length,
651
+ maxRestarts: 0,
652
+ windowMs: policy.windowMs
653
+ };
654
+ }
655
+ const maxRestartsRaw = policy.maxRestarts;
656
+ const maxRestarts = typeof maxRestartsRaw === "number" && Number.isFinite(maxRestartsRaw) && maxRestartsRaw >= 0 ? Math.floor(maxRestartsRaw) : 0;
657
+ if (maxRestarts <= 0) {
658
+ return {
659
+ decision: "stop",
660
+ nextState: state,
661
+ withinWindowFailures: state.failureTimes.length,
662
+ maxRestarts,
663
+ windowMs: policy.windowMs
664
+ };
665
+ }
666
+ const windowMsRaw = policy.windowMs;
667
+ const windowMs = typeof windowMsRaw === "number" && Number.isFinite(windowMsRaw) && windowMsRaw > 0 ? Math.floor(windowMsRaw) : void 0;
668
+ const failureTimesRaw = [...state.failureTimes, nowMs];
669
+ const failureTimes = windowMs ? failureTimesRaw.filter((t) => t >= nowMs - windowMs) : failureTimesRaw;
670
+ const cap = maxRestarts + 1;
671
+ const capped = failureTimes.length > cap ? failureTimes.slice(failureTimes.length - cap) : failureTimes;
672
+ const withinWindowFailures = capped.length;
673
+ const decision = withinWindowFailures <= maxRestarts ? "restart" : "stop";
674
+ return {
675
+ decision,
676
+ nextState: { failureTimes: capped },
677
+ withinWindowFailures,
678
+ maxRestarts,
679
+ windowMs
680
+ };
681
+ };
682
+
683
+ // ../logix-core/src/internal/runtime/core/process/ProcessRuntime.make.ts
684
+ var ProcessRuntimeTag = class extends Context2.Tag("@logixjs/core/ProcessRuntime")() {
685
+ };
686
+ var currentProcessTrigger = FiberRef2.unsafeMake(void 0);
687
+ var currentProcessEventBudget = FiberRef2.unsafeMake(
688
+ void 0
689
+ );
690
+ var RUNTIME_BOOT_EVENT = "runtime:boot";
691
+ var deriveDebugModuleId = (processId) => `process:${processId}`;
692
+ var deriveTxnAnchor = (event) => {
693
+ const trigger = event.trigger;
694
+ if (!trigger) return {};
695
+ if ((trigger.kind === "moduleAction" || trigger.kind === "moduleStateChange") && typeof trigger.instanceId === "string" && typeof trigger.txnSeq === "number" && Number.isFinite(trigger.txnSeq) && trigger.txnSeq >= 1) {
696
+ const txnSeq = Math.floor(trigger.txnSeq);
697
+ return {
698
+ txnSeq,
699
+ txnId: `${trigger.instanceId}::t${txnSeq}`
700
+ };
701
+ }
702
+ return {};
703
+ };
704
+ var shouldNoopDueToSyncTxn = (scope, kind) => {
705
+ const moduleId = scope.type === "moduleInstance" ? scope.moduleId : void 0;
706
+ const instanceId = scope.type === "moduleInstance" ? scope.instanceId : void 0;
707
+ return shouldNoopInSyncTransactionFiber({
708
+ moduleId,
709
+ instanceId,
710
+ code: "process::invalid_usage",
711
+ severity: "error",
712
+ message: "ProcessRuntime scheduling is not allowed inside a synchronous StateTransaction body (it may deadlock the txnQueue).",
713
+ hint: "Trigger/schedule Process outside the transaction window (e.g. in a watcher's run section or a separate fiber); do not trigger Process directly inside a reducer / synchronous transaction body.",
714
+ kind
715
+ });
716
+ };
717
+ var resolveRuntimeStateSchemaAst = (runtime) => {
718
+ try {
719
+ const internals = getRuntimeInternals(runtime);
720
+ return resolveSchemaAst(internals.stateSchema);
721
+ } catch {
722
+ return void 0;
723
+ }
724
+ };
725
+ var withModuleHint = (error, moduleId) => {
726
+ const hint = error.hint;
727
+ if (typeof hint === "string" && hint.length > 0) {
728
+ if (!hint.includes("moduleId=")) {
729
+ ;
730
+ error.hint = `moduleId=${moduleId}
731
+ ${hint}`;
732
+ }
733
+ return error;
734
+ }
735
+ ;
736
+ error.hint = `moduleId=${moduleId}`;
737
+ return error;
738
+ };
739
+ var actionIdFromUnknown = (action) => {
740
+ if (!action || typeof action !== "object") return void 0;
741
+ const anyAction = action;
742
+ if (typeof anyAction._tag === "string" && anyAction._tag.length > 0) return anyAction._tag;
743
+ if (typeof anyAction.type === "string" && anyAction.type.length > 0) return anyAction.type;
744
+ return void 0;
745
+ };
746
+ var make = (options) => Effect3.gen(function* () {
747
+ const runtimeScope = yield* Effect3.scope;
748
+ const maxEventHistory = typeof options?.maxEventHistory === "number" && Number.isFinite(options.maxEventHistory) && options.maxEventHistory >= 0 ? Math.floor(options.maxEventHistory) : 500;
749
+ const installations = /* @__PURE__ */ new Map();
750
+ const instances = /* @__PURE__ */ new Map();
751
+ const eventsBuffer = [];
752
+ const eventsHub = yield* PubSub.sliding(Math.max(1, Math.min(2048, maxEventHistory)));
753
+ const trimEvents = () => {
754
+ if (maxEventHistory <= 0) {
755
+ eventsBuffer.length = 0;
756
+ return;
757
+ }
758
+ if (eventsBuffer.length <= maxEventHistory) return;
759
+ const excess = eventsBuffer.length - maxEventHistory;
760
+ eventsBuffer.splice(0, excess);
761
+ };
762
+ const recordDebugEvent = (event) => Effect3.gen(function* () {
763
+ const diagnosticsLevel = yield* FiberRef2.get(currentDiagnosticsLevel);
764
+ if (diagnosticsLevel === "off") {
765
+ return;
766
+ }
767
+ const processId = event.identity.identity.processId;
768
+ const processInstanceId = processInstanceIdFromIdentity(event.identity);
769
+ const moduleId = deriveDebugModuleId(processId);
770
+ const { txnSeq, txnId } = deriveTxnAnchor(event);
771
+ yield* record({
772
+ type: event.type,
773
+ moduleId,
774
+ instanceId: processInstanceId,
775
+ identity: event.identity,
776
+ severity: event.severity,
777
+ eventSeq: event.eventSeq,
778
+ timestampMs: event.timestampMs,
779
+ trigger: event.trigger,
780
+ dispatch: event.dispatch,
781
+ error: event.error,
782
+ txnSeq,
783
+ txnId
784
+ });
785
+ });
786
+ const publishEvent = (event) => Effect3.gen(function* () {
787
+ eventsBuffer.push(event);
788
+ trimEvents();
789
+ yield* PubSub.publish(eventsHub, event);
790
+ yield* recordDebugEvent(event);
791
+ });
792
+ const emit = (event) => Effect3.gen(function* () {
793
+ const budgetRef = yield* FiberRef2.get(currentProcessEventBudget);
794
+ if (budgetRef) {
795
+ const decision = yield* Ref2.modify(budgetRef, (state) => {
796
+ const [nextDecision, nextState] = applyProcessRunEventBudget(state, event);
797
+ return [nextDecision, nextState];
798
+ });
799
+ if (decision._tag === "emit" || decision._tag === "emitSummary") {
800
+ yield* publishEvent(decision.event);
801
+ }
802
+ return;
803
+ }
804
+ const enforced = enforceProcessEventMaxBytes(event);
805
+ yield* publishEvent(enforced.event);
806
+ });
807
+ const emitErrorDiagnostic = (scope, processId, code, message, hint) => {
808
+ if (!isDevEnv()) {
809
+ return Effect3.void;
810
+ }
811
+ const moduleId = scope.type === "moduleInstance" ? scope.moduleId : void 0;
812
+ const instanceId = scope.type === "moduleInstance" ? scope.instanceId : void 0;
813
+ return record({
814
+ type: "diagnostic",
815
+ moduleId,
816
+ instanceId,
817
+ code,
818
+ severity: "error",
819
+ message,
820
+ hint,
821
+ actionTag: processId,
822
+ kind: "process_runtime"
823
+ });
824
+ };
825
+ const resolveMissingDependencies = (installation) => {
826
+ const declared = installation.definition.requires ?? [];
827
+ const implicitFromTriggers = [];
828
+ for (const trigger of installation.definition.triggers) {
829
+ if (trigger.kind === "moduleAction" || trigger.kind === "moduleStateChange") {
830
+ implicitFromTriggers.push(trigger.moduleId);
831
+ }
832
+ }
833
+ const requires = Array.from(/* @__PURE__ */ new Set([...declared, ...implicitFromTriggers]));
834
+ if (requires.length === 0) return [];
835
+ const missing = [];
836
+ for (const dep of requires) {
837
+ if (typeof dep !== "string" || dep.length === 0) continue;
838
+ const tag = Context2.Tag(`@logixjs/Module/${dep}`)();
839
+ const found = Context2.getOption(installation.env, tag);
840
+ if (Option2.isNone(found)) {
841
+ missing.push(dep);
842
+ }
843
+ }
844
+ return missing;
845
+ };
846
+ const stopInstance = (instance, reason) => Effect3.gen(function* () {
847
+ if (instance.status.status === "stopped" || instance.status.status === "failed" || instance.status.status === "stopping") {
848
+ return;
849
+ }
850
+ const fiber = instance.fiber;
851
+ instance.status = {
852
+ ...instance.status,
853
+ status: "stopping",
854
+ stoppedReason: reason
855
+ };
856
+ if (fiber) {
857
+ yield* Fiber2.interrupt(fiber);
858
+ }
859
+ yield* Queue.shutdown(instance.platformTriggersQueue);
860
+ instance.status = {
861
+ ...instance.status,
862
+ status: "stopped",
863
+ stoppedReason: reason
864
+ };
865
+ instance.fiber = void 0;
866
+ const evt = {
867
+ type: "process:stop",
868
+ identity: instance.identity,
869
+ severity: "info",
870
+ eventSeq: instance.nextEventSeq++,
871
+ timestampMs: Date.now()
872
+ };
873
+ yield* emit(evt);
874
+ const installation = installations.get(instance.installationKey);
875
+ if (installation?.pendingStart) {
876
+ installation.pendingStart = void 0;
877
+ yield* startInstallation(instance.installationKey);
878
+ }
879
+ });
880
+ const startInstallation = (installationKey) => Effect3.gen(function* () {
881
+ const installation = installations.get(installationKey);
882
+ if (!installation) return;
883
+ installation.pendingStart = void 0;
884
+ const noop = yield* shouldNoopDueToSyncTxn(installation.identity.scope, "process_start_in_transaction");
885
+ if (noop) return;
886
+ const currentId = installation.currentInstanceId;
887
+ if (currentId) {
888
+ const current = instances.get(currentId);
889
+ if (current && (current.status.status === "running" || current.status.status === "starting")) {
890
+ return;
891
+ }
892
+ }
893
+ const runSeq = installation.nextRunSeq++;
894
+ const identity = {
895
+ identity: installation.identity,
896
+ runSeq
897
+ };
898
+ const processInstanceId = processInstanceIdFromIdentity(identity);
899
+ const platformTriggersQueue = yield* Queue.sliding(64);
900
+ const instanceState = {
901
+ installationKey,
902
+ processInstanceId,
903
+ identity,
904
+ processId: installation.identity.processId,
905
+ scope: installation.identity.scope,
906
+ forkScope: installation.forkScope,
907
+ platformTriggersQueue,
908
+ status: {
909
+ identity,
910
+ status: "starting"
911
+ },
912
+ nextEventSeq: 1,
913
+ nextTriggerSeq: 1
914
+ };
915
+ instances.set(processInstanceId, instanceState);
916
+ installation.currentInstanceId = processInstanceId;
917
+ if (installation.forkScope !== runtimeScope) {
918
+ yield* Scope2.addFinalizer(
919
+ installation.forkScope,
920
+ Effect3.suspend(() => {
921
+ const status = instanceState.status.status;
922
+ if (status === "stopped" || status === "failed" || status === "stopping") {
923
+ return Effect3.void;
924
+ }
925
+ return stopInstance(instanceState, "scopeDisposed");
926
+ }).pipe(Effect3.catchAllCause(() => Effect3.void))
927
+ );
928
+ }
929
+ yield* emit({
930
+ type: "process:start",
931
+ identity,
932
+ severity: "info",
933
+ eventSeq: instanceState.nextEventSeq++,
934
+ timestampMs: Date.now()
935
+ });
936
+ const missing = resolveMissingDependencies(installation);
937
+ if (missing.length > 0) {
938
+ const hint = isDevEnv() ? [
939
+ "Strict scope dependency resolution: missing required modules in the current scope.",
940
+ `missing: ${missing.join(", ")}`,
941
+ "",
942
+ "fix:",
943
+ "- Provide the missing module implementation(s) in the same scope via imports.",
944
+ ` Example: RootModule.implement({ imports: [${missing[0]}.implement(...).impl], processes: [...] })`,
945
+ "- Do not rely on cross-scope fallbacks / guessing instances."
946
+ ].join("\n") : void 0;
947
+ const error = {
948
+ message: `Missing dependencies in scope: ${missing.join(", ")}`,
949
+ code: "process::missing_dependency",
950
+ hint
951
+ };
952
+ instanceState.status = {
953
+ ...instanceState.status,
954
+ status: "failed",
955
+ stoppedReason: "failed",
956
+ lastError: error
957
+ };
958
+ yield* emit({
959
+ type: "process:error",
960
+ identity,
961
+ severity: "error",
962
+ eventSeq: instanceState.nextEventSeq++,
963
+ timestampMs: Date.now(),
964
+ error
965
+ });
966
+ yield* emitErrorDiagnostic(
967
+ installation.identity.scope,
968
+ installation.identity.processId,
969
+ "process::missing_dependency",
970
+ error.message,
971
+ hint
972
+ );
973
+ return;
974
+ }
975
+ const shouldRecordChainEvents = installation.definition.diagnosticsLevel !== "off";
976
+ const baseEnv = installation.env;
977
+ const makeWrappedEnv = () => {
978
+ if (!shouldRecordChainEvents) {
979
+ return baseEnv;
980
+ }
981
+ const requires = installation.definition.requires ?? [];
982
+ if (requires.length === 0) {
983
+ return baseEnv;
984
+ }
985
+ const ids = Array.from(new Set(requires));
986
+ let nextEnv = baseEnv;
987
+ for (const moduleId of ids) {
988
+ if (typeof moduleId !== "string" || moduleId.length === 0) continue;
989
+ const tag = Context2.Tag(`@logixjs/Module/${moduleId}`)();
990
+ const found = Context2.getOption(baseEnv, tag);
991
+ if (Option2.isNone(found)) continue;
992
+ const runtime = found.value;
993
+ const recordDispatch = (action) => Effect3.gen(function* () {
994
+ const trigger = yield* FiberRef2.get(currentProcessTrigger);
995
+ if (!trigger) return;
996
+ const actionId = actionIdFromUnknown(action) ?? "unknown";
997
+ const dispatchModuleId = typeof runtime.moduleId === "string" ? runtime.moduleId : moduleId;
998
+ const dispatchInstanceId = typeof runtime.instanceId === "string" ? runtime.instanceId : "unknown";
999
+ const evt = {
1000
+ type: "process:dispatch",
1001
+ identity,
1002
+ trigger,
1003
+ dispatch: {
1004
+ moduleId: dispatchModuleId,
1005
+ instanceId: dispatchInstanceId,
1006
+ actionId
1007
+ },
1008
+ severity: "info",
1009
+ eventSeq: instanceState.nextEventSeq++,
1010
+ timestampMs: Date.now()
1011
+ };
1012
+ yield* emit(evt);
1013
+ });
1014
+ const wrapped = {
1015
+ ...runtime,
1016
+ dispatch: (action) => runtime.dispatch(action).pipe(Effect3.tap(() => recordDispatch(action))),
1017
+ dispatchLowPriority: (action) => runtime.dispatchLowPriority(action).pipe(Effect3.tap(() => recordDispatch(action))),
1018
+ dispatchBatch: (actions) => runtime.dispatchBatch(actions).pipe(Effect3.tap(() => Effect3.forEach(actions, recordDispatch, { discard: true })))
1019
+ };
1020
+ nextEnv = Context2.add(tag, wrapped)(nextEnv);
1021
+ }
1022
+ return nextEnv;
1023
+ };
1024
+ const wrappedEnv = makeWrappedEnv();
1025
+ const providedProcess = Effect3.provide(installation.process, wrappedEnv);
1026
+ const makeTriggerStream = (spec) => Effect3.gen(function* () {
1027
+ if (spec.kind === "timer") {
1028
+ const interval = Duration.decodeUnknown(spec.timerId);
1029
+ if (Option2.isNone(interval)) {
1030
+ const err = new Error(`[ProcessRuntime] invalid timerId (expected DurationInput): ${spec.timerId}`);
1031
+ err.code = "process::invalid_timer_id";
1032
+ err.hint = "timerId must be a valid DurationInput string, e.g. '10 millis', '1 seconds', '5 minutes'.";
1033
+ return yield* Effect3.fail(err);
1034
+ }
1035
+ return Stream2.tick(interval.value).pipe(
1036
+ Stream2.map(
1037
+ () => ({
1038
+ kind: "timer",
1039
+ name: spec.name,
1040
+ timerId: spec.timerId
1041
+ })
1042
+ )
1043
+ );
1044
+ }
1045
+ if (spec.kind === "moduleAction") {
1046
+ const tag2 = Context2.Tag(`@logixjs/Module/${spec.moduleId}`)();
1047
+ const found2 = Context2.getOption(baseEnv, tag2);
1048
+ if (Option2.isNone(found2)) {
1049
+ return yield* Effect3.fail(new Error(`Missing module runtime in scope: ${spec.moduleId}`));
1050
+ }
1051
+ const runtime2 = found2.value;
1052
+ if (!shouldRecordChainEvents) {
1053
+ const stream2 = runtime2.actions$;
1054
+ if (!stream2) {
1055
+ const err = new Error("ModuleRuntime does not provide actions$ (required for moduleAction trigger).");
1056
+ err.code = "process::missing_action_stream";
1057
+ err.hint = `moduleId=${spec.moduleId}`;
1058
+ return yield* Effect3.fail(err);
1059
+ }
1060
+ return stream2.pipe(
1061
+ Stream2.filter((action) => actionIdFromUnknown(action) === spec.actionId),
1062
+ Stream2.map(
1063
+ () => ({
1064
+ kind: "moduleAction",
1065
+ name: spec.name,
1066
+ moduleId: spec.moduleId,
1067
+ instanceId: runtime2.instanceId,
1068
+ actionId: spec.actionId,
1069
+ txnSeq: 1
1070
+ })
1071
+ )
1072
+ );
1073
+ }
1074
+ const stream = runtime2.actionsWithMeta$;
1075
+ if (!stream) {
1076
+ const err = new Error(
1077
+ "ModuleRuntime does not provide actionsWithMeta$ (required for moduleAction trigger)."
1078
+ );
1079
+ err.code = "process::missing_action_meta_stream";
1080
+ err.hint = `moduleId=${spec.moduleId}`;
1081
+ return yield* Effect3.fail(err);
1082
+ }
1083
+ return stream.pipe(
1084
+ Stream2.filter((evt) => actionIdFromUnknown(evt.value) === spec.actionId),
1085
+ Stream2.map((evt) => {
1086
+ const txnSeq = evt?.meta?.txnSeq;
1087
+ return {
1088
+ kind: "moduleAction",
1089
+ name: spec.name,
1090
+ moduleId: spec.moduleId,
1091
+ instanceId: runtime2.instanceId,
1092
+ actionId: spec.actionId,
1093
+ txnSeq: typeof txnSeq === "number" ? txnSeq : 1
1094
+ };
1095
+ })
1096
+ );
1097
+ }
1098
+ const tag = Context2.Tag(`@logixjs/Module/${spec.moduleId}`)();
1099
+ const found = Context2.getOption(baseEnv, tag);
1100
+ if (Option2.isNone(found)) {
1101
+ return yield* Effect3.fail(new Error(`Missing module runtime in scope: ${spec.moduleId}`));
1102
+ }
1103
+ const runtime = found.value;
1104
+ const schemaAst = resolveRuntimeStateSchemaAst(runtime);
1105
+ const selectorResult = makeSchemaSelector(spec.path, schemaAst);
1106
+ if (!selectorResult.ok) {
1107
+ return yield* Effect3.fail(withModuleHint(selectorResult.error, spec.moduleId));
1108
+ }
1109
+ const selectorBase = selectorResult.selector;
1110
+ const prevRef = yield* Ref2.make(Option2.none());
1111
+ const enableSelectorDiagnostics = shouldRecordChainEvents;
1112
+ const selectorDiagnosticsRef = enableSelectorDiagnostics ? yield* Ref2.make({
1113
+ windowStartedMs: Date.now(),
1114
+ triggersInWindow: 0,
1115
+ lastWarningAtMs: 0
1116
+ }) : void 0;
1117
+ const sampleEveryMask = 127;
1118
+ const slowSampleThresholdMs = 4;
1119
+ const triggerWindowMs = 1e3;
1120
+ const triggerWarningThreshold = isDevEnv() ? 20 : 200;
1121
+ const warningCooldownMs = 3e4;
1122
+ let selectorCalls = 0;
1123
+ let selectorSamples = 0;
1124
+ let selectorSlowSamples = 0;
1125
+ let selectorMaxSampleMs = 0;
1126
+ const nowMs = () => {
1127
+ if (typeof performance !== "undefined" && typeof performance.now === "function") {
1128
+ return performance.now();
1129
+ }
1130
+ return Date.now();
1131
+ };
1132
+ const selector = enableSelectorDiagnostics ? (state) => {
1133
+ selectorCalls += 1;
1134
+ if ((selectorCalls & sampleEveryMask) !== 0) {
1135
+ return selectorBase(state);
1136
+ }
1137
+ const t0 = nowMs();
1138
+ const value = selectorBase(state);
1139
+ const dt = nowMs() - t0;
1140
+ selectorSamples += 1;
1141
+ if (dt >= slowSampleThresholdMs) {
1142
+ selectorSlowSamples += 1;
1143
+ }
1144
+ if (dt > selectorMaxSampleMs) {
1145
+ selectorMaxSampleMs = dt;
1146
+ }
1147
+ return value;
1148
+ } : selectorBase;
1149
+ const maybeWarnSelector = (trigger) => {
1150
+ if (!selectorDiagnosticsRef) {
1151
+ return Effect3.void;
1152
+ }
1153
+ return Effect3.gen(function* () {
1154
+ const now = Date.now();
1155
+ const decision = yield* Ref2.modify(selectorDiagnosticsRef, (s) => {
1156
+ const windowExpired = now - s.windowStartedMs >= triggerWindowMs;
1157
+ const windowStartedMs = windowExpired ? now : s.windowStartedMs;
1158
+ const triggersInWindow = windowExpired ? 1 : s.triggersInWindow + 1;
1159
+ const shouldCooldown = now - s.lastWarningAtMs < warningCooldownMs;
1160
+ const tooFrequent = triggersInWindow >= triggerWarningThreshold;
1161
+ const tooSlow = selectorMaxSampleMs >= slowSampleThresholdMs && selectorSamples > 0;
1162
+ const shouldWarn = !shouldCooldown && (tooFrequent || tooSlow);
1163
+ const next = shouldWarn ? {
1164
+ windowStartedMs: now,
1165
+ triggersInWindow: 0,
1166
+ lastWarningAtMs: now
1167
+ } : {
1168
+ ...s,
1169
+ windowStartedMs,
1170
+ triggersInWindow
1171
+ };
1172
+ return [
1173
+ {
1174
+ shouldWarn,
1175
+ tooFrequent,
1176
+ tooSlow,
1177
+ triggersInWindow
1178
+ },
1179
+ next
1180
+ ];
1181
+ });
1182
+ if (!decision.shouldWarn) {
1183
+ return;
1184
+ }
1185
+ const code = decision.tooFrequent ? "process::selector_high_frequency" : "process::selector_slow";
1186
+ const hint = [
1187
+ `moduleId=${spec.moduleId}`,
1188
+ `path=${spec.path}`,
1189
+ `windowMs=${triggerWindowMs}`,
1190
+ `triggersInWindow=${decision.triggersInWindow}`,
1191
+ `threshold=${triggerWarningThreshold}`,
1192
+ `cooldownMs=${warningCooldownMs}`,
1193
+ "",
1194
+ "selector sampling:",
1195
+ `calls=${selectorCalls}`,
1196
+ `sampled=${selectorSamples}`,
1197
+ `slowSamples(>=${slowSampleThresholdMs}ms)=${selectorSlowSamples}`,
1198
+ `maxSampleMs=${selectorMaxSampleMs.toFixed(2)}`,
1199
+ "",
1200
+ "notes:",
1201
+ "- Ensure the selected value is stable (prefer primitive/tuple; avoid returning fresh objects).",
1202
+ "- Narrow the path to reduce change frequency; avoid selecting large objects."
1203
+ ].join("\n");
1204
+ selectorSamples = 0;
1205
+ selectorSlowSamples = 0;
1206
+ selectorMaxSampleMs = 0;
1207
+ yield* emit({
1208
+ type: "process:trigger",
1209
+ identity,
1210
+ trigger,
1211
+ severity: "warning",
1212
+ eventSeq: instanceState.nextEventSeq++,
1213
+ timestampMs: Date.now(),
1214
+ error: {
1215
+ message: "moduleStateChange selector diagnostics warning",
1216
+ code,
1217
+ hint
1218
+ }
1219
+ });
1220
+ });
1221
+ };
1222
+ const baseStream = runtime.changesWithMeta(selector).pipe(
1223
+ Stream2.mapEffect(
1224
+ (evt) => Ref2.get(prevRef).pipe(
1225
+ Effect3.flatMap((prev) => {
1226
+ if (Option2.isSome(prev) && Object.is(prev.value, evt.value)) {
1227
+ return Effect3.succeed(Option2.none());
1228
+ }
1229
+ return Ref2.set(prevRef, Option2.some(evt.value)).pipe(Effect3.as(Option2.some(evt)));
1230
+ })
1231
+ )
1232
+ ),
1233
+ Stream2.filterMap((opt) => opt),
1234
+ Stream2.map((evt) => {
1235
+ const txnSeq = evt?.meta?.txnSeq;
1236
+ return {
1237
+ kind: "moduleStateChange",
1238
+ name: spec.name,
1239
+ moduleId: spec.moduleId,
1240
+ instanceId: runtime.instanceId,
1241
+ path: spec.path,
1242
+ txnSeq: typeof txnSeq === "number" ? txnSeq : 1
1243
+ };
1244
+ })
1245
+ );
1246
+ return enableSelectorDiagnostics ? baseStream.pipe(Stream2.tap(maybeWarnSelector)) : baseStream;
1247
+ });
1248
+ const makeRun = (trigger, fatal) => Effect3.locally(
1249
+ currentProcessTrigger,
1250
+ trigger
1251
+ )(
1252
+ providedProcess.pipe(
1253
+ Effect3.catchAllCause((cause) => {
1254
+ if (Cause.isInterruptedOnly(cause)) {
1255
+ return Effect3.void;
1256
+ }
1257
+ return Deferred.succeed(fatal, cause).pipe(
1258
+ Effect3.asVoid,
1259
+ Effect3.catchAll(() => Effect3.void)
1260
+ );
1261
+ })
1262
+ )
1263
+ );
1264
+ const makeChainRun = (trigger, fatal) => {
1265
+ if (!shouldRecordChainEvents) {
1266
+ return makeRun(trigger, fatal);
1267
+ }
1268
+ return Effect3.gen(function* () {
1269
+ const budgetRef = yield* Ref2.make(makeProcessRunEventBudgetState());
1270
+ return yield* Effect3.locally(
1271
+ currentProcessEventBudget,
1272
+ budgetRef
1273
+ )(emitTriggerEvent(trigger, "info").pipe(Effect3.zipRight(makeRun(trigger, fatal))));
1274
+ });
1275
+ };
1276
+ const assignTriggerSeq = (trigger) => {
1277
+ if (!shouldRecordChainEvents) {
1278
+ return trigger;
1279
+ }
1280
+ return {
1281
+ ...trigger,
1282
+ triggerSeq: instanceState.nextTriggerSeq++
1283
+ };
1284
+ };
1285
+ const emitTriggerEvent = (trigger, severity) => {
1286
+ if (!shouldRecordChainEvents) {
1287
+ return Effect3.void;
1288
+ }
1289
+ const evt = {
1290
+ type: "process:trigger",
1291
+ identity,
1292
+ trigger,
1293
+ severity,
1294
+ eventSeq: instanceState.nextEventSeq++,
1295
+ timestampMs: Date.now()
1296
+ };
1297
+ return emit(evt);
1298
+ };
1299
+ const policy = installation.definition.concurrency;
1300
+ const autoStart = installation.definition.triggers.some(
1301
+ (t) => t.kind === "platformEvent" && t.platformEvent === RUNTIME_BOOT_EVENT
1302
+ );
1303
+ const bootTriggerSpec = installation.definition.triggers.find(
1304
+ (t) => t.kind === "platformEvent" && t.platformEvent === RUNTIME_BOOT_EVENT
1305
+ );
1306
+ const instanceProgram = Effect3.gen(function* () {
1307
+ const fatal = yield* Deferred.make();
1308
+ const platformEventStream = Stream2.fromQueue(
1309
+ instanceState.platformTriggersQueue
1310
+ );
1311
+ const nonPlatformTriggers = installation.definition.triggers.filter(
1312
+ (t) => t.kind !== "platformEvent"
1313
+ );
1314
+ const streams = yield* Effect3.forEach(nonPlatformTriggers, makeTriggerStream);
1315
+ const triggerStream = Stream2.mergeAll([platformEventStream, ...streams], {
1316
+ concurrency: "unbounded"
1317
+ });
1318
+ const reportQueueOverflow = (info) => {
1319
+ const err = new Error("Process trigger queue overflow (serial maxQueue guard).");
1320
+ err.code = "process::serial_queue_overflow";
1321
+ err.hint = [
1322
+ `mode=${info.mode}`,
1323
+ `queue: current=${info.currentLength} peak=${info.peak}`,
1324
+ `maxQueue: configured=${info.limit.configured} guard=${info.limit.guard}`,
1325
+ `policy: ${JSON.stringify(info.policy)}`,
1326
+ "",
1327
+ "fix:",
1328
+ "- Configure concurrency.maxQueue (serial) to a finite value, or switch to mode=latest/drop to avoid unbounded backlog."
1329
+ ].join("\n");
1330
+ return Deferred.succeed(fatal, Cause.fail(err)).pipe(
1331
+ Effect3.asVoid,
1332
+ Effect3.catchAll(() => Effect3.void)
1333
+ );
1334
+ };
1335
+ const runnerFiber = yield* Effect3.forkScoped(
1336
+ runProcessTriggerStream({
1337
+ stream: triggerStream,
1338
+ policy,
1339
+ assignTriggerSeq,
1340
+ run: (trigger) => makeChainRun(trigger, fatal),
1341
+ onDrop: (trigger) => emitTriggerEvent(trigger, "warning"),
1342
+ onQueueOverflow: reportQueueOverflow
1343
+ })
1344
+ );
1345
+ if (autoStart) {
1346
+ yield* Queue.offer(instanceState.platformTriggersQueue, {
1347
+ kind: "platformEvent",
1348
+ name: bootTriggerSpec?.name,
1349
+ platformEvent: RUNTIME_BOOT_EVENT
1350
+ });
1351
+ }
1352
+ const cause = yield* Deferred.await(fatal);
1353
+ yield* Fiber2.interrupt(runnerFiber);
1354
+ return yield* Effect3.failCause(cause);
1355
+ });
1356
+ const fiber = yield* Effect3.forkIn(installation.forkScope)(
1357
+ Effect3.scoped(instanceProgram).pipe(
1358
+ Effect3.catchAllCause(
1359
+ (cause) => Effect3.gen(function* () {
1360
+ if (Cause.isInterruptedOnly(cause)) {
1361
+ if (instanceState.status.status === "stopping") {
1362
+ return;
1363
+ }
1364
+ instanceState.status = {
1365
+ ...instanceState.status,
1366
+ status: "stopped",
1367
+ stoppedReason: "scopeDisposed"
1368
+ };
1369
+ instanceState.fiber = void 0;
1370
+ yield* Effect3.uninterruptible(
1371
+ emit({
1372
+ type: "process:stop",
1373
+ identity,
1374
+ severity: "info",
1375
+ eventSeq: instanceState.nextEventSeq++,
1376
+ timestampMs: Date.now()
1377
+ })
1378
+ );
1379
+ const installation2 = installations.get(installationKey);
1380
+ if (installation2?.pendingStart) {
1381
+ installation2.pendingStart = void 0;
1382
+ yield* startInstallation(installationKey);
1383
+ }
1384
+ return;
1385
+ }
1386
+ const primary = Option2.getOrElse(
1387
+ Cause.failureOption(cause),
1388
+ () => Option2.getOrElse(Cause.dieOption(cause), () => cause)
1389
+ );
1390
+ const summary = toSerializableErrorSummary(primary);
1391
+ const error = summary.errorSummary;
1392
+ instanceState.status = {
1393
+ ...instanceState.status,
1394
+ status: "failed",
1395
+ stoppedReason: "failed",
1396
+ lastError: error
1397
+ };
1398
+ yield* emit({
1399
+ type: "process:error",
1400
+ identity,
1401
+ severity: "error",
1402
+ eventSeq: instanceState.nextEventSeq++,
1403
+ timestampMs: Date.now(),
1404
+ error
1405
+ });
1406
+ const decision = onFailure(
1407
+ installation.definition.errorPolicy,
1408
+ installation.supervision,
1409
+ Date.now()
1410
+ );
1411
+ installation.supervision = decision.nextState;
1412
+ if (decision.decision === "restart") {
1413
+ yield* emit({
1414
+ type: "process:restart",
1415
+ identity,
1416
+ severity: "warning",
1417
+ eventSeq: instanceState.nextEventSeq++,
1418
+ timestampMs: Date.now(),
1419
+ error
1420
+ });
1421
+ yield* startInstallation(installationKey);
1422
+ } else {
1423
+ yield* emitErrorDiagnostic(
1424
+ installation.identity.scope,
1425
+ installation.identity.processId,
1426
+ "process::failed_stop",
1427
+ "Process failed and stopped (failStop / restart limit reached).",
1428
+ `processId=${installation.identity.processId} scopeKey=${installation.scopeKey} failures=${decision.withinWindowFailures} maxRestarts=${decision.maxRestarts}`
1429
+ );
1430
+ }
1431
+ })
1432
+ )
1433
+ )
1434
+ );
1435
+ instanceState.fiber = fiber;
1436
+ instanceState.status = {
1437
+ ...instanceState.status,
1438
+ status: "running"
1439
+ };
1440
+ yield* Effect3.yieldNow();
1441
+ });
1442
+ const install = (process, options2) => Effect3.gen(function* () {
1443
+ const meta = getMeta(process);
1444
+ if (!meta) {
1445
+ return void 0;
1446
+ }
1447
+ const env = yield* Effect3.context();
1448
+ const forkScopeOpt = yield* Effect3.serviceOption(Scope2.Scope);
1449
+ const forkScope = Option2.isSome(forkScopeOpt) ? forkScopeOpt.value : runtimeScope;
1450
+ const scopeKey = scopeKeyFromScope(options2.scope);
1451
+ const identity = {
1452
+ processId: meta.definition.processId,
1453
+ scope: options2.scope
1454
+ };
1455
+ const installationKey = installationKeyFromIdentity(identity);
1456
+ const existing = installations.get(installationKey);
1457
+ if (existing) {
1458
+ existing.env = env;
1459
+ existing.forkScope = forkScope;
1460
+ existing.enabled = options2.enabled ?? true;
1461
+ existing.installedAt = options2.installedAt ?? existing.installedAt;
1462
+ if (!existing.enabled) {
1463
+ existing.pendingStart = void 0;
1464
+ return {
1465
+ identity,
1466
+ enabled: existing.enabled,
1467
+ installedAt: existing.installedAt
1468
+ };
1469
+ }
1470
+ const currentId = existing.currentInstanceId;
1471
+ const current = currentId ? instances.get(currentId) : void 0;
1472
+ const status = current?.status.status;
1473
+ if (status === "running" || status === "starting") {
1474
+ const mode = options2.mode ?? "switch";
1475
+ if (mode === "switch" && current && current.forkScope !== forkScope) {
1476
+ existing.pendingStart = { forkScope };
1477
+ yield* Scope2.addFinalizer(
1478
+ forkScope,
1479
+ Effect3.sync(() => {
1480
+ const installation2 = installations.get(installationKey);
1481
+ if (!installation2) return;
1482
+ if (installation2.pendingStart?.forkScope === forkScope) {
1483
+ installation2.pendingStart = void 0;
1484
+ }
1485
+ })
1486
+ );
1487
+ } else {
1488
+ existing.pendingStart = void 0;
1489
+ }
1490
+ return {
1491
+ identity,
1492
+ enabled: existing.enabled,
1493
+ installedAt: existing.installedAt
1494
+ };
1495
+ }
1496
+ if (status === "stopping") {
1497
+ const mode = options2.mode ?? "switch";
1498
+ if (mode === "switch") {
1499
+ existing.pendingStart = { forkScope };
1500
+ yield* Scope2.addFinalizer(
1501
+ forkScope,
1502
+ Effect3.sync(() => {
1503
+ const installation2 = installations.get(installationKey);
1504
+ if (!installation2) return;
1505
+ if (installation2.pendingStart?.forkScope === forkScope) {
1506
+ installation2.pendingStart = void 0;
1507
+ }
1508
+ })
1509
+ );
1510
+ } else {
1511
+ existing.pendingStart = void 0;
1512
+ }
1513
+ return {
1514
+ identity,
1515
+ enabled: existing.enabled,
1516
+ installedAt: existing.installedAt
1517
+ };
1518
+ }
1519
+ existing.pendingStart = void 0;
1520
+ yield* startInstallation(installationKey);
1521
+ return {
1522
+ identity,
1523
+ enabled: existing.enabled,
1524
+ installedAt: existing.installedAt
1525
+ };
1526
+ }
1527
+ const derived = Effect3.suspend(() => process);
1528
+ attachMeta(derived, {
1529
+ ...meta,
1530
+ installationScope: options2.scope
1531
+ });
1532
+ const installation = {
1533
+ identity,
1534
+ scopeKey,
1535
+ definition: meta.definition,
1536
+ env,
1537
+ forkScope,
1538
+ process: derived,
1539
+ kind: meta.kind ?? "process",
1540
+ enabled: options2.enabled ?? true,
1541
+ installedAt: options2.installedAt,
1542
+ nextRunSeq: 1,
1543
+ supervision: initialState(),
1544
+ pendingStart: void 0
1545
+ };
1546
+ installations.set(installationKey, installation);
1547
+ if (installation.enabled) {
1548
+ yield* startInstallation(installationKey);
1549
+ }
1550
+ return {
1551
+ identity,
1552
+ enabled: installation.enabled,
1553
+ installedAt: installation.installedAt
1554
+ };
1555
+ });
1556
+ const listInstallations = (filter) => Effect3.sync(() => {
1557
+ const scopeType = filter?.scopeType;
1558
+ const scopeKey = filter?.scopeKey;
1559
+ const out = [];
1560
+ for (const installation of installations.values()) {
1561
+ if (scopeType && installation.identity.scope.type !== scopeType) continue;
1562
+ if (scopeKey && installation.scopeKey !== scopeKey) continue;
1563
+ out.push({
1564
+ identity: installation.identity,
1565
+ enabled: installation.enabled,
1566
+ installedAt: installation.installedAt
1567
+ });
1568
+ }
1569
+ return out;
1570
+ });
1571
+ const getInstanceStatus = (processInstanceId) => Effect3.sync(() => instances.get(processInstanceId)?.status);
1572
+ const controlInstance = (processInstanceId, request) => Effect3.suspend(() => {
1573
+ const instance = instances.get(processInstanceId);
1574
+ if (!instance) {
1575
+ return Effect3.void;
1576
+ }
1577
+ return shouldNoopDueToSyncTxn(instance.scope, "process_control_in_transaction").pipe(
1578
+ Effect3.flatMap((noop) => {
1579
+ if (noop) {
1580
+ return Effect3.void;
1581
+ }
1582
+ if (request.action === "stop") {
1583
+ return stopInstance(instance, "manualStop");
1584
+ }
1585
+ if (request.action === "restart") {
1586
+ return stopInstance(instance, "manualStop").pipe(
1587
+ Effect3.flatMap(() => {
1588
+ const installation = installations.get(instance.installationKey);
1589
+ if (!installation) {
1590
+ return Effect3.void;
1591
+ }
1592
+ installation.currentInstanceId = void 0;
1593
+ return startInstallation(instance.installationKey);
1594
+ })
1595
+ );
1596
+ }
1597
+ if (request.action === "start") {
1598
+ if (instance.status.status === "running" || instance.status.status === "starting") {
1599
+ return Effect3.void;
1600
+ }
1601
+ const installation = installations.get(instance.installationKey);
1602
+ if (!installation) {
1603
+ return Effect3.void;
1604
+ }
1605
+ installation.currentInstanceId = void 0;
1606
+ return startInstallation(instance.installationKey);
1607
+ }
1608
+ return Effect3.void;
1609
+ })
1610
+ );
1611
+ });
1612
+ const deliverPlatformEvent = (event) => Effect3.gen(function* () {
1613
+ const noop = yield* shouldNoopInSyncTransactionFiber({
1614
+ code: "process::invalid_usage",
1615
+ severity: "error",
1616
+ message: "ProcessRuntime platform events are not allowed inside a synchronous StateTransaction body (it may deadlock the txnQueue).",
1617
+ hint: "Deliver platformEvent outside the transaction window.",
1618
+ kind: "process_platform_event_in_transaction"
1619
+ });
1620
+ if (noop) return;
1621
+ const targets = Array.from(instances.values());
1622
+ const eventName = event.eventName;
1623
+ yield* Effect3.forEach(
1624
+ targets,
1625
+ (instance) => Effect3.suspend(() => {
1626
+ if (instance.status.status !== "starting" && instance.status.status !== "running") {
1627
+ return Effect3.void;
1628
+ }
1629
+ const installation = installations.get(instance.installationKey);
1630
+ if (!installation) {
1631
+ return Effect3.void;
1632
+ }
1633
+ const specs = installation.definition.triggers.filter(
1634
+ (t) => t.kind === "platformEvent" && t.platformEvent === eventName
1635
+ );
1636
+ if (specs.length === 0) {
1637
+ return Effect3.void;
1638
+ }
1639
+ return Effect3.forEach(
1640
+ specs,
1641
+ (spec) => Queue.offer(instance.platformTriggersQueue, {
1642
+ kind: "platformEvent",
1643
+ name: spec.name,
1644
+ platformEvent: spec.platformEvent
1645
+ }),
1646
+ { discard: true }
1647
+ );
1648
+ }),
1649
+ { discard: true }
1650
+ );
1651
+ });
1652
+ const eventsStream = Stream2.fromPubSub(eventsHub);
1653
+ const getEventsSnapshot = () => Effect3.sync(() => eventsBuffer.slice());
1654
+ yield* Effect3.addFinalizer(
1655
+ () => Effect3.gen(function* () {
1656
+ for (const installation of installations.values()) {
1657
+ installation.pendingStart = void 0;
1658
+ }
1659
+ for (const instance of instances.values()) {
1660
+ if (instance.fiber) {
1661
+ yield* stopInstance(instance, "scopeDisposed");
1662
+ }
1663
+ }
1664
+ }).pipe(
1665
+ Effect3.catchAllCause(
1666
+ (cause) => Effect3.sync(() => {
1667
+ if (isDevEnv()) {
1668
+ console.warn("[ProcessRuntime] finalizer failed", Cause.pretty(cause));
1669
+ }
1670
+ })
1671
+ )
1672
+ )
1673
+ );
1674
+ return {
1675
+ install,
1676
+ listInstallations,
1677
+ getInstanceStatus,
1678
+ controlInstance,
1679
+ deliverPlatformEvent,
1680
+ events: eventsStream,
1681
+ getEventsSnapshot
1682
+ };
1683
+ });
1684
+ var layer = (options) => Layer2.scoped(ProcessRuntimeTag, make(options));
1685
+
1686
+ export {
1687
+ EvidenceCollectorTag,
1688
+ evidenceCollectorLayer,
1689
+ makeEvidenceCollector,
1690
+ getMeta,
1691
+ getDefinition,
1692
+ attachMeta,
1693
+ ProcessRuntimeTag,
1694
+ layer
1695
+ };
1696
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vbG9naXgtY29yZS9zcmMvaW50ZXJuYWwvcnVudGltZS9jb3JlL3Byb2Nlc3MvbWV0YS50cyIsICIuLi8uLi8uLi8uLi9sb2dpeC1jb3JlL3NyYy9pbnRlcm5hbC9vYnNlcnZhYmlsaXR5L2V2aWRlbmNlQ29sbGVjdG9yLnRzIiwgIi4uLy4uLy4uLy4uL2xvZ2l4LWNvcmUvc3JjL2ludGVybmFsL3J1bnRpbWUvY29yZS9wcm9jZXNzL1Byb2Nlc3NSdW50aW1lLm1ha2UudHMiLCAiLi4vLi4vLi4vLi4vbG9naXgtY29yZS9zcmMvaW50ZXJuYWwvcnVudGltZS9jb3JlL3Byb2Nlc3MvaWRlbnRpdHkudHMiLCAiLi4vLi4vLi4vLi4vbG9naXgtY29yZS9zcmMvaW50ZXJuYWwvcnVudGltZS9jb3JlL3Byb2Nlc3MvY29uY3VycmVuY3kudHMiLCAiLi4vLi4vLi4vLi4vbG9naXgtY29yZS9zcmMvaW50ZXJuYWwvcnVudGltZS9jb3JlL3Byb2Nlc3MvZXZlbnRzLnRzIiwgIi4uLy4uLy4uLy4uL2xvZ2l4LWNvcmUvc3JjL2ludGVybmFsL3J1bnRpbWUvY29yZS9wcm9jZXNzL3NlbGVjdG9yU2NoZW1hLnRzIiwgIi4uLy4uLy4uLy4uL2xvZ2l4LWNvcmUvc3JjL2ludGVybmFsL3J1bnRpbWUvY29yZS9wcm9jZXNzL3N1cGVydmlzaW9uLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyJpbXBvcnQgdHlwZSB7IEVmZmVjdCB9IGZyb20gJ2VmZmVjdCdcbmltcG9ydCB0eXBlIHsgUHJvY2Vzc0RlZmluaXRpb24sIFByb2Nlc3NTY29wZSB9IGZyb20gJy4vcHJvdG9jb2wuanMnXG5cbmV4cG9ydCB0eXBlIFByb2Nlc3NNZXRhID0ge1xuICByZWFkb25seSBkZWZpbml0aW9uOiBQcm9jZXNzRGVmaW5pdGlvblxuICAvKipcbiAgICogaW5zdGFsbGF0aW9uU2NvcGU6IHBhcnQgb2YgU3RhdGljIElSLlxuICAgKiAtIEZvciBpbnN0YW5jZS1zY29wZSAvIHN1YnRyZWUtc2NvcGUgc2NlbmFyaW9zLCB0aGUgcnVudGltZSBvdmVyd3JpdGVzIHRoaXMgZmllbGQgZHVyaW5nIGluc3RhbGxhdGlvbiB3aXRoIGEgZGVyaXZlZCBlZmZlY3QuXG4gICAqIC0gVGhpcyBmaWVsZCBpcyBmb3IgZXhwb3J0L2RpYWdub3N0aWNzIG9ubHk7IGl0IGRvZXMgbm90IHBhcnRpY2lwYXRlIGluIHN0YWJsZSBpZGVudGl0eSBkZXJpdmF0aW9uIChzZWUgaWRlbnRpdHkudHMpLlxuICAgKi9cbiAgcmVhZG9ubHkgaW5zdGFsbGF0aW9uU2NvcGU/OiBQcm9jZXNzU2NvcGVcbiAgcmVhZG9ubHkga2luZD86ICdwcm9jZXNzJyB8ICdsaW5rJyB8ICdkZWNsYXJhdGl2ZUxpbmsnXG59XG5cbmV4cG9ydCBjb25zdCBQUk9DRVNTX01FVEEgPSBTeW1ib2wuZm9yKCdAbG9naXhqcy9jb3JlL3Byb2Nlc3NNZXRhJylcblxuZXhwb3J0IHR5cGUgUHJvY2Vzc0VmZmVjdDxFID0gbmV2ZXIsIFIgPSBuZXZlcj4gPSBFZmZlY3QuRWZmZWN0PHZvaWQsIEUsIFI+ICYge1xuICByZWFkb25seSBbUFJPQ0VTU19NRVRBXT86IFByb2Nlc3NNZXRhXG59XG5cbmNvbnN0IGRlZmluZUhpZGRlbiA9ICh0YXJnZXQ6IG9iamVjdCwga2V5OiBzeW1ib2wsIHZhbHVlOiB1bmtub3duKTogdm9pZCA9PiB7XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwge1xuICAgIHZhbHVlLFxuICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICB3cml0YWJsZTogZmFsc2UsXG4gIH0pXG59XG5cbmV4cG9ydCBjb25zdCBnZXRNZXRhID0gKGVmZmVjdDogRWZmZWN0LkVmZmVjdDx2b2lkLCBhbnksIGFueT4pOiBQcm9jZXNzTWV0YSB8IHVuZGVmaW5lZCA9PlxuICAoZWZmZWN0IGFzIFByb2Nlc3NFZmZlY3QpW1BST0NFU1NfTUVUQV1cblxuZXhwb3J0IGNvbnN0IGdldERlZmluaXRpb24gPSAoZWZmZWN0OiBFZmZlY3QuRWZmZWN0PHZvaWQsIGFueSwgYW55Pik6IFByb2Nlc3NEZWZpbml0aW9uIHwgdW5kZWZpbmVkID0+XG4gIGdldE1ldGEoZWZmZWN0KT8uZGVmaW5pdGlvblxuXG5leHBvcnQgY29uc3QgYXR0YWNoTWV0YSA9IDxFLCBSPihlZmZlY3Q6IEVmZmVjdC5FZmZlY3Q8dm9pZCwgRSwgUj4sIG1ldGE6IFByb2Nlc3NNZXRhKTogUHJvY2Vzc0VmZmVjdDxFLCBSPiA9PiB7XG4gIGRlZmluZUhpZGRlbihlZmZlY3QgYXMgYW55LCBQUk9DRVNTX01FVEEsIG1ldGEpXG4gIHJldHVybiBlZmZlY3QgYXMgUHJvY2Vzc0VmZmVjdDxFLCBSPlxufVxuIiwgImltcG9ydCB7IENvbnRleHQsIEVmZmVjdCwgRmliZXJSZWYsIExheWVyIH0gZnJvbSAnZWZmZWN0J1xuaW1wb3J0IHR5cGUgeyBKc29uVmFsdWUgfSBmcm9tICcuL2pzb25WYWx1ZS5qcydcbmltcG9ydCB7IHByb2plY3RKc29uVmFsdWUgfSBmcm9tICcuL2pzb25WYWx1ZS5qcydcbmltcG9ydCB0eXBlIHsgRXZpZGVuY2VQYWNrYWdlIH0gZnJvbSAnLi9ldmlkZW5jZS5qcydcbmltcG9ydCB0eXBlIHsgUnVuU2Vzc2lvbiB9IGZyb20gJy4vcnVuU2Vzc2lvbi5qcydcbmltcG9ydCB7IG1ha2VFdmlkZW5jZVNpbmsgfSBmcm9tICcuL3J1blNlc3Npb24uanMnXG5pbXBvcnQge1xuICBjdXJyZW50RGlhZ25vc3RpY3NMZXZlbCxcbiAgdG9SdW50aW1lRGVidWdFdmVudFJlZixcbiAgdHlwZSBFdmVudCBhcyBEZWJ1Z0V2ZW50LFxuICB0eXBlIFNpbmsgYXMgRGVidWdTaW5rLFxufSBmcm9tICcuLi9ydW50aW1lL2NvcmUvRGVidWdTaW5rLmpzJ1xuXG5leHBvcnQgaW50ZXJmYWNlIEV2aWRlbmNlQ29sbGVjdG9yIHtcbiAgcmVhZG9ubHkgc2Vzc2lvbjogUnVuU2Vzc2lvblxuICByZWFkb25seSBkZWJ1Z1Npbms6IERlYnVnU2lua1xuICByZWFkb25seSByZWdpc3RlckNvbnZlcmdlU3RhdGljSXI6IChzdGF0aWNJcjogdW5rbm93bikgPT4gdm9pZFxuICByZWFkb25seSBzZXRLZXJuZWxJbXBsZW1lbnRhdGlvblJlZjogKHJlZjogdW5rbm93bikgPT4gdm9pZFxuICByZWFkb25seSBzZXRSdW50aW1lU2VydmljZXNFdmlkZW5jZTogKGV2aWRlbmNlOiB1bmtub3duKSA9PiB2b2lkXG4gIHJlYWRvbmx5IGV4cG9ydEV2aWRlbmNlUGFja2FnZTogKG9wdGlvbnM/OiB7IHJlYWRvbmx5IG1heEV2ZW50cz86IG51bWJlciB9KSA9PiBFdmlkZW5jZVBhY2thZ2VcbiAgcmVhZG9ubHkgY2xlYXI6ICgpID0+IHZvaWRcbn1cblxuY2xhc3MgRXZpZGVuY2VDb2xsZWN0b3JUYWdJbXBsIGV4dGVuZHMgQ29udGV4dC5UYWcoJ0Bsb2dpeGpzL2NvcmUvRXZpZGVuY2VDb2xsZWN0b3InKTxcbiAgRXZpZGVuY2VDb2xsZWN0b3JUYWdJbXBsLFxuICBFdmlkZW5jZUNvbGxlY3RvclxuPigpIHt9XG5cbmV4cG9ydCBjb25zdCBFdmlkZW5jZUNvbGxlY3RvclRhZyA9IEV2aWRlbmNlQ29sbGVjdG9yVGFnSW1wbFxuXG5leHBvcnQgY29uc3QgZXZpZGVuY2VDb2xsZWN0b3JMYXllciA9IChcbiAgY29sbGVjdG9yOiBFdmlkZW5jZUNvbGxlY3Rvcixcbik6IExheWVyLkxheWVyPEV2aWRlbmNlQ29sbGVjdG9yVGFnSW1wbCwgbmV2ZXIsIG5ldmVyPiA9PlxuICBMYXllci5zdWNjZWVkKEV2aWRlbmNlQ29sbGVjdG9yVGFnLCBjb2xsZWN0b3IpIGFzIExheWVyLkxheWVyPEV2aWRlbmNlQ29sbGVjdG9yVGFnSW1wbCwgbmV2ZXIsIG5ldmVyPlxuXG5jb25zdCBpc1JlY29yZCA9ICh2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0+XG4gIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgdmFsdWUgIT09IG51bGwgJiYgIUFycmF5LmlzQXJyYXkodmFsdWUpXG5cbmV4cG9ydCBjb25zdCBtYWtlRXZpZGVuY2VDb2xsZWN0b3IgPSAoc2Vzc2lvbjogUnVuU2Vzc2lvbik6IEV2aWRlbmNlQ29sbGVjdG9yID0+IHtcbiAgY29uc3Qgc2luayA9IG1ha2VFdmlkZW5jZVNpbmsoc2Vzc2lvbilcblxuICBjb25zdCBjb252ZXJnZVN0YXRpY0lyQnlEaWdlc3QgPSBuZXcgTWFwPHN0cmluZywgSnNvblZhbHVlPigpXG4gIGxldCBrZXJuZWxJbXBsZW1lbnRhdGlvblJlZjogSnNvblZhbHVlIHwgdW5kZWZpbmVkXG4gIGxldCBydW50aW1lU2VydmljZXNFdmlkZW5jZTogSnNvblZhbHVlIHwgdW5kZWZpbmVkXG5cbiAgY29uc3QgZXhwb3J0QnVkZ2V0ID0ge1xuICAgIGRyb3BwZWQ6IDAsXG4gICAgb3ZlcnNpemVkOiAwLFxuICAgIG5vblNlcmlhbGl6YWJsZTogMCxcbiAgfVxuXG4gIGNvbnN0IGRlYnVnU2luazogRGVidWdTaW5rID0ge1xuICAgIHJlY29yZDogKGV2ZW50OiBEZWJ1Z0V2ZW50KSA9PlxuICAgICAgRWZmZWN0LmdlbihmdW5jdGlvbiogKCkge1xuICAgICAgICBjb25zdCBsZXZlbCA9IHlpZWxkKiBGaWJlclJlZi5nZXQoY3VycmVudERpYWdub3N0aWNzTGV2ZWwpXG4gICAgICAgIGNvbnN0IGluc3RhbmNlSWRSYXcgPSAoZXZlbnQgYXMgYW55KS5pbnN0YW5jZUlkXG4gICAgICAgIGNvbnN0IGluc3RhbmNlSWQgPSB0eXBlb2YgaW5zdGFuY2VJZFJhdyA9PT0gJ3N0cmluZycgJiYgaW5zdGFuY2VJZFJhdy5sZW5ndGggPiAwID8gaW5zdGFuY2VJZFJhdyA6ICd1bmtub3duJ1xuICAgICAgICBjb25zdCBldmVudFNlcSA9IGxldmVsID09PSAnb2ZmJyA/IHVuZGVmaW5lZCA6IHNlc3Npb24ubG9jYWwubmV4dFNlcSgnZXZlbnRTZXEnLCBpbnN0YW5jZUlkKVxuICAgICAgICBjb25zdCByZWYgPSB0b1J1bnRpbWVEZWJ1Z0V2ZW50UmVmKGV2ZW50LCB7XG4gICAgICAgICAgZGlhZ25vc3RpY3NMZXZlbDogbGV2ZWwsXG4gICAgICAgICAgZXZlbnRTZXEsXG4gICAgICAgICAgb25NZXRhUHJvamVjdGlvbjogKHsgc3RhdHMgfSkgPT4ge1xuICAgICAgICAgICAgZXhwb3J0QnVkZ2V0LmRyb3BwZWQgKz0gc3RhdHMuZHJvcHBlZFxuICAgICAgICAgICAgZXhwb3J0QnVkZ2V0Lm92ZXJzaXplZCArPSBzdGF0cy5vdmVyc2l6ZWRcbiAgICAgICAgICB9LFxuICAgICAgICB9KVxuICAgICAgICBpZiAoIXJlZikgcmV0dXJuXG5cbiAgICAgICAgY29uc3QgcHJvamVjdGVkID0gcHJvamVjdEpzb25WYWx1ZShyZWYpXG4gICAgICAgIGV4cG9ydEJ1ZGdldC5kcm9wcGVkICs9IHByb2plY3RlZC5zdGF0cy5kcm9wcGVkXG4gICAgICAgIGV4cG9ydEJ1ZGdldC5vdmVyc2l6ZWQgKz0gcHJvamVjdGVkLnN0YXRzLm92ZXJzaXplZFxuICAgICAgICBleHBvcnRCdWRnZXQubm9uU2VyaWFsaXphYmxlICs9IHByb2plY3RlZC5zdGF0cy5ub25TZXJpYWxpemFibGVcblxuICAgICAgICBzaW5rLnJlY29yZCgnZGVidWc6ZXZlbnQnLCBwcm9qZWN0ZWQudmFsdWUsIHtcbiAgICAgICAgICB0aW1lc3RhbXA6IHJlZi50aW1lc3RhbXAsXG4gICAgICAgIH0pXG4gICAgICB9KSxcbiAgfVxuXG4gIGNvbnN0IHJlZ2lzdGVyQ29udmVyZ2VTdGF0aWNJciA9IChzdGF0aWNJcjogdW5rbm93bik6IHZvaWQgPT4ge1xuICAgIGlmICghaXNSZWNvcmQoc3RhdGljSXIpKSByZXR1cm5cbiAgICBjb25zdCBkaWdlc3QgPSBzdGF0aWNJci5zdGF0aWNJckRpZ2VzdFxuICAgIGlmICh0eXBlb2YgZGlnZXN0ICE9PSAnc3RyaW5nJyB8fCBkaWdlc3QubGVuZ3RoID09PSAwKSByZXR1cm5cbiAgICBjb25zdCBwcm9qZWN0ZWQgPSBwcm9qZWN0SnNvblZhbHVlKHN0YXRpY0lyKVxuICAgIGV4cG9ydEJ1ZGdldC5kcm9wcGVkICs9IHByb2plY3RlZC5zdGF0cy5kcm9wcGVkXG4gICAgZXhwb3J0QnVkZ2V0Lm92ZXJzaXplZCArPSBwcm9qZWN0ZWQuc3RhdHMub3ZlcnNpemVkXG4gICAgZXhwb3J0QnVkZ2V0Lm5vblNlcmlhbGl6YWJsZSArPSBwcm9qZWN0ZWQuc3RhdHMubm9uU2VyaWFsaXphYmxlXG4gICAgY29udmVyZ2VTdGF0aWNJckJ5RGlnZXN0LnNldChkaWdlc3QsIHByb2plY3RlZC52YWx1ZSlcbiAgfVxuXG4gIGNvbnN0IHNldEtlcm5lbEltcGxlbWVudGF0aW9uUmVmID0gKHJlZjogdW5rbm93bik6IHZvaWQgPT4ge1xuICAgIGNvbnN0IHByb2plY3RlZCA9IHByb2plY3RKc29uVmFsdWUocmVmKVxuICAgIGV4cG9ydEJ1ZGdldC5kcm9wcGVkICs9IHByb2plY3RlZC5zdGF0cy5kcm9wcGVkXG4gICAgZXhwb3J0QnVkZ2V0Lm92ZXJzaXplZCArPSBwcm9qZWN0ZWQuc3RhdHMub3ZlcnNpemVkXG4gICAgZXhwb3J0QnVkZ2V0Lm5vblNlcmlhbGl6YWJsZSArPSBwcm9qZWN0ZWQuc3RhdHMubm9uU2VyaWFsaXphYmxlXG4gICAga2VybmVsSW1wbGVtZW50YXRpb25SZWYgPSBwcm9qZWN0ZWQudmFsdWVcbiAgfVxuXG4gIGNvbnN0IHNldFJ1bnRpbWVTZXJ2aWNlc0V2aWRlbmNlID0gKGV2aWRlbmNlOiB1bmtub3duKTogdm9pZCA9PiB7XG4gICAgY29uc3QgcHJvamVjdGVkID0gcHJvamVjdEpzb25WYWx1ZShldmlkZW5jZSlcbiAgICBleHBvcnRCdWRnZXQuZHJvcHBlZCArPSBwcm9qZWN0ZWQuc3RhdHMuZHJvcHBlZFxuICAgIGV4cG9ydEJ1ZGdldC5vdmVyc2l6ZWQgKz0gcHJvamVjdGVkLnN0YXRzLm92ZXJzaXplZFxuICAgIGV4cG9ydEJ1ZGdldC5ub25TZXJpYWxpemFibGUgKz0gcHJvamVjdGVkLnN0YXRzLm5vblNlcmlhbGl6YWJsZVxuICAgIHJ1bnRpbWVTZXJ2aWNlc0V2aWRlbmNlID0gcHJvamVjdGVkLnZhbHVlXG4gIH1cblxuICBjb25zdCBleHBvcnRFdmlkZW5jZVBhY2thZ2UgPSAob3B0aW9ucz86IHsgcmVhZG9ubHkgbWF4RXZlbnRzPzogbnVtYmVyIH0pOiBFdmlkZW5jZVBhY2thZ2UgPT4ge1xuICAgIGNvbnN0IGNvbnZlcmdlU3VtbWFyeSA9XG4gICAgICBjb252ZXJnZVN0YXRpY0lyQnlEaWdlc3Quc2l6ZSA+IDBcbiAgICAgICAgPyAoe1xuICAgICAgICAgICAgc3RhdGljSXJCeURpZ2VzdDogT2JqZWN0LmZyb21FbnRyaWVzKGNvbnZlcmdlU3RhdGljSXJCeURpZ2VzdCksXG4gICAgICAgICAgfSBhcyB1bmtub3duIGFzIEpzb25WYWx1ZSlcbiAgICAgICAgOiB1bmRlZmluZWRcblxuICAgIGNvbnN0IHJ1bnRpbWVTdW1tYXJ5ID1cbiAgICAgIGtlcm5lbEltcGxlbWVudGF0aW9uUmVmICE9IG51bGwgfHwgcnVudGltZVNlcnZpY2VzRXZpZGVuY2UgIT0gbnVsbFxuICAgICAgICA/ICh7XG4gICAgICAgICAgICAuLi4oa2VybmVsSW1wbGVtZW50YXRpb25SZWYgIT0gbnVsbCA/IHsga2VybmVsSW1wbGVtZW50YXRpb25SZWYgfSA6IHt9KSxcbiAgICAgICAgICAgIC4uLihydW50aW1lU2VydmljZXNFdmlkZW5jZSAhPSBudWxsID8geyBzZXJ2aWNlczogcnVudGltZVNlcnZpY2VzRXZpZGVuY2UgfSA6IHt9KSxcbiAgICAgICAgICB9IGFzIHVua25vd24gYXMgSnNvblZhbHVlKVxuICAgICAgICA6IHVuZGVmaW5lZFxuXG4gICAgY29uc3Qgc3VtbWFyeSA9XG4gICAgICBjb252ZXJnZVN1bW1hcnkgIT0gbnVsbCB8fCBydW50aW1lU3VtbWFyeSAhPSBudWxsXG4gICAgICAgID8gKHtcbiAgICAgICAgICAgIC4uLihjb252ZXJnZVN1bW1hcnkgIT0gbnVsbCA/IHsgY29udmVyZ2U6IGNvbnZlcmdlU3VtbWFyeSB9IDoge30pLFxuICAgICAgICAgICAgLi4uKHJ1bnRpbWVTdW1tYXJ5ICE9IG51bGwgPyB7IHJ1bnRpbWU6IHJ1bnRpbWVTdW1tYXJ5IH0gOiB7fSksXG4gICAgICAgICAgfSBhcyB1bmtub3duIGFzIEpzb25WYWx1ZSlcbiAgICAgICAgOiB1bmRlZmluZWRcblxuICAgIHJldHVybiBzaW5rLmV4cG9ydCh7XG4gICAgICBtYXhFdmVudHM6IG9wdGlvbnM/Lm1heEV2ZW50cyxcbiAgICAgIHN1bW1hcnksXG4gICAgfSlcbiAgfVxuXG4gIGNvbnN0IGNsZWFyID0gKCk6IHZvaWQgPT4ge1xuICAgIHNpbmsuY2xlYXIoKVxuICAgIGNvbnZlcmdlU3RhdGljSXJCeURpZ2VzdC5jbGVhcigpXG4gICAga2VybmVsSW1wbGVtZW50YXRpb25SZWYgPSB1bmRlZmluZWRcbiAgICBydW50aW1lU2VydmljZXNFdmlkZW5jZSA9IHVuZGVmaW5lZFxuICAgIGV4cG9ydEJ1ZGdldC5kcm9wcGVkID0gMFxuICAgIGV4cG9ydEJ1ZGdldC5vdmVyc2l6ZWQgPSAwXG4gICAgZXhwb3J0QnVkZ2V0Lm5vblNlcmlhbGl6YWJsZSA9IDBcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgc2Vzc2lvbixcbiAgICBkZWJ1Z1NpbmssXG4gICAgcmVnaXN0ZXJDb252ZXJnZVN0YXRpY0lyLFxuICAgIHNldEtlcm5lbEltcGxlbWVudGF0aW9uUmVmLFxuICAgIHNldFJ1bnRpbWVTZXJ2aWNlc0V2aWRlbmNlLFxuICAgIGV4cG9ydEV2aWRlbmNlUGFja2FnZSxcbiAgICBjbGVhcixcbiAgfVxufVxuIiwgImltcG9ydCB7XG4gIENhdXNlLFxuICBDb250ZXh0LFxuICBEZWZlcnJlZCxcbiAgRHVyYXRpb24sXG4gIEVmZmVjdCxcbiAgRmliZXIsXG4gIEZpYmVyUmVmLFxuICBMYXllcixcbiAgT3B0aW9uLFxuICBQdWJTdWIsXG4gIFF1ZXVlLFxuICBSZWYsXG4gIFNjb3BlLFxuICBTdHJlYW0sXG59IGZyb20gJ2VmZmVjdCdcbmltcG9ydCAqIGFzIERlYnVnIGZyb20gJy4uL0RlYnVnU2luay5qcydcbmltcG9ydCB7IHRvU2VyaWFsaXphYmxlRXJyb3JTdW1tYXJ5IH0gZnJvbSAnLi4vZXJyb3JTdW1tYXJ5LmpzJ1xuaW1wb3J0ICogYXMgVGFza1J1bm5lciBmcm9tICcuLi9UYXNrUnVubmVyLmpzJ1xuaW1wb3J0IHsgaXNEZXZFbnYgfSBmcm9tICcuLi9lbnYuanMnXG5pbXBvcnQgeyBnZXRSdW50aW1lSW50ZXJuYWxzIH0gZnJvbSAnLi4vcnVudGltZUludGVybmFsc0FjY2Vzc29yLmpzJ1xuaW1wb3J0ICogYXMgSWRlbnRpdHkgZnJvbSAnLi9pZGVudGl0eS5qcydcbmltcG9ydCAqIGFzIFByb2Nlc3NDb25jdXJyZW5jeSBmcm9tICcuL2NvbmN1cnJlbmN5LmpzJ1xuaW1wb3J0ICogYXMgUHJvY2Vzc0V2ZW50cyBmcm9tICcuL2V2ZW50cy5qcydcbmltcG9ydCAqIGFzIE1ldGEgZnJvbSAnLi9tZXRhLmpzJ1xuaW1wb3J0IHsgbWFrZVNjaGVtYVNlbGVjdG9yLCByZXNvbHZlU2NoZW1hQXN0IH0gZnJvbSAnLi9zZWxlY3RvclNjaGVtYS5qcydcbmltcG9ydCB0eXBlIHtcbiAgUHJvY2Vzc0NvbnRyb2xSZXF1ZXN0LFxuICBQcm9jZXNzRGVmaW5pdGlvbixcbiAgUHJvY2Vzc0V2ZW50LFxuICBQcm9jZXNzSW5zdGFsbGF0aW9uLFxuICBQcm9jZXNzSW5zdGFuY2VJZGVudGl0eSxcbiAgUHJvY2Vzc0luc3RhbmNlU3RhdHVzLFxuICBQcm9jZXNzUGxhdGZvcm1FdmVudCxcbiAgUHJvY2Vzc1Njb3BlLFxuICBQcm9jZXNzVHJpZ2dlcixcbiAgUHJvY2Vzc1RyaWdnZXJTcGVjLFxuICBTZXJpYWxpemFibGVFcnJvclN1bW1hcnksXG59IGZyb20gJy4vcHJvdG9jb2wuanMnXG5pbXBvcnQgKiBhcyBTdXBlcnZpc2lvbiBmcm9tICcuL3N1cGVydmlzaW9uLmpzJ1xuXG50eXBlIEluc3RhbGxhdGlvbktleSA9IHN0cmluZ1xudHlwZSBQcm9jZXNzSW5zdGFuY2VJZCA9IHN0cmluZ1xuXG50eXBlIFByb2Nlc3NJbnN0YWxsTW9kZSA9ICdzd2l0Y2gnIHwgJ2V4aGF1c3QnXG5cbnR5cGUgSW5zdGFsbGF0aW9uU3RhdGUgPSB7XG4gIHJlYWRvbmx5IGlkZW50aXR5OiB7XG4gICAgcmVhZG9ubHkgcHJvY2Vzc0lkOiBzdHJpbmdcbiAgICByZWFkb25seSBzY29wZTogUHJvY2Vzc1Njb3BlXG4gIH1cbiAgcmVhZG9ubHkgc2NvcGVLZXk6IHN0cmluZ1xuICByZWFkb25seSBkZWZpbml0aW9uOiBQcm9jZXNzRGVmaW5pdGlvblxuICBlbnY6IENvbnRleHQuQ29udGV4dDxhbnk+XG4gIGZvcmtTY29wZTogU2NvcGUuU2NvcGVcbiAgcmVhZG9ubHkgcHJvY2VzczogRWZmZWN0LkVmZmVjdDx2b2lkLCBhbnksIHVua25vd24+XG4gIHJlYWRvbmx5IGtpbmQ6IE1ldGEuUHJvY2Vzc01ldGFbJ2tpbmQnXVxuICBlbmFibGVkOiBib29sZWFuXG4gIGluc3RhbGxlZEF0Pzogc3RyaW5nXG4gIG5leHRSdW5TZXE6IG51bWJlclxuICBzdXBlcnZpc2lvbjogU3VwZXJ2aXNpb24uU3VwZXJ2aXNpb25TdGF0ZVxuICBjdXJyZW50SW5zdGFuY2VJZD86IFByb2Nlc3NJbnN0YW5jZUlkXG4gIHBlbmRpbmdTdGFydD86IHsgcmVhZG9ubHkgZm9ya1Njb3BlOiBTY29wZS5TY29wZSB9XG59XG5cbnR5cGUgSW5zdGFuY2VTdGF0ZSA9IHtcbiAgcmVhZG9ubHkgaW5zdGFsbGF0aW9uS2V5OiBJbnN0YWxsYXRpb25LZXlcbiAgcmVhZG9ubHkgcHJvY2Vzc0luc3RhbmNlSWQ6IFByb2Nlc3NJbnN0YW5jZUlkXG4gIHJlYWRvbmx5IGlkZW50aXR5OiBQcm9jZXNzSW5zdGFuY2VJZGVudGl0eVxuICByZWFkb25seSBwcm9jZXNzSWQ6IHN0cmluZ1xuICByZWFkb25seSBzY29wZTogUHJvY2Vzc1Njb3BlXG4gIHJlYWRvbmx5IGZvcmtTY29wZTogU2NvcGUuU2NvcGVcbiAgcmVhZG9ubHkgcGxhdGZvcm1UcmlnZ2Vyc1F1ZXVlOiBRdWV1ZS5RdWV1ZTxQcm9jZXNzVHJpZ2dlcj5cbiAgc3RhdHVzOiBQcm9jZXNzSW5zdGFuY2VTdGF0dXNcbiAgbmV4dEV2ZW50U2VxOiBudW1iZXJcbiAgbmV4dFRyaWdnZXJTZXE6IG51bWJlclxuICBmaWJlcj86IEZpYmVyLlJ1bnRpbWVGaWJlcjx1bmtub3duLCB1bmtub3duPlxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFByb2Nlc3NSdW50aW1lIHtcbiAgcmVhZG9ubHkgaW5zdGFsbDogPEUsIFI+KFxuICAgIHByb2Nlc3M6IEVmZmVjdC5FZmZlY3Q8dm9pZCwgRSwgUj4sXG4gICAgb3B0aW9uczoge1xuICAgICAgcmVhZG9ubHkgc2NvcGU6IFByb2Nlc3NTY29wZVxuICAgICAgcmVhZG9ubHkgZW5hYmxlZD86IGJvb2xlYW5cbiAgICAgIHJlYWRvbmx5IGluc3RhbGxlZEF0Pzogc3RyaW5nXG4gICAgICByZWFkb25seSBtb2RlPzogUHJvY2Vzc0luc3RhbGxNb2RlXG4gICAgfSxcbiAgKSA9PiBFZmZlY3QuRWZmZWN0PFByb2Nlc3NJbnN0YWxsYXRpb24gfCB1bmRlZmluZWQsIG5ldmVyLCBSPlxuICByZWFkb25seSBsaXN0SW5zdGFsbGF0aW9uczogKGZpbHRlcj86IHtcbiAgICByZWFkb25seSBzY29wZVR5cGU/OiBQcm9jZXNzU2NvcGVbJ3R5cGUnXVxuICAgIHJlYWRvbmx5IHNjb3BlS2V5Pzogc3RyaW5nXG4gIH0pID0+IEVmZmVjdC5FZmZlY3Q8UmVhZG9ubHlBcnJheTxQcm9jZXNzSW5zdGFsbGF0aW9uPj5cbiAgcmVhZG9ubHkgZ2V0SW5zdGFuY2VTdGF0dXM6IChwcm9jZXNzSW5zdGFuY2VJZDogc3RyaW5nKSA9PiBFZmZlY3QuRWZmZWN0PFByb2Nlc3NJbnN0YW5jZVN0YXR1cyB8IHVuZGVmaW5lZD5cbiAgcmVhZG9ubHkgY29udHJvbEluc3RhbmNlOiAocHJvY2Vzc0luc3RhbmNlSWQ6IHN0cmluZywgcmVxdWVzdDogUHJvY2Vzc0NvbnRyb2xSZXF1ZXN0KSA9PiBFZmZlY3QuRWZmZWN0PHZvaWQ+XG4gIHJlYWRvbmx5IGRlbGl2ZXJQbGF0Zm9ybUV2ZW50OiAoZXZlbnQ6IFByb2Nlc3NQbGF0Zm9ybUV2ZW50KSA9PiBFZmZlY3QuRWZmZWN0PHZvaWQ+XG4gIHJlYWRvbmx5IGV2ZW50czogU3RyZWFtLlN0cmVhbTxQcm9jZXNzRXZlbnQ+XG4gIHJlYWRvbmx5IGdldEV2ZW50c1NuYXBzaG90OiAoKSA9PiBFZmZlY3QuRWZmZWN0PFJlYWRvbmx5QXJyYXk8UHJvY2Vzc0V2ZW50Pj5cbn1cblxuZXhwb3J0IGNsYXNzIFByb2Nlc3NSdW50aW1lVGFnIGV4dGVuZHMgQ29udGV4dC5UYWcoJ0Bsb2dpeGpzL2NvcmUvUHJvY2Vzc1J1bnRpbWUnKTxQcm9jZXNzUnVudGltZVRhZywgUHJvY2Vzc1J1bnRpbWU+KCkge31cblxuY29uc3QgY3VycmVudFByb2Nlc3NUcmlnZ2VyID0gRmliZXJSZWYudW5zYWZlTWFrZTxQcm9jZXNzVHJpZ2dlciB8IHVuZGVmaW5lZD4odW5kZWZpbmVkKVxuY29uc3QgY3VycmVudFByb2Nlc3NFdmVudEJ1ZGdldCA9IEZpYmVyUmVmLnVuc2FmZU1ha2U8UmVmLlJlZjxQcm9jZXNzRXZlbnRzLlByb2Nlc3NSdW5FdmVudEJ1ZGdldFN0YXRlPiB8IHVuZGVmaW5lZD4oXG4gIHVuZGVmaW5lZCxcbilcbmNvbnN0IFJVTlRJTUVfQk9PVF9FVkVOVCA9ICdydW50aW1lOmJvb3QnIGFzIGNvbnN0XG5cbmNvbnN0IGRlcml2ZURlYnVnTW9kdWxlSWQgPSAocHJvY2Vzc0lkOiBzdHJpbmcpOiBzdHJpbmcgPT4gYHByb2Nlc3M6JHtwcm9jZXNzSWR9YFxuXG50eXBlIE5vblBsYXRmb3JtVHJpZ2dlclNwZWMgPSBFeGNsdWRlPFByb2Nlc3NUcmlnZ2VyU3BlYywgeyByZWFkb25seSBraW5kOiAncGxhdGZvcm1FdmVudCcgfT5cblxuY29uc3QgZGVyaXZlVHhuQW5jaG9yID0gKGV2ZW50OiBQcm9jZXNzRXZlbnQpOiB7IHJlYWRvbmx5IHR4blNlcT86IG51bWJlcjsgcmVhZG9ubHkgdHhuSWQ/OiBzdHJpbmcgfSA9PiB7XG4gIGNvbnN0IHRyaWdnZXI6IGFueSA9IGV2ZW50LnRyaWdnZXJcbiAgaWYgKCF0cmlnZ2VyKSByZXR1cm4ge31cbiAgaWYgKFxuICAgICh0cmlnZ2VyLmtpbmQgPT09ICdtb2R1bGVBY3Rpb24nIHx8IHRyaWdnZXIua2luZCA9PT0gJ21vZHVsZVN0YXRlQ2hhbmdlJykgJiZcbiAgICB0eXBlb2YgdHJpZ2dlci5pbnN0YW5jZUlkID09PSAnc3RyaW5nJyAmJlxuICAgIHR5cGVvZiB0cmlnZ2VyLnR4blNlcSA9PT0gJ251bWJlcicgJiZcbiAgICBOdW1iZXIuaXNGaW5pdGUodHJpZ2dlci50eG5TZXEpICYmXG4gICAgdHJpZ2dlci50eG5TZXEgPj0gMVxuICApIHtcbiAgICBjb25zdCB0eG5TZXEgPSBNYXRoLmZsb29yKHRyaWdnZXIudHhuU2VxKVxuICAgIHJldHVybiB7XG4gICAgICB0eG5TZXEsXG4gICAgICB0eG5JZDogYCR7dHJpZ2dlci5pbnN0YW5jZUlkfTo6dCR7dHhuU2VxfWAsXG4gICAgfVxuICB9XG4gIHJldHVybiB7fVxufVxuXG5jb25zdCBzaG91bGROb29wRHVlVG9TeW5jVHhuID0gKHNjb3BlOiBQcm9jZXNzU2NvcGUsIGtpbmQ6IHN0cmluZyk6IEVmZmVjdC5FZmZlY3Q8Ym9vbGVhbj4gPT4ge1xuICBjb25zdCBtb2R1bGVJZCA9IHNjb3BlLnR5cGUgPT09ICdtb2R1bGVJbnN0YW5jZScgPyBzY29wZS5tb2R1bGVJZCA6IHVuZGVmaW5lZFxuICBjb25zdCBpbnN0YW5jZUlkID0gc2NvcGUudHlwZSA9PT0gJ21vZHVsZUluc3RhbmNlJyA/IHNjb3BlLmluc3RhbmNlSWQgOiB1bmRlZmluZWRcbiAgcmV0dXJuIFRhc2tSdW5uZXIuc2hvdWxkTm9vcEluU3luY1RyYW5zYWN0aW9uRmliZXIoe1xuICAgIG1vZHVsZUlkLFxuICAgIGluc3RhbmNlSWQsXG4gICAgY29kZTogJ3Byb2Nlc3M6OmludmFsaWRfdXNhZ2UnLFxuICAgIHNldmVyaXR5OiAnZXJyb3InLFxuICAgIG1lc3NhZ2U6XG4gICAgICAnUHJvY2Vzc1J1bnRpbWUgc2NoZWR1bGluZyBpcyBub3QgYWxsb3dlZCBpbnNpZGUgYSBzeW5jaHJvbm91cyBTdGF0ZVRyYW5zYWN0aW9uIGJvZHkgKGl0IG1heSBkZWFkbG9jayB0aGUgdHhuUXVldWUpLicsXG4gICAgaGludDpcbiAgICAgIFwiVHJpZ2dlci9zY2hlZHVsZSBQcm9jZXNzIG91dHNpZGUgdGhlIHRyYW5zYWN0aW9uIHdpbmRvdyAoZS5nLiBpbiBhIHdhdGNoZXIncyBydW4gc2VjdGlvbiBvciBhIHNlcGFyYXRlIGZpYmVyKTsgXCIgK1xuICAgICAgJ2RvIG5vdCB0cmlnZ2VyIFByb2Nlc3MgZGlyZWN0bHkgaW5zaWRlIGEgcmVkdWNlciAvIHN5bmNocm9ub3VzIHRyYW5zYWN0aW9uIGJvZHkuJyxcbiAgICBraW5kLFxuICB9KVxufVxuXG5jb25zdCByZXNvbHZlUnVudGltZVN0YXRlU2NoZW1hQXN0ID0gKHJ1bnRpbWU6IHVua25vd24pOiBSZXR1cm5UeXBlPHR5cGVvZiByZXNvbHZlU2NoZW1hQXN0PiA9PiB7XG4gIHRyeSB7XG4gICAgY29uc3QgaW50ZXJuYWxzID0gZ2V0UnVudGltZUludGVybmFscyhydW50aW1lIGFzIGFueSlcbiAgICByZXR1cm4gcmVzb2x2ZVNjaGVtYUFzdChpbnRlcm5hbHMuc3RhdGVTY2hlbWEpXG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiB1bmRlZmluZWRcbiAgfVxufVxuXG5jb25zdCB3aXRoTW9kdWxlSGludCA9IChlcnJvcjogRXJyb3IsIG1vZHVsZUlkOiBzdHJpbmcpOiBFcnJvciA9PiB7XG4gIGNvbnN0IGhpbnQgPSAoZXJyb3IgYXMgYW55KS5oaW50XG4gIGlmICh0eXBlb2YgaGludCA9PT0gJ3N0cmluZycgJiYgaGludC5sZW5ndGggPiAwKSB7XG4gICAgaWYgKCFoaW50LmluY2x1ZGVzKCdtb2R1bGVJZD0nKSkge1xuICAgICAgOyhlcnJvciBhcyBhbnkpLmhpbnQgPSBgbW9kdWxlSWQ9JHttb2R1bGVJZH1cXG4ke2hpbnR9YFxuICAgIH1cbiAgICByZXR1cm4gZXJyb3JcbiAgfVxuICA7KGVycm9yIGFzIGFueSkuaGludCA9IGBtb2R1bGVJZD0ke21vZHVsZUlkfWBcbiAgcmV0dXJuIGVycm9yXG59XG5cbmNvbnN0IGFjdGlvbklkRnJvbVVua25vd24gPSAoYWN0aW9uOiB1bmtub3duKTogc3RyaW5nIHwgdW5kZWZpbmVkID0+IHtcbiAgaWYgKCFhY3Rpb24gfHwgdHlwZW9mIGFjdGlvbiAhPT0gJ29iamVjdCcpIHJldHVybiB1bmRlZmluZWRcbiAgY29uc3QgYW55QWN0aW9uID0gYWN0aW9uIGFzIGFueVxuICBpZiAodHlwZW9mIGFueUFjdGlvbi5fdGFnID09PSAnc3RyaW5nJyAmJiBhbnlBY3Rpb24uX3RhZy5sZW5ndGggPiAwKSByZXR1cm4gYW55QWN0aW9uLl90YWdcbiAgaWYgKHR5cGVvZiBhbnlBY3Rpb24udHlwZSA9PT0gJ3N0cmluZycgJiYgYW55QWN0aW9uLnR5cGUubGVuZ3RoID4gMCkgcmV0dXJuIGFueUFjdGlvbi50eXBlXG4gIHJldHVybiB1bmRlZmluZWRcbn1cblxuZXhwb3J0IGNvbnN0IG1ha2UgPSAob3B0aW9ucz86IHtcbiAgcmVhZG9ubHkgbWF4RXZlbnRIaXN0b3J5PzogbnVtYmVyXG59KTogRWZmZWN0LkVmZmVjdDxQcm9jZXNzUnVudGltZSwgbmV2ZXIsIFNjb3BlLlNjb3BlPiA9PlxuICBFZmZlY3QuZ2VuKGZ1bmN0aW9uKiAoKSB7XG4gICAgY29uc3QgcnVudGltZVNjb3BlID0geWllbGQqIEVmZmVjdC5zY29wZVxuICAgIGNvbnN0IG1heEV2ZW50SGlzdG9yeSA9XG4gICAgICB0eXBlb2Ygb3B0aW9ucz8ubWF4RXZlbnRIaXN0b3J5ID09PSAnbnVtYmVyJyAmJlxuICAgICAgTnVtYmVyLmlzRmluaXRlKG9wdGlvbnMubWF4RXZlbnRIaXN0b3J5KSAmJlxuICAgICAgb3B0aW9ucy5tYXhFdmVudEhpc3RvcnkgPj0gMFxuICAgICAgICA/IE1hdGguZmxvb3Iob3B0aW9ucy5tYXhFdmVudEhpc3RvcnkpXG4gICAgICAgIDogNTAwXG5cbiAgICBjb25zdCBpbnN0YWxsYXRpb25zID0gbmV3IE1hcDxJbnN0YWxsYXRpb25LZXksIEluc3RhbGxhdGlvblN0YXRlPigpXG4gICAgY29uc3QgaW5zdGFuY2VzID0gbmV3IE1hcDxQcm9jZXNzSW5zdGFuY2VJZCwgSW5zdGFuY2VTdGF0ZT4oKVxuXG4gICAgY29uc3QgZXZlbnRzQnVmZmVyOiBQcm9jZXNzRXZlbnRbXSA9IFtdXG4gICAgY29uc3QgZXZlbnRzSHViID0geWllbGQqIFB1YlN1Yi5zbGlkaW5nPFByb2Nlc3NFdmVudD4oTWF0aC5tYXgoMSwgTWF0aC5taW4oMjA0OCwgbWF4RXZlbnRIaXN0b3J5KSkpXG5cbiAgICBjb25zdCB0cmltRXZlbnRzID0gKCkgPT4ge1xuICAgICAgaWYgKG1heEV2ZW50SGlzdG9yeSA8PSAwKSB7XG4gICAgICAgIGV2ZW50c0J1ZmZlci5sZW5ndGggPSAwXG4gICAgICAgIHJldHVyblxuICAgICAgfVxuICAgICAgaWYgKGV2ZW50c0J1ZmZlci5sZW5ndGggPD0gbWF4RXZlbnRIaXN0b3J5KSByZXR1cm5cbiAgICAgIGNvbnN0IGV4Y2VzcyA9IGV2ZW50c0J1ZmZlci5sZW5ndGggLSBtYXhFdmVudEhpc3RvcnlcbiAgICAgIGV2ZW50c0J1ZmZlci5zcGxpY2UoMCwgZXhjZXNzKVxuICAgIH1cblxuICAgIGNvbnN0IHJlY29yZERlYnVnRXZlbnQgPSAoZXZlbnQ6IFByb2Nlc3NFdmVudCk6IEVmZmVjdC5FZmZlY3Q8dm9pZD4gPT5cbiAgICAgIEVmZmVjdC5nZW4oZnVuY3Rpb24qICgpIHtcbiAgICAgICAgY29uc3QgZGlhZ25vc3RpY3NMZXZlbCA9IHlpZWxkKiBGaWJlclJlZi5nZXQoRGVidWcuY3VycmVudERpYWdub3N0aWNzTGV2ZWwpXG5cbiAgICAgICAgLy8gZGlhZ25vc3RpY3M9b2ZmOiBhdm9pZCBlbnRlcmluZyBEZWJ1ZyBzaW5rcyAobmVhci16ZXJvIGNvc3QpOyBlcnJvciBjYXNlcyBhcmUgZXhwb3NlZCB2aWEgZGlhZ25vc3RpYyBldmVudHMuXG4gICAgICAgIGlmIChkaWFnbm9zdGljc0xldmVsID09PSAnb2ZmJykge1xuICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcHJvY2Vzc0lkID0gZXZlbnQuaWRlbnRpdHkuaWRlbnRpdHkucHJvY2Vzc0lkXG4gICAgICAgIGNvbnN0IHByb2Nlc3NJbnN0YW5jZUlkID0gSWRlbnRpdHkucHJvY2Vzc0luc3RhbmNlSWRGcm9tSWRlbnRpdHkoZXZlbnQuaWRlbnRpdHkpXG4gICAgICAgIGNvbnN0IG1vZHVsZUlkID0gZGVyaXZlRGVidWdNb2R1bGVJZChwcm9jZXNzSWQpXG4gICAgICAgIGNvbnN0IHsgdHhuU2VxLCB0eG5JZCB9ID0gZGVyaXZlVHhuQW5jaG9yKGV2ZW50KVxuXG4gICAgICAgIHlpZWxkKiBEZWJ1Zy5yZWNvcmQoe1xuICAgICAgICAgIHR5cGU6IGV2ZW50LnR5cGUsXG4gICAgICAgICAgbW9kdWxlSWQsXG4gICAgICAgICAgaW5zdGFuY2VJZDogcHJvY2Vzc0luc3RhbmNlSWQsXG4gICAgICAgICAgaWRlbnRpdHk6IGV2ZW50LmlkZW50aXR5LFxuICAgICAgICAgIHNldmVyaXR5OiBldmVudC5zZXZlcml0eSxcbiAgICAgICAgICBldmVudFNlcTogZXZlbnQuZXZlbnRTZXEsXG4gICAgICAgICAgdGltZXN0YW1wTXM6IGV2ZW50LnRpbWVzdGFtcE1zLFxuICAgICAgICAgIHRyaWdnZXI6IGV2ZW50LnRyaWdnZXIsXG4gICAgICAgICAgZGlzcGF0Y2g6IGV2ZW50LmRpc3BhdGNoLFxuICAgICAgICAgIGVycm9yOiBldmVudC5lcnJvcixcbiAgICAgICAgICB0eG5TZXEsXG4gICAgICAgICAgdHhuSWQsXG4gICAgICAgIH0gYXMgYW55KVxuICAgICAgfSlcblxuICAgIGNvbnN0IHB1Ymxpc2hFdmVudCA9IChldmVudDogUHJvY2Vzc0V2ZW50KTogRWZmZWN0LkVmZmVjdDx2b2lkPiA9PlxuICAgICAgRWZmZWN0LmdlbihmdW5jdGlvbiogKCkge1xuICAgICAgICBldmVudHNCdWZmZXIucHVzaChldmVudClcbiAgICAgICAgdHJpbUV2ZW50cygpXG4gICAgICAgIHlpZWxkKiBQdWJTdWIucHVibGlzaChldmVudHNIdWIsIGV2ZW50KVxuICAgICAgICB5aWVsZCogcmVjb3JkRGVidWdFdmVudChldmVudClcbiAgICAgIH0pXG5cbiAgICBjb25zdCBlbWl0ID0gKGV2ZW50OiBQcm9jZXNzRXZlbnQpOiBFZmZlY3QuRWZmZWN0PHZvaWQ+ID0+XG4gICAgICBFZmZlY3QuZ2VuKGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIGNvbnN0IGJ1ZGdldFJlZiA9IHlpZWxkKiBGaWJlclJlZi5nZXQoY3VycmVudFByb2Nlc3NFdmVudEJ1ZGdldClcbiAgICAgICAgaWYgKGJ1ZGdldFJlZikge1xuICAgICAgICAgIGNvbnN0IGRlY2lzaW9uID0geWllbGQqIFJlZi5tb2RpZnkoYnVkZ2V0UmVmLCAoc3RhdGUpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IFtuZXh0RGVjaXNpb24sIG5leHRTdGF0ZV0gPSBQcm9jZXNzRXZlbnRzLmFwcGx5UHJvY2Vzc1J1bkV2ZW50QnVkZ2V0KHN0YXRlLCBldmVudClcbiAgICAgICAgICAgIHJldHVybiBbbmV4dERlY2lzaW9uLCBuZXh0U3RhdGVdIGFzIGNvbnN0XG4gICAgICAgICAgfSlcblxuICAgICAgICAgIGlmIChkZWNpc2lvbi5fdGFnID09PSAnZW1pdCcgfHwgZGVjaXNpb24uX3RhZyA9PT0gJ2VtaXRTdW1tYXJ5Jykge1xuICAgICAgICAgICAgeWllbGQqIHB1Ymxpc2hFdmVudChkZWNpc2lvbi5ldmVudClcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBlbmZvcmNlZCA9IFByb2Nlc3NFdmVudHMuZW5mb3JjZVByb2Nlc3NFdmVudE1heEJ5dGVzKGV2ZW50KVxuICAgICAgICB5aWVsZCogcHVibGlzaEV2ZW50KGVuZm9yY2VkLmV2ZW50KVxuICAgICAgfSlcblxuICAgIGNvbnN0IGVtaXRFcnJvckRpYWdub3N0aWMgPSAoXG4gICAgICBzY29wZTogUHJvY2Vzc1Njb3BlLFxuICAgICAgcHJvY2Vzc0lkOiBzdHJpbmcsXG4gICAgICBjb2RlOiBzdHJpbmcsXG4gICAgICBtZXNzYWdlOiBzdHJpbmcsXG4gICAgICBoaW50Pzogc3RyaW5nLFxuICAgICk6IEVmZmVjdC5FZmZlY3Q8dm9pZD4gPT4ge1xuICAgICAgaWYgKCFpc0RldkVudigpKSB7XG4gICAgICAgIHJldHVybiBFZmZlY3Qudm9pZFxuICAgICAgfVxuICAgICAgY29uc3QgbW9kdWxlSWQgPSBzY29wZS50eXBlID09PSAnbW9kdWxlSW5zdGFuY2UnID8gc2NvcGUubW9kdWxlSWQgOiB1bmRlZmluZWRcbiAgICAgIGNvbnN0IGluc3RhbmNlSWQgPSBzY29wZS50eXBlID09PSAnbW9kdWxlSW5zdGFuY2UnID8gc2NvcGUuaW5zdGFuY2VJZCA6IHVuZGVmaW5lZFxuICAgICAgcmV0dXJuIERlYnVnLnJlY29yZCh7XG4gICAgICAgIHR5cGU6ICdkaWFnbm9zdGljJyxcbiAgICAgICAgbW9kdWxlSWQsXG4gICAgICAgIGluc3RhbmNlSWQsXG4gICAgICAgIGNvZGUsXG4gICAgICAgIHNldmVyaXR5OiAnZXJyb3InLFxuICAgICAgICBtZXNzYWdlLFxuICAgICAgICBoaW50LFxuICAgICAgICBhY3Rpb25UYWc6IHByb2Nlc3NJZCxcbiAgICAgICAga2luZDogJ3Byb2Nlc3NfcnVudGltZScsXG4gICAgICB9KVxuICAgIH1cblxuICAgIGNvbnN0IHJlc29sdmVNaXNzaW5nRGVwZW5kZW5jaWVzID0gKGluc3RhbGxhdGlvbjogSW5zdGFsbGF0aW9uU3RhdGUpOiBSZWFkb25seUFycmF5PHN0cmluZz4gPT4ge1xuICAgICAgY29uc3QgZGVjbGFyZWQgPSBpbnN0YWxsYXRpb24uZGVmaW5pdGlvbi5yZXF1aXJlcyA/PyBbXVxuICAgICAgY29uc3QgaW1wbGljaXRGcm9tVHJpZ2dlcnM6IHN0cmluZ1tdID0gW11cbiAgICAgIGZvciAoY29uc3QgdHJpZ2dlciBvZiBpbnN0YWxsYXRpb24uZGVmaW5pdGlvbi50cmlnZ2Vycykge1xuICAgICAgICBpZiAodHJpZ2dlci5raW5kID09PSAnbW9kdWxlQWN0aW9uJyB8fCB0cmlnZ2VyLmtpbmQgPT09ICdtb2R1bGVTdGF0ZUNoYW5nZScpIHtcbiAgICAgICAgICBpbXBsaWNpdEZyb21UcmlnZ2Vycy5wdXNoKHRyaWdnZXIubW9kdWxlSWQpXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgY29uc3QgcmVxdWlyZXMgPSBBcnJheS5mcm9tKG5ldyBTZXQoWy4uLmRlY2xhcmVkLCAuLi5pbXBsaWNpdEZyb21UcmlnZ2Vyc10pKVxuICAgICAgaWYgKHJlcXVpcmVzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIFtdXG5cbiAgICAgIGNvbnN0IG1pc3Npbmc6IHN0cmluZ1tdID0gW11cbiAgICAgIGZvciAoY29uc3QgZGVwIG9mIHJlcXVpcmVzKSB7XG4gICAgICAgIGlmICh0eXBlb2YgZGVwICE9PSAnc3RyaW5nJyB8fCBkZXAubGVuZ3RoID09PSAwKSBjb250aW51ZVxuXG4gICAgICAgIC8vIE1vZHVsZVRhZyBrZXkgY29udmVudGlvbjogYEBsb2dpeGpzL01vZHVsZS8ke2lkfWA7IFRhZyBpZGVudGl0eSBpcyBkZXJpdmVkIGZyb20gdGhlIGtleSwgc28gd2UgY2FuIGNvbnN0cnVjdCBpdCBvbiBkZW1hbmQuXG4gICAgICAgIGNvbnN0IHRhZyA9IENvbnRleHQuVGFnKGBAbG9naXhqcy9Nb2R1bGUvJHtkZXB9YCkoKSBhcyBDb250ZXh0LlRhZzxhbnksIGFueT5cbiAgICAgICAgY29uc3QgZm91bmQgPSBDb250ZXh0LmdldE9wdGlvbihpbnN0YWxsYXRpb24uZW52LCB0YWcpXG4gICAgICAgIGlmIChPcHRpb24uaXNOb25lKGZvdW5kKSkge1xuICAgICAgICAgIG1pc3NpbmcucHVzaChkZXApXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBtaXNzaW5nXG4gICAgfVxuXG4gICAgY29uc3Qgc3RvcEluc3RhbmNlID0gKFxuICAgICAgaW5zdGFuY2U6IEluc3RhbmNlU3RhdGUsXG4gICAgICByZWFzb246IFByb2Nlc3NJbnN0YW5jZVN0YXR1c1snc3RvcHBlZFJlYXNvbiddLFxuICAgICk6IEVmZmVjdC5FZmZlY3Q8dm9pZD4gPT5cbiAgICAgIEVmZmVjdC5nZW4oZnVuY3Rpb24qICgpIHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIGluc3RhbmNlLnN0YXR1cy5zdGF0dXMgPT09ICdzdG9wcGVkJyB8fFxuICAgICAgICAgIGluc3RhbmNlLnN0YXR1cy5zdGF0dXMgPT09ICdmYWlsZWQnIHx8XG4gICAgICAgICAgaW5zdGFuY2Uuc3RhdHVzLnN0YXR1cyA9PT0gJ3N0b3BwaW5nJ1xuICAgICAgICApIHtcbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGZpYmVyID0gaW5zdGFuY2UuZmliZXJcbiAgICAgICAgaW5zdGFuY2Uuc3RhdHVzID0ge1xuICAgICAgICAgIC4uLmluc3RhbmNlLnN0YXR1cyxcbiAgICAgICAgICBzdGF0dXM6ICdzdG9wcGluZycsXG4gICAgICAgICAgc3RvcHBlZFJlYXNvbjogcmVhc29uLFxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGZpYmVyKSB7XG4gICAgICAgICAgeWllbGQqIEZpYmVyLmludGVycnVwdChmaWJlcilcbiAgICAgICAgfVxuXG4gICAgICAgIHlpZWxkKiBRdWV1ZS5zaHV0ZG93bihpbnN0YW5jZS5wbGF0Zm9ybVRyaWdnZXJzUXVldWUpXG5cbiAgICAgICAgaW5zdGFuY2Uuc3RhdHVzID0ge1xuICAgICAgICAgIC4uLmluc3RhbmNlLnN0YXR1cyxcbiAgICAgICAgICBzdGF0dXM6ICdzdG9wcGVkJyxcbiAgICAgICAgICBzdG9wcGVkUmVhc29uOiByZWFzb24sXG4gICAgICAgIH1cbiAgICAgICAgaW5zdGFuY2UuZmliZXIgPSB1bmRlZmluZWRcblxuICAgICAgICBjb25zdCBldnQ6IFByb2Nlc3NFdmVudCA9IHtcbiAgICAgICAgICB0eXBlOiAncHJvY2VzczpzdG9wJyxcbiAgICAgICAgICBpZGVudGl0eTogaW5zdGFuY2UuaWRlbnRpdHksXG4gICAgICAgICAgc2V2ZXJpdHk6ICdpbmZvJyxcbiAgICAgICAgICBldmVudFNlcTogaW5zdGFuY2UubmV4dEV2ZW50U2VxKyssXG4gICAgICAgICAgdGltZXN0YW1wTXM6IERhdGUubm93KCksXG4gICAgICAgIH1cbiAgICAgICAgeWllbGQqIGVtaXQoZXZ0KVxuXG4gICAgICAgIGNvbnN0IGluc3RhbGxhdGlvbiA9IGluc3RhbGxhdGlvbnMuZ2V0KGluc3RhbmNlLmluc3RhbGxhdGlvbktleSlcbiAgICAgICAgaWYgKGluc3RhbGxhdGlvbj8ucGVuZGluZ1N0YXJ0KSB7XG4gICAgICAgICAgaW5zdGFsbGF0aW9uLnBlbmRpbmdTdGFydCA9IHVuZGVmaW5lZFxuICAgICAgICAgIHlpZWxkKiBzdGFydEluc3RhbGxhdGlvbihpbnN0YW5jZS5pbnN0YWxsYXRpb25LZXkpXG4gICAgICAgIH1cbiAgICAgIH0pXG5cbiAgICBjb25zdCBzdGFydEluc3RhbGxhdGlvbjogKGluc3RhbGxhdGlvbktleTogSW5zdGFsbGF0aW9uS2V5KSA9PiBFZmZlY3QuRWZmZWN0PHZvaWQ+ID0gKGluc3RhbGxhdGlvbktleSkgPT5cbiAgICAgIEVmZmVjdC5nZW4oZnVuY3Rpb24qICgpIHtcbiAgICAgICAgY29uc3QgaW5zdGFsbGF0aW9uID0gaW5zdGFsbGF0aW9ucy5nZXQoaW5zdGFsbGF0aW9uS2V5KVxuICAgICAgICBpZiAoIWluc3RhbGxhdGlvbikgcmV0dXJuXG4gICAgICAgIGluc3RhbGxhdGlvbi5wZW5kaW5nU3RhcnQgPSB1bmRlZmluZWRcblxuICAgICAgICBjb25zdCBub29wID0geWllbGQqIHNob3VsZE5vb3BEdWVUb1N5bmNUeG4oaW5zdGFsbGF0aW9uLmlkZW50aXR5LnNjb3BlLCAncHJvY2Vzc19zdGFydF9pbl90cmFuc2FjdGlvbicpXG4gICAgICAgIGlmIChub29wKSByZXR1cm5cblxuICAgICAgICAvLyBEbyBub3Qgc3RhcnQgYWdhaW4gaWYgYW4gYWN0aXZlIGluc3RhbmNlIGFscmVhZHkgZXhpc3RzLlxuICAgICAgICBjb25zdCBjdXJyZW50SWQgPSBpbnN0YWxsYXRpb24uY3VycmVudEluc3RhbmNlSWRcbiAgICAgICAgaWYgKGN1cnJlbnRJZCkge1xuICAgICAgICAgIGNvbnN0IGN1cnJlbnQgPSBpbnN0YW5jZXMuZ2V0KGN1cnJlbnRJZClcbiAgICAgICAgICBpZiAoY3VycmVudCAmJiAoY3VycmVudC5zdGF0dXMuc3RhdHVzID09PSAncnVubmluZycgfHwgY3VycmVudC5zdGF0dXMuc3RhdHVzID09PSAnc3RhcnRpbmcnKSkge1xuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcnVuU2VxID0gaW5zdGFsbGF0aW9uLm5leHRSdW5TZXErK1xuICAgICAgICBjb25zdCBpZGVudGl0eTogUHJvY2Vzc0luc3RhbmNlSWRlbnRpdHkgPSB7XG4gICAgICAgICAgaWRlbnRpdHk6IGluc3RhbGxhdGlvbi5pZGVudGl0eSxcbiAgICAgICAgICBydW5TZXEsXG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcHJvY2Vzc0luc3RhbmNlSWQgPSBJZGVudGl0eS5wcm9jZXNzSW5zdGFuY2VJZEZyb21JZGVudGl0eShpZGVudGl0eSlcblxuICAgICAgICBjb25zdCBwbGF0Zm9ybVRyaWdnZXJzUXVldWUgPSB5aWVsZCogUXVldWUuc2xpZGluZzxQcm9jZXNzVHJpZ2dlcj4oNjQpXG5cbiAgICAgICAgY29uc3QgaW5zdGFuY2VTdGF0ZTogSW5zdGFuY2VTdGF0ZSA9IHtcbiAgICAgICAgICBpbnN0YWxsYXRpb25LZXksXG4gICAgICAgICAgcHJvY2Vzc0luc3RhbmNlSWQsXG4gICAgICAgICAgaWRlbnRpdHksXG4gICAgICAgICAgcHJvY2Vzc0lkOiBpbnN0YWxsYXRpb24uaWRlbnRpdHkucHJvY2Vzc0lkLFxuICAgICAgICAgIHNjb3BlOiBpbnN0YWxsYXRpb24uaWRlbnRpdHkuc2NvcGUsXG4gICAgICAgICAgZm9ya1Njb3BlOiBpbnN0YWxsYXRpb24uZm9ya1Njb3BlLFxuICAgICAgICAgIHBsYXRmb3JtVHJpZ2dlcnNRdWV1ZSxcbiAgICAgICAgICBzdGF0dXM6IHtcbiAgICAgICAgICAgIGlkZW50aXR5LFxuICAgICAgICAgICAgc3RhdHVzOiAnc3RhcnRpbmcnLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgbmV4dEV2ZW50U2VxOiAxLFxuICAgICAgICAgIG5leHRUcmlnZ2VyU2VxOiAxLFxuICAgICAgICB9XG5cbiAgICAgICAgaW5zdGFuY2VzLnNldChwcm9jZXNzSW5zdGFuY2VJZCwgaW5zdGFuY2VTdGF0ZSlcbiAgICAgICAgaW5zdGFsbGF0aW9uLmN1cnJlbnRJbnN0YW5jZUlkID0gcHJvY2Vzc0luc3RhbmNlSWRcblxuICAgICAgICAvLyBXaGVuIGZvcmtTY29wZSBpcyBkaXNwb3NlZCAoZS5nLiB1aVN1YnRyZWUgdW5tb3VudCksIGVuc3VyZSB0aGUgaW5zdGFuY2UgdHJhbnNpdGlvbnMgdG8gc3RvcHBlZCBhbmQgZW1pdHMgYSBzdG9wIGV2ZW50LlxuICAgICAgICAvLyAtIERvIG5vdCByZWx5IG9uIHVuc3RhYmxlIFwid2hldGhlciBpbnRlcnJ1cHRpb24gcmVhY2hlcyBjYXRjaEFsbENhdXNlXCIgYmVoYXZpb3IuXG4gICAgICAgIC8vIC0gRG8gbm90IGRvdWJsZS1yZWdpc3RlciBvbiBydW50aW1lU2NvcGU7IHRoZSBydW50aW1lIGZpbmFsaXplciBhbHJlYWR5IHN0b3BzIGFsbCBpbnN0YW5jZXMuXG4gICAgICAgIGlmIChpbnN0YWxsYXRpb24uZm9ya1Njb3BlICE9PSBydW50aW1lU2NvcGUpIHtcbiAgICAgICAgICB5aWVsZCogU2NvcGUuYWRkRmluYWxpemVyKFxuICAgICAgICAgICAgaW5zdGFsbGF0aW9uLmZvcmtTY29wZSBhcyBTY29wZS5DbG9zZWFibGVTY29wZSxcbiAgICAgICAgICAgIEVmZmVjdC5zdXNwZW5kKCgpID0+IHtcbiAgICAgICAgICAgICAgY29uc3Qgc3RhdHVzID0gaW5zdGFuY2VTdGF0ZS5zdGF0dXMuc3RhdHVzXG4gICAgICAgICAgICAgIGlmIChzdGF0dXMgPT09ICdzdG9wcGVkJyB8fCBzdGF0dXMgPT09ICdmYWlsZWQnIHx8IHN0YXR1cyA9PT0gJ3N0b3BwaW5nJykge1xuICAgICAgICAgICAgICAgIHJldHVybiBFZmZlY3Qudm9pZFxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHJldHVybiBzdG9wSW5zdGFuY2UoaW5zdGFuY2VTdGF0ZSwgJ3Njb3BlRGlzcG9zZWQnKVxuICAgICAgICAgICAgfSkucGlwZShFZmZlY3QuY2F0Y2hBbGxDYXVzZSgoKSA9PiBFZmZlY3Qudm9pZCkpLFxuICAgICAgICAgIClcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHN0YXJ0IGV2ZW50OiBpbmRpY2F0ZXMgdGhlIGluc3RhbmNlIGhhcyBlbnRlcmVkIHRoZSBzdGFydCBmbG93IChmaWJlciBoYXMgYmVlbiBmb3JrZWQpLlxuICAgICAgICB5aWVsZCogZW1pdCh7XG4gICAgICAgICAgdHlwZTogJ3Byb2Nlc3M6c3RhcnQnLFxuICAgICAgICAgIGlkZW50aXR5LFxuICAgICAgICAgIHNldmVyaXR5OiAnaW5mbycsXG4gICAgICAgICAgZXZlbnRTZXE6IGluc3RhbmNlU3RhdGUubmV4dEV2ZW50U2VxKyssXG4gICAgICAgICAgdGltZXN0YW1wTXM6IERhdGUubm93KCksXG4gICAgICAgIH0pXG5cbiAgICAgICAgY29uc3QgbWlzc2luZyA9IHJlc29sdmVNaXNzaW5nRGVwZW5kZW5jaWVzKGluc3RhbGxhdGlvbilcbiAgICAgICAgaWYgKG1pc3NpbmcubGVuZ3RoID4gMCkge1xuICAgICAgICAgIGNvbnN0IGhpbnQgPSBpc0RldkVudigpXG4gICAgICAgICAgICA/IFtcbiAgICAgICAgICAgICAgICAnU3RyaWN0IHNjb3BlIGRlcGVuZGVuY3kgcmVzb2x1dGlvbjogbWlzc2luZyByZXF1aXJlZCBtb2R1bGVzIGluIHRoZSBjdXJyZW50IHNjb3BlLicsXG4gICAgICAgICAgICAgICAgYG1pc3Npbmc6ICR7bWlzc2luZy5qb2luKCcsICcpfWAsXG4gICAgICAgICAgICAgICAgJycsXG4gICAgICAgICAgICAgICAgJ2ZpeDonLFxuICAgICAgICAgICAgICAgICctIFByb3ZpZGUgdGhlIG1pc3NpbmcgbW9kdWxlIGltcGxlbWVudGF0aW9uKHMpIGluIHRoZSBzYW1lIHNjb3BlIHZpYSBpbXBvcnRzLicsXG4gICAgICAgICAgICAgICAgYCAgRXhhbXBsZTogUm9vdE1vZHVsZS5pbXBsZW1lbnQoeyBpbXBvcnRzOiBbJHttaXNzaW5nWzBdfS5pbXBsZW1lbnQoLi4uKS5pbXBsXSwgcHJvY2Vzc2VzOiBbLi4uXSB9KWAsXG4gICAgICAgICAgICAgICAgJy0gRG8gbm90IHJlbHkgb24gY3Jvc3Mtc2NvcGUgZmFsbGJhY2tzIC8gZ3Vlc3NpbmcgaW5zdGFuY2VzLicsXG4gICAgICAgICAgICAgIF0uam9pbignXFxuJylcbiAgICAgICAgICAgIDogdW5kZWZpbmVkXG5cbiAgICAgICAgICBjb25zdCBlcnJvcjogU2VyaWFsaXphYmxlRXJyb3JTdW1tYXJ5ID0ge1xuICAgICAgICAgICAgbWVzc2FnZTogYE1pc3NpbmcgZGVwZW5kZW5jaWVzIGluIHNjb3BlOiAke21pc3Npbmcuam9pbignLCAnKX1gLFxuICAgICAgICAgICAgY29kZTogJ3Byb2Nlc3M6Om1pc3NpbmdfZGVwZW5kZW5jeScsXG4gICAgICAgICAgICBoaW50LFxuICAgICAgICAgIH1cblxuICAgICAgICAgIGluc3RhbmNlU3RhdGUuc3RhdHVzID0ge1xuICAgICAgICAgICAgLi4uaW5zdGFuY2VTdGF0ZS5zdGF0dXMsXG4gICAgICAgICAgICBzdGF0dXM6ICdmYWlsZWQnLFxuICAgICAgICAgICAgc3RvcHBlZFJlYXNvbjogJ2ZhaWxlZCcsXG4gICAgICAgICAgICBsYXN0RXJyb3I6IGVycm9yLFxuICAgICAgICAgIH1cblxuICAgICAgICAgIHlpZWxkKiBlbWl0KHtcbiAgICAgICAgICAgIHR5cGU6ICdwcm9jZXNzOmVycm9yJyxcbiAgICAgICAgICAgIGlkZW50aXR5LFxuICAgICAgICAgICAgc2V2ZXJpdHk6ICdlcnJvcicsXG4gICAgICAgICAgICBldmVudFNlcTogaW5zdGFuY2VTdGF0ZS5uZXh0RXZlbnRTZXErKyxcbiAgICAgICAgICAgIHRpbWVzdGFtcE1zOiBEYXRlLm5vdygpLFxuICAgICAgICAgICAgZXJyb3IsXG4gICAgICAgICAgfSlcblxuICAgICAgICAgIHlpZWxkKiBlbWl0RXJyb3JEaWFnbm9zdGljKFxuICAgICAgICAgICAgaW5zdGFsbGF0aW9uLmlkZW50aXR5LnNjb3BlLFxuICAgICAgICAgICAgaW5zdGFsbGF0aW9uLmlkZW50aXR5LnByb2Nlc3NJZCxcbiAgICAgICAgICAgICdwcm9jZXNzOjptaXNzaW5nX2RlcGVuZGVuY3knLFxuICAgICAgICAgICAgZXJyb3IubWVzc2FnZSxcbiAgICAgICAgICAgIGhpbnQsXG4gICAgICAgICAgKVxuICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgc2hvdWxkUmVjb3JkQ2hhaW5FdmVudHMgPSBpbnN0YWxsYXRpb24uZGVmaW5pdGlvbi5kaWFnbm9zdGljc0xldmVsICE9PSAnb2ZmJ1xuXG4gICAgICAgIGNvbnN0IGJhc2VFbnYgPSBpbnN0YWxsYXRpb24uZW52XG5cbiAgICAgICAgY29uc3QgbWFrZVdyYXBwZWRFbnYgPSAoKTogQ29udGV4dC5Db250ZXh0PGFueT4gPT4ge1xuICAgICAgICAgIGlmICghc2hvdWxkUmVjb3JkQ2hhaW5FdmVudHMpIHtcbiAgICAgICAgICAgIHJldHVybiBiYXNlRW52XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29uc3QgcmVxdWlyZXMgPSBpbnN0YWxsYXRpb24uZGVmaW5pdGlvbi5yZXF1aXJlcyA/PyBbXVxuICAgICAgICAgIGlmIChyZXF1aXJlcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiBiYXNlRW52XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29uc3QgaWRzID0gQXJyYXkuZnJvbShuZXcgU2V0KHJlcXVpcmVzKSlcbiAgICAgICAgICBsZXQgbmV4dEVudiA9IGJhc2VFbnZcblxuICAgICAgICAgIGZvciAoY29uc3QgbW9kdWxlSWQgb2YgaWRzKSB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIG1vZHVsZUlkICE9PSAnc3RyaW5nJyB8fCBtb2R1bGVJZC5sZW5ndGggPT09IDApIGNvbnRpbnVlXG4gICAgICAgICAgICBjb25zdCB0YWcgPSBDb250ZXh0LlRhZyhgQGxvZ2l4anMvTW9kdWxlLyR7bW9kdWxlSWR9YCkoKSBhcyBDb250ZXh0LlRhZzxhbnksIGFueT5cbiAgICAgICAgICAgIGNvbnN0IGZvdW5kID0gQ29udGV4dC5nZXRPcHRpb24oYmFzZUVudiwgdGFnKVxuICAgICAgICAgICAgaWYgKE9wdGlvbi5pc05vbmUoZm91bmQpKSBjb250aW51ZVxuICAgICAgICAgICAgY29uc3QgcnVudGltZSA9IGZvdW5kLnZhbHVlIGFzIGFueVxuXG4gICAgICAgICAgICBjb25zdCByZWNvcmREaXNwYXRjaCA9IChhY3Rpb246IHVua25vd24pID0+XG4gICAgICAgICAgICAgIEVmZmVjdC5nZW4oZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICAgICAgICBjb25zdCB0cmlnZ2VyID0geWllbGQqIEZpYmVyUmVmLmdldChjdXJyZW50UHJvY2Vzc1RyaWdnZXIpXG4gICAgICAgICAgICAgICAgaWYgKCF0cmlnZ2VyKSByZXR1cm5cblxuICAgICAgICAgICAgICAgIGNvbnN0IGFjdGlvbklkID0gYWN0aW9uSWRGcm9tVW5rbm93bihhY3Rpb24pID8/ICd1bmtub3duJ1xuICAgICAgICAgICAgICAgIGNvbnN0IGRpc3BhdGNoTW9kdWxlSWQgPSB0eXBlb2YgcnVudGltZS5tb2R1bGVJZCA9PT0gJ3N0cmluZycgPyBydW50aW1lLm1vZHVsZUlkIDogbW9kdWxlSWRcbiAgICAgICAgICAgICAgICBjb25zdCBkaXNwYXRjaEluc3RhbmNlSWQgPSB0eXBlb2YgcnVudGltZS5pbnN0YW5jZUlkID09PSAnc3RyaW5nJyA/IHJ1bnRpbWUuaW5zdGFuY2VJZCA6ICd1bmtub3duJ1xuXG4gICAgICAgICAgICAgICAgY29uc3QgZXZ0OiBQcm9jZXNzRXZlbnQgPSB7XG4gICAgICAgICAgICAgICAgICB0eXBlOiAncHJvY2VzczpkaXNwYXRjaCcsXG4gICAgICAgICAgICAgICAgICBpZGVudGl0eSxcbiAgICAgICAgICAgICAgICAgIHRyaWdnZXIsXG4gICAgICAgICAgICAgICAgICBkaXNwYXRjaDoge1xuICAgICAgICAgICAgICAgICAgICBtb2R1bGVJZDogZGlzcGF0Y2hNb2R1bGVJZCxcbiAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2VJZDogZGlzcGF0Y2hJbnN0YW5jZUlkLFxuICAgICAgICAgICAgICAgICAgICBhY3Rpb25JZCxcbiAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICBzZXZlcml0eTogJ2luZm8nLFxuICAgICAgICAgICAgICAgICAgZXZlbnRTZXE6IGluc3RhbmNlU3RhdGUubmV4dEV2ZW50U2VxKyssXG4gICAgICAgICAgICAgICAgICB0aW1lc3RhbXBNczogRGF0ZS5ub3coKSxcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB5aWVsZCogZW1pdChldnQpXG4gICAgICAgICAgICAgIH0pXG5cbiAgICAgICAgICAgIGNvbnN0IHdyYXBwZWQgPSB7XG4gICAgICAgICAgICAgIC4uLnJ1bnRpbWUsXG4gICAgICAgICAgICAgIGRpc3BhdGNoOiAoYWN0aW9uOiB1bmtub3duKSA9PiBydW50aW1lLmRpc3BhdGNoKGFjdGlvbikucGlwZShFZmZlY3QudGFwKCgpID0+IHJlY29yZERpc3BhdGNoKGFjdGlvbikpKSxcbiAgICAgICAgICAgICAgZGlzcGF0Y2hMb3dQcmlvcml0eTogKGFjdGlvbjogdW5rbm93bikgPT5cbiAgICAgICAgICAgICAgICBydW50aW1lLmRpc3BhdGNoTG93UHJpb3JpdHkoYWN0aW9uKS5waXBlKEVmZmVjdC50YXAoKCkgPT4gcmVjb3JkRGlzcGF0Y2goYWN0aW9uKSkpLFxuICAgICAgICAgICAgICBkaXNwYXRjaEJhdGNoOiAoYWN0aW9uczogUmVhZG9ubHlBcnJheTx1bmtub3duPikgPT5cbiAgICAgICAgICAgICAgICBydW50aW1lXG4gICAgICAgICAgICAgICAgICAuZGlzcGF0Y2hCYXRjaChhY3Rpb25zKVxuICAgICAgICAgICAgICAgICAgLnBpcGUoRWZmZWN0LnRhcCgoKSA9PiBFZmZlY3QuZm9yRWFjaChhY3Rpb25zLCByZWNvcmREaXNwYXRjaCwgeyBkaXNjYXJkOiB0cnVlIH0pKSksXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIG5leHRFbnYgPSBDb250ZXh0LmFkZCh0YWcsIHdyYXBwZWQpKG5leHRFbnYpXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIG5leHRFbnZcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHdyYXBwZWRFbnYgPSBtYWtlV3JhcHBlZEVudigpXG4gICAgICAgIGNvbnN0IHByb3ZpZGVkUHJvY2VzcyA9IEVmZmVjdC5wcm92aWRlKGluc3RhbGxhdGlvbi5wcm9jZXNzLCB3cmFwcGVkRW52KVxuXG4gICAgICAgIGNvbnN0IG1ha2VUcmlnZ2VyU3RyZWFtID0gKHNwZWM6IE5vblBsYXRmb3JtVHJpZ2dlclNwZWMpOiBFZmZlY3QuRWZmZWN0PFN0cmVhbS5TdHJlYW08UHJvY2Vzc1RyaWdnZXI+LCBFcnJvcj4gPT5cbiAgICAgICAgICBFZmZlY3QuZ2VuKGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICBpZiAoc3BlYy5raW5kID09PSAndGltZXInKSB7XG4gICAgICAgICAgICAgIGNvbnN0IGludGVydmFsID0gRHVyYXRpb24uZGVjb2RlVW5rbm93bihzcGVjLnRpbWVySWQpXG4gICAgICAgICAgICAgIGlmIChPcHRpb24uaXNOb25lKGludGVydmFsKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGVyciA9IG5ldyBFcnJvcihgW1Byb2Nlc3NSdW50aW1lXSBpbnZhbGlkIHRpbWVySWQgKGV4cGVjdGVkIER1cmF0aW9uSW5wdXQpOiAke3NwZWMudGltZXJJZH1gKVxuICAgICAgICAgICAgICAgIDsoZXJyIGFzIGFueSkuY29kZSA9ICdwcm9jZXNzOjppbnZhbGlkX3RpbWVyX2lkJ1xuICAgICAgICAgICAgICAgIDsoZXJyIGFzIGFueSkuaGludCA9XG4gICAgICAgICAgICAgICAgICBcInRpbWVySWQgbXVzdCBiZSBhIHZhbGlkIER1cmF0aW9uSW5wdXQgc3RyaW5nLCBlLmcuICcxMCBtaWxsaXMnLCAnMSBzZWNvbmRzJywgJzUgbWludXRlcycuXCJcbiAgICAgICAgICAgICAgICByZXR1cm4geWllbGQqIEVmZmVjdC5mYWlsKGVycilcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIHJldHVybiBTdHJlYW0udGljayhpbnRlcnZhbC52YWx1ZSkucGlwZShcbiAgICAgICAgICAgICAgICBTdHJlYW0ubWFwKFxuICAgICAgICAgICAgICAgICAgKCkgPT5cbiAgICAgICAgICAgICAgICAgICAgKHtcbiAgICAgICAgICAgICAgICAgICAgICBraW5kOiAndGltZXInLFxuICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IHNwZWMubmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICB0aW1lcklkOiBzcGVjLnRpbWVySWQsXG4gICAgICAgICAgICAgICAgICAgIH0pIHNhdGlzZmllcyBQcm9jZXNzVHJpZ2dlcixcbiAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChzcGVjLmtpbmQgPT09ICdtb2R1bGVBY3Rpb24nKSB7XG4gICAgICAgICAgICAgIGNvbnN0IHRhZyA9IENvbnRleHQuVGFnKGBAbG9naXhqcy9Nb2R1bGUvJHtzcGVjLm1vZHVsZUlkfWApKCkgYXMgQ29udGV4dC5UYWc8YW55LCBhbnk+XG4gICAgICAgICAgICAgIGNvbnN0IGZvdW5kID0gQ29udGV4dC5nZXRPcHRpb24oYmFzZUVudiwgdGFnKVxuICAgICAgICAgICAgICBpZiAoT3B0aW9uLmlzTm9uZShmb3VuZCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4geWllbGQqIEVmZmVjdC5mYWlsKG5ldyBFcnJvcihgTWlzc2luZyBtb2R1bGUgcnVudGltZSBpbiBzY29wZTogJHtzcGVjLm1vZHVsZUlkfWApKVxuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgY29uc3QgcnVudGltZSA9IGZvdW5kLnZhbHVlIGFzIGFueVxuXG4gICAgICAgICAgICAgIC8vIHBlcmY6IHdoZW4gZGlhZ25vc3RpY3M9b2ZmLCBhdm9pZCBzdWJzY3JpYmluZyB0byBhY3Rpb25zV2l0aE1ldGEkIChwdWJsaXNoZWQgaW5zaWRlIHR4bnM7IG1vcmUgc3Vic2NyaWJlcnMgaHVydCBob3QgcGF0aHMpLlxuICAgICAgICAgICAgICAvLyBkaWFnbm9zdGljcz1saWdodC9mdWxsIG5lZWRzIHR4blNlcS90eG5JZCBhbmNob3JzLCBzbyBvbmx5IHVzZSBhY3Rpb25zV2l0aE1ldGEkIHdoZW4gY2hhaW4gZXZlbnRzIGFyZSBlbmFibGVkLlxuICAgICAgICAgICAgICBpZiAoIXNob3VsZFJlY29yZENoYWluRXZlbnRzKSB7XG4gICAgICAgICAgICAgICAgY29uc3Qgc3RyZWFtID0gcnVudGltZS5hY3Rpb25zJCBhcyBTdHJlYW0uU3RyZWFtPGFueT4gfCB1bmRlZmluZWRcbiAgICAgICAgICAgICAgICBpZiAoIXN0cmVhbSkge1xuICAgICAgICAgICAgICAgICAgY29uc3QgZXJyID0gbmV3IEVycm9yKCdNb2R1bGVSdW50aW1lIGRvZXMgbm90IHByb3ZpZGUgYWN0aW9ucyQgKHJlcXVpcmVkIGZvciBtb2R1bGVBY3Rpb24gdHJpZ2dlcikuJylcbiAgICAgICAgICAgICAgICAgIDsoZXJyIGFzIGFueSkuY29kZSA9ICdwcm9jZXNzOjptaXNzaW5nX2FjdGlvbl9zdHJlYW0nXG4gICAgICAgICAgICAgICAgICA7KGVyciBhcyBhbnkpLmhpbnQgPSBgbW9kdWxlSWQ9JHtzcGVjLm1vZHVsZUlkfWBcbiAgICAgICAgICAgICAgICAgIHJldHVybiB5aWVsZCogRWZmZWN0LmZhaWwoZXJyKVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHJldHVybiBzdHJlYW0ucGlwZShcbiAgICAgICAgICAgICAgICAgIFN0cmVhbS5maWx0ZXIoKGFjdGlvbjogYW55KSA9PiBhY3Rpb25JZEZyb21Vbmtub3duKGFjdGlvbikgPT09IHNwZWMuYWN0aW9uSWQpLFxuICAgICAgICAgICAgICAgICAgU3RyZWFtLm1hcChcbiAgICAgICAgICAgICAgICAgICAgKCkgPT5cbiAgICAgICAgICAgICAgICAgICAgICAoe1xuICAgICAgICAgICAgICAgICAgICAgICAga2luZDogJ21vZHVsZUFjdGlvbicsXG4gICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiBzcGVjLm5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGVJZDogc3BlYy5tb2R1bGVJZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlSWQ6IHJ1bnRpbWUuaW5zdGFuY2VJZCBhcyBzdHJpbmcsXG4gICAgICAgICAgICAgICAgICAgICAgICBhY3Rpb25JZDogc3BlYy5hY3Rpb25JZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHR4blNlcTogMSxcbiAgICAgICAgICAgICAgICAgICAgICB9KSBzYXRpc2ZpZXMgUHJvY2Vzc1RyaWdnZXIsXG4gICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIGNvbnN0IHN0cmVhbSA9IHJ1bnRpbWUuYWN0aW9uc1dpdGhNZXRhJCBhcyBTdHJlYW0uU3RyZWFtPGFueT4gfCB1bmRlZmluZWRcbiAgICAgICAgICAgICAgaWYgKCFzdHJlYW0pIHtcbiAgICAgICAgICAgICAgICBjb25zdCBlcnIgPSBuZXcgRXJyb3IoXG4gICAgICAgICAgICAgICAgICAnTW9kdWxlUnVudGltZSBkb2VzIG5vdCBwcm92aWRlIGFjdGlvbnNXaXRoTWV0YSQgKHJlcXVpcmVkIGZvciBtb2R1bGVBY3Rpb24gdHJpZ2dlcikuJyxcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgOyhlcnIgYXMgYW55KS5jb2RlID0gJ3Byb2Nlc3M6Om1pc3NpbmdfYWN0aW9uX21ldGFfc3RyZWFtJ1xuICAgICAgICAgICAgICAgIDsoZXJyIGFzIGFueSkuaGludCA9IGBtb2R1bGVJZD0ke3NwZWMubW9kdWxlSWR9YFxuICAgICAgICAgICAgICAgIHJldHVybiB5aWVsZCogRWZmZWN0LmZhaWwoZXJyKVxuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgcmV0dXJuIHN0cmVhbS5waXBlKFxuICAgICAgICAgICAgICAgIFN0cmVhbS5maWx0ZXIoKGV2dDogYW55KSA9PiBhY3Rpb25JZEZyb21Vbmtub3duKGV2dC52YWx1ZSkgPT09IHNwZWMuYWN0aW9uSWQpLFxuICAgICAgICAgICAgICAgIFN0cmVhbS5tYXAoKGV2dDogYW55KSA9PiB7XG4gICAgICAgICAgICAgICAgICBjb25zdCB0eG5TZXEgPSBldnQ/Lm1ldGE/LnR4blNlcVxuICAgICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAga2luZDogJ21vZHVsZUFjdGlvbicsXG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IHNwZWMubmFtZSxcbiAgICAgICAgICAgICAgICAgICAgbW9kdWxlSWQ6IHNwZWMubW9kdWxlSWQsXG4gICAgICAgICAgICAgICAgICAgIGluc3RhbmNlSWQ6IHJ1bnRpbWUuaW5zdGFuY2VJZCBhcyBzdHJpbmcsXG4gICAgICAgICAgICAgICAgICAgIGFjdGlvbklkOiBzcGVjLmFjdGlvbklkLFxuICAgICAgICAgICAgICAgICAgICB0eG5TZXE6IHR5cGVvZiB0eG5TZXEgPT09ICdudW1iZXInID8gdHhuU2VxIDogMSxcbiAgICAgICAgICAgICAgICAgIH0gc2F0aXNmaWVzIFByb2Nlc3NUcmlnZ2VyXG4gICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gbW9kdWxlU3RhdGVDaGFuZ2VcbiAgICAgICAgICAgIGNvbnN0IHRhZyA9IENvbnRleHQuVGFnKGBAbG9naXhqcy9Nb2R1bGUvJHtzcGVjLm1vZHVsZUlkfWApKCkgYXMgQ29udGV4dC5UYWc8YW55LCBhbnk+XG4gICAgICAgICAgICBjb25zdCBmb3VuZCA9IENvbnRleHQuZ2V0T3B0aW9uKGJhc2VFbnYsIHRhZylcbiAgICAgICAgICAgIGlmIChPcHRpb24uaXNOb25lKGZvdW5kKSkge1xuICAgICAgICAgICAgICByZXR1cm4geWllbGQqIEVmZmVjdC5mYWlsKG5ldyBFcnJvcihgTWlzc2luZyBtb2R1bGUgcnVudGltZSBpbiBzY29wZTogJHtzcGVjLm1vZHVsZUlkfWApKVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBydW50aW1lID0gZm91bmQudmFsdWUgYXMgYW55XG4gICAgICAgICAgICBjb25zdCBzY2hlbWFBc3QgPSByZXNvbHZlUnVudGltZVN0YXRlU2NoZW1hQXN0KHJ1bnRpbWUpXG4gICAgICAgICAgICBjb25zdCBzZWxlY3RvclJlc3VsdCA9IG1ha2VTY2hlbWFTZWxlY3RvcihzcGVjLnBhdGgsIHNjaGVtYUFzdClcbiAgICAgICAgICAgIGlmICghc2VsZWN0b3JSZXN1bHQub2spIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHlpZWxkKiBFZmZlY3QuZmFpbCh3aXRoTW9kdWxlSGludChzZWxlY3RvclJlc3VsdC5lcnJvciwgc3BlYy5tb2R1bGVJZCkpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBzZWxlY3RvckJhc2UgPSBzZWxlY3RvclJlc3VsdC5zZWxlY3RvclxuICAgICAgICAgICAgY29uc3QgcHJldlJlZiA9IHlpZWxkKiBSZWYubWFrZTxPcHRpb24uT3B0aW9uPHVua25vd24+PihPcHRpb24ubm9uZSgpKVxuXG4gICAgICAgICAgICBjb25zdCBlbmFibGVTZWxlY3RvckRpYWdub3N0aWNzID0gc2hvdWxkUmVjb3JkQ2hhaW5FdmVudHNcblxuICAgICAgICAgICAgY29uc3Qgc2VsZWN0b3JEaWFnbm9zdGljc1JlZiA9IGVuYWJsZVNlbGVjdG9yRGlhZ25vc3RpY3NcbiAgICAgICAgICAgICAgPyB5aWVsZCogUmVmLm1ha2Uoe1xuICAgICAgICAgICAgICAgICAgd2luZG93U3RhcnRlZE1zOiBEYXRlLm5vdygpLFxuICAgICAgICAgICAgICAgICAgdHJpZ2dlcnNJbldpbmRvdzogMCxcbiAgICAgICAgICAgICAgICAgIGxhc3RXYXJuaW5nQXRNczogMCxcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICA6IHVuZGVmaW5lZFxuXG4gICAgICAgICAgICBjb25zdCBzYW1wbGVFdmVyeU1hc2sgPSAweDdmIC8vIHNhbXBsZSBldmVyeSAxMjggY2FsbHNcbiAgICAgICAgICAgIGNvbnN0IHNsb3dTYW1wbGVUaHJlc2hvbGRNcyA9IDRcbiAgICAgICAgICAgIGNvbnN0IHRyaWdnZXJXaW5kb3dNcyA9IDEwMDBcbiAgICAgICAgICAgIGNvbnN0IHRyaWdnZXJXYXJuaW5nVGhyZXNob2xkID0gaXNEZXZFbnYoKSA/IDIwIDogMjAwXG4gICAgICAgICAgICBjb25zdCB3YXJuaW5nQ29vbGRvd25NcyA9IDMwXzAwMFxuXG4gICAgICAgICAgICBsZXQgc2VsZWN0b3JDYWxscyA9IDBcbiAgICAgICAgICAgIGxldCBzZWxlY3RvclNhbXBsZXMgPSAwXG4gICAgICAgICAgICBsZXQgc2VsZWN0b3JTbG93U2FtcGxlcyA9IDBcbiAgICAgICAgICAgIGxldCBzZWxlY3Rvck1heFNhbXBsZU1zID0gMFxuXG4gICAgICAgICAgICBjb25zdCBub3dNcyA9ICgpOiBudW1iZXIgPT4ge1xuICAgICAgICAgICAgICBpZiAodHlwZW9mIHBlcmZvcm1hbmNlICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlb2YgcGVyZm9ybWFuY2Uubm93ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHBlcmZvcm1hbmNlLm5vdygpXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgcmV0dXJuIERhdGUubm93KClcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3Qgc2VsZWN0b3IgPSBlbmFibGVTZWxlY3RvckRpYWdub3N0aWNzXG4gICAgICAgICAgICAgID8gKHN0YXRlOiB1bmtub3duKTogdW5rbm93biA9PiB7XG4gICAgICAgICAgICAgICAgICBzZWxlY3RvckNhbGxzICs9IDFcbiAgICAgICAgICAgICAgICAgIGlmICgoc2VsZWN0b3JDYWxscyAmIHNhbXBsZUV2ZXJ5TWFzaykgIT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGVjdG9yQmFzZShzdGF0ZSlcbiAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgY29uc3QgdDAgPSBub3dNcygpXG4gICAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9IHNlbGVjdG9yQmFzZShzdGF0ZSlcbiAgICAgICAgICAgICAgICAgIGNvbnN0IGR0ID0gbm93TXMoKSAtIHQwXG5cbiAgICAgICAgICAgICAgICAgIHNlbGVjdG9yU2FtcGxlcyArPSAxXG4gICAgICAgICAgICAgICAgICBpZiAoZHQgPj0gc2xvd1NhbXBsZVRocmVzaG9sZE1zKSB7XG4gICAgICAgICAgICAgICAgICAgIHNlbGVjdG9yU2xvd1NhbXBsZXMgKz0gMVxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgaWYgKGR0ID4gc2VsZWN0b3JNYXhTYW1wbGVNcykge1xuICAgICAgICAgICAgICAgICAgICBzZWxlY3Rvck1heFNhbXBsZU1zID0gZHRcbiAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICA6IHNlbGVjdG9yQmFzZVxuXG4gICAgICAgICAgICBjb25zdCBtYXliZVdhcm5TZWxlY3RvciA9ICh0cmlnZ2VyOiBQcm9jZXNzVHJpZ2dlcik6IEVmZmVjdC5FZmZlY3Q8dm9pZD4gPT4ge1xuICAgICAgICAgICAgICBpZiAoIXNlbGVjdG9yRGlhZ25vc3RpY3NSZWYpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gRWZmZWN0LnZvaWRcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIHJldHVybiBFZmZlY3QuZ2VuKGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICAgICAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKVxuXG4gICAgICAgICAgICAgICAgY29uc3QgZGVjaXNpb24gPSB5aWVsZCogUmVmLm1vZGlmeShzZWxlY3RvckRpYWdub3N0aWNzUmVmLCAocykgPT4ge1xuICAgICAgICAgICAgICAgICAgY29uc3Qgd2luZG93RXhwaXJlZCA9IG5vdyAtIHMud2luZG93U3RhcnRlZE1zID49IHRyaWdnZXJXaW5kb3dNc1xuICAgICAgICAgICAgICAgICAgY29uc3Qgd2luZG93U3RhcnRlZE1zID0gd2luZG93RXhwaXJlZCA/IG5vdyA6IHMud2luZG93U3RhcnRlZE1zXG4gICAgICAgICAgICAgICAgICBjb25zdCB0cmlnZ2Vyc0luV2luZG93ID0gd2luZG93RXhwaXJlZCA/IDEgOiBzLnRyaWdnZXJzSW5XaW5kb3cgKyAxXG5cbiAgICAgICAgICAgICAgICAgIGNvbnN0IHNob3VsZENvb2xkb3duID0gbm93IC0gcy5sYXN0V2FybmluZ0F0TXMgPCB3YXJuaW5nQ29vbGRvd25Nc1xuICAgICAgICAgICAgICAgICAgY29uc3QgdG9vRnJlcXVlbnQgPSB0cmlnZ2Vyc0luV2luZG93ID49IHRyaWdnZXJXYXJuaW5nVGhyZXNob2xkXG4gICAgICAgICAgICAgICAgICBjb25zdCB0b29TbG93ID0gc2VsZWN0b3JNYXhTYW1wbGVNcyA+PSBzbG93U2FtcGxlVGhyZXNob2xkTXMgJiYgc2VsZWN0b3JTYW1wbGVzID4gMFxuICAgICAgICAgICAgICAgICAgY29uc3Qgc2hvdWxkV2FybiA9ICFzaG91bGRDb29sZG93biAmJiAodG9vRnJlcXVlbnQgfHwgdG9vU2xvdylcblxuICAgICAgICAgICAgICAgICAgY29uc3QgbmV4dCA9IHNob3VsZFdhcm5cbiAgICAgICAgICAgICAgICAgICAgPyB7XG4gICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3dTdGFydGVkTXM6IG5vdyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyaWdnZXJzSW5XaW5kb3c6IDAsXG4gICAgICAgICAgICAgICAgICAgICAgICBsYXN0V2FybmluZ0F0TXM6IG5vdyxcbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIDoge1xuICAgICAgICAgICAgICAgICAgICAgICAgLi4ucyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvd1N0YXJ0ZWRNcyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyaWdnZXJzSW5XaW5kb3csXG4gICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgc2hvdWxkV2FybixcbiAgICAgICAgICAgICAgICAgICAgICB0b29GcmVxdWVudCxcbiAgICAgICAgICAgICAgICAgICAgICB0b29TbG93LFxuICAgICAgICAgICAgICAgICAgICAgIHRyaWdnZXJzSW5XaW5kb3csXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIG5leHQsXG4gICAgICAgICAgICAgICAgICBdIGFzIGNvbnN0XG4gICAgICAgICAgICAgICAgfSlcblxuICAgICAgICAgICAgICAgIGlmICghZGVjaXNpb24uc2hvdWxkV2Fybikge1xuICAgICAgICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgY29uc3QgY29kZSA9IGRlY2lzaW9uLnRvb0ZyZXF1ZW50ID8gJ3Byb2Nlc3M6OnNlbGVjdG9yX2hpZ2hfZnJlcXVlbmN5JyA6ICdwcm9jZXNzOjpzZWxlY3Rvcl9zbG93J1xuXG4gICAgICAgICAgICAgICAgY29uc3QgaGludCA9IFtcbiAgICAgICAgICAgICAgICAgIGBtb2R1bGVJZD0ke3NwZWMubW9kdWxlSWR9YCxcbiAgICAgICAgICAgICAgICAgIGBwYXRoPSR7c3BlYy5wYXRofWAsXG4gICAgICAgICAgICAgICAgICBgd2luZG93TXM9JHt0cmlnZ2VyV2luZG93TXN9YCxcbiAgICAgICAgICAgICAgICAgIGB0cmlnZ2Vyc0luV2luZG93PSR7ZGVjaXNpb24udHJpZ2dlcnNJbldpbmRvd31gLFxuICAgICAgICAgICAgICAgICAgYHRocmVzaG9sZD0ke3RyaWdnZXJXYXJuaW5nVGhyZXNob2xkfWAsXG4gICAgICAgICAgICAgICAgICBgY29vbGRvd25Ncz0ke3dhcm5pbmdDb29sZG93bk1zfWAsXG4gICAgICAgICAgICAgICAgICAnJyxcbiAgICAgICAgICAgICAgICAgICdzZWxlY3RvciBzYW1wbGluZzonLFxuICAgICAgICAgICAgICAgICAgYGNhbGxzPSR7c2VsZWN0b3JDYWxsc31gLFxuICAgICAgICAgICAgICAgICAgYHNhbXBsZWQ9JHtzZWxlY3RvclNhbXBsZXN9YCxcbiAgICAgICAgICAgICAgICAgIGBzbG93U2FtcGxlcyg+PSR7c2xvd1NhbXBsZVRocmVzaG9sZE1zfW1zKT0ke3NlbGVjdG9yU2xvd1NhbXBsZXN9YCxcbiAgICAgICAgICAgICAgICAgIGBtYXhTYW1wbGVNcz0ke3NlbGVjdG9yTWF4U2FtcGxlTXMudG9GaXhlZCgyKX1gLFxuICAgICAgICAgICAgICAgICAgJycsXG4gICAgICAgICAgICAgICAgICAnbm90ZXM6JyxcbiAgICAgICAgICAgICAgICAgICctIEVuc3VyZSB0aGUgc2VsZWN0ZWQgdmFsdWUgaXMgc3RhYmxlIChwcmVmZXIgcHJpbWl0aXZlL3R1cGxlOyBhdm9pZCByZXR1cm5pbmcgZnJlc2ggb2JqZWN0cykuJyxcbiAgICAgICAgICAgICAgICAgICctIE5hcnJvdyB0aGUgcGF0aCB0byByZWR1Y2UgY2hhbmdlIGZyZXF1ZW5jeTsgYXZvaWQgc2VsZWN0aW5nIGxhcmdlIG9iamVjdHMuJyxcbiAgICAgICAgICAgICAgICBdLmpvaW4oJ1xcbicpXG5cbiAgICAgICAgICAgICAgICBzZWxlY3RvclNhbXBsZXMgPSAwXG4gICAgICAgICAgICAgICAgc2VsZWN0b3JTbG93U2FtcGxlcyA9IDBcbiAgICAgICAgICAgICAgICBzZWxlY3Rvck1heFNhbXBsZU1zID0gMFxuXG4gICAgICAgICAgICAgICAgeWllbGQqIGVtaXQoe1xuICAgICAgICAgICAgICAgICAgdHlwZTogJ3Byb2Nlc3M6dHJpZ2dlcicsXG4gICAgICAgICAgICAgICAgICBpZGVudGl0eSxcbiAgICAgICAgICAgICAgICAgIHRyaWdnZXIsXG4gICAgICAgICAgICAgICAgICBzZXZlcml0eTogJ3dhcm5pbmcnLFxuICAgICAgICAgICAgICAgICAgZXZlbnRTZXE6IGluc3RhbmNlU3RhdGUubmV4dEV2ZW50U2VxKyssXG4gICAgICAgICAgICAgICAgICB0aW1lc3RhbXBNczogRGF0ZS5ub3coKSxcbiAgICAgICAgICAgICAgICAgIGVycm9yOiB7XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6ICdtb2R1bGVTdGF0ZUNoYW5nZSBzZWxlY3RvciBkaWFnbm9zdGljcyB3YXJuaW5nJyxcbiAgICAgICAgICAgICAgICAgICAgY29kZSxcbiAgICAgICAgICAgICAgICAgICAgaGludCxcbiAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgfSBzYXRpc2ZpZXMgUHJvY2Vzc0V2ZW50KVxuICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBiYXNlU3RyZWFtID0gKHJ1bnRpbWUuY2hhbmdlc1dpdGhNZXRhKHNlbGVjdG9yKSBhcyBTdHJlYW0uU3RyZWFtPGFueT4pLnBpcGUoXG4gICAgICAgICAgICAgIFN0cmVhbS5tYXBFZmZlY3QoKGV2dDogYW55KSA9PlxuICAgICAgICAgICAgICAgIFJlZi5nZXQocHJldlJlZikucGlwZShcbiAgICAgICAgICAgICAgICAgIEVmZmVjdC5mbGF0TWFwKChwcmV2KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChPcHRpb24uaXNTb21lKHByZXYpICYmIE9iamVjdC5pcyhwcmV2LnZhbHVlLCBldnQudmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVmZmVjdC5zdWNjZWVkKE9wdGlvbi5ub25lKCkpXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFJlZi5zZXQocHJldlJlZiwgT3B0aW9uLnNvbWUoZXZ0LnZhbHVlKSkucGlwZShFZmZlY3QuYXMoT3B0aW9uLnNvbWUoZXZ0KSkpXG4gICAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICBTdHJlYW0uZmlsdGVyTWFwKChvcHQpID0+IG9wdCksXG4gICAgICAgICAgICAgIFN0cmVhbS5tYXAoKGV2dDogYW55KSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgdHhuU2VxID0gZXZ0Py5tZXRhPy50eG5TZXFcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAga2luZDogJ21vZHVsZVN0YXRlQ2hhbmdlJyxcbiAgICAgICAgICAgICAgICAgIG5hbWU6IHNwZWMubmFtZSxcbiAgICAgICAgICAgICAgICAgIG1vZHVsZUlkOiBzcGVjLm1vZHVsZUlkLFxuICAgICAgICAgICAgICAgICAgaW5zdGFuY2VJZDogcnVudGltZS5pbnN0YW5jZUlkIGFzIHN0cmluZyxcbiAgICAgICAgICAgICAgICAgIHBhdGg6IHNwZWMucGF0aCxcbiAgICAgICAgICAgICAgICAgIHR4blNlcTogdHlwZW9mIHR4blNlcSA9PT0gJ251bWJlcicgPyB0eG5TZXEgOiAxLFxuICAgICAgICAgICAgICAgIH0gc2F0aXNmaWVzIFByb2Nlc3NUcmlnZ2VyXG4gICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgKVxuXG4gICAgICAgICAgICByZXR1cm4gZW5hYmxlU2VsZWN0b3JEaWFnbm9zdGljcyA/IGJhc2VTdHJlYW0ucGlwZShTdHJlYW0udGFwKG1heWJlV2FyblNlbGVjdG9yKSkgOiBiYXNlU3RyZWFtXG4gICAgICAgICAgfSlcblxuICAgICAgICBjb25zdCBtYWtlUnVuID0gKHRyaWdnZXI6IFByb2Nlc3NUcmlnZ2VyLCBmYXRhbDogRGVmZXJyZWQuRGVmZXJyZWQ8Q2F1c2UuQ2F1c2U8YW55Pj4pOiBFZmZlY3QuRWZmZWN0PHZvaWQ+ID0+XG4gICAgICAgICAgRWZmZWN0LmxvY2FsbHkoXG4gICAgICAgICAgICBjdXJyZW50UHJvY2Vzc1RyaWdnZXIsXG4gICAgICAgICAgICB0cmlnZ2VyLFxuICAgICAgICAgICkoXG4gICAgICAgICAgICBwcm92aWRlZFByb2Nlc3MucGlwZShcbiAgICAgICAgICAgICAgRWZmZWN0LmNhdGNoQWxsQ2F1c2UoKGNhdXNlKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKENhdXNlLmlzSW50ZXJydXB0ZWRPbmx5KGNhdXNlKSkge1xuICAgICAgICAgICAgICAgICAgcmV0dXJuIEVmZmVjdC52b2lkXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBEZWZlcnJlZC5zdWNjZWVkKGZhdGFsLCBjYXVzZSkucGlwZShcbiAgICAgICAgICAgICAgICAgIEVmZmVjdC5hc1ZvaWQsXG4gICAgICAgICAgICAgICAgICBFZmZlY3QuY2F0Y2hBbGwoKCkgPT4gRWZmZWN0LnZvaWQpLFxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICApLFxuICAgICAgICAgIClcblxuICAgICAgICBjb25zdCBtYWtlQ2hhaW5SdW4gPSAoXG4gICAgICAgICAgdHJpZ2dlcjogUHJvY2Vzc1RyaWdnZXIsXG4gICAgICAgICAgZmF0YWw6IERlZmVycmVkLkRlZmVycmVkPENhdXNlLkNhdXNlPGFueT4+LFxuICAgICAgICApOiBFZmZlY3QuRWZmZWN0PHZvaWQ+ID0+IHtcbiAgICAgICAgICBpZiAoIXNob3VsZFJlY29yZENoYWluRXZlbnRzKSB7XG4gICAgICAgICAgICByZXR1cm4gbWFrZVJ1bih0cmlnZ2VyLCBmYXRhbClcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gRWZmZWN0LmdlbihmdW5jdGlvbiogKCkge1xuICAgICAgICAgICAgY29uc3QgYnVkZ2V0UmVmID0geWllbGQqIFJlZi5tYWtlKFByb2Nlc3NFdmVudHMubWFrZVByb2Nlc3NSdW5FdmVudEJ1ZGdldFN0YXRlKCkpXG4gICAgICAgICAgICByZXR1cm4geWllbGQqIEVmZmVjdC5sb2NhbGx5KFxuICAgICAgICAgICAgICBjdXJyZW50UHJvY2Vzc0V2ZW50QnVkZ2V0LFxuICAgICAgICAgICAgICBidWRnZXRSZWYsXG4gICAgICAgICAgICApKGVtaXRUcmlnZ2VyRXZlbnQodHJpZ2dlciwgJ2luZm8nKS5waXBlKEVmZmVjdC56aXBSaWdodChtYWtlUnVuKHRyaWdnZXIsIGZhdGFsKSkpKVxuICAgICAgICAgIH0pXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBhc3NpZ25UcmlnZ2VyU2VxID0gKHRyaWdnZXI6IFByb2Nlc3NUcmlnZ2VyKTogUHJvY2Vzc1RyaWdnZXIgPT4ge1xuICAgICAgICAgIGlmICghc2hvdWxkUmVjb3JkQ2hhaW5FdmVudHMpIHtcbiAgICAgICAgICAgIHJldHVybiB0cmlnZ2VyXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIC4uLnRyaWdnZXIsXG4gICAgICAgICAgICB0cmlnZ2VyU2VxOiBpbnN0YW5jZVN0YXRlLm5leHRUcmlnZ2VyU2VxKyssXG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZW1pdFRyaWdnZXJFdmVudCA9ICh0cmlnZ2VyOiBQcm9jZXNzVHJpZ2dlciwgc2V2ZXJpdHk6IFByb2Nlc3NFdmVudFsnc2V2ZXJpdHknXSk6IEVmZmVjdC5FZmZlY3Q8dm9pZD4gPT4ge1xuICAgICAgICAgIGlmICghc2hvdWxkUmVjb3JkQ2hhaW5FdmVudHMpIHtcbiAgICAgICAgICAgIHJldHVybiBFZmZlY3Qudm9pZFxuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IGV2dDogUHJvY2Vzc0V2ZW50ID0ge1xuICAgICAgICAgICAgdHlwZTogJ3Byb2Nlc3M6dHJpZ2dlcicsXG4gICAgICAgICAgICBpZGVudGl0eSxcbiAgICAgICAgICAgIHRyaWdnZXIsXG4gICAgICAgICAgICBzZXZlcml0eSxcbiAgICAgICAgICAgIGV2ZW50U2VxOiBpbnN0YW5jZVN0YXRlLm5leHRFdmVudFNlcSsrLFxuICAgICAgICAgICAgdGltZXN0YW1wTXM6IERhdGUubm93KCksXG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBlbWl0KGV2dClcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHBvbGljeSA9IGluc3RhbGxhdGlvbi5kZWZpbml0aW9uLmNvbmN1cnJlbmN5XG4gICAgICAgIGNvbnN0IGF1dG9TdGFydCA9IGluc3RhbGxhdGlvbi5kZWZpbml0aW9uLnRyaWdnZXJzLnNvbWUoXG4gICAgICAgICAgKHQpID0+IHQua2luZCA9PT0gJ3BsYXRmb3JtRXZlbnQnICYmIHQucGxhdGZvcm1FdmVudCA9PT0gUlVOVElNRV9CT09UX0VWRU5ULFxuICAgICAgICApXG4gICAgICAgIGNvbnN0IGJvb3RUcmlnZ2VyU3BlYyA9IGluc3RhbGxhdGlvbi5kZWZpbml0aW9uLnRyaWdnZXJzLmZpbmQoXG4gICAgICAgICAgKHQpOiB0IGlzIEV4dHJhY3Q8UHJvY2Vzc1RyaWdnZXJTcGVjLCB7IHJlYWRvbmx5IGtpbmQ6ICdwbGF0Zm9ybUV2ZW50JyB9PiA9PlxuICAgICAgICAgICAgdC5raW5kID09PSAncGxhdGZvcm1FdmVudCcgJiYgdC5wbGF0Zm9ybUV2ZW50ID09PSBSVU5USU1FX0JPT1RfRVZFTlQsXG4gICAgICAgIClcblxuICAgICAgICBjb25zdCBpbnN0YW5jZVByb2dyYW0gPSBFZmZlY3QuZ2VuKGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgY29uc3QgZmF0YWwgPSB5aWVsZCogRGVmZXJyZWQubWFrZTxDYXVzZS5DYXVzZTxhbnk+PigpXG5cbiAgICAgICAgICBjb25zdCBwbGF0Zm9ybUV2ZW50U3RyZWFtOiBTdHJlYW0uU3RyZWFtPFByb2Nlc3NUcmlnZ2VyPiA9IFN0cmVhbS5mcm9tUXVldWUoXG4gICAgICAgICAgICBpbnN0YW5jZVN0YXRlLnBsYXRmb3JtVHJpZ2dlcnNRdWV1ZSxcbiAgICAgICAgICApXG5cbiAgICAgICAgICBjb25zdCBub25QbGF0Zm9ybVRyaWdnZXJzID0gaW5zdGFsbGF0aW9uLmRlZmluaXRpb24udHJpZ2dlcnMuZmlsdGVyKFxuICAgICAgICAgICAgKHQpOiB0IGlzIE5vblBsYXRmb3JtVHJpZ2dlclNwZWMgPT4gdC5raW5kICE9PSAncGxhdGZvcm1FdmVudCcsXG4gICAgICAgICAgKVxuXG4gICAgICAgICAgY29uc3Qgc3RyZWFtcyA9IHlpZWxkKiBFZmZlY3QuZm9yRWFjaChub25QbGF0Zm9ybVRyaWdnZXJzLCBtYWtlVHJpZ2dlclN0cmVhbSlcblxuICAgICAgICAgIGNvbnN0IHRyaWdnZXJTdHJlYW0gPSBTdHJlYW0ubWVyZ2VBbGwoW3BsYXRmb3JtRXZlbnRTdHJlYW0sIC4uLnN0cmVhbXNdLCB7XG4gICAgICAgICAgICBjb25jdXJyZW5jeTogJ3VuYm91bmRlZCcsXG4gICAgICAgICAgfSlcblxuICAgICAgICAgIGNvbnN0IHJlcG9ydFF1ZXVlT3ZlcmZsb3cgPSAoXG4gICAgICAgICAgICBpbmZvOiBQcm9jZXNzQ29uY3VycmVuY3kuUHJvY2Vzc1RyaWdnZXJRdWV1ZU92ZXJmbG93SW5mbyxcbiAgICAgICAgICApOiBFZmZlY3QuRWZmZWN0PHZvaWQ+ID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGVyciA9IG5ldyBFcnJvcignUHJvY2VzcyB0cmlnZ2VyIHF1ZXVlIG92ZXJmbG93IChzZXJpYWwgbWF4UXVldWUgZ3VhcmQpLicpXG4gICAgICAgICAgICA7KGVyciBhcyBhbnkpLmNvZGUgPSAncHJvY2Vzczo6c2VyaWFsX3F1ZXVlX292ZXJmbG93J1xuICAgICAgICAgICAgOyhlcnIgYXMgYW55KS5oaW50ID0gW1xuICAgICAgICAgICAgICBgbW9kZT0ke2luZm8ubW9kZX1gLFxuICAgICAgICAgICAgICBgcXVldWU6IGN1cnJlbnQ9JHtpbmZvLmN1cnJlbnRMZW5ndGh9IHBlYWs9JHtpbmZvLnBlYWt9YCxcbiAgICAgICAgICAgICAgYG1heFF1ZXVlOiBjb25maWd1cmVkPSR7aW5mby5saW1pdC5jb25maWd1cmVkfSBndWFyZD0ke2luZm8ubGltaXQuZ3VhcmR9YCxcbiAgICAgICAgICAgICAgYHBvbGljeTogJHtKU09OLnN0cmluZ2lmeShpbmZvLnBvbGljeSl9YCxcbiAgICAgICAgICAgICAgJycsXG4gICAgICAgICAgICAgICdmaXg6JyxcbiAgICAgICAgICAgICAgJy0gQ29uZmlndXJlIGNvbmN1cnJlbmN5Lm1heFF1ZXVlIChzZXJpYWwpIHRvIGEgZmluaXRlIHZhbHVlLCBvciBzd2l0Y2ggdG8gbW9kZT1sYXRlc3QvZHJvcCB0byBhdm9pZCB1bmJvdW5kZWQgYmFja2xvZy4nLFxuICAgICAgICAgICAgXS5qb2luKCdcXG4nKVxuICAgICAgICAgICAgcmV0dXJuIERlZmVycmVkLnN1Y2NlZWQoZmF0YWwsIENhdXNlLmZhaWwoZXJyKSkucGlwZShcbiAgICAgICAgICAgICAgRWZmZWN0LmFzVm9pZCxcbiAgICAgICAgICAgICAgRWZmZWN0LmNhdGNoQWxsKCgpID0+IEVmZmVjdC52b2lkKSxcbiAgICAgICAgICAgIClcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25zdCBydW5uZXJGaWJlciA9IHlpZWxkKiBFZmZlY3QuZm9ya1Njb3BlZChcbiAgICAgICAgICAgIFByb2Nlc3NDb25jdXJyZW5jeS5ydW5Qcm9jZXNzVHJpZ2dlclN0cmVhbSh7XG4gICAgICAgICAgICAgIHN0cmVhbTogdHJpZ2dlclN0cmVhbSxcbiAgICAgICAgICAgICAgcG9saWN5LFxuICAgICAgICAgICAgICBhc3NpZ25UcmlnZ2VyU2VxLFxuICAgICAgICAgICAgICBydW46ICh0cmlnZ2VyKSA9PiBtYWtlQ2hhaW5SdW4odHJpZ2dlciwgZmF0YWwpLFxuICAgICAgICAgICAgICBvbkRyb3A6ICh0cmlnZ2VyKSA9PiBlbWl0VHJpZ2dlckV2ZW50KHRyaWdnZXIsICd3YXJuaW5nJyksXG4gICAgICAgICAgICAgIG9uUXVldWVPdmVyZmxvdzogcmVwb3J0UXVldWVPdmVyZmxvdyxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgIClcblxuICAgICAgICAgIGlmIChhdXRvU3RhcnQpIHtcbiAgICAgICAgICAgIHlpZWxkKiBRdWV1ZS5vZmZlcihpbnN0YW5jZVN0YXRlLnBsYXRmb3JtVHJpZ2dlcnNRdWV1ZSwge1xuICAgICAgICAgICAgICBraW5kOiAncGxhdGZvcm1FdmVudCcsXG4gICAgICAgICAgICAgIG5hbWU6IGJvb3RUcmlnZ2VyU3BlYz8ubmFtZSxcbiAgICAgICAgICAgICAgcGxhdGZvcm1FdmVudDogUlVOVElNRV9CT09UX0VWRU5ULFxuICAgICAgICAgICAgfSlcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25zdCBjYXVzZSA9IHlpZWxkKiBEZWZlcnJlZC5hd2FpdChmYXRhbClcbiAgICAgICAgICB5aWVsZCogRmliZXIuaW50ZXJydXB0KHJ1bm5lckZpYmVyKVxuICAgICAgICAgIHJldHVybiB5aWVsZCogRWZmZWN0LmZhaWxDYXVzZShjYXVzZSlcbiAgICAgICAgfSlcblxuICAgICAgICBjb25zdCBmaWJlciA9IHlpZWxkKiBFZmZlY3QuZm9ya0luKGluc3RhbGxhdGlvbi5mb3JrU2NvcGUpKFxuICAgICAgICAgIEVmZmVjdC5zY29wZWQoaW5zdGFuY2VQcm9ncmFtKS5waXBlKFxuICAgICAgICAgICAgRWZmZWN0LmNhdGNoQWxsQ2F1c2UoKGNhdXNlKSA9PlxuICAgICAgICAgICAgICBFZmZlY3QuZ2VuKGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICAgICAgLy8gSW50ZXJydXB0aW9ucyAodHlwaWNhbGx5IGZyb20gc2NvcGUgZGlzcG9zZSAvIG1hbnVhbCBzdG9wKSBzaG91bGQgbm90IGJlIHRyZWF0ZWQgYXMgcHJvY2VzcyBmYWlsdXJlcy5cbiAgICAgICAgICAgICAgICAvLyBPdGhlcndpc2Ugd2UgZW1pdCBwcm9jZXNzOmVycm9yL2RpYWdub3N0aWMgZHVyaW5nIHNjb3BlIHNodXRkb3duIGFuZCBtYXkgZGVhZGxvY2sgZGlzcG9zYWwuXG4gICAgICAgICAgICAgICAgaWYgKENhdXNlLmlzSW50ZXJydXB0ZWRPbmx5KGNhdXNlKSkge1xuICAgICAgICAgICAgICAgICAgLy8gSWYgc3RvcEluc3RhbmNlIGFscmVhZHkgYWR2YW5jZWQgdGhlIHN0YXR1cyB0byBzdG9wcGluZywgc3RvcEluc3RhbmNlIG93bnMgdGhlIHN0b3AgZXZlbnQgYW5kIGZpbmFsIHN0YXRlLlxuICAgICAgICAgICAgICAgICAgaWYgKGluc3RhbmNlU3RhdGUuc3RhdHVzLnN0YXR1cyA9PT0gJ3N0b3BwaW5nJykge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgLy8gT3RoZXJ3aXNlIHRyZWF0IGFzIGEgbmF0dXJhbCBzdG9wIGR1ZSB0byBzY29wZSBkaXNwb3NhbCAoZS5nLiBtb2R1bGVJbnN0YW5jZSBzY29wZSBjbG9zaW5nKS5cbiAgICAgICAgICAgICAgICAgIGluc3RhbmNlU3RhdGUuc3RhdHVzID0ge1xuICAgICAgICAgICAgICAgICAgICAuLi5pbnN0YW5jZVN0YXRlLnN0YXR1cyxcbiAgICAgICAgICAgICAgICAgICAgc3RhdHVzOiAnc3RvcHBlZCcsXG4gICAgICAgICAgICAgICAgICAgIHN0b3BwZWRSZWFzb246ICdzY29wZURpc3Bvc2VkJyxcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIGluc3RhbmNlU3RhdGUuZmliZXIgPSB1bmRlZmluZWRcblxuICAgICAgICAgICAgICAgICAgeWllbGQqIEVmZmVjdC51bmludGVycnVwdGlibGUoXG4gICAgICAgICAgICAgICAgICAgIGVtaXQoe1xuICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdwcm9jZXNzOnN0b3AnLFxuICAgICAgICAgICAgICAgICAgICAgIGlkZW50aXR5LFxuICAgICAgICAgICAgICAgICAgICAgIHNldmVyaXR5OiAnaW5mbycsXG4gICAgICAgICAgICAgICAgICAgICAgZXZlbnRTZXE6IGluc3RhbmNlU3RhdGUubmV4dEV2ZW50U2VxKyssXG4gICAgICAgICAgICAgICAgICAgICAgdGltZXN0YW1wTXM6IERhdGUubm93KCksXG4gICAgICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgICAgKVxuXG4gICAgICAgICAgICAgICAgICBjb25zdCBpbnN0YWxsYXRpb24gPSBpbnN0YWxsYXRpb25zLmdldChpbnN0YWxsYXRpb25LZXkpXG4gICAgICAgICAgICAgICAgICBpZiAoaW5zdGFsbGF0aW9uPy5wZW5kaW5nU3RhcnQpIHtcbiAgICAgICAgICAgICAgICAgICAgaW5zdGFsbGF0aW9uLnBlbmRpbmdTdGFydCA9IHVuZGVmaW5lZFxuICAgICAgICAgICAgICAgICAgICB5aWVsZCogc3RhcnRJbnN0YWxsYXRpb24oaW5zdGFsbGF0aW9uS2V5KVxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgY29uc3QgcHJpbWFyeSA9IE9wdGlvbi5nZXRPckVsc2UoQ2F1c2UuZmFpbHVyZU9wdGlvbihjYXVzZSksICgpID0+XG4gICAgICAgICAgICAgICAgICBPcHRpb24uZ2V0T3JFbHNlKENhdXNlLmRpZU9wdGlvbihjYXVzZSksICgpID0+IGNhdXNlKSxcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgY29uc3Qgc3VtbWFyeSA9IHRvU2VyaWFsaXphYmxlRXJyb3JTdW1tYXJ5KHByaW1hcnkpXG4gICAgICAgICAgICAgICAgY29uc3QgZXJyb3I6IFNlcmlhbGl6YWJsZUVycm9yU3VtbWFyeSA9IHN1bW1hcnkuZXJyb3JTdW1tYXJ5IGFzIGFueVxuXG4gICAgICAgICAgICAgICAgaW5zdGFuY2VTdGF0ZS5zdGF0dXMgPSB7XG4gICAgICAgICAgICAgICAgICAuLi5pbnN0YW5jZVN0YXRlLnN0YXR1cyxcbiAgICAgICAgICAgICAgICAgIHN0YXR1czogJ2ZhaWxlZCcsXG4gICAgICAgICAgICAgICAgICBzdG9wcGVkUmVhc29uOiAnZmFpbGVkJyxcbiAgICAgICAgICAgICAgICAgIGxhc3RFcnJvcjogZXJyb3IsXG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgeWllbGQqIGVtaXQoe1xuICAgICAgICAgICAgICAgICAgdHlwZTogJ3Byb2Nlc3M6ZXJyb3InLFxuICAgICAgICAgICAgICAgICAgaWRlbnRpdHksXG4gICAgICAgICAgICAgICAgICBzZXZlcml0eTogJ2Vycm9yJyxcbiAgICAgICAgICAgICAgICAgIGV2ZW50U2VxOiBpbnN0YW5jZVN0YXRlLm5leHRFdmVudFNlcSsrLFxuICAgICAgICAgICAgICAgICAgdGltZXN0YW1wTXM6IERhdGUubm93KCksXG4gICAgICAgICAgICAgICAgICBlcnJvcixcbiAgICAgICAgICAgICAgICB9KVxuXG4gICAgICAgICAgICAgICAgY29uc3QgZGVjaXNpb24gPSBTdXBlcnZpc2lvbi5vbkZhaWx1cmUoXG4gICAgICAgICAgICAgICAgICBpbnN0YWxsYXRpb24uZGVmaW5pdGlvbi5lcnJvclBvbGljeSxcbiAgICAgICAgICAgICAgICAgIGluc3RhbGxhdGlvbi5zdXBlcnZpc2lvbixcbiAgICAgICAgICAgICAgICAgIERhdGUubm93KCksXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIGluc3RhbGxhdGlvbi5zdXBlcnZpc2lvbiA9IGRlY2lzaW9uLm5leHRTdGF0ZVxuXG4gICAgICAgICAgICAgICAgaWYgKGRlY2lzaW9uLmRlY2lzaW9uID09PSAncmVzdGFydCcpIHtcbiAgICAgICAgICAgICAgICAgIC8vIHN1cGVydmlzZTogY29udHJvbGxlZCByZXN0YXJ0IChydW5TZXEgaW5jcmVtZW50cykgYW5kIGVtaXQgYSByZXN0YXJ0IGV2ZW50LlxuICAgICAgICAgICAgICAgICAgeWllbGQqIGVtaXQoe1xuICAgICAgICAgICAgICAgICAgICB0eXBlOiAncHJvY2VzczpyZXN0YXJ0JyxcbiAgICAgICAgICAgICAgICAgICAgaWRlbnRpdHksXG4gICAgICAgICAgICAgICAgICAgIHNldmVyaXR5OiAnd2FybmluZycsXG4gICAgICAgICAgICAgICAgICAgIGV2ZW50U2VxOiBpbnN0YW5jZVN0YXRlLm5leHRFdmVudFNlcSsrLFxuICAgICAgICAgICAgICAgICAgICB0aW1lc3RhbXBNczogRGF0ZS5ub3coKSxcbiAgICAgICAgICAgICAgICAgICAgZXJyb3IsXG4gICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgeWllbGQqIHN0YXJ0SW5zdGFsbGF0aW9uKGluc3RhbGxhdGlvbktleSlcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgeWllbGQqIGVtaXRFcnJvckRpYWdub3N0aWMoXG4gICAgICAgICAgICAgICAgICAgIGluc3RhbGxhdGlvbi5pZGVudGl0eS5zY29wZSxcbiAgICAgICAgICAgICAgICAgICAgaW5zdGFsbGF0aW9uLmlkZW50aXR5LnByb2Nlc3NJZCxcbiAgICAgICAgICAgICAgICAgICAgJ3Byb2Nlc3M6OmZhaWxlZF9zdG9wJyxcbiAgICAgICAgICAgICAgICAgICAgJ1Byb2Nlc3MgZmFpbGVkIGFuZCBzdG9wcGVkIChmYWlsU3RvcCAvIHJlc3RhcnQgbGltaXQgcmVhY2hlZCkuJyxcbiAgICAgICAgICAgICAgICAgICAgYHByb2Nlc3NJZD0ke2luc3RhbGxhdGlvbi5pZGVudGl0eS5wcm9jZXNzSWR9IHNjb3BlS2V5PSR7aW5zdGFsbGF0aW9uLnNjb3BlS2V5fSBmYWlsdXJlcz0ke2RlY2lzaW9uLndpdGhpbldpbmRvd0ZhaWx1cmVzfSBtYXhSZXN0YXJ0cz0ke2RlY2lzaW9uLm1heFJlc3RhcnRzfWAsXG4gICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICksXG4gICAgICAgICAgKSxcbiAgICAgICAgKVxuXG4gICAgICAgIGluc3RhbmNlU3RhdGUuZmliZXIgPSBmaWJlciBhcyBGaWJlci5SdW50aW1lRmliZXI8dW5rbm93biwgdW5rbm93bj5cbiAgICAgICAgaW5zdGFuY2VTdGF0ZS5zdGF0dXMgPSB7XG4gICAgICAgICAgLi4uaW5zdGFuY2VTdGF0ZS5zdGF0dXMsXG4gICAgICAgICAgc3RhdHVzOiAncnVubmluZycsXG4gICAgICAgIH1cblxuICAgICAgICAvLyBCZXN0LWVmZm9ydDogZW5zdXJlIHRoZSBpbnN0YW5jZSBmaWJlciBzdGFydHMgc3Vic2NyaWJpbmcgdG8gdHJpZ2dlciBzdHJlYW1zIGJlZm9yZSBpbnN0YWxsL3N0YXJ0IHJldHVybnMsXG4gICAgICAgIC8vIGF2b2lkaW5nIGxvc3QgbW9kdWxlQWN0aW9uL21vZHVsZVN0YXRlQ2hhbmdlIHRyaWdnZXJzIHJpZ2h0IGFmdGVyIGVudiBpcyBidWlsdCBhbmQgZGlzcGF0Y2ggaGFwcGVucy5cbiAgICAgICAgeWllbGQqIEVmZmVjdC55aWVsZE5vdygpXG4gICAgICB9KVxuXG4gICAgY29uc3QgaW5zdGFsbCA9IDxFLCBSPihcbiAgICAgIHByb2Nlc3M6IEVmZmVjdC5FZmZlY3Q8dm9pZCwgRSwgUj4sXG4gICAgICBvcHRpb25zOiB7XG4gICAgICAgIHJlYWRvbmx5IHNjb3BlOiBQcm9jZXNzU2NvcGVcbiAgICAgICAgcmVhZG9ubHkgZW5hYmxlZD86IGJvb2xlYW5cbiAgICAgICAgcmVhZG9ubHkgaW5zdGFsbGVkQXQ/OiBzdHJpbmdcbiAgICAgICAgcmVhZG9ubHkgbW9kZT86IFByb2Nlc3NJbnN0YWxsTW9kZVxuICAgICAgfSxcbiAgICApOiBFZmZlY3QuRWZmZWN0PFByb2Nlc3NJbnN0YWxsYXRpb24gfCB1bmRlZmluZWQsIG5ldmVyLCBSPiA9PlxuICAgICAgRWZmZWN0LmdlbihmdW5jdGlvbiogKCkge1xuICAgICAgICBjb25zdCBtZXRhID0gTWV0YS5nZXRNZXRhKHByb2Nlc3MpXG4gICAgICAgIGlmICghbWV0YSkge1xuICAgICAgICAgIHJldHVybiB1bmRlZmluZWRcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGVudiA9IHlpZWxkKiBFZmZlY3QuY29udGV4dDxSPigpXG4gICAgICAgIGNvbnN0IGZvcmtTY29wZU9wdCA9IHlpZWxkKiBFZmZlY3Quc2VydmljZU9wdGlvbihTY29wZS5TY29wZSlcbiAgICAgICAgY29uc3QgZm9ya1Njb3BlID0gT3B0aW9uLmlzU29tZShmb3JrU2NvcGVPcHQpID8gZm9ya1Njb3BlT3B0LnZhbHVlIDogcnVudGltZVNjb3BlXG5cbiAgICAgICAgY29uc3Qgc2NvcGVLZXkgPSBJZGVudGl0eS5zY29wZUtleUZyb21TY29wZShvcHRpb25zLnNjb3BlKVxuICAgICAgICBjb25zdCBpZGVudGl0eSA9IHtcbiAgICAgICAgICBwcm9jZXNzSWQ6IG1ldGEuZGVmaW5pdGlvbi5wcm9jZXNzSWQsXG4gICAgICAgICAgc2NvcGU6IG9wdGlvbnMuc2NvcGUsXG4gICAgICAgIH0gYXMgY29uc3RcblxuICAgICAgICBjb25zdCBpbnN0YWxsYXRpb25LZXkgPSBJZGVudGl0eS5pbnN0YWxsYXRpb25LZXlGcm9tSWRlbnRpdHkoaWRlbnRpdHkpXG4gICAgICAgIGNvbnN0IGV4aXN0aW5nID0gaW5zdGFsbGF0aW9ucy5nZXQoaW5zdGFsbGF0aW9uS2V5KVxuICAgICAgICBpZiAoZXhpc3RpbmcpIHtcbiAgICAgICAgICBleGlzdGluZy5lbnYgPSBlbnYgYXMgQ29udGV4dC5Db250ZXh0PGFueT5cbiAgICAgICAgICBleGlzdGluZy5mb3JrU2NvcGUgPSBmb3JrU2NvcGVcbiAgICAgICAgICBleGlzdGluZy5lbmFibGVkID0gb3B0aW9ucy5lbmFibGVkID8/IHRydWVcbiAgICAgICAgICBleGlzdGluZy5pbnN0YWxsZWRBdCA9IG9wdGlvbnMuaW5zdGFsbGVkQXQgPz8gZXhpc3RpbmcuaW5zdGFsbGVkQXRcbiAgICAgICAgICBpZiAoIWV4aXN0aW5nLmVuYWJsZWQpIHtcbiAgICAgICAgICAgIGV4aXN0aW5nLnBlbmRpbmdTdGFydCA9IHVuZGVmaW5lZFxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgaWRlbnRpdHksXG4gICAgICAgICAgICAgIGVuYWJsZWQ6IGV4aXN0aW5nLmVuYWJsZWQsXG4gICAgICAgICAgICAgIGluc3RhbGxlZEF0OiBleGlzdGluZy5pbnN0YWxsZWRBdCxcbiAgICAgICAgICAgIH0gc2F0aXNmaWVzIFByb2Nlc3NJbnN0YWxsYXRpb25cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25zdCBjdXJyZW50SWQgPSBleGlzdGluZy5jdXJyZW50SW5zdGFuY2VJZFxuICAgICAgICAgIGNvbnN0IGN1cnJlbnQgPSBjdXJyZW50SWQgPyBpbnN0YW5jZXMuZ2V0KGN1cnJlbnRJZCkgOiB1bmRlZmluZWRcbiAgICAgICAgICBjb25zdCBzdGF0dXMgPSBjdXJyZW50Py5zdGF0dXMuc3RhdHVzXG5cbiAgICAgICAgICBpZiAoc3RhdHVzID09PSAncnVubmluZycgfHwgc3RhdHVzID09PSAnc3RhcnRpbmcnKSB7XG4gICAgICAgICAgICBjb25zdCBtb2RlOiBQcm9jZXNzSW5zdGFsbE1vZGUgPSBvcHRpb25zLm1vZGUgPz8gJ3N3aXRjaCdcbiAgICAgICAgICAgIGlmIChtb2RlID09PSAnc3dpdGNoJyAmJiBjdXJyZW50ICYmIGN1cnJlbnQuZm9ya1Njb3BlICE9PSBmb3JrU2NvcGUpIHtcbiAgICAgICAgICAgICAgZXhpc3RpbmcucGVuZGluZ1N0YXJ0ID0geyBmb3JrU2NvcGUgfVxuICAgICAgICAgICAgICB5aWVsZCogU2NvcGUuYWRkRmluYWxpemVyKFxuICAgICAgICAgICAgICAgIGZvcmtTY29wZSxcbiAgICAgICAgICAgICAgICBFZmZlY3Quc3luYygoKSA9PiB7XG4gICAgICAgICAgICAgICAgICBjb25zdCBpbnN0YWxsYXRpb24gPSBpbnN0YWxsYXRpb25zLmdldChpbnN0YWxsYXRpb25LZXkpXG4gICAgICAgICAgICAgICAgICBpZiAoIWluc3RhbGxhdGlvbikgcmV0dXJuXG4gICAgICAgICAgICAgICAgICBpZiAoaW5zdGFsbGF0aW9uLnBlbmRpbmdTdGFydD8uZm9ya1Njb3BlID09PSBmb3JrU2NvcGUpIHtcbiAgICAgICAgICAgICAgICAgICAgaW5zdGFsbGF0aW9uLnBlbmRpbmdTdGFydCA9IHVuZGVmaW5lZFxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBleGlzdGluZy5wZW5kaW5nU3RhcnQgPSB1bmRlZmluZWRcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgIGlkZW50aXR5LFxuICAgICAgICAgICAgICBlbmFibGVkOiBleGlzdGluZy5lbmFibGVkLFxuICAgICAgICAgICAgICBpbnN0YWxsZWRBdDogZXhpc3RpbmcuaW5zdGFsbGVkQXQsXG4gICAgICAgICAgICB9IHNhdGlzZmllcyBQcm9jZXNzSW5zdGFsbGF0aW9uXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKHN0YXR1cyA9PT0gJ3N0b3BwaW5nJykge1xuICAgICAgICAgICAgY29uc3QgbW9kZTogUHJvY2Vzc0luc3RhbGxNb2RlID0gb3B0aW9ucy5tb2RlID8/ICdzd2l0Y2gnXG4gICAgICAgICAgICBpZiAobW9kZSA9PT0gJ3N3aXRjaCcpIHtcbiAgICAgICAgICAgICAgZXhpc3RpbmcucGVuZGluZ1N0YXJ0ID0geyBmb3JrU2NvcGUgfVxuICAgICAgICAgICAgICB5aWVsZCogU2NvcGUuYWRkRmluYWxpemVyKFxuICAgICAgICAgICAgICAgIGZvcmtTY29wZSxcbiAgICAgICAgICAgICAgICBFZmZlY3Quc3luYygoKSA9PiB7XG4gICAgICAgICAgICAgICAgICBjb25zdCBpbnN0YWxsYXRpb24gPSBpbnN0YWxsYXRpb25zLmdldChpbnN0YWxsYXRpb25LZXkpXG4gICAgICAgICAgICAgICAgICBpZiAoIWluc3RhbGxhdGlvbikgcmV0dXJuXG4gICAgICAgICAgICAgICAgICBpZiAoaW5zdGFsbGF0aW9uLnBlbmRpbmdTdGFydD8uZm9ya1Njb3BlID09PSBmb3JrU2NvcGUpIHtcbiAgICAgICAgICAgICAgICAgICAgaW5zdGFsbGF0aW9uLnBlbmRpbmdTdGFydCA9IHVuZGVmaW5lZFxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBleGlzdGluZy5wZW5kaW5nU3RhcnQgPSB1bmRlZmluZWRcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgIGlkZW50aXR5LFxuICAgICAgICAgICAgICBlbmFibGVkOiBleGlzdGluZy5lbmFibGVkLFxuICAgICAgICAgICAgICBpbnN0YWxsZWRBdDogZXhpc3RpbmcuaW5zdGFsbGVkQXQsXG4gICAgICAgICAgICB9IHNhdGlzZmllcyBQcm9jZXNzSW5zdGFsbGF0aW9uXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgZXhpc3RpbmcucGVuZGluZ1N0YXJ0ID0gdW5kZWZpbmVkXG4gICAgICAgICAgeWllbGQqIHN0YXJ0SW5zdGFsbGF0aW9uKGluc3RhbGxhdGlvbktleSlcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgaWRlbnRpdHksXG4gICAgICAgICAgICBlbmFibGVkOiBleGlzdGluZy5lbmFibGVkLFxuICAgICAgICAgICAgaW5zdGFsbGVkQXQ6IGV4aXN0aW5nLmluc3RhbGxlZEF0LFxuICAgICAgICAgIH0gc2F0aXNmaWVzIFByb2Nlc3NJbnN0YWxsYXRpb25cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIERlcml2ZSBhbiBlZmZlY3QgZm9yIHRoaXMgaW5zdGFsbGF0aW9uIHRvIGF2b2lkIG92ZXJ3cml0aW5nIG1ldGEgb24gdGhlIG9yaWdpbmFsIEVmZmVjdCAocmV1c2VkIGFjcm9zcyBzY29wZXMpLlxuICAgICAgICAvLyBOb3RlOiBkbyBub3QgcHJvdmlkZSBlbnYgZWFnZXJseTsgd2UgbWF5IG5lZWQgdG8gbGF5ZXIgYWRkaXRpb25hbCBjb250ZXh0IHBlci10cmlnZ2VyIGV4ZWN1dGlvbiAoZS5nLiBkaXNwYXRjaCBjaGFpbiBkaWFnbm9zdGljcykuXG4gICAgICAgIGNvbnN0IGRlcml2ZWQgPSBFZmZlY3Quc3VzcGVuZCgoKSA9PiBwcm9jZXNzKVxuICAgICAgICBNZXRhLmF0dGFjaE1ldGEoZGVyaXZlZCwge1xuICAgICAgICAgIC4uLm1ldGEsXG4gICAgICAgICAgaW5zdGFsbGF0aW9uU2NvcGU6IG9wdGlvbnMuc2NvcGUsXG4gICAgICAgIH0pXG5cbiAgICAgICAgY29uc3QgaW5zdGFsbGF0aW9uOiBJbnN0YWxsYXRpb25TdGF0ZSA9IHtcbiAgICAgICAgICBpZGVudGl0eSxcbiAgICAgICAgICBzY29wZUtleSxcbiAgICAgICAgICBkZWZpbml0aW9uOiBtZXRhLmRlZmluaXRpb24sXG4gICAgICAgICAgZW52OiBlbnYgYXMgQ29udGV4dC5Db250ZXh0PGFueT4sXG4gICAgICAgICAgZm9ya1Njb3BlLFxuICAgICAgICAgIHByb2Nlc3M6IGRlcml2ZWQgYXMgdW5rbm93biBhcyBFZmZlY3QuRWZmZWN0PHZvaWQsIGFueSwgdW5rbm93bj4sXG4gICAgICAgICAga2luZDogbWV0YS5raW5kID8/ICdwcm9jZXNzJyxcbiAgICAgICAgICBlbmFibGVkOiBvcHRpb25zLmVuYWJsZWQgPz8gdHJ1ZSxcbiAgICAgICAgICBpbnN0YWxsZWRBdDogb3B0aW9ucy5pbnN0YWxsZWRBdCxcbiAgICAgICAgICBuZXh0UnVuU2VxOiAxLFxuICAgICAgICAgIHN1cGVydmlzaW9uOiBTdXBlcnZpc2lvbi5pbml0aWFsU3RhdGUoKSxcbiAgICAgICAgICBwZW5kaW5nU3RhcnQ6IHVuZGVmaW5lZCxcbiAgICAgICAgfVxuXG4gICAgICAgIGluc3RhbGxhdGlvbnMuc2V0KGluc3RhbGxhdGlvbktleSwgaW5zdGFsbGF0aW9uKVxuXG4gICAgICAgIGlmIChpbnN0YWxsYXRpb24uZW5hYmxlZCkge1xuICAgICAgICAgIHlpZWxkKiBzdGFydEluc3RhbGxhdGlvbihpbnN0YWxsYXRpb25LZXkpXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGlkZW50aXR5LFxuICAgICAgICAgIGVuYWJsZWQ6IGluc3RhbGxhdGlvbi5lbmFibGVkLFxuICAgICAgICAgIGluc3RhbGxlZEF0OiBpbnN0YWxsYXRpb24uaW5zdGFsbGVkQXQsXG4gICAgICAgIH0gc2F0aXNmaWVzIFByb2Nlc3NJbnN0YWxsYXRpb25cbiAgICAgIH0pXG5cbiAgICBjb25zdCBsaXN0SW5zdGFsbGF0aW9uczogUHJvY2Vzc1J1bnRpbWVbJ2xpc3RJbnN0YWxsYXRpb25zJ10gPSAoZmlsdGVyKSA9PlxuICAgICAgRWZmZWN0LnN5bmMoKCkgPT4ge1xuICAgICAgICBjb25zdCBzY29wZVR5cGUgPSBmaWx0ZXI/LnNjb3BlVHlwZVxuICAgICAgICBjb25zdCBzY29wZUtleSA9IGZpbHRlcj8uc2NvcGVLZXlcbiAgICAgICAgY29uc3Qgb3V0OiBQcm9jZXNzSW5zdGFsbGF0aW9uW10gPSBbXVxuICAgICAgICBmb3IgKGNvbnN0IGluc3RhbGxhdGlvbiBvZiBpbnN0YWxsYXRpb25zLnZhbHVlcygpKSB7XG4gICAgICAgICAgaWYgKHNjb3BlVHlwZSAmJiBpbnN0YWxsYXRpb24uaWRlbnRpdHkuc2NvcGUudHlwZSAhPT0gc2NvcGVUeXBlKSBjb250aW51ZVxuICAgICAgICAgIGlmIChzY29wZUtleSAmJiBpbnN0YWxsYXRpb24uc2NvcGVLZXkgIT09IHNjb3BlS2V5KSBjb250aW51ZVxuICAgICAgICAgIG91dC5wdXNoKHtcbiAgICAgICAgICAgIGlkZW50aXR5OiBpbnN0YWxsYXRpb24uaWRlbnRpdHksXG4gICAgICAgICAgICBlbmFibGVkOiBpbnN0YWxsYXRpb24uZW5hYmxlZCxcbiAgICAgICAgICAgIGluc3RhbGxlZEF0OiBpbnN0YWxsYXRpb24uaW5zdGFsbGVkQXQsXG4gICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gb3V0XG4gICAgICB9KVxuXG4gICAgY29uc3QgZ2V0SW5zdGFuY2VTdGF0dXM6IFByb2Nlc3NSdW50aW1lWydnZXRJbnN0YW5jZVN0YXR1cyddID0gKHByb2Nlc3NJbnN0YW5jZUlkKSA9PlxuICAgICAgRWZmZWN0LnN5bmMoKCkgPT4gaW5zdGFuY2VzLmdldChwcm9jZXNzSW5zdGFuY2VJZCk/LnN0YXR1cylcblxuICAgIGNvbnN0IGNvbnRyb2xJbnN0YW5jZTogUHJvY2Vzc1J1bnRpbWVbJ2NvbnRyb2xJbnN0YW5jZSddID0gKHByb2Nlc3NJbnN0YW5jZUlkLCByZXF1ZXN0KSA9PlxuICAgICAgRWZmZWN0LnN1c3BlbmQoKCkgPT4ge1xuICAgICAgICBjb25zdCBpbnN0YW5jZSA9IGluc3RhbmNlcy5nZXQocHJvY2Vzc0luc3RhbmNlSWQpXG4gICAgICAgIGlmICghaW5zdGFuY2UpIHtcbiAgICAgICAgICByZXR1cm4gRWZmZWN0LnZvaWRcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBzaG91bGROb29wRHVlVG9TeW5jVHhuKGluc3RhbmNlLnNjb3BlLCAncHJvY2Vzc19jb250cm9sX2luX3RyYW5zYWN0aW9uJykucGlwZShcbiAgICAgICAgICBFZmZlY3QuZmxhdE1hcCgobm9vcCkgPT4ge1xuICAgICAgICAgICAgaWYgKG5vb3ApIHtcbiAgICAgICAgICAgICAgcmV0dXJuIEVmZmVjdC52b2lkXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChyZXF1ZXN0LmFjdGlvbiA9PT0gJ3N0b3AnKSB7XG4gICAgICAgICAgICAgIHJldHVybiBzdG9wSW5zdGFuY2UoaW5zdGFuY2UsICdtYW51YWxTdG9wJylcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHJlcXVlc3QuYWN0aW9uID09PSAncmVzdGFydCcpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHN0b3BJbnN0YW5jZShpbnN0YW5jZSwgJ21hbnVhbFN0b3AnKS5waXBlKFxuICAgICAgICAgICAgICAgIEVmZmVjdC5mbGF0TWFwKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IGluc3RhbGxhdGlvbiA9IGluc3RhbGxhdGlvbnMuZ2V0KGluc3RhbmNlLmluc3RhbGxhdGlvbktleSlcbiAgICAgICAgICAgICAgICAgIGlmICghaW5zdGFsbGF0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBFZmZlY3Qudm9pZFxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgaW5zdGFsbGF0aW9uLmN1cnJlbnRJbnN0YW5jZUlkID0gdW5kZWZpbmVkXG4gICAgICAgICAgICAgICAgICByZXR1cm4gc3RhcnRJbnN0YWxsYXRpb24oaW5zdGFuY2UuaW5zdGFsbGF0aW9uS2V5KVxuICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIHN0YXJ0OiBvbmx5IGFwcGxpZXMgdG8gc3RvcHBlZCBpbnN0YW5jZXM7IHJldXNlcyBjdXJyZW50IHJ1blNlcSB3aXRob3V0IGluY3JlbWVudGluZy5cbiAgICAgICAgICAgIGlmIChyZXF1ZXN0LmFjdGlvbiA9PT0gJ3N0YXJ0Jykge1xuICAgICAgICAgICAgICBpZiAoaW5zdGFuY2Uuc3RhdHVzLnN0YXR1cyA9PT0gJ3J1bm5pbmcnIHx8IGluc3RhbmNlLnN0YXR1cy5zdGF0dXMgPT09ICdzdGFydGluZycpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gRWZmZWN0LnZvaWRcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIGNvbnN0IGluc3RhbGxhdGlvbiA9IGluc3RhbGxhdGlvbnMuZ2V0KGluc3RhbmNlLmluc3RhbGxhdGlvbktleSlcbiAgICAgICAgICAgICAgaWYgKCFpbnN0YWxsYXRpb24pIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gRWZmZWN0LnZvaWRcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBpbnN0YWxsYXRpb24uY3VycmVudEluc3RhbmNlSWQgPSB1bmRlZmluZWRcbiAgICAgICAgICAgICAgcmV0dXJuIHN0YXJ0SW5zdGFsbGF0aW9uKGluc3RhbmNlLmluc3RhbGxhdGlvbktleSlcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIEVmZmVjdC52b2lkXG4gICAgICAgICAgfSksXG4gICAgICAgIClcbiAgICAgIH0pXG5cbiAgICBjb25zdCBkZWxpdmVyUGxhdGZvcm1FdmVudDogUHJvY2Vzc1J1bnRpbWVbJ2RlbGl2ZXJQbGF0Zm9ybUV2ZW50J10gPSAoZXZlbnQpID0+XG4gICAgICBFZmZlY3QuZ2VuKGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIGNvbnN0IG5vb3AgPSB5aWVsZCogVGFza1J1bm5lci5zaG91bGROb29wSW5TeW5jVHJhbnNhY3Rpb25GaWJlcih7XG4gICAgICAgICAgY29kZTogJ3Byb2Nlc3M6OmludmFsaWRfdXNhZ2UnLFxuICAgICAgICAgIHNldmVyaXR5OiAnZXJyb3InLFxuICAgICAgICAgIG1lc3NhZ2U6XG4gICAgICAgICAgICAnUHJvY2Vzc1J1bnRpbWUgcGxhdGZvcm0gZXZlbnRzIGFyZSBub3QgYWxsb3dlZCBpbnNpZGUgYSBzeW5jaHJvbm91cyBTdGF0ZVRyYW5zYWN0aW9uIGJvZHkgKGl0IG1heSBkZWFkbG9jayB0aGUgdHhuUXVldWUpLicsXG4gICAgICAgICAgaGludDogJ0RlbGl2ZXIgcGxhdGZvcm1FdmVudCBvdXRzaWRlIHRoZSB0cmFuc2FjdGlvbiB3aW5kb3cuJyxcbiAgICAgICAgICBraW5kOiAncHJvY2Vzc19wbGF0Zm9ybV9ldmVudF9pbl90cmFuc2FjdGlvbicsXG4gICAgICAgIH0pXG4gICAgICAgIGlmIChub29wKSByZXR1cm5cblxuICAgICAgICBjb25zdCB0YXJnZXRzID0gQXJyYXkuZnJvbShpbnN0YW5jZXMudmFsdWVzKCkpXG4gICAgICAgIGNvbnN0IGV2ZW50TmFtZSA9IGV2ZW50LmV2ZW50TmFtZVxuXG4gICAgICAgIHlpZWxkKiBFZmZlY3QuZm9yRWFjaChcbiAgICAgICAgICB0YXJnZXRzLFxuICAgICAgICAgIChpbnN0YW5jZSkgPT5cbiAgICAgICAgICAgIEVmZmVjdC5zdXNwZW5kKCgpID0+IHtcbiAgICAgICAgICAgICAgaWYgKGluc3RhbmNlLnN0YXR1cy5zdGF0dXMgIT09ICdzdGFydGluZycgJiYgaW5zdGFuY2Uuc3RhdHVzLnN0YXR1cyAhPT0gJ3J1bm5pbmcnKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIEVmZmVjdC52b2lkXG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICBjb25zdCBpbnN0YWxsYXRpb24gPSBpbnN0YWxsYXRpb25zLmdldChpbnN0YW5jZS5pbnN0YWxsYXRpb25LZXkpXG4gICAgICAgICAgICAgIGlmICghaW5zdGFsbGF0aW9uKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIEVmZmVjdC52b2lkXG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICBjb25zdCBzcGVjcyA9IGluc3RhbGxhdGlvbi5kZWZpbml0aW9uLnRyaWdnZXJzLmZpbHRlcihcbiAgICAgICAgICAgICAgICAodCk6IHQgaXMgRXh0cmFjdDxQcm9jZXNzVHJpZ2dlclNwZWMsIHsgcmVhZG9ubHkga2luZDogJ3BsYXRmb3JtRXZlbnQnIH0+ID0+XG4gICAgICAgICAgICAgICAgICB0LmtpbmQgPT09ICdwbGF0Zm9ybUV2ZW50JyAmJiB0LnBsYXRmb3JtRXZlbnQgPT09IGV2ZW50TmFtZSxcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICBpZiAoc3BlY3MubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIEVmZmVjdC52b2lkXG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICByZXR1cm4gRWZmZWN0LmZvckVhY2goXG4gICAgICAgICAgICAgICAgc3BlY3MsXG4gICAgICAgICAgICAgICAgKHNwZWMpID0+XG4gICAgICAgICAgICAgICAgICBRdWV1ZS5vZmZlcihpbnN0YW5jZS5wbGF0Zm9ybVRyaWdnZXJzUXVldWUsIHtcbiAgICAgICAgICAgICAgICAgICAga2luZDogJ3BsYXRmb3JtRXZlbnQnLFxuICAgICAgICAgICAgICAgICAgICBuYW1lOiBzcGVjLm5hbWUsXG4gICAgICAgICAgICAgICAgICAgIHBsYXRmb3JtRXZlbnQ6IHNwZWMucGxhdGZvcm1FdmVudCxcbiAgICAgICAgICAgICAgICAgIH0gc2F0aXNmaWVzIFByb2Nlc3NUcmlnZ2VyKSxcbiAgICAgICAgICAgICAgICB7IGRpc2NhcmQ6IHRydWUgfSxcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgeyBkaXNjYXJkOiB0cnVlIH0sXG4gICAgICAgIClcbiAgICAgIH0pXG5cbiAgICBjb25zdCBldmVudHNTdHJlYW06IFByb2Nlc3NSdW50aW1lWydldmVudHMnXSA9IFN0cmVhbS5mcm9tUHViU3ViKGV2ZW50c0h1YilcblxuICAgIGNvbnN0IGdldEV2ZW50c1NuYXBzaG90OiBQcm9jZXNzUnVudGltZVsnZ2V0RXZlbnRzU25hcHNob3QnXSA9ICgpID0+IEVmZmVjdC5zeW5jKCgpID0+IGV2ZW50c0J1ZmZlci5zbGljZSgpKVxuXG4gICAgeWllbGQqIEVmZmVjdC5hZGRGaW5hbGl6ZXIoKCkgPT5cbiAgICAgIEVmZmVjdC5nZW4oZnVuY3Rpb24qICgpIHtcbiAgICAgICAgZm9yIChjb25zdCBpbnN0YWxsYXRpb24gb2YgaW5zdGFsbGF0aW9ucy52YWx1ZXMoKSkge1xuICAgICAgICAgIGluc3RhbGxhdGlvbi5wZW5kaW5nU3RhcnQgPSB1bmRlZmluZWRcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGNvbnN0IGluc3RhbmNlIG9mIGluc3RhbmNlcy52YWx1ZXMoKSkge1xuICAgICAgICAgIGlmIChpbnN0YW5jZS5maWJlcikge1xuICAgICAgICAgICAgeWllbGQqIHN0b3BJbnN0YW5jZShpbnN0YW5jZSwgJ3Njb3BlRGlzcG9zZWQnKVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSkucGlwZShcbiAgICAgICAgRWZmZWN0LmNhdGNoQWxsQ2F1c2UoKGNhdXNlKSA9PlxuICAgICAgICAgIEVmZmVjdC5zeW5jKCgpID0+IHtcbiAgICAgICAgICAgIC8vIEZpbmFsaXplcnMgbXVzdCBub3QgdGhyb3c7IGJlc3QtZWZmb3J0IGxvZ2dpbmcgb25seS5cbiAgICAgICAgICAgIGlmIChpc0RldkVudigpKSB7XG4gICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zb2xlXG4gICAgICAgICAgICAgIGNvbnNvbGUud2FybignW1Byb2Nlc3NSdW50aW1lXSBmaW5hbGl6ZXIgZmFpbGVkJywgQ2F1c2UucHJldHR5KGNhdXNlKSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KSxcbiAgICAgICAgKSxcbiAgICAgICksXG4gICAgKVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIGluc3RhbGwsXG4gICAgICBsaXN0SW5zdGFsbGF0aW9ucyxcbiAgICAgIGdldEluc3RhbmNlU3RhdHVzLFxuICAgICAgY29udHJvbEluc3RhbmNlLFxuICAgICAgZGVsaXZlclBsYXRmb3JtRXZlbnQsXG4gICAgICBldmVudHM6IGV2ZW50c1N0cmVhbSxcbiAgICAgIGdldEV2ZW50c1NuYXBzaG90LFxuICAgIH0gc2F0aXNmaWVzIFByb2Nlc3NSdW50aW1lXG4gIH0pXG5cbmV4cG9ydCBjb25zdCBsYXllciA9IChvcHRpb25zPzogeyByZWFkb25seSBtYXhFdmVudEhpc3Rvcnk/OiBudW1iZXIgfSk6IExheWVyLkxheWVyPFByb2Nlc3NSdW50aW1lVGFnLCBuZXZlciwgbmV2ZXI+ID0+XG4gIExheWVyLnNjb3BlZChQcm9jZXNzUnVudGltZVRhZywgbWFrZShvcHRpb25zKSlcbiIsICJpbXBvcnQgdHlwZSB7IFByb2Nlc3NJZGVudGl0eSwgUHJvY2Vzc0luc3RhbmNlSWRlbnRpdHksIFByb2Nlc3NTY29wZSB9IGZyb20gJy4vcHJvdG9jb2wuanMnXG5cbmV4cG9ydCB0eXBlIFByb2Nlc3NTY29wZUtleSA9IHN0cmluZ1xuXG5leHBvcnQgY29uc3Qgc2NvcGVLZXlGcm9tU2NvcGUgPSAoc2NvcGU6IFByb2Nlc3NTY29wZSk6IFByb2Nlc3NTY29wZUtleSA9PiB7XG4gIHN3aXRjaCAoc2NvcGUudHlwZSkge1xuICAgIGNhc2UgJ2FwcCc6XG4gICAgICByZXR1cm4gYGFwcDoke3Njb3BlLmFwcElkfWBcbiAgICBjYXNlICdtb2R1bGVJbnN0YW5jZSc6XG4gICAgICByZXR1cm4gYG1vZHVsZUluc3RhbmNlOiR7c2NvcGUubW9kdWxlSWR9Ojoke3Njb3BlLmluc3RhbmNlSWR9YFxuICAgIGNhc2UgJ3VpU3VidHJlZSc6XG4gICAgICByZXR1cm4gYHVpU3VidHJlZToke3Njb3BlLnN1YnRyZWVJZH1gXG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IGluc3RhbGxhdGlvbktleUZyb21JZGVudGl0eSA9IChpZGVudGl0eTogUHJvY2Vzc0lkZW50aXR5KTogc3RyaW5nID0+XG4gIGAke2lkZW50aXR5LnByb2Nlc3NJZH1AQCR7c2NvcGVLZXlGcm9tU2NvcGUoaWRlbnRpdHkuc2NvcGUpfWBcblxuZXhwb3J0IGNvbnN0IHByb2Nlc3NJbnN0YW5jZUlkRnJvbUlkZW50aXR5ID0gKGlkZW50aXR5OiBQcm9jZXNzSW5zdGFuY2VJZGVudGl0eSk6IHN0cmluZyA9PiB7XG4gIGNvbnN0IHNjb3BlS2V5ID0gc2NvcGVLZXlGcm9tU2NvcGUoaWRlbnRpdHkuaWRlbnRpdHkuc2NvcGUpXG4gIHJldHVybiBgcHJvY2Vzczoke2lkZW50aXR5LmlkZW50aXR5LnByb2Nlc3NJZH06OiR7c2NvcGVLZXl9OjpyJHtpZGVudGl0eS5ydW5TZXF9YFxufVxuIiwgImltcG9ydCB7IEVmZmVjdCwgRmliZXIsIE9wdGlvbiwgUmVmLCBTY29wZSwgU3RyZWFtIH0gZnJvbSAnZWZmZWN0J1xuaW1wb3J0IHR5cGUgeyBUYXNrUnVubmVyTW9kZSB9IGZyb20gJy4uL1Rhc2tSdW5uZXIuanMnXG5pbXBvcnQgdHlwZSB7IFByb2Nlc3NDb25jdXJyZW5jeVBvbGljeSwgUHJvY2Vzc1RyaWdnZXIgfSBmcm9tICcuL3Byb3RvY29sLmpzJ1xuXG5leHBvcnQgY29uc3QgREVGQVVMVF9TRVJJQUxfUVVFVUVfR1VBUkRfTElNSVQgPSA0MDk2XG5leHBvcnQgY29uc3QgREVGQVVMVF9QQVJBTExFTF9MSU1JVCA9IDE2XG5cbmV4cG9ydCBjb25zdCB0b1Rhc2tSdW5uZXJNb2RlID0gKHBvbGljeTogUHJvY2Vzc0NvbmN1cnJlbmN5UG9saWN5KTogVGFza1J1bm5lck1vZGUgPT4ge1xuICBzd2l0Y2ggKHBvbGljeS5tb2RlKSB7XG4gICAgY2FzZSAnbGF0ZXN0JzpcbiAgICAgIHJldHVybiAnbGF0ZXN0J1xuICAgIGNhc2UgJ3NlcmlhbCc6XG4gICAgICByZXR1cm4gJ3Rhc2snXG4gICAgY2FzZSAnZHJvcCc6XG4gICAgICByZXR1cm4gJ2V4aGF1c3QnXG4gICAgY2FzZSAncGFyYWxsZWwnOlxuICAgICAgcmV0dXJuICdwYXJhbGxlbCdcbiAgfVxufVxuXG5leHBvcnQgdHlwZSBSZXNvbHZlZFF1ZXVlTGltaXQgPSB7XG4gIC8qKiBVc2VyLWNvbmZpZ3VyZWQgbGltaXQ7IHRyZWF0ZWQgYXMgdW5saW1pdGVkIHdoZW4gb21pdHRlZCAoc3RpbGwgYm91bmRlZCBieSB0aGUgZ3VhcmQpLiAqL1xuICByZWFkb25seSBjb25maWd1cmVkOiBudW1iZXIgfCAndW5ib3VuZGVkJ1xuICAvKiogUnVudGltZS1lbmZvcmNlZCBndWFyZCBsaW1pdCAocHJldmVudHMgdW5ib3VuZGVkIG1lbW9yeSBncm93dGgpLiAqL1xuICByZWFkb25seSBndWFyZDogbnVtYmVyXG59XG5cbmV4cG9ydCBjb25zdCByZXNvbHZlUXVldWVMaW1pdCA9IChcbiAgbWF4UXVldWU6IHVua25vd24sXG4gIG9wdGlvbnM/OiB7XG4gICAgcmVhZG9ubHkgZGVmYXVsdEd1YXJkPzogbnVtYmVyXG4gIH0sXG4pOiBSZXNvbHZlZFF1ZXVlTGltaXQgPT4ge1xuICBjb25zdCBkZWZhdWx0R3VhcmQgPSBvcHRpb25zPy5kZWZhdWx0R3VhcmQgPz8gREVGQVVMVF9TRVJJQUxfUVVFVUVfR1VBUkRfTElNSVRcblxuICBjb25zdCBjb25maWd1cmVkID1cbiAgICB0eXBlb2YgbWF4UXVldWUgPT09ICdudW1iZXInICYmIE51bWJlci5pc0Zpbml0ZShtYXhRdWV1ZSkgJiYgbWF4UXVldWUgPj0gMCA/IE1hdGguZmxvb3IobWF4UXVldWUpIDogJ3VuYm91bmRlZCdcblxuICByZXR1cm4ge1xuICAgIGNvbmZpZ3VyZWQsXG4gICAgZ3VhcmQ6IGNvbmZpZ3VyZWQgPT09ICd1bmJvdW5kZWQnID8gZGVmYXVsdEd1YXJkIDogY29uZmlndXJlZCxcbiAgfVxufVxuXG5leHBvcnQgdHlwZSBQcm9jZXNzVHJpZ2dlclF1ZXVlT3ZlcmZsb3dJbmZvID0ge1xuICByZWFkb25seSBtb2RlOiAnc2VyaWFsJyB8ICdwYXJhbGxlbCdcbiAgcmVhZG9ubHkgY3VycmVudExlbmd0aDogbnVtYmVyXG4gIHJlYWRvbmx5IHBlYWs6IG51bWJlclxuICByZWFkb25seSBsaW1pdDogUmVzb2x2ZWRRdWV1ZUxpbWl0XG4gIHJlYWRvbmx5IHBvbGljeTogUHJvY2Vzc0NvbmN1cnJlbmN5UG9saWN5XG59XG5cbmV4cG9ydCBjb25zdCBydW5Qcm9jZXNzVHJpZ2dlclN0cmVhbSA9IChhcmdzOiB7XG4gIHJlYWRvbmx5IHN0cmVhbTogU3RyZWFtLlN0cmVhbTxQcm9jZXNzVHJpZ2dlcj5cbiAgcmVhZG9ubHkgcG9saWN5OiBQcm9jZXNzQ29uY3VycmVuY3lQb2xpY3lcbiAgcmVhZG9ubHkgYXNzaWduVHJpZ2dlclNlcTogKHRyaWdnZXI6IFByb2Nlc3NUcmlnZ2VyKSA9PiBQcm9jZXNzVHJpZ2dlclxuICAvKiogcnVuIGEgdHJpZ2dlciB0byBjb21wbGV0aW9uICh0aGUgY2FsbGVyIGRlY2lkZXMgd2hhdCBhIFxcXCJydW5cXFwiIG1lYW5zKS4gKi9cbiAgcmVhZG9ubHkgcnVuOiAodHJpZ2dlcjogUHJvY2Vzc1RyaWdnZXIpID0+IEVmZmVjdC5FZmZlY3Q8dm9pZCwgbmV2ZXIsIFNjb3BlLlNjb3BlPlxuICAvKiogaW52b2tlZCB3aGVuIGEgdHJpZ2dlciBpcyBkcm9wcGVkIChvbmx5IGZvciBtb2RlPWRyb3ApLiAqL1xuICByZWFkb25seSBvbkRyb3A6ICh0cmlnZ2VyOiBQcm9jZXNzVHJpZ2dlcikgPT4gRWZmZWN0LkVmZmVjdDx2b2lkPlxuICAvKiogaW52b2tlZCB3aGVuIGludGVybmFsIHF1ZXVlIGd1YXJkIGlzIGV4Y2VlZGVkIChmYWlsLXN0b3AgYnkgZGVmYXVsdCkuICovXG4gIHJlYWRvbmx5IG9uUXVldWVPdmVyZmxvdzogKGluZm86IFByb2Nlc3NUcmlnZ2VyUXVldWVPdmVyZmxvd0luZm8pID0+IEVmZmVjdC5FZmZlY3Q8dm9pZD5cbiAgcmVhZG9ubHkgZGVmYXVsdFBhcmFsbGVsTGltaXQ/OiBudW1iZXJcbiAgcmVhZG9ubHkgZGVmYXVsdFF1ZXVlR3VhcmQ/OiBudW1iZXJcbn0pOiBFZmZlY3QuRWZmZWN0PHZvaWQsIG5ldmVyLCBTY29wZS5TY29wZT4gPT5cbiAgRWZmZWN0LmdlbihmdW5jdGlvbiogKCkge1xuICAgIGNvbnN0IHBvbGljeSA9IGFyZ3MucG9saWN5XG4gICAgY29uc3QgZGVmYXVsdFF1ZXVlR3VhcmQgPSBhcmdzLmRlZmF1bHRRdWV1ZUd1YXJkID8/IERFRkFVTFRfU0VSSUFMX1FVRVVFX0dVQVJEX0xJTUlUXG5cbiAgICBpZiAocG9saWN5Lm1vZGUgPT09ICdsYXRlc3QnKSB7XG4gICAgICBjb25zdCBzdGF0ZVJlZiA9IHlpZWxkKiBSZWYubWFrZTx7XG4gICAgICAgIHJlYWRvbmx5IGZpYmVyPzogRmliZXIuUnVudGltZUZpYmVyPHZvaWQsIG5ldmVyPlxuICAgICAgICByZWFkb25seSBydW5uaW5nSWQ6IG51bWJlclxuICAgICAgICByZWFkb25seSBuZXh0SWQ6IG51bWJlclxuICAgICAgfT4oeyBmaWJlcjogdW5kZWZpbmVkLCBydW5uaW5nSWQ6IDAsIG5leHRJZDogMCB9KVxuXG4gICAgICBjb25zdCBvblRyaWdnZXIgPSAodHJpZ2dlcjA6IFByb2Nlc3NUcmlnZ2VyKTogRWZmZWN0LkVmZmVjdDx2b2lkLCBuZXZlciwgU2NvcGUuU2NvcGU+ID0+XG4gICAgICAgIEVmZmVjdC5nZW4oZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICBjb25zdCB0cmlnZ2VyID0gYXJncy5hc3NpZ25UcmlnZ2VyU2VxKHRyaWdnZXIwKVxuXG4gICAgICAgICAgY29uc3QgW3ByZXZGaWJlciwgcHJldlJ1bm5pbmdJZCwgcnVuSWRdID0geWllbGQqIFJlZi5tb2RpZnkoc3RhdGVSZWYsIChzKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBuZXh0SWQgPSBzLm5leHRJZCArIDFcbiAgICAgICAgICAgIHJldHVybiBbW3MuZmliZXIsIHMucnVubmluZ0lkLCBuZXh0SWRdIGFzIGNvbnN0LCB7IC4uLnMsIG5leHRJZCwgcnVubmluZ0lkOiBuZXh0SWQgfV0gYXMgY29uc3RcbiAgICAgICAgICB9KVxuXG4gICAgICAgICAgaWYgKHByZXZGaWJlciAmJiBwcmV2UnVubmluZ0lkICE9PSAwKSB7XG4gICAgICAgICAgICBjb25zdCBkb25lID0geWllbGQqIEZpYmVyLnBvbGwocHJldkZpYmVyKVxuICAgICAgICAgICAgaWYgKE9wdGlvbi5pc05vbmUoZG9uZSkpIHtcbiAgICAgICAgICAgICAgeWllbGQqIEZpYmVyLmludGVycnVwdEZvcmsocHJldkZpYmVyKVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IGZpYmVyID0geWllbGQqIEVmZmVjdC5mb3JrU2NvcGVkKFxuICAgICAgICAgICAgYXJnc1xuICAgICAgICAgICAgICAucnVuKHRyaWdnZXIpXG4gICAgICAgICAgICAgIC5waXBlKEVmZmVjdC5lbnN1cmluZyhSZWYudXBkYXRlKHN0YXRlUmVmLCAocykgPT4gKHMucnVubmluZ0lkID09PSBydW5JZCA/IHsgLi4ucywgcnVubmluZ0lkOiAwIH0gOiBzKSkpKSxcbiAgICAgICAgICApXG5cbiAgICAgICAgICB5aWVsZCogUmVmLnVwZGF0ZShzdGF0ZVJlZiwgKHMpID0+ICh7IC4uLnMsIGZpYmVyIH0pKVxuICAgICAgICB9KVxuXG4gICAgICByZXR1cm4geWllbGQqIFN0cmVhbS5ydW5Gb3JFYWNoKGFyZ3Muc3RyZWFtLCBvblRyaWdnZXIpXG4gICAgfVxuXG4gICAgY29uc3QgYnVzeVJlZiA9IHlpZWxkKiBSZWYubWFrZShmYWxzZSlcbiAgICBjb25zdCBzZXJpYWxTdGF0ZVJlZiA9IHlpZWxkKiBSZWYubWFrZSh7XG4gICAgICBydW5uaW5nOiBmYWxzZSxcbiAgICAgIHF1ZXVlOiBbXSBhcyBQcm9jZXNzVHJpZ2dlcltdLFxuICAgICAgcGVhazogMCxcbiAgICB9KVxuICAgIGNvbnN0IHBhcmFsbGVsU3RhdGVSZWYgPSB5aWVsZCogUmVmLm1ha2Uoe1xuICAgICAgYWN0aXZlOiAwLFxuICAgICAgcXVldWU6IFtdIGFzIFByb2Nlc3NUcmlnZ2VyW10sXG4gICAgICBwZWFrOiAwLFxuICAgIH0pXG5cbiAgICBjb25zdCBzZXJpYWxRdWV1ZUxpbWl0ID0gcmVzb2x2ZVF1ZXVlTGltaXQocG9saWN5Lm1heFF1ZXVlLCB7IGRlZmF1bHRHdWFyZDogZGVmYXVsdFF1ZXVlR3VhcmQgfSlcbiAgICBjb25zdCBwYXJhbGxlbFF1ZXVlTGltaXQgPSByZXNvbHZlUXVldWVMaW1pdCh1bmRlZmluZWQsIHsgZGVmYXVsdEd1YXJkOiBkZWZhdWx0UXVldWVHdWFyZCB9KVxuICAgIGNvbnN0IHBhcmFsbGVsTGltaXQgPVxuICAgICAgdHlwZW9mIHBvbGljeS5tYXhQYXJhbGxlbCA9PT0gJ251bWJlcicgJiYgTnVtYmVyLmlzRmluaXRlKHBvbGljeS5tYXhQYXJhbGxlbCkgJiYgcG9saWN5Lm1heFBhcmFsbGVsID49IDFcbiAgICAgICAgPyBNYXRoLmZsb29yKHBvbGljeS5tYXhQYXJhbGxlbClcbiAgICAgICAgOiAoYXJncy5kZWZhdWx0UGFyYWxsZWxMaW1pdCA/PyBERUZBVUxUX1BBUkFMTEVMX0xJTUlUKVxuXG4gICAgY29uc3QgZHJhaW5TZXJpYWwgPSAoKTogRWZmZWN0LkVmZmVjdDx2b2lkLCBuZXZlciwgU2NvcGUuU2NvcGU+ID0+XG4gICAgICBFZmZlY3Quc3VzcGVuZCgoKSA9PlxuICAgICAgICBSZWYubW9kaWZ5KHNlcmlhbFN0YXRlUmVmLCAoc3RhdGUpID0+IHtcbiAgICAgICAgICBpZiAoc3RhdGUucnVubmluZyB8fCBzdGF0ZS5xdWV1ZS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiBbT3B0aW9uLm5vbmUoKSwgc3RhdGVdIGFzIGNvbnN0XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0IFtuZXh0LCAuLi5yZXN0XSA9IHN0YXRlLnF1ZXVlXG4gICAgICAgICAgcmV0dXJuIFtPcHRpb24uc29tZShuZXh0KSwgeyAuLi5zdGF0ZSwgcnVubmluZzogdHJ1ZSwgcXVldWU6IHJlc3QgfV0gYXMgY29uc3RcbiAgICAgICAgfSkucGlwZShcbiAgICAgICAgICBFZmZlY3QuZmxhdE1hcCgobmV4dCkgPT5cbiAgICAgICAgICAgIE9wdGlvbi5tYXRjaChuZXh0LCB7XG4gICAgICAgICAgICAgIG9uTm9uZTogKCkgPT4gRWZmZWN0LnZvaWQsXG4gICAgICAgICAgICAgIG9uU29tZTogKHRyaWdnZXIpID0+XG4gICAgICAgICAgICAgICAgRWZmZWN0LmZvcmtTY29wZWQoXG4gICAgICAgICAgICAgICAgICBhcmdzXG4gICAgICAgICAgICAgICAgICAgIC5ydW4odHJpZ2dlcilcbiAgICAgICAgICAgICAgICAgICAgLnBpcGUoXG4gICAgICAgICAgICAgICAgICAgICAgRWZmZWN0LmVuc3VyaW5nKFJlZi51cGRhdGUoc2VyaWFsU3RhdGVSZWYsIChzKSA9PiAoeyAuLi5zLCBydW5uaW5nOiBmYWxzZSB9KSkpLFxuICAgICAgICAgICAgICAgICAgICAgIEVmZmVjdC56aXBSaWdodChkcmFpblNlcmlhbCgpKSxcbiAgICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICApLnBpcGUoRWZmZWN0LmFzVm9pZCksXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICApLFxuICAgICAgICApLFxuICAgICAgKVxuXG4gICAgY29uc3QgZHJhaW5QYXJhbGxlbCA9ICgpOiBFZmZlY3QuRWZmZWN0PHZvaWQsIG5ldmVyLCBTY29wZS5TY29wZT4gPT5cbiAgICAgIEVmZmVjdC5zdXNwZW5kKCgpID0+XG4gICAgICAgIFJlZi5tb2RpZnkocGFyYWxsZWxTdGF0ZVJlZiwgKHN0YXRlKSA9PiB7XG4gICAgICAgICAgaWYgKHN0YXRlLmFjdGl2ZSA+PSBwYXJhbGxlbExpbWl0IHx8IHN0YXRlLnF1ZXVlLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIFtPcHRpb24ubm9uZSgpLCBzdGF0ZV0gYXMgY29uc3RcbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3QgW25leHQsIC4uLnJlc3RdID0gc3RhdGUucXVldWVcbiAgICAgICAgICByZXR1cm4gW09wdGlvbi5zb21lKG5leHQpLCB7IC4uLnN0YXRlLCBhY3RpdmU6IHN0YXRlLmFjdGl2ZSArIDEsIHF1ZXVlOiByZXN0IH1dIGFzIGNvbnN0XG4gICAgICAgIH0pLnBpcGUoXG4gICAgICAgICAgRWZmZWN0LmZsYXRNYXAoKG5leHQpID0+XG4gICAgICAgICAgICBPcHRpb24ubWF0Y2gobmV4dCwge1xuICAgICAgICAgICAgICBvbk5vbmU6ICgpID0+IEVmZmVjdC52b2lkLFxuICAgICAgICAgICAgICBvblNvbWU6ICh0cmlnZ2VyKSA9PlxuICAgICAgICAgICAgICAgIEVmZmVjdC5mb3JrU2NvcGVkKFxuICAgICAgICAgICAgICAgICAgYXJncy5ydW4odHJpZ2dlcikucGlwZShcbiAgICAgICAgICAgICAgICAgICAgRWZmZWN0LmVuc3VyaW5nKFxuICAgICAgICAgICAgICAgICAgICAgIFJlZi51cGRhdGUocGFyYWxsZWxTdGF0ZVJlZiwgKHMpID0+ICh7XG4gICAgICAgICAgICAgICAgICAgICAgICAuLi5zLFxuICAgICAgICAgICAgICAgICAgICAgICAgYWN0aXZlOiBNYXRoLm1heCgwLCBzLmFjdGl2ZSAtIDEpLFxuICAgICAgICAgICAgICAgICAgICAgIH0pKSxcbiAgICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAgICAgRWZmZWN0LnppcFJpZ2h0KGRyYWluUGFyYWxsZWwoKSksXG4gICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICkucGlwZShFZmZlY3QuYXNWb2lkLCBFZmZlY3QuemlwUmlnaHQoZHJhaW5QYXJhbGxlbCgpKSksXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICApLFxuICAgICAgICApLFxuICAgICAgKVxuXG4gICAgY29uc3Qgb25UcmlnZ2VyID0gKHRyaWdnZXIwOiBQcm9jZXNzVHJpZ2dlcik6IEVmZmVjdC5FZmZlY3Q8dm9pZCwgbmV2ZXIsIFNjb3BlLlNjb3BlPiA9PlxuICAgICAgRWZmZWN0LmdlbihmdW5jdGlvbiogKCkge1xuICAgICAgICBjb25zdCB0cmlnZ2VyID0gYXJncy5hc3NpZ25UcmlnZ2VyU2VxKHRyaWdnZXIwKVxuXG4gICAgICAgIGlmIChwb2xpY3kubW9kZSA9PT0gJ2Ryb3AnKSB7XG4gICAgICAgICAgY29uc3QgYWNxdWlyZWQgPSB5aWVsZCogUmVmLm1vZGlmeShidXN5UmVmLCAoYnVzeSkgPT5cbiAgICAgICAgICAgIGJ1c3kgPyAoW2ZhbHNlLCBidXN5XSBhcyBjb25zdCkgOiAoW3RydWUsIHRydWVdIGFzIGNvbnN0KSxcbiAgICAgICAgICApXG4gICAgICAgICAgaWYgKCFhY3F1aXJlZCkge1xuICAgICAgICAgICAgeWllbGQqIGFyZ3Mub25Ecm9wKHRyaWdnZXIpXG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICB9XG5cbiAgICAgICAgICB5aWVsZCogRWZmZWN0LmZvcmtTY29wZWQoYXJncy5ydW4odHJpZ2dlcikucGlwZShFZmZlY3QuZW5zdXJpbmcoUmVmLnNldChidXN5UmVmLCBmYWxzZSkpKSlcbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChwb2xpY3kubW9kZSA9PT0gJ3BhcmFsbGVsJykge1xuICAgICAgICAgIGNvbnN0IG5leHRTaXplID0geWllbGQqIFJlZi5tb2RpZnkocGFyYWxsZWxTdGF0ZVJlZiwgKHN0YXRlKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBxdWV1ZSA9IFsuLi5zdGF0ZS5xdWV1ZSwgdHJpZ2dlcl1cbiAgICAgICAgICAgIHJldHVybiBbcXVldWUubGVuZ3RoLCB7IC4uLnN0YXRlLCBxdWV1ZSwgcGVhazogTWF0aC5tYXgoc3RhdGUucGVhaywgcXVldWUubGVuZ3RoKSB9XSBhcyBjb25zdFxuICAgICAgICAgIH0pXG5cbiAgICAgICAgICBpZiAobmV4dFNpemUgPiBwYXJhbGxlbFF1ZXVlTGltaXQuZ3VhcmQpIHtcbiAgICAgICAgICAgIGNvbnN0IHN0YXRlID0geWllbGQqIFJlZi5nZXQocGFyYWxsZWxTdGF0ZVJlZilcbiAgICAgICAgICAgIHlpZWxkKiBhcmdzLm9uUXVldWVPdmVyZmxvdyh7XG4gICAgICAgICAgICAgIG1vZGU6ICdwYXJhbGxlbCcsXG4gICAgICAgICAgICAgIGN1cnJlbnRMZW5ndGg6IG5leHRTaXplLFxuICAgICAgICAgICAgICBwZWFrOiBzdGF0ZS5wZWFrLFxuICAgICAgICAgICAgICBsaW1pdDogcGFyYWxsZWxRdWV1ZUxpbWl0LFxuICAgICAgICAgICAgICBwb2xpY3ksXG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgeWllbGQqIGRyYWluUGFyYWxsZWwoKVxuICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG5cbiAgICAgICAgLy8gc2VyaWFsXG4gICAgICAgIGNvbnN0IG5leHRTaXplID0geWllbGQqIFJlZi5tb2RpZnkoc2VyaWFsU3RhdGVSZWYsIChzdGF0ZSkgPT4ge1xuICAgICAgICAgIGNvbnN0IHF1ZXVlID0gWy4uLnN0YXRlLnF1ZXVlLCB0cmlnZ2VyXVxuICAgICAgICAgIHJldHVybiBbcXVldWUubGVuZ3RoLCB7IC4uLnN0YXRlLCBxdWV1ZSwgcGVhazogTWF0aC5tYXgoc3RhdGUucGVhaywgcXVldWUubGVuZ3RoKSB9XSBhcyBjb25zdFxuICAgICAgICB9KVxuXG4gICAgICAgIGlmIChuZXh0U2l6ZSA+IHNlcmlhbFF1ZXVlTGltaXQuZ3VhcmQpIHtcbiAgICAgICAgICBjb25zdCBzdGF0ZSA9IHlpZWxkKiBSZWYuZ2V0KHNlcmlhbFN0YXRlUmVmKVxuICAgICAgICAgIHlpZWxkKiBhcmdzLm9uUXVldWVPdmVyZmxvdyh7XG4gICAgICAgICAgICBtb2RlOiAnc2VyaWFsJyxcbiAgICAgICAgICAgIGN1cnJlbnRMZW5ndGg6IG5leHRTaXplLFxuICAgICAgICAgICAgcGVhazogc3RhdGUucGVhayxcbiAgICAgICAgICAgIGxpbWl0OiBzZXJpYWxRdWV1ZUxpbWl0LFxuICAgICAgICAgICAgcG9saWN5LFxuICAgICAgICAgIH0pXG4gICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cblxuICAgICAgICB5aWVsZCogZHJhaW5TZXJpYWwoKVxuICAgICAgfSlcblxuICAgIHJldHVybiB5aWVsZCogU3RyZWFtLnJ1bkZvckVhY2goYXJncy5zdHJlYW0sIG9uVHJpZ2dlcilcbiAgfSlcbiIsICJpbXBvcnQgdHlwZSB7IFByb2Nlc3NFdmVudCB9IGZyb20gJy4vcHJvdG9jb2wuanMnXG5cbmV4cG9ydCBjb25zdCBQUk9DRVNTX0VWRU5UX01BWF9CWVRFUyA9IDQgKiAxMDI0XG5leHBvcnQgY29uc3QgUFJPQ0VTU19FVkVOVF9NQVhfRVZFTlRTX1BFUl9SVU4gPSA1MFxuZXhwb3J0IGNvbnN0IFBST0NFU1NfRVZFTlRfUkVTRVJWRURfRVZFTlRTX0ZPUl9TVU1NQVJZID0gMVxuXG5leHBvcnQgdHlwZSBQcm9jZXNzUnVuRXZlbnRCdWRnZXRTdGF0ZSA9IHtcbiAgcmVhZG9ubHkgbWF4RXZlbnRzOiBudW1iZXJcbiAgcmVhZG9ubHkgbWF4Qnl0ZXM6IG51bWJlclxuICByZWFkb25seSBlbWl0dGVkOiBudW1iZXJcbiAgcmVhZG9ubHkgZHJvcHBlZDogbnVtYmVyXG4gIHJlYWRvbmx5IGRvd25ncmFkZWQ6IG51bWJlclxuICByZWFkb25seSBzdW1tYXJ5RW1pdHRlZDogYm9vbGVhblxufVxuXG5leHBvcnQgY29uc3QgbWFrZVByb2Nlc3NSdW5FdmVudEJ1ZGdldFN0YXRlID0gKG9wdGlvbnM/OiB7XG4gIHJlYWRvbmx5IG1heEV2ZW50cz86IG51bWJlclxuICByZWFkb25seSBtYXhCeXRlcz86IG51bWJlclxufSk6IFByb2Nlc3NSdW5FdmVudEJ1ZGdldFN0YXRlID0+ICh7XG4gIG1heEV2ZW50czpcbiAgICB0eXBlb2Ygb3B0aW9ucz8ubWF4RXZlbnRzID09PSAnbnVtYmVyJyAmJiBOdW1iZXIuaXNGaW5pdGUob3B0aW9ucy5tYXhFdmVudHMpICYmIG9wdGlvbnMubWF4RXZlbnRzID49IDBcbiAgICAgID8gTWF0aC5mbG9vcihvcHRpb25zLm1heEV2ZW50cylcbiAgICAgIDogUFJPQ0VTU19FVkVOVF9NQVhfRVZFTlRTX1BFUl9SVU4sXG4gIG1heEJ5dGVzOlxuICAgIHR5cGVvZiBvcHRpb25zPy5tYXhCeXRlcyA9PT0gJ251bWJlcicgJiYgTnVtYmVyLmlzRmluaXRlKG9wdGlvbnMubWF4Qnl0ZXMpICYmIG9wdGlvbnMubWF4Qnl0ZXMgPj0gMFxuICAgICAgPyBNYXRoLmZsb29yKG9wdGlvbnMubWF4Qnl0ZXMpXG4gICAgICA6IFBST0NFU1NfRVZFTlRfTUFYX0JZVEVTLFxuICBlbWl0dGVkOiAwLFxuICBkcm9wcGVkOiAwLFxuICBkb3duZ3JhZGVkOiAwLFxuICBzdW1tYXJ5RW1pdHRlZDogZmFsc2UsXG59KVxuXG5leHBvcnQgdHlwZSBQcm9jZXNzUnVuRXZlbnRCdWRnZXREZWNpc2lvbiA9XG4gIHwge1xuICAgICAgcmVhZG9ubHkgX3RhZzogJ2VtaXQnXG4gICAgICByZWFkb25seSBldmVudDogUHJvY2Vzc0V2ZW50XG4gICAgfVxuICB8IHtcbiAgICAgIHJlYWRvbmx5IF90YWc6ICdlbWl0U3VtbWFyeSdcbiAgICAgIHJlYWRvbmx5IGV2ZW50OiBQcm9jZXNzRXZlbnRcbiAgICB9XG4gIHwge1xuICAgICAgcmVhZG9ubHkgX3RhZzogJ2Ryb3AnXG4gICAgfVxuXG5jb25zdCBtYWtlQnVkZ2V0U3VtbWFyeUV2ZW50ID0gKGFyZ3M6IHtcbiAgcmVhZG9ubHkgc291cmNlRXZlbnQ6IFByb2Nlc3NFdmVudFxuICByZWFkb25seSBtYXhFdmVudHM6IG51bWJlclxuICByZWFkb25seSBtYXhCeXRlczogbnVtYmVyXG4gIHJlYWRvbmx5IGVtaXR0ZWQ6IG51bWJlclxuICByZWFkb25seSBkcm9wcGVkOiBudW1iZXJcbiAgcmVhZG9ubHkgZG93bmdyYWRlZDogbnVtYmVyXG59KTogUHJvY2Vzc0V2ZW50ID0+ICh7XG4gIHR5cGU6ICdwcm9jZXNzOnRyaWdnZXInLFxuICBpZGVudGl0eTogYXJncy5zb3VyY2VFdmVudC5pZGVudGl0eSxcbiAgdHJpZ2dlcjogYXJncy5zb3VyY2VFdmVudC50cmlnZ2VyLFxuICBzZXZlcml0eTogJ3dhcm5pbmcnLFxuICBldmVudFNlcTogYXJncy5zb3VyY2VFdmVudC5ldmVudFNlcSxcbiAgdGltZXN0YW1wTXM6IGFyZ3Muc291cmNlRXZlbnQudGltZXN0YW1wTXMsXG4gIGVycm9yOiB7XG4gICAgbWVzc2FnZTogJ1Byb2Nlc3MgcnVuIGV2ZW50IGJ1ZGdldCBleGNlZWRlZDsgZnVydGhlciB0cmlnZ2VyL2Rpc3BhdGNoIGV2ZW50cyBhcmUgc3VwcHJlc3NlZC4nLFxuICAgIGNvZGU6ICdwcm9jZXNzOjpldmVudF9idWRnZXRfZXhjZWVkZWQnLFxuICAgIGhpbnQ6IGBtYXhFdmVudHM9JHthcmdzLm1heEV2ZW50c30gbWF4Qnl0ZXM9JHthcmdzLm1heEJ5dGVzfSBlbWl0dGVkPSR7YXJncy5lbWl0dGVkfSBkcm9wcGVkPSR7YXJncy5kcm9wcGVkfSBkb3duZ3JhZGVkPSR7YXJncy5kb3duZ3JhZGVkfWAsXG4gIH0sXG59KVxuXG5leHBvcnQgY29uc3QgYXBwbHlQcm9jZXNzUnVuRXZlbnRCdWRnZXQgPSAoXG4gIHN0YXRlOiBQcm9jZXNzUnVuRXZlbnRCdWRnZXRTdGF0ZSxcbiAgZXZlbnQ6IFByb2Nlc3NFdmVudCxcbik6IHJlYWRvbmx5IFtQcm9jZXNzUnVuRXZlbnRCdWRnZXREZWNpc2lvbiwgUHJvY2Vzc1J1bkV2ZW50QnVkZ2V0U3RhdGVdID0+IHtcbiAgY29uc3QgbWF4RXZlbnRzID0gTWF0aC5tYXgoMCwgc3RhdGUubWF4RXZlbnRzKVxuICBjb25zdCBtYXhCeXRlcyA9IE1hdGgubWF4KDAsIHN0YXRlLm1heEJ5dGVzKVxuXG4gIGlmIChzdGF0ZS5zdW1tYXJ5RW1pdHRlZCkge1xuICAgIHJldHVybiBbXG4gICAgICB7IF90YWc6ICdkcm9wJyB9LFxuICAgICAge1xuICAgICAgICAuLi5zdGF0ZSxcbiAgICAgICAgZHJvcHBlZDogc3RhdGUuZHJvcHBlZCArIDEsXG4gICAgICB9LFxuICAgIF1cbiAgfVxuXG4gIGNvbnN0IHJlc2VydmUgPSBQUk9DRVNTX0VWRU5UX1JFU0VSVkVEX0VWRU5UU19GT1JfU1VNTUFSWVxuICBjb25zdCBhbGxvd2VkUmVndWxhciA9IE1hdGgubWF4KDAsIG1heEV2ZW50cyAtIHJlc2VydmUpXG5cbiAgaWYgKHN0YXRlLmVtaXR0ZWQgPCBhbGxvd2VkUmVndWxhcikge1xuICAgIGNvbnN0IGVuZm9yY2VkID0gZW5mb3JjZVByb2Nlc3NFdmVudE1heEJ5dGVzKGV2ZW50LCB7IG1heEJ5dGVzIH0pXG4gICAgcmV0dXJuIFtcbiAgICAgIHsgX3RhZzogJ2VtaXQnLCBldmVudDogZW5mb3JjZWQuZXZlbnQgfSxcbiAgICAgIHtcbiAgICAgICAgLi4uc3RhdGUsXG4gICAgICAgIGVtaXR0ZWQ6IHN0YXRlLmVtaXR0ZWQgKyAxLFxuICAgICAgICBkb3duZ3JhZGVkOiBzdGF0ZS5kb3duZ3JhZGVkICsgKGVuZm9yY2VkLmRvd25ncmFkZWQgPyAxIDogMCksXG4gICAgICB9LFxuICAgIF1cbiAgfVxuXG4gIGNvbnN0IGRyb3BwZWQgPSBzdGF0ZS5kcm9wcGVkICsgMVxuICBjb25zdCBzdW1tYXJ5ID0gbWFrZUJ1ZGdldFN1bW1hcnlFdmVudCh7XG4gICAgc291cmNlRXZlbnQ6IGV2ZW50LFxuICAgIG1heEV2ZW50cyxcbiAgICBtYXhCeXRlcyxcbiAgICBlbWl0dGVkOiBzdGF0ZS5lbWl0dGVkLFxuICAgIGRyb3BwZWQsXG4gICAgZG93bmdyYWRlZDogc3RhdGUuZG93bmdyYWRlZCxcbiAgfSlcbiAgY29uc3QgZW5mb3JjZWRTdW1tYXJ5ID0gZW5mb3JjZVByb2Nlc3NFdmVudE1heEJ5dGVzKHN1bW1hcnksIHsgbWF4Qnl0ZXMgfSlcblxuICByZXR1cm4gW1xuICAgIHsgX3RhZzogJ2VtaXRTdW1tYXJ5JywgZXZlbnQ6IGVuZm9yY2VkU3VtbWFyeS5ldmVudCB9LFxuICAgIHtcbiAgICAgIC4uLnN0YXRlLFxuICAgICAgZW1pdHRlZDogTWF0aC5taW4obWF4RXZlbnRzLCBzdGF0ZS5lbWl0dGVkICsgMSksXG4gICAgICBkcm9wcGVkLFxuICAgICAgZG93bmdyYWRlZDogc3RhdGUuZG93bmdyYWRlZCArIChlbmZvcmNlZFN1bW1hcnkuZG93bmdyYWRlZCA/IDEgOiAwKSxcbiAgICAgIHN1bW1hcnlFbWl0dGVkOiB0cnVlLFxuICAgIH0sXG4gIF1cbn1cblxuZXhwb3J0IGNvbnN0IGVzdGltYXRlRXZlbnRCeXRlcyA9IChldmVudDogUHJvY2Vzc0V2ZW50KTogbnVtYmVyID0+IHtcbiAgY29uc3QganNvbiA9IEpTT04uc3RyaW5naWZ5KGV2ZW50KVxuICByZXR1cm4gdHlwZW9mIEJ1ZmZlciAhPT0gJ3VuZGVmaW5lZCcgPyBCdWZmZXIuYnl0ZUxlbmd0aChqc29uLCAndXRmOCcpIDogbmV3IFRleHRFbmNvZGVyKCkuZW5jb2RlKGpzb24pLmxlbmd0aFxufVxuXG5jb25zdCB0cnVuY2F0ZUNoYXJzID0gKHZhbHVlOiBzdHJpbmcsIG1heExlbjogbnVtYmVyKTogc3RyaW5nID0+XG4gIHZhbHVlLmxlbmd0aCA8PSBtYXhMZW4gPyB2YWx1ZSA6IHZhbHVlLnNsaWNlKDAsIG1heExlbilcblxuY29uc3Qgbm9ybWFsaXplRXJyb3JTdW1tYXJ5ID0gKGVycm9yOiBOb25OdWxsYWJsZTxQcm9jZXNzRXZlbnRbJ2Vycm9yJ10+KTogTm9uTnVsbGFibGU8UHJvY2Vzc0V2ZW50WydlcnJvciddPiA9PiB7XG4gIGNvbnN0IG1lc3NhZ2UgPSB0eXBlb2YgZXJyb3IubWVzc2FnZSA9PT0gJ3N0cmluZycgJiYgZXJyb3IubWVzc2FnZS5sZW5ndGggPiAwID8gZXJyb3IubWVzc2FnZSA6ICdFcnJvcidcblxuICBjb25zdCBoaW50ID0gdHlwZW9mIGVycm9yLmhpbnQgPT09ICdzdHJpbmcnICYmIGVycm9yLmhpbnQubGVuZ3RoID4gMCA/IHRydW5jYXRlQ2hhcnMoZXJyb3IuaGludCwgMTAyNCkgOiB1bmRlZmluZWRcblxuICByZXR1cm4ge1xuICAgIG5hbWU6IHR5cGVvZiBlcnJvci5uYW1lID09PSAnc3RyaW5nJyAmJiBlcnJvci5uYW1lLmxlbmd0aCA+IDAgPyBlcnJvci5uYW1lIDogdW5kZWZpbmVkLFxuICAgIG1lc3NhZ2U6IHRydW5jYXRlQ2hhcnMobWVzc2FnZSwgMjU2KSxcbiAgICBjb2RlOiB0eXBlb2YgZXJyb3IuY29kZSA9PT0gJ3N0cmluZycgJiYgZXJyb3IuY29kZS5sZW5ndGggPiAwID8gZXJyb3IuY29kZSA6IHVuZGVmaW5lZCxcbiAgICBoaW50LFxuICB9XG59XG5cbmV4cG9ydCBjb25zdCBlbmZvcmNlUHJvY2Vzc0V2ZW50TWF4Qnl0ZXMgPSAoXG4gIGV2ZW50OiBQcm9jZXNzRXZlbnQsXG4gIG9wdGlvbnM/OiB7XG4gICAgcmVhZG9ubHkgbWF4Qnl0ZXM/OiBudW1iZXJcbiAgfSxcbik6IHsgcmVhZG9ubHkgZXZlbnQ6IFByb2Nlc3NFdmVudDsgcmVhZG9ubHkgZG93bmdyYWRlZDogYm9vbGVhbiB9ID0+IHtcbiAgY29uc3QgbWF4Qnl0ZXMgPSBvcHRpb25zPy5tYXhCeXRlcyA/PyBQUk9DRVNTX0VWRU5UX01BWF9CWVRFU1xuXG4gIGxldCBkb3duZ3JhZGVkID0gZmFsc2VcbiAgbGV0IG5leHQ6IFByb2Nlc3NFdmVudCA9IGV2ZW50XG5cbiAgaWYgKGV2ZW50LmVycm9yKSB7XG4gICAgY29uc3Qgbm9ybWFsaXplZCA9IG5vcm1hbGl6ZUVycm9yU3VtbWFyeShldmVudC5lcnJvcilcbiAgICBpZiAoXG4gICAgICBub3JtYWxpemVkLm1lc3NhZ2UgIT09IGV2ZW50LmVycm9yLm1lc3NhZ2UgfHxcbiAgICAgIG5vcm1hbGl6ZWQuaGludCAhPT0gZXZlbnQuZXJyb3IuaGludCB8fFxuICAgICAgbm9ybWFsaXplZC5jb2RlICE9PSBldmVudC5lcnJvci5jb2RlIHx8XG4gICAgICBub3JtYWxpemVkLm5hbWUgIT09IGV2ZW50LmVycm9yLm5hbWVcbiAgICApIHtcbiAgICAgIGRvd25ncmFkZWQgPSB0cnVlXG4gICAgICBuZXh0ID0geyAuLi5ldmVudCwgZXJyb3I6IG5vcm1hbGl6ZWQgfVxuICAgIH1cbiAgfVxuXG4gIGlmIChlc3RpbWF0ZUV2ZW50Qnl0ZXMobmV4dCkgPD0gbWF4Qnl0ZXMpIHtcbiAgICByZXR1cm4geyBldmVudDogbmV4dCwgZG93bmdyYWRlZCB9XG4gIH1cblxuICAvLyBGdXJ0aGVyIHRyaW1taW5nIGlzIGFwcGxpZWQgdG8gZXJyb3IuaGludCBvbmx5IChjb21tb24gdHJpZ2dlcjogbXVsdGktbGluZSBoaW50cykuXG4gIGlmICghbmV4dC5lcnJvcj8uaGludCkge1xuICAgIC8vIE5vdGhpbmcgbGVmdCB0byB0cmltOyBiZXN0LWVmZm9ydCByZXR1cm4uXG4gICAgcmV0dXJuIHsgZXZlbnQ6IG5leHQsIGRvd25ncmFkZWQ6IHRydWUgfVxuICB9XG5cbiAgY29uc3QgaGludCA9IG5leHQuZXJyb3IuaGludFxuICBjb25zdCBzdGVwcyA9IFs1MTIsIDI1NiwgMTI4LCA2NCwgMzIsIDBdXG5cbiAgZm9yIChjb25zdCBtYXhMZW4gb2Ygc3RlcHMpIHtcbiAgICBjb25zdCB0cmltbWVkID0gbWF4TGVuID09PSAwID8gdW5kZWZpbmVkIDogdHJ1bmNhdGVDaGFycyhoaW50LCBtYXhMZW4pXG4gICAgY29uc3QgY2FuZGlkYXRlOiBQcm9jZXNzRXZlbnQgPSB7XG4gICAgICAuLi5uZXh0LFxuICAgICAgZXJyb3I6IHtcbiAgICAgICAgLi4ubmV4dC5lcnJvcixcbiAgICAgICAgaGludDogdHJpbW1lZCxcbiAgICAgIH0sXG4gICAgfVxuICAgIGlmIChlc3RpbWF0ZUV2ZW50Qnl0ZXMoY2FuZGlkYXRlKSA8PSBtYXhCeXRlcykge1xuICAgICAgcmV0dXJuIHsgZXZlbnQ6IGNhbmRpZGF0ZSwgZG93bmdyYWRlZDogdHJ1ZSB9XG4gICAgfVxuICB9XG5cbiAgLy8gRmFsbGJhY2s6IHJlbW92ZSBoaW50IGFuZCBzaG9ydGVuIG1lc3NhZ2UgKHByb2Nlc3M6ZXJyb3IgbXVzdCBzdGlsbCBoYXZlIGEgbWVzc2FnZSkuXG4gIGNvbnN0IGZhbGxiYWNrOiBQcm9jZXNzRXZlbnQgPSBuZXh0LmVycm9yXG4gICAgPyAoe1xuICAgICAgICAuLi5uZXh0LFxuICAgICAgICBlcnJvcjoge1xuICAgICAgICAgIC4uLm5leHQuZXJyb3IsXG4gICAgICAgICAgbWVzc2FnZTogdHJ1bmNhdGVDaGFycyhuZXh0LmVycm9yLm1lc3NhZ2UsIDk2KSxcbiAgICAgICAgICBoaW50OiB1bmRlZmluZWQsXG4gICAgICAgIH0sXG4gICAgICB9IHNhdGlzZmllcyBQcm9jZXNzRXZlbnQpXG4gICAgOiBuZXh0XG5cbiAgcmV0dXJuIHsgZXZlbnQ6IGZhbGxiYWNrLCBkb3duZ3JhZGVkOiB0cnVlIH1cbn1cbiIsICJpbXBvcnQgKiBhcyBTY2hlbWFBU1QgZnJvbSAnZWZmZWN0L1NjaGVtYUFTVCdcblxuZXhwb3J0IHR5cGUgRG90UGF0aFNlZ21lbnQgPSBzdHJpbmcgfCBudW1iZXJcblxudHlwZSBEb3RQYXRoUGFyc2VSZXN1bHQgPVxuICB8IHsgcmVhZG9ubHkgb2s6IHRydWU7IHJlYWRvbmx5IHNlZ21lbnRzOiBSZWFkb25seUFycmF5PERvdFBhdGhTZWdtZW50PiB9XG4gIHwgeyByZWFkb25seSBvazogZmFsc2U7IHJlYWRvbmx5IGVycm9yOiBFcnJvciB9XG5cbmV4cG9ydCB0eXBlIERvdFBhdGhTZWxlY3RvclJlc3VsdCA9XG4gIHwge1xuICAgICAgcmVhZG9ubHkgb2s6IHRydWVcbiAgICAgIHJlYWRvbmx5IHNlbGVjdG9yOiAoc3RhdGU6IHVua25vd24pID0+IHVua25vd25cbiAgICAgIHJlYWRvbmx5IHNlZ21lbnRzOiBSZWFkb25seUFycmF5PERvdFBhdGhTZWdtZW50PlxuICAgIH1cbiAgfCB7IHJlYWRvbmx5IG9rOiBmYWxzZTsgcmVhZG9ubHkgZXJyb3I6IEVycm9yIH1cblxuY29uc3QgaXNSZWNvcmQgPSAodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9PiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIHZhbHVlICE9PSBudWxsXG5cbmV4cG9ydCBjb25zdCByZXNvbHZlU2NoZW1hQXN0ID0gKHNjaGVtYTogdW5rbm93bik6IFNjaGVtYUFTVC5BU1QgfCB1bmRlZmluZWQgPT4ge1xuICBpZiAoIWlzUmVjb3JkKHNjaGVtYSkpIHJldHVybiB1bmRlZmluZWRcbiAgY29uc3QgYXN0ID0gKHNjaGVtYSBhcyBhbnkpLmFzdCBhcyBTY2hlbWFBU1QuQVNUIHwgdW5kZWZpbmVkXG4gIGlmICghYXN0KSByZXR1cm4gdW5kZWZpbmVkXG4gIGlmICh0eXBlb2YgYXN0ICE9PSAnb2JqZWN0JyAmJiB0eXBlb2YgYXN0ICE9PSAnZnVuY3Rpb24nKSByZXR1cm4gdW5kZWZpbmVkXG4gIHJldHVybiBhc3Rcbn1cblxuY29uc3QgbWFrZURvdFBhdGhFcnJvciA9IChwYXRoOiBzdHJpbmcsIG1lc3NhZ2U6IHN0cmluZywgaGludD86IHN0cmluZyk6IEVycm9yID0+IHtcbiAgY29uc3QgZXJyID0gbmV3IEVycm9yKG1lc3NhZ2UpXG4gIDsoZXJyIGFzIGFueSkuY29kZSA9ICdwcm9jZXNzOjppbnZhbGlkX2RvdF9wYXRoJ1xuICA7KGVyciBhcyBhbnkpLmhpbnQgPVxuICAgIGhpbnQgPz9cbiAgICBbXG4gICAgICBcIkV4cGVjdGVkIGRvdC1wYXRoIHN5bnRheDogc2VnbWVudHMgc2VwYXJhdGVkIGJ5ICcuJywgbnVtZXJpYyBzZWdtZW50cyByZXByZXNlbnQgYXJyYXkgaW5kaWNlcy5cIixcbiAgICAgIGBwYXRoOiAke3BhdGh9YCxcbiAgICAgICcnLFxuICAgICAgJ2V4YW1wbGVzOicsXG4gICAgICAnLSBjb3VudCcsXG4gICAgICAnLSB1c2VyLm5hbWUnLFxuICAgICAgJy0gaXRlbXMuMC5pZCcsXG4gICAgXS5qb2luKCdcXG4nKVxuICByZXR1cm4gZXJyXG59XG5cbmNvbnN0IG1ha2VTY2hlbWFNaXNtYXRjaEVycm9yID0gKHBhdGg6IHN0cmluZyk6IEVycm9yID0+XG4gIG1ha2VEb3RQYXRoRXJyb3IoXG4gICAgcGF0aCxcbiAgICAnSW52YWxpZCBkb3QtcGF0aDogcGF0aCBkb2VzIG5vdCBtYXRjaCB0aGUgc3RhdGUgc2NoZW1hLicsXG4gICAgW1xuICAgICAgJ1RoZSBtb2R1bGUgc3RhdGUgc2NoZW1hIGRvZXMgbm90IGNvbnRhaW4gdGhlIHJlcXVlc3RlZCBkb3QtcGF0aC4nLFxuICAgICAgYHBhdGg6ICR7cGF0aH1gLFxuICAgICAgJycsXG4gICAgICAnZml4OicsXG4gICAgICAnLSBFbnN1cmUgdGhlIHBhdGggZXhpc3RzIGluIHRoZSBzdGF0ZSBzY2hlbWEuJyxcbiAgICAgICctIFVzZSBudW1lcmljIHNlZ21lbnRzIGZvciBhcnJheSBpbmRpY2VzIChlLmcuIGl0ZW1zLjAuaWQpLicsXG4gICAgXS5qb2luKCdcXG4nKSxcbiAgKVxuXG5jb25zdCBwYXJzZURvdFBhdGggPSAocGF0aDogc3RyaW5nKTogRG90UGF0aFBhcnNlUmVzdWx0ID0+IHtcbiAgaWYgKHR5cGVvZiBwYXRoICE9PSAnc3RyaW5nJyB8fCBwYXRoLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiB7IG9rOiBmYWxzZSwgZXJyb3I6IG1ha2VEb3RQYXRoRXJyb3IoU3RyaW5nKHBhdGgpLCAnZG90LXBhdGggbXVzdCBiZSBhIG5vbi1lbXB0eSBzdHJpbmcnKSB9XG4gIH1cblxuICBjb25zdCByYXcgPSBwYXRoLnNwbGl0KCcuJylcbiAgaWYgKHJhdy5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4geyBvazogZmFsc2UsIGVycm9yOiBtYWtlRG90UGF0aEVycm9yKHBhdGgsICdkb3QtcGF0aCBtdXN0IGNvbnRhaW4gYXQgbGVhc3Qgb25lIHNlZ21lbnQnKSB9XG4gIH1cblxuICBjb25zdCBzZWdtZW50czogRG90UGF0aFNlZ21lbnRbXSA9IFtdXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgcmF3Lmxlbmd0aDsgaSsrKSB7XG4gICAgY29uc3Qgc2VnID0gcmF3W2ldIVxuICAgIGlmIChzZWcubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBvazogZmFsc2UsXG4gICAgICAgIGVycm9yOiBtYWtlRG90UGF0aEVycm9yKFxuICAgICAgICAgIHBhdGgsXG4gICAgICAgICAgYEludmFsaWQgZG90LXBhdGg6IGVtcHR5IHNlZ21lbnQgYXQgaW5kZXggJHtpfS5gLFxuICAgICAgICAgIFtcbiAgICAgICAgICAgIFwiRXhwZWN0ZWQgZG90LXBhdGggc3ludGF4OiBzZWdtZW50cyBzZXBhcmF0ZWQgYnkgJy4nLCBudW1lcmljIHNlZ21lbnRzIHJlcHJlc2VudCBhcnJheSBpbmRpY2VzLlwiLFxuICAgICAgICAgICAgYHBhdGg6ICR7cGF0aH1gLFxuICAgICAgICAgICAgJycsXG4gICAgICAgICAgICAnZXhhbXBsZXM6JyxcbiAgICAgICAgICAgICctIGNvdW50JyxcbiAgICAgICAgICAgICctIHVzZXIubmFtZScsXG4gICAgICAgICAgICAnLSBpdGVtcy4wLmlkJyxcbiAgICAgICAgICAgICcnLFxuICAgICAgICAgICAgJ2ZpeDonLFxuICAgICAgICAgICAgJy0gUmVtb3ZlIGNvbnNlY3V0aXZlIGRvdHMgb3IgdHJhaWxpbmcgZG90cy4nLFxuICAgICAgICAgIF0uam9pbignXFxuJyksXG4gICAgICAgICksXG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKC9eWzAtOV0rJC8udGVzdChzZWcpKSB7XG4gICAgICBjb25zdCBuID0gTnVtYmVyKHNlZylcbiAgICAgIGlmICghTnVtYmVyLmlzRmluaXRlKG4pIHx8IG4gPCAwKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgb2s6IGZhbHNlLFxuICAgICAgICAgIGVycm9yOiBtYWtlRG90UGF0aEVycm9yKHBhdGgsIGBJbnZhbGlkIGFycmF5IGluZGV4IHNlZ21lbnQgXCIke3NlZ31cIiBhdCBpbmRleCAke2l9LmApLFxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBzZWdtZW50cy5wdXNoKE1hdGguZmxvb3IobikpXG4gICAgICBjb250aW51ZVxuICAgIH1cblxuICAgIHNlZ21lbnRzLnB1c2goc2VnKVxuICB9XG5cbiAgcmV0dXJuIHsgb2s6IHRydWUsIHNlZ21lbnRzIH1cbn1cblxuY29uc3QgcmVzb2x2ZUFzdEZvclBhdGggPSAoXG4gIGFzdDogU2NoZW1hQVNULkFTVCxcbiAgc2VnbWVudHM6IFJlYWRvbmx5QXJyYXk8RG90UGF0aFNlZ21lbnQ+LFxuICBzZWVuOiBTZXQ8U2NoZW1hQVNULkFTVD4sXG4pOiBTY2hlbWFBU1QuQVNUIHwgdW5kZWZpbmVkID0+IHtcbiAgaWYgKHNlZ21lbnRzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIGFzdFxuXG4gIGxldCBjdXJyZW50ID0gYXN0XG4gIHdoaWxlICh0cnVlKSB7XG4gICAgaWYgKFNjaGVtYUFTVC5pc1N1c3BlbmQoY3VycmVudCkpIHtcbiAgICAgIGlmIChzZWVuLmhhcyhjdXJyZW50KSkgcmV0dXJuIHVuZGVmaW5lZFxuICAgICAgc2Vlbi5hZGQoY3VycmVudClcbiAgICAgIGN1cnJlbnQgPSBjdXJyZW50LmYoKVxuICAgICAgY29udGludWVcbiAgICB9XG4gICAgaWYgKFNjaGVtYUFTVC5pc1JlZmluZW1lbnQoY3VycmVudCkpIHtcbiAgICAgIGN1cnJlbnQgPSBjdXJyZW50LmZyb21cbiAgICAgIGNvbnRpbnVlXG4gICAgfVxuICAgIGJyZWFrXG4gIH1cblxuICBpZiAoU2NoZW1hQVNULmlzVHJhbnNmb3JtYXRpb24oY3VycmVudCkpIHtcbiAgICBjb25zdCBmcm9tID0gcmVzb2x2ZUFzdEZvclBhdGgoY3VycmVudC5mcm9tLCBzZWdtZW50cywgc2VlbilcbiAgICBpZiAoZnJvbSkgcmV0dXJuIGZyb21cbiAgICByZXR1cm4gcmVzb2x2ZUFzdEZvclBhdGgoY3VycmVudC50bywgc2VnbWVudHMsIHNlZW4pXG4gIH1cblxuICBpZiAoU2NoZW1hQVNULmlzVW5pb24oY3VycmVudCkpIHtcbiAgICBmb3IgKGNvbnN0IG5vZGUgb2YgY3VycmVudC50eXBlcykge1xuICAgICAgY29uc3QgcmVzb2x2ZWQgPSByZXNvbHZlQXN0Rm9yUGF0aChub2RlLCBzZWdtZW50cywgc2VlbilcbiAgICAgIGlmIChyZXNvbHZlZCkgcmV0dXJuIHJlc29sdmVkXG4gICAgfVxuICAgIHJldHVybiB1bmRlZmluZWRcbiAgfVxuXG4gIGlmIChTY2hlbWFBU1QuaXNUdXBsZVR5cGUoY3VycmVudCkpIHtcbiAgICBjb25zdCBbaGVhZCwgLi4udGFpbF0gPSBzZWdtZW50c1xuICAgIGlmICh0eXBlb2YgaGVhZCAhPT0gJ251bWJlcicpIHJldHVybiB1bmRlZmluZWRcbiAgICBjb25zdCBlbGVtZW50ID1cbiAgICAgIGhlYWQgPCBjdXJyZW50LmVsZW1lbnRzLmxlbmd0aCA/IGN1cnJlbnQuZWxlbWVudHNbaGVhZF0gOiBjdXJyZW50LnJlc3QubGVuZ3RoID4gMCA/IGN1cnJlbnQucmVzdFswXSA6IHVuZGVmaW5lZFxuICAgIHJldHVybiBlbGVtZW50ID8gcmVzb2x2ZUFzdEZvclBhdGgoZWxlbWVudC50eXBlLCB0YWlsLCBzZWVuKSA6IHVuZGVmaW5lZFxuICB9XG5cbiAgaWYgKFNjaGVtYUFTVC5pc1R5cGVMaXRlcmFsKGN1cnJlbnQpKSB7XG4gICAgY29uc3QgW2hlYWQsIC4uLnRhaWxdID0gc2VnbWVudHNcbiAgICBpZiAoaGVhZCA9PT0gdW5kZWZpbmVkKSByZXR1cm4gdW5kZWZpbmVkXG5cbiAgICBpZiAodHlwZW9mIGhlYWQgPT09ICdzdHJpbmcnKSB7XG4gICAgICBmb3IgKGNvbnN0IHBzIG9mIGN1cnJlbnQucHJvcGVydHlTaWduYXR1cmVzKSB7XG4gICAgICAgIGlmIChTdHJpbmcocHMubmFtZSkgIT09IGhlYWQpIGNvbnRpbnVlXG4gICAgICAgIHJldHVybiByZXNvbHZlQXN0Rm9yUGF0aChwcy50eXBlLCB0YWlsLCBzZWVuKVxuICAgICAgfVxuICAgIH1cblxuICAgIGZvciAoY29uc3Qgc2lnIG9mIGN1cnJlbnQuaW5kZXhTaWduYXR1cmVzKSB7XG4gICAgICBsZXQgcGFyYW06IFNjaGVtYUFTVC5BU1QgPSBzaWcucGFyYW1ldGVyIGFzIHVua25vd24gYXMgU2NoZW1hQVNULkFTVFxuICAgICAgd2hpbGUgKFNjaGVtYUFTVC5pc1JlZmluZW1lbnQocGFyYW0pKSB7XG4gICAgICAgIHBhcmFtID0gcGFyYW0uZnJvbVxuICAgICAgfVxuICAgICAgY29uc3QgdGFnID0gKHBhcmFtIGFzIGFueSk/Ll90YWdcbiAgICAgIGNvbnN0IGFjY2VwdHNTdHJpbmcgPSB0YWcgPT09ICdTdHJpbmdLZXl3b3JkJyB8fCB0YWcgPT09ICdUZW1wbGF0ZUxpdGVyYWwnXG4gICAgICBjb25zdCBhY2NlcHRzTnVtYmVyID0gdGFnID09PSAnTnVtYmVyS2V5d29yZCdcbiAgICAgIGlmICh0eXBlb2YgaGVhZCA9PT0gJ3N0cmluZycgJiYgYWNjZXB0c1N0cmluZykge1xuICAgICAgICByZXR1cm4gcmVzb2x2ZUFzdEZvclBhdGgoc2lnLnR5cGUsIHRhaWwsIHNlZW4pXG4gICAgICB9XG4gICAgICBpZiAodHlwZW9mIGhlYWQgPT09ICdudW1iZXInICYmIGFjY2VwdHNOdW1iZXIpIHtcbiAgICAgICAgcmV0dXJuIHJlc29sdmVBc3RGb3JQYXRoKHNpZy50eXBlLCB0YWlsLCBzZWVuKVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGNvbnN0IHRhZyA9IChjdXJyZW50IGFzIGFueSk/Ll90YWdcbiAgaWYgKHRhZyA9PT0gJ0FueUtleXdvcmQnIHx8IHRhZyA9PT0gJ1Vua25vd25LZXl3b3JkJyB8fCB0YWcgPT09ICdPYmplY3RLZXl3b3JkJyB8fCB0YWcgPT09ICdEZWNsYXJhdGlvbicpIHtcbiAgICByZXR1cm4gY3VycmVudFxuICB9XG5cbiAgcmV0dXJuIHVuZGVmaW5lZFxufVxuXG5jb25zdCBzZWxlY3RCeVNlZ21lbnRzID1cbiAgKHNlZ21lbnRzOiBSZWFkb25seUFycmF5PERvdFBhdGhTZWdtZW50PikgPT5cbiAgKHN0YXRlOiB1bmtub3duKTogdW5rbm93biA9PiB7XG4gICAgbGV0IGN1cnJlbnQ6IHVua25vd24gPSBzdGF0ZVxuICAgIGZvciAoY29uc3Qgc2VnIG9mIHNlZ21lbnRzKSB7XG4gICAgICBpZiAoY3VycmVudCA9PSBudWxsKSByZXR1cm4gdW5kZWZpbmVkXG4gICAgICBpZiAodHlwZW9mIHNlZyA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoY3VycmVudCkpIHtcbiAgICAgICAgICBjdXJyZW50ID0gY3VycmVudFtzZWddXG4gICAgICAgICAgY29udGludWVcbiAgICAgICAgfVxuICAgICAgICBpZiAoaXNSZWNvcmQoY3VycmVudCkpIHtcbiAgICAgICAgICBjdXJyZW50ID0gY3VycmVudFtTdHJpbmcoc2VnKV1cbiAgICAgICAgICBjb250aW51ZVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB1bmRlZmluZWRcbiAgICAgIH1cbiAgICAgIGlmIChpc1JlY29yZChjdXJyZW50KSkge1xuICAgICAgICBjdXJyZW50ID0gY3VycmVudFtzZWddXG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG4gICAgICByZXR1cm4gdW5kZWZpbmVkXG4gICAgfVxuICAgIHJldHVybiBjdXJyZW50XG4gIH1cblxuZXhwb3J0IGNvbnN0IG1ha2VTY2hlbWFTZWxlY3RvciA9IChwYXRoOiBzdHJpbmcsIHNjaGVtYUFzdD86IFNjaGVtYUFTVC5BU1QpOiBEb3RQYXRoU2VsZWN0b3JSZXN1bHQgPT4ge1xuICBjb25zdCBwYXJzZWQgPSBwYXJzZURvdFBhdGgocGF0aClcbiAgaWYgKCFwYXJzZWQub2spIHJldHVybiB7IG9rOiBmYWxzZSwgZXJyb3I6IHBhcnNlZC5lcnJvciB9XG5cbiAgaWYgKHNjaGVtYUFzdCkge1xuICAgIGNvbnN0IHJlc29sdmVkID0gcmVzb2x2ZUFzdEZvclBhdGgoc2NoZW1hQXN0LCBwYXJzZWQuc2VnbWVudHMsIG5ldyBTZXQoKSlcbiAgICBpZiAoIXJlc29sdmVkKSB7XG4gICAgICByZXR1cm4geyBvazogZmFsc2UsIGVycm9yOiBtYWtlU2NoZW1hTWlzbWF0Y2hFcnJvcihwYXRoKSB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBvazogdHJ1ZSxcbiAgICBzZWxlY3Rvcjogc2VsZWN0QnlTZWdtZW50cyhwYXJzZWQuc2VnbWVudHMpLFxuICAgIHNlZ21lbnRzOiBwYXJzZWQuc2VnbWVudHMsXG4gIH1cbn1cbiIsICJpbXBvcnQgdHlwZSB7IFByb2Nlc3NFcnJvclBvbGljeSB9IGZyb20gJy4vcHJvdG9jb2wuanMnXG5cbmV4cG9ydCB0eXBlIFN1cGVydmlzaW9uRGVjaXNpb24gPSAnc3RvcCcgfCAncmVzdGFydCdcblxuZXhwb3J0IHR5cGUgU3VwZXJ2aXNpb25TdGF0ZSA9IHtcbiAgcmVhZG9ubHkgZmFpbHVyZVRpbWVzOiBSZWFkb25seUFycmF5PG51bWJlcj5cbn1cblxuZXhwb3J0IGNvbnN0IGluaXRpYWxTdGF0ZSA9ICgpOiBTdXBlcnZpc2lvblN0YXRlID0+ICh7IGZhaWx1cmVUaW1lczogW10gfSlcblxuZXhwb3J0IHR5cGUgRmFpbHVyZURlY2lzaW9uID0ge1xuICByZWFkb25seSBkZWNpc2lvbjogU3VwZXJ2aXNpb25EZWNpc2lvblxuICByZWFkb25seSBuZXh0U3RhdGU6IFN1cGVydmlzaW9uU3RhdGVcbiAgcmVhZG9ubHkgd2l0aGluV2luZG93RmFpbHVyZXM6IG51bWJlclxuICByZWFkb25seSBtYXhSZXN0YXJ0czogbnVtYmVyXG4gIHJlYWRvbmx5IHdpbmRvd01zPzogbnVtYmVyXG59XG5cbmV4cG9ydCBjb25zdCBvbkZhaWx1cmUgPSAocG9saWN5OiBQcm9jZXNzRXJyb3JQb2xpY3ksIHN0YXRlOiBTdXBlcnZpc2lvblN0YXRlLCBub3dNczogbnVtYmVyKTogRmFpbHVyZURlY2lzaW9uID0+IHtcbiAgaWYgKHBvbGljeS5tb2RlID09PSAnZmFpbFN0b3AnKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGRlY2lzaW9uOiAnc3RvcCcsXG4gICAgICBuZXh0U3RhdGU6IHN0YXRlLFxuICAgICAgd2l0aGluV2luZG93RmFpbHVyZXM6IHN0YXRlLmZhaWx1cmVUaW1lcy5sZW5ndGgsXG4gICAgICBtYXhSZXN0YXJ0czogMCxcbiAgICAgIHdpbmRvd01zOiBwb2xpY3kud2luZG93TXMsXG4gICAgfVxuICB9XG5cbiAgY29uc3QgbWF4UmVzdGFydHNSYXcgPSBwb2xpY3kubWF4UmVzdGFydHNcbiAgY29uc3QgbWF4UmVzdGFydHMgPVxuICAgIHR5cGVvZiBtYXhSZXN0YXJ0c1JhdyA9PT0gJ251bWJlcicgJiYgTnVtYmVyLmlzRmluaXRlKG1heFJlc3RhcnRzUmF3KSAmJiBtYXhSZXN0YXJ0c1JhdyA+PSAwXG4gICAgICA/IE1hdGguZmxvb3IobWF4UmVzdGFydHNSYXcpXG4gICAgICA6IDBcblxuICBpZiAobWF4UmVzdGFydHMgPD0gMCkge1xuICAgIHJldHVybiB7XG4gICAgICBkZWNpc2lvbjogJ3N0b3AnLFxuICAgICAgbmV4dFN0YXRlOiBzdGF0ZSxcbiAgICAgIHdpdGhpbldpbmRvd0ZhaWx1cmVzOiBzdGF0ZS5mYWlsdXJlVGltZXMubGVuZ3RoLFxuICAgICAgbWF4UmVzdGFydHMsXG4gICAgICB3aW5kb3dNczogcG9saWN5LndpbmRvd01zLFxuICAgIH1cbiAgfVxuXG4gIGNvbnN0IHdpbmRvd01zUmF3ID0gcG9saWN5LndpbmRvd01zXG4gIGNvbnN0IHdpbmRvd01zID1cbiAgICB0eXBlb2Ygd2luZG93TXNSYXcgPT09ICdudW1iZXInICYmIE51bWJlci5pc0Zpbml0ZSh3aW5kb3dNc1JhdykgJiYgd2luZG93TXNSYXcgPiAwXG4gICAgICA/IE1hdGguZmxvb3Iod2luZG93TXNSYXcpXG4gICAgICA6IHVuZGVmaW5lZFxuXG4gIGNvbnN0IGZhaWx1cmVUaW1lc1JhdyA9IFsuLi5zdGF0ZS5mYWlsdXJlVGltZXMsIG5vd01zXVxuICBjb25zdCBmYWlsdXJlVGltZXMgPSB3aW5kb3dNcyA/IGZhaWx1cmVUaW1lc1Jhdy5maWx0ZXIoKHQpID0+IHQgPj0gbm93TXMgLSB3aW5kb3dNcykgOiBmYWlsdXJlVGltZXNSYXdcblxuICAvLyBLZWVwIGF0IG1vc3QgbWF4UmVzdGFydHMrMSB0aW1lc3RhbXBzIHRvIGF2b2lkIHVuYm91bmRlZCBncm93dGguXG4gIGNvbnN0IGNhcCA9IG1heFJlc3RhcnRzICsgMVxuICBjb25zdCBjYXBwZWQgPSBmYWlsdXJlVGltZXMubGVuZ3RoID4gY2FwID8gZmFpbHVyZVRpbWVzLnNsaWNlKGZhaWx1cmVUaW1lcy5sZW5ndGggLSBjYXApIDogZmFpbHVyZVRpbWVzXG5cbiAgY29uc3Qgd2l0aGluV2luZG93RmFpbHVyZXMgPSBjYXBwZWQubGVuZ3RoXG4gIGNvbnN0IGRlY2lzaW9uOiBTdXBlcnZpc2lvbkRlY2lzaW9uID0gd2l0aGluV2luZG93RmFpbHVyZXMgPD0gbWF4UmVzdGFydHMgPyAncmVzdGFydCcgOiAnc3RvcCdcblxuICByZXR1cm4ge1xuICAgIGRlY2lzaW9uLFxuICAgIG5leHRTdGF0ZTogeyBmYWlsdXJlVGltZXM6IGNhcHBlZCB9LFxuICAgIHdpdGhpbldpbmRvd0ZhaWx1cmVzLFxuICAgIG1heFJlc3RhcnRzLFxuICAgIHdpbmRvd01zLFxuICB9XG59XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQWNPLElBQU0sZUFBZSx1QkFBTyxJQUFJLDJCQUEyQjtBQU1sRSxJQUFNLGVBQWUsQ0FBQyxRQUFnQixLQUFhLFVBQXlCO0FBQzFFLFNBQU8sZUFBZSxRQUFRLEtBQUs7QUFBQSxJQUNqQztBQUFBLElBQ0EsWUFBWTtBQUFBLElBQ1osY0FBYztBQUFBLElBQ2QsVUFBVTtBQUFBLEVBQ1osQ0FBQztBQUNIO0FBRU8sSUFBTSxVQUFVLENBQUMsV0FDckIsT0FBeUIsWUFBWTtBQUVqQyxJQUFNLGdCQUFnQixDQUFDLFdBQzVCLFFBQVEsTUFBTSxHQUFHO0FBRVosSUFB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T0FBTyxHQUFHO0FBQ3pDLFlBQUksU0FBUyxPQUFPO0FBQ2xCLGlCQUFPLGFBQWEsVUFBVSxlQUFlO0FBQUEsUUFDL0M7QUFBQSxNQUNGO0FBQUEsSUFDRixDQUFDLEVBQUU7QUFBQSxNQUNEQSxRQUFPO0FBQUEsUUFBYyxDQUFDLFVBQ3BCQSxRQUFPLEtBQUssTUFBTTtBQUVoQixjQUFJLFNBQVMsR0FBRztBQUVkLG9CQUFRLEtBQUsscUNBQXFDLE1BQU0sT0FBTyxLQUFLLENBQUM7QUFBQSxVQUN2RTtBQUFBLFFBQ0YsQ0FBQztBQUFBLE1BQ0g7QUFBQSxJQUNGO0FBQUEsRUFDRjtBQUVBLFNBQU87QUFBQSxJQUNMO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0EsUUFBUTtBQUFBLElBQ1I7QUFBQSxFQUNGO0FBQ0YsQ0FBQztBQUVJLElBQU0sUUFBUSxDQUFDLFlBQ3BCWSxPQUFNLE9BQU8sbUJBQW1CLEtBQUssT0FBTyxDQUFDOyIsCiAgIm5hbWVzIjogWyJDb250ZXh0IiwgIkVmZmVjdCIsICJGaWJlciIsICJGaWJlclJlZiIsICJMYXllciIsICJPcHRpb24iLCAiUmVmIiwgIlNjb3BlIiwgIlN0cmVhbSIsICJFZmZlY3QiLCAiRWZmZWN0IiwgIm9uVHJpZ2dlciIsICJuZXh0U2l6ZSIsICJpc1JlY29yZCIsICJ0YWciLCAiQ29udGV4dCIsICJGaWJlclJlZiIsICJFZmZlY3QiLCAiUmVmIiwgIk9wdGlvbiIsICJGaWJlciIsICJTY29wZSIsICJTdHJlYW0iLCAidGFnIiwgImZvdW5kIiwgInJ1bnRpbWUiLCAic3RyZWFtIiwgImluc3RhbGxhdGlvbiIsICJvcHRpb25zIiwgIkxheWVyIl0KfQo=