@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,255 @@
1
+ // @logix/core subpath bundles for @logix/sandbox
2
+
3
+ import {
4
+ makeEvidenceSink
5
+ } from "./chunk-RS5FFPUV.js";
6
+ import {
7
+ currentDiagnosticsLevel,
8
+ toRuntimeDebugEventRef
9
+ } from "./chunk-CVZPRIDB.js";
10
+ import {
11
+ projectJsonValue
12
+ } from "./chunk-RYSSJBGX.js";
13
+
14
+ // ../logix-core/src/internal/runtime/core/RuntimeKernel.ts
15
+ import { Context, Effect, Option } from "../effect.js";
16
+ var RuntimeServicesRuntimeConfigTagImpl = class extends Context.Tag(
17
+ "@logix/core/RuntimeServicesRuntimeConfig"
18
+ )() {
19
+ };
20
+ var RuntimeServicesRuntimeConfigTag = RuntimeServicesRuntimeConfigTagImpl;
21
+ var RuntimeServicesProviderOverridesTagImpl = class extends Context.Tag(
22
+ "@logix/core/RuntimeServicesProviderOverrides"
23
+ )() {
24
+ };
25
+ var RuntimeServicesProviderOverridesTag = RuntimeServicesProviderOverridesTagImpl;
26
+ var RuntimeServicesInstanceOverridesTagImpl = class extends Context.Tag(
27
+ "@logix/core/RuntimeServicesInstanceOverrides"
28
+ )() {
29
+ };
30
+ var RuntimeServicesInstanceOverridesTag = RuntimeServicesInstanceOverridesTagImpl;
31
+ var ORDERED_SCOPES = [
32
+ "builtin",
33
+ "runtime_default",
34
+ "runtime_module",
35
+ "provider",
36
+ "instance"
37
+ ];
38
+ var maxScope = (a, b) => {
39
+ const ai = ORDERED_SCOPES.indexOf(a);
40
+ const bi = ORDERED_SCOPES.indexOf(b);
41
+ return ai >= bi ? a : b;
42
+ };
43
+ var isPlainRecord = (value) => typeof value === "object" && value !== null && !Array.isArray(value);
44
+ var normalizeOverride = (value) => {
45
+ if (!isPlainRecord(value)) return void 0;
46
+ const implIdRaw = value.implId;
47
+ const notesRaw = value.notes;
48
+ return {
49
+ implId: typeof implIdRaw === "string" && implIdRaw.length > 0 ? implIdRaw : void 0,
50
+ notes: typeof notesRaw === "string" && notesRaw.length > 0 ? notesRaw : void 0
51
+ };
52
+ };
53
+ var resolveRuntimeServicesOverrides = (args) => Effect.gen(function* () {
54
+ const runtimeConfigOpt = yield* Effect.serviceOption(
55
+ RuntimeServicesRuntimeConfigTag
56
+ );
57
+ const providerOverridesOpt = yield* Effect.serviceOption(
58
+ RuntimeServicesProviderOverridesTag
59
+ );
60
+ const instanceOverridesOpt = yield* Effect.serviceOption(
61
+ RuntimeServicesInstanceOverridesTag
62
+ );
63
+ const runtimeConfig = Option.isSome(runtimeConfigOpt) ? runtimeConfigOpt.value : void 0;
64
+ const providerOverrides = Option.isSome(providerOverridesOpt) ? providerOverridesOpt.value : void 0;
65
+ const instanceOverrides = Option.isSome(instanceOverridesOpt) ? instanceOverridesOpt.value : void 0;
66
+ const moduleId = args.moduleId;
67
+ const runtimeModule = moduleId && runtimeConfig?.servicesByModuleId ? runtimeConfig.servicesByModuleId[moduleId] : void 0;
68
+ const providerModule = moduleId && providerOverrides?.servicesByModuleId ? providerOverrides.servicesByModuleId[moduleId] : void 0;
69
+ return {
70
+ runtimeDefault: runtimeConfig?.services,
71
+ runtimeModule,
72
+ provider: providerOverrides?.services,
73
+ providerModule,
74
+ instance: instanceOverrides
75
+ };
76
+ });
77
+ var selectRuntimeService = (serviceId, impls, overrides) => {
78
+ const builtin = impls[0];
79
+ if (!builtin) {
80
+ throw new Error(`[Logix] RuntimeKernel registry missing builtin impl for: ${serviceId}`);
81
+ }
82
+ let desired;
83
+ const consider = (scope, patch) => {
84
+ const next = patch ? normalizeOverride(patch[serviceId]) : void 0;
85
+ if (!next || !next.implId) return;
86
+ desired = { scope, override: next };
87
+ };
88
+ consider("runtime_default", overrides.runtimeDefault);
89
+ consider("runtime_module", overrides.runtimeModule);
90
+ consider("provider", overrides.provider);
91
+ consider("provider", overrides.providerModule);
92
+ consider("instance", overrides.instance);
93
+ if (!desired) {
94
+ return {
95
+ impl: builtin,
96
+ binding: {
97
+ serviceId,
98
+ implId: builtin.implId,
99
+ implVersion: builtin.implVersion,
100
+ scope: "builtin",
101
+ overridden: false,
102
+ notes: builtin.notes
103
+ },
104
+ overridesApplied: []
105
+ };
106
+ }
107
+ const desiredImplId = desired.override.implId;
108
+ const selected = impls.find((i) => i.implId === desiredImplId);
109
+ const impl = selected ?? builtin;
110
+ const didFallback = selected == null;
111
+ const fallbackNote = didFallback ? `Unknown implId "${desiredImplId}", falling back to builtin "${builtin.implId}"` : void 0;
112
+ const notes = [desired.override.notes, impl.notes, fallbackNote].filter((s) => typeof s === "string" && s.length > 0).join("; ");
113
+ return {
114
+ impl,
115
+ binding: {
116
+ serviceId,
117
+ implId: impl.implId,
118
+ implVersion: impl.implVersion,
119
+ scope: desired.scope,
120
+ overridden: true,
121
+ notes: notes.length > 0 ? notes : void 0
122
+ },
123
+ overridesApplied: [
124
+ didFallback ? `${desired.scope}:${serviceId}=${desiredImplId} (fallback=${builtin.implId})` : `${desired.scope}:${serviceId}=${desiredImplId}`
125
+ ]
126
+ };
127
+ };
128
+ var makeRuntimeServicesEvidence = (args) => {
129
+ let scope = "builtin";
130
+ for (const b of args.bindings) {
131
+ scope = maxScope(scope, b.scope);
132
+ }
133
+ return {
134
+ moduleId: args.moduleId,
135
+ instanceId: args.instanceId,
136
+ scope,
137
+ bindings: args.bindings,
138
+ overridesApplied: args.overridesApplied
139
+ };
140
+ };
141
+ var RUNTIME_SERVICES_EVIDENCE = /* @__PURE__ */ Symbol.for("@logix/core/runtimeServicesEvidence");
142
+ var defineHidden = (target, key, value) => {
143
+ Object.defineProperty(target, key, {
144
+ value,
145
+ enumerable: false,
146
+ configurable: true,
147
+ writable: false
148
+ });
149
+ };
150
+ var setRuntimeServicesEvidence = (runtime, evidence) => {
151
+ defineHidden(runtime, RUNTIME_SERVICES_EVIDENCE, evidence);
152
+ };
153
+
154
+ // ../logix-core/src/internal/observability/evidenceCollector.ts
155
+ import { Context as Context2, Effect as Effect2, FiberRef, Layer } from "../effect.js";
156
+ var EvidenceCollectorTagImpl = class extends Context2.Tag(
157
+ "@logix/core/EvidenceCollector"
158
+ )() {
159
+ };
160
+ var EvidenceCollectorTag = EvidenceCollectorTagImpl;
161
+ var evidenceCollectorLayer = (collector) => Layer.succeed(EvidenceCollectorTag, collector);
162
+ var isRecord = (value) => typeof value === "object" && value !== null && !Array.isArray(value);
163
+ var makeEvidenceCollector = (session) => {
164
+ const sink = makeEvidenceSink(session);
165
+ const convergeStaticIrByDigest = /* @__PURE__ */ new Map();
166
+ let runtimeServicesEvidence;
167
+ const exportBudget = {
168
+ dropped: 0,
169
+ oversized: 0,
170
+ nonSerializable: 0
171
+ };
172
+ const debugSink = {
173
+ record: (event) => Effect2.gen(function* () {
174
+ const level = yield* FiberRef.get(currentDiagnosticsLevel);
175
+ const instanceIdRaw = event.instanceId;
176
+ const instanceId = typeof instanceIdRaw === "string" && instanceIdRaw.length > 0 ? instanceIdRaw : "unknown";
177
+ const eventSeq = level === "off" ? void 0 : session.local.nextSeq("eventSeq", instanceId);
178
+ const ref = toRuntimeDebugEventRef(event, {
179
+ diagnosticsLevel: level,
180
+ eventSeq,
181
+ onMetaProjection: ({ stats }) => {
182
+ exportBudget.dropped += stats.dropped;
183
+ exportBudget.oversized += stats.oversized;
184
+ }
185
+ });
186
+ if (!ref) return;
187
+ const projected = projectJsonValue(ref);
188
+ exportBudget.dropped += projected.stats.dropped;
189
+ exportBudget.oversized += projected.stats.oversized;
190
+ exportBudget.nonSerializable += projected.stats.nonSerializable;
191
+ sink.record("debug:event", projected.value, {
192
+ timestamp: ref.timestamp
193
+ });
194
+ })
195
+ };
196
+ const registerConvergeStaticIr = (staticIr) => {
197
+ if (!isRecord(staticIr)) return;
198
+ const digest = staticIr.staticIrDigest;
199
+ if (typeof digest !== "string" || digest.length === 0) return;
200
+ const projected = projectJsonValue(staticIr);
201
+ exportBudget.dropped += projected.stats.dropped;
202
+ exportBudget.oversized += projected.stats.oversized;
203
+ exportBudget.nonSerializable += projected.stats.nonSerializable;
204
+ convergeStaticIrByDigest.set(digest, projected.value);
205
+ };
206
+ const setRuntimeServicesEvidence2 = (evidence) => {
207
+ const projected = projectJsonValue(evidence);
208
+ exportBudget.dropped += projected.stats.dropped;
209
+ exportBudget.oversized += projected.stats.oversized;
210
+ exportBudget.nonSerializable += projected.stats.nonSerializable;
211
+ runtimeServicesEvidence = projected.value;
212
+ };
213
+ const exportEvidencePackage = (options) => {
214
+ const convergeSummary = convergeStaticIrByDigest.size > 0 ? {
215
+ staticIrByDigest: Object.fromEntries(convergeStaticIrByDigest)
216
+ } : void 0;
217
+ const runtimeSummary = runtimeServicesEvidence != null ? { services: runtimeServicesEvidence } : void 0;
218
+ const summary = convergeSummary != null || runtimeSummary != null ? {
219
+ ...convergeSummary != null ? { converge: convergeSummary } : {},
220
+ ...runtimeSummary != null ? { runtime: runtimeSummary } : {}
221
+ } : void 0;
222
+ return sink.export({
223
+ maxEvents: options?.maxEvents,
224
+ summary
225
+ });
226
+ };
227
+ const clear = () => {
228
+ sink.clear();
229
+ convergeStaticIrByDigest.clear();
230
+ runtimeServicesEvidence = void 0;
231
+ exportBudget.dropped = 0;
232
+ exportBudget.oversized = 0;
233
+ exportBudget.nonSerializable = 0;
234
+ };
235
+ return {
236
+ session,
237
+ debugSink,
238
+ registerConvergeStaticIr,
239
+ setRuntimeServicesEvidence: setRuntimeServicesEvidence2,
240
+ exportEvidencePackage,
241
+ clear
242
+ };
243
+ };
244
+
245
+ export {
246
+ RuntimeServicesInstanceOverridesTag,
247
+ resolveRuntimeServicesOverrides,
248
+ selectRuntimeService,
249
+ makeRuntimeServicesEvidence,
250
+ setRuntimeServicesEvidence,
251
+ EvidenceCollectorTag,
252
+ evidenceCollectorLayer,
253
+ makeEvidenceCollector
254
+ };
255
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vbG9naXgtY29yZS9zcmMvaW50ZXJuYWwvcnVudGltZS9jb3JlL1J1bnRpbWVLZXJuZWwudHMiLCAiLi4vLi4vLi4vLi4vbG9naXgtY29yZS9zcmMvaW50ZXJuYWwvb2JzZXJ2YWJpbGl0eS9ldmlkZW5jZUNvbGxlY3Rvci50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiaW1wb3J0IHsgQ29udGV4dCwgRWZmZWN0LCBPcHRpb24gfSBmcm9tIFwiZWZmZWN0XCJcbmltcG9ydCB7IGlzRGV2RW52IH0gZnJvbSBcIi4vZW52LmpzXCJcblxuZXhwb3J0IHR5cGUgT3ZlcnJpZGVTY29wZSA9XG4gIHwgXCJidWlsdGluXCJcbiAgfCBcInJ1bnRpbWVfZGVmYXVsdFwiXG4gIHwgXCJydW50aW1lX21vZHVsZVwiXG4gIHwgXCJwcm92aWRlclwiXG4gIHwgXCJpbnN0YW5jZVwiXG5cbmV4cG9ydCB0eXBlIFJ1bnRpbWVTZXJ2aWNlT3ZlcnJpZGUgPSB7XG4gIHJlYWRvbmx5IGltcGxJZD86IHN0cmluZ1xuICByZWFkb25seSBub3Rlcz86IHN0cmluZ1xufVxuXG4vKipcbiAqIFJ1bnRpbWVTZXJ2aWNlc092ZXJyaWRlc1x1RkYxQVx1NTNFRlx1NUU4Rlx1NTIxN1x1NTMxNlx1NzY4NFx1MjAxQ1x1NjcwRFx1NTJBMVx1NUI5RVx1NzNCMFx1OTAwOVx1NjJFOVx1MjAxRFx1ODk4Nlx1NTE5OVx1MzAwMlxuICpcbiAqIC0ga2V5IFx1NEUzQVx1N0EzM1x1NUI5QSBzZXJ2aWNlSWRcdUZGMUJcbiAqIC0gdmFsdWUgXHU0RUM1XHU1MTQxXHU4QkI4XHU1MzA1XHU1NDJCXHU1M0VGXHU1RThGXHU1MjE3XHU1MzE2XHU1QjU3XHU2QkI1XHVGRjA4XHU3OTgxXHU2QjYyXHU1MUZEXHU2NTcwL1x1OTVFRFx1NTMwNVx1RkYwOVx1RkYwQ1x1NEVFNVx1NEZCRlx1NzUxRlx1NjIxMFx1NTNFRlx1ODlFM1x1OTFDQVx1OEJDMVx1NjM2RVx1MzAwMlxuICovXG5leHBvcnQgdHlwZSBSdW50aW1lU2VydmljZXNPdmVycmlkZXMgPSBSZWFkb25seTxcbiAgUmVjb3JkPHN0cmluZywgUnVudGltZVNlcnZpY2VPdmVycmlkZT5cbj5cblxuZXhwb3J0IGludGVyZmFjZSBSdW50aW1lU2VydmljZXNSdW50aW1lQ29uZmlnIHtcbiAgLyoqIFJ1bnRpbWUgXHU3RUE3XHU5RUQ4XHU4QkE0XHU4OTg2XHU1MTk5XHVGRjA4cnVudGltZV9kZWZhdWx0XHVGRjA5XHUzMDAyICovXG4gIHJlYWRvbmx5IHNlcnZpY2VzPzogUnVudGltZVNlcnZpY2VzT3ZlcnJpZGVzXG4gIC8qKiBcdTYzMDkgbW9kdWxlSWQgXHU3Njg0XHU1REVFXHU5MUNGXHU4OTg2XHU1MTk5XHVGRjA4cnVudGltZV9tb2R1bGVcdUZGMDlcdTMwMDIgKi9cbiAgcmVhZG9ubHkgc2VydmljZXNCeU1vZHVsZUlkPzogUmVhZG9ubHk8UmVjb3JkPHN0cmluZywgUnVudGltZVNlcnZpY2VzT3ZlcnJpZGVzPj5cbn1cblxuY2xhc3MgUnVudGltZVNlcnZpY2VzUnVudGltZUNvbmZpZ1RhZ0ltcGwgZXh0ZW5kcyBDb250ZXh0LlRhZyhcbiAgXCJAbG9naXgvY29yZS9SdW50aW1lU2VydmljZXNSdW50aW1lQ29uZmlnXCIsXG4pPFJ1bnRpbWVTZXJ2aWNlc1J1bnRpbWVDb25maWdUYWdJbXBsLCBSdW50aW1lU2VydmljZXNSdW50aW1lQ29uZmlnPigpIHt9XG5cbmV4cG9ydCBjb25zdCBSdW50aW1lU2VydmljZXNSdW50aW1lQ29uZmlnVGFnID0gUnVudGltZVNlcnZpY2VzUnVudGltZUNvbmZpZ1RhZ0ltcGxcblxuZXhwb3J0IGludGVyZmFjZSBSdW50aW1lU2VydmljZXNQcm92aWRlck92ZXJyaWRlcyB7XG4gIC8qKiBQcm92aWRlciBcdTgzMDNcdTU2RjRcdTlFRDhcdThCQTRcdTg5ODZcdTUxOTlcdUZGMDhwcm92aWRlclx1RkYwOVx1MzAwMiAqL1xuICByZWFkb25seSBzZXJ2aWNlcz86IFJ1bnRpbWVTZXJ2aWNlc092ZXJyaWRlc1xuICAvKiogUHJvdmlkZXIgXHU4MzAzXHU1NkY0XHU2MzA5IG1vZHVsZUlkIFx1NzY4NFx1NURFRVx1OTFDRlx1ODk4Nlx1NTE5OVx1RkYwOHByb3ZpZGVyXHVGRjA5XHUzMDAyICovXG4gIHJlYWRvbmx5IHNlcnZpY2VzQnlNb2R1bGVJZD86IFJlYWRvbmx5PFJlY29yZDxzdHJpbmcsIFJ1bnRpbWVTZXJ2aWNlc092ZXJyaWRlcz4+XG59XG5cbmNsYXNzIFJ1bnRpbWVTZXJ2aWNlc1Byb3ZpZGVyT3ZlcnJpZGVzVGFnSW1wbCBleHRlbmRzIENvbnRleHQuVGFnKFxuICBcIkBsb2dpeC9jb3JlL1J1bnRpbWVTZXJ2aWNlc1Byb3ZpZGVyT3ZlcnJpZGVzXCIsXG4pPFJ1bnRpbWVTZXJ2aWNlc1Byb3ZpZGVyT3ZlcnJpZGVzVGFnSW1wbCwgUnVudGltZVNlcnZpY2VzUHJvdmlkZXJPdmVycmlkZXM+KCkge31cblxuZXhwb3J0IGNvbnN0IFJ1bnRpbWVTZXJ2aWNlc1Byb3ZpZGVyT3ZlcnJpZGVzVGFnID0gUnVudGltZVNlcnZpY2VzUHJvdmlkZXJPdmVycmlkZXNUYWdJbXBsXG5cbmNsYXNzIFJ1bnRpbWVTZXJ2aWNlc0luc3RhbmNlT3ZlcnJpZGVzVGFnSW1wbCBleHRlbmRzIENvbnRleHQuVGFnKFxuICBcIkBsb2dpeC9jb3JlL1J1bnRpbWVTZXJ2aWNlc0luc3RhbmNlT3ZlcnJpZGVzXCIsXG4pPFJ1bnRpbWVTZXJ2aWNlc0luc3RhbmNlT3ZlcnJpZGVzVGFnSW1wbCwgUnVudGltZVNlcnZpY2VzT3ZlcnJpZGVzPigpIHt9XG5cbmV4cG9ydCBjb25zdCBSdW50aW1lU2VydmljZXNJbnN0YW5jZU92ZXJyaWRlc1RhZyA9IFJ1bnRpbWVTZXJ2aWNlc0luc3RhbmNlT3ZlcnJpZGVzVGFnSW1wbFxuXG5leHBvcnQgaW50ZXJmYWNlIFJ1bnRpbWVTZXJ2aWNlQmluZGluZyB7XG4gIHJlYWRvbmx5IHNlcnZpY2VJZDogc3RyaW5nXG4gIHJlYWRvbmx5IGltcGxJZD86IHN0cmluZ1xuICByZWFkb25seSBpbXBsVmVyc2lvbj86IHN0cmluZ1xuICByZWFkb25seSBzY29wZTogT3ZlcnJpZGVTY29wZVxuICByZWFkb25seSBvdmVycmlkZGVuOiBib29sZWFuXG4gIHJlYWRvbmx5IG5vdGVzPzogc3RyaW5nXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUnVudGltZVNlcnZpY2VzRXZpZGVuY2Uge1xuICByZWFkb25seSBtb2R1bGVJZD86IHN0cmluZ1xuICByZWFkb25seSBpbnN0YW5jZUlkOiBzdHJpbmdcbiAgcmVhZG9ubHkgc2NvcGU6IE92ZXJyaWRlU2NvcGVcbiAgcmVhZG9ubHkgYmluZGluZ3M6IFJlYWRvbmx5QXJyYXk8UnVudGltZVNlcnZpY2VCaW5kaW5nPlxuICByZWFkb25seSBvdmVycmlkZXNBcHBsaWVkOiBSZWFkb25seUFycmF5PHN0cmluZz5cbn1cblxuY29uc3QgT1JERVJFRF9TQ09QRVM6IFJlYWRvbmx5QXJyYXk8T3ZlcnJpZGVTY29wZT4gPSBbXG4gIFwiYnVpbHRpblwiLFxuICBcInJ1bnRpbWVfZGVmYXVsdFwiLFxuICBcInJ1bnRpbWVfbW9kdWxlXCIsXG4gIFwicHJvdmlkZXJcIixcbiAgXCJpbnN0YW5jZVwiLFxuXVxuXG5jb25zdCBtYXhTY29wZSA9IChhOiBPdmVycmlkZVNjb3BlLCBiOiBPdmVycmlkZVNjb3BlKTogT3ZlcnJpZGVTY29wZSA9PiB7XG4gIGNvbnN0IGFpID0gT1JERVJFRF9TQ09QRVMuaW5kZXhPZihhKVxuICBjb25zdCBiaSA9IE9SREVSRURfU0NPUEVTLmluZGV4T2YoYilcbiAgcmV0dXJuIChhaSA+PSBiaSA/IGEgOiBiKSBhcyBPdmVycmlkZVNjb3BlXG59XG5cbmNvbnN0IGlzUGxhaW5SZWNvcmQgPSAodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9PlxuICB0eXBlb2YgdmFsdWUgPT09IFwib2JqZWN0XCIgJiYgdmFsdWUgIT09IG51bGwgJiYgIUFycmF5LmlzQXJyYXkodmFsdWUpXG5cbmNvbnN0IG5vcm1hbGl6ZU92ZXJyaWRlID0gKHZhbHVlOiB1bmtub3duKTogUnVudGltZVNlcnZpY2VPdmVycmlkZSB8IHVuZGVmaW5lZCA9PiB7XG4gIGlmICghaXNQbGFpblJlY29yZCh2YWx1ZSkpIHJldHVybiB1bmRlZmluZWRcblxuICBjb25zdCBpbXBsSWRSYXcgPSB2YWx1ZS5pbXBsSWRcbiAgY29uc3Qgbm90ZXNSYXcgPSB2YWx1ZS5ub3Rlc1xuXG4gIHJldHVybiB7XG4gICAgaW1wbElkOiB0eXBlb2YgaW1wbElkUmF3ID09PSBcInN0cmluZ1wiICYmIGltcGxJZFJhdy5sZW5ndGggPiAwID8gaW1wbElkUmF3IDogdW5kZWZpbmVkLFxuICAgIG5vdGVzOiB0eXBlb2Ygbm90ZXNSYXcgPT09IFwic3RyaW5nXCIgJiYgbm90ZXNSYXcubGVuZ3RoID4gMCA/IG5vdGVzUmF3IDogdW5kZWZpbmVkLFxuICB9XG59XG5cbmV4cG9ydCBjb25zdCByZXNvbHZlUnVudGltZVNlcnZpY2VzT3ZlcnJpZGVzID0gKGFyZ3M6IHtcbiAgcmVhZG9ubHkgbW9kdWxlSWQ6IHN0cmluZyB8IHVuZGVmaW5lZFxufSk6IEVmZmVjdC5FZmZlY3Q8XG4gIHtcbiAgICByZWFkb25seSBydW50aW1lRGVmYXVsdD86IFJ1bnRpbWVTZXJ2aWNlc092ZXJyaWRlc1xuICAgIHJlYWRvbmx5IHJ1bnRpbWVNb2R1bGU/OiBSdW50aW1lU2VydmljZXNPdmVycmlkZXNcbiAgICByZWFkb25seSBwcm92aWRlcj86IFJ1bnRpbWVTZXJ2aWNlc092ZXJyaWRlc1xuICAgIHJlYWRvbmx5IHByb3ZpZGVyTW9kdWxlPzogUnVudGltZVNlcnZpY2VzT3ZlcnJpZGVzXG4gICAgcmVhZG9ubHkgaW5zdGFuY2U/OiBSdW50aW1lU2VydmljZXNPdmVycmlkZXNcbiAgfSxcbiAgbmV2ZXIsXG4gIGFueVxuPiA9PlxuICBFZmZlY3QuZ2VuKGZ1bmN0aW9uKiAoKSB7XG4gICAgY29uc3QgcnVudGltZUNvbmZpZ09wdCA9IHlpZWxkKiBFZmZlY3Quc2VydmljZU9wdGlvbihcbiAgICAgIFJ1bnRpbWVTZXJ2aWNlc1J1bnRpbWVDb25maWdUYWcsXG4gICAgKVxuICAgIGNvbnN0IHByb3ZpZGVyT3ZlcnJpZGVzT3B0ID0geWllbGQqIEVmZmVjdC5zZXJ2aWNlT3B0aW9uKFxuICAgICAgUnVudGltZVNlcnZpY2VzUHJvdmlkZXJPdmVycmlkZXNUYWcsXG4gICAgKVxuICAgIGNvbnN0IGluc3RhbmNlT3ZlcnJpZGVzT3B0ID0geWllbGQqIEVmZmVjdC5zZXJ2aWNlT3B0aW9uKFxuICAgICAgUnVudGltZVNlcnZpY2VzSW5zdGFuY2VPdmVycmlkZXNUYWcsXG4gICAgKVxuXG4gICAgY29uc3QgcnVudGltZUNvbmZpZyA9IE9wdGlvbi5pc1NvbWUocnVudGltZUNvbmZpZ09wdClcbiAgICAgID8gcnVudGltZUNvbmZpZ09wdC52YWx1ZVxuICAgICAgOiB1bmRlZmluZWRcbiAgICBjb25zdCBwcm92aWRlck92ZXJyaWRlcyA9IE9wdGlvbi5pc1NvbWUocHJvdmlkZXJPdmVycmlkZXNPcHQpXG4gICAgICA/IHByb3ZpZGVyT3ZlcnJpZGVzT3B0LnZhbHVlXG4gICAgICA6IHVuZGVmaW5lZFxuICAgIGNvbnN0IGluc3RhbmNlT3ZlcnJpZGVzID0gT3B0aW9uLmlzU29tZShpbnN0YW5jZU92ZXJyaWRlc09wdClcbiAgICAgID8gaW5zdGFuY2VPdmVycmlkZXNPcHQudmFsdWVcbiAgICAgIDogdW5kZWZpbmVkXG5cbiAgICBjb25zdCBtb2R1bGVJZCA9IGFyZ3MubW9kdWxlSWRcblxuICAgIGNvbnN0IHJ1bnRpbWVNb2R1bGUgPVxuICAgICAgbW9kdWxlSWQgJiYgcnVudGltZUNvbmZpZz8uc2VydmljZXNCeU1vZHVsZUlkXG4gICAgICAgID8gcnVudGltZUNvbmZpZy5zZXJ2aWNlc0J5TW9kdWxlSWRbbW9kdWxlSWRdXG4gICAgICAgIDogdW5kZWZpbmVkXG5cbiAgICBjb25zdCBwcm92aWRlck1vZHVsZSA9XG4gICAgICBtb2R1bGVJZCAmJiBwcm92aWRlck92ZXJyaWRlcz8uc2VydmljZXNCeU1vZHVsZUlkXG4gICAgICAgID8gcHJvdmlkZXJPdmVycmlkZXMuc2VydmljZXNCeU1vZHVsZUlkW21vZHVsZUlkXVxuICAgICAgICA6IHVuZGVmaW5lZFxuXG4gICAgcmV0dXJuIHtcbiAgICAgIHJ1bnRpbWVEZWZhdWx0OiBydW50aW1lQ29uZmlnPy5zZXJ2aWNlcyxcbiAgICAgIHJ1bnRpbWVNb2R1bGUsXG4gICAgICBwcm92aWRlcjogcHJvdmlkZXJPdmVycmlkZXM/LnNlcnZpY2VzLFxuICAgICAgcHJvdmlkZXJNb2R1bGUsXG4gICAgICBpbnN0YW5jZTogaW5zdGFuY2VPdmVycmlkZXMsXG4gICAgfVxuICB9KVxuXG5leHBvcnQgaW50ZXJmYWNlIFJ1bnRpbWVTZXJ2aWNlSW1wbDxTZXJ2aWNlPiB7XG4gIHJlYWRvbmx5IGltcGxJZDogc3RyaW5nXG4gIHJlYWRvbmx5IGltcGxWZXJzaW9uOiBzdHJpbmdcbiAgcmVhZG9ubHkgbWFrZTogRWZmZWN0LkVmZmVjdDxTZXJ2aWNlLCBuZXZlciwgYW55PlxuICByZWFkb25seSBub3Rlcz86IHN0cmluZ1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFJ1bnRpbWVTZXJ2aWNlU2VsZWN0aW9uPFNlcnZpY2U+IHtcbiAgcmVhZG9ubHkgYmluZGluZzogUnVudGltZVNlcnZpY2VCaW5kaW5nXG4gIHJlYWRvbmx5IGltcGw6IFJ1bnRpbWVTZXJ2aWNlSW1wbDxTZXJ2aWNlPlxuICByZWFkb25seSBvdmVycmlkZXNBcHBsaWVkOiBSZWFkb25seUFycmF5PHN0cmluZz5cbn1cblxuZXhwb3J0IGNvbnN0IHNlbGVjdFJ1bnRpbWVTZXJ2aWNlID0gPFNlcnZpY2U+KFxuICBzZXJ2aWNlSWQ6IHN0cmluZyxcbiAgaW1wbHM6IFJlYWRvbmx5QXJyYXk8UnVudGltZVNlcnZpY2VJbXBsPFNlcnZpY2U+PixcbiAgb3ZlcnJpZGVzOiB7XG4gICAgcmVhZG9ubHkgcnVudGltZURlZmF1bHQ/OiBSdW50aW1lU2VydmljZXNPdmVycmlkZXNcbiAgICByZWFkb25seSBydW50aW1lTW9kdWxlPzogUnVudGltZVNlcnZpY2VzT3ZlcnJpZGVzXG4gICAgcmVhZG9ubHkgcHJvdmlkZXI/OiBSdW50aW1lU2VydmljZXNPdmVycmlkZXNcbiAgICByZWFkb25seSBwcm92aWRlck1vZHVsZT86IFJ1bnRpbWVTZXJ2aWNlc092ZXJyaWRlc1xuICAgIHJlYWRvbmx5IGluc3RhbmNlPzogUnVudGltZVNlcnZpY2VzT3ZlcnJpZGVzXG4gIH0sXG4pOiBSdW50aW1lU2VydmljZVNlbGVjdGlvbjxTZXJ2aWNlPiA9PiB7XG4gIGNvbnN0IGJ1aWx0aW4gPSBpbXBsc1swXVxuICBpZiAoIWJ1aWx0aW4pIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYFtMb2dpeF0gUnVudGltZUtlcm5lbCByZWdpc3RyeSBtaXNzaW5nIGJ1aWx0aW4gaW1wbCBmb3I6ICR7c2VydmljZUlkfWApXG4gIH1cblxuICBsZXQgZGVzaXJlZDogeyByZWFkb25seSBzY29wZTogT3ZlcnJpZGVTY29wZTsgcmVhZG9ubHkgb3ZlcnJpZGU6IFJ1bnRpbWVTZXJ2aWNlT3ZlcnJpZGUgfSB8IHVuZGVmaW5lZFxuICBjb25zdCBjb25zaWRlciA9IChzY29wZTogT3ZlcnJpZGVTY29wZSwgcGF0Y2g6IFJ1bnRpbWVTZXJ2aWNlc092ZXJyaWRlcyB8IHVuZGVmaW5lZCk6IHZvaWQgPT4ge1xuICAgIGNvbnN0IG5leHQgPSBwYXRjaCA/IG5vcm1hbGl6ZU92ZXJyaWRlKHBhdGNoW3NlcnZpY2VJZF0pIDogdW5kZWZpbmVkXG4gICAgaWYgKCFuZXh0IHx8ICFuZXh0LmltcGxJZCkgcmV0dXJuXG4gICAgZGVzaXJlZCA9IHsgc2NvcGUsIG92ZXJyaWRlOiBuZXh0IH1cbiAgfVxuXG4gIC8vIHByaW9yaXR5OiBidWlsdGluIDwgcnVudGltZV9kZWZhdWx0IDwgcnVudGltZV9tb2R1bGUgPCBwcm92aWRlciA8IGluc3RhbmNlXG4gIGNvbnNpZGVyKFwicnVudGltZV9kZWZhdWx0XCIsIG92ZXJyaWRlcy5ydW50aW1lRGVmYXVsdClcbiAgY29uc2lkZXIoXCJydW50aW1lX21vZHVsZVwiLCBvdmVycmlkZXMucnVudGltZU1vZHVsZSlcbiAgY29uc2lkZXIoXCJwcm92aWRlclwiLCBvdmVycmlkZXMucHJvdmlkZXIpXG4gIGNvbnNpZGVyKFwicHJvdmlkZXJcIiwgb3ZlcnJpZGVzLnByb3ZpZGVyTW9kdWxlKVxuICBjb25zaWRlcihcImluc3RhbmNlXCIsIG92ZXJyaWRlcy5pbnN0YW5jZSlcblxuICBpZiAoIWRlc2lyZWQpIHtcbiAgICByZXR1cm4ge1xuICAgICAgaW1wbDogYnVpbHRpbixcbiAgICAgIGJpbmRpbmc6IHtcbiAgICAgICAgc2VydmljZUlkLFxuICAgICAgICBpbXBsSWQ6IGJ1aWx0aW4uaW1wbElkLFxuICAgICAgICBpbXBsVmVyc2lvbjogYnVpbHRpbi5pbXBsVmVyc2lvbixcbiAgICAgICAgc2NvcGU6IFwiYnVpbHRpblwiLFxuICAgICAgICBvdmVycmlkZGVuOiBmYWxzZSxcbiAgICAgICAgbm90ZXM6IGJ1aWx0aW4ubm90ZXMsXG4gICAgICB9LFxuICAgICAgb3ZlcnJpZGVzQXBwbGllZDogW10sXG4gICAgfVxuICB9XG5cbiAgY29uc3QgZGVzaXJlZEltcGxJZCA9IGRlc2lyZWQub3ZlcnJpZGUuaW1wbElkIVxuICBjb25zdCBzZWxlY3RlZCA9IGltcGxzLmZpbmQoKGkpID0+IGkuaW1wbElkID09PSBkZXNpcmVkSW1wbElkKVxuICBjb25zdCBpbXBsID0gc2VsZWN0ZWQgPz8gYnVpbHRpblxuXG4gIGNvbnN0IGRpZEZhbGxiYWNrID0gc2VsZWN0ZWQgPT0gbnVsbFxuICBjb25zdCBmYWxsYmFja05vdGUgPVxuICAgIGRpZEZhbGxiYWNrXG4gICAgICA/IGBVbmtub3duIGltcGxJZCBcIiR7ZGVzaXJlZEltcGxJZH1cIiwgZmFsbGluZyBiYWNrIHRvIGJ1aWx0aW4gXCIke2J1aWx0aW4uaW1wbElkfVwiYFxuICAgICAgOiB1bmRlZmluZWRcblxuICBjb25zdCBub3RlcyA9IFtkZXNpcmVkLm92ZXJyaWRlLm5vdGVzLCBpbXBsLm5vdGVzLCBmYWxsYmFja05vdGVdXG4gICAgLmZpbHRlcigocyk6IHMgaXMgc3RyaW5nID0+IHR5cGVvZiBzID09PSBcInN0cmluZ1wiICYmIHMubGVuZ3RoID4gMClcbiAgICAuam9pbihcIjsgXCIpXG5cbiAgcmV0dXJuIHtcbiAgICBpbXBsLFxuICAgIGJpbmRpbmc6IHtcbiAgICAgIHNlcnZpY2VJZCxcbiAgICAgIGltcGxJZDogaW1wbC5pbXBsSWQsXG4gICAgICBpbXBsVmVyc2lvbjogaW1wbC5pbXBsVmVyc2lvbixcbiAgICAgIHNjb3BlOiBkZXNpcmVkLnNjb3BlLFxuICAgICAgb3ZlcnJpZGRlbjogdHJ1ZSxcbiAgICAgIG5vdGVzOiBub3Rlcy5sZW5ndGggPiAwID8gbm90ZXMgOiB1bmRlZmluZWQsXG4gICAgfSxcbiAgICBvdmVycmlkZXNBcHBsaWVkOiBbXG4gICAgICBkaWRGYWxsYmFja1xuICAgICAgICA/IGAke2Rlc2lyZWQuc2NvcGV9OiR7c2VydmljZUlkfT0ke2Rlc2lyZWRJbXBsSWR9IChmYWxsYmFjaz0ke2J1aWx0aW4uaW1wbElkfSlgXG4gICAgICAgIDogYCR7ZGVzaXJlZC5zY29wZX06JHtzZXJ2aWNlSWR9PSR7ZGVzaXJlZEltcGxJZH1gLFxuICAgIF0sXG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IG1ha2VSdW50aW1lU2VydmljZXNFdmlkZW5jZSA9IChhcmdzOiB7XG4gIHJlYWRvbmx5IG1vZHVsZUlkOiBzdHJpbmcgfCB1bmRlZmluZWRcbiAgcmVhZG9ubHkgaW5zdGFuY2VJZDogc3RyaW5nXG4gIHJlYWRvbmx5IGJpbmRpbmdzOiBSZWFkb25seUFycmF5PFJ1bnRpbWVTZXJ2aWNlQmluZGluZz5cbiAgcmVhZG9ubHkgb3ZlcnJpZGVzQXBwbGllZDogUmVhZG9ubHlBcnJheTxzdHJpbmc+XG59KTogUnVudGltZVNlcnZpY2VzRXZpZGVuY2UgPT4ge1xuICBsZXQgc2NvcGU6IE92ZXJyaWRlU2NvcGUgPSBcImJ1aWx0aW5cIlxuICBmb3IgKGNvbnN0IGIgb2YgYXJncy5iaW5kaW5ncykge1xuICAgIHNjb3BlID0gbWF4U2NvcGUoc2NvcGUsIGIuc2NvcGUpXG4gIH1cblxuICByZXR1cm4ge1xuICAgIG1vZHVsZUlkOiBhcmdzLm1vZHVsZUlkLFxuICAgIGluc3RhbmNlSWQ6IGFyZ3MuaW5zdGFuY2VJZCxcbiAgICBzY29wZSxcbiAgICBiaW5kaW5nczogYXJncy5iaW5kaW5ncyxcbiAgICBvdmVycmlkZXNBcHBsaWVkOiBhcmdzLm92ZXJyaWRlc0FwcGxpZWQsXG4gIH1cbn1cblxuY29uc3QgUlVOVElNRV9TRVJWSUNFU19FVklERU5DRSA9IFN5bWJvbC5mb3IoXCJAbG9naXgvY29yZS9ydW50aW1lU2VydmljZXNFdmlkZW5jZVwiKVxuXG5jb25zdCBkZWZpbmVIaWRkZW4gPSAodGFyZ2V0OiBvYmplY3QsIGtleTogc3ltYm9sLCB2YWx1ZTogdW5rbm93bik6IHZvaWQgPT4ge1xuICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIHtcbiAgICB2YWx1ZSxcbiAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgd3JpdGFibGU6IGZhbHNlLFxuICB9KVxufVxuXG5jb25zdCBmb3JtYXRTY29wZSA9IChtb2R1bGVJZDogdW5rbm93biwgaW5zdGFuY2VJZDogdW5rbm93bik6IHN0cmluZyA9PiB7XG4gIGNvbnN0IG0gPSB0eXBlb2YgbW9kdWxlSWQgPT09IFwic3RyaW5nXCIgJiYgbW9kdWxlSWQubGVuZ3RoID4gMCA/IG1vZHVsZUlkIDogXCJ1bmtub3duXCJcbiAgY29uc3QgaSA9IHR5cGVvZiBpbnN0YW5jZUlkID09PSBcInN0cmluZ1wiICYmIGluc3RhbmNlSWQubGVuZ3RoID4gMCA/IGluc3RhbmNlSWQgOiBcInVua25vd25cIlxuICByZXR1cm4gYG1vZHVsZUlkPSR7bX0sIGluc3RhbmNlSWQ9JHtpfWBcbn1cblxuZXhwb3J0IGNvbnN0IHNldFJ1bnRpbWVTZXJ2aWNlc0V2aWRlbmNlID0gKHJ1bnRpbWU6IG9iamVjdCwgZXZpZGVuY2U6IFJ1bnRpbWVTZXJ2aWNlc0V2aWRlbmNlKTogdm9pZCA9PiB7XG4gIGRlZmluZUhpZGRlbihydW50aW1lLCBSVU5USU1FX1NFUlZJQ0VTX0VWSURFTkNFLCBldmlkZW5jZSlcbn1cblxuZXhwb3J0IGNvbnN0IGdldFJ1bnRpbWVTZXJ2aWNlc0V2aWRlbmNlID0gKHJ1bnRpbWU6IG9iamVjdCk6IFJ1bnRpbWVTZXJ2aWNlc0V2aWRlbmNlID0+IHtcbiAgY29uc3Qgc2NvcGUgPSBydW50aW1lIGFzIHsgcmVhZG9ubHkgbW9kdWxlSWQ/OiB1bmtub3duOyByZWFkb25seSBpbnN0YW5jZUlkPzogdW5rbm93biB9XG4gIGNvbnN0IGV2aWRlbmNlID0gKHJ1bnRpbWUgYXMgYW55KVtSVU5USU1FX1NFUlZJQ0VTX0VWSURFTkNFXSBhcyBSdW50aW1lU2VydmljZXNFdmlkZW5jZSB8IHVuZGVmaW5lZFxuICBpZiAoIWV2aWRlbmNlKSB7XG4gICAgY29uc3QgbXNnID0gaXNEZXZFbnYoKVxuICAgICAgPyBbXG4gICAgICAgICAgXCJbTWlzc2luZ1J1bnRpbWVTZXJ2aWNlc0V2aWRlbmNlXSBSdW50aW1lIHNlcnZpY2VzIGV2aWRlbmNlIG5vdCBpbnN0YWxsZWQgb24gTW9kdWxlUnVudGltZSBpbnN0YW5jZS5cIixcbiAgICAgICAgICBgc2NvcGU6ICR7Zm9ybWF0U2NvcGUoc2NvcGUubW9kdWxlSWQsIHNjb3BlLmluc3RhbmNlSWQpfWAsXG4gICAgICAgICAgXCJmaXg6XCIsXG4gICAgICAgICAgXCItIEVuc3VyZSBNb2R1bGVSdW50aW1lLm1ha2UgYXNzZW1ibGVzIFJ1bnRpbWVLZXJuZWwgYW5kIGF0dGFjaGVzIGV2aWRlbmNlICgwMjAgVVMyKS5cIixcbiAgICAgICAgICBcIi0gSWYgeW91IGNyZWF0ZWQgYSBtb2NrIHJ1bnRpbWUgZm9yIHRlc3RzLCBhdHRhY2ggZXZpZGVuY2Ugb3IgYXZvaWQgY2FsbGluZyBldmlkZW5jZS1vbmx5IEFQSXMuXCIsXG4gICAgICAgIF0uam9pbihcIlxcblwiKVxuICAgICAgOiBcIlJ1bnRpbWUgc2VydmljZXMgZXZpZGVuY2Ugbm90IGluc3RhbGxlZFwiXG4gICAgdGhyb3cgbmV3IEVycm9yKG1zZylcbiAgfVxuXG4gIGNvbnN0IHJ1bnRpbWVJbnN0YW5jZUlkID0gc2NvcGUuaW5zdGFuY2VJZFxuICBpZiAoXG4gICAgdHlwZW9mIHJ1bnRpbWVJbnN0YW5jZUlkID09PSBcInN0cmluZ1wiICYmXG4gICAgcnVudGltZUluc3RhbmNlSWQubGVuZ3RoID4gMCAmJlxuICAgIHJ1bnRpbWVJbnN0YW5jZUlkICE9PSBldmlkZW5jZS5pbnN0YW5jZUlkXG4gICkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGlzRGV2RW52KClcbiAgICAgICAgPyBbXG4gICAgICAgICAgICBcIltJbmNvbnNpc3RlbnRSdW50aW1lU2VydmljZXNFdmlkZW5jZV0gUnVudGltZSBzZXJ2aWNlcyBldmlkZW5jZSBpbnN0YW5jZUlkIG1pc21hdGNoLlwiLFxuICAgICAgICAgICAgYHJ1bnRpbWU6ICR7Zm9ybWF0U2NvcGUoc2NvcGUubW9kdWxlSWQsIHJ1bnRpbWVJbnN0YW5jZUlkKX1gLFxuICAgICAgICAgICAgYGV2aWRlbmNlOiAke2Zvcm1hdFNjb3BlKGV2aWRlbmNlLm1vZHVsZUlkLCBldmlkZW5jZS5pbnN0YW5jZUlkKX1gLFxuICAgICAgICAgIF0uam9pbihcIlxcblwiKVxuICAgICAgICA6IFwiUnVudGltZSBzZXJ2aWNlcyBldmlkZW5jZSBtaXNtYXRjaFwiLFxuICAgIClcbiAgfVxuXG4gIHJldHVybiBldmlkZW5jZVxufVxuIiwgImltcG9ydCB7IENvbnRleHQsIEVmZmVjdCwgRmliZXJSZWYsIExheWVyIH0gZnJvbSBcImVmZmVjdFwiXG5pbXBvcnQgdHlwZSB7IEpzb25WYWx1ZSB9IGZyb20gXCIuL2pzb25WYWx1ZS5qc1wiXG5pbXBvcnQgeyBwcm9qZWN0SnNvblZhbHVlIH0gZnJvbSBcIi4vanNvblZhbHVlLmpzXCJcbmltcG9ydCB0eXBlIHsgRXZpZGVuY2VQYWNrYWdlIH0gZnJvbSBcIi4vZXZpZGVuY2UuanNcIlxuaW1wb3J0IHR5cGUgeyBSdW5TZXNzaW9uIH0gZnJvbSBcIi4vcnVuU2Vzc2lvbi5qc1wiXG5pbXBvcnQgeyBtYWtlRXZpZGVuY2VTaW5rIH0gZnJvbSBcIi4vcnVuU2Vzc2lvbi5qc1wiXG5pbXBvcnQge1xuICBjdXJyZW50RGlhZ25vc3RpY3NMZXZlbCxcbiAgdG9SdW50aW1lRGVidWdFdmVudFJlZixcbiAgdHlwZSBFdmVudCBhcyBEZWJ1Z0V2ZW50LFxuICB0eXBlIFNpbmsgYXMgRGVidWdTaW5rLFxufSBmcm9tIFwiLi4vcnVudGltZS9jb3JlL0RlYnVnU2luay5qc1wiXG5cbmV4cG9ydCBpbnRlcmZhY2UgRXZpZGVuY2VDb2xsZWN0b3Ige1xuICByZWFkb25seSBzZXNzaW9uOiBSdW5TZXNzaW9uXG4gIHJlYWRvbmx5IGRlYnVnU2luazogRGVidWdTaW5rXG4gIHJlYWRvbmx5IHJlZ2lzdGVyQ29udmVyZ2VTdGF0aWNJcjogKHN0YXRpY0lyOiB1bmtub3duKSA9PiB2b2lkXG4gIHJlYWRvbmx5IHNldFJ1bnRpbWVTZXJ2aWNlc0V2aWRlbmNlOiAoZXZpZGVuY2U6IHVua25vd24pID0+IHZvaWRcbiAgcmVhZG9ubHkgZXhwb3J0RXZpZGVuY2VQYWNrYWdlOiAob3B0aW9ucz86IHsgcmVhZG9ubHkgbWF4RXZlbnRzPzogbnVtYmVyIH0pID0+IEV2aWRlbmNlUGFja2FnZVxuICByZWFkb25seSBjbGVhcjogKCkgPT4gdm9pZFxufVxuXG5jbGFzcyBFdmlkZW5jZUNvbGxlY3RvclRhZ0ltcGwgZXh0ZW5kcyBDb250ZXh0LlRhZyhcbiAgXCJAbG9naXgvY29yZS9FdmlkZW5jZUNvbGxlY3RvclwiLFxuKTxFdmlkZW5jZUNvbGxlY3RvclRhZ0ltcGwsIEV2aWRlbmNlQ29sbGVjdG9yPigpIHt9XG5cbmV4cG9ydCBjb25zdCBFdmlkZW5jZUNvbGxlY3RvclRhZyA9IEV2aWRlbmNlQ29sbGVjdG9yVGFnSW1wbFxuXG5leHBvcnQgY29uc3QgZXZpZGVuY2VDb2xsZWN0b3JMYXllciA9IChcbiAgY29sbGVjdG9yOiBFdmlkZW5jZUNvbGxlY3Rvcixcbik6IExheWVyLkxheWVyPEV2aWRlbmNlQ29sbGVjdG9yVGFnSW1wbCwgbmV2ZXIsIG5ldmVyPiA9PlxuICBMYXllci5zdWNjZWVkKEV2aWRlbmNlQ29sbGVjdG9yVGFnLCBjb2xsZWN0b3IpIGFzIExheWVyLkxheWVyPFxuICAgIEV2aWRlbmNlQ29sbGVjdG9yVGFnSW1wbCxcbiAgICBuZXZlcixcbiAgICBuZXZlclxuICA+XG5cbmNvbnN0IGlzUmVjb3JkID0gKHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPT5cbiAgdHlwZW9mIHZhbHVlID09PSBcIm9iamVjdFwiICYmIHZhbHVlICE9PSBudWxsICYmICFBcnJheS5pc0FycmF5KHZhbHVlKVxuXG5leHBvcnQgY29uc3QgbWFrZUV2aWRlbmNlQ29sbGVjdG9yID0gKHNlc3Npb246IFJ1blNlc3Npb24pOiBFdmlkZW5jZUNvbGxlY3RvciA9PiB7XG4gIGNvbnN0IHNpbmsgPSBtYWtlRXZpZGVuY2VTaW5rKHNlc3Npb24pXG5cbiAgY29uc3QgY29udmVyZ2VTdGF0aWNJckJ5RGlnZXN0ID0gbmV3IE1hcDxzdHJpbmcsIEpzb25WYWx1ZT4oKVxuICBsZXQgcnVudGltZVNlcnZpY2VzRXZpZGVuY2U6IEpzb25WYWx1ZSB8IHVuZGVmaW5lZFxuXG4gIGNvbnN0IGV4cG9ydEJ1ZGdldCA9IHtcbiAgICBkcm9wcGVkOiAwLFxuICAgIG92ZXJzaXplZDogMCxcbiAgICBub25TZXJpYWxpemFibGU6IDAsXG4gIH1cblxuICBjb25zdCBkZWJ1Z1Npbms6IERlYnVnU2luayA9IHtcbiAgICByZWNvcmQ6IChldmVudDogRGVidWdFdmVudCkgPT5cbiAgICAgIEVmZmVjdC5nZW4oZnVuY3Rpb24qICgpIHtcbiAgICAgICAgY29uc3QgbGV2ZWwgPSB5aWVsZCogRmliZXJSZWYuZ2V0KGN1cnJlbnREaWFnbm9zdGljc0xldmVsKVxuICAgICAgICBjb25zdCBpbnN0YW5jZUlkUmF3ID0gKGV2ZW50IGFzIGFueSkuaW5zdGFuY2VJZFxuICAgICAgICBjb25zdCBpbnN0YW5jZUlkID1cbiAgICAgICAgICB0eXBlb2YgaW5zdGFuY2VJZFJhdyA9PT0gXCJzdHJpbmdcIiAmJiBpbnN0YW5jZUlkUmF3Lmxlbmd0aCA+IDBcbiAgICAgICAgICAgID8gaW5zdGFuY2VJZFJhd1xuICAgICAgICAgICAgOiBcInVua25vd25cIlxuICAgICAgICBjb25zdCBldmVudFNlcSA9XG4gICAgICAgICAgbGV2ZWwgPT09IFwib2ZmXCJcbiAgICAgICAgICAgID8gdW5kZWZpbmVkXG4gICAgICAgICAgICA6IHNlc3Npb24ubG9jYWwubmV4dFNlcShcImV2ZW50U2VxXCIsIGluc3RhbmNlSWQpXG4gICAgICAgIGNvbnN0IHJlZiA9IHRvUnVudGltZURlYnVnRXZlbnRSZWYoZXZlbnQsIHtcbiAgICAgICAgICBkaWFnbm9zdGljc0xldmVsOiBsZXZlbCxcbiAgICAgICAgICBldmVudFNlcSxcbiAgICAgICAgICBvbk1ldGFQcm9qZWN0aW9uOiAoeyBzdGF0cyB9KSA9PiB7XG4gICAgICAgICAgICBleHBvcnRCdWRnZXQuZHJvcHBlZCArPSBzdGF0cy5kcm9wcGVkXG4gICAgICAgICAgICBleHBvcnRCdWRnZXQub3ZlcnNpemVkICs9IHN0YXRzLm92ZXJzaXplZFxuICAgICAgICAgIH0sXG4gICAgICAgIH0pXG4gICAgICAgIGlmICghcmVmKSByZXR1cm5cblxuICAgICAgICBjb25zdCBwcm9qZWN0ZWQgPSBwcm9qZWN0SnNvblZhbHVlKHJlZilcbiAgICAgICAgZXhwb3J0QnVkZ2V0LmRyb3BwZWQgKz0gcHJvamVjdGVkLnN0YXRzLmRyb3BwZWRcbiAgICAgICAgZXhwb3J0QnVkZ2V0Lm92ZXJzaXplZCArPSBwcm9qZWN0ZWQuc3RhdHMub3ZlcnNpemVkXG4gICAgICAgIGV4cG9ydEJ1ZGdldC5ub25TZXJpYWxpemFibGUgKz0gcHJvamVjdGVkLnN0YXRzLm5vblNlcmlhbGl6YWJsZVxuXG4gICAgICAgIHNpbmsucmVjb3JkKFwiZGVidWc6ZXZlbnRcIiwgcHJvamVjdGVkLnZhbHVlLCB7XG4gICAgICAgICAgdGltZXN0YW1wOiByZWYudGltZXN0YW1wLFxuICAgICAgICB9KVxuICAgICAgfSksXG4gIH1cblxuICBjb25zdCByZWdpc3RlckNvbnZlcmdlU3RhdGljSXIgPSAoc3RhdGljSXI6IHVua25vd24pOiB2b2lkID0+IHtcbiAgICBpZiAoIWlzUmVjb3JkKHN0YXRpY0lyKSkgcmV0dXJuXG4gICAgY29uc3QgZGlnZXN0ID0gc3RhdGljSXIuc3RhdGljSXJEaWdlc3RcbiAgICBpZiAodHlwZW9mIGRpZ2VzdCAhPT0gXCJzdHJpbmdcIiB8fCBkaWdlc3QubGVuZ3RoID09PSAwKSByZXR1cm5cbiAgICBjb25zdCBwcm9qZWN0ZWQgPSBwcm9qZWN0SnNvblZhbHVlKHN0YXRpY0lyKVxuICAgIGV4cG9ydEJ1ZGdldC5kcm9wcGVkICs9IHByb2plY3RlZC5zdGF0cy5kcm9wcGVkXG4gICAgZXhwb3J0QnVkZ2V0Lm92ZXJzaXplZCArPSBwcm9qZWN0ZWQuc3RhdHMub3ZlcnNpemVkXG4gICAgZXhwb3J0QnVkZ2V0Lm5vblNlcmlhbGl6YWJsZSArPSBwcm9qZWN0ZWQuc3RhdHMubm9uU2VyaWFsaXphYmxlXG4gICAgY29udmVyZ2VTdGF0aWNJckJ5RGlnZXN0LnNldChkaWdlc3QsIHByb2plY3RlZC52YWx1ZSlcbiAgfVxuXG4gIGNvbnN0IHNldFJ1bnRpbWVTZXJ2aWNlc0V2aWRlbmNlID0gKGV2aWRlbmNlOiB1bmtub3duKTogdm9pZCA9PiB7XG4gICAgY29uc3QgcHJvamVjdGVkID0gcHJvamVjdEpzb25WYWx1ZShldmlkZW5jZSlcbiAgICBleHBvcnRCdWRnZXQuZHJvcHBlZCArPSBwcm9qZWN0ZWQuc3RhdHMuZHJvcHBlZFxuICAgIGV4cG9ydEJ1ZGdldC5vdmVyc2l6ZWQgKz0gcHJvamVjdGVkLnN0YXRzLm92ZXJzaXplZFxuICAgIGV4cG9ydEJ1ZGdldC5ub25TZXJpYWxpemFibGUgKz0gcHJvamVjdGVkLnN0YXRzLm5vblNlcmlhbGl6YWJsZVxuICAgIHJ1bnRpbWVTZXJ2aWNlc0V2aWRlbmNlID0gcHJvamVjdGVkLnZhbHVlXG4gIH1cblxuICBjb25zdCBleHBvcnRFdmlkZW5jZVBhY2thZ2UgPSAob3B0aW9ucz86IHtcbiAgICByZWFkb25seSBtYXhFdmVudHM/OiBudW1iZXJcbiAgfSk6IEV2aWRlbmNlUGFja2FnZSA9PiB7XG4gICAgY29uc3QgY29udmVyZ2VTdW1tYXJ5ID1cbiAgICAgIGNvbnZlcmdlU3RhdGljSXJCeURpZ2VzdC5zaXplID4gMFxuICAgICAgICA/ICh7XG4gICAgICAgICAgICBzdGF0aWNJckJ5RGlnZXN0OiBPYmplY3QuZnJvbUVudHJpZXMoY29udmVyZ2VTdGF0aWNJckJ5RGlnZXN0KSxcbiAgICAgICAgICB9IGFzIHVua25vd24gYXMgSnNvblZhbHVlKVxuICAgICAgICA6IHVuZGVmaW5lZFxuXG4gICAgY29uc3QgcnVudGltZVN1bW1hcnkgPVxuICAgICAgcnVudGltZVNlcnZpY2VzRXZpZGVuY2UgIT0gbnVsbFxuICAgICAgICA/ICh7IHNlcnZpY2VzOiBydW50aW1lU2VydmljZXNFdmlkZW5jZSB9IGFzIHVua25vd24gYXMgSnNvblZhbHVlKVxuICAgICAgICA6IHVuZGVmaW5lZFxuXG4gICAgY29uc3Qgc3VtbWFyeSA9XG4gICAgICBjb252ZXJnZVN1bW1hcnkgIT0gbnVsbCB8fCBydW50aW1lU3VtbWFyeSAhPSBudWxsXG4gICAgICAgID8gKHtcbiAgICAgICAgICAgIC4uLihjb252ZXJnZVN1bW1hcnkgIT0gbnVsbCA/IHsgY29udmVyZ2U6IGNvbnZlcmdlU3VtbWFyeSB9IDoge30pLFxuICAgICAgICAgICAgLi4uKHJ1bnRpbWVTdW1tYXJ5ICE9IG51bGwgPyB7IHJ1bnRpbWU6IHJ1bnRpbWVTdW1tYXJ5IH0gOiB7fSksXG4gICAgICAgICAgfSBhcyB1bmtub3duIGFzIEpzb25WYWx1ZSlcbiAgICAgICAgOiB1bmRlZmluZWRcblxuICAgIHJldHVybiBzaW5rLmV4cG9ydCh7XG4gICAgICBtYXhFdmVudHM6IG9wdGlvbnM/Lm1heEV2ZW50cyxcbiAgICAgIHN1bW1hcnksXG4gICAgfSlcbiAgfVxuXG4gIGNvbnN0IGNsZWFyID0gKCk6IHZvaWQgPT4ge1xuICAgIHNpbmsuY2xlYXIoKVxuICAgIGNvbnZlcmdlU3RhdGljSXJCeURpZ2VzdC5jbGVhcigpXG4gICAgcnVudGltZVNlcnZpY2VzRXZpZGVuY2UgPSB1bmRlZmluZWRcbiAgICBleHBvcnRCdWRnZXQuZHJvcHBlZCA9IDBcbiAgICBleHBvcnRCdWRnZXQub3ZlcnNpemVkID0gMFxuICAgIGV4cG9ydEJ1ZGdldC5ub25TZXJpYWxpemFibGUgPSAwXG4gIH1cblxuICByZXR1cm4ge1xuICAgIHNlc3Npb24sXG4gICAgZGVidWdTaW5rLFxuICAgIHJlZ2lzdGVyQ29udmVyZ2VTdGF0aWNJcixcbiAgICBzZXRSdW50aW1lU2VydmljZXNFdmlkZW5jZSxcbiAgICBleHBvcnRFdmlkZW5jZVBhY2thZ2UsXG4gICAgY2xlYXIsXG4gIH1cbn1cbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7O0FBQUEsU0FBUyxTQUFTLFFBQVEsY0FBYztBQWdDeEMsSUFBTSxzQ0FBTixjQUFrRCxRQUFRO0FBQUEsRUFDeEQ7QUFDRixFQUFxRSxFQUFFO0FBQUM7QUFFakUsSUFBTSxrQ0FBa0M7QUFTL0MsSUFBTSwwQ0FBTixjQUFzRCxRQUFRO0FBQUEsRUFDNUQ7QUFDRixFQUE2RSxFQUFFO0FBQUM7QUFFekUsSUFBTSxzQ0FBc0M7QUFFbkQsSUFBTSwwQ0FBTixjQUFzRCxRQUFRO0FBQUEsRUFDNUQ7QUFDRixFQUFxRSxFQUFFO0FBQUM7QUFFakUsSUFBTSxzQ0FBc0M7QUFtQm5ELElBQU0saUJBQStDO0FBQUEsRUFDbkQ7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FB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QUksQ0FBQztBQUFBLE1BQy9ELEdBQUksa0JBQWtCLE9BQU8sRUFBRSxTQUFTLGVBQWUsSUFBSSxDQUFDO0FBQUEsSUFDOUQsSUFDQTtBQUVOLFdBQU8sS0FBSyxPQUFPO0FBQUEsTUFDakIsV0FBVyxTQUFTO0FBQUEsTUFDcEI7QUFBQSxJQUNGLENBQUM7QUFBQSxFQUNIO0FBRUEsUUFBTSxRQUFRLE1BQVk7QUFDeEIsU0FBSyxNQUFNO0FBQ1gsNkJBQXlCLE1BQU07QUFDL0IsOEJBQTBCO0FBQzFCLGlCQUFhLFVBQVU7QUFDdkIsaUJBQWEsWUFBWTtBQUN6QixpQkFBYSxrQkFBa0I7QUFBQSxFQUNqQztBQUVBLFNBQU87QUFBQSxJQUNMO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBLDRCQUFBQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsRUFDRjtBQUNGOyIsCiAgIm5hbWVzIjogWyJDb250ZXh0IiwgIkVmZmVjdCIsICJDb250ZXh0IiwgIkVmZmVjdCIsICJzZXRSdW50aW1lU2VydmljZXNFdmlkZW5jZSJdCn0K