framer-export 4.3.2 → 4.3.7
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/cli/index.js +113 -83
- package/dist/cli/index.js.map +1 -1
- package/package.json +1 -1
package/dist/cli/index.js
CHANGED
|
@@ -15,7 +15,7 @@ var init_package = __esm({
|
|
|
15
15
|
"package.json"() {
|
|
16
16
|
package_default = {
|
|
17
17
|
name: "framer-export",
|
|
18
|
-
version: "4.3.
|
|
18
|
+
version: "4.3.7",
|
|
19
19
|
description: "Export any Framer, Webflow, or Wix site into a fully working local mirror. Downloads all assets, strips badges, rewrites URLs, and pretty-prints JS.",
|
|
20
20
|
type: "module",
|
|
21
21
|
main: "dist/cli/index.js",
|
|
@@ -267,41 +267,73 @@ function trunc(text, max) {
|
|
|
267
267
|
if (text.length <= max) return text;
|
|
268
268
|
return text.slice(0, max - 2) + "..";
|
|
269
269
|
}
|
|
270
|
-
function nextColor() {
|
|
271
|
-
return MSG_COLORS[_msgIdx++ % MSG_COLORS.length];
|
|
272
|
-
}
|
|
273
270
|
function output(line) {
|
|
274
|
-
if (_cooking)
|
|
275
|
-
|
|
276
|
-
} else {
|
|
277
|
-
console.log(line);
|
|
278
|
-
}
|
|
271
|
+
if (_cooking) _cooking.log(line);
|
|
272
|
+
else console.log(line);
|
|
279
273
|
}
|
|
280
|
-
var _cooking, T,
|
|
274
|
+
var _cooking, T, LOG_PALETTE, _li, log, INFO_PALETTE, _ii, info, warn, success;
|
|
281
275
|
var init_logger = __esm({
|
|
282
276
|
"src/logger/index.ts"() {
|
|
283
277
|
"use strict";
|
|
284
278
|
_cooking = null;
|
|
285
279
|
T = () => (/* @__PURE__ */ new Date()).toISOString().slice(11, 19);
|
|
286
|
-
|
|
280
|
+
LOG_PALETTE = [
|
|
281
|
+
(s) => chalk3.hex("#D4A017")(s),
|
|
282
|
+
(s) => chalk3.hex("#DAA520")(s),
|
|
283
|
+
(s) => chalk3.hex("#C8A951")(s),
|
|
284
|
+
(s) => chalk3.hex("#E0B040")(s),
|
|
285
|
+
(s) => chalk3.hex("#daa520")(s),
|
|
286
|
+
(s) => chalk3.hex("#c4953a")(s),
|
|
287
287
|
(s) => chalk3.hex("#e8c33a")(s),
|
|
288
|
-
(s) => chalk3.hex("#d4a76a")(s),
|
|
289
|
-
(s) => chalk3.hex("#c8a040")(s),
|
|
290
|
-
(s) => chalk3.hex("#e0b040")(s),
|
|
291
288
|
(s) => chalk3.hex("#dab660")(s),
|
|
292
|
-
(s) => chalk3.hex("#
|
|
293
|
-
(s) => chalk3.hex("#
|
|
294
|
-
(s) => chalk3.hex("#
|
|
289
|
+
(s) => chalk3.hex("#b8960a")(s),
|
|
290
|
+
(s) => chalk3.hex("#d4a76a")(s),
|
|
291
|
+
(s) => chalk3.hex("#e0a030")(s),
|
|
292
|
+
(s) => chalk3.hex("#c0a060")(s)
|
|
293
|
+
];
|
|
294
|
+
_li = 0;
|
|
295
|
+
log = (m) => {
|
|
296
|
+
_li++;
|
|
297
|
+
const c = LOG_PALETTE[_li % LOG_PALETTE.length];
|
|
298
|
+
output(`${chalk3.hex("#6d6d6d")(`[${T()}]`)} ${chalk3.hex("#B8960A")("[LOG]")} ${c(trunc(m, 120))}`);
|
|
299
|
+
};
|
|
300
|
+
INFO_PALETTE = [
|
|
301
|
+
(s) => chalk3.hex("#4DB8B0")(s),
|
|
302
|
+
(s) => chalk3.hex("#5CC0BA")(s),
|
|
303
|
+
(s) => chalk3.hex("#3AA89E")(s),
|
|
304
|
+
(s) => chalk3.hex("#6BC4BE")(s),
|
|
305
|
+
(s) => chalk3.hex("#48B5AD")(s),
|
|
306
|
+
(s) => chalk3.hex("#52BAB4")(s)
|
|
295
307
|
];
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
308
|
+
_ii = 0;
|
|
309
|
+
info = (m) => {
|
|
310
|
+
_ii++;
|
|
311
|
+
const c = INFO_PALETTE[_ii % INFO_PALETTE.length];
|
|
312
|
+
output(`${chalk3.hex("#6d6d6d")(`[${T()}]`)} ${chalk3.hex("#3AA89E").bold("[INFO]")} ${c(trunc(m, 120))}`);
|
|
313
|
+
};
|
|
299
314
|
warn = (m) => {
|
|
300
|
-
const
|
|
315
|
+
const colors = [
|
|
316
|
+
(s) => chalk3.hex("#E8833A")(s),
|
|
317
|
+
(s) => chalk3.hex("#F09040")(s),
|
|
318
|
+
(s) => chalk3.hex("#CC7722")(s),
|
|
319
|
+
(s) => chalk3.hex("#E87D2A")(s)
|
|
320
|
+
];
|
|
321
|
+
const c = colors[Math.floor(Math.random() * colors.length)];
|
|
322
|
+
const line = `${chalk3.hex("#7a7a7a")(`[${T()}]`)} ${chalk3.hex("#E8833A").bold("[WARN]")} ${c(trunc(m, 120))}`;
|
|
301
323
|
if (_cooking) _cooking.log(line);
|
|
302
324
|
else console.warn(line);
|
|
303
325
|
};
|
|
304
|
-
success = (m) =>
|
|
326
|
+
success = (m) => {
|
|
327
|
+
const colors = [
|
|
328
|
+
(s) => chalk3.hex("#4CAF50")(s),
|
|
329
|
+
(s) => chalk3.hex("#66BB6A")(s),
|
|
330
|
+
(s) => chalk3.hex("#43A047")(s),
|
|
331
|
+
(s) => chalk3.hex("#81C784")(s),
|
|
332
|
+
(s) => chalk3.hex("#2E7D32")(s)
|
|
333
|
+
];
|
|
334
|
+
const c = colors[Math.floor(Math.random() * colors.length)];
|
|
335
|
+
output(`${chalk3.hex("#6d6d6d")(`[${T()}]`)} ${chalk3.greenBright("[OK]")} ${c(trunc(m, 120))}`);
|
|
336
|
+
};
|
|
305
337
|
}
|
|
306
338
|
});
|
|
307
339
|
|
|
@@ -1301,50 +1333,30 @@ var init_summary = __esm({
|
|
|
1301
1333
|
|
|
1302
1334
|
// src/cli/cooking.ts
|
|
1303
1335
|
import chalk6 from "chalk";
|
|
1304
|
-
var SHINE_WIDTH, FRAME_INTERVAL,
|
|
1336
|
+
var SHINE_WIDTH, FRAME_INTERVAL, DOT_PHASES, CookingSpinner;
|
|
1305
1337
|
var init_cooking = __esm({
|
|
1306
1338
|
"src/cli/cooking.ts"() {
|
|
1307
1339
|
"use strict";
|
|
1308
1340
|
SHINE_WIDTH = 10;
|
|
1309
1341
|
FRAME_INTERVAL = 140;
|
|
1310
|
-
|
|
1311
|
-
PALETTE = [
|
|
1312
|
-
(s) => chalk6.hex("#D4A017")(s),
|
|
1313
|
-
(s) => chalk6.hex("#E8A317")(s),
|
|
1314
|
-
(s) => chalk6.hex("#DAA520")(s),
|
|
1315
|
-
(s) => chalk6.hex("#F0C040")(s),
|
|
1316
|
-
(s) => chalk6.hex("#C4953A")(s),
|
|
1317
|
-
(s) => chalk6.hex("#E6B83C")(s),
|
|
1318
|
-
(s) => chalk6.hex("#C8A951")(s),
|
|
1319
|
-
(s) => chalk6.hex("#D9B44D")(s)
|
|
1320
|
-
];
|
|
1342
|
+
DOT_PHASES = [" ", ". ", ".. ", "...", " ..", " .", " "];
|
|
1321
1343
|
CookingSpinner = class {
|
|
1322
1344
|
interval = null;
|
|
1323
|
-
bgInterval = null;
|
|
1324
1345
|
frame = 0;
|
|
1325
1346
|
phase = "";
|
|
1326
1347
|
active = false;
|
|
1327
|
-
bar = 0;
|
|
1328
|
-
barDir = 1;
|
|
1329
1348
|
start(phase = "") {
|
|
1330
1349
|
this.phase = phase;
|
|
1331
1350
|
this.frame = 0;
|
|
1332
|
-
this.bar = 0;
|
|
1333
|
-
this.barDir = 1;
|
|
1334
1351
|
this.active = true;
|
|
1335
1352
|
this.draw();
|
|
1336
1353
|
this.interval = setInterval(() => {
|
|
1337
1354
|
this.frame++;
|
|
1338
1355
|
this.draw();
|
|
1339
1356
|
}, FRAME_INTERVAL);
|
|
1340
|
-
this.bgInterval = setInterval(() => {
|
|
1341
|
-
this.bar++;
|
|
1342
|
-
this.draw();
|
|
1343
|
-
}, 800);
|
|
1344
1357
|
}
|
|
1345
1358
|
update(phase) {
|
|
1346
1359
|
this.phase = phase;
|
|
1347
|
-
if (!this.active) this.draw();
|
|
1348
1360
|
}
|
|
1349
1361
|
log(message) {
|
|
1350
1362
|
if (this.active) {
|
|
@@ -1361,27 +1373,15 @@ var init_cooking = __esm({
|
|
|
1361
1373
|
clearInterval(this.interval);
|
|
1362
1374
|
this.interval = null;
|
|
1363
1375
|
}
|
|
1364
|
-
if (this.bgInterval) {
|
|
1365
|
-
clearInterval(this.bgInterval);
|
|
1366
|
-
this.bgInterval = null;
|
|
1367
|
-
}
|
|
1368
1376
|
process.stdout.write("\r\x1B[2K");
|
|
1369
1377
|
}
|
|
1370
1378
|
draw() {
|
|
1371
1379
|
if (!this.active) return;
|
|
1372
|
-
const
|
|
1373
|
-
const paletteFn = PALETTE[this.frame % PALETTE.length];
|
|
1374
|
-
const dotPhase = Math.floor(this.frame / 3) % 4;
|
|
1375
|
-
const dotStr = dotPhase === 0 ? " " : dotPhase === 1 ? ". " : dotPhase === 2 ? ".. " : "...";
|
|
1380
|
+
const dots = DOT_PHASES[this.frame % DOT_PHASES.length];
|
|
1376
1381
|
const shimmer = this.renderShimmer("Cooking");
|
|
1377
|
-
const
|
|
1378
|
-
const barLen = 12;
|
|
1379
|
-
const barPos = this.bar % (barLen * 2);
|
|
1380
|
-
const barStr = this.renderBar(barLen, barPos);
|
|
1382
|
+
const dotStr = chalk6.hex("#D4A017")(dots);
|
|
1381
1383
|
const phaseStr = this.phase ? ` ${chalk6.gray(this.limitLen(this.phase, 38))}` : "";
|
|
1382
|
-
process.stdout.write(
|
|
1383
|
-
`\r\x1B[2K ${spinnerChar} ${shimmer} ${paletteFn(dotStr)} ${barStr}${phaseStr}`
|
|
1384
|
-
);
|
|
1384
|
+
process.stdout.write(`\r\x1B[2K ${shimmer} ${dotStr}${phaseStr}`);
|
|
1385
1385
|
}
|
|
1386
1386
|
renderShimmer(text) {
|
|
1387
1387
|
let result = "";
|
|
@@ -1398,27 +1398,9 @@ var init_cooking = __esm({
|
|
|
1398
1398
|
}
|
|
1399
1399
|
return result;
|
|
1400
1400
|
}
|
|
1401
|
-
renderBar(len, pos) {
|
|
1402
|
-
let s = "";
|
|
1403
|
-
for (let i = 0; i < len; i++) {
|
|
1404
|
-
const dist = Math.abs(i - pos);
|
|
1405
|
-
if (dist < 3) {
|
|
1406
|
-
const t = 1 - dist / 3;
|
|
1407
|
-
const r = Math.floor(200 + t * 55);
|
|
1408
|
-
const g = Math.floor(160 + t * 50);
|
|
1409
|
-
const b = Math.floor(20 + t * 30);
|
|
1410
|
-
s += chalk6.rgb(r, g, b)("\u258C");
|
|
1411
|
-
} else if (dist < 6) {
|
|
1412
|
-
s += chalk6.rgb(140, 100, 20)("\u258C");
|
|
1413
|
-
} else {
|
|
1414
|
-
s += chalk6.rgb(50, 35, 10)(" ");
|
|
1415
|
-
}
|
|
1416
|
-
}
|
|
1417
|
-
return `[${s}]`;
|
|
1418
|
-
}
|
|
1419
1401
|
limitLen(s, max) {
|
|
1420
1402
|
if (s.length <= max) return s;
|
|
1421
|
-
return s.slice(0, max -
|
|
1403
|
+
return s.slice(0, max - 1) + "\u2026";
|
|
1422
1404
|
}
|
|
1423
1405
|
};
|
|
1424
1406
|
}
|
|
@@ -1612,7 +1594,17 @@ var init_exporter = __esm({
|
|
|
1612
1594
|
import readline from "readline";
|
|
1613
1595
|
import { stdin, stdout } from "process";
|
|
1614
1596
|
import chalk8 from "chalk";
|
|
1597
|
+
function stripAnsi2(s) {
|
|
1598
|
+
return s.replace(/\x1B\[[0-9;]*[a-zA-Z]/g, "");
|
|
1599
|
+
}
|
|
1615
1600
|
async function select(question, options, defaultIndex = 0) {
|
|
1601
|
+
const isTTY = stdin.isTTY && stdout.isTTY;
|
|
1602
|
+
if (!isTTY) {
|
|
1603
|
+
return fallbackPrompt(question, options, defaultIndex);
|
|
1604
|
+
}
|
|
1605
|
+
return arrowSelect(question, options, defaultIndex);
|
|
1606
|
+
}
|
|
1607
|
+
async function arrowSelect(question, options, defaultIndex) {
|
|
1616
1608
|
return new Promise((resolve) => {
|
|
1617
1609
|
let selected = defaultIndex;
|
|
1618
1610
|
const render = (initial = false) => {
|
|
@@ -1631,8 +1623,7 @@ async function select(question, options, defaultIndex = 0) {
|
|
|
1631
1623
|
};
|
|
1632
1624
|
render(true);
|
|
1633
1625
|
readline.emitKeypressEvents(stdin);
|
|
1634
|
-
|
|
1635
|
-
if (wasTTY) stdin.setRawMode(true);
|
|
1626
|
+
stdin.setRawMode(true);
|
|
1636
1627
|
const onKeypress = (_str, key) => {
|
|
1637
1628
|
if (!key) return;
|
|
1638
1629
|
if (key.name === "up" && selected > 0) {
|
|
@@ -1642,16 +1633,16 @@ async function select(question, options, defaultIndex = 0) {
|
|
|
1642
1633
|
selected++;
|
|
1643
1634
|
render();
|
|
1644
1635
|
} else if (key.name === "return") {
|
|
1645
|
-
|
|
1636
|
+
stdin.setRawMode(false);
|
|
1646
1637
|
stdin.removeListener("keypress", onKeypress);
|
|
1647
1638
|
stdin.pause();
|
|
1648
1639
|
stdout.write(`\x1B[${options.length + 1}A`);
|
|
1649
1640
|
stdout.write("\x1B[J");
|
|
1650
|
-
console.log(` ${chalk8.green("\u2713")} ${chalk8.white.bold(question)} ${chalk8.hex("#D4A017")(options[selected].label)}
|
|
1641
|
+
console.log(` ${chalk8.green("\u2713")} ${chalk8.white.bold(question)} ${chalk8.hex("#D4A017")(stripAnsi2(options[selected].label))}
|
|
1651
1642
|
`);
|
|
1652
1643
|
resolve(options[selected].value);
|
|
1653
1644
|
} else if (key.ctrl && key.name === "c" || key.name === "escape") {
|
|
1654
|
-
|
|
1645
|
+
stdin.setRawMode(false);
|
|
1655
1646
|
stdin.removeListener("keypress", onKeypress);
|
|
1656
1647
|
process.exit(0);
|
|
1657
1648
|
}
|
|
@@ -1660,6 +1651,45 @@ async function select(question, options, defaultIndex = 0) {
|
|
|
1660
1651
|
stdin.on("keypress", onKeypress);
|
|
1661
1652
|
});
|
|
1662
1653
|
}
|
|
1654
|
+
async function fallbackPrompt(question, options, defaultIndex) {
|
|
1655
|
+
return new Promise((resolve) => {
|
|
1656
|
+
const rl = readline.createInterface({ input: stdin, output: stdout });
|
|
1657
|
+
console.log(` ${chalk8.hex("#D4A017")("?")} ${chalk8.white.bold(question)}
|
|
1658
|
+
`);
|
|
1659
|
+
for (let i = 0; i < options.length; i++) {
|
|
1660
|
+
const marker = i === defaultIndex ? chalk8.green(" \u2605") : " ";
|
|
1661
|
+
console.log(` ${chalk8.gray(`[${i + 1}]`)}${marker} ${chalk8.white(options[i].label)}`);
|
|
1662
|
+
}
|
|
1663
|
+
console.log("");
|
|
1664
|
+
const def = String(defaultIndex + 1);
|
|
1665
|
+
const ask = () => {
|
|
1666
|
+
rl.question(` ${chalk8.hex("#D4A017")(">")} ${chalk8.gray(`Choose [1-${options.length}] (${def})`)}: `, (answer) => {
|
|
1667
|
+
const trimmed = answer.trim();
|
|
1668
|
+
if (!trimmed) {
|
|
1669
|
+
rl.close();
|
|
1670
|
+
const label = stripAnsi2(options[defaultIndex].label);
|
|
1671
|
+
console.log(` ${chalk8.green("\u2713")} ${chalk8.hex("#D4A017")(label)}
|
|
1672
|
+
`);
|
|
1673
|
+
resolve(options[defaultIndex].value);
|
|
1674
|
+
return;
|
|
1675
|
+
}
|
|
1676
|
+
const idx = parseInt(trimmed, 10);
|
|
1677
|
+
if (idx >= 1 && idx <= options.length) {
|
|
1678
|
+
rl.close();
|
|
1679
|
+
const label = stripAnsi2(options[idx - 1].label);
|
|
1680
|
+
console.log(` ${chalk8.green("\u2713")} ${chalk8.hex("#D4A017")(label)}
|
|
1681
|
+
`);
|
|
1682
|
+
resolve(options[idx - 1].value);
|
|
1683
|
+
} else {
|
|
1684
|
+
console.log(` ${chalk8.red("\u2717")} Enter 1-${options.length}
|
|
1685
|
+
`);
|
|
1686
|
+
ask();
|
|
1687
|
+
}
|
|
1688
|
+
});
|
|
1689
|
+
};
|
|
1690
|
+
ask();
|
|
1691
|
+
});
|
|
1692
|
+
}
|
|
1663
1693
|
var init_select = __esm({
|
|
1664
1694
|
"src/cli/select.ts"() {
|
|
1665
1695
|
"use strict";
|
package/dist/cli/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../package.json","../../src/cli/banner.ts","../../src/assets/asset-map.ts","../../src/config/index.ts","../../src/network/download.ts","../../src/logger/index.ts","../../src/platforms/framer.ts","../../src/platforms/webflow.ts","../../src/platforms/wix.ts","../../src/platforms/detect.ts","../../src/platforms/index.ts","../../src/exporter/capture.ts","../../src/network/pool.ts","../../src/exporter/download.ts","../../src/formatter/prettify.ts","../../src/server/template.ts","../../src/exporter/output.ts","../../src/cli/box.ts","../../src/exporter/summary.ts","../../src/cli/cooking.ts","../../src/exporter/index.ts","../../src/cli/select.ts","../../src/cli/setup.ts","../../src/cli/index.ts","../../src/cli/help.ts","../../src/cli/update-check.ts"],"sourcesContent":["{\n \"name\": \"framer-export\",\n \"version\": \"4.3.2\",\n \"description\": \"Export any Framer, Webflow, or Wix site into a fully working local mirror. Downloads all assets, strips badges, rewrites URLs, and pretty-prints JS.\",\n \"type\": \"module\",\n \"main\": \"dist/cli/index.js\",\n \"types\": \"dist/cli/index.d.ts\",\n \"bin\": {\n \"framer-export\": \"./bin/framer-export.js\",\n \"fexport\": \"./bin/fexport.js\",\n \"framerexport\": \"./bin/framerexport.js\"\n },\n \"files\": [\n \"dist/\",\n \"bin/\",\n \"LICENSE\",\n \"README.md\"\n ],\n \"scripts\": {\n \"start\": \"tsx src/cli/index.ts\",\n \"dev\": \"tsx src/cli/index.ts\",\n \"build\": \"tsup\",\n \"typecheck\": \"tsc --noEmit\",\n \"format\": \"prettier --write \\\"src/**/*.ts\\\"\",\n \"prepublishOnly\": \"npm run build\",\n \"prepack\": \"npm run build\"\n },\n \"keywords\": [\n \"framer\",\n \"webflow\",\n \"wix\",\n \"exporter\",\n \"export\",\n \"scraper\",\n \"mirror\",\n \"site-downloader\",\n \"site-export\",\n \"cli\"\n ],\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"git+https://github.com/danbenba/FramerExport.git\"\n },\n \"homepage\": \"https://github.com/danbenba/FramerExport#readme\",\n \"bugs\": {\n \"url\": \"https://github.com/danbenba/FramerExport/issues\"\n },\n \"license\": \"MIT\",\n \"author\": \"Dany (danbenba)\",\n \"engines\": {\n \"node\": \">=18.0.0\"\n },\n \"dependencies\": {\n \"chalk\": \"^5.3.0\",\n \"ora\": \"^8.0.0\",\n \"prettier\": \"^3.2.0\",\n \"puppeteer\": \"^22.0.0\",\n \"readline-promise\": \"^1.0.5\"\n },\n \"devDependencies\": {\n \"@types/node\": \"^22.0.0\",\n \"tsup\": \"^8.5.1\",\n \"tsx\": \"^4.7.0\",\n \"typescript\": \"^5.4.0\"\n }\n}\n","import chalk from 'chalk';\nimport pkg from '../../package.json';\n\nfunction getWidth(): number {\n return process.stdout.columns || 80;\n}\n\nconst ASCII_ART = [\n '███████╗███████╗██╗ ██╗██████╗ ██████╗ ██████╗ ████████╗',\n '██╔════╝██╔════╝╚██╗██╔╝██╔══██╗██╔═══██╗██╔══██╗╚══██╔══╝',\n '█████╗ █████╗ ╚███╔╝ ██████╔╝██║ ██║██████╔╝ ██║ ',\n '██╔══╝ ██╔══╝ ██╔██╗ ██╔═══╝ ██║ ██║██╔══██╗ ██║ ',\n '██║ ███████╗██╔╝ ██╗██║ ╚██████╔╝██║ ██║ ██║ ',\n '╚═╝ ╚══════╝╚═╝ ╚═╝╚═╝ ╚═════╝ ╚═╝ ╚═╝ ╚═╝',\n];\n\nexport function showBanner(): void {\n const width = getWidth();\n const isSmall = width < 65;\n\n if (isSmall) {\n console.log(`\\n ${chalk.hex('#D4A017').bold('F-EXPORT')} ${chalk.gray(`v${pkg.version}`)}`);\n console.log(` ${chalk.white.bold('Framer · Webflow · Wix Exporter')}\\n`);\n return;\n }\n\n const gold = chalk.hex('#D4A017').bold;\n const gray = chalk.gray;\n\n console.log('');\n ASCII_ART.forEach((line) => {\n console.log(' ' + gold(line));\n });\n console.log('');\n console.log(` ${gray(`v${pkg.version}`)} ${chalk.white.bold('Framer · Webflow · Wix Exporter')}\\n`);\n}\n","import path from 'path';\nimport crypto from 'crypto';\nimport { URL } from 'url';\nimport type { PlatformHandler } from '../platforms/types.js';\n\ninterface AssetEntry {\n localPath: string;\n}\n\nexport class AssetMap {\n entries: Map<string, AssetEntry> = new Map();\n buffers: Map<string, Buffer> = new Map();\n\n localPathFor(urlStr: string, platform?: PlatformHandler): string | null {\n if (this.entries.has(urlStr)) return this.entries.get(urlStr)!.localPath;\n\n let parsed: URL;\n try {\n parsed = new URL(urlStr);\n } catch {\n return null;\n }\n\n const host: string = parsed.hostname;\n const pathname: string = parsed.pathname;\n const ext: string = path.extname(pathname.split('?')[0]).toLowerCase();\n\n let dir: string | null = null;\n\n if (platform) {\n dir = platform.mapAssetDir(host, pathname, ext);\n }\n\n if (!dir) {\n dir = this.fallbackDir(host, ext);\n }\n\n let filename: string;\n const baseName: string = path.basename(pathname.split('?')[0]);\n const hash: string = crypto.createHash('md5').update(urlStr).digest('hex').slice(0, 6);\n\n if (baseName && baseName.length > 1 && baseName !== '/') {\n const clean: string = baseName.replace(/[^a-zA-Z0-9._-]/g, '_');\n filename = clean.includes('.') ? clean : `${clean}-${hash}`;\n } else {\n filename = `asset-${hash}${ext || ''}`;\n }\n\n if (ext === '.mjs' || ext === '.js') {\n filename = baseName.replace(/[^a-zA-Z0-9._-]/g, '_');\n }\n\n const localPath: string = `${dir}/${filename}`;\n this.entries.set(urlStr, { localPath });\n\n const base: string = urlStr.split('?')[0];\n if (base !== urlStr && !this.entries.has(base)) {\n this.entries.set(base, { localPath });\n }\n\n return localPath;\n }\n\n rewrite(text: string, fromDir: string = ''): string {\n const sorted = [...this.entries.entries()].sort((a, b) => b[0].length - a[0].length);\n let out: string = text;\n for (const [url, { localPath }] of sorted) {\n const rel: string = fromDir ? path.posix.relative(fromDir, localPath) : localPath;\n out = out.split(url).join(rel);\n if (url.includes('&')) {\n out = out.split(url.replace(/&/g, '&')).join(rel);\n }\n }\n return out;\n }\n\n private fallbackDir(host: string, ext: string): string {\n if (host.includes('fonts.gstatic.com') || host.includes('fonts.googleapis.com')) {\n return 'assets/fonts';\n }\n return ext === '.mjs' || ext === '.js' ? 'scripts/vendor' : 'assets/misc';\n }\n}\n","import type { Config } from '../types.js';\n\nexport const CFG: Config = {\n viewport: { width: 1440, height: 900 },\n timeout: 90000,\n scrollStep: 250,\n scrollDelay: 60,\n concurrency: 12,\n retries: 3,\n dlTimeout: 30000,\n sharedStripDomains: [\n 'sentry.io', 'www.googletagmanager.com', 'connect.facebook.net',\n 'stats.g.doubleclick.net',\n 'google-analytics.com',\n ],\n};\n","import https from 'https';\nimport http from 'http';\nimport { URL } from 'url';\nimport { CFG } from '../config/index.js';\n\nexport function dlBuffer(url: string, retries: number = CFG.retries): Promise<Buffer> {\n return new Promise((resolve, reject) => {\n const proto = url.startsWith('https') ? https : http;\n const go = (left: number): void => {\n const req = proto.get(url, { timeout: CFG.dlTimeout }, (res) => {\n if (res.statusCode! >= 300 && res.statusCode! < 400 && res.headers.location) {\n return dlBuffer(new URL(res.headers.location, url).href, left).then(resolve, reject);\n }\n if (res.statusCode !== 200) {\n return left > 1\n ? setTimeout(() => go(left - 1), 500)\n : reject(new Error(`HTTP ${res.statusCode}`));\n }\n const ch: Buffer[] = [];\n res.on('data', (c: Buffer) => ch.push(c));\n res.on('end', () => resolve(Buffer.concat(ch)));\n res.on('error', (e: Error) => (left > 1 ? setTimeout(() => go(left - 1), 500) : reject(e)));\n });\n req.on('error', (e: Error) => (left > 1 ? setTimeout(() => go(left - 1), 500) : reject(e)));\n req.on('timeout', () => {\n req.destroy();\n left > 1 ? setTimeout(() => go(left - 1), 500) : reject(new Error('Timeout'));\n });\n };\n go(retries);\n });\n}\n","import chalk from 'chalk';\nimport type { CookingSpinner } from '../cli/cooking.js';\n\nlet _cooking: CookingSpinner | null = null;\n\nexport function setCooking(spinner: CookingSpinner | null): void {\n _cooking = spinner;\n}\n\nconst T = (): string => new Date().toISOString().slice(11, 19);\n\nconst MSG_COLORS: Array<(s: string) => string> = [\n (s: string) => chalk.hex('#e8c33a')(s),\n (s: string) => chalk.hex('#d4a76a')(s),\n (s: string) => chalk.hex('#c8a040')(s),\n (s: string) => chalk.hex('#e0b040')(s),\n (s: string) => chalk.hex('#dab660')(s),\n (s: string) => chalk.hex('#c4953a')(s),\n (s: string) => chalk.hex('#daa520')(s),\n (s: string) => chalk.hex('#b8960a')(s),\n];\n\nlet _msgIdx = 0;\n\nfunction trunc(text: string, max: number): string {\n if (text.length <= max) return text;\n return text.slice(0, max - 2) + '..';\n}\n\nfunction nextColor(): (s: string) => string {\n return MSG_COLORS[_msgIdx++ % MSG_COLORS.length];\n}\n\nfunction output(line: string): void {\n if (_cooking) {\n _cooking.log(line);\n } else {\n console.log(line);\n }\n}\n\nexport const log = (m: string): void =>\n output(`${chalk.hex('#6d6d6d')(`[${T()}]`)} ${chalk.hex('#D4A017')('[LOG]')} ${nextColor()(trunc(m, 120))}`);\n\nexport const info = (m: string): void =>\n output(`${chalk.hex('#757575')(`[${T()}]`)} ${chalk.hex('#E8A317').bold('[INFO]')} ${chalk.bold(trunc(m, 120))}`);\n\nexport const warn = (m: string): void => {\n const line = `${chalk.hex('#8a8a8a')(`[${T()}]`)} ${chalk.hex('#CC7722').bold('[WARN]')} ${chalk.hex('#CC7722')(trunc(m, 120))}`;\n if (_cooking) _cooking.log(line);\n else console.warn(line);\n};\n\nexport const success = (m: string): void =>\n output(`${chalk.hex('#7a7a7a')(`[${T()}]`)} ${chalk.greenBright('[OK]')} ${chalk.green(trunc(m, 120))}`);\n\nexport const error = (m: string): void => {\n const line = `${chalk.hex('#888888')(`[${T()}]`)} ${chalk.redBright('[ERROR]')} ${chalk.red.bold(trunc(m, 120))}`;\n if (_cooking) _cooking.log(line);\n else console.error(line);\n};\n","import type { PlatformHandler } from './types.js';\n\nconst FONT_EXTS: string[] = ['.woff2', '.woff', '.ttf', '.otf'];\n\nexport const framer: PlatformHandler = {\n name: 'framer',\n displayName: 'Framer',\n\n detectByUrl(url: string): boolean {\n return /\\.framer\\.(app|website)|framercanvas\\.com/.test(url);\n },\n\n detectByHtml(html: string): boolean {\n return (\n html.includes('id=\"main\"') &&\n (html.includes('framerstatic.com') || html.includes('framerusercontent.com'))\n );\n },\n\n stripDomains: ['events.framer.com', 'api.framer.com', 'collect.frameranalytics.com'],\n\n stripSelectors: [\n 'script[src*=\"events.framer.com\"]',\n '#__framer-badge-container',\n '#__framer-badge',\n 'link[href*=\"canvas-sandbox\"]',\n 'script[src*=\"framer.com/bootstrap\"]',\n ],\n\n stripPatterns: [\n /<div id=\"__framer-badge-container\"[^>]*><\\/div>/g,\n /<script>try\\{if\\(localStorage\\.get\\(\"__framer_force_showing_editorbar_since\"\\)\\)[^<]*<\\/script>/g,\n ],\n\n hydrationTimeout: 10000,\n needsHydrationCheck: true,\n\n mapAssetDir(host: string, pathname: string, ext: string): string | null {\n if (host.includes('framerusercontent.com')) {\n if (pathname.startsWith('/images/')) return 'assets/images';\n if (pathname.startsWith('/assets/')) {\n return FONT_EXTS.includes(ext) ? 'assets/fonts' : 'assets/misc';\n }\n if (pathname.startsWith('/sites/')) {\n if (ext === '.mjs' || ext === '.js') return 'scripts/vendor';\n if (ext === '.json') return 'data';\n if (ext === '.css') return 'styles';\n if (ext === '.framercms') return 'data';\n return 'assets/misc';\n }\n if (pathname.startsWith('/modules/')) {\n return ext === '.framercms' ? 'data' : 'scripts/modules';\n }\n return 'assets/misc';\n }\n\n if (host.includes('app.framerstatic.com')) {\n if (ext === '.css') return 'styles';\n if (ext === '.mjs' || ext === '.js') return 'scripts/vendor';\n if (ext === '.woff2' || ext === '.woff') return 'assets/fonts';\n if (ext === '.png' || ext === '.svg') return 'assets/images';\n return 'assets/misc';\n }\n\n if (host.includes('framercanvas.com') || host.includes('framer.com')) {\n if (ext === '.mjs' || ext === '.js') return 'scripts/vendor';\n if (ext === '.css') return 'styles';\n return 'assets/misc';\n }\n\n return null;\n },\n};\n","import type { PlatformHandler } from './types.js';\n\nconst IMG_EXTS: string[] = ['.jpg', '.jpeg', '.png', '.gif', '.svg', '.webp', '.avif'];\nconst FONT_EXTS: string[] = ['.woff2', '.woff', '.ttf', '.otf', '.eot'];\nconst VIDEO_EXTS: string[] = ['.mp4', '.webm', '.ogg'];\n\nexport const webflow: PlatformHandler = {\n name: 'webflow',\n displayName: 'Webflow',\n\n detectByUrl(url: string): boolean {\n return /\\.webflow\\.(io|com)/.test(url);\n },\n\n detectByHtml(html: string): boolean {\n return (\n html.includes('data-wf-site') ||\n html.includes('w-webflow-badge') ||\n html.includes('Webflow') ||\n html.includes('webflow.js')\n );\n },\n\n stripDomains: ['js-agent.newrelic.com', 'cdn.heapanalytics.com', 'tr.snapchat.com'],\n\n stripSelectors: ['.w-webflow-badge', 'link[href*=\"editorbar\"]'],\n\n stripPatterns: [\n /<a[^>]*class=\"[^\"]*w-webflow-badge[^\"]*\"[^>]*>[\\s\\S]*?<\\/a>/g,\n /<a[^>]*href=\"[^\"]*webflow\\.com\\?utm_campaign=brandjs[^\"]*\"[^>]*>[\\s\\S]*?<\\/a>/g,\n /<style>[^<]*\\.w-webflow-badge[^<]*<\\/style>/g,\n /Powered by <a[^>]*href=\"[^\"]*webflow\\.com\"[^>]*>[^<]*<\\/a>/g,\n /<!-- This site was created in Webflow\\.[^>]*-->/g,\n /<html([^>]*) data-wf-domain=\"[^\"]*\"/g,\n /<html([^>]*) data-wf-page=\"[^\"]*\"/g,\n /<html([^>]*) data-wf-site=\"[^\"]*\"/g,\n /<html([^>]*) data-wf-status=\"[^\"]*\"/g,\n /<meta[^>]*content=\"Webflow\"[^>]*>/g,\n ],\n\n hydrationTimeout: 2000,\n needsHydrationCheck: false,\n\n mapAssetDir(host: string, pathname: string, ext: string): string | null {\n if (\n host.includes('website-files.com') ||\n host.includes('webflow.com') ||\n host.includes('uploads-ssl.webflow.com')\n ) {\n if (VIDEO_EXTS.includes(ext)) return 'assets/videos';\n if (pathname.includes('/images/') || IMG_EXTS.includes(ext)) return 'assets/images';\n if (pathname.includes('/css/') || ext === '.css') return 'styles';\n if (pathname.includes('/js/') || ext === '.js') return 'scripts/vendor';\n if (pathname.includes('/gsap/') || pathname.includes('/plugins/')) return 'scripts/vendor';\n if (FONT_EXTS.includes(ext)) return 'assets/fonts';\n return 'assets/misc';\n }\n\n if (host.includes('d3e54v103j8qbb.cloudfront.net')) {\n if (ext === '.js') return 'scripts/vendor';\n if (ext === '.css') return 'styles';\n if (IMG_EXTS.includes(ext)) return 'assets/images';\n return 'assets/misc';\n }\n\n return null;\n },\n};\n","import type { PlatformHandler } from './types.js';\n\nconst IMG_EXTS: string[] = ['.jpg', '.jpeg', '.png', '.gif', '.svg', '.webp', '.avif', '.ico'];\nconst FONT_EXTS: string[] = ['.woff2', '.woff', '.ttf', '.otf', '.eot'];\nconst VIDEO_EXTS: string[] = ['.mp4', '.webm', '.ogg'];\n\nexport const wix: PlatformHandler = {\n name: 'wix',\n displayName: 'Wix',\n\n detectByUrl(url: string): boolean {\n return /\\.wixsite\\.com|\\.wix\\.com/.test(url);\n },\n\n detectByHtml(html: string): boolean {\n return (\n html.includes('wix-viewer-model') ||\n html.includes('id=\"WIX_ADS\"') ||\n html.includes('X-Wix-') ||\n html.includes('Wix.com') ||\n html.includes('wixcode-sdk') ||\n html.includes('data-wix') ||\n html.includes('wix-code') ||\n html.includes('WixCode') ||\n /\\bwix\\.com\\b/.test(html) ||\n /meta\\s+name=[\"']generator[\"']\\s+content=[\"'][^\"']*Wix[^\"']*[\"']/i.test(html) ||\n /_wix_/i.test(html) ||\n /wix-ecom/i.test(html)\n );\n },\n\n stripDomains: [\n 'frog.wix.com',\n 'bi.wixapi.com',\n 'fed.wixcodescheduler.com',\n 'editor.wix.com',\n 'panorama.wixapps.net',\n ],\n\n stripSelectors: ['#WIX_ADS', '.wix-ads', '#wix-badge', '#SCROLL_TO_TOP'],\n\n stripPatterns: [\n /<div[^>]*class=\"[^\"]*wix-ads[^\"]*\"[^>]*>[\\s\\S]*?<\\/div>/g,\n ],\n\n hydrationTimeout: 3000,\n needsHydrationCheck: false,\n\n mapAssetDir(host: string, pathname: string, ext: string): string | null {\n if (host === 'video.wixstatic.com') {\n return 'assets/videos';\n }\n\n if (host.includes('wixstatic.com')) {\n if (VIDEO_EXTS.includes(ext)) return 'assets/videos';\n if (pathname.includes('/images/') || IMG_EXTS.includes(ext)) return 'assets/images';\n if (ext === '.css') return 'styles';\n if (ext === '.js') return 'scripts/vendor';\n if (FONT_EXTS.includes(ext)) return 'assets/fonts';\n return 'assets/misc';\n }\n\n if (host.includes('parastorage.com')) {\n if (ext === '.js') return 'scripts/vendor';\n if (ext === '.css') return 'styles';\n if (FONT_EXTS.includes(ext)) return 'assets/fonts';\n if (IMG_EXTS.includes(ext)) return 'assets/images';\n return 'assets/misc';\n }\n\n return null;\n },\n};\n","import type { PlatformHandler, PlatformType } from './types.js';\nimport type { Page } from 'puppeteer';\nimport { framer } from './framer.js';\nimport { webflow } from './webflow.js';\nimport { wix } from './wix.js';\n\nconst ALL_PLATFORMS: PlatformHandler[] = [framer, webflow, wix];\n\nexport function detectByUrl(url: string): PlatformHandler | null {\n for (const platform of ALL_PLATFORMS) {\n if (platform.detectByUrl(url)) return platform;\n }\n return null;\n}\n\nexport function detectByHtml(html: string): PlatformHandler | null {\n for (const platform of ALL_PLATFORMS) {\n if (platform.detectByHtml(html)) return platform;\n }\n return null;\n}\n\nexport function detectPlatform(url: string, html?: string): PlatformHandler {\n const byUrl = detectByUrl(url);\n if (byUrl) return byUrl;\n\n if (html) {\n const byHtml = detectByHtml(html);\n if (byHtml) return byHtml;\n }\n\n return framer;\n}\n\nexport async function detectByDom(page: Page): Promise<PlatformHandler | null> {\n try {\n const signal: string = await page.evaluate(() => {\n const html: string = document.documentElement.outerHTML || '';\n\n if (/wix-viewer-model|_wix_|wix-ecom/i.test(html)) return 'wix';\n if (/data-wf-|w-webflow-badge|webflow\\.js/i.test(html)) return 'webflow';\n if (/framerusercontent|framercanvas|framerstatic/i.test(html)) return 'framer';\n\n const srcs: string[] = [];\n const scripts: NodeListOf<HTMLScriptElement> = document.querySelectorAll('script[src]');\n scripts.forEach((s) => { if (s.src) srcs.push(s.src); });\n const allSrcs: string = srcs.join(' ');\n if (/wixstatic\\.com|parastorage\\.com/.test(allSrcs)) return 'wix';\n if (/website-files\\.com|webflow\\.com/.test(allSrcs)) return 'webflow';\n if (/framerusercontent\\.com|framerstatic\\.com|framer\\.app/.test(allSrcs)) return 'framer';\n\n return '';\n });\n\n if (signal === 'wix') return wix;\n if (signal === 'webflow') return webflow;\n if (signal === 'framer') return framer;\n } catch {}\n return null;\n}\n\nexport function getPlatformByName(name: PlatformType): PlatformHandler {\n const map: Record<string, PlatformHandler> = { framer, webflow, wix };\n return map[name] || framer;\n}\n","export type { PlatformHandler, PlatformType } from './types.js';\nexport { framer } from './framer.js';\nexport { webflow } from './webflow.js';\nexport { wix } from './wix.js';\nexport { detectPlatform, detectByUrl, detectByHtml, detectByDom, getPlatformByName } from './detect.js';\n","import puppeteer, { type Page } from 'puppeteer';\nimport { CFG } from '../config/index.js';\nimport { log, success, info } from '../logger/index.js';\nimport { detectByDom } from '../platforms/index.js';\nimport type { ExporterContext } from '../types.js';\n\nexport async function launchAndCapture(exporter: ExporterContext): Promise<void> {\n exporter.cooking?.update('Launching browser...');\n log('Launching headless Chromium...');\n\n exporter.browser = await puppeteer.launch({\n headless: true,\n args: ['--no-sandbox', '--disable-setuid-sandbox'],\n });\n success('Chromium launched');\n\n exporter.page = await exporter.browser.newPage();\n await exporter.page.setViewport(CFG.viewport);\n log('Viewport set to ' + CFG.viewport.width + 'x' + CFG.viewport.height);\n\n await exporter.page.setUserAgent(\n 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 ' +\n '(KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36'\n );\n log('User agent set to Chrome 131');\n\n const allStripDomains: string[] = [\n ...CFG.sharedStripDomains,\n ...exporter.platform.stripDomains,\n ];\n log('Blocking ' + allStripDomains.length + ' tracking domains:');\n for (const domain of allStripDomains) {\n log(' - ' + domain);\n }\n\n let intercepted = 0;\n let blocked = 0;\n\n exporter.page.on('response', async (res) => {\n const url: string = res.url();\n if (url.startsWith('data:') || url.startsWith('blob:')) return;\n\n try {\n const host: string = new URL(url).hostname;\n if (allStripDomains.some((d) => host.includes(d))) {\n blocked++;\n return;\n }\n } catch {\n return;\n }\n\n exporter.assets.localPathFor(url, exporter.platform);\n try {\n exporter.assets.buffers.set(url, await res.buffer());\n intercepted++;\n } catch {}\n });\n\n log('Network interception enabled');\n\n exporter.cooking?.update('Navigating to site...');\n info('Navigating to ' + exporter.siteUrl);\n await exporter.page.goto(exporter.siteUrl, {\n waitUntil: 'networkidle2',\n timeout: CFG.timeout,\n });\n success('Page loaded (networkidle2)');\n log('Intercepted ' + intercepted + ' resources, blocked ' + blocked + ' tracking requests');\n\n log('Checking DOM-based platform detection...');\n const domDetected = await detectByDom(exporter.page);\n if (domDetected && domDetected.name !== exporter.platform.name) {\n log('Platform refined from DOM: ' + domDetected.displayName + ' (override: ' + exporter.platform.name + ')');\n exporter.platform = domDetected;\n }\n\n exporter.cooking?.update('Waiting for ' + exporter.platform.displayName + ' hydration...');\n\n if (exporter.platform.needsHydrationCheck) {\n log('Checking for #main element hydration...');\n log('Hydration timeout: ' + exporter.platform.hydrationTimeout + 'ms');\n const timeout = exporter.platform.hydrationTimeout;\n await exporter.page.evaluate(`\n new Promise(function(r) {\n var start = Date.now();\n var tick = function() {\n var m = document.getElementById('main') || document.body;\n if (m && m.children.length > 0) setTimeout(r, 2000);\n else if (Date.now() - start > ${timeout}) r();\n else setTimeout(tick, 200);\n };\n tick();\n })\n `);\n success('Hydration complete (SPA rendered)');\n } else {\n log('Static site detected, waiting ' + exporter.platform.hydrationTimeout + 'ms for render...');\n await new Promise<void>((r) => setTimeout(r, exporter.platform.hydrationTimeout));\n success(exporter.platform.displayName + ' page rendered');\n }\n\n exporter.cooking?.update('Scrolling page...');\n log('Starting full-page scroll (step: ' + CFG.scrollStep + 'px, delay: ' + CFG.scrollDelay + 'ms)');\n\n const scrollStep = CFG.scrollStep;\n const scrollDelay = CFG.scrollDelay;\n\n const pageHeight: number = await exporter.page.evaluate(`\n Math.max(document.body.scrollHeight, document.documentElement.scrollHeight)\n `) as number;\n log('Page height: ' + pageHeight + 'px (' + Math.ceil(pageHeight / scrollStep) + ' scroll steps)');\n\n await exporter.page.evaluate(`\n new Promise(function(r) {\n var y = 0;\n var max = Math.max(document.body.scrollHeight, document.documentElement.scrollHeight);\n var step = function() {\n y += ${scrollStep};\n window.scrollTo({ top: y, behavior: 'instant' });\n y < max + 500 ? setTimeout(step, ${scrollDelay}) : (window.scrollTo(0, 0), r());\n };\n step();\n })\n `);\n success('Full-page scroll complete');\n\n exporter.cooking?.update('Waiting for lazy resources...');\n log('Waiting 2s for lazy-loaded resources...');\n await new Promise<void>((r) => setTimeout(r, 2000));\n\n log('Checking network idle (1.5s quiet, 8s timeout)...');\n try {\n await exporter.page.waitForNetworkIdle({ idleTime: 1500, timeout: 8000 });\n success('Network idle confirmed');\n } catch {\n log('Network idle timeout reached (continuing anyway)');\n }\n\n const totalCaptured: number = exporter.assets.buffers.size;\n success('Captured ' + totalCaptured + ' network resources total');\n\n const cssCount: number = [...exporter.assets.entries.values()].filter((e) => e.localPath.endsWith('.css')).length;\n const jsCount: number = [...exporter.assets.entries.values()].filter((e) => e.localPath.endsWith('.js') || e.localPath.endsWith('.mjs')).length;\n const imgCount: number = [...exporter.assets.entries.values()].filter((e) => e.localPath.startsWith('assets/images')).length;\n const fontCount: number = [...exporter.assets.entries.values()].filter((e) => e.localPath.startsWith('assets/fonts')).length;\n log(' CSS: ' + cssCount + ' | JS: ' + jsCount + ' | Images: ' + imgCount + ' | Fonts: ' + fontCount);\n}\n\nexport async function closeBrowser(exporter: { browser: import('puppeteer').Browser | null }): Promise<void> {\n if (exporter.browser) {\n await exporter.browser.close();\n exporter.browser = null;\n log('Browser closed');\n }\n}\n\nexport async function captureSubpage(\n page: Page,\n url: string,\n platform: { needsHydrationCheck: boolean; hydrationTimeout: number }\n): Promise<string> {\n log(' Navigating to sub-page: ' + url);\n await page.goto(url, { waitUntil: 'networkidle2', timeout: CFG.timeout });\n\n if (platform.needsHydrationCheck) {\n await page.evaluate(\n `new Promise(function(r) {\n var t = Date.now();\n (function tick() {\n var m = document.getElementById('main') || document.body;\n if (m && m.children.length > 0) setTimeout(r, 500);\n else if (Date.now() - t > ${platform.hydrationTimeout}) r();\n else setTimeout(tick, 200);\n })();\n })`\n );\n } else {\n await new Promise<void>((r) => setTimeout(r, 1000));\n }\n\n const html: string = await page.evaluate(() => document.documentElement.outerHTML || document.body.innerHTML);\n log(' Sub-page fetched: ' + (html.length / 1024).toFixed(1) + ' KB');\n return html;\n}\n","export async function pool(tasks: Array<() => Promise<void>>, n: number): Promise<void> {\n let i = 0;\n const run = async (): Promise<void> => {\n while (i < tasks.length) {\n const j = i++;\n await tasks[j]();\n }\n };\n await Promise.all(Array.from({ length: Math.min(n, tasks.length) }, () => run()));\n}\n","import fs from 'fs/promises';\nimport path from 'path';\nimport { CFG } from '../config/index.js';\nimport { log, warn, success } from '../logger/index.js';\nimport { dlBuffer } from '../network/download.js';\nimport { pool } from '../network/pool.js';\nimport type { ExporterContext } from '../types.js';\n\nexport async function downloadAll(exporter: ExporterContext): Promise<void> {\n const seen: Set<string> = new Set();\n const toDownload: Array<{ url: string; localPath: string }> = [];\n for (const [url, { localPath }] of exporter.assets.entries) {\n if (seen.has(localPath)) continue;\n seen.add(localPath);\n toDownload.push({ url, localPath });\n }\n\n const total: number = toDownload.length;\n log('Starting download of ' + total + ' unique assets');\n log('Concurrency: ' + CFG.concurrency + ' parallel downloads');\n log('Retry policy: ' + CFG.retries + ' attempts, ' + CFG.dlTimeout + 'ms timeout');\n\n let ok = 0;\n let cached = 0;\n let fail = 0;\n let completed = 0;\n let lastReported = 0;\n\n const tasks: Array<() => Promise<void>> = toDownload.map(\n ({ url, localPath }) =>\n async (): Promise<void> => {\n const dest: string = path.join(exporter.outDir, localPath);\n await fs.mkdir(path.dirname(dest), { recursive: true });\n\n try {\n const buf: Buffer | undefined =\n exporter.assets.buffers.get(url) ||\n exporter.assets.buffers.get(url.split('?')[0]);\n if (buf) {\n await fs.writeFile(dest, buf);\n cached++;\n ok++;\n } else {\n const data: Buffer = await dlBuffer(url);\n await fs.writeFile(dest, data);\n ok++;\n }\n } catch (e) {\n fail++;\n if (\n !url.includes('framer.com/edit') &&\n !url.includes('framerstatic.com/editorbar')\n ) {\n warn('Download failed: ' + path.basename(localPath) + ' - ' + (e as Error).message);\n }\n }\n\n completed++;\n const pct: number = Math.floor((completed / total) * 100);\n if (pct >= lastReported + 10 || completed === total) {\n exporter.cooking?.update('Downloading... ' + completed + '/' + total + ' (' + pct + '%)');\n log('Download progress: ' + completed + '/' + total + ' (' + pct + '%)');\n lastReported = pct;\n }\n }\n );\n\n await pool(tasks, CFG.concurrency);\n\n success('Downloads complete: ' + ok + ' succeeded, ' + cached + ' from cache, ' + fail + ' failed');\n\n const totalBytes: number = [...exporter.assets.entries.values()].length;\n log('Total unique assets written to disk: ' + totalBytes);\n\n exporter.assets.buffers.clear();\n log('Network buffer cache cleared');\n}\n","import prettier from 'prettier';\n\nexport async function prettifyJS(src: string): Promise<string> {\n try {\n return await prettier.format(src, {\n parser: 'babel',\n printWidth: 100,\n tabWidth: 2,\n useTabs: false,\n semi: true,\n singleQuote: false,\n trailingComma: 'es5',\n bracketSpacing: true,\n arrowParens: 'always',\n });\n } catch {\n return src;\n }\n}\n","export const SERVE_SCRIPT: string = `#!/usr/bin/env node\nconst http = require('http');\nconst fs = require('fs');\nconst path = require('path');\n\nconst PORT = process.env.PORT || 3000;\nconst ROOT = __dirname;\n\nconst MIME = {\n '.html': 'text/html; charset=utf-8',\n '.css': 'text/css; charset=utf-8',\n '.js': 'application/javascript; charset=utf-8',\n '.mjs': 'application/javascript; charset=utf-8',\n '.json': 'application/json; charset=utf-8',\n '.png': 'image/png',\n '.jpg': 'image/jpeg',\n '.jpeg': 'image/jpeg',\n '.gif': 'image/gif',\n '.svg': 'image/svg+xml',\n '.webp': 'image/webp',\n '.avif': 'image/avif',\n '.ico': 'image/x-icon',\n '.woff': 'font/woff',\n '.woff2': 'font/woff2',\n '.ttf': 'font/ttf',\n '.otf': 'font/otf',\n '.mp4': 'video/mp4',\n '.webm': 'video/webm',\n '.ogg': 'video/ogg',\n '.framercms': 'application/octet-stream',\n};\n\nconst server = http.createServer((req, res) => {\n let url = decodeURIComponent(req.url.split('?')[0]);\n if (url === '/') url = '/index.html';\n\n let filePath = path.join(ROOT, url);\n if (!filePath.startsWith(ROOT)) {\n res.writeHead(403);\n res.end('Forbidden');\n return;\n }\n\n const serveFile = (pathToFile) => {\n fs.readFile(pathToFile, (err, data) => {\n if (err) {\n // SPA Fallback: if it's not a file, serve index.html\n if (url !== '/index.html' && !path.extname(url)) {\n return serveFile(path.join(ROOT, 'index.html'));\n }\n res.writeHead(404);\n res.end('Not found');\n return;\n }\n const ext = path.extname(pathToFile).toLowerCase();\n const mime = MIME[ext] || 'application/octet-stream';\n res.writeHead(200, {\n 'Content-Type': mime,\n 'Access-Control-Allow-Origin': '*',\n 'Cache-Control': 'public, max-age=3600',\n });\n res.end(data);\n });\n };\n\n serveFile(filePath);\n});\n\nserver.listen(PORT, () => {\n console.log('\\\\x1b[32m%s\\\\x1b[0m', ' 🚀 Cooksite Local Server Running');\n console.log('\\\\x1b[36m%s\\\\x1b[0m', ' ├─ URL: http://localhost:' + PORT);\n console.log('\\\\x1b[35m%s\\\\x1b[0m', ' └─ Directory: ' + ROOT);\n console.log('\\\\n Press Ctrl+C to stop.');\n});\n`;\n","import fs from 'fs/promises';\nimport path from 'path';\nimport { log, warn, success } from '../logger/index.js';\nimport { prettifyJS } from '../formatter/prettify.js';\nimport { SERVE_SCRIPT } from '../server/template.js';\nimport type { ExporterContext } from '../types.js';\n\nfunction escapeRegex(str: string): string {\n return str.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n}\n\nfunction stripBySelector(html: string, sel: string): string {\n if (sel.includes('[src*=\"')) {\n const match = sel.match(/\\[src\\*=\"([^\"]+)\"\\]/);\n if (match) {\n const domain: string = escapeRegex(match[1]);\n html = html.replace(new RegExp(`<script[^>]*${domain}[^>]*>[^<]*<\\\\/script>`, 'g'), '');\n html = html.replace(new RegExp(`<script[^>]*${domain}[^>]*><\\\\/script>`, 'g'), '');\n }\n } else if (sel.includes('[href*=\"')) {\n const match = sel.match(/\\[href\\*=\"([^\"]+)\"\\]/);\n if (match) {\n const href: string = escapeRegex(match[1]);\n html = html.replace(new RegExp(`<link[^>]*${href}[^>]*>`, 'g'), '');\n }\n } else if (sel.startsWith('.')) {\n const cls: string = escapeRegex(sel.slice(1));\n html = html.replace(\n new RegExp(`<[^>]*class=\"[^\"]*${cls}[^\"]*\"[^>]*>[\\\\s\\\\S]*?<\\\\/[^>]*>`, 'g'),\n ''\n );\n } else if (sel.startsWith('#')) {\n const id: string = sel.slice(1);\n html = removeElementById(html, id);\n }\n return html;\n}\n\nfunction removeElementById(html: string, id: string): string {\n const marker: string = `id=\"${id}\"`;\n let idx: number = html.indexOf(marker);\n while (idx !== -1) {\n const tagStart: number = html.lastIndexOf('<', idx);\n if (tagStart === -1) break;\n\n const tagNameEnd: number = html.indexOf(' ', tagStart + 1);\n const tagName: string = html.slice(tagStart + 1, tagNameEnd).toLowerCase();\n\n let depth = 0;\n let i: number = tagStart;\n while (i < html.length) {\n if (html.startsWith(`<${tagName}`, i) && (html[i + tagName.length + 1] === ' ' || html[i + tagName.length + 1] === '>')) {\n depth++;\n i += tagName.length + 1;\n } else if (html.startsWith(`</${tagName}>`, i)) {\n depth--;\n if (depth === 0) {\n html = html.slice(0, tagStart) + html.slice(i + tagName.length + 3);\n break;\n }\n i += tagName.length + 3;\n } else {\n i++;\n }\n }\n\n idx = html.indexOf(marker);\n }\n return html;\n}\n\nfunction processSEO(html: string, url: string): string {\n const canonical = url.split('?')[0].replace(/\\/$/, '');\n \n // Inject Canonical\n if (!html.includes('rel=\"canonical\"')) {\n html = html.replace('</head>', ` <link rel=\"canonical\" href=\"${canonical}\">\\n </head>`);\n }\n\n // Inject Meta Description if missing\n if (!html.includes('name=\"description\"')) {\n html = html.replace('</head>', ` <meta name=\"description\" content=\"Exported with Cooksite - Fast, SEO-optimized, and clean.\">\\n </head>`);\n }\n\n // Inject OG Tags if missing\n if (!html.includes('property=\"og:')) {\n html = html.replace('</head>', ` <meta property=\"og:type\" content=\"website\">\\n <meta property=\"og:url\" content=\"${canonical}\">\\n <meta property=\"og:title\" content=\"Exported Site\">\\n <meta property=\"og:description\" content=\"A fast, clean version of this site, exported for performance.\">\\n </head>`);\n }\n\n // Inject Robot tags\n if (!html.includes('name=\"robots\"')) {\n html = html.replace('</head>', ` <meta name=\"robots\" content=\"index, follow\">\\n </head>`);\n }\n\n return html;\n}\n\nfunction stripIntegrityAndCors(html: string): string {\n html = html.replace(/\\s+integrity=\"[^\"]*\"/g, '');\n html = html.replace(/\\s+crossorigin=\"[^\"]*\"/g, '');\n html = html.replace(/\\s+crossorigin/g, '');\n html = html.replace(/<link[^>]*rel=\"preconnect\"[^>]*>/g, '');\n html = html.replace(/<link[^>]*rel=\"dns-prefetch\"[^>]*>/g, '');\n html = html.replace(/<meta[^>]*content-security-policy[^>]*>/gi, '');\n return html;\n}\n\nfunction stripSrcsetCdnUrls(html: string): string {\n html = html.replace(/srcset=\"([^\"]*)\"/g, (_match: string, srcset: string) => {\n const cleaned: string = srcset\n .split(',')\n .map((entry: string) => entry.trim())\n .filter((entry: string) => !entry.startsWith('http'))\n .join(', ');\n return cleaned ? 'srcset=\"' + cleaned + '\"' : '';\n });\n return html;\n}\n\nexport async function buildOutput(exporter: ExporterContext): Promise<void> {\n exporter.cooking?.update('Stripping platform badges...');\n log('Starting HTML post-processing...');\n log('HTML size: ' + (exporter.ssrHTML.length / 1024).toFixed(1) + ' KB');\n\n let html: string = exporter.ssrHTML;\n if (!html) {\n warn('No SSR HTML available, cannot build output');\n return;\n }\n\n exporter.cooking?.update('Removing integrity checks...');\n const beforeIntegrity: number = html.length;\n html = stripIntegrityAndCors(html);\n log('Stripped integrity/crossorigin/preconnect (' + (beforeIntegrity - html.length) + ' chars)');\n success('Integrity and CORS restrictions removed');\n\n if (typeof processSEO === 'function') {\n exporter.cooking?.update('Optimizing SEO...');\n html = processSEO(html, exporter.siteUrl);\n success('SEO meta tags optimized');\n }\n\n log('Stripping ' + exporter.platform.stripSelectors.length + ' selectors:');\n for (const sel of exporter.platform.stripSelectors) {\n const before: number = html.length;\n html = stripBySelector(html, sel);\n const removed: number = before - html.length;\n if (removed > 0) {\n log(' Stripped ' + sel + ' (' + removed + ' chars removed)');\n }\n }\n\n log('Applying ' + exporter.platform.stripPatterns.length + ' regex patterns...');\n for (const pattern of exporter.platform.stripPatterns) {\n const before: number = html.length;\n html = html.replace(new RegExp(pattern.source, pattern.flags), '');\n const removed: number = before - html.length;\n if (removed > 0) {\n log(' Pattern removed ' + removed + ' chars');\n }\n }\n success('Platform badges and tracking stripped');\n\n exporter.cooking?.update('Rewriting asset URLs...');\n log('Rewriting ' + exporter.assets.entries.size + ' CDN URLs to local paths...');\n const beforeRewrite: number = html.length;\n html = exporter.assets.rewrite(html, '');\n log('HTML rewrite delta: ' + (html.length - beforeRewrite) + ' chars');\n\n exporter.cooking?.update('Cleaning srcset references...');\n html = stripSrcsetCdnUrls(html);\n log('Cleaned remaining CDN URLs from srcset attributes');\n\n await rewriteDownloadedFiles(exporter);\n success('All URLs rewritten to local paths');\n\n exporter.cooking?.update('Pretty-printing JS files...');\n await prettifyDownloadedJS(exporter);\n\n exporter.cooking?.update('Writing final output...');\n log('Writing index.html (' + (html.length / 1024).toFixed(1) + ' KB)...');\n await fs.writeFile(path.join(exporter.outDir, 'index.html'), html);\n success('index.html written');\n\n await fs.writeFile(path.join(exporter.outDir, 'serve.cjs'), SERVE_SCRIPT);\n log('serve.cjs written');\n success('Output build complete');\n}\n\nasync function rewriteDownloadedFiles(exporter: ExporterContext): Promise<void> {\n const dirs: string[] = ['scripts/vendor', 'scripts/modules', 'styles'];\n let rewritten = 0;\n\n for (const dir of dirs) {\n const fullDir: string = path.join(exporter.outDir, dir);\n let files: string[];\n try {\n files = await fs.readdir(fullDir);\n } catch {\n continue;\n }\n\n for (const file of files) {\n const ext: string = path.extname(file).toLowerCase();\n if (!['.mjs', '.js', '.css'].includes(ext)) continue;\n\n const filePath: string = path.join(fullDir, file);\n try {\n let content: string = await fs.readFile(filePath, 'utf-8');\n const before: string = content;\n content = exporter.assets.rewrite(content, dir);\n if (content !== before) {\n await fs.writeFile(filePath, content);\n rewritten++;\n }\n } catch {}\n }\n }\n log('Rewrote URLs in ' + rewritten + ' JS/CSS files');\n}\n\nasync function prettifyDownloadedJS(exporter: ExporterContext): Promise<void> {\n const dirs: string[] = ['scripts/vendor', 'scripts/modules'];\n let count = 0;\n let total = 0;\n\n for (const dir of dirs) {\n const fullDir: string = path.join(exporter.outDir, dir);\n let files: string[];\n try {\n files = await fs.readdir(fullDir);\n } catch {\n continue;\n }\n\n const jsFiles: string[] = files.filter((f) => {\n const ext: string = path.extname(f).toLowerCase();\n return ext === '.mjs' || ext === '.js';\n });\n total += jsFiles.length;\n\n for (const file of jsFiles) {\n const filePath: string = path.join(fullDir, file);\n try {\n const raw: string = await fs.readFile(filePath, 'utf-8');\n\n const nlRatio: number = (raw.match(/\\n/g) || []).length / raw.length;\n if (nlRatio > 0.05) {\n count++;\n continue;\n }\n\n const pretty: string = await prettifyJS(raw);\n await fs.writeFile(filePath, pretty, 'utf-8');\n count++;\n\n if (count % 5 === 0) {\n exporter.cooking?.update('Pretty-printing... (' + count + '/' + total + ')');\n }\n } catch (e) {\n warn('Pretty-print skipped: ' + file + ' - ' + (e as Error).message);\n count++;\n }\n }\n }\n\n success('Formatted ' + count + '/' + total + ' JS/MJS files');\n}\n","import chalk from 'chalk';\n\nexport function maxWidth(): number {\n return Math.min(process.stdout.columns || 80, 62);\n}\n\nconst B = chalk.hex('#8B6914');\nconst G = chalk.hex('#C4953A');\n\nfunction padRight(text: string, w: number): string {\n const visible = stripAnsi(text).length;\n if (visible >= w) return text;\n return text + ' '.repeat(w - visible);\n}\n\nfunction stripAnsi(s: string): string {\n return s.replace(/\\x1B\\[[0-9;]*[a-zA-Z]/g, '');\n}\n\nexport function boxTop(w: number): string {\n const inner = w - 4;\n return ' ' + B('╔═') + B('═'.repeat(inner)) + B('═╗');\n}\n\nexport function boxBot(w: number): string {\n const inner = w - 4;\n return ' ' + B('╚═') + B('═'.repeat(inner)) + B('═╝');\n}\n\nexport function boxLine(w: number, text: string): string {\n const inner = w - 4;\n const padded = padRight(text, inner);\n return ' ' + B('║ ') + padded + B(' ║');\n}\n\nexport function boxSep(w: number): string {\n const inner = w - 4;\n return ' ' + B('╠═') + B('═'.repeat(inner)) + B('═╣');\n}\n\nexport function boxRow(w: number, label: string, value: string): string {\n const inner = w - 4;\n const labelPlain = stripAnsi(chalk.bold(label));\n const visible = labelPlain.length + 1 + value.length;\n if (visible > inner) {\n const avail = inner - labelPlain.length - 2;\n const truncated = value.length > avail ? value.slice(0, avail - 1) + '..' : value;\n return ' ' + G('║ ') + chalk.bold(label) + ': ' + chalk.yellow(truncated) + ' '.repeat(Math.max(0, inner - labelPlain.length - 1 - truncated.length)) + G(' ║');\n }\n const right = inner - labelPlain.length - 1 - value.length;\n return ' ' + G('║ ') + chalk.bold(label) + ': ' + chalk.yellow(value) + ' '.repeat(right) + G(' ║');\n}\n","import fs from 'fs/promises';\nimport path from 'path';\nimport chalk from 'chalk';\nimport type { ExporterContext } from '../types.js';\nimport { boxTop, boxLine, boxBot, boxSep, maxWidth } from '../cli/box.js';\n\nexport async function printSummary(exporter: ExporterContext): Promise<void> {\n const w = maxWidth();\n const isSmall = w < 50;\n\n const count = async (d: string): Promise<number> => {\n try {\n return (await fs.readdir(path.join(exporter.outDir, d))).length;\n } catch {\n return 0;\n }\n };\n const [imgs, fonts, videos, misc, scripts, vendor, styles, data, subpages] = await Promise.all([\n count('assets/images'),\n count('assets/fonts'),\n count('assets/videos'),\n count('assets/misc'),\n count('scripts/modules'),\n count('scripts/vendor'),\n count('styles'),\n count('data'),\n count('subpages'),\n ]);\n\n const G = chalk.hex('#D4A017');\n const G2 = chalk.hex('#DAA520');\n const C2 = chalk.hex('#E0B040');\n const Y = chalk.yellow;\n const O = chalk.hex('#CC7722');\n const Br = chalk.hex('#B8860B');\n const Gr = chalk.gray;\n const Gn = chalk.green;\n\n const entries: Array<[string, number, string, (s: string) => string]> = [\n ['styles/', styles, 'CSS', G],\n ['scripts/vendor/', vendor, 'JS vendor', G2],\n ['scripts/modules/', scripts, 'JS modules', C2],\n ['assets/images/', imgs, 'images', Y],\n ['assets/videos/', videos, 'videos', O],\n ['assets/fonts/', fonts, 'fonts', Br],\n ['assets/misc/', misc, 'misc', Gr],\n ['data/', data, 'data', Gr],\n ['subpages/', subpages, 'pages', Gn],\n ];\n\n console.log('');\n if (!isSmall) {\n console.log(boxTop(w));\n console.log(boxLine(w, chalk.bold.white(' Export Summary')));\n console.log(boxSep(w));\n } else {\n console.log(chalk.bold.white(' Export Summary:'));\n }\n\n for (const [label, cnt, type, color] of entries) {\n if (cnt === 0) continue;\n const inner = w - 4;\n const l = label.padEnd(16);\n const c = String(cnt).padStart(3);\n const rowText = `${color(l)}${chalk.white(c)} ${chalk.gray(type)}`;\n const visible = 16 + 3 + 2 + type.length;\n const pad = Math.max(0, inner - visible);\n if (isSmall) {\n console.log(` ${color(label)} ${chalk.white(String(cnt))} ${chalk.gray(type)}`);\n } else {\n console.log(' ' + chalk.hex('#C4953A')('║ ') + rowText + ' '.repeat(pad) + chalk.hex('#C4953A')(' ║'));\n }\n }\n\n if (!isSmall) {\n console.log(boxBot(w));\n }\n\n console.log('');\n const cdCmd = 'cd ' + path.basename(exporter.outDir) + ' && node serve.cjs';\n if (!isSmall) {\n console.log(boxTop(w));\n console.log(boxLine(w, chalk.bold.white(' To serve locally')));\n console.log(boxSep(w));\n const inner = w - 6;\n const cmdLen = cdCmd.length;\n const pad = Math.max(0, inner - cmdLen);\n console.log(' ' + chalk.hex('#C4953A')('║ ') + G(cdCmd) + ' '.repeat(pad) + chalk.hex('#9e9e9e')(' 🗐') + chalk.hex('#C4953A')(' ║'));\n console.log(boxBot(w));\n } else {\n console.log(chalk.bold.white(' To serve locally:'));\n console.log(` ${G(cdCmd)}`);\n }\n \n console.log('');\n console.log(chalk.gray(' NOTE: Must be served via HTTP for JS modules to work.'));\n console.log('');\n}\n","import chalk from 'chalk';\n\nconst SHINE_WIDTH = 10;\nconst FRAME_INTERVAL = 140;\nconst SPINNER_FRAMES = ['⠋', '⠙', '⠹', '⠸', '⠼', '⠴', '⠦', '⠧', '⠇', '⠏'];\n\nconst PALETTE: Array<(s: string) => string> = [\n (s) => chalk.hex('#D4A017')(s),\n (s) => chalk.hex('#E8A317')(s),\n (s) => chalk.hex('#DAA520')(s),\n (s) => chalk.hex('#F0C040')(s),\n (s) => chalk.hex('#C4953A')(s),\n (s) => chalk.hex('#E6B83C')(s),\n (s) => chalk.hex('#C8A951')(s),\n (s) => chalk.hex('#D9B44D')(s),\n];\n\nexport class CookingSpinner {\n private interval: NodeJS.Timeout | null = null;\n private bgInterval: NodeJS.Timeout | null = null;\n private frame = 0;\n private phase = '';\n private active = false;\n private bar = 0;\n private barDir = 1;\n\n start(phase: string = ''): void {\n this.phase = phase;\n this.frame = 0;\n this.bar = 0;\n this.barDir = 1;\n this.active = true;\n this.draw();\n this.interval = setInterval(() => {\n this.frame++;\n this.draw();\n }, FRAME_INTERVAL);\n this.bgInterval = setInterval(() => {\n this.bar++;\n this.draw();\n }, 800);\n }\n\n update(phase: string): void {\n this.phase = phase;\n if (!this.active) this.draw();\n }\n\n log(message: string): void {\n if (this.active) {\n process.stdout.write('\\r\\x1B[2K');\n }\n process.stdout.write(message + '\\n');\n if (this.active) {\n this.draw();\n }\n }\n\n stop(): void {\n this.active = false;\n if (this.interval) { clearInterval(this.interval); this.interval = null; }\n if (this.bgInterval) { clearInterval(this.bgInterval); this.bgInterval = null; }\n process.stdout.write('\\r\\x1B[2K');\n }\n\n private draw(): void {\n if (!this.active) return;\n\n const spinner = SPINNER_FRAMES[this.frame % SPINNER_FRAMES.length];\n const paletteFn = PALETTE[this.frame % PALETTE.length];\n\n const dotPhase = Math.floor(this.frame / 3) % 4;\n const dotStr = dotPhase === 0 ? ' ' : dotPhase === 1 ? '. ' : dotPhase === 2 ? '.. ' : '...';\n\n const shimmer = this.renderShimmer('Cooking');\n const spinnerChar = chalk.hex('#F0C040')(spinner);\n\n const barLen = 12;\n const barPos = this.bar % (barLen * 2);\n const barStr = this.renderBar(barLen, barPos);\n\n const phaseStr = this.phase ? ` ${chalk.gray(this.limitLen(this.phase, 38))}` : '';\n\n process.stdout.write(\n `\\r\\x1B[2K ${spinnerChar} ${shimmer} ${paletteFn(dotStr)} ${barStr}${phaseStr}`\n );\n }\n\n private renderShimmer(text: string): string {\n let result = '';\n const pos = this.frame % (text.length + SHINE_WIDTH * 2) - SHINE_WIDTH;\n for (let i = 0; i < text.length; i++) {\n const dist = Math.abs(i - pos);\n if (dist < SHINE_WIDTH) {\n const t = 1 - dist / SHINE_WIDTH;\n const g = Math.floor(160 + t * 95);\n result += chalk.rgb(g, g, g)(text[i]);\n } else {\n result += chalk.rgb(160, 160, 160)(text[i]);\n }\n }\n return result;\n }\n\n private renderBar(len: number, pos: number): string {\n let s = '';\n for (let i = 0; i < len; i++) {\n const dist = Math.abs(i - pos);\n if (dist < 3) {\n const t = 1 - dist / 3;\n const r = Math.floor(200 + t * 55);\n const g = Math.floor(160 + t * 50);\n const b = Math.floor(20 + t * 30);\n s += chalk.rgb(r, g, b)('▌');\n } else if (dist < 6) {\n s += chalk.rgb(140, 100, 20)('▌');\n } else {\n s += chalk.rgb(50, 35, 10)(' ');\n }\n }\n return `[${s}]`;\n }\n\n private limitLen(s: string, max: number): string {\n if (s.length <= max) return s;\n return s.slice(0, max - 3) + '…';\n }\n}\n","import fs from 'fs/promises';\nimport path from 'path';\nimport chalk from 'chalk';\nimport type { Browser, Page } from 'puppeteer';\nimport { AssetMap } from '../assets/asset-map.js';\nimport { dlBuffer } from '../network/download.js';\nimport { info, log, success, setCooking } from '../logger/index.js';\nimport { launchAndCapture, captureSubpage, closeBrowser } from './capture.js';\nimport { downloadAll } from './download.js';\nimport { buildOutput } from './output.js';\nimport { printSummary } from './summary.js';\nimport { detectPlatform, getPlatformByName } from '../platforms/index.js';\nimport type { PlatformHandler, PlatformType } from '../platforms/types.js';\nimport type { ExporterContext } from '../types.js';\nimport { CookingSpinner } from '../cli/cooking.js';\n\nexport function deriveOutputName(url: string, platformName: PlatformType): string {\n try {\n const parsed = new URL(url);\n const hostname: string = parsed.hostname;\n\n let siteName: string;\n if (hostname.endsWith('.webflow.io')) {\n siteName = hostname.replace('.webflow.io', '');\n } else if (hostname.includes('.wixsite.com')) {\n const parts: string[] = parsed.pathname.split('/').filter(Boolean);\n siteName = parts[0] || hostname.split('.')[0];\n } else if (hostname.match(/\\.framer\\.(app|website|ai)$/)) {\n siteName = hostname.split('.framer.')[0];\n } else {\n siteName = hostname.replace(/\\./g, '-');\n }\n\n return `${platformName}-${siteName}`;\n } catch {\n return 'framer-export-output';\n }\n}\n\nexport class FramerExporter implements ExporterContext {\n siteUrl: string;\n outDir: string;\n assets: AssetMap;\n browser: Browser | null;\n page: Page | null;\n ssrHTML: string;\n prettyPrint: boolean;\n platform: PlatformHandler;\n cooking?: CookingSpinner;\n\n constructor(siteUrl: string, outDir: string, platformOverride?: PlatformType) {\n this.siteUrl = siteUrl;\n this.outDir = outDir;\n this.assets = new AssetMap();\n this.browser = null;\n this.page = null;\n this.ssrHTML = '';\n this.prettyPrint = true;\n\n if (platformOverride && platformOverride !== 'unknown') {\n this.platform = getPlatformByName(platformOverride);\n } else {\n this.platform = detectPlatform(siteUrl);\n }\n }\n\n async run(includeSubpages: boolean = false): Promise<void> {\n console.log(chalk.bold.hex('#D4A017')('\\n Cooksite v4 - Full Mirror & Clean Export\\n'));\n info('Source : ' + chalk.underline(this.siteUrl));\n info('Output : ' + chalk.yellow(this.outDir));\n info('Platform : ' + chalk.hex('#D4A017')(this.platform.displayName));\n if (includeSubpages) {\n info('Subpages : ' + chalk.green('enabled'));\n }\n console.log('');\n\n this.cooking = new CookingSpinner();\n setCooking(this.cooking);\n this.cooking.start('Preparing directories...');\n\n for (const d of [\n '',\n 'assets/images',\n 'assets/fonts',\n 'assets/videos',\n 'assets/misc',\n 'styles',\n 'scripts/vendor',\n 'scripts/modules',\n 'data',\n 'subpages',\n ]) {\n await fs.mkdir(path.join(this.outDir, d), { recursive: true });\n }\n log('Output directory structure created');\n\n this.cooking.update('Fetching SSR HTML...');\n log('Fetching SSR HTML from ' + this.siteUrl);\n try {\n const buf: Buffer = await dlBuffer(this.siteUrl);\n this.ssrHTML = buf.toString('utf-8');\n success('SSR HTML fetched (' + (this.ssrHTML.length / 1024).toFixed(1) + ' KB)');\n } catch (e) {\n log(chalk.red('Could not fetch SSR HTML: ' + (e as Error).message));\n }\n\n const htmlDetected = detectPlatform(this.siteUrl, this.ssrHTML);\n if (htmlDetected.name !== this.platform.name) {\n this.platform = htmlDetected;\n log('Platform refined: ' + chalk.hex('#D4A017')(this.platform.displayName) + ' (from HTML analysis)');\n }\n\n await launchAndCapture(this);\n\n if (includeSubpages && this.page) {\n await this.crawlSubpages();\n }\n\n await closeBrowser(this);\n\n this.cooking.update('Downloading assets...');\n await downloadAll(this);\n\n this.cooking.update('Building output...');\n await buildOutput(this);\n\n this.cooking.stop();\n setCooking(null);\n\n console.log('');\n success('Export complete!');\n await printSummary(this);\n }\n\n private async crawlSubpages(): Promise<void> {\n this.cooking?.update('Discovering sub-pages...');\n log('Scanning page for internal links...');\n\n const page = this.page!;\n const baseUrl = new URL(this.siteUrl);\n const baseHost = baseUrl.hostname.replace(/^www\\./, '');\n\n const links: string[] = await page.evaluate((host: string) => {\n const anchors = Array.from(document.querySelectorAll('a[href]'));\n const hrefs = new Set<string>();\n for (const a of anchors) {\n const href = (a as HTMLAnchorElement).href;\n if (!href || href.startsWith('javascript:') || href.startsWith('mailto:') || href.startsWith('tel:') || href.startsWith('#')) continue;\n try {\n const u = new URL(href);\n const h = u.hostname.replace(/^www\\./, '');\n if (h === host && u.pathname !== '/' && u.pathname !== '' && !u.pathname.startsWith('/#')) {\n hrefs.add(href.split('#')[0]);\n }\n } catch {}\n }\n return Array.from(hrefs);\n }, baseHost);\n\n log('Found ' + links.length + ' sub-page links');\n const uniqueLinks = [...new Set(links)].slice(0, 50);\n\n if (uniqueLinks.length === 0) {\n log('No sub-pages to crawl');\n return;\n }\n\n for (let i = 0; i < uniqueLinks.length; i++) {\n const link = uniqueLinks[i];\n this.cooking?.update('Crawling sub-page ' + (i + 1) + '/' + uniqueLinks.length);\n try {\n const html = await captureSubpage(page, link, {\n needsHydrationCheck: this.platform.needsHydrationCheck,\n hydrationTimeout: this.platform.hydrationTimeout,\n });\n\n const slug = this.deriveSlug(link, baseUrl);\n const filename = slug + '.html';\n const filepath = path.join(this.outDir, 'subpages', filename);\n\n await fs.writeFile(filepath, html, 'utf-8');\n log(' Saved: subpages/' + filename);\n } catch (e) {\n log(' Skipped ' + link + ': ' + (e as Error).message);\n }\n }\n\n success('Sub-pages crawled: ' + uniqueLinks.length);\n }\n\n private deriveSlug(link: string, baseUrl: URL): string {\n try {\n const u = new URL(link);\n let pathname = u.pathname.replace(/\\/+$/, '').replace(/^\\//, '');\n if (!pathname) return 'index';\n return pathname.replace(/[^a-zA-Z0-9_-]/g, '_').replace(/_+/g, '_') || 'page';\n } catch {\n return 'page';\n }\n }\n}\n","import readline from 'node:readline';\nimport { stdin, stdout } from 'node:process';\nimport chalk from 'chalk';\n\nexport interface SelectOption {\n label: string;\n value: string;\n}\n\nexport async function select(question: string, options: SelectOption[], defaultIndex: number = 0): Promise<string> {\n return new Promise((resolve) => {\n let selected: number = defaultIndex;\n\n const render = (initial: boolean = false): void => {\n if (!initial) {\n stdout.write(`\\x1B[${options.length + 1}A`);\n stdout.write('\\x1B[J');\n }\n console.log(` ${chalk.hex('#D4A017')('?')} ${chalk.white.bold(question)}`);\n for (let i = 0; i < options.length; i++) {\n if (i === selected) {\n console.log(` ${chalk.hex('#D4A017')('>')} ${chalk.white.bold(options[i].label)}`);\n } else {\n console.log(` ${chalk.gray(options[i].label)}`);\n }\n }\n };\n\n render(true);\n\n readline.emitKeypressEvents(stdin);\n const wasTTY: boolean = stdin.isTTY || false;\n if (wasTTY) stdin.setRawMode(true);\n\n const onKeypress = (_str: string | undefined, key: readline.Key): void => {\n if (!key) return;\n\n if (key.name === 'up' && selected > 0) {\n selected--;\n render();\n } else if (key.name === 'down' && selected < options.length - 1) {\n selected++;\n render();\n } else if (key.name === 'return') {\n if (wasTTY) stdin.setRawMode(false);\n stdin.removeListener('keypress', onKeypress);\n stdin.pause();\n\n stdout.write(`\\x1B[${options.length + 1}A`);\n stdout.write('\\x1B[J');\n console.log(` ${chalk.green('✓')} ${chalk.white.bold(question)} ${chalk.hex('#D4A017')(options[selected].label)}\\n`);\n\n resolve(options[selected].value);\n } else if ((key.ctrl && key.name === 'c') || key.name === 'escape') {\n if (wasTTY) stdin.setRawMode(false);\n stdin.removeListener('keypress', onKeypress);\n process.exit(0);\n }\n };\n\n stdin.resume();\n stdin.on('keypress', onKeypress);\n });\n}\n","import readline from 'node:readline/promises';\nimport { stdin, stdout } from 'node:process';\nimport path from 'node:path';\nimport { URL } from 'node:url';\nimport chalk from 'chalk';\nimport { showBanner } from './banner.js';\nimport { FramerExporter, deriveOutputName } from '../exporter/index.js';\nimport { detectPlatform } from '../platforms/index.js';\nimport { select } from './select.js';\nimport type { PlatformType } from '../platforms/types.js';\nimport { boxTop, boxLine, boxSep, boxBot, boxRow, maxWidth } from './box.js';\n\nfunction drawHeader(title: string): void {\n const w = maxWidth();\n if (w < 50) {\n console.log(`\\n ${chalk.hex('#D4A017')('●')} ${chalk.bold.white(title)}`);\n return;\n }\n console.log(boxTop(w));\n console.log(boxLine(w, chalk.bold.white(' ' + title)));\n console.log(boxBot(w));\n console.log('');\n}\n\nexport async function runSetup(legacyMode: boolean = false): Promise<void> {\n showBanner();\n\n console.log(chalk.bold.white(' Welcome to Framer Export setup.\\n'));\n console.log(chalk.gray(' Supports Framer, Webflow, and Wix sites.\\n'));\n\n const rl = readline.createInterface({ input: stdin, output: stdout });\n\n const ask = async (question: string, defaultVal?: string): Promise<string> => {\n const suffix: string = defaultVal ? chalk.gray(` (${defaultVal})`) : '';\n const prompt: string = ` ${chalk.hex('#D4A017')('?')} ${chalk.white.bold(question)}${suffix} ${chalk.gray('>')} `;\n const answer: string = await rl.question(prompt);\n return answer.trim() || defaultVal || '';\n };\n\n drawHeader('Step 1 : Site URL');\n\n let siteUrl = '';\n while (!siteUrl) {\n const input: string = await ask('Enter the site URL');\n try {\n new URL(input);\n siteUrl = input;\n } catch {\n console.log(` ${chalk.red('✗')} ${chalk.red('Invalid URL. Enter a valid URL (https://...)')}\\n`);\n }\n }\n console.log(` ${chalk.green('✓')} ${chalk.green('URL:')} ${chalk.underline(siteUrl)}\\n`);\n\n drawHeader('Step 2 : Platform');\n\n const detected = detectPlatform(siteUrl);\n let platformName: PlatformType;\n\n if (legacyMode) {\n console.log(` ${chalk.blue('i')} Auto-detected: ${chalk.hex('#D4A017')(detected.displayName)}`);\n const platformInput: string = await ask('Platform (framer/webflow/wix)', detected.name);\n platformName = (['framer', 'webflow', 'wix'].includes(platformInput)\n ? platformInput\n : detected.name) as PlatformType;\n console.log(` ${chalk.green('✓')} ${chalk.green('Platform:')} ${chalk.hex('#D4A017')(platformName)}\\n`);\n } else {\n rl.close();\n const platforms = [\n { label: `Framer${detected.name === 'framer' ? chalk.gray(' (detected)') : ''}`, value: 'framer' },\n { label: `Webflow${detected.name === 'webflow' ? chalk.gray(' (detected)') : ''}`, value: 'webflow' },\n { label: `Wix${detected.name === 'wix' ? chalk.gray(' (detected)') : ''}`, value: 'wix' },\n ];\n const defaultIdx = ['framer', 'webflow', 'wix'].indexOf(detected.name);\n platformName = await select('Select platform', platforms, Math.max(0, defaultIdx)) as PlatformType;\n }\n\n const rl2 = legacyMode ? rl : readline.createInterface({ input: stdin, output: stdout });\n\n const ask2 = async (question: string, defaultVal?: string): Promise<string> => {\n const suffix: string = defaultVal ? chalk.gray(` (${defaultVal})`) : '';\n const prompt: string = ` ${chalk.hex('#D4A017')('?')} ${chalk.white.bold(question)}${suffix} ${chalk.gray('>')} `;\n const answer: string = await rl2.question(prompt);\n return answer.trim() || defaultVal || '';\n };\n\n const derivedName: string = deriveOutputName(siteUrl, platformName);\n\n drawHeader('Step 3 : Output Directory');\n\n const outDir: string = await ask2('Output directory', './' + derivedName);\n console.log(` ${chalk.green('✓')} ${chalk.green('Output:')} ${chalk.yellow(outDir)}\\n`);\n\n drawHeader('Step 4 : Options');\n\n let prettyPrint: boolean;\n let concurrency: number;\n let includeSubpages: boolean;\n\n if (legacyMode) {\n const prettyAnswer: string = await ask2('Pretty-print JS files? (y/n)', 'y');\n prettyPrint = prettyAnswer.toLowerCase().startsWith('y');\n console.log(` ${chalk.green('✓')} Pretty-print: ${prettyPrint ? chalk.green('yes') : chalk.red('no')}\\n`);\n\n const subpagesAnswer: string = await ask2('Export sub-pages? (y/n)', 'n');\n includeSubpages = subpagesAnswer.toLowerCase().startsWith('y');\n console.log(` ${chalk.green('✓')} Sub-pages: ${includeSubpages ? chalk.green('yes') : chalk.red('no')}\\n`);\n\n const concurrencyAnswer: string = await ask2('Download concurrency', '12');\n concurrency = parseInt(concurrencyAnswer, 10) || 12;\n console.log(` ${chalk.green('✓')} Concurrency: ${chalk.yellow(String(concurrency))}\\n`);\n } else {\n rl2.close();\n const prettyVal = await select('Pretty-print JS files?', [\n { label: 'Yes', value: 'yes' },\n { label: 'No', value: 'no' },\n ]);\n prettyPrint = prettyVal === 'yes';\n\n const subpagesVal = await select('Export sub-pages?', [\n { label: 'No', value: 'no' },\n { label: 'Yes, crawl and export', value: 'yes' },\n ], 0);\n includeSubpages = subpagesVal === 'yes';\n\n const concurrencyVal = await select('Download concurrency', [\n { label: '6 (slow connection)', value: '6' },\n { label: '12 (default)', value: '12' },\n { label: '20 (fast connection)', value: '20' },\n ], 1);\n concurrency = parseInt(concurrencyVal, 10);\n }\n\n const w = maxWidth();\n const isSmall = w < 50;\n const G = chalk.hex('#C4953A');\n const B = chalk.hex('#8B6914');\n\n console.log('');\n if (!isSmall) {\n console.log(boxTop(w));\n console.log(boxLine(w, chalk.bold.white(' Summary')));\n } else {\n console.log(chalk.bold.white(' Summary:'));\n }\n\n for (const [label, value] of [\n ['URL', siteUrl],\n ['Platform', platformName],\n ['Output', path.resolve(outDir)],\n ['Pretty-print', prettyPrint ? 'yes' : 'no'],\n ['Sub-pages', includeSubpages ? 'yes' : 'no'],\n ['Concurrency', String(concurrency)],\n ]) {\n console.log(boxRow(w, label, value));\n }\n\n if (!isSmall) {\n console.log(boxBot(w));\n }\n console.log('');\n\n let startExport: boolean;\n\n if (legacyMode) {\n const confirm: string = await ask2('Start export? (y/n)', 'y');\n startExport = confirm.toLowerCase().startsWith('y');\n rl2.close();\n } else {\n const confirmVal = await select('Start export?', [\n { label: 'Yes, start now', value: 'yes' },\n { label: 'Cancel', value: 'no' },\n ]);\n startExport = confirmVal === 'yes';\n }\n\n if (!startExport) {\n console.log(`\\n ${chalk.yellow('Export cancelled.')}\\n`);\n return;\n }\n\n console.log('');\n\n const { CFG } = await import('../config/index.js');\n CFG.concurrency = concurrency;\n\n const exporter = new FramerExporter(siteUrl, path.resolve(outDir), platformName);\n exporter.prettyPrint = prettyPrint;\n await exporter.run(includeSubpages);\n}\n","import path from 'path';\nimport { URL } from 'url';\nimport pkg from '../../package.json';\nimport { showHelp } from './help.js';\nimport { showBanner } from './banner.js';\nimport { checkForUpdates } from './update-check.js';\nimport type { PlatformType } from '../platforms/types.js';\n\nconst VERSION = pkg.version;\n\nfunction extractFlag(args: string[], flag: string): string | null {\n const idx: number = args.indexOf(flag);\n if (idx === -1 || idx + 1 >= args.length) return null;\n const value: string = args[idx + 1];\n args.splice(idx, 2);\n return value;\n}\n\nfunction hasFlag(args: string[], flag: string): boolean {\n const idx: number = args.indexOf(flag);\n if (idx === -1) return false;\n args.splice(idx, 1);\n return true;\n}\n\nasync function main(): Promise<void> {\n const args: string[] = process.argv.slice(2);\n\n if (args.includes('--version') || args.includes('-v')) {\n console.log(VERSION);\n process.exit(0);\n }\n\n if (args.includes('--about')) {\n const chalk = (await import('chalk')).default;\n showBanner();\n console.log(` ${chalk.white.bold('Framer Export')} ${chalk.gray(`v${pkg.version}`)}`);\n console.log(` ${chalk.white(pkg.description)}\\n`);\n console.log(` ${chalk.white.bold('Author')} ${chalk.hex('#D4A017')('Dany (danbenba)')}`);\n console.log(` ${chalk.white.bold('Portfolio')} ${chalk.underline.hex('#D4A017')('https://github.com/danbenba')}`);\n console.log(` ${chalk.white.bold('GitHub')} ${chalk.underline.hex('#D4A017')(pkg.repository.url.replace('git+', '').replace('.git', ''))}`);\n console.log(` ${chalk.white.bold('npm')} ${chalk.underline.hex('#D4A017')(`https://www.npmjs.com/package/${pkg.name}`)}`);\n console.log(` ${chalk.white.bold('License')} ${chalk.green(pkg.license)}`);\n console.log(` ${chalk.white.bold('Node')} ${chalk.gray(`>=${pkg.engines.node}`)}`);\n console.log('');\n process.exit(0);\n }\n\n checkForUpdates(VERSION).then((latest) => {\n if (!latest) return;\n import('chalk').then((chalk) => {\n console.log('');\n console.log(\n ` ${chalk.default.yellow('↳')} Update available: ${chalk.default.gray(VERSION)} → ${chalk.default.green(latest)}`,\n );\n console.log(` ${chalk.default.hex('#D4A017')(' Run:')} ${chalk.default.hex('#B8860B')('npm i -g framer-export@latest')}`);\n console.log('');\n });\n });\n\n if (args.includes('--help') || args.includes('-h')) {\n showHelp();\n process.exit(0);\n }\n\n if (args.includes('--setup')) {\n hasFlag(args, '--setup');\n const legacyMode: boolean = hasFlag(args, '--legacy-mode');\n const { runSetup } = await import('./setup.js');\n await runSetup(legacyMode);\n return;\n }\n\n if (!args.length) {\n const { runSetup } = await import('./setup.js');\n await runSetup(false);\n return;\n }\n\n const platformOverride = extractFlag(args, '--platform') as PlatformType | null;\n const includeSubpages: boolean = hasFlag(args, '--subpages');\n\n showBanner();\n\n const url: string = args[0];\n\n try {\n new URL(url);\n } catch {\n const chalk = (await import('chalk')).default;\n console.log(` ${chalk.red('✗')} ${chalk.red.bold('Invalid URL:')} ${chalk.white(url)}`);\n console.log(` ${chalk.gray('Expected: https://yoursite.framer.app')}\\n`);\n process.exit(1);\n }\n\n const { FramerExporter, deriveOutputName } = await import('../exporter/index.js');\n const { detectPlatform } = await import('../platforms/index.js');\n\n const detected = platformOverride || detectPlatform(url).name;\n const defaultDir: string = deriveOutputName(url, detected as PlatformType);\n const out: string = args[1] || `./${defaultDir}`;\n\n try {\n await new FramerExporter(url, path.resolve(out), platformOverride || undefined).run(includeSubpages);\n } catch (e) {\n const chalk = (await import('chalk')).default;\n console.log(`\\n ${chalk.red('✗')} ${chalk.red.bold('FAILED:')} ${chalk.white((e as Error).message)}`);\n console.log(chalk.gray((e as Error).stack || ''));\n process.exit(1);\n }\n}\n\nmain();\n","import chalk from 'chalk';\nimport { showBanner } from './banner.js';\n\nexport function showHelp(): void {\n showBanner();\n\n console.log(chalk.white.bold(' USAGE\\n'));\n console.log(` ${chalk.hex('#D4A017')('framer-export')} ${chalk.yellow('<url>')} ${chalk.gray('[output-dir]')}`);\n console.log(` ${chalk.hex('#D4A017')('fexport')} ${chalk.yellow('<url>')} ${chalk.gray('[output-dir]')}`);\n\n console.log('');\n console.log(chalk.white.bold(' OPTIONS\\n'));\n\n const opts: Array<[string, string]> = [\n ['--setup', 'Launch the interactive setup assistant'],\n ['--platform <p>', 'Force platform: framer, webflow, wix'],\n ['--subpages', 'Crawl and export sub-pages'],\n ['--legacy-mode', 'Use text input instead of arrow selection'],\n ['--help, -h', 'Show this help message'],\n ];\n\n for (const [flag, desc] of opts) {\n console.log(` ${chalk.green(flag.padEnd(18))} ${chalk.white(desc)}`);\n }\n\n console.log('');\n console.log(chalk.white.bold(' SUPPORTED PLATFORMS\\n'));\n\n const platforms: Array<[string, string]> = [\n ['Framer', 'Auto-detected via .framer.app / .framer.website URLs'],\n ['Webflow', 'Auto-detected via .webflow.io URLs'],\n ['Wix', 'Auto-detected via .wixsite.com URLs + HTML analysis'],\n ];\n\n for (const [name, desc] of platforms) {\n console.log(` ${chalk.hex('#D4A017')(name.padEnd(12))} ${chalk.gray(desc)}`);\n }\n\n console.log('');\n console.log(chalk.white.bold(' EXAMPLES\\n'));\n console.log(` ${chalk.gray('$')} ${chalk.hex('#D4A017')('framer-export')} ${chalk.yellow('https://mysite.framer.app')}`);\n console.log(` ${chalk.gray('$')} ${chalk.hex('#D4A017')('framer-export')} ${chalk.yellow('https://mysite.webflow.io')}`);\n console.log(` ${chalk.gray('$')} ${chalk.hex('#D4A017')('framer-export')} ${chalk.yellow('https://user.wixsite.com/my-site')}`);\n console.log(` ${chalk.gray('$')} ${chalk.hex('#D4A017')('framer-export')} ${chalk.green('--platform webflow')} ${chalk.yellow('https://custom.com')}`);\n console.log(` ${chalk.gray('$')} ${chalk.hex('#D4A017')('framer-export')} ${chalk.green('--subpages')} ${chalk.yellow('https://mysite.com')}`);\n console.log(` ${chalk.gray('$')} ${chalk.hex('#D4A017')('framer-export')} ${chalk.green('--setup')}`);\n console.log(` ${chalk.gray('$')} ${chalk.hex('#D4A017')('framer-export')} ${chalk.green('--setup --legacy-mode')}`);\n console.log('');\n}\n","import https from 'https';\n\nexport async function checkForUpdates(currentVersion: string): Promise<string | null> {\n return new Promise((resolve) => {\n const req = https.get(\n 'https://registry.npmjs.org/framer-export/latest',\n { timeout: 3000 },\n (res) => {\n let data = '';\n res.on('data', (chunk) => (data += chunk));\n res.on('end', () => {\n try {\n const json = JSON.parse(data);\n const latest = json.version;\n if (!latest) return resolve(null);\n if (latest !== currentVersion) return resolve(latest);\n resolve(null);\n } catch {\n resolve(null);\n }\n });\n },\n );\n req.on('error', () => resolve(null));\n req.on('timeout', () => {\n req.destroy();\n resolve(null);\n });\n });\n}\n"],"mappings":"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","names":["URL","https","URL","chalk","FONT_EXTS","IMG_EXTS","FONT_EXTS","VIDEO_EXTS","path","init_download","fs","path","chalk","fs","path","chalk","G","G2","chalk","fs","path","chalk","init_download","chalk","readline","stdin","stdout","path","URL","chalk","G","B","CFG","path","URL","chalk","chalk","runSetup","URL","FramerExporter","deriveOutputName","detectPlatform","path"]}
|
|
1
|
+
{"version":3,"sources":["../../package.json","../../src/cli/banner.ts","../../src/assets/asset-map.ts","../../src/config/index.ts","../../src/network/download.ts","../../src/logger/index.ts","../../src/platforms/framer.ts","../../src/platforms/webflow.ts","../../src/platforms/wix.ts","../../src/platforms/detect.ts","../../src/platforms/index.ts","../../src/exporter/capture.ts","../../src/network/pool.ts","../../src/exporter/download.ts","../../src/formatter/prettify.ts","../../src/server/template.ts","../../src/exporter/output.ts","../../src/cli/box.ts","../../src/exporter/summary.ts","../../src/cli/cooking.ts","../../src/exporter/index.ts","../../src/cli/select.ts","../../src/cli/setup.ts","../../src/cli/index.ts","../../src/cli/help.ts","../../src/cli/update-check.ts"],"sourcesContent":["{\n \"name\": \"framer-export\",\n \"version\": \"4.3.7\",\n \"description\": \"Export any Framer, Webflow, or Wix site into a fully working local mirror. Downloads all assets, strips badges, rewrites URLs, and pretty-prints JS.\",\n \"type\": \"module\",\n \"main\": \"dist/cli/index.js\",\n \"types\": \"dist/cli/index.d.ts\",\n \"bin\": {\n \"framer-export\": \"./bin/framer-export.js\",\n \"fexport\": \"./bin/fexport.js\",\n \"framerexport\": \"./bin/framerexport.js\"\n },\n \"files\": [\n \"dist/\",\n \"bin/\",\n \"LICENSE\",\n \"README.md\"\n ],\n \"scripts\": {\n \"start\": \"tsx src/cli/index.ts\",\n \"dev\": \"tsx src/cli/index.ts\",\n \"build\": \"tsup\",\n \"typecheck\": \"tsc --noEmit\",\n \"format\": \"prettier --write \\\"src/**/*.ts\\\"\",\n \"prepublishOnly\": \"npm run build\",\n \"prepack\": \"npm run build\"\n },\n \"keywords\": [\n \"framer\",\n \"webflow\",\n \"wix\",\n \"exporter\",\n \"export\",\n \"scraper\",\n \"mirror\",\n \"site-downloader\",\n \"site-export\",\n \"cli\"\n ],\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"git+https://github.com/danbenba/FramerExport.git\"\n },\n \"homepage\": \"https://github.com/danbenba/FramerExport#readme\",\n \"bugs\": {\n \"url\": \"https://github.com/danbenba/FramerExport/issues\"\n },\n \"license\": \"MIT\",\n \"author\": \"Dany (danbenba)\",\n \"engines\": {\n \"node\": \">=18.0.0\"\n },\n \"dependencies\": {\n \"chalk\": \"^5.3.0\",\n \"ora\": \"^8.0.0\",\n \"prettier\": \"^3.2.0\",\n \"puppeteer\": \"^22.0.0\",\n \"readline-promise\": \"^1.0.5\"\n },\n \"devDependencies\": {\n \"@types/node\": \"^22.0.0\",\n \"tsup\": \"^8.5.1\",\n \"tsx\": \"^4.7.0\",\n \"typescript\": \"^5.4.0\"\n }\n}\n","import chalk from 'chalk';\nimport pkg from '../../package.json';\n\nfunction getWidth(): number {\n return process.stdout.columns || 80;\n}\n\nconst ASCII_ART = [\n '███████╗███████╗██╗ ██╗██████╗ ██████╗ ██████╗ ████████╗',\n '██╔════╝██╔════╝╚██╗██╔╝██╔══██╗██╔═══██╗██╔══██╗╚══██╔══╝',\n '█████╗ █████╗ ╚███╔╝ ██████╔╝██║ ██║██████╔╝ ██║ ',\n '██╔══╝ ██╔══╝ ██╔██╗ ██╔═══╝ ██║ ██║██╔══██╗ ██║ ',\n '██║ ███████╗██╔╝ ██╗██║ ╚██████╔╝██║ ██║ ██║ ',\n '╚═╝ ╚══════╝╚═╝ ╚═╝╚═╝ ╚═════╝ ╚═╝ ╚═╝ ╚═╝',\n];\n\nexport function showBanner(): void {\n const width = getWidth();\n const isSmall = width < 65;\n\n if (isSmall) {\n console.log(`\\n ${chalk.hex('#D4A017').bold('F-EXPORT')} ${chalk.gray(`v${pkg.version}`)}`);\n console.log(` ${chalk.white.bold('Framer · Webflow · Wix Exporter')}\\n`);\n return;\n }\n\n const gold = chalk.hex('#D4A017').bold;\n const gray = chalk.gray;\n\n console.log('');\n ASCII_ART.forEach((line) => {\n console.log(' ' + gold(line));\n });\n console.log('');\n console.log(` ${gray(`v${pkg.version}`)} ${chalk.white.bold('Framer · Webflow · Wix Exporter')}\\n`);\n}\n","import path from 'path';\nimport crypto from 'crypto';\nimport { URL } from 'url';\nimport type { PlatformHandler } from '../platforms/types.js';\n\ninterface AssetEntry {\n localPath: string;\n}\n\nexport class AssetMap {\n entries: Map<string, AssetEntry> = new Map();\n buffers: Map<string, Buffer> = new Map();\n\n localPathFor(urlStr: string, platform?: PlatformHandler): string | null {\n if (this.entries.has(urlStr)) return this.entries.get(urlStr)!.localPath;\n\n let parsed: URL;\n try {\n parsed = new URL(urlStr);\n } catch {\n return null;\n }\n\n const host: string = parsed.hostname;\n const pathname: string = parsed.pathname;\n const ext: string = path.extname(pathname.split('?')[0]).toLowerCase();\n\n let dir: string | null = null;\n\n if (platform) {\n dir = platform.mapAssetDir(host, pathname, ext);\n }\n\n if (!dir) {\n dir = this.fallbackDir(host, ext);\n }\n\n let filename: string;\n const baseName: string = path.basename(pathname.split('?')[0]);\n const hash: string = crypto.createHash('md5').update(urlStr).digest('hex').slice(0, 6);\n\n if (baseName && baseName.length > 1 && baseName !== '/') {\n const clean: string = baseName.replace(/[^a-zA-Z0-9._-]/g, '_');\n filename = clean.includes('.') ? clean : `${clean}-${hash}`;\n } else {\n filename = `asset-${hash}${ext || ''}`;\n }\n\n if (ext === '.mjs' || ext === '.js') {\n filename = baseName.replace(/[^a-zA-Z0-9._-]/g, '_');\n }\n\n const localPath: string = `${dir}/${filename}`;\n this.entries.set(urlStr, { localPath });\n\n const base: string = urlStr.split('?')[0];\n if (base !== urlStr && !this.entries.has(base)) {\n this.entries.set(base, { localPath });\n }\n\n return localPath;\n }\n\n rewrite(text: string, fromDir: string = ''): string {\n const sorted = [...this.entries.entries()].sort((a, b) => b[0].length - a[0].length);\n let out: string = text;\n for (const [url, { localPath }] of sorted) {\n const rel: string = fromDir ? path.posix.relative(fromDir, localPath) : localPath;\n out = out.split(url).join(rel);\n if (url.includes('&')) {\n out = out.split(url.replace(/&/g, '&')).join(rel);\n }\n }\n return out;\n }\n\n private fallbackDir(host: string, ext: string): string {\n if (host.includes('fonts.gstatic.com') || host.includes('fonts.googleapis.com')) {\n return 'assets/fonts';\n }\n return ext === '.mjs' || ext === '.js' ? 'scripts/vendor' : 'assets/misc';\n }\n}\n","import type { Config } from '../types.js';\n\nexport const CFG: Config = {\n viewport: { width: 1440, height: 900 },\n timeout: 90000,\n scrollStep: 250,\n scrollDelay: 60,\n concurrency: 12,\n retries: 3,\n dlTimeout: 30000,\n sharedStripDomains: [\n 'sentry.io', 'www.googletagmanager.com', 'connect.facebook.net',\n 'stats.g.doubleclick.net',\n 'google-analytics.com',\n ],\n};\n","import https from 'https';\nimport http from 'http';\nimport { URL } from 'url';\nimport { CFG } from '../config/index.js';\n\nexport function dlBuffer(url: string, retries: number = CFG.retries): Promise<Buffer> {\n return new Promise((resolve, reject) => {\n const proto = url.startsWith('https') ? https : http;\n const go = (left: number): void => {\n const req = proto.get(url, { timeout: CFG.dlTimeout }, (res) => {\n if (res.statusCode! >= 300 && res.statusCode! < 400 && res.headers.location) {\n return dlBuffer(new URL(res.headers.location, url).href, left).then(resolve, reject);\n }\n if (res.statusCode !== 200) {\n return left > 1\n ? setTimeout(() => go(left - 1), 500)\n : reject(new Error(`HTTP ${res.statusCode}`));\n }\n const ch: Buffer[] = [];\n res.on('data', (c: Buffer) => ch.push(c));\n res.on('end', () => resolve(Buffer.concat(ch)));\n res.on('error', (e: Error) => (left > 1 ? setTimeout(() => go(left - 1), 500) : reject(e)));\n });\n req.on('error', (e: Error) => (left > 1 ? setTimeout(() => go(left - 1), 500) : reject(e)));\n req.on('timeout', () => {\n req.destroy();\n left > 1 ? setTimeout(() => go(left - 1), 500) : reject(new Error('Timeout'));\n });\n };\n go(retries);\n });\n}\n","import chalk from 'chalk';\nimport type { CookingSpinner } from '../cli/cooking.js';\n\nlet _cooking: CookingSpinner | null = null;\n\nexport function setCooking(spinner: CookingSpinner | null): void {\n _cooking = spinner;\n}\n\nconst T = (): string => new Date().toISOString().slice(11, 19);\n\nfunction trunc(text: string, max: number): string {\n if (text.length <= max) return text;\n return text.slice(0, max - 2) + '..';\n}\n\nfunction output(line: string): void {\n if (_cooking) _cooking.log(line);\n else console.log(line);\n}\n\nconst LOG_PALETTE: Array<(s: string) => string> = [\n (s) => chalk.hex('#D4A017')(s),\n (s) => chalk.hex('#DAA520')(s),\n (s) => chalk.hex('#C8A951')(s),\n (s) => chalk.hex('#E0B040')(s),\n (s) => chalk.hex('#daa520')(s),\n (s) => chalk.hex('#c4953a')(s),\n (s) => chalk.hex('#e8c33a')(s),\n (s) => chalk.hex('#dab660')(s),\n (s) => chalk.hex('#b8960a')(s),\n (s) => chalk.hex('#d4a76a')(s),\n (s) => chalk.hex('#e0a030')(s),\n (s) => chalk.hex('#c0a060')(s),\n];\nlet _li = 0;\n\nexport const log = (m: string): void => {\n _li++;\n const c = LOG_PALETTE[_li % LOG_PALETTE.length];\n output(`${chalk.hex('#6d6d6d')(`[${T()}]`)} ${chalk.hex('#B8960A')('[LOG]')} ${c(trunc(m, 120))}`);\n};\n\nconst INFO_PALETTE: Array<(s: string) => string> = [\n (s) => chalk.hex('#4DB8B0')(s),\n (s) => chalk.hex('#5CC0BA')(s),\n (s) => chalk.hex('#3AA89E')(s),\n (s) => chalk.hex('#6BC4BE')(s),\n (s) => chalk.hex('#48B5AD')(s),\n (s) => chalk.hex('#52BAB4')(s),\n];\nlet _ii = 0;\n\nexport const info = (m: string): void => {\n _ii++;\n const c = INFO_PALETTE[_ii % INFO_PALETTE.length];\n output(`${chalk.hex('#6d6d6d')(`[${T()}]`)} ${chalk.hex('#3AA89E').bold('[INFO]')} ${c(trunc(m, 120))}`);\n};\n\nexport const warn = (m: string): void => {\n const colors: Array<(s: string) => string> = [\n (s) => chalk.hex('#E8833A')(s),\n (s) => chalk.hex('#F09040')(s),\n (s) => chalk.hex('#CC7722')(s),\n (s) => chalk.hex('#E87D2A')(s),\n ];\n const c = colors[Math.floor(Math.random() * colors.length)];\n const line = `${chalk.hex('#7a7a7a')(`[${T()}]`)} ${chalk.hex('#E8833A').bold('[WARN]')} ${c(trunc(m, 120))}`;\n if (_cooking) _cooking.log(line);\n else console.warn(line);\n};\n\nexport const success = (m: string): void => {\n const colors: Array<(s: string) => string> = [\n (s) => chalk.hex('#4CAF50')(s),\n (s) => chalk.hex('#66BB6A')(s),\n (s) => chalk.hex('#43A047')(s),\n (s) => chalk.hex('#81C784')(s),\n (s) => chalk.hex('#2E7D32')(s),\n ];\n const c = colors[Math.floor(Math.random() * colors.length)];\n output(`${chalk.hex('#6d6d6d')(`[${T()}]`)} ${chalk.greenBright('[OK]')} ${c(trunc(m, 120))}`);\n};\n\nexport const error = (m: string): void => {\n const colors: Array<(s: string) => string> = [\n (s) => chalk.hex('#EF5350')(s),\n (s) => chalk.hex('#E53935')(s),\n (s) => chalk.hex('#F44336')(s),\n (s) => chalk.hex('#D32F2F')(s),\n ];\n const c = colors[Math.floor(Math.random() * colors.length)];\n const line = `${chalk.hex('#7a7a7a')(`[${T()}]`)} ${chalk.redBright('[ERROR]')} ${c(trunc(m, 120))}`;\n if (_cooking) _cooking.log(line);\n else console.error(line);\n};\n","import type { PlatformHandler } from './types.js';\n\nconst FONT_EXTS: string[] = ['.woff2', '.woff', '.ttf', '.otf'];\n\nexport const framer: PlatformHandler = {\n name: 'framer',\n displayName: 'Framer',\n\n detectByUrl(url: string): boolean {\n return /\\.framer\\.(app|website)|framercanvas\\.com/.test(url);\n },\n\n detectByHtml(html: string): boolean {\n return (\n html.includes('id=\"main\"') &&\n (html.includes('framerstatic.com') || html.includes('framerusercontent.com'))\n );\n },\n\n stripDomains: ['events.framer.com', 'api.framer.com', 'collect.frameranalytics.com'],\n\n stripSelectors: [\n 'script[src*=\"events.framer.com\"]',\n '#__framer-badge-container',\n '#__framer-badge',\n 'link[href*=\"canvas-sandbox\"]',\n 'script[src*=\"framer.com/bootstrap\"]',\n ],\n\n stripPatterns: [\n /<div id=\"__framer-badge-container\"[^>]*><\\/div>/g,\n /<script>try\\{if\\(localStorage\\.get\\(\"__framer_force_showing_editorbar_since\"\\)\\)[^<]*<\\/script>/g,\n ],\n\n hydrationTimeout: 10000,\n needsHydrationCheck: true,\n\n mapAssetDir(host: string, pathname: string, ext: string): string | null {\n if (host.includes('framerusercontent.com')) {\n if (pathname.startsWith('/images/')) return 'assets/images';\n if (pathname.startsWith('/assets/')) {\n return FONT_EXTS.includes(ext) ? 'assets/fonts' : 'assets/misc';\n }\n if (pathname.startsWith('/sites/')) {\n if (ext === '.mjs' || ext === '.js') return 'scripts/vendor';\n if (ext === '.json') return 'data';\n if (ext === '.css') return 'styles';\n if (ext === '.framercms') return 'data';\n return 'assets/misc';\n }\n if (pathname.startsWith('/modules/')) {\n return ext === '.framercms' ? 'data' : 'scripts/modules';\n }\n return 'assets/misc';\n }\n\n if (host.includes('app.framerstatic.com')) {\n if (ext === '.css') return 'styles';\n if (ext === '.mjs' || ext === '.js') return 'scripts/vendor';\n if (ext === '.woff2' || ext === '.woff') return 'assets/fonts';\n if (ext === '.png' || ext === '.svg') return 'assets/images';\n return 'assets/misc';\n }\n\n if (host.includes('framercanvas.com') || host.includes('framer.com')) {\n if (ext === '.mjs' || ext === '.js') return 'scripts/vendor';\n if (ext === '.css') return 'styles';\n return 'assets/misc';\n }\n\n return null;\n },\n};\n","import type { PlatformHandler } from './types.js';\n\nconst IMG_EXTS: string[] = ['.jpg', '.jpeg', '.png', '.gif', '.svg', '.webp', '.avif'];\nconst FONT_EXTS: string[] = ['.woff2', '.woff', '.ttf', '.otf', '.eot'];\nconst VIDEO_EXTS: string[] = ['.mp4', '.webm', '.ogg'];\n\nexport const webflow: PlatformHandler = {\n name: 'webflow',\n displayName: 'Webflow',\n\n detectByUrl(url: string): boolean {\n return /\\.webflow\\.(io|com)/.test(url);\n },\n\n detectByHtml(html: string): boolean {\n return (\n html.includes('data-wf-site') ||\n html.includes('w-webflow-badge') ||\n html.includes('Webflow') ||\n html.includes('webflow.js')\n );\n },\n\n stripDomains: ['js-agent.newrelic.com', 'cdn.heapanalytics.com', 'tr.snapchat.com'],\n\n stripSelectors: ['.w-webflow-badge', 'link[href*=\"editorbar\"]'],\n\n stripPatterns: [\n /<a[^>]*class=\"[^\"]*w-webflow-badge[^\"]*\"[^>]*>[\\s\\S]*?<\\/a>/g,\n /<a[^>]*href=\"[^\"]*webflow\\.com\\?utm_campaign=brandjs[^\"]*\"[^>]*>[\\s\\S]*?<\\/a>/g,\n /<style>[^<]*\\.w-webflow-badge[^<]*<\\/style>/g,\n /Powered by <a[^>]*href=\"[^\"]*webflow\\.com\"[^>]*>[^<]*<\\/a>/g,\n /<!-- This site was created in Webflow\\.[^>]*-->/g,\n /<html([^>]*) data-wf-domain=\"[^\"]*\"/g,\n /<html([^>]*) data-wf-page=\"[^\"]*\"/g,\n /<html([^>]*) data-wf-site=\"[^\"]*\"/g,\n /<html([^>]*) data-wf-status=\"[^\"]*\"/g,\n /<meta[^>]*content=\"Webflow\"[^>]*>/g,\n ],\n\n hydrationTimeout: 2000,\n needsHydrationCheck: false,\n\n mapAssetDir(host: string, pathname: string, ext: string): string | null {\n if (\n host.includes('website-files.com') ||\n host.includes('webflow.com') ||\n host.includes('uploads-ssl.webflow.com')\n ) {\n if (VIDEO_EXTS.includes(ext)) return 'assets/videos';\n if (pathname.includes('/images/') || IMG_EXTS.includes(ext)) return 'assets/images';\n if (pathname.includes('/css/') || ext === '.css') return 'styles';\n if (pathname.includes('/js/') || ext === '.js') return 'scripts/vendor';\n if (pathname.includes('/gsap/') || pathname.includes('/plugins/')) return 'scripts/vendor';\n if (FONT_EXTS.includes(ext)) return 'assets/fonts';\n return 'assets/misc';\n }\n\n if (host.includes('d3e54v103j8qbb.cloudfront.net')) {\n if (ext === '.js') return 'scripts/vendor';\n if (ext === '.css') return 'styles';\n if (IMG_EXTS.includes(ext)) return 'assets/images';\n return 'assets/misc';\n }\n\n return null;\n },\n};\n","import type { PlatformHandler } from './types.js';\n\nconst IMG_EXTS: string[] = ['.jpg', '.jpeg', '.png', '.gif', '.svg', '.webp', '.avif', '.ico'];\nconst FONT_EXTS: string[] = ['.woff2', '.woff', '.ttf', '.otf', '.eot'];\nconst VIDEO_EXTS: string[] = ['.mp4', '.webm', '.ogg'];\n\nexport const wix: PlatformHandler = {\n name: 'wix',\n displayName: 'Wix',\n\n detectByUrl(url: string): boolean {\n return /\\.wixsite\\.com|\\.wix\\.com/.test(url);\n },\n\n detectByHtml(html: string): boolean {\n return (\n html.includes('wix-viewer-model') ||\n html.includes('id=\"WIX_ADS\"') ||\n html.includes('X-Wix-') ||\n html.includes('Wix.com') ||\n html.includes('wixcode-sdk') ||\n html.includes('data-wix') ||\n html.includes('wix-code') ||\n html.includes('WixCode') ||\n /\\bwix\\.com\\b/.test(html) ||\n /meta\\s+name=[\"']generator[\"']\\s+content=[\"'][^\"']*Wix[^\"']*[\"']/i.test(html) ||\n /_wix_/i.test(html) ||\n /wix-ecom/i.test(html)\n );\n },\n\n stripDomains: [\n 'frog.wix.com',\n 'bi.wixapi.com',\n 'fed.wixcodescheduler.com',\n 'editor.wix.com',\n 'panorama.wixapps.net',\n ],\n\n stripSelectors: ['#WIX_ADS', '.wix-ads', '#wix-badge', '#SCROLL_TO_TOP'],\n\n stripPatterns: [\n /<div[^>]*class=\"[^\"]*wix-ads[^\"]*\"[^>]*>[\\s\\S]*?<\\/div>/g,\n ],\n\n hydrationTimeout: 3000,\n needsHydrationCheck: false,\n\n mapAssetDir(host: string, pathname: string, ext: string): string | null {\n if (host === 'video.wixstatic.com') {\n return 'assets/videos';\n }\n\n if (host.includes('wixstatic.com')) {\n if (VIDEO_EXTS.includes(ext)) return 'assets/videos';\n if (pathname.includes('/images/') || IMG_EXTS.includes(ext)) return 'assets/images';\n if (ext === '.css') return 'styles';\n if (ext === '.js') return 'scripts/vendor';\n if (FONT_EXTS.includes(ext)) return 'assets/fonts';\n return 'assets/misc';\n }\n\n if (host.includes('parastorage.com')) {\n if (ext === '.js') return 'scripts/vendor';\n if (ext === '.css') return 'styles';\n if (FONT_EXTS.includes(ext)) return 'assets/fonts';\n if (IMG_EXTS.includes(ext)) return 'assets/images';\n return 'assets/misc';\n }\n\n return null;\n },\n};\n","import type { PlatformHandler, PlatformType } from './types.js';\nimport type { Page } from 'puppeteer';\nimport { framer } from './framer.js';\nimport { webflow } from './webflow.js';\nimport { wix } from './wix.js';\n\nconst ALL_PLATFORMS: PlatformHandler[] = [framer, webflow, wix];\n\nexport function detectByUrl(url: string): PlatformHandler | null {\n for (const platform of ALL_PLATFORMS) {\n if (platform.detectByUrl(url)) return platform;\n }\n return null;\n}\n\nexport function detectByHtml(html: string): PlatformHandler | null {\n for (const platform of ALL_PLATFORMS) {\n if (platform.detectByHtml(html)) return platform;\n }\n return null;\n}\n\nexport function detectPlatform(url: string, html?: string): PlatformHandler {\n const byUrl = detectByUrl(url);\n if (byUrl) return byUrl;\n\n if (html) {\n const byHtml = detectByHtml(html);\n if (byHtml) return byHtml;\n }\n\n return framer;\n}\n\nexport async function detectByDom(page: Page): Promise<PlatformHandler | null> {\n try {\n const signal: string = await page.evaluate(() => {\n const html: string = document.documentElement.outerHTML || '';\n\n if (/wix-viewer-model|_wix_|wix-ecom/i.test(html)) return 'wix';\n if (/data-wf-|w-webflow-badge|webflow\\.js/i.test(html)) return 'webflow';\n if (/framerusercontent|framercanvas|framerstatic/i.test(html)) return 'framer';\n\n const srcs: string[] = [];\n const scripts: NodeListOf<HTMLScriptElement> = document.querySelectorAll('script[src]');\n scripts.forEach((s) => { if (s.src) srcs.push(s.src); });\n const allSrcs: string = srcs.join(' ');\n if (/wixstatic\\.com|parastorage\\.com/.test(allSrcs)) return 'wix';\n if (/website-files\\.com|webflow\\.com/.test(allSrcs)) return 'webflow';\n if (/framerusercontent\\.com|framerstatic\\.com|framer\\.app/.test(allSrcs)) return 'framer';\n\n return '';\n });\n\n if (signal === 'wix') return wix;\n if (signal === 'webflow') return webflow;\n if (signal === 'framer') return framer;\n } catch {}\n return null;\n}\n\nexport function getPlatformByName(name: PlatformType): PlatformHandler {\n const map: Record<string, PlatformHandler> = { framer, webflow, wix };\n return map[name] || framer;\n}\n","export type { PlatformHandler, PlatformType } from './types.js';\nexport { framer } from './framer.js';\nexport { webflow } from './webflow.js';\nexport { wix } from './wix.js';\nexport { detectPlatform, detectByUrl, detectByHtml, detectByDom, getPlatformByName } from './detect.js';\n","import puppeteer, { type Page } from 'puppeteer';\nimport { CFG } from '../config/index.js';\nimport { log, success, info } from '../logger/index.js';\nimport { detectByDom } from '../platforms/index.js';\nimport type { ExporterContext } from '../types.js';\n\nexport async function launchAndCapture(exporter: ExporterContext): Promise<void> {\n exporter.cooking?.update('Launching browser...');\n log('Launching headless Chromium...');\n\n exporter.browser = await puppeteer.launch({\n headless: true,\n args: ['--no-sandbox', '--disable-setuid-sandbox'],\n });\n success('Chromium launched');\n\n exporter.page = await exporter.browser.newPage();\n await exporter.page.setViewport(CFG.viewport);\n log('Viewport set to ' + CFG.viewport.width + 'x' + CFG.viewport.height);\n\n await exporter.page.setUserAgent(\n 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 ' +\n '(KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36'\n );\n log('User agent set to Chrome 131');\n\n const allStripDomains: string[] = [\n ...CFG.sharedStripDomains,\n ...exporter.platform.stripDomains,\n ];\n log('Blocking ' + allStripDomains.length + ' tracking domains:');\n for (const domain of allStripDomains) {\n log(' - ' + domain);\n }\n\n let intercepted = 0;\n let blocked = 0;\n\n exporter.page.on('response', async (res) => {\n const url: string = res.url();\n if (url.startsWith('data:') || url.startsWith('blob:')) return;\n\n try {\n const host: string = new URL(url).hostname;\n if (allStripDomains.some((d) => host.includes(d))) {\n blocked++;\n return;\n }\n } catch {\n return;\n }\n\n exporter.assets.localPathFor(url, exporter.platform);\n try {\n exporter.assets.buffers.set(url, await res.buffer());\n intercepted++;\n } catch {}\n });\n\n log('Network interception enabled');\n\n exporter.cooking?.update('Navigating to site...');\n info('Navigating to ' + exporter.siteUrl);\n await exporter.page.goto(exporter.siteUrl, {\n waitUntil: 'networkidle2',\n timeout: CFG.timeout,\n });\n success('Page loaded (networkidle2)');\n log('Intercepted ' + intercepted + ' resources, blocked ' + blocked + ' tracking requests');\n\n log('Checking DOM-based platform detection...');\n const domDetected = await detectByDom(exporter.page);\n if (domDetected && domDetected.name !== exporter.platform.name) {\n log('Platform refined from DOM: ' + domDetected.displayName + ' (override: ' + exporter.platform.name + ')');\n exporter.platform = domDetected;\n }\n\n exporter.cooking?.update('Waiting for ' + exporter.platform.displayName + ' hydration...');\n\n if (exporter.platform.needsHydrationCheck) {\n log('Checking for #main element hydration...');\n log('Hydration timeout: ' + exporter.platform.hydrationTimeout + 'ms');\n const timeout = exporter.platform.hydrationTimeout;\n await exporter.page.evaluate(`\n new Promise(function(r) {\n var start = Date.now();\n var tick = function() {\n var m = document.getElementById('main') || document.body;\n if (m && m.children.length > 0) setTimeout(r, 2000);\n else if (Date.now() - start > ${timeout}) r();\n else setTimeout(tick, 200);\n };\n tick();\n })\n `);\n success('Hydration complete (SPA rendered)');\n } else {\n log('Static site detected, waiting ' + exporter.platform.hydrationTimeout + 'ms for render...');\n await new Promise<void>((r) => setTimeout(r, exporter.platform.hydrationTimeout));\n success(exporter.platform.displayName + ' page rendered');\n }\n\n exporter.cooking?.update('Scrolling page...');\n log('Starting full-page scroll (step: ' + CFG.scrollStep + 'px, delay: ' + CFG.scrollDelay + 'ms)');\n\n const scrollStep = CFG.scrollStep;\n const scrollDelay = CFG.scrollDelay;\n\n const pageHeight: number = await exporter.page.evaluate(`\n Math.max(document.body.scrollHeight, document.documentElement.scrollHeight)\n `) as number;\n log('Page height: ' + pageHeight + 'px (' + Math.ceil(pageHeight / scrollStep) + ' scroll steps)');\n\n await exporter.page.evaluate(`\n new Promise(function(r) {\n var y = 0;\n var max = Math.max(document.body.scrollHeight, document.documentElement.scrollHeight);\n var step = function() {\n y += ${scrollStep};\n window.scrollTo({ top: y, behavior: 'instant' });\n y < max + 500 ? setTimeout(step, ${scrollDelay}) : (window.scrollTo(0, 0), r());\n };\n step();\n })\n `);\n success('Full-page scroll complete');\n\n exporter.cooking?.update('Waiting for lazy resources...');\n log('Waiting 2s for lazy-loaded resources...');\n await new Promise<void>((r) => setTimeout(r, 2000));\n\n log('Checking network idle (1.5s quiet, 8s timeout)...');\n try {\n await exporter.page.waitForNetworkIdle({ idleTime: 1500, timeout: 8000 });\n success('Network idle confirmed');\n } catch {\n log('Network idle timeout reached (continuing anyway)');\n }\n\n const totalCaptured: number = exporter.assets.buffers.size;\n success('Captured ' + totalCaptured + ' network resources total');\n\n const cssCount: number = [...exporter.assets.entries.values()].filter((e) => e.localPath.endsWith('.css')).length;\n const jsCount: number = [...exporter.assets.entries.values()].filter((e) => e.localPath.endsWith('.js') || e.localPath.endsWith('.mjs')).length;\n const imgCount: number = [...exporter.assets.entries.values()].filter((e) => e.localPath.startsWith('assets/images')).length;\n const fontCount: number = [...exporter.assets.entries.values()].filter((e) => e.localPath.startsWith('assets/fonts')).length;\n log(' CSS: ' + cssCount + ' | JS: ' + jsCount + ' | Images: ' + imgCount + ' | Fonts: ' + fontCount);\n}\n\nexport async function closeBrowser(exporter: { browser: import('puppeteer').Browser | null }): Promise<void> {\n if (exporter.browser) {\n await exporter.browser.close();\n exporter.browser = null;\n log('Browser closed');\n }\n}\n\nexport async function captureSubpage(\n page: Page,\n url: string,\n platform: { needsHydrationCheck: boolean; hydrationTimeout: number }\n): Promise<string> {\n log(' Navigating to sub-page: ' + url);\n await page.goto(url, { waitUntil: 'networkidle2', timeout: CFG.timeout });\n\n if (platform.needsHydrationCheck) {\n await page.evaluate(\n `new Promise(function(r) {\n var t = Date.now();\n (function tick() {\n var m = document.getElementById('main') || document.body;\n if (m && m.children.length > 0) setTimeout(r, 500);\n else if (Date.now() - t > ${platform.hydrationTimeout}) r();\n else setTimeout(tick, 200);\n })();\n })`\n );\n } else {\n await new Promise<void>((r) => setTimeout(r, 1000));\n }\n\n const html: string = await page.evaluate(() => document.documentElement.outerHTML || document.body.innerHTML);\n log(' Sub-page fetched: ' + (html.length / 1024).toFixed(1) + ' KB');\n return html;\n}\n","export async function pool(tasks: Array<() => Promise<void>>, n: number): Promise<void> {\n let i = 0;\n const run = async (): Promise<void> => {\n while (i < tasks.length) {\n const j = i++;\n await tasks[j]();\n }\n };\n await Promise.all(Array.from({ length: Math.min(n, tasks.length) }, () => run()));\n}\n","import fs from 'fs/promises';\nimport path from 'path';\nimport { CFG } from '../config/index.js';\nimport { log, warn, success } from '../logger/index.js';\nimport { dlBuffer } from '../network/download.js';\nimport { pool } from '../network/pool.js';\nimport type { ExporterContext } from '../types.js';\n\nexport async function downloadAll(exporter: ExporterContext): Promise<void> {\n const seen: Set<string> = new Set();\n const toDownload: Array<{ url: string; localPath: string }> = [];\n for (const [url, { localPath }] of exporter.assets.entries) {\n if (seen.has(localPath)) continue;\n seen.add(localPath);\n toDownload.push({ url, localPath });\n }\n\n const total: number = toDownload.length;\n log('Starting download of ' + total + ' unique assets');\n log('Concurrency: ' + CFG.concurrency + ' parallel downloads');\n log('Retry policy: ' + CFG.retries + ' attempts, ' + CFG.dlTimeout + 'ms timeout');\n\n let ok = 0;\n let cached = 0;\n let fail = 0;\n let completed = 0;\n let lastReported = 0;\n\n const tasks: Array<() => Promise<void>> = toDownload.map(\n ({ url, localPath }) =>\n async (): Promise<void> => {\n const dest: string = path.join(exporter.outDir, localPath);\n await fs.mkdir(path.dirname(dest), { recursive: true });\n\n try {\n const buf: Buffer | undefined =\n exporter.assets.buffers.get(url) ||\n exporter.assets.buffers.get(url.split('?')[0]);\n if (buf) {\n await fs.writeFile(dest, buf);\n cached++;\n ok++;\n } else {\n const data: Buffer = await dlBuffer(url);\n await fs.writeFile(dest, data);\n ok++;\n }\n } catch (e) {\n fail++;\n if (\n !url.includes('framer.com/edit') &&\n !url.includes('framerstatic.com/editorbar')\n ) {\n warn('Download failed: ' + path.basename(localPath) + ' - ' + (e as Error).message);\n }\n }\n\n completed++;\n const pct: number = Math.floor((completed / total) * 100);\n if (pct >= lastReported + 10 || completed === total) {\n exporter.cooking?.update('Downloading... ' + completed + '/' + total + ' (' + pct + '%)');\n log('Download progress: ' + completed + '/' + total + ' (' + pct + '%)');\n lastReported = pct;\n }\n }\n );\n\n await pool(tasks, CFG.concurrency);\n\n success('Downloads complete: ' + ok + ' succeeded, ' + cached + ' from cache, ' + fail + ' failed');\n\n const totalBytes: number = [...exporter.assets.entries.values()].length;\n log('Total unique assets written to disk: ' + totalBytes);\n\n exporter.assets.buffers.clear();\n log('Network buffer cache cleared');\n}\n","import prettier from 'prettier';\n\nexport async function prettifyJS(src: string): Promise<string> {\n try {\n return await prettier.format(src, {\n parser: 'babel',\n printWidth: 100,\n tabWidth: 2,\n useTabs: false,\n semi: true,\n singleQuote: false,\n trailingComma: 'es5',\n bracketSpacing: true,\n arrowParens: 'always',\n });\n } catch {\n return src;\n }\n}\n","export const SERVE_SCRIPT: string = `#!/usr/bin/env node\nconst http = require('http');\nconst fs = require('fs');\nconst path = require('path');\n\nconst PORT = process.env.PORT || 3000;\nconst ROOT = __dirname;\n\nconst MIME = {\n '.html': 'text/html; charset=utf-8',\n '.css': 'text/css; charset=utf-8',\n '.js': 'application/javascript; charset=utf-8',\n '.mjs': 'application/javascript; charset=utf-8',\n '.json': 'application/json; charset=utf-8',\n '.png': 'image/png',\n '.jpg': 'image/jpeg',\n '.jpeg': 'image/jpeg',\n '.gif': 'image/gif',\n '.svg': 'image/svg+xml',\n '.webp': 'image/webp',\n '.avif': 'image/avif',\n '.ico': 'image/x-icon',\n '.woff': 'font/woff',\n '.woff2': 'font/woff2',\n '.ttf': 'font/ttf',\n '.otf': 'font/otf',\n '.mp4': 'video/mp4',\n '.webm': 'video/webm',\n '.ogg': 'video/ogg',\n '.framercms': 'application/octet-stream',\n};\n\nconst server = http.createServer((req, res) => {\n let url = decodeURIComponent(req.url.split('?')[0]);\n if (url === '/') url = '/index.html';\n\n let filePath = path.join(ROOT, url);\n if (!filePath.startsWith(ROOT)) {\n res.writeHead(403);\n res.end('Forbidden');\n return;\n }\n\n const serveFile = (pathToFile) => {\n fs.readFile(pathToFile, (err, data) => {\n if (err) {\n // SPA Fallback: if it's not a file, serve index.html\n if (url !== '/index.html' && !path.extname(url)) {\n return serveFile(path.join(ROOT, 'index.html'));\n }\n res.writeHead(404);\n res.end('Not found');\n return;\n }\n const ext = path.extname(pathToFile).toLowerCase();\n const mime = MIME[ext] || 'application/octet-stream';\n res.writeHead(200, {\n 'Content-Type': mime,\n 'Access-Control-Allow-Origin': '*',\n 'Cache-Control': 'public, max-age=3600',\n });\n res.end(data);\n });\n };\n\n serveFile(filePath);\n});\n\nserver.listen(PORT, () => {\n console.log('\\\\x1b[32m%s\\\\x1b[0m', ' 🚀 Cooksite Local Server Running');\n console.log('\\\\x1b[36m%s\\\\x1b[0m', ' ├─ URL: http://localhost:' + PORT);\n console.log('\\\\x1b[35m%s\\\\x1b[0m', ' └─ Directory: ' + ROOT);\n console.log('\\\\n Press Ctrl+C to stop.');\n});\n`;\n","import fs from 'fs/promises';\nimport path from 'path';\nimport { log, warn, success } from '../logger/index.js';\nimport { prettifyJS } from '../formatter/prettify.js';\nimport { SERVE_SCRIPT } from '../server/template.js';\nimport type { ExporterContext } from '../types.js';\n\nfunction escapeRegex(str: string): string {\n return str.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n}\n\nfunction stripBySelector(html: string, sel: string): string {\n if (sel.includes('[src*=\"')) {\n const match = sel.match(/\\[src\\*=\"([^\"]+)\"\\]/);\n if (match) {\n const domain: string = escapeRegex(match[1]);\n html = html.replace(new RegExp(`<script[^>]*${domain}[^>]*>[^<]*<\\\\/script>`, 'g'), '');\n html = html.replace(new RegExp(`<script[^>]*${domain}[^>]*><\\\\/script>`, 'g'), '');\n }\n } else if (sel.includes('[href*=\"')) {\n const match = sel.match(/\\[href\\*=\"([^\"]+)\"\\]/);\n if (match) {\n const href: string = escapeRegex(match[1]);\n html = html.replace(new RegExp(`<link[^>]*${href}[^>]*>`, 'g'), '');\n }\n } else if (sel.startsWith('.')) {\n const cls: string = escapeRegex(sel.slice(1));\n html = html.replace(\n new RegExp(`<[^>]*class=\"[^\"]*${cls}[^\"]*\"[^>]*>[\\\\s\\\\S]*?<\\\\/[^>]*>`, 'g'),\n ''\n );\n } else if (sel.startsWith('#')) {\n const id: string = sel.slice(1);\n html = removeElementById(html, id);\n }\n return html;\n}\n\nfunction removeElementById(html: string, id: string): string {\n const marker: string = `id=\"${id}\"`;\n let idx: number = html.indexOf(marker);\n while (idx !== -1) {\n const tagStart: number = html.lastIndexOf('<', idx);\n if (tagStart === -1) break;\n\n const tagNameEnd: number = html.indexOf(' ', tagStart + 1);\n const tagName: string = html.slice(tagStart + 1, tagNameEnd).toLowerCase();\n\n let depth = 0;\n let i: number = tagStart;\n while (i < html.length) {\n if (html.startsWith(`<${tagName}`, i) && (html[i + tagName.length + 1] === ' ' || html[i + tagName.length + 1] === '>')) {\n depth++;\n i += tagName.length + 1;\n } else if (html.startsWith(`</${tagName}>`, i)) {\n depth--;\n if (depth === 0) {\n html = html.slice(0, tagStart) + html.slice(i + tagName.length + 3);\n break;\n }\n i += tagName.length + 3;\n } else {\n i++;\n }\n }\n\n idx = html.indexOf(marker);\n }\n return html;\n}\n\nfunction processSEO(html: string, url: string): string {\n const canonical = url.split('?')[0].replace(/\\/$/, '');\n \n // Inject Canonical\n if (!html.includes('rel=\"canonical\"')) {\n html = html.replace('</head>', ` <link rel=\"canonical\" href=\"${canonical}\">\\n </head>`);\n }\n\n // Inject Meta Description if missing\n if (!html.includes('name=\"description\"')) {\n html = html.replace('</head>', ` <meta name=\"description\" content=\"Exported with Cooksite - Fast, SEO-optimized, and clean.\">\\n </head>`);\n }\n\n // Inject OG Tags if missing\n if (!html.includes('property=\"og:')) {\n html = html.replace('</head>', ` <meta property=\"og:type\" content=\"website\">\\n <meta property=\"og:url\" content=\"${canonical}\">\\n <meta property=\"og:title\" content=\"Exported Site\">\\n <meta property=\"og:description\" content=\"A fast, clean version of this site, exported for performance.\">\\n </head>`);\n }\n\n // Inject Robot tags\n if (!html.includes('name=\"robots\"')) {\n html = html.replace('</head>', ` <meta name=\"robots\" content=\"index, follow\">\\n </head>`);\n }\n\n return html;\n}\n\nfunction stripIntegrityAndCors(html: string): string {\n html = html.replace(/\\s+integrity=\"[^\"]*\"/g, '');\n html = html.replace(/\\s+crossorigin=\"[^\"]*\"/g, '');\n html = html.replace(/\\s+crossorigin/g, '');\n html = html.replace(/<link[^>]*rel=\"preconnect\"[^>]*>/g, '');\n html = html.replace(/<link[^>]*rel=\"dns-prefetch\"[^>]*>/g, '');\n html = html.replace(/<meta[^>]*content-security-policy[^>]*>/gi, '');\n return html;\n}\n\nfunction stripSrcsetCdnUrls(html: string): string {\n html = html.replace(/srcset=\"([^\"]*)\"/g, (_match: string, srcset: string) => {\n const cleaned: string = srcset\n .split(',')\n .map((entry: string) => entry.trim())\n .filter((entry: string) => !entry.startsWith('http'))\n .join(', ');\n return cleaned ? 'srcset=\"' + cleaned + '\"' : '';\n });\n return html;\n}\n\nexport async function buildOutput(exporter: ExporterContext): Promise<void> {\n exporter.cooking?.update('Stripping platform badges...');\n log('Starting HTML post-processing...');\n log('HTML size: ' + (exporter.ssrHTML.length / 1024).toFixed(1) + ' KB');\n\n let html: string = exporter.ssrHTML;\n if (!html) {\n warn('No SSR HTML available, cannot build output');\n return;\n }\n\n exporter.cooking?.update('Removing integrity checks...');\n const beforeIntegrity: number = html.length;\n html = stripIntegrityAndCors(html);\n log('Stripped integrity/crossorigin/preconnect (' + (beforeIntegrity - html.length) + ' chars)');\n success('Integrity and CORS restrictions removed');\n\n if (typeof processSEO === 'function') {\n exporter.cooking?.update('Optimizing SEO...');\n html = processSEO(html, exporter.siteUrl);\n success('SEO meta tags optimized');\n }\n\n log('Stripping ' + exporter.platform.stripSelectors.length + ' selectors:');\n for (const sel of exporter.platform.stripSelectors) {\n const before: number = html.length;\n html = stripBySelector(html, sel);\n const removed: number = before - html.length;\n if (removed > 0) {\n log(' Stripped ' + sel + ' (' + removed + ' chars removed)');\n }\n }\n\n log('Applying ' + exporter.platform.stripPatterns.length + ' regex patterns...');\n for (const pattern of exporter.platform.stripPatterns) {\n const before: number = html.length;\n html = html.replace(new RegExp(pattern.source, pattern.flags), '');\n const removed: number = before - html.length;\n if (removed > 0) {\n log(' Pattern removed ' + removed + ' chars');\n }\n }\n success('Platform badges and tracking stripped');\n\n exporter.cooking?.update('Rewriting asset URLs...');\n log('Rewriting ' + exporter.assets.entries.size + ' CDN URLs to local paths...');\n const beforeRewrite: number = html.length;\n html = exporter.assets.rewrite(html, '');\n log('HTML rewrite delta: ' + (html.length - beforeRewrite) + ' chars');\n\n exporter.cooking?.update('Cleaning srcset references...');\n html = stripSrcsetCdnUrls(html);\n log('Cleaned remaining CDN URLs from srcset attributes');\n\n await rewriteDownloadedFiles(exporter);\n success('All URLs rewritten to local paths');\n\n exporter.cooking?.update('Pretty-printing JS files...');\n await prettifyDownloadedJS(exporter);\n\n exporter.cooking?.update('Writing final output...');\n log('Writing index.html (' + (html.length / 1024).toFixed(1) + ' KB)...');\n await fs.writeFile(path.join(exporter.outDir, 'index.html'), html);\n success('index.html written');\n\n await fs.writeFile(path.join(exporter.outDir, 'serve.cjs'), SERVE_SCRIPT);\n log('serve.cjs written');\n success('Output build complete');\n}\n\nasync function rewriteDownloadedFiles(exporter: ExporterContext): Promise<void> {\n const dirs: string[] = ['scripts/vendor', 'scripts/modules', 'styles'];\n let rewritten = 0;\n\n for (const dir of dirs) {\n const fullDir: string = path.join(exporter.outDir, dir);\n let files: string[];\n try {\n files = await fs.readdir(fullDir);\n } catch {\n continue;\n }\n\n for (const file of files) {\n const ext: string = path.extname(file).toLowerCase();\n if (!['.mjs', '.js', '.css'].includes(ext)) continue;\n\n const filePath: string = path.join(fullDir, file);\n try {\n let content: string = await fs.readFile(filePath, 'utf-8');\n const before: string = content;\n content = exporter.assets.rewrite(content, dir);\n if (content !== before) {\n await fs.writeFile(filePath, content);\n rewritten++;\n }\n } catch {}\n }\n }\n log('Rewrote URLs in ' + rewritten + ' JS/CSS files');\n}\n\nasync function prettifyDownloadedJS(exporter: ExporterContext): Promise<void> {\n const dirs: string[] = ['scripts/vendor', 'scripts/modules'];\n let count = 0;\n let total = 0;\n\n for (const dir of dirs) {\n const fullDir: string = path.join(exporter.outDir, dir);\n let files: string[];\n try {\n files = await fs.readdir(fullDir);\n } catch {\n continue;\n }\n\n const jsFiles: string[] = files.filter((f) => {\n const ext: string = path.extname(f).toLowerCase();\n return ext === '.mjs' || ext === '.js';\n });\n total += jsFiles.length;\n\n for (const file of jsFiles) {\n const filePath: string = path.join(fullDir, file);\n try {\n const raw: string = await fs.readFile(filePath, 'utf-8');\n\n const nlRatio: number = (raw.match(/\\n/g) || []).length / raw.length;\n if (nlRatio > 0.05) {\n count++;\n continue;\n }\n\n const pretty: string = await prettifyJS(raw);\n await fs.writeFile(filePath, pretty, 'utf-8');\n count++;\n\n if (count % 5 === 0) {\n exporter.cooking?.update('Pretty-printing... (' + count + '/' + total + ')');\n }\n } catch (e) {\n warn('Pretty-print skipped: ' + file + ' - ' + (e as Error).message);\n count++;\n }\n }\n }\n\n success('Formatted ' + count + '/' + total + ' JS/MJS files');\n}\n","import chalk from 'chalk';\n\nexport function maxWidth(): number {\n return Math.min(process.stdout.columns || 80, 62);\n}\n\nconst B = chalk.hex('#8B6914');\nconst G = chalk.hex('#C4953A');\n\nfunction padRight(text: string, w: number): string {\n const visible = stripAnsi(text).length;\n if (visible >= w) return text;\n return text + ' '.repeat(w - visible);\n}\n\nfunction stripAnsi(s: string): string {\n return s.replace(/\\x1B\\[[0-9;]*[a-zA-Z]/g, '');\n}\n\nexport function boxTop(w: number): string {\n const inner = w - 4;\n return ' ' + B('╔═') + B('═'.repeat(inner)) + B('═╗');\n}\n\nexport function boxBot(w: number): string {\n const inner = w - 4;\n return ' ' + B('╚═') + B('═'.repeat(inner)) + B('═╝');\n}\n\nexport function boxLine(w: number, text: string): string {\n const inner = w - 4;\n const padded = padRight(text, inner);\n return ' ' + B('║ ') + padded + B(' ║');\n}\n\nexport function boxSep(w: number): string {\n const inner = w - 4;\n return ' ' + B('╠═') + B('═'.repeat(inner)) + B('═╣');\n}\n\nexport function boxRow(w: number, label: string, value: string): string {\n const inner = w - 4;\n const labelPlain = stripAnsi(chalk.bold(label));\n const visible = labelPlain.length + 1 + value.length;\n if (visible > inner) {\n const avail = inner - labelPlain.length - 2;\n const truncated = value.length > avail ? value.slice(0, avail - 1) + '..' : value;\n return ' ' + G('║ ') + chalk.bold(label) + ': ' + chalk.yellow(truncated) + ' '.repeat(Math.max(0, inner - labelPlain.length - 1 - truncated.length)) + G(' ║');\n }\n const right = inner - labelPlain.length - 1 - value.length;\n return ' ' + G('║ ') + chalk.bold(label) + ': ' + chalk.yellow(value) + ' '.repeat(right) + G(' ║');\n}\n","import fs from 'fs/promises';\nimport path from 'path';\nimport chalk from 'chalk';\nimport type { ExporterContext } from '../types.js';\nimport { boxTop, boxLine, boxBot, boxSep, maxWidth } from '../cli/box.js';\n\nexport async function printSummary(exporter: ExporterContext): Promise<void> {\n const w = maxWidth();\n const isSmall = w < 50;\n\n const count = async (d: string): Promise<number> => {\n try {\n return (await fs.readdir(path.join(exporter.outDir, d))).length;\n } catch {\n return 0;\n }\n };\n const [imgs, fonts, videos, misc, scripts, vendor, styles, data, subpages] = await Promise.all([\n count('assets/images'),\n count('assets/fonts'),\n count('assets/videos'),\n count('assets/misc'),\n count('scripts/modules'),\n count('scripts/vendor'),\n count('styles'),\n count('data'),\n count('subpages'),\n ]);\n\n const G = chalk.hex('#D4A017');\n const G2 = chalk.hex('#DAA520');\n const C2 = chalk.hex('#E0B040');\n const Y = chalk.yellow;\n const O = chalk.hex('#CC7722');\n const Br = chalk.hex('#B8860B');\n const Gr = chalk.gray;\n const Gn = chalk.green;\n\n const entries: Array<[string, number, string, (s: string) => string]> = [\n ['styles/', styles, 'CSS', G],\n ['scripts/vendor/', vendor, 'JS vendor', G2],\n ['scripts/modules/', scripts, 'JS modules', C2],\n ['assets/images/', imgs, 'images', Y],\n ['assets/videos/', videos, 'videos', O],\n ['assets/fonts/', fonts, 'fonts', Br],\n ['assets/misc/', misc, 'misc', Gr],\n ['data/', data, 'data', Gr],\n ['subpages/', subpages, 'pages', Gn],\n ];\n\n console.log('');\n if (!isSmall) {\n console.log(boxTop(w));\n console.log(boxLine(w, chalk.bold.white(' Export Summary')));\n console.log(boxSep(w));\n } else {\n console.log(chalk.bold.white(' Export Summary:'));\n }\n\n for (const [label, cnt, type, color] of entries) {\n if (cnt === 0) continue;\n const inner = w - 4;\n const l = label.padEnd(16);\n const c = String(cnt).padStart(3);\n const rowText = `${color(l)}${chalk.white(c)} ${chalk.gray(type)}`;\n const visible = 16 + 3 + 2 + type.length;\n const pad = Math.max(0, inner - visible);\n if (isSmall) {\n console.log(` ${color(label)} ${chalk.white(String(cnt))} ${chalk.gray(type)}`);\n } else {\n console.log(' ' + chalk.hex('#C4953A')('║ ') + rowText + ' '.repeat(pad) + chalk.hex('#C4953A')(' ║'));\n }\n }\n\n if (!isSmall) {\n console.log(boxBot(w));\n }\n\n console.log('');\n const cdCmd = 'cd ' + path.basename(exporter.outDir) + ' && node serve.cjs';\n if (!isSmall) {\n console.log(boxTop(w));\n console.log(boxLine(w, chalk.bold.white(' To serve locally')));\n console.log(boxSep(w));\n const inner = w - 6;\n const cmdLen = cdCmd.length;\n const pad = Math.max(0, inner - cmdLen);\n console.log(' ' + chalk.hex('#C4953A')('║ ') + G(cdCmd) + ' '.repeat(pad) + chalk.hex('#9e9e9e')(' 🗐') + chalk.hex('#C4953A')(' ║'));\n console.log(boxBot(w));\n } else {\n console.log(chalk.bold.white(' To serve locally:'));\n console.log(` ${G(cdCmd)}`);\n }\n \n console.log('');\n console.log(chalk.gray(' NOTE: Must be served via HTTP for JS modules to work.'));\n console.log('');\n}\n","import chalk from 'chalk';\n\nconst SHINE_WIDTH = 10;\nconst FRAME_INTERVAL = 140;\n\nconst DOT_PHASES = [' ', '. ', '.. ', '...', ' ..', ' .', ' '];\n\nexport class CookingSpinner {\n private interval: NodeJS.Timeout | null = null;\n private frame = 0;\n private phase = '';\n private active = false;\n\n start(phase: string = ''): void {\n this.phase = phase;\n this.frame = 0;\n this.active = true;\n this.draw();\n this.interval = setInterval(() => {\n this.frame++;\n this.draw();\n }, FRAME_INTERVAL);\n }\n\n update(phase: string): void {\n this.phase = phase;\n }\n\n log(message: string): void {\n if (this.active) {\n process.stdout.write('\\r\\x1B[2K');\n }\n process.stdout.write(message + '\\n');\n if (this.active) {\n this.draw();\n }\n }\n\n stop(): void {\n this.active = false;\n if (this.interval) {\n clearInterval(this.interval);\n this.interval = null;\n }\n process.stdout.write('\\r\\x1B[2K');\n }\n\n private draw(): void {\n if (!this.active) return;\n\n const dots = DOT_PHASES[this.frame % DOT_PHASES.length];\n const shimmer = this.renderShimmer('Cooking');\n const dotStr = chalk.hex('#D4A017')(dots);\n const phaseStr = this.phase\n ? ` ${chalk.gray(this.limitLen(this.phase, 38))}`\n : '';\n\n process.stdout.write(`\\r\\x1B[2K ${shimmer} ${dotStr}${phaseStr}`);\n }\n\n private renderShimmer(text: string): string {\n let result = '';\n const pos = this.frame % (text.length + SHINE_WIDTH * 2) - SHINE_WIDTH;\n for (let i = 0; i < text.length; i++) {\n const dist = Math.abs(i - pos);\n if (dist < SHINE_WIDTH) {\n const t = 1 - dist / SHINE_WIDTH;\n const g = Math.floor(160 + t * 95);\n result += chalk.rgb(g, g, g)(text[i]);\n } else {\n result += chalk.rgb(160, 160, 160)(text[i]);\n }\n }\n return result;\n }\n\n private limitLen(s: string, max: number): string {\n if (s.length <= max) return s;\n return s.slice(0, max - 1) + '…';\n }\n}\n","import fs from 'fs/promises';\nimport path from 'path';\nimport chalk from 'chalk';\nimport type { Browser, Page } from 'puppeteer';\nimport { AssetMap } from '../assets/asset-map.js';\nimport { dlBuffer } from '../network/download.js';\nimport { info, log, success, setCooking } from '../logger/index.js';\nimport { launchAndCapture, captureSubpage, closeBrowser } from './capture.js';\nimport { downloadAll } from './download.js';\nimport { buildOutput } from './output.js';\nimport { printSummary } from './summary.js';\nimport { detectPlatform, getPlatformByName } from '../platforms/index.js';\nimport type { PlatformHandler, PlatformType } from '../platforms/types.js';\nimport type { ExporterContext } from '../types.js';\nimport { CookingSpinner } from '../cli/cooking.js';\n\nexport function deriveOutputName(url: string, platformName: PlatformType): string {\n try {\n const parsed = new URL(url);\n const hostname: string = parsed.hostname;\n\n let siteName: string;\n if (hostname.endsWith('.webflow.io')) {\n siteName = hostname.replace('.webflow.io', '');\n } else if (hostname.includes('.wixsite.com')) {\n const parts: string[] = parsed.pathname.split('/').filter(Boolean);\n siteName = parts[0] || hostname.split('.')[0];\n } else if (hostname.match(/\\.framer\\.(app|website|ai)$/)) {\n siteName = hostname.split('.framer.')[0];\n } else {\n siteName = hostname.replace(/\\./g, '-');\n }\n\n return `${platformName}-${siteName}`;\n } catch {\n return 'framer-export-output';\n }\n}\n\nexport class FramerExporter implements ExporterContext {\n siteUrl: string;\n outDir: string;\n assets: AssetMap;\n browser: Browser | null;\n page: Page | null;\n ssrHTML: string;\n prettyPrint: boolean;\n platform: PlatformHandler;\n cooking?: CookingSpinner;\n\n constructor(siteUrl: string, outDir: string, platformOverride?: PlatformType) {\n this.siteUrl = siteUrl;\n this.outDir = outDir;\n this.assets = new AssetMap();\n this.browser = null;\n this.page = null;\n this.ssrHTML = '';\n this.prettyPrint = true;\n\n if (platformOverride && platformOverride !== 'unknown') {\n this.platform = getPlatformByName(platformOverride);\n } else {\n this.platform = detectPlatform(siteUrl);\n }\n }\n\n async run(includeSubpages: boolean = false): Promise<void> {\n console.log(chalk.bold.hex('#D4A017')('\\n Cooksite v4 - Full Mirror & Clean Export\\n'));\n info('Source : ' + chalk.underline(this.siteUrl));\n info('Output : ' + chalk.yellow(this.outDir));\n info('Platform : ' + chalk.hex('#D4A017')(this.platform.displayName));\n if (includeSubpages) {\n info('Subpages : ' + chalk.green('enabled'));\n }\n console.log('');\n\n this.cooking = new CookingSpinner();\n setCooking(this.cooking);\n this.cooking.start('Preparing directories...');\n\n for (const d of [\n '',\n 'assets/images',\n 'assets/fonts',\n 'assets/videos',\n 'assets/misc',\n 'styles',\n 'scripts/vendor',\n 'scripts/modules',\n 'data',\n 'subpages',\n ]) {\n await fs.mkdir(path.join(this.outDir, d), { recursive: true });\n }\n log('Output directory structure created');\n\n this.cooking.update('Fetching SSR HTML...');\n log('Fetching SSR HTML from ' + this.siteUrl);\n try {\n const buf: Buffer = await dlBuffer(this.siteUrl);\n this.ssrHTML = buf.toString('utf-8');\n success('SSR HTML fetched (' + (this.ssrHTML.length / 1024).toFixed(1) + ' KB)');\n } catch (e) {\n log(chalk.red('Could not fetch SSR HTML: ' + (e as Error).message));\n }\n\n const htmlDetected = detectPlatform(this.siteUrl, this.ssrHTML);\n if (htmlDetected.name !== this.platform.name) {\n this.platform = htmlDetected;\n log('Platform refined: ' + chalk.hex('#D4A017')(this.platform.displayName) + ' (from HTML analysis)');\n }\n\n await launchAndCapture(this);\n\n if (includeSubpages && this.page) {\n await this.crawlSubpages();\n }\n\n await closeBrowser(this);\n\n this.cooking.update('Downloading assets...');\n await downloadAll(this);\n\n this.cooking.update('Building output...');\n await buildOutput(this);\n\n this.cooking.stop();\n setCooking(null);\n\n console.log('');\n success('Export complete!');\n await printSummary(this);\n }\n\n private async crawlSubpages(): Promise<void> {\n this.cooking?.update('Discovering sub-pages...');\n log('Scanning page for internal links...');\n\n const page = this.page!;\n const baseUrl = new URL(this.siteUrl);\n const baseHost = baseUrl.hostname.replace(/^www\\./, '');\n\n const links: string[] = await page.evaluate((host: string) => {\n const anchors = Array.from(document.querySelectorAll('a[href]'));\n const hrefs = new Set<string>();\n for (const a of anchors) {\n const href = (a as HTMLAnchorElement).href;\n if (!href || href.startsWith('javascript:') || href.startsWith('mailto:') || href.startsWith('tel:') || href.startsWith('#')) continue;\n try {\n const u = new URL(href);\n const h = u.hostname.replace(/^www\\./, '');\n if (h === host && u.pathname !== '/' && u.pathname !== '' && !u.pathname.startsWith('/#')) {\n hrefs.add(href.split('#')[0]);\n }\n } catch {}\n }\n return Array.from(hrefs);\n }, baseHost);\n\n log('Found ' + links.length + ' sub-page links');\n const uniqueLinks = [...new Set(links)].slice(0, 50);\n\n if (uniqueLinks.length === 0) {\n log('No sub-pages to crawl');\n return;\n }\n\n for (let i = 0; i < uniqueLinks.length; i++) {\n const link = uniqueLinks[i];\n this.cooking?.update('Crawling sub-page ' + (i + 1) + '/' + uniqueLinks.length);\n try {\n const html = await captureSubpage(page, link, {\n needsHydrationCheck: this.platform.needsHydrationCheck,\n hydrationTimeout: this.platform.hydrationTimeout,\n });\n\n const slug = this.deriveSlug(link, baseUrl);\n const filename = slug + '.html';\n const filepath = path.join(this.outDir, 'subpages', filename);\n\n await fs.writeFile(filepath, html, 'utf-8');\n log(' Saved: subpages/' + filename);\n } catch (e) {\n log(' Skipped ' + link + ': ' + (e as Error).message);\n }\n }\n\n success('Sub-pages crawled: ' + uniqueLinks.length);\n }\n\n private deriveSlug(link: string, baseUrl: URL): string {\n try {\n const u = new URL(link);\n let pathname = u.pathname.replace(/\\/+$/, '').replace(/^\\//, '');\n if (!pathname) return 'index';\n return pathname.replace(/[^a-zA-Z0-9_-]/g, '_').replace(/_+/g, '_') || 'page';\n } catch {\n return 'page';\n }\n }\n}\n","import readline from 'node:readline';\nimport { stdin, stdout } from 'node:process';\nimport chalk from 'chalk';\n\nexport interface SelectOption {\n label: string;\n value: string;\n}\n\nfunction stripAnsi(s: string): string {\n return s.replace(/\\x1B\\[[0-9;]*[a-zA-Z]/g, '');\n}\n\nexport async function select(question: string, options: SelectOption[], defaultIndex: number = 0): Promise<string> {\n const isTTY = stdin.isTTY && stdout.isTTY;\n\n if (!isTTY) {\n return fallbackPrompt(question, options, defaultIndex);\n }\n\n return arrowSelect(question, options, defaultIndex);\n}\n\nasync function arrowSelect(question: string, options: SelectOption[], defaultIndex: number): Promise<string> {\n return new Promise((resolve) => {\n let selected: number = defaultIndex;\n\n const render = (initial: boolean = false): void => {\n if (!initial) {\n stdout.write(`\\x1B[${options.length + 1}A`);\n stdout.write('\\x1B[J');\n }\n console.log(` ${chalk.hex('#D4A017')('?')} ${chalk.white.bold(question)}`);\n for (let i = 0; i < options.length; i++) {\n if (i === selected) {\n console.log(` ${chalk.hex('#D4A017')('>')} ${chalk.white.bold(options[i].label)}`);\n } else {\n console.log(` ${chalk.gray(options[i].label)}`);\n }\n }\n };\n\n render(true);\n\n readline.emitKeypressEvents(stdin);\n stdin.setRawMode(true);\n\n const onKeypress = (_str: string | undefined, key: readline.Key): void => {\n if (!key) return;\n\n if (key.name === 'up' && selected > 0) {\n selected--;\n render();\n } else if (key.name === 'down' && selected < options.length - 1) {\n selected++;\n render();\n } else if (key.name === 'return') {\n stdin.setRawMode(false);\n stdin.removeListener('keypress', onKeypress);\n stdin.pause();\n\n stdout.write(`\\x1B[${options.length + 1}A`);\n stdout.write('\\x1B[J');\n console.log(` ${chalk.green('✓')} ${chalk.white.bold(question)} ${chalk.hex('#D4A017')(stripAnsi(options[selected].label))}\\n`);\n\n resolve(options[selected].value);\n } else if ((key.ctrl && key.name === 'c') || key.name === 'escape') {\n stdin.setRawMode(false);\n stdin.removeListener('keypress', onKeypress);\n process.exit(0);\n }\n };\n\n stdin.resume();\n stdin.on('keypress', onKeypress);\n });\n}\n\nasync function fallbackPrompt(question: string, options: SelectOption[], defaultIndex: number): Promise<string> {\n return new Promise((resolve) => {\n const rl = readline.createInterface({ input: stdin, output: stdout });\n\n console.log(` ${chalk.hex('#D4A017')('?')} ${chalk.white.bold(question)}\\n`);\n for (let i = 0; i < options.length; i++) {\n const marker = i === defaultIndex ? chalk.green(' ★') : ' ';\n console.log(` ${chalk.gray(`[${i + 1}]`)}${marker} ${chalk.white(options[i].label)}`);\n }\n console.log('');\n const def = String(defaultIndex + 1);\n\n const ask = (): void => {\n rl.question(` ${chalk.hex('#D4A017')('>')} ${chalk.gray(`Choose [1-${options.length}] (${def})`)}: `, (answer) => {\n const trimmed = answer.trim();\n if (!trimmed) {\n rl.close();\n const label = stripAnsi(options[defaultIndex].label);\n console.log(` ${chalk.green('✓')} ${chalk.hex('#D4A017')(label)}\\n`);\n resolve(options[defaultIndex].value);\n return;\n }\n const idx = parseInt(trimmed, 10);\n if (idx >= 1 && idx <= options.length) {\n rl.close();\n const label = stripAnsi(options[idx - 1].label);\n console.log(` ${chalk.green('✓')} ${chalk.hex('#D4A017')(label)}\\n`);\n resolve(options[idx - 1].value);\n } else {\n console.log(` ${chalk.red('✗')} Enter 1-${options.length}\\n`);\n ask();\n }\n });\n };\n ask();\n });\n}\n","import readline from 'node:readline/promises';\nimport { stdin, stdout } from 'node:process';\nimport path from 'node:path';\nimport { URL } from 'node:url';\nimport chalk from 'chalk';\nimport { showBanner } from './banner.js';\nimport { FramerExporter, deriveOutputName } from '../exporter/index.js';\nimport { detectPlatform } from '../platforms/index.js';\nimport { select } from './select.js';\nimport type { PlatformType } from '../platforms/types.js';\nimport { boxTop, boxLine, boxSep, boxBot, boxRow, maxWidth } from './box.js';\n\nfunction drawHeader(title: string): void {\n const w = maxWidth();\n if (w < 50) {\n console.log(`\\n ${chalk.hex('#D4A017')('●')} ${chalk.bold.white(title)}`);\n return;\n }\n console.log(boxTop(w));\n console.log(boxLine(w, chalk.bold.white(' ' + title)));\n console.log(boxBot(w));\n console.log('');\n}\n\nexport async function runSetup(legacyMode: boolean = false): Promise<void> {\n showBanner();\n\n console.log(chalk.bold.white(' Welcome to Framer Export setup.\\n'));\n console.log(chalk.gray(' Supports Framer, Webflow, and Wix sites.\\n'));\n\n const rl = readline.createInterface({ input: stdin, output: stdout });\n\n const ask = async (question: string, defaultVal?: string): Promise<string> => {\n const suffix: string = defaultVal ? chalk.gray(` (${defaultVal})`) : '';\n const prompt: string = ` ${chalk.hex('#D4A017')('?')} ${chalk.white.bold(question)}${suffix} ${chalk.gray('>')} `;\n const answer: string = await rl.question(prompt);\n return answer.trim() || defaultVal || '';\n };\n\n drawHeader('Step 1 : Site URL');\n\n let siteUrl = '';\n while (!siteUrl) {\n const input: string = await ask('Enter the site URL');\n try {\n new URL(input);\n siteUrl = input;\n } catch {\n console.log(` ${chalk.red('✗')} ${chalk.red('Invalid URL. Enter a valid URL (https://...)')}\\n`);\n }\n }\n console.log(` ${chalk.green('✓')} ${chalk.green('URL:')} ${chalk.underline(siteUrl)}\\n`);\n\n drawHeader('Step 2 : Platform');\n\n const detected = detectPlatform(siteUrl);\n let platformName: PlatformType;\n\n if (legacyMode) {\n console.log(` ${chalk.blue('i')} Auto-detected: ${chalk.hex('#D4A017')(detected.displayName)}`);\n const platformInput: string = await ask('Platform (framer/webflow/wix)', detected.name);\n platformName = (['framer', 'webflow', 'wix'].includes(platformInput)\n ? platformInput\n : detected.name) as PlatformType;\n console.log(` ${chalk.green('✓')} ${chalk.green('Platform:')} ${chalk.hex('#D4A017')(platformName)}\\n`);\n } else {\n rl.close();\n const platforms = [\n { label: `Framer${detected.name === 'framer' ? chalk.gray(' (detected)') : ''}`, value: 'framer' },\n { label: `Webflow${detected.name === 'webflow' ? chalk.gray(' (detected)') : ''}`, value: 'webflow' },\n { label: `Wix${detected.name === 'wix' ? chalk.gray(' (detected)') : ''}`, value: 'wix' },\n ];\n const defaultIdx = ['framer', 'webflow', 'wix'].indexOf(detected.name);\n platformName = await select('Select platform', platforms, Math.max(0, defaultIdx)) as PlatformType;\n }\n\n const rl2 = legacyMode ? rl : readline.createInterface({ input: stdin, output: stdout });\n\n const ask2 = async (question: string, defaultVal?: string): Promise<string> => {\n const suffix: string = defaultVal ? chalk.gray(` (${defaultVal})`) : '';\n const prompt: string = ` ${chalk.hex('#D4A017')('?')} ${chalk.white.bold(question)}${suffix} ${chalk.gray('>')} `;\n const answer: string = await rl2.question(prompt);\n return answer.trim() || defaultVal || '';\n };\n\n const derivedName: string = deriveOutputName(siteUrl, platformName);\n\n drawHeader('Step 3 : Output Directory');\n\n const outDir: string = await ask2('Output directory', './' + derivedName);\n console.log(` ${chalk.green('✓')} ${chalk.green('Output:')} ${chalk.yellow(outDir)}\\n`);\n\n drawHeader('Step 4 : Options');\n\n let prettyPrint: boolean;\n let concurrency: number;\n let includeSubpages: boolean;\n\n if (legacyMode) {\n const prettyAnswer: string = await ask2('Pretty-print JS files? (y/n)', 'y');\n prettyPrint = prettyAnswer.toLowerCase().startsWith('y');\n console.log(` ${chalk.green('✓')} Pretty-print: ${prettyPrint ? chalk.green('yes') : chalk.red('no')}\\n`);\n\n const subpagesAnswer: string = await ask2('Export sub-pages? (y/n)', 'n');\n includeSubpages = subpagesAnswer.toLowerCase().startsWith('y');\n console.log(` ${chalk.green('✓')} Sub-pages: ${includeSubpages ? chalk.green('yes') : chalk.red('no')}\\n`);\n\n const concurrencyAnswer: string = await ask2('Download concurrency', '12');\n concurrency = parseInt(concurrencyAnswer, 10) || 12;\n console.log(` ${chalk.green('✓')} Concurrency: ${chalk.yellow(String(concurrency))}\\n`);\n } else {\n rl2.close();\n const prettyVal = await select('Pretty-print JS files?', [\n { label: 'Yes', value: 'yes' },\n { label: 'No', value: 'no' },\n ]);\n prettyPrint = prettyVal === 'yes';\n\n const subpagesVal = await select('Export sub-pages?', [\n { label: 'No', value: 'no' },\n { label: 'Yes, crawl and export', value: 'yes' },\n ], 0);\n includeSubpages = subpagesVal === 'yes';\n\n const concurrencyVal = await select('Download concurrency', [\n { label: '6 (slow connection)', value: '6' },\n { label: '12 (default)', value: '12' },\n { label: '20 (fast connection)', value: '20' },\n ], 1);\n concurrency = parseInt(concurrencyVal, 10);\n }\n\n const w = maxWidth();\n const isSmall = w < 50;\n const G = chalk.hex('#C4953A');\n const B = chalk.hex('#8B6914');\n\n console.log('');\n if (!isSmall) {\n console.log(boxTop(w));\n console.log(boxLine(w, chalk.bold.white(' Summary')));\n } else {\n console.log(chalk.bold.white(' Summary:'));\n }\n\n for (const [label, value] of [\n ['URL', siteUrl],\n ['Platform', platformName],\n ['Output', path.resolve(outDir)],\n ['Pretty-print', prettyPrint ? 'yes' : 'no'],\n ['Sub-pages', includeSubpages ? 'yes' : 'no'],\n ['Concurrency', String(concurrency)],\n ]) {\n console.log(boxRow(w, label, value));\n }\n\n if (!isSmall) {\n console.log(boxBot(w));\n }\n console.log('');\n\n let startExport: boolean;\n\n if (legacyMode) {\n const confirm: string = await ask2('Start export? (y/n)', 'y');\n startExport = confirm.toLowerCase().startsWith('y');\n rl2.close();\n } else {\n const confirmVal = await select('Start export?', [\n { label: 'Yes, start now', value: 'yes' },\n { label: 'Cancel', value: 'no' },\n ]);\n startExport = confirmVal === 'yes';\n }\n\n if (!startExport) {\n console.log(`\\n ${chalk.yellow('Export cancelled.')}\\n`);\n return;\n }\n\n console.log('');\n\n const { CFG } = await import('../config/index.js');\n CFG.concurrency = concurrency;\n\n const exporter = new FramerExporter(siteUrl, path.resolve(outDir), platformName);\n exporter.prettyPrint = prettyPrint;\n await exporter.run(includeSubpages);\n}\n","import path from 'path';\nimport { URL } from 'url';\nimport pkg from '../../package.json';\nimport { showHelp } from './help.js';\nimport { showBanner } from './banner.js';\nimport { checkForUpdates } from './update-check.js';\nimport type { PlatformType } from '../platforms/types.js';\n\nconst VERSION = pkg.version;\n\nfunction extractFlag(args: string[], flag: string): string | null {\n const idx: number = args.indexOf(flag);\n if (idx === -1 || idx + 1 >= args.length) return null;\n const value: string = args[idx + 1];\n args.splice(idx, 2);\n return value;\n}\n\nfunction hasFlag(args: string[], flag: string): boolean {\n const idx: number = args.indexOf(flag);\n if (idx === -1) return false;\n args.splice(idx, 1);\n return true;\n}\n\nasync function main(): Promise<void> {\n const args: string[] = process.argv.slice(2);\n\n if (args.includes('--version') || args.includes('-v')) {\n console.log(VERSION);\n process.exit(0);\n }\n\n if (args.includes('--about')) {\n const chalk = (await import('chalk')).default;\n showBanner();\n console.log(` ${chalk.white.bold('Framer Export')} ${chalk.gray(`v${pkg.version}`)}`);\n console.log(` ${chalk.white(pkg.description)}\\n`);\n console.log(` ${chalk.white.bold('Author')} ${chalk.hex('#D4A017')('Dany (danbenba)')}`);\n console.log(` ${chalk.white.bold('Portfolio')} ${chalk.underline.hex('#D4A017')('https://github.com/danbenba')}`);\n console.log(` ${chalk.white.bold('GitHub')} ${chalk.underline.hex('#D4A017')(pkg.repository.url.replace('git+', '').replace('.git', ''))}`);\n console.log(` ${chalk.white.bold('npm')} ${chalk.underline.hex('#D4A017')(`https://www.npmjs.com/package/${pkg.name}`)}`);\n console.log(` ${chalk.white.bold('License')} ${chalk.green(pkg.license)}`);\n console.log(` ${chalk.white.bold('Node')} ${chalk.gray(`>=${pkg.engines.node}`)}`);\n console.log('');\n process.exit(0);\n }\n\n checkForUpdates(VERSION).then((latest) => {\n if (!latest) return;\n import('chalk').then((chalk) => {\n console.log('');\n console.log(\n ` ${chalk.default.yellow('↳')} Update available: ${chalk.default.gray(VERSION)} → ${chalk.default.green(latest)}`,\n );\n console.log(` ${chalk.default.hex('#D4A017')(' Run:')} ${chalk.default.hex('#B8860B')('npm i -g framer-export@latest')}`);\n console.log('');\n });\n });\n\n if (args.includes('--help') || args.includes('-h')) {\n showHelp();\n process.exit(0);\n }\n\n if (args.includes('--setup')) {\n hasFlag(args, '--setup');\n const legacyMode: boolean = hasFlag(args, '--legacy-mode');\n const { runSetup } = await import('./setup.js');\n await runSetup(legacyMode);\n return;\n }\n\n if (!args.length) {\n const { runSetup } = await import('./setup.js');\n await runSetup(false);\n return;\n }\n\n const platformOverride = extractFlag(args, '--platform') as PlatformType | null;\n const includeSubpages: boolean = hasFlag(args, '--subpages');\n\n showBanner();\n\n const url: string = args[0];\n\n try {\n new URL(url);\n } catch {\n const chalk = (await import('chalk')).default;\n console.log(` ${chalk.red('✗')} ${chalk.red.bold('Invalid URL:')} ${chalk.white(url)}`);\n console.log(` ${chalk.gray('Expected: https://yoursite.framer.app')}\\n`);\n process.exit(1);\n }\n\n const { FramerExporter, deriveOutputName } = await import('../exporter/index.js');\n const { detectPlatform } = await import('../platforms/index.js');\n\n const detected = platformOverride || detectPlatform(url).name;\n const defaultDir: string = deriveOutputName(url, detected as PlatformType);\n const out: string = args[1] || `./${defaultDir}`;\n\n try {\n await new FramerExporter(url, path.resolve(out), platformOverride || undefined).run(includeSubpages);\n } catch (e) {\n const chalk = (await import('chalk')).default;\n console.log(`\\n ${chalk.red('✗')} ${chalk.red.bold('FAILED:')} ${chalk.white((e as Error).message)}`);\n console.log(chalk.gray((e as Error).stack || ''));\n process.exit(1);\n }\n}\n\nmain();\n","import chalk from 'chalk';\nimport { showBanner } from './banner.js';\n\nexport function showHelp(): void {\n showBanner();\n\n console.log(chalk.white.bold(' USAGE\\n'));\n console.log(` ${chalk.hex('#D4A017')('framer-export')} ${chalk.yellow('<url>')} ${chalk.gray('[output-dir]')}`);\n console.log(` ${chalk.hex('#D4A017')('fexport')} ${chalk.yellow('<url>')} ${chalk.gray('[output-dir]')}`);\n\n console.log('');\n console.log(chalk.white.bold(' OPTIONS\\n'));\n\n const opts: Array<[string, string]> = [\n ['--setup', 'Launch the interactive setup assistant'],\n ['--platform <p>', 'Force platform: framer, webflow, wix'],\n ['--subpages', 'Crawl and export sub-pages'],\n ['--legacy-mode', 'Use text input instead of arrow selection'],\n ['--help, -h', 'Show this help message'],\n ];\n\n for (const [flag, desc] of opts) {\n console.log(` ${chalk.green(flag.padEnd(18))} ${chalk.white(desc)}`);\n }\n\n console.log('');\n console.log(chalk.white.bold(' SUPPORTED PLATFORMS\\n'));\n\n const platforms: Array<[string, string]> = [\n ['Framer', 'Auto-detected via .framer.app / .framer.website URLs'],\n ['Webflow', 'Auto-detected via .webflow.io URLs'],\n ['Wix', 'Auto-detected via .wixsite.com URLs + HTML analysis'],\n ];\n\n for (const [name, desc] of platforms) {\n console.log(` ${chalk.hex('#D4A017')(name.padEnd(12))} ${chalk.gray(desc)}`);\n }\n\n console.log('');\n console.log(chalk.white.bold(' EXAMPLES\\n'));\n console.log(` ${chalk.gray('$')} ${chalk.hex('#D4A017')('framer-export')} ${chalk.yellow('https://mysite.framer.app')}`);\n console.log(` ${chalk.gray('$')} ${chalk.hex('#D4A017')('framer-export')} ${chalk.yellow('https://mysite.webflow.io')}`);\n console.log(` ${chalk.gray('$')} ${chalk.hex('#D4A017')('framer-export')} ${chalk.yellow('https://user.wixsite.com/my-site')}`);\n console.log(` ${chalk.gray('$')} ${chalk.hex('#D4A017')('framer-export')} ${chalk.green('--platform webflow')} ${chalk.yellow('https://custom.com')}`);\n console.log(` ${chalk.gray('$')} ${chalk.hex('#D4A017')('framer-export')} ${chalk.green('--subpages')} ${chalk.yellow('https://mysite.com')}`);\n console.log(` ${chalk.gray('$')} ${chalk.hex('#D4A017')('framer-export')} ${chalk.green('--setup')}`);\n console.log(` ${chalk.gray('$')} ${chalk.hex('#D4A017')('framer-export')} ${chalk.green('--setup --legacy-mode')}`);\n console.log('');\n}\n","import https from 'https';\n\nexport async function checkForUpdates(currentVersion: string): Promise<string | null> {\n return new Promise((resolve) => {\n const req = https.get(\n 'https://registry.npmjs.org/framer-export/latest',\n { timeout: 3000 },\n (res) => {\n let data = '';\n res.on('data', (chunk) => (data += chunk));\n res.on('end', () => {\n try {\n const json = JSON.parse(data);\n const latest = json.version;\n if (!latest) return resolve(null);\n if (latest !== currentVersion) return resolve(latest);\n resolve(null);\n } catch {\n resolve(null);\n }\n });\n },\n );\n req.on('error', () => resolve(null));\n req.on('timeout', () => {\n req.destroy();\n resolve(null);\n });\n });\n}\n"],"mappings":";;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA,MACE,MAAQ;AAAA,MACR,SAAW;AAAA,MACX,aAAe;AAAA,MACf,MAAQ;AAAA,MACR,MAAQ;AAAA,MACR,OAAS;AAAA,MACT,KAAO;AAAA,QACL,iBAAiB;AAAA,QACjB,SAAW;AAAA,QACX,cAAgB;AAAA,MAClB;AAAA,MACA,OAAS;AAAA,QACP;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,MACA,SAAW;AAAA,QACT,OAAS;AAAA,QACT,KAAO;AAAA,QACP,OAAS;AAAA,QACT,WAAa;AAAA,QACb,QAAU;AAAA,QACV,gBAAkB;AAAA,QAClB,SAAW;AAAA,MACb;AAAA,MACA,UAAY;AAAA,QACV;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,MACA,YAAc;AAAA,QACZ,MAAQ;AAAA,QACR,KAAO;AAAA,MACT;AAAA,MACA,UAAY;AAAA,MACZ,MAAQ;AAAA,QACN,KAAO;AAAA,MACT;AAAA,MACA,SAAW;AAAA,MACX,QAAU;AAAA,MACV,SAAW;AAAA,QACT,MAAQ;AAAA,MACV;AAAA,MACA,cAAgB;AAAA,QACd,OAAS;AAAA,QACT,KAAO;AAAA,QACP,UAAY;AAAA,QACZ,WAAa;AAAA,QACb,oBAAoB;AAAA,MACtB;AAAA,MACA,iBAAmB;AAAA,QACjB,eAAe;AAAA,QACf,MAAQ;AAAA,QACR,KAAO;AAAA,QACP,YAAc;AAAA,MAChB;AAAA,IACF;AAAA;AAAA;;;ACjEA,OAAO,WAAW;AAGlB,SAAS,WAAmB;AAC1B,SAAO,QAAQ,OAAO,WAAW;AACnC;AAWO,SAAS,aAAmB;AACjC,QAAM,QAAQ,SAAS;AACvB,QAAM,UAAU,QAAQ;AAExB,MAAI,SAAS;AACX,YAAQ,IAAI;AAAA,IAAO,MAAM,IAAI,SAAS,EAAE,KAAK,UAAU,CAAC,IAAI,MAAM,KAAK,IAAI,gBAAI,OAAO,EAAE,CAAC,EAAE;AAC3F,YAAQ,IAAI,KAAK,MAAM,MAAM,KAAK,uCAAiC,CAAC;AAAA,CAAI;AACxE;AAAA,EACF;AAEA,QAAM,OAAO,MAAM,IAAI,SAAS,EAAE;AAClC,QAAM,OAAO,MAAM;AAEnB,UAAQ,IAAI,EAAE;AACd,YAAU,QAAQ,CAAC,SAAS;AAC1B,YAAQ,IAAI,OAAO,KAAK,IAAI,CAAC;AAAA,EAC/B,CAAC;AACD,UAAQ,IAAI,EAAE;AACd,UAAQ,IAAI,KAAK,KAAK,IAAI,gBAAI,OAAO,EAAE,CAAC,KAAK,MAAM,MAAM,KAAK,uCAAiC,CAAC;AAAA,CAAI;AACtG;AAnCA,IAOM;AAPN;AAAA;AAAA;AACA;AAMA,IAAM,YAAY;AAAA,MAChB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA;AAAA;;;ACdA,OAAO,UAAU;AACjB,OAAO,YAAY;AACnB,SAAS,OAAAA,YAAW;AAFpB,IASa;AATb;AAAA;AAAA;AASO,IAAM,WAAN,MAAe;AAAA,MACpB,UAAmC,oBAAI,IAAI;AAAA,MAC3C,UAA+B,oBAAI,IAAI;AAAA,MAEvC,aAAa,QAAgB,UAA2C;AACtE,YAAI,KAAK,QAAQ,IAAI,MAAM,EAAG,QAAO,KAAK,QAAQ,IAAI,MAAM,EAAG;AAE/D,YAAI;AACJ,YAAI;AACF,mBAAS,IAAIA,KAAI,MAAM;AAAA,QACzB,QAAQ;AACN,iBAAO;AAAA,QACT;AAEA,cAAM,OAAe,OAAO;AAC5B,cAAM,WAAmB,OAAO;AAChC,cAAM,MAAc,KAAK,QAAQ,SAAS,MAAM,GAAG,EAAE,CAAC,CAAC,EAAE,YAAY;AAErE,YAAI,MAAqB;AAEzB,YAAI,UAAU;AACZ,gBAAM,SAAS,YAAY,MAAM,UAAU,GAAG;AAAA,QAChD;AAEA,YAAI,CAAC,KAAK;AACR,gBAAM,KAAK,YAAY,MAAM,GAAG;AAAA,QAClC;AAEA,YAAI;AACJ,cAAM,WAAmB,KAAK,SAAS,SAAS,MAAM,GAAG,EAAE,CAAC,CAAC;AAC7D,cAAM,OAAe,OAAO,WAAW,KAAK,EAAE,OAAO,MAAM,EAAE,OAAO,KAAK,EAAE,MAAM,GAAG,CAAC;AAErF,YAAI,YAAY,SAAS,SAAS,KAAK,aAAa,KAAK;AACvD,gBAAM,QAAgB,SAAS,QAAQ,oBAAoB,GAAG;AAC9D,qBAAW,MAAM,SAAS,GAAG,IAAI,QAAQ,GAAG,KAAK,IAAI,IAAI;AAAA,QAC3D,OAAO;AACL,qBAAW,SAAS,IAAI,GAAG,OAAO,EAAE;AAAA,QACtC;AAEA,YAAI,QAAQ,UAAU,QAAQ,OAAO;AACnC,qBAAW,SAAS,QAAQ,oBAAoB,GAAG;AAAA,QACrD;AAEA,cAAM,YAAoB,GAAG,GAAG,IAAI,QAAQ;AAC5C,aAAK,QAAQ,IAAI,QAAQ,EAAE,UAAU,CAAC;AAEtC,cAAM,OAAe,OAAO,MAAM,GAAG,EAAE,CAAC;AACxC,YAAI,SAAS,UAAU,CAAC,KAAK,QAAQ,IAAI,IAAI,GAAG;AAC9C,eAAK,QAAQ,IAAI,MAAM,EAAE,UAAU,CAAC;AAAA,QACtC;AAEA,eAAO;AAAA,MACT;AAAA,MAEA,QAAQ,MAAc,UAAkB,IAAY;AAClD,cAAM,SAAS,CAAC,GAAG,KAAK,QAAQ,QAAQ,CAAC,EAAE,KAAK,CAAC,GAAG,MAAM,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,MAAM;AACnF,YAAI,MAAc;AAClB,mBAAW,CAAC,KAAK,EAAE,UAAU,CAAC,KAAK,QAAQ;AACzC,gBAAM,MAAc,UAAU,KAAK,MAAM,SAAS,SAAS,SAAS,IAAI;AACxE,gBAAM,IAAI,MAAM,GAAG,EAAE,KAAK,GAAG;AAC7B,cAAI,IAAI,SAAS,GAAG,GAAG;AACrB,kBAAM,IAAI,MAAM,IAAI,QAAQ,MAAM,OAAO,CAAC,EAAE,KAAK,GAAG;AAAA,UACtD;AAAA,QACF;AACA,eAAO;AAAA,MACT;AAAA,MAEQ,YAAY,MAAc,KAAqB;AACrD,YAAI,KAAK,SAAS,mBAAmB,KAAK,KAAK,SAAS,sBAAsB,GAAG;AAC/E,iBAAO;AAAA,QACT;AACA,eAAO,QAAQ,UAAU,QAAQ,QAAQ,mBAAmB;AAAA,MAC9D;AAAA,IACF;AAAA;AAAA;;;AClFA;AAAA;AAAA;AAAA;AAAA,IAEa;AAFb;AAAA;AAAA;AAEO,IAAM,MAAc;AAAA,MACzB,UAAU,EAAE,OAAO,MAAM,QAAQ,IAAI;AAAA,MACrC,SAAS;AAAA,MACT,YAAY;AAAA,MACZ,aAAa;AAAA,MACb,aAAa;AAAA,MACb,SAAS;AAAA,MACT,WAAW;AAAA,MACX,oBAAoB;AAAA,QAClB;AAAA,QAAa;AAAA,QAA4B;AAAA,QACzC;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAAA;AAAA;;;ACfA,OAAOC,YAAW;AAClB,OAAO,UAAU;AACjB,SAAS,OAAAC,YAAW;AAGb,SAAS,SAAS,KAAa,UAAkB,IAAI,SAA0B;AACpF,SAAO,IAAI,QAAQ,CAAC,SAAS,WAAW;AACtC,UAAM,QAAQ,IAAI,WAAW,OAAO,IAAID,SAAQ;AAChD,UAAM,KAAK,CAAC,SAAuB;AACjC,YAAM,MAAM,MAAM,IAAI,KAAK,EAAE,SAAS,IAAI,UAAU,GAAG,CAAC,QAAQ;AAC9D,YAAI,IAAI,cAAe,OAAO,IAAI,aAAc,OAAO,IAAI,QAAQ,UAAU;AAC3E,iBAAO,SAAS,IAAIC,KAAI,IAAI,QAAQ,UAAU,GAAG,EAAE,MAAM,IAAI,EAAE,KAAK,SAAS,MAAM;AAAA,QACrF;AACA,YAAI,IAAI,eAAe,KAAK;AAC1B,iBAAO,OAAO,IACV,WAAW,MAAM,GAAG,OAAO,CAAC,GAAG,GAAG,IAClC,OAAO,IAAI,MAAM,QAAQ,IAAI,UAAU,EAAE,CAAC;AAAA,QAChD;AACA,cAAM,KAAe,CAAC;AACtB,YAAI,GAAG,QAAQ,CAAC,MAAc,GAAG,KAAK,CAAC,CAAC;AACxC,YAAI,GAAG,OAAO,MAAM,QAAQ,OAAO,OAAO,EAAE,CAAC,CAAC;AAC9C,YAAI,GAAG,SAAS,CAAC,MAAc,OAAO,IAAI,WAAW,MAAM,GAAG,OAAO,CAAC,GAAG,GAAG,IAAI,OAAO,CAAC,CAAE;AAAA,MAC5F,CAAC;AACD,UAAI,GAAG,SAAS,CAAC,MAAc,OAAO,IAAI,WAAW,MAAM,GAAG,OAAO,CAAC,GAAG,GAAG,IAAI,OAAO,CAAC,CAAE;AAC1F,UAAI,GAAG,WAAW,MAAM;AACtB,YAAI,QAAQ;AACZ,eAAO,IAAI,WAAW,MAAM,GAAG,OAAO,CAAC,GAAG,GAAG,IAAI,OAAO,IAAI,MAAM,SAAS,CAAC;AAAA,MAC9E,CAAC;AAAA,IACH;AACA,OAAG,OAAO;AAAA,EACZ,CAAC;AACH;AA/BA;AAAA;AAAA;AAGA;AAAA;AAAA;;;ACHA,OAAOC,YAAW;AAKX,SAAS,WAAW,SAAsC;AAC/D,aAAW;AACb;AAIA,SAAS,MAAM,MAAc,KAAqB;AAChD,MAAI,KAAK,UAAU,IAAK,QAAO;AAC/B,SAAO,KAAK,MAAM,GAAG,MAAM,CAAC,IAAI;AAClC;AAEA,SAAS,OAAO,MAAoB;AAClC,MAAI,SAAU,UAAS,IAAI,IAAI;AAAA,MAC1B,SAAQ,IAAI,IAAI;AACvB;AAnBA,IAGI,UAME,GAYA,aAcF,KAES,KAMP,cAQF,KAES,MAMA,MAaA;AAxEb;AAAA;AAAA;AAGA,IAAI,WAAkC;AAMtC,IAAM,IAAI,OAAc,oBAAI,KAAK,GAAE,YAAY,EAAE,MAAM,IAAI,EAAE;AAY7D,IAAM,cAA4C;AAAA,MAChD,CAAC,MAAMA,OAAM,IAAI,SAAS,EAAE,CAAC;AAAA,MAC7B,CAAC,MAAMA,OAAM,IAAI,SAAS,EAAE,CAAC;AAAA,MAC7B,CAAC,MAAMA,OAAM,IAAI,SAAS,EAAE,CAAC;AAAA,MAC7B,CAAC,MAAMA,OAAM,IAAI,SAAS,EAAE,CAAC;AAAA,MAC7B,CAAC,MAAMA,OAAM,IAAI,SAAS,EAAE,CAAC;AAAA,MAC7B,CAAC,MAAMA,OAAM,IAAI,SAAS,EAAE,CAAC;AAAA,MAC7B,CAAC,MAAMA,OAAM,IAAI,SAAS,EAAE,CAAC;AAAA,MAC7B,CAAC,MAAMA,OAAM,IAAI,SAAS,EAAE,CAAC;AAAA,MAC7B,CAAC,MAAMA,OAAM,IAAI,SAAS,EAAE,CAAC;AAAA,MAC7B,CAAC,MAAMA,OAAM,IAAI,SAAS,EAAE,CAAC;AAAA,MAC7B,CAAC,MAAMA,OAAM,IAAI,SAAS,EAAE,CAAC;AAAA,MAC7B,CAAC,MAAMA,OAAM,IAAI,SAAS,EAAE,CAAC;AAAA,IAC/B;AACA,IAAI,MAAM;AAEH,IAAM,MAAM,CAAC,MAAoB;AACtC;AACA,YAAM,IAAI,YAAY,MAAM,YAAY,MAAM;AAC9C,aAAO,GAAGA,OAAM,IAAI,SAAS,EAAE,IAAI,EAAE,CAAC,GAAG,CAAC,IAAIA,OAAM,IAAI,SAAS,EAAE,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,GAAG,CAAC,CAAC,EAAE;AAAA,IACnG;AAEA,IAAM,eAA6C;AAAA,MACjD,CAAC,MAAMA,OAAM,IAAI,SAAS,EAAE,CAAC;AAAA,MAC7B,CAAC,MAAMA,OAAM,IAAI,SAAS,EAAE,CAAC;AAAA,MAC7B,CAAC,MAAMA,OAAM,IAAI,SAAS,EAAE,CAAC;AAAA,MAC7B,CAAC,MAAMA,OAAM,IAAI,SAAS,EAAE,CAAC;AAAA,MAC7B,CAAC,MAAMA,OAAM,IAAI,SAAS,EAAE,CAAC;AAAA,MAC7B,CAAC,MAAMA,OAAM,IAAI,SAAS,EAAE,CAAC;AAAA,IAC/B;AACA,IAAI,MAAM;AAEH,IAAM,OAAO,CAAC,MAAoB;AACvC;AACA,YAAM,IAAI,aAAa,MAAM,aAAa,MAAM;AAChD,aAAO,GAAGA,OAAM,IAAI,SAAS,EAAE,IAAI,EAAE,CAAC,GAAG,CAAC,IAAIA,OAAM,IAAI,SAAS,EAAE,KAAK,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,GAAG,CAAC,CAAC,EAAE;AAAA,IACzG;AAEO,IAAM,OAAO,CAAC,MAAoB;AACvC,YAAM,SAAuC;AAAA,QAC3C,CAAC,MAAMA,OAAM,IAAI,SAAS,EAAE,CAAC;AAAA,QAC7B,CAAC,MAAMA,OAAM,IAAI,SAAS,EAAE,CAAC;AAAA,QAC7B,CAAC,MAAMA,OAAM,IAAI,SAAS,EAAE,CAAC;AAAA,QAC7B,CAAC,MAAMA,OAAM,IAAI,SAAS,EAAE,CAAC;AAAA,MAC/B;AACA,YAAM,IAAI,OAAO,KAAK,MAAM,KAAK,OAAO,IAAI,OAAO,MAAM,CAAC;AAC1D,YAAM,OAAO,GAAGA,OAAM,IAAI,SAAS,EAAE,IAAI,EAAE,CAAC,GAAG,CAAC,IAAIA,OAAM,IAAI,SAAS,EAAE,KAAK,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,GAAG,CAAC,CAAC;AAC3G,UAAI,SAAU,UAAS,IAAI,IAAI;AAAA,UAC1B,SAAQ,KAAK,IAAI;AAAA,IACxB;AAEO,IAAM,UAAU,CAAC,MAAoB;AAC1C,YAAM,SAAuC;AAAA,QAC3C,CAAC,MAAMA,OAAM,IAAI,SAAS,EAAE,CAAC;AAAA,QAC7B,CAAC,MAAMA,OAAM,IAAI,SAAS,EAAE,CAAC;AAAA,QAC7B,CAAC,MAAMA,OAAM,IAAI,SAAS,EAAE,CAAC;AAAA,QAC7B,CAAC,MAAMA,OAAM,IAAI,SAAS,EAAE,CAAC;AAAA,QAC7B,CAAC,MAAMA,OAAM,IAAI,SAAS,EAAE,CAAC;AAAA,MAC/B;AACA,YAAM,IAAI,OAAO,KAAK,MAAM,KAAK,OAAO,IAAI,OAAO,MAAM,CAAC;AAC1D,aAAO,GAAGA,OAAM,IAAI,SAAS,EAAE,IAAI,EAAE,CAAC,GAAG,CAAC,IAAIA,OAAM,YAAY,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,GAAG,CAAC,CAAC,EAAE;AAAA,IAC/F;AAAA;AAAA;;;AClFA,IAEM,WAEO;AAJb;AAAA;AAAA;AAEA,IAAM,YAAsB,CAAC,UAAU,SAAS,QAAQ,MAAM;AAEvD,IAAM,SAA0B;AAAA,MACrC,MAAM;AAAA,MACN,aAAa;AAAA,MAEb,YAAY,KAAsB;AAChC,eAAO,4CAA4C,KAAK,GAAG;AAAA,MAC7D;AAAA,MAEA,aAAa,MAAuB;AAClC,eACE,KAAK,SAAS,WAAW,MACxB,KAAK,SAAS,kBAAkB,KAAK,KAAK,SAAS,uBAAuB;AAAA,MAE/E;AAAA,MAEA,cAAc,CAAC,qBAAqB,kBAAkB,6BAA6B;AAAA,MAEnF,gBAAgB;AAAA,QACd;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,MAEA,eAAe;AAAA,QACb;AAAA,QACA;AAAA,MACF;AAAA,MAEA,kBAAkB;AAAA,MAClB,qBAAqB;AAAA,MAErB,YAAY,MAAc,UAAkB,KAA4B;AACtE,YAAI,KAAK,SAAS,uBAAuB,GAAG;AAC1C,cAAI,SAAS,WAAW,UAAU,EAAG,QAAO;AAC5C,cAAI,SAAS,WAAW,UAAU,GAAG;AACnC,mBAAO,UAAU,SAAS,GAAG,IAAI,iBAAiB;AAAA,UACpD;AACA,cAAI,SAAS,WAAW,SAAS,GAAG;AAClC,gBAAI,QAAQ,UAAU,QAAQ,MAAO,QAAO;AAC5C,gBAAI,QAAQ,QAAS,QAAO;AAC5B,gBAAI,QAAQ,OAAQ,QAAO;AAC3B,gBAAI,QAAQ,aAAc,QAAO;AACjC,mBAAO;AAAA,UACT;AACA,cAAI,SAAS,WAAW,WAAW,GAAG;AACpC,mBAAO,QAAQ,eAAe,SAAS;AAAA,UACzC;AACA,iBAAO;AAAA,QACT;AAEA,YAAI,KAAK,SAAS,sBAAsB,GAAG;AACzC,cAAI,QAAQ,OAAQ,QAAO;AAC3B,cAAI,QAAQ,UAAU,QAAQ,MAAO,QAAO;AAC5C,cAAI,QAAQ,YAAY,QAAQ,QAAS,QAAO;AAChD,cAAI,QAAQ,UAAU,QAAQ,OAAQ,QAAO;AAC7C,iBAAO;AAAA,QACT;AAEA,YAAI,KAAK,SAAS,kBAAkB,KAAK,KAAK,SAAS,YAAY,GAAG;AACpE,cAAI,QAAQ,UAAU,QAAQ,MAAO,QAAO;AAC5C,cAAI,QAAQ,OAAQ,QAAO;AAC3B,iBAAO;AAAA,QACT;AAEA,eAAO;AAAA,MACT;AAAA,IACF;AAAA;AAAA;;;ACxEA,IAEM,UACAC,YACA,YAEO;AANb;AAAA;AAAA;AAEA,IAAM,WAAqB,CAAC,QAAQ,SAAS,QAAQ,QAAQ,QAAQ,SAAS,OAAO;AACrF,IAAMA,aAAsB,CAAC,UAAU,SAAS,QAAQ,QAAQ,MAAM;AACtE,IAAM,aAAuB,CAAC,QAAQ,SAAS,MAAM;AAE9C,IAAM,UAA2B;AAAA,MACtC,MAAM;AAAA,MACN,aAAa;AAAA,MAEb,YAAY,KAAsB;AAChC,eAAO,sBAAsB,KAAK,GAAG;AAAA,MACvC;AAAA,MAEA,aAAa,MAAuB;AAClC,eACE,KAAK,SAAS,cAAc,KAC5B,KAAK,SAAS,iBAAiB,KAC/B,KAAK,SAAS,SAAS,KACvB,KAAK,SAAS,YAAY;AAAA,MAE9B;AAAA,MAEA,cAAc,CAAC,yBAAyB,yBAAyB,iBAAiB;AAAA,MAElF,gBAAgB,CAAC,oBAAoB,yBAAyB;AAAA,MAE9D,eAAe;AAAA,QACb;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,MAEA,kBAAkB;AAAA,MAClB,qBAAqB;AAAA,MAErB,YAAY,MAAc,UAAkB,KAA4B;AACtE,YACE,KAAK,SAAS,mBAAmB,KACjC,KAAK,SAAS,aAAa,KAC3B,KAAK,SAAS,yBAAyB,GACvC;AACA,cAAI,WAAW,SAAS,GAAG,EAAG,QAAO;AACrC,cAAI,SAAS,SAAS,UAAU,KAAK,SAAS,SAAS,GAAG,EAAG,QAAO;AACpE,cAAI,SAAS,SAAS,OAAO,KAAK,QAAQ,OAAQ,QAAO;AACzD,cAAI,SAAS,SAAS,MAAM,KAAK,QAAQ,MAAO,QAAO;AACvD,cAAI,SAAS,SAAS,QAAQ,KAAK,SAAS,SAAS,WAAW,EAAG,QAAO;AAC1E,cAAIA,WAAU,SAAS,GAAG,EAAG,QAAO;AACpC,iBAAO;AAAA,QACT;AAEA,YAAI,KAAK,SAAS,+BAA+B,GAAG;AAClD,cAAI,QAAQ,MAAO,QAAO;AAC1B,cAAI,QAAQ,OAAQ,QAAO;AAC3B,cAAI,SAAS,SAAS,GAAG,EAAG,QAAO;AACnC,iBAAO;AAAA,QACT;AAEA,eAAO;AAAA,MACT;AAAA,IACF;AAAA;AAAA;;;ACnEA,IAEMC,WACAC,YACAC,aAEO;AANb;AAAA;AAAA;AAEA,IAAMF,YAAqB,CAAC,QAAQ,SAAS,QAAQ,QAAQ,QAAQ,SAAS,SAAS,MAAM;AAC7F,IAAMC,aAAsB,CAAC,UAAU,SAAS,QAAQ,QAAQ,MAAM;AACtE,IAAMC,cAAuB,CAAC,QAAQ,SAAS,MAAM;AAE9C,IAAM,MAAuB;AAAA,MAClC,MAAM;AAAA,MACN,aAAa;AAAA,MAEb,YAAY,KAAsB;AAChC,eAAO,4BAA4B,KAAK,GAAG;AAAA,MAC7C;AAAA,MAEA,aAAa,MAAuB;AAClC,eACE,KAAK,SAAS,kBAAkB,KAChC,KAAK,SAAS,cAAc,KAC5B,KAAK,SAAS,QAAQ,KACtB,KAAK,SAAS,SAAS,KACvB,KAAK,SAAS,aAAa,KAC3B,KAAK,SAAS,UAAU,KACxB,KAAK,SAAS,UAAU,KACxB,KAAK,SAAS,SAAS,KACvB,eAAe,KAAK,IAAI,KACxB,mEAAmE,KAAK,IAAI,KAC5E,SAAS,KAAK,IAAI,KAClB,YAAY,KAAK,IAAI;AAAA,MAEzB;AAAA,MAEA,cAAc;AAAA,QACZ;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,MAEA,gBAAgB,CAAC,YAAY,YAAY,cAAc,gBAAgB;AAAA,MAEvE,eAAe;AAAA,QACb;AAAA,MACF;AAAA,MAEA,kBAAkB;AAAA,MAClB,qBAAqB;AAAA,MAErB,YAAY,MAAc,UAAkB,KAA4B;AACtE,YAAI,SAAS,uBAAuB;AAClC,iBAAO;AAAA,QACT;AAEA,YAAI,KAAK,SAAS,eAAe,GAAG;AAClC,cAAIA,YAAW,SAAS,GAAG,EAAG,QAAO;AACrC,cAAI,SAAS,SAAS,UAAU,KAAKF,UAAS,SAAS,GAAG,EAAG,QAAO;AACpE,cAAI,QAAQ,OAAQ,QAAO;AAC3B,cAAI,QAAQ,MAAO,QAAO;AAC1B,cAAIC,WAAU,SAAS,GAAG,EAAG,QAAO;AACpC,iBAAO;AAAA,QACT;AAEA,YAAI,KAAK,SAAS,iBAAiB,GAAG;AACpC,cAAI,QAAQ,MAAO,QAAO;AAC1B,cAAI,QAAQ,OAAQ,QAAO;AAC3B,cAAIA,WAAU,SAAS,GAAG,EAAG,QAAO;AACpC,cAAID,UAAS,SAAS,GAAG,EAAG,QAAO;AACnC,iBAAO;AAAA,QACT;AAEA,eAAO;AAAA,MACT;AAAA,IACF;AAAA;AAAA;;;AChEO,SAAS,YAAY,KAAqC;AAC/D,aAAW,YAAY,eAAe;AACpC,QAAI,SAAS,YAAY,GAAG,EAAG,QAAO;AAAA,EACxC;AACA,SAAO;AACT;AAEO,SAAS,aAAa,MAAsC;AACjE,aAAW,YAAY,eAAe;AACpC,QAAI,SAAS,aAAa,IAAI,EAAG,QAAO;AAAA,EAC1C;AACA,SAAO;AACT;AAEO,SAAS,eAAe,KAAa,MAAgC;AAC1E,QAAM,QAAQ,YAAY,GAAG;AAC7B,MAAI,MAAO,QAAO;AAElB,MAAI,MAAM;AACR,UAAM,SAAS,aAAa,IAAI;AAChC,QAAI,OAAQ,QAAO;AAAA,EACrB;AAEA,SAAO;AACT;AAEA,eAAsB,YAAY,MAA6C;AAC7E,MAAI;AACF,UAAM,SAAiB,MAAM,KAAK,SAAS,MAAM;AAC/C,YAAM,OAAe,SAAS,gBAAgB,aAAa;AAE3D,UAAI,mCAAmC,KAAK,IAAI,EAAG,QAAO;AAC1D,UAAI,wCAAwC,KAAK,IAAI,EAAG,QAAO;AAC/D,UAAI,+CAA+C,KAAK,IAAI,EAAG,QAAO;AAEtE,YAAM,OAAiB,CAAC;AACxB,YAAM,UAAyC,SAAS,iBAAiB,aAAa;AACtF,cAAQ,QAAQ,CAAC,MAAM;AAAE,YAAI,EAAE,IAAK,MAAK,KAAK,EAAE,GAAG;AAAA,MAAG,CAAC;AACvD,YAAM,UAAkB,KAAK,KAAK,GAAG;AACrC,UAAI,kCAAkC,KAAK,OAAO,EAAG,QAAO;AAC5D,UAAI,kCAAkC,KAAK,OAAO,EAAG,QAAO;AAC5D,UAAI,uDAAuD,KAAK,OAAO,EAAG,QAAO;AAEjF,aAAO;AAAA,IACT,CAAC;AAED,QAAI,WAAW,MAAO,QAAO;AAC7B,QAAI,WAAW,UAAW,QAAO;AACjC,QAAI,WAAW,SAAU,QAAO;AAAA,EAClC,QAAQ;AAAA,EAAC;AACT,SAAO;AACT;AAEO,SAAS,kBAAkB,MAAqC;AACrE,QAAM,MAAuC,EAAE,QAAQ,SAAS,IAAI;AACpE,SAAO,IAAI,IAAI,KAAK;AACtB;AAhEA,IAMM;AANN;AAAA;AAAA;AAEA;AACA;AACA;AAEA,IAAM,gBAAmC,CAAC,QAAQ,SAAS,GAAG;AAAA;AAAA;;;ACN9D;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA;AACA;AACA;AACA;AAAA;AAAA;;;ACJA,OAAO,eAA8B;AAMrC,eAAsB,iBAAiB,UAA0C;AAC/E,WAAS,SAAS,OAAO,sBAAsB;AAC/C,MAAI,gCAAgC;AAEpC,WAAS,UAAU,MAAM,UAAU,OAAO;AAAA,IACxC,UAAU;AAAA,IACV,MAAM,CAAC,gBAAgB,0BAA0B;AAAA,EACnD,CAAC;AACD,UAAQ,mBAAmB;AAE3B,WAAS,OAAO,MAAM,SAAS,QAAQ,QAAQ;AAC/C,QAAM,SAAS,KAAK,YAAY,IAAI,QAAQ;AAC5C,MAAI,qBAAqB,IAAI,SAAS,QAAQ,MAAM,IAAI,SAAS,MAAM;AAEvE,QAAM,SAAS,KAAK;AAAA,IAClB;AAAA,EAEF;AACA,MAAI,8BAA8B;AAElC,QAAM,kBAA4B;AAAA,IAChC,GAAG,IAAI;AAAA,IACP,GAAG,SAAS,SAAS;AAAA,EACvB;AACA,MAAI,cAAc,gBAAgB,SAAS,oBAAoB;AAC/D,aAAW,UAAU,iBAAiB;AACpC,QAAI,SAAS,MAAM;AAAA,EACrB;AAEA,MAAI,cAAc;AAClB,MAAI,UAAU;AAEd,WAAS,KAAK,GAAG,YAAY,OAAO,QAAQ;AAC1C,UAAM,MAAc,IAAI,IAAI;AAC5B,QAAI,IAAI,WAAW,OAAO,KAAK,IAAI,WAAW,OAAO,EAAG;AAExD,QAAI;AACF,YAAM,OAAe,IAAI,IAAI,GAAG,EAAE;AAClC,UAAI,gBAAgB,KAAK,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,GAAG;AACjD;AACA;AAAA,MACF;AAAA,IACF,QAAQ;AACN;AAAA,IACF;AAEA,aAAS,OAAO,aAAa,KAAK,SAAS,QAAQ;AACnD,QAAI;AACF,eAAS,OAAO,QAAQ,IAAI,KAAK,MAAM,IAAI,OAAO,CAAC;AACnD;AAAA,IACF,QAAQ;AAAA,IAAC;AAAA,EACX,CAAC;AAED,MAAI,8BAA8B;AAElC,WAAS,SAAS,OAAO,uBAAuB;AAChD,OAAK,mBAAmB,SAAS,OAAO;AACxC,QAAM,SAAS,KAAK,KAAK,SAAS,SAAS;AAAA,IACzC,WAAW;AAAA,IACX,SAAS,IAAI;AAAA,EACf,CAAC;AACD,UAAQ,4BAA4B;AACpC,MAAI,iBAAiB,cAAc,yBAAyB,UAAU,oBAAoB;AAE1F,MAAI,0CAA0C;AAC9C,QAAM,cAAc,MAAM,YAAY,SAAS,IAAI;AACnD,MAAI,eAAe,YAAY,SAAS,SAAS,SAAS,MAAM;AAC9D,QAAI,gCAAgC,YAAY,cAAc,iBAAiB,SAAS,SAAS,OAAO,GAAG;AAC3G,aAAS,WAAW;AAAA,EACtB;AAEA,WAAS,SAAS,OAAO,iBAAiB,SAAS,SAAS,cAAc,eAAe;AAEzF,MAAI,SAAS,SAAS,qBAAqB;AACzC,QAAI,yCAAyC;AAC7C,QAAI,wBAAwB,SAAS,SAAS,mBAAmB,IAAI;AACrE,UAAM,UAAU,SAAS,SAAS;AAClC,UAAM,SAAS,KAAK,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,0CAMS,OAAO;AAAA;AAAA;AAAA;AAAA;AAAA,KAK5C;AACD,YAAQ,mCAAmC;AAAA,EAC7C,OAAO;AACL,QAAI,mCAAmC,SAAS,SAAS,mBAAmB,kBAAkB;AAC9F,UAAM,IAAI,QAAc,CAAC,MAAM,WAAW,GAAG,SAAS,SAAS,gBAAgB,CAAC;AAChF,YAAQ,SAAS,SAAS,cAAc,gBAAgB;AAAA,EAC1D;AAEA,WAAS,SAAS,OAAO,mBAAmB;AAC5C,MAAI,sCAAsC,IAAI,aAAa,gBAAgB,IAAI,cAAc,KAAK;AAElG,QAAM,aAAa,IAAI;AACvB,QAAM,cAAc,IAAI;AAExB,QAAM,aAAqB,MAAM,SAAS,KAAK,SAAS;AAAA;AAAA,GAEvD;AACD,MAAI,kBAAkB,aAAa,SAAS,KAAK,KAAK,aAAa,UAAU,IAAI,gBAAgB;AAEjG,QAAM,SAAS,KAAK,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA,eAKhB,UAAU;AAAA;AAAA,2CAEkB,WAAW;AAAA;AAAA;AAAA;AAAA,GAInD;AACD,UAAQ,2BAA2B;AAEnC,WAAS,SAAS,OAAO,+BAA+B;AACxD,MAAI,yCAAyC;AAC7C,QAAM,IAAI,QAAc,CAAC,MAAM,WAAW,GAAG,GAAI,CAAC;AAElD,MAAI,mDAAmD;AACvD,MAAI;AACF,UAAM,SAAS,KAAK,mBAAmB,EAAE,UAAU,MAAM,SAAS,IAAK,CAAC;AACxE,YAAQ,wBAAwB;AAAA,EAClC,QAAQ;AACN,QAAI,kDAAkD;AAAA,EACxD;AAEA,QAAM,gBAAwB,SAAS,OAAO,QAAQ;AACtD,UAAQ,cAAc,gBAAgB,0BAA0B;AAEhE,QAAM,WAAmB,CAAC,GAAG,SAAS,OAAO,QAAQ,OAAO,CAAC,EAAE,OAAO,CAAC,MAAM,EAAE,UAAU,SAAS,MAAM,CAAC,EAAE;AAC3G,QAAM,UAAkB,CAAC,GAAG,SAAS,OAAO,QAAQ,OAAO,CAAC,EAAE,OAAO,CAAC,MAAM,EAAE,UAAU,SAAS,KAAK,KAAK,EAAE,UAAU,SAAS,MAAM,CAAC,EAAE;AACzI,QAAM,WAAmB,CAAC,GAAG,SAAS,OAAO,QAAQ,OAAO,CAAC,EAAE,OAAO,CAAC,MAAM,EAAE,UAAU,WAAW,eAAe,CAAC,EAAE;AACtH,QAAM,YAAoB,CAAC,GAAG,SAAS,OAAO,QAAQ,OAAO,CAAC,EAAE,OAAO,CAAC,MAAM,EAAE,UAAU,WAAW,cAAc,CAAC,EAAE;AACtH,MAAI,YAAY,WAAW,YAAY,UAAU,gBAAgB,WAAW,eAAe,SAAS;AACtG;AAEA,eAAsB,aAAa,UAA0E;AAC3G,MAAI,SAAS,SAAS;AACpB,UAAM,SAAS,QAAQ,MAAM;AAC7B,aAAS,UAAU;AACnB,QAAI,gBAAgB;AAAA,EACtB;AACF;AAEA,eAAsB,eACpB,MACA,KACA,UACiB;AACjB,MAAI,+BAA+B,GAAG;AACtC,QAAM,KAAK,KAAK,KAAK,EAAE,WAAW,gBAAgB,SAAS,IAAI,QAAQ,CAAC;AAExE,MAAI,SAAS,qBAAqB;AAChC,UAAM,KAAK;AAAA,MACT;AAAA;AAAA;AAAA;AAAA;AAAA,sCAKgC,SAAS,gBAAgB;AAAA;AAAA;AAAA;AAAA,IAI3D;AAAA,EACF,OAAO;AACL,UAAM,IAAI,QAAc,CAAC,MAAM,WAAW,GAAG,GAAI,CAAC;AAAA,EACpD;AAEA,QAAM,OAAe,MAAM,KAAK,SAAS,MAAM,SAAS,gBAAgB,aAAa,SAAS,KAAK,SAAS;AAC5G,MAAI,0BAA0B,KAAK,SAAS,MAAM,QAAQ,CAAC,IAAI,KAAK;AACpE,SAAO;AACT;AAxLA;AAAA;AAAA;AACA;AACA;AACA;AAAA;AAAA;;;ACHA,eAAsB,KAAK,OAAmC,GAA0B;AACtF,MAAI,IAAI;AACR,QAAM,MAAM,YAA2B;AACrC,WAAO,IAAI,MAAM,QAAQ;AACvB,YAAM,IAAI;AACV,YAAM,MAAM,CAAC,EAAE;AAAA,IACjB;AAAA,EACF;AACA,QAAM,QAAQ,IAAI,MAAM,KAAK,EAAE,QAAQ,KAAK,IAAI,GAAG,MAAM,MAAM,EAAE,GAAG,MAAM,IAAI,CAAC,CAAC;AAClF;AATA;AAAA;AAAA;AAAA;AAAA;;;ACAA,OAAO,QAAQ;AACf,OAAOG,WAAU;AAOjB,eAAsB,YAAY,UAA0C;AAC1E,QAAM,OAAoB,oBAAI,IAAI;AAClC,QAAM,aAAwD,CAAC;AAC/D,aAAW,CAAC,KAAK,EAAE,UAAU,CAAC,KAAK,SAAS,OAAO,SAAS;AAC1D,QAAI,KAAK,IAAI,SAAS,EAAG;AACzB,SAAK,IAAI,SAAS;AAClB,eAAW,KAAK,EAAE,KAAK,UAAU,CAAC;AAAA,EACpC;AAEA,QAAM,QAAgB,WAAW;AACjC,MAAI,0BAA0B,QAAQ,gBAAgB;AACtD,MAAI,kBAAkB,IAAI,cAAc,qBAAqB;AAC7D,MAAI,mBAAmB,IAAI,UAAU,gBAAgB,IAAI,YAAY,YAAY;AAEjF,MAAI,KAAK;AACT,MAAI,SAAS;AACb,MAAI,OAAO;AACX,MAAI,YAAY;AAChB,MAAI,eAAe;AAEnB,QAAM,QAAoC,WAAW;AAAA,IACnD,CAAC,EAAE,KAAK,UAAU,MAChB,YAA2B;AACzB,YAAM,OAAeA,MAAK,KAAK,SAAS,QAAQ,SAAS;AACzD,YAAM,GAAG,MAAMA,MAAK,QAAQ,IAAI,GAAG,EAAE,WAAW,KAAK,CAAC;AAEtD,UAAI;AACF,cAAM,MACJ,SAAS,OAAO,QAAQ,IAAI,GAAG,KAC/B,SAAS,OAAO,QAAQ,IAAI,IAAI,MAAM,GAAG,EAAE,CAAC,CAAC;AAC/C,YAAI,KAAK;AACP,gBAAM,GAAG,UAAU,MAAM,GAAG;AAC5B;AACA;AAAA,QACF,OAAO;AACL,gBAAM,OAAe,MAAM,SAAS,GAAG;AACvC,gBAAM,GAAG,UAAU,MAAM,IAAI;AAC7B;AAAA,QACF;AAAA,MACF,SAAS,GAAG;AACV;AACA,YACE,CAAC,IAAI,SAAS,iBAAiB,KAC/B,CAAC,IAAI,SAAS,4BAA4B,GAC1C;AACA,eAAK,sBAAsBA,MAAK,SAAS,SAAS,IAAI,QAAS,EAAY,OAAO;AAAA,QACpF;AAAA,MACF;AAEA;AACA,YAAM,MAAc,KAAK,MAAO,YAAY,QAAS,GAAG;AACxD,UAAI,OAAO,eAAe,MAAM,cAAc,OAAO;AACnD,iBAAS,SAAS,OAAO,oBAAoB,YAAY,MAAM,QAAQ,OAAO,MAAM,IAAI;AACxF,YAAI,wBAAwB,YAAY,MAAM,QAAQ,OAAO,MAAM,IAAI;AACvE,uBAAe;AAAA,MACjB;AAAA,IACF;AAAA,EACJ;AAEA,QAAM,KAAK,OAAO,IAAI,WAAW;AAEjC,UAAQ,yBAAyB,KAAK,iBAAiB,SAAS,kBAAkB,OAAO,SAAS;AAElG,QAAM,aAAqB,CAAC,GAAG,SAAS,OAAO,QAAQ,OAAO,CAAC,EAAE;AACjE,MAAI,0CAA0C,UAAU;AAExD,WAAS,OAAO,QAAQ,MAAM;AAC9B,MAAI,8BAA8B;AACpC;AA5EA,IAAAC,iBAAA;AAAA;AAAA;AAEA;AACA;AACA;AACA;AAAA;AAAA;;;ACLA,OAAO,cAAc;AAErB,eAAsB,WAAW,KAA8B;AAC7D,MAAI;AACF,WAAO,MAAM,SAAS,OAAO,KAAK;AAAA,MAChC,QAAQ;AAAA,MACR,YAAY;AAAA,MACZ,UAAU;AAAA,MACV,SAAS;AAAA,MACT,MAAM;AAAA,MACN,aAAa;AAAA,MACb,eAAe;AAAA,MACf,gBAAgB;AAAA,MAChB,aAAa;AAAA,IACf,CAAC;AAAA,EACH,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAlBA;AAAA;AAAA;AAAA;AAAA;;;ACAA,IAAa;AAAb;AAAA;AAAA;AAAO,IAAM,eAAuB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACApC,OAAOC,SAAQ;AACf,OAAOC,WAAU;AAMjB,SAAS,YAAY,KAAqB;AACxC,SAAO,IAAI,QAAQ,uBAAuB,MAAM;AAClD;AAEA,SAAS,gBAAgB,MAAc,KAAqB;AAC1D,MAAI,IAAI,SAAS,SAAS,GAAG;AAC3B,UAAM,QAAQ,IAAI,MAAM,qBAAqB;AAC7C,QAAI,OAAO;AACT,YAAM,SAAiB,YAAY,MAAM,CAAC,CAAC;AAC3C,aAAO,KAAK,QAAQ,IAAI,OAAO,eAAe,MAAM,0BAA0B,GAAG,GAAG,EAAE;AACtF,aAAO,KAAK,QAAQ,IAAI,OAAO,eAAe,MAAM,qBAAqB,GAAG,GAAG,EAAE;AAAA,IACnF;AAAA,EACF,WAAW,IAAI,SAAS,UAAU,GAAG;AACnC,UAAM,QAAQ,IAAI,MAAM,sBAAsB;AAC9C,QAAI,OAAO;AACT,YAAM,OAAe,YAAY,MAAM,CAAC,CAAC;AACzC,aAAO,KAAK,QAAQ,IAAI,OAAO,aAAa,IAAI,UAAU,GAAG,GAAG,EAAE;AAAA,IACpE;AAAA,EACF,WAAW,IAAI,WAAW,GAAG,GAAG;AAC9B,UAAM,MAAc,YAAY,IAAI,MAAM,CAAC,CAAC;AAC5C,WAAO,KAAK;AAAA,MACV,IAAI,OAAO,qBAAqB,GAAG,oCAAoC,GAAG;AAAA,MAC1E;AAAA,IACF;AAAA,EACF,WAAW,IAAI,WAAW,GAAG,GAAG;AAC9B,UAAM,KAAa,IAAI,MAAM,CAAC;AAC9B,WAAO,kBAAkB,MAAM,EAAE;AAAA,EACnC;AACA,SAAO;AACT;AAEA,SAAS,kBAAkB,MAAc,IAAoB;AAC3D,QAAM,SAAiB,OAAO,EAAE;AAChC,MAAI,MAAc,KAAK,QAAQ,MAAM;AACrC,SAAO,QAAQ,IAAI;AACjB,UAAM,WAAmB,KAAK,YAAY,KAAK,GAAG;AAClD,QAAI,aAAa,GAAI;AAErB,UAAM,aAAqB,KAAK,QAAQ,KAAK,WAAW,CAAC;AACzD,UAAM,UAAkB,KAAK,MAAM,WAAW,GAAG,UAAU,EAAE,YAAY;AAEzE,QAAI,QAAQ;AACZ,QAAI,IAAY;AAChB,WAAO,IAAI,KAAK,QAAQ;AACtB,UAAI,KAAK,WAAW,IAAI,OAAO,IAAI,CAAC,MAAM,KAAK,IAAI,QAAQ,SAAS,CAAC,MAAM,OAAO,KAAK,IAAI,QAAQ,SAAS,CAAC,MAAM,MAAM;AACvH;AACA,aAAK,QAAQ,SAAS;AAAA,MACxB,WAAW,KAAK,WAAW,KAAK,OAAO,KAAK,CAAC,GAAG;AAC9C;AACA,YAAI,UAAU,GAAG;AACf,iBAAO,KAAK,MAAM,GAAG,QAAQ,IAAI,KAAK,MAAM,IAAI,QAAQ,SAAS,CAAC;AAClE;AAAA,QACF;AACA,aAAK,QAAQ,SAAS;AAAA,MACxB,OAAO;AACL;AAAA,MACF;AAAA,IACF;AAEA,UAAM,KAAK,QAAQ,MAAM;AAAA,EAC3B;AACA,SAAO;AACT;AAEA,SAAS,WAAW,MAAc,KAAqB;AACrD,QAAM,YAAY,IAAI,MAAM,GAAG,EAAE,CAAC,EAAE,QAAQ,OAAO,EAAE;AAGrD,MAAI,CAAC,KAAK,SAAS,iBAAiB,GAAG;AACrC,WAAO,KAAK,QAAQ,WAAW,iCAAiC,SAAS;AAAA,UAAe;AAAA,EAC1F;AAGA,MAAI,CAAC,KAAK,SAAS,oBAAoB,GAAG;AACxC,WAAO,KAAK,QAAQ,WAAW;AAAA,UAA2G;AAAA,EAC5I;AAGA,MAAI,CAAC,KAAK,SAAS,eAAe,GAAG;AACnC,WAAO,KAAK,QAAQ,WAAW;AAAA,qCAAqF,SAAS;AAAA;AAAA;AAAA,UAAiL;AAAA,EAChT;AAGA,MAAI,CAAC,KAAK,SAAS,eAAe,GAAG;AACnC,WAAO,KAAK,QAAQ,WAAW;AAAA,UAA2D;AAAA,EAC5F;AAEA,SAAO;AACT;AAEA,SAAS,sBAAsB,MAAsB;AACnD,SAAO,KAAK,QAAQ,yBAAyB,EAAE;AAC/C,SAAO,KAAK,QAAQ,2BAA2B,EAAE;AACjD,SAAO,KAAK,QAAQ,mBAAmB,EAAE;AACzC,SAAO,KAAK,QAAQ,qCAAqC,EAAE;AAC3D,SAAO,KAAK,QAAQ,uCAAuC,EAAE;AAC7D,SAAO,KAAK,QAAQ,6CAA6C,EAAE;AACnE,SAAO;AACT;AAEA,SAAS,mBAAmB,MAAsB;AAChD,SAAO,KAAK,QAAQ,qBAAqB,CAAC,QAAgB,WAAmB;AAC3E,UAAM,UAAkB,OACrB,MAAM,GAAG,EACT,IAAI,CAAC,UAAkB,MAAM,KAAK,CAAC,EACnC,OAAO,CAAC,UAAkB,CAAC,MAAM,WAAW,MAAM,CAAC,EACnD,KAAK,IAAI;AACZ,WAAO,UAAU,aAAa,UAAU,MAAM;AAAA,EAChD,CAAC;AACD,SAAO;AACT;AAEA,eAAsB,YAAY,UAA0C;AAC1E,WAAS,SAAS,OAAO,8BAA8B;AACvD,MAAI,kCAAkC;AACtC,MAAI,iBAAiB,SAAS,QAAQ,SAAS,MAAM,QAAQ,CAAC,IAAI,KAAK;AAEvE,MAAI,OAAe,SAAS;AAC5B,MAAI,CAAC,MAAM;AACT,SAAK,4CAA4C;AACjD;AAAA,EACF;AAEA,WAAS,SAAS,OAAO,8BAA8B;AACvD,QAAM,kBAA0B,KAAK;AACrC,SAAO,sBAAsB,IAAI;AACjC,MAAI,iDAAiD,kBAAkB,KAAK,UAAU,SAAS;AAC/F,UAAQ,yCAAyC;AAEjD,MAAI,OAAO,eAAe,YAAY;AACpC,aAAS,SAAS,OAAO,mBAAmB;AAC5C,WAAO,WAAW,MAAM,SAAS,OAAO;AACxC,YAAQ,yBAAyB;AAAA,EACnC;AAEA,MAAI,eAAe,SAAS,SAAS,eAAe,SAAS,aAAa;AAC1E,aAAW,OAAO,SAAS,SAAS,gBAAgB;AAClD,UAAM,SAAiB,KAAK;AAC5B,WAAO,gBAAgB,MAAM,GAAG;AAChC,UAAM,UAAkB,SAAS,KAAK;AACtC,QAAI,UAAU,GAAG;AACf,UAAI,gBAAgB,MAAM,OAAO,UAAU,iBAAiB;AAAA,IAC9D;AAAA,EACF;AAEA,MAAI,cAAc,SAAS,SAAS,cAAc,SAAS,oBAAoB;AAC/E,aAAW,WAAW,SAAS,SAAS,eAAe;AACrD,UAAM,SAAiB,KAAK;AAC5B,WAAO,KAAK,QAAQ,IAAI,OAAO,QAAQ,QAAQ,QAAQ,KAAK,GAAG,EAAE;AACjE,UAAM,UAAkB,SAAS,KAAK;AACtC,QAAI,UAAU,GAAG;AACf,UAAI,uBAAuB,UAAU,QAAQ;AAAA,IAC/C;AAAA,EACF;AACA,UAAQ,uCAAuC;AAE/C,WAAS,SAAS,OAAO,yBAAyB;AAClD,MAAI,eAAe,SAAS,OAAO,QAAQ,OAAO,6BAA6B;AAC/E,QAAM,gBAAwB,KAAK;AACnC,SAAO,SAAS,OAAO,QAAQ,MAAM,EAAE;AACvC,MAAI,0BAA0B,KAAK,SAAS,iBAAiB,QAAQ;AAErE,WAAS,SAAS,OAAO,+BAA+B;AACxD,SAAO,mBAAmB,IAAI;AAC9B,MAAI,mDAAmD;AAEvD,QAAM,uBAAuB,QAAQ;AACrC,UAAQ,mCAAmC;AAE3C,WAAS,SAAS,OAAO,6BAA6B;AACtD,QAAM,qBAAqB,QAAQ;AAEnC,WAAS,SAAS,OAAO,yBAAyB;AAClD,MAAI,0BAA0B,KAAK,SAAS,MAAM,QAAQ,CAAC,IAAI,SAAS;AACxE,QAAMD,IAAG,UAAUC,MAAK,KAAK,SAAS,QAAQ,YAAY,GAAG,IAAI;AACjE,UAAQ,oBAAoB;AAE5B,QAAMD,IAAG,UAAUC,MAAK,KAAK,SAAS,QAAQ,WAAW,GAAG,YAAY;AACxE,MAAI,mBAAmB;AACvB,UAAQ,uBAAuB;AACjC;AAEA,eAAe,uBAAuB,UAA0C;AAC9E,QAAM,OAAiB,CAAC,kBAAkB,mBAAmB,QAAQ;AACrE,MAAI,YAAY;AAEhB,aAAW,OAAO,MAAM;AACtB,UAAM,UAAkBA,MAAK,KAAK,SAAS,QAAQ,GAAG;AACtD,QAAI;AACJ,QAAI;AACF,cAAQ,MAAMD,IAAG,QAAQ,OAAO;AAAA,IAClC,QAAQ;AACN;AAAA,IACF;AAEA,eAAW,QAAQ,OAAO;AACxB,YAAM,MAAcC,MAAK,QAAQ,IAAI,EAAE,YAAY;AACnD,UAAI,CAAC,CAAC,QAAQ,OAAO,MAAM,EAAE,SAAS,GAAG,EAAG;AAE5C,YAAM,WAAmBA,MAAK,KAAK,SAAS,IAAI;AAChD,UAAI;AACF,YAAI,UAAkB,MAAMD,IAAG,SAAS,UAAU,OAAO;AACzD,cAAM,SAAiB;AACvB,kBAAU,SAAS,OAAO,QAAQ,SAAS,GAAG;AAC9C,YAAI,YAAY,QAAQ;AACtB,gBAAMA,IAAG,UAAU,UAAU,OAAO;AACpC;AAAA,QACF;AAAA,MACF,QAAQ;AAAA,MAAC;AAAA,IACX;AAAA,EACF;AACA,MAAI,qBAAqB,YAAY,eAAe;AACtD;AAEA,eAAe,qBAAqB,UAA0C;AAC5E,QAAM,OAAiB,CAAC,kBAAkB,iBAAiB;AAC3D,MAAI,QAAQ;AACZ,MAAI,QAAQ;AAEZ,aAAW,OAAO,MAAM;AACtB,UAAM,UAAkBC,MAAK,KAAK,SAAS,QAAQ,GAAG;AACtD,QAAI;AACJ,QAAI;AACF,cAAQ,MAAMD,IAAG,QAAQ,OAAO;AAAA,IAClC,QAAQ;AACN;AAAA,IACF;AAEA,UAAM,UAAoB,MAAM,OAAO,CAAC,MAAM;AAC5C,YAAM,MAAcC,MAAK,QAAQ,CAAC,EAAE,YAAY;AAChD,aAAO,QAAQ,UAAU,QAAQ;AAAA,IACnC,CAAC;AACD,aAAS,QAAQ;AAEjB,eAAW,QAAQ,SAAS;AAC1B,YAAM,WAAmBA,MAAK,KAAK,SAAS,IAAI;AAChD,UAAI;AACF,cAAM,MAAc,MAAMD,IAAG,SAAS,UAAU,OAAO;AAEvD,cAAM,WAAmB,IAAI,MAAM,KAAK,KAAK,CAAC,GAAG,SAAS,IAAI;AAC9D,YAAI,UAAU,MAAM;AAClB;AACA;AAAA,QACF;AAEA,cAAM,SAAiB,MAAM,WAAW,GAAG;AAC3C,cAAMA,IAAG,UAAU,UAAU,QAAQ,OAAO;AAC5C;AAEA,YAAI,QAAQ,MAAM,GAAG;AACnB,mBAAS,SAAS,OAAO,yBAAyB,QAAQ,MAAM,QAAQ,GAAG;AAAA,QAC7E;AAAA,MACF,SAAS,GAAG;AACV,aAAK,2BAA2B,OAAO,QAAS,EAAY,OAAO;AACnE;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,UAAQ,eAAe,QAAQ,MAAM,QAAQ,eAAe;AAC9D;AA3QA;AAAA;AAAA;AAEA;AACA;AACA;AAAA;AAAA;;;ACJA,OAAOE,YAAW;AAEX,SAAS,WAAmB;AACjC,SAAO,KAAK,IAAI,QAAQ,OAAO,WAAW,IAAI,EAAE;AAClD;AAKA,SAAS,SAAS,MAAc,GAAmB;AACjD,QAAM,UAAU,UAAU,IAAI,EAAE;AAChC,MAAI,WAAW,EAAG,QAAO;AACzB,SAAO,OAAO,IAAI,OAAO,IAAI,OAAO;AACtC;AAEA,SAAS,UAAU,GAAmB;AACpC,SAAO,EAAE,QAAQ,0BAA0B,EAAE;AAC/C;AAEO,SAAS,OAAO,GAAmB;AACxC,QAAM,QAAQ,IAAI;AAClB,SAAO,OAAO,EAAE,cAAI,IAAI,EAAE,SAAI,OAAO,KAAK,CAAC,IAAI,EAAE,cAAI;AACvD;AAEO,SAAS,OAAO,GAAmB;AACxC,QAAM,QAAQ,IAAI;AAClB,SAAO,OAAO,EAAE,cAAI,IAAI,EAAE,SAAI,OAAO,KAAK,CAAC,IAAI,EAAE,cAAI;AACvD;AAEO,SAAS,QAAQ,GAAW,MAAsB;AACvD,QAAM,QAAQ,IAAI;AAClB,QAAM,SAAS,SAAS,MAAM,KAAK;AACnC,SAAO,OAAO,EAAE,SAAI,IAAI,SAAS,EAAE,SAAI;AACzC;AAEO,SAAS,OAAO,GAAmB;AACxC,QAAM,QAAQ,IAAI;AAClB,SAAO,OAAO,EAAE,cAAI,IAAI,EAAE,SAAI,OAAO,KAAK,CAAC,IAAI,EAAE,cAAI;AACvD;AAEO,SAAS,OAAO,GAAW,OAAe,OAAuB;AACtE,QAAM,QAAQ,IAAI;AAClB,QAAM,aAAa,UAAUA,OAAM,KAAK,KAAK,CAAC;AAC9C,QAAM,UAAU,WAAW,SAAS,IAAI,MAAM;AAC9C,MAAI,UAAU,OAAO;AACnB,UAAM,QAAQ,QAAQ,WAAW,SAAS;AAC1C,UAAM,YAAY,MAAM,SAAS,QAAQ,MAAM,MAAM,GAAG,QAAQ,CAAC,IAAI,OAAO;AAC5E,WAAO,OAAO,EAAE,SAAI,IAAIA,OAAM,KAAK,KAAK,IAAI,OAAOA,OAAM,OAAO,SAAS,IAAI,IAAI,OAAO,KAAK,IAAI,GAAG,QAAQ,WAAW,SAAS,IAAI,UAAU,MAAM,CAAC,IAAI,EAAE,SAAI;AAAA,EACjK;AACA,QAAM,QAAQ,QAAQ,WAAW,SAAS,IAAI,MAAM;AACpD,SAAO,OAAO,EAAE,SAAI,IAAIA,OAAM,KAAK,KAAK,IAAI,OAAOA,OAAM,OAAO,KAAK,IAAI,IAAI,OAAO,KAAK,IAAI,EAAE,SAAI;AACrG;AAnDA,IAMM,GACA;AAPN;AAAA;AAAA;AAMA,IAAM,IAAIA,OAAM,IAAI,SAAS;AAC7B,IAAM,IAAIA,OAAM,IAAI,SAAS;AAAA;AAAA;;;ACP7B,OAAOC,SAAQ;AACf,OAAOC,WAAU;AACjB,OAAOC,YAAW;AAIlB,eAAsB,aAAa,UAA0C;AAC3E,QAAM,IAAI,SAAS;AACnB,QAAM,UAAU,IAAI;AAEpB,QAAM,QAAQ,OAAO,MAA+B;AAClD,QAAI;AACF,cAAQ,MAAMF,IAAG,QAAQC,MAAK,KAAK,SAAS,QAAQ,CAAC,CAAC,GAAG;AAAA,IAC3D,QAAQ;AACN,aAAO;AAAA,IACT;AAAA,EACF;AACA,QAAM,CAAC,MAAM,OAAO,QAAQ,MAAM,SAAS,QAAQ,QAAQ,MAAM,QAAQ,IAAI,MAAM,QAAQ,IAAI;AAAA,IAC7F,MAAM,eAAe;AAAA,IACrB,MAAM,cAAc;AAAA,IACpB,MAAM,eAAe;AAAA,IACrB,MAAM,aAAa;AAAA,IACnB,MAAM,iBAAiB;AAAA,IACvB,MAAM,gBAAgB;AAAA,IACtB,MAAM,QAAQ;AAAA,IACd,MAAM,MAAM;AAAA,IACZ,MAAM,UAAU;AAAA,EAClB,CAAC;AAED,QAAME,KAAID,OAAM,IAAI,SAAS;AAC7B,QAAME,MAAKF,OAAM,IAAI,SAAS;AAC9B,QAAM,KAAKA,OAAM,IAAI,SAAS;AAC9B,QAAM,IAAIA,OAAM;AAChB,QAAM,IAAIA,OAAM,IAAI,SAAS;AAC7B,QAAM,KAAKA,OAAM,IAAI,SAAS;AAC9B,QAAM,KAAKA,OAAM;AACjB,QAAM,KAAKA,OAAM;AAEjB,QAAM,UAAkE;AAAA,IACtE,CAAC,WAAW,QAAQ,OAAOC,EAAC;AAAA,IAC5B,CAAC,mBAAmB,QAAQ,aAAaC,GAAE;AAAA,IAC3C,CAAC,oBAAoB,SAAS,cAAc,EAAE;AAAA,IAC9C,CAAC,kBAAkB,MAAM,UAAU,CAAC;AAAA,IACpC,CAAC,kBAAkB,QAAQ,UAAU,CAAC;AAAA,IACtC,CAAC,iBAAiB,OAAO,SAAS,EAAE;AAAA,IACpC,CAAC,gBAAgB,MAAM,QAAQ,EAAE;AAAA,IACjC,CAAC,SAAS,MAAM,QAAQ,EAAE;AAAA,IAC1B,CAAC,aAAa,UAAU,SAAS,EAAE;AAAA,EACrC;AAEA,UAAQ,IAAI,EAAE;AACd,MAAI,CAAC,SAAS;AACZ,YAAQ,IAAI,OAAO,CAAC,CAAC;AACrB,YAAQ,IAAI,QAAQ,GAAGF,OAAM,KAAK,MAAM,kBAAkB,CAAC,CAAC;AAC5D,YAAQ,IAAI,OAAO,CAAC,CAAC;AAAA,EACvB,OAAO;AACL,YAAQ,IAAIA,OAAM,KAAK,MAAM,mBAAmB,CAAC;AAAA,EACnD;AAEA,aAAW,CAAC,OAAO,KAAK,MAAM,KAAK,KAAK,SAAS;AAC/C,QAAI,QAAQ,EAAG;AACf,UAAM,QAAQ,IAAI;AAClB,UAAM,IAAI,MAAM,OAAO,EAAE;AACzB,UAAM,IAAI,OAAO,GAAG,EAAE,SAAS,CAAC;AAChC,UAAM,UAAU,GAAG,MAAM,CAAC,CAAC,GAAGA,OAAM,MAAM,CAAC,CAAC,KAAKA,OAAM,KAAK,IAAI,CAAC;AACjE,UAAM,UAAU,KAAK,IAAI,IAAI,KAAK;AAClC,UAAM,MAAM,KAAK,IAAI,GAAG,QAAQ,OAAO;AACvC,QAAI,SAAS;AACX,cAAQ,IAAI,KAAK,MAAM,KAAK,CAAC,IAAIA,OAAM,MAAM,OAAO,GAAG,CAAC,CAAC,IAAIA,OAAM,KAAK,IAAI,CAAC,EAAE;AAAA,IACjF,OAAO;AACL,cAAQ,IAAI,OAAOA,OAAM,IAAI,SAAS,EAAE,SAAI,IAAI,UAAU,IAAI,OAAO,GAAG,IAAIA,OAAM,IAAI,SAAS,EAAE,SAAI,CAAC;AAAA,IACxG;AAAA,EACF;AAEA,MAAI,CAAC,SAAS;AACZ,YAAQ,IAAI,OAAO,CAAC,CAAC;AAAA,EACvB;AAEA,UAAQ,IAAI,EAAE;AACd,QAAM,QAAQ,QAAQD,MAAK,SAAS,SAAS,MAAM,IAAI;AACvD,MAAI,CAAC,SAAS;AACZ,YAAQ,IAAI,OAAO,CAAC,CAAC;AACrB,YAAQ,IAAI,QAAQ,GAAGC,OAAM,KAAK,MAAM,oBAAoB,CAAC,CAAC;AAC9D,YAAQ,IAAI,OAAO,CAAC,CAAC;AACrB,UAAM,QAAQ,IAAI;AAClB,UAAM,SAAS,MAAM;AACrB,UAAM,MAAM,KAAK,IAAI,GAAG,QAAQ,MAAM;AACtC,YAAQ,IAAI,OAAOA,OAAM,IAAI,SAAS,EAAE,SAAI,IAAIC,GAAE,KAAK,IAAI,IAAI,OAAO,GAAG,IAAID,OAAM,IAAI,SAAS,EAAE,YAAK,IAAIA,OAAM,IAAI,SAAS,EAAE,SAAI,CAAC;AACrI,YAAQ,IAAI,OAAO,CAAC,CAAC;AAAA,EACvB,OAAO;AACL,YAAQ,IAAIA,OAAM,KAAK,MAAM,qBAAqB,CAAC;AACnD,YAAQ,IAAI,KAAKC,GAAE,KAAK,CAAC,EAAE;AAAA,EAC7B;AAEA,UAAQ,IAAI,EAAE;AACd,UAAQ,IAAID,OAAM,KAAK,yDAAyD,CAAC;AACjF,UAAQ,IAAI,EAAE;AAChB;AAjGA;AAAA;AAAA;AAIA;AAAA;AAAA;;;ACJA,OAAOG,YAAW;AAAlB,IAEM,aACA,gBAEA,YAEO;AAPb;AAAA;AAAA;AAEA,IAAM,cAAc;AACpB,IAAM,iBAAiB;AAEvB,IAAM,aAAa,CAAC,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,KAAK;AAE5D,IAAM,iBAAN,MAAqB;AAAA,MAClB,WAAkC;AAAA,MAClC,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,SAAS;AAAA,MAEjB,MAAM,QAAgB,IAAU;AAC9B,aAAK,QAAQ;AACb,aAAK,QAAQ;AACb,aAAK,SAAS;AACd,aAAK,KAAK;AACV,aAAK,WAAW,YAAY,MAAM;AAChC,eAAK;AACL,eAAK,KAAK;AAAA,QACZ,GAAG,cAAc;AAAA,MACnB;AAAA,MAEA,OAAO,OAAqB;AAC1B,aAAK,QAAQ;AAAA,MACf;AAAA,MAEA,IAAI,SAAuB;AACzB,YAAI,KAAK,QAAQ;AACf,kBAAQ,OAAO,MAAM,WAAW;AAAA,QAClC;AACA,gBAAQ,OAAO,MAAM,UAAU,IAAI;AACnC,YAAI,KAAK,QAAQ;AACf,eAAK,KAAK;AAAA,QACZ;AAAA,MACF;AAAA,MAEA,OAAa;AACX,aAAK,SAAS;AACd,YAAI,KAAK,UAAU;AACjB,wBAAc,KAAK,QAAQ;AAC3B,eAAK,WAAW;AAAA,QAClB;AACA,gBAAQ,OAAO,MAAM,WAAW;AAAA,MAClC;AAAA,MAEQ,OAAa;AACnB,YAAI,CAAC,KAAK,OAAQ;AAElB,cAAM,OAAO,WAAW,KAAK,QAAQ,WAAW,MAAM;AACtD,cAAM,UAAU,KAAK,cAAc,SAAS;AAC5C,cAAM,SAASA,OAAM,IAAI,SAAS,EAAE,IAAI;AACxC,cAAM,WAAW,KAAK,QAClB,KAAKA,OAAM,KAAK,KAAK,SAAS,KAAK,OAAO,EAAE,CAAC,CAAC,KAC9C;AAEJ,gBAAQ,OAAO,MAAM,cAAc,OAAO,IAAI,MAAM,GAAG,QAAQ,EAAE;AAAA,MACnE;AAAA,MAEQ,cAAc,MAAsB;AAC1C,YAAI,SAAS;AACb,cAAM,MAAM,KAAK,SAAS,KAAK,SAAS,cAAc,KAAK;AAC3D,iBAAS,IAAI,GAAG,IAAI,KAAK,QAAQ,KAAK;AACpC,gBAAM,OAAO,KAAK,IAAI,IAAI,GAAG;AAC7B,cAAI,OAAO,aAAa;AACtB,kBAAM,IAAI,IAAI,OAAO;AACrB,kBAAM,IAAI,KAAK,MAAM,MAAM,IAAI,EAAE;AACjC,sBAAUA,OAAM,IAAI,GAAG,GAAG,CAAC,EAAE,KAAK,CAAC,CAAC;AAAA,UACtC,OAAO;AACL,sBAAUA,OAAM,IAAI,KAAK,KAAK,GAAG,EAAE,KAAK,CAAC,CAAC;AAAA,UAC5C;AAAA,QACF;AACA,eAAO;AAAA,MACT;AAAA,MAEQ,SAAS,GAAW,KAAqB;AAC/C,YAAI,EAAE,UAAU,IAAK,QAAO;AAC5B,eAAO,EAAE,MAAM,GAAG,MAAM,CAAC,IAAI;AAAA,MAC/B;AAAA,IACF;AAAA;AAAA;;;AChFA;AAAA;AAAA;AAAA;AAAA;AAAA,OAAOC,SAAQ;AACf,OAAOC,WAAU;AACjB,OAAOC,YAAW;AAcX,SAAS,iBAAiB,KAAa,cAAoC;AAChF,MAAI;AACF,UAAM,SAAS,IAAI,IAAI,GAAG;AAC1B,UAAM,WAAmB,OAAO;AAEhC,QAAI;AACJ,QAAI,SAAS,SAAS,aAAa,GAAG;AACpC,iBAAW,SAAS,QAAQ,eAAe,EAAE;AAAA,IAC/C,WAAW,SAAS,SAAS,cAAc,GAAG;AAC5C,YAAM,QAAkB,OAAO,SAAS,MAAM,GAAG,EAAE,OAAO,OAAO;AACjE,iBAAW,MAAM,CAAC,KAAK,SAAS,MAAM,GAAG,EAAE,CAAC;AAAA,IAC9C,WAAW,SAAS,MAAM,6BAA6B,GAAG;AACxD,iBAAW,SAAS,MAAM,UAAU,EAAE,CAAC;AAAA,IACzC,OAAO;AACL,iBAAW,SAAS,QAAQ,OAAO,GAAG;AAAA,IACxC;AAEA,WAAO,GAAG,YAAY,IAAI,QAAQ;AAAA,EACpC,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AArCA,IAuCa;AAvCb;AAAA;AAAA;AAIA;AACA;AACA;AACA;AACA,IAAAC;AACA;AACA;AACA;AAGA;AAyBO,IAAM,iBAAN,MAAgD;AAAA,MACrD;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MAEA,YAAY,SAAiB,QAAgB,kBAAiC;AAC5E,aAAK,UAAU;AACf,aAAK,SAAS;AACd,aAAK,SAAS,IAAI,SAAS;AAC3B,aAAK,UAAU;AACf,aAAK,OAAO;AACZ,aAAK,UAAU;AACf,aAAK,cAAc;AAEnB,YAAI,oBAAoB,qBAAqB,WAAW;AACtD,eAAK,WAAW,kBAAkB,gBAAgB;AAAA,QACpD,OAAO;AACL,eAAK,WAAW,eAAe,OAAO;AAAA,QACxC;AAAA,MACF;AAAA,MAEA,MAAM,IAAI,kBAA2B,OAAsB;AACzD,gBAAQ,IAAID,OAAM,KAAK,IAAI,SAAS,EAAE,gDAAgD,CAAC;AACvF,aAAK,gBAAgBA,OAAM,UAAU,KAAK,OAAO,CAAC;AAClD,aAAK,gBAAgBA,OAAM,OAAO,KAAK,MAAM,CAAC;AAC9C,aAAK,gBAAgBA,OAAM,IAAI,SAAS,EAAE,KAAK,SAAS,WAAW,CAAC;AACpE,YAAI,iBAAiB;AACnB,eAAK,gBAAgBA,OAAM,MAAM,SAAS,CAAC;AAAA,QAC7C;AACA,gBAAQ,IAAI,EAAE;AAEd,aAAK,UAAU,IAAI,eAAe;AAClC,mBAAW,KAAK,OAAO;AACvB,aAAK,QAAQ,MAAM,0BAA0B;AAE7C,mBAAW,KAAK;AAAA,UACd;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACF,GAAG;AACD,gBAAMF,IAAG,MAAMC,MAAK,KAAK,KAAK,QAAQ,CAAC,GAAG,EAAE,WAAW,KAAK,CAAC;AAAA,QAC/D;AACA,YAAI,oCAAoC;AAExC,aAAK,QAAQ,OAAO,sBAAsB;AAC1C,YAAI,4BAA4B,KAAK,OAAO;AAC5C,YAAI;AACF,gBAAM,MAAc,MAAM,SAAS,KAAK,OAAO;AAC/C,eAAK,UAAU,IAAI,SAAS,OAAO;AACnC,kBAAQ,wBAAwB,KAAK,QAAQ,SAAS,MAAM,QAAQ,CAAC,IAAI,MAAM;AAAA,QACjF,SAAS,GAAG;AACV,cAAIC,OAAM,IAAI,+BAAgC,EAAY,OAAO,CAAC;AAAA,QACpE;AAEA,cAAM,eAAe,eAAe,KAAK,SAAS,KAAK,OAAO;AAC9D,YAAI,aAAa,SAAS,KAAK,SAAS,MAAM;AAC5C,eAAK,WAAW;AAChB,cAAI,uBAAuBA,OAAM,IAAI,SAAS,EAAE,KAAK,SAAS,WAAW,IAAI,uBAAuB;AAAA,QACtG;AAEA,cAAM,iBAAiB,IAAI;AAE3B,YAAI,mBAAmB,KAAK,MAAM;AAChC,gBAAM,KAAK,cAAc;AAAA,QAC3B;AAEA,cAAM,aAAa,IAAI;AAEvB,aAAK,QAAQ,OAAO,uBAAuB;AAC3C,cAAM,YAAY,IAAI;AAEtB,aAAK,QAAQ,OAAO,oBAAoB;AACxC,cAAM,YAAY,IAAI;AAEtB,aAAK,QAAQ,KAAK;AAClB,mBAAW,IAAI;AAEf,gBAAQ,IAAI,EAAE;AACd,gBAAQ,kBAAkB;AAC1B,cAAM,aAAa,IAAI;AAAA,MACzB;AAAA,MAEA,MAAc,gBAA+B;AAC3C,aAAK,SAAS,OAAO,0BAA0B;AAC/C,YAAI,qCAAqC;AAEzC,cAAM,OAAO,KAAK;AAClB,cAAM,UAAU,IAAI,IAAI,KAAK,OAAO;AACpC,cAAM,WAAW,QAAQ,SAAS,QAAQ,UAAU,EAAE;AAEtD,cAAM,QAAkB,MAAM,KAAK,SAAS,CAAC,SAAiB;AAC5D,gBAAM,UAAU,MAAM,KAAK,SAAS,iBAAiB,SAAS,CAAC;AAC/D,gBAAM,QAAQ,oBAAI,IAAY;AAC9B,qBAAW,KAAK,SAAS;AACvB,kBAAM,OAAQ,EAAwB;AACtC,gBAAI,CAAC,QAAQ,KAAK,WAAW,aAAa,KAAK,KAAK,WAAW,SAAS,KAAK,KAAK,WAAW,MAAM,KAAK,KAAK,WAAW,GAAG,EAAG;AAC9H,gBAAI;AACF,oBAAM,IAAI,IAAI,IAAI,IAAI;AACtB,oBAAM,IAAI,EAAE,SAAS,QAAQ,UAAU,EAAE;AACzC,kBAAI,MAAM,QAAQ,EAAE,aAAa,OAAO,EAAE,aAAa,MAAM,CAAC,EAAE,SAAS,WAAW,IAAI,GAAG;AACzF,sBAAM,IAAI,KAAK,MAAM,GAAG,EAAE,CAAC,CAAC;AAAA,cAC9B;AAAA,YACF,QAAQ;AAAA,YAAC;AAAA,UACX;AACA,iBAAO,MAAM,KAAK,KAAK;AAAA,QACzB,GAAG,QAAQ;AAEX,YAAI,WAAW,MAAM,SAAS,iBAAiB;AAC/C,cAAM,cAAc,CAAC,GAAG,IAAI,IAAI,KAAK,CAAC,EAAE,MAAM,GAAG,EAAE;AAEnD,YAAI,YAAY,WAAW,GAAG;AAC5B,cAAI,uBAAuB;AAC3B;AAAA,QACF;AAEA,iBAAS,IAAI,GAAG,IAAI,YAAY,QAAQ,KAAK;AAC3C,gBAAM,OAAO,YAAY,CAAC;AAC1B,eAAK,SAAS,OAAO,wBAAwB,IAAI,KAAK,MAAM,YAAY,MAAM;AAC9E,cAAI;AACF,kBAAM,OAAO,MAAM,eAAe,MAAM,MAAM;AAAA,cAC5C,qBAAqB,KAAK,SAAS;AAAA,cACnC,kBAAkB,KAAK,SAAS;AAAA,YAClC,CAAC;AAED,kBAAM,OAAO,KAAK,WAAW,MAAM,OAAO;AAC1C,kBAAM,WAAW,OAAO;AACxB,kBAAM,WAAWD,MAAK,KAAK,KAAK,QAAQ,YAAY,QAAQ;AAE5D,kBAAMD,IAAG,UAAU,UAAU,MAAM,OAAO;AAC1C,gBAAI,uBAAuB,QAAQ;AAAA,UACrC,SAAS,GAAG;AACV,gBAAI,eAAe,OAAO,OAAQ,EAAY,OAAO;AAAA,UACvD;AAAA,QACF;AAEA,gBAAQ,wBAAwB,YAAY,MAAM;AAAA,MACpD;AAAA,MAEQ,WAAW,MAAc,SAAsB;AACrD,YAAI;AACF,gBAAM,IAAI,IAAI,IAAI,IAAI;AACtB,cAAI,WAAW,EAAE,SAAS,QAAQ,QAAQ,EAAE,EAAE,QAAQ,OAAO,EAAE;AAC/D,cAAI,CAAC,SAAU,QAAO;AACtB,iBAAO,SAAS,QAAQ,mBAAmB,GAAG,EAAE,QAAQ,OAAO,GAAG,KAAK;AAAA,QACzE,QAAQ;AACN,iBAAO;AAAA,QACT;AAAA,MACF;AAAA,IACF;AAAA;AAAA;;;ACxMA,OAAO,cAAc;AACrB,SAAS,OAAO,cAAc;AAC9B,OAAOI,YAAW;AAOlB,SAASC,WAAU,GAAmB;AACpC,SAAO,EAAE,QAAQ,0BAA0B,EAAE;AAC/C;AAEA,eAAsB,OAAO,UAAkB,SAAyB,eAAuB,GAAoB;AACjH,QAAM,QAAQ,MAAM,SAAS,OAAO;AAEpC,MAAI,CAAC,OAAO;AACV,WAAO,eAAe,UAAU,SAAS,YAAY;AAAA,EACvD;AAEA,SAAO,YAAY,UAAU,SAAS,YAAY;AACpD;AAEA,eAAe,YAAY,UAAkB,SAAyB,cAAuC;AAC3G,SAAO,IAAI,QAAQ,CAAC,YAAY;AAC9B,QAAI,WAAmB;AAEvB,UAAM,SAAS,CAAC,UAAmB,UAAgB;AACjD,UAAI,CAAC,SAAS;AACZ,eAAO,MAAM,QAAQ,QAAQ,SAAS,CAAC,GAAG;AAC1C,eAAO,MAAM,QAAQ;AAAA,MACvB;AACA,cAAQ,IAAI,KAAKD,OAAM,IAAI,SAAS,EAAE,GAAG,CAAC,IAAIA,OAAM,MAAM,KAAK,QAAQ,CAAC,EAAE;AAC1E,eAAS,IAAI,GAAG,IAAI,QAAQ,QAAQ,KAAK;AACvC,YAAI,MAAM,UAAU;AAClB,kBAAQ,IAAI,OAAOA,OAAM,IAAI,SAAS,EAAE,GAAG,CAAC,IAAIA,OAAM,MAAM,KAAK,QAAQ,CAAC,EAAE,KAAK,CAAC,EAAE;AAAA,QACtF,OAAO;AACL,kBAAQ,IAAI,SAASA,OAAM,KAAK,QAAQ,CAAC,EAAE,KAAK,CAAC,EAAE;AAAA,QACrD;AAAA,MACF;AAAA,IACF;AAEA,WAAO,IAAI;AAEX,aAAS,mBAAmB,KAAK;AACjC,UAAM,WAAW,IAAI;AAErB,UAAM,aAAa,CAAC,MAA0B,QAA4B;AACxE,UAAI,CAAC,IAAK;AAEV,UAAI,IAAI,SAAS,QAAQ,WAAW,GAAG;AACrC;AACA,eAAO;AAAA,MACT,WAAW,IAAI,SAAS,UAAU,WAAW,QAAQ,SAAS,GAAG;AAC/D;AACA,eAAO;AAAA,MACT,WAAW,IAAI,SAAS,UAAU;AAChC,cAAM,WAAW,KAAK;AACtB,cAAM,eAAe,YAAY,UAAU;AAC3C,cAAM,MAAM;AAEZ,eAAO,MAAM,QAAQ,QAAQ,SAAS,CAAC,GAAG;AAC1C,eAAO,MAAM,QAAQ;AACrB,gBAAQ,IAAI,KAAKA,OAAM,MAAM,QAAG,CAAC,IAAIA,OAAM,MAAM,KAAK,QAAQ,CAAC,IAAIA,OAAM,IAAI,SAAS,EAAEC,WAAU,QAAQ,QAAQ,EAAE,KAAK,CAAC,CAAC;AAAA,CAAI;AAE/H,gBAAQ,QAAQ,QAAQ,EAAE,KAAK;AAAA,MACjC,WAAY,IAAI,QAAQ,IAAI,SAAS,OAAQ,IAAI,SAAS,UAAU;AAClE,cAAM,WAAW,KAAK;AACtB,cAAM,eAAe,YAAY,UAAU;AAC3C,gBAAQ,KAAK,CAAC;AAAA,MAChB;AAAA,IACF;AAEA,UAAM,OAAO;AACb,UAAM,GAAG,YAAY,UAAU;AAAA,EACjC,CAAC;AACH;AAEA,eAAe,eAAe,UAAkB,SAAyB,cAAuC;AAC9G,SAAO,IAAI,QAAQ,CAAC,YAAY;AAC9B,UAAM,KAAK,SAAS,gBAAgB,EAAE,OAAO,OAAO,QAAQ,OAAO,CAAC;AAEpE,YAAQ,IAAI,KAAKD,OAAM,IAAI,SAAS,EAAE,GAAG,CAAC,IAAIA,OAAM,MAAM,KAAK,QAAQ,CAAC;AAAA,CAAI;AAC5E,aAAS,IAAI,GAAG,IAAI,QAAQ,QAAQ,KAAK;AACvC,YAAM,SAAS,MAAM,eAAeA,OAAM,MAAM,SAAI,IAAI;AACxD,cAAQ,IAAI,MAAMA,OAAM,KAAK,IAAI,IAAI,CAAC,GAAG,CAAC,GAAG,MAAM,IAAIA,OAAM,MAAM,QAAQ,CAAC,EAAE,KAAK,CAAC,EAAE;AAAA,IACxF;AACA,YAAQ,IAAI,EAAE;AACd,UAAM,MAAM,OAAO,eAAe,CAAC;AAEnC,UAAM,MAAM,MAAY;AACtB,SAAG,SAAS,KAAKA,OAAM,IAAI,SAAS,EAAE,GAAG,CAAC,IAAIA,OAAM,KAAK,aAAa,QAAQ,MAAM,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC,WAAW;AACjH,cAAM,UAAU,OAAO,KAAK;AAC5B,YAAI,CAAC,SAAS;AACZ,aAAG,MAAM;AACT,gBAAM,QAAQC,WAAU,QAAQ,YAAY,EAAE,KAAK;AACnD,kBAAQ,IAAI,KAAKD,OAAM,MAAM,QAAG,CAAC,IAAIA,OAAM,IAAI,SAAS,EAAE,KAAK,CAAC;AAAA,CAAI;AACpE,kBAAQ,QAAQ,YAAY,EAAE,KAAK;AACnC;AAAA,QACF;AACA,cAAM,MAAM,SAAS,SAAS,EAAE;AAChC,YAAI,OAAO,KAAK,OAAO,QAAQ,QAAQ;AACrC,aAAG,MAAM;AACT,gBAAM,QAAQC,WAAU,QAAQ,MAAM,CAAC,EAAE,KAAK;AAC9C,kBAAQ,IAAI,KAAKD,OAAM,MAAM,QAAG,CAAC,IAAIA,OAAM,IAAI,SAAS,EAAE,KAAK,CAAC;AAAA,CAAI;AACpE,kBAAQ,QAAQ,MAAM,CAAC,EAAE,KAAK;AAAA,QAChC,OAAO;AACL,kBAAQ,IAAI,KAAKA,OAAM,IAAI,QAAG,CAAC,YAAY,QAAQ,MAAM;AAAA,CAAI;AAC7D,cAAI;AAAA,QACN;AAAA,MACF,CAAC;AAAA,IACH;AACA,QAAI;AAAA,EACN,CAAC;AACH;AAlHA;AAAA;AAAA;AAAA;AAAA;;;ACAA;AAAA;AAAA;AAAA;AAAA,OAAOE,eAAc;AACrB,SAAS,SAAAC,QAAO,UAAAC,eAAc;AAC9B,OAAOC,WAAU;AACjB,SAAS,OAAAC,YAAW;AACpB,OAAOC,YAAW;AAQlB,SAAS,WAAW,OAAqB;AACvC,QAAM,IAAI,SAAS;AACnB,MAAI,IAAI,IAAI;AACV,YAAQ,IAAI;AAAA,IAAOA,OAAM,IAAI,SAAS,EAAE,QAAG,CAAC,IAAIA,OAAM,KAAK,MAAM,KAAK,CAAC,EAAE;AACzE;AAAA,EACF;AACA,UAAQ,IAAI,OAAO,CAAC,CAAC;AACrB,UAAQ,IAAI,QAAQ,GAAGA,OAAM,KAAK,MAAM,OAAO,KAAK,CAAC,CAAC;AACtD,UAAQ,IAAI,OAAO,CAAC,CAAC;AACrB,UAAQ,IAAI,EAAE;AAChB;AAEA,eAAsB,SAAS,aAAsB,OAAsB;AACzE,aAAW;AAEX,UAAQ,IAAIA,OAAM,KAAK,MAAM,qCAAqC,CAAC;AACnE,UAAQ,IAAIA,OAAM,KAAK,8CAA8C,CAAC;AAEtE,QAAM,KAAKL,UAAS,gBAAgB,EAAE,OAAOC,QAAO,QAAQC,QAAO,CAAC;AAEpE,QAAM,MAAM,OAAO,UAAkB,eAAyC;AAC5E,UAAM,SAAiB,aAAaG,OAAM,KAAK,KAAK,UAAU,GAAG,IAAI;AACrE,UAAM,SAAiB,KAAKA,OAAM,IAAI,SAAS,EAAE,GAAG,CAAC,IAAIA,OAAM,MAAM,KAAK,QAAQ,CAAC,GAAG,MAAM,IAAIA,OAAM,KAAK,GAAG,CAAC;AAC/G,UAAM,SAAiB,MAAM,GAAG,SAAS,MAAM;AAC/C,WAAO,OAAO,KAAK,KAAK,cAAc;AAAA,EACxC;AAEA,aAAW,mBAAmB;AAE9B,MAAI,UAAU;AACd,SAAO,CAAC,SAAS;AACf,UAAM,QAAgB,MAAM,IAAI,oBAAoB;AACpD,QAAI;AACF,UAAID,KAAI,KAAK;AACb,gBAAU;AAAA,IACZ,QAAQ;AACN,cAAQ,IAAI,KAAKC,OAAM,IAAI,QAAG,CAAC,IAAIA,OAAM,IAAI,8CAA8C,CAAC;AAAA,CAAI;AAAA,IAClG;AAAA,EACF;AACA,UAAQ,IAAI,KAAKA,OAAM,MAAM,QAAG,CAAC,IAAIA,OAAM,MAAM,MAAM,CAAC,IAAIA,OAAM,UAAU,OAAO,CAAC;AAAA,CAAI;AAExF,aAAW,mBAAmB;AAE9B,QAAM,WAAW,eAAe,OAAO;AACvC,MAAI;AAEJ,MAAI,YAAY;AACd,YAAQ,IAAI,KAAKA,OAAM,KAAK,GAAG,CAAC,mBAAmBA,OAAM,IAAI,SAAS,EAAE,SAAS,WAAW,CAAC,EAAE;AAC/F,UAAM,gBAAwB,MAAM,IAAI,iCAAiC,SAAS,IAAI;AACtF,mBAAgB,CAAC,UAAU,WAAW,KAAK,EAAE,SAAS,aAAa,IAC/D,gBACA,SAAS;AACb,YAAQ,IAAI,KAAKA,OAAM,MAAM,QAAG,CAAC,IAAIA,OAAM,MAAM,WAAW,CAAC,IAAIA,OAAM,IAAI,SAAS,EAAE,YAAY,CAAC;AAAA,CAAI;AAAA,EACzG,OAAO;AACL,OAAG,MAAM;AACT,UAAM,YAAY;AAAA,MAChB,EAAE,OAAO,SAAS,SAAS,SAAS,WAAWA,OAAM,KAAK,aAAa,IAAI,EAAE,IAAI,OAAO,SAAS;AAAA,MACjG,EAAE,OAAO,UAAU,SAAS,SAAS,YAAYA,OAAM,KAAK,aAAa,IAAI,EAAE,IAAI,OAAO,UAAU;AAAA,MACpG,EAAE,OAAO,MAAM,SAAS,SAAS,QAAQA,OAAM,KAAK,aAAa,IAAI,EAAE,IAAI,OAAO,MAAM;AAAA,IAC1F;AACA,UAAM,aAAa,CAAC,UAAU,WAAW,KAAK,EAAE,QAAQ,SAAS,IAAI;AACrE,mBAAe,MAAM,OAAO,mBAAmB,WAAW,KAAK,IAAI,GAAG,UAAU,CAAC;AAAA,EACnF;AAEA,QAAM,MAAM,aAAa,KAAKL,UAAS,gBAAgB,EAAE,OAAOC,QAAO,QAAQC,QAAO,CAAC;AAEvF,QAAM,OAAO,OAAO,UAAkB,eAAyC;AAC7E,UAAM,SAAiB,aAAaG,OAAM,KAAK,KAAK,UAAU,GAAG,IAAI;AACrE,UAAM,SAAiB,KAAKA,OAAM,IAAI,SAAS,EAAE,GAAG,CAAC,IAAIA,OAAM,MAAM,KAAK,QAAQ,CAAC,GAAG,MAAM,IAAIA,OAAM,KAAK,GAAG,CAAC;AAC/G,UAAM,SAAiB,MAAM,IAAI,SAAS,MAAM;AAChD,WAAO,OAAO,KAAK,KAAK,cAAc;AAAA,EACxC;AAEA,QAAM,cAAsB,iBAAiB,SAAS,YAAY;AAElE,aAAW,2BAA2B;AAEtC,QAAM,SAAiB,MAAM,KAAK,oBAAoB,OAAO,WAAW;AACxE,UAAQ,IAAI,KAAKA,OAAM,MAAM,QAAG,CAAC,IAAIA,OAAM,MAAM,SAAS,CAAC,IAAIA,OAAM,OAAO,MAAM,CAAC;AAAA,CAAI;AAEvF,aAAW,kBAAkB;AAE7B,MAAI;AACJ,MAAI;AACJ,MAAI;AAEJ,MAAI,YAAY;AACd,UAAM,eAAuB,MAAM,KAAK,gCAAgC,GAAG;AAC3E,kBAAc,aAAa,YAAY,EAAE,WAAW,GAAG;AACvD,YAAQ,IAAI,KAAKA,OAAM,MAAM,QAAG,CAAC,kBAAkB,cAAcA,OAAM,MAAM,KAAK,IAAIA,OAAM,IAAI,IAAI,CAAC;AAAA,CAAI;AAEzG,UAAM,iBAAyB,MAAM,KAAK,2BAA2B,GAAG;AACxE,sBAAkB,eAAe,YAAY,EAAE,WAAW,GAAG;AAC7D,YAAQ,IAAI,KAAKA,OAAM,MAAM,QAAG,CAAC,eAAe,kBAAkBA,OAAM,MAAM,KAAK,IAAIA,OAAM,IAAI,IAAI,CAAC;AAAA,CAAI;AAE1G,UAAM,oBAA4B,MAAM,KAAK,wBAAwB,IAAI;AACzE,kBAAc,SAAS,mBAAmB,EAAE,KAAK;AACjD,YAAQ,IAAI,KAAKA,OAAM,MAAM,QAAG,CAAC,iBAAiBA,OAAM,OAAO,OAAO,WAAW,CAAC,CAAC;AAAA,CAAI;AAAA,EACzF,OAAO;AACL,QAAI,MAAM;AACV,UAAM,YAAY,MAAM,OAAO,0BAA0B;AAAA,MACvD,EAAE,OAAO,OAAO,OAAO,MAAM;AAAA,MAC7B,EAAE,OAAO,MAAM,OAAO,KAAK;AAAA,IAC7B,CAAC;AACD,kBAAc,cAAc;AAE5B,UAAM,cAAc,MAAM,OAAO,qBAAqB;AAAA,MACpD,EAAE,OAAO,MAAM,OAAO,KAAK;AAAA,MAC3B,EAAE,OAAO,yBAAyB,OAAO,MAAM;AAAA,IACjD,GAAG,CAAC;AACJ,sBAAkB,gBAAgB;AAElC,UAAM,iBAAiB,MAAM,OAAO,wBAAwB;AAAA,MAC1D,EAAE,OAAO,uBAAuB,OAAO,IAAI;AAAA,MAC3C,EAAE,OAAO,gBAAgB,OAAO,KAAK;AAAA,MACrC,EAAE,OAAO,wBAAwB,OAAO,KAAK;AAAA,IAC/C,GAAG,CAAC;AACJ,kBAAc,SAAS,gBAAgB,EAAE;AAAA,EAC3C;AAEA,QAAM,IAAI,SAAS;AACnB,QAAM,UAAU,IAAI;AACpB,QAAMC,KAAID,OAAM,IAAI,SAAS;AAC7B,QAAME,KAAIF,OAAM,IAAI,SAAS;AAE7B,UAAQ,IAAI,EAAE;AACd,MAAI,CAAC,SAAS;AACZ,YAAQ,IAAI,OAAO,CAAC,CAAC;AACrB,YAAQ,IAAI,QAAQ,GAAGA,OAAM,KAAK,MAAM,WAAW,CAAC,CAAC;AAAA,EACvD,OAAO;AACL,YAAQ,IAAIA,OAAM,KAAK,MAAM,YAAY,CAAC;AAAA,EAC5C;AAEA,aAAW,CAAC,OAAO,KAAK,KAAK;AAAA,IAC3B,CAAC,OAAO,OAAO;AAAA,IACf,CAAC,YAAY,YAAY;AAAA,IACzB,CAAC,UAAUF,MAAK,QAAQ,MAAM,CAAC;AAAA,IAC/B,CAAC,gBAAgB,cAAc,QAAQ,IAAI;AAAA,IAC3C,CAAC,aAAa,kBAAkB,QAAQ,IAAI;AAAA,IAC5C,CAAC,eAAe,OAAO,WAAW,CAAC;AAAA,EACrC,GAAG;AACD,YAAQ,IAAI,OAAO,GAAG,OAAO,KAAK,CAAC;AAAA,EACrC;AAEA,MAAI,CAAC,SAAS;AACZ,YAAQ,IAAI,OAAO,CAAC,CAAC;AAAA,EACvB;AACA,UAAQ,IAAI,EAAE;AAEd,MAAI;AAEJ,MAAI,YAAY;AACd,UAAM,UAAkB,MAAM,KAAK,uBAAuB,GAAG;AAC7D,kBAAc,QAAQ,YAAY,EAAE,WAAW,GAAG;AAClD,QAAI,MAAM;AAAA,EACZ,OAAO;AACL,UAAM,aAAa,MAAM,OAAO,iBAAiB;AAAA,MAC/C,EAAE,OAAO,kBAAkB,OAAO,MAAM;AAAA,MACxC,EAAE,OAAO,UAAU,OAAO,KAAK;AAAA,IACjC,CAAC;AACD,kBAAc,eAAe;AAAA,EAC/B;AAEA,MAAI,CAAC,aAAa;AAChB,YAAQ,IAAI;AAAA,IAAOE,OAAM,OAAO,mBAAmB,CAAC;AAAA,CAAI;AACxD;AAAA,EACF;AAEA,UAAQ,IAAI,EAAE;AAEd,QAAM,EAAE,KAAAG,KAAI,IAAI,MAAM;AACtB,EAAAA,KAAI,cAAc;AAElB,QAAM,WAAW,IAAI,eAAe,SAASL,MAAK,QAAQ,MAAM,GAAG,YAAY;AAC/E,WAAS,cAAc;AACvB,QAAM,SAAS,IAAI,eAAe;AACpC;AA5LA;AAAA;AAAA;AAKA;AACA;AACA;AACA;AAEA;AAAA;AAAA;;;ACRA;AAFA,OAAOM,WAAU;AACjB,SAAS,OAAAC,YAAW;;;ACApB;AADA,OAAOC,YAAW;AAGX,SAAS,WAAiB;AAC/B,aAAW;AAEX,UAAQ,IAAIA,OAAM,MAAM,KAAK,WAAW,CAAC;AACvC,UAAQ,IAAI,OAAOA,OAAM,IAAI,SAAS,EAAE,eAAe,CAAC,IAAIA,OAAM,OAAO,OAAO,CAAC,IAAIA,OAAM,KAAK,cAAc,CAAC,EAAE;AACjH,UAAQ,IAAI,OAAOA,OAAM,IAAI,SAAS,EAAE,SAAS,CAAC,YAAYA,OAAM,OAAO,OAAO,CAAC,IAAIA,OAAM,KAAK,cAAc,CAAC,EAAE;AAErH,UAAQ,IAAI,EAAE;AACd,UAAQ,IAAIA,OAAM,MAAM,KAAK,aAAa,CAAC;AAE3C,QAAM,OAAgC;AAAA,IACpC,CAAC,WAAW,wCAAwC;AAAA,IACpD,CAAC,kBAAkB,sCAAsC;AAAA,IACzD,CAAC,cAAc,4BAA4B;AAAA,IAC3C,CAAC,iBAAiB,2CAA2C;AAAA,IAC7D,CAAC,cAAc,wBAAwB;AAAA,EACzC;AAEA,aAAW,CAAC,MAAM,IAAI,KAAK,MAAM;AAC/B,YAAQ,IAAI,OAAOA,OAAM,MAAM,KAAK,OAAO,EAAE,CAAC,CAAC,IAAIA,OAAM,MAAM,IAAI,CAAC,EAAE;AAAA,EACxE;AAEA,UAAQ,IAAI,EAAE;AACd,UAAQ,IAAIA,OAAM,MAAM,KAAK,yBAAyB,CAAC;AAEvD,QAAM,YAAqC;AAAA,IACzC,CAAC,UAAU,sDAAsD;AAAA,IACjE,CAAC,WAAW,oCAAoC;AAAA,IAChD,CAAC,OAAO,qDAAqD;AAAA,EAC/D;AAEA,aAAW,CAAC,MAAM,IAAI,KAAK,WAAW;AACpC,YAAQ,IAAI,OAAOA,OAAM,IAAI,SAAS,EAAE,KAAK,OAAO,EAAE,CAAC,CAAC,IAAIA,OAAM,KAAK,IAAI,CAAC,EAAE;AAAA,EAChF;AAEA,UAAQ,IAAI,EAAE;AACd,UAAQ,IAAIA,OAAM,MAAM,KAAK,cAAc,CAAC;AAC1C,UAAQ,IAAI,OAAOA,OAAM,KAAK,GAAG,CAAC,IAAIA,OAAM,IAAI,SAAS,EAAE,eAAe,CAAC,IAAIA,OAAM,OAAO,2BAA2B,CAAC,EAAE;AAC1H,UAAQ,IAAI,OAAOA,OAAM,KAAK,GAAG,CAAC,IAAIA,OAAM,IAAI,SAAS,EAAE,eAAe,CAAC,IAAIA,OAAM,OAAO,2BAA2B,CAAC,EAAE;AAC1H,UAAQ,IAAI,OAAOA,OAAM,KAAK,GAAG,CAAC,IAAIA,OAAM,IAAI,SAAS,EAAE,eAAe,CAAC,IAAIA,OAAM,OAAO,kCAAkC,CAAC,EAAE;AACjI,UAAQ,IAAI,OAAOA,OAAM,KAAK,GAAG,CAAC,IAAIA,OAAM,IAAI,SAAS,EAAE,eAAe,CAAC,IAAIA,OAAM,MAAM,oBAAoB,CAAC,IAAIA,OAAM,OAAO,oBAAoB,CAAC,EAAE;AACxJ,UAAQ,IAAI,OAAOA,OAAM,KAAK,GAAG,CAAC,IAAIA,OAAM,IAAI,SAAS,EAAE,eAAe,CAAC,IAAIA,OAAM,MAAM,YAAY,CAAC,IAAIA,OAAM,OAAO,oBAAoB,CAAC,EAAE;AAChJ,UAAQ,IAAI,OAAOA,OAAM,KAAK,GAAG,CAAC,IAAIA,OAAM,IAAI,SAAS,EAAE,eAAe,CAAC,IAAIA,OAAM,MAAM,SAAS,CAAC,EAAE;AACvG,UAAQ,IAAI,OAAOA,OAAM,KAAK,GAAG,CAAC,IAAIA,OAAM,IAAI,SAAS,EAAE,eAAe,CAAC,IAAIA,OAAM,MAAM,uBAAuB,CAAC,EAAE;AACvH,UAAQ,IAAI,EAAE;AAChB;;;AD5CA;;;AEJA,OAAO,WAAW;AAElB,eAAsB,gBAAgB,gBAAgD;AACpF,SAAO,IAAI,QAAQ,CAAC,YAAY;AAC9B,UAAM,MAAM,MAAM;AAAA,MAChB;AAAA,MACA,EAAE,SAAS,IAAK;AAAA,MAChB,CAAC,QAAQ;AACP,YAAI,OAAO;AACX,YAAI,GAAG,QAAQ,CAAC,UAAW,QAAQ,KAAM;AACzC,YAAI,GAAG,OAAO,MAAM;AAClB,cAAI;AACF,kBAAM,OAAO,KAAK,MAAM,IAAI;AAC5B,kBAAM,SAAS,KAAK;AACpB,gBAAI,CAAC,OAAQ,QAAO,QAAQ,IAAI;AAChC,gBAAI,WAAW,eAAgB,QAAO,QAAQ,MAAM;AACpD,oBAAQ,IAAI;AAAA,UACd,QAAQ;AACN,oBAAQ,IAAI;AAAA,UACd;AAAA,QACF,CAAC;AAAA,MACH;AAAA,IACF;AACA,QAAI,GAAG,SAAS,MAAM,QAAQ,IAAI,CAAC;AACnC,QAAI,GAAG,WAAW,MAAM;AACtB,UAAI,QAAQ;AACZ,cAAQ,IAAI;AAAA,IACd,CAAC;AAAA,EACH,CAAC;AACH;;;AFrBA,IAAM,UAAU,gBAAI;AAEpB,SAAS,YAAY,MAAgB,MAA6B;AAChE,QAAM,MAAc,KAAK,QAAQ,IAAI;AACrC,MAAI,QAAQ,MAAM,MAAM,KAAK,KAAK,OAAQ,QAAO;AACjD,QAAM,QAAgB,KAAK,MAAM,CAAC;AAClC,OAAK,OAAO,KAAK,CAAC;AAClB,SAAO;AACT;AAEA,SAAS,QAAQ,MAAgB,MAAuB;AACtD,QAAM,MAAc,KAAK,QAAQ,IAAI;AACrC,MAAI,QAAQ,GAAI,QAAO;AACvB,OAAK,OAAO,KAAK,CAAC;AAClB,SAAO;AACT;AAEA,eAAe,OAAsB;AACnC,QAAM,OAAiB,QAAQ,KAAK,MAAM,CAAC;AAE3C,MAAI,KAAK,SAAS,WAAW,KAAK,KAAK,SAAS,IAAI,GAAG;AACrD,YAAQ,IAAI,OAAO;AACnB,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,MAAI,KAAK,SAAS,SAAS,GAAG;AAC5B,UAAMC,WAAS,MAAM,OAAO,OAAO,GAAG;AACtC,eAAW;AACX,YAAQ,IAAI,KAAKA,QAAM,MAAM,KAAK,eAAe,CAAC,KAAKA,QAAM,KAAK,IAAI,gBAAI,OAAO,EAAE,CAAC,EAAE;AACtF,YAAQ,IAAI,KAAKA,QAAM,MAAM,gBAAI,WAAW,CAAC;AAAA,CAAI;AACjD,YAAQ,IAAI,KAAKA,QAAM,MAAM,KAAK,QAAQ,CAAC,QAAQA,QAAM,IAAI,SAAS,EAAE,iBAAiB,CAAC,EAAE;AAC5F,YAAQ,IAAI,KAAKA,QAAM,MAAM,KAAK,WAAW,CAAC,KAAKA,QAAM,UAAU,IAAI,SAAS,EAAE,6BAA6B,CAAC,EAAE;AAClH,YAAQ,IAAI,KAAKA,QAAM,MAAM,KAAK,QAAQ,CAAC,QAAQA,QAAM,UAAU,IAAI,SAAS,EAAE,gBAAI,WAAW,IAAI,QAAQ,QAAQ,EAAE,EAAE,QAAQ,QAAQ,EAAE,CAAC,CAAC,EAAE;AAC/I,YAAQ,IAAI,KAAKA,QAAM,MAAM,KAAK,KAAK,CAAC,WAAWA,QAAM,UAAU,IAAI,SAAS,EAAE,iCAAiC,gBAAI,IAAI,EAAE,CAAC,EAAE;AAChI,YAAQ,IAAI,KAAKA,QAAM,MAAM,KAAK,SAAS,CAAC,OAAOA,QAAM,MAAM,gBAAI,OAAO,CAAC,EAAE;AAC7E,YAAQ,IAAI,KAAKA,QAAM,MAAM,KAAK,MAAM,CAAC,UAAUA,QAAM,KAAK,KAAK,gBAAI,QAAQ,IAAI,EAAE,CAAC,EAAE;AACxF,YAAQ,IAAI,EAAE;AACd,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,kBAAgB,OAAO,EAAE,KAAK,CAAC,WAAW;AACxC,QAAI,CAAC,OAAQ;AACb,WAAO,OAAO,EAAE,KAAK,CAACA,YAAU;AAC9B,cAAQ,IAAI,EAAE;AACd,cAAQ;AAAA,QACN,KAAKA,QAAM,QAAQ,OAAO,QAAG,CAAC,sBAAsBA,QAAM,QAAQ,KAAK,OAAO,CAAC,WAAMA,QAAM,QAAQ,MAAM,MAAM,CAAC;AAAA,MAClH;AACA,cAAQ,IAAI,KAAKA,QAAM,QAAQ,IAAI,SAAS,EAAE,QAAQ,CAAC,IAAIA,QAAM,QAAQ,IAAI,SAAS,EAAE,+BAA+B,CAAC,EAAE;AAC1H,cAAQ,IAAI,EAAE;AAAA,IAChB,CAAC;AAAA,EACH,CAAC;AAED,MAAI,KAAK,SAAS,QAAQ,KAAK,KAAK,SAAS,IAAI,GAAG;AAClD,aAAS;AACT,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,MAAI,KAAK,SAAS,SAAS,GAAG;AAC5B,YAAQ,MAAM,SAAS;AACvB,UAAM,aAAsB,QAAQ,MAAM,eAAe;AACzD,UAAM,EAAE,UAAAC,UAAS,IAAI,MAAM;AAC3B,UAAMA,UAAS,UAAU;AACzB;AAAA,EACF;AAEA,MAAI,CAAC,KAAK,QAAQ;AAChB,UAAM,EAAE,UAAAA,UAAS,IAAI,MAAM;AAC3B,UAAMA,UAAS,KAAK;AACpB;AAAA,EACF;AAEA,QAAM,mBAAmB,YAAY,MAAM,YAAY;AACvD,QAAM,kBAA2B,QAAQ,MAAM,YAAY;AAE3D,aAAW;AAEX,QAAM,MAAc,KAAK,CAAC;AAE1B,MAAI;AACF,QAAIC,KAAI,GAAG;AAAA,EACb,QAAQ;AACN,UAAMF,WAAS,MAAM,OAAO,OAAO,GAAG;AACtC,YAAQ,IAAI,KAAKA,QAAM,IAAI,QAAG,CAAC,IAAIA,QAAM,IAAI,KAAK,cAAc,CAAC,IAAIA,QAAM,MAAM,GAAG,CAAC,EAAE;AACvF,YAAQ,IAAI,KAAKA,QAAM,KAAK,uCAAuC,CAAC;AAAA,CAAI;AACxE,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,QAAM,EAAE,gBAAAG,iBAAgB,kBAAAC,kBAAiB,IAAI,MAAM;AACnD,QAAM,EAAE,gBAAAC,gBAAe,IAAI,MAAM;AAEjC,QAAM,WAAW,oBAAoBA,gBAAe,GAAG,EAAE;AACzD,QAAM,aAAqBD,kBAAiB,KAAK,QAAwB;AACzE,QAAM,MAAc,KAAK,CAAC,KAAK,KAAK,UAAU;AAE9C,MAAI;AACF,UAAM,IAAID,gBAAe,KAAKG,MAAK,QAAQ,GAAG,GAAG,oBAAoB,MAAS,EAAE,IAAI,eAAe;AAAA,EACrG,SAAS,GAAG;AACV,UAAMN,WAAS,MAAM,OAAO,OAAO,GAAG;AACtC,YAAQ,IAAI;AAAA,IAAOA,QAAM,IAAI,QAAG,CAAC,IAAIA,QAAM,IAAI,KAAK,SAAS,CAAC,IAAIA,QAAM,MAAO,EAAY,OAAO,CAAC,EAAE;AACrG,YAAQ,IAAIA,QAAM,KAAM,EAAY,SAAS,EAAE,CAAC;AAChD,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF;AAEA,KAAK;","names":["URL","https","URL","chalk","FONT_EXTS","IMG_EXTS","FONT_EXTS","VIDEO_EXTS","path","init_download","fs","path","chalk","fs","path","chalk","G","G2","chalk","fs","path","chalk","init_download","chalk","stripAnsi","readline","stdin","stdout","path","URL","chalk","G","B","CFG","path","URL","chalk","chalk","runSetup","URL","FramerExporter","deriveOutputName","detectPlatform","path"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "framer-export",
|
|
3
|
-
"version": "4.3.
|
|
3
|
+
"version": "4.3.7",
|
|
4
4
|
"description": "Export any Framer, Webflow, or Wix site into a fully working local mirror. Downloads all assets, strips badges, rewrites URLs, and pretty-prints JS.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/cli/index.js",
|