{"id":"620443bb-7555-455e-9155-c5c3d756b294","entityType":"agent","slug":"clawhub-tobewin-narrated-handdrawn-story-video","name":"叙事手绘故事视频","canonicalUrl":"https://www.xpersona.co/agent/clawhub-tobewin-narrated-handdrawn-story-video","canonicalPath":"/agent/clawhub-tobewin-narrated-handdrawn-story-video","generatedAt":"2026-10-11T14:17:09.794Z","source":"CLAWHUB","claimStatus":"UNCLAIMED","verificationTier":"NONE","summary":{"evidence":{"source":"editorial-content","verified":true,"confidence":"high","updatedAt":"2026-10-11T11:47:07.368Z","emptyReason":null},"description":"面向中文成语故事的多场景手绘同步短视频完整制作流程 Skill: 叙事手绘故事视频 Owner: tobewin Summary: 面向中文成语故事的多场景手绘同步短视频完整制作流程 Tags: latest:0.1.0 Version history: v0.1.0 | 2026-08-26T05:59:05.096Z | auto - Initial release of narrated-handdrawn-story-video. - Create high-quality Chinese story short videos with multi-scene hand-drawn visuals, synchronized Qwen3-TTS narration, subtitles, and licensed background music. - Automatic generation of opening poster with title, category,","descriptionLabel":"Technical summary","evidenceSummary":"Capability contract not published. No trust telemetry is available yet. 1.1K downloads reported by the source. Last updated 10/11/2026.","installCommand":"clawhub skill install s174rz3f0862tcfw7pzfh5w8kn83hv2z:narrated-handdrawn-story-video","sourceUrl":"https://clawhub.ai/tobewin/narrated-handdrawn-story-video","homepage":"https://clawhub.ai/tobewin/skills/narrated-handdrawn-story-video","primaryLinks":[{"label":"View on ClawHub","url":"https://clawhub.ai/tobewin/narrated-handdrawn-story-video","kind":"source"},{"label":"Homepage","url":"https://clawhub.ai/tobewin/skills/narrated-handdrawn-story-video","kind":"homepage"}],"safetyScore":84,"overallRank":62,"popularityScore":61,"trustScore":null,"claimedByName":null,"isOwner":false,"seoDescription":"面向中文成语故事的多场景手绘同步短视频完整制作流程 Skill: 叙事手绘故事视频 Owner: tobewin Summary: 面向中文成语故事的多场景手绘同步短视频完整制作流程 Tags: latest:0.1.0 Version history: v0.1.0 | 2026-08-26T05:59:05.096"},"coverage":{"evidence":{"source":"public-profile","verified":false,"confidence":"medium","updatedAt":"2026-10-11T11:47:07.368Z","emptyReason":null},"protocols":[{"protocol":"OPENCLEW","label":"OpenClaw","status":"self-declared","notes":"Declared in the public agent profile."}],"capabilities":[],"verifiedCount":0,"selfDeclaredCount":1,"capabilityMatrix":{"rows":[{"key":"OPENCLEW","type":"protocol","support":"unknown","confidenceSource":"profile","notes":"Listed on profile"}],"flattenedTokens":"protocol:OPENCLEW|unknown|profile"}},"adoption":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-11T11:47:07.368Z","emptyReason":null},"stars":null,"forks":null,"downloads":1072,"packageName":null,"latestVersion":"0.1.0","tractionLabel":"1.1K downloads"},"release":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-11T11:47:07.306Z","emptyReason":null},"lastUpdatedAt":"2026-10-11T11:47:07.368Z","lastCrawledAt":"2026-10-11T11:47:07.306Z","lastIndexedAt":null,"nextCrawlAt":"2026-10-12T11:47:07.306Z","lastVerifiedAt":null,"highlights":[{"version":"0.1.0","createdAt":"2026-08-26T05:59:05.096Z","changelog":"- Initial release of narrated-handdrawn-story-video. - Create high-quality Chinese story short videos with multi-scene hand-drawn visuals, synchronized Qwen3-TTS narration, subtitles, and licensed background music. - Automatic generation of opening poster with title, category, synopsis, and takeaway at correct aspect ratio. - Strict workflow to ensure distinct illustrations per scene, faithful audio-text sync, and consistent visual identity. - Enforced checks for aspect ratio, source attribution, and completed narration before final MP4 delivery.","fileCount":74,"zipByteSize":4547181}]},"execution":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No published capability contract is available yet."},"installCommand":"clawhub skill install s174rz3f0862tcfw7pzfh5w8kn83hv2z:narrated-handdrawn-story-video","setupComplexity":"low","setupSteps":["Setup complexity is LOW. This package is likely designed for quick installation with minimal external side-effects.","Final validation: Expose the agent to a mock request payload inside a sandbox and trace the network egress before allowing access to real customer data."],"contract":{"contractStatus":"missing","authModes":[],"requires":[],"forbidden":[],"supportsMcp":false,"supportsA2a":false,"supportsStreaming":false,"inputSchemaRef":null,"outputSchemaRef":null,"dataRegion":null,"contractUpdatedAt":null,"sourceUpdatedAt":null,"freshnessSeconds":null},"invocationGuide":{"preferredApi":{"snapshotUrl":"https://www.xpersona.co/api/v1/agents/clawhub-tobewin-narrated-handdrawn-story-video/snapshot","contractUrl":"https://www.xpersona.co/api/v1/agents/clawhub-tobewin-narrated-handdrawn-story-video/contract","trustUrl":"https://www.xpersona.co/api/v1/agents/clawhub-tobewin-narrated-handdrawn-story-video/trust"},"curlExamples":["curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-tobewin-narrated-handdrawn-story-video/snapshot\"","curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-tobewin-narrated-handdrawn-story-video/contract\"","curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-tobewin-narrated-handdrawn-story-video/trust\""],"jsonRequestTemplate":{"query":"summarize this repo","constraints":{"maxLatencyMs":2000,"protocolPreference":["OPENCLEW"]}},"jsonResponseTemplate":{"ok":true,"result":{"summary":"...","confidence":0.9},"meta":{"source":"CLAWHUB","generatedAt":"2026-10-11T14:17:09.792Z"}},"retryPolicy":{"maxAttempts":3,"backoffMs":[500,1500,3500],"retryableConditions":["HTTP_429","HTTP_503","NETWORK_TIMEOUT"]}},"endpoints":{"dossierUrl":"https://www.xpersona.co/api/v1/agents/clawhub-tobewin-narrated-handdrawn-story-video/dossier","snapshotUrl":"https://www.xpersona.co/api/v1/agents/clawhub-tobewin-narrated-handdrawn-story-video/snapshot","contractUrl":"https://www.xpersona.co/api/v1/agents/clawhub-tobewin-narrated-handdrawn-story-video/contract","trustUrl":"https://www.xpersona.co/api/v1/agents/clawhub-tobewin-narrated-handdrawn-story-video/trust"}},"reliability":{"evidence":{"source":"runtime-metrics","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No trust, reliability, or runtime telemetry is available."},"trust":{"status":"unavailable","handshakeStatus":"UNKNOWN","verificationFreshnessHours":null,"reputationScore":null,"p95LatencyMs":null,"successRate30d":null,"fallbackRate":null,"attempts30d":null,"trustUpdatedAt":null,"trustConfidence":"unknown","sourceUpdatedAt":null,"freshnessSeconds":null},"decisionGuardrails":{"doNotUseIf":["Contract metadata is missing or unavailable for deterministic execution."],"safeUseWhen":[],"riskFlags":["missing_or_unavailable_contract","trust_data_unavailable","schema_references_missing"],"operationalConfidence":"low"},"executionMetrics":{"observedLatencyMsP50":null,"observedLatencyMsP95":null,"estimatedCostUsd":null,"uptime30d":null,"rateLimitRpm":null,"rateLimitBurst":null,"lastVerifiedAt":null,"verificationSource":null},"runtimeMetrics":{"successRate":null,"avgLatencyMs":null,"avgCostUsd":null,"hallucinationRate":null,"retryRate":null,"disputeRate":null,"p50Latency":null,"p95Latency":null,"lastUpdated":null}},"benchmarks":{"evidence":{"source":"no-benchmark-data","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No benchmark suites or observed failure patterns are available."},"suites":[],"failurePatterns":[]},"artifacts":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"high","updatedAt":"2026-10-11T11:47:07.368Z","emptyReason":null},"readme":"Skill: 叙事手绘故事视频\n\nOwner: tobewin\n\nSummary: 面向中文成语故事的多场景手绘同步短视频完整制作流程\n\nTags: latest:0.1.0\n\nVersion history:\n\nv0.1.0 | 2026-08-26T05:59:05.096Z | auto\n\n- Initial release of narrated-handdrawn-story-video.\n- Create high-quality Chinese story short videos with multi-scene hand-drawn visuals, synchronized Qwen3-TTS narration, subtitles, and licensed background music.\n- Automatic generation of opening poster with title, category, synopsis, and takeaway at correct aspect ratio.\n- Strict workflow to ensure distinct illustrations per scene, faithful audio-text sync, and consistent visual identity.\n- Enforced checks for aspect ratio, source attribution, and completed narration before final MP4 delivery.\n\nArchive index:\n\nArchive v0.1.0: 74 files, 4547181 bytes\n\nFiles: .gitignore (189b), agents (0b), agents/openai.yaml (289b), docs (0b), docs/assets (0b), docs/assets/natuguisong-opening-poster.jpg (63777b), examples (0b), examples/qwen3-voice-plan.json (561b), LICENSE (1064b), NOTICE (387b), README.md (3837b), renderer (0b), renderer/.gitignore (199b), renderer/CHANGELOG.md (1125b), renderer/CODE_OF_CONDUCT.md (2492b), renderer/CONTRIBUTING.md (1414b), renderer/DESIGN.md (830b), renderer/examples (0b), renderer/examples/story.txt (89b), renderer/LICENSE (1064b), renderer/package-lock.json (101731b), renderer/package.json (2083b), renderer/public (0b), renderer/public/assets (0b), renderer/public/assets/02_bw.svg (2366b), renderer/public/assets/02_color.svg (2974b), renderer/public/assets/03_bw.svg (2083b), renderer/public/assets/03_color.svg (2747b), renderer/public/fonts (0b), renderer/public/fonts/MaShanZheng-Regular.ttf (5858048b), renderer/public/fonts/OFL-MaShanZheng.txt (4397b), renderer/README.md (8990b), renderer/references (0b), renderer/references/style-bw.png (147798b), renderer/references/style-color.png (360833b), renderer/remotion.config.ts (500b), renderer/scripts (0b), renderer/scripts/import-codex-images.mjs (4493b), renderer/scripts/import-uploaded-pages.mjs (12689b), renderer/scripts/package-project.mjs (1825b), renderer/scripts/run_story_video.py (7203b), renderer/scripts/story-to-video.mjs (20910b), renderer/scripts/validate-storyboard.mjs (6122b), renderer/skill-package (0b), renderer/skill-package/story-to-handdrawn-video (0b), renderer/skill-package/story-to-handdrawn-video/agents (0b), renderer/skill-package/story-to-handdrawn-video/agents/openai.yaml (267b), renderer/skill-package/story-to-handdrawn-video/scripts (0b), renderer/skill-package/story-to-handdrawn-video/scripts/run_story_video.py (958b), renderer/skill-package/story-to-handdrawn-video/SKILL.md (3612b), renderer/src (0b), renderer/src/easing.ts (425b), renderer/src/global.css (223b), renderer/src/index.ts (128b), renderer/src/LayerWipe.tsx (1461b), renderer/src/Root.tsx (991b), renderer/src/Scene.tsx (2204b), renderer/src/storyboard.ts (1257b), renderer/src/StoryVideo.tsx (9819b), renderer/src/TextWipe.tsx (2281b), renderer/src/types.ts (1297b), renderer/src/uploadedStoryboard.ts (294b), renderer/src/UploadedStoryVideo.tsx (208b), renderer/storyboard.json (11326b), renderer/storyboard.uploaded.json (10464b), renderer/tsconfig.json (404b), requirements-qwen3.txt (65b), scripts (0b), scripts/check_cover_ratio.py (1626b), scripts/mix_story_audio.py (1915b), scripts/synthesize_qwen3.py (3949b), skill-card.md (2382b), SKILL.md (5502b), _meta.json (149b)\n\nFile v0.1.0:renderer/skill-package/story-to-handdrawn-video/SKILL.md\n\n---\nname: story-to-handdrawn-video\ndescription: Convert Chinese story copy or ordered local images into a hand-drawn diary-comic animation with handwritten captions, left-to-right black-and-white-to-color reveals, optional page-flip transitions, safe uncropped framing, and a silent Remotion picture track.\n---\n\n# Story to Hand-drawn Video\n\nUse the project renderer through this Skill's `scripts/run_story_video.py`. Set `STORY_VIDEO_PROJECT` when the project is not the current working directory. The wrapper must not rely on an author-specific absolute path.\n\n## Workflow\n\n1. Accept inline Chinese story text, a UTF-8 text file, or ordered local images.\n2. Preserve the user's wording. For text input, keep one complete sentence as one beat by default and split only long compound sentences at natural narrative turns.\n3. For uploaded composite pages, automatically crop the handwritten caption and illustration, then derive an aligned black-and-white plate locally.\n4. In direct-cut mode, keep the order `text → bw_full → color`; reveal every stage from left to right.\n5. In page-flip mode, preserve the untouched uploaded master and show it statically before curling the page from the bottom-right corner. Do not add caption, black-and-white, or recoloring stages. Retain a faded version of the source page on the paper underside.\n6. Keep all illustration marks inside the white safe border. Use contained framing and never `cover` cropping.\n7. Produce a silent MP4. Voiceover and optional BGM are post-production tasks.\n8. Report the scene count, duration, output path, and whether the result is plan-only, preview, or final.\n\n## Uploaded images\n\nPreview:\n\n```bash\npython3 scripts/run_story_video.py \\\n  --images /absolute/01.jpg /absolute/02.jpg \\\n  --title \"故事标题\" \\\n  --mode preview \\\n  --transition cut\n```\n\nFinal direct-cut render:\n\n```bash\npython3 scripts/run_story_video.py \\\n  --images /absolute/01.jpg /absolute/02.jpg \\\n  --title \"故事标题\" \\\n  --mode full \\\n  --transition cut \\\n  --page-duration 4.4\n```\n\nFinal page-flip render:\n\n```bash\npython3 scripts/run_story_video.py \\\n  --images /absolute/01.jpg /absolute/02.jpg \\\n  --title \"故事标题\" \\\n  --mode full \\\n  --transition page-flip \\\n  --transition-sec 0.7\n```\n\nUse `--layout auto|composite|full` to control how uploaded pages are interpreted.\n\n## Story text\n\nPlan without generating images:\n\n```bash\npython3 scripts/run_story_video.py --input /absolute/story.txt --title \"故事标题\" --mode plan\n```\n\nPrepare Codex Image2 jobs, then import and render:\n\n```bash\npython3 scripts/run_story_video.py --input /absolute/story.txt --title \"故事标题\" --mode generate\npython3 scripts/run_story_video.py --mode import\npython3 scripts/run_story_video.py --mode render\n```\n\nUse `--generator codex` by default. Use `--generator api` only when the user explicitly selects the API fallback and `OPENAI_API_KEY` is available. Use `--force` only when the user explicitly wants an existing generated batch replaced.\n\nFor time jumps, ambiguous pronouns, medical scenes, or age-sensitive characters, provide a JSON visual plan keyed by two-digit scene id through `--visual-plan`.\n\n## Output contract\n\n- Text-story final: `<project>/out/picture_silent.mp4`\n- Text-story preview: `<project>/out/picture_silent-preview.mp4`\n- Uploaded-image final: `<project>/out/uploaded_picture_silent.mp4`\n- Uploaded-image preview: `<project>/out/uploaded_picture_silent-preview.mp4`\n- Resolution: final 1080×1440; preview 720×960\n- Codec/audio: H.264, silent\n\nDo not run a separate validation or test command unless the user explicitly requests it.\n\nFile v0.1.0:SKILL.md\n\n---\nname: narrated-handdrawn-story-video\ndescription: \"Create polished Chinese story short videos from story text or ordered illustrations: story-specific multi-scene colored hand-drawn visuals, a text-led opening poster, sentence-synchronous local Qwen3-TTS narration with optional character voices, subtitles, and licensed BGM mixed beneath narration. Use for idiom stories, children's stories, history explainers, or any Chinese narrated hand-drawn short-video request where visual variety and audio-text synchronization matter.\"\n---\n\n# Narrated Hand-drawn Story Video\n\nUse the installed `story-to-handdrawn-video` renderer for the picture track, then produce narration and the final mix. This is a quality-first workflow: never substitute one illustration across all story beats.\n\n## Required outcome\n\n- Create an opening poster (normally 3 seconds) with a legible Chinese title, category/tag, concise synopsis, and one takeaway; reserve uncluttered image space for this text. Render the complete image-and-text cover at frame 0; never fade its text in after the video begins.\n- Turn the story into 8–18 narrative beats. For every beat, define setting, action, characters, emotion, and an exact subtitle/narration sentence before generating artwork.\n- Generate or source a distinct scene illustration for every beat. Build multi-panel source art only as a generation convenience, then crop it into one image per beat.\n- Keep character identity, era, palette, and framing consistent with the project's actual output ratio. Read `project.width` and `project.height` from the storyboard before prompting for art; the current renderer defaults to 1080×1440 (3:4), not 9:16. Use `contain` only after the source image has been normalized to the same ratio.\n- Generate one local Qwen3-TTS segment per subtitle from that exact string. Use distinct voice-design instructions for narrator and named speaking characters. Derive the scene duration from the resulting audio; do not write narration separately from captions.\n- Obtain BGM from a source whose license permits the intended use. Preserve the source URL, author, and license in an attribution text file next to the deliverable.\n- Mix BGM softly and duck it under speech. Delay narration by the poster duration. Export a playable H.264/AAC MP4.\n\n## Workflow\n\n1. Write `story.txt` and a two-digit-keyed `visual-plan.json`. Split only at natural narrative turns; resolve pronouns and time jumps in the plan. Keep `caption` and `narration` identical for each scene.\n2. Use the existing renderer wrapper to plan/generate/import the scene images. Set `STORY_VIDEO_PROJECT` to the cloned Remotion project when needed:\n\n   ```bash\n   STORY_VIDEO_PROJECT=/absolute/project \\\n   python3 /Users/bingo/.codex/skills/story-to-handdrawn-video/scripts/run_story_video.py \\\n     --input /absolute/story.txt --title \"故事标题\" --visual-plan /absolute/visual-plan.json --mode generate\n   ```\n\n3. Generate images with the image-generation tool. Prompt for exact story action and setting; request no embedded text. Inspect the first crop from each batch before importing all scenes.\n4. Produce the opening-poster image with the image-generation tool at exactly the storyboard's aspect ratio, then add `project.opening_poster` (asset, tag, title, synopsis, takeaway) to the storyboard. The renderer displays the complete cover at frame 0; do not fade in its text. Allocate the copy to a quiet third of the frame. If the generated file has another ratio, outpaint or extend it to the project ratio without stretching or cropping subjects, then resize to the exact project dimensions. Verify the image and video dimensions with `scripts/check_cover_ratio.py` and `npm run check` before rendering.\n5. Generate each TTS segment with `scripts/synthesize_qwen3.py` using the local Qwen3-TTS model and a voice-plan JSON. Use one segment for exactly one subtitle; concatenate them in scene order, keeping a short leading and trailing pause in every segment. Update scene timing from measured audio duration and render the silent picture track. Do not fall back to online Edge TTS unless the user explicitly requests it.\n6. Download/select an appropriate licensed BGM, trim/fade it, then run `scripts/mix_story_audio.py` to delay the voice for the poster and sidechain-duck the music.\n7. Inspect a poster frame and several scene-boundary frames. Confirm each subtitle matches both the voice and shown action, then place only the final MP4 and BGM attribution in the requested output folder.\n\n## Audio mix\n\n```bash\npython3 scripts/mix_story_audio.py \\\n  --video /absolute/picture_silent.mp4 \\\n  --voice /absolute/narration.wav \\\n  --bgm /absolute/music.ogg \\\n  --output /absolute/final.mp4 \\\n  --poster-seconds 3\n```\n\nThe script preserves the video stream and creates AAC audio. It deliberately makes no license claim; create an attribution file yourself.\n\n## Non-negotiable checks\n\n- Do not reuse a generic scene across story beats.\n- Do not render a poster whose aspect ratio differs from the video canvas; `contain` would create side or top bars, while `cover` can remove important artwork.\n- Do not let captions, narration, and scene meaning diverge.\n- Do not use music without checking its current license and retaining attribution when required.\n- Do not report a silent picture track as a completed narrated video.\n- Do not expose intermediate files as final deliverables.\n- Do not use a generated image's embedded text as poster copy; the renderer owns text layout.\n\nFile v0.1.0:README.md\n\n# Narrated Hand-drawn Story Video\n\nAn agent-native pipeline for Chinese idiom, history, and children's-story shorts. It turns a story into a vertical 3:4 video with story-specific colored scenes, a complete opening poster at frame 0, local Qwen3-TTS character voices, synchronized captions, and ducked licensed BGM.\n\n## Actual output preview\n\nThe image below is the real first frame from the included workflow's **“纳土归宋”** output—not a concept mockup. Its title, category, synopsis, and takeaway are programmatically overlaid by the renderer from frame 0.\n\n<p align=\"center\">\n  <img src=\"docs/assets/natuguisong-opening-poster.jpg\" alt=\"纳土归宋：实际成片首帧预览\" width=\"360\" />\n</p>\n\nThis repository packages an enhanced workflow around a bundled, MIT-licensed copy of [`gnipbao/story-to-handdrawn-video`](https://github.com/gnipbao/story-to-handdrawn-video). The original copyright and license are retained in [`renderer/LICENSE`](renderer/LICENSE).\n\n## What is included\n\n- `SKILL.md`: the agent contract for high-quality story-video production.\n- `renderer/`: a 1080×1440 Remotion renderer with scene-reveal animation and generic `opening_poster` support.\n- `scripts/synthesize_qwen3.py`: local Qwen3-TTS multi-role voice-plan synthesis.\n- `scripts/check_cover_ratio.py`: rejects cover/video aspect-ratio mismatches.\n- `scripts/mix_story_audio.py`: poster-delayed narration plus side-chain-ducked BGM.\n\n## Quality rules\n\n1. Every story beat needs a different, story-specific illustration.\n2. Caption text and synthesized speech are exactly the same sentence.\n3. The cover is displayed from frame 0 and includes tag, title, synopsis, and takeaway.\n4. The cover asset must use the exact video aspect ratio; the validator rejects a mismatch.\n5. Local Qwen3-TTS is the default. Online Edge TTS is not required.\n6. BGM requires a usable license and an attribution file alongside the output.\n\n## Install\n\n```bash\ngit clone https://github.com/ToBeWin/narrated-handdrawn-story-video.git\ncd narrated-handdrawn-story-video/renderer\nnpm ci\nnpm run check\n\n# Optional: local Qwen3-TTS runtime\npython3 -m venv ../.venv\n../.venv/bin/pip install -r ../requirements-qwen3.txt\n```\n\n## Storyboard opening poster\n\nPut a normalized 1080×1440 poster image in `renderer/public/assets/posters/`, then add this to `renderer/storyboard.json`:\n\n```json\n{\n  \"opening_poster\": {\n    \"asset\": \"assets/posters/story-opening.png\",\n    \"duration_sec\": 3,\n    \"tag\": \"历史故事 · 五代十国\",\n    \"title\": \"纳土归宋\",\n    \"synopsis\": \"吴越王钱俶为何献出十三州，\\n让江南归入大宋？\",\n    \"takeaway\": \"减少战乱，守护百姓安宁\"\n  }\n}\n```\n\nRun `npm run check` before rendering. It verifies that the first-frame poster uses the same ratio as the video canvas.\n\n## Local Qwen3 multi-role voices\n\nThe voice-plan schema has one segment per caption. Use narrator and speaking-character entries independently:\n\n```bash\n.venv/bin/python scripts/synthesize_qwen3.py examples/qwen3-voice-plan.json renderer/public --allow-download\n```\n\nEach segment generates a local WAV under `renderer/public/`; measure those clips, set each scene duration accordingly, concatenate in scene order, and then render the silent picture track from `renderer/`.\n\n## Final mix\n\n```bash\npython3 scripts/mix_story_audio.py \\\n  --video /absolute/picture_silent.mp4 \\\n  --voice /absolute/narration.wav \\\n  --bgm /absolute/licensed-music.ogg \\\n  --output /absolute/final.mp4 \\\n  --poster-seconds 3\n```\n\nThe repository does not distribute generated images, model weights, voice output, BGM, or finished videos. Keep BGM source, author, and license in an `ATTRIBUTION.txt` next to each output.\n\n## License\n\nThe orchestration files in this repository are MIT licensed. The bundled renderer retains the upstream MIT license and attribution.\n\nFile v0.1.0:renderer/README.md\n\n# story-to-handdrawn-video\n\n[中文](#中文) | [English](#english)\n\n[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](LICENSE)\n\n---\n\n## 中文\n\n把中文故事文案或一组有序的手绘图片,转换成 3:4 竖屏**手绘日记漫画动画**:手写体字幕、从左到右的「文字 → 黑白画稿 → 彩色插画」揭示、可选的右下角卷页翻书转场、安全不裁剪的画面构图。基于 [Remotion](https://www.remotion.dev/),默认输出无配音、无音乐的 H.264 画面轨,方便后期配音。\n\n本仓库包含两部分:\n\n- **渲染器项目**(根目录):Remotion 工程,负责实际的分镜、动效和渲染。\n- **Codex / Agent Skill**(`skill-package/`):可分发的 Skill,装进 Codex 等 Agent 后用自然语言驱动渲染器,无需手动跑脚本。\n\n### 功能特性\n\n- 中文故事自动分句和动态分镜,保留原文措辞\n- 上传漫画页或完整图片,保持原顺序和构图\n- 自动拆分上方文字区与下方插画区\n- 本地生成与彩色插画对齐的黑白层\n- `文字 → 黑白画稿 → 彩色插画` 从左到右揭示\n- 可选右下角卷页翻书转场(纸背保留淡化的原页纹理)\n- 1080×1440 正式渲染和 720×960 快速预览\n- Codex Image2 工作流,以及显式选择的 OpenAI API 工作流\n\n### 环境要求\n\n- Node.js 20 或更高版本\n- Python 3.10 或更高版本\n- FFmpeg,且 `ffmpeg`、`ffprobe` 可从终端调用\n- npm\n- Google Chrome,或由 Remotion 管理的兼容浏览器\n- 支持 Skill 的 Agent 运行时(Codex、Claude Code、Kimi Code 等)\n\n### 安装\n\n1. 准备渲染器项目:\n\n```bash\ngit clone https://github.com/gnipbao/story-to-handdrawn-video.git\ncd story-to-handdrawn-video\nnpm ci\nnpm run check      # TypeScript 检查 + 分镜结构校验,不访问网络\n```\n\n2. 把 Skill 装进 Agent 的 skills 目录:\n\n```bash\n# Codex\ncp -R skill-package/story-to-handdrawn-video ~/.codex/skills/\n\n# Claude Code / 通用 Agent\ncp -R skill-package/story-to-handdrawn-video ~/.claude/skills/\n\n# Kimi Code\ncp -R skill-package/story-to-handdrawn-video ~/.agents/skills/\n```\n\n3. 告诉 Skill 渲染器项目在哪里(在渲染器项目目录内运行 Agent 时可省略):\n\n```bash\nexport STORY_VIDEO_PROJECT=/absolute/path/to/story-to-handdrawn-video\n```\n\n### 使用方法(Codex Skill 示例)\n\n装好 Skill 后,全部通过自然语言驱动,分句、分镜、图片生成、导入、渲染由 Agent 按 Skill 约定自动完成。\n\n**故事文本 → 手绘动画**(Skill 的默认提示词):\n\n```text\n使用 $story-to-handdrawn-video 把这段故事生成可后期配音的手绘动画。\n\n<在这里粘贴故事文本>\n```\n\n也可以把故事放在 UTF-8 文本文件里:\n\n```text\n使用 $story-to-handdrawn-video 把 /absolute/story.txt 生成手绘动画,标题叫「纸上的夏天」。\n```\n\n**上传图片 → 手绘动画**(图片按播放顺序给出):\n\n```text\n使用 $story-to-handdrawn-video 把这几张图片按顺序生成手绘动画:\n/absolute/01.jpg /absolute/02.jpg /absolute/03.jpg\n```\n\n**翻书效果**(保留原始页面,从右下角卷页):\n\n```text\n使用 $story-to-handdrawn-video 把这些图片做成翻书效果的手绘动画:\n/absolute/01.jpg /absolute/02.jpg\n```\n\n**先出预览**(720×960,确认效果后再出正式版):\n\n```text\n使用 $story-to-handdrawn-video 先给这个故事生成一个预览版。\n```\n\n使用建议:\n\n- 故事文本默认一个完整句子一个节拍;想控制节奏,直接在故事里按句分行即可。\n- 遇到时间跳跃、指代不明、医疗场景或年龄敏感角色时,建议先让 Agent 给出视觉规划(两位场景编号为键的 JSON),确认后再生成。\n- 默认使用 Codex Image2 生成图片;只有明确要求时才会走 OpenAI API(需 `OPENAI_API_KEY`)。\n- 输出是静音画面轨,配音和 BGM 属于后期工作。\n\n### 输出契约\n\n| 输入 | 模式 | 输出路径 |\n| --- | --- | --- |\n| 故事文本 | 正式 | `out/picture_silent.mp4` |\n| 故事文本 | 预览 | `out/picture_silent-preview.mp4` |\n| 上传图片 | 正式 | `out/uploaded_picture_silent.mp4` |\n| 上传图片 | 预览 | `out/uploaded_picture_silent-preview.mp4` |\n\n- 分辨率:正式 1080×1440,预览 720×960\n- 编码:H.264,静音\n\nSkill 的完整行为约定见 [skill-package/story-to-handdrawn-video/SKILL.md](skill-package/story-to-handdrawn-video/SKILL.md)。\n\n### 项目结构\n\n```text\n.\n├── src/                    # Remotion 组件(场景、擦除动效、翻页、缓动)\n├── scripts/                # 渲染器入口与导入/校验/打包脚本(由 Skill 调用)\n├── skill-package/          # 可分发的 Codex / Agent Skill\n├── examples/               # 示例故事文本\n├── references/             # 黑白/彩色风格参考图\n├── public/                 # 字体与素材(generated/ 为运行时产物)\n├── storyboard.json         # 默认文本故事分镜示例\n├── storyboard.uploaded.json # 上传图片分镜示例\n└── DESIGN.md               # 设计说明\n```\n\n渲染器项目的维护命令:`npm run dev`(Remotion Studio)、`npm run check`(类型与分镜校验)、`npm run build`(生产构建)、`npm run package:share`(生成源码分享包)。\n\n### 字体\n\n项目使用随附的站酷马善政毛笔字体(Ma Shan Zheng),许可证见 [public/fonts/OFL-MaShanZheng.txt](public/fonts/OFL-MaShanZheng.txt)(SIL Open Font License)。\n\n### 贡献\n\n欢迎贡献——请阅读 [CONTRIBUTING.md](CONTRIBUTING.md)。注意 `skill-package/` 下的 Skill 契约与 `src/`、`scripts/` 下的渲染器逻辑是核心部分,修改需要充分理由。\n\n### 开源协议\n\n[MIT](LICENSE)\n\n---\n\n## English\n\nConvert Chinese story copy — or ordered hand-drawn images — into a 3:4 vertical **hand-drawn diary-comic animation**: handwritten captions, left-to-right `text → bw plate → color illustration` reveals, an optional bottom-right page-curl flip transition, and safe uncropped framing. Built on [Remotion](https://www.remotion.dev/); outputs a silent H.264 picture track ready for post-production voiceover.\n\nThis repo contains:\n\n- **The renderer project** (root): the Remotion app that storyboards, animates, and renders.\n- **A Codex / agent skill** (`skill-package/`): a distributable skill that drives the renderer with natural language — no scripts to run by hand.\n\n### Requirements\n\n- Node.js 20+, Python 3.10+, npm\n- FFmpeg (`ffmpeg` and `ffprobe` on PATH)\n- Google Chrome or a Remotion-managed compatible browser\n- An agent runtime with skill support (Codex, Claude Code, Kimi Code, …)\n\n### Install\n\n1. Set up the renderer project:\n\n```bash\ngit clone https://github.com/gnipbao/story-to-handdrawn-video.git\ncd story-to-handdrawn-video\nnpm ci\nnpm run check\n```\n\n2. Install the skill into your agent's skills directory:\n\n```bash\n# Codex\ncp -R skill-package/story-to-handdrawn-video ~/.codex/skills/\n\n# Claude Code / generic agents\ncp -R skill-package/story-to-handdrawn-video ~/.claude/skills/\n\n# Kimi Code\ncp -R skill-package/story-to-handdrawn-video ~/.agents/skills/\n```\n\n3. Point the skill at the renderer project (skip when the agent runs inside it):\n\n```bash\nexport STORY_VIDEO_PROJECT=/absolute/path/to/story-to-handdrawn-video\n```\n\n### Usage (Codex skill examples)\n\nEverything is driven in natural language; sentence splitting, storyboarding, image generation, import, and rendering are handled by the agent per the skill contract.\n\nStory text → animation (the skill's default prompt):\n\n```text\n使用 $story-to-handdrawn-video 把这段故事生成可后期配音的手绘动画。\n\n<paste your story here>\n```\n\nOrdered images → animation:\n\n```text\n使用 $story-to-handdrawn-video 把这几张图片按顺序生成手绘动画:\n/absolute/01.jpg /absolute/02.jpg /absolute/03.jpg\n```\n\nPage-flip effect (uploaded pages shown untouched, curled from the bottom-right corner):\n\n```text\n使用 $story-to-handdrawn-video 把这些图片做成翻书效果的手绘动画:\n/absolute/01.jpg /absolute/02.jpg\n```\n\nPreview first (720×960, before committing to a full render):\n\n```text\n使用 $story-to-handdrawn-video 先给这个故事生成一个预览版。\n```\n\nNotes: one complete sentence per beat by default; Codex Image2 is the default image generator (the OpenAI API path is only used when explicitly requested and requires `OPENAI_API_KEY`); output is a silent picture track — voiceover and BGM are post-production.\n\n### Outputs\n\n| Input | Mode | Path |\n| --- | --- | --- |\n| Story text | final | `out/picture_silent.mp4` |\n| Story text | preview | `out/picture_silent-preview.mp4` |\n| Uploaded images | final | `out/uploaded_picture_silent.mp4` |\n| Uploaded images | preview | `out/uploaded_picture_silent-preview.mp4` |\n\nFinal 1080×1440, preview 720×960, H.264, silent. The full behavior contract lives in [SKILL.md](skill-package/story-to-handdrawn-video/SKILL.md).\n\n### License\n\n[MIT](LICENSE). The bundled Ma Shan Zheng font is under the [SIL Open Font License](public/fonts/OFL-MaShanZheng.txt).\n\nFile v0.1.0:_meta.json\n\n{\n  \"ownerId\": \"kn75z6gevjsyrznm7dg2ez6sen82h8sz\",\n  \"slug\": \"narrated-handdrawn-story-video\",\n  \"version\": \"0.1.0\",\n  \"publishedAt\": 1787723945096\n}\n\nFile v0.1.0:renderer/CHANGELOG.md\n\n# Changelog\n\nAll notable changes to this project will be documented in this file.\n\nThe format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),\nand this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).\n\n## [Unreleased]\n\n## [1.0.0] - 2026-07-21\n\n### Added\n\n- Initial open-source release of `story-to-handdrawn-video`.\n- Remotion renderer (`src/`): story-text beats, uploaded-page cropping,\n  left-to-right `text → bw → color` reveals, page-flip transition,\n  safe contained framing, silent MP4 output (final 1080×1440, preview 720×960).\n- Unified CLI entry `scripts/run_story_video.py` with plan / generate /\n  import / render / preview / full modes and Codex Image2 + OpenAI API generators.\n- Distributable agent skill in `skill-package/story-to-handdrawn-video/`\n  with `STORY_VIDEO_PROJECT` discovery and upward directory walk.\n- Example story, style references, and the Ma Shan Zheng font (OFL).\n\n[Unreleased]: https://github.com/gnipbao/story-to-handdrawn-video/compare/v1.0.0...HEAD\n[1.0.0]: https://github.com/gnipbao/story-to-handdrawn-video/releases/tag/v1.0.0\n\nFile v0.1.0:renderer/CODE_OF_CONDUCT.md\n\n# Contributor Covenant Code of Conduct\n\n## Our Pledge\n\nWe as members, contributors, and leaders pledge to make participation in our\ncommunity a harassment-free experience for everyone, regardless of age, body\nsize, visible or invisible disability, ethnicity, sex characteristics, gender\nidentity and expression, level of experience, education, socio-economic status,\nnationality, personal appearance, race, caste, color, religion, or sexual\nidentity and orientation.\n\nWe pledge to act and interact in ways that contribute to an open, welcoming,\ndiverse, inclusive, and healthy community.\n\n## Our Standards\n\nExamples of behavior that contributes to a positive environment for our\ncommunity include:\n\n* Demonstrating empathy and kindness toward other people\n* Being respectful of differing opinions, viewpoints, and experiences\n* Giving and gracefully accepting constructive feedback\n* Accepting responsibility and apologizing to those affected by our mistakes,\n  and learning from the experience\n* Focusing on what is best not just for us as individuals, but for the overall\n  community\n\nExamples of unacceptable behavior include:\n\n* The use of sexualized language or imagery, and sexual attention or advances of\n  any kind\n* Trolling, insulting or derogatory comments, and personal or political attacks\n* Public or private harassment\n* Publishing others' private information, such as a physical or email address,\n  without their explicit permission\n* Other conduct which could reasonably be considered inappropriate in a\n  professional setting\n\n## Enforcement Responsibilities\n\nCommunity leaders are responsible for clarifying and enforcing our standards of\nacceptable behavior and will take appropriate and fair corrective action in\nresponse to any behavior that they deem inappropriate, threatening, offensive,\nor harmful.\n\n## Scope\n\nThis Code of Conduct applies within all community spaces, and also applies when\nan individual is officially representing the community in public spaces.\n\n## Enforcement\n\nInstances of abusive, harassing, or otherwise unacceptable behavior may be\nreported to the community leaders responsible for enforcement via GitHub\nissues or the repository owner's GitHub profile. All complaints will be\nreviewed and investigated promptly and fairly.\n\n## Attribution\n\nThis Code of Conduct is adapted from the [Contributor Covenant](https://www.contributor-covenant.org),\nversion 2.1, available at\n<https://www.contributor-covenant.org/version/2/1/code_of_conduct.html>.\n\nFile v0.1.0:renderer/CONTRIBUTING.md\n\n# Contributing\n\nThanks for your interest in improving `story-to-handdrawn-video`.\n\n## Ground rules\n\n- The **core** of this project is the renderer logic in `src/` and `scripts/`, plus the skill contract in `skill-package/story-to-handdrawn-video/` (`SKILL.md` and its wrapper). Changes to them require a clear rationale in the pull request — drive-by refactors of the core will not be merged.\n- Keep the skill wrapper portable: it must never depend on an author-specific absolute path. Project discovery goes through `STORY_VIDEO_PROJECT` or an upward walk from the current working directory.\n- Documentation (README, examples, translations) and non-core improvements are always welcome.\n\n## How to contribute\n\n1. Fork the repository and create a branch from `main`.\n2. Make your change. Keep diffs small and focused.\n3. If you change user-facing behavior, update `README.md` (both the 中文 and English sections) and `CHANGELOG.md` under `Unreleased`.\n4. Open a pull request describing the problem and the change. Link any related issue.\n\n## Reporting issues\n\nOpen a GitHub issue with:\n\n- What you ran (exact command, input type: story text or images).\n- What you expected vs. what happened.\n- Your environment: agent runtime, OS, Python and Node versions, and the renderer project you pointed `STORY_VIDEO_PROJECT` at.\n\n## Code of conduct\n\nThis project follows the [Contributor Covenant](CODE_OF_CONDUCT.md).\n\nFile v0.1.0:renderer/DESIGN.md\n\n# Rendering contract\n\n## Canvas\n\n- 1080×1440, 30fps, white background\n- Captions stay in the upper safe area\n- Illustrations use `object-fit: contain`; never crop with `cover`\n\n## Motion\n\n- Direct-cut mode: `text → bw_full → color`\n- Every layer reveals from left to right\n- Page-flip mode: `text → color`, followed by a left-bound 3D page turn\n- No camera shake, bounce, narration, or text-synchronized music\n\n## Assets\n\n- Uploaded masters are copied into a content-addressed generated directory\n- Caption, black-and-white, and color plates share aligned canvases\n- Generated assets and rendered videos are disposable runtime outputs\n\n## Visual style\n\n- Flat white paper\n- Uneven felt-tip outlines and sparse wax-crayon color\n- Generous negative space\n- No realistic shading, glossy gradients, watermark, or paper texture\n\nFile v0.1.0:skill-card.md\n\n## Description:\n\nCreates polished Chinese story short videos with story-specific hand-drawn scenes, an opening poster, synchronized local Qwen3-TTS narration, subtitles, and licensed background music.\n\nThis skill is ready for commercial/non-commercial use.\n\n## Publisher:\n\n[tobewin](https://clawhub.ai/user/tobewin)\n\n### License/Terms of Use:\n\nMIT\n\n## Use Case:\n\nExternal creators and developers use this skill to turn Chinese idiom, history, or children's-story text into narrated hand-drawn short videos with synchronized captions and audio. It also supports ordered illustrations when the user already has scene art.\n\n### Deployment Geography for Use:\n\nGlobal\n\n## Known Risks and Mitigations:\n\nRisk: The local TTS helper can write audio to plan-controlled paths outside the intended project folder.\n\nMitigation: Review the voice-plan file before execution and keep segment output paths relative under the renderer public directory.\n\nRisk: The Python TTS dependency stack is not reproducibly pinned.\n\nMitigation: Install the Python TTS stack in an isolated virtual environment or container and pin dependency versions before production use.\n\nRisk: Using overwrite behavior can replace existing generated audio or media outputs.\n\nMitigation: Avoid --overwrite unless replacing existing files is intentional.\n\n## Reference(s):\n\n- [Server-resolved source repository](https://github.com/ToBeWin/narrated-handdrawn-story-video)\n- [ClawHub skill page](https://clawhub.ai/tobewin/skills/narrated-handdrawn-story-video)\n- [Bundled upstream renderer](https://github.com/gnipbao/story-to-handdrawn-video)\n- [Remotion](https://www.remotion.dev/)\n\n## Skill Output:\n\n**Output Type(s):** [text, markdown, code, shell commands, configuration, guidance]\n\n**Output Format:** [Markdown guidance with JSON plans, shell commands, generated media-file paths, and configuration updates]\n\n**Output Parameters:** [1D]\n\n**Other Properties Related to Output:** [Final workflow output is a playable H.264/AAC MP4 with BGM attribution when the skill is executed successfully.]\n\n## Skill Version(s):\n\n0.1.0 (source: ClawHub release metadata)\n\n## Ethical Considerations:\n\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment.\n\nFile v0.1.0:examples/qwen3-voice-plan.json\n\n{\n  \"mode\": \"voice-design\",\n  \"language\": \"Chinese\",\n  \"voices\": {\n    \"narrator\": {\"instruct\": \"温暖沉稳的成年中文旁白，讲故事时咬字清晰，节奏舒缓。\"},\n    \"character\": {\"instruct\": \"成年中文角色，情绪克制真诚，语气符合历史故事。\"}\n  },\n  \"segments\": [\n    {\"id\": \"01\", \"speaker\": \"narrator\", \"text\": \"从前，有一位善于思考的人。\", \"output\": \"audio/example/01-voice.wav\"},\n    {\"id\": \"02\", \"speaker\": \"character\", \"text\": \"我明白该怎么做了。\", \"output\": \"audio/example/02-voice.wav\"}\n  ]\n}\n\nFile v0.1.0:renderer/package-lock.json\n\n{\n  \"name\": \"story-to-handdrawn-video\",\n  \"version\": \"1.0.0\",\n  \"lockfileVersion\": 3,\n  \"requires\": true,\n  \"packages\": {\n    \"\": {\n      \"name\": \"story-to-handdrawn-video\",\n      \"version\": \"1.0.0\",\n      \"engines\": {\n        \"node\": \">=20\"\n      },\n      \"dependencies\": {\n        \"@remotion/cli\": \"4.0.487\",\n        \"react\": \"19.2.7\",\n        \"react-dom\": \"19.2.7\",\n        \"remotion\": \"4.0.487\"\n      },\n      \"devDependencies\": {\n        \"@types/node\": \"24.10.11\",\n        \"@types/react\": \"19.2.14\",\n        \"@types/react-dom\": \"19.2.3\",\n        \"typescript\": \"5.9.3\"\n      }\n    },\n    \"node_modules/@babel/helper-string-parser\": {\n      \"version\": \"7.29.7\",\n      \"resolved\": \"https://registry.npmmirror.com/@babel/helper-string-parser/-/helper-string-parser-7.29.7.tgz\",\n      \"integrity\": \"sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw==\",\n      \"engines\": {\n        \"node\": \">=6.9.0\"\n      }\n    },\n    \"node_modules/@babel/helper-validator-identifier\": {\n      \"version\": \"7.29.7\",\n      \"resolved\": \"https://registry.npmmirror.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.29.7.tgz\",\n      \"integrity\": \"sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==\",\n      \"engines\": {\n        \"node\": \">=6.9.0\"\n      }\n    },\n    \"node_modules/@babel/parser\": {\n      \"version\": \"7.24.1\",\n      \"resolved\": \"https://registry.npmmirror.com/@babel/parser/-/parser-7.24.1.tgz\",\n      \"integrity\": \"sha512-Zo9c7N3xdOIQrNip7Lc9wvRPzlRtovHVE4lkz8WEDr7uYh/GMQhSiIgFxGIArRHYdJE5kxtZjAf8rT0xhdLCzg==\",\n      \"bin\": {\n        \"parser\": \"bin/babel-parser.js\"\n      },\n      \"engines\": {\n        \"node\": \">=6.0.0\"\n      }\n    },\n    \"node_modules/@babel/types\": {\n      \"version\": \"7.24.0\",\n      \"resolved\": \"https://registry.npmmirror.com/@babel/types/-/types-7.24.0.tgz\",\n      \"integrity\": \"sha512-+j7a5c253RfKh8iABBhywc8NSfP5LURe7Uh4qpsh6jc+aLJguvmIUBdjSdEMQv2bENrCR5MfRdjGo7vzS/ob7w==\",\n      \"dependencies\": {\n        \"@babel/helper-string-parser\": \"^7.23.4\",\n        \"@babel/helper-validator-identifier\": \"^7.22.20\",\n        \"to-fast-properties\": \"^2.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">=6.9.0\"\n      }\n    },\n    \"node_modules/@emnapi/core\": {\n      \"version\": \"1.11.2\",\n      \"resolved\": \"https://registry.npmmirror.com/@emnapi/core/-/core-1.11.2.tgz\",\n      \"integrity\": \"sha512-TC8MkTuZUtcTSiFeuC0ksCh9QIJ5+F21MvZ4Wn4ORfYaFJ/0dsiudv5tVkejgwZlwQ39jL9WWDe2lz8x0WglOA==\",\n      \"optional\": true,\n      \"dependencies\": {\n        \"@emnapi/wasi-threads\": \"1.2.2\",\n        \"tslib\": \"^2.4.0\"\n      }\n    },\n    \"node_modules/@emnapi/runtime\": {\n      \"version\": \"1.11.2\",\n      \"resolved\": \"https://registry.npmmirror.com/@emnapi/runtime/-/runtime-1.11.2.tgz\",\n      \"integrity\": \"sha512-kyOl3X0DuTiT1h2ft8r2fYO8JYtU9a9Xis/zBSiGArNaagCOWx90N1k2wxp18czFDH+OgcWGb5ZP/XMt3dcyPA==\",\n      \"optional\": true,\n      \"dependencies\": {\n        \"tslib\": \"^2.4.0\"\n      }\n    },\n    \"node_modules/@emnapi/wasi-threads\": {\n      \"version\": \"1.2.2\",\n      \"resolved\": \"https://registry.npmmirror.com/@emnapi/wasi-threads/-/wasi-threads-1.2.2.tgz\",\n      \"integrity\": \"sha512-c95qOXkHdydNKhscBTebqEC1CVAZpyqOfVfBzQ1qgzyl3gfeldUjIggDbIZgDKsHLgnsM+igH7TJ/eAasaVuMA==\",\n      \"optional\": true,\n      \"dependencies\": {\n        \"tslib\": \"^2.4.0\"\n      }\n    },\n    \"node_modules/@esbuild/aix-ppc64\": {\n      \"version\": \"0.28.1\",\n      \"resolved\": \"https://registry.npmmirror.com/@esbuild/aix-ppc64/-/aix-ppc64-0.28.1.tgz\",\n      \"integrity\": \"sha512-Svl7tq8k/08+p6CXPpRjQ1fKX+1odH/BQbb48fV6fj3CWHhsoIOoY87w1oHXm0qEpkIK3ZfVgp0hed3XBXzXMQ==\",\n      \"cpu\": [\n        \"ppc64\"\n      ],\n      \"optional\": true,\n      \"os\": [\n        \"aix\"\n      ],\n      \"engines\": {\n        \"node\": \">=18\"\n      }\n    },\n    \"node_modules/@esbuild/android-arm\": {\n      \"version\": \"0.28.1\",\n      \"resolved\": \"https://registry.npmmirror.com/@esbuild/android-arm/-/android-arm-0.28.1.tgz\",\n      \"integrity\": \"sha512-0k2F129Xdio1TdJfzJ8sy1Q47vUD2NnwdhiAf7drUN1EBTfPf4hsFCtmMgu/6m8JSzsBrlmVjudMBQqOfG8usQ==\",\n      \"cpu\": [\n        \"arm\"\n      ],\n      \"optional\": true,\n      \"os\": [\n        \"android\"\n      ],\n      \"engines\": {\n        \"node\": \">=18\"\n      }\n    },\n    \"node_modules/@esbuild/android-arm64\": {\n      \"version\": \"0.28.1\",\n      \"resolved\": \"https://registry.npmmirror.com/@esbuild/android-arm64/-/android-arm64-0.28.1.tgz\",\n      \"integrity\": \"sha512-34EGEbCIAgosYz6goLcopX6Mo7NyGv9tfwEM2/7Ce2VcVRk568iSvniGWcUXIy7wEDR1wzolcxcriFVrWYcwBg==\",\n      \"cpu\": [\n        \"arm64\"\n      ],\n      \"optional\": true,\n      \"os\": [\n        \"android\"\n      ],\n      \"engines\": {\n        \"node\": \">=18\"\n      }\n    },\n    \"node_modules/@esbuild/android-x64\": {\n      \"version\": \"0.28.1\",\n      \"resolved\": \"https://registry.npmmirror.com/@esbuild/android-x64/-/android-x64-0.28.1.tgz\",\n      \"integrity\": \"sha512-dbwY7ltSMDWsRatcRpCnES4F+im88OCUgGZjy52shC7GqHRE/cYlxNbB4Z4UpJswpcc4Qxd2oE/ufM0p61IKng==\",\n      \"cpu\": [\n        \"x64\"\n      ],\n      \"optional\": true,\n      \"os\": [\n        \"android\"\n      ],\n      \"engines\": {\n        \"node\": \">=18\"\n      }\n    },\n    \"node_modules/@esbuild/darwin-arm64\": {\n      \"version\": \"0.28.1\",\n      \"resolved\": \"https://registry.npmmirror.com/@esbuild/darwin-arm64/-/darwin-arm64-0.28.1.tgz\",\n      \"integrity\": \"sha512-TZbWkQY7kvTAXbXUT7uVACR5cMHsDiSz9z7ZKAX/RTq/WJEk3QyRr0wZpNhBDX+/0CtdqUIJlOiodQcta6tY3Q==\",\n      \"cpu\": [\n        \"arm64\"\n      ],\n      \"optional\": true,\n      \"os\": [\n        \"darwin\"\n      ],\n      \"engines\": {\n        \"node\": \">=18\"\n      }\n    },\n    \"node_modules/@esbuild/darwin-x64\": {\n      \"version\": \"0.28.1\",\n      \"resolved\": \"https://registry.npmmirror.com/@esbuild/darwin-x64/-/darwin-x64-0.28.1.tgz\",\n      \"integrity\": \"sha512-zfdzgK9ACBNZLI/CyHTOx81SyNbM6YXn7rxSgX97VjyiPl9W1i4Ka4fgKECEoFCKGpvBj5qArWIGgQjOwkgskQ==\",\n      \"cpu\": [\n        \"x64\"\n      ],\n      \"optional\": true,\n      \"os\": [\n        \"darwin\"\n      ],\n      \"engines\": {\n        \"node\": \">=18\"\n      }\n    },\n    \"node_modules/@esbuild/freebsd-arm64\": {\n      \"version\": \"0.28.1\",\n      \"resolved\": \"https://registry.npmmirror.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.28.1.tgz\",\n      \"integrity\": \"sha512-wG2EA8ENdEI0qhkSZMjfqrdY+ziCYCPMmtZjjIwOmXFjmyzEHn+UUxk5of+SYsjtfs3VpnlC7QLzSI5hY/rOAw==\",\n      \"cpu\": [\n        \"arm64\"\n      ],\n      \"optional\": true,\n      \"os\": [\n        \"freebsd\"\n      ],\n      \"engines\": {\n        \"node\": \">=18\"\n      }\n    },\n    \"node_modules/@esbuild/freebsd-x64\": {\n      \"version\": \"0.28.1\",\n      \"resolved\": \"https://registry.npmmirror.com/@esbuild/freebsd-x64/-/freebsd-x64-0.28.1.tgz\",\n      \"integrity\": \"sha512-i7dZ9vQgnvSCzi/rYCXNgtF/U+eKZNJBzu3eTQbRgHnM7tNSizLOkRFAl3qzVc/Op/u5YkHHa4pf/3DOYHthLQ==\",\n      \"cpu\": [\n        \"x64\"\n      ],\n      \"optional\": true,\n      \"os\": [\n        \"freebsd\"\n      ],\n      \"engines\": {\n        \"node\": \">=18\"\n      }\n    },\n    \"node_modules/@esbuild/linux-arm\": {\n      \"version\": \"0.28.1\",\n      \"resolved\": \"https://registry.npmmirror.com/@esbuild/linux-arm/-/linux-arm-0.28.1.tgz\",\n      \"integrity\": \"sha512-qVXBOHQS+d5Y722GwJzJUtOLlX7km3CraOaGormF1pDtPd2C/l1SHRPgjLunLGe51Sh5YYWKMFDyV4SxgMQYTQ==\",\n      \"cpu\": [\n        \"arm\"\n      ],\n      \"optional\": true,\n      \"os\": [\n        \"linux\"\n      ],\n      \"engines\": {\n        \"node\": \">=18\"\n      }\n    },\n    \"node_modules/@esbuild/linux-arm64\": {\n      \"version\": \"0.28.1\",\n      \"resolved\": \"https://registry.npmmirror.com/@esbuild/linux-arm64/-/linux-arm64-0.28.1.tgz\",\n      \"integrity\": \"sha512-yHs+0uc8+nvEAfAfxrWQKK5peSNzBc4PegcMO0EJ2hT71uA7vB8Ihg2e77R2P7SG5uYjPbHlLLmve4LLLRCf0g==\",\n      \"cpu\": [\n        \"arm64\"\n      ],\n      \"optional\": true,\n      \"os\": [\n        \"linux\"\n      ],\n      \"engines\": {\n        \"node\": \">=18\"\n      }\n    },\n    \"node_modules/@esbuild/linux-ia32\": {\n      \"version\": \"0.28.1\",\n      \"resolved\": \"https://registry.npmmirror.com/@esbuild/linux-ia32/-/linux-ia32-0.28.1.tgz\",\n      \"integrity\": \"sha512-d1z4ZuP0ajrfz/FhGT4vv278rX8KnPPJx8i5+AtK7TYbx9Le9F1hyzurZpkEyjkGa9dUGhQow4C1NmeGvqxN2w==\",\n      \"cpu\": [\n        \"ia32\"\n      ],\n      \"optional\": true,\n      \"os\": [\n        \"linux\"\n      ],\n      \"engines\": {\n        \"node\": \">=18\"\n      }\n    },\n    \"node_modules/@esbuild/linux-loong64\": {\n      \"version\": \"0.28.1\",\n      \"resolved\": \"https://registry.npmmirror.com/@esbuild/linux-loong64/-/linux-loong64-0.28.1.tgz\",\n      \"integrity\": \"sha512-M5sRjUVZrkm1OAPR3dlOYzNmN+loZKGVi1VUQGrwuqLcbR6qeAz+famMhjASeH3YVKvZz+zT1jlh/keC3Rj/lg==\",\n      \"cpu\": [\n        \"loong64\"\n      ],\n      \"optional\": true,\n      \"os\": [\n        \"linux\"\n      ],\n      \"engines\": {\n        \"node\": \">=18\"\n      }\n    },\n    \"node_modules/@esbuild/linux-mips64el\": {\n      \"version\": \"0.28.1\",\n      \"resolved\": \"https://registry.npmmirror.com/@esbuild/linux-mips64el/-/linux-mips64el-0.28.1.tgz\",\n      \"integrity\": \"sha512-mRObBZeHh2OxcBFPWE/FjylkRgZdYuiTR3vaTozquCGOH14iP9oN4x4Ge81CoIDYQrXmIxpFumJBu5MtZpnQJQ==\",\n      \"cpu\": [\n        \"mips64el\"\n      ],\n      \"optional\": true,\n      \"os\": [\n        \"linux\"\n      ],\n      \"engines\": {\n        \"node\": \">=18\"\n      }\n    },\n    \"node_modules/@esbuild/linux-ppc64\": {\n      \"version\": \"0.28.1\",\n      \"resolved\": \"https://registry.npmmirror.com/@esbuild/linux-ppc64/-/linux-ppc64-0.28.1.tgz\",\n      \"integrity\": \"sha512-slScBsMAb3GFDcdrCgLwZtPYRoH2H/youv10QiZyRjmsP48fznoveWytSgCI/R0ZcUgpc0ZhIUEx6LHts8yrfQ==\",\n      \"cpu\": [\n        \"ppc64\"\n      ],\n      \"optional\": true,\n      \"os\": [\n        \"linux\"\n      ],\n      \"engines\": {\n        \"node\": \">=18\"\n      }\n    },\n    \"node_modules/@esbuild/linux-riscv64\": {\n      \"version\": \"0.28.1\",\n      \"resolved\": \"https://registry.npmmirror.com/@esbuild/linux-riscv64/-/linux-riscv64-0.28.1.tgz\",\n      \"integrity\": \"sha512-kw0owk1o0GFETUJyW0jc0G4Yzs0BHZn0JDZ8JRT088vjJYX777BAs1fDGxAC+q831qOs2DTC96mNsG2opdfyyQ==\",\n      \"cpu\": [\n        \"riscv64\"\n      ],\n      \"optional\": true,\n      \"os\": [\n        \"linux\"\n      ],\n      \"engines\": {\n        \"node\": \">=18\"\n      }\n    },\n    \"node_modules/@esbuild/linux-s390x\": {\n      \"version\": \"0.28.1\",\n      \"resolved\": \"https://registry.npmmirror.com/@esbuild/linux-s390x/-/linux-s390x-0.28.1.tgz\",\n      \"integrity\": \"sha512-/lAIjX8aYFRByhh6L5rYtPEDRqa9de/4V/juOXcta5frjvzXO4/sqEtyytse0g3zZFuWu5cDN0MkLz2qRDD2Ag==\",\n      \"cpu\": [\n        \"s390x\"\n      ],\n      \"optional\": true,\n      \"os\": [\n        \"linux\"\n      ],\n      \"engines\": {\n        \"node\": \">=18\"\n      }\n    },\n    \"node_modules/@esbuild/linux-x64\": {\n      \"version\": \"0.28.1\",\n      \"resolved\": \"https://registry.npmmirror.com/@esbuild/linux-x64/-/linux-x64-0.28.1.tgz\",\n      \"integrity\": \"sha512-u/anNYF2mmVOEDwLtnQ1wOr3EZ9sTNGLWrsYGYwHWzGA3Si84IOkHXlbWTD1NB+9/1lcnweYKO54uhxZydNzfA==\",\n      \"cpu\": [\n        \"x64\"\n      ],\n      \"optional\": true,\n      \"os\": [\n        \"linux\"\n      ],\n      \"engines\": {\n        \"node\": \">=18\"\n      }\n    },\n    \"node_modules/@esbuild/netbsd-arm64\": {\n      \"version\": \"0.28.1\",\n      \"resolved\": \"https://registry.npmmirror.com/@esbuild/netbsd-arm64/-/netbsd-arm64-0.28.1.tgz\",\n      \"integrity\": \"sha512-oks0DYbLwWMmaakTsCb+zL4E+aHRVLom9IJZOAthMQEPiQmydXHkziYEsGYRx0uNV/IjEKGAV941JzH02pflqw==\",\n      \"cpu\": [\n        \"arm64\"\n      ],\n      \"optional\": true,\n      \"os\": [\n        \"netbsd\"\n      ],\n      \"engines\": {\n        \"node\": \">=18\"\n      }\n    },\n    \"node_modules/@esbuild/netbsd-x64\": {\n      \"version\": \"0.28.1\",\n      \"resolved\": \"https://registry.npmmirror.com/@esbuild/netbsd-x64/-/netbsd-x64-0.28.1.tgz\",\n      \"integrity\": \"sha512-aeL6lAnN89Hz43Mlh1G8ARasbuoYvSITDEx0tHh5b7jJnHcssqgjy9Yx430GDpmCa6OyrKoS0aNRjKundRizGg==\",\n      \"cpu\": [\n        \"x64\"\n      ],\n      \"optional\": true,\n      \"os\": [\n        \"netbsd\"\n      ],\n      \"engines\": {\n        \"node\": \">=18\"\n      }\n    },\n    \"node_modules/@esbuild/openbsd-arm64\": {\n      \"version\": \"0.28.1\",\n      \"resolved\": \"https://registry.npmmirror.com/@esbuild/openbsd-arm64/-/openbsd-arm64-0.28.1.tgz\",\n      \"integrity\": \"sha512-MEFJe5C3R8pwXdZ5Y21oo6m7ePiS0d9pWucn99O/wvyJZChoIQKrQDxKrGeW8F5+T0okTHesAmDeiHDTIq0V/Q==\",\n      \"cpu\": [\n        \"arm64\"\n      ],\n      \"optional\": true,\n      \"os\": [\n        \"openbsd\"\n      ],\n      \"engines\": {\n        \"node\": \">=18\"\n      }\n    },\n    \"node_modules/@esbuild/openbsd-x64\": {\n      \"version\": \"0.28.1\",\n      \"resolved\": \"https://registry.npmmirror.com/@esbuild/openbsd-x64/-/openbsd-x64-0.28.1.tgz\",\n      \"integrity\": \"sha512-i/ZLIOafE0Z8cI/XANJAixoJL/uRAoS2xOA3rb0xN+KK0K177cMAsQYkzHtBrtMXAKuAc7HGgcWiZ/sRC1Nxgw==\",\n      \"cpu\": [\n        \"x64\"\n      ],\n      \"optional\": true,\n      \"os\": [\n        \"openbsd\"\n      ],\n      \"engines\": {\n        \"node\": \">=18\"\n      }\n    },\n    \"node_modules/@esbuild/openharmony-arm64\": {\n      \"version\": \"0.28.1\",\n      \"resolved\": \"https://registry.npmmirror.com/@esbuild/openharmony-arm64/-/openharmony-arm64-0.28.1.tgz\",\n      \"integrity\": \"sha512-ge+Z7EXFNt2BO1oAMsVpiQ8EwndV9i1xXerAeTIK7AtPs3bKFXQM7nlRxDSIUIMeueR1CNXxqztLzdNeReKBJg==\",\n      \"cpu\": [\n        \"arm64\"\n      ],\n      \"optional\": true,\n      \"os\": [\n        \"openharmony\"\n      ],\n      \"engines\": {\n        \"node\": \">=18\"\n      }\n    },\n    \"node_modules/@esbuild/sunos-x64\": {\n      \"version\": \"0.28.1\",\n      \"resolved\": \"https://registry.npmmirror.com/@esbuild/sunos-x64/-/sunos-x64-0.28.1.tgz\",\n      \"integrity\": \"sha512-BEjgtECkL3vY+SaSQ6nzVfiALUeFxpawyp8Jmf5PtYhf1Ug40N1h/hxlhts+f1FvSvarEigdxS3BlSMI2PJLcQ==\",\n      \"cpu\": [\n        \"x64\"\n      ],\n      \"optional\": true,\n      \"os\": [\n        \"sunos\"\n      ],\n      \"engines\": {\n        \"node\": \">=18\"\n      }\n    },\n    \"node_modules/@esbuild/win32-arm64\": {\n      \"version\": \"0.28.1\",\n      \"resolved\": \"https://registry.npmmirror.com/@esbuild/win32-arm64/-/win32-arm64-0.28.1.tgz\",\n      \"integrity\": \"sha512-lCv9eK/H6ZJWbE7bh2nw54CZ9M2nupBxJcTsdk/QQnWkdSjKGuxmmH8/GWrlT1eMmZfn4dGcCjRte397WqfQXA==\",\n      \"cpu\": [\n        \"arm64\"\n      ],\n      \"optional\": true,\n      \"os\": [\n        \"win32\"\n      ],\n      \"engines\": {\n        \"node\": \">=18\"\n      }\n    },\n    \"node_modules/@esbuild/win32-ia32\": {\n      \"version\": \"0.28.1\",\n      \"resolved\": \"https://registry.npmmirror.com/@esbuild/win32-ia32/-/win32-ia32-0.28.1.tgz\",\n      \"integrity\": \"sha512-zvb/mB2bSCoJOpoCBgYKKpX6YM6mJBlBUVUtVj41DlZJVEB6/0CKlRYxP5wWl1C1ILiCoAU5wZZ4q1P3qeS6Eg==\",\n      \"cpu\": [\n        \"ia32\"\n      ],\n      \"optional\": true,\n      \"os\": [\n        \"win32\"\n      ],\n      \"engines\": {\n        \"node\": \">=18\"\n      }\n    },\n    \"node_modules/@esbuild/win32-x64\": {\n      \"version\": \"0.28.1\",\n      \"resolved\": \"https://registry.npmmirror.com/@esbuild/win32-x64/-/win32-x64-0.28.1.tgz\",\n      \"integrity\": \"sha512-bm4Mowrv+GXMlpWX++EcXw/iLyd1o3+bJkC2DkWXYVvgZCqD/bSj9ctZeAMC3cIxgjRVR2Dufaiu4YPxr5gW1A==\",\n      \"cpu\": [\n        \"x64\"\n      ],\n      \"optional\": true,\n      \"os\": [\n        \"win32\"\n      ],\n      \"engines\": {\n        \"node\": \">=18\"\n      }\n    },\n    \"node_modules/@jridgewell/gen-mapping\": {\n      \"version\": \"0.3.13\",\n      \"resolved\": \"https://registry.npmmirror.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz\",\n      \"integrity\": \"sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==\",\n      \"dependencies\": {\n        \"@jridgewell/sourcemap-codec\": \"^1.5.0\",\n        \"@jridgewell/trace-mapping\": \"^0.3.24\"\n      }\n    },\n    \"node_modules/@jridgewell/resolve-uri\": {\n      \"version\": \"3.1.2\",\n      \"resolved\": \"https://registry.npmmirror.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz\",\n      \"integrity\": \"sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==\",\n      \"engines\": {\n        \"node\": \">=6.0.0\"\n      }\n    },\n    \"node_modules/@jridgewell/source-map\": {\n      \"version\": \"0.3.11\",\n      \"resolved\": \"https://registry.npmmirror.com/@jridgewell/source-map/-/source-map-0.3.11.tgz\",\n      \"integrity\": \"sha512-ZMp1V8ZFcPG5dIWnQLr3NSI1MiCU7UETdS/A0G8V/XWHvJv3ZsFqutJn1Y5RPmAPX6F3BiE397OqveU/9NCuIA==\",\n      \"dependencies\": {\n        \"@jridgewell/gen-mapping\": \"^0.3.5\",\n        \"@jridgewell/trace-mapping\": \"^0.3.25\"\n      }\n    },\n    \"node_modules/@jridgewell/sourcemap-codec\": {\n      \"version\": \"1.5.5\",\n      \"resolved\": \"https://registry.npmmirror.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz\",\n      \"integrity\": \"sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==\"\n    },\n    \"node_modules/@jridgewell/trace-mapping\": {\n      \"version\": \"0.3.31\",\n      \"resolved\": \"https://registry.npmmirror.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz\",\n      \"integrity\": \"sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==\",\n      \"dependencies\": {\n        \"@jridgewell/resolve-uri\": \"^3.1.0\",\n        \"@jridgewell/sourcemap-codec\": \"^1.4.14\"\n      }\n    },\n    \"node_modules/@mediabunny/aac-encoder\": {\n      \"version\": \"1.50.7\",\n      \"resolved\": \"https://registry.npmmirror.com/@mediabunny/aac-encoder/-/aac-encoder-1.50.7.tgz\",\n      \"integrity\": \"sha512-8KF0w9s/fxqTp/V4Z/AHRe1BztdKaVYJy25ovdyrJdTVROhXhk65aI9/useIi0o4F7XgXxCkN7zC9LiAPCgJsg==\",\n      \"funding\": {\n        \"type\": \"individual\",\n        \"url\": \"https://github.com/sponsors/Vanilagy\"\n      },\n      \"peerDependencies\": {\n        \"mediabunny\": \"^1.0.0\"\n      }\n    },\n    \"node_modules/@mediabunny/flac-encoder\": {\n      \"version\": \"1.50.7\",\n      \"resolved\": \"https://registry.npmmirror.com/@mediabunny/flac-encoder/-/flac-encoder-1.50.7.tgz\",\n      \"integrity\": \"sha512-p1+C4vQb1+vJvqcTJNAQ0tljTG1hIm4nzQ6W7w9CIwNlJUVvD87DvXpFKNHP3lfTFpQC8gvfAeSQ1seVlEblQg==\",\n      \"funding\": {\n        \"type\": \"individual\",\n        \"url\": \"https://github.com/sponsors/Vanilagy\"\n      },\n      \"peerDependencies\": {\n        \"mediabunny\": \"^1.0.0\"\n      }\n    },\n    \"node_modules/@mediabunny/mp3-encoder\": {\n      \"version\": \"1.50.7\",\n      \"resolved\": \"https://registry.npmmirror.com/@mediabunny/mp3-encoder/-/mp3-encoder-1.50.7.tgz\",\n      \"integrity\": \"sha512-nYhphp1q9xSBRL4rhMg2yw63Krw2lAy4i7Lv6WjqWYabJayOd5ckHV7jB6Rn8A0SeqdUl5fwwia5uRJGcujNrg==\",\n      \"funding\": {\n        \"type\": \"individual\",\n        \"url\": \"https://github.com/sponsors/Vanilagy\"\n      },\n      \"peerDependencies\": {\n        \"mediabunny\": \"^1.0.0\"\n      }\n    },\n    \"node_modules/@module-federation/error-codes\": {\n      \"version\": \"0.22.0\",\n      \"resolved\": \"https://registry.npmmirror.com/@module-federation/error-codes/-/error-codes-0.22.0.tgz\",\n      \"integrity\": \"sha512-xF9SjnEy7vTdx+xekjPCV5cIHOGCkdn3pIxo9vU7gEZMIw0SvAEdsy6Uh17xaCpm8V0FWvR0SZoK9Ik6jGOaug==\"\n    },\n    \"node_modules/@module-federation/runtime\": {\n      \"version\": \"0.22.0\",\n      \"resolved\": \"https://registry.npmmirror.com/@module-federation/runtime/-/runtime-0.22.0.tgz\",\n      \"integrity\": \"sha512-38g5iPju2tPC3KHMPxRKmy4k4onNp6ypFPS1eKGsNLUkXgHsPMBFqAjDw96iEcjri91BrahG4XcdyKi97xZzlA==\",\n      \"dependencies\": {\n        \"@module-federation/error-codes\": \"0.22.0\",\n        \"@module-federation/runtime-core\": \"0.22.0\",\n        \"@module-federation/sdk\": \"0.22.0\"\n      }\n    },\n    \"node_modules/@module-federation/runtime-core\": {\n      \"version\": \"0.22.0\",\n      \"resolved\": \"https://registry.npmmirror.com/@module-federation/runtime-core/-/runtime-core-0.22.0.tgz\",\n      \"integrity\": \"sha512-GR1TcD6/s7zqItfhC87zAp30PqzvceoeDGYTgF3Vx2TXvsfDrhP6Qw9T4vudDQL3uJRne6t7CzdT29YyVxlgIA==\",\n      \"dependencies\": {\n        \"@module-federation/error-codes\": \"0.22.0\",\n        \"@module-federation/sdk\": \"0.22.0\"\n      }\n    },\n    \"node_modules/@module-federation/runtime-tools\": {\n      \"version\": \"0.22.0\",\n      \"resolved\": \"https://registry.npmmirror.com/@module-federation/runtime-tools/-/runtime-tools-0.22.0.tgz\",\n      \"integrity\": \"sha512-4ScUJ/aUfEernb+4PbLdhM/c60VHl698Gn1gY21m9vyC1Ucn69fPCA1y2EwcCB7IItseRMoNhdcWQnzt/OPCNA==\",\n      \"dependencies\": {\n        \"@module-federation/runtime\": \"0.22.0\",\n        \"@module-federation/webpack-bundler-runtime\": \"0.22.0\"\n      }\n    },\n    \"node_modules/@module-federation/sdk\": {\n      \"version\": \"0.22.0\",\n      \"resolved\": \"https://registry.npmmirror.com/@module-federation/sdk/-/sdk-0.22.0.tgz\",\n      \"integrity\": \"sha512-x4aFNBKn2KVQRuNVC5A7SnrSCSqyfIWmm1DvubjbO9iKFe7ith5niw8dqSFBekYBg2Fwy+eMg4sEFNVvCAdo6g==\"\n    },\n    \"node_modules/@module-federation/webpack-bundler-runtime\": {\n      \"version\": \"0.22.0\",\n      \"resolved\": \"https://registry.npmmirror.com/@module-federation/webpack-bundler-runtime/-/webpack-bundler-runtime-0.22.0.tgz\",\n      \"integrity\": \"sha512-aM8gCqXu+/4wBmJtVeMeeMN5guw3chf+2i6HajKtQv7SJfxV/f4IyNQJUeUQu9HfiAZHjqtMV5Lvq/Lvh8LdyA==\",\n      \"dependencies\": {\n        \"@module-federation/runtime\": \"0.22.0\",\n        \"@module-federation/sdk\": \"0.22.0\"\n      }\n    },\n    \"node_modules/@napi-rs/wasm-runtime\": {\n      \"version\": \"1.0.7\",\n      \"resolved\": \"https://registry.npmmirror.com/@napi-rs/wasm-runtime/-/wasm-runtime-1.0.7.tgz\",\n      \"integrity\": \"sha512-SeDnOO0Tk7Okiq6DbXmmBODgOAb9dp9gjlphokTUxmt8U3liIP1ZsozBahH69j/RJv+Rfs6IwUKHTgQYJ/HBAw==\",\n      \"optional\": true,\n      \"dependencies\": {\n        \"@emnapi/core\": \"^1.5.0\",\n        \"@emnapi/runtime\": \"^1.5.0\",\n        \"@tybys/wasm-util\": \"^0.10.1\"\n      }\n    },\n    \"node_modules/@remotion/bundler\": {\n      \"version\": \"4.0.487\",\n      \"resolved\": \"https://registry.npmmirror.com/@remotion/bundler/-/bundler-4.0.487.tgz\",\n      \"integrity\": \"sha512-Mn+MPYB2y6dSkxQAWPDG1ZXvycTr8G/DZT+0eIZklgntfP0a+d2+dlFHKFcwx19y0rtG+b7Eyzjf4Ui8QwSFZg==\",\n      \"dependencies\": {\n        \"@remotion/media-parser\": \"4.0.487\",\n        \"@remotion/studio\": \"4.0.487\",\n        \"@remotion/studio-shared\": \"4.0.487\",\n        \"@remotion/timeline-utils\": \"4.0.487\",\n        \"@rspack/core\": \"1.7.11\",\n        \"@rspack/plugin-react-refresh\": \"1.6.1\",\n        \"css-loader\": \"7.1.4\",\n        \"esbuild\": \"0.28.1\",\n        \"react-refresh\": \"0.18.0\",\n        \"remotion\": \"4.0.487\",\n        \"style-loader\": \"4.0.0\",\n        \"webpack\": \"5.105.0\"\n      },\n      \"peerDependencies\": {\n        \"react\": \">=16.8.0\",\n        \"react-dom\": \">=16.8.0\"\n      }\n    },\n    \"node_modules/@remotion/canvas-capture\": {\n      \"version\": \"4.0.487\",\n      \"resolved\": \"https://registry.npmmirror.com/@remotion/canvas-capture/-/canvas-capture-4.0.487.tgz\",\n      \"integrity\": \"sha512-EhOSCG/B5QNN4hiIeSoyh7QFIIIWlmuUi5j6iMxiG3//hCvez8ztO6NU0dtJCZXnr04dkq6I6RHA4Qj/HSksFw==\",\n      \"dependencies\": {\n        \"mediabunny\": \"1.50.7\",\n        \"remotion\": \"4.0.487\"\n      },\n      \"peerDependencies\": {\n        \"react\": \">=16.8.0\",\n        \"react-dom\": \">=16.8.0\"\n      }\n    },\n    \"node_modules/@remotion/cli\": {\n      \"version\": \"4.0.487\",\n      \"resolved\": \"https://registry.npmmirror.com/@remotion/cli/-/cli-4.0.487.tgz\",\n      \"integrity\": \"sha512-N9/gWsrvrHrkkpFTMjy39dRIhZm3mUtQRH5en0mqo5W0xCDHRbp+z21b5StV6bJBECyLFUpQjqkzwgsQlvE9sQ==\",\n      \"dependencies\": {\n        \"@remotion/bundler\": \"4.0.487\",\n        \"@remotion/media-utils\": \"4.0.487\",\n        \"@remotion/player\": \"4.0.487\",\n        \"@remotion/renderer\": \"4.0.487\",\n        \"@remotion/studio\": \"4.0.487\",\n        \"@remotion/studio-server\": \"4.0.487\",\n        \"@remotion/studio-shared\": \"4.0.487\",\n        \"dotenv\": \"17.3.1\",\n        \"minimist\": \"1.2.6\",\n        \"prompts\": \"2.4.2\",\n        \"remotion\": \"4.0.487\"\n      },\n      \"bin\": {\n        \"remotion\": \"remotion-cli.js\",\n        \"remotionb\": \"remotionb-cli.js\",\n        \"remotiond\": \"remotiond-cli.js\"\n      },\n      \"peerDependencies\": {\n        \"react\": \">=16.8.0\",\n        \"react-dom\": \">=16.8.0\"\n      }\n    },\n    \"node_modules/@remotion/compositor-darwin-arm64\": {\n      \"version\": \"4.0.487\",\n      \"resolved\": \"https://registry.npmmirror.com/@remotion/compositor-darwin-arm64/-/compositor-darwin-arm64-4.0.487.tgz\",\n      \"integrity\": \"sha512-lKxI+rbOt0SL7TDHNoPTHC9L2i6HXNCjivXGTdBXHIxU6a8dGAsT1k/KaubFtZww3xhKa/ubQ+yiaFUKNtZoVg==\",\n      \"cpu\": [\n        \"arm64\"\n      ],\n      \"optional\": true,\n      \"os\": [\n        \"darwin\"\n      ]\n    },\n    \"node_modules/@remotion/compositor-darwin-x64\": {\n      \"version\": \"4.0.487\",\n      \"resolved\": \"https://registry.npmmirror.com/@remotion/compositor-darwin-x64/-/compositor-darwin-x64-4.0.487.tgz\",\n      \"integrity\": \"sha512-scdI7B5CXMWIQ+YvTedCRdV2olV91fT7PF1Zzecbt+UxTDJMIiIRbJ+O4KnfjUQzEnWFytfY/2U0cnpua07I6g==\",\n      \"cpu\": [\n        \"x64\"\n      ],\n      \"optional\": true,\n      \"os\": [\n        \"darwin\"\n      ]\n    },\n    \"node_modules/@remotion/compositor-linux-arm64-gnu\": {\n      \"version\": \"4.0.487\",\n      \"resolved\": \"https://registry.npmmirror.com/@remotion/compositor-linux-arm64-gnu/-/compositor-linux-arm64-gnu-4.0.487.tgz\",\n      \"integrity\": \"sha512-ZlUJXmiMbmlMK4x+FVQ3xDgOmjyuqn4fZx18ADGF4XuKcsZEJkI4wMB14Eqx+2x+N9ZXJd6h19CJtflKCFFEMQ==\",\n      \"cpu\": [\n        \"arm64\"\n      ],\n      \"optional\": true,\n      \"os\": [\n        \"linux\"\n      ]\n    },\n    \"node_modules/@remotion/compositor-linux-arm64-musl\": {\n      \"version\": \"4.0.487\",\n      \"resolved\": \"https://registry.npmmirror.com/@remotion/compositor-linux-arm64-musl/-/compositor-linux-arm64-musl-4.0.487.tgz\",\n      \"integrity\": \"sha512-GJesTGibT/qeet6EivfKWkGE0wd4/pRP/Je8cEnjoXZ6DGye39TaTh0StzpeLAnh0GtOAeSAFhZYfgmRmrqLcQ==\",\n      \"cpu\": [\n        \"arm64\"\n      ],\n      \"optional\": true,\n      \"os\": [\n        \"linux\"\n      ]\n    },\n    \"node_modules/@remotion/compositor-linux-x64-gnu\": {\n      \"version\": \"4.0.487\",\n      \"resolved\": \"https://registry.npmmirror.com/@remotion/compositor-linux-x64-gnu/-/compositor-linux-x64-gnu-4.0.487.tgz\",\n      \"integrity\": \"sha512-8BCUsu0v3G5ZH3TaSRt+1WO5IdWu/2VuoMi1JVqyKS05sL1IWL5iApa1/7slnCYCyuJDUvHuyekWIFcZ4tHy6A==\",\n      \"cpu\": [\n        \"x64\"\n      ],\n      \"optional\": true,\n      \"os\": [\n        \"linux\"\n      ]\n    },\n    \"node_modules/@remotion/compositor-linux-x64-musl\": {\n      \"version\": \"4.0.487\",\n      \"resolved\": \"https://registry.npmmirror.com/@remotion/compositor-linux-x64-musl/-/compositor-linux-x64-musl-4.0.487.tgz\",\n      \"integrity\": \"sha512-jYqDZm4Flq1hyQpjE07W/WyVuo6VA4ENyMX43DaBpezObezqD6+7Ll6sx3J0Sxk+Wu9i672PsHP8aDz7bWdCQw==\",\n      \"cpu\": [\n        \"x64\"\n      ],\n      \"optional\": true,\n      \"os\": [\n        \"linux\"\n      ]\n    },\n    \"node_modules/@remotion/compositor-win32-x64-msvc\": {\n      \"version\": \"4.0.487\",\n      \"resolved\": \"https://registry.npmmirror.com/@remotion/compositor-win32-x64-msvc/-/compositor-win32-x64-msvc-4.0.487.tgz\",\n      \"integrity\": \"sha512-vzB5H5K2pCjyApem6tfKk1XJB7uLCHvV8L5ICqVrWDA7WhiIkKsq4tOmDV+uWH9TtcHEmddnt9s81NqXC97nNg==\",\n      \"cpu\": [\n        \"x64\"\n      ],\n      \"optional\": true,\n      \"os\": [\n        \"win32\"\n      ]\n    },\n    \"node_modules/@remotion/licensing\": {\n      \"version\": \"4.0.487\",\n      \"resolved\": \"https://registry.npmmirror.com/@remotion/licensing/-/licensing-4.0.487.tgz\",\n      \"integrity\": \"sha512-X2yUOZ76YdMVLzCet7H4C9haeAHCceCS6rHZHpuTNb011aZEwJ552AUzc0MZQ0BkWffiJMOxbAT7ImSmcICdJQ==\"\n    },\n    \"node_modules/@remotion/media-parser\": {\n      \"version\": \"4.0.487\",\n      \"resolved\": \"https://registry.npmmirror.com/@remotion/media-parser/-/media-parser-4.0.487.tgz\",\n      \"integrity\": \"sha512-X9umS/HyINqxfF22juNNgdtBierqnigFSC8gpb7IggD7ru2lL33SwlTDHgDKf3nA2UFKA558yAbXvD30FdS6ig==\"\n    },\n    \"node_modules/@remotion/media-utils\": {\n      \"version\": \"4.0.487\",\n      \"resolved\": \"https://registry.npmmirror.com/@remotion/media-utils/-/media-utils-4.0.487.tgz\",\n      \"integrity\": \"sha512-IDXP1Dt3lwJUwyyN2LuoIdb7AH1Q94HyOBr2giuTvRJ6SltdVNLDrdGE2DjMZOg2FIwUjE4BtsC0r9XZVHboiA==\",\n      \"dependencies\": {\n        \"mediabunny\": \"1.50.7\",\n        \"remotion\": \"4.0.487\"\n      },\n      \"peerDependencies\": {\n        \"react\": \">=16.8.0\",\n        \"react-dom\": \">=16.8.0\"\n      }\n    },\n    \"node_modules/@remotion/player\": {\n      \"version\": \"4.0.487\",\n      \"resolved\": \"https://registry.npmmirror.com/@remotion/player/-/player-4.0.487.tgz\",\n      \"integrity\": \"sha512-H30556hXY+hSIuTR2NatMaBo5U5YzhHsXzbQaN71fItP5/e7hE3HQoLPXAGYd9LxDbl3mjRd4URm1C4jaBAc2A==\",\n      \"dependencies\": {\n        \"remotion\": \"4.0.487\"\n      },\n      \"peerDependencies\": {\n        \"react\": \">=16.8.0\",\n        \"react-dom\": \">=16.8.0\"\n      }\n    },\n    \"node_modules/@remotion/renderer\": {\n      \"version\": \"4.0.487\",\n      \"resolved\": \"https://registry.npmmirror.com/@remotion/renderer/-/renderer-4.0.487.tgz\",\n      \"integrity\": \"sha512-URihID0oP9PP7wNwfcKg1eut4RfWd4eF7s5s9AJ8pC8lHrdLWh+QqD3OkR3GiM7w45HvMvMCIl6KAJx5ln/85Q==\",\n      \"dependencies\": {\n        \"@remotion/licensing\": \"4.0.487\",\n        \"@remotion/streaming\": \"4.0.487\",\n        \"execa\": \"5.1.1\",\n        \"remotion\": \"4.0.487\",\n        \"source-map\": \"0.8.0-beta.0\",\n        \"ws\": \"8.21.0\"\n      },\n      \"optionalDependencies\": {\n        \"@remotion/compositor-darwin-arm64\": \"4.0.487\",\n        \"@remotion/compositor-darwin-x64\": \"4.0.487\",\n        \"@remotion/compositor-linux-arm64-gnu\": \"4.0.487\",\n        \"@remotion/compositor-linux-arm64-musl\": \"4.0.487\",\n        \"@remotion/compositor-linux-x64-gnu\": \"4.0.487\",\n        \"@remotion/compositor-linux-x64-musl\": \"4.0.487\",\n        \"@remotion/compositor-win32-x64-msvc\": \"4.0.487\"\n      },\n      \"peerDependencies\": {\n        \"react\": \">=16.8.0\",\n        \"react-dom\": \">=16.8.0\"\n      }\n    },\n    \"node_modules/@remotion/streaming\": {\n      \"version\": \"4.0.487\",\n      \"resolved\": \"https://registry.npmmirror.com/@remotion/streaming/-/streaming-4.0.487.tgz\",\n      \"integrity\": \"sha512-BH7i1YXuQagAsOuhsuj7FccCYj8jriAPkaPFJ/SaApCj/yqoiUkBibY0OJ94nQbFXxDEnAuQYYd+MYanNpLUFQ==\"\n    },\n    \"node_modules/@remotion/studio\": {\n      \"version\": \"4.0.487\",\n      \"resolved\": \"https://registry.npmmirror.com/@remotion/studio/-/studio-4.0.487.tgz\",\n      \"integrity\": \"sha512-q31aGiPuHOP8FGDTdHNdc2UkEgkybSEi0cCo5OgyZOjoQVVrQz333NYrDHlgDnISuuhksksSoy0O3ugGREHhYg==\",\n      \"dependencies\": {\n        \"@jridgewell/trace-mapping\": \"0.3.31\",\n        \"@remotion/canvas-capture\": \"4.0.487\",\n        \"@remotion/media-utils\": \"4.0.487\",\n        \"@remotion/player\": \"4.0.487\",\n        \"@remotion/renderer\": \"4.0.487\",\n        \"@remotion/studio-shared\": \"4.0.487\",\n        \"@remotion/timeline-utils\": \"4.0.487\",\n        \"@remotion/web-renderer\": \"4.0.487\",\n        \"@remotion/zod-types\": \"4.0.487\",\n        \"mediabunny\": \"1.50.7\",\n        \"memfs\": \"3.4.3\",\n        \"open\": \"8.4.2\",\n        \"remotion\": \"4.0.487\",\n        \"semver\": \"7.5.3\",\n        \"zod\": \"4.3.6\"\n      },\n      \"peerDependencies\": {\n        \"react\": \">=16.8.0\",\n        \"react-dom\": \">=16.8.0\"\n      }\n    },\n    \"node_modules/@remotion/studio-server\": {\n      \"version\": \"4.0.487\",\n      \"resolved\": \"https://registry.npmmirror.com/@remotion/studio-server/-/studio-server-4.0.487.tgz\",\n      \"integrity\": \"sha512-F5/ct2R855EtQwJw9RRt4PUVGB88SbAa4cICXY37zznxSNbS0mF2/1i6kVlq18S7BskHvosVVfC1PMojGgy3+g==\",\n      \"dependencies\": {\n        \"@babel/parser\": \"7.24.1\",\n        \"@babel/types\": \"7.24.0\",\n        \"@remotion/bundler\": \"4.0.487\",\n        \"@remotion/renderer\": \"4.0.487\",\n        \"@remotion/studio-shared\": \"4.0.487\",\n        \"memfs\": \"3.4.3\",\n        \"open\": \"8.4.2\",\n        \"prettier\": \"3.8.1\",\n        \"recast\": \"0.23.11\",\n        \"remotion\": \"4.0.487\",\n        \"semver\": \"7.5.3\"\n      }\n    },\n    \"node_modules/@remotion/studio-shared\": {\n      \"version\": \"4.0.487\",\n      \"resolved\": \"https://registry.npmmirror.com/@remotion/studio-shared/-/studio-shared-4.0.487.tgz\",\n      \"integrity\": \"sha512-yW1oSiP/5Djt1rBEGb3fg6vkg5bGyjNodruT+hiw0tLkVkj4RJnenfl3nzqC0mt0xFxYMeeUtCF8vaCffkWXFg==\",\n      \"dependencies\": {\n        \"remotion\": \"4.0.487\"\n      }\n    },\n    \"node_modules/@remotion/timeline-utils\": {\n      \"version\": \"4.0.487\",\n      \"resolved\": \"https://registry.npmmirror.com/@remotion/timeline-utils/-/timeline-utils-4.0.487.tgz\",\n      \"integrity\": \"sha512-M7WzKzeJ35ni5h/inzukbbNzq5LfElW5KuM3eurj+IESU/RYhSvMgXYItD+lR1wpXA3KoQ5n7SkGGEuMgO+/uQ==\",\n      \"dependencies\": {\n        \"mediabunny\": \"1.50.7\"\n      }\n    },\n    \"node_modules/@remotion/web-renderer\": {\n      \"version\": \"4.0.487\",\n      \"resolved\": \"https://registry.npmmirror.com/@remotion/web-renderer/-/web-renderer-4.0.487.tgz\",\n      \"integrity\": \"sha512-ndmbbC+cNEQauuhoyR/rNj92wfBpNHUB2J1IBfsxSyaoDQPLmXmwDAsqnPvBip6b+pbKi7gqwOpL4gwFSTws0w==\",\n      \"dependencies\": {\n        \"@mediabunny/aac-encoder\": \"1.50.7\",\n        \"@mediabunny/flac-encoder\": \"1.50.7\",\n        \"@mediabunny/mp3-encoder\": \"1.50.7\",\n        \"@remotion/licensing\": \"4.0.487\",\n        \"mediabunny\": \"1.50.7\",\n        \"remotion\": \"4.0.487\"\n      },\n      \"peerDependencies\": {\n        \"react\": \">=18.0.0\",\n        \"react-dom\": \">=18.0.0\"\n      }\n    },\n    \"node_modules/@remotion/zod-types\": {\n      \"version\": \"4.0.487\",\n      \"resolved\": \"https://registry.npmmirror.com/@remotion/zod-types/-/zod-types-4.0.487.tgz\",\n      \"integrity\": \"sha512-dlfSVprnYFmKvYiQIKmBNk0ZvEd8b8oA07OfxSSq5/GlpefvQceFQpV3iqGR6gHAQj8E7/o305nXtgR6zxUTGg==\",\n      \"dependencies\": {\n        \"remotion\": \"4.0.487\"\n      }\n    },\n    \"node_modules/@rspack/binding\": {\n      \"version\": \"1.7.11\",\n      \"resolved\": \"https://registry.npmmirror.com/@rspack/binding/-/binding-1.7.11.tgz\",\n      \"integrity\": \"sha512-2MGdy2s2HimsDT444Bp5XnALzNRxuBNc7y0JzyuqKbHBywd4x2NeXyhWXXoxufaCFu5PBc9Qq9jyfjW2Aeh06Q==\",\n      \"optionalDependencies\": {\n        \"@rspack/binding-darwin-arm64\": \"1.7.11\",\n        \"@rspack/binding-darwin-x64\": \"1.7.11\",\n        \"@rspack/binding-linux-arm64-gnu\": \"1.7.11\",\n        \"@rspack/binding-linux-arm64-musl\": \"1.7.11\",\n        \"@rspack/binding-linux-x64-gnu\": \"1.7.11\",\n        \"@rspack/binding-linux-x64-musl\": \"1.7.11\",\n        \"@rspack/binding-wasm32-wasi\": \"1.7.11\",\n        \"@rspack/binding-win32-arm64-msvc\": \"1.7.11\",\n        \"@rspack/binding-win32-ia32-msvc\": \"1.7.11\",\n        \"@rspack/binding-win32-x64-msvc\": \"1.7.11\"\n      }\n    },\n    \"node_modules/@rspack/binding-darwin-arm64\": {\n      \"version\": \"1.7.11\",\n      \"resolved\": \"https://registry.npmmirror.com/@rspack/binding-darwin-arm64/-/binding-darwin-arm64-1.7.11.tgz\",\n      \"integrity\": \"sha512-oduECiZVqbO5zlVw+q7Vy65sJFth99fWPTyucwvLJJtJkPL5n17Uiql2cYP6Ijn0pkqtf1SXgK8WjiKLG5bIig==\",\n      \"cpu\": [\n        \"arm64\"\n      ],\n      \"optional\": true,\n      \"os\": [\n        \"darwin\"\n      ]\n    },\n    \"node_modules/@rspack/binding-darwin-x64\": {\n      \"version\": \"1.7.11\",\n      \"resolved\": \"https://registry.npmmirror.com/@rspack/binding-darwin-x64/-/binding-darwin-x64-1.7.11.tgz\",\n      \"integrity\": \"sha512-a1+TtTE9ap6RalgFi7FGIgkJP6O4Vy6ctv+9WGJy53E4kuqHR0RygzaiVxCI/GMc/vBT9vY23hyrpWb3d1vtXA==\",\n      \"cpu\": [\n        \"x64\"\n      ],\n      \"optional\": true,\n      \"os\": [\n        \"darwin\"\n      ]\n    },\n    \"node_modules/@rspack/binding-linux-arm64-gnu\": {\n      \"version\": \"1.7.11\",\n      \"resolved\": \"https://registry.npmmirror.com/@rspack/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.7.11.tgz\",\n      \"integrity\": \"sha512-P0QrGRPbTWu6RKWfN0bDtbnEps3rXH0MWIMreZABoUrVmNQKtXR6e73J3ub6a+di5s2+K0M2LJ9Bh2/H4UsDUA==\",\n      \"cpu\": [\n        \"arm64\"\n      ],\n      \"optional\": true,\n      \"os\": [\n        \"linux\"\n      ]\n    },\n    \"node_modules/@rspack/binding-linux-arm64-musl\": {\n      \"version\": \"1.7.11\",\n      \"resolved\": \"https://registry.npmmirror.com/@rspack/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.7.11.tgz\",\n      \"integrity\": \"sha512-6ky7R43VMjWwmx3Yx7Jl7faLBBMAgMDt+/bN35RgwjiPgsIByz65EwytUVuW9rikB43BGHvA/eqlnjLrUzNBqw==\",\n      \"cpu\": [\n        \"arm64\"\n      ],\n      \"optional\": true,\n      \"os\": [\n        \"linux\"\n      ]\n    },\n    \"node_modules/@rspack/binding-linux-x64-gnu\": {\n      \"version\": \"1.7.11\",\n      \"resolved\": \"https://registry.npmmirror.com/@rspack/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.7.11.tgz\",\n      \"integrity\": \"sha512-cuOJMfCOvb2Wgsry5enXJ3iT1FGUjdPqtGUBVupQlEG4ntSYsQ2PtF4wIDVasR3wdxC5nQbipOrDiN/u6fYsdQ==\",\n      \"cpu\": [\n        \"x64\"\n      ],\n      \"optional\": true,\n      \"os\": [\n        \"linux\"\n      ]\n    },\n    \"node_modules/@rspack/binding-linux-x64-musl\": {\n      \"version\": \"1.7.11\",\n      \"resolved\": \"https://registry.npmmirror.com/@rspack/binding-linux-x64-musl/-/binding-linux-x64-musl-1.7.11.tgz\",\n      \"integrity\": \"sha512-CoK37hva4AmHGh3VCsQXmGr40L36m1/AdnN5LEjUX6kx5rEH7/1nEBN6Ii72pejqDVvk9anEROmPDiPw10tpFg==\",\n      \"cpu\": [\n        \"x64\"\n      ],\n      \"optional\": true,\n      \"os\": [\n        \"linux\"\n      ]\n    },\n    \"node_modules/@rspack/binding-wasm32-wasi\": {\n      \"version\": \"1.7.11\",\n      \"resolved\": \"https://registry.npmmirror.com/@rspack/binding-wasm32-wasi/-/binding-wasm32-wasi-1.7.11.tgz\",\n      \"integrity\": \"sha512-OtrmnPUVJMxjNa3eDMfHyPdtlLRmmp/aIm0fQHlAOATbZvlGm12q7rhPW5BXTu1yh+1rQ1/uqvz+SzKEZXuJaQ==\",\n      \"cpu\": [\n        \"wasm32\"\n      ],\n      \"optional\": true,\n      \"dependencies\": {\n        \"@napi-rs/wasm-runtime\": \"1.0.7\"\n      }\n    },\n    \"node_modules/@rspack/binding-win32-arm64-msvc\": {\n      \"version\": \"1.7.11\",\n      \"resolved\": \"https://registry.npmmirror.com/@rspack/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.7.11.tgz\",\n      \"integrity\": \"sha512-lObFW6e5lCWNgTBNwT//yiEDbsxm9QG4BYUojqeXxothuzJ/L6ibXz6+gLMvbOvLGV3nKgkXmx8GvT9WDKR0mA==\",\n      \"cpu\": [\n        \"arm64\"\n      ],\n      \"optional\": true,\n      \"os\": [\n        \"win32\"\n      ]\n    },\n    \"node_modules/@rspack/binding-win32-ia32-msvc\": {\n      \"version\": \"1.7.11\",\n      \"resolved\": \"https://registry.npmmirror.com/@rspack/binding-win32-ia32-msvc/-/binding-win32-ia32-msvc-1.7.11.tgz\",\n      \"integrity\": \"sha512-0pYGnZd8PPqNR68zQ8skamqNAXEA1sUfXuAdYcknIIRq2wsbiwFzIc0Pov1cIfHYab37G7sSIPBiOUdOWF5Ivw==\",\n      \"cpu\": [\n        \"ia32\"\n      ],\n      \"optional\": true,\n      \"os\": [\n        \"win32\"\n      ]\n    },\n    \"node_modules/@rspack/binding-win32-x64-msvc\": {\n      \"version\": \"1.7.11\",\n      \"resolved\": \"https://registry.npmmirror.com/@rspack/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.7.11.tgz\",\n      \"integrity\": \"sha512-EeQXayoQk/uBkI3pdoXfQBXNIUrADq56L3s/DFyM2pJeUDrWmhfIw2UFIGkYPTMSCo8F2JcdcGM32FGJrSnU0Q==\",\n      \"cpu\": [\n        \"x64\"\n      ],\n      \"optional\": true,\n      \"os\": [\n        \"win32\"\n      ]\n    },\n    \"node_modules/@rspack/core\": {\n      \"version\": \"1.7.11\",\n      \"resolved\": \"https://registry.npmmirror.com/@rspack/core/-/core-1.7.11.tgz\",\n      \"integrity\": \"sha512-rsD9b+Khmot5DwCMiB3cqTQo53ioPG3M/A7BySu8+0+RS7GCxKm+Z+mtsjtG/vsu4Tn2tcqCdZtA3pgLoJB+ew==\",\n      \"dependencies\": {\n        \"@module-federation/runtime-tools\": \"0.22.0\",\n        \"@rspack/binding\": \"1.7.11\",\n        \"@rspack/lite-tapable\": \"1.1.0\"\n      },\n      \"engines\": {\n        \"node\": \">=18.12.0\"\n      },\n      \"peerDependencies\": {\n        \"@swc/helpers\": \">=0.5.1\"\n      },\n      \"peerDependenciesMeta\": {\n        \"@swc/helpers\": {\n          \"optional\": true\n        }\n      }\n    },\n    \"node_modules/@rspack/lite-tapable\": {\n      \"version\": \"1.1.0\",\n      \"resolved\": \"https://registry.npmmirror.com/@rspack/lite-tapable/-/lite-tapable-1.1.0.tgz\",\n      \"integrity\": \"sha512-E2B0JhYFmVAwdDiG14+DW0Di4Ze4Jg10Pc4/lILUrd5DRCaklduz2OvJ5HYQ6G+hd+WTzqQb3QnDNfK4yvAFYw==\"\n    },\n    \"node_modules/@rspack/plugin-react-refresh\": {\n      \"version\": \"1.6.1\",\n      \"resolved\": \"https://registry.npmmirror.com/@rspack/plugin-react-refresh/-/plugin-react-refresh-1.6.1.tgz\",\n      \"integrity\": \"sha512-eqqW5645VG3CzGzFgNg5HqNdHVXY+567PGjtDhhrM8t67caxmsSzRmT5qfoEIfBcGgFkH9vEg7kzXwmCYQdQDw==\",\n      \"dependencies\": {\n        \"error-stack-parser\": \"^2.1.4\",\n        \"html-entities\": \"^2.6.0\"\n      },\n      \"peerDependencies\": {\n        \"react-refresh\": \">=0.10.0 <1.0.0\",\n        \"webpack-hot-middleware\": \"2.x\"\n      },\n      \"peerDependenciesMeta\": {\n        \"webpack-hot-middleware\": {\n          \"optional\": true\n        }\n      }\n    },\n    \"node_modules/@tybys/wasm-util\": {\n      \"version\": \"0.10.3\",\n      \"resolved\": \"https://registry.npmmirror.com/@tybys/wasm-util/-/wasm-util-0.10.3.tgz\",\n      \"integrity\": \"sha512-F3fo1MYrRJYL3zER0OUOmkutjr1Vp23m7OsSgp7nq4SP6OqX6C/56XFIPAl5bt3zaBRjmW7SGz3u/6LwFpYcOg==\",\n      \"optional\": true,\n      \"dependencies\": {\n        \"tslib\": \"^2.4.0\"\n      }\n    },\n    \"node_modules/@types/dom-mediacapture-transform\": {\n      \"version\": \"0.1.12\",\n      \"resolved\": \"https://registry.npmmirror.com/@types/dom-mediacapture-transform/-/dom-mediacapture-transform-0.1.12.tgz\",\n      \"integrity\": \"sha512-d7/QsLRwF864A5mgIM/YrfiglHoYn7zgCcAoJgW404r+2DwnNr7EBbLnCWpmOMgH8y0te73L1AV6H1bmauaWFw==\",\n      \"dependencies\": {\n        \"@types/dom-webcodecs\": \"*\"\n      }\n    },\n    \"node_modules/@types/dom-webcodecs\": {\n      \"version\": \"0.1.13\",\n      \"resolved\": \"https://registry.npmmirror.com/@types/dom-webcodecs/-/dom-webcodecs-0.1.13.tgz\",\n      \"integrity\": \"sha512-O5hkiFIcjjszPIYyUSyvScyvrBoV3NOEEZx/pMlsu44TKzWNkLVBBxnxJz42in5n3QIolYOcBYFCPZZ0h8SkwQ==\"\n    },\n    \"node_modules/@types/eslint\": {\n      \"version\": \"9.6.1\",\n      \"resolved\": \"https://registry.npmmirror.com/@types/eslint/-/eslint-9.6.1.tgz\",\n      \"integrity\": \"sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag==\",\n      \"dependencies\": {\n        \"@types/estree\": \"*\",\n        \"@types/json-schema\": \"*\"\n      }\n    },\n    \"node_modules/@types/eslint-scope\": {\n      \"version\": \"3.7.7\",\n      \"resolved\": \"https://registry.npmmirror.com/@types/eslint-scope/-/eslint-scope-3.7.7.tgz\",\n      \"integrity\": \"sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==\",\n      \"dependencies\": {\n        \"@types/eslint\": \"*\",\n        \"@types/estree\": \"*\"\n      }\n    },\n    \"node_modules/@types/estree\": {\n      \"version\": \"1.0.9\",\n      \"resolved\": \"https://registry.npmmirror.com/@types/estree/-/estree-1.0.9.tgz\",\n      \"integrity\": \"sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==\"\n    },\n    \"node_modules/@types/json-schema\": {\n      \"version\": \"7.0.15\",\n      \"resolved\": \"https://registry.npmmirror.com/@types/json-schema/-/json-schema-7.0.15.tgz\",\n      \"integrity\": \"sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==\"\n    },\n    \"node_modules/@types/node\": {\n      \"version\": \"24.10.11\",\n      \"resolved\": \"https://registry.npmmirror.com/@types/node/-/node-24.10.11.tgz\",\n      \"integrity\": \"sha512-/Af7O8r1frCVgOz0I62jWUtMohJ0/ZQU/ZoketltOJPZpnb17yoNc9BSoVuV9qlaIXJiPNOpsfq4ByFajSArNQ==\",\n      \"dependencies\": {\n        \"undici-types\": \"~7.16.0\"\n      }\n    },\n    \"node_modules/@types/react\": {\n      \"version\": \"19.2.14\",\n      \"resolved\": \"https://registry.npmmirror.com/@types/react/-/react-19.2.14.tgz\",\n      \"integrity\": \"sha512-ilcTH/UniCkMdtexkoCN0bI7pMcJDvmQFPvuPvmEaYA/NSfFTAgdUSLAoVjaRJm7+6PvcM+q1zYOwS4wTYMF9w==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"csstype\": \"^3.2.2\"\n      }\n    },\n    \"node_modules/@types/react-dom\": {\n      \"version\": \"19.2.3\",\n      \"resolved\": \"https://registry.npmmirror.com/@types/react-dom/-/react-dom-19.2.3.tgz\",\n      \"integrity\": \"sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ==\",\n      \"dev\": true,\n      \"peerDependencies\": {\n        \"@types/react\": \"^19.2.0\"\n      }\n    },\n    \"node_modules/@webassemblyjs/ast\": {\n      \"version\": \"1.14.1\",\n      \"resolved\": \"https://registry.npmmirror.com/@webassemblyjs/ast/-/ast-1.14.1.tgz\",\n      \"integrity\": \"sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==\",\n      \"dependencies\": {\n        \"@webassemblyjs/helper-numbers\": \"1.13.2\",\n        \"@webassemblyjs/helper-wasm-bytecode\": \"1.13.2\"\n      }\n    },\n    \"node_modules/@webassemblyjs/floating-point-hex-parser\": {\n      \"version\": \"1.13.2\",\n      \"resolved\": \"https://registry.npmmirror.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.13.2.tgz\",\n      \"integrity\": \"sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA==\"\n    },\n    \"node_modules/@webassemblyjs/helper-api-error\": {\n      \"version\": \"1.13.2\",\n      \"resolved\": \"https://registry.npmmirror.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.13.2.tgz\",\n      \"integrity\": \"sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ==\"\n    },\n    \"node_modules/@webassemblyjs/helper-buffer\": {\n      \"version\": \"1.14.1\",\n      \"resolved\": \"https://registry.npmmirror.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.14.1.tgz\",\n      \"integrity\": \"sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA==\"\n    },\n    \"node_modules/@webassemblyjs/helper-numbers\": {\n      \"version\": \"1.13.2\",\n      \"resolved\": \"https://registry.npmmirror.com/@webassemblyjs/helper-numbers/-/helper-numbers-1.13.2.tgz\",\n      \"integrity\": \"sha512-FE8aCmS5Q6eQYcV3gI35O4J789wlQA+7JrqTTpJqn5emA4U2hvwJmvFRC0HODS+3Ye6WioDklgd6scJ3+PLnEA==\",\n      \"dependencies\": {\n        \"@webassemblyjs/floating-point-hex-parser\": \"1.13.2\",\n        \"@webassemblyjs/helper-api-error\": \"1.13.2\",\n        \"@xtuc/long\": \"4.2.2\"\n      }\n    },\n    \"node_modules/@webassemblyjs/helper-wasm-bytecode\": {\n      \"version\": \"1.13.2\",\n      \"resolved\": \"https://registry.npmmirror.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.13.2.tgz\",\n      \"integrity\": \"sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA==\"\n    },\n    \"node_modules/@webassemblyjs/helper-wasm-section\": {\n      \"version\": \"1.14.1\",\n      \"resolved\": \"https://registry.npmmirror.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.14.1.tgz\",\n      \"integrity\": \"sha512-ds5mXEqTJ6oxRoqjhWDU83OgzAYjwsCV8Lo/N+oRsNDmx/ZDpqalmrtgOMkHwxsG0iI//3BwWAErYRHtgn0dZw==\",\n      \"dependencies\": {\n        \"@webassemblyjs/ast\": \"1.14.1\",\n        \"@webassemblyjs/helper-buffer\": \"1.14.1\",\n        \"@webassemblyjs/helper-wasm-bytecode\": \"1.13.2\",\n        \"@webassemblyjs/wasm-gen\": \"1.14.1\"\n      }\n    },\n    \"node_modules/@webassemblyjs/ieee754\": {\n      \"version\": \"1.13.2\",\n      \"resolved\": \"https://registry.npmmirror.com/@webassemblyjs/ieee754/-/ieee754-1.13.2.tgz\",\n      \"integrity\": \"sha512-4LtOzh58S/5lX4ITKxnAK2USuNEvpdVV9AlgGQb8rJDHaLeHciwG4zlGr0j/SNWlr7x3vO1lDEsuePvtcDNCkw==\",\n      \"dependencies\": {\n        \"@xtuc/ieee754\": \"^1.2.0\"\n      }\n    },\n    \"node_modules/@webassemblyjs/leb128\": {\n      \"version\": \"1.13.2\",\n      \"resolved\": \"https://registry.npmmirror.com/@webassemblyjs/leb128/-/leb128-1.13.2.tgz\",\n      \"integrity\": \"sha512-Lde1oNoIdzVzdkNEAWZ1dZ5orIbff80YPdHx20mrHwHrVNNTjNr8E3xz9BdpcGqRQbAEa+fkrCb+fRFTl/6sQw==\",\n      \"dependencies\": {\n        \"@xtuc/long\": \"4.2.2\"\n      }\n    },\n    \"node_modules/@webassemblyjs/utf8\": {\n      \"version\": \"1.13.2\",\n      \"resolved\": \"https://registry.npmmirror.com/@webassemblyjs/utf8/-/utf8-1.13.2.tgz\",\n      \"integrity\": \"sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ==\"\n    },\n    \"node_modules/@webassemblyjs/wasm-edit\": {\n      \"version\": \"1.14.1\",\n      \"resolved\": \"https://registry.npmmirror.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.14.1.tgz\",\n      \"integrity\": \"sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ==\",\n      \"dependencies\": {\n        \"@webassemblyjs/ast\": \"1.14.1\",\n        \"@webassemblyjs/helper-buffer\": \"1.14.1\",\n        \"@webassemblyjs/helper-wasm-bytecode\": \"1.13.2\",\n        \"@webassemblyjs/helper-wasm-section\": \"1.14.1\",\n        \"@webassemblyjs/wasm-gen\": \"1.14.1\",\n        \"@webassemblyjs/wasm-opt\": \"1.14.1\",\n        \"@webassemblyjs/wasm-parser\": \"1.14.1\",\n        \"@webassemblyjs/wast-printer\": \"1.14.1\"\n      }\n    },\n    \"node_modules/@webassemblyjs/wasm-gen\": {\n      \"version\": \"1.14.1\",\n      \"resolved\": \"https://registry.npmmirror.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.14.1.tgz\",\n      \"integrity\": \"sha512-AmomSIjP8ZbfGQhumkNvgC33AY7qtMCXnN6bL2u2Js4gVCg8fp735aEiMSBbDR7UQIj90n4wKAFUSEd0QN2Ukg==\",\n      \"dependencies\": {\n        \"@webassemblyjs/ast\": \"1.14.1\",\n        \"@webassemblyjs/helper-wasm-bytecode\": \"1.13.2\",\n        \"@webassemblyjs/ieee754\": \"1.13.2\",\n        \"@webassemblyjs/leb128\": \"1.13.2\",\n        \"@webassemblyjs/utf8\": \"1.13.2\"\n      }\n    },\n    \"node_modules/@webassemblyjs/wasm-opt\": {\n      \"version\": \"1.14.1\",\n      \"resolved\": \"https://registry.npmmirror.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.14.1.tgz\",\n      \"integrity\": \"sha512-PTcKLUNvBqnY2U6E5bdOQcSM+oVP/PmrDY9NzowJjislEjwP/C4an2303MCVS2Mg9d3AJpIGdUFIQQWbPds0Sw==\",\n      \"dependencies\": {\n        \"@webassemblyjs/ast\": \"1.14.1\",\n        \"@webassemblyjs/helper-buffer\": \"1.14.1\",\n        \"@webassemblyjs/wasm-gen\": \"1.14.1\",\n        \"@webassemblyjs/wasm-parser\": \"1.14.1\"\n      }\n    },\n    \"node_modules/@webassemblyjs/wasm-parser\": {\n      \"version\": \"1.14.1\",\n      \"resolved\": \"https://registry.npmmirror.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.14.1.tgz\",\n      \"integrity\": \"sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ==\",\n      \"dependencies\": {\n        \"@webassemblyjs/ast\": \"1.14.1\",\n        \"@webassemblyjs/helper-api-error\": \"1.13.2\",\n        \"@webassemblyjs/helper-wasm-bytecode\": \"1.13.2\",\n        \"@webassemblyjs/ieee754\": \"1.13.2\",\n        \"@webassemblyjs/leb128\": \"1.13.2\",\n        \"@webassemblyjs/utf8\": \"1.13.2\"\n      }\n    },\n    \"node_modules/@webassemblyjs/wast-printer\": {\n      \"version\": \"1.14.1\",\n      \"resolved\": \"https://registry.npmmirror.com/@webassemblyjs/wast-printer/-/wast-printer-1.14.1.tgz\",\n      \"integrity\": \"sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw==\",\n      \"dependencies\": {\n        \"@webassemblyjs/ast\": \"1.14.1\",\n        \"@xtuc/long\": \"4.2.2\"\n      }\n    },\n    \"node_modules/@xtuc/ieee754\": {\n      \"version\": \"1.2.0\",\n      \"resolved\": \"https://registry.npmmirror.com/@xtuc/ieee754/-/ieee754-1.2.0.tgz\",\n      \"integrity\": \"sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==\"\n    },\n    \"node_modules/@xtuc/long\": {","readmeExcerpt":"Skill: 叙事手绘故事视频 Owner: tobewin Summary: 面向中文成语故事的多场景手绘同步短视频完整制作流程 Tags: latest:0.1.0 Version history: v0.1.0 | 2026-08-26T05:59:05.096Z | auto - Initial release of narrated-handdrawn-story-video. - Create high-quality Chinese story short videos with multi-scene hand-drawn visuals, synchronized Qwen3-TTS narration, subtitles, and licensed background music. - Automatic generation of opening poster with title, category,","codeSnippets":[],"executableExamples":[{"language":"bash","snippet":"python3 scripts/run_story_video.py \\\n  --images /absolute/01.jpg /absolute/02.jpg \\\n  --title \"故事标题\" \\\n  --mode preview \\\n  --transition cut"},{"language":"bash","snippet":"python3 scripts/run_story_video.py \\\n  --images /absolute/01.jpg /absolute/02.jpg \\\n  --title \"故事标题\" \\\n  --mode full \\\n  --transition cut \\\n  --page-duration 4.4"},{"language":"bash","snippet":"python3 scripts/run_story_video.py \\\n  --images /absolute/01.jpg /absolute/02.jpg \\\n  --title \"故事标题\" \\\n  --mode full \\\n  --transition page-flip \\\n  --transition-sec 0.7"},{"language":"bash","snippet":"python3 scripts/run_story_video.py --input /absolute/story.txt --title \"故事标题\" --mode plan"},{"language":"bash","snippet":"python3 scripts/run_story_video.py --input /absolute/story.txt --title \"故事标题\" --mode generate\npython3 scripts/run_story_video.py --mode import\npython3 scripts/run_story_video.py --mode render"},{"language":"bash","snippet":"STORY_VIDEO_PROJECT=/absolute/project \\\n   python3 /Users/bingo/.codex/skills/story-to-handdrawn-video/scripts/run_story_video.py \\\n     --input /absolute/story.txt --title \"故事标题\" --visual-plan /absolute/visual-plan.json --mode generate"}],"parameters":null,"dependencies":[],"permissions":[],"extractedFiles":[{"path":"renderer/skill-package/story-to-handdrawn-video/SKILL.md","content":"---\nname: story-to-handdrawn-video\ndescription: Convert Chinese story copy or ordered local images into a hand-drawn diary-comic animation with handwritten captions, left-to-right black-and-white-to-color reveals, optional page-flip transitions, safe uncropped framing, and a silent Remotion picture track.\n---\n\n# Story to Hand-drawn Video\n\nUse the project renderer through this Skill's `scripts/run_story_video.py`. Set `STORY_VIDEO_PROJECT` when the project is not the current working directory. The wrapper must not rely on an author-specific absolute path.\n\n## Workflow\n\n1. Accept inline Chinese story text, a UTF-8 text file, or ordered local images.\n2. Preserve the user's wording. For text input, keep one complete sentence as one beat by default and split only long compound sentences at natural narrative turns.\n3. For uploaded composite pages, automatically crop the handwritten caption and illustration, then derive an aligned black-and-white plate locally.\n4. In direct-cut mode, keep the order `text → bw_full → color`; reveal every stage from left to right.\n5. In page-flip mode, preserve the untouched uploaded master and show it statically before curling the page from the bottom-right corner. Do not add caption, black-and-white, or recoloring stages. Retain a faded version of the source page on the paper underside.\n6. Keep all illustration marks inside the white safe border. Use contained framing and never `cover` cropping.\n7. Produce a silent MP4. Voiceover and optional BGM are post-production tasks.\n8. Report the scene count, duration, output path, and whether the result is plan-only, preview, or final.\n\n## Uploaded images\n\nPreview:\n\n```bash\npython3 scripts/run_story_video.py \\\n  --images /absolute/01.jpg /absolute/02.jpg \\\n  --title \"故事标题\" \\\n  --mode preview \\\n  --transition cut\n```\n\nFinal direct-cut render:\n\n```bash\npython3 scripts/run_story_video.py \\\n  --images /absolute/01.jpg /absolute/02.jpg \\\n  --title \"故事标题\" \\\n  --mode full \\\n  --transition cut \\\n  --page-duration 4.4\n```\n\nFinal page-flip render:\n\n```bash\npython3 scripts/run_story_video.py \\\n  --images /absolute/01.jpg /absolute/02.jpg \\\n  --title \"故事标题\" \\\n  --mode full \\\n  --transition page-flip \\\n  --transition-sec 0.7\n```\n\nUse `--layout auto|composite|full` to control how uploaded pages are interpreted.\n\n## Story text\n\nPlan without generating images:\n\n```bash\npython3 scripts/run_story_video.py --input /absolute/story.txt --title \"故事标题\" --mode plan\n```\n\nPrepare Codex Image2 jobs, then import and render:\n\n```bash\npython3 scripts/run_story_video.py --input /absolute/story.txt --title \"故事标题\" --mode generate\npython3 scripts/run_story_video.py --mode import\npython3 scripts/run_story_video.py --mode render\n```\n\nUse `--generator codex` by default. Use `--generator api` only when the user explicitly selects the API fallback and `OPENAI_API_KEY` is available. Use `--force` only when the user explicitly wants an existing generated batch replaced.\n\nFor time jumps, ambiguous pronouns, medical scen"},{"path":"SKILL.md","content":"---\nname: narrated-handdrawn-story-video\ndescription: \"Create polished Chinese story short videos from story text or ordered illustrations: story-specific multi-scene colored hand-drawn visuals, a text-led opening poster, sentence-synchronous local Qwen3-TTS narration with optional character voices, subtitles, and licensed BGM mixed beneath narration. Use for idiom stories, children's stories, history explainers, or any Chinese narrated hand-drawn short-video request where visual variety and audio-text synchronization matter.\"\n---\n\n# Narrated Hand-drawn Story Video\n\nUse the installed `story-to-handdrawn-video` renderer for the picture track, then produce narration and the final mix. This is a quality-first workflow: never substitute one illustration across all story beats.\n\n## Required outcome\n\n- Create an opening poster (normally 3 seconds) with a legible Chinese title, category/tag, concise synopsis, and one takeaway; reserve uncluttered image space for this text. Render the complete image-and-text cover at frame 0; never fade its text in after the video begins.\n- Turn the story into 8–18 narrative beats. For every beat, define setting, action, characters, emotion, and an exact subtitle/narration sentence before generating artwork.\n- Generate or source a distinct scene illustration for every beat. Build multi-panel source art only as a generation convenience, then crop it into one image per beat.\n- Keep character identity, era, palette, and framing consistent with the project's actual output ratio. Read `project.width` and `project.height` from the storyboard before prompting for art; the current renderer defaults to 1080×1440 (3:4), not 9:16. Use `contain` only after the source image has been normalized to the same ratio.\n- Generate one local Qwen3-TTS segment per subtitle from that exact string. Use distinct voice-design instructions for narrator and named speaking characters. Derive the scene duration from the resulting audio; do not write narration separately from captions.\n- Obtain BGM from a source whose license permits the intended use. Preserve the source URL, author, and license in an attribution text file next to the deliverable.\n- Mix BGM softly and duck it under speech. Delay narration by the poster duration. Export a playable H.264/AAC MP4.\n\n## Workflow\n\n1. Write `story.txt` and a two-digit-keyed `visual-plan.json`. Split only at natural narrative turns; resolve pronouns and time jumps in the plan. Keep `caption` and `narration` identical for each scene.\n2. Use the existing renderer wrapper to plan/generate/import the scene images. Set `STORY_VIDEO_PROJECT` to the cloned Remotion project when needed:\n\n   ```bash\n   STORY_VIDEO_PROJECT=/absolute/project \\\n   python3 /Users/bingo/.codex/skills/story-to-handdrawn-video/scripts/run_story_video.py \\\n     --input /absolute/story.txt --title \"故事标题\" --visual-plan /absolute/visual-plan.json --mode generate\n   ```\n\n3. Generate images with the image-generation tool. Prompt for exact story act"},{"path":"README.md","content":"# Narrated Hand-drawn Story Video\n\nAn agent-native pipeline for Chinese idiom, history, and children's-story shorts. It turns a story into a vertical 3:4 video with story-specific colored scenes, a complete opening poster at frame 0, local Qwen3-TTS character voices, synchronized captions, and ducked licensed BGM.\n\n## Actual output preview\n\nThe image below is the real first frame from the included workflow's **“纳土归宋”** output—not a concept mockup. Its title, category, synopsis, and takeaway are programmatically overlaid by the renderer from frame 0.\n\n<p align=\"center\">\n  <img src=\"docs/assets/natuguisong-opening-poster.jpg\" alt=\"纳土归宋：实际成片首帧预览\" width=\"360\" />\n</p>\n\nThis repository packages an enhanced workflow around a bundled, MIT-licensed copy of [`gnipbao/story-to-handdrawn-video`](https://github.com/gnipbao/story-to-handdrawn-video). The original copyright and license are retained in [`renderer/LICENSE`](renderer/LICENSE).\n\n## What is included\n\n- `SKILL.md`: the agent contract for high-quality story-video production.\n- `renderer/`: a 1080×1440 Remotion renderer with scene-reveal animation and generic `opening_poster` support.\n- `scripts/synthesize_qwen3.py`: local Qwen3-TTS multi-role voice-plan synthesis.\n- `scripts/check_cover_ratio.py`: rejects cover/video aspect-ratio mismatches.\n- `scripts/mix_story_audio.py`: poster-delayed narration plus side-chain-ducked BGM.\n\n## Quality rules\n\n1. Every story beat needs a different, story-specific illustration.\n2. Caption text and synthesized speech are exactly the same sentence.\n3. The cover is displayed from frame 0 and includes tag, title, synopsis, and takeaway.\n4. The cover asset must use the exact video aspect ratio; the validator rejects a mismatch.\n5. Local Qwen3-TTS is the default. Online Edge TTS is not required.\n6. BGM requires a usable license and an attribution file alongside the output.\n\n## Install\n\n```bash\ngit clone https://github.com/ToBeWin/narrated-handdrawn-story-video.git\ncd narrated-handdrawn-story-video/renderer\nnpm ci\nnpm run check\n\n# Optional: local Qwen3-TTS runtime\npython3 -m venv ../.venv\n../.venv/bin/pip install -r ../requirements-qwen3.txt\n```\n\n## Storyboard opening poster\n\nPut a normalized 1080×1440 poster image in `renderer/public/assets/posters/`, then add this to `renderer/storyboard.json`:\n\n```json\n{\n  \"opening_poster\": {\n    \"asset\": \"assets/posters/story-opening.png\",\n    \"duration_sec\": 3,\n    \"tag\": \"历史故事 · 五代十国\",\n    \"title\": \"纳土归宋\",\n    \"synopsis\": \"吴越王钱俶为何献出十三州，\\n让江南归入大宋？\",\n    \"takeaway\": \"减少战乱，守护百姓安宁\"\n  }\n}\n```\n\nRun `npm run check` before rendering. It verifies that the first-frame poster uses the same ratio as the video canvas.\n\n## Local Qwen3 multi-role voices\n\nThe voice-plan schema has one segment per caption. Use narrator and speaking-character entries independently:\n\n```bash\n.venv/bin/python scripts/synthesize_qwen3.py examples/qwen3-voice-plan.json renderer/public --allow-download\n```\n\nEach segment generates a local WAV under `renderer/public/`; measure "},{"path":"renderer/README.md","content":"# story-to-handdrawn-video\n\n[中文](#中文) | [English](#english)\n\n[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](LICENSE)\n\n---\n\n## 中文\n\n把中文故事文案或一组有序的手绘图片,转换成 3:4 竖屏**手绘日记漫画动画**:手写体字幕、从左到右的「文字 → 黑白画稿 → 彩色插画」揭示、可选的右下角卷页翻书转场、安全不裁剪的画面构图。基于 [Remotion](https://www.remotion.dev/),默认输出无配音、无音乐的 H.264 画面轨,方便后期配音。\n\n本仓库包含两部分:\n\n- **渲染器项目**(根目录):Remotion 工程,负责实际的分镜、动效和渲染。\n- **Codex / Agent Skill**(`skill-package/`):可分发的 Skill,装进 Codex 等 Agent 后用自然语言驱动渲染器,无需手动跑脚本。\n\n### 功能特性\n\n- 中文故事自动分句和动态分镜,保留原文措辞\n- 上传漫画页或完整图片,保持原顺序和构图\n- 自动拆分上方文字区与下方插画区\n- 本地生成与彩色插画对齐的黑白层\n- `文字 → 黑白画稿 → 彩色插画` 从左到右揭示\n- 可选右下角卷页翻书转场(纸背保留淡化的原页纹理)\n- 1080×1440 正式渲染和 720×960 快速预览\n- Codex Image2 工作流,以及显式选择的 OpenAI API 工作流\n\n### 环境要求\n\n- Node.js 20 或更高版本\n- Python 3.10 或更高版本\n- FFmpeg,且 `ffmpeg`、`ffprobe` 可从终端调用\n- npm\n- Google Chrome,或由 Remotion 管理的兼容浏览器\n- 支持 Skill 的 Agent 运行时(Codex、Claude Code、Kimi Code 等)\n\n### 安装\n\n1. 准备渲染器项目:\n\n```bash\ngit clone https://github.com/gnipbao/story-to-handdrawn-video.git\ncd story-to-handdrawn-video\nnpm ci\nnpm run check      # TypeScript 检查 + 分镜结构校验,不访问网络\n```\n\n2. 把 Skill 装进 Agent 的 skills 目录:\n\n```bash\n# Codex\ncp -R skill-package/story-to-handdrawn-video ~/.codex/skills/\n\n# Claude Code / 通用 Agent\ncp -R skill-package/story-to-handdrawn-video ~/.claude/skills/\n\n# Kimi Code\ncp -R skill-package/story-to-handdrawn-video ~/.agents/skills/\n```\n\n3. 告诉 Skill 渲染器项目在哪里(在渲染器项目目录内运行 Agent 时可省略):\n\n```bash\nexport STORY_VIDEO_PROJECT=/absolute/path/to/story-to-handdrawn-video\n```\n\n### 使用方法(Codex Skill 示例)\n\n装好 Skill 后,全部通过自然语言驱动,分句、分镜、图片生成、导入、渲染由 Agent 按 Skill 约定自动完成。\n\n**故事文本 → 手绘动画**(Skill 的默认提示词):\n\n```text\n使用 $story-to-handdrawn-video 把这段故事生成可后期配音的手绘动画。\n\n<在这里粘贴故事文本>\n```\n\n也可以把故事放在 UTF-8 文本文件里:\n\n```text\n使用 $story-to-handdrawn-video 把 /absolute/story.txt 生成手绘动画,标题叫「纸上的夏天」。\n```\n\n**上传图片 → 手绘动画**(图片按播放顺序给出):\n\n```text\n使用 $story-to-handdrawn-video 把这几张图片按顺序生成手绘动画:\n/absolute/01.jpg /absolute/02.jpg /absolute/03.jpg\n```\n\n**翻书效果**(保留原始页面,从右下角卷页):\n\n```text\n使用 $story-to-handdrawn-video 把这些图片做成翻书效果的手绘动画:\n/absolute/01.jpg /absolute/02.jpg\n```\n\n**先出预览**(720×960,确认效果后再出正式版):\n\n```text\n使用 $story-to-handdrawn-video 先给这个故事生成一个预览版。\n```\n\n使用建议:\n\n- 故事文本默认一个完整句子一个节拍;想控制节奏,直接在故事里按句分行即可。\n- 遇到时间跳跃、指代不明、医疗场景或年龄敏感角色时,建议先让 Agent 给出视觉规划(两位场景编号为键的 JSON),确认后再生成。\n- 默认使用 Codex Image2 生成图片;只有明确要求时才会走 OpenAI API(需 `OPENAI_API_KEY`)。\n- 输出是静音画面轨,配音和 BGM 属于后期工作。\n\n### 输出契约\n\n| 输入 | 模式 | 输出路径 |\n| --- | --- | --- |\n| 故事文本 | 正式 | `out/picture_silent.mp4` |\n| 故事文本 | 预览 | `out/picture_silent-preview.mp4` |\n| 上传图片 | 正式 | `out/uploaded_picture_silent.mp4` |\n| 上传图片 | 预览 | `out/uploaded_picture_silent-preview.mp4` |\n\n- 分辨率:正式 1080×1440,预览 720×960\n- 编码:H.264,静音\n\nSkill 的完整行为约定见 [skill-package/story-to-handdrawn-video/SKILL.md](skill-package/story-to-handdrawn-video/SKILL.md)。\n\n### 项目结构\n\n```text\n.\n├── src/                    # Remotion 组件(场景、擦除动效、翻页、缓动)\n├── scripts/                # 渲染器入口与导入/校验/打包脚本(由 Skill 调用)\n├── skill-package/          # 可分发的 Codex / Agent Skill\n├── examples/               # 示例故事文本\n├── references/             # "},{"path":"_meta.json","content":"{\n  \"ownerId\": \"kn75z6gevjsyrznm7dg2ez6sen82h8sz\",\n  \"slug\": \"narrated-handdrawn-story-video\",\n  \"version\": \"0.1.0\",\n  \"publishedAt\": 1787723945096\n}"}],"languages":[],"docsSourceLabel":"CLAWHUB","editorialOverview":"面向中文成语故事的多场景手绘同步短视频完整制作流程 Skill: 叙事手绘故事视频 Owner: tobewin Summary: 面向中文成语故事的多场景手绘同步短视频完整制作流程 Tags: latest:0.1.0 Version history: v0.1.0 | 2026-08-26T05:59:05.096Z | auto - Initial release of narrated-handdrawn-story-video. - Create high-quality Chinese story short videos with multi-scene hand-drawn visuals, synchronized Qwen3-TTS narration, subtitles, and licensed background music. - Automatic generation of opening poster with title, category,","editorialQuality":{"score":100,"threshold":65,"status":"ready","wordCount":1589,"uniquenessScore":45,"reasons":[]}},"media":{"evidence":{"source":"no-media","verified":false,"confidence":"low","updatedAt":"2026-10-11T11:47:07.368Z","emptyReason":"No screenshots, media assets, or demo links are available."},"primaryImageUrl":null,"mediaAssetCount":0,"assets":[],"demoUrl":null},"ownerResources":{"evidence":{"source":"unclaimed","verified":false,"confidence":"low","updatedAt":"2026-10-11T11:47:07.368Z","emptyReason":"This page has not been claimed by the agent owner."},"hasCustomPage":false,"customPageUpdatedAt":null,"customLinks":[],"structuredLinks":{"docsUrl":null,"demoUrl":null,"supportUrl":null,"pricingUrl":null,"statusUrl":null},"customPage":null},"relatedAgents":{"evidence":{"source":"protocol-neighbors","verified":false,"confidence":"medium","updatedAt":"2026-10-11T14:17:09.794Z","emptyReason":null},"items":[{"id":"8ebccd8e-3863-4187-8355-c3f14e1f9edf","entityType":"agent","canonicalPath":"/agent/iofficeai-aionui","slug":"iofficeai-aionui","name":"AionUi","description":"Free, local, open-source 24/7 Cowork app and OpenClaw for Gemini CLI, Claude Code, Codex, OpenCode, Qwen Code, Goose CLI, Auggie, and more | 🌟 Star if you like it!","url":"https://github.com/iOfficeAI/AionUi","homepage":"https://www.aionui.com","source":"GITHUB_REPOS","protocols":["MCP","OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-10-09T19:11:12.944Z","createdAt":"2026-02-25T03:38:16.584Z","downloads":null},{"id":"b917f68a-ebff-438e-84f8-3f4b2494c0bc","entityType":"agent","canonicalPath":"/agent/activepieces-activepieces","slug":"activepieces-activepieces","name":"activepieces","description":"AI Agents & MCPs & AI Workflow Automation • (~400 MCP servers for AI agents) • AI Automation / AI Agent with MCPs • AI Workflows & AI Agents • MCPs for AI Agents","url":"https://github.com/activepieces/activepieces","homepage":"https://www.activepieces.com","source":"GITHUB_REPOS","protocols":["OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-04-15T02:22:12.426Z","createdAt":"2026-02-25T03:38:12.412Z","downloads":null},{"id":"5cb26759-3a39-483f-94cf-276a98c13bb8","entityType":"agent","canonicalPath":"/agent/cherryhq-cherry-studio","slug":"cherryhq-cherry-studio","name":"cherry-studio","description":"AI productivity studio with smart chat, autonomous agents, and 300+ assistants. Unified access to frontier LLMs","url":"https://github.com/CherryHQ/cherry-studio","homepage":"https://cherry-ai.com","source":"GITHUB_REPOS","protocols":["MCP","OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-04-11T14:38:40.986Z","createdAt":"2026-02-25T03:38:19.379Z","downloads":null},{"id":"6f6582d0-5d76-4f0f-b81d-86520247950b","entityType":"agent","canonicalPath":"/agent/copilotkit-copilotkit","slug":"copilotkit-copilotkit","name":"CopilotKit","description":"The Frontend for Agents & Generative UI. React + Angular","url":"https://github.com/CopilotKit/CopilotKit","homepage":"https://docs.copilotkit.ai","source":"GITHUB_REPOS","protocols":["OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-03-25T09:50:57.846Z","createdAt":"2026-02-25T03:39:14.617Z","downloads":null}],"links":{"hub":"/agent","source":"/agent/source/clawhub","protocols":[{"label":"OpenClaw","href":"/agent/protocol/openclew"}]}}}