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=-11.3 required=3.0 tests=BAYES_00, HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH,MAILING_LIST_MULTI,NICE_REPLY_A, SIGNED_OFF_BY,SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED,USER_AGENT_SANE_1 autolearn=unavailable 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 42E2AC433E2 for ; Thu, 17 Sep 2020 12:52:41 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id E8E8B2220A for ; Thu, 17 Sep 2020 12:52:40 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727092AbgIQMwj (ORCPT ); Thu, 17 Sep 2020 08:52:39 -0400 Received: from mail.loongson.cn ([114.242.206.163]:44680 "EHLO loongson.cn" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1727102AbgIQMt3 (ORCPT ); Thu, 17 Sep 2020 08:49:29 -0400 X-Greylist: delayed 383 seconds by postgrey-1.27 at vger.kernel.org; Thu, 17 Sep 2020 08:48:37 EDT Received: from [10.130.0.60] (unknown [113.200.148.30]) by mail.loongson.cn (Coremail) with SMTP id AQAAf9DxL96UWWNfBPwVAA--.6439S3; Thu, 17 Sep 2020 20:41:56 +0800 (CST) Subject: Re: [PATCH] MIPS: Loongson64: Add kexec/kdump support To: Huacai Chen References: <1600175263-7872-1-git-send-email-hejinyang@loongson.cn> <376B4B91-0736-43FA-87EA-43E12FF24EF1@flygoat.com> <7b78c4d4-7ee3-cf57-71d1-95611713de2b@loongson.cn> Cc: Jiaxun Yang , Thomas Bogendoerfer , Youling Tang , "open list:MIPS" , LKML , kexec@lists.infradead.org, Xuefeng Li From: Jinyang He Message-ID: <647822a9-bc3b-5da1-95e7-c048a5a3b8fa@loongson.cn> Date: Thu, 17 Sep 2020 20:41:56 +0800 User-Agent: Mozilla/5.0 (X11; Linux mips64; rv:45.0) Gecko/20100101 Thunderbird/45.4.0 MIME-Version: 1.0 In-Reply-To: Content-Type: text/plain; charset=utf-8; format=flowed Content-Transfer-Encoding: 8bit X-CM-TRANSID: AQAAf9DxL96UWWNfBPwVAA--.6439S3 X-Coremail-Antispam: 1UD129KBjvJXoW3Wr13JFy7Wr1UZF18Gry8Xwb_yoWftF1fpa 1UCFn0kr4rJr47twnaq34DAwnI9395Jry7Wr4xG345WFyDt3W7Xr1rZF1UuF97Zr15KF12 vr15Zr1fCF45t3DanT9S1TB71UUUUUUqnTZGkaVYY2UrUUUUjbIjqfuFe4nvWSU5nxnvy2 9KBjDU0xBIdaVrnRJUUUvm14x267AKxVW8JVW5JwAFc2x0x2IEx4CE42xK8VAvwI8IcIk0 rVWrJVCq3wAFIxvE14AKwVWUJVWUGwA2ocxC64kIII0Yj41l84x0c7CEw4AK67xGY2AK02 1l84ACjcxK6xIIjxv20xvE14v26ryj6F1UM28EF7xvwVC0I7IYx2IY6xkF7I0E14v26F4j 6r4UJwA2z4x0Y4vEx4A2jsIE14v26rxl6s0DM28EF7xvwVC2z280aVCY1x0267AKxVW0oV Cq3wAS0I0E0xvYzxvE52x082IY62kv0487Mc02F40EFcxC0VAKzVAqx4xG6I80ewAv7VC0 I7IYx2IY67AKxVWUAVWUtwAv7VC2z280aVAFwI0_Cr0_Gr1UMcvjeVCFs4IE7xkEbVWUJV W8JwACjcxG0xvEwIxGrwACjI8F5VA0II8E6IAqYI8I648v4I1lc7I2V7IY0VAS07AlzVAY IcxG8wCY02Avz4vE14v_Xr1l42xK82IYc2Ij64vIr41l4I8I3I0E4IkC6x0Yz7v_Jr0_Gr 1lx2IqxVAqx4xG67AKxVWUJVWUGwC20s026x8GjcxK67AKxVWUGVWUWwC2zVAF1VAY17CE 14v26r1q6r43MIIYrxkI7VAKI48JMIIF0xvE2Ix0cI8IcVAFwI0_Jr0_JF4lIxAIcVC0I7 IYx2IY6xkF7I0E14v26r1j6r4UMIIF0xvE42xK8VAvwI8IcIk0rVWrZr1j6s0DMIIF0xvE x4A2jsIE14v26r1j6r4UMIIF0xvEx4A2jsIEc7CjxVAFwI0_Jr0_GrUvcSsGvfC2KfnxnU UI43ZEXa7VUbWlk3UUUUU== X-CM-SenderInfo: pkhmx0p1dqwqxorr0wxvrqhubq/ Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Hi, Huacai, On 09/16/2020 01:39 PM, Huacai Chen wrote: > Hi, Jinyang, > > On Tue, Sep 15, 2020 at 10:17 PM Jinyang He wrote: >> >> >> On 09/16/2020 09:33 AM, Jiaxun Yang wrote: >>> 于 2020年9月15日 GMT+08:00 下午9:07:43, Jinyang He 写到: >>>> Add loongson_kexec_prepare(), loongson_kexec_shutdown() and >>>> loongson_kexec_crashdown() for passing the parameters of kexec_args. >>>> >>>> To start loongson64, CPU0 needs 3 parameters: >>>> fw_arg0: the number of cmd. >>>> fw_arg1: cmd structure which seems strange, the cmd array[index]'s >>>> value is cmd string's address, index >= 1. >>>> fw_arg2: environment. >>>> >>>> Secondary CPUs do not need parameter at once. They query their >>>> mailbox to get PC, SP and GP in a loop before CPU0 brings them up >>>> and passes these parameters via mailbox. >>>> >>>> loongson_kexec_prepare(): Alloc new memory to save cmd for kexec. >>>> Combine the kexec append option string as cmd structure, and the cmd >>>> struct will be parsed in fw_init_cmdline() of arch/mips/fw/lib/cmdline.c. >>>> image->control_code_page need pointing to a safe memory page. In order to >>>> maintain compatibility for the old firmware the low 2MB is reserverd >>>> and safe for Loongson. So let it points here. >>>> >>>> loongson_kexec_shutdown(): Wake up all present CPUs and let them go >>>> to reboot_code_buffer. Pass the kexec parameters to kexec_args. >>>> >>>> loongson_crash_shutdown(): Pass the kdump parameters to kexec_args. >>>> >>>> The assembly part provide a way like BIOS doing to keep secondary >>>> CPUs in a querying loop. >>>> >>>> This patch referenced [1][2][3]. >>>> >>>> [1] arch/mips/cavium-octeon/setup.c >>>> [2] https://patchwork.kernel.org/patch/10799217/ >>>> [3] https://gitee.com/loongsonlab/qemu/blob/master/hw/mips/loongson3a_rom.h >>>> >>>> Co-developed-by: Youling Tang >>>> Signed-off-by: Youling Tang >>>> Signed-off-by: Jinyang He >>>> --- >>>> arch/mips/kernel/relocate_kernel.S | 19 ++++++++ >>>> arch/mips/loongson64/reset.c | 88 ++++++++++++++++++++++++++++++++++++++ >>>> 2 files changed, 107 insertions(+) >>>> >>>> diff --git a/arch/mips/kernel/relocate_kernel.S b/arch/mips/kernel/relocate_kernel.S >>>> index ac87089..061cbfb 100644 >>>> --- a/arch/mips/kernel/relocate_kernel.S >>>> +++ b/arch/mips/kernel/relocate_kernel.S >>>> @@ -133,6 +133,25 @@ LEAF(kexec_smp_wait) >>>> #else >>>> sync >>>> #endif >>>> + >>>> +#ifdef CONFIG_CPU_LOONGSON64 >>>> +#define MAILBOX_BASE 0x900000003ff01000 >>> Please avoid hardcoded SMP information. You're breaking Loongson 3B support. >>> >> Ok, I see. Since my machine is Loongson 3A. I'll send v2 >> after I test it in 3B. > 1, My original version can work on both Loongson-3A and Loongson-3B, > why you modify my patch and hadn't discuss with me? > > 2, With this single patch both kexec and kdump cannot work reliably, > because kexec need this patch: > https://patchwork.kernel.org/patch/11695929/ > > and kdump need my first patch in my original version: > https://patchwork.kernel.org/patch/10799215/ > > You may argue that you have tested. Yes, I believe that, I'm not > saying that you haven't test, and I'm not saying that your patch > cannot work, I'm just saying that your patch is not robust. > > 3, I'm the original author and paying attention to kexec/kdump > continuosly, I will send a new version once the above two patches be > accepted. But you re-send my patch without any communication with me, > why you so impatient? > > Huacai > 1, Your original version: https://patchwork.kernel.org/patch/10799217/ This patch can work on Loongson-3A, I tested it. But it works wrong after the follow behaviors, kexec -l vmlinux --append=cmdline_kexec kexec -p vmlinux --append=cmdline_kdump kexec -e It works but cmdline_kdump merged cmdline_kexec. And this patch memcpy from fw_arg2 to kexec_envp and later memcpy from kexec_envp to fw_arg2 when fw_arg2 was not changed, it's redundant. However, I have not Loongson-3B now, and did not test it. For this patch, does it work well on Loongson-3B3000/Loongson-3B4000? 2, I have known that problem before your patch: https://patchwork.kernel.org/patch/11695929/ I also did efforts although I had't committed my patch. It's due to the hardware issues, and I removed pcie_port_device_remove(). Kexec works normally on GUI. But it works terriblely on CLI. After this discuss: https://lore.kernel.org/patchwork/patch/1304917/ What Lukas said helped me. I removed drivers/pci/pci-driver.c: pci_device_shutdown(): pci_clear_master... Kexec works well on CLI also. For another patch: https://patchwork.kernel.org/patch/10799215/ I have not 2way or 4way machine, and I did not test it. 3, I try to fix Loongson64 kexec function since I joined the community. I fell sorry to not do enough research on Loongson64 kexec. My first patch: https://patchwork.kernel.org/patch/11684849/ It fixed problem about "Crash kernel" which can be traced back to linux-5.4. At that time, I thought there is no developer work on Kexec. Thus, I did a lot on Kexec. Are you really continuosly paying attention to kexec/kdump? With the exploring and developing deep, I found your patch several days ago after I did a draft patch witch referenced: arch/mips/cavium-octeon/setup.c https://gitee.com/loongsonlab/qemu/blob/master/hw/mips/loongson3a_rom.h There is no doubt that your patch gives me confidence and suggestion while it gives me worry. As a newcomer, I do not know if should communicate with you since your patch was committed one year ago. And now it may be a good chance to do some communication. Thanks, - Jinyang. >>>> + mfc0 t1, CP0_EBASE >>>> + andi t1, MIPS_EBASE_CPUNUM >>>> + dli t0, MAILBOX_BASE >>>> + andi t3, t1, 0x3 >>>> + sll t3, 8 >>>> + or t0, t0, t3 /* insert core id */ >>>> + andi t2, t1, 0xc >>>> + dsll t2, 42 >>>> + or t0, t0, t2 /* insert node id */ >>>> +1: ld s1, 0x20(t0) /* get PC via mailbox0 */ >>>> + beqz s1, 1b >>>> + ld sp, 0x28(t0) /* get SP via mailbox1 */ >>>> + ld gp, 0x30(t0) /* get GP via mailbox2 */ >>>> + ld a1, 0x38(t0) >>>> + jr s1 >>>> +#endif >>>> j s1 >>>> END(kexec_smp_wait) >>>> #endif >>>> diff --git a/arch/mips/loongson64/reset.c b/arch/mips/loongson64/reset.c >>>> index 3bb8a1e..322c326 100644 >>>> --- a/arch/mips/loongson64/reset.c >>>> +++ b/arch/mips/loongson64/reset.c >>>> @@ -47,12 +47,100 @@ static void loongson_halt(void) >>>> } >>>> } >>>> >>>> +#ifdef CONFIG_KEXEC >>>> +#include >>>> +#include >>>> + >>>> +#include >>>> + >>>> +#define CONTROL_CODE_PAGE 0xFFFFFFFF80000000UL >>>> +static int kexec_argc; >>>> +static int kdump_argc; >>>> +static void *kexec_argv; >>>> +static void *kdump_argv; >>>> + >>>> +static int loongson_kexec_prepare(struct kimage *image) >>>> +{ >>>> + int i, offt, argc = 0; >>>> + int *argv; >>>> + char *str, *ptr, *bootloader = "kexec"; >>>> + >>>> + argv = kmalloc(COMMAND_LINE_SIZE, GFP_KERNEL); >>>> + if (!argv) >>>> + return -ENOMEM; >>>> + >>>> + for (i = 0; i < image->nr_segments; i++) { >>>> + if (!strncmp(bootloader, (char *)image->segment[i].buf, >>>> + strlen(bootloader))) { >>>> + argv[argc++] = fw_arg1 + COMMAND_LINE_SIZE/2; >>>> + str = (char *)argv + COMMAND_LINE_SIZE/2; >>>> + memcpy(str, image->segment[i].buf, COMMAND_LINE_SIZE/2); >>>> + ptr = strchr(str, ' '); >>>> + while (ptr) { >>>> + *ptr = '\0'; >>>> + if (ptr[1] != ' ') { >>>> + offt = (int)(ptr - str + 1); >>>> + argv[argc++] = fw_arg1 + COMMAND_LINE_SIZE/2 + offt; >>>> + } >>>> + ptr = strchr(ptr + 1, ' '); >>>> + } >>>> + break; >>>> + } >>>> + } >>>> + >>>> + /* Kexec/kdump needs a safe page to save reboot_code_buffer. */ >>>> + image->control_code_page = virt_to_page((void *)CONTROL_CODE_PAGE); >>>> + >>>> + if (image->type == KEXEC_TYPE_CRASH) { >>>> + kfree(kdump_argv); >>>> + kdump_argc = argc; >>>> + kdump_argv = argv; >>>> + } else { >>>> + kfree(kexec_argv); >>>> + kexec_argc = argc; >>>> + kexec_argv = argv; >>>> + } >>>> + >>>> + return 0; >>>> +} >>>> + >>>> +static void loongson_kexec_shutdown(void) >>>> +{ >>>> +#ifdef CONFIG_SMP >>>> + bringup_nonboot_cpus(loongson_sysconf.nr_cpus); >>>> +#endif >>>> + fw_arg0 = kexec_argc; >>>> + memcpy((void *)fw_arg1, kexec_argv, COMMAND_LINE_SIZE); >>>> + >>>> + kexec_args[0] = fw_arg0; >>>> + kexec_args[1] = fw_arg1; >>>> + kexec_args[2] = fw_arg2; >>>> +} >>>> + >>>> +static void loongson_crash_shutdown(struct pt_regs *regs) >>>> +{ >>>> + default_machine_crash_shutdown(regs); >>>> + fw_arg0 = kdump_argc; >>>> + memcpy((void *)fw_arg1, kdump_argv, COMMAND_LINE_SIZE); >>>> + >>>> + kexec_args[0] = fw_arg0; >>>> + kexec_args[1] = fw_arg1; >>>> + kexec_args[2] = fw_arg2; >>>> +} >>>> +#endif >>>> + >>>> static int __init mips_reboot_setup(void) >>>> { >>>> _machine_restart = loongson_restart; >>>> _machine_halt = loongson_halt; >>>> pm_power_off = loongson_poweroff; >>>> >>>> +#ifdef CONFIG_KEXEC >>>> + _machine_kexec_prepare = loongson_kexec_prepare; >>>> + _machine_kexec_shutdown = loongson_kexec_shutdown; >>>> + _machine_crash_shutdown = loongson_crash_shutdown; >>>> +#endif >>>> + >>>> return 0; >>>> } >>>> From mboxrd@z Thu Jan 1 00:00:00 1970 Return-path: Received: from mail.loongson.cn ([114.242.206.163] helo=loongson.cn) by merlin.infradead.org with esmtp (Exim 4.92.3 #3 (Red Hat Linux)) id 1kItEo-0005ml-T6 for kexec@lists.infradead.org; Thu, 17 Sep 2020 12:42:12 +0000 Subject: Re: [PATCH] MIPS: Loongson64: Add kexec/kdump support References: <1600175263-7872-1-git-send-email-hejinyang@loongson.cn> <376B4B91-0736-43FA-87EA-43E12FF24EF1@flygoat.com> <7b78c4d4-7ee3-cf57-71d1-95611713de2b@loongson.cn> From: Jinyang He Message-ID: <647822a9-bc3b-5da1-95e7-c048a5a3b8fa@loongson.cn> Date: Thu, 17 Sep 2020 20:41:56 +0800 MIME-Version: 1.0 In-Reply-To: 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: "kexec" Errors-To: kexec-bounces+dwmw2=infradead.org@lists.infradead.org To: Huacai Chen Cc: Thomas Bogendoerfer , Xuefeng Li , kexec@lists.infradead.org, "open list:MIPS" , Jiaxun Yang , LKML , Youling Tang SGksIEh1YWNhaSwKCgpPbiAwOS8xNi8yMDIwIDAxOjM5IFBNLCBIdWFjYWkgQ2hlbiB3cm90ZToK PiBIaSwgSmlueWFuZywKPgo+IE9uIFR1ZSwgU2VwIDE1LCAyMDIwIGF0IDEwOjE3IFBNIEppbnlh bmcgSGUgPGhlamlueWFuZ0Bsb29uZ3Nvbi5jbj4gd3JvdGU6Cj4+Cj4+Cj4+IE9uIDA5LzE2LzIw MjAgMDk6MzMgQU0sIEppYXh1biBZYW5nIHdyb3RlOgo+Pj4g5LqOIDIwMjDlubQ55pyIMTXml6Ug R01UKzA4OjAwIOS4i+WNiDk6MDc6NDMsIEppbnlhbmcgSGUgPGhlamlueWFuZ0Bsb29uZ3Nvbi5j bj4g5YaZ5YiwOgo+Pj4+IEFkZCBsb29uZ3Nvbl9rZXhlY19wcmVwYXJlKCksIGxvb25nc29uX2tl eGVjX3NodXRkb3duKCkgYW5kCj4+Pj4gbG9vbmdzb25fa2V4ZWNfY3Jhc2hkb3duKCkgZm9yIHBh c3NpbmcgdGhlIHBhcmFtZXRlcnMgb2Yga2V4ZWNfYXJncy4KPj4+Pgo+Pj4+IFRvIHN0YXJ0IGxv b25nc29uNjQsIENQVTAgbmVlZHMgMyBwYXJhbWV0ZXJzOgo+Pj4+IGZ3X2FyZzA6IHRoZSBudW1i ZXIgb2YgY21kLgo+Pj4+IGZ3X2FyZzE6IGNtZCBzdHJ1Y3R1cmUgd2hpY2ggc2VlbXMgc3RyYW5n ZSwgdGhlIGNtZCBhcnJheVtpbmRleF0ncwo+Pj4+ICAgICAgICAgICB2YWx1ZSBpcyBjbWQgc3Ry aW5nJ3MgYWRkcmVzcywgaW5kZXggPj0gMS4KPj4+PiBmd19hcmcyOiBlbnZpcm9ubWVudC4KPj4+ Pgo+Pj4+IFNlY29uZGFyeSBDUFVzIGRvIG5vdCBuZWVkIHBhcmFtZXRlciBhdCBvbmNlLiBUaGV5 IHF1ZXJ5IHRoZWlyCj4+Pj4gbWFpbGJveCB0byBnZXQgUEMsIFNQIGFuZCBHUCBpbiBhIGxvb3Ag YmVmb3JlIENQVTAgYnJpbmdzIHRoZW0gdXAKPj4+PiBhbmQgcGFzc2VzIHRoZXNlIHBhcmFtZXRl cnMgdmlhIG1haWxib3guCj4+Pj4KPj4+PiBsb29uZ3Nvbl9rZXhlY19wcmVwYXJlKCk6IEFsbG9j IG5ldyBtZW1vcnkgdG8gc2F2ZSBjbWQgZm9yIGtleGVjLgo+Pj4+IENvbWJpbmUgdGhlIGtleGVj IGFwcGVuZCBvcHRpb24gc3RyaW5nIGFzIGNtZCBzdHJ1Y3R1cmUsIGFuZCB0aGUgY21kCj4+Pj4g c3RydWN0IHdpbGwgYmUgcGFyc2VkIGluIGZ3X2luaXRfY21kbGluZSgpIG9mIGFyY2gvbWlwcy9m dy9saWIvY21kbGluZS5jLgo+Pj4+IGltYWdlLT5jb250cm9sX2NvZGVfcGFnZSBuZWVkIHBvaW50 aW5nIHRvIGEgc2FmZSBtZW1vcnkgcGFnZS4gSW4gb3JkZXIgdG8KPj4+PiBtYWludGFpbiBjb21w YXRpYmlsaXR5IGZvciB0aGUgb2xkIGZpcm13YXJlIHRoZSBsb3cgMk1CIGlzIHJlc2VydmVyZAo+ Pj4+IGFuZCBzYWZlIGZvciBMb29uZ3Nvbi4gU28gbGV0IGl0IHBvaW50cyBoZXJlLgo+Pj4+Cj4+ Pj4gbG9vbmdzb25fa2V4ZWNfc2h1dGRvd24oKTogV2FrZSB1cCBhbGwgcHJlc2VudCBDUFVzIGFu ZCBsZXQgdGhlbSBnbwo+Pj4+IHRvIHJlYm9vdF9jb2RlX2J1ZmZlci4gUGFzcyB0aGUga2V4ZWMg cGFyYW1ldGVycyB0byBrZXhlY19hcmdzLgo+Pj4+Cj4+Pj4gbG9vbmdzb25fY3Jhc2hfc2h1dGRv d24oKTogUGFzcyB0aGUga2R1bXAgcGFyYW1ldGVycyB0byBrZXhlY19hcmdzLgo+Pj4+Cj4+Pj4g VGhlIGFzc2VtYmx5IHBhcnQgcHJvdmlkZSBhIHdheSBsaWtlIEJJT1MgZG9pbmcgdG8ga2VlcCBz ZWNvbmRhcnkKPj4+PiBDUFVzIGluIGEgcXVlcnlpbmcgbG9vcC4KPj4+Pgo+Pj4+IFRoaXMgcGF0 Y2ggcmVmZXJlbmNlZCBbMV1bMl1bM10uCj4+Pj4KPj4+PiBbMV0gYXJjaC9taXBzL2Nhdml1bS1v Y3Rlb24vc2V0dXAuYwo+Pj4+IFsyXSBodHRwczovL3BhdGNod29yay5rZXJuZWwub3JnL3BhdGNo LzEwNzk5MjE3Lwo+Pj4+IFszXSBodHRwczovL2dpdGVlLmNvbS9sb29uZ3NvbmxhYi9xZW11L2Js b2IvbWFzdGVyL2h3L21pcHMvbG9vbmdzb24zYV9yb20uaAo+Pj4+Cj4+Pj4gQ28tZGV2ZWxvcGVk LWJ5OiBZb3VsaW5nIFRhbmcgPHRhbmd5b3VsaW5nQGxvb25nc29uLmNuPgo+Pj4+IFNpZ25lZC1v ZmYtYnk6IFlvdWxpbmcgVGFuZyA8dGFuZ3lvdWxpbmdAbG9vbmdzb24uY24+Cj4+Pj4gU2lnbmVk LW9mZi1ieTogSmlueWFuZyBIZSA8aGVqaW55YW5nQGxvb25nc29uLmNuPgo+Pj4+IC0tLQo+Pj4+ IGFyY2gvbWlwcy9rZXJuZWwvcmVsb2NhdGVfa2VybmVsLlMgfCAxOSArKysrKysrKwo+Pj4+IGFy Y2gvbWlwcy9sb29uZ3NvbjY0L3Jlc2V0LmMgICAgICAgfCA4OCArKysrKysrKysrKysrKysrKysr KysrKysrKysrKysrKysrKysrKwo+Pj4+IDIgZmlsZXMgY2hhbmdlZCwgMTA3IGluc2VydGlvbnMo KykKPj4+Pgo+Pj4+IGRpZmYgLS1naXQgYS9hcmNoL21pcHMva2VybmVsL3JlbG9jYXRlX2tlcm5l bC5TIGIvYXJjaC9taXBzL2tlcm5lbC9yZWxvY2F0ZV9rZXJuZWwuUwo+Pj4+IGluZGV4IGFjODcw ODkuLjA2MWNiZmIgMTAwNjQ0Cj4+Pj4gLS0tIGEvYXJjaC9taXBzL2tlcm5lbC9yZWxvY2F0ZV9r ZXJuZWwuUwo+Pj4+ICsrKyBiL2FyY2gvbWlwcy9rZXJuZWwvcmVsb2NhdGVfa2VybmVsLlMKPj4+ PiBAQCAtMTMzLDYgKzEzMywyNSBAQCBMRUFGKGtleGVjX3NtcF93YWl0KQo+Pj4+ICNlbHNlCj4+ Pj4gICAgICAgc3luYwo+Pj4+ICNlbmRpZgo+Pj4+ICsKPj4+PiArI2lmZGVmIENPTkZJR19DUFVf TE9PTkdTT042NAo+Pj4+ICsjZGVmaW5lIE1BSUxCT1hfQkFTRSAweDkwMDAwMDAwM2ZmMDEwMDAK Pj4+IFBsZWFzZSBhdm9pZCBoYXJkY29kZWQgU01QIGluZm9ybWF0aW9uLiBZb3UncmUgYnJlYWtp bmcgTG9vbmdzb24gM0Igc3VwcG9ydC4KPj4+Cj4+IE9rLCBJIHNlZS4gU2luY2UgbXkgbWFjaGlu ZSBpcyBMb29uZ3NvbiAzQS4gSSdsbCBzZW5kIHYyCj4+IGFmdGVyIEkgdGVzdCBpdCBpbiAzQi4K PiAxLCBNeSBvcmlnaW5hbCB2ZXJzaW9uIGNhbiB3b3JrIG9uIGJvdGggTG9vbmdzb24tM0EgYW5k IExvb25nc29uLTNCLAo+IHdoeSB5b3UgbW9kaWZ5IG15IHBhdGNoIGFuZCBoYWRuJ3QgZGlzY3Vz cyB3aXRoIG1lPwo+Cj4gMiwgV2l0aCB0aGlzIHNpbmdsZSBwYXRjaCBib3RoIGtleGVjIGFuZCBr ZHVtcCBjYW5ub3Qgd29yayByZWxpYWJseSwKPiBiZWNhdXNlIGtleGVjIG5lZWQgdGhpcyBwYXRj aDoKPiAgICAgaHR0cHM6Ly9wYXRjaHdvcmsua2VybmVsLm9yZy9wYXRjaC8xMTY5NTkyOS8KPgo+ ICAgICBhbmQga2R1bXAgbmVlZCBteSBmaXJzdCBwYXRjaCBpbiBteSBvcmlnaW5hbCB2ZXJzaW9u Ogo+ICAgICBodHRwczovL3BhdGNod29yay5rZXJuZWwub3JnL3BhdGNoLzEwNzk5MjE1Lwo+Cj4g ICAgIFlvdSBtYXkgYXJndWUgdGhhdCB5b3UgaGF2ZSB0ZXN0ZWQuIFllcywgSSBiZWxpZXZlIHRo YXQsIEknbSBub3QKPiBzYXlpbmcgdGhhdCB5b3UgaGF2ZW4ndCB0ZXN0LCBhbmQgSSdtIG5vdCBz YXlpbmcgdGhhdCB5b3VyIHBhdGNoCj4gY2Fubm90IHdvcmssIEknbSBqdXN0IHNheWluZyB0aGF0 IHlvdXIgcGF0Y2ggaXMgbm90IHJvYnVzdC4KPgo+IDMsIEknbSB0aGUgb3JpZ2luYWwgYXV0aG9y IGFuZCBwYXlpbmcgYXR0ZW50aW9uIHRvIGtleGVjL2tkdW1wCj4gY29udGludW9zbHksIEkgd2ls bCBzZW5kIGEgbmV3IHZlcnNpb24gb25jZSB0aGUgYWJvdmUgdHdvIHBhdGNoZXMgYmUKPiBhY2Nl cHRlZC4gQnV0IHlvdSByZS1zZW5kIG15IHBhdGNoIHdpdGhvdXQgYW55IGNvbW11bmljYXRpb24g d2l0aCBtZSwKPiB3aHkgeW91IHNvIGltcGF0aWVudD8KPgo+IEh1YWNhaQo+CgoxLCBZb3VyIG9y aWdpbmFsIHZlcnNpb246CiAgICBodHRwczovL3BhdGNod29yay5rZXJuZWwub3JnL3BhdGNoLzEw Nzk5MjE3LwoKVGhpcyBwYXRjaCBjYW4gd29yayBvbiBMb29uZ3Nvbi0zQSwgSSB0ZXN0ZWQgaXQu CgpCdXQgaXQgd29ya3Mgd3JvbmcgYWZ0ZXIgdGhlIGZvbGxvdyBiZWhhdmlvcnMsCiAgICBrZXhl YyAtbCB2bWxpbnV4IC0tYXBwZW5kPWNtZGxpbmVfa2V4ZWMKICAgIGtleGVjIC1wIHZtbGludXgg LS1hcHBlbmQ9Y21kbGluZV9rZHVtcAogICAga2V4ZWMgLWUKCkl0IHdvcmtzIGJ1dCBjbWRsaW5l X2tkdW1wIG1lcmdlZCBjbWRsaW5lX2tleGVjLgoKQW5kIHRoaXMgcGF0Y2ggbWVtY3B5IGZyb20g ZndfYXJnMiB0byBrZXhlY19lbnZwIGFuZCBsYXRlciBtZW1jcHkgZnJvbQprZXhlY19lbnZwIHRv IGZ3X2FyZzIgd2hlbiBmd19hcmcyIHdhcyBub3QgY2hhbmdlZCwgaXQncyByZWR1bmRhbnQuCgpI b3dldmVyLCBJIGhhdmUgbm90IExvb25nc29uLTNCIG5vdywgYW5kIGRpZCBub3QgdGVzdCBpdC4g Rm9yIHRoaXMgcGF0Y2gsCmRvZXMgaXQgd29yayB3ZWxsIG9uIExvb25nc29uLTNCMzAwMC9Mb29u Z3Nvbi0zQjQwMDA/CgoyLCBJIGhhdmUga25vd24gdGhhdCBwcm9ibGVtIGJlZm9yZSB5b3VyIHBh dGNoOgogICAgaHR0cHM6Ly9wYXRjaHdvcmsua2VybmVsLm9yZy9wYXRjaC8xMTY5NTkyOS8KCkkg YWxzbyBkaWQgZWZmb3J0cyBhbHRob3VnaCBJIGhhZCd0IGNvbW1pdHRlZCBteSBwYXRjaC4gSXQn cyBkdWUgdG8gdGhlCmhhcmR3YXJlIGlzc3VlcywgYW5kIEkgcmVtb3ZlZCBwY2llX3BvcnRfZGV2 aWNlX3JlbW92ZSgpLiBLZXhlYyB3b3Jrcwpub3JtYWxseSBvbiBHVUkuIEJ1dCBpdCB3b3JrcyB0 ZXJyaWJsZWx5IG9uIENMSS4gQWZ0ZXIgdGhpcyBkaXNjdXNzOgogICAgaHR0cHM6Ly9sb3JlLmtl cm5lbC5vcmcvcGF0Y2h3b3JrL3BhdGNoLzEzMDQ5MTcvCgpXaGF0IEx1a2FzIHNhaWQgaGVscGVk IG1lLiBJIHJlbW92ZWQKICAgIGRyaXZlcnMvcGNpL3BjaS1kcml2ZXIuYzogcGNpX2RldmljZV9z aHV0ZG93bigpOiBwY2lfY2xlYXJfbWFzdGVyLi4uCktleGVjIHdvcmtzIHdlbGwgb24gQ0xJIGFs c28uCgpGb3IgYW5vdGhlciBwYXRjaDoKICAgIGh0dHBzOi8vcGF0Y2h3b3JrLmtlcm5lbC5vcmcv cGF0Y2gvMTA3OTkyMTUvCgpJIGhhdmUgbm90IDJ3YXkgb3IgNHdheSBtYWNoaW5lLCBhbmQgSSBk aWQgbm90IHRlc3QgaXQuCgozLCBJIHRyeSB0byBmaXggTG9vbmdzb242NCBrZXhlYyBmdW5jdGlv biBzaW5jZSBJIGpvaW5lZCB0aGUgY29tbXVuaXR5LgpJIGZlbGwgc29ycnkgdG8gbm90IGRvIGVu b3VnaCByZXNlYXJjaCBvbiBMb29uZ3NvbjY0IGtleGVjLiBNeSBmaXJzdCBwYXRjaDoKICAgIGh0 dHBzOi8vcGF0Y2h3b3JrLmtlcm5lbC5vcmcvcGF0Y2gvMTE2ODQ4NDkvCgpJdCBmaXhlZCBwcm9i bGVtIGFib3V0ICJDcmFzaCBrZXJuZWwiIHdoaWNoIGNhbiBiZSB0cmFjZWQgYmFjayB0byBsaW51 eC01LjQuCkF0IHRoYXQgdGltZSwgSSB0aG91Z2h0IHRoZXJlIGlzIG5vIGRldmVsb3BlciB3b3Jr IG9uIEtleGVjLiBUaHVzLCBJIGRpZCBhCmxvdCBvbiBLZXhlYy4gQXJlIHlvdSByZWFsbHkgY29u dGludW9zbHkgcGF5aW5nIGF0dGVudGlvbiB0byBrZXhlYy9rZHVtcD8KV2l0aCB0aGUgZXhwbG9y aW5nIGFuZCBkZXZlbG9waW5nIGRlZXAsIEkgZm91bmQgeW91ciBwYXRjaCBzZXZlcmFsIGRheXMg YWdvCmFmdGVyIEkgZGlkIGEgZHJhZnQgcGF0Y2ggd2l0Y2ggcmVmZXJlbmNlZDoKICAgIGFyY2gv bWlwcy9jYXZpdW0tb2N0ZW9uL3NldHVwLmMKaHR0cHM6Ly9naXRlZS5jb20vbG9vbmdzb25sYWIv cWVtdS9ibG9iL21hc3Rlci9ody9taXBzL2xvb25nc29uM2Ffcm9tLmgKClRoZXJlIGlzIG5vIGRv dWJ0IHRoYXQgeW91ciBwYXRjaCBnaXZlcyBtZSBjb25maWRlbmNlIGFuZCBzdWdnZXN0aW9uIHdo aWxlCml0IGdpdmVzIG1lIHdvcnJ5LiBBcyBhIG5ld2NvbWVyLCBJIGRvIG5vdCBrbm93IGlmIHNo b3VsZCBjb21tdW5pY2F0ZSB3aXRoCnlvdSBzaW5jZSB5b3VyIHBhdGNoIHdhcyBjb21taXR0ZWQg b25lIHllYXIgYWdvLiBBbmQgbm93IGl0IG1heSBiZSBhIGdvb2QKY2hhbmNlIHRvIGRvIHNvbWUg Y29tbXVuaWNhdGlvbi4KClRoYW5rcywKCi0gSmlueWFuZy4KCj4+Pj4gKyAgICBtZmMwICB0MSwg Q1AwX0VCQVNFCj4+Pj4gKyAgICBhbmRpICB0MSwgTUlQU19FQkFTRV9DUFVOVU0KPj4+PiArICAg IGRsaSAgIHQwLCBNQUlMQk9YX0JBU0UKPj4+PiArICAgIGFuZGkgIHQzLCB0MSwgMHgzCj4+Pj4g KyAgICBzbGwgICB0MywgOAo+Pj4+ICsgICAgb3IgICAgdDAsIHQwLCB0MyAgICAgICAgLyogaW5z ZXJ0IGNvcmUgaWQgKi8KPj4+PiArICAgIGFuZGkgIHQyLCB0MSwgMHhjCj4+Pj4gKyAgICBkc2xs ICB0MiwgNDIKPj4+PiArICAgIG9yICAgIHQwLCB0MCwgdDIgICAgICAgIC8qIGluc2VydCBub2Rl IGlkICovCj4+Pj4gKzE6ICBsZCAgICBzMSwgMHgyMCh0MCkgICAgICAvKiBnZXQgUEMgdmlhIG1h aWxib3gwICovCj4+Pj4gKyAgICBiZXF6ICBzMSwgMWIKPj4+PiArICAgIGxkICAgIHNwLCAweDI4 KHQwKSAgICAgIC8qIGdldCBTUCB2aWEgbWFpbGJveDEgKi8KPj4+PiArICAgIGxkICAgIGdwLCAw eDMwKHQwKSAgICAgIC8qIGdldCBHUCB2aWEgbWFpbGJveDIgKi8KPj4+PiArICAgIGxkICAgIGEx LCAweDM4KHQwKQo+Pj4+ICsgICAganIgICAgczEKPj4+PiArI2VuZGlmCj4+Pj4gICAgICAgaiAg ICAgICAgICAgICAgIHMxCj4+Pj4gICAgICAgRU5EKGtleGVjX3NtcF93YWl0KQo+Pj4+ICNlbmRp Zgo+Pj4+IGRpZmYgLS1naXQgYS9hcmNoL21pcHMvbG9vbmdzb242NC9yZXNldC5jIGIvYXJjaC9t aXBzL2xvb25nc29uNjQvcmVzZXQuYwo+Pj4+IGluZGV4IDNiYjhhMWUuLjMyMmMzMjYgMTAwNjQ0 Cj4+Pj4gLS0tIGEvYXJjaC9taXBzL2xvb25nc29uNjQvcmVzZXQuYwo+Pj4+ICsrKyBiL2FyY2gv bWlwcy9sb29uZ3NvbjY0L3Jlc2V0LmMKPj4+PiBAQCAtNDcsMTIgKzQ3LDEwMCBAQCBzdGF0aWMg dm9pZCBsb29uZ3Nvbl9oYWx0KHZvaWQpCj4+Pj4gICAgICAgfQo+Pj4+IH0KPj4+Pgo+Pj4+ICsj aWZkZWYgQ09ORklHX0tFWEVDCj4+Pj4gKyNpbmNsdWRlIDxsaW51eC9jcHUuaD4KPj4+PiArI2lu Y2x1ZGUgPGxpbnV4L2tleGVjLmg+Cj4+Pj4gKwo+Pj4+ICsjaW5jbHVkZSA8YXNtL2Jvb3RpbmZv Lmg+Cj4+Pj4gKwo+Pj4+ICsjZGVmaW5lIENPTlRST0xfQ09ERV9QQUdFICAgIDB4RkZGRkZGRkY4 MDAwMDAwMFVMCj4+Pj4gK3N0YXRpYyBpbnQga2V4ZWNfYXJnYzsKPj4+PiArc3RhdGljIGludCBr ZHVtcF9hcmdjOwo+Pj4+ICtzdGF0aWMgdm9pZCAqa2V4ZWNfYXJndjsKPj4+PiArc3RhdGljIHZv aWQgKmtkdW1wX2FyZ3Y7Cj4+Pj4gKwo+Pj4+ICtzdGF0aWMgaW50IGxvb25nc29uX2tleGVjX3By ZXBhcmUoc3RydWN0IGtpbWFnZSAqaW1hZ2UpCj4+Pj4gK3sKPj4+PiArICAgIGludCBpLCBvZmZ0 LCBhcmdjID0gMDsKPj4+PiArICAgIGludCAqYXJndjsKPj4+PiArICAgIGNoYXIgKnN0ciwgKnB0 ciwgKmJvb3Rsb2FkZXIgPSAia2V4ZWMiOwo+Pj4+ICsKPj4+PiArICAgIGFyZ3YgPSBrbWFsbG9j KENPTU1BTkRfTElORV9TSVpFLCBHRlBfS0VSTkVMKTsKPj4+PiArICAgIGlmICghYXJndikKPj4+ PiArICAgICAgICAgICAgcmV0dXJuIC1FTk9NRU07Cj4+Pj4gKwo+Pj4+ICsgICAgZm9yIChpID0g MDsgaSA8IGltYWdlLT5ucl9zZWdtZW50czsgaSsrKSB7Cj4+Pj4gKyAgICAgICAgICAgIGlmICgh c3RybmNtcChib290bG9hZGVyLCAoY2hhciAqKWltYWdlLT5zZWdtZW50W2ldLmJ1ZiwKPj4+PiAr ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmxlbihib290bG9hZGVyKSkpIHsKPj4+PiAr ICAgICAgICAgICAgICAgICAgICBhcmd2W2FyZ2MrK10gPSBmd19hcmcxICsgQ09NTUFORF9MSU5F X1NJWkUvMjsKPj4+PiArICAgICAgICAgICAgICAgICAgICBzdHIgPSAoY2hhciAqKWFyZ3YgKyBD T01NQU5EX0xJTkVfU0laRS8yOwo+Pj4+ICsgICAgICAgICAgICAgICAgICAgIG1lbWNweShzdHIs IGltYWdlLT5zZWdtZW50W2ldLmJ1ZiwgQ09NTUFORF9MSU5FX1NJWkUvMik7Cj4+Pj4gKyAgICAg ICAgICAgICAgICAgICAgcHRyID0gc3RyY2hyKHN0ciwgJyAnKTsKPj4+PiArICAgICAgICAgICAg ICAgICAgICB3aGlsZSAocHRyKSB7Cj4+Pj4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAq cHRyID0gJ1wwJzsKPj4+PiArICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwdHJbMV0g IT0gJyAnKSB7Cj4+Pj4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnQg PSAoaW50KShwdHIgLSBzdHIgKyAxKTsKPj4+PiArICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgYXJndlthcmdjKytdID0gZndfYXJnMSArIENPTU1BTkRfTElORV9TSVpFLzIgKyBv ZmZ0Owo+Pj4+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQo+Pj4+ICsgICAgICAgICAg ICAgICAgICAgICAgICAgICAgcHRyID0gc3RyY2hyKHB0ciArIDEsICcgJyk7Cj4+Pj4gKyAgICAg ICAgICAgICAgICAgICAgfQo+Pj4+ICsgICAgICAgICAgICAgICAgICAgIGJyZWFrOwo+Pj4+ICsg ICAgICAgICAgICB9Cj4+Pj4gKyAgICB9Cj4+Pj4gKwo+Pj4+ICsgICAgLyogS2V4ZWMva2R1bXAg bmVlZHMgYSBzYWZlIHBhZ2UgdG8gc2F2ZSByZWJvb3RfY29kZV9idWZmZXIuICovCj4+Pj4gKyAg ICBpbWFnZS0+Y29udHJvbF9jb2RlX3BhZ2UgPSB2aXJ0X3RvX3BhZ2UoKHZvaWQgKilDT05UUk9M X0NPREVfUEFHRSk7Cj4+Pj4gKwo+Pj4+ICsgICAgaWYgKGltYWdlLT50eXBlID09IEtFWEVDX1RZ UEVfQ1JBU0gpIHsKPj4+PiArICAgICAgICAgICAga2ZyZWUoa2R1bXBfYXJndik7Cj4+Pj4gKyAg ICAgICAgICAgIGtkdW1wX2FyZ2MgPSBhcmdjOwo+Pj4+ICsgICAgICAgICAgICBrZHVtcF9hcmd2 ID0gYXJndjsKPj4+PiArICAgIH0gZWxzZSB7Cj4+Pj4gKyAgICAgICAgICAgIGtmcmVlKGtleGVj X2FyZ3YpOwo+Pj4+ICsgICAgICAgICAgICBrZXhlY19hcmdjID0gYXJnYzsKPj4+PiArICAgICAg ICAgICAga2V4ZWNfYXJndiA9IGFyZ3Y7Cj4+Pj4gKyAgICB9Cj4+Pj4gKwo+Pj4+ICsgICAgcmV0 dXJuIDA7Cj4+Pj4gK30KPj4+PiArCj4+Pj4gK3N0YXRpYyB2b2lkIGxvb25nc29uX2tleGVjX3No dXRkb3duKHZvaWQpCj4+Pj4gK3sKPj4+PiArI2lmZGVmIENPTkZJR19TTVAKPj4+PiArICAgIGJy aW5ndXBfbm9uYm9vdF9jcHVzKGxvb25nc29uX3N5c2NvbmYubnJfY3B1cyk7Cj4+Pj4gKyNlbmRp Zgo+Pj4+ICsgICAgZndfYXJnMCA9IGtleGVjX2FyZ2M7Cj4+Pj4gKyAgICBtZW1jcHkoKHZvaWQg Kilmd19hcmcxLCBrZXhlY19hcmd2LCBDT01NQU5EX0xJTkVfU0laRSk7Cj4+Pj4gKwo+Pj4+ICsg ICAga2V4ZWNfYXJnc1swXSA9IGZ3X2FyZzA7Cj4+Pj4gKyAgICBrZXhlY19hcmdzWzFdID0gZndf YXJnMTsKPj4+PiArICAgIGtleGVjX2FyZ3NbMl0gPSBmd19hcmcyOwo+Pj4+ICt9Cj4+Pj4gKwo+ Pj4+ICtzdGF0aWMgdm9pZCBsb29uZ3Nvbl9jcmFzaF9zaHV0ZG93bihzdHJ1Y3QgcHRfcmVncyAq cmVncykKPj4+PiArewo+Pj4+ICsgICAgZGVmYXVsdF9tYWNoaW5lX2NyYXNoX3NodXRkb3duKHJl Z3MpOwo+Pj4+ICsgICAgZndfYXJnMCA9IGtkdW1wX2FyZ2M7Cj4+Pj4gKyAgICBtZW1jcHkoKHZv aWQgKilmd19hcmcxLCBrZHVtcF9hcmd2LCBDT01NQU5EX0xJTkVfU0laRSk7Cj4+Pj4gKwo+Pj4+ ICsgICAga2V4ZWNfYXJnc1swXSA9IGZ3X2FyZzA7Cj4+Pj4gKyAgICBrZXhlY19hcmdzWzFdID0g ZndfYXJnMTsKPj4+PiArICAgIGtleGVjX2FyZ3NbMl0gPSBmd19hcmcyOwo+Pj4+ICt9Cj4+Pj4g KyNlbmRpZgo+Pj4+ICsKPj4+PiBzdGF0aWMgaW50IF9faW5pdCBtaXBzX3JlYm9vdF9zZXR1cCh2 b2lkKQo+Pj4+IHsKPj4+PiAgICAgICBfbWFjaGluZV9yZXN0YXJ0ID0gbG9vbmdzb25fcmVzdGFy dDsKPj4+PiAgICAgICBfbWFjaGluZV9oYWx0ID0gbG9vbmdzb25faGFsdDsKPj4+PiAgICAgICBw bV9wb3dlcl9vZmYgPSBsb29uZ3Nvbl9wb3dlcm9mZjsKPj4+Pgo+Pj4+ICsjaWZkZWYgQ09ORklH X0tFWEVDCj4+Pj4gKyAgICBfbWFjaGluZV9rZXhlY19wcmVwYXJlID0gbG9vbmdzb25fa2V4ZWNf cHJlcGFyZTsKPj4+PiArICAgIF9tYWNoaW5lX2tleGVjX3NodXRkb3duID0gbG9vbmdzb25fa2V4 ZWNfc2h1dGRvd247Cj4+Pj4gKyAgICBfbWFjaGluZV9jcmFzaF9zaHV0ZG93biA9IGxvb25nc29u X2NyYXNoX3NodXRkb3duOwo+Pj4+ICsjZW5kaWYKPj4+PiArCj4+Pj4gICAgICAgcmV0dXJuIDA7 Cj4+Pj4gfQo+Pj4+CgoKX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX18Ka2V4ZWMgbWFpbGluZyBsaXN0CmtleGVjQGxpc3RzLmluZnJhZGVhZC5vcmcKaHR0cDov L2xpc3RzLmluZnJhZGVhZC5vcmcvbWFpbG1hbi9saXN0aW5mby9rZXhlYwo=