@debuffjp/cli 0.0.0-stage → 0.2.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/README.md +86 -2
- package/aseprite/new-font.lua +31 -0
- package/bin/debuff.js +3 -0
- package/client.d.ts +3 -0
- package/dist/agent-link.d.ts +28 -0
- package/dist/agent-link.d.ts.map +1 -0
- package/dist/agent-link.js +122 -0
- package/dist/agent-link.js.map +1 -0
- package/dist/assets/aseprite.d.ts +29 -0
- package/dist/assets/aseprite.d.ts.map +1 -0
- package/dist/assets/aseprite.js +107 -0
- package/dist/assets/aseprite.js.map +1 -0
- package/dist/assets/atlas.d.ts +58 -0
- package/dist/assets/atlas.d.ts.map +1 -0
- package/dist/assets/atlas.js +164 -0
- package/dist/assets/atlas.js.map +1 -0
- package/dist/assets/builtin.d.ts +5 -0
- package/dist/assets/builtin.d.ts.map +1 -0
- package/dist/assets/builtin.js +47 -0
- package/dist/assets/builtin.js.map +1 -0
- package/dist/assets/command.d.ts +4 -0
- package/dist/assets/command.d.ts.map +1 -0
- package/dist/assets/command.js +35 -0
- package/dist/assets/command.js.map +1 -0
- package/dist/assets/compile.d.ts +29 -0
- package/dist/assets/compile.d.ts.map +1 -0
- package/dist/assets/compile.js +209 -0
- package/dist/assets/compile.js.map +1 -0
- package/dist/assets/index.d.ts +6 -0
- package/dist/assets/index.d.ts.map +1 -0
- package/dist/assets/index.js +6 -0
- package/dist/assets/index.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +257 -0
- package/dist/cli.js.map +1 -0
- package/dist/config.d.ts +24 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +53 -0
- package/dist/config.js.map +1 -0
- package/dist/fuzz.d.ts +43 -0
- package/dist/fuzz.d.ts.map +1 -0
- package/dist/fuzz.js +229 -0
- package/dist/fuzz.js.map +1 -0
- package/dist/index.d.ts +12 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +11 -0
- package/dist/index.js.map +1 -0
- package/dist/inspect.d.ts +35 -0
- package/dist/inspect.d.ts.map +1 -0
- package/dist/inspect.js +37 -0
- package/dist/inspect.js.map +1 -0
- package/dist/plugin.d.ts +146 -0
- package/dist/plugin.d.ts.map +1 -0
- package/dist/plugin.js +2 -0
- package/dist/plugin.js.map +1 -0
- package/dist/report.d.ts +26 -0
- package/dist/report.d.ts.map +1 -0
- package/dist/report.js +80 -0
- package/dist/report.js.map +1 -0
- package/dist/scenario/browser.d.ts +12 -0
- package/dist/scenario/browser.d.ts.map +1 -0
- package/dist/scenario/browser.js +59 -0
- package/dist/scenario/browser.js.map +1 -0
- package/dist/scenario/index.d.ts +5 -0
- package/dist/scenario/index.d.ts.map +1 -0
- package/dist/scenario/index.js +4 -0
- package/dist/scenario/index.js.map +1 -0
- package/dist/scenario/run.d.ts +14 -0
- package/dist/scenario/run.d.ts.map +1 -0
- package/dist/scenario/run.js +255 -0
- package/dist/scenario/run.js.map +1 -0
- package/dist/scenario/schema.d.ts +8 -0
- package/dist/scenario/schema.d.ts.map +1 -0
- package/dist/scenario/schema.js +23 -0
- package/dist/scenario/schema.js.map +1 -0
- package/dist/scenario/types.d.ts +103 -0
- package/dist/scenario/types.d.ts.map +1 -0
- package/dist/scenario/types.js +2 -0
- package/dist/scenario/types.js.map +1 -0
- package/dist/vite-plugin.d.ts +18 -0
- package/dist/vite-plugin.d.ts.map +1 -0
- package/dist/vite-plugin.js +122 -0
- package/dist/vite-plugin.js.map +1 -0
- package/dist/vite.d.ts +13 -0
- package/dist/vite.d.ts.map +1 -0
- package/dist/vite.js +25 -0
- package/dist/vite.js.map +1 -0
- package/package.json +71 -4
- package/schema/scenario.schema.json +120 -0
package/dist/cli.js
ADDED
|
@@ -0,0 +1,257 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { mkdirSync, readFileSync, writeFileSync } from "node:fs";
|
|
3
|
+
import { join, resolve } from "node:path";
|
|
4
|
+
import * as p from "@clack/prompts";
|
|
5
|
+
import cac from "cac";
|
|
6
|
+
import { amber, banner, lime, paint, pink, sky } from "create-debuff";
|
|
7
|
+
import pc from "picocolors";
|
|
8
|
+
import { compileAssets, findUnused } from "./assets/index.js";
|
|
9
|
+
import { loadConfig } from "./config.js";
|
|
10
|
+
import { inspectProject } from "./inspect.js";
|
|
11
|
+
import { buildReport, formatReport } from "./report.js";
|
|
12
|
+
import { createDevServer, viteConfig } from "./vite.js";
|
|
13
|
+
const cli = cac("debuff");
|
|
14
|
+
const version = JSON.parse(readFileSync(new URL("../package.json", import.meta.url), "utf8")).version;
|
|
15
|
+
const rootOf = (o) => resolve(o.root ?? process.cwd());
|
|
16
|
+
/** Command header: buff beside the name, version, command and a tagline. */
|
|
17
|
+
const header = (title, tagline) => console.log(`\n${banner("idle", [`${lime(pc.bold("debuff"))} ${pc.dim(`v${version}`)}`, pc.bold(title), pc.dim(pc.italic(tagline))])}\n`);
|
|
18
|
+
/** Result footer: buff reacts to how it went. */
|
|
19
|
+
const finish = (ok, title, detail = "") => console.log(`\n${banner(ok ? "happy" : "oops", [ok ? lime(pc.bold(title)) : paint("red", pc.bold(title)), detail, ""])}\n`);
|
|
20
|
+
const violetType = (type) => paint("violet", type);
|
|
21
|
+
cli
|
|
22
|
+
.command("create [dir]", "Scaffold a new game")
|
|
23
|
+
.option("--template <id>", "Template to use")
|
|
24
|
+
.option("-y, --yes", "Accept defaults without prompting")
|
|
25
|
+
.action(async (dir, o) => {
|
|
26
|
+
const { runCreate } = await import("create-debuff");
|
|
27
|
+
return runCreate({ dir, template: o.template, yes: o.yes ?? false });
|
|
28
|
+
});
|
|
29
|
+
cli
|
|
30
|
+
.command("dev", "Start the dev server with hot reload")
|
|
31
|
+
.option("--root <dir>", "Project root")
|
|
32
|
+
.option("--port <port>", "Port", { default: 5173 })
|
|
33
|
+
.option("--host", "Expose on the local network (test on phones)")
|
|
34
|
+
.action(async (o) => {
|
|
35
|
+
const server = await createDevServer(rootOf(o), { port: o.port, host: o.host ?? false, agentLink: true });
|
|
36
|
+
await server.listen();
|
|
37
|
+
header("dev server", "more room for play");
|
|
38
|
+
for (const url of server.resolvedUrls?.local ?? [])
|
|
39
|
+
console.log(` ${lime("➜")} ${pc.bold("local")} ${sky(url)}`);
|
|
40
|
+
for (const url of server.resolvedUrls?.network ?? [])
|
|
41
|
+
console.log(` ${lime("➜")} ${pc.bold("network")} ${sky(url)}`);
|
|
42
|
+
console.log(`\n ${pc.dim("press")} ${amber("`")} ${pc.dim("in the game for the dev overlay ·")} ${pink("h + enter")} ${pc.dim("for shortcuts")}\n`);
|
|
43
|
+
server.bindCLIShortcuts({ print: false });
|
|
44
|
+
return new Promise(() => { });
|
|
45
|
+
});
|
|
46
|
+
cli
|
|
47
|
+
.command("build", "Production build with size report; fails if dev code leaks")
|
|
48
|
+
.option("--root <dir>", "Project root")
|
|
49
|
+
.option("--json", "Machine-readable report")
|
|
50
|
+
.option("--sourcemap", "Emit source maps")
|
|
51
|
+
.action(async (o) => {
|
|
52
|
+
const root = rootOf(o);
|
|
53
|
+
const { build } = await import("vite");
|
|
54
|
+
if (!o.json)
|
|
55
|
+
header("build", "shipping only what you use");
|
|
56
|
+
const s = o.json ? undefined : p.spinner();
|
|
57
|
+
s?.start("Bundling");
|
|
58
|
+
await build(await viteConfig(root, { logLevel: "error", build: { sourcemap: o.sourcemap ?? false } }));
|
|
59
|
+
s?.stop("Bundled");
|
|
60
|
+
return report(root, o.json ?? false);
|
|
61
|
+
});
|
|
62
|
+
cli
|
|
63
|
+
.command("report", "Size report for an existing build")
|
|
64
|
+
.option("--root <dir>", "Project root")
|
|
65
|
+
.option("--json", "Machine-readable output")
|
|
66
|
+
.action((o) => report(rootOf(o), o.json ?? false));
|
|
67
|
+
cli
|
|
68
|
+
.command("assets", "Run the asset pipeline and print the manifest summary")
|
|
69
|
+
.option("--root <dir>", "Project root")
|
|
70
|
+
.option("--json", "Print the full manifest and diagnostics as JSON")
|
|
71
|
+
.action(async (o) => {
|
|
72
|
+
const root = rootOf(o);
|
|
73
|
+
const config = await loadConfig(root);
|
|
74
|
+
const { manifest, warnings, importedBy, outputs } = await compileAssets(root, { plugins: config.plugins, atlas: config.atlas });
|
|
75
|
+
const unused = findUnused(root, manifest);
|
|
76
|
+
const count = Object.keys(manifest.assets).length;
|
|
77
|
+
if (o.json) {
|
|
78
|
+
console.log(JSON.stringify({ manifest, importedBy, generated: [...outputs.keys()], warnings, unused }, null, 2));
|
|
79
|
+
return 0;
|
|
80
|
+
}
|
|
81
|
+
header("assets", "your source files, never touched");
|
|
82
|
+
for (const [id, a] of Object.entries(manifest.assets)) {
|
|
83
|
+
const packed = a.rect ? ` · ${sky(`atlas ${a.src.slice(a.src.lastIndexOf("/") + 1)}`)}` : "";
|
|
84
|
+
p.log.message(`${pink(id)} ${violetType(a.type)} ${pc.dim(`${(a.bytes / 1024).toFixed(1)} kB · ${importedBy[id]}`)}${packed}`);
|
|
85
|
+
}
|
|
86
|
+
p.log.success(`${count} assets${outputs.size ? `, ${outputs.size} generated` : ""}`);
|
|
87
|
+
for (const w of warnings)
|
|
88
|
+
p.log.warn(w);
|
|
89
|
+
if (unused.length)
|
|
90
|
+
p.log.info(`Possibly unused (no id reference in src/): ${unused.map((u) => amber(u)).join(", ")}`);
|
|
91
|
+
finish(true, `${count} assets ready`, outputs.size ? sky(`${outputs.size} generated`) : "");
|
|
92
|
+
return 0;
|
|
93
|
+
});
|
|
94
|
+
cli
|
|
95
|
+
.command("scenario [...files]", "Run scenarios/*.json in a headless browser")
|
|
96
|
+
.option("--root <dir>", "Project root")
|
|
97
|
+
.option("--update", "Overwrite baselines with new captures")
|
|
98
|
+
.option("--strict", "Fail when a baseline is missing (use in CI)")
|
|
99
|
+
.option("--json", "Machine-readable output")
|
|
100
|
+
.action(async (files, o) => {
|
|
101
|
+
const { runScenarios, formatScenario } = await import("./scenario/index.js");
|
|
102
|
+
// Never let an early exit read as success in CI.
|
|
103
|
+
let finished = false;
|
|
104
|
+
process.once("exit", (code) => {
|
|
105
|
+
if (!finished && code === 0)
|
|
106
|
+
process.exitCode = 1;
|
|
107
|
+
});
|
|
108
|
+
if (!o.json) {
|
|
109
|
+
header("scenarios", "same inputs, same game");
|
|
110
|
+
// A spinner here cancels itself when the browser process starts, so use a plain status line.
|
|
111
|
+
p.log.step("Starting dev server and browser");
|
|
112
|
+
}
|
|
113
|
+
const root = rootOf(o);
|
|
114
|
+
const { plugins } = await loadConfig(root);
|
|
115
|
+
// Write the scenario schema including plugin steps, so editors and agents can validate them.
|
|
116
|
+
const { scenarioSchema } = await import("./scenario/index.js");
|
|
117
|
+
mkdirSync(join(root, ".debuff"), { recursive: true });
|
|
118
|
+
writeFileSync(join(root, ".debuff", "scenario.schema.json"), `${JSON.stringify(scenarioSchema(plugins), null, 2)}
|
|
119
|
+
`);
|
|
120
|
+
const reports = await runScenarios({ root, files, plugins, update: o.update ?? false, strict: o.strict ?? false });
|
|
121
|
+
finished = true;
|
|
122
|
+
const failed = reports.filter((r) => !r.ok).length;
|
|
123
|
+
if (o.json)
|
|
124
|
+
console.log(JSON.stringify(reports, null, 2));
|
|
125
|
+
else {
|
|
126
|
+
for (const r of reports) {
|
|
127
|
+
const text = formatScenario(r);
|
|
128
|
+
if (r.ok)
|
|
129
|
+
p.log.success(text);
|
|
130
|
+
else
|
|
131
|
+
p.log.error(text);
|
|
132
|
+
}
|
|
133
|
+
const summary = `${reports.length - failed}/${reports.length} scenarios passed`;
|
|
134
|
+
finish(!failed, summary, failed ? amber("details in .debuff/reports/") : "");
|
|
135
|
+
}
|
|
136
|
+
return failed ? 1 : 0;
|
|
137
|
+
});
|
|
138
|
+
cli
|
|
139
|
+
.command("fuzz", "Play the game with random input to find crashes, stuck states and loops")
|
|
140
|
+
.option("--root <dir>", "Project root")
|
|
141
|
+
.option("--seconds <n>", "Simulated seconds of play per run", { default: 60 })
|
|
142
|
+
.option("--runs <n>", "Independent runs", { default: 3 })
|
|
143
|
+
.option("--seed <n>", "Input seed, to repeat a run exactly")
|
|
144
|
+
.option("--keys <codes>", "Comma-separated KeyboardEvent.code values to press")
|
|
145
|
+
.option("--json", "Machine-readable output")
|
|
146
|
+
.action(async (o) => {
|
|
147
|
+
const { runFuzz } = await import("./fuzz.js");
|
|
148
|
+
if (!o.json) {
|
|
149
|
+
header("fuzz", "random hands, real bugs");
|
|
150
|
+
p.log.step(`Playing ${o.runs} × ${o.seconds} s with random input`);
|
|
151
|
+
}
|
|
152
|
+
const report = await runFuzz({
|
|
153
|
+
root: rootOf(o),
|
|
154
|
+
seconds: Number(o.seconds),
|
|
155
|
+
runs: Number(o.runs),
|
|
156
|
+
...(o.seed === undefined ? {} : { seed: Number(o.seed) }),
|
|
157
|
+
...(o.keys
|
|
158
|
+
? {
|
|
159
|
+
keys: o.keys
|
|
160
|
+
.split(",")
|
|
161
|
+
.map((k) => k.trim())
|
|
162
|
+
.filter(Boolean),
|
|
163
|
+
}
|
|
164
|
+
: {}),
|
|
165
|
+
});
|
|
166
|
+
const errors = report.findings.filter((f) => f.kind === "error");
|
|
167
|
+
if (o.json)
|
|
168
|
+
console.log(JSON.stringify(report, null, 2));
|
|
169
|
+
else {
|
|
170
|
+
for (const f of report.findings) {
|
|
171
|
+
const where = f.error?.where;
|
|
172
|
+
const text = `${f.kind === "error" ? pink("error") : amber(f.kind)} run ${f.run} · tick ${f.tick} · ${f.message}${where ? sky(` → ${where.file}:${where.line}`) : ""}\n replay: ${pc.dim(`debuff scenario ${f.repro}`)}`;
|
|
173
|
+
if (f.kind === "error")
|
|
174
|
+
p.log.error(text);
|
|
175
|
+
else
|
|
176
|
+
p.log.warn(text);
|
|
177
|
+
}
|
|
178
|
+
const minutes = (report.steps / 3600).toFixed(1);
|
|
179
|
+
finish(!errors.length, `${report.findings.length ? `${report.findings.length} finding${report.findings.length === 1 ? "" : "s"}` : "no crashes, stuck states or loops"} in ${minutes} min of play`, `seed ${report.seed} · repeat with --seed ${report.seed}`);
|
|
180
|
+
}
|
|
181
|
+
return errors.length ? 1 : 0;
|
|
182
|
+
});
|
|
183
|
+
cli
|
|
184
|
+
.command("inspect", "JSON summary of the project for agents and tools")
|
|
185
|
+
.option("--root <dir>", "Project root")
|
|
186
|
+
.action(async (o) => {
|
|
187
|
+
console.log(JSON.stringify(await inspectProject(rootOf(o)), null, 2));
|
|
188
|
+
return 0;
|
|
189
|
+
});
|
|
190
|
+
function report(root, json) {
|
|
191
|
+
const r = buildReport(join(root, "dist"));
|
|
192
|
+
writeFileSync(join(root, "dist", "debuff-report.json"), `${JSON.stringify(r, null, 2)}\n`);
|
|
193
|
+
if (json)
|
|
194
|
+
console.log(JSON.stringify(r, null, 2));
|
|
195
|
+
else {
|
|
196
|
+
console.log(formatReport(r));
|
|
197
|
+
const kb = (n) => `${(n / 1024).toFixed(1)} kB`;
|
|
198
|
+
if (r.leaks.length)
|
|
199
|
+
finish(false, "dev-only code leaked into the build", amber(r.leaks.map((l) => l.path).join(", ")));
|
|
200
|
+
else
|
|
201
|
+
finish(true, "build ready in dist/", `${sky(kb(r.totals.code.brotli))} ${pc.dim("code, brotli ·")} ${pink(kb(r.totals.asset.bytes))} ${pc.dim("assets")}`);
|
|
202
|
+
}
|
|
203
|
+
return r.leaks.length ? 1 : 0;
|
|
204
|
+
}
|
|
205
|
+
cli.help();
|
|
206
|
+
cli.version(version);
|
|
207
|
+
/** Register `debuff <plugin>:<command>` for every command contributed by plugins in debuff.config.ts. */
|
|
208
|
+
async function registerPluginCommands() {
|
|
209
|
+
const argv = process.argv.slice(2);
|
|
210
|
+
const command = argv.find((a) => !a.startsWith("-"));
|
|
211
|
+
const wantsHelp = argv.length === 0 || argv.includes("--help") || argv.includes("-h");
|
|
212
|
+
if (!command?.includes(":") && !wantsHelp)
|
|
213
|
+
return;
|
|
214
|
+
const rootIndex = argv.indexOf("--root");
|
|
215
|
+
const root = resolve(rootIndex >= 0 ? (argv[rootIndex + 1] ?? ".") : process.cwd());
|
|
216
|
+
let plugins;
|
|
217
|
+
try {
|
|
218
|
+
({ plugins } = await loadConfig(root));
|
|
219
|
+
}
|
|
220
|
+
catch (err) {
|
|
221
|
+
if (!wantsHelp)
|
|
222
|
+
throw err;
|
|
223
|
+
return;
|
|
224
|
+
}
|
|
225
|
+
for (const plugin of plugins) {
|
|
226
|
+
for (const def of plugin.commands ?? []) {
|
|
227
|
+
const cmd = cli.command(`${plugin.name}:${def.name} [...args]`, `${def.description} ${pc.dim(`(${plugin.name})`)}`);
|
|
228
|
+
cmd.option("--root <dir>", "Project root").option("--json", "Machine-readable output");
|
|
229
|
+
for (const opt of def.options ?? [])
|
|
230
|
+
cmd.option(opt.flags, opt.description, opt.default === undefined ? undefined : { default: opt.default });
|
|
231
|
+
cmd.action((args, options) => def.run({ root: rootOf(options), args, options, json: Boolean(options.json) }));
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
async function main() {
|
|
236
|
+
await registerPluginCommands();
|
|
237
|
+
cli.parse(process.argv, { run: false });
|
|
238
|
+
if (!cli.matchedCommand) {
|
|
239
|
+
// cac has already printed help or the version for these flags.
|
|
240
|
+
if (cli.options.help || cli.options.version)
|
|
241
|
+
return;
|
|
242
|
+
if (process.argv.length > 2) {
|
|
243
|
+
console.error(pc.red(`unknown command: ${process.argv.slice(2).find((a) => !a.startsWith("-")) ?? process.argv[2]}\n`));
|
|
244
|
+
cli.outputHelp();
|
|
245
|
+
process.exit(1);
|
|
246
|
+
}
|
|
247
|
+
cli.outputHelp();
|
|
248
|
+
return;
|
|
249
|
+
}
|
|
250
|
+
const code = (await cli.runMatchedCommand());
|
|
251
|
+
process.exit(code ?? 0);
|
|
252
|
+
}
|
|
253
|
+
main().catch((err) => {
|
|
254
|
+
p.log.error(err instanceof Error ? err.message : String(err));
|
|
255
|
+
process.exit(1);
|
|
256
|
+
});
|
|
257
|
+
//# sourceMappingURL=cli.js.map
|
package/dist/cli.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AACjE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,KAAK,CAAC,MAAM,gBAAgB,CAAC;AACpC,OAAO,GAAG,MAAM,KAAK,CAAC;AACtB,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,EAAE,MAAM,eAAe,CAAC;AACtE,OAAO,EAAE,MAAM,YAAY,CAAC;AAC5B,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC9D,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAE9C,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AACxD,OAAO,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAExD,MAAM,GAAG,GAAG,GAAG,CAAC,QAAQ,CAAC,CAAC;AAC1B,MAAM,OAAO,GAAI,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,GAAG,CAAC,iBAAiB,EAAE,OAAO,IAAI,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,CAAyB,CAAC,OAAO,CAAC;AAM/H,MAAM,MAAM,GAAG,CAAC,CAAS,EAAE,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;AAC/D,4EAA4E;AAC5E,MAAM,MAAM,GAAG,CAAC,KAAa,EAAE,OAAe,EAAE,EAAE,CAChD,OAAO,CAAC,GAAG,CAAC,KAAK,MAAM,CAAC,MAAM,EAAE,CAAC,GAAG,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,IAAI,OAAO,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;AAC5I,iDAAiD;AACjD,MAAM,MAAM,GAAG,CAAC,EAAW,EAAE,KAAa,EAAE,MAAM,GAAG,EAAE,EAAE,EAAE,CACzD,OAAO,CAAC,GAAG,CAAC,KAAK,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;AAC9H,MAAM,UAAU,GAAG,CAAC,IAAY,EAAE,EAAE,CAAC,KAAK,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;AAE3D,GAAG;KACA,OAAO,CAAC,cAAc,EAAE,qBAAqB,CAAC;KAC9C,MAAM,CAAC,iBAAiB,EAAE,iBAAiB,CAAC;KAC5C,MAAM,CAAC,WAAW,EAAE,mCAAmC,CAAC;KACxD,MAAM,CAAC,KAAK,EAAE,GAAuB,EAAE,CAAuC,EAAE,EAAE;IACjF,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,MAAM,CAAC,eAAe,CAAC,CAAC;IACpD,OAAO,SAAS,CAAC,EAAE,GAAG,EAAE,QAAQ,EAAE,CAAC,CAAC,QAAQ,EAAE,GAAG,EAAE,CAAC,CAAC,GAAG,IAAI,KAAK,EAAE,CAAC,CAAC;AACvE,CAAC,CAAC,CAAC;AAEL,GAAG;KACA,OAAO,CAAC,KAAK,EAAE,sCAAsC,CAAC;KACtD,MAAM,CAAC,cAAc,EAAE,cAAc,CAAC;KACtC,MAAM,CAAC,eAAe,EAAE,MAAM,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;KAClD,MAAM,CAAC,QAAQ,EAAE,8CAA8C,CAAC;KAChE,MAAM,CAAC,KAAK,EAAE,CAA4C,EAAE,EAAE;IAC7D,MAAM,MAAM,GAAG,MAAM,eAAe,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,IAAI,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC1G,MAAM,MAAM,CAAC,MAAM,EAAE,CAAC;IACtB,MAAM,CAAC,YAAY,EAAE,oBAAoB,CAAC,CAAC;IAC3C,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,YAAY,EAAE,KAAK,IAAI,EAAE;QAAE,OAAO,CAAC,GAAG,CAAC,KAAK,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IACtH,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,YAAY,EAAE,OAAO,IAAI,EAAE;QAAE,OAAO,CAAC,GAAG,CAAC,KAAK,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IACxH,OAAO,CAAC,GAAG,CACT,OAAO,EAAE,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,KAAK,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,mCAAmC,CAAC,IAAI,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,eAAe,CAAC,IAAI,CACxI,CAAC;IACF,MAAM,CAAC,gBAAgB,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;IAC1C,OAAO,IAAI,OAAO,CAAS,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;AACvC,CAAC,CAAC,CAAC;AAEL,GAAG;KACA,OAAO,CAAC,OAAO,EAAE,4DAA4D,CAAC;KAC9E,MAAM,CAAC,cAAc,EAAE,cAAc,CAAC;KACtC,MAAM,CAAC,QAAQ,EAAE,yBAAyB,CAAC;KAC3C,MAAM,CAAC,aAAa,EAAE,kBAAkB,CAAC;KACzC,MAAM,CAAC,KAAK,EAAE,CAAmC,EAAE,EAAE;IACpD,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;IACvB,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,CAAC;IACvC,IAAI,CAAC,CAAC,CAAC,IAAI;QAAE,MAAM,CAAC,OAAO,EAAE,4BAA4B,CAAC,CAAC;IAC3D,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;IAC3C,CAAC,EAAE,KAAK,CAAC,UAAU,CAAC,CAAC;IACrB,MAAM,KAAK,CAAC,MAAM,UAAU,CAAC,IAAI,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,SAAS,EAAE,CAAC,CAAC,SAAS,IAAI,KAAK,EAAE,EAAE,CAAC,CAAC,CAAC;IACvG,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;IACnB,OAAO,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,IAAI,KAAK,CAAC,CAAC;AACvC,CAAC,CAAC,CAAC;AAEL,GAAG;KACA,OAAO,CAAC,QAAQ,EAAE,mCAAmC,CAAC;KACtD,MAAM,CAAC,cAAc,EAAE,cAAc,CAAC;KACtC,MAAM,CAAC,QAAQ,EAAE,yBAAyB,CAAC;KAC3C,MAAM,CAAC,CAAC,CAAS,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,IAAI,KAAK,CAAC,CAAC,CAAC;AAE7D,GAAG;KACA,OAAO,CAAC,QAAQ,EAAE,uDAAuD,CAAC;KAC1E,MAAM,CAAC,cAAc,EAAE,cAAc,CAAC;KACtC,MAAM,CAAC,QAAQ,EAAE,iDAAiD,CAAC;KACnE,MAAM,CAAC,KAAK,EAAE,CAAS,EAAE,EAAE;IAC1B,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;IACvB,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,IAAI,CAAC,CAAC;IACtC,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,UAAU,EAAE,OAAO,EAAE,GAAG,MAAM,aAAa,CAAC,IAAI,EAAE,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;IAChI,MAAM,MAAM,GAAG,UAAU,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;IAC1C,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC;IAClD,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC;QACX,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,QAAQ,EAAE,UAAU,EAAE,SAAS,EAAE,CAAC,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QACjH,OAAO,CAAC,CAAC;IACX,CAAC;IACD,MAAM,CAAC,QAAQ,EAAE,kCAAkC,CAAC,CAAC;IACrD,KAAK,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;QACtD,MAAM,MAAM,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,SAAS,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC7F,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,IAAI,CAAC,EAAE,CAAC,IAAI,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,UAAU,CAAC,EAAE,CAAC,EAAE,CAAC,GAAG,MAAM,EAAE,CAAC,CAAC;IAClI,CAAC;IACD,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,KAAK,UAAU,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,OAAO,CAAC,IAAI,YAAY,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IACrF,KAAK,MAAM,CAAC,IAAI,QAAQ;QAAE,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACxC,IAAI,MAAM,CAAC,MAAM;QAAE,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,8CAA8C,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACtH,MAAM,CAAC,IAAI,EAAE,GAAG,KAAK,eAAe,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,OAAO,CAAC,IAAI,YAAY,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IAC5F,OAAO,CAAC,CAAC;AACX,CAAC,CAAC,CAAC;AAEL,GAAG;KACA,OAAO,CAAC,qBAAqB,EAAE,4CAA4C,CAAC;KAC5E,MAAM,CAAC,cAAc,EAAE,cAAc,CAAC;KACtC,MAAM,CAAC,UAAU,EAAE,uCAAuC,CAAC;KAC3D,MAAM,CAAC,UAAU,EAAE,6CAA6C,CAAC;KACjE,MAAM,CAAC,QAAQ,EAAE,yBAAyB,CAAC;KAC3C,MAAM,CAAC,KAAK,EAAE,KAAe,EAAE,CAAkD,EAAE,EAAE;IACpF,MAAM,EAAE,YAAY,EAAE,cAAc,EAAE,GAAG,MAAM,MAAM,CAAC,qBAAqB,CAAC,CAAC;IAC7E,iDAAiD;IACjD,IAAI,QAAQ,GAAG,KAAK,CAAC;IACrB,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE;QAC5B,IAAI,CAAC,QAAQ,IAAI,IAAI,KAAK,CAAC;YAAE,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;IACpD,CAAC,CAAC,CAAC;IACH,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QACZ,MAAM,CAAC,WAAW,EAAE,wBAAwB,CAAC,CAAC;QAC9C,6FAA6F;QAC7F,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,iCAAiC,CAAC,CAAC;IAChD,CAAC;IACD,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;IACvB,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,UAAU,CAAC,IAAI,CAAC,CAAC;IAC3C,6FAA6F;IAC7F,MAAM,EAAE,cAAc,EAAE,GAAG,MAAM,MAAM,CAAC,qBAAqB,CAAC,CAAC;IAC/D,SAAS,CAAC,IAAI,CAAC,IAAI,EAAE,SAAS,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACtD,aAAa,CACX,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,sBAAsB,CAAC,EAC7C,GAAG,IAAI,CAAC,SAAS,CAAC,cAAc,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC;CACxD,CACI,CAAC;IACF,MAAM,OAAO,GAAG,MAAM,YAAY,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,IAAI,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,IAAI,KAAK,EAAE,CAAC,CAAC;IACnH,QAAQ,GAAG,IAAI,CAAC;IAChB,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC;IACnD,IAAI,CAAC,CAAC,IAAI;QAAE,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;SACrD,CAAC;QACJ,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;YACxB,MAAM,IAAI,GAAG,cAAc,CAAC,CAAC,CAAC,CAAC;YAC/B,IAAI,CAAC,CAAC,EAAE;gBAAE,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;;gBACzB,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACzB,CAAC;QACD,MAAM,OAAO,GAAG,GAAG,OAAO,CAAC,MAAM,GAAG,MAAM,IAAI,OAAO,CAAC,MAAM,mBAAmB,CAAC;QAChF,MAAM,CAAC,CAAC,MAAM,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,6BAA6B,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IAC/E,CAAC;IACD,OAAO,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AACxB,CAAC,CAAC,CAAC;AAEL,GAAG;KACA,OAAO,CAAC,MAAM,EAAE,yEAAyE,CAAC;KAC1F,MAAM,CAAC,cAAc,EAAE,cAAc,CAAC;KACtC,MAAM,CAAC,eAAe,EAAE,mCAAmC,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;KAC7E,MAAM,CAAC,YAAY,EAAE,kBAAkB,EAAE,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC;KACxD,MAAM,CAAC,YAAY,EAAE,qCAAqC,CAAC;KAC3D,MAAM,CAAC,gBAAgB,EAAE,oDAAoD,CAAC;KAC9E,MAAM,CAAC,QAAQ,EAAE,yBAAyB,CAAC;KAC3C,MAAM,CAAC,KAAK,EAAE,CAA2E,EAAE,EAAE;IAC5F,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,MAAM,CAAC,WAAW,CAAC,CAAC;IAC9C,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QACZ,MAAM,CAAC,MAAM,EAAE,yBAAyB,CAAC,CAAC;QAC1C,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,IAAI,MAAM,CAAC,CAAC,OAAO,sBAAsB,CAAC,CAAC;IACrE,CAAC;IACD,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC;QAC3B,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC;QACf,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC;QAC1B,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC;QACpB,GAAG,CAAC,CAAC,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC;QACzD,GAAG,CAAC,CAAC,CAAC,IAAI;YACR,CAAC,CAAC;gBACE,IAAI,EAAE,CAAC,CAAC,IAAI;qBACT,KAAK,CAAC,GAAG,CAAC;qBACV,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;qBACpB,MAAM,CAAC,OAAO,CAAC;aACnB;YACH,CAAC,CAAC,EAAE,CAAC;KACR,CAAC,CAAC;IACH,MAAM,MAAM,GAAG,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC;IACjE,IAAI,CAAC,CAAC,IAAI;QAAE,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;SACpD,CAAC;QACJ,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;YAChC,MAAM,KAAK,GAAI,CAAC,CAAC,KAAgE,EAAE,KAAK,CAAC;YACzF,MAAM,IAAI,GAAG,GAAG,CAAC,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,GAAG,WAAW,CAAC,CAAC,IAAI,MAAM,CAAC,CAAC,OAAO,GAAG,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,eAAe,EAAE,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC,KAAK,EAAE,CAAC,EAAE,CAAC;YAC1N,IAAI,CAAC,CAAC,IAAI,KAAK,OAAO;gBAAE,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;;gBACrC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACxB,CAAC;QACD,MAAM,OAAO,GAAG,CAAC,MAAM,CAAC,KAAK,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QACjD,MAAM,CACJ,CAAC,MAAM,CAAC,MAAM,EACd,GAAG,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,QAAQ,CAAC,MAAM,WAAW,MAAM,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,mCAAmC,OAAO,OAAO,cAAc,EAC3K,QAAQ,MAAM,CAAC,IAAI,yBAAyB,MAAM,CAAC,IAAI,EAAE,CAC1D,CAAC;IACJ,CAAC;IACD,OAAO,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAC/B,CAAC,CAAC,CAAC;AAEL,GAAG;KACA,OAAO,CAAC,SAAS,EAAE,kDAAkD,CAAC;KACtE,MAAM,CAAC,cAAc,EAAE,cAAc,CAAC;KACtC,MAAM,CAAC,KAAK,EAAE,CAAS,EAAE,EAAE;IAC1B,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IACtE,OAAO,CAAC,CAAC;AACX,CAAC,CAAC,CAAC;AAEL,SAAS,MAAM,CAAC,IAAY,EAAE,IAAa;IACzC,MAAM,CAAC,GAAG,WAAW,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC;IAC1C,aAAa,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,oBAAoB,CAAC,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;IAC3F,IAAI,IAAI;QAAE,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;SAC7C,CAAC;QACJ,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC;QAC7B,MAAM,EAAE,GAAG,CAAC,CAAS,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC;QACxD,IAAI,CAAC,CAAC,KAAK,CAAC,MAAM;YAAE,MAAM,CAAC,KAAK,EAAE,qCAAqC,EAAE,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;;YAErH,MAAM,CACJ,IAAI,EACJ,sBAAsB,EACtB,GAAG,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,gBAAgB,CAAC,IAAI,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CACrH,CAAC;IACN,CAAC;IACD,OAAO,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAChC,CAAC;AAED,GAAG,CAAC,IAAI,EAAE,CAAC;AACX,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;AAErB,yGAAyG;AACzG,KAAK,UAAU,sBAAsB;IACnC,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IACnC,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC;IACrD,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,KAAK,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;IACtF,IAAI,CAAC,OAAO,EAAE,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS;QAAE,OAAO;IAClD,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IACzC,MAAM,IAAI,GAAG,OAAO,CAAC,SAAS,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,GAAG,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;IACpF,IAAI,OAAwB,CAAC;IAC7B,IAAI,CAAC;QACH,CAAC,EAAE,OAAO,EAAE,GAAG,MAAM,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC;IACzC,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAI,CAAC,SAAS;YAAE,MAAM,GAAG,CAAC;QAC1B,OAAO;IACT,CAAC;IACD,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC7B,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,QAAQ,IAAI,EAAE,EAAE,CAAC;YACxC,MAAM,GAAG,GAAG,GAAG,CAAC,OAAO,CAAC,GAAG,MAAM,CAAC,IAAI,IAAI,GAAG,CAAC,IAAI,YAAY,EAAE,GAAG,GAAG,CAAC,WAAW,IAAI,EAAE,CAAC,GAAG,CAAC,IAAI,MAAM,CAAC,IAAI,GAAG,CAAC,EAAE,CAAC,CAAC;YACpH,GAAG,CAAC,MAAM,CAAC,cAAc,EAAE,cAAc,CAAC,CAAC,MAAM,CAAC,QAAQ,EAAE,yBAAyB,CAAC,CAAC;YACvF,KAAK,MAAM,GAAG,IAAI,GAAG,CAAC,OAAO,IAAI,EAAE;gBACjC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,WAAW,EAAE,GAAG,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;YAC3G,GAAG,CAAC,MAAM,CAAC,CAAC,IAAc,EAAE,OAAyC,EAAE,EAAE,CACvE,GAAG,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,CAC/E,CAAC;QACJ,CAAC;IACH,CAAC;AACH,CAAC;AAED,KAAK,UAAU,IAAI;IACjB,MAAM,sBAAsB,EAAE,CAAC;IAC/B,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC,CAAC;IACxC,IAAI,CAAC,GAAG,CAAC,cAAc,EAAE,CAAC;QACxB,+DAA+D;QAC/D,IAAI,GAAG,CAAC,OAAO,CAAC,IAAI,IAAI,GAAG,CAAC,OAAO,CAAC,OAAO;YAAE,OAAO;QACpD,IAAI,OAAO,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC5B,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,GAAG,CAAC,oBAAoB,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;YACxH,GAAG,CAAC,UAAU,EAAE,CAAC;YACjB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QACD,GAAG,CAAC,UAAU,EAAE,CAAC;QACjB,OAAO;IACT,CAAC;IACD,MAAM,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,iBAAiB,EAAE,CAAuB,CAAC;IACnE,OAAO,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC;AAC1B,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,GAAY,EAAE,EAAE;IAC5B,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;IAC9D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
|
package/dist/config.d.ts
ADDED
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import type { AtlasOptions } from "./assets/atlas.js";
|
|
2
|
+
import { type ToolingPlugin } from "./plugin.js";
|
|
3
|
+
/** Contents of `debuff.config.ts`. */
|
|
4
|
+
export interface DebuffConfig {
|
|
5
|
+
plugins?: ToolingPlugin[];
|
|
6
|
+
assets?: {
|
|
7
|
+
/** Atlas packing for PNG images (default on). `false` disables it. */
|
|
8
|
+
atlas?: AtlasOptions | false;
|
|
9
|
+
};
|
|
10
|
+
}
|
|
11
|
+
export interface ResolvedConfig {
|
|
12
|
+
root: string;
|
|
13
|
+
/** Absolute path of the loaded config file, if any. */
|
|
14
|
+
file: string | undefined;
|
|
15
|
+
plugins: ToolingPlugin[];
|
|
16
|
+
atlas: AtlasOptions | false;
|
|
17
|
+
}
|
|
18
|
+
/** Identity helper that gives `debuff.config.ts` full type checking and editor completion. */
|
|
19
|
+
export declare function defineConfig(config: DebuffConfig): DebuffConfig;
|
|
20
|
+
export declare const CONFIG_FILES: string[];
|
|
21
|
+
/** Load and validate `debuff.config.*` from `root`. A missing file is a valid empty config. */
|
|
22
|
+
export declare function loadConfig(root: string): Promise<ResolvedConfig>;
|
|
23
|
+
export declare function validatePlugins(plugins: unknown[], source?: string): ToolingPlugin[];
|
|
24
|
+
//# sourceMappingURL=config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,EAAuB,KAAK,aAAa,EAAE,MAAM,aAAa,CAAC;AAEtE,sCAAsC;AACtC,MAAM,WAAW,YAAY;IAC3B,OAAO,CAAC,EAAE,aAAa,EAAE,CAAC;IAC1B,MAAM,CAAC,EAAE;QACP,sEAAsE;QACtE,KAAK,CAAC,EAAE,YAAY,GAAG,KAAK,CAAC;KAC9B,CAAC;CACH;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,uDAAuD;IACvD,IAAI,EAAE,MAAM,GAAG,SAAS,CAAC;IACzB,OAAO,EAAE,aAAa,EAAE,CAAC;IACzB,KAAK,EAAE,YAAY,GAAG,KAAK,CAAC;CAC7B;AAED,8FAA8F;AAC9F,wBAAgB,YAAY,CAAC,MAAM,EAAE,YAAY,GAAG,YAAY,CAE/D;AAED,eAAO,MAAM,YAAY,UAAqF,CAAC;AAI/G,+FAA+F;AAC/F,wBAAsB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC,CAStE;AAED,wBAAgB,eAAe,CAAC,OAAO,EAAE,OAAO,EAAE,EAAE,MAAM,SAAW,GAAG,aAAa,EAAE,CA0BtF"}
|
package/dist/config.js
ADDED
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { existsSync } from "node:fs";
|
|
2
|
+
import { join } from "node:path";
|
|
3
|
+
import { TOOLING_API_VERSION } from "./plugin.js";
|
|
4
|
+
/** Identity helper that gives `debuff.config.ts` full type checking and editor completion. */
|
|
5
|
+
export function defineConfig(config) {
|
|
6
|
+
return config;
|
|
7
|
+
}
|
|
8
|
+
export const CONFIG_FILES = ["debuff.config.ts", "debuff.config.mts", "debuff.config.js", "debuff.config.mjs"];
|
|
9
|
+
const NAME = /^[a-z0-9]+(?:-[a-z0-9]+)*$/;
|
|
10
|
+
/** Load and validate `debuff.config.*` from `root`. A missing file is a valid empty config. */
|
|
11
|
+
export async function loadConfig(root) {
|
|
12
|
+
const file = CONFIG_FILES.map((f) => join(root, f)).find((f) => existsSync(f));
|
|
13
|
+
if (!file)
|
|
14
|
+
return { root, file: undefined, plugins: [], atlas: {} };
|
|
15
|
+
// Vite's module runner transpiles TypeScript without a separate loader dependency.
|
|
16
|
+
const { runnerImport } = await import("vite");
|
|
17
|
+
const { module } = await runnerImport(file);
|
|
18
|
+
const config = module.default;
|
|
19
|
+
if (!config || typeof config !== "object")
|
|
20
|
+
throw new Error(`${file} must \`export default defineConfig({ ... })\``);
|
|
21
|
+
return { root, file, plugins: validatePlugins(config.plugins ?? [], file), atlas: config.assets?.atlas ?? {} };
|
|
22
|
+
}
|
|
23
|
+
export function validatePlugins(plugins, source = "config") {
|
|
24
|
+
const seen = new Set();
|
|
25
|
+
return plugins.map((p, i) => {
|
|
26
|
+
const plugin = p;
|
|
27
|
+
const where = `${source}: plugins[${i}]`;
|
|
28
|
+
if (!plugin || typeof plugin !== "object")
|
|
29
|
+
throw new Error(`${where} is not a plugin object. Did you forget to call the plugin factory?`);
|
|
30
|
+
if (typeof plugin.name !== "string" || !NAME.test(plugin.name))
|
|
31
|
+
throw new Error(`${where} needs a kebab-case "name"`);
|
|
32
|
+
if (plugin.apiVersion !== TOOLING_API_VERSION) {
|
|
33
|
+
throw new Error(`Plugin "${plugin.name}" targets apiVersion ${plugin.apiVersion}; this CLI supports ${TOOLING_API_VERSION}`);
|
|
34
|
+
}
|
|
35
|
+
if (seen.has(plugin.name))
|
|
36
|
+
throw new Error(`Plugin "${plugin.name}" is listed twice`);
|
|
37
|
+
seen.add(plugin.name);
|
|
38
|
+
for (const kind of ["commands", "scenarioSteps"]) {
|
|
39
|
+
for (const def of plugin[kind] ?? []) {
|
|
40
|
+
if (!def || typeof def.name !== "string" || !NAME.test(def.name) || typeof def.run !== "function") {
|
|
41
|
+
throw new Error(`Plugin "${plugin.name}": every entry in ${kind} needs a kebab-case name and a run() function`);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
for (const importer of plugin.assets ?? []) {
|
|
46
|
+
const ok = importer?.extensions?.length && ("import" in importer || ("command" in importer && importer.command?.length));
|
|
47
|
+
if (!ok)
|
|
48
|
+
throw new Error(`Plugin "${plugin.name}": importer "${importer?.name}" needs extensions and either import() or command`);
|
|
49
|
+
}
|
|
50
|
+
return plugin;
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
|
package/dist/fuzz.d.ts
ADDED
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/** Keys most small games use. Override with `keys` (KeyboardEvent.code values). */
|
|
2
|
+
export declare const DEFAULT_FUZZ_KEYS: string[];
|
|
3
|
+
export interface FuzzOptions {
|
|
4
|
+
root: string;
|
|
5
|
+
/** Simulated seconds of play per run (60 steps = 1 s). Default 60. */
|
|
6
|
+
seconds?: number;
|
|
7
|
+
/** Independent runs, each from a fresh page load. Default 3. */
|
|
8
|
+
runs?: number;
|
|
9
|
+
/** Seed for the input generator. Same seed, same inputs. Default: random. */
|
|
10
|
+
seed?: number;
|
|
11
|
+
/** Keys to press. Default: arrows, WASD, Space, Enter, Z, X. */
|
|
12
|
+
keys?: string[];
|
|
13
|
+
/** Flag a run as stuck when the scene's inspect() state doesn't change for this many seconds. Default 15. */
|
|
14
|
+
stuckSeconds?: number;
|
|
15
|
+
/** Page to open. Default "/". */
|
|
16
|
+
page?: string;
|
|
17
|
+
}
|
|
18
|
+
export interface FuzzFinding {
|
|
19
|
+
kind: "error" | "stuck" | "loop";
|
|
20
|
+
run: number;
|
|
21
|
+
/** Simulation tick when it was found. */
|
|
22
|
+
tick: number;
|
|
23
|
+
message: string;
|
|
24
|
+
/** The explained error from the dev tools (kind, where, hint), when kind is "error". */
|
|
25
|
+
error?: unknown;
|
|
26
|
+
/** Scenario file that replays the inputs up to this point. Run it with `debuff scenario <file>`. */
|
|
27
|
+
repro: string;
|
|
28
|
+
}
|
|
29
|
+
export interface FuzzReport {
|
|
30
|
+
seed: number;
|
|
31
|
+
runs: number;
|
|
32
|
+
/** Simulation steps played across all runs. */
|
|
33
|
+
steps: number;
|
|
34
|
+
findings: FuzzFinding[];
|
|
35
|
+
durationMs: number;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Play the game with random but plausible input: movement keys held for a while, action keys tapped.
|
|
39
|
+
* Finds runtime errors and stuck states, and writes each as a replayable scenario in `.debuff/fuzz/`.
|
|
40
|
+
* Deterministic: fixed steps plus a seeded game mean the recorded inputs reproduce the run exactly.
|
|
41
|
+
*/
|
|
42
|
+
export declare function runFuzz(options: FuzzOptions): Promise<FuzzReport>;
|
|
43
|
+
//# sourceMappingURL=fuzz.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fuzz.d.ts","sourceRoot":"","sources":["../src/fuzz.ts"],"names":[],"mappings":"AAQA,mFAAmF;AACnF,eAAO,MAAM,iBAAiB,UAa7B,CAAC;AAOF,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,sEAAsE;IACtE,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,gEAAgE;IAChE,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,6EAA6E;IAC7E,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,gEAAgE;IAChE,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,6GAA6G;IAC7G,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,iCAAiC;IACjC,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,OAAO,GAAG,OAAO,GAAG,MAAM,CAAC;IACjC,GAAG,EAAE,MAAM,CAAC;IACZ,yCAAyC;IACzC,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,wFAAwF;IACxF,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,oGAAoG;IACpG,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,+CAA+C;IAC/C,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,WAAW,EAAE,CAAC;IACxB,UAAU,EAAE,MAAM,CAAC;CACpB;AAmCD;;;;GAIG;AACH,wBAAsB,OAAO,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,UAAU,CAAC,CA0KvE"}
|