From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id DE518383B0; Sun, 23 Jun 2024 14:45:47 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1719153948; cv=none; b=Fn/s6F9MCmtaIo7QT5tl4JnkAgAtfbI7uV2by/CCFafUUwechytFMaHCTghGUK8S8qxR3nvIS8ykqLVF/6D6pYgO9uDo4WK//F2QjE4GaiqtdhHoE1bshzUKqIE37fo91fxA0ThjxSsP6PNCwl7CKEwiyyAJUZlFWnsQ0z0+DeM= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1719153948; c=relaxed/simple; bh=2So9gXPeE07Sny7uqP3rv6mC9HKltfQ1doqelhU58K8=; h=Date:From:To:Cc:Subject:Message-ID:References:MIME-Version: Content-Type:Content-Disposition:In-Reply-To; b=WefMfq/Wuws5lV+TNHX9DpB0xqF+wsq2j8Hw28kUmA2fF3uU6xVwtfAV8sYelDh2gBOa3QTYct1sIeR6VfT/tjm9Hhk1ms9b+p3LzBFG8icWMXzsqH9oCNdNqxaBsnwM/7YgcF1wU7WVpxALYy4NkN7ZzeEvIG8hn81i2AA8FeA= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=OGHoL8UC; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="OGHoL8UC" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 980BDC2BD10; Sun, 23 Jun 2024 14:45:45 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1719153947; bh=2So9gXPeE07Sny7uqP3rv6mC9HKltfQ1doqelhU58K8=; h=Date:From:To:Cc:Subject:References:In-Reply-To:From; b=OGHoL8UC+6PmK023eAP5uTNw20h5+uankrWAFEf6PUnQGxZQ7M0gLXJpVGDZsrXr5 Rw5NWhO1O+WUGmL03Tjh0tS9BD8lysTnf6P/zFmZQkO2uMhH84g53yTSHfLh9RDXL9 vmjJHv6Tocra8dphUBrvWDYYruB7XeUqeN4ULldg1/sX5yGv43lu95XiTvJXIMdiIL e5+EmcKpmw7QSPMaZjnMcITQihyNstN14WQbhWroD/+mkAJymz2Tivk/XC0x6BQc0N d9n3abWMpYLZIqmmR7vnuir2cUPLuvHazNxgnprp2uUAV2kUMNjSaqM7AI0IFFfTVK QUFv8Lb+EGJyQ== Date: Sun, 23 Jun 2024 22:31:42 +0800 From: Jisheng Zhang To: Charlie Jenkins Cc: Paul Walmsley , Palmer Dabbelt , Albert Ou , Ard Biesheuvel , linux-riscv@lists.infradead.org, linux-kernel@vger.kernel.org, linux-efi@vger.kernel.org Subject: Re: [PATCH] riscv: enable HAVE_ARCH_STACKLEAK Message-ID: References: <20240617123029.723-1-jszhang@kernel.org> Precedence: bulk X-Mailing-List: linux-efi@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: On Fri, Jun 21, 2024 at 08:43:01PM -0700, Charlie Jenkins wrote: > On Sat, Jun 22, 2024 at 08:45:16AM +0800, Jisheng Zhang wrote: > > On Fri, Jun 21, 2024 at 03:10:42PM -0700, Charlie Jenkins wrote: > > > On Mon, Jun 17, 2024 at 08:30:29PM +0800, Jisheng Zhang wrote: > > > > Add support for the stackleak feature. Whenever the kernel returns to user > > > > space the kernel stack is filled with a poison value. > > > > > > > > At the same time, disables the plugin in EFI stub code because EFI stub > > > > is out of scope for the protection. > > > > > > > > Tested on qemu and milkv duo: > > > > / # echo STACKLEAK_ERASING > /sys/kernel/debug/provoke-crash/DIRECT > > > > [ 38.675575] lkdtm: Performing direct entry STACKLEAK_ERASING > > > > [ 38.678448] lkdtm: stackleak stack usage: > > > > [ 38.678448] high offset: 288 bytes > > > > [ 38.678448] current: 496 bytes > > > > [ 38.678448] lowest: 1328 bytes > > > > [ 38.678448] tracked: 1328 bytes > > > > [ 38.678448] untracked: 448 bytes > > > > [ 38.678448] poisoned: 14312 bytes > > > > [ 38.678448] low offset: 8 bytes > > > > [ 38.689887] lkdtm: OK: the rest of the thread stack is properly erased > > > > > > > > Signed-off-by: Jisheng Zhang > > > > --- > > > > arch/riscv/Kconfig | 1 + > > > > arch/riscv/kernel/entry.S | 4 ++++ > > > > drivers/firmware/efi/libstub/Makefile | 3 ++- > > > > 3 files changed, 7 insertions(+), 1 deletion(-) > > > > > > > > diff --git a/arch/riscv/Kconfig b/arch/riscv/Kconfig > > > > index 0525ee2d63c7..9cbfdffec96c 100644 > > > > --- a/arch/riscv/Kconfig > > > > +++ b/arch/riscv/Kconfig > > > > @@ -118,6 +118,7 @@ config RISCV > > > > select HAVE_ARCH_MMAP_RND_COMPAT_BITS if COMPAT > > > > select HAVE_ARCH_RANDOMIZE_KSTACK_OFFSET > > > > select HAVE_ARCH_SECCOMP_FILTER > > > > + select HAVE_ARCH_STACKLEAK > > > > > > When this is selected, stackleak.h include > > > arch/riscv/include/asm/thread_info.h without sizes.h and I hit: > > > > > > ./arch/riscv/include/asm/thread_info.h:30:33: error: ‘SZ_4K’ undeclared here (not in a function) > > > 30 | #define OVERFLOW_STACK_SIZE SZ_4K > > > | ^~~~~ > > > > > > Adding "#include " to thread_info.h resolves the issue. > > > I am testing this based on 6.10-rc4. Did you encounter this? > > > > I didn't meet this kind of compiler error when testing. Mind > > to share your .config file? It looks strange. > > The .config exceeds the mailing list character limit, but here is the > defconfig created with savedefconfig. It is just defconfig + > CONFIG_GCC_PLUGIN_STACKLEAK with modules removed. I can reproduce the compile error. If disabling VMAP_STACK, the error would disappear. I believe the case can be reproduced under other config combinations but we didn't find it so far ;) I will send a v2. Thanks a lot. > > CONFIG_SYSVIPC=y > CONFIG_POSIX_MQUEUE=y > CONFIG_NO_HZ_IDLE=y > CONFIG_HIGH_RES_TIMERS=y > CONFIG_BPF_SYSCALL=y > CONFIG_IKCONFIG=y > CONFIG_IKCONFIG_PROC=y > CONFIG_CGROUPS=y > CONFIG_MEMCG=y > CONFIG_CGROUP_SCHED=y > CONFIG_CFS_BANDWIDTH=y > CONFIG_RT_GROUP_SCHED=y > CONFIG_CGROUP_PIDS=y > CONFIG_CGROUP_FREEZER=y > CONFIG_CGROUP_HUGETLB=y > CONFIG_CPUSETS=y > CONFIG_CGROUP_DEVICE=y > CONFIG_CGROUP_CPUACCT=y > CONFIG_CGROUP_PERF=y > CONFIG_CGROUP_BPF=y > CONFIG_NAMESPACES=y > CONFIG_USER_NS=y > CONFIG_CHECKPOINT_RESTORE=y > CONFIG_BLK_DEV_INITRD=y > CONFIG_EXPERT=y > # CONFIG_SYSFS_SYSCALL is not set > CONFIG_PROFILING=y > CONFIG_ARCH_MICROCHIP=y > CONFIG_ARCH_RENESAS=y > CONFIG_ARCH_SIFIVE=y > CONFIG_ARCH_SOPHGO=y > CONFIG_SOC_STARFIVE=y > CONFIG_ARCH_SUNXI=y > CONFIG_ARCH_THEAD=y > CONFIG_ARCH_VIRT=y > CONFIG_ARCH_CANAAN=y > CONFIG_SMP=y > CONFIG_CPU_FREQ=y > CONFIG_CPU_FREQ_STAT=y > CONFIG_CPU_FREQ_GOV_USERSPACE=y > CONFIG_CPU_FREQ_GOV_ONDEMAND=y > CONFIG_CPUFREQ_DT=y > CONFIG_VIRTUALIZATION=y > CONFIG_ACPI=y > CONFIG_JUMP_LABEL=y > CONFIG_MODULES=y > CONFIG_MODULE_UNLOAD=y > CONFIG_SPARSEMEM_MANUAL=y > CONFIG_NET=y > CONFIG_PACKET=y > CONFIG_IP_MULTICAST=y > CONFIG_IP_ADVANCED_ROUTER=y > CONFIG_IP_PNP=y > CONFIG_IP_PNP_DHCP=y > CONFIG_IP_PNP_BOOTP=y > CONFIG_IP_PNP_RARP=y > CONFIG_NETFILTER=y > CONFIG_NET_SCHED=y > CONFIG_NETLINK_DIAG=y > CONFIG_NET_L3_MASTER_DEV=y > CONFIG_CGROUP_NET_PRIO=y > CONFIG_CGROUP_NET_CLASSID=y > CONFIG_NET_9P=y > CONFIG_NET_9P_VIRTIO=y > CONFIG_PCI=y > CONFIG_PCIEPORTBUS=y > CONFIG_PCI_HOST_GENERIC=y > CONFIG_PCIE_XILINX=y > CONFIG_PCIE_FU740=y > CONFIG_DEVTMPFS=y > CONFIG_DEVTMPFS_MOUNT=y > CONFIG_MTD=y > CONFIG_MTD_BLOCK=y > CONFIG_MTD_CFI=y > CONFIG_MTD_CFI_ADV_OPTIONS=y > CONFIG_MTD_SPI_NOR=y > CONFIG_BLK_DEV_LOOP=y > CONFIG_VIRTIO_BLK=y > CONFIG_BLK_DEV_SD=y > CONFIG_BLK_DEV_SR=y > CONFIG_SCSI_VIRTIO=y > CONFIG_ATA=y > CONFIG_SATA_AHCI=y > CONFIG_SATA_AHCI_PLATFORM=y > CONFIG_MD=y > CONFIG_NETDEVICES=y > CONFIG_VIRTIO_NET=y > CONFIG_MACB=y > CONFIG_E1000E=y > CONFIG_R8169=y > CONFIG_RAVB=y > CONFIG_MICREL_PHY=y > CONFIG_MICROSEMI_PHY=y > CONFIG_INPUT_MOUSEDEV=y > CONFIG_SERIAL_8250=y > CONFIG_SERIAL_8250_CONSOLE=y > CONFIG_SERIAL_8250_DW=y > CONFIG_SERIAL_OF_PLATFORM=y > CONFIG_SERIAL_EARLYCON_RISCV_SBI=y > CONFIG_SERIAL_SH_SCI=y > CONFIG_VIRTIO_CONSOLE=y > CONFIG_HW_RANDOM=y > CONFIG_HW_RANDOM_VIRTIO=y > CONFIG_SPI=y > CONFIG_SPI_SIFIVE=y > CONFIG_SPI_SUN6I=y > # CONFIG_PTP_1588_CLOCK is not set > CONFIG_GPIO_SIFIVE=y > CONFIG_CPU_THERMAL=y > CONFIG_RZG2L_THERMAL=y > CONFIG_WATCHDOG=y > CONFIG_SUNXI_WATCHDOG=y > CONFIG_RENESAS_RZG2LWDT=y > CONFIG_REGULATOR=y > CONFIG_REGULATOR_FIXED_VOLTAGE=y > CONFIG_REGULATOR_GPIO=y > CONFIG_FB=y > CONFIG_FRAMEBUFFER_CONSOLE=y > CONFIG_FRAMEBUFFER_CONSOLE_DETECT_PRIMARY=y > CONFIG_SOUND=y > CONFIG_SND=y > CONFIG_SND_SOC=y > CONFIG_USB=y > CONFIG_USB_OTG=y > CONFIG_USB_XHCI_HCD=y > CONFIG_USB_XHCI_PLATFORM=y > CONFIG_USB_EHCI_HCD=y > CONFIG_USB_EHCI_HCD_PLATFORM=y > CONFIG_USB_OHCI_HCD=y > CONFIG_USB_OHCI_HCD_PLATFORM=y > CONFIG_USB_STORAGE=y > CONFIG_USB_UAS=y > CONFIG_USB_GADGET=y > CONFIG_MMC=y > CONFIG_MMC_SDHCI=y > CONFIG_MMC_SDHCI_PLTFM=y > CONFIG_MMC_SDHCI_OF_DWCMSHC=y > CONFIG_MMC_SDHCI_CADENCE=y > CONFIG_MMC_SPI=y > CONFIG_MMC_SDHI=y > CONFIG_MMC_DW=y > CONFIG_MMC_DW_STARFIVE=y > CONFIG_MMC_SUNXI=y > CONFIG_RTC_CLASS=y > CONFIG_RTC_DRV_SUN6I=y > CONFIG_DMADEVICES=y > CONFIG_DW_AXI_DMAC=y > CONFIG_SYNC_FILE=y > CONFIG_VIRTIO_PCI=y > CONFIG_VIRTIO_BALLOON=y > CONFIG_VIRTIO_INPUT=y > CONFIG_VIRTIO_MMIO=y > CONFIG_CLK_SOPHGO_CV1800=y > # CONFIG_CLK_STARFIVE_JH7100_AUDIO is not set > # CONFIG_CLK_STARFIVE_JH7110_AON is not set > # CONFIG_CLK_STARFIVE_JH7110_STG is not set > # CONFIG_CLK_STARFIVE_JH7110_ISP is not set > # CONFIG_CLK_STARFIVE_JH7110_VOUT is not set > # CONFIG_SUN8I_DE2_CCU is not set > CONFIG_RENESAS_OSTM=y > CONFIG_MAILBOX=y > CONFIG_PCC=y > CONFIG_SUN50I_IOMMU=y > CONFIG_RPMSG_CHAR=y > CONFIG_RPMSG_CTRL=y > CONFIG_RPMSG_VIRTIO=y > CONFIG_EXTCON=y > CONFIG_IIO=y > CONFIG_PHY_RCAR_GEN3_USB2=y > CONFIG_LIBNVDIMM=y > CONFIG_NVMEM_SUNXI_SID=y > CONFIG_EXT4_FS=y > CONFIG_EXT4_FS_POSIX_ACL=y > CONFIG_EXT4_FS_SECURITY=y > CONFIG_AUTOFS_FS=y > CONFIG_ISO9660_FS=y > CONFIG_JOLIET=y > CONFIG_ZISOFS=y > CONFIG_MSDOS_FS=y > CONFIG_VFAT_FS=y > CONFIG_TMPFS=y > CONFIG_TMPFS_POSIX_ACL=y > CONFIG_HUGETLBFS=y > # CONFIG_EFIVAR_FS is not set > CONFIG_NFS_FS=y > CONFIG_NFS_V4=y > CONFIG_NFS_V4_1=y > CONFIG_NFS_V4_2=y > CONFIG_ROOT_NFS=y > CONFIG_9P_FS=y > CONFIG_NLS_CODEPAGE_437=y > CONFIG_SECURITY=y > CONFIG_SECURITY_SELINUX=y > CONFIG_SECURITY_APPARMOR=y > CONFIG_DEFAULT_SECURITY_DAC=y > CONFIG_GCC_PLUGIN_STACKLEAK=y > CONFIG_CRYPTO_USER_API_HASH=y > CONFIG_CRYPTO_DEV_VIRTIO=y > CONFIG_PRINTK_TIME=y > CONFIG_DEBUG_FS=y > CONFIG_DEBUG_PAGEALLOC=y > CONFIG_SCHED_STACK_END_CHECK=y > CONFIG_DEBUG_VM=y > CONFIG_DEBUG_VM_PGFLAGS=y > CONFIG_DEBUG_MEMORY_INIT=y > CONFIG_DEBUG_PER_CPU_MAPS=y > CONFIG_SOFTLOCKUP_DETECTOR=y > CONFIG_WQ_WATCHDOG=y > CONFIG_DEBUG_TIMEKEEPING=y > CONFIG_DEBUG_RT_MUTEXES=y > CONFIG_DEBUG_SPINLOCK=y > CONFIG_DEBUG_MUTEXES=y > CONFIG_DEBUG_RWSEMS=y > CONFIG_DEBUG_ATOMIC_SLEEP=y > CONFIG_DEBUG_LIST=y > CONFIG_DEBUG_PLIST=y > CONFIG_DEBUG_SG=y > # CONFIG_RCU_TRACE is not set > CONFIG_RCU_EQS_DEBUG=y > # CONFIG_FTRACE is not set > # CONFIG_RUNTIME_TESTING_MENU is not set > CONFIG_MEMTEST=y > 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 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 smtp.lore.kernel.org (Postfix) with ESMTPS id D5A95C27C4F for ; Sun, 23 Jun 2024 14:45:59 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender: Content-Transfer-Encoding:Content-Type: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=SrHvOKwVVNFWwUTJLLSVrTDuHypeRhtvekOFekAZLqw=; b=GZp3jJR9f73S7C wy7Y3Xu/biV2ealYW2/fU2b3WkxgTvfKsa/4lTfi0BpOKOHre577sWpyfeadcwEENq/v/JSU0TEdj r2jJ9Hyt1BloN39nlWqrDltXn2mrD/ZV/bSTl2c6/HiMa7/PZN4iRs8KpdfWv/PnMzDmyojYpg9A7 BZCHShAQHw+q7n0KFj8g7hLACclhSqnBycGUeOoH2D9MQ4M4WfZQS8unAlK/CdBDORTx5hN6QF8m1 2Kp3FLq3v09JWf6Pb96hDRyHbFFy1vKBAr5fUnezk3M0TkQsQH6HtTpwx2v63BuSLGl7D0xGHQnN7 M/yYFUfA46iuz1n5N0KA==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.97.1 #2 (Red Hat Linux)) id 1sLOTY-0000000EDFB-3rI6; Sun, 23 Jun 2024 14:45:52 +0000 Received: from dfw.source.kernel.org ([139.178.84.217]) by bombadil.infradead.org with esmtps (Exim 4.97.1 #2 (Red Hat Linux)) id 1sLOTW-0000000EDEi-0IZP for linux-riscv@lists.infradead.org; Sun, 23 Jun 2024 14:45:51 +0000 Received: from smtp.kernel.org (transwarp.subspace.kernel.org [100.75.92.58]) by dfw.source.kernel.org (Postfix) with ESMTP id BF1A660C3E; Sun, 23 Jun 2024 14:45:47 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id 980BDC2BD10; Sun, 23 Jun 2024 14:45:45 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1719153947; bh=2So9gXPeE07Sny7uqP3rv6mC9HKltfQ1doqelhU58K8=; h=Date:From:To:Cc:Subject:References:In-Reply-To:From; b=OGHoL8UC+6PmK023eAP5uTNw20h5+uankrWAFEf6PUnQGxZQ7M0gLXJpVGDZsrXr5 Rw5NWhO1O+WUGmL03Tjh0tS9BD8lysTnf6P/zFmZQkO2uMhH84g53yTSHfLh9RDXL9 vmjJHv6Tocra8dphUBrvWDYYruB7XeUqeN4ULldg1/sX5yGv43lu95XiTvJXIMdiIL e5+EmcKpmw7QSPMaZjnMcITQihyNstN14WQbhWroD/+mkAJymz2Tivk/XC0x6BQc0N d9n3abWMpYLZIqmmR7vnuir2cUPLuvHazNxgnprp2uUAV2kUMNjSaqM7AI0IFFfTVK QUFv8Lb+EGJyQ== Date: Sun, 23 Jun 2024 22:31:42 +0800 From: Jisheng Zhang To: Charlie Jenkins Cc: Paul Walmsley , Palmer Dabbelt , Albert Ou , Ard Biesheuvel , linux-riscv@lists.infradead.org, linux-kernel@vger.kernel.org, linux-efi@vger.kernel.org Subject: Re: [PATCH] riscv: enable HAVE_ARCH_STACKLEAK Message-ID: References: <20240617123029.723-1-jszhang@kernel.org> MIME-Version: 1.0 Content-Disposition: inline In-Reply-To: X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20240623_074550_270119_358CF907 X-CRM114-Status: GOOD ( 26.12 ) 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-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Sender: "linux-riscv" Errors-To: linux-riscv-bounces+linux-riscv=archiver.kernel.org@lists.infradead.org T24gRnJpLCBKdW4gMjEsIDIwMjQgYXQgMDg6NDM6MDFQTSAtMDcwMCwgQ2hhcmxpZSBKZW5raW5z IHdyb3RlOgo+IE9uIFNhdCwgSnVuIDIyLCAyMDI0IGF0IDA4OjQ1OjE2QU0gKzA4MDAsIEppc2hl bmcgWmhhbmcgd3JvdGU6Cj4gPiBPbiBGcmksIEp1biAyMSwgMjAyNCBhdCAwMzoxMDo0MlBNIC0w NzAwLCBDaGFybGllIEplbmtpbnMgd3JvdGU6Cj4gPiA+IE9uIE1vbiwgSnVuIDE3LCAyMDI0IGF0 IDA4OjMwOjI5UE0gKzA4MDAsIEppc2hlbmcgWmhhbmcgd3JvdGU6Cj4gPiA+ID4gQWRkIHN1cHBv cnQgZm9yIHRoZSBzdGFja2xlYWsgZmVhdHVyZS4gV2hlbmV2ZXIgdGhlIGtlcm5lbCByZXR1cm5z IHRvIHVzZXIKPiA+ID4gPiBzcGFjZSB0aGUga2VybmVsIHN0YWNrIGlzIGZpbGxlZCB3aXRoIGEg cG9pc29uIHZhbHVlLgo+ID4gPiA+IAo+ID4gPiA+IEF0IHRoZSBzYW1lIHRpbWUsIGRpc2FibGVz IHRoZSBwbHVnaW4gaW4gRUZJIHN0dWIgY29kZSBiZWNhdXNlIEVGSSBzdHViCj4gPiA+ID4gaXMg b3V0IG9mIHNjb3BlIGZvciB0aGUgcHJvdGVjdGlvbi4KPiA+ID4gPiAKPiA+ID4gPiBUZXN0ZWQg b24gcWVtdSBhbmQgbWlsa3YgZHVvOgo+ID4gPiA+IC8gIyBlY2hvIFNUQUNLTEVBS19FUkFTSU5H ID4gL3N5cy9rZXJuZWwvZGVidWcvcHJvdm9rZS1jcmFzaC9ESVJFQ1QKPiA+ID4gPiBbICAgMzgu Njc1NTc1XSBsa2R0bTogUGVyZm9ybWluZyBkaXJlY3QgZW50cnkgU1RBQ0tMRUFLX0VSQVNJTkcK PiA+ID4gPiBbICAgMzguNjc4NDQ4XSBsa2R0bTogc3RhY2tsZWFrIHN0YWNrIHVzYWdlOgo+ID4g PiA+IFsgICAzOC42Nzg0NDhdICAgaGlnaCBvZmZzZXQ6IDI4OCBieXRlcwo+ID4gPiA+IFsgICAz OC42Nzg0NDhdICAgY3VycmVudDogICAgIDQ5NiBieXRlcwo+ID4gPiA+IFsgICAzOC42Nzg0NDhd ICAgbG93ZXN0OiAgICAgIDEzMjggYnl0ZXMKPiA+ID4gPiBbICAgMzguNjc4NDQ4XSAgIHRyYWNr ZWQ6ICAgICAxMzI4IGJ5dGVzCj4gPiA+ID4gWyAgIDM4LjY3ODQ0OF0gICB1bnRyYWNrZWQ6ICAg NDQ4IGJ5dGVzCj4gPiA+ID4gWyAgIDM4LjY3ODQ0OF0gICBwb2lzb25lZDogICAgMTQzMTIgYnl0 ZXMKPiA+ID4gPiBbICAgMzguNjc4NDQ4XSAgIGxvdyBvZmZzZXQ6ICA4IGJ5dGVzCj4gPiA+ID4g WyAgIDM4LjY4OTg4N10gbGtkdG06IE9LOiB0aGUgcmVzdCBvZiB0aGUgdGhyZWFkIHN0YWNrIGlz IHByb3Blcmx5IGVyYXNlZAo+ID4gPiA+IAo+ID4gPiA+IFNpZ25lZC1vZmYtYnk6IEppc2hlbmcg WmhhbmcgPGpzemhhbmdAa2VybmVsLm9yZz4KPiA+ID4gPiAtLS0KPiA+ID4gPiAgYXJjaC9yaXNj di9LY29uZmlnICAgICAgICAgICAgICAgICAgICB8IDEgKwo+ID4gPiA+ICBhcmNoL3Jpc2N2L2tl cm5lbC9lbnRyeS5TICAgICAgICAgICAgIHwgNCArKysrCj4gPiA+ID4gIGRyaXZlcnMvZmlybXdh cmUvZWZpL2xpYnN0dWIvTWFrZWZpbGUgfCAzICsrLQo+ID4gPiA+ICAzIGZpbGVzIGNoYW5nZWQs IDcgaW5zZXJ0aW9ucygrKSwgMSBkZWxldGlvbigtKQo+ID4gPiA+IAo+ID4gPiA+IGRpZmYgLS1n aXQgYS9hcmNoL3Jpc2N2L0tjb25maWcgYi9hcmNoL3Jpc2N2L0tjb25maWcKPiA+ID4gPiBpbmRl eCAwNTI1ZWUyZDYzYzcuLjljYmZkZmZlYzk2YyAxMDA2NDQKPiA+ID4gPiAtLS0gYS9hcmNoL3Jp c2N2L0tjb25maWcKPiA+ID4gPiArKysgYi9hcmNoL3Jpc2N2L0tjb25maWcKPiA+ID4gPiBAQCAt MTE4LDYgKzExOCw3IEBAIGNvbmZpZyBSSVNDVgo+ID4gPiA+ICAJc2VsZWN0IEhBVkVfQVJDSF9N TUFQX1JORF9DT01QQVRfQklUUyBpZiBDT01QQVQKPiA+ID4gPiAgCXNlbGVjdCBIQVZFX0FSQ0hf UkFORE9NSVpFX0tTVEFDS19PRkZTRVQKPiA+ID4gPiAgCXNlbGVjdCBIQVZFX0FSQ0hfU0VDQ09N UF9GSUxURVIKPiA+ID4gPiArCXNlbGVjdCBIQVZFX0FSQ0hfU1RBQ0tMRUFLCj4gPiA+IAo+ID4g PiBXaGVuIHRoaXMgaXMgc2VsZWN0ZWQsIHN0YWNrbGVhay5oIGluY2x1ZGUKPiA+ID4gYXJjaC9y aXNjdi9pbmNsdWRlL2FzbS90aHJlYWRfaW5mby5oIHdpdGhvdXQgc2l6ZXMuaCBhbmQgSSBoaXQ6 Cj4gPiA+IAo+ID4gPiAuL2FyY2gvcmlzY3YvaW5jbHVkZS9hc20vdGhyZWFkX2luZm8uaDozMDoz MzogZXJyb3I6IOKAmFNaXzRL4oCZIHVuZGVjbGFyZWQgaGVyZSAobm90IGluIGEgZnVuY3Rpb24p Cj4gPiA+ICAgIDMwIHwgI2RlZmluZSBPVkVSRkxPV19TVEFDS19TSVpFICAgICBTWl80Swo+ID4g PiAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXn5+fn4KPiA+ID4gCj4g PiA+IEFkZGluZyAiI2luY2x1ZGUgPGxpbnV4L3NpemVzLmg+IiB0byB0aHJlYWRfaW5mby5oIHJl c29sdmVzIHRoZSBpc3N1ZS4KPiA+ID4gSSBhbSB0ZXN0aW5nIHRoaXMgYmFzZWQgb24gNi4xMC1y YzQuIERpZCB5b3UgZW5jb3VudGVyIHRoaXM/Cj4gPiAKPiA+IEkgZGlkbid0IG1lZXQgdGhpcyBr aW5kIG9mIGNvbXBpbGVyIGVycm9yIHdoZW4gdGVzdGluZy4gTWluZAo+ID4gdG8gc2hhcmUgeW91 ciAuY29uZmlnIGZpbGU/IEl0IGxvb2tzIHN0cmFuZ2UuCj4gCj4gVGhlIC5jb25maWcgZXhjZWVk cyB0aGUgbWFpbGluZyBsaXN0IGNoYXJhY3RlciBsaW1pdCwgYnV0IGhlcmUgaXMgdGhlCj4gZGVm Y29uZmlnIGNyZWF0ZWQgd2l0aCBzYXZlZGVmY29uZmlnLiBJdCBpcyBqdXN0IGRlZmNvbmZpZyAr Cj4gQ09ORklHX0dDQ19QTFVHSU5fU1RBQ0tMRUFLIHdpdGggbW9kdWxlcyByZW1vdmVkLiAKCkkg Y2FuIHJlcHJvZHVjZSB0aGUgY29tcGlsZSBlcnJvci4gSWYgZGlzYWJsaW5nIFZNQVBfU1RBQ0ss IHRoZSBlcnJvcgp3b3VsZCBkaXNhcHBlYXIuIEkgYmVsaWV2ZSB0aGUgY2FzZSBjYW4gYmUgcmVw cm9kdWNlZCB1bmRlciBvdGhlcgpjb25maWcgY29tYmluYXRpb25zIGJ1dCB3ZSBkaWRuJ3QgZmlu ZCBpdCBzbyBmYXIgOykKCkkgd2lsbCBzZW5kIGEgdjIuCgpUaGFua3MgYSBsb3QuCj4gCj4gQ09O RklHX1NZU1ZJUEM9eQo+IENPTkZJR19QT1NJWF9NUVVFVUU9eQo+IENPTkZJR19OT19IWl9JRExF PXkKPiBDT05GSUdfSElHSF9SRVNfVElNRVJTPXkKPiBDT05GSUdfQlBGX1NZU0NBTEw9eQo+IENP TkZJR19JS0NPTkZJRz15Cj4gQ09ORklHX0lLQ09ORklHX1BST0M9eQo+IENPTkZJR19DR1JPVVBT PXkKPiBDT05GSUdfTUVNQ0c9eQo+IENPTkZJR19DR1JPVVBfU0NIRUQ9eQo+IENPTkZJR19DRlNf QkFORFdJRFRIPXkKPiBDT05GSUdfUlRfR1JPVVBfU0NIRUQ9eQo+IENPTkZJR19DR1JPVVBfUElE Uz15Cj4gQ09ORklHX0NHUk9VUF9GUkVFWkVSPXkKPiBDT05GSUdfQ0dST1VQX0hVR0VUTEI9eQo+ IENPTkZJR19DUFVTRVRTPXkKPiBDT05GSUdfQ0dST1VQX0RFVklDRT15Cj4gQ09ORklHX0NHUk9V UF9DUFVBQ0NUPXkKPiBDT05GSUdfQ0dST1VQX1BFUkY9eQo+IENPTkZJR19DR1JPVVBfQlBGPXkK PiBDT05GSUdfTkFNRVNQQUNFUz15Cj4gQ09ORklHX1VTRVJfTlM9eQo+IENPTkZJR19DSEVDS1BP SU5UX1JFU1RPUkU9eQo+IENPTkZJR19CTEtfREVWX0lOSVRSRD15Cj4gQ09ORklHX0VYUEVSVD15 Cj4gIyBDT05GSUdfU1lTRlNfU1lTQ0FMTCBpcyBub3Qgc2V0Cj4gQ09ORklHX1BST0ZJTElORz15 Cj4gQ09ORklHX0FSQ0hfTUlDUk9DSElQPXkKPiBDT05GSUdfQVJDSF9SRU5FU0FTPXkKPiBDT05G SUdfQVJDSF9TSUZJVkU9eQo+IENPTkZJR19BUkNIX1NPUEhHTz15Cj4gQ09ORklHX1NPQ19TVEFS RklWRT15Cj4gQ09ORklHX0FSQ0hfU1VOWEk9eQo+IENPTkZJR19BUkNIX1RIRUFEPXkKPiBDT05G SUdfQVJDSF9WSVJUPXkKPiBDT05GSUdfQVJDSF9DQU5BQU49eQo+IENPTkZJR19TTVA9eQo+IENP TkZJR19DUFVfRlJFUT15Cj4gQ09ORklHX0NQVV9GUkVRX1NUQVQ9eQo+IENPTkZJR19DUFVfRlJF UV9HT1ZfVVNFUlNQQUNFPXkKPiBDT05GSUdfQ1BVX0ZSRVFfR09WX09OREVNQU5EPXkKPiBDT05G SUdfQ1BVRlJFUV9EVD15Cj4gQ09ORklHX1ZJUlRVQUxJWkFUSU9OPXkKPiBDT05GSUdfQUNQST15 Cj4gQ09ORklHX0pVTVBfTEFCRUw9eQo+IENPTkZJR19NT0RVTEVTPXkKPiBDT05GSUdfTU9EVUxF X1VOTE9BRD15Cj4gQ09ORklHX1NQQVJTRU1FTV9NQU5VQUw9eQo+IENPTkZJR19ORVQ9eQo+IENP TkZJR19QQUNLRVQ9eQo+IENPTkZJR19JUF9NVUxUSUNBU1Q9eQo+IENPTkZJR19JUF9BRFZBTkNF RF9ST1VURVI9eQo+IENPTkZJR19JUF9QTlA9eQo+IENPTkZJR19JUF9QTlBfREhDUD15Cj4gQ09O RklHX0lQX1BOUF9CT09UUD15Cj4gQ09ORklHX0lQX1BOUF9SQVJQPXkKPiBDT05GSUdfTkVURklM VEVSPXkKPiBDT05GSUdfTkVUX1NDSEVEPXkKPiBDT05GSUdfTkVUTElOS19ESUFHPXkKPiBDT05G SUdfTkVUX0wzX01BU1RFUl9ERVY9eQo+IENPTkZJR19DR1JPVVBfTkVUX1BSSU89eQo+IENPTkZJ R19DR1JPVVBfTkVUX0NMQVNTSUQ9eQo+IENPTkZJR19ORVRfOVA9eQo+IENPTkZJR19ORVRfOVBf VklSVElPPXkKPiBDT05GSUdfUENJPXkKPiBDT05GSUdfUENJRVBPUlRCVVM9eQo+IENPTkZJR19Q Q0lfSE9TVF9HRU5FUklDPXkKPiBDT05GSUdfUENJRV9YSUxJTlg9eQo+IENPTkZJR19QQ0lFX0ZV NzQwPXkKPiBDT05GSUdfREVWVE1QRlM9eQo+IENPTkZJR19ERVZUTVBGU19NT1VOVD15Cj4gQ09O RklHX01URD15Cj4gQ09ORklHX01URF9CTE9DSz15Cj4gQ09ORklHX01URF9DRkk9eQo+IENPTkZJ R19NVERfQ0ZJX0FEVl9PUFRJT05TPXkKPiBDT05GSUdfTVREX1NQSV9OT1I9eQo+IENPTkZJR19C TEtfREVWX0xPT1A9eQo+IENPTkZJR19WSVJUSU9fQkxLPXkKPiBDT05GSUdfQkxLX0RFVl9TRD15 Cj4gQ09ORklHX0JMS19ERVZfU1I9eQo+IENPTkZJR19TQ1NJX1ZJUlRJTz15Cj4gQ09ORklHX0FU QT15Cj4gQ09ORklHX1NBVEFfQUhDST15Cj4gQ09ORklHX1NBVEFfQUhDSV9QTEFURk9STT15Cj4g Q09ORklHX01EPXkKPiBDT05GSUdfTkVUREVWSUNFUz15Cj4gQ09ORklHX1ZJUlRJT19ORVQ9eQo+ IENPTkZJR19NQUNCPXkKPiBDT05GSUdfRTEwMDBFPXkKPiBDT05GSUdfUjgxNjk9eQo+IENPTkZJ R19SQVZCPXkKPiBDT05GSUdfTUlDUkVMX1BIWT15Cj4gQ09ORklHX01JQ1JPU0VNSV9QSFk9eQo+ IENPTkZJR19JTlBVVF9NT1VTRURFVj15Cj4gQ09ORklHX1NFUklBTF84MjUwPXkKPiBDT05GSUdf U0VSSUFMXzgyNTBfQ09OU09MRT15Cj4gQ09ORklHX1NFUklBTF84MjUwX0RXPXkKPiBDT05GSUdf U0VSSUFMX09GX1BMQVRGT1JNPXkKPiBDT05GSUdfU0VSSUFMX0VBUkxZQ09OX1JJU0NWX1NCST15 Cj4gQ09ORklHX1NFUklBTF9TSF9TQ0k9eQo+IENPTkZJR19WSVJUSU9fQ09OU09MRT15Cj4gQ09O RklHX0hXX1JBTkRPTT15Cj4gQ09ORklHX0hXX1JBTkRPTV9WSVJUSU89eQo+IENPTkZJR19TUEk9 eQo+IENPTkZJR19TUElfU0lGSVZFPXkKPiBDT05GSUdfU1BJX1NVTjZJPXkKPiAjIENPTkZJR19Q VFBfMTU4OF9DTE9DSyBpcyBub3Qgc2V0Cj4gQ09ORklHX0dQSU9fU0lGSVZFPXkKPiBDT05GSUdf Q1BVX1RIRVJNQUw9eQo+IENPTkZJR19SWkcyTF9USEVSTUFMPXkKPiBDT05GSUdfV0FUQ0hET0c9 eQo+IENPTkZJR19TVU5YSV9XQVRDSERPRz15Cj4gQ09ORklHX1JFTkVTQVNfUlpHMkxXRFQ9eQo+ IENPTkZJR19SRUdVTEFUT1I9eQo+IENPTkZJR19SRUdVTEFUT1JfRklYRURfVk9MVEFHRT15Cj4g Q09ORklHX1JFR1VMQVRPUl9HUElPPXkKPiBDT05GSUdfRkI9eQo+IENPTkZJR19GUkFNRUJVRkZF Ul9DT05TT0xFPXkKPiBDT05GSUdfRlJBTUVCVUZGRVJfQ09OU09MRV9ERVRFQ1RfUFJJTUFSWT15 Cj4gQ09ORklHX1NPVU5EPXkKPiBDT05GSUdfU05EPXkKPiBDT05GSUdfU05EX1NPQz15Cj4gQ09O RklHX1VTQj15Cj4gQ09ORklHX1VTQl9PVEc9eQo+IENPTkZJR19VU0JfWEhDSV9IQ0Q9eQo+IENP TkZJR19VU0JfWEhDSV9QTEFURk9STT15Cj4gQ09ORklHX1VTQl9FSENJX0hDRD15Cj4gQ09ORklH X1VTQl9FSENJX0hDRF9QTEFURk9STT15Cj4gQ09ORklHX1VTQl9PSENJX0hDRD15Cj4gQ09ORklH X1VTQl9PSENJX0hDRF9QTEFURk9STT15Cj4gQ09ORklHX1VTQl9TVE9SQUdFPXkKPiBDT05GSUdf VVNCX1VBUz15Cj4gQ09ORklHX1VTQl9HQURHRVQ9eQo+IENPTkZJR19NTUM9eQo+IENPTkZJR19N TUNfU0RIQ0k9eQo+IENPTkZJR19NTUNfU0RIQ0lfUExURk09eQo+IENPTkZJR19NTUNfU0RIQ0lf T0ZfRFdDTVNIQz15Cj4gQ09ORklHX01NQ19TREhDSV9DQURFTkNFPXkKPiBDT05GSUdfTU1DX1NQ ST15Cj4gQ09ORklHX01NQ19TREhJPXkKPiBDT05GSUdfTU1DX0RXPXkKPiBDT05GSUdfTU1DX0RX X1NUQVJGSVZFPXkKPiBDT05GSUdfTU1DX1NVTlhJPXkKPiBDT05GSUdfUlRDX0NMQVNTPXkKPiBD T05GSUdfUlRDX0RSVl9TVU42ST15Cj4gQ09ORklHX0RNQURFVklDRVM9eQo+IENPTkZJR19EV19B WElfRE1BQz15Cj4gQ09ORklHX1NZTkNfRklMRT15Cj4gQ09ORklHX1ZJUlRJT19QQ0k9eQo+IENP TkZJR19WSVJUSU9fQkFMTE9PTj15Cj4gQ09ORklHX1ZJUlRJT19JTlBVVD15Cj4gQ09ORklHX1ZJ UlRJT19NTUlPPXkKPiBDT05GSUdfQ0xLX1NPUEhHT19DVjE4MDA9eQo+ICMgQ09ORklHX0NMS19T VEFSRklWRV9KSDcxMDBfQVVESU8gaXMgbm90IHNldAo+ICMgQ09ORklHX0NMS19TVEFSRklWRV9K SDcxMTBfQU9OIGlzIG5vdCBzZXQKPiAjIENPTkZJR19DTEtfU1RBUkZJVkVfSkg3MTEwX1NURyBp cyBub3Qgc2V0Cj4gIyBDT05GSUdfQ0xLX1NUQVJGSVZFX0pINzExMF9JU1AgaXMgbm90IHNldAo+ ICMgQ09ORklHX0NMS19TVEFSRklWRV9KSDcxMTBfVk9VVCBpcyBub3Qgc2V0Cj4gIyBDT05GSUdf U1VOOElfREUyX0NDVSBpcyBub3Qgc2V0Cj4gQ09ORklHX1JFTkVTQVNfT1NUTT15Cj4gQ09ORklH X01BSUxCT1g9eQo+IENPTkZJR19QQ0M9eQo+IENPTkZJR19TVU41MElfSU9NTVU9eQo+IENPTkZJ R19SUE1TR19DSEFSPXkKPiBDT05GSUdfUlBNU0dfQ1RSTD15Cj4gQ09ORklHX1JQTVNHX1ZJUlRJ Tz15Cj4gQ09ORklHX0VYVENPTj15Cj4gQ09ORklHX0lJTz15Cj4gQ09ORklHX1BIWV9SQ0FSX0dF TjNfVVNCMj15Cj4gQ09ORklHX0xJQk5WRElNTT15Cj4gQ09ORklHX05WTUVNX1NVTlhJX1NJRD15 Cj4gQ09ORklHX0VYVDRfRlM9eQo+IENPTkZJR19FWFQ0X0ZTX1BPU0lYX0FDTD15Cj4gQ09ORklH X0VYVDRfRlNfU0VDVVJJVFk9eQo+IENPTkZJR19BVVRPRlNfRlM9eQo+IENPTkZJR19JU085NjYw X0ZTPXkKPiBDT05GSUdfSk9MSUVUPXkKPiBDT05GSUdfWklTT0ZTPXkKPiBDT05GSUdfTVNET1Nf RlM9eQo+IENPTkZJR19WRkFUX0ZTPXkKPiBDT05GSUdfVE1QRlM9eQo+IENPTkZJR19UTVBGU19Q T1NJWF9BQ0w9eQo+IENPTkZJR19IVUdFVExCRlM9eQo+ICMgQ09ORklHX0VGSVZBUl9GUyBpcyBu b3Qgc2V0Cj4gQ09ORklHX05GU19GUz15Cj4gQ09ORklHX05GU19WND15Cj4gQ09ORklHX05GU19W NF8xPXkKPiBDT05GSUdfTkZTX1Y0XzI9eQo+IENPTkZJR19ST09UX05GUz15Cj4gQ09ORklHXzlQ X0ZTPXkKPiBDT05GSUdfTkxTX0NPREVQQUdFXzQzNz15Cj4gQ09ORklHX1NFQ1VSSVRZPXkKPiBD T05GSUdfU0VDVVJJVFlfU0VMSU5VWD15Cj4gQ09ORklHX1NFQ1VSSVRZX0FQUEFSTU9SPXkKPiBD T05GSUdfREVGQVVMVF9TRUNVUklUWV9EQUM9eQo+IENPTkZJR19HQ0NfUExVR0lOX1NUQUNLTEVB Sz15Cj4gQ09ORklHX0NSWVBUT19VU0VSX0FQSV9IQVNIPXkKPiBDT05GSUdfQ1JZUFRPX0RFVl9W SVJUSU89eQo+IENPTkZJR19QUklOVEtfVElNRT15Cj4gQ09ORklHX0RFQlVHX0ZTPXkKPiBDT05G SUdfREVCVUdfUEFHRUFMTE9DPXkKPiBDT05GSUdfU0NIRURfU1RBQ0tfRU5EX0NIRUNLPXkKPiBD T05GSUdfREVCVUdfVk09eQo+IENPTkZJR19ERUJVR19WTV9QR0ZMQUdTPXkKPiBDT05GSUdfREVC VUdfTUVNT1JZX0lOSVQ9eQo+IENPTkZJR19ERUJVR19QRVJfQ1BVX01BUFM9eQo+IENPTkZJR19T T0ZUTE9DS1VQX0RFVEVDVE9SPXkKPiBDT05GSUdfV1FfV0FUQ0hET0c9eQo+IENPTkZJR19ERUJV R19USU1FS0VFUElORz15Cj4gQ09ORklHX0RFQlVHX1JUX01VVEVYRVM9eQo+IENPTkZJR19ERUJV R19TUElOTE9DSz15Cj4gQ09ORklHX0RFQlVHX01VVEVYRVM9eQo+IENPTkZJR19ERUJVR19SV1NF TVM9eQo+IENPTkZJR19ERUJVR19BVE9NSUNfU0xFRVA9eQo+IENPTkZJR19ERUJVR19MSVNUPXkK PiBDT05GSUdfREVCVUdfUExJU1Q9eQo+IENPTkZJR19ERUJVR19TRz15Cj4gIyBDT05GSUdfUkNV X1RSQUNFIGlzIG5vdCBzZXQKPiBDT05GSUdfUkNVX0VRU19ERUJVRz15Cj4gIyBDT05GSUdfRlRS QUNFIGlzIG5vdCBzZXQKPiAjIENPTkZJR19SVU5USU1FX1RFU1RJTkdfTUVOVSBpcyBub3Qgc2V0 Cj4gQ09ORklHX01FTVRFU1Q9eQo+IAoKX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX18KbGludXgtcmlzY3YgbWFpbGluZyBsaXN0CmxpbnV4LXJpc2N2QGxpc3Rz LmluZnJhZGVhZC5vcmcKaHR0cDovL2xpc3RzLmluZnJhZGVhZC5vcmcvbWFpbG1hbi9saXN0aW5m by9saW51eC1yaXNjdgo=