From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail02.groups.io (mail02.groups.io [66.175.222.108]) by spool.mail.gandi.net (Postfix) with ESMTPS id D8E19AC0A25 for ; Fri, 10 Nov 2023 06:31:22 +0000 (UTC) DKIM-Signature: a=rsa-sha256; bh=DT04R8emcKZurAtIczaJkA6lynaD+qtRaZDEUqpZWV0=; c=relaxed/simple; d=groups.io; h=MIME-Version:References:In-Reply-To:From:Date:Message-ID:Subject:To:Cc:Precedence:List-Subscribe:List-Help:Sender:List-Id:Mailing-List:Delivered-To:Reply-To:List-Unsubscribe-Post:List-Unsubscribe:Content-Type; s=20140610; t=1699597881; v=1; b=LeF7NRqiH3eRUZj0vhpBniQYpxuJuDlKNHoArxbnDrE7u0vw3kp7RcTSvOb1czlmggOHFx1v QC3Gzeb56sGdRzPyYE7sGmtebtM1ahJwGgTfJ/MyypoDuhKW83bKP531O7qOXt1MOCjQie3NQR1 RYL96SqWz8lM/tk6K87X15QQ= X-Received: by 127.0.0.2 with SMTP id JZqwYY7687511xGjfXaHU4hQ; Thu, 09 Nov 2023 22:31:21 -0800 X-Received: from mail-pg1-f180.google.com (mail-pg1-f180.google.com [209.85.215.180]) by mx.groups.io with SMTP id smtpd.web11.22751.1699597880732010839 for ; Thu, 09 Nov 2023 22:31:20 -0800 X-Received: by mail-pg1-f180.google.com with SMTP id 41be03b00d2f7-5b9a7357553so1393243a12.0 for ; Thu, 09 Nov 2023 22:31:20 -0800 (PST) X-Gm-Message-State: WHm1W5SK9KLzqqWu1vnxHtsbx7686176AA= X-Google-Smtp-Source: AGHT+IGnoNbUGWlH1RQIWcxAtS5xL20F+org/lI49EDpD7b/tCk1OZum1tgfeYdTPlfPxQrD1KNF6phTaeWaXtR7yAQ= X-Received: by 2002:a17:90b:1a92:b0:280:c98f:2090 with SMTP id ng18-20020a17090b1a9200b00280c98f2090mr4171182pjb.32.1699597879854; Thu, 09 Nov 2023 22:31:19 -0800 (PST) MIME-Version: 1.0 References: <20231107061959.113213-1-rsingh@ventanamicro.com> <20231107061959.113213-6-rsingh@ventanamicro.com> <3d51a063-5687-9c40-ace2-a9aeb7f3afa3@redhat.com> In-Reply-To: <3d51a063-5687-9c40-ace2-a9aeb7f3afa3@redhat.com> From: "Ranbir Singh" Date: Fri, 10 Nov 2023 12:01:08 +0530 Message-ID: Subject: Re: [edk2-devel] [PATCH v2 5/5] MdeModulePkg/Bus/Pci/PciBusDxe: Fix UNUSED_VALUE Coverity issues To: Laszlo Ersek Cc: devel@edk2.groups.io, Ray Ni Precedence: Bulk List-Subscribe: List-Help: Sender: devel@edk2.groups.io List-Id: Mailing-List: list devel@edk2.groups.io; contact devel+owner@edk2.groups.io Reply-To: devel@edk2.groups.io,rsingh@ventanamicro.com List-Unsubscribe-Post: List-Unsubscribe=One-Click List-Unsubscribe: Content-Type: multipart/alternative; boundary="000000000000e3db240609c677eb" X-GND-Status: LEGIT Authentication-Results: spool.mail.gandi.net; dkim=pass header.d=groups.io header.s=20140610 header.b=LeF7NRqi; dmarc=none; spf=pass (spool.mail.gandi.net: domain of bounce@groups.io designates 66.175.222.108 as permitted sender) smtp.mailfrom=bounce@groups.io --000000000000e3db240609c677eb Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable It was hard to conclude at my end as well what to do where. So I just threw it open ... - Status assignment can be ignored or - Maintain the existing behaviour and just log the error given the original code existence for quite a long now Various files were clubbed together being part of the same module and all having the same UNUSED_VALUE issue. If you say so, I will split, but many lines are just cosmetic changes (indentation level) - after impact of inclusion / removal of Status storage / Status value check. Will need to figure out what is the best split though :-) On Tue, Nov 7, 2023 at 10:50=E2=80=AFPM Laszlo Ersek wr= ote: > On 11/7/23 07:19, Ranbir Singh wrote: > > The return value after calls to functions > > gBS->UninstallMultipleProtocolInterfaces, StartPciDevicesOnBridge, > > PciPciDeviceInfoCollector, BarExisted, PciRootBridgeIo->Pci.Write, > > gPciHotPlugInit->InitializeRootHpc and PciRootBridgeP2CProcess is > > stored in Status, but it is not made of any use and later Status > > gets overridden. > > > > Remove the return value storage in Status or add Status check as > > seems appropriate at a particular point. > > > > REF: https://bugzilla.tianocore.org/show_bug.cgi?id=3D4239 > > > > Cc: Ray Ni > > Signed-off-by: Ranbir Singh > > --- > > MdeModulePkg/Bus/Pci/PciBusDxe/PciDeviceSupport.c | 68 > +++++++++++--------- > > MdeModulePkg/Bus/Pci/PciBusDxe/PciEnumeratorSupport.c | 42 ++++++++---= - > > MdeModulePkg/Bus/Pci/PciBusDxe/PciLib.c | 8 +++ > > 3 files changed, 72 insertions(+), 46 deletions(-) > > First of all, please split up this patch. It's hard to review it like > this, with unrelated pieces of logic lumped together. > > > > > diff --git a/MdeModulePkg/Bus/Pci/PciBusDxe/PciDeviceSupport.c > b/MdeModulePkg/Bus/Pci/PciBusDxe/PciDeviceSupport.c > > index 3de80d98370e..9b0587c94d05 100644 > > --- a/MdeModulePkg/Bus/Pci/PciBusDxe/PciDeviceSupport.c > > +++ b/MdeModulePkg/Bus/Pci/PciBusDxe/PciDeviceSupport.c > > @@ -544,12 +544,12 @@ DeRegisterPciDevice ( > > EFI_OPEN_PROTOCOL_TEST_PROTOCOL > > ); > > if (!EFI_ERROR (Status)) { > > - Status =3D gBS->UninstallMultipleProtocolInterfaces ( > > - Handle, > > - &gEfiLoadFile2ProtocolGuid, > > - &PciIoDevice->LoadFile2, > > - NULL > > - ); > > + gBS->UninstallMultipleProtocolInterfaces ( > > + Handle, > > + &gEfiLoadFile2ProtocolGuid, > > + &PciIoDevice->LoadFile2, > > + NULL > > + ); > > } > > > > // > > OK > > > @@ -678,19 +678,21 @@ StartPciDevicesOnBridge ( > > ChildHandleBuffer > > ); > > > > - PciIoDevice->PciIo.Attributes ( > > - &(PciIoDevice->PciIo), > > - EfiPciIoAttributeOperationSupported, > > - 0, > > - &Supports > > - ); > > - Supports &=3D (UINT64)EFI_PCI_DEVICE_ENABLE; > > - PciIoDevice->PciIo.Attributes ( > > - &(PciIoDevice->PciIo), > > - EfiPciIoAttributeOperationEnable, > > - Supports, > > - NULL > > - ); > > + if (!EFI_ERROR (Status)) { > > + PciIoDevice->PciIo.Attributes ( > > + &(PciIoDevice->PciIo), > > + EfiPciIoAttributeOperationSupported, > > + 0, > > + &Supports > > + ); > > + Supports &=3D (UINT64)EFI_PCI_DEVICE_ENABLE; > > + PciIoDevice->PciIo.Attributes ( > > + &(PciIoDevice->PciIo), > > + EfiPciIoAttributeOperationEnable, > > + Supports, > > + NULL > > + ); > > + } > > > > return Status; > > } else { > > OK > > > @@ -726,19 +728,21 @@ StartPciDevicesOnBridge ( > > ChildHandleBuffer > > ); > > > > - PciIoDevice->PciIo.Attributes ( > > - &(PciIoDevice->PciIo), > > - EfiPciIoAttributeOperationSupported, > > - 0, > > - &Supports > > - ); > > - Supports &=3D (UINT64)EFI_PCI_DEVICE_ENABLE; > > - PciIoDevice->PciIo.Attributes ( > > - &(PciIoDevice->PciIo), > > - EfiPciIoAttributeOperationEnable, > > - Supports, > > - NULL > > - ); > > + if (!EFI_ERROR (Status)) { > > + PciIoDevice->PciIo.Attributes ( > > + &(PciIoDevice->PciIo), > > + EfiPciIoAttributeOperationSupported, > > + 0, > > + &Supports > > + ); > > + Supports &=3D (UINT64)EFI_PCI_DEVICE_ENABLE; > > + PciIoDevice->PciIo.Attributes ( > > + &(PciIoDevice->PciIo), > > + EfiPciIoAttributeOperationEnable, > > + Supports, > > + NULL > > + ); > > + } > > } > > > > CurrentLink =3D CurrentLink->ForwardLink; > > I don't really like this; the original code is inconsistent. In the > first branch, StartPciDevicesOnBridge() failure is fatal, here it isn't. = :/ > > Anyway, I agree we can at least restrict the enablement. OK. > > > diff --git a/MdeModulePkg/Bus/Pci/PciBusDxe/PciEnumeratorSupport.c > b/MdeModulePkg/Bus/Pci/PciBusDxe/PciEnumeratorSupport.c > > index eda97285ee18..636885dd189d 100644 > > --- a/MdeModulePkg/Bus/Pci/PciBusDxe/PciEnumeratorSupport.c > > +++ b/MdeModulePkg/Bus/Pci/PciBusDxe/PciEnumeratorSupport.c > > @@ -2796,6 +2796,20 @@ IsPciDeviceRejected ( > > // Test its high 32-Bit BAR > > // > > Status =3D BarExisted (PciIoDevice, BarOffset, &TestValue, > &OldValue); > > + if (EFI_ERROR (Status)) { > > + // > > + // Not sure if it is correct to skip the below if > (TestValue =3D=3D OldValue) check in this special scenario. > > + // If correct, then remove these 11 comment lines > eventually. > > + // If not correct, then replace "continue;" with blank "; > // Nothing to do" and also remove these 11 comment lines eventually > > + // OR > > + // Remove the newly added if (EFI_ERROR (Status)) { ... = } > block completely and change > > + // Status =3D BarExisted (PciIoDevice, BarOffset, > &TestValue, &OldValue); > > + // =3D> > > + // BarExisted (PciIoDevice, BarOffset, &TestValue, > &OldValue); > > + // i.e., no return value storage in Status > > + // > > + continue; > > + } > > if (TestValue =3D=3D OldValue) { > > return TRUE; > > } > > "continue" is not right here. We have already determined (from the least > significant dword of the BAR) that the BAR exists. Continue seems only > right when the BAR doesn't exist. > > In my opinion (but Ray should correct me if I'm wrong), we should not > assign Status here, as we don't care whether BarExisted() finds that the > response Value from the device is zero or not. That only matters if > we're testing the low qword. So just remove "Status =3D". > > > > @@ -2861,13 +2875,13 @@ ResetAllPpbBusNumber ( > > if (!EFI_ERROR (Status) && (IS_PCI_BRIDGE (&Pci))) { > > Register =3D 0; > > Address =3D EFI_PCI_ADDRESS (StartBusNumber, Device, Func, 0x= 18); > > - Status =3D PciRootBridgeIo->Pci.Read ( > > - PciRootBridgeIo, > > - EfiPciWidthUint32, > > - Address, > > - 1, > > - &Register > > - ); > > + PciRootBridgeIo->Pci.Read ( > > + PciRootBridgeIo, > > + EfiPciWidthUint32, > > + Address, > > + 1, > > + &Register > > + ); > > SecondaryBus =3D (UINT8)(Register >> 8); > > > > if (SecondaryBus !=3D 0) { > > @@ -2878,13 +2892,13 @@ ResetAllPpbBusNumber ( > > // Reset register 18h, 19h, 1Ah on PCI Bridge > > // > > Register &=3D 0xFF000000; > > - Status =3D PciRootBridgeIo->Pci.Write ( > > - PciRootBridgeIo, > > - EfiPciWidthUint32, > > - Address, > > - 1, > > - &Register > > - ); > > + PciRootBridgeIo->Pci.Write ( > > + PciRootBridgeIo, > > + EfiPciWidthUint32, > > + Address, > > + 1, > > + &Register > > + ); > > } > > > > if ((Func =3D=3D 0) && !IS_PCI_MULTI_FUNC (&Pci)) { > > Wow, the original code is so sloppy. :( > > I guess it=C5=9B best if we just don't assign Status here. If these acces= ses > don't work, then nothing will. > > > diff --git a/MdeModulePkg/Bus/Pci/PciBusDxe/PciLib.c > b/MdeModulePkg/Bus/Pci/PciBusDxe/PciLib.c > > index 71767d3793d4..087fe563c0bc 100644 > > --- a/MdeModulePkg/Bus/Pci/PciBusDxe/PciLib.c > > +++ b/MdeModulePkg/Bus/Pci/PciBusDxe/PciLib.c > > @@ -1250,6 +1250,10 @@ PciScanBus ( > > &State > > ); > > > > + if (EFI_ERROR (Status)) { > > + DEBUG ((DEBUG_WARN, "Failed to initialize Hotplug PCI > Controller, Status %r\n", Status)); > > + } > > + > > PreprocessController ( > > PciDevice, > > PciDevice->BusNumber, > > Honestly, I don't have the slightest idea. The original code is utterly > broken. We have a PCI device that seems like a root hotplug controller, > we fail to initialzie the root hotplug controller, we capture the Status > there, and then happily go on to "pre-process" the controller. > > What the heck is this. If the root HPC init is not a pre-requisite for > preprocessing, then why capture the status??? > > Well, I guess your approach is the safest. Log it, but otherwise, > preserve the current behavior. Jesus. > > > @@ -1501,6 +1505,10 @@ PciRootBridgeP2CProcess ( > > > > if (!IsListEmpty (&Temp->ChildList)) { > > Status =3D PciRootBridgeP2CProcess (Temp); > > + > > + if (EFI_ERROR (Status)) { > > + DEBUG ((DEBUG_WARN, "Failed to process Option Rom on PCI root > bridge %p, Status %r\n", Temp, Status)); > > + } > > } > > > > CurrentLink =3D CurrentLink->ForwardLink; > > Yeah, I guess so. > > On a tangent, best cast Temp to (VOID*)Temp, for logging with %p. > > I didn't expect that the original code was this terrible. > > Laszlo > > -=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#111019): https://edk2.groups.io/g/devel/message/111019 Mute This Topic: https://groups.io/mt/102438321/7686176 Group Owner: devel+owner@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [rebecca@openfw.io] -=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D- --000000000000e3db240609c677eb Content-Type: text/html; charset="UTF-8" Content-Transfer-Encoding: base64 PGRpdiBkaXI9Imx0ciI+SXQgd2FzIGhhcmQgdG8gY29uY2x1ZGUgYXQgbXkgZW5kIGFzIHdlbGwg d2hhdCB0byBkbyB3aGVyZS4gU28gSSBqdXN0IHRocmV3IGl0IG9wZW4gLi4uPGRpdj48YnI+PC9k aXY+PGRpdj4tIFN0YXR1cyBhc3NpZ25tZW50IGNhbiBiZSBpZ25vcmVkIG9yPC9kaXY+PGRpdj4t IE1haW50YWluIHRoZSBleGlzdGluZyBiZWhhdmlvdXIgYW5kIGp1c3QgbG9nIHRoZSBlcnJvciBn aXZlbiB0aGUgb3JpZ2luYWwgY29kZSBleGlzdGVuY2UgZm9yIHF1aXRlIGEgbG9uZyBub3c8L2Rp dj48ZGl2Pjxicj48L2Rpdj48ZGl2PlZhcmlvdXMgZmlsZXMgd2VyZSBjbHViYmVkIHRvZ2V0aGVy IGJlaW5nIHBhcnQgb2YgdGhlIHNhbWUgbW9kdWxlIGFuZCBhbGwgaGF2aW5nIHRoZSBzYW1lIFVO VVNFRF9WQUxVRSBpc3N1ZS48L2Rpdj48ZGl2PklmIHlvdSBzYXkgc28sIEkgd2lsbCBzcGxpdCwg YnV0IG1hbnkgbGluZXMgYXJlIGp1c3QgY29zbWV0aWMgY2hhbmdlcyAoaW5kZW50YXRpb24gbGV2 ZWwpIC0gYWZ0ZXIgaW1wYWN0IG9mIGluY2x1c2lvbiAvIHJlbW92YWwgb2YgU3RhdHVzIHN0b3Jh Z2UgLyBTdGF0dXMgdmFsdWUgY2hlY2suPC9kaXY+PGRpdj5XaWxsIG5lZWQgdG8gZmlndXJlIG91 dCB3aGF0IGlzIHRoZSBiZXN0IHNwbGl0IHRob3VnaCA6LSk8L2Rpdj48L2Rpdj48YnI+PGRpdiBj bGFzcz0iZ21haWxfcXVvdGUiPjxkaXYgZGlyPSJsdHIiIGNsYXNzPSJnbWFpbF9hdHRyIj5PbiBU dWUsIE5vdiA3LCAyMDIzIGF0IDEwOjUw4oCvUE0gTGFzemxvIEVyc2VrICZsdDs8YSBocmVmPSJt YWlsdG86bGVyc2VrQHJlZGhhdC5jb20iPmxlcnNla0ByZWRoYXQuY29tPC9hPiZndDsgd3JvdGU6 PGJyPjwvZGl2PjxibG9ja3F1b3RlIGNsYXNzPSJnbWFpbF9xdW90ZSIgc3R5bGU9Im1hcmdpbjow cHggMHB4IDBweCAwLjhleDtib3JkZXItbGVmdDoxcHggc29saWQgcmdiKDIwNCwyMDQsMjA0KTtw YWRkaW5nLWxlZnQ6MWV4Ij5PbiAxMS83LzIzIDA3OjE5LCBSYW5iaXIgU2luZ2ggd3JvdGU6PGJy Pg0KJmd0OyBUaGUgcmV0dXJuIHZhbHVlIGFmdGVyIGNhbGxzIHRvIGZ1bmN0aW9uczxicj4NCiZn dDsgZ0JTLSZndDtVbmluc3RhbGxNdWx0aXBsZVByb3RvY29sSW50ZXJmYWNlcywgU3RhcnRQY2lE ZXZpY2VzT25CcmlkZ2UsPGJyPg0KJmd0OyBQY2lQY2lEZXZpY2VJbmZvQ29sbGVjdG9yLCBCYXJF eGlzdGVkLCBQY2lSb290QnJpZGdlSW8tJmd0O1BjaS5Xcml0ZSw8YnI+DQomZ3Q7IGdQY2lIb3RQ bHVnSW5pdC0mZ3Q7SW5pdGlhbGl6ZVJvb3RIcGMgYW5kIFBjaVJvb3RCcmlkZ2VQMkNQcm9jZXNz IGlzPGJyPg0KJmd0OyBzdG9yZWQgaW4gU3RhdHVzLCBidXQgaXQgaXMgbm90IG1hZGUgb2YgYW55 IHVzZSBhbmQgbGF0ZXIgU3RhdHVzPGJyPg0KJmd0OyBnZXRzIG92ZXJyaWRkZW4uPGJyPg0KJmd0 OyA8YnI+DQomZ3Q7IFJlbW92ZSB0aGUgcmV0dXJuIHZhbHVlIHN0b3JhZ2UgaW4gU3RhdHVzIG9y IGFkZCBTdGF0dXMgY2hlY2sgYXM8YnI+DQomZ3Q7IHNlZW1zIGFwcHJvcHJpYXRlIGF0IGEgcGFy dGljdWxhciBwb2ludC48YnI+DQomZ3Q7IDxicj4NCiZndDsgUkVGOiA8YSBocmVmPSJodHRwczov L2J1Z3ppbGxhLnRpYW5vY29yZS5vcmcvc2hvd19idWcuY2dpP2lkPTQyMzkiIHJlbD0ibm9yZWZl cnJlciIgdGFyZ2V0PSJfYmxhbmsiPmh0dHBzOi8vYnVnemlsbGEudGlhbm9jb3JlLm9yZy9zaG93 X2J1Zy5jZ2k/aWQ9NDIzOTwvYT48YnI+DQomZ3Q7IDxicj4NCiZndDsgQ2M6IFJheSBOaSAmbHQ7 PGEgaHJlZj0ibWFpbHRvOnJheS5uaUBpbnRlbC5jb20iIHRhcmdldD0iX2JsYW5rIj5yYXkubmlA aW50ZWwuY29tPC9hPiZndDs8YnI+DQomZ3Q7IFNpZ25lZC1vZmYtYnk6IFJhbmJpciBTaW5naCAm bHQ7PGEgaHJlZj0ibWFpbHRvOnJzaW5naEB2ZW50YW5hbWljcm8uY29tIiB0YXJnZXQ9Il9ibGFu ayI+cnNpbmdoQHZlbnRhbmFtaWNyby5jb208L2E+Jmd0Ozxicj4NCiZndDsgLS0tPGJyPg0KJmd0 O8KgIE1kZU1vZHVsZVBrZy9CdXMvUGNpL1BjaUJ1c0R4ZS9QY2lEZXZpY2VTdXBwb3J0LmPCoCDC oCDCoHwgNjggKysrKysrKysrKystLS0tLS0tLS08YnI+DQomZ3Q7wqAgTWRlTW9kdWxlUGtnL0J1 cy9QY2kvUGNpQnVzRHhlL1BjaUVudW1lcmF0b3JTdXBwb3J0LmMgfCA0MiArKysrKysrKy0tLS08 YnI+DQomZ3Q7wqAgTWRlTW9kdWxlUGtnL0J1cy9QY2kvUGNpQnVzRHhlL1BjaUxpYi5jwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqB8wqAgOCArKys8YnI+DQomZ3Q7wqAgMyBmaWxlcyBjaGFuZ2VkLCA3 MiBpbnNlcnRpb25zKCspLCA0NiBkZWxldGlvbnMoLSk8YnI+DQo8YnI+DQpGaXJzdCBvZiBhbGws IHBsZWFzZSBzcGxpdCB1cCB0aGlzIHBhdGNoLiBJdCYjMzk7cyBoYXJkIHRvIHJldmlldyBpdCBs aWtlPGJyPg0KdGhpcywgd2l0aCB1bnJlbGF0ZWQgcGllY2VzIG9mIGxvZ2ljIGx1bXBlZCB0b2dl dGhlci48YnI+DQo8YnI+DQomZ3Q7IDxicj4NCiZndDsgZGlmZiAtLWdpdCBhL01kZU1vZHVsZVBr Zy9CdXMvUGNpL1BjaUJ1c0R4ZS9QY2lEZXZpY2VTdXBwb3J0LmMgYi9NZGVNb2R1bGVQa2cvQnVz L1BjaS9QY2lCdXNEeGUvUGNpRGV2aWNlU3VwcG9ydC5jPGJyPg0KJmd0OyBpbmRleCAzZGU4MGQ5 ODM3MGUuLjliMDU4N2M5NGQwNSAxMDA2NDQ8YnI+DQomZ3Q7IC0tLSBhL01kZU1vZHVsZVBrZy9C dXMvUGNpL1BjaUJ1c0R4ZS9QY2lEZXZpY2VTdXBwb3J0LmM8YnI+DQomZ3Q7ICsrKyBiL01kZU1v ZHVsZVBrZy9CdXMvUGNpL1BjaUJ1c0R4ZS9QY2lEZXZpY2VTdXBwb3J0LmM8YnI+DQomZ3Q7IEBA IC01NDQsMTIgKzU0NCwxMiBAQCBEZVJlZ2lzdGVyUGNpRGV2aWNlICg8YnI+DQomZ3Q7wqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgRUZJX09QRU5fUFJPVE9DT0xfVEVTVF9QUk9U T0NPTDxicj4NCiZndDvCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCApOzxicj4N CiZndDvCoCDCoCDCoCDCoCBpZiAoIUVGSV9FUlJPUiAoU3RhdHVzKSkgezxicj4NCiZndDsgLcKg IMKgIMKgIMKgIFN0YXR1cyA9IGdCUy0mZ3Q7VW5pbnN0YWxsTXVsdGlwbGVQcm90b2NvbEludGVy ZmFjZXMgKDxicj4NCiZndDsgLcKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIEhh bmRsZSw8YnI+DQomZ3Q7IC3CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCAmYW1w O2dFZmlMb2FkRmlsZTJQcm90b2NvbEd1aWQsPGJyPg0KJmd0OyAtwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgJmFtcDtQY2lJb0RldmljZS0mZ3Q7TG9hZEZpbGUyLDxicj4NCiZn dDsgLcKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIE5VTEw8YnI+DQomZ3Q7IC3C oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCApOzxicj4NCiZndDsgK8KgIMKgIMKg IMKgIGdCUy0mZ3Q7VW5pbnN0YWxsTXVsdGlwbGVQcm90b2NvbEludGVyZmFjZXMgKDxicj4NCiZn dDsgK8KgIMKgIMKgIMKgIMKgIMKgIMKgIMKgSGFuZGxlLDxicj4NCiZndDsgK8KgIMKgIMKgIMKg IMKgIMKgIMKgIMKgJmFtcDtnRWZpTG9hZEZpbGUyUHJvdG9jb2xHdWlkLDxicj4NCiZndDsgK8Kg IMKgIMKgIMKgIMKgIMKgIMKgIMKgJmFtcDtQY2lJb0RldmljZS0mZ3Q7TG9hZEZpbGUyLDxicj4N CiZndDsgK8KgIMKgIMKgIMKgIMKgIMKgIMKgIMKgTlVMTDxicj4NCiZndDsgK8KgIMKgIMKgIMKg IMKgIMKgIMKgIMKgKTs8YnI+DQomZ3Q7wqAgwqAgwqAgwqAgfTxicj4NCiZndDvCoCA8YnI+DQom Z3Q7wqAgwqAgwqAgwqAgLy88YnI+DQo8YnI+DQpPSzxicj4NCjxicj4NCiZndDsgQEAgLTY3OCwx OSArNjc4LDIxIEBAIFN0YXJ0UGNpRGV2aWNlc09uQnJpZGdlICg8YnI+DQomZ3Q7wqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBDaGlsZEhhbmRsZUJ1ZmZlcjxicj4NCiZndDvCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCk7PGJyPg0KJmd0O8KgIDxicj4NCiZndDsgLcKgIMKg IMKgIMKgIFBjaUlvRGV2aWNlLSZndDtQY2lJby5BdHRyaWJ1dGVzICg8YnI+DQomZ3Q7IC3CoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCZhbXA7KFBjaUlvRGV2aWNl LSZndDtQY2lJbyksPGJyPg0KJmd0OyAtwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqBFZmlQY2lJb0F0dHJpYnV0ZU9wZXJhdGlvblN1cHBvcnRlZCw8YnI+DQomZ3Q7 IC3CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoDAsPGJyPg0KJmd0 OyAtwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAmYW1wO1N1cHBv cnRzPGJyPg0KJmd0OyAtwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqApOzxicj4NCiZndDsgLcKgIMKgIMKgIMKgIFN1cHBvcnRzICZhbXA7PSAoVUlOVDY0KUVGSV9Q Q0lfREVWSUNFX0VOQUJMRTs8YnI+DQomZ3Q7IC3CoCDCoCDCoCDCoCBQY2lJb0RldmljZS0mZ3Q7 UGNpSW8uQXR0cmlidXRlcyAoPGJyPg0KJmd0OyAtwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAmYW1wOyhQY2lJb0RldmljZS0mZ3Q7UGNpSW8pLDxicj4NCiZndDsg LcKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgRWZpUGNpSW9BdHRy aWJ1dGVPcGVyYXRpb25FbmFibGUsPGJyPg0KJmd0OyAtwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqBTdXBwb3J0cyw8YnI+DQomZ3Q7IC3CoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoE5VTEw8YnI+DQomZ3Q7IC3CoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCk7PGJyPg0KJmd0OyArwqAgwqAgwqAgwqAg aWYgKCFFRklfRVJST1IgKFN0YXR1cykpIHs8YnI+DQomZ3Q7ICvCoCDCoCDCoCDCoCDCoCBQY2lJ b0RldmljZS0mZ3Q7UGNpSW8uQXR0cmlidXRlcyAoPGJyPg0KJmd0OyArwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAmYW1wOyhQY2lJb0RldmljZS0mZ3Q7UGNp SW8pLDxicj4NCiZndDsgK8KgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgRWZpUGNpSW9BdHRyaWJ1dGVPcGVyYXRpb25TdXBwb3J0ZWQsPGJyPg0KJmd0OyArwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAwLDxicj4NCiZndDsg K8KgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgJmFtcDtTdXBw b3J0czxicj4NCiZndDsgK8KgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgKTs8YnI+DQomZ3Q7ICvCoCDCoCDCoCDCoCDCoCBTdXBwb3J0cyAmYW1wOz0gKFVJTlQ2 NClFRklfUENJX0RFVklDRV9FTkFCTEU7PGJyPg0KJmd0OyArwqAgwqAgwqAgwqAgwqAgUGNpSW9E ZXZpY2UtJmd0O1BjaUlvLkF0dHJpYnV0ZXMgKDxicj4NCiZndDsgK8KgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgJmFtcDsoUGNpSW9EZXZpY2UtJmd0O1BjaUlv KSw8YnI+DQomZ3Q7ICvCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoEVmaVBjaUlvQXR0cmlidXRlT3BlcmF0aW9uRW5hYmxlLDxicj4NCiZndDsgK8KgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgU3VwcG9ydHMsPGJyPg0KJmd0 OyArwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBOVUxMPGJy Pg0KJmd0OyArwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAp Ozxicj4NCiZndDsgK8KgIMKgIMKgIMKgIH08YnI+DQomZ3Q7wqAgPGJyPg0KJmd0O8KgIMKgIMKg IMKgIMKgIHJldHVybiBTdGF0dXM7PGJyPg0KJmd0O8KgIMKgIMKgIMKgIH0gZWxzZSB7PGJyPg0K PGJyPg0KT0s8YnI+DQo8YnI+DQomZ3Q7IEBAIC03MjYsMTkgKzcyOCwyMSBAQCBTdGFydFBjaURl dmljZXNPbkJyaWRnZSAoPGJyPg0KJmd0O8KgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg Q2hpbGRIYW5kbGVCdWZmZXI8YnI+DQomZ3Q7wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqApOzxicj4NCiZndDvCoCA8YnI+DQomZ3Q7IC3CoCDCoCDCoCDCoCBQY2lJb0RldmljZS0mZ3Q7 UGNpSW8uQXR0cmlidXRlcyAoPGJyPg0KJmd0OyAtwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAmYW1wOyhQY2lJb0RldmljZS0mZ3Q7UGNpSW8pLDxicj4NCiZndDsg LcKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgRWZpUGNpSW9BdHRy aWJ1dGVPcGVyYXRpb25TdXBwb3J0ZWQsPGJyPg0KJmd0OyAtwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAwLDxicj4NCiZndDsgLcKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgJmFtcDtTdXBwb3J0czxicj4NCiZndDsgLcKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgKTs8YnI+DQomZ3Q7IC3CoCDCoCDC oCDCoCBTdXBwb3J0cyAmYW1wOz0gKFVJTlQ2NClFRklfUENJX0RFVklDRV9FTkFCTEU7PGJyPg0K Jmd0OyAtwqAgwqAgwqAgwqAgUGNpSW9EZXZpY2UtJmd0O1BjaUlvLkF0dHJpYnV0ZXMgKDxicj4N CiZndDsgLcKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgJmFtcDso UGNpSW9EZXZpY2UtJmd0O1BjaUlvKSw8YnI+DQomZ3Q7IC3CoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoEVmaVBjaUlvQXR0cmlidXRlT3BlcmF0aW9uRW5hYmxlLDxi cj4NCiZndDsgLcKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgU3Vw cG9ydHMsPGJyPg0KJmd0OyAtwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqBOVUxMPGJyPg0KJmd0OyAtwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqApOzxicj4NCiZndDsgK8KgIMKgIMKgIMKgIGlmICghRUZJX0VSUk9SIChTdGF0dXMp KSB7PGJyPg0KJmd0OyArwqAgwqAgwqAgwqAgwqAgUGNpSW9EZXZpY2UtJmd0O1BjaUlvLkF0dHJp YnV0ZXMgKDxicj4NCiZndDsgK8KgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgJmFtcDsoUGNpSW9EZXZpY2UtJmd0O1BjaUlvKSw8YnI+DQomZ3Q7ICvCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoEVmaVBjaUlvQXR0cmlidXRl T3BlcmF0aW9uU3VwcG9ydGVkLDxicj4NCiZndDsgK8KgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgMCw8YnI+DQomZ3Q7ICvCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCZhbXA7U3VwcG9ydHM8YnI+DQomZ3Q7ICvCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCk7PGJyPg0KJmd0OyArwqAg wqAgwqAgwqAgwqAgU3VwcG9ydHMgJmFtcDs9IChVSU5UNjQpRUZJX1BDSV9ERVZJQ0VfRU5BQkxF Ozxicj4NCiZndDsgK8KgIMKgIMKgIMKgIMKgIFBjaUlvRGV2aWNlLSZndDtQY2lJby5BdHRyaWJ1 dGVzICg8YnI+DQomZ3Q7ICvCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCZhbXA7KFBjaUlvRGV2aWNlLSZndDtQY2lJbyksPGJyPg0KJmd0OyArwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBFZmlQY2lJb0F0dHJpYnV0ZU9w ZXJhdGlvbkVuYWJsZSw8YnI+DQomZ3Q7ICvCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoFN1cHBvcnRzLDxicj4NCiZndDsgK8KgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgTlVMTDxicj4NCiZndDsgK8KgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgKTs8YnI+DQomZ3Q7ICvCoCDCoCDCoCDC oCB9PGJyPg0KJmd0O8KgIMKgIMKgIMKgIH08YnI+DQomZ3Q7wqAgPGJyPg0KJmd0O8KgIMKgIMKg IMKgIEN1cnJlbnRMaW5rID0gQ3VycmVudExpbmstJmd0O0ZvcndhcmRMaW5rOzxicj4NCjxicj4N CkkgZG9uJiMzOTt0IHJlYWxseSBsaWtlIHRoaXM7IHRoZSBvcmlnaW5hbCBjb2RlIGlzIGluY29u c2lzdGVudC4gSW4gdGhlPGJyPg0KZmlyc3QgYnJhbmNoLCBTdGFydFBjaURldmljZXNPbkJyaWRn ZSgpIGZhaWx1cmUgaXMgZmF0YWwsIGhlcmUgaXQgaXNuJiMzOTt0LiA6Lzxicj4NCjxicj4NCkFu eXdheSwgSSBhZ3JlZSB3ZSBjYW4gYXQgbGVhc3QgcmVzdHJpY3QgdGhlIGVuYWJsZW1lbnQuIE9L Ljxicj4NCjxicj4NCiZndDsgZGlmZiAtLWdpdCBhL01kZU1vZHVsZVBrZy9CdXMvUGNpL1BjaUJ1 c0R4ZS9QY2lFbnVtZXJhdG9yU3VwcG9ydC5jIGIvTWRlTW9kdWxlUGtnL0J1cy9QY2kvUGNpQnVz RHhlL1BjaUVudW1lcmF0b3JTdXBwb3J0LmM8YnI+DQomZ3Q7IGluZGV4IGVkYTk3Mjg1ZWUxOC4u NjM2ODg1ZGQxODlkIDEwMDY0NDxicj4NCiZndDsgLS0tIGEvTWRlTW9kdWxlUGtnL0J1cy9QY2kv UGNpQnVzRHhlL1BjaUVudW1lcmF0b3JTdXBwb3J0LmM8YnI+DQomZ3Q7ICsrKyBiL01kZU1vZHVs ZVBrZy9CdXMvUGNpL1BjaUJ1c0R4ZS9QY2lFbnVtZXJhdG9yU3VwcG9ydC5jPGJyPg0KJmd0OyBA QCAtMjc5Niw2ICsyNzk2LDIwIEBAIElzUGNpRGV2aWNlUmVqZWN0ZWQgKDxicj4NCiZndDvCoCDC oCDCoCDCoCDCoCDCoCAvLyBUZXN0IGl0cyBoaWdoIDMyLUJpdCBCQVI8YnI+DQomZ3Q7wqAgwqAg wqAgwqAgwqAgwqAgLy88YnI+DQomZ3Q7wqAgwqAgwqAgwqAgwqAgwqAgU3RhdHVzID0gQmFyRXhp c3RlZCAoUGNpSW9EZXZpY2UsIEJhck9mZnNldCwgJmFtcDtUZXN0VmFsdWUsICZhbXA7T2xkVmFs dWUpOzxicj4NCiZndDsgK8KgIMKgIMKgIMKgIMKgIGlmIChFRklfRVJST1IgKFN0YXR1cykpIHs8 YnI+DQomZ3Q7ICvCoCDCoCDCoCDCoCDCoCDCoCAvLzxicj4NCiZndDsgK8KgIMKgIMKgIMKgIMKg IMKgIC8vIE5vdCBzdXJlIGlmIGl0IGlzIGNvcnJlY3QgdG8gc2tpcCB0aGUgYmVsb3cgaWYgKFRl c3RWYWx1ZSA9PSBPbGRWYWx1ZSkgY2hlY2sgaW4gdGhpcyBzcGVjaWFsIHNjZW5hcmlvLjxicj4N CiZndDsgK8KgIMKgIMKgIMKgIMKgIMKgIC8vIElmIGNvcnJlY3QsIHRoZW4gcmVtb3ZlIHRoZXNl IDExIGNvbW1lbnQgbGluZXMgZXZlbnR1YWxseS48YnI+DQomZ3Q7ICvCoCDCoCDCoCDCoCDCoCDC oCAvLyBJZiBub3QgY29ycmVjdCwgdGhlbiByZXBsYWNlICZxdW90O2NvbnRpbnVlOyZxdW90OyB3 aXRoIGJsYW5rICZxdW90OzsgLy8gTm90aGluZyB0byBkbyZxdW90OyBhbmQgYWxzbyByZW1vdmUg dGhlc2UgMTEgY29tbWVudCBsaW5lcyBldmVudHVhbGx5PGJyPg0KJmd0OyArwqAgwqAgwqAgwqAg wqAgwqAgLy/CoCDCoE9SPGJyPg0KJmd0OyArwqAgwqAgwqAgwqAgwqAgwqAgLy/CoCDCoFJlbW92 ZSB0aGUgbmV3bHkgYWRkZWQgaWYgKEVGSV9FUlJPUiAoU3RhdHVzKSkgeyAuLi4gfSBibG9jayBj b21wbGV0ZWx5IGFuZCBjaGFuZ2U8YnI+DQomZ3Q7ICvCoCDCoCDCoCDCoCDCoCDCoCAvL8KgIMKg U3RhdHVzID0gQmFyRXhpc3RlZCAoUGNpSW9EZXZpY2UsIEJhck9mZnNldCwgJmFtcDtUZXN0VmFs dWUsICZhbXA7T2xkVmFsdWUpOzxicj4NCiZndDsgK8KgIMKgIMKgIMKgIMKgIMKgIC8vwqAgwqA9 Jmd0Ozxicj4NCiZndDsgK8KgIMKgIMKgIMKgIMKgIMKgIC8vwqAgwqBCYXJFeGlzdGVkIChQY2lJ b0RldmljZSwgQmFyT2Zmc2V0LCAmYW1wO1Rlc3RWYWx1ZSwgJmFtcDtPbGRWYWx1ZSk7PGJyPg0K Jmd0OyArwqAgwqAgwqAgwqAgwqAgwqAgLy/CoCDCoGkuZS4sIG5vIHJldHVybiB2YWx1ZSBzdG9y YWdlIGluIFN0YXR1czxicj4NCiZndDsgK8KgIMKgIMKgIMKgIMKgIMKgIC8vPGJyPg0KJmd0OyAr wqAgwqAgwqAgwqAgwqAgwqAgY29udGludWU7PGJyPg0KJmd0OyArwqAgwqAgwqAgwqAgwqAgfTxi cj4NCiZndDvCoCDCoCDCoCDCoCDCoCDCoCBpZiAoVGVzdFZhbHVlID09IE9sZFZhbHVlKSB7PGJy Pg0KJmd0O8KgIMKgIMKgIMKgIMKgIMKgIMKgIHJldHVybiBUUlVFOzxicj4NCiZndDvCoCDCoCDC oCDCoCDCoCDCoCB9PGJyPg0KPGJyPg0KJnF1b3Q7Y29udGludWUmcXVvdDsgaXMgbm90IHJpZ2h0 IGhlcmUuIFdlIGhhdmUgYWxyZWFkeSBkZXRlcm1pbmVkIChmcm9tIHRoZSBsZWFzdDxicj4NCnNp Z25pZmljYW50IGR3b3JkIG9mIHRoZSBCQVIpIHRoYXQgdGhlIEJBUiBleGlzdHMuIENvbnRpbnVl IHNlZW1zIG9ubHk8YnI+DQpyaWdodCB3aGVuIHRoZSBCQVIgZG9lc24mIzM5O3QgZXhpc3QuPGJy Pg0KPGJyPg0KSW4gbXkgb3BpbmlvbiAoYnV0IFJheSBzaG91bGQgY29ycmVjdCBtZSBpZiBJJiMz OTttIHdyb25nKSwgd2Ugc2hvdWxkIG5vdDxicj4NCmFzc2lnbiBTdGF0dXMgaGVyZSwgYXMgd2Ug ZG9uJiMzOTt0IGNhcmUgd2hldGhlciBCYXJFeGlzdGVkKCkgZmluZHMgdGhhdCB0aGU8YnI+DQpy ZXNwb25zZSBWYWx1ZSBmcm9tIHRoZSBkZXZpY2UgaXMgemVybyBvciBub3QuIFRoYXQgb25seSBt YXR0ZXJzIGlmPGJyPg0Kd2UmIzM5O3JlIHRlc3RpbmcgdGhlIGxvdyBxd29yZC4gU28ganVzdCBy ZW1vdmUgJnF1b3Q7U3RhdHVzID0mcXVvdDsuPGJyPg0KPGJyPg0KPGJyPg0KJmd0OyBAQCAtMjg2 MSwxMyArMjg3NSwxMyBAQCBSZXNldEFsbFBwYkJ1c051bWJlciAoPGJyPg0KJmd0O8KgIMKgIMKg IMKgIGlmICghRUZJX0VSUk9SIChTdGF0dXMpICZhbXA7JmFtcDsgKElTX1BDSV9CUklER0UgKCZh bXA7UGNpKSkpIHs8YnI+DQomZ3Q7wqAgwqAgwqAgwqAgwqAgUmVnaXN0ZXIgPSAwOzxicj4NCiZn dDvCoCDCoCDCoCDCoCDCoCBBZGRyZXNzwqAgPSBFRklfUENJX0FERFJFU1MgKFN0YXJ0QnVzTnVt YmVyLCBEZXZpY2UsIEZ1bmMsIDB4MTgpOzxicj4NCiZndDsgLcKgIMKgIMKgIMKgIFN0YXR1c8Kg IMKgPSBQY2lSb290QnJpZGdlSW8tJmd0O1BjaS5SZWFkICg8YnI+DQomZ3Q7IC3CoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCBQY2lS b290QnJpZGdlSW8sPGJyPg0KJmd0OyAtwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgRWZpUGNpV2lkdGhVaW50MzIsPGJyPg0KJmd0 OyAtwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgQWRkcmVzcyw8YnI+DQomZ3Q7IC3CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCAxLDxicj4NCiZndDsgLcKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgICZh bXA7UmVnaXN0ZXI8YnI+DQomZ3Q7IC3CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCApOzxicj4NCiZndDsgK8KgIMKgIMKgIMKgIFBj aVJvb3RCcmlkZ2VJby0mZ3Q7UGNpLlJlYWQgKDxicj4NCiZndDsgK8KgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgUGNpUm9vdEJyaWRnZUlvLDxicj4NCiZndDsg K8KgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgRWZpUGNpV2lk dGhVaW50MzIsPGJyPg0KJmd0OyArwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqBBZGRyZXNzLDxicj4NCiZndDsgK8KgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgMSw8YnI+DQomZ3Q7ICvCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCZhbXA7UmVnaXN0ZXI8YnI+DQomZ3Q7ICvCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCk7PGJyPg0KJmd0O8KgIMKg IMKgIMKgIMKgIFNlY29uZGFyeUJ1cyA9IChVSU5UOCkoUmVnaXN0ZXIgJmd0OyZndDsgOCk7PGJy Pg0KJmd0O8KgIDxicj4NCiZndDvCoCDCoCDCoCDCoCDCoCBpZiAoU2Vjb25kYXJ5QnVzICE9IDAp IHs8YnI+DQomZ3Q7IEBAIC0yODc4LDEzICsyODkyLDEzIEBAIFJlc2V0QWxsUHBiQnVzTnVtYmVy ICg8YnI+DQomZ3Q7wqAgwqAgwqAgwqAgwqAgLy8gUmVzZXQgcmVnaXN0ZXIgMThoLCAxOWgsIDFB aCBvbiBQQ0kgQnJpZGdlPGJyPg0KJmd0O8KgIMKgIMKgIMKgIMKgIC8vPGJyPg0KJmd0O8KgIMKg IMKgIMKgIMKgIFJlZ2lzdGVyICZhbXA7PSAweEZGMDAwMDAwOzxicj4NCiZndDsgLcKgIMKgIMKg IMKgIFN0YXR1c8KgIMKgID0gUGNpUm9vdEJyaWRnZUlvLSZndDtQY2kuV3JpdGUgKDxicj4NCiZn dDsgLcKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgUGNpUm9vdEJyaWRnZUlvLDxicj4NCiZndDsgLcKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgRWZpUGNpV2lk dGhVaW50MzIsPGJyPg0KJmd0OyAtwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBBZGRyZXNzLDxicj4NCiZndDsgLcKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg MSw8YnI+DQomZ3Q7IC3CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCZhbXA7UmVnaXN0ZXI8YnI+DQomZ3Q7IC3CoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCk7 PGJyPg0KJmd0OyArwqAgwqAgwqAgwqAgUGNpUm9vdEJyaWRnZUlvLSZndDtQY2kuV3JpdGUgKDxi cj4NCiZndDsgK8KgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg UGNpUm9vdEJyaWRnZUlvLDxicj4NCiZndDsgK8KgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgRWZpUGNpV2lkdGhVaW50MzIsPGJyPg0KJmd0OyArwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBBZGRyZXNzLDxicj4NCiZndDsg K8KgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgMSw8YnI+DQom Z3Q7ICvCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCZhbXA7 UmVnaXN0ZXI8YnI+DQomZ3Q7ICvCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCk7PGJyPg0KJmd0O8KgIMKgIMKgIMKgIH08YnI+DQomZ3Q7wqAgPGJyPg0KJmd0 O8KgIMKgIMKgIMKgIGlmICgoRnVuYyA9PSAwKSAmYW1wOyZhbXA7ICFJU19QQ0lfTVVMVElfRlVO QyAoJmFtcDtQY2kpKSB7PGJyPg0KPGJyPg0KV293LCB0aGUgb3JpZ2luYWwgY29kZSBpcyBzbyBz bG9wcHkuIDooPGJyPg0KPGJyPg0KSSBndWVzcyBpdMWbIGJlc3QgaWYgd2UganVzdCBkb24mIzM5 O3QgYXNzaWduIFN0YXR1cyBoZXJlLiBJZiB0aGVzZSBhY2Nlc3Nlczxicj4NCmRvbiYjMzk7dCB3 b3JrLCB0aGVuIG5vdGhpbmcgd2lsbC48YnI+DQo8YnI+DQomZ3Q7IGRpZmYgLS1naXQgYS9NZGVN b2R1bGVQa2cvQnVzL1BjaS9QY2lCdXNEeGUvUGNpTGliLmMgYi9NZGVNb2R1bGVQa2cvQnVzL1Bj aS9QY2lCdXNEeGUvUGNpTGliLmM8YnI+DQomZ3Q7IGluZGV4IDcxNzY3ZDM3OTNkNC4uMDg3ZmU1 NjNjMGJjIDEwMDY0NDxicj4NCiZndDsgLS0tIGEvTWRlTW9kdWxlUGtnL0J1cy9QY2kvUGNpQnVz RHhlL1BjaUxpYi5jPGJyPg0KJmd0OyArKysgYi9NZGVNb2R1bGVQa2cvQnVzL1BjaS9QY2lCdXNE eGUvUGNpTGliLmM8YnI+DQomZ3Q7IEBAIC0xMjUwLDYgKzEyNTAsMTAgQEAgUGNpU2NhbkJ1cyAo PGJyPg0KJmd0O8KgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgICZhbXA7U3RhdGU8YnI+DQomZ3Q7wqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgKTs8YnI+DQom Z3Q7wqAgPGJyPg0KJmd0OyArwqAgwqAgwqAgwqAgwqAgwqAgwqAgaWYgKEVGSV9FUlJPUiAoU3Rh dHVzKSkgezxicj4NCiZndDsgK8KgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIERFQlVHICgoREVCVUdf V0FSTiwgJnF1b3Q7RmFpbGVkIHRvIGluaXRpYWxpemUgSG90cGx1ZyBQQ0kgQ29udHJvbGxlciwg U3RhdHVzICVyXG4mcXVvdDssIFN0YXR1cykpOzxicj4NCiZndDsgK8KgIMKgIMKgIMKgIMKgIMKg IMKgIH08YnI+DQomZ3Q7ICs8YnI+DQomZ3Q7wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgUHJlcHJv Y2Vzc0NvbnRyb2xsZXIgKDxicj4NCiZndDvCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCBQY2lE ZXZpY2UsPGJyPg0KJmd0O8KgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIFBjaURldmljZS0mZ3Q7 QnVzTnVtYmVyLDxicj4NCjxicj4NCkhvbmVzdGx5LCBJIGRvbiYjMzk7dCBoYXZlIHRoZSBzbGln aHRlc3QgaWRlYS4gVGhlIG9yaWdpbmFsIGNvZGUgaXMgdXR0ZXJseTxicj4NCmJyb2tlbi4gV2Ug aGF2ZSBhIFBDSSBkZXZpY2UgdGhhdCBzZWVtcyBsaWtlIGEgcm9vdCBob3RwbHVnIGNvbnRyb2xs ZXIsPGJyPg0Kd2UgZmFpbCB0byBpbml0aWFsemllIHRoZSByb290IGhvdHBsdWcgY29udHJvbGxl ciwgd2UgY2FwdHVyZSB0aGUgU3RhdHVzPGJyPg0KdGhlcmUsIGFuZCB0aGVuIGhhcHBpbHkgZ28g b24gdG8gJnF1b3Q7cHJlLXByb2Nlc3MmcXVvdDsgdGhlIGNvbnRyb2xsZXIuPGJyPg0KPGJyPg0K V2hhdCB0aGUgaGVjayBpcyB0aGlzLiBJZiB0aGUgcm9vdCBIUEMgaW5pdCBpcyBub3QgYSBwcmUt cmVxdWlzaXRlIGZvcjxicj4NCnByZXByb2Nlc3NpbmcsIHRoZW4gd2h5IGNhcHR1cmUgdGhlIHN0 YXR1cz8/Pzxicj4NCjxicj4NCldlbGwsIEkgZ3Vlc3MgeW91ciBhcHByb2FjaCBpcyB0aGUgc2Fm ZXN0LiBMb2cgaXQsIGJ1dCBvdGhlcndpc2UsPGJyPg0KcHJlc2VydmUgdGhlIGN1cnJlbnQgYmVo YXZpb3IuIEplc3VzLjxicj4NCjxicj4NCiZndDsgQEAgLTE1MDEsNiArMTUwNSwxMCBAQCBQY2lS b290QnJpZGdlUDJDUHJvY2VzcyAoPGJyPg0KJmd0O8KgIDxicj4NCiZndDvCoCDCoCDCoCBpZiAo IUlzTGlzdEVtcHR5ICgmYW1wO1RlbXAtJmd0O0NoaWxkTGlzdCkpIHs8YnI+DQomZ3Q7wqAgwqAg wqAgwqAgU3RhdHVzID0gUGNpUm9vdEJyaWRnZVAyQ1Byb2Nlc3MgKFRlbXApOzxicj4NCiZndDsg Kzxicj4NCiZndDsgK8KgIMKgIMKgIGlmIChFRklfRVJST1IgKFN0YXR1cykpIHs8YnI+DQomZ3Q7 ICvCoCDCoCDCoCDCoCBERUJVRyAoKERFQlVHX1dBUk4sICZxdW90O0ZhaWxlZCB0byBwcm9jZXNz IE9wdGlvbiBSb20gb24gUENJIHJvb3QgYnJpZGdlICVwLCBTdGF0dXMgJXJcbiZxdW90OywgVGVt cCwgU3RhdHVzKSk7PGJyPg0KJmd0OyArwqAgwqAgwqAgfTxicj4NCiZndDvCoCDCoCDCoCB9PGJy Pg0KJmd0O8KgIDxicj4NCiZndDvCoCDCoCDCoCBDdXJyZW50TGluayA9IEN1cnJlbnRMaW5rLSZn dDtGb3J3YXJkTGluazs8YnI+DQo8YnI+DQpZZWFoLCBJIGd1ZXNzIHNvLjxicj4NCjxicj4NCk9u IGEgdGFuZ2VudCwgYmVzdCBjYXN0IFRlbXAgdG8gKFZPSUQqKVRlbXAsIGZvciBsb2dnaW5nIHdp dGggJXAuPGJyPg0KPGJyPg0KSSBkaWRuJiMzOTt0IGV4cGVjdCB0aGF0IHRoZSBvcmlnaW5hbCBj b2RlIHdhcyB0aGlzIHRlcnJpYmxlLjxicj4NCjxicj4NCkxhc3psbzxicj4NCjxicj4NCjwvYmxv Y2txdW90ZT48L2Rpdj4NCg0KCjxkaXYgd2lkdGg9IjEiIHN0eWxlPSJjb2xvcjp3aGl0ZTtjbGVh cjpib3RoIj5fLl8sXy5fLF88L2Rpdj4KPGhyPgoKCkdyb3Vwcy5pbyBMaW5rczo8cD4KCgogIAog ICAgWW91IHJlY2VpdmUgYWxsIG1lc3NhZ2VzIHNlbnQgdG8gdGhpcyBncm91cC4KICAKICAKCgo8 cD4KPGEgdGFyZ2V0PSJfYmxhbmsiIGhyZWY9Imh0dHBzOi8vZWRrMi5ncm91cHMuaW8vZy9kZXZl bC9tZXNzYWdlLzExMTAxOSI+Vmlldy9SZXBseSBPbmxpbmUgKCMxMTEwMTkpPC9hPiB8CgoKICAK CnwKCiAgPGEgdGFyZ2V0PSJfYmxhbmsiIGhyZWY9Imh0dHBzOi8vZ3JvdXBzLmlvL210LzEwMjQz ODMyMS83Njg2MTc2Ij5NdXRlIFRoaXMgVG9waWM8L2E+CgoKfCA8YSBocmVmPSJodHRwczovL2Vk azIuZ3JvdXBzLmlvL2cvZGV2ZWwvcG9zdCI+TmV3IFRvcGljPC9hPgoKPGJyPgoKCgoKPGEgaHJl Zj0iaHR0cHM6Ly9lZGsyLmdyb3Vwcy5pby9nL2RldmVsL2VkaXRzdWIvNzY4NjE3NiI+WW91ciBT dWJzY3JpcHRpb248L2E+IHwKPGEgaHJlZj0ibWFpbHRvOmRldmVsK293bmVyQGVkazIuZ3JvdXBz LmlvIj5Db250YWN0IEdyb3VwIE93bmVyPC9hPiB8Cgo8YSBocmVmPSJodHRwczovL2VkazIuZ3Jv dXBzLmlvL2cvZGV2ZWwvdW5zdWIiPlVuc3Vic2NyaWJlPC9hPgoKIFtyZWJlY2NhQG9wZW5mdy5p b108YnI+CjxkaXYgd2lkdGg9IjEiIHN0eWxlPSJjb2xvcjp3aGl0ZTtjbGVhcjpib3RoIj5fLl8s Xy5fLF88L2Rpdj4KDQo= --000000000000e3db240609c677eb--