From 7a2b65c013051130ea43e68a8cc717e13c5dd1d0 Mon Sep 17 00:00:00 2001 From: Luke Date: Sat, 28 Jun 2025 16:29:52 +0800 Subject: [PATCH] =?UTF-8?q?docs:=20=E6=9B=B4=E6=96=B0=20README.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitee/ISSUE_TEMPLATE/bug.yml | 2 +- README.md | 511 +++++++++++------- doc/README/IMG/IMG_Run-Profile_1.png | Bin 7455 -> 0 bytes docs/README/IMG/IMG_Run-Profile_1.png | Bin 0 -> 10203 bytes .../README/IMG/icon}/IMG_Snow_icon_128.png | Bin .../README/IMG/icon}/IMG_Snow_icon_128.svg | 0 .../README/IMG/icon}/IMG_Snow_icon_16.png | Bin .../README/IMG/icon}/IMG_Snow_icon_16.svg | 0 .../README/IMG/icon}/IMG_Snow_icon_256.png | Bin .../README/IMG/icon}/IMG_Snow_icon_256.svg | 0 .../README/IMG/icon}/IMG_Snow_icon_32.png | Bin .../README/IMG/icon}/IMG_Snow_icon_32.svg | 0 .../README/IMG/icon}/IMG_Snow_icon_48.png | Bin .../README/IMG/icon}/IMG_Snow_icon_48.svg | 0 .../README/IMG/icon}/IMG_Snow_icon_64.png | Bin .../README/IMG/icon}/IMG_Snow_icon_64.svg | 0 .../Snow-Lang-Git-Management.md | 0 ...w-Lang-GraalVM-AOT-Native-Image-Package.md | 0 .../img/IMG_Maven_Package_1.png | Bin .../img/IMG_VS_1.png | Bin .../img/IMG_VS_2.png | Bin .../Snow-Lang-Journey/Snow-Lang-Journey.md | 0 .../Snow-Lang-Journey/img/IMG_JNotepad_1.png | Bin .../Snow-Lang-Journey/img/IMG_JNotepad_2.png | Bin .../Snow-Lang-Roadmap-2025-06-11.md | 0 25 files changed, 302 insertions(+), 211 deletions(-) delete mode 100644 doc/README/IMG/IMG_Run-Profile_1.png create mode 100644 docs/README/IMG/IMG_Run-Profile_1.png rename {doc/README/IMG => docs/README/IMG/icon}/IMG_Snow_icon_128.png (100%) rename {doc/README/IMG => docs/README/IMG/icon}/IMG_Snow_icon_128.svg (100%) rename {doc/README/IMG => docs/README/IMG/icon}/IMG_Snow_icon_16.png (100%) rename {doc/README/IMG => docs/README/IMG/icon}/IMG_Snow_icon_16.svg (100%) rename {doc/README/IMG => docs/README/IMG/icon}/IMG_Snow_icon_256.png (100%) rename {doc/README/IMG => docs/README/IMG/icon}/IMG_Snow_icon_256.svg (100%) rename {doc/README/IMG => docs/README/IMG/icon}/IMG_Snow_icon_32.png (100%) rename {doc/README/IMG => docs/README/IMG/icon}/IMG_Snow_icon_32.svg (100%) rename {doc/README/IMG => docs/README/IMG/icon}/IMG_Snow_icon_48.png (100%) rename {doc/README/IMG => docs/README/IMG/icon}/IMG_Snow_icon_48.svg (100%) rename {doc/README/IMG => docs/README/IMG/icon}/IMG_Snow_icon_64.png (100%) rename {doc/README/IMG => docs/README/IMG/icon}/IMG_Snow_icon_64.svg (100%) rename {doc => docs}/Snow-Lang-Git-Management/Snow-Lang-Git-Management.md (100%) rename {doc => docs}/Snow-Lang-GraalVM-AOT-Native-Image-Package/Snow-Lang-GraalVM-AOT-Native-Image-Package.md (100%) rename {doc => docs}/Snow-Lang-GraalVM-AOT-Native-Image-Package/img/IMG_Maven_Package_1.png (100%) rename {doc => docs}/Snow-Lang-GraalVM-AOT-Native-Image-Package/img/IMG_VS_1.png (100%) rename {doc => docs}/Snow-Lang-GraalVM-AOT-Native-Image-Package/img/IMG_VS_2.png (100%) rename {doc => docs}/Snow-Lang-Journey/Snow-Lang-Journey.md (100%) rename {doc => docs}/Snow-Lang-Journey/img/IMG_JNotepad_1.png (100%) rename {doc => docs}/Snow-Lang-Journey/img/IMG_JNotepad_2.png (100%) rename doc/Snow-Lang-Roadmap/Snow-Lang-Roadmap.md => docs/Snow-Lang-Roadmap/Snow-Lang-Roadmap-2025-06-11.md (100%) diff --git a/.gitee/ISSUE_TEMPLATE/bug.yml b/.gitee/ISSUE_TEMPLATE/bug.yml index 6fc2f7a..f65f6a9 100644 --- a/.gitee/ISSUE_TEMPLATE/bug.yml +++ b/.gitee/ISSUE_TEMPLATE/bug.yml @@ -69,7 +69,7 @@ body: attributes: label: 软件版本/分支 options: - - v0.3.0 + - v0.4.0 - main - dev - 其他 diff --git a/README.md b/README.md index 9961193..aa2aab9 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,5 @@

- Snow Icon + Snow Icon

Snow编程语言

@@ -11,8 +11,8 @@ - - + +

@@ -30,39 +30,53 @@ ## 项目简介 -Snow 语言是一个正在发展的编程语言,采用类模块(module)语法风格,支持函数定义和类型注解。它设计目标是让大型语言模型(LLM)更容易生成和理解编程代码。该项目实现了 Snow 语言的完整编译流程,包括词法分析,语法分析,语义分析,中间表示(IR)生成以及最终的虚拟机(VM)指令生成和执行器。通过 Snow 编译器,可以将 `.snow` 源文件编译为中间表示和自定义的虚拟机指令,并在内置的虚拟机上直接运行。 +Snow 是一门受 LLM 时代启发的、面向 AI 友好的编程语言。它设计目标是让 LLM 更容易生成和理解编程代码。 + +该项目实现了 Snow +语言的完整编译流程,包括词法分析,语法分析,语义分析,中间表示(IR)生成以及最终的虚拟机(VM)指令生成和执行器,提供从源码到字节码再到自研编程语言虚拟机 ( +SnowVM) 的完整编译-执行链路。 + +通过 Snow 编译器,可以将 `.snow` 源文件编译为 `.water`虚拟机指令,并在 SnowVM 上直接运行。 + +从源码编译、构建管理、依赖管理、项目标准化、可视化调试面板到原生镜像发布,全部由 Snow 官方工具完成,降低学习与集成成本。 ## 背景理念 -Snow 语言受到 LLM 驱动代码生成趋势的启发,强调简单而清晰的语法和严格的类型系统,以帮助人工智能模型更好地理解程序结构。语言使用显式的 `module` 声明来组织代码,用 `function`,`parameter`,`return_type`,`body` 等关键字分隔不同代码块,语法结构固定且易读。此外,Snow 实现了语义分析来检查变量作用域和类型一致性,在编译阶段捕获错误并确保生成的中间代码正确无误。这种自上而下的编译流程,使得代码设计和生成更加模块化,可解释,也有利于调试和优化。 +Snow 语言受到 LLM 驱动代码生成趋势的启发,强调简单而清晰的语法和严格的类型系统,以帮助 LLM 更好地理解程序。 -相关背景: [心路历程](doc/Snow-Lang-Journey/Snow-Lang-Journey.md) +语言使用显式的 `module` 声明来组织代码,用 `function`,`parameter`,`return_type`,`body` 等关键字分隔不同代码块,语法结构固定且易读。此外,Snow +实现了语义分析来检查变量作用域和类型一致性,在编译阶段捕获错误并确保生成的中间代码正确无误。这种自上而下的编译流程,使得代码设计和生成更加模块化,可解释,也有利于调试和优化。 -## 下载Snow发行版 - -访问: https://gitee.com/jcnc-org/snow/releases - -## 相关文档 - -[Git 管理规范](doc/Snow-Lang-Git-Management/Snow-Lang-Git-Management.md) - -[Snow-Lang GraalVM AOT 打包指南](doc/Snow-Lang-GraalVM-AOT-Native-Image-Package/Snow-Lang-GraalVM-AOT-Native-Image-Package.md) +相关背景: [心路历程](docs/Snow-Lang-Journey/Snow-Lang-Journey.md) ## 功能特性 -* **模块化语法**:支持顶层的 `module:` 声明和 `import:` 导入语句,用于组织代码和依赖管理。 -* **函数与类型**:支持函数定义,函数参数和返回值。在函数体中可以声明变量并进行类型检查。 -* **丰富语句**:支持变量声明(`declare name:Type`,可选初始化),条件语句(`if ... end if`),循环语句(`loop ... end loop`),返回语句等。 -* **表达式解析**:实现了 Pratt 算法的表达式解析器,支持算术,比较和逻辑运算,以及函数调用,成员访问等操作。 -* **完整编译器前端**:包含词法分析器(Lexer),语法分析器(Parser)和语义分析器,对源代码生成抽象语法树(AST)并检查类型/作用域。 -* **中间表示(IR)**:将高层 AST 转换为自定义的三地址式 IR(Intermediate Representation),结构清晰便于后端优化。 -* **后端指令生成**:IR 模块通过线性扫描寄存器分配器映射寄存器,使用指令生成器将 IR 翻译为定制的 VM 指令集。 -* **虚拟机执行**:自带虚拟机引擎(VirtualMachineEngine),能够加载并执行生成的指令序列,支持调试模式输出虚拟机状态。 -* **调试与输出**:编译过程会输出源码,AST(JSON 格式),IR 和最终生成的 VM 代码,方便用户查看编译中间结果和调试。 +| 类别 | 关键特性 | +|----------|---------------------------------------------------------------------------------------------------| +| 语言层 | `module` / `import` / `function` / `loop` / `if–else` / Pratt 表达式解析
静态类型检查 & 作用域分析 | +| 编译器前端 | **Lexer / Parser / Semantic Analyzer** 全栈自研,生成 JSON-AST | +| IR & 后端 | 三地址式 IR ➜ 线性扫描寄存器分配 ➜ SnowVM 指令 | +| 虚拟机 | 栈 + 寄存器混合架构、GUI 局部变量监视 | +| snow pkg | - `.cloud` DSL 描述项目、依赖与构建
- 预设 `clean / compile / run / package / publish` 任务
- 离线缓存与远程仓库解析 | +| CLI | `snow init`, `snow compile`, `snow run`, `snow clean`, `snow build`, `snow generate` | + +## Snow-Lang 官网 + +[https://snow-lang.com](https://snow-lang.com) + +## 下载 Snow 发行版 + +[https://gitee.com/jcnc-org/snow/releases](https://gitee.com/jcnc-org/snow/releases) + +## 相关文档 + +[Git 管理规范](docs/Snow-Lang-Git-Management/Snow-Lang-Git-Management.md) + +[Snow-Lang GraalVM AOT 打包指南](docs/Snow-Lang-GraalVM-AOT-Native-Image-Package/Snow-Lang-GraalVM-AOT-Native-Image-Package.md) ## 开发计划 -[Snow 语言现状和下一阶段开发路线图-2025-06-11](doc/Snow-Lang-Roadmap/Snow-Lang-Roadmap.md) +~~[Snow 语言现状和下一阶段开发路线图-2025-06-11-已废弃](docs/Snow-Lang-Roadmap/Snow-Lang-Roadmap-2025-06-11.md)~~ ## 开发环境安装 @@ -78,199 +92,257 @@ Snow 语言受到 LLM 驱动代码生成趋势的启发,强调简单而清晰的 3. **运行项目** - 使用IDEA配置好的运行配置SnowCompiler + 使用IDEA配置好的运行配置 `Demo1` - ![IMG_运行配置文件_1.png](doc/README/IMG/IMG_Run-Profile_1.png) + ![IMG_运行配置文件_1.png](docs/README/IMG/IMG_Run-Profile_1.png) 4. **运行成功** -``` snow -## 源代码 (main.snow) -module: Main - import:Math - function: main - parameter: - return_type: int - body: - Math.factorial(6L,1L) - return 0 - end body - end function -end module - -## 源代码 (test.snow) -module: Math - function: factorial - parameter: - declare n1: long - declare n2: long - return_type: long - body: - return n1+n2 - end body - end function -end module - -## 编译器输出 -### AST -[ - { - "type": "Module", - "name": "Main", - "imports": [ + ``` snow + ## 编译器输出 + ### Snow 源代码 + #### Main.snow + module: Main + import:Math + function: main + return_type: void + body: + Math.add(6,1) + end body + end function + end module + + #### Math.snow + module: Math + function: add + parameter: + declare n1: int + declare n2: int + return_type: int + body: + return n1 + n2 + end body + end function + end module + ### AST + [ { - "module": "Math", - "type": "Import" - } - ], - "functions": [ + "type": "Module", + "name": "Main", + "imports": [ + { + "module": "Math", + "type": "Import" + } + ], + "functions": [ + { + "type": "Function", + "name": "main", + "parameters": [ + + ], + "returnType": "void", + "body": [ + { + "type": "ExpressionStatement", + "expression": { + "type": "CallExpression", + "callee": { + "type": "MemberExpression", + "object": { + "type": "Identifier", + "name": "Math" + }, + "member": "add" + }, + "arguments": [ + { + "type": "NumberLiteral", + "value": "6" + }, + { + "type": "NumberLiteral", + "value": "1" + } + ] + } + } + ] + } + ] + }, { - "type": "Function", - "name": "main", - "parameters": [ + "type": "Module", + "name": "Math", + "imports": [ ], - "returnType": "int", - "body": [ + "functions": [ { - "type": "ExpressionStatement", - "expression": { - "type": "CallExpression", - "callee": { - "type": "MemberExpression", - "object": { - "type": "Identifier", - "name": "Math" - }, - "member": "factorial" + "type": "Function", + "name": "add", + "parameters": [ + { + "name": "n1", + "type": "int" }, - "arguments": [ - { - "type": "NumberLiteral", - "value": "6L" - }, - { - "type": "NumberLiteral", - "value": "1L" - } - ] - } - }, - { - "type": "Return", - "value": { - "type": "NumberLiteral", - "value": "0" - } - } - ] - } - ] - }, - { - "type": "Module", - "name": "Math", - "imports": [ - - ], - "functions": [ - { - "type": "Function", - "name": "factorial", - "parameters": [ - { - "name": "n1", - "type": "long" - }, - { - "name": "n2", - "type": "long" - } - ], - "returnType": "long", - "body": [ - { - "type": "Return", - "value": { - "type": "BinaryExpression", - "left": { - "type": "Identifier", - "name": "n1" - }, - "operator": "+", - "right": { - "type": "Identifier", - "name": "n2" + { + "name": "n2", + "type": "int" } - } + ], + "returnType": "int", + "body": [ + { + "type": "Return", + "value": { + "type": "BinaryExpression", + "left": { + "type": "Identifier", + "name": "n1" + }, + "operator": "+", + "right": { + "type": "Identifier", + "name": "n2" + } + } + } + ] } ] } ] - } -] -### IR -func main() { - %0 = CONST 6 - %1 = CONST 1 - %2 = CALL Math.factorial, %0, %1 - %3 = CONST 0 - RET %3 -} -func factorial(%0, %1) { - %2 = ADD_L64 %0, %1 - RET %2 -} - -### VM code -112 6 -152 0 -112 1 -152 1 -162 0 -162 1 -201 12 2 -152 2 -111 0 -151 3 -161 3 -255 -162 0 -162 1 -11 -152 2 -162 2 -202 -Calling function at address: 12 -Return 7 -Process has ended - - -### VM Local Variable Table: -0: 6 -1: 1 -2: 7 -3: 0 - -``` - + ### IR + func main() { + %0 = CONST 6 + %1 = CONST 1 + %2 = CALL Math.add, %0, %1 + } + func add(%0, %1) { + %2 = ADD_I32 %0, %1 + RET %2 + } + + ### VM code + 0000: I_PUSH 6 + 0001: I_STORE 0 + 0002: I_PUSH 1 + 0003: I_STORE 1 + 0004: I_LOAD 0 + 0005: I_LOAD 1 + 0006: CALL 8 2 + 0007: I_STORE 2 + 0008: I_LOAD 0 + 0009: I_LOAD 1 + 0010: I_ADD + 0011: I_STORE 2 + 0012: I_LOAD 2 + 0013: RET + Written to D:\Devs\IdeaProjects\Snow\target\Demo1.water + + === Launching VM === + Calling function at address: 8 + Return 7 + Return 2147483647 + Operand Stack state:[7] + + --- Call Stack State --- + + Local variable table is empty + ``` ## 编译Snow源代码 -1. **运行编译器**: - 运行 Snow 来编译 `.snow` 源文件 (Windows环境) 并且在Snow虚拟机运行,默认以 DEBUG 模式显示执行过程和状态。例如: +### 1. 独立编译 (Standalone Compilation) + +独立编译不依赖 `.cloud` 文件,而是直接使用 `Snow` 编译器进行 `.snow` 文件的编译和执行。 + +#### 独立编译步骤: + +1. **运行编译器:** + 你可以通过以下命令来编译单个或多个 `.snow` 文件,或者递归编译一个目录中的所有 `.snow` 源文件为`.water`虚拟机指令。 + + * **单个文件编译:** + + ```bash + Snow [SnowCode].snow + ``` + + * **多个文件编译:** + + ```bash + Snow [SnowCode1].snow [SnowCode2].snow [SnowCode3].snow + ``` + + * **目录递归编译:** + + ```bash + Snow -d path/to/source_dir + ``` + +2. **查看编译输出:** + 编译过程会输出源代码、抽象语法树(AST)、中间表示(IR)以及虚拟机指令等内容。你可以看到如下几个分段输出: + + * **AST**(抽象语法树)部分以 JSON 格式输出。 + * **IR**(中间表示)部分会列出逐行的中间代码。 + * **VM code**(虚拟机指令)会展示虚拟机的字节码指令。 + +3. **默认执行模式:** + 编译器会在 **DEBUG 模式** 下运行,显示详细的执行过程和状态,并且在虚拟机中执行编译后的代码,最后会打印出所有局部变量的值。 + +--- + +### 2. **集成编译 (Integrated Compilation)** + +集成编译需要使用 `.cloud` 文件来指定项目的配置和结构,适用于项目标准化、依赖管理、构建管理和项目分发等场景。 + +#### 集成编译命令: + +1. **基本用法:** ```bash - # 单个文件编译 - Snow.exe [SnowCode].snow - # 多个文件编译 - Snow.exe [SnowCode1].snow [SnowCode2].snow [SnowCode3].snow - # 目录递归编译(-d 参数) - Snow.exe -d path/to/source_dir + snow [OPTIONS] + ``` +2. **命令选项:** - 编译器会输出源代码,AST,IR 和 VM 指令等内容,并自动执行虚拟机引擎,最后打印所有局部变量的值 -2. **查看 AST/IR/VM 输出**:在编译器输出中,可看到 `### AST`,`### IR` 和 `### VM code` 等分段内容。AST 部分为 JSON 格式,IR 和 VM 部分为逐行指令文本。 + * `-h, --help`:显示帮助信息并退出。 + * `-v, --version`:打印 Snow 编程语言的版本并退出。 + +3. **可用命令:** + + * `compile`:将 `.snow` 源文件编译成虚拟机字节码文件(`.water`)。此命令会使用 `.cloud` 文件来指导编译过程。 + * `clean`:清理构建输出和本地缓存,移除中间产物,释放磁盘空间。 + * `version`:打印 Snow 的版本。 + * `run`:运行已编译的虚拟机字节码文件(`.water`)。 + * `init`:初始化一个新项目,生成 `project.cloud` 文件。 + * `generate`:根据 `project.cloud` 生成项目目录结构。 + * `build`:构建当前项目,按顺序解析依赖、编译和打包。 + +4. **例如,执行集成编译命令:** + + ```bash + snow compile [SnowCode].snow + ``` + + * 此命令会使用 `.cloud` 文件中的配置信息来指导编译过程,并生成 `.water`。 + +5. **使用帮助:** + 如果你需要了解某个命令的详细选项,可以使用: + + ```bash + snow --help + ``` + + 例如,查看 `compile` 命令的具体选项: + + ```bash + snow compile --help + ``` + +--- ## 示例代码片段 @@ -279,7 +351,6 @@ Process has ended ```snow module: Math function: main - parameter: return_type: int body: Math.factorial(6) @@ -308,32 +379,52 @@ module: Math end body end function end module - ``` 上述代码定义了一个名为 `Math` 的模块,其中包含两个函数: * `main`:不接收任何参数,返回类型为 `int`。在函数体内调用了 `Math.factorial(6)`,然后返回 `0`。 -* `factorial`:接收一个 `int` 类型的参数 `n`,返回类型为 `int`。函数体内先声明并初始化局部变量 `num1` 为 `1`,然后通过一个 `loop` 循环(从 `counter = 1` 到 `counter <= n`)依次将 `num1` 乘以 `counter`,循环结束后返回 `num1`,即 `n` 的阶乘值。 +* `factorial`:接收一个 `int` 类型的参数 `n`,返回类型为 `int`。函数体内先声明并初始化局部变量 `num1` 为 `1`,然后通过一个 + `loop` 循环(从 `counter = 1` 到 `counter <= n`)依次将 `num1` 乘以 `counter`,循环结束后返回 `num1`,即 `n` 的阶乘值。 +> 更多示例代码见 [playground 目录](https://gitee.com/jcnc-org/snow/tree/main/playground) + ## 项目结构说明 * `compiler/`:Snow 编译器源代码目录 - * `cli/`:命令行接口,包括 `SnowCompiler` 主程序 - * `lexer/`:词法分析模块,负责将源码切分为 Token - * `parser/`:语法分析模块,将 Token 流解析为 AST;包括模块解析,函数解析,语句解析等子模块 - * `semantic/`:语义分析模块,负责符号表管理,类型检查等 - * `ir/`:中间表示(IR)模块,生成和管理三地址码形式的中间代码 - * `backend/`:编译器后端模块,将 IR 翻译为虚拟机指令,包含寄存器分配和指令生成器 + * `lexer/`:词法分析模块,负责将源码切分为 Token + * `parser/`:语法分析模块,将 Token 流解析为 AST(含模块/函数/语句解析) + * `semantic/`:语义分析模块,负责符号表管理、类型检查等 + * `ir/`:中间表示(IR)模块,生成并管理三地址码形式的中间代码 + * `backend/`:编译器后端模块,将 IR 翻译为虚拟机指令,包含寄存器分配和指令生成器 + * `vm/`:虚拟机相关源代码目录 - * `commands/`:定义 VM 指令集的具体实现 - * `engine/`:核心执行引擎,提供指令执行和寄存器栈管理 - * `execution/`:执行流程控制(按指令顺序执行,分支跳转等) - * `io/`:输入输出辅助类(加载指令,文件解析等) - * 其他如 `factories/`,`utils/` 等目录包含指令创建和调试工具类 + * `commands/`:定义 SnowVM 指令集的具体实现 + * `engine/`:核心执行引擎,提供指令执行和寄存器/栈管理 + * `execution/`:执行流程控制(按指令顺序执行、分支跳转等) + * `io/`:输入输出辅助类(加载指令、文件解析等) + * `gui/`:Swing 可视化调试面板,实时展示局部变量表 + * `factories/`、`utils/`:指令创建、日志调试等公共工具 + +* `pkg/`:内置构建与包管理器 **snow pkg** + + * `dsl/`:`.cloud` 描述文件解析器 + * `tasks/`:预设任务实现(`clean · compile · run · package · publish` 等) + * `resolver/`:本地/远程仓库解析与缓存 + * `lifecycle/`:任务生命周期钩子(pre/post 脚本等) + * `model/`:项目、依赖、版本等模型 + * `utils/`:文件、日志、校验和等通用工具 + * `doc/`:开发者文档与示例 `.cloud` 配置 + +* `cli/`:独立的命令行前端 + + * `commands/`:`compile` / `run` / `pkg` 等子命令实现 + * `api/`:公共选项解析、终端交互抽象 + * `utils/`:终端颜色、进度条、异常格式化等 + * `SnowCLI.java`:CLI 主入口 ## 版权声明 diff --git a/doc/README/IMG/IMG_Run-Profile_1.png b/doc/README/IMG/IMG_Run-Profile_1.png deleted file mode 100644 index b982362966bf71f299104172cb7c3c3ff5b6f3d6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7455 zcmZXZcT^KwyT${Gf>dcyKxqQfRhrb1j)xLD5)7b-NR=*i=v@>9=@Q@|k$$9i1VK7c z>Y;a#PN)e<;0C|--L>wz^T({cXZFsX+3#;Zv)?B%`g)qQ*VwK>AQ0NeT55(62$>YA zyhKS(Iy*Wuk3t|EtB=)`jeRV)KjAVtI(@rv;?K2Jy7lg<2yX{EpeKyF%JLC2<7HLw znMTIAgv9YD8tv90V>vex>UDUyG}u!p!{WEEig4WFW#*=v>cF~HnBD^yyB>qx^f3oE zvpXAQg=Mw=1t`*Cw}w|h+99(yiZ(XZPx~zboyK+fw0p@Qm}UO#%aCZQJ*HqRIY1UI zeovxZeNd&bg!<6-IXrFyuN5-&*@n(OZymdG{_?>rdre z)$i}2(X!7@9|J=P5;Z?_m6=5!wjU<_Fle#}#y+|l%_+rTN2=?2`5+;f5IP3Hfom{) zT|kVolSA$i;Y-LvrUGP>YH(fKd$wqaU$}`0`KkcyuaExOy41FR_cvWhP$Ycmj4G<} z3q?UCuHz;~gRHj;&v!DhNBfPl+81q%!^baGgmX%nIW(lWJZy9(E?HRAcHue&m~OPm8!N}# z0q^{OQ`i>pG-aDVntCSyf=iP&@^Vv*T~;la$**ep&{3>`hwZ#YX7q<4cg9GyTUocw zePKbqs29@JhI-K)NT#{qD}b3XMR z_ZR(cRHYMSpKeIN+aIr^J7DvDObaJY)o1C{UA~c9f_H#{m7$HIY|Lz1E9b;<^TIn~ zA2c=UAVKw9mEH8y6N?G>_&)_+ul&?#TqvqaBhO6X>NoGQi(4qDZQI$eJ%fKS4+KPq zt>6XBNbs6(c#3lj;yr?@-lJBxslWlo83cMm(X6Zyi>P2H^T2bz4|c=DVey-)b?+xz z8tw3L-&MuqX|m_47q-S$2ex^@A@aa{HMn{!WpaF~=&a}My6IT-37(~`9MY;)9 z#&g_iEbxs^S%F=kR7hw!UoG1xf;9dR9=GVaimLaL+OYXy_ZM6$5sAJQa#$-$3?`>4GP3j*O zirFm-oZIg$*|nRFpt52_2sFgggq)Mvka(E$+Iq59v5((Z11*qEajIo4_tpF=%D&u2 z-+}tk*Hn!fp5s{C^nn{hp;$H>YuQgjw@EAKiD%=SLep1|D##+u20kjoLoOu zzr{QA^LxvK7s&G7)6v`l>0DoE4YP$HE;c@_!cA~b{`?_O%R~|d5|W~gmExJj`Wy;#YoxxMRzJa^Zy%PQos0~MekDfJY;dLifD;B^>$N-j41$EvBE zWK(%?)3+H64+l`~Jp3?L&kN3UOZ}Bf$t!!u*G>+(-*a#AGF+|G%yJ?wThPV~kuM&9 z$O{XiQitq*o@kF4>h6WLDAIG_d+4Phm0{L@c~stMBQ9q?`=+74g=PMT=cD{BFc-|! z{884L3XgCz1hPiUl@LD$YMrw_8bycd0HpHp7xA^fj!|x`)n7JkE zkO2}r?uPO{cnCyedOtev*=dg>)P0C+Dtak83sR?SkbL<*S{=bGB|3`e8-bNS+lH>r zGzAZa*?$?xq<}CaaOG3=w9`Hyj$E?;0q*~$%leallMVjcDXo?Y!gWs^TAcuJsmn1BkW^9 zz;BZ*ZTp5na(xcYUZ_Z(r5;H|gc_zCtK@)h5*-w(W#VnV3j9iU*6xL{s_l;Xb zm3{HMb`4NwAYjeM6vt$hrhR?PY|HxGeWi4_) z@VIx>3!}=;Cf`w^BQCoaL0?y5Dod93PGg|QL2KLc=c^kCG=e?ww6{%Q&R_!n+oJD8 zv53`t2z1|{K^O4<@Nv%KlecW}T>87`mW}pgtAy9m;*&;8hn|kk^fy-U??aVpE~({0 zo&@ZKQca^R3}0GZ`>`tZczQ<0)z5L*TCYsaGyeSu&Ee0;=#7xur`-oHU@u5B_~Qq< z=%dx_!OY3Y+01K8!aNXkK>F$}?{jvE_iy9rAmoo zDLa45KjyaV0HiKmJ=NQ}!xD3q<=~vxlB^W#+52e1XQF#vj5!;*GPC52&;BiY zpnPH#RCl`mzANYuZ*@L?PTYWjfbQsn~xJkJwto7ZPoC-lY#84B zE8*3_0yIU*r+K06B;$5N&0^2{+u+);6?lr0cnuEWeoj?)&6OygX)MhO^rhZ1(4J5n zy%8CsoWtV%mix19&Qm?HyI?H$Q+H{989=c%FF!8S!I@`lJ>K9!H(1W!Lc|{Quw}(x z$9PD(nf6(aAq$=rz6pQgam-sf5ju?%d@^k^b`pQ2D__YLRKq!qXmq(*p2cX-f=1HH z%AHHHthje}p+~KXmG*n{V&eF$eE+uH-@Y}6pZ~lm0i3zM>@(U;2|N;@-t{9M{|%H( z971TrMh)F>ygUMB$q(01464Tl8*zdJ&xzQS9R-V}_(U@OvB#OKYd&QQ23o&I(3UOp zN{}&~BnpJL8m>Vy4^!!DmmsVmMZ8+*p10dExDn!FDNEXtTzvJ}$o2C<(=tVKxwHND zzkwnJ%xYo~_BWohzsdE;>bMyTc4A~)-Qu&HdRAw z6#dz2%9cUW%J_o`7vYY1Kz8Wr9J)7A0D9ZElsMA)x@mu5&|};b!0hylgKir~RZZ9Z{nsy_Bc zA#06zO7m!%jFVlV*U;z<=Oh+$x9)za8a1O^;h+Vw2w94SMC;X%=M$2HGv@m*@T7K1^gZ zo0ibI$tE4;9mLmhfL7VBELqdS#fqDi)MYBiSczGI$@DI~Vg6~?%kJM3e^JlN0f03- z(#YMZ@sDw9_>9QoYbU+_KTJVqyWJRF$pVtpUkFql4QcC6tKmeHtk~awhP!E3u{HMN z-jJw>CM-q19kYbO1Q2e0SG$bv8ZVRoS@TBxVl&(_FZSa18g$-{(d(_y!}E{9GjN)0 zT;RKaL?}S^hWj13cwTA8xhEkicm~L;0i^*=0aw69B7Y863j-$k;9^d~Lh^W5@NLgm zQH6JB%c)|?fZg%8NF)T36iqN*$&#T5$>*v2UrXRvBNN$Q~j$S9*>Kt!I5lw^(jMyfk}gYC{h z^-*X+M#GPc$sZe&pGT#%7X%>o+`3wHlG%6-*DY&tv$npBchp`Z}h@!yM=5$BWh^U;I6yc)4A(5WMcn#VTNKRutf zxoHqndxq(qAG}^VpVxT_B`#d~9-&m};C8c|Gq}#+U(nq69Al5(8j$^&TisDcH7yOddAQS3%a=LlM@tD<+Kq0{!` z$I&BEXM{bGxi6Lf>f4o3JF%Ix+frQ(?!LbkF$Xeb+1Xh&FNN=WkS9Q|&7xzACOcfw z4N)>D96O@r#bu?A0c#t0xbhLfBXZip`KlodC?)$RJ*}VqQ3okm8BYq7JxLmpQD``- zIaQZ(+_=gwBjv1Bb>}cs%z&&CGidVx@J=fsI6)GYb z{)J%--nu{5-jw?}BDp9K&2E4flxFRRZR3=bW8Py#Ar!HP!}^k|pkFS6Q%G=B0-~SO ze+5_}eyo^uXkiU*=VJy+$D=Uhzpzx_oG30Rx(M>0LdD7Ohv6xhpa3cK5~OUAWfVbz zLG2o;+Oj+ev&qRS8JQiL_C2_u={_-QcL7!QiW%JZ)h4@prHz0-H zu)iltxcrU22pO4oD*E#w&b)T(+lD`YIQfY*dUTQHQ$ON1)B?*+Pf;r~nl7bV+GMsl zPEA`Pk6Lu60#wV7CjIXKvwRE zH9P0?u&PHvD=Ki{mPgr*@^Jck4{^B{IvQUF#WRM@sTS-o`aWPmXD2LHK{j*P@*}`D zPrAebHV7_D(U)Ij>G$MpVe7?_i>kw!2*JmpIt48_7J=E(DS9(c#q4v?TvEC2*C{qq*$w;I} z+&5TAT512j^6qp2Qg7nJr&(_s&)AB1q|AODG||U&<=?WticKd+2lfx(WQf^wg5|@w zu+V}!g2>nJYzG~Pnimb#IcdJ#awwBcH>d7OA*jIU%3H!RK)dH5ZNN;*jV%W4kt5#* zV8fPOIU}sW&&A`NR!VZ+lZBNA@BY8sSl4~gdIv?c;B|ke#~0PL=i!}DitK+3fP?g_ zcG75pZeO3IREuds)$mcAoJK=#RG_U^y3Z86m`3U|yv(Ftu29S(RM(t^pZWn{TbzZb z0PN^%kjK1r1)BGdDz&nA!>k{XP+%pQe_ElqbxplhlmaeGCWwx3cm*VeM6>>ts8iYqkD#mNeAg1uD6fAzl^?H$*6 zug5oc*}25fGQ1Bc$_L|88>le%HIqU^C*t>p^+yh_x0)~5#UylOv$pxPHtx6BD`pZ0 zeJWDzv{sF0#Y&&)4f8nMvm(8YGFNOjEQWRZa(-R_S(EU&-};1rII72HVBQ)g<3Q$?bNgV$!}dv`GM3^AmMS!n7ch~vSwKO_ z7EvbpI=Z{wL{l}r@g&&a-76As5YiNkyon5gQ#cc`v^T)eSW*`fpnee#EY#6hdzLq+ zf;$~ra~+yp!<2hW;c5ohbaJJZ>Z@g|6^ioJfr?{KR>>+mlv;IX&%=>iG_f-z0Nw(C z=tVpe|MX z7g0ufM=K*^eRxCc|AFW7e>IoS0noibti|=zUa+WHW!9LPbW8SsIZ4O$n0Q_Y^R*$^ zA3jU|Ktf6IOy{5?;S=>7W8~i~icD3u)*ZKR{maN-Qw$mA`f}rKzo4c4K%X4R8Gd>x zAv6zT)Zeoi@VH5>X~?uC3XUY}0X568ukV!#6{2w`a(rTVM=csS#JXEZ_#W5mU8`wzd`b2mfgUG_|A z*h3SbtNH-V%ybhzaqriqJzWFrx&lj+UrapE^LSL)5K|@ldo(Vt&|C!FS*5kKKVtj? zR(_y!KVfy?(zm$0J);J@ekbQFiw_1%YXgFE5$Wz}LaEi-)%ygac<|+FK9aG#Sikik z&4LOdo{!u(2#m~YAjL0Y1J%JS;;X5~LrmsfV8#ra-&;qy^+seID+mr@F{6_6Cev+j?ZFGDX!u+KpE6`)!)AhCq;ZAn5Yv<8M)q7JH)ANaB!Ni znz@b&oV1_Hlm^>j^GT#f*r^zYK z+?tgn<%u+Jj|mKr#6M(_XgyiOL+M_>SPJ}%Xb8|XxBcm zpp($9M9*;j>*|8cxn~ef&8#rvPberOE4q$w4rrz2i3(eZtOWY zAlWS@T3l58+C|sX%d-@cLzz1WyOu!tLw1crU2g!UI>>=9q;rcwqZ9j?0(K4r)7YU( zP~I~h>Af2DtANJ+(32O`6Wb9KHCbX|Qw)nJJRgsA$0+ls@66TMCb~JrE9VZekXiEs ziq}&j;U^7}d)Xy#yv$^0uGVtnNhT9+U4hz5s8>XncFse9(B~e;c}YKOuO;_8K8{G&M+USx~oUFpg0l2 zD(kx^N${l3RvBaLpu&Qnvca6voO|Et+e3q<#P*ibgnerJA=T&dE6ZUP zh%z0bB=bu3J-|pXBcix$?{#I){7l(D^Zv%xd$(E0HNK5>RSB;2*CPX>i-k8_3NLwe z>0q;?E(3bj$8GQZ8GLF-78K1j*~cCLGgnA&)}!*pzVJIND5W4cNQ&l+cqNq6DZvVR z{~FnB(9?P1J&6yWkVtPf5bnMK#t!%B6AlfNqkbl+>5`p;!)^3aPT?f~SlmQwk2mx7 zY*2g1iFayZDL1OCTe=Qe$UI7{618e?{f}$*4F9_#k%#gG+DfS>$v=O z8umuL6iGY#yMJL0@pb_rbjK%ZkRqV5J~YS+6MFK!e|{}1CF?ft)YH@TGSZ{sgxf8U z{#Y5hSf*JS_qg8&(>khpRv>&9cQUM>JpLKCUhsv;#KS%?-n6ANfnSy|k?(O?c(V3sV^Jv=nBr}(D5 ywM8ZDO@~UM$6RyFHP<=kIlq_*QB{UfklrQ*0DwY4UQQhVaIpJ0 z9mKfUBg)SY^ZQ$bEz!`*1>}yOT2$3_2D_LNavku3xM#JzXW@?AGrLJTKrj@-wY1C z!+(`+Lz~c%2z`SrIls{ORuA*1Zl=6H+ba0O(#e*J>+?c4NntLHFw#QL9?H?uw^yoD zs!#JyS?_9SPIzp7AE~yx%)fpod2t?xlt{hF^DHPov>}~W>T+ECuAT1q!AU#?>TvA% zalU?xvV!4C@XoQVuLr#}$yr{!0^PCCCXUR&&^uSmj?eMsEj#G=%%xUekJyLjQ%ixQ zFKJyQbrENs9wU3N+;+&sbYcvz(X0D4x2s=J>mH*&x1|3zXemzmgzv4<#~!p=6K8y} z$wH!-r(a3yXtvr_d?4AnPz>vCW*N0TFE8+;P?_>x)kLsbd*6I| zbYX+2A+)e>EIQ<+hFXocwf6LEVd2y!vEp!dd#F&g`Qk9~_WJ8|F7AwX1BwOlV=r5! z-_az*4rRcePOQ@+C5m=X>d9Bnt-gi4L4Ae3hhg8cmDt&7UvB!J)bDPjNM5ZE>B1?Yi|k-%SSqthOUgHiWqml5lapn-qS$yK z_r+B9s?%uc&`nLyGZ&cmP>jBObjbt8n=Cf8nsKEmKjow48#7U{3MqLAy?fFHHXFo` zB=s|*#$>s=bw!)u#3FBbJGu;ulu|@kE*1ptnlHZ;9RIb8tIp?AMJJ2O0;M(VPL*=V zq9GO|oYms6%QNxs>n5r+5#&|xpps>0(}w$;*TX-pE|)DIr3<|jEGj6;Z#_Jhq>5Fo zwd6>e_$p*VbRgH?1UV>WyT8Q+2C^eFzp1=6=a{H`B*E zt-rXt{^}9Te^aedu${7eeR3;}NJ!Y$%p$K$kCj0r54K9E{Vc+SV2AF>XwmGTdo~5j z3lHaWR546WfL&Sm4#_4PWl1PcfU&{1Sa8M+qrquna<@Vg{O6XwHQLn!#L-ce0M@$I zl?s=8E4%0niAI1G(vu&IGa1(ItruHMU|0Ew<)pJaX!c164CKViUgQ4yNA3OH@|dE) z#3KfSdgc!>)O#!W)OT{Y>rt6xjdC8F72CZ7)1L|Z^yBOI_2bnnkF!$p5qe}N9L%)@ zE9ce zs^w3Oi4wB<5sJ4JVgRW24j>g7+}R!8joJ;|yge4l$mkRK8Ajb3*z-#Ny!;TK1D&PE zsk^)i2_d(G-WkW+n%8eWM>@%L?n;UEC|1F<(+SO7C3aL>g(AhWI5l$Bm}Rsf?qjlU2Zubn>+>4AUho*7M4^BUcuT&DbxcO#F_%%`F$ zL&t1CjAa)A2H<3y|hQl6qcs%u%HB+*Mdb6R0fpYl)Qn_Eai-W3z z89pQ;h$%(yrF`V3z=j)zl&e6lS|&IWXIV6w>jkJ@m6RJ`&Cj#twX#>BvzoCVG_wK& zlL~L=<-?!)9!~f^znGop=Oazf)|}u+RXwaO!eu4O=u#n#B+kY=@W-5_v}cZVt;WTT zxo}u$*4Jzh0F;k>)Dd#5%<`n_W@=*47jPy-0AVLX8E-^CRs&p@oluexhfZGT_eR#ae0ZHx3)M?u)ssb$jnvvaMz zVy~Ouf4ZgDO@Gh0Qj%33{Jfgkw2|hAS0bcrvN8;?zqf-v17U`MPjclM;**apqMEjJ}OAD|DyfLWDJ#v#vk*vuQ?pt*4mm+>KcoD=1| zFJGq8lw_gIqn<@uw^T8z%7lst8tPJT8lRE5x!XLv5~z09N)&+1>m5_$6n~RC{NJ2vawnEB->Bz9QNPR z3F37XHT(D5XFcD0PXE+kJl{uTQvf8?av;DFAB}^c`_~8uKaC@(P9eK}MDsWtH?mU| zlKWYi!bnT15T<5fVqV$+0V?8qj8tUBF|0|;-vD#5XDpd@3pp@+GoDB%)k)IT1x+$T@IxQvPlyb4fHd!d^q>f$$cvK`$B2QH?-&A^OFT|#{^<+X)$g;IbeB?>y zwxll2Lx~%g`$w3i?lGnM5Pm4buZW6>o6xQ98m*$%=X}5E&A7)}bKeJR76wnGP0bzr zj1NaKs`^W)bJ`ZLFz87<$sSi?EFhD{QlQ0%Z#kO!))VPlw#~1(s$W$rUc{D8PxyFoB}r-6>UqO7GhE&m$ei`;=L1;0 z{Y)_y#0u~4O@%Xvh#4g-Td)Y>Lh=3A+jR68tr^}KUccd2QXbW7dBZd}=6DQ0q{3qA z=)To67dEH=g`z4H<711I+ywDZLN zKzF=KV36?f?&$x(q~}&nb@(5cOcNme=^gQ~@sm(A+psLVE_`&0Tu7IHr{ROEauv(8 zZcT~itOypZw1Tm$kXVWiZKBiGNI?0>ruG5Y>MPMp@a$E_pP6^tG}+M$JPm0=h zp>nwBs2MEosrAWkwzWNi3EwZN`%&Ee@gEf9W8VFfACO&J>C+Zuy4e?MUySh1eTStuvZ91=i-i~#JHLW<2ixEH7caA z<-5|@k5oLW%3jQfp4yTvTBolKFSOei0v@ZuS88jh-|7fe%T@g`a;v0B(*~!kj5rhKW1?_; zbve!0lSCON z&R#CQZuB)3+#Ri6ox4%4cpokO+Jaw#q$TE6qVed~dWg#gXC(2}Avd{pt@ELTcjYm% zR=MS}Tc!2Na#iKpbN^dT5eeIOm*R&D0_O2YzUvp4He_{zVpx)Bzqc9wZKO<>=~Ic2rd+?&hofx*}B!ke+L(d*LdbIj)Tmbcw! zi$!?fN%d-DIx)WuwGDv{H<>)hP2%I@&C4dTY=0AU6t35%nvT}X#?AhU9}mWIC5xa3 zZ3Vd!KFiIe5~mxRz0cDhrPr%FEUR}$edw$4Y5Y{BS7aefV@Cev8S6NzL@=!!f5D22 z4c*oS8gw+^hgQLE?CU;tu=|~0BylSPuyZwCjoXVE1kZ4Ng`*nxx8q3@&(oJWOt0DG zx;tFft8NWLXivto^4?jj_Z)a2`H|a=I+6|+-9zu19zHl9ADEoWEv22k-poPH)g7c6 z$Cb=b^YGrV*%L&Jot*4KB%nHt%SwUCGUQP4h&wBdu#Ju0-E`j;711iumgC<{iFn)N zcDY$|S^W7K2ccl!_q#3%QYeiDebi#tc6$_k!rXynZ~1c~-@Uy;VN2ttt0B)pZyE_l zhhC`NjKi*WhHNR)M&By*&Umz5^pDlW(XY_t5sH#3Sk!(_^Ifj5T$4=J9vjk{P;{y^m4CYOa7q*CsE zei2OHZV&3)9658k^ChG7TUY9xCA4tb?r()m z&IccX)>E12TkyZ%Lr0Nft7W7<*L^K%cL8G2$dYqScbrZEO0@{Nqi83hoW)-qe>ik& z#f>mEzN4G*$M?I2J0`!Sn+gTkt|Pl8LZ=ct6lz|+*#5R`B{;OK`Lp*&ZxyO%Nl>fr zZsf$%wJ(oFe63zUMAQ9%}h(jtO`7kF)7r-f1XbKTN#I^a103QSr6cGXW zgmB;!!GDO(bTH%`)Z%8lnw4_h;l5H`yTO<|W(t@SU11V^j#+BnvAng`?R;{yu>K+8 zGepVOT7kr@TGlxXs@TC2MLqE#mE{o~TRzI1QRTbQM^O|}q!j0FF3};w3`JK|7T4={ zGmDobdxJZ3^EFPY#WuHvddF98vE{Tt zcM4r(#{=?4zYRQ9Hi9z{$g_ENq5`V`VuVJF7nGQXQ`3C5Jr$nEpi(@9dc?p=q~H&Z z`b^7V5qJ8O152$BDfrUhKgk%X;AJ_tjfwARZ-oxynTN5XZ`?0_kEwN$tf;rWPG0<0 z5&A9pxWqSmoT5{(&XlC(?1Bv9Kgf;&lJ1beRegqz&*L>#;!2D4gv;}5xYSwp>ZYED z`@l{6M*{Skj8Ksr)F3SZW4b**1BeLxt(RBdVkif`!bp?v)AOhjd)pulwdGC7Ps*xaEo}-g&>Lw>N~#oibB%=|l(?3%^6W zD9FW^+StuSI_nQ3!Gl|5n}fmbA7n?rhW1$Mn+L*P?YZ?VDMk9vC!tCMosCSqFtp@QN*(33?JVn;9AwB#+O! z&JF_s71aL^?D=0D^Ut_1T%+XYga@W@`@wt%f>c$o`aVELiKTE}YlZ)d!XXHdlF&RS zRd3Y{Q}w4JfI+CSWAEIzyCrptJL}7!Av^)DevU7(OMMZ zh1@m_UBTCtrGl=SD?`JWY6t}^1~d%9xxvq&HvwmJWe^+8OSb-y(Qes*g(b(*mY~&? zIigP9uqels_&&6sxHT;WcrU$rSoY$TpPOM)ZL!PRXNDs010Shm!#r6|D?Tv{fYVb1 z4yJ9=Utn-hF!)Q{2kzQ$Tz&UMbo8czUC-lhHyF;zVyQ?Dax*%%2x+ME*WAzkDb(#_ zQ6J5*5+9rYt;FXbhqSC%d@1bOap&pGDPlqC*@V{rBE=_04a5WWr~&3H%okY>)?93} z03rk!K#J^d#s^90uKb;zyBF&>PW)T}x;s}GwDMb#*vdIb+=u(4V-Nrz@*aF3HW*iV zq#8a1Ao%^!f?Q4;Cd=8JgK_ypAgdK#K73Xn>4&VrH6QN>CGkN`EI`?CZ37&@3C97v zE&=r+31`V53hWgffPk{z5Gq8{Mk8x2=RU_pk~vP@i$tx*{X)5s(*PIIB2e|4Yos_g zq^Wzu!1*7Xg68npZ}`ITTll!=kL4{=?>STv3QOHN`GE(DL!`E+gMnq5f2UplIR=Jn zOgsc41M=>>qj7*&QXrt}??kpf=+Q$)vgaI~LfJ2d(7|8TxOC!afANU+Lf(`QJF36n zt8b!?x&bg-jRXkmRugy%ERP4c+#T=PfOSuJhIdPi-&93KzUoPR z7ua-YKX9|i)RNcQMSbx6=BDP8;OANwRxd#gLzaRAOps@-H0p2=rIJhpABI!qXq>nwvMjPkwQu4e{#<9K6`M`0u2%H${Tc(v%VJmY=MogOXf z5s3M1pHh(4mIdv2g9Qfey0jC94mX;5#!d- z+~Wn9Leuf5dRV{~-in!hTuQbAs9c4rbOXNetM$0-cvUCi&Cajn)&v6R5}PQnq5eA$lv4_3txlc%@EX0$8TF zYU3CE9*Ua&)veq$UfQEe?Q?%-e@ZtAQfM^F4occ?ap;Yl;UY+6jazE{6om0+2TU)U{)nCp#KW zEnni&WGe}z1wGt@?06scY8$Hh*g8Z(|e|5D6iXeJIR zqIoUZAkKzn<6}7@sd=iBA;~fo30z!xIGS}V|;zvOYaCfGs-`r56V==!Zuf5Wp-?(_~ zOo|8)%@ofo!auIJ&?~B6n^^xg|4S{nGki7(!hgScZ6Mk#f%0l`N!zZ!#r-n< zIQ5*{Yk4u+bFOY_p;QKG1e&NBp?O-wQO%w^(3y|)e3-*%V1>G~^4#;Ka>F)!=YQ6Yi&J;hMC@?{2$XSWzu7xRpQe?r`Sy~Bp3)xqp2YTn0Zf8;f& z*<$dfEAswZ9EX`YJ;)b-pw|}880lOoqwB z$E%SroL5V6sD zU>>}H^SRTlbL-hi+Vo((`djD2&p}zhU2`Jb*vLg(+(_%_QX=Wj?9d|p#FrpiNaEN9 z@c^M?B$ioQ>8Yt}B^hg|t7~Cbu$Yfzo_JA6^kLyBh-!GegcvH-CGQXZH4-ZCtA7kh znLaALTf$qISLCsC2D6@3WeT_#zaX98DqvJ3NCK7mj6FAY{@}8OL(^l$rf^*8ZNXN^ zC``QMNIfe(jiD0riLP`4Vjj|AmN=B~GmUjZJ_5|hGGBou@zT)`cZ|RLWZyH;XB%UV zh-R?d5i~Jc9@`WYm!1tW3(~y-N03LFV?Ds}ifWJ@)jd-Fit>Nq-)qdbyQ=2uaD?*H zsDb>i>EIDtX%_gCTK*z2#zj6#HPGf$rJASDMxBqQD4akWcX1*`FV@+h8tueb4IxCN zW>zB1_J@FbIw2l;nJ#fZenh|HSjIHlX$+_bNkybyevdyesYJZdtpu% zFrM;QhKRXm!#o1l3N2uza@^COHW~einHyI)iQ4SaAW4T3cN%INj^gs3af5*Sp9g~0 z$7N)!G(~}Rb`p5U%{9eT&)uBLXDwPF8;phJ9d(i(a)n_?Ht%Q6C4-P=bm+~`C3~)e#C59*`4#RpO z$qF_)RGt{~N0}X*RoW{IG1D3;BIrFfKdghaJ&Ms;f7V#UE&>N4cbd+hbF>)#ghdRO$$OblpwzXPp%z%HHL~Z>hB& z)7TKqSPHJG@wokVWEwu8u*$ zyOF4WbWzJiiH2H4^b_l*RD>@+D@7zjE>{bz!%lwx@J;gOC0Hwh%Ih`)voI0azn;I{3 zDMClB-&AS!q@ZQ-D+KGWsx#q9v9Hj(=1lvisp4S8b?lC3T}p*WR#^>cjEgQw>BG;f ztU)I~WZ`)oH~;z`4e&m>SjUl4{yXXZ=i|U8_#5rHD9UHddo_gtJJ08Ff>&+7R8SE+ zUYav-dj|zi^1MHm_*uJ`4)ai60Qr&%XoE?EMI$d!b)9ts-`n3D-(%4qt%!!>Cdlp?;Ejt#-Ri&chwy` zDsk7@i{b7^;Ik*%raLB@8pn828;SJrJVEzQM2Vn&JZOIiQakmYiM_=$Dh^T35;J>( zk>J0yTv!J3qt=oENi%HpHlmFpQu$&%>I$i-Q3}X2USZ@Vu?_^BhP*wlOhRdLZD;JDjd^8NMFnUzkErGS0pP$D-oiK&nmQ2s)-BCP0lm3HL4@mhw{x4^R%!*bt; zf)%OmlDtob1FP{9w&;M?Y!wjOk^h5=5&U|gul#jdnT-v%?}p*oU3w9B?DM>DB%d!Y!y@_^s{4lQB#0{$BUV*`<-vlf`2z`iP{q-J$K~fENmF0H3h6J+^*MD3m(DDf)&eA&*IQDrw~1S?AS;ykuOei=!s&kI~*1H zDNt05B`xu{Y6CqQ2RBjz>Wq(u7KN@h$#~hsR`!m5by_shs29B(NAxA;^fRof8L9UD z-Q`A{v5TYs93DQa5*+Q*V|%lz8L2s2Ow@?qpCWdSZXm&;w~%}cSWuNn`zWvX#q>@@ zMXB5^tLjGLNhij&79tEl65{~{5^Mk6tNNc~?&ypbI(&qIluMf|2mtW@MyLGg77lN? zyh+jMLOS`T3zKU<_%2=iS#-c8nw`J*PItbG;YysnBY>9A0{@N^-d26jMAs0C^o$93 zF{_jZu%%Ioa?U zZbI1Tp?Jxq6!tN#kC-`!;tR;qDtDrx9bYoi%3dKY1+!Qf9z%Bbi_^x&+*SZ8tj7Er z8ftUl=!pT7)1CeZ6)DD07s1baVnrsY4jE!r!Gd$KuV`f-s!_3EPlZy{NfeX&$di=o z#*i$vKNtSE!Fy4XbL)dRv@4gR>3DcR(6qJZCJ^#)y)C6>Z;sQg%nD?nH%OZlg;Vh6Tomd0n3Nc`&N^h|QQxOA@1o?;Wo^|&`;l%VU!=4Cs zY$>?+)i72S9@hy;w5KMu+-^FyZ&g!z9Qn&Yy2dzPnP{=J{O~-&AaWL)m~s3qeZQi6 ziJtbIDWw+gMII$2H|8UuD`hK5mB-l92ajYE1@yAcEiFkNc=dn9P&HC6g_a4_VLgM1 z)T