From 5283c09a9f266cffcc0fae7396daf92e0fbdd0f8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=94=A1=E5=A5=87?= Date: Wed, 12 Oct 2022 17:31:26 +0800 Subject: [PATCH 1/2] add lzma MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: 蔡奇 --- lzma/BUILD.gn | 208 +++++++++++++++++++++++++++++++++++ lzma/README.OpenSource | 11 ++ lzma/README_zh.md | 13 +++ lzma/adapted/config.h | 192 ++++++++++++++++++++++++++++++++ lzma/bundle.json | 33 ++++++ lzma/docs/rom_integrate.md | 120 ++++++++++++++++++++ lzma/docs/source/results.png | Bin 0 -> 21452 bytes 7 files changed, 577 insertions(+) create mode 100644 lzma/BUILD.gn create mode 100644 lzma/README.OpenSource create mode 100644 lzma/README_zh.md create mode 100644 lzma/adapted/config.h create mode 100644 lzma/bundle.json create mode 100644 lzma/docs/rom_integrate.md create mode 100644 lzma/docs/source/results.png diff --git a/lzma/BUILD.gn b/lzma/BUILD.gn new file mode 100644 index 00000000..c60230fb --- /dev/null +++ b/lzma/BUILD.gn @@ -0,0 +1,208 @@ +# Copyright (c) 2021 Huawei Device Co., Ltd. +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import("//build/ohos.gni") + +declare_args() { + enable_lzma_test = false +} + +config("liblzma_config") { + include_dirs = [ + "./adapted", + "./lzma", + "./lzma/src", + "./lzma/src/liblzmadec", + ] + + cflags = [ + "-fPIC", + "-Wall", + "-Wextra", + "-fexceptions", + "-DHAVE_CONFIG_H", + "-DCOMPRESS_MF_BT", + "-DCOMPRESS_MF_BT4", + "-DCOMPRESS_MF_HC", + "-D_LZMA_IN_CB", + "-D_LZMA_OUT_READ", + "-D_LZMA_SYSTEM_SIZE_T", + "-D_LZMA_PROB32", + "-Wno-error=unused-parameter", + "-Wno-error=int-conversion", + "-Wno-error=format", + ] +} + +ohos_shared_library("lzma_shared") { + sources = [ + "./lzma/src/liblzmadec/main.c", + "./lzma/src/liblzmadec/buffer.c", + "./lzma/src/liblzmadec/io.c", + ] + + configs = [ + ":liblzma_config" + ] + + deps = [ + ] + + part_name = "lzma" +} + +config ("lzma_config") { + include_dirs = [ + "./adapted", + "./lzma/", + "./lzma/src", + "./lzma/src/liblzmadec", + "./lzma/src/lzma", + "./lzma/src/lzmadec", + "./lzma/src/lzmainfo", + "./lzma/src/sdk", + "./lzma/src/sdk/7zip", + "./lzma/src/sdk/7zip/Common", + "./lzma/src/sdk/Common", + "./lzma/src/sdk/7zip/Compress/LZMA/", + "./lzma/src/sdk/7zip/Compress/LZ/", + "./lzma/src/sdk/7zip/Compress/RangeCoder/", + ] + + cflags_cc = [ + "-fPIC", + "-Wall", + "-Wextra", + "-fexceptions", + "-DHAVE_CONFIG_H", + "-DHAVE_ERRNO_H", + "-DCOMPRESS_MF_BT", + "-DCOMPRESS_MF_BT4", + "-DCOMPRESS_MF_HC", + "-D_LZMA_IN_CB", + "-D_LZMA_OUT_READ", + "-D_LZMA_SYSTEM_SIZE_T", + "-D_LZMA_PROB32", + "-Wno-error=unused-parameter", + "-Wno-error=unused-variable", + "-Wno-error=sign-compare", + "-Wno-error=undef", + "-Wno-error=macro-redefined", + "-Wno-error=int-conversion", + "-Wno-error=format", + "-Wno-error=logical-op-parentheses", + "-Wno-error=parentheses", + ] + + cflags = [ + "-fPIC", + "-Wall", + "-Wextra", + "-fexceptions", + "-DHAVE_CONFIG_H", + "-DHAVE_ERRNO_H", + "-DCOMPRESS_MF_BT", + "-DCOMPRESS_MF_BT4", + "-DCOMPRESS_MF_HC", + "-D_LZMA_IN_CB", + "-D_LZMA_OUT_READ", + "-D_LZMA_SYSTEM_SIZE_T", + "-D_LZMA_PROB32", + "-Wno-error=unused-parameter", + "-Wno-error=unused-variable", + "-Wno-error=sign-compare", + "-Wno-error=undef", + "-Wno-error=macro-redefined", + "-Wno-error=int-conversion", + "-Wno-error=format", + ] +} + +ohos_executable("lzma") { + sources = [ + "./lzma/src/lzma/lzmp.cpp", + "./lzma/src/sdk/Common/C_FileIO.cpp", + "./lzma/src/sdk/Common/CRC.cpp", + "./lzma/src/sdk/Common/Alloc.cpp", + "./lzma/src/sdk/7zip/Common/FileStreams.cpp", + "./lzma/src/sdk/7zip/Common/InBuffer.cpp", + "./lzma/src/sdk/7zip/Common/OutBuffer.cpp", + "./lzma/src/sdk/7zip/Compress/LZMA/LZMAEncoder.cpp", + "./lzma/src/sdk/7zip/Compress/LZMA/LZMADecoder.h", + "./lzma/src/sdk/7zip/Compress/LZMA/LZMADecoder.cpp", + "./lzma/src/sdk/7zip/Compress/LZ/LZInWindow.cpp", + "./lzma/src/sdk/7zip/Compress/RangeCoder/RangeCoderBit.cpp", + "./lzma/src/sdk/7zip/Common/StreamUtils.cpp", + "./lzma/src/sdk/7zip/Compress/LZ/LZOutWindow.cpp", + ] + + public_configs = [ ":lzma_config" ] + + deps = [ + "//third_party/lzma:lzma_shared", + ] + + defines = [ + "PACKAGE_VERSION", + ] + + part_name = "lzma" +} + +ohos_executable("lzmadec") { + sources = [ + "./lzma/src/lzmadec/lzmadec.c" + ] + + public_configs = [ ":lzma_config" ] + + deps = [ + "//third_party/lzma:lzma_shared", + ] + + defines = [ + "PACKAGE_VERSION", + ] + + part_name = "lzma" +} + +ohos_executable("lzmainfo") { + sources = [ + "./lzma/src/lzmainfo/lzmainfo.c" + ] + + public_configs = [ ":lzma_config" ] + + deps = [ + "//third_party/lzma:lzma_shared", + ] + + defines = [ + "PACKAGE_VERSION", + ] + + part_name = "lzma" +} + +group("samples") { + if (enable_lzma_test) { + deps = [ + ":lzma", + ":lzmadec", + ":lzmainfo", + ] + } else { + deps = [] + } +} diff --git a/lzma/README.OpenSource b/lzma/README.OpenSource new file mode 100644 index 00000000..a1d320ed --- /dev/null +++ b/lzma/README.OpenSource @@ -0,0 +1,11 @@ +[ + { + "Name": "lzma", + "License": "GNU LGPLv2+", + "License File": "COPYRIGHT", + "Version Number": "4.32.7", + "Owner": "caiqi14@huawei.com", + "Upstream URL": "https://tukaani.org/lzma/", + "Description": "LZMA utils is a traditional data compression software with high compression ratio. LZMA utils uses the LZMA format." + } +] \ No newline at end of file diff --git a/lzma/README_zh.md b/lzma/README_zh.md new file mode 100644 index 00000000..3b3ec67d --- /dev/null +++ b/lzma/README_zh.md @@ -0,0 +1,13 @@ +# lzma 三方库说明 +## 功能简介 +LZMA(Lempel-Ziv-Markov chain-Algorithm的缩写)是2001年以来得到发展的一个数据压缩算法,它是一种高压缩比的传统数据压缩软件。 +## 使用约束 + +- ROM版本:OpenHarmony3.2 Beta1 +- 三方库版本:4.32.7 +- 当前适配的功能:完成了 .lzma 格式文件的压缩、解压缩 +- [License : LGPLv2+](https://tukaani.org/lzma/) + +## 集成方式 + ++ [系统Rom包集成](docs/rom_integrate.md) diff --git a/lzma/adapted/config.h b/lzma/adapted/config.h new file mode 100644 index 00000000..74e8fa1b --- /dev/null +++ b/lzma/adapted/config.h @@ -0,0 +1,192 @@ +/* config.h. Generated from config.h.in by configure. */ +/* config.h.in. Generated from configure.ac by autoheader. */ + +/* Define to 1 if you have the declaration of `getenv', and to 0 if you don't. + */ +#define HAVE_DECL_GETENV 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_DLFCN_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_ERRNO_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_FCNTL_H 1 + +/* Define to 1 if you have the `futimes' function. */ +#define HAVE_FUTIMES 1 + +/* Define to 1 if you have the `futimesat' function. */ +#define HAVE_FUTIMESAT 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_GETOPT_H 1 + +/* Define to 1 if you have the `getopt_long_only' function. */ +#define HAVE_GETOPT_LONG_ONLY 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_INTTYPES_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_LIMITS_H 1 + +/* Define to 1 if you have the `memmove' function. */ +#define HAVE_MEMMOVE 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_MEMORY_H 1 + +/* Define to 1 if you have the `memset' function. */ +#define HAVE_MEMSET 1 + +/* Define to 1 if you have the `snprintf' function. */ +#define HAVE_SNPRINTF 1 + +/* Define to 1 if stdbool.h conforms to C99. */ +#define HAVE_STDBOOL_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_STDDEF_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_STDINT_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_STDLIB_H 1 + +/* Define to 1 if you have the `strdup' function. */ +#define HAVE_STRDUP 1 + +/* Define to 1 if you have the `strerror' function. */ +#define HAVE_STRERROR 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_STRINGS_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_STRING_H 1 + +/* Define to 1 if you have the `strrchr' function. */ +#define HAVE_STRRCHR 1 + +/* Define to 1 if you have the `strtol' function. */ +#define HAVE_STRTOL 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_SYS_STAT_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_SYS_TIME_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_SYS_TYPES_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_UNISTD_H 1 + +/* Define to 1 if you have the `utime' function. */ +#define HAVE_UTIME 1 + +/* Define to 1 if you have the `utimes' function. */ +#define HAVE_UTIMES 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_UTIME_H 1 + +/* Define to 1 if the system has the type `_Bool'. */ +#define HAVE__BOOL 1 + +/* Define to the sub-directory where libtool stores uninstalled libraries. */ +#define LT_OBJDIR ".libs/" + +/* Define to disable debugging code. */ +#define NDEBUG 1 + +/* Name of package */ +#define PACKAGE "lzma" + +/* Define to the address where bug reports for this package should be sent. */ +#define PACKAGE_BUGREPORT "lasse.collin@tukaani.org" + +/* Define to the full name of this package. */ +#define PACKAGE_NAME "LZMA" + +/* Define to the full name and version of this package. */ +#define PACKAGE_STRING "LZMA 4.32.7" + +/* Define to the one symbol short name of this package. */ +#define PACKAGE_TARNAME "lzma" + +/* Define to the home page for this package. */ +#define PACKAGE_URL "" + +/* Define to the version of this package. */ +#define PACKAGE_VERSION "4.32.7" + +/* Define to 1 if you have the ANSI C header files. */ +#define STDC_HEADERS 1 + +/* Define to 1 if you can safely include both and . */ +#define TIME_WITH_SYS_TIME 1 + +/* Version number of package */ +#define VERSION "4.32.7" + +/* Enable large inode numbers on Mac OS X 10.5. */ +#ifndef _DARWIN_USE_64_BIT_INODE +# define _DARWIN_USE_64_BIT_INODE 1 +#endif + +/* Number of bits in a file offset, on hosts where this is settable. */ +/* #undef _FILE_OFFSET_BITS */ + +/* Define for large files, on AIX-style hosts. */ +/* #undef _LARGE_FILES */ + +/* Define to rpl_ if the getopt replacement functions and variables should be + used. */ +/* #undef __GETOPT_PREFIX */ + +/* Define to empty if `const' does not conform to ANSI C. */ +/* #undef const */ + +/* Define to `__inline__' or `__inline' if that's what the C compiler + calls it, or to nothing if 'inline' is not supported under any name. */ +#ifndef __cplusplus +/* #undef inline */ +#endif + +/* Define to `int16_t' if or does not define it. */ +/* #undef int_fast16_t */ + +/* Define to `int32_t' if or does not define it. */ +/* #undef int_fast32_t */ + +/* Define to `int64_t' if or does not define it. */ +/* #undef int_fast64_t */ + +/* Define to `int8_t' if or does not define it. */ +/* #undef int_fast8_t */ + +/* Define to `int' if does not define. */ +/* #undef mode_t */ + +/* Define to `long int' if does not define. */ +/* #undef off_t */ + +/* Define to `unsigned int' if does not define. */ +/* #undef size_t */ + +/* Define to `uint16_t' if or does not define it. */ +/* #undef uint_fast16_t */ + +/* Define to `uint32_t' if or does not define it. */ +/* #undef uint_fast32_t */ + +/* Define to `uint64_t' if or does not define it. */ +/* #undef uint_fast64_t */ + +/* Define to `uint8_t' if or does not define it. */ +/* #undef uint_fast8_t */ diff --git a/lzma/bundle.json b/lzma/bundle.json new file mode 100644 index 00000000..0c1bf6b7 --- /dev/null +++ b/lzma/bundle.json @@ -0,0 +1,33 @@ +{ + "name": "@ohos/lzma", + "description": "LZMA utils is a traditional data compression software with high compression ratio. LZMA utils uses the LZMA format.", + "version": "3.2", + "license": "GNU LGPLv2+", + "publishAs": "code-segment", + "segment": { + "destPath": "third_party/lzma" + }, + "dirs": {}, + "scripts": {}, + "readmePath": { + "en": "README" + }, + "component": { + "name": "lzma", + "subsystem": "thirdparty", + "syscap": [], + "features": [], + "adapted_system_type": [], + "rom": "", + "ram": "", + "deps": { + "components": [], + "third_party": [] + }, + "build": { + "sub_component": ["//third_party/lzma:lzma_shared","//third_party/lzma:samples"], + "inner_kits": [], + "test": [] + } + } +} \ No newline at end of file diff --git a/lzma/docs/rom_integrate.md b/lzma/docs/rom_integrate.md new file mode 100644 index 00000000..d82a5dc9 --- /dev/null +++ b/lzma/docs/rom_integrate.md @@ -0,0 +1,120 @@ +# lzma如何集成到系统Rom + +## 准备源码工程 + +本库是基于OpenHarmony-v3.2-Beta1版本,在润和RK3568开发板上验证的。如果是从未使用过RK3568,可以先查看[润和RK3568开发板标准系统快速上手](https://gitee.com/openharmony-sig/knowledge_demo_temp/tree/master/docs/rk3568_helloworld)。 + +## 准备系统Rom源码 + +源码获取方法请参照:[OpenHarmony源码下载](https://gitee.com/openharmony/docs/blob/OpenHarmony-v3.2-Beta1/zh-cn/release-notes/OpenHarmony-v3.2-beta1.md#%E6%BA%90%E7%A0%81%E8%8E%B7%E5%8F%96) + +## 增加构建脚本及配置文件 + +- 下载本仓库代码 + ``` + cd ~/ + git clone git@gitee.com:openharmony-sig/tpc_c_cplusplus.git --depth=1 + ``` +- 三方库目录结构 + ``` + tpc_c_cplusplus/lzma + |-- adapted # 存放三方库适配需要的代码文件 + |-- docs # 存放三方库相关文档的文件夹 + |-- BUILD.gn # 构建脚本,支持rom包集成 + |-- bundle.json # 三方库组件定义文件 + ├── README.OpenSource # 说明三方库源码的下载地址,版本,license等信息 + ├── README_zh.md + ``` +- 将本仓库文件夹拷贝到third_party下 + ``` + cp ~/tpc_c_cplusplus/lzma ~/openharmony/third_party/ -rf + ``` +## 准备三方库源码 +- 将源码下载到lzma目录并将其解压出来。 +``` +cd ~/openharmony/third_party/lzma # 进入到lzma目录 +wget https://tukaani.org/lzma/lzma-4.32.7.tar.gz # 下载三方库 +tar -zxf lzma-4.32.7.tar.gz # 解压三方库 +mv lzma-4.32.7 lzma # 修改库外层文件夹名称 +``` +## 系统Rom中引入三方库 +准备完三方库代码后,我们需要将三方库加入到编译构建体系中。标准系统编译构建可以参考文档[标准系统编译构建指导](https://gitee.com/openharmony/docs/blob/OpenHarmony-3.2-Beta1/zh-cn/device-dev/subsystems/subsys-build-standard-large.md)。 +我们默认三方库是属于OpenHarmony的thirdparty子系统,如果需要自己定义子系统参考文档[如何为三方库组件中添加一个三方库](https://gitee.com/openharmony-sig/knowledge/blob/master/docs/openharmony_getstarted/port_thirdparty/README.md) +在OpenHarmony源码的vendor/hihope/rk3568/config.json文件中,新增需要编译的组件,如下: + +``` +{ + "subsystem": "thirdparty", + "components": [ + { + "component": "musl", + "features": [] + }, + { + "component": "lzma", + "features": [] + } + ] +}, +``` +## 系统Rom中引入三方库测试程序 +在OpenHarmony源码的vendor/hihope/rk3568/config.json文件,对应组件的features中打开编译选项,如下: +``` + { + "subsystem": "thirdparty", + "components": [ + { + "component": "musl", + "features": [] + }, + { + "component": "lzma", + "features": ["enable_lzma_test=true"] + } + ] + } +``` +## 编译工程 +在OpenHarmony源码根目录下 +``` +cd ~/openharmony +``` +- 选择产品 +``` +hb set # 该命令会列出所有可选平台,这里我们选择rk3568 +``` +- 运行编译 +``` +hb build --target-cpu arm64 # 编译64位系统使用:arm64, 编译32位系统使用:arm +``` +- 生成文件的路径,可执行文件和库文件都在out/rk3568/thirdparty/lzma目录下,同时也打包到了镜像中 +## 安装应用程序 +将编译生成的库和测试文件放到板子上运行,为避免每次将文件推入设备都烧录整个镜像,我们使用hdc_std工具将文件推到开发板上 +- 首先将hdc_std工具编译出来 + ``` + hb set # 源码根目录下使用hb set 选择产品ohos-sdk + hb build # 然后编译,编译出来在out/sdk/ohos-sdk/windows/toolchains/hdc_std.exe + ``` +- 将工具拷贝到Windows,可以为工具目录配置环境变量,也可以在工具所在目录打开windows命令行 +- 将原生库测试需要的所有文件打包成lzma.tar,并拷贝到windows下 +- 将文件推送到开发板,在windows命令行进行如下操作 + ``` + hdc_std shell mount -o remount,rw / # 修改系统权限为可读写 + hdc_std file send lzma.tar / # 将文件包推入开发板 + hdc_std shell # 进入开发板 + tar xvf lzma.tar # 解压 + cd lzma # 进入lzma目录 + mv liblzma_shared.z.so /system/lib64/ # 64位系统需要将库文件拷贝到系统lib64目录, 32位系统则是lib目录 + ``` +## 运行效果 +程序安装完后,我们通过运行如下命令测试了该库常用的.lzma文件压缩和解压缩功能,并和期望结果做对比,内容一致,总体运行结果如图: + +![results](source/results.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) +- [OpenHarmony源码下载](https://gitee.com/openharmony/docs/blob/OpenHarmony-v3.2-Beta1/zh-cn/release-notes/OpenHarmony-v3.2-beta1.md#%E6%BA%90%E7%A0%81%E8%8E%B7%E5%8F%96) +- [标准系统编译构建指导](https://gitee.com/openharmony/docs/blob/OpenHarmony-3.2-Beta1/zh-cn/device-dev/subsystems/subsys-build-standard-large.md) +- [如何为三方库组件中添加一个三方库](https://gitee.com/openharmony-sig/knowledge/blob/master/docs/openharmony_getstarted/port_thirdparty/README.md) diff --git a/lzma/docs/source/results.png b/lzma/docs/source/results.png new file mode 100644 index 0000000000000000000000000000000000000000..3daf46bbe228d0e38ffc2dd4690b838ad21c7b8d GIT binary patch literal 21452 zcmc$`2T)W?yEQzZf(l4ba#Es_a}GxZBqJa>3zBn&A*hIeB*_^BCFh)jA`BVH8N>lb za%RYUJ$TM}eeZeiz5ieJRee>~E*SRg-MhPYul208+MuV3PjGIM-Go3OI5N@_Di8>| zA_RiAcO4ykBJrA+1p>JXk&$@#%sqK+My`N%!h`W}(_Dqt@a~N&v%Gt5fuA|!>8b9l zb@|`@Bch?CqyGK-kkFS>*U0ENzqa_Xa1p8Uay&Z31@5(HJ6t3VeMax8 z`;(fGjhpxo$RGCJ>*F^-3&+{t2tgp%1^&ll&69kJy_C(hso%`lwy-)dJhh zr%3U${)=w#akGZ3uwb}>$fi)52=vThZ5>zKV7?y$DWPWeubaC#^F6C?K7peCRqu6N z9H#l49A6y4=1x-V&Sp2gtj?*|n$Hmz8|2JPL7F%b= z%S!aupW#w9pRbjVg^QavxYt?or8b#+ZN&#t`EHr@Yk1>`dT)2tK5^S%>90ppR{k9E zdY#tvEfrt%{KKZ`k0U+b1ATi1TfR}T&$}D0aWnp^(ycf7Smty6t&i!(AP>tdb51VK zyPHqDeUA~D7iZN5C+y;fttE#kcI>Bc+@_PcV#gSZA$_i+gOfCH&E`Sk*E;DZYu@e8 zshfQcI`c}HAjjcbQq

T@zlD1^E}-v~XkyUd zKH^rlXHVfi>jKx^QKdQFT1Pe`yaqRYYAx5?Pan=5eLqMOuRqJK6xsCIS=)z|Dh2%< zO7lJFWGvSA+CB(K8yX^>EFYtWiJc|~iVYhGTG0(Fr8eyzltw`y9Ck4&IOjjut;9VT z?3`lKM4~RhFG$f+AtwS_q!u>Nob!o^LtXeLFmDt)4h37W>&BKweGAb+ElE6SYVckR@`lT;4yMCVr7E z!yh5;eK2vd8&jhcC0sbv8?ZYy_i49(cC3AMxlwn%+x^@fX^%WR{mzLmda^KDsV>tx z$P>=)SugCe!M>{h^A*KRTxzc@2_(#TMtdgQXYXUU*zr%)VIbV6!hRflLaU}W=eb%q zWmZ$JUOihpRhu?i-L#e}<~`7Ow(q!#^}b=hX0cU8ojSsCPUHI(!fGf}j8&4Uv18d( zsbT5lX~SxR=l;sP@lOxrJaWlnjQnLC)-@jg4vr6e+09m+9pl66KdxLFRY$*yqFi;?-Smf7He(A ziMOiV4E~YY3_TYKVzY%zW}xkYamn}65#1E(%iq{N$$u)0?Gk)%CTUeCSMQKdzd3Z{ z75kd7VwEfzl~_GvJj?lp)^%rOv;9X3R@QlXV#%B<0#&?Z9L*;)o9An0;=f;aKNYP<VFS zg!qkTeX2AW+3!x{^?gqfvn<}nyGQB#Zq((|i@~9~Y*DC!vsv$V(4v8IC0qWnT2Xb|v3b2EpIIwm-xB_ZG6%Akv}Dp{MLi{6Jj~I9W&g(_jKDV70WI@BA3^xA}JWXWwsE1 zrRjJj-?CCxV&i&G^{l5=I@)f2ag*oS@xGn!iB4jLiO=4^6J%)T^hbmqBFc;>LCvRG z{B+h>>0_c>Ws!rX_PuZT9)2_Kwy%&!N>LNx;kVbs&W_9^!e6xQDy;EoiFx(pA(X;& zQmKC?YSZJ$g{S#02fv+?L>ldQE0s(!(3a;HzyIi>f(3z9x#pa#EQ=CgIX%?JB%(;oi^>dbAm+lH@? z=6=j#^ekjoIDVi7v-a^>`INV7>XkC;W_=e57@POXTfg&D`|c+B;!Ppb{Z5S3?29dE zID%;)jXY%x>xziFw4WK@mu%njZL6IkY#3a>vmQ6)$fVtbC%%t5H~G`-Mmr&oW**PlQSN;R$dd10 zV)1;9cx+MAXc~r`-3nPlQn*=hwal>VZlqG!JpEE_R%2X-*1|~%HR4cmj`uz(t`!N2|}PFL;}`N!51&nw?|5!D#~g!!%RD>wL!S0?{;7N}J|;$ak_e z9t45B94eE&!qAYrk(3)As{z>}yku5Y#+w?LfDM^lcY#3g?En8B!vlY!R-4i&G;j^} zoDnq0A1(KW|8?|uM5&=en4mz-RXeD1RA*)q;?yS?r&c+b*C8xT3xTu{sZaWQu?~1u zk=zct`tU9nR9IXbe5_3+NfY6F3iEZQmU!gsBnV|ABjOkMsK)v!UqZrhQFiL#O>oDm zvQNdfJQNfRlz{a?cLD=RG?H8-?Jw>&J`=%gXc&|ibr^6+Ze_fM>P?bYfL5X*0|P1Y z6T>t};YX&f@d;|*7i5{IJDwFb4kJi3x+Nva#^`N^D1!JKoh!@3ta zaa(itkU|grLF-l%v0Mg91jw|@=NVIFXKnT7#vk41x*&$-#ZI=K>Eb{jv*z#z3&~FJ z-UPl)R*HLa<2JtJ$7GDrqWV>g%BqRsq9T>7fla+pq1eX~>X?*Zv`V0B6Xj-&#pmXH z6W?!_TO@<=GPV{s2ZNShMN6dlqc7Q#q=XHbnnBXM4;PN+zmRb={J`+{S_&8W##W37}& zb=@PTqM17zsY`rdkjSn0Sm^7TYp(?t*?o=fYV>2pY#n%51fIn%(YP>{=Kg*bQ+PlN zM|;#!vVL%GZ|G2x?E-yc$5gTdA0ctbnqGq)eXqL9ZBI36G^lXY6q(uoTi4 zb>;egb$%8S|E1&(s9(Hg4{(XSenJ9R$-vv4UtSxrxU*z4$Vv z(eWp;lBh?-&gOc zKQL<_apaSLdo9i&+OK&Jh<5dnFuGrec-i%+^o_`%5k%M|(r#zP6+M?`y!vgjQb@JG zjgg>EM#2<&Ix^ANLCUAh0v%;;gFDRJiGI#4*Qi1h!7Z&)#%0WNZkb~>%tlYJ;o-R6 zlruuSLWH?g@1-^3ERw324X^VU8}eH<+LXF;^(LabjoUK%$F@67b~s(8zG7W~K*}SU zd5_Ae`Y7%-e=PcG@dVF0OF=~hxVW`yKmBO9lVy2PTTY4`9qLUitSyi+S@91;WLI#k)WUS<#wE_A3atdg%)+-95+tey;?FRso!L+Lg64m^dQ3dS z+g%h;uNJ1jm*KQDVatn^ln5KKAOU}MdHmW~P42D2p!?>bc@v4Hf%7Oub00}RG2v%E z(~;uOFXkBTxr(Kw26Ru97T6Z@_l-&RD)=U@@Q&8c9g_PbmxK~U`m^pRC|7*Eg>z-Rx)RVp z7`?_+Np2hEfZ0lI?M7&CUxnPm-mzPpwUKoLILbp^ows83_jcfCaDmv7(wiwvaFGPo ztP0Ond00jwp0rhXi+t?rJHwR(Eu|pg8&+*`-0l6w=)ErRw7?HbRvIKx-Ddom+STe@ z)-qFun%`S&j2d{`Uvp~BdcJ1@P(l#;_DO=>A3pWIBvH&UTGh#@1y(4EJBv0Pf^ORQ z6t?hg3L&=s&M+hmW?s{dJ0UGyb8!kwv>^ZHRcJ1D9@6Y&CllLmOUB#nFg*~jVtE#E zHj^szXw8drRC3pBexKM%HzZ*rK5q7h;rrID`7bEIbqqmK8?aO3kx&t+t*yQAPq++)sfIU`-0EA!fBB|$-| zShOYlNITJVhwV8RuU^yFsN7C0gp$?D4P<@-r4|^;B=pQ{)P=#%mIrH z7^9i4O&^=}O3?l+d;4PT{vW1R{spRiojY=&dlG(K8!NQ7b;#j8H%nyy0TM%Db`LL9 z`cC$yzs*55^D^XW56dvx;p=)lVueS%kQSBk3CQWPrqwFsC9Y9(-IZE5WyA2wsVm_d zEk}u!L`?h4ZN6>SAWvRl$fNWvpeg((&a{gq##zfX!*?6tZ1&UqE0C8jci+@Wca+B} z^RQ3}2?9W`ull6UuWj~O8(`w?uc@NY(UX<%#Ok=7q|Xw15Xcti-X$IDRhKggK_pGg zPotkYW)j+(@J$$AgFwEU^o*^Dd{iNU8{z8#Ht`*5-f|V(CFvJW>9gsn;n)XvX^Cr3 zI<)V5KtMz0D5gh6FE4Q?)R9c{XAxkwb6-rr@p_Fzp{>aj-F5VdDp7CCZBEc0>Rtsv zM|$mP^(xzy+^K=&csOjWDSO8W3#g8P924Ne=(a>FH23;%=PUra$kB7Wg8J+RPW*p{ zcE&p^BydZ)#Slv2d*F=w;P?9pq5JHtELDKk2`}Do(X~-q(8_$*857%O*J#2{0zZl# zZ>H$E@OSE~Ey#;emlTudQba=}cgJ+0$(?`dIvO6l0zupQIesHPFcl`XzBg_A@REnl zsAYGqQF2-Ye62}jWs3ZxYC!Xd-cc+`h0e|DCJK68)Y(KU9rZ;;LpqPLvaVM}bU!QY zzXO@>SIyTM58)*v!i^0x;TyGcMqE5s!&-J0N(ozC`mEyM6{gnMu@Dl2j55@<8LfO; zd?y?R-*)f2E0f!=(HkcOuE{7mE=U4VFZ-nK7GL?9L_>8UckuJONG(Z@eP=V>P;%Xa zUOW$9?yF!C9dT~(Tr+{REJG#WiJwiZ)R!}V2!3CTsX`WNMNMcnD^JZG`Sqse2MMcJ zJ{5QlW{Kj!_7g)chBS}%k81}D$-6Cm`i3FYC80<6U`%H1wJg-;r?()7W3)7mQ?Eex z{fi%uLj!zy(lT64{RA;WIv3*-olkB|b-b{Qg?Gd-E6_}JRF+FB5KJ?&^>=TSgdfe5 zhiseF#z($!7#XeVbLHVhzTlK$cAKJNzn6&a{UKX;j396?j&ig#1I4}Ka7lwA^o_m;i31@^+5y)?uI#1 z(x&k8(kE)6G+amph=HrqfWb*SS+_Idi z-Xc6IW#}Y>?nXK^9P=eac*n#qG~Zc50x)`h8o$4Jf%TUh1eKGwan!ioa9u3CWZv9W zVn?24%G^1-lLQch2lPZ?1chXR@w&C;OWd5Kc+J|0qGn5$e8YWu&f$Eu=h0mrE}aFB zq>6-Osz!26i*mKFo!U#}(OQyB*@h)sf0zp(S@A$IvM5&E8=o8+>Zud*WEp9?|M}C& zHLp_5$H~-{4%N1gvpe=(_cgLr1B*vFs$>(hL0Kfp^dgKH5%?2zhcW&tymvjA%Bb2S zKI+yM16hDjpP=L;iN}4}DW^s>8RpSLEt9HldOPxK{CreX%K+P*Kpls|b_J<-LSZAz znjsEsX=eS;Gw#>u$uRfZ=peLLKY567jSh#CBThB@BzSTvd$U|!Vz@$mHp@m!DQL=s ze&$?pza0t+3>Yo-r@Cr<#XM#SXo7VMNq=@u%EaezufKpDpGUXw4q=dW`5YT>5vJcm zp1A^8mD0pnY_?#u4Nt$S{Kaa*it?ug?k{eYO0KeodX0CJ&QP2!zQ_uVXlre3xLLwg zd|1q2r3GPXKcA5zI;}Y~M|8|Q>t4R2Y#~QjE%XU1W^>nBkZ0~mWZ6tgv85T-Q|3e&4r%9jTI^O$tFb=9{=%7hHQSq%&r8L@l32{4`k9lZw2uI;|8?0%57= zWFe$*1gAD5b;Nu7iz6flx91Fxup$h{^(5)EBpSE-=vbLFaE000;P*8`aBbs$4E7FCX7sH2Jpa& zk;M>U5zV%dU%^?#SKgYb$B=sMVV1n8n8$ph>V&+g{!fnf-KZE*8(NKw&JJ=_rM*4| zcAovOl5rU_n`{E>QibFX_<3bY6hzCr70UvK|`Z~KSA1=mJpMjb5| z8+b$)^d6d8`ec%{yEo}#4+Kg$l<@`IB%KYmHLC8T-EA>V-!LS4&IDjhpVG6|tbKud zvT2(D$OCEt`XoILLgOzmAdp+jhe?M3jn)Vs0b$`P#c#)C#$ks_-ex+?C}!4}IZpsR zFVjA#0|5mMal<9zy;)(lxu%G-BlxnbjZC5K$+ZtarU(lbg&q_jN2q5?Km6#?uQCPj zD}encI>$myf1&fE^GkHDno|RE#rMD^E0xr@)Z zzRRba4CKIAdm3uxLOaFq5U-YoZ|G1SmNt~EcdjuM&b7D*#OXb zF<$amg0^XZ+t+F2L9GvXfj?j$yH}Y!0QzE=Hvw<%1zf=cTeN*E7XnHQH=UgEedxNlVfV%bEEp-nxLB%$n?0)=3B2 z7BS+Iz)z;y1O9{9bA$!DZqy|iqvx^$Ti4upoUhuufUN`8YAPSVPFm`g9_jJ0guNZL zJ`Bo^tk(Ip;9h{DB=f*tTmz6f{z-RzN<=cvy^MQ^p+)5{07~v>zp7l_sQbO_sSI1h zix_$M1kA!Us*`hEpF=rBxLFj=M#;R%6`-9&P_a)_wvfOF7Ccb3eS}TYx{A?YDwvfe zkKq_S5jIm25(ml4@J8Kn2bO$Q)=%&tT}A4MoRLyPloZqIUiR>w-V4V}Qrl1Y@Vt>P zt(4E@+2V3Ja@Pf8M;?5t2P{REX>-HE7W8vNscEZ9#z~S+$_6!|0kbX8lZtv>`2ybrE=ir(>2^jjYb5e`f6}X+B9EWlen2}# z5&9_iN6b>#+ftkIwC-V+f(p>``u3&^Kk8fO=fTE|;I@VaCDYvh>m-}D)~7TUA*0Xe zI6Bf|8J3$XmoMKu9WU_UNACgtnCss5AgzfX7PtAbbJ60 zwlJ0N6dyvDr#$u7}G7m|`SaQ-*^t3*r0m0$a(RS$d zgDHD{dV3@fXr8dnFx_YGA3F`Y&*)xR58WrsI%(ocWg%9Lyc^PQ2!=ns{KUpkV}8iX zp;AqwqiUwex)I)Z6YeMmB_fctG-E4@Iw7m~kd9oT- zPT^GCI`=r7jn7QZk3y%Tnc{i!LxEjS^vjlb^n9ygiIYb9GjufNqUS4X z`U}`e_hUs@V}5Mc*xr;aO~}-L5Ya(O_dqLwldRdsC3G@V;)|$K(F}3r@uQg^Enac# zK)8hsEj#P-Z+d##i>}QCzW!t0tJYmAR7HeJX<;wo({Q&85-(d-nogwH70TfFw$VQQ z%?YEbk_IbmS(nc7t<6g9*JB4oK)y*Toq{A#-#X4vvCD<0_2kFwzSw*V9!aHmAvGJ^ z)RWscIx%PU(?%LS5(7VUE_hr4n!J`gOH40w-9{gM>M^O<+NUm<+vp7-?3%9(9rnlT zj?!`MKZ5P5YLo0w8yDGGXZU;^t)zgJ!`v@vV2_UbyYiHgnMy#q%+Kc2IWz^1j7k##ukiGw? z!q%_tgF4r97y6_I>o?`;uIY6?szzM-*G*Q+_XNUt*OJ<|9L4;*yAuL!7lSe4ymgfO zB8LSZog`6jrmd3eY|UN|Q)8`MyrOqb1SZ0%rWoUk|6MF9Fa00IqLb~lXIS;Jv-T3U z{`)PWu40Y8zf0s{tFTc{pZj=S_M~aC{W23K`jl`>WqhD&ZttM|lUec!k8ND#HK_lg zIZ~B7JtBBZ0!T6x*-jC)VGRA{4;5iIhaD2v*fEo9RmBl3 z@X}_E?am7W%6~SNchz5rL1X&-n*}!~Afi&OygnupkG`BC#79{MUM^Wl?rxi%deqQs ziPc*Sv%nml7|Z7FKRIxNGTbQLZPO&~P4gc!Ft_J4tuxm545r)x<;Ds zX8wxhar=Vo>PntkM0JtqQHhsgH(7cg<-8?%?ecXEH@=KV`JoB4U{Wvd$%M;!G zuFJ+B%t>?a&b@cZbH_~6)j%gBv@N?v&+H^65whzgNKQ6EcfZY1KXv-}m#l<~{U2o| z7V1A`rER?5WTo-d{~#-owC*| zrep_OO?&iMr{jQXHYP{F$8aTRc4EOlE4AjQ3eU10$H$o*7h1q$Z&c-)@sVonL4Z?W zk=R)u*g5QcM4*(#z@98#n9DdFj$`aq_w)KhmVRB0m>tpMGgmwJne|&4L(}0(eKnKG zdgH^lR~rpNx}B_edqy2Jvy-D1rK5nh^B1?J*Ojz8**VZnYW+`A#=9PETPotN<4*JiQq3 zS9IGd?VH9Tb3L~ZMAfm(h4!@N+kG2=xMdsuS;^xD|I7pUK6f(ddmeY;zQzOoxHh0$ z2*ma$t+k<~#936}lfyw;r0+jWF`~Lvz_O~x>y=VZk5|P%U#d`f|3QT+bxRXD8rkQ? z=d2yX<{wnEI(>r#1ns3#@7qiX&T4Rj*Vpqi0Xc2~ynt@O13g9ru*SDq27qz>aW@?e zsBh@E(oxUzUyoiPoJCd7`o>Fdqch@wGfr84sZoPixSl*0FY^o6I8=Xz*d-bk;Ixy3 zO9kC`^zk9W+8^}4HR#l}taWV=o2}hljQ&8*@2ENXnINqwI>dcgwY__^s{&m+x+}$Qji9HcM%WQ<~^6*BeDs)b%(Cb$FZJ?*s)h3IE zpvKA!_mZ~IL^5kkmfn86nu)+uJprew;%<_ZF|*5sas= z6e_@RmH3;-V7^6qONQh>*m<_>g|m60FG@qxJ~A;{FeumN)Y8q2qf?IF(pjsQd8MWw zU&@fHT@X3Z@!dEx!GW#&bZbnHcy?%Ja>pCtm`MXIYbViQhLJ`zXM>_w?Dk3AiG|A- z#F`_&a_29#vf7}CAfZxh@Biye3RqtnTSVG*rc`ctX!;YQyqoEKacOHAVC}|)xgmDd-we0?QtiYUolix|_0iHb2#2VKtrJf| zbzaKw?4jiv+gT{~Kjf^rL75n(r$Y@3-qgCdP=0v7|56R6AQLc z@^^58v&7B{KmTG@%coz|2IVE9MWQOgN-8 z&Ly3R$=BJfwfz8Ag2e`(^E+K?%Z`=(P*z~NmCt>@q(k1i-QkOH7*DbJyb~u$nDqAS z&3w{fS*d~|lc=~*d%j_|XJg?Mu)_v!1~cQ2vqW&^Q`8)4%5=zqC#%v)@GN*uJ|JVD zc_$@^QxN03D%naCF|kV|m#sZ6qfH4T3+p&Tt8b+ehUFPaQzr|C{Tnw z4{S ziLg1C%52{^@kmv8keFe9vbnRbaa3~}zx3F#z;f!@2H6|? z44^#UspJ;UVL4o#Z9#a;!L?^Ps$}r4maS{`=y_3C59tT!+O#S~21te6?eFo#nhuiA&t4Z{ z_@?W&q0h;n!BlSQ37X;W%wQ(}gmf*rxeK-khn zmyKcQ=<@lX<@oUfy-P$aKM&*yo+E;hK0Lle`o6EK+xp*6Va`rH58M`w*L6727j~k~ z+a)PfrMi^;+{EEKfQq@qLEFXg0Rwb#8OiI=xk%hGIy&U)73R5^Aobmxj$}!j;Q=yz z%}376;bU%(Tc;l3D6eBZ?$N<~s_@DqUEcPqBA={X% z$Oa=(T2hS^MMm*^Fx-%M9o=Q;Vj+&2Sq;qpk@R`B*;i&N+a2dp3{L_Pzq_+CW9F6k zW+yA-5Pn4X$AabMc#@a+xE(MHke3B=Nm;|4A4{i()zmulfaMJI8wS~J4w{eX1JrCmSB_-a!F6sxH;^U}rHpta+rZlAg+z*JA;1|b!D}liVPl&+l6LGN4npJqi z=^JVlOVtsD51Sv9AGf$|=#h-I`tonR+V$@jrf7Na7NyQn3az79-pj&&xub{le z=OAwX@805p-0$9EwcjuG@?GP}LT7RFdDPN6{kSPdE+9o-*xr}quzUpghrlQjsQzA| zYvE6xusNvzx|VjL=H(I|VTr2O8w=_kYP^onM9l`GXjEE}VxuDMsK8 zyx(2kx&Np2@W>6&uS23s)w1P3sFvooWv_HC-jXlp@%nr@!9zU-N}Gz;0atwZrV}W* zc=qKe+M4}ZFCKr9E7DL^A5JgC)-(q`n*=25K4yzS&L#Emb^@^k>CUe zDE1}(7dD1DbbtoAWg=5}%gS#(=x;X<(r|+cIP5Fdf7^L)3$;KB4Hm|M9>v)wsN*x8 zPQff1;-n?EtPFy3pSJ=7r>l5?+MPgYYDy?jJ9v|Sl!WIqAWy0OffCAha)7XgaYrFG zI1z-w0F!#gippGpm&Dce)a_p^s=RfLlOfK)a&VmyaI0LcuyRjN5_qR0C;bihN-;`T zOfPq}{9jx;2+*t}@Mh#OVNI2$-^_Y-6@u#vJs5`87tWIDS-T-Y7o zD%|N#-Iv{V*X6&KIo=Zq#jAy_F_<~YixQ_v|75^VSWjFOkf?a>333$dt7MgOL2sa` zx~Rm?Q7tKRS>Cd{NQxrNWp~yXxLfWqbRA5;+oJEvdqax+W=HSFAs^O+wkeer+u!%hmF! zRg%K`3eyX+v)LDg#)1+iF5i?fAtga5%yut(^$dAy{{6~LWjqFQjv^wEJ8~pvSNJj_ zs~pk6ce1Vm_v9dv*zNVSuFg%i|2KzCA)p2I2K?s` zt96Y=*Q@LIX4-)6Y)mMm*6zWjBX6-knvlx&;W=nV6==qzx~@ypK?ybrr9Rfa1XiWt zEYS$v!ej&e0?k%qkbJqywck3N59YuNCi#rS-!h17L_Jp_nq$^w51rR*ubsC5YmDf{ zBt|!hc=&*jN9db3C;iPQq(8^_pUdhAAPlMDs%Vhe>u7VueJOh2EnQwicVnn|WEFzu z@)wLb-2NTLJeD}Z79WJ+6tq+#u?~K2~x*n*ySBsq)gcedLz-9DwRPwPF(7yp$U&?4x z%wuP@_+lZflG*Ha2`@9s1^9+qOVRjsHWD~f?Mwp_w5}-@ReTA>K0pVqmO)bSh=)`r zNBfmJ4b<6M-%xEs<0oFpFmm8Yo;r0hS^?(COLkGm3z%Rw$bohoIeSEN;4AZVSs13* zg9q}$iUI-ByWiU@>mqET?p`;UI@rr?gMm5c!^1!EM-fkJsPhP!_`LUZ@DQryMh}#G zSiu$V{uxEl$_aiWqVypWH1adYD#*=1uG9T9V)F|UQ=aAk1)epA+jZ>?sP{i4Kh60F z_+fKJ$vDa$iAH&SY7u5JObi;@OwId|jfNoz)#n$E92dlYIao&=odP0DOQjiIQ7bH$ z*%CI{^WiSMWwe(c-JRF2%1iVce{}V+x)b6e)8Kb> z?`?Rh#4mDV=2w=D{_-NS>Z(OQDHeKxEoCCJ@!`3+PZ<#s^>2 z!_?lQFz8!Oj?H(fD+1o(fgLu?&rwFEk*WHtC?NP4hx?)H4tTwrOu$(p;rKUfq17nj z3Hm+LTHh)r|M6M;#^Y{xM=r59fgQh6BV$z+A>A+dB_*nI4+=*c?az!4zPBBB$99o1LRx`$*J2H zKn~!itq;cE6?6R(M&ExQ9&v#oxk1ZEc`f4zZXiW!T@8j;c6Zra13P0(L8OEY6&k4> z?A79Qfw?V5t0^F`ljKF?q}MD|52KhK|I4iqef!Hsgmv~Udn-r2`PK-tTmICA3E{I} z=)@q`SPl%#Fd7&hN?9&8{VQYo|1nFV4YDM=V;5iDzcnOD8%0`!)Pm(b?&Q#x26&Hd z@7u}R;0=9-u{0IZBDMszjt(`(&MKji9$wyHqrUMlxz4o3D-f(dX_?d99V}H`*Kkfj za`OEulJLRJ-W5L?q}Ete*8+W(P z24J@C@fVmqSP@XqHs)-v^-2{D4$AoMnmwLGzxr^Xq~;hqY`a5KbHc%uw!Md=3|(b4w&VJA`>43sE+QAG=|!%=-r#_Hn{@CHXz2_^7+a2 zC)$O7n77Q#kv2&>bIo-SCBe?9PyE_g`?N~yQUH2W*Bd;l#QB&d{B>a1$zLn3CpKsj?O}rh>`?iq z>`<4ZTevFundaLtV=c=3Z@FB3Q4`N)^Q-&zoQ;r#!aHW*;tj?45yq(Cm=wRw$LQ3K z3IzZI!1t;vNn@I^Wf-FGMnSB+&14sBrqmo1W3Zy6c4ulD#Y?@R-dwP?H?}qBNbn8@4KhBlJqO7A5?_u1~Jgu$%_sMCpCN< zzD=z6j$wCV*kloBif1xZn_tD&GSV=~(-fIvqFWRa*IQ!qQ7=!qDj~zC-pyl%@@bP` zvw&=tsbJsf>jzn>nr8}vm0Y@sR69ktxOto9fm?3C_SRe?LqH4qwW`-=`T1x|O_#U( zYtVWq7nTcVIUb-bkb{+P-J;wKX#)qLaR3POg&q}xb@}`Iu;w68-?ZreUg7=v`EuXQ zuACzWYTHdA>Pv?=e%JGb-~F!VR~bOa!1ZeW64Whb^cW zD_P(dTx~5txes^W|Kc41{|z1b_4y?!QZwQ6?)b%u%B~tG|CJS;eMkoSy=u!GVHUDf z-WLC}h)BWI4uJqqq8a>KWk;SokViDAMneOtDw`NoP=-=-P$Qu7GZ>c5|6Iv&prc%c z4Sak-pvx9>q571AJHMqfM!hB?R~wq!&sh{3{EnwcZZb=dz|M2o(v13YchQ7bA&LVm zQ(=Z|pV`1$YbFa|wv)A}T}Ut|PlIT>dljetprcoX6t9?GdcUqL$aIh*bbQPDR?rx? z85GKfdQPa_3{M_g@tuBE?VKw7Rd-wf?^6X@la`NWY0v2kf!v0o{$BvF!N*3VIP4$g z`J{{6%s&_34WQq?zLe%Woot@Z~qI=~T*0MWI+|Uy`OBa@SKpsyxQmvm#Yb0D2{3|t?fGDU|gwQo^6_b& zduHuNBkQR(1Q#zBvkfZP@~5+un$-{H2?cd56ytvo6@G~gNxk{TAx}O^+z}KP5BB$5 zhQ?YPP>L^ghg;mrQ-!iCvWn&lRPxY@+I;{d7B%UlL8LljLil;2Yd6TWi}wB-g zF{;~S{v{=RImAZoM-!@_!*C@O>m>%YqQCXjde^A%Y(57YqTKAB@+a4&A3_Ph`H{H` zLL{=pa7sD=L%TLBLmA(XO!e>st>J@C=`wFabhC&Oh~jJ(MrRu096S<9c4B9l7JE=; zka==(!^w2b2ll!r6QuB~n`r@?p;}$FLJ$4`sTU`@*}cILTI>r{eB)|2h;I~)BzUrk zMSN4B;hKUM{|{^s6(ychAIs5`rJLSenDkc8XCG$0)#G;bFEOGh8*{96HuV1WJAHA% zX2bW};M)?4)H1S-$z*U-r1lnXmDT)9*JdNcEba8Q~up2xj}V`E9Y8{c6bAaje%ez%U`^5 ziM~V>mAA88c35fM%zU8qJ7roYaW(w2-OUzM4(>Vrv?Ri^oq zQ;!R}@|&cYD|8d;*@>N`2gk^ETU1=3A7m?5LtEC6bwj?4Ghdp1vQZcV&Y3!OsgPvi z!2A-~6HjIkfA3z>#Qwjtd&v$2u6n{3om57zyM(EwRB1R=X3A7W)c-7)6aMkbhnZ@OwA^#OD_ff$3pc93`q3} ztL8f*Nh&;&1B%A(=%`2!6NvP<<|G}|ELf7O`_15cXQd`tdCsoM*WUsAt?>S3fEXr- zv5U`&|ATtcvb6+qdBszABb*CF(YY@(%x0#d^c!>qga&;;QMti0*5*m`I>RDCvveoNvhY8!i^^@THDve zx7sWcPuL*DW#ClH{mdVO*f>jgDYJT9*_TAD!52k6=Q>hLJp+h3xJ=}WDvF9gzI1gm z3bz|kQGmZPjb8*Z&tdj1X0*V*h!_0LzCc6&UH2(0{^E^g*`z+tp!2kh%S_^{K!03$ zdW6Dj6&A!|XJP+HtW=`~vIPL(wMBn3y>i(U1$4s?P?F^K-rPePT zso3%r6w2&E8^y5aX2pNcOe5LDIYrn@Uc`$;U8Q*_yI5UUVb_g#Q}SnAL18pc(`02^ zrheDiAyha#fwkfx%GMx+;r<&BZNxIIAg{FjGz~I=eEU5Nw82#0VP32X+#bZ735je5 zKRSmO{CBf?_urh98ignkQ{I~zmLncR^ghp-+rTNVpLytZ$zmO>E?F%3<{IEF_Ba2ETbBeDp%|&?zp+>Z zpQ&!VC%Dabx$xFxOG6a_?ohh_+8)zvS-3 zb9rZt;;f72M(CJwvP>)Fbj0$2iADa~E9PUys=JWL82b&#`(!dl%utCpS6?~Zl|;wv zySJ7ASBP~X#Fb$ruUu5zwJ0>6G%YO1_$h$1P^iRNrp7eW zsS$JrT<$Ub;6nX~ViRL;|lo@HSmAc#uXqRJOAR7jm=L7j&f(WYh1(rMY=> z9J0OAqWR2~QlL;&9@$Si{6aUMj9w2%_}v$$q|GFYWbKpc%t(6$n7L-21f6dAjKaCYy4(nx)*^@tXv~vXv5w ziy_rFX?vXBA9DjD%EcxhYoCdsZ z`DR8)L<)~nZSuN|r?KI;PYL}=Y`JymoKkz7S`jQV(M46*i9D@v0o92WoIH)X!~<*Y z>WFGlnw?~q7&qO-){;%F1)klbEdirQ+~cdTE#XDoB3(9w^=5ZJhd%ip7qeN4^-yY8 z9#dx1>8U>zlW*9z0#)BqaHpkSJDJuBzf-O5Y(-q&tQBEv_|=a{FR`8GR{Xm|gqQ}= zxEBi(i(%APKYGqO`l4NcVwf4ya#7?E%QW6b3Fk>1tLYRs7KGGq1b2!p}6Ve%XO z{05thDYfcDm8=rq$xn-P4f;vNR|hKQC{G@8=&-c9U74eHW0a%eeSGHWwty*d=kTNL z5MiY49k>ElL}aWe6nfSXKU(%|XKnrXi!q3=JnPA$n?B#rw&pvJzZp3sJNu#sekU;D{(6J(H8|On}=ff*Uob`ZwiUxUTGfsKLPRu4f=Ei zsihicM5I(3DW^U<@pj0)Vn?Z#Xwx#CESY5^me@&TUH8KFnmQ#dFBf|yKGMlMR?*O< z-8CH%1%bbqdae`MfIjHN8a*xTO+=(9oM!&f*QZKaCh`s9Zt1#p%_$zCWaZE81%Aiz^gm6~cu`BuOG6 zcGppdubPd8H+|{+V5O^6`RDeam(0&NANEq3jEG{xm>Y5;Wo<~6~_~oRzE4w@9;o_;|(^kkxv^PY5Rg7uv zwzhp4`2Og`Cva5dA4}x$urdm3ErudCxM=4~M&gEMn zC$Mb96g$bR>t0sOiw%NcRJT1z?+t4jU$22AQ%GD)(tCs2=Ia>a#cD|v z@$Y$&*!+n>m~2TmG|q^Kab9g1sih!EZ?vk~rn=;{p+%Ez37>TxPtqH$;z_ODjbo>H z;bJ->N^seTA$F2j*S#|K&(EL#ozIC#YY(%N-NWh*o?Um^LAkcK@4;>df!$^kM8Y+j zw3!X#+4)I!v+IIq=j&rCwtiV;=lj$OcN!oPo_)^Hakyu}A_69sI?vse35lhC{TeZUEp&$HdOTbuHWx>bl#w!*qjhfEYdY z4NL$4fQzB20|0<0ho%ky0G?c=spGZb{)R?OYi}Pj2mk<(Q0UbG0Kk)rG<63LV^z}f zt&;-)01&rtdUY{u01W^Da98Y~pFjWi@Ba)wZyUFRg^d6JkYE_A0|0<0x7#g+Fy{1k{%ge>y!wC?wrHB@sZ?{KD6A>v2r Date: Wed, 12 Oct 2022 17:34:40 +0800 Subject: [PATCH 2/2] add lzma MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: 蔡奇 Please enter the commit message for your changes. Lines starting Signed-off-by: 蔡奇 --- lzma/README_zh.md | 5 +---- lzma/docs/{source => pic}/results.png | Bin lzma/docs/rom_integrate.md | 18 +++++------------- 3 files changed, 6 insertions(+), 17 deletions(-) rename lzma/docs/{source => pic}/results.png (100%) diff --git a/lzma/README_zh.md b/lzma/README_zh.md index 3b3ec67d..af18c222 100644 --- a/lzma/README_zh.md +++ b/lzma/README_zh.md @@ -2,12 +2,9 @@ ## 功能简介 LZMA(Lempel-Ziv-Markov chain-Algorithm的缩写)是2001年以来得到发展的一个数据压缩算法,它是一种高压缩比的传统数据压缩软件。 ## 使用约束 - - ROM版本:OpenHarmony3.2 Beta1 - 三方库版本:4.32.7 - 当前适配的功能:完成了 .lzma 格式文件的压缩、解压缩 - [License : LGPLv2+](https://tukaani.org/lzma/) - ## 集成方式 - -+ [系统Rom包集成](docs/rom_integrate.md) ++ [系统Rom包集成](docs/rom_integrate.md) \ No newline at end of file diff --git a/lzma/docs/source/results.png b/lzma/docs/pic/results.png similarity index 100% rename from lzma/docs/source/results.png rename to lzma/docs/pic/results.png diff --git a/lzma/docs/rom_integrate.md b/lzma/docs/rom_integrate.md index d82a5dc9..721e910f 100644 --- a/lzma/docs/rom_integrate.md +++ b/lzma/docs/rom_integrate.md @@ -1,15 +1,9 @@ # lzma如何集成到系统Rom - ## 准备源码工程 - 本库是基于OpenHarmony-v3.2-Beta1版本,在润和RK3568开发板上验证的。如果是从未使用过RK3568,可以先查看[润和RK3568开发板标准系统快速上手](https://gitee.com/openharmony-sig/knowledge_demo_temp/tree/master/docs/rk3568_helloworld)。 - ## 准备系统Rom源码 - 源码获取方法请参照:[OpenHarmony源码下载](https://gitee.com/openharmony/docs/blob/OpenHarmony-v3.2-Beta1/zh-cn/release-notes/OpenHarmony-v3.2-beta1.md#%E6%BA%90%E7%A0%81%E8%8E%B7%E5%8F%96) - ## 增加构建脚本及配置文件 - - 下载本仓库代码 ``` cd ~/ @@ -41,7 +35,6 @@ mv lzma-4.32.7 lzma # 修改库外层文件 准备完三方库代码后,我们需要将三方库加入到编译构建体系中。标准系统编译构建可以参考文档[标准系统编译构建指导](https://gitee.com/openharmony/docs/blob/OpenHarmony-3.2-Beta1/zh-cn/device-dev/subsystems/subsys-build-standard-large.md)。 我们默认三方库是属于OpenHarmony的thirdparty子系统,如果需要自己定义子系统参考文档[如何为三方库组件中添加一个三方库](https://gitee.com/openharmony-sig/knowledge/blob/master/docs/openharmony_getstarted/port_thirdparty/README.md) 在OpenHarmony源码的vendor/hihope/rk3568/config.json文件中,新增需要编译的组件,如下: - ``` { "subsystem": "thirdparty", @@ -49,13 +42,13 @@ mv lzma-4.32.7 lzma # 修改库外层文件 { "component": "musl", "features": [] - }, - { + }, + { "component": "lzma", "features": [] - } + } ] -}, +} ``` ## 系统Rom中引入三方库测试程序 在OpenHarmony源码的vendor/hihope/rk3568/config.json文件,对应组件的features中打开编译选项,如下: @@ -109,8 +102,7 @@ hb build --target-cpu arm64 # 编译64位系统使用:arm64, ## 运行效果 程序安装完后,我们通过运行如下命令测试了该库常用的.lzma文件压缩和解压缩功能,并和期望结果做对比,内容一致,总体运行结果如图: -![results](source/results.png) - + ![results](pic/results.png) ## 参考资料 - [润和RK3568开发板标准系统快速上手](https://gitee.com/openharmony-sig/knowledge_demo_temp/tree/master/docs/rk3568_helloworld) - [OpenHarmony三方库地址](https://gitee.com/openharmony-tpc) -- Gitee