@rpcbase/test 0.343.0 → 0.344.0
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/dist/clearDatabase.js +10 -12
- package/dist/clearDatabase.js.map +1 -1
- package/dist/cli.js +439 -556
- package/dist/cli.js.map +1 -1
- package/dist/coverage/collect.js +63 -101
- package/dist/coverage/collect.js.map +1 -1
- package/dist/coverage/config-loader.js +180 -230
- package/dist/coverage/config-loader.js.map +1 -1
- package/dist/coverage/config.js +76 -100
- package/dist/coverage/config.js.map +1 -1
- package/dist/coverage/console-text-report.js +175 -220
- package/dist/coverage/console-text-report.js.map +1 -1
- package/dist/coverage/files.js +45 -58
- package/dist/coverage/files.js.map +1 -1
- package/dist/coverage/fixtures.js +27 -38
- package/dist/coverage/fixtures.js.map +1 -1
- package/dist/coverage/global-setup.js +15 -18
- package/dist/coverage/global-setup.js.map +1 -1
- package/dist/coverage/index.js +38 -55
- package/dist/coverage/index.js.map +1 -1
- package/dist/coverage/report.js +341 -466
- package/dist/coverage/report.js.map +1 -1
- package/dist/coverage/reporter.js +47 -61
- package/dist/coverage/reporter.js.map +1 -1
- package/dist/coverage/v8-tracker.js +115 -147
- package/dist/coverage/v8-tracker.js.map +1 -1
- package/dist/index.js +46 -75
- package/dist/index.js.map +1 -1
- package/dist/runners/playwright.js +392 -490
- package/dist/runners/playwright.js.map +1 -1
- package/dist/runners/process.js +107 -142
- package/dist/runners/process.js.map +1 -1
- package/dist/runners/vitest.js +124 -171
- package/dist/runners/vitest.js.map +1 -1
- package/dist/serverCoverage.js +28 -42
- package/dist/serverCoverage.js.map +1 -1
- package/dist/vitest.config.d.ts +1 -1
- package/dist/vitest.config.js +62 -74
- package/dist/vitest.config.js.map +1 -1
- package/package.json +1 -1
package/dist/coverage/config.js
CHANGED
|
@@ -1,112 +1,88 @@
|
|
|
1
1
|
import path from "node:path";
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
2
|
+
//#region src/coverage/config.ts
|
|
3
|
+
var DEFAULT_THRESHOLDS = {
|
|
4
|
+
branches: 60,
|
|
5
|
+
functions: 75,
|
|
6
|
+
lines: 75,
|
|
7
|
+
statements: 75
|
|
7
8
|
};
|
|
8
|
-
|
|
9
|
-
|
|
9
|
+
var THRESHOLD_KEYS = Object.keys(DEFAULT_THRESHOLDS);
|
|
10
|
+
var THRESHOLD_KEY_SET = new Set(THRESHOLD_KEYS);
|
|
10
11
|
function createCoverageConfig(options) {
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
testResultsRoot,
|
|
36
|
-
coverageReportDir,
|
|
37
|
-
coverageFileName,
|
|
38
|
-
thresholds,
|
|
39
|
-
thresholdTargets,
|
|
40
|
-
coverageEnabled,
|
|
41
|
-
disabledEnvVar,
|
|
42
|
-
includeAllFiles
|
|
43
|
-
};
|
|
12
|
+
const { rootDir } = options;
|
|
13
|
+
if (!rootDir) throw new Error("createCoverageConfig requires a rootDir");
|
|
14
|
+
const resolvedRootDir = path.resolve(rootDir);
|
|
15
|
+
const includeAllFiles = options.includeAllFiles !== false;
|
|
16
|
+
const collectCoverageFrom = Array.isArray(options.collectCoverageFrom) ? options.collectCoverageFrom.map((pattern) => String(pattern ?? "").trim()).filter((pattern) => pattern.length > 0) : [];
|
|
17
|
+
if (collectCoverageFrom.length === 0) throw new Error("createCoverageConfig requires a collectCoverageFrom option");
|
|
18
|
+
const testResultsRoot = path.join(resolvedRootDir, "build", "coverage");
|
|
19
|
+
const coverageReportDir = path.join(testResultsRoot, "report");
|
|
20
|
+
const coverageFileName = options.coverageFileName ?? "v8-coverage.json";
|
|
21
|
+
const disabledEnvVar = options.disabledEnvVar ?? "RB_DISABLE_COVERAGE";
|
|
22
|
+
const coverageEnabled = process.env[disabledEnvVar] !== "1";
|
|
23
|
+
const { global: thresholds, targets: thresholdTargets } = normalizeThresholdOptions(options.thresholds);
|
|
24
|
+
return {
|
|
25
|
+
rootDir: resolvedRootDir,
|
|
26
|
+
collectCoverageFrom,
|
|
27
|
+
testResultsRoot,
|
|
28
|
+
coverageReportDir,
|
|
29
|
+
coverageFileName,
|
|
30
|
+
thresholds,
|
|
31
|
+
thresholdTargets,
|
|
32
|
+
coverageEnabled,
|
|
33
|
+
disabledEnvVar,
|
|
34
|
+
includeAllFiles
|
|
35
|
+
};
|
|
44
36
|
}
|
|
45
37
|
function normalizeThresholdOptions(rawThresholds) {
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
id: pattern,
|
|
78
|
-
pattern,
|
|
79
|
-
thresholds: {
|
|
80
|
-
...globalThresholds,
|
|
81
|
-
...pickThresholdOverrides(overrides)
|
|
82
|
-
}
|
|
83
|
-
});
|
|
84
|
-
}
|
|
85
|
-
return {
|
|
86
|
-
global: globalThresholds,
|
|
87
|
-
targets
|
|
88
|
-
};
|
|
38
|
+
const globalThresholds = { ...DEFAULT_THRESHOLDS };
|
|
39
|
+
const targets = [];
|
|
40
|
+
if (!isPlainObject(rawThresholds)) return {
|
|
41
|
+
global: globalThresholds,
|
|
42
|
+
targets
|
|
43
|
+
};
|
|
44
|
+
const thresholdMap = rawThresholds;
|
|
45
|
+
for (const key of THRESHOLD_KEYS) {
|
|
46
|
+
const value = thresholdMap[key];
|
|
47
|
+
if (isThresholdValue(value)) globalThresholds[key] = value;
|
|
48
|
+
}
|
|
49
|
+
if (Object.prototype.hasOwnProperty.call(thresholdMap, "global")) {
|
|
50
|
+
if (!isPlainObject(thresholdMap.global)) throw new Error("coverage thresholds: the `global` override must be an object of metric values");
|
|
51
|
+
Object.assign(globalThresholds, pickThresholdOverrides(thresholdMap.global));
|
|
52
|
+
}
|
|
53
|
+
for (const [pattern, overrides] of Object.entries(thresholdMap)) {
|
|
54
|
+
if (pattern === "global" || THRESHOLD_KEY_SET.has(pattern)) continue;
|
|
55
|
+
if (!isPlainObject(overrides)) throw new Error(`coverage thresholds: override for "${pattern}" must be an object containing coverage metrics`);
|
|
56
|
+
targets.push({
|
|
57
|
+
id: pattern,
|
|
58
|
+
pattern,
|
|
59
|
+
thresholds: {
|
|
60
|
+
...globalThresholds,
|
|
61
|
+
...pickThresholdOverrides(overrides)
|
|
62
|
+
}
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
return {
|
|
66
|
+
global: globalThresholds,
|
|
67
|
+
targets
|
|
68
|
+
};
|
|
89
69
|
}
|
|
90
70
|
function pickThresholdOverrides(source) {
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
overrides[key] = value;
|
|
99
|
-
}
|
|
100
|
-
}
|
|
101
|
-
return overrides;
|
|
71
|
+
const overrides = {};
|
|
72
|
+
if (!isPlainObject(source)) return overrides;
|
|
73
|
+
for (const key of THRESHOLD_KEYS) {
|
|
74
|
+
const value = source[key];
|
|
75
|
+
if (isThresholdValue(value)) overrides[key] = value;
|
|
76
|
+
}
|
|
77
|
+
return overrides;
|
|
102
78
|
}
|
|
103
79
|
function isPlainObject(value) {
|
|
104
|
-
|
|
80
|
+
return value !== null && typeof value === "object" && !Array.isArray(value);
|
|
105
81
|
}
|
|
106
82
|
function isThresholdValue(value) {
|
|
107
|
-
|
|
83
|
+
return typeof value === "number" && Number.isFinite(value);
|
|
108
84
|
}
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
//# sourceMappingURL=config.js.map
|
|
85
|
+
//#endregion
|
|
86
|
+
export { createCoverageConfig };
|
|
87
|
+
|
|
88
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sources":["../../src/coverage/config.ts"],"sourcesContent":["import path from \"node:path\"\n\nimport type { CoverageConfig, CoverageHarnessOptions, CoverageThresholdMap, CoverageThresholdOption, CoverageThresholdTarget, CoverageThresholds } from \"./types\"\n\n\nconst DEFAULT_THRESHOLDS = {\n branches: 60,\n functions: 75,\n lines: 75,\n statements: 75,\n}\n\nconst THRESHOLD_KEYS = Object.keys(DEFAULT_THRESHOLDS) as Array<keyof CoverageThresholds>\nconst THRESHOLD_KEY_SET = new Set<string>(THRESHOLD_KEYS as string[])\n\nexport function createCoverageConfig(options: CoverageHarnessOptions): CoverageConfig {\n const { rootDir } = options as CoverageHarnessOptions\n if (!rootDir) {\n throw new Error(\"createCoverageConfig requires a rootDir\")\n }\n\n const resolvedRootDir = path.resolve(rootDir)\n const includeAllFiles = options.includeAllFiles !== false\n\n const collectCoverageFrom = Array.isArray(options.collectCoverageFrom)\n ? options.collectCoverageFrom\n .map((pattern) => String(pattern ?? \"\").trim())\n .filter((pattern) => pattern.length > 0)\n : []\n\n if (collectCoverageFrom.length === 0) {\n throw new Error(\"createCoverageConfig requires a collectCoverageFrom option\")\n }\n\n const testResultsRoot = path.join(resolvedRootDir, \"build\", \"coverage\")\n const coverageReportDir = path.join(testResultsRoot, \"report\")\n const coverageFileName = options.coverageFileName ?? \"v8-coverage.json\"\n const disabledEnvVar = options.disabledEnvVar ?? \"RB_DISABLE_COVERAGE\"\n const coverageEnabled = process.env[disabledEnvVar] !== \"1\"\n\n const { global: thresholds, targets: thresholdTargets } = normalizeThresholdOptions(options.thresholds)\n\n return {\n rootDir: resolvedRootDir,\n collectCoverageFrom,\n testResultsRoot,\n coverageReportDir,\n coverageFileName,\n thresholds,\n thresholdTargets,\n coverageEnabled,\n disabledEnvVar,\n includeAllFiles,\n }\n}\n\nfunction normalizeThresholdOptions(rawThresholds: CoverageThresholdOption | undefined): {\n global: CoverageThresholds\n targets: CoverageThresholdTarget[]\n} {\n const globalThresholds: CoverageThresholds = { ...DEFAULT_THRESHOLDS }\n const targets: CoverageThresholdTarget[] = []\n\n if (!isPlainObject(rawThresholds)) {\n return { global: globalThresholds, targets }\n }\n\n const thresholdMap = rawThresholds as CoverageThresholdMap\n\n for (const key of THRESHOLD_KEYS) {\n const value = thresholdMap[key]\n if (isThresholdValue(value)) {\n globalThresholds[key] = value\n }\n }\n\n if (Object.prototype.hasOwnProperty.call(thresholdMap, \"global\")) {\n if (!isPlainObject(thresholdMap.global)) {\n throw new Error(\"coverage thresholds: the `global` override must be an object of metric values\")\n }\n Object.assign(globalThresholds, pickThresholdOverrides(thresholdMap.global))\n }\n\n for (const [pattern, overrides] of Object.entries(thresholdMap)) {\n if (pattern === \"global\" || THRESHOLD_KEY_SET.has(pattern)) {\n continue\n }\n\n if (!isPlainObject(overrides)) {\n throw new Error(\n `coverage thresholds: override for \"${pattern}\" must be an object containing coverage metrics`,\n )\n }\n\n targets.push({\n id: pattern,\n pattern,\n thresholds: {\n ...globalThresholds,\n ...pickThresholdOverrides(overrides),\n },\n })\n }\n\n return { global: globalThresholds, targets }\n}\n\nfunction pickThresholdOverrides(source: unknown): Partial<CoverageThresholds> {\n const overrides: Partial<CoverageThresholds> = {}\n if (!isPlainObject(source)) {\n return overrides\n }\n\n for (const key of THRESHOLD_KEYS) {\n const value = (source as any)[key]\n if (isThresholdValue(value)) {\n overrides[key] = value\n }\n }\n\n return overrides\n}\n\nfunction isPlainObject(value: unknown): value is Record<string, unknown> {\n return value !== null && typeof value === \"object\" && !Array.isArray(value)\n}\n\nfunction isThresholdValue(value: unknown): value is number {\n return typeof value === \"number\" && Number.isFinite(value)\n}\n"],"
|
|
1
|
+
{"version":3,"file":"config.js","names":["path","CoverageConfig","CoverageHarnessOptions","CoverageThresholdMap","CoverageThresholdOption","CoverageThresholdTarget","CoverageThresholds","DEFAULT_THRESHOLDS","branches","functions","lines","statements","THRESHOLD_KEYS","Object","keys","Array","THRESHOLD_KEY_SET","Set","createCoverageConfig","options","rootDir","Error","resolvedRootDir","resolve","includeAllFiles","collectCoverageFrom","isArray","map","pattern","String","trim","filter","length","testResultsRoot","join","coverageReportDir","coverageFileName","disabledEnvVar","coverageEnabled","process","env","global","thresholds","targets","thresholdTargets","normalizeThresholdOptions","rawThresholds","globalThresholds","isPlainObject","thresholdMap","key","value","isThresholdValue","prototype","hasOwnProperty","call","assign","pickThresholdOverrides","overrides","entries","has","push","id","source","Partial","Record","Number","isFinite"],"sources":["../../src/coverage/config.ts"],"sourcesContent":["import path from \"node:path\"\n\nimport type { CoverageConfig, CoverageHarnessOptions, CoverageThresholdMap, CoverageThresholdOption, CoverageThresholdTarget, CoverageThresholds } from \"./types\"\n\n\nconst DEFAULT_THRESHOLDS = {\n branches: 60,\n functions: 75,\n lines: 75,\n statements: 75,\n}\n\nconst THRESHOLD_KEYS = Object.keys(DEFAULT_THRESHOLDS) as Array<keyof CoverageThresholds>\nconst THRESHOLD_KEY_SET = new Set<string>(THRESHOLD_KEYS as string[])\n\nexport function createCoverageConfig(options: CoverageHarnessOptions): CoverageConfig {\n const { rootDir } = options as CoverageHarnessOptions\n if (!rootDir) {\n throw new Error(\"createCoverageConfig requires a rootDir\")\n }\n\n const resolvedRootDir = path.resolve(rootDir)\n const includeAllFiles = options.includeAllFiles !== false\n\n const collectCoverageFrom = Array.isArray(options.collectCoverageFrom)\n ? options.collectCoverageFrom\n .map((pattern) => String(pattern ?? \"\").trim())\n .filter((pattern) => pattern.length > 0)\n : []\n\n if (collectCoverageFrom.length === 0) {\n throw new Error(\"createCoverageConfig requires a collectCoverageFrom option\")\n }\n\n const testResultsRoot = path.join(resolvedRootDir, \"build\", \"coverage\")\n const coverageReportDir = path.join(testResultsRoot, \"report\")\n const coverageFileName = options.coverageFileName ?? \"v8-coverage.json\"\n const disabledEnvVar = options.disabledEnvVar ?? \"RB_DISABLE_COVERAGE\"\n const coverageEnabled = process.env[disabledEnvVar] !== \"1\"\n\n const { global: thresholds, targets: thresholdTargets } = normalizeThresholdOptions(options.thresholds)\n\n return {\n rootDir: resolvedRootDir,\n collectCoverageFrom,\n testResultsRoot,\n coverageReportDir,\n coverageFileName,\n thresholds,\n thresholdTargets,\n coverageEnabled,\n disabledEnvVar,\n includeAllFiles,\n }\n}\n\nfunction normalizeThresholdOptions(rawThresholds: CoverageThresholdOption | undefined): {\n global: CoverageThresholds\n targets: CoverageThresholdTarget[]\n} {\n const globalThresholds: CoverageThresholds = { ...DEFAULT_THRESHOLDS }\n const targets: CoverageThresholdTarget[] = []\n\n if (!isPlainObject(rawThresholds)) {\n return { global: globalThresholds, targets }\n }\n\n const thresholdMap = rawThresholds as CoverageThresholdMap\n\n for (const key of THRESHOLD_KEYS) {\n const value = thresholdMap[key]\n if (isThresholdValue(value)) {\n globalThresholds[key] = value\n }\n }\n\n if (Object.prototype.hasOwnProperty.call(thresholdMap, \"global\")) {\n if (!isPlainObject(thresholdMap.global)) {\n throw new Error(\"coverage thresholds: the `global` override must be an object of metric values\")\n }\n Object.assign(globalThresholds, pickThresholdOverrides(thresholdMap.global))\n }\n\n for (const [pattern, overrides] of Object.entries(thresholdMap)) {\n if (pattern === \"global\" || THRESHOLD_KEY_SET.has(pattern)) {\n continue\n }\n\n if (!isPlainObject(overrides)) {\n throw new Error(\n `coverage thresholds: override for \"${pattern}\" must be an object containing coverage metrics`,\n )\n }\n\n targets.push({\n id: pattern,\n pattern,\n thresholds: {\n ...globalThresholds,\n ...pickThresholdOverrides(overrides),\n },\n })\n }\n\n return { global: globalThresholds, targets }\n}\n\nfunction pickThresholdOverrides(source: unknown): Partial<CoverageThresholds> {\n const overrides: Partial<CoverageThresholds> = {}\n if (!isPlainObject(source)) {\n return overrides\n }\n\n for (const key of THRESHOLD_KEYS) {\n const value = (source as any)[key]\n if (isThresholdValue(value)) {\n overrides[key] = value\n }\n }\n\n return overrides\n}\n\nfunction isPlainObject(value: unknown): value is Record<string, unknown> {\n return value !== null && typeof value === \"object\" && !Array.isArray(value)\n}\n\nfunction isThresholdValue(value: unknown): value is number {\n return typeof value === \"number\" && Number.isFinite(value)\n}\n"],"mappings":";;AAKA,IAAMO,qBAAqB;CACzBC,UAAU;CACVC,WAAW;CACXC,OAAO;CACPC,YAAY;CACb;AAED,IAAMC,iBAAiBC,OAAOC,KAAKP,mBAAmB;AACtD,IAAMS,oBAAoB,IAAIC,IAAYL,eAA2B;AAErE,SAAgBM,qBAAqBC,SAAiD;CACpF,MAAM,EAAEC,YAAYD;AACpB,KAAI,CAACC,QACH,OAAM,IAAIC,MAAM,0CAA0C;CAG5D,MAAMC,kBAAkBtB,KAAKuB,QAAQH,QAAQ;CAC7C,MAAMI,kBAAkBL,QAAQK,oBAAoB;CAEpD,MAAMC,sBAAsBV,MAAMW,QAAQP,QAAQM,oBAAoB,GAClEN,QAAQM,oBACLE,KAAKC,YAAYC,OAAOD,WAAW,GAAG,CAACE,MAAM,CAAC,CAC9CC,QAAQH,YAAYA,QAAQI,SAAS,EAAE,GAC1C,EAAE;AAEN,KAAIP,oBAAoBO,WAAW,EACjC,OAAM,IAAIX,MAAM,6DAA6D;CAG/E,MAAMY,kBAAkBjC,KAAKkC,KAAKZ,iBAAiB,SAAS,WAAW;CACvE,MAAMa,oBAAoBnC,KAAKkC,KAAKD,iBAAiB,SAAS;CAC9D,MAAMG,mBAAmBjB,QAAQiB,oBAAoB;CACrD,MAAMC,iBAAiBlB,QAAQkB,kBAAkB;CACjD,MAAMC,kBAAkBC,QAAQC,IAAIH,oBAAoB;CAExD,MAAM,EAAEI,QAAQC,YAAYC,SAASC,qBAAqBC,0BAA0B1B,QAAQuB,WAAW;AAEvG,QAAO;EACLtB,SAASE;EACTG;EACAQ;EACAE;EACAC;EACAM;EACAE;EACAN;EACAD;EACAb;EACD;;AAGH,SAASqB,0BAA0BC,eAGjC;CACA,MAAMC,mBAAuC,EAAE,GAAGxC,oBAAoB;CACtE,MAAMoC,UAAqC,EAAE;AAE7C,KAAI,CAACK,cAAcF,cAAc,CAC/B,QAAO;EAAEL,QAAQM;EAAkBJ;EAAS;CAG9C,MAAMM,eAAeH;AAErB,MAAK,MAAMI,OAAOtC,gBAAgB;EAChC,MAAMuC,QAAQF,aAAaC;AAC3B,MAAIE,iBAAiBD,MAAM,CACzBJ,kBAAiBG,OAAOC;;AAI5B,KAAItC,OAAOwC,UAAUC,eAAeC,KAAKN,cAAc,SAAS,EAAE;AAChE,MAAI,CAACD,cAAcC,aAAaR,OAAO,CACrC,OAAM,IAAIpB,MAAM,gFAAgF;AAElGR,SAAO2C,OAAOT,kBAAkBU,uBAAuBR,aAAaR,OAAO,CAAC;;AAG9E,MAAK,MAAM,CAACb,SAAS8B,cAAc7C,OAAO8C,QAAQV,aAAa,EAAE;AAC/D,MAAIrB,YAAY,YAAYZ,kBAAkB4C,IAAIhC,QAAQ,CACxD;AAGF,MAAI,CAACoB,cAAcU,UAAU,CAC3B,OAAM,IAAIrC,MACR,sCAAsCO,QAAO,iDAC9C;AAGHe,UAAQkB,KAAK;GACXC,IAAIlC;GACJA;GACAc,YAAY;IACV,GAAGK;IACH,GAAGU,uBAAuBC,UAAS;IACrC;GACD,CAAC;;AAGJ,QAAO;EAAEjB,QAAQM;EAAkBJ;EAAS;;AAG9C,SAASc,uBAAuBM,QAA8C;CAC5E,MAAML,YAAyC,EAAE;AACjD,KAAI,CAACV,cAAce,OAAO,CACxB,QAAOL;AAGT,MAAK,MAAMR,OAAOtC,gBAAgB;EAChC,MAAMuC,QAASY,OAAeb;AAC9B,MAAIE,iBAAiBD,MAAM,CACzBO,WAAUR,OAAOC;;AAIrB,QAAOO;;AAGT,SAASV,cAAcG,OAAkD;AACvE,QAAOA,UAAU,QAAQ,OAAOA,UAAU,YAAY,CAACpC,MAAMW,QAAQyB,MAAM;;AAG7E,SAASC,iBAAiBD,OAAiC;AACzD,QAAO,OAAOA,UAAU,YAAYe,OAAOC,SAAShB,MAAM"}
|