diff options
| author | 魏曹先生 <1992414357@qq.com> | 2026-05-27 12:48:54 +0800 |
|---|---|---|
| committer | 魏曹先生 <1992414357@qq.com> | 2026-05-27 12:49:23 +0800 |
| commit | b1ac9fb8ed90699474e911674f1a60b139563858 (patch) | |
| tree | 59dbd2dfb40bbff7d5110915bf7e1a909f0f9116 | |
| parent | 67d80b593839a29cfccdc541469a39f57e98bca2 (diff) | |
Add Chinese tutorial for Step 1 of Mingling framework
| -rw-r--r-- | docs/.gitignore | 1 | ||||
| -rw-r--r-- | docs/_zh_CN/_sidebar.md | 2 | ||||
| -rw-r--r-- | docs/_zh_CN/pages/1-intro.md | 68 | ||||
| -rw-r--r-- | docs/_zh_CN/pages/2-step1.md | 140 | ||||
| -rw-r--r-- | docs/play/sources/zh_CN/2-fruit-mgr-expect.md | 104 | ||||
| -rw-r--r-- | docs/play/sources/zh_CN/2-writing.md | 195 | ||||
| -rw-r--r-- | docs/play/sources/zh_CN/2-writing1.md | 208 | ||||
| -rw-r--r-- | docs/play/sources/zh_CN/2-writing2.md | 527 | ||||
| -rw-r--r-- | docs/play/sources/zh_CN/2-writing3.md | 317 | ||||
| -rw-r--r-- | docs/res/graph/2-1.drawio | 49 | ||||
| -rw-r--r-- | docs/res/graph/2-1.drawio.svg | 4 |
11 files changed, 1615 insertions, 0 deletions
diff --git a/docs/.gitignore b/docs/.gitignore new file mode 100644 index 0000000..8d71bf9 --- /dev/null +++ b/docs/.gitignore @@ -0,0 +1 @@ +*.bkp diff --git a/docs/_zh_CN/_sidebar.md b/docs/_zh_CN/_sidebar.md index 40968ba..8c854f9 100644 --- a/docs/_zh_CN/_sidebar.md +++ b/docs/_zh_CN/_sidebar.md @@ -1 +1,3 @@ - [Welcome!](README) +* [介绍](pages/1-intro) +* [初次上手!](pages/2-step1) diff --git a/docs/_zh_CN/pages/1-intro.md b/docs/_zh_CN/pages/1-intro.md new file mode 100644 index 0000000..4e3106c --- /dev/null +++ b/docs/_zh_CN/pages/1-intro.md @@ -0,0 +1,68 @@ +<h1 align="center">介绍</h1> +<p align="center"> + <b>Mingling</b> 能做什么? +</p> + +## 前言 + + 首先,非常感谢您愿意尝试和体验 **Mingling** + + 因为这是一个早期框架,所以尚不成熟。 + + 若您在使用过程中遇到任何问题,欢迎提交 [Issue](https://github.com/catilgrass/mingling/issues),我们乐意解决。 + +<div style="display: flex; gap: 16px; padding: 8px; align-items: stretch; max-width: 90%;"> + <div style="flex-shrink: 0; display: flex; align-items: center;"> + <a href="https://github.com/catilgrass/mingling" target="_blank"> + <img src="../res/pixel_icon_core_1024.png" style="height: 120px; object-fit: contain; padding: 8px;" /> + </a> + </div> + <div style="display: flex; flex-direction: column; justify-content: flex-start;"> + <div style="font-weight: bold; font-size: 1.2em; margin-bottom: 8px;"> + <a href="https://github.com/catilgrass/mingling" target="_blank" style="text-decoration: none; color: inherit;">Mingling - Github</a> + </div> + <div style="color: #555;"> + A Rust CLI framework for many subcmds & complex workflows, reduces boilerplate via proc macros, focus on biz logic + </div> + </div> +</div> + +## Mingling 是什么? + + **Mingling** 是一款 Rust 命令行开发框架,更准确地说,它是一款在调度、执行、渲染等方面提供高度抽象的框架。 + + 它的核心逻辑是 **"转换"** —— 您输入的命令行参数(`Vec<String>`)会经过一系列的类型转换,最终变成您想要的结果。用一张图来说明: + + <center> + <img src="../res/graph/flow.drawio.svg"/> + </center> + + **这意味着**,您的执行逻辑和渲染逻辑是完全分离的:所有的状态、数据和结构都是类型,它们都只是转换过程中的一个环节,清晰又灵活。 + +## 它适合什么样的项目? + + 如果您正在开发一个**子命令多、嵌套层次深、横切关注点多**,并且对**执行效率和动态补全**有要求的命令行工具,那么 **Mingling** 会是一个很好的选择。 + + 这些能力得益于它高度抽象的宏系统,以及几乎全部在编译期完成的构建逻辑,让您在运行时能获得出色的性能。 + +## Mingling 能做些什么? + + **Mingling** 专注于命令行流程的调度与编排,为您提供以下能力: + + 1. **核心调度** — 通过类型转换优雅地编排业务逻辑 + 2. **纯函数设计** — 所有行为都是纯函数,可以直接测试 + 3. **无限嵌套** — 支持无限嵌套的子命令系统,再复杂的结构也能驾驭 + 4. **动态补全** — 为任意子命令插入完全动态的补全逻辑 **\[`comp`\]** + 5. **帮助文档** — 为任意子命令插入帮助文档,让用户轻松上手 + +## Mingling 不做些什么? + + **Mingling** 专注于命令行**流程的调度与编排**,因此它不会提供以下功能(您可以自由搭配其他库来实现): + + 1. ❌ 彩色文字、进度条等外观功能 + 2. ❌ 国际化、本地化功能 + 3. ❌ TUI 界面功能 + +<p align="center" style="font-size: 0.85em; color: gray;"> + Written by @Weicao-CatilGrass +</p> diff --git a/docs/_zh_CN/pages/2-step1.md b/docs/_zh_CN/pages/2-step1.md new file mode 100644 index 0000000..56f4b3c --- /dev/null +++ b/docs/_zh_CN/pages/2-step1.md @@ -0,0 +1,140 @@ +<h1 align="center">初次上手!</h1> +<p align="center"> + 使用 <b>Mingling</b> 开发简易水果名搜索命令行程序 +</p> + +## 前言 + +在本篇示例中,我将介绍如何使用 **Mingling** 开发基本的命令行程序,它包括: + +1. `fruit-mgr list` 命令 +2. `fruit-mgr list --help` 帮助页面 + +<iframe + src="../play/play.html?tur=zh_CN/2-fruit-mgr-expect.md&title=水果管理器预期效果" + height="580px"> +</iframe> + +## 一、导入依赖 + +首先,请确保您的项目依赖 **Mingling** + +若未导入依赖,您可以在 `Cargo.toml` 添加如下内容: + +```toml +[dependencies.mingling] +version = "0.1.9" +features = [""] +``` + +## 二、编写 `main.rs`,创建基本的项目 + +在 `src/main.rs` 中,我们将编写程序的入口函数: + +<iframe + src="../play/play.html?tur=zh_CN/2-writing.md&title=编写入口" + height="500px"> +</iframe> + +## 三、注册 `list` 子命令 + +<iframe + src="../play/play.html?tur=zh_CN/2-writing1.md&title=注册 List 子命令" + height="550px"> +</iframe> + +## 四、实现 `EntryList` 行为 + +<iframe + src="../play/play.html?tur=zh_CN/2-writing2.md&title=实现 EntryList 行为" + height="860px"> +</iframe> + +<p align="center" style="font-size: 0.85em; color: gray;"> + Written by @Weicao-CatilGrass +</p> + +## 五、渲染 `ResultFruits` + +在上一步中,`handle_entry_list` 链接收 `EntryList`,并输出了 `ResultFruits`。 + +接下来我们就要为 `ResultFruits` 渲染出最终的结果,使整个程序像下图这样排列: + +<center> + <img src="../res/graph/2-1.drawio.svg"/> +</center> + +让我们开始编写代码吧: + +<iframe + src="../play/play.html?tur=zh_CN/2-writing3.md&title=渲染 ResultFruits" + height="740px"> +</iframe> + +### 💡 关于 `r_println!` 宏 + +`r_println!` 宏并不是对 `println!` 的包装 + +它是为 `#[renderer]` 宏中 **隐式注入** 的 `&mut RenderResult` 值提供。 + +在 `r_println!` 调用时,不会立刻向 stdout 输出信息,而是会被累计到 `&mut RenderResult` 中,在程序结束时整体输出。 + + +## 六、编译并运行 + +现在您已经完成了 `list` 命令,现在可以使用 `cargo run` 运行您的程序: + +```bash +cargo run -- list +``` + +您将会看到如下输出: + +``` +Apple +Banana +Orange +``` + +<details> +<summary>完整代码</summary> + +```rust +use mingling::prelude::*; + +dispatcher!("list", CMDList => EntryList); + +fn main() { + let mut program = ThisProgram::new(); + program.with_dispatcher(CMDList); + program.exec_and_exit(); +} + +pack!(ResultFruits = Vec<String>); + +#[chain] +fn handle_entry_list(_prev: EntryList) -> Next { + let fruits = vec![ + "Apple".to_string(), + "Banana".to_string(), + "Orange".to_string(), + ]; + ResultFruits::new(fruits) +} + +#[renderer] +fn render_fruits(result: ResultFruits) { + let vec: &Vec<String> = &*result; + for fruit in vec { + r_println!("{}", fruit) + } +} + +gen_program!(); + +``` +</details> + +<p align="center" style="font-size: 0.85em; color: gray;"> + Written by @Weicao-CatilGrass +</p> diff --git a/docs/play/sources/zh_CN/2-fruit-mgr-expect.md b/docs/play/sources/zh_CN/2-fruit-mgr-expect.md new file mode 100644 index 0000000..708dbc7 --- /dev/null +++ b/docs/play/sources/zh_CN/2-fruit-mgr-expect.md @@ -0,0 +1,104 @@ +该命令运行起来应该是这样: + +```bash +~# fruit-mgr <<<<<<<<<< "输入命令" +``` + +--- + +```bash +~# fruit-mgr +Welcome to use FruitManager <<<<<<<<<< "输出欢迎词" +~# +``` + +--- + +```bash +~# fruit-mgr +Welcome to use FruitManager +~# fruit-mgr list --help <<<<<<<<<< "查看 list 命令的帮助" +``` + +--- + +```bash +~# fruit-mgr +Welcome to use FruitManager +~# fruit-mgr list --help +Description: List all fruits +Usage: fruit-mgr list --filter <NAME> <<<<<<<<<< "输出帮助" +~# +``` +--- + +```bash +~# fruit-mgr +Welcome to use FruitManager +~# fruit-mgr list --help +Description: List all fruits +Usage: fruit-mgr list --filter <NAME> +~# fruit-mgr list <<<<<<<<<< "输入命令列出水果" +``` + +--- + +```bash +~# fruit-mgr +Welcome to use FruitManager +~# fruit-mgr list --help +Description: List all fruits +Usage: fruit-mgr list --filter <NAME> +~# fruit-mgr list +Apple +Banana +Orange <<<<<<<<<< "输出水果列表" +~# +``` + +--- + +```bash +~# fruit-mgr +Welcome to use FruitManager +~# fruit-mgr list --help +Description: List all fruits +Usage: fruit-mgr list --filter <NAME> +~# fruit-mgr list +Apple <<<<<<<<<< "当然,我们可以使用 --filter 来过滤出 Apple" +Banana +Orange +~# +``` + +--- + +```bash +~# fruit-mgr +Welcome to use FruitManager +~# fruit-mgr list --help +Description: List all fruits +Usage: fruit-mgr list --filter <NAME> +~# fruit-mgr list +Apple +Banana +Orange +~# fruit-mgr list --filter A <<<<<<<<<< "过滤出名字含大写 A 的水果" +``` + +--- + +```bash +~# fruit-mgr +Welcome to use FruitManager +~# fruit-mgr list --help +Description: List all fruits +Usage: fruit-mgr list --filter <NAME> +~# fruit-mgr list +Apple +Banana +Orange +~# fruit-mgr list --filter A +Apple <<<<<<<<<< "只输出 Apple" +~# +``` diff --git a/docs/play/sources/zh_CN/2-writing.md b/docs/play/sources/zh_CN/2-writing.md new file mode 100644 index 0000000..bdac3b7 --- /dev/null +++ b/docs/play/sources/zh_CN/2-writing.md @@ -0,0 +1,195 @@ +这是 `main.rs` 的默认内容,让我们先删除默认的 `Hello, World!` + +```rust + + +fn main() { + println!("Hello, World!"); +} +``` + +--- + +```rust + + +fn main() { + println!("Hello, World!"); <<<<<<<<<< "删除 Hello, World!" +} +``` + +--- + +```rust + + +fn main() { + <<<<<<<<<< "删除 Hello, World!" +} +``` + +--- + +接下来,让我们构建基本的 **Mingling** 程序入口 + +```rust + + +fn main() { + +} +``` + +--- + +```rust +<<<<<<<<<< "在此处引入 Mingling 的预导入模块" + +fn main() { + +} +``` + +--- +```rust +use mingling::prelude::*; <<<<<<<<<< "编写" + +fn main() { + +} +``` + +--- + +```rust +use mingling::prelude::*; + +fn main() { + +} + +<<<<<<<<<< "在此处引入 gen_program!() 用于生成 ThisProgram" +``` + +--- + + +```rust +use mingling::prelude::*; + +fn main() { + +} + +gen_program!(); <<<<<<<<<< "编写" +``` + +--- + + +```rust +use mingling::prelude::*; <<<<<<<<<< "gen_program!() 由 prelude 提供" + +fn main() { + +} + +gen_program!(); +``` + +--- + + +```rust +use mingling::prelude::*; + +fn main() { + +} + +gen_program!(); <<<<<<<<<< "gen_program!() 必须放在根模块的结尾,这是宏展开的限制" +``` + +--- + + +```rust +use mingling::prelude::*; + +fn main() { + <<<<<<<<<< "在此处使用 ThisProgram 创建程序" +} + +gen_program!(); +``` + +--- + + +```rust +use mingling::prelude::*; + +fn main() { + let mut program = ThisProgram::new(); <<<<<<<<<< "编写" +} + +gen_program!(); +``` + +--- + + +```rust +use mingling::prelude::*; + +fn main() { + let mut program = ThisProgram::new(); +} + +gen_program!(); <<<<<<<<<< "ThisProgram 由 gen_program!() 生成" +``` + +--- + +```rust +use mingling::prelude::*; + +fn main() { + let mut program = ThisProgram::new(); + + <<<<<<<<<< "在此处执行程序并退出" +} + +gen_program!(); +``` + +--- + + +```rust +use mingling::prelude::*; + +fn main() { + let mut program = ThisProgram::new(); + + program.exec_and_exit(); <<<<<<<<<< "编写" +} + +gen_program!(); +``` + +--- + +至此, **Mingling**的基本入口就搭建完成 + +```rust +use mingling::prelude::*; + +fn main() { + let mut program = ThisProgram::new(); + + program.exec_and_exit(); +} + +gen_program!(); +``` diff --git a/docs/play/sources/zh_CN/2-writing1.md b/docs/play/sources/zh_CN/2-writing1.md new file mode 100644 index 0000000..e416118 --- /dev/null +++ b/docs/play/sources/zh_CN/2-writing1.md @@ -0,0 +1,208 @@ +我们刚刚创建了基本的入口,现在编写子命令: `list` + +```rust +use mingling::prelude::*; + +fn main() { + let mut program = ThisProgram::new(); + + program.exec_and_exit(); +} + +gen_program!(); +``` + +--- + +```rust +use mingling::prelude::*; + +fn main() { + let mut program = ThisProgram::new(); + <<<<<<<<<< "所有的资源将在此处注册" + program.exec_and_exit(); +} + +gen_program!(); +``` + +--- + +```rust +use mingling::prelude::*; + +<<<<<<<<<< "让我们在此处注册一个分发器,将 list 命令分发到指定的入口" + +fn main() { + let mut program = ThisProgram::new(); + + program.exec_and_exit(); +} + +gen_program!(); +``` + +--- + +```rust +use mingling::prelude::*; + +dispatcher!( <<<<<<<<<< "编写" + +fn main() { + let mut program = ThisProgram::new(); + + program.exec_and_exit(); +} + +gen_program!(); +``` + +--- + +```rust +use mingling::prelude::*; + +dispatcher!("list", <<<<<<<<<< "编写命令名称" + +fn main() { + let mut program = ThisProgram::new(); + + program.exec_and_exit(); +} + +gen_program!(); +``` + +--- + +```rust +use mingling::prelude::*; + +dispatcher!("list", CMDList <<<<<<<<<< "编写分发器名称" + +fn main() { + let mut program = ThisProgram::new(); + + program.exec_and_exit(); +} + +gen_program!(); +``` + +--- + +```rust +use mingling::prelude::*; + +dispatcher!("list", CMDList => EntryList <<<<<<<<<< "编写入口名称" + +fn main() { + let mut program = ThisProgram::new(); + + program.exec_and_exit(); +} + +gen_program!(); +``` + +--- + +```rust +use mingling::prelude::*; + +dispatcher!("list", CMDList => EntryList); <<<<<<<<<< "这样,list 命令的分发器 CMDList 就被注册了" + +fn main() { + let mut program = ThisProgram::new(); + + program.exec_and_exit(); +} + +gen_program!(); +``` + +--- + +```rust +use mingling::prelude::*; <<<<<<<<<< "dispatcher! 宏由 prelude 提供" + +dispatcher!("list", CMDList => EntryList); + +fn main() { + let mut program = ThisProgram::new(); + + program.exec_and_exit(); +} + +gen_program!(); +``` + +--- + +```rust +use mingling::prelude::*; + +dispatcher!("list", CMDList => EntryList); + +fn main() { + let mut program = ThisProgram::new(); + <<<<<<<<<< "Ok, 现在在此处为程序添加分发器" + program.exec_and_exit(); +} + +gen_program!(); +``` + +--- + + +```rust +use mingling::prelude::*; + +dispatcher!("list", CMDList => EntryList); + +fn main() { + let mut program = ThisProgram::new(); + program.with_dispatcher( <<<<<<<<<< "使用 with_dispatcher 为程序添加分发器" + program.exec_and_exit(); +} + +gen_program!(); +``` + +--- + +```rust +use mingling::prelude::*; + +dispatcher!("list", CMDList => EntryList); + +fn main() { + let mut program = ThisProgram::new(); + program.with_dispatcher(CMDList); <<<<<<<<<< "添加刚创建的分发器 CMDList" + program.exec_and_exit(); +} + +gen_program!(); +``` + +--- + +至此,`list` 子命令便已被注册到程序 + +```rust +use mingling::prelude::*; + +dispatcher!("list", CMDList => EntryList); + +fn main() { + let mut program = ThisProgram::new(); + program.with_dispatcher(CMDList); + program.exec_and_exit(); +} + +gen_program!(); +``` + +--- diff --git a/docs/play/sources/zh_CN/2-writing2.md b/docs/play/sources/zh_CN/2-writing2.md new file mode 100644 index 0000000..4a4d5fb --- /dev/null +++ b/docs/play/sources/zh_CN/2-writing2.md @@ -0,0 +1,527 @@ +现在让我们为其创建行为注册的 `list` 子命令添加入口行为 + +```rust +use mingling::prelude::*; + +dispatcher!("list", CMDList => EntryList); + +fn main() { + let mut program = ThisProgram::new(); + program.with_dispatcher(CMDList); + program.exec_and_exit(); +} + +gen_program!(); +``` + +--- + +```rust +use mingling::prelude::*; + +dispatcher!("list", CMDList => EntryList); + +fn main() { + let mut program = ThisProgram::new(); + program.with_dispatcher(CMDList); + program.exec_and_exit(); +} + +<<<<<<<<<< "在此处创建链,用于接收 CMDList 传入的 EntryList" + +gen_program!(); +``` + +--- + +```rust +use mingling::prelude::*; + +dispatcher!("list", CMDList => EntryList); + +fn main() { + let mut program = ThisProgram::new(); + program.with_dispatcher(CMDList); + program.exec_and_exit(); +} + +#[chain] <<<<<<<<<< "编写" + +gen_program!(); +``` + +--- + +```rust +use mingling::prelude::*; + +dispatcher!("list", CMDList => EntryList); + +fn main() { + let mut program = ThisProgram::new(); + program.with_dispatcher(CMDList); + program.exec_and_exit(); +} + +#[chain] +fn handle_entry_list( <<<<<<<<<< "创建函数体" + +gen_program!(); +``` + +--- + +```rust +use mingling::prelude::*; + +dispatcher!("list", CMDList => EntryList); + +fn main() { + let mut program = ThisProgram::new(); + program.with_dispatcher(CMDList); + program.exec_and_exit(); +} + +#[chain] +fn handle_entry_list(prev: EntryList <<<<<<<<<< "声明接收 EntryList 类型" + +gen_program!(); +``` + +--- + +```rust +use mingling::prelude::*; + +dispatcher!("list", CMDList => EntryList); + +fn main() { + let mut program = ThisProgram::new(); + program.with_dispatcher(CMDList); + program.exec_and_exit(); +} + +#[chain] +fn handle_entry_list(prev: EntryList) -> Next {} <<<<<<<<<< "返回 Next,这代表下一个类型" + +gen_program!(); +``` + +--- + +```rust +use mingling::prelude::*; + +dispatcher!("list", CMDList => EntryList); + +fn main() { + let mut program = ThisProgram::new(); + program.with_dispatcher(CMDList); + program.exec_and_exit(); +} + +#[chain] +fn handle_entry_list(prev: EntryList) -> Next {} <<<<<<<<<< "Next 是 ChainProcess<ThisProgram> 的别名" + +gen_program!(); +``` + +--- + +```rust +use mingling::prelude::*; + +dispatcher!("list", CMDList => EntryList); + +fn main() { + let mut program = ThisProgram::new(); + program.with_dispatcher(CMDList); + program.exec_and_exit(); +} + +#[chain] +fn handle_entry_list(prev: EntryList) -> Next { + +} + +gen_program!(); <<<<<<<<<< "Next 由 gen_program!() 生成" +``` + +--- + +我们需要一个包装类型用来包装 `handle_entry_list` 的结果 + +```rust +use mingling::prelude::*; + +dispatcher!("list", CMDList => EntryList); + +fn main() { + let mut program = ThisProgram::new(); + program.with_dispatcher(CMDList); + program.exec_and_exit(); +} + +#[chain] +fn handle_entry_list(prev: EntryList) -> Next { + +} + +gen_program!(); +``` + +--- + +```rust +use mingling::prelude::*; + +dispatcher!("list", CMDList => EntryList); + +fn main() { + let mut program = ThisProgram::new(); + program.with_dispatcher(CMDList); + program.exec_and_exit(); +} + +<<<<<<<<<< "我们在此处定义一个包装类型" + +#[chain] +fn handle_entry_list(prev: EntryList) -> Next { + +} + +gen_program!(); +``` + +--- + +```rust +use mingling::prelude::*; + +dispatcher!("list", CMDList => EntryList); + +fn main() { + let mut program = ThisProgram::new(); + program.with_dispatcher(CMDList); + program.exec_and_exit(); +} + +pack!(ResultFruits <<<<<<<<<< "使用 pack! 宏快速创建一个包装类型" + +#[chain] +fn handle_entry_list(prev: EntryList) -> Next { + +} + +gen_program!(); +``` + +--- + + +```rust +use mingling::prelude::*; + +dispatcher!("list", CMDList => EntryList); + +fn main() { + let mut program = ThisProgram::new(); + program.with_dispatcher(CMDList); + program.exec_and_exit(); +} + +pack!(ResultFruits = Vec<String>); <<<<<<<<<< "将 ResultFruits 包装为 Vec<String>" + +#[chain] +fn handle_entry_list(prev: EntryList) -> Next { + +} + +gen_program!(); +``` + +--- + +```rust +use mingling::prelude::*; <<<<<<<<<< "pack! 由 prelude 提供" + +dispatcher!("list", CMDList => EntryList); + +fn main() { + let mut program = ThisProgram::new(); + program.with_dispatcher(CMDList); + program.exec_and_exit(); +} + +pack!(ResultFruits = Vec<String>); + +#[chain] +fn handle_entry_list(prev: EntryList) -> Next { + +} + +gen_program!(); +``` + +--- + +现在,继续编辑 `handle_entry_list` 的行为 + +```rust +use mingling::prelude::*; + +dispatcher!("list", CMDList => EntryList); + +fn main() { + let mut program = ThisProgram::new(); + program.with_dispatcher(CMDList); + program.exec_and_exit(); +} + +pack!(ResultFruits = Vec<String>); + +#[chain] +fn handle_entry_list(prev: EntryList) -> Next { + +} + +gen_program!(); +``` + +--- + +```rust +use mingling::prelude::*; + +dispatcher!("list", CMDList => EntryList); + +fn main() { + let mut program = ThisProgram::new(); + program.with_dispatcher(CMDList); + program.exec_and_exit(); +} + +pack!(ResultFruits = Vec<String>); + +#[chain] +fn handle_entry_list(prev: EntryList) -> Next { + <<<<<<<<<< "在此处硬编码水果列表" +} + +gen_program!(); +``` + +--- + +```rust +use mingling::prelude::*; + +dispatcher!("list", CMDList => EntryList); + +fn main() { + let mut program = ThisProgram::new(); + program.with_dispatcher(CMDList); + program.exec_and_exit(); +} + +pack!(ResultFruits = Vec<String>); + +#[chain] +fn handle_entry_list(prev: EntryList) -> Next { + let fruits = <<<<<<<<<< "编写" +} + +gen_program!(); +``` + +--- + +```rust +use mingling::prelude::*; + +dispatcher!("list", CMDList => EntryList); + +fn main() { + let mut program = ThisProgram::new(); + program.with_dispatcher(CMDList); + program.exec_and_exit(); +} + +pack!(ResultFruits = Vec<String>); + +#[chain] +fn handle_entry_list(prev: EntryList) -> Next { + let fruits = vec![ <<<<<<<<<< "编写" +} + +gen_program!(); +``` + +--- + +```rust +use mingling::prelude::*; + +dispatcher!("list", CMDList => EntryList); + +fn main() { + let mut program = ThisProgram::new(); + program.with_dispatcher(CMDList); + program.exec_and_exit(); +} + +pack!(ResultFruits = Vec<String>); + +#[chain] +fn handle_entry_list(prev: EntryList) -> Next { + let fruits = vec![ + "Apple".to_string(), + "Banana".to_string(), + "Orange".to_string(), + ]; <<<<<<<<<< "编写" +} + +gen_program!(); +``` + +--- + +```rust +use mingling::prelude::*; + +dispatcher!("list", CMDList => EntryList); + +fn main() { + let mut program = ThisProgram::new(); + program.with_dispatcher(CMDList); + program.exec_and_exit(); +} + +pack!(ResultFruits = Vec<String>); + +#[chain] +fn handle_entry_list(prev: EntryList) -> Next { + let fruits = vec![ + "Apple".to_string(), + "Banana".to_string(), + "Orange".to_string(), + ]; + <<<<<<<<<< "接下来,在此处将 Vec<String> 包装成 ResultFruits 并返回" +} + +gen_program!(); +``` + +--- + +```rust +use mingling::prelude::*; + +dispatcher!("list", CMDList => EntryList); + +fn main() { + let mut program = ThisProgram::new(); + program.with_dispatcher(CMDList); + program.exec_and_exit(); +} + +pack!(ResultFruits = Vec<String>); + +#[chain] +fn handle_entry_list(prev: EntryList) -> Next { + let fruits = vec![ + "Apple".to_string(), + "Banana".to_string(), + "Orange".to_string(), + ]; + ResultFruits::new(fruits) <<<<<<<<<< "编写" +} + +gen_program!(); +``` + +--- + +```rust +use mingling::prelude::*; + +dispatcher!("list", CMDList => EntryList); + +fn main() { + let mut program = ThisProgram::new(); + program.with_dispatcher(CMDList); + program.exec_and_exit(); +} + +pack!(ResultFruits = Vec<String>); + +#[chain] vvvv <<<<<<<<<< "因为没使用 prev 传入的参数,所以将其忽略" +fn handle_entry_list(prev: EntryList) -> Next { + let fruits = vec![ + "Apple".to_string(), + "Banana".to_string(), + "Orange".to_string(), + ]; + ResultFruits::new(fruits) +} + +gen_program!(); +``` + +--- + +```rust +use mingling::prelude::*; + +dispatcher!("list", CMDList => EntryList); + +fn main() { + let mut program = ThisProgram::new(); + program.with_dispatcher(CMDList); + program.exec_and_exit(); +} + +pack!(ResultFruits = Vec<String>); + +#[chain] +fn handle_entry_list(_prev: EntryList) -> Next { + let fruits = vec![ + "Apple".to_string(), + "Banana".to_string(), + "Orange".to_string(), + ]; + ResultFruits::new(fruits) +} + +gen_program!(); +``` + +--- + +好的,现在 `EntryList` 的行为便编写完成 + +```rust +use mingling::prelude::*; + +dispatcher!("list", CMDList => EntryList); + +fn main() { + let mut program = ThisProgram::new(); + program.with_dispatcher(CMDList); + program.exec_and_exit(); +} + +pack!(ResultFruits = Vec<String>); + +#[chain] +fn handle_entry_list(_prev: EntryList) -> Next { + let fruits = vec![ + "Apple".to_string(), + "Banana".to_string(), + "Orange".to_string(), + ]; + ResultFruits::new(fruits) +} + +gen_program!(); +``` diff --git a/docs/play/sources/zh_CN/2-writing3.md b/docs/play/sources/zh_CN/2-writing3.md new file mode 100644 index 0000000..e2038e3 --- /dev/null +++ b/docs/play/sources/zh_CN/2-writing3.md @@ -0,0 +1,317 @@ +好的,现在开始编写 `ResultFruits` 的渲染器 + +```rust +use mingling::prelude::*; + +pack!(ResultFruits = Vec<String>); + +#[chain] +fn handle_entry_list(_prev: EntryList) -> Next { + // ... +} + +gen_program!(); +``` + +--- + +```rust +use mingling::prelude::*; + +pack!(ResultFruits = Vec<String>); + +#[chain] +fn handle_entry_list(_prev: EntryList) -> Next { + // ... +} + +<<<<<<<<<< "我们将在此处编写渲染器代码" + +gen_program!(); +``` + +--- + +```rust +use mingling::prelude::*; + +pack!(ResultFruits = Vec<String>); + +#[chain] +fn handle_entry_list(_prev: EntryList) -> Next { + // ... +} + +#[renderer] <<<<<<<<<< "和 #[chain] 类似,渲染器函数叫 #[renderer]" + +gen_program!(); +``` + +--- + +```rust +use mingling::prelude::*; + +pack!(ResultFruits = Vec<String>); + +#[chain] +fn handle_entry_list(_prev: EntryList) -> Next { + // ... +} + +#[renderer] +fn render_fruits( <<<<<<<<<< "编写函数体" + +gen_program!(); +``` + +--- + +```rust +use mingling::prelude::*; + +pack!(ResultFruits = Vec<String>); + +#[chain] +fn handle_entry_list(_prev: EntryList) -> Next { + // ... +} + +#[renderer] +fn render_fruits(result: ResultFruits <<<<<<<<<< "声明接收 ResultFruits 类型" + +gen_program!(); +``` + +--- + +```rust +use mingling::prelude::*; + +pack!(ResultFruits = Vec<String>); + +#[chain] +fn handle_entry_list(_prev: EntryList) -> Next { + // ... +} + +#[renderer] +fn render_fruits(result: ResultFruits) {} <<<<<<<<<< "一般情况下,渲染器什么都不用返回" + +gen_program!(); +``` + +--- + +```rust +use mingling::prelude::*; + +pack!(ResultFruits = Vec<String>); + +#[chain] +fn handle_entry_list(_prev: EntryList) -> Next { + // ... +} + +#[renderer] +fn render_fruits(result: ResultFruits) { + <<<<<<<<<< "接下来在此处编写渲染逻辑" +} + +gen_program!(); +``` + +--- + +```rust +use mingling::prelude::*; + +pack!(ResultFruits = Vec<String>); + +#[chain] +fn handle_entry_list(_prev: EntryList) -> Next { + // ... +} + +#[renderer] +fn render_fruits(result: ResultFruits) { + let vec: &Vec<String> = <<<<<<<<<< "首先我们先解包 ResultFruits" +} + +gen_program!(); +``` + +--- + +```rust +use mingling::prelude::*; + +pack!(ResultFruits = Vec<String>); + +#[chain] +fn handle_entry_list(_prev: EntryList) -> Next { + // ... +} + +#[renderer] +fn render_fruits(result: ResultFruits) { + let vec: &Vec<String> = <<<<<<<<<< "pack! 宏会自动为 ResultFruits 实现 AsRef trait" +} + +gen_program!(); +``` + +--- + +```rust +use mingling::prelude::*; + +pack!(ResultFruits = Vec<String>); + +#[chain] +fn handle_entry_list(_prev: EntryList) -> Next { + // ... +} + +#[renderer] +fn render_fruits(result: ResultFruits) { + let vec: &Vec<String> = result.as_ref(); <<<<<<<<<< "所以此处可以使用 as_ref()" +} + +gen_program!(); +``` + +--- + +```rust +use mingling::prelude::*; + +pack!(ResultFruits = Vec<String>); + +#[chain] +fn handle_entry_list(_prev: EntryList) -> Next { + // ... +} + +#[renderer] +fn render_fruits(result: ResultFruits) { + let vec: &Vec<String> = &*result; <<<<<<<<<< "当然,deref 也可以解包 ResultFruits" +} + +gen_program!(); +``` + +--- + +```rust +use mingling::prelude::*; + +pack!(ResultFruits = Vec<String>); + +#[chain] +fn handle_entry_list(_prev: EntryList) -> Next { + // ... +} + +#[renderer] +fn render_fruits(result: ResultFruits) { + let vec: &Vec<String> = &*result; + for fruit in vec { <<<<<<<<<< "接下来,循环遍历 ResultFruits 中的水果字符串" +} + +gen_program!(); +``` + +--- + +```rust +use mingling::prelude::*; + +pack!(ResultFruits = Vec<String>); + +#[chain] +fn handle_entry_list(_prev: EntryList) -> Next { + // ... +} + +#[renderer] +fn render_fruits(result: ResultFruits) { + let vec: &Vec<String> = &*result; + for fruit in vec { + <<<<<<<<<< "在循环中打印内容" + } +} + +gen_program!(); +``` + +--- + +```rust +use mingling::prelude::*; + +pack!(ResultFruits = Vec<String>); + +#[chain] +fn handle_entry_list(_prev: EntryList) -> Next { + // ... +} + +#[renderer] +fn render_fruits(result: ResultFruits) { + let vec: &Vec<String> = &*result; + for fruit in vec { + r_println!("{}", fruit) <<<<<<<<<< "使用 r_println 在循环中打印内容" + } +} + +gen_program!(); +``` + +--- + +```rust +use mingling::prelude::*; <<<<<<<<<< "r_println! 由 prelude 提供" + +pack!(ResultFruits = Vec<String>); + +#[chain] +fn handle_entry_list(_prev: EntryList) -> Next { + // ... +} + +#[renderer] +fn render_fruits(result: ResultFruits) { + let vec: &Vec<String> = &*result; + for fruit in vec { + r_println!("{}", fruit) + } +} + +gen_program!(); +``` + +--- + +至此 `ResultFruits` 的渲染逻辑便已完成 + +```rust +use mingling::prelude::*; + +pack!(ResultFruits = Vec<String>); + +#[chain] +fn handle_entry_list(_prev: EntryList) -> Next { + // ... +} + +#[renderer] +fn render_fruits(result: ResultFruits) { + let vec: &Vec<String> = &*result; + for fruit in vec { + r_println!("{}", fruit) + } +} + +gen_program!(); +``` diff --git a/docs/res/graph/2-1.drawio b/docs/res/graph/2-1.drawio new file mode 100644 index 0000000..4eadbc3 --- /dev/null +++ b/docs/res/graph/2-1.drawio @@ -0,0 +1,49 @@ +<mxfile host="Electron" agent="Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) draw.io/29.6.6 Chrome/144.0.7559.236 Electron/40.8.4 Safari/537.36" version="29.6.6"> + <diagram name="第 1 页" id="LM7r5u1z_U2gdEjkp0eh"> + <mxGraphModel dx="551" dy="595" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="827" pageHeight="1169" math="0" shadow="0"> + <root> + <mxCell id="0" /> + <mxCell id="1" parent="0" /> + <mxCell id="36lyGIhh-uHWtNRS2a_o-8" edge="1" parent="1" source="36lyGIhh-uHWtNRS2a_o-1" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;fillColor=#fff2cc;strokeColor=#d6b656;" target="36lyGIhh-uHWtNRS2a_o-2"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="36lyGIhh-uHWtNRS2a_o-1" parent="1" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#dae8fc;strokeColor=#6c8ebf;" value="CMDList" vertex="1"> + <mxGeometry height="40" width="120" x="280" y="120" as="geometry" /> + </mxCell> + <mxCell id="IAWgnODq_W8FyFbd8cU3-3" edge="1" parent="1" source="36lyGIhh-uHWtNRS2a_o-2" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;fillColor=#fff2cc;strokeColor=#d6b656;" target="IAWgnODq_W8FyFbd8cU3-1"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="36lyGIhh-uHWtNRS2a_o-2" parent="1" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#fff2cc;strokeColor=#d6b656;" value="EntryList" vertex="1"> + <mxGeometry height="40" width="120" x="280" y="200" as="geometry" /> + </mxCell> + <mxCell id="36lyGIhh-uHWtNRS2a_o-3" edge="1" parent="1" source="36lyGIhh-uHWtNRS2a_o-2" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;fillColor=#fff2cc;strokeColor=#d6b656;" target="36lyGIhh-uHWtNRS2a_o-2"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="IAWgnODq_W8FyFbd8cU3-5" edge="1" parent="1" source="36lyGIhh-uHWtNRS2a_o-4" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;fillColor=#fff2cc;strokeColor=#d6b656;" target="IAWgnODq_W8FyFbd8cU3-2"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="36lyGIhh-uHWtNRS2a_o-4" parent="1" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#fff2cc;strokeColor=#d6b656;" value="ResultFruits" vertex="1"> + <mxGeometry height="40" width="120" x="280" y="320" as="geometry" /> + </mxCell> + <mxCell id="36lyGIhh-uHWtNRS2a_o-11" parent="1" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#d5e8d4;strokeColor=#82b366;" value="RenderResult" vertex="1"> + <mxGeometry height="40" width="120" x="280" y="440" as="geometry" /> + </mxCell> + <mxCell id="36lyGIhh-uHWtNRS2a_o-12" edge="1" parent="1" source="36lyGIhh-uHWtNRS2a_o-11" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;fillColor=#d5e8d4;strokeColor=#82b366;" target="36lyGIhh-uHWtNRS2a_o-11"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="IAWgnODq_W8FyFbd8cU3-4" edge="1" parent="1" source="IAWgnODq_W8FyFbd8cU3-1" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;fillColor=#fff2cc;strokeColor=#d6b656;" target="36lyGIhh-uHWtNRS2a_o-4"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="IAWgnODq_W8FyFbd8cU3-1" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#fff2cc;strokeColor=#d6b656;" value="handle_entry_list" vertex="1"> + <mxGeometry height="20" width="120" x="280" y="270" as="geometry" /> + </mxCell> + <mxCell id="IAWgnODq_W8FyFbd8cU3-6" edge="1" parent="1" source="IAWgnODq_W8FyFbd8cU3-2" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;fillColor=#d5e8d4;strokeColor=#82b366;" target="36lyGIhh-uHWtNRS2a_o-11"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="IAWgnODq_W8FyFbd8cU3-2" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#d5e8d4;strokeColor=#82b366;" value="render_fruits" vertex="1"> + <mxGeometry height="20" width="120" x="280" y="390" as="geometry" /> + </mxCell> + </root> + </mxGraphModel> + </diagram> +</mxfile> diff --git a/docs/res/graph/2-1.drawio.svg b/docs/res/graph/2-1.drawio.svg new file mode 100644 index 0000000..e822be0 --- /dev/null +++ b/docs/res/graph/2-1.drawio.svg @@ -0,0 +1,4 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- Do not edit this file with editors other than draw.io --> +<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> +<svg xmlns="http://www.w3.org/2000/svg" style="background: transparent; background-color: transparent; color-scheme: light;" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="127" height="375" viewBox="0 0 127 375" content="<mxfile host="Electron" agent="Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) draw.io/29.6.6 Chrome/144.0.7559.236 Electron/40.8.4 Safari/537.36" version="29.6.6" scale="1" border="0"> <diagram name="第 1 页" id="LM7r5u1z_U2gdEjkp0eh"> <mxGraphModel dx="551" dy="595" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="827" pageHeight="1169" math="0" shadow="0"> <root> <mxCell id="0" /> <mxCell id="1" parent="0" /> <mxCell id="36lyGIhh-uHWtNRS2a_o-8" edge="1" parent="1" source="36lyGIhh-uHWtNRS2a_o-1" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;fillColor=#fff2cc;strokeColor=#d6b656;" target="36lyGIhh-uHWtNRS2a_o-2"> <mxGeometry relative="1" as="geometry" /> </mxCell> <mxCell id="36lyGIhh-uHWtNRS2a_o-1" parent="1" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#dae8fc;strokeColor=#6c8ebf;" value="CMDList" vertex="1"> <mxGeometry height="40" width="120" x="280" y="120" as="geometry" /> </mxCell> <mxCell id="IAWgnODq_W8FyFbd8cU3-3" edge="1" parent="1" source="36lyGIhh-uHWtNRS2a_o-2" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;fillColor=#fff2cc;strokeColor=#d6b656;" target="IAWgnODq_W8FyFbd8cU3-1"> <mxGeometry relative="1" as="geometry" /> </mxCell> <mxCell id="36lyGIhh-uHWtNRS2a_o-2" parent="1" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#fff2cc;strokeColor=#d6b656;" value="EntryList" vertex="1"> <mxGeometry height="40" width="120" x="280" y="200" as="geometry" /> </mxCell> <mxCell id="36lyGIhh-uHWtNRS2a_o-3" edge="1" parent="1" source="36lyGIhh-uHWtNRS2a_o-2" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;fillColor=#fff2cc;strokeColor=#d6b656;" target="36lyGIhh-uHWtNRS2a_o-2"> <mxGeometry relative="1" as="geometry" /> </mxCell> <mxCell id="IAWgnODq_W8FyFbd8cU3-5" edge="1" parent="1" source="36lyGIhh-uHWtNRS2a_o-4" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;fillColor=#fff2cc;strokeColor=#d6b656;" target="IAWgnODq_W8FyFbd8cU3-2"> <mxGeometry relative="1" as="geometry" /> </mxCell> <mxCell id="36lyGIhh-uHWtNRS2a_o-4" parent="1" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#fff2cc;strokeColor=#d6b656;" value="ResultFruits" vertex="1"> <mxGeometry height="40" width="120" x="280" y="320" as="geometry" /> </mxCell> <mxCell id="36lyGIhh-uHWtNRS2a_o-11" parent="1" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#d5e8d4;strokeColor=#82b366;" value="RenderResult" vertex="1"> <mxGeometry height="40" width="120" x="280" y="440" as="geometry" /> </mxCell> <mxCell id="36lyGIhh-uHWtNRS2a_o-12" edge="1" parent="1" source="36lyGIhh-uHWtNRS2a_o-11" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;fillColor=#d5e8d4;strokeColor=#82b366;" target="36lyGIhh-uHWtNRS2a_o-11"> <mxGeometry relative="1" as="geometry" /> </mxCell> <mxCell id="IAWgnODq_W8FyFbd8cU3-4" edge="1" parent="1" source="IAWgnODq_W8FyFbd8cU3-1" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;fillColor=#fff2cc;strokeColor=#d6b656;" target="36lyGIhh-uHWtNRS2a_o-4"> <mxGeometry relative="1" as="geometry" /> </mxCell> <mxCell id="IAWgnODq_W8FyFbd8cU3-1" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#fff2cc;strokeColor=#d6b656;" value="handle_entry_list" vertex="1"> <mxGeometry height="20" width="120" x="280" y="270" as="geometry" /> </mxCell> <mxCell id="IAWgnODq_W8FyFbd8cU3-6" edge="1" parent="1" source="IAWgnODq_W8FyFbd8cU3-2" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;fillColor=#d5e8d4;strokeColor=#82b366;" target="36lyGIhh-uHWtNRS2a_o-11"> <mxGeometry relative="1" as="geometry" /> </mxCell> <mxCell id="IAWgnODq_W8FyFbd8cU3-2" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#d5e8d4;strokeColor=#82b366;" value="render_fruits" vertex="1"> <mxGeometry height="20" width="120" x="280" y="390" as="geometry" /> </mxCell> </root> </mxGraphModel> </diagram> </mxfile> "><defs/><g style="filter: drop-shadow(light-dark(rgba(61, 69, 116, 0.4), rgba(168, 175, 216, 0.4)) 3px 3px 1.7px);"><g data-cell-id="0"><g data-cell-id="1"><g data-cell-id="36lyGIhh-uHWtNRS2a_o-8"><g transform="translate(0.5,0.5)"><path d="M 60 40 L 60 73.63" fill="none" stroke="#d6b656" stroke-miterlimit="10" pointer-events="stroke" style="stroke: rgb(214, 182, 86);"/><path d="M 60 78.88 L 56.5 71.88 L 60 73.63 L 63.5 71.88 Z" fill="#d6b656" stroke="#d6b656" stroke-miterlimit="10" pointer-events="all" style="fill: rgb(214, 182, 86); stroke: rgb(214, 182, 86);"/></g></g><g data-cell-id="36lyGIhh-uHWtNRS2a_o-1"><g transform="translate(0.5,0.5)"><rect x="0" y="0" width="120" height="40" fill="#dae8fc" stroke="#6c8ebf" pointer-events="all" style="fill: rgb(218, 232, 252); stroke: rgb(108, 142, 191);"/></g><g><g><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 118px; height: 1px; padding-top: 20px; margin-left: 1px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: #000000; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">CMDList</div></div></div></foreignObject><image x="1" y="13.5" width="118" height="17" xlink:href="data:image/png;base64,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"/></switch></g></g></g><g data-cell-id="IAWgnODq_W8FyFbd8cU3-3"><g transform="translate(0.5,0.5)"><path d="M 60 120 L 60 143.63" fill="none" stroke="#d6b656" stroke-miterlimit="10" pointer-events="stroke" style="stroke: rgb(214, 182, 86);"/><path d="M 60 148.88 L 56.5 141.88 L 60 143.63 L 63.5 141.88 Z" fill="#d6b656" stroke="#d6b656" stroke-miterlimit="10" pointer-events="all" style="fill: rgb(214, 182, 86); stroke: rgb(214, 182, 86);"/></g></g><g data-cell-id="36lyGIhh-uHWtNRS2a_o-2"><g transform="translate(0.5,0.5)"><rect x="0" y="80" width="120" height="40" fill="#fff2cc" stroke="#d6b656" pointer-events="all" style="fill: rgb(255, 242, 204); stroke: rgb(214, 182, 86);"/></g><g><g><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 118px; height: 1px; padding-top: 100px; margin-left: 1px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: #000000; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">EntryList</div></div></div></foreignObject><image x="1" y="93.5" width="118" height="17" xlink:href="data:image/png;base64,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"/></switch></g></g></g><g data-cell-id="36lyGIhh-uHWtNRS2a_o-3"><g transform="translate(0.5,0.5)"/></g><g data-cell-id="IAWgnODq_W8FyFbd8cU3-5"><g transform="translate(0.5,0.5)"><path d="M 60 240 L 60 263.63" fill="none" stroke="#d6b656" stroke-miterlimit="10" pointer-events="stroke" style="stroke: rgb(214, 182, 86);"/><path d="M 60 268.88 L 56.5 261.88 L 60 263.63 L 63.5 261.88 Z" fill="#d6b656" stroke="#d6b656" stroke-miterlimit="10" pointer-events="all" style="fill: rgb(214, 182, 86); stroke: rgb(214, 182, 86);"/></g></g><g data-cell-id="36lyGIhh-uHWtNRS2a_o-4"><g transform="translate(0.5,0.5)"><rect x="0" y="200" width="120" height="40" fill="#fff2cc" stroke="#d6b656" pointer-events="all" style="fill: rgb(255, 242, 204); stroke: rgb(214, 182, 86);"/></g><g><g><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 118px; height: 1px; padding-top: 220px; margin-left: 1px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: #000000; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">ResultFruits</div></div></div></foreignObject><image x="1" y="213.5" width="118" height="17" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAdgAAABECAYAAAAiCiQVAAAQAElEQVR4AeydCbh91RjGLyKzMhRRyZA5ZAgpUhlTmYpkSCkRyVBmmUIyS1HKI/OYKIUiYzKTmZBEQmYyv7/zv/s+++7/GvYZ9tnDee/zfXftNa/97rP3t4ZvfevSS/4zAkbACBgBI2AEZo6ABezMIXWBRsAIGAEjYASWlixgp/kVOK8RMAJGwAgYgQgCFrARYBxsBIyAETACRmAaBCxgp0HPeadBwHmNgBEwAoNGwAJ20I/XN2cEjIARMAJtIWAB2xbyrtcITIOA8xoBI9B5BCxgO/+I3EAjYASMgBHoIwIWsH18am6zETAC0yDgvEZgLghYwM4FZleyIAjsr/v8X4I3VZyp2wiso+btI/6c+GLxBeKPi7cUm4zAWAhYwI4FlxMbASMwcASO1v0dI95avJ74OuIdxV8U7yA2GYHaCFjA1oaq0YT3U+mpkU8s7pfK93XxyeJXiPcUbyw2GYFJf1Ox3xrhjxk4rHfQ/e0tDtHlFHi8+LJikxGohYAFbC2YOptoI7XsNuL7ip8mPkF8nvhM8dA/hrpFkxGYKQK3zpR2PcXzvskxGYE8AgEBm8/kFJ1HYFu18C3ic8S3FZuMgBHII/CffBKnMAL1EbCArY9VH1PeQo0+Rby52NRPBG6mZjM78Um59xabmkPgsyr6X+IY/UoR3xCPQ1dU4p3FrO1+SK5pgRCwgJ3xw+5gcddWm94jvozY1H0EWOO7h5r5SvF3l5n19e117WcoEBqkH6vsA8UxOlgRKQGs6BFdV/8fJ/6w+CIx7n5yNxSbFggBC9jFeNisG+27GLfa67tkxoEP8um6i6eIGb3KMc0RgaNU1z3FbNP5g1xGrWzT2UnXbxfniPznKxEuI1dGsPKaFhEBC9h+PHV61ZdSU8u8ifxbiY8Q16FH1EnUbpqFr/0qQuBq4nnQR1XJ88bkcadHVXwv6RNq9Tbi9cUoEt5LLpr6crKEIlQ2kRMsBgIWsP19zr9Q088WP13MGutf5KbozopkT58ckxFYQoi8SDiMw19TepMRMAI1EbCArQlUx5P9SO17tjhHt8olcHx/EXDLjYAR6BYCFrDdeh7TtOa4GpmxTFMjmZMYASNgBIzAtAhYwE6LYHfyM0X8wwaaw7ovFm4eorIPED9DvJeYdakN5M6SWPNilI2SCRZ1nqnCqXMPuYTdQK6p3wjwm9lVt/AEMduPdpN7VXHL1Jvq11VLWRLaTi56FYfIfbL4UeL7izGW4e+6gOgC+UF04SnMrg2/zxTFVHImyUo0wuxI+TDHyFrve3X9evFLxYyWT5V7ofhc8avE06zvPlD5vySm/d+Se5r4WPFhYup8h1zCfiIXDc33yd1CHCL2GmLWL8R1OyBvUMGh/ISh5avomRAdCMosGHu3qYJRTCrSlt3bpzI1HJczycj2IpqAqcFDdcFWGJ4RGLP9iC1kN1d4QdxL+d6q1wiSIm3MZWtaNV/Z/6RYRoWjNVxOW77mN6kkq+if8pXToG2soCChB1FOW1yDRzBDKRCMeA/+obAfiM8Qv038MvGrxW8VnyRGEY33iPflQfKbWkTAArZF8GdcNc+S7TipYtlXmYonjm0FfPi+J8/jxTnBuZnSHCRG+DEq0WVtYhSMYP2ActxRXIfYY/hgJfQWFoHQI8Ky2PPVXjSl5ZhqIsDvnA7ld5SemRw5WUITnRkfRrnZxLNI4DLCCPBRDsc4tG8I3FQNvrw4Rj9VxCXiFN1Ikez/Y+qOEYe8tekKSsmopO62IfZ5MgquK1hVvKmnCPB74iCKnja/tWYjIJnVoEPZWiNc8eQIWMBOjl2XcmLh5/BMg3Kb5DFycJbKmNZ28VNVRmoKTtFLHESApSKuzf1GgGnO1B3Q6WMrWSpNroxU3qHG0WE+UTfHaFSOqY8I1BOwfbyzxWkzSiOs4bAWFrvrnymCtRo5QULJhDXWawRj1wT+XQ6HB3xGLuuycqLEKBZli1ACNJlfG4qohF0sP7ZhWW/6t65N/USAkSu/0X62vr1Wv1lV817KiRLvJEssrLv+LZrKEa0hYAHbGvRTVcw6FvZqn6VSWFdFe1CXUWIEkXoBWRtDiSJWAGuk11IkGr53k4u1GtZ7OYtW3rUIe7oo8KwVoYBdxFcWx4hp4zsp8upiTgWiJ8+6MGtRjHwR8IoaBGEsBCP+BfOxTN0Yhh6KtGX3z6lMkTg6OYwc6/LDI+WgZR6JGgU/dPQ//S9XRjp3u7EoG5WfxW8SzcH0Yjltcc36ajnb9eXBkpScIKEohiY23wHeFWadeKfIx7fgncpVx2aykpmaRMACtkl015Q9i//Vj+GfVCj2al8iNzXqZOSHUHq/0sUIpSEMk8fiWVdlDeivlQTflH8H8R/FIdpdgTcWVwlNympY4UfLFy3MqqDhY/F9JTpejIBnOpv65e01MW2/o+6gYLZbyBslTBsWacsuo/xopg5F0CF7udqD1ji/DzqIn5IfIS+nl8QJR+VngcZ97EZQHCynLa6fU8mwdcVf9aLAxAEC5eP1wPDnSoimOZ2hjXWNhrYcU1sIWMC2hXzz9TJipTeLUErVhgUoRoihNEwJM/oNxRHGdgC20XAdYnrZ1XBGwtWwwo8QL380ivCqy6gdgVsNt7+bCLCVhc4B+6nZR82SBksSbPliJqbaoermXcyvVal3hE4zU8O51rCFjiWWXDrHN4iABWyD4LZUNB+zY1T3LcVMt8qJEs+fzeqxBIw22HcXiyf8C/yL8JaBcHrZgeBREFNdjLhHntE//xsCAii0YfO4TudpCPc77T2k3pF1VDgzVyg26tLUZQT4wHa5fW7beAhw4gdrlRxNx7acXG7WUVm7CaWjl8w0VCiuHJaqB2MV5bRc54xdsF/yY0rI2pIcU88RYH0YQyQ9v425Np+lklSFdEJRbHqYEvkbLhC6Sn44XX0yk7ULTWJeurq5USCKpWVfK2u9rO2kmHWlWBmYPqzGoTCFWcdqeNnPuhb7/76iQNanGI3r0jQmAl1IjlLab7vQkB61AaUnFNpSTeadQJkJAy+vUcK7iz2qFQhdIgvYLj2N2bTlxSoGxZHYyFTRK5Ra61lJNMUFmsDV7GhZYimqGh7y306BTC1+Wy7rSShb+TcrMGZAKMOwLlqXeQaTVJsbjU1S5iLkwThHnftEc/hAJeSdRy8BRbk6776ymJpGwB+rphGeTfm8QGxlgJkCxpgDNlNjpdObxTZpLL4I37C4aMhlFBwqmjU5LEaF4mJhd1UEJuO+LBd7tXJMUyAw7nmw2IiepLq+aDivfW/thiAw2T0wTiuwxIZdYpZh0CQeJ6/TNoCABWwDoDZcJL1U1rTQvkwZfMDQN9sgUs3Byk4qvqk4tIXpBLBXNqdEVW0DilOMZmOGLKrp7W8XgdQafbst637tjEbZCZB6z0N3wWEHbAEb1zZ4qCyHTYGABewU4LWcFUHLEXKpZrxAkak9dVhLUpIgoY1cbISf1P10sOQ1gWiUYl0KgUmvm6njNTH5/3QM3q1kGLSQM3NipmDmhS5ogTzned/6kJ4fU/l0Juksp/QdQhizFJPSswjlmVWYyxECFrACoceEIlBqHyoq/RxxFbNnimWZ2O1j7J9RcLEZfhIXpatY+UU4Hw0M/2PwYmcFYhSDvX66TBIfDnr31USpvPTsq+lD/twJQqE8DpsNAqnnRw3X5F+GN8rE9y36d2owe4axtkaH+Sj5U51jRY+IJZr9Rlf+1woCFrCtwD7TSunZpvbNbaraGCnKWYtyCii8zGtlaiiAD+tHVDaj8hvKZQ9ublQbErAXKG+MMC0XUryqpqf+algX/IugJZqbDqUjlnsWQ35+7DvnGMlNBAKHamB0RZdRotMajXREswhMLGCbbZZLHwMBtrywlpnKgilETAxW0/CyItiq4YWfF7i4nqd7nirD4g89dqbC5Q0SnYdqxPnVgIqfkXglaJX3JvJtIe4iLcLI+iIBz/KEnCDdR6G5KeAHKE0XqU7noG67ee+ZvcI+OMslsXxoGTe1lBKr0+HLCFjALgPRc+ddaj9ah3Ki9CbFrCsuE0YAvloOqFyzH3XvSlgdb51RYp1ymBpjr18sbei0EQzox9ITznQ0bowPi0XMITy3X3RRzs5NzaywNIAt3tjjQODUOWAgln/acH6zsTIQsJvFIicM/6/y8W7LCRLfeGZugpEObBYBwG+2BpceQKCRIKaNMIofK5yRGdPJ1fiUACMtW2oO0EVuepJRBUbcT1Fa1n3lBImPAdqNMfvH1UyMYqthhT80WmX0W8SHXITU6xRBe+WsEOvVaGdzDyuBc76g7akZBcxa3qXSJtbZhrbvERwqt7nKiylQDnxYFSgPpjbrWB9T0sYopzXN0ke1o1vdj87MEYp/nFpVp6Fs3Yulw1gMNsNj8Q5vEAEL2AbBnXPRTKVi0SVVLdOu1Q8TAo/zYmP5UJBiKoqTUA5SIk7Q4aQOesVMO7OVgA8e+x2x0sQUnpJFibUjTujhI/pCpWJPK3XochWhXYzZxNRo5KxVOdZ4GJHnRrFPVNLPizlzkzYcp2v213J/umyNmBo9N1E7U31nKv6DYkbaGMxnPzSjOgUNhjCVmboZfn/gwGkxhyshwojfHksesx4hqvixKCdg0THAStMbVSrt5qADfofyrtCVdMV7xW+Bd4AtbSHFLQQwnebUez/ufnNVbZoVAhaws0KyG+Vg9Sil8IRm8LFqann0don8rNHKSRJTb4zwMFCAcKRnzDYcPhL7KGfoaDoFR4lj9p6rWAQb2sysvfGB5OODhiSCEpurSrKaSj4+sCXv6JL7YYQ68iT+cWzeYxVPG/aSi11mOSOi/tFFC/9yH2hG2qwxsu7OxzrUOWmh2TOtkg5PTsGN389uqpXTnhBGzDywfUtBS11+frSPWZn9dUG7mVHRZZDoUPEOsPyD8hdLOtggxvwkynx0JDH8z3sdLECBqfVZRZuaRMACtkl05182LyCj1FTNGNFnOrmc5jR5jhC3SWy/QOgxzbdejYYw1RYTRozKJ/3Inqi6U9Pm2GVWksYIAwGNFd6TgjlqsU4nKXQ7GC55dCiiFNbkM2RWZVKzkqUmBi9ZCmBP7DaKraPwxixNarlGxZiaRMACtkl02ymbHis93lTt2Ctmeqmc5hB56A3L6TxhBvLQRCvpaByZiI9FsSeXdc5YPOHl0T/+WTMClpmBWZe7XF5vHKZQeY7jNphR4dmZTE0+Q/Qg6swIZZo4dTSzQXuoFJSg5JjaQMACtg3Um6+TESoveqwmRohHVyJ5ETm5ZleFI2jkTERM9TKNPFHmTCY+nBivYEqXkUoqOdPlGLLn2L1UuiLuDF1sJ2b7g5xWiSng0PR3q42ac+XMQGyrOlkqkJMlhDEa78xeZBM3nADhxh7tXzdcT6h4lohQSkQ/gqWcUBqHzQkBC9g5AT3nalB4Ym00VS2CijW8ahq0MFGE2kURTC/lto4o2RLCDgtMu8vDVgTWa3r7OwAAA5FJREFUanUZJIxe0LZzgrHhQBRY+GBspWi0lOVkCYUhhCzKUrERIRq7lPdIlcb+2AvldoFYk0a5i9E0gibWJjpFdGZQdIql6XM46408cw63iHV80CRH0YmTl1i7bfR+xyi8MHF4UiYPa6mnV9Lwe8fMKTa3+Y1WooNe3qc9FYPBf2Zv6uZTFlNTCFjANoXseOWerORMW8V4kvUopnxj5RXhnE6jqtci1qj4MPDCYl6QtVEUStheg9bivsqBhRgUNNAKRqMYYY1Wa2rkrGxLaH+yFxWlKYTx9gpEmGDS7WBdc0wXJ4GgObm5/Gzn4Zg6FDvkHZvobDAyZc2KtSuURvhgc1jC+iqNjsYJchFWckbECKDAqOpWt1SMMiz/w4RdNX3Zz+hiOWkth+liTjxCSxjtbLSfwYgR/E4qAW1a9oSiACPvKmriN7WqgmVPrp6q8FjOVtvBljEdNpSaOAOVkSGKTXQ+6Ajy++O3zgkyRaGMHMu4V69T7xO/k2r6wo8yX1FHHRdFLTqqGygx7xDvE8ppvEd0RrGUxjNEq15JVoh9wCyBMIJnTzm/X94BRui8O5TBb4Bnz3sENrh0iC1YV2Bs/8ICtv1n0PUW8IFDcQNhzLoYNlHZloNZQzSA0WSc9KWm987ULNOhbFXAODn7blEyQhDz0aw7xZvDkY8uWxaOV0I+2KxTx0ZFStIZosPCFqhT1SI+xGDEGjSCDfwUvBDEjAQHkTMyRCGPzgdmAukMdh0Alk14hxCAzODwHtEZZSq53LEL3QdT38zAMKplhM7sD2XwG2D2gpFrT/a5hm5v2GEWsMN+vr47I2AEjIARaAkBC9iWgHe1RsAIGAEjMGwEZilgh42U784IGAEjYASMwBgIWMCOAZaTGgEjYASMgBGoi4AFbF2kmk7n8o2AETACRmBQCFjADupx+maMgBEwAkagKwhYwHblSbgd0yDgvEbACBiBziFgAdu5R+IGGQEjYASMwBAQsIAdwlP0PRiBaRBwXiNgBBpBwAK2EVhdqBEwAkbACCw6Ahawi/4L8P0bASMwDQLOawSiCFjARqFxhBEwAkbACBiByRGwgJ0cO+c0AkbACBiBaRAYeF4L2IE/YN+eETACRsAItIOABWw7uLtWI2AEjIARGDgCDQvYgaPn2zMCRsAIGAEjEEHAAjYCjIONgBEwAkbACEyDgAXsNOg1nNfFGwEjYASMQH8R+D8AAAD//zOMSLwAAAAGSURBVAMAEGwltm1HyOsAAAAASUVORK5CYII="/></switch></g></g></g><g data-cell-id="36lyGIhh-uHWtNRS2a_o-11"><g transform="translate(0.5,0.5)"><rect x="0" y="320" width="120" height="40" fill="#d5e8d4" stroke="#82b366" pointer-events="all" style="fill: rgb(213, 232, 212); stroke: rgb(130, 179, 102);"/></g><g><g><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 118px; height: 1px; padding-top: 340px; margin-left: 1px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: #000000; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">RenderResult</div></div></div></foreignObject><image x="1" y="333.5" width="118" height="17" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAdgAAABECAYAAAAiCiQVAAAQAElEQVR4AeydBbw9RRXHn93d3a0YiIFYiI2AKBioiIoBWICEGKCIhS0m2KCggkqpqNiAgdiBhY1d2KK/7/vfvZ99+yZ29+7eu/fe3/uc82Z2zszs7G/3zpk4M3PeFf8ZASNgBIyAETACnSNgBds5pM7QCBgBI2AEjMDKihXsJF+B0xoBI2AEjIARiCBgBRsBxsFGwAgYASNgBCZBwAp2EvScdhIEnNYIGAEjsNAIWMEu9Ov1wxkBI2AEjMCsELCCnRXyvq8RmAQBpzUCRmDwCFjBDv4VuYBGwAgYASMwjwhYwc7jW3OZjYARmAQBpzUCU0HACnYqMPsmA0HgyirH/xK8u2QmIzB0BI5QAWPf8XclMw0EASvYgbwIF8MIGAEjMBcIuJC1EbCCrQ1VMOLFFRprSabCf6103xCfJH6d+AniW4tNRqBPBF6szFPfZUz2Q6U7Tfw+8XPF24j59uWYjIARiCFgBRtDpt/wKyj7m4m3ED9J/Abx6eLvifcTX1JsMgJDQeA6KsjtxA8S7y8+RvwXMQp3c7kmI2AEAggEFGwgloOmhcANdKMDxd8XP1RsMgJDRgCF+3EV8GjxpcUmI2AESghYwZbAGJCXHu47VZ5txSYjMHQEHqgCHie+qNg0fwigBzZTsQ8SnyH28L9A6IIAtot8nMcIgQ6d8ysvlOw15ZqMwNARuJMKeLDYNB8IMA21nYr6VvHPxZ8R7yu+pdjUEQJWsB0B2VM29Ahe1FPeztYIdI0A9gQbdZ2p8+scgR2V42/FR4kfLWb5mhxT1whYwXaN6Nr8MAI5j4LKfCVd30q8m/iX4hw9TBGWZH5LT2qaJQJYspe/VRp411eBMGR6r9w6tEOdSI4zUwSogy4w0xIsyc2tYKf/olmi81Xd9hAxRk2nys3RvXMRLDcCPSDwd+X5A/HJ4u3FNPbkJOm+SamFRmCJELCCne3LPke3f7L4XHGKbpESWmYEQGAK/B7d40PiFPGtul5JIWTZ0iDgH8LsX/WXVIRTxCm6VEpomRGYIgKs2c7dDiv4XBzLjcDCI2AFO4xX/O2einEZ5Xsf8U7ifcTM+z5Y7u3F05qDuZrutbWY3ar2kssQYtcV8MWU7z3FGGzsLRdjG+7JXJMup0Kzxhor3kfpSXn+neXeVtwHfauPTJUnc7+byMWyle+U75XvlumRKyq8K+I+GPWAD9/ILsp435WVFb5PhsGZb76swkxGYGIErGAnhrCTDP6QyYWNJzJRxmLe6WN09TExloInyn2L+IXi14gxVmHe98/yE4fNAqh0dJml3FZ7LC0qMrmpPCwz+pHcD4jp+ZD+BPmZhyacdXcX1HVbQqnwPH9VBh8Vs+QAq2u2n+Sev1LY+8VUpnI6pz6x/rxKG9u68BOSFcQOS5/WxWfFbxfz/G+Sy5aGcjqn32dy/J3kZ4vr0nUVEXsElop8QX4sW/lO+V75bj+sMPJju8aXy38VcRu6kBI9RXyWGOPCL8rlG+HefId8n0cqjI0zeIZvys/9Y2tC/yh57P0cKlkd+poixfLgu5a4E6IOKN+H32EqY3bpKsfHz/Om0lgWQIAKIhDsoCkjcPPM/c7MyAsxi8WppA5TwD3Eqfd7YcmJg6Xz5+RvW3Ep6TrCGIYK7BGSxHrK15aMdXeU9ybyN6FLKDIVI0qFHrkuo8RmHZSFHlE0UgvBELBmvpOGxZ1blL9tktwynLqnuWCh/FIVgtEbepG574/tGp+u+Bhd7Sq3LvEbIH9+Q69SomuI6xANRHrQMQVbJ4+lieMHDSPAxxeWOHSaCOR6WOxRnCsPCuRTirSxuCndUQmYB6ZSkXciQmlynBYVaJ2MWNjOoQcM89aJT4V3vCJSacqpTfSI7paJTUs9E2VVPASsWbpFz2Ta8/Mo9VUQIv9QZBHROJilPzSO9lRI0xGMiyjNa8V1NrWg10oDksZYXcWqrE1GoBsErGC7wXGSXJiXTM1J0rvMDRHTY0WBTPI+r6WHYBN3Km55g5RTQMyvMtwWTJwIZJ4Wa+pElLGILfna9theP84l7KkzVD4ErHkPzLOCW/hJ+gllLhSlmMr9HSmhZBxywRQFa2512Zr2UEqGfOVEiaFytnGMRrDACPSJQL0Kuc8SLHfeKMXcfEhuOOzxgpA5VzlR+oUkzNNxRN7f5I/RDSVgLkpOkHIKiDnXYMIagVTcGAqloj5PwruK21Kq8VAnz2linSoPc91PTUWQDCUspzNirpe53+slcmTekDixKGzPxxzr5WIRFM7aW75TvlfmZRUUJXqxjICEImAchdFXSFYO+7Eu2CbwZ3JNRqBTBKxgO4WzVmZUVChNjCgYakwlerWEbEohJ0hYyb4sKNkQiJETR+LR00ExMbyHkuHIsX9tiLLu/0MUkptnU5QglYcrMUp5m2K9WVxn2JBKd3fFjRGWz8+OCUvhVJQYrzC/h4HMn0qySbzTxjrVmLmLHoR3KidKqfTRRBXB1XW9pZjvkPNg6X3qMkgYzTEaExSOAjG8Sk1DYJDGaA7fKd8r92fXs6+M0lcd5veZkqiGc401Mm6MXyEBdgDM7YInQ8hMUzBd80zJcqNGijI39HWVFIPGgnPz5DSSiriFS4NH2ZiaIGAF2wSt5nExwKEnUWYqKuaQUhUNd8IiNKVwiEPlwpwk/ipT4TG3ilVkWfZvXRwgTvWcnyZ5W8JKk+UO9HQwEqHXR8+Y4/ewzkzlyxBzTE7vNSYj/B/690QxFSXDglT25MeSDBoyOUttJU3SELGmwDz3u+XhW+F5WW7CKEQOayVZRyiy8rf6U8U4VpwbvsfKF4M5eoOKHiQaBLyfoFCB/Cb4vbD5ii7HRAOTRmKsoUSDkB3RxglGnk1Hbsih4QdefKtlOaM7X1YAI0t8s9wXC3UFzTXxW2AZW8FYR6ceiOVLRdzC3SqVwLIwAlawYVxmHfoCFYA1nf+VGyNO2aEyjcmpFFOtcFrwKOFQelr/bb6N/ygzejwMFcq7hlgCgRXomsDKRWyImJ7MvSpxq5cMCb6xGqhrFBCNCSpvXbaiIWLNg6B8biPPw8W8T3rszDuyDpjvR8G9EyMVLJdiw5TUzfaTMGb4xpDwMySPEUuDWLoTk28TENCwCgSvBsWU9apw9I+GBo3TRVCwo0eyM20E2lSi0y7jMt2vWHLxrBoPzVIYltqEoqJYc8Ym9OgYOgqlp1ec62GH0nFPKsuQjDDm3+jt4A8xw8Rrwzdc3W+DE/1PDy43hMWwF1v9RTNJCIaINWsV6WGxzCVR9N5Ev1HOfKcYK7F0RpdRop55ZFS6skIDiIZQIsoK64JjchoZVRmKvxpWXDOq0nRpWJHWrhGojQAffu3IjtgbAt9RzswD0Qtj+YIus8RcbixSqAcZistmD6FwwtgAALcJo0BT8f8pIUuJ5ASJOdzQN8n8azDBKJAe/8ibdBgaTEaICIeINZtpMMceKXKvwQyhstQG3GOjIOUCMI9Ko60cVvgxavpgcZFwm36rqaVtLPU5Q/fCqpzRCXlNRqB7BEKVWfd3cY45BG6sCI8Vx4ZIJVpHpFkXOApgvpAhrhyzEcQoyTqnSVmKxDQUCn/MzVmGYoRVTZtScMz7YTBWTRO6jvXYQ3HLYUPEuo5SKj9Dl/4dldkW4rqUwg9lh5LOfaupnnroW82NVrD+ljlhRnsYWsefGlau+6yOZwTGCFjBjqGYuYdKizm13K5ORUGxai38fbghRZe7D8uBcnHYpi4VJ/RNpjBJ9Wyq96lTvmoaroeIddvGAs8zKV9VGWDxy9aF8mYJy+BspAkihPYO5tSfT9bIE0tkRo7ozWLUxXQDlsQ1kjqKEUgjEKrM0iksbYIAu8iwXAKmkqbHiKVmLA8sYKm4QhVGOQ2VQmy+shxvEj+74DRNTy8kl4Zh4lycspylE+Xrqp9KsRqWusZSNCWvyoaINaMAfRjfMJ/KtwozLJ8yLAInjNbqWJzz7RO/L6YXHMqbtcIs2wrJQmGsL8bana01D19ZWWFjjVA8hxmBWghYwdaCqZNIbHB/uHJirhXrRHmDxPIA4gWFo0D24h15F96JWZ4WD87wYuGv4+byq+YxRKxzRkXVZ2hzzR7R7JTEkqdUeqyXc1tQxozxUvl2IWMzfdbUttkABctsNqAY4vvvAhvnMQUErGCnAHLlFvQ8WDLCSS8V0fiSI+aw0BwHVDycbHFuJax8yZFixQLxtm7TnmH5/l36sZZN5ccWjyl5WcZyn/J1Hf8QsU4t36rzTE3isGkHc/qpNCiw1IgKFuux9Gx40vYbLdKlhoJ5f+zoxJwx5cSoKlaWajiNXQ4IqIZ3dc1IQVd5DS0fl0cIWMEKhBkQP3p6B6lbP19CNoqQs45QrqmNBD6iFMUC8bYuc1HKZubE8g3W18YK0sQKFMvXWD6x8GXCOoYBR+CdHhMqnIYLS7TkDRLfe1CgQIyNODKx7XdKuvsrnxwxaoSiZbgag8Lcsq4ivx3kCc0hs2GLREG6fDB0fWCTb3d9aocMHgEr2Nm9IpbSYIiRKgGGFzF5ymI3ZXUby2/I4fTIY+Vj+z7mrmPycnhoQ4KyPOZfJqxjGGBlG5MRzlplhlXxVzm1ZIa4bFSBOw1mRISdjNiKkXlmGgY04mL3pgHwgIAwNbdLgyOQZE0Qip69mdcEDuTifAMpx9wXo7WCnfsnH8YD7KZipIxu2MicHXAUbR2lFt7T891sXYr5DWDNYqz0GKawc1FMXoSjhNlgoLhu4i4T1jFcMPxJNfhIx77YoaFi8EuNQuRGc8i7D2aeGet9fiupoePQNERqCoXfbU7J0mvv45m6yBMr8S7yWfo8rGBn+wnwI2X4LVWK50jIXJCcNcQxdmsCShe8VzbZj1lXlqKu8dJaH6JRR2p4kgfgNCE2qcAfY3YLaopHkdcyYV08c8hlE3x2cArJCGMd6UvwVJheI3v8VoLHl9gcMGw7DqjpyVnb18xmhbKl3nHoN8FvN5Z/rtGH0VduXjuWdxfhuQ1K6Nl3cZ+lz4OKeOlBmD4Aa+5IhZSyCkXpoSzXJNIFBh6pYSoW97Pkh033FT1JVIxsps/2crS+k5FnIDxO92QuVE6QGG6jl8TpKNUI9KjAiu0Oq7K616RfFqxTmDCXipJNxaGxw/BrNc4R1YDKNb1fRnRyw5MYBm2rtCeIU9b2J0tOPOLLmyR+Y6nfCcuiqhmkFCxxOUwAY0b8ZWY+90QF5Hq4itIbsTlLKvO9Jaz2Yim3gk1NELCCbYJWP3FZF5pbS8jSnp0rt2dIiy3rKsFrLjldhR1w2FYPYw32bKUXh/Jl+QVKlYrqJ0rFUXCceCLv4IgGSG7nIvZOZsiPuW0sPzmujv2Haa1z0sskD7VMWOdwOkwRchv7c+gC35mijomwVMXOCATrblknzvparH4Z1qf3iMLmN0JDk6PWaDjybY8zD3iY1yUe3z+HYjBXT8+xHBVljpEUe4BzbF1ZVvafUr4Y+Wn0G8HgiQAABgFJREFUjbxBh3vxLWJnwXF/ByoWDQJGY3LLmhS1V+L3lLoB9QPl5EQvRtgwmgTHVBrLAghYwQZAmUEQP9acAqGnS0+tXDxOTkkNbRGXjRKYo3yXLhgKY86XH8vRukapUlERR5eDJsq6armZKCWtbHoNzOntqXh3F3dFy4R1CjM2E9lFEVIjCjeSnKkNOWOiIZkzlCIy61bZIeokXdDwY50zy3BYb/s4hYWOplNwlCgLx/dxCAUNJfJkP2y212ToGuWKAo9lgEJndKQqJz+UZzW8eo2BFCdbYUuBEVjRcwU/7l+NP41rMGB5VOpe1DVYXdOb5SQrhr1T8S0LIGAFGwBlRkH8CFF+sduzdSE9s7IcwxHOw0zNi5Xjz7OfCvGgCR+ARkXbLJYJ6xxGGDyhtFLx9pCQXqOcMdETOnh8NRsPvWJGhBjxqPayQyWi5xwKJ4xhbdw2zPF8qR59mzzrpqGR1Pbgi7r3cDwhYAUrEAZCzOkwHJMqDsqUFnE5DvND9NTOLAcuqJ9httxcXuzR6b2zdV5MTjgVD26MFwDr2KM1DqdHlmrYMSpyqHJlGFbOmOgRcQrPOGCgHnp4jIRwEECsiKylDfVuY/GL8CPloZcuZ2bEe0i9v5kVbJFubAU7rLfJMHBufoT51OrRX/TuWPtKhUbF0PapGDpLGfO0zberdPQimUtmE44meWKktLUSkF5OlOoYxCwL1lGQRoI6Bk93UFyUlJwxMTTKLmWsSWaqYixo6EE5MIzcMFmt6EynYK/AnHAuAbYMzK3m4hXyV8qTOhtX4qkQ74+hcRqeU7nhMt7ECnZYb515qlwvizmc0FApPxgMoVizx/zXaTUfjeO69ldcLHAxvpjVsJWKUJt4PoxSMB6hoo0lxOgJAxcMWeh9xuI1DV8mrFPY1DF4OkAZ8M3KWUPYHDCETMMHBYUx2poIgQs2hOAADUZyMMhL9QL5LbA1Yt33Tt4oVKyJUYA0pNYVIRDAHuMc4sFGG7GTnZhHZnMLfl8YcOVsCQK36SWIBg5r5qlPaPjEbsL2ruAekzs8goAVbASYmsF8ePR6YrxdzXzK0Y7XRSy/IrzaK1CSMbHHMT08eg8sv+Eorp0k3UvM0gEMLTaXnzkoztHEaIRK8CyF5YhhpaIMITfXQyR/lGIobRFWp6IlHxoCNEY48YTn4Rn3kWBXMcszeC7W82GcpKBVApviPiE3VWGvZlD5R359Yb2p7hUqI2E8r8SNKff+Uht6hG7GkPomElCmGLNbUWxUhPQYCqGg+Fap7LdXfrxDlgOxMchWumZ0hm0FsSjmN3WUwnJKCgtYjHRQ7iw921JpuE+RN78hDOLAmcYleRPGUjVFbUwsvWErThQ0FtAYgrHsiLKzdSLrfBkhKme8kS5iuPGcEgeJ33AsHUZdwUSRQHBkuJ/n31hx2ACD+WHmnsELC3zeDQZmEpuaIGAF2wSt+Yt7toqMlSQGDSxbwRKTPYZZI0jrlZ6Yosw98Tw8I5tJMIR+jJ6InrmcqdGyYN0XoBxgcKoyZ2kL75AlaCzLOVZhGFVho1CnAafo64hTdWi40lMu8qa3yjIeluDQuGybd/lm9AJR0Ox7zK5Xh0hI2VFi8g6aMLBkaQ6GgBiiYVAJXix1O6ebki9fLlawy/fO/cRGwAgYASMwBQSsYKcAsm9hBIyAETACy4dAlwp2+dDzExsBI2AEjIARiCBgBRsBxsFGwAgYASNgBCZBwAp2EvS6TOu8jIARMAJGYKEQsIJdqNfphzECRsAIGIGhIGAFO5Q34XJMgoDTGgEjYAQGh4AV7OBeiQtkBIyAETACi4CAFewivEU/gxGYBAGnNQJGoBcErGB7gdWZGgEjYASMwLIjYAW77F+An98IGIFJEHBaIxBFwAo2Co0FRsAIGAEjYATaI2AF2x47pzQCRsAIGIFJEFjwtFawC/6C/XhGwAgYASMwGwSsYGeDu+9qBIyAETACC45Azwp2wdHz4xkBI2AEjIARiCBgBRsBxsFGwAgYASNgBCZBwAp2EvR6TuvsjYARMAJGYH4R+D8AAAD//6vI+GQAAAAGSURBVAMAuWS9tuqvz84AAAAASUVORK5CYII="/></switch></g></g></g><g data-cell-id="36lyGIhh-uHWtNRS2a_o-12"><g transform="translate(0.5,0.5)"/></g><g data-cell-id="IAWgnODq_W8FyFbd8cU3-4"><g transform="translate(0.5,0.5)"><path d="M 60 170 L 60 193.63" fill="none" stroke="#d6b656" stroke-miterlimit="10" pointer-events="stroke" style="stroke: rgb(214, 182, 86);"/><path d="M 60 198.88 L 56.5 191.88 L 60 193.63 L 63.5 191.88 Z" fill="#d6b656" stroke="#d6b656" stroke-miterlimit="10" pointer-events="all" style="fill: rgb(214, 182, 86); stroke: rgb(214, 182, 86);"/></g></g><g data-cell-id="IAWgnODq_W8FyFbd8cU3-1"><g transform="translate(0.5,0.5)"><rect x="0" y="150" width="120" height="20" rx="3" ry="3" fill="#fff2cc" stroke="#d6b656" pointer-events="all" style="fill: rgb(255, 242, 204); stroke: rgb(214, 182, 86);"/></g><g><g><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 118px; height: 1px; padding-top: 160px; margin-left: 1px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: #000000; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">handle_entry_list</div></div></div></foreignObject><image x="1" y="153.5" width="118" height="17" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAdgAAABECAYAAAAiCiQVAAAQAElEQVR4AezdB7wsP1UH8AWxYMcuKhbsFRU7InYEewE7oIj+BeyCIlJEERFRsaHYQEWwoYK9IMpf7L1QRMWCgL1gb+f73pv75s2dZGZ3Z2dn5577SW6y6flNJufk5CRzw03+JQKJQCKQCCQCicDkCCSBnRzSLDARSAQSgUQgEdhsksDuMwoybyKQCCQCiUAiUEAgCWwBmAxOBBKBRCARSAT2QSAJ7D7oZd59EMi8iUAikAisGoEksKt+vNm5RCARSAQSgWMhkAT2WMhnvYnAPghk3kQgEVg8AklgF/+IsoGJQCKQCCQCp4hAEthTfGrZ5kQgEdgHgcybCMyCwNII7O2j1/9Xse8ZcWmWgcCrRTNqz+qzIr5knhsRpbyPirg0iUAisD0Cj40spffqGRFXM+bWH4kEfxH2H8P+Utg7hk2zBwJLI7B7dCWzJgKJQCKQCOyAwJ0iz0+HvV3Y1wj7smHfIezjwt437LUmf41GIAnsaKgyYSKQCCQCq0MADfiqSq8eFHG3CJtmBwSAu0O2zJIIJAKJQCKwAgReP/rw8mFrhvi4Fp9xBQR6CGwhZQYnAolAIpAIrA2B/15bh5bUnySwS3oa2ZZE4OIg8CbR1c8Ja+/vtuGmOQ4CfxzVPitszXhGtfi5414yKvzAsI8M+4SwizVJYCd+NFlcIpAI9CLwohH6HmG/IuwfXLFfHi7x44uEm+Z4CHxsVE1zOJxz5psi5LfDHttQvvqUaMQPhf3rsNxPDvdVwy7WJIFd7KPJhiUCq0HgzaInJsWfCdfxLavX8KZZCAK/Eu24Zdgnhv3LsP8U1jGdTwv3nmGPbb4hGuD4ENfK1Qo2gpZvksAu/xldoBZmV1eKwMtEv14ubJrlIvBH0TTE6zXD9azeKdyvCfufYY9ttOnYbdip/iSwO8GWmRKBRCARSAQSgToCSWDr+GRsInAyCGRDE4FEYFkIJIFd1vPI1iQCiUAikAisBIE1ENhXiGfxAWFplFH7f5/wv2LYKY2rw24dBX5M2M8Na+P/I8J1nRjtyPDOYt48alGv+j8j/Nr0UuFOaZT33lHgncPeO+x1YT8o7KK19aJ9zE3inyMfdwn388LeI+yHh537OUWVO5sbRM63C+s5a79+6M/7RtirhJ3DaIOxRbv0s6PCTwz7NmFvFPaUzItFY80Hdw0Xjh8f7uuE7TEZNCECxo+7yilOmTs+Ncr+/LDm6DuES5vcvB3edZtTJrAm/K+Mx/OnYX84rDNR1P5/Ivx/E9b5ri8JdxdDJdyk4vJsm/9U2J8SBX1n2IeGfUTY7wlL007cT4bfJPji4Y41vxgJSxdz/2zEtY3J1Vm0341A9apf37XpXyLsN8OaDMPZ2bxL5PzesMrTn28L/0PCfn3YHwz7vLDfH9ZLE85ijDH8CdEa+HjuPxb+bw37pWEpaeiT50QzUpoPi3ATQDiLMq8Xrfm6sLQ4aXV6ztqvH/rz4xH3/LDG9cPDffWwY8xLR6LSOBP+wIhvjOMyjkI4RmNsfUdEPCzsN4f99bD/HPbJYYfGgMlU2Y19WuSpmSdFZJO27Xbr2aYvHxVl6of5wAck4PjoCDPBh7NBAP4rPO36uv53i/ix5h0jYTd/+/c2ZUVRs5rvjtrabW37nxlxY435j+bxcyLDX4X91bDmDuP6weE3Rz8+XNrkfxvu74c1tj3X8J4ZilXtNrz/Wcx5D2WsdtrGv4jzsSan801efoiXx9ksqzgain0tft0IvE9Yk9XNwx1jcLiIG5Vwk4p6hvLeOAq24jNQfif8VpnhTGKsGNwTanJ1XrBUqLtCTYYI4NC1Z90y4OcFeGpEWO2FUzQfGjFeGquB8B7d3Cpa4Pl+S7jwqY3nl7iS5vvCvT7sWAIVSQ9qHDnAGP5h1ILTH2qXcf2ZkfbZYe8edirzylEQBsRRiDcOf5+B4W0iAn7eLQQ5fi7OeI8xx7V3F8M4NAmTjI3tnJVaKS0ihWEpxZ96+A2jA8auCyu+OvyvFXaMedNIZGHSJbARvA5Tm5CW2kNiMy+PFeyYNhK3/VokHCMa+rJI9+5hdzVvGBkRqrcOd19j8nIu7dO3KAgBtPIcm8XA9okqL8fYPNJZDZho+UsWJ1mKmyIckTdpve0OheF6raq84DtknyyLe2CNF1sbxJnbFIyx+9rIYIUZzl7mppH7l8MOPdNIcsloK+nQNmPzUsYZ/nm2GK4xVWGia+m2IbAkI6WyrJxLcacebtWKacWkjyWsp97n0e1fGoEdmpS9PMRmozt4JaFVHY77ys+DOs6QGXDcWkW1voojnrWfWCujL+6DI/Dtw44xRHPvOiZhTxornZ7gs6BDimFNoIj8PuP3taOlVjDGRnhnNy5fILrelxmzR0osV+qAsVSKE05KQvJhZez3NpYo2J79Nnn2STvUF/HapE9j6vmpSGQLKJxeg2F+q96YawPfMn6+Qdg+878R+O1h12rc9PQha+3cvv0aN0HtW8v4/EOTsk8njS/t2pREEVYM14aO//WvkdSESDRtPy9+Fo39NGK8YoKIqPWVQolVTSTbySDOQxm/KBLssy90LMJ0t2i3Pddwiua5EfPzYX8vrOcWTq8xgdoX6o08YCClOXusNWW8f4v6tV8/7MvGz6Kxii0Rgto4UyAxs/1D/m3tK0UGNzOFswiDyA2tOhHhprH839j8KLi1/b8miwsaGn/Xpc9gPHbD1/Cbbghx/FBf6Mn8QiSy9RbOxTFLI7DbIG+T3AoEMfmuyGhTPZyiwdXW9km6Ge2bWPV6eby4xKlW0PY7ERf7ldJ08zW/TVy7ahgrvymH+xvxz94GhZ0XhH/IEHPbFy6lo1X7haXIVrgXgpKCPUL7wBS6WtGze20LuMu2VDElp/eKSEpqmIe3CD8sHxAuxYlwzpk7RogVSDizmftHTTXxtBWlPVHt1w832Rh3lNki6zljnFm5nYsYEdCWtPx7pKeDQInK6q7GnETSSwYjiNBe+nHl35+Haz+3scTPEVQ0xneTtu1SqmpnGmIWPrqduODvlmFLpTQ2FDFEsKWpzSt0I6RZo6XpXusXRUxbc6QjtNKJkEk8KK+ZW0vSA2OwPQ5qc94/RAPaaRs/BaqIOq45RQLrpb9vwGbfyJ6jiYUG7TtHWI3gRfTGioVbs/ZrvagmQGJI+6AGAm63ycdvEqxxbyYdA6nJs4trxWxlYp+RQhcNSJOt/a+hz0y9X6VCq9dK9MZES5vUC0H8c69IrDyal/Y+/z5+H8N41hidvrpJFTBANBTb8TRFacraX2+Ht/2wbf8+pB/xh22pDvuqmLcXdhKQnGAeSkwORgEj2Mk2+idCcLNITVmM2NnxFhOj8R/BRWM13t1moG2PwWvsEL73i9KbtG33GRG+q8Ec2k5yGsAqlETJO2tst8vEqNNsbYe1/ZjRmuKZrYbSe+5Z/UC7sJX5zbmlLhGLk27QKG6nMX/TSDe3mo+NaScX2mlsjbXHAUXGdnzbTzmwnbbxoxHtdEfxnyKBxTEjMF2ukxgCoa0BOSQids6VUhS19f+pFXQlDmduZXfl5zln7F7ouYwR8CdhrURpJof3zCAYBg/O+yywx+NMaE/wBoE2efbFNWFEP32iM5MTQoUANGnnck3+ztGV6nM2GCNUisdNI8J98Tjxud6FL4gG0BwO55whEnbO+lzElYC/CxfRCKfX2H/vjRgINN4xiy7kbye1crA6M4m1w7v+0ljrppvrN6Jm9W9vmnY/RT7a+MatI27ddgwpO9UUmGpxJGvemW59a/mN4S71BXNRimvCLVQwxF0C28SfvDvXpDIVUE+PgmrKNY6QEC9Esl5TOn7QJK7lbdJ03RqXbS+2m37sb6vM2stZw0EdRKPcrr1dN6Dz22Rr368TfM1POD3umpBD/bhariNTjolcDbnqQ1gfc/Vnr8+q2znivkirYhKLvrgpw7xvH1cpEPNSe+ayOj/N7bP27vvCa2EYNuK6UhqTIEWWUrzw0lgTN7fF9CJ6RIdj6zbenZktpbcCLsXZQirFkQqU4tYQ7kx2qR90JS78V5O88CWAlhiOMx1ql/2cUhpiZSKtUvxQuJWHvTAvsJUGIkfEUcrnjGkpbigcoaulsR9nhVFKU5r0iLxKeYSTDnCHLBHQUJop42vSAHvTY+oiFSil24cZKpXZDTd2EPNuuN+Umnzjkr9mp+6DbQjSn1qdGKpafGms1fIcKg5jukvZLlQp5XPzUN+8QXTcFY83ZWDmYNv8XqNb25JzjOy3otPmSNKn8F48c2oEtrZabJ6evZfG3+fadO8L74ZZLXmx7N9R+KC4YV8MYXMMx41O9tIct+jmbX6XJtMmvuQauP9RimyF/1nL3/WWiHuNUJloxyoHmEC6dR7yd036YG/WSmvI1rYQ5hBz1vpgQiLCHupDTVzb7cOY5zHmnTL2a2XtOs5rZe4SZ3/vR3fJGHmsNuUP7zlDiaxvpUp8XppDlXeuoJUFDEmxnJc2R5Iw2Urjr4mVVwbPZlMaHEvt6Bh1d5qktfYP9dlKhjKE/S77AxQwrFLtXdbK7Yu7QV/giLAx/VRMTXO61M/aTVO11ZH62nZsG9t59vHTIN4n/1DeOVZhNIOH2rFP/C73u9bGUNMW4vXaPllprDX553JrYt6hNmBuKGeV0vWJifuIrvwUEOeW8Kh3buuK2p8bUSkGhV6H1SxmjXSupBg2orjTSbKUF2MsYrj7sWm3TWcQ0JClrUk72Ypi2zKmSj+2n2NWue02UZFv/+76Df5uWO13ieOv5dklzrOpnRndpcxuHjfSdMOm/n1oJmGXMTt2rA3tDU+N1S7ljVmN18q9Vtnp2pR0F6zImlAiY4x387vtUqrqKoy149fkd5vXkNSw3V/HJT8yAujLUAKb6wMWUeX85tQI7CERctaT6vgYcZfzec0Ace7qkO2asmx7yLXycPG1+G7cUHnd9Lv+Lom7dy3vWPlsOxyr7otQry2OffrpnbYF1FeGMegISBNHYxvj1/xuuxdBPNz01ykHGtu79NlxSBdQwLYpb1VuEtjLj5OiAk7s8q/z/53lcswDF2sP1+F8e5n29OzPns+xzBCMQa1lzvTV4ttxu4jM2/m38dMIdeVcKQ/RIEZnH7vt6r3Ullo4UWsp3rGzfdov7xhxXan+NYSPOVo31E/nkEtp2pdOtP3t9FauRKftsLX7vZ+OeVnRI7QU9sb22VlYl+iMTX9S6ZLAbjZWFbVjCO69dYTDoWmfQkNs22K1G53QEyfmsz9UavI22n5DZ4pLdewSjri6EKCU1yfJrC72sfaFSuVPFW4iKpVF/Eg7fZ8+3L5UeIaPRoDiTkmSQ6mJXgVRfAlr+7iOPo2ucEUJ6awgtLZCXPDh+NOY7rl/4ND6CWPaMXmaJLCbjdVrSbvTfizNt9pe4z6350z+QEcUaLVXSkYj2u1Npfh2OBFZ+/eh/c5Al+ogTSjFLSmcdnitPb7JW4tfa5wvRy2lbVA2QgAACX1JREFUb951l1P0tYcGrGNuFHYQ2b40Q+ex+/KsLYykDIau+YQXTDD3pX5iLksSgVKeJnxJY6dp05m7M4E9K+H0PbitUi9wYLUVn3yndpja2TTt7rNW49f1RXTCEGEHyTvBB/1Zu2DBFYm3Omjt0xSuD7Xx5OahaWo6rVKcJ11Six9VaYyje6Wb0FwBWHu/KsWuNso1h3eK3nk/a6Ljbbanorgz4+rRsx9L8ySB3Wxq2qlDGm6uMsShLe251tpTu4hDPl+qscfMX7JuHLpxKfJA4ddXyjWOTYrbtgnnPKeCBc7eJFzqijtYidZK8aXwXY7nlMo6RPjQ0bmlSSBIeYg7+7DwYYjSHbxWan15MmyzMe5r73DtPaxtDyGw7sxeJMYmpkU2bMZG1c4BElvQkOtrzs0jkBgknG3NUdM/KWq3pxlOr7Git9KizNVNgBmhTOPawm7coX+rt3YcgJjf+WXPZagtRH1u/HHVm48pDKWfMv6xA4X5WtA9Is2Q6MteoONkLlZw3CGyLNa4EKW2cnd9ZJdoYZbGaPQfqtN0L/rK9mm/0pix/9qXZ61hT46OGYPGYnirBjNbezdrn2QcOp+P4e8es1vEnm4S2M2mdiORYygmdqs6IgwP0UR+1xhKOLI+IhRRizbPjtYNXclHqYtoxxWENPwcYXJdnpWIr61EEbMb4iXHqGoV++KPm45ce0dxwt28JmrPzFeBEFUEyYTvc32431p5h4jzEYXacRLSAxf6Oy7iCzA0M4nkcfj2tHyZxmrdmU8MhT4fop1TlklDGjNTKtNxl6dEpKtQHxyub+VifD23+HkUY+w/r6dm80BP8EabXU7TF7fWMDoDxqB3zoc46HBQGm33F6NIcc93cWsrzae1M3X8QwTWxzpI5rz3Tnu4j7qmuNop/nA/k8BuNhRPalp/xMS4WZOijXqDyQRnIjzckzlsyYhLrc9qxwH6+oh9QV8wIg4Xfkzrpbl+oAEm6+sijdUEJojSimdm8tZvBEmaSHIU43IQinNDlZOcPDwSOQaGIaDZ6hiOCQSDd2rKdUOTpP1/TJBrL02Yx36/rLgfHfiPNY6njE27tnRvFB16ZFhfg8IIG68YJteu2hZBXDGHkaTXYBZJzXojI3Bo7ESSjUWB9x4DupgthySwm42zczgfD2lbi8N1/VcpX/s4TynNMcINfCuFfepGsPbJv0tek57vnjpruEv+peRxrOhhS2nMTO3A8MxU1WTVmBdq2ylNRa4NJRlpfl90l8Tl1gECokeCFN6qQRRrCXw0oSZprOU9alwS2Mvw+77qGC7pcurL/714biKpTfZj9iYulzb//y+OKof2AyNJr7EyrF3MIdOhmAt7NVbTz1LJCdt7R9vHfrkokk5ljlYOAmsFfrQG7FCxlZhL6oey6pv5YChdxl+LgK0DErIhjEnbxkh9ri19Ab+SwF5+CC4yp2iBE70cUv8vnYPmNvnrKZcbazVon/JBWzbRnrQD9/LXsh6SubACJwZyd6yXtNaOWhwxVk1xqpZ33zgTMsbOeWIi7F3Lw+ARI++af858RMCPn7PCCeoyxoaKOUVlx6E+HToeU0JHgr7BmLqIkCmdkhqOSb+INElgrz4GKuSu7aIIU5q07YNR+KGqP8R1XS152b77RfMoHzwiXJN1OL2G0hNFBgoLVpG9iWYMdCvSJ0V9lE70gWJD/Bw0Pp31gEhFQe024dpbD+dohsIZ5RBMC21gimRDjaEL4JOJxOUUtezVDuVZQrxn5qJ3zGzt2kjMB6aBotOx2/2EaMDZMwl/1zw1AuwhhnPhjPfP3vPY+cC4RVBpExsDGOVtQHMCggb30FWUFkClY1bb1Ld32qURWF+hsPIp2TGgmaRK+YXXDoK/MBC9f1hfysBdUbYgyiOeMAEiRPeK+Pa5LOmV22flj+S9xrGEvjzCHGbvzdQJVL70fVb7O8mLPxEZIl8KXeq+S6T0ZaG7h0sNn0KN876UjCLoksFJ9tXbhNUm/ZtGCU26ruuljejRRjuswh2fcPzGLTva7zm53pIYX5/sB90kStWXB4brystwFmGI000a7rbWBxdn3CFaBv/7hHu3sD6NZtV+s/DTKPbsaa4Sn0VQ0ZDOdDFu/zZ+i5lbEZTe2vna/qE9tFYxl7xWL46D0RKmdHbPCPW8PDefhbOH5zKH7sQ9VV+iutHG5ytr54z1ZXRhB05orLefS9tPEalUvWN37bRtv0VHKR8lMFcjupcc4fPsjOFm3BL/UpQ012FojVthNY3yUl1N+AvCYy42V3lP1EcxTp0YTprNxk/tTukoYh6zNAI7T6+Ha6Hp6ZiEVcJDI7mjFSbAi6CGT+ztW5bOllHywMFb9QUMizfPjxbSWNR+kgYat+4Y1idiWCuoSLJoQ+mOUodjIvB3NInW+hOj1b724qMEQ+L5SLp4gzGw8iMJMhl6Xp4bJtsKZCkdwDyU5kkrslMTeR8KV1/V8ewscJpxa7XqGI8jOM/ZbDZTjlvSNu+J+h4SnVInhpMomQQkgo5vSgPn+C3LFiQCiUAicFwESDzuXGmC1espMG2VLmTUIRFIAntIdLPsRCAROGUEbJMQa/b1wWqMlKcvLsMSgUsITElgLxWY/xKBE0fABQdT2+7tNicO0YVoPmU++8KlzlLu2XbrZOpxpbxS+zJ8AQgkgV3AQ8gmLAoBIr+prZXQojqZjTlDgEY5hasm4Jbhse89dJEK3YxIOto4kjX1uFLe6AZkwvkRSAI7P+b9NWZoIpAIHAMBSkw00WlysxTJMES1Dw3Ye336MRqbdZ4WAklgT+t5ZWsTgUTguAgQC7ub+7ityNpPAoEksCfxmLKRAwhMGd0+AziVnxhyyjZmWcdBwNGQ20bVjoOFs5VxNelU46ldzlaNyMTzIpAEdl68s7ZEIBE4TQRccuEiBZ97PM0eZKtnRyAJ7OyQZ4WJwMIQyOYMIeCyhFtEIteFhpMmERiHQBLYcThlqkQgEVgnAo+JbnW/zPTMCHMrkfu5fbnJdX+5cg1Q0myHQBLY7fDK1IlAIrAuBNyN677d9r6me3uJg93PPfSJvXWhkb2ZFIEksJPCmYUlAolAIpAIJAKXEUgCexmH/J8IJAKJQCIwNwIrry8J7MofcHYvEUgEEoFE4DgIJIE9Du5ZayKQCCQCicDKETgwgV05etm9RCARSAQSgUSggEAS2AIwGZwIJAKJQCKQCOyDQBLYfdA7cN4sPhFIBBKBROB0Efh/AAAA///baZz3AAAABklEQVQDAAzvKMXoWdveAAAAAElFTkSuQmCC"/></switch></g></g></g><g data-cell-id="IAWgnODq_W8FyFbd8cU3-6"><g transform="translate(0.5,0.5)"><path d="M 60 290 L 60 313.63" fill="none" stroke="#82b366" stroke-miterlimit="10" pointer-events="stroke" style="stroke: rgb(130, 179, 102);"/><path d="M 60 318.88 L 56.5 311.88 L 60 313.63 L 63.5 311.88 Z" fill="#82b366" stroke="#82b366" stroke-miterlimit="10" pointer-events="all" style="fill: rgb(130, 179, 102); stroke: rgb(130, 179, 102);"/></g></g><g data-cell-id="IAWgnODq_W8FyFbd8cU3-2"><g transform="translate(0.5,0.5)"><rect x="0" y="270" width="120" height="20" rx="3" ry="3" fill="#d5e8d4" stroke="#82b366" pointer-events="all" style="fill: rgb(213, 232, 212); stroke: rgb(130, 179, 102);"/></g><g><g><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 118px; height: 1px; padding-top: 280px; margin-left: 1px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: #000000; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">render_fruits</div></div></div></foreignObject><image x="1" y="273.5" width="118" height="17" xlink:href="data:image/png;base64,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"/></switch></g></g></g></g></g></g></svg>
\ No newline at end of file |
