@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,390 +0,0 @@
|
|
|
1
|
-
// @logixjs/core subpath bundles for @logixjs/sandbox
|
|
2
|
-
|
|
3
|
-
import {
|
|
4
|
-
build,
|
|
5
|
-
install
|
|
6
|
-
} from "./chunk-CDLXJHXY.js";
|
|
7
|
-
import {
|
|
8
|
-
Module
|
|
9
|
-
} from "./chunk-YF6IO732.js";
|
|
10
|
-
import {
|
|
11
|
-
attachLogicUnitMeta
|
|
12
|
-
} from "./chunk-PQ652ULI.js";
|
|
13
|
-
import {
|
|
14
|
-
mutateWithPatchPaths,
|
|
15
|
-
mutateWithoutPatches
|
|
16
|
-
} from "./chunk-JIXTOQXJ.js";
|
|
17
|
-
import {
|
|
18
|
-
normalizeActions
|
|
19
|
-
} from "./chunk-DOBF6YTQ.js";
|
|
20
|
-
import {
|
|
21
|
-
registerModuleProgram
|
|
22
|
-
} from "./chunk-A6JFUNQQ.js";
|
|
23
|
-
import {
|
|
24
|
-
getBoundInternals,
|
|
25
|
-
setModuleTraitsProgram
|
|
26
|
-
} from "./chunk-UCFEP3BH.js";
|
|
27
|
-
import {
|
|
28
|
-
currentDiagnosticsLevel,
|
|
29
|
-
record
|
|
30
|
-
} from "./chunk-UKYAF3NL.js";
|
|
31
|
-
import {
|
|
32
|
-
fnv1a32,
|
|
33
|
-
stableStringify
|
|
34
|
-
} from "./chunk-S46P7MC6.js";
|
|
35
|
-
|
|
36
|
-
// ../logix-core/src/ModuleTag.ts
|
|
37
|
-
import { Effect, FiberRef } from "../effect.js";
|
|
38
|
-
|
|
39
|
-
// ../logix-core/src/internal/runtime/core/ModuleTraits.ts
|
|
40
|
-
var ModuleTraitsConflictError = class extends Error {
|
|
41
|
-
constructor(moduleId, conflicts) {
|
|
42
|
-
super(
|
|
43
|
-
[
|
|
44
|
-
`[ModuleTraitsConflictError] Conflicting traitIds found (moduleId=${moduleId}).`,
|
|
45
|
-
...conflicts.map(
|
|
46
|
-
(c) => c.kind === "duplicate_traitId" ? `- duplicate ${c.traitId}: ${c.sources.map((s) => `${s.originType}:${s.originId}`).join(", ")}` : c.kind === "missing_requires" ? `- missing requires for ${c.traitId}: ${(c.missing ?? []).join(", ")}; sources=${c.sources.map((s) => `${s.originType}:${s.originId}`).join(", ")}` : `- excludes violation for ${c.traitId}: present=${(c.present ?? []).join(", ")}; sources=${c.sources.map((s) => `${s.originType}:${s.originId}`).join(", ")}`
|
|
47
|
-
)
|
|
48
|
-
].join("\n")
|
|
49
|
-
);
|
|
50
|
-
this.moduleId = moduleId;
|
|
51
|
-
this.conflicts = conflicts;
|
|
52
|
-
this._tag = "ModuleTraitsConflictError";
|
|
53
|
-
}
|
|
54
|
-
};
|
|
55
|
-
var toProvenanceKey = (p) => `${p.originType}:${p.originId}:${p.originIdKind}:${p.originLabel}:${p.path ?? ""}`;
|
|
56
|
-
var compareProvenance = (a, b) => {
|
|
57
|
-
const type = a.originType.localeCompare(b.originType);
|
|
58
|
-
if (type !== 0) return type;
|
|
59
|
-
const id = a.originId.localeCompare(b.originId);
|
|
60
|
-
if (id !== 0) return id;
|
|
61
|
-
const kind = a.originIdKind.localeCompare(b.originIdKind);
|
|
62
|
-
if (kind !== 0) return kind;
|
|
63
|
-
const label = a.originLabel.localeCompare(b.originLabel);
|
|
64
|
-
if (label !== 0) return label;
|
|
65
|
-
return String(a.path ?? "").localeCompare(String(b.path ?? ""));
|
|
66
|
-
};
|
|
67
|
-
var originTypeOrder = (t) => t === "module" ? 0 : 1;
|
|
68
|
-
var compareTraitIdByProvenance = (a, b) => {
|
|
69
|
-
const ta = originTypeOrder(a.provenance.originType) - originTypeOrder(b.provenance.originType);
|
|
70
|
-
if (ta !== 0) return ta;
|
|
71
|
-
const oa = a.provenance.originId.localeCompare(b.provenance.originId);
|
|
72
|
-
if (oa !== 0) return oa;
|
|
73
|
-
return a.traitId.localeCompare(b.traitId);
|
|
74
|
-
};
|
|
75
|
-
var extractStringArray = (value) => {
|
|
76
|
-
if (!Array.isArray(value)) return [];
|
|
77
|
-
const out = [];
|
|
78
|
-
for (const v of value) {
|
|
79
|
-
if (typeof v !== "string") continue;
|
|
80
|
-
const s = v.trim();
|
|
81
|
-
if (!s) continue;
|
|
82
|
-
out.push(s);
|
|
83
|
-
}
|
|
84
|
-
return out;
|
|
85
|
-
};
|
|
86
|
-
var getTraitRequires = (value) => {
|
|
87
|
-
if (!value || typeof value !== "object") return [];
|
|
88
|
-
const direct = extractStringArray(value.requires);
|
|
89
|
-
return direct;
|
|
90
|
-
};
|
|
91
|
-
var getTraitExcludes = (value) => {
|
|
92
|
-
if (!value || typeof value !== "object") return [];
|
|
93
|
-
const direct = extractStringArray(value.excludes);
|
|
94
|
-
return direct;
|
|
95
|
-
};
|
|
96
|
-
var getTraitName = (traitId, value) => {
|
|
97
|
-
if (value && typeof value === "object") {
|
|
98
|
-
const n = value.name;
|
|
99
|
-
if (typeof n === "string" && n.trim().length > 0) return n.trim();
|
|
100
|
-
}
|
|
101
|
-
return traitId;
|
|
102
|
-
};
|
|
103
|
-
var getTraitDescription = (value) => {
|
|
104
|
-
if (value && typeof value === "object") {
|
|
105
|
-
const d = value.description;
|
|
106
|
-
if (typeof d === "string" && d.trim().length > 0) return d.trim();
|
|
107
|
-
}
|
|
108
|
-
return void 0;
|
|
109
|
-
};
|
|
110
|
-
var finalizeTraitContributions = (args) => {
|
|
111
|
-
const traitById = /* @__PURE__ */ new Map();
|
|
112
|
-
const duplicateSources = /* @__PURE__ */ new Map();
|
|
113
|
-
const contributions = [...args.contributions].sort((a, b) => compareProvenance(a.provenance, b.provenance));
|
|
114
|
-
for (const c of contributions) {
|
|
115
|
-
const traits2 = c.traits;
|
|
116
|
-
if (!traits2 || typeof traits2 !== "object") continue;
|
|
117
|
-
for (const traitId of Object.keys(traits2).sort((a, b) => a.localeCompare(b))) {
|
|
118
|
-
const value = traits2[traitId];
|
|
119
|
-
if (value === void 0) continue;
|
|
120
|
-
const prev = traitById.get(traitId);
|
|
121
|
-
if (!prev) {
|
|
122
|
-
traitById.set(traitId, { value, provenance: c.provenance });
|
|
123
|
-
continue;
|
|
124
|
-
}
|
|
125
|
-
const sources = duplicateSources.get(traitId) ?? [prev.provenance];
|
|
126
|
-
sources.push(c.provenance);
|
|
127
|
-
duplicateSources.set(traitId, sources);
|
|
128
|
-
}
|
|
129
|
-
}
|
|
130
|
-
const conflicts = [];
|
|
131
|
-
const registerConflict = (conflict) => {
|
|
132
|
-
const unique = /* @__PURE__ */ new Map();
|
|
133
|
-
for (const s of conflict.sources) {
|
|
134
|
-
unique.set(toProvenanceKey(s), s);
|
|
135
|
-
}
|
|
136
|
-
conflicts.push({
|
|
137
|
-
...conflict,
|
|
138
|
-
sources: Array.from(unique.values()).sort(compareProvenance)
|
|
139
|
-
});
|
|
140
|
-
};
|
|
141
|
-
for (const traitId of Array.from(duplicateSources.keys()).sort((a, b) => a.localeCompare(b))) {
|
|
142
|
-
registerConflict({
|
|
143
|
-
kind: "duplicate_traitId",
|
|
144
|
-
traitId,
|
|
145
|
-
sources: duplicateSources.get(traitId) ?? []
|
|
146
|
-
});
|
|
147
|
-
}
|
|
148
|
-
const merged = {};
|
|
149
|
-
const provenanceIndex = {};
|
|
150
|
-
const traits = [];
|
|
151
|
-
const entries = [];
|
|
152
|
-
for (const traitId of traitById.keys()) {
|
|
153
|
-
const entry = traitById.get(traitId);
|
|
154
|
-
if (!entry) continue;
|
|
155
|
-
entries.push({ traitId, value: entry.value, provenance: entry.provenance });
|
|
156
|
-
}
|
|
157
|
-
const ids = entries.slice().sort(compareTraitIdByProvenance).map((e) => e.traitId);
|
|
158
|
-
for (const traitId of ids) {
|
|
159
|
-
const entry = traitById.get(traitId);
|
|
160
|
-
if (!entry) continue;
|
|
161
|
-
merged[traitId] = entry.value;
|
|
162
|
-
provenanceIndex[traitId] = entry.provenance;
|
|
163
|
-
traits.push({
|
|
164
|
-
traitId,
|
|
165
|
-
name: getTraitName(traitId, entry.value),
|
|
166
|
-
description: getTraitDescription(entry.value)
|
|
167
|
-
});
|
|
168
|
-
}
|
|
169
|
-
const present = new Set(ids);
|
|
170
|
-
for (const traitId of ids) {
|
|
171
|
-
const entry = traitById.get(traitId);
|
|
172
|
-
if (!entry) continue;
|
|
173
|
-
const requires = getTraitRequires(entry.value);
|
|
174
|
-
if (requires.length > 0) {
|
|
175
|
-
const missing = requires.filter((r) => !present.has(r));
|
|
176
|
-
if (missing.length > 0) {
|
|
177
|
-
registerConflict({
|
|
178
|
-
kind: "missing_requires",
|
|
179
|
-
traitId,
|
|
180
|
-
missing: Array.from(new Set(missing)).sort((a, b) => a.localeCompare(b)),
|
|
181
|
-
sources: [entry.provenance]
|
|
182
|
-
});
|
|
183
|
-
}
|
|
184
|
-
}
|
|
185
|
-
const excludes = getTraitExcludes(entry.value);
|
|
186
|
-
if (excludes.length > 0) {
|
|
187
|
-
const presentExcluded = excludes.filter((e) => present.has(e));
|
|
188
|
-
if (presentExcluded.length > 0) {
|
|
189
|
-
const otherSources = [];
|
|
190
|
-
for (const otherId of presentExcluded) {
|
|
191
|
-
const other = traitById.get(otherId);
|
|
192
|
-
if (other) otherSources.push(other.provenance);
|
|
193
|
-
}
|
|
194
|
-
registerConflict({
|
|
195
|
-
kind: "excludes_violation",
|
|
196
|
-
traitId,
|
|
197
|
-
present: Array.from(new Set(presentExcluded)).sort((a, b) => a.localeCompare(b)),
|
|
198
|
-
sources: [entry.provenance, ...otherSources]
|
|
199
|
-
});
|
|
200
|
-
}
|
|
201
|
-
}
|
|
202
|
-
}
|
|
203
|
-
if (conflicts.length > 0) {
|
|
204
|
-
const kindOrder = {
|
|
205
|
-
duplicate_traitId: 0,
|
|
206
|
-
missing_requires: 1,
|
|
207
|
-
excludes_violation: 2
|
|
208
|
-
};
|
|
209
|
-
conflicts.sort((a, b) => {
|
|
210
|
-
const k = kindOrder[a.kind] - kindOrder[b.kind];
|
|
211
|
-
if (k !== 0) return k;
|
|
212
|
-
return a.traitId.localeCompare(b.traitId);
|
|
213
|
-
});
|
|
214
|
-
throw new ModuleTraitsConflictError(args.moduleId, conflicts);
|
|
215
|
-
}
|
|
216
|
-
const digestBase = {
|
|
217
|
-
moduleId: args.moduleId,
|
|
218
|
-
traits,
|
|
219
|
-
provenanceIndex
|
|
220
|
-
};
|
|
221
|
-
const digest = `mtraits:023:${fnv1a32(stableStringify(digestBase))}`;
|
|
222
|
-
return {
|
|
223
|
-
merged,
|
|
224
|
-
snapshot: {
|
|
225
|
-
moduleId: args.moduleId,
|
|
226
|
-
digest,
|
|
227
|
-
traits,
|
|
228
|
-
provenanceIndex
|
|
229
|
-
}
|
|
230
|
-
};
|
|
231
|
-
};
|
|
232
|
-
|
|
233
|
-
// ../logix-core/src/ModuleTag.ts
|
|
234
|
-
var Reducer = {
|
|
235
|
-
mutate: (mutator) => (state, action, sink) => {
|
|
236
|
-
const payload = action?.payload;
|
|
237
|
-
if (!sink) {
|
|
238
|
-
return mutateWithoutPatches(state, (draft) => {
|
|
239
|
-
mutator(draft, payload);
|
|
240
|
-
});
|
|
241
|
-
}
|
|
242
|
-
const { nextState, patchPaths } = mutateWithPatchPaths(state, (draft) => {
|
|
243
|
-
mutator(draft, payload);
|
|
244
|
-
});
|
|
245
|
-
for (const path of patchPaths) {
|
|
246
|
-
sink(path);
|
|
247
|
-
}
|
|
248
|
-
return nextState;
|
|
249
|
-
},
|
|
250
|
-
mutateMap: (mutators) => {
|
|
251
|
-
const out = {};
|
|
252
|
-
for (const key of Object.keys(mutators)) {
|
|
253
|
-
const mutator = mutators[key];
|
|
254
|
-
if (typeof mutator !== "function") continue;
|
|
255
|
-
out[key] = Reducer.mutate(mutator);
|
|
256
|
-
}
|
|
257
|
-
return out;
|
|
258
|
-
}
|
|
259
|
-
};
|
|
260
|
-
var makeImpl = (id, def) => Module(id, def);
|
|
261
|
-
var make = (id, def) => {
|
|
262
|
-
const actions = normalizeActions(def.actions);
|
|
263
|
-
const moduleTag = makeImpl(id, {
|
|
264
|
-
state: def.state,
|
|
265
|
-
actions,
|
|
266
|
-
reducers: def.reducers
|
|
267
|
-
});
|
|
268
|
-
const stateSchema = def.state;
|
|
269
|
-
const moduleTraitsSpec = def.traits;
|
|
270
|
-
const baseProgram = moduleTraitsSpec ? build(stateSchema, moduleTraitsSpec) : void 0;
|
|
271
|
-
if (baseProgram) {
|
|
272
|
-
setModuleTraitsProgram(moduleTag, baseProgram);
|
|
273
|
-
registerModuleProgram(id, baseProgram);
|
|
274
|
-
}
|
|
275
|
-
const makeModuleTraitsContributionLogic = (traits) => {
|
|
276
|
-
const logic = moduleTag.logic(($) => ({
|
|
277
|
-
setup: Effect.sync(() => {
|
|
278
|
-
if (!traits || typeof traits !== "object") return;
|
|
279
|
-
const internals = getBoundInternals($);
|
|
280
|
-
internals.traits.registerModuleTraitsContribution({
|
|
281
|
-
traits,
|
|
282
|
-
provenance: {
|
|
283
|
-
originType: "module",
|
|
284
|
-
originId: id,
|
|
285
|
-
originIdKind: "explicit",
|
|
286
|
-
originLabel: `module:${id}`
|
|
287
|
-
}
|
|
288
|
-
});
|
|
289
|
-
}),
|
|
290
|
-
run: Effect.void
|
|
291
|
-
}));
|
|
292
|
-
attachLogicUnitMeta(logic, {
|
|
293
|
-
id: "__logix_internal:traits:module_contrib",
|
|
294
|
-
kind: "internal",
|
|
295
|
-
name: "traits:module_contrib",
|
|
296
|
-
moduleId: id
|
|
297
|
-
});
|
|
298
|
-
return logic;
|
|
299
|
-
};
|
|
300
|
-
const makeFinalizeTraitsLogic = () => {
|
|
301
|
-
const logic = moduleTag.logic(($) => ({
|
|
302
|
-
setup: Effect.gen(function* () {
|
|
303
|
-
const internals = getBoundInternals($);
|
|
304
|
-
const diagnosticsLevel = yield* FiberRef.get(currentDiagnosticsLevel);
|
|
305
|
-
const contributions = internals.traits.getModuleTraitsContributions();
|
|
306
|
-
let merged;
|
|
307
|
-
let snapshot;
|
|
308
|
-
try {
|
|
309
|
-
;
|
|
310
|
-
({ merged, snapshot } = finalizeTraitContributions({
|
|
311
|
-
moduleId: id,
|
|
312
|
-
contributions
|
|
313
|
-
}));
|
|
314
|
-
} catch (cause) {
|
|
315
|
-
if (diagnosticsLevel !== "off" && cause && typeof cause === "object" && cause._tag === "ModuleTraitsConflictError") {
|
|
316
|
-
const conflicts = Array.isArray(cause.conflicts) ? cause.conflicts : [];
|
|
317
|
-
const traitIds = conflicts.map((c) => c && typeof c === "object" ? c.traitId : void 0).filter((t) => typeof t === "string" && t.length > 0).slice(0, 20);
|
|
318
|
-
const data = diagnosticsLevel === "full" ? {
|
|
319
|
-
conflictCount: conflicts.length,
|
|
320
|
-
conflicts
|
|
321
|
-
} : {
|
|
322
|
-
conflictCount: conflicts.length,
|
|
323
|
-
traitIds
|
|
324
|
-
};
|
|
325
|
-
yield* record({
|
|
326
|
-
type: "trace:module:traits:conflict",
|
|
327
|
-
moduleId: id,
|
|
328
|
-
instanceId: internals.instanceId,
|
|
329
|
-
data
|
|
330
|
-
});
|
|
331
|
-
}
|
|
332
|
-
throw cause;
|
|
333
|
-
}
|
|
334
|
-
internals.traits.setModuleTraitsSnapshot(snapshot);
|
|
335
|
-
internals.traits.freezeModuleTraits();
|
|
336
|
-
if (diagnosticsLevel !== "off") {
|
|
337
|
-
const data = diagnosticsLevel === "full" ? {
|
|
338
|
-
digest: snapshot.digest,
|
|
339
|
-
count: snapshot.traits.length,
|
|
340
|
-
traits: snapshot.traits,
|
|
341
|
-
provenanceIndex: snapshot.provenanceIndex
|
|
342
|
-
} : {
|
|
343
|
-
digest: snapshot.digest,
|
|
344
|
-
count: snapshot.traits.length
|
|
345
|
-
};
|
|
346
|
-
yield* record({
|
|
347
|
-
type: "trace:module:traits",
|
|
348
|
-
moduleId: id,
|
|
349
|
-
instanceId: internals.instanceId,
|
|
350
|
-
data
|
|
351
|
-
});
|
|
352
|
-
}
|
|
353
|
-
if (Object.keys(merged).length === 0) {
|
|
354
|
-
return;
|
|
355
|
-
}
|
|
356
|
-
const onlyModuleLevel = contributions.length === 1 && contributions[0]?.provenance?.originType === "module";
|
|
357
|
-
const program = onlyModuleLevel && baseProgram ? baseProgram : build(stateSchema, merged);
|
|
358
|
-
setModuleTraitsProgram(moduleTag, program);
|
|
359
|
-
registerModuleProgram(id, program);
|
|
360
|
-
yield* install($, program);
|
|
361
|
-
}),
|
|
362
|
-
run: Effect.void
|
|
363
|
-
}));
|
|
364
|
-
attachLogicUnitMeta(logic, {
|
|
365
|
-
id: "__logix_internal:traits:finalize",
|
|
366
|
-
kind: "internal",
|
|
367
|
-
name: "traits:finalize",
|
|
368
|
-
moduleId: id
|
|
369
|
-
});
|
|
370
|
-
return logic;
|
|
371
|
-
};
|
|
372
|
-
const originalImplement = moduleTag.implement;
|
|
373
|
-
moduleTag.implement = ((config) => {
|
|
374
|
-
const userLogics = config.logics ?? [];
|
|
375
|
-
const moduleLevel = def.traits ? [makeModuleTraitsContributionLogic(def.traits)] : [];
|
|
376
|
-
const finalize = makeFinalizeTraitsLogic();
|
|
377
|
-
const mergedLogics = [...moduleLevel, ...userLogics, finalize];
|
|
378
|
-
return originalImplement({
|
|
379
|
-
...config,
|
|
380
|
-
logics: mergedLogics
|
|
381
|
-
});
|
|
382
|
-
});
|
|
383
|
-
return moduleTag;
|
|
384
|
-
};
|
|
385
|
-
|
|
386
|
-
export {
|
|
387
|
-
Reducer,
|
|
388
|
-
make
|
|
389
|
-
};
|
|
390
|
-
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vbG9naXgtY29yZS9zcmMvTW9kdWxlVGFnLnRzIiwgIi4uLy4uLy4uLy4uL2xvZ2l4LWNvcmUvc3JjL2ludGVybmFsL3J1bnRpbWUvY29yZS9Nb2R1bGVUcmFpdHMudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbImltcG9ydCB7IEVmZmVjdCwgRmliZXJSZWYsIExheWVyLCBTY2hlbWEgfSBmcm9tICdlZmZlY3QnXG5pbXBvcnQgKiBhcyBMb2dpYyBmcm9tICcuL0xvZ2ljLmpzJ1xuaW1wb3J0ICogYXMgQWN0aW9uIGZyb20gJy4vaW50ZXJuYWwvYWN0aW9uLmpzJ1xuaW1wb3J0ICogYXMgTW9kdWxlRmFjdG9yeSBmcm9tICcuL2ludGVybmFsL3J1bnRpbWUvTW9kdWxlRmFjdG9yeS5qcydcbmltcG9ydCB0eXBlIHsgRmllbGRQYXRoIH0gZnJvbSAnLi9pbnRlcm5hbC9maWVsZC1wYXRoLmpzJ1xuaW1wb3J0IHsgbXV0YXRlV2l0aG91dFBhdGNoZXMsIG11dGF0ZVdpdGhQYXRjaFBhdGhzIH0gZnJvbSAnLi9pbnRlcm5hbC9ydW50aW1lL2NvcmUvbXV0YXRpdmVQYXRjaGVzLmpzJ1xuaW1wb3J0IHsgZ2V0Qm91bmRJbnRlcm5hbHMsIHNldE1vZHVsZVRyYWl0c1Byb2dyYW0gfSBmcm9tICcuL2ludGVybmFsL3J1bnRpbWUvY29yZS9ydW50aW1lSW50ZXJuYWxzQWNjZXNzb3IuanMnXG5pbXBvcnQgKiBhcyBEZWJ1ZyBmcm9tICcuL2ludGVybmFsL3J1bnRpbWUvY29yZS9EZWJ1Z1NpbmsuanMnXG5pbXBvcnQgKiBhcyBMb2dpY1VuaXRNZXRhIGZyb20gJy4vaW50ZXJuYWwvcnVudGltZS9jb3JlL0xvZ2ljVW5pdE1ldGEuanMnXG5pbXBvcnQgdHlwZSB7XG4gIEFjdGlvbnNGcm9tTWFwLFxuICBBbnlNb2R1bGVTaGFwZSxcbiAgQW55U2NoZW1hLFxuICBCb3VuZEFwaSxcbiAgQWN0aW9uT2YsXG4gIE1vZHVsZUltcGwsXG4gIE1vZHVsZUxvZ2ljLFxuICBNb2R1bGVTaGFwZSxcbiAgTW9kdWxlUnVudGltZSxcbiAgTW9kdWxlVGFnLFxuICBNb2R1bGVIYW5kbGUsXG4gIE1vZHVsZUhhbmRsZVVuaW9uLFxuICBTdGF0ZUNoYW5nZVdpdGhNZXRhLFxuICBTdGF0ZUNvbW1pdE1ldGEsXG4gIFN0YXRlQ29tbWl0TW9kZSxcbiAgU3RhdGVDb21taXRQcmlvcml0eSxcbiAgUmVkdWNlcnNGcm9tTWFwLFxuICBTdGF0ZU9mLFxufSBmcm9tICcuL2ludGVybmFsL21vZHVsZS5qcydcbmltcG9ydCAqIGFzIFN0YXRlVHJhaXQgZnJvbSAnLi9TdGF0ZVRyYWl0LmpzJ1xuaW1wb3J0IHR5cGUgeyBTdGF0ZVRyYWl0UHJvZ3JhbSB9IGZyb20gJy4vU3RhdGVUcmFpdC5qcydcbmltcG9ydCAqIGFzIE1vZHVsZVRyYWl0c1JlZ2lzdHJ5IGZyb20gJy4vaW50ZXJuYWwvZGVidWcvTW9kdWxlVHJhaXRzUmVnaXN0cnkuanMnXG5pbXBvcnQgKiBhcyBNb2R1bGVUcmFpdHMgZnJvbSAnLi9pbnRlcm5hbC9ydW50aW1lL2NvcmUvTW9kdWxlVHJhaXRzLmpzJ1xuXG50eXBlIE5vSW5mZXJfPFQ+ID0gW1RdW1QgZXh0ZW5kcyBhbnkgPyAwIDogbmV2ZXJdXG5cbi8qKlxuICogUHVibGljIGV4cG9ydHMgZm9yIGNvcmUgdHlwZSBkZWZpbml0aW9ucyBzdWNoIGFzIE1vZHVsZVRhZyAvIE1vZHVsZVJ1bnRpbWUgLyBNb2R1bGVJbXBsLlxuICpcbiAqIEtlcHQgYWxpZ25lZCB3aXRoIGAuY29kZXgvc2tpbGxzL3Byb2plY3QtZ3VpZGUvcmVmZXJlbmNlcy9ydW50aW1lLWxvZ2l4L2xvZ2l4LWNvcmUvYXBpLzAyLW1vZHVsZS1hbmQtbG9naWMtYXBpLm1kYC5cbiAqIENvbmNyZXRlIHR5cGUgZGVmaW5pdGlvbnMgbGl2ZSBpbiBpbnRlcm5hbC9tb2R1bGUudHM7IHRoaXMgbW9kdWxlIHdpcmVzIHRoZSBmYWN0b3J5IGltcGxlbWVudGF0aW9uLlxuICovXG5leHBvcnQgdHlwZSB7XG4gIEFueVNjaGVtYSxcbiAgQW55TW9kdWxlU2hhcGUsXG4gIE1vZHVsZVNoYXBlLFxuICBNb2R1bGVMb2dpYyxcbiAgTW9kdWxlSW1wbCxcbiAgTW9kdWxlUnVudGltZSxcbiAgTW9kdWxlVGFnLFxuICBNb2R1bGVIYW5kbGUsXG4gIE1vZHVsZUhhbmRsZVVuaW9uLFxuICBTdGF0ZU9mLFxuICBBY3Rpb25zRnJvbU1hcCxcbiAgUmVkdWNlcnNGcm9tTWFwLFxuICBCb3VuZEFwaSxcbiAgQWN0aW9uT2YsXG4gIFN0YXRlQ29tbWl0TW9kZSxcbiAgU3RhdGVDb21taXRQcmlvcml0eSxcbiAgU3RhdGVDb21taXRNZXRhLFxuICBTdGF0ZUNoYW5nZVdpdGhNZXRhLFxufSBmcm9tICcuL2ludGVybmFsL21vZHVsZS5qcydcblxuLyoqXG4gKiBSZWR1Y2VyIGhlbHBlcjpcbiAqIC0gYFJlZHVjZXIubXV0YXRlYCBwcm92aWRlcyB0aGUgc2FtZSBtdXRhdGl2ZSBzdHlsZSBhcyBgJC5zdGF0ZS5tdXRhdGVgLlxuICogLSBJbnRlcm5hbGx5IHVzZXMgbXV0YXRpdmUtYmFzZWQgaW1tdXRhYmxlIHVwZGF0ZXMgdG8gbWFwIFwiaW4tcGxhY2UgZHJhZnQgbXV0YXRpb25cIiBpbnRvIGEgcHVyZSBgKHN0YXRlLCBhY3Rpb24pID0+IHN0YXRlYC5cbiAqXG4gKiBAZXhhbXBsZVxuICpcbiAqICAgY29uc3QgQ291bnRlciA9IExvZ2l4Lk1vZHVsZVRhZy5tYWtlKFwiQ291bnRlclwiLCB7XG4gKiAgICAgc3RhdGU6IENvdW50ZXJTdGF0ZSxcbiAqICAgICBhY3Rpb25zOiBDb3VudGVyQWN0aW9ucyxcbiAqICAgICByZWR1Y2Vyczoge1xuICogICAgICAgaW5jOiBMb2dpeC5Nb2R1bGVUYWcuUmVkdWNlci5tdXRhdGUoKGRyYWZ0LCBfcGF5bG9hZCkgPT4ge1xuICogICAgICAgICBkcmFmdC5jb3VudCArPSAxXG4gKiAgICAgICB9KSxcbiAqICAgICB9LFxuICogICB9KVxuICpcbiAqICAgeWllbGQqICQucmVkdWNlcihcbiAqICAgICBcInNldFZhbHVlXCIsXG4gKiAgICAgTG9naXguTW9kdWxlVGFnLlJlZHVjZXIubXV0YXRlKChkcmFmdCwgcGF5bG9hZCkgPT4ge1xuICogICAgICAgZHJhZnQudmFsdWUgPSBwYXlsb2FkXG4gKiAgICAgfSksXG4gKiAgIClcbiAqL1xuZXhwb3J0IGNvbnN0IFJlZHVjZXIgPSB7XG4gIG11dGF0ZTpcbiAgICA8UywgQSBleHRlbmRzIHsgcmVhZG9ubHkgcGF5bG9hZD86IGFueSB9PihcbiAgICAgIG11dGF0b3I6IChkcmFmdDogTG9naWMuRHJhZnQ8Uz4sIHBheWxvYWQ6IEFbJ3BheWxvYWQnXSkgPT4gdm9pZCxcbiAgICApOiAoKHN0YXRlOiBTLCBhY3Rpb246IEEsIHNpbms/OiAocGF0aDogc3RyaW5nIHwgRmllbGRQYXRoKSA9PiB2b2lkKSA9PiBTKSA9PlxuICAgIChzdGF0ZSwgYWN0aW9uLCBzaW5rKSA9PiB7XG4gICAgICBjb25zdCBwYXlsb2FkID0gKGFjdGlvbiBhcyBhbnkpPy5wYXlsb2FkIGFzIEFbJ3BheWxvYWQnXVxuICAgICAgaWYgKCFzaW5rKSB7XG4gICAgICAgIHJldHVybiBtdXRhdGVXaXRob3V0UGF0Y2hlcyhzdGF0ZSBhcyBTLCAoZHJhZnQpID0+IHtcbiAgICAgICAgICBtdXRhdG9yKGRyYWZ0IGFzIExvZ2ljLkRyYWZ0PFM+LCBwYXlsb2FkKVxuICAgICAgICB9KVxuICAgICAgfVxuXG4gICAgICBjb25zdCB7IG5leHRTdGF0ZSwgcGF0Y2hQYXRocyB9ID0gbXV0YXRlV2l0aFBhdGNoUGF0aHMoc3RhdGUgYXMgUywgKGRyYWZ0KSA9PiB7XG4gICAgICAgIG11dGF0b3IoZHJhZnQgYXMgTG9naWMuRHJhZnQ8Uz4sIHBheWxvYWQpXG4gICAgICB9KVxuXG4gICAgICBmb3IgKGNvbnN0IHBhdGggb2YgcGF0Y2hQYXRocykge1xuICAgICAgICBzaW5rKHBhdGgpXG4gICAgICB9XG5cbiAgICAgIHJldHVybiBuZXh0U3RhdGVcbiAgICB9LFxuXG4gIG11dGF0ZU1hcDogPFxuICAgIFIgZXh0ZW5kcyBSZWFkb25seTxcbiAgICAgIFJlY29yZDxzdHJpbmcsICgoc3RhdGU6IGFueSwgYWN0aW9uOiBhbnksIHNpbms/OiAocGF0aDogc3RyaW5nIHwgRmllbGRQYXRoKSA9PiB2b2lkKSA9PiBhbnkpIHwgdW5kZWZpbmVkPlxuICAgID4sXG4gID4obXV0YXRvcnM6IHtcbiAgICByZWFkb25seSBbSyBpbiBrZXlvZiBOb0luZmVyXzxSPl0/OiAoXG4gICAgICBkcmFmdDogTG9naWMuRHJhZnQ8UGFyYW1ldGVyczxOb25OdWxsYWJsZTxOb0luZmVyXzxSPltLXT4+WzBdPixcbiAgICAgIHBheWxvYWQ6IFBhcmFtZXRlcnM8Tm9uTnVsbGFibGU8Tm9JbmZlcl88Uj5bS10+PlsxXSBleHRlbmRzIHsgcmVhZG9ubHkgcGF5bG9hZDogaW5mZXIgUCB9XG4gICAgICAgID8gUFxuICAgICAgICA6IFBhcmFtZXRlcnM8Tm9uTnVsbGFibGU8Tm9JbmZlcl88Uj5bS10+PlsxXSBleHRlbmRzIHsgcmVhZG9ubHkgcGF5bG9hZD86IGluZmVyIFAgfVxuICAgICAgICAgID8gUCB8IHVuZGVmaW5lZFxuICAgICAgICAgIDogbmV2ZXIsXG4gICAgKSA9PiB2b2lkXG4gIH0pOiBSID0+IHtcbiAgICBjb25zdCBvdXQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge31cbiAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhtdXRhdG9ycykpIHtcbiAgICAgIGNvbnN0IG11dGF0b3IgPSAobXV0YXRvcnMgYXMgYW55KVtrZXldXG4gICAgICBpZiAodHlwZW9mIG11dGF0b3IgIT09ICdmdW5jdGlvbicpIGNvbnRpbnVlXG4gICAgICBvdXRba2V5XSA9IFJlZHVjZXIubXV0YXRlKG11dGF0b3IgYXMgYW55KVxuICAgIH1cbiAgICByZXR1cm4gb3V0IGFzIGFueVxuICB9LFxufVxuXG4vKipcbiAqIEEgc2ltcGxpZmllZCBTaGFwZSBkZWZpbml0aW9uIGhlbHBlciwgZGVzaWduZWQgZm9yIEFjdGlvbiBNYXBzLlxuICogQGV4YW1wbGUgdHlwZSBNeVNoYXBlID0gU2hhcGU8dHlwZW9mIE15U3RhdGUsIHR5cGVvZiBNeUFjdGlvbk1hcD5cbiAqL1xuZXhwb3J0IHR5cGUgU2hhcGU8UyBleHRlbmRzIEFueVNjaGVtYSwgTSBleHRlbmRzIFJlY29yZDxzdHJpbmcsIEFueVNjaGVtYT4+ID0gTW9kdWxlU2hhcGU8XG4gIFMsXG4gIFNjaGVtYS5TY2hlbWE8QWN0aW9uc0Zyb21NYXA8QWN0aW9uLk5vcm1hbGl6ZWRBY3Rpb25Ub2tlbnM8TSAmIEFjdGlvbi5BY3Rpb25EZWZzPj4+LFxuICBBY3Rpb24uTm9ybWFsaXplZEFjdGlvblRva2VuczxNICYgQWN0aW9uLkFjdGlvbkRlZnM+XG4+XG5cbmNvbnN0IG1ha2VJbXBsID0gPElkIGV4dGVuZHMgc3RyaW5nLCBTU2NoZW1hIGV4dGVuZHMgQW55U2NoZW1hLCBBTWFwIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgQWN0aW9uLkFueUFjdGlvblRva2VuPj4oXG4gIGlkOiBJZCxcbiAgZGVmOiB7XG4gICAgcmVhZG9ubHkgc3RhdGU6IFNTY2hlbWFcbiAgICByZWFkb25seSBhY3Rpb25zOiBBTWFwXG4gICAgcmVhZG9ubHkgcmVkdWNlcnM/OiBSZWR1Y2Vyc0Zyb21NYXA8U1NjaGVtYSwgQU1hcD5cbiAgfSxcbik6IE1vZHVsZVRhZzxJZCwgTW9kdWxlU2hhcGU8U1NjaGVtYSwgU2NoZW1hLlNjaGVtYTxBY3Rpb25zRnJvbU1hcDxBTWFwPj4sIEFNYXA+PiA9PlxuICBNb2R1bGVGYWN0b3J5Lk1vZHVsZShpZCwgZGVmKSBhcyBNb2R1bGVUYWc8SWQsIE1vZHVsZVNoYXBlPFNTY2hlbWEsIFNjaGVtYS5TY2hlbWE8QWN0aW9uc0Zyb21NYXA8QU1hcD4+LCBBTWFwPj5cblxuLyoqXG4gKiBNb2R1bGVUYWcubWFrZVx1RkYxQVxuICogLSBEZWZpbmVzIGEgZG9tYWluIG1vZHVsZSBUYWcgdXNpbmcgdGhlIGdpdmVuIGlkIGFuZCBzdGF0ZS9hY3Rpb25zL3JlZHVjZXJzLlxuICogLSBUaGUgcmV0dXJuZWQgTW9kdWxlVGFnIGlzIGJvdGggYSBDb250ZXh0LlRhZyBhbmQgYSBmYWN0b3J5IGNhcnJ5aW5nIGl0cyBTaGFwZS5cbiAqXG4gKiBOb3RlOiBzaW5jZSAwMjIsIHRoZSBvbGQgYE1vZHVsZWAgKFRhZyBpZGVudGl0eSkgd2FzIHJlbmFtZWQgdG8gYE1vZHVsZVRhZ2A7IHVzZSBgTG9naXguTW9kdWxlYCBmb3IgbW9kdWxlIGRlZmluaXRpb24gb2JqZWN0cy5cbiAqL1xuZXhwb3J0IGNvbnN0IG1ha2UgPSA8SWQgZXh0ZW5kcyBzdHJpbmcsIFNTY2hlbWEgZXh0ZW5kcyBBbnlTY2hlbWEsIEFEZWZzIGV4dGVuZHMgQWN0aW9uLkFjdGlvbkRlZnM+KFxuICBpZDogSWQsXG4gIGRlZjoge1xuICAgIHJlYWRvbmx5IHN0YXRlOiBTU2NoZW1hXG4gICAgcmVhZG9ubHkgYWN0aW9uczogQURlZnNcbiAgICByZWFkb25seSByZWR1Y2Vycz86IFJlZHVjZXJzRnJvbU1hcDxTU2NoZW1hLCBBRGVmcz5cbiAgICAvKipcbiAgICAgKiB0cmFpdHNcdUZGMUFcbiAgICAgKiAtIFVzZWQgdG8gYXR0YWNoIGEgU3RhdGVUcmFpdFNwZWMgKHNlZSBzcGVjcy8wMDAtbW9kdWxlLXRyYWl0cy1ydW50aW1lKS5cbiAgICAgKiAtIFRoZSBjdXJyZW50IGltcGxlbWVudGF0aW9uIGJ1aWxkcyBhIFByb2dyYW0gZHVyaW5nIE1vZHVsZVRhZy5tYWtlLCBhbmQgaW5qZWN0cyBhIHNldHVwLW9ubHkgTG9naWMgaW4gYE1vZHVsZVRhZy5pbXBsZW1lbnRgXG4gICAgICogICB0byBjYWxsIGBTdGF0ZVRyYWl0Lmluc3RhbGxgLlxuICAgICAqICAgKE5vdGU6IGlmIHlvdSB1c2UgYE1vZHVsZVRhZy5saXZlYCB0byBleHBvcnQgYSBMYXllciBhbmQgd2FudCB0cmFpdCBiZWhhdmlvciwgY2FsbCBgU3RhdGVUcmFpdC5pbnN0YWxsYCBleHBsaWNpdGx5IGluIGxvZ2ljcyxcbiAgICAgKiAgIG9yIHVzZSBgTW9kdWxlVGFnLmltcGxlbWVudGAgaW5zdGVhZC4pXG4gICAgICovXG4gICAgcmVhZG9ubHkgdHJhaXRzPzogdW5rbm93blxuICB9LFxuKTogTW9kdWxlVGFnPFxuICBJZCxcbiAgTW9kdWxlU2hhcGU8XG4gICAgU1NjaGVtYSxcbiAgICBTY2hlbWEuU2NoZW1hPEFjdGlvbnNGcm9tTWFwPEFjdGlvbi5Ob3JtYWxpemVkQWN0aW9uVG9rZW5zPEFEZWZzPj4+LFxuICAgIEFjdGlvbi5Ob3JtYWxpemVkQWN0aW9uVG9rZW5zPEFEZWZzPlxuICA+XG4+ID0+IHtcbiAgY29uc3QgYWN0aW9ucyA9IEFjdGlvbi5ub3JtYWxpemVBY3Rpb25zKGRlZi5hY3Rpb25zKVxuICBjb25zdCBtb2R1bGVUYWcgPSBtYWtlSW1wbChpZCwge1xuICAgIHN0YXRlOiBkZWYuc3RhdGUsXG4gICAgYWN0aW9ucyxcbiAgICByZWR1Y2VyczogZGVmLnJlZHVjZXJzIGFzIGFueSxcbiAgfSlcblxuICB0eXBlIFNoID0gTW9kdWxlU2hhcGU8XG4gICAgU1NjaGVtYSxcbiAgICBTY2hlbWEuU2NoZW1hPEFjdGlvbnNGcm9tTWFwPEFjdGlvbi5Ob3JtYWxpemVkQWN0aW9uVG9rZW5zPEFEZWZzPj4+LFxuICAgIEFjdGlvbi5Ob3JtYWxpemVkQWN0aW9uVG9rZW5zPEFEZWZzPlxuICA+XG5cbiAgY29uc3Qgc3RhdGVTY2hlbWEgPSBkZWYuc3RhdGUgYXMgU2NoZW1hLlNjaGVtYTxhbnksIGFueT5cbiAgY29uc3QgbW9kdWxlVHJhaXRzU3BlYyA9IGRlZi50cmFpdHMgYXMgU3RhdGVUcmFpdC5TdGF0ZVRyYWl0U3BlYzxhbnk+IHwgdW5kZWZpbmVkXG4gIGNvbnN0IGJhc2VQcm9ncmFtOiBTdGF0ZVRyYWl0UHJvZ3JhbTxhbnk+IHwgdW5kZWZpbmVkID0gbW9kdWxlVHJhaXRzU3BlY1xuICAgID8gU3RhdGVUcmFpdC5idWlsZChzdGF0ZVNjaGVtYSBhcyBhbnksIG1vZHVsZVRyYWl0c1NwZWMgYXMgYW55KVxuICAgIDogdW5kZWZpbmVkXG5cbiAgaWYgKGJhc2VQcm9ncmFtKSB7XG4gICAgLy8gRm9yIFRyYWl0TGlmZWN5Y2xlL0RlYnVnL0RldnRvb2xzIHJlYWRzIChkZWZpbml0aW9uLXNpZGUgaGlkZGVuIHNsb3QpLlxuICAgIHNldE1vZHVsZVRyYWl0c1Byb2dyYW0obW9kdWxlVGFnIGFzIGFueSwgYmFzZVByb2dyYW0pXG4gICAgTW9kdWxlVHJhaXRzUmVnaXN0cnkucmVnaXN0ZXJNb2R1bGVQcm9ncmFtKGlkLCBiYXNlUHJvZ3JhbSBhcyBTdGF0ZVRyYWl0UHJvZ3JhbTxhbnk+KVxuICB9XG5cbiAgLy8gMDIzOiBjb25zb2xpZGF0ZSB0aGUgdHJhaXQgXCJkZWNsYXJhdGlvbi9tZXJnZSBlbnRyeSBwb2ludHNcIiBpbnRvIHRoZSBzZXR1cCBwaGFzZTpcbiAgLy8gLSBtb2R1bGUtbGV2ZWwgdHJhaXRzIHJlZ2lzdGVyIGFzIGNvbnRyaWJ1dGlvbnMgZmlyc3Q7XG4gIC8vIC0gbG9naWMtbGV2ZWwgZGVjbGFyZXMgdmlhICQudHJhaXRzLmRlY2xhcmU7XG4gIC8vIC0gZmluYWxseSwgZmluYWxpemUgXHUyMTkyIGZyZWV6ZSBcdTIxOTIgYnVpbGQvaW5zdGFsbCBpbiBvbmUgc2hvdC5cblxuICBjb25zdCBtYWtlTW9kdWxlVHJhaXRzQ29udHJpYnV0aW9uTG9naWMgPSAodHJhaXRzOiB1bmtub3duKTogTW9kdWxlTG9naWM8U2gsIG5ldmVyLCBuZXZlcj4gPT4ge1xuICAgIGNvbnN0IGxvZ2ljID0gbW9kdWxlVGFnLmxvZ2ljKCgkKSA9PiAoe1xuICAgICAgc2V0dXA6IEVmZmVjdC5zeW5jKCgpID0+IHtcbiAgICAgICAgaWYgKCF0cmFpdHMgfHwgdHlwZW9mIHRyYWl0cyAhPT0gJ29iamVjdCcpIHJldHVyblxuICAgICAgICAvLyBtb2R1bGUtbGV2ZWwgcHJvdmVuYW5jZSB1c2VzIG1vZHVsZUlkIGFzIHRoZSBzdGFibGUgYW5jaG9yXG4gICAgICAgIC8vIChhbGlnbmVkIHdpdGggMDIzIGRhdGEtbW9kZWw6IG9yaWdpblR5cGU9bW9kdWxlLCBvcmlnaW5JZD1tb2R1bGVJZCkuXG4gICAgICAgIC8vIE5vdGU6IHRyYWl0c1NwZWMgc3RpbGwgcmV1c2VzIFN0YXRlVHJhaXRTcGVjOyBkbyBub3QgaW50cm9kdWNlIGEgc2Vjb25kIElSLlxuICAgICAgICBjb25zdCBpbnRlcm5hbHMgPSBnZXRCb3VuZEludGVybmFscygkIGFzIGFueSlcbiAgICAgICAgaW50ZXJuYWxzLnRyYWl0cy5yZWdpc3Rlck1vZHVsZVRyYWl0c0NvbnRyaWJ1dGlvbih7XG4gICAgICAgICAgdHJhaXRzLFxuICAgICAgICAgIHByb3ZlbmFuY2U6IHtcbiAgICAgICAgICAgIG9yaWdpblR5cGU6ICdtb2R1bGUnLFxuICAgICAgICAgICAgb3JpZ2luSWQ6IGlkLFxuICAgICAgICAgICAgb3JpZ2luSWRLaW5kOiAnZXhwbGljaXQnLFxuICAgICAgICAgICAgb3JpZ2luTGFiZWw6IGBtb2R1bGU6JHtpZH1gLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0pXG4gICAgICB9KSxcbiAgICAgIHJ1bjogRWZmZWN0LnZvaWQsXG4gICAgfSkpIGFzIE1vZHVsZUxvZ2ljPFNoLCBuZXZlciwgbmV2ZXI+XG5cbiAgICBMb2dpY1VuaXRNZXRhLmF0dGFjaExvZ2ljVW5pdE1ldGEobG9naWMgYXMgYW55LCB7XG4gICAgICBpZDogJ19fbG9naXhfaW50ZXJuYWw6dHJhaXRzOm1vZHVsZV9jb250cmliJyxcbiAgICAgIGtpbmQ6ICdpbnRlcm5hbCcsXG4gICAgICBuYW1lOiAndHJhaXRzOm1vZHVsZV9jb250cmliJyxcbiAgICAgIG1vZHVsZUlkOiBpZCxcbiAgICB9KVxuICAgIHJldHVybiBsb2dpY1xuICB9XG5cbiAgY29uc3QgbWFrZUZpbmFsaXplVHJhaXRzTG9naWMgPSAoKTogTW9kdWxlTG9naWM8U2gsIG5ldmVyLCBuZXZlcj4gPT4ge1xuICAgIGNvbnN0IGxvZ2ljID0gbW9kdWxlVGFnLmxvZ2ljKCgkKSA9PiAoe1xuICAgICAgc2V0dXA6IEVmZmVjdC5nZW4oZnVuY3Rpb24qICgpIHtcbiAgICAgICAgY29uc3QgaW50ZXJuYWxzID0gZ2V0Qm91bmRJbnRlcm5hbHMoJCBhcyBhbnkpXG4gICAgICAgIGNvbnN0IGRpYWdub3N0aWNzTGV2ZWwgPSB5aWVsZCogRmliZXJSZWYuZ2V0KERlYnVnLmN1cnJlbnREaWFnbm9zdGljc0xldmVsKVxuXG4gICAgICAgIGNvbnN0IGNvbnRyaWJ1dGlvbnMgPSBpbnRlcm5hbHMudHJhaXRzLmdldE1vZHVsZVRyYWl0c0NvbnRyaWJ1dGlvbnMoKVxuICAgICAgICBsZXQgbWVyZ2VkOiBNb2R1bGVUcmFpdHMuVHJhaXRTcGVjXG4gICAgICAgIGxldCBzbmFwc2hvdDogTW9kdWxlVHJhaXRzLk1vZHVsZVRyYWl0c1NuYXBzaG90XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICA7KHsgbWVyZ2VkLCBzbmFwc2hvdCB9ID0gTW9kdWxlVHJhaXRzLmZpbmFsaXplVHJhaXRDb250cmlidXRpb25zKHtcbiAgICAgICAgICAgIG1vZHVsZUlkOiBpZCxcbiAgICAgICAgICAgIGNvbnRyaWJ1dGlvbnMsXG4gICAgICAgICAgfSkpXG4gICAgICAgIH0gY2F0Y2ggKGNhdXNlKSB7XG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgZGlhZ25vc3RpY3NMZXZlbCAhPT0gJ29mZicgJiZcbiAgICAgICAgICAgIGNhdXNlICYmXG4gICAgICAgICAgICB0eXBlb2YgY2F1c2UgPT09ICdvYmplY3QnICYmXG4gICAgICAgICAgICAoY2F1c2UgYXMgYW55KS5fdGFnID09PSAnTW9kdWxlVHJhaXRzQ29uZmxpY3RFcnJvcidcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIGNvbnN0IGNvbmZsaWN0cyA9IEFycmF5LmlzQXJyYXkoKGNhdXNlIGFzIGFueSkuY29uZmxpY3RzKVxuICAgICAgICAgICAgICA/ICgoY2F1c2UgYXMgYW55KS5jb25mbGljdHMgYXMgUmVhZG9ubHlBcnJheTx1bmtub3duPilcbiAgICAgICAgICAgICAgOiBbXVxuICAgICAgICAgICAgY29uc3QgdHJhaXRJZHMgPSBjb25mbGljdHNcbiAgICAgICAgICAgICAgLm1hcCgoYzogYW55KSA9PiAoYyAmJiB0eXBlb2YgYyA9PT0gJ29iamVjdCcgPyAoYyBhcyBhbnkpLnRyYWl0SWQgOiB1bmRlZmluZWQpKVxuICAgICAgICAgICAgICAuZmlsdGVyKCh0KTogdCBpcyBzdHJpbmcgPT4gdHlwZW9mIHQgPT09ICdzdHJpbmcnICYmIHQubGVuZ3RoID4gMClcbiAgICAgICAgICAgICAgLnNsaWNlKDAsIDIwKVxuXG4gICAgICAgICAgICBjb25zdCBkYXRhID1cbiAgICAgICAgICAgICAgZGlhZ25vc3RpY3NMZXZlbCA9PT0gJ2Z1bGwnXG4gICAgICAgICAgICAgICAgPyB7XG4gICAgICAgICAgICAgICAgICAgIGNvbmZsaWN0Q291bnQ6IGNvbmZsaWN0cy5sZW5ndGgsXG4gICAgICAgICAgICAgICAgICAgIGNvbmZsaWN0cyxcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICA6IHtcbiAgICAgICAgICAgICAgICAgICAgY29uZmxpY3RDb3VudDogY29uZmxpY3RzLmxlbmd0aCxcbiAgICAgICAgICAgICAgICAgICAgdHJhaXRJZHMsXG4gICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHlpZWxkKiBEZWJ1Zy5yZWNvcmQoe1xuICAgICAgICAgICAgICB0eXBlOiAndHJhY2U6bW9kdWxlOnRyYWl0czpjb25mbGljdCcsXG4gICAgICAgICAgICAgIG1vZHVsZUlkOiBpZCxcbiAgICAgICAgICAgICAgaW5zdGFuY2VJZDogaW50ZXJuYWxzLmluc3RhbmNlSWQsXG4gICAgICAgICAgICAgIGRhdGEsXG4gICAgICAgICAgICB9IGFzIGFueSlcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB0aHJvdyBjYXVzZVxuICAgICAgICB9XG5cbiAgICAgICAgaW50ZXJuYWxzLnRyYWl0cy5zZXRNb2R1bGVUcmFpdHNTbmFwc2hvdChzbmFwc2hvdClcbiAgICAgICAgaW50ZXJuYWxzLnRyYWl0cy5mcmVlemVNb2R1bGVUcmFpdHMoKVxuXG4gICAgICAgIGlmIChkaWFnbm9zdGljc0xldmVsICE9PSAnb2ZmJykge1xuICAgICAgICAgIGNvbnN0IGRhdGEgPVxuICAgICAgICAgICAgZGlhZ25vc3RpY3NMZXZlbCA9PT0gJ2Z1bGwnXG4gICAgICAgICAgICAgID8ge1xuICAgICAgICAgICAgICAgICAgZGlnZXN0OiBzbmFwc2hvdC5kaWdlc3QsXG4gICAgICAgICAgICAgICAgICBjb3VudDogc25hcHNob3QudHJhaXRzLmxlbmd0aCxcbiAgICAgICAgICAgICAgICAgIHRyYWl0czogc25hcHNob3QudHJhaXRzLFxuICAgICAgICAgICAgICAgICAgcHJvdmVuYW5jZUluZGV4OiBzbmFwc2hvdC5wcm92ZW5hbmNlSW5kZXgsXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICA6IHtcbiAgICAgICAgICAgICAgICAgIGRpZ2VzdDogc25hcHNob3QuZGlnZXN0LFxuICAgICAgICAgICAgICAgICAgY291bnQ6IHNuYXBzaG90LnRyYWl0cy5sZW5ndGgsXG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgeWllbGQqIERlYnVnLnJlY29yZCh7XG4gICAgICAgICAgICB0eXBlOiAndHJhY2U6bW9kdWxlOnRyYWl0cycsXG4gICAgICAgICAgICBtb2R1bGVJZDogaWQsXG4gICAgICAgICAgICBpbnN0YW5jZUlkOiBpbnRlcm5hbHMuaW5zdGFuY2VJZCxcbiAgICAgICAgICAgIGRhdGEsXG4gICAgICAgICAgfSBhcyBhbnkpXG4gICAgICAgIH1cblxuICAgICAgICBpZiAoT2JqZWN0LmtleXMobWVyZ2VkKS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IG9ubHlNb2R1bGVMZXZlbCA9IGNvbnRyaWJ1dGlvbnMubGVuZ3RoID09PSAxICYmIGNvbnRyaWJ1dGlvbnNbMF0/LnByb3ZlbmFuY2U/Lm9yaWdpblR5cGUgPT09ICdtb2R1bGUnXG5cbiAgICAgICAgLy8gQnVpbGQgYSBvbmUtc2hvdCBQcm9ncmFtIGZyb20gdGhlIGZpbmFsIG1lcmdlZCBTcGVjLCBhbmQgaW5zdGFsbCBpdCBkdXJpbmcgaW5pdGlhbGl6YXRpb24uXG4gICAgICAgIC8vIC0gSWYgdGhlcmUgaXMgb25seSBhIG1vZHVsZS1sZXZlbCBjb250cmlidXRpb24sIHJldXNlIHRoZSBwcm9ncmFtIGJ1aWx0IGluIE1vZHVsZVRhZy5tYWtlICh1c2VmdWwgZm9yIERlYnVnL1RyYWl0TGlmZWN5Y2xlKS5cbiAgICAgICAgY29uc3QgcHJvZ3JhbSA9XG4gICAgICAgICAgb25seU1vZHVsZUxldmVsICYmIGJhc2VQcm9ncmFtID8gYmFzZVByb2dyYW0gOiBTdGF0ZVRyYWl0LmJ1aWxkKHN0YXRlU2NoZW1hIGFzIGFueSwgbWVyZ2VkIGFzIGFueSlcblxuICAgICAgICAvLyBGb3IgVHJhaXRMaWZlY3ljbGUvRGVidWcvRGV2dG9vbHMgcmVhZHMgKGRlZmluaXRpb24tc2lkZSBoaWRkZW4gc2xvdCkuXG4gICAgICAgIHNldE1vZHVsZVRyYWl0c1Byb2dyYW0obW9kdWxlVGFnIGFzIGFueSwgcHJvZ3JhbSlcbiAgICAgICAgTW9kdWxlVHJhaXRzUmVnaXN0cnkucmVnaXN0ZXJNb2R1bGVQcm9ncmFtKGlkLCBwcm9ncmFtIGFzIFN0YXRlVHJhaXRQcm9ncmFtPGFueT4pXG5cbiAgICAgICAgeWllbGQqIFN0YXRlVHJhaXQuaW5zdGFsbCgkIGFzIHVua25vd24gYXMgQm91bmRBcGk8YW55LCBhbnk+LCBwcm9ncmFtKVxuICAgICAgfSksXG4gICAgICBydW46IEVmZmVjdC52b2lkLFxuICAgIH0pKSBhcyBNb2R1bGVMb2dpYzxTaCwgbmV2ZXIsIG5ldmVyPlxuXG4gICAgTG9naWNVbml0TWV0YS5hdHRhY2hMb2dpY1VuaXRNZXRhKGxvZ2ljIGFzIGFueSwge1xuICAgICAgaWQ6ICdfX2xvZ2l4X2ludGVybmFsOnRyYWl0czpmaW5hbGl6ZScsXG4gICAgICBraW5kOiAnaW50ZXJuYWwnLFxuICAgICAgbmFtZTogJ3RyYWl0czpmaW5hbGl6ZScsXG4gICAgICBtb2R1bGVJZDogaWQsXG4gICAgfSlcblxuICAgIHJldHVybiBsb2dpY1xuICB9XG5cbiAgLy8gV3JhcCBpbXBsZW1lbnQ6IGluamVjdCAoMSkgb3B0aW9uYWwgbW9kdWxlLWxldmVsIGNvbnRyaWJ1dGlvbiBsb2dpYywgYW5kICgyKSByZXF1aXJlZCBmaW5hbGl6ZStpbnN0YWxsIGxvZ2ljLlxuICBjb25zdCBvcmlnaW5hbEltcGxlbWVudCA9IG1vZHVsZVRhZy5pbXBsZW1lbnRcbiAgOyhtb2R1bGVUYWcgYXMgYW55KS5pbXBsZW1lbnQgPSAoPFIgPSBuZXZlcj4oY29uZmlnOiB7XG4gICAgaW5pdGlhbDogU3RhdGVPZjx0eXBlb2YgbW9kdWxlVGFnLnNoYXBlPlxuICAgIGxvZ2ljcz86IEFycmF5PE1vZHVsZUxvZ2ljPHR5cGVvZiBtb2R1bGVUYWcuc2hhcGUsIFIsIGFueT4+XG4gICAgaW1wb3J0cz86IFJlYWRvbmx5QXJyYXk8TGF5ZXIuTGF5ZXI8YW55LCBhbnksIGFueT4gfCBNb2R1bGVJbXBsPGFueSwgQW55TW9kdWxlU2hhcGUsIGFueT4+XG4gICAgcHJvY2Vzc2VzPzogUmVhZG9ubHlBcnJheTxFZmZlY3QuRWZmZWN0PHZvaWQsIGFueSwgYW55Pj5cbiAgfSkgPT4ge1xuICAgIGNvbnN0IHVzZXJMb2dpY3MgPSAoY29uZmlnLmxvZ2ljcyA/PyBbXSkgYXMgQXJyYXk8TW9kdWxlTG9naWM8dHlwZW9mIG1vZHVsZVRhZy5zaGFwZSwgUiwgYW55Pj5cblxuICAgIGNvbnN0IG1vZHVsZUxldmVsID0gZGVmLnRyYWl0cyA/IFttYWtlTW9kdWxlVHJhaXRzQ29udHJpYnV0aW9uTG9naWMoZGVmLnRyYWl0cykgYXMgYW55XSA6IFtdXG5cbiAgICBjb25zdCBmaW5hbGl6ZSA9IG1ha2VGaW5hbGl6ZVRyYWl0c0xvZ2ljKCkgYXMgTW9kdWxlTG9naWM8dHlwZW9mIG1vZHVsZVRhZy5zaGFwZSwgUiwgYW55PlxuXG4gICAgY29uc3QgbWVyZ2VkTG9naWNzID0gWy4uLm1vZHVsZUxldmVsLCAuLi51c2VyTG9naWNzLCBmaW5hbGl6ZV1cblxuICAgIHJldHVybiBvcmlnaW5hbEltcGxlbWVudDxSPih7XG4gICAgICAuLi5jb25maWcsXG4gICAgICBsb2dpY3M6IG1lcmdlZExvZ2ljcyxcbiAgICB9KVxuICB9KSBhcyB0eXBlb2YgbW9kdWxlVGFnLmltcGxlbWVudFxuXG4gIHJldHVybiBtb2R1bGVUYWdcbn1cbiIsICJpbXBvcnQgeyBmbnYxYTMyLCBzdGFibGVTdHJpbmdpZnkgfSBmcm9tICcuLi8uLi9kaWdlc3QuanMnXG5cbmV4cG9ydCB0eXBlIFRyYWl0SWQgPSBzdHJpbmdcblxuZXhwb3J0IHR5cGUgVHJhaXRPcmlnaW5UeXBlID0gJ21vZHVsZScgfCAnbG9naWNVbml0J1xuZXhwb3J0IHR5cGUgVHJhaXRPcmlnaW5JZEtpbmQgPSAnZXhwbGljaXQnIHwgJ2Rlcml2ZWQnXG5cbmV4cG9ydCBpbnRlcmZhY2UgVHJhaXRQcm92ZW5hbmNlIHtcbiAgcmVhZG9ubHkgb3JpZ2luVHlwZTogVHJhaXRPcmlnaW5UeXBlXG4gIHJlYWRvbmx5IG9yaWdpbklkOiBzdHJpbmdcbiAgcmVhZG9ubHkgb3JpZ2luSWRLaW5kOiBUcmFpdE9yaWdpbklkS2luZFxuICAvKipcbiAgICogSHVtYW4tcmVhZGFibGUgbGFiZWwgZm9yIERldnRvb2xzL2Vycm9yIG1lc3NhZ2VzIChlLmcuIFwibG9naWNVbml0OlByb2ZpbGUjMVwiKS5cbiAgICovXG4gIHJlYWRvbmx5IG9yaWdpbkxhYmVsOiBzdHJpbmdcbiAgLyoqXG4gICAqIE9wdGlvbmFsIGxvY2F0aW9uIHN1bW1hcnkgKGUuZy4gZmlsZSBwYXRoIC8gY2FsbHNpdGUpOyBmb3IgbmF2aWdhdGlvbiBvbmx5IGFuZCBub3QgdXNlZCBmb3Igc2VtYW50aWMgZGVjaXNpb25zLlxuICAgKi9cbiAgcmVhZG9ubHkgcGF0aD86IHN0cmluZ1xufVxuXG4vKipcbiAqIFRyYWl0U3BlY1x1RkYxQVxuICogLSBNaW5pbWFsIHJlcHJlc2VudGF0aW9uIG9mIFwidHJhaXQgZGVjbGFyYXRpb25zXCI6IGEgcmVjb3JkIGtleWVkIGJ5IHRyYWl0SWQuXG4gKiAtIFRoZSBjb25jcmV0ZSB2YWx1ZSBzaGFwZSBpcyBkZWZpbmVkIGJ5IHRoZSBzcGVjaWZpYyB0cmFpdCBzeXN0ZW0gKGUuZy4gU3RhdGVUcmFpdFNwZWMpLlxuICogLSBWYWx1ZSBzZXJpYWxpemFiaWxpdHkgaXMgbm90IGNvbnN0cmFpbmVkIGhlcmUgKHJ1bnRpbWUgaW5zdGFsbCBtYXkgZGVwZW5kIG9uIGZ1bmN0aW9ucyksIGJ1dCBzbmFwc2hvdHMvZXZpZGVuY2UgZXhwb3J0c1xuICogICBtdXN0IG9ubHkgaW5jbHVkZSBzZXJpYWxpemFibGUgc3Vic2V0cy5cbiAqL1xuZXhwb3J0IHR5cGUgVHJhaXRTcGVjID0gb2JqZWN0XG5cbmV4cG9ydCBpbnRlcmZhY2UgVHJhaXRDb250cmlidXRpb24ge1xuICByZWFkb25seSB0cmFpdHM6IFRyYWl0U3BlY1xuICByZWFkb25seSBwcm92ZW5hbmNlOiBUcmFpdFByb3ZlbmFuY2Vcbn1cblxuZXhwb3J0IGludGVyZmFjZSBNb2R1bGVUcmFpdEl0ZW0ge1xuICByZWFkb25seSB0cmFpdElkOiBUcmFpdElkXG4gIHJlYWRvbmx5IG5hbWU6IHN0cmluZ1xuICByZWFkb25seSBkZXNjcmlwdGlvbj86IHN0cmluZ1xufVxuXG5leHBvcnQgdHlwZSBUcmFpdENvbmZsaWN0S2luZCA9ICdkdXBsaWNhdGVfdHJhaXRJZCcgfCAnbWlzc2luZ19yZXF1aXJlcycgfCAnZXhjbHVkZXNfdmlvbGF0aW9uJ1xuXG5leHBvcnQgaW50ZXJmYWNlIFRyYWl0Q29uZmxpY3Qge1xuICByZWFkb25seSBraW5kOiBUcmFpdENvbmZsaWN0S2luZFxuICByZWFkb25seSB0cmFpdElkOiBUcmFpdElkXG4gIHJlYWRvbmx5IHNvdXJjZXM6IFJlYWRvbmx5QXJyYXk8VHJhaXRQcm92ZW5hbmNlPlxuICByZWFkb25seSBtaXNzaW5nPzogUmVhZG9ubHlBcnJheTxUcmFpdElkPlxuICByZWFkb25seSBwcmVzZW50PzogUmVhZG9ubHlBcnJheTxUcmFpdElkPlxufVxuXG5leHBvcnQgY2xhc3MgTW9kdWxlVHJhaXRzQ29uZmxpY3RFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgcmVhZG9ubHkgX3RhZyA9ICdNb2R1bGVUcmFpdHNDb25mbGljdEVycm9yJ1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHJlYWRvbmx5IG1vZHVsZUlkOiBzdHJpbmcsXG4gICAgcmVhZG9ubHkgY29uZmxpY3RzOiBSZWFkb25seUFycmF5PFRyYWl0Q29uZmxpY3Q+LFxuICApIHtcbiAgICBzdXBlcihcbiAgICAgIFtcbiAgICAgICAgYFtNb2R1bGVUcmFpdHNDb25mbGljdEVycm9yXSBDb25mbGljdGluZyB0cmFpdElkcyBmb3VuZCAobW9kdWxlSWQ9JHttb2R1bGVJZH0pLmAsXG4gICAgICAgIC4uLmNvbmZsaWN0cy5tYXAoKGMpID0+XG4gICAgICAgICAgYy5raW5kID09PSAnZHVwbGljYXRlX3RyYWl0SWQnXG4gICAgICAgICAgICA/IGAtIGR1cGxpY2F0ZSAke2MudHJhaXRJZH06ICR7Yy5zb3VyY2VzLm1hcCgocykgPT4gYCR7cy5vcmlnaW5UeXBlfToke3Mub3JpZ2luSWR9YCkuam9pbignLCAnKX1gXG4gICAgICAgICAgICA6IGMua2luZCA9PT0gJ21pc3NpbmdfcmVxdWlyZXMnXG4gICAgICAgICAgICAgID8gYC0gbWlzc2luZyByZXF1aXJlcyBmb3IgJHtjLnRyYWl0SWR9OiAkeyhjLm1pc3NpbmcgPz8gW10pLmpvaW4oJywgJyl9OyBzb3VyY2VzPSR7Yy5zb3VyY2VzXG4gICAgICAgICAgICAgICAgICAubWFwKChzKSA9PiBgJHtzLm9yaWdpblR5cGV9OiR7cy5vcmlnaW5JZH1gKVxuICAgICAgICAgICAgICAgICAgLmpvaW4oJywgJyl9YFxuICAgICAgICAgICAgICA6IGAtIGV4Y2x1ZGVzIHZpb2xhdGlvbiBmb3IgJHtjLnRyYWl0SWR9OiBwcmVzZW50PSR7KGMucHJlc2VudCA/PyBbXSkuam9pbignLCAnKX07IHNvdXJjZXM9JHtjLnNvdXJjZXNcbiAgICAgICAgICAgICAgICAgIC5tYXAoKHMpID0+IGAke3Mub3JpZ2luVHlwZX06JHtzLm9yaWdpbklkfWApXG4gICAgICAgICAgICAgICAgICAuam9pbignLCAnKX1gLFxuICAgICAgICApLFxuICAgICAgXS5qb2luKCdcXG4nKSxcbiAgICApXG4gIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBNb2R1bGVUcmFpdHNTbmFwc2hvdCB7XG4gIHJlYWRvbmx5IG1vZHVsZUlkOiBzdHJpbmdcbiAgcmVhZG9ubHkgZGlnZXN0OiBzdHJpbmdcbiAgcmVhZG9ubHkgdHJhaXRzOiBSZWFkb25seUFycmF5PE1vZHVsZVRyYWl0SXRlbT5cbiAgcmVhZG9ubHkgcHJvdmVuYW5jZUluZGV4OiBSZWNvcmQ8VHJhaXRJZCwgVHJhaXRQcm92ZW5hbmNlPlxufVxuXG5jb25zdCB0b1Byb3ZlbmFuY2VLZXkgPSAocDogVHJhaXRQcm92ZW5hbmNlKTogc3RyaW5nID0+XG4gIGAke3Aub3JpZ2luVHlwZX06JHtwLm9yaWdpbklkfToke3Aub3JpZ2luSWRLaW5kfToke3Aub3JpZ2luTGFiZWx9OiR7cC5wYXRoID8/ICcnfWBcblxuY29uc3QgY29tcGFyZVByb3ZlbmFuY2UgPSAoYTogVHJhaXRQcm92ZW5hbmNlLCBiOiBUcmFpdFByb3ZlbmFuY2UpOiBudW1iZXIgPT4ge1xuICBjb25zdCB0eXBlID0gYS5vcmlnaW5UeXBlLmxvY2FsZUNvbXBhcmUoYi5vcmlnaW5UeXBlKVxuICBpZiAodHlwZSAhPT0gMCkgcmV0dXJuIHR5cGVcbiAgY29uc3QgaWQgPSBhLm9yaWdpbklkLmxvY2FsZUNvbXBhcmUoYi5vcmlnaW5JZClcbiAgaWYgKGlkICE9PSAwKSByZXR1cm4gaWRcbiAgY29uc3Qga2luZCA9IGEub3JpZ2luSWRLaW5kLmxvY2FsZUNvbXBhcmUoYi5vcmlnaW5JZEtpbmQpXG4gIGlmIChraW5kICE9PSAwKSByZXR1cm4ga2luZFxuICBjb25zdCBsYWJlbCA9IGEub3JpZ2luTGFiZWwubG9jYWxlQ29tcGFyZShiLm9yaWdpbkxhYmVsKVxuICBpZiAobGFiZWwgIT09IDApIHJldHVybiBsYWJlbFxuICByZXR1cm4gU3RyaW5nKGEucGF0aCA/PyAnJykubG9jYWxlQ29tcGFyZShTdHJpbmcoYi5wYXRoID8/ICcnKSlcbn1cblxuY29uc3Qgb3JpZ2luVHlwZU9yZGVyID0gKHQ6IFRyYWl0T3JpZ2luVHlwZSk6IG51bWJlciA9PiAodCA9PT0gJ21vZHVsZScgPyAwIDogMSlcblxuY29uc3QgY29tcGFyZVRyYWl0SWRCeVByb3ZlbmFuY2UgPSAoXG4gIGE6IHsgcmVhZG9ubHkgdHJhaXRJZDogVHJhaXRJZDsgcmVhZG9ubHkgcHJvdmVuYW5jZTogVHJhaXRQcm92ZW5hbmNlIH0sXG4gIGI6IHsgcmVhZG9ubHkgdHJhaXRJZDogVHJhaXRJZDsgcmVhZG9ubHkgcHJvdmVuYW5jZTogVHJhaXRQcm92ZW5hbmNlIH0sXG4pOiBudW1iZXIgPT4ge1xuICBjb25zdCB0YSA9IG9yaWdpblR5cGVPcmRlcihhLnByb3ZlbmFuY2Uub3JpZ2luVHlwZSkgLSBvcmlnaW5UeXBlT3JkZXIoYi5wcm92ZW5hbmNlLm9yaWdpblR5cGUpXG4gIGlmICh0YSAhPT0gMCkgcmV0dXJuIHRhXG4gIGNvbnN0IG9hID0gYS5wcm92ZW5hbmNlLm9yaWdpbklkLmxvY2FsZUNvbXBhcmUoYi5wcm92ZW5hbmNlLm9yaWdpbklkKVxuICBpZiAob2EgIT09IDApIHJldHVybiBvYVxuICByZXR1cm4gYS50cmFpdElkLmxvY2FsZUNvbXBhcmUoYi50cmFpdElkKVxufVxuXG5jb25zdCBleHRyYWN0U3RyaW5nQXJyYXkgPSAodmFsdWU6IHVua25vd24pOiBSZWFkb25seUFycmF5PHN0cmluZz4gPT4ge1xuICBpZiAoIUFycmF5LmlzQXJyYXkodmFsdWUpKSByZXR1cm4gW11cbiAgY29uc3Qgb3V0OiBBcnJheTxzdHJpbmc+ID0gW11cbiAgZm9yIChjb25zdCB2IG9mIHZhbHVlKSB7XG4gICAgaWYgKHR5cGVvZiB2ICE9PSAnc3RyaW5nJykgY29udGludWVcbiAgICBjb25zdCBzID0gdi50cmltKClcbiAgICBpZiAoIXMpIGNvbnRpbnVlXG4gICAgb3V0LnB1c2gocylcbiAgfVxuICByZXR1cm4gb3V0XG59XG5cbmNvbnN0IGdldFRyYWl0UmVxdWlyZXMgPSAodmFsdWU6IHVua25vd24pOiBSZWFkb25seUFycmF5PFRyYWl0SWQ+ID0+IHtcbiAgaWYgKCF2YWx1ZSB8fCB0eXBlb2YgdmFsdWUgIT09ICdvYmplY3QnKSByZXR1cm4gW11cbiAgY29uc3QgZGlyZWN0ID0gZXh0cmFjdFN0cmluZ0FycmF5KCh2YWx1ZSBhcyBhbnkpLnJlcXVpcmVzKVxuICByZXR1cm4gZGlyZWN0XG59XG5cbmNvbnN0IGdldFRyYWl0RXhjbHVkZXMgPSAodmFsdWU6IHVua25vd24pOiBSZWFkb25seUFycmF5PFRyYWl0SWQ+ID0+IHtcbiAgaWYgKCF2YWx1ZSB8fCB0eXBlb2YgdmFsdWUgIT09ICdvYmplY3QnKSByZXR1cm4gW11cbiAgY29uc3QgZGlyZWN0ID0gZXh0cmFjdFN0cmluZ0FycmF5KCh2YWx1ZSBhcyBhbnkpLmV4Y2x1ZGVzKVxuICByZXR1cm4gZGlyZWN0XG59XG5cbmNvbnN0IGdldFRyYWl0TmFtZSA9ICh0cmFpdElkOiBUcmFpdElkLCB2YWx1ZTogdW5rbm93bik6IHN0cmluZyA9PiB7XG4gIGlmICh2YWx1ZSAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnKSB7XG4gICAgY29uc3QgbiA9ICh2YWx1ZSBhcyBhbnkpLm5hbWVcbiAgICBpZiAodHlwZW9mIG4gPT09ICdzdHJpbmcnICYmIG4udHJpbSgpLmxlbmd0aCA+IDApIHJldHVybiBuLnRyaW0oKVxuICB9XG4gIHJldHVybiB0cmFpdElkXG59XG5cbmNvbnN0IGdldFRyYWl0RGVzY3JpcHRpb24gPSAodmFsdWU6IHVua25vd24pOiBzdHJpbmcgfCB1bmRlZmluZWQgPT4ge1xuICBpZiAodmFsdWUgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0Jykge1xuICAgIGNvbnN0IGQgPSAodmFsdWUgYXMgYW55KS5kZXNjcmlwdGlvblxuICAgIGlmICh0eXBlb2YgZCA9PT0gJ3N0cmluZycgJiYgZC50cmltKCkubGVuZ3RoID4gMCkgcmV0dXJuIGQudHJpbSgpXG4gIH1cbiAgcmV0dXJuIHVuZGVmaW5lZFxufVxuXG5leHBvcnQgY29uc3QgZmluYWxpemVUcmFpdENvbnRyaWJ1dGlvbnMgPSAoYXJnczoge1xuICByZWFkb25seSBtb2R1bGVJZDogc3RyaW5nXG4gIHJlYWRvbmx5IGNvbnRyaWJ1dGlvbnM6IFJlYWRvbmx5QXJyYXk8VHJhaXRDb250cmlidXRpb24+XG59KTogeyByZWFkb25seSBtZXJnZWQ6IFRyYWl0U3BlYzsgcmVhZG9ubHkgc25hcHNob3Q6IE1vZHVsZVRyYWl0c1NuYXBzaG90IH0gPT4ge1xuICBjb25zdCB0cmFpdEJ5SWQgPSBuZXcgTWFwPFRyYWl0SWQsIHsgcmVhZG9ubHkgdmFsdWU6IHVua25vd247IHJlYWRvbmx5IHByb3ZlbmFuY2U6IFRyYWl0UHJvdmVuYW5jZSB9PigpXG5cbiAgY29uc3QgZHVwbGljYXRlU291cmNlcyA9IG5ldyBNYXA8VHJhaXRJZCwgQXJyYXk8VHJhaXRQcm92ZW5hbmNlPj4oKVxuXG4gIGNvbnN0IGNvbnRyaWJ1dGlvbnMgPSBbLi4uYXJncy5jb250cmlidXRpb25zXS5zb3J0KChhLCBiKSA9PiBjb21wYXJlUHJvdmVuYW5jZShhLnByb3ZlbmFuY2UsIGIucHJvdmVuYW5jZSkpXG5cbiAgZm9yIChjb25zdCBjIG9mIGNvbnRyaWJ1dGlvbnMpIHtcbiAgICBjb25zdCB0cmFpdHMgPSBjLnRyYWl0c1xuICAgIGlmICghdHJhaXRzIHx8IHR5cGVvZiB0cmFpdHMgIT09ICdvYmplY3QnKSBjb250aW51ZVxuICAgIGZvciAoY29uc3QgdHJhaXRJZCBvZiBPYmplY3Qua2V5cyh0cmFpdHMpLnNvcnQoKGEsIGIpID0+IGEubG9jYWxlQ29tcGFyZShiKSkpIHtcbiAgICAgIGNvbnN0IHZhbHVlID0gKHRyYWl0cyBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPilbdHJhaXRJZF1cbiAgICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSBjb250aW51ZVxuXG4gICAgICBjb25zdCBwcmV2ID0gdHJhaXRCeUlkLmdldCh0cmFpdElkKVxuICAgICAgaWYgKCFwcmV2KSB7XG4gICAgICAgIHRyYWl0QnlJZC5zZXQodHJhaXRJZCwgeyB2YWx1ZSwgcHJvdmVuYW5jZTogYy5wcm92ZW5hbmNlIH0pXG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHNvdXJjZXMgPSBkdXBsaWNhdGVTb3VyY2VzLmdldCh0cmFpdElkKSA/PyBbcHJldi5wcm92ZW5hbmNlXVxuICAgICAgc291cmNlcy5wdXNoKGMucHJvdmVuYW5jZSlcbiAgICAgIGR1cGxpY2F0ZVNvdXJjZXMuc2V0KHRyYWl0SWQsIHNvdXJjZXMpXG4gICAgfVxuICB9XG5cbiAgY29uc3QgY29uZmxpY3RzOiBBcnJheTxUcmFpdENvbmZsaWN0PiA9IFtdXG4gIGNvbnN0IHJlZ2lzdGVyQ29uZmxpY3QgPSAoY29uZmxpY3Q6IFRyYWl0Q29uZmxpY3QpID0+IHtcbiAgICBjb25zdCB1bmlxdWUgPSBuZXcgTWFwPHN0cmluZywgVHJhaXRQcm92ZW5hbmNlPigpXG4gICAgZm9yIChjb25zdCBzIG9mIGNvbmZsaWN0LnNvdXJjZXMpIHtcbiAgICAgIHVuaXF1ZS5zZXQodG9Qcm92ZW5hbmNlS2V5KHMpLCBzKVxuICAgIH1cbiAgICBjb25mbGljdHMucHVzaCh7XG4gICAgICAuLi5jb25mbGljdCxcbiAgICAgIHNvdXJjZXM6IEFycmF5LmZyb20odW5pcXVlLnZhbHVlcygpKS5zb3J0KGNvbXBhcmVQcm92ZW5hbmNlKSxcbiAgICB9KVxuICB9XG5cbiAgLy8gMSkgZHVwbGljYXRlIHRyYWl0SWQgY29uZmxpY3RzXG4gIGZvciAoY29uc3QgdHJhaXRJZCBvZiBBcnJheS5mcm9tKGR1cGxpY2F0ZVNvdXJjZXMua2V5cygpKS5zb3J0KChhLCBiKSA9PiBhLmxvY2FsZUNvbXBhcmUoYikpKSB7XG4gICAgcmVnaXN0ZXJDb25mbGljdCh7XG4gICAgICBraW5kOiAnZHVwbGljYXRlX3RyYWl0SWQnLFxuICAgICAgdHJhaXRJZCxcbiAgICAgIHNvdXJjZXM6IGR1cGxpY2F0ZVNvdXJjZXMuZ2V0KHRyYWl0SWQpID8/IFtdLFxuICAgIH0pXG4gIH1cblxuICBjb25zdCBtZXJnZWQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge31cbiAgY29uc3QgcHJvdmVuYW5jZUluZGV4OiBSZWNvcmQ8c3RyaW5nLCBUcmFpdFByb3ZlbmFuY2U+ID0ge31cbiAgY29uc3QgdHJhaXRzOiBBcnJheTxNb2R1bGVUcmFpdEl0ZW0+ID0gW11cblxuICBjb25zdCBlbnRyaWVzOiBBcnJheTx7IHJlYWRvbmx5IHRyYWl0SWQ6IFRyYWl0SWQ7IHJlYWRvbmx5IHZhbHVlOiB1bmtub3duOyByZWFkb25seSBwcm92ZW5hbmNlOiBUcmFpdFByb3ZlbmFuY2UgfT4gPVxuICAgIFtdXG4gIGZvciAoY29uc3QgdHJhaXRJZCBvZiB0cmFpdEJ5SWQua2V5cygpKSB7XG4gICAgY29uc3QgZW50cnkgPSB0cmFpdEJ5SWQuZ2V0KHRyYWl0SWQpXG4gICAgaWYgKCFlbnRyeSkgY29udGludWVcbiAgICBlbnRyaWVzLnB1c2goeyB0cmFpdElkLCB2YWx1ZTogZW50cnkudmFsdWUsIHByb3ZlbmFuY2U6IGVudHJ5LnByb3ZlbmFuY2UgfSlcbiAgfVxuXG4gIGNvbnN0IGlkcyA9IGVudHJpZXNcbiAgICAuc2xpY2UoKVxuICAgIC5zb3J0KGNvbXBhcmVUcmFpdElkQnlQcm92ZW5hbmNlKVxuICAgIC5tYXAoKGUpID0+IGUudHJhaXRJZClcblxuICBmb3IgKGNvbnN0IHRyYWl0SWQgb2YgaWRzKSB7XG4gICAgY29uc3QgZW50cnkgPSB0cmFpdEJ5SWQuZ2V0KHRyYWl0SWQpXG4gICAgaWYgKCFlbnRyeSkgY29udGludWVcbiAgICBtZXJnZWRbdHJhaXRJZF0gPSBlbnRyeS52YWx1ZVxuICAgIHByb3ZlbmFuY2VJbmRleFt0cmFpdElkXSA9IGVudHJ5LnByb3ZlbmFuY2VcbiAgICB0cmFpdHMucHVzaCh7XG4gICAgICB0cmFpdElkLFxuICAgICAgbmFtZTogZ2V0VHJhaXROYW1lKHRyYWl0SWQsIGVudHJ5LnZhbHVlKSxcbiAgICAgIGRlc2NyaXB0aW9uOiBnZXRUcmFpdERlc2NyaXB0aW9uKGVudHJ5LnZhbHVlKSxcbiAgICB9KVxuICB9XG5cbiAgLy8gMikgY29uc2lzdGVuY3kgY2hlY2tzIChGUi0wMDcpOiByZXF1aXJlcyAvIGV4Y2x1ZGVzXG4gIGNvbnN0IHByZXNlbnQgPSBuZXcgU2V0KGlkcylcblxuICBmb3IgKGNvbnN0IHRyYWl0SWQgb2YgaWRzKSB7XG4gICAgY29uc3QgZW50cnkgPSB0cmFpdEJ5SWQuZ2V0KHRyYWl0SWQpXG4gICAgaWYgKCFlbnRyeSkgY29udGludWVcblxuICAgIGNvbnN0IHJlcXVpcmVzID0gZ2V0VHJhaXRSZXF1aXJlcyhlbnRyeS52YWx1ZSlcbiAgICBpZiAocmVxdWlyZXMubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgbWlzc2luZyA9IHJlcXVpcmVzLmZpbHRlcigocikgPT4gIXByZXNlbnQuaGFzKHIpKVxuICAgICAgaWYgKG1pc3NpbmcubGVuZ3RoID4gMCkge1xuICAgICAgICByZWdpc3RlckNvbmZsaWN0KHtcbiAgICAgICAgICBraW5kOiAnbWlzc2luZ19yZXF1aXJlcycsXG4gICAgICAgICAgdHJhaXRJZCxcbiAgICAgICAgICBtaXNzaW5nOiBBcnJheS5mcm9tKG5ldyBTZXQobWlzc2luZykpLnNvcnQoKGEsIGIpID0+IGEubG9jYWxlQ29tcGFyZShiKSksXG4gICAgICAgICAgc291cmNlczogW2VudHJ5LnByb3ZlbmFuY2VdLFxuICAgICAgICB9KVxuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGV4Y2x1ZGVzID0gZ2V0VHJhaXRFeGNsdWRlcyhlbnRyeS52YWx1ZSlcbiAgICBpZiAoZXhjbHVkZXMubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgcHJlc2VudEV4Y2x1ZGVkID0gZXhjbHVkZXMuZmlsdGVyKChlKSA9PiBwcmVzZW50LmhhcyhlKSlcbiAgICAgIGlmIChwcmVzZW50RXhjbHVkZWQubGVuZ3RoID4gMCkge1xuICAgICAgICBjb25zdCBvdGhlclNvdXJjZXM6IEFycmF5PFRyYWl0UHJvdmVuYW5jZT4gPSBbXVxuICAgICAgICBmb3IgKGNvbnN0IG90aGVySWQgb2YgcHJlc2VudEV4Y2x1ZGVkKSB7XG4gICAgICAgICAgY29uc3Qgb3RoZXIgPSB0cmFpdEJ5SWQuZ2V0KG90aGVySWQpXG4gICAgICAgICAgaWYgKG90aGVyKSBvdGhlclNvdXJjZXMucHVzaChvdGhlci5wcm92ZW5hbmNlKVxuICAgICAgICB9XG4gICAgICAgIHJlZ2lzdGVyQ29uZmxpY3Qoe1xuICAgICAgICAgIGtpbmQ6ICdleGNsdWRlc192aW9sYXRpb24nLFxuICAgICAgICAgIHRyYWl0SWQsXG4gICAgICAgICAgcHJlc2VudDogQXJyYXkuZnJvbShuZXcgU2V0KHByZXNlbnRFeGNsdWRlZCkpLnNvcnQoKGEsIGIpID0+IGEubG9jYWxlQ29tcGFyZShiKSksXG4gICAgICAgICAgc291cmNlczogW2VudHJ5LnByb3ZlbmFuY2UsIC4uLm90aGVyU291cmNlc10sXG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgaWYgKGNvbmZsaWN0cy5sZW5ndGggPiAwKSB7XG4gICAgY29uc3Qga2luZE9yZGVyOiBSZWNvcmQ8VHJhaXRDb25mbGljdEtpbmQsIG51bWJlcj4gPSB7XG4gICAgICBkdXBsaWNhdGVfdHJhaXRJZDogMCxcbiAgICAgIG1pc3NpbmdfcmVxdWlyZXM6IDEsXG4gICAgICBleGNsdWRlc192aW9sYXRpb246IDIsXG4gICAgfVxuICAgIGNvbmZsaWN0cy5zb3J0KChhLCBiKSA9PiB7XG4gICAgICBjb25zdCBrID0ga2luZE9yZGVyW2Eua2luZF0gLSBraW5kT3JkZXJbYi5raW5kXVxuICAgICAgaWYgKGsgIT09IDApIHJldHVybiBrXG4gICAgICByZXR1cm4gYS50cmFpdElkLmxvY2FsZUNvbXBhcmUoYi50cmFpdElkKVxuICAgIH0pXG4gICAgdGhyb3cgbmV3IE1vZHVsZVRyYWl0c0NvbmZsaWN0RXJyb3IoYXJncy5tb2R1bGVJZCwgY29uZmxpY3RzKVxuICB9XG5cbiAgY29uc3QgZGlnZXN0QmFzZSA9IHtcbiAgICBtb2R1bGVJZDogYXJncy5tb2R1bGVJZCxcbiAgICB0cmFpdHMsXG4gICAgcHJvdmVuYW5jZUluZGV4LFxuICB9IGFzIGNvbnN0XG5cbiAgY29uc3QgZGlnZXN0ID0gYG10cmFpdHM6MDIzOiR7Zm52MWEzMihzdGFibGVTdHJpbmdpZnkoZGlnZXN0QmFzZSkpfWBcblxuICByZXR1cm4ge1xuICAgIG1lcmdlZCxcbiAgICBzbmFwc2hvdDoge1xuICAgICAgbW9kdWxlSWQ6IGFyZ3MubW9kdWxlSWQsXG4gICAgICBkaWdlc3QsXG4gICAgICB0cmFpdHMsXG4gICAgICBwcm92ZW5hbmNlSW5kZXgsXG4gICAgfSxcbiAgfVxufVxuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsU0FBUyxRQUFRLGdCQUErQjs7O0FDbUR6QyxJQUFNLDRCQUFOLGNBQXdDLE1BQU07QUFBQSxFQUduRCxZQUNXLFVBQ0EsV0FDVDtBQUNBO0FBQUEsTUFDRTtBQUFBLFFBQ0Usb0VBQW9FLFFBQVE7QUFBQSxRQUM1RSxHQUFHLFVBQVU7QUFBQSxVQUFJLENBQUMsTUFDaEIsRUFBRSxTQUFTLHNCQUNQLGVBQWUsRUFBRSxPQUFPLEtBQUssRUFBRSxRQUFRLElBQUksQ0FBQyxNQUFNLEdBQUcsRUFBRSxVQUFVLElBQUksRUFBRSxRQUFRLEVBQUUsRUFBRSxLQUFLLElBQUksQ0FBQyxLQUM3RixFQUFFLFNBQVMscUJBQ1QsMEJBQTBCLEVBQUUsT0FBTyxNQUFNLEVBQUUsV0FBVyxDQUFDLEdBQUcsS0FBSyxJQUFJLENB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QUFVO0FBQUEsY0FDVixZQUFZLFVBQVU7QUFBQSxjQUN0QjtBQUFBLFlBQ0YsQ0FBUTtBQUFBLFVBQ1Y7QUFFQSxnQkFBTTtBQUFBLFFBQ1I7QUFFQSxrQkFBVSxPQUFPLHdCQUF3QixRQUFRO0FBQ2pELGtCQUFVLE9BQU8sbUJBQW1CO0FBRXBDLFlBQUkscUJBQXFCLE9BQU87QUFDOUIsZ0JBQU0sT0FDSixxQkFBcUIsU0FDakI7QUFBQSxZQUNFLFFBQVEsU0FBUztBQUFBLFlBQ2pCLE9BQU8sU0FBUyxPQUFPO0FBQUEsWUFDdkIsUUFBUSxTQUFTO0FBQUEsWUFDakIsaUJBQWlCLFNBQVM7QUFBQSxVQUM1QixJQUNBO0FBQUEsWUFDRSxRQUFRLFNBQVM7QUFBQSxZQUNqQixPQUFPLFNBQVMsT0FBTztBQUFBLFVBQ3pCO0FBRU4saUJBQWEsT0FBTztBQUFBLFlBQ2xCLE1BQU07QUFBQSxZQUNOLFVBQVU7QUFBQSxZQUNWLFlBQVksVUFBVTtBQUFBLFlBQ3RCO0FBQUEsVUFDRixDQUFRO0FBQUEsUUFDVjtBQUVBLFlBQUksT0FBTyxLQUFLLE1BQU0sRUFBRSxXQUFXLEdBQUc7QUFDcEM7QUFBQSxRQUNGO0FBRUEsY0FBTSxrQkFBa0IsY0FBYyxXQUFXLEtBQUssY0FBYyxDQUFDLEdBQUcsWUFBWSxlQUFlO0FBSW5HLGNBQU0sVUFDSixtQkFBbUIsY0FBYyxjQUF5QixNQUFNLGFBQW9CLE1BQWE7QUFHbkcsK0JBQXVCLFdBQWtCLE9BQU87QUFDaEQsUUFBcUIsc0JBQXNCLElBQUksT0FBaUM7QUFFaEYsZUFBa0IsUUFBUSxHQUFvQyxPQUFPO0FBQUEsTUFDdkUsQ0FBQztBQUFBLE1BQ0QsS0FBSyxPQUFPO0FBQUEsSUFDZCxFQUFFO0FBRUYsSUFBYyxvQkFBb0IsT0FBYztBQUFBLE1BQzlDLElBQUk7QUFBQSxNQUNKLE1BQU07QUFBQSxNQUNOLE1BQU07QUFBQSxNQUNOLFVBQVU7QUFBQSxJQUNaLENBQUM7QUFFRCxXQUFPO0FBQUEsRUFDVDtBQUdBLFFBQU0sb0JBQW9CLFVBQVU7QUFDbkMsRUFBQyxVQUFrQixhQUFhLENBQVksV0FLdkM7QUFDSixVQUFNLGFBQWMsT0FBTyxVQUFVLENBQUM7QUFFdEMsVUFBTSxjQUFjLElBQUksU0FBUyxDQUFDLGtDQUFrQyxJQUFJLE1BQU0sQ0FBUSxJQUFJLENBQUM7QUFFM0YsVUFBTSxXQUFXLHdCQUF3QjtBQUV6QyxVQUFNLGVBQWUsQ0FBQyxHQUFHLGFBQWEsR0FBRyxZQUFZLFFBQVE7QUFFN0QsV0FBTyxrQkFBcUI7QUFBQSxNQUMxQixHQUFHO0FBQUEsTUFDSCxRQUFRO0FBQUEsSUFDVixDQUFDO0FBQUEsRUFDSDtBQUVBLFNBQU87QUFDVDsiLAogICJuYW1lcyI6IFsidHJhaXRzIl0KfQo=
|