@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.
- package/LICENSE +201 -0
- package/package.json +3 -1
- package/public/sandbox/chunks/chunk-2AUQRESB.js +1114 -0
- package/public/sandbox/chunks/chunk-2F72LQKW.js +194 -0
- package/public/sandbox/chunks/chunk-2PYDGDD3.js +4071 -0
- package/public/sandbox/chunks/chunk-2UGKSXDZ.js +16 -0
- package/public/sandbox/chunks/chunk-2XVE7F26.js +153 -0
- package/public/sandbox/chunks/chunk-3A7TFNZN.js +219 -0
- package/public/sandbox/chunks/chunk-3BHC6JAV.js +1070 -0
- package/public/sandbox/chunks/chunk-3U4CAKCX.js +61 -0
- package/public/sandbox/chunks/chunk-3VU3JLZO.js +272 -0
- package/public/sandbox/chunks/chunk-4CPONKWY.js +1170 -0
- package/public/sandbox/chunks/chunk-4GMUQTWH.js +850 -0
- package/public/sandbox/chunks/chunk-4KIYG5E4.js +749 -0
- package/public/sandbox/chunks/chunk-4MY35XR3.js +175 -0
- package/public/sandbox/chunks/chunk-5DNHJMHA.js +69 -0
- package/public/sandbox/chunks/chunk-5EC4S7X6.js +42 -0
- package/public/sandbox/chunks/chunk-5FB7QFSH.js +227 -0
- package/public/sandbox/chunks/chunk-5GEYCJW2.js +206 -0
- package/public/sandbox/chunks/chunk-5PT7Q5SS.js +373 -0
- package/public/sandbox/chunks/chunk-5WN5IGKA.js +166 -0
- package/public/sandbox/chunks/chunk-5XOBKSOT.js +213 -0
- package/public/sandbox/chunks/chunk-67RVISUC.js +313 -0
- package/public/sandbox/chunks/chunk-6ELJEKZS.js +12 -0
- package/public/sandbox/chunks/chunk-6FKWRVP4.js +85 -0
- package/public/sandbox/chunks/chunk-6JRP52YT.js +34 -0
- package/public/sandbox/chunks/chunk-6JYAC3G6.js +42 -0
- package/public/sandbox/chunks/chunk-6TUOP63Q.js +86 -0
- package/public/sandbox/chunks/{chunk-A6JFUNQQ.js → chunk-74C5VW7Z.js} +2 -2
- package/public/sandbox/chunks/chunk-75DQFC5M.js +16 -0
- package/public/sandbox/chunks/{chunk-UCFEP3BH.js → chunk-7GPAF2UK.js} +1 -1
- package/public/sandbox/chunks/chunk-7KQFTS2Y.js +135 -0
- package/public/sandbox/chunks/chunk-7POKWYE3.js +112 -0
- package/public/sandbox/chunks/chunk-7VUEF5F3.js +395 -0
- package/public/sandbox/chunks/chunk-7W5APZS2.js +77 -0
- package/public/sandbox/chunks/chunk-A6OFCXDQ.js +397 -0
- package/public/sandbox/chunks/chunk-A7HLOSO6.js +216 -0
- package/public/sandbox/chunks/chunk-AGF4RRCB.js +408 -0
- package/public/sandbox/chunks/chunk-ASJSJAAL.js +122 -0
- package/public/sandbox/chunks/chunk-ASVMK364.js +283 -0
- package/public/sandbox/chunks/chunk-AUDTI2BQ.js +895 -0
- package/public/sandbox/chunks/chunk-B2SZTA3M.js +16 -0
- package/public/sandbox/chunks/chunk-B6YS2UMV.js +372 -0
- package/public/sandbox/chunks/chunk-BCEO3MGD.js +244 -0
- package/public/sandbox/chunks/chunk-BCOO65D4.js +373 -0
- package/public/sandbox/chunks/chunk-BJOWSSEL.js +38 -0
- package/public/sandbox/chunks/chunk-BS2WBFW4.js +373 -0
- package/public/sandbox/chunks/chunk-BUVHG3NJ.js +439 -0
- package/public/sandbox/chunks/chunk-BVE33AN6.js +42 -0
- package/public/sandbox/chunks/chunk-BWTGJZVP.js +19 -0
- package/public/sandbox/chunks/chunk-BXD7GZC3.js +1025 -0
- package/public/sandbox/chunks/chunk-BZH4EUUD.js +164 -0
- package/public/sandbox/chunks/{chunk-HFV5GJPK.js → chunk-C2MYMMO4.js} +3 -3
- package/public/sandbox/chunks/chunk-CRE4NJJ6.js +271 -0
- package/public/sandbox/chunks/chunk-CVZPRIDB.js +706 -0
- package/public/sandbox/chunks/chunk-CWOXD5NG.js +991 -0
- package/public/sandbox/chunks/chunk-D6DOC3BJ.js +373 -0
- package/public/sandbox/chunks/chunk-DEPSGFSY.js +1698 -0
- package/public/sandbox/chunks/chunk-DM7C5NP5.js +819 -0
- package/public/sandbox/chunks/chunk-DN33LMOF.js +1112 -0
- package/public/sandbox/chunks/{chunk-S46P7MC6.js → chunk-DT7YIIWE.js} +2 -2
- package/public/sandbox/chunks/chunk-DVB5WRCI.js +260 -0
- package/public/sandbox/chunks/{chunk-TOHCFMQS.js → chunk-E3EVW7NR.js} +11 -18
- package/public/sandbox/chunks/chunk-E5BV567Q.js +417 -0
- package/public/sandbox/chunks/chunk-E7BIWMQQ.js +203 -0
- package/public/sandbox/chunks/chunk-EAKGPSOQ.js +83 -0
- package/public/sandbox/chunks/chunk-EGUYL2ER.js +75 -0
- package/public/sandbox/chunks/chunk-EP5GQYZ5.js +85 -0
- package/public/sandbox/chunks/chunk-ET6CJEHC.js +221 -0
- package/public/sandbox/chunks/chunk-EU67YZHZ.js +1070 -0
- package/public/sandbox/chunks/{chunk-PTSJJANP.js → chunk-EYNDQLSB.js} +1 -1
- package/public/sandbox/chunks/{chunk-CEGSWZ5S.js → chunk-EZTMVCJF.js} +1 -1
- package/public/sandbox/chunks/chunk-F5CLVIS6.js +907 -0
- package/public/sandbox/chunks/chunk-F743SKYD.js +85 -0
- package/public/sandbox/chunks/chunk-FEGFZ5OX.js +86 -0
- package/public/sandbox/chunks/chunk-FG5B7ZX3.js +373 -0
- package/public/sandbox/chunks/chunk-FKZPYMDG.js +373 -0
- package/public/sandbox/chunks/chunk-FNLXHWIU.js +220 -0
- package/public/sandbox/chunks/chunk-FQRUTYAD.js +1991 -0
- package/public/sandbox/chunks/{chunk-VLYP4WUS.js → chunk-FY5A73NK.js} +5 -5
- package/public/sandbox/chunks/chunk-G7FAOG3O.js +221 -0
- package/public/sandbox/chunks/chunk-GFXHUC7Y.js +73 -0
- package/public/sandbox/chunks/chunk-GIPXUIZQ.js +534 -0
- package/public/sandbox/chunks/chunk-GP37MEGJ.js +52 -0
- package/public/sandbox/chunks/chunk-GXL5QCMF.js +4511 -0
- package/public/sandbox/chunks/chunk-GZ2NSE6A.js +177 -0
- package/public/sandbox/chunks/chunk-GZATW4YD.js +69 -0
- package/public/sandbox/chunks/chunk-H4EBXROQ.js +166 -0
- package/public/sandbox/chunks/chunk-HETCPK6Z.js +153 -0
- package/public/sandbox/chunks/chunk-HGUFQ2QC.js +4431 -0
- package/public/sandbox/chunks/chunk-HGV3VNH3.js +255 -0
- package/public/sandbox/chunks/chunk-HIJ67QWR.js +5397 -0
- package/public/sandbox/chunks/chunk-IDHERBKW.js +1114 -0
- package/public/sandbox/chunks/chunk-IDTK4FIY.js +102 -0
- package/public/sandbox/chunks/chunk-ILFVY7H5.js +164 -0
- package/public/sandbox/chunks/chunk-ISGSRYGO.js +57 -0
- package/public/sandbox/chunks/chunk-J45VPU24.js +408 -0
- package/public/sandbox/chunks/chunk-JAUIM3O5.js +42 -0
- package/public/sandbox/chunks/chunk-JB7OQEM6.js +373 -0
- package/public/sandbox/chunks/chunk-JCKW6NHD.js +15 -0
- package/public/sandbox/chunks/chunk-JMA7GY7Z.js +221 -0
- package/public/sandbox/chunks/chunk-JY46J6IL.js +836 -0
- package/public/sandbox/chunks/{chunk-X72PZOFA.js → chunk-K2MQ66O7.js} +1 -1
- package/public/sandbox/chunks/chunk-KA7PZA6F.js +464 -0
- package/public/sandbox/chunks/chunk-KDEQTUID.js +102 -0
- package/public/sandbox/chunks/chunk-KDJR27JV.js +1696 -0
- package/public/sandbox/chunks/chunk-KFE3JO6N.js +77 -0
- package/public/sandbox/chunks/chunk-KLDSYWT5.js +536 -0
- package/public/sandbox/chunks/chunk-KQWWFYBF.js +203 -0
- package/public/sandbox/chunks/chunk-KTFZSXOW.js +6473 -0
- package/public/sandbox/chunks/chunk-KXVIC55U.js +108 -0
- package/public/sandbox/chunks/{chunk-HNEDTEGQ.js → chunk-L4PNO2H6.js} +1 -1
- package/public/sandbox/chunks/{chunk-WE4STGO2.js → chunk-L4ZNW5DI.js} +2 -2
- package/public/sandbox/chunks/chunk-LBUINGZ4.js +836 -0
- package/public/sandbox/chunks/chunk-LIYPPU6I.js +112 -0
- package/public/sandbox/chunks/chunk-LJHTOJXW.js +221 -0
- package/public/sandbox/chunks/{chunk-BWSNPKO5.js → chunk-LQL23SWJ.js} +2 -2
- package/public/sandbox/chunks/chunk-LTFCYZQ6.js +46 -0
- package/public/sandbox/chunks/chunk-LTWLVCKQ.js +166 -0
- package/public/sandbox/chunks/chunk-LWI7BXFN.js +395 -0
- package/public/sandbox/chunks/chunk-LYBBX6WM.js +225 -0
- package/public/sandbox/chunks/chunk-MXE7HIBM.js +474 -0
- package/public/sandbox/chunks/chunk-MYBDYNK4.js +6004 -0
- package/public/sandbox/chunks/chunk-NC2MIWZX.js +732 -0
- package/public/sandbox/chunks/chunk-NE447XAF.js +597 -0
- package/public/sandbox/chunks/chunk-NEAYV5C2.js +255 -0
- package/public/sandbox/chunks/chunk-NMGFJZ4I.js +26 -0
- package/public/sandbox/chunks/chunk-NWCJJZNQ.js +71 -0
- package/public/sandbox/chunks/chunk-O57OZBDR.js +214 -0
- package/public/sandbox/chunks/chunk-OJJT664Q.js +731 -0
- package/public/sandbox/chunks/chunk-OKTBUTCH.js +1175 -0
- package/public/sandbox/chunks/chunk-OQ4SYV5D.js +534 -0
- package/public/sandbox/chunks/chunk-OTVVIHJD.js +219 -0
- package/public/sandbox/chunks/chunk-OWTMSCF7.js +1052 -0
- package/public/sandbox/chunks/chunk-P5ZQNFC3.js +122 -0
- package/public/sandbox/chunks/chunk-PBPT2U2N.js +1698 -0
- package/public/sandbox/chunks/chunk-PHBJLCP3.js +836 -0
- package/public/sandbox/chunks/chunk-PHV4HYHB.js +397 -0
- package/public/sandbox/chunks/chunk-PIXQ6SOX.js +4071 -0
- package/public/sandbox/chunks/chunk-PKJL6YLK.js +73 -0
- package/public/sandbox/chunks/chunk-PKPOITIU.js +221 -0
- package/public/sandbox/chunks/{chunk-NQW73ACJ.js → chunk-PMXBOYQI.js} +1 -1
- package/public/sandbox/chunks/chunk-PQLZD7NR.js +836 -0
- package/public/sandbox/chunks/chunk-QEESVOZU.js +16 -0
- package/public/sandbox/chunks/chunk-QGIM3FQK.js +159 -0
- package/public/sandbox/chunks/chunk-QL5JNEDO.js +69 -0
- package/public/sandbox/chunks/chunk-QQOZ3RMH.js +867 -0
- package/public/sandbox/chunks/chunk-QUMEVT2F.js +194 -0
- package/public/sandbox/chunks/chunk-QVZBXYVY.js +102 -0
- package/public/sandbox/chunks/chunk-R5HQS6RB.js +135 -0
- package/public/sandbox/chunks/chunk-R75Q2CTT.js +900 -0
- package/public/sandbox/chunks/chunk-RBB6SHW2.js +253 -0
- package/public/sandbox/chunks/chunk-RDHNRWQP.js +383 -0
- package/public/sandbox/chunks/chunk-RIWOEI3T.js +1101 -0
- package/public/sandbox/chunks/chunk-RS5FFPUV.js +103 -0
- package/public/sandbox/chunks/chunk-RYSSJBGX.js +203 -0
- package/public/sandbox/chunks/chunk-S3KBAE5Z.js +1114 -0
- package/public/sandbox/chunks/chunk-S6ZZHV6G.js +244 -0
- package/public/sandbox/chunks/chunk-SFXJ24HY.js +499 -0
- package/public/sandbox/chunks/chunk-SH7TP5CJ.js +1109 -0
- package/public/sandbox/chunks/chunk-SI5OKFFY.js +317 -0
- package/public/sandbox/chunks/chunk-SIXNQNIR.js +86 -0
- package/public/sandbox/chunks/chunk-ST353BOX.js +42 -0
- package/public/sandbox/chunks/chunk-SYEHKMLP.js +1140 -0
- package/public/sandbox/chunks/chunk-SZ4KQUJU.js +69 -0
- package/public/sandbox/chunks/{chunk-5SOP6EKV.js → chunk-SZI65PSP.js} +5 -10
- package/public/sandbox/chunks/chunk-T7RLTSMX.js +78 -0
- package/public/sandbox/chunks/chunk-TJ2RLUTW.js +57 -0
- package/public/sandbox/chunks/chunk-TJB73XPN.js +4071 -0
- package/public/sandbox/chunks/chunk-TXJCYO56.js +4046 -0
- package/public/sandbox/chunks/chunk-U5J3LCYI.js +731 -0
- package/public/sandbox/chunks/chunk-UABFN3NH.js +208 -0
- package/public/sandbox/chunks/chunk-UBMUY7WO.js +13 -0
- package/public/sandbox/chunks/chunk-UC27CE32.js +69 -0
- package/public/sandbox/chunks/chunk-UJGVDFZN.js +147 -0
- package/public/sandbox/chunks/chunk-UNVLTK4N.js +122 -0
- package/public/sandbox/chunks/chunk-UQKQ6V3V.js +208 -0
- package/public/sandbox/chunks/chunk-UZZBHWIO.js +703 -0
- package/public/sandbox/chunks/chunk-VKZIJERL.js +1114 -0
- package/public/sandbox/chunks/chunk-VQQEAGID.js +372 -0
- package/public/sandbox/chunks/{chunk-3LX3KIQQ.js → chunk-W365QUZ5.js} +3 -5
- package/public/sandbox/chunks/chunk-WJY2LSWG.js +1052 -0
- package/public/sandbox/chunks/chunk-WNOBN3DX.js +391 -0
- package/public/sandbox/chunks/chunk-X2Z5VYG3.js +245 -0
- package/public/sandbox/chunks/chunk-X74KU74D.js +959 -0
- package/public/sandbox/chunks/chunk-XE7ULSGQ.js +46 -0
- package/public/sandbox/chunks/chunk-XRXUJZ3X.js +431 -0
- package/public/sandbox/chunks/chunk-XWHIN7CC.js +85 -0
- package/public/sandbox/chunks/chunk-Y2TVGGVL.js +527 -0
- package/public/sandbox/chunks/chunk-YMVMZA3U.js +1395 -0
- package/public/sandbox/chunks/chunk-YOBLFWDV.js +431 -0
- package/public/sandbox/chunks/chunk-YR2RFEZA.js +11 -0
- package/public/sandbox/chunks/chunk-YTD6A35P.js +836 -0
- package/public/sandbox/chunks/chunk-Z5L7EZXS.js +81 -0
- package/public/sandbox/chunks/chunk-Z65I5ET2.js +108 -0
- package/public/sandbox/chunks/chunk-Z6LV34RO.js +390 -0
- package/public/sandbox/chunks/chunk-ZAKUP6QG.js +1634 -0
- package/public/sandbox/chunks/chunk-ZHNYE2YH.js +731 -0
- package/public/sandbox/chunks/chunk-ZHQX3B3Y.js +867 -0
- package/public/sandbox/chunks/chunk-ZIXDFRHJ.js +731 -0
- package/public/sandbox/chunks/chunk-ZPZ2MZ4D.js +528 -0
- package/public/sandbox/chunks/chunk-ZQD6NZXB.js +373 -0
- package/public/sandbox/chunks/chunk-ZVVBP7ON.js +16 -0
- package/public/sandbox/chunks/chunk-ZWE3P6X2.js +11 -0
- package/public/sandbox/logix-core/Bound.js +14 -14
- package/public/sandbox/logix-core/Debug.js +12 -10
- package/public/sandbox/logix-core/EffectOp.js +3 -4
- package/public/sandbox/logix-core/Env.js +5 -2
- package/public/sandbox/logix-core/ExternalStore.js +239 -0
- package/public/sandbox/logix-core/Flow.js +7 -8
- package/public/sandbox/logix-core/Kernel.js +7 -4
- package/public/sandbox/logix-core/Link.js +33 -25
- package/public/sandbox/logix-core/Middleware.js +13 -11
- package/public/sandbox/logix-core/Module.js +93 -30
- package/public/sandbox/logix-core/ModuleTag.js +28 -25
- package/public/sandbox/logix-core/Observability.js +21 -19
- package/public/sandbox/logix-core/Process.js +27 -22
- package/public/sandbox/logix-core/ReadQuery.js +7 -11
- package/public/sandbox/logix-core/Reflection.js +173 -53
- package/public/sandbox/logix-core/Resource.js +6 -3
- package/public/sandbox/logix-core/Root.js +7 -3
- package/public/sandbox/logix-core/Runtime.js +54 -40
- package/public/sandbox/logix-core/ScopeRegistry.js +6 -3
- package/public/sandbox/logix-core/StateTrait.js +17 -14
- package/public/sandbox/logix-core/TraitLifecycle.js +8 -8
- package/public/sandbox/logix-core/Workflow.js +332 -0
- package/public/sandbox/logix-core.js +11133 -6622
- package/public/sandbox/logix-core.manifest.json +4 -2
- package/public/sandbox/worker.js +3 -3
- package/public/sandbox/chunks/chunk-4LRLOTMA.js +0 -1698
- package/public/sandbox/chunks/chunk-CDLXJHXY.js +0 -120
- package/public/sandbox/chunks/chunk-CZRI7MHA.js +0 -46
- package/public/sandbox/chunks/chunk-EJDFUZ4B.js +0 -408
- package/public/sandbox/chunks/chunk-IP63FME6.js +0 -282
- package/public/sandbox/chunks/chunk-JIXTOQXJ.js +0 -1103
- package/public/sandbox/chunks/chunk-MPUSOFJ3.js +0 -1928
- package/public/sandbox/chunks/chunk-ON2LY6HJ.js +0 -135
- package/public/sandbox/chunks/chunk-POIBXAH5.js +0 -995
- package/public/sandbox/chunks/chunk-PQ652ULI.js +0 -6359
- package/public/sandbox/chunks/chunk-RJQ4PG2F.js +0 -77
- package/public/sandbox/chunks/chunk-S4EXG3OS.js +0 -533
- package/public/sandbox/chunks/chunk-SUXDGXVE.js +0 -390
- package/public/sandbox/chunks/chunk-TOQ6SJ6O.js +0 -244
- package/public/sandbox/chunks/chunk-UKYAF3NL.js +0 -1036
- package/public/sandbox/chunks/chunk-UMVN3AWO.js +0 -395
- package/public/sandbox/chunks/chunk-WFV5PPWJ.js +0 -194
- package/public/sandbox/chunks/chunk-YF6IO732.js +0 -206
- package/public/sandbox/chunks/chunk-ZUBABAAO.js +0 -86
|
@@ -1,194 +0,0 @@
|
|
|
1
|
-
// @logixjs/core subpath bundles for @logixjs/sandbox
|
|
2
|
-
|
|
3
|
-
import {
|
|
4
|
-
isDevEnv
|
|
5
|
-
} from "./chunk-CZRI7MHA.js";
|
|
6
|
-
import {
|
|
7
|
-
record
|
|
8
|
-
} from "./chunk-UKYAF3NL.js";
|
|
9
|
-
|
|
10
|
-
// ../logix-core/src/internal/runtime/core/TaskRunner.ts
|
|
11
|
-
import { Cause, Effect, Fiber, FiberRef, Ref, Stream } from "../effect.js";
|
|
12
|
-
var inSyncTransactionFiber = FiberRef.unsafeMake(false);
|
|
13
|
-
var forceSourceRefresh = FiberRef.unsafeMake(false);
|
|
14
|
-
var inSyncTransactionGlobalDepth = 0;
|
|
15
|
-
var enterSyncTransaction = () => {
|
|
16
|
-
inSyncTransactionGlobalDepth += 1;
|
|
17
|
-
};
|
|
18
|
-
var exitSyncTransaction = () => {
|
|
19
|
-
inSyncTransactionGlobalDepth = Math.max(0, inSyncTransactionGlobalDepth - 1);
|
|
20
|
-
};
|
|
21
|
-
var isInSyncTransaction = () => inSyncTransactionGlobalDepth > 0;
|
|
22
|
-
var resolve = (eff, payload) => typeof eff === "function" ? eff(payload) : eff;
|
|
23
|
-
var defaultOrigins = (triggerName) => ({
|
|
24
|
-
pending: {
|
|
25
|
-
kind: "task:pending",
|
|
26
|
-
name: triggerName
|
|
27
|
-
},
|
|
28
|
-
success: {
|
|
29
|
-
kind: "service-callback",
|
|
30
|
-
name: "task:success"
|
|
31
|
-
},
|
|
32
|
-
failure: {
|
|
33
|
-
kind: "service-callback",
|
|
34
|
-
name: "task:failure"
|
|
35
|
-
}
|
|
36
|
-
});
|
|
37
|
-
var shouldNoopInSyncTransactionFiber = (options) => Effect.gen(function* () {
|
|
38
|
-
const inTxn = yield* FiberRef.get(inSyncTransactionFiber);
|
|
39
|
-
if (!inTxn) {
|
|
40
|
-
return false;
|
|
41
|
-
}
|
|
42
|
-
if (isDevEnv()) {
|
|
43
|
-
yield* record({
|
|
44
|
-
type: "diagnostic",
|
|
45
|
-
moduleId: options.moduleId,
|
|
46
|
-
instanceId: options.instanceId,
|
|
47
|
-
code: options.code,
|
|
48
|
-
severity: options.severity,
|
|
49
|
-
message: options.message,
|
|
50
|
-
hint: options.hint,
|
|
51
|
-
actionTag: options.actionTag,
|
|
52
|
-
kind: options.kind
|
|
53
|
-
});
|
|
54
|
-
}
|
|
55
|
-
return true;
|
|
56
|
-
});
|
|
57
|
-
var resolveConcurrencyLimit = (runtime) => runtime.resolveConcurrencyPolicy ? runtime.resolveConcurrencyPolicy().pipe(Effect.map((p) => p.concurrencyLimit)) : Effect.succeed(16);
|
|
58
|
-
var runTaskLifecycle = (payload, runtime, config, getCanWriteBack) => Effect.gen(function* () {
|
|
59
|
-
const noop = yield* shouldNoopInSyncTransactionFiber({
|
|
60
|
-
moduleId: runtime.moduleId,
|
|
61
|
-
instanceId: runtime.instanceId,
|
|
62
|
-
code: "logic::invalid_usage",
|
|
63
|
-
severity: "error",
|
|
64
|
-
message: "run*Task is not allowed inside a synchronous StateTransaction body (it may deadlock the txnQueue).",
|
|
65
|
-
hint: "Call run*Task from the run section of a watcher (e.g. $.onAction/$.onState/$.on); do not call it directly inside a reducer / trait.run / synchronous transaction body. For long-lived flows, use a multi-entry pattern (pending \u2192 IO \u2192 writeback).",
|
|
66
|
-
kind: "run_task_in_transaction"
|
|
67
|
-
});
|
|
68
|
-
if (noop) {
|
|
69
|
-
return;
|
|
70
|
-
}
|
|
71
|
-
const defaults = defaultOrigins(config.triggerName);
|
|
72
|
-
const origins = {
|
|
73
|
-
pending: config.origin?.pending ?? defaults.pending,
|
|
74
|
-
success: config.origin?.success ?? defaults.success,
|
|
75
|
-
failure: config.origin?.failure ?? defaults.failure
|
|
76
|
-
};
|
|
77
|
-
const pending = config.pending;
|
|
78
|
-
if (pending) {
|
|
79
|
-
yield* Effect.uninterruptible(
|
|
80
|
-
runtime.runWithStateTransaction(origins.pending, () => Effect.asVoid(resolve(pending, payload)))
|
|
81
|
-
);
|
|
82
|
-
}
|
|
83
|
-
const io = resolve(config.effect, payload);
|
|
84
|
-
const exit = yield* Effect.exit(io);
|
|
85
|
-
if (getCanWriteBack) {
|
|
86
|
-
const ok = yield* getCanWriteBack;
|
|
87
|
-
if (!ok) {
|
|
88
|
-
return;
|
|
89
|
-
}
|
|
90
|
-
}
|
|
91
|
-
if (exit._tag === "Success") {
|
|
92
|
-
const success = config.success;
|
|
93
|
-
if (success) {
|
|
94
|
-
yield* runtime.runWithStateTransaction(origins.success, () => Effect.asVoid(success(exit.value, payload)));
|
|
95
|
-
}
|
|
96
|
-
return;
|
|
97
|
-
}
|
|
98
|
-
const cause = exit.cause;
|
|
99
|
-
if (Cause.isInterrupted(cause)) {
|
|
100
|
-
return;
|
|
101
|
-
}
|
|
102
|
-
const failure = config.failure;
|
|
103
|
-
if (failure) {
|
|
104
|
-
yield* runtime.runWithStateTransaction(origins.failure, () => Effect.asVoid(failure(cause, payload)));
|
|
105
|
-
}
|
|
106
|
-
}).pipe(
|
|
107
|
-
// Watchers must not crash as a whole due to a single task failure: swallow errors, but keep them diagnosable.
|
|
108
|
-
Effect.catchAllCause(
|
|
109
|
-
(cause) => record({
|
|
110
|
-
type: "diagnostic",
|
|
111
|
-
moduleId: runtime.moduleId,
|
|
112
|
-
instanceId: runtime.instanceId,
|
|
113
|
-
code: "task_runner::unhandled_failure",
|
|
114
|
-
severity: "error",
|
|
115
|
-
message: "TaskRunner encountered an unhandled failure (pending/IO/writeback).",
|
|
116
|
-
hint: "Add a failure writeback for this task or handle errors explicitly upstream; avoid fire-and-forget swallowing errors.",
|
|
117
|
-
actionTag: config.triggerName,
|
|
118
|
-
kind: "task_runner_unhandled_failure",
|
|
119
|
-
trigger: {
|
|
120
|
-
kind: "task",
|
|
121
|
-
name: config.triggerName
|
|
122
|
-
}
|
|
123
|
-
}).pipe(Effect.zipRight(Effect.logError("TaskRunner error", cause)))
|
|
124
|
-
)
|
|
125
|
-
);
|
|
126
|
-
var makeTaskRunner = (stream, mode, runtime, config) => {
|
|
127
|
-
if (mode === "latest") {
|
|
128
|
-
return Effect.gen(function* () {
|
|
129
|
-
const taskIdRef = yield* Ref.make(0);
|
|
130
|
-
const currentFiberRef = yield* Ref.make(void 0);
|
|
131
|
-
const start = (payload) => Effect.gen(function* () {
|
|
132
|
-
const taskId = yield* Ref.updateAndGet(taskIdRef, (n) => n + 1);
|
|
133
|
-
const prev = yield* Ref.get(currentFiberRef);
|
|
134
|
-
if (prev) {
|
|
135
|
-
yield* Fiber.interruptFork(prev);
|
|
136
|
-
}
|
|
137
|
-
const canWriteBack = Ref.get(taskIdRef).pipe(Effect.map((current) => current === taskId));
|
|
138
|
-
const fiber = yield* Effect.fork(
|
|
139
|
-
runTaskLifecycle(payload, runtime, config, canWriteBack)
|
|
140
|
-
);
|
|
141
|
-
yield* Ref.set(currentFiberRef, fiber);
|
|
142
|
-
});
|
|
143
|
-
return yield* Stream.runForEach(stream, start);
|
|
144
|
-
});
|
|
145
|
-
}
|
|
146
|
-
if (mode === "exhaust") {
|
|
147
|
-
return Effect.gen(function* () {
|
|
148
|
-
const concurrency = yield* resolveConcurrencyLimit(runtime);
|
|
149
|
-
const busyRef = yield* Ref.make(false);
|
|
150
|
-
const mapper = (payload) => Effect.gen(function* () {
|
|
151
|
-
const acquired = yield* Ref.modify(
|
|
152
|
-
busyRef,
|
|
153
|
-
(busy) => busy ? [false, busy] : [true, true]
|
|
154
|
-
);
|
|
155
|
-
if (!acquired) {
|
|
156
|
-
return;
|
|
157
|
-
}
|
|
158
|
-
try {
|
|
159
|
-
yield* runTaskLifecycle(payload, runtime, config);
|
|
160
|
-
} finally {
|
|
161
|
-
yield* Ref.set(busyRef, false);
|
|
162
|
-
}
|
|
163
|
-
});
|
|
164
|
-
return yield* Stream.runDrain(stream.pipe(Stream.mapEffect(mapper, { concurrency })));
|
|
165
|
-
});
|
|
166
|
-
}
|
|
167
|
-
if (mode === "parallel") {
|
|
168
|
-
return Effect.gen(function* () {
|
|
169
|
-
const concurrency = yield* resolveConcurrencyLimit(runtime);
|
|
170
|
-
return yield* Stream.runDrain(
|
|
171
|
-
stream.pipe(
|
|
172
|
-
Stream.mapEffect((payload) => runTaskLifecycle(payload, runtime, config), {
|
|
173
|
-
concurrency
|
|
174
|
-
})
|
|
175
|
-
)
|
|
176
|
-
);
|
|
177
|
-
});
|
|
178
|
-
}
|
|
179
|
-
return Stream.runForEach(
|
|
180
|
-
stream,
|
|
181
|
-
(payload) => runTaskLifecycle(payload, runtime, config)
|
|
182
|
-
);
|
|
183
|
-
};
|
|
184
|
-
|
|
185
|
-
export {
|
|
186
|
-
inSyncTransactionFiber,
|
|
187
|
-
forceSourceRefresh,
|
|
188
|
-
enterSyncTransaction,
|
|
189
|
-
exitSyncTransaction,
|
|
190
|
-
isInSyncTransaction,
|
|
191
|
-
shouldNoopInSyncTransactionFiber,
|
|
192
|
-
makeTaskRunner
|
|
193
|
-
};
|
|
194
|
-
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vbG9naXgtY29yZS9zcmMvaW50ZXJuYWwvcnVudGltZS9jb3JlL1Rhc2tSdW5uZXIudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbImltcG9ydCB7IENhdXNlLCBFZmZlY3QsIEZpYmVyLCBGaWJlclJlZiwgUmVmLCBTdHJlYW0gfSBmcm9tICdlZmZlY3QnXG5pbXBvcnQgKiBhcyBEZWJ1ZyBmcm9tICcuL0RlYnVnU2luay5qcydcbmltcG9ydCB7IGlzRGV2RW52IH0gZnJvbSAnLi9lbnYuanMnXG5pbXBvcnQgdHlwZSAqIGFzIExvZ2ljIGZyb20gJy4vTG9naWNNaWRkbGV3YXJlLmpzJ1xuaW1wb3J0IHR5cGUgeyBBbnlNb2R1bGVTaGFwZSB9IGZyb20gJy4vbW9kdWxlLmpzJ1xuaW1wb3J0IHR5cGUgeyBSdW50aW1lSW50ZXJuYWxzUmVzb2x2ZWRDb25jdXJyZW5jeVBvbGljeSB9IGZyb20gJy4vUnVudGltZUludGVybmFscy5qcydcbmltcG9ydCB0eXBlIHsgU3RhdGVUeG5PcmlnaW4gfSBmcm9tICcuL1N0YXRlVHJhbnNhY3Rpb24uanMnXG5cbi8qKlxuICogUHJldmVudHMgY2FsbGluZyBydW4qVGFzayBpbnNpZGUgYSBcInN5bmNocm9ub3VzIHRyYW5zYWN0aW9uIGV4ZWN1dGlvbiBmaWJlclwiIChpdCB3b3VsZCBkZWFkbG9jayB0aGUgdHhuUXVldWUpLlxuICpcbiAqIC0gTW9kdWxlUnVudGltZSBsb2NhbGx5IG1hcmtzIGl0IGFzIHRydWUgd2hpbGUgZXhlY3V0aW5nIGVhY2ggdHJhbnNhY3Rpb24gKGRpc3BhdGNoL3NvdXJjZS1yZWZyZXNoL2RldnRvb2xzLy4uLikuXG4gKiAtIHJ1bipUYXNrIGNoZWNrcyB0aGUgZmxhZyBvbiBzdGFydDogd2hlbiB0cnVlLCBpdCBlbWl0cyBkaWFnbm9zdGljcyBvbmx5IGluIGRldi90ZXN0IGFuZCB0aGVuIG5vLW9wcy5cbiAqL1xuZXhwb3J0IGNvbnN0IGluU3luY1RyYW5zYWN0aW9uRmliZXIgPSBGaWJlclJlZi51bnNhZmVNYWtlKGZhbHNlKVxuXG4vKipcbiAqIEZvcmNlIHNvdXJjZS5yZWZyZXNoOlxuICogLSBEZWZhdWx0OiB3aGVuIHNuYXBzaG90IGtleUhhc2ggaXMgdW5jaGFuZ2VkIGFuZCBhIG5vbi1pZGxlIHNuYXBzaG90IGFscmVhZHkgZXhpc3RzLCByZWZyZXNoIFNIT1VMRCBiZSBhIG5vLW9wXG4gKiAgIChhdm9pZCByZWR1bmRhbnQgSU8vd3JpdGViYWNrKS5cbiAqIC0gRXhjZXB0aW9uOiBleHBsaWNpdCByZWZyZXNoIChtYW51YWwgcmVmcmVzaCkgLyBpbnZhbGlkYXRpb24tZHJpdmVuIHJlZnJlc2ggbmVlZHMgdG8gXCJyZS1mZXRjaCBldmVuIHdpdGggdGhlIHNhbWUga2V5SGFzaFwiLlxuICpcbiAqIE5vdGU6IHVzZSBhIEZpYmVyUmVmIHRvIGxvY2FsbHkgcGFzcyBcIndoZXRoZXIgdGhpcyByZWZyZXNoIGlzIGZvcmNlZFwiLCBhdm9pZGluZyBleHBhbmRpbmcgdGhlIHNvdXJjZSByZWZyZXNoIGhhbmRsZXIgc2lnbmF0dXJlLlxuICovXG5leHBvcnQgY29uc3QgZm9yY2VTb3VyY2VSZWZyZXNoID0gRmliZXJSZWYudW5zYWZlTWFrZShmYWxzZSlcblxuLyoqXG4gKiBTeW5jaHJvbm91cyB0cmFuc2FjdGlvbiB3aW5kb3cgKHByb2Nlc3MtbGV2ZWwpIG1hcmtlcjpcbiAqIC0gVXNlZCBhcyBhIGhhcmQgZ3VhcmQgaW4gXCJub24tRWZmZWN0IEFQSVwiIGVudHJ5IHBvaW50cyAoZS5nLiBQcm9taXNlL2FzeW5jIGZ1bmN0aW9ucykuXG4gKiAtIEZpYmVyUmVmIGNhbm5vdCByZWxpYWJseSByZWFkIHRoZSBcImN1cnJlbnQgZmliZXJcIiBpbiBzdWNoIGVudHJ5IHBvaW50cywgc28gd2UgbmVlZCBhIHN5bmNocm9ub3VzIGNhbGxzdGFjay1sZXZlbCBtYXJrZXIuXG4gKlxuICogTm90ZTogaWYgYSB0cmFuc2FjdGlvbiBib2R5IGluY29ycmVjdGx5IGNyb3NzZXMgYXN5bmMgYm91bmRhcmllcywgdGhpcyBtYXJrZXIgd2lsbCBiZSBoZWxkIGxvbmdlcjsgdGhhdCBpcyBhIHNldmVyZSB2aW9sYXRpb24uXG4gKi9cbmxldCBpblN5bmNUcmFuc2FjdGlvbkdsb2JhbERlcHRoID0gMFxuXG5leHBvcnQgY29uc3QgZW50ZXJTeW5jVHJhbnNhY3Rpb24gPSAoKTogdm9pZCA9PiB7XG4gIGluU3luY1RyYW5zYWN0aW9uR2xvYmFsRGVwdGggKz0gMVxufVxuXG5leHBvcnQgY29uc3QgZXhpdFN5bmNUcmFuc2FjdGlvbiA9ICgpOiB2b2lkID0+IHtcbiAgaW5TeW5jVHJhbnNhY3Rpb25HbG9iYWxEZXB0aCA9IE1hdGgubWF4KDAsIGluU3luY1RyYW5zYWN0aW9uR2xvYmFsRGVwdGggLSAxKVxufVxuXG5leHBvcnQgY29uc3QgaXNJblN5bmNUcmFuc2FjdGlvbiA9ICgpOiBib29sZWFuID0+IGluU3luY1RyYW5zYWN0aW9uR2xvYmFsRGVwdGggPiAwXG5cbmV4cG9ydCB0eXBlIFRhc2tSdW5uZXJNb2RlID1cbiAgfCAndGFzaycgLy8gc2VxdWVudGlhbFxuICB8ICdwYXJhbGxlbCdcbiAgfCAnbGF0ZXN0J1xuICB8ICdleGhhdXN0J1xuXG5leHBvcnQgdHlwZSBUYXNrU3RhdHVzID0gJ2lkbGUnIHwgJ3BlbmRpbmcnIHwgJ3J1bm5pbmcnIHwgJ3N1Y2Nlc3MnIHwgJ2ZhaWx1cmUnIHwgJ2ludGVycnVwdGVkJ1xuXG5leHBvcnQgaW50ZXJmYWNlIFRhc2tFeGVjdXRpb24ge1xuICByZWFkb25seSB0YXNrSWQ6IG51bWJlclxuICByZWFkb25seSBzdGF0dXM6IFRhc2tTdGF0dXNcbiAgcmVhZG9ubHkgYWNjZXB0ZWRBdDogbnVtYmVyXG4gIHJlYWRvbmx5IHN0YXJ0ZWRBdD86IG51bWJlclxuICByZWFkb25seSBlbmRlZEF0PzogbnVtYmVyXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVGFza1J1bm5lck9yaWdpbnMge1xuICByZWFkb25seSBwZW5kaW5nPzogU3RhdGVUeG5PcmlnaW5cbiAgcmVhZG9ubHkgc3VjY2Vzcz86IFN0YXRlVHhuT3JpZ2luXG4gIHJlYWRvbmx5IGZhaWx1cmU/OiBTdGF0ZVR4bk9yaWdpblxufVxuXG50eXBlIFRhc2tIYW5kbGVyPFBheWxvYWQsIFNoIGV4dGVuZHMgQW55TW9kdWxlU2hhcGUsIFI+ID1cbiAgfCBMb2dpYy5PZjxTaCwgUiwgdm9pZCwgbmV2ZXI+XG4gIHwgKChwYXlsb2FkOiBQYXlsb2FkKSA9PiBMb2dpYy5PZjxTaCwgUiwgdm9pZCwgbmV2ZXI+KVxuXG50eXBlIFRhc2tFZmZlY3Q8UGF5bG9hZCwgU2ggZXh0ZW5kcyBBbnlNb2R1bGVTaGFwZSwgUiwgQSwgRT4gPVxuICB8IExvZ2ljLk9mPFNoLCBSLCBBLCBFPlxuICB8ICgocGF5bG9hZDogUGF5bG9hZCkgPT4gTG9naWMuT2Y8U2gsIFIsIEEsIEU+KVxuXG5leHBvcnQgaW50ZXJmYWNlIFRhc2tSdW5uZXJDb25maWc8UGF5bG9hZCwgU2ggZXh0ZW5kcyBBbnlNb2R1bGVTaGFwZSwgUiwgQSA9IHZvaWQsIEUgPSBuZXZlcj4ge1xuICAvKipcbiAgICogT3B0aW9uYWw6IHRyaWdnZXIgc291cmNlIG5hbWUgKGUuZy4gYWN0aW9uVGFnIC8gZmllbGRQYXRoKSwgdXNlZCBhcyB0aGUgZGVmYXVsdCBwZW5kaW5nIG9yaWdpbi5uYW1lLlxuICAgKiAtIEJvdW5kQXBpUnVudGltZSBtYXkgZmlsbCB0aGlzIGluIGZvciBvbkFjdGlvbihcInh4eFwiKSAvIHRyYWl0cy5zb3VyY2UucmVmcmVzaChcImZpZWxkXCIpLCBldGMuXG4gICAqIC0gT3RoZXIgY2FsbGVycyBhcmUgbm90IHJlcXVpcmVkIHRvIHByb3ZpZGUgaXQuXG4gICAqL1xuICByZWFkb25seSB0cmlnZ2VyTmFtZT86IHN0cmluZ1xuXG4gIC8qKlxuICAgKiBwZW5kaW5nOiBzeW5jaHJvbm91cyBzdGF0ZSB3cml0ZXMgKGxvYWRpbmc9dHJ1ZSAvIGNsZWFyaW5nIGVycm9ycywgZXRjLiksIGFsd2F5cyBhIHNlcGFyYXRlIHRyYW5zYWN0aW9uIGVudHJ5LlxuICAgKiAtIE9ubHkgZXhlY3V0ZWQgZm9yIHRhc2tzIHRoYXQgYXJlIGFjY2VwdGVkIGFuZCBhY3R1YWxseSBzdGFydGVkIChpZ25vcmVkIHRyaWdnZXJzIGluIHJ1bkV4aGF1c3RUYXNrIGRvIG5vdCBydW4gcGVuZGluZykuXG4gICAqL1xuICByZWFkb25seSBwZW5kaW5nPzogVGFza0hhbmRsZXI8UGF5bG9hZCwgU2gsIFI+XG5cbiAgLyoqXG4gICAqIGVmZmVjdDogcmVhbCBJTyAvIGFzeW5jIHdvcmsgKG11c3QgcnVuIG91dHNpZGUgdGhlIHRyYW5zYWN0aW9uIHdpbmRvdykuXG4gICAqL1xuICByZWFkb25seSBlZmZlY3Q6IFRhc2tFZmZlY3Q8UGF5bG9hZCwgU2gsIFIsIEEsIEU+XG5cbiAgLyoqXG4gICAqIHN1Y2Nlc3M6IHN1Y2Nlc3Mgd3JpdGViYWNrIChzZXBhcmF0ZSB0cmFuc2FjdGlvbiBlbnRyeSkuXG4gICAqL1xuICByZWFkb25seSBzdWNjZXNzPzogKHJlc3VsdDogQSwgcGF5bG9hZDogUGF5bG9hZCkgPT4gTG9naWMuT2Y8U2gsIFIsIHZvaWQsIG5ldmVyPlxuXG4gIC8qKlxuICAgKiBmYWlsdXJlOiBmYWlsdXJlIHdyaXRlYmFjayAoc2VwYXJhdGUgdHJhbnNhY3Rpb24gZW50cnkpLlxuICAgKlxuICAgKiBOb3RlOiB0YWtlcyBhIENhdXNlIHRvIHByZXNlcnZlIGRlZmVjdC9pbnRlcnJ1cHQgc2VtYW50aWNzOyBpbnRlcnJ1cHRzIGRvIG5vdCB0cmlnZ2VyIGZhaWx1cmUgd3JpdGViYWNrIGJ5IGRlZmF1bHQuXG4gICAqL1xuICByZWFkb25seSBmYWlsdXJlPzogKGNhdXNlOiBDYXVzZS5DYXVzZTxFPiwgcGF5bG9hZDogUGF5bG9hZCkgPT4gTG9naWMuT2Y8U2gsIFIsIHZvaWQsIG5ldmVyPlxuXG4gIC8qKlxuICAgKiBvcmlnaW46IG9wdGlvbmFsIG92ZXJyaWRlIGZvciB0aGUgdGhyZWUgdHJhbnNhY3Rpb24gb3JpZ2lucy5cbiAgICogLSBEZWZhdWx0OiBwZW5kaW5nLmtpbmQ9XCJ0YXNrOnBlbmRpbmdcIjsgc3VjY2Vzcy9mYWlsdXJlLmtpbmQ9XCJzZXJ2aWNlLWNhbGxiYWNrXCIuXG4gICAqL1xuICByZWFkb25seSBvcmlnaW4/OiBUYXNrUnVubmVyT3JpZ2luc1xuXG4gIC8qKlxuICAgKiBwcmlvcml0eTogcmVzZXJ2ZWQgZm9yIGZ1dHVyZSBkZWJ1Z2dpbmcvc29ydGluZzsgZG9lcyBub3QgY2hhbmdlIHRyYW5zYWN0aW9uIGJvdW5kYXJpZXMgb3IgY29uY3VycmVuY3kgc2VtYW50aWNzLlxuICAgKi9cbiAgcmVhZG9ubHkgcHJpb3JpdHk/OiBudW1iZXJcbn1cblxuZXhwb3J0IGludGVyZmFjZSBUYXNrUnVubmVyUnVudGltZSB7XG4gIHJlYWRvbmx5IG1vZHVsZUlkPzogc3RyaW5nXG4gIHJlYWRvbmx5IGluc3RhbmNlSWQ/OiBzdHJpbmdcbiAgcmVhZG9ubHkgcnVuV2l0aFN0YXRlVHJhbnNhY3Rpb246IChcbiAgICBvcmlnaW46IFN0YXRlVHhuT3JpZ2luLFxuICAgIGJvZHk6ICgpID0+IEVmZmVjdC5FZmZlY3Q8dm9pZCwgbmV2ZXIsIGFueT4sXG4gICkgPT4gRWZmZWN0LkVmZmVjdDx2b2lkLCBuZXZlciwgYW55PlxuICByZWFkb25seSByZXNvbHZlQ29uY3VycmVuY3lQb2xpY3k/OiAoKSA9PiBFZmZlY3QuRWZmZWN0PFJ1bnRpbWVJbnRlcm5hbHNSZXNvbHZlZENvbmN1cnJlbmN5UG9saWN5LCBuZXZlciwgYW55PlxufVxuXG5jb25zdCByZXNvbHZlID0gPFBheWxvYWQsIFNoIGV4dGVuZHMgQW55TW9kdWxlU2hhcGUsIFIsIEEsIEU+KFxuICBlZmY6IFRhc2tFZmZlY3Q8UGF5bG9hZCwgU2gsIFIsIEEsIEU+IHwgVGFza0hhbmRsZXI8UGF5bG9hZCwgU2gsIFI+LFxuICBwYXlsb2FkOiBQYXlsb2FkLFxuKTogYW55ID0+ICh0eXBlb2YgZWZmID09PSAnZnVuY3Rpb24nID8gKGVmZiBhcyBhbnkpKHBheWxvYWQpIDogZWZmKVxuXG5jb25zdCBkZWZhdWx0T3JpZ2lucyA9ICh0cmlnZ2VyTmFtZTogc3RyaW5nIHwgdW5kZWZpbmVkKTogUmVxdWlyZWQ8VGFza1J1bm5lck9yaWdpbnM+ID0+ICh7XG4gIHBlbmRpbmc6IHtcbiAgICBraW5kOiAndGFzazpwZW5kaW5nJyxcbiAgICBuYW1lOiB0cmlnZ2VyTmFtZSxcbiAgfSxcbiAgc3VjY2Vzczoge1xuICAgIGtpbmQ6ICdzZXJ2aWNlLWNhbGxiYWNrJyxcbiAgICBuYW1lOiAndGFzazpzdWNjZXNzJyxcbiAgfSxcbiAgZmFpbHVyZToge1xuICAgIGtpbmQ6ICdzZXJ2aWNlLWNhbGxiYWNrJyxcbiAgICBuYW1lOiAndGFzazpmYWlsdXJlJyxcbiAgfSxcbn0pXG5cbmV4cG9ydCBjb25zdCBzaG91bGROb29wSW5TeW5jVHJhbnNhY3Rpb25GaWJlciA9IChvcHRpb25zOiB7XG4gIHJlYWRvbmx5IG1vZHVsZUlkPzogc3RyaW5nXG4gIHJlYWRvbmx5IGluc3RhbmNlSWQ/OiBzdHJpbmdcbiAgcmVhZG9ubHkgY29kZTogc3RyaW5nXG4gIHJlYWRvbmx5IHNldmVyaXR5OiAnZXJyb3InIHwgJ3dhcm5pbmcnIHwgJ2luZm8nXG4gIHJlYWRvbmx5IG1lc3NhZ2U6IHN0cmluZ1xuICByZWFkb25seSBoaW50Pzogc3RyaW5nXG4gIHJlYWRvbmx5IGFjdGlvblRhZz86IHN0cmluZ1xuICByZWFkb25seSBraW5kPzogc3RyaW5nXG59KTogRWZmZWN0LkVmZmVjdDxib29sZWFuPiA9PlxuICBFZmZlY3QuZ2VuKGZ1bmN0aW9uKiAoKSB7XG4gICAgY29uc3QgaW5UeG4gPSB5aWVsZCogRmliZXJSZWYuZ2V0KGluU3luY1RyYW5zYWN0aW9uRmliZXIpXG4gICAgaWYgKCFpblR4bikge1xuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuICAgIC8vIEFsd2F5cyBuby1vcCByZWdhcmRsZXNzIG9mIGVudiAob3RoZXJ3aXNlIHdlIG1heSBkZWFkbG9jayk7IGRpYWdub3N0aWNzIGFyZSBlbWl0dGVkIG9ubHkgaW4gZGV2L3Rlc3QuXG4gICAgaWYgKGlzRGV2RW52KCkpIHtcbiAgICAgIHlpZWxkKiBEZWJ1Zy5yZWNvcmQoe1xuICAgICAgICB0eXBlOiAnZGlhZ25vc3RpYycsXG4gICAgICAgIG1vZHVsZUlkOiBvcHRpb25zLm1vZHVsZUlkLFxuICAgICAgICBpbnN0YW5jZUlkOiBvcHRpb25zLmluc3RhbmNlSWQsXG4gICAgICAgIGNvZGU6IG9wdGlvbnMuY29kZSxcbiAgICAgICAgc2V2ZXJpdHk6IG9wdGlvbnMuc2V2ZXJpdHksXG4gICAgICAgIG1lc3NhZ2U6IG9wdGlvbnMubWVzc2FnZSxcbiAgICAgICAgaGludDogb3B0aW9ucy5oaW50LFxuICAgICAgICBhY3Rpb25UYWc6IG9wdGlvbnMuYWN0aW9uVGFnLFxuICAgICAgICBraW5kOiBvcHRpb25zLmtpbmQsXG4gICAgICB9KVxuICAgIH1cbiAgICByZXR1cm4gdHJ1ZVxuICB9KVxuXG5jb25zdCByZXNvbHZlQ29uY3VycmVuY3lMaW1pdCA9IChydW50aW1lOiBUYXNrUnVubmVyUnVudGltZSk6IEVmZmVjdC5FZmZlY3Q8bnVtYmVyIHwgJ3VuYm91bmRlZCcsIG5ldmVyLCBhbnk+ID0+XG4gIHJ1bnRpbWUucmVzb2x2ZUNvbmN1cnJlbmN5UG9saWN5XG4gICAgPyBydW50aW1lLnJlc29sdmVDb25jdXJyZW5jeVBvbGljeSgpLnBpcGUoRWZmZWN0Lm1hcCgocCkgPT4gcC5jb25jdXJyZW5jeUxpbWl0KSlcbiAgICA6IEVmZmVjdC5zdWNjZWVkKDE2KVxuXG5jb25zdCBydW5UYXNrTGlmZWN5Y2xlID0gPFBheWxvYWQsIFNoIGV4dGVuZHMgQW55TW9kdWxlU2hhcGUsIFIsIEEsIEU+KFxuICBwYXlsb2FkOiBQYXlsb2FkLFxuICBydW50aW1lOiBUYXNrUnVubmVyUnVudGltZSxcbiAgY29uZmlnOiBUYXNrUnVubmVyQ29uZmlnPFBheWxvYWQsIFNoLCBSLCBBLCBFPixcbiAgZ2V0Q2FuV3JpdGVCYWNrPzogRWZmZWN0LkVmZmVjdDxib29sZWFuPixcbik6IEVmZmVjdC5FZmZlY3Q8dm9pZCwgbmV2ZXIsIExvZ2ljLkVudjxTaCwgUj4+ID0+XG4gIEVmZmVjdC5nZW4oZnVuY3Rpb24qICgpIHtcbiAgICBjb25zdCBub29wID0geWllbGQqIHNob3VsZE5vb3BJblN5bmNUcmFuc2FjdGlvbkZpYmVyKHtcbiAgICAgIG1vZHVsZUlkOiBydW50aW1lLm1vZHVsZUlkLFxuICAgICAgaW5zdGFuY2VJZDogcnVudGltZS5pbnN0YW5jZUlkLFxuICAgICAgY29kZTogJ2xvZ2ljOjppbnZhbGlkX3VzYWdlJyxcbiAgICAgIHNldmVyaXR5OiAnZXJyb3InLFxuICAgICAgbWVzc2FnZTogJ3J1bipUYXNrIGlzIG5vdCBhbGxvd2VkIGluc2lkZSBhIHN5bmNocm9ub3VzIFN0YXRlVHJhbnNhY3Rpb24gYm9keSAoaXQgbWF5IGRlYWRsb2NrIHRoZSB0eG5RdWV1ZSkuJyxcbiAgICAgIGhpbnQ6XG4gICAgICAgICdDYWxsIHJ1bipUYXNrIGZyb20gdGhlIHJ1biBzZWN0aW9uIG9mIGEgd2F0Y2hlciAoZS5nLiAkLm9uQWN0aW9uLyQub25TdGF0ZS8kLm9uKTsgJyArXG4gICAgICAgICdkbyBub3QgY2FsbCBpdCBkaXJlY3RseSBpbnNpZGUgYSByZWR1Y2VyIC8gdHJhaXQucnVuIC8gc3luY2hyb25vdXMgdHJhbnNhY3Rpb24gYm9keS4gRm9yIGxvbmctbGl2ZWQgZmxvd3MsIHVzZSBhIG11bHRpLWVudHJ5IHBhdHRlcm4gKHBlbmRpbmcgXHUyMTkyIElPIFx1MjE5MiB3cml0ZWJhY2spLicsXG4gICAgICBraW5kOiAncnVuX3Rhc2tfaW5fdHJhbnNhY3Rpb24nLFxuICAgIH0pXG4gICAgaWYgKG5vb3ApIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGNvbnN0IGRlZmF1bHRzID0gZGVmYXVsdE9yaWdpbnMoY29uZmlnLnRyaWdnZXJOYW1lKVxuICAgIGNvbnN0IG9yaWdpbnM6IFJlcXVpcmVkPFRhc2tSdW5uZXJPcmlnaW5zPiA9IHtcbiAgICAgIHBlbmRpbmc6IGNvbmZpZy5vcmlnaW4/LnBlbmRpbmcgPz8gZGVmYXVsdHMucGVuZGluZyxcbiAgICAgIHN1Y2Nlc3M6IGNvbmZpZy5vcmlnaW4/LnN1Y2Nlc3MgPz8gZGVmYXVsdHMuc3VjY2VzcyxcbiAgICAgIGZhaWx1cmU6IGNvbmZpZy5vcmlnaW4/LmZhaWx1cmUgPz8gZGVmYXVsdHMuZmFpbHVyZSxcbiAgICB9XG5cbiAgICAvLyAxKSBwZW5kaW5nOiBzZXBhcmF0ZSB0cmFuc2FjdGlvbiBlbnRyeTsgb25jZSBzdGFydGVkIGl0IHNob3VsZCBub3QgYmUgaW50ZXJydXB0ZWQgYnkgcnVuTGF0ZXN0LlxuICAgIGNvbnN0IHBlbmRpbmcgPSBjb25maWcucGVuZGluZ1xuICAgIGlmIChwZW5kaW5nKSB7XG4gICAgICB5aWVsZCogRWZmZWN0LnVuaW50ZXJydXB0aWJsZShcbiAgICAgICAgcnVudGltZS5ydW5XaXRoU3RhdGVUcmFuc2FjdGlvbihvcmlnaW5zLnBlbmRpbmcsICgpID0+IEVmZmVjdC5hc1ZvaWQocmVzb2x2ZShwZW5kaW5nLCBwYXlsb2FkKSkpLFxuICAgICAgKVxuICAgIH1cblxuICAgIC8vIDIpIElPOiBydW5zIG91dHNpZGUgdGhlIHRyYW5zYWN0aW9uIHdpbmRvdy5cbiAgICBjb25zdCBpbyA9IHJlc29sdmUoY29uZmlnLmVmZmVjdCwgcGF5bG9hZCkgYXMgRWZmZWN0LkVmZmVjdDxBLCBFLCBMb2dpYy5FbnY8U2gsIFI+PlxuICAgIGNvbnN0IGV4aXQgPSB5aWVsZCogRWZmZWN0LmV4aXQoaW8pXG5cbiAgICAvLyAzKSB3cml0ZWJhY2s6IHVzZSB0aGUgZ3VhcmQgdG8gY29uZmlybSBpdCdzIHN0aWxsIHRoZSBjdXJyZW50IHRhc2sgKHJ1bkxhdGVzdFRhc2spLlxuICAgIGlmIChnZXRDYW5Xcml0ZUJhY2spIHtcbiAgICAgIGNvbnN0IG9rID0geWllbGQqIGdldENhbldyaXRlQmFja1xuICAgICAgaWYgKCFvaykge1xuICAgICAgICByZXR1cm5cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoZXhpdC5fdGFnID09PSAnU3VjY2VzcycpIHtcbiAgICAgIGNvbnN0IHN1Y2Nlc3MgPSBjb25maWcuc3VjY2Vzc1xuICAgICAgaWYgKHN1Y2Nlc3MpIHtcbiAgICAgICAgeWllbGQqIHJ1bnRpbWUucnVuV2l0aFN0YXRlVHJhbnNhY3Rpb24ob3JpZ2lucy5zdWNjZXNzLCAoKSA9PiBFZmZlY3QuYXNWb2lkKHN1Y2Nlc3MoZXhpdC52YWx1ZSwgcGF5bG9hZCkpKVxuICAgICAgfVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgLy8gRmFpbHVyZTogaW50ZXJydXB0aW9ucyBkbyBub3QgdHJpZ2dlciBmYWlsdXJlIHdyaXRlYmFjayAoZS5nLiBydW5MYXRlc3RUYXNrIGNhbmNlbGxhdGlvbiwgU2NvcGUgZW5kaW5nKS5cbiAgICBjb25zdCBjYXVzZSA9IGV4aXQuY2F1c2UgYXMgQ2F1c2UuQ2F1c2U8RT5cbiAgICBpZiAoQ2F1c2UuaXNJbnRlcnJ1cHRlZChjYXVzZSkpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGNvbnN0IGZhaWx1cmUgPSBjb25maWcuZmFpbHVyZVxuICAgIGlmIChmYWlsdXJlKSB7XG4gICAgICB5aWVsZCogcnVudGltZS5ydW5XaXRoU3RhdGVUcmFuc2FjdGlvbihvcmlnaW5zLmZhaWx1cmUsICgpID0+IEVmZmVjdC5hc1ZvaWQoZmFpbHVyZShjYXVzZSwgcGF5bG9hZCkpKVxuICAgIH1cbiAgfSkucGlwZShcbiAgICAvLyBXYXRjaGVycyBtdXN0IG5vdCBjcmFzaCBhcyBhIHdob2xlIGR1ZSB0byBhIHNpbmdsZSB0YXNrIGZhaWx1cmU6IHN3YWxsb3cgZXJyb3JzLCBidXQga2VlcCB0aGVtIGRpYWdub3NhYmxlLlxuICAgIEVmZmVjdC5jYXRjaEFsbENhdXNlKChjYXVzZSkgPT5cbiAgICAgIERlYnVnLnJlY29yZCh7XG4gICAgICAgIHR5cGU6ICdkaWFnbm9zdGljJyxcbiAgICAgICAgbW9kdWxlSWQ6IHJ1bnRpbWUubW9kdWxlSWQsXG4gICAgICAgIGluc3RhbmNlSWQ6IHJ1bnRpbWUuaW5zdGFuY2VJZCxcbiAgICAgICAgY29kZTogJ3Rhc2tfcnVubmVyOjp1bmhhbmRsZWRfZmFpbHVyZScsXG4gICAgICAgIHNldmVyaXR5OiAnZXJyb3InLFxuICAgICAgICBtZXNzYWdlOiAnVGFza1J1bm5lciBlbmNvdW50ZXJlZCBhbiB1bmhhbmRsZWQgZmFpbHVyZSAocGVuZGluZy9JTy93cml0ZWJhY2spLicsXG4gICAgICAgIGhpbnQ6ICdBZGQgYSBmYWlsdXJlIHdyaXRlYmFjayBmb3IgdGhpcyB0YXNrIG9yIGhhbmRsZSBlcnJvcnMgZXhwbGljaXRseSB1cHN0cmVhbTsgYXZvaWQgZmlyZS1hbmQtZm9yZ2V0IHN3YWxsb3dpbmcgZXJyb3JzLicsXG4gICAgICAgIGFjdGlvblRhZzogY29uZmlnLnRyaWdnZXJOYW1lLFxuICAgICAgICBraW5kOiAndGFza19ydW5uZXJfdW5oYW5kbGVkX2ZhaWx1cmUnLFxuICAgICAgICB0cmlnZ2VyOiB7XG4gICAgICAgICAga2luZDogJ3Rhc2snLFxuICAgICAgICAgIG5hbWU6IGNvbmZpZy50cmlnZ2VyTmFtZSxcbiAgICAgICAgfSxcbiAgICAgIH0pLnBpcGUoRWZmZWN0LnppcFJpZ2h0KEVmZmVjdC5sb2dFcnJvcignVGFza1J1bm5lciBlcnJvcicsIGNhdXNlKSkpLFxuICAgICksXG4gICkgYXMgRWZmZWN0LkVmZmVjdDx2b2lkLCBuZXZlciwgTG9naWMuRW52PFNoLCBSPj5cblxuLyoqXG4gKiBtYWtlVGFza1J1bm5lclx1RkYxQVxuICogLSBSZXVzZXMgRmxvd1J1bnRpbWUgY29uY3VycmVuY3kgc2VtYW50aWNzIChzZXF1ZW50aWFsL3BhcmFsbGVsL2xhdGVzdC9leGhhdXN0KS5cbiAqIC0gU3BsaXRzIGEgc2luZ2xlIHRyaWdnZXIgaW50bzogcGVuZGluZyAoc2VwYXJhdGUgdHhuKSBcdTIxOTIgSU8gXHUyMTkyIHN1Y2Nlc3MvZmFpbHVyZSAoc2VwYXJhdGUgdHhuKS5cbiAqL1xuZXhwb3J0IGNvbnN0IG1ha2VUYXNrUnVubmVyID0gPFBheWxvYWQsIFNoIGV4dGVuZHMgQW55TW9kdWxlU2hhcGUsIFIsIEEgPSB2b2lkLCBFID0gbmV2ZXI+KFxuICBzdHJlYW06IFN0cmVhbS5TdHJlYW08UGF5bG9hZD4sXG4gIG1vZGU6IFRhc2tSdW5uZXJNb2RlLFxuICBydW50aW1lOiBUYXNrUnVubmVyUnVudGltZSxcbiAgY29uZmlnOiBUYXNrUnVubmVyQ29uZmlnPFBheWxvYWQsIFNoLCBSLCBBLCBFPixcbik6IEVmZmVjdC5FZmZlY3Q8dm9pZCwgbmV2ZXIsIExvZ2ljLkVudjxTaCwgUj4+ID0+IHtcbiAgaWYgKG1vZGUgPT09ICdsYXRlc3QnKSB7XG4gICAgcmV0dXJuIEVmZmVjdC5nZW4oZnVuY3Rpb24qICgpIHtcbiAgICAgIGNvbnN0IHRhc2tJZFJlZiA9IHlpZWxkKiBSZWYubWFrZSgwKVxuICAgICAgY29uc3QgY3VycmVudEZpYmVyUmVmID0geWllbGQqIFJlZi5tYWtlPEZpYmVyLlJ1bnRpbWVGaWJlcjx2b2lkLCBuZXZlcj4gfCB1bmRlZmluZWQ+KHVuZGVmaW5lZClcblxuICAgICAgY29uc3Qgc3RhcnQgPSAocGF5bG9hZDogUGF5bG9hZCkgPT5cbiAgICAgICAgRWZmZWN0LmdlbihmdW5jdGlvbiogKCkge1xuICAgICAgICAgIGNvbnN0IHRhc2tJZCA9IHlpZWxkKiBSZWYudXBkYXRlQW5kR2V0KHRhc2tJZFJlZiwgKG4pID0+IG4gKyAxKVxuXG4gICAgICAgICAgY29uc3QgcHJldiA9IHlpZWxkKiBSZWYuZ2V0KGN1cnJlbnRGaWJlclJlZilcbiAgICAgICAgICBpZiAocHJldikge1xuICAgICAgICAgICAgLy8gRG8gbm90IHdhaXQgZm9yIHRoZSBvbGQgZmliZXIgdG8gZnVsbHkgZW5kIChhdm9pZCBibG9ja2luZyBuZXcgdHJpZ2dlcnMpOyB3cml0ZWJhY2sgaXMgZ3VhcmRlZCBieSB0YXNrSWQuXG4gICAgICAgICAgICB5aWVsZCogRmliZXIuaW50ZXJydXB0Rm9yayhwcmV2KVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IGNhbldyaXRlQmFjayA9IFJlZi5nZXQodGFza0lkUmVmKS5waXBlKEVmZmVjdC5tYXAoKGN1cnJlbnQpID0+IGN1cnJlbnQgPT09IHRhc2tJZCkpXG5cbiAgICAgICAgICBjb25zdCBmaWJlciA9IHlpZWxkKiBFZmZlY3QuZm9yayhcbiAgICAgICAgICAgIHJ1blRhc2tMaWZlY3ljbGU8UGF5bG9hZCwgU2gsIFIsIEEsIEU+KHBheWxvYWQsIHJ1bnRpbWUsIGNvbmZpZywgY2FuV3JpdGVCYWNrKSxcbiAgICAgICAgICApXG5cbiAgICAgICAgICB5aWVsZCogUmVmLnNldChjdXJyZW50RmliZXJSZWYsIGZpYmVyKVxuICAgICAgICB9KVxuXG4gICAgICByZXR1cm4geWllbGQqIFN0cmVhbS5ydW5Gb3JFYWNoKHN0cmVhbSwgc3RhcnQpXG4gICAgfSlcbiAgfVxuXG4gIGlmIChtb2RlID09PSAnZXhoYXVzdCcpIHtcbiAgICByZXR1cm4gRWZmZWN0LmdlbihmdW5jdGlvbiogKCkge1xuICAgICAgY29uc3QgY29uY3VycmVuY3kgPSB5aWVsZCogcmVzb2x2ZUNvbmN1cnJlbmN5TGltaXQocnVudGltZSlcbiAgICAgIGNvbnN0IGJ1c3lSZWYgPSB5aWVsZCogUmVmLm1ha2UoZmFsc2UpXG5cbiAgICAgIGNvbnN0IG1hcHBlciA9IChwYXlsb2FkOiBQYXlsb2FkKSA9PlxuICAgICAgICBFZmZlY3QuZ2VuKGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgY29uc3QgYWNxdWlyZWQgPSB5aWVsZCogUmVmLm1vZGlmeShidXN5UmVmLCAoYnVzeSkgPT5cbiAgICAgICAgICAgIGJ1c3kgPyAoW2ZhbHNlLCBidXN5XSBhcyBjb25zdCkgOiAoW3RydWUsIHRydWVdIGFzIGNvbnN0KSxcbiAgICAgICAgICApXG4gICAgICAgICAgaWYgKCFhY3F1aXJlZCkge1xuICAgICAgICAgICAgLy8gSWdub3JlIHRyaWdnZXI6IG5vIHBlbmRpbmcgdHJhbnNhY3Rpb24gaXMgcHJvZHVjZWQuXG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICB9XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHlpZWxkKiBydW5UYXNrTGlmZWN5Y2xlPFBheWxvYWQsIFNoLCBSLCBBLCBFPihwYXlsb2FkLCBydW50aW1lLCBjb25maWcpXG4gICAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgIHlpZWxkKiBSZWYuc2V0KGJ1c3lSZWYsIGZhbHNlKVxuICAgICAgICAgIH1cbiAgICAgICAgfSlcblxuICAgICAgcmV0dXJuIHlpZWxkKiBTdHJlYW0ucnVuRHJhaW4oc3RyZWFtLnBpcGUoU3RyZWFtLm1hcEVmZmVjdChtYXBwZXIsIHsgY29uY3VycmVuY3kgfSkpKVxuICAgIH0pIGFzIEVmZmVjdC5FZmZlY3Q8dm9pZCwgbmV2ZXIsIExvZ2ljLkVudjxTaCwgUj4+XG4gIH1cblxuICBpZiAobW9kZSA9PT0gJ3BhcmFsbGVsJykge1xuICAgIHJldHVybiBFZmZlY3QuZ2VuKGZ1bmN0aW9uKiAoKSB7XG4gICAgICBjb25zdCBjb25jdXJyZW5jeSA9IHlpZWxkKiByZXNvbHZlQ29uY3VycmVuY3lMaW1pdChydW50aW1lKVxuXG4gICAgICByZXR1cm4geWllbGQqIFN0cmVhbS5ydW5EcmFpbihcbiAgICAgICAgc3RyZWFtLnBpcGUoXG4gICAgICAgICAgU3RyZWFtLm1hcEVmZmVjdCgocGF5bG9hZCkgPT4gcnVuVGFza0xpZmVjeWNsZTxQYXlsb2FkLCBTaCwgUiwgQSwgRT4ocGF5bG9hZCwgcnVudGltZSwgY29uZmlnKSwge1xuICAgICAgICAgICAgY29uY3VycmVuY3ksXG4gICAgICAgICAgfSksXG4gICAgICAgICksXG4gICAgICApXG4gICAgfSkgYXMgRWZmZWN0LkVmZmVjdDx2b2lkLCBuZXZlciwgTG9naWMuRW52PFNoLCBSPj5cbiAgfVxuXG4gIC8vIG1vZGUgPT09IFwidGFza1wiXHVGRjA4c2VxdWVudGlhbFx1RkYwOVxuICByZXR1cm4gU3RyZWFtLnJ1bkZvckVhY2goc3RyZWFtLCAocGF5bG9hZCkgPT5cbiAgICBydW5UYXNrTGlmZWN5Y2xlPFBheWxvYWQsIFNoLCBSLCBBLCBFPihwYXlsb2FkLCBydW50aW1lLCBjb25maWcpLFxuICApIGFzIEVmZmVjdC5FZmZlY3Q8dm9pZCwgbmV2ZXIsIExvZ2ljLkVudjxTaCwgUj4+XG59XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7O0FBQUEsU0FBUyxPQUFPLFFBQVEsT0FBTyxVQUFVLEtBQUssY0FBYztBQWNyRCxJQUFNLHlCQUF5QixTQUFTLFdBQVcsS0FBSztBQVV4RCxJQUFNLHFCQUFxQixTQUFTLFdBQVcsS0FBSztBQVMzRCxJQUFJLCtCQUErQjtBQUU1QixJQUFNLHVCQUF1QixNQUFZO0FBQzlDLGtDQUFnQztBQUNsQztBQUVPLElBQU0sc0JBQXNCLE1BQVk7QUFDN0MsaUNBQStCLEtBQUssSUFBSSxHQUFHLCtCQUErQixDQUFDO0FBQzdFO0FBRU8sSUFBTSxzQkFBc0IsTUFBZSwrQkFBK0I7QUFxRmpGLElBQU0sVUFBVSxDQUNkLEtBQ0EsWUFDUyxPQUFPLFFBQVEsYUFBYyxJQUFZLE9BQU8sSUFBSTtBQUUvRCxJQUFNLGlCQUFpQixDQUFDLGlCQUFrRTtBQUFBLEVBQ3hGLFNBQVM7QUFBQSxJQUNQLE1BQU07QUFBQSxJQUNOLE1BQU07QUFBQSxFQUNSO0FBQUEsRUFDQSxTQUFTO0FBQUEsSUFDUCxNQUFNO0FBQUEsSUFDTixNQUFNO0FBQUEsRUFDUjtBQUFBLEVBQ0EsU0FBUztBQUFBLElBQ1AsTUFBTTtBQUFBLElBQ04sTUFBTTtBQUFBLEVBQ1I7QUFDRjtBQUVPLElBQU0sbUNBQW1DLENBQUMsWUFVL0MsT0FBTyxJQUFJLGFBQWE7QUFDdEIsUUFBTSxRQUFRLE9BQU8sU0FBUyxJQUFJLHNCQUFzQjtBQUN4RCxNQUFJLENBQUMsT0FBTztBQUNWLFdBQU87QUFBQSxFQUNUO0FBRUEsTUFBSSxTQUFTLEdBQUc7QUFDZCxXQUFhLE9BQU87QUFBQSxNQUNsQixNQUFNO0FBQUEsTUFDTixVQUFVLFFBQVE7QUFBQSxN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
|
|
@@ -1,206 +0,0 @@
|
|
|
1
|
-
// @logixjs/core subpath bundles for @logixjs/sandbox
|
|
2
|
-
|
|
3
|
-
import {
|
|
4
|
-
isLogicPlanEffect,
|
|
5
|
-
make as make2,
|
|
6
|
-
markAsLogicPlanEffect
|
|
7
|
-
} from "./chunk-PQ652ULI.js";
|
|
8
|
-
import {
|
|
9
|
-
LogicPhaseServiceTag,
|
|
10
|
-
LogicUnitServiceTag,
|
|
11
|
-
make
|
|
12
|
-
} from "./chunk-JIXTOQXJ.js";
|
|
13
|
-
|
|
14
|
-
// ../logix-core/src/internal/runtime/ModuleFactory.ts
|
|
15
|
-
import { Context, Effect, Layer, Option, Schema } from "../effect.js";
|
|
16
|
-
function Link(modules, logic) {
|
|
17
|
-
return Effect.gen(function* () {
|
|
18
|
-
const handles = {};
|
|
19
|
-
for (const [key, module] of Object.entries(modules)) {
|
|
20
|
-
const runtime = yield* module;
|
|
21
|
-
handles[key] = {
|
|
22
|
-
read: (selector) => Effect.map(runtime.getState, selector),
|
|
23
|
-
changes: runtime.changes,
|
|
24
|
-
dispatch: runtime.dispatch,
|
|
25
|
-
actions$: runtime.actions$,
|
|
26
|
-
actions: new Proxy(
|
|
27
|
-
{},
|
|
28
|
-
{
|
|
29
|
-
get: (_target, prop) => (payload) => runtime.dispatch({ _tag: prop, payload })
|
|
30
|
-
}
|
|
31
|
-
)
|
|
32
|
-
};
|
|
33
|
-
}
|
|
34
|
-
return yield* logic(
|
|
35
|
-
handles
|
|
36
|
-
);
|
|
37
|
-
});
|
|
38
|
-
}
|
|
39
|
-
function Module(id, def) {
|
|
40
|
-
const shape = {
|
|
41
|
-
stateSchema: def.state,
|
|
42
|
-
actionSchema: Schema.Union(
|
|
43
|
-
...Object.entries(def.actions).map(([tag2, token]) => {
|
|
44
|
-
const payload = token.schema;
|
|
45
|
-
return Schema.Struct(
|
|
46
|
-
payload === Schema.Void ? {
|
|
47
|
-
_tag: Schema.Literal(tag2),
|
|
48
|
-
payload: Schema.optional(payload)
|
|
49
|
-
} : {
|
|
50
|
-
_tag: Schema.Literal(tag2),
|
|
51
|
-
payload
|
|
52
|
-
}
|
|
53
|
-
);
|
|
54
|
-
})
|
|
55
|
-
),
|
|
56
|
-
actionMap: def.actions
|
|
57
|
-
};
|
|
58
|
-
const reducers = def.reducers && Object.fromEntries(
|
|
59
|
-
Object.entries(def.reducers).map(([tag2, reducer]) => [
|
|
60
|
-
tag2,
|
|
61
|
-
(state, action, sink) => (
|
|
62
|
-
// Relies on the runtime `_tag` convention: only actions matching the current tag are routed to this reducer.
|
|
63
|
-
reducer(
|
|
64
|
-
state,
|
|
65
|
-
action,
|
|
66
|
-
sink
|
|
67
|
-
)
|
|
68
|
-
)
|
|
69
|
-
])
|
|
70
|
-
);
|
|
71
|
-
class ModuleTag extends Context.Tag(`@logixjs/Module/${id}`)() {
|
|
72
|
-
}
|
|
73
|
-
const tag = ModuleTag;
|
|
74
|
-
const moduleTag = Object.assign(tag, {
|
|
75
|
-
_kind: "ModuleTag",
|
|
76
|
-
id,
|
|
77
|
-
shape,
|
|
78
|
-
stateSchema: shape.stateSchema,
|
|
79
|
-
actionSchema: shape.actionSchema,
|
|
80
|
-
actions: shape.actionMap,
|
|
81
|
-
reducers: def.reducers,
|
|
82
|
-
/**
|
|
83
|
-
* Build a Logic program for the current Module:
|
|
84
|
-
* - Read its ModuleRuntime from Context at runtime.
|
|
85
|
-
* - Build a BoundApi from the runtime.
|
|
86
|
-
* - Pass the BoundApi to the caller to build business logic.
|
|
87
|
-
*/
|
|
88
|
-
logic: (build) => {
|
|
89
|
-
const logicEffect = Effect.gen(function* () {
|
|
90
|
-
const runtime = yield* tag;
|
|
91
|
-
const logicUnit = yield* Effect.serviceOption(LogicUnitServiceTag).pipe(
|
|
92
|
-
Effect.map(Option.getOrUndefined)
|
|
93
|
-
);
|
|
94
|
-
const phaseService = yield* Effect.serviceOption(LogicPhaseServiceTag).pipe(
|
|
95
|
-
Effect.map(Option.getOrUndefined)
|
|
96
|
-
);
|
|
97
|
-
const api = make(shape, runtime, {
|
|
98
|
-
getPhase: () => phaseService?.current ?? "run",
|
|
99
|
-
phaseService,
|
|
100
|
-
moduleId: id,
|
|
101
|
-
logicUnit
|
|
102
|
-
});
|
|
103
|
-
let built;
|
|
104
|
-
try {
|
|
105
|
-
built = build(api);
|
|
106
|
-
} catch (err) {
|
|
107
|
-
if (err?._tag === "LogicPhaseError") {
|
|
108
|
-
return yield* Effect.fail(err);
|
|
109
|
-
}
|
|
110
|
-
throw err;
|
|
111
|
-
}
|
|
112
|
-
if (isLogicPlanEffect(built)) {
|
|
113
|
-
return yield* built;
|
|
114
|
-
}
|
|
115
|
-
const isLogicPlan = (value) => Boolean(value && typeof value === "object" && "setup" in value && "run" in value);
|
|
116
|
-
const plan = isLogicPlan(built) ? built : {
|
|
117
|
-
setup: Effect.void,
|
|
118
|
-
run: built
|
|
119
|
-
};
|
|
120
|
-
return plan;
|
|
121
|
-
});
|
|
122
|
-
markAsLogicPlanEffect(logicEffect);
|
|
123
|
-
return logicEffect;
|
|
124
|
-
},
|
|
125
|
-
/**
|
|
126
|
-
* live: given an initial state and a set of logics, construct a scoped ModuleRuntime Layer.
|
|
127
|
-
*
|
|
128
|
-
* Env conventions:
|
|
129
|
-
* - R represents extra environment required by the logics (services / platform, etc.).
|
|
130
|
-
* - ModuleRuntime itself only depends on Scope.Scope and is managed by Layer.scoped.
|
|
131
|
-
*/
|
|
132
|
-
live: (initial, ...logics) => Layer.scoped(
|
|
133
|
-
tag,
|
|
134
|
-
make2(initial, {
|
|
135
|
-
tag,
|
|
136
|
-
logics,
|
|
137
|
-
moduleId: id,
|
|
138
|
-
reducers
|
|
139
|
-
})
|
|
140
|
-
),
|
|
141
|
-
/**
|
|
142
|
-
* implement: build a ModuleImpl blueprint from Module definition + initial state + a set of logics.
|
|
143
|
-
*
|
|
144
|
-
* - R represents the Env required by the logics.
|
|
145
|
-
* - The returned ModuleImpl.layer carries R as its input environment.
|
|
146
|
-
* - withLayer/withLayers can progressively narrow R to a more concrete Env (even never).
|
|
147
|
-
*/
|
|
148
|
-
implement: (config) => {
|
|
149
|
-
const importedModules = (config.imports ?? []).flatMap((item) => {
|
|
150
|
-
if (item._tag === "ModuleImpl") {
|
|
151
|
-
return [
|
|
152
|
-
item.module
|
|
153
|
-
];
|
|
154
|
-
}
|
|
155
|
-
return [];
|
|
156
|
-
});
|
|
157
|
-
const baseLayer = Layer.scoped(
|
|
158
|
-
tag,
|
|
159
|
-
make2(config.initial, {
|
|
160
|
-
tag,
|
|
161
|
-
logics: config.logics || [],
|
|
162
|
-
processes: config.processes || [],
|
|
163
|
-
moduleId: id,
|
|
164
|
-
imports: importedModules,
|
|
165
|
-
reducers,
|
|
166
|
-
stateTransaction: config.stateTransaction
|
|
167
|
-
})
|
|
168
|
-
);
|
|
169
|
-
const processes = config.processes ?? [];
|
|
170
|
-
const makeImplWithLayer = (layer) => ({
|
|
171
|
-
_tag: "ModuleImpl",
|
|
172
|
-
module: moduleTag,
|
|
173
|
-
layer,
|
|
174
|
-
processes,
|
|
175
|
-
stateTransaction: config.stateTransaction,
|
|
176
|
-
withLayer: (extra) => {
|
|
177
|
-
const provided = layer.pipe(Layer.provide(extra));
|
|
178
|
-
const merged = Layer.mergeAll(provided, extra);
|
|
179
|
-
return makeImplWithLayer(merged);
|
|
180
|
-
},
|
|
181
|
-
withLayers: (...extras) => extras.reduce(
|
|
182
|
-
(implAcc, extra) => implAcc.withLayer(extra),
|
|
183
|
-
makeImplWithLayer(
|
|
184
|
-
layer
|
|
185
|
-
)
|
|
186
|
-
)
|
|
187
|
-
});
|
|
188
|
-
const initialImpl = makeImplWithLayer(
|
|
189
|
-
baseLayer
|
|
190
|
-
);
|
|
191
|
-
const imports = config.imports ?? [];
|
|
192
|
-
const finalImpl = imports.reduce((implAcc, item) => {
|
|
193
|
-
const layer = item._tag === "ModuleImpl" ? item.layer : item;
|
|
194
|
-
return implAcc.withLayer(layer);
|
|
195
|
-
}, initialImpl);
|
|
196
|
-
return finalImpl;
|
|
197
|
-
}
|
|
198
|
-
});
|
|
199
|
-
return moduleTag;
|
|
200
|
-
}
|
|
201
|
-
|
|
202
|
-
export {
|
|
203
|
-
Link,
|
|
204
|
-
Module
|
|
205
|
-
};
|
|
206
|
-
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vbG9naXgtY29yZS9zcmMvaW50ZXJuYWwvcnVudGltZS9Nb2R1bGVGYWN0b3J5LnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyJpbXBvcnQgeyBDb250ZXh0LCBFZmZlY3QsIExheWVyLCBPcHRpb24sIFNjaGVtYSB9IGZyb20gJ2VmZmVjdCdcbmltcG9ydCAqIGFzIE1vZHVsZVJ1bnRpbWVJbXBsIGZyb20gJy4vTW9kdWxlUnVudGltZS5qcydcbmltcG9ydCAqIGFzIEJvdW5kQXBpUnVudGltZSBmcm9tICcuL0JvdW5kQXBpUnVudGltZS5qcydcbmltcG9ydCAqIGFzIExvZ2ljRGlhZ25vc3RpY3MgZnJvbSAnLi9jb3JlL0xvZ2ljRGlhZ25vc3RpY3MuanMnXG5pbXBvcnQgKiBhcyBMb2dpY1BsYW5NYXJrZXIgZnJvbSAnLi9jb3JlL0xvZ2ljUGxhbk1hcmtlci5qcydcbmltcG9ydCB0eXBlICogYXMgQWN0aW9uIGZyb20gJy4uL2FjdGlvbi5qcydcbmltcG9ydCB0eXBlIHsgRmllbGRQYXRoIH0gZnJvbSAnLi4vZmllbGQtcGF0aC5qcydcbmltcG9ydCB0eXBlIHtcbiAgQW55TW9kdWxlU2hhcGUsXG4gIEFueVNjaGVtYSxcbiAgQWN0aW9uc0Zyb21NYXAsXG4gIE1vZHVsZVRhZyBhcyBMb2dpeE1vZHVsZVRhZyxcbiAgTW9kdWxlU2hhcGUsXG4gIFJlZHVjZXJzRnJvbU1hcCxcbiAgU3RhdGVPZixcbiAgQWN0aW9uT2YsXG4gIE1vZHVsZUhhbmRsZSxcbiAgTW9kdWxlTG9naWMsXG4gIE1vZHVsZUltcGwsXG4gIE1vZHVsZUltcGxlbWVudFN0YXRlVHJhbnNhY3Rpb25PcHRpb25zLFxufSBmcm9tICcuL2NvcmUvbW9kdWxlLmpzJ1xuXG4vKipcbiAqIHYzOiBMaW5rIChmb3JtZXJseSBPcmNoZXN0cmF0b3IpXG4gKiBBIGdsdWUgbGF5ZXIgZm9yIGNyb3NzLW1vZHVsZSBjb2xsYWJvcmF0aW9uLlxuICpcbiAqIC0gRG9lcyBub3Qgb3duIGl0cyBvd24gU3RhdGUuXG4gKiAtIENhbiBhY2Nlc3MgbXVsdGlwbGUgTW9kdWxlcycgcmVhZG9ubHkgaGFuZGxlcy5cbiAqIC0gQ2FuIGRlZmluZSBMb2dpYyBvbmx5OyBjYW5ub3QgZGVmaW5lIFN0YXRlL0FjdGlvbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIExpbms8TW9kdWxlcyBleHRlbmRzIFJlY29yZDxzdHJpbmcsIExvZ2l4TW9kdWxlVGFnPGFueSwgQW55TW9kdWxlU2hhcGU+PiwgRSA9IG5ldmVyLCBSID0gbmV2ZXI+KFxuICBtb2R1bGVzOiBNb2R1bGVzLFxuICBsb2dpYzogKCQ6IHsgW0sgaW4ga2V5b2YgTW9kdWxlc106IE1vZHVsZUhhbmRsZTxNb2R1bGVzW0tdWydzaGFwZSddPiB9KSA9PiBFZmZlY3QuRWZmZWN0PHZvaWQsIEUsIFI+LFxuKTogRWZmZWN0LkVmZmVjdDx2b2lkLCBFLCBSPiB7XG4gIHJldHVybiBFZmZlY3QuZ2VuKGZ1bmN0aW9uKiAoKSB7XG4gICAgY29uc3QgaGFuZGxlczogUmVjb3JkPHN0cmluZywgTW9kdWxlSGFuZGxlPEFueU1vZHVsZVNoYXBlPj4gPSB7fVxuXG4gICAgZm9yIChjb25zdCBba2V5LCBtb2R1bGVdIG9mIE9iamVjdC5lbnRyaWVzKG1vZHVsZXMpKSB7XG4gICAgICBjb25zdCBydW50aW1lID0geWllbGQqIG1vZHVsZVxuXG4gICAgICBoYW5kbGVzW2tleV0gPSB7XG4gICAgICAgIHJlYWQ6IChzZWxlY3RvcjogYW55KSA9PiBFZmZlY3QubWFwKHJ1bnRpbWUuZ2V0U3RhdGUsIHNlbGVjdG9yKSxcbiAgICAgICAgY2hhbmdlczogcnVudGltZS5jaGFuZ2VzLFxuICAgICAgICBkaXNwYXRjaDogcnVudGltZS5kaXNwYXRjaCxcbiAgICAgICAgYWN0aW9ucyQ6IHJ1bnRpbWUuYWN0aW9ucyQsXG4gICAgICAgIGFjdGlvbnM6IG5ldyBQcm94eShcbiAgICAgICAgICB7fSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBnZXQ6IChfdGFyZ2V0LCBwcm9wKSA9PiAocGF5bG9hZDogYW55KSA9PiBydW50aW1lLmRpc3BhdGNoKHsgX3RhZzogcHJvcCBhcyBzdHJpbmcsIHBheWxvYWQgfSksXG4gICAgICAgICAgfSxcbiAgICAgICAgKSxcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4geWllbGQqIGxvZ2ljKFxuICAgICAgaGFuZGxlcyBhcyB7XG4gICAgICAgIFtLIGluIGtleW9mIE1vZHVsZXNdOiBNb2R1bGVIYW5kbGU8TW9kdWxlc1tLXVsnc2hhcGUnXT5cbiAgICAgIH0sXG4gICAgKVxuICB9KVxufVxuXG4vKipcbiAqIE1vZHVsZSBmYWN0b3J5IGltcGxlbWVudGF0aW9uOiBjb25zdHJ1Y3QgYSBNb2R1bGVUYWcgZnJvbSBhbiBpZCBhbmQgU2NoZW1hIGRlZmluaXRpb25zLlxuICovXG5leHBvcnQgZnVuY3Rpb24gTW9kdWxlPElkIGV4dGVuZHMgc3RyaW5nLCBTU2NoZW1hIGV4dGVuZHMgQW55U2NoZW1hLCBBTWFwIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgQWN0aW9uLkFueUFjdGlvblRva2VuPj4oXG4gIGlkOiBJZCxcbiAgZGVmOiB7XG4gICAgcmVhZG9ubHkgc3RhdGU6IFNTY2hlbWFcbiAgICByZWFkb25seSBhY3Rpb25zOiBBTWFwXG4gICAgcmVhZG9ubHkgcmVkdWNlcnM/OiBSZWR1Y2Vyc0Zyb21NYXA8U1NjaGVtYSwgQU1hcD5cbiAgfSxcbik6IExvZ2l4TW9kdWxlVGFnPElkLCBNb2R1bGVTaGFwZTxTU2NoZW1hLCBTY2hlbWEuU2NoZW1hPEFjdGlvbnNGcm9tTWFwPEFNYXA+PiwgQU1hcD4+IHtcbiAgY29uc3Qgc2hhcGU6IE1vZHVsZVNoYXBlPFNTY2hlbWEsIFNjaGVtYS5TY2hlbWE8QWN0aW9uc0Zyb21NYXA8QU1hcD4+LCBBTWFwPiA9IHtcbiAgICBzdGF0ZVNjaGVtYTogZGVmLnN0YXRlLFxuICAgIGFjdGlvblNjaGVtYTogU2NoZW1hLlVuaW9uKFxuICAgICAgLi4uT2JqZWN0LmVudHJpZXMoZGVmLmFjdGlvbnMpLm1hcCgoW3RhZywgdG9rZW5dKSA9PiB7XG4gICAgICAgIGNvbnN0IHBheWxvYWQgPSAodG9rZW4gYXMgQWN0aW9uLkFueUFjdGlvblRva2VuKS5zY2hlbWEgYXMgQW55U2NoZW1hXG4gICAgICAgIHJldHVybiBTY2hlbWEuU3RydWN0KFxuICAgICAgICAgIHBheWxvYWQgPT09IFNjaGVtYS5Wb2lkXG4gICAgICAgICAgICA/IHtcbiAgICAgICAgICAgICAgICBfdGFnOiBTY2hlbWEuTGl0ZXJhbCh0YWcpLFxuICAgICAgICAgICAgICAgIHBheWxvYWQ6IFNjaGVtYS5vcHRpb25hbChwYXlsb2FkKSxcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgOiB7XG4gICAgICAgICAgICAgICAgX3RhZzogU2NoZW1hLkxpdGVyYWwodGFnKSxcbiAgICAgICAgICAgICAgICBwYXlsb2FkLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICApXG4gICAgICB9KSxcbiAgICApIGFzIHVua25vd24gYXMgU2NoZW1hLlNjaGVtYTxBY3Rpb25zRnJvbU1hcDxBTWFwPj4sXG4gICAgYWN0aW9uTWFwOiBkZWYuYWN0aW9ucyxcbiAgfVxuXG4gIHR5cGUgU2hhcGVTdGF0ZSA9IFN0YXRlT2Y8dHlwZW9mIHNoYXBlPlxuICB0eXBlIFNoYXBlQWN0aW9uID0gQWN0aW9uT2Y8dHlwZW9mIHNoYXBlPlxuXG4gIC8vIE5vcm1hbGl6ZSB0YWcta2V5ZWQgcmVkdWNlcnMgaW50byBgX3RhZyAtPiAoc3RhdGUsIGFjdGlvbiwgc2luaz8pID0+IHN0YXRlYCBmb3IgdGhlIHJ1bnRpbWUuXG4gIGNvbnN0IHJlZHVjZXJzID1cbiAgICBkZWYucmVkdWNlcnMgJiZcbiAgICAoT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgICAgT2JqZWN0LmVudHJpZXMoZGVmLnJlZHVjZXJzKS5tYXAoKFt0YWcsIHJlZHVjZXJdKSA9PiBbXG4gICAgICAgIHRhZyxcbiAgICAgICAgKHN0YXRlOiBTaGFwZVN0YXRlLCBhY3Rpb246IFNoYXBlQWN0aW9uLCBzaW5rPzogKHBhdGg6IHN0cmluZyB8IEZpZWxkUGF0aCkgPT4gdm9pZCkgPT5cbiAgICAgICAgICAvLyBSZWxpZXMgb24gdGhlIHJ1bnRpbWUgYF90YWdgIGNvbnZlbnRpb246IG9ubHkgYWN0aW9ucyBtYXRjaGluZyB0aGUgY3VycmVudCB0YWcgYXJlIHJvdXRlZCB0byB0aGlzIHJlZHVjZXIuXG4gICAgICAgICAgKHJlZHVjZXIgYXMgYW55KShcbiAgICAgICAgICAgIHN0YXRlLFxuICAgICAgICAgICAgYWN0aW9uIGFzIHtcbiAgICAgICAgICAgICAgcmVhZG9ubHkgX3RhZzogc3RyaW5nXG4gICAgICAgICAgICAgIHJlYWRvbmx5IHBheWxvYWQ6IHVua25vd25cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzaW5rLFxuICAgICAgICAgICkgYXMgU2hhcGVTdGF0ZSxcbiAgICAgIF0pLFxuICAgICkgYXMgUmVjb3JkPFxuICAgICAgc3RyaW5nLFxuICAgICAgKHN0YXRlOiBTaGFwZVN0YXRlLCBhY3Rpb246IFNoYXBlQWN0aW9uLCBzaW5rPzogKHBhdGg6IHN0cmluZyB8IEZpZWxkUGF0aCkgPT4gdm9pZCkgPT4gU2hhcGVTdGF0ZVxuICAgID4pXG5cbiAgY2xhc3MgTW9kdWxlVGFnIGV4dGVuZHMgQ29udGV4dC5UYWcoYEBsb2dpeGpzL01vZHVsZS8ke2lkfWApPFxuICAgIE1vZHVsZVRhZyxcbiAgICBpbXBvcnQoJy4vY29yZS9tb2R1bGUuanMnKS5Nb2R1bGVSdW50aW1lPFN0YXRlT2Y8dHlwZW9mIHNoYXBlPiwgQWN0aW9uT2Y8dHlwZW9mIHNoYXBlPj5cbiAgPigpIHt9XG5cbiAgY29uc3QgdGFnID0gTW9kdWxlVGFnXG5cbiAgY29uc3QgbW9kdWxlVGFnID0gT2JqZWN0LmFzc2lnbih0YWcsIHtcbiAgICBfa2luZDogJ01vZHVsZVRhZycgYXMgY29uc3QsXG4gICAgaWQsXG4gICAgc2hhcGUsXG4gICAgc3RhdGVTY2hlbWE6IHNoYXBlLnN0YXRlU2NoZW1hLFxuICAgIGFjdGlvblNjaGVtYTogc2hhcGUuYWN0aW9uU2NoZW1hLFxuICAgIGFjdGlvbnM6IHNoYXBlLmFjdGlvbk1hcCxcbiAgICByZWR1Y2VyczogZGVmLnJlZHVjZXJzLFxuICAgIC8qKlxuICAgICAqIEJ1aWxkIGEgTG9naWMgcHJvZ3JhbSBmb3IgdGhlIGN1cnJlbnQgTW9kdWxlOlxuICAgICAqIC0gUmVhZCBpdHMgTW9kdWxlUnVudGltZSBmcm9tIENvbnRleHQgYXQgcnVudGltZS5cbiAgICAgKiAtIEJ1aWxkIGEgQm91bmRBcGkgZnJvbSB0aGUgcnVudGltZS5cbiAgICAgKiAtIFBhc3MgdGhlIEJvdW5kQXBpIHRvIHRoZSBjYWxsZXIgdG8gYnVpbGQgYnVzaW5lc3MgbG9naWMuXG4gICAgICovXG4gICAgbG9naWM6IDxSID0gdW5rbm93biwgRSA9IG5ldmVyPihcbiAgICAgIGJ1aWxkOiAoYXBpOiBpbXBvcnQoJy4vY29yZS9tb2R1bGUuanMnKS5Cb3VuZEFwaTx0eXBlb2Ygc2hhcGUsIFI+KSA9PiBNb2R1bGVMb2dpYzx0eXBlb2Ygc2hhcGUsIFIsIEU+LFxuICAgICk6IE1vZHVsZUxvZ2ljPHR5cGVvZiBzaGFwZSwgUiwgRT4gPT4ge1xuICAgICAgY29uc3QgbG9naWNFZmZlY3QgPSBFZmZlY3QuZ2VuKGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIGNvbnN0IHJ1bnRpbWUgPSB5aWVsZCogdGFnXG4gICAgICAgIGNvbnN0IGxvZ2ljVW5pdCA9IHlpZWxkKiBFZmZlY3Quc2VydmljZU9wdGlvbihMb2dpY0RpYWdub3N0aWNzLkxvZ2ljVW5pdFNlcnZpY2VUYWcpLnBpcGUoXG4gICAgICAgICAgRWZmZWN0Lm1hcChPcHRpb24uZ2V0T3JVbmRlZmluZWQpLFxuICAgICAgICApXG4gICAgICAgIGNvbnN0IHBoYXNlU2VydmljZSA9IHlpZWxkKiBFZmZlY3Quc2VydmljZU9wdGlvbihMb2dpY0RpYWdub3N0aWNzLkxvZ2ljUGhhc2VTZXJ2aWNlVGFnKS5waXBlKFxuICAgICAgICAgIEVmZmVjdC5tYXAoT3B0aW9uLmdldE9yVW5kZWZpbmVkKSxcbiAgICAgICAgKVxuICAgICAgICBjb25zdCBhcGkgPSBCb3VuZEFwaVJ1bnRpbWUubWFrZTx0eXBlb2Ygc2hhcGUsIFI+KHNoYXBlLCBydW50aW1lLCB7XG4gICAgICAgICAgZ2V0UGhhc2U6ICgpID0+IHBoYXNlU2VydmljZT8uY3VycmVudCA/PyAncnVuJyxcbiAgICAgICAgICBwaGFzZVNlcnZpY2UsXG4gICAgICAgICAgbW9kdWxlSWQ6IGlkLFxuICAgICAgICAgIGxvZ2ljVW5pdCxcbiAgICAgICAgfSlcblxuICAgICAgICBsZXQgYnVpbHQ6IHVua25vd25cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBidWlsdCA9IGJ1aWxkKGFwaSlcbiAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgLy8gQ29udmVydCBzeW5jaHJvbm91c2x5IHRocm93biBMb2dpY1BoYXNlRXJyb3IgaW50byBFZmZlY3QuZmFpbCBzbyBydW5TeW5jIHdvbid0IHRyZWF0IGl0IGFzIGFuIFwiYXN5bmMgcGVuZGluZyBmaWJlclwiLlxuICAgICAgICAgIGlmICgoZXJyIGFzIGFueSk/Ll90YWcgPT09ICdMb2dpY1BoYXNlRXJyb3InKSB7XG4gICAgICAgICAgICByZXR1cm4geWllbGQqIEVmZmVjdC5mYWlsKGVyciBhcyBhbnkpXG4gICAgICAgICAgfVxuICAgICAgICAgIHRocm93IGVyclxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKExvZ2ljUGxhbk1hcmtlci5pc0xvZ2ljUGxhbkVmZmVjdChidWlsdCkpIHtcbiAgICAgICAgICByZXR1cm4geWllbGQqIGJ1aWx0IGFzIEVmZmVjdC5FZmZlY3Q8YW55LCBhbnksIGFueT5cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGlzTG9naWNQbGFuID0gKHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgaW1wb3J0KCcuL2NvcmUvbW9kdWxlLmpzJykuTG9naWNQbGFuPHR5cGVvZiBzaGFwZSwgUiwgRT4gPT5cbiAgICAgICAgICBCb29sZWFuKHZhbHVlICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgJ3NldHVwJyBpbiAodmFsdWUgYXMgYW55KSAmJiAncnVuJyBpbiAodmFsdWUgYXMgYW55KSlcblxuICAgICAgICBjb25zdCBwbGFuID0gaXNMb2dpY1BsYW4oYnVpbHQpXG4gICAgICAgICAgPyBidWlsdFxuICAgICAgICAgIDogKHtcbiAgICAgICAgICAgICAgc2V0dXA6IEVmZmVjdC52b2lkLFxuICAgICAgICAgICAgICBydW46IGJ1aWx0IGFzIEVmZmVjdC5FZmZlY3Q8YW55LCBhbnksIGFueT4sXG4gICAgICAgICAgICB9IHNhdGlzZmllcyBpbXBvcnQoJy4vY29yZS9tb2R1bGUuanMnKS5Mb2dpY1BsYW48dHlwZW9mIHNoYXBlLCBSLCBFPilcblxuICAgICAgICByZXR1cm4gcGxhblxuICAgICAgfSlcblxuICAgICAgTG9naWNQbGFuTWFya2VyLm1hcmtBc0xvZ2ljUGxhbkVmZmVjdChsb2dpY0VmZmVjdClcbiAgICAgIHJldHVybiBsb2dpY0VmZmVjdFxuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBsaXZlOiBnaXZlbiBhbiBpbml0aWFsIHN0YXRlIGFuZCBhIHNldCBvZiBsb2dpY3MsIGNvbnN0cnVjdCBhIHNjb3BlZCBNb2R1bGVSdW50aW1lIExheWVyLlxuICAgICAqXG4gICAgICogRW52IGNvbnZlbnRpb25zOlxuICAgICAqIC0gUiByZXByZXNlbnRzIGV4dHJhIGVudmlyb25tZW50IHJlcXVpcmVkIGJ5IHRoZSBsb2dpY3MgKHNlcnZpY2VzIC8gcGxhdGZvcm0sIGV0Yy4pLlxuICAgICAqIC0gTW9kdWxlUnVudGltZSBpdHNlbGYgb25seSBkZXBlbmRzIG9uIFNjb3BlLlNjb3BlIGFuZCBpcyBtYW5hZ2VkIGJ5IExheWVyLnNjb3BlZC5cbiAgICAgKi9cbiAgICBsaXZlOiA8UiA9IG5ldmVyLCBFID0gbmV2ZXI+KFxuICAgICAgaW5pdGlhbDogU3RhdGVPZjx0eXBlb2Ygc2hhcGU+LFxuICAgICAgLi4ubG9naWNzOiBBcnJheTxNb2R1bGVMb2dpYzx0eXBlb2Ygc2hhcGUsIFIsIEU+PlxuICAgICk6IExheWVyLkxheWVyPGltcG9ydCgnLi9jb3JlL21vZHVsZS5qcycpLk1vZHVsZVJ1bnRpbWU8U3RhdGVPZjx0eXBlb2Ygc2hhcGU+LCBBY3Rpb25PZjx0eXBlb2Ygc2hhcGU+PiwgRSwgUj4gPT5cbiAgICAgIExheWVyLnNjb3BlZChcbiAgICAgICAgdGFnLFxuICAgICAgICBNb2R1bGVSdW50aW1lSW1wbC5tYWtlPFN0YXRlT2Y8dHlwZW9mIHNoYXBlPiwgQWN0aW9uT2Y8dHlwZW9mIHNoYXBlPiwgUj4oaW5pdGlhbCwge1xuICAgICAgICAgIHRhZyxcbiAgICAgICAgICBsb2dpY3M6IGxvZ2ljcyBhcyBSZWFkb25seUFycmF5PEVmZmVjdC5FZmZlY3Q8YW55LCBhbnksIGFueT4+LFxuICAgICAgICAgIG1vZHVsZUlkOiBpZCxcbiAgICAgICAgICByZWR1Y2VycyxcbiAgICAgICAgfSksXG4gICAgICApIGFzIHVua25vd24gYXMgTGF5ZXIuTGF5ZXI8XG4gICAgICAgIGltcG9ydCgnLi9jb3JlL21vZHVsZS5qcycpLk1vZHVsZVJ1bnRpbWU8U3RhdGVPZjx0eXBlb2Ygc2hhcGU+LCBBY3Rpb25PZjx0eXBlb2Ygc2hhcGU+PixcbiAgICAgICAgRSxcbiAgICAgICAgUlxuICAgICAgPixcblxuICAgIC8qKlxuICAgICAqIGltcGxlbWVudDogYnVpbGQgYSBNb2R1bGVJbXBsIGJsdWVwcmludCBmcm9tIE1vZHVsZSBkZWZpbml0aW9uICsgaW5pdGlhbCBzdGF0ZSArIGEgc2V0IG9mIGxvZ2ljcy5cbiAgICAgKlxuICAgICAqIC0gUiByZXByZXNlbnRzIHRoZSBFbnYgcmVxdWlyZWQgYnkgdGhlIGxvZ2ljcy5cbiAgICAgKiAtIFRoZSByZXR1cm5lZCBNb2R1bGVJbXBsLmxheWVyIGNhcnJpZXMgUiBhcyBpdHMgaW5wdXQgZW52aXJvbm1lbnQuXG4gICAgICogLSB3aXRoTGF5ZXIvd2l0aExheWVycyBjYW4gcHJvZ3Jlc3NpdmVseSBuYXJyb3cgUiB0byBhIG1vcmUgY29uY3JldGUgRW52IChldmVuIG5ldmVyKS5cbiAgICAgKi9cbiAgICBpbXBsZW1lbnQ6IDxSID0gbmV2ZXI+KGNvbmZpZzoge1xuICAgICAgaW5pdGlhbDogU3RhdGVPZjx0eXBlb2Ygc2hhcGU+XG4gICAgICBsb2dpY3M/OiBBcnJheTxNb2R1bGVMb2dpYzx0eXBlb2Ygc2hhcGUsIFIsIG5ldmVyPj5cbiAgICAgIGltcG9ydHM/OiBSZWFkb25seUFycmF5PExheWVyLkxheWVyPGFueSwgYW55LCBhbnk+IHwgTW9kdWxlSW1wbDxhbnksIEFueU1vZHVsZVNoYXBlLCBhbnk+PlxuICAgICAgLyoqXG4gICAgICAgKiBwcm9jZXNzZXM6IGEgc2V0IG9mIGxvbmctbGl2ZWQgZmxvd3MgYm91bmQgdG8gdGhpcyBNb2R1bGUgaW1wbGVtZW50YXRpb24gKGluY2x1ZGluZyBMaW5rKS5cbiAgICAgICAqXG4gICAgICAgKiAtIFRoZXNlIEVmZmVjdHMgd2lsbCBiZSBmb3JrZWQgYnkgdGhlIHJ1bnRpbWUgY29udGFpbmVyIChlLmcuIFJ1bnRpbWUubWFrZSkuXG4gICAgICAgKiAtIFR5cGVzIHVzZSByZWxheGVkIEUvUiB0byBlbmFibGUgY29tcG9zaW5nIGNyb3NzLW1vZHVsZSBvcmNoZXN0cmF0aW9uIGxvZ2ljLlxuICAgICAgICogLSBCdXNpbmVzcyBjb2RlIHR5cGljYWxseSBidWlsZHMgdGhlc2UgZmxvd3MgdmlhIExpbmsubWFrZS5cbiAgICAgICAqL1xuICAgICAgcHJvY2Vzc2VzPzogUmVhZG9ubHlBcnJheTxFZmZlY3QuRWZmZWN0PHZvaWQsIGFueSwgYW55Pj5cbiAgICAgIC8qKlxuICAgICAgICogc3RhdGVUcmFuc2FjdGlvbjogbW9kdWxlLWxldmVsIFN0YXRlVHJhbnNhY3Rpb24gY29uZmlnLlxuICAgICAgICpcbiAgICAgICAqIC0gSWYgaW5zdHJ1bWVudGF0aW9uIGlzIG5vdCBwcm92aWRlZCwgZmFsbCBiYWNrIHRvIFJ1bnRpbWUtbGV2ZWwgY29uZmlnIChpZiBhbnkpIG9yIE5PREVfRU5WIGRlZmF1bHRzLlxuICAgICAgICogLSBJZiBpbnN0cnVtZW50YXRpb24gaXMgcHJvdmlkZWQsIGl0IHRha2VzIHByZWNlZGVuY2Ugb3ZlciBSdW50aW1lLWxldmVsIGNvbmZpZyBhbmQgZGVmYXVsdHMuXG4gICAgICAgKi9cbiAgICAgIHN0YXRlVHJhbnNhY3Rpb24/OiBNb2R1bGVJbXBsZW1lbnRTdGF0ZVRyYW5zYWN0aW9uT3B0aW9uc1xuICAgIH0pOiBNb2R1bGVJbXBsPElkLCBNb2R1bGVTaGFwZTxTU2NoZW1hLCBTY2hlbWEuU2NoZW1hPEFjdGlvbnNGcm9tTWFwPEFNYXA+PiwgQU1hcD4sIFI+ID0+IHtcbiAgICAgIGNvbnN0IGltcG9ydGVkTW9kdWxlcyA9IChjb25maWcuaW1wb3J0cyA/PyBbXSkuZmxhdE1hcCgoaXRlbSkgPT4ge1xuICAgICAgICBpZiAoKGl0ZW0gYXMgTW9kdWxlSW1wbDxhbnksIEFueU1vZHVsZVNoYXBlLCBhbnk+KS5fdGFnID09PSAnTW9kdWxlSW1wbCcpIHtcbiAgICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgKGl0ZW0gYXMgTW9kdWxlSW1wbDxhbnksIEFueU1vZHVsZVNoYXBlLCBhbnk+KS5tb2R1bGUgYXMgdW5rbm93biBhcyBDb250ZXh0LlRhZzxcbiAgICAgICAgICAgICAgYW55LFxuICAgICAgICAgICAgICBpbXBvcnQoJy4vY29yZS9tb2R1bGUuanMnKS5Nb2R1bGVSdW50aW1lPGFueSwgYW55PlxuICAgICAgICAgICAgPixcbiAgICAgICAgICBdXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFtdXG4gICAgICB9KVxuXG4gICAgICBjb25zdCBiYXNlTGF5ZXIgPSBMYXllci5zY29wZWQoXG4gICAgICAgIHRhZyxcbiAgICAgICAgTW9kdWxlUnVudGltZUltcGwubWFrZTxTdGF0ZU9mPHR5cGVvZiBzaGFwZT4sIEFjdGlvbk9mPHR5cGVvZiBzaGFwZT4sIFI+KGNvbmZpZy5pbml0aWFsLCB7XG4gICAgICAgICAgdGFnLFxuICAgICAgICAgIGxvZ2ljczogKGNvbmZpZy5sb2dpY3MgfHwgW10pIGFzIFJlYWRvbmx5QXJyYXk8RWZmZWN0LkVmZmVjdDxhbnksIGFueSwgYW55Pj4sXG4gICAgICAgICAgcHJvY2Vzc2VzOiAoY29uZmlnLnByb2Nlc3NlcyB8fCBbXSkgYXMgUmVhZG9ubHlBcnJheTxFZmZlY3QuRWZmZWN0PHZvaWQsIGFueSwgYW55Pj4sXG4gICAgICAgICAgbW9kdWxlSWQ6IGlkLFxuICAgICAgICAgIGltcG9ydHM6IGltcG9ydGVkTW9kdWxlcyxcbiAgICAgICAgICByZWR1Y2VycyxcbiAgICAgICAgICBzdGF0ZVRyYW5zYWN0aW9uOiBjb25maWcuc3RhdGVUcmFuc2FjdGlvbixcbiAgICAgICAgfSksXG4gICAgICApIGFzIHVua25vd24gYXMgTGF5ZXIuTGF5ZXI8XG4gICAgICAgIGltcG9ydCgnLi9jb3JlL21vZHVsZS5qcycpLk1vZHVsZVJ1bnRpbWU8U3RhdGVPZjx0eXBlb2Ygc2hhcGU+LCBBY3Rpb25PZjx0eXBlb2Ygc2hhcGU+PixcbiAgICAgICAgbmV2ZXIsXG4gICAgICAgIGFueVxuICAgICAgPlxuXG4gICAgICBjb25zdCBwcm9jZXNzZXMgPSBjb25maWcucHJvY2Vzc2VzID8/IFtdXG5cbiAgICAgIGNvbnN0IG1ha2VJbXBsV2l0aExheWVyID0gKFxuICAgICAgICBsYXllcjogTGF5ZXIuTGF5ZXI8XG4gICAgICAgICAgaW1wb3J0KCcuL2NvcmUvbW9kdWxlLmpzJykuTW9kdWxlUnVudGltZTxTdGF0ZU9mPHR5cGVvZiBzaGFwZT4sIEFjdGlvbk9mPHR5cGVvZiBzaGFwZT4+LFxuICAgICAgICAgIG5ldmVyLFxuICAgICAgICAgIGFueVxuICAgICAgICA+LFxuICAgICAgKTogTW9kdWxlSW1wbDxJZCwgTW9kdWxlU2hhcGU8U1NjaGVtYSwgU2NoZW1hLlNjaGVtYTxBY3Rpb25zRnJvbU1hcDxBTWFwPj4sIEFNYXA+LCBhbnk+ID0+ICh7XG4gICAgICAgIF90YWc6ICdNb2R1bGVJbXBsJyxcbiAgICAgICAgbW9kdWxlOiBtb2R1bGVUYWcgYXMgdW5rbm93biBhcyBMb2dpeE1vZHVsZVRhZzxcbiAgICAgICAgICBJZCxcbiAgICAgICAgICBNb2R1bGVTaGFwZTxTU2NoZW1hLCBTY2hlbWEuU2NoZW1hPEFjdGlvbnNGcm9tTWFwPEFNYXA+PiwgQU1hcD5cbiAgICAgICAgPixcbiAgICAgICAgbGF5ZXIsXG4gICAgICAgIHByb2Nlc3NlcyxcbiAgICAgICAgc3RhdGVUcmFuc2FjdGlvbjogY29uZmlnLnN0YXRlVHJhbnNhY3Rpb24sXG4gICAgICAgIHdpdGhMYXllcjogKFxuICAgICAgICAgIGV4dHJhOiBMYXllci5MYXllcjxhbnksIG5ldmVyLCBhbnk+LFxuICAgICAgICApOiBNb2R1bGVJbXBsPElkLCBNb2R1bGVTaGFwZTxTU2NoZW1hLCBTY2hlbWEuU2NoZW1hPEFjdGlvbnNGcm9tTWFwPEFNYXA+PiwgQU1hcD4sIGFueT4gPT4ge1xuICAgICAgICAgIGNvbnN0IHByb3ZpZGVkID0gKFxuICAgICAgICAgICAgbGF5ZXIgYXMgTGF5ZXIuTGF5ZXI8XG4gICAgICAgICAgICAgIGltcG9ydCgnLi9jb3JlL21vZHVsZS5qcycpLk1vZHVsZVJ1bnRpbWU8U3RhdGVPZjx0eXBlb2Ygc2hhcGU+LCBBY3Rpb25PZjx0eXBlb2Ygc2hhcGU+PixcbiAgICAgICAgICAgICAgbmV2ZXIsXG4gICAgICAgICAgICAgIGFueVxuICAgICAgICAgICAgPlxuICAgICAgICAgICkucGlwZShMYXllci5wcm92aWRlKGV4dHJhIGFzIExheWVyLkxheWVyPGFueSwgbmV2ZXIsIGFueT4pKVxuXG4gICAgICAgICAgY29uc3QgbWVyZ2VkID0gTGF5ZXIubWVyZ2VBbGwocHJvdmlkZWQsIGV4dHJhIGFzIExheWVyLkxheWVyPGFueSwgbmV2ZXIsIGFueT4pIGFzIExheWVyLkxheWVyPFxuICAgICAgICAgICAgaW1wb3J0KCcuL2NvcmUvbW9kdWxlLmpzJykuTW9kdWxlUnVudGltZTxTdGF0ZU9mPHR5cGVvZiBzaGFwZT4sIEFjdGlvbk9mPHR5cGVvZiBzaGFwZT4+LFxuICAgICAgICAgICAgbmV2ZXIsXG4gICAgICAgICAgICBhbnlcbiAgICAgICAgICA+XG5cbiAgICAgICAgICByZXR1cm4gbWFrZUltcGxXaXRoTGF5ZXIobWVyZ2VkKVxuICAgICAgICB9LFxuICAgICAgICB3aXRoTGF5ZXJzOiAoXG4gICAgICAgICAgLi4uZXh0cmFzOiBSZWFkb25seUFycmF5PExheWVyLkxheWVyPGFueSwgbmV2ZXIsIGFueT4+XG4gICAgICAgICk6IE1vZHVsZUltcGw8SWQsIE1vZHVsZVNoYXBlPFNTY2hlbWEsIFNjaGVtYS5TY2hlbWE8QWN0aW9uc0Zyb21NYXA8QU1hcD4+LCBBTWFwPiwgYW55PiA9PlxuICAgICAgICAgIGV4dHJhcy5yZWR1Y2U8TW9kdWxlSW1wbDxJZCwgTW9kdWxlU2hhcGU8U1NjaGVtYSwgU2NoZW1hLlNjaGVtYTxBY3Rpb25zRnJvbU1hcDxBTWFwPj4sIEFNYXA+LCBhbnk+PihcbiAgICAgICAgICAgIChpbXBsQWNjLCBleHRyYSkgPT4gaW1wbEFjYy53aXRoTGF5ZXIoZXh0cmEpLFxuICAgICAgICAgICAgbWFrZUltcGxXaXRoTGF5ZXIoXG4gICAgICAgICAgICAgIGxheWVyIGFzIExheWVyLkxheWVyPFxuICAgICAgICAgICAgICAgIGltcG9ydCgnLi9jb3JlL21vZHVsZS5qcycpLk1vZHVsZVJ1bnRpbWU8U3RhdGVPZjx0eXBlb2Ygc2hhcGU+LCBBY3Rpb25PZjx0eXBlb2Ygc2hhcGU+PixcbiAgICAgICAgICAgICAgICBuZXZlcixcbiAgICAgICAgICAgICAgICBhbnlcbiAgICAgICAgICAgICAgPixcbiAgICAgICAgICAgICksXG4gICAgICAgICAgKSxcbiAgICAgIH0pXG5cbiAgICAgIC8vIFN0YXJ0IGZyb20gYmFzZUxheWVyIGFuZCBsYXllci1pbiBpbXBvcnRzIChMYXllciBvciBvdGhlciBNb2R1bGVJbXBsLmxheWVyKSBzZXF1ZW50aWFsbHkuXG4gICAgICBjb25zdCBpbml0aWFsSW1wbCA9IG1ha2VJbXBsV2l0aExheWVyKFxuICAgICAgICBiYXNlTGF5ZXIgYXMgTGF5ZXIuTGF5ZXI8XG4gICAgICAgICAgaW1wb3J0KCcuL2NvcmUvbW9kdWxlLmpzJykuTW9kdWxlUnVudGltZTxTdGF0ZU9mPHR5cGVvZiBzaGFwZT4sIEFjdGlvbk9mPHR5cGVvZiBzaGFwZT4+LFxuICAgICAgICAgIG5ldmVyLFxuICAgICAgICAgIGFueVxuICAgICAgICA+LFxuICAgICAgKVxuXG4gICAgICBjb25zdCBpbXBvcnRzID0gY29uZmlnLmltcG9ydHMgPz8gW11cblxuICAgICAgY29uc3QgZmluYWxJbXBsID0gaW1wb3J0cy5yZWR1Y2U8XG4gICAgICAgIE1vZHVsZUltcGw8SWQsIE1vZHVsZVNoYXBlPFNTY2hlbWEsIFNjaGVtYS5TY2hlbWE8QWN0aW9uc0Zyb21NYXA8QU1hcD4+LCBBTWFwPiwgYW55PlxuICAgICAgPigoaW1wbEFjYywgaXRlbSkgPT4ge1xuICAgICAgICBjb25zdCBsYXllciA9XG4gICAgICAgICAgKGl0ZW0gYXMgTW9kdWxlSW1wbDxhbnksIEFueU1vZHVsZVNoYXBlLCBhbnk+KS5fdGFnID09PSAnTW9kdWxlSW1wbCdcbiAgICAgICAgICAgID8gKGl0ZW0gYXMgTW9kdWxlSW1wbDxhbnksIEFueU1vZHVsZVNoYXBlLCBhbnk+KS5sYXllclxuICAgICAgICAgICAgOiAoaXRlbSBhcyBMYXllci5MYXllcjxhbnksIGFueSwgYW55PilcblxuICAgICAgICByZXR1cm4gaW1wbEFjYy53aXRoTGF5ZXIobGF5ZXIgYXMgTGF5ZXIuTGF5ZXI8YW55LCBuZXZlciwgYW55PilcbiAgICAgIH0sIGluaXRpYWxJbXBsKVxuXG4gICAgICByZXR1cm4gZmluYWxJbXBsXG4gICAgfSxcbiAgfSlcblxuICByZXR1cm4gbW9kdWxlVGFnIGFzIExvZ2l4TW9kdWxlVGFnPElkLCBNb2R1bGVTaGFwZTxTU2NoZW1hLCBTY2hlbWEuU2NoZW1hPEFjdGlv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
|
|
@@ -1,86 +0,0 @@
|
|
|
1
|
-
// @logixjs/core subpath bundles for @logixjs/sandbox
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
// ../logix-core/src/internal/runtime/core/FullCutoverGate.ts
|
|
5
|
-
var CutoverCoverageMatrix = {
|
|
6
|
-
version: "v1",
|
|
7
|
-
requiredServiceIds: ["txnQueue", "operationRunner", "transaction", "dispatch"]
|
|
8
|
-
};
|
|
9
|
-
var expectedImplIdForKernel = (kernelId) => kernelId === "core" ? "builtin" : kernelId;
|
|
10
|
-
var parseFallbackServiceIds = (overridesApplied) => {
|
|
11
|
-
const out = /* @__PURE__ */ new Set();
|
|
12
|
-
for (const entry of overridesApplied) {
|
|
13
|
-
if (!entry.includes("(fallback=")) continue;
|
|
14
|
-
const colon = entry.indexOf(":");
|
|
15
|
-
if (colon < 0) continue;
|
|
16
|
-
const eq = entry.indexOf("=", colon + 1);
|
|
17
|
-
if (eq < 0) continue;
|
|
18
|
-
const serviceId = entry.slice(colon + 1, eq);
|
|
19
|
-
if (serviceId.length > 0) out.add(serviceId);
|
|
20
|
-
}
|
|
21
|
-
return Array.from(out).sort((a, b) => a.localeCompare(b));
|
|
22
|
-
};
|
|
23
|
-
var collectMissingServiceIds = (args) => {
|
|
24
|
-
const bindingByServiceId = /* @__PURE__ */ new Map();
|
|
25
|
-
for (const b of args.bindings) {
|
|
26
|
-
bindingByServiceId.set(b.serviceId, b);
|
|
27
|
-
}
|
|
28
|
-
const missing = [];
|
|
29
|
-
for (const serviceId of args.requiredServiceIds) {
|
|
30
|
-
const binding = bindingByServiceId.get(serviceId);
|
|
31
|
-
const implId = binding?.implId;
|
|
32
|
-
if (!implId || implId !== args.expectedImplId) {
|
|
33
|
-
missing.push(serviceId);
|
|
34
|
-
}
|
|
35
|
-
}
|
|
36
|
-
return missing;
|
|
37
|
-
};
|
|
38
|
-
var evaluateFullCutoverGate = (args) => {
|
|
39
|
-
const expectedImplId = expectedImplIdForKernel(args.requestedKernelId);
|
|
40
|
-
const matrix = args.coverageMatrix ?? CutoverCoverageMatrix;
|
|
41
|
-
const fallbackServiceIds = parseFallbackServiceIds(args.runtimeServicesEvidence.overridesApplied);
|
|
42
|
-
const missingServiceIds = collectMissingServiceIds({
|
|
43
|
-
expectedImplId,
|
|
44
|
-
requiredServiceIds: matrix.requiredServiceIds,
|
|
45
|
-
bindings: args.runtimeServicesEvidence.bindings
|
|
46
|
-
});
|
|
47
|
-
const fullyActivated = missingServiceIds.length === 0 && fallbackServiceIds.length === 0;
|
|
48
|
-
const verdict = args.mode === "fullCutover" ? fullyActivated ? "PASS" : "FAIL" : "PASS";
|
|
49
|
-
const moduleIdRaw = args.runtimeServicesEvidence.moduleId;
|
|
50
|
-
const moduleId = typeof moduleIdRaw === "string" && moduleIdRaw.length > 0 ? moduleIdRaw : "unknown";
|
|
51
|
-
const anchor = {
|
|
52
|
-
moduleId,
|
|
53
|
-
instanceId: args.runtimeServicesEvidence.instanceId,
|
|
54
|
-
txnSeq: 0
|
|
55
|
-
};
|
|
56
|
-
const level = args.diagnosticsLevel ?? "off";
|
|
57
|
-
return {
|
|
58
|
-
version: "v1",
|
|
59
|
-
mode: args.mode,
|
|
60
|
-
requestedKernelId: args.requestedKernelId,
|
|
61
|
-
verdict,
|
|
62
|
-
fullyActivated,
|
|
63
|
-
missingServiceIds,
|
|
64
|
-
fallbackServiceIds,
|
|
65
|
-
anchor,
|
|
66
|
-
...level === "off" ? {} : {
|
|
67
|
-
details: {
|
|
68
|
-
expectedImplId,
|
|
69
|
-
bindings: args.runtimeServicesEvidence.bindings,
|
|
70
|
-
overridesApplied: args.runtimeServicesEvidence.overridesApplied
|
|
71
|
-
}
|
|
72
|
-
}
|
|
73
|
-
};
|
|
74
|
-
};
|
|
75
|
-
|
|
76
|
-
// ../logix-core/src/internal/runtime/core/RuntimeServiceBuiltins.ts
|
|
77
|
-
import { Context } from "../effect.js";
|
|
78
|
-
var RuntimeServiceBuiltinsTag = class extends Context.Tag("@logixjs/core/RuntimeServiceBuiltins")() {
|
|
79
|
-
};
|
|
80
|
-
|
|
81
|
-
export {
|
|
82
|
-
CutoverCoverageMatrix,
|
|
83
|
-
evaluateFullCutoverGate,
|
|
84
|
-
RuntimeServiceBuiltinsTag
|
|
85
|
-
};
|
|
86
|
-
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vbG9naXgtY29yZS9zcmMvaW50ZXJuYWwvcnVudGltZS9jb3JlL0Z1bGxDdXRvdmVyR2F0ZS50cyIsICIuLi8uLi8uLi8uLi9sb2dpeC1jb3JlL3NyYy9pbnRlcm5hbC9ydW50aW1lL2NvcmUvUnVudGltZVNlcnZpY2VCdWlsdGlucy50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiaW1wb3J0IHR5cGUgeyBLZXJuZWxJZCB9IGZyb20gJy4vS2VybmVsUmVmLmpzJ1xuaW1wb3J0IHR5cGUgeyBSdW50aW1lU2VydmljZUJpbmRpbmcsIFJ1bnRpbWVTZXJ2aWNlc0V2aWRlbmNlIH0gZnJvbSAnLi9SdW50aW1lS2VybmVsLmpzJ1xuXG5leHBvcnQgaW50ZXJmYWNlIEN1dG92ZXJDb3ZlcmFnZU1hdHJpeCB7XG4gIHJlYWRvbmx5IHZlcnNpb246ICd2MSdcbiAgcmVhZG9ubHkgcmVxdWlyZWRTZXJ2aWNlSWRzOiBSZWFkb25seUFycmF5PHN0cmluZz5cbn1cblxuZXhwb3J0IGNvbnN0IEN1dG92ZXJDb3ZlcmFnZU1hdHJpeCA9IHtcbiAgdmVyc2lvbjogJ3YxJyxcbiAgcmVxdWlyZWRTZXJ2aWNlSWRzOiBbJ3R4blF1ZXVlJywgJ29wZXJhdGlvblJ1bm5lcicsICd0cmFuc2FjdGlvbicsICdkaXNwYXRjaCddLFxufSBhcyBjb25zdCBzYXRpc2ZpZXMgQ3V0b3ZlckNvdmVyYWdlTWF0cml4XG5cbmV4cG9ydCB0eXBlIEZ1bGxDdXRvdmVyR2F0ZU1vZGUgPSAndHJpYWwnIHwgJ2Z1bGxDdXRvdmVyJ1xuXG5leHBvcnQgaW50ZXJmYWNlIEZ1bGxDdXRvdmVyR2F0ZUFuY2hvciB7XG4gIHJlYWRvbmx5IG1vZHVsZUlkOiBzdHJpbmdcbiAgcmVhZG9ubHkgaW5zdGFuY2VJZDogc3RyaW5nXG4gIC8qKlxuICAgKiBDb252ZW50aW9uOiB0eG5TZXE9MCBkZW5vdGVzIGFzc2VtYmx5IChhIHdpcmluZy10aW1lIGZhaWx1cmUgYW5jaG9yKS5cbiAgICogRnVsbCBDdXRvdmVyIEdhdGUgaXMgZXZhbHVhdGVkIGR1cmluZyBhc3NlbWJseSBieSBkZWZhdWx0LCBzbyBpdCBkb2VzIG5vdCBkZXBlbmQgb24gYSByZWFsIHR4bi5cbiAgICovXG4gIHJlYWRvbmx5IHR4blNlcTogbnVtYmVyXG59XG5cbmV4cG9ydCB0eXBlIEZ1bGxDdXRvdmVyR2F0ZVZlcmRpY3QgPSAnUEFTUycgfCAnRkFJTCdcblxuZXhwb3J0IGludGVyZmFjZSBGdWxsQ3V0b3ZlckdhdGVSZXN1bHQge1xuICByZWFkb25seSB2ZXJzaW9uOiAndjEnXG4gIHJlYWRvbmx5IG1vZGU6IEZ1bGxDdXRvdmVyR2F0ZU1vZGVcbiAgcmVhZG9ubHkgcmVxdWVzdGVkS2VybmVsSWQ6IEtlcm5lbElkXG4gIHJlYWRvbmx5IHZlcmRpY3Q6IEZ1bGxDdXRvdmVyR2F0ZVZlcmRpY3RcbiAgLyoqXG4gICAqIGZ1bGx5QWN0aXZhdGVkOiBhIHN0cmljdGVyIFwiZnVsbCBjdXRvdmVyXCIgdHJ1dGggdmFsdWUuXG4gICAqIC0gUmVxdWlyZXMgZXZlcnkgc2VydmljZUlkIGluIHRoZSBjb3ZlcmFnZSBtYXRyaXggdG8gYmUgYm91bmQgdG8gdGhlIGV4cGVjdGVkIGltcGxJZC5cbiAgICogLSBSZXF1aXJlcyBubyBmYWxsYmFjayAoYW55IGBmYWxsYmFjaz1gIGluIG92ZXJyaWRlc0FwcGxpZWQgbWVhbnMgbm90IGZ1bGx5IGFjdGl2YXRlZCkuXG4gICAqXG4gICAqIE5vdGU6IGluIHRyaWFsIG1vZGUgdGhlIHZlcmRpY3QgbWF5IGJlIFBBU1Mgd2hpbGUgZnVsbHlBY3RpdmF0ZWQgY2FuIHN0aWxsIGJlIGZhbHNlLlxuICAgKi9cbiAgcmVhZG9ubHkgZnVsbHlBY3RpdmF0ZWQ6IGJvb2xlYW5cbiAgcmVhZG9ubHkgbWlzc2luZ1NlcnZpY2VJZHM6IFJlYWRvbmx5QXJyYXk8c3RyaW5nPlxuICByZWFkb25seSBmYWxsYmFja1NlcnZpY2VJZHM6IFJlYWRvbmx5QXJyYXk8c3RyaW5nPlxuICByZWFkb25seSBhbmNob3I6IEZ1bGxDdXRvdmVyR2F0ZUFuY2hvclxuICAvKipcbiAgICogV2hlbiBkaWFnbm9zdGljcz1vZmYsIGl0IG11c3Qgc3RheSBzbGltIChhdm9pZCBwZXJtYW5lbnQgb3ZlcmhlYWQpLlxuICAgKiBJbiBsaWdodC9mdWxsLCBhZGRpdGlvbmFsIGV4cGxhaW5hYmxlIGluZm8gaXMgYWxsb3dlZCAoc3RpbGwgbXVzdCBiZSBzZXJpYWxpemFibGUpLlxuICAgKi9cbiAgcmVhZG9ubHkgZGV0YWlscz86IHtcbiAgICByZWFkb25seSBleHBlY3RlZEltcGxJZDogc3RyaW5nXG4gICAgcmVhZG9ubHkgYmluZGluZ3M6IFJlYWRvbmx5QXJyYXk8UnVudGltZVNlcnZpY2VCaW5kaW5nPlxuICAgIHJlYWRvbmx5IG92ZXJyaWRlc0FwcGxpZWQ6IFJlYWRvbmx5QXJyYXk8c3RyaW5nPlxuICB9XG59XG5cbmNvbnN0IGV4cGVjdGVkSW1wbElkRm9yS2VybmVsID0gKGtlcm5lbElkOiBLZXJuZWxJZCk6IHN0cmluZyA9PiAoa2VybmVsSWQgPT09ICdjb3JlJyA/ICdidWlsdGluJyA6IGtlcm5lbElkKVxuXG5jb25zdCBwYXJzZUZhbGxiYWNrU2VydmljZUlkcyA9IChvdmVycmlkZXNBcHBsaWVkOiBSZWFkb25seUFycmF5PHN0cmluZz4pOiBSZWFkb25seUFycmF5PHN0cmluZz4gPT4ge1xuICBjb25zdCBvdXQgPSBuZXcgU2V0PHN0cmluZz4oKVxuICBmb3IgKGNvbnN0IGVudHJ5IG9mIG92ZXJyaWRlc0FwcGxpZWQpIHtcbiAgICBpZiAoIWVudHJ5LmluY2x1ZGVzKCcoZmFsbGJhY2s9JykpIGNvbnRpbnVlXG4gICAgY29uc3QgY29sb24gPSBlbnRyeS5pbmRleE9mKCc6JylcbiAgICBpZiAoY29sb24gPCAwKSBjb250aW51ZVxuICAgIGNvbnN0IGVxID0gZW50cnkuaW5kZXhPZignPScsIGNvbG9uICsgMSlcbiAgICBpZiAoZXEgPCAwKSBjb250aW51ZVxuICAgIGNvbnN0IHNlcnZpY2VJZCA9IGVudHJ5LnNsaWNlKGNvbG9uICsgMSwgZXEpXG4gICAgaWYgKHNlcnZpY2VJZC5sZW5ndGggPiAwKSBvdXQuYWRkKHNlcnZpY2VJZClcbiAgfVxuICByZXR1cm4gQXJyYXkuZnJvbShvdXQpLnNvcnQoKGEsIGIpID0+IGEubG9jYWxlQ29tcGFyZShiKSlcbn1cblxuY29uc3QgY29sbGVjdE1pc3NpbmdTZXJ2aWNlSWRzID0gKGFyZ3M6IHtcbiAgcmVhZG9ubHkgZXhwZWN0ZWRJbXBsSWQ6IHN0cmluZ1xuICByZWFkb25seSByZXF1aXJlZFNlcnZpY2VJZHM6IFJlYWRvbmx5QXJyYXk8c3RyaW5nPlxuICByZWFkb25seSBiaW5kaW5nczogUmVhZG9ubHlBcnJheTxSdW50aW1lU2VydmljZUJpbmRpbmc+XG59KTogUmVhZG9ubHlBcnJheTxzdHJpbmc+ID0+IHtcbiAgY29uc3QgYmluZGluZ0J5U2VydmljZUlkID0gbmV3IE1hcDxzdHJpbmcsIFJ1bnRpbWVTZXJ2aWNlQmluZGluZz4oKVxuICBmb3IgKGNvbnN0IGIgb2YgYXJncy5iaW5kaW5ncykge1xuICAgIGJpbmRpbmdCeVNlcnZpY2VJZC5zZXQoYi5zZXJ2aWNlSWQsIGIpXG4gIH1cblxuICBjb25zdCBtaXNzaW5nOiBzdHJpbmdbXSA9IFtdXG4gIGZvciAoY29uc3Qgc2VydmljZUlkIG9mIGFyZ3MucmVxdWlyZWRTZXJ2aWNlSWRzKSB7XG4gICAgY29uc3QgYmluZGluZyA9IGJpbmRpbmdCeVNlcnZpY2VJZC5nZXQoc2VydmljZUlkKVxuICAgIGNvbnN0IGltcGxJZCA9IGJpbmRpbmc/LmltcGxJZFxuICAgIGlmICghaW1wbElkIHx8IGltcGxJZCAhPT0gYXJncy5leHBlY3RlZEltcGxJZCkge1xuICAgICAgbWlzc2luZy5wdXNoKHNlcnZpY2VJZClcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbWlzc2luZ1xufVxuXG5leHBvcnQgY29uc3QgZXZhbHVhdGVGdWxsQ3V0b3ZlckdhdGUgPSAoYXJnczoge1xuICByZWFkb25seSBtb2RlOiBGdWxsQ3V0b3ZlckdhdGVNb2RlXG4gIHJlYWRvbmx5IHJlcXVlc3RlZEtlcm5lbElkOiBLZXJuZWxJZFxuICByZWFkb25seSBydW50aW1lU2VydmljZXNFdmlkZW5jZTogUnVudGltZVNlcnZpY2VzRXZpZGVuY2VcbiAgcmVhZG9ubHkgY292ZXJhZ2VNYXRyaXg/OiBDdXRvdmVyQ292ZXJhZ2VNYXRyaXhcbiAgcmVhZG9ubHkgZGlhZ25vc3RpY3NMZXZlbD86ICdvZmYnIHwgJ2xpZ2h0JyB8ICdmdWxsJyB8ICdzYW1wbGVkJ1xufSk6IEZ1bGxDdXRvdmVyR2F0ZVJlc3VsdCA9PiB7XG4gIGNvbnN0IGV4cGVjdGVkSW1wbElkID0gZXhwZWN0ZWRJbXBsSWRGb3JLZXJuZWwoYXJncy5yZXF1ZXN0ZWRLZXJuZWxJZClcbiAgY29uc3QgbWF0cml4ID0gYXJncy5jb3ZlcmFnZU1hdHJpeCA/PyBDdXRvdmVyQ292ZXJhZ2VNYXRyaXhcblxuICBjb25zdCBmYWxsYmFja1NlcnZpY2VJZHMgPSBwYXJzZUZhbGxiYWNrU2VydmljZUlkcyhhcmdzLnJ1bnRpbWVTZXJ2aWNlc0V2aWRlbmNlLm92ZXJyaWRlc0FwcGxpZWQpXG4gIGNvbnN0IG1pc3NpbmdTZXJ2aWNlSWRzID0gY29sbGVjdE1pc3NpbmdTZXJ2aWNlSWRzKHtcbiAgICBleHBlY3RlZEltcGxJZCxcbiAgICByZXF1aXJlZFNlcnZpY2VJZHM6IG1hdHJpeC5yZXF1aXJlZFNlcnZpY2VJZHMsXG4gICAgYmluZGluZ3M6IGFyZ3MucnVudGltZVNlcnZpY2VzRXZpZGVuY2UuYmluZGluZ3MsXG4gIH0pXG5cbiAgY29uc3QgZnVsbHlBY3RpdmF0ZWQgPSBtaXNzaW5nU2VydmljZUlkcy5sZW5ndGggPT09IDAgJiYgZmFsbGJhY2tTZXJ2aWNlSWRzLmxlbmd0aCA9PT0gMFxuXG4gIGNvbnN0IHZlcmRpY3Q6IEZ1bGxDdXRvdmVyR2F0ZVZlcmRpY3QgPSBhcmdzLm1vZGUgPT09ICdmdWxsQ3V0b3ZlcicgPyAoZnVsbHlBY3RpdmF0ZWQgPyAnUEFTUycgOiAnRkFJTCcpIDogJ1BBU1MnXG5cbiAgY29uc3QgbW9kdWxlSWRSYXcgPSBhcmdzLnJ1bnRpbWVTZXJ2aWNlc0V2aWRlbmNlLm1vZHVsZUlkXG4gIGNvbnN0IG1vZHVsZUlkID0gdHlwZW9mIG1vZHVsZUlkUmF3ID09PSAnc3RyaW5nJyAmJiBtb2R1bGVJZFJhdy5sZW5ndGggPiAwID8gbW9kdWxlSWRSYXcgOiAndW5rbm93bidcblxuICBjb25zdCBhbmNob3I6IEZ1bGxDdXRvdmVyR2F0ZUFuY2hvciA9IHtcbiAgICBtb2R1bGVJZCxcbiAgICBpbnN0YW5jZUlkOiBhcmdzLnJ1bnRpbWVTZXJ2aWNlc0V2aWRlbmNlLmluc3RhbmNlSWQsXG4gICAgdHhuU2VxOiAwLFxuICB9XG5cbiAgY29uc3QgbGV2ZWwgPSBhcmdzLmRpYWdub3N0aWNzTGV2ZWwgPz8gJ29mZidcblxuICByZXR1cm4ge1xuICAgIHZlcnNpb246ICd2MScsXG4gICAgbW9kZTogYXJncy5tb2RlLFxuICAgIHJlcXVlc3RlZEtlcm5lbElkOiBhcmdzLnJlcXVlc3RlZEtlcm5lbElkLFxuICAgIHZlcmRpY3QsXG4gICAgZnVsbHlBY3RpdmF0ZWQsXG4gICAgbWlzc2luZ1NlcnZpY2VJZHMsXG4gICAgZmFsbGJhY2tTZXJ2aWNlSWRzLFxuICAgIGFuY2hvcixcbiAgICAuLi4obGV2ZWwgPT09ICdvZmYnXG4gICAgICA/IHt9XG4gICAgICA6IHtcbiAgICAgICAgICBkZXRhaWxzOiB7XG4gICAgICAgICAgICBleHBlY3RlZEltcGxJZCxcbiAgICAgICAgICAgIGJpbmRpbmdzOiBhcmdzLnJ1bnRpbWVTZXJ2aWNlc0V2aWRlbmNlLmJpbmRpbmdzLFxuICAgICAgICAgICAgb3ZlcnJpZGVzQXBwbGllZDogYXJncy5ydW50aW1lU2VydmljZXNFdmlkZW5jZS5vdmVycmlkZXNBcHBsaWVkLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0pLFxuICB9XG59XG4iLCAiaW1wb3J0IHsgQ29udGV4dCwgRWZmZWN0IH0gZnJvbSAnZWZmZWN0J1xuXG5leHBvcnQgaW50ZXJmYWNlIFJ1bnRpbWVTZXJ2aWNlQnVpbHRpbnMge1xuICAvKipcbiAgICogUmV0dXJucyB0aGUgbWFrZSBFZmZlY3Qgb2YgYSBidWlsdGluIGltcGxlbWVudGF0aW9uIChwcm92aWRlZCBieSBNb2R1bGVSdW50aW1lIGR1cmluZyBhc3NlbWJseSwgYXZvaWRpbmcgZXh0ZXJuYWwgY29kZVxuICAgKiBjYXB0dXJpbmcgaW50ZXJuYWwgY2xvc3VyZXMvc3RhdGUpLlxuICAgKiAtIEZvciBrZXJuZWwgaW1wbGVtZW50b3JzIG9ubHkgKGUuZy4gY29yZS1uZykgdG8gaW1wbGVtZW50IGJlaGF2aW9yLWVxdWl2YWxlbnQgcmVwbGFjZW1lbnRzIG9yIHRoaW4gd3JhcHBlcnMuXG4gICAqIC0gTm90IGFuIGFwcC1mYWNpbmcgY29udHJhY3Q7IG11c3Qgbm90IGJlIGRlcGVuZGVkIG9uIGZyb20gYnVzaW5lc3MgRmxvdy9Mb2dpYy5cbiAgICovXG4gIHJlYWRvbmx5IGdldEJ1aWx0aW5NYWtlOiAoc2VydmljZUlkOiBzdHJpbmcpID0+IEVmZmVjdC5FZmZlY3Q8dW5rbm93biwgbmV2ZXIsIGFueT5cbn1cblxuZXhwb3J0IGNsYXNzIFJ1bnRpbWVTZXJ2aWNlQnVpbHRpbnNUYWcgZXh0ZW5kcyBDb250ZXh0LlRhZygnQGxvZ2l4anMvY29yZS9SdW50aW1lU2VydmljZUJ1aWx0aW5zJyk8XG4gIFJ1bnRpbWVTZXJ2aWNlQnVpbHRpbnNUYWcsXG4gIFJ1bnRpbWVTZXJ2aWNlQnVpbHRpbnNcbj4oKSB7fVxuIl0sCiAgIm1hcHBpbmdzIjogIjs7OztBQVFPLElBQU0sd0JBQXdCO0FBQUEsRUFDbkMsU0FBUztBQUFBLEVBQ1Qsb0JBQW9CLENBQUMsWUFBWSxtQkFBbUIsZUFBZSxVQUFVO0FBQy9FO0FBMkNBLElBQU0sMEJBQTBCLENBQUMsYUFBZ0MsYUFBYSxTQUFTLFlBQVk7QUFFbkcsSUFBTSwwQkFBMEIsQ0FBQyxxQkFBbUU7QUFDbEcsUUFBTSxNQUFNLG9CQUFJLElBQVk7QUFDNUIsYUFBVyxTQUFTLGtCQUFr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
|