From 0a93b2416e4136ae0c19955009783a5123a23da1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?ACT=E4=B8=B6=E6=B5=81=E6=98=9F=E9=9B=A8?= <1340145680@qq.com> Date: Fri, 30 Jan 2026 14:34:09 +0800 Subject: [PATCH] no message --- README.md | 240 +++++++++++++++++++++++-- docs/README.en.md | 343 ++++++++++++++++++++++++++++------- docs/chat6QR.jpg | Bin 0 -> 314001 bytes docs/sponsored/sophnet.png | Bin 0 -> 758 bytes docs/videoCover.png | Bin 0 -> 103125 bytes docs/videoQR.png | Bin 0 -> 4964 bytes package.json | 2 +- scripts/web/index.html | 358 +++++++++++++++++++------------------ 8 files changed, 679 insertions(+), 264 deletions(-) create mode 100644 docs/chat6QR.jpg create mode 100644 docs/sponsored/sophnet.png create mode 100644 docs/videoCover.png create mode 100644 docs/videoQR.png diff --git a/README.md b/README.md index a362dfb..55d3ae1 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,13 @@ +
+
中文 |
English
@@ -60,7 +70,23 @@ Toonflow 是一款 AI 工具,能够利用 AI 技术将小说自动转化为剧
---
-# 🚀 安装与使用指南
+# 🔰 使用指南
+
+## 📺 视频教程
+
+https://www.bilibili.com/video/BV1na6wB6Ea2
+[](https://www.bilibili.com/video/BV1na6wB6Ea2)
+
+**Toonflow 8 分钟快速上手 AI 视频**
+👉 [点击观看](https://www.bilibili.com/video/BV1na6wB6Ea2/?share_source=copy_web&vd_source=5b718c25439a901a34c7bc0c1d35b38e)
+
+📱 手机微信扫码观看
+
+
+
+---
+
+# 🚀 安装
## 前置条件
@@ -74,11 +100,11 @@ Toonflow 是一款 AI 工具,能够利用 AI 技术将小说自动转化为剧
### 1. 下载与安装
-| 操作系统 | 下载链接 | 说明 |
-| :------: | :------------------------------------------------------- | :----------------------- |
-| Windows | [Release](https://github.com/HBAI-Ltd/Toonflow-app/releases) | 官方发布安装包,点击下载 |
-| Linux | ⚙️ 敬请期待 | 即将发布,请持续关注 |
-| macOS | ⚙️ 敬请期待 | 即将发布,请持续关注 |
+| 操作系统 | GitHub 下载 | Gitee 下载(国内推荐) | 说明 |
+| :------: | :----------------------------------------------------------- | :---------------------------------------------------------- | :------------- |
+| Windows | [Release](https://github.com/HBAI-Ltd/Toonflow-app/releases) | [Release](https://gitee.com/HBAI-Ltd/Toonflow-app/releases) | 官方发布安装包 |
+| Linux | ⚙️ 敬请期待 | ⚙️ 敬请期待 | 即将发布 |
+| macOS | ⚙️ 敬请期待 | ⚙️ 敬请期待 | 即将发布 |
> 注意:目前仅支持 Windows 版本,其他系统将陆续开放。
@@ -86,9 +112,106 @@ Toonflow 是一款 AI 工具,能够利用 AI 技术将小说自动转化为剧
安装完成后,启动程序即可开始使用本服务。
+> ⚠️ **首次登录**
+> 账号:`admin`
+> 密码:`admin123`
+
## 云端部署
-云端安装及部署教程正在整理中,敬请期待。
+### 一、服务器环境要求
+
+- **系统**:Ubuntu 20.04+ / CentOS 7+
+- **Node.js**:23.11.1+
+- **内存**:1GB+
+
+### 二、服务器部署
+
+#### 1. 安装环境
+
+```bash
+# 安装 Node.js
+curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh | bash
+source ~/.bashrc
+nvm install 24
+# 安装 Yarn 和 PM2
+npm install -g yarn pm2
+```
+
+#### 2. 部署项目
+
+**从 GitHub 克隆:**
+
+```bash
+cd /opt
+git clone https://github.com/HBAI-Ltd/Toonflow-app.git
+cd Toonflow-app
+yarn install
+yarn build
+```
+
+**从 Gitee 克隆(国内推荐):**
+
+```bash
+cd /opt
+git clone https://gitee.com/HBAI-Ltd/Toonflow-app.git
+cd Toonflow-app
+yarn install
+yarn build
+```
+
+#### 3. 配置 PM2
+
+创建 `pm2.json` 文件:
+
+```json
+{
+ "name": "toonflow-app",
+ "script": "build/app.js",
+ "instances": "max",
+ "exec_mode": "cluster",
+ "env": {
+ "NODE_ENV": "prod",
+ "PORT": 60000,
+ "OSSURL": "http://127.0.0.1:60000/"
+ }
+}
+```
+
+**环境变量说明:**
+
+| 变量 | 说明 |
+| ---------- | ---------------------------------- |
+| `NODE_ENV` | 运行环境,`prod` 表示生产环境 |
+| `PORT` | 服务监听端口 |
+| `OSSURL` | 文件存储访问地址,用于静态资源访问 |
+
+---
+
+#### 4. 启动服务
+
+```bash
+pm2 start pm2.json
+pm2 startup
+pm2 save
+```
+
+#### 5. 常用命令
+
+```bash
+pm2 list # 查看进程
+pm2 logs toonflow-app # 查看日志
+pm2 restart all # 重启服务
+pm2 monit # 监控面板
+```
+
+#### 6. 部署前端网站
+
+如需单独部署或定制前端界面,请参考前端仓库:
+
+- **GitHub**:[Toonflow-web](https://github.com/HBAI-Ltd/Toonflow-web)
+- **Gitee**:[Toonflow-web](https://gitee.com/HBAI-Ltd/Toonflow-web)
+
+> 💡 **说明**:本仓库已内置编译好的前端资源,普通用户无需单独部署前端。前端仓库仅供需要二次开发的开发者使用。
---
@@ -101,7 +224,23 @@ Toonflow 是一款 AI 工具,能够利用 AI 技术将小说自动转化为剧
## 快速启动项目
-1. **安装依赖**
+1. **克隆项目**
+
+ **从 GitHub 克隆:**
+
+ ```bash
+ git clone https://github.com/HBAI-Ltd/Toonflow-app.git
+ cd Toonflow-app
+ ```
+
+ **从 Gitee 克隆(国内推荐):**
+
+ ```bash
+ git clone https://gitee.com/HBAI-Ltd/Toonflow-app.git
+ cd Toonflow-app
+ ```
+
+2. **安装依赖**
请先在项目根目录下执行以下命令以安装依赖项:
@@ -109,7 +248,7 @@ Toonflow 是一款 AI 工具,能够利用 AI 技术将小说自动转化为剧
yarn install
```
-2. **启动开发环境**
+3. **启动开发环境**
- 使用 Node.js 运行开发服务:
@@ -123,7 +262,7 @@ Toonflow 是一款 AI 工具,能够利用 AI 技术将小说自动转化为剧
yarn bun:dev #端口60000
```
-3. **项目打包**
+4. **项目打包**
- 编译并生成 TypeScript 文件:
@@ -137,7 +276,7 @@ Toonflow 是一款 AI 工具,能够利用 AI 技术将小说自动转化为剧
yarn dist:win
```
-4. **代码质量检查**
+5. **代码质量检查**
- 进行全局语法和规范检查:
@@ -145,11 +284,21 @@ Toonflow 是一款 AI 工具,能够利用 AI 技术将小说自动转化为剧
yarn lint
```
+## 前端开发
+
+如需修改前端界面,请前往前端仓库进行开发:
+
+- **GitHub**:[Toonflow-web](https://github.com/HBAI-Ltd/Toonflow-web)
+- **Gitee**:[Toonflow-web](https://gitee.com/HBAI-Ltd/Toonflow-web)
+
+前端构建后,将 `dist` 目录内容复制到本项目的 `scripts/web` 目录即可集成。
+
## 项目结构
```
📂 docs/ # 文档资源
📂 scripts/ # 构建脚本与静态资源
+│ └─ 📂 web/ # 前端编译产物(内置)
📂 src/
├─ 📂 agents/ # AI Agent 模块
├─ 📂 lib/ # 公共库(数据库初始化、响应格式)
@@ -186,6 +335,17 @@ Toonflow 是一款 AI 工具,能够利用 AI 技术将小说自动转化为剧
---
+# 🔗 相关仓库
+
+| 仓库 | 说明 | GitHub | Gitee |
+| ---------------- | ---------------------------------- | -------------------------------------------------- | ------------------------------------------------ |
+| **Toonflow-app** | 完整客户端(本仓库,推荐普通用户) | [GitHub](https://github.com/HBAI-Ltd/Toonflow-app) | [Gitee](https://gitee.com/HBAI-Ltd/Toonflow-app) |
+| **Toonflow-web** | 前端源代码(适合前端开发者) | [GitHub](https://github.com/HBAI-Ltd/Toonflow-web) | [Gitee](https://gitee.com/HBAI-Ltd/Toonflow-web) |
+
+> 💡 **提示**:如果您只是想使用 Toonflow,直接下载本仓库的客户端即可。前端仓库仅供需要二次开发或定制前端界面的开发者使用。
+
+---
+
# 📝 开发计划
我们正持续优化产品,以下为近期开发重点:
@@ -207,6 +367,31 @@ Toonflow 是一款 AI 工具,能够利用 AI 技术将小说自动转化为剧
---
+# 👨👩👧👦 微信交流群
+
+~~交流群 1~~
+
+~~交流群 2~~
+
+~~交流群 3~~
+
+~~交流群 4~~
+
+~~交流群 5~~
+
+交流群 6:
+
+
+
使用微信扫码添加,二维码过期可提交 Issues 提醒更新
+ +--- + +# 💌 联系我们 + +📧 邮箱:[ltlctools@outlook.com](mailto:ltlctools@outlook.com?subject=Toonflow咨询) + +--- + # 📜 许可证 Toonflow 基于 AGPL-3.0 协议开源发布,许可证详情:https://www.gnu.org/licenses/agpl-3.0.html @@ -217,16 +402,37 @@ Toonflow 基于 AGPL-3.0 协议开源发布,许可证详情:https://www.gnu. --- -# 💌 联系我们 +# ⭐️ 星标历史 -📧 邮箱:[ltlctools@outlook.com](mailto:ltlctools@outlook.com?subject=Toonflow咨询) +[](https://www.star-history.com/#HBAI-Ltd/Toonflow-app&type=date&legend=top-left) --- -# ⭐️ 星标历史 +# 🙏 致谢 -[](https://star-history.com/#HBAI-Ltd/Toonflow-app&Date) +感谢以下开源项目为 Toonflow 提供强大支持: -# 第三方依赖清单 +- [Express](https://expressjs.com/) - 快速、开放、极简的 Node.js Web 框架 +- [LangChain](https://js.langchain.com/) - 构建 LLM 应用的开发框架 +- [Better-SQLite3](https://github.com/WiseLibs/better-sqlite3) - 高性能 SQLite3 绑定库 +- [Sharp](https://sharp.pixelplumbing.com/) - 高性能 Node.js 图像处理库 +- [Axios](https://axios-http.com/) - 基于 Promise 的 HTTP 客户端 +- [Zod](https://zod.dev/) - TypeScript 优先的模式验证库 +- [Aigne](https://github.com/aigne-com/aigne) - LLM API 统一管理与接入中间件 +- [Electron](https://www.electronjs.org/) - 跨平台桌面应用开发框架 -请查阅`NOTICES.txt` +感谢以下组织/单位/个人为 Toonflow 提供支持: + +|
+ |
+ + 算能云 提供算力赞助 + [官网] + | +
中文 |
English
@@ -13,9 +23,9 @@
AI Short Drama Factory
- Turn novels into episodes with just a tap!
+ Turn novels into episodes with a tap!
- AI Script × AI Visuals × Rapid Generation 🔥
+ AI Script × AI Imagery × Lightning-fast Generation 🔥
@@ -30,100 +40,229 @@
- > 🚀 **One-stop Short Drama Production**: From text to characters, from storyboards to videos, zero-barrier full-process AI automation, boosting creative efficiency by 10x+! + > 🚀 **One-stop Short Drama Workflow**: From text to character, storyboard to video, a full AI-powered process with zero threshold, boosting creative efficiency by 10x+! --- # 🌟 Main Features -Toonflow is an AI tool that leverages AI technology to automatically convert novels into scripts, combined with AI-generated images and videos for efficient short drama creation. With Toonflow, you can easily complete the entire workflow from text to visuals, making short drama production smarter and more convenient. +Toonflow is an AI tool that leverages AI technology to automatically turn novels into scripts, then uses AI to generate images and videos for efficient short drama production. With Toonflow, you can easily accomplish the entire workflow from text to visuals, making short drama creation more intelligent and convenient. - ✅ **Character Generation** - Automatically analyzes original novel text, intelligently identifies and generates character settings including appearance, personality, identity, and other detailed information, providing a reliable foundation for subsequent script and visual creation. + Automatically analyzes the original novel text, intelligently recognizes and generates character profiles, including appearance, personality, identity, etc., providing a reliable foundation for subsequent script and image creation. - ✅ **Script Generation** - Based on selected events and chapters, the system automatically generates structured scripts covering dialogue, scene descriptions, and plot progression, achieving efficient conversion from literary text to film scripts. -- ✅ **Storyboard Production** - Based on script content, intelligently generates storyboard prompts and visual designs, detailing foreground, midground, background, character dynamics, prop settings, and scene layouts. Automatically generates storyboards from scripts, providing a complete blueprint for video production. + Based on selected events and chapters, the system automatically generates structured scripts, covering dialogue, scene descriptions, and plot direction, enabling an efficient transition from literary text to screenplay. +- ✅ **Storyboard Creation** + According to the script content, it intelligently generates storyboard prompts and visual designs, detailing foreground, middle ground, background, character movements, props, and scene layouts. Automatically produces storyboards from the script, providing a comprehensive blueprint for video production. - ✅ **Video Synthesis** - Integrates AI image and video technology, enabling AI-generated video clips. Incorporates online editing with support for personalized output adjustments, making film production efficient and streamlined. + Integrates AI image and video techniques, supporting generation of video clips via AI. With built-in online editing, supports personalized adjustments and outputs, making filmmaking highly collaborative and efficient. --- # 📦 Application Scenarios -- Short video content creation -- Novel-to-film experimentation +- Short video content production +- Novel-to-film experiments - AI Literary Adaptation Tools - Script development and rapid prototyping - Video material generation --- -# 🚀 Installation and Usage Guide +# 🔰 User Guide + +## 📺 Video Tutorial + +https://www.bilibili.com/video/BV1na6wB6Ea2 +[](https://www.bilibili.com/video/BV1na6wB6Ea2) + +**Toonflow 8-Minute Quick Start AI Video** +👉 [Click to watch](https://www.bilibili.com/video/BV1na6wB6Ea2/?share_source=copy_web&vd_source=5b718c25439a901a34c7bc0c1d35b38e) + +📱 Watch via WeChat QR scan + +
+
+---
+
+# 🚀 Installation
## Prerequisites
Before installing and using this software, please prepare the following:
-- ✅ Large Language Model AI service API endpoint.
-- ✅ Sora or Doubao video service API endpoint
-- ✅ Nano Banana Pro image generation model service API endpoint
+- ✅ Large Language Model AI service endpoint.
+- ✅ Sora or Doubao video service endpoint
+- ✅ Nano Banana Pro image generation model service endpoint
## Local Installation
-### 1. Download and Install
+### 1. Download & Install
-| Operating System | Download Link | Description |
-| :--------------: | :------------------------------------------------------------ | :------------------------------ |
-| Windows | [Release](https://github.com/HBAI-Ltd/Toonflow-app/releases) | Official release package, click to download |
-| Linux | ⚙️ Coming Soon | Coming soon, stay tuned |
-| macOS | ⚙️ Coming Soon | Coming soon, stay tuned |
+| Operating System | GitHub Download | Gitee Download (Recommended for China) | Note |
+| :--------------: | :------------------------------------------------------ | :---------------------------------------------------------- | :----------------- |
+| Windows | [Release](https://github.com/HBAI-Ltd/Toonflow-app/releases) | [Release](https://gitee.com/HBAI-Ltd/Toonflow-app/releases) | Official installer |
+| Linux | ⚙️ Coming soon | ⚙️ Coming soon | To be released |
+| macOS | ⚙️ Coming soon | ⚙️ Coming soon | To be released |
-> Note: Currently only Windows version is supported, other systems will be available soon.
+> Note: Currently, only Windows is supported. Other systems will be gradually supported.
-### 2. Start Service
+### 2. Launch the Service
-After installation, launch the program to start using the service.
+After installation, start the program to use the service.
+
+> ⚠️ **First login**
+> Account: `admin`
+> Password: `admin123`
## Cloud Deployment
-Cloud installation and deployment tutorials are being prepared, stay tuned.
+### I. Server Requirements
+
+- **OS**: Ubuntu 20.04+ / CentOS 7+
+- **Node.js**: 23.11.1+
+- **RAM**: 1GB+
+
+### II. Server Deployment
+
+#### 1. Install the Environment
+
+```bash
+# Install Node.js
+curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh | bash
+source ~/.bashrc
+nvm install 24
+# Install Yarn & PM2
+npm install -g yarn pm2
+```
+
+#### 2. Deploy the Project
+
+**Clone from GitHub:**
+
+```bash
+cd /opt
+git clone https://github.com/HBAI-Ltd/Toonflow-app.git
+cd Toonflow-app
+yarn install
+yarn build
+```
+
+**Clone from Gitee (recommended in China):**
+
+```bash
+cd /opt
+git clone https://gitee.com/HBAI-Ltd/Toonflow-app.git
+cd Toonflow-app
+yarn install
+yarn build
+```
+
+#### 3. Configure PM2
+
+Create a `pm2.json` file:
+
+```json
+{
+ "name": "toonflow-app",
+ "script": "build/app.js",
+ "instances": "max",
+ "exec_mode": "cluster",
+ "env": {
+ "NODE_ENV": "prod",
+ "PORT": 60000,
+ "OSSURL": "http://127.0.0.1:60000/"
+ }
+}
+```
+
+**Environment Variable Description:**
+
+| Variable | Description |
+| ------------ | ------------------------------------------- |
+| `NODE_ENV` | Runtime environment, `prod` means production|
+| `PORT` | Service listening port |
+| `OSSURL` | File storage access address for static files|
---
-# 🔧 Development Process Guide
+#### 4. Start the Service
-## Development Environment Setup
+```bash
+pm2 start pm2.json
+pm2 startup
+pm2 save
+```
-- **Node.js**: Version 23.11.1 or above required
-- **Yarn**: Recommended as the project package manager
+#### 5. Common Commands
-## Quick Start
+```bash
+pm2 list # List processes
+pm2 logs toonflow-app # View logs
+pm2 restart all # Restart all services
+pm2 monit # Monitoring panel
+```
-1. **Install Dependencies**
+#### 6. Deploy the Frontend Website
- Please first run the following command in the project root directory to install dependencies:
+To deploy or customize the frontend separately, refer to the frontend repo:
+
+- **GitHub**: [Toonflow-web](https://github.com/HBAI-Ltd/Toonflow-web)
+- **Gitee**: [Toonflow-web](https://gitee.com/HBAI-Ltd/Toonflow-web)
+
+> 💡 **Note**: This repo includes pre-compiled frontend assets; regular users don’t need to deploy frontend separately. The frontend repo is for developers needing secondary development.
+
+---
+
+# 🔧 Development Workflow Guide
+
+## Development Environment Preparation
+
+- **Node.js**: Version 23.11.1+
+- **Yarn**: Recommended package manager
+
+## Quick Project Startup
+
+1. **Clone the project**
+
+ **From GitHub:**
+
+ ```bash
+ git clone https://github.com/HBAI-Ltd/Toonflow-app.git
+ cd Toonflow-app
+ ```
+
+ **From Gitee (china):**
+
+ ```bash
+ git clone https://gitee.com/HBAI-Ltd/Toonflow-app.git
+ cd Toonflow-app
+ ```
+
+2. **Install Dependencies**
+
+ Run the following in the root directory:
```bash
yarn install
```
-2. **Start Development Environment**
+3. **Start Development Server**
- - Run development service with Node.js:
+ - Launch dev server with Node.js:
```bash
yarn dev #port 60000
```
- - Run development service quickly with Bun:
+ - Use Bun to quickly start dev server:
```bash
yarn bun:dev #port 60000
```
-3. **Project Build**
+4. **Build the Project**
- Compile and generate TypeScript files:
@@ -131,32 +270,42 @@ Cloud installation and deployment tutorials are being prepared, stay tuned.
yarn build
```
- - Package as Windows platform executable:
+ - Package as a Windows executable:
```bash
yarn dist:win
```
-4. **Code Quality Check**
+5. **Code Quality Check**
- - Perform global syntax and standard checks:
+ - Lint globally for syntax and style:
```bash
yarn lint
```
+## Frontend Development
+
+To modify the frontend, go to the frontend repo:
+
+- **GitHub**: [Toonflow-web](https://github.com/HBAI-Ltd/Toonflow-web)
+- **Gitee**: [Toonflow-web](https://gitee.com/HBAI-Ltd/Toonflow-web)
+
+After building the frontend, copy the contents of the `dist` folder into this project’s `scripts/web` directory for integration.
+
## Project Structure
```
-📂 docs/ # Documentation resources
+📂 docs/ # Documentation
📂 scripts/ # Build scripts and static resources
+│ └─ 📂 web/ # Embedded frontend build output
📂 src/
├─ 📂 agents/ # AI Agent modules
-├─ 📂 lib/ # Common libraries (database initialization, response format)
+├─ 📂 lib/ # Shared libs (DB init, response format)
├─ 📂 middleware/ # Middleware
-├─ 📂 routes/ # Route modules
+├─ 📂 routes/ # Routing modules
│ ├─ 📂 assets/ # Asset management
-│ ├─ 📂 index/ # Homepage
+│ ├─ 📂 index/ # Home page
│ ├─ 📂 novel/ # Novel management
│ ├─ 📂 other/ # Other features
│ ├─ 📂 outline/ # Outline management
@@ -170,63 +319,121 @@ Cloud installation and deployment tutorials are being prepared, stay tuned.
│ └─ 📂 video/ # Video generation
├─ 📂 types/ # TypeScript type declarations
├─ 📂 utils/ # Utility functions
-├─ 📄 app.ts # Application entry
-├─ 📄 core.ts # Route core
-├─ 📄 env.ts # Environment variable handling
+├─ 📄 app.ts # App entry point
+├─ 📄 core.ts # Routing core
+├─ 📄 env.ts # Env variable handling
├─ 📄 err.ts # Error handling
├─ 📄 router.ts # Route registration
-└─ 📄 utils.ts # General utilities
-📂 uploads/ # Upload file directory
+└─ 📄 utils.ts # Common tools
+📂 uploads/ # Uploads
📄 LICENSE # License
-📄 NOTICES.txt # Third-party dependency declarations
-📄 package.json # Project configuration
+📄 NOTICES.txt # 3rd-party notices
+📄 package.json # Project config
📄 README.md # Project description
-📄 tsconfig.json # TypeScript configuration
+📄 tsconfig.json # TypeScript config
```
---
+# 🔗 Related Repos
+
+| Repository | Description | GitHub | Gitee |
+| ----------------- | ------------------------------------- | -------------------------------------------------- | ------------------------------------------------ |
+| **Toonflow-app** | Full client (this repo, for users) | [GitHub](https://github.com/HBAI-Ltd/Toonflow-app) | [Gitee](https://gitee.com/HBAI-Ltd/Toonflow-app) |
+| **Toonflow-web** | Frontend source (for devs) | [GitHub](https://github.com/HBAI-Ltd/Toonflow-web) | [Gitee](https://gitee.com/HBAI-Ltd/Toonflow-web) |
+
+> 💡 **Tip**: If you just want to use Toonflow, download the client from this repo. The web repo is only for frontend customization/development.
+
+---
+
# 📝 Development Roadmap
-We are continuously optimizing the product. Here are the recent development priorities:
+We continue to optimize the product. Key focuses for the near future:
-1. Core Feature Upgrades
+1. Core Function Upgrades
-- `🧩 Prompt Enhancement Generation Agent` AI-powered intelligent video prompt enhancement, automatic storyboard script decomposition, supporting multi-shot intelligent fusion and smooth transitions
-- `📄 Multi-format Text Support` Extending intelligent parsing beyond novels to scripts, comic scripts, game dialogue texts, and other formats
+- `🧩 Prompt Refinement Agent` AI-enhanced prompt generation for videos, auto-parsing storyboards, intelligent multi-shot fusion and smooth transitions
+- `📄 Multi-format Text Support` Extending to scripts, manga scripts, game dialogue text, and more formats beyond novels
-2. Production Workflow Optimization
+2. Production Flow Optimization
-- `👗 Character Costume and Props Management` Strengthen costume, makeup, and prop consistency for long-form content, supporting multi-episode associated memory and automatic outfit generation
-- `📦 Batch Processing/Task Queue` Support multi-chapter simultaneous processing, background task management, real-time progress monitoring, and interruption recovery
+- `👗 Character Costume & Props Management` Improved consistency for costumes, makeup, props across long content, support for multi-episode memory and auto costume generation
+- `📦 Batch Processing/Task Queues` Process multiple chapters at once, backend task management, real-time monitoring and resume-on-interrupt
3. Visual Generation Enhancement
-- `🎭 Multi-style Template Library` Built-in multiple visual style packages, supporting one-click style conversion and user-defined style saving
-- `⏱️ Intelligent Rhythm Analysis/Optimization` Analyze plot emotion curves, automatically suggest climax points and rhythm changes, optimize storyboard arrangement and production workflow
+- `🎭 Multi-style Template Library` Bundled visual style packs, one-click style swap, user-defined style saving
+- `⏱️ Intelligent Rhythm Analysis/Optimization` Analyze plot emotional arcs, auto-suggest climaxes and pace changes, optimized storyboard workflow
---
-# 📜 License
+# 👨👩👧👦 WeChat Discussion Groups
-Toonflow is open-sourced under the AGPL-3.0 license. License details: https://www.gnu.org/licenses/agpl-3.0.html
+~~Group 1~~
-You may use Toonflow for various purposes including commercial use, in compliance with the terms and conditions of AGPL-3.0.
+~~Group 2~~
-For proprietary commercial licenses exempt from AGPL-3.0 restrictions, please contact us via email.
+~~Group 3~~
+
+~~Group 4~~
+
+~~Group 5~~
+
+Group 6:
+
+
+Scan with WeChat to join. If the QR expires, open an issue to request an update.
--- # 💌 Contact Us -📧 Email: [ltlctools@outlook.com](mailto:ltlctools@outlook.com?subject=Toonflow Inquiry) +📧 Email: [ltlctools@outlook.com](mailto:ltlctools@outlook.com?subject=Toonflow%20Inquiry) + +--- + +# 📜 License + +Toonflow is open source under the AGPL-3.0 license. Details: https://www.gnu.org/licenses/agpl-3.0.html + +You may use Toonflow for any purpose, including commercial, as long as you adhere to the AGPL-3.0 terms and conditions. + +For proprietary/commercial licensing exempt from AGPL-3.0, please contact us by email. --- # ⭐️ Star History -[](https://star-history.com/#HBAI-Ltd/Toonflow-app&Date) +[](https://www.star-history.com/#HBAI-Ltd/Toonflow-app&type=date&legend=top-left) -# Third-party Dependency List +--- + +# 🙏 Special Thanks + +Thanks to the following open-source projects for empowering Toonflow: + +- [Express](https://expressjs.com/) – Fast, open, minimal Node.js web framework +- [LangChain](https://js.langchain.com/) – Framework for building LLM apps +- [Better-SQLite3](https://github.com/WiseLibs/better-sqlite3) – High-performance SQLite3 bindings +- [Sharp](https://sharp.pixelplumbing.com/) – High-performance Node.js image processing +- [Axios](https://axios-http.com/) – Promise-based HTTP client +- [Zod](https://zod.dev/) – TypeScript-first schema validation +- [Aigne](https://github.com/aigne-com/aigne) – Unified LLM API middleware +- [Electron](https://www.electronjs.org/) – Cross-platform desktop app framework + +Thanks to the following organizations/individuals for supporting Toonflow: + +|
+ |
+ + Sophnet Cloud provided compute sponsorship + [Official Site] + | +
(zJe+5XWh+3!;uIq`~Ve$cc`71J2Qmqvmv?Bzwuzu|#Y zH{CKR|JGIIlICjAiHB@C63u9jY}0G&F 570l2kZFfk^kbsNg!1XeWZHi|mw zHoO9x|BPu{ZzpcrX_jPrq%+rKoxqAD* `Fib_-*55PYz8mIL)ZIHObpDu)Ey}tfg6J_wll0IN063(#mJKI za^s9m`Olou;6t5L%E0Pf@4TA*FJ4|bf8nc?_s1PKI8| FB+_|JGfWB8)gir;wEq=k4ZD59xO#4ZpmE_W1@m$CK~ zmLgA4cd>2oRt(~f#3ipSiFZLCNHvZMsN(`>*8M$Kb#@~~%BYvGewM9Hi}m3@bRL=J z>!HoHrPQz~vO0)Q03%XtY0+M8lu8f4bDoX3t#1DWZ?h*6M`mVxg`Qmu!w)jyRr8kZ z*!$bxcasF12xuUagV=%A@(-~$1}3{L0HG2$W*v+<;-hy|3f){=_PmYfyeP7^@>g_r zP|v}m&SrbzeR{UZ)5z)wNt4<#LDw}wfcfu>QF|$vNuq* L+ >F~a&+1)qrEUiM+IEV9gVyaq#G=AZSt?mH-zc)Yq@zBx{Iw>TE3O+O8S z@?d~u(?mUugEPU#Hp@XjGbmsvwTCDj#uMX3&3c}=`U~_i(r~Jryurh*C+tpqnj zYV-I1oMgh N>K%=10RVIs2DYa#&O3ykw+vMjk;S>2? zQ^toC2fIugZ +h}py8cn#rAgyt%Sd{7Ow*c{H}?;ApTF>j8sWzEZ1(%) zm8}qC75{u7B~lj($F`*7EeVt=A9sl?b2$eY-2bZ(ebHQF^Q&}0b}lo_DZlknp?z(a zdr2&|=Z5l00&Dvzs{)#fGiM|dU+Vq`>;*+Z&p};g-@r_i4GG;v(taQ%pX|aMxK*hr ztw!#X9yJqGslzRlt`>Jpid(rh>w3LxwA!5qPfHJcu8(p*>$5-}RStl^dahF0m3iGa zoA$A p{o_Z @K!0>TTRk -9-xHe#KX!hmB7AH96ND zj=t_#=YP3%pLxoa%LQ*@#gA7MJPWFwM{9}+_nTb7EOYI|j!7y4PfMYQ@;zC7qw<;X z@_pI;W6oboa%k^obc7kaoKdRIuF&+X{*Q;g_kmEE;_JJ;yx{QH_YIo~3snd(g@f$o zN5f0lYj7dIX!3Ts-ym-pYJU{vUdZMUJ~G2j=eL=PR*Fy;2`Svnc%N ZtlvV35(KeiP>j_2du977Q$D0SgI(9jTi8gVZaWh+&`c=$)rf~UMUWs9`y X~c2L4y*6pPWMX_jplE^Vv`?`4N(Da;M;V>c`i7OEGd38CN zTTqXIkjC`rPgzu#_&*j0MkFSSGu&ra!0Tx(9@xrBe5r@wcoH%S^`y#@5jJ1yKcH6N z{VUUw+UDHgB=xVE*zR&)s}ji>4w#m4(wUss@4kCm$hsW8oWQ~0`-QL0z36~$H z{UF%v3)($=9ZH5DHvzvEYB&MnuZ6+`H%PTv_-b@1zLHU5lI|mRRM@ai{gH5c{(EgN z@s>h8IOI>~eH$WQ)Y>Vd+xIPf#_#cQgFb*7<_xACJt(U|DA;xpC?$#=JjAr|ZzWDN z 7(^keBnK73d|YRnVEqaL%?VMiDt?G zm=zpgN;DX28wGqJ!w5rZUW}ya^mLLZs#+JX<0Ii(xR%lt!;DL~;hv?Brad<#2*31! zntys-nJHPL *-<^HbIf84S&7G4bLUzK#P(3=V!@0gDA#=oEJGIOb*p6IyjQPE+hfA~6& zH_5x4=9PDOl5FyOi4K*zvdrGPw(afKw(VBY?`!WZdpd7)p1iFs+0Kge Ne8-2dZU2#GV5NzJ_H zvT1AilD&Uji>duV_zj2SsW+ol{-;dw|E#6-|3Bw{&X)cE>^T1*fQ+V;E_VhI?FqQ5 z1YQF%XkpGe6HBGd4OC76?KMU7t^QC@3-dB@1#lT0vBKxzW`>zkXHR9vR4+vpb$1F? zJKSF5wn_SnYoGVsxc*J;R$I8Bi`))WyN8MRx;gB{2X6gK`3gclvljj!40}Hzet-H+ zq{xW*_u)z%Sh9kHZW1VU$h{AK5SCM4Gw{%7(0}?7u(NiN=dSXcyPn_b{~zz4`X7J& zf8$eE=2q;{6#gLWfg(AG$Iy82je(>i %YG0~Bn<4+6d 8y5nvh)Kl&8F82OD{pPZ zR%Zi1i!d#^Eu_@yagWqgJNKgTuh|wYW)AkYq5TrY;dnRniiEE-EO*N*F4^MmlQyPP ztQ(!;q4l|+L-+H^6xm;%hxBR5n-D6{6#@XkX=Msqn@Ju7gvTCYZE15&OnAUCLAf56 z4iY+>Wi0CsGp<_RS07`uN0^aRM`C*$bM;8~uI?<-pMR{wRL>q#_q5o>h%nt!L?Vs~ z-7>F#kDmb4_XVGoMerZ-$aQ5d{uAK&7-z y>zI-V;#LO6$P^w5jc{^tWKiga4d@-wkm2{}Kc^R5RDeB;ExHCh!;kf^WMX^S& z$YpDB{I3p%Z#hLX IJ4BGhSho^123HbK`>*|jIxwjP>pW@YNNUh zCkxxky$1B*I=AJo1cj#^(u9+tI<5vATBek=8etwct!E^8LyO7uT4MAtubTt}Yj#hf zMqzb~d7zp_y~TIusk@^48r(>2n4>tdi6LRUo>cXY7it%IY02Vm_=#gyVMkh6$5Qng zcc#3GZg*)d91}0gFOPeZmxlQ(+}KsLBEh(xgs}vj!{Lp1*!oWFN{YP%TI}Etx}59S zB*9d#&)%WmD`SoTj{EeaCi94o`|qX2PC!-@bh92v?V$}PBxk1!y(-tX )h7D>mkBOs;it^hs!~BXW|W&=(XmqKt?rf3*H{1eTBzXI zovwl0^Yg#x{wsExlW;8wXl{js#-^Qe8%@Z|4y0##C0tCRTgy_iMs?cLiynrAJS_a{ zW4~MfnMSP&F1P$R<%(5==CShVXS=tw(u%H;K(`&H?RY%Dpu?DduFuUfP+=eVW<4Km zS6GZtTWkE5P*%EmCGhHvj44OTPQ*G%8jcngRTMn32DDur^|ve8KJ0eUi?9izVl{Sx zk8T0=I1>R|lV#UFRk8kz50Uz+wJ1>E_JH8hIexoe43U{yEl(~JlQl< u z0tCC^*nvFn67`;u0P~QiUQROs$=qk7RNsB{vze!yKf1YoY+R#_yfu2ZV%aZ7vKGK0 z7a^yg&ZBjgqQS|0ef~wwwYT=DoJYIv?mDmka_z0f3;8CnC#9!m5FSsLy3}$Oz@Bi} zuE}cA9Rp2skJCtH=_Qj#E~Do8ZX@#O_}t-=Qcf7QFLhMAz}7mnL_FbgqK$mCq=%RO z+nW{hYdz rqRwPBmGTZexSS4l1uT)Ua0~$u}<-jP5GtW*yGo zXE1v{^h5PK6=T2bQDIV3a%`$si>r5O#dLI{m!JP4)g%Uu*7Ac8vWtI-FVQEXTLsG1 zAwxKc+>`l(z)@o#Vx2-AfW8K`ma`fIMbm*khIpoyA67as8H%}!i7R@S`Zyl!9N+Nm zbHsawF?ZshVfV6jKUZ_fce^gr-be>WyNZf-hVkVL!uNNZc~0nh#6mJOv0iFl1&kwG z1y!vjY1nK=zdJe@RpTp=zCvG`TT}j*((>}sS8=_+x0)Jn`d}30SZlLUz$g?gM;QkS zDg|arM~AkpWbz+`ZwW@S22fc9<_m!Ot^WX>5b>lk0iKl#1{ ~vgb{j;fpT3*?4Hf z{D=R0O z5H*-NCtFxX;y%j>|7*^EMO|gw5h=~Pq)XQ!@{BjNE3SaR5*%Q+FvD=QFW@^Gm>zos zR<_w}Acg#@9fQ)mo%@vhu*$7?Gj1%%+gg~jh4(e36#z>BkP}2;4mph~Wepi9ToZ7R z%cEOxmnWr;ln6tbDsuUE1x_XA78csn;_pH?XNnoOFTG=%%SYkI-Z!lj#+3!n?pIl@ zOszBB_Vn$VJ8wpF(+G?H%M#;zLj!+ WGb4 z@OZ;;HNVvb(AI+Y!vjgrM}(JjhZ-2YMn^lv?Uw|n%Gy|T#MZ8z;de58sba$N_eyj= zuWuyaM$_xq@xsO^I`w6Kv3iwFcGmm*ZVoWMP8$pxofMDjFeZw(_u|^**JtnE9mE}Y z@)p(E_p=d7vF#&HzZQO1Bwgf>X`J~E*it33KF}>0i>zXEkfy6}?K% `i-?eBTGugy7_dF+efObDE6f$h}?ZWlmzPkR+WTSEK>Rr^6`>9PGk_ q15Y>={EAz0OgR7@z2azvj64455m6R7+ z$UPaaT~aE#Jp~85&Fi$ khciUad;UwI#y+47EIaS`LuOf zFDD6dZFlHvxb4SNFAkBMDx|$V{C`8B{(m!%cL+wqa1T*z9wnWW SKhY0baF_zhk?5as09NLPoe~CCh9;c|=}q^yYKneOX(>>10WlWma18^}#5QD9P5$ zp=-nJuvu!a2>G2cYe&R1zT?gQvg4rhRXU&x@`SUls(V|@$tlCQF7oy9g{NR2%3VVv zpL)uD%C9A`AEu35%RlWU_lwH?CDuiFTDVWEqWrgKX;%(rJt3&jkGau61$O8*n}DrB zv!x9UGsk-XEnBrlw2F0D>hn>%L{LyAo>cL)07fn?wB4bQ-(hk=+nH6ppjF(9-+0$8 a-0E%8QY%^c06R25UQ5 zJ3VrPVCqS%4z3c==3A*r=i`fCWw1Ou$Bo-1s^bdjgDMO55 GG#M0rSwLF z;0$^|Nl2v;YI(RLzD7vto>DU(AO3Sx!^_zxw)66|@gY}l9q4DEal#)c 1{
q7LjVhu|dtwHKZ^G0O+<@iSIdM9h1m=S4Uf>`Iy zIQ46FSW(k~%+M3`Sl-7)R}bapnySH6#Na_T$V+4ihIbf~ i8(=>WyaG@^jZ?pY9|s~4rPNf95u$LaCU0MkF$~)4BFh-zjjjw zD>Q0^(b*To%Jo#K$>Zy1pLqALEpId3vph4Gc7_03bR28DclXw|gMrbYiuiGLsYM68 zk@u+=UoHXDO95Jh<6liDl~kK;yp_twK*NiV?oymU=OHmik<4)_h^hD?d6-&?gP0#d zS~CrYfzF^;gRTVOvtfL#^lJ JUt;S^H!F;=VIt9-Kozw#tut(5Sa*ug{Sg z1XNOr=Du)`RMiP3rNUK5Y?hDE2<3Vy&fXw{tL7}mHkP!Qu+>L# fulk;#Y!c{vf cDxfRIGjz0i2-Gz7)W-EwUd@Q zr`;BO9Ugejwn8#PF*;bN-IFI=RqIL(;w9EP3V2XwTq@STG~(R(w{BFhccr$JR@bLf zXQ0ogyM#yeM@o!Ihr6bFW`y3(e(4{Nzvk%S?V^0ci4@>nMQF@`9z_U=84 Jum1VTVeqHeL`9OxCQWp_~Sy={(IX$-ZI;9JPQ$6F^ z#!`!FzJaZTqUGuZ;@FVp2-e {ntd>!h*TmSAos${HvV7ucpVjx#Bqn7<_s` zi5~ 0GItd2EPBf7N}_R;Oi zR(5;GY5RB0Xt%N!D~{kbq$1w9kCeI_HB=nJmP;8moQO)}{I(*}BIcC~tyUL^cYTU- z(w?^qs`}R=3%L^BGUkhk=`9+EUp)uSfZ3vM?{U+ly+Xlp=)x1?gPgA*I@ (kXivz2QB-%0n$2@ufz&UIEv5UW!$sDz9g! zdPdD#Mn!A*7jLMZjP95B8)dn7Ts8I`v`OL)&%9mpEIz;~Kl9XR!j0;;blAhkS2N$R z2GZkS{6Xk7!WSngcB4Nx3{q<*b?|0*jg<~8rrm*;7hU7Gn1!o+jfFk9sDEAMVkz%- z5oINlTpRV2Zr(L=#rFw4;e}_ybX0v*PI?B{{rcHOstSXh)jOx0pcLMK22Nc37wDVf zj9)zhe+os12-75~TLXT>I%g;mLM`{ {%iNSeCMPuLN}ww`jE{YytVQEDg_gy&iv6BD((e(D4jTMx=TJC%36qTYTl zLD#s&p1=(6II7So+uis>Qg(O0*9=wrMG#!9N7$p9p$7lcjOq7*ji$00UGqfcJ9Kt3 z>_~I8>md4FVM|!tV0m))M3Ajj*ChzKHiT&w>C(_*D8F#@yh*Z04JmSX{oZE_4zEQO zOU92cR(bf(SIeX_wkEq5=qXJ$fEBhGYN&9LMJS(6E4QDNrhg4dV^a3FS?$cEq@qxj z&GHtZY|sIT555|hs60OQdrL~kv;*BG&ZvTNtO7^`HhDNzRJ<(j@Q4kvu{GSlaZK2p z*A9Xsjy~op6@=K#$q;9h490{T?C2UVw-f_qm%r*AY)=dPlJ*|c;y!$sd#X{R)NbgZ zq^PhsnqKyHpzxMgDnT;L>jizB10Mm8O`)=0w*B7au`hUw=*8U&stRw>8rPe$`T!{{ z$!()Dg6}O_#BN8}^)^4Fs|UFjvZOMpLuT-}jk 5{Pb`7$8Osg7O_D z!sr9|H44l_@_G_d7Z0KLK<8h+l2|{AKB!7IRL)5df>Cu!;^jqfSu2zoYyz4h=_n^l z$_|lp$;O#cTtA1URM%a&gJC^HEWeWCaOIqw7g|)7w7xcZO$WaaFt%1~Y@hZFnzOQv zllXF9pk-Zw{Ry6P9kB$-XNZfKHj*G;1mZNnXLYRPBV5ScDu5G8(ozN0?4_R)a2WJS z3PChB@jxn&s7|Z~Xsexs5&@|fF(%ZG(_MToq m74JH)bIMVW9$Y} zF}VTmwjCV04SR}uM0G1r--b$U#etB|aoOk17)zMF)y|1k;II>&AdHdnn9DD=+9KIu zERL2N(JL%Zx0BblWBbHW9=oMZQ7L1>KU5Xlsk3LmCpKVk)kXd#za1hyc603cWtZ== z-@!kn-F-gv#elwUXVu9g77H&bjPRd7g1z|=pg3e@G>i!6bWes9v=6+A`O@z|z~_K8 zQKHi@8Es(9mp0UqBji}+I;lrE?_Emr6$T@7r1Wx<*9sR`z;iHYy>t~oMIL+F2ZQbB zx^%hZeQjKBVV_M`|5~E{f5CL*MA=2 ^Cv266umdZ4=x4(lvE6i~iu$ur5P5&9$dIFD1 v*EvazEaU-XJ-xGMOoXM43PqTN0C}@u#4FC1!_8t#+ zpDWk>wwyA4lHhTu_j@xC6#|@CI!!n>XpoQ0mj$9)gAj@3g48;H0 |l^2J5GXq&Ic6?gillUPVKW@r8hhbwTP|kCRbVIAdg2 zX82T3xdu?ov#rxtb?(5368os1zA8=Ar7^dSi(;06p53j;CZ69jo8V_XqX{ 01d9vMRhYd;X8iSZQX%vB5Qit3JU| z>~6XUxkkmb^r$V V1QHDB(nh=`ahNoD#S%?pwcRXQ9vWs=TcpxHs#7#2Bu_*9kDtcS1iQHM~rtrlByyfqy87ucC#?uJoeR*YF}MjkKP3#oEs2<(1jK=?A#X%(~L3 zjO6U|rIS(E$!B!H ;0#}N97BImJ_iPWf+Qr`qu&R4%h~n(B{r&OSZW9y0b0&Lfu&h8 z8D_Jd8CFZv7%%j3o1qj*$8{aTBH63^n3e~mD%^_V^fadLskRG(@!X-40^R0g_XmH^ zC*V^uG6=rwqasJ-94YU65C9Hd@&__fZvp{q^Vh&|YBxx_fsrRRk)%2#OtTk{V2t|! zV4^_+@&V`>m||PyzZa*Tle051IyL}FOdxbiiE^c=8@N)nn7U>hJ^|OBfe}ZBd?P=< z1lJ=)axgq=zLNAGo({e=Lo{U%yE8CzNC%o#0 MS`w9FH^YNd-o8C% u7cL4tSe%c7?x*I_ zAgJ{R;on#G{9kW_{|vhQX~@->hL{*m5nL?-NI(@zMO+RcoCcB}ka7fF5Z95g15%JE zky+~o$(ntx!^!%=ZmoViP0ZG2T|4WTB+0f$SGV8A{)w&lrg43GcB5a0y{~`j4+2AT z-mE)#k>{w|z@(6fFQzNJn7;LkKZ8V&kLnDHqH*mGNx_TqiZ*cAp;1i&r%r9TJ*nit zR;SF 99#k3u|9aB-O5O6@1?q&bP%hMfkBIaAV;53P{RaXnG%0&Tnx0 zuTI +F s>4+z#{5Ek}%%S{1u0!sTRF92lkz$RGdb5?!ZUdb;GS|Vm zo5E>OFj!w5M08VJl$dL14}{YpPoQ=Y*S45?Qu+()U`zQfv(ss%FB7(eMrEQV_LiEr zRPVeq3z~TBbD##7pI$ryNwgqzBRm6n5iu)Wf1rIdH4pcGY?Jxj^t_z&ULZdSq#b^N zk;6X-U)gOWlxaGNp9Lv;IDm8qfaCh8OoI@_ON7+`ApP0gC9QMsM;oC6{01!NDgcDM zQXGQC1MU3TFkT%6HBrU%dJ#R@I_1Mjm=5>st0Socu-pK>!eegVi{=l&;h;W>*{um6 zMPY|4)!WK_o{rsWu8}A7?HeSmU|Q7Zu=R`Ei>_?U<0&h?cy&1+;aLX3q*?IJW(pq2 zv_ZP}?gDhdU8Eq&Zjxs6IGXTls@R$hB!R)o`u3R8 0ULpn;*u z+5HyvkYWq}CurK!(@d!<_$~%L%n rr2nr+XtZ u~HT;fOOY+{&8H zqbDrTJyOI4wBw8v|J+ehEZ|1FPObsHK$wG=cq_pl(;Ry3ri(I=P*H6H_Xi=U5Wa0; zWAGBC=CTetZ2Qt>ZCgiWYf3Yt3KjftZ5!QEfpNK!NABo7Q8)A2WZjIec9L3gio_`A z32|t{H%dnvb;6^XgIdJnOFE^&;^tu75OtBA(`AHWjHkVHxfU-9-^4OOh<6S?WS;5% z=-p40!jV%k8lKzSdUO4YWdR@J-2*P=8E4+_H+y`5^;kg%tM@m^hl3hc@Nbj(-ke~I z{&}se>t;=$K6or09M&V{19^Y@L!XmxEP*vq@<{;@#IA+T-=d?Y`iJp$YFT^A%MRnM zLj}dJl2;IAOW9#cu%e#a!4L2U5YFtj$(}&`!`}dt&6L&we198=)IbC@@JzI<(truQ zCQ4$0VRfA K zB3VzQN7wzmG>;dUhZYsSTHlgurcZS&Eow164}k2?(J|z3*2ycpAhyo|ft2=z-fpwd z1K07WwweO@3Kvo6?}DqTfFwPg^WJ^cf&c=vwJRgmB;O}@M8`%y{&+A@?lN~Ab{yvU zY3DC5Q0v&{^}uV}sfQIYj?uI0=!>^@yKZcW;=W1rB9JDAbmUn-2z`-&aCCUC*Ja=v zan=xe?xBq4fPMSeW~Bg#@1ekCt9rgg_~PCXQ9=CpOy0=E0B4z=F T|C1s;-Nb249U2d$o;Gie8>RM;m&8FHIVR0AJ*e%?8XM z3||s8pfr4auDLqlAI>7H-;i$(E8*Kn#PlYL)~L`&5Mo6gG+sVgUm97L>ViI;G#g90 z*lw4P)c!1>JWo(5BVg;+8wV>V$7nRT%DMsbh#9vB`^- *-gae#R)oP>ME&%k55*|kMAObY-GWBMf)!PrJi zb`x+<%d^@+){`_%)OA37_e!I_+ouc5T+y=qMd*+?(Unv?vtd?_$9stT778ex=SvGq zTBly7xU7N_no%QBG?<7N&Vq?}M0-*;(Te#Zia}9WD$)V+*0^BAwZFH@nH-)jHGcs6 z Pq!Cq&=OGkC=JMy^WQzVrUIa5`hOhp30WZr|{ z+9`vfaeGwpgOE+C7AhD(yqrHU(Et=k(`Y> jMw)>UcEcS6Z;-GOP`h(o=iHoIm#=G9xFknt=KLYAf<*#f3XSo#!QdKkoEJv3{ zQd>-kOR@Q=J2GhhqQgelZ3JIikzbt9ELPzKPm?vg+zh4U2& kS}iw;n}>1_u)l)({+w$;P8pS1+Jl9AF-ptetFV9E 5|RqK0u-g+04kq^UD7GqDc=r}lXbdQG_y z)xECRXL;glTg;RiM?>_@NNQ+74OLzeTE2(jWoeh`&FOJY??`aUVfbcv|JLhPwPEf2 z&!xLsUE^z-!;*KR1%ok5S!Sr0*ul5Kz(!hJ-~sH<5`eo0u;dvfd1E@?7ER>lZso>) zj_v+>|MViz4my}H`sI*MO56#;AYuMZds_J*uJ&|p1pgV7(GkI_G3nsIsnL|s?a~Dv zx3)(|J=}5O4`?&&P3hS;I5SR@`kp}b6n2 q1jKo_X%dIn$6y z$4LUy$Q-3k?Jlj)P0=at%Xz7^{%-S>j8P{8W_kNp@$LCT-pbd&7XAr;-p 9Q;qEA55mKj(Aj2%DNhp~ z{aeW!L#~0oqh@?bT-}03#g3BryN@f0wC4|$ D2(p zEy9;20&yFW7W!S*-&M}YJk8qp0=dRvcw~;~`eZ!J>b9uiFGnw~_L(x)5c~0hFI(+# zm-N}l_qP=hmx`EtnpBpV-A`v538o3e>0;h@6EFf<02d-U3#33B%yOXlv+{AyMg9{A zb%p@~sMMp51N#`v1F4pBg&*bu*5L1~Js=EEm9?M^&u~$f?uQtKUDO3*mVF9sj|wkr z%2>Nq7h3K`TmJNU8NZcMljv${i2YpRY><+DYV;a!6BitLA}_+zpSclOdUMP_+rvfx zbMYYc@CN-S=u+Qmpr! shve)gCK<#UnR>Pgj?H`#IwNC8KNd40Uca~KrHh=4HMWdMggIe9Z zFmbQ-^5)YH2Hy_?;33I`S$=GJ)WZ0yf)XS8U-R(7B5Y3h$^iPj3oH*8ibA&tR=W5< zJg$%kF#W8pJaC3B|HbYdgr)j{Vhy+N!(8ddTQ}Z(*d9!4Xn5U>ZjPUjD(11fY1)-L zU6>`cx{L`Ui7~xi*Kk7R3G0uxuhT9xJ-WOrjLW7vM`~4B7d2UZt&gLD!{p=b4rz zEs=LwI@p|=GAdJU!{#gfjb?uZAE*g}VmEl85|aIegAeYCRHhgq7sv4Bh2W3bA6?Gu z(ZRN#yjxIZ`kR{&Gw5{w^1;siynW933hBh>M9Ss&8$&Knm~a#JAG0o(>O@qY2bb+( z0grR*B^`jFlsaNK4WR%wQzS%%pKh bW%CRwc^^HV;`b+aZq`BfnG*$C~V)HrctNR6=|tne-V z8y%>ie}46o>!xa-^(XIqQyNcvYG>TvM<+{TkfneG`wAX-A|m0NQ9UtS1LT}eqT+PA z&1NaJeuCam`eN8$PLAXiDQ)qUmi#;YKtnNWq}Z7j1=_*WJH_{#>vU_`8>Gwm3v<`q z!AFJiL$7U?J>_5X0|#3+;7b>$c$QX{K;w;R-YbTMu6T}FXoNI#ptykRR+s5)@4qo4 zHgyEI1WU%L)8x2@T4 w!u~+Vw3^Q8_Q}F1aDa4K+qA2p zV_|a5@pdz#r4h#DLgn82uRHQ`dAWH{ hZ)y60n4!@Mal_2I|ifrq5;lZu02(~1CU^kq{F8e)hqJ_cIxKy`_M>nn)(Ily;l z-~505f=OF^35W$27PH@oi0}n|Bm`Ju7l6{lMWh)luiME4DTv$3tp_1(CZn!@we&q( zudt{quh8|dgY99YymYnhro_DTxJ-J^(;E1?k9AXYM%>%85aQYvWK#t;1``l8s&@0w z9t|M%>c~7)fi1Vam7|Ou!!APu$ W+8~cM4!&B&0&E5!xN0vn-T**ZqVj0J4Nofg?>bs#!T%}#!3%duk&`~t z7;~x>pEp1VrCDJu>H*;_wIRrJzVgo4_c_je8F*)ap4 Yvsro4V9OICaB94E2D+YvrBh@?5S!jXEbzaZXphb0J^+dV;L_jO zI2cCR6}N>zEdMb8*#7!+`#-*SJ$myXM|*%^9-Bik#hKWepzYuSpaubnlwcpxgbxND zK`Ca6cv>h2`AZc`c_0Jx3CjY3*-J+^?k0VHNGl^DJ}{QyC<89wIcZ}44?^yU^dNun z*bF!v7k~(Vzhl1>$>uAcz~F3z&46t5H}yZG0lZ-wK8J|zRN%+dq%rtA#_JfRv#uHe zeq;tti6)H?0fy1rRQ7w4>@o)cMAI(ATBsoibv@vBzm~5CzSRQ(GkKI2*@->DmH>Z# z2UOR=XiQeq=3}b?(|&Tv97%*|ddkW|oH!W{5evzy(P#P#YhQTn0vj~K4?-V%$H|Rj zV$((_H#P{gg(s69#wPDC-bXV7AOb>->5ajctQW(Jn0m7N=);UrwkqPr_2rEK={Aqh z!pQ}w|53qEkaHCm4Lj0Wol%zU V_!p^L!iSVmKH3M z9me%R*19E)`ke+oB@ljRjxPoi|CI%7b*H+*p8AH9{}it35Fw5H1)os1XmP{M#424T zVu6|d#M&7n8AZ3+L)iND^Z=oy1t7}e?ZJT5^4gr{H ?V=#RXyloyu!E1Zu3{aHE;6i;?jlu-P zeG;GrD_(~biok4$^&eCTS;7^{lr%&g?XJ{6bX;GJy%w$ph?WU1@-f?bJGFkbG$Ndc z+NsJWd%vT7V7<2kNVO}8IN*<24TB@SHF8H&UmGJ2w~_{g*j~j((IeKWWF6*|4*JAu zyYe|}ZKYwXnG^C{`X};$`&gPvAP)WU;6ZSeAz$;Mq8aJ^cR}9b0y3UODC>q75?F1c zULd{rfX?k<`b!LJ0bkw5yls5)!H2@I+DeTsE3RXWJhivb_l%c?G<`bQPUbSqojmul zI7|}Ln*)j>3J-A73nX4ruFR;^?HvXbjiAfia |Xii$Q>{K~x}oPYK5-E$wWr*EFG zEPsGjrUKo(!?+1F@C|H8?M9h8SZ3lK=r`DyBsPa1<%z^J>_8fSnH4BQ@p_QG{fm)? zp5{7t H=4vPuPd<*Ix;(0rlwHH_Dyj8Oowf@uZN1qgOw*hZ8VE zx71N6>4pceHM7l_MaeiNnS*pg1xI#W1rGG>fCw*fo;4}u&5O||>NB@uAb`JJfNOhT z8EkKON&?PMCFm)P;UVL zAp<4zv9wHF?K7|koxs9&PAYT+NlYuaO2|PX&=Yphc-0r8+Q=ml5>KuQmLS#DJ(nqw z>_+lEKj|iM?v0pVqkcEXcDU1;EI`ji9WVx>`Rop8k<|sTN|#HC5ul@pR2^_KGXnA; zX=3J`P(H3XY~e=gn6h?pk`k+KxK#O8i7N~n (BWVX^%C0stbgcBk_WnLrC9BPH(V%NKEm2gYgK5^t+LX_2ESVaz zy8toIbbW~?Ax|B&hs0oC-(FvWI6Xvw_uO02K27(biDfZQHl}BWPWN*Cf6o{AIRv!m zdmQhW*sA+gZtrSzsOULxNoND_pP&KhHroj!#TvM0iByWthW4)VzQ_+XJwIiLDbp zMBp_-N*D}==1SLo)+*#oJe9n15jLBkcWV9j3n!_M!mA7GZI6bJX~KWQ#bFbj;KWIh zNYjUHjJI=EWJ-AvrrhPdHS9I*K3lm{l*K6Jz)g30BzYOr ^e+#CUv0?SN%>K~R_{M2daJONHF|IGj09`TOP>|B%zI%F zB(%dvFz6BQdm`{PU`>7AKw7{be}k`qM`x9(IWqTgP`Yf!l <&G_@aN)nc>rg z1||kuUH5~U(B9Hc0^7aBaT@w?|IX%l_toC{HdBDX5b!{LiJBwxz=Dib#z>XTF|hnS zv V*@?1OsE*F~k;*Nw@Ot@qJ@IjLlo=+<5)*_*&yE)7z(si);tF zvHiHst_I9;@O5gfNA2mB`V`=P6KP*S*ra-dg!V#_(D+SE4+?LcE@u}hRcC1+Kj)2y z{UESdz|Kf=&=T-vkA=AK3f?1H1vcHSAmR$R=8!{fZh~TzH-Fei-2SCO9D`ChJ?|1o zn9 lhJLeG&)k!E$2mmQ;QrT$wZX4x7hu9?pVO>SZCpGZL{sJ&2*m~sy9Jf z8HiFrVDpYregI%g=~CYx1V_g0hhJ#Yr94b42alNJD`M8k>Y#jxRUu(f{7W2k!_Y)n z_8Cuq&;q0e8X{M8c_1KKFr{~&eO1t5+IP6C;b`JMsX@%28(Xmp1LRf1CAvonJha~X z2RQLEJ`N{uY}<6_n;PjvG1xBWP7d1y&r)Yyfg5hv0lZraTc{6$u2mB;v{^Iw*3P QcuBNEhFZwx2fn|bkCuunx#CC46MnMyP-h9MiVJYn{ z9|;+2XO?@@&Vjw{DI%^5bSfulLB)GoRKqxKcuknC&!IGsw?DLhn(_E&*S87a>z&gS zsZ#tR|4ksi6y!)-jw;Le D?Xs8GmD_Y)8Tv;zw^AIudYI8_2Le zUs@w+Ri-xIO&n~I&O|(rd}r;Y$4Rr$pakwa^s&|9%Wofz(z7GV>yP^+Y}Y&e!1IqM z#Gn6-$6-$za&ZQGNbIe_YeA!}JQkyX^bIHH$Y}VYheS+EYwi>Utr&FEqJPlZ|AoCb zk7^?C)<&^WX+#K$fPxTbS^?84h%%Lmii#K&6$K$}+sY);HdB<45@`lSpcRD{S|Z9Q zLS$B^2w`YNWhMej22^IL2*i?9%5T%}``x?Fy64=rzO(MP?)~Hb(by`Os^74OXYc(y z%(X&EJM&J!DeNca;jQb1{1K^X<>5SWeJ9673x;Vv&tn#Q`{de2@^{d6|CmMQn-h6x z4cxj9tAJ7#QE&{RNN#iQl_%&TS9qarUolVfHns2*2!z C=fM3ijs&$`mzaF?;x@jU0l7Kn3*_Zs1P1fPPDaC8rcFf zK)G3c%m~7xKLuIfvuUIaq}BYc+wBdN>hle0JgN4xu9EEK(x9+M!|XN1x{tSW@tci@ zU p48qirhn^hirP?_^)uU*>N5 zB4K!*dFYQqm!@;(>gzu3F>-L*_ji*lML(+S&a(2jwR%gm_gRQ+tGFZ8>jY5s#vizJ zR_+DNdblT!C!sFznU4KfkU!G%so>(~2e~6IUEJ(f{@LEir8(IrPcpn+VyEi9Bnc8; z`3IT-ZO*gBH!rM=m-T*4J_E=Z1H|wA$UU%JT)C0E8t75`J94GFxnRp6hg*e;ofQe( zIS@r}&1_N065x?O=x5zdbkz7EI#es+^}goSZGxTnqdIqHg2V}0{dE`3y3P2cqB8v_ z?=9m4L;Uss{LQw7t^dl0W=%wmMSN3Qb4Pv%?XF^-ftbNx0*kl!4$@_7>35EOme<`Y z0~9Y|zapDA+E)!Vr{Skk1N8ca_X#80s6WBpTcaPAp^v$WRN81W6g(f)93}srA}y$( zm-uxLb<`Ll<{0@V__;ysC|YQv#6sZS|L1urS2lyKrGV+$%oC+iWv77}EQ-wbqdMaw zEwld3ZTa8%^*al@N#sR!AN=d5(HDDA5r-oS;T0y4+;}BHooS1L@|jyUqe$`jCh+SI zC{o8qGvHnNpTU?(ec*qYm2z9=0X_)-Xg)mh2ABfj$<6}K;6Xl&U(})krbRGRMl6UY z4`<0$Am6EH>VH$(cb5AySpoOr$_DtMBcS8 WSbv{;6| zSc06Re}OgRDZCk1j{bikNu4v3sE)Z|E6F`sHRJNtfKx!Cs?qB66_z2q68WIdnGJT} z%S?=L1!9E$_%|bBUBY0Wun>-m5$+=erx->W>=n6f_M63|_fI9&zB(=WcvbZL{gV{F zPW6xFK%WY-y$}1&wi-5s8ts+pM(3AQsclQy*Ba<*V>n$Ks!u0igRXoeY~X7*)3t^- zdkP4Wc#zykXtg1ng(EKZmuci8d$AQQGTFIKrQPuBqe{0dCgeVI+S(hYqoVRk_7X cJW% zS*eTivp#Gx*+961>m#uK%tMGnz8fxkeU*Xss{4XbM !mBf4U&gT* zzWWc4Tb?0z|H# V{T>cam(0qcNm(kBtVLCUgtQF27 z7WS=eF&o#Us DIxcmz5J^{Kd`~eeQisg^~&7!H}ZOFrLp$=L%PqKjbz?zke;e4 zdvb-=+}t}dlL&)Bs@WKbM$zTFaX)?+94v>BUXXf#w3B!BJalqz7MK~QDISO`V!ev1 z7EbJuy5BiJ9aLnH@#@xwcSAkD>$>b38!ff0vplXcJ!&MRI>W^0X|5!Tq%1|Ge#lQX zLQ;#`vxs!DuU!hw#f zYA`ZFwT>F%lv zrysnj$?9o-geTM?lqu5?_s-Q<`Yd=|=CM1zICY%gpX6NT^wwcjEH*F}3|v<|RO~QC z51%_Ci^b#fS*Jl_cqv;8*lm5)YLj&$&ZvLlW#8BL)4-|ETnukyyah(N;I`w(-@2Xf zf~zGiYBM==b71t?q205v&d@MOalsBIOevy~Q4BfDP@FW>
5NdJsDaMUvuXk&dAR5itC$?W)f0esFK{UqL>3DkI&9jd?+V^%%`EI58 z4(Nc-EV~^@8=#KOe8@{h8RUj{5q-8M%L304<>J*V2s(_1)5D<0o0jd g^5mWxG z$VNqf3AHBUBY4Hl;pYMzgo_64>QcX#qLJoDrPRx;z;wG+LFJFCmq_Qic0XVJC8}iW z+&kRC 19p3ZY z^ZZX2ee+i)_Idpbb=i)DPZn*w*B+$C2w<^)5Rlmvt-$?fT)6Be_l7g6F=K%mEdI!q z?_;_+cwRHDJxR>NHP1e|{*!iKin#5?Bhk_qS?u4o&*iN{ys168{a>I_-s3PXkV6Y) zCwn!qs{?wl7LU06rK6(*Ja3sxga=xzku=Y) fuAEmsK!?hAIhH3e_)XSm-%jH$Q~JDX*!IC!!6%qJ2!#|Q zMG=R*Q>1|#{ u=KfJKF#2M_YU2fnZb`wag3IZ94pmdv+27nZI&mWM zZR+>j*HEBkH-K^v _%=91?iedNnF8ElWCHAZ?B;iBWT)%^yVP1T?FyDt~vq{J`A| zuRi@&)BJ#LGh>RTi@WEc%WV7I@l^-fuMc4Ls6AwCKFb=R6O&JzCQUpV7)_(q2909Z zm87~OJZU!c#dMdg cFC686)6z8w* z@aB!e&v#&|N|$`fhQOIK)6Z2y9ZDWTC98S3i3Qpd!oLg`MOgt&USE6W5uN~MaU>pN zsvw!cSW>+aZwLNfsg-1I-kK7LP#2FBo%Fs`GO lM5}x}gL+f3 zvy R7OP@j1L|1;q;H_Q(abqMiwj(K? z^|04BU~u}rC0ufBw`=pCw)V{MN0BfjAV{eGkxUt zQiM;zt-KlPc%+%)9`B62F~P3$h6%CZ6n5HCy1LyaqBgHAs>C=x-13Me`{~vdrfX!O z&W_jG6k`Jk2aEQ+dWkj;jAp@8w<^lP>E7oQ(;Fy}42tyv?mNN-_j`yZ9aY?CIZ6u$ z7+41PvbEP5UhauuOGZ6okx%mZ2M@c615*0+fboTIvLel0_gbHNIGjwoX1?~^na3~< zA80dQc_O2nlS2mFR_KjTF&`SC?cvZm<#xDzmm+mao@eD)%>xZ@zu51~8_F(#^m(1- z?pr<05yi1f0!{br>3UsX;>K`jpVQH*KeoG}!@*y7q6T!|+_6MnKGUiGl3@WTA~R2) z=peRA{O02^`>S9uL)@%6m{jCd{yLoN*>h`iPuz`1Lwd0#^^sYbjNY1yr!UU#68zX` zcJ8wB-2bhGaP-Mi>M&qR7tq^i)Cc&T^)9MBhRFWT >d=$o?5}YeqNN4Cnv9di)=% z$89ux<;Sx7crZCHLasJqxU6%sN^MUG=w(q&yK){0d%P|M7P$>GelBs18R`D1G$P+` zz3G@~-OZfjkIbL0n-$)-_&7%Q_4hyH?|0GTf=$M|bm_^Scdq-elf5TvRy572uas_V znvcDRS#`MKh4k--gEg0zDJ!Zyxu0)h&csp(O6FX~L&WM@HSYR~qRK-T(mgdDd{6mH z#v?i3u~* X<#7+na<^TZv;6(yVkH}?CFbT52{y+a?_@S8+ zE%sX+FU=F&qCKT2 S{sN}340UEybre< zuYQ_5LD>0cDv}(YbbM$pR@ioRC`-0&fA9RMnb2oI9CS-@n>VT=hg&dW$vVWXMJF2R z{EYvHJNcFF^U}t CKay~t$cW^p0)jY+<=$J*hW72aWL}K`gvM~TR zW;bFUVbI#fjt7bfTSNRyorSw*sgzUGya-RIccDdDI~)97o}VIy(kEpRZuG1?E-6G} zu(8>>s%1@a`;@8Wn3?G@{g@G}Cu6?(P>!dFqKF%QzaugSVivUSWF|0PF<^oiPz~`v z#1{n^;7mt6#&j8fH`k2gG%BH;B(mVsR9IBpL(cH&3BJslm7X6iwy~(=sgZM8yE==j zbd0ZlGBqocqIGDbp@}px>vU#bO+o8ei7$KFRM)=jaZB;-qSk;{mbHS9&Ak+I9$kK( z6dqz)3S`Cjmwdvx-CEgH(fs@5axr%nQ;YB7MyAJTe|!Xd6JBEaTpT?lFnq^u)Twv~ z6jb#kzb71b5!!iJV|!+i&)AE K(GrQ8o7Nd6fT0Dl&^+oFz{>4k?5 zvdi2Q dUXov*ZJ+MoVV)S4&y=6&s$8A!n8kEDR*Zd0yZ@Hyv77h>4gto}gs(3NYkFAq zTKK;d=m{Dan}vP;FvX#O&L+3^hvHB~OpPGU{92}$m?aMN--Zclx#5X=&UJ35cRmh1 z2JW3jwHdftX`b<}doXoX=Q1qvX(p4Utk|Riuw|)GzC({Z1g*^w3!24uQ_0t_AsRgz z73cHS9`}J)!QpeuS*tM0@9ZTIyw`P!Ff=T{3R-~A_SW%K$yrRf3v9%jI=#@l12IG> zmRr~NV;9+YKF7z;A3*EdZ;$;^ <6cPTKa8Rf2CyyKPWID#i>ZQW|H*>CVJUEXcHE8+$oIzTjYi)ps#O?3fxM z|Bd(#_j SX_u{!N-b*24;IGDt@x?dQk@L>YSz9^kdpRFWII;hrx6|! zp9=ehwUXE( *;QQyJ7y0?Y65z6G!%U1**Fq!W@Lm1ir3|Y3g0c-QOsx-j?); zZOAOfCl3GXwP_U@0zvdsMG`tHVru}}U5~wEeKqoHoIX|-d5*BlVa9K3Czku=x-$VK zb!i)AZSWCKRwTKXOV!^^YI=6{m;^1UPB_Lne6z>Y(rVfHK53fkuV>c+(%MzU7*RN) zKcLtJ3c(Q&nkr |>s}!?EQEIc^)VQ) zo}*d0X{qJv>&9u!{(3u^tyCnX#RMeid-bi50uo`k(bvPdw4x(jdZ1!;`>-?hHHXl# z16u(|XN|DL;+dn7Y#NWf05j8H>KxQ9_9#-U8Q5=XPGVCZNWXMqe 2R z04G{6_*!5y do;-M97 zzAJqx4b`S)ikrl5sXs{1Cp|ua$JZTXHZ}xJ_i?rRGIV2DJJ<6{)}tv5nAUg(wPWL` zDCC?l9NJ^2`u#Lnzv5H $3wLbKrg41Zjob0(QrxSM~!TM!{)bN4aj<|?7 zo)(R(vYS)aV5|G$gE4_*zFx`48{%BLDr;3s0H~{2w^T0A?#6kCOWUknVIXUc$k)BU zUYFnCl7BbHtB=-7oRVw ?XLC4CR8Jg%XHtR!Dm_`Ype3>FW;8UTx zCUWbl!m3aUQJ^BJXKb~X>41-Z#fS>?dSdXGgXMeBHNY#>jIXATCCFE>JKbk1;#q+r z8>E4wO`7ncR^m1x7~koMpmK@yFnz%*pR84EEkWQri`p-nCp?oCb=8Ja6Wg_IgvI)p z5RWw(zj3hZeS U !$ zX7p7%M{kVvc`m8>eD?N_15zj1XT@dI(+@YYXz0SV<-5Erm)fo }7V|A7>iYXDi@E|*aJ|mF>gT~hv!t8nZvSLS z-QStab wx1u(_K?&O@+9 znH@%tngW_?vfD?(ql^e=SK4FECp(t65! EJAbn`sFUr1F!ElJ1*xOpU`n0%;va8iBdJ2hxDGnrxHW{yp z+Z}*MI%#uN(Fw#u_PF!sKneG&tG$?`NL~Y$<{{e9NmN41lsyMKF+Oem9L1iop{678 znP~9qO^}sTDzZ;2ifPqW%$@<+-Kct1i5!ht6KZSf(tG4;`tbm{uU;=bytb=P^IC&* z%YAH4b+~R=8dikXuBE_4(;GL_ZAiD*CCWYWDCsW5{DBl>qCZ#x@pqVT`XS5oq!F<* z1ibW}2Kv}--4=E;wGd_*Mx(9+U7Q-Zm=y4!b*Fa+GT(DLF-;mGivcMQpDO=)cXMf6 zn$F$(gO^U)I*s(1OCukg`srNd1`&PE(5zJ<6pCk@$)wzeqJ~pzrz3OxAsAG5yUa2^ zX6ZZyHdr$jouRtRB^#)?fAvOm($@LC#bur-kx?34N9`>Fn{*{`kfVO8O!2^)mcRE* zzm>1+v1?5=wrbcdo$><(NIhc#Gu>`u4c39Xy0;L{nZvTpy3@^9177)WYiF$$D}w9U z%Ude9W?yDsY-Myr5j(8lHQ}7z=gM`VEbtH0JW|#7V$hNG43|_5(vliqArtbiH*`Zf=HH! z*m0k$)t$+z!`&a&0c<(28Ud?jzR&ZKA&q|0GK?|=4Dx-2c;3&{GYmQ|UA@%D1VtQTdIsjUMowd!k z*w^K?e1FH-`_ihmsqy(ZXTJbgPkh&(`D1^%U-YESu?GD?U-QML{k+2Br ~&SYx{|Vjp8Iv?V$23SWe-mziI>}q zP!$Ynnfe8HqZ#%U(P(eH8Z*uezULaa@z$j6T`S$FwblB#1KdBY;rdB=#LOV^HuPt% z+OGRPf^MC1+sA!In8d66_tGzUT+b2J4!9!M7-7)hAQ%IKIU85pgU%~Hkd08HsmiFQ zv72*)p)y`Ew<>e6Z&}AU%g!f{0e*Wso+J`RTiRbG%q8mn`=n;NpWmXj^t55;9*e7{ zA3DyRE$%$!ngQ1E=i-00AvHqMrO(0rxV?S`h`0dt`fG9sFvz3^L~%); *>C(rI@aTGhEtOd&QguLwe_{ z#KHxhda RYdHBpPS#sjp;u3AY@IB)%b)M>WA=DooKT|A zct|Z05IW7|ym&d_sjZ|2OG}YQIK$RQk_ITA#j=q2&4zK~`_@*TCZmr|wN~2XvW{UY zu_f;){Gddcranb&$mMQUl-bBtnx9EPMaV0MLo=1g^FMGumq7LukBEwdlNWEI5?iu~ zO7w%V`M>^|vf^;||I)Xw b)uSUV4}qH-u0$+D#^zshuu2qc#~krc?^=AIpJ{b6Uc5`WxohvF*4>1B1tT( zzYdgVg$GbISk|~3ti*zPn})j=Wq!JF)Kn`CM4l`U58vSQH}AY;?#6nrGL!t577exZ zGzA7tklrmSZ;=0@TL_H>Ww%E1u! !FK;96`#ec9@{0Zjn6hr~~jh&?B s}#q zsagPHN92x;<7+I4^e9sGE2K0P^0nwNj=_XSf!jZ=PaCnUXd)1<{HWq7p)Xd~lh?Vg zliH8okwQ;0CJWEpao*hE^zn}B#mr;@z5U!zv&{s-NgM5FFIf9-RepBm4aTodCysXB z=yWsKSN`MtM~}Wgb7ooOvDsI?2e$adFeo$YKCcUrlo6Uqr0RC*gT}rU`0ak~oBn5h z60VM$9m;h81q D)b>Nad-ev6bFXqd9oLRUqZb6 zMx@!_l-4DY%e&yjK)%v?X9)fR^>u*Y&UG`CR6ZE6#Cd&pr=WV z$D>@y?}Y#qoJofmVn~sJe4PNo5T{ngZ~@r(5wr$6sRmyba|j#YD1hm%ONazo^;e>b zC5aGoMP 4O+028l=bL@>pfE%wTDO8<-rp8!4hnoSpu?+ zLwp_i1V#YbE?OuvlUI6;Q5lP88v-+iz4>Ckz8uC2na^nOJcdd8r3utQ6T5#SPy34jypN zz`}=frn%Nuj4*%+qKF4tHHZwdCpC1+mGI(*@qXgGDI+z0DOLPI&W#6;R7QWs4MSBv zRT^mIV7+3$2IeG3hqVnW3pdYgsyfZbhFz)zAa)z~OWSyH??@=UcG`-yt<#C$w-^{` ze>hkCeZb(P`lg9ZKmaS>2$$50)MIVIH}nhfwYp;~MSeZ5;zfqEPL_?>z(G8xGxLs! zqs){aX-odpM$^V!nndF@i_cr{m6%c-y99jpvIIW4DzW`Q8%QXx;ij*iI5B*g`trj+ zU1;rM`d95rbLgT|r$U6))kzegHGSykIG_mO$u1eHLOIhwN>*P`KmhtP7q>LxbBgFS zdCKDPu}(}&R2CM%ojsJ;HxEA~ed1+H!*7eI-#-qC*I@e8^^6HXW`X@tr@i>%qyAQ6 z>jkN@Yf??0p(XwI9`!i^N3p&ecqbUdw~7>=s6aS>j8tXW!BJ0S`D0OIRBZah6n!qs zQp&3}*wIFdG@K`m%P^3Yg@_$pYfBL|TQz< gNMIbebBCN|V;h7lo zQ1RVm%3s^^)K~Q%ZP&OEyW{VHcHIq2yU=~J_&-pYpLrZ=_C3lMr3A%cv>cJSkd}xD z<9@ZEz3C;J(0Fu8xilA@i30p^%NRS{2+Q3K2a{N&COeOxx#z`J#yTUTuyILAb-aWd zO{%tz1ynEtn&&gy8BY{( a2Cr#@eQ)5JqIVc4uNv$U{7#wz0O9p;oQ#>XmB2 zJU{u)`Giyp*EvzSD~&F$+C(mVb;jDn3 5%SeVxM*QGnD$(K z{_P3kAB3e1OTEekl&9Jd8;^LDKLwHj;cjik2*s;QMOQHWF%R`UmEL{gu2k}An3VLX zo&IQl^{&R$uoBW+gi{qlMb2szYz+o>jNk|feF#!L!X$nQH)_GI-;nv}&*QjdL!-Ev z|7wkZoVP*#Bfi4a;u(8kL42*dRnl%LFW!2qdg@gV-?=gU+{N#JUJ`jCWn2%)J{8BW zW3NnTH2g8t?`T aZbBFvuN*zhX5@Swba`8?>J%KfnjmPhT;!@V-$(Y=)Q+H`jA&L`5 zk)ulJL$!YqQ@-F3x)bDKI#kU+0iy?FW;)}l&(|F-s7M5$mkAO B5xiN}Ze04A%oE#B`K&LKaI{(Lx>$}9H}^fhH{IxUwyV0#eNorykXR=d zm?=K|>C @f6oJy^~AQ(1AdH|LuY?20An zz!Q}lQ8DLcd|4ba_|e)LLE?o)e %va1<06S#IUgyek#&acf)xqSlTF!NVL}s_MY@WhUGFo)I7^VP%T#kifZ&|i} zbMb3q97fAIaw&7Jm^c-J_TMV(qShBME8OAY9pj47dw_b}MQeWIeXwF+J8AO8_rM%+ zJQz*K?gB;v?QuUBH>ug!3S}*V9yKf1kmIofHQ-AckCy*Zc4dp*JMT+nHBDpAhsu+h zCeCxGtVZ7LkbU@2URj=c(XF|Gy%v~W&%;CSM0}`9cvc;>=0Ibn3|Rl8D;L1FN4msD z$Wp|PKl9z%(hCc*^LItAwE1>oh8lB@3C&m1nMj}i1`m2|6XZs(4}Kk3Wq+jeJaCMb z@|s;q4Prpnt4LB&xb!ZxiK=HnPSwF3VB~G)6bJ}|UrQ6Sd6-lDo8dR6mD~8i5b{wN zZVmgsgCpYihI;VkN3rVX4}bQ#85iCxdXc_I_&1Nx(G@{MkFuzFEaFiwJoavK`3d4A zE|4_O1D=;w+qKM)qhPn6*{;X-9}D027@ zp#mh~DGcX<5j*2qxgT1LcJumu*E4=Ev(=EQV)0kaP#w=mhNcUiv|svDhZz^&l~UU^ z?I?);#M;wy_loCcm!q$9SHE4*V|Hy8**ww_YCpmKa9RdI$?ZZ!^d~CTG*34uqVy z;0P*?g hPreK2jjFEc>1O zk;&*U15DYpKI-bZ;&(e-X|srJxa-614{$Ft&O9&6s0f-FLK!Tr*2W$gE=}Smxf|Fn zX>;1|^ZheKpu>BWLTW&weJd4rC0_wQA_?))V&i`JY!z+bO-(x6+`B>{)7;3OPrejb z6~wunub#hw)&EDR|0Et>n@k& c)?2eL7JAxl#8Pui^EnqULMKPhPCv8pF*n+7fvN7x$ASPy>hY55cHeEb zN4P`Er25G%;Hn-$@+5 @cxN9YQ=cY7?q&?d5m6Ougo6XhTvz>pWBJp01p{}V&VDGD@ntP^2PJN7%pxJ zBPhg=t5F@QA>kkoCTn@vLGD%e^? $jOv2!6XbP}UT-T>K3ZJG)-f+-}l{AxMaA!^S6 zoX<4;fy@d|;+|j&oG&HCu-7x=`?)bJyLCNG#(|3RYfXTzX|mUiSoGM(XmG``F7kSv zOO&g{DZ=@9Ax-<0#1&De%pV>&RMP&p%5=B$S9`dr&xCMOdl_(3qfof1OPr@5@SG3s zUd0VAK1aLK&M=CJUH>z%~Gtx8{~uNjYxztJUC zr{oZ<)$Fm|%n3t_O5!8h-5z5Q3|u3eB+Ujsy5+iIgqAp0C+>}p?Tic)weHejSykux zV#UG+bqYWE9WkAn;hE=Q@Mn2tsS+N^E1=?=_~Zen8TNp} uZfB#z21g;MGj)~N?6(P +OrB>rXprE znSLRbZikEiM~4a5WIf_*;Jt;Gci!aV%|_9{=t!n}y7LC>jW($nnZ)wqjsSUv{n@hW z$K|C}#kW@1=hba$Tp9xz8+0s?^Frm@$S!wdDd-|`CB1|(o(Ilh{>UXx{dg>CBi-Gs z)a~hR?sllZ0M9x7km(_@V(sEIRIhCB302uyiHGzz{Yjk3dcz!cwOLK9HHrz)q)hp6 zr5&(}e?ebpI#TwPIvIkL_>o-HP$0{YaNqDqjj{@?F?!6EoaZ4o_P#%`z036V9kDA- z11dYyf27c#Tz|v#uRBEY-E~5h-7D2)p;Q;T7Bg@%Z-+z32SGsOWp5qG7$>CEn!e5W zMX6Q;sf6E1_fA%+LjZ-VOVyNih36$GitaNT`IqWH#z=gPj=eLf8@?1&<`Lq--e0H{ zI6vzpTD@)Sp}(oy9rkQd9yFfxCsm)rg)4>GDN(kqrBrwYV$Cg;s_Dmx4K0&-evQ=# zp2qbtG{k6;j5>esUztw3Dl0HyWaVjzajbtmJ&hSw?CNO6cmBi7QX}sI8hC0>;qzrG z1FN+acFY7)9d`7}pM&lOf~i+l62_>%L}9nPHPG=`V=WBNrAUKl3z+vO4iuz*?&X)y zuKod66?5m;=lS^8CZA6-imtT3=eal3U)g)Q?{-#9%ph`ywg3-t!9WsTIFFg+SkYR! zOMLgV69&C2-kN)TLo<9V%}1w$va;NJU*wqR9&;{j?>%X^BDc{5;N`GIvts{Or`Y~v z?Z?n-wuZz`>A+>;!oA^CZ7Jsp;R7K7Fqc`rOE0x-j3VsC3iM!GNuKVJ!aq$)%Ome( z_q;vvuJ>={UDoTPGSJdc_OF0NV0(aikunw{{jOh $*<;Ztpd>O0ueB>WP^=#L?1Vy9o?(r-7wh?rp3%3JP{8 zzA{*`B>y%}cq`JM6MOOI1bf1c3%d%D*S~NOvW-E^h*v%I rQ;zpUxRb#Hcw><3iDgU10M*TU}_nWA4i8HrBi5J6 ~ z{+rTyYIN)GO01bSt6yCg%NzV=$JR}4r9vaaqX=!1PQ^%IU=WYUe qoe_@qmI#sbdhUNNsdN*PcLf$$1c0*z=_j zd8;B345A*$armu__fk05!?0l0Xe&nSg3yC5c7} YQp?4tr>?RIpW`}D~-&~5Jc!GztNdG9|58tXsl)J8VmK3=qU z<)**i7j0Vj@?~A(*|YBpR^2?Xchyb0ixLnfz+ntk#6L$0Jw~6=5h-L FUy`gqj$=}6IC(eI}cWgh9-KBT*&q)6M(&B=$D}BgH1$>O? z9+V~-V+B592TD&u|G@QX+EDe}Cms2OQO3xPK^OO=2k*RFx_gCgnMvZiRJ->4@eh#= ziz6R|dikS^)_C53vS;A#FG_gZKX3E_d!jC8P_Ar53IduHt0H+xez;XTd8i39CY$}m zLNc4v10nx%h6(!xf;n>VtyTc`1=qx?)j)*+jY5>IsaZ_Q&hT1>itQ>U_~JU!1V1Cb zFqdT`%5yzhiW^A{`)1u6n)|wWe@g(=5JxOMB8ojH$JM<)16T1OuVd7B9(Hp4O+PuW z6?5K)8%P=CJR`XsGg$TjTMoM6Q5+4zR}>mF+z%8?EQZ9`t8#BP(`A4kOwPf5*Q7{j zdY*mip(m!A5Ov|2vP|5vuNL|i&bFAz)qbT6*wU+oE>B_6{;s(<@Cj1YA$b+j|4r#H za`6a$ROcTqgJAV{m#7E!l4n8IOAUuLW_0o5=(zO{kUQD18 z78XSsd!FI(%AaV~MYlaZ6n`5Eu#{d0S(c(0#