@liustack/pptfast 0.1.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.
@@ -0,0 +1,14 @@
1
+ // src/platform/registry.ts
2
+ var current = {};
3
+ function installPlatform(p) {
4
+ current = { ...current, ...p };
5
+ }
6
+ function getPlatform() {
7
+ return current;
8
+ }
9
+
10
+ export {
11
+ installPlatform,
12
+ getPlatform
13
+ };
14
+ //# sourceMappingURL=chunk-G76EVNVT.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/platform/registry.ts"],"sourcesContent":["/** Environment seams. The SDK entry stays browser-safe: Node implementations\n * live in ./node and are installed explicitly (CLI does it automatically). */\nexport interface PptfastPlatform {\n /** DOMParser constructor used to parse rendered SVG markup. */\n domParser?: typeof DOMParser\n /** Re-encode an image data URL to PNG (Office rejects webp and friends). */\n recodeImageToPng?: (dataUrl: string) => Promise<string>\n}\n\nlet current: PptfastPlatform = {}\n\nexport function installPlatform(p: PptfastPlatform): void {\n current = { ...current, ...p }\n}\n\nexport function getPlatform(): PptfastPlatform {\n return current\n}\n"],"mappings":";AASA,IAAI,UAA2B,CAAC;AAEzB,SAAS,gBAAgB,GAA0B;AACxD,YAAU,EAAE,GAAG,SAAS,GAAG,EAAE;AAC/B;AAEO,SAAS,cAA+B;AAC7C,SAAO;AACT;","names":[]}
package/dist/cli.js ADDED
@@ -0,0 +1,155 @@
1
+ #!/usr/bin/env node
2
+ import {
3
+ PptfastError,
4
+ VERSION,
5
+ formatIssues,
6
+ generatePptx,
7
+ irJsonSchema,
8
+ listThemes,
9
+ renderSlideSvg,
10
+ validateIr
11
+ } from "./chunk-DVMJWFDL.js";
12
+ import {
13
+ installNodePlatform
14
+ } from "./chunk-4WISUDXE.js";
15
+ import {
16
+ getPlatform
17
+ } from "./chunk-G76EVNVT.js";
18
+
19
+ // src/cli.ts
20
+ import { Command } from "commander";
21
+
22
+ // src/cli/commands.ts
23
+ import { mkdir, writeFile } from "fs/promises";
24
+ import { dirname, join, resolve as resolve2 } from "path";
25
+
26
+ // src/cli/load-ir.ts
27
+ import { readFile } from "fs/promises";
28
+ import { extname, isAbsolute, resolve } from "path";
29
+ var MIME_BY_EXT = {
30
+ ".png": "image/png",
31
+ ".jpg": "image/jpeg",
32
+ ".jpeg": "image/jpeg",
33
+ ".gif": "image/gif"
34
+ };
35
+ async function loadIrFile(irPath) {
36
+ let text;
37
+ try {
38
+ text = await readFile(irPath, "utf8");
39
+ } catch {
40
+ throw new PptfastError(`cannot read IR file: ${irPath}`);
41
+ }
42
+ try {
43
+ return JSON.parse(text);
44
+ } catch (e) {
45
+ throw new PptfastError(`${irPath} is not valid JSON: ${e.message}`);
46
+ }
47
+ }
48
+ async function resolveLocalAssets(ir, baseDir) {
49
+ for (const [name, asset] of Object.entries(ir.assets.images)) {
50
+ const src = asset.src;
51
+ if (src.startsWith("data:") || /^https?:\/\//.test(src)) continue;
52
+ const abs = isAbsolute(src) ? src : resolve(baseDir, src);
53
+ let bytes;
54
+ try {
55
+ bytes = await readFile(abs);
56
+ } catch {
57
+ throw new PptfastError(`asset "${name}": cannot read image file ${abs} (from src "${src}")`);
58
+ }
59
+ const mime = MIME_BY_EXT[extname(abs).toLowerCase()];
60
+ if (mime) {
61
+ asset.src = `data:${mime};base64,${bytes.toString("base64")}`;
62
+ continue;
63
+ }
64
+ const recode = getPlatform().recodeImageToPng;
65
+ if (!recode) {
66
+ throw new PptfastError(
67
+ `asset "${name}": unsupported image format "${extname(abs)}" \u2014 install sharp or convert to png/jpeg/gif`
68
+ );
69
+ }
70
+ asset.src = await recode(`data:application/octet-stream;base64,${bytes.toString("base64")}`);
71
+ }
72
+ }
73
+
74
+ // src/cli/commands.ts
75
+ async function runRender(irPath, opts) {
76
+ const raw = await loadIrFile(irPath);
77
+ if (opts.theme && typeof raw === "object" && raw !== null) {
78
+ ;
79
+ raw.theme = { id: opts.theme };
80
+ }
81
+ const v = validateIr(raw);
82
+ if (!v.ok) throw new PptfastError(`invalid IR:
83
+ ${formatIssues(v.errors)}`);
84
+ await resolveLocalAssets(v.ir, dirname(resolve2(irPath)));
85
+ const bytes = await generatePptx(v.ir);
86
+ await mkdir(dirname(resolve2(opts.output)), { recursive: true });
87
+ await writeFile(opts.output, bytes);
88
+ return `wrote ${opts.output} (${v.ir.slides.length} slides, ${bytes.length} bytes)`;
89
+ }
90
+ async function runValidate(irPath) {
91
+ const raw = await loadIrFile(irPath);
92
+ const v = validateIr(raw);
93
+ if (!v.ok)
94
+ throw new PptfastError(
95
+ `invalid IR (${v.errors.length} issue${v.errors.length === 1 ? "" : "s"}):
96
+ ${formatIssues(v.errors)}`
97
+ );
98
+ return `OK \u2014 ${v.ir.slides.length} slides, theme "${v.ir.theme.id}"`;
99
+ }
100
+ function runSchema() {
101
+ return JSON.stringify(irJsonSchema(), null, 2);
102
+ }
103
+ function runThemes(asJson) {
104
+ const themes = listThemes();
105
+ if (asJson) return JSON.stringify(themes, null, 2);
106
+ return themes.map((t) => `${t.id.padEnd(12)} ${t.label}`).join("\n");
107
+ }
108
+ async function runPreview(irPath, outDir) {
109
+ const raw = await loadIrFile(irPath);
110
+ const v = validateIr(raw);
111
+ if (!v.ok) throw new PptfastError(`invalid IR:
112
+ ${formatIssues(v.errors)}`);
113
+ await resolveLocalAssets(v.ir, dirname(resolve2(irPath)));
114
+ await mkdir(outDir, { recursive: true });
115
+ const ir = v.ir;
116
+ for (let i = 0; i < ir.slides.length; i++) {
117
+ const name = `${String(i + 1).padStart(3, "0")}-${ir.slides[i].type}.svg`;
118
+ await writeFile(join(outDir, name), renderSlideSvg(ir, i));
119
+ }
120
+ return `wrote ${ir.slides.length} SVG files to ${outDir}`;
121
+ }
122
+
123
+ // src/cli.ts
124
+ installNodePlatform();
125
+ var program = new Command();
126
+ program.name("pptfast").description("Stable, editable PPTX generation for AI agents \u2014 semantic IR in, native DrawingML out").version(VERSION);
127
+ function fail(e) {
128
+ console.error(e instanceof Error ? e.message : String(e));
129
+ process.exit(1);
130
+ }
131
+ program.command("render").description("Render an IR JSON file to a .pptx").argument("<ir.json>", "path to the IR file").requiredOption("-o, --output <file>", "output .pptx path").option("--theme <id>", "override the deck theme (see `pptfast themes`)").action(async (ir, opts) => {
132
+ try {
133
+ console.log(await runRender(ir, opts));
134
+ } catch (e) {
135
+ fail(e);
136
+ }
137
+ });
138
+ program.command("validate").description("Validate an IR JSON file against the schema").argument("<ir.json>").action(async (ir) => {
139
+ try {
140
+ console.log(await runValidate(ir));
141
+ } catch (e) {
142
+ fail(e);
143
+ }
144
+ });
145
+ program.command("schema").description("Print the IR JSON Schema (feed this to a model before it writes IR)").action(() => console.log(runSchema()));
146
+ program.command("themes").description("List built-in themes").option("--json", "machine-readable output").action((opts) => console.log(runThemes(Boolean(opts.json))));
147
+ program.command("preview").description("Render each slide to an SVG file for visual self-check").argument("<ir.json>").requiredOption("-o, --output <dir>", "output directory").action(async (ir, opts) => {
148
+ try {
149
+ console.log(await runPreview(ir, opts.output));
150
+ } catch (e) {
151
+ fail(e);
152
+ }
153
+ });
154
+ program.parseAsync().catch(fail);
155
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/cli.ts","../src/cli/commands.ts","../src/cli/load-ir.ts"],"sourcesContent":["#!/usr/bin/env node\nimport { Command } from \"commander\"\nimport { installNodePlatform } from \"./platform/node\"\nimport { runPreview, runRender, runSchema, runThemes, runValidate } from \"./cli/commands\"\nimport { VERSION } from \"./version\"\n\ninstallNodePlatform()\n\nconst program = new Command()\nprogram\n .name(\"pptfast\")\n .description(\"Stable, editable PPTX generation for AI agents — semantic IR in, native DrawingML out\")\n .version(VERSION)\n\nfunction fail(e: unknown): never {\n console.error(e instanceof Error ? e.message : String(e))\n process.exit(1)\n}\n\nprogram\n .command(\"render\")\n .description(\"Render an IR JSON file to a .pptx\")\n .argument(\"<ir.json>\", \"path to the IR file\")\n .requiredOption(\"-o, --output <file>\", \"output .pptx path\")\n .option(\"--theme <id>\", \"override the deck theme (see `pptfast themes`)\")\n .action(async (ir: string, opts: { output: string; theme?: string }) => {\n try {\n console.log(await runRender(ir, opts))\n } catch (e) {\n fail(e)\n }\n })\n\nprogram\n .command(\"validate\")\n .description(\"Validate an IR JSON file against the schema\")\n .argument(\"<ir.json>\")\n .action(async (ir: string) => {\n try {\n console.log(await runValidate(ir))\n } catch (e) {\n fail(e)\n }\n })\n\nprogram\n .command(\"schema\")\n .description(\"Print the IR JSON Schema (feed this to a model before it writes IR)\")\n .action(() => console.log(runSchema()))\n\nprogram\n .command(\"themes\")\n .description(\"List built-in themes\")\n .option(\"--json\", \"machine-readable output\")\n .action((opts: { json?: boolean }) => console.log(runThemes(Boolean(opts.json))))\n\nprogram\n .command(\"preview\")\n .description(\"Render each slide to an SVG file for visual self-check\")\n .argument(\"<ir.json>\")\n .requiredOption(\"-o, --output <dir>\", \"output directory\")\n .action(async (ir: string, opts: { output: string }) => {\n try {\n console.log(await runPreview(ir, opts.output))\n } catch (e) {\n fail(e)\n }\n })\n\nprogram.parseAsync().catch(fail)\n","import { mkdir, writeFile } from \"node:fs/promises\"\nimport { dirname, join, resolve } from \"node:path\"\nimport {\n formatIssues,\n generatePptx,\n irJsonSchema,\n listThemes,\n renderSlideSvg,\n validateIr,\n} from \"../api\"\nimport { PptfastError } from \"../errors\"\nimport { loadIrFile, resolveLocalAssets } from \"./load-ir\"\n\nexport interface RenderOptions {\n output: string\n theme?: string\n}\n\nexport async function runRender(irPath: string, opts: RenderOptions): Promise<string> {\n const raw = await loadIrFile(irPath)\n if (opts.theme && typeof raw === \"object\" && raw !== null) {\n ;(raw as Record<string, unknown>).theme = { id: opts.theme }\n }\n const v = validateIr(raw)\n if (!v.ok) throw new PptfastError(`invalid IR:\\n${formatIssues(v.errors)}`)\n await resolveLocalAssets(v.ir!, dirname(resolve(irPath)))\n const bytes = await generatePptx(v.ir!)\n await mkdir(dirname(resolve(opts.output)), { recursive: true })\n await writeFile(opts.output, bytes)\n return `wrote ${opts.output} (${v.ir!.slides.length} slides, ${bytes.length} bytes)`\n}\n\n/** Returns human-readable report. Throws PptfastError when invalid (CLI exit 1). */\nexport async function runValidate(irPath: string): Promise<string> {\n const raw = await loadIrFile(irPath)\n const v = validateIr(raw)\n if (!v.ok)\n throw new PptfastError(\n `invalid IR (${v.errors.length} issue${v.errors.length === 1 ? \"\" : \"s\"}):\\n${formatIssues(v.errors)}`,\n )\n return `OK — ${v.ir!.slides.length} slides, theme \"${v.ir!.theme.id}\"`\n}\n\nexport function runSchema(): string {\n return JSON.stringify(irJsonSchema(), null, 2)\n}\n\nexport function runThemes(asJson: boolean): string {\n const themes = listThemes()\n if (asJson) return JSON.stringify(themes, null, 2)\n return themes.map((t) => `${t.id.padEnd(12)} ${t.label}`).join(\"\\n\")\n}\n\nexport async function runPreview(irPath: string, outDir: string): Promise<string> {\n const raw = await loadIrFile(irPath)\n const v = validateIr(raw)\n if (!v.ok) throw new PptfastError(`invalid IR:\\n${formatIssues(v.errors)}`)\n await resolveLocalAssets(v.ir!, dirname(resolve(irPath)))\n await mkdir(outDir, { recursive: true })\n const ir = v.ir!\n for (let i = 0; i < ir.slides.length; i++) {\n const name = `${String(i + 1).padStart(3, \"0\")}-${ir.slides[i]!.type}.svg`\n await writeFile(join(outDir, name), renderSlideSvg(ir, i))\n }\n return `wrote ${ir.slides.length} SVG files to ${outDir}`\n}\n","import { readFile } from \"node:fs/promises\"\nimport { extname, isAbsolute, resolve } from \"node:path\"\nimport { PptfastError } from \"../errors\"\nimport type { PptxIR } from \"../ir\"\nimport { getPlatform } from \"../platform/registry\"\n\nconst MIME_BY_EXT: Record<string, string> = {\n \".png\": \"image/png\",\n \".jpg\": \"image/jpeg\",\n \".jpeg\": \"image/jpeg\",\n \".gif\": \"image/gif\",\n}\n\n/** Read and JSON-parse an IR file with readable failure messages. */\nexport async function loadIrFile(irPath: string): Promise<unknown> {\n let text: string\n try {\n text = await readFile(irPath, \"utf8\")\n } catch {\n throw new PptfastError(`cannot read IR file: ${irPath}`)\n }\n try {\n return JSON.parse(text) as unknown\n } catch (e) {\n throw new PptfastError(`${irPath} is not valid JSON: ${(e as Error).message}`)\n }\n}\n\n/** Rewrite local file paths in assets.images to data URIs (CLI-only concern).\n * data: and http(s): sources pass through — the export pipeline inlines URLs itself. */\nexport async function resolveLocalAssets(ir: PptxIR, baseDir: string): Promise<void> {\n for (const [name, asset] of Object.entries(ir.assets.images)) {\n const src = asset.src\n if (src.startsWith(\"data:\") || /^https?:\\/\\//.test(src)) continue\n const abs = isAbsolute(src) ? src : resolve(baseDir, src)\n let bytes: Buffer\n try {\n bytes = await readFile(abs)\n } catch {\n throw new PptfastError(`asset \"${name}\": cannot read image file ${abs} (from src \"${src}\")`)\n }\n const mime = MIME_BY_EXT[extname(abs).toLowerCase()]\n if (mime) {\n asset.src = `data:${mime};base64,${bytes.toString(\"base64\")}`\n continue\n }\n const recode = getPlatform().recodeImageToPng\n if (!recode) {\n throw new PptfastError(\n `asset \"${name}\": unsupported image format \"${extname(abs)}\" — install sharp or convert to png/jpeg/gif`\n )\n }\n asset.src = await recode(`data:application/octet-stream;base64,${bytes.toString(\"base64\")}`)\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;AACA,SAAS,eAAe;;;ACDxB,SAAS,OAAO,iBAAiB;AACjC,SAAS,SAAS,MAAM,WAAAA,gBAAe;;;ACDvC,SAAS,gBAAgB;AACzB,SAAS,SAAS,YAAY,eAAe;AAK7C,IAAM,cAAsC;AAAA,EAC1C,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,SAAS;AAAA,EACT,QAAQ;AACV;AAGA,eAAsB,WAAW,QAAkC;AACjE,MAAI;AACJ,MAAI;AACF,WAAO,MAAM,SAAS,QAAQ,MAAM;AAAA,EACtC,QAAQ;AACN,UAAM,IAAI,aAAa,wBAAwB,MAAM,EAAE;AAAA,EACzD;AACA,MAAI;AACF,WAAO,KAAK,MAAM,IAAI;AAAA,EACxB,SAAS,GAAG;AACV,UAAM,IAAI,aAAa,GAAG,MAAM,uBAAwB,EAAY,OAAO,EAAE;AAAA,EAC/E;AACF;AAIA,eAAsB,mBAAmB,IAAY,SAAgC;AACnF,aAAW,CAAC,MAAM,KAAK,KAAK,OAAO,QAAQ,GAAG,OAAO,MAAM,GAAG;AAC5D,UAAM,MAAM,MAAM;AAClB,QAAI,IAAI,WAAW,OAAO,KAAK,eAAe,KAAK,GAAG,EAAG;AACzD,UAAM,MAAM,WAAW,GAAG,IAAI,MAAM,QAAQ,SAAS,GAAG;AACxD,QAAI;AACJ,QAAI;AACF,cAAQ,MAAM,SAAS,GAAG;AAAA,IAC5B,QAAQ;AACN,YAAM,IAAI,aAAa,UAAU,IAAI,6BAA6B,GAAG,eAAe,GAAG,IAAI;AAAA,IAC7F;AACA,UAAM,OAAO,YAAY,QAAQ,GAAG,EAAE,YAAY,CAAC;AACnD,QAAI,MAAM;AACR,YAAM,MAAM,QAAQ,IAAI,WAAW,MAAM,SAAS,QAAQ,CAAC;AAC3D;AAAA,IACF;AACA,UAAM,SAAS,YAAY,EAAE;AAC7B,QAAI,CAAC,QAAQ;AACX,YAAM,IAAI;AAAA,QACR,UAAU,IAAI,gCAAgC,QAAQ,GAAG,CAAC;AAAA,MAC5D;AAAA,IACF;AACA,UAAM,MAAM,MAAM,OAAO,wCAAwC,MAAM,SAAS,QAAQ,CAAC,EAAE;AAAA,EAC7F;AACF;;;ADpCA,eAAsB,UAAU,QAAgB,MAAsC;AACpF,QAAM,MAAM,MAAM,WAAW,MAAM;AACnC,MAAI,KAAK,SAAS,OAAO,QAAQ,YAAY,QAAQ,MAAM;AACzD;AAAC,IAAC,IAAgC,QAAQ,EAAE,IAAI,KAAK,MAAM;AAAA,EAC7D;AACA,QAAM,IAAI,WAAW,GAAG;AACxB,MAAI,CAAC,EAAE,GAAI,OAAM,IAAI,aAAa;AAAA,EAAgB,aAAa,EAAE,MAAM,CAAC,EAAE;AAC1E,QAAM,mBAAmB,EAAE,IAAK,QAAQC,SAAQ,MAAM,CAAC,CAAC;AACxD,QAAM,QAAQ,MAAM,aAAa,EAAE,EAAG;AACtC,QAAM,MAAM,QAAQA,SAAQ,KAAK,MAAM,CAAC,GAAG,EAAE,WAAW,KAAK,CAAC;AAC9D,QAAM,UAAU,KAAK,QAAQ,KAAK;AAClC,SAAO,SAAS,KAAK,MAAM,KAAK,EAAE,GAAI,OAAO,MAAM,YAAY,MAAM,MAAM;AAC7E;AAGA,eAAsB,YAAY,QAAiC;AACjE,QAAM,MAAM,MAAM,WAAW,MAAM;AACnC,QAAM,IAAI,WAAW,GAAG;AACxB,MAAI,CAAC,EAAE;AACL,UAAM,IAAI;AAAA,MACR,eAAe,EAAE,OAAO,MAAM,SAAS,EAAE,OAAO,WAAW,IAAI,KAAK,GAAG;AAAA,EAAO,aAAa,EAAE,MAAM,CAAC;AAAA,IACtG;AACF,SAAO,aAAQ,EAAE,GAAI,OAAO,MAAM,mBAAmB,EAAE,GAAI,MAAM,EAAE;AACrE;AAEO,SAAS,YAAoB;AAClC,SAAO,KAAK,UAAU,aAAa,GAAG,MAAM,CAAC;AAC/C;AAEO,SAAS,UAAU,QAAyB;AACjD,QAAM,SAAS,WAAW;AAC1B,MAAI,OAAQ,QAAO,KAAK,UAAU,QAAQ,MAAM,CAAC;AACjD,SAAO,OAAO,IAAI,CAAC,MAAM,GAAG,EAAE,GAAG,OAAO,EAAE,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,KAAK,IAAI;AACrE;AAEA,eAAsB,WAAW,QAAgB,QAAiC;AAChF,QAAM,MAAM,MAAM,WAAW,MAAM;AACnC,QAAM,IAAI,WAAW,GAAG;AACxB,MAAI,CAAC,EAAE,GAAI,OAAM,IAAI,aAAa;AAAA,EAAgB,aAAa,EAAE,MAAM,CAAC,EAAE;AAC1E,QAAM,mBAAmB,EAAE,IAAK,QAAQA,SAAQ,MAAM,CAAC,CAAC;AACxD,QAAM,MAAM,QAAQ,EAAE,WAAW,KAAK,CAAC;AACvC,QAAM,KAAK,EAAE;AACb,WAAS,IAAI,GAAG,IAAI,GAAG,OAAO,QAAQ,KAAK;AACzC,UAAM,OAAO,GAAG,OAAO,IAAI,CAAC,EAAE,SAAS,GAAG,GAAG,CAAC,IAAI,GAAG,OAAO,CAAC,EAAG,IAAI;AACpE,UAAM,UAAU,KAAK,QAAQ,IAAI,GAAG,eAAe,IAAI,CAAC,CAAC;AAAA,EAC3D;AACA,SAAO,SAAS,GAAG,OAAO,MAAM,iBAAiB,MAAM;AACzD;;;AD3DA,oBAAoB;AAEpB,IAAM,UAAU,IAAI,QAAQ;AAC5B,QACG,KAAK,SAAS,EACd,YAAY,4FAAuF,EACnG,QAAQ,OAAO;AAElB,SAAS,KAAK,GAAmB;AAC/B,UAAQ,MAAM,aAAa,QAAQ,EAAE,UAAU,OAAO,CAAC,CAAC;AACxD,UAAQ,KAAK,CAAC;AAChB;AAEA,QACG,QAAQ,QAAQ,EAChB,YAAY,mCAAmC,EAC/C,SAAS,aAAa,qBAAqB,EAC3C,eAAe,uBAAuB,mBAAmB,EACzD,OAAO,gBAAgB,gDAAgD,EACvE,OAAO,OAAO,IAAY,SAA6C;AACtE,MAAI;AACF,YAAQ,IAAI,MAAM,UAAU,IAAI,IAAI,CAAC;AAAA,EACvC,SAAS,GAAG;AACV,SAAK,CAAC;AAAA,EACR;AACF,CAAC;AAEH,QACG,QAAQ,UAAU,EAClB,YAAY,6CAA6C,EACzD,SAAS,WAAW,EACpB,OAAO,OAAO,OAAe;AAC5B,MAAI;AACF,YAAQ,IAAI,MAAM,YAAY,EAAE,CAAC;AAAA,EACnC,SAAS,GAAG;AACV,SAAK,CAAC;AAAA,EACR;AACF,CAAC;AAEH,QACG,QAAQ,QAAQ,EAChB,YAAY,qEAAqE,EACjF,OAAO,MAAM,QAAQ,IAAI,UAAU,CAAC,CAAC;AAExC,QACG,QAAQ,QAAQ,EAChB,YAAY,sBAAsB,EAClC,OAAO,UAAU,yBAAyB,EAC1C,OAAO,CAAC,SAA6B,QAAQ,IAAI,UAAU,QAAQ,KAAK,IAAI,CAAC,CAAC,CAAC;AAElF,QACG,QAAQ,SAAS,EACjB,YAAY,wDAAwD,EACpE,SAAS,WAAW,EACpB,eAAe,sBAAsB,kBAAkB,EACvD,OAAO,OAAO,IAAY,SAA6B;AACtD,MAAI;AACF,YAAQ,IAAI,MAAM,WAAW,IAAI,KAAK,MAAM,CAAC;AAAA,EAC/C,SAAS,GAAG;AACV,SAAK,CAAC;AAAA,EACR;AACF,CAAC;AAEH,QAAQ,WAAW,EAAE,MAAM,IAAI;","names":["resolve","resolve"]}