From 43b39cd62927ced82703239dbb487432bf6356f2 Mon Sep 17 00:00:00 2001 From: liulihong Date: Tue, 9 May 2023 18:11:31 +0800 Subject: [PATCH 1/3] =?UTF-8?q?=E6=8F=90=E4=BA=A4libpcap=E4=B8=89=E6=96=B9?= =?UTF-8?q?=E5=BA=93?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: liulihong --- thirdparty/libpcap/HPKBUILD | 82 ++++++++++++++++++ thirdparty/libpcap/README.OpenSource | 11 +++ thirdparty/libpcap/README_zh.md | 13 +++ thirdparty/libpcap/SHA512SUM | 1 + thirdparty/libpcap/docs/hap_integrate.md | 69 +++++++++++++++ .../libpcap/docs/pic/libpcap_install_dir.png | Bin 0 -> 9240 bytes thirdparty/libpcap/docs/pic/libpcap_test.png | Bin 0 -> 9952 bytes thirdparty/libpcap/docs/pic/libpcap_usage.png | Bin 0 -> 26791 bytes 8 files changed, 176 insertions(+) create mode 100644 thirdparty/libpcap/HPKBUILD create mode 100644 thirdparty/libpcap/README.OpenSource create mode 100644 thirdparty/libpcap/README_zh.md create mode 100644 thirdparty/libpcap/SHA512SUM create mode 100644 thirdparty/libpcap/docs/hap_integrate.md create mode 100644 thirdparty/libpcap/docs/pic/libpcap_install_dir.png create mode 100644 thirdparty/libpcap/docs/pic/libpcap_test.png create mode 100644 thirdparty/libpcap/docs/pic/libpcap_usage.png diff --git a/thirdparty/libpcap/HPKBUILD b/thirdparty/libpcap/HPKBUILD new file mode 100644 index 00000000..d0593485 --- /dev/null +++ b/thirdparty/libpcap/HPKBUILD @@ -0,0 +1,82 @@ +# Contributor: liulihong +# Maintainer: liulihong + +pkgname=libpcap +pkgver=libpcap-1.10.3 +pkgrel=0 +pkgdesc="" +url="" +archs=("armeabi-v7a" "arm64-v8a") +license=("BSD") +depends=() +makedepends=() +install= +source="https://github.com/the-tcpdump-group/$pkgname/archive/refs/tags/$pkgver.tar.gz" +builddir=$pkgname-$pkgver +packagename=$builddir.tar.gz +buildtools="configure" + +source envset.sh +host= +prepare() { + mkdir -p $builddir/$ARCH-build + if [ $ARCH == "armeabi-v7a" ] + then + setarm32ENV + host=arm-linux + fi + if [ $ARCH == "arm64-v8a" ] + then + setarm64ENV + host=aarch64-linux + fi + bison --version + if [ "$?" != "0" ];then + echo "please sudo apt-get install bison" + exit 1 + fi + + flex --version + if [ "$?" != "0" ];then + echo "please sudo apt-get install flex" + exit 1 + fi + cd $builddir + cd $OLDPWD +} + +build() { + + cd $builddir/$ARCH-build + ../configure "$@" --host=$host > `pwd`/build.log 2>&1 + make -j4 >> `pwd`/build.log 2>&1 + ret=$? + cd $OLDPWD + return $ret +} + +package() { + cd $builddir/$ARCH-build + make install >> `pwd`/build.log 2>&1 + cd $OLDPWD + if [ $ARCH == "armeabi-v7a" ] + then + unsetarm32ENV + fi + if [ $ARCH == "arm64-v8a" ] + then + unsetarm64ENV + fi + unset host +} + +check() { + cd $builddir/$ARCH-build + make testprogs >> `pwd`/build.log 2>&1 + cd $OLDPWD + echo "The test must be on an OpenHarmony device!" +} + +cleanbuild(){ + rm -rf ${PWD}/$builddir #${PWD}/packagename +} diff --git a/thirdparty/libpcap/README.OpenSource b/thirdparty/libpcap/README.OpenSource new file mode 100644 index 00000000..dcf3791e --- /dev/null +++ b/thirdparty/libpcap/README.OpenSource @@ -0,0 +1,11 @@ +[ + { + "Name": "libpcap", + "License": "BSD", + "License File": "notes.txt", + "Version Number": "libpcap-1.10.3", + "Owner": "llh_01129@163.com", + "Upstream URL": "https://github.com/the-tcpdump-group/libpcap/archive/refs/tags/libpcap-1.10.3.tar.gz", + "Description": "This directory contains source code for libpcap, a system-independent interface for user-level packet capture. libpcap provides a portable framework for low-level network monitoring." + } +] diff --git a/thirdparty/libpcap/README_zh.md b/thirdparty/libpcap/README_zh.md new file mode 100644 index 00000000..bf022601 --- /dev/null +++ b/thirdparty/libpcap/README_zh.md @@ -0,0 +1,13 @@ +# libpcap三方库说明 +## 功能简介 +libpcap是unix/linux平台下的网络数据包捕获函数包,大多数网络监控软件都以它为基础。 + +## 使用约束 +- IDE版本:DevEco Studio 3.1 Beta2 +- SDK版本:ohos_sdk_public 3.2.11.9 (API Version 9 Release) +- 三方库版本:libpcap-1.10.3 +- 当前适配的功能:支持网络数据包捕获 +- [BSD](https://github.com/the-tcpdump-group/libpcap/blob/master/LICENSE) + +## 集成方式 ++ [应用hap包集成](docs/hap_integrate.md) diff --git a/thirdparty/libpcap/SHA512SUM b/thirdparty/libpcap/SHA512SUM new file mode 100644 index 00000000..60b6a958 --- /dev/null +++ b/thirdparty/libpcap/SHA512SUM @@ -0,0 +1 @@ +3e872265d4d3d85637fa00c5851269f3b03035df7a93b9168bb49b7f3965765e000bac8e65b4c69f42c6090fd2cb7bde0304d37efb453cd71d214088dd37cd6b libpcap-libpcap-1.10.3.tar.gz diff --git a/thirdparty/libpcap/docs/hap_integrate.md b/thirdparty/libpcap/docs/hap_integrate.md new file mode 100644 index 00000000..5031fe3a --- /dev/null +++ b/thirdparty/libpcap/docs/hap_integrate.md @@ -0,0 +1,69 @@ +# libpcap集成到应用hap +本库是在RK3568开发板上基于OpenHarmony3.2 Release版本的镜像验证的,如果是从未使用过RK3568,可以先查看[润和RK3568开发板标准系统快速上手](https://gitee.com/openharmony-sig/knowledge_demo_temp/tree/master/docs/rk3568_helloworld)。 +## 开发环境 +- ubuntu20.04 +- [OpenHarmony3.2Release镜像](https://gitee.com/link?target=https%3A%2F%2Frepo.huaweicloud.com%2Fopenharmony%2Fos%2F3.2-Release%2Fdayu200_standard_arm32.tar.gz) +- [ohos_sdk_public 3.2.11.9 (API Version 9 Release)](https://gitee.com/link?target=https%3A%2F%2Frepo.huaweicloud.com%2Fopenharmony%2Fos%2F3.2-Release%2Fohos-sdk-windows_linux-public.tar.gz) +- [DevEco Studio 3.1 Beta2](https://gitee.com/link?target=https%3A%2F%2Fcontentcenter-vali-drcn.dbankcdn.cn%2Fpvt_2%2FDeveloperAlliance_package_901_9%2Ff3%2Fv3%2FuJyuq3syQ2ak4hE1QZmAug%2Fdevecostudio-windows-3.1.0.400.zip%3FHW-CC-KV%3DV1%26HW-CC-Date%3D20230408T013335Z%26HW-CC-Expire%3D315360000%26HW-CC-Sign%3D96262721EDC9B34E6F62E66884AB7AE2A94C2A7B8C28D6F7FC891F46EB211A70) +- [准备三方库构建环境](../../../tools/README.md#编译环境准备) +- [准备三方库测试环境](../../../tools/README.md#ci环境准备) +## 编译三方库 +- 下载本仓库 + ``` + git clone https://gitee.com/openharmony-sig/tpc_c_cplusplus.git --depth=1 + ``` +- 三方库目录结构 + ``` + tpc_c_cplusplus/thirdparty/libpcap #三方库libpcap的目录结构如下 + ├── docs #三方库相关文档的文件夹 + ├── HPKBUILD #构建脚本 + ├── SHA512SUM #三方库校验文件 + ├── README.OpenSource #说明三方库源码的下载地址,版本,license等信息 + ├── README_zh.md + ``` + +- 将libpcap拷贝至tools/main目录下 + ``` + cd tpc_c_cplusplus + cp thirdparty/libpcap tools/main -rf + ``` +- 在tools目录下编译三方库 + 编译环境的搭建参考[准备三方库构建环境](../../../tools/README.md#编译环境准备) + ``` + cd tools + ./build.sh libpcap + ``` +- 三方库头文件及生成的库 + 在tools目录下会生成usr目录,该目录下存在已编译完成的32位和64位三方库 + + ``` + libpcap/arm64-v8a libpcap/armeabi-v7a + ``` + +- [测试三方库](#测试三方库) + +## 应用中使用三方库 + +- 在IDE的cpp目录下新增thirdparty目录,将编译生成的库拷贝到该目录下,如下图所示 + ![thirdparty_install_dir](pic/libpcap_install_dir.png) +- 在最外层(cpp目录下)CMakeLists.txt中添加如下语句 + ``` + #将三方库加入工程中 + target_link_libraries(entry PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/thirdparty/libpcap/${OHOS_ARCH}/lib/libpcap.a) + + #将三方库的头文件加入工程中 + target_include_directories(entry PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/thirdparty/libpcap/${OHOS_ARCH}/include) + ``` + ![tinyxpath_usage](pic/libpcap_usage.png) +## 测试三方库 +三方库的测试使用原库自带的测试用例来做测试,[准备三方库测试环境](../../../tools/README.md#ci环境准备) + +进入到构建目录,再去testprogs目录执行./capturetest进行抓包测试(arm64-v8a-build为构建64位的目录,armeabi-v7a-build为构建32位的目录,下图是设备联网后应用请求网络数据的抓包测试截图) + + ![tinyxpath_test](pic/libpcap_test.png) + +## 参考资料 +- [润和RK3568开发板标准系统快速上手](https://gitee.com/openharmony-sig/knowledge_demo_temp/tree/master/docs/rk3568_helloworld) +- [OpenHarmony三方库地址](https://gitee.com/openharmony-tpc) +- [OpenHarmony知识体系](https://gitee.com/openharmony-sig/knowledge) +- [通过DevEco Studio开发一个NAPI工程](https://gitee.com/openharmony-sig/knowledge_demo_temp/blob/master/docs/napi_study/docs/hello_napi.md) diff --git a/thirdparty/libpcap/docs/pic/libpcap_install_dir.png b/thirdparty/libpcap/docs/pic/libpcap_install_dir.png new file mode 100644 index 0000000000000000000000000000000000000000..226559cf34a432574f721332a493eb535238ddea GIT binary patch literal 9240 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 a5_i7&hHdf-3n>1OL;FAY6X(4@fAZg6l5~0i literal 0 HcmV?d00001 diff --git a/thirdparty/libpcap/docs/pic/libpcap_usage.png b/thirdparty/libpcap/docs/pic/libpcap_usage.png new file mode 100644 index 0000000000000000000000000000000000000000..ae647d89969d64a129092be0a5917754d855954d GIT binary patch literal 26791 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�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 Date: Tue, 9 May 2023 19:04:38 +0800 Subject: [PATCH 2/3] =?UTF-8?q?=E4=BF=AE=E6=94=B9libpcap=E7=BC=96=E8=AF=91?= =?UTF-8?q?=E8=84=9A=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: liulihong --- thirdparty/libpcap/HPKBUILD | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/thirdparty/libpcap/HPKBUILD b/thirdparty/libpcap/HPKBUILD index d0593485..05e9a42c 100644 --- a/thirdparty/libpcap/HPKBUILD +++ b/thirdparty/libpcap/HPKBUILD @@ -30,13 +30,13 @@ prepare() { setarm64ENV host=aarch64-linux fi - bison --version + bison --version >> /dev/null if [ "$?" != "0" ];then echo "please sudo apt-get install bison" exit 1 fi - flex --version + flex --version >> /dev/null if [ "$?" != "0" ];then echo "please sudo apt-get install flex" exit 1 -- Gitee From f6b336c19728d9e7f20b569f66287aab5f906ff3 Mon Sep 17 00:00:00 2001 From: liulihong Date: Tue, 9 May 2023 19:09:57 +0800 Subject: [PATCH 3/3] =?UTF-8?q?=E6=8F=90=E4=BA=A4openssl=E5=BA=93?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: liulihong --- thirdparty/openssl/HPKBUILD | 79 ++++++++++++++++++ thirdparty/openssl/README.OpenSource | 11 +++ thirdparty/openssl/README_zh.md | 12 +++ thirdparty/openssl/SHA512SUM | 1 + thirdparty/openssl/docs/hap_integrate.md | 74 ++++++++++++++++ .../openssl/docs/pic/openssl_install_dir.png | Bin 0 -> 12080 bytes thirdparty/openssl/docs/pic/openssl_test.png | Bin 0 -> 13590 bytes thirdparty/openssl/docs/pic/openssl_usage.png | Bin 0 -> 34958 bytes 8 files changed, 177 insertions(+) create mode 100644 thirdparty/openssl/HPKBUILD create mode 100644 thirdparty/openssl/README.OpenSource create mode 100644 thirdparty/openssl/README_zh.md create mode 100644 thirdparty/openssl/SHA512SUM create mode 100644 thirdparty/openssl/docs/hap_integrate.md create mode 100644 thirdparty/openssl/docs/pic/openssl_install_dir.png create mode 100644 thirdparty/openssl/docs/pic/openssl_test.png create mode 100644 thirdparty/openssl/docs/pic/openssl_usage.png diff --git a/thirdparty/openssl/HPKBUILD b/thirdparty/openssl/HPKBUILD new file mode 100644 index 00000000..5877f7bf --- /dev/null +++ b/thirdparty/openssl/HPKBUILD @@ -0,0 +1,79 @@ +# Contributor: Jeff Han +# Maintainer: Jeff Han +pkgname=openssl +pkgver=OpenSSL_1_1_1t +pkgrel=0 +pkgdesc="" +url="" +archs=("armeabi-v7a" "arm64-v8a") +license="Apache License 2.0" +depends=() +makedepends=() +install= +source="https://github.com/openssl/$pkgname/archive/refs/tags/$pkgver.zip" + +autounpack=true +downloadpackage=true +buildtools="configure" + +builddir=$pkgname-${pkgver} +packagename=$builddir.zip + +source envset.sh + +host= +prepare() { + mkdir -p $builddir/$ARCH-build + if [ $ARCH == "armeabi-v7a" ] + then + setarm32ENV + host=linux-generic32 + fi + if [ $ARCH == "arm64-v8a" ] + then + setarm64ENV + host=linux-aarch64 + fi +} + +#参数1 +build() { + cd $builddir/$ARCH-build + ../Configure "$@" $host > `pwd`/build.log 2>&1 + make -j4 >> `pwd`/build.log 2>&1 + ret=$? + cd $OLDPWD + return $ret +} + +package() { + cd $builddir/$ARCH-build + make install >> `pwd`/build.log 2>&1 + cd $OLDPWD +} + +check() { + cd $builddir/$ARCH-build + make depend >> `pwd`/build.log 2>&1 + cd $OLDPWD + if [ $ARCH == "armeabi-v7a" ] + then + unsetarm32ENV + fi + if [ $ARCH == "arm64-v8a" ] + then + unsetarm64ENV + fi + unset host + echo "The test must be on an OpenHarmony device!" + # real test CMD + # 将编译目录加到 LD_LIBRARY_PATH 环境变量 + # make test + # 32 个用例错误判定为误报, 不同系统错误描述不同(实际为正常) + # 8 个 dlopen 用例错误, 进程退出时 signal 11. 可能是资源释放问题待 GDB 就位后定位 +} + +# 清理环境 +cleanbuild(){ + rm -rf ${PWD}/$builddir #${PWD}/$packagename +} diff --git a/thirdparty/openssl/README.OpenSource b/thirdparty/openssl/README.OpenSource new file mode 100644 index 00000000..b7e453c8 --- /dev/null +++ b/thirdparty/openssl/README.OpenSource @@ -0,0 +1,11 @@ +[ + { + "Name": "openssl", + "License": "Apache License 2.0", + "License File": "notes.txt", + "Version Number": "OpenSSL_1_1_1t", + "Owner": "llh_01129@163.com", + "Upstream URL": "https://github.com/openssl/openssl/archive/refs/tags/OpenSSL_1_1_1t.zip", + "Description": "OpenSSL is a robust, commercial-grade, full-featured Open Source Toolkit for the Transport Layer Security (TLS) protocol formerly known as the Secure Sockets Layer (SSL) protocol." + } +] diff --git a/thirdparty/openssl/README_zh.md b/thirdparty/openssl/README_zh.md new file mode 100644 index 00000000..c10a4aa9 --- /dev/null +++ b/thirdparty/openssl/README_zh.md @@ -0,0 +1,12 @@ +# openssl三方库说明 +## 功能简介 +OpenSSL是一个强大的、商业级的、功能齐全的用于传输层安全(TLS)协议的开源工具包,以前称为安全套接字层(SSL)协议,应用程序可以使用这个包来进行安全通信,避免窃听,同时确认另一端连接者的身份。 +## 使用约束 +- IDE版本:DevEco Studio 3.1 Beta2 +- SDK版本:ohos_sdk_public 3.2.11.9 (API Version 9 Release) +- 三方库版本:OpenSSL_1_1_1t +- 当前适配的功能:支持openssl加密传输功能 +- [Apache License 2.0](https://github.com/openssl/openssl) + +## 集成方式 ++ [应用hap包集成](docs/hap_integrate.md) diff --git a/thirdparty/openssl/SHA512SUM b/thirdparty/openssl/SHA512SUM new file mode 100644 index 00000000..ac9d1283 --- /dev/null +++ b/thirdparty/openssl/SHA512SUM @@ -0,0 +1 @@ +ae7481ddf8df80b033810d92dac28a70342cc283ab715079239928ed3cb333300f10724317f759ca54a109a3faeeca168474353bee7586ec3f6baafd80fda3b1 openssl-OpenSSL_1_1_1t.zip \ No newline at end of file diff --git a/thirdparty/openssl/docs/hap_integrate.md b/thirdparty/openssl/docs/hap_integrate.md new file mode 100644 index 00000000..959e847d --- /dev/null +++ b/thirdparty/openssl/docs/hap_integrate.md @@ -0,0 +1,74 @@ +# openssl集成到应用hap +本库是在RK3568开发板上基于OpenHarmony3.2 Release版本的镜像验证的,如果是从未使用过RK3568,可以先查看[润和RK3568开发板标准系统快速上手](https://gitee.com/openharmony-sig/knowledge_demo_temp/tree/master/docs/rk3568_helloworld)。 +## 开发环境 +- ubuntu20.04 +- [OpenHarmony3.2Release镜像](https://gitee.com/link?target=https%3A%2F%2Frepo.huaweicloud.com%2Fopenharmony%2Fos%2F3.2-Release%2Fdayu200_standard_arm32.tar.gz) +- [ohos_sdk_public 3.2.11.9 (API Version 9 Release)](https://gitee.com/link?target=https%3A%2F%2Frepo.huaweicloud.com%2Fopenharmony%2Fos%2F3.2-Release%2Fohos-sdk-windows_linux-public.tar.gz) +- [DevEco Studio 3.1 Beta2](https://gitee.com/link?target=https%3A%2F%2Fcontentcenter-vali-drcn.dbankcdn.cn%2Fpvt_2%2FDeveloperAlliance_package_901_9%2Ff3%2Fv3%2FuJyuq3syQ2ak4hE1QZmAug%2Fdevecostudio-windows-3.1.0.400.zip%3FHW-CC-KV%3DV1%26HW-CC-Date%3D20230408T013335Z%26HW-CC-Expire%3D315360000%26HW-CC-Sign%3D96262721EDC9B34E6F62E66884AB7AE2A94C2A7B8C28D6F7FC891F46EB211A70) +- [准备三方库构建环境](../../../tools/README.md#编译环境准备) +- [准备三方库测试环境](../../../tools/README.md#ci环境准备) +## 编译三方库 +- 下载本仓库 + ``` + git clone https://gitee.com/openharmony-sig/tpc_c_cplusplus.git --depth=1 + ``` +- 三方库目录结构 + ``` + tpc_c_cplusplus/thirdparty/openssl #三方库openssl的目录结构如下 + ├── docs #三方库相关文档的文件夹 + ├── HPKBUILD #构建脚本 + ├── SHA512SUM #三方库校验文件 + ├── README.OpenSource #说明三方库源码的下载地址,版本,license等信息 + ├── README_zh.md + ``` + +- 将openssl拷贝至tools/main目录下 + ``` + cd tpc_c_cplusplus + cp thirdparty/openssl tools/main -rf + ``` +- 在tools目录下编译三方库 + 编译环境的搭建参考[准备三方库构建环境](../../../tools/README.md#编译环境准备) + ``` + cd tools + ./build.sh openssl + ``` +- 三方库头文件及生成的库 + 在tools目录下会生成usr目录,该目录下存在已编译完成的32位和64位三方库 + + ``` + openssl/arm64-v8a openssl/armeabi-v7a + ``` + +- [测试三方库](#测试三方库) + +## 应用中使用三方库 + +- 在IDE的cpp目录下新增thirdparty目录,将编译生成的库拷贝到该目录下,如下图所示 + ![thirdparty_install_dir](pic/openssl_install_dir.png) +- 在最外层(cpp目录下)CMakeLists.txt中添加如下语句 + ``` + #将三方库加入工程中 + target_link_libraries(entry PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/thirdparty/openssl-${OHOS_ARCH}-install/lib/libssl.a) + target_link_libraries(entry PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/thirdparty/openssl/${OHOS_ARCH}/lib/libcrypto.a) + + #将三方库的头文件加入工程中 + target_include_directories(entry PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/thirdparty/openssl-${OHOS_ARCH}-install/include) + ``` + ![tinyxpath_usage](pic/openssl_usage.png) +## 测试三方库 +三方库的测试使用原库自带的测试用例来做测试,[准备三方库测试环境](../../../tools/README.md#ci环境准备) + +进入到构建目录执行make test 运行测试用例(arm64-v8a-build为构建64位的目录,armeabi-v7a-build为构建32位的目录) + +![tinyxpath_test](pic/openssl_test.png) + +32个用例是错误判定为误判,不同系统错误描述不同,实际为正常 + +8个dlopen用例错误,进程退出是signal11,可能是资源释放问题已经提单待回复 + +## 参考资料 +- [润和RK3568开发板标准系统快速上手](https://gitee.com/openharmony-sig/knowledge_demo_temp/tree/master/docs/rk3568_helloworld) +- [OpenHarmony三方库地址](https://gitee.com/openharmony-tpc) +- [OpenHarmony知识体系](https://gitee.com/openharmony-sig/knowledge) +- [通过DevEco Studio开发一个NAPI工程](https://gitee.com/openharmony-sig/knowledge_demo_temp/blob/master/docs/napi_study/docs/hello_napi.md) diff --git a/thirdparty/openssl/docs/pic/openssl_install_dir.png b/thirdparty/openssl/docs/pic/openssl_install_dir.png new file mode 100644 index 0000000000000000000000000000000000000000..01fd959bc3f28999898733938d47a2b72291d4f3 GIT binary patch literal 12080 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 Gfd2tNe&AaG literal 0 HcmV?d00001 diff --git a/thirdparty/openssl/docs/pic/openssl_test.png b/thirdparty/openssl/docs/pic/openssl_test.png new file mode 100644 index 0000000000000000000000000000000000000000..43bff0f7a84e07bc35fa7fc957e384f4bb5f4638 GIT binary patch literal 13590 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 literal 0 HcmV?d00001 diff --git a/thirdparty/openssl/docs/pic/openssl_usage.png b/thirdparty/openssl/docs/pic/openssl_usage.png new file mode 100644 index 0000000000000000000000000000000000000000..4e398b55e34d707a4d2184db564f2c9c26bc269f GIT binary patch literal 34958 zcmeFZcTiK^+b*o4(xf-((mP0#7Kj2$@6t;I6i}o|3kXD{_a*|;K}4kYP$U|f6zNDO zB=p`(fFvjSJiq7nzVCVGoB8JZ&Y3wg=MOds*;$*ceXo06*L_`gqV#pu$Viw-u3Wi7 zrlGECc;yN~4*u~v(M|kO`~DgM{?}DcLp9|q6$32m_$SvLALu-|a-}+f^wRbQ{yDL` zy1D0-E9C9Jf39}BeSUi7N+g$t>VwB%n{CXx5uG{WlvD|#3|!Um^-{~_)9oG|EnbD zd^3#iuScPYI$`jX-+#lu@Z*y*QseJao*L!vasN3vl(MEoA58uCd#4`r1Bm~A?@K}2 zoWD;|zDGx*_pjkIdqJ9D!RWV&E!5R!>1gQc{0G$l+G|6C+9-P0Pt`V^keo~3IG`@~!u{6c1!Du$5GSf_ z^CW+a8?d~e?@C7z(}2x06=CkEUzU!|-g@+)w`;oevGw=<1F-tsr8)l#fs=%ONKnuYpEhWc;jFw<%c*m(RL|^#QdocD$@nM`jbvvc z6#^oE$rM*hj{g8s#Z81DZ)*A8OcXp2F9!Kzu1dzl+?Ll5=1w?%`Vlsn?8La!wUY#T zd#_yaexUN2-y9rvow{aoND<4Duv%FtuQ(t<{%6+En+Fex^o)%YYemTA%$3UIiS!iO zXptq{Cddwy7<4Qn1gb+Bk!u8|r)cY#J$g3wo`I{efWgrb(%l$AQg?R{Ui*rL!tuR_ zr#F+%%-d&oM-ooyo~SvH*F-b9yQ4%LD!lD8d4;`^euo`wB7plA5-1(GkyfsCWHP1@ z+IDcW_{(_W;S5#jp0;|=$aV=!S7=z37b(tA|K0ZIR%mnvv*L$^#%Ps4VSxPrrq9t- zW{H>Pw%e|vjD4H&VQ9H5nn^5Fg)@j>U7k|`aZC_tE*EUeM+X3^@7faEb>*u#ZcnY-u9wP-St!{j`Re+ zh0g*oS&jk-qx$_)F|f8v*0URkxe|3Pki3bZvyJ<|A2|jjV&bpss+lw=+f#hYwcVrkNK>9SS$vJ>zSx^(xI59 zYjnP4Bt$crc^lvmQSdR}<$y-C-i?$+t6VWglF&DT2q=Thc#BCTR~ zo)X$}3Eb-L-9sX2@nbz1+WOl%?UGo=b%xu_FS_EZ7}vE36lJB4Q}_`HP^DiH zEHGAAq{F+hAS?60=!%!S4S$wwq8Pg#+^9`qYUEC6Dy7kOh6jI7WcSi{Re<2HwEiCV zCYBQ*`Pond7x}WE5@5rW06rozE2ImT>;Vc{KqbGMfU(odDxgO!y{}N>o@SjdpS$A<#73vJ{Qd0pmxq_1z@K>)V%q$pnyN9u zh?~*W2_vJWU?~r#mKf3`)2Rs0!`;wCt<#820^IuRLZ?~t*vqdW(91bDSzdJf+{ zCFdLWTe+&d?Fmx&h)HdC+uO^ud1?_w1;gmVjSLKj6?fm%r&&C0D!KuxW0RK zO!h^u>V+w5_vC@t?fG0L>Ou17p#2iMejU)T<450Pl8gD6lV6)c`fV4B1p%BmMFMEu z<%3X1KN6Wj{?4^rbfhPlm8;fY>5FrtsKHoT*=(E%EBa-sjcw>!4!lDhFIEH&!Pv{>)8 zjKQ?$dR}zPjr@?^=tJeKY)iz=^CuWqU1LI*9=YaN^u7ZGsiXm%YLkMsyvfp!WWdlu2Zx2mk}$Oi0gY ziu%-g9Rd{vFqi_bALK%KHfrxl1(v}NGu!fpzDSM3EH4;U#Q?{I1nocl{dhWyO~fS) z+3_>{ut#n8NX=@NT^QnzxpC|G@e8fCxC3j&+rpsX1tD8VOtJf7x~f6VkhhrEN#>uO z>GF7A7~uQ#Vh^e&%0+i=GkpQdMCod%ZoQ+|5jVSVXY`W1*b-`LN0+nW3n2C3K_#q! z&o1}tifVW{O1QfVVZzX?UnQ3|BSJF)XIL<2JWoupe=|iTA@z{0g@aHDbgwpUZ#K+c zPl;HZp4Q>8l)c)kUg&Ab7js# zxprG?NZ`hKK$bqrC<*kM2(uWI9#kEReT8AwY{v>k^c`oIJ!n76)PF4~YWreE_|-GN zlxFb;`LIX!0<}O47$Q(ZdU5v><;ZdHmQ#2ye)WmY9f-yYvvaesVrxuGJ?KvE=dj{_ z;NwXLR{t7Nh(g&&MEK^io787go&Jc%YRvqVUzBUE9fSK z0+|uFL-?vovTo}Sidd?Q!>8V@_8Q6nLJWaT)8mGG(Z^u&Q#rAEZ<5pKnz;yuOz7Az z6L9l85Q-PTW3E86Um1Trmeew~`EH8umK=SBx8<#0%Z5KGWD&P#_4&lVQlc5pUpy(2TPKs@c~(9iC?Fe1BpL;sSsz zW~6Sm2jo&(5=4Qgw%WgM=p&zDt$Gt&l(NbwvWLA$Pv6p}KYKr?*0lxsvBVDd0Dq0g5Z13w(z0c*1j_1ys$8{Wps(GeooOoH&+^rT0fN+&RLG3h1K z8DV?v(5p=bZEMBIt*XIyPPu)zE#V;yFnb5|>)7n+grlm#5-5ot4_QmZ%HEUZ!V@_< zPbeQ!V5CtusN=GJCo*lSt7sx`casl#I``TZr)AYN84-X}COkP3B@Y%N5*WX zYetPZo`ha$5QH^I`PyE8I2}T44W16v?NYB~eT~PeT3WJmEzWa>P71AKFr$kbD1N0S zUp>^x!LFIrMQBm|>ROLv>J$fHPcC(LY4vf=VnOHX<9ADsvMl@~)_b^qkWkR9pZ-SD zH80sW2TNkv*1Pi7Jq4PA>8=bQZ|*-omfb%yodpHFfY^QkDp5x7( z$Mw=3%fl76+Np#G?c06au+vGuMM93Cl_BGr`rZnDp0!-enbg&JHj(%zT!Tl zX&z$!bA?GT&oR1WU}rNmMGMR1mO$^O?eCXz76>-_(jF%1%LkM2MFRp@v` zbza(F!8U-F%cy11!K~KHS=L`F_s`Xed~bXTL?; zF!N4i^M}R4<;{9B#$b1z>f2}xMHOyCaJnr=&D)eU8Pz&Iif2=MOA!z!;opqvt+)I` z4fuRaX?h!u?m+q6mz-QX5Z?K|Bk>F(v$e6Rb%&#cd~R`YAB>g%GFo_;@_VsQP3wb6 z9veRxXpmicimuwYvsJ)jf@CZWw0sD5y{BnMrz?zotCcMmITNaM-W2Ajqr#RvQj?fv z9fJD4I~>%^@TID=bZ=~Q^~vkutBjCmqS>B}mZQkcq?ZEr`)F}5d4l3seny@pi4sD&aSG^xB z=ysU{WXA>JgsQDR>`cjTkrJ3Eo}BaS#?`-2?f1*iU?%L7FOY4rEG2s11_=bQ90w39 zx`b_`PtNq8^iELvjHd3V0}>B5*0d?9>7x6CC5&z;PHPEgv4ptY zAguQnX;W{yMO#lRQb-CtMfvuNKoW*&j@8NP5=5;Y#h)znA2Ij0nzh#_kv~1(G%sn3 z&ZyT5HgEd2HJcs$?Ml<-tX_KC5nZ!eYe#>trS^PtWUmzD96p*JpcwP(D9_rXrR#3J zMDW+B@Af{o;niORIl#h)x0(2OlZyQra#oH?vbCImR_tfnc!Ut0{AM=AZD`2kwhw@? zlL7I>EtN_3z13?nZ|iX?#Vh)+bWxw;_R83Bie|f`AwMKe$yC7j+*Tqm6$Fet*;IYM zE^pAVt$MKr;7x;c_8*YOl5KaB8vzZ*?4-yB7x0Az2w2i5eN^FyU1s(?jlTQ45*MZ@ zn9ZOqSM{9TBe0A@?vwwkFYGe3Jd77^WxEKO1X{DMMrDnX2e`Q1efMQ9dJwkk6k-H1 zP1YP1+}v&Yj41BA&Gz|0bXc6`3t&Z=(nHe*-;3V`mxE^uI^c6!+D{$%pSd4o8f?AC zX?1)9+T3FMSoPvLC0r#k_@rO<-BY5gK6j}SqC+GD4ATQP^u9F#sM@&57w44C?sakX zdu!EV)IqSCTJafkID=TCv%l0 zZsEq2*&_$8TiTvh^hGGyLd@eSNYx(O=5k1>ggGiV%O+6jG5Dz7gGP_Hfe21I?N_Rz zrwn(uX|yhS-5oEoW=svMO^J?m**6Rq^%L0=YF(6PO$gbw)uaF7l^osN{~fP%FHxLh zub|i}-i<5pa1=i{B}X0j!ffkAbSO-H?Q4$>6vYBrw{Cwb~flRi(j28v+hHUa31aTkf!NX zJqUzFhmI4IbJfZMduOYUB&)q7Xf_f1K<<92BMIZgP9OKq&%L!_xt`d3eK zx*L8!1S?b!aqM^fzG#w;&MVSk0$pFQNI!dYarqXBDcL+o3M_%Fa1BUb4Iu;dEsF~=Lj!Sj zm4+luH{G`FJH%-;E|@&HeNLL{-Bi9tH+t{KE0?1#nE`;tHj2%VDPLJ*R_#nrFUG^g zpIG<6Cpd4nz3fiwcDMb#0G)+K`a#>0a@w53G)sczgi2Txx`>Jv4RK`m3-44QP^W>> z72S#mtCB;c(;2*TXn&A)AV{Uk*&V}x%4Notx>G$yMQBINCzIE7d5XRGu$0BD)~9te9SJ> zdLky7f3m(_$##oG$Gi=_|K3}&*W{RnIJ)xo*HgsePFV9d6)v&IHUTk&?e*`KeuDQT zW?2H<4Fg`#NpgK>^d*=wZP^K=E|_mw%Q890aca5dZGson1w2 zE}zMgfRzYr`b5jd6)4Di7=qrBCT3;~Y65k_RC6rmgRoBV6pU*DuE^&>5wCo8sxHI# zF4JH(SXq=xNcS^;hkGM!Z>^&^j#tN&4t#~Tomo;Qr&fQpX_ym(MdH6ICcaUqS7P}Y zWhryF;@|Yv*7n%9A9hfCPNikqB9-rSYwPDO5&b_Dx0r*LTl3szYj>W(DmurTMaD)f zPf;bSa!r^QH2+=6J5b3altk_Owu}?|1wC5se8gmM7krP7ORkVo;9213W?@IbF{7f$ z0O&sW!;IMGP|E#_UPOtpqxkt6VSlUCG|nh5@EA)aDEt$8%w8(x(0U~1cyV-8=+YB> zW`V9aEqhH#6SMbj+tSO9u{I&XV9S;m%2@yEdP?Q|;`cGBfox#JuZ?Tm=Pp%W5PK)$ zcSBdrx=#`pfA96^gDFa6Nk{kM3KiX9>OQ~Tcv_RscxA4EBq@!gAvl)JiyEjr2g9?Pz9 z$nnTM{Ur3k7Z5n!I3x$4q}+u(LzbLvxNo4vZUYS?0w6OJ@kB`sNqcp>Kv(FonC}Ia z1zEDg)Vb8l*-RRO;ismS6f_uBj4Uin@X(7Ka`Qi|UrZt%eCY*Dl+2mmc>lXL0wSj( z9i%XUOHM^RQm$gk~sE_IDm-Tg5nd-=Zl zz2(1ob|rJ{rWOxyA;8}Kes;P|M8DWu)K_B6OY z)%_M3B3PNDxzzb>ttul%$Z36Qn*x-poOzR%3iQMHc?yaMuJcd)kZA3MMr5)3vqvf)Fk-%I5A01ax#GDs3{G<}A zKXw`H@R2?Wj#Jg3NBJ5=B6h60@6~FGZ6EWvM7%iAGLOi$TYm)lp)fH2etM^Czj)W< zi^JErKOs~Tr49acwzmQ1?0R*?Sfb29UbpD65A~L!8a&yMv>WdvPG3(@1q)6#ic#T) zmsOq>yj_xF|D<}Jw>Kt}i}v~!al-1sKR~&kms$7 z^45>T;y=9I<8R&`BBCMBlkC@_pvmC?YWUlDoBTas8L?p*@6#kxha2M z%ca4W&JJ&STpUZXOj&*z1Q!t^hL1P_sYfbj=gY7A%V!^EKko*~%!U?o*Lza2GDIZt zY-tLxert2CtSTO%{DoyS+V&Kjnlu@Tw&nunq2FN13+dHJ2Kx$sBujp|T9dTEKr@f0 zz?A!|kMXFFfU6XUe5oZaQ5WYbk@)dA;rh$IA(^(}dxIH_51Qz6!k%&%#+{^O?p~K+ zIDfM*id#|MKfZmw!&(tk&wj(Nli!W8dlEIsYs(-ueZjMW$s}DiX6rzAoT(B&y&PBT%mwLK9&(3yyv9rqb5Vi%Y6qwchj z&pvvWN9n7DINK%!K;_>=7X&{Y@VS39_7;2E?pD;EI{sdiN?patX1(E!n96pytKS`V#jVc`2YHiUZT8YNvTUH&DO-t13_zuxEPxt{;Ifa?d4dmUhqY*2ebzuN1~<|We()VBAO&fOZg5*Mm@}Y} zjYw*9K5+EXy$p?a9@O`R5(<2h9|>IzW$VuKw4?9Dp7hAq&{Ol4xDdI%FXSe9FpRr$ zQQ3Pame<^(^z>#w>8sPx%N>nb8!T&#b8c1L35%j%4X(H71AT6-xn=wCE5?dO#M=Gb zlcwY;1|Vu$U8Y87Rj-t>>uh!~-P$k2Qu&TF*;k_Hz$xHglHTiKps-RgY6vpBHv-Gr zB7L{3E^|{S*QkfA?7n*i`yz|xD=uA;ukA-mNmY!C*H{8tl`zd%w-g)d+|l@y6tVrY zaW&yciOC?{heTT$#e*KhC{MwES2ApyG^l<StIF612dx4WyHEXsN z0^nfEJr=oty@rPfhzy){q+V^6SGx)LgXCASv6t@;aJMwn|I~7cIF@$XvAAPc#F}cU ztj{E=-u74B?8ni%e_tOxLo<8fNaFzbN&NTup_htLCVYnfD7O2mb@EC7XuOep1>;fw zmTdu4<+>mL5qeQkPTrjV6gnvNR7+`OtiU-6z61NGk7%^8HY1NxVA{1)%lGaM*k_Gu zgJ<1aJO2KVlp#*ucB*j6wyGQ5r>iOkwEGa|c$wuFIA&zBySP2QvWYSuU^aSB3JH!| zyiw|f>~2L#m!mIzCOc)=NfYd`E@5f1f6s~ClOme0lu3L2UzqPZYP>yx=(dY{y*s;R z8y*>De5;A$a8DB~f9O_eRwS9*E&^(F7i#?^-c72v$dlmolIyQQE(5DaqHOl?y!s=_ zQI=Aiq~ic8_U!fa5yaWU>P{T3M0k4jMN5)uvLo24u})%^gsY!r@C-rnXE5SME*4L# z7FlFy@xMMEL9K2bNn?BFUaVF}!x(j4*4ppBMD*(jmjRT6-m_Dn87u?t2 zS3AAW>J$1EAs`;ZfQFp8E#l(7{XmeELQQZjwy6WoHYWRD7o>xrtjP35CJ#>ZAL$$) z2@Y`Y0@GH~!J|Og>8~`zhG2&=l$ozwz&-eAocc&;x3oQjtM{y|1G#4($c_%-%=UX6 zp0-$f%AncHnOIA!;<~@5p1OkOD@p_GFwXXUUDDCrL_L%lwG|ssu@k4Sb7`7*+8e`rXN}3Tzdr#NTJj_p#K3*<v1$x`=+nbK-4TCQsUJT=EIcG;SsKR#r#{Id?MjU%~b($^_{Hrp@;TrFt!jH2*z_*Lt#Qk10K4VeF>hf#KPxA(K9$f-- zecy9FFc4nM&?wnb16hU@L%CmJcaEJ+gU(OmR<&BO>yWlve?AjcUS!OZ!3tI3U)@}< zNo^?W^t#i`6LN;t)+!4|&r9?8_b00_DC2dok*^yc4K*l`?$ZbI2O%2M{jikQuQiiW zzf_R&E$xQ4`Xo!n7>vB4ODQFF8gxI2nZECRz~#y&P<1PT{^5T9(hzM$tPf`(>3l9$ z_+DucjJB*-57*{*X+D8_WR1wZxU@{#B9L+4AG^B5=T`peVJQt4b&h5O1v>@blU;h3 zF{f?kGSmHBKAiPp0u8Y&rCYYmKPD8Zx1Q?Xy$g&w1I)9YL7A(k`4T9+OTlKe=3ie* z4gUghe|{DMZDev{>}3Ud)E-rtm_+Ty z8nmb&#R3dIa(SRo8(($HLiqW-l9- z`!!9FRBPoK)xFD`*)+aMVlVaIU0=$nBLdDOs3v%4JoY3rLWnG)Is|#$=D&CJGTkgq zndqGPB^OuJLZD98XR0Ciud$UHs6y#UY_!t0So? z!7QCk^?g$oary0_V`8n*;>71l6-x`>#)=d9j!U+U(ydukqCOiv)KFbK)&n231C`C1 zYv*+pShh_`-1qkRZtYTt8VIpjboM(H0<9VcWq0AddeGya&$qOtM_R%ZX56wM>pilX zm-m)gU$X%q$Hx6-<{v?s4`RBV9~)>@L!OfRK1HXQ-VLf?HDAGgcpU$$`r+(_ZYVG? zK54N&xH+yqs7^NinBDT?!yxSFoWOyeLEJ0vn#QNP@kLl=A1<@4%zK^3|6%Hj(E2d>4*!)%Qb5GQTGEiH%j~5vDS6HQy$SU$HhkBgwz7>Ze`d zCCnNVRI3frv$#TLROu-uGk7IEmT`~R3PP8iUm3{{WX@S=;0q01KCu@`f*fn)4^R`uAKPl0?Y|y599|6yoaRTV$ZBE)pq!VZUTW$N-i#`S4 zx7+5HA7mXlkck&~$S@=!9};ev@`El=!X3bIMK-kA2Q{SU4uS=ei6E#@4J zu-{oukZsU9_27U@iqoxId;oaOo`*)|GeOuC^3DnMTxluVXqREJ76#baXq&8T3@d_d zBsa2;@4Tq^Ax1kczq#x-`cJV>NOVW^kXDorE^;0xn>Ki7dJ{NuLdIu^+iMzR7pR_I zrF%FPugOv7=z0Y9&qF)@21*MWV8JHhGcQirP5Sh}%_G|g*tK_|vMkQ(9n(lv4lK2} z5lwSe%_o!2i<|7a_0fA*sVe6p!aqKNY6B;;B2U$f%j(bW>I-2j$KA>-pkm}|8#H@| zc-c7elHIiP25TDOMQh&2vno5TEemFy+IU4J+H^d`ne%!E;HBV3jSi~{Pjqtu_f!QR zgL}`OrE=O-QnYYVCRIQDL}zG14W{3f+_IHFWtSD6w>U3@YQAD6YF^n=kLanxuS zJz6GQL_wdK@2(7x#ZZ(0-BI&j{9eH)!>pq}hS{<*fk0yO16fpl}coL^ALun%UzQ(s*lEkTj~X-20};*KK}4 zV{~u!cjwXjqTW4nq6cn0qzVXc%>h1z|?G?Rmk97Xejxi%^t>HIN!Swsof?qLW|H0CB(Fbb_>K(Xz)6KAXxo%(1-gur+AE+`YhVfqRYy?YL zG1Kb-2e<7zZM(C#DOmbs!`&v>3Wk@`+LPKo9_EN%yVh-Wnd=dxfD;fOoD>bSHl^mn z2^bijBKOMa05<3wDH93#cvsMyJ*ff6^E|@hPeIhHII4;6^F({5D}pmV1%X~{Da!i& z!mw|XL)dSzNgczGmQ>(1oU1WxdjF$gUGK%Hr`%#gEHaqs527oay&C^T!Yo%Fn7*D#mlk#tMa(qaoo21p66=Y-5!8-SG0=E>uW(WXmlhceo8PCalOjTLbliXKz@jM;dPN~UQmyklqmqEO z(lOtHRSpq?Dq`Q2LzsE7epyulGw?p;G~(L z^4tWlgI`=1X}6$Lj*|=FDOFkrgYxt{+EsKuyUhV>G$(1xXI1X1bSI3;l8?c>A7c)Q z_PuP?o@VozTm+F#G9+ZQ3p!|hZPXLq7HZGl_H+elblPx?DFlAjic@*u4;W}5_ON6X z4Endi(na%Aji$J|1xo3c8YnA+)16fx!62LMKeWk2cV&0}Kqy4^AuzlwO}MC%W`Zfd z8$VoOB3W>qu^t=`qd+j0hZVDxB5<@Vq~fX}86Tb5S6B5gH%a(DqA&qElEPS}q4Yhg zX?A6O*>62|g1E0v<#R4H;+l(qvlBEqF)oX1a0r=8MYduu0^l)x?8D-G0vhDuX9smw zNQ{QC>tt2f4(_Oa^byT(Y5{P6Wpnhz*FbO`q{2#>aOCi_ncyhuv^T7TpTtky@4gf; z5+EOhbWHhgHvbA;ou;+0a6@9cl!75Gz&wbq=1rJu!$Ax=E4sEv|TxpGKxX zjxJ~aGfPlN1mcKu6!po~7+3=nwsJlGXF~|j0ogSGZ|eaQGWTvZ0x88x$l8U(+&|6+ z6$J<69dB9uc`$zm&jqTmU6+OtM>56{L`CV~bg^*Pb?q60c zpY9+;Hci_yc~OHpafQ5h7f)i=Doe2LjR&1RkQCaW`nOXGtNI3s5oIX(qq(!IDaBs^ z5n2FZy_f^7d(*H88=OCSJFM8!-x0TXqwj;;$c_c)e|0L5)JGqpR@_A=Bgl?o zj(-~_M^{*^yDq`CKr3Hu(CJOq;R<9U7~ICYXBo3vHKr+l?&nb`(aR2k&>U)U@gLv@ z=#|~~2j1Ww8S=Vv?|QU}3vg2?{36x@@k(5T$ucQMZCeESgS*S6y=G}=vBWNgriq!1 zv|s#{PT)oYOpp3x80r`epS>1);WqcE0*x6sySderPdW#!5wFVzQggnjmlcKA9{!?e z4rEfE+_3^B`0#7A40&Ft36}-J`!7{k=0Gf9;A4%oj!sjUeb6!2dmG`!Cw^<+I*+@` zi3iQ=9O~`CCp^5nfnl-Jo9Qy7dLYSx%1GG~5>#oW?aKF_g%=bMoVnHUOjW>*x7l*GU)c-mOT~ylJ<1LfA=xAcFfpqlu>qsr5FH)TU04PYieq8@5U)JYX zgg#Qh;J?~L$!lf_jZqLW<|5eAH7A zM-g6Pr3o~y47;1^j(d8i+u!y8}hRMJEuXJWLPmgld={MgZSDwTv8KL;bZF^D}PlF?5 zY>TE$CnJyyz?cUwsvyt^g_+7+obRn|qr_oYq=0zdPxeVOe2o6vdrMC+gndg-ok@tFUHMdmCmn9ijm>OuE+N%$>7RaJ@;@nmo3&9i&VW@ z;1>3&XH7z zm7FyZv@i;4MA;Mv`LriRgC{f|)H$x(neSL4P9)g7I-3wgROe3}*ItEWug;q(J)3ar zck^g4_U*muvnKOOsGGKQ@0ObHZT9-&UkBC+O>XiNKW|S{aS9hXX%Sls+K2Wr8Z-&> z7vf&mvAPj^Z1@8RktHAV7y9)+SIozc?Kp0}AK`86&od%IG;Ef>olw3E7wt@i5)Yca zpJrOyy~0y?bfhJ$d*m$Hw&LCt+ylTv(A<3#i*0Y{#2sevINcaTlQZjZx zS9eRe5*B1fn{%@!q0iX~>0gO6zS0=%Sa!T&Ef)i#c#Fs8d6r)vRfSuC>Pm4VC)?(L%;;N%*;!iKs zq_Evh0m0yE8(gLc0CUcjcN_sBE*QDrRqaSKa8MO>PLGl>=>xAJ z5c2k!pHBrCj&U!(DBPx?p0uU=~qPW zAiQQ@c!rk|__}-ksB20L*?YI!cn@(N*@r3m(c3fenH59jdsFBV9dVKiO(umNo(nWz zYIXmCdqRwB@AMuh7+piYDp?#epUbVRtwd3?l?~)|P69fm0oRZvWZw`ABgaL@6MFCP zMwgkGkVdzHp1OSHfYIypm$^K5H&zQuf6Q9$O;Woc z=;1}?_8~Wb^%B<4KSF<4FfnBTJqj z+Eg#q(kN1+NRmeb(y7-&;6{jmmC>uYP$!gr7RSH@U)W}wP$IjY~R2|>3{&rUm(nK(01nJ>hzFa03^S*qcFGZzR8`V&g zO3XuT11EBgm31&Z*}2A_N@GQx9AeUJA>{>-vCfG8%TCjH`;AWPu@4P`6Qi4%V*R>t z`Jc)tn-p5^N?l~St4?9}^t;8XX>toMh!8Sm${XQU|6_DydVk5uG2IN$!( zvwjNo^-q8-xCD^f(!PF(K0IL=Rf@PfTjn;v8C4!+b*|UHU78ETo4!A-DHYo}!h#E= zP+O&GYcg}iZ*9Y5`8(#otLJ1Qx3(@pXK0>$IPcXNi6i;pd$@GGmT#hFu6{x>k`?B7 zwxYaxx1r7ktcw_xLG<9oeSoA(8x1HSe|H|aVR~VZXc~L)-Xm57%Q6B~M7t535ZRTG!pjr*sL0n^ocKW<*TIF_$A7Jb zd)u2nfrRI~7?05vCHA}XbOEbpo;kR|HJk-lQ%1Br01n@p8Y1LlyG(fyfF|1cN{zbr zGWMdW>UXl$21k?T{Vx;$eE@;~i2q)Z|5^Mm=0f8AAcb?-!LO0`l5>p&q{eeCe>-qp zPo8^NO;4mzCzP^Aong{(o`NpKn@Yu;H_ZCVL3h26@6@y-fbV9;6GV{TV-VuCmx^7w z+iJ}~oco_8p~>V!@e}#ISIuR{)e~AA9HWkqM^hb6G^55 zUi)w>B+o*$UqDMhh&c?mQf1Ct`c6N_>NU=$bFOkRX;Oj6Vc$_p>NJM z=rkvkRf8@B%6Ze$Qw;dTM%3J2Hh#{Q{YTo_iJqOux}Z-C)=sG+@Xc#4w$mIK!}czs zV)iy|6R{q0i@g;ZuIY(huK8f>K|o2MU5ZUH^Q0TCWGm2^bRwd$Z#n(eu={CnABubm zW3%BsKfSgC;cJI=7o{8rf6qt_oF1tRqoR$HXu@Mfc2PiTY$5c-AEO{RjPL%j@+UiQ z3wrz70&Rop?NnOIWRE`sUa3sQWn5kfuvVYzG6eejM__5}FPK&*Mq06NGKzSzcIN16 zVh1mqt`OKuvg@6YvX{}5NBfvR(%bRRd9ukGdmMR%>Jx;?BtJCfw@O|&T{lcxVX}(q(fL9jOS*ej*3{p z0m281AZk3^bvMy--rq%R$^sJLuj)Y~vX`Mvh2Q28UdMWJRuEsWNc;`fX%Q*z%c)?Q`-;nW5sq z0Y{S~gfrLNk9!E1(jUy>jO>Y%tv@0kO;P*xbEyT*rx9SGs0+Z-$>==}ZOy#+3xlZR zP4tFlMLgXc=3YbsPlJwkNtlH+!zqAgGG)X(S6O)-_nIa*P69Q4>}Gh+pFOxWzcTdf zoTbm?e$c0nkQ0JO77bnTPeDx4ZVJ)5fX>tqIrXY0(RZQQYt8kawr_z?$6WhlEy;?u zuI=2;d>eWEA}AH+j|TdpX?a*(XxOXH&KYI_jfhtQmfxco(qY5Q2jAAUIAr%u z8nn(FkV^>r5=6OSo7tWrR%{&R=8Ze%vBH6BaA-+&=jQO9-JtJ{D&Fc-${+4nWJ8~Y z7Sm>zV3*UH1UzmlV4g!OlW z$)vW(e*6q!7tgEp$96BsB@9Ef=o%$7m6;?knIxgfjKlqBX}zGYm$@wg2mXnf$wfSb zh^x2A#5$2^3gyY`h+s@|)rWmF%Ov{LY}2>&otOou04{9}(b$Ze-k89p?Le@%3v-nA*lOkIcvF13^Mc}@&R^#SDgL3E*LLtXH5yhU)Ek; zq>18H;Xg{U<%<%LfB8|$wf?_YLjGr=8EvQE=dW-16r(7C*RnyPN4uc`a(MH|?=wNS zT-k4%qH6TLUywBBwskI*%)R#@LM!C+uRCR)(TyG+%FdZbU#CE1X#bxh8$;Co`ThbH z^RNF`HvYe|@&69l7|4+893Y_aqeA8M%oC6Ui{J3tmG8u(_h7hD-WQTr4V@f(eG$fl zwhSWGB!gz#GlFo>S_A4*ce{NCtBw8#v%E*cgCYQDrh~+H@57e1m}n`25>7_H>W7JJ zwx8xN9g$4y))Bt{(&5%eYwO3);vdpQFmBP>p$c=4tL)xk*3*B%M8y3|x8QJ=LjJYq)^fcDjj7t%tz2oW0)6xnLP4JUzY!1w_@Z#Pg6^!6)MLBugwok!$EVmdvc~V z$hVj)0z2xlS>FuH-lhnp!$ul*O2Ag_F2Vy@Diu?%!#J(bq4Z3)?lyc21>X7@hPQss zZnHzRkWF>5mRgMlBCanqkSCkZk>+yo5t4n-Ciyttl+P5fY60Q`cG0ihW*6l6 z)^u&xoXHT@47mp*$s)NM5sSYyH0gQMylk1$&sPcg=IvH2WE!FlTmGskDX!RHBkfzf z*cmthG)74kMLjCr<$CG2zwED86MTW}Ej`*_&@#aGeWqI;EMM!KnnLVvb6}#N0Rrz61zkegwbO_+|WuIF3p_i7OM>PsGD#Fs?n@VX4{$%Rh--3cC4!u|2-I_4|B zk&G?W5sbD!-F2OS%>%bXGc5h1QgHjxGZ-#^eC1v##HkXeJ|mN*j%i<2!mXk_@p!J_ zrCJf?j--q~K=E#>*}AG281Hj&y{42+G|+s*0U;kaiImaTh-|M8S1n`JrA3KRNlNGU z2{^wnZgty3J}xCh?l83l$s?zD)ZAgD*-EHGVP!Y)wmAC;~GDL$V? z{J?n_TMc>mRSlAAMpFpggIClKOKnarsssywR3>#yyX+6{bN>EPkXM0#0|LE|%3;N^ zAQJ)9@p+ZdH7a~}9z|H748`ZG7bMytN@Bm8h~%gEJYIlAtm4{lB%LZyVa1Yg&Pfpa z$(k$m9@jh%+c}mc67_^FA2GP^cJ8KIV%ZA$HjcJz#Ncu6Ypmh?~lXob(fk=3RXTTzn; zp0RKo8kvcQdzOBlWo*4iwq%%=waAHk-&(bJ?&r*W%>3*lzb4Z(FEH$ub{R_J-P|I$ zE`V{FV|hSjx6TRie&N1Stur+u=ga8-Xz#qEn%et4?GZ&OQl&|gCenLHPy`VX5RoFi zDIztX6e&4M@1h6@2+~AAnsg9?p@iO~6F>;PB@kNrY}9k!bLOsl@B7Zox_8#B@h_J` zLN=paa>l&mT9cpD4|xX2w8G8ewqH%+ykszgzD zptFfZbdTsIvWKThcX2f>6(duXir${J5d6kQ!DcV5UtmRlmf9E=R7^6PR@lQ2+n55~ z7wy(+yPZ8WT+M{T2R=z`sfcwr^4a3Kpckyfv8JnxT;sjy+1n0KHMQt026XJ!-HE3H zpxrD6fv4OwbLL+WZ)_y}39M5RUue!6An+;V&paQm3xbHhDs#UTeRdO^(q54gI`yk` zN88J)!$GLE!0@4vCi}&l2Etm!U(~Op$hiM(%R%B*-$;bx(wPPG$q5S0u+}#TW`USW z>tG{)IJ8<(Nf7i+i`DF)Ob><39*0;52h6V}&rXt9VQ|zl(qO#SA~>VRiEeA3`>gjP zn}Q9MJI#DEIizmlVaO`@U9wC^)&@S>Jodvp8!5JCkG5~Zjxymvpi{=&Hg;dS`N=M= zwI>?nou*DP<`E#U*o?Af*JR*yL- zhY_F}y~yeHJ3B^uqq@CuTeM1-q%t3=r76bEw1;&TZ?@KBd>3xK+NK@nY~5=zl-(A+ zL7cs2N!(VL?<5%99_8%p7rE+#a{~>{YQDqUyh>zPwHcP`Q+um1*DSr5EQ|P9SAUzz zVvnusGykAep@9J8x?SQF!^(MxCq5$r_wGpCy{N) zR&5Mw#H;lHR`HOuZ~0<($9Pj%=E~7f+uDVLO?}PBD-3CkJ=cdfK=Rstw{{J_v@BE# zad27HaHd`cQA~hrFL=|QX-$@Xvw*^DXOz^Iy6E|p>SgEeGjG%S<~n%MbGoJMOgteo zN;+Sqj}J%d6^#vSpWCARpy2Kb71t_(InTo*{)IHT>ThYX{h;0dPm_P8$x8ha)3rw< zl*=E=R%NCdpSAC!tu1Y?fw_8)`V}Et`y1;v8H5maYrKu5yA;+*ZNc)orz%*$w<)_?KXQsVlYHNfxW@ezv_ z;ngpCakTD|>hCFCH`O`^W;P|ri`rbPUvtjkVP!T2c73J_d9V&8)mP^0XjQ*Zi1ev} zw!_AOQjRyHox=G2S`G`#0ozm@sUYG!|-5uwvFYtz$X!L5( zYuv1}&L2zX>u zyfIylyp=#)kJ3DtyC0+TVgMBUr~YWu^k?yu4aHp%i;P7B+bjX3^-b;^9yp1uv%+z_ zX>c+~@E8e|zwNh8XO|GLD6PwLHJ&2Acq3G=b9i#mZ!cx7M{X(3G0&jgF<5f0>5?5^ ztHfdPQA(##&-4Iy-wsba%A3jnt&-H}@?uFLbOnOn--Xe0Ul9FJKQnO?N9iLFK9XgG z>zo6~JkV`>Ct!2&(gT6-)rtoPS5Iz_U_E68#U0V-blStR+(K8xIRbWdd~1SXpJv)h zeVpUlJgJwTXZhP+=!9wcrAavcHz(2Wj+1CiXt}3g(ST~}=3@3s_LPk{3&zadnH0x+ z91Y>Qdj5AVxQD@8lA?7})0B#vEb{oDI=DU+E_du&RYw3BQYkC6deoSM;;q=&>DIol z7YI5ZvhGC)7(9fZ;hGJ7^U%hQJKP2@N?!PtIDfnY51hSHRR-5?ka$0|{Vor-bqFia zj55#)-s0IykgzwWzKZLKBO>KdvDLxwb@j0WD|Xaf^g25Q$@TMATQS)4>(CHY*gHDzc)mi z>hF96=JEUyJ8q?hkPa7s+;O}pFpXe$DA>5`)<)1P;rO~(eCQ`B7w5e)kX_wy(Gj6g z>lu|U>A7XYz6uZ%D{oqtp1V}q;q~4(%?z_oV7Mjxn!%b&z;cKsl4WC`I~OH$sP0Xo z>AIQ9qVFUFyy|u7u)Buq3RywU5Nc3ibZvfNPKx`Ej}e70I0)d&zA3W@)aa zLag+7DRy7x@k2ZN8yX51 z!jzE&rW6KOc(?J8dh0BG^4+TZQ1LfX(52Xqmh!KLNLQxfYd?A4iU%rg*T25ax?|PE zSvWH=CYG<~{`Oh{U9;P`>FKhtqjOf#A|S@h3ejr0!MWdV-B?>oG0RvTe;C*|??o1| z_7r)d9$rU)R`yh_y%_dXStL&ma%9uBw^gXz)kkqrm4Vv}FCefq2i#gZH~N-pQ!x#E zDBCtVY73y|?#fs13R-@w{hoBZLk(b1Q+ErOL>{r3S%V2}msQU>a;Jo} zm~FsHhz@RZ`$X+Z@D~Bm%t};Mr8=EKOC{%QIdp>FxbbHvCXJ*}IwiN%RCq?v}k zh($ebBYBo+ksDiA)o*F}$My*>q$AB}Y!T}o_IBGRclBT;@=l$~o@W#yZl_Zzoi)G& zyP!)F>fkofpE3gDriQpdPUX-n@FP-`Nd50BWm!2rkSD4>b_@29SI_k^NuOl|=)_Z$ z_1}#WFv>V#@%gXo)aJ2$^p>rBbeU7cDK3&Rtct zAgu=#mUskQswvK9lm-@s7fV00!?K!Tg=vGTo4*3P|E(Igpm>_%d8bJ9z77x5*j4!h zf32N%2W*`hI$1>BhIispTf8dx@n@pNG)IBLZ*oM``T5uf*Pj8$>z`?HQxxE8CL?s^*e1qB+b6;T|+87ma9cPk9-V_SscAO05ptBjz+d#I3?{jNSJ|F9% z_491LVPR-{HvAkWBRY)mDyPguQUdC7D+Zq)ffpvv!Fs*jKL9>?!3E(cs;h^9C8iH* z)M21r_g;OH780DplzHotxjUqFB<|X#P~y198GU^Stm#_-p3DQ`eKvPOq&us2CG|il zbbk5!GF8QBf-WhlK4>3(My+7@{LIR|%}s?nNjEZr_8ABtaQ7rX(VYpaV@Fy-=0l&q zBT=bC`0q{d+ggNM3r;O_%kW(uU%yP%MZA{xnv}G*BzniwI~!T;}K$wW@>nDVxcN5=2SY{Mv?ahw>WXp?2VfWq$P3$LPXr)+t=irnA znND!Ux+T$!(1_mmNcw|rzme&q8BB^C`B4g4-kAFkG*gPaN@`MfpMtNDbu_*}a)A5M zJqHq8&xE#VvCA5tg9l=;OhAMM?(VIRuw>MC zU>op0k;|drfNv%XT!%<8`-@|*W~LfwygM-bYP|bK+IsWd1>O#lJL0n_Tnn?FI-UcH zc@egOYVB8bT))m*cntc3E;?Si-=!Y1yy4I(Ssn2iarT1yj7Gda886E`TQIS|lCUw$ z_?fQ|xY$A~GXpTcp}o3>TS1#NxU0==wP1!AUDFDSJr*=*iwvHNt~iJPR;lH=b-An6{NFjWpJR{~VX+jXJSQh?Zb4BxY`4HVD{ptM1e=X|f|F4U>y$Vyc z2%r9wq+6u(e@ePf-TO8e^ATVBj-&wH!Z%tF$kkFVl1IuIWc@G?W^}V`5X969I0Xf@ z2+i2Y(}vpfS-K#ql+FzmNB~1^3K+I9B{=A0_Tg{P`?AFf%f)+>oDAc zIrU)8Ww2_J$MsV1#=+CZX0n5Gd(K(tw@ie?W3@ovVc9@XuptDez3k~U`Ozk3pion( znJQy$9xFFIjbRZa(M7(7M;hrOC9n89&fNM<afm@`QYMprZ={y9=?% z53Kl}kGClT&#ew z*?b|RmPMvQ;&LIlzuDE&X1=%Vj;?wFzg?va zqM{g34D>d$iN};VV7>ai=2jq&C?+rOCV&$#XMLc64`89!gl)nt8B7`mYFzvyE4x54|*K>wd=c>h1~lx^o&GFSTFdE=Xg+Fn6Y zs!TwT)$UFUNbAY2<$P5HY%ntOpw=CRh@TDuhATtsZIPi)fp%2!$bpEQ z%L^oV4v+3pq5@Q4J_KCpS9xfe$~o#^1=JB-V?IEc~WxK!+Hdvdp=62l~ygi|@kpFN??Qe`v4ZIARY0 zH$vET`2E9SPjy{b=ES&*154t=99UpIAPiuU2YuR=2A<=`V?(#j!Z^mo^%duxe?9t; z!%yh}V!GUJtrCO)RZ!u&@n{wEs086{?X|1vVRJ#m9hr#YMs)XFg@+=NL5 z!M9S4GdwpJCYC%nXlZMEU@aW(Zz7DI6(3o9#z?dts}XorOQ$`49URxxr#Z%ToS7+8 z!p(P|oEzc0Zup)*DL3FfjS6%YnUs14w@X6Jb&%MfCqkG^KqbUlKGk?D?4#Y!t!o+c z6Jho5dN|zi9#4BIfhRy+P>08R_JZOR6Y-aRx*OVV)ama<`_8{@rqyor<-JBZ5Npn{ zAs#Vs!>@r}Ck<8ia1&Y*&kpOg)5r9bdqP|Lz;UD|`#dSeV7Pc@n+w-`YHJ*+B>uh~ z(;SucLXRT(Jgg7WSJ(dZ)(@+@#@VP0&v&a#22h#egR}ZsN+FdeF~LsXNzb1-zHKYu zSk>k|Z{IGiUW@>!+;N)XBVfsz5P@Lk($B+mL-Z%|W&Sfg1_S3mqsJh}EPo9?Y60_w z{cdD!VrQMe78)_x{qm+ zKlK!D-aG;{T5hnR)Z9m;l&Y*jqJop-ciE%4n>^o>QjAkomrr}+QG3gC?l1vsw4_5D zD8_|lJ4sx%ciqxtZELqmg-c&_=gWsTnhYtwE-$5@uR(kMZFpL1)5kji5dJ(!JD|b{ z@6q4c;*5eALR*0I)3Xdl?P#V5s6yhk80HkYxR~A4Oke^g81{ePslf~T#8?8|LVc-! zX}Z}K@_YuQ(CggmpPCQ>lZy!B_Er|BpsmDiEu}IoD_Rc&r=Koj$R={(u{@VD zo7&%fll#d|6)6E!Cet@6D#htas%hg<>CCsWP1=KV#!EutQ5lc`!ql5AVi00}pR~kq zEclVlj@JL;kr17Ki79MzaO0?Wd?3rX*$vaDsHhgwikpBDg+D%)_Igb2x!a#mr!Ey< znij}!v6r0}&Ynuxrhj&@r4ekh-r%W0bnkQ#yaE;!RxU;Kuk$u|y(8qv-)TbA*T%mw z57&+7-W5oP(S{c5U3B`Ic(+C6>~#peXIda(dRWAvv`C$>FKbs>yRh z!PVy@9;(^piPdSkt-LkvjjujxeTs`kiz0ceX?TM+^}acDGQ^l?+-zoPZhQ$`tq!(&7WIbk>7P<=EXQ@?!S zB+PSvUm8oF|vf8eIhp19tmSh0bpO|7q*lXk6~xJ>deh1dv> zrUX;$HRV@FOn5Xnnb{d1n-abOri6it{;I3^8J1vZZX&tCTD2z&P+hIXMSR=e*aX9S z3Scoi*twRC@!NR>7*!%RV(YZtY7?H5O9HNG<@4%6#=!G8`gj*ixlY7y%- z+QCvWXJ)0B%#z@Dj1KHPcUWQ%&+|Gnb^~2Lr!As=-oqunlJ{H>uFvHXT-EO$6I1Ml z!OH?uko69ENJ-ZkhW8U|e!<-P!ZQ7slvfKZrCm6~rwAdRGVrEK4~OTN8tk=6Cjm|qVDnGDA!Fu`mim?H)EvYOorRw1`%%B z*$SDg6{e(;KDbz6^Oki)`)P7JU2D@qqbrM31NP)D2>a&vA?++J0~17=PCu(VpJ|YZ zIC!ly5|y55?nA?vkmVq4>9^e!yY}`0+&n1O1c0Tu{feix)GePS?6^b952;>Tgy3Gj zHf7~knfcSOk%H5$MlYw-eji-4=(R>(Z}_WW!$9$V{#@1dP^ViT)b*qq1l8aDzBK#*Cz&cLBEv-L+;f$onIvcAunILay9~W%tFtUf}6lo6f(7YfV}|0 zREyKz`_T?KE?a3GpC>~{XN>z=tdHFq2LaD)kN$9L6xp{N((m8pb!3F6&c~cYh4h%Tm`5#zzxQ2Y;<;Ryk+D&kc)KU zZBtT-#FDcl7(J7W+z0P~@`1R1!iW1^)=c>yo_Jl_-29Cxq4*wrjebSB$o_uhXNGU@ zHK%-UPT+FO`!0hGC*EuI-Psw|@ax7)92EMQF{@hh4U?`XDbQ(C=fPC&;lTSDGbXBaw(rdj;%7F!MY4(sLc%vRXOUV* zkW((aBoiaztE6O|Ua{Dm5qn9IEVG&fiFqQ>9XQ0F?jTQ3bWWN>)=6+8VfEVT4hQYD zM+d{dEn;wqe-KrO>#I%slrj=?3;k^Zn|%ibEE*4Y_f?hg5CI+IlpRz)opO#Pud~#Y)i?{_iEB4W2wW~6+i8)30R~yhmj<)tp203Gaaj>4b z_tJUr_Ej+dR4t$4%Ylvhm<^}2C-ZrIezWasJuZsh%FkiQ40iVO+3SF|Z%n*8td%Ng z_3g8S%DCy1u+}rPN(&uV)YYSbI_Xi^-icdD3>p~b`kj_95&qy(LBtA1f+7L+gQ;@B(^2Y?nLUMZJ&6-LmX`O5m)YWP zTiABoTv&z7baOuk*B04q`AvyGiIrGrmPZ_L@CjZxS@|rpo28YY7xQ}P_tsi#+h>5S zTni(pg(>daM>3SQ3#o=#h(o`A2D`lg(>4(a`%WUNGs7x4ZbT}(HIjR(A`%Zo;nX=z zL;?NrvI63p&x~Sx-b6MBe?oP{r}E*23Ba08Dgm-{TJyTreY+cd$}c=jva$;Bzi!l&GEa1yZL^-@YpVs0 z!`qm~V-1I98rbCXr@PfmnaGBxIAN_^iCa5%88)G&NTVHYjiiHU6eT3cK+F0Dm$|B) zku20Gyl1IFnj~)M+o;9aABjI_w`u~Ie3v9ZMch#qIOUqGv%W>@5(JN|PZEjE78w>b z0~vH>%h)HM4Z<6%Ar=G^3Y2+yc0|`+!T#`cL<F(vb&W~V=9<1(qqu9wNnQJ!gT#6rs`V>XTYx%am7A#dzF|y$J z&YS2IYCSr?)#$lm7U@||d&sLgXZO*AP9ZBO&T1jNxdJM~7N8y6(dt6ztYjTAA5GYl zptAABw*F{>&jCGgscG)m6+OT3Y3|6Bsj$R1Ow^k-HqP&t!C@O^S>Jz0eSPjAP8?7q z?S=F_Dk-|EGs70>0APzj9W`{P2?;-J9q{;dT@OGHY^7o-Oipmn^%$oZ(4N99#g0Myd6JrB1Vx=Cf$=^*yDqg{y{$U|)F zOgGCkLGP~o9z&&XL`6XrD@G-K5RBG_D>V&x*R=uF^ve*(T*BX+H`V~X_!0t~0Y8f4 zyVw*(D~LNmcgzN}mXaFqL{8E{6t|*4$R?dTWN`&?%5U*<5j|%>)?4FFcz$C(52+xjUXY4t^{e>cA9R)A z79rf|fbn08wQ>d4P+AfVmHhNfSb8z=ttBQL`He&gL zvIi-&M%UCZmF1VpLyY^{h5}zh5F6oRqg<56w{Oqn>Q4uF0B}{I7l#{5{An)XQwwL$ zAo*2QJV@^+3;3M$j`6C;=1esD_{jEZgH$WOP=uQbS&sQk@Cm-MU>JT~TeL(JF}OYW zJmv?Tf?n-Jc67o;;PvXE@Q!pq<~N&Q=C1i~?ft zo&G|{vM^GTE3(c*M0E>aP?U@)XQhs>V%tjO4_$103Pn$4f5-F~lu?pq?NnN3pSp`V z+HNmH1oVk>#mDb5*Xu4Uy-tcDDtQ-9a&KE6`x3g?4hj=HT8i1`>%w%uoHb}9Ru3JQ z<1dUyI09qn{1c!?F^KPgP!B`20}&c%d#YZ};P?8@{rQQ! zUb`WW>;u>(_+nly0#aZ}f09e&z#pzuTeda^$vWMe2 zCAB=|xb(nRe(37v+zj*J-(E`~vw2+El7U$WpAiS_RS9!fLD_2MQqaTdO-=J)iK4PH zz^}OOtL=&xVl1>E@KAs=Abz%` zV$A+yA0v-~S@mNMqe_-4-rT@^-bko=^wp(PBQXSA9r@{MZQoPJUL+=&*DI@z9LofSdvP!RCQwMP( z-qQbtv($+zpQl$zf8%2WFU&hTfiKP;T*?R{@`VQ+W@}ERW-;;d->W`*rr^5Mc5fYp zfdWYga9;QjjSlDRzhB;dd!r7+DUQG|vtd_6m{yKR12k-?M=N zd{yeRBUTo1n%vxGS;y*Fi@G*ICh~{rW8?V@z*k{*2k0pb#4_VZJ1E z0Q2BH4*7(wWg4Oaezxy{L9EVub;0xg7x@;CeiZZVu7?(+<=HQMj1CiKYLwZ3@Ulrm zR*Awu#>-ZH7AdZZOv0s@T{x1U4uLeHo)rJMy&{bL(m<61>v$8_JXBSyj$gy5hj~M^ zJI_Oj7$4mI$U#*8SU~8}=V#reDw(y4bA>8PCzP|>$3?mT(`J3I zESGYc`66ogG|g@eG1mws(2F~1E`3*9K~Ys@t(qO)X*2XIn!K!rV>}praIx}mvLV09 zc}r&XJhT?5g?yJ&_K5hK;v?T-yx!C-Lp7)GD6MsgoF*YN0z$Uvg*c!Zutx9JE_c0T z|CBLg#-LC-nSzvKwjl|JCR+!4lMF{?N5BMT8B^L*T(PV#>_mVWmlg}AHdwaG911L@%#S)0guT0~x zv)>fu)k1I@j@DZeQJ3MyehqsPT{ketv}o=5QL!M!c_K_$UvU=6J#+-z#!fG^`w?`T zE$5xVL8*xk*4{BZovc>d^!{PLev1;lv-9=wcL{R%K-hcbO%FPyJ08pm7{CsH-bY3y zWKBg=P@c-5eq<+DM>5E~DEb!28W3m=bTr?LH1P|U*cW90aZ~O%a9I|s-1{_fcHp&@ zFf&2de+g-lc*qW-LDY&u0G6s23&@PYGC*Q1h;ytfz*cU6nb%5^r#g65XEx`W_0CQH zR#|mx@f(-&hS0GE1Ze?SK=#X~x!oz62eV#Tg}+h_QVL5)$lf^&3OSyz7*%5de`m-M zfJ*nwndMBsZ}yDB;8o@8T4e6c$iqQDz>oDg*M;6Kg7*F17fW*XC%aR)ch}W(YVtXp zm9#Ekw3{tzF@p~&4CI^zFBouq6$b^eryKCs&Qx-=bPIUJp!qIKan?>{@Ia7U?(gK> z#1{dU38%Eh$PHTR6klXXek2=Difk+>{$T;hi>8MM5vZ>a&&d5)LXKK;)R8C?D1(lQ#W5Yx zBXwQdk%32@%NNzZ??hH8-TZ+jvx}(4^@WX{zk0rL8e4AJHLmHWQO z_nuV4(F+-Y2iEW&qCV0u`uV~-hzXGs(!-V|O}fkJ(BbW$rG~g~T54Yk%-Eg03?=1S zXg!UN-V^2Fr3s@n!1S*Ql9r`Zyp3;D^4M1UC%g%A@5IZ5eWP_1|5lJ=jh6sBQ94~} zoe3?#6AbLK;2hfSYUry;;I2LWkIV*(`(_iqrXvaX;P<`Y2%As$I(^Bt-eNT|i_2;~ zWWw%P&ZyqGo@EX9eTRq?{JVAS4v>q@pC>JE6EN_xYHq^vQ8&LPu)pB~R>09#7y3=- ziNQTOuONv?&9nyB2bxTO$)?r{cn0#>u5Ibra*zLZ zRZJ}|YP^T_<4nG~R1b~vT?4X|&D=Wd@dV7!IJ?SveNAE2{M-^&a0vP96Hl-i(bw*_ zvrYli&51WAR_?w^D?jYu?MCZ8Z9-o93uW~Mgbyz!W9ocO_PUgJ6M`kD)xL0@E92%c zttxbwPzFu5e_N9~XUqkUZytasMWmx{ySHOfL{=5{56^?hto$C!1v_NynD@E zB~aic^qPlNe$iW)`9QZj!rGoV#55A)8RQ*d(;jDHBVIMzYz1s6ho=9<7orrwy#I$U zq>quT_As^K=><8aUF?&qA!EN>A^7+? zjA@yt8JxQhwqGti6wVE**XD-bxBDTxq2Tm$*M3%d3|R43rraqUHB=iWgxq$TXKVKF zl7`UB|<&}GsPZK!-vNd0{g zTp95DB`VPdd1uFzWT#V2CQEeS(k=6cysjS=y9kySd^zPWP`%nDz#S-yEt6RBlPO1^l>!=c>0CT=rYh0!#Be8q*(M^PFr$s9d znSqbQYy@p2e^sI{L?z`_59FYC>sylN{mK5}7g;}`8G#3f^d~X`ev!vrN>!E+j$O=e zax1JCJPh8q>^-@w><6r@gNgm#5mzJ>^oy0_%Cdr5;61cJXN6PdTZ-YkYPGGJnntrg zFHSkO>>P94iNm882lXcr-jp3a+oez=c3W+L)x{ToIWCN?e7f}d9y;mG_gCJV#}=3hd+3@;t8QCq_b(gHZ< znrVU}^i{;M+Eu!4uRpU7g7*upn^($EeXBf4sihzU849~{dGXBmbd56wQX>hOv)LqI zx>5(GTDDBx_Td^u|AA?kWytaX8!Kx%#_zKYwY5>VJ_5V3qIkK3;f5+%^``12Q>Vdo zh>baLX?^PFRz@Z1&WNr%ZJpsjdq^%Xs~c~5Q1L{AOa8 z!UMV3h21Z7=^BG`%qNTXH*eh|PWJ;NIedsSCBfCeC|9;DBMeQh37{9be5@DAgSuxl z@U0&n4@Xf>%V0f+v5dB;(-dbETWbo5T7kHvpAstxiU=W&H^RHQ8^N^@BH8}R#a=i* zBAo={O~YwB5@FW?e=o2$vXLO@9t_mzqWghIUss>j9a5D}2>2Y7DUN{7rww|XS2;Q( z2A{`D-t3=E`1;njPR?wpE@~_*3J7O3G=b`R;>nA;)MMYY!gRAy#Vx|tc^{R8gJtEz zC=gf85JVgHS*;2>=YJXnC zwYI)=WGi4$W`~R!5MDMNC#f|T)=TN(a`IQs+A*B7Q&@rUg72-%4G0k)3yV_OHd*oMS@&1B;# zKvV(d=aE=3*@p=xg6?edLRwBA!2Y>`hb~{72zPrPC00fW@D8+mki0~s;lv=Vi6!9~ z&pS)kzgmBLXm0VFTW#y8kZg?0pm0VV;@~+bD&xLxm#C)uSc=pgqgp4PfeF;b&@Yh> zJ0SOdvS6>ruRpVv`V0(fRtyVA0=sQzcwArTzJ~CBdKjp7#)o)i3_Byd6q9_jnl0x5WH66%YOna%c5nS-!(bDM=& zO~kK|cEObN$?g-B23=F6Es|?@M&%!9#_r)VWC4t`AtvxN3{l1ZIl$;_6w^P3nWR(x zIj!iWUf7>s)A>Q;&+#XYM%jPPH~L(7=g+Z7llLzFIWWal_#ZD){=ezr7w1r