@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,995 +0,0 @@
|
|
|
1
|
-
// @logixjs/core subpath bundles for @logixjs/sandbox
|
|
2
|
-
|
|
3
|
-
import {
|
|
4
|
-
makeApp,
|
|
5
|
-
makeProgramRunnerKernel,
|
|
6
|
-
provide
|
|
7
|
-
} from "./chunk-EJDFUZ4B.js";
|
|
8
|
-
import {
|
|
9
|
-
evidenceCollectorLayer,
|
|
10
|
-
makeEvidenceCollector
|
|
11
|
-
} from "./chunk-4LRLOTMA.js";
|
|
12
|
-
import {
|
|
13
|
-
RuntimeServicesInstanceOverridesTag,
|
|
14
|
-
getKernelImplementationRef,
|
|
15
|
-
getRuntimeServicesEvidence
|
|
16
|
-
} from "./chunk-HNEDTEGQ.js";
|
|
17
|
-
import {
|
|
18
|
-
isActionToken
|
|
19
|
-
} from "./chunk-DOBF6YTQ.js";
|
|
20
|
-
import {
|
|
21
|
-
exportStaticIr
|
|
22
|
-
} from "./chunk-ON2LY6HJ.js";
|
|
23
|
-
import {
|
|
24
|
-
appendConvergeStaticIrCollectors
|
|
25
|
-
} from "./chunk-2LZ43SWS.js";
|
|
26
|
-
import {
|
|
27
|
-
getModuleTraitsProgram
|
|
28
|
-
} from "./chunk-UCFEP3BH.js";
|
|
29
|
-
import {
|
|
30
|
-
appendSinks,
|
|
31
|
-
diagnosticsLevel,
|
|
32
|
-
toSerializableErrorSummary
|
|
33
|
-
} from "./chunk-UKYAF3NL.js";
|
|
34
|
-
import {
|
|
35
|
-
fnv1a32,
|
|
36
|
-
stableStringify
|
|
37
|
-
} from "./chunk-S46P7MC6.js";
|
|
38
|
-
import {
|
|
39
|
-
makeRunSession,
|
|
40
|
-
runSessionLayer
|
|
41
|
-
} from "./chunk-3LX3KIQQ.js";
|
|
42
|
-
import {
|
|
43
|
-
isJsonValue
|
|
44
|
-
} from "./chunk-TOQ6SJ6O.js";
|
|
45
|
-
|
|
46
|
-
// ../logix-core/src/internal/reflection/staticIr.ts
|
|
47
|
-
var isRecord = (value) => typeof value === "object" && value !== null && !Array.isArray(value);
|
|
48
|
-
var isModuleImpl = (value) => isRecord(value) && value._tag === "ModuleImpl" && isRecord(value.module);
|
|
49
|
-
var resolveModuleId = (input) => {
|
|
50
|
-
if (isModuleImpl(input)) {
|
|
51
|
-
const id = input.module.id;
|
|
52
|
-
return typeof id === "string" && id.length > 0 ? id : "unknown";
|
|
53
|
-
}
|
|
54
|
-
if (isRecord(input)) {
|
|
55
|
-
const id = input.id;
|
|
56
|
-
if (typeof id === "string" && id.length > 0) return id;
|
|
57
|
-
const tag = input.tag;
|
|
58
|
-
if (tag && (typeof tag === "object" || typeof tag === "function")) {
|
|
59
|
-
const tagId = tag.id;
|
|
60
|
-
if (typeof tagId === "string" && tagId.length > 0) return tagId;
|
|
61
|
-
}
|
|
62
|
-
}
|
|
63
|
-
return "unknown";
|
|
64
|
-
};
|
|
65
|
-
var resolveModuleTag = (input) => {
|
|
66
|
-
if (isModuleImpl(input)) return input.module;
|
|
67
|
-
if (isRecord(input) && input.tag) return input.tag;
|
|
68
|
-
return void 0;
|
|
69
|
-
};
|
|
70
|
-
var exportStaticIr2 = (module) => {
|
|
71
|
-
const tag = resolveModuleTag(module);
|
|
72
|
-
if (!tag) return void 0;
|
|
73
|
-
const program = getModuleTraitsProgram(tag);
|
|
74
|
-
if (!program) return void 0;
|
|
75
|
-
return exportStaticIr({
|
|
76
|
-
program,
|
|
77
|
-
moduleId: resolveModuleId(module)
|
|
78
|
-
});
|
|
79
|
-
};
|
|
80
|
-
|
|
81
|
-
// ../logix-core/src/internal/reflection/manifest.ts
|
|
82
|
-
import { Schema } from "../effect.js";
|
|
83
|
-
var isRecord2 = (value) => typeof value === "object" && value !== null && !Array.isArray(value);
|
|
84
|
-
var isModuleImpl2 = (value) => isRecord2(value) && value._tag === "ModuleImpl" && isRecord2(value.module);
|
|
85
|
-
var resolveModuleId2 = (input) => {
|
|
86
|
-
if (isModuleImpl2(input)) {
|
|
87
|
-
const id = input.module.id;
|
|
88
|
-
return typeof id === "string" && id.length > 0 ? id : "unknown";
|
|
89
|
-
}
|
|
90
|
-
if (isRecord2(input)) {
|
|
91
|
-
const id = input.id;
|
|
92
|
-
if (typeof id === "string" && id.length > 0) return id;
|
|
93
|
-
const tag = input.tag;
|
|
94
|
-
if (tag && (typeof tag === "object" || typeof tag === "function")) {
|
|
95
|
-
const tagId = tag.id;
|
|
96
|
-
if (typeof tagId === "string" && tagId.length > 0) return tagId;
|
|
97
|
-
}
|
|
98
|
-
}
|
|
99
|
-
return "unknown";
|
|
100
|
-
};
|
|
101
|
-
var resolveActionKeys = (input) => {
|
|
102
|
-
const tag = isModuleImpl2(input) ? input.module : input?.tag;
|
|
103
|
-
const actionMap = tag?.shape?.actionMap;
|
|
104
|
-
if (!isRecord2(actionMap)) return [];
|
|
105
|
-
return Object.keys(actionMap).sort();
|
|
106
|
-
};
|
|
107
|
-
var resolveDevSource = (input) => {
|
|
108
|
-
if (!isRecord2(input)) return void 0;
|
|
109
|
-
const file = input.file;
|
|
110
|
-
const line = input.line;
|
|
111
|
-
const column = input.column;
|
|
112
|
-
if (typeof file !== "string" || file.length === 0) return void 0;
|
|
113
|
-
if (typeof line !== "number" || !Number.isInteger(line) || line < 1) return void 0;
|
|
114
|
-
if (typeof column !== "number" || !Number.isInteger(column) || column < 1) return void 0;
|
|
115
|
-
return { file, line, column };
|
|
116
|
-
};
|
|
117
|
-
var resolveTokenSource = (token) => {
|
|
118
|
-
if (!token || typeof token !== "object" && typeof token !== "function") return void 0;
|
|
119
|
-
return resolveDevSource(token.source);
|
|
120
|
-
};
|
|
121
|
-
var resolveActions = (input) => {
|
|
122
|
-
const tag = isModuleImpl2(input) ? input.module : input?.tag;
|
|
123
|
-
const actionMap = tag?.shape?.actionMap;
|
|
124
|
-
if (!isRecord2(actionMap)) return [];
|
|
125
|
-
const moduleSource = resolveSource(input);
|
|
126
|
-
const reducers = isRecord2(tag?.reducers) ? tag.reducers : void 0;
|
|
127
|
-
const actionTags = Object.keys(actionMap).sort();
|
|
128
|
-
const out = [];
|
|
129
|
-
for (const actionTag of actionTags) {
|
|
130
|
-
const token = actionMap[actionTag];
|
|
131
|
-
const source = resolveTokenSource(token) ?? moduleSource;
|
|
132
|
-
const payloadKind = isActionToken(token) && Schema.isSchema(token.schema) ? token.schema === Schema.Void ? "void" : "nonVoid" : "unknown";
|
|
133
|
-
const primaryReducer = reducers && typeof reducers[actionTag] === "function" ? { kind: "declared" } : void 0;
|
|
134
|
-
out.push({
|
|
135
|
-
actionTag,
|
|
136
|
-
payload: { kind: payloadKind },
|
|
137
|
-
...primaryReducer ? { primaryReducer } : {},
|
|
138
|
-
...source ? { source } : {}
|
|
139
|
-
});
|
|
140
|
-
}
|
|
141
|
-
return out;
|
|
142
|
-
};
|
|
143
|
-
var MODULE_DECLARED_EFFECTS = /* @__PURE__ */ Symbol.for("logix.module.effects.declared");
|
|
144
|
-
var resolveEffects = (input) => {
|
|
145
|
-
const tag = isModuleImpl2(input) ? input.module : input?.tag;
|
|
146
|
-
const actionMap = tag?.shape?.actionMap;
|
|
147
|
-
if (!isRecord2(actionMap)) return void 0;
|
|
148
|
-
const effectsRaw = tag?.[MODULE_DECLARED_EFFECTS];
|
|
149
|
-
if (!isRecord2(effectsRaw)) return void 0;
|
|
150
|
-
const source = resolveSource(input);
|
|
151
|
-
const logicUnitId = "__logix_internal:effects:declared";
|
|
152
|
-
const handlerIds = /* @__PURE__ */ new WeakMap();
|
|
153
|
-
let nextHandlerSeq = 0;
|
|
154
|
-
const out = [];
|
|
155
|
-
for (const actionTag of Object.keys(effectsRaw).sort()) {
|
|
156
|
-
if (!(actionTag in actionMap)) continue;
|
|
157
|
-
const handlers = effectsRaw[actionTag];
|
|
158
|
-
if (!Array.isArray(handlers)) continue;
|
|
159
|
-
for (const handler of handlers) {
|
|
160
|
-
if (typeof handler !== "function") continue;
|
|
161
|
-
let handlerId = handlerIds.get(handler);
|
|
162
|
-
if (!handlerId) {
|
|
163
|
-
nextHandlerSeq += 1;
|
|
164
|
-
handlerId = `h${nextHandlerSeq}`;
|
|
165
|
-
handlerIds.set(handler, handlerId);
|
|
166
|
-
}
|
|
167
|
-
const sourceKey = `${logicUnitId}::${handlerId}`;
|
|
168
|
-
out.push({
|
|
169
|
-
actionTag,
|
|
170
|
-
sourceKey,
|
|
171
|
-
kind: "declared",
|
|
172
|
-
...source ? { source } : {}
|
|
173
|
-
});
|
|
174
|
-
}
|
|
175
|
-
}
|
|
176
|
-
const seen = /* @__PURE__ */ new Set();
|
|
177
|
-
const deduped = [];
|
|
178
|
-
for (const item of out) {
|
|
179
|
-
const key = `${item.actionTag}\0${item.sourceKey}`;
|
|
180
|
-
if (seen.has(key)) continue;
|
|
181
|
-
seen.add(key);
|
|
182
|
-
deduped.push(item);
|
|
183
|
-
}
|
|
184
|
-
deduped.sort(
|
|
185
|
-
(a, b) => a.actionTag < b.actionTag ? -1 : a.actionTag > b.actionTag ? 1 : a.sourceKey.localeCompare(b.sourceKey)
|
|
186
|
-
);
|
|
187
|
-
return deduped.length > 0 ? deduped : void 0;
|
|
188
|
-
};
|
|
189
|
-
var resolveSchemaKeys = (input) => {
|
|
190
|
-
if (!isRecord2(input)) return void 0;
|
|
191
|
-
const schemas = input.schemas;
|
|
192
|
-
if (!isRecord2(schemas)) return void 0;
|
|
193
|
-
return Object.keys(schemas).sort();
|
|
194
|
-
};
|
|
195
|
-
var resolveSource = (input) => {
|
|
196
|
-
if (!isRecord2(input)) return void 0;
|
|
197
|
-
const dev = input.dev;
|
|
198
|
-
return resolveDevSource(dev?.source);
|
|
199
|
-
};
|
|
200
|
-
var resolveMeta = (input) => {
|
|
201
|
-
if (!isRecord2(input)) return void 0;
|
|
202
|
-
const meta = input.meta;
|
|
203
|
-
if (!isRecord2(meta)) return void 0;
|
|
204
|
-
const out = {};
|
|
205
|
-
for (const key of Object.keys(meta).sort()) {
|
|
206
|
-
const value = meta[key];
|
|
207
|
-
if (isJsonValue(value)) {
|
|
208
|
-
out[key] = value;
|
|
209
|
-
}
|
|
210
|
-
}
|
|
211
|
-
return Object.keys(out).length > 0 ? out : void 0;
|
|
212
|
-
};
|
|
213
|
-
var MODULE_INTERNAL = /* @__PURE__ */ Symbol.for("logix.module.internal");
|
|
214
|
-
var resolveLogicUnits = (input) => {
|
|
215
|
-
if (!isRecord2(input)) return void 0;
|
|
216
|
-
const internal = input[MODULE_INTERNAL];
|
|
217
|
-
const mounted = internal?.mounted;
|
|
218
|
-
if (!Array.isArray(mounted)) return void 0;
|
|
219
|
-
const out = [];
|
|
220
|
-
for (const unit of mounted) {
|
|
221
|
-
if (!isRecord2(unit)) continue;
|
|
222
|
-
const kind = unit.kind;
|
|
223
|
-
const id = unit.id;
|
|
224
|
-
if (typeof kind !== "string" || kind.length === 0) continue;
|
|
225
|
-
if (typeof id !== "string" || id.length === 0) continue;
|
|
226
|
-
const derived = unit.derived === true ? true : void 0;
|
|
227
|
-
const name = typeof unit.name === "string" ? unit.name : void 0;
|
|
228
|
-
out.push({ kind, id, derived, name });
|
|
229
|
-
}
|
|
230
|
-
out.sort((a, b) => a.id < b.id ? -1 : a.id > b.id ? 1 : a.kind.localeCompare(b.kind));
|
|
231
|
-
return out.length > 0 ? out : void 0;
|
|
232
|
-
};
|
|
233
|
-
var digestOf = (base) => `manifest:067:${fnv1a32(stableStringify(base))}`;
|
|
234
|
-
var utf8ByteLength = (value) => {
|
|
235
|
-
const json = JSON.stringify(value);
|
|
236
|
-
if (typeof TextEncoder !== "undefined") {
|
|
237
|
-
return new TextEncoder().encode(json).length;
|
|
238
|
-
}
|
|
239
|
-
return json.length;
|
|
240
|
-
};
|
|
241
|
-
var applyMaxBytes = (manifest, maxBytes) => {
|
|
242
|
-
const originalBytes = utf8ByteLength(manifest);
|
|
243
|
-
if (originalBytes <= maxBytes) return manifest;
|
|
244
|
-
const dropped = [];
|
|
245
|
-
const truncatedArrays = [];
|
|
246
|
-
const baseMarker = () => ({
|
|
247
|
-
truncated: true,
|
|
248
|
-
maxBytes,
|
|
249
|
-
originalBytes,
|
|
250
|
-
dropped,
|
|
251
|
-
truncatedArrays
|
|
252
|
-
});
|
|
253
|
-
const withMarker = (next2) => {
|
|
254
|
-
const meta = {
|
|
255
|
-
__logix: baseMarker()
|
|
256
|
-
};
|
|
257
|
-
return { ...next2, meta };
|
|
258
|
-
};
|
|
259
|
-
let next = withMarker(manifest);
|
|
260
|
-
const markTruncatedArray = (name) => {
|
|
261
|
-
if (!truncatedArrays.includes(name)) {
|
|
262
|
-
truncatedArrays.push(name);
|
|
263
|
-
}
|
|
264
|
-
};
|
|
265
|
-
const dropField = (field) => {
|
|
266
|
-
if (next[field] !== void 0) {
|
|
267
|
-
dropped.push(String(field));
|
|
268
|
-
next = withMarker({ ...next, [field]: void 0 });
|
|
269
|
-
}
|
|
270
|
-
};
|
|
271
|
-
dropField("meta");
|
|
272
|
-
if (utf8ByteLength(next) <= maxBytes) return next;
|
|
273
|
-
dropField("source");
|
|
274
|
-
if (utf8ByteLength(next) <= maxBytes) return next;
|
|
275
|
-
dropField("staticIr");
|
|
276
|
-
if (utf8ByteLength(next) <= maxBytes) return next;
|
|
277
|
-
dropField("logicUnits");
|
|
278
|
-
if (utf8ByteLength(next) <= maxBytes) return next;
|
|
279
|
-
dropField("schemaKeys");
|
|
280
|
-
if (utf8ByteLength(next) <= maxBytes) return next;
|
|
281
|
-
dropField("effects");
|
|
282
|
-
if (utf8ByteLength(next) <= maxBytes) return next;
|
|
283
|
-
const truncateActionsToFit = () => {
|
|
284
|
-
const total = next.actions.length;
|
|
285
|
-
if (total <= 1) return;
|
|
286
|
-
let lo = 1;
|
|
287
|
-
let hi = total;
|
|
288
|
-
let best = 1;
|
|
289
|
-
while (lo <= hi) {
|
|
290
|
-
const mid = Math.floor((lo + hi) / 2);
|
|
291
|
-
const candidate = withMarker({
|
|
292
|
-
...next,
|
|
293
|
-
actions: next.actions.slice(0, mid),
|
|
294
|
-
actionKeys: next.actionKeys.slice(0, mid)
|
|
295
|
-
});
|
|
296
|
-
if (utf8ByteLength(candidate) <= maxBytes) {
|
|
297
|
-
best = mid;
|
|
298
|
-
lo = mid + 1;
|
|
299
|
-
} else {
|
|
300
|
-
hi = mid - 1;
|
|
301
|
-
}
|
|
302
|
-
}
|
|
303
|
-
if (best < total) {
|
|
304
|
-
markTruncatedArray("actions");
|
|
305
|
-
markTruncatedArray("actionKeys");
|
|
306
|
-
next = withMarker({
|
|
307
|
-
...next,
|
|
308
|
-
actions: next.actions.slice(0, best),
|
|
309
|
-
actionKeys: next.actionKeys.slice(0, best)
|
|
310
|
-
});
|
|
311
|
-
}
|
|
312
|
-
};
|
|
313
|
-
while (utf8ByteLength(next) > maxBytes) {
|
|
314
|
-
const beforeLen = next.actions.length;
|
|
315
|
-
truncateActionsToFit();
|
|
316
|
-
if (next.actions.length === beforeLen) {
|
|
317
|
-
break;
|
|
318
|
-
}
|
|
319
|
-
}
|
|
320
|
-
return next;
|
|
321
|
-
};
|
|
322
|
-
var extractManifest = (module, options) => {
|
|
323
|
-
const manifestVersion = "067";
|
|
324
|
-
const moduleId = resolveModuleId2(module);
|
|
325
|
-
const actionKeys = resolveActionKeys(module);
|
|
326
|
-
const actions = resolveActions(module);
|
|
327
|
-
const effects = resolveEffects(module);
|
|
328
|
-
const schemaKeys = resolveSchemaKeys(module);
|
|
329
|
-
const logicUnits = resolveLogicUnits(module);
|
|
330
|
-
const source = resolveSource(module);
|
|
331
|
-
const meta = resolveMeta(module);
|
|
332
|
-
const staticIr = options?.includeStaticIr ? exportStaticIr2(module) : void 0;
|
|
333
|
-
const digestBase = {
|
|
334
|
-
manifestVersion,
|
|
335
|
-
moduleId,
|
|
336
|
-
actionKeys,
|
|
337
|
-
actions,
|
|
338
|
-
effects,
|
|
339
|
-
schemaKeys,
|
|
340
|
-
logicUnits,
|
|
341
|
-
staticIrDigest: staticIr?.digest
|
|
342
|
-
};
|
|
343
|
-
const digest = digestOf(digestBase);
|
|
344
|
-
const manifest = {
|
|
345
|
-
manifestVersion,
|
|
346
|
-
moduleId,
|
|
347
|
-
actionKeys,
|
|
348
|
-
actions,
|
|
349
|
-
effects,
|
|
350
|
-
schemaKeys,
|
|
351
|
-
logicUnits,
|
|
352
|
-
source,
|
|
353
|
-
meta,
|
|
354
|
-
staticIr,
|
|
355
|
-
digest
|
|
356
|
-
};
|
|
357
|
-
const maxBytes = options?.budgets?.maxBytes;
|
|
358
|
-
if (typeof maxBytes === "number" && Number.isFinite(maxBytes) && maxBytes > 0) {
|
|
359
|
-
return applyMaxBytes(manifest, maxBytes);
|
|
360
|
-
}
|
|
361
|
-
return manifest;
|
|
362
|
-
};
|
|
363
|
-
|
|
364
|
-
// ../logix-core/src/internal/observability/artifacts/registry.ts
|
|
365
|
-
var ARTIFACT_EXPORTERS = /* @__PURE__ */ Symbol.for("logix.module.trialRunArtifactExporters");
|
|
366
|
-
var registerTrialRunArtifactExporter = (tag, exporter) => {
|
|
367
|
-
if (!tag || typeof tag !== "object" && typeof tag !== "function") {
|
|
368
|
-
throw new Error("[Logix] registerTrialRunArtifactExporter: invalid module tag");
|
|
369
|
-
}
|
|
370
|
-
const current = tag[ARTIFACT_EXPORTERS] ?? [];
|
|
371
|
-
const next = Array.isArray(current) ? [...current, exporter] : [exporter];
|
|
372
|
-
tag[ARTIFACT_EXPORTERS] = next;
|
|
373
|
-
};
|
|
374
|
-
var getTrialRunArtifactExporters = (tag) => {
|
|
375
|
-
if (!tag || typeof tag !== "object" && typeof tag !== "function") {
|
|
376
|
-
return [];
|
|
377
|
-
}
|
|
378
|
-
const current = tag[ARTIFACT_EXPORTERS];
|
|
379
|
-
if (!Array.isArray(current)) return [];
|
|
380
|
-
return current.filter((x) => x && typeof x === "object");
|
|
381
|
-
};
|
|
382
|
-
|
|
383
|
-
// ../logix-core/src/internal/observability/trialRunModule.ts
|
|
384
|
-
import { Cause as Cause2, Effect as Effect4, Exit, Fiber, Layer as Layer4, Option } from "../effect.js";
|
|
385
|
-
|
|
386
|
-
// ../logix-core/src/internal/platform/BuildEnv.ts
|
|
387
|
-
import { ConfigProvider, Effect as Effect2, Layer as Layer2 } from "../effect.js";
|
|
388
|
-
|
|
389
|
-
// ../logix-core/src/internal/platform/ConstructionGuard.ts
|
|
390
|
-
import { Cause, Effect } from "../effect.js";
|
|
391
|
-
|
|
392
|
-
// ../logix-core/src/internal/platform/RuntimeHost.ts
|
|
393
|
-
import { Context, Layer } from "../effect.js";
|
|
394
|
-
var detectKind = () => {
|
|
395
|
-
const isBrowser = typeof window !== "undefined" && typeof document !== "undefined";
|
|
396
|
-
if (isBrowser) return "browser";
|
|
397
|
-
const isNode = typeof process !== "undefined" && typeof process?.versions?.node === "string";
|
|
398
|
-
if (isNode) return "node";
|
|
399
|
-
return "unknown";
|
|
400
|
-
};
|
|
401
|
-
var make = (kind) => ({
|
|
402
|
-
kind,
|
|
403
|
-
isNode: kind === "node",
|
|
404
|
-
isBrowser: kind === "browser"
|
|
405
|
-
});
|
|
406
|
-
var RuntimeHost = class extends Context.Tag("@logixjs/RuntimeHost")() {
|
|
407
|
-
};
|
|
408
|
-
var layer = (service) => Layer.succeed(RuntimeHost, service);
|
|
409
|
-
var defaultLayer = layer(make(detectKind()));
|
|
410
|
-
|
|
411
|
-
// ../logix-core/src/internal/platform/BuildEnv.ts
|
|
412
|
-
var toConfigProviderFromRecord = (record) => {
|
|
413
|
-
const map = /* @__PURE__ */ new Map();
|
|
414
|
-
for (const [k, v] of Object.entries(record ?? {})) {
|
|
415
|
-
if (!k) continue;
|
|
416
|
-
if (v === void 0) continue;
|
|
417
|
-
map.set(k, String(v));
|
|
418
|
-
}
|
|
419
|
-
return ConfigProvider.fromMap(map);
|
|
420
|
-
};
|
|
421
|
-
var layer2 = (options = {}) => {
|
|
422
|
-
const runtimeHost = options.runtimeHost ? layer(options.runtimeHost) : options.runtimeHostKind ? layer(make(options.runtimeHostKind)) : defaultLayer;
|
|
423
|
-
const configProvider = options.configProvider ? options.configProvider : toConfigProviderFromRecord(options.config);
|
|
424
|
-
const config = Layer2.setConfigProvider(configProvider);
|
|
425
|
-
return Layer2.mergeAll(runtimeHost, config);
|
|
426
|
-
};
|
|
427
|
-
|
|
428
|
-
// ../logix-core/src/internal/runtime/Runtime.ts
|
|
429
|
-
import { Layer as Layer3 } from "../effect.js";
|
|
430
|
-
var make2 = (rootImpl, options) => {
|
|
431
|
-
const appConfig = {
|
|
432
|
-
layer: options?.layer ?? Layer3.empty,
|
|
433
|
-
modules: [provide(rootImpl.module, rootImpl.layer)],
|
|
434
|
-
processes: rootImpl.processes ?? [],
|
|
435
|
-
onError: options?.onError
|
|
436
|
-
};
|
|
437
|
-
const app = makeApp(appConfig);
|
|
438
|
-
return app.makeRuntime();
|
|
439
|
-
};
|
|
440
|
-
|
|
441
|
-
// ../logix-core/src/internal/observability/artifacts/model.ts
|
|
442
|
-
var isArtifactKey = (input) => typeof input === "string" && /^@[^\s/]+\/[^\s@]+@v\d+$/.test(input);
|
|
443
|
-
|
|
444
|
-
// ../logix-core/src/internal/observability/artifacts/digest.ts
|
|
445
|
-
var utf8ByteLengthString = (text) => {
|
|
446
|
-
if (typeof TextEncoder !== "undefined") {
|
|
447
|
-
return new TextEncoder().encode(text).length;
|
|
448
|
-
}
|
|
449
|
-
return text.length;
|
|
450
|
-
};
|
|
451
|
-
var digestJsonValue = (value) => {
|
|
452
|
-
const stableJson = stableStringify(value);
|
|
453
|
-
const bytes = utf8ByteLengthString(stableJson);
|
|
454
|
-
return {
|
|
455
|
-
stableJson,
|
|
456
|
-
bytes,
|
|
457
|
-
digest: `artifact:031:${fnv1a32(stableJson)}`
|
|
458
|
-
};
|
|
459
|
-
};
|
|
460
|
-
|
|
461
|
-
// ../logix-core/src/internal/observability/artifacts/collect.ts
|
|
462
|
-
var toErrorSummaryWithCode = (cause, code, hint) => {
|
|
463
|
-
const base = toSerializableErrorSummary(cause).errorSummary;
|
|
464
|
-
return {
|
|
465
|
-
name: base.name,
|
|
466
|
-
message: base.message,
|
|
467
|
-
code,
|
|
468
|
-
hint: hint ?? base.hint
|
|
469
|
-
};
|
|
470
|
-
};
|
|
471
|
-
var defaultArtifactBudgetBytes = 50 * 1024;
|
|
472
|
-
var budgetOf = (budgets) => typeof budgets?.maxBytes === "number" && Number.isFinite(budgets.maxBytes) && budgets.maxBytes > 0 ? budgets.maxBytes : defaultArtifactBudgetBytes;
|
|
473
|
-
var makeConflictEnvelope = (artifactKey, exporterIds) => {
|
|
474
|
-
const ids = Array.from(new Set(exporterIds.map((s) => String(s)).filter((s) => s.length > 0))).sort(
|
|
475
|
-
(a, b) => a.localeCompare(b)
|
|
476
|
-
);
|
|
477
|
-
return {
|
|
478
|
-
artifactKey,
|
|
479
|
-
envelope: {
|
|
480
|
-
artifactKey,
|
|
481
|
-
ok: false,
|
|
482
|
-
error: {
|
|
483
|
-
name: "ArtifactKeyConflictError",
|
|
484
|
-
message: `[Logix] TrialRun artifact key conflict: ${artifactKey}`,
|
|
485
|
-
code: "ArtifactKeyConflict",
|
|
486
|
-
hint: ids.length > 0 ? `conflictingExporters=${ids.join(",")}` : void 0
|
|
487
|
-
}
|
|
488
|
-
}
|
|
489
|
-
};
|
|
490
|
-
};
|
|
491
|
-
var truncateJsonValue = (value, maxBytes) => {
|
|
492
|
-
const analyzed = digestJsonValue(value);
|
|
493
|
-
const json = analyzed.stableJson;
|
|
494
|
-
const bytes = analyzed.bytes;
|
|
495
|
-
if (bytes <= maxBytes) {
|
|
496
|
-
return { value, actualBytes: bytes, digest: analyzed.digest };
|
|
497
|
-
}
|
|
498
|
-
const previewChars = Math.min(json.length, Math.max(0, Math.min(256, maxBytes)));
|
|
499
|
-
const preview = json.slice(0, previewChars);
|
|
500
|
-
return {
|
|
501
|
-
value: {
|
|
502
|
-
_tag: "oversized",
|
|
503
|
-
bytes,
|
|
504
|
-
preview
|
|
505
|
-
},
|
|
506
|
-
actualBytes: bytes,
|
|
507
|
-
digest: analyzed.digest
|
|
508
|
-
};
|
|
509
|
-
};
|
|
510
|
-
var collectTrialRunArtifacts = (options) => {
|
|
511
|
-
const exportersSorted = Array.from(options.exporters).sort((a, b) => {
|
|
512
|
-
const ka = String(a?.artifactKey ?? "");
|
|
513
|
-
const kb = String(b?.artifactKey ?? "");
|
|
514
|
-
if (ka < kb) return -1;
|
|
515
|
-
if (ka > kb) return 1;
|
|
516
|
-
const ia = String(a?.exporterId ?? "");
|
|
517
|
-
const ib = String(b?.exporterId ?? "");
|
|
518
|
-
return ia.localeCompare(ib);
|
|
519
|
-
});
|
|
520
|
-
const conflicts = /* @__PURE__ */ new Map();
|
|
521
|
-
for (const ex of exportersSorted) {
|
|
522
|
-
const key = ex?.artifactKey;
|
|
523
|
-
const id = String(ex?.exporterId ?? "");
|
|
524
|
-
if (!isArtifactKey(key)) {
|
|
525
|
-
continue;
|
|
526
|
-
}
|
|
527
|
-
const current = conflicts.get(key);
|
|
528
|
-
if (current) current.push(id);
|
|
529
|
-
else conflicts.set(key, [id]);
|
|
530
|
-
}
|
|
531
|
-
const conflictKeys = /* @__PURE__ */ new Set();
|
|
532
|
-
for (const [k, ids] of conflicts) {
|
|
533
|
-
const unique = Array.from(new Set(ids));
|
|
534
|
-
if (unique.length > 1) {
|
|
535
|
-
conflictKeys.add(k);
|
|
536
|
-
}
|
|
537
|
-
}
|
|
538
|
-
const maxBytes = budgetOf(options.budgets);
|
|
539
|
-
const collected = [];
|
|
540
|
-
for (const exporter of exportersSorted) {
|
|
541
|
-
const artifactKey = exporter?.artifactKey;
|
|
542
|
-
if (!isArtifactKey(artifactKey)) {
|
|
543
|
-
continue;
|
|
544
|
-
}
|
|
545
|
-
if (conflictKeys.has(artifactKey)) {
|
|
546
|
-
continue;
|
|
547
|
-
}
|
|
548
|
-
try {
|
|
549
|
-
const value = exporter.export(options.ctx);
|
|
550
|
-
if (value === void 0) continue;
|
|
551
|
-
if (!isJsonValue(value)) {
|
|
552
|
-
collected.push({
|
|
553
|
-
artifactKey,
|
|
554
|
-
envelope: {
|
|
555
|
-
artifactKey,
|
|
556
|
-
ok: false,
|
|
557
|
-
error: toErrorSummaryWithCode(
|
|
558
|
-
new Error(`[Logix] Artifact exporter returned non-JsonValue: ${exporter.exporterId}`),
|
|
559
|
-
"ArtifactNonSerializable",
|
|
560
|
-
`artifactKey=${artifactKey} exporterId=${exporter.exporterId}`
|
|
561
|
-
)
|
|
562
|
-
}
|
|
563
|
-
});
|
|
564
|
-
continue;
|
|
565
|
-
}
|
|
566
|
-
const truncated = truncateJsonValue(value, maxBytes);
|
|
567
|
-
const envelope = {
|
|
568
|
-
artifactKey,
|
|
569
|
-
ok: true,
|
|
570
|
-
value: truncated.value,
|
|
571
|
-
digest: truncated.digest,
|
|
572
|
-
...truncated.actualBytes > maxBytes ? {
|
|
573
|
-
truncated: true,
|
|
574
|
-
budgetBytes: maxBytes,
|
|
575
|
-
actualBytes: truncated.actualBytes
|
|
576
|
-
} : {
|
|
577
|
-
budgetBytes: maxBytes,
|
|
578
|
-
actualBytes: truncated.actualBytes
|
|
579
|
-
}
|
|
580
|
-
};
|
|
581
|
-
collected.push({ artifactKey, envelope });
|
|
582
|
-
} catch (e) {
|
|
583
|
-
collected.push({
|
|
584
|
-
artifactKey,
|
|
585
|
-
envelope: {
|
|
586
|
-
artifactKey,
|
|
587
|
-
ok: false,
|
|
588
|
-
error: toErrorSummaryWithCode(
|
|
589
|
-
e,
|
|
590
|
-
"ArtifactExportFailed",
|
|
591
|
-
`artifactKey=${artifactKey} exporterId=${exporter.exporterId}`
|
|
592
|
-
)
|
|
593
|
-
}
|
|
594
|
-
});
|
|
595
|
-
}
|
|
596
|
-
}
|
|
597
|
-
for (const conflictKey of Array.from(conflictKeys).sort((a, b) => a.localeCompare(b))) {
|
|
598
|
-
collected.push(makeConflictEnvelope(conflictKey, conflicts.get(conflictKey) ?? []));
|
|
599
|
-
}
|
|
600
|
-
if (collected.length === 0) return void 0;
|
|
601
|
-
collected.sort((a, b) => a.artifactKey.localeCompare(b.artifactKey));
|
|
602
|
-
return Object.fromEntries(collected.map((c) => [c.artifactKey, c.envelope]));
|
|
603
|
-
};
|
|
604
|
-
|
|
605
|
-
// ../logix-core/src/internal/observability/trialRunModule.ts
|
|
606
|
-
var defaultHost = () => {
|
|
607
|
-
if (typeof window !== "undefined" && typeof document !== "undefined") return "browser";
|
|
608
|
-
return "node";
|
|
609
|
-
};
|
|
610
|
-
var isRecord3 = (value) => typeof value === "object" && value !== null && !Array.isArray(value);
|
|
611
|
-
var resolveRootImpl = (root) => root?._tag === "ModuleImpl" ? root : root?.impl;
|
|
612
|
-
var utf8ByteLength2 = (value) => {
|
|
613
|
-
const json = JSON.stringify(value);
|
|
614
|
-
if (typeof TextEncoder !== "undefined") {
|
|
615
|
-
return new TextEncoder().encode(json).length;
|
|
616
|
-
}
|
|
617
|
-
return json.length;
|
|
618
|
-
};
|
|
619
|
-
var parseMissingConfigKeys = (message) => {
|
|
620
|
-
const out = [];
|
|
621
|
-
const patterns = [
|
|
622
|
-
/\bMissing (?:data|value) for (?:key|path) "?([A-Z0-9_./:-]+)"?/g,
|
|
623
|
-
/\bMissing (?:data|value) at ([A-Z0-9_./:-]+)\b/g,
|
|
624
|
-
/\bMissing configuration:? "?([A-Z0-9_./:-]+)"?/g,
|
|
625
|
-
/\bConfig\b.*\bmissing\b.*"?([A-Z0-9_./:-]+)"?/gi
|
|
626
|
-
];
|
|
627
|
-
for (const re of patterns) {
|
|
628
|
-
let match;
|
|
629
|
-
while (match = re.exec(message)) {
|
|
630
|
-
const key = match[1];
|
|
631
|
-
if (typeof key === "string" && key.length > 0) out.push(key);
|
|
632
|
-
}
|
|
633
|
-
}
|
|
634
|
-
return Array.from(new Set(out)).sort((a, b) => a.localeCompare(b));
|
|
635
|
-
};
|
|
636
|
-
var parseMissingServiceIds = (message) => {
|
|
637
|
-
const out = [];
|
|
638
|
-
const re = /Service not found: ([^\s(]+)/g;
|
|
639
|
-
let match;
|
|
640
|
-
while (match = re.exec(message)) {
|
|
641
|
-
const id = match[1]?.replace(/[,:.;]+$/, "");
|
|
642
|
-
if (typeof id === "string" && id.length > 0) out.push(id);
|
|
643
|
-
}
|
|
644
|
-
return Array.from(new Set(out)).sort((a, b) => a.localeCompare(b));
|
|
645
|
-
};
|
|
646
|
-
var parseMissingDependencyFromCause = (cause) => {
|
|
647
|
-
const missingServices = [];
|
|
648
|
-
const missingConfigKeys = [];
|
|
649
|
-
const candidates = [...Array.from(Cause2.failures(cause)), ...Array.from(Cause2.defects(cause))];
|
|
650
|
-
for (const candidate of candidates) {
|
|
651
|
-
if (isRecord3(candidate) && candidate._tag === "ConstructionGuardError") {
|
|
652
|
-
const missingService = candidate.missingService;
|
|
653
|
-
if (typeof missingService === "string" && missingService.length > 0) {
|
|
654
|
-
missingServices.push(missingService);
|
|
655
|
-
}
|
|
656
|
-
}
|
|
657
|
-
if (isRecord3(candidate) && candidate._tag === "ConfigError" && candidate._op === "MissingData" && Array.isArray(candidate.path) && candidate.path.every((k) => typeof k === "string" && k.length > 0)) {
|
|
658
|
-
const key = candidate.path.join(".");
|
|
659
|
-
if (key.length > 0) missingConfigKeys.push(key);
|
|
660
|
-
}
|
|
661
|
-
}
|
|
662
|
-
const messages = [];
|
|
663
|
-
for (const candidate of candidates) {
|
|
664
|
-
if (candidate instanceof Error) {
|
|
665
|
-
messages.push(candidate.message);
|
|
666
|
-
continue;
|
|
667
|
-
}
|
|
668
|
-
if (typeof candidate === "string") {
|
|
669
|
-
messages.push(candidate);
|
|
670
|
-
continue;
|
|
671
|
-
}
|
|
672
|
-
if (isRecord3(candidate) && typeof candidate.message === "string") {
|
|
673
|
-
messages.push(String(candidate.message));
|
|
674
|
-
}
|
|
675
|
-
}
|
|
676
|
-
try {
|
|
677
|
-
messages.push(Cause2.pretty(cause, { renderErrorCause: true }));
|
|
678
|
-
} catch {
|
|
679
|
-
}
|
|
680
|
-
const merged = messages.filter((s) => s.length > 0).join("\n");
|
|
681
|
-
if (merged) {
|
|
682
|
-
missingServices.push(...parseMissingServiceIds(merged));
|
|
683
|
-
missingConfigKeys.push(...parseMissingConfigKeys(merged));
|
|
684
|
-
}
|
|
685
|
-
return {
|
|
686
|
-
missingServices: Array.from(new Set(missingServices)).sort((a, b) => a.localeCompare(b)),
|
|
687
|
-
missingConfigKeys: Array.from(new Set(missingConfigKeys)).sort((a, b) => a.localeCompare(b))
|
|
688
|
-
};
|
|
689
|
-
};
|
|
690
|
-
var buildEnvironmentIr = (params) => {
|
|
691
|
-
const providedConfigKeys = Object.keys(params.buildEnvConfig ?? {}).filter((k) => k.length > 0 && params.buildEnvConfig[k] !== void 0).sort((a, b) => a.localeCompare(b));
|
|
692
|
-
const missingServices = Array.from(new Set(params.missingServices ?? [])).sort((a, b) => a.localeCompare(b));
|
|
693
|
-
const missingConfigKeys = Array.from(new Set(params.missingConfigKeys ?? [])).sort((a, b) => a.localeCompare(b));
|
|
694
|
-
const runtimeServiceIds = params.runtimeServicesEvidence?.bindings?.map((b) => b.serviceId).filter((s) => typeof s === "string") ?? [];
|
|
695
|
-
const tagIds = Array.from(/* @__PURE__ */ new Set([...runtimeServiceIds, ...missingServices])).sort((a, b) => a.localeCompare(b));
|
|
696
|
-
const configKeys = Array.from(/* @__PURE__ */ new Set([...providedConfigKeys, ...missingConfigKeys])).sort(
|
|
697
|
-
(a, b) => a.localeCompare(b)
|
|
698
|
-
);
|
|
699
|
-
return {
|
|
700
|
-
tagIds,
|
|
701
|
-
configKeys,
|
|
702
|
-
missingServices,
|
|
703
|
-
missingConfigKeys,
|
|
704
|
-
kernelImplementationRef: params.kernelImplementationRef,
|
|
705
|
-
runtimeServicesEvidence: params.runtimeServicesEvidence
|
|
706
|
-
};
|
|
707
|
-
};
|
|
708
|
-
var toErrorSummaryWithCode2 = (cause, code, hint) => {
|
|
709
|
-
const base = toSerializableErrorSummary(cause).errorSummary;
|
|
710
|
-
return {
|
|
711
|
-
name: base.name,
|
|
712
|
-
message: base.message,
|
|
713
|
-
code,
|
|
714
|
-
hint: hint ?? base.hint
|
|
715
|
-
};
|
|
716
|
-
};
|
|
717
|
-
var makeTrialRunTimeoutError = () => Object.assign(new Error("[Logix] trialRunModule timed out"), {
|
|
718
|
-
name: "TrialRunTimeoutError"
|
|
719
|
-
});
|
|
720
|
-
var awaitFiberExitWithTimeout = (fiber, timeoutMs) => Effect4.gen(function* () {
|
|
721
|
-
const hasTimeout = typeof timeoutMs === "number" && Number.isFinite(timeoutMs) && timeoutMs > 0;
|
|
722
|
-
const start = hasTimeout ? Date.now() : 0;
|
|
723
|
-
while (true) {
|
|
724
|
-
const exitOpt = yield* Fiber.poll(fiber);
|
|
725
|
-
if (Option.isSome(exitOpt)) {
|
|
726
|
-
return exitOpt.value;
|
|
727
|
-
}
|
|
728
|
-
if (hasTimeout) {
|
|
729
|
-
const elapsedMs = Date.now() - start;
|
|
730
|
-
if (elapsedMs >= timeoutMs) {
|
|
731
|
-
yield* Fiber.interruptFork(fiber);
|
|
732
|
-
return Exit.fail(makeTrialRunTimeoutError());
|
|
733
|
-
}
|
|
734
|
-
}
|
|
735
|
-
yield* Effect4.promise(() => new Promise((r) => setTimeout(r, 1)));
|
|
736
|
-
}
|
|
737
|
-
});
|
|
738
|
-
var trialRunModule = (root, options) => Effect4.gen(function* () {
|
|
739
|
-
const rootImpl = resolveRootImpl(root);
|
|
740
|
-
const session = makeRunSession({
|
|
741
|
-
runId: options?.runId,
|
|
742
|
-
source: options?.source ?? { host: defaultHost(), label: "trial-run-module" },
|
|
743
|
-
startedAt: options?.startedAt
|
|
744
|
-
});
|
|
745
|
-
const collector = makeEvidenceCollector(session);
|
|
746
|
-
const convergeCollector = {
|
|
747
|
-
register: (ir) => {
|
|
748
|
-
collector.registerConvergeStaticIr(ir);
|
|
749
|
-
}
|
|
750
|
-
};
|
|
751
|
-
const sinksLayer = appendSinks([collector.debugSink]);
|
|
752
|
-
const resolvedDiagnosticsLevel = options?.diagnosticsLevel ?? "light";
|
|
753
|
-
const diagnosticsLayer = diagnosticsLevel(resolvedDiagnosticsLevel);
|
|
754
|
-
const convergeLayer = appendConvergeStaticIrCollectors([convergeCollector]);
|
|
755
|
-
const collectorLayer = evidenceCollectorLayer(collector);
|
|
756
|
-
const sessionLayer = runSessionLayer(session);
|
|
757
|
-
const buildEnvConfig = options?.buildEnv?.config;
|
|
758
|
-
const buildEnvLayer = layer2({
|
|
759
|
-
runtimeHostKind: options?.buildEnv?.hostKind,
|
|
760
|
-
config: buildEnvConfig,
|
|
761
|
-
configProvider: options?.buildEnv?.configProvider
|
|
762
|
-
});
|
|
763
|
-
const trialLayer = Layer4.mergeAll(
|
|
764
|
-
buildEnvLayer,
|
|
765
|
-
options?.layer ?? Layer4.empty,
|
|
766
|
-
sessionLayer,
|
|
767
|
-
collectorLayer,
|
|
768
|
-
diagnosticsLayer,
|
|
769
|
-
sinksLayer,
|
|
770
|
-
convergeLayer
|
|
771
|
-
);
|
|
772
|
-
const kernel = yield* makeProgramRunnerKernel(
|
|
773
|
-
(impl) => make2(impl, {
|
|
774
|
-
layer: trialLayer
|
|
775
|
-
// trial-run does not enable devtools by default; diagnostics is controlled by diagnosticsLevel.
|
|
776
|
-
}),
|
|
777
|
-
rootImpl
|
|
778
|
-
);
|
|
779
|
-
const identity = kernel.identity;
|
|
780
|
-
const bootFiber = kernel.runtime.runFork(rootImpl.module);
|
|
781
|
-
const bootExit = yield* awaitFiberExitWithTimeout(bootFiber, options?.trialRunTimeoutMs);
|
|
782
|
-
let kernelImplementationRef;
|
|
783
|
-
let runtimeServicesEvidence;
|
|
784
|
-
let instanceId;
|
|
785
|
-
if (Exit.isSuccess(bootExit)) {
|
|
786
|
-
const moduleRuntime = bootExit.value;
|
|
787
|
-
instanceId = typeof moduleRuntime?.instanceId === "string" && moduleRuntime.instanceId.length > 0 ? moduleRuntime.instanceId : void 0;
|
|
788
|
-
kernel.setInstanceId(instanceId);
|
|
789
|
-
try {
|
|
790
|
-
kernelImplementationRef = getKernelImplementationRef(moduleRuntime);
|
|
791
|
-
} catch {
|
|
792
|
-
kernelImplementationRef = void 0;
|
|
793
|
-
}
|
|
794
|
-
if (resolvedDiagnosticsLevel !== "off") {
|
|
795
|
-
try {
|
|
796
|
-
runtimeServicesEvidence = getRuntimeServicesEvidence(moduleRuntime);
|
|
797
|
-
} catch {
|
|
798
|
-
runtimeServicesEvidence = void 0;
|
|
799
|
-
}
|
|
800
|
-
}
|
|
801
|
-
} else {
|
|
802
|
-
const failure = Cause2.failureOption(bootExit.cause);
|
|
803
|
-
if (Option.isSome(failure)) {
|
|
804
|
-
const err = failure.value;
|
|
805
|
-
const instanceIdFromErr = typeof err?.instanceId === "string" ? err.instanceId : void 0;
|
|
806
|
-
if (instanceIdFromErr && instanceIdFromErr.length > 0) {
|
|
807
|
-
kernel.setInstanceId(instanceIdFromErr);
|
|
808
|
-
}
|
|
809
|
-
}
|
|
810
|
-
}
|
|
811
|
-
const closeExit = yield* Effect4.exit(
|
|
812
|
-
kernel.close({
|
|
813
|
-
timeoutMs: typeof options?.closeScopeTimeout === "number" && Number.isFinite(options.closeScopeTimeout) && options.closeScopeTimeout > 0 ? options.closeScopeTimeout : 1e3
|
|
814
|
-
})
|
|
815
|
-
);
|
|
816
|
-
const evidence = collector.exportEvidencePackage({
|
|
817
|
-
maxEvents: options?.maxEvents ?? 1e3
|
|
818
|
-
});
|
|
819
|
-
const manifest = (() => {
|
|
820
|
-
try {
|
|
821
|
-
return extractManifest(root, {
|
|
822
|
-
includeStaticIr: true,
|
|
823
|
-
budgets: { maxBytes: 2e5 }
|
|
824
|
-
});
|
|
825
|
-
} catch {
|
|
826
|
-
return void 0;
|
|
827
|
-
}
|
|
828
|
-
})();
|
|
829
|
-
const staticIr = (() => {
|
|
830
|
-
try {
|
|
831
|
-
return exportStaticIr2(root);
|
|
832
|
-
} catch {
|
|
833
|
-
return void 0;
|
|
834
|
-
}
|
|
835
|
-
})();
|
|
836
|
-
let ok = Exit.isSuccess(bootExit) && Exit.isSuccess(closeExit);
|
|
837
|
-
let error;
|
|
838
|
-
let summary;
|
|
839
|
-
const depsFromBootFailure = Exit.isFailure(bootExit) ? parseMissingDependencyFromCause(bootExit.cause) : { missingServices: [], missingConfigKeys: [] };
|
|
840
|
-
const missingServices = depsFromBootFailure.missingServices;
|
|
841
|
-
const missingConfigKeys = depsFromBootFailure.missingConfigKeys;
|
|
842
|
-
const closeError = Exit.isFailure(closeExit) ? Option.getOrUndefined(Cause2.dieOption(closeExit.cause)) : void 0;
|
|
843
|
-
if (!Exit.isSuccess(bootExit)) {
|
|
844
|
-
const failure = Option.getOrUndefined(Cause2.failureOption(bootExit.cause));
|
|
845
|
-
const defect = Option.getOrUndefined(Cause2.dieOption(bootExit.cause));
|
|
846
|
-
const base = failure ?? defect ?? bootExit.cause;
|
|
847
|
-
if (missingServices.length > 0 || missingConfigKeys.length > 0) {
|
|
848
|
-
ok = false;
|
|
849
|
-
error = toErrorSummaryWithCode2(
|
|
850
|
-
base,
|
|
851
|
-
"MissingDependency",
|
|
852
|
-
missingServices.length > 0 ? "Build-time missing service: provide a Layer mock/implementation via options.layer, or move the dependency access to runtime." : "Build-time missing config: provide the missing key(s) in buildEnv.config, or add a default value to Config."
|
|
853
|
-
);
|
|
854
|
-
} else if (isRecord3(base) && (base.name === "TrialRunTimeoutError" || base._tag === "TrialRunTimeout")) {
|
|
855
|
-
ok = false;
|
|
856
|
-
error = toErrorSummaryWithCode2(
|
|
857
|
-
base,
|
|
858
|
-
"TrialRunTimeout",
|
|
859
|
-
"Trial run timed out: check for Layer/assembly phase blocking (Effect.never / unfinished acquire)."
|
|
860
|
-
);
|
|
861
|
-
} else {
|
|
862
|
-
ok = false;
|
|
863
|
-
error = toErrorSummaryWithCode2(base, "RuntimeFailure");
|
|
864
|
-
}
|
|
865
|
-
}
|
|
866
|
-
if (Exit.isFailure(closeExit)) {
|
|
867
|
-
const died = Option.getOrUndefined(Cause2.dieOption(closeExit.cause));
|
|
868
|
-
const failure = Option.getOrUndefined(Cause2.failureOption(closeExit.cause));
|
|
869
|
-
const base = died ?? failure ?? closeExit.cause;
|
|
870
|
-
const closeErrorSummary = (() => {
|
|
871
|
-
const tag = isRecord3(base) ? base._tag : void 0;
|
|
872
|
-
if (tag === "DisposeTimeout") {
|
|
873
|
-
return toErrorSummaryWithCode2(
|
|
874
|
-
base,
|
|
875
|
-
"DisposeTimeout",
|
|
876
|
-
"Dispose timed out: check for unclosed resource handles, fibers not interrupted, or event listeners not unregistered."
|
|
877
|
-
);
|
|
878
|
-
}
|
|
879
|
-
return toErrorSummaryWithCode2(base, "RuntimeFailure");
|
|
880
|
-
})();
|
|
881
|
-
ok = false;
|
|
882
|
-
if (!error) {
|
|
883
|
-
error = closeErrorSummary;
|
|
884
|
-
} else {
|
|
885
|
-
summary = { __logix: { closeError: closeErrorSummary } };
|
|
886
|
-
}
|
|
887
|
-
}
|
|
888
|
-
const environment = buildEnvironmentIr({
|
|
889
|
-
kernelImplementationRef,
|
|
890
|
-
runtimeServicesEvidence,
|
|
891
|
-
buildEnvConfig,
|
|
892
|
-
missingServices,
|
|
893
|
-
missingConfigKeys
|
|
894
|
-
});
|
|
895
|
-
const moduleId = typeof rootImpl.module?.id === "string" && rootImpl.module.id.length > 0 ? String(rootImpl.module.id) : manifest?.moduleId ?? "unknown";
|
|
896
|
-
const artifacts = collectTrialRunArtifacts({
|
|
897
|
-
exporters: getTrialRunArtifactExporters(rootImpl.module),
|
|
898
|
-
ctx: {
|
|
899
|
-
moduleId,
|
|
900
|
-
manifest,
|
|
901
|
-
staticIr,
|
|
902
|
-
environment
|
|
903
|
-
}
|
|
904
|
-
});
|
|
905
|
-
let report = {
|
|
906
|
-
runId: session.runId,
|
|
907
|
-
ok,
|
|
908
|
-
manifest,
|
|
909
|
-
staticIr,
|
|
910
|
-
artifacts,
|
|
911
|
-
environment,
|
|
912
|
-
evidence,
|
|
913
|
-
summary,
|
|
914
|
-
error
|
|
915
|
-
};
|
|
916
|
-
const maxBytes = options?.budgets?.maxBytes;
|
|
917
|
-
if (typeof maxBytes === "number" && Number.isFinite(maxBytes) && maxBytes > 0) {
|
|
918
|
-
const originalBytes = utf8ByteLength2(report);
|
|
919
|
-
if (originalBytes > maxBytes) {
|
|
920
|
-
report = {
|
|
921
|
-
runId: session.runId,
|
|
922
|
-
ok: false,
|
|
923
|
-
environment,
|
|
924
|
-
error: {
|
|
925
|
-
message: `[Logix] TrialRunReport exceeded maxBytes (${originalBytes} > ${maxBytes})`,
|
|
926
|
-
code: "Oversized",
|
|
927
|
-
hint: "Reduce maxEvents or budgets.maxBytes, or split manifest/evidence artifacts in CI."
|
|
928
|
-
},
|
|
929
|
-
summary: {
|
|
930
|
-
__logix: {
|
|
931
|
-
truncated: true,
|
|
932
|
-
maxBytes,
|
|
933
|
-
originalBytes,
|
|
934
|
-
dropped: ["manifest", "staticIr", "artifacts", "evidence"]
|
|
935
|
-
}
|
|
936
|
-
}
|
|
937
|
-
};
|
|
938
|
-
}
|
|
939
|
-
}
|
|
940
|
-
return report;
|
|
941
|
-
});
|
|
942
|
-
|
|
943
|
-
// ../logix-core/src/internal/observability/trialRun.ts
|
|
944
|
-
import { Effect as Effect5, Layer as Layer5, Scope } from "../effect.js";
|
|
945
|
-
var defaultHost2 = () => {
|
|
946
|
-
if (typeof window !== "undefined" && typeof document !== "undefined") return "browser";
|
|
947
|
-
return "node";
|
|
948
|
-
};
|
|
949
|
-
var trialRun = (program, options) => Effect5.gen(function* () {
|
|
950
|
-
const session = makeRunSession({
|
|
951
|
-
runId: options?.runId,
|
|
952
|
-
source: options?.source ?? { host: defaultHost2(), label: "trial-run" },
|
|
953
|
-
startedAt: options?.startedAt
|
|
954
|
-
});
|
|
955
|
-
const collector = makeEvidenceCollector(session);
|
|
956
|
-
const convergeCollector = {
|
|
957
|
-
register: (ir) => {
|
|
958
|
-
collector.registerConvergeStaticIr(ir);
|
|
959
|
-
}
|
|
960
|
-
};
|
|
961
|
-
const sinksLayer = appendSinks([collector.debugSink]);
|
|
962
|
-
const diagnosticsLayer = diagnosticsLevel(options?.diagnosticsLevel ?? "light");
|
|
963
|
-
const convergeLayer = appendConvergeStaticIrCollectors([convergeCollector]);
|
|
964
|
-
const collectorLayer = evidenceCollectorLayer(collector);
|
|
965
|
-
const sessionLayer = runSessionLayer(session);
|
|
966
|
-
const overridesLayer = options?.runtimeServicesInstanceOverrides != null ? Layer5.succeed(
|
|
967
|
-
RuntimeServicesInstanceOverridesTag,
|
|
968
|
-
options.runtimeServicesInstanceOverrides
|
|
969
|
-
) : Layer5.empty;
|
|
970
|
-
const trialLayer = Layer5.mergeAll(
|
|
971
|
-
options?.layer ?? Layer5.empty,
|
|
972
|
-
sessionLayer,
|
|
973
|
-
collectorLayer,
|
|
974
|
-
overridesLayer,
|
|
975
|
-
diagnosticsLayer,
|
|
976
|
-
sinksLayer,
|
|
977
|
-
convergeLayer
|
|
978
|
-
);
|
|
979
|
-
const scope = yield* Scope.make();
|
|
980
|
-
const exit = yield* Effect5.exit(program).pipe(Effect5.provideService(Scope.Scope, scope), Effect5.provide(trialLayer));
|
|
981
|
-
yield* Scope.close(scope, exit);
|
|
982
|
-
const evidence = collector.exportEvidencePackage({
|
|
983
|
-
maxEvents: options?.maxEvents
|
|
984
|
-
});
|
|
985
|
-
return { session, exit, evidence };
|
|
986
|
-
});
|
|
987
|
-
|
|
988
|
-
export {
|
|
989
|
-
exportStaticIr2 as exportStaticIr,
|
|
990
|
-
extractManifest,
|
|
991
|
-
registerTrialRunArtifactExporter,
|
|
992
|
-
trialRunModule,
|
|
993
|
-
trialRun
|
|
994
|
-
};
|
|
995
|
-
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vbG9naXgtY29yZS9zcmMvaW50ZXJuYWwvcmVmbGVjdGlvbi9zdGF0aWNJci50cyIsICIuLi8uLi8uLi8uLi9sb2dpeC1jb3JlL3NyYy9pbnRlcm5hbC9yZWZsZWN0aW9uL21hbmlmZXN0LnRzIiwgIi4uLy4uLy4uLy4uL2xvZ2l4LWNvcmUvc3JjL2ludGVybmFsL29ic2VydmFiaWxpdHkvYXJ0aWZhY3RzL3JlZ2lzdHJ5LnRzIiwgIi4uLy4uLy4uLy4uL2xvZ2l4LWNvcmUvc3JjL2ludGVybmFsL29ic2VydmFiaWxpdHkvdHJpYWxSdW5Nb2R1bGUudHMiLCAiLi4vLi4vLi4vLi4vbG9naXgtY29yZS9zcmMvaW50ZXJuYWwvcGxhdGZvcm0vQnVpbGRFbnYudHMiLCAiLi4vLi4vLi4vLi4vbG9naXgtY29yZS9zcmMvaW50ZXJuYWwvcGxhdGZvcm0vQ29uc3RydWN0aW9uR3VhcmQudHMiLCAiLi4vLi4vLi4vLi4vbG9naXgtY29yZS9zcmMvaW50ZXJuYWwvcGxhdGZvcm0vUnVudGltZUhvc3QudHMiLCAiLi4vLi4vLi4vLi4vbG9naXgtY29yZS9zcmMvaW50ZXJuYWwvcnVudGltZS9SdW50aW1lLnRzIiwgIi4uLy4uLy4uLy4uL2xvZ2l4LWNvcmUvc3JjL2ludGVybmFsL29ic2VydmFiaWxpdHkvYXJ0aWZhY3RzL21vZGVsLnRzIiwgIi4uLy4uLy4uLy4uL2xvZ2l4LWNvcmUvc3JjL2ludGVybmFsL29ic2VydmFiaWxpdHkvYXJ0aWZhY3RzL2RpZ2VzdC50cyIsICIuLi8uLi8uLi8uLi9sb2dpeC1jb3JlL3NyYy9pbnRlcm5hbC9vYnNlcnZhYmlsaXR5L2FydGlmYWN0cy9jb2xsZWN0LnRzIiwgIi4uLy4uLy4uLy4uL2xvZ2l4LWNvcmUvc3JjL2ludGVybmFsL29ic2VydmFiaWxpdHkvdHJpYWxSdW4udHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbImltcG9ydCB0eXBlIHsgQW55TW9kdWxlU2hhcGUsIE1vZHVsZUltcGwgfSBmcm9tICcuLi9ydW50aW1lL2NvcmUvbW9kdWxlLmpzJ1xuaW1wb3J0IHsgZ2V0TW9kdWxlVHJhaXRzUHJvZ3JhbSB9IGZyb20gJy4uL3J1bnRpbWUvY29yZS9ydW50aW1lSW50ZXJuYWxzQWNjZXNzb3IuanMnXG5pbXBvcnQgdHlwZSB7IFN0YXRpY0lyIH0gZnJvbSAnLi4vc3RhdGUtdHJhaXQvaXIuanMnXG5pbXBvcnQgdHlwZSB7IFN0YXRlVHJhaXRQcm9ncmFtIH0gZnJvbSAnLi4vc3RhdGUtdHJhaXQvbW9kZWwuanMnXG5pbXBvcnQgeyBleHBvcnRTdGF0aWNJciBhcyBleHBvcnRTdGF0ZVRyYWl0U3RhdGljSXIgfSBmcm9tICcuLi9zdGF0ZS10cmFpdC9pci5qcydcblxuY29uc3QgaXNSZWNvcmQgPSAodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9PlxuICB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIHZhbHVlICE9PSBudWxsICYmICFBcnJheS5pc0FycmF5KHZhbHVlKVxuXG5jb25zdCBpc01vZHVsZUltcGwgPSAodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBNb2R1bGVJbXBsPGFueSwgQW55TW9kdWxlU2hhcGUsIGFueT4gPT5cbiAgaXNSZWNvcmQodmFsdWUpICYmIHZhbHVlLl90YWcgPT09ICdNb2R1bGVJbXBsJyAmJiBpc1JlY29yZCh2YWx1ZS5tb2R1bGUpXG5cbmNvbnN0IHJlc29sdmVNb2R1bGVJZCA9IChpbnB1dDogdW5rbm93bik6IHN0cmluZyA9PiB7XG4gIGlmIChpc01vZHVsZUltcGwoaW5wdXQpKSB7XG4gICAgY29uc3QgaWQgPSAoaW5wdXQubW9kdWxlIGFzIGFueSkuaWRcbiAgICByZXR1cm4gdHlwZW9mIGlkID09PSAnc3RyaW5nJyAmJiBpZC5sZW5ndGggPiAwID8gaWQgOiAndW5rbm93bidcbiAgfVxuXG4gIGlmIChpc1JlY29yZChpbnB1dCkpIHtcbiAgICBjb25zdCBpZCA9IGlucHV0LmlkXG4gICAgaWYgKHR5cGVvZiBpZCA9PT0gJ3N0cmluZycgJiYgaWQubGVuZ3RoID4gMCkgcmV0dXJuIGlkXG4gICAgY29uc3QgdGFnID0gKGlucHV0IGFzIGFueSkudGFnXG4gICAgaWYgKHRhZyAmJiAodHlwZW9mIHRhZyA9PT0gJ29iamVjdCcgfHwgdHlwZW9mIHRhZyA9PT0gJ2Z1bmN0aW9uJykpIHtcbiAgICAgIGNvbnN0IHRhZ0lkID0gKHRhZyBhcyBhbnkpLmlkXG4gICAgICBpZiAodHlwZW9mIHRhZ0lkID09PSAnc3RyaW5nJyAmJiB0YWdJZC5sZW5ndGggPiAwKSByZXR1cm4gdGFnSWRcbiAgICB9XG4gIH1cblxuICByZXR1cm4gJ3Vua25vd24nXG59XG5cbmNvbnN0IHJlc29sdmVNb2R1bGVUYWcgPSAoaW5wdXQ6IHVua25vd24pOiB1bmtub3duID0+IHtcbiAgaWYgKGlzTW9kdWxlSW1wbChpbnB1dCkpIHJldHVybiBpbnB1dC5tb2R1bGVcbiAgaWYgKGlzUmVjb3JkKGlucHV0KSAmJiAoaW5wdXQgYXMgYW55KS50YWcpIHJldHVybiAoaW5wdXQgYXMgYW55KS50YWdcbiAgcmV0dXJuIHVuZGVmaW5lZFxufVxuXG5leHBvcnQgY29uc3QgZXhwb3J0U3RhdGljSXIgPSAobW9kdWxlOiB1bmtub3duKTogU3RhdGljSXIgfCB1bmRlZmluZWQgPT4ge1xuICBjb25zdCB0YWcgPSByZXNvbHZlTW9kdWxlVGFnKG1vZHVsZSlcbiAgaWYgKCF0YWcpIHJldHVybiB1bmRlZmluZWRcblxuICBjb25zdCBwcm9ncmFtID0gZ2V0TW9kdWxlVHJhaXRzUHJvZ3JhbSh0YWcpIGFzIFN0YXRlVHJhaXRQcm9ncmFtPGFueT4gfCB1bmRlZmluZWRcbiAgaWYgKCFwcm9ncmFtKSByZXR1cm4gdW5kZWZpbmVkXG5cbiAgcmV0dXJuIGV4cG9ydFN0YXRlVHJhaXRTdGF0aWNJcih7XG4gICAgcHJvZ3JhbSxcbiAgICBtb2R1bGVJZDogcmVzb2x2ZU1vZHVsZUlkKG1vZHVsZSksXG4gIH0pXG59XG4iLCAiaW1wb3J0IHsgU2NoZW1hIH0gZnJvbSAnZWZmZWN0J1xuaW1wb3J0IHR5cGUgeyBBbnlNb2R1bGVTaGFwZSwgTW9kdWxlSW1wbCB9IGZyb20gJy4uL3J1bnRpbWUvY29yZS9tb2R1bGUuanMnXG5pbXBvcnQgKiBhcyBBY3Rpb24gZnJvbSAnLi4vYWN0aW9uLmpzJ1xuaW1wb3J0IHsgc3RhYmxlU3RyaW5naWZ5LCBmbnYxYTMyIH0gZnJvbSAnLi4vZGlnZXN0LmpzJ1xuaW1wb3J0IHsgaXNKc29uVmFsdWUsIHR5cGUgSnNvblZhbHVlIH0gZnJvbSAnLi4vb2JzZXJ2YWJpbGl0eS9qc29uVmFsdWUuanMnXG5pbXBvcnQgeyBleHBvcnRTdGF0aWNJciB9IGZyb20gJy4vc3RhdGljSXIuanMnXG5cbmV4cG9ydCBpbnRlcmZhY2UgTWFuaWZlc3RCdWRnZXRzIHtcbiAgcmVhZG9ubHkgbWF4Qnl0ZXM/OiBudW1iZXJcbn1cblxuZXhwb3J0IGludGVyZmFjZSBFeHRyYWN0TWFuaWZlc3RPcHRpb25zIHtcbiAgcmVhZG9ubHkgaW5jbHVkZVN0YXRpY0lyPzogYm9vbGVhblxuICByZWFkb25seSBidWRnZXRzPzogTWFuaWZlc3RCdWRnZXRzXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTW9kdWxlTWFuaWZlc3RMb2dpY1VuaXQge1xuICByZWFkb25seSBraW5kOiBzdHJpbmdcbiAgcmVhZG9ubHkgaWQ6IHN0cmluZ1xuICByZWFkb25seSBkZXJpdmVkPzogYm9vbGVhblxuICByZWFkb25seSBuYW1lPzogc3RyaW5nXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTW9kdWxlTWFuaWZlc3RBY3Rpb24ge1xuICByZWFkb25seSBhY3Rpb25UYWc6IHN0cmluZ1xuICByZWFkb25seSBwYXlsb2FkOiB7XG4gICAgcmVhZG9ubHkga2luZDogJ3ZvaWQnIHwgJ25vblZvaWQnIHwgJ3Vua25vd24nXG4gIH1cbiAgcmVhZG9ubHkgcHJpbWFyeVJlZHVjZXI/OiB7XG4gICAgcmVhZG9ubHkga2luZDogJ2RlY2xhcmVkJyB8ICdyZWdpc3RlcmVkJ1xuICB9XG4gIHJlYWRvbmx5IHNvdXJjZT86IHtcbiAgICByZWFkb25seSBmaWxlOiBzdHJpbmdcbiAgICByZWFkb25seSBsaW5lOiBudW1iZXJcbiAgICByZWFkb25seSBjb2x1bW46IG51bWJlclxuICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTW9kdWxlTWFuaWZlc3RFZmZlY3Qge1xuICByZWFkb25seSBhY3Rpb25UYWc6IHN0cmluZ1xuICByZWFkb25seSBzb3VyY2VLZXk6IHN0cmluZ1xuICByZWFkb25seSBraW5kOiAnZGVjbGFyZWQnIHwgJ3JlZ2lzdGVyZWQnXG4gIHJlYWRvbmx5IHNvdXJjZT86IHtcbiAgICByZWFkb25seSBmaWxlOiBzdHJpbmdcbiAgICByZWFkb25seSBsaW5lOiBudW1iZXJcbiAgICByZWFkb25seSBjb2x1bW46IG51bWJlclxuICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTW9kdWxlTWFuaWZlc3Qge1xuICByZWFkb25seSBtYW5pZmVzdFZlcnNpb246IHN0cmluZ1xuICByZWFkb25seSBtb2R1bGVJZDogc3RyaW5nXG4gIHJlYWRvbmx5IGFjdGlvbktleXM6IFJlYWRvbmx5QXJyYXk8c3RyaW5nPlxuICByZWFkb25seSBhY3Rpb25zOiBSZWFkb25seUFycmF5PE1vZHVsZU1hbmlmZXN0QWN0aW9uPlxuICByZWFkb25seSBlZmZlY3RzPzogUmVhZG9ubHlBcnJheTxNb2R1bGVNYW5pZmVzdEVmZmVjdD5cbiAgcmVhZG9ubHkgc2NoZW1hS2V5cz86IFJlYWRvbmx5QXJyYXk8c3RyaW5nPlxuICByZWFkb25seSBsb2dpY1VuaXRzPzogUmVhZG9ubHlBcnJheTxNb2R1bGVNYW5pZmVzdExvZ2ljVW5pdD5cbiAgcmVhZG9ubHkgc291cmNlPzoge1xuICAgIHJlYWRvbmx5IGZpbGU6IHN0cmluZ1xuICAgIHJlYWRvbmx5IGxpbmU6IG51bWJlclxuICAgIHJlYWRvbmx5IGNvbHVtbjogbnVtYmVyXG4gIH1cbiAgcmVhZG9ubHkgbWV0YT86IFJlY29yZDxzdHJpbmcsIEpzb25WYWx1ZT5cbiAgcmVhZG9ubHkgc3RhdGljSXI/OiBSZXR1cm5UeXBlPHR5cGVvZiBleHBvcnRTdGF0aWNJcj5cbiAgcmVhZG9ubHkgZGlnZXN0OiBzdHJpbmdcbn1cblxuY29uc3QgaXNSZWNvcmQgPSAodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9PlxuICB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIHZhbHVlICE9PSBudWxsICYmICFBcnJheS5pc0FycmF5KHZhbHVlKVxuXG5jb25zdCBpc01vZHVsZUltcGwgPSAodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBNb2R1bGVJbXBsPGFueSwgQW55TW9kdWxlU2hhcGUsIGFueT4gPT5cbiAgaXNSZWNvcmQodmFsdWUpICYmIHZhbHVlLl90YWcgPT09ICdNb2R1bGVJbXBsJyAmJiBpc1JlY29yZCh2YWx1ZS5tb2R1bGUpXG5cbmNvbnN0IHJlc29sdmVNb2R1bGVJZCA9IChpbnB1dDogdW5rbm93bik6IHN0cmluZyA9PiB7XG4gIGlmIChpc01vZHVsZUltcGwoaW5wdXQpKSB7XG4gICAgY29uc3QgaWQgPSAoaW5wdXQubW9kdWxlIGFzIGFueSkuaWRcbiAgICByZXR1cm4gdHlwZW9mIGlkID09PSAnc3RyaW5nJyAmJiBpZC5sZW5ndGggPiAwID8gaWQgOiAndW5rbm93bidcbiAgfVxuXG4gIGlmIChpc1JlY29yZChpbnB1dCkpIHtcbiAgICBjb25zdCBpZCA9IGlucHV0LmlkXG4gICAgaWYgKHR5cGVvZiBpZCA9PT0gJ3N0cmluZycgJiYgaWQubGVuZ3RoID4gMCkgcmV0dXJuIGlkXG4gICAgY29uc3QgdGFnID0gKGlucHV0IGFzIGFueSkudGFnXG4gICAgaWYgKHRhZyAmJiAodHlwZW9mIHRhZyA9PT0gJ29iamVjdCcgfHwgdHlwZW9mIHRhZyA9PT0gJ2Z1bmN0aW9uJykpIHtcbiAgICAgIGNvbnN0IHRhZ0lkID0gKHRhZyBhcyBhbnkpLmlkXG4gICAgICBpZiAodHlwZW9mIHRhZ0lkID09PSAnc3RyaW5nJyAmJiB0YWdJZC5sZW5ndGggPiAwKSByZXR1cm4gdGFnSWRcbiAgICB9XG4gIH1cblxuICByZXR1cm4gJ3Vua25vd24nXG59XG5cbmNvbnN0IHJlc29sdmVBY3Rpb25LZXlzID0gKGlucHV0OiB1bmtub3duKTogUmVhZG9ubHlBcnJheTxzdHJpbmc+ID0+IHtcbiAgY29uc3QgdGFnID0gaXNNb2R1bGVJbXBsKGlucHV0KSA/IChpbnB1dC5tb2R1bGUgYXMgYW55KSA6IChpbnB1dCBhcyBhbnkpPy50YWdcbiAgY29uc3QgYWN0aW9uTWFwID0gdGFnPy5zaGFwZT8uYWN0aW9uTWFwXG4gIGlmICghaXNSZWNvcmQoYWN0aW9uTWFwKSkgcmV0dXJuIFtdXG4gIHJldHVybiBPYmplY3Qua2V5cyhhY3Rpb25NYXApLnNvcnQoKVxufVxuXG50eXBlIERldlNvdXJjZSA9IE1vZHVsZU1hbmlmZXN0Wydzb3VyY2UnXVxuXG5jb25zdCByZXNvbHZlRGV2U291cmNlID0gKGlucHV0OiB1bmtub3duKTogRGV2U291cmNlIHwgdW5kZWZpbmVkID0+IHtcbiAgaWYgKCFpc1JlY29yZChpbnB1dCkpIHJldHVybiB1bmRlZmluZWRcbiAgY29uc3QgZmlsZSA9IChpbnB1dCBhcyBhbnkpLmZpbGVcbiAgY29uc3QgbGluZSA9IChpbnB1dCBhcyBhbnkpLmxpbmVcbiAgY29uc3QgY29sdW1uID0gKGlucHV0IGFzIGFueSkuY29sdW1uXG4gIGlmICh0eXBlb2YgZmlsZSAhPT0gJ3N0cmluZycgfHwgZmlsZS5sZW5ndGggPT09IDApIHJldHVybiB1bmRlZmluZWRcbiAgaWYgKHR5cGVvZiBsaW5lICE9PSAnbnVtYmVyJyB8fCAhTnVtYmVyLmlzSW50ZWdlcihsaW5lKSB8fCBsaW5lIDwgMSkgcmV0dXJuIHVuZGVmaW5lZFxuICBpZiAodHlwZW9mIGNvbHVtbiAhPT0gJ251bWJlcicgfHwgIU51bWJlci5pc0ludGVnZXIoY29sdW1uKSB8fCBjb2x1bW4gPCAxKSByZXR1cm4gdW5kZWZpbmVkXG4gIHJldHVybiB7IGZpbGUsIGxpbmUsIGNvbHVtbiB9XG59XG5cbmNvbnN0IHJlc29sdmVUb2tlblNvdXJjZSA9ICh0b2tlbjogdW5rbm93bik6IERldlNvdXJjZSB8IHVuZGVmaW5lZCA9PiB7XG4gIGlmICghdG9rZW4gfHwgKHR5cGVvZiB0b2tlbiAhPT0gJ29iamVjdCcgJiYgdHlwZW9mIHRva2VuICE9PSAnZnVuY3Rpb24nKSkgcmV0dXJuIHVuZGVmaW5lZFxuICByZXR1cm4gcmVzb2x2ZURldlNvdXJjZSgodG9rZW4gYXMgYW55KS5zb3VyY2UpXG59XG5cbmNvbnN0IHJlc29sdmVBY3Rpb25zID0gKGlucHV0OiB1bmtub3duKTogUmVhZG9ubHlBcnJheTxNb2R1bGVNYW5pZmVzdEFjdGlvbj4gPT4ge1xuICBjb25zdCB0YWcgPSBpc01vZHVsZUltcGwoaW5wdXQpID8gKGlucHV0Lm1vZHVsZSBhcyBhbnkpIDogKGlucHV0IGFzIGFueSk/LnRhZ1xuICBjb25zdCBhY3Rpb25NYXAgPSB0YWc/LnNoYXBlPy5hY3Rpb25NYXBcbiAgaWYgKCFpc1JlY29yZChhY3Rpb25NYXApKSByZXR1cm4gW11cblxuICBjb25zdCBtb2R1bGVTb3VyY2UgPSByZXNvbHZlU291cmNlKGlucHV0KVxuICBjb25zdCByZWR1Y2VycyA9IGlzUmVjb3JkKHRhZz8ucmVkdWNlcnMpID8gKHRhZy5yZWR1Y2VycyBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikgOiB1bmRlZmluZWRcblxuICBjb25zdCBhY3Rpb25UYWdzID0gT2JqZWN0LmtleXMoYWN0aW9uTWFwKS5zb3J0KClcblxuICBjb25zdCBvdXQ6IEFycmF5PE1vZHVsZU1hbmlmZXN0QWN0aW9uPiA9IFtdXG4gIGZvciAoY29uc3QgYWN0aW9uVGFnIG9mIGFjdGlvblRhZ3MpIHtcbiAgICBjb25zdCB0b2tlbiA9IGFjdGlvbk1hcFthY3Rpb25UYWddXG4gICAgY29uc3Qgc291cmNlID0gcmVzb2x2ZVRva2VuU291cmNlKHRva2VuKSA/PyBtb2R1bGVTb3VyY2VcbiAgICBjb25zdCBwYXlsb2FkS2luZCA9XG4gICAgICBBY3Rpb24uaXNBY3Rpb25Ub2tlbih0b2tlbikgJiYgU2NoZW1hLmlzU2NoZW1hKCh0b2tlbiBhcyBBY3Rpb24uQW55QWN0aW9uVG9rZW4pLnNjaGVtYSlcbiAgICAgICAgPyAodG9rZW4gYXMgQWN0aW9uLkFueUFjdGlvblRva2VuKS5zY2hlbWEgPT09IFNjaGVtYS5Wb2lkXG4gICAgICAgICAgPyAndm9pZCdcbiAgICAgICAgICA6ICdub25Wb2lkJ1xuICAgICAgICA6ICd1bmtub3duJ1xuXG4gICAgY29uc3QgcHJpbWFyeVJlZHVjZXIgPVxuICAgICAgcmVkdWNlcnMgJiYgdHlwZW9mIHJlZHVjZXJzW2FjdGlvblRhZ10gPT09ICdmdW5jdGlvbicgPyAoeyBraW5kOiAnZGVjbGFyZWQnIH0gYXMgY29uc3QpIDogdW5kZWZpbmVkXG5cbiAgICBvdXQucHVzaCh7XG4gICAgICBhY3Rpb25UYWcsXG4gICAgICBwYXlsb2FkOiB7IGtpbmQ6IHBheWxvYWRLaW5kIH0sXG4gICAgICAuLi4ocHJpbWFyeVJlZHVjZXIgPyB7IHByaW1hcnlSZWR1Y2VyIH0gOiB7fSksXG4gICAgICAuLi4oc291cmNlID8geyBzb3VyY2UgfSA6IHt9KSxcbiAgICB9KVxuICB9XG5cbiAgcmV0dXJuIG91dFxufVxuXG5jb25zdCBNT0RVTEVfREVDTEFSRURfRUZGRUNUUyA9IFN5bWJvbC5mb3IoJ2xvZ2l4Lm1vZHVsZS5lZmZlY3RzLmRlY2xhcmVkJylcblxuY29uc3QgcmVzb2x2ZUVmZmVjdHMgPSAoaW5wdXQ6IHVua25vd24pOiBSZWFkb25seUFycmF5PE1vZHVsZU1hbmlmZXN0RWZmZWN0PiB8IHVuZGVmaW5lZCA9PiB7XG4gIGNvbnN0IHRhZyA9IGlzTW9kdWxlSW1wbChpbnB1dCkgPyAoaW5wdXQubW9kdWxlIGFzIGFueSkgOiAoaW5wdXQgYXMgYW55KT8udGFnXG4gIGNvbnN0IGFjdGlvbk1hcCA9IHRhZz8uc2hhcGU/LmFjdGlvbk1hcFxuICBpZiAoIWlzUmVjb3JkKGFjdGlvbk1hcCkpIHJldHVybiB1bmRlZmluZWRcblxuICBjb25zdCBlZmZlY3RzUmF3ID0gKHRhZyBhcyBhbnkpPy5bTU9EVUxFX0RFQ0xBUkVEX0VGRkVDVFNdXG4gIGlmICghaXNSZWNvcmQoZWZmZWN0c1JhdykpIHJldHVybiB1bmRlZmluZWRcblxuICBjb25zdCBzb3VyY2UgPSByZXNvbHZlU291cmNlKGlucHV0KVxuXG4gIGNvbnN0IGxvZ2ljVW5pdElkID0gJ19fbG9naXhfaW50ZXJuYWw6ZWZmZWN0czpkZWNsYXJlZCdcbiAgY29uc3QgaGFuZGxlcklkcyA9IG5ldyBXZWFrTWFwPCguLi5hcmdzOiBhbnlbXSkgPT4gYW55LCBzdHJpbmc+KClcbiAgbGV0IG5leHRIYW5kbGVyU2VxID0gMFxuXG4gIGNvbnN0IG91dDogQXJyYXk8TW9kdWxlTWFuaWZlc3RFZmZlY3Q+ID0gW11cblxuICBmb3IgKGNvbnN0IGFjdGlvblRhZyBvZiBPYmplY3Qua2V5cyhlZmZlY3RzUmF3KS5zb3J0KCkpIHtcbiAgICBpZiAoIShhY3Rpb25UYWcgaW4gYWN0aW9uTWFwKSkgY29udGludWVcblxuICAgIGNvbnN0IGhhbmRsZXJzID0gKGVmZmVjdHNSYXcgYXMgYW55KVthY3Rpb25UYWddXG4gICAgaWYgKCFBcnJheS5pc0FycmF5KGhhbmRsZXJzKSkgY29udGludWVcblxuICAgIGZvciAoY29uc3QgaGFuZGxlciBvZiBoYW5kbGVycykge1xuICAgICAgaWYgKHR5cGVvZiBoYW5kbGVyICE9PSAnZnVuY3Rpb24nKSBjb250aW51ZVxuXG4gICAgICBsZXQgaGFuZGxlcklkID0gaGFuZGxlcklkcy5nZXQoaGFuZGxlcilcbiAgICAgIGlmICghaGFuZGxlcklkKSB7XG4gICAgICAgIG5leHRIYW5kbGVyU2VxICs9IDFcbiAgICAgICAgaGFuZGxlcklkID0gYGgke25leHRIYW5kbGVyU2VxfWBcbiAgICAgICAgaGFuZGxlcklkcy5zZXQoaGFuZGxlciwgaGFuZGxlcklkKVxuICAgICAgfVxuXG4gICAgICBjb25zdCBzb3VyY2VLZXkgPSBgJHtsb2dpY1VuaXRJZH06OiR7aGFuZGxlcklkfWBcblxuICAgICAgb3V0LnB1c2goe1xuICAgICAgICBhY3Rpb25UYWcsXG4gICAgICAgIHNvdXJjZUtleSxcbiAgICAgICAga2luZDogJ2RlY2xhcmVkJyxcbiAgICAgICAgLi4uKHNvdXJjZSA/IHsgc291cmNlIH0gOiB7fSksXG4gICAgICB9KVxuICAgIH1cbiAgfVxuXG4gIGNvbnN0IHNlZW4gPSBuZXcgU2V0PHN0cmluZz4oKVxuICBjb25zdCBkZWR1cGVkOiBBcnJheTxNb2R1bGVNYW5pZmVzdEVmZmVjdD4gPSBbXVxuICBmb3IgKGNvbnN0IGl0ZW0gb2Ygb3V0KSB7XG4gICAgY29uc3Qga2V5ID0gYCR7aXRlbS5hY3Rpb25UYWd9XFx1MDAwMCR7aXRlbS5zb3VyY2VLZXl9YFxuICAgIGlmIChzZWVuLmhhcyhrZXkpKSBjb250aW51ZVxuICAgIHNlZW4uYWRkKGtleSlcbiAgICBkZWR1cGVkLnB1c2goaXRlbSlcbiAgfVxuXG4gIGRlZHVwZWQuc29ydCgoYSwgYikgPT5cbiAgICBhLmFjdGlvblRhZyA8IGIuYWN0aW9uVGFnID8gLTEgOiBhLmFjdGlvblRhZyA+IGIuYWN0aW9uVGFnID8gMSA6IGEuc291cmNlS2V5LmxvY2FsZUNvbXBhcmUoYi5zb3VyY2VLZXkpLFxuICApXG4gIHJldHVybiBkZWR1cGVkLmxlbmd0aCA+IDAgPyBkZWR1cGVkIDogdW5kZWZpbmVkXG59XG5cbmNvbnN0IHJlc29sdmVTY2hlbWFLZXlzID0gKGlucHV0OiB1bmtub3duKTogUmVhZG9ubHlBcnJheTxzdHJpbmc+IHwgdW5kZWZpbmVkID0+IHtcbiAgaWYgKCFpc1JlY29yZChpbnB1dCkpIHJldHVybiB1bmRlZmluZWRcbiAgY29uc3Qgc2NoZW1hcyA9IChpbnB1dCBhcyBhbnkpLnNjaGVtYXNcbiAgaWYgKCFpc1JlY29yZChzY2hlbWFzKSkgcmV0dXJuIHVuZGVmaW5lZFxuICByZXR1cm4gT2JqZWN0LmtleXMoc2NoZW1hcykuc29ydCgpXG59XG5cbmNvbnN0IHJlc29sdmVTb3VyY2UgPSAoaW5wdXQ6IHVua25vd24pOiBNb2R1bGVNYW5pZmVzdFsnc291cmNlJ10gfCB1bmRlZmluZWQgPT4ge1xuICBpZiAoIWlzUmVjb3JkKGlucHV0KSkgcmV0dXJuIHVuZGVmaW5lZFxuICBjb25zdCBkZXYgPSAoaW5wdXQgYXMgYW55KS5kZXZcbiAgcmV0dXJuIHJlc29sdmVEZXZTb3VyY2UoZGV2Py5zb3VyY2UpXG59XG5cbmNvbnN0IHJlc29sdmVNZXRhID0gKGlucHV0OiB1bmtub3duKTogUmVjb3JkPHN0cmluZywgSnNvblZhbHVlPiB8IHVuZGVmaW5lZCA9PiB7XG4gIGlmICghaXNSZWNvcmQoaW5wdXQpKSByZXR1cm4gdW5kZWZpbmVkXG4gIGNvbnN0IG1ldGEgPSAoaW5wdXQgYXMgYW55KS5tZXRhXG4gIGlmICghaXNSZWNvcmQobWV0YSkpIHJldHVybiB1bmRlZmluZWRcblxuICBjb25zdCBvdXQ6IFJlY29yZDxzdHJpbmcsIEpzb25WYWx1ZT4gPSB7fVxuICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhtZXRhKS5zb3J0KCkpIHtcbiAgICBjb25zdCB2YWx1ZSA9IG1ldGFba2V5XVxuICAgIGlmIChpc0pzb25WYWx1ZSh2YWx1ZSkpIHtcbiAgICAgIG91dFtrZXldID0gdmFsdWVcbiAgICB9XG4gIH1cbiAgcmV0dXJuIE9iamVjdC5rZXlzKG91dCkubGVuZ3RoID4gMCA/IG91dCA6IHVuZGVmaW5lZFxufVxuXG5jb25zdCBNT0RVTEVfSU5URVJOQUwgPSBTeW1ib2wuZm9yKCdsb2dpeC5tb2R1bGUuaW50ZXJuYWwnKVxuXG5jb25zdCByZXNvbHZlTG9naWNVbml0cyA9IChpbnB1dDogdW5rbm93bik6IFJlYWRvbmx5QXJyYXk8TW9kdWxlTWFuaWZlc3RMb2dpY1VuaXQ+IHwgdW5kZWZpbmVkID0+IHtcbiAgaWYgKCFpc1JlY29yZChpbnB1dCkpIHJldHVybiB1bmRlZmluZWRcbiAgY29uc3QgaW50ZXJuYWwgPSAoaW5wdXQgYXMgYW55KVtNT0RVTEVfSU5URVJOQUxdXG4gIGNvbnN0IG1vdW50ZWQgPSBpbnRlcm5hbD8ubW91bnRlZFxuICBpZiAoIUFycmF5LmlzQXJyYXkobW91bnRlZCkpIHJldHVybiB1bmRlZmluZWRcblxuICBjb25zdCBvdXQ6IEFycmF5PE1vZHVsZU1hbmlmZXN0TG9naWNVbml0PiA9IFtdXG4gIGZvciAoY29uc3QgdW5pdCBvZiBtb3VudGVkKSB7XG4gICAgaWYgKCFpc1JlY29yZCh1bml0KSkgY29udGludWVcbiAgICBjb25zdCBraW5kID0gdW5pdC5raW5kXG4gICAgY29uc3QgaWQgPSB1bml0LmlkXG4gICAgaWYgKHR5cGVvZiBraW5kICE9PSAnc3RyaW5nJyB8fCBraW5kLmxlbmd0aCA9PT0gMCkgY29udGludWVcbiAgICBpZiAodHlwZW9mIGlkICE9PSAnc3RyaW5nJyB8fCBpZC5sZW5ndGggPT09IDApIGNvbnRpbnVlXG5cbiAgICBjb25zdCBkZXJpdmVkID0gdW5pdC5kZXJpdmVkID09PSB0cnVlID8gdHJ1ZSA6IHVuZGVmaW5lZFxuICAgIGNvbnN0IG5hbWUgPSB0eXBlb2YgdW5pdC5uYW1lID09PSAnc3RyaW5nJyA/IHVuaXQubmFtZSA6IHVuZGVmaW5lZFxuICAgIG91dC5wdXNoKHsga2luZCwgaWQsIGRlcml2ZWQsIG5hbWUgfSlcbiAgfVxuXG4gIG91dC5zb3J0KChhLCBiKSA9PiAoYS5pZCA8IGIuaWQgPyAtMSA6IGEuaWQgPiBiLmlkID8gMSA6IGEua2luZC5sb2NhbGVDb21wYXJlKGIua2luZCkpKVxuICByZXR1cm4gb3V0Lmxlbmd0aCA+IDAgPyBvdXQgOiB1bmRlZmluZWRcbn1cblxudHlwZSBEaWdlc3RCYXNlID0ge1xuICByZWFkb25seSBtYW5pZmVzdFZlcnNpb246IHN0cmluZ1xuICByZWFkb25seSBtb2R1bGVJZDogc3RyaW5nXG4gIHJlYWRvbmx5IGFjdGlvbktleXM6IFJlYWRvbmx5QXJyYXk8c3RyaW5nPlxuICByZWFkb25seSBhY3Rpb25zOiBSZWFkb25seUFycmF5PE1vZHVsZU1hbmlmZXN0QWN0aW9uPlxuICByZWFkb25seSBlZmZlY3RzPzogUmVhZG9ubHlBcnJheTxNb2R1bGVNYW5pZmVzdEVmZmVjdD5cbiAgcmVhZG9ubHkgc2NoZW1hS2V5cz86IFJlYWRvbmx5QXJyYXk8c3RyaW5nPlxuICByZWFkb25seSBsb2dpY1VuaXRzPzogUmVhZG9ubHlBcnJheTxNb2R1bGVNYW5pZmVzdExvZ2ljVW5pdD5cbiAgcmVhZG9ubHkgc3RhdGljSXJEaWdlc3Q/OiBzdHJpbmdcbn1cblxuY29uc3QgZGlnZXN0T2YgPSAoYmFzZTogRGlnZXN0QmFzZSk6IHN0cmluZyA9PiBgbWFuaWZlc3Q6MDY3OiR7Zm52MWEzMihzdGFibGVTdHJpbmdpZnkoYmFzZSkpfWBcblxuY29uc3QgdXRmOEJ5dGVMZW5ndGggPSAodmFsdWU6IHVua25vd24pOiBudW1iZXIgPT4ge1xuICBjb25zdCBqc29uID0gSlNPTi5zdHJpbmdpZnkodmFsdWUpXG4gIGlmICh0eXBlb2YgVGV4dEVuY29kZXIgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgcmV0dXJuIG5ldyBUZXh0RW5jb2RlcigpLmVuY29kZShqc29uKS5sZW5ndGhcbiAgfVxuICByZXR1cm4ganNvbi5sZW5ndGhcbn1cblxuY29uc3QgYXBwbHlNYXhCeXRlcyA9IChtYW5pZmVzdDogTW9kdWxlTWFuaWZlc3QsIG1heEJ5dGVzOiBudW1iZXIpOiBNb2R1bGVNYW5pZmVzdCA9PiB7XG4gIGNvbnN0IG9yaWdpbmFsQnl0ZXMgPSB1dGY4Qnl0ZUxlbmd0aChtYW5pZmVzdClcbiAgaWYgKG9yaWdpbmFsQnl0ZXMgPD0gbWF4Qnl0ZXMpIHJldHVybiBtYW5pZmVzdFxuXG4gIGNvbnN0IGRyb3BwZWQ6IEFycmF5PHN0cmluZz4gPSBbXVxuICBjb25zdCB0cnVuY2F0ZWRBcnJheXM6IEFycmF5PHN0cmluZz4gPSBbXVxuXG4gIGNvbnN0IGJhc2VNYXJrZXIgPSAoKTogSnNvblZhbHVlID0+ICh7XG4gICAgdHJ1bmNhdGVkOiB0cnVlLFxuICAgIG1heEJ5dGVzLFxuICAgIG9yaWdpbmFsQnl0ZXMsXG4gICAgZHJvcHBlZCxcbiAgICB0cnVuY2F0ZWRBcnJheXMsXG4gIH0pXG5cbiAgY29uc3Qgd2l0aE1hcmtlciA9IChuZXh0OiBNb2R1bGVNYW5pZmVzdCk6IE1vZHVsZU1hbmlmZXN0ID0+IHtcbiAgICBjb25zdCBtZXRhOiBSZWNvcmQ8c3RyaW5nLCBKc29uVmFsdWU+ID0ge1xuICAgICAgX19sb2dpeDogYmFzZU1hcmtlcigpLFxuICAgIH1cbiAgICByZXR1cm4geyAuLi5uZXh0LCBtZXRhIH1cbiAgfVxuXG4gIGxldCBuZXh0OiBNb2R1bGVNYW5pZmVzdCA9IHdpdGhNYXJrZXIobWFuaWZlc3QpXG5cbiAgY29uc3QgbWFya1RydW5jYXRlZEFycmF5ID0gKG5hbWU6IHN0cmluZyk6IHZvaWQgPT4ge1xuICAgIGlmICghdHJ1bmNhdGVkQXJyYXlzLmluY2x1ZGVzKG5hbWUpKSB7XG4gICAgICB0cnVuY2F0ZWRBcnJheXMucHVzaChuYW1lKVxuICAgIH1cbiAgfVxuXG4gIGNvbnN0IGRyb3BGaWVsZCA9IChmaWVsZDoga2V5b2YgTW9kdWxlTWFuaWZlc3QpOiB2b2lkID0+IHtcbiAgICBpZiAoKG5leHQgYXMgYW55KVtmaWVsZF0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgZHJvcHBlZC5wdXNoKFN0cmluZyhmaWVsZCkpXG4gICAgICBuZXh0ID0gd2l0aE1hcmtlcih7IC4uLihuZXh0IGFzIGFueSksIFtmaWVsZF06IHVuZGVmaW5lZCB9KVxuICAgIH1cbiAgfVxuXG4gIC8vIERldGVybWluaXN0aWMgdHJpbW1pbmcgb3JkZXIgKGxlYXN0IHZhbHVhYmxlIGZpcnN0KS5cbiAgZHJvcEZpZWxkKCdtZXRhJylcbiAgaWYgKHV0ZjhCeXRlTGVuZ3RoKG5leHQpIDw9IG1heEJ5dGVzKSByZXR1cm4gbmV4dFxuXG4gIGRyb3BGaWVsZCgnc291cmNlJylcbiAgaWYgKHV0ZjhCeXRlTGVuZ3RoKG5leHQpIDw9IG1heEJ5dGVzKSByZXR1cm4gbmV4dFxuXG4gIGRyb3BGaWVsZCgnc3RhdGljSXInKVxuICBpZiAodXRmOEJ5dGVMZW5ndGgobmV4dCkgPD0gbWF4Qnl0ZXMpIHJldHVybiBuZXh0XG5cbiAgZHJvcEZpZWxkKCdsb2dpY1VuaXRzJylcbiAgaWYgKHV0ZjhCeXRlTGVuZ3RoKG5leHQpIDw9IG1heEJ5dGVzKSByZXR1cm4gbmV4dFxuXG4gIGRyb3BGaWVsZCgnc2NoZW1hS2V5cycpXG4gIGlmICh1dGY4Qnl0ZUxlbmd0aChuZXh0KSA8PSBtYXhCeXRlcykgcmV0dXJuIG5leHRcblxuICBkcm9wRmllbGQoJ2VmZmVjdHMnKVxuICBpZiAodXRmOEJ5dGVMZW5ndGgobmV4dCkgPD0gbWF4Qnl0ZXMpIHJldHVybiBuZXh0XG5cbiAgLy8gTGFzdCByZXNvcnQ6IGRldGVybWluaXN0aWNhbGx5IHRydW5jYXRlIHRhaWwgaXRlbXMgKHN0YWJsZSBvcmRlcjogYWN0aW9uc1tdIHNvcnRlZCBieSBhY3Rpb25UYWcpLlxuICBjb25zdCB0cnVuY2F0ZUFjdGlvbnNUb0ZpdCA9ICgpOiB2b2lkID0+IHtcbiAgICBjb25zdCB0b3RhbCA9IG5leHQuYWN0aW9ucy5sZW5ndGhcbiAgICBpZiAodG90YWwgPD0gMSkgcmV0dXJuXG5cbiAgICAvLyBGaW5kIHRoZSBsYXJnZXN0IHByZWZpeCB0aGF0IGZpdHMuXG4gICAgbGV0IGxvID0gMVxuICAgIGxldCBoaSA9IHRvdGFsXG4gICAgbGV0IGJlc3QgPSAxXG5cbiAgICB3aGlsZSAobG8gPD0gaGkpIHtcbiAgICAgIGNvbnN0IG1pZCA9IE1hdGguZmxvb3IoKGxvICsgaGkpIC8gMilcbiAgICAgIGNvbnN0IGNhbmRpZGF0ZSA9IHdpdGhNYXJrZXIoe1xuICAgICAgICAuLi5uZXh0LFxuICAgICAgICBhY3Rpb25zOiBuZXh0LmFjdGlvbnMuc2xpY2UoMCwgbWlkKSxcbiAgICAgICAgYWN0aW9uS2V5czogbmV4dC5hY3Rpb25LZXlzLnNsaWNlKDAsIG1pZCksXG4gICAgICB9KVxuICAgICAgaWYgKHV0ZjhCeXRlTGVuZ3RoKGNhbmRpZGF0ZSkgPD0gbWF4Qnl0ZXMpIHtcbiAgICAgICAgYmVzdCA9IG1pZFxuICAgICAgICBsbyA9IG1pZCArIDFcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGhpID0gbWlkIC0gMVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChiZXN0IDwgdG90YWwpIHtcbiAgICAgIG1hcmtUcnVuY2F0ZWRBcnJheSgnYWN0aW9ucycpXG4gICAgICBtYXJrVHJ1bmNhdGVkQXJyYXkoJ2FjdGlvbktleXMnKVxuICAgICAgbmV4dCA9IHdpdGhNYXJrZXIoe1xuICAgICAgICAuLi5uZXh0LFxuICAgICAgICBhY3Rpb25zOiBuZXh0LmFjdGlvbnMuc2xpY2UoMCwgYmVzdCksXG4gICAgICAgIGFjdGlvbktleXM6IG5leHQuYWN0aW9uS2V5cy5zbGljZSgwLCBiZXN0KSxcbiAgICAgIH0pXG4gICAgfVxuICB9XG5cbiAgd2hpbGUgKHV0ZjhCeXRlTGVuZ3RoKG5leHQpID4gbWF4Qnl0ZXMpIHtcbiAgICBjb25zdCBiZWZvcmVMZW4gPSBuZXh0LmFjdGlvbnMubGVuZ3RoXG4gICAgdHJ1bmNhdGVBY3Rpb25zVG9GaXQoKVxuICAgIGlmIChuZXh0LmFjdGlvbnMubGVuZ3RoID09PSBiZWZvcmVMZW4pIHtcbiAgICAgIGJyZWFrXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG5leHRcbn1cblxuZXhwb3J0IGNvbnN0IGV4dHJhY3RNYW5pZmVzdCA9IChtb2R1bGU6IHVua25vd24sIG9wdGlvbnM/OiBFeHRyYWN0TWFuaWZlc3RPcHRpb25zKTogTW9kdWxlTWFuaWZlc3QgPT4ge1xuICBjb25zdCBtYW5pZmVzdFZlcnNpb24gPSAnMDY3J1xuICBjb25zdCBtb2R1bGVJZCA9IHJlc29sdmVNb2R1bGVJZChtb2R1bGUpXG4gIGNvbnN0IGFjdGlvbktleXMgPSByZXNvbHZlQWN0aW9uS2V5cyhtb2R1bGUpXG4gIGNvbnN0IGFjdGlvbnMgPSByZXNvbHZlQWN0aW9ucyhtb2R1bGUpXG4gIGNvbnN0IGVmZmVjdHMgPSByZXNvbHZlRWZmZWN0cyhtb2R1bGUpXG5cbiAgY29uc3Qgc2NoZW1hS2V5cyA9IHJlc29sdmVTY2hlbWFLZXlzKG1vZHVsZSlcbiAgY29uc3QgbG9naWNVbml0cyA9IHJlc29sdmVMb2dpY1VuaXRzKG1vZHVsZSlcbiAgY29uc3Qgc291cmNlID0gcmVzb2x2ZVNvdXJjZShtb2R1bGUpXG4gIGNvbnN0IG1ldGEgPSByZXNvbHZlTWV0YShtb2R1bGUpXG5cbiAgY29uc3Qgc3RhdGljSXIgPSBvcHRpb25zPy5pbmNsdWRlU3RhdGljSXIgPyBleHBvcnRTdGF0aWNJcihtb2R1bGUpIDogdW5kZWZpbmVkXG5cbiAgY29uc3QgZGlnZXN0QmFzZTogRGlnZXN0QmFzZSA9IHtcbiAgICBtYW5pZmVzdFZlcnNpb24sXG4gICAgbW9kdWxlSWQsXG4gICAgYWN0aW9uS2V5cyxcbiAgICBhY3Rpb25zLFxuICAgIGVmZmVjdHMsXG4gICAgc2NoZW1hS2V5cyxcbiAgICBsb2dpY1VuaXRzLFxuICAgIHN0YXRpY0lyRGlnZXN0OiBzdGF0aWNJcj8uZGlnZXN0LFxuICB9XG5cbiAgY29uc3QgZGlnZXN0ID0gZGlnZXN0T2YoZGlnZXN0QmFzZSlcblxuICBjb25zdCBtYW5pZmVzdDogTW9kdWxlTWFuaWZlc3QgPSB7XG4gICAgbWFuaWZlc3RWZXJzaW9uLFxuICAgIG1vZHVsZUlkLFxuICAgIGFjdGlvbktleXMsXG4gICAgYWN0aW9ucyxcbiAgICBlZmZlY3RzLFxuICAgIHNjaGVtYUtleXMsXG4gICAgbG9naWNVbml0cyxcbiAgICBzb3VyY2UsXG4gICAgbWV0YSxcbiAgICBzdGF0aWNJcixcbiAgICBkaWdlc3QsXG4gIH1cblxuICBjb25zdCBtYXhCeXRlcyA9IG9wdGlvbnM/LmJ1ZGdldHM/Lm1heEJ5dGVzXG4gIGlmICh0eXBlb2YgbWF4Qnl0ZXMgPT09ICdudW1iZXInICYmIE51bWJlci5pc0Zpbml0ZShtYXhCeXRlcykgJiYgbWF4Qnl0ZXMgPiAwKSB7XG4gICAgcmV0dXJuIGFwcGx5TWF4Qnl0ZXMobWFuaWZlc3QsIG1heEJ5dGVzKVxuICB9XG5cbiAgcmV0dXJuIG1hbmlmZXN0XG59XG4iLCAiaW1wb3J0IHR5cGUgeyBUcmlhbFJ1bkFydGlmYWN0RXhwb3J0ZXIgfSBmcm9tICcuL2V4cG9ydGVyLmpzJ1xuXG5jb25zdCBBUlRJRkFDVF9FWFBPUlRFUlMgPSBTeW1ib2wuZm9yKCdsb2dpeC5tb2R1bGUudHJpYWxSdW5BcnRpZmFjdEV4cG9ydGVycycpXG5cbmV4cG9ydCBjb25zdCByZWdpc3RlclRyaWFsUnVuQXJ0aWZhY3RFeHBvcnRlciA9ICh0YWc6IHVua25vd24sIGV4cG9ydGVyOiBUcmlhbFJ1bkFydGlmYWN0RXhwb3J0ZXIpOiB2b2lkID0+IHtcbiAgaWYgKCF0YWcgfHwgKHR5cGVvZiB0YWcgIT09ICdvYmplY3QnICYmIHR5cGVvZiB0YWcgIT09ICdmdW5jdGlvbicpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdbTG9naXhdIHJlZ2lzdGVyVHJpYWxSdW5BcnRpZmFjdEV4cG9ydGVyOiBpbnZhbGlkIG1vZHVsZSB0YWcnKVxuICB9XG5cbiAgY29uc3QgY3VycmVudCA9ICgodGFnIGFzIGFueSlbQVJUSUZBQ1RfRVhQT1JURVJTXSA/PyBbXSkgYXMgdW5rbm93blxuICBjb25zdCBuZXh0ID0gQXJyYXkuaXNBcnJheShjdXJyZW50KSA/IFsuLi5jdXJyZW50LCBleHBvcnRlcl0gOiBbZXhwb3J0ZXJdXG4gIDsodGFnIGFzIGFueSlbQVJUSUZBQ1RfRVhQT1JURVJTXSA9IG5leHRcbn1cblxuZXhwb3J0IGNvbnN0IGdldFRyaWFsUnVuQXJ0aWZhY3RFeHBvcnRlcnMgPSAodGFnOiB1bmtub3duKTogUmVhZG9ubHlBcnJheTxUcmlhbFJ1bkFydGlmYWN0RXhwb3J0ZXI+ID0+IHtcbiAgaWYgKCF0YWcgfHwgKHR5cGVvZiB0YWcgIT09ICdvYmplY3QnICYmIHR5cGVvZiB0YWcgIT09ICdmdW5jdGlvbicpKSB7XG4gICAgcmV0dXJuIFtdXG4gIH1cblxuICBjb25zdCBjdXJyZW50ID0gKHRhZyBhcyBhbnkpW0FSVElGQUNUX0VYUE9SVEVSU10gYXMgdW5rbm93blxuICBpZiAoIUFycmF5LmlzQXJyYXkoY3VycmVudCkpIHJldHVybiBbXVxuICByZXR1cm4gY3VycmVudC5maWx0ZXIoKHgpOiB4IGlzIFRyaWFsUnVuQXJ0aWZhY3RFeHBvcnRlciA9PiB4ICYmIHR5cGVvZiB4ID09PSAnb2JqZWN0Jylcbn1cbiIsICJpbXBvcnQgeyBDYXVzZSwgRWZmZWN0LCBFeGl0LCBGaWJlciwgTGF5ZXIsIE9wdGlvbiB9IGZyb20gJ2VmZmVjdCdcbmltcG9ydCB0eXBlIHsgQW55TW9kdWxlU2hhcGUsIE1vZHVsZUltcGwgfSBmcm9tICcuLi9ydW50aW1lL2NvcmUvbW9kdWxlLmpzJ1xuaW1wb3J0ICogYXMgQnVpbGRFbnYgZnJvbSAnLi4vcGxhdGZvcm0vQnVpbGRFbnYuanMnXG5pbXBvcnQgdHlwZSB7IEV2aWRlbmNlUGFja2FnZSwgRXZpZGVuY2VQYWNrYWdlU291cmNlIH0gZnJvbSAnLi9ldmlkZW5jZS5qcydcbmltcG9ydCB7IG1ha2VFdmlkZW5jZUNvbGxlY3RvciwgZXZpZGVuY2VDb2xsZWN0b3JMYXllciB9IGZyb20gJy4vZXZpZGVuY2VDb2xsZWN0b3IuanMnXG5pbXBvcnQgeyBtYWtlUnVuU2Vzc2lvbiwgcnVuU2Vzc2lvbkxheWVyLCB0eXBlIFJ1bklkIH0gZnJvbSAnLi9ydW5TZXNzaW9uLmpzJ1xuaW1wb3J0IHtcbiAgYXBwZW5kU2lua3MsXG4gIGRpYWdub3N0aWNzTGV2ZWwsXG4gIHR5cGUgRGlhZ25vc3RpY3NMZXZlbCxcbiAgdHlwZSBTaW5rIGFzIERlYnVnU2luayxcbn0gZnJvbSAnLi4vcnVudGltZS9jb3JlL0RlYnVnU2luay5qcydcbmltcG9ydCB0eXBlIHsgS2VybmVsSW1wbGVtZW50YXRpb25SZWYgfSBmcm9tICcuLi9ydW50aW1lL2NvcmUvS2VybmVsUmVmLmpzJ1xuaW1wb3J0ICogYXMgS2VybmVsUmVmIGZyb20gJy4uL3J1bnRpbWUvY29yZS9LZXJuZWxSZWYuanMnXG5pbXBvcnQgKiBhcyBSdW50aW1lS2VybmVsIGZyb20gJy4uL3J1bnRpbWUvY29yZS9SdW50aW1lS2VybmVsLmpzJ1xuaW1wb3J0IHR5cGUgeyBDb252ZXJnZVN0YXRpY0lyQ29sbGVjdG9yIH0gZnJvbSAnLi4vcnVudGltZS9jb3JlL0NvbnZlcmdlU3RhdGljSXJDb2xsZWN0b3IuanMnXG5pbXBvcnQgeyBhcHBlbmRDb252ZXJnZVN0YXRpY0lyQ29sbGVjdG9ycyB9IGZyb20gJy4uL3J1bnRpbWUvY29yZS9Db252ZXJnZVN0YXRpY0lyQ29sbGVjdG9yLmpzJ1xuaW1wb3J0IHR5cGUgeyBTZXJpYWxpemFibGVFcnJvclN1bW1hcnkgfSBmcm9tICcuLi9ydW50aW1lL2NvcmUvZXJyb3JTdW1tYXJ5LmpzJ1xuaW1wb3J0IHsgdG9TZXJpYWxpemFibGVFcnJvclN1bW1hcnkgfSBmcm9tICcuLi9ydW50aW1lL2NvcmUvZXJyb3JTdW1tYXJ5LmpzJ1xuaW1wb3J0IHsgbWFrZVByb2dyYW1SdW5uZXJLZXJuZWwgfSBmcm9tICcuLi9ydW50aW1lL1Byb2dyYW1SdW5uZXIua2VybmVsLmpzJ1xuaW1wb3J0IHsgZXh0cmFjdE1hbmlmZXN0LCB0eXBlIE1vZHVsZU1hbmlmZXN0IH0gZnJvbSAnLi4vcmVmbGVjdGlvbi9tYW5pZmVzdC5qcydcbmltcG9ydCB7IGV4cG9ydFN0YXRpY0lyIH0gZnJvbSAnLi4vcmVmbGVjdGlvbi9zdGF0aWNJci5qcydcbmltcG9ydCAqIGFzIFJ1bnRpbWUgZnJvbSAnLi4vcnVudGltZS9SdW50aW1lLmpzJ1xuaW1wb3J0IHsgY29sbGVjdFRyaWFsUnVuQXJ0aWZhY3RzIH0gZnJvbSAnLi9hcnRpZmFjdHMvY29sbGVjdC5qcydcbmltcG9ydCB0eXBlIHsgVHJpYWxSdW5BcnRpZmFjdHMgfSBmcm9tICcuL2FydGlmYWN0cy9tb2RlbC5qcydcbmltcG9ydCB7IGdldFRyaWFsUnVuQXJ0aWZhY3RFeHBvcnRlcnMgfSBmcm9tICcuL2FydGlmYWN0cy9yZWdpc3RyeS5qcydcblxudHlwZSBSb290TGlrZTxTaCBleHRlbmRzIEFueU1vZHVsZVNoYXBlPiA9IE1vZHVsZUltcGw8YW55LCBTaCwgYW55PiB8IHsgcmVhZG9ubHkgaW1wbDogTW9kdWxlSW1wbDxhbnksIFNoLCBhbnk+IH1cblxuZXhwb3J0IGludGVyZmFjZSBUcmlhbFJ1blJlcG9ydEJ1ZGdldHMge1xuICByZWFkb25seSBtYXhCeXRlcz86IG51bWJlclxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFRyaWFsUnVuUmVwb3J0IHtcbiAgcmVhZG9ubHkgcnVuSWQ6IHN0cmluZ1xuICByZWFkb25seSBvazogYm9vbGVhblxuICByZWFkb25seSBtYW5pZmVzdD86IE1vZHVsZU1hbmlmZXN0XG4gIHJlYWRvbmx5IHN0YXRpY0lyPzogUmV0dXJuVHlwZTx0eXBlb2YgZXhwb3J0U3RhdGljSXI+XG4gIHJlYWRvbmx5IGFydGlmYWN0cz86IFRyaWFsUnVuQXJ0aWZhY3RzXG4gIHJlYWRvbmx5IGVudmlyb25tZW50PzogRW52aXJvbm1lbnRJclxuICByZWFkb25seSBldmlkZW5jZT86IEV2aWRlbmNlUGFja2FnZVxuICByZWFkb25seSBzdW1tYXJ5PzogdW5rbm93blxuICByZWFkb25seSBlcnJvcj86IFNlcmlhbGl6YWJsZUVycm9yU3VtbWFyeVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIEVudmlyb25tZW50SXIge1xuICByZWFkb25seSB0YWdJZHM6IFJlYWRvbmx5QXJyYXk8c3RyaW5nPlxuICByZWFkb25seSBjb25maWdLZXlzOiBSZWFkb25seUFycmF5PHN0cmluZz5cbiAgcmVhZG9ubHkgbWlzc2luZ1NlcnZpY2VzOiBSZWFkb25seUFycmF5PHN0cmluZz5cbiAgcmVhZG9ubHkgbWlzc2luZ0NvbmZpZ0tleXM6IFJlYWRvbmx5QXJyYXk8c3RyaW5nPlxuICByZWFkb25seSBrZXJuZWxJbXBsZW1lbnRhdGlvblJlZj86IEtlcm5lbEltcGxlbWVudGF0aW9uUmVmXG4gIHJlYWRvbmx5IHJ1bnRpbWVTZXJ2aWNlc0V2aWRlbmNlPzogUnVudGltZUtlcm5lbC5SdW50aW1lU2VydmljZXNFdmlkZW5jZVxuICByZWFkb25seSBub3Rlcz86IHVua25vd25cbn1cblxuZXhwb3J0IGludGVyZmFjZSBUcmlhbFJ1bk1vZHVsZU9wdGlvbnMge1xuICByZWFkb25seSBydW5JZD86IFJ1bklkXG4gIHJlYWRvbmx5IHNvdXJjZT86IEV2aWRlbmNlUGFja2FnZVNvdXJjZVxuICByZWFkb25seSBzdGFydGVkQXQ/OiBudW1iZXJcbiAgcmVhZG9ubHkgZGlhZ25vc3RpY3NMZXZlbD86IERpYWdub3N0aWNzTGV2ZWxcbiAgcmVhZG9ubHkgbWF4RXZlbnRzPzogbnVtYmVyXG4gIHJlYWRvbmx5IGxheWVyPzogTGF5ZXIuTGF5ZXI8YW55LCBhbnksIGFueT5cbiAgcmVhZG9ubHkgYnVpbGRFbnY/OiB7XG4gICAgcmVhZG9ubHkgY29uZmlnPzogUmVjb3JkPHN0cmluZywgQnVpbGRFbnYuQnVpbGRFbnZDb25maWdWYWx1ZSB8IHVuZGVmaW5lZD5cbiAgICByZWFkb25seSBob3N0S2luZD86IEJ1aWxkRW52LkJ1aWxkRW52T3B0aW9uc1sncnVudGltZUhvc3RLaW5kJ11cbiAgICByZWFkb25seSBjb25maWdQcm92aWRlcj86IEJ1aWxkRW52LkJ1aWxkRW52T3B0aW9uc1snY29uZmlnUHJvdmlkZXInXVxuICB9XG4gIHJlYWRvbmx5IHRyaWFsUnVuVGltZW91dE1zPzogbnVtYmVyXG4gIHJlYWRvbmx5IGNsb3NlU2NvcGVUaW1lb3V0PzogbnVtYmVyXG4gIHJlYWRvbmx5IGJ1ZGdldHM/OiBUcmlhbFJ1blJlcG9ydEJ1ZGdldHNcbn1cblxuY29uc3QgZGVmYXVsdEhvc3QgPSAoKTogc3RyaW5nID0+IHtcbiAgaWYgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiBkb2N1bWVudCAhPT0gJ3VuZGVmaW5lZCcpIHJldHVybiAnYnJvd3NlcidcbiAgcmV0dXJuICdub2RlJ1xufVxuXG5jb25zdCBpc1JlY29yZCA9ICh2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0+XG4gIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgdmFsdWUgIT09IG51bGwgJiYgIUFycmF5LmlzQXJyYXkodmFsdWUpXG5cbmNvbnN0IHJlc29sdmVSb290SW1wbCA9IDxTaCBleHRlbmRzIEFueU1vZHVsZVNoYXBlPihyb290OiBSb290TGlrZTxTaD4pOiBNb2R1bGVJbXBsPGFueSwgU2gsIGFueT4gPT5cbiAgKChyb290IGFzIGFueSk/Ll90YWcgPT09ICdNb2R1bGVJbXBsJ1xuICAgID8gKHJvb3QgYXMgTW9kdWxlSW1wbDxhbnksIFNoLCBhbnk+KVxuICAgIDogKChyb290IGFzIGFueSk/LmltcGwgYXMgTW9kdWxlSW1wbDxhbnksIFNoLCBhbnk+KSkgc2F0aXNmaWVzIE1vZHVsZUltcGw8YW55LCBTaCwgYW55PlxuXG5jb25zdCB1dGY4Qnl0ZUxlbmd0aCA9ICh2YWx1ZTogdW5rbm93bik6IG51bWJlciA9PiB7XG4gIGNvbnN0IGpzb24gPSBKU09OLnN0cmluZ2lmeSh2YWx1ZSlcbiAgaWYgKHR5cGVvZiBUZXh0RW5jb2RlciAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICByZXR1cm4gbmV3IFRleHRFbmNvZGVyKCkuZW5jb2RlKGpzb24pLmxlbmd0aFxuICB9XG4gIHJldHVybiBqc29uLmxlbmd0aFxufVxuXG5jb25zdCBwYXJzZU1pc3NpbmdDb25maWdLZXlzID0gKG1lc3NhZ2U6IHN0cmluZyk6IFJlYWRvbmx5QXJyYXk8c3RyaW5nPiA9PiB7XG4gIGNvbnN0IG91dDogc3RyaW5nW10gPSBbXVxuXG4gIC8vIEVmZmVjdCBDb25maWcgZXJyb3IgbWVzc2FnZXMgdmFyeTsga2VlcCBwYXJzaW5nIGNvbnNlcnZhdGl2ZSBhbmQgZGV0ZXJtaW5pc3RpYy5cbiAgY29uc3QgcGF0dGVybnM6IFJlYWRvbmx5QXJyYXk8UmVnRXhwPiA9IFtcbiAgICAvXFxiTWlzc2luZyAoPzpkYXRhfHZhbHVlKSBmb3IgKD86a2V5fHBhdGgpIFwiPyhbQS1aMC05Xy4vOi1dKylcIj8vZyxcbiAgICAvXFxiTWlzc2luZyAoPzpkYXRhfHZhbHVlKSBhdCAoW0EtWjAtOV8uLzotXSspXFxiL2csXG4gICAgL1xcYk1pc3NpbmcgY29uZmlndXJhdGlvbjo/IFwiPyhbQS1aMC05Xy4vOi1dKylcIj8vZyxcbiAgICAvXFxiQ29uZmlnXFxiLipcXGJtaXNzaW5nXFxiLipcIj8oW0EtWjAtOV8uLzotXSspXCI/L2dpLFxuICBdXG5cbiAgZm9yIChjb25zdCByZSBvZiBwYXR0ZXJucykge1xuICAgIGxldCBtYXRjaDogUmVnRXhwRXhlY0FycmF5IHwgbnVsbFxuICAgIHdoaWxlICgobWF0Y2ggPSByZS5leGVjKG1lc3NhZ2UpKSkge1xuICAgICAgY29uc3Qga2V5ID0gbWF0Y2hbMV1cbiAgICAgIGlmICh0eXBlb2Yga2V5ID09PSAnc3RyaW5nJyAmJiBrZXkubGVuZ3RoID4gMCkgb3V0LnB1c2goa2V5KVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBBcnJheS5mcm9tKG5ldyBTZXQob3V0KSkuc29ydCgoYSwgYikgPT4gYS5sb2NhbGVDb21wYXJlKGIpKVxufVxuXG5jb25zdCBwYXJzZU1pc3NpbmdTZXJ2aWNlSWRzID0gKG1lc3NhZ2U6IHN0cmluZyk6IFJlYWRvbmx5QXJyYXk8c3RyaW5nPiA9PiB7XG4gIGNvbnN0IG91dDogc3RyaW5nW10gPSBbXVxuICBjb25zdCByZSA9IC9TZXJ2aWNlIG5vdCBmb3VuZDogKFteXFxzKF0rKS9nXG4gIGxldCBtYXRjaDogUmVnRXhwRXhlY0FycmF5IHwgbnVsbFxuICB3aGlsZSAoKG1hdGNoID0gcmUuZXhlYyhtZXNzYWdlKSkpIHtcbiAgICBjb25zdCBpZCA9IG1hdGNoWzFdPy5yZXBsYWNlKC9bLDouO10rJC8sICcnKVxuICAgIGlmICh0eXBlb2YgaWQgPT09ICdzdHJpbmcnICYmIGlkLmxlbmd0aCA+IDApIG91dC5wdXNoKGlkKVxuICB9XG4gIHJldHVybiBBcnJheS5mcm9tKG5ldyBTZXQob3V0KSkuc29ydCgoYSwgYikgPT4gYS5sb2NhbGVDb21wYXJlKGIpKVxufVxuXG5jb25zdCBwYXJzZU1pc3NpbmdEZXBlbmRlbmN5RnJvbUNhdXNlID0gKFxuICBjYXVzZTogQ2F1c2UuQ2F1c2U8dW5rbm93bj4sXG4pOiB7XG4gIHJlYWRvbmx5IG1pc3NpbmdTZXJ2aWNlczogUmVhZG9ubHlBcnJheTxzdHJpbmc+XG4gIHJlYWRvbmx5IG1pc3NpbmdDb25maWdLZXlzOiBSZWFkb25seUFycmF5PHN0cmluZz5cbn0gPT4ge1xuICBjb25zdCBtaXNzaW5nU2VydmljZXM6IHN0cmluZ1tdID0gW11cbiAgY29uc3QgbWlzc2luZ0NvbmZpZ0tleXM6IHN0cmluZ1tdID0gW11cblxuICBjb25zdCBjYW5kaWRhdGVzID0gWy4uLkFycmF5LmZyb20oQ2F1c2UuZmFpbHVyZXMoY2F1c2UpKSwgLi4uQXJyYXkuZnJvbShDYXVzZS5kZWZlY3RzKGNhdXNlKSldXG5cbiAgZm9yIChjb25zdCBjYW5kaWRhdGUgb2YgY2FuZGlkYXRlcykge1xuICAgIGlmIChpc1JlY29yZChjYW5kaWRhdGUpICYmIChjYW5kaWRhdGUgYXMgYW55KS5fdGFnID09PSAnQ29uc3RydWN0aW9uR3VhcmRFcnJvcicpIHtcbiAgICAgIGNvbnN0IG1pc3NpbmdTZXJ2aWNlID0gKGNhbmRpZGF0ZSBhcyBhbnkpLm1pc3NpbmdTZXJ2aWNlXG4gICAgICBpZiAodHlwZW9mIG1pc3NpbmdTZXJ2aWNlID09PSAnc3RyaW5nJyAmJiBtaXNzaW5nU2VydmljZS5sZW5ndGggPiAwKSB7XG4gICAgICAgIG1pc3NpbmdTZXJ2aWNlcy5wdXNoKG1pc3NpbmdTZXJ2aWNlKVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChcbiAgICAgIGlzUmVjb3JkKGNhbmRpZGF0ZSkgJiZcbiAgICAgIChjYW5kaWRhdGUgYXMgYW55KS5fdGFnID09PSAnQ29uZmlnRXJyb3InICYmXG4gICAgICAoY2FuZGlkYXRlIGFzIGFueSkuX29wID09PSAnTWlzc2luZ0RhdGEnICYmXG4gICAgICBBcnJheS5pc0FycmF5KChjYW5kaWRhdGUgYXMgYW55KS5wYXRoKSAmJlxuICAgICAgKGNhbmRpZGF0ZSBhcyBhbnkpLnBhdGguZXZlcnkoKGs6IHVua25vd24pID0+IHR5cGVvZiBrID09PSAnc3RyaW5nJyAmJiBrLmxlbmd0aCA+IDApXG4gICAgKSB7XG4gICAgICBjb25zdCBrZXkgPSAoY2FuZGlkYXRlIGFzIGFueSkucGF0aC5qb2luKCcuJylcbiAgICAgIGlmIChrZXkubGVuZ3RoID4gMCkgbWlzc2luZ0NvbmZpZ0tleXMucHVzaChrZXkpXG4gICAgfVxuICB9XG5cbiAgY29uc3QgbWVzc2FnZXM6IHN0cmluZ1tdID0gW11cbiAgZm9yIChjb25zdCBjYW5kaWRhdGUgb2YgY2FuZGlkYXRlcykge1xuICAgIGlmIChjYW5kaWRhdGUgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgbWVzc2FnZXMucHVzaChjYW5kaWRhdGUubWVzc2FnZSlcbiAgICAgIGNvbnRpbnVlXG4gICAgfVxuICAgIGlmICh0eXBlb2YgY2FuZGlkYXRlID09PSAnc3RyaW5nJykge1xuICAgICAgbWVzc2FnZXMucHVzaChjYW5kaWRhdGUpXG4gICAgICBjb250aW51ZVxuICAgIH1cbiAgICBpZiAoaXNSZWNvcmQoY2FuZGlkYXRlKSAmJiB0eXBlb2YgKGNhbmRpZGF0ZSBhcyBhbnkpLm1lc3NhZ2UgPT09ICdzdHJpbmcnKSB7XG4gICAgICBtZXNzYWdlcy5wdXNoKFN0cmluZygoY2FuZGlkYXRlIGFzIGFueSkubWVzc2FnZSkpXG4gICAgfVxuICB9XG5cbiAgdHJ5IHtcbiAgICBtZXNzYWdlcy5wdXNoKENhdXNlLnByZXR0eShjYXVzZSwgeyByZW5kZXJFcnJvckNhdXNlOiB0cnVlIH0pKVxuICB9IGNhdGNoIHtcbiAgICAvLyBpZ25vcmVcbiAgfVxuXG4gIGNvbnN0IG1lcmdlZCA9IG1lc3NhZ2VzLmZpbHRlcigocykgPT4gcy5sZW5ndGggPiAwKS5qb2luKCdcXG4nKVxuXG4gIGlmIChtZXJnZWQpIHtcbiAgICBtaXNzaW5nU2VydmljZXMucHVzaCguLi5wYXJzZU1pc3NpbmdTZXJ2aWNlSWRzKG1lcmdlZCkpXG4gICAgbWlzc2luZ0NvbmZpZ0tleXMucHVzaCguLi5wYXJzZU1pc3NpbmdDb25maWdLZXlzKG1lcmdlZCkpXG4gIH1cblxuICByZXR1cm4ge1xuICAgIG1pc3NpbmdTZXJ2aWNlczogQXJyYXkuZnJvbShuZXcgU2V0KG1pc3NpbmdTZXJ2aWNlcykpLnNvcnQoKGEsIGIpID0+IGEubG9jYWxlQ29tcGFyZShiKSksXG4gICAgbWlzc2luZ0NvbmZpZ0tleXM6IEFycmF5LmZyb20obmV3IFNldChtaXNzaW5nQ29uZmlnS2V5cykpLnNvcnQoKGEsIGIpID0+IGEubG9jYWxlQ29tcGFyZShiKSksXG4gIH1cbn1cblxuY29uc3QgYnVpbGRFbnZpcm9ubWVudElyID0gKHBhcmFtczoge1xuICByZWFkb25seSBrZXJuZWxJbXBsZW1lbnRhdGlvblJlZj86IEtlcm5lbEltcGxlbWVudGF0aW9uUmVmXG4gIHJlYWRvbmx5IHJ1bnRpbWVTZXJ2aWNlc0V2aWRlbmNlPzogUnVudGltZUtlcm5lbC5SdW50aW1lU2VydmljZXNFdmlkZW5jZVxuICByZWFkb25seSBidWlsZEVudkNvbmZpZz86IFJlY29yZDxzdHJpbmcsIEJ1aWxkRW52LkJ1aWxkRW52Q29uZmlnVmFsdWUgfCB1bmRlZmluZWQ+XG4gIHJlYWRvbmx5IG1pc3NpbmdTZXJ2aWNlcz86IFJlYWRvbmx5QXJyYXk8c3RyaW5nPlxuICByZWFkb25seSBtaXNzaW5nQ29uZmlnS2V5cz86IFJlYWRvbmx5QXJyYXk8c3RyaW5nPlxufSk6IEVudmlyb25tZW50SXIgPT4ge1xuICBjb25zdCBwcm92aWRlZENvbmZpZ0tleXMgPSBPYmplY3Qua2V5cyhwYXJhbXMuYnVpbGRFbnZDb25maWcgPz8ge30pXG4gICAgLmZpbHRlcigoaykgPT4gay5sZW5ndGggPiAwICYmIChwYXJhbXMuYnVpbGRFbnZDb25maWcgYXMgYW55KVtrXSAhPT0gdW5kZWZpbmVkKVxuICAgIC5zb3J0KChhLCBiKSA9PiBhLmxvY2FsZUNvbXBhcmUoYikpXG5cbiAgY29uc3QgbWlzc2luZ1NlcnZpY2VzID0gQXJyYXkuZnJvbShuZXcgU2V0KHBhcmFtcy5taXNzaW5nU2VydmljZXMgPz8gW10pKS5zb3J0KChhLCBiKSA9PiBhLmxvY2FsZUNvbXBhcmUoYikpXG4gIGNvbnN0IG1pc3NpbmdDb25maWdLZXlzID0gQXJyYXkuZnJvbShuZXcgU2V0KHBhcmFtcy5taXNzaW5nQ29uZmlnS2V5cyA/PyBbXSkpLnNvcnQoKGEsIGIpID0+IGEubG9jYWxlQ29tcGFyZShiKSlcblxuICBjb25zdCBydW50aW1lU2VydmljZUlkcyA9XG4gICAgcGFyYW1zLnJ1bnRpbWVTZXJ2aWNlc0V2aWRlbmNlPy5iaW5kaW5ncz8ubWFwKChiKSA9PiBiLnNlcnZpY2VJZCkuZmlsdGVyKChzKSA9PiB0eXBlb2YgcyA9PT0gJ3N0cmluZycpID8/IFtdXG5cbiAgY29uc3QgdGFnSWRzID0gQXJyYXkuZnJvbShuZXcgU2V0KFsuLi5ydW50aW1lU2VydmljZUlkcywgLi4ubWlzc2luZ1NlcnZpY2VzXSkpLnNvcnQoKGEsIGIpID0+IGEubG9jYWxlQ29tcGFyZShiKSlcblxuICBjb25zdCBjb25maWdLZXlzID0gQXJyYXkuZnJvbShuZXcgU2V0KFsuLi5wcm92aWRlZENvbmZpZ0tleXMsIC4uLm1pc3NpbmdDb25maWdLZXlzXSkpLnNvcnQoKGEsIGIpID0+XG4gICAgYS5sb2NhbGVDb21wYXJlKGIpLFxuICApXG5cbiAgcmV0dXJuIHtcbiAgICB0YWdJZHMsXG4gICAgY29uZmlnS2V5cyxcbiAgICBtaXNzaW5nU2VydmljZXMsXG4gICAgbWlzc2luZ0NvbmZpZ0tleXMsXG4gICAga2VybmVsSW1wbGVtZW50YXRpb25SZWY6IHBhcmFtcy5rZXJuZWxJbXBsZW1lbnRhdGlvblJlZixcbiAgICBydW50aW1lU2VydmljZXNFdmlkZW5jZTogcGFyYW1zLnJ1bnRpbWVTZXJ2aWNlc0V2aWRlbmNlLFxuICB9XG59XG5cbmNvbnN0IHRvRXJyb3JTdW1tYXJ5V2l0aENvZGUgPSAoY2F1c2U6IHVua25vd24sIGNvZGU6IHN0cmluZywgaGludD86IHN0cmluZyk6IFNlcmlhbGl6YWJsZUVycm9yU3VtbWFyeSA9PiB7XG4gIGNvbnN0IGJhc2UgPSB0b1NlcmlhbGl6YWJsZUVycm9yU3VtbWFyeShjYXVzZSkuZXJyb3JTdW1tYXJ5XG4gIHJldHVybiB7XG4gICAgbmFtZTogYmFzZS5uYW1lLFxuICAgIG1lc3NhZ2U6IGJhc2UubWVzc2FnZSxcbiAgICBjb2RlLFxuICAgIGhpbnQ6IGhpbnQgPz8gYmFzZS5oaW50LFxuICB9XG59XG5cbmNvbnN0IG1ha2VUcmlhbFJ1blRpbWVvdXRFcnJvciA9ICgpOiBFcnJvciA9PlxuICBPYmplY3QuYXNzaWduKG5ldyBFcnJvcignW0xvZ2l4XSB0cmlhbFJ1bk1vZHVsZSB0aW1lZCBvdXQnKSwge1xuICAgIG5hbWU6ICdUcmlhbFJ1blRpbWVvdXRFcnJvcicsXG4gIH0pXG5cbmNvbnN0IGF3YWl0RmliZXJFeGl0V2l0aFRpbWVvdXQgPSA8QSwgRT4oXG4gIGZpYmVyOiBGaWJlci5GaWJlcjxBLCBFPixcbiAgdGltZW91dE1zOiBudW1iZXIgfCB1bmRlZmluZWQsXG4pOiBFZmZlY3QuRWZmZWN0PEV4aXQuRXhpdDxBLCBFIHwgRXJyb3I+LCBuZXZlciwgbmV2ZXI+ID0+XG4gIEVmZmVjdC5nZW4oZnVuY3Rpb24qICgpIHtcbiAgICBjb25zdCBoYXNUaW1lb3V0ID0gdHlwZW9mIHRpbWVvdXRNcyA9PT0gJ251bWJlcicgJiYgTnVtYmVyLmlzRmluaXRlKHRpbWVvdXRNcykgJiYgdGltZW91dE1zID4gMFxuICAgIGNvbnN0IHN0YXJ0ID0gaGFzVGltZW91dCA/IERhdGUubm93KCkgOiAwXG5cbiAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgY29uc3QgZXhpdE9wdCA9IHlpZWxkKiBGaWJlci5wb2xsKGZpYmVyKVxuICAgICAgaWYgKE9wdGlvbi5pc1NvbWUoZXhpdE9wdCkpIHtcbiAgICAgICAgcmV0dXJuIGV4aXRPcHQudmFsdWUgYXMgRXhpdC5FeGl0PEEsIEUgfCBFcnJvcj5cbiAgICAgIH1cblxuICAgICAgaWYgKGhhc1RpbWVvdXQpIHtcbiAgICAgICAgY29uc3QgZWxhcHNlZE1zID0gRGF0ZS5ub3coKSAtIHN0YXJ0XG4gICAgICAgIGlmIChlbGFwc2VkTXMgPj0gdGltZW91dE1zKSB7XG4gICAgICAgICAgeWllbGQqIEZpYmVyLmludGVycnVwdEZvcmsoZmliZXIpXG4gICAgICAgICAgcmV0dXJuIEV4aXQuZmFpbChtYWtlVHJpYWxSdW5UaW1lb3V0RXJyb3IoKSlcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBOT1RFOiB0aW1lciB5aWVsZCAobm90IFRlc3RDbG9jay1iYXNlZClcbiAgICAgIHlpZWxkKiBFZmZlY3QucHJvbWlzZSgoKSA9PiBuZXcgUHJvbWlzZTx2b2lkPigocikgPT4gc2V0VGltZW91dChyLCAxKSkpXG4gICAgfVxuICB9KVxuXG5leHBvcnQgY29uc3QgdHJpYWxSdW5Nb2R1bGUgPSA8U2ggZXh0ZW5kcyBBbnlNb2R1bGVTaGFwZT4oXG4gIHJvb3Q6IFJvb3RMaWtlPFNoPixcbiAgb3B0aW9ucz86IFRyaWFsUnVuTW9kdWxlT3B0aW9ucyxcbik6IEVmZmVjdC5FZmZlY3Q8VHJpYWxSdW5SZXBvcnQsIG5ldmVyLCBuZXZlcj4gPT5cbiAgRWZmZWN0LmdlbihmdW5jdGlvbiogKCkge1xuICAgIGNvbnN0IHJvb3RJbXBsID0gcmVzb2x2ZVJvb3RJbXBsKHJvb3QpXG5cbiAgICBjb25zdCBzZXNzaW9uID0gbWFrZVJ1blNlc3Npb24oe1xuICAgICAgcnVuSWQ6IG9wdGlvbnM/LnJ1bklkLFxuICAgICAgc291cmNlOiBvcHRpb25zPy5zb3VyY2UgPz8geyBob3N0OiBkZWZhdWx0SG9zdCgpLCBsYWJlbDogJ3RyaWFsLXJ1bi1tb2R1bGUnIH0sXG4gICAgICBzdGFydGVkQXQ6IG9wdGlvbnM/LnN0YXJ0ZWRBdCxcbiAgICB9KVxuXG4gICAgY29uc3QgY29sbGVjdG9yID0gbWFrZUV2aWRlbmNlQ29sbGVjdG9yKHNlc3Npb24pXG5cbiAgICBjb25zdCBjb252ZXJnZUNvbGxlY3RvcjogQ29udmVyZ2VTdGF0aWNJckNvbGxlY3RvciA9IHtcbiAgICAgIHJlZ2lzdGVyOiAoaXIpID0+IHtcbiAgICAgICAgY29sbGVjdG9yLnJlZ2lzdGVyQ29udmVyZ2VTdGF0aWNJcihpcilcbiAgICAgIH0sXG4gICAgfVxuXG4gICAgY29uc3Qgc2lua3NMYXllciA9IGFwcGVuZFNpbmtzKFtjb2xsZWN0b3IuZGVidWdTaW5rIGFzIHVua25vd24gYXMgRGVidWdTaW5rXSlcbiAgICBjb25zdCByZXNvbHZlZERpYWdub3N0aWNzTGV2ZWwgPSBvcHRpb25zPy5kaWFnbm9zdGljc0xldmVsID8/ICdsaWdodCdcbiAgICBjb25zdCBkaWFnbm9zdGljc0xheWVyID0gZGlhZ25vc3RpY3NMZXZlbChyZXNvbHZlZERpYWdub3N0aWNzTGV2ZWwpXG4gICAgY29uc3QgY29udmVyZ2VMYXllciA9IGFwcGVuZENvbnZlcmdlU3RhdGljSXJDb2xsZWN0b3JzKFtjb252ZXJnZUNvbGxlY3Rvcl0pXG4gICAgY29uc3QgY29sbGVjdG9yTGF5ZXIgPSBldmlkZW5jZUNvbGxlY3RvckxheWVyKGNvbGxlY3RvcilcbiAgICBjb25zdCBzZXNzaW9uTGF5ZXIgPSBydW5TZXNzaW9uTGF5ZXIoc2Vzc2lvbilcblxuICAgIGNvbnN0IGJ1aWxkRW52Q29uZmlnID0gb3B0aW9ucz8uYnVpbGRFbnY/LmNvbmZpZ1xuICAgIGNvbnN0IGJ1aWxkRW52TGF5ZXIgPSBCdWlsZEVudi5sYXllcih7XG4gICAgICBydW50aW1lSG9zdEtpbmQ6IG9wdGlvbnM/LmJ1aWxkRW52Py5ob3N0S2luZCxcbiAgICAgIGNvbmZpZzogYnVpbGRFbnZDb25maWcsXG4gICAgICBjb25maWdQcm92aWRlcjogb3B0aW9ucz8uYnVpbGRFbnY/LmNvbmZpZ1Byb3ZpZGVyLFxuICAgIH0pXG5cbiAgICBjb25zdCB0cmlhbExheWVyID0gTGF5ZXIubWVyZ2VBbGwoXG4gICAgICBidWlsZEVudkxheWVyLFxuICAgICAgb3B0aW9ucz8ubGF5ZXIgPz8gKExheWVyLmVtcHR5IGFzIHVua25vd24gYXMgTGF5ZXIuTGF5ZXI8YW55LCBhbnksIGFueT4pLFxuICAgICAgc2Vzc2lvbkxheWVyLFxuICAgICAgY29sbGVjdG9yTGF5ZXIsXG4gICAgICBkaWFnbm9zdGljc0xheWVyLFxuICAgICAgc2lua3NMYXllcixcbiAgICAgIGNvbnZlcmdlTGF5ZXIsXG4gICAgKSBhcyBMYXllci5MYXllcjxhbnksIG5ldmVyLCBuZXZlcj5cblxuICAgIGNvbnN0IGtlcm5lbCA9IHlpZWxkKiBtYWtlUHJvZ3JhbVJ1bm5lcktlcm5lbChcbiAgICAgIChpbXBsKSA9PlxuICAgICAgICBSdW50aW1lLm1ha2UoaW1wbCwge1xuICAgICAgICAgIGxheWVyOiB0cmlhbExheWVyIGFzIGFueSxcbiAgICAgICAgICAvLyB0cmlhbC1ydW4gZG9lcyBub3QgZW5hYmxlIGRldnRvb2xzIGJ5IGRlZmF1bHQ7IGRpYWdub3N0aWNzIGlzIGNvbnRyb2xsZWQgYnkgZGlhZ25vc3RpY3NMZXZlbC5cbiAgICAgICAgfSBhcyBhbnkpLFxuICAgICAgcm9vdEltcGwsXG4gICAgKVxuXG4gICAgY29uc3QgaWRlbnRpdHkgPSBrZXJuZWwuaWRlbnRpdHlcblxuICAgIGNvbnN0IGJvb3RGaWJlciA9IGtlcm5lbC5ydW50aW1lLnJ1bkZvcmsocm9vdEltcGwubW9kdWxlIGFzIGFueSlcbiAgICBjb25zdCBib290RXhpdCA9IHlpZWxkKiBhd2FpdEZpYmVyRXhpdFdpdGhUaW1lb3V0KGJvb3RGaWJlciwgb3B0aW9ucz8udHJpYWxSdW5UaW1lb3V0TXMpXG5cbiAgICBsZXQga2VybmVsSW1wbGVtZW50YXRpb25SZWY6IEtlcm5lbEltcGxlbWVudGF0aW9uUmVmIHwgdW5kZWZpbmVkXG4gICAgbGV0IHJ1bnRpbWVTZXJ2aWNlc0V2aWRlbmNlOiBSdW50aW1lS2VybmVsLlJ1bnRpbWVTZXJ2aWNlc0V2aWRlbmNlIHwgdW5kZWZpbmVkXG4gICAgbGV0IGluc3RhbmNlSWQ6IHN0cmluZyB8IHVuZGVmaW5lZFxuXG4gICAgaWYgKEV4aXQuaXNTdWNjZXNzKGJvb3RFeGl0KSkge1xuICAgICAgY29uc3QgbW9kdWxlUnVudGltZSA9IGJvb3RFeGl0LnZhbHVlIGFzIGFueVxuICAgICAgaW5zdGFuY2VJZCA9XG4gICAgICAgIHR5cGVvZiBtb2R1bGVSdW50aW1lPy5pbnN0YW5jZUlkID09PSAnc3RyaW5nJyAmJiBtb2R1bGVSdW50aW1lLmluc3RhbmNlSWQubGVuZ3RoID4gMFxuICAgICAgICAgID8gbW9kdWxlUnVudGltZS5pbnN0YW5jZUlkXG4gICAgICAgICAgOiB1bmRlZmluZWRcbiAgICAgIGtlcm5lbC5zZXRJbnN0YW5jZUlkKGluc3RhbmNlSWQpXG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGtlcm5lbEltcGxlbWVudGF0aW9uUmVmID0gS2VybmVsUmVmLmdldEtlcm5lbEltcGxlbWVudGF0aW9uUmVmKG1vZHVsZVJ1bnRpbWUpXG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAga2VybmVsSW1wbGVtZW50YXRpb25SZWYgPSB1bmRlZmluZWRcbiAgICAgIH1cblxuICAgICAgaWYgKHJlc29sdmVkRGlhZ25vc3RpY3NMZXZlbCAhPT0gJ29mZicpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBydW50aW1lU2VydmljZXNFdmlkZW5jZSA9IFJ1bnRpbWVLZXJuZWwuZ2V0UnVudGltZVNlcnZpY2VzRXZpZGVuY2UobW9kdWxlUnVudGltZSlcbiAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgcnVudGltZVNlcnZpY2VzRXZpZGVuY2UgPSB1bmRlZmluZWRcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBmYWlsdXJlID0gQ2F1c2UuZmFpbHVyZU9wdGlvbihib290RXhpdC5jYXVzZSlcbiAgICAgIGlmIChPcHRpb24uaXNTb21lKGZhaWx1cmUpKSB7XG4gICAgICAgIGNvbnN0IGVycjogYW55ID0gZmFpbHVyZS52YWx1ZVxuICAgICAgICBjb25zdCBpbnN0YW5jZUlkRnJvbUVyciA9IHR5cGVvZiBlcnI/Lmluc3RhbmNlSWQgPT09ICdzdHJpbmcnID8gZXJyLmluc3RhbmNlSWQgOiB1bmRlZmluZWRcbiAgICAgICAgaWYgKGluc3RhbmNlSWRGcm9tRXJyICYmIGluc3RhbmNlSWRGcm9tRXJyLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBrZXJuZWwuc2V0SW5zdGFuY2VJZChpbnN0YW5jZUlkRnJvbUVycilcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGNsb3NlRXhpdCA9IHlpZWxkKiBFZmZlY3QuZXhpdChcbiAgICAgIGtlcm5lbC5jbG9zZSh7XG4gICAgICAgIHRpbWVvdXRNczpcbiAgICAgICAgICB0eXBlb2Ygb3B0aW9ucz8uY2xvc2VTY29wZVRpbWVvdXQgPT09ICdudW1iZXInICYmXG4gICAgICAgICAgTnVtYmVyLmlzRmluaXRlKG9wdGlvbnMuY2xvc2VTY29wZVRpbWVvdXQpICYmXG4gICAgICAgICAgb3B0aW9ucy5jbG9zZVNjb3BlVGltZW91dCA+IDBcbiAgICAgICAgICAgID8gb3B0aW9ucy5jbG9zZVNjb3BlVGltZW91dFxuICAgICAgICAgICAgOiAxMDAwLFxuICAgICAgfSksXG4gICAgKVxuXG4gICAgY29uc3QgZXZpZGVuY2UgPSBjb2xsZWN0b3IuZXhwb3J0RXZpZGVuY2VQYWNrYWdlKHtcbiAgICAgIG1heEV2ZW50czogb3B0aW9ucz8ubWF4RXZlbnRzID8/IDEwMDAsXG4gICAgfSlcblxuICAgIGNvbnN0IG1hbmlmZXN0ID0gKCgpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBleHRyYWN0TWFuaWZlc3Qocm9vdCBhcyBhbnksIHtcbiAgICAgICAgICBpbmNsdWRlU3RhdGljSXI6IHRydWUsXG4gICAgICAgICAgYnVkZ2V0czogeyBtYXhCeXRlczogMjAwXzAwMCB9LFxuICAgICAgICB9KVxuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWRcbiAgICAgIH1cbiAgICB9KSgpXG5cbiAgICBjb25zdCBzdGF0aWNJciA9ICgoKSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gZXhwb3J0U3RhdGljSXIocm9vdCBhcyBhbnkpXG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZFxuICAgICAgfVxuICAgIH0pKClcblxuICAgIGxldCBvayA9IEV4aXQuaXNTdWNjZXNzKGJvb3RFeGl0KSAmJiBFeGl0LmlzU3VjY2VzcyhjbG9zZUV4aXQpXG4gICAgbGV0IGVycm9yOiBTZXJpYWxpemFibGVFcnJvclN1bW1hcnkgfCB1bmRlZmluZWRcbiAgICBsZXQgc3VtbWFyeTogdW5rbm93biB8IHVuZGVmaW5lZFxuXG4gICAgY29uc3QgZGVwc0Zyb21Cb290RmFpbHVyZSA9IEV4aXQuaXNGYWlsdXJlKGJvb3RFeGl0KVxuICAgICAgPyBwYXJzZU1pc3NpbmdEZXBlbmRlbmN5RnJvbUNhdXNlKGJvb3RFeGl0LmNhdXNlIGFzIENhdXNlLkNhdXNlPHVua25vd24+KVxuICAgICAgOiB7IG1pc3NpbmdTZXJ2aWNlczogW10sIG1pc3NpbmdDb25maWdLZXlzOiBbXSB9XG5cbiAgICBjb25zdCBtaXNzaW5nU2VydmljZXMgPSBkZXBzRnJvbUJvb3RGYWlsdXJlLm1pc3NpbmdTZXJ2aWNlc1xuICAgIGNvbnN0IG1pc3NpbmdDb25maWdLZXlzID0gZGVwc0Zyb21Cb290RmFpbHVyZS5taXNzaW5nQ29uZmlnS2V5c1xuXG4gICAgY29uc3QgY2xvc2VFcnJvciA9IEV4aXQuaXNGYWlsdXJlKGNsb3NlRXhpdCkgPyBPcHRpb24uZ2V0T3JVbmRlZmluZWQoQ2F1c2UuZGllT3B0aW9uKGNsb3NlRXhpdC5jYXVzZSkpIDogdW5kZWZpbmVkXG5cbiAgICBpZiAoIUV4aXQuaXNTdWNjZXNzKGJvb3RFeGl0KSkge1xuICAgICAgY29uc3QgZmFpbHVyZSA9IE9wdGlvbi5nZXRPclVuZGVmaW5lZChDYXVzZS5mYWlsdXJlT3B0aW9uKGJvb3RFeGl0LmNhdXNlKSlcbiAgICAgIGNvbnN0IGRlZmVjdCA9IE9wdGlvbi5nZXRPclVuZGVmaW5lZChDYXVzZS5kaWVPcHRpb24oYm9vdEV4aXQuY2F1c2UpKVxuICAgICAgY29uc3QgYmFzZSA9IGZhaWx1cmUgPz8gZGVmZWN0ID8/IGJvb3RFeGl0LmNhdXNlXG5cbiAgICAgIGlmIChtaXNzaW5nU2VydmljZXMubGVuZ3RoID4gMCB8fCBtaXNzaW5nQ29uZmlnS2V5cy5sZW5ndGggPiAwKSB7XG4gICAgICAgIG9rID0gZmFsc2VcbiAgICAgICAgZXJyb3IgPSB0b0Vycm9yU3VtbWFyeVdpdGhDb2RlKFxuICAgICAgICAgIGJhc2UsXG4gICAgICAgICAgJ01pc3NpbmdEZXBlbmRlbmN5JyxcbiAgICAgICAgICBtaXNzaW5nU2VydmljZXMubGVuZ3RoID4gMFxuICAgICAgICAgICAgPyAnQnVpbGQtdGltZSBtaXNzaW5nIHNlcnZpY2U6IHByb3ZpZGUgYSBMYXllciBtb2NrL2ltcGxlbWVudGF0aW9uIHZpYSBvcHRpb25zLmxheWVyLCBvciBtb3ZlIHRoZSBkZXBlbmRlbmN5IGFjY2VzcyB0byBydW50aW1lLidcbiAgICAgICAgICAgIDogJ0J1aWxkLXRpbWUgbWlzc2luZyBjb25maWc6IHByb3ZpZGUgdGhlIG1pc3Npbmcga2V5KHMpIGluIGJ1aWxkRW52LmNvbmZpZywgb3IgYWRkIGEgZGVmYXVsdCB2YWx1ZSB0byBDb25maWcuJyxcbiAgICAgICAgKVxuICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgaXNSZWNvcmQoYmFzZSkgJiZcbiAgICAgICAgKChiYXNlIGFzIGFueSkubmFtZSA9PT0gJ1RyaWFsUnVuVGltZW91dEVycm9yJyB8fCAoYmFzZSBhcyBhbnkpLl90YWcgPT09ICdUcmlhbFJ1blRpbWVvdXQnKVxuICAgICAgKSB7XG4gICAgICAgIG9rID0gZmFsc2VcbiAgICAgICAgZXJyb3IgPSB0b0Vycm9yU3VtbWFyeVdpdGhDb2RlKFxuICAgICAgICAgIGJhc2UsXG4gICAgICAgICAgJ1RyaWFsUnVuVGltZW91dCcsXG4gICAgICAgICAgJ1RyaWFsIHJ1biB0aW1lZCBvdXQ6IGNoZWNrIGZvciBMYXllci9hc3NlbWJseSBwaGFzZSBibG9ja2luZyAoRWZmZWN0Lm5ldmVyIC8gdW5maW5pc2hlZCBhY3F1aXJlKS4nLFxuICAgICAgICApXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBvayA9IGZhbHNlXG4gICAgICAgIGVycm9yID0gdG9FcnJvclN1bW1hcnlXaXRoQ29kZShiYXNlLCAnUnVudGltZUZhaWx1cmUnKVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChFeGl0LmlzRmFpbHVyZShjbG9zZUV4aXQpKSB7XG4gICAgICBjb25zdCBkaWVkID0gT3B0aW9uLmdldE9yVW5kZWZpbmVkKENhdXNlLmRpZU9wdGlvbihjbG9zZUV4aXQuY2F1c2UpKVxuICAgICAgY29uc3QgZmFpbHVyZSA9IE9wdGlvbi5nZXRPclVuZGVmaW5lZChDYXVzZS5mYWlsdXJlT3B0aW9uKGNsb3NlRXhpdC5jYXVzZSkpXG4gICAgICBjb25zdCBiYXNlID0gZGllZCA/PyBmYWlsdXJlID8/IGNsb3NlRXhpdC5jYXVzZVxuXG4gICAgICBjb25zdCBjbG9zZUVycm9yU3VtbWFyeSA9ICgoKSA9PiB7XG4gICAgICAgIGNvbnN0IHRhZyA9IGlzUmVjb3JkKGJhc2UpID8gKGJhc2UgYXMgYW55KS5fdGFnIDogdW5kZWZpbmVkXG4gICAgICAgIGlmICh0YWcgPT09ICdEaXNwb3NlVGltZW91dCcpIHtcbiAgICAgICAgICByZXR1cm4gdG9FcnJvclN1bW1hcnlXaXRoQ29kZShcbiAgICAgICAgICAgIGJhc2UsXG4gICAgICAgICAgICAnRGlzcG9zZVRpbWVvdXQnLFxuICAgICAgICAgICAgJ0Rpc3Bvc2UgdGltZWQgb3V0OiBjaGVjayBmb3IgdW5jbG9zZWQgcmVzb3VyY2UgaGFuZGxlcywgZmliZXJzIG5vdCBpbnRlcnJ1cHRlZCwgb3IgZXZlbnQgbGlzdGVuZXJzIG5vdCB1bnJlZ2lzdGVyZWQuJyxcbiAgICAgICAgICApXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRvRXJyb3JTdW1tYXJ5V2l0aENvZGUoYmFzZSwgJ1J1bnRpbWVGYWlsdXJlJylcbiAgICAgIH0pKClcblxuICAgICAgb2sgPSBmYWxzZVxuICAgICAgaWYgKCFlcnJvcikge1xuICAgICAgICAvLyBJZiBib290IHN1Y2NlZWRlZCBidXQgZGlzcG9zZSBmYWlsZWQsIHRoZSBjbG9zZSBlcnJvciBpcyB0aGUgcHJpbWFyeSBmYWlsdXJlLlxuICAgICAgICBlcnJvciA9IGNsb3NlRXJyb3JTdW1tYXJ5XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBQcmVzZXJ2ZSB0aGUgcHJpbWFyeSBib290IGZhaWx1cmUgKGUuZy4gVHJpYWxSdW5UaW1lb3V0KSBidXQga2VlcCBkaXNwb3NlIGZhaWx1cmUgZXZpZGVuY2UuXG4gICAgICAgIHN1bW1hcnkgPSB7IF9fbG9naXg6IHsgY2xvc2VFcnJvcjogY2xvc2VFcnJvclN1bW1hcnkgfSB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgZW52aXJvbm1lbnQgPSBidWlsZEVudmlyb25tZW50SXIoe1xuICAgICAga2VybmVsSW1wbGVtZW50YXRpb25SZWYsXG4gICAgICBydW50aW1lU2VydmljZXNFdmlkZW5jZSxcbiAgICAgIGJ1aWxkRW52Q29uZmlnLFxuICAgICAgbWlzc2luZ1NlcnZpY2VzLFxuICAgICAgbWlzc2luZ0NvbmZpZ0tleXMsXG4gICAgfSlcblxuICAgIGNvbnN0IG1vZHVsZUlkID1cbiAgICAgIHR5cGVvZiAocm9vdEltcGwubW9kdWxlIGFzIGFueSk/LmlkID09PSAnc3RyaW5nJyAmJiAocm9vdEltcGwubW9kdWxlIGFzIGFueSkuaWQubGVuZ3RoID4gMFxuICAgICAgICA/IFN0cmluZygocm9vdEltcGwubW9kdWxlIGFzIGFueSkuaWQpXG4gICAgICAgIDogKG1hbmlmZXN0Py5tb2R1bGVJZCA/PyAndW5rbm93bicpXG5cbiAgICBjb25zdCBhcnRpZmFjdHMgPSBjb2xsZWN0VHJpYWxSdW5BcnRpZmFjdHMoe1xuICAgICAgZXhwb3J0ZXJzOiBnZXRUcmlhbFJ1bkFydGlmYWN0RXhwb3J0ZXJzKHJvb3RJbXBsLm1vZHVsZSBhcyBhbnkpLFxuICAgICAgY3R4OiB7XG4gICAgICAgIG1vZHVsZUlkLFxuICAgICAgICBtYW5pZmVzdCxcbiAgICAgICAgc3RhdGljSXI6IHN0YXRpY0lyIGFzIGFueSxcbiAgICAgICAgZW52aXJvbm1lbnQsXG4gICAgICB9LFxuICAgIH0pXG5cbiAgICBsZXQgcmVwb3J0OiBUcmlhbFJ1blJlcG9ydCA9IHtcbiAgICAgIHJ1bklkOiBzZXNzaW9uLnJ1bklkLFxuICAgICAgb2ssXG4gICAgICBtYW5pZmVzdCxcbiAgICAgIHN0YXRpY0lyOiBzdGF0aWNJciBhcyBhbnksXG4gICAgICBhcnRpZmFjdHMsXG4gICAgICBlbnZpcm9ubWVudCxcbiAgICAgIGV2aWRlbmNlLFxuICAgICAgc3VtbWFyeSxcbiAgICAgIGVycm9yLFxuICAgIH1cblxuICAgIGNvbnN0IG1heEJ5dGVzID0gb3B0aW9ucz8uYnVkZ2V0cz8ubWF4Qnl0ZXNcbiAgICBpZiAodHlwZW9mIG1heEJ5dGVzID09PSAnbnVtYmVyJyAmJiBOdW1iZXIuaXNGaW5pdGUobWF4Qnl0ZXMpICYmIG1heEJ5dGVzID4gMCkge1xuICAgICAgY29uc3Qgb3JpZ2luYWxCeXRlcyA9IHV0ZjhCeXRlTGVuZ3RoKHJlcG9ydClcbiAgICAgIGlmIChvcmlnaW5hbEJ5dGVzID4gbWF4Qnl0ZXMpIHtcbiAgICAgICAgcmVwb3J0ID0ge1xuICAgICAgICAgIHJ1bklkOiBzZXNzaW9uLnJ1bklkLFxuICAgICAgICAgIG9rOiBmYWxzZSxcbiAgICAgICAgICBlbnZpcm9ubWVudCxcbiAgICAgICAgICBlcnJvcjoge1xuICAgICAgICAgICAgbWVzc2FnZTogYFtMb2dpeF0gVHJpYWxSdW5SZXBvcnQgZXhjZWVkZWQgbWF4Qnl0ZXMgKCR7b3JpZ2luYWxCeXRlc30gPiAke21heEJ5dGVzfSlgLFxuICAgICAgICAgICAgY29kZTogJ092ZXJzaXplZCcsXG4gICAgICAgICAgICBoaW50OiAnUmVkdWNlIG1heEV2ZW50cyBvciBidWRnZXRzLm1heEJ5dGVzLCBvciBzcGxpdCBtYW5pZmVzdC9ldmlkZW5jZSBhcnRpZmFjdHMgaW4gQ0kuJyxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHN1bW1hcnk6IHtcbiAgICAgICAgICAgIF9fbG9naXg6IHtcbiAgICAgICAgICAgICAgdHJ1bmNhdGVkOiB0cnVlLFxuICAgICAgICAgICAgICBtYXhCeXRlcyxcbiAgICAgICAgICAgICAgb3JpZ2luYWxCeXRlcyxcbiAgICAgICAgICAgICAgZHJvcHBlZDogWydtYW5pZmVzdCcsICdzdGF0aWNJcicsICdhcnRpZmFjdHMnLCAnZXZpZGVuY2UnXSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiByZXBvcnRcbiAgfSlcbiIsICJpbXBvcnQgeyBDb25maWdQcm92aWRlciwgRWZmZWN0LCBMYXllciB9IGZyb20gJ2VmZmVjdCdcbmltcG9ydCAqIGFzIENvbnN0cnVjdGlvbkd1YXJkIGZyb20gJy4vQ29uc3RydWN0aW9uR3VhcmQuanMnXG5pbXBvcnQge1xuICBSdW50aW1lSG9zdCxcbiAgdHlwZSBSdW50aW1lSG9zdEtpbmQsXG4gIHR5cGUgUnVudGltZUhvc3RTZXJ2aWNlLFxuICBkZWZhdWx0TGF5ZXIgYXMgZGVmYXVsdFJ1bnRpbWVIb3N0TGF5ZXIsXG4gIG1ha2UgYXMgbWFrZVJ1bnRpbWVIb3N0LFxuICBsYXllciBhcyBydW50aW1lSG9zdExheWVyLFxufSBmcm9tICcuL1J1bnRpbWVIb3N0LmpzJ1xuXG5leHBvcnQgdHlwZSBCdWlsZEVudkNvbmZpZ1ZhbHVlID0gc3RyaW5nIHwgbnVtYmVyIHwgYm9vbGVhblxuXG5leHBvcnQgaW50ZXJmYWNlIEJ1aWxkRW52T3B0aW9ucyB7XG4gIHJlYWRvbmx5IHJ1bnRpbWVIb3N0PzogUnVudGltZUhvc3RTZXJ2aWNlXG4gIHJlYWRvbmx5IHJ1bnRpbWVIb3N0S2luZD86IFJ1bnRpbWVIb3N0S2luZFxuICAvKipcbiAgICogRmxhdCBrZXkvdmFsdWUgY29uZmlnIGZvciBtb2NraW5nIGZlYXR1cmUgZmxhZ3MgLyBlbnYgdmFyaWFibGVzICh2YWx1ZXMgYXJlIGNvZXJjZWQgdG8gc3RyaW5nKS5cbiAgICovXG4gIHJlYWRvbmx5IGNvbmZpZz86IFJlY29yZDxzdHJpbmcsIEJ1aWxkRW52Q29uZmlnVmFsdWUgfCB1bmRlZmluZWQ+XG4gIC8qKlxuICAgKiBBZHZhbmNlZDogaW5qZWN0IGEgQ29uZmlnUHJvdmlkZXIgZGlyZWN0bHkgKGhpZ2hlciBwcmlvcml0eSB0aGFuIGNvbmZpZykuXG4gICAqL1xuICByZWFkb25seSBjb25maWdQcm92aWRlcj86IENvbmZpZ1Byb3ZpZGVyLkNvbmZpZ1Byb3ZpZGVyXG59XG5cbmNvbnN0IHRvQ29uZmlnUHJvdmlkZXJGcm9tUmVjb3JkID0gKFxuICByZWNvcmQ6IFJlY29yZDxzdHJpbmcsIEJ1aWxkRW52Q29uZmlnVmFsdWUgfCB1bmRlZmluZWQ+IHwgdW5kZWZpbmVkLFxuKTogQ29uZmlnUHJvdmlkZXIuQ29uZmlnUHJvdmlkZXIgPT4ge1xuICBjb25zdCBtYXAgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nPigpXG4gIGZvciAoY29uc3QgW2ssIHZdIG9mIE9iamVjdC5lbnRyaWVzKHJlY29yZCA/PyB7fSkpIHtcbiAgICBpZiAoIWspIGNvbnRpbnVlXG4gICAgaWYgKHYgPT09IHVuZGVmaW5lZCkgY29udGludWVcbiAgICBtYXAuc2V0KGssIFN0cmluZyh2KSlcbiAgfVxuICByZXR1cm4gQ29uZmlnUHJvdmlkZXIuZnJvbU1hcChtYXApXG59XG5cbmV4cG9ydCBjb25zdCBsYXllciA9IChvcHRpb25zOiBCdWlsZEVudk9wdGlvbnMgPSB7fSk6IExheWVyLkxheWVyPFJ1bnRpbWVIb3N0LCBuZXZlciwgbmV2ZXI+ID0+IHtcbiAgY29uc3QgcnVudGltZUhvc3QgPSBvcHRpb25zLnJ1bnRpbWVIb3N0XG4gICAgPyBydW50aW1lSG9zdExheWVyKG9wdGlvbnMucnVudGltZUhvc3QpXG4gICAgOiBvcHRpb25zLnJ1bnRpbWVIb3N0S2luZFxuICAgICAgPyBydW50aW1lSG9zdExheWVyKG1ha2VSdW50aW1lSG9zdChvcHRpb25zLnJ1bnRpbWVIb3N0S2luZCkpXG4gICAgICA6IGRlZmF1bHRSdW50aW1lSG9zdExheWVyXG5cbiAgY29uc3QgY29uZmlnUHJvdmlkZXIgPSBvcHRpb25zLmNvbmZpZ1Byb3ZpZGVyID8gb3B0aW9ucy5jb25maWdQcm92aWRlciA6IHRvQ29uZmlnUHJvdmlkZXJGcm9tUmVjb3JkKG9wdGlvbnMuY29uZmlnKVxuXG4gIGNvbnN0IGNvbmZpZyA9IExheWVyLnNldENvbmZpZ1Byb3ZpZGVyKGNvbmZpZ1Byb3ZpZGVyKVxuXG4gIHJldHVybiBMYXllci5tZXJnZUFsbChydW50aW1lSG9zdCwgY29uZmlnKSBhcyBMYXllci5MYXllcjxSdW50aW1lSG9zdCwgbmV2ZXIsIG5ldmVyPlxufVxuXG5leHBvcnQgY29uc3QgcnVuID0gPEEsIEU+KFxuICBidWlsZGVyOiBFZmZlY3QuRWZmZWN0PEEsIEUsIFJ1bnRpbWVIb3N0PixcbiAgb3B0aW9uczogQnVpbGRFbnZPcHRpb25zID0ge30sXG4pOiBFZmZlY3QuRWZmZWN0PEEsIEUgfCBDb25zdHJ1Y3Rpb25HdWFyZC5Db25zdHJ1Y3Rpb25HdWFyZEVycm9yLCBuZXZlcj4gPT5cbiAgYnVpbGRlci5waXBlKEVmZmVjdC5wcm92aWRlKGxheWVyKG9wdGlvbnMpKSwgQ29uc3RydWN0aW9uR3VhcmQuZ3VhcmRCdWlsZFRpbWUpXG4iLCAiaW1wb3J0IHsgQ2F1c2UsIEVmZmVjdCB9IGZyb20gJ2VmZmVjdCdcblxuZXhwb3J0IGludGVyZmFjZSBDb25zdHJ1Y3Rpb25HdWFyZEVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICByZWFkb25seSBfdGFnOiAnQ29uc3RydWN0aW9uR3VhcmRFcnJvcidcbiAgcmVhZG9ubHkga2luZDogJ21pc3Npbmdfc2VydmljZScgfCAndW5rbm93bl9kZWZlY3QnXG4gIHJlYWRvbmx5IG1pc3NpbmdTZXJ2aWNlPzogc3RyaW5nXG4gIHJlYWRvbmx5IGhpbnQ/OiBzdHJpbmdcbn1cblxuZXhwb3J0IGNvbnN0IG1ha2VDb25zdHJ1Y3Rpb25HdWFyZEVycm9yID0gKG9wdGlvbnM6IHtcbiAgcmVhZG9ubHkga2luZDogQ29uc3RydWN0aW9uR3VhcmRFcnJvclsna2luZCddXG4gIHJlYWRvbmx5IG1lc3NhZ2U6IHN0cmluZ1xuICByZWFkb25seSBtaXNzaW5nU2VydmljZT86IHN0cmluZ1xuICByZWFkb25seSBoaW50Pzogc3RyaW5nXG59KTogQ29uc3RydWN0aW9uR3VhcmRFcnJvciA9PlxuICBPYmplY3QuYXNzaWduKG5ldyBFcnJvcihvcHRpb25zLm1lc3NhZ2UpLCB7XG4gICAgX3RhZzogJ0NvbnN0cnVjdGlvbkd1YXJkRXJyb3InLFxuICAgIGtpbmQ6IG9wdGlvbnMua2luZCxcbiAgICBtaXNzaW5nU2VydmljZTogb3B0aW9ucy5taXNzaW5nU2VydmljZSxcbiAgICBoaW50OiBvcHRpb25zLmhpbnQsXG4gIH0pIGFzIENvbnN0cnVjdGlvbkd1YXJkRXJyb3JcblxuY29uc3QgZXh0cmFjdE1pc3NpbmdTZXJ2aWNlID0gKGNhdXNlOiBDYXVzZS5DYXVzZTx1bmtub3duPik6IHN0cmluZyB8IHVuZGVmaW5lZCA9PiB7XG4gIGNvbnN0IGNhbmRpZGF0ZXMgPSBbLi4uQXJyYXkuZnJvbShDYXVzZS5kZWZlY3RzKGNhdXNlKSksIC4uLkFycmF5LmZyb20oQ2F1c2UuZmFpbHVyZXMoY2F1c2UpKV1cblxuICBmb3IgKGNvbnN0IGNhbmRpZGF0ZSBvZiBjYW5kaWRhdGVzKSB7XG4gICAgY29uc3QgbWVzc2FnZSA9XG4gICAgICBjYW5kaWRhdGUgaW5zdGFuY2VvZiBFcnJvciA/IGNhbmRpZGF0ZS5tZXNzYWdlIDogdHlwZW9mIGNhbmRpZGF0ZSA9PT0gJ3N0cmluZycgPyBjYW5kaWRhdGUgOiB1bmRlZmluZWRcblxuICAgIGlmICghbWVzc2FnZSkgY29udGludWVcblxuICAgIGNvbnN0IG1hdGNoID0gL1NlcnZpY2Ugbm90IGZvdW5kOiAoW15cXHMoXSspLy5leGVjKG1lc3NhZ2UpXG4gICAgaWYgKG1hdGNoPy5bMV0pIHJldHVybiBtYXRjaFsxXVxuICB9XG5cbiAgcmV0dXJuIHVuZGVmaW5lZFxufVxuXG4vKipcbiAqIGd1YXJkQnVpbGRUaW1lXHVGRjFBXG4gKiAtIER1cmluZyBCdWlsZCBFbnYvUmVmbGVjdGlvbiwgY2F0Y2ggXCJtaXNzaW5nIHNlcnZpY2VcIiBkZWZlY3RzIGFuZCBjb252ZXJ0IHRoZW0gaW50byBhY3Rpb25hYmxlIGVycm9ycy5cbiAqIC0gUHJlc2VydmUgb3RoZXIgZmFpbHVyZXMvZGVmZWN0cyBhcy1pcyAoZG8gbm90IHN3YWxsb3cgYnVzaW5lc3MgZXJyb3Igc2VtYW50aWNzKS5cbiAqL1xuZXhwb3J0IGNvbnN0IGd1YXJkQnVpbGRUaW1lID0gPEEsIEUsIFI+KFxuICBzZWxmOiBFZmZlY3QuRWZmZWN0PEEsIEUsIFI+LFxuKTogRWZmZWN0LkVmZmVjdDxBLCBFIHwgQ29uc3RydWN0aW9uR3VhcmRFcnJvciwgUj4gPT5cbiAgc2VsZi5waXBlKFxuICAgIEVmZmVjdC5jYXRjaEFsbENhdXNlKChjYXVzZSk6IEVmZmVjdC5FZmZlY3Q8bmV2ZXIsIENvbnN0cnVjdGlvbkd1YXJkRXJyb3IgfCBFLCBuZXZlcj4gPT4ge1xuICAgICAgY29uc3QgbWlzc2luZyA9IGV4dHJhY3RNaXNzaW5nU2VydmljZShjYXVzZSlcbiAgICAgIGlmIChtaXNzaW5nKSB7XG4gICAgICAgIHJldHVybiBFZmZlY3QuZmFpbChcbiAgICAgICAgICBtYWtlQ29uc3RydWN0aW9uR3VhcmRFcnJvcih7XG4gICAgICAgICAgICBraW5kOiAnbWlzc2luZ19zZXJ2aWNlJyxcbiAgICAgICAgICAgIG1pc3NpbmdTZXJ2aWNlOiBtaXNzaW5nLFxuICAgICAgICAgICAgbWVzc2FnZTogYFtDb25zdHJ1Y3Rpb25HdWFyZEVycm9yXSBCdWlsZC10aW1lIGRlcGVuZGVuY3kgdmlvbGF0aW9uOiBzZXJ2aWNlIFwiJHttaXNzaW5nfVwiIGlzIG5vdCBhdmFpbGFibGUgaW4gQnVpbGQgRW52LmAsXG4gICAgICAgICAgICBoaW50OlxuICAgICAgICAgICAgICAnQnVpbGQtdGltZSAoUmVmbGVjdGlvbikgY2FuIG9ubHkgZGVwZW5kIG9uIGEgc21hbGwgc2V0IG9mIG1vY2thYmxlIHByaW1pdGl2ZXMgKGUuZy4gQ29uZmlnL1J1bnRpbWVIb3N0KS4gJyArXG4gICAgICAgICAgICAgICdNb3ZlIGJ1c2luZXNzIHNlcnZpY2UgYWNjZXNzIHRvIHJ1bnRpbWUgKGUuZy4gVHJhaXQgaGFuZGxlciAvIExvZ2ljIHJ1biBzZWN0aW9uKSBvciBpc29sYXRlIGl0IHZpYSBleHBsaWNpdCBpbmplY3Rpb24uJyxcbiAgICAgICAgICB9KSxcbiAgICAgICAgKVxuICAgICAgfVxuICAgICAgcmV0dXJuIEVmZmVjdC5mYWlsQ2F1c2UoY2F1c2UpIGFzIEVmZmVjdC5FZmZlY3Q8bmV2ZXIsIENvbnN0cnVjdGlvbkd1YXJkRXJyb3IgfCBFPlxuICAgIH0pLFxuICApXG4iLCAiaW1wb3J0IHsgQ29udGV4dCwgTGF5ZXIgfSBmcm9tICdlZmZlY3QnXG5cbmV4cG9ydCB0eXBlIFJ1bnRpbWVIb3N0S2luZCA9ICdub2RlJyB8ICdicm93c2VyJyB8ICd1bmtub3duJ1xuXG5leHBvcnQgaW50ZXJmYWNlIFJ1bnRpbWVIb3N0U2VydmljZSB7XG4gIHJlYWRvbmx5IGtpbmQ6IFJ1bnRpbWVIb3N0S2luZFxuICByZWFkb25seSBpc05vZGU6IGJvb2xlYW5cbiAgcmVhZG9ubHkgaXNCcm93c2VyOiBib29sZWFuXG59XG5cbmNvbnN0IGRldGVjdEtpbmQgPSAoKTogUnVudGltZUhvc3RLaW5kID0+IHtcbiAgY29uc3QgaXNCcm93c2VyID0gdHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIGRvY3VtZW50ICE9PSAndW5kZWZpbmVkJ1xuXG4gIGlmIChpc0Jyb3dzZXIpIHJldHVybiAnYnJvd3NlcidcblxuICBjb25zdCBpc05vZGUgPSB0eXBlb2YgcHJvY2VzcyAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIChwcm9jZXNzIGFzIGFueSk/LnZlcnNpb25zPy5ub2RlID09PSAnc3RyaW5nJ1xuXG4gIGlmIChpc05vZGUpIHJldHVybiAnbm9kZSdcblxuICByZXR1cm4gJ3Vua25vd24nXG59XG5cbmV4cG9ydCBjb25zdCBtYWtlID0gKGtpbmQ6IFJ1bnRpbWVIb3N0S2luZCk6IFJ1bnRpbWVIb3N0U2VydmljZSA9PiAoe1xuICBraW5kLFxuICBpc05vZGU6IGtpbmQgPT09ICdub2RlJyxcbiAgaXNCcm93c2VyOiBraW5kID09PSAnYnJvd3NlcicsXG59KVxuXG5leHBvcnQgY2xhc3MgUnVudGltZUhvc3QgZXh0ZW5kcyBDb250ZXh0LlRhZygnQGxvZ2l4anMvUnVudGltZUhvc3QnKTxSdW50aW1lSG9zdCwgUnVudGltZUhvc3RTZXJ2aWNlPigpIHt9XG5cbmV4cG9ydCBjb25zdCBsYXllciA9IChzZXJ2aWNlOiBSdW50aW1lSG9zdFNlcnZpY2UpOiBMYXllci5MYXllcjxSdW50aW1lSG9zdCwgbmV2ZXIsIG5ldmVyPiA9PlxuICBMYXllci5zdWNjZWVkKFJ1bnRpbWVIb3N0LCBzZXJ2aWNlKVxuXG5leHBvcnQgY29uc3QgbW9jayA9IChraW5kOiBSdW50aW1lSG9zdEtpbmQpOiBMYXllci5MYXllcjxSdW50aW1lSG9zdCwgbmV2ZXIsIG5ldmVyPiA9PiBsYXllcihtYWtlKGtpbmQpKVxuXG5leHBvcnQgY29uc3QgZGVmYXVsdExheWVyOiBMYXllci5MYXllcjxSdW50aW1lSG9zdCwgbmV2ZXIsIG5ldmVyPiA9IGxheWVyKG1ha2UoZGV0ZWN0S2luZCgpKSlcbiIsICJpbXBvcnQgeyBFZmZlY3QsIExheWVyLCBNYW5hZ2VkUnVudGltZSB9IGZyb20gJ2VmZmVjdCdcbmltcG9ydCB0eXBlIHsgQW55TW9kdWxlU2hhcGUsIE1vZHVsZUltcGwgfSBmcm9tICcuL2NvcmUvbW9kdWxlLmpzJ1xuaW1wb3J0ICogYXMgQXBwUnVudGltZUltcGwgZnJvbSAnLi9BcHBSdW50aW1lLmpzJ1xuXG4vKipcbiAqIFJ1bnRpbWUgb3B0aW9uczpcbiAqIC0gbGF5ZXI6IGV4dHJhIHRvcC1sZXZlbCBFbnYgKGUuZy4gQ29uZmlnIC8gcGxhdGZvcm0gc2VydmljZXMpIG1lcmdlZCB3aXRoIFJvb3QgTW9kdWxlSW1wbC5sYXllci5cbiAqIC0gb25FcnJvcjogYXBwLWxldmVsIGVycm9yIGhhbmRsZXIgZW50cnlwb2ludCB1c2VkIHRvIHJlcG9ydCB1bmNhdWdodCBlcnJvcnMgYXQgdGhlIFJ1bnRpbWUgbGV2ZWwuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUnVudGltZU9wdGlvbnMge1xuICByZWFkb25seSBsYXllcj86IExheWVyLkxheWVyPGFueSwgbmV2ZXIsIG5ldmVyPlxuICByZWFkb25seSBvbkVycm9yPzogKGNhdXNlOiBpbXBvcnQoJ2VmZmVjdCcpLkNhdXNlLkNhdXNlPHVua25vd24+KSA9PiBFZmZlY3QuRWZmZWN0PHZvaWQ+XG59XG5cbi8qKlxuICogUnVudGltZS5tYWtlXG4gKlxuICogQnVpbGQgYW4gYXBwbGljYXRpb24tbGV2ZWwgUnVudGltZSBnaXZlbiBhIHJvb3QgTW9kdWxlSW1wbDpcbiAqXG4gKiAtIFVzZSBSb290SW1wbC5tb2R1bGUgKyBSb290SW1wbC5sYXllciBhcyB0aGUgc2luZ2xlIGdsb2JhbCBtb2R1bGUuXG4gKiAtIEZvcmsgUm9vdEltcGwucHJvY2Vzc2VzIGFzIGxvbmctbGl2ZWQgcHJvY2Vzc2VzIHdpdGhpbiB0aGUgUnVudGltZSBzY29wZS5cbiAqIC0gUmV1c2UgdGhlIGV4aXN0aW5nIEFwcFJ1bnRpbWUgaW1wbGVtZW50YXRpb24gYXMgdGhlIHVuZGVybHlpbmcgY29udGFpbmVyIGFuZCBleHBvc2Ugb25seSBNYW5hZ2VkUnVudGltZS5cbiAqXG4gKiBOb3RlczpcbiAqIC0gVXNlcyBicm9hZCBhbnkvbmV2ZXIgYXQgdGhlIHR5cGUgbGV2ZWwgdG8gYXZvaWQgY29tcGxleCBFbnYgaW5mZXJlbmNlIGhlcmUuXG4gKiAtIEJ1c2luZXNzIGNvZGUgb25seSBuZWVkcyB0byBlbnN1cmUgUm9vdEltcGwubGF5ZXIgYW5kIG9wdGlvbnMubGF5ZXIgdG9nZXRoZXIgY2FuIHByb3ZpZGUgdGhlIGZ1bGwgRW52LlxuICovXG5leHBvcnQgY29uc3QgbWFrZSA9IChcbiAgcm9vdEltcGw6IE1vZHVsZUltcGw8YW55LCBBbnlNb2R1bGVTaGFwZSwgYW55PixcbiAgb3B0aW9ucz86IFJ1bnRpbWVPcHRpb25zLFxuKTogTWFuYWdlZFJ1bnRpbWUuTWFuYWdlZFJ1bnRpbWU8YW55LCBuZXZlcj4gPT4ge1xuICBjb25zdCBhcHBDb25maWc6IEFwcFJ1bnRpbWVJbXBsLkxvZ2l4QXBwQ29uZmlnPGFueT4gPSB7XG4gICAgbGF5ZXI6IChvcHRpb25zPy5sYXllciA/PyBMYXllci5lbXB0eSkgYXMgTGF5ZXIuTGF5ZXI8YW55LCBuZXZlciwgbmV2ZXI+LFxuICAgIG1vZHVsZXM6IFtBcHBSdW50aW1lSW1wbC5wcm92aWRlKHJvb3RJbXBsLm1vZHVsZSwgcm9vdEltcGwubGF5ZXIgYXMgTGF5ZXIuTGF5ZXI8YW55LCBhbnksIGFueT4pXSxcbiAgICBwcm9jZXNzZXM6IHJvb3RJbXBsLnByb2Nlc3NlcyA/PyBbXSxcbiAgICBvbkVycm9yOiBvcHRpb25zPy5vbkVycm9yLFxuICB9XG5cbiAgY29uc3QgYXBwID0gQXBwUnVudGltZUltcGwubWFrZUFwcChhcHBDb25maWcpXG4gIHJldHVybiBhcHAubWFrZVJ1bnRpbWUoKSBhcyBNYW5hZ2VkUnVudGltZS5NYW5hZ2VkUnVudGltZTxhbnksIG5ldmVyPlxufVxuIiwgImltcG9ydCB0eXBlIHsgSnNvblZhbHVlIH0gZnJvbSAnLi4vanNvblZhbHVlLmpzJ1xuaW1wb3J0IHR5cGUgeyBTZXJpYWxpemFibGVFcnJvclN1bW1hcnkgfSBmcm9tICcuLi8uLi9ydW50aW1lL2NvcmUvZXJyb3JTdW1tYXJ5LmpzJ1xuXG5leHBvcnQgdHlwZSBBcnRpZmFjdEtleSA9IHN0cmluZ1xuXG5leHBvcnQgY29uc3QgYXJ0aWZhY3RLZXlTY2hlbWFQYXR0ZXJuID0gJ15AW15cXFxccy9dK1xcXFwvW15cXFxcc0BdK0B2XFxcXGQrJCcgYXMgY29uc3RcblxuZXhwb3J0IGNvbnN0IGlzQXJ0aWZhY3RLZXkgPSAoaW5wdXQ6IHVua25vd24pOiBpbnB1dCBpcyBBcnRpZmFjdEtleSA9PlxuICB0eXBlb2YgaW5wdXQgPT09ICdzdHJpbmcnICYmIC9eQFteXFxzL10rXFwvW15cXHNAXStAdlxcZCskLy50ZXN0KGlucHV0KVxuXG50eXBlIEVudmVsb3BlQmFzZSA9IHtcbiAgcmVhZG9ubHkgYXJ0aWZhY3RLZXk6IEFydGlmYWN0S2V5XG4gIHJlYWRvbmx5IHRydW5jYXRlZD86IGJvb2xlYW5cbiAgcmVhZG9ubHkgYnVkZ2V0Qnl0ZXM/OiBudW1iZXJcbiAgcmVhZG9ubHkgYWN0dWFsQnl0ZXM/OiBudW1iZXJcbiAgcmVhZG9ubHkgZGlnZXN0Pzogc3RyaW5nXG4gIHJlYWRvbmx5IG5vdGVzPzogSnNvblZhbHVlXG59XG5cbmV4cG9ydCB0eXBlIEFydGlmYWN0RW52ZWxvcGUgPVxuICB8IChFbnZlbG9wZUJhc2UgJiB7XG4gICAgICByZWFkb25seSBvazogdHJ1ZVxuICAgICAgcmVhZG9ubHkgdmFsdWU6IEpzb25WYWx1ZVxuICAgICAgcmVhZG9ubHkgZXJyb3I/OiBuZXZlclxuICAgIH0pXG4gIHwgKEVudmVsb3BlQmFzZSAmIHtcbiAgICAgIHJlYWRvbmx5IG9rOiBmYWxzZVxuICAgICAgcmVhZG9ubHkgZXJyb3I6IFNlcmlhbGl6YWJsZUVycm9yU3VtbWFyeVxuICAgICAgcmVhZG9ubHkgdmFsdWU/OiBuZXZlclxuICAgIH0pXG5cbmV4cG9ydCB0eXBlIFRyaWFsUnVuQXJ0aWZhY3RzID0gUmVhZG9ubHk8UmVjb3JkPEFydGlmYWN0S2V5LCBBcnRpZmFjdEVudmVsb3BlPj5cbiIsICJpbXBvcnQgeyBmbnYxYTMyLCBzdGFibGVTdHJpbmdpZnkgfSBmcm9tICcuLi8uLi9kaWdlc3QuanMnXG5pbXBvcnQgdHlwZSB7IEpzb25WYWx1ZSB9IGZyb20gJy4uL2pzb25WYWx1ZS5qcydcblxuZXhwb3J0IGludGVyZmFjZSBKc29uVmFsdWVEaWdlc3Qge1xuICByZWFkb25seSBzdGFibGVKc29uOiBzdHJpbmdcbiAgcmVhZG9ubHkgYnl0ZXM6IG51bWJlclxuICByZWFkb25seSBkaWdlc3Q6IHN0cmluZ1xufVxuXG5jb25zdCB1dGY4Qnl0ZUxlbmd0aFN0cmluZyA9ICh0ZXh0OiBzdHJpbmcpOiBudW1iZXIgPT4ge1xuICBpZiAodHlwZW9mIFRleHRFbmNvZGVyICE9PSAndW5kZWZpbmVkJykge1xuICAgIHJldHVybiBuZXcgVGV4dEVuY29kZXIoKS5lbmNvZGUodGV4dCkubGVuZ3RoXG4gIH1cbiAgcmV0dXJuIHRleHQubGVuZ3RoXG59XG5cbmV4cG9ydCBjb25zdCBkaWdlc3RKc29uVmFsdWUgPSAodmFsdWU6IEpzb25WYWx1ZSk6IEpzb25WYWx1ZURpZ2VzdCA9PiB7XG4gIGNvbnN0IHN0YWJsZUpzb24gPSBzdGFibGVTdHJpbmdpZnkodmFsdWUpXG4gIGNvbnN0IGJ5dGVzID0gdXRmOEJ5dGVMZW5ndGhTdHJpbmcoc3RhYmxlSnNvbilcbiAgcmV0dXJuIHtcbiAgICBzdGFibGVKc29uLFxuICAgIGJ5dGVzLFxuICAgIGRpZ2VzdDogYGFydGlmYWN0OjAzMToke2ZudjFhMzIoc3RhYmxlSnNvbil9YCxcbiAgfVxufVxuIiwgImltcG9ydCB0eXBlIHsgU2VyaWFsaXphYmxlRXJyb3JTdW1tYXJ5IH0gZnJvbSAnLi4vLi4vcnVudGltZS9jb3JlL2Vycm9yU3VtbWFyeS5qcydcbmltcG9ydCB7IHRvU2VyaWFsaXphYmxlRXJyb3JTdW1tYXJ5IH0gZnJvbSAnLi4vLi4vcnVudGltZS9jb3JlL2Vycm9yU3VtbWFyeS5qcydcbmltcG9ydCB7IGlzSnNvblZhbHVlLCB0eXBlIEpzb25WYWx1ZSB9IGZyb20gJy4uL2pzb25WYWx1ZS5qcydcbmltcG9ydCB0eXBlIHsgQXJ0aWZhY3RFbnZlbG9wZSwgQXJ0aWZhY3RLZXksIFRyaWFsUnVuQXJ0aWZhY3RzIH0gZnJvbSAnLi9tb2RlbC5qcydcbmltcG9ydCB7IGlzQXJ0aWZhY3RLZXkgfSBmcm9tICcuL21vZGVsLmpzJ1xuaW1wb3J0IHR5cGUgeyBUcmlhbFJ1bkFydGlmYWN0RXhwb3J0ZXIsIFRyaWFsUnVuQXJ0aWZhY3RJbnNwZWN0aW9uQ29udGV4dCB9IGZyb20gJy4vZXhwb3J0ZXIuanMnXG5pbXBvcnQgeyBkaWdlc3RKc29uVmFsdWUgfSBmcm9tICcuL2RpZ2VzdC5qcydcblxuZXhwb3J0IGludGVyZmFjZSBUcmlhbFJ1bkFydGlmYWN0c0J1ZGdldHMge1xuICAvKipcbiAgICogUGVyLWFydGlmYWN0IG1heGltdW0gc2VyaWFsaXplZCBieXRlcyAoVVRGLTgpLlxuICAgKiBEZWZhdWx0OiA1MEtCLlxuICAgKi9cbiAgcmVhZG9ubHkgbWF4Qnl0ZXM/OiBudW1iZXJcbn1cblxuZXhwb3J0IGludGVyZmFjZSBDb2xsZWN0VHJpYWxSdW5BcnRpZmFjdHNPcHRpb25zIHtcbiAgcmVhZG9ubHkgZXhwb3J0ZXJzOiBSZWFkb25seUFycmF5PFRyaWFsUnVuQXJ0aWZhY3RFeHBvcnRlcj5cbiAgcmVhZG9ubHkgY3R4OiBUcmlhbFJ1bkFydGlmYWN0SW5zcGVjdGlvbkNvbnRleHRcbiAgcmVhZG9ubHkgYnVkZ2V0cz86IFRyaWFsUnVuQXJ0aWZhY3RzQnVkZ2V0c1xufVxuXG5jb25zdCB0b0Vycm9yU3VtbWFyeVdpdGhDb2RlID0gKGNhdXNlOiB1bmtub3duLCBjb2RlOiBzdHJpbmcsIGhpbnQ/OiBzdHJpbmcpOiBTZXJpYWxpemFibGVFcnJvclN1bW1hcnkgPT4ge1xuICBjb25zdCBiYXNlID0gdG9TZXJpYWxpemFibGVFcnJvclN1bW1hcnkoY2F1c2UpLmVycm9yU3VtbWFyeVxuICByZXR1cm4ge1xuICAgIG5hbWU6IGJhc2UubmFtZSxcbiAgICBtZXNzYWdlOiBiYXNlLm1lc3NhZ2UsXG4gICAgY29kZSxcbiAgICBoaW50OiBoaW50ID8/IGJhc2UuaGludCxcbiAgfVxufVxuXG5jb25zdCBkZWZhdWx0QXJ0aWZhY3RCdWRnZXRCeXRlcyA9IDUwICogMTAyNFxuXG5jb25zdCBidWRnZXRPZiA9IChidWRnZXRzOiBUcmlhbFJ1bkFydGlmYWN0c0J1ZGdldHMgfCB1bmRlZmluZWQpOiBudW1iZXIgPT5cbiAgdHlwZW9mIGJ1ZGdldHM/Lm1heEJ5dGVzID09PSAnbnVtYmVyJyAmJiBOdW1iZXIuaXNGaW5pdGUoYnVkZ2V0cy5tYXhCeXRlcykgJiYgYnVkZ2V0cy5tYXhCeXRlcyA+IDBcbiAgICA/IGJ1ZGdldHMubWF4Qnl0ZXNcbiAgICA6IGRlZmF1bHRBcnRpZmFjdEJ1ZGdldEJ5dGVzXG5cbnR5cGUgQ29sbGVjdGVkID0ge1xuICByZWFkb25seSBhcnRpZmFjdEtleTogQXJ0aWZhY3RLZXlcbiAgcmVhZG9ubHkgZW52ZWxvcGU6IEFydGlmYWN0RW52ZWxvcGVcbn1cblxuY29uc3QgbWFrZUNvbmZsaWN0RW52ZWxvcGUgPSAoYXJ0aWZhY3RLZXk6IEFydGlmYWN0S2V5LCBleHBvcnRlcklkczogUmVhZG9ubHlBcnJheTxzdHJpbmc+KTogQ29sbGVjdGVkID0+IHtcbiAgY29uc3QgaWRzID0gQXJyYXkuZnJvbShuZXcgU2V0KGV4cG9ydGVySWRzLm1hcCgocykgPT4gU3RyaW5nKHMpKS5maWx0ZXIoKHMpID0+IHMubGVuZ3RoID4gMCkpKS5zb3J0KChhLCBiKSA9PlxuICAgIGEubG9jYWxlQ29tcGFyZShiKSxcbiAgKVxuICByZXR1cm4ge1xuICAgIGFydGlmYWN0S2V5LFxuICAgIGVudmVsb3BlOiB7XG4gICAgICBhcnRpZmFjdEtleSxcbiAgICAgIG9rOiBmYWxzZSxcbiAgICAgIGVycm9yOiB7XG4gICAgICAgIG5hbWU6ICdBcnRpZmFjdEtleUNvbmZsaWN0RXJyb3InLFxuICAgICAgICBtZXNzYWdlOiBgW0xvZ2l4XSBUcmlhbFJ1biBhcnRpZmFjdCBrZXkgY29uZmxpY3Q6ICR7YXJ0aWZhY3RLZXl9YCxcbiAgICAgICAgY29kZTogJ0FydGlmYWN0S2V5Q29uZmxpY3QnLFxuICAgICAgICBoaW50OiBpZHMubGVuZ3RoID4gMCA/IGBjb25mbGljdGluZ0V4cG9ydGVycz0ke2lkcy5qb2luKCcsJyl9YCA6IHVuZGVmaW5lZCxcbiAgICAgIH0sXG4gICAgfSxcbiAgfVxufVxuXG5jb25zdCB0cnVuY2F0ZUpzb25WYWx1ZSA9IChcbiAgdmFsdWU6IEpzb25WYWx1ZSxcbiAgbWF4Qnl0ZXM6IG51bWJlcixcbik6IHsgcmVhZG9ubHkgdmFsdWU6IEpzb25WYWx1ZTsgcmVhZG9ubHkgYWN0dWFsQnl0ZXM6IG51bWJlcjsgcmVhZG9ubHkgZGlnZXN0OiBzdHJpbmcgfSA9PiB7XG4gIGNvbnN0IGFuYWx5emVkID0gZGlnZXN0SnNvblZhbHVlKHZhbHVlKVxuICBjb25zdCBqc29uID0gYW5hbHl6ZWQuc3RhYmxlSnNvblxuICBjb25zdCBieXRlcyA9IGFuYWx5emVkLmJ5dGVzXG4gIGlmIChieXRlcyA8PSBtYXhCeXRlcykge1xuICAgIHJldHVybiB7IHZhbHVlLCBhY3R1YWxCeXRlczogYnl0ZXMsIGRpZ2VzdDogYW5hbHl6ZWQuZGlnZXN0IH1cbiAgfVxuXG4gIGNvbnN0IHByZXZpZXdDaGFycyA9IE1hdGgubWluKGpzb24ubGVuZ3RoLCBNYXRoLm1heCgwLCBNYXRoLm1pbigyNTYsIG1heEJ5dGVzKSkpXG4gIGNvbnN0IHByZXZpZXcgPSBqc29uLnNsaWNlKDAsIHByZXZpZXdDaGFycylcbiAgcmV0dXJuIHtcbiAgICB2YWx1ZToge1xuICAgICAgX3RhZzogJ292ZXJzaXplZCcsXG4gICAgICBieXRlcyxcbiAgICAgIHByZXZpZXcsXG4gICAgfSxcbiAgICBhY3R1YWxCeXRlczogYnl0ZXMsXG4gICAgZGlnZXN0OiBhbmFseXplZC5kaWdlc3QsXG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IGNvbGxlY3RUcmlhbFJ1bkFydGlmYWN0cyA9IChvcHRpb25zOiBDb2xsZWN0VHJpYWxSdW5BcnRpZmFjdHNPcHRpb25zKTogVHJpYWxSdW5BcnRpZmFjdHMgfCB1bmRlZmluZWQgPT4ge1xuICBjb25zdCBleHBvcnRlcnNTb3J0ZWQgPSBBcnJheS5mcm9tKG9wdGlvbnMuZXhwb3J0ZXJzKS5zb3J0KChhLCBiKSA9PiB7XG4gICAgY29uc3Qga2EgPSBTdHJpbmcoYT8uYXJ0aWZhY3RLZXkgPz8gJycpXG4gICAgY29uc3Qga2IgPSBTdHJpbmcoYj8uYXJ0aWZhY3RLZXkgPz8gJycpXG4gICAgaWYgKGthIDwga2IpIHJldHVybiAtMVxuICAgIGlmIChrYSA+IGtiKSByZXR1cm4gMVxuICAgIGNvbnN0IGlhID0gU3RyaW5nKGE/LmV4cG9ydGVySWQgPz8gJycpXG4gICAgY29uc3QgaWIgPSBTdHJpbmcoYj8uZXhwb3J0ZXJJZCA/PyAnJylcbiAgICByZXR1cm4gaWEubG9jYWxlQ29tcGFyZShpYilcbiAgfSlcblxuICBjb25zdCBjb25mbGljdHMgPSBuZXcgTWFwPEFydGlmYWN0S2V5LCBBcnJheTxzdHJpbmc+PigpXG4gIGZvciAoY29uc3QgZXggb2YgZXhwb3J0ZXJzU29ydGVkKSB7XG4gICAgY29uc3Qga2V5ID0gZXg/LmFydGlmYWN0S2V5XG4gICAgY29uc3QgaWQgPSBTdHJpbmcoZXg/LmV4cG9ydGVySWQgPz8gJycpXG4gICAgaWYgKCFpc0FydGlmYWN0S2V5KGtleSkpIHtcbiAgICAgIGNvbnRpbnVlXG4gICAgfVxuICAgIGNvbnN0IGN1cnJlbnQgPSBjb25mbGljdHMuZ2V0KGtleSlcbiAgICBpZiAoY3VycmVudCkgY3VycmVudC5wdXNoKGlkKVxuICAgIGVsc2UgY29uZmxpY3RzLnNldChrZXksIFtpZF0pXG4gIH1cblxuICBjb25zdCBjb25mbGljdEtleXMgPSBuZXcgU2V0PEFydGlmYWN0S2V5PigpXG4gIGZvciAoY29uc3QgW2ssIGlkc10gb2YgY29uZmxpY3RzKSB7XG4gICAgY29uc3QgdW5pcXVlID0gQXJyYXkuZnJvbShuZXcgU2V0KGlkcykpXG4gICAgaWYgKHVuaXF1ZS5sZW5ndGggPiAxKSB7XG4gICAgICBjb25mbGljdEtleXMuYWRkKGspXG4gICAgfVxuICB9XG5cbiAgY29uc3QgbWF4Qnl0ZXMgPSBidWRnZXRPZihvcHRpb25zLmJ1ZGdldHMpXG4gIGNvbnN0IGNvbGxlY3RlZDogQXJyYXk8Q29sbGVjdGVkPiA9IFtdXG5cbiAgZm9yIChjb25zdCBleHBvcnRlciBvZiBleHBvcnRlcnNTb3J0ZWQpIHtcbiAgICBjb25zdCBhcnRpZmFjdEtleSA9IGV4cG9ydGVyPy5hcnRpZmFjdEtleVxuICAgIGlmICghaXNBcnRpZmFjdEtleShhcnRpZmFjdEtleSkpIHtcbiAgICAgIGNvbnRpbnVlXG4gICAgfVxuICAgIGlmIChjb25mbGljdEtleXMuaGFzKGFydGlmYWN0S2V5KSkge1xuICAgICAgY29udGludWVcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgdmFsdWUgPSBleHBvcnRlci5leHBvcnQob3B0aW9ucy5jdHgpXG4gICAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkgY29udGludWVcbiAgICAgIGlmICghaXNKc29uVmFsdWUodmFsdWUpKSB7XG4gICAgICAgIGNvbGxlY3RlZC5wdXNoKHtcbiAgICAgICAgICBhcnRpZmFjdEtleSxcbiAgICAgICAgICBlbnZlbG9wZToge1xuICAgICAgICAgICAgYXJ0aWZhY3RLZXksXG4gICAgICAgICAgICBvazogZmFsc2UsXG4gICAgICAgICAgICBlcnJvcjogdG9FcnJvclN1bW1hcnlXaXRoQ29kZShcbiAgICAgICAgICAgICAgbmV3IEVycm9yKGBbTG9naXhdIEFydGlmYWN0IGV4cG9ydGVyIHJldHVybmVkIG5vbi1Kc29uVmFsdWU6ICR7ZXhwb3J0ZXIuZXhwb3J0ZXJJZH1gKSxcbiAgICAgICAgICAgICAgJ0FydGlmYWN0Tm9uU2VyaWFsaXphYmxlJyxcbiAgICAgICAgICAgICAgYGFydGlmYWN0S2V5PSR7YXJ0aWZhY3RLZXl9IGV4cG9ydGVySWQ9JHtleHBvcnRlci5leHBvcnRlcklkfWAsXG4gICAgICAgICAgICApLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0pXG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHRydW5jYXRlZCA9IHRydW5jYXRlSnNvblZhbHVlKHZhbHVlLCBtYXhCeXRlcylcbiAgICAgIGNvbnN0IGVudmVsb3BlOiBBcnRpZmFjdEVudmVsb3BlID0ge1xuICAgICAgICBhcnRpZmFjdEtleSxcbiAgICAgICAgb2s6IHRydWUsXG4gICAgICAgIHZhbHVlOiB0cnVuY2F0ZWQudmFsdWUsXG4gICAgICAgIGRpZ2VzdDogdHJ1bmNhdGVkLmRpZ2VzdCxcbiAgICAgICAgLi4uKHRydW5jYXRlZC5hY3R1YWxCeXRlcyA+IG1heEJ5dGVzXG4gICAgICAgICAgPyB7XG4gICAgICAgICAgICAgIHRydW5jYXRlZDogdHJ1ZSxcbiAgICAgICAgICAgICAgYnVkZ2V0Qnl0ZXM6IG1heEJ5dGVzLFxuICAgICAgICAgICAgICBhY3R1YWxCeXRlczogdHJ1bmNhdGVkLmFjdHVhbEJ5dGVzLFxuICAgICAgICAgICAgfVxuICAgICAgICAgIDoge1xuICAgICAgICAgICAgICBidWRnZXRCeXRlczogbWF4Qnl0ZXMsXG4gICAgICAgICAgICAgIGFjdHVhbEJ5dGVzOiB0cnVuY2F0ZWQuYWN0dWFsQnl0ZXMsXG4gICAgICAgICAgICB9KSxcbiAgICAgIH1cblxuICAgICAgY29sbGVjdGVkLnB1c2goeyBhcnRpZmFjdEtleSwgZW52ZWxvcGUgfSlcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBjb2xsZWN0ZWQucHVzaCh7XG4gICAgICAgIGFydGlmYWN0S2V5LFxuICAgICAgICBlbnZlbG9wZToge1xuICAgICAgICAgIGFydGlmYWN0S2V5LFxuICAgICAgICAgIG9rOiBmYWxzZSxcbiAgICAgICAgICBlcnJvcjogdG9FcnJvclN1bW1hcnlXaXRoQ29kZShcbiAgICAgICAgICAgIGUsXG4gICAgICAgICAgICAnQXJ0aWZhY3RFeHBvcnRGYWlsZWQnLFxuICAgICAgICAgICAgYGFydGlmYWN0S2V5PSR7YXJ0aWZhY3RLZXl9IGV4cG9ydGVySWQ9JHtleHBvcnRlci5leHBvcnRlcklkfWAsXG4gICAgICAgICAgKSxcbiAgICAgICAgfSxcbiAgICAgIH0pXG4gICAgfVxuICB9XG5cbiAgZm9yIChjb25zdCBjb25mbGljdEtleSBvZiBBcnJheS5mcm9tKGNvbmZsaWN0S2V5cykuc29ydCgoYSwgYikgPT4gYS5sb2NhbGVDb21wYXJlKGIpKSkge1xuICAgIGNvbGxlY3RlZC5wdXNoKG1ha2VDb25mbGljdEVudmVsb3BlKGNvbmZsaWN0S2V5LCBjb25mbGljdHMuZ2V0KGNvbmZsaWN0S2V5KSA/PyBbXSkpXG4gIH1cblxuICBpZiAoY29sbGVjdGVkLmxlbmd0aCA9PT0gMCkgcmV0dXJuIHVuZGVmaW5lZFxuXG4gIGNvbGxlY3RlZC5zb3J0KChhLCBiKSA9PiBhLmFydGlmYWN0S2V5LmxvY2FsZUNvbXBhcmUoYi5hcnRpZmFjdEtleSkpXG5cbiAgcmV0dXJuIE9iamVjdC5mcm9tRW50cmllcyhjb2xsZWN0ZWQubWFwKChjKSA9PiBbYy5hcnRpZmFjdEtleSwgYy5lbnZlbG9wZV0pKSBzYXRpc2ZpZXMgVHJpYWxSdW5BcnRpZmFjdHNcbn1cbiIsICJpbXBvcnQgeyBFZmZlY3QsIEV4aXQsIExheWVyLCBTY29wZSB9IGZyb20gJ2VmZmVjdCdcbmltcG9ydCB0eXBlIHsgRXZpZGVuY2VQYWNrYWdlLCBFdmlkZW5jZVBhY2thZ2VTb3VyY2UgfSBmcm9tICcuL2V2aWRlbmNlLmpzJ1xuaW1wb3J0IHsgbWFrZUV2aWRlbmNlQ29sbGVjdG9yLCBldmlkZW5jZUNvbGxlY3RvckxheWVyIH0gZnJvbSAnLi9ldmlkZW5jZUNvbGxlY3Rvci5qcydcbmltcG9ydCB7IG1ha2VSdW5TZXNzaW9uLCBydW5TZXNzaW9uTGF5ZXIsIHR5cGUgUnVuU2Vzc2lvbiwgdHlwZSBSdW5JZCB9IGZyb20gJy4vcnVuU2Vzc2lvbi5qcydcbmltcG9ydCB7XG4gIGFwcGVuZFNpbmtzLFxuICBkaWFnbm9zdGljc0xldmVsLFxuICB0eXBlIERpYWdub3N0aWNzTGV2ZWwsXG4gIHR5cGUgU2luayBhcyBEZWJ1Z1NpbmssXG59IGZyb20gJy4uL3J1bnRpbWUvY29yZS9EZWJ1Z1NpbmsuanMnXG5pbXBvcnQgKiBhcyBSdW50aW1lS2VybmVsIGZyb20gJy4uL3J1bnRpbWUvY29yZS9SdW50aW1lS2VybmVsLmpzJ1xuaW1wb3J0IHR5cGUgeyBDb252ZXJnZVN0YXRpY0lyQ29sbGVjdG9yIH0gZnJvbSAnLi4vcnVudGltZS9jb3JlL0NvbnZlcmdlU3RhdGljSXJDb2xsZWN0b3IuanMnXG5pbXBvcnQgeyBhcHBlbmRDb252ZXJnZVN0YXRpY0lyQ29sbGVjdG9ycyB9IGZyb20gJy4uL3J1bnRpbWUvY29yZS9Db252ZXJnZVN0YXRpY0lyQ29sbGVjdG9yLmpzJ1xuZXhwb3J0ICogZnJvbSAnLi90cmlhbFJ1bk1vZHVsZS5qcydcblxuZXhwb3J0IGludGVyZmFjZSBUcmlhbFJ1bk9wdGlvbnMge1xuICByZWFkb25seSBydW5JZD86IFJ1bklkXG4gIHJlYWRvbmx5IHNvdXJjZT86IEV2aWRlbmNlUGFja2FnZVNvdXJjZVxuICByZWFkb25seSBzdGFydGVkQXQ/OiBudW1iZXJcbiAgcmVhZG9ubHkgZGlhZ25vc3RpY3NMZXZlbD86IERpYWdub3N0aWNzTGV2ZWxcbiAgcmVhZG9ubHkgbWF4RXZlbnRzPzogbnVtYmVyXG4gIHJlYWRvbmx5IGxheWVyPzogTGF5ZXIuTGF5ZXI8YW55LCBhbnksIGFueT5cbiAgcmVhZG9ubHkgcnVudGltZVNlcnZpY2VzSW5zdGFuY2VPdmVycmlkZXM/OiBSdW50aW1lS2VybmVsLlJ1bnRpbWVTZXJ2aWNlc092ZXJyaWRlc1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFRyaWFsUnVuUmVzdWx0PEEsIEU+IHtcbiAgcmVhZG9ubHkgc2Vzc2lvbjogUnVuU2Vzc2lvblxuICByZWFkb25seSBleGl0OiBFeGl0LkV4aXQ8QSwgRT5cbiAgcmVhZG9ubHkgZXZpZGVuY2U6IEV2aWRlbmNlUGFja2FnZVxufVxuXG5jb25zdCBkZWZhdWx0SG9zdCA9ICgpOiBzdHJpbmcgPT4ge1xuICBpZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIGRvY3VtZW50ICE9PSAndW5kZWZpbmVkJykgcmV0dXJuICdicm93c2VyJ1xuICByZXR1cm4gJ25vZGUnXG59XG5cbmV4cG9ydCBjb25zdCB0cmlhbFJ1biA9IDxBLCBFLCBSPihcbiAgcHJvZ3JhbTogRWZmZWN0LkVmZmVjdDxBLCBFLCBSPixcbiAgb3B0aW9ucz86IFRyaWFsUnVuT3B0aW9ucyxcbik6IEVmZmVjdC5FZmZlY3Q8VHJpYWxSdW5SZXN1bHQ8QSwgRT4sIG5ldmVyLCBSPiA9PlxuICBFZmZlY3QuZ2VuKGZ1bmN0aW9uKiAoKSB7XG4gICAgY29uc3Qgc2Vzc2lvbiA9IG1ha2VSdW5TZXNzaW9uKHtcbiAgICAgIHJ1bklkOiBvcHRpb25zPy5ydW5JZCxcbiAgICAgIHNvdXJjZTogb3B0aW9ucz8uc291cmNlID8/IHsgaG9zdDogZGVmYXVsdEhvc3QoKSwgbGFiZWw6ICd0cmlhbC1ydW4nIH0sXG4gICAgICBzdGFydGVkQXQ6IG9wdGlvbnM/LnN0YXJ0ZWRBdCxcbiAgICB9KVxuXG4gICAgY29uc3QgY29sbGVjdG9yID0gbWFrZUV2aWRlbmNlQ29sbGVjdG9yKHNlc3Npb24pXG5cbiAgICBjb25zdCBjb252ZXJnZUNvbGxlY3RvcjogQ29udmVyZ2VTdGF0aWNJckNvbGxlY3RvciA9IHtcbiAgICAgIHJlZ2lzdGVyOiAoaXIpID0+IHtcbiAgICAgICAgY29sbGVjdG9yLnJlZ2lzdGVyQ29udmVyZ2VTdGF0aWNJcihpcilcbiAgICAgIH0sXG4gICAgfVxuXG4gICAgY29uc3Qgc2lua3NMYXllciA9IGFwcGVuZFNpbmtzKFtjb2xsZWN0b3IuZGVidWdTaW5rIGFzIHVua25vd24gYXMgRGVidWdTaW5rXSlcbiAgICBjb25zdCBkaWFnbm9zdGljc0xheWVyID0gZGlhZ25vc3RpY3NMZXZlbChvcHRpb25zPy5kaWFnbm9zdGljc0xldmVsID8/ICdsaWdodCcpXG4gICAgY29uc3QgY29udmVyZ2VMYXllciA9IGFwcGVuZENvbnZlcmdlU3RhdGljSXJDb2xsZWN0b3JzKFtjb252ZXJnZUNvbGxlY3Rvcl0pXG4gICAgY29uc3QgY29sbGVjdG9yTGF5ZXIgPSBldmlkZW5jZUNvbGxlY3RvckxheWVyKGNvbGxlY3RvcilcbiAgICBjb25zdCBzZXNzaW9uTGF5ZXIgPSBydW5TZXNzaW9uTGF5ZXIoc2Vzc2lvbilcblxuICAgIGNvbnN0IG92ZXJyaWRlc0xheWVyID1cbiAgICAgIG9wdGlvbnM/LnJ1bnRpbWVTZXJ2aWNlc0luc3RhbmNlT3ZlcnJpZGVzICE9IG51bGxcbiAgICAgICAgPyAoTGF5ZXIuc3VjY2VlZChcbiAgICAgICAgICAgIFJ1bnRpbWVLZXJuZWwuUnVudGltZVNlcnZpY2VzSW5zdGFuY2VPdmVycmlkZXNUYWcsXG4gICAgICAgICAgICBvcHRpb25zLnJ1bnRpbWVTZXJ2aWNlc0luc3RhbmNlT3ZlcnJpZGVzLFxuICAgICAgICAgICkgYXMgTGF5ZXIuTGF5ZXI8YW55LCBuZXZlciwgbmV2ZXI+KVxuICAgICAgICA6IChMYXllci5lbXB0eSBhcyBMYXllci5MYXllcjxhbnksIG5ldmVyLCBuZXZlcj4pXG5cbiAgICBjb25zdCB0cmlhbExheWVyID0gTGF5ZXIubWVyZ2VBbGwoXG4gICAgICBvcHRpb25zPy5sYXllciA/PyAoTGF5ZXIuZW1wdHkgYXMgdW5rbm93biBhcyBMYXllci5MYXllcjxhbnksIGFueSwgYW55PiksXG4gICAgICBzZXNzaW9uTGF5ZXIsXG4gICAgICBjb2xsZWN0b3JMYXllcixcbiAgICAgIG92ZXJyaWRlc0xheWVyLFxuICAgICAgZGlhZ25vc3RpY3NMYXllcixcbiAgICAgIHNpbmtzTGF5ZXIsXG4gICAgICBjb252ZXJnZUxheWVyLFxuICAgICkgYXMgTGF5ZXIuTGF5ZXI8YW55LCBuZXZlciwgYW55PlxuXG4gICAgY29uc3Qgc2NvcGUgPSB5aWVsZCogU2NvcGUubWFrZSgpXG5cbiAgICBjb25zdCBleGl0ID0geWllbGQqIEVmZmVjdC5leGl0KHByb2dyYW0pLnBpcGUoRWZmZWN0LnByb3ZpZGVTZXJ2aWNlKFNjb3BlLlNjb3BlLCBzY29wZSksIEVmZmVjdC5wcm92aWRlKHRyaWFsTGF5ZXIpKVxuXG4gICAgeWllbGQqIFNjb3BlLmNsb3NlKHNjb3BlLCBleGl0KVxuXG4gICAgY29uc3QgZXZpZGVuY2UgPSBjb2xsZWN0b3IuZXhwb3J0RXZpZGVuY2VQYWNrYWdlKHtcbiAgICAgIG1heEV2ZW50czogb3B0aW9ucz8ubWF4RXZlbnRzLFxuICAgIH0pXG5cbiAgICByZXR1cm4geyBzZXNzaW9uLCBleGl0LCBldmlkZW5jZSB9IHNhdGlzZmllcyBUcmlhbFJ1blJlc3VsdDxBLCBFPlxuICB9KVxuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQU1BLElBQU0sV0FBVyxDQUFDLFVBQ2hCLE9BQU8sVUFBVSxZQUFZLFVBQVUsUUFBUSxDQUFDLE1BQU0sUUFBUSxLQUFLO0FBRXJFLElBQU0sZUFBZSxDQUFDLFVBQ3BCLFNBQVMsS0FBSyxLQUFLLE1BQU0sU0FBUyxnQkFBZ0IsU0FBUyxNQUFNLE1BQU07QUFFekUsSUFBTSxrQkFBa0IsQ0FBQyxVQUEyQjtBQUNsRCxNQUFJLGFBQWEsS0FBSyxHQUFHO0FBQ3ZCLFVBQU0sS0FBTSxNQUFNLE9BQWU7QUFDakMsV0FBTyxPQUFPLE9BQU8sWUFBWSxHQUFHLFNBQVMsSUFBSSxLQUFLO0FBQUEsRUFDeEQ7QUFFQSxNQUFJLFNBQVMsS0FBSyxHQUFHO0FBQ25CLFVBQU0sS0FBSyxNQUFNO0FBQ2pCLFFBQUksT0FBTyxPQUFPLFlBQVksR0FBRyxTQUFTLEVBQUcsUUFBTztBQUNwRCxVQUFNLE1BQU8sTUFBYztBQUMzQixRQUFJLFFBQVEsT0FBTyxRQUFRLFlBQVksT0FBTyxRQUFRLGFBQWE7QUFDakUsWUFBTSxRQUFTLElBQVk7QUFDM0IsVUFBSSxPQUFPLFVBQVUsWUFBWSxNQUFNLFNBQVMsRUFBRyxRQUFPO0FBQUEsSUFDNUQ7QUFBQSxFQUNGO0FBRUEsU0FBTztBQUNUO0FBRUEsSUFBTSxtQkFBbUIsQ0FBQyxVQUE0QjtBQUNwRCxNQUFJLGFBQWEsS0FBSyxFQUFHLFFB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QUEsRUFDRjtBQUVBLFFBQU0sYUFBYSxZQUFZLENBQUMsVUFBVSxTQUFpQyxDQUFDO0FBQzVFLFFBQU0sbUJBQW1CLGlCQUFpQixTQUFTLG9CQUFvQixPQUFPO0FBQzlFLFFBQU0sZ0JBQWdCLGlDQUFpQyxDQUFDLGlCQUFpQixDQUFDO0FBQzFFLFFBQU0saUJBQWlCLHVCQUF1QixTQUFTO0FBQ3ZELFFBQU0sZUFBZSxnQkFBZ0IsT0FBTztBQUU1QyxRQUFNLGlCQUNKLFNBQVMsb0NBQW9DLE9BQ3hDRSxPQUFNO0FBQUEsSUFDUztBQUFBLElBQ2QsUUFBUTtBQUFBLEVBQ1YsSUFDQ0EsT0FBTTtBQUViLFFBQU0sYUFBYUEsT0FBTTtBQUFBLElBQ3ZCLFNBQVMsU0FBVUEsT0FBTTtBQUFBLElBQ3pCO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxFQUNGO0FBRUEsUUFBTSxRQUFRLE9BQU8sTUFBTSxLQUFLO0FBRWhDLFFBQU0sT0FBTyxPQUFPRCxRQUFPLEtBQUssT0FBTyxFQUFFLEtBQUtBLFFBQU8sZUFBZSxNQUFNLE9BQU8sS0FBSyxHQUFHQSxRQUFPLFFBQVEsVUFBVSxDQUFDO0FBRW5ILFNBQU8sTUFBTSxNQUFNLE9BQU8sSUFBSTtBQUU5QixRQUFNLFdBQVcsVUFBVSxzQkFBc0I7QUFBQSxJQUMvQyxXQUFXLFNBQVM7QUFBQSxFQUN0QixDQUFDO0FBRUQsU0FBTyxFQUFFLFNBQVMsTUFBTSxTQUFTO0FBQ25DLENBQUM7IiwKICAibmFtZXMiOiBbImV4cG9ydFN0YXRpY0lyIiwgImlzUmVjb3JkIiwgImlzTW9kdWxlSW1wbCIsICJyZXNvbHZlTW9kdWxlSWQiLCAibmV4dCIsICJleHBvcnRTdGF0aWNJciIsICJDYXVzZSIsICJFZmZlY3QiLCAiTGF5ZXIiLCAiRWZmZWN0IiwgIkxheWVyIiwgImxheWVyIiwgIkxheWVyIiwgIkxheWVyIiwgIm1ha2UiLCAiTGF5ZXIiLCAiaXNSZWNvcmQiLCAidXRmOEJ5dGVMZW5ndGgiLCAiQ2F1c2UiLCAidG9FcnJvclN1bW1hcnlXaXRoQ29kZSIsICJFZmZlY3QiLCAibGF5ZXIiLCAiTGF5ZXIiLCAibWFrZSIsICJleHBvcnRTdGF0aWNJciIsICJFZmZlY3QiLCAiTGF5ZXIiLCAiZGVmYXVsdEhvc3QiLCAiRWZmZWN0IiwgIkxheWVyIl0KfQo=
|