From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-23.3 required=3.0 tests=BAYES_00,DKIMWL_WL_MED, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS, INCLUDES_CR_TRAILER,INCLUDES_PATCH,MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS, USER_IN_DEF_DKIM_WL autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 52D5CC47080 for ; Thu, 3 Jun 2021 03:45:55 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 1BAD260E08 for ; Thu, 3 Jun 2021 03:45:55 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229738AbhFCDrh (ORCPT ); Wed, 2 Jun 2021 23:47:37 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:44494 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229611AbhFCDrh (ORCPT ); Wed, 2 Jun 2021 23:47:37 -0400 Received: from mail-pg1-x52c.google.com (mail-pg1-x52c.google.com [IPv6:2607:f8b0:4864:20::52c]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 59477C06174A for ; Wed, 2 Jun 2021 20:45:53 -0700 (PDT) Received: by mail-pg1-x52c.google.com with SMTP id 27so4096695pgy.3 for ; Wed, 02 Jun 2021 20:45:53 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20161025; h=date:from:to:cc:subject:message-id:references:mime-version :content-disposition:content-transfer-encoding:in-reply-to; bh=yedFmQn0Zkbjxy4mO7XqdjrZypdfe0X9HbdCFI6/LlA=; b=a09qPfio5AnYq6e+92mOdHkTDCDGkNwaS4WcGWKWuoXMDbbaxOZdD+nUvPDgjO2RcD LRhug7UgQTsxB1QMGy83IsoCUbKKsIt+xuZMfFndEy8dOKPvm6HlYf7NHlym3biG5FNG 6vBvCwHJfdb4hKrHTu95E/UKibrvM9xKo/IqoKKCq1J65j/ZE/dZkU3XWB6S2K/amC6a hWfX5mLym/kr18ZpwgLIuDz4NxxxAdcii3piZi7MT+Etgsmy9IGiWbHQ0jGNLycW6PcA r5jXGbJOS2VpqhIPwBhN6bURL+wmm68WH3ykuFFgkjkrhLbCY4g1eykXViCNHJC6UIiP 2XJQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:date:from:to:cc:subject:message-id:references :mime-version:content-disposition:content-transfer-encoding :in-reply-to; bh=yedFmQn0Zkbjxy4mO7XqdjrZypdfe0X9HbdCFI6/LlA=; b=XvfvfO/0jBGTQ0b5o8AildNTpzr1EwVilhXGG3e30QPfyGlZjUHa/wBPoy0r6d//T6 KZdoaHkboYQBmV/Y0EesGpdtiMcPST9WNNj5eptonr/eqdka7GOsmkX0LMrQrTxtD8UT cdcbwCPI2AcM/bekiikHme0VfV4Ekkp5cnoNgxEfgSbSZTAA0t8e0kGK2GHXw+2VhXhj V12PU2ZEIgX/7z4evHiLS35u0s1Mw/Qv1gxCioK7pPEOeJyN97y7gSgffXWQEOySQo7w Kn2H2bxySFgX5CqNozuohzDcJF3V+r9YunFPRVlAUNVOVDPTaEHDyts+D40c7C6hD81W mbag== X-Gm-Message-State: AOAM532+/tPFcThIJeqwcNu/2jj81qI9pQWTVgbaBJoU9rIjaZpq4YPF Lox2S+Gybj81TeHSfeANuRv2Pg== X-Google-Smtp-Source: ABdhPJxKZP6N6JalunllvVftOhsCNR1kcXHzBSzhPiUjmPNxvl5h8Y5TTbTjqAl3j+B38RoZvvUfNA== X-Received: by 2002:a05:6a00:856:b029:2dc:bd34:9f7e with SMTP id q22-20020a056a000856b02902dcbd349f7emr31006608pfk.0.1622691949964; Wed, 02 Jun 2021 20:45:49 -0700 (PDT) Received: from google.com ([2620:15c:2ce:200:bd0a:b249:2e20:50bb]) by smtp.gmail.com with ESMTPSA id 65sm834700pfu.159.2021.06.02.20.45.48 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 02 Jun 2021 20:45:49 -0700 (PDT) Date: Wed, 2 Jun 2021 20:45:45 -0700 From: Fangrui Song To: Wan Jiabing Cc: Alex Shi , Jonathan Corbet , Paul Walmsley , Palmer Dabbelt , Albert Ou , Nathan Chancellor , Nick Desaulniers , Wu XiangCheng , Bernard Zhao , linux-doc@vger.kernel.org, linux-kernel@vger.kernel.org, linux-riscv@lists.infradead.org, clang-built-linux@googlegroups.com Subject: Re: [PATCH] [v2] docs/zh_CN: add translations in zh_CN/dev-tools/kasan Message-ID: <20210603034545.oe675lrtvtsvbedb@google.com> References: <1622638607-12314-1-git-send-email-wanjiabing@vivo.com> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8; format=flowed Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: <1622638607-12314-1-git-send-email-wanjiabing@vivo.com> Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Thanks! With a few suggestions, Reviewed-by: Fangrui Song On 2021-06-02, Wan Jiabing wrote: >Add new zh translations >* zh_CN/dev-tools/kasan.rst >and link it to zh_CN/dev-tools/index.rst > >Signed-off-by: Wan Jiabing >--- >Changelog: >v2: >- Delete spaces surround with English words. >--- > .../translations/zh_CN/dev-tools/index.rst | 2 +- > .../translations/zh_CN/dev-tools/kasan.rst | 431 +++++++++++++++++++++ > 2 files changed, 432 insertions(+), 1 deletion(-) > create mode 100644 Documentation/translations/zh_CN/dev-tools/kasan.rst > >diff --git a/Documentation/translations/zh_CN/dev-tools/index.rst b/Documentation/translations/zh_CN/dev-tools/index.rst >index fd73c47..e6c99f2 100644 >--- a/Documentation/translations/zh_CN/dev-tools/index.rst >+++ b/Documentation/translations/zh_CN/dev-tools/index.rst >@@ -19,13 +19,13 @@ > :maxdepth: 2 > > gcov >+ kasan > > Todolist: > > - coccinelle > - sparse > - kcov >- - kasan > - ubsan > - kmemleak > - kcsan >diff --git a/Documentation/translations/zh_CN/dev-tools/kasan.rst b/Documentation/translations/zh_CN/dev-tools/kasan.rst >new file mode 100644 >index 0000000..00add1d >--- /dev/null >+++ b/Documentation/translations/zh_CN/dev-tools/kasan.rst >@@ -0,0 +1,431 @@ >+.. SPDX-License-Identifier: GPL-2.0 >+ >+.. include:: ../disclaimer-zh_CN.rst >+ >+:Original: Documentation/dev-tools/kasan.rst >+:Translator: 万家兵 Wan Jiabing >+ >+内核地址消毒剂(KASAN) >+====================== >+ >+概述 >+---- >+ >+KernelAddressSANitizer(KASAN)是一种动态内存安全错误检测工具, >+主要功能是检查内存越界访问和使用已释放内存的问题。KASAN有三种模式: >+ >+1. 通用KASAN(与用户空间的ASan类似) >+2. 基于软件标签的KASAN(与用户空间的HWASan类似) >+3. 基于硬件标签的KASAN(基于硬件内存标签) >+ >+由于通用KASAN的内存开销较大,通用KASAN主要用于调试。 >+基于软件标签的KASAN可用于dogfood测试,因为它具有较低的内存开销, >+并允许将其用于实际工作量。 >+基于硬件标签的KASAN具有较低的内存和性能开销,因此可用于生产。 >+同时可用于检测现场内存问题或作为安全缓解措施。 >+ >+软件KASAN模式(#1和#2)使用编译时工具在每次内存访问之前插入有效性检查, >+因此需要一个支持它的编译器版本。 >+ >+通用KASAN在GCC和Clang受支持。GCC需要8.3.0或更高版本。任何受支持的 >+Clang版本都是兼容的,但从Clang 11才开始支持检测全局变量的越界访问。 >+ >+基于软件标签的KASAN模式仅在Clang中受支持。 >+ >+硬件KASAN模式(#3)依赖硬件来执行检查,但仍需要支持内存标签指令的 >+编译器版本。GCC 10+和Clang 11+支持此模式。 >+ >+两种软件KASAN模式都适用于SLUB和SLAB内存分配器, >+而基于硬件标签的KASAN目前仅支持SLUB。 >+ >+目前x86_64、arm、arm64、xtensa、s390、riscv架构支持通用KASAN模式, >+仅arm64架构支持基于标签的KASAN模式。 >+ >+用法 >+---- >+ >+要启用KASAN,请使用以下命令配置内核:: >+ >+ CONFIG_KASAN=y >+ >+同时在 ``CONFIG_KASAN_GENERIC`` (启用通用KASAN模式), >+``CONFIG_KASAN_SW_TAGS`` (启用基于硬件标签的KASAN模式), >+和 ``CONFIG_KASAN_HW_TAGS`` (启用基于硬件标签的KASAN模式)之间进行选择。 >+ >+对于软件模式,还可以在 ``CONFIG_KASAN_OUTLINE`` 和 >+``CONFIG_KASAN_INLINE`` 之间进行选择。outline和inline是编译器检测类型。 >+前者产生较小的二进制文件,而后者快1.1-2倍。 检测 -> 插桩 >+要将受影响的slab对象的alloc和free堆栈跟踪包含到报告中, >+请启用``CONFIG_STACKTRACE`` 。要包括受影响物理页面的分配和释放堆栈跟踪的话, >+请启用 ``CONFIG_PAGE_OWNER`` 并使用 ``page_owner=on`` 进行引导。 >+ >+错误报告 >+~~~~~~~~ >+ >+典型的KASAN报告如下所示:: >+ >+ ================================================================== >+ BUG: KASAN: slab-out-of-bounds in kmalloc_oob_right+0xa8/0xbc [test_kasan] >+ Write of size 1 at addr ffff8801f44ec37b by task insmod/2760 >+ >+ CPU: 1 PID: 2760 Comm: insmod Not tainted 4.19.0-rc3+ #698 >+ Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS 1.10.2-1 04/01/2014 >+ Call Trace: >+ dump_stack+0x94/0xd8 >+ print_address_description+0x73/0x280 >+ kasan_report+0x144/0x187 >+ __asan_report_store1_noabort+0x17/0x20 >+ kmalloc_oob_right+0xa8/0xbc [test_kasan] >+ kmalloc_tests_init+0x16/0x700 [test_kasan] >+ do_one_initcall+0xa5/0x3ae >+ do_init_module+0x1b6/0x547 >+ load_module+0x75df/0x8070 >+ __do_sys_init_module+0x1c6/0x200 >+ __x64_sys_init_module+0x6e/0xb0 >+ do_syscall_64+0x9f/0x2c0 >+ entry_SYSCALL_64_after_hwframe+0x44/0xa9 >+ RIP: 0033:0x7f96443109da >+ RSP: 002b:00007ffcf0b51b08 EFLAGS: 00000202 ORIG_RAX: 00000000000000af >+ RAX: ffffffffffffffda RBX: 000055dc3ee521a0 RCX: 00007f96443109da >+ RDX: 00007f96445cff88 RSI: 0000000000057a50 RDI: 00007f9644992000 >+ RBP: 000055dc3ee510b0 R08: 0000000000000003 R09: 0000000000000000 >+ R10: 00007f964430cd0a R11: 0000000000000202 R12: 00007f96445cff88 >+ R13: 000055dc3ee51090 R14: 0000000000000000 R15: 0000000000000000 >+ >+ Allocated by task 2760: >+ save_stack+0x43/0xd0 >+ kasan_kmalloc+0xa7/0xd0 >+ kmem_cache_alloc_trace+0xe1/0x1b0 >+ kmalloc_oob_right+0x56/0xbc [test_kasan] >+ kmalloc_tests_init+0x16/0x700 [test_kasan] >+ do_one_initcall+0xa5/0x3ae >+ do_init_module+0x1b6/0x547 >+ load_module+0x75df/0x8070 >+ __do_sys_init_module+0x1c6/0x200 >+ __x64_sys_init_module+0x6e/0xb0 >+ do_syscall_64+0x9f/0x2c0 >+ entry_SYSCALL_64_after_hwframe+0x44/0xa9 >+ >+ Freed by task 815: >+ save_stack+0x43/0xd0 >+ __kasan_slab_free+0x135/0x190 >+ kasan_slab_free+0xe/0x10 >+ kfree+0x93/0x1a0 >+ umh_complete+0x6a/0xa0 >+ call_usermodehelper_exec_async+0x4c3/0x640 >+ ret_from_fork+0x35/0x40 >+ >+ The buggy address belongs to the object at ffff8801f44ec300 >+ which belongs to the cache kmalloc-128 of size 128 >+ The buggy address is located 123 bytes inside of >+ 128-byte region [ffff8801f44ec300, ffff8801f44ec380) >+ The buggy address belongs to the page: >+ page:ffffea0007d13b00 count:1 mapcount:0 mapping:ffff8801f7001640 index:0x0 >+ flags: 0x200000000000100(slab) >+ raw: 0200000000000100 ffffea0007d11dc0 0000001a0000001a ffff8801f7001640 >+ raw: 0000000000000000 0000000080150015 00000001ffffffff 0000000000000000 >+ page dumped because: kasan: bad access detected >+ >+ Memory state around the buggy address: >+ ffff8801f44ec200: fc fc fc fc fc fc fc fc fb fb fb fb fb fb fb fb >+ ffff8801f44ec280: fb fb fb fb fb fb fb fb fc fc fc fc fc fc fc fc >+ >ffff8801f44ec300: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 03 >+ ^ >+ ffff8801f44ec380: fc fc fc fc fc fc fc fc fb fb fb fb fb fb fb fb >+ ffff8801f44ec400: fb fb fb fb fb fb fb fb fc fc fc fc fc fc fc fc >+ ================================================================== >+ >+报告标题总结了发生的错误类型以及导致该错误的访问类型。 >+紧随其后的是错误访问的堆栈跟踪、所访问内存分配位置的堆栈跟踪 >+(对于访问了slab对象的情况)以及对象被释放的位置的堆栈跟踪 >+(对于访问已释放内存的问题报告)。接下来是对访问的slab对象 >+的描述以及关于访问的内存页的信息。 >+ >+最后,报告展示了访问地址周围的内存状态。在内部, >+KASAN单独跟踪每个内存颗粒的内存状态,根据KASAN模式分为8或16个对齐字节。 >+报告的内存状态部分中的每个数字都显示了围绕访问地址的其中一个内存颗粒的状态。 >+ >+对于通用KASAN,每个内存颗粒的大小为8个字节。每个颗粒的状态被编码在一个影子字节中。 >+这8个字节可以是可访问的,部分访问的,已释放的或成为Redzone的一部分。 >+KASAN对每个影子字节使用以下编码:00表示对应内存区域的所有8个字节都可以访问; >+数字N (1 <= N <= 7)表示前N个字节可访问,其他(8 - N)个字节不可访问; >+任何负值都表示无法访问整个8字节。KASAN使用不同的负值来区分不同类型的不可访问内存, >+如redzones或已释放的内存(参见 mm/kasan/kasan.h)。 >+ >+在上面的报告中,箭头指向影子字节 ``03``,表示访问的地址是部分可访问的。 >+ >+对于基于标签的KASAN模式,报告最后的部分显示了访问地址周围的内存标签 >+(参考 `实施细则`_ 章节)。 >+ >+请注意,KASAN错误标题(如 ``slab-out-of-bounds`` 或 ``use-after-free`` ) >+是尽量接近的:KASAN根据其拥有的有限信息打印出最可能的错误类型。 >+错误的实际类型可能会有所不同。 >+ >+通用KASAN还报告两个辅助调用堆栈跟踪。这些堆栈跟踪指向代码 >+中与对象交互但不直接出现在错误访问堆栈跟踪中的位置。 >+目前,这包括 call_rcu() 和排队的工作队列。 >+ >+启动参数 >+~~~~~~~~ >+ >+KASAN受通用 ``panic_on_warn`` 命令行参数的影响。 >+启用该功能后,KASAN在打印错误报告后会引起内核恐慌。 >+ >+默认情况下,KASAN只为第一次无效内存访问打印错误报告。使用 ``kasan_multi_shot`` , >+KASAN会针对每个无效访问打印报告。这有效地禁用了KASAN报告的 ``panic_on_warn`` 。 >+ >+基于硬件标签的KASAN模式(请参阅下面有关各种模式的部分)旨在在生产中用作安全缓解措施。 >+因此,它支持允许禁用KASAN或控制其功能的引导参数。 >+ >+- ``kasan=off`` 或 ``=on`` 控制KASAN是否启用 (默认: ``on`` )。 >+ >+- ``kasan.mode=sync`` 或 ``=async`` 控制KASAN是否配置为同步 >+ 或异步执行模式(默认: ``sync`` )。 >+ 同步模式:当标签检查错误发生时,立即检测到错误访问。 >+ 异步模式:延迟错误访问检测。当标签检查错误发生时,信息存储在硬件中 >+ (在arm64的TFSR_EL1寄存器中)。内核会定期检查硬件,并且仅在这些检查期间报告标签错误。 >+ >+- ``kasan.stacktrace=off`` 或 ``=on`` 禁用或启用alloc和free堆栈跟踪收集(默认: ``on`` )。 >+ >+- ``kasan.fault=report`` 或 ``=panic`` 控制是只打印KASAN报告还是同时使内核恐慌 >+ (默认: ``report`` )。即使启用了 ``kasan_multi_shot``,也会发生内核恐慌。 >+ >+实施细则 >+--------- >+ >+通用KASAN >+~~~~~~~~~~ >+ >+软件KASAN模式使用影子内存来记录每个内存字节是否可以安全访问, >+并使用编译时工具在每次内存访问之前插入影子内存检查。 >+ >+通用KASAN将1/8的内核内存专用于其影子内存(16TB以覆盖x86_64上的 128TB), >+并使用具有比例和偏移量的直接映射将内存地址转换为其相应的影子地址。 >+ >+这是将地址转换为其相应影子地址的函数:: >+ >+ static inline void *kasan_mem_to_shadow(const void *addr) >+ { >+ return (void *)((unsigned long)addr >> KASAN_SHADOW_SCALE_SHIFT) >+ + KASAN_SHADOW_OFFSET; >+ } >+ >+在这里 ``KASAN_SHADOW_SCALE_SHIFT = 3``。 >+ >+编译时工具用于插入内存访问检查。编译器在每次访问大小为 >+1、2、4、8或16的内存之前插入函数调用 >+(``__asan_load*(addr)``, ``__asan_store*(addr)``)。 >+这些函数通过检查相应的影子内存来检查内存访问是否有效。 >+ >+使用inline检测,编译器不进行函数调用,而是直接插入代码 >+来检查影子内存。此选项显著地增大了内核体积, >+但与outline检测内核相比,它提供了x1.1-x2的性能提升。 检测->插桩 >+通用KASAN是唯一一种通过隔离延迟重新使用已释放对象的模式 >+(参见 mm/kasan/quarantine.c 以了解实现)。 >+ >+基于软件标签的KASAN模式 >+~~~~~~~~~~~~~~~~~~~~~~~~~~~ >+ >+基于软件标签的KASAN使用软件内存标签方法来检查访问有效性。 >+目前仅针对arm64架构实现。 >+ >+基于软件标签的KASAN使用arm64 CPU的顶部字节忽略(TBI) >+特性在内核指针的顶部字节中存储一个指针标签。 >+它使用影子内存来存储与每个16字节内存单元相关的内存标签 >+(因此,它将内核内存的1/16专用于影子内存)。 >+ >+在每次内存分配时,基于软件标签的KASAN都会生成一个随机标签, >+用这个标签标记分配的内存,并将相同的标签嵌入到返回的指针中。 >+ >+基于软件标签的KASAN使用编译时工具在每次内存访问之前插入检查。 >+这些检查确保正在访问的内存的标签等于用于访问该内存的指针的标签。 >+如果标签不匹配,基于软件标签的KASAN会打印错误报告。 >+ >+基于软件标签的KASAN也有两种检测模式(outline, >+发出回调来检查内存访问;inline,执行内联的影子内存检查)。 >+使用outline检测模式,会从执行访问检查的函数打印错误报告。 >+使用inline检测,编译器会发出 ``brk`` 指令,并使用专用的 >+``brk`` 处理程序来打印错误报告。 检测->插桩 >+基于软件标签的KASAN使用0xFF作为匹配所有指针标签 >+(不检查通过带有0xFF指针标签的指针进行的访问)。 >+值0xFE当前保留用于标记已释放的内存区域。 >+ >+基于软件标签的KASAN目前仅支持对Slab和page_alloc内存进行标记。 >+ >+基于硬件标签的KASAN模式 >+~~~~~~~~~~~~~~~~~~~~~~~~~~~~ >+ >+基于硬件标签的KASAN在概念上类似于软件模式, >+但它是使用硬件内存标签作为支持而不是编译器检测和影子内存。 >+ >+基于硬件标签的KASAN目前仅针对arm64架构实现,并且基于ARMv8.5 >+指令集架构中引入的arm64内存标记扩展(MTE)和最高字节忽略(TBI)。 >+ >+特殊的arm64指令用于为每次内存分配指定内存标签。 >+相同的标签被指定给指向这些分配的指针。在每次内存访问时, >+硬件确保正在访问的内存的标签等于用于访问该内存的指针的标签。 >+如果标签不匹配,则会生成故障并打印报告。 >+ >+基于硬件标签的KASAN使用0xFF作为匹配所有指针标签 >+(不检查通过带有0xFF指针标签的指针进行的访问)。 >+值0xFE当前保留用于标记已释放的内存区域。 >+ >+基于硬件标签的KASAN目前仅支持对Slab和page_alloc内存进行标记。 >+ >+如果硬件不支持MTE(ARMv8.5之前),则不会启用基于硬件标签的KASAN。 >+在这种情况下,所有KASAN引导参数都将被忽略。 >+ >+请注意,启用CONFIG_KASAN_HW_TAGS始终会导致启用内核中的TBI。 >+即使提供了 ``kasan.mode=off`` 或硬件不支持MTE(但支持TBI)。 >+ >+基于硬件标签的KASAN只报告第一个发现的错误。之后,MTE标签检查将被禁用。 >+ >+影子内存 >+-------- >+ >+内核将内存映射到地址空间的几个不同部分。内核虚拟地址的范围很大: >+没有足够的真实内存来支持内核可以访问的每个地址的真实影子区域。 >+因此,KASAN只为地址空间的某些部分映射真实的影子。 >+ >+默认行为 >+~~~~~~~~ >+ >+默认情况下,体系结构仅将实际内存映射到用于线性映射的阴影区域 >+(以及可能的其他小区域)。对于所有其他区域 —— 例如vmalloc和vmemmap空间 —— >+一个只读页面被映射到阴影区域上。这个只读的影子页面声明所有内存访问都是允许的。 >+ >+这给模块带来了一个问题:它们不存在于线性映射中,而是存在于专用的模块空间中。 >+通过连接模块分配器,KASAN临时映射真实的影子内存以覆盖它们。 >+例如,这允许检测对模块全局变量的无效访问。 >+ >+这也造成了与 ``VMAP_STACK`` 的不兼容:如果堆栈位于vmalloc空间中, >+它将被分配只读页面的影子内存,并且内核在尝试为堆栈变量设置影子数据时会出错。 >+ >+CONFIG_KASAN_VMALLOC >+~~~~~~~~~~~~~~~~~~~~ >+ >+使用 ``CONFIG_KASAN_VMALLOC`` ,KASAN可以以更大的内存使用 >+为代价覆盖vmalloc空间。目前,这在x86、riscv、s390和powerpc上受支持。 >+ >+这通过连接到vmalloc和vmap并动态分配真实的影子内存来支持映射。 >+ >+vmalloc空间中的大多数映射都很小,需要不到一整页的阴影空间。 >+因此,为每个映射分配一个完整的影子页面将是一种浪费。 >+此外,为了确保不同的映射使用不同的影子页面,映射必须与 >+``KASAN_GRANULE_SIZE * PAGE_SIZE`` 对齐。 >+ >+相反,KASAN跨多个映射共享后备空间。当vmalloc空间中的映射使用 >+影子区域的特定页面时,它会分配一个后备页面。 >+此页面稍后可以由其他vmalloc映射共享。 >+ >+KASAN连接到vmap基础架构以懒清理未使用的影子内存。 >+ >+为了避免交换映射的困难,KASAN预测覆盖vmalloc空间的阴影区域部分将不会被 >+早期的阴影页面覆盖,但是将不会被映射。这将需要更改特定于arch的代码。 >+ >+这允许在x86上支持 ``VMAP_STACK`` ,并且可以简化对没有固定模块区域的架构的支持。 >+ >+对于开发者 >+---------- >+ >+忽略访问 >+~~~~~~~~ >+ >+软件KASAN模式使用编译器检测来插入有效性检查。 >+此类检测可能与内核的某些部分不兼容,因此需要禁用。 插桩 >+内核的其他部分可能会访问已分配对象的元数据。通常,KASAN会检测并报告此类访问, >+但在某些情况下(例如,在内存分配器中),这些访问是有效的。 >+ >+对于软件KASAN模式,要禁用特定文件或目录的检测, >+请将​​ ``KASAN_SANITIZE`` 添加到相应的内核Makefile中: Delete Zero Width Space characters on this line. >+- 对于单个文件(例如,main.o):: >+ >+ KASAN_SANITIZE_main.o := n >+ >+- 对于一个目录下的所有文件:: >+ >+ KASAN_SANITIZE := n >+ >+对于软件KASAN模式,要在每个函数的基础上禁用检测,请使用KASAN >+特定的 ``__no_sanitize_address`` 函数属性或某个通用的 ``noinstr`` 。 或某个 -> 或 ? >+请注意,禁用编译器检测(基于每个文件或每个函数)会使KASAN忽略在 >+软件KASAN模式的代码中直接发生的访问。当访问是间接发生的(通过调用检测函数) >+或使用没有编译器检测的基于硬件标签的模式时,它没有帮助。 检测 -> 插桩 >+对于软件KASAN模式,要在当前任务的一部分内核代码中禁用KASAN报告, >+请使用 ``kasan_disable_current()``/``kasan_enable_current()`` >+部分注释这部分代码。这也会禁用通过函数调用发生的间接访问的报告。 >+ >+对于基于标签的KASAN模式(包括硬件模式),要禁用访问检查, >+请使用 ``kasan_reset_tag()`` 或 ``page_kasan_tag_reset()`` 。 >+请注意,通过 ``page_kasan_tag_reset()`` 临时禁用访问检查需要通过 >+``page_kasan_tag``/``page_kasan_tag_set`` 保存和恢复每页KASAN标签。 >+ >+测试 >+~~~~ >+ >+有一些KASAN测试可以验证KASAN是否正常工作并可以检测某些类型的内存损坏。 >+测试由两部分组成: >+ >+1. 与KUnit测试框架集成的测试。使用 ``CONFIG_KASAN_KUNIT_TEST`` 启用。 >+这些测试可以通过几种不同的方式自动运行和部分验证;请参阅下面的说明。 >+ >+2. 与KUnit不兼容的测试。使用 ``CONFIG_KASAN_MODULE_TEST`` >+启用并且只能作为模块运行。这些测试只能通过加载内核模块并检查内核 >+日志以获取KASAN报告来手动验证。 >+ >+如果检测到错误,每个KUnit兼容的KASAN测试都会打印多个KASAN报告之一, >+然后测试打印其编号和状态。 >+ >+当测试通过:: >+ >+ ok 28 - kmalloc_double_kzfree >+ >+当由于 ``kmalloc`` 失败而导致测试失败时:: >+ >+ # kmalloc_large_oob_right: ASSERTION FAILED at lib/test_kasan.c:163 >+ Expected ptr is not null, but is >+ not ok 4 - kmalloc_large_oob_right >+ >+当由于缺少KASAN报告而导致测试失败时:: >+ >+ # kmalloc_double_kzfree: EXPECTATION FAILED at lib/test_kasan.c:629 >+ Expected kasan_data->report_expected == kasan_data->report_found, but >+ kasan_data->report_expected == 1 >+ kasan_data->report_found == 0 >+ not ok 28 - kmalloc_double_kzfree >+ >+最后打印所有KASAN测试的累积状态。成功:: >+ >+ ok 1 - kasan >+ >+或者,如果其中一项测试失败:: >+ >+ not ok 1 - kasan >+ >+有几种方法可以运行与KUnit兼容的KASAN测试。 >+ >+1. 可加载模块 >+ >+ 启用 ``CONFIG_KUNIT`` 后,KASAN-KUnit测试可以构建为可加载模块, >+ 并通过使用 ``insmod`` 或 ``modprobe`` 加载 ``test_kasan.ko`` 来运行。 >+ >+2. 内置 >+ >+ 通过内置 ``CONFIG_KUNIT`` ,也可以内置KASAN-KUnit测试。 >+ 在这种情况下,测试将在启动时作为后期初始化调用运行。 >+ >+3. 使用kunit_tool >+ >+ 通过内置 ``CONFIG_KUNIT`` 和 ``CONFIG_KASAN_KUNIT_TEST`` , >+ 还可以使用 ``kunit_tool`` 以更易读的方式查看KUnit测试的结果。 >+ 这不会打印通过测试的KASAN报告。有关 ``kunit_tool`` 的更多最新信息, >+ 请参阅 `KUnit文档 `_ 。 >+ >+.. _KUnit: https://www.kernel.org/doc/html/latest/dev-tools/kunit/index.html >-- >2.7.4 > From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-14.1 required=3.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_ADSP_CUSTOM_MED,DKIM_SIGNED,DKIM_VALID,HEADER_FROM_DIFFERENT_DOMAINS, INCLUDES_CR_TRAILER,INCLUDES_PATCH,MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id D1639C47080 for ; Thu, 3 Jun 2021 03:48:22 +0000 (UTC) Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 8AB32613BF for ; Thu, 3 Jun 2021 03:48:22 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 8AB32613BF Authentication-Results: mail.kernel.org; dmarc=fail (p=reject dis=none) header.from=google.com Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=linux-riscv-bounces+linux-riscv=archiver.kernel.org@lists.infradead.org DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender:Content-Type: Content-Transfer-Encoding:List-Subscribe:List-Help:List-Post:List-Archive: List-Unsubscribe:List-Id:In-Reply-To:MIME-Version:References:Message-ID: Subject:Cc:To:From:Date:Reply-To:Content-ID:Content-Description:Resent-Date: Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:List-Owner; bh=txMyrXuPGtvdQDxwbHy8ZGoF11Z/T4H488PemQ4xQ6c=; b=K6nmG+twOV+1b9sEkuz0w/bTrB ye7Q6TOFdAvWiTUFDhq/bE31xZ+cFUkx7B0ifv58dyW/6ZTzOaKHJIFuLQXHQ0nv+ncEvSPVXnO88 GuxS3CeSAPaguCbUYZkxwIA0U0iH0GvsihXPiI9eDXtDeXyOy9qTlyDAyid/9lEWs805AO7KCPn/f qgP/Q9M7y1F22yTlhVGff/R2lmbUSUhd8S7GVH1iI8VWTkO5WIuNRWC0yR7iq7q46mf8pwITCdBpk unH5r3hwizc3eOih0IrLIhAaZlSFktYEKRAQ7e2d6UxQdbDbhQJMTIIIKWuxhx6ssmSGcfI6qhrAe 9ktxYHCg==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.94.2 #2 (Red Hat Linux)) id 1loeKr-006yiT-JQ; Thu, 03 Jun 2021 03:47:57 +0000 Received: from mail-pf1-x42c.google.com ([2607:f8b0:4864:20::42c]) by bombadil.infradead.org with esmtps (Exim 4.94.2 #2 (Red Hat Linux)) id 1loeKn-006yb5-D1 for linux-riscv@lists.infradead.org; Thu, 03 Jun 2021 03:47:56 +0000 Received: by mail-pf1-x42c.google.com with SMTP id z26so3861672pfj.5 for ; Wed, 02 Jun 2021 20:45:50 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20161025; h=date:from:to:cc:subject:message-id:references:mime-version :content-disposition:content-transfer-encoding:in-reply-to; bh=yedFmQn0Zkbjxy4mO7XqdjrZypdfe0X9HbdCFI6/LlA=; b=a09qPfio5AnYq6e+92mOdHkTDCDGkNwaS4WcGWKWuoXMDbbaxOZdD+nUvPDgjO2RcD LRhug7UgQTsxB1QMGy83IsoCUbKKsIt+xuZMfFndEy8dOKPvm6HlYf7NHlym3biG5FNG 6vBvCwHJfdb4hKrHTu95E/UKibrvM9xKo/IqoKKCq1J65j/ZE/dZkU3XWB6S2K/amC6a hWfX5mLym/kr18ZpwgLIuDz4NxxxAdcii3piZi7MT+Etgsmy9IGiWbHQ0jGNLycW6PcA r5jXGbJOS2VpqhIPwBhN6bURL+wmm68WH3ykuFFgkjkrhLbCY4g1eykXViCNHJC6UIiP 2XJQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:date:from:to:cc:subject:message-id:references :mime-version:content-disposition:content-transfer-encoding :in-reply-to; bh=yedFmQn0Zkbjxy4mO7XqdjrZypdfe0X9HbdCFI6/LlA=; b=VVxL0h2Ly1FkUxO2i4ug5vc1C5zE1IwpHkGGyvZmyyRkG0A0+/WREBvZvck6hQ1JHp emkYizzzl34ioUjhL6emX5DinoKheYVamehii+TP8yW+z6AITysP8kMqJkwgOi1LCun1 KuzCqxOl9mm7EMdKN5hxB0ml7v5T2oXwtkLZtEafQP1QZmMAWzULkmrOY6Bjby+cZUuF DV+MyFjKmOgPF00dEf7ikimXUv9sKsUTfbGXpcMYpaQrjNZA1p/4ItNGdoX5NVYDF6M3 AHsJ+tXCFX3lvHfPDgBGGZIr9zDICs5wFQjvQVa8V4sKi/xrc4C9XtnOGlPBQl3uzeao pY1w== X-Gm-Message-State: AOAM533Lj/0HvS3wq56+FtFhe11W1ogMYxDlcNyRty9fuBhJbzLLAo1H fWXB7H5cZV/lMbb09F8FlbI5hg== X-Google-Smtp-Source: ABdhPJxKZP6N6JalunllvVftOhsCNR1kcXHzBSzhPiUjmPNxvl5h8Y5TTbTjqAl3j+B38RoZvvUfNA== X-Received: by 2002:a05:6a00:856:b029:2dc:bd34:9f7e with SMTP id q22-20020a056a000856b02902dcbd349f7emr31006608pfk.0.1622691949964; Wed, 02 Jun 2021 20:45:49 -0700 (PDT) Received: from google.com ([2620:15c:2ce:200:bd0a:b249:2e20:50bb]) by smtp.gmail.com with ESMTPSA id 65sm834700pfu.159.2021.06.02.20.45.48 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 02 Jun 2021 20:45:49 -0700 (PDT) Date: Wed, 2 Jun 2021 20:45:45 -0700 From: Fangrui Song To: Wan Jiabing Cc: Alex Shi , Jonathan Corbet , Paul Walmsley , Palmer Dabbelt , Albert Ou , Nathan Chancellor , Nick Desaulniers , Wu XiangCheng , Bernard Zhao , linux-doc@vger.kernel.org, linux-kernel@vger.kernel.org, linux-riscv@lists.infradead.org, clang-built-linux@googlegroups.com Subject: Re: [PATCH] [v2] docs/zh_CN: add translations in zh_CN/dev-tools/kasan Message-ID: <20210603034545.oe675lrtvtsvbedb@google.com> References: <1622638607-12314-1-git-send-email-wanjiabing@vivo.com> MIME-Version: 1.0 Content-Disposition: inline In-Reply-To: <1622638607-12314-1-git-send-email-wanjiabing@vivo.com> X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20210602_204753_484692_4DD07A84 X-CRM114-Status: GOOD ( 11.93 ) X-BeenThere: linux-riscv@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Content-Transfer-Encoding: base64 Content-Type: text/plain; charset="utf-8"; Format="flowed" Sender: "linux-riscv" Errors-To: linux-riscv-bounces+linux-riscv=archiver.kernel.org@lists.infradead.org VGhhbmtzISBXaXRoIGEgZmV3IHN1Z2dlc3Rpb25zLAoKUmV2aWV3ZWQtYnk6IEZhbmdydWkgU29u ZyA8bWFza3JheUBnb29nbGUuY29tPgoKT24gMjAyMS0wNi0wMiwgV2FuIEppYWJpbmcgd3JvdGU6 Cj5BZGQgbmV3IHpoIHRyYW5zbGF0aW9ucwo+KiB6aF9DTi9kZXYtdG9vbHMva2FzYW4ucnN0Cj5h bmQgbGluayBpdCB0byB6aF9DTi9kZXYtdG9vbHMvaW5kZXgucnN0Cj4KPlNpZ25lZC1vZmYtYnk6 IFdhbiBKaWFiaW5nIDx3YW5qaWFiaW5nQHZpdm8uY29tPgo+LS0tCj5DaGFuZ2Vsb2c6Cj52MjoK Pi0gRGVsZXRlIHNwYWNlcyBzdXJyb3VuZCB3aXRoIEVuZ2xpc2ggd29yZHMuCj4tLS0KPiAuLi4v dHJhbnNsYXRpb25zL3poX0NOL2Rldi10b29scy9pbmRleC5yc3QgICAgICAgICB8ICAgMiArLQo+ IC4uLi90cmFuc2xhdGlvbnMvemhfQ04vZGV2LXRvb2xzL2thc2FuLnJzdCAgICAgICAgIHwgNDMx ICsrKysrKysrKysrKysrKysrKysrKwo+IDIgZmlsZXMgY2hhbmdlZCwgNDMyIGluc2VydGlvbnMo KyksIDEgZGVsZXRpb24oLSkKPiBjcmVhdGUgbW9kZSAxMDA2NDQgRG9jdW1lbnRhdGlvbi90cmFu c2xhdGlvbnMvemhfQ04vZGV2LXRvb2xzL2thc2FuLnJzdAo+Cj5kaWZmIC0tZ2l0IGEvRG9jdW1l bnRhdGlvbi90cmFuc2xhdGlvbnMvemhfQ04vZGV2LXRvb2xzL2luZGV4LnJzdCBiL0RvY3VtZW50 YXRpb24vdHJhbnNsYXRpb25zL3poX0NOL2Rldi10b29scy9pbmRleC5yc3QKPmluZGV4IGZkNzNj NDcuLmU2Yzk5ZjIgMTAwNjQ0Cj4tLS0gYS9Eb2N1bWVudGF0aW9uL3RyYW5zbGF0aW9ucy96aF9D Ti9kZXYtdG9vbHMvaW5kZXgucnN0Cj4rKysgYi9Eb2N1bWVudGF0aW9uL3RyYW5zbGF0aW9ucy96 aF9DTi9kZXYtdG9vbHMvaW5kZXgucnN0Cj5AQCAtMTksMTMgKzE5LDEzIEBACj4gICAgOm1heGRl cHRoOiAyCj4KPiAgICBnY292Cj4rICAga2FzYW4KPgo+IFRvZG9saXN0Ogo+Cj4gIC0gY29jY2lu ZWxsZQo+ICAtIHNwYXJzZQo+ICAtIGtjb3YKPi0gLSBrYXNhbgo+ICAtIHVic2FuCj4gIC0ga21l bWxlYWsKPiAgLSBrY3Nhbgo+ZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vdHJhbnNsYXRpb25z L3poX0NOL2Rldi10b29scy9rYXNhbi5yc3QgYi9Eb2N1bWVudGF0aW9uL3RyYW5zbGF0aW9ucy96 aF9DTi9kZXYtdG9vbHMva2FzYW4ucnN0Cj5uZXcgZmlsZSBtb2RlIDEwMDY0NAo+aW5kZXggMDAw MDAwMC4uMDBhZGQxZAo+LS0tIC9kZXYvbnVsbAo+KysrIGIvRG9jdW1lbnRhdGlvbi90cmFuc2xh dGlvbnMvemhfQ04vZGV2LXRvb2xzL2thc2FuLnJzdAo+QEAgLTAsMCArMSw0MzEgQEAKPisuLiBT UERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMAo+Kwo+Ky4uIGluY2x1ZGU6OiAuLi9kaXNj bGFpbWVyLXpoX0NOLnJzdAo+Kwo+KzpPcmlnaW5hbDogRG9jdW1lbnRhdGlvbi9kZXYtdG9vbHMv a2FzYW4ucnN0Cj4rOlRyYW5zbGF0b3I6IOS4h+WutuWFtSBXYW4gSmlhYmluZyA8d2FuamlhYmlu Z0B2aXZvLmNvbT4KPisKPivlhoXmoLjlnLDlnYDmtojmr5LliYIoS0FTQU4pCj4rPT09PT09PT09 PT09PT09PT09PT09PQo+Kwo+K+amgui/sAo+Ky0tLS0KPisKPitLZXJuZWxBZGRyZXNzU0FOaXRp emVyKEtBU0FOKeaYr+S4gOenjeWKqOaAgeWGheWtmOWuieWFqOmUmeivr+ajgOa1i+W3peWFt++8 jAo+K+S4u+imgeWKn+iDveaYr+ajgOafpeWGheWtmOi2iueVjOiuv+mXruWSjOS9v+eUqOW3sumH iuaUvuWGheWtmOeahOmXrumimOOAgktBU0FO5pyJ5LiJ56eN5qih5byPOgo+Kwo+KzEuIOmAmueU qEtBU0FO77yI5LiO55So5oi356m66Ze055qEQVNhbuexu+S8vO+8iQo+KzIuIOWfuuS6jui9r+S7 tuagh+etvueahEtBU0FO77yI5LiO55So5oi356m66Ze055qESFdBU2Fu57G75Ly877yJCj4rMy4g 5Z+65LqO56Gs5Lu25qCH562+55qES0FTQU7vvIjln7rkuo7noazku7blhoXlrZjmoIfnrb7vvIkK PisKPivnlLHkuo7pgJrnlKhLQVNBTueahOWGheWtmOW8gOmUgOi+g+Wkp++8jOmAmueUqEtBU0FO 5Li76KaB55So5LqO6LCD6K+V44CCCj4r5Z+65LqO6L2v5Lu25qCH562+55qES0FTQU7lj6/nlKjk uo5kb2dmb29k5rWL6K+V77yM5Zug5Li65a6D5YW35pyJ6L6D5L2O55qE5YaF5a2Y5byA6ZSA77yM Cj4r5bm25YWB6K645bCG5YW255So5LqO5a6e6ZmF5bel5L2c6YeP44CCCj4r5Z+65LqO56Gs5Lu2 5qCH562+55qES0FTQU7lhbfmnInovoPkvY7nmoTlhoXlrZjlkozmgKfog73lvIDplIDvvIzlm6Dm raTlj6/nlKjkuo7nlJ/kuqfjgIIKPivlkIzml7blj6/nlKjkuo7mo4DmtYvnjrDlnLrlhoXlrZjp l67popjmiJbkvZzkuLrlronlhajnvJPop6Pmjqrmlr3jgIIKPisKPivova/ku7ZLQVNBTuaooeW8 j++8iCMx5ZKMIzLvvInkvb/nlKjnvJbor5Hml7blt6XlhbflnKjmr4/mrKHlhoXlrZjorr/pl67k uYvliY3mj5LlhaXmnInmlYjmgKfmo4Dmn6XvvIwKPivlm6DmraTpnIDopoHkuIDkuKrmlK/mjIHl roPnmoTnvJbor5HlmajniYjmnKzjgIIKPisKPivpgJrnlKhLQVNBTuWcqEdDQ+WSjENsYW5n5Y+X 5pSv5oyB44CCR0ND6ZyA6KaBOC4zLjDmiJbmm7Tpq5jniYjmnKzjgILku7vkvZXlj5fmlK/mjIHn moQKPitDbGFuZ+eJiOacrOmDveaYr+WFvOWuueeahO+8jOS9huS7jkNsYW5nIDEx5omN5byA5aeL 5pSv5oyB5qOA5rWL5YWo5bGA5Y+Y6YeP55qE6LaK55WM6K6/6Zeu44CCCj4rCj4r5Z+65LqO6L2v 5Lu25qCH562+55qES0FTQU7mqKHlvI/ku4XlnKhDbGFuZ+S4reWPl+aUr+aMgeOAggo+Kwo+K+eh rOS7tktBU0FO5qih5byP77yIIzPvvInkvp3otZbnoazku7bmnaXmiafooYzmo4Dmn6XvvIzkvYbk u43pnIDopoHmlK/mjIHlhoXlrZjmoIfnrb7mjIfku6TnmoQKPivnvJbor5HlmajniYjmnKzjgIJH Q0MgMTAr5ZKMQ2xhbmcgMTEr5pSv5oyB5q2k5qih5byP44CCCj4rCj4r5Lik56eN6L2v5Lu2S0FT QU7mqKHlvI/pg73pgILnlKjkuo5TTFVC5ZKMU0xBQuWGheWtmOWIhumFjeWZqO+8jAo+K+iAjOWf uuS6juehrOS7tuagh+etvueahEtBU0FO55uu5YmN5LuF5pSv5oyBU0xVQuOAggo+Kwo+K+ebruWJ jXg4Nl82NOOAgWFybeOAgWFybTY044CBeHRlbnNh44CBczM5MOOAgXJpc2N25p625p6E5pSv5oyB 6YCa55SoS0FTQU7mqKHlvI/vvIwKPivku4Vhcm02NOaetuaehOaUr+aMgeWfuuS6juagh+etvuea hEtBU0FO5qih5byP44CCCj4rCj4r55So5rOVCj4rLS0tLQo+Kwo+K+imgeWQr+eUqEtBU0FO77yM 6K+35L2/55So5Lul5LiL5ZG95Luk6YWN572u5YaF5qC4OjoKPisKPisJICBDT05GSUdfS0FTQU49 eQo+Kwo+K+WQjOaXtuWcqCBgYENPTkZJR19LQVNBTl9HRU5FUklDYGAgKOWQr+eUqOmAmueUqEtB U0FO5qih5byPKe+8jAo+K2BgQ09ORklHX0tBU0FOX1NXX1RBR1NgYCAo5ZCv55So5Z+65LqO56Gs 5Lu25qCH562+55qES0FTQU7mqKHlvI8p77yMCj4r5ZKMIGBgQ09ORklHX0tBU0FOX0hXX1RBR1Ng YCAo5ZCv55So5Z+65LqO56Gs5Lu25qCH562+55qES0FTQU7mqKHlvI8p5LmL6Ze06L+b6KGM6YCJ 5oup44CCCj4rCj4r5a+55LqO6L2v5Lu25qih5byP77yM6L+Y5Y+v5Lul5ZyoIGBgQ09ORklHX0tB U0FOX09VVExJTkVgYCDlkowKPitgYENPTkZJR19LQVNBTl9JTkxJTkVgYCDkuYvpl7Tov5vooYzp gInmi6njgIJvdXRsaW5l5ZKMaW5saW5l5piv57yW6K+R5Zmo5qOA5rWL57G75Z6L44CCCj4r5YmN 6ICF5Lqn55Sf6L6D5bCP55qE5LqM6L+b5Yi25paH5Lu277yM6ICM5ZCO6ICF5b+rMS4xLTLlgI3j gIIKCuajgOa1iyAtPiDmj5LmoakKCj4r6KaB5bCG5Y+X5b2x5ZON55qEc2xhYuWvueixoeeahGFs bG9j5ZKMZnJlZeWghuagiOi3n+i4quWMheWQq+WIsOaKpeWRiuS4re+8jAo+K+ivt+WQr+eUqGBg Q09ORklHX1NUQUNLVFJBQ0VgYCDjgILopoHljIXmi6zlj5flvbHlk43niannkIbpobXpnaLnmoTl iIbphY3lkozph4rmlL7loIbmoIjot5/ouKrnmoTor53vvIwKPivor7flkK/nlKggYGBDT05GSUdf UEFHRV9PV05FUmBgIOW5tuS9v+eUqCBgYHBhZ2Vfb3duZXI9b25gYCDov5vooYzlvJXlr7zjgIIK PisKPivplJnor6/miqXlkYoKPit+fn5+fn5+fgo+Kwo+K+WFuOWei+eahEtBU0FO5oql5ZGK5aaC 5LiL5omA56S6OjoKPisKPisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Cj4rICAgIEJVRzogS0FTQU46IHNsYWItb3V0 LW9mLWJvdW5kcyBpbiBrbWFsbG9jX29vYl9yaWdodCsweGE4LzB4YmMgW3Rlc3Rfa2FzYW5dCj4r ICAgIFdyaXRlIG9mIHNpemUgMSBhdCBhZGRyIGZmZmY4ODAxZjQ0ZWMzN2IgYnkgdGFzayBpbnNt b2QvMjc2MAo+Kwo+KyAgICBDUFU6IDEgUElEOiAyNzYwIENvbW06IGluc21vZCBOb3QgdGFpbnRl ZCA0LjE5LjAtcmMzKyAjNjk4Cj4rICAgIEhhcmR3YXJlIG5hbWU6IFFFTVUgU3RhbmRhcmQgUEMg KGk0NDBGWCArIFBJSVgsIDE5OTYpLCBCSU9TIDEuMTAuMi0xIDA0LzAxLzIwMTQKPisgICAgQ2Fs bCBUcmFjZToKPisgICAgIGR1bXBfc3RhY2srMHg5NC8weGQ4Cj4rICAgICBwcmludF9hZGRyZXNz X2Rlc2NyaXB0aW9uKzB4NzMvMHgyODAKPisgICAgIGthc2FuX3JlcG9ydCsweDE0NC8weDE4Nwo+ KyAgICAgX19hc2FuX3JlcG9ydF9zdG9yZTFfbm9hYm9ydCsweDE3LzB4MjAKPisgICAgIGttYWxs b2Nfb29iX3JpZ2h0KzB4YTgvMHhiYyBbdGVzdF9rYXNhbl0KPisgICAgIGttYWxsb2NfdGVzdHNf aW5pdCsweDE2LzB4NzAwIFt0ZXN0X2thc2FuXQo+KyAgICAgZG9fb25lX2luaXRjYWxsKzB4YTUv MHgzYWUKPisgICAgIGRvX2luaXRfbW9kdWxlKzB4MWI2LzB4NTQ3Cj4rICAgICBsb2FkX21vZHVs ZSsweDc1ZGYvMHg4MDcwCj4rICAgICBfX2RvX3N5c19pbml0X21vZHVsZSsweDFjNi8weDIwMAo+ KyAgICAgX194NjRfc3lzX2luaXRfbW9kdWxlKzB4NmUvMHhiMAo+KyAgICAgZG9fc3lzY2FsbF82 NCsweDlmLzB4MmMwCj4rICAgICBlbnRyeV9TWVNDQUxMXzY0X2FmdGVyX2h3ZnJhbWUrMHg0NC8w eGE5Cj4rICAgIFJJUDogMDAzMzoweDdmOTY0NDMxMDlkYQo+KyAgICBSU1A6IDAwMmI6MDAwMDdm ZmNmMGI1MWIwOCBFRkxBR1M6IDAwMDAwMjAyIE9SSUdfUkFYOiAwMDAwMDAwMDAwMDAwMGFmCj4r ICAgIFJBWDogZmZmZmZmZmZmZmZmZmZkYSBSQlg6IDAwMDA1NWRjM2VlNTIxYTAgUkNYOiAwMDAw N2Y5NjQ0MzEwOWRhCj4rICAgIFJEWDogMDAwMDdmOTY0NDVjZmY4OCBSU0k6IDAwMDAwMDAwMDAw NTdhNTAgUkRJOiAwMDAwN2Y5NjQ0OTkyMDAwCj4rICAgIFJCUDogMDAwMDU1ZGMzZWU1MTBiMCBS MDg6IDAwMDAwMDAwMDAwMDAwMDMgUjA5OiAwMDAwMDAwMDAwMDAwMDAwCj4rICAgIFIxMDogMDAw MDdmOTY0NDMwY2QwYSBSMTE6IDAwMDAwMDAwMDAwMDAyMDIgUjEyOiAwMDAwN2Y5NjQ0NWNmZjg4 Cj4rICAgIFIxMzogMDAwMDU1ZGMzZWU1MTA5MCBSMTQ6IDAwMDAwMDAwMDAwMDAwMDAgUjE1OiAw MDAwMDAwMDAwMDAwMDAwCj4rCj4rICAgIEFsbG9jYXRlZCBieSB0YXNrIDI3NjA6Cj4rICAgICBz YXZlX3N0YWNrKzB4NDMvMHhkMAo+KyAgICAga2FzYW5fa21hbGxvYysweGE3LzB4ZDAKPisgICAg IGttZW1fY2FjaGVfYWxsb2NfdHJhY2UrMHhlMS8weDFiMAo+KyAgICAga21hbGxvY19vb2Jfcmln aHQrMHg1Ni8weGJjIFt0ZXN0X2thc2FuXQo+KyAgICAga21hbGxvY190ZXN0c19pbml0KzB4MTYv MHg3MDAgW3Rlc3Rfa2FzYW5dCj4rICAgICBkb19vbmVfaW5pdGNhbGwrMHhhNS8weDNhZQo+KyAg ICAgZG9faW5pdF9tb2R1bGUrMHgxYjYvMHg1NDcKPisgICAgIGxvYWRfbW9kdWxlKzB4NzVkZi8w eDgwNzAKPisgICAgIF9fZG9fc3lzX2luaXRfbW9kdWxlKzB4MWM2LzB4MjAwCj4rICAgICBfX3g2 NF9zeXNfaW5pdF9tb2R1bGUrMHg2ZS8weGIwCj4rICAgICBkb19zeXNjYWxsXzY0KzB4OWYvMHgy YzAKPisgICAgIGVudHJ5X1NZU0NBTExfNjRfYWZ0ZXJfaHdmcmFtZSsweDQ0LzB4YTkKPisKPisg ICAgRnJlZWQgYnkgdGFzayA4MTU6Cj4rICAgICBzYXZlX3N0YWNrKzB4NDMvMHhkMAo+KyAgICAg X19rYXNhbl9zbGFiX2ZyZWUrMHgxMzUvMHgxOTAKPisgICAgIGthc2FuX3NsYWJfZnJlZSsweGUv MHgxMAo+KyAgICAga2ZyZWUrMHg5My8weDFhMAo+KyAgICAgdW1oX2NvbXBsZXRlKzB4NmEvMHhh MAo+KyAgICAgY2FsbF91c2VybW9kZWhlbHBlcl9leGVjX2FzeW5jKzB4NGMzLzB4NjQwCj4rICAg ICByZXRfZnJvbV9mb3JrKzB4MzUvMHg0MAo+Kwo+KyAgICBUaGUgYnVnZ3kgYWRkcmVzcyBiZWxv bmdzIHRvIHRoZSBvYmplY3QgYXQgZmZmZjg4MDFmNDRlYzMwMAo+KyAgICAgd2hpY2ggYmVsb25n cyB0byB0aGUgY2FjaGUga21hbGxvYy0xMjggb2Ygc2l6ZSAxMjgKPisgICAgVGhlIGJ1Z2d5IGFk ZHJlc3MgaXMgbG9jYXRlZCAxMjMgYnl0ZXMgaW5zaWRlIG9mCj4rICAgICAxMjgtYnl0ZSByZWdp b24gW2ZmZmY4ODAxZjQ0ZWMzMDAsIGZmZmY4ODAxZjQ0ZWMzODApCj4rICAgIFRoZSBidWdneSBh ZGRyZXNzIGJlbG9uZ3MgdG8gdGhlIHBhZ2U6Cj4rICAgIHBhZ2U6ZmZmZmVhMDAwN2QxM2IwMCBj b3VudDoxIG1hcGNvdW50OjAgbWFwcGluZzpmZmZmODgwMWY3MDAxNjQwIGluZGV4OjB4MAo+KyAg ICBmbGFnczogMHgyMDAwMDAwMDAwMDAxMDAoc2xhYikKPisgICAgcmF3OiAwMjAwMDAwMDAwMDAw MTAwIGZmZmZlYTAwMDdkMTFkYzAgMDAwMDAwMWEwMDAwMDAxYSBmZmZmODgwMWY3MDAxNjQwCj4r ICAgIHJhdzogMDAwMDAwMDAwMDAwMDAwMCAwMDAwMDAwMDgwMTUwMDE1IDAwMDAwMDAxZmZmZmZm ZmYgMDAwMDAwMDAwMDAwMDAwMAo+KyAgICBwYWdlIGR1bXBlZCBiZWNhdXNlOiBrYXNhbjogYmFk IGFjY2VzcyBkZXRlY3RlZAo+Kwo+KyAgICBNZW1vcnkgc3RhdGUgYXJvdW5kIHRoZSBidWdneSBh ZGRyZXNzOgo+KyAgICAgZmZmZjg4MDFmNDRlYzIwMDogZmMgZmMgZmMgZmMgZmMgZmMgZmMgZmMg ZmIgZmIgZmIgZmIgZmIgZmIgZmIgZmIKPisgICAgIGZmZmY4ODAxZjQ0ZWMyODA6IGZiIGZiIGZi IGZiIGZiIGZiIGZiIGZiIGZjIGZjIGZjIGZjIGZjIGZjIGZjIGZjCj4rICAgID5mZmZmODgwMWY0 NGVjMzAwOiAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMwo+ KyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgXgo+KyAgICAgZmZmZjg4MDFmNDRlYzM4MDogZmMgZmMgZmMgZmMgZmMgZmMg ZmMgZmMgZmIgZmIgZmIgZmIgZmIgZmIgZmIgZmIKPisgICAgIGZmZmY4ODAxZjQ0ZWM0MDA6IGZi IGZiIGZiIGZiIGZiIGZiIGZiIGZiIGZjIGZjIGZjIGZjIGZjIGZjIGZjIGZjCj4rICAgID09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PQo+Kwo+K+aKpeWRiuagh+mimOaAu+e7k+S6huWPkeeUn+eahOmUmeivr+exu+Wei+S7peWP iuWvvOiHtOivpemUmeivr+eahOiuv+mXruexu+Wei+OAggo+K+e0p+maj+WFtuWQjueahOaYr+mU meivr+iuv+mXrueahOWghuagiOi3n+i4quOAgeaJgOiuv+mXruWGheWtmOWIhumFjeS9jee9ruea hOWghuagiOi3n+i4qgo+K++8iOWvueS6juiuv+mXruS6hnNsYWLlr7nosaHnmoTmg4XlhrXvvInk u6Xlj4rlr7nosaHooqvph4rmlL7nmoTkvY3nva7nmoTloIbmoIjot5/ouKoKPivvvIjlr7nkuo7o rr/pl67lt7Lph4rmlL7lhoXlrZjnmoTpl67popjmiqXlkYrvvInjgILmjqXkuIvmnaXmmK/lr7no rr/pl67nmoRzbGFi5a+56LGhCj4r55qE5o+P6L+w5Lul5Y+K5YWz5LqO6K6/6Zeu55qE5YaF5a2Y 6aG155qE5L+h5oGv44CCCj4rCj4r5pyA5ZCO77yM5oql5ZGK5bGV56S65LqG6K6/6Zeu5Zyw5Z2A 5ZGo5Zu055qE5YaF5a2Y54q25oCB44CC5Zyo5YaF6YOo77yMCj4rS0FTQU7ljZXni6zot5/ouKrm r4/kuKrlhoXlrZjpopfnspLnmoTlhoXlrZjnirbmgIHvvIzmoLnmja5LQVNBTuaooeW8j+WIhuS4 ujjmiJYxNuS4quWvuem9kOWtl+iKguOAggo+K+aKpeWRiueahOWGheWtmOeKtuaAgemDqOWIhuS4 reeahOavj+S4quaVsOWtl+mDveaYvuekuuS6huWbtOe7leiuv+mXruWcsOWdgOeahOWFtuS4reS4 gOS4quWGheWtmOmil+eykueahOeKtuaAgeOAggo+Kwo+K+WvueS6jumAmueUqEtBU0FO77yM5q+P 5Liq5YaF5a2Y6aKX57KS55qE5aSn5bCP5Li6OOS4quWtl+iKguOAguavj+S4qumil+eykueahOeK tuaAgeiiq+e8lueggeWcqOS4gOS4quW9seWtkOWtl+iKguS4reOAggo+K+i/mTjkuKrlrZfoioLl j6/ku6XmmK/lj6/orr/pl67nmoTvvIzpg6jliIborr/pl67nmoTvvIzlt7Lph4rmlL7nmoTmiJbm iJDkuLpSZWR6b25l55qE5LiA6YOo5YiG44CCCj4rS0FTQU7lr7nmr4/kuKrlvbHlrZDlrZfoioLk vb/nlKjku6XkuIvnvJbnoIE6MDDooajnpLrlr7nlupTlhoXlrZjljLrln5/nmoTmiYDmnIk45Liq 5a2X6IqC6YO95Y+v5Lul6K6/6Zeu77ybCj4r5pWw5a2XTiAoMSA8PSBOIDw9IDcp6KGo56S65YmN TuS4quWtl+iKguWPr+iuv+mXru+8jOWFtuS7lig4IC0gTinkuKrlrZfoioLkuI3lj6/orr/pl67v vJsKPivku7vkvZXotJ/lgLzpg73ooajnpLrml6Dms5Xorr/pl67mlbTkuKo45a2X6IqC44CCS0FT QU7kvb/nlKjkuI3lkIznmoTotJ/lgLzmnaXljLrliIbkuI3lkIznsbvlnovnmoTkuI3lj6/orr/p l67lhoXlrZjvvIwKPivlpoJyZWR6b25lc+aIluW3sumHiuaUvueahOWGheWtmO+8iOWPguingSBt bS9rYXNhbi9rYXNhbi5o77yJ44CCCj4rCj4r5Zyo5LiK6Z2i55qE5oql5ZGK5Lit77yM566t5aS0 5oyH5ZCR5b2x5a2Q5a2X6IqCIGBgMDNgYO+8jOihqOekuuiuv+mXrueahOWcsOWdgOaYr+mDqOWI huWPr+iuv+mXrueahOOAggo+Kwo+K+WvueS6juWfuuS6juagh+etvueahEtBU0FO5qih5byP77yM 5oql5ZGK5pyA5ZCO55qE6YOo5YiG5pi+56S65LqG6K6/6Zeu5Zyw5Z2A5ZGo5Zu055qE5YaF5a2Y 5qCH562+Cj4rKOWPguiAgyBg5a6e5pa957uG5YiZYF8g56ug6IqCKeOAggo+Kwo+K+ivt+azqOaE j++8jEtBU0FO6ZSZ6K+v5qCH6aKY77yI5aaCIGBgc2xhYi1vdXQtb2YtYm91bmRzYGAg5oiWIGBg dXNlLWFmdGVyLWZyZWVgYCDvvIkKPivmmK/lsL3ph4/mjqXov5HnmoQ6S0FTQU7moLnmja7lhbbm i6XmnInnmoTmnInpmZDkv6Hmga/miZPljbDlh7rmnIDlj6/og73nmoTplJnor6/nsbvlnovjgIIK PivplJnor6/nmoTlrp7pmYXnsbvlnovlj6/og73kvJrmnInmiYDkuI3lkIzjgIIKPisKPivpgJrn lKhLQVNBTui/mOaKpeWRiuS4pOS4qui+heWKqeiwg+eUqOWghuagiOi3n+i4quOAgui/meS6m+Wg huagiOi3n+i4quaMh+WQkeS7o+eggQo+K+S4reS4juWvueixoeS6pOS6kuS9huS4jeebtOaOpeWH uueOsOWcqOmUmeivr+iuv+mXruWghuagiOi3n+i4quS4reeahOS9jee9ruOAggo+K+ebruWJje+8 jOi/meWMheaLrCBjYWxsX3JjdSgpIOWSjOaOkumYn+eahOW3peS9nOmYn+WIl+OAggo+Kwo+K+WQ r+WKqOWPguaVsAo+K35+fn5+fn5+Cj4rCj4rS0FTQU7lj5fpgJrnlKggYGBwYW5pY19vbl93YXJu YGAg5ZG95Luk6KGM5Y+C5pWw55qE5b2x5ZON44CCCj4r5ZCv55So6K+l5Yqf6IO95ZCO77yMS0FT QU7lnKjmiZPljbDplJnor6/miqXlkYrlkI7kvJrlvJXotbflhoXmoLjmgZDmhYzjgIIKPisKPivp u5jorqTmg4XlhrXkuIvvvIxLQVNBTuWPquS4uuesrOS4gOasoeaXoOaViOWGheWtmOiuv+mXruaJ k+WNsOmUmeivr+aKpeWRiuOAguS9v+eUqCBgYGthc2FuX211bHRpX3Nob3RgYCDvvIwKPitLQVNB TuS8mumSiOWvueavj+S4quaXoOaViOiuv+mXruaJk+WNsOaKpeWRiuOAgui/meacieaViOWcsOem geeUqOS6hktBU0FO5oql5ZGK55qEIGBgcGFuaWNfb25fd2FybmBgIOOAggo+Kwo+K+WfuuS6jueh rOS7tuagh+etvueahEtBU0FO5qih5byP77yI6K+35Y+C6ZiF5LiL6Z2i5pyJ5YWz5ZCE56eN5qih 5byP55qE6YOo5YiG77yJ5peo5Zyo5Zyo55Sf5Lqn5Lit55So5L2c5a6J5YWo57yT6Kej5o6q5pa9 44CCCj4r5Zug5q2k77yM5a6D5pSv5oyB5YWB6K6456aB55SoS0FTQU7miJbmjqfliLblhbblip/o g73nmoTlvJXlr7zlj4LmlbDjgIIKPisKPistIGBga2FzYW49b2ZmYGAg5oiWIGBgPW9uYGAg5o6n 5Yi2S0FTQU7mmK/lkKblkK/nlKggKOm7mOiupDogYGBvbmBgICnjgIIKPisKPistIGBga2FzYW4u bW9kZT1zeW5jYGAg5oiWIGBgPWFzeW5jYGAg5o6n5Yi2S0FTQU7mmK/lkKbphY3nva7kuLrlkIzm raUKPisgIOaIluW8guatpeaJp+ihjOaooeW8jyjpu5jorqQ6IGBgc3luY2BgICnjgIIKPisgIOWQ jOatpeaooeW8j++8muW9k+agh+etvuajgOafpemUmeivr+WPkeeUn+aXtu+8jOeri+WNs+ajgOa1 i+WIsOmUmeivr+iuv+mXruOAggo+KyAg5byC5q2l5qih5byP77ya5bu26L+f6ZSZ6K+v6K6/6Zeu 5qOA5rWL44CC5b2T5qCH562+5qOA5p+l6ZSZ6K+v5Y+R55Sf5pe277yM5L+h5oGv5a2Y5YKo5Zyo 56Gs5Lu25LitCj4rICDvvIjlnKhhcm02NOeahFRGU1JfRUwx5a+E5a2Y5Zmo5Lit77yJ44CC5YaF 5qC45Lya5a6a5pyf5qOA5p+l56Gs5Lu277yM5bm25LiU5LuF5Zyo6L+Z5Lqb5qOA5p+l5pyf6Ze0 5oql5ZGK5qCH562+6ZSZ6K+v44CCCj4rCj4rLSBgYGthc2FuLnN0YWNrdHJhY2U9b2ZmYGAg5oiW IGBgPW9uYGAg56aB55So5oiW5ZCv55SoYWxsb2PlkoxmcmVl5aCG5qCI6Lef6Liq5pS26ZuGKOm7 mOiupDogYGBvbmBgICnjgIIKPisKPistIGBga2FzYW4uZmF1bHQ9cmVwb3J0YGAg5oiWIGBgPXBh bmljYGAg5o6n5Yi25piv5Y+q5omT5Y2wS0FTQU7miqXlkYrov5jmmK/lkIzml7bkvb/lhoXmoLjm gZDmhYwKPisgICjpu5jorqQ6IGBgcmVwb3J0YGAgKeOAguWNs+S9v+WQr+eUqOS6hiBgYGthc2Fu X211bHRpX3Nob3RgYO+8jOS5n+S8muWPkeeUn+WGheaguOaBkOaFjOOAggo+Kwo+K+WunuaWvee7 huWImQo+Ky0tLS0tLS0tLQo+Kwo+K+mAmueUqEtBU0FOCj4rfn5+fn5+fn5+fgo+Kwo+K+i9r+S7 tktBU0FO5qih5byP5L2/55So5b2x5a2Q5YaF5a2Y5p2l6K6w5b2V5q+P5Liq5YaF5a2Y5a2X6IqC 5piv5ZCm5Y+v5Lul5a6J5YWo6K6/6Zeu77yMCj4r5bm25L2/55So57yW6K+R5pe25bel5YW35Zyo 5q+P5qyh5YaF5a2Y6K6/6Zeu5LmL5YmN5o+S5YWl5b2x5a2Q5YaF5a2Y5qOA5p+l44CCCj4rCj4r 6YCa55SoS0FTQU7lsIYxLzjnmoTlhoXmoLjlhoXlrZjkuJPnlKjkuo7lhbblvbHlrZDlhoXlrZjv vIgxNlRC5Lul6KaG55uWeDg2XzY05LiK55qEIDEyOFRC77yJ77yMCj4r5bm25L2/55So5YW35pyJ 5q+U5L6L5ZKM5YGP56e76YeP55qE55u05o6l5pig5bCE5bCG5YaF5a2Y5Zyw5Z2A6L2s5o2i5Li6 5YW255u45bqU55qE5b2x5a2Q5Zyw5Z2A44CCCj4rCj4r6L+Z5piv5bCG5Zyw5Z2A6L2s5o2i5Li6 5YW255u45bqU5b2x5a2Q5Zyw5Z2A55qE5Ye95pWwOjoKPisKPisgICAgc3RhdGljIGlubGluZSB2 b2lkICprYXNhbl9tZW1fdG9fc2hhZG93KGNvbnN0IHZvaWQgKmFkZHIpCj4rICAgIHsKPisJcmV0 dXJuICh2b2lkICopKCh1bnNpZ25lZCBsb25nKWFkZHIgPj4gS0FTQU5fU0hBRE9XX1NDQUxFX1NI SUZUKQo+KwkJKyBLQVNBTl9TSEFET1dfT0ZGU0VUOwo+KyAgICB9Cj4rCj4r5Zyo6L+Z6YeMIGBg S0FTQU5fU0hBRE9XX1NDQUxFX1NISUZUID0gM2Bg44CCCj4rCj4r57yW6K+R5pe25bel5YW355So 5LqO5o+S5YWl5YaF5a2Y6K6/6Zeu5qOA5p+l44CC57yW6K+R5Zmo5Zyo5q+P5qyh6K6/6Zeu5aSn 5bCP5Li6Cj4rMeOAgTLjgIE044CBOOaIljE255qE5YaF5a2Y5LmL5YmN5o+S5YWl5Ye95pWw6LCD 55SoCj4rKGBgX19hc2FuX2xvYWQqKGFkZHIpYGAsIGBgX19hc2FuX3N0b3JlKihhZGRyKWBgKeOA ggo+K+i/meS6m+WHveaVsOmAmui/h+ajgOafpeebuOW6lOeahOW9seWtkOWGheWtmOadpeajgOaf peWGheWtmOiuv+mXruaYr+WQpuacieaViOOAggo+Kwo+K+S9v+eUqGlubGluZeajgOa1i++8jOe8 luivkeWZqOS4jei/m+ihjOWHveaVsOiwg+eUqO+8jOiAjOaYr+ebtOaOpeaPkuWFpeS7o+eggQo+ K+adpeajgOafpeW9seWtkOWGheWtmOOAguatpOmAiemhueaYvuiRl+WcsOWinuWkp+S6huWGheag uOS9k+enr++8jAo+K+S9huS4jm91dGxpbmXmo4DmtYvlhoXmoLjnm7jmr5TvvIzlroPmj5Dkvpvk uoZ4MS4xLXgy55qE5oCn6IO95o+Q5Y2H44CCCgrmo4DmtYstPuaPkuahqQoKPivpgJrnlKhLQVNB TuaYr+WUr+S4gOS4gOenjemAmui/h+malOemu+W7tui/n+mHjeaWsOS9v+eUqOW3sumHiuaUvuWv ueixoeeahOaooeW8jwo+K++8iOWPguingSBtbS9rYXNhbi9xdWFyYW50aW5lLmMg5Lul5LqG6Kej 5a6e546w77yJ44CCCj4rCj4r5Z+65LqO6L2v5Lu25qCH562+55qES0FTQU7mqKHlvI8KPit+fn5+ fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KPisKPivln7rkuo7ova/ku7bmoIfnrb7nmoRLQVNBTuS9 v+eUqOi9r+S7tuWGheWtmOagh+etvuaWueazleadpeajgOafpeiuv+mXruacieaViOaAp+OAggo+ K+ebruWJjeS7hemSiOWvuWFybTY05p625p6E5a6e546w44CCCj4rCj4r5Z+65LqO6L2v5Lu25qCH 562+55qES0FTQU7kvb/nlKhhcm02NCBDUFXnmoTpobbpg6jlrZfoioLlv73nlaUoVEJJKQo+K+eJ ueaAp+WcqOWGheaguOaMh+mSiOeahOmhtumDqOWtl+iKguS4reWtmOWCqOS4gOS4quaMh+mSiOag h+etvuOAggo+K+Wug+S9v+eUqOW9seWtkOWGheWtmOadpeWtmOWCqOS4juavj+S4qjE25a2X6IqC 5YaF5a2Y5Y2V5YWD55u45YWz55qE5YaF5a2Y5qCH562+Cj4rKOWboOatpO+8jOWug+WwhuWGheag uOWGheWtmOeahDEvMTbkuJPnlKjkuo7lvbHlrZDlhoXlrZgp44CCCj4rCj4r5Zyo5q+P5qyh5YaF 5a2Y5YiG6YWN5pe277yM5Z+65LqO6L2v5Lu25qCH562+55qES0FTQU7pg73kvJrnlJ/miJDkuIDk uKrpmo/mnLrmoIfnrb7vvIwKPivnlKjov5nkuKrmoIfnrb7moIforrDliIbphY3nmoTlhoXlrZjv vIzlubblsIbnm7jlkIznmoTmoIfnrb7ltYzlhaXliLDov5Tlm57nmoTmjIfpkojkuK3jgIIKPisK Pivln7rkuo7ova/ku7bmoIfnrb7nmoRLQVNBTuS9v+eUqOe8luivkeaXtuW3peWFt+WcqOavj+as oeWGheWtmOiuv+mXruS5i+WJjeaPkuWFpeajgOafpeOAggo+K+i/meS6m+ajgOafpeehruS/neat o+WcqOiuv+mXrueahOWGheWtmOeahOagh+etvuetieS6jueUqOS6juiuv+mXruivpeWGheWtmOea hOaMh+mSiOeahOagh+etvuOAggo+K+WmguaenOagh+etvuS4jeWMuemFje+8jOWfuuS6jui9r+S7 tuagh+etvueahEtBU0FO5Lya5omT5Y2w6ZSZ6K+v5oql5ZGK44CCCj4rCj4r5Z+65LqO6L2v5Lu2 5qCH562+55qES0FTQU7kuZ/mnInkuKTnp43mo4DmtYvmqKHlvI/vvIhvdXRsaW5l77yMCj4r5Y+R 5Ye65Zue6LCD5p2l5qOA5p+l5YaF5a2Y6K6/6Zeu77ybaW5saW5l77yM5omn6KGM5YaF6IGU55qE 5b2x5a2Q5YaF5a2Y5qOA5p+l77yJ44CCCj4r5L2/55Sob3V0bGluZeajgOa1i+aooeW8j++8jOS8 muS7juaJp+ihjOiuv+mXruajgOafpeeahOWHveaVsOaJk+WNsOmUmeivr+aKpeWRiuOAggo+K+S9 v+eUqGlubGluZeajgOa1i++8jOe8luivkeWZqOS8muWPkeWHuiBgYGJya2BgIOaMh+S7pO+8jOW5 tuS9v+eUqOS4k+eUqOeahAo+K2BgYnJrYGAg5aSE55CG56iL5bqP5p2l5omT5Y2w6ZSZ6K+v5oql 5ZGK44CCCgrmo4DmtYstPuaPkuahqQoKPivln7rkuo7ova/ku7bmoIfnrb7nmoRLQVNBTuS9v+eU qDB4RkbkvZzkuLrljLnphY3miYDmnInmjIfpkojmoIfnrb4KPivvvIjkuI3mo4Dmn6XpgJrov4fl uKbmnIkweEZG5oyH6ZKI5qCH562+55qE5oyH6ZKI6L+b6KGM55qE6K6/6Zeu77yJ44CCCj4r5YC8 MHhGReW9k+WJjeS/neeVmeeUqOS6juagh+iusOW3sumHiuaUvueahOWGheWtmOWMuuWfn+OAggo+ Kwo+K+WfuuS6jui9r+S7tuagh+etvueahEtBU0FO55uu5YmN5LuF5pSv5oyB5a+5U2xhYuWSjHBh Z2VfYWxsb2PlhoXlrZjov5vooYzmoIforrDjgIIKPisKPivln7rkuo7noazku7bmoIfnrb7nmoRL QVNBTuaooeW8jwo+K35+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KPisKPivln7rkuo7noazk u7bmoIfnrb7nmoRLQVNBTuWcqOamguW/teS4iuexu+S8vOS6jui9r+S7tuaooeW8j++8jAo+K+S9 huWug+aYr+S9v+eUqOehrOS7tuWGheWtmOagh+etvuS9nOS4uuaUr+aMgeiAjOS4jeaYr+e8luiv keWZqOajgOa1i+WSjOW9seWtkOWGheWtmOOAggo+Kwo+K+WfuuS6juehrOS7tuagh+etvueahEtB U0FO55uu5YmN5LuF6ZKI5a+5YXJtNjTmnrbmnoTlrp7njrDvvIzlubbkuJTln7rkuo5BUk12OC41 Cj4r5oyH5Luk6ZuG5p625p6E5Lit5byV5YWl55qEYXJtNjTlhoXlrZjmoIforrDmianlsZUoTVRF KeWSjOacgOmrmOWtl+iKguW/veeVpShUQkkp44CCCj4rCj4r54m55q6K55qEYXJtNjTmjIfku6Tn lKjkuo7kuLrmr4/mrKHlhoXlrZjliIbphY3mjIflrprlhoXlrZjmoIfnrb7jgIIKPivnm7jlkIzn moTmoIfnrb7ooqvmjIflrprnu5nmjIflkJHov5nkupvliIbphY3nmoTmjIfpkojjgILlnKjmr4/m rKHlhoXlrZjorr/pl67ml7bvvIwKPivnoazku7bnoa7kv53mraPlnKjorr/pl67nmoTlhoXlrZjn moTmoIfnrb7nrYnkuo7nlKjkuo7orr/pl67or6XlhoXlrZjnmoTmjIfpkojnmoTmoIfnrb7jgIIK PivlpoLmnpzmoIfnrb7kuI3ljLnphY3vvIzliJnkvJrnlJ/miJDmlYXpmpzlubbmiZPljbDmiqXl kYrjgIIKPisKPivln7rkuo7noazku7bmoIfnrb7nmoRLQVNBTuS9v+eUqDB4RkbkvZzkuLrljLnp hY3miYDmnInmjIfpkojmoIfnrb4KPivvvIjkuI3mo4Dmn6XpgJrov4fluKbmnIkweEZG5oyH6ZKI 5qCH562+55qE5oyH6ZKI6L+b6KGM55qE6K6/6Zeu77yJ44CCCj4r5YC8MHhGReW9k+WJjeS/neeV meeUqOS6juagh+iusOW3sumHiuaUvueahOWGheWtmOWMuuWfn+OAggo+Kwo+K+WfuuS6juehrOS7 tuagh+etvueahEtBU0FO55uu5YmN5LuF5pSv5oyB5a+5U2xhYuWSjHBhZ2VfYWxsb2PlhoXlrZjo v5vooYzmoIforrDjgIIKPisKPivlpoLmnpznoazku7bkuI3mlK/mjIFNVEXvvIhBUk12OC415LmL 5YmN77yJ77yM5YiZ5LiN5Lya5ZCv55So5Z+65LqO56Gs5Lu25qCH562+55qES0FTQU7jgIIKPivl nKjov5nnp43mg4XlhrXkuIvvvIzmiYDmnIlLQVNBTuW8leWvvOWPguaVsOmDveWwhuiiq+W/veeV peOAggo+Kwo+K+ivt+azqOaEj++8jOWQr+eUqENPTkZJR19LQVNBTl9IV19UQUdT5aeL57uI5Lya 5a+86Ie05ZCv55So5YaF5qC45Lit55qEVEJJ44CCCj4r5Y2z5L2/5o+Q5L6b5LqGIGBga2FzYW4u bW9kZT1vZmZgYCDmiJbnoazku7bkuI3mlK/mjIFNVEXvvIjkvYbmlK/mjIFUQknvvInjgIIKPisK Pivln7rkuo7noazku7bmoIfnrb7nmoRLQVNBTuWPquaKpeWRiuesrOS4gOS4quWPkeeOsOeahOmU meivr+OAguS5i+WQju+8jE1UReagh+etvuajgOafpeWwhuiiq+emgeeUqOOAggo+Kwo+K+W9seWt kOWGheWtmAo+Ky0tLS0tLS0tCj4rCj4r5YaF5qC45bCG5YaF5a2Y5pig5bCE5Yiw5Zyw5Z2A56m6 6Ze055qE5Yeg5Liq5LiN5ZCM6YOo5YiG44CC5YaF5qC46Jma5ouf5Zyw5Z2A55qE6IyD5Zu05b6I 5aSn77yaCj4r5rKh5pyJ6Laz5aSf55qE55yf5a6e5YaF5a2Y5p2l5pSv5oyB5YaF5qC45Y+v5Lul 6K6/6Zeu55qE5q+P5Liq5Zyw5Z2A55qE55yf5a6e5b2x5a2Q5Yy65Z+f44CCCj4r5Zug5q2k77yM S0FTQU7lj6rkuLrlnLDlnYDnqbrpl7TnmoTmn5Dkupvpg6jliIbmmKDlsITnnJ/lrp7nmoTlvbHl rZDjgIIKPisKPivpu5jorqTooYzkuLoKPit+fn5+fn5+fgo+Kwo+K+m7mOiupOaDheWGteS4i++8 jOS9k+ezu+e7k+aehOS7heWwhuWunumZheWGheWtmOaYoOWwhOWIsOeUqOS6jue6v+aAp+aYoOWw hOeahOmYtOW9seWMuuWfnwo+K++8iOS7peWPiuWPr+iDveeahOWFtuS7luWwj+WMuuWfn++8ieOA guWvueS6juaJgOacieWFtuS7luWMuuWfnyDigJTigJQg5L6L5aaCdm1hbGxvY+WSjHZtZW1tYXDn qbrpl7Qg4oCU4oCUCj4r5LiA5Liq5Y+q6K+76aG16Z2i6KKr5pig5bCE5Yiw6Zi05b2x5Yy65Z+f 5LiK44CC6L+Z5Liq5Y+q6K+755qE5b2x5a2Q6aG16Z2i5aOw5piO5omA5pyJ5YaF5a2Y6K6/6Zeu 6YO95piv5YWB6K6455qE44CCCj4rCj4r6L+Z57uZ5qih5Z2X5bim5p2l5LqG5LiA5Liq6Zeu6aKY 77ya5a6D5Lus5LiN5a2Y5Zyo5LqO57q/5oCn5pig5bCE5Lit77yM6ICM5piv5a2Y5Zyo5LqO5LiT 55So55qE5qih5Z2X56m66Ze05Lit44CCCj4r6YCa6L+H6L+e5o6l5qih5Z2X5YiG6YWN5Zmo77yM S0FTQU7kuLTml7bmmKDlsITnnJ/lrp7nmoTlvbHlrZDlhoXlrZjku6Xopobnm5blroPku6zjgIIK PivkvovlpoLvvIzov5nlhYHorrjmo4DmtYvlr7nmqKHlnZflhajlsYDlj5jph4/nmoTml6DmlYjo rr/pl67jgIIKPisKPivov5nkuZ/pgKDmiJDkuobkuI4gYGBWTUFQX1NUQUNLYGAg55qE5LiN5YW8 5a6577ya5aaC5p6c5aCG5qCI5L2N5LqOdm1hbGxvY+epuumXtOS4re+8jAo+K+Wug+Wwhuiiq+WI humFjeWPquivu+mhtemdoueahOW9seWtkOWGheWtmO+8jOW5tuS4lOWGheaguOWcqOWwneivleS4 uuWghuagiOWPmOmHj+iuvue9ruW9seWtkOaVsOaNruaXtuS8muWHuumUmeOAggo+Kwo+K0NPTkZJ R19LQVNBTl9WTUFMTE9DCj4rfn5+fn5+fn5+fn5+fn5+fn5+fn4KPisKPivkvb/nlKggYGBDT05G SUdfS0FTQU5fVk1BTExPQ2BgIO+8jEtBU0FO5Y+v5Lul5Lul5pu05aSn55qE5YaF5a2Y5L2/55So Cj4r5Li65Luj5Lu36KaG55uWdm1hbGxvY+epuumXtOOAguebruWJje+8jOi/meWcqHg4NuOAgXJp c2N244CBczM5MOWSjHBvd2VycGPkuIrlj5fmlK/mjIHjgIIKPisKPivov5npgJrov4fov57mjqXl iLB2bWFsbG9j5ZKMdm1hcOW5tuWKqOaAgeWIhumFjeecn+WunueahOW9seWtkOWGheWtmOadpeaU r+aMgeaYoOWwhOOAggo+Kwo+K3ZtYWxsb2Pnqbrpl7TkuK3nmoTlpKflpJrmlbDmmKDlsITpg73l vojlsI/vvIzpnIDopoHkuI3liLDkuIDmlbTpobXnmoTpmLTlvbHnqbrpl7TjgIIKPivlm6DmraTv vIzkuLrmr4/kuKrmmKDlsITliIbphY3kuIDkuKrlrozmlbTnmoTlvbHlrZDpobXpnaLlsIbmmK/k uIDnp43mtarotLnjgIIKPivmraTlpJbvvIzkuLrkuobnoa7kv53kuI3lkIznmoTmmKDlsITkvb/n lKjkuI3lkIznmoTlvbHlrZDpobXpnaLvvIzmmKDlsITlv4XpobvkuI4KPitgYEtBU0FOX0dSQU5V TEVfU0laRSAqIFBBR0VfU0laRWBgIOWvuem9kOOAggo+Kwo+K+ebuOWPje+8jEtBU0FO6Leo5aSa 5Liq5pig5bCE5YWx5Lqr5ZCO5aSH56m66Ze044CC5b2Tdm1hbGxvY+epuumXtOS4reeahOaYoOWw hOS9v+eUqAo+K+W9seWtkOWMuuWfn+eahOeJueWumumhtemdouaXtu+8jOWug+S8muWIhumFjeS4 gOS4quWQjuWkh+mhtemdouOAggo+K+atpOmhtemdoueojeWQjuWPr+S7peeUseWFtuS7lnZtYWxs b2PmmKDlsITlhbHkuqvjgIIKPisKPitLQVNBTui/nuaOpeWIsHZtYXDln7rnoYDmnrbmnoTku6Xm h5LmuIXnkIbmnKrkvb/nlKjnmoTlvbHlrZDlhoXlrZjjgIIKPisKPivkuLrkuobpgb/lhY3kuqTm jaLmmKDlsITnmoTlm7Dpmr7vvIxLQVNBTumihOa1i+imhueblnZtYWxsb2Pnqbrpl7TnmoTpmLTl vbHljLrln5/pg6jliIblsIbkuI3kvJrooqsKPivml6nmnJ/nmoTpmLTlvbHpobXpnaLopobnm5bv vIzkvYbmmK/lsIbkuI3kvJrooqvmmKDlsITjgILov5nlsIbpnIDopoHmm7TmlLnnibnlrprkuo5h cmNo55qE5Luj56CB44CCCj4rCj4r6L+Z5YWB6K645ZyoeDg25LiK5pSv5oyBIGBgVk1BUF9TVEFD S2BgIO+8jOW5tuS4lOWPr+S7peeugOWMluWvueayoeacieWbuuWumuaooeWdl+WMuuWfn+eahOae tuaehOeahOaUr+aMgeOAggo+Kwo+K+WvueS6juW8gOWPkeiAhQo+Ky0tLS0tLS0tLS0KPisKPivl v73nlaXorr/pl64KPit+fn5+fn5+fgo+Kwo+K+i9r+S7tktBU0FO5qih5byP5L2/55So57yW6K+R 5Zmo5qOA5rWL5p2l5o+S5YWl5pyJ5pWI5oCn5qOA5p+l44CCCj4r5q2k57G75qOA5rWL5Y+v6IO9 5LiO5YaF5qC455qE5p+Q5Lqb6YOo5YiG5LiN5YW85a6577yM5Zug5q2k6ZyA6KaB56aB55So44CC Cgrmj5LmoakKCj4r5YaF5qC455qE5YW25LuW6YOo5YiG5Y+v6IO95Lya6K6/6Zeu5bey5YiG6YWN 5a+56LGh55qE5YWD5pWw5o2u44CC6YCa5bi477yMS0FTQU7kvJrmo4DmtYvlubbmiqXlkYrmraTn sbvorr/pl67vvIwKPivkvYblnKjmn5Dkupvmg4XlhrXkuIvvvIjkvovlpoLvvIzlnKjlhoXlrZjl iIbphY3lmajkuK3vvInvvIzov5nkupvorr/pl67mmK/mnInmlYjnmoTjgIIKPisKPivlr7nkuo7o va/ku7ZLQVNBTuaooeW8j++8jOimgeemgeeUqOeJueWumuaWh+S7tuaIluebruW9leeahOajgOa1 i++8jAo+K+ivt+WwhuKAi+KAiyBgYEtBU0FOX1NBTklUSVpFYGAg5re75Yqg5Yiw55u45bqU55qE 5YaF5qC4TWFrZWZpbGXkuK06CgpEZWxldGUgWmVybyBXaWR0aCBTcGFjZSBjaGFyYWN0ZXJzIG9u IHRoaXMgbGluZS4KCj4rLSDlr7nkuo7ljZXkuKrmlofku7Yo5L6L5aaC77yMbWFpbi5vKTo6Cj4r Cj4rICAgIEtBU0FOX1NBTklUSVpFX21haW4ubyA6PSBuCj4rCj4rLSDlr7nkuo7kuIDkuKrnm67l vZXkuIvnmoTmiYDmnInmlofku7Y6Ogo+Kwo+KyAgICBLQVNBTl9TQU5JVElaRSA6PSBuCj4rCj4r 5a+55LqO6L2v5Lu2S0FTQU7mqKHlvI/vvIzopoHlnKjmr4/kuKrlh73mlbDnmoTln7rnoYDkuIrn poHnlKjmo4DmtYvvvIzor7fkvb/nlKhLQVNBTgo+K+eJueWumueahCBgYF9fbm9fc2FuaXRpemVf YWRkcmVzc2BgIOWHveaVsOWxnuaAp+aIluafkOS4qumAmueUqOeahCBgYG5vaW5zdHJgYCDjgIIK CuaIluafkOS4qiAtPiDmiJYKPwoKPivor7fms6jmhI/vvIznpoHnlKjnvJbor5Hlmajmo4DmtYvv vIjln7rkuo7mr4/kuKrmlofku7bmiJbmr4/kuKrlh73mlbDvvInkvJrkvb9LQVNBTuW/veeVpeWc qAo+K+i9r+S7tktBU0FO5qih5byP55qE5Luj56CB5Lit55u05o6l5Y+R55Sf55qE6K6/6Zeu44CC 5b2T6K6/6Zeu5piv6Ze05o6l5Y+R55Sf55qE77yI6YCa6L+H6LCD55So5qOA5rWL5Ye95pWw77yJ Cj4r5oiW5L2/55So5rKh5pyJ57yW6K+R5Zmo5qOA5rWL55qE5Z+65LqO56Gs5Lu25qCH562+55qE 5qih5byP5pe277yM5a6D5rKh5pyJ5biu5Yqp44CCCgrmo4DmtYsgLT4g5o+S5qGpCgo+K+WvueS6 jui9r+S7tktBU0FO5qih5byP77yM6KaB5Zyo5b2T5YmN5Lu75Yqh55qE5LiA6YOo5YiG5YaF5qC4 5Luj56CB5Lit56aB55SoS0FTQU7miqXlkYrvvIwKPivor7fkvb/nlKggYGBrYXNhbl9kaXNhYmxl X2N1cnJlbnQoKWBgL2Bga2FzYW5fZW5hYmxlX2N1cnJlbnQoKWBgCj4r6YOo5YiG5rOo6YeK6L+Z 6YOo5YiG5Luj56CB44CC6L+Z5Lmf5Lya56aB55So6YCa6L+H5Ye95pWw6LCD55So5Y+R55Sf55qE 6Ze05o6l6K6/6Zeu55qE5oql5ZGK44CCCj4rCj4r5a+55LqO5Z+65LqO5qCH562+55qES0FTQU7m qKHlvI/vvIjljIXmi6znoazku7bmqKHlvI/vvInvvIzopoHnpoHnlKjorr/pl67mo4Dmn6XvvIwK Pivor7fkvb/nlKggYGBrYXNhbl9yZXNldF90YWcoKWBgIOaIliBgYHBhZ2Vfa2FzYW5fdGFnX3Jl c2V0KClgYCDjgIIKPivor7fms6jmhI/vvIzpgJrov4cgYGBwYWdlX2thc2FuX3RhZ19yZXNldCgp YGAg5Li05pe256aB55So6K6/6Zeu5qOA5p+l6ZyA6KaB6YCa6L+HCj4rYGBwYWdlX2thc2FuX3Rh Z2BgL2BgcGFnZV9rYXNhbl90YWdfc2V0YGAg5L+d5a2Y5ZKM5oGi5aSN5q+P6aG1S0FTQU7moIfn rb7jgIIKPisKPivmtYvor5UKPit+fn5+Cj4rCj4r5pyJ5LiA5LqbS0FTQU7mtYvor5Xlj6/ku6Xp qozor4FLQVNBTuaYr+WQpuato+W4uOW3peS9nOW5tuWPr+S7peajgOa1i+afkOS6m+exu+Wei+ea hOWGheWtmOaNn+Wdj+OAggo+K+a1i+ivleeUseS4pOmDqOWIhue7hOaIkDoKPisKPisxLiDkuI5L VW5pdOa1i+ivleahhuaetumbhuaIkOeahOa1i+ivleOAguS9v+eUqCBgYENPTkZJR19LQVNBTl9L VU5JVF9URVNUYGAg5ZCv55So44CCCj4r6L+Z5Lqb5rWL6K+V5Y+v5Lul6YCa6L+H5Yeg56eN5LiN 5ZCM55qE5pa55byP6Ieq5Yqo6L+Q6KGM5ZKM6YOo5YiG6aqM6K+B77yb6K+35Y+C6ZiF5LiL6Z2i 55qE6K+05piO44CCCj4rCj4rMi4g5LiOS1VuaXTkuI3lhbzlrrnnmoTmtYvor5XjgILkvb/nlKgg YGBDT05GSUdfS0FTQU5fTU9EVUxFX1RFU1RgYAo+K+WQr+eUqOW5tuS4lOWPquiDveS9nOS4uuao oeWdl+i/kOihjOOAgui/meS6m+a1i+ivleWPquiDvemAmui/h+WKoOi9veWGheaguOaooeWdl+W5 tuajgOafpeWGheaguAo+K+aXpeW/l+S7peiOt+WPlktBU0FO5oql5ZGK5p2l5omL5Yqo6aqM6K+B 44CCCj4rCj4r5aaC5p6c5qOA5rWL5Yiw6ZSZ6K+v77yM5q+P5LiqS1VuaXTlhbzlrrnnmoRLQVNB Tua1i+ivlemDveS8muaJk+WNsOWkmuS4qktBU0FO5oql5ZGK5LmL5LiA77yMCj4r54S25ZCO5rWL 6K+V5omT5Y2w5YW257yW5Y+35ZKM54q25oCB44CCCj4rCj4r5b2T5rWL6K+V6YCa6L+HOjoKPisK PisgICAgICAgIG9rIDI4IC0ga21hbGxvY19kb3VibGVfa3pmcmVlCj4rCj4r5b2T55Sx5LqOIGBg a21hbGxvY2BgIOWksei0peiAjOWvvOiHtOa1i+ivleWksei0peaXtjo6Cj4rCj4rICAgICAgICAj IGttYWxsb2NfbGFyZ2Vfb29iX3JpZ2h0OiBBU1NFUlRJT04gRkFJTEVEIGF0IGxpYi90ZXN0X2th c2FuLmM6MTYzCj4rICAgICAgICBFeHBlY3RlZCBwdHIgaXMgbm90IG51bGwsIGJ1dCBpcwo+KyAg ICAgICAgbm90IG9rIDQgLSBrbWFsbG9jX2xhcmdlX29vYl9yaWdodAo+Kwo+K+W9k+eUseS6jue8 uuWwkUtBU0FO5oql5ZGK6ICM5a+86Ie05rWL6K+V5aSx6LSl5pe2OjoKPisKPisgICAgICAgICMg a21hbGxvY19kb3VibGVfa3pmcmVlOiBFWFBFQ1RBVElPTiBGQUlMRUQgYXQgbGliL3Rlc3Rfa2Fz YW4uYzo2MjkKPisgICAgICAgIEV4cGVjdGVkIGthc2FuX2RhdGEtPnJlcG9ydF9leHBlY3RlZCA9 PSBrYXNhbl9kYXRhLT5yZXBvcnRfZm91bmQsIGJ1dAo+KyAgICAgICAga2FzYW5fZGF0YS0+cmVw b3J0X2V4cGVjdGVkID09IDEKPisgICAgICAgIGthc2FuX2RhdGEtPnJlcG9ydF9mb3VuZCA9PSAw Cj4rICAgICAgICBub3Qgb2sgMjggLSBrbWFsbG9jX2RvdWJsZV9remZyZWUKPisKPivmnIDlkI7m iZPljbDmiYDmnIlLQVNBTua1i+ivleeahOe0r+enr+eKtuaAgeOAguaIkOWKnzo6Cj4rCj4rICAg ICAgICBvayAxIC0ga2FzYW4KPisKPivmiJbogIXvvIzlpoLmnpzlhbbkuK3kuIDpobnmtYvor5Xl pLHotKU6Ogo+Kwo+KyAgICAgICAgbm90IG9rIDEgLSBrYXNhbgo+Kwo+K+acieWHoOenjeaWueaz leWPr+S7pei/kOihjOS4jktVbml05YW85a6555qES0FTQU7mtYvor5XjgIIKPisKPisxLiDlj6/l iqDovb3mqKHlnZcKPisKPisgICDlkK/nlKggYGBDT05GSUdfS1VOSVRgYCDlkI7vvIxLQVNBTi1L VW5pdOa1i+ivleWPr+S7peaehOW7uuS4uuWPr+WKoOi9veaooeWdl++8jAo+KyAgIOW5tumAmui/ h+S9v+eUqCBgYGluc21vZGBgIOaIliBgYG1vZHByb2JlYGAg5Yqg6L29IGBgdGVzdF9rYXNhbi5r b2BgIOadpei/kOihjOOAggo+Kwo+KzIuIOWGhee9rgo+Kwo+KyAgIOmAmui/h+WGhee9riBgYENP TkZJR19LVU5JVGBgIO+8jOS5n+WPr+S7peWGhee9rktBU0FOLUtVbml05rWL6K+V44CCCj4rICAg 5Zyo6L+Z56eN5oOF5Ya15LiL77yM5rWL6K+V5bCG5Zyo5ZCv5Yqo5pe25L2c5Li65ZCO5pyf5Yid 5aeL5YyW6LCD55So6L+Q6KGM44CCCj4rCj4rMy4g5L2/55Soa3VuaXRfdG9vbAo+Kwo+KyAgIOmA mui/h+WGhee9riBgYENPTkZJR19LVU5JVGBgIOWSjCBgYENPTkZJR19LQVNBTl9LVU5JVF9URVNU YGAg77yMCj4rICAg6L+Y5Y+v5Lul5L2/55SoIGBga3VuaXRfdG9vbGBgIOS7peabtOaYk+ivu+ea hOaWueW8j+afpeeci0tVbml05rWL6K+V55qE57uT5p6c44CCCj4rICAg6L+Z5LiN5Lya5omT5Y2w 6YCa6L+H5rWL6K+V55qES0FTQU7miqXlkYrjgILmnInlhbMgYGBrdW5pdF90b29sYGAg55qE5pu0 5aSa5pyA5paw5L+h5oGv77yMCj4rICAg6K+35Y+C6ZiFIGBLVW5pdOaWh+ahoyA8aHR0cHM6Ly93 d3cua2VybmVsLm9yZy9kb2MvaHRtbC9sYXRlc3QvZGV2LXRvb2xzL2t1bml0L2luZGV4Lmh0bWw+ YF8g44CCCj4rCj4rLi4gX0tVbml0OiBodHRwczovL3d3dy5rZXJuZWwub3JnL2RvYy9odG1sL2xh dGVzdC9kZXYtdG9vbHMva3VuaXQvaW5kZXguaHRtbAo+LS0gCj4yLjcuNAo+CgpfX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwpsaW51eC1yaXNjdiBtYWlsaW5n IGxpc3QKbGludXgtcmlzY3ZAbGlzdHMuaW5mcmFkZWFkLm9yZwpodHRwOi8vbGlzdHMuaW5mcmFk ZWFkLm9yZy9tYWlsbWFuL2xpc3RpbmZvL2xpbnV4LXJpc2N2Cg==