jimeng-cli 0.2.1 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/chunk-2IIK4X7C.js +10228 -0
- package/dist/chunk-2IIK4X7C.js.map +1 -0
- package/dist/cli/index.cjs +6313 -415
- package/dist/cli/index.cjs.map +1 -1
- package/dist/cli/index.js +406 -5
- package/dist/cli/index.js.map +1 -1
- package/dist/mcp/index.cjs +5981 -376
- package/dist/mcp/index.cjs.map +1 -1
- package/dist/mcp/index.js +111 -1
- package/dist/mcp/index.js.map +1 -1
- package/package.json +11 -16
- package/dist/chunk-3SUCLOAC.js +0 -4702
- package/dist/chunk-3SUCLOAC.js.map +0 -1
package/dist/cli/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/cli/app.ts","../../src/cli/token-commands.ts","../../src/cli/query-commands.ts","../../src/cli/media-commands.ts","../../src/cli/video-input.ts","../../src/cli/index.ts"],"sourcesContent":["import process from \"node:process\";\n\nimport config from \"@/lib/config.ts\";\nimport logger from \"@/lib/logger.ts\";\nimport tokenPool from \"@/lib/session-pool.ts\";\nimport {\n parseRegionCode,\n type RegionCode\n} from \"@/api/controllers/core.ts\";\nimport {\n createTokenSubcommands,\n type TokenSubcommandDef,\n type TokenSubcommandName\n} from \"@/cli/token-commands.ts\";\nimport { createQueryCommandHandlers } from \"@/cli/query-commands.ts\";\nimport { createMediaCommandHandlers } from \"@/cli/media-commands.ts\";\n\ntype JsonRecord = Record<string, unknown>;\ntype CliHandler = (argv: string[]) => Promise<void>;\ntype UsageSection = { title: string; lines: string[] };\n\nconst JSON_OPTION = \" --json Output structured JSON\";\nconst HELP_OPTION = \" --help Show help\";\n\nfunction buildUsageText(\n usageLine: string,\n options: string[],\n sections?: UsageSection[]\n): string {\n const lines = [\n \"Usage:\",\n usageLine,\n \"\",\n \"Options:\",\n ...options,\n ];\n if (sections && sections.length > 0) {\n for (const section of sections) {\n lines.push(\"\", section.title, ...section.lines);\n }\n }\n return lines.join(\"\\n\");\n}\n\nfunction usageRoot(): string {\n const commandLines = ROOT_COMMAND_ENTRIES.map(\n (entry) => ` ${entry.path.padEnd(32)}${entry.description}`\n );\n return [\n \"Usage:\",\n \" jimeng <command> [subcommand] [options]\",\n \"\",\n \"Commands:\",\n ...commandLines,\n \"\",\n ...ROOT_HELP_HINT_LINES,\n ].join(\"\\n\");\n}\n\nfunction usageModelsList(): string {\n return buildUsageText(\" jimeng models list [options]\", [\n \" --region <region> X-Region header, default cn (cn/us/hk/jp/sg)\",\n \" --verbose Print rich model fields\",\n \" --json Print full JSON response\",\n HELP_OPTION,\n ]);\n}\n\nfunction usageTokenSubcommand(name: TokenSubcommandName): string {\n const subcommand = TOKEN_SUBCOMMANDS_BY_NAME[name];\n return buildUsageText(subcommand.usageLine, subcommand.options, subcommand.sections);\n}\n\nfunction usageTokenRoot(): string {\n const subcommandLines = TOKEN_SUBCOMMANDS.map(\n (subcommand) => ` ${subcommand.name.padEnd(24)}${subcommand.description}`\n );\n return [\n \"Usage:\",\n \" jimeng token <subcommand> [options]\",\n \"\",\n \"Subcommands:\",\n ...subcommandLines,\n \"\",\n \"Run `jimeng token <subcommand> --help` for details.\",\n ].join(\"\\n\");\n}\n\nfunction usageImageGenerate(): string {\n return buildUsageText(\" jimeng image generate --prompt <text> [options]\", [\n \" --token <token> Optional, override token-pool selection\",\n \" --region <region> X-Region header, default cn (cn/us/hk/jp/sg)\",\n \" --prompt <text> Required\",\n \" --model <model> Default jimeng-4.5\",\n \" --ratio <ratio> Default 1:1\",\n \" --resolution <res> Default 2k\",\n \" --negative-prompt <text> Optional\",\n \" --sample-strength <num> Optional, 0-1\",\n \" --intelligent-ratio Optional, enable intelligent ratio\",\n \" --wait / --no-wait Default wait; --no-wait returns task only\",\n \" --wait-timeout-seconds Optional wait timeout override\",\n \" --poll-interval-ms Optional poll interval override\",\n JSON_OPTION,\n \" --output-dir <dir> Default ./pic/cli-image-generate\",\n HELP_OPTION,\n ]);\n}\n\nfunction usageImageEdit(): string {\n return buildUsageText(\n \" jimeng image edit --prompt <text> --image <path_or_url> [--image <path_or_url> ...] [options]\",\n [\n \" --token <token> Optional, override token-pool selection\",\n \" --region <region> X-Region header, default cn (cn/us/hk/jp/sg)\",\n \" --prompt <text> Required\",\n \" --image <path_or_url> Required, can be repeated (1-10)\",\n \" --model <model> Default jimeng-4.5\",\n \" --ratio <ratio> Default 1:1\",\n \" --resolution <res> Default 2k\",\n \" --negative-prompt <text> Optional\",\n \" --sample-strength <num> Optional, 0-1\",\n \" --intelligent-ratio Optional, enable intelligent ratio\",\n \" --wait / --no-wait Default wait; --no-wait returns task only\",\n \" --wait-timeout-seconds Optional wait timeout override\",\n \" --poll-interval-ms Optional poll interval override\",\n JSON_OPTION,\n \" --output-dir <dir> Default ./pic/cli-image-edit\",\n HELP_OPTION,\n ],\n [\n {\n title: \"Notes:\",\n lines: [\" - Image sources must be all local files or all URLs in one command.\"],\n },\n ]\n );\n}\n\nfunction usageVideoGenerate(): string {\n return buildUsageText(\" jimeng video generate --prompt <text> [options]\", [\n \" --token <token> Optional, override token-pool selection\",\n \" --region <region> X-Region header, default cn (cn/us/hk/jp/sg)\",\n \" --prompt <text> Required\",\n \" --mode <mode> Optional, text_to_video (default), image_to_video, first_last_frames, or omni_reference\",\n \" --image-file <input> Image input, can be repeated (path or URL)\",\n \" --video-file <input> Video input, can be repeated (path or URL, omni only)\",\n \" --image-file-1 <input> Explicit image slot (1-9) for omni_reference\",\n \" --image-file-2 ... -9 More explicit image slots for omni_reference\",\n \" --video-file-1 <input> Explicit video slot (1-3) for omni_reference\",\n \" --video-file-2 ... -3 More explicit video slots for omni_reference\",\n \" --model <model> Default jimeng-video-3.0 (jimeng-video-seedance-2.0-fast in omni_reference)\",\n \" --ratio <ratio> Default 1:1\",\n \" --resolution <res> Default 720p\",\n \" --duration <seconds> Default 5\",\n \" --wait / --no-wait Default wait; --no-wait returns task only\",\n \" --wait-timeout-seconds Optional wait timeout override\",\n \" --poll-interval-ms Optional poll interval override\",\n JSON_OPTION,\n \" --output-dir <dir> Default ./pic/cli-video-generate\",\n HELP_OPTION,\n ], [\n {\n title: \"Examples:\",\n lines: [\n \" jimeng video generate --mode text_to_video --prompt \\\"A fox runs in snow\\\"\",\n \" jimeng video generate --mode image_to_video --prompt \\\"Camera slowly pushes in\\\" --image-file ./first.png\",\n \" jimeng video generate --mode first_last_frames --prompt \\\"Transition day to night\\\" --image-file ./first.png --image-file ./last.png\",\n \" jimeng video generate --mode omni_reference --model jimeng-video-seedance-2.0-fast --prompt \\\"Use @image_file_1 for character and @video_file_1 for motion\\\" --image-file ./character.png --video-file ./motion.mp4\",\n ],\n },\n {\n title: \"Notes:\",\n lines: [\n \" - text_to_video: no image/video input allowed.\",\n \" - image_to_video: exactly 1 --image-file input, no --video-file.\",\n \" - first_last_frames: 1-2 --image-file inputs, no --video-file.\",\n \" - omni_reference: 1-9 images and 0-3 videos (at least one material).\",\n \" - omni_reference supports model jimeng-video-seedance-2.0 or jimeng-video-seedance-2.0-fast.\",\n \" - Use @image_file_N / @video_file_N in prompt for omni_reference.\",\n ],\n },\n ]);\n}\n\nfunction usageTaskGet(): string {\n return buildUsageText(\" jimeng task get --task-id <id> [options]\", [\n \" --token <token> Optional, override token-pool selection\",\n \" --region <region> X-Region header, default cn (cn/us/hk/jp/sg)\",\n \" --task-id <id> Required history/task id\",\n \" --type <type> Optional image or video\",\n \" --response-format <fmt> Optional url or b64_json\",\n JSON_OPTION,\n HELP_OPTION,\n ]);\n}\n\nfunction usageTaskWait(): string {\n return buildUsageText(\" jimeng task wait --task-id <id> [options]\", [\n \" --token <token> Optional, override token-pool selection\",\n \" --region <region> X-Region header, default cn (cn/us/hk/jp/sg)\",\n \" --task-id <id> Required history/task id\",\n \" --type <type> Optional image or video\",\n \" --response-format <fmt> Optional url or b64_json\",\n \" --wait-timeout-seconds Optional wait timeout override\",\n \" --poll-interval-ms Optional poll interval override\",\n JSON_OPTION,\n HELP_OPTION,\n ]);\n}\n\nfunction configureCliLogging(command: string | undefined): void {\n if (process.env.JIMENG_CLI_VERBOSE_LOGS === \"true\") {\n process.env.JIMENG_CLI_SILENT_LOGS = \"false\";\n return;\n }\n process.env.JIMENG_CLI_SILENT_LOGS = \"true\";\n config.system.log_level = \"fatal\";\n config.system.debug = false;\n config.system.requestLog = false;\n logger.info = () => undefined;\n logger.debug = () => undefined;\n logger.warn = () => undefined;\n logger.error = () => undefined;\n console.info = () => undefined;\n console.debug = () => undefined;\n console.warn = () => undefined;\n}\n\nfunction fail(message: string): never {\n throw new Error(message);\n}\n\nfunction failWithUsage(reason: string, usage: string): never {\n fail(`${reason}\\n\\n${usage}`);\n}\n\nfunction getSingleString(args: Record<string, unknown>, key: string): string | undefined {\n const raw = args[key];\n if (typeof raw === \"string\" && raw.trim().length > 0) return raw.trim();\n return undefined;\n}\n\nfunction getRegionWithDefault(args: Record<string, unknown>): string {\n return getSingleString(args, \"region\") || \"cn\";\n}\n\nfunction toStringList(raw: unknown): string[] {\n if (typeof raw === \"string\") return raw.split(\",\").map((item) => item.trim()).filter(Boolean);\n if (Array.isArray(raw)) {\n return raw\n .flatMap((item) => (typeof item === \"string\" ? item.split(\",\") : []))\n .map((item) => item.trim())\n .filter(Boolean);\n }\n return [];\n}\n\nlet tokenPoolReady = false;\nasync function ensureTokenPoolReady(): Promise<void> {\n if (tokenPoolReady) return;\n await tokenPool.init();\n tokenPoolReady = true;\n}\n\nfunction parseRegionOrFail(region: string | undefined): RegionCode | undefined {\n if (!region) return undefined;\n const parsed = parseRegionCode(region);\n if (!parsed) fail(\"Invalid --region. Use cn/us/hk/jp/sg.\");\n return parsed;\n}\n\nasync function pickDirectTokenForGeneration(\n token: string | undefined,\n region: string | undefined,\n requestedModel: string,\n taskType: \"image\" | \"video\",\n requiredCapabilityTags: string[] = []\n): Promise<{ token: string; region: RegionCode }> {\n await ensureTokenPoolReady();\n const tokenPick = tokenPool.pickTokenForRequest({\n authorization: token ? `Bearer ${token}` : undefined,\n requestedModel,\n taskType,\n requiredCapabilityTags,\n xRegion: region,\n });\n if (!tokenPick.token || !tokenPick.region) {\n fail(tokenPick.reason || \"No direct token available. Provide --token and --region, or configure token-pool.\");\n }\n return { token: tokenPick.token, region: tokenPick.region };\n}\n\nasync function pickDirectTokenForTask(\n token: string | undefined,\n region: string | undefined\n): Promise<{ token: string; region: RegionCode }> {\n await ensureTokenPoolReady();\n const parsedRegion = parseRegionOrFail(region);\n\n if (token) {\n const fromPool = tokenPool.getTokenEntry(token)?.region;\n const finalRegion = parsedRegion || fromPool;\n if (!finalRegion) {\n fail(\"Missing region for direct task mode. Provide --region or register token region in token-pool.\");\n }\n return { token, region: finalRegion };\n }\n\n const candidates = tokenPool\n .getEntries(false)\n .filter((item) => item.enabled && item.live !== false && item.region)\n .filter((item) => (parsedRegion ? item.region === parsedRegion : true));\n if (candidates.length === 0) {\n fail(\"No token available for direct task mode. Provide --token --region or configure token-pool.\");\n }\n return { token: candidates[0].token, region: candidates[0].region! };\n}\n\nfunction unwrapBody(payload: unknown): unknown {\n if (!payload || typeof payload !== \"object\") return payload;\n const body = payload as JsonRecord;\n if (\"data\" in body && (\"code\" in body || \"message\" in body)) {\n return body.data;\n }\n return payload;\n}\n\nfunction printJson(value: unknown): void {\n console.log(JSON.stringify(value, null, 2));\n}\n\nfunction printCommandJson(\n command: string,\n data: unknown,\n meta?: JsonRecord\n): void {\n const payload: JsonRecord = {\n object: \"jimeng_cli_result\",\n command,\n data,\n };\n if (meta && Object.keys(meta).length > 0) {\n payload.meta = meta;\n }\n printJson(payload);\n}\n\nfunction printDownloadSummary(kind: \"image\" | \"video\", files: string[]): void {\n const label = kind === \"image\" ? \"images\" : \"video\";\n console.log(`Downloaded ${files.length} ${label}.`);\n for (const file of files) {\n console.log(`- ${file}`);\n }\n}\n\nfunction isHelpKeyword(value: string | undefined): boolean {\n return value === \"--help\" || value === \"-h\" || value === \"help\";\n}\n\nconst TOKEN_SUBCOMMANDS: TokenSubcommandDef[] = createTokenSubcommands({\n getUsage: (name) => usageTokenSubcommand(name),\n getSingleString,\n getRegionWithDefault,\n toStringList,\n parseRegionOrFail,\n ensureTokenPoolReady,\n fail,\n failWithUsage,\n printJson,\n printCommandJson,\n unwrapBody,\n jsonOption: JSON_OPTION,\n helpOption: HELP_OPTION,\n});\n\nconst queryHandlers = createQueryCommandHandlers({\n usageModelsList,\n usageTaskGet,\n usageTaskWait,\n getSingleString,\n getRegionWithDefault,\n parseRegionOrFail,\n ensureTokenPoolReady,\n pickDirectTokenForTask,\n fail,\n printJson,\n printCommandJson,\n unwrapBody,\n});\n\nconst mediaHandlers = createMediaCommandHandlers({\n usageImageGenerate,\n usageImageEdit,\n usageVideoGenerate,\n getSingleString,\n getRegionWithDefault,\n toStringList,\n fail,\n failWithUsage,\n pickDirectTokenForGeneration,\n printCommandJson,\n printDownloadSummary,\n printTaskInfo: (task) => queryHandlers.printTaskInfo(task),\n});\n\nconst TOKEN_SUBCOMMANDS_BY_NAME: Record<TokenSubcommandName, TokenSubcommandDef> = Object.fromEntries(\n TOKEN_SUBCOMMANDS.map((subcommand) => [subcommand.name, subcommand])\n) as Record<TokenSubcommandName, TokenSubcommandDef>;\n\nfunction buildHandlersMap(\n subcommands: Array<{ name: string; handler: CliHandler }>\n): Record<string, CliHandler> {\n return Object.fromEntries(subcommands.map((item) => [item.name, item.handler]));\n}\n\ntype CommandSubcommandDef = {\n name: string;\n description: string;\n handler: CliHandler;\n};\n\ntype CommandSpec = {\n name: string;\n description: string;\n handler?: CliHandler;\n subcommands?: CommandSubcommandDef[];\n usage?: () => string;\n showAsGrouped?: boolean;\n};\n\nconst COMMAND_SPECS: CommandSpec[] = [\n {\n name: \"models\",\n description: \"Model commands\",\n subcommands: [{ name: \"list\", description: \"List available models\", handler: queryHandlers.handleModelsList }],\n usage: usageRoot,\n },\n {\n name: \"image\",\n description: \"Image commands\",\n subcommands: [\n { name: \"generate\", description: \"Generate image from text\", handler: mediaHandlers.handleImageGenerate },\n { name: \"edit\", description: \"Edit image(s) with prompt\", handler: mediaHandlers.handleImageEdit },\n ],\n usage: usageRoot,\n },\n {\n name: \"video\",\n description: \"Video commands\",\n subcommands: [\n {\n name: \"generate\",\n description: \"Generate video from multimodal references\",\n handler: mediaHandlers.handleVideoGenerate,\n },\n ],\n usage: usageRoot,\n },\n {\n name: \"task\",\n description: \"Task commands\",\n subcommands: [\n { name: \"get\", description: \"Get task status\", handler: queryHandlers.handleTaskGet },\n { name: \"wait\", description: \"Wait until task completion\", handler: queryHandlers.handleTaskWait },\n ],\n usage: usageRoot,\n },\n {\n name: \"token\",\n description: \"Token management commands\",\n subcommands: TOKEN_SUBCOMMANDS.map((subcommand) => ({\n name: subcommand.name,\n description: subcommand.description,\n handler: subcommand.handler,\n })),\n usage: usageTokenRoot,\n showAsGrouped: true,\n },\n];\n\nconst COMMAND_SPECS_BY_NAME: Record<string, CommandSpec> = Object.fromEntries(\n COMMAND_SPECS.map((spec) => [spec.name, spec])\n);\n\nconst ROOT_COMMAND_ENTRIES: Array<{ path: string; description: string }> = COMMAND_SPECS.flatMap((spec) => {\n if (spec.handler) {\n return [{ path: spec.name, description: spec.description }];\n }\n if (!spec.subcommands || spec.subcommands.length === 0) {\n return [{ path: spec.name, description: spec.description }];\n }\n if (spec.showAsGrouped) {\n return [{ path: `${spec.name} <subcommand>`, description: spec.description }];\n }\n return spec.subcommands.map((subcommand) => ({\n path: `${spec.name} ${subcommand.name}`,\n description: subcommand.description,\n }));\n});\n\nconst ROOT_HELP_HINT_LINES: string[] = [\n \"Run `jimeng <command> --help` for command details.\",\n ...COMMAND_SPECS\n .filter((spec) => spec.showAsGrouped)\n .map((spec) => `Run \\`jimeng ${spec.name} --help\\` for ${spec.name} subcommands.`),\n];\n\nasync function dispatchSubcommand(\n subcommand: string | undefined,\n argv: string[],\n handlers: Record<string, CliHandler>,\n usage: string,\n unknownLabel: string\n): Promise<boolean> {\n if (!subcommand || isHelpKeyword(subcommand)) {\n console.log(usage);\n return true;\n }\n const handler = handlers[subcommand];\n if (!handler) {\n failWithUsage(`Unknown ${unknownLabel}: ${subcommand}`, usage);\n }\n await handler(argv);\n return true;\n}\n\nasync function run(): Promise<void> {\n const [command, subcommand, ...rest] = process.argv.slice(2);\n configureCliLogging(command);\n\n if (!command || isHelpKeyword(command)) {\n console.log(usageRoot());\n return;\n }\n const spec = COMMAND_SPECS_BY_NAME[command];\n if (!spec) {\n failWithUsage(`Unknown command: ${[command, subcommand].filter(Boolean).join(\" \")}`, usageRoot());\n }\n\n if (spec.handler) {\n await spec.handler(rest);\n return;\n }\n\n if (spec.subcommands) {\n const handlers = buildHandlersMap(spec.subcommands);\n if (\n await dispatchSubcommand(\n subcommand,\n process.argv.slice(3),\n handlers,\n spec.usage ? spec.usage() : usageRoot(),\n `${command} subcommand`\n )\n ) {\n return;\n }\n }\n\n failWithUsage(`Unknown command: ${[command, subcommand].filter(Boolean).join(\" \")}`, usageRoot());\n}\n\nexport function runCli(): void {\n run().catch((error) => {\n const message = error instanceof Error ? error.message : String(error);\n const isJson = process.argv.includes(\"--json\");\n if (isJson) {\n printCommandJson(\"error\", { message });\n } else {\n console.error(`Error: ${message}`);\n }\n process.exit(1);\n });\n}\n","import { constants as fsConstants } from \"node:fs\";\nimport path from \"node:path\";\nimport { access, readFile } from \"node:fs/promises\";\n\nimport minimist from \"minimist\";\n\nimport {\n buildRegionInfo,\n getCredit,\n getTokenLiveStatus,\n receiveCredit,\n type RegionCode\n} from \"@/api/controllers/core.ts\";\nimport tokenPool from \"@/lib/session-pool.ts\";\n\ntype JsonRecord = Record<string, unknown>;\ntype CliHandler = (argv: string[]) => Promise<void>;\ntype UsageSection = { title: string; lines: string[] };\n\nexport type TokenSubcommandName =\n | \"list\"\n | \"check\"\n | \"points\"\n | \"receive\"\n | \"add\"\n | \"remove\"\n | \"enable\"\n | \"disable\"\n | \"pool\"\n | \"pool-check\"\n | \"pool-reload\";\n\nexport type TokenSubcommandDef = {\n name: TokenSubcommandName;\n description: string;\n usageLine: string;\n options: string[];\n sections?: UsageSection[];\n handler: CliHandler;\n};\n\ntype TokenCommandDeps = {\n getUsage: (name: TokenSubcommandName) => string;\n getSingleString: (args: Record<string, unknown>, key: string) => string | undefined;\n getRegionWithDefault: (args: Record<string, unknown>) => string;\n toStringList: (raw: unknown) => string[];\n parseRegionOrFail: (region: string | undefined) => RegionCode | undefined;\n ensureTokenPoolReady: () => Promise<void>;\n fail: (message: string) => never;\n failWithUsage: (reason: string, usage: string) => never;\n printJson: (value: unknown) => void;\n printCommandJson: (command: string, data: unknown, meta?: JsonRecord) => void;\n unwrapBody: (payload: unknown) => unknown;\n jsonOption: string;\n helpOption: string;\n};\n\nfunction maskToken(token: string): string {\n const n = token.length;\n if (n <= 10) return \"***\";\n return `${token.slice(0, 4)}...${token.slice(-4)}`;\n}\n\nfunction formatUnixMs(value: unknown): string {\n if (typeof value !== \"number\" || !Number.isFinite(value) || value <= 0) return \"-\";\n return new Date(value).toISOString();\n}\n\nfunction printTokenEntriesTable(items: unknown[]): void {\n if (items.length === 0) {\n console.log(\"(empty)\");\n return;\n }\n console.log(\"token\\tregion\\tenabled\\tlive\\tlastCredit\\tlastCheckedAt\\tfailures\");\n for (const item of items) {\n if (!item || typeof item !== \"object\") continue;\n const entry = item as JsonRecord;\n const token = typeof entry.token === \"string\" ? entry.token : \"-\";\n const region = typeof entry.region === \"string\" ? entry.region : \"-\";\n const enabled = typeof entry.enabled === \"boolean\" ? String(entry.enabled) : \"-\";\n const live = typeof entry.live === \"boolean\" ? String(entry.live) : \"-\";\n const lastCredit = typeof entry.lastCredit === \"number\" ? String(entry.lastCredit) : \"-\";\n const lastCheckedAt = formatUnixMs(entry.lastCheckedAt);\n const failures =\n typeof entry.consecutiveFailures === \"number\" ? String(entry.consecutiveFailures) : \"-\";\n console.log(`${token}\\t${region}\\t${enabled}\\t${live}\\t${lastCredit}\\t${lastCheckedAt}\\t${failures}`);\n }\n}\n\nfunction buildTokenPoolSnapshot(): { summary: unknown; items: unknown[] } {\n return {\n summary: tokenPool.getSummary(),\n items: tokenPool.getEntries(true),\n };\n}\n\nasync function pathExists(filePath: string): Promise<boolean> {\n try {\n await access(filePath, fsConstants.F_OK);\n return true;\n } catch {\n return false;\n }\n}\n\nasync function readTokensFromFile(filePathArg: string, deps: Pick<TokenCommandDeps, \"fail\">): Promise<string[]> {\n const filePath = path.resolve(filePathArg);\n if (!(await pathExists(filePath))) {\n deps.fail(`Token file not found: ${filePath}`);\n }\n return (await readFile(filePath, \"utf8\"))\n .split(/\\r?\\n/)\n .map((line) => line.trim())\n .filter((line) => line.length > 0 && !line.startsWith(\"#\"));\n}\n\nasync function collectTokensFromArgs(\n args: Record<string, unknown>,\n usage: string,\n deps: Pick<TokenCommandDeps, \"toStringList\" | \"getSingleString\" | \"fail\">,\n required = false\n): Promise<string[]> {\n const tokens = [...deps.toStringList(args.token)];\n const tokenFile = deps.getSingleString(args, \"token-file\");\n if (tokenFile) {\n tokens.push(...(await readTokensFromFile(tokenFile, deps)));\n }\n const deduped = Array.from(new Set(tokens));\n if (required && deduped.length === 0) {\n deps.fail(`No tokens provided.\\n\\n${usage}`);\n }\n return deduped;\n}\n\nexport function createTokenSubcommands(deps: TokenCommandDeps): TokenSubcommandDef[] {\n const handleTokenCheck: CliHandler = async (argv) => {\n const args = minimist(argv, {\n string: [\"token\", \"token-file\", \"region\"],\n boolean: [\"help\", \"json\"],\n });\n const usage = deps.getUsage(\"check\");\n if (args.help) {\n console.log(usage);\n return;\n }\n const region = deps.getRegionWithDefault(args);\n const regionCode = deps.parseRegionOrFail(region);\n if (!regionCode) {\n deps.fail(\"Missing region. Use --region cn/us/hk/jp/sg.\");\n }\n const tokens = await collectTokensFromArgs(args, usage, deps, true);\n if (!args.json) {\n console.log(`Checking ${tokens.length} token(s)`);\n }\n\n await deps.ensureTokenPoolReady();\n let invalid = 0;\n let requestErrors = 0;\n const results: Array<{ token_masked: string; live?: boolean; error?: string }> = [];\n for (const token of tokens) {\n const masked = maskToken(token);\n try {\n const live = await getTokenLiveStatus(token, buildRegionInfo(regionCode));\n await tokenPool.syncTokenCheckResult(token, live);\n if (live === true) {\n if (!args.json) console.log(`[OK] ${masked} live=true`);\n } else {\n invalid += 1;\n if (!args.json) console.log(`[FAIL] ${masked} live=false`);\n }\n results.push({ token_masked: masked, live: live === true });\n } catch (error) {\n requestErrors += 1;\n const message = error instanceof Error ? error.message : String(error);\n if (!args.json) console.log(`[ERROR] ${masked} ${message}`);\n results.push({ token_masked: masked, error: message });\n }\n }\n if (args.json) {\n deps.printCommandJson(\"token.check\", results, {\n total: tokens.length,\n invalid,\n request_errors: requestErrors,\n });\n } else {\n console.log(`Summary: total=${tokens.length} invalid=${invalid} request_errors=${requestErrors}`);\n }\n if (requestErrors > 0) process.exit(3);\n if (invalid > 0) process.exit(2);\n };\n\n const handleTokenList: CliHandler = async (argv) => {\n const args = minimist(argv, {\n boolean: [\"help\", \"json\"],\n });\n const usage = deps.getUsage(\"list\");\n if (args.help) {\n console.log(usage);\n return;\n }\n await deps.ensureTokenPoolReady();\n const normalized = buildTokenPoolSnapshot();\n if (args.json) {\n deps.printCommandJson(\"token.list\", normalized);\n return;\n }\n const body = normalized && typeof normalized === \"object\" ? (normalized as JsonRecord) : {};\n const summary = body.summary;\n if (summary && typeof summary === \"object\") {\n console.log(\"Summary:\");\n deps.printJson(summary);\n }\n const items = Array.isArray(body.items) ? body.items : [];\n console.log(\"Entries:\");\n printTokenEntriesTable(items);\n };\n\n const handleTokenPointsOrReceive = async (\n argv: string[],\n action: \"points\" | \"receive\"\n ): Promise<void> => {\n const args = minimist(argv, {\n string: [\"token\", \"token-file\", \"region\"],\n boolean: [\"help\", \"json\"],\n });\n const usage = deps.getUsage(action);\n if (args.help) {\n console.log(usage);\n return;\n }\n const region = deps.getRegionWithDefault(args);\n const regionCode = deps.parseRegionOrFail(region);\n await deps.ensureTokenPoolReady();\n const tokens = await collectTokensFromArgs(args, usage, deps, false);\n const resolvedTokens = tokens.length > 0\n ? tokens.map((token) => {\n const entryRegion = tokenPool.getTokenEntry(token)?.region;\n const finalRegion = regionCode || entryRegion;\n if (!finalRegion) {\n deps.fail(`Missing region for token ${maskToken(token)}. Provide --region or register token region in token-pool.`);\n }\n return { token, region: finalRegion };\n })\n : tokenPool.getEntries(false)\n .filter((item) => item.enabled && item.live !== false && item.region)\n .filter((item) => (regionCode ? item.region === regionCode : true))\n .map((item) => ({ token: item.token, region: item.region! }));\n if (resolvedTokens.length === 0) {\n deps.fail(\"No token available. Provide --token or configure token-pool.\");\n }\n const payload = action === \"points\"\n ? await Promise.all(\n resolvedTokens.map(async (item) => ({\n token: item.token,\n points: await getCredit(item.token, buildRegionInfo(item.region)),\n }))\n )\n : await Promise.all(\n resolvedTokens.map(async (item) => {\n const currentCredit = await getCredit(item.token, buildRegionInfo(item.region));\n if (currentCredit.totalCredit <= 0) {\n try {\n await receiveCredit(item.token, buildRegionInfo(item.region));\n const updatedCredit = await getCredit(item.token, buildRegionInfo(item.region));\n return { token: item.token, credits: updatedCredit, received: true };\n } catch (error: any) {\n return {\n token: item.token,\n credits: currentCredit,\n received: false,\n error: error?.message || String(error),\n };\n }\n }\n return { token: item.token, credits: currentCredit, received: false };\n })\n );\n if (args.json) {\n deps.printCommandJson(`token.${action}`, payload);\n return;\n }\n deps.printJson(payload);\n };\n\n const handleTokenAddOrRemove = async (argv: string[], action: \"add\" | \"remove\"): Promise<void> => {\n const args = minimist(argv, {\n string: [\"token\", \"token-file\", \"region\"],\n boolean: [\"help\", \"json\"],\n });\n const usage = deps.getUsage(action);\n if (args.help) {\n console.log(usage);\n return;\n }\n const region = deps.getRegionWithDefault(args);\n await deps.ensureTokenPoolReady();\n const tokens = await collectTokensFromArgs(args, usage, deps, true);\n const regionCode = deps.parseRegionOrFail(region);\n const payload = action === \"add\"\n ? {\n ...(await tokenPool.addTokens(tokens, { defaultRegion: regionCode || undefined })),\n summary: tokenPool.getSummary(),\n }\n : {\n ...(await tokenPool.removeTokens(tokens)),\n summary: tokenPool.getSummary(),\n };\n if (args.json) {\n deps.printCommandJson(`token.${action}`, deps.unwrapBody(payload), { region });\n return;\n }\n deps.printJson(deps.unwrapBody(payload));\n };\n\n const handleTokenEnableOrDisable = async (argv: string[], action: \"enable\" | \"disable\"): Promise<void> => {\n const args = minimist(argv, {\n string: [\"token\"],\n boolean: [\"help\", \"json\"],\n });\n const usage = deps.getUsage(action);\n if (args.help) {\n console.log(usage);\n return;\n }\n const token = deps.getSingleString(args, \"token\");\n if (!token) {\n deps.failWithUsage(\"Missing required --token.\", usage);\n }\n await deps.ensureTokenPoolReady();\n const payload = {\n updated: await tokenPool.setTokenEnabled(token, action === \"enable\"),\n summary: tokenPool.getSummary(),\n };\n if (args.json) {\n deps.printCommandJson(`token.${action}`, deps.unwrapBody(payload));\n return;\n }\n deps.printJson(deps.unwrapBody(payload));\n };\n\n const handleTokenPool: CliHandler = async (argv) => {\n const args = minimist(argv, {\n boolean: [\"help\", \"json\"],\n });\n const usage = deps.getUsage(\"pool\");\n if (args.help) {\n console.log(usage);\n return;\n }\n await deps.ensureTokenPoolReady();\n const normalized = buildTokenPoolSnapshot();\n if (args.json) {\n deps.printCommandJson(\"token.pool\", normalized);\n return;\n }\n const body = normalized && typeof normalized === \"object\" ? (normalized as JsonRecord) : {};\n console.log(\"Summary:\");\n deps.printJson(body.summary ?? {});\n console.log(\"Entries:\");\n printTokenEntriesTable(Array.isArray(body.items) ? body.items : []);\n };\n\n const handleTokenPoolCheckOrReload = async (\n argv: string[],\n action: \"pool-check\" | \"pool-reload\"\n ): Promise<void> => {\n const args = minimist(argv, {\n boolean: [\"help\", \"json\"],\n });\n const usage = deps.getUsage(action);\n if (args.help) {\n console.log(usage);\n return;\n }\n await deps.ensureTokenPoolReady();\n const payload = action === \"pool-check\"\n ? {\n ...(await tokenPool.runHealthCheck()),\n summary: tokenPool.getSummary(),\n }\n : (await tokenPool.reloadFromDisk(), {\n reloaded: true,\n summary: tokenPool.getSummary(),\n items: buildTokenPoolSnapshot().items,\n });\n if (args.json) {\n deps.printCommandJson(`token.${action}`, deps.unwrapBody(payload));\n return;\n }\n deps.printJson(deps.unwrapBody(payload));\n };\n\n return [\n {\n name: \"list\",\n description: \"List token pool entries\",\n usageLine: \" jimeng token list [options]\",\n options: [deps.jsonOption, deps.helpOption],\n handler: handleTokenList,\n },\n {\n name: \"check\",\n description: \"Validate tokens directly\",\n usageLine: \" jimeng token check --token <token> [--token <token> ...] [options]\",\n options: [\n \" --token <token> Token, can be repeated\",\n \" --token-file <path> Read tokens from file (one per line, # for comments)\",\n \" --region <region> X-Region, default cn (cn/us/hk/jp/sg)\",\n deps.jsonOption,\n deps.helpOption,\n ],\n handler: handleTokenCheck,\n },\n {\n name: \"points\",\n description: \"Query token points directly\",\n usageLine: \" jimeng token points [options]\",\n options: [\n \" --token <token> Token, can be repeated\",\n \" --token-file <path> Read tokens from file (one per line, # for comments)\",\n \" --region <region> Filter tokens by X-Region, default cn (cn/us/hk/jp/sg)\",\n deps.jsonOption,\n deps.helpOption,\n ],\n handler: async (argv) => handleTokenPointsOrReceive(argv, \"points\"),\n },\n {\n name: \"receive\",\n description: \"Receive token credits directly\",\n usageLine: \" jimeng token receive [options]\",\n options: [\n \" --token <token> Token, can be repeated\",\n \" --token-file <path> Read tokens from file (one per line, # for comments)\",\n \" --region <region> Filter tokens by X-Region, default cn (cn/us/hk/jp/sg)\",\n deps.jsonOption,\n deps.helpOption,\n ],\n handler: async (argv) => handleTokenPointsOrReceive(argv, \"receive\"),\n },\n {\n name: \"add\",\n description: \"Add token(s) into token-pool\",\n usageLine: \" jimeng token add --token <token> [--token <token> ...] [options]\",\n options: [\n \" --token <token> Token, can be repeated\",\n \" --token-file <path> Read tokens from file (one per line, # for comments)\",\n \" --region <region> Region for add, default cn (cn/us/hk/jp/sg)\",\n deps.jsonOption,\n deps.helpOption,\n ],\n handler: async (argv) => handleTokenAddOrRemove(argv, \"add\"),\n },\n {\n name: \"remove\",\n description: \"Remove token(s) from token-pool\",\n usageLine: \" jimeng token remove --token <token> [--token <token> ...] [options]\",\n options: [\n \" --token <token> Token, can be repeated\",\n \" --token-file <path> Read tokens from file (one per line, # for comments)\",\n deps.jsonOption,\n deps.helpOption,\n ],\n handler: async (argv) => handleTokenAddOrRemove(argv, \"remove\"),\n },\n {\n name: \"enable\",\n description: \"Enable one token in token-pool\",\n usageLine: \" jimeng token enable --token <token> [options]\",\n options: [\" --token <token> Required, a single token\", deps.jsonOption, deps.helpOption],\n handler: async (argv) => handleTokenEnableOrDisable(argv, \"enable\"),\n },\n {\n name: \"disable\",\n description: \"Disable one token in token-pool\",\n usageLine: \" jimeng token disable --token <token> [options]\",\n options: [\" --token <token> Required, a single token\", deps.jsonOption, deps.helpOption],\n handler: async (argv) => handleTokenEnableOrDisable(argv, \"disable\"),\n },\n {\n name: \"pool\",\n description: \"Show token-pool summary and entries\",\n usageLine: \" jimeng token pool [options]\",\n options: [deps.jsonOption, deps.helpOption],\n handler: handleTokenPool,\n },\n {\n name: \"pool-check\",\n description: \"Trigger token-pool health check\",\n usageLine: \" jimeng token pool-check [options]\",\n options: [deps.jsonOption, deps.helpOption],\n handler: async (argv) => handleTokenPoolCheckOrReload(argv, \"pool-check\"),\n },\n {\n name: \"pool-reload\",\n description: \"Reload token-pool from disk\",\n usageLine: \" jimeng token pool-reload [options]\",\n options: [deps.jsonOption, deps.helpOption],\n handler: async (argv) => handleTokenPoolCheckOrReload(argv, \"pool-reload\"),\n },\n ];\n}\n","import minimist from \"minimist\";\n\nimport { buildRegionInfo, type RegionCode } from \"@/api/controllers/core.ts\";\nimport { getLiveModels } from \"@/api/controllers/models.ts\";\nimport { getTaskResponse, waitForTaskResponse } from \"@/api/controllers/tasks.ts\";\n\ntype JsonRecord = Record<string, unknown>;\n\ntype TaskInfo = {\n task_id: string;\n type?: string;\n status?: number;\n fail_code?: string | null;\n created?: number;\n data?: unknown;\n};\n\ntype QueryDeps = {\n usageModelsList: () => string;\n usageTaskGet: () => string;\n usageTaskWait: () => string;\n getSingleString: (args: Record<string, unknown>, key: string) => string | undefined;\n getRegionWithDefault: (args: Record<string, unknown>) => string;\n parseRegionOrFail: (region: string | undefined) => RegionCode | undefined;\n ensureTokenPoolReady: () => Promise<void>;\n pickDirectTokenForTask: (\n token: string | undefined,\n region: string | undefined\n ) => Promise<{ token: string; region: RegionCode }>;\n fail: (message: string) => never;\n printJson: (value: unknown) => void;\n printCommandJson: (command: string, data: unknown, meta?: JsonRecord) => void;\n unwrapBody: (payload: unknown) => unknown;\n};\n\nfunction parseTaskTypeOrFail(value: string | undefined, deps: Pick<QueryDeps, \"fail\">): \"image\" | \"video\" | undefined {\n if (!value) return undefined;\n if (value === \"image\" || value === \"video\") return value;\n deps.fail(`Invalid --type: ${value}. Use image or video.`);\n}\n\nfunction parseResponseFormatOrFail(\n value: string | undefined,\n deps: Pick<QueryDeps, \"fail\">\n): \"url\" | \"b64_json\" {\n if (!value) return \"url\";\n if (value === \"url\" || value === \"b64_json\") return value;\n deps.fail(`Invalid --response-format: ${value}. Use url or b64_json.`);\n}\n\nfunction parsePositiveNumberOption(\n args: Record<string, unknown>,\n key: \"wait-timeout-seconds\" | \"poll-interval-ms\",\n deps: Pick<QueryDeps, \"getSingleString\" | \"fail\">\n): number | undefined {\n const raw = deps.getSingleString(args, key);\n if (!raw) return undefined;\n const parsed = Number(raw);\n if (!Number.isFinite(parsed) || parsed <= 0) {\n deps.fail(`Invalid --${key}: ${raw}`);\n }\n return parsed;\n}\n\nconst TASK_STATUS_TEXT: Record<number, string> = {\n 10: \"PENDING\",\n 20: \"PROCESSING\",\n 40: \"FAILED\",\n 50: \"COMPLETED\",\n};\n\nfunction taskStatusText(status: number): string {\n return TASK_STATUS_TEXT[status] || \"UNKNOWN\";\n}\n\nfunction formatUnixSeconds(value: unknown): string {\n if (typeof value !== \"number\" || !Number.isFinite(value) || value <= 0) return \"-\";\n return `${value} (${new Date(value * 1000).toISOString()})`;\n}\n\nfunction collectTaskInfo(payload: unknown, deps: Pick<QueryDeps, \"unwrapBody\">): TaskInfo | null {\n const normalized = deps.unwrapBody(payload);\n if (!normalized || typeof normalized !== \"object\") return null;\n const obj = normalized as JsonRecord;\n if (typeof obj.task_id !== \"string\" || obj.task_id.length === 0) return null;\n return {\n task_id: obj.task_id,\n type: typeof obj.type === \"string\" ? obj.type : undefined,\n status: typeof obj.status === \"number\" ? obj.status : undefined,\n fail_code: typeof obj.fail_code === \"string\" || obj.fail_code === null ? (obj.fail_code as string | null) : undefined,\n created: typeof obj.created === \"number\" ? obj.created : undefined,\n data: obj.data,\n };\n}\n\nfunction printTaskInfo(task: TaskInfo, deps: Pick<QueryDeps, \"printJson\">): void {\n console.log(`Task ID: ${task.task_id}`);\n if (task.type) console.log(`Type: ${task.type}`);\n if (typeof task.status === \"number\") {\n console.log(`Status: ${task.status} (${taskStatusText(task.status)})`);\n }\n if (task.fail_code) console.log(`Fail Code: ${task.fail_code}`);\n if (typeof task.created === \"number\") {\n console.log(`Created: ${formatUnixSeconds(task.created)}`);\n }\n if (task.data != null) {\n console.log(\"Data:\");\n deps.printJson(task.data);\n }\n}\n\nexport function createQueryCommandHandlers(deps: QueryDeps): {\n handleModelsList: (argv: string[]) => Promise<void>;\n handleTaskGet: (argv: string[]) => Promise<void>;\n handleTaskWait: (argv: string[]) => Promise<void>;\n printTaskInfo: (task: unknown) => void;\n} {\n const handleModelsList = async (argv: string[]): Promise<void> => {\n const args = minimist(argv, {\n string: [\"region\", \"token\"],\n boolean: [\"help\", \"json\", \"verbose\"],\n });\n\n if (args.help) {\n console.log(deps.usageModelsList());\n return;\n }\n\n const region = deps.getRegionWithDefault(args);\n const parsedRegion = deps.parseRegionOrFail(region);\n const token = deps.getSingleString(args, \"token\");\n await deps.ensureTokenPoolReady();\n const auth = token ? `Bearer ${token}` : undefined;\n const direct = await getLiveModels(auth, parsedRegion || region);\n const normalized: unknown = { object: \"list\", data: direct.data };\n\n if (args.json) {\n deps.printCommandJson(\"models.list\", normalized, { region: region || null });\n return;\n }\n\n const data =\n normalized && typeof normalized === \"object\" && Array.isArray((normalized as JsonRecord).data)\n ? ((normalized as JsonRecord).data as unknown[])\n : [];\n\n if (data.length === 0) {\n deps.fail(`No models found in response: ${JSON.stringify(normalized)}`);\n }\n\n if (args.verbose) {\n console.log(\"id\\ttype\\tdesc\\tcapabilities\");\n for (const item of data) {\n if (!item || typeof item !== \"object\") continue;\n const model = item as JsonRecord;\n const id = typeof model.id === \"string\" ? model.id : \"\";\n if (!id) continue;\n const modelType = typeof model.model_type === \"string\" ? model.model_type : \"-\";\n const description = typeof model.description === \"string\" ? model.description : \"-\";\n const capabilities = Array.isArray(model.capabilities)\n ? model.capabilities.filter((cap): cap is string => typeof cap === \"string\").join(\",\")\n : \"-\";\n console.log(`${id}\\ttype=${modelType}\\tdesc=${description}\\tcapabilities=${capabilities}`);\n }\n return;\n }\n\n for (const item of data) {\n if (!item || typeof item !== \"object\") continue;\n const id = (item as JsonRecord).id;\n if (typeof id === \"string\" && id.length > 0) {\n console.log(id);\n }\n }\n };\n\n const handleTaskGet = async (argv: string[]): Promise<void> => {\n const args = minimist(argv, {\n string: [\"token\", \"region\", \"task-id\", \"type\", \"response-format\"],\n boolean: [\"help\", \"json\"],\n });\n if (args.help) {\n console.log(deps.usageTaskGet());\n return;\n }\n const taskId = deps.getSingleString(args, \"task-id\");\n if (!taskId) deps.fail(`Missing required --task-id.\\n\\n${deps.usageTaskGet()}`);\n const type = parseTaskTypeOrFail(deps.getSingleString(args, \"type\"), deps);\n const responseFormat = parseResponseFormatOrFail(deps.getSingleString(args, \"response-format\"), deps);\n const token = deps.getSingleString(args, \"token\");\n const region = deps.getRegionWithDefault(args);\n const isJson = Boolean(args.json);\n const pick = await deps.pickDirectTokenForTask(token, region);\n const normalized: unknown = await getTaskResponse(\n taskId,\n pick.token,\n buildRegionInfo(pick.region),\n {\n type,\n responseFormat,\n }\n );\n const taskInfo = collectTaskInfo(normalized, deps);\n if (!taskInfo) {\n if (isJson) {\n deps.printCommandJson(\"task.get\", deps.unwrapBody(normalized));\n } else {\n deps.printJson(deps.unwrapBody(normalized));\n }\n return;\n }\n if (isJson) deps.printCommandJson(\"task.get\", taskInfo);\n else printTaskInfo(taskInfo, deps);\n };\n\n const handleTaskWait = async (argv: string[]): Promise<void> => {\n const args = minimist(argv, {\n string: [\n \"token\",\n \"region\",\n \"task-id\",\n \"type\",\n \"response-format\",\n \"wait-timeout-seconds\",\n \"poll-interval-ms\",\n ],\n boolean: [\"help\", \"json\"],\n });\n if (args.help) {\n console.log(deps.usageTaskWait());\n return;\n }\n const taskId = deps.getSingleString(args, \"task-id\");\n if (!taskId) deps.fail(`Missing required --task-id.\\n\\n${deps.usageTaskWait()}`);\n const token = deps.getSingleString(args, \"token\");\n const region = deps.getRegionWithDefault(args);\n const isJson = Boolean(args.json);\n const body: JsonRecord = {};\n const type = parseTaskTypeOrFail(deps.getSingleString(args, \"type\"), deps);\n const responseFormat = parseResponseFormatOrFail(deps.getSingleString(args, \"response-format\"), deps);\n if (type) body.type = type;\n body.response_format = responseFormat;\n const waitTimeoutSeconds = parsePositiveNumberOption(args, \"wait-timeout-seconds\", deps);\n if (waitTimeoutSeconds !== undefined) body.wait_timeout_seconds = waitTimeoutSeconds;\n const pollIntervalMs = parsePositiveNumberOption(args, \"poll-interval-ms\", deps);\n if (pollIntervalMs !== undefined) body.poll_interval_ms = pollIntervalMs;\n\n const pick = await deps.pickDirectTokenForTask(token, region);\n const normalized: unknown = await waitForTaskResponse(\n taskId,\n pick.token,\n buildRegionInfo(pick.region),\n {\n type,\n responseFormat,\n waitTimeoutSeconds: typeof body.wait_timeout_seconds === \"number\" ? body.wait_timeout_seconds : undefined,\n pollIntervalMs: typeof body.poll_interval_ms === \"number\" ? body.poll_interval_ms : undefined,\n }\n );\n\n const taskInfo = collectTaskInfo(normalized, deps);\n if (!taskInfo) {\n if (isJson) {\n deps.printCommandJson(\"task.wait\", deps.unwrapBody(normalized));\n } else {\n deps.printJson(deps.unwrapBody(normalized));\n }\n return;\n }\n if (isJson) deps.printCommandJson(\"task.wait\", taskInfo);\n else printTaskInfo(taskInfo, deps);\n };\n\n return {\n handleModelsList,\n handleTaskGet,\n handleTaskWait,\n printTaskInfo: (task) => {\n const normalized = collectTaskInfo(task, deps);\n if (!normalized) {\n deps.printJson(task);\n return;\n }\n printTaskInfo(normalized, deps);\n },\n };\n}\n","import { constants as fsConstants } from \"node:fs\";\nimport { access, mkdir, readFile, writeFile } from \"node:fs/promises\";\nimport path from \"node:path\";\n\nimport minimist from \"minimist\";\n\nimport { buildRegionInfo, type RegionCode } from \"@/api/controllers/core.ts\";\nimport { generateImageComposition, generateImages } from \"@/api/controllers/images.ts\";\nimport { generateVideo } from \"@/api/controllers/videos.ts\";\nimport {\n VIDEO_OMNI_IMAGE_SLOT_KEYS,\n VIDEO_OMNI_VIDEO_SLOT_KEYS,\n buildDirectVideoInputPayload,\n collectVideoInputPlan,\n parseVideoCliMode,\n validateVideoModeAndModel,\n type VideoCliMode\n} from \"@/cli/video-input.ts\";\n\ntype JsonRecord = Record<string, unknown>;\n\ntype MediaDeps = {\n usageImageGenerate: () => string;\n usageImageEdit: () => string;\n usageVideoGenerate: () => string;\n getSingleString: (args: Record<string, unknown>, key: string) => string | undefined;\n getRegionWithDefault: (args: Record<string, unknown>) => string;\n toStringList: (raw: unknown) => string[];\n fail: (message: string) => never;\n failWithUsage: (reason: string, usage: string) => never;\n pickDirectTokenForGeneration: (\n token: string | undefined,\n region: string | undefined,\n requestedModel: string,\n taskType: \"image\" | \"video\",\n requiredCapabilityTags?: string[]\n ) => Promise<{ token: string; region: RegionCode }>;\n printCommandJson: (command: string, data: unknown, meta?: JsonRecord) => void;\n printDownloadSummary: (kind: \"image\" | \"video\", files: string[]) => void;\n printTaskInfo: (task: unknown) => void;\n};\n\nfunction ensurePrompt(prompt: string | undefined, usage: string, deps: Pick<MediaDeps, \"fail\">): string {\n if (!prompt) {\n deps.fail(`Missing required --prompt.\\n\\n${usage}`);\n }\n return prompt;\n}\n\nfunction isHttpUrl(input: string): boolean {\n return /^https?:\\/\\//i.test(input);\n}\n\nasync function pathExists(filePath: string): Promise<boolean> {\n try {\n await access(filePath, fsConstants.F_OK);\n return true;\n } catch {\n return false;\n }\n}\n\nfunction detectImageExtension(contentType: string | null): string | null {\n if (!contentType) return null;\n if (contentType.includes(\"image/jpeg\")) return \"jpg\";\n if (contentType.includes(\"image/png\")) return \"png\";\n if (contentType.includes(\"image/webp\")) return \"webp\";\n if (contentType.includes(\"image/gif\")) return \"gif\";\n return null;\n}\n\nfunction detectImageExtensionFromUrl(fileUrl: string): string | null {\n try {\n const pathname = new URL(fileUrl).pathname.toLowerCase();\n if (pathname.endsWith(\".jpg\") || pathname.endsWith(\".jpeg\")) return \"jpg\";\n if (pathname.endsWith(\".png\")) return \"png\";\n if (pathname.endsWith(\".webp\")) return \"webp\";\n if (pathname.endsWith(\".gif\")) return \"gif\";\n } catch {\n return null;\n }\n return null;\n}\n\nfunction detectImageExtensionFromBuffer(buffer: Buffer): string | null {\n if (buffer.length >= 8) {\n if (\n buffer[0] === 0x89 &&\n buffer[1] === 0x50 &&\n buffer[2] === 0x4e &&\n buffer[3] === 0x47 &&\n buffer[4] === 0x0d &&\n buffer[5] === 0x0a &&\n buffer[6] === 0x1a &&\n buffer[7] === 0x0a\n ) return \"png\";\n }\n if (buffer.length >= 3) {\n if (buffer[0] === 0xff && buffer[1] === 0xd8 && buffer[2] === 0xff) return \"jpg\";\n }\n if (buffer.length >= 12) {\n if (\n buffer.toString(\"ascii\", 0, 4) === \"RIFF\" &&\n buffer.toString(\"ascii\", 8, 12) === \"WEBP\"\n ) return \"webp\";\n }\n if (buffer.length >= 6) {\n const sig = buffer.toString(\"ascii\", 0, 6);\n if (sig === \"GIF87a\" || sig === \"GIF89a\") return \"gif\";\n }\n return null;\n}\n\nfunction detectVideoExtension(contentType: string | null, fileUrl: string): string {\n if (contentType?.includes(\"video/mp4\")) return \"mp4\";\n if (contentType?.includes(\"video/webm\")) return \"webm\";\n const pathname = new URL(fileUrl).pathname.toLowerCase();\n if (pathname.endsWith(\".mp4\")) return \"mp4\";\n if (pathname.endsWith(\".webm\")) return \"webm\";\n if (pathname.endsWith(\".mov\")) return \"mov\";\n return \"mp4\";\n}\n\nfunction parsePositiveNumberOption(\n args: Record<string, unknown>,\n key: \"wait-timeout-seconds\" | \"poll-interval-ms\",\n deps: Pick<MediaDeps, \"getSingleString\" | \"fail\">\n): number | undefined {\n const raw = deps.getSingleString(args, key);\n if (!raw) return undefined;\n const parsed = Number(raw);\n if (!Number.isFinite(parsed) || parsed <= 0) {\n deps.fail(`Invalid --${key}: ${raw}`);\n }\n return parsed;\n}\n\nfunction applyWaitOptionsToBody(\n body: JsonRecord,\n args: Record<string, unknown>,\n deps: Pick<MediaDeps, \"getSingleString\" | \"fail\">,\n includeWaitFlag = true\n): boolean {\n const wait = Boolean(args.wait);\n if (includeWaitFlag) body.wait = wait;\n const waitTimeoutSeconds = parsePositiveNumberOption(args, \"wait-timeout-seconds\", deps);\n if (waitTimeoutSeconds !== undefined) body.wait_timeout_seconds = waitTimeoutSeconds;\n const pollIntervalMs = parsePositiveNumberOption(args, \"poll-interval-ms\", deps);\n if (pollIntervalMs !== undefined) body.poll_interval_ms = pollIntervalMs;\n return wait;\n}\n\nasync function downloadBinary(url: string, deps: Pick<MediaDeps, \"fail\">): Promise<{ buffer: Buffer; contentType: string | null }> {\n const response = await fetch(url);\n if (!response.ok) {\n deps.fail(`Download failed (${response.status}): ${url}`);\n }\n return {\n buffer: Buffer.from(await response.arrayBuffer()),\n contentType: response.headers.get(\"content-type\"),\n };\n}\n\nasync function downloadImages(\n urls: string[],\n outputDir: string,\n prefix: string,\n deps: Pick<MediaDeps, \"fail\">\n): Promise<string[]> {\n const dir = path.resolve(outputDir);\n await mkdir(dir, { recursive: true });\n const timestamp = new Date().toISOString().replace(/[-:.TZ]/g, \"\");\n const saved: string[] = [];\n\n for (let i = 0; i < urls.length; i += 1) {\n const imageUrl = urls[i];\n const { buffer, contentType } = await downloadBinary(imageUrl, deps);\n const ext =\n detectImageExtension(contentType) ??\n detectImageExtensionFromBuffer(buffer) ??\n detectImageExtensionFromUrl(imageUrl) ??\n \"png\";\n const fileName = `${prefix}-${timestamp}-${String(i + 1).padStart(2, \"0\")}.${ext}`;\n const filePath = path.join(dir, fileName);\n await writeFile(filePath, buffer);\n saved.push(filePath);\n }\n\n return saved;\n}\n\nexport function createMediaCommandHandlers(deps: MediaDeps): {\n handleImageGenerate: (argv: string[]) => Promise<void>;\n handleImageEdit: (argv: string[]) => Promise<void>;\n handleVideoGenerate: (argv: string[]) => Promise<void>;\n} {\n const handleImageGenerate = async (argv: string[]): Promise<void> => {\n const args = minimist(argv, {\n string: [\n \"token\",\n \"region\",\n \"prompt\",\n \"model\",\n \"ratio\",\n \"resolution\",\n \"negative-prompt\",\n \"sample-strength\",\n \"output-dir\",\n \"wait-timeout-seconds\",\n \"poll-interval-ms\",\n ],\n boolean: [\"help\", \"intelligent-ratio\", \"wait\", \"json\"],\n default: { wait: true },\n });\n\n if (args.help) {\n console.log(deps.usageImageGenerate());\n return;\n }\n\n const token = deps.getSingleString(args, \"token\");\n const region = deps.getRegionWithDefault(args);\n const prompt = ensurePrompt(deps.getSingleString(args, \"prompt\"), deps.usageImageGenerate(), deps);\n const outputDir = deps.getSingleString(args, \"output-dir\") || \"./pic/cli-image-generate\";\n\n const body: JsonRecord = {\n prompt,\n model: deps.getSingleString(args, \"model\") || \"jimeng-4.5\",\n ratio: deps.getSingleString(args, \"ratio\") || \"1:1\",\n resolution: deps.getSingleString(args, \"resolution\") || \"2k\",\n };\n\n const negativePrompt = deps.getSingleString(args, \"negative-prompt\");\n if (negativePrompt) body.negative_prompt = negativePrompt;\n if (args[\"intelligent-ratio\"]) body.intelligent_ratio = true;\n const wait = applyWaitOptionsToBody(body, args, deps);\n const isJson = Boolean(args.json);\n\n const sampleStrengthRaw = deps.getSingleString(args, \"sample-strength\");\n if (sampleStrengthRaw) {\n const parsed = Number(sampleStrengthRaw);\n if (!Number.isFinite(parsed)) {\n deps.fail(`Invalid --sample-strength: ${sampleStrengthRaw}`);\n }\n body.sample_strength = parsed;\n }\n\n const pick = await deps.pickDirectTokenForGeneration(\n token,\n region,\n String(body.model || \"jimeng-4.5\"),\n \"image\"\n );\n const result = await generateImages(\n String(body.model || \"jimeng-4.5\"),\n String(prompt),\n {\n ratio: String(body.ratio || \"1:1\"),\n resolution: String(body.resolution || \"2k\"),\n sampleStrength: typeof body.sample_strength === \"number\" ? body.sample_strength : undefined,\n negativePrompt: typeof body.negative_prompt === \"string\" ? body.negative_prompt : undefined,\n intelligentRatio: Boolean(body.intelligent_ratio),\n wait,\n waitTimeoutSeconds: typeof body.wait_timeout_seconds === \"number\" ? body.wait_timeout_seconds : undefined,\n pollIntervalMs: typeof body.poll_interval_ms === \"number\" ? body.poll_interval_ms : undefined,\n },\n pick.token,\n buildRegionInfo(pick.region)\n );\n if (!Array.isArray(result)) {\n if (isJson) deps.printCommandJson(\"image.generate\", result, { wait });\n else deps.printTaskInfo(result);\n return;\n }\n const urls: string[] = result;\n if (urls.length === 0) deps.fail(\"No image URL found in response.\");\n\n const savedFiles = await downloadImages(urls, outputDir, \"jimeng-image-generate\", deps);\n if (isJson) {\n deps.printCommandJson(\n \"image.generate\",\n { data: urls.map((url) => ({ url })), files: savedFiles },\n { wait }\n );\n } else {\n deps.printDownloadSummary(\"image\", savedFiles);\n }\n };\n\n const handleImageEdit = async (argv: string[]): Promise<void> => {\n const args = minimist(argv, {\n string: [\n \"token\",\n \"region\",\n \"prompt\",\n \"image\",\n \"model\",\n \"ratio\",\n \"resolution\",\n \"negative-prompt\",\n \"sample-strength\",\n \"output-dir\",\n \"wait-timeout-seconds\",\n \"poll-interval-ms\",\n ],\n boolean: [\"help\", \"intelligent-ratio\", \"wait\", \"json\"],\n default: { wait: true },\n });\n\n if (args.help) {\n console.log(deps.usageImageEdit());\n return;\n }\n\n const token = deps.getSingleString(args, \"token\");\n const region = deps.getRegionWithDefault(args);\n const prompt = ensurePrompt(deps.getSingleString(args, \"prompt\"), deps.usageImageEdit(), deps);\n const sources = deps.toStringList(args.image);\n if (sources.length === 0) deps.failWithUsage(\"Missing required --image.\", deps.usageImageEdit());\n if (sources.length > 10) deps.fail(\"At most 10 images are supported for image edit.\");\n\n const outputDir = deps.getSingleString(args, \"output-dir\") || \"./pic/cli-image-edit\";\n const model = deps.getSingleString(args, \"model\") || \"jimeng-4.5\";\n const ratio = deps.getSingleString(args, \"ratio\") || \"1:1\";\n const resolution = deps.getSingleString(args, \"resolution\") || \"2k\";\n const negativePrompt = deps.getSingleString(args, \"negative-prompt\");\n const sampleStrengthRaw = deps.getSingleString(args, \"sample-strength\");\n const intelligentRatio = Boolean(args[\"intelligent-ratio\"]);\n const wait = Boolean(args.wait);\n const isJson = Boolean(args.json);\n\n const allUrls = sources.every(isHttpUrl);\n const allLocal = sources.every((item) => !isHttpUrl(item));\n if (!allUrls && !allLocal) {\n deps.fail(\"Mixed image sources are not supported. Use all URLs or all local files.\");\n }\n\n const pick = await deps.pickDirectTokenForGeneration(token, region, model, \"image\");\n const images: Array<string | Buffer> = [];\n if (allUrls) {\n images.push(...sources);\n } else {\n for (const source of sources) {\n const imagePath = path.resolve(source);\n if (!(await pathExists(imagePath))) deps.fail(`Image file not found: ${imagePath}`);\n images.push(await readFile(imagePath));\n }\n }\n const sampleStrength = sampleStrengthRaw ? Number(sampleStrengthRaw) : undefined;\n if (sampleStrengthRaw && !Number.isFinite(sampleStrength)) {\n deps.fail(`Invalid --sample-strength: ${sampleStrengthRaw}`);\n }\n\n const result = await generateImageComposition(\n model,\n prompt,\n images,\n {\n ratio,\n resolution,\n sampleStrength: sampleStrength as number | undefined,\n negativePrompt,\n intelligentRatio,\n wait,\n waitTimeoutSeconds: parsePositiveNumberOption(args, \"wait-timeout-seconds\", deps),\n pollIntervalMs: parsePositiveNumberOption(args, \"poll-interval-ms\", deps),\n },\n pick.token,\n buildRegionInfo(pick.region)\n );\n if (!Array.isArray(result)) {\n if (isJson) deps.printCommandJson(\"image.edit\", result, { wait });\n else deps.printTaskInfo(result);\n return;\n }\n const urls: string[] = result;\n if (urls.length === 0) deps.fail(\"No image URL found in response.\");\n\n const savedFiles = await downloadImages(urls, outputDir, \"jimeng-image-edit\", deps);\n if (isJson) {\n deps.printCommandJson(\n \"image.edit\",\n { data: urls.map((url) => ({ url })), files: savedFiles },\n { wait }\n );\n } else {\n deps.printDownloadSummary(\"image\", savedFiles);\n }\n };\n\n const handleVideoGenerate = async (argv: string[]): Promise<void> => {\n const usage = deps.usageVideoGenerate();\n const args = minimist(argv, {\n string: [\n \"token\",\n \"region\",\n \"prompt\",\n \"mode\",\n \"image-file\",\n \"video-file\",\n ...VIDEO_OMNI_IMAGE_SLOT_KEYS,\n ...VIDEO_OMNI_VIDEO_SLOT_KEYS,\n \"model\",\n \"ratio\",\n \"resolution\",\n \"duration\",\n \"output-dir\",\n \"wait-timeout-seconds\",\n \"poll-interval-ms\",\n ],\n boolean: [\"help\", \"wait\", \"json\"],\n default: { wait: true },\n });\n\n if (args.help) {\n console.log(usage);\n return;\n }\n\n const token = deps.getSingleString(args, \"token\");\n const region = deps.getRegionWithDefault(args);\n const prompt = ensurePrompt(deps.getSingleString(args, \"prompt\"), usage, deps);\n const cliMode = parseVideoCliMode(args, usage, {\n getSingleString: deps.getSingleString,\n toStringList: deps.toStringList,\n failWithUsage: deps.failWithUsage,\n });\n const inputPlan = collectVideoInputPlan(args, usage, {\n getSingleString: deps.getSingleString,\n toStringList: deps.toStringList,\n failWithUsage: deps.failWithUsage,\n });\n\n const outputDir = deps.getSingleString(args, \"output-dir\") || \"./pic/cli-video-generate\";\n const model = deps.getSingleString(args, \"model\")\n || (cliMode === \"omni_reference\" ? \"jimeng-video-seedance-2.0-fast\" : \"jimeng-video-3.0\");\n validateVideoModeAndModel(cliMode, model, inputPlan, usage, { failWithUsage: deps.failWithUsage });\n const functionMode = cliMode === \"omni_reference\" ? \"omni_reference\" : \"first_last_frames\";\n const ratio = deps.getSingleString(args, \"ratio\") || \"1:1\";\n const resolution = deps.getSingleString(args, \"resolution\") || \"720p\";\n const durationRaw = deps.getSingleString(args, \"duration\") || \"5\";\n const duration = Number(durationRaw);\n if (!Number.isFinite(duration) || duration <= 0 || !Number.isInteger(duration)) {\n deps.fail(`Invalid --duration: ${durationRaw}. Use a positive integer (seconds).`);\n }\n const wait = Boolean(args.wait);\n const isJson = Boolean(args.json);\n const requiredCapabilityTags = cliMode === \"omni_reference\" ? [\"omni_reference\"] : [];\n const pick = await deps.pickDirectTokenForGeneration(token, region, model, \"video\", requiredCapabilityTags);\n const directInputs = await buildDirectVideoInputPayload(cliMode, inputPlan, {\n isHttpUrl,\n pathExists,\n fail: deps.fail,\n });\n\n const result = await generateVideo(\n model,\n prompt,\n {\n ratio,\n resolution,\n duration,\n filePaths: directInputs.filePaths,\n files: directInputs.files,\n httpRequest: directInputs.httpRequest,\n functionMode,\n wait,\n waitTimeoutSeconds: parsePositiveNumberOption(args, \"wait-timeout-seconds\", deps),\n pollIntervalMs: parsePositiveNumberOption(args, \"poll-interval-ms\", deps),\n },\n pick.token,\n buildRegionInfo(pick.region)\n );\n\n if (typeof result !== \"string\") {\n if (isJson) deps.printCommandJson(\"video.generate\", result, { wait, mode: cliMode });\n else deps.printTaskInfo(result);\n return;\n }\n const videoUrl: string = result;\n\n const { buffer, contentType } = await downloadBinary(videoUrl, deps);\n const dir = path.resolve(outputDir);\n await mkdir(dir, { recursive: true });\n const timestamp = new Date().toISOString().replace(/[-:.TZ]/g, \"\");\n const ext = detectVideoExtension(contentType, videoUrl);\n const filePath = path.join(dir, `jimeng-video-generate-${timestamp}.${ext}`);\n await writeFile(filePath, buffer);\n\n if (isJson) {\n deps.printCommandJson(\n \"video.generate\",\n { data: [{ url: videoUrl }], files: [filePath] },\n { wait, mode: cliMode }\n );\n } else {\n deps.printDownloadSummary(\"video\", [filePath]);\n }\n };\n\n return {\n handleImageGenerate,\n handleImageEdit,\n handleVideoGenerate,\n };\n}\n\n","import path from \"node:path\";\n\nexport type VideoCliMode = \"text_to_video\" | \"image_to_video\" | \"first_last_frames\" | \"omni_reference\";\n\nexport const VIDEO_OMNI_IMAGE_SLOT_KEYS = Array.from({ length: 9 }, (_, i) => `image-file-${i + 1}`);\nexport const VIDEO_OMNI_VIDEO_SLOT_KEYS = Array.from({ length: 3 }, (_, i) => `video-file-${i + 1}`);\n\nconst VIDEO_SUPPORTED_MODES: VideoCliMode[] = [\n \"text_to_video\",\n \"image_to_video\",\n \"first_last_frames\",\n \"omni_reference\",\n];\n\nconst VIDEO_OMNI_SUPPORTED_MODELS = new Set([\"jimeng-video-seedance-2.0\", \"jimeng-video-seedance-2.0-fast\"]);\n\nexport type VideoInputPlan = {\n repeatedImageInputs: string[];\n repeatedVideoInputs: string[];\n explicitImageSlots: Array<{ slot: number; input: string }>;\n explicitVideoSlots: Array<{ slot: number; input: string }>;\n totalImageInputs: number;\n totalVideoInputs: number;\n};\n\nexport type DirectUploadFile = {\n filepath: string;\n originalFilename: string;\n};\n\nexport type DirectVideoInputPayload = {\n filePaths: string[];\n files: Record<string, DirectUploadFile>;\n httpRequest: { body: Record<string, string> };\n};\n\ntype ArgMap = Record<string, unknown>;\n\ntype ParseDeps = {\n getSingleString: (args: ArgMap, key: string) => string | undefined;\n toStringList: (raw: unknown) => string[];\n failWithUsage: (reason: string, usage: string) => never;\n};\n\ntype BuildPayloadDeps = {\n isHttpUrl: (input: string) => boolean;\n pathExists: (filePath: string) => Promise<boolean>;\n fail: (message: string) => never;\n};\n\nexport function parseVideoCliMode(args: ArgMap, usage: string, deps: ParseDeps): VideoCliMode {\n const cliModeRaw = deps.getSingleString(args, \"mode\") || \"text_to_video\";\n if (!VIDEO_SUPPORTED_MODES.includes(cliModeRaw as VideoCliMode)) {\n deps.failWithUsage(\n `Invalid --mode: ${cliModeRaw}. Use text_to_video, image_to_video, first_last_frames, or omni_reference.`,\n usage\n );\n }\n return cliModeRaw as VideoCliMode;\n}\n\nexport function collectVideoInputPlan(args: ArgMap, usage: string, deps: ParseDeps): VideoInputPlan {\n const repeatedImageInputs = deps.toStringList(args[\"image-file\"]);\n const repeatedVideoInputs = deps.toStringList(args[\"video-file\"]);\n const explicitImageSlots = VIDEO_OMNI_IMAGE_SLOT_KEYS\n .map((key, i) => ({ slot: i + 1, input: deps.getSingleString(args, key) }))\n .filter((item): item is { slot: number; input: string } => Boolean(item.input));\n const explicitVideoSlots = VIDEO_OMNI_VIDEO_SLOT_KEYS\n .map((key, i) => ({ slot: i + 1, input: deps.getSingleString(args, key) }))\n .filter((item): item is { slot: number; input: string } => Boolean(item.input));\n\n if (repeatedImageInputs.length > 0 && explicitImageSlots.length > 0) {\n deps.failWithUsage(\n \"Do not mix repeated --image-file with explicit --image-file-N in one command.\",\n usage\n );\n }\n if (repeatedVideoInputs.length > 0 && explicitVideoSlots.length > 0) {\n deps.failWithUsage(\n \"Do not mix repeated --video-file with explicit --video-file-N in one command.\",\n usage\n );\n }\n\n return {\n repeatedImageInputs,\n repeatedVideoInputs,\n explicitImageSlots,\n explicitVideoSlots,\n totalImageInputs: repeatedImageInputs.length + explicitImageSlots.length,\n totalVideoInputs: repeatedVideoInputs.length + explicitVideoSlots.length,\n };\n}\n\nexport function validateVideoModeAndModel(\n cliMode: VideoCliMode,\n model: string,\n plan: VideoInputPlan,\n usage: string,\n deps: Pick<ParseDeps, \"failWithUsage\">\n): void {\n if (cliMode === \"omni_reference\" && !VIDEO_OMNI_SUPPORTED_MODELS.has(model)) {\n deps.failWithUsage(\n `omni_reference mode requires --model jimeng-video-seedance-2.0 or jimeng-video-seedance-2.0-fast (current: ${model}).`,\n usage\n );\n }\n\n if (cliMode === \"text_to_video\") {\n if (plan.totalImageInputs + plan.totalVideoInputs > 0) {\n deps.failWithUsage(\"text_to_video mode does not accept --image-file or --video-file inputs.\", usage);\n }\n return;\n }\n if (cliMode === \"image_to_video\") {\n if (plan.totalVideoInputs > 0) {\n deps.failWithUsage(\"image_to_video mode does not accept --video-file.\", usage);\n }\n if (plan.totalImageInputs !== 1) {\n deps.failWithUsage(\"image_to_video mode requires exactly one --image-file input.\", usage);\n }\n return;\n }\n if (cliMode === \"first_last_frames\") {\n if (plan.totalVideoInputs > 0) {\n deps.failWithUsage(\"first_last_frames mode does not accept --video-file.\", usage);\n }\n if (plan.totalImageInputs === 0) {\n deps.failWithUsage(\"first_last_frames mode requires at least one --image-file input.\", usage);\n }\n if (plan.totalImageInputs > 2) {\n deps.failWithUsage(\"first_last_frames mode supports at most 2 image inputs.\", usage);\n }\n return;\n }\n\n if (plan.totalImageInputs + plan.totalVideoInputs === 0) {\n deps.failWithUsage(\"omni_reference mode requires at least one --image-file or --video-file input.\", usage);\n }\n if (plan.totalImageInputs > 9) {\n deps.failWithUsage(\"omni_reference supports at most 9 image inputs.\", usage);\n }\n if (plan.totalVideoInputs > 3) {\n deps.failWithUsage(\"omni_reference supports at most 3 video inputs.\", usage);\n }\n}\n\nexport async function buildDirectVideoInputPayload(\n cliMode: VideoCliMode,\n plan: VideoInputPlan,\n deps: BuildPayloadDeps\n): Promise<DirectVideoInputPayload> {\n const payload: DirectVideoInputPayload = {\n filePaths: [],\n files: {},\n httpRequest: { body: {} },\n };\n\n const registerInput = async (\n fieldName: string,\n input: string,\n mediaType: \"image\" | \"video\"\n ): Promise<void> => {\n if (deps.isHttpUrl(input)) {\n if (cliMode === \"omni_reference\") {\n payload.httpRequest.body[fieldName] = input;\n } else if (mediaType === \"image\") {\n payload.filePaths.push(input);\n } else {\n deps.fail(`Mode ${cliMode} does not support video URL input.`);\n }\n return;\n }\n\n const filePath = path.resolve(input);\n if (!(await deps.pathExists(filePath))) {\n deps.fail(`Input file not found for ${fieldName}: ${filePath}`);\n }\n payload.files[fieldName] = {\n filepath: filePath,\n originalFilename: path.basename(filePath),\n };\n };\n\n if (cliMode === \"omni_reference\") {\n for (let i = 0; i < plan.repeatedImageInputs.length; i += 1) {\n await registerInput(`image_file_${i + 1}`, plan.repeatedImageInputs[i], \"image\");\n }\n for (let i = 0; i < plan.repeatedVideoInputs.length; i += 1) {\n await registerInput(`video_file_${i + 1}`, plan.repeatedVideoInputs[i], \"video\");\n }\n for (const slot of plan.explicitImageSlots) {\n await registerInput(`image_file_${slot.slot}`, slot.input, \"image\");\n }\n for (const slot of plan.explicitVideoSlots) {\n await registerInput(`video_file_${slot.slot}`, slot.input, \"video\");\n }\n return payload;\n }\n\n const imageInputs =\n plan.repeatedImageInputs.length > 0\n ? plan.repeatedImageInputs\n : plan.explicitImageSlots.sort((a, b) => a.slot - b.slot).map((item) => item.input);\n for (let i = 0; i < imageInputs.length; i += 1) {\n await registerInput(`image_file_${i + 1}`, imageInputs[i], \"image\");\n }\n return payload;\n}\n\n","#!/usr/bin/env node\n\nimport { runCli } from \"@/cli/app.ts\";\n\nrunCli();\n\n"],"mappings":";;;;;;;;;;;;;;;;;;;AAAA,OAAOA,cAAa;;;ACApB,SAAS,aAAa,mBAAmB;AACzC,OAAO,UAAU;AACjB,SAAS,QAAQ,gBAAgB;AAEjC,OAAO,cAAc;AAqDrB,SAAS,UAAU,OAAuB;AACxC,QAAM,IAAI,MAAM;AAChB,MAAI,KAAK,GAAI,QAAO;AACpB,SAAO,GAAG,MAAM,MAAM,GAAG,CAAC,CAAC,MAAM,MAAM,MAAM,EAAE,CAAC;AAClD;AAEA,SAAS,aAAa,OAAwB;AAC5C,MAAI,OAAO,UAAU,YAAY,CAAC,OAAO,SAAS,KAAK,KAAK,SAAS,EAAG,QAAO;AAC/E,SAAO,IAAI,KAAK,KAAK,EAAE,YAAY;AACrC;AAEA,SAAS,uBAAuB,OAAwB;AACtD,MAAI,MAAM,WAAW,GAAG;AACtB,YAAQ,IAAI,SAAS;AACrB;AAAA,EACF;AACA,UAAQ,IAAI,6DAAmE;AAC/E,aAAW,QAAQ,OAAO;AACxB,QAAI,CAAC,QAAQ,OAAO,SAAS,SAAU;AACvC,UAAM,QAAQ;AACd,UAAM,QAAQ,OAAO,MAAM,UAAU,WAAW,MAAM,QAAQ;AAC9D,UAAM,SAAS,OAAO,MAAM,WAAW,WAAW,MAAM,SAAS;AACjE,UAAM,UAAU,OAAO,MAAM,YAAY,YAAY,OAAO,MAAM,OAAO,IAAI;AAC7E,UAAM,OAAO,OAAO,MAAM,SAAS,YAAY,OAAO,MAAM,IAAI,IAAI;AACpE,UAAM,aAAa,OAAO,MAAM,eAAe,WAAW,OAAO,MAAM,UAAU,IAAI;AACrF,UAAM,gBAAgB,aAAa,MAAM,aAAa;AACtD,UAAM,WACJ,OAAO,MAAM,wBAAwB,WAAW,OAAO,MAAM,mBAAmB,IAAI;AACtF,YAAQ,IAAI,GAAG,KAAK,IAAK,MAAM,IAAK,OAAO,IAAK,IAAI,IAAK,UAAU,IAAK,aAAa,IAAK,QAAQ,EAAE;AAAA,EACtG;AACF;AAEA,SAAS,yBAAiE;AACxE,SAAO;AAAA,IACL,SAAS,qBAAU,WAAW;AAAA,IAC9B,OAAO,qBAAU,WAAW,IAAI;AAAA,EAClC;AACF;AAEA,eAAe,WAAW,UAAoC;AAC5D,MAAI;AACF,UAAM,OAAO,UAAU,YAAY,IAAI;AACvC,WAAO;AAAA,EACT,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,eAAe,mBAAmB,aAAqB,MAAyD;AAC9G,QAAM,WAAW,KAAK,QAAQ,WAAW;AACzC,MAAI,CAAE,MAAM,WAAW,QAAQ,GAAI;AACjC,SAAK,KAAK,yBAAyB,QAAQ,EAAE;AAAA,EAC/C;AACA,UAAQ,MAAM,SAAS,UAAU,MAAM,GACpC,MAAM,OAAO,EACb,IAAI,CAAC,SAAS,KAAK,KAAK,CAAC,EACzB,OAAO,CAAC,SAAS,KAAK,SAAS,KAAK,CAAC,KAAK,WAAW,GAAG,CAAC;AAC9D;AAEA,eAAe,sBACb,MACA,OACA,MACA,WAAW,OACQ;AACnB,QAAM,SAAS,CAAC,GAAG,KAAK,aAAa,KAAK,KAAK,CAAC;AAChD,QAAM,YAAY,KAAK,gBAAgB,MAAM,YAAY;AACzD,MAAI,WAAW;AACb,WAAO,KAAK,GAAI,MAAM,mBAAmB,WAAW,IAAI,CAAE;AAAA,EAC5D;AACA,QAAM,UAAU,MAAM,KAAK,IAAI,IAAI,MAAM,CAAC;AAC1C,MAAI,YAAY,QAAQ,WAAW,GAAG;AACpC,SAAK,KAAK;AAAA;AAAA,EAA0B,KAAK,EAAE;AAAA,EAC7C;AACA,SAAO;AACT;AAEO,SAAS,uBAAuB,MAA8C;AACnF,QAAM,mBAA+B,OAAO,SAAS;AACnD,UAAM,OAAO,SAAS,MAAM;AAAA,MAC1B,QAAQ,CAAC,SAAS,cAAc,QAAQ;AAAA,MACxC,SAAS,CAAC,QAAQ,MAAM;AAAA,IAC1B,CAAC;AACD,UAAM,QAAQ,KAAK,SAAS,OAAO;AACnC,QAAI,KAAK,MAAM;AACb,cAAQ,IAAI,KAAK;AACjB;AAAA,IACF;AACA,UAAM,SAAS,KAAK,qBAAqB,IAAI;AAC7C,UAAM,aAAa,KAAK,kBAAkB,MAAM;AAChD,QAAI,CAAC,YAAY;AACf,WAAK,KAAK,8CAA8C;AAAA,IAC1D;AACA,UAAM,SAAS,MAAM,sBAAsB,MAAM,OAAO,MAAM,IAAI;AAClE,QAAI,CAAC,KAAK,MAAM;AACd,cAAQ,IAAI,YAAY,OAAO,MAAM,WAAW;AAAA,IAClD;AAEA,UAAM,KAAK,qBAAqB;AAChC,QAAI,UAAU;AACd,QAAI,gBAAgB;AACpB,UAAM,UAA2E,CAAC;AAClF,eAAW,SAAS,QAAQ;AAC1B,YAAM,SAAS,UAAU,KAAK;AAC9B,UAAI;AACF,cAAM,OAAO,MAAM,mBAAmB,OAAO,gBAAgB,UAAU,CAAC;AACxE,cAAM,qBAAU,qBAAqB,OAAO,IAAI;AAChD,YAAI,SAAS,MAAM;AACjB,cAAI,CAAC,KAAK,KAAM,SAAQ,IAAI,UAAU,MAAM,YAAY;AAAA,QAC1D,OAAO;AACL,qBAAW;AACX,cAAI,CAAC,KAAK,KAAM,SAAQ,IAAI,UAAU,MAAM,aAAa;AAAA,QAC3D;AACA,gBAAQ,KAAK,EAAE,cAAc,QAAQ,MAAM,SAAS,KAAK,CAAC;AAAA,MAC5D,SAAS,OAAO;AACd,yBAAiB;AACjB,cAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AACrE,YAAI,CAAC,KAAK,KAAM,SAAQ,IAAI,WAAW,MAAM,IAAI,OAAO,EAAE;AAC1D,gBAAQ,KAAK,EAAE,cAAc,QAAQ,OAAO,QAAQ,CAAC;AAAA,MACvD;AAAA,IACF;AACA,QAAI,KAAK,MAAM;AACb,WAAK,iBAAiB,eAAe,SAAS;AAAA,QAC5C,OAAO,OAAO;AAAA,QACd;AAAA,QACA,gBAAgB;AAAA,MAClB,CAAC;AAAA,IACH,OAAO;AACL,cAAQ,IAAI,kBAAkB,OAAO,MAAM,YAAY,OAAO,mBAAmB,aAAa,EAAE;AAAA,IAClG;AACA,QAAI,gBAAgB,EAAG,SAAQ,KAAK,CAAC;AACrC,QAAI,UAAU,EAAG,SAAQ,KAAK,CAAC;AAAA,EACjC;AAEA,QAAM,kBAA8B,OAAO,SAAS;AAClD,UAAM,OAAO,SAAS,MAAM;AAAA,MAC1B,SAAS,CAAC,QAAQ,MAAM;AAAA,IAC1B,CAAC;AACD,UAAM,QAAQ,KAAK,SAAS,MAAM;AAClC,QAAI,KAAK,MAAM;AACb,cAAQ,IAAI,KAAK;AACjB;AAAA,IACF;AACA,UAAM,KAAK,qBAAqB;AAChC,UAAM,aAAa,uBAAuB;AAC1C,QAAI,KAAK,MAAM;AACb,WAAK,iBAAiB,cAAc,UAAU;AAC9C;AAAA,IACF;AACA,UAAM,OAAO,cAAc,OAAO,eAAe,WAAY,aAA4B,CAAC;AAC1F,UAAM,UAAU,KAAK;AACrB,QAAI,WAAW,OAAO,YAAY,UAAU;AAC1C,cAAQ,IAAI,UAAU;AACtB,WAAK,UAAU,OAAO;AAAA,IACxB;AACA,UAAM,QAAQ,MAAM,QAAQ,KAAK,KAAK,IAAI,KAAK,QAAQ,CAAC;AACxD,YAAQ,IAAI,UAAU;AACtB,2BAAuB,KAAK;AAAA,EAC9B;AAEA,QAAM,6BAA6B,OACjC,MACA,WACkB;AAClB,UAAM,OAAO,SAAS,MAAM;AAAA,MAC1B,QAAQ,CAAC,SAAS,cAAc,QAAQ;AAAA,MACxC,SAAS,CAAC,QAAQ,MAAM;AAAA,IAC1B,CAAC;AACD,UAAM,QAAQ,KAAK,SAAS,MAAM;AAClC,QAAI,KAAK,MAAM;AACb,cAAQ,IAAI,KAAK;AACjB;AAAA,IACF;AACA,UAAM,SAAS,KAAK,qBAAqB,IAAI;AAC7C,UAAM,aAAa,KAAK,kBAAkB,MAAM;AAChD,UAAM,KAAK,qBAAqB;AAChC,UAAM,SAAS,MAAM,sBAAsB,MAAM,OAAO,MAAM,KAAK;AACnE,UAAM,iBAAiB,OAAO,SAAS,IACnC,OAAO,IAAI,CAAC,UAAU;AA3O9B;AA4OU,YAAM,eAAc,0BAAU,cAAc,KAAK,MAA7B,mBAAgC;AACpD,YAAM,cAAc,cAAc;AAClC,UAAI,CAAC,aAAa;AAChB,aAAK,KAAK,4BAA4B,UAAU,KAAK,CAAC,4DAA4D;AAAA,MACpH;AACA,aAAO,EAAE,OAAO,QAAQ,YAAY;AAAA,IACtC,CAAC,IACD,qBAAU,WAAW,KAAK,EACvB,OAAO,CAAC,SAAS,KAAK,WAAW,KAAK,SAAS,SAAS,KAAK,MAAM,EACnE,OAAO,CAAC,SAAU,aAAa,KAAK,WAAW,aAAa,IAAK,EACjE,IAAI,CAAC,UAAU,EAAE,OAAO,KAAK,OAAO,QAAQ,KAAK,OAAQ,EAAE;AAClE,QAAI,eAAe,WAAW,GAAG;AAC/B,WAAK,KAAK,8DAA8D;AAAA,IAC1E;AACA,UAAM,UAAU,WAAW,WACvB,MAAM,QAAQ;AAAA,MACZ,eAAe,IAAI,OAAO,UAAU;AAAA,QAClC,OAAO,KAAK;AAAA,QACZ,QAAQ,MAAM,UAAU,KAAK,OAAO,gBAAgB,KAAK,MAAM,CAAC;AAAA,MAClE,EAAE;AAAA,IACJ,IACA,MAAM,QAAQ;AAAA,MACZ,eAAe,IAAI,OAAO,SAAS;AACjC,cAAM,gBAAgB,MAAM,UAAU,KAAK,OAAO,gBAAgB,KAAK,MAAM,CAAC;AAC9E,YAAI,cAAc,eAAe,GAAG;AAClC,cAAI;AACF,kBAAM,cAAc,KAAK,OAAO,gBAAgB,KAAK,MAAM,CAAC;AAC5D,kBAAM,gBAAgB,MAAM,UAAU,KAAK,OAAO,gBAAgB,KAAK,MAAM,CAAC;AAC9E,mBAAO,EAAE,OAAO,KAAK,OAAO,SAAS,eAAe,UAAU,KAAK;AAAA,UACrE,SAAS,OAAY;AACnB,mBAAO;AAAA,cACL,OAAO,KAAK;AAAA,cACZ,SAAS;AAAA,cACT,UAAU;AAAA,cACV,QAAO,+BAAO,YAAW,OAAO,KAAK;AAAA,YACvC;AAAA,UACF;AAAA,QACF;AACA,eAAO,EAAE,OAAO,KAAK,OAAO,SAAS,eAAe,UAAU,MAAM;AAAA,MACtE,CAAC;AAAA,IACH;AACJ,QAAI,KAAK,MAAM;AACb,WAAK,iBAAiB,SAAS,MAAM,IAAI,OAAO;AAChD;AAAA,IACF;AACA,SAAK,UAAU,OAAO;AAAA,EACxB;AAEA,QAAM,yBAAyB,OAAO,MAAgB,WAA4C;AAChG,UAAM,OAAO,SAAS,MAAM;AAAA,MAC1B,QAAQ,CAAC,SAAS,cAAc,QAAQ;AAAA,MACxC,SAAS,CAAC,QAAQ,MAAM;AAAA,IAC1B,CAAC;AACD,UAAM,QAAQ,KAAK,SAAS,MAAM;AAClC,QAAI,KAAK,MAAM;AACb,cAAQ,IAAI,KAAK;AACjB;AAAA,IACF;AACA,UAAM,SAAS,KAAK,qBAAqB,IAAI;AAC7C,UAAM,KAAK,qBAAqB;AAChC,UAAM,SAAS,MAAM,sBAAsB,MAAM,OAAO,MAAM,IAAI;AAClE,UAAM,aAAa,KAAK,kBAAkB,MAAM;AAChD,UAAM,UAAU,WAAW,QACvB;AAAA,MACE,GAAI,MAAM,qBAAU,UAAU,QAAQ,EAAE,eAAe,cAAc,OAAU,CAAC;AAAA,MAChF,SAAS,qBAAU,WAAW;AAAA,IAChC,IACA;AAAA,MACE,GAAI,MAAM,qBAAU,aAAa,MAAM;AAAA,MACvC,SAAS,qBAAU,WAAW;AAAA,IAChC;AACJ,QAAI,KAAK,MAAM;AACb,WAAK,iBAAiB,SAAS,MAAM,IAAI,KAAK,WAAW,OAAO,GAAG,EAAE,OAAO,CAAC;AAC7E;AAAA,IACF;AACA,SAAK,UAAU,KAAK,WAAW,OAAO,CAAC;AAAA,EACzC;AAEA,QAAM,6BAA6B,OAAO,MAAgB,WAAgD;AACxG,UAAM,OAAO,SAAS,MAAM;AAAA,MAC1B,QAAQ,CAAC,OAAO;AAAA,MAChB,SAAS,CAAC,QAAQ,MAAM;AAAA,IAC1B,CAAC;AACD,UAAM,QAAQ,KAAK,SAAS,MAAM;AAClC,QAAI,KAAK,MAAM;AACb,cAAQ,IAAI,KAAK;AACjB;AAAA,IACF;AACA,UAAM,QAAQ,KAAK,gBAAgB,MAAM,OAAO;AAChD,QAAI,CAAC,OAAO;AACV,WAAK,cAAc,6BAA6B,KAAK;AAAA,IACvD;AACA,UAAM,KAAK,qBAAqB;AAChC,UAAM,UAAU;AAAA,MACd,SAAS,MAAM,qBAAU,gBAAgB,OAAO,WAAW,QAAQ;AAAA,MACnE,SAAS,qBAAU,WAAW;AAAA,IAChC;AACA,QAAI,KAAK,MAAM;AACb,WAAK,iBAAiB,SAAS,MAAM,IAAI,KAAK,WAAW,OAAO,CAAC;AACjE;AAAA,IACF;AACA,SAAK,UAAU,KAAK,WAAW,OAAO,CAAC;AAAA,EACzC;AAEA,QAAM,kBAA8B,OAAO,SAAS;AAClD,UAAM,OAAO,SAAS,MAAM;AAAA,MAC1B,SAAS,CAAC,QAAQ,MAAM;AAAA,IAC1B,CAAC;AACD,UAAM,QAAQ,KAAK,SAAS,MAAM;AAClC,QAAI,KAAK,MAAM;AACb,cAAQ,IAAI,KAAK;AACjB;AAAA,IACF;AACA,UAAM,KAAK,qBAAqB;AAChC,UAAM,aAAa,uBAAuB;AAC1C,QAAI,KAAK,MAAM;AACb,WAAK,iBAAiB,cAAc,UAAU;AAC9C;AAAA,IACF;AACA,UAAM,OAAO,cAAc,OAAO,eAAe,WAAY,aAA4B,CAAC;AAC1F,YAAQ,IAAI,UAAU;AACtB,SAAK,UAAU,KAAK,WAAW,CAAC,CAAC;AACjC,YAAQ,IAAI,UAAU;AACtB,2BAAuB,MAAM,QAAQ,KAAK,KAAK,IAAI,KAAK,QAAQ,CAAC,CAAC;AAAA,EACpE;AAEA,QAAM,+BAA+B,OACnC,MACA,WACkB;AAClB,UAAM,OAAO,SAAS,MAAM;AAAA,MAC1B,SAAS,CAAC,QAAQ,MAAM;AAAA,IAC1B,CAAC;AACD,UAAM,QAAQ,KAAK,SAAS,MAAM;AAClC,QAAI,KAAK,MAAM;AACb,cAAQ,IAAI,KAAK;AACjB;AAAA,IACF;AACA,UAAM,KAAK,qBAAqB;AAChC,UAAM,UAAU,WAAW,eACvB;AAAA,MACE,GAAI,MAAM,qBAAU,eAAe;AAAA,MACnC,SAAS,qBAAU,WAAW;AAAA,IAChC,KACC,MAAM,qBAAU,eAAe,GAAG;AAAA,MACjC,UAAU;AAAA,MACV,SAAS,qBAAU,WAAW;AAAA,MAC9B,OAAO,uBAAuB,EAAE;AAAA,IAClC;AACJ,QAAI,KAAK,MAAM;AACb,WAAK,iBAAiB,SAAS,MAAM,IAAI,KAAK,WAAW,OAAO,CAAC;AACjE;AAAA,IACF;AACA,SAAK,UAAU,KAAK,WAAW,OAAO,CAAC;AAAA,EACzC;AAEA,SAAO;AAAA,IACL;AAAA,MACE,MAAM;AAAA,MACN,aAAa;AAAA,MACb,WAAW;AAAA,MACX,SAAS,CAAC,KAAK,YAAY,KAAK,UAAU;AAAA,MAC1C,SAAS;AAAA,IACX;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,aAAa;AAAA,MACb,WAAW;AAAA,MACX,SAAS;AAAA,QACP;AAAA,QACA;AAAA,QACA;AAAA,QACA,KAAK;AAAA,QACL,KAAK;AAAA,MACP;AAAA,MACA,SAAS;AAAA,IACX;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,aAAa;AAAA,MACb,WAAW;AAAA,MACX,SAAS;AAAA,QACP;AAAA,QACA;AAAA,QACA;AAAA,QACA,KAAK;AAAA,QACL,KAAK;AAAA,MACP;AAAA,MACA,SAAS,OAAO,SAAS,2BAA2B,MAAM,QAAQ;AAAA,IACpE;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,aAAa;AAAA,MACb,WAAW;AAAA,MACX,SAAS;AAAA,QACP;AAAA,QACA;AAAA,QACA;AAAA,QACA,KAAK;AAAA,QACL,KAAK;AAAA,MACP;AAAA,MACA,SAAS,OAAO,SAAS,2BAA2B,MAAM,SAAS;AAAA,IACrE;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,aAAa;AAAA,MACb,WAAW;AAAA,MACX,SAAS;AAAA,QACP;AAAA,QACA;AAAA,QACA;AAAA,QACA,KAAK;AAAA,QACL,KAAK;AAAA,MACP;AAAA,MACA,SAAS,OAAO,SAAS,uBAAuB,MAAM,KAAK;AAAA,IAC7D;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,aAAa;AAAA,MACb,WAAW;AAAA,MACX,SAAS;AAAA,QACP;AAAA,QACA;AAAA,QACA,KAAK;AAAA,QACL,KAAK;AAAA,MACP;AAAA,MACA,SAAS,OAAO,SAAS,uBAAuB,MAAM,QAAQ;AAAA,IAChE;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,aAAa;AAAA,MACb,WAAW;AAAA,MACX,SAAS,CAAC,uDAAuD,KAAK,YAAY,KAAK,UAAU;AAAA,MACjG,SAAS,OAAO,SAAS,2BAA2B,MAAM,QAAQ;AAAA,IACpE;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,aAAa;AAAA,MACb,WAAW;AAAA,MACX,SAAS,CAAC,uDAAuD,KAAK,YAAY,KAAK,UAAU;AAAA,MACjG,SAAS,OAAO,SAAS,2BAA2B,MAAM,SAAS;AAAA,IACrE;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,aAAa;AAAA,MACb,WAAW;AAAA,MACX,SAAS,CAAC,KAAK,YAAY,KAAK,UAAU;AAAA,MAC1C,SAAS;AAAA,IACX;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,aAAa;AAAA,MACb,WAAW;AAAA,MACX,SAAS,CAAC,KAAK,YAAY,KAAK,UAAU;AAAA,MAC1C,SAAS,OAAO,SAAS,6BAA6B,MAAM,YAAY;AAAA,IAC1E;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,aAAa;AAAA,MACb,WAAW;AAAA,MACX,SAAS,CAAC,KAAK,YAAY,KAAK,UAAU;AAAA,MAC1C,SAAS,OAAO,SAAS,6BAA6B,MAAM,aAAa;AAAA,IAC3E;AAAA,EACF;AACF;;;ACpfA,OAAOC,eAAc;AAmCrB,SAAS,oBAAoB,OAA2B,MAA8D;AACpH,MAAI,CAAC,MAAO,QAAO;AACnB,MAAI,UAAU,WAAW,UAAU,QAAS,QAAO;AACnD,OAAK,KAAK,mBAAmB,KAAK,uBAAuB;AAC3D;AAEA,SAAS,0BACP,OACA,MACoB;AACpB,MAAI,CAAC,MAAO,QAAO;AACnB,MAAI,UAAU,SAAS,UAAU,WAAY,QAAO;AACpD,OAAK,KAAK,8BAA8B,KAAK,wBAAwB;AACvE;AAEA,SAAS,0BACP,MACA,KACA,MACoB;AACpB,QAAM,MAAM,KAAK,gBAAgB,MAAM,GAAG;AAC1C,MAAI,CAAC,IAAK,QAAO;AACjB,QAAM,SAAS,OAAO,GAAG;AACzB,MAAI,CAAC,OAAO,SAAS,MAAM,KAAK,UAAU,GAAG;AAC3C,SAAK,KAAK,aAAa,GAAG,KAAK,GAAG,EAAE;AAAA,EACtC;AACA,SAAO;AACT;AAEA,IAAM,mBAA2C;AAAA,EAC/C,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AACN;AAEA,SAAS,eAAe,QAAwB;AAC9C,SAAO,iBAAiB,MAAM,KAAK;AACrC;AAEA,SAAS,kBAAkB,OAAwB;AACjD,MAAI,OAAO,UAAU,YAAY,CAAC,OAAO,SAAS,KAAK,KAAK,SAAS,EAAG,QAAO;AAC/E,SAAO,GAAG,KAAK,KAAK,IAAI,KAAK,QAAQ,GAAI,EAAE,YAAY,CAAC;AAC1D;AAEA,SAAS,gBAAgB,SAAkB,MAAsD;AAC/F,QAAM,aAAa,KAAK,WAAW,OAAO;AAC1C,MAAI,CAAC,cAAc,OAAO,eAAe,SAAU,QAAO;AAC1D,QAAM,MAAM;AACZ,MAAI,OAAO,IAAI,YAAY,YAAY,IAAI,QAAQ,WAAW,EAAG,QAAO;AACxE,SAAO;AAAA,IACL,SAAS,IAAI;AAAA,IACb,MAAM,OAAO,IAAI,SAAS,WAAW,IAAI,OAAO;AAAA,IAChD,QAAQ,OAAO,IAAI,WAAW,WAAW,IAAI,SAAS;AAAA,IACtD,WAAW,OAAO,IAAI,cAAc,YAAY,IAAI,cAAc,OAAQ,IAAI,YAA8B;AAAA,IAC5G,SAAS,OAAO,IAAI,YAAY,WAAW,IAAI,UAAU;AAAA,IACzD,MAAM,IAAI;AAAA,EACZ;AACF;AAEA,SAAS,cAAc,MAAgB,MAA0C;AAC/E,UAAQ,IAAI,YAAY,KAAK,OAAO,EAAE;AACtC,MAAI,KAAK,KAAM,SAAQ,IAAI,SAAS,KAAK,IAAI,EAAE;AAC/C,MAAI,OAAO,KAAK,WAAW,UAAU;AACnC,YAAQ,IAAI,WAAW,KAAK,MAAM,KAAK,eAAe,KAAK,MAAM,CAAC,GAAG;AAAA,EACvE;AACA,MAAI,KAAK,UAAW,SAAQ,IAAI,cAAc,KAAK,SAAS,EAAE;AAC9D,MAAI,OAAO,KAAK,YAAY,UAAU;AACpC,YAAQ,IAAI,YAAY,kBAAkB,KAAK,OAAO,CAAC,EAAE;AAAA,EAC3D;AACA,MAAI,KAAK,QAAQ,MAAM;AACrB,YAAQ,IAAI,OAAO;AACnB,SAAK,UAAU,KAAK,IAAI;AAAA,EAC1B;AACF;AAEO,SAAS,2BAA2B,MAKzC;AACA,QAAM,mBAAmB,OAAO,SAAkC;AAChE,UAAM,OAAOC,UAAS,MAAM;AAAA,MAC1B,QAAQ,CAAC,UAAU,OAAO;AAAA,MAC1B,SAAS,CAAC,QAAQ,QAAQ,SAAS;AAAA,IACrC,CAAC;AAED,QAAI,KAAK,MAAM;AACb,cAAQ,IAAI,KAAK,gBAAgB,CAAC;AAClC;AAAA,IACF;AAEA,UAAM,SAAS,KAAK,qBAAqB,IAAI;AAC7C,UAAM,eAAe,KAAK,kBAAkB,MAAM;AAClD,UAAM,QAAQ,KAAK,gBAAgB,MAAM,OAAO;AAChD,UAAM,KAAK,qBAAqB;AAChC,UAAM,OAAO,QAAQ,UAAU,KAAK,KAAK;AACzC,UAAM,SAAS,MAAM,cAAc,MAAM,gBAAgB,MAAM;AAC/D,UAAM,aAAsB,EAAE,QAAQ,QAAQ,MAAM,OAAO,KAAK;AAEhE,QAAI,KAAK,MAAM;AACb,WAAK,iBAAiB,eAAe,YAAY,EAAE,QAAQ,UAAU,KAAK,CAAC;AAC3E;AAAA,IACF;AAEA,UAAM,OACJ,cAAc,OAAO,eAAe,YAAY,MAAM,QAAS,WAA0B,IAAI,IACvF,WAA0B,OAC5B,CAAC;AAEP,QAAI,KAAK,WAAW,GAAG;AACrB,WAAK,KAAK,gCAAgC,KAAK,UAAU,UAAU,CAAC,EAAE;AAAA,IACxE;AAEA,QAAI,KAAK,SAAS;AAChB,cAAQ,IAAI,2BAA8B;AAC1C,iBAAW,QAAQ,MAAM;AACvB,YAAI,CAAC,QAAQ,OAAO,SAAS,SAAU;AACvC,cAAM,QAAQ;AACd,cAAM,KAAK,OAAO,MAAM,OAAO,WAAW,MAAM,KAAK;AACrD,YAAI,CAAC,GAAI;AACT,cAAM,YAAY,OAAO,MAAM,eAAe,WAAW,MAAM,aAAa;AAC5E,cAAM,cAAc,OAAO,MAAM,gBAAgB,WAAW,MAAM,cAAc;AAChF,cAAM,eAAe,MAAM,QAAQ,MAAM,YAAY,IACjD,MAAM,aAAa,OAAO,CAAC,QAAuB,OAAO,QAAQ,QAAQ,EAAE,KAAK,GAAG,IACnF;AACJ,gBAAQ,IAAI,GAAG,EAAE,SAAU,SAAS,SAAU,WAAW,iBAAkB,YAAY,EAAE;AAAA,MAC3F;AACA;AAAA,IACF;AAEA,eAAW,QAAQ,MAAM;AACvB,UAAI,CAAC,QAAQ,OAAO,SAAS,SAAU;AACvC,YAAM,KAAM,KAAoB;AAChC,UAAI,OAAO,OAAO,YAAY,GAAG,SAAS,GAAG;AAC3C,gBAAQ,IAAI,EAAE;AAAA,MAChB;AAAA,IACF;AAAA,EACF;AAEA,QAAM,gBAAgB,OAAO,SAAkC;AAC7D,UAAM,OAAOA,UAAS,MAAM;AAAA,MAC1B,QAAQ,CAAC,SAAS,UAAU,WAAW,QAAQ,iBAAiB;AAAA,MAChE,SAAS,CAAC,QAAQ,MAAM;AAAA,IAC1B,CAAC;AACD,QAAI,KAAK,MAAM;AACb,cAAQ,IAAI,KAAK,aAAa,CAAC;AAC/B;AAAA,IACF;AACA,UAAM,SAAS,KAAK,gBAAgB,MAAM,SAAS;AACnD,QAAI,CAAC,OAAQ,MAAK,KAAK;AAAA;AAAA,EAAkC,KAAK,aAAa,CAAC,EAAE;AAC9E,UAAM,OAAO,oBAAoB,KAAK,gBAAgB,MAAM,MAAM,GAAG,IAAI;AACzE,UAAM,iBAAiB,0BAA0B,KAAK,gBAAgB,MAAM,iBAAiB,GAAG,IAAI;AACpG,UAAM,QAAQ,KAAK,gBAAgB,MAAM,OAAO;AAChD,UAAM,SAAS,KAAK,qBAAqB,IAAI;AAC7C,UAAM,SAAS,QAAQ,KAAK,IAAI;AAChC,UAAM,OAAO,MAAM,KAAK,uBAAuB,OAAO,MAAM;AAC5D,UAAM,aAAsB,MAAM;AAAA,MAChC;AAAA,MACA,KAAK;AAAA,MACL,gBAAgB,KAAK,MAAM;AAAA,MAC3B;AAAA,QACE;AAAA,QACA;AAAA,MACF;AAAA,IACF;AACA,UAAM,WAAW,gBAAgB,YAAY,IAAI;AACjD,QAAI,CAAC,UAAU;AACb,UAAI,QAAQ;AACV,aAAK,iBAAiB,YAAY,KAAK,WAAW,UAAU,CAAC;AAAA,MAC/D,OAAO;AACL,aAAK,UAAU,KAAK,WAAW,UAAU,CAAC;AAAA,MAC5C;AACA;AAAA,IACF;AACA,QAAI,OAAQ,MAAK,iBAAiB,YAAY,QAAQ;AAAA,QACjD,eAAc,UAAU,IAAI;AAAA,EACnC;AAEA,QAAM,iBAAiB,OAAO,SAAkC;AAC9D,UAAM,OAAOA,UAAS,MAAM;AAAA,MAC1B,QAAQ;AAAA,QACN;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,MACA,SAAS,CAAC,QAAQ,MAAM;AAAA,IAC1B,CAAC;AACD,QAAI,KAAK,MAAM;AACb,cAAQ,IAAI,KAAK,cAAc,CAAC;AAChC;AAAA,IACF;AACA,UAAM,SAAS,KAAK,gBAAgB,MAAM,SAAS;AACnD,QAAI,CAAC,OAAQ,MAAK,KAAK;AAAA;AAAA,EAAkC,KAAK,cAAc,CAAC,EAAE;AAC/E,UAAM,QAAQ,KAAK,gBAAgB,MAAM,OAAO;AAChD,UAAM,SAAS,KAAK,qBAAqB,IAAI;AAC7C,UAAM,SAAS,QAAQ,KAAK,IAAI;AAChC,UAAM,OAAmB,CAAC;AAC1B,UAAM,OAAO,oBAAoB,KAAK,gBAAgB,MAAM,MAAM,GAAG,IAAI;AACzE,UAAM,iBAAiB,0BAA0B,KAAK,gBAAgB,MAAM,iBAAiB,GAAG,IAAI;AACpG,QAAI,KAAM,MAAK,OAAO;AACtB,SAAK,kBAAkB;AACvB,UAAM,qBAAqB,0BAA0B,MAAM,wBAAwB,IAAI;AACvF,QAAI,uBAAuB,OAAW,MAAK,uBAAuB;AAClE,UAAM,iBAAiB,0BAA0B,MAAM,oBAAoB,IAAI;AAC/E,QAAI,mBAAmB,OAAW,MAAK,mBAAmB;AAE1D,UAAM,OAAO,MAAM,KAAK,uBAAuB,OAAO,MAAM;AAC5D,UAAM,aAAsB,MAAM;AAAA,MAChC;AAAA,MACA,KAAK;AAAA,MACL,gBAAgB,KAAK,MAAM;AAAA,MAC3B;AAAA,QACE;AAAA,QACA;AAAA,QACA,oBAAoB,OAAO,KAAK,yBAAyB,WAAW,KAAK,uBAAuB;AAAA,QAChG,gBAAgB,OAAO,KAAK,qBAAqB,WAAW,KAAK,mBAAmB;AAAA,MACtF;AAAA,IACF;AAEA,UAAM,WAAW,gBAAgB,YAAY,IAAI;AACjD,QAAI,CAAC,UAAU;AACb,UAAI,QAAQ;AACV,aAAK,iBAAiB,aAAa,KAAK,WAAW,UAAU,CAAC;AAAA,MAChE,OAAO;AACL,aAAK,UAAU,KAAK,WAAW,UAAU,CAAC;AAAA,MAC5C;AACA;AAAA,IACF;AACA,QAAI,OAAQ,MAAK,iBAAiB,aAAa,QAAQ;AAAA,QAClD,eAAc,UAAU,IAAI;AAAA,EACnC;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA,eAAe,CAAC,SAAS;AACvB,YAAM,aAAa,gBAAgB,MAAM,IAAI;AAC7C,UAAI,CAAC,YAAY;AACf,aAAK,UAAU,IAAI;AACnB;AAAA,MACF;AACA,oBAAc,YAAY,IAAI;AAAA,IAChC;AAAA,EACF;AACF;;;AC9RA,SAAS,aAAaC,oBAAmB;AACzC,SAAS,UAAAC,SAAQ,OAAO,YAAAC,WAAU,iBAAiB;AACnD,OAAOC,WAAU;AAEjB,OAAOC,eAAc;;;ACJrB,OAAOC,WAAU;AAIV,IAAM,6BAA6B,MAAM,KAAK,EAAE,QAAQ,EAAE,GAAG,CAAC,GAAG,MAAM,cAAc,IAAI,CAAC,EAAE;AAC5F,IAAM,6BAA6B,MAAM,KAAK,EAAE,QAAQ,EAAE,GAAG,CAAC,GAAG,MAAM,cAAc,IAAI,CAAC,EAAE;AAEnG,IAAM,wBAAwC;AAAA,EAC5C;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEA,IAAM,8BAA8B,oBAAI,IAAI,CAAC,6BAA6B,gCAAgC,CAAC;AAoCpG,SAAS,kBAAkB,MAAc,OAAe,MAA+B;AAC5F,QAAM,aAAa,KAAK,gBAAgB,MAAM,MAAM,KAAK;AACzD,MAAI,CAAC,sBAAsB,SAAS,UAA0B,GAAG;AAC/D,SAAK;AAAA,MACH,mBAAmB,UAAU;AAAA,MAC7B;AAAA,IACF;AAAA,EACF;AACA,SAAO;AACT;AAEO,SAAS,sBAAsB,MAAc,OAAe,MAAiC;AAClG,QAAM,sBAAsB,KAAK,aAAa,KAAK,YAAY,CAAC;AAChE,QAAM,sBAAsB,KAAK,aAAa,KAAK,YAAY,CAAC;AAChE,QAAM,qBAAqB,2BACxB,IAAI,CAAC,KAAK,OAAO,EAAE,MAAM,IAAI,GAAG,OAAO,KAAK,gBAAgB,MAAM,GAAG,EAAE,EAAE,EACzE,OAAO,CAAC,SAAkD,QAAQ,KAAK,KAAK,CAAC;AAChF,QAAM,qBAAqB,2BACxB,IAAI,CAAC,KAAK,OAAO,EAAE,MAAM,IAAI,GAAG,OAAO,KAAK,gBAAgB,MAAM,GAAG,EAAE,EAAE,EACzE,OAAO,CAAC,SAAkD,QAAQ,KAAK,KAAK,CAAC;AAEhF,MAAI,oBAAoB,SAAS,KAAK,mBAAmB,SAAS,GAAG;AACnE,SAAK;AAAA,MACH;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACA,MAAI,oBAAoB,SAAS,KAAK,mBAAmB,SAAS,GAAG;AACnE,SAAK;AAAA,MACH;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,kBAAkB,oBAAoB,SAAS,mBAAmB;AAAA,IAClE,kBAAkB,oBAAoB,SAAS,mBAAmB;AAAA,EACpE;AACF;AAEO,SAAS,0BACd,SACA,OACA,MACA,OACA,MACM;AACN,MAAI,YAAY,oBAAoB,CAAC,4BAA4B,IAAI,KAAK,GAAG;AAC3E,SAAK;AAAA,MACH,8GAA8G,KAAK;AAAA,MACnH;AAAA,IACF;AAAA,EACF;AAEA,MAAI,YAAY,iBAAiB;AAC/B,QAAI,KAAK,mBAAmB,KAAK,mBAAmB,GAAG;AACrD,WAAK,cAAc,2EAA2E,KAAK;AAAA,IACrG;AACA;AAAA,EACF;AACA,MAAI,YAAY,kBAAkB;AAChC,QAAI,KAAK,mBAAmB,GAAG;AAC7B,WAAK,cAAc,qDAAqD,KAAK;AAAA,IAC/E;AACA,QAAI,KAAK,qBAAqB,GAAG;AAC/B,WAAK,cAAc,gEAAgE,KAAK;AAAA,IAC1F;AACA;AAAA,EACF;AACA,MAAI,YAAY,qBAAqB;AACnC,QAAI,KAAK,mBAAmB,GAAG;AAC7B,WAAK,cAAc,wDAAwD,KAAK;AAAA,IAClF;AACA,QAAI,KAAK,qBAAqB,GAAG;AAC/B,WAAK,cAAc,oEAAoE,KAAK;AAAA,IAC9F;AACA,QAAI,KAAK,mBAAmB,GAAG;AAC7B,WAAK,cAAc,2DAA2D,KAAK;AAAA,IACrF;AACA;AAAA,EACF;AAEA,MAAI,KAAK,mBAAmB,KAAK,qBAAqB,GAAG;AACvD,SAAK,cAAc,iFAAiF,KAAK;AAAA,EAC3G;AACA,MAAI,KAAK,mBAAmB,GAAG;AAC7B,SAAK,cAAc,mDAAmD,KAAK;AAAA,EAC7E;AACA,MAAI,KAAK,mBAAmB,GAAG;AAC7B,SAAK,cAAc,mDAAmD,KAAK;AAAA,EAC7E;AACF;AAEA,eAAsB,6BACpB,SACA,MACA,MACkC;AAClC,QAAM,UAAmC;AAAA,IACvC,WAAW,CAAC;AAAA,IACZ,OAAO,CAAC;AAAA,IACR,aAAa,EAAE,MAAM,CAAC,EAAE;AAAA,EAC1B;AAEA,QAAM,gBAAgB,OACpB,WACA,OACA,cACkB;AAClB,QAAI,KAAK,UAAU,KAAK,GAAG;AACzB,UAAI,YAAY,kBAAkB;AAChC,gBAAQ,YAAY,KAAK,SAAS,IAAI;AAAA,MACxC,WAAW,cAAc,SAAS;AAChC,gBAAQ,UAAU,KAAK,KAAK;AAAA,MAC9B,OAAO;AACL,aAAK,KAAK,QAAQ,OAAO,oCAAoC;AAAA,MAC/D;AACA;AAAA,IACF;AAEA,UAAM,WAAWA,MAAK,QAAQ,KAAK;AACnC,QAAI,CAAE,MAAM,KAAK,WAAW,QAAQ,GAAI;AACtC,WAAK,KAAK,4BAA4B,SAAS,KAAK,QAAQ,EAAE;AAAA,IAChE;AACA,YAAQ,MAAM,SAAS,IAAI;AAAA,MACzB,UAAU;AAAA,MACV,kBAAkBA,MAAK,SAAS,QAAQ;AAAA,IAC1C;AAAA,EACF;AAEA,MAAI,YAAY,kBAAkB;AAChC,aAAS,IAAI,GAAG,IAAI,KAAK,oBAAoB,QAAQ,KAAK,GAAG;AAC3D,YAAM,cAAc,cAAc,IAAI,CAAC,IAAI,KAAK,oBAAoB,CAAC,GAAG,OAAO;AAAA,IACjF;AACA,aAAS,IAAI,GAAG,IAAI,KAAK,oBAAoB,QAAQ,KAAK,GAAG;AAC3D,YAAM,cAAc,cAAc,IAAI,CAAC,IAAI,KAAK,oBAAoB,CAAC,GAAG,OAAO;AAAA,IACjF;AACA,eAAW,QAAQ,KAAK,oBAAoB;AAC1C,YAAM,cAAc,cAAc,KAAK,IAAI,IAAI,KAAK,OAAO,OAAO;AAAA,IACpE;AACA,eAAW,QAAQ,KAAK,oBAAoB;AAC1C,YAAM,cAAc,cAAc,KAAK,IAAI,IAAI,KAAK,OAAO,OAAO;AAAA,IACpE;AACA,WAAO;AAAA,EACT;AAEA,QAAM,cACJ,KAAK,oBAAoB,SAAS,IAC9B,KAAK,sBACL,KAAK,mBAAmB,KAAK,CAAC,GAAG,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,KAAK,KAAK;AACtF,WAAS,IAAI,GAAG,IAAI,YAAY,QAAQ,KAAK,GAAG;AAC9C,UAAM,cAAc,cAAc,IAAI,CAAC,IAAI,YAAY,CAAC,GAAG,OAAO;AAAA,EACpE;AACA,SAAO;AACT;;;ADtKA,SAAS,aAAa,QAA4B,OAAe,MAAuC;AACtG,MAAI,CAAC,QAAQ;AACX,SAAK,KAAK;AAAA;AAAA,EAAiC,KAAK,EAAE;AAAA,EACpD;AACA,SAAO;AACT;AAEA,SAAS,UAAU,OAAwB;AACzC,SAAO,gBAAgB,KAAK,KAAK;AACnC;AAEA,eAAeC,YAAW,UAAoC;AAC5D,MAAI;AACF,UAAMC,QAAO,UAAUC,aAAY,IAAI;AACvC,WAAO;AAAA,EACT,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,SAAS,qBAAqB,aAA2C;AACvE,MAAI,CAAC,YAAa,QAAO;AACzB,MAAI,YAAY,SAAS,YAAY,EAAG,QAAO;AAC/C,MAAI,YAAY,SAAS,WAAW,EAAG,QAAO;AAC9C,MAAI,YAAY,SAAS,YAAY,EAAG,QAAO;AAC/C,MAAI,YAAY,SAAS,WAAW,EAAG,QAAO;AAC9C,SAAO;AACT;AAEA,SAAS,4BAA4B,SAAgC;AACnE,MAAI;AACF,UAAM,WAAW,IAAI,IAAI,OAAO,EAAE,SAAS,YAAY;AACvD,QAAI,SAAS,SAAS,MAAM,KAAK,SAAS,SAAS,OAAO,EAAG,QAAO;AACpE,QAAI,SAAS,SAAS,MAAM,EAAG,QAAO;AACtC,QAAI,SAAS,SAAS,OAAO,EAAG,QAAO;AACvC,QAAI,SAAS,SAAS,MAAM,EAAG,QAAO;AAAA,EACxC,QAAQ;AACN,WAAO;AAAA,EACT;AACA,SAAO;AACT;AAEA,SAAS,+BAA+B,QAA+B;AACrE,MAAI,OAAO,UAAU,GAAG;AACtB,QACE,OAAO,CAAC,MAAM,OACd,OAAO,CAAC,MAAM,MACd,OAAO,CAAC,MAAM,MACd,OAAO,CAAC,MAAM,MACd,OAAO,CAAC,MAAM,MACd,OAAO,CAAC,MAAM,MACd,OAAO,CAAC,MAAM,MACd,OAAO,CAAC,MAAM,GACd,QAAO;AAAA,EACX;AACA,MAAI,OAAO,UAAU,GAAG;AACtB,QAAI,OAAO,CAAC,MAAM,OAAQ,OAAO,CAAC,MAAM,OAAQ,OAAO,CAAC,MAAM,IAAM,QAAO;AAAA,EAC7E;AACA,MAAI,OAAO,UAAU,IAAI;AACvB,QACE,OAAO,SAAS,SAAS,GAAG,CAAC,MAAM,UACnC,OAAO,SAAS,SAAS,GAAG,EAAE,MAAM,OACpC,QAAO;AAAA,EACX;AACA,MAAI,OAAO,UAAU,GAAG;AACtB,UAAM,MAAM,OAAO,SAAS,SAAS,GAAG,CAAC;AACzC,QAAI,QAAQ,YAAY,QAAQ,SAAU,QAAO;AAAA,EACnD;AACA,SAAO;AACT;AAEA,SAAS,qBAAqB,aAA4B,SAAyB;AACjF,MAAI,2CAAa,SAAS,aAAc,QAAO;AAC/C,MAAI,2CAAa,SAAS,cAAe,QAAO;AAChD,QAAM,WAAW,IAAI,IAAI,OAAO,EAAE,SAAS,YAAY;AACvD,MAAI,SAAS,SAAS,MAAM,EAAG,QAAO;AACtC,MAAI,SAAS,SAAS,OAAO,EAAG,QAAO;AACvC,MAAI,SAAS,SAAS,MAAM,EAAG,QAAO;AACtC,SAAO;AACT;AAEA,SAASC,2BACP,MACA,KACA,MACoB;AACpB,QAAM,MAAM,KAAK,gBAAgB,MAAM,GAAG;AAC1C,MAAI,CAAC,IAAK,QAAO;AACjB,QAAM,SAAS,OAAO,GAAG;AACzB,MAAI,CAAC,OAAO,SAAS,MAAM,KAAK,UAAU,GAAG;AAC3C,SAAK,KAAK,aAAa,GAAG,KAAK,GAAG,EAAE;AAAA,EACtC;AACA,SAAO;AACT;AAEA,SAAS,uBACP,MACA,MACA,MACA,kBAAkB,MACT;AACT,QAAM,OAAO,QAAQ,KAAK,IAAI;AAC9B,MAAI,gBAAiB,MAAK,OAAO;AACjC,QAAM,qBAAqBA,2BAA0B,MAAM,wBAAwB,IAAI;AACvF,MAAI,uBAAuB,OAAW,MAAK,uBAAuB;AAClE,QAAM,iBAAiBA,2BAA0B,MAAM,oBAAoB,IAAI;AAC/E,MAAI,mBAAmB,OAAW,MAAK,mBAAmB;AAC1D,SAAO;AACT;AAEA,eAAe,eAAe,KAAa,MAAwF;AACjI,QAAM,WAAW,MAAM,MAAM,GAAG;AAChC,MAAI,CAAC,SAAS,IAAI;AAChB,SAAK,KAAK,oBAAoB,SAAS,MAAM,MAAM,GAAG,EAAE;AAAA,EAC1D;AACA,SAAO;AAAA,IACL,QAAQ,OAAO,KAAK,MAAM,SAAS,YAAY,CAAC;AAAA,IAChD,aAAa,SAAS,QAAQ,IAAI,cAAc;AAAA,EAClD;AACF;AAEA,eAAe,eACb,MACA,WACA,QACA,MACmB;AACnB,QAAM,MAAMC,MAAK,QAAQ,SAAS;AAClC,QAAM,MAAM,KAAK,EAAE,WAAW,KAAK,CAAC;AACpC,QAAM,aAAY,oBAAI,KAAK,GAAE,YAAY,EAAE,QAAQ,YAAY,EAAE;AACjE,QAAM,QAAkB,CAAC;AAEzB,WAAS,IAAI,GAAG,IAAI,KAAK,QAAQ,KAAK,GAAG;AACvC,UAAM,WAAW,KAAK,CAAC;AACvB,UAAM,EAAE,QAAQ,YAAY,IAAI,MAAM,eAAe,UAAU,IAAI;AACnE,UAAM,MACJ,qBAAqB,WAAW,KAChC,+BAA+B,MAAM,KACrC,4BAA4B,QAAQ,KACpC;AACF,UAAM,WAAW,GAAG,MAAM,IAAI,SAAS,IAAI,OAAO,IAAI,CAAC,EAAE,SAAS,GAAG,GAAG,CAAC,IAAI,GAAG;AAChF,UAAM,WAAWA,MAAK,KAAK,KAAK,QAAQ;AACxC,UAAM,UAAU,UAAU,MAAM;AAChC,UAAM,KAAK,QAAQ;AAAA,EACrB;AAEA,SAAO;AACT;AAEO,SAAS,2BAA2B,MAIzC;AACA,QAAM,sBAAsB,OAAO,SAAkC;AACnE,UAAM,OAAOC,UAAS,MAAM;AAAA,MAC1B,QAAQ;AAAA,QACN;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,MACA,SAAS,CAAC,QAAQ,qBAAqB,QAAQ,MAAM;AAAA,MACrD,SAAS,EAAE,MAAM,KAAK;AAAA,IACxB,CAAC;AAED,QAAI,KAAK,MAAM;AACb,cAAQ,IAAI,KAAK,mBAAmB,CAAC;AACrC;AAAA,IACF;AAEA,UAAM,QAAQ,KAAK,gBAAgB,MAAM,OAAO;AAChD,UAAM,SAAS,KAAK,qBAAqB,IAAI;AAC7C,UAAM,SAAS,aAAa,KAAK,gBAAgB,MAAM,QAAQ,GAAG,KAAK,mBAAmB,GAAG,IAAI;AACjG,UAAM,YAAY,KAAK,gBAAgB,MAAM,YAAY,KAAK;AAE9D,UAAM,OAAmB;AAAA,MACvB;AAAA,MACA,OAAO,KAAK,gBAAgB,MAAM,OAAO,KAAK;AAAA,MAC9C,OAAO,KAAK,gBAAgB,MAAM,OAAO,KAAK;AAAA,MAC9C,YAAY,KAAK,gBAAgB,MAAM,YAAY,KAAK;AAAA,IAC1D;AAEA,UAAM,iBAAiB,KAAK,gBAAgB,MAAM,iBAAiB;AACnE,QAAI,eAAgB,MAAK,kBAAkB;AAC3C,QAAI,KAAK,mBAAmB,EAAG,MAAK,oBAAoB;AACxD,UAAM,OAAO,uBAAuB,MAAM,MAAM,IAAI;AACpD,UAAM,SAAS,QAAQ,KAAK,IAAI;AAEhC,UAAM,oBAAoB,KAAK,gBAAgB,MAAM,iBAAiB;AACtE,QAAI,mBAAmB;AACrB,YAAM,SAAS,OAAO,iBAAiB;AACvC,UAAI,CAAC,OAAO,SAAS,MAAM,GAAG;AAC5B,aAAK,KAAK,8BAA8B,iBAAiB,EAAE;AAAA,MAC7D;AACA,WAAK,kBAAkB;AAAA,IACzB;AAEA,UAAM,OAAO,MAAM,KAAK;AAAA,MACtB;AAAA,MACA;AAAA,MACA,OAAO,KAAK,SAAS,YAAY;AAAA,MACjC;AAAA,IACF;AACA,UAAM,SAAS,MAAM;AAAA,MACnB,OAAO,KAAK,SAAS,YAAY;AAAA,MACjC,OAAO,MAAM;AAAA,MACb;AAAA,QACE,OAAO,OAAO,KAAK,SAAS,KAAK;AAAA,QACjC,YAAY,OAAO,KAAK,cAAc,IAAI;AAAA,QAC1C,gBAAgB,OAAO,KAAK,oBAAoB,WAAW,KAAK,kBAAkB;AAAA,QAClF,gBAAgB,OAAO,KAAK,oBAAoB,WAAW,KAAK,kBAAkB;AAAA,QAClF,kBAAkB,QAAQ,KAAK,iBAAiB;AAAA,QAChD;AAAA,QACA,oBAAoB,OAAO,KAAK,yBAAyB,WAAW,KAAK,uBAAuB;AAAA,QAChG,gBAAgB,OAAO,KAAK,qBAAqB,WAAW,KAAK,mBAAmB;AAAA,MACtF;AAAA,MACA,KAAK;AAAA,MACL,gBAAgB,KAAK,MAAM;AAAA,IAC7B;AACA,QAAI,CAAC,MAAM,QAAQ,MAAM,GAAG;AAC1B,UAAI,OAAQ,MAAK,iBAAiB,kBAAkB,QAAQ,EAAE,KAAK,CAAC;AAAA,UAC/D,MAAK,cAAc,MAAM;AAC9B;AAAA,IACF;AACA,UAAM,OAAiB;AACvB,QAAI,KAAK,WAAW,EAAG,MAAK,KAAK,iCAAiC;AAElE,UAAM,aAAa,MAAM,eAAe,MAAM,WAAW,yBAAyB,IAAI;AACtF,QAAI,QAAQ;AACV,WAAK;AAAA,QACH;AAAA,QACA,EAAE,MAAM,KAAK,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,GAAG,OAAO,WAAW;AAAA,QACxD,EAAE,KAAK;AAAA,MACT;AAAA,IACF,OAAO;AACL,WAAK,qBAAqB,SAAS,UAAU;AAAA,IAC/C;AAAA,EACF;AAEA,QAAM,kBAAkB,OAAO,SAAkC;AAC/D,UAAM,OAAOA,UAAS,MAAM;AAAA,MAC1B,QAAQ;AAAA,QACN;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,MACA,SAAS,CAAC,QAAQ,qBAAqB,QAAQ,MAAM;AAAA,MACrD,SAAS,EAAE,MAAM,KAAK;AAAA,IACxB,CAAC;AAED,QAAI,KAAK,MAAM;AACb,cAAQ,IAAI,KAAK,eAAe,CAAC;AACjC;AAAA,IACF;AAEA,UAAM,QAAQ,KAAK,gBAAgB,MAAM,OAAO;AAChD,UAAM,SAAS,KAAK,qBAAqB,IAAI;AAC7C,UAAM,SAAS,aAAa,KAAK,gBAAgB,MAAM,QAAQ,GAAG,KAAK,eAAe,GAAG,IAAI;AAC7F,UAAM,UAAU,KAAK,aAAa,KAAK,KAAK;AAC5C,QAAI,QAAQ,WAAW,EAAG,MAAK,cAAc,6BAA6B,KAAK,eAAe,CAAC;AAC/F,QAAI,QAAQ,SAAS,GAAI,MAAK,KAAK,iDAAiD;AAEpF,UAAM,YAAY,KAAK,gBAAgB,MAAM,YAAY,KAAK;AAC9D,UAAM,QAAQ,KAAK,gBAAgB,MAAM,OAAO,KAAK;AACrD,UAAM,QAAQ,KAAK,gBAAgB,MAAM,OAAO,KAAK;AACrD,UAAM,aAAa,KAAK,gBAAgB,MAAM,YAAY,KAAK;AAC/D,UAAM,iBAAiB,KAAK,gBAAgB,MAAM,iBAAiB;AACnE,UAAM,oBAAoB,KAAK,gBAAgB,MAAM,iBAAiB;AACtE,UAAM,mBAAmB,QAAQ,KAAK,mBAAmB,CAAC;AAC1D,UAAM,OAAO,QAAQ,KAAK,IAAI;AAC9B,UAAM,SAAS,QAAQ,KAAK,IAAI;AAEhC,UAAM,UAAU,QAAQ,MAAM,SAAS;AACvC,UAAM,WAAW,QAAQ,MAAM,CAAC,SAAS,CAAC,UAAU,IAAI,CAAC;AACzD,QAAI,CAAC,WAAW,CAAC,UAAU;AACzB,WAAK,KAAK,yEAAyE;AAAA,IACrF;AAEA,UAAM,OAAO,MAAM,KAAK,6BAA6B,OAAO,QAAQ,OAAO,OAAO;AAClF,UAAM,SAAiC,CAAC;AACxC,QAAI,SAAS;AACX,aAAO,KAAK,GAAG,OAAO;AAAA,IACxB,OAAO;AACL,iBAAW,UAAU,SAAS;AAC5B,cAAM,YAAYD,MAAK,QAAQ,MAAM;AACrC,YAAI,CAAE,MAAMJ,YAAW,SAAS,EAAI,MAAK,KAAK,yBAAyB,SAAS,EAAE;AAClF,eAAO,KAAK,MAAMM,UAAS,SAAS,CAAC;AAAA,MACvC;AAAA,IACF;AACA,UAAM,iBAAiB,oBAAoB,OAAO,iBAAiB,IAAI;AACvE,QAAI,qBAAqB,CAAC,OAAO,SAAS,cAAc,GAAG;AACzD,WAAK,KAAK,8BAA8B,iBAAiB,EAAE;AAAA,IAC7D;AAEA,UAAM,SAAS,MAAM;AAAA,MACnB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,QACE;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,oBAAoBH,2BAA0B,MAAM,wBAAwB,IAAI;AAAA,QAChF,gBAAgBA,2BAA0B,MAAM,oBAAoB,IAAI;AAAA,MAC1E;AAAA,MACA,KAAK;AAAA,MACL,gBAAgB,KAAK,MAAM;AAAA,IAC7B;AACA,QAAI,CAAC,MAAM,QAAQ,MAAM,GAAG;AAC1B,UAAI,OAAQ,MAAK,iBAAiB,cAAc,QAAQ,EAAE,KAAK,CAAC;AAAA,UAC3D,MAAK,cAAc,MAAM;AAC9B;AAAA,IACF;AACA,UAAM,OAAiB;AACvB,QAAI,KAAK,WAAW,EAAG,MAAK,KAAK,iCAAiC;AAElE,UAAM,aAAa,MAAM,eAAe,MAAM,WAAW,qBAAqB,IAAI;AAClF,QAAI,QAAQ;AACV,WAAK;AAAA,QACH;AAAA,QACA,EAAE,MAAM,KAAK,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,GAAG,OAAO,WAAW;AAAA,QACxD,EAAE,KAAK;AAAA,MACT;AAAA,IACF,OAAO;AACL,WAAK,qBAAqB,SAAS,UAAU;AAAA,IAC/C;AAAA,EACF;AAEA,QAAM,sBAAsB,OAAO,SAAkC;AACnE,UAAM,QAAQ,KAAK,mBAAmB;AACtC,UAAM,OAAOE,UAAS,MAAM;AAAA,MAC1B,QAAQ;AAAA,QACN;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,GAAG;AAAA,QACH,GAAG;AAAA,QACH;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,MACA,SAAS,CAAC,QAAQ,QAAQ,MAAM;AAAA,MAChC,SAAS,EAAE,MAAM,KAAK;AAAA,IACxB,CAAC;AAED,QAAI,KAAK,MAAM;AACb,cAAQ,IAAI,KAAK;AACjB;AAAA,IACF;AAEA,UAAM,QAAQ,KAAK,gBAAgB,MAAM,OAAO;AAChD,UAAM,SAAS,KAAK,qBAAqB,IAAI;AAC7C,UAAM,SAAS,aAAa,KAAK,gBAAgB,MAAM,QAAQ,GAAG,OAAO,IAAI;AAC7E,UAAM,UAAU,kBAAkB,MAAM,OAAO;AAAA,MAC7C,iBAAiB,KAAK;AAAA,MACtB,cAAc,KAAK;AAAA,MACnB,eAAe,KAAK;AAAA,IACtB,CAAC;AACD,UAAM,YAAY,sBAAsB,MAAM,OAAO;AAAA,MACnD,iBAAiB,KAAK;AAAA,MACtB,cAAc,KAAK;AAAA,MACnB,eAAe,KAAK;AAAA,IACtB,CAAC;AAED,UAAM,YAAY,KAAK,gBAAgB,MAAM,YAAY,KAAK;AAC9D,UAAM,QAAQ,KAAK,gBAAgB,MAAM,OAAO,MAC1C,YAAY,mBAAmB,mCAAmC;AACxE,8BAA0B,SAAS,OAAO,WAAW,OAAO,EAAE,eAAe,KAAK,cAAc,CAAC;AACjG,UAAM,eAAe,YAAY,mBAAmB,mBAAmB;AACvE,UAAM,QAAQ,KAAK,gBAAgB,MAAM,OAAO,KAAK;AACrD,UAAM,aAAa,KAAK,gBAAgB,MAAM,YAAY,KAAK;AAC/D,UAAM,cAAc,KAAK,gBAAgB,MAAM,UAAU,KAAK;AAC9D,UAAM,WAAW,OAAO,WAAW;AACnC,QAAI,CAAC,OAAO,SAAS,QAAQ,KAAK,YAAY,KAAK,CAAC,OAAO,UAAU,QAAQ,GAAG;AAC9E,WAAK,KAAK,uBAAuB,WAAW,qCAAqC;AAAA,IACnF;AACA,UAAM,OAAO,QAAQ,KAAK,IAAI;AAC9B,UAAM,SAAS,QAAQ,KAAK,IAAI;AAChC,UAAM,yBAAyB,YAAY,mBAAmB,CAAC,gBAAgB,IAAI,CAAC;AACpF,UAAM,OAAO,MAAM,KAAK,6BAA6B,OAAO,QAAQ,OAAO,SAAS,sBAAsB;AAC1G,UAAM,eAAe,MAAM,6BAA6B,SAAS,WAAW;AAAA,MAC1E;AAAA,MACA,YAAAL;AAAA,MACA,MAAM,KAAK;AAAA,IACb,CAAC;AAED,UAAM,SAAS,MAAM;AAAA,MACnB;AAAA,MACA;AAAA,MACA;AAAA,QACE;AAAA,QACA;AAAA,QACA;AAAA,QACA,WAAW,aAAa;AAAA,QACxB,OAAO,aAAa;AAAA,QACpB,aAAa,aAAa;AAAA,QAC1B;AAAA,QACA;AAAA,QACA,oBAAoBG,2BAA0B,MAAM,wBAAwB,IAAI;AAAA,QAChF,gBAAgBA,2BAA0B,MAAM,oBAAoB,IAAI;AAAA,MAC1E;AAAA,MACA,KAAK;AAAA,MACL,gBAAgB,KAAK,MAAM;AAAA,IAC7B;AAEA,QAAI,OAAO,WAAW,UAAU;AAC9B,UAAI,OAAQ,MAAK,iBAAiB,kBAAkB,QAAQ,EAAE,MAAM,MAAM,QAAQ,CAAC;AAAA,UAC9E,MAAK,cAAc,MAAM;AAC9B;AAAA,IACF;AACA,UAAM,WAAmB;AAEzB,UAAM,EAAE,QAAQ,YAAY,IAAI,MAAM,eAAe,UAAU,IAAI;AACnE,UAAM,MAAMC,MAAK,QAAQ,SAAS;AAClC,UAAM,MAAM,KAAK,EAAE,WAAW,KAAK,CAAC;AACpC,UAAM,aAAY,oBAAI,KAAK,GAAE,YAAY,EAAE,QAAQ,YAAY,EAAE;AACjE,UAAM,MAAM,qBAAqB,aAAa,QAAQ;AACtD,UAAM,WAAWA,MAAK,KAAK,KAAK,yBAAyB,SAAS,IAAI,GAAG,EAAE;AAC3E,UAAM,UAAU,UAAU,MAAM;AAEhC,QAAI,QAAQ;AACV,WAAK;AAAA,QACH;AAAA,QACA,EAAE,MAAM,CAAC,EAAE,KAAK,SAAS,CAAC,GAAG,OAAO,CAAC,QAAQ,EAAE;AAAA,QAC/C,EAAE,MAAM,MAAM,QAAQ;AAAA,MACxB;AAAA,IACF,OAAO;AACL,WAAK,qBAAqB,SAAS,CAAC,QAAQ,CAAC;AAAA,IAC/C;AAAA,EACF;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;;;AHpeA,IAAM,cAAc;AACpB,IAAM,cAAc;AAEpB,SAAS,eACP,WACA,SACA,UACQ;AACR,QAAM,QAAQ;AAAA,IACZ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,GAAG;AAAA,EACL;AACA,MAAI,YAAY,SAAS,SAAS,GAAG;AACnC,eAAW,WAAW,UAAU;AAC9B,YAAM,KAAK,IAAI,QAAQ,OAAO,GAAG,QAAQ,KAAK;AAAA,IAChD;AAAA,EACF;AACA,SAAO,MAAM,KAAK,IAAI;AACxB;AAEA,SAAS,YAAoB;AAC3B,QAAM,eAAe,qBAAqB;AAAA,IACxC,CAAC,UAAU,KAAK,MAAM,KAAK,OAAO,EAAE,CAAC,GAAG,MAAM,WAAW;AAAA,EAC3D;AACA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,GAAG;AAAA,IACH;AAAA,IACA,GAAG;AAAA,EACL,EAAE,KAAK,IAAI;AACb;AAEA,SAAS,kBAA0B;AACjC,SAAO,eAAe,kCAAkC;AAAA,IACtD;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AACH;AAEA,SAAS,qBAAqB,MAAmC;AAC/D,QAAM,aAAa,0BAA0B,IAAI;AACjD,SAAO,eAAe,WAAW,WAAW,WAAW,SAAS,WAAW,QAAQ;AACrF;AAEA,SAAS,iBAAyB;AAChC,QAAM,kBAAkB,kBAAkB;AAAA,IACxC,CAAC,eAAe,KAAK,WAAW,KAAK,OAAO,EAAE,CAAC,GAAG,WAAW,WAAW;AAAA,EAC1E;AACA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,GAAG;AAAA,IACH;AAAA,IACA;AAAA,EACF,EAAE,KAAK,IAAI;AACb;AAEA,SAAS,qBAA6B;AACpC,SAAO,eAAe,qDAAqD;AAAA,IACzE;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AACH;AAEA,SAAS,iBAAyB;AAChC,SAAO;AAAA,IACL;AAAA,IACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACA;AAAA,IACA;AAAA,MACE;AAAA,QACE,OAAO;AAAA,QACP,OAAO,CAAC,uEAAuE;AAAA,MACjF;AAAA,IACF;AAAA,EACF;AACF;AAEA,SAAS,qBAA6B;AACpC,SAAO,eAAe,qDAAqD;AAAA,IACzE;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,GAAG;AAAA,IACD;AAAA,MACE,OAAO;AAAA,MACP,OAAO;AAAA,QACL;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAAA,IACA;AAAA,MACE,OAAO;AAAA,MACP,OAAO;AAAA,QACL;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAAA,EACF,CAAC;AACH;AAEA,SAAS,eAAuB;AAC9B,SAAO,eAAe,8CAA8C;AAAA,IAClE;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AACH;AAEA,SAAS,gBAAwB;AAC/B,SAAO,eAAe,+CAA+C;AAAA,IACnE;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AACH;AAEA,SAAS,oBAAoB,SAAmC;AAC9D,MAAIG,SAAQ,IAAI,4BAA4B,QAAQ;AAClD,IAAAA,SAAQ,IAAI,yBAAyB;AACrC;AAAA,EACF;AACA,EAAAA,SAAQ,IAAI,yBAAyB;AACrC,iBAAO,OAAO,YAAY;AAC1B,iBAAO,OAAO,QAAQ;AACtB,iBAAO,OAAO,aAAa;AAC3B,iBAAO,OAAO,MAAM;AACpB,iBAAO,QAAQ,MAAM;AACrB,iBAAO,OAAO,MAAM;AACpB,iBAAO,QAAQ,MAAM;AACrB,UAAQ,OAAO,MAAM;AACrB,UAAQ,QAAQ,MAAM;AACtB,UAAQ,OAAO,MAAM;AACvB;AAEA,SAAS,KAAK,SAAwB;AACpC,QAAM,IAAI,MAAM,OAAO;AACzB;AAEA,SAAS,cAAc,QAAgB,OAAsB;AAC3D,OAAK,GAAG,MAAM;AAAA;AAAA,EAAO,KAAK,EAAE;AAC9B;AAEA,SAAS,gBAAgB,MAA+B,KAAiC;AACvF,QAAM,MAAM,KAAK,GAAG;AACpB,MAAI,OAAO,QAAQ,YAAY,IAAI,KAAK,EAAE,SAAS,EAAG,QAAO,IAAI,KAAK;AACtE,SAAO;AACT;AAEA,SAAS,qBAAqB,MAAuC;AACnE,SAAO,gBAAgB,MAAM,QAAQ,KAAK;AAC5C;AAEA,SAAS,aAAa,KAAwB;AAC5C,MAAI,OAAO,QAAQ,SAAU,QAAO,IAAI,MAAM,GAAG,EAAE,IAAI,CAAC,SAAS,KAAK,KAAK,CAAC,EAAE,OAAO,OAAO;AAC5F,MAAI,MAAM,QAAQ,GAAG,GAAG;AACtB,WAAO,IACJ,QAAQ,CAAC,SAAU,OAAO,SAAS,WAAW,KAAK,MAAM,GAAG,IAAI,CAAC,CAAE,EACnE,IAAI,CAAC,SAAS,KAAK,KAAK,CAAC,EACzB,OAAO,OAAO;AAAA,EACnB;AACA,SAAO,CAAC;AACV;AAEA,IAAI,iBAAiB;AACrB,eAAe,uBAAsC;AACnD,MAAI,eAAgB;AACpB,QAAM,qBAAU,KAAK;AACrB,mBAAiB;AACnB;AAEA,SAAS,kBAAkB,QAAoD;AAC7E,MAAI,CAAC,OAAQ,QAAO;AACpB,QAAM,SAAS,gBAAgB,MAAM;AACrC,MAAI,CAAC,OAAQ,MAAK,uCAAuC;AACzD,SAAO;AACT;AAEA,eAAe,6BACb,OACA,QACA,gBACA,UACA,yBAAmC,CAAC,GACY;AAChD,QAAM,qBAAqB;AAC3B,QAAM,YAAY,qBAAU,oBAAoB;AAAA,IAC9C,eAAe,QAAQ,UAAU,KAAK,KAAK;AAAA,IAC3C;AAAA,IACA;AAAA,IACA;AAAA,IACA,SAAS;AAAA,EACX,CAAC;AACD,MAAI,CAAC,UAAU,SAAS,CAAC,UAAU,QAAQ;AACzC,SAAK,UAAU,UAAU,mFAAmF;AAAA,EAC9G;AACA,SAAO,EAAE,OAAO,UAAU,OAAO,QAAQ,UAAU,OAAO;AAC5D;AAEA,eAAe,uBACb,OACA,QACgD;AAvSlD;AAwSE,QAAM,qBAAqB;AAC3B,QAAM,eAAe,kBAAkB,MAAM;AAE7C,MAAI,OAAO;AACT,UAAM,YAAW,0BAAU,cAAc,KAAK,MAA7B,mBAAgC;AACjD,UAAM,cAAc,gBAAgB;AACpC,QAAI,CAAC,aAAa;AAChB,WAAK,+FAA+F;AAAA,IACtG;AACA,WAAO,EAAE,OAAO,QAAQ,YAAY;AAAA,EACtC;AAEA,QAAM,aAAa,qBAChB,WAAW,KAAK,EAChB,OAAO,CAAC,SAAS,KAAK,WAAW,KAAK,SAAS,SAAS,KAAK,MAAM,EACnE,OAAO,CAAC,SAAU,eAAe,KAAK,WAAW,eAAe,IAAK;AACxE,MAAI,WAAW,WAAW,GAAG;AAC3B,SAAK,4FAA4F;AAAA,EACnG;AACA,SAAO,EAAE,OAAO,WAAW,CAAC,EAAE,OAAO,QAAQ,WAAW,CAAC,EAAE,OAAQ;AACrE;AAEA,SAAS,WAAW,SAA2B;AAC7C,MAAI,CAAC,WAAW,OAAO,YAAY,SAAU,QAAO;AACpD,QAAM,OAAO;AACb,MAAI,UAAU,SAAS,UAAU,QAAQ,aAAa,OAAO;AAC3D,WAAO,KAAK;AAAA,EACd;AACA,SAAO;AACT;AAEA,SAAS,UAAU,OAAsB;AACvC,UAAQ,IAAI,KAAK,UAAU,OAAO,MAAM,CAAC,CAAC;AAC5C;AAEA,SAAS,iBACP,SACA,MACA,MACM;AACN,QAAM,UAAsB;AAAA,IAC1B,QAAQ;AAAA,IACR;AAAA,IACA;AAAA,EACF;AACA,MAAI,QAAQ,OAAO,KAAK,IAAI,EAAE,SAAS,GAAG;AACxC,YAAQ,OAAO;AAAA,EACjB;AACA,YAAU,OAAO;AACnB;AAEA,SAAS,qBAAqB,MAAyB,OAAuB;AAC5E,QAAM,QAAQ,SAAS,UAAU,WAAW;AAC5C,UAAQ,IAAI,cAAc,MAAM,MAAM,IAAI,KAAK,GAAG;AAClD,aAAW,QAAQ,OAAO;AACxB,YAAQ,IAAI,KAAK,IAAI,EAAE;AAAA,EACzB;AACF;AAEA,SAAS,cAAc,OAAoC;AACzD,SAAO,UAAU,YAAY,UAAU,QAAQ,UAAU;AAC3D;AAEA,IAAM,oBAA0C,uBAAuB;AAAA,EACrE,UAAU,CAAC,SAAS,qBAAqB,IAAI;AAAA,EAC7C;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,YAAY;AAAA,EACZ,YAAY;AACd,CAAC;AAED,IAAM,gBAAgB,2BAA2B;AAAA,EAC/C;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAED,IAAM,gBAAgB,2BAA2B;AAAA,EAC/C;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,eAAe,CAAC,SAAS,cAAc,cAAc,IAAI;AAC3D,CAAC;AAED,IAAM,4BAA6E,OAAO;AAAA,EACxF,kBAAkB,IAAI,CAAC,eAAe,CAAC,WAAW,MAAM,UAAU,CAAC;AACrE;AAEA,SAAS,iBACP,aAC4B;AAC5B,SAAO,OAAO,YAAY,YAAY,IAAI,CAAC,SAAS,CAAC,KAAK,MAAM,KAAK,OAAO,CAAC,CAAC;AAChF;AAiBA,IAAM,gBAA+B;AAAA,EACnC;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,aAAa,CAAC,EAAE,MAAM,QAAQ,aAAa,yBAAyB,SAAS,cAAc,iBAAiB,CAAC;AAAA,IAC7G,OAAO;AAAA,EACT;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,aAAa;AAAA,MACX,EAAE,MAAM,YAAY,aAAa,4BAA4B,SAAS,cAAc,oBAAoB;AAAA,MACxG,EAAE,MAAM,QAAQ,aAAa,6BAA6B,SAAS,cAAc,gBAAgB;AAAA,IACnG;AAAA,IACA,OAAO;AAAA,EACT;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,aAAa;AAAA,MACX;AAAA,QACE,MAAM;AAAA,QACN,aAAa;AAAA,QACb,SAAS,cAAc;AAAA,MACzB;AAAA,IACF;AAAA,IACA,OAAO;AAAA,EACT;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,aAAa;AAAA,MACX,EAAE,MAAM,OAAO,aAAa,mBAAmB,SAAS,cAAc,cAAc;AAAA,MACpF,EAAE,MAAM,QAAQ,aAAa,8BAA8B,SAAS,cAAc,eAAe;AAAA,IACnG;AAAA,IACA,OAAO;AAAA,EACT;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,aAAa,kBAAkB,IAAI,CAAC,gBAAgB;AAAA,MAClD,MAAM,WAAW;AAAA,MACjB,aAAa,WAAW;AAAA,MACxB,SAAS,WAAW;AAAA,IACtB,EAAE;AAAA,IACF,OAAO;AAAA,IACP,eAAe;AAAA,EACjB;AACF;AAEA,IAAM,wBAAqD,OAAO;AAAA,EAChE,cAAc,IAAI,CAAC,SAAS,CAAC,KAAK,MAAM,IAAI,CAAC;AAC/C;AAEA,IAAM,uBAAqE,cAAc,QAAQ,CAAC,SAAS;AACzG,MAAI,KAAK,SAAS;AAChB,WAAO,CAAC,EAAE,MAAM,KAAK,MAAM,aAAa,KAAK,YAAY,CAAC;AAAA,EAC5D;AACA,MAAI,CAAC,KAAK,eAAe,KAAK,YAAY,WAAW,GAAG;AACtD,WAAO,CAAC,EAAE,MAAM,KAAK,MAAM,aAAa,KAAK,YAAY,CAAC;AAAA,EAC5D;AACA,MAAI,KAAK,eAAe;AACtB,WAAO,CAAC,EAAE,MAAM,GAAG,KAAK,IAAI,iBAAiB,aAAa,KAAK,YAAY,CAAC;AAAA,EAC9E;AACA,SAAO,KAAK,YAAY,IAAI,CAAC,gBAAgB;AAAA,IAC3C,MAAM,GAAG,KAAK,IAAI,IAAI,WAAW,IAAI;AAAA,IACrC,aAAa,WAAW;AAAA,EAC1B,EAAE;AACJ,CAAC;AAED,IAAM,uBAAiC;AAAA,EACrC;AAAA,EACA,GAAG,cACA,OAAO,CAAC,SAAS,KAAK,aAAa,EACnC,IAAI,CAAC,SAAS,gBAAgB,KAAK,IAAI,iBAAiB,KAAK,IAAI,eAAe;AACrF;AAEA,eAAe,mBACb,YACA,MACA,UACA,OACA,cACkB;AAClB,MAAI,CAAC,cAAc,cAAc,UAAU,GAAG;AAC5C,YAAQ,IAAI,KAAK;AACjB,WAAO;AAAA,EACT;AACA,QAAM,UAAU,SAAS,UAAU;AACnC,MAAI,CAAC,SAAS;AACZ,kBAAc,WAAW,YAAY,KAAK,UAAU,IAAI,KAAK;AAAA,EAC/D;AACA,QAAM,QAAQ,IAAI;AAClB,SAAO;AACT;AAEA,eAAe,MAAqB;AAClC,QAAM,CAAC,SAAS,YAAY,GAAG,IAAI,IAAIA,SAAQ,KAAK,MAAM,CAAC;AAC3D,sBAAoB,OAAO;AAE3B,MAAI,CAAC,WAAW,cAAc,OAAO,GAAG;AACtC,YAAQ,IAAI,UAAU,CAAC;AACvB;AAAA,EACF;AACA,QAAM,OAAO,sBAAsB,OAAO;AAC1C,MAAI,CAAC,MAAM;AACT,kBAAc,oBAAoB,CAAC,SAAS,UAAU,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG,CAAC,IAAI,UAAU,CAAC;AAAA,EAClG;AAEA,MAAI,KAAK,SAAS;AAChB,UAAM,KAAK,QAAQ,IAAI;AACvB;AAAA,EACF;AAEA,MAAI,KAAK,aAAa;AACpB,UAAM,WAAW,iBAAiB,KAAK,WAAW;AAClD,QACE,MAAM;AAAA,MACJ;AAAA,MACAA,SAAQ,KAAK,MAAM,CAAC;AAAA,MACpB;AAAA,MACA,KAAK,QAAQ,KAAK,MAAM,IAAI,UAAU;AAAA,MACtC,GAAG,OAAO;AAAA,IACZ,GACA;AACA;AAAA,IACF;AAAA,EACF;AAEA,gBAAc,oBAAoB,CAAC,SAAS,UAAU,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG,CAAC,IAAI,UAAU,CAAC;AAClG;AAEO,SAAS,SAAe;AAC7B,MAAI,EAAE,MAAM,CAAC,UAAU;AACrB,UAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AACrE,UAAM,SAASA,SAAQ,KAAK,SAAS,QAAQ;AAC7C,QAAI,QAAQ;AACV,uBAAiB,SAAS,EAAE,QAAQ,CAAC;AAAA,IACvC,OAAO;AACL,cAAQ,MAAM,UAAU,OAAO,EAAE;AAAA,IACnC;AACA,IAAAA,SAAQ,KAAK,CAAC;AAAA,EAChB,CAAC;AACH;;;AKzjBA,OAAO;","names":["process","minimist","minimist","fsConstants","access","readFile","path","minimist","path","pathExists","access","fsConstants","parsePositiveNumberOption","path","minimist","readFile","process"]}
|
|
1
|
+
{"version":3,"sources":["../../src/cli/app.ts","../../src/cli/token-commands.ts","../../src/cli/query-commands.ts","../../src/cli/media-commands.ts","../../src/cli/video-input.ts","../../src/cli/login.ts","../../src/cli/index.ts"],"sourcesContent":["import process from \"node:process\";\n\nimport config from \"@/lib/config.ts\";\nimport logger from \"@/lib/logger.ts\";\nimport tokenPool from \"@/lib/session-pool.ts\";\nimport {\n parseRegionCode,\n type RegionCode\n} from \"@/api/controllers/core.ts\";\nimport {\n createTokenSubcommands,\n type TokenSubcommandDef,\n type TokenSubcommandName\n} from \"@/cli/token-commands.ts\";\nimport { createQueryCommandHandlers } from \"@/cli/query-commands.ts\";\nimport { createMediaCommandHandlers } from \"@/cli/media-commands.ts\";\nimport { createLoginCommandHandler } from \"@/cli/login.ts\";\n\ntype JsonRecord = Record<string, unknown>;\ntype CliHandler = (argv: string[]) => Promise<void>;\ntype UsageSection = { title: string; lines: string[] };\n\nconst JSON_OPTION = \" --json Output structured JSON\";\nconst HELP_OPTION = \" --help Show help\";\n\nfunction buildUsageText(\n usageLine: string,\n options: string[],\n sections?: UsageSection[]\n): string {\n const lines = [\n \"Usage:\",\n usageLine,\n \"\",\n \"Options:\",\n ...options,\n ];\n if (sections && sections.length > 0) {\n for (const section of sections) {\n lines.push(\"\", section.title, ...section.lines);\n }\n }\n return lines.join(\"\\n\");\n}\n\nfunction usageRoot(): string {\n const commandLines = ROOT_COMMAND_ENTRIES.map(\n (entry) => ` ${entry.path.padEnd(32)}${entry.description}`\n );\n return [\n \"Usage:\",\n \" jimeng <command> [subcommand] [options]\",\n \"\",\n \"Commands:\",\n ...commandLines,\n \"\",\n ...ROOT_HELP_HINT_LINES,\n ].join(\"\\n\");\n}\n\nfunction usageModelsList(): string {\n return buildUsageText(\" jimeng models list [options]\", [\n \" --region <region> X-Region header, default cn (cn/us/hk/jp/sg)\",\n \" --verbose Print rich model fields\",\n \" --json Print full JSON response\",\n HELP_OPTION,\n ]);\n}\n\nfunction usageModelsRefresh(): string {\n return buildUsageText(\" jimeng models refresh [options]\", [\n \" --json Output structured JSON\",\n HELP_OPTION,\n ], [\n {\n title: \"Notes:\",\n lines: [\n \" - Refreshes dynamicCapabilities (imageModels, videoModels, capabilityTags) for\",\n \" all enabled+live tokens in the token pool.\",\n \" - Results are persisted to token-pool.json automatically.\",\n ],\n },\n ]);\n}\n\nfunction usageTokenSubcommand(name: TokenSubcommandName): string {\n const subcommand = TOKEN_SUBCOMMANDS_BY_NAME[name];\n return buildUsageText(subcommand.usageLine, subcommand.options, subcommand.sections);\n}\n\nfunction usageTokenRoot(): string {\n const subcommandLines = TOKEN_SUBCOMMANDS.map(\n (subcommand) => ` ${subcommand.name.padEnd(24)}${subcommand.description}`\n );\n return [\n \"Usage:\",\n \" jimeng token <subcommand> [options]\",\n \"\",\n \"Subcommands:\",\n ...subcommandLines,\n \"\",\n \"Run `jimeng token <subcommand> --help` for details.\",\n ].join(\"\\n\");\n}\n\nfunction usageImageGenerate(): string {\n return buildUsageText(\" jimeng image generate --prompt <text> [options]\", [\n \" --token <token> Optional, override token-pool selection\",\n \" --region <region> X-Region header, default cn (cn/us/hk/jp/sg)\",\n \" --prompt <text> Required\",\n \" --model <model> Default jimeng-4.5\",\n \" --ratio <ratio> Default 1:1\",\n \" --resolution <res> Default 2k\",\n \" --negative-prompt <text> Optional\",\n \" --sample-strength <num> Optional, 0-1\",\n \" --intelligent-ratio Optional, enable intelligent ratio\",\n \" --wait / --no-wait Default wait; --no-wait returns task only\",\n \" --wait-timeout-seconds Optional wait timeout override\",\n \" --poll-interval-ms Optional poll interval override\",\n JSON_OPTION,\n \" --output-dir <dir> Default ./pic/cli-image-generate\",\n HELP_OPTION,\n ]);\n}\n\nfunction usageImageEdit(): string {\n return buildUsageText(\n \" jimeng image edit --prompt <text> --image <path_or_url> [--image <path_or_url> ...] [options]\",\n [\n \" --token <token> Optional, override token-pool selection\",\n \" --region <region> X-Region header, default cn (cn/us/hk/jp/sg)\",\n \" --prompt <text> Required\",\n \" --image <path_or_url> Required, can be repeated (1-10)\",\n \" --model <model> Default jimeng-4.5\",\n \" --ratio <ratio> Default 1:1\",\n \" --resolution <res> Default 2k\",\n \" --negative-prompt <text> Optional\",\n \" --sample-strength <num> Optional, 0-1\",\n \" --intelligent-ratio Optional, enable intelligent ratio\",\n \" --wait / --no-wait Default wait; --no-wait returns task only\",\n \" --wait-timeout-seconds Optional wait timeout override\",\n \" --poll-interval-ms Optional poll interval override\",\n JSON_OPTION,\n \" --output-dir <dir> Default ./pic/cli-image-edit\",\n HELP_OPTION,\n ],\n [\n {\n title: \"Notes:\",\n lines: [\" - Image sources must be all local files or all URLs in one command.\"],\n },\n ]\n );\n}\n\nfunction usageImageUpscale(): string {\n return buildUsageText(\n \" jimeng image upscale --image <path_or_url> [options]\",\n [\n \" --token <token> Optional, override token-pool selection\",\n \" --region <region> X-Region header, default cn (cn/us/hk/jp/sg)\",\n \" --image <path_or_url> Required, local file or URL\",\n \" --model <model> Default jimeng-5.0\",\n \" --resolution <res> Default 4k (target resolution)\",\n \" --wait / --no-wait Default wait; --no-wait returns task only\",\n \" --wait-timeout-seconds Optional wait timeout override\",\n \" --poll-interval-ms Optional poll interval override\",\n JSON_OPTION,\n \" --output-dir <dir> Default ./pic/cli-image-upscale\",\n HELP_OPTION,\n ],\n [\n {\n title: \"Notes:\",\n lines: [\n \" - Upscales an existing image to higher resolution using super_resolution.\",\n \" - Supports 2k and 4k target resolutions.\",\n \" - Image source can be a local file path or HTTP URL.\",\n ],\n },\n ]\n );\n}\n\nfunction usageVideoGenerate(): string {\n return buildUsageText(\" jimeng video generate --prompt <text> [options]\", [\n \" --token <token> Optional, override token-pool selection\",\n \" --region <region> X-Region header, default cn (cn/us/hk/jp/sg)\",\n \" --prompt <text> Required\",\n \" --mode <mode> Optional, text_to_video (default), image_to_video, first_last_frames, or omni_reference\",\n \" --image-file <input> Image input, can be repeated (path or URL)\",\n \" --video-file <input> Video input, can be repeated (path or URL, omni only)\",\n \" --image-file-1 <input> Explicit image slot (1-9) for omni_reference\",\n \" --image-file-2 ... -9 More explicit image slots for omni_reference\",\n \" --video-file-1 <input> Explicit video slot (1-3) for omni_reference\",\n \" --video-file-2 ... -3 More explicit video slots for omni_reference\",\n \" --model <model> Default jimeng-video-3.0 (jimeng-video-seedance-2.0-fast in omni_reference)\",\n \" --ratio <ratio> Default 1:1\",\n \" --resolution <res> Default 720p\",\n \" --duration <seconds> Default 5\",\n \" --wait / --no-wait Default wait; --no-wait returns task only\",\n \" --wait-timeout-seconds Optional wait timeout override\",\n \" --poll-interval-ms Optional poll interval override\",\n JSON_OPTION,\n \" --output-dir <dir> Default ./pic/cli-video-generate\",\n HELP_OPTION,\n ], [\n {\n title: \"Examples:\",\n lines: [\n \" jimeng video generate --mode text_to_video --prompt \\\"A fox runs in snow\\\"\",\n \" jimeng video generate --mode image_to_video --prompt \\\"Camera slowly pushes in\\\" --image-file ./first.png\",\n \" jimeng video generate --mode first_last_frames --prompt \\\"Transition day to night\\\" --image-file ./first.png --image-file ./last.png\",\n \" jimeng video generate --mode omni_reference --model jimeng-video-seedance-2.0-fast --prompt \\\"Use @image_file_1 for character and @video_file_1 for motion\\\" --image-file ./character.png --video-file ./motion.mp4\",\n ],\n },\n {\n title: \"Notes:\",\n lines: [\n \" - text_to_video: no image/video input allowed.\",\n \" - image_to_video: exactly 1 --image-file input, no --video-file.\",\n \" - first_last_frames: 1-2 --image-file inputs, no --video-file.\",\n \" - omni_reference: 1-9 images and 0-3 videos (at least one material).\",\n \" - omni_reference supports model jimeng-video-seedance-2.0 or jimeng-video-seedance-2.0-fast.\",\n \" - Use @image_file_N / @video_file_N in prompt for omni_reference.\",\n ],\n },\n ]);\n}\n\nfunction usageTaskGet(): string {\n return buildUsageText(\" jimeng task get --task-id <id> [options]\", [\n \" --token <token> Optional, override token-pool selection\",\n \" --region <region> X-Region header, default cn (cn/us/hk/jp/sg)\",\n \" --task-id <id> Required history/task id\",\n \" --type <type> Optional image or video\",\n \" --response-format <fmt> Optional url or b64_json\",\n JSON_OPTION,\n HELP_OPTION,\n ]);\n}\n\nfunction usageTaskWait(): string {\n return buildUsageText(\" jimeng task wait --task-id <id> [options]\", [\n \" --token <token> Optional, override token-pool selection\",\n \" --region <region> X-Region header, default cn (cn/us/hk/jp/sg)\",\n \" --task-id <id> Required history/task id\",\n \" --type <type> Optional image or video\",\n \" --response-format <fmt> Optional url or b64_json\",\n \" --wait-timeout-seconds Optional wait timeout override\",\n \" --poll-interval-ms Optional poll interval override\",\n JSON_OPTION,\n HELP_OPTION,\n ]);\n}\n\nfunction usageTaskList(): string {\n return buildUsageText(\" jimeng task list [options]\", [\n \" --token <token> Optional, override token-pool selection\",\n \" --region <region> X-Region header, default cn (cn/us/hk/jp/sg)\",\n \" --type <type> Filter by type: image, video, or all (default all)\",\n \" --count <num> Number of items per page (default 20)\",\n JSON_OPTION,\n HELP_OPTION,\n ]);\n}\n\nfunction configureCliLogging(command: string | undefined): void {\n if (process.env.JIMENG_CLI_VERBOSE_LOGS === \"true\") {\n process.env.JIMENG_CLI_SILENT_LOGS = \"false\";\n return;\n }\n process.env.JIMENG_CLI_SILENT_LOGS = \"true\";\n config.system.log_level = \"fatal\";\n config.system.debug = false;\n config.system.requestLog = false;\n logger.info = () => undefined;\n logger.debug = () => undefined;\n logger.warn = () => undefined;\n logger.error = () => undefined;\n console.info = () => undefined;\n console.debug = () => undefined;\n console.warn = () => undefined;\n}\n\nfunction fail(message: string): never {\n throw new Error(message);\n}\n\nfunction failWithUsage(reason: string, usage: string): never {\n fail(`${reason}\\n\\n${usage}`);\n}\n\nfunction getSingleString(args: Record<string, unknown>, key: string): string | undefined {\n const raw = args[key];\n if (typeof raw === \"string\" && raw.trim().length > 0) return raw.trim();\n return undefined;\n}\n\nfunction getRegionWithDefault(args: Record<string, unknown>): string {\n return getSingleString(args, \"region\") || \"cn\";\n}\n\nfunction toStringList(raw: unknown): string[] {\n if (typeof raw === \"string\") return raw.split(\",\").map((item) => item.trim()).filter(Boolean);\n if (Array.isArray(raw)) {\n return raw\n .flatMap((item) => (typeof item === \"string\" ? item.split(\",\") : []))\n .map((item) => item.trim())\n .filter(Boolean);\n }\n return [];\n}\n\nlet tokenPoolReady = false;\nasync function ensureTokenPoolReady(): Promise<void> {\n if (tokenPoolReady) return;\n await tokenPool.init();\n tokenPoolReady = true;\n}\n\nfunction parseRegionOrFail(region: string | undefined): RegionCode | undefined {\n if (!region) return undefined;\n const parsed = parseRegionCode(region);\n if (!parsed) fail(\"Invalid --region. Use cn/us/hk/jp/sg.\");\n return parsed;\n}\n\nasync function pickDirectTokenForGeneration(\n token: string | undefined,\n region: string | undefined,\n requestedModel: string,\n taskType: \"image\" | \"video\",\n requiredCapabilityTags: string[] = []\n): Promise<{ token: string; region: RegionCode }> {\n await ensureTokenPoolReady();\n const tokenPick = tokenPool.pickTokenForRequest({\n authorization: token ? `Bearer ${token}` : undefined,\n requestedModel,\n taskType,\n requiredCapabilityTags,\n xRegion: region,\n });\n if (!tokenPick.token || !tokenPick.region) {\n fail(tokenPick.reason || \"No direct token available. Provide --token and --region, or configure token-pool.\");\n }\n return { token: tokenPick.token, region: tokenPick.region };\n}\n\nasync function pickDirectTokenForTask(\n token: string | undefined,\n region: string | undefined\n): Promise<{ token: string; region: RegionCode }> {\n await ensureTokenPoolReady();\n const parsedRegion = parseRegionOrFail(region);\n\n if (token) {\n const fromPool = tokenPool.getTokenEntry(token)?.region;\n const finalRegion = parsedRegion || fromPool;\n if (!finalRegion) {\n fail(\"Missing region for direct task mode. Provide --region or register token region in token-pool.\");\n }\n return { token, region: finalRegion };\n }\n\n const candidates = tokenPool\n .getEntries(false)\n .filter((item) => item.enabled && item.live !== false && item.region)\n .filter((item) => (parsedRegion ? item.region === parsedRegion : true));\n if (candidates.length === 0) {\n fail(\"No token available for direct task mode. Provide --token --region or configure token-pool.\");\n }\n return { token: candidates[0].token, region: candidates[0].region! };\n}\n\nfunction unwrapBody(payload: unknown): unknown {\n if (!payload || typeof payload !== \"object\") return payload;\n const body = payload as JsonRecord;\n if (\"data\" in body && (\"code\" in body || \"message\" in body)) {\n return body.data;\n }\n return payload;\n}\n\nfunction printJson(value: unknown): void {\n console.log(JSON.stringify(value, null, 2));\n}\n\nfunction printCommandJson(\n command: string,\n data: unknown,\n meta?: JsonRecord\n): void {\n const payload: JsonRecord = {\n object: \"jimeng_cli_result\",\n command,\n data,\n };\n if (meta && Object.keys(meta).length > 0) {\n payload.meta = meta;\n }\n printJson(payload);\n}\n\nfunction printDownloadSummary(kind: \"image\" | \"video\", files: string[]): void {\n const label = kind === \"image\" ? \"images\" : \"video\";\n console.log(`Downloaded ${files.length} ${label}.`);\n for (const file of files) {\n console.log(`- ${file}`);\n }\n}\n\nfunction isHelpKeyword(value: string | undefined): boolean {\n return value === \"--help\" || value === \"-h\" || value === \"help\";\n}\n\nconst TOKEN_SUBCOMMANDS: TokenSubcommandDef[] = createTokenSubcommands({\n getUsage: (name) => usageTokenSubcommand(name),\n getSingleString,\n getRegionWithDefault,\n toStringList,\n parseRegionOrFail,\n ensureTokenPoolReady,\n fail,\n failWithUsage,\n printJson,\n printCommandJson,\n unwrapBody,\n jsonOption: JSON_OPTION,\n helpOption: HELP_OPTION,\n});\n\nconst queryHandlers = createQueryCommandHandlers({\n usageModelsList,\n usageModelsRefresh,\n usageTaskGet,\n usageTaskWait,\n usageTaskList,\n getSingleString,\n getRegionWithDefault,\n parseRegionOrFail,\n ensureTokenPoolReady,\n pickDirectTokenForTask,\n fail,\n printJson,\n printCommandJson,\n unwrapBody,\n});\n\nconst mediaHandlers = createMediaCommandHandlers({\n usageImageGenerate,\n usageImageEdit,\n usageImageUpscale,\n usageVideoGenerate,\n getSingleString,\n getRegionWithDefault,\n toStringList,\n fail,\n failWithUsage,\n pickDirectTokenForGeneration,\n printCommandJson,\n printDownloadSummary,\n printTaskInfo: (task) => queryHandlers.printTaskInfo(task),\n});\n\nconst TOKEN_SUBCOMMANDS_BY_NAME: Record<TokenSubcommandName, TokenSubcommandDef> = Object.fromEntries(\n TOKEN_SUBCOMMANDS.map((subcommand) => [subcommand.name, subcommand])\n) as Record<TokenSubcommandName, TokenSubcommandDef>;\n\nfunction buildHandlersMap(\n subcommands: Array<{ name: string; handler: CliHandler }>\n): Record<string, CliHandler> {\n return Object.fromEntries(subcommands.map((item) => [item.name, item.handler]));\n}\n\ntype CommandSubcommandDef = {\n name: string;\n description: string;\n handler: CliHandler;\n};\n\ntype CommandSpec = {\n name: string;\n description: string;\n handler?: CliHandler;\n subcommands?: CommandSubcommandDef[];\n usage?: () => string;\n showAsGrouped?: boolean;\n};\n\nconst COMMAND_SPECS: CommandSpec[] = [\n {\n name: \"login\",\n description: \"Login and add session to token pool\",\n handler: createLoginCommandHandler({\n getSingleString,\n getRegionWithDefault,\n parseRegionOrFail,\n ensureTokenPoolReady,\n fail,\n printJson,\n printCommandJson,\n }),\n },\n {\n name: \"models\",\n description: \"Model commands\",\n subcommands: [\n { name: \"list\", description: \"List available models\", handler: queryHandlers.handleModelsList },\n { name: \"refresh\", description: \"Refresh token dynamic capabilities (model list)\", handler: queryHandlers.handleModelsRefresh },\n ],\n usage: usageRoot,\n },\n {\n name: \"image\",\n description: \"Image commands\",\n subcommands: [\n { name: \"generate\", description: \"Generate image from text\", handler: mediaHandlers.handleImageGenerate },\n { name: \"edit\", description: \"Edit image(s) with prompt\", handler: mediaHandlers.handleImageEdit },\n { name: \"upscale\", description: \"Upscale image to higher resolution\", handler: mediaHandlers.handleImageUpscale },\n ],\n usage: usageRoot,\n },\n {\n name: \"video\",\n description: \"Video commands\",\n subcommands: [\n {\n name: \"generate\",\n description: \"Generate video from multimodal references\",\n handler: mediaHandlers.handleVideoGenerate,\n },\n ],\n usage: usageRoot,\n },\n {\n name: \"task\",\n description: \"Task commands\",\n subcommands: [\n { name: \"get\", description: \"Get task status\", handler: queryHandlers.handleTaskGet },\n { name: \"wait\", description: \"Wait until task completion\", handler: queryHandlers.handleTaskWait },\n { name: \"list\", description: \"List task history\", handler: queryHandlers.handleTaskList },\n ],\n usage: usageRoot,\n },\n {\n name: \"token\",\n description: \"Token management commands\",\n subcommands: TOKEN_SUBCOMMANDS.map((subcommand) => ({\n name: subcommand.name,\n description: subcommand.description,\n handler: subcommand.handler,\n })),\n usage: usageTokenRoot,\n showAsGrouped: true,\n },\n];\n\nconst COMMAND_SPECS_BY_NAME: Record<string, CommandSpec> = Object.fromEntries(\n COMMAND_SPECS.map((spec) => [spec.name, spec])\n);\n\nconst ROOT_COMMAND_ENTRIES: Array<{ path: string; description: string }> = COMMAND_SPECS.flatMap((spec) => {\n if (spec.handler) {\n return [{ path: spec.name, description: spec.description }];\n }\n if (!spec.subcommands || spec.subcommands.length === 0) {\n return [{ path: spec.name, description: spec.description }];\n }\n if (spec.showAsGrouped) {\n return [{ path: `${spec.name} <subcommand>`, description: spec.description }];\n }\n return spec.subcommands.map((subcommand) => ({\n path: `${spec.name} ${subcommand.name}`,\n description: subcommand.description,\n }));\n});\n\nconst ROOT_HELP_HINT_LINES: string[] = [\n \"Run `jimeng <command> --help` for command details.\",\n ...COMMAND_SPECS\n .filter((spec) => spec.showAsGrouped)\n .map((spec) => `Run \\`jimeng ${spec.name} --help\\` for ${spec.name} subcommands.`),\n];\n\nasync function dispatchSubcommand(\n subcommand: string | undefined,\n argv: string[],\n handlers: Record<string, CliHandler>,\n usage: string,\n unknownLabel: string\n): Promise<boolean> {\n if (!subcommand || isHelpKeyword(subcommand)) {\n console.log(usage);\n return true;\n }\n const handler = handlers[subcommand];\n if (!handler) {\n failWithUsage(`Unknown ${unknownLabel}: ${subcommand}`, usage);\n }\n await handler(argv);\n return true;\n}\n\nasync function run(): Promise<void> {\n const [command, subcommand, ...rest] = process.argv.slice(2);\n configureCliLogging(command);\n\n if (!command || isHelpKeyword(command)) {\n console.log(usageRoot());\n return;\n }\n const spec = COMMAND_SPECS_BY_NAME[command];\n if (!spec) {\n failWithUsage(`Unknown command: ${[command, subcommand].filter(Boolean).join(\" \")}`, usageRoot());\n }\n\n if (spec.handler) {\n await spec.handler(subcommand ? [subcommand, ...rest] : rest);\n return;\n }\n\n if (spec.subcommands) {\n const handlers = buildHandlersMap(spec.subcommands);\n if (\n await dispatchSubcommand(\n subcommand,\n process.argv.slice(3),\n handlers,\n spec.usage ? spec.usage() : usageRoot(),\n `${command} subcommand`\n )\n ) {\n return;\n }\n }\n\n failWithUsage(`Unknown command: ${[command, subcommand].filter(Boolean).join(\" \")}`, usageRoot());\n}\n\nexport function runCli(): void {\n run().catch((error) => {\n const message = error instanceof Error ? error.message : String(error);\n const isJson = process.argv.includes(\"--json\");\n if (isJson) {\n printCommandJson(\"error\", { message });\n } else {\n console.error(`Error: ${message}`);\n }\n process.exit(1);\n });\n}\n","import { constants as fsConstants } from \"node:fs\";\nimport path from \"node:path\";\nimport { access, readFile } from \"node:fs/promises\";\n\nimport minimist from \"minimist\";\n\nimport {\n buildRegionInfo,\n getCredit,\n getTokenLiveStatus,\n receiveCredit,\n type RegionCode\n} from \"@/api/controllers/core.ts\";\nimport tokenPool from \"@/lib/session-pool.ts\";\n\ntype JsonRecord = Record<string, unknown>;\ntype CliHandler = (argv: string[]) => Promise<void>;\ntype UsageSection = { title: string; lines: string[] };\n\nexport type TokenSubcommandName =\n | \"list\"\n | \"check\"\n | \"points\"\n | \"receive\"\n | \"add\"\n | \"remove\"\n | \"enable\"\n | \"disable\"\n | \"pool\"\n | \"pool-check\"\n | \"pool-reload\";\n\nexport type TokenSubcommandDef = {\n name: TokenSubcommandName;\n description: string;\n usageLine: string;\n options: string[];\n sections?: UsageSection[];\n handler: CliHandler;\n};\n\ntype TokenCommandDeps = {\n getUsage: (name: TokenSubcommandName) => string;\n getSingleString: (args: Record<string, unknown>, key: string) => string | undefined;\n getRegionWithDefault: (args: Record<string, unknown>) => string;\n toStringList: (raw: unknown) => string[];\n parseRegionOrFail: (region: string | undefined) => RegionCode | undefined;\n ensureTokenPoolReady: () => Promise<void>;\n fail: (message: string) => never;\n failWithUsage: (reason: string, usage: string) => never;\n printJson: (value: unknown) => void;\n printCommandJson: (command: string, data: unknown, meta?: JsonRecord) => void;\n unwrapBody: (payload: unknown) => unknown;\n jsonOption: string;\n helpOption: string;\n};\n\nfunction maskToken(token: string): string {\n const n = token.length;\n if (n <= 10) return \"***\";\n return `${token.slice(0, 4)}...${token.slice(-4)}`;\n}\n\nfunction formatUnixMs(value: unknown): string {\n if (typeof value !== \"number\" || !Number.isFinite(value) || value <= 0) return \"-\";\n return new Date(value).toISOString();\n}\n\nfunction printTokenEntriesTable(items: unknown[]): void {\n if (items.length === 0) {\n console.log(\"(empty)\");\n return;\n }\n console.log(\"token\\tregion\\tenabled\\tlive\\tlastCredit\\tlastCheckedAt\\tfailures\");\n for (const item of items) {\n if (!item || typeof item !== \"object\") continue;\n const entry = item as JsonRecord;\n const token = typeof entry.token === \"string\" ? entry.token : \"-\";\n const region = typeof entry.region === \"string\" ? entry.region : \"-\";\n const enabled = typeof entry.enabled === \"boolean\" ? String(entry.enabled) : \"-\";\n const live = typeof entry.live === \"boolean\" ? String(entry.live) : \"-\";\n const lastCredit = typeof entry.lastCredit === \"number\" ? String(entry.lastCredit) : \"-\";\n const lastCheckedAt = formatUnixMs(entry.lastCheckedAt);\n const failures =\n typeof entry.consecutiveFailures === \"number\" ? String(entry.consecutiveFailures) : \"-\";\n console.log(`${token}\\t${region}\\t${enabled}\\t${live}\\t${lastCredit}\\t${lastCheckedAt}\\t${failures}`);\n }\n}\n\nfunction buildTokenPoolSnapshot(): { summary: unknown; items: unknown[] } {\n return {\n summary: tokenPool.getSummary(),\n items: tokenPool.getEntries(true),\n };\n}\n\nasync function pathExists(filePath: string): Promise<boolean> {\n try {\n await access(filePath, fsConstants.F_OK);\n return true;\n } catch {\n return false;\n }\n}\n\nasync function readTokensFromFile(filePathArg: string, deps: Pick<TokenCommandDeps, \"fail\">): Promise<string[]> {\n const filePath = path.resolve(filePathArg);\n if (!(await pathExists(filePath))) {\n deps.fail(`Token file not found: ${filePath}`);\n }\n return (await readFile(filePath, \"utf8\"))\n .split(/\\r?\\n/)\n .map((line) => line.trim())\n .filter((line) => line.length > 0 && !line.startsWith(\"#\"));\n}\n\nasync function collectTokensFromArgs(\n args: Record<string, unknown>,\n usage: string,\n deps: Pick<TokenCommandDeps, \"toStringList\" | \"getSingleString\" | \"fail\">,\n required = false\n): Promise<string[]> {\n const tokens = [...deps.toStringList(args.token)];\n const tokenFile = deps.getSingleString(args, \"token-file\");\n if (tokenFile) {\n tokens.push(...(await readTokensFromFile(tokenFile, deps)));\n }\n const deduped = Array.from(new Set(tokens));\n if (required && deduped.length === 0) {\n deps.fail(`No tokens provided.\\n\\n${usage}`);\n }\n return deduped;\n}\n\nexport function createTokenSubcommands(deps: TokenCommandDeps): TokenSubcommandDef[] {\n const handleTokenCheck: CliHandler = async (argv) => {\n const args = minimist(argv, {\n string: [\"token\", \"token-file\", \"region\"],\n boolean: [\"help\", \"json\"],\n });\n const usage = deps.getUsage(\"check\");\n if (args.help) {\n console.log(usage);\n return;\n }\n const region = deps.getRegionWithDefault(args);\n const regionCode = deps.parseRegionOrFail(region);\n if (!regionCode) {\n deps.fail(\"Missing region. Use --region cn/us/hk/jp/sg.\");\n }\n const tokens = await collectTokensFromArgs(args, usage, deps, true);\n if (!args.json) {\n console.log(`Checking ${tokens.length} token(s)`);\n }\n\n await deps.ensureTokenPoolReady();\n let invalid = 0;\n let requestErrors = 0;\n const results: Array<{ token_masked: string; live?: boolean; error?: string }> = [];\n for (const token of tokens) {\n const masked = maskToken(token);\n try {\n const live = await getTokenLiveStatus(token, buildRegionInfo(regionCode));\n await tokenPool.syncTokenCheckResult(token, live);\n if (live === true) {\n if (!args.json) console.log(`[OK] ${masked} live=true`);\n } else {\n invalid += 1;\n if (!args.json) console.log(`[FAIL] ${masked} live=false`);\n }\n results.push({ token_masked: masked, live: live === true });\n } catch (error) {\n requestErrors += 1;\n const message = error instanceof Error ? error.message : String(error);\n if (!args.json) console.log(`[ERROR] ${masked} ${message}`);\n results.push({ token_masked: masked, error: message });\n }\n }\n if (args.json) {\n deps.printCommandJson(\"token.check\", results, {\n total: tokens.length,\n invalid,\n request_errors: requestErrors,\n });\n } else {\n console.log(`Summary: total=${tokens.length} invalid=${invalid} request_errors=${requestErrors}`);\n }\n if (requestErrors > 0) process.exit(3);\n if (invalid > 0) process.exit(2);\n };\n\n const handleTokenList: CliHandler = async (argv) => {\n const args = minimist(argv, {\n boolean: [\"help\", \"json\"],\n });\n const usage = deps.getUsage(\"list\");\n if (args.help) {\n console.log(usage);\n return;\n }\n await deps.ensureTokenPoolReady();\n const normalized = buildTokenPoolSnapshot();\n if (args.json) {\n deps.printCommandJson(\"token.list\", normalized);\n return;\n }\n const body = normalized && typeof normalized === \"object\" ? (normalized as JsonRecord) : {};\n const summary = body.summary;\n if (summary && typeof summary === \"object\") {\n console.log(\"Summary:\");\n deps.printJson(summary);\n }\n const items = Array.isArray(body.items) ? body.items : [];\n console.log(\"Entries:\");\n printTokenEntriesTable(items);\n };\n\n const handleTokenPointsOrReceive = async (\n argv: string[],\n action: \"points\" | \"receive\"\n ): Promise<void> => {\n const args = minimist(argv, {\n string: [\"token\", \"token-file\", \"region\"],\n boolean: [\"help\", \"json\"],\n });\n const usage = deps.getUsage(action);\n if (args.help) {\n console.log(usage);\n return;\n }\n const region = deps.getRegionWithDefault(args);\n const regionCode = deps.parseRegionOrFail(region);\n await deps.ensureTokenPoolReady();\n const tokens = await collectTokensFromArgs(args, usage, deps, false);\n const resolvedTokens = tokens.length > 0\n ? tokens.map((token) => {\n const entryRegion = tokenPool.getTokenEntry(token)?.region;\n const finalRegion = regionCode || entryRegion;\n if (!finalRegion) {\n deps.fail(`Missing region for token ${maskToken(token)}. Provide --region or register token region in token-pool.`);\n }\n return { token, region: finalRegion };\n })\n : tokenPool.getEntries(false)\n .filter((item) => item.enabled && item.live !== false && item.region)\n .filter((item) => (regionCode ? item.region === regionCode : true))\n .map((item) => ({ token: item.token, region: item.region! }));\n if (resolvedTokens.length === 0) {\n deps.fail(\"No token available. Provide --token or configure token-pool.\");\n }\n const payload = action === \"points\"\n ? await Promise.all(\n resolvedTokens.map(async (item) => ({\n token: item.token,\n points: await getCredit(item.token, buildRegionInfo(item.region)),\n }))\n )\n : await Promise.all(\n resolvedTokens.map(async (item) => {\n const currentCredit = await getCredit(item.token, buildRegionInfo(item.region));\n if (currentCredit.totalCredit <= 0) {\n try {\n await receiveCredit(item.token, buildRegionInfo(item.region));\n const updatedCredit = await getCredit(item.token, buildRegionInfo(item.region));\n return { token: item.token, credits: updatedCredit, received: true };\n } catch (error: any) {\n return {\n token: item.token,\n credits: currentCredit,\n received: false,\n error: error?.message || String(error),\n };\n }\n }\n return { token: item.token, credits: currentCredit, received: false };\n })\n );\n if (args.json) {\n deps.printCommandJson(`token.${action}`, payload);\n return;\n }\n deps.printJson(payload);\n };\n\n const handleTokenAddOrRemove = async (argv: string[], action: \"add\" | \"remove\"): Promise<void> => {\n const args = minimist(argv, {\n string: [\"token\", \"token-file\", \"region\"],\n boolean: [\"help\", \"json\"],\n });\n const usage = deps.getUsage(action);\n if (args.help) {\n console.log(usage);\n return;\n }\n const region = deps.getRegionWithDefault(args);\n await deps.ensureTokenPoolReady();\n const tokens = await collectTokensFromArgs(args, usage, deps, true);\n const regionCode = deps.parseRegionOrFail(region);\n const payload = action === \"add\"\n ? {\n ...(await tokenPool.addTokens(tokens, { defaultRegion: regionCode || undefined })),\n summary: tokenPool.getSummary(),\n }\n : {\n ...(await tokenPool.removeTokens(tokens)),\n summary: tokenPool.getSummary(),\n };\n if (args.json) {\n deps.printCommandJson(`token.${action}`, deps.unwrapBody(payload), { region });\n return;\n }\n deps.printJson(deps.unwrapBody(payload));\n };\n\n const handleTokenEnableOrDisable = async (argv: string[], action: \"enable\" | \"disable\"): Promise<void> => {\n const args = minimist(argv, {\n string: [\"token\"],\n boolean: [\"help\", \"json\"],\n });\n const usage = deps.getUsage(action);\n if (args.help) {\n console.log(usage);\n return;\n }\n const token = deps.getSingleString(args, \"token\");\n if (!token) {\n deps.failWithUsage(\"Missing required --token.\", usage);\n }\n await deps.ensureTokenPoolReady();\n const payload = {\n updated: await tokenPool.setTokenEnabled(token, action === \"enable\"),\n summary: tokenPool.getSummary(),\n };\n if (args.json) {\n deps.printCommandJson(`token.${action}`, deps.unwrapBody(payload));\n return;\n }\n deps.printJson(deps.unwrapBody(payload));\n };\n\n const handleTokenPool: CliHandler = async (argv) => {\n const args = minimist(argv, {\n boolean: [\"help\", \"json\"],\n });\n const usage = deps.getUsage(\"pool\");\n if (args.help) {\n console.log(usage);\n return;\n }\n await deps.ensureTokenPoolReady();\n const normalized = buildTokenPoolSnapshot();\n if (args.json) {\n deps.printCommandJson(\"token.pool\", normalized);\n return;\n }\n const body = normalized && typeof normalized === \"object\" ? (normalized as JsonRecord) : {};\n console.log(\"Summary:\");\n deps.printJson(body.summary ?? {});\n console.log(\"Entries:\");\n printTokenEntriesTable(Array.isArray(body.items) ? body.items : []);\n };\n\n const handleTokenPoolCheckOrReload = async (\n argv: string[],\n action: \"pool-check\" | \"pool-reload\"\n ): Promise<void> => {\n const args = minimist(argv, {\n boolean: [\"help\", \"json\"],\n });\n const usage = deps.getUsage(action);\n if (args.help) {\n console.log(usage);\n return;\n }\n await deps.ensureTokenPoolReady();\n const payload = action === \"pool-check\"\n ? {\n ...(await tokenPool.runHealthCheck()),\n summary: tokenPool.getSummary(),\n }\n : (await tokenPool.reloadFromDisk(), {\n reloaded: true,\n summary: tokenPool.getSummary(),\n items: buildTokenPoolSnapshot().items,\n });\n if (args.json) {\n deps.printCommandJson(`token.${action}`, deps.unwrapBody(payload));\n return;\n }\n deps.printJson(deps.unwrapBody(payload));\n };\n\n return [\n {\n name: \"list\",\n description: \"List token pool entries\",\n usageLine: \" jimeng token list [options]\",\n options: [deps.jsonOption, deps.helpOption],\n handler: handleTokenList,\n },\n {\n name: \"check\",\n description: \"Validate tokens directly\",\n usageLine: \" jimeng token check --token <token> [--token <token> ...] [options]\",\n options: [\n \" --token <token> Token, can be repeated\",\n \" --token-file <path> Read tokens from file (one per line, # for comments)\",\n \" --region <region> X-Region, default cn (cn/us/hk/jp/sg)\",\n deps.jsonOption,\n deps.helpOption,\n ],\n handler: handleTokenCheck,\n },\n {\n name: \"points\",\n description: \"Query token points directly\",\n usageLine: \" jimeng token points [options]\",\n options: [\n \" --token <token> Token, can be repeated\",\n \" --token-file <path> Read tokens from file (one per line, # for comments)\",\n \" --region <region> Filter tokens by X-Region, default cn (cn/us/hk/jp/sg)\",\n deps.jsonOption,\n deps.helpOption,\n ],\n handler: async (argv) => handleTokenPointsOrReceive(argv, \"points\"),\n },\n {\n name: \"receive\",\n description: \"Receive token credits directly\",\n usageLine: \" jimeng token receive [options]\",\n options: [\n \" --token <token> Token, can be repeated\",\n \" --token-file <path> Read tokens from file (one per line, # for comments)\",\n \" --region <region> Filter tokens by X-Region, default cn (cn/us/hk/jp/sg)\",\n deps.jsonOption,\n deps.helpOption,\n ],\n handler: async (argv) => handleTokenPointsOrReceive(argv, \"receive\"),\n },\n {\n name: \"add\",\n description: \"Add token(s) into token-pool\",\n usageLine: \" jimeng token add --token <token> [--token <token> ...] [options]\",\n options: [\n \" --token <token> Token, can be repeated\",\n \" --token-file <path> Read tokens from file (one per line, # for comments)\",\n \" --region <region> Region for add, default cn (cn/us/hk/jp/sg)\",\n deps.jsonOption,\n deps.helpOption,\n ],\n handler: async (argv) => handleTokenAddOrRemove(argv, \"add\"),\n },\n {\n name: \"remove\",\n description: \"Remove token(s) from token-pool\",\n usageLine: \" jimeng token remove --token <token> [--token <token> ...] [options]\",\n options: [\n \" --token <token> Token, can be repeated\",\n \" --token-file <path> Read tokens from file (one per line, # for comments)\",\n deps.jsonOption,\n deps.helpOption,\n ],\n handler: async (argv) => handleTokenAddOrRemove(argv, \"remove\"),\n },\n {\n name: \"enable\",\n description: \"Enable one token in token-pool\",\n usageLine: \" jimeng token enable --token <token> [options]\",\n options: [\" --token <token> Required, a single token\", deps.jsonOption, deps.helpOption],\n handler: async (argv) => handleTokenEnableOrDisable(argv, \"enable\"),\n },\n {\n name: \"disable\",\n description: \"Disable one token in token-pool\",\n usageLine: \" jimeng token disable --token <token> [options]\",\n options: [\" --token <token> Required, a single token\", deps.jsonOption, deps.helpOption],\n handler: async (argv) => handleTokenEnableOrDisable(argv, \"disable\"),\n },\n {\n name: \"pool\",\n description: \"Show token-pool summary and entries\",\n usageLine: \" jimeng token pool [options]\",\n options: [deps.jsonOption, deps.helpOption],\n handler: handleTokenPool,\n },\n {\n name: \"pool-check\",\n description: \"Trigger token-pool health check\",\n usageLine: \" jimeng token pool-check [options]\",\n options: [deps.jsonOption, deps.helpOption],\n handler: async (argv) => handleTokenPoolCheckOrReload(argv, \"pool-check\"),\n },\n {\n name: \"pool-reload\",\n description: \"Reload token-pool from disk\",\n usageLine: \" jimeng token pool-reload [options]\",\n options: [deps.jsonOption, deps.helpOption],\n handler: async (argv) => handleTokenPoolCheckOrReload(argv, \"pool-reload\"),\n },\n ];\n}\n","import minimist from \"minimist\";\n\nimport { buildRegionInfo, type RegionCode } from \"@/api/controllers/core.ts\";\nimport { getLiveModels, refreshAllTokenModels } from \"@/api/controllers/models.ts\";\nimport { getTaskResponse, waitForTaskResponse, getAssetList, AssetListOptions } from \"@/api/controllers/tasks.ts\";\n\ntype JsonRecord = Record<string, unknown>;\n\ntype TaskInfo = {\n task_id: string;\n type?: string;\n status?: number;\n fail_code?: string | null;\n created?: number;\n data?: unknown;\n};\n\ntype QueryDeps = {\n usageModelsList: () => string;\n usageModelsRefresh: () => string;\n usageTaskGet: () => string;\n usageTaskWait: () => string;\n usageTaskList: () => string;\n getSingleString: (args: Record<string, unknown>, key: string) => string | undefined;\n getRegionWithDefault: (args: Record<string, unknown>) => string;\n parseRegionOrFail: (region: string | undefined) => RegionCode | undefined;\n ensureTokenPoolReady: () => Promise<void>;\n pickDirectTokenForTask: (\n token: string | undefined,\n region: string | undefined\n ) => Promise<{ token: string; region: RegionCode }>;\n fail: (message: string) => never;\n printJson: (value: unknown) => void;\n printCommandJson: (command: string, data: unknown, meta?: JsonRecord) => void;\n unwrapBody: (payload: unknown) => unknown;\n};\n\nfunction parseTaskTypeOrFail(value: string | undefined, deps: Pick<QueryDeps, \"fail\">): \"image\" | \"video\" | undefined {\n if (!value) return undefined;\n if (value === \"image\" || value === \"video\") return value;\n deps.fail(`Invalid --type: ${value}. Use image or video.`);\n}\n\nfunction parseResponseFormatOrFail(\n value: string | undefined,\n deps: Pick<QueryDeps, \"fail\">\n): \"url\" | \"b64_json\" {\n if (!value) return \"url\";\n if (value === \"url\" || value === \"b64_json\") return value;\n deps.fail(`Invalid --response-format: ${value}. Use url or b64_json.`);\n}\n\nfunction parsePositiveNumberOption(\n args: Record<string, unknown>,\n key: \"wait-timeout-seconds\" | \"poll-interval-ms\",\n deps: Pick<QueryDeps, \"getSingleString\" | \"fail\">\n): number | undefined {\n const raw = deps.getSingleString(args, key);\n if (!raw) return undefined;\n const parsed = Number(raw);\n if (!Number.isFinite(parsed) || parsed <= 0) {\n deps.fail(`Invalid --${key}: ${raw}`);\n }\n return parsed;\n}\n\nconst TASK_STATUS_TEXT: Record<number, string> = {\n 10: \"PENDING\",\n 20: \"PROCESSING\",\n 40: \"FAILED\",\n 50: \"COMPLETED\",\n};\n\nfunction taskStatusText(status: number): string {\n return TASK_STATUS_TEXT[status] || \"UNKNOWN\";\n}\n\nfunction formatUnixSeconds(value: unknown): string {\n if (typeof value !== \"number\" || !Number.isFinite(value) || value <= 0) return \"-\";\n return `${value} (${new Date(value * 1000).toISOString()})`;\n}\n\nfunction collectTaskInfo(payload: unknown, deps: Pick<QueryDeps, \"unwrapBody\">): TaskInfo | null {\n const normalized = deps.unwrapBody(payload);\n if (!normalized || typeof normalized !== \"object\") return null;\n const obj = normalized as JsonRecord;\n if (typeof obj.task_id !== \"string\" || obj.task_id.length === 0) return null;\n return {\n task_id: obj.task_id,\n type: typeof obj.type === \"string\" ? obj.type : undefined,\n status: typeof obj.status === \"number\" ? obj.status : undefined,\n fail_code: typeof obj.fail_code === \"string\" || obj.fail_code === null ? (obj.fail_code as string | null) : undefined,\n created: typeof obj.created === \"number\" ? obj.created : undefined,\n data: obj.data,\n };\n}\n\nfunction printTaskInfo(task: TaskInfo, deps: Pick<QueryDeps, \"printJson\">): void {\n console.log(`Task ID: ${task.task_id}`);\n if (task.type) console.log(`Type: ${task.type}`);\n if (typeof task.status === \"number\") {\n console.log(`Status: ${task.status} (${taskStatusText(task.status)})`);\n }\n if (task.fail_code) console.log(`Fail Code: ${task.fail_code}`);\n if (typeof task.created === \"number\") {\n console.log(`Created: ${formatUnixSeconds(task.created)}`);\n }\n if (task.data != null) {\n console.log(\"Data:\");\n deps.printJson(task.data);\n }\n}\n\nexport function createQueryCommandHandlers(deps: QueryDeps): {\n handleModelsList: (argv: string[]) => Promise<void>;\n handleModelsRefresh: (argv: string[]) => Promise<void>;\n handleTaskGet: (argv: string[]) => Promise<void>;\n handleTaskWait: (argv: string[]) => Promise<void>;\n handleTaskList: (argv: string[]) => Promise<void>;\n printTaskInfo: (task: unknown) => void;\n} {\n const handleModelsRefresh = async (argv: string[]): Promise<void> => {\n const args = minimist(argv, {\n boolean: [\"help\", \"json\"],\n });\n\n if (args.help) {\n console.log(deps.usageModelsRefresh());\n return;\n }\n\n await deps.ensureTokenPoolReady();\n const results = await refreshAllTokenModels();\n const isJson = Boolean(args.json);\n\n if (isJson) {\n deps.printCommandJson(\"models.refresh\", results);\n return;\n }\n\n if (results.length === 0) {\n console.log(\"No enabled+live tokens found in pool. Nothing to refresh.\");\n return;\n }\n\n console.log(`Refreshed ${results.length} token(s).`);\n console.log(\"\");\n console.log(\"token\\t\\tregion\\timageModels\\tvideoModels\\tcapabilityTags\\terror\");\n for (const r of results) {\n const tags = r.capabilityTags.length > 0 ? r.capabilityTags.join(\",\") : \"-\";\n const err = r.error ? r.error.slice(0, 60) : \"-\";\n console.log(`${r.token}\\t${r.region}\\t${r.imageModels}\\t\\t${r.videoModels}\\t\\t${tags}\\t${err}`);\n }\n };\n\n const handleModelsList = async (argv: string[]): Promise<void> => {\n const args = minimist(argv, {\n string: [\"region\", \"token\"],\n boolean: [\"help\", \"json\", \"verbose\"],\n });\n\n if (args.help) {\n console.log(deps.usageModelsList());\n return;\n }\n\n const region = deps.getRegionWithDefault(args);\n const parsedRegion = deps.parseRegionOrFail(region);\n const token = deps.getSingleString(args, \"token\");\n await deps.ensureTokenPoolReady();\n const auth = token ? `Bearer ${token}` : undefined;\n const direct = await getLiveModels(auth, parsedRegion || region);\n const normalized: unknown = { object: \"list\", data: direct.data };\n\n if (args.json) {\n deps.printCommandJson(\"models.list\", normalized, { region: region || null });\n return;\n }\n\n const data =\n normalized && typeof normalized === \"object\" && Array.isArray((normalized as JsonRecord).data)\n ? ((normalized as JsonRecord).data as unknown[])\n : [];\n\n if (data.length === 0) {\n deps.fail(`No models found in response: ${JSON.stringify(normalized)}`);\n }\n\n if (args.verbose) {\n console.log(\"id\\ttype\\tdesc\\tcapabilities\");\n for (const item of data) {\n if (!item || typeof item !== \"object\") continue;\n const model = item as JsonRecord;\n const id = typeof model.id === \"string\" ? model.id : \"\";\n if (!id) continue;\n const modelType = typeof model.model_type === \"string\" ? model.model_type : \"-\";\n const description = typeof model.description === \"string\" ? model.description : \"-\";\n const capabilities = Array.isArray(model.capabilities)\n ? model.capabilities.filter((cap): cap is string => typeof cap === \"string\").join(\",\")\n : \"-\";\n console.log(`${id}\\ttype=${modelType}\\tdesc=${description}\\tcapabilities=${capabilities}`);\n }\n return;\n }\n\n for (const item of data) {\n if (!item || typeof item !== \"object\") continue;\n const id = (item as JsonRecord).id;\n if (typeof id === \"string\" && id.length > 0) {\n console.log(id);\n }\n }\n };\n\n const handleTaskGet = async (argv: string[]): Promise<void> => {\n const args = minimist(argv, {\n string: [\"token\", \"region\", \"task-id\", \"type\", \"response-format\"],\n boolean: [\"help\", \"json\"],\n });\n if (args.help) {\n console.log(deps.usageTaskGet());\n return;\n }\n const taskId = deps.getSingleString(args, \"task-id\");\n if (!taskId) deps.fail(`Missing required --task-id.\\n\\n${deps.usageTaskGet()}`);\n const type = parseTaskTypeOrFail(deps.getSingleString(args, \"type\"), deps);\n const responseFormat = parseResponseFormatOrFail(deps.getSingleString(args, \"response-format\"), deps);\n const token = deps.getSingleString(args, \"token\");\n const region = deps.getRegionWithDefault(args);\n const isJson = Boolean(args.json);\n const pick = await deps.pickDirectTokenForTask(token, region);\n const normalized: unknown = await getTaskResponse(\n taskId,\n pick.token,\n buildRegionInfo(pick.region),\n {\n type,\n responseFormat,\n }\n );\n const taskInfo = collectTaskInfo(normalized, deps);\n if (!taskInfo) {\n if (isJson) {\n deps.printCommandJson(\"task.get\", deps.unwrapBody(normalized));\n } else {\n deps.printJson(deps.unwrapBody(normalized));\n }\n return;\n }\n if (isJson) deps.printCommandJson(\"task.get\", taskInfo);\n else printTaskInfo(taskInfo, deps);\n };\n\n const handleTaskWait = async (argv: string[]): Promise<void> => {\n const args = minimist(argv, {\n string: [\n \"token\",\n \"region\",\n \"task-id\",\n \"type\",\n \"response-format\",\n \"wait-timeout-seconds\",\n \"poll-interval-ms\",\n ],\n boolean: [\"help\", \"json\"],\n });\n if (args.help) {\n console.log(deps.usageTaskWait());\n return;\n }\n const taskId = deps.getSingleString(args, \"task-id\");\n if (!taskId) deps.fail(`Missing required --task-id.\\n\\n${deps.usageTaskWait()}`);\n const token = deps.getSingleString(args, \"token\");\n const region = deps.getRegionWithDefault(args);\n const isJson = Boolean(args.json);\n const body: JsonRecord = {};\n const type = parseTaskTypeOrFail(deps.getSingleString(args, \"type\"), deps);\n const responseFormat = parseResponseFormatOrFail(deps.getSingleString(args, \"response-format\"), deps);\n if (type) body.type = type;\n body.response_format = responseFormat;\n const waitTimeoutSeconds = parsePositiveNumberOption(args, \"wait-timeout-seconds\", deps);\n if (waitTimeoutSeconds !== undefined) body.wait_timeout_seconds = waitTimeoutSeconds;\n const pollIntervalMs = parsePositiveNumberOption(args, \"poll-interval-ms\", deps);\n if (pollIntervalMs !== undefined) body.poll_interval_ms = pollIntervalMs;\n\n const pick = await deps.pickDirectTokenForTask(token, region);\n const normalized: unknown = await waitForTaskResponse(\n taskId,\n pick.token,\n buildRegionInfo(pick.region),\n {\n type,\n responseFormat,\n waitTimeoutSeconds: typeof body.wait_timeout_seconds === \"number\" ? body.wait_timeout_seconds : undefined,\n pollIntervalMs: typeof body.poll_interval_ms === \"number\" ? body.poll_interval_ms : undefined,\n }\n );\n\n const taskInfo = collectTaskInfo(normalized, deps);\n if (!taskInfo) {\n if (isJson) {\n deps.printCommandJson(\"task.wait\", deps.unwrapBody(normalized));\n } else {\n deps.printJson(deps.unwrapBody(normalized));\n }\n return;\n }\n if (isJson) deps.printCommandJson(\"task.wait\", taskInfo);\n else printTaskInfo(taskInfo, deps);\n };\n\n const handleTaskList = async (argv: string[]): Promise<void> => {\n const args = minimist(argv, {\n string: [\"token\", \"region\", \"type\", \"count\"],\n boolean: [\"help\", \"json\"],\n });\n\n if (args.help) {\n console.log(deps.usageTaskList());\n return;\n }\n\n const token = deps.getSingleString(args, \"token\");\n const region = deps.getRegionWithDefault(args);\n const type = deps.getSingleString(args, \"type\");\n const countRaw = deps.getSingleString(args, \"count\");\n const count = countRaw ? Number(countRaw) : 20;\n const isJson = Boolean(args.json);\n\n if (type && type !== \"image\" && type !== \"video\" && type !== \"all\") {\n deps.fail(`Invalid --type: ${type}. Use image, video, or all.`);\n }\n\n const pick = await deps.pickDirectTokenForTask(token, region);\n const result = await getAssetList(\n pick.token,\n buildRegionInfo(pick.region),\n {\n count: Number.isFinite(count) && count > 0 ? count : 20,\n type: type as AssetListOptions[\"type\"],\n }\n );\n\n if (isJson) {\n deps.printCommandJson(\"task.list\", {\n has_more: result.hasMore,\n next_offset: result.nextOffset,\n total: result.items.length,\n items: result.items,\n });\n return;\n }\n\n console.log(`Total: ${result.items.length} items${result.hasMore ? \" (more available)\" : \"\"}\\n`);\n for (const item of result.items) {\n const typeLabel = item.type === 1 ? \"IMG\" : \"VID\";\n const statusLabel = item.status === 144 || item.status === 10 ? \"DONE\" : item.status === 30 ? \"FAIL\" : \"PROC\";\n const time = item.createdTime > 0\n ? new Date(item.createdTime * 1000).toLocaleString()\n : \"-\";\n const modelShort = item.modelName || item.modelReqKey || \"-\";\n const promptShort = item.prompt.length > 50 ? item.prompt.slice(0, 50) + \"...\" : item.prompt;\n console.log(`${item.id} ${typeLabel} ${statusLabel.padEnd(4)} ${time} ${modelShort.padEnd(20)} ${promptShort}`);\n if (item.imageUrl) {\n console.log(` ${item.imageUrl}`);\n }\n }\n };\n\n return {\n handleModelsList,\n handleModelsRefresh,\n handleTaskGet,\n handleTaskWait,\n handleTaskList,\n printTaskInfo: (task) => {\n const normalized = collectTaskInfo(task, deps);\n if (!normalized) {\n deps.printJson(task);\n return;\n }\n printTaskInfo(normalized, deps);\n },\n };\n}\n","import { constants as fsConstants } from \"node:fs\";\nimport { access, mkdir, readFile, writeFile } from \"node:fs/promises\";\nimport path from \"node:path\";\n\nimport minimist from \"minimist\";\n\nimport { buildRegionInfo, type RegionCode } from \"@/api/controllers/core.ts\";\nimport { generateImageComposition, generateImages, upscaleImage } from \"@/api/controllers/images.ts\";\nimport { generateVideo } from \"@/api/controllers/videos.ts\";\nimport {\n VIDEO_OMNI_IMAGE_SLOT_KEYS,\n VIDEO_OMNI_VIDEO_SLOT_KEYS,\n buildDirectVideoInputPayload,\n collectVideoInputPlan,\n parseVideoCliMode,\n validateVideoModeAndModel,\n type VideoCliMode\n} from \"@/cli/video-input.ts\";\n\ntype JsonRecord = Record<string, unknown>;\n\ntype MediaDeps = {\n usageImageGenerate: () => string;\n usageImageEdit: () => string;\n usageImageUpscale: () => string;\n usageVideoGenerate: () => string;\n getSingleString: (args: Record<string, unknown>, key: string) => string | undefined;\n getRegionWithDefault: (args: Record<string, unknown>) => string;\n toStringList: (raw: unknown) => string[];\n fail: (message: string) => never;\n failWithUsage: (reason: string, usage: string) => never;\n pickDirectTokenForGeneration: (\n token: string | undefined,\n region: string | undefined,\n requestedModel: string,\n taskType: \"image\" | \"video\",\n requiredCapabilityTags?: string[]\n ) => Promise<{ token: string; region: RegionCode }>;\n printCommandJson: (command: string, data: unknown, meta?: JsonRecord) => void;\n printDownloadSummary: (kind: \"image\" | \"video\", files: string[]) => void;\n printTaskInfo: (task: unknown) => void;\n};\n\nfunction ensurePrompt(prompt: string | undefined, usage: string, deps: Pick<MediaDeps, \"fail\">): string {\n if (!prompt) {\n deps.fail(`Missing required --prompt.\\n\\n${usage}`);\n }\n return prompt;\n}\n\nfunction isHttpUrl(input: string): boolean {\n return /^https?:\\/\\//i.test(input);\n}\n\nasync function pathExists(filePath: string): Promise<boolean> {\n try {\n await access(filePath, fsConstants.F_OK);\n return true;\n } catch {\n return false;\n }\n}\n\nfunction detectImageExtension(contentType: string | null): string | null {\n if (!contentType) return null;\n if (contentType.includes(\"image/jpeg\")) return \"jpg\";\n if (contentType.includes(\"image/png\")) return \"png\";\n if (contentType.includes(\"image/webp\")) return \"webp\";\n if (contentType.includes(\"image/gif\")) return \"gif\";\n return null;\n}\n\nfunction detectImageExtensionFromUrl(fileUrl: string): string | null {\n try {\n const pathname = new URL(fileUrl).pathname.toLowerCase();\n if (pathname.endsWith(\".jpg\") || pathname.endsWith(\".jpeg\")) return \"jpg\";\n if (pathname.endsWith(\".png\")) return \"png\";\n if (pathname.endsWith(\".webp\")) return \"webp\";\n if (pathname.endsWith(\".gif\")) return \"gif\";\n } catch {\n return null;\n }\n return null;\n}\n\nfunction detectImageExtensionFromBuffer(buffer: Buffer): string | null {\n if (buffer.length >= 8) {\n if (\n buffer[0] === 0x89 &&\n buffer[1] === 0x50 &&\n buffer[2] === 0x4e &&\n buffer[3] === 0x47 &&\n buffer[4] === 0x0d &&\n buffer[5] === 0x0a &&\n buffer[6] === 0x1a &&\n buffer[7] === 0x0a\n ) return \"png\";\n }\n if (buffer.length >= 3) {\n if (buffer[0] === 0xff && buffer[1] === 0xd8 && buffer[2] === 0xff) return \"jpg\";\n }\n if (buffer.length >= 12) {\n if (\n buffer.toString(\"ascii\", 0, 4) === \"RIFF\" &&\n buffer.toString(\"ascii\", 8, 12) === \"WEBP\"\n ) return \"webp\";\n }\n if (buffer.length >= 6) {\n const sig = buffer.toString(\"ascii\", 0, 6);\n if (sig === \"GIF87a\" || sig === \"GIF89a\") return \"gif\";\n }\n return null;\n}\n\nfunction detectVideoExtension(contentType: string | null, fileUrl: string): string {\n if (contentType?.includes(\"video/mp4\")) return \"mp4\";\n if (contentType?.includes(\"video/webm\")) return \"webm\";\n const pathname = new URL(fileUrl).pathname.toLowerCase();\n if (pathname.endsWith(\".mp4\")) return \"mp4\";\n if (pathname.endsWith(\".webm\")) return \"webm\";\n if (pathname.endsWith(\".mov\")) return \"mov\";\n return \"mp4\";\n}\n\nfunction parsePositiveNumberOption(\n args: Record<string, unknown>,\n key: \"wait-timeout-seconds\" | \"poll-interval-ms\",\n deps: Pick<MediaDeps, \"getSingleString\" | \"fail\">\n): number | undefined {\n const raw = deps.getSingleString(args, key);\n if (!raw) return undefined;\n const parsed = Number(raw);\n if (!Number.isFinite(parsed) || parsed <= 0) {\n deps.fail(`Invalid --${key}: ${raw}`);\n }\n return parsed;\n}\n\nfunction applyWaitOptionsToBody(\n body: JsonRecord,\n args: Record<string, unknown>,\n deps: Pick<MediaDeps, \"getSingleString\" | \"fail\">,\n includeWaitFlag = true\n): boolean {\n const wait = Boolean(args.wait);\n if (includeWaitFlag) body.wait = wait;\n const waitTimeoutSeconds = parsePositiveNumberOption(args, \"wait-timeout-seconds\", deps);\n if (waitTimeoutSeconds !== undefined) body.wait_timeout_seconds = waitTimeoutSeconds;\n const pollIntervalMs = parsePositiveNumberOption(args, \"poll-interval-ms\", deps);\n if (pollIntervalMs !== undefined) body.poll_interval_ms = pollIntervalMs;\n return wait;\n}\n\nasync function downloadBinary(url: string, deps: Pick<MediaDeps, \"fail\">): Promise<{ buffer: Buffer; contentType: string | null }> {\n const response = await fetch(url);\n if (!response.ok) {\n deps.fail(`Download failed (${response.status}): ${url}`);\n }\n return {\n buffer: Buffer.from(await response.arrayBuffer()),\n contentType: response.headers.get(\"content-type\"),\n };\n}\n\nasync function downloadImages(\n urls: string[],\n outputDir: string,\n prefix: string,\n deps: Pick<MediaDeps, \"fail\">\n): Promise<string[]> {\n const dir = path.resolve(outputDir);\n await mkdir(dir, { recursive: true });\n const timestamp = new Date().toISOString().replace(/[-:.TZ]/g, \"\");\n const saved: string[] = [];\n\n for (let i = 0; i < urls.length; i += 1) {\n const imageUrl = urls[i];\n const { buffer, contentType } = await downloadBinary(imageUrl, deps);\n const ext =\n detectImageExtension(contentType) ??\n detectImageExtensionFromBuffer(buffer) ??\n detectImageExtensionFromUrl(imageUrl) ??\n \"png\";\n const fileName = `${prefix}-${timestamp}-${String(i + 1).padStart(2, \"0\")}.${ext}`;\n const filePath = path.join(dir, fileName);\n await writeFile(filePath, buffer);\n saved.push(filePath);\n }\n\n return saved;\n}\n\nexport function createMediaCommandHandlers(deps: MediaDeps): {\n handleImageGenerate: (argv: string[]) => Promise<void>;\n handleImageEdit: (argv: string[]) => Promise<void>;\n handleImageUpscale: (argv: string[]) => Promise<void>;\n handleVideoGenerate: (argv: string[]) => Promise<void>;\n} {\n const handleImageGenerate = async (argv: string[]): Promise<void> => {\n const args = minimist(argv, {\n string: [\n \"token\",\n \"region\",\n \"prompt\",\n \"model\",\n \"ratio\",\n \"resolution\",\n \"negative-prompt\",\n \"sample-strength\",\n \"output-dir\",\n \"wait-timeout-seconds\",\n \"poll-interval-ms\",\n ],\n boolean: [\"help\", \"intelligent-ratio\", \"wait\", \"json\"],\n default: { wait: true },\n });\n\n if (args.help) {\n console.log(deps.usageImageGenerate());\n return;\n }\n\n const token = deps.getSingleString(args, \"token\");\n const region = deps.getRegionWithDefault(args);\n const prompt = ensurePrompt(deps.getSingleString(args, \"prompt\"), deps.usageImageGenerate(), deps);\n const outputDir = deps.getSingleString(args, \"output-dir\") || \"./pic/cli-image-generate\";\n\n const body: JsonRecord = {\n prompt,\n model: deps.getSingleString(args, \"model\") || \"jimeng-4.5\",\n ratio: deps.getSingleString(args, \"ratio\") || \"1:1\",\n resolution: deps.getSingleString(args, \"resolution\") || \"2k\",\n };\n\n const negativePrompt = deps.getSingleString(args, \"negative-prompt\");\n if (negativePrompt) body.negative_prompt = negativePrompt;\n if (args[\"intelligent-ratio\"]) body.intelligent_ratio = true;\n const wait = applyWaitOptionsToBody(body, args, deps);\n const isJson = Boolean(args.json);\n\n const sampleStrengthRaw = deps.getSingleString(args, \"sample-strength\");\n if (sampleStrengthRaw) {\n const parsed = Number(sampleStrengthRaw);\n if (!Number.isFinite(parsed)) {\n deps.fail(`Invalid --sample-strength: ${sampleStrengthRaw}`);\n }\n body.sample_strength = parsed;\n }\n\n const pick = await deps.pickDirectTokenForGeneration(\n token,\n region,\n String(body.model || \"jimeng-4.5\"),\n \"image\"\n );\n const result = await generateImages(\n String(body.model || \"jimeng-4.5\"),\n String(prompt),\n {\n ratio: String(body.ratio || \"1:1\"),\n resolution: String(body.resolution || \"2k\"),\n sampleStrength: typeof body.sample_strength === \"number\" ? body.sample_strength : undefined,\n negativePrompt: typeof body.negative_prompt === \"string\" ? body.negative_prompt : undefined,\n intelligentRatio: Boolean(body.intelligent_ratio),\n wait,\n waitTimeoutSeconds: typeof body.wait_timeout_seconds === \"number\" ? body.wait_timeout_seconds : undefined,\n pollIntervalMs: typeof body.poll_interval_ms === \"number\" ? body.poll_interval_ms : undefined,\n },\n pick.token,\n buildRegionInfo(pick.region)\n );\n if (!Array.isArray(result)) {\n if (isJson) deps.printCommandJson(\"image.generate\", result, { wait });\n else deps.printTaskInfo(result);\n return;\n }\n const urls: string[] = result;\n if (urls.length === 0) deps.fail(\"No image URL found in response.\");\n\n const savedFiles = await downloadImages(urls, outputDir, \"jimeng-image-generate\", deps);\n if (isJson) {\n deps.printCommandJson(\n \"image.generate\",\n { data: urls.map((url) => ({ url })), files: savedFiles },\n { wait }\n );\n } else {\n deps.printDownloadSummary(\"image\", savedFiles);\n }\n };\n\n const handleImageEdit = async (argv: string[]): Promise<void> => {\n const args = minimist(argv, {\n string: [\n \"token\",\n \"region\",\n \"prompt\",\n \"image\",\n \"model\",\n \"ratio\",\n \"resolution\",\n \"negative-prompt\",\n \"sample-strength\",\n \"output-dir\",\n \"wait-timeout-seconds\",\n \"poll-interval-ms\",\n ],\n boolean: [\"help\", \"intelligent-ratio\", \"wait\", \"json\"],\n default: { wait: true },\n });\n\n if (args.help) {\n console.log(deps.usageImageEdit());\n return;\n }\n\n const token = deps.getSingleString(args, \"token\");\n const region = deps.getRegionWithDefault(args);\n const prompt = ensurePrompt(deps.getSingleString(args, \"prompt\"), deps.usageImageEdit(), deps);\n const sources = deps.toStringList(args.image);\n if (sources.length === 0) deps.failWithUsage(\"Missing required --image.\", deps.usageImageEdit());\n if (sources.length > 10) deps.fail(\"At most 10 images are supported for image edit.\");\n\n const outputDir = deps.getSingleString(args, \"output-dir\") || \"./pic/cli-image-edit\";\n const model = deps.getSingleString(args, \"model\") || \"jimeng-4.5\";\n const ratio = deps.getSingleString(args, \"ratio\") || \"1:1\";\n const resolution = deps.getSingleString(args, \"resolution\") || \"2k\";\n const negativePrompt = deps.getSingleString(args, \"negative-prompt\");\n const sampleStrengthRaw = deps.getSingleString(args, \"sample-strength\");\n const intelligentRatio = Boolean(args[\"intelligent-ratio\"]);\n const wait = Boolean(args.wait);\n const isJson = Boolean(args.json);\n\n const allUrls = sources.every(isHttpUrl);\n const allLocal = sources.every((item) => !isHttpUrl(item));\n if (!allUrls && !allLocal) {\n deps.fail(\"Mixed image sources are not supported. Use all URLs or all local files.\");\n }\n\n const pick = await deps.pickDirectTokenForGeneration(token, region, model, \"image\");\n const images: Array<string | Buffer> = [];\n if (allUrls) {\n images.push(...sources);\n } else {\n for (const source of sources) {\n const imagePath = path.resolve(source);\n if (!(await pathExists(imagePath))) deps.fail(`Image file not found: ${imagePath}`);\n images.push(await readFile(imagePath));\n }\n }\n const sampleStrength = sampleStrengthRaw ? Number(sampleStrengthRaw) : undefined;\n if (sampleStrengthRaw && !Number.isFinite(sampleStrength)) {\n deps.fail(`Invalid --sample-strength: ${sampleStrengthRaw}`);\n }\n\n const result = await generateImageComposition(\n model,\n prompt,\n images,\n {\n ratio,\n resolution,\n sampleStrength: sampleStrength as number | undefined,\n negativePrompt,\n intelligentRatio,\n wait,\n waitTimeoutSeconds: parsePositiveNumberOption(args, \"wait-timeout-seconds\", deps),\n pollIntervalMs: parsePositiveNumberOption(args, \"poll-interval-ms\", deps),\n },\n pick.token,\n buildRegionInfo(pick.region)\n );\n if (!Array.isArray(result)) {\n if (isJson) deps.printCommandJson(\"image.edit\", result, { wait });\n else deps.printTaskInfo(result);\n return;\n }\n const urls: string[] = result;\n if (urls.length === 0) deps.fail(\"No image URL found in response.\");\n\n const savedFiles = await downloadImages(urls, outputDir, \"jimeng-image-edit\", deps);\n if (isJson) {\n deps.printCommandJson(\n \"image.edit\",\n { data: urls.map((url) => ({ url })), files: savedFiles },\n { wait }\n );\n } else {\n deps.printDownloadSummary(\"image\", savedFiles);\n }\n };\n\n const handleVideoGenerate = async (argv: string[]): Promise<void> => {\n const usage = deps.usageVideoGenerate();\n const args = minimist(argv, {\n string: [\n \"token\",\n \"region\",\n \"prompt\",\n \"mode\",\n \"image-file\",\n \"video-file\",\n ...VIDEO_OMNI_IMAGE_SLOT_KEYS,\n ...VIDEO_OMNI_VIDEO_SLOT_KEYS,\n \"model\",\n \"ratio\",\n \"resolution\",\n \"duration\",\n \"output-dir\",\n \"wait-timeout-seconds\",\n \"poll-interval-ms\",\n ],\n boolean: [\"help\", \"wait\", \"json\"],\n default: { wait: true },\n });\n\n if (args.help) {\n console.log(usage);\n return;\n }\n\n const token = deps.getSingleString(args, \"token\");\n const region = deps.getRegionWithDefault(args);\n const prompt = ensurePrompt(deps.getSingleString(args, \"prompt\"), usage, deps);\n const cliMode = parseVideoCliMode(args, usage, {\n getSingleString: deps.getSingleString,\n toStringList: deps.toStringList,\n failWithUsage: deps.failWithUsage,\n });\n const inputPlan = collectVideoInputPlan(args, usage, {\n getSingleString: deps.getSingleString,\n toStringList: deps.toStringList,\n failWithUsage: deps.failWithUsage,\n });\n\n const outputDir = deps.getSingleString(args, \"output-dir\") || \"./pic/cli-video-generate\";\n const model = deps.getSingleString(args, \"model\")\n || (cliMode === \"omni_reference\" ? \"jimeng-video-seedance-2.0-fast\" : \"jimeng-video-3.0\");\n validateVideoModeAndModel(cliMode, model, inputPlan, usage, { failWithUsage: deps.failWithUsage });\n const functionMode = cliMode === \"omni_reference\" ? \"omni_reference\" : \"first_last_frames\";\n const ratio = deps.getSingleString(args, \"ratio\") || \"1:1\";\n const resolution = deps.getSingleString(args, \"resolution\") || \"720p\";\n const durationRaw = deps.getSingleString(args, \"duration\") || \"5\";\n const duration = Number(durationRaw);\n if (!Number.isFinite(duration) || duration <= 0 || !Number.isInteger(duration)) {\n deps.fail(`Invalid --duration: ${durationRaw}. Use a positive integer (seconds).`);\n }\n const wait = Boolean(args.wait);\n const isJson = Boolean(args.json);\n const requiredCapabilityTags = cliMode === \"omni_reference\" ? [\"omni_reference\"] : [];\n const pick = await deps.pickDirectTokenForGeneration(token, region, model, \"video\", requiredCapabilityTags);\n const directInputs = await buildDirectVideoInputPayload(cliMode, inputPlan, {\n isHttpUrl,\n pathExists,\n fail: deps.fail,\n });\n\n const result = await generateVideo(\n model,\n prompt,\n {\n ratio,\n resolution,\n duration,\n filePaths: directInputs.filePaths,\n files: directInputs.files,\n httpRequest: directInputs.httpRequest,\n functionMode,\n wait,\n waitTimeoutSeconds: parsePositiveNumberOption(args, \"wait-timeout-seconds\", deps),\n pollIntervalMs: parsePositiveNumberOption(args, \"poll-interval-ms\", deps),\n },\n pick.token,\n buildRegionInfo(pick.region)\n );\n\n if (typeof result !== \"string\") {\n if (isJson) deps.printCommandJson(\"video.generate\", result, { wait, mode: cliMode });\n else deps.printTaskInfo(result);\n return;\n }\n const videoUrl: string = result;\n\n const { buffer, contentType } = await downloadBinary(videoUrl, deps);\n const dir = path.resolve(outputDir);\n await mkdir(dir, { recursive: true });\n const timestamp = new Date().toISOString().replace(/[-:.TZ]/g, \"\");\n const ext = detectVideoExtension(contentType, videoUrl);\n const filePath = path.join(dir, `jimeng-video-generate-${timestamp}.${ext}`);\n await writeFile(filePath, buffer);\n\n if (isJson) {\n deps.printCommandJson(\n \"video.generate\",\n { data: [{ url: videoUrl }], files: [filePath] },\n { wait, mode: cliMode }\n );\n } else {\n deps.printDownloadSummary(\"video\", [filePath]);\n }\n };\n\n const handleImageUpscale = async (argv: string[]): Promise<void> => {\n const args = minimist(argv, {\n string: [\n \"token\",\n \"region\",\n \"image\",\n \"model\",\n \"resolution\",\n \"output-dir\",\n \"wait-timeout-seconds\",\n \"poll-interval-ms\",\n ],\n boolean: [\"help\", \"wait\", \"json\"],\n default: { wait: true },\n });\n\n if (args.help) {\n console.log(deps.usageImageUpscale());\n return;\n }\n\n const token = deps.getSingleString(args, \"token\");\n const region = deps.getRegionWithDefault(args);\n const imageSource = deps.getSingleString(args, \"image\");\n if (!imageSource) deps.failWithUsage(\"Missing required --image.\", deps.usageImageUpscale());\n\n const outputDir = deps.getSingleString(args, \"output-dir\") || \"./pic/cli-image-upscale\";\n const model = deps.getSingleString(args, \"model\") || \"jimeng-5.0\";\n const resolution = deps.getSingleString(args, \"resolution\") || \"4k\";\n const wait = Boolean(args.wait);\n const isJson = Boolean(args.json);\n\n const pick = await deps.pickDirectTokenForGeneration(token, region, model, \"image\");\n\n let image: string | Buffer;\n if (isHttpUrl(imageSource)) {\n image = imageSource;\n } else {\n const imagePath = path.resolve(imageSource);\n if (!(await pathExists(imagePath))) deps.fail(`Image file not found: ${imagePath}`);\n image = await readFile(imagePath);\n }\n\n const result = await upscaleImage(\n model,\n image,\n {\n resolution,\n wait,\n waitTimeoutSeconds: parsePositiveNumberOption(args, \"wait-timeout-seconds\", deps),\n pollIntervalMs: parsePositiveNumberOption(args, \"poll-interval-ms\", deps),\n },\n pick.token,\n buildRegionInfo(pick.region)\n );\n\n if (!Array.isArray(result)) {\n if (isJson) deps.printCommandJson(\"image.upscale\", result, { wait });\n else deps.printTaskInfo(result);\n return;\n }\n const urls: string[] = result;\n if (urls.length === 0) deps.fail(\"No image URL found in response.\");\n\n const savedFiles = await downloadImages(urls, outputDir, \"jimeng-image-upscale\", deps);\n if (isJson) {\n deps.printCommandJson(\n \"image.upscale\",\n { data: urls.map((url) => ({ url })), files: savedFiles },\n { wait, resolution }\n );\n } else {\n deps.printDownloadSummary(\"image\", savedFiles);\n }\n };\n\n return {\n handleImageGenerate,\n handleImageEdit,\n handleImageUpscale,\n handleVideoGenerate,\n };\n}\n\n","import path from \"node:path\";\n\nexport type VideoCliMode = \"text_to_video\" | \"image_to_video\" | \"first_last_frames\" | \"omni_reference\";\n\nexport const VIDEO_OMNI_IMAGE_SLOT_KEYS = Array.from({ length: 9 }, (_, i) => `image-file-${i + 1}`);\nexport const VIDEO_OMNI_VIDEO_SLOT_KEYS = Array.from({ length: 3 }, (_, i) => `video-file-${i + 1}`);\n\nconst VIDEO_SUPPORTED_MODES: VideoCliMode[] = [\n \"text_to_video\",\n \"image_to_video\",\n \"first_last_frames\",\n \"omni_reference\",\n];\n\nconst VIDEO_OMNI_SUPPORTED_MODELS = new Set([\"jimeng-video-seedance-2.0\", \"jimeng-video-seedance-2.0-fast\"]);\n\nexport type VideoInputPlan = {\n repeatedImageInputs: string[];\n repeatedVideoInputs: string[];\n explicitImageSlots: Array<{ slot: number; input: string }>;\n explicitVideoSlots: Array<{ slot: number; input: string }>;\n totalImageInputs: number;\n totalVideoInputs: number;\n};\n\nexport type DirectUploadFile = {\n filepath: string;\n originalFilename: string;\n};\n\nexport type DirectVideoInputPayload = {\n filePaths: string[];\n files: Record<string, DirectUploadFile>;\n httpRequest: { body: Record<string, string> };\n};\n\ntype ArgMap = Record<string, unknown>;\n\ntype ParseDeps = {\n getSingleString: (args: ArgMap, key: string) => string | undefined;\n toStringList: (raw: unknown) => string[];\n failWithUsage: (reason: string, usage: string) => never;\n};\n\ntype BuildPayloadDeps = {\n isHttpUrl: (input: string) => boolean;\n pathExists: (filePath: string) => Promise<boolean>;\n fail: (message: string) => never;\n};\n\nexport function parseVideoCliMode(args: ArgMap, usage: string, deps: ParseDeps): VideoCliMode {\n const cliModeRaw = deps.getSingleString(args, \"mode\") || \"text_to_video\";\n if (!VIDEO_SUPPORTED_MODES.includes(cliModeRaw as VideoCliMode)) {\n deps.failWithUsage(\n `Invalid --mode: ${cliModeRaw}. Use text_to_video, image_to_video, first_last_frames, or omni_reference.`,\n usage\n );\n }\n return cliModeRaw as VideoCliMode;\n}\n\nexport function collectVideoInputPlan(args: ArgMap, usage: string, deps: ParseDeps): VideoInputPlan {\n const repeatedImageInputs = deps.toStringList(args[\"image-file\"]);\n const repeatedVideoInputs = deps.toStringList(args[\"video-file\"]);\n const explicitImageSlots = VIDEO_OMNI_IMAGE_SLOT_KEYS\n .map((key, i) => ({ slot: i + 1, input: deps.getSingleString(args, key) }))\n .filter((item): item is { slot: number; input: string } => Boolean(item.input));\n const explicitVideoSlots = VIDEO_OMNI_VIDEO_SLOT_KEYS\n .map((key, i) => ({ slot: i + 1, input: deps.getSingleString(args, key) }))\n .filter((item): item is { slot: number; input: string } => Boolean(item.input));\n\n if (repeatedImageInputs.length > 0 && explicitImageSlots.length > 0) {\n deps.failWithUsage(\n \"Do not mix repeated --image-file with explicit --image-file-N in one command.\",\n usage\n );\n }\n if (repeatedVideoInputs.length > 0 && explicitVideoSlots.length > 0) {\n deps.failWithUsage(\n \"Do not mix repeated --video-file with explicit --video-file-N in one command.\",\n usage\n );\n }\n\n return {\n repeatedImageInputs,\n repeatedVideoInputs,\n explicitImageSlots,\n explicitVideoSlots,\n totalImageInputs: repeatedImageInputs.length + explicitImageSlots.length,\n totalVideoInputs: repeatedVideoInputs.length + explicitVideoSlots.length,\n };\n}\n\nexport function validateVideoModeAndModel(\n cliMode: VideoCliMode,\n model: string,\n plan: VideoInputPlan,\n usage: string,\n deps: Pick<ParseDeps, \"failWithUsage\">\n): void {\n if (cliMode === \"omni_reference\" && !VIDEO_OMNI_SUPPORTED_MODELS.has(model)) {\n deps.failWithUsage(\n `omni_reference mode requires --model jimeng-video-seedance-2.0 or jimeng-video-seedance-2.0-fast (current: ${model}).`,\n usage\n );\n }\n\n if (cliMode === \"text_to_video\") {\n if (plan.totalImageInputs + plan.totalVideoInputs > 0) {\n deps.failWithUsage(\"text_to_video mode does not accept --image-file or --video-file inputs.\", usage);\n }\n return;\n }\n if (cliMode === \"image_to_video\") {\n if (plan.totalVideoInputs > 0) {\n deps.failWithUsage(\"image_to_video mode does not accept --video-file.\", usage);\n }\n if (plan.totalImageInputs !== 1) {\n deps.failWithUsage(\"image_to_video mode requires exactly one --image-file input.\", usage);\n }\n return;\n }\n if (cliMode === \"first_last_frames\") {\n if (plan.totalVideoInputs > 0) {\n deps.failWithUsage(\"first_last_frames mode does not accept --video-file.\", usage);\n }\n if (plan.totalImageInputs === 0) {\n deps.failWithUsage(\"first_last_frames mode requires at least one --image-file input.\", usage);\n }\n if (plan.totalImageInputs > 2) {\n deps.failWithUsage(\"first_last_frames mode supports at most 2 image inputs.\", usage);\n }\n return;\n }\n\n if (plan.totalImageInputs + plan.totalVideoInputs === 0) {\n deps.failWithUsage(\"omni_reference mode requires at least one --image-file or --video-file input.\", usage);\n }\n if (plan.totalImageInputs > 9) {\n deps.failWithUsage(\"omni_reference supports at most 9 image inputs.\", usage);\n }\n if (plan.totalVideoInputs > 3) {\n deps.failWithUsage(\"omni_reference supports at most 3 video inputs.\", usage);\n }\n}\n\nexport async function buildDirectVideoInputPayload(\n cliMode: VideoCliMode,\n plan: VideoInputPlan,\n deps: BuildPayloadDeps\n): Promise<DirectVideoInputPayload> {\n const payload: DirectVideoInputPayload = {\n filePaths: [],\n files: {},\n httpRequest: { body: {} },\n };\n\n const registerInput = async (\n fieldName: string,\n input: string,\n mediaType: \"image\" | \"video\"\n ): Promise<void> => {\n if (deps.isHttpUrl(input)) {\n if (cliMode === \"omni_reference\") {\n payload.httpRequest.body[fieldName] = input;\n } else if (mediaType === \"image\") {\n payload.filePaths.push(input);\n } else {\n deps.fail(`Mode ${cliMode} does not support video URL input.`);\n }\n return;\n }\n\n const filePath = path.resolve(input);\n if (!(await deps.pathExists(filePath))) {\n deps.fail(`Input file not found for ${fieldName}: ${filePath}`);\n }\n payload.files[fieldName] = {\n filepath: filePath,\n originalFilename: path.basename(filePath),\n };\n };\n\n if (cliMode === \"omni_reference\") {\n for (let i = 0; i < plan.repeatedImageInputs.length; i += 1) {\n await registerInput(`image_file_${i + 1}`, plan.repeatedImageInputs[i], \"image\");\n }\n for (let i = 0; i < plan.repeatedVideoInputs.length; i += 1) {\n await registerInput(`video_file_${i + 1}`, plan.repeatedVideoInputs[i], \"video\");\n }\n for (const slot of plan.explicitImageSlots) {\n await registerInput(`image_file_${slot.slot}`, slot.input, \"image\");\n }\n for (const slot of plan.explicitVideoSlots) {\n await registerInput(`video_file_${slot.slot}`, slot.input, \"video\");\n }\n return payload;\n }\n\n const imageInputs =\n plan.repeatedImageInputs.length > 0\n ? plan.repeatedImageInputs\n : plan.explicitImageSlots.sort((a, b) => a.slot - b.slot).map((item) => item.input);\n for (let i = 0; i < imageInputs.length; i += 1) {\n await registerInput(`image_file_${i + 1}`, imageInputs[i], \"image\");\n }\n return payload;\n}\n\n","import { execSync, spawn } from \"node:child_process\";\nimport { existsSync } from \"node:fs\";\nimport path from \"node:path\";\nimport os from \"node:os\";\n\nimport minimist from \"minimist\";\n\nimport {\n buildRegionInfo,\n getCredit,\n type RegionCode\n} from \"@/api/controllers/core.ts\";\nimport tokenPool from \"@/lib/session-pool.ts\";\n\ntype JsonRecord = Record<string, unknown>;\n\ntype LoginDeps = {\n getSingleString: (args: Record<string, unknown>, key: string) => string | undefined;\n getRegionWithDefault: (args: Record<string, unknown>) => string;\n parseRegionOrFail: (region: string | undefined) => RegionCode | undefined;\n ensureTokenPoolReady: () => Promise<void>;\n fail: (message: string) => never;\n printJson: (value: unknown) => void;\n printCommandJson: (command: string, data: unknown, meta?: JsonRecord) => void;\n};\n\nconst LOGIN_SCRIPT = path.join(__dirname, \"..\", \"..\", \"scripts\", \"jimeng_login_helper.py\");\n\n/**\n * Create the login command handler.\n * The login flow:\n * 1. Try to use the bundled Python login helper (jimeng_login.py via CDP)\n * 2. Fall back to manual sessionid input\n * 3. Auto-add the token to the token pool\n */\nexport function createLoginCommandHandler(deps: LoginDeps): (argv: string[]) => Promise<void> {\n return async (argv: string[]): Promise<void> => {\n const args = minimist(argv, {\n string: [\"region\", \"sessionid\", \"debug-port\"],\n boolean: [\"help\", \"headless\", \"json\"],\n });\n\n if (args.help) {\n console.log(usageLogin());\n return;\n }\n\n const region = deps.getRegionWithDefault(args);\n const parsedRegion = deps.parseRegionOrFail(region);\n const isJson = Boolean(args.json);\n const sessionid = deps.getSingleString(args, \"sessionid\");\n const debugPort = deps.getSingleString(args, \"debug-port\") || \"9333\";\n const headless = Boolean(args.headless);\n\n // Mode 1: Direct sessionid provided via --sessionid\n if (sessionid) {\n await addSessionToPool(sessionid, parsedRegion || \"cn\", deps, isJson);\n return;\n }\n\n // Mode 2: Try Python login helper (CDP-based browser login)\n const pythonLoginResult = await tryPythonLogin(debugPort, headless);\n if (pythonLoginResult) {\n await addSessionToPool(pythonLoginResult, parsedRegion || \"cn\", deps, isJson);\n return;\n }\n\n // Mode 3: Fallback - manual sessionid input\n console.log(\"\");\n console.log(\"Auto login not available. Please provide your sessionid manually.\");\n console.log(\"You can get it from:\");\n console.log(\" 1. Login at https://jimeng.jianying.com/ai-tool/home/\");\n console.log(\" 2. Open DevTools > Application > Cookies > sessionid\");\n console.log(\"\");\n console.log(\"Then run: jimeng login --sessionid <your_sessionid> --region cn\");\n console.log(\"\");\n console.log(\"Or install Python 3 to use the automatic browser login.\");\n };\n};\n\nasync function tryPythonLogin(debugPort: string, headless: boolean): Promise<string | null> {\n // Check if Python login script exists\n const loginScript = findLoginScript();\n if (!loginScript) {\n return null;\n }\n\n console.log(`Launching browser login (debug port: ${debugPort})...`);\n console.log(\"Please complete login in the Chrome window.\\n\");\n\n try {\n const cmdArgs = [loginScript, \"--debug-port\", debugPort];\n if (headless) cmdArgs.push(\"--headless\");\n\n const result = await runPythonScript(cmdArgs);\n const output = result.stdout.trim();\n\n // Parse sessionid from output (format: \" sessionid: xxxxxxxx\")\n const match = output.match(/sessionid:\\s*(\\S+)/);\n if (match) {\n return match[1];\n }\n\n console.log(\"Login script completed but sessionid not found in output.\");\n return null;\n } catch (error: any) {\n console.log(`Auto login failed: ${error.message}`);\n return null;\n }\n}\n\nfunction findLoginScript(): string | null {\n // Check bundled location first\n if (existsSync(LOGIN_SCRIPT)) {\n return LOGIN_SCRIPT;\n }\n\n // Check common locations\n const candidates = [\n path.join(process.cwd(), \"jimeng_login.py\"),\n path.join(os.homedir(), \".jimeng_login.py\"),\n ];\n\n // Check if python3 can find it in PATH\n try {\n const whichResult = execSync(\"which jimeng_login.py 2>/dev/null || echo ''\", { encoding: \"utf-8\" }).trim();\n if (whichResult) return whichResult;\n } catch {\n // ignore\n }\n\n for (const candidate of candidates) {\n if (existsSync(candidate)) return candidate;\n }\n\n return null;\n}\n\nfunction runPythonScript(args: string[]): Promise<{ stdout: string; stderr: string }> {\n return new Promise((resolve, reject) => {\n const pythonCmd = process.platform === \"win32\" ? \"python\" : \"python3\";\n const proc = spawn(pythonCmd, args, {\n stdio: [\"ignore\", \"pipe\", \"pipe\"],\n env: { ...process.env },\n });\n\n let stdout = \"\";\n let stderr = \"\";\n\n proc.stdout?.on(\"data\", (data: Buffer) => {\n stdout += data.toString();\n // Stream output to console\n const lines = data.toString().split(\"\\n\").filter(Boolean);\n for (const line of lines) {\n console.log(line);\n }\n });\n\n proc.stderr?.on(\"data\", (data: Buffer) => {\n stderr += data.toString();\n });\n\n proc.on(\"close\", (code) => {\n if (code === 0) {\n resolve({ stdout, stderr });\n } else {\n reject(new Error(`Login script exited with code ${code}: ${stderr.slice(-200)}`));\n }\n });\n\n proc.on(\"error\", (error) => {\n reject(new Error(`Failed to run login script: ${error.message}`));\n });\n });\n}\n\nasync function addSessionToPool(\n sessionid: string,\n region: RegionCode,\n deps: LoginDeps,\n isJson: boolean\n): Promise<void> {\n await deps.ensureTokenPoolReady();\n\n const { added, total } = await tokenPool.addTokens([sessionid], { defaultRegion: region });\n\n if (added > 0) {\n const masked = sessionid.length > 10\n ? `${sessionid.slice(0, 4)}...${sessionid.slice(-4)}`\n : \"***\";\n\n // Try to verify the token by checking credits\n let creditInfo = \"\";\n try {\n const { totalCredit } = await getCredit(sessionid, buildRegionInfo(region));\n creditInfo = ` (credits: ${totalCredit})`;\n } catch {\n creditInfo = \" (credit check failed)\";\n }\n\n if (isJson) {\n deps.printCommandJson(\"login\", {\n token: masked,\n region,\n added: true,\n total,\n creditCheck: creditInfo.trim(),\n });\n } else {\n console.log(`\\nLogin successful!`);\n console.log(` Token: ${masked}`);\n console.log(` Region: ${region}${creditInfo}`);\n console.log(` Pool size: ${total} token(s)`);\n }\n } else {\n if (isJson) {\n deps.printCommandJson(\"login\", {\n added: false,\n total,\n reason: \"token already exists in pool\",\n });\n } else {\n console.log(`Token already exists in pool. Pool size: ${total} token(s)`);\n }\n }\n}\n\nfunction usageLogin(): string {\n return [\n \"Usage:\",\n \" jimeng login [options]\",\n \"\",\n \"Options:\",\n \" --region <region> Region for the token (default cn)\",\n \" --sessionid <token> Add sessionid directly (skip browser login)\",\n \" --debug-port <port> Chrome debug port (default 9333)\",\n \" --headless Run Chrome in headless mode\",\n \" --json Output structured JSON\",\n \" --help Show help\",\n \"\",\n \"Notes:\",\n \" - Without --sessionid, launches Chrome for browser login (requires Python 3).\",\n \" - With --sessionid, directly adds the token to the pool.\",\n \" - After login, the token is automatically added to the token pool.\",\n \" - Token is validated by checking credit balance.\",\n ].join(\"\\n\");\n}\n","#!/usr/bin/env node\n\nimport { runCli } from \"@/cli/app.ts\";\n\nrunCli();\n\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;AAAA,OAAOA,cAAa;;;ACApB,SAAS,aAAa,mBAAmB;AACzC,OAAO,UAAU;AACjB,SAAS,QAAQ,gBAAgB;AAEjC,OAAO,cAAc;AAqDrB,SAAS,UAAU,OAAuB;AACxC,QAAM,IAAI,MAAM;AAChB,MAAI,KAAK,GAAI,QAAO;AACpB,SAAO,GAAG,MAAM,MAAM,GAAG,CAAC,CAAC,MAAM,MAAM,MAAM,EAAE,CAAC;AAClD;AAEA,SAAS,aAAa,OAAwB;AAC5C,MAAI,OAAO,UAAU,YAAY,CAAC,OAAO,SAAS,KAAK,KAAK,SAAS,EAAG,QAAO;AAC/E,SAAO,IAAI,KAAK,KAAK,EAAE,YAAY;AACrC;AAEA,SAAS,uBAAuB,OAAwB;AACtD,MAAI,MAAM,WAAW,GAAG;AACtB,YAAQ,IAAI,SAAS;AACrB;AAAA,EACF;AACA,UAAQ,IAAI,6DAAmE;AAC/E,aAAW,QAAQ,OAAO;AACxB,QAAI,CAAC,QAAQ,OAAO,SAAS,SAAU;AACvC,UAAM,QAAQ;AACd,UAAM,QAAQ,OAAO,MAAM,UAAU,WAAW,MAAM,QAAQ;AAC9D,UAAM,SAAS,OAAO,MAAM,WAAW,WAAW,MAAM,SAAS;AACjE,UAAM,UAAU,OAAO,MAAM,YAAY,YAAY,OAAO,MAAM,OAAO,IAAI;AAC7E,UAAM,OAAO,OAAO,MAAM,SAAS,YAAY,OAAO,MAAM,IAAI,IAAI;AACpE,UAAM,aAAa,OAAO,MAAM,eAAe,WAAW,OAAO,MAAM,UAAU,IAAI;AACrF,UAAM,gBAAgB,aAAa,MAAM,aAAa;AACtD,UAAM,WACJ,OAAO,MAAM,wBAAwB,WAAW,OAAO,MAAM,mBAAmB,IAAI;AACtF,YAAQ,IAAI,GAAG,KAAK,IAAK,MAAM,IAAK,OAAO,IAAK,IAAI,IAAK,UAAU,IAAK,aAAa,IAAK,QAAQ,EAAE;AAAA,EACtG;AACF;AAEA,SAAS,yBAAiE;AACxE,SAAO;AAAA,IACL,SAAS,qBAAU,WAAW;AAAA,IAC9B,OAAO,qBAAU,WAAW,IAAI;AAAA,EAClC;AACF;AAEA,eAAe,WAAW,UAAoC;AAC5D,MAAI;AACF,UAAM,OAAO,UAAU,YAAY,IAAI;AACvC,WAAO;AAAA,EACT,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,eAAe,mBAAmB,aAAqB,MAAyD;AAC9G,QAAM,WAAW,KAAK,QAAQ,WAAW;AACzC,MAAI,CAAE,MAAM,WAAW,QAAQ,GAAI;AACjC,SAAK,KAAK,yBAAyB,QAAQ,EAAE;AAAA,EAC/C;AACA,UAAQ,MAAM,SAAS,UAAU,MAAM,GACpC,MAAM,OAAO,EACb,IAAI,CAAC,SAAS,KAAK,KAAK,CAAC,EACzB,OAAO,CAAC,SAAS,KAAK,SAAS,KAAK,CAAC,KAAK,WAAW,GAAG,CAAC;AAC9D;AAEA,eAAe,sBACb,MACA,OACA,MACA,WAAW,OACQ;AACnB,QAAM,SAAS,CAAC,GAAG,KAAK,aAAa,KAAK,KAAK,CAAC;AAChD,QAAM,YAAY,KAAK,gBAAgB,MAAM,YAAY;AACzD,MAAI,WAAW;AACb,WAAO,KAAK,GAAI,MAAM,mBAAmB,WAAW,IAAI,CAAE;AAAA,EAC5D;AACA,QAAM,UAAU,MAAM,KAAK,IAAI,IAAI,MAAM,CAAC;AAC1C,MAAI,YAAY,QAAQ,WAAW,GAAG;AACpC,SAAK,KAAK;AAAA;AAAA,EAA0B,KAAK,EAAE;AAAA,EAC7C;AACA,SAAO;AACT;AAEO,SAAS,uBAAuB,MAA8C;AACnF,QAAM,mBAA+B,OAAO,SAAS;AACnD,UAAM,OAAO,SAAS,MAAM;AAAA,MAC1B,QAAQ,CAAC,SAAS,cAAc,QAAQ;AAAA,MACxC,SAAS,CAAC,QAAQ,MAAM;AAAA,IAC1B,CAAC;AACD,UAAM,QAAQ,KAAK,SAAS,OAAO;AACnC,QAAI,KAAK,MAAM;AACb,cAAQ,IAAI,KAAK;AACjB;AAAA,IACF;AACA,UAAM,SAAS,KAAK,qBAAqB,IAAI;AAC7C,UAAM,aAAa,KAAK,kBAAkB,MAAM;AAChD,QAAI,CAAC,YAAY;AACf,WAAK,KAAK,8CAA8C;AAAA,IAC1D;AACA,UAAM,SAAS,MAAM,sBAAsB,MAAM,OAAO,MAAM,IAAI;AAClE,QAAI,CAAC,KAAK,MAAM;AACd,cAAQ,IAAI,YAAY,OAAO,MAAM,WAAW;AAAA,IAClD;AAEA,UAAM,KAAK,qBAAqB;AAChC,QAAI,UAAU;AACd,QAAI,gBAAgB;AACpB,UAAM,UAA2E,CAAC;AAClF,eAAW,SAAS,QAAQ;AAC1B,YAAM,SAAS,UAAU,KAAK;AAC9B,UAAI;AACF,cAAM,OAAO,MAAM,mBAAmB,OAAO,gBAAgB,UAAU,CAAC;AACxE,cAAM,qBAAU,qBAAqB,OAAO,IAAI;AAChD,YAAI,SAAS,MAAM;AACjB,cAAI,CAAC,KAAK,KAAM,SAAQ,IAAI,UAAU,MAAM,YAAY;AAAA,QAC1D,OAAO;AACL,qBAAW;AACX,cAAI,CAAC,KAAK,KAAM,SAAQ,IAAI,UAAU,MAAM,aAAa;AAAA,QAC3D;AACA,gBAAQ,KAAK,EAAE,cAAc,QAAQ,MAAM,SAAS,KAAK,CAAC;AAAA,MAC5D,SAAS,OAAO;AACd,yBAAiB;AACjB,cAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AACrE,YAAI,CAAC,KAAK,KAAM,SAAQ,IAAI,WAAW,MAAM,IAAI,OAAO,EAAE;AAC1D,gBAAQ,KAAK,EAAE,cAAc,QAAQ,OAAO,QAAQ,CAAC;AAAA,MACvD;AAAA,IACF;AACA,QAAI,KAAK,MAAM;AACb,WAAK,iBAAiB,eAAe,SAAS;AAAA,QAC5C,OAAO,OAAO;AAAA,QACd;AAAA,QACA,gBAAgB;AAAA,MAClB,CAAC;AAAA,IACH,OAAO;AACL,cAAQ,IAAI,kBAAkB,OAAO,MAAM,YAAY,OAAO,mBAAmB,aAAa,EAAE;AAAA,IAClG;AACA,QAAI,gBAAgB,EAAG,SAAQ,KAAK,CAAC;AACrC,QAAI,UAAU,EAAG,SAAQ,KAAK,CAAC;AAAA,EACjC;AAEA,QAAM,kBAA8B,OAAO,SAAS;AAClD,UAAM,OAAO,SAAS,MAAM;AAAA,MAC1B,SAAS,CAAC,QAAQ,MAAM;AAAA,IAC1B,CAAC;AACD,UAAM,QAAQ,KAAK,SAAS,MAAM;AAClC,QAAI,KAAK,MAAM;AACb,cAAQ,IAAI,KAAK;AACjB;AAAA,IACF;AACA,UAAM,KAAK,qBAAqB;AAChC,UAAM,aAAa,uBAAuB;AAC1C,QAAI,KAAK,MAAM;AACb,WAAK,iBAAiB,cAAc,UAAU;AAC9C;AAAA,IACF;AACA,UAAM,OAAO,cAAc,OAAO,eAAe,WAAY,aAA4B,CAAC;AAC1F,UAAM,UAAU,KAAK;AACrB,QAAI,WAAW,OAAO,YAAY,UAAU;AAC1C,cAAQ,IAAI,UAAU;AACtB,WAAK,UAAU,OAAO;AAAA,IACxB;AACA,UAAM,QAAQ,MAAM,QAAQ,KAAK,KAAK,IAAI,KAAK,QAAQ,CAAC;AACxD,YAAQ,IAAI,UAAU;AACtB,2BAAuB,KAAK;AAAA,EAC9B;AAEA,QAAM,6BAA6B,OACjC,MACA,WACkB;AAClB,UAAM,OAAO,SAAS,MAAM;AAAA,MAC1B,QAAQ,CAAC,SAAS,cAAc,QAAQ;AAAA,MACxC,SAAS,CAAC,QAAQ,MAAM;AAAA,IAC1B,CAAC;AACD,UAAM,QAAQ,KAAK,SAAS,MAAM;AAClC,QAAI,KAAK,MAAM;AACb,cAAQ,IAAI,KAAK;AACjB;AAAA,IACF;AACA,UAAM,SAAS,KAAK,qBAAqB,IAAI;AAC7C,UAAM,aAAa,KAAK,kBAAkB,MAAM;AAChD,UAAM,KAAK,qBAAqB;AAChC,UAAM,SAAS,MAAM,sBAAsB,MAAM,OAAO,MAAM,KAAK;AACnE,UAAM,iBAAiB,OAAO,SAAS,IACnC,OAAO,IAAI,CAAC,UAAU;AA3O9B;AA4OU,YAAM,eAAc,0BAAU,cAAc,KAAK,MAA7B,mBAAgC;AACpD,YAAM,cAAc,cAAc;AAClC,UAAI,CAAC,aAAa;AAChB,aAAK,KAAK,4BAA4B,UAAU,KAAK,CAAC,4DAA4D;AAAA,MACpH;AACA,aAAO,EAAE,OAAO,QAAQ,YAAY;AAAA,IACtC,CAAC,IACD,qBAAU,WAAW,KAAK,EACvB,OAAO,CAAC,SAAS,KAAK,WAAW,KAAK,SAAS,SAAS,KAAK,MAAM,EACnE,OAAO,CAAC,SAAU,aAAa,KAAK,WAAW,aAAa,IAAK,EACjE,IAAI,CAAC,UAAU,EAAE,OAAO,KAAK,OAAO,QAAQ,KAAK,OAAQ,EAAE;AAClE,QAAI,eAAe,WAAW,GAAG;AAC/B,WAAK,KAAK,8DAA8D;AAAA,IAC1E;AACA,UAAM,UAAU,WAAW,WACvB,MAAM,QAAQ;AAAA,MACZ,eAAe,IAAI,OAAO,UAAU;AAAA,QAClC,OAAO,KAAK;AAAA,QACZ,QAAQ,MAAM,UAAU,KAAK,OAAO,gBAAgB,KAAK,MAAM,CAAC;AAAA,MAClE,EAAE;AAAA,IACJ,IACA,MAAM,QAAQ;AAAA,MACZ,eAAe,IAAI,OAAO,SAAS;AACjC,cAAM,gBAAgB,MAAM,UAAU,KAAK,OAAO,gBAAgB,KAAK,MAAM,CAAC;AAC9E,YAAI,cAAc,eAAe,GAAG;AAClC,cAAI;AACF,kBAAM,cAAc,KAAK,OAAO,gBAAgB,KAAK,MAAM,CAAC;AAC5D,kBAAM,gBAAgB,MAAM,UAAU,KAAK,OAAO,gBAAgB,KAAK,MAAM,CAAC;AAC9E,mBAAO,EAAE,OAAO,KAAK,OAAO,SAAS,eAAe,UAAU,KAAK;AAAA,UACrE,SAAS,OAAY;AACnB,mBAAO;AAAA,cACL,OAAO,KAAK;AAAA,cACZ,SAAS;AAAA,cACT,UAAU;AAAA,cACV,QAAO,+BAAO,YAAW,OAAO,KAAK;AAAA,YACvC;AAAA,UACF;AAAA,QACF;AACA,eAAO,EAAE,OAAO,KAAK,OAAO,SAAS,eAAe,UAAU,MAAM;AAAA,MACtE,CAAC;AAAA,IACH;AACJ,QAAI,KAAK,MAAM;AACb,WAAK,iBAAiB,SAAS,MAAM,IAAI,OAAO;AAChD;AAAA,IACF;AACA,SAAK,UAAU,OAAO;AAAA,EACxB;AAEA,QAAM,yBAAyB,OAAO,MAAgB,WAA4C;AAChG,UAAM,OAAO,SAAS,MAAM;AAAA,MAC1B,QAAQ,CAAC,SAAS,cAAc,QAAQ;AAAA,MACxC,SAAS,CAAC,QAAQ,MAAM;AAAA,IAC1B,CAAC;AACD,UAAM,QAAQ,KAAK,SAAS,MAAM;AAClC,QAAI,KAAK,MAAM;AACb,cAAQ,IAAI,KAAK;AACjB;AAAA,IACF;AACA,UAAM,SAAS,KAAK,qBAAqB,IAAI;AAC7C,UAAM,KAAK,qBAAqB;AAChC,UAAM,SAAS,MAAM,sBAAsB,MAAM,OAAO,MAAM,IAAI;AAClE,UAAM,aAAa,KAAK,kBAAkB,MAAM;AAChD,UAAM,UAAU,WAAW,QACvB;AAAA,MACE,GAAI,MAAM,qBAAU,UAAU,QAAQ,EAAE,eAAe,cAAc,OAAU,CAAC;AAAA,MAChF,SAAS,qBAAU,WAAW;AAAA,IAChC,IACA;AAAA,MACE,GAAI,MAAM,qBAAU,aAAa,MAAM;AAAA,MACvC,SAAS,qBAAU,WAAW;AAAA,IAChC;AACJ,QAAI,KAAK,MAAM;AACb,WAAK,iBAAiB,SAAS,MAAM,IAAI,KAAK,WAAW,OAAO,GAAG,EAAE,OAAO,CAAC;AAC7E;AAAA,IACF;AACA,SAAK,UAAU,KAAK,WAAW,OAAO,CAAC;AAAA,EACzC;AAEA,QAAM,6BAA6B,OAAO,MAAgB,WAAgD;AACxG,UAAM,OAAO,SAAS,MAAM;AAAA,MAC1B,QAAQ,CAAC,OAAO;AAAA,MAChB,SAAS,CAAC,QAAQ,MAAM;AAAA,IAC1B,CAAC;AACD,UAAM,QAAQ,KAAK,SAAS,MAAM;AAClC,QAAI,KAAK,MAAM;AACb,cAAQ,IAAI,KAAK;AACjB;AAAA,IACF;AACA,UAAM,QAAQ,KAAK,gBAAgB,MAAM,OAAO;AAChD,QAAI,CAAC,OAAO;AACV,WAAK,cAAc,6BAA6B,KAAK;AAAA,IACvD;AACA,UAAM,KAAK,qBAAqB;AAChC,UAAM,UAAU;AAAA,MACd,SAAS,MAAM,qBAAU,gBAAgB,OAAO,WAAW,QAAQ;AAAA,MACnE,SAAS,qBAAU,WAAW;AAAA,IAChC;AACA,QAAI,KAAK,MAAM;AACb,WAAK,iBAAiB,SAAS,MAAM,IAAI,KAAK,WAAW,OAAO,CAAC;AACjE;AAAA,IACF;AACA,SAAK,UAAU,KAAK,WAAW,OAAO,CAAC;AAAA,EACzC;AAEA,QAAM,kBAA8B,OAAO,SAAS;AAClD,UAAM,OAAO,SAAS,MAAM;AAAA,MAC1B,SAAS,CAAC,QAAQ,MAAM;AAAA,IAC1B,CAAC;AACD,UAAM,QAAQ,KAAK,SAAS,MAAM;AAClC,QAAI,KAAK,MAAM;AACb,cAAQ,IAAI,KAAK;AACjB;AAAA,IACF;AACA,UAAM,KAAK,qBAAqB;AAChC,UAAM,aAAa,uBAAuB;AAC1C,QAAI,KAAK,MAAM;AACb,WAAK,iBAAiB,cAAc,UAAU;AAC9C;AAAA,IACF;AACA,UAAM,OAAO,cAAc,OAAO,eAAe,WAAY,aAA4B,CAAC;AAC1F,YAAQ,IAAI,UAAU;AACtB,SAAK,UAAU,KAAK,WAAW,CAAC,CAAC;AACjC,YAAQ,IAAI,UAAU;AACtB,2BAAuB,MAAM,QAAQ,KAAK,KAAK,IAAI,KAAK,QAAQ,CAAC,CAAC;AAAA,EACpE;AAEA,QAAM,+BAA+B,OACnC,MACA,WACkB;AAClB,UAAM,OAAO,SAAS,MAAM;AAAA,MAC1B,SAAS,CAAC,QAAQ,MAAM;AAAA,IAC1B,CAAC;AACD,UAAM,QAAQ,KAAK,SAAS,MAAM;AAClC,QAAI,KAAK,MAAM;AACb,cAAQ,IAAI,KAAK;AACjB;AAAA,IACF;AACA,UAAM,KAAK,qBAAqB;AAChC,UAAM,UAAU,WAAW,eACvB;AAAA,MACE,GAAI,MAAM,qBAAU,eAAe;AAAA,MACnC,SAAS,qBAAU,WAAW;AAAA,IAChC,KACC,MAAM,qBAAU,eAAe,GAAG;AAAA,MACjC,UAAU;AAAA,MACV,SAAS,qBAAU,WAAW;AAAA,MAC9B,OAAO,uBAAuB,EAAE;AAAA,IAClC;AACJ,QAAI,KAAK,MAAM;AACb,WAAK,iBAAiB,SAAS,MAAM,IAAI,KAAK,WAAW,OAAO,CAAC;AACjE;AAAA,IACF;AACA,SAAK,UAAU,KAAK,WAAW,OAAO,CAAC;AAAA,EACzC;AAEA,SAAO;AAAA,IACL;AAAA,MACE,MAAM;AAAA,MACN,aAAa;AAAA,MACb,WAAW;AAAA,MACX,SAAS,CAAC,KAAK,YAAY,KAAK,UAAU;AAAA,MAC1C,SAAS;AAAA,IACX;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,aAAa;AAAA,MACb,WAAW;AAAA,MACX,SAAS;AAAA,QACP;AAAA,QACA;AAAA,QACA;AAAA,QACA,KAAK;AAAA,QACL,KAAK;AAAA,MACP;AAAA,MACA,SAAS;AAAA,IACX;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,aAAa;AAAA,MACb,WAAW;AAAA,MACX,SAAS;AAAA,QACP;AAAA,QACA;AAAA,QACA;AAAA,QACA,KAAK;AAAA,QACL,KAAK;AAAA,MACP;AAAA,MACA,SAAS,OAAO,SAAS,2BAA2B,MAAM,QAAQ;AAAA,IACpE;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,aAAa;AAAA,MACb,WAAW;AAAA,MACX,SAAS;AAAA,QACP;AAAA,QACA;AAAA,QACA;AAAA,QACA,KAAK;AAAA,QACL,KAAK;AAAA,MACP;AAAA,MACA,SAAS,OAAO,SAAS,2BAA2B,MAAM,SAAS;AAAA,IACrE;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,aAAa;AAAA,MACb,WAAW;AAAA,MACX,SAAS;AAAA,QACP;AAAA,QACA;AAAA,QACA;AAAA,QACA,KAAK;AAAA,QACL,KAAK;AAAA,MACP;AAAA,MACA,SAAS,OAAO,SAAS,uBAAuB,MAAM,KAAK;AAAA,IAC7D;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,aAAa;AAAA,MACb,WAAW;AAAA,MACX,SAAS;AAAA,QACP;AAAA,QACA;AAAA,QACA,KAAK;AAAA,QACL,KAAK;AAAA,MACP;AAAA,MACA,SAAS,OAAO,SAAS,uBAAuB,MAAM,QAAQ;AAAA,IAChE;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,aAAa;AAAA,MACb,WAAW;AAAA,MACX,SAAS,CAAC,uDAAuD,KAAK,YAAY,KAAK,UAAU;AAAA,MACjG,SAAS,OAAO,SAAS,2BAA2B,MAAM,QAAQ;AAAA,IACpE;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,aAAa;AAAA,MACb,WAAW;AAAA,MACX,SAAS,CAAC,uDAAuD,KAAK,YAAY,KAAK,UAAU;AAAA,MACjG,SAAS,OAAO,SAAS,2BAA2B,MAAM,SAAS;AAAA,IACrE;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,aAAa;AAAA,MACb,WAAW;AAAA,MACX,SAAS,CAAC,KAAK,YAAY,KAAK,UAAU;AAAA,MAC1C,SAAS;AAAA,IACX;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,aAAa;AAAA,MACb,WAAW;AAAA,MACX,SAAS,CAAC,KAAK,YAAY,KAAK,UAAU;AAAA,MAC1C,SAAS,OAAO,SAAS,6BAA6B,MAAM,YAAY;AAAA,IAC1E;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,aAAa;AAAA,MACb,WAAW;AAAA,MACX,SAAS,CAAC,KAAK,YAAY,KAAK,UAAU;AAAA,MAC1C,SAAS,OAAO,SAAS,6BAA6B,MAAM,aAAa;AAAA,IAC3E;AAAA,EACF;AACF;;;ACpfA,OAAOC,eAAc;AAqCrB,SAAS,oBAAoB,OAA2B,MAA8D;AACpH,MAAI,CAAC,MAAO,QAAO;AACnB,MAAI,UAAU,WAAW,UAAU,QAAS,QAAO;AACnD,OAAK,KAAK,mBAAmB,KAAK,uBAAuB;AAC3D;AAEA,SAAS,0BACP,OACA,MACoB;AACpB,MAAI,CAAC,MAAO,QAAO;AACnB,MAAI,UAAU,SAAS,UAAU,WAAY,QAAO;AACpD,OAAK,KAAK,8BAA8B,KAAK,wBAAwB;AACvE;AAEA,SAAS,0BACP,MACA,KACA,MACoB;AACpB,QAAM,MAAM,KAAK,gBAAgB,MAAM,GAAG;AAC1C,MAAI,CAAC,IAAK,QAAO;AACjB,QAAM,SAAS,OAAO,GAAG;AACzB,MAAI,CAAC,OAAO,SAAS,MAAM,KAAK,UAAU,GAAG;AAC3C,SAAK,KAAK,aAAa,GAAG,KAAK,GAAG,EAAE;AAAA,EACtC;AACA,SAAO;AACT;AAEA,IAAM,mBAA2C;AAAA,EAC/C,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AACN;AAEA,SAAS,eAAe,QAAwB;AAC9C,SAAO,iBAAiB,MAAM,KAAK;AACrC;AAEA,SAAS,kBAAkB,OAAwB;AACjD,MAAI,OAAO,UAAU,YAAY,CAAC,OAAO,SAAS,KAAK,KAAK,SAAS,EAAG,QAAO;AAC/E,SAAO,GAAG,KAAK,KAAK,IAAI,KAAK,QAAQ,GAAI,EAAE,YAAY,CAAC;AAC1D;AAEA,SAAS,gBAAgB,SAAkB,MAAsD;AAC/F,QAAM,aAAa,KAAK,WAAW,OAAO;AAC1C,MAAI,CAAC,cAAc,OAAO,eAAe,SAAU,QAAO;AAC1D,QAAM,MAAM;AACZ,MAAI,OAAO,IAAI,YAAY,YAAY,IAAI,QAAQ,WAAW,EAAG,QAAO;AACxE,SAAO;AAAA,IACL,SAAS,IAAI;AAAA,IACb,MAAM,OAAO,IAAI,SAAS,WAAW,IAAI,OAAO;AAAA,IAChD,QAAQ,OAAO,IAAI,WAAW,WAAW,IAAI,SAAS;AAAA,IACtD,WAAW,OAAO,IAAI,cAAc,YAAY,IAAI,cAAc,OAAQ,IAAI,YAA8B;AAAA,IAC5G,SAAS,OAAO,IAAI,YAAY,WAAW,IAAI,UAAU;AAAA,IACzD,MAAM,IAAI;AAAA,EACZ;AACF;AAEA,SAAS,cAAc,MAAgB,MAA0C;AAC/E,UAAQ,IAAI,YAAY,KAAK,OAAO,EAAE;AACtC,MAAI,KAAK,KAAM,SAAQ,IAAI,SAAS,KAAK,IAAI,EAAE;AAC/C,MAAI,OAAO,KAAK,WAAW,UAAU;AACnC,YAAQ,IAAI,WAAW,KAAK,MAAM,KAAK,eAAe,KAAK,MAAM,CAAC,GAAG;AAAA,EACvE;AACA,MAAI,KAAK,UAAW,SAAQ,IAAI,cAAc,KAAK,SAAS,EAAE;AAC9D,MAAI,OAAO,KAAK,YAAY,UAAU;AACpC,YAAQ,IAAI,YAAY,kBAAkB,KAAK,OAAO,CAAC,EAAE;AAAA,EAC3D;AACA,MAAI,KAAK,QAAQ,MAAM;AACrB,YAAQ,IAAI,OAAO;AACnB,SAAK,UAAU,KAAK,IAAI;AAAA,EAC1B;AACF;AAEO,SAAS,2BAA2B,MAOzC;AACA,QAAM,sBAAsB,OAAO,SAAkC;AACnE,UAAM,OAAOC,UAAS,MAAM;AAAA,MAC1B,SAAS,CAAC,QAAQ,MAAM;AAAA,IAC1B,CAAC;AAED,QAAI,KAAK,MAAM;AACb,cAAQ,IAAI,KAAK,mBAAmB,CAAC;AACrC;AAAA,IACF;AAEA,UAAM,KAAK,qBAAqB;AAChC,UAAM,UAAU,MAAM,sBAAsB;AAC5C,UAAM,SAAS,QAAQ,KAAK,IAAI;AAEhC,QAAI,QAAQ;AACV,WAAK,iBAAiB,kBAAkB,OAAO;AAC/C;AAAA,IACF;AAEA,QAAI,QAAQ,WAAW,GAAG;AACxB,cAAQ,IAAI,2DAA2D;AACvE;AAAA,IACF;AAEA,YAAQ,IAAI,aAAa,QAAQ,MAAM,YAAY;AACnD,YAAQ,IAAI,EAAE;AACd,YAAQ,IAAI,4DAAkE;AAC9E,eAAW,KAAK,SAAS;AACvB,YAAM,OAAO,EAAE,eAAe,SAAS,IAAI,EAAE,eAAe,KAAK,GAAG,IAAI;AACxE,YAAM,MAAM,EAAE,QAAQ,EAAE,MAAM,MAAM,GAAG,EAAE,IAAI;AAC7C,cAAQ,IAAI,GAAG,EAAE,KAAK,IAAK,EAAE,MAAM,IAAK,EAAE,WAAW,KAAO,EAAE,WAAW,KAAO,IAAI,IAAK,GAAG,EAAE;AAAA,IAChG;AAAA,EACF;AAEA,QAAM,mBAAmB,OAAO,SAAkC;AAChE,UAAM,OAAOA,UAAS,MAAM;AAAA,MAC1B,QAAQ,CAAC,UAAU,OAAO;AAAA,MAC1B,SAAS,CAAC,QAAQ,QAAQ,SAAS;AAAA,IACrC,CAAC;AAED,QAAI,KAAK,MAAM;AACb,cAAQ,IAAI,KAAK,gBAAgB,CAAC;AAClC;AAAA,IACF;AAEA,UAAM,SAAS,KAAK,qBAAqB,IAAI;AAC7C,UAAM,eAAe,KAAK,kBAAkB,MAAM;AAClD,UAAM,QAAQ,KAAK,gBAAgB,MAAM,OAAO;AAChD,UAAM,KAAK,qBAAqB;AAChC,UAAM,OAAO,QAAQ,UAAU,KAAK,KAAK;AACzC,UAAM,SAAS,MAAM,cAAc,MAAM,gBAAgB,MAAM;AAC/D,UAAM,aAAsB,EAAE,QAAQ,QAAQ,MAAM,OAAO,KAAK;AAEhE,QAAI,KAAK,MAAM;AACb,WAAK,iBAAiB,eAAe,YAAY,EAAE,QAAQ,UAAU,KAAK,CAAC;AAC3E;AAAA,IACF;AAEA,UAAM,OACJ,cAAc,OAAO,eAAe,YAAY,MAAM,QAAS,WAA0B,IAAI,IACvF,WAA0B,OAC5B,CAAC;AAEP,QAAI,KAAK,WAAW,GAAG;AACrB,WAAK,KAAK,gCAAgC,KAAK,UAAU,UAAU,CAAC,EAAE;AAAA,IACxE;AAEA,QAAI,KAAK,SAAS;AAChB,cAAQ,IAAI,2BAA8B;AAC1C,iBAAW,QAAQ,MAAM;AACvB,YAAI,CAAC,QAAQ,OAAO,SAAS,SAAU;AACvC,cAAM,QAAQ;AACd,cAAM,KAAK,OAAO,MAAM,OAAO,WAAW,MAAM,KAAK;AACrD,YAAI,CAAC,GAAI;AACT,cAAM,YAAY,OAAO,MAAM,eAAe,WAAW,MAAM,aAAa;AAC5E,cAAM,cAAc,OAAO,MAAM,gBAAgB,WAAW,MAAM,cAAc;AAChF,cAAM,eAAe,MAAM,QAAQ,MAAM,YAAY,IACjD,MAAM,aAAa,OAAO,CAAC,QAAuB,OAAO,QAAQ,QAAQ,EAAE,KAAK,GAAG,IACnF;AACJ,gBAAQ,IAAI,GAAG,EAAE,SAAU,SAAS,SAAU,WAAW,iBAAkB,YAAY,EAAE;AAAA,MAC3F;AACA;AAAA,IACF;AAEA,eAAW,QAAQ,MAAM;AACvB,UAAI,CAAC,QAAQ,OAAO,SAAS,SAAU;AACvC,YAAM,KAAM,KAAoB;AAChC,UAAI,OAAO,OAAO,YAAY,GAAG,SAAS,GAAG;AAC3C,gBAAQ,IAAI,EAAE;AAAA,MAChB;AAAA,IACF;AAAA,EACF;AAEA,QAAM,gBAAgB,OAAO,SAAkC;AAC7D,UAAM,OAAOA,UAAS,MAAM;AAAA,MAC1B,QAAQ,CAAC,SAAS,UAAU,WAAW,QAAQ,iBAAiB;AAAA,MAChE,SAAS,CAAC,QAAQ,MAAM;AAAA,IAC1B,CAAC;AACD,QAAI,KAAK,MAAM;AACb,cAAQ,IAAI,KAAK,aAAa,CAAC;AAC/B;AAAA,IACF;AACA,UAAM,SAAS,KAAK,gBAAgB,MAAM,SAAS;AACnD,QAAI,CAAC,OAAQ,MAAK,KAAK;AAAA;AAAA,EAAkC,KAAK,aAAa,CAAC,EAAE;AAC9E,UAAM,OAAO,oBAAoB,KAAK,gBAAgB,MAAM,MAAM,GAAG,IAAI;AACzE,UAAM,iBAAiB,0BAA0B,KAAK,gBAAgB,MAAM,iBAAiB,GAAG,IAAI;AACpG,UAAM,QAAQ,KAAK,gBAAgB,MAAM,OAAO;AAChD,UAAM,SAAS,KAAK,qBAAqB,IAAI;AAC7C,UAAM,SAAS,QAAQ,KAAK,IAAI;AAChC,UAAM,OAAO,MAAM,KAAK,uBAAuB,OAAO,MAAM;AAC5D,UAAM,aAAsB,MAAM;AAAA,MAChC;AAAA,MACA,KAAK;AAAA,MACL,gBAAgB,KAAK,MAAM;AAAA,MAC3B;AAAA,QACE;AAAA,QACA;AAAA,MACF;AAAA,IACF;AACA,UAAM,WAAW,gBAAgB,YAAY,IAAI;AACjD,QAAI,CAAC,UAAU;AACb,UAAI,QAAQ;AACV,aAAK,iBAAiB,YAAY,KAAK,WAAW,UAAU,CAAC;AAAA,MAC/D,OAAO;AACL,aAAK,UAAU,KAAK,WAAW,UAAU,CAAC;AAAA,MAC5C;AACA;AAAA,IACF;AACA,QAAI,OAAQ,MAAK,iBAAiB,YAAY,QAAQ;AAAA,QACjD,eAAc,UAAU,IAAI;AAAA,EACnC;AAEA,QAAM,iBAAiB,OAAO,SAAkC;AAC9D,UAAM,OAAOA,UAAS,MAAM;AAAA,MAC1B,QAAQ;AAAA,QACN;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,MACA,SAAS,CAAC,QAAQ,MAAM;AAAA,IAC1B,CAAC;AACD,QAAI,KAAK,MAAM;AACb,cAAQ,IAAI,KAAK,cAAc,CAAC;AAChC;AAAA,IACF;AACA,UAAM,SAAS,KAAK,gBAAgB,MAAM,SAAS;AACnD,QAAI,CAAC,OAAQ,MAAK,KAAK;AAAA;AAAA,EAAkC,KAAK,cAAc,CAAC,EAAE;AAC/E,UAAM,QAAQ,KAAK,gBAAgB,MAAM,OAAO;AAChD,UAAM,SAAS,KAAK,qBAAqB,IAAI;AAC7C,UAAM,SAAS,QAAQ,KAAK,IAAI;AAChC,UAAM,OAAmB,CAAC;AAC1B,UAAM,OAAO,oBAAoB,KAAK,gBAAgB,MAAM,MAAM,GAAG,IAAI;AACzE,UAAM,iBAAiB,0BAA0B,KAAK,gBAAgB,MAAM,iBAAiB,GAAG,IAAI;AACpG,QAAI,KAAM,MAAK,OAAO;AACtB,SAAK,kBAAkB;AACvB,UAAM,qBAAqB,0BAA0B,MAAM,wBAAwB,IAAI;AACvF,QAAI,uBAAuB,OAAW,MAAK,uBAAuB;AAClE,UAAM,iBAAiB,0BAA0B,MAAM,oBAAoB,IAAI;AAC/E,QAAI,mBAAmB,OAAW,MAAK,mBAAmB;AAE1D,UAAM,OAAO,MAAM,KAAK,uBAAuB,OAAO,MAAM;AAC5D,UAAM,aAAsB,MAAM;AAAA,MAChC;AAAA,MACA,KAAK;AAAA,MACL,gBAAgB,KAAK,MAAM;AAAA,MAC3B;AAAA,QACE;AAAA,QACA;AAAA,QACA,oBAAoB,OAAO,KAAK,yBAAyB,WAAW,KAAK,uBAAuB;AAAA,QAChG,gBAAgB,OAAO,KAAK,qBAAqB,WAAW,KAAK,mBAAmB;AAAA,MACtF;AAAA,IACF;AAEA,UAAM,WAAW,gBAAgB,YAAY,IAAI;AACjD,QAAI,CAAC,UAAU;AACb,UAAI,QAAQ;AACV,aAAK,iBAAiB,aAAa,KAAK,WAAW,UAAU,CAAC;AAAA,MAChE,OAAO;AACL,aAAK,UAAU,KAAK,WAAW,UAAU,CAAC;AAAA,MAC5C;AACA;AAAA,IACF;AACA,QAAI,OAAQ,MAAK,iBAAiB,aAAa,QAAQ;AAAA,QAClD,eAAc,UAAU,IAAI;AAAA,EACnC;AAEA,QAAM,iBAAiB,OAAO,SAAkC;AAC9D,UAAM,OAAOA,UAAS,MAAM;AAAA,MAC1B,QAAQ,CAAC,SAAS,UAAU,QAAQ,OAAO;AAAA,MAC3C,SAAS,CAAC,QAAQ,MAAM;AAAA,IAC1B,CAAC;AAED,QAAI,KAAK,MAAM;AACb,cAAQ,IAAI,KAAK,cAAc,CAAC;AAChC;AAAA,IACF;AAEA,UAAM,QAAQ,KAAK,gBAAgB,MAAM,OAAO;AAChD,UAAM,SAAS,KAAK,qBAAqB,IAAI;AAC7C,UAAM,OAAO,KAAK,gBAAgB,MAAM,MAAM;AAC9C,UAAM,WAAW,KAAK,gBAAgB,MAAM,OAAO;AACnD,UAAM,QAAQ,WAAW,OAAO,QAAQ,IAAI;AAC5C,UAAM,SAAS,QAAQ,KAAK,IAAI;AAEhC,QAAI,QAAQ,SAAS,WAAW,SAAS,WAAW,SAAS,OAAO;AAClE,WAAK,KAAK,mBAAmB,IAAI,6BAA6B;AAAA,IAChE;AAEA,UAAM,OAAO,MAAM,KAAK,uBAAuB,OAAO,MAAM;AAC5D,UAAM,SAAS,MAAM;AAAA,MACnB,KAAK;AAAA,MACL,gBAAgB,KAAK,MAAM;AAAA,MAC3B;AAAA,QACE,OAAO,OAAO,SAAS,KAAK,KAAK,QAAQ,IAAI,QAAQ;AAAA,QACrD;AAAA,MACF;AAAA,IACF;AAEA,QAAI,QAAQ;AACV,WAAK,iBAAiB,aAAa;AAAA,QACjC,UAAU,OAAO;AAAA,QACjB,aAAa,OAAO;AAAA,QACpB,OAAO,OAAO,MAAM;AAAA,QACpB,OAAO,OAAO;AAAA,MAChB,CAAC;AACD;AAAA,IACF;AAEA,YAAQ,IAAI,UAAU,OAAO,MAAM,MAAM,SAAS,OAAO,UAAU,sBAAsB,EAAE;AAAA,CAAI;AAC/F,eAAW,QAAQ,OAAO,OAAO;AAC/B,YAAM,YAAY,KAAK,SAAS,IAAI,QAAQ;AAC5C,YAAM,cAAc,KAAK,WAAW,OAAO,KAAK,WAAW,KAAK,SAAS,KAAK,WAAW,KAAK,SAAS;AACvG,YAAM,OAAO,KAAK,cAAc,IAC5B,IAAI,KAAK,KAAK,cAAc,GAAI,EAAE,eAAe,IACjD;AACJ,YAAM,aAAa,KAAK,aAAa,KAAK,eAAe;AACzD,YAAM,cAAc,KAAK,OAAO,SAAS,KAAK,KAAK,OAAO,MAAM,GAAG,EAAE,IAAI,QAAQ,KAAK;AACtF,cAAQ,IAAI,GAAG,KAAK,EAAE,KAAK,SAAS,KAAK,YAAY,OAAO,CAAC,CAAC,KAAK,IAAI,KAAK,WAAW,OAAO,EAAE,CAAC,KAAK,WAAW,EAAE;AACnH,UAAI,KAAK,UAAU;AACjB,gBAAQ,IAAI,YAAY,KAAK,QAAQ,EAAE;AAAA,MACzC;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,eAAe,CAAC,SAAS;AACvB,YAAM,aAAa,gBAAgB,MAAM,IAAI;AAC7C,UAAI,CAAC,YAAY;AACf,aAAK,UAAU,IAAI;AACnB;AAAA,MACF;AACA,oBAAc,YAAY,IAAI;AAAA,IAChC;AAAA,EACF;AACF;;;AChYA,SAAS,aAAaC,oBAAmB;AACzC,SAAS,UAAAC,SAAQ,OAAO,YAAAC,WAAU,iBAAiB;AACnD,OAAOC,WAAU;AAEjB,OAAOC,eAAc;;;ACJrB,OAAOC,WAAU;AAIV,IAAM,6BAA6B,MAAM,KAAK,EAAE,QAAQ,EAAE,GAAG,CAAC,GAAG,MAAM,cAAc,IAAI,CAAC,EAAE;AAC5F,IAAM,6BAA6B,MAAM,KAAK,EAAE,QAAQ,EAAE,GAAG,CAAC,GAAG,MAAM,cAAc,IAAI,CAAC,EAAE;AAEnG,IAAM,wBAAwC;AAAA,EAC5C;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEA,IAAM,8BAA8B,oBAAI,IAAI,CAAC,6BAA6B,gCAAgC,CAAC;AAoCpG,SAAS,kBAAkB,MAAc,OAAe,MAA+B;AAC5F,QAAM,aAAa,KAAK,gBAAgB,MAAM,MAAM,KAAK;AACzD,MAAI,CAAC,sBAAsB,SAAS,UAA0B,GAAG;AAC/D,SAAK;AAAA,MACH,mBAAmB,UAAU;AAAA,MAC7B;AAAA,IACF;AAAA,EACF;AACA,SAAO;AACT;AAEO,SAAS,sBAAsB,MAAc,OAAe,MAAiC;AAClG,QAAM,sBAAsB,KAAK,aAAa,KAAK,YAAY,CAAC;AAChE,QAAM,sBAAsB,KAAK,aAAa,KAAK,YAAY,CAAC;AAChE,QAAM,qBAAqB,2BACxB,IAAI,CAAC,KAAK,OAAO,EAAE,MAAM,IAAI,GAAG,OAAO,KAAK,gBAAgB,MAAM,GAAG,EAAE,EAAE,EACzE,OAAO,CAAC,SAAkD,QAAQ,KAAK,KAAK,CAAC;AAChF,QAAM,qBAAqB,2BACxB,IAAI,CAAC,KAAK,OAAO,EAAE,MAAM,IAAI,GAAG,OAAO,KAAK,gBAAgB,MAAM,GAAG,EAAE,EAAE,EACzE,OAAO,CAAC,SAAkD,QAAQ,KAAK,KAAK,CAAC;AAEhF,MAAI,oBAAoB,SAAS,KAAK,mBAAmB,SAAS,GAAG;AACnE,SAAK;AAAA,MACH;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACA,MAAI,oBAAoB,SAAS,KAAK,mBAAmB,SAAS,GAAG;AACnE,SAAK;AAAA,MACH;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,kBAAkB,oBAAoB,SAAS,mBAAmB;AAAA,IAClE,kBAAkB,oBAAoB,SAAS,mBAAmB;AAAA,EACpE;AACF;AAEO,SAAS,0BACd,SACA,OACA,MACA,OACA,MACM;AACN,MAAI,YAAY,oBAAoB,CAAC,4BAA4B,IAAI,KAAK,GAAG;AAC3E,SAAK;AAAA,MACH,8GAA8G,KAAK;AAAA,MACnH;AAAA,IACF;AAAA,EACF;AAEA,MAAI,YAAY,iBAAiB;AAC/B,QAAI,KAAK,mBAAmB,KAAK,mBAAmB,GAAG;AACrD,WAAK,cAAc,2EAA2E,KAAK;AAAA,IACrG;AACA;AAAA,EACF;AACA,MAAI,YAAY,kBAAkB;AAChC,QAAI,KAAK,mBAAmB,GAAG;AAC7B,WAAK,cAAc,qDAAqD,KAAK;AAAA,IAC/E;AACA,QAAI,KAAK,qBAAqB,GAAG;AAC/B,WAAK,cAAc,gEAAgE,KAAK;AAAA,IAC1F;AACA;AAAA,EACF;AACA,MAAI,YAAY,qBAAqB;AACnC,QAAI,KAAK,mBAAmB,GAAG;AAC7B,WAAK,cAAc,wDAAwD,KAAK;AAAA,IAClF;AACA,QAAI,KAAK,qBAAqB,GAAG;AAC/B,WAAK,cAAc,oEAAoE,KAAK;AAAA,IAC9F;AACA,QAAI,KAAK,mBAAmB,GAAG;AAC7B,WAAK,cAAc,2DAA2D,KAAK;AAAA,IACrF;AACA;AAAA,EACF;AAEA,MAAI,KAAK,mBAAmB,KAAK,qBAAqB,GAAG;AACvD,SAAK,cAAc,iFAAiF,KAAK;AAAA,EAC3G;AACA,MAAI,KAAK,mBAAmB,GAAG;AAC7B,SAAK,cAAc,mDAAmD,KAAK;AAAA,EAC7E;AACA,MAAI,KAAK,mBAAmB,GAAG;AAC7B,SAAK,cAAc,mDAAmD,KAAK;AAAA,EAC7E;AACF;AAEA,eAAsB,6BACpB,SACA,MACA,MACkC;AAClC,QAAM,UAAmC;AAAA,IACvC,WAAW,CAAC;AAAA,IACZ,OAAO,CAAC;AAAA,IACR,aAAa,EAAE,MAAM,CAAC,EAAE;AAAA,EAC1B;AAEA,QAAM,gBAAgB,OACpB,WACA,OACA,cACkB;AAClB,QAAI,KAAK,UAAU,KAAK,GAAG;AACzB,UAAI,YAAY,kBAAkB;AAChC,gBAAQ,YAAY,KAAK,SAAS,IAAI;AAAA,MACxC,WAAW,cAAc,SAAS;AAChC,gBAAQ,UAAU,KAAK,KAAK;AAAA,MAC9B,OAAO;AACL,aAAK,KAAK,QAAQ,OAAO,oCAAoC;AAAA,MAC/D;AACA;AAAA,IACF;AAEA,UAAM,WAAWA,MAAK,QAAQ,KAAK;AACnC,QAAI,CAAE,MAAM,KAAK,WAAW,QAAQ,GAAI;AACtC,WAAK,KAAK,4BAA4B,SAAS,KAAK,QAAQ,EAAE;AAAA,IAChE;AACA,YAAQ,MAAM,SAAS,IAAI;AAAA,MACzB,UAAU;AAAA,MACV,kBAAkBA,MAAK,SAAS,QAAQ;AAAA,IAC1C;AAAA,EACF;AAEA,MAAI,YAAY,kBAAkB;AAChC,aAAS,IAAI,GAAG,IAAI,KAAK,oBAAoB,QAAQ,KAAK,GAAG;AAC3D,YAAM,cAAc,cAAc,IAAI,CAAC,IAAI,KAAK,oBAAoB,CAAC,GAAG,OAAO;AAAA,IACjF;AACA,aAAS,IAAI,GAAG,IAAI,KAAK,oBAAoB,QAAQ,KAAK,GAAG;AAC3D,YAAM,cAAc,cAAc,IAAI,CAAC,IAAI,KAAK,oBAAoB,CAAC,GAAG,OAAO;AAAA,IACjF;AACA,eAAW,QAAQ,KAAK,oBAAoB;AAC1C,YAAM,cAAc,cAAc,KAAK,IAAI,IAAI,KAAK,OAAO,OAAO;AAAA,IACpE;AACA,eAAW,QAAQ,KAAK,oBAAoB;AAC1C,YAAM,cAAc,cAAc,KAAK,IAAI,IAAI,KAAK,OAAO,OAAO;AAAA,IACpE;AACA,WAAO;AAAA,EACT;AAEA,QAAM,cACJ,KAAK,oBAAoB,SAAS,IAC9B,KAAK,sBACL,KAAK,mBAAmB,KAAK,CAAC,GAAG,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,KAAK,KAAK;AACtF,WAAS,IAAI,GAAG,IAAI,YAAY,QAAQ,KAAK,GAAG;AAC9C,UAAM,cAAc,cAAc,IAAI,CAAC,IAAI,YAAY,CAAC,GAAG,OAAO;AAAA,EACpE;AACA,SAAO;AACT;;;ADrKA,SAAS,aAAa,QAA4B,OAAe,MAAuC;AACtG,MAAI,CAAC,QAAQ;AACX,SAAK,KAAK;AAAA;AAAA,EAAiC,KAAK,EAAE;AAAA,EACpD;AACA,SAAO;AACT;AAEA,SAAS,UAAU,OAAwB;AACzC,SAAO,gBAAgB,KAAK,KAAK;AACnC;AAEA,eAAeC,YAAW,UAAoC;AAC5D,MAAI;AACF,UAAMC,QAAO,UAAUC,aAAY,IAAI;AACvC,WAAO;AAAA,EACT,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,SAAS,qBAAqB,aAA2C;AACvE,MAAI,CAAC,YAAa,QAAO;AACzB,MAAI,YAAY,SAAS,YAAY,EAAG,QAAO;AAC/C,MAAI,YAAY,SAAS,WAAW,EAAG,QAAO;AAC9C,MAAI,YAAY,SAAS,YAAY,EAAG,QAAO;AAC/C,MAAI,YAAY,SAAS,WAAW,EAAG,QAAO;AAC9C,SAAO;AACT;AAEA,SAAS,4BAA4B,SAAgC;AACnE,MAAI;AACF,UAAM,WAAW,IAAI,IAAI,OAAO,EAAE,SAAS,YAAY;AACvD,QAAI,SAAS,SAAS,MAAM,KAAK,SAAS,SAAS,OAAO,EAAG,QAAO;AACpE,QAAI,SAAS,SAAS,MAAM,EAAG,QAAO;AACtC,QAAI,SAAS,SAAS,OAAO,EAAG,QAAO;AACvC,QAAI,SAAS,SAAS,MAAM,EAAG,QAAO;AAAA,EACxC,QAAQ;AACN,WAAO;AAAA,EACT;AACA,SAAO;AACT;AAEA,SAAS,+BAA+B,QAA+B;AACrE,MAAI,OAAO,UAAU,GAAG;AACtB,QACE,OAAO,CAAC,MAAM,OACd,OAAO,CAAC,MAAM,MACd,OAAO,CAAC,MAAM,MACd,OAAO,CAAC,MAAM,MACd,OAAO,CAAC,MAAM,MACd,OAAO,CAAC,MAAM,MACd,OAAO,CAAC,MAAM,MACd,OAAO,CAAC,MAAM,GACd,QAAO;AAAA,EACX;AACA,MAAI,OAAO,UAAU,GAAG;AACtB,QAAI,OAAO,CAAC,MAAM,OAAQ,OAAO,CAAC,MAAM,OAAQ,OAAO,CAAC,MAAM,IAAM,QAAO;AAAA,EAC7E;AACA,MAAI,OAAO,UAAU,IAAI;AACvB,QACE,OAAO,SAAS,SAAS,GAAG,CAAC,MAAM,UACnC,OAAO,SAAS,SAAS,GAAG,EAAE,MAAM,OACpC,QAAO;AAAA,EACX;AACA,MAAI,OAAO,UAAU,GAAG;AACtB,UAAM,MAAM,OAAO,SAAS,SAAS,GAAG,CAAC;AACzC,QAAI,QAAQ,YAAY,QAAQ,SAAU,QAAO;AAAA,EACnD;AACA,SAAO;AACT;AAEA,SAAS,qBAAqB,aAA4B,SAAyB;AACjF,MAAI,2CAAa,SAAS,aAAc,QAAO;AAC/C,MAAI,2CAAa,SAAS,cAAe,QAAO;AAChD,QAAM,WAAW,IAAI,IAAI,OAAO,EAAE,SAAS,YAAY;AACvD,MAAI,SAAS,SAAS,MAAM,EAAG,QAAO;AACtC,MAAI,SAAS,SAAS,OAAO,EAAG,QAAO;AACvC,MAAI,SAAS,SAAS,MAAM,EAAG,QAAO;AACtC,SAAO;AACT;AAEA,SAASC,2BACP,MACA,KACA,MACoB;AACpB,QAAM,MAAM,KAAK,gBAAgB,MAAM,GAAG;AAC1C,MAAI,CAAC,IAAK,QAAO;AACjB,QAAM,SAAS,OAAO,GAAG;AACzB,MAAI,CAAC,OAAO,SAAS,MAAM,KAAK,UAAU,GAAG;AAC3C,SAAK,KAAK,aAAa,GAAG,KAAK,GAAG,EAAE;AAAA,EACtC;AACA,SAAO;AACT;AAEA,SAAS,uBACP,MACA,MACA,MACA,kBAAkB,MACT;AACT,QAAM,OAAO,QAAQ,KAAK,IAAI;AAC9B,MAAI,gBAAiB,MAAK,OAAO;AACjC,QAAM,qBAAqBA,2BAA0B,MAAM,wBAAwB,IAAI;AACvF,MAAI,uBAAuB,OAAW,MAAK,uBAAuB;AAClE,QAAM,iBAAiBA,2BAA0B,MAAM,oBAAoB,IAAI;AAC/E,MAAI,mBAAmB,OAAW,MAAK,mBAAmB;AAC1D,SAAO;AACT;AAEA,eAAe,eAAe,KAAa,MAAwF;AACjI,QAAM,WAAW,MAAM,MAAM,GAAG;AAChC,MAAI,CAAC,SAAS,IAAI;AAChB,SAAK,KAAK,oBAAoB,SAAS,MAAM,MAAM,GAAG,EAAE;AAAA,EAC1D;AACA,SAAO;AAAA,IACL,QAAQ,OAAO,KAAK,MAAM,SAAS,YAAY,CAAC;AAAA,IAChD,aAAa,SAAS,QAAQ,IAAI,cAAc;AAAA,EAClD;AACF;AAEA,eAAe,eACb,MACA,WACA,QACA,MACmB;AACnB,QAAM,MAAMC,MAAK,QAAQ,SAAS;AAClC,QAAM,MAAM,KAAK,EAAE,WAAW,KAAK,CAAC;AACpC,QAAM,aAAY,oBAAI,KAAK,GAAE,YAAY,EAAE,QAAQ,YAAY,EAAE;AACjE,QAAM,QAAkB,CAAC;AAEzB,WAAS,IAAI,GAAG,IAAI,KAAK,QAAQ,KAAK,GAAG;AACvC,UAAM,WAAW,KAAK,CAAC;AACvB,UAAM,EAAE,QAAQ,YAAY,IAAI,MAAM,eAAe,UAAU,IAAI;AACnE,UAAM,MACJ,qBAAqB,WAAW,KAChC,+BAA+B,MAAM,KACrC,4BAA4B,QAAQ,KACpC;AACF,UAAM,WAAW,GAAG,MAAM,IAAI,SAAS,IAAI,OAAO,IAAI,CAAC,EAAE,SAAS,GAAG,GAAG,CAAC,IAAI,GAAG;AAChF,UAAM,WAAWA,MAAK,KAAK,KAAK,QAAQ;AACxC,UAAM,UAAU,UAAU,MAAM;AAChC,UAAM,KAAK,QAAQ;AAAA,EACrB;AAEA,SAAO;AACT;AAEO,SAAS,2BAA2B,MAKzC;AACA,QAAM,sBAAsB,OAAO,SAAkC;AACnE,UAAM,OAAOC,UAAS,MAAM;AAAA,MAC1B,QAAQ;AAAA,QACN;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,MACA,SAAS,CAAC,QAAQ,qBAAqB,QAAQ,MAAM;AAAA,MACrD,SAAS,EAAE,MAAM,KAAK;AAAA,IACxB,CAAC;AAED,QAAI,KAAK,MAAM;AACb,cAAQ,IAAI,KAAK,mBAAmB,CAAC;AACrC;AAAA,IACF;AAEA,UAAM,QAAQ,KAAK,gBAAgB,MAAM,OAAO;AAChD,UAAM,SAAS,KAAK,qBAAqB,IAAI;AAC7C,UAAM,SAAS,aAAa,KAAK,gBAAgB,MAAM,QAAQ,GAAG,KAAK,mBAAmB,GAAG,IAAI;AACjG,UAAM,YAAY,KAAK,gBAAgB,MAAM,YAAY,KAAK;AAE9D,UAAM,OAAmB;AAAA,MACvB;AAAA,MACA,OAAO,KAAK,gBAAgB,MAAM,OAAO,KAAK;AAAA,MAC9C,OAAO,KAAK,gBAAgB,MAAM,OAAO,KAAK;AAAA,MAC9C,YAAY,KAAK,gBAAgB,MAAM,YAAY,KAAK;AAAA,IAC1D;AAEA,UAAM,iBAAiB,KAAK,gBAAgB,MAAM,iBAAiB;AACnE,QAAI,eAAgB,MAAK,kBAAkB;AAC3C,QAAI,KAAK,mBAAmB,EAAG,MAAK,oBAAoB;AACxD,UAAM,OAAO,uBAAuB,MAAM,MAAM,IAAI;AACpD,UAAM,SAAS,QAAQ,KAAK,IAAI;AAEhC,UAAM,oBAAoB,KAAK,gBAAgB,MAAM,iBAAiB;AACtE,QAAI,mBAAmB;AACrB,YAAM,SAAS,OAAO,iBAAiB;AACvC,UAAI,CAAC,OAAO,SAAS,MAAM,GAAG;AAC5B,aAAK,KAAK,8BAA8B,iBAAiB,EAAE;AAAA,MAC7D;AACA,WAAK,kBAAkB;AAAA,IACzB;AAEA,UAAM,OAAO,MAAM,KAAK;AAAA,MACtB;AAAA,MACA;AAAA,MACA,OAAO,KAAK,SAAS,YAAY;AAAA,MACjC;AAAA,IACF;AACA,UAAM,SAAS,MAAM;AAAA,MACnB,OAAO,KAAK,SAAS,YAAY;AAAA,MACjC,OAAO,MAAM;AAAA,MACb;AAAA,QACE,OAAO,OAAO,KAAK,SAAS,KAAK;AAAA,QACjC,YAAY,OAAO,KAAK,cAAc,IAAI;AAAA,QAC1C,gBAAgB,OAAO,KAAK,oBAAoB,WAAW,KAAK,kBAAkB;AAAA,QAClF,gBAAgB,OAAO,KAAK,oBAAoB,WAAW,KAAK,kBAAkB;AAAA,QAClF,kBAAkB,QAAQ,KAAK,iBAAiB;AAAA,QAChD;AAAA,QACA,oBAAoB,OAAO,KAAK,yBAAyB,WAAW,KAAK,uBAAuB;AAAA,QAChG,gBAAgB,OAAO,KAAK,qBAAqB,WAAW,KAAK,mBAAmB;AAAA,MACtF;AAAA,MACA,KAAK;AAAA,MACL,gBAAgB,KAAK,MAAM;AAAA,IAC7B;AACA,QAAI,CAAC,MAAM,QAAQ,MAAM,GAAG;AAC1B,UAAI,OAAQ,MAAK,iBAAiB,kBAAkB,QAAQ,EAAE,KAAK,CAAC;AAAA,UAC/D,MAAK,cAAc,MAAM;AAC9B;AAAA,IACF;AACA,UAAM,OAAiB;AACvB,QAAI,KAAK,WAAW,EAAG,MAAK,KAAK,iCAAiC;AAElE,UAAM,aAAa,MAAM,eAAe,MAAM,WAAW,yBAAyB,IAAI;AACtF,QAAI,QAAQ;AACV,WAAK;AAAA,QACH;AAAA,QACA,EAAE,MAAM,KAAK,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,GAAG,OAAO,WAAW;AAAA,QACxD,EAAE,KAAK;AAAA,MACT;AAAA,IACF,OAAO;AACL,WAAK,qBAAqB,SAAS,UAAU;AAAA,IAC/C;AAAA,EACF;AAEA,QAAM,kBAAkB,OAAO,SAAkC;AAC/D,UAAM,OAAOA,UAAS,MAAM;AAAA,MAC1B,QAAQ;AAAA,QACN;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,MACA,SAAS,CAAC,QAAQ,qBAAqB,QAAQ,MAAM;AAAA,MACrD,SAAS,EAAE,MAAM,KAAK;AAAA,IACxB,CAAC;AAED,QAAI,KAAK,MAAM;AACb,cAAQ,IAAI,KAAK,eAAe,CAAC;AACjC;AAAA,IACF;AAEA,UAAM,QAAQ,KAAK,gBAAgB,MAAM,OAAO;AAChD,UAAM,SAAS,KAAK,qBAAqB,IAAI;AAC7C,UAAM,SAAS,aAAa,KAAK,gBAAgB,MAAM,QAAQ,GAAG,KAAK,eAAe,GAAG,IAAI;AAC7F,UAAM,UAAU,KAAK,aAAa,KAAK,KAAK;AAC5C,QAAI,QAAQ,WAAW,EAAG,MAAK,cAAc,6BAA6B,KAAK,eAAe,CAAC;AAC/F,QAAI,QAAQ,SAAS,GAAI,MAAK,KAAK,iDAAiD;AAEpF,UAAM,YAAY,KAAK,gBAAgB,MAAM,YAAY,KAAK;AAC9D,UAAM,QAAQ,KAAK,gBAAgB,MAAM,OAAO,KAAK;AACrD,UAAM,QAAQ,KAAK,gBAAgB,MAAM,OAAO,KAAK;AACrD,UAAM,aAAa,KAAK,gBAAgB,MAAM,YAAY,KAAK;AAC/D,UAAM,iBAAiB,KAAK,gBAAgB,MAAM,iBAAiB;AACnE,UAAM,oBAAoB,KAAK,gBAAgB,MAAM,iBAAiB;AACtE,UAAM,mBAAmB,QAAQ,KAAK,mBAAmB,CAAC;AAC1D,UAAM,OAAO,QAAQ,KAAK,IAAI;AAC9B,UAAM,SAAS,QAAQ,KAAK,IAAI;AAEhC,UAAM,UAAU,QAAQ,MAAM,SAAS;AACvC,UAAM,WAAW,QAAQ,MAAM,CAAC,SAAS,CAAC,UAAU,IAAI,CAAC;AACzD,QAAI,CAAC,WAAW,CAAC,UAAU;AACzB,WAAK,KAAK,yEAAyE;AAAA,IACrF;AAEA,UAAM,OAAO,MAAM,KAAK,6BAA6B,OAAO,QAAQ,OAAO,OAAO;AAClF,UAAM,SAAiC,CAAC;AACxC,QAAI,SAAS;AACX,aAAO,KAAK,GAAG,OAAO;AAAA,IACxB,OAAO;AACL,iBAAW,UAAU,SAAS;AAC5B,cAAM,YAAYD,MAAK,QAAQ,MAAM;AACrC,YAAI,CAAE,MAAMJ,YAAW,SAAS,EAAI,MAAK,KAAK,yBAAyB,SAAS,EAAE;AAClF,eAAO,KAAK,MAAMM,UAAS,SAAS,CAAC;AAAA,MACvC;AAAA,IACF;AACA,UAAM,iBAAiB,oBAAoB,OAAO,iBAAiB,IAAI;AACvE,QAAI,qBAAqB,CAAC,OAAO,SAAS,cAAc,GAAG;AACzD,WAAK,KAAK,8BAA8B,iBAAiB,EAAE;AAAA,IAC7D;AAEA,UAAM,SAAS,MAAM;AAAA,MACnB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,QACE;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,oBAAoBH,2BAA0B,MAAM,wBAAwB,IAAI;AAAA,QAChF,gBAAgBA,2BAA0B,MAAM,oBAAoB,IAAI;AAAA,MAC1E;AAAA,MACA,KAAK;AAAA,MACL,gBAAgB,KAAK,MAAM;AAAA,IAC7B;AACA,QAAI,CAAC,MAAM,QAAQ,MAAM,GAAG;AAC1B,UAAI,OAAQ,MAAK,iBAAiB,cAAc,QAAQ,EAAE,KAAK,CAAC;AAAA,UAC3D,MAAK,cAAc,MAAM;AAC9B;AAAA,IACF;AACA,UAAM,OAAiB;AACvB,QAAI,KAAK,WAAW,EAAG,MAAK,KAAK,iCAAiC;AAElE,UAAM,aAAa,MAAM,eAAe,MAAM,WAAW,qBAAqB,IAAI;AAClF,QAAI,QAAQ;AACV,WAAK;AAAA,QACH;AAAA,QACA,EAAE,MAAM,KAAK,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,GAAG,OAAO,WAAW;AAAA,QACxD,EAAE,KAAK;AAAA,MACT;AAAA,IACF,OAAO;AACL,WAAK,qBAAqB,SAAS,UAAU;AAAA,IAC/C;AAAA,EACF;AAEA,QAAM,sBAAsB,OAAO,SAAkC;AACnE,UAAM,QAAQ,KAAK,mBAAmB;AACtC,UAAM,OAAOE,UAAS,MAAM;AAAA,MAC1B,QAAQ;AAAA,QACN;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,GAAG;AAAA,QACH,GAAG;AAAA,QACH;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,MACA,SAAS,CAAC,QAAQ,QAAQ,MAAM;AAAA,MAChC,SAAS,EAAE,MAAM,KAAK;AAAA,IACxB,CAAC;AAED,QAAI,KAAK,MAAM;AACb,cAAQ,IAAI,KAAK;AACjB;AAAA,IACF;AAEA,UAAM,QAAQ,KAAK,gBAAgB,MAAM,OAAO;AAChD,UAAM,SAAS,KAAK,qBAAqB,IAAI;AAC7C,UAAM,SAAS,aAAa,KAAK,gBAAgB,MAAM,QAAQ,GAAG,OAAO,IAAI;AAC7E,UAAM,UAAU,kBAAkB,MAAM,OAAO;AAAA,MAC7C,iBAAiB,KAAK;AAAA,MACtB,cAAc,KAAK;AAAA,MACnB,eAAe,KAAK;AAAA,IACtB,CAAC;AACD,UAAM,YAAY,sBAAsB,MAAM,OAAO;AAAA,MACnD,iBAAiB,KAAK;AAAA,MACtB,cAAc,KAAK;AAAA,MACnB,eAAe,KAAK;AAAA,IACtB,CAAC;AAED,UAAM,YAAY,KAAK,gBAAgB,MAAM,YAAY,KAAK;AAC9D,UAAM,QAAQ,KAAK,gBAAgB,MAAM,OAAO,MAC1C,YAAY,mBAAmB,mCAAmC;AACxE,8BAA0B,SAAS,OAAO,WAAW,OAAO,EAAE,eAAe,KAAK,cAAc,CAAC;AACjG,UAAM,eAAe,YAAY,mBAAmB,mBAAmB;AACvE,UAAM,QAAQ,KAAK,gBAAgB,MAAM,OAAO,KAAK;AACrD,UAAM,aAAa,KAAK,gBAAgB,MAAM,YAAY,KAAK;AAC/D,UAAM,cAAc,KAAK,gBAAgB,MAAM,UAAU,KAAK;AAC9D,UAAM,WAAW,OAAO,WAAW;AACnC,QAAI,CAAC,OAAO,SAAS,QAAQ,KAAK,YAAY,KAAK,CAAC,OAAO,UAAU,QAAQ,GAAG;AAC9E,WAAK,KAAK,uBAAuB,WAAW,qCAAqC;AAAA,IACnF;AACA,UAAM,OAAO,QAAQ,KAAK,IAAI;AAC9B,UAAM,SAAS,QAAQ,KAAK,IAAI;AAChC,UAAM,yBAAyB,YAAY,mBAAmB,CAAC,gBAAgB,IAAI,CAAC;AACpF,UAAM,OAAO,MAAM,KAAK,6BAA6B,OAAO,QAAQ,OAAO,SAAS,sBAAsB;AAC1G,UAAM,eAAe,MAAM,6BAA6B,SAAS,WAAW;AAAA,MAC1E;AAAA,MACA,YAAAL;AAAA,MACA,MAAM,KAAK;AAAA,IACb,CAAC;AAED,UAAM,SAAS,MAAM;AAAA,MACnB;AAAA,MACA;AAAA,MACA;AAAA,QACE;AAAA,QACA;AAAA,QACA;AAAA,QACA,WAAW,aAAa;AAAA,QACxB,OAAO,aAAa;AAAA,QACpB,aAAa,aAAa;AAAA,QAC1B;AAAA,QACA;AAAA,QACA,oBAAoBG,2BAA0B,MAAM,wBAAwB,IAAI;AAAA,QAChF,gBAAgBA,2BAA0B,MAAM,oBAAoB,IAAI;AAAA,MAC1E;AAAA,MACA,KAAK;AAAA,MACL,gBAAgB,KAAK,MAAM;AAAA,IAC7B;AAEA,QAAI,OAAO,WAAW,UAAU;AAC9B,UAAI,OAAQ,MAAK,iBAAiB,kBAAkB,QAAQ,EAAE,MAAM,MAAM,QAAQ,CAAC;AAAA,UAC9E,MAAK,cAAc,MAAM;AAC9B;AAAA,IACF;AACA,UAAM,WAAmB;AAEzB,UAAM,EAAE,QAAQ,YAAY,IAAI,MAAM,eAAe,UAAU,IAAI;AACnE,UAAM,MAAMC,MAAK,QAAQ,SAAS;AAClC,UAAM,MAAM,KAAK,EAAE,WAAW,KAAK,CAAC;AACpC,UAAM,aAAY,oBAAI,KAAK,GAAE,YAAY,EAAE,QAAQ,YAAY,EAAE;AACjE,UAAM,MAAM,qBAAqB,aAAa,QAAQ;AACtD,UAAM,WAAWA,MAAK,KAAK,KAAK,yBAAyB,SAAS,IAAI,GAAG,EAAE;AAC3E,UAAM,UAAU,UAAU,MAAM;AAEhC,QAAI,QAAQ;AACV,WAAK;AAAA,QACH;AAAA,QACA,EAAE,MAAM,CAAC,EAAE,KAAK,SAAS,CAAC,GAAG,OAAO,CAAC,QAAQ,EAAE;AAAA,QAC/C,EAAE,MAAM,MAAM,QAAQ;AAAA,MACxB;AAAA,IACF,OAAO;AACL,WAAK,qBAAqB,SAAS,CAAC,QAAQ,CAAC;AAAA,IAC/C;AAAA,EACF;AAEA,QAAM,qBAAqB,OAAO,SAAkC;AAClE,UAAM,OAAOC,UAAS,MAAM;AAAA,MAC1B,QAAQ;AAAA,QACN;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,MACA,SAAS,CAAC,QAAQ,QAAQ,MAAM;AAAA,MAChC,SAAS,EAAE,MAAM,KAAK;AAAA,IACxB,CAAC;AAED,QAAI,KAAK,MAAM;AACb,cAAQ,IAAI,KAAK,kBAAkB,CAAC;AACpC;AAAA,IACF;AAEA,UAAM,QAAQ,KAAK,gBAAgB,MAAM,OAAO;AAChD,UAAM,SAAS,KAAK,qBAAqB,IAAI;AAC7C,UAAM,cAAc,KAAK,gBAAgB,MAAM,OAAO;AACtD,QAAI,CAAC,YAAa,MAAK,cAAc,6BAA6B,KAAK,kBAAkB,CAAC;AAE1F,UAAM,YAAY,KAAK,gBAAgB,MAAM,YAAY,KAAK;AAC9D,UAAM,QAAQ,KAAK,gBAAgB,MAAM,OAAO,KAAK;AACrD,UAAM,aAAa,KAAK,gBAAgB,MAAM,YAAY,KAAK;AAC/D,UAAM,OAAO,QAAQ,KAAK,IAAI;AAC9B,UAAM,SAAS,QAAQ,KAAK,IAAI;AAEhC,UAAM,OAAO,MAAM,KAAK,6BAA6B,OAAO,QAAQ,OAAO,OAAO;AAElF,QAAI;AACJ,QAAI,UAAU,WAAW,GAAG;AAC1B,cAAQ;AAAA,IACV,OAAO;AACL,YAAM,YAAYD,MAAK,QAAQ,WAAW;AAC1C,UAAI,CAAE,MAAMJ,YAAW,SAAS,EAAI,MAAK,KAAK,yBAAyB,SAAS,EAAE;AAClF,cAAQ,MAAMM,UAAS,SAAS;AAAA,IAClC;AAEA,UAAM,SAAS,MAAM;AAAA,MACnB;AAAA,MACA;AAAA,MACA;AAAA,QACE;AAAA,QACA;AAAA,QACA,oBAAoBH,2BAA0B,MAAM,wBAAwB,IAAI;AAAA,QAChF,gBAAgBA,2BAA0B,MAAM,oBAAoB,IAAI;AAAA,MAC1E;AAAA,MACA,KAAK;AAAA,MACL,gBAAgB,KAAK,MAAM;AAAA,IAC7B;AAEA,QAAI,CAAC,MAAM,QAAQ,MAAM,GAAG;AAC1B,UAAI,OAAQ,MAAK,iBAAiB,iBAAiB,QAAQ,EAAE,KAAK,CAAC;AAAA,UAC9D,MAAK,cAAc,MAAM;AAC9B;AAAA,IACF;AACA,UAAM,OAAiB;AACvB,QAAI,KAAK,WAAW,EAAG,MAAK,KAAK,iCAAiC;AAElE,UAAM,aAAa,MAAM,eAAe,MAAM,WAAW,wBAAwB,IAAI;AACrF,QAAI,QAAQ;AACV,WAAK;AAAA,QACH;AAAA,QACA,EAAE,MAAM,KAAK,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,GAAG,OAAO,WAAW;AAAA,QACxD,EAAE,MAAM,WAAW;AAAA,MACrB;AAAA,IACF,OAAO;AACL,WAAK,qBAAqB,SAAS,UAAU;AAAA,IAC/C;AAAA,EACF;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;;;AExkBA,SAAS,UAAU,aAAa;AAChC,SAAS,kBAAkB;AAC3B,OAAOI,WAAU;AACjB,OAAO,QAAQ;AAEf,OAAOC,eAAc;AAqBrB,IAAM,eAAeC,MAAK,KAAK,WAAW,MAAM,MAAM,WAAW,wBAAwB;AASlF,SAAS,0BAA0B,MAAoD;AAC5F,SAAO,OAAO,SAAkC;AAC9C,UAAM,OAAOC,UAAS,MAAM;AAAA,MAC1B,QAAQ,CAAC,UAAU,aAAa,YAAY;AAAA,MAC5C,SAAS,CAAC,QAAQ,YAAY,MAAM;AAAA,IACtC,CAAC;AAED,QAAI,KAAK,MAAM;AACb,cAAQ,IAAI,WAAW,CAAC;AACxB;AAAA,IACF;AAEA,UAAM,SAAS,KAAK,qBAAqB,IAAI;AAC7C,UAAM,eAAe,KAAK,kBAAkB,MAAM;AAClD,UAAM,SAAS,QAAQ,KAAK,IAAI;AAChC,UAAM,YAAY,KAAK,gBAAgB,MAAM,WAAW;AACxD,UAAM,YAAY,KAAK,gBAAgB,MAAM,YAAY,KAAK;AAC9D,UAAM,WAAW,QAAQ,KAAK,QAAQ;AAGtC,QAAI,WAAW;AACb,YAAM,iBAAiB,WAAW,gBAAgB,MAAM,MAAM,MAAM;AACpE;AAAA,IACF;AAGA,UAAM,oBAAoB,MAAM,eAAe,WAAW,QAAQ;AAClE,QAAI,mBAAmB;AACrB,YAAM,iBAAiB,mBAAmB,gBAAgB,MAAM,MAAM,MAAM;AAC5E;AAAA,IACF;AAGA,YAAQ,IAAI,EAAE;AACd,YAAQ,IAAI,mEAAmE;AAC/E,YAAQ,IAAI,sBAAsB;AAClC,YAAQ,IAAI,yDAAyD;AACrE,YAAQ,IAAI,wDAAwD;AACpE,YAAQ,IAAI,EAAE;AACd,YAAQ,IAAI,iEAAiE;AAC7E,YAAQ,IAAI,EAAE;AACd,YAAQ,IAAI,yDAAyD;AAAA,EACvE;AACF;AAEA,eAAe,eAAe,WAAmB,UAA2C;AAE1F,QAAM,cAAc,gBAAgB;AACpC,MAAI,CAAC,aAAa;AAChB,WAAO;AAAA,EACT;AAEA,UAAQ,IAAI,wCAAwC,SAAS,MAAM;AACnE,UAAQ,IAAI,+CAA+C;AAE3D,MAAI;AACF,UAAM,UAAU,CAAC,aAAa,gBAAgB,SAAS;AACvD,QAAI,SAAU,SAAQ,KAAK,YAAY;AAEvC,UAAM,SAAS,MAAM,gBAAgB,OAAO;AAC5C,UAAM,SAAS,OAAO,OAAO,KAAK;AAGlC,UAAM,QAAQ,OAAO,MAAM,oBAAoB;AAC/C,QAAI,OAAO;AACT,aAAO,MAAM,CAAC;AAAA,IAChB;AAEA,YAAQ,IAAI,2DAA2D;AACvE,WAAO;AAAA,EACT,SAAS,OAAY;AACnB,YAAQ,IAAI,sBAAsB,MAAM,OAAO,EAAE;AACjD,WAAO;AAAA,EACT;AACF;AAEA,SAAS,kBAAiC;AAExC,MAAI,WAAW,YAAY,GAAG;AAC5B,WAAO;AAAA,EACT;AAGA,QAAM,aAAa;AAAA,IACjBC,MAAK,KAAK,QAAQ,IAAI,GAAG,iBAAiB;AAAA,IAC1CA,MAAK,KAAK,GAAG,QAAQ,GAAG,kBAAkB;AAAA,EAC5C;AAGA,MAAI;AACF,UAAM,cAAc,SAAS,gDAAgD,EAAE,UAAU,QAAQ,CAAC,EAAE,KAAK;AACzG,QAAI,YAAa,QAAO;AAAA,EAC1B,QAAQ;AAAA,EAER;AAEA,aAAW,aAAa,YAAY;AAClC,QAAI,WAAW,SAAS,EAAG,QAAO;AAAA,EACpC;AAEA,SAAO;AACT;AAEA,SAAS,gBAAgB,MAA6D;AACpF,SAAO,IAAI,QAAQ,CAAC,SAAS,WAAW;AA3I1C;AA4II,UAAM,YAAY,QAAQ,aAAa,UAAU,WAAW;AAC5D,UAAM,OAAO,MAAM,WAAW,MAAM;AAAA,MAClC,OAAO,CAAC,UAAU,QAAQ,MAAM;AAAA,MAChC,KAAK,EAAE,GAAG,QAAQ,IAAI;AAAA,IACxB,CAAC;AAED,QAAI,SAAS;AACb,QAAI,SAAS;AAEb,eAAK,WAAL,mBAAa,GAAG,QAAQ,CAAC,SAAiB;AACxC,gBAAU,KAAK,SAAS;AAExB,YAAM,QAAQ,KAAK,SAAS,EAAE,MAAM,IAAI,EAAE,OAAO,OAAO;AACxD,iBAAW,QAAQ,OAAO;AACxB,gBAAQ,IAAI,IAAI;AAAA,MAClB;AAAA,IACF;AAEA,eAAK,WAAL,mBAAa,GAAG,QAAQ,CAAC,SAAiB;AACxC,gBAAU,KAAK,SAAS;AAAA,IAC1B;AAEA,SAAK,GAAG,SAAS,CAAC,SAAS;AACzB,UAAI,SAAS,GAAG;AACd,gBAAQ,EAAE,QAAQ,OAAO,CAAC;AAAA,MAC5B,OAAO;AACL,eAAO,IAAI,MAAM,iCAAiC,IAAI,KAAK,OAAO,MAAM,IAAI,CAAC,EAAE,CAAC;AAAA,MAClF;AAAA,IACF,CAAC;AAED,SAAK,GAAG,SAAS,CAAC,UAAU;AAC1B,aAAO,IAAI,MAAM,+BAA+B,MAAM,OAAO,EAAE,CAAC;AAAA,IAClE,CAAC;AAAA,EACH,CAAC;AACH;AAEA,eAAe,iBACb,WACA,QACA,MACA,QACe;AACf,QAAM,KAAK,qBAAqB;AAEhC,QAAM,EAAE,OAAO,MAAM,IAAI,MAAM,qBAAU,UAAU,CAAC,SAAS,GAAG,EAAE,eAAe,OAAO,CAAC;AAEzF,MAAI,QAAQ,GAAG;AACb,UAAM,SAAS,UAAU,SAAS,KAC9B,GAAG,UAAU,MAAM,GAAG,CAAC,CAAC,MAAM,UAAU,MAAM,EAAE,CAAC,KACjD;AAGJ,QAAI,aAAa;AACjB,QAAI;AACF,YAAM,EAAE,YAAY,IAAI,MAAM,UAAU,WAAW,gBAAgB,MAAM,CAAC;AAC1E,mBAAa,cAAc,WAAW;AAAA,IACxC,QAAQ;AACN,mBAAa;AAAA,IACf;AAEA,QAAI,QAAQ;AACV,WAAK,iBAAiB,SAAS;AAAA,QAC7B,OAAO;AAAA,QACP;AAAA,QACA,OAAO;AAAA,QACP;AAAA,QACA,aAAa,WAAW,KAAK;AAAA,MAC/B,CAAC;AAAA,IACH,OAAO;AACL,cAAQ,IAAI;AAAA,kBAAqB;AACjC,cAAQ,IAAI,YAAY,MAAM,EAAE;AAChC,cAAQ,IAAI,aAAa,MAAM,GAAG,UAAU,EAAE;AAC9C,cAAQ,IAAI,gBAAgB,KAAK,WAAW;AAAA,IAC9C;AAAA,EACF,OAAO;AACL,QAAI,QAAQ;AACV,WAAK,iBAAiB,SAAS;AAAA,QAC7B,OAAO;AAAA,QACP;AAAA,QACA,QAAQ;AAAA,MACV,CAAC;AAAA,IACH,OAAO;AACL,cAAQ,IAAI,4CAA4C,KAAK,WAAW;AAAA,IAC1E;AAAA,EACF;AACF;AAEA,SAAS,aAAqB;AAC5B,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,EAAE,KAAK,IAAI;AACb;;;ALhOA,IAAM,cAAc;AACpB,IAAM,cAAc;AAEpB,SAAS,eACP,WACA,SACA,UACQ;AACR,QAAM,QAAQ;AAAA,IACZ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,GAAG;AAAA,EACL;AACA,MAAI,YAAY,SAAS,SAAS,GAAG;AACnC,eAAW,WAAW,UAAU;AAC9B,YAAM,KAAK,IAAI,QAAQ,OAAO,GAAG,QAAQ,KAAK;AAAA,IAChD;AAAA,EACF;AACA,SAAO,MAAM,KAAK,IAAI;AACxB;AAEA,SAAS,YAAoB;AAC3B,QAAM,eAAe,qBAAqB;AAAA,IACxC,CAAC,UAAU,KAAK,MAAM,KAAK,OAAO,EAAE,CAAC,GAAG,MAAM,WAAW;AAAA,EAC3D;AACA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,GAAG;AAAA,IACH;AAAA,IACA,GAAG;AAAA,EACL,EAAE,KAAK,IAAI;AACb;AAEA,SAAS,kBAA0B;AACjC,SAAO,eAAe,kCAAkC;AAAA,IACtD;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AACH;AAEA,SAAS,qBAA6B;AACpC,SAAO,eAAe,qCAAqC;AAAA,IACzD;AAAA,IACA;AAAA,EACF,GAAG;AAAA,IACD;AAAA,MACE,OAAO;AAAA,MACP,OAAO;AAAA,QACL;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAAA,EACF,CAAC;AACH;AAEA,SAAS,qBAAqB,MAAmC;AAC/D,QAAM,aAAa,0BAA0B,IAAI;AACjD,SAAO,eAAe,WAAW,WAAW,WAAW,SAAS,WAAW,QAAQ;AACrF;AAEA,SAAS,iBAAyB;AAChC,QAAM,kBAAkB,kBAAkB;AAAA,IACxC,CAAC,eAAe,KAAK,WAAW,KAAK,OAAO,EAAE,CAAC,GAAG,WAAW,WAAW;AAAA,EAC1E;AACA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,GAAG;AAAA,IACH;AAAA,IACA;AAAA,EACF,EAAE,KAAK,IAAI;AACb;AAEA,SAAS,qBAA6B;AACpC,SAAO,eAAe,qDAAqD;AAAA,IACzE;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AACH;AAEA,SAAS,iBAAyB;AAChC,SAAO;AAAA,IACL;AAAA,IACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACA;AAAA,IACA;AAAA,MACE;AAAA,QACE,OAAO;AAAA,QACP,OAAO,CAAC,uEAAuE;AAAA,MACjF;AAAA,IACF;AAAA,EACF;AACF;AAEA,SAAS,oBAA4B;AACnC,SAAO;AAAA,IACL;AAAA,IACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACA;AAAA,IACA;AAAA,MACE;AAAA,QACE,OAAO;AAAA,QACP,OAAO;AAAA,UACL;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;AAEA,SAAS,qBAA6B;AACpC,SAAO,eAAe,qDAAqD;AAAA,IACzE;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,GAAG;AAAA,IACD;AAAA,MACE,OAAO;AAAA,MACP,OAAO;AAAA,QACL;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAAA,IACA;AAAA,MACE,OAAO;AAAA,MACP,OAAO;AAAA,QACL;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAAA,EACF,CAAC;AACH;AAEA,SAAS,eAAuB;AAC9B,SAAO,eAAe,8CAA8C;AAAA,IAClE;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AACH;AAEA,SAAS,gBAAwB;AAC/B,SAAO,eAAe,+CAA+C;AAAA,IACnE;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AACH;AAEA,SAAS,gBAAwB;AAC/B,SAAO,eAAe,gCAAgC;AAAA,IACpD;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AACH;AAEA,SAAS,oBAAoB,SAAmC;AAC9D,MAAIC,SAAQ,IAAI,4BAA4B,QAAQ;AAClD,IAAAA,SAAQ,IAAI,yBAAyB;AACrC;AAAA,EACF;AACA,EAAAA,SAAQ,IAAI,yBAAyB;AACrC,iBAAO,OAAO,YAAY;AAC1B,iBAAO,OAAO,QAAQ;AACtB,iBAAO,OAAO,aAAa;AAC3B,iBAAO,OAAO,MAAM;AACpB,iBAAO,QAAQ,MAAM;AACrB,iBAAO,OAAO,MAAM;AACpB,iBAAO,QAAQ,MAAM;AACrB,UAAQ,OAAO,MAAM;AACrB,UAAQ,QAAQ,MAAM;AACtB,UAAQ,OAAO,MAAM;AACvB;AAEA,SAAS,KAAK,SAAwB;AACpC,QAAM,IAAI,MAAM,OAAO;AACzB;AAEA,SAAS,cAAc,QAAgB,OAAsB;AAC3D,OAAK,GAAG,MAAM;AAAA;AAAA,EAAO,KAAK,EAAE;AAC9B;AAEA,SAAS,gBAAgB,MAA+B,KAAiC;AACvF,QAAM,MAAM,KAAK,GAAG;AACpB,MAAI,OAAO,QAAQ,YAAY,IAAI,KAAK,EAAE,SAAS,EAAG,QAAO,IAAI,KAAK;AACtE,SAAO;AACT;AAEA,SAAS,qBAAqB,MAAuC;AACnE,SAAO,gBAAgB,MAAM,QAAQ,KAAK;AAC5C;AAEA,SAAS,aAAa,KAAwB;AAC5C,MAAI,OAAO,QAAQ,SAAU,QAAO,IAAI,MAAM,GAAG,EAAE,IAAI,CAAC,SAAS,KAAK,KAAK,CAAC,EAAE,OAAO,OAAO;AAC5F,MAAI,MAAM,QAAQ,GAAG,GAAG;AACtB,WAAO,IACJ,QAAQ,CAAC,SAAU,OAAO,SAAS,WAAW,KAAK,MAAM,GAAG,IAAI,CAAC,CAAE,EACnE,IAAI,CAAC,SAAS,KAAK,KAAK,CAAC,EACzB,OAAO,OAAO;AAAA,EACnB;AACA,SAAO,CAAC;AACV;AAEA,IAAI,iBAAiB;AACrB,eAAe,uBAAsC;AACnD,MAAI,eAAgB;AACpB,QAAM,qBAAU,KAAK;AACrB,mBAAiB;AACnB;AAEA,SAAS,kBAAkB,QAAoD;AAC7E,MAAI,CAAC,OAAQ,QAAO;AACpB,QAAM,SAAS,gBAAgB,MAAM;AACrC,MAAI,CAAC,OAAQ,MAAK,uCAAuC;AACzD,SAAO;AACT;AAEA,eAAe,6BACb,OACA,QACA,gBACA,UACA,yBAAmC,CAAC,GACY;AAChD,QAAM,qBAAqB;AAC3B,QAAM,YAAY,qBAAU,oBAAoB;AAAA,IAC9C,eAAe,QAAQ,UAAU,KAAK,KAAK;AAAA,IAC3C;AAAA,IACA;AAAA,IACA;AAAA,IACA,SAAS;AAAA,EACX,CAAC;AACD,MAAI,CAAC,UAAU,SAAS,CAAC,UAAU,QAAQ;AACzC,SAAK,UAAU,UAAU,mFAAmF;AAAA,EAC9G;AACA,SAAO,EAAE,OAAO,UAAU,OAAO,QAAQ,UAAU,OAAO;AAC5D;AAEA,eAAe,uBACb,OACA,QACgD;AAhWlD;AAiWE,QAAM,qBAAqB;AAC3B,QAAM,eAAe,kBAAkB,MAAM;AAE7C,MAAI,OAAO;AACT,UAAM,YAAW,0BAAU,cAAc,KAAK,MAA7B,mBAAgC;AACjD,UAAM,cAAc,gBAAgB;AACpC,QAAI,CAAC,aAAa;AAChB,WAAK,+FAA+F;AAAA,IACtG;AACA,WAAO,EAAE,OAAO,QAAQ,YAAY;AAAA,EACtC;AAEA,QAAM,aAAa,qBAChB,WAAW,KAAK,EAChB,OAAO,CAAC,SAAS,KAAK,WAAW,KAAK,SAAS,SAAS,KAAK,MAAM,EACnE,OAAO,CAAC,SAAU,eAAe,KAAK,WAAW,eAAe,IAAK;AACxE,MAAI,WAAW,WAAW,GAAG;AAC3B,SAAK,4FAA4F;AAAA,EACnG;AACA,SAAO,EAAE,OAAO,WAAW,CAAC,EAAE,OAAO,QAAQ,WAAW,CAAC,EAAE,OAAQ;AACrE;AAEA,SAAS,WAAW,SAA2B;AAC7C,MAAI,CAAC,WAAW,OAAO,YAAY,SAAU,QAAO;AACpD,QAAM,OAAO;AACb,MAAI,UAAU,SAAS,UAAU,QAAQ,aAAa,OAAO;AAC3D,WAAO,KAAK;AAAA,EACd;AACA,SAAO;AACT;AAEA,SAAS,UAAU,OAAsB;AACvC,UAAQ,IAAI,KAAK,UAAU,OAAO,MAAM,CAAC,CAAC;AAC5C;AAEA,SAAS,iBACP,SACA,MACA,MACM;AACN,QAAM,UAAsB;AAAA,IAC1B,QAAQ;AAAA,IACR;AAAA,IACA;AAAA,EACF;AACA,MAAI,QAAQ,OAAO,KAAK,IAAI,EAAE,SAAS,GAAG;AACxC,YAAQ,OAAO;AAAA,EACjB;AACA,YAAU,OAAO;AACnB;AAEA,SAAS,qBAAqB,MAAyB,OAAuB;AAC5E,QAAM,QAAQ,SAAS,UAAU,WAAW;AAC5C,UAAQ,IAAI,cAAc,MAAM,MAAM,IAAI,KAAK,GAAG;AAClD,aAAW,QAAQ,OAAO;AACxB,YAAQ,IAAI,KAAK,IAAI,EAAE;AAAA,EACzB;AACF;AAEA,SAAS,cAAc,OAAoC;AACzD,SAAO,UAAU,YAAY,UAAU,QAAQ,UAAU;AAC3D;AAEA,IAAM,oBAA0C,uBAAuB;AAAA,EACrE,UAAU,CAAC,SAAS,qBAAqB,IAAI;AAAA,EAC7C;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,YAAY;AAAA,EACZ,YAAY;AACd,CAAC;AAED,IAAM,gBAAgB,2BAA2B;AAAA,EAC/C;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAED,IAAM,gBAAgB,2BAA2B;AAAA,EAC/C;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,eAAe,CAAC,SAAS,cAAc,cAAc,IAAI;AAC3D,CAAC;AAED,IAAM,4BAA6E,OAAO;AAAA,EACxF,kBAAkB,IAAI,CAAC,eAAe,CAAC,WAAW,MAAM,UAAU,CAAC;AACrE;AAEA,SAAS,iBACP,aAC4B;AAC5B,SAAO,OAAO,YAAY,YAAY,IAAI,CAAC,SAAS,CAAC,KAAK,MAAM,KAAK,OAAO,CAAC,CAAC;AAChF;AAiBA,IAAM,gBAA+B;AAAA,EACnC;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,SAAS,0BAA0B;AAAA,MACjC;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,aAAa;AAAA,MACX,EAAE,MAAM,QAAQ,aAAa,yBAAyB,SAAS,cAAc,iBAAiB;AAAA,MAC9F,EAAE,MAAM,WAAW,aAAa,mDAAmD,SAAS,cAAc,oBAAoB;AAAA,IAChI;AAAA,IACA,OAAO;AAAA,EACT;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,aAAa;AAAA,MACX,EAAE,MAAM,YAAY,aAAa,4BAA4B,SAAS,cAAc,oBAAoB;AAAA,MACxG,EAAE,MAAM,QAAQ,aAAa,6BAA6B,SAAS,cAAc,gBAAgB;AAAA,MACjG,EAAE,MAAM,WAAW,aAAa,sCAAsC,SAAS,cAAc,mBAAmB;AAAA,IAClH;AAAA,IACA,OAAO;AAAA,EACT;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,aAAa;AAAA,MACX;AAAA,QACE,MAAM;AAAA,QACN,aAAa;AAAA,QACb,SAAS,cAAc;AAAA,MACzB;AAAA,IACF;AAAA,IACA,OAAO;AAAA,EACT;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,aAAa;AAAA,MACX,EAAE,MAAM,OAAO,aAAa,mBAAmB,SAAS,cAAc,cAAc;AAAA,MACpF,EAAE,MAAM,QAAQ,aAAa,8BAA8B,SAAS,cAAc,eAAe;AAAA,MACjG,EAAE,MAAM,QAAQ,aAAa,qBAAqB,SAAS,cAAc,eAAe;AAAA,IAC1F;AAAA,IACA,OAAO;AAAA,EACT;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,aAAa,kBAAkB,IAAI,CAAC,gBAAgB;AAAA,MAClD,MAAM,WAAW;AAAA,MACjB,aAAa,WAAW;AAAA,MACxB,SAAS,WAAW;AAAA,IACtB,EAAE;AAAA,IACF,OAAO;AAAA,IACP,eAAe;AAAA,EACjB;AACF;AAEA,IAAM,wBAAqD,OAAO;AAAA,EAChE,cAAc,IAAI,CAAC,SAAS,CAAC,KAAK,MAAM,IAAI,CAAC;AAC/C;AAEA,IAAM,uBAAqE,cAAc,QAAQ,CAAC,SAAS;AACzG,MAAI,KAAK,SAAS;AAChB,WAAO,CAAC,EAAE,MAAM,KAAK,MAAM,aAAa,KAAK,YAAY,CAAC;AAAA,EAC5D;AACA,MAAI,CAAC,KAAK,eAAe,KAAK,YAAY,WAAW,GAAG;AACtD,WAAO,CAAC,EAAE,MAAM,KAAK,MAAM,aAAa,KAAK,YAAY,CAAC;AAAA,EAC5D;AACA,MAAI,KAAK,eAAe;AACtB,WAAO,CAAC,EAAE,MAAM,GAAG,KAAK,IAAI,iBAAiB,aAAa,KAAK,YAAY,CAAC;AAAA,EAC9E;AACA,SAAO,KAAK,YAAY,IAAI,CAAC,gBAAgB;AAAA,IAC3C,MAAM,GAAG,KAAK,IAAI,IAAI,WAAW,IAAI;AAAA,IACrC,aAAa,WAAW;AAAA,EAC1B,EAAE;AACJ,CAAC;AAED,IAAM,uBAAiC;AAAA,EACrC;AAAA,EACA,GAAG,cACA,OAAO,CAAC,SAAS,KAAK,aAAa,EACnC,IAAI,CAAC,SAAS,gBAAgB,KAAK,IAAI,iBAAiB,KAAK,IAAI,eAAe;AACrF;AAEA,eAAe,mBACb,YACA,MACA,UACA,OACA,cACkB;AAClB,MAAI,CAAC,cAAc,cAAc,UAAU,GAAG;AAC5C,YAAQ,IAAI,KAAK;AACjB,WAAO;AAAA,EACT;AACA,QAAM,UAAU,SAAS,UAAU;AACnC,MAAI,CAAC,SAAS;AACZ,kBAAc,WAAW,YAAY,KAAK,UAAU,IAAI,KAAK;AAAA,EAC/D;AACA,QAAM,QAAQ,IAAI;AAClB,SAAO;AACT;AAEA,eAAe,MAAqB;AAClC,QAAM,CAAC,SAAS,YAAY,GAAG,IAAI,IAAIA,SAAQ,KAAK,MAAM,CAAC;AAC3D,sBAAoB,OAAO;AAE3B,MAAI,CAAC,WAAW,cAAc,OAAO,GAAG;AACtC,YAAQ,IAAI,UAAU,CAAC;AACvB;AAAA,EACF;AACA,QAAM,OAAO,sBAAsB,OAAO;AAC1C,MAAI,CAAC,MAAM;AACT,kBAAc,oBAAoB,CAAC,SAAS,UAAU,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG,CAAC,IAAI,UAAU,CAAC;AAAA,EAClG;AAEA,MAAI,KAAK,SAAS;AAChB,UAAM,KAAK,QAAQ,aAAa,CAAC,YAAY,GAAG,IAAI,IAAI,IAAI;AAC5D;AAAA,EACF;AAEA,MAAI,KAAK,aAAa;AACpB,UAAM,WAAW,iBAAiB,KAAK,WAAW;AAClD,QACE,MAAM;AAAA,MACJ;AAAA,MACAA,SAAQ,KAAK,MAAM,CAAC;AAAA,MACpB;AAAA,MACA,KAAK,QAAQ,KAAK,MAAM,IAAI,UAAU;AAAA,MACtC,GAAG,OAAO;AAAA,IACZ,GACA;AACA;AAAA,IACF;AAAA,EACF;AAEA,gBAAc,oBAAoB,CAAC,SAAS,UAAU,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG,CAAC,IAAI,UAAU,CAAC;AAClG;AAEO,SAAS,SAAe;AAC7B,MAAI,EAAE,MAAM,CAAC,UAAU;AACrB,UAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AACrE,UAAM,SAASA,SAAQ,KAAK,SAAS,QAAQ;AAC7C,QAAI,QAAQ;AACV,uBAAiB,SAAS,EAAE,QAAQ,CAAC;AAAA,IACvC,OAAO;AACL,cAAQ,MAAM,UAAU,OAAO,EAAE;AAAA,IACnC;AACA,IAAAA,SAAQ,KAAK,CAAC;AAAA,EAChB,CAAC;AACH;;;AMvoBA,OAAO;","names":["process","minimist","minimist","fsConstants","access","readFile","path","minimist","path","pathExists","access","fsConstants","parsePositiveNumberOption","path","minimist","readFile","path","minimist","path","minimist","path","process"]}
|