From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mail-lj1-f172.google.com (mail-lj1-f172.google.com [209.85.208.172]) by mx.groups.io with SMTP id smtpd.web08.8084.1662002789640298510 for ; Wed, 31 Aug 2022 20:26:30 -0700 Authentication-Results: mx.groups.io; dkim=pass header.i=@csie-io.20210112.gappssmtp.com header.s=20210112 header.b=ybqhFQ98; spf=pass (domain: csie.io, ip: 209.85.208.172, mailfrom: nickle@csie.io) Received: by mail-lj1-f172.google.com with SMTP id k22so16530556ljg.2 for ; Wed, 31 Aug 2022 20:26:29 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=csie-io.20210112.gappssmtp.com; s=20210112; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:from:to:cc; bh=W0XdHSv1jcvGfUFHfo5dnE2NJzAqBvDCTIXGKw/UNqk=; b=ybqhFQ98TrRmujq1gQIO04yko1s74NG6NZC1xiLd3zmE7NHgWjf5WlBzmB8eD0yEaL +qTt8azqOrqDwUGZ17wi5vw4QuUnS2IGi7QOAwyCyRhII40u2H/nhdvLESJcgchgzGDo QFQdJatO0tH7QM+O77a9gWkxTLVPuA8qRL+VTdko2Kx8ql3ma0lbZ64GukWJrdvMM6W7 Yzn3jGqw2g7GYl+0eLRhRiYTtsrAVitpEuovsuJT2ffZEguKHed01mFRM+5KxHIjPcQE pngCrrRn3hl8eX4YkpH4N+WkltOWQjymFobad9d0lzCCvPadEFEwEfgsDZj3FQBjr8aO bf+w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:x-gm-message-state:from:to:cc; bh=W0XdHSv1jcvGfUFHfo5dnE2NJzAqBvDCTIXGKw/UNqk=; b=ysTu8W+oW/XTWKSA6IZ34pcLwAvQj+ABSHG+YsSiv8l/T6vP+l27mb0JpA6dFkYih0 xJzzk8Pxtq5Wm4RxgcS0pzDVDiiS5LX0AU+n+mPflZvFYm8mPg0RgKG5m3KEKHylMKPt qg8ZNJY0QzBMNsr9HN1/hrOtmi0CHq8aZcrkcJybpJrBZW0pC8PKVaWzE51QuoA3WIw3 dn+WBpFWqPe6mRl3cZMf5aP/+BYRQk2tLX+q7moyqp6AR9Krii6rvzvjOIBG79l5yAKl YnMX8UsGsWu4pQQkmpocE/A02JTZkI5lQ7iB31cKp96vS/kVm1ArXs1K08GdBuYz93pZ 7a3A== X-Gm-Message-State: ACgBeo3udD8F+1kR06m0vbFJwf4PDYkR64YnFa3wDJLsZ5AFpoBh3+LW wNfRw9aYQToBibdq8T5YR6pmO/UhzVl+sUQV1oqRLg== X-Google-Smtp-Source: AA6agR71dIzgpF8hVzKB1hZvnNQaYDl1j2ftLDvgmx7K3PXH1Rp/tS7o8KPVWYocBTcOfwu6+KB6lJ0LfHBYcZLMoFg= X-Received: by 2002:a2e:b808:0:b0:266:52d9:ac6a with SMTP id u8-20020a2eb808000000b0026652d9ac6amr3911616ljo.14.1662002787895; Wed, 31 Aug 2022 20:26:27 -0700 (PDT) MIME-Version: 1.0 References: <20220830042226.1253-1-abner.chang@amd.com> In-Reply-To: <20220830042226.1253-1-abner.chang@amd.com> From: NickleLa Date: Thu, 1 Sep 2022 11:26:16 +0800 Message-ID: Subject: Re: [PATCH] RedfishPkg/RedfishDiscoverDxe: Install EFI_DISCOVER_PROTOCOL on each network interface To: abner.chang@amd.com Cc: devel@edk2.groups.io, Igor Kulchytskyy Content-Type: multipart/alternative; boundary="000000000000c9eb7205e7952dd5" --000000000000c9eb7205e7952dd5 Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable Hi Abner, I see that the comment is in the middle of function parameters. I suggest that we can move the comment to the position before function call. + Status =3D CloseProtocolService ( + // Close protocol and destroy service. + ThisBindingProtocol, + ControllerHandle, + &gRequiredProtocol[Index], Thanks, Nickle =E6=96=BC 2022=E5=B9=B48=E6=9C=8830=E6=97=A5 =E9=80= =B1=E4=BA=8C =E4=B8=AD=E5=8D=8812:22=E5=AF=AB=E9=81=93=EF=BC=9A > From: Abner Chang > > BZ 4037: > Install EFI_DISCOVER_PROTOCOL on each network interface. > > This fixes the issue that causes the high-level Redfish driver > on the network interface is stopped when: > 1. EFI_DISCOVER_PROTOCOL is reinstalled on a new-found network > interface, or > 2. EFI_DISCOVER_PROTOCOL is stopped on the network interface > other than the one which is used to communicate with Redfish > service. > > Cc: Nickle Wang > Cc: Igor Kulchytskyy > Signed-off-by: Abner Chang > --- > .../RedfishDiscoverInternal.h | 7 + > .../RedfishDiscoverDxe/RedfishDiscoverDxe.c | 138 ++++++++++-------- > 2 files changed, 86 insertions(+), 59 deletions(-) > > diff --git a/RedfishPkg/RedfishDiscoverDxe/RedfishDiscoverInternal.h > b/RedfishPkg/RedfishDiscoverDxe/RedfishDiscoverInternal.h > index 4d1319b2641..04fa09e1cc2 100644 > --- a/RedfishPkg/RedfishDiscoverDxe/RedfishDiscoverInternal.h > +++ b/RedfishPkg/RedfishDiscoverDxe/RedfishDiscoverInternal.h > @@ -2,6 +2,7 @@ > This file defines the EFI Redfish Discover Protocol interface. > > (C) Copyright 2021 Hewlett Packard Enterprise Development LP
> + Copyright (c) 2022, AMD Incorporated. All rights reserved. > > SPDX-License-Identifier: BSD-2-Clause-Patent > > @@ -107,6 +108,12 @@ typedef struct { > > ///< NETWORK_INTERFACE_PROTOCOL_TYPE. > REDFISH_DISCOVER_NETWORK_INTERFACE_PROTOCOL > NetworkInterfaceProtocolInfo; ///< Network interface protocol information= . > EFI_HANDLE RestExHandle; > ///< REST EX handle associated with this network interface. > + // > + // EFI_REDFISH_DISCOVER_PROTOCOL instance installed > + // on this network interface. > + // > + EFI_HANDLE > EfiRedfishDiscoverProtocolHandle; ///< EFI_REDFISH_DISCOVER_PROTOTOCOL > instance installed > + > ///< on this network interface. > } EFI_REDFISH_DISCOVER_NETWORK_INTERFACE_INTERNAL; > > // > diff --git a/RedfishPkg/RedfishDiscoverDxe/RedfishDiscoverDxe.c > b/RedfishPkg/RedfishDiscoverDxe/RedfishDiscoverDxe.c > index bf50c78c928..b5e91cb3469 100644 > --- a/RedfishPkg/RedfishDiscoverDxe/RedfishDiscoverDxe.c > +++ b/RedfishPkg/RedfishDiscoverDxe/RedfishDiscoverDxe.c > @@ -3,6 +3,7 @@ > The implementation of EFI Redfidh Discover Protocol. > > (C) Copyright 2021 Hewlett Packard Enterprise Development LP
> + Copyright (c) 2022, AMD Incorporated. All rights reserved. > > SPDX-License-Identifier: BSD-2-Clause-Patent > > @@ -23,8 +24,6 @@ EFI_GUID mRedfishDiscoverTcp4InstanceGuid =3D > EFI_REDFISH_DISCOVER_TCP4_INSTANC > EFI_GUID mRedfishDiscoverTcp6InstanceGuid =3D > EFI_REDFISH_DISCOVER_TCP6_INSTANCE_GUID; > EFI_GUID mRedfishDiscoverRestExInstanceGuid =3D > EFI_REDFISH_DISCOVER_REST_EX_INSTANCE_GUID; > > -EFI_HANDLE EfiRedfishDiscoverProtocolHandle =3D NULL; > - > EFI_STATUS > EFIAPI > Tcp4GetSubnetInfo ( > @@ -325,6 +324,38 @@ GetTargetNetworkInterfaceInternal ( > return NULL; > } > > +/** > + This function searches EFI_REDFISH_DISCOVER_NETWORK_INTERFACE_INTERNAL > + instance with the given Controller handle. > + > + @param[in] ControllerHandle The controller handle associated with > network interface. > + > + @retval Non-NULL EFI_REDFISH_DISCOVER_NETWORK_INTERFACE_INTERNAL is > returned. > + @retval NULL Non of > EFI_REDFISH_DISCOVER_NETWORK_INTERFACE_INTERNAL instance is returned. > +**/ > +EFI_REDFISH_DISCOVER_NETWORK_INTERFACE_INTERNAL * > +GetTargetNetworkInterfaceInternalByController ( > + IN EFI_HANDLE ControllerHandle > + ) > +{ > + EFI_REDFISH_DISCOVER_NETWORK_INTERFACE_INTERNAL *ThisNetworkInterface= ; > + > + ThisNetworkInterface =3D (EFI_REDFISH_DISCOVER_NETWORK_INTERFACE_INTER= NAL > *)GetFirstNode (&mEfiRedfishDiscoverNetworkInterface); > + while (TRUE) { > + if (ThisNetworkInterface->OpenDriverControllerHandle =3D=3D > ControllerHandle) { > + return ThisNetworkInterface; > + } > + > + if (IsNodeAtEnd (&mEfiRedfishDiscoverNetworkInterface, > &ThisNetworkInterface->Entry)) { > + return NULL; > + } > + > + ThisNetworkInterface =3D > (EFI_REDFISH_DISCOVER_NETWORK_INTERFACE_INTERNAL *)GetNextNode > (&mEfiRedfishDiscoverNetworkInterface, &ThisNetworkInterface->Entry); > + } > + > + return NULL; > +} > + > /** > This function validate if target network interface is ready for > discovering > Redfish service. > @@ -1619,29 +1650,30 @@ BuildupNetworkInterface ( > EFI_OPEN_PROTOCOL_BY_DRIVER > ); > if (!EFI_ERROR (Status)) { > - if ((EfiRedfishDiscoverProtocolHandle =3D=3D NULL) && > - (gRequiredProtocol[Index].ProtocolType =3D=3D ProtocolTypeRe= stEx) > && > - !IsListEmpty (&mEfiRedfishDiscoverNetworkInterface) > - ) > - { > - // Install the fisrt Redfish Discover Protocol when EFI REST E= X > protcol is discovered. > - // This ensures EFI REST EX is ready while > EFI_REDFISH_DISCOVER_PROTOCOL consumer acquires > - // Redfish serivce over network interface. > - > - Status =3D gBS->InstallProtocolInterface ( > - &EfiRedfishDiscoverProtocolHandle, > - &gEfiRedfishDiscoverProtocolGuid, > - EFI_NATIVE_INTERFACE, > - (VOID *)&mRedfishDiscover > - ); > - } else if ((EfiRedfishDiscoverProtocolHandle !=3D NULL) && > NewNetworkInterfaceInstalled) { > - Status =3D gBS->ReinstallProtocolInterface ( > - EfiRedfishDiscoverProtocolHandle, > - &gEfiRedfishDiscoverProtocolGuid, > - (VOID *)&mRedfishDiscover, > - (VOID *)&mRedfishDiscover > - ); > - NewNetworkInterfaceInstalled =3D FALSE; > + if ((gRequiredProtocol[Index].ProtocolType =3D=3D > ProtocolTypeRestEx)) { > + // Install Redfish Discover Protocol when EFI REST EX protcol > is discovered. > + // This ensures EFI REST EX is ready while the consumer of > EFI_REDFISH_DISCOVER_PROTOCOL > + // acquires Redfish serivce over network interface. > + > + if (!NewNetworkInterfaceInstalled) { > + NetworkInterface =3D > GetTargetNetworkInterfaceInternalByController (ControllerHandle); > + if (NetworkInterface =3D=3D NULL) { > + DEBUG ((DEBUG_ERROR, "%a: Can't find network interface by > ControllerHandle\n", __FUNCTION__)); > + return Status; > + } > + } > + > + NewNetworkInterfaceInstalled =3D FALSE; > + NetworkInterface->EfiRedfishDiscoverProtocolHandle =3D NULL; > + Status =3D > gBS->InstallProtocolInterface ( > + > &NetworkInterface->EfiRedfishDiscoverProtocolHandle, > + > &gEfiRedfishDiscoverProtocolGuid, > + > EFI_NATIVE_INTERFACE, > + > (VOID *)&mRedfishDiscover > + ); > + if (EFI_ERROR (Status)) { > + DEBUG ((DEBUG_ERROR, "%a: Fail to install > EFI_REDFISH_DISCOVER_PROTOCOL\n", __FUNCTION__)); > + } > } > } > > @@ -1724,6 +1756,7 @@ StopServiceOnNetworkInterface ( > EFI_STATUS Status; > VOID *Interface; > EFI_TPL OldTpl; > + EFI_HANDLE DiscoverProtocolHandl= e; > EFI_REDFISH_DISCOVER_NETWORK_INTERFACE_INTERNAL *ThisNetworkInterface= ; > EFI_REDFISH_DISCOVER_REST_EX_INSTANCE_INTERNAL *RestExInstance; > > @@ -1743,30 +1776,32 @@ StopServiceOnNetworkInterface ( > ThisNetworkInterface =3D > (EFI_REDFISH_DISCOVER_NETWORK_INTERFACE_INTERNAL *)GetFirstNode > (&mEfiRedfishDiscoverNetworkInterface); > while (TRUE) { > if > (ThisNetworkInterface->NetworkInterfaceProtocolInfo.ProtocolControllerHan= dle > =3D=3D ControllerHandle) { > - Status =3D CloseProtocolService ( > - // Close protocol and destroy service. > - ThisBindingProtocol, > - ControllerHandle, > - &gRequiredProtocol[Index], > - ThisNetworkInterface->OpenDriverAgentHandle, > - ThisNetworkInterface->OpenDriverControllerHandle > - ); > + DiscoverProtocolHandle =3D > ThisNetworkInterface->EfiRedfishDiscoverProtocolHandle; > + Status =3D CloseProtocolService ( > + // Close protocol and destroy > service. > + ThisBindingProtocol, > + ControllerHandle, > + &gRequiredProtocol[Index], > + > ThisNetworkInterface->OpenDriverAgentHandle, > + > ThisNetworkInterface->OpenDriverControllerHandle > + ); > if (!EFI_ERROR (Status)) { > Status =3D DestroyRedfishNetwrokInterface > (ThisNetworkInterface); > } > > gBS->RestoreTPL (OldTpl); > - // Reinstall Redfish Discover protocol to notify network > - // interface change. > - > - Status =3D gBS->ReinstallProtocolInterface ( > - EfiRedfishDiscoverProtocolHandle, > - &gEfiRedfishDiscoverProtocolGuid, > - (VOID *)&mRedfishDiscover, > - (VOID *)&mRedfishDiscover > - ); > - if (EFI_ERROR (Status)) { > - DEBUG ((DEBUG_ERROR, "%a: Reinstall > gEfiRedfishDiscoverProtocolGuid fail.", __FUNCTION__)); > + > + // > + // Disconnect EFI Redfish discover driver controller to > notify the > + // clinet which uses .EFI Redfish discover protocol. > + // > + if (DiscoverProtocolHandle !=3D NULL) { > + gBS->DisconnectController (DiscoverProtocolHandle, NULL, > NULL); > + Status =3D gBS->UninstallProtocolInterface ( > + DiscoverProtocolHandle, > + &gEfiRedfishDiscoverProtocolGuid, > + (VOID *)&mRedfishDiscover > + ); > } > > return Status; > @@ -2032,20 +2067,5 @@ RedfishDiscoverUnload ( > StopServiceOnNetworkInterface (&gRedfishDiscoverDriverBinding, > ThisNetworkInterface->NetworkInterfaceProtocolInfo.ProtocolControllerHand= le); > } > > - // Disconnect EFI Redfish discover driver controller to notify the > - // clinet which uses .EFI Redfish discover protocol. > - > - if (EfiRedfishDiscoverProtocolHandle !=3D NULL) { > - // > - // Notify user EFI_REDFISH_DISCOVER_PROTOCOL is unloaded. > - // > - gBS->DisconnectController (EfiRedfishDiscoverProtocolHandle, NULL, > NULL); > - Status =3D gBS->UninstallProtocolInterface ( > - EfiRedfishDiscoverProtocolHandle, > - &gEfiRedfishDiscoverProtocolGuid, > - (VOID *)&mRedfishDiscover > - ); > - } > - > return Status; > } > -- > 2.37.1.windows.1 > > --000000000000c9eb7205e7952dd5 Content-Type: text/html; charset="UTF-8" Content-Transfer-Encoding: base64 PGRpdiBkaXI9Imx0ciI+PGRpdiBkaXI9Imx0ciI+PGRpdiBkaXI9Imx0ciI+SGkgQWJuZXIswqA8 L2Rpdj48ZGl2IGRpcj0ibHRyIj48YnI+PC9kaXY+PGRpdj5JIHNlZSB0aGF0IHRoZSBjb21tZW50 IGlzIGluIHRoZSBtaWRkbGUgb2YgZnVuY3Rpb24gcGFyYW1ldGVycy4gSSBzdWdnZXN0IHRoYXQg d2UgY2FuIG1vdmUgdGhlIGNvbW1lbnQgdG8gdGhlIHBvc2l0aW9uIGJlZm9yZSBmdW5jdGlvbiBj YWxsLjwvZGl2PjxkaXY+PGJyPjwvZGl2PjxkaXY+K8KgIMKgIMKgIMKgIMKgIMKgIFN0YXR1c8Kg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgPSBDbG9zZVByb3RvY29sU2VydmljZSAoPGJyPivCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoC8v IENsb3NlIHByb3RvY29sIGFuZCBkZXN0cm95IHNlcnZpY2UuPGJyPivCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoFRoaXNCaW5kaW5nUHJv dG9jb2wsPGJyPivCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoENvbnRyb2xsZXJIYW5kbGUsPGJyPivCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCZhbXA7Z1JlcXVpcmVkUHJvdG9j b2xbSW5kZXhdLDxicj48L2Rpdj48ZGl2Pjxicj48L2Rpdj48ZGl2PlRoYW5rcyw8L2Rpdj48ZGl2 Pk5pY2tsZTwvZGl2Pjxicj48ZGl2IGNsYXNzPSJnbWFpbF9xdW90ZSI+PGRpdiBkaXI9Imx0ciIg Y2xhc3M9ImdtYWlsX2F0dHIiPiZsdDs8YSBocmVmPSJtYWlsdG86YWJuZXIuY2hhbmdAYW1kLmNv bSI+YWJuZXIuY2hhbmdAYW1kLmNvbTwvYT4mZ3Q7IOaWvCAyMDIy5bm0OOaciDMw5pelIOmAseS6 jCDkuK3ljYgxMjoyMuWvq+mBk++8mjxicj48L2Rpdj48YmxvY2txdW90ZSBjbGFzcz0iZ21haWxf cXVvdGUiIHN0eWxlPSJtYXJnaW46MHB4IDBweCAwcHggMC44ZXg7Ym9yZGVyLWxlZnQ6MXB4IHNv bGlkIHJnYigyMDQsMjA0LDIwNCk7cGFkZGluZy1sZWZ0OjFleCI+RnJvbTogQWJuZXIgQ2hhbmcg Jmx0OzxhIGhyZWY9Im1haWx0bzphYm5lci5jaGFuZ0BhbWQuY29tIiB0YXJnZXQ9Il9ibGFuayI+ YWJuZXIuY2hhbmdAYW1kLmNvbTwvYT4mZ3Q7PGJyPg0KPGJyPg0KQlogNDAzNzo8YnI+DQpJbnN0 YWxsIEVGSV9ESVNDT1ZFUl9QUk9UT0NPTCBvbiBlYWNoIG5ldHdvcmsgaW50ZXJmYWNlLjxicj4N Cjxicj4NClRoaXMgZml4ZXMgdGhlIGlzc3VlIHRoYXQgY2F1c2VzIHRoZSBoaWdoLWxldmVsIFJl ZGZpc2ggZHJpdmVyPGJyPg0Kb24gdGhlIG5ldHdvcmsgaW50ZXJmYWNlIGlzIHN0b3BwZWQgd2hl bjo8YnI+DQoxLiBFRklfRElTQ09WRVJfUFJPVE9DT0wgaXMgcmVpbnN0YWxsZWQgb24gYSBuZXct Zm91bmQgbmV0d29yazxicj4NCsKgIMKgaW50ZXJmYWNlLCBvcjxicj4NCjIuIEVGSV9ESVNDT1ZF Ul9QUk9UT0NPTCBpcyBzdG9wcGVkIG9uIHRoZSBuZXR3b3JrIGludGVyZmFjZTxicj4NCsKgIMKg b3RoZXIgdGhhbiB0aGUgb25lIHdoaWNoIGlzIHVzZWQgdG8gY29tbXVuaWNhdGUgd2l0aCBSZWRm aXNoPGJyPg0KwqAgwqBzZXJ2aWNlLjxicj4NCjxicj4NCkNjOiBOaWNrbGUgV2FuZyAmbHQ7PGEg aHJlZj0ibWFpbHRvOm5pY2tsZUBjc2llLmlvIiB0YXJnZXQ9Il9ibGFuayI+bmlja2xlQGNzaWUu aW88L2E+Jmd0Ozxicj4NCkNjOiBJZ29yIEt1bGNoeXRza3l5ICZsdDs8YSBocmVmPSJtYWlsdG86 aWdvcmtAYW1pLmNvbSIgdGFyZ2V0PSJfYmxhbmsiPmlnb3JrQGFtaS5jb208L2E+Jmd0Ozxicj4N ClNpZ25lZC1vZmYtYnk6IEFibmVyIENoYW5nICZsdDs8YSBocmVmPSJtYWlsdG86YWJuZXIuY2hh bmdAYW1kLmNvbSIgdGFyZ2V0PSJfYmxhbmsiPmFibmVyLmNoYW5nQGFtZC5jb208L2E+Jmd0Ozxi cj4NCi0tLTxicj4NCsKgLi4uL1JlZGZpc2hEaXNjb3ZlckludGVybmFsLmjCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoHzCoCDCoDcgKzxicj4NCsKgLi4uL1JlZGZpc2hEaXNjb3ZlckR4ZS9SZWRm aXNoRGlzY292ZXJEeGUuY8KgIMKgfCAxMzggKysrKysrKysrKy0tLS0tLS0tPGJyPg0KwqAyIGZp bGVzIGNoYW5nZWQsIDg2IGluc2VydGlvbnMoKyksIDU5IGRlbGV0aW9ucygtKTxicj4NCjxicj4N CmRpZmYgLS1naXQgYS9SZWRmaXNoUGtnL1JlZGZpc2hEaXNjb3ZlckR4ZS9SZWRmaXNoRGlzY292 ZXJJbnRlcm5hbC5oIGIvUmVkZmlzaFBrZy9SZWRmaXNoRGlzY292ZXJEeGUvUmVkZmlzaERpc2Nv dmVySW50ZXJuYWwuaDxicj4NCmluZGV4IDRkMTMxOWIyNjQxLi4wNGZhMDllMWNjMiAxMDA2NDQ8 YnI+DQotLS0gYS9SZWRmaXNoUGtnL1JlZGZpc2hEaXNjb3ZlckR4ZS9SZWRmaXNoRGlzY292ZXJJ bnRlcm5hbC5oPGJyPg0KKysrIGIvUmVkZmlzaFBrZy9SZWRmaXNoRGlzY292ZXJEeGUvUmVkZmlz aERpc2NvdmVySW50ZXJuYWwuaDxicj4NCkBAIC0yLDYgKzIsNyBAQDxicj4NCsKgIMKgVGhpcyBm aWxlIGRlZmluZXMgdGhlIEVGSSBSZWRmaXNoIERpc2NvdmVyIFByb3RvY29sIGludGVyZmFjZS48 YnI+DQo8YnI+DQrCoCDCoChDKSBDb3B5cmlnaHQgMjAyMSBIZXdsZXR0IFBhY2thcmQgRW50ZXJw cmlzZSBEZXZlbG9wbWVudCBMUCZsdDtCUiZndDs8YnI+DQorwqAgQ29weXJpZ2h0IChjKSAyMDIy LCBBTUQgSW5jb3Jwb3JhdGVkLiBBbGwgcmlnaHRzIHJlc2VydmVkLjxicj4NCjxicj4NCsKgIMKg U1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEJTRC0yLUNsYXVzZS1QYXRlbnQ8YnI+DQo8YnI+DQpA QCAtMTA3LDYgKzEwOCwxMiBAQCB0eXBlZGVmIHN0cnVjdCB7PGJyPg0KwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgLy8vJmx0OyBO RVRXT1JLX0lOVEVSRkFDRV9QUk9UT0NPTF9UWVBFLjxicj4NCsKgIMKgUkVERklTSF9ESVNDT1ZF Ul9ORVRXT1JLX0lOVEVSRkFDRV9QUk9UT0NPTMKgIMKgIE5ldHdvcmtJbnRlcmZhY2VQcm90b2Nv bEluZm87IC8vLyZsdDsgTmV0d29yayBpbnRlcmZhY2UgcHJvdG9jb2wgaW5mb3JtYXRpb24uPGJy Pg0KwqAgwqBFRklfSEFORExFwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqBSZXN0RXhIYW5kbGU7wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAv Ly8mbHQ7IFJFU1QgRVggaGFuZGxlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIG5ldHdvcmsgaW50ZXJm YWNlLjxicj4NCivCoCAvLzxicj4NCivCoCAvLyBFRklfUkVERklTSF9ESVNDT1ZFUl9QUk9UT0NP TCBpbnN0YW5jZSBpbnN0YWxsZWQ8YnI+DQorwqAgLy8gb24gdGhpcyBuZXR3b3JrIGludGVyZmFj ZS48YnI+DQorwqAgLy88YnI+DQorwqAgRUZJX0hBTkRMRcKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgRWZpUmVkZmlzaERpc2NvdmVyUHJvdG9j b2xIYW5kbGU7IC8vLyZsdDsgRUZJX1JFREZJU0hfRElTQ09WRVJfUFJPVE9UT0NPTCBpbnN0YW5j ZSBpbnN0YWxsZWQ8YnI+DQorwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAvLy8mbHQ7IG9uIHRoaXMgbmV0d29yayBpbnRl cmZhY2UuPGJyPg0KwqB9IEVGSV9SRURGSVNIX0RJU0NPVkVSX05FVFdPUktfSU5URVJGQUNFX0lO VEVSTkFMOzxicj4NCjxicj4NCsKgLy88YnI+DQpkaWZmIC0tZ2l0IGEvUmVkZmlzaFBrZy9SZWRm aXNoRGlzY292ZXJEeGUvUmVkZmlzaERpc2NvdmVyRHhlLmMgYi9SZWRmaXNoUGtnL1JlZGZpc2hE aXNjb3ZlckR4ZS9SZWRmaXNoRGlzY292ZXJEeGUuYzxicj4NCmluZGV4IGJmNTBjNzhjOTI4Li5i NWU5MWNiMzQ2OSAxMDA2NDQ8YnI+DQotLS0gYS9SZWRmaXNoUGtnL1JlZGZpc2hEaXNjb3ZlckR4 ZS9SZWRmaXNoRGlzY292ZXJEeGUuYzxicj4NCisrKyBiL1JlZGZpc2hQa2cvUmVkZmlzaERpc2Nv dmVyRHhlL1JlZGZpc2hEaXNjb3ZlckR4ZS5jPGJyPg0KQEAgLTMsNiArMyw3IEBAPGJyPg0KwqAg wqBUaGUgaW1wbGVtZW50YXRpb24gb2YgRUZJIFJlZGZpZGggRGlzY292ZXIgUHJvdG9jb2wuPGJy Pg0KPGJyPg0KwqAgwqAoQykgQ29weXJpZ2h0IDIwMjEgSGV3bGV0dCBQYWNrYXJkIEVudGVycHJp c2UgRGV2ZWxvcG1lbnQgTFAmbHQ7QlImZ3Q7PGJyPg0KK8KgIENvcHlyaWdodCAoYykgMjAyMiwg QU1EIEluY29ycG9yYXRlZC4gQWxsIHJpZ2h0cyByZXNlcnZlZC48YnI+DQo8YnI+DQrCoCDCoFNQ RFgtTGljZW5zZS1JZGVudGlmaWVyOiBCU0QtMi1DbGF1c2UtUGF0ZW50PGJyPg0KPGJyPg0KQEAg LTIzLDggKzI0LDYgQEAgRUZJX0dVSUTCoCBtUmVkZmlzaERpc2NvdmVyVGNwNEluc3RhbmNlR3Vp ZMKgIMKgPSBFRklfUkVERklTSF9ESVNDT1ZFUl9UQ1A0X0lOU1RBTkM8YnI+DQrCoEVGSV9HVUlE wqAgbVJlZGZpc2hEaXNjb3ZlclRjcDZJbnN0YW5jZUd1aWTCoCDCoD0gRUZJX1JFREZJU0hfRElT Q09WRVJfVENQNl9JTlNUQU5DRV9HVUlEOzxicj4NCsKgRUZJX0dVSUTCoCBtUmVkZmlzaERpc2Nv dmVyUmVzdEV4SW5zdGFuY2VHdWlkID0gRUZJX1JFREZJU0hfRElTQ09WRVJfUkVTVF9FWF9JTlNU QU5DRV9HVUlEOzxicj4NCjxicj4NCi1FRklfSEFORExFwqAgRWZpUmVkZmlzaERpc2NvdmVyUHJv dG9jb2xIYW5kbGUgPSBOVUxMOzxicj4NCi08YnI+DQrCoEVGSV9TVEFUVVM8YnI+DQrCoEVGSUFQ STxicj4NCsKgVGNwNEdldFN1Ym5ldEluZm8gKDxicj4NCkBAIC0zMjUsNiArMzI0LDM4IEBAIEdl dFRhcmdldE5ldHdvcmtJbnRlcmZhY2VJbnRlcm5hbCAoPGJyPg0KwqAgwqByZXR1cm4gTlVMTDs8 YnI+DQrCoH08YnI+DQo8YnI+DQorLyoqPGJyPg0KK8KgIFRoaXMgZnVuY3Rpb24gc2VhcmNoZXMg RUZJX1JFREZJU0hfRElTQ09WRVJfTkVUV09SS19JTlRFUkZBQ0VfSU5URVJOQUw8YnI+DQorwqAg aW5zdGFuY2Ugd2l0aCB0aGUgZ2l2ZW7CoCBDb250cm9sbGVyIGhhbmRsZS48YnI+DQorPGJyPg0K K8KgIEBwYXJhbVtpbl0gQ29udHJvbGxlckhhbmRsZcKgIFRoZSBjb250cm9sbGVyIGhhbmRsZSBh c3NvY2lhdGVkIHdpdGggbmV0d29yayBpbnRlcmZhY2UuPGJyPg0KKzxicj4NCivCoCBAcmV0dmFs IE5vbi1OVUxMwqAgRUZJX1JFREZJU0hfRElTQ09WRVJfTkVUV09SS19JTlRFUkZBQ0VfSU5URVJO QUwgaXMgcmV0dXJuZWQuPGJyPg0KK8KgIEByZXR2YWwgTlVMTMKgIMKgIMKgIE5vbiBvZiBFRklf UkVERklTSF9ESVNDT1ZFUl9ORVRXT1JLX0lOVEVSRkFDRV9JTlRFUk5BTCBpbnN0YW5jZSBpcyBy ZXR1cm5lZC48YnI+DQorKiovPGJyPg0KK0VGSV9SRURGSVNIX0RJU0NPVkVSX05FVFdPUktfSU5U RVJGQUNFX0lOVEVSTkFMICo8YnI+DQorR2V0VGFyZ2V0TmV0d29ya0ludGVyZmFjZUludGVybmFs QnlDb250cm9sbGVyICg8YnI+DQorwqAgSU4gRUZJX0hBTkRMRcKgIENvbnRyb2xsZXJIYW5kbGU8 YnI+DQorwqAgKTxicj4NCit7PGJyPg0KK8KgIEVGSV9SRURGSVNIX0RJU0NPVkVSX05FVFdPUktf SU5URVJGQUNFX0lOVEVSTkFMwqAgKlRoaXNOZXR3b3JrSW50ZXJmYWNlOzxicj4NCis8YnI+DQor wqAgVGhpc05ldHdvcmtJbnRlcmZhY2UgPSAoRUZJX1JFREZJU0hfRElTQ09WRVJfTkVUV09SS19J TlRFUkZBQ0VfSU5URVJOQUwgKilHZXRGaXJzdE5vZGUgKCZhbXA7bUVmaVJlZGZpc2hEaXNjb3Zl ck5ldHdvcmtJbnRlcmZhY2UpOzxicj4NCivCoCB3aGlsZSAoVFJVRSkgezxicj4NCivCoCDCoCBp ZiAoVGhpc05ldHdvcmtJbnRlcmZhY2UtJmd0O09wZW5Ecml2ZXJDb250cm9sbGVySGFuZGxlID09 IENvbnRyb2xsZXJIYW5kbGUpIHs8YnI+DQorwqAgwqAgwqAgcmV0dXJuIFRoaXNOZXR3b3JrSW50 ZXJmYWNlOzxicj4NCivCoCDCoCB9PGJyPg0KKzxicj4NCivCoCDCoCBpZiAoSXNOb2RlQXRFbmQg KCZhbXA7bUVmaVJlZGZpc2hEaXNjb3Zlck5ldHdvcmtJbnRlcmZhY2UsICZhbXA7VGhpc05ldHdv cmtJbnRlcmZhY2UtJmd0O0VudHJ5KSkgezxicj4NCivCoCDCoCDCoCByZXR1cm4gTlVMTDs8YnI+ DQorwqAgwqAgfTxicj4NCis8YnI+DQorwqAgwqAgVGhpc05ldHdvcmtJbnRlcmZhY2UgPSAoRUZJ X1JFREZJU0hfRElTQ09WRVJfTkVUV09SS19JTlRFUkZBQ0VfSU5URVJOQUwgKilHZXROZXh0Tm9k ZSAoJmFtcDttRWZpUmVkZmlzaERpc2NvdmVyTmV0d29ya0ludGVyZmFjZSwgJmFtcDtUaGlzTmV0 d29ya0ludGVyZmFjZS0mZ3Q7RW50cnkpOzxicj4NCivCoCB9PGJyPg0KKzxicj4NCivCoCByZXR1 cm4gTlVMTDs8YnI+DQorfTxicj4NCis8YnI+DQrCoC8qKjxicj4NCsKgIMKgVGhpcyBmdW5jdGlv biB2YWxpZGF0ZSBpZiB0YXJnZXQgbmV0d29yayBpbnRlcmZhY2UgaXMgcmVhZHkgZm9yIGRpc2Nv dmVyaW5nPGJyPg0KwqAgwqBSZWRmaXNoIHNlcnZpY2UuPGJyPg0KQEAgLTE2MTksMjkgKzE2NTAs MzAgQEAgQnVpbGR1cE5ldHdvcmtJbnRlcmZhY2UgKDxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgRUZJX09QRU5fUFJPVE9DT0xfQllfRFJJVkVSPGJyPg0KwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqApOzxicj4NCsKgIMKgIMKgIMKgaWYgKCFFRklfRVJS T1IgKFN0YXR1cykpIHs8YnI+DQotwqAgwqAgwqAgwqAgaWYgKChFZmlSZWRmaXNoRGlzY292ZXJQ cm90b2NvbEhhbmRsZSA9PSBOVUxMKSAmYW1wOyZhbXA7PGJyPg0KLcKgIMKgIMKgIMKgIMKgIMKg IChnUmVxdWlyZWRQcm90b2NvbFtJbmRleF0uUHJvdG9jb2xUeXBlID09IFByb3RvY29sVHlwZVJl c3RFeCkgJmFtcDsmYW1wOzxicj4NCi3CoCDCoCDCoCDCoCDCoCDCoCAhSXNMaXN0RW1wdHkgKCZh bXA7bUVmaVJlZGZpc2hEaXNjb3Zlck5ldHdvcmtJbnRlcmZhY2UpPGJyPg0KLcKgIMKgIMKgIMKg IMKgIMKgICk8YnI+DQotwqAgwqAgwqAgwqAgezxicj4NCi3CoCDCoCDCoCDCoCDCoCAvLyBJbnN0 YWxsIHRoZSBmaXNydCBSZWRmaXNoIERpc2NvdmVyIFByb3RvY29sIHdoZW4gRUZJIFJFU1QgRVgg cHJvdGNvbCBpcyBkaXNjb3ZlcmVkLjxicj4NCi3CoCDCoCDCoCDCoCDCoCAvLyBUaGlzIGVuc3Vy ZXMgRUZJIFJFU1QgRVggaXMgcmVhZHkgd2hpbGUgRUZJX1JFREZJU0hfRElTQ09WRVJfUFJPVE9D T0wgY29uc3VtZXIgYWNxdWlyZXM8YnI+DQotwqAgwqAgwqAgwqAgwqAgLy8gUmVkZmlzaCBzZXJp dmNlIG92ZXIgbmV0d29yayBpbnRlcmZhY2UuPGJyPg0KLTxicj4NCi3CoCDCoCDCoCDCoCDCoCBT dGF0dXMgPSBnQlMtJmd0O0luc3RhbGxQcm90b2NvbEludGVyZmFjZSAoPGJyPg0KLcKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgICZhbXA7RWZpUmVkZmlzaERpc2NvdmVyUHJv dG9jb2xIYW5kbGUsPGJyPg0KLcKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg ICZhbXA7Z0VmaVJlZGZpc2hEaXNjb3ZlclByb3RvY29sR3VpZCw8YnI+DQotwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgRUZJX05BVElWRV9JTlRFUkZBQ0UsPGJyPg0KLcKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIChWT0lEICopJmFtcDttUmVkZmlz aERpc2NvdmVyPGJyPg0KLcKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgICk7 PGJyPg0KLcKgIMKgIMKgIMKgIH0gZWxzZSBpZiAoKEVmaVJlZGZpc2hEaXNjb3ZlclByb3RvY29s SGFuZGxlICE9IE5VTEwpICZhbXA7JmFtcDsgTmV3TmV0d29ya0ludGVyZmFjZUluc3RhbGxlZCkg ezxicj4NCi3CoCDCoCDCoCDCoCDCoCBTdGF0dXMgPSBnQlMtJmd0O1JlaW5zdGFsbFByb3RvY29s SW50ZXJmYWNlICg8YnI+DQotwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg RWZpUmVkZmlzaERpc2NvdmVyUHJvdG9jb2xIYW5kbGUsPGJyPg0KLcKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgICZhbXA7Z0VmaVJlZGZpc2hEaXNjb3ZlclByb3RvY29sR3Vp ZCw8YnI+DQotwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgKFZPSUQgKikm YW1wO21SZWRmaXNoRGlzY292ZXIsPGJyPg0KLcKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIChWT0lEICopJmFtcDttUmVkZmlzaERpc2NvdmVyPGJyPg0KLcKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgICk7PGJyPg0KLcKgIMKgIMKgIMKgIMKgIE5ld05l dHdvcmtJbnRlcmZhY2VJbnN0YWxsZWQgPSBGQUxTRTs8YnI+DQorwqAgwqAgwqAgwqAgaWYgKChn UmVxdWlyZWRQcm90b2NvbFtJbmRleF0uUHJvdG9jb2xUeXBlID09IFByb3RvY29sVHlwZVJlc3RF eCkpIHs8YnI+DQorwqAgwqAgwqAgwqAgwqAgLy8gSW5zdGFsbCBSZWRmaXNoIERpc2NvdmVyIFBy b3RvY29sIHdoZW4gRUZJIFJFU1QgRVggcHJvdGNvbCBpcyBkaXNjb3ZlcmVkLjxicj4NCivCoCDC oCDCoCDCoCDCoCAvLyBUaGlzIGVuc3VyZXMgRUZJIFJFU1QgRVggaXMgcmVhZHkgd2hpbGUgdGhl IGNvbnN1bWVyIG9mIEVGSV9SRURGSVNIX0RJU0NPVkVSX1BST1RPQ09MPGJyPg0KK8KgIMKgIMKg IMKgIMKgIC8vIGFjcXVpcmVzIFJlZGZpc2ggc2VyaXZjZSBvdmVyIG5ldHdvcmsgaW50ZXJmYWNl Ljxicj4NCis8YnI+DQorwqAgwqAgwqAgwqAgwqAgaWYgKCFOZXdOZXR3b3JrSW50ZXJmYWNlSW5z dGFsbGVkKSB7PGJyPg0KK8KgIMKgIMKgIMKgIMKgIMKgIE5ldHdvcmtJbnRlcmZhY2UgPSBHZXRU YXJnZXROZXR3b3JrSW50ZXJmYWNlSW50ZXJuYWxCeUNvbnRyb2xsZXIgKENvbnRyb2xsZXJIYW5k bGUpOzxicj4NCivCoCDCoCDCoCDCoCDCoCDCoCBpZiAoTmV0d29ya0ludGVyZmFjZSA9PSBOVUxM KSB7PGJyPg0KK8KgIMKgIMKgIMKgIMKgIMKgIMKgIERFQlVHICgoREVCVUdfRVJST1IsICZxdW90 OyVhOiBDYW4mIzM5O3QgZmluZCBuZXR3b3JrIGludGVyZmFjZSBieSBDb250cm9sbGVySGFuZGxl XG4mcXVvdDssIF9fRlVOQ1RJT05fXykpOzxicj4NCivCoCDCoCDCoCDCoCDCoCDCoCDCoCByZXR1 cm4gU3RhdHVzOzxicj4NCivCoCDCoCDCoCDCoCDCoCDCoCB9PGJyPg0KK8KgIMKgIMKgIMKgIMKg IH08YnI+DQorPGJyPg0KK8KgIMKgIMKgIMKgIMKgIE5ld05ldHdvcmtJbnRlcmZhY2VJbnN0YWxs ZWTCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoD0gRkFMU0U7PGJyPg0KK8KgIMKg IMKgIMKgIMKgIE5ldHdvcmtJbnRlcmZhY2UtJmd0O0VmaVJlZGZpc2hEaXNjb3ZlclByb3RvY29s SGFuZGxlID0gTlVMTDs8YnI+DQorwqAgwqAgwqAgwqAgwqAgU3RhdHVzwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqA9IGdC Uy0mZ3Q7SW5zdGFsbFByb3RvY29sSW50ZXJmYWNlICg8YnI+DQorwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgJmFtcDtOZXR3b3JrSW50ZXJmYWNlLSZndDtF ZmlSZWRmaXNoRGlzY292ZXJQcm90b2NvbEhhbmRsZSw8YnI+DQorwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgJmFtcDtnRWZpUmVkZmlzaERpc2NvdmVyUHJv dG9jb2xHdWlkLDxicj4NCivCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCBFRklfTkFUSVZFX0lOVEVSRkFDRSw8YnI+DQorwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgKFZPSUQgKikmYW1wO21SZWRmaXNoRGlzY292ZXI8 YnI+DQorwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgKTs8 YnI+DQorwqAgwqAgwqAgwqAgwqAgaWYgKEVGSV9FUlJPUiAoU3RhdHVzKSkgezxicj4NCivCoCDC oCDCoCDCoCDCoCDCoCBERUJVRyAoKERFQlVHX0VSUk9SLCAmcXVvdDslYTogRmFpbCB0byBpbnN0 YWxsIEVGSV9SRURGSVNIX0RJU0NPVkVSX1BST1RPQ09MXG4mcXVvdDssIF9fRlVOQ1RJT05fXykp Ozxicj4NCivCoCDCoCDCoCDCoCDCoCB9PGJyPg0KwqAgwqAgwqAgwqAgwqB9PGJyPg0KwqAgwqAg wqAgwqB9PGJyPg0KPGJyPg0KQEAgLTE3MjQsNiArMTc1Niw3IEBAIFN0b3BTZXJ2aWNlT25OZXR3 b3JrSW50ZXJmYWNlICg8YnI+DQrCoCDCoEVGSV9TVEFUVVPCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoFN0YXR1czs8YnI+DQrCoCDCoFZP SUTCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCpJbnRlcmZhY2U7PGJyPg0KwqAgwqBFRklfVFBMwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgT2xkVHBsOzxi cj4NCivCoCBFRklfSEFORExFwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqBEaXNjb3ZlclByb3RvY29sSGFuZGxlOzxicj4NCsKgIMKgRUZJ X1JFREZJU0hfRElTQ09WRVJfTkVUV09SS19JTlRFUkZBQ0VfSU5URVJOQUzCoCAqVGhpc05ldHdv cmtJbnRlcmZhY2U7PGJyPg0KwqAgwqBFRklfUkVERklTSF9ESVNDT1ZFUl9SRVNUX0VYX0lOU1RB TkNFX0lOVEVSTkFMwqAgwqAqUmVzdEV4SW5zdGFuY2U7PGJyPg0KPGJyPg0KQEAgLTE3NDMsMzAg KzE3NzYsMzIgQEAgU3RvcFNlcnZpY2VPbk5ldHdvcmtJbnRlcmZhY2UgKDxicj4NCsKgIMKgIMKg IMKgIMKgVGhpc05ldHdvcmtJbnRlcmZhY2UgPSAoRUZJX1JFREZJU0hfRElTQ09WRVJfTkVUV09S S19JTlRFUkZBQ0VfSU5URVJOQUwgKilHZXRGaXJzdE5vZGUgKCZhbXA7bUVmaVJlZGZpc2hEaXNj b3Zlck5ldHdvcmtJbnRlcmZhY2UpOzxicj4NCsKgIMKgIMKgIMKgIMKgd2hpbGUgKFRSVUUpIHs8 YnI+DQrCoCDCoCDCoCDCoCDCoCDCoGlmIChUaGlzTmV0d29ya0ludGVyZmFjZS0mZ3Q7TmV0d29y a0ludGVyZmFjZVByb3RvY29sSW5mby5Qcm90b2NvbENvbnRyb2xsZXJIYW5kbGUgPT0gQ29udHJv bGxlckhhbmRsZSkgezxicj4NCi3CoCDCoCDCoCDCoCDCoCDCoCBTdGF0dXMgPSBDbG9zZVByb3Rv Y29sU2VydmljZSAoPGJyPg0KLcKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgLy8g Q2xvc2UgcHJvdG9jb2wgYW5kIGRlc3Ryb3kgc2VydmljZS48YnI+DQotwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqBUaGlzQmluZGluZ1Byb3RvY29sLDxicj4NCi3CoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoENvbnRyb2xsZXJIYW5kbGUsPGJyPg0KLcKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgJmFtcDtnUmVxdWlyZWRQcm90b2NvbFtJbmRleF0s PGJyPg0KLcKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgVGhpc05ldHdvcmtJbnRl cmZhY2UtJmd0O09wZW5Ecml2ZXJBZ2VudEhhbmRsZSw8YnI+DQotwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqBUaGlzTmV0d29ya0ludGVyZmFjZS0mZ3Q7T3BlbkRyaXZlckNvbnRy b2xsZXJIYW5kbGU8YnI+DQotwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqApOzxi cj4NCivCoCDCoCDCoCDCoCDCoCDCoCBEaXNjb3ZlclByb3RvY29sSGFuZGxlID0gVGhpc05ldHdv cmtJbnRlcmZhY2UtJmd0O0VmaVJlZGZpc2hEaXNjb3ZlclByb3RvY29sSGFuZGxlOzxicj4NCivC oCDCoCDCoCDCoCDCoCDCoCBTdGF0dXPCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoD0gQ2xvc2VQ cm90b2NvbFNlcnZpY2UgKDxicj4NCivCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoC8vIENsb3NlIHByb3RvY29sIGFuZCBkZXN0cm95IHNl cnZpY2UuPGJyPg0KK8KgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgVGhpc0JpbmRpbmdQcm90b2NvbCw8YnI+DQorwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBDb250cm9sbGVySGFu ZGxlLDxicj4NCivCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCZhbXA7Z1JlcXVpcmVkUHJvdG9jb2xbSW5kZXhdLDxicj4NCivCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoFRoaXNO ZXR3b3JrSW50ZXJmYWNlLSZndDtPcGVuRHJpdmVyQWdlbnRIYW5kbGUsPGJyPg0KK8KgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgVGhpc05l dHdvcmtJbnRlcmZhY2UtJmd0O09wZW5Ecml2ZXJDb250cm9sbGVySGFuZGxlPGJyPg0KK8KgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgKTs8 YnI+DQrCoCDCoCDCoCDCoCDCoCDCoCDCoGlmICghRUZJX0VSUk9SIChTdGF0dXMpKSB7PGJyPg0K wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBTdGF0dXMgPSBEZXN0cm95UmVkZmlzaE5ldHdyb2tJbnRl cmZhY2UgKFRoaXNOZXR3b3JrSW50ZXJmYWNlKTs8YnI+DQrCoCDCoCDCoCDCoCDCoCDCoCDCoH08 YnI+DQo8YnI+DQrCoCDCoCDCoCDCoCDCoCDCoCDCoGdCUy0mZ3Q7UmVzdG9yZVRQTCAoT2xkVHBs KTs8YnI+DQotwqAgwqAgwqAgwqAgwqAgwqAgLy8gUmVpbnN0YWxsIFJlZGZpc2ggRGlzY292ZXIg cHJvdG9jb2wgdG8gbm90aWZ5IG5ldHdvcms8YnI+DQotwqAgwqAgwqAgwqAgwqAgwqAgLy8gaW50 ZXJmYWNlIGNoYW5nZS48YnI+DQotPGJyPg0KLcKgIMKgIMKgIMKgIMKgIMKgIFN0YXR1cyA9IGdC Uy0mZ3Q7UmVpbnN0YWxsUHJvdG9jb2xJbnRlcmZhY2UgKDxicj4NCi3CoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCBFZmlSZWRmaXNoRGlzY292ZXJQcm90b2NvbEhhbmRs ZSw8YnI+DQotwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgJmFtcDtn RWZpUmVkZmlzaERpc2NvdmVyUHJvdG9jb2xHdWlkLDxicj4NCi3CoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCAoVk9JRCAqKSZhbXA7bVJlZGZpc2hEaXNjb3Zlciw8YnI+ DQotwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgKFZPSUQgKikmYW1w O21SZWRmaXNoRGlzY292ZXI8YnI+DQotwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgKTs8YnI+DQotwqAgwqAgwqAgwqAgwqAgwqAgaWYgKEVGSV9FUlJPUiAoU3RhdHVz KSkgezxicj4NCi3CoCDCoCDCoCDCoCDCoCDCoCDCoCBERUJVRyAoKERFQlVHX0VSUk9SLCAmcXVv dDslYTogUmVpbnN0YWxsIGdFZmlSZWRmaXNoRGlzY292ZXJQcm90b2NvbEd1aWQgZmFpbC4mcXVv dDssIF9fRlVOQ1RJT05fXykpOzxicj4NCis8YnI+DQorwqAgwqAgwqAgwqAgwqAgwqAgLy88YnI+ DQorwqAgwqAgwqAgwqAgwqAgwqAgLy8gRGlzY29ubmVjdCBFRkkgUmVkZmlzaCBkaXNjb3ZlciBk cml2ZXIgY29udHJvbGxlciB0byBub3RpZnkgdGhlPGJyPg0KK8KgIMKgIMKgIMKgIMKgIMKgIC8v IGNsaW5ldCB3aGljaCB1c2VzIC5FRkkgUmVkZmlzaCBkaXNjb3ZlciBwcm90b2NvbC48YnI+DQor wqAgwqAgwqAgwqAgwqAgwqAgLy88YnI+DQorwqAgwqAgwqAgwqAgwqAgwqAgaWYgKERpc2NvdmVy UHJvdG9jb2xIYW5kbGUgIT0gTlVMTCkgezxicj4NCivCoCDCoCDCoCDCoCDCoCDCoCDCoCBnQlMt Jmd0O0Rpc2Nvbm5lY3RDb250cm9sbGVyIChEaXNjb3ZlclByb3RvY29sSGFuZGxlLCBOVUxMLCBO VUxMKTs8YnI+DQorwqAgwqAgwqAgwqAgwqAgwqAgwqAgU3RhdHVzID0gZ0JTLSZndDtVbmluc3Rh bGxQcm90b2NvbEludGVyZmFjZSAoPGJyPg0KK8KgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIERpc2NvdmVyUHJvdG9jb2xIYW5kbGUsPGJyPg0KK8KgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgICZhbXA7Z0VmaVJlZGZpc2hEaXNjb3Zl clByb3RvY29sR3VpZCw8YnI+DQorwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgKFZPSUQgKikmYW1wO21SZWRmaXNoRGlzY292ZXI8YnI+DQorwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgKTs8YnI+DQrCoCDCoCDCoCDCoCDCoCDC oCDCoH08YnI+DQo8YnI+DQrCoCDCoCDCoCDCoCDCoCDCoCDCoHJldHVybiBTdGF0dXM7PGJyPg0K QEAgLTIwMzIsMjAgKzIwNjcsNSBAQCBSZWRmaXNoRGlzY292ZXJVbmxvYWQgKDxicj4NCsKgIMKg IMKgU3RvcFNlcnZpY2VPbk5ldHdvcmtJbnRlcmZhY2UgKCZhbXA7Z1JlZGZpc2hEaXNjb3ZlckRy aXZlckJpbmRpbmcsIFRoaXNOZXR3b3JrSW50ZXJmYWNlLSZndDtOZXR3b3JrSW50ZXJmYWNlUHJv dG9jb2xJbmZvLlByb3RvY29sQ29udHJvbGxlckhhbmRsZSk7PGJyPg0KwqAgwqB9PGJyPg0KPGJy Pg0KLcKgIC8vIERpc2Nvbm5lY3QgRUZJIFJlZGZpc2ggZGlzY292ZXIgZHJpdmVyIGNvbnRyb2xs ZXIgdG8gbm90aWZ5IHRoZTxicj4NCi3CoCAvLyBjbGluZXQgd2hpY2ggdXNlcyAuRUZJIFJlZGZp c2ggZGlzY292ZXIgcHJvdG9jb2wuPGJyPg0KLTxicj4NCi3CoCBpZiAoRWZpUmVkZmlzaERpc2Nv dmVyUHJvdG9jb2xIYW5kbGUgIT0gTlVMTCkgezxicj4NCi3CoCDCoCAvLzxicj4NCi3CoCDCoCAv LyBOb3RpZnkgdXNlciBFRklfUkVERklTSF9ESVNDT1ZFUl9QUk9UT0NPTCBpcyB1bmxvYWRlZC48 YnI+DQotwqAgwqAgLy88YnI+DQotwqAgwqAgZ0JTLSZndDtEaXNjb25uZWN0Q29udHJvbGxlciAo RWZpUmVkZmlzaERpc2NvdmVyUHJvdG9jb2xIYW5kbGUsIE5VTEwsIE5VTEwpOzxicj4NCi3CoCDC oCBTdGF0dXMgPSBnQlMtJmd0O1VuaW5zdGFsbFByb3RvY29sSW50ZXJmYWNlICg8YnI+DQotwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgRWZpUmVkZmlzaERpc2NvdmVyUHJvdG9jb2xIYW5k bGUsPGJyPg0KLcKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgICZhbXA7Z0VmaVJlZGZpc2hE aXNjb3ZlclByb3RvY29sR3VpZCw8YnI+DQotwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg KFZPSUQgKikmYW1wO21SZWRmaXNoRGlzY292ZXI8YnI+DQotwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgKTs8YnI+DQotwqAgfTxicj4NCi08YnI+DQrCoCDCoHJldHVybiBTdGF0dXM7PGJy Pg0KwqB9PGJyPg0KLS0gPGJyPg0KMi4zNy4xLndpbmRvd3MuMTxicj4NCjxicj4NCjwvYmxvY2tx dW90ZT48L2Rpdj48L2Rpdj48L2Rpdj4NCg== --000000000000c9eb7205e7952dd5--