From 19288545424ad5cf3ec1101f80b0512dcf11f04f Mon Sep 17 00:00:00 2001 From: V2 Ray Date: Mon, 30 Nov 2015 20:35:21 +0100 Subject: [PATCH 1/3] Update README.md --- README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index ecbfa37e5..2b997d5d8 100644 --- a/README.md +++ b/README.md @@ -5,11 +5,11 @@ [![Coverage Status](https://coveralls.io/repos/v2ray/v2ray-core/badge.svg?branch=master&service=github)](https://coveralls.io/github/v2ray/v2ray-core?branch=master) [![GoDoc](https://godoc.org/github.com/v2ray/v2ray-core?status.svg)](https://godoc.org/github.com/v2ray/v2ray-core) -[中文](https://github.com/V2Ray/v2ray-core/blob/master/README.md) | [English](https://github.com/V2Ray/v2ray-core/blob/master/spec/en/README.md) - V2Ray 是一个模块化的代理软件包,它的目标是提供常用的代理软件模块,简化网络代理软件的开发。 -[官方网站](https://www.v2ray.com/) +[官方网站](https://www.v2ray.com/) | [Wiki](https://github.com/v2ray/v2ray.github.io/wiki) | + +V2Ray provides building blocks for network proxy development. Read our [Wiki](https://github.com/v2ray/v2ray.github.io/wiki/en-us:Home) for more information. ## License [The MIT License (MIT)](https://raw.githubusercontent.com/v2ray/v2ray-core/master/LICENSE) From 1a7fbd6d1bd3a1e97c92de9911acc15b5eac291d Mon Sep 17 00:00:00 2001 From: V2 Ray Date: Mon, 30 Nov 2015 20:35:41 +0100 Subject: [PATCH 2/3] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 2b997d5d8..e5b4fdaf0 100644 --- a/README.md +++ b/README.md @@ -7,7 +7,7 @@ V2Ray 是一个模块化的代理软件包,它的目标是提供常用的代理软件模块,简化网络代理软件的开发。 -[官方网站](https://www.v2ray.com/) | [Wiki](https://github.com/v2ray/v2ray.github.io/wiki) | +[官方网站](https://www.v2ray.com/) | [Wiki](https://github.com/v2ray/v2ray.github.io/wiki) V2Ray provides building blocks for network proxy development. Read our [Wiki](https://github.com/v2ray/v2ray.github.io/wiki/en-us:Home) for more information. From a04cfb726dedc0cd24cd38aec31dcc4051c72455 Mon Sep 17 00:00:00 2001 From: V2Ray Date: Mon, 30 Nov 2015 20:36:34 +0100 Subject: [PATCH 3/3] Remove specs in favor of wiki --- spec/benchmark.md | 12 ------ spec/design.md | 10 ----- spec/develop.md | 49 ---------------------- spec/donate.md | 15 ------- spec/en/README.md | 12 ------ spec/errors.md | 37 ---------------- spec/guide.md | 95 ------------------------------------------ spec/install.md | 47 --------------------- spec/issue.md | 45 -------------------- spec/roadmap.md | 8 ---- spec/status.md | 53 ----------------------- spec/v2ray.png | Bin 9959 -> 0 bytes spec/v2ray_design.png | Bin 20352 -> 0 bytes spec/vmess.md | 62 --------------------------- 14 files changed, 445 deletions(-) delete mode 100644 spec/benchmark.md delete mode 100644 spec/design.md delete mode 100644 spec/develop.md delete mode 100644 spec/donate.md delete mode 100644 spec/en/README.md delete mode 100644 spec/errors.md delete mode 100644 spec/guide.md delete mode 100644 spec/install.md delete mode 100644 spec/issue.md delete mode 100644 spec/roadmap.md delete mode 100644 spec/status.md delete mode 100644 spec/v2ray.png delete mode 100644 spec/v2ray_design.png delete mode 100644 spec/vmess.md diff --git a/spec/benchmark.md b/spec/benchmark.md deleted file mode 100644 index 64f090a89..000000000 --- a/spec/benchmark.md +++ /dev/null @@ -1,12 +0,0 @@ -# V2Ray 性能 - -## 主机测试 - -| 测试时间 | 主机商/类型 | 地区 | 主机 CPU | 主机内存 | 主机系统 | Youtube 速度 | 内存 (单用户) | CPU (单用户) | -| -----------|------------------ | ----- |------- | ------- | ------ | ------- | ----------- | ----------- | -| 2015.09.30 | Vultr | 跨洲 | 1 Core | 1024 MB | Debian 64 位 | >4 Mbps | ~10M | < 2% | -| 2015.09.30 | Vultr | 同洲 | 1 Core | 768 MB | Ubuntu 32 位 | >20 Mbps | ~11M | < 20% | -| 2015.09.29 | 搬瓦工 Bandwagon 10G | 同洲 | 1 Core | 256 MB | Cent OS 32 位 (OpenVZ) | >4 Mbps | ~8M | < 5% | -| 2015.09.27 | GCE f1-micro | 跨州 | 1 Core | 600 MB | Debian 64 位 | >4 Mbps | ~9M | < 2% | - -以上测试仅作为参考,具体连接速度可能受到各种因素的影响。 \ No newline at end of file diff --git a/spec/design.md b/spec/design.md deleted file mode 100644 index fcd3978b9..000000000 --- a/spec/design.md +++ /dev/null @@ -1,10 +0,0 @@ -# V2Ray 设计概要 - -## 目标 -* V2Ray 自身提供基础的翻墙功能,单独使用可满足日常需求; -* V2Ray 可被用于二次开发,可为用户提供个性化的翻墙体验,从而也达到难以统一屏蔽之效果; -* V2Ray 为模块化设计,模块之间互相独立。每个模块可单独使用,也可和其它模块搭配使用。 - -## 架构 - -![](https://github.com/V2Ray/v2ray-core/blob/master/spec/v2ray_design.png) diff --git a/spec/develop.md b/spec/develop.md deleted file mode 100644 index ece97ceac..000000000 --- a/spec/develop.md +++ /dev/null @@ -1,49 +0,0 @@ -# 开发指引 - -## 基本 -### 版本控制 -Git - -### Branch -本项目只使用一个 Branch:master。所有更改全部提交进 master,并确保 master 在任一时刻都是可编译可使用的。 - -### 引用其它项目 -* golang - * 产品代码只能使用 golang 的标准库,即名称不包含任何网址的包; - * 测试代码可以使用 golang.org/x/... ; - * 如需引用其它项目请事先创建 Issue 讨论; -* 其它 - * 只要不违反双方的协议(本项目为 MIT),且对项目有帮助的工具,都可以使用。 - - -## 开发流程 - -### 写代码之前 -发现任何问题,或对项目有任何想法,请立即[创建 Issue](https://github.com/V2Ray/v2ray-core/blob/master/spec/issue.md) 讨论之,以减少重复劳动和消耗在代码上的时间。 - -### 修改代码 -* golang - * 请参考 [Effective Go](https://golang.org/doc/effective_go.html); - * 每一次 commit 之前请运行: gofmt -w github.com/v2ray/v2ray-core/ - * 每一次 commit 之前请确保测试通过: go test github.com/v2ray/v2ray-core/... - * 提交 PR 之前请确保新增代码有超过 60% 的代码覆盖率(code coverage)。 -* 其它 - * 请注意代码的可读性 - -### Pull Request -提交 PR 之前请先运行 git pull 以确保 merge 可顺利进行。 - -## 对代码的修改 -### 功能性问题 -请提交至少一个测试用例(test case)来验证对现有功能的改动。 - -### 性能相关 -请提交必要的测试数据来证明现有代码的性能缺陷,或是新增代码的性能提升。 - -### 新功能 -如果新增功能对已有功能不影响,请提供可以开启/关闭的开关(如 flag),并使新功能保持默认关闭的状态。 - -### 其它 -视具体情况而定。 - - diff --git a/spec/donate.md b/spec/donate.md deleted file mode 100644 index adf7d975f..000000000 --- a/spec/donate.md +++ /dev/null @@ -1,15 +0,0 @@ -# 资助 V2Ray 发展 - -## 资助方式 -V2Ray 支持以下资助方式,收到捐赠之后您的昵称将会显示在页面下方。更改昵称请联系 donate@v2ray.com 。 - -### 礼品卡 -请发送礼品卡编码至 donate@v2ray.com -* [Amazon Gift Card](https://www.amazon.com/gp/product/B004LLIKVU/gcrnsts?ie=UTF8&qid=1443538350&ref_=lp_2238192011_1_1&s=gift-cards&sr=1-1) -* iTunes Gift Card - - -## 感谢您的帮助 -* 2015.10.17: Penn G\*\*\*\*\*\* $25 -* 2015.10.02: a\*\*\*\*\*u $25 -* 2015.09.30: s\*\*\*\*\*\*\*@gmail.com $10 diff --git a/spec/en/README.md b/spec/en/README.md deleted file mode 100644 index 8a801d428..000000000 --- a/spec/en/README.md +++ /dev/null @@ -1,12 +0,0 @@ -# Project V2Ray - -[![Build Status](https://travis-ci.org/v2ray/v2ray-core.svg?branch=master)](https://travis-ci.org/v2ray/v2ray-core) -[![Coverage Status](https://coveralls.io/repos/v2ray/v2ray-core/badge.svg?branch=master&service=github)](https://coveralls.io/github/v2ray/v2ray-core?branch=master) -[![GoDoc](https://godoc.org/github.com/v2ray/v2ray-core?status.svg)](https://godoc.org/github.com/v2ray/v2ray-core) -![License](https://img.shields.io/github/license/v2ray/v2ray-core.svg) - -[中文](https://github.com/V2Ray/v2ray-core/blob/master/README.md) | [English](https://github.com/V2Ray/v2ray-core/blob/master/spec/en/README.md) - -V2Ray provides building blocks for network proxy, tunnel protocol development. It aims for easy further development of proxy software, to help people fight against internet censorship. - -For now this project focus on defeating [the Great Firewall of China](https://en.wikipedia.org/wiki/Great_Firewall), and thus most documents are provided in Chinese. Internationlization work will be done later. \ No newline at end of file diff --git a/spec/errors.md b/spec/errors.md deleted file mode 100644 index 3ae1a2446..000000000 --- a/spec/errors.md +++ /dev/null @@ -1,37 +0,0 @@ -# 错误信息 - -## 简介 -在日志中可以看到 [Error XXXXXX] 的信息,其中 XXXXXX 表示错误代码,已知的错误代码和解释如下: - - -## 0x0001 Authentication Error -* 原因:未认证用户。 -* 解决:请检查客户端和服务器的用户数据。 - -## 0x0002 Protocol Version Error -* 原因:客户端使用了不正确的协议 -* 解决: - * 如果错误信息为 Invalid version 67 (或 71、80),则表示你的浏览器使用了 HTTP 代理,而 V2Ray 只接受 Socks 代理。 - * 请检查客户端配置。 - -## 0x0003 Corrupted Packet Error -* 原因:网络数据损坏 -* 解决:极有可能你的网络连接被劫持,请更换网络线路或 IP。 - - -## 0x0004 IP Format Error -* 原因:不正确的 IP 地址 -* 解决:请检查客户端软件,如浏览器的配置 - -## 0x0005 Configuration Error -* 原因:配置文件不能正常读取 -* 解决:请检查配置文件是否存在,权限是否合适,内容是否正常 - -## 0x0006 Invalid Operation Error -* 原因:不正确的操作 - - -## 0x03E8 Socks Version 4 -* 原因:客户端使用了 SOCKS 4 协议 -* 解决:升级客户端软件 - diff --git a/spec/guide.md b/spec/guide.md deleted file mode 100644 index 431cb01e6..000000000 --- a/spec/guide.md +++ /dev/null @@ -1,95 +0,0 @@ -# V2Ray 简明教程 - -## 工作机制 - -你需要至少两个 V2Ray Server(设为 A、B)才可以正常穿墙。以网页浏览为例,你的浏览器和 A 以 Socks 5 协议通信,B 和目标网站之间以 HTTP 协议通信,A 和 B 之间使用 V2Ray 的自有协议 [VMess](https://github.com/V2Ray/v2ray-core/blob/master/spec/vmess.md) 通信,如下图: - -![](https://github.com/V2Ray/v2ray-core/blob/master/spec/v2ray.png) - -通常 Server A 运行在你自己的电脑,Server B 运行在一台海外的 VPS 中。 - -## 安装 V2Ray Server -[安装 V2Ray](https://github.com/V2Ray/v2ray-core/blob/master/spec/install.md) - -## 配置 V2Ray Server -### Server A -示例配置保存于 [vpoint_socks_vmess.json](https://github.com/v2ray/v2ray-core/blob/master/release/config/vpoint_socks_vmess.json) 文件中,格式如下: -```javascript -{ - "port": 1080, // 监听端口 - "log" : { - "access": "" // 访问记录,目前只在服务器端有效,这里留空 - }, - "inbound": { - "protocol": "socks", // 传入数据所用协议 - "settings": { - "auth": "noauth", // 认证方式,暂时只支持匿名 - "udp": false, // 如果要使用 UDP 转发,请改成 true - "ip": "127.0.0.1" // 如果 Server A 不是运行在本地,请标明 Server A 的实际 IP 地址,否则 UDP 转发将无法进行。 - } - }, - "outbound": { - "protocol": "vmess", // 中继协议,暂时只有这个 - "settings": { - "vnext": [ - { - "address": "127.0.0.1", // Server B 的 IP 地址,IPv4 或 IPv6,不支持域名 - "port": 27183, // Server B 的监听端口,请更换成其它的值 - "users": [ - // 用户 ID,必须包含在 Server B 的配置文件中。此 ID 将被用于通信的认证,请自行更换随机的 ID,可以使用 https://www.uuidgenerator.net/ 来生成新的 ID。 - {"id": "ad937d9d-6e23-4a5a-ba23-bce5092a7c51"} - ], - "network": "tcp" // 如果要使用 UDP 转发,请改成 "tcp,udp" - } - ] - } - } -} -``` - -### Server B -示例配置保存于 [vpoint_vmess_freedom.json](https://github.com/v2ray/v2ray-core/blob/master/release/config/vpoint_vmess_freedom.json) 文件中,格式如下: -```javascript -{ - "port": 27183, // 监听端口,必须和 Server A 中指定的一致 - "log" : { - "access": "access.log" // 访问记录 - }, - "inbound": { - "protocol": "vmess", // 中继协议,不用改 - "settings": { - "clients": [ - // 认可的用户 ID,必须包含 Server A 中的用户 ID - {"id": "ad937d9d-6e23-4a5a-ba23-bce5092a7c51"} - ], - "udp": false // 如果要使用 UDP 转发,请改成 true - } - }, - "outbound": { - "protocol": "freedom", // 出口协议,不用改 - "settings": {} // 暂无配置 - } -} -``` - -### 其它 -* V2Ray 的用户验证基于时间,请确保 A 和 B 所在机器的系统时间误差在一分钟以内。 -* json 配置文件实际上不支持注释(即“//”之后的部分,在使用时请务必删去)。 - -## 运行 - -Server A - -./server --config="vpoint_socks_vmess.json 的绝对路径" - -Server B - -./server --config="vpoint_vmess_freedom.json 的绝对路径" - -## 测试服务器可用性 - -curl -v --socks5-hostname 127.0.0.1:1080 https://www.google.com/ - -## 调试 - -使用过程中遇到任何问题,请参考[错误信息](https://github.com/V2Ray/v2ray-core/blob/master/spec/errors.md)。 diff --git a/spec/install.md b/spec/install.md deleted file mode 100644 index a7bf88c60..000000000 --- a/spec/install.md +++ /dev/null @@ -1,47 +0,0 @@ -# V2Ray 安装方式 - -## 预编译程序 -发布于 [Release](https://github.com/v2ray/v2ray-core/releases) 中,每周更新,[更新周期见此](https://github.com/V2Ray/v2ray-core/blob/master/spec/roadmap.md)。 - -其中: -* v2ray-linux-32.zip: 适用于 32 位 Linux,各种发行版均可。 -* v2ray-linux-64.zip: 适用于 64 位 Linux,各种发行版均可。 -* v2ray-linux-arm.zip: 适用于 ARMv6 及之后平台的 Linux,如 Raspberry Pi。 -* v2ray-linux-arm64.zip: 适用于 ARMv8 及之后平台的 Linux。 -* v2ray-linux-macos.zip: 适用于 Mac OS X 10.7 以及之后版本。 -* v2ray-windows-32.zip: 适用于 32 位 Windows,Vista 及之后版本。 -* v2ray-windows-64.zip: 适用于 64 位 Windows,Vista 及之后版本。 - -## 编译源文件 - -大概流程,请根据实际情况修改 - -1. 安装 Git: sudo apt-get install git -y -2. 安装 golang: - 1. 下载安装文件: - 1. 64位:curl -o go_latest.tar.gz https://storage.googleapis.com/golang/go1.5.1.linux-amd64.tar.gz - 2. 32位:curl -o go_latest.tar.gz https://storage.googleapis.com/golang/go1.5.1.linux-386.tar.gz - 2. sudo tar -C /usr/local -xzf go_latest.tar.gz - 3. export PATH=$PATH:/usr/local/go/bin - 4. export GOPATH=$HOME/work -3. 下载 V2Ray 源文件:go get -u github.com/v2ray/v2ray-core -4. 生成编译脚本:go install github.com/v2ray/v2ray-core/tools/build -5. 编译 V2Ray:$GOPATH/bin/build -6. V2Ray 程序及配置文件会被放在 $GOPATH/bin/v2ray-XXX 文件夹下(XXX 视平台不同而不同) - -### Arch Linux -1. 安装 Git: sudo pacman -S git -2. 安装 golang:sudo pacman -S go - 1. export GOPATH=$HOME/work -3. go get -u github.com/v2ray/v2ray-core -4. go install github.com/v2ray/v2ray-core/tools/build -5. $GOPATH/bin/build - -### Debian / Ubuntu -bash <(curl -s https://raw.githubusercontent.com/v2ray/v2ray-core/master/release/install.sh) - -此脚本会自动安装 git 和 golan 1.5 (如果系统上没有的话,并且需要 root 权限),然后把 v2ray 编译到 $GOPATH/bin/v2ray,新装的 golang 会把 GOPATH 设定到 /v2ray。 - - -## 配置和运行 -[链接](https://github.com/V2Ray/v2ray-core/blob/master/spec/guide.md) diff --git a/spec/issue.md b/spec/issue.md deleted file mode 100644 index f5de0d1b3..000000000 --- a/spec/issue.md +++ /dev/null @@ -1,45 +0,0 @@ -# Issue 指引 - -在新建 Issue 之前请先阅读下面的内容,以提高 Issue 的质量和效率。 - -## 开放分类 -在创建 Issue 的时候可标记为以下分类: - -### Bug -代码的质量问题,可以是功能性(Functionality),稳定性(Reliability)或者性能(Performance)。在 Bug 的内容中请注明下列内容以方便重现: - -* 操作系统:如 Windows 10,Ubuntu 14.04 等,64 位 / 32 位 -* V2Ray 版本:版本号或源码同步日期 -* Golang 版本:如果有的话 -* 问题描述:任何的错误信息,不正常的行为等 -* 日志文件:如果有的话 - -如对软件使用有任何问题也请发到这个类别。 - -请在一个 Issue 中只描述一个问题,如果你遇到多个问题,请分别创建不同的 Issue,以方便讨论和解决。如果合在一起发,将有很高的机率被标记为 Chat 而降低解决问题的优先级。 - -### Chat -聊天或其它相关性不强的内容。标记为 Chat 的 Issue 将在最后回复 7 天后关闭。 - -### Enhancemet -有关新特性的建议,如果是针对现有代码的修改,请详细描述您的建议。 - -## 以下分类仅供管理员使用 -### Announcement -新版本发布、最新动态等公告内容,将于发布之后的 7 日内关闭。。 - -### Duplicate -此 Issue 与之前的某一个 Issue 重复。 - -### Help Wanted -标记为 Help Wanted 的 Issue 接受 Pull Request,一般为新特性的实现,如果您对其中某一个感兴趣,欢迎供献代码。 - -### Invalid -无法重现的 Bug 或没有意义的 Issue。 - -### vLog -用于记录一些 V2Ray 的实现细节,想法等,将于发布之后的 30 日内关闭。 - -### Won't fix -此 Issue 是一个合理的问题,但不影响软件的正常使用,故不修复。 - diff --git a/spec/roadmap.md b/spec/roadmap.md deleted file mode 100644 index bfe160b81..000000000 --- a/spec/roadmap.md +++ /dev/null @@ -1,8 +0,0 @@ -# V2Ray 开发计划 - -## 版本号 -V2Ray 的版本号形如 X.Y.Z,其中 X 表示 Milestone,Y 表示 Release,如 2.3 表示第二个 Milestone 的第三个 Release;Z 仅作为修复紧急 Bug 之后的发布使用,一般不出现。 - -## 周期 -V2Ray 将在每周一发布一个 [Release](https://github.com/v2ray/v2ray-core/releases),每 12 周左右完成一个 Milestone。 - diff --git a/spec/status.md b/spec/status.md deleted file mode 100644 index 515891bd0..000000000 --- a/spec/status.md +++ /dev/null @@ -1,53 +0,0 @@ -# 当前状态 - -**注释** -* S:接近完美 -* A:稳定可用 -* B:默认开启,还在测试期,可能有各种问题 -* C:需要手动开启 -* D:正在调试期,暂不可用 -* E:计划中,欢迎 Pull Request - -**概况** - -| 功能 | 状态 | 备注 | -| --------- | ---- | ---- | -| 多用户支持 | B | | -| 多服务器支持 | B | | -| 负载均衡 | E | | -| 多种加密方式 | E | 暂时只支持 AES-128 | -| 选择性路由 | E | | -| 自定义 DNS 解析 | E | | - -**平台支持** - -| 平台 | 状态 | 备注 | -| --------- | ---- | ---- | -| golang 编译 | A | | -| Windows | B | | -| Mac OS | B | | -| Ubuntu | B | 尚不支持 apt-get 安装 | -| Redhat | B | 尚不支持 yum 安装 | -| OpenWRT | E | | - -**Socks 5 协议** - -| 功能 | 状态 | 备注 | -| --------- | ---- | ---- | -| TCP 连接 | A | | -| UDP 连接 | C | [Issue #3](https://github.com/v2ray/v2ray-core/issues/3) | -| FTP 支持 | E | [Issue #2](https://github.com/v2ray/v2ray-core/issues/2) | - -**[VMess 协议](https://github.com/V2Ray/v2ray-core/blob/master/spec/vmess.md)** - -| 功能 | 状态 | 备注 | -| --------- | ---- | ---- | -| 单一连接 | A | | -| 连接复用 | E | | - -**ShadowSocks 协议** - -| 功能 | 状态 | 备注 | -| --------- | ---- | ---- | -| 单一连接 | E | | - diff --git a/spec/v2ray.png b/spec/v2ray.png deleted file mode 100644 index 83b03c67af133792b6db055f5a6e262d537dbf84..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9959 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 diff --git a/spec/v2ray_design.png b/spec/v2ray_design.png deleted file mode 100644 index d2845c1786320ac93216d5e6ef1e47108094b0ac..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20352 zcmagG1yo$kvIaU>un^qc9RdV*5AHCyySux)LxQ`zy95vJ8r+@W{wDd)x#ynu?pklw zteP#gtGc_YyT9(L+2QiC;s|g!Z~y=RLE@{3A^-pm1OUK{VLpJauv?@s0|0X35+Z`i zZY!q?wUXdq0KYBLn%N#RTC=E-eImS|A}i{EfTpYhsep|=v zuwD;059{WT`Vwv(a6o|~V^&4AgR@Ny0Pqn5;MdCx{D%NOzyo^pu<8CGfIujKUJZ!h zFY)UIU#fRqpVm-T#~@Tlh|fS9BT;}7=?Q`}fQ-Ttkk&IplQ)Ya`oR1Z19Bvc3^svW zDut}q#u`m?Rrc74o7eL2{PASW*1DVP#JjxflAvoSt+DHQNJn74Qq$QM{o=fNlJDRH zBj`Xh&j4BZjj59EB<280iq#8nf1xj<+=@Y*Q+hRYgpI) z`&+lw?Zn2?6fDbGYwGiIVzdQACFu zs2iFl@QY_n|?PeIIihvm6|fNb?)Iji!^OD+uVJty2N4j3Kx#gpDVP2BUBR} zqxYYalw@m_xOB>r8ZYJsT)f^eciNVCDaLdR zOtYMuR)kPQ=1}Cb-v#-R!&~yUSnt*&VjZJ7zIJ+A_lt}(Iua+*Xs^&Hml+_LBCD^* z?w>ZyMnnc#zn^78^!~e0FvPyHsk(?$+oSAsb&V&k8>R|fZ|3>M6V3IbN%O3WT8nrp zyVbH$9*AC%Z?g4@bjR$CZKHz|K%;UOuOhqM7gp}mEy}E9@PS6fd@)%cM*3bMe5H0= zjWwHk{xu`V6kD)#>$Ne&)2o9v&Bo&c?pm|;-?FQB%Y=?0JULi2${K|$?t>4aIv2h- z5}vNTG{S;LU9l@Ga$TQ=S`}%Y5pit;2W1<7iTgIl{ioE!n-NOO4(JVE)p)BzFm{CF zO1>-(_d&GUlb3mJ2ugHi(T8?5hGu(BWDP(!p#OkCwwtO(OIko|IPjp>QdGILG$sRD zuk!A9G38vZDG}7v?a`LWJi;Z5aC|EExjTFdw|pnQ4ZTb|m(k@y+@h;6^2_^@Qa-6I z?pxzYaBdc*9dviZz#E;-&$l?HG_wK!drd152I?8_5pO>~`=RCfrqunOQ_YvsvdY_P zZFPfx%Z6WP^SS?dj9ZQK{hA!)x&k%e4rzMU&*Rzhxi*qP+p_fp5FsWc)QX}wU%D3h z0+H%~ol zso-D0c3vmnCubS>=GE}XutJ$w-1IaKmq8|`TJ zF3EQ$$3tkv92s%+C1?1!qp>f$0jqC?KY2OEe2-|7)hd>|{l)P^>wDxlurAB9yY$}o z{xw!($h7^43xzSms_+_rrg-tDqhHjR7V|3pYgP=E;N zuLreDq80B^x}k^I*w~U^X)S|qff`S;IwkBiZreFZM9xH#T zv4z-#-u56<_cUZKo>HEX)O4sT8Ekd>)XS`z4xF(5KpSr$v1ASH8ZG=)iV#7`4 z-Rf04X<1!6eBH*ETQHq66WZl3 zXwxZp${os{_O@7T|CwU_I0w^BW4}rFqu%{V33r{}$VU6J9SSrxz^Do^n4-#>+M8U> zZOgY>uxd8gxR!m+^@;RtdZx8d>u|HD&!CHdQkB3EaDzE2&6Z-QHaxlWQI`+ci#(|e z!ZIhFTujfW9Qyi!pK4C+3WYo>IQuHovc!Z$YjI=dCquQP=uF;f$q_;cc4*?@?MUjo zd2_S-RQ+!%?sy4p#SdgzRJX2s^D^4lw9WScc{(EyYPk-{hdN`AolW}hYSiJwaj>(MA|nZ^Pd6+?bon2_D+(aJd`Q$0 zs#-B1-i%!|>>uB5_}1NhMbWyFS8n^Ob?TISWD}-X&N%OyoqPn`e@~PX=aq^?By-1L zz4muCm#3Ro-QdT0m(^T*yDd~%tV#EClPn`i56^8xoftrt|1!*sb|EqBqnKzi8P|Mp zPSw#7_f|3BQFv(APdteViW8^<2k(Ug&7$IcK_me7H3v_U^h;%BzpK)fpCUTlf`*NK zT9t7Mg0L88uwdiNAJ2~uR?=-6dFjl)^8)b;8ti!(J36 zDB97gzGsEX_bH@NiFS-DhX0*Vgym+lul`C!n{2A8IhnM#+O>DbCL2_ONHG&=@xh0= z3o7gpjXU*uO6=!xKj-KTejzcCWVc~aYraA$n`tu60(J{?tK8F=G(QuKRVV_~ssC}; za}4}jD7R6+pZugrO?kSU5Hsz4Z zxYWK#8=WRMHW!U0Kc)VxR=F<|>jE+Y+m(hQH!~$f+bYK)WR-!JDxM#iCD^ts5N}Od z_z&JnFR|gIg)&Q1XINaQaxro_O100P)Tl*@Tt*;AB?#k~BQ6k_clyP3YSpFKJuu98 z_bvPU4W9<(DbQ6r-u6`$z9V*8cFWc2j=lzZr9PRsQM#|@d>L0fg4_QPJC|Q{pLR3m zLDAKRESobj==38sLJwAvGM%bE`C4cjH*PWNU8;>zy}tL70O>Esc_h%mEpbz;8S5Qf}WnP*rAaaAiU)tLRQ-PtZov5oB;BJXSpr5X0pf zva;rWA756&AZAyf~JejA^ANlZe4`_%SsW< zd#+J@>qE*wISBqL2l>s0)n-$GrR>?6q=IN=I|K2TXoKuW+U z0-sw`{1#pl|CIA3i20f$Ri;-F2xpME=teJOXE@4@HW7}UIO})yz{VFuo{S7#V56^< zN|F+zmm4*FDm$39viYn4<^D7(B|xMj=N8Q?iIQ zvkVKpfv+silV|~j^z&DvA6WK@$SMWHa8_4vWziR^SyJ8y zV`(Oy*pdV-atWHna7(DyzSf`+9g3T{&CPzzbojAK;ETBt^dpWJ`s4M9w>a3>*@4t~ zW@^XAlab~@EX8OUNE*eyhw~fW0#e`_;(((fPX4=nun=)Dj%G2YC-#QM#Jd+PXf*(W z*cp=)QC~k2U~i3+ocnB20KPOYWAk7@?3(Ji$VJ^VN4Dzfts5?&i@TZ z1+IfkAVfBkLJqmJZ(fI~!k5Fcda@RYBJ4H}1ARPs0wXbPs}UedNJ5oFZ&%O#Q*Qkl z?)w(DWY84O5{;U1gpPlZSJ)WRdEx~;3nxv={vf&%^7iP%ewA zrdH$cb*W z?R0!f_EvdN=Y`XfGp*qE1u55L4X4Tioh*QxEHiG)WVKu;DQb{lOlmg0$= zk~vo_m#1ALi#;wv0^*SDh?$N}{REPAd~a43K;Z!Si93h&L;teRMUirsDOmJ5DIuoM z=U@542bia`i5)e+KYkJloeN2;l4i>qQekBal>H5_ps)KqDTDEIlFaukz0v}RA=wfE zssf!2fWFw|V9-adt>W|KZfHsJer1v_&Ez2}r7ADMp+cY1u2_z(C0 z@_%PM={Z3X@(p1-Qi}0uAyI!Zv@A_+Sb=DVfMk_cjd}>yLUkiCwW7s^h5^$0RP)V@ zq}X;QI`PTyHe_ldrW`H>>ALdJN-D(Mscj`~kDp3VNogBzM+{U>D$FQ!!$E8%gWUUX zjFKP8=JE+E_q6XHnpkJ~AE?*{6J?s*#7oSwOLHue%oj^WZka<*Iy&UV_belot8g{f z^eYLisvpN8lX#H71unxbFs{%h8o^QWDjzShXIwN9=H3^+RC2ki zr0nYrB<=F)IUH7Uk8?%>I)T9tt*jL%-`~UuqK|NLdYjlPO#wSu;o>r%t6}&ZM?M69 zBCc58%&q=G30%*vlP+y7db|8~w3K(7EuzEmShSERGr}DeoqoyGU)Hvw{p;pKX%Tc? zEG?rtA_z_VT`qvbh3eH(jr3QoC}IV%qonA^C)TFUIT{!4g%XYHwzEjI3K2(GdphJn zMqdA<$ww-B&L!f#g37)^8k})oIl?weWaer6IFM(e8c^7@!dz%!;9u=&Ed1#IbzCik z{Db4`>${ZMp`MU4sql=%{;6^Lu0n*DF_L-pstAUWAk7a<&fXuIdtGenv11qBp;4?q zvYsf~_1om^5%0~BFq=+ zL=Y&cEObyB#hA>r%Kbr9rbd|oyb;Y{cBC&T$yT0N`K^*mWA0Sa74gjRt567~>P=5O zbngU4)+bPdA0UI!u>dldihwb)JggCksb!)_@1zS-VU%;GGO%9IP_2rHW3prrIg(Ak z{$g8TemkS?1+HbezAE1-Xyas0EwmqvuCDLPCk(Io!aSE`A2&c_Zy?z%EnKcK1+dD1 z8aLjG<#yD~J6pIzkjCmbT@VvN*(ga78}5p!$SmK0Q4}nG%Kk?K&B_Q~3vot`Eeb68 zwLGLs5HfnXEFUEaOIv^}U%5o#JM1 zS|^Z1&}yl?(ta?{M`1Qx#yy>?0a{(Ly#i7y&Xu}s=^Q)k#(&5%>s)v4C;Dv}+Rw_x zoLWg)c_FX>&bg2+7-oh#r`(Ou5OZMR$Iji-#+t&LPA)tf_Kva1E2- zBK zQacvYHl$VD2H{)}- zlpR}5t7g#-3sro=D2uTW5-d{wjBXstds($`J)zq!te-2Z?fFlU}4}Y;*J!b-~P@Avl2jQ|^F4(``Q<5rNi?CTv zyl4E`xcsvl_|g}>RwBGv0&xH7lIbO2RVsWXshwzBv2m|rcYIXxay#5 z{gWG1p~5a7K}{CDR|WC27U`|PZU1N7KK0&>E`v2bvJezn12we)82cQvLhJ})0pxwsj= zt)cSx6Sy z8&q54<+-DJRy!-$G}Tr!QXyYV?S8(Ej=E6k+|Qkyz{z;QT_38wGR5<}bH25Vbg@q7 zy9Y{}itEAB>2>p+=lC+2lIMSjYVy{;jT+#o8p32Gs)59)xhgL82%6HAr8HR+@sah= zWn{2jNOZa3e@;C9qNy4g^QHp^E~N)%XuabqMleTEK3jjy7fWry@;G}vn#QZES`F|g zukk~8Dmsk9Jyb|WhIDrLyhCMyp|X8^c!Byy#bW`R{Dkqc5)VL=qi=#q5?R;O^E)N zh;18Yg;d}*UpH<2aL2+9qf+!nEDoSYSjT6^EE?*>0<=vj;Z*ltOS@~JGzCaoQ!ak3=H5loUR9p0U!bffGUszs!9O)|2_ox{ki*>{DKzfH7gfXRV(KgJZ7?*G%V>?>zXu@_dcn=_s$nvhSvARXYZ!gyV-h1_i^5P zpV#*du0Q)QegYWh&he zFQrOng$XFL-hpr4U;=u`K!A<9fX4l4Epcsa(FS@GBlqfCi=F;dH{;(@_0T`xu5oH+ zX4xbTM%7-0hqKxKM0;+inmDMniKt!Yr1ze`_jwjmONAe|MR>`Wa%cY$GjFZB@VER( zuO4XhwuHPEsA92A9b?k8z}g=+xNKut>&=sf6wGcuX69F%l^2s4wfw8AXZ24Wo@bZ( z?No&Gb4#`ntoVxu8HAdeXMu)8(z@Qp(pURKx;#$93@5EVi!W+9*_PV#jq8{tW0LI?ljYeX8&(7M#L^+6AAo}YPtHQ!g! zIyB_%L0qt=v;9H?YQxc0+C6fPYxF9jJu*d5`&JdilX|Nh|GwHOdZaIW8?5ZlDO*Euc;j4;V~P8jJQY76q%=JU6w{{R1`-~Q)sE6w zG4j80C8QpJVPXJ%CT@L9dhQr?Z9LYRVQ)JTJNc6`t?g@T`F3tae7X>4Pu!Y5fc@#f zNR3{rmEP|@8|O-&-G_||3WK9$zg`|vYql>m?}H=zC#T165nkjx_d$%B)*3VfsI)i~ z+U^BIFFcJ&^HVU_5U6*yO*T4Z59ylA#`rn~RUOo8?wu?wry?MTVEp4ivET#m_!CX! zQeITvI+78HO_uxAyIDuG-V>6sk9bKwT6^KXAAiFVeo&Nt5V0i#7;s=@^|-(XLZ|3 zGjw&>!&x;BuD2AU4%nTRLOc`+_zBp!j5b1gF-mNHXe#|Ru@Gh zYJJ_yRngh%YojP%)xp)225!a$&BzG$4ZrZ;!AT@niQC1k;&5Zzt%u4;$U`L8@QDhF z(Cc!u?m@05KB{mhhhk#{nF9`7nT2vG*lEvazCge zAR;w2r8tk(bOUFD$j{->8iDgg>o<$nX5PU%YO5FL0q3Om(nfZ2V=&CQd04{^0FUPau2MQI5Zv18E@|H zoQ_Hx$1K?~QDj{t zZm6lT+ww1{)Oo+NL;lgmklyXV!jhP&tmfgtEUiP_@JlHK+ranB=Qs|H5`jYmeLoVG=>=qgs-#&bLxw0nQbzdqeKt$Vf> zQ(lxVwq`Ezt-aaURH?{eQ1mb?FtM6t_dZh!3y1e*cSR!oRVHoIJb%{A1J$xx+n7kx zeA87?v3sltwXmNS@}zBZ?F|GDKLs^i5UsJ*oa?ryZ1`%ck6e*gpO|Lqr|Lh*NlB@j zJo)%^sWju&58tHHs{O$}Q_*R}zoR<|30Eu3&6+C2#i^V>sM_2c=lC4l_ludopL$qF za{qxqFRm`jf#~f}DXX4-Jt#l{Q$615p0ZycsPq?XiTfuL-{psX+8gOg3tv&vtCW%6 z^+X^<`~*iQ078m6v#~gF?=3Cgh#x!qXT(aY_eSD8I!!m;-~XaOZiLSFGtbkie}LM5 zfEMTo1q4F=i~Jj){Y7d2f@-jIAiVZ(@&`DAaKT@48;Z}ZW=;i{|M{sR<^rh^L)lJ* zIgBlUDGt(LrbP5JM?k01=UAeEJ5331QSNjVI*waiE4~;I*7(0v|8M;G7fJpD5G&ph zDvCR2I~ISsm#Y8(K5F!)ntHEzK31qM}|9$-D3Yi3o-aizS z`qT5@$A7MX@`3!w|Dh5I04YE6|2It_14{u&{h?$M;B@~`(1ZWi#sAj+zf1L>lGw0w z=Hv^P2KaV!-j}&x>Ph^Lefd=`{6-8a8@e>d@b5fJs_WG=h|^5YGwbIBwCDR?aLw2+ z1KsD+^(u@F^|7giOLF4O*XkRf0Q`c?F7!~ycVnd&+}CTd80v>10Z&gC&(*p^8}4`Y z-jH(J&16fRW4-ni*T(wL&|!X12`d8f>O(`8n#i@Sj-uG^2FJ)ecb3UCpQLd=J#=5- z2XPH&3sz-sO#cvqQ!h?IKV>9Dq^qfC;qiir2Yc&U=(OG|4;T@?xM?tEQQvq8f-!4X zbEzl1H#Vc7?Rn~!!I;3q`Qh`hU0`x|=zVMTa@ls*e<+qg=Y22n;#9Abf#+V9TcphI=kq}!aI`Q@WAE8^PM>Gg z-UPG6@2G?HYR2Tbw*Xkqggu4a<@k!|Tq1h?kUJ#A*Ho@)WTagE-uE4x9^^bHCQ}q;xMljoFYS^_YNSGrI zG^w;ExH?A#N!@^x5Z>MQOF@2!wR+In7tO$s`DAIkSaY>Z{p@rZR^~xd&#zjg9JsbF z?6QKl=rdl;cHj7Ed~~%UTxN^)owUaRji(2PyW!Jnsq;=9o41u=x=SzrhsCC%Tgmk7 z>{u0mS+6e?sCR+doZ0ggEN;F-5PL$SHg$MsYofb8^eQos%@XS#N8cU!-SPDu&QE2X zLwJ0GlX7yr{DJ<$vLz`QHNDwE%kyhTR-Z#`oz=NFhbsq5b?3(_4lK-*ZP04rjRnjy z0JVl-B5d!mMNQ{=DMZ=mQ+ZnKB%_sGtl6`@uT5L_)$f%kF!dm5hJ(#n&tF%rgNL2x zbsclj%^r@Iw)uFe!P08DFf}%UnFAc2A4mP)+&G4Qsn0Yq>~~Qv0yhtuxj(D~9@X*` ziRM#1?<~BPAToOUZMdJwoxjGtR}ZiSkpMqrFfsVQ3-c`C*8mX0$P>MBa)RyC+>_s! zlHTkocwdRn=jCxU0%v_(q2<-0-xzk%g5 z+HOmI@rAo>z9{s`#=W}j!?6`MN3Vc0&H2pz1B9A3Fs_)+jiDM-zk{e=PDbAKwHRCJ z0ec<8ty>+>x?~wU0{)%&!6?{}O`lH))~hGlR$vCtUfLH@(LYo^89pu+2O=EI#33U9n*hSxB%71iOt+3VHN3$f`B)uE;B#}ra)QDCtau$>I>4kl_ot)9$kuJ%8l z=&Ryd%DuMLT8nypmRhv02;^NdWwDhcVKM%!dG8_YS-A32N`G3pdX~s{&q{pp-lW22?{j4Ax0>ArV$&BQ zpBQ|j`<4!O@E?zUS#5Kp-4YE}w(I*u%Jvn~-YvP&IMVMmytXc;kBDrjDCLS$_1}5-5Iyy%gYy(x2Eh;o0ymYVnZu z99+U!pbZV4*848C<}y54Ej#AY$<%xXCx0b@|EHTa=)G`fb`F1yJHZ zH28Jp6H$8(?k2|(<7ttFhdTM{5+n_ip3-_yCANpO3cu-OLiwE)H-gJ~a0vRV*V$Js zT0b#236sRnDu#(C@~-&#X_15n->p5Ad@h}C}tJt-&7YhI%HD9R%L-yv= z<@b~7hd;c*AYv@bsSL#B{N6W4?35G2%MUSvetDj}C_e%P*24H~?z=j)@g{JCh zd06;$UsVA!@rdHde7S&B&4N=;`B6*9l!+*hA%y{eoq_#&zBxZOANjDgc z1>=71$Len6%}1sel_6T4z8Ei7V`IaN@awzJeF@=zC_zb0)f>#e*~! zU=%iBAXGR#sP67o{Pppfef7iCm_dG@I%0{VQQHc(NmmeK13Eug(U<=CBc_lg;KpdS zl))<|H68%Q+U9_7G*gCjbRcv-F3a^YT0skbd4z1iH?d`A`25y56HG)wm#+eKE?d0A zl7ZnmCuaFggQTOepUw3QcI;Gz<(~NX71(ta5la3fUZ9VN-pviw6H$#iA~AiQ{0;>i zbIA7!fQ&KKU42(YWC+aHWl{n^+=d`9ZcTx4)GK59DW-~H*nn8y0-;ofs@T@c&k%F6 z#;Z+_D_UDk+BXJ_lhIeL5|pMEb{~_^cEw%928i|#M$vChLe#|la`>U8?%HGE0uAW3 zpDA=E?_kOt+vDuu9Jj`}#1O)&Yp+`3kOhPTDoE~L3}wb^yV&)e`g^btPWT>E|@)? zGp(sXsP#3pljT$VN!bsMWTKp0^2X$b!6NHzl+<|<6d7x+8WJl~L73(9!Ko6QeL=y>H%bd6>M-yUUlqTI92g8D@DdV=L@0SdNYR=yWfarbtDVeWt+wl9r>6xB z+>U<2E6c4Hovjz^7v2XM7a8pSknoJNGIu*k5r!G;ek0w{LNzvVMbErJ`(ta~Z)ey)ccAi9AV)3wG#_4mybw>S zYdfxy65{bVkyRGhM?SudG|QGG_^d_kd%t)stWNoQ={v_ z#q6Wr0!kPFDmyT{BJ!6rV=V3JgjPpB*hkDCN-(4r#2W+?qWB<3zf5Qs zw0_0Kc3vUrb=bJFWBnZ|TT>b_^<_a{agS$s=bOJ;)qINy!Q3$uq5Fdm|MR)px>D6Z z*d<@fBo)WB89#2c-ggS}ZM6bC;!OA^ZQ>O=n@ev}%L4G|(L+Fv5FOQ_YvDDN}WFNl#d~a#_bpiJAmGna{leCCUJK zK&ptp7ay-flo)!hu7E&n?T0uxo>tpqZ#q=ysHFlF)}WkQnJNKv6k;N1znC*T?6a-55KuIU#t+K`<{kB*$lK02z@-2N zF~=3APNUuR7;j1<8PF0hdD{Y@ItoV(F1a-xW*C58*Co+ghfr*^fBS|hIvl4v3w^f~ zpYeUL*D?lLSggjy2=b&NjeD^-=a>iYWBzyOi`My&)@q_&hfZYsvJ2{1!MV|4Xhi4R z_zL?Gz7wE<@&<(0&>?~$5n274w{iefDJ)&sbxFF2)Q8+w@956s`)VX|N(3ruV@B6A zdc|)A`!3clg!VcIGA~Oi`p{U1SG~eB)u!86CyH3B& zoYP=aNX)wUOAu3b4l8#;yl-A@f4`3`YLa~7_#Q&#zh07>hTtcP&?kV9@|3d<8My=V z5#XsC0EM(f8Wjph-NX%ut>0^83X$aLu`vtSTLbW@o&nerntk7oh48u~^|r><_O8g? z;+Y#m7p&VCl_&-t!mxhZ#V@5SGEQL+Y^Sw3s}l4*lYUKHQNbMIaAv50Z`3}U-;+i@ zmqth_70kpBOF?W?wG9Xs5kO|0Hd1%+lVwH|r7cB92vES5aw`ib0ONHFPJ+)93) z!i)TQ&Zim9DrCC*^Ao2mi-%kYJT94CNEygT&qZXW4n-aQYwM?EOBBoaZy69cy|)10VMY#(`gcnsb@0N^yV>s z(?2Ce$|z@~TbMan>g^sDQF$0noRu!c}A0`E-;>ZMHL5WZy(D;$j7Zr$9tl>=M zUnVL7aAYT2)E5cw7C#fr?i zD<`JM-)MA3$jgEL^AZ#OB_r7`)_AM=atAoFijO7*@CtlQTz37! zy(=cC;mmgKCW9C|!!#X6Rb3P-`74uaZo0xIm$#lAR85RJv`)v@?!a%_xu4fdek|iQ zDhnvXUad>sQi{NPeY3A119C5FZB&RZl4AsDVz5ZXt@En{3rU99FjPfu36jp=4Z%!oLK; z_&~)>U*7atekp4NzuDm!6zR}n z)H3X%p@dynN+bB#hEu+@gx93v2J0sT;6v#ZQbVe4uW<-1*-V-U!6P@TdAGDIG3%<(|wnJux|PUUN_kOOrX{7W86oZCtOon3lV069O?1NNil$^ zEstXo29z|m;24NRgI1`PBx0I;(ihki@j=cD7j{8$4VqN?hE-^?@o-JSP49uw?jX~6 zh`cbW*#cEgu{x<$@sz+QYGdc3Kuv+#Y@p=HiD3PsIw>!Z*X&w5h?_^I0k61RJ{xr2wob8N@yS(cSf#q*aUPLkCgkW9j~0I4 z)6I(+tV}LcZ$wf51(}1)+(_pu_rk5AY4K}Ds@$y0ZpTTh!A%DN+RyY0-T6dX8Y*xa#LqL)~bo)}#(3^9|Ji z(WI$EGDn-^_>C>z7wTp3GR6Vl8d+}@)49mU+5=4FezOUSFHUe)Ez)1=Q)n8B*R}5; z5^GfEWB$zj(Ye9$8DBD01g$XG8A=KB_?7r_@}beU3`LWj0|s1gJYet3)L{aka%Y5d zJ?ja`a}3?tRY(Ikj`)<~&m170{ED%&)@ccf4FS?4Gb|!95sQrtrzDje?CWon`{=_& zFg9LX2$}|37rO)ib(D%BuaXYro_vGPkh$NeCA%kYJqdc$I^|*7Gvj8qnjc)&k^y)8p`2c_*l{8acYP>tce+eE>$|mRQG#(1NK8C7kA`cS zy}xdZuNWe5h4{#b@u5lU`)RaCy9c+$lwi)&^)CJ_V>p^<-HxYM;t&U7aNfGuecYd>U5oQ z{^@Q(0L1yj!FuIIdHwuUL4NWLeRM`*iiS$8L>JhBA~Lk<196Y)xX;Dq)@zju3Gf$2)kGQ=3`GI}a8Rb5h$qW{qPE(@%xiZuKxG)1yB;D&1Z)-0LO z8qP)c`#c3HvOf_Dwh}6IAVAX}v$kdlYdyr2caeI~9>i8K z(~agRP_IU)$A+3jMA3@_9eKZiTzi+yQDCoiAR@VjczV=j89N+{9*CygGTDnPfonO; zE2>WXLm0h+UV8(H>Rq&i;C@QI5togF}w2E*Y zj-|8H4Ihg2gFHN6H>G9F^lt}jZTykKU16DT@H)tDb1q~Ha1-fH6nu60LgV|=MO3$P z@UnL`dSQ8cVS9Ujhz$N&=HP0B_`vhQ^9#qXSyP6zgUTbVEB8*a)g?G^9)JHoZURYg&%&dwf2GYY?IG(&QI~vao&d zM5$P-&X0AJ-X6l*33Uk{gG7*sR+TKNrU1>T$ti5#O>P2`ay`B{IZsy!bz-htf}}Mx zWQ7#;qg@ex_v`hw6bM!7K zyhUE3b?9#Kf_zzG^qI=b%ipB9Q0o~vfi{C=lB%1;gzLZv6rs_ z$$#LKh6V`jffSR0*0M7*GYNWyg@xpQE0&T1NlQ;p|F?Di+z&@EH#h%d&VM+hq@?~x z_{;HE2pRD2eUK1}^*^9h@-IiqA2I)zn%CH0TuY(=za5UZh!D)4-b%-&G`w(?a@JP8 z$kIT%aXbz(6hyszBLXnQ%Vy`#6gw8)pRzF@&br^bK#^Kdy21Z9NXvRP1WHQz6Z;0` zEB^0zZ(dnCZ4eb8EANa38@e{xQ`~?N+hil|lD8Ffbth0Wz>oi{sKLGT|HS$KC*uF_Bu!AzdVss#SsDTq zr)QGqpb?m%?E|MBL7>c)0Q>tM20)-OC^O(c&OWc~S8M#*V7+%c7;B|Ub}90| zK+JBnn^=B6_1ve)R<}HJhJ}g@5QTB4o}CoiJHKe#6Zz%Csak)ZoOGX^G~`RDem7}d zE6q=+eK+Zc1cw0?8Am=k#y@1VnJ5Meqe1>g`@-AOKRGEk)@^9ts^u|8!a78sCZlntwf-)g{pD9T8RDDMuNT>AlAr+5UJ@gTw_aaR?pfjVORsH$k3wWE4z_A-*muCRwrc&!$2!e@Z-@@YaVI*XD7P z3bx!q34u&YsyV<>bU;_ZbTRSWH`a0gz%=XsDcs7#q0rv2Fxg`)L-xUFtVQWwW2aYFtXk6GPxsqG5 zKqn;Snb$(tv?3G6X2Z$WR#`)>@=b=7w2`yzD2FaJrr;;z>O)S{$k*My2n^SS&?2#x>$LFQ11r$SjrsK4`T35o% zN}l?cea{fEgS$>SEs$Uq-VjslH|fe3MnTF4j9K^OSl^%bk5gw}*Mz)B7ZZIT!*#O~ z;ak$APv77!d=G{%Nl~_zeG&W}ovWm|h|{|9-}tMs_GEsy76M>H=3BEH0nT&AE=-r# zT237d!e{$wq?5sn95sB12;y?*?e~+0G zFM$7}snAAwSTM`k@M9NPH5h5JIqeYjm53Njv5AQ&X<3C20X39<2MFAYMSPN4w_6&~ zwQ~Jfb{z|ZQ){q5N*^GQM(iRCa6@3YY&GKGa0e2nLi-C^O?F*qti59P{0Iy12$!Ls{xMFe@SOMlczhJ?i2bxuC)V#N&iJECM$kQk) zTzelFN=ipWHq1|CRsESdx6Ot*ku`-5ox0C<8r#!sSsNN>*62!gyUFlEjjvnAl}aHA z$NV=EdeYq^??juc26ovJ8`ntUR#ybiRJn?SF=^o|CNBzV>l%zjmv-E4e~rvd@7$?g zvmOGJ`Z4wG!Cl$oxJQn2B3o^iKk|qlU<0sG)w|E!=Vm0HSo=;OWg1Vn8vQ(%8`z@@ zJ#vg9$jBcYxOkLGc%qC?)*GwT>*%7h*9M!v9HFIEHuXE+;4X}X%7uH+@U(VDR6#H$ za*fv0V`Xx!tLrYuGsGs~g2168J0-pOe}sGh#WLJ=Oda~c(n++WJ?-r0Gdv- z{=`-U>ria6LG_|Gi*!kogq;d~lR22%p63K!*e7S)Z835OyH;&dA!Qso7{jZDtPS|8 zWH2uS$ox^A#Wt&iij5A(pQ6Hvn!1p^H8p^>&$@3A6%tdD^D;zVDj@~mG%;FzluF51 z0DF}fsrVW=6kF}!W}Z%@cCdJb&ObJe7IblmhtX@7q}NjU3)i+|y`yi~QDr~&nZGFT z&YCvAmNTM`QQritaI)j)C7e1;cqOULW=Eq3l4;@r?Rj@jtQHOE1uWfMaO8D6+DMm?Uu<&5GE{bZPpaut`8Io-HL~s1yU!jwlfP z#lDl%B>l+kVMWXQ*yqnyJGa4u-hRqH0!HFs6h<}bU9}WX&FKZNPS)$jP{ou_VustJ zch`i#|y6|X}rBOPCdZnwcY6ea4xCpuYM|nSsSH!+xouX|YmG{U z_$>iY^0~KH)JyNhNYd2j6acm|k~YU&xI+nqCqwE78d;bP4}QrgTBfR-AU`Px=Je^-xQ>M*V2 zf%Ujg_2>acfK|U?G|)v##dgV&+@p-KuWoonaB5t360Rur9O|Ui-I0*B4>$^V4Vf8w zl4K334}MM2F<%b%SJFmQJo&2d^;X^;#KD6__scw%NLEs(I)Ja;qb1ieL)aLzfHw4c zimd+Xg}PB48**hpt-Zj$axXGk+9lN2$j6R3n;dBd9Y7)C-~9rFVFDnL>e_eB)p2!I z$P^$Xav~pYGZHq!>R;d4pXlH1al`W|54WrT4IReG+=Ka-h0l~NPb}UQrjbzg{9s9KK@j-mt}QuZ zcvBhEaN$=DbATPZE8>1Y^NDn3@6L~h<*XnE|M|pVPVYMw!ui49DNqeIKcUSd70S

kDOd;Vh?4)q@4eDC>(*-7e10NuQB^~DF&i@Y^1E_JKZVHfr{gZo3sbbqOl zKoFZH&4n#+_KV#eI?yUIS#y#dB7xDef+)$40w7|4DiK8Zci8bU%Qy);nzq{l) zN>w$!5h_P@y6?wmVRn+#dp=}%w{cW`xf;?zomI7-`wG7$$Jc~TtHC$jRzNK>M