From mboxrd@z Thu Jan  1 00:00:00 1970
Received: from NAM10-BN7-obe.outbound.protection.outlook.com (NAM10-BN7-obe.outbound.protection.outlook.com [40.107.92.139])
 by mx.groups.io with SMTP id smtpd.web12.3754.1623214227257683775
 for <devel@edk2.groups.io>;
 Tue, 08 Jun 2021 21:50:27 -0700
Authentication-Results: mx.groups.io;
 dkim=pass header.i=@os.amperecomputing.com header.s=selector2 header.b=B02MoBzj;
 spf=pass (domain: os.amperecomputing.com, ip: 40.107.92.139, mailfrom: nhi@os.amperecomputing.com)
ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none;
 b=OKWLpxrUGnRn06HleXbXgkp2HnBb25qe28uwgr/ECvGm2sbrT5qB5786a/MPSzZ9yIfov/rJ7DiQQuvx/CzHaR63mOToJ70Mtf6p/xds0d/16yM4NV07rybs6b3Mu5pe8fx1FK01izBtofZfvfZ/Jpm2bz+FpONGRSfTAnd1Yy/lpE+gLGszR69hS+Va7IO3BpfhOlBrZf0Y/pruYeUZs7cuGjdSETR70gCscZ7MXTdrC0E5TMj8n580QGBVMBBmbpHO40a2v0Sg6j52l5SBhxAVKmgGT0cT9OIn6C3xazFGOHMT4rUdJUfi0d4xK/4cnlGfVAhi9TeDNE+3DmEMcw==
ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com;
 s=arcselector9901;
 h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck;
 bh=4ORkdv3zAtemxIfqaGCDj9hiFBUJm/7wfuhI+IeZ3c8=;
 b=hwLt5J5RHUq5uVKX3Vj+hkeKFjMFSpD+9WyNe6w1TL858e2ETIm494puMsX0sAKyD2ukRUjniTX06OBoatnLY5kTHioNfAhH0aySINmlizZjyeZtKrp3RI4AEomTolTkuev52ztAkGksKhauzdO2owjlh12KK79wq1/HHZNvUgNWY4Rx0Z9Rf9fIIu4Qfbs+UoHEGzj26dlLOXSWYC7nyzeZGcnfQZTyQqqrKC697OoCQW5SiQi5xE1r+RIab+tFhuvvjuoSR6pPBlii85jhEO4J3lRhfYGeOrL8n3C35IWWf7C7UKfr1FVM2TYRv6SQdzU55nviQ6TOw7eitGMYUQ==
ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass
 smtp.mailfrom=os.amperecomputing.com; dmarc=pass action=none
 header.from=os.amperecomputing.com; dkim=pass
 header.d=os.amperecomputing.com; arc=none
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
 d=os.amperecomputing.com; s=selector2;
 h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck;
 bh=4ORkdv3zAtemxIfqaGCDj9hiFBUJm/7wfuhI+IeZ3c8=;
 b=B02MoBzjv1DiAF+zGvYl8Yxca8V3ytdJ7xvGJdMA4CVlWTLjgYGJIeSBL7KJkLY2KdDGIBJ5tDd2attXd99wRnT0Bd040Ool3L4X5xdHxjhyR5OMwXQ0EgyLNaBmSO2CXAf3YgLLivZRhYCxJ3dW7o85mFx7F9z4LGpHJhdxGUE=
Authentication-Results: intel.com; dkim=none (message not signed)
 header.d=none;intel.com; dmarc=none action=none
 header.from=os.amperecomputing.com;
Received: from DM6PR01MB5849.prod.exchangelabs.com (2603:10b6:5:205::20) by
 DM6PR01MB4842.prod.exchangelabs.com (2603:10b6:5:6c::27) with Microsoft SMTP
 Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id
 15.20.4195.24; Wed, 9 Jun 2021 04:50:21 +0000
Received: from DM6PR01MB5849.prod.exchangelabs.com
 ([fe80::60d2:86dd:1f1c:51dd]) by DM6PR01MB5849.prod.exchangelabs.com
 ([fe80::60d2:86dd:1f1c:51dd%7]) with mapi id 15.20.4195.030; Wed, 9 Jun 2021
 04:50:21 +0000
Subject: Re: [edk2-platforms][PATCH v2 01/32] Ampere: Initial support for Ampere Altra processor and Mt. Jade platform
To: Leif Lindholm <leif@nuviainc.com>
Cc: devel@edk2.groups.io, Vu Nguyen <vunguyen@os.amperecomputing.com>,
 Thang Nguyen <thang@os.amperecomputing.com>,
 Chuong Tran <chuong@os.amperecomputing.com>,
 Phong Vo <phong@os.amperecomputing.com>,
 Michael D Kinney <michael.d.kinney@intel.com>,
 Ard Biesheuvel <ardb+tianocore@kernel.org>,
 Nate DeSimone <nathaniel.l.desimone@intel.com>
References: <20210526100724.5359-1-nhi@os.amperecomputing.com>
 <20210526100724.5359-2-nhi@os.amperecomputing.com>
 <20210604230410.s7vuarxir2fqkqtw@leviathan>
From: "Nhi Pham" <nhi@os.amperecomputing.com>
Message-ID: <8f7dde81-8337-9b9b-3b80-f575fad568fb@os.amperecomputing.com>
Date: Wed, 9 Jun 2021 11:50:07 +0700
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:78.0)
 Gecko/20100101 Thunderbird/78.11.0
In-Reply-To: <20210604230410.s7vuarxir2fqkqtw@leviathan>
X-Originating-IP: [118.69.219.201]
X-ClientProxiedBy: HK0PR03CA0111.apcprd03.prod.outlook.com
 (2603:1096:203:b0::27) To DM6PR01MB5849.prod.exchangelabs.com
 (2603:10b6:5:205::20)
Return-Path: nhi@os.amperecomputing.com
MIME-Version: 1.0
X-MS-Exchange-MessageSentRepresentingType: 1
Received: from [10.38.32.216] (118.69.219.201) by HK0PR03CA0111.apcprd03.prod.outlook.com (2603:1096:203:b0::27) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.4219.21 via Frontend Transport; Wed, 9 Jun 2021 04:50:15 +0000
X-MS-PublicTrafficType: Email
X-MS-Office365-Filtering-Correlation-Id: 18fb7c62-2a2c-4170-064f-08d92b0214d0
X-MS-TrafficTypeDiagnostic: DM6PR01MB4842:
X-MS-Exchange-Transport-Forked: True
X-Microsoft-Antispam-PRVS: 
	<DM6PR01MB48425D391AFAE1CD64C49A3496369@DM6PR01MB4842.prod.exchangelabs.com>
X-MS-Oob-TLC-OOBClassifiers: OLM:8882;
X-MS-Exchange-SenderADCheck: 1
X-Microsoft-Antispam: BCL:0;
X-Microsoft-Antispam-Message-Info: 
	RTquH1oUwwOtkKLOdOMMKFZWl+IdtofpgiUT0z/UY4JG9TgnPec5zrSF3oz7IsFzUjF9kY4ZYivcNjfZSpNflXXITaa8wFyA5YZWx7R4reaAeB+uTcgdP2q86zmS/88kj+9khrNSxksc/3nTU3+eRq0BNJxtogce1co86c6uuFZnt1USZgYSB1sf3o8WM3asT166stMtaU0yUp/I+e8y7hZJpkT0/zdMTVcor7OPmvetkqmkSh8reMm6wMqXmZHCMl7yE1HIv1CIEi3HCweqBEJhXcuugmSplanQ4E8LaZ53yrqVDwMxtuT0QQNzy6/ihGTi3Gd6j5r/e/W4r5S7RQytC1PgkoQP9FsU5JsfAFWjYB9DUz24eA1EKBr368PawKwB0uhEX7CxwxWm6uWwi5ZI85cLmTP7s9bRXYY8CV2xwSEVKpvEdKVYRmSdCImPP58OoVO5+bFyP1Xh5eKWVkfmN9RYoT4Kw+D2UNX+hRvgEexRGlhWn8nvp/+bSV5u5LNHQOCpcLquvcEfVX6XIUJMCSOVLU7CZU0eJRF3qCMFhydvTyFo/r4Pk1YGGg+VvacwirBnU8yty7/PxyWR4iltbZm12Ws6jKIsZYnyxYFuDE7pmLa0l7G73KPfKJm/BvMUOaH31onRBYOg4aliKDNqtuxMAa25+8BmZm4L2z65XEZK7/avtF5g7NswvkDvyE9PNp6qo+ydrnoKe9tO9RbJEs1noz00pwGtiXG/RYCC8zmRKP1NTOZOmWHDfGjhQIo5calnnhV4yeYoBkQ6rA2VAC9MrIiBqZWC6S0djJt+uWRhO7xV+py5VpFZ0PEAL5yFu4t16tX2z37iTtN0aA==
X-Forefront-Antispam-Report: 
	CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:DM6PR01MB5849.prod.exchangelabs.com;PTR:;CAT:NONE;SFS:(4636009)(376002)(396003)(346002)(366004)(39830400003)(136003)(52116002)(2906002)(2616005)(478600001)(5660300002)(956004)(8676002)(53546011)(33964004)(16576012)(26005)(6916009)(31686004)(6666004)(83380400001)(166002)(30864003)(86362001)(8936002)(38100700002)(4326008)(316002)(38350700002)(54906003)(31696002)(19627235002)(66556008)(16526019)(66946007)(66476007)(186003)(6486002)(45980500001)(43740500002)(579004)(559001);DIR:OUT;SFP:1102;
X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1
X-MS-Exchange-AntiSpam-MessageData-0: 
	=?utf-8?B?NGJ1SEtaT0lPYWw5TGFXSEVVRWpoRW9WV1B3YnRQSk9IUklYdm1MVjQ1S2lM?=
 =?utf-8?B?VGtHQVBCN0ZyMEhvcGJNMlV4b3hKUlBBeVM0dGRlckZMR3llcDRGOURXeVFp?=
 =?utf-8?B?R1ZwNXMyM1pUSytUWXFIM1lyV2N6Y2hsWXhjMXFtbVBKY0lEdkVic05IZ29O?=
 =?utf-8?B?MzhnY2s4VTVqMVhic092ZENTQ0ZMUVpOUXFmMHhlYXBxSkVaeGs3N3JlRHdC?=
 =?utf-8?B?RDJzaVNjWVFKU2wvR1hBL3V1a21UMUFZRHh2RWlrOEhDYVZkeUM2YUhoQ0d0?=
 =?utf-8?B?U3hDdlRnMXdoK3lJNHE3d0pEcVJzQVdpNVFzMSs2b3NKSWJ1UnFEc2VPb3Mz?=
 =?utf-8?B?Y3lrVGhEbzNCRXBZYjdCcGp6Z24yTG5xT2hmRGZSWFA5bUZnWHRXVnYrMnpX?=
 =?utf-8?B?K1NjSmc0c1ZKK0ZyY1FHVFhHaFN4TExLMVBSbjdyMTdQeWhzWkdBTXFRbnV0?=
 =?utf-8?B?Wi9XSW9rWkc5eDd1YlBpN1hxbVNreFFSemh5NUhqYVcwQ2hXZ21UR1lzZm9L?=
 =?utf-8?B?UENGcWppYUhXU3JNV1Q4aE56SDFwNTQ0UFIveXdhWlZHc3Vyd1pkZ2hWc2dD?=
 =?utf-8?B?eTZMeDNXOFo4OTZva2JqMGVmckhFeVBaZ0ErN24wMDI0dHBEMXFKdkJwbjlu?=
 =?utf-8?B?MGZYTUlCbUhIRi9rbFlTeUVqSHNOYldNSUp4ZGgzRUxLcDNTNXJtMkNIa2ls?=
 =?utf-8?B?TERwdnVGWHRucFprSEIrdmhKMGI5Tm1sN1RBRkh3ZExTWVFDdTQ0SVVrNFRL?=
 =?utf-8?B?SkdVenZkb3FOTXUxbFAvNnlXZERueWkvb2pJa0JQbGFXRXhxZ3prNVdraXVQ?=
 =?utf-8?B?NGVUdFBMRmxCU3lIdWU1eGdidTRlRVZtaFQ2T0QvYitVQmRBdmhGaUhUZEVw?=
 =?utf-8?B?TmptQjlnSWhLSG8xLytqeE5jNUVqb3RUZzN0WGl3RzlHK2JXRVN1RUY3NkJ2?=
 =?utf-8?B?dHJyVXJWWHlSMDhHMVdQM1A5bEFwTmUxWkZ5THVYcW9aWHI3OTBMMkM0VnM5?=
 =?utf-8?B?UXIyY3pLS0lwc05FajJpMkNhYTVyTE5uTEk3a2dnbXF2QzVaQ2EyTHorTkpi?=
 =?utf-8?B?ZjREemU1bm9HZmJPQzhkd3JhTEhWMXphYnVEQVF0QzJlcGxlcDJReVVmSVZr?=
 =?utf-8?B?ZkZXMXJybU5qLzh4bmppSmwzUTBHemErckxYaW1VZ3BCUmVhUGpWelJVS1lZ?=
 =?utf-8?B?NGxYTnYzc2tGU2RGVlFMQXpTb2h4YWVJMXg3WTI1T3k4dGhyeDNobVBKNWZR?=
 =?utf-8?B?L29vcmtWVVdKWkdWazdaaGZqTERGUi9jQm5uYjhtS0xaUTRjRTJWWmpmWkdW?=
 =?utf-8?B?Qld6YVVJbTE0RDhUOFJMSmVHaHQ2a1g2anYrWlFHd2w3VHJGNDd4ekpOR3U3?=
 =?utf-8?B?Q3hScWVNUjFIMkF4alByYzlveVV5V0ljN2s2bGtZNWlMYW16UkF5TDUvTVlP?=
 =?utf-8?B?Mk9ybndPb1lIZmVFNlh0SkR0UU5GQ0ViWk9sdzBJb2pMak56RUZaM0RMTElq?=
 =?utf-8?B?VHI3VkVUazFMTmNkOTh1S3F1NmtlZG9oNkdCQUNvOHdVWXN4elZQYXJNNnl5?=
 =?utf-8?B?K2RIWlRyaHhjM2Y2MFNLOEZuSTFwU2U0Z1BJYnQ3YWwzd3BERjIyYVRodXRv?=
 =?utf-8?B?c2p3T2pYalpmTnAvWXdKWVRmT3JwUDBIM25IaUNxaUxNODlBcDJGTDV4RjA5?=
 =?utf-8?B?UnFKZXhMazBGOG5lbHhqdVFVc3RzZTZnNk9XajVEVXd4bHpCbm1NL3g2VS9L?=
 =?utf-8?Q?PNriY8tzg9eN6k0CA+Xq2tzzjoNNkNVcqigRnHa?=
X-OriginatorOrg: os.amperecomputing.com
X-MS-Exchange-CrossTenant-Network-Message-Id: 18fb7c62-2a2c-4170-064f-08d92b0214d0
X-MS-Exchange-CrossTenant-AuthSource: DM6PR01MB5849.prod.exchangelabs.com
X-MS-Exchange-CrossTenant-AuthAs: Internal
X-MS-Exchange-CrossTenant-OriginalArrivalTime: 09 Jun 2021 04:50:21.0369
 (UTC)
X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted
X-MS-Exchange-CrossTenant-Id: 3bc2b170-fd94-476d-b0ce-4229bdc904a7
X-MS-Exchange-CrossTenant-MailboxType: HOSTED
X-MS-Exchange-CrossTenant-UserPrincipalName: 6mft04AAI6cKhdmCDE3HbOXCWkGxlMLnpJ6mwIHufTWPvr7FQJwYVjw1vCCGuyoqKN6TrEiPJE2djM5aEX0voCaBVYQx5oQqtlwGHBF3thE=
X-MS-Exchange-Transport-CrossTenantHeadersStamped: DM6PR01MB4842
Content-Type: multipart/alternative;
 boundary="------------4BF9D6D8EBC1A676687FE92C"
Content-Language: en-US

--------------4BF9D6D8EBC1A676687FE92C
Content-Type: text/plain; charset=utf-8; format=flowed
Content-Transfer-Encoding: 8bit

On 6/5/21 06:04, Leif Lindholm wrote:
> On Wed, May 26, 2021 at 17:06:52 +0700, Nhi Pham wrote:
>> From: Vu Nguyen <vunguyen@os.amperecomputing.com>
>>
>> This commit adds the support for Ampere’s Altra processor-based Mt. Jade
>> platform that provides up to 160 processor cores in a dual socket
>> configuration. The essential modules are wired up enough to boot system
>> to EDK2 UiApp.
>>
>> Cc: Thang Nguyen <thang@os.amperecomputing.com>
>> Cc: Chuong Tran <chuong@os.amperecomputing.com>
>> Cc: Phong Vo <phong@os.amperecomputing.com>
>> Cc: Leif Lindholm <leif@nuviainc.com>
>> Cc: Michael D Kinney <michael.d.kinney@intel.com>
>> Cc: Ard Biesheuvel <ardb+tianocore@kernel.org>
>> Cc: Nate DeSimone <nathaniel.l.desimone@intel.com>
>>
>> Signed-off-by: Vu Nguyen <vunguyen@os.amperecomputing.com>
>> ---
>>   Platform/Ampere/AmperePlatformPkg/AmperePlatformPkg.dec                                         |  28 +
>>   Silicon/Ampere/AmpereAltraPkg/AmpereAltraPkg.dec                                                |  42 ++
>>   Silicon/Ampere/AmpereSiliconPkg/AmpereSiliconPkg.dec                                            |  46 ++
>>   Silicon/Ampere/AmpereAltraPkg/AmpereAltraPkg.dsc.inc                                            | 674 +++++++++++++++++++
>>   Platform/Ampere/JadePkg/Jade.dsc                                                                | 100 +++
>>   Platform/Ampere/JadePkg/Jade.fdf                                                                | 225 +++++++
>>   Silicon/Ampere/AmpereAltraPkg/Drivers/ATFHobPei/ATFHobPeim.inf                                  |  41 ++
>>   Silicon/Ampere/AmpereAltraPkg/Drivers/MemoryInitPeim/MemoryInitPeim.inf                         |  64 ++
>>   Silicon/Ampere/AmpereAltraPkg/Library/AmpereCpuLib/AmpereCpuLib.inf                             |  44 ++
>>   Silicon/Ampere/AmpereAltraPkg/Library/ArmPlatformLib/ArmPlatformLib.inf                         |  57 ++
>>   Silicon/Ampere/AmpereAltraPkg/Library/MailboxInterfaceLib/MailboxInterfaceLib.inf               |  37 +
>>   Silicon/Ampere/AmpereAltraPkg/Library/MemoryInitPeiLib/MemoryInitPeiLib.inf                     |  63 ++
>>   Silicon/Ampere/AmpereAltraPkg/Library/MmCommunicationLib/MmCommunicationLib.inf                 |  35 +
>>   Silicon/Ampere/AmpereAltraPkg/Library/NVParamLib/NVParamLib.inf                                 |  32 +
>>   Silicon/Ampere/AmpereAltraPkg/Library/PlatformPeiLib/PlatformPeiLib.inf                         |  42 ++
>>   Silicon/Ampere/AmpereAltraPkg/Library/RngLib/RngLib.inf                                         |  29 +
>>   Silicon/Ampere/AmpereAltraPkg/Library/SystemFirmwareInterfaceLib/SystemFirmwareInterfaceLib.inf |  30 +
>>   Silicon/Ampere/AmpereAltraPkg/Library/TrngLib/TrngLib.inf                                       |  29 +
>>   Silicon/Ampere/AmpereAltraPkg/Include/Guid/PlatformInfoHobGuid.h                                |  17 +
>>   Silicon/Ampere/AmpereAltraPkg/Include/Library/AmpereCpuLib.h                                    | 282 ++++++++
>>   Silicon/Ampere/AmpereAltraPkg/Include/Library/MailboxInterfaceLib.h                             | 172 +++++
>>   Silicon/Ampere/AmpereAltraPkg/Include/Library/MmCommunicationLib.h                              |  19 +
>>   Silicon/Ampere/AmpereAltraPkg/Include/Library/NVParamLib.h                                      | 133 ++++
>>   Silicon/Ampere/AmpereAltraPkg/Include/Library/SystemFirmwareInterfaceLib.h                      | 282 ++++++++
>>   Silicon/Ampere/AmpereAltraPkg/Include/Library/TrngLib.h                                         |  31 +
>>   Silicon/Ampere/AmpereAltraPkg/Include/MmLib.h                                                   |  79 +++
>>   Silicon/Ampere/AmpereAltraPkg/Include/NVParamDef.h                                              | 515 ++++++++++++++
>>   Silicon/Ampere/AmpereAltraPkg/Include/Platform/Ac01.h                                           | 146 ++++
>>   Silicon/Ampere/AmpereAltraPkg/Include/PlatformInfoHob.h                                         | 182 +++++
>>   Silicon/Ampere/AmpereAltraPkg/Drivers/ATFHobPei/ATFHobPeim.c                                    |  52 ++
>>   Silicon/Ampere/AmpereAltraPkg/Drivers/MemoryInitPeim/MemoryInitPeim.c                           | 151 +++++
>>   Silicon/Ampere/AmpereAltraPkg/Library/AmpereCpuLib/AmpereCpuLib.c                               | 706 ++++++++++++++++++++
>>   Silicon/Ampere/AmpereAltraPkg/Library/ArmPlatformLib/ArmPlatformLib.c                           | 169 +++++
>>   Silicon/Ampere/AmpereAltraPkg/Library/ArmPlatformLib/ArmPlatformLibMemory.c                     | 399 +++++++++++
>>   Silicon/Ampere/AmpereAltraPkg/Library/MailboxInterfaceLib/MailboxInterfaceLib.c                 | 282 ++++++++
>>   Silicon/Ampere/AmpereAltraPkg/Library/MemoryInitPeiLib/MemoryInitPeiLib.c                       |  93 +++
>>   Silicon/Ampere/AmpereAltraPkg/Library/MmCommunicationLib/MmCommunicationLib.c                   | 184 +++++
>>   Silicon/Ampere/AmpereAltraPkg/Library/NVParamLib/NVParamLib.c                                   | 202 ++++++
>>   Silicon/Ampere/AmpereAltraPkg/Library/PlatformPeiLib/PlatformPeiLib.c                           |  40 ++
>>   Silicon/Ampere/AmpereAltraPkg/Library/RngLib/RngLib.c                                           | 141 ++++
>>   Silicon/Ampere/AmpereAltraPkg/Library/SystemFirmwareInterfaceLib/SystemFirmwareInterfaceLib.c   | 328 +++++++++
>>   Silicon/Ampere/AmpereAltraPkg/Library/TrngLib/TrngLib.c                                         |  63 ++
>>   Platform/Ampere/AmperePlatformPkg/FvRules.fdf.inc                                               | 176 +++++
>>   Platform/Ampere/JadePkg/JadeBoardSetting.cfg                                                    | 209 ++++++
>>   Silicon/Ampere/AmpereAltraPkg/Library/ArmPlatformLib/ArmPlatformHelper.S                        |  45 ++
>>   Silicon/Ampere/AmpereAltraPkg/Library/RngLib/RngLib.uni                                         |  13 +
>>   46 files changed, 6729 insertions(+)
>>
>> diff --git a/Platform/Ampere/JadePkg/Jade.dsc b/Platform/Ampere/JadePkg/Jade.dsc
>> new file mode 100755
>> index 000000000000..f68af24a0d78
>> --- /dev/null
>> +++ b/Platform/Ampere/JadePkg/Jade.dsc
>> @@ -0,0 +1,100 @@
>> +## @file
>> +#
>> +# Copyright (c) 2020 - 2021, Ampere Computing LLC. All rights reserved.<BR>
>> +#
>> +# SPDX-License-Identifier: BSD-2-Clause-Patent
>> +#
>> +##
>> +
>> +################################################################################
>> +#
>> +# Defines Section - statements that will be processed to create a Makefile.
>> +#
>> +################################################################################
>> +[Defines]
>> +  PLATFORM_NAME                  = Jade
>> +  PLATFORM_GUID                  = 7BDD00C0-68F3-4CC1-8775-F0F00572019F
>> +  PLATFORM_VERSION               = 0.1
>> +  DSC_SPECIFICATION              = 0x0001001B
>> +  OUTPUT_DIRECTORY               = Build/Jade
>> +  SUPPORTED_ARCHITECTURES        = AARCH64
>> +  BUILD_TARGETS                  = DEBUG|RELEASE|NOOPT
>> +  SKUID_IDENTIFIER               = DEFAULT
>> +  FLASH_DEFINITION               = Platform/Ampere/JadePkg/Jade.fdf
>> +
>> +  #
>> +  # Defines for default states. These can be changed on the command line.
>> +  # -D FLAG=VALUE
>> +  #
>> +
>> +  #  DEBUG_INIT      0x00000001  // Initialization
>> +  #  DEBUG_WARN      0x00000002  // Warnings
>> +  #  DEBUG_LOAD      0x00000004  // Load events
>> +  #  DEBUG_FS        0x00000008  // EFI File system
>> +  #  DEBUG_POOL      0x00000010  // Alloc & Free (pool)
>> +  #  DEBUG_PAGE      0x00000020  // Alloc & Free (page)
>> +  #  DEBUG_INFO      0x00000040  // Informational debug messages
>> +  #  DEBUG_DISPATCH  0x00000080  // PEI/DXE/SMM Dispatchers
>> +  #  DEBUG_VARIABLE  0x00000100  // Variable
>> +  #  DEBUG_BM        0x00000400  // Boot Manager
>> +  #  DEBUG_BLKIO     0x00001000  // BlkIo Driver
>> +  #  DEBUG_NET       0x00004000  // SNP Driver
>> +  #  DEBUG_UNDI      0x00010000  // UNDI Driver
>> +  #  DEBUG_LOADFILE  0x00020000  // LoadFile
>> +  #  DEBUG_EVENT     0x00080000  // Event messages
>> +  #  DEBUG_GCD       0x00100000  // Global Coherency Database changes
>> +  #  DEBUG_CACHE     0x00200000  // Memory range cachability changes
>> +  #  DEBUG_VERBOSE   0x00400000  // Detailed debug messages that may
>> +  #                              // significantly impact boot performance
>> +  #  DEBUG_ERROR     0x80000000  // Error
>> +  DEFINE DEBUG_PRINT_ERROR_LEVEL = 0x8000000F
>> +  DEFINE FIRMWARE_VER            = 0.01.001
>> +  DEFINE EDK2_SKIP_PEICORE       = TRUE
>> +  DEFINE SECURE_BOOT_ENABLE      = FALSE
>> +  DEFINE INCLUDE_TFTP_COMMAND    = TRUE
>> +
>> +  #
>> +  # Network definition
>> +  #
>> +  DEFINE NETWORK_IP6_ENABLE                  = FALSE
>> +  DEFINE NETWORK_HTTP_BOOT_ENABLE            = TRUE
>> +  DEFINE NETWORK_ALLOW_HTTP_CONNECTIONS      = TRUE
>> +  DEFINE NETWORK_TLS_ENABLE                  = FALSE
>> +
> You'll want to include that !include MdePkg/MdeLibs.dsc.inc bit
> somewhere here.
>
>> +# Include default Ampere Platform DSC file
>> +!include Silicon/Ampere/AmpereAltraPkg/AmpereAltraPkg.dsc.inc
>> +
>> +################################################################################
>> +#
>> +# Specific Platform Library
>> +#
>> +################################################################################
>> +[LibraryClasses]
>> +  #
>> +  # RTC Library: Common RTC
>> +  #
>> +  RealTimeClockLib|EmbeddedPkg/Library/VirtualRealTimeClockLib/VirtualRealTimeClockLib.inf
>> +
>> +################################################################################
>> +#
>> +# Specific Platform Pcds
>> +#
>> +################################################################################
>> +[PcdsFeatureFlag.common]
>> +[PcdsFixedAtBuild.common]
>> +
>> +!if $(SECURE_BOOT_ENABLE) == TRUE
>> +  # Override the default values from SecurityPkg to ensure images
>> +  # from all sources are verified in secure boot
>> +  gEfiSecurityPkgTokenSpaceGuid.PcdOptionRomImageVerificationPolicy|0x04
>> +  gEfiSecurityPkgTokenSpaceGuid.PcdFixedMediaImageVerificationPolicy|0x04
>> +  gEfiSecurityPkgTokenSpaceGuid.PcdRemovableMediaImageVerificationPolicy|0x04
>> +!endif
>> +
>> +
>> +################################################################################
>> +#
>> +# Specific Platform Component
>> +#
>> +################################################################################
>> +[Components.common]
>
>
>> diff --git a/Silicon/Ampere/AmpereAltraPkg/Include/Library/AmpereCpuLib.h b/Silicon/Ampere/AmpereAltraPkg/Include/Library/AmpereCpuLib.h
>> new file mode 100644
>> index 000000000000..de576474fb48
>> --- /dev/null
>> +++ b/Silicon/Ampere/AmpereAltraPkg/Include/Library/AmpereCpuLib.h
>> @@ -0,0 +1,282 @@
>> +/** @file
>> +
>> +  Copyright (c) 2020 - 2021, Ampere Computing LLC. All rights reserved.<BR>
>> +
>> +  SPDX-License-Identifier: BSD-2-Clause-Patent
>> +
>> +**/
>> +
>> +#ifndef AMPERE_CPU_LIB_H_
>> +#define AMPERE_CPU_LIB_H_
>> +
>> +/* Ctypen, bits[3(n - 1) + 2 : 3(n - 1)], for n = 1 to 7 */
>> +#define CLIDR_CTYPE_SHIFT(Level)    (3 * (Level - 1))
>> +#define CLIDR_CTYPE_MASK(Level)     (7 << CLIDR_CTYPE_SHIFT(Level))
>> +#define CLIDR_CTYPE(Clidr, Level) \
>> +  (((Clidr) & CLIDR_CTYPE_MASK(Level)) >> CLIDR_CTYPE_SHIFT(Level))
>> +
>> +#define CCSIDR_NUMSETS_SHIFT        13
>> +#define CCSIDR_NUMSETS_MASK         0xFFFE000
>> +#define CCSIDR_NUMSETS(Ccsidr) \
>> +  (((Ccsidr) & CCSIDR_NUMSETS_MASK) >> CCSIDR_NUMSETS_SHIFT)
>> +#define CCSIDR_ASSOCIATIVITY_SHIFT  3
>> +#define CCSIDR_ASSOCIATIVITY_MASK   0x1FF8
>> +#define CCSIDR_ASSOCIATIVITY(Ccsidr) \
>> +  (((Ccsidr) & CCSIDR_ASSOCIATIVITY_MASK) >> CCSIDR_ASSOCIATIVITY_SHIFT)
>> +#define CCSIDR_LINE_SIZE_SHIFT      0
>> +#define CCSIDR_LINE_SIZE_MASK       0x7
>> +#define CCSIDR_LINE_SIZE(Ccsidr) \
>> +  (((Ccsidr) & CCSIDR_LINE_SIZE_MASK) >> CCSIDR_LINE_SIZE_SHIFT)
> All of the above (CLIDR/CCSIDR) are architectural.
> We've also developed some new accessors and stuff for these, as part
> of ArmPkg/Universal/SmbiosDxe work that's gone on since v1 of this set.
> We may need to clean some interfaces up, but ideally I'd prefer if you
> could use some accessors from ArmLib or such.
>
>> +
>> +#define SUBNUMA_MODE_MONOLITHIC        0
>> +#define SUBNUMA_MODE_HEMISPHERE        1
>> +#define SUBNUMA_MODE_QUADRANT          2
>> +
>> +#define MONOLITIC_NUM_OF_REGION        1
>> +#define HEMISPHERE_NUM_OF_REGION       2
>> +#define QUADRANT_NUM_OF_REGION         4
>> +#define SUBNUMA_CPM_REGION_SIZE        4
>> +#define NUM_OF_CPM_PER_MESH_ROW        8
>> +
>> +#define CPM_PER_ROW_OFFSET(CpmId)      ((CpmId) % NUM_OF_CPM_PER_MESH_ROW)
>> +#define CPM_ROW_NUMBER(CpmId)          ((CpmId) / NUM_OF_CPM_PER_MESH_ROW)
>> +
>> +#define SOCKET_ID(CpuId)               ((CpuId) / (PLATFORM_CPU_MAX_CPM * PLATFORM_CPU_NUM_CORES_PER_CPM))
>> +#define CLUSTER_ID(CpuId)              (((CpuId) / PLATFORM_CPU_NUM_CORES_PER_CPM) % PLATFORM_CPU_MAX_CPM)
>> +
>> +
>> +/**
>> +  Get the SubNUMA mode.
>> +
>> +  @return   UINT8      The SubNUMA mode.
>> +
>> +**/
>> +UINT8
>> +EFIAPI
>> +CpuGetSubNumaMode (
>> +  VOID
>> +  );
>> +
>> +/**
>> +  Get the number of SubNUMA region.
>> +
>> +  @return   UINT8      The number of SubNUMA region.
>> +
>> +**/
>> +UINT8
>> +EFIAPI
>> +CpuGetNumberOfSubNumaRegion (
>> +  VOID
>> +  );
>> +
>> +/**
>> +  Get the SubNUMA node of a CPM.
>> +
>> +  @param    SocketId    Socket index.
>> +  @param    Cpm         CPM index.
>> +  @return   UINT8       The SubNUMA node of a CPM.
>> +
>> +**/
>> +UINT8
>> +EFIAPI
>> +CpuGetSubNumNode (
>> +  UINT8  Socket,
>> +  UINT16 Cpm
>> +  );
>> +
>> +/**
>> +  Get the associativity of cache.
>> +
>> +  @param    Level       Cache level.
>> +  @return   UINT32      Associativity of cache.
>> +
>> +**/
>> +UINT32
>> +EFIAPI
>> +CpuGetAssociativity (
>> +  UINT32 Level
>> +  );
>> +
>> +/**
>> +  Get the cache size.
>> +
>> +  @param    Level       Cache level.
>> +  @return   UINT32      Cache size.
>> +
>> +**/
>> +UINT32
>> +EFIAPI
>> +CpuGetCacheSize (
>> +  UINT32 Level
>> +  );
>> +
>> +/**
>> +  Get the number of supported socket.
>> +
>> +  @return   UINT8      Number of supported socket.
>> +
>> +**/
>> +UINT8
>> +EFIAPI
>> +GetNumberOfSupportedSockets (
>> +  VOID
>> +  );
>> +
>> +/**
>> +  Get the number of active socket.
>> +
>> +  @return   UINT8      Number of active socket.
>> +
>> +**/
>> +UINT8
>> +EFIAPI
>> +GetNumberOfActiveSockets (
>> +  VOID
>> +  );
>> +
>> +/**
>> +  Get the number of active CPM per socket.
>> +
>> +  @param    SocketId    Socket index.
>> +  @return   UINT16      Number of CPM.
>> +
>> +**/
>> +UINT16
>> +EFIAPI
>> +GetNumberOfActiveCPMsPerSocket (
>> +  UINT8 SocketId
>> +  );
>> +
>> +/**
>> +  Get the number of configured CPM per socket.
>> +
>> +  @param    SocketId    Socket index.
>> +  @return   UINT16      Number of configured CPM.
>> +
>> +**/
>> +UINT16
>> +EFIAPI
>> +GetNumberOfConfiguredCPMs (
>> +  UINT8 SocketId
>> +  );
>> +
>> +/**
>> +  Set the number of configured CPM per socket.
>> +
>> +  @param    SocketId        Socket index.
>> +  @param    NumberOfCPMs    Number of CPM to be configured.
>> +  @return   EFI_SUCCESS     Operation succeeded.
>> +  @return   Others          An error has occurred.
>> +
>> +**/
>> +EFI_STATUS
>> +EFIAPI
>> +SetNumberOfConfiguredCPMs (
>> +  UINT8  SocketId,
>> +  UINT16 NumberOfCPMs
>> +  );
>> +
>> +/**
>> +  Get the maximum number of core per socket. This number
>> +  should be the same for all sockets.
>> +
>> +  @return   UINT16      Maximum number of core.
>> +
>> +**/
>> +UINT16
>> +EFIAPI
>> +GetMaximumNumberOfCores (
>> +  VOID
>> +  );
>> +
>> +/**
>> +  Get the maximum number of CPM per socket. This number
>> +  should be the same for all sockets.
>> +
>> +  @return   UINT32      Maximum number of CPM.
>> +
>> +**/
>> +UINT16
>> +EFIAPI
>> +GetMaximumNumberOfCPMs (
>> +  VOID
>> +  );
>> +
>> +/**
>> +  Get the number of active cores of a sockets.
>> +
>> +  @return   UINT16      Number of active core.
>> +
>> +**/
>> +UINT16
>> +EFIAPI
>> +GetNumberOfActiveCoresPerSocket (
>> +  UINT8 SocketId
>> +  );
>> +
>> +/**
>> +  Get the number of active cores of all socket.
>> +
>> +  @return   UINT16      Number of active core.
>> +
>> +**/
>> +UINT16
>> +EFIAPI
>> +GetNumberOfActiveCores (
>> +  VOID
>> +  );
>> +
>> +/**
>> +  Check if the logical CPU is enabled or not.
>> +
>> +  @param    CpuId       The logical Cpu ID. Started from 0.
>> +  @return   BOOLEAN     TRUE if the Cpu enabled
>> +                        FALSE if the Cpu disabled.
>> +
>> +**/
>> +BOOLEAN
>> +EFIAPI
>> +IsCpuEnabled (
>> +  UINT16 CpuId
>> +  );
>> +
>> +
>> +/**
>> +  Check if the slave socket is present
>> +
>> +  @return   BOOLEAN     TRUE if the Slave Cpu is present
>> +                        FALSE if the Slave Cpu is not present
>> +
>> +**/
>> +BOOLEAN
>> +EFIAPI
>> +IsSlaveSocketPresent (
>> +  VOID
>> +  );
>> +
>> +/**
>> +  Check if the slave socket is active
>> +
>> +  @return   BOOLEAN     TRUE if the Slave CPU Socket is active.
>> +                        FALSE if the Slave CPU Socket is not active.
>> +
>> +**/
>> +BOOLEAN
>> +EFIAPI
>> +IsSlaveSocketActive (
>> +  VOID
>> +  );
>> +
>> +/**
>> +  Check if the CPU product ID is Ac01
>> +  @return   BOOLEAN     TRUE if the Product ID is Ac01
>> +                        FALSE otherwise.
>> +
>> +**/
>> +BOOLEAN
>> +EFIAPI
>> +IsAc01Processor (
>> +  VOID
>> +  );
>> +
>> +#endif /* AMPERE_CPU_LIB_H_ */
>
>> diff --git a/Silicon/Ampere/AmpereAltraPkg/Library/AmpereCpuLib/AmpereCpuLib.c b/Silicon/Ampere/AmpereAltraPkg/Library/AmpereCpuLib/AmpereCpuLib.c
>> new file mode 100644
>> index 000000000000..8da698e0b855
>> --- /dev/null
>> +++ b/Silicon/Ampere/AmpereAltraPkg/Library/AmpereCpuLib/AmpereCpuLib.c
>> @@ -0,0 +1,706 @@
>> +/** @file
>> +
>> +  Copyright (c) 2020 - 2021, Ampere Computing LLC. All rights reserved.<BR>
>> +
>> +  SPDX-License-Identifier: BSD-2-Clause-Patent
>> +
>> +**/
>> +
>> +#include <PiPei.h>
>> +#include <Uefi.h>
>> +
>> +#include <Guid/PlatformInfoHobGuid.h>
>> +#include <Library/AmpereCpuLib.h>
>> +#include <Library/ArmLib/ArmLibPrivate.h>
>> +#include <Library/BaseMemoryLib.h>
>> +#include <Library/DebugLib.h>
>> +#include <Library/HobLib.h>
>> +#include <Library/IoLib.h>
>> +#include <Library/NVParamLib.h>
>> +#include <NVParamDef.h>
>> +#include <Platform/Ac01.h>
>> +#include <PlatformInfoHob.h>
>> +
>> +STATIC PLATFORM_INFO_HOB *mPlatformInfoHob = NULL;
>> +
>> +PLATFORM_INFO_HOB *
>> +GetPlatformHob (
>> +  VOID
>> +  )
>> +{
>> +  VOID *Hob;
>> +
>> +  if (mPlatformInfoHob == NULL) {
>> +    Hob = GetNextGuidHob (
>> +            &gPlatformHobGuid,
>> +            (CONST VOID *)FixedPcdGet64 (PcdSystemMemoryBase)
>> +            );
>> +    ASSERT (Hob != NULL);
>> +    if (Hob == NULL) {
>> +      DEBUG ((DEBUG_ERROR, "%a: Failed to get gPlatformHobGuid!\n", __FUNCTION__));
>> +      return NULL;
>> +    }
>> +
>> +    mPlatformInfoHob = (PLATFORM_INFO_HOB *)GET_GUID_HOB_DATA (Hob);
>> +  }
>> +
>> +  return mPlatformInfoHob;
>> +}
>> +
>> +/**
>> +  Get the SubNUMA mode.
>> +
>> +  @return   UINT8      The SubNUMA mode.
>> +
>> +**/
>> +UINT8
>> +EFIAPI
>> +CpuGetSubNumaMode (
>> +  VOID
>> +  )
>> +{
>> +  PLATFORM_INFO_HOB  *PlatformHob;
>> +
>> +  PlatformHob = GetPlatformHob ();
>> +  if (PlatformHob == NULL) {
>> +    return SUBNUMA_MODE_MONOLITHIC;
>> +  }
>> +
>> +  return PlatformHob->SubNumaMode[0];
>> +}
>> +
>> +/**
>> +  Get the number of SubNUMA region.
>> +
>> +  @return   UINT8      The number of SubNUMA region.
>> +
>> +**/
>> +UINT8
>> +EFIAPI
>> +CpuGetNumberOfSubNumaRegion (
>> +  VOID
>> +  )
>> +{
>> +  UINT8 SubNumaMode;
>> +  UINT8 NumberOfSubNumaRegion;
>> +
>> +  SubNumaMode = CpuGetSubNumaMode ();
>> +  ASSERT (SubNumaMode <= SUBNUMA_MODE_QUADRANT);
>> +
>> +  switch (SubNumaMode) {
>> +  case SUBNUMA_MODE_MONOLITHIC:
>> +    NumberOfSubNumaRegion = MONOLITIC_NUM_OF_REGION;
>> +    break;
>> +
>> +  case SUBNUMA_MODE_HEMISPHERE:
>> +    NumberOfSubNumaRegion = HEMISPHERE_NUM_OF_REGION;
>> +    break;
>> +
>> +  case SUBNUMA_MODE_QUADRANT:
>> +    NumberOfSubNumaRegion = QUADRANT_NUM_OF_REGION;
>> +    break;
>> +
>> +  default:
>> +    // Should never reach there.
>> +    ASSERT (FALSE);
>> +    break;
>> +  }
>> +
>> +  return NumberOfSubNumaRegion;
>> +}
>> +
>> +/**
>> +  Get the SubNUMA node of a CPM.
>> +
>> +  @param    SocketId    Socket index.
>> +  @param    Cpm         CPM index.
>> +  @return   UINT8       The SubNUMA node of a CPM.
>> +
>> +**/
>> +UINT8
>> +EFIAPI
>> +CpuGetSubNumNode (
>> +  UINT8  SocketId,
>> +  UINT16 Cpm
>> +  )
>> +{
>> +  BOOLEAN IsAsymMesh;
>> +  UINT8   SubNumaNode;
>> +  UINT16  MaxNumberOfCPM;
>> +  UINT8   MiddleRow;
>> +  UINT8   QuadrantHigherRowNodeNumber[NUM_OF_CPM_PER_MESH_ROW] = {1, 1, 1, 1, 3, 3, 3, 3};
>> +  UINT8   QuadrantLowerRowNodeNumber[NUM_OF_CPM_PER_MESH_ROW]  = {0, 0, 0, 0, 2, 2, 2, 2};
>> +  UINT8   QuadrantMiddleRowNodeNumber[NUM_OF_CPM_PER_MESH_ROW] = {0, 0, 1, 1, 3, 3, 2, 2};
>> +  UINT8   SubNumaMode;
>> +
>> +  MaxNumberOfCPM = GetMaximumNumberOfCPMs ();
>> +  SubNumaMode = CpuGetSubNumaMode ();
>> +  ASSERT (SubNumaMode <= SUBNUMA_MODE_QUADRANT);
>> +
>> +  switch (SubNumaMode) {
>> +  case SUBNUMA_MODE_MONOLITHIC:
>> +    SubNumaNode = (SocketId == 0) ? 0 : 1;
>> +    break;
>> +
>> +  case SUBNUMA_MODE_HEMISPHERE:
>> +    if (CPM_PER_ROW_OFFSET (Cpm) >= SUBNUMA_CPM_REGION_SIZE) {
>> +      SubNumaNode = 1;
>> +    } else {
>> +      SubNumaNode = 0;
>> +    }
>> +
>> +    if (SocketId == 1) {
>> +      SubNumaNode += HEMISPHERE_NUM_OF_REGION;
>> +    }
>> +    break;
>> +
>> +  case SUBNUMA_MODE_QUADRANT:
>> +    //
>> +    // CPM Mesh Rows
>> +    //
>> +    // |---------------------------------------|
>> +    // | 00 ----------- 03 | 04 ----------- 07 | Row 0
>> +    // |-------------------|-------------------|
>> +    // | 08 ----------- 11 | 12 ----------- 15 | Row 1
>> +    // |-------------------|-------------------|
>> +    // | 16 - 17 | 18 - 19 | 20 - 21 | 22 - 23 | Middle Row
>> +    // |-------------------|-------------------|
>> +    // | 24 ----------- 27 | 28 ----------- 31 | Row 3
>> +    // |-------------------|-------------------|
>> +    // | 32 ----------- 35 | 36 ----------- 39 | Row 4
>> +    // |---------------------------------------|
>> +    //
>> +
>> +    IsAsymMesh = (BOOLEAN)(CPM_ROW_NUMBER (MaxNumberOfCPM) % 2 != 0);
>> +    MiddleRow = CPM_ROW_NUMBER (MaxNumberOfCPM) / 2;
>> +    if (IsAsymMesh
>> +        && CPM_ROW_NUMBER (Cpm) == MiddleRow)
>> +    {
>> +      SubNumaNode = QuadrantMiddleRowNodeNumber[CPM_PER_ROW_OFFSET (Cpm)];
>> +
>> +    } else if (CPM_ROW_NUMBER (Cpm) >= MiddleRow) {
>> +      SubNumaNode = QuadrantHigherRowNodeNumber[CPM_PER_ROW_OFFSET (Cpm)];
>> +
>> +    } else {
>> +      SubNumaNode = QuadrantLowerRowNodeNumber[CPM_PER_ROW_OFFSET (Cpm)];
>> +    }
>> +
>> +    if (SocketId == 1) {
>> +      SubNumaNode += QUADRANT_NUM_OF_REGION;
>> +    }
>> +    break;
>> +
>> +  default:
>> +    // Should never reach there.
>> +    ASSERT (FALSE);
>> +    break;
>> +  }
>> +
>> +  return SubNumaNode;
>> +}
>> +
>> +/**
>> +  Get the associativity of cache.
>> +
>> +  @param    Level       Cache level.
>> +  @return   UINT32      Associativity of cache.
>> +
>> +**/
>> +UINT32
>> +EFIAPI
>> +CpuGetAssociativity (
>> +  UINT32 Level
>> +  )
>> +{
> I do feel some of this stuff could be replaced by the common functions
> we now have in ArmLib (that we didn't when v1 went out).
>
>> +  UINT64 CacheCCSIDR;
>> +  UINT64 CacheCLIDR;
>> +  UINT32 Value = 0x2; /* Unknown Set-Associativity */
>> +
>> +  CacheCLIDR = ReadCLIDR ();
>> +  if (!CLIDR_CTYPE (CacheCLIDR, Level)) {
>> +    return Value;
>> +  }
>> +
>> +  CacheCCSIDR = ReadCCSIDR (Level);
>> +  switch (CCSIDR_ASSOCIATIVITY (CacheCCSIDR)) {
>> +  case 0:
>> +    /* Direct mapped */
>> +    Value = 0x3;
>> +    break;
>> +
>> +  case 1:
>> +    /* 2-way Set-Associativity */
>> +    Value = 0x4;
>> +    break;
>> +
>> +  case 3:
>> +    /* 4-way Set-Associativity */
>> +    Value = 0x5;
>> +    break;
>> +
>> +  case 7:
>> +    /* 8-way Set-Associativity */
>> +    Value = 0x7;
>> +    break;
>> +
>> +  case 15:
>> +    /* 16-way Set-Associativity */
>> +    Value = 0x8;
>> +    break;
>> +
>> +  case 11:
>> +    /* 12-way Set-Associativity */
>> +    Value = 0x9;
>> +    break;
>> +
>> +  case 23:
>> +    /* 24-way Set-Associativity */
>> +    Value = 0xA;
>> +    break;
>> +
>> +  case 31:
>> +    /* 32-way Set-Associativity */
>> +    Value = 0xB;
>> +    break;
>> +
>> +  case 47:
>> +    /* 48-way Set-Associativity */
>> +    Value = 0xC;
>> +    break;
>> +
>> +  case 63:
>> +    /* 64-way Set-Associativity */
>> +    Value = 0xD;
>> +    break;
>> +
>> +  case 19:
>> +    /* 20-way Set-Associativity */
>> +    Value = 0xE;
>> +    break;
>> +  }
>> +
>> +  return Value;
>> +}
>> +
>> +/**
>> +  Get the cache size.
>> +
>> +  @param    Level       Cache level.
>> +  @return   UINT32      Cache size.
>> +
>> +**/
>> +UINT32
>> +EFIAPI
>> +CpuGetCacheSize (
>> +  UINT32 Level
>> +  )
>> +{
>> +  UINT32 CacheLineSize;
>> +  UINT32 Count;
>> +  UINT64 CacheCCSIDR;
>> +  UINT64 CacheCLIDR;
>> +
>> +  CacheCLIDR = ReadCLIDR ();
>> +  if (!CLIDR_CTYPE (CacheCLIDR, Level)) {
>> +    return 0;
>> +  }
>> +
>> +  CacheCCSIDR = ReadCCSIDR (Level);
>> +  CacheLineSize = 1;
>> +  Count = CCSIDR_LINE_SIZE (CacheCCSIDR) + 4;
>> +  while (Count-- > 0) {
>> +    CacheLineSize *= 2;
>> +  }
>> +
>> +  return ((CCSIDR_NUMSETS (CacheCCSIDR) + 1) *
>> +          (CCSIDR_ASSOCIATIVITY (CacheCCSIDR) + 1) *
>> +          CacheLineSize);
>> +}
>> +
>> +/**
>> +  Get the number of supported socket.
>> +
>> +  @return   UINT8      Number of supported socket.
>> +
>> +**/
>> +UINT8
>> +EFIAPI
>> +GetNumberOfSupportedSockets (
>> +  VOID
>> +  )
>> +{
>> +  PLATFORM_INFO_HOB  *PlatformHob;
>> +
>> +  PlatformHob = GetPlatformHob ();
>> +  if (PlatformHob == NULL) {
>> +    //
>> +    // By default, the number of supported sockets is 1.
>> +    //
>> +    return 1;
>> +  }
>> +
>> +  return (sizeof (PlatformHob->ClusterEn) / sizeof (PLATFORM_CLUSTER_EN));
>> +}
>> +
>> +/**
>> +  Get the number of active socket.
>> +
>> +  @return   UINT8      Number of active socket.
>> +
>> +**/
>> +UINT8
>> +EFIAPI
>> +GetNumberOfActiveSockets (
>> +  VOID
>> +  )
>> +{
>> +  UINT8               NumberOfActiveSockets, Count, Index, Index1;
>> +  PLATFORM_CLUSTER_EN *Socket;
>> +  PLATFORM_INFO_HOB   *PlatformHob;
>> +
>> +  PlatformHob = GetPlatformHob ();
>> +  if (PlatformHob == NULL) {
>> +    //
>> +    // By default, the number of active sockets is 1.
>> +    //
>> +    return 1;
>> +  }
>> +
>> +  NumberOfActiveSockets = 0;
>> +
>> +  for (Index = 0; Index < GetNumberOfSupportedSockets (); Index++) {
>> +    Socket = &PlatformHob->ClusterEn[Index];
>> +    Count = ARRAY_SIZE (Socket->EnableMask);
>> +    for (Index1 = 0; Index1 < Count; Index1++) {
>> +      if (Socket->EnableMask[Index1] != 0) {
>> +        NumberOfActiveSockets++;
>> +        break;
>> +      }
>> +    }
>> +  }
>> +
>> +  return NumberOfActiveSockets;
>> +}
>> +
>> +/**
>> +  Get the number of active CPM per socket.
>> +
>> +  @param    SocketId    Socket index.
>> +  @return   UINT16      Number of CPM.
>> +
>> +**/
>> +UINT16
>> +EFIAPI
>> +GetNumberOfActiveCPMsPerSocket (
>> +  UINT8 SocketId
>> +  )
>> +{
>> +  UINT16              NumberOfCPMs, Count, Index;
>> +  UINT32              Val32;
>> +  PLATFORM_CLUSTER_EN *Socket;
>> +  PLATFORM_INFO_HOB   *PlatformHob;
>> +
>> +  PlatformHob = GetPlatformHob ();
>> +  if (PlatformHob == NULL) {
>> +    return 0;
>> +  }
>> +
>> +  if (SocketId >= GetNumberOfActiveSockets ()) {
>> +    return 0;
>> +  }
>> +
>> +  NumberOfCPMs = 0;
>> +  Socket = &PlatformHob->ClusterEn[SocketId];
>> +  Count = ARRAY_SIZE (Socket->EnableMask);
>> +  for (Index = 0; Index < Count; Index++) {
>> +    Val32 = Socket->EnableMask[Index];
>> +    while (Val32 > 0) {
>> +      if ((Val32 & 0x1) != 0) {
>> +        NumberOfCPMs++;
>> +      }
>> +      Val32 >>= 1;
>> +    }
>> +  }
>> +
>> +  return NumberOfCPMs;
>> +}
>> +
>> +/**
>> +  Get the number of configured CPM per socket. This number
>> +  should be the same for all sockets.
>> +
>> +  @param    SocketId    Socket index.
>> +  @return   UINT8       Number of configured CPM.
>> +
>> +**/
>> +UINT16
>> +EFIAPI
>> +GetNumberOfConfiguredCPMs (
>> +  UINT8 SocketId
>> +  )
>> +{
>> +  EFI_STATUS Status;
>> +  UINT32     Value;
>> +  UINT32     Param, ParamStart, ParamEnd;
>> +  UINT16     Count;
>> +
>> +  Count = 0;
>> +  ParamStart = NV_SI_S0_PCP_ACTIVECPM_0_31 + SocketId * NV_PARAM_ENTRYSIZE * (PLATFORM_CPU_MAX_CPM / 32);
>> +  ParamEnd = ParamStart + NV_PARAM_ENTRYSIZE * (PLATFORM_CPU_MAX_CPM / 32);
>> +  for (Param = ParamStart; Param < ParamEnd; Param += NV_PARAM_ENTRYSIZE) {
>> +    Status = NVParamGet (
>> +               Param,
>> +               NV_PERM_ATF | NV_PERM_BIOS | NV_PERM_MANU | NV_PERM_BMC,
>> +               &Value
>> +               );
>> +    if (EFI_ERROR (Status)) {
>> +      break;
>> +    }
>> +    while (Value != 0) {
>> +      if ((Value & 0x01) != 0) {
>> +        Count++;
>> +      }
>> +      Value >>= 1;
>> +    }
>> +  }
>> +
>> +  return Count;
>> +}
>> +
>> +/**
>> +  Set the number of configured CPM per socket.
>> +
>> +  @param    SocketId        Socket index.
>> +  @param    NumberOfCPMs    Number of CPM to be configured.
>> +  @return   EFI_SUCCESS     Operation succeeded.
>> +  @return   Others          An error has occurred.
>> +
>> +**/
>> +EFI_STATUS
>> +EFIAPI
>> +SetNumberOfConfiguredCPMs (
>> +  UINT8  SocketId,
>> +  UINT16 NumberOfCPMs
>> +  )
>> +{
>> +  EFI_STATUS Status;
>> +  UINT32     Value;
>> +  UINT32     Param, ParamStart, ParamEnd;
>> +  BOOLEAN    IsClear;
>> +
>> +  IsClear = FALSE;
>> +  if (NumberOfCPMs == 0) {
>> +    IsClear = TRUE;
>> +  }
>> +
>> +  Status = EFI_SUCCESS;
>> +
>> +  ParamStart = NV_SI_S0_PCP_ACTIVECPM_0_31 + SocketId * NV_PARAM_ENTRYSIZE * (PLATFORM_CPU_MAX_CPM / 32);
>> +  ParamEnd = ParamStart + NV_PARAM_ENTRYSIZE * (PLATFORM_CPU_MAX_CPM / 32);
>> +  for (Param = ParamStart; Param < ParamEnd; Param += NV_PARAM_ENTRYSIZE) {
>> +    if (NumberOfCPMs >= 32) {
>> +      Value = 0xffffffff;
>> +      NumberOfCPMs -= 32;
>> +    } else {
>> +      Value = 0;
>> +      while (NumberOfCPMs > 0) {
>> +        Value |= (1 << (--NumberOfCPMs));
>> +      }
>> +    }
>> +    if (IsClear) {
>> +      /* Clear this param */
>> +      Status = NVParamClr (
>> +                 Param,
>> +                 NV_PERM_BIOS | NV_PERM_MANU
>> +                 );
>> +    } else {
>> +      Status = NVParamSet (
>> +                 Param,
>> +                 NV_PERM_ATF | NV_PERM_BIOS | NV_PERM_MANU | NV_PERM_BMC,
>> +                 NV_PERM_BIOS | NV_PERM_MANU,
>> +                 Value
>> +                 );
>> +    }
>> +  }
>> +
>> +  return Status;
>> +}
>> +
>> +/**
>> +  Get the maximum number of core per socket.
>> +
>> +  @return   UINT16      Maximum number of core.
>> +
>> +**/
>> +UINT16
>> +EFIAPI
>> +GetMaximumNumberOfCores (
>> +  VOID
>> +  )
>> +{
>> +  PLATFORM_INFO_HOB  *PlatformHob;
>> +
>> +  PlatformHob = GetPlatformHob ();
>> +  if (PlatformHob == NULL) {
>> +    return 0;
>> +  }
>> +
>> +  return PlatformHob->MaxNumOfCore[0];
>> +}
>> +
>> +/**
>> +  Get the maximum number of CPM per socket. This number
>> +  should be the same for all sockets.
>> +
>> +  @return   UINT16      Maximum number of CPM.
>> +
>> +**/
>> +UINT16
>> +EFIAPI
>> +GetMaximumNumberOfCPMs (
>> +  VOID
>> +  )
>> +{
>> +  return GetMaximumNumberOfCores () / PLATFORM_CPU_NUM_CORES_PER_CPM;
>> +}
>> +
>> +/**
>> +  Get the number of active cores of a sockets.
>> +
>> +  @param    SocketId    Socket Index.
>> +  @return   UINT16      Number of active core.
>> +
>> +**/
>> +UINT16
>> +EFIAPI
>> +GetNumberOfActiveCoresPerSocket (
>> +  UINT8 SocketId
>> +  )
>> +{
>> +  return GetNumberOfActiveCPMsPerSocket (SocketId) * PLATFORM_CPU_NUM_CORES_PER_CPM;
>> +}
>> +
>> +/**
>> +  Get the number of active cores of all sockets.
>> +
>> +  @return   UINT16      Number of active core.
>> +
>> +**/
>> +UINT16
>> +EFIAPI
>> +GetNumberOfActiveCores (
>> +  VOID
>> +  )
>> +{
>> +  UINT16 NumberOfActiveCores;
>> +  UINT8  Index;
>> +
>> +  NumberOfActiveCores = 0;
>> +
>> +  for (Index = 0; Index < GetNumberOfActiveSockets (); Index++) {
>> +    NumberOfActiveCores += GetNumberOfActiveCoresPerSocket (Index);
>> +  }
>> +
>> +  return NumberOfActiveCores;
>> +}
>> +
>> +/**
>> +  Check if the logical CPU is enabled or not.
>> +
>> +  @param    CpuId       The logical Cpu ID. Started from 0.
>> +  @return   BOOLEAN     TRUE if the Cpu enabled
>> +                        FALSE if the Cpu disabled.
>> +
>> +**/
>> +BOOLEAN
>> +EFIAPI
>> +IsCpuEnabled (
>> +  UINT16 CpuId
>> +  )
>> +{
>> +  PLATFORM_CLUSTER_EN *Socket;
>> +  PLATFORM_INFO_HOB   *PlatformHob;
>> +  UINT8               SocketId;
>> +  UINT16              ClusterId;
>> +
>> +  SocketId = SOCKET_ID (CpuId);
>> +  ClusterId = CLUSTER_ID (CpuId);
>> +
>> +  PlatformHob = GetPlatformHob ();
>> +  if (PlatformHob == NULL) {
>> +    return FALSE;
>> +  }
>> +
>> +  if (SocketId >= GetNumberOfActiveSockets ()) {
>> +    return FALSE;
>> +  }
>> +
>> +  Socket = &PlatformHob->ClusterEn[SocketId];
>> +  if ((Socket->EnableMask[ClusterId / 32] & (1 << (ClusterId % 32))) != 0) {
>> +    return TRUE;
>> +  }
>> +
>> +  return FALSE;
>> +}
>> +
>> +/**
>> +  Check if the slave socket is present
>> +
>> +  @return   BOOLEAN     TRUE if the Slave Cpu is present
>> +                        FALSE if the Slave Cpu is not present
>> +
>> +**/
>> +BOOLEAN
>> +EFIAPI
>> +IsSlaveSocketPresent (
>> +  VOID
>> +  )
>> +{
>> +  UINT32 Value;
>> +
>> +  Value = MmioRead32 (SMPRO_EFUSE_SHADOW0 + CFG2P_OFFSET);
>> +
>> +  return ((Value & SLAVE_PRESENT_N) != 0) ? FALSE : TRUE;
>> +}
>> +
>> +/**
>> +  Check if the slave socket is active
>> +
>> +  @return   BOOLEAN     TRUE if the Slave CPU Socket is active.
>> +                        FALSE if the Slave CPU Socket is not active.
>> +
>> +**/
>> +BOOLEAN
>> +EFIAPI
>> +IsSlaveSocketActive (
>> +  VOID
>> +  )
>> +{
>> +  return (GetNumberOfActiveSockets () > 1) ? TRUE : FALSE;
>> +}
>> +
>> +/**
>> +  Check if the CPU product ID is Ac01
>> +  @return   BOOLEAN     TRUE if the Product ID is Ac01
>> +                        FALSE otherwise.
>> +
>> +**/
>> +BOOLEAN
>> +EFIAPI
>> +IsAc01Processor (
>> +  VOID
>> +  )
>> +{
>> +  PLATFORM_INFO_HOB  *PlatformHob;
>> +
>> +  PlatformHob = GetPlatformHob ();
>> +  ASSERT (PlatformHob != NULL);
>> +
>> +  if (PlatformHob != NULL) {
>> +    if ((PlatformHob->ScuProductId[0] & 0xFF) == 0x01) {
>> +      return TRUE;
>> +    }
>> +  }
>> +
>> +  return FALSE;
>> +}
>
>
>> diff --git a/Silicon/Ampere/AmpereAltraPkg/Library/ArmPlatformLib/ArmPlatformLib.c b/Silicon/Ampere/AmpereAltraPkg/Library/ArmPlatformLib/ArmPlatformLib.c
>> new file mode 100644
>> index 000000000000..8c1eb93f00fd
>> --- /dev/null
>> +++ b/Silicon/Ampere/AmpereAltraPkg/Library/ArmPlatformLib/ArmPlatformLib.c
>> @@ -0,0 +1,169 @@
>> +/** @file
>> +
>> +  Copyright (c) 2020 - 2021, Ampere Computing LLC. All rights reserved.<BR>
>> +
>> +  SPDX-License-Identifier: BSD-2-Clause-Patent
>> +
>> +**/
>> +
>> +#include <Uefi.h>
>> +
>> +#include <Guid/PlatformInfoHobGuid.h>
>> +#include <Library/AmpereCpuLib.h>
>> +#include <Library/ArmLib.h>
>> +#include <Library/ArmPlatformLib.h>
>> +#include <Library/BaseMemoryLib.h>
>> +#include <Library/DebugLib.h>
>> +#include <Library/HobLib.h>
>> +#include <Library/IoLib.h>
>> +#include <Library/MemoryAllocationLib.h>
>> +#include <Library/PcdLib.h>
>> +#include <Library/PL011UartLib.h>
>> +#include <Library/SerialPortLib.h>
>> +#include <Platform/Ac01.h>
>> +#include <PlatformInfoHob.h>
>> +#include <Ppi/ArmMpCoreInfo.h>
>> +#include <Ppi/TemporaryRamSupport.h>
>> +
>> +ARM_CORE_INFO mArmPlatformMpCoreInfoTable[PLATFORM_CPU_MAX_NUM_CORES];
>> +
>> +/**
>> +  Return the current Boot Mode
>> +
>> +  This function returns the boot reason on the platform
>> +
>> +  @return   Return the current Boot Mode of the platform
>> +
>> +**/
>> +EFI_BOOT_MODE
>> +ArmPlatformGetBootMode (
>> +  VOID
>> +  )
>> +{
>> +  return BOOT_WITH_FULL_CONFIGURATION;
>> +}
>> +
>> +/**
>> +  Initialize controllers that must setup in the normal world
>> +
>> +  This function is called by the ArmPlatformPkg/PrePi or ArmPlatformPkg/PlatformPei
>> +  in the PEI phase.
>> +
>> +**/
>> +EFI_STATUS
>> +ArmPlatformInitialize (
>> +  IN UINTN MpId
>> +  )
>> +{
>> +  RETURN_STATUS      Status;
>> +  UINT64             BaudRate;
>> +  UINT32             ReceiveFifoDepth;
>> +  EFI_PARITY_TYPE    Parity;
>> +  UINT8              DataBits;
>> +  EFI_STOP_BITS_TYPE StopBits;
>> +
>> +  Status = EFI_SUCCESS;
>> +
>> +  if (FixedPcdGet64 (PcdSerialRegisterBase) != 0) {
>> +    /* Debug port should use the same parameters with console */
>> +    BaudRate = FixedPcdGet64 (PcdUartDefaultBaudRate);
>> +    ReceiveFifoDepth = FixedPcdGet32 (PcdUartDefaultReceiveFifoDepth);
>> +    Parity = (EFI_PARITY_TYPE)FixedPcdGet8 (PcdUartDefaultParity);
>> +    DataBits = FixedPcdGet8 (PcdUartDefaultDataBits);
>> +    StopBits = (EFI_STOP_BITS_TYPE)FixedPcdGet8 (PcdUartDefaultStopBits);
>> +
>> +    /* Initialize uart debug port */
>> +    Status = PL011UartInitializePort (
>> +               (UINTN)FixedPcdGet64 (PcdSerialRegisterBase),
>> +               FixedPcdGet32 (PL011UartClkInHz),
>> +               &BaudRate,
>> +               &ReceiveFifoDepth,
>> +               &Parity,
>> +               &DataBits,
>> +               &StopBits
>> +               );
>> +  }
>> +
>> +  return Status;
>> +}
>> +
>> +EFI_STATUS
>> +PrePeiCoreGetMpCoreInfo (
>> +  OUT UINTN         *CoreCount,
>> +  OUT ARM_CORE_INFO **ArmCoreTable
>> +  )
>> +{
>> +  UINTN              mArmPlatformCoreCount;
>> +  UINTN              ClusterId;
>> +  UINTN              SocketId;
>> +  UINTN              Index;
>> +
>> +  ASSERT (CoreCount != NULL);
>> +  ASSERT (ArmCoreTable != NULL);
>> +  ASSERT (*ArmCoreTable != NULL);
>> +
>> +  mArmPlatformCoreCount = 0;
>> +  for  (Index = 0; Index < PLATFORM_CPU_MAX_NUM_CORES; Index++) {
>> +    if (!IsCpuEnabled (Index)) {
>> +      continue;
>> +    }
>> +    SocketId = SOCKET_ID (Index);
>> +    ClusterId = CLUSTER_ID (Index);
>> +    mArmPlatformMpCoreInfoTable[mArmPlatformCoreCount].ClusterId = SocketId;
>> +    mArmPlatformMpCoreInfoTable[mArmPlatformCoreCount].CoreId =
>> +      (ClusterId << 8) | (Index % PLATFORM_CPU_NUM_CORES_PER_CPM);
>> +    mArmPlatformMpCoreInfoTable[mArmPlatformCoreCount].MailboxClearAddress = 0;
>> +    mArmPlatformMpCoreInfoTable[mArmPlatformCoreCount].MailboxClearValue = 0;
>> +    mArmPlatformMpCoreInfoTable[mArmPlatformCoreCount].MailboxGetAddress = 0;
>> +    mArmPlatformMpCoreInfoTable[mArmPlatformCoreCount].MailboxSetAddress = 0;
>> +    mArmPlatformCoreCount++;
>> +  }
>> +
>> +  *CoreCount = mArmPlatformCoreCount;
>> +
>> +  *ArmCoreTable = mArmPlatformMpCoreInfoTable;
>> +  ASSERT (*ArmCoreTable != NULL);
>> +
>> +  return EFI_SUCCESS;
>> +}
>> +
>> +// Needs to be declared in the file. Otherwise gArmMpCoreInfoPpiGuid is undefined in the contect of PrePeiCore
>> +EFI_GUID             mArmMpCoreInfoPpiGuid = ARM_MP_CORE_INFO_PPI_GUID;
>> +ARM_MP_CORE_INFO_PPI mMpCoreInfoPpi = { PrePeiCoreGetMpCoreInfo };
>> +
>> +EFI_PEI_PPI_DESCRIPTOR gPlatformPpiTable[] = {
>> +  {
>> +    EFI_PEI_PPI_DESCRIPTOR_PPI,
>> +    &mArmMpCoreInfoPpiGuid,
>> +    &mMpCoreInfoPpi
>> +  },
>> +};
>> +
>> +/**
>> +  Return the Platform specific PPIs
>> +
>> +  This function exposes the Platform Specific PPIs. They can be used by any PrePi modules or passed
>> +  to the PeiCore by PrePeiCore.
>> +
>> +  @param[out]   PpiListSize         Size in Bytes of the Platform PPI List
>> +  @param[out]   PpiList             Platform PPI List
>> +
>> +**/
>> +VOID
>> +ArmPlatformGetPlatformPpiList (
>> +  OUT UINTN                  *PpiListSize,
>> +  OUT EFI_PEI_PPI_DESCRIPTOR **PpiList
>> +  )
>> +{
>> +  ASSERT (PpiListSize != NULL);
>> +  ASSERT (PpiList != NULL);
>> +  ASSERT (*PpiList != NULL);
>> +
>> +  if (ArmIsMpCore ()) {
>> +    *PpiListSize = sizeof (gPlatformPpiTable);
>> +    *PpiList = gPlatformPpiTable;
>> +  } else {
>> +    *PpiListSize = 0;
>> +    *PpiList = NULL;
>> +  }
>> +}
>> diff --git a/Silicon/Ampere/AmpereAltraPkg/Library/ArmPlatformLib/ArmPlatformLibMemory.c b/Silicon/Ampere/AmpereAltraPkg/Library/ArmPlatformLib/ArmPlatformLibMemory.c
>> new file mode 100644
>> index 000000000000..117c9cc56ac2
>> --- /dev/null
>> +++ b/Silicon/Ampere/AmpereAltraPkg/Library/ArmPlatformLib/ArmPlatformLibMemory.c
>> @@ -0,0 +1,399 @@
>> +/** @file
>> +
>> +  Copyright (c) 2020 - 2021, Ampere Computing LLC. All rights reserved.<BR>
>> +
>> +  SPDX-License-Identifier: BSD-2-Clause-Patent
>> +
>> +**/
>> +
>> +#include <Uefi.h>
>> +
>> +#include <Guid/PlatformInfoHobGuid.h>
>> +#include <Library/AmpereCpuLib.h>
>> +#include <Library/ArmPlatformLib.h>
>> +#include <Library/DebugLib.h>
>> +#include <Library/HobLib.h>
>> +#include <Library/MemoryAllocationLib.h>
>> +#include <Library/PcdLib.h>
>> +#include <PlatformInfoHob.h>
>> +
>> +/* Number of Virtual Memory Map Descriptors */
>> +#define MAX_VIRTUAL_MEMORY_MAP_DESCRIPTORS          50
>> +
>> +/* DDR attributes */
>> +#define DDR_ATTRIBUTES_CACHED           ARM_MEMORY_REGION_ATTRIBUTE_WRITE_BACK
>> +#define DDR_ATTRIBUTES_UNCACHED         ARM_MEMORY_REGION_ATTRIBUTE_UNCACHED_UNBUFFERED
>> +
>> +/**
>> +  Return the Virtual Memory Map of your platform
>> +
>> +  This Virtual Memory Map is used by MemoryInitPei Module to initialize the MMU on your platform.
>> +
>> +  @param[out]   VirtualMemoryMap    Array of ARM_MEMORY_REGION_DESCRIPTOR describing a Physical-to-
>> +                                    Virtual Memory mapping. This array must be ended by a zero-filled
>> +                                    entry
>> +
>> +**/
>> +VOID
>> +ArmPlatformGetVirtualMemoryMap (
>> +  OUT ARM_MEMORY_REGION_DESCRIPTOR **VirtualMemoryMap
>> +  )
>> +{
>> +  UINTN                        Index = 0;
>> +  ARM_MEMORY_REGION_DESCRIPTOR *VirtualMemoryTable;
>> +  UINT32                       NumRegion;
>> +  UINTN                        Count;
>> +  VOID                         *Hob;
>> +  PLATFORM_INFO_HOB            *PlatformHob;
>> +
>> +  Hob = GetFirstGuidHob (&gPlatformHobGuid);
>> +  ASSERT (Hob != NULL);
>> +  if (Hob == NULL) {
>> +    return;
>> +  }
>> +
>> +  PlatformHob = (PLATFORM_INFO_HOB *)GET_GUID_HOB_DATA (Hob);
>> +
>> +  ASSERT (VirtualMemoryMap != NULL);
>> +
>> +  VirtualMemoryTable = (ARM_MEMORY_REGION_DESCRIPTOR *)AllocatePages (EFI_SIZE_TO_PAGES (sizeof (ARM_MEMORY_REGION_DESCRIPTOR) * MAX_VIRTUAL_MEMORY_MAP_DESCRIPTORS));
>> +  if (VirtualMemoryTable == NULL) {
>> +    return;
>> +  }
>> +
>> +  /* For Address space 0x1000_0000_0000 to 0x1001_00FF_FFFF
>> +   *  - Device memory
>> +   */
>> +  VirtualMemoryTable[Index].PhysicalBase = 0x100000000000ULL;
>> +  VirtualMemoryTable[Index].VirtualBase  = 0x100000000000ULL;
>> +  VirtualMemoryTable[Index].Length       = 0x102000000ULL;
> Please move all of these live-coded addresses/sizes to a private .h
> and use symbolic names here.
>
>> +  VirtualMemoryTable[Index].Attributes   = ARM_MEMORY_REGION_ATTRIBUTE_DEVICE;
>> +
>> +  /* For Address space 0x5000_0000_0000 to 0x5001_00FF_FFFF
>> +   *  - Device memory
>> +   */
>> +  if (IsSlaveSocketActive ())
>> +  {
>> +    VirtualMemoryTable[++Index].PhysicalBase = 0x500000000000ULL;
>> +    VirtualMemoryTable[Index].VirtualBase  = 0x500000000000ULL;
>> +    VirtualMemoryTable[Index].Length       = 0x101000000ULL;
>> +    VirtualMemoryTable[Index].Attributes   = ARM_MEMORY_REGION_ATTRIBUTE_DEVICE;
>> +  }
>> +
>> +  /*
>> +   *  - PCIe RCA0 Device memory
>> +   */
>> +  VirtualMemoryTable[++Index].PhysicalBase = 0x300000000000ULL;
>> +  VirtualMemoryTable[Index].VirtualBase  = 0x300000000000ULL;
>> +  VirtualMemoryTable[Index].Length       = 0x40000000000ULL;
>> +  VirtualMemoryTable[Index].Attributes   = ARM_MEMORY_REGION_ATTRIBUTE_DEVICE;
>> +
>> +  /*
>> +   *  - 2P/PCIe Socket0 RCA0 32-bit Device memory
>> +   *  - 1P/PCIe consolidated to RCB2 32-bit Device memory
>> +   */
>> +  VirtualMemoryTable[++Index].PhysicalBase = 0x20000000ULL;
>> +  VirtualMemoryTable[Index].VirtualBase  = 0x20000000ULL;
>> +  VirtualMemoryTable[Index].Length       = 0x8000000ULL;
>> +  VirtualMemoryTable[Index].Attributes   = ARM_MEMORY_REGION_ATTRIBUTE_DEVICE;
>> +
>> +  /*
>> +   *  - PCIe RCA1 Device memory
>> +   */
>> +  VirtualMemoryTable[++Index].PhysicalBase = 0x340000000000ULL;
>> +  VirtualMemoryTable[Index].VirtualBase  = 0x340000000000ULL;
>> +  VirtualMemoryTable[Index].Length       = 0x40000000000ULL;
>> +  VirtualMemoryTable[Index].Attributes   = ARM_MEMORY_REGION_ATTRIBUTE_DEVICE;
>> +
>> +  /*
>> +   *  - 2P/PCIe Socket0 RCA1 32-bit Device memory
>> +   *  - 1P/PCIe consolidated to RCB2 32-bit Device memory
>> +   */
>> +  VirtualMemoryTable[++Index].PhysicalBase = 0x28000000ULL;
>> +  VirtualMemoryTable[Index].VirtualBase  = 0x28000000ULL;
>> +  VirtualMemoryTable[Index].Length       = 0x8000000ULL;
>> +  VirtualMemoryTable[Index].Attributes   = ARM_MEMORY_REGION_ATTRIBUTE_DEVICE;
>> +
>> +  /*
>> +   *  - PCIe RCA2 Device memory
>> +   */
>> +  VirtualMemoryTable[++Index].PhysicalBase = 0x380000000000ULL;
>> +  VirtualMemoryTable[Index].VirtualBase  = 0x380000000000ULL;
>> +  VirtualMemoryTable[Index].Length       = 0x40000000000ULL;
>> +  VirtualMemoryTable[Index].Attributes   = ARM_MEMORY_REGION_ATTRIBUTE_DEVICE;
>> +
>> +  /*
>> +   *  - 2P/PCIe Socket0 RCA2 32-bit Device memory
>> +   *  - 1P/PCIe consolidated to RCB3 32-bit Device memory
>> +   */
>> +  VirtualMemoryTable[++Index].PhysicalBase = 0x30000000ULL;
>> +  VirtualMemoryTable[Index].VirtualBase  = 0x30000000ULL;
>> +  VirtualMemoryTable[Index].Length       = 0x8000000ULL;
>> +  VirtualMemoryTable[Index].Attributes   = ARM_MEMORY_REGION_ATTRIBUTE_DEVICE;
>> +
>> +  /*
>> +   *  - PCIe RCA3 Device memory
>> +   */
>> +  VirtualMemoryTable[++Index].PhysicalBase = 0x3C0000000000ULL;
>> +  VirtualMemoryTable[Index].VirtualBase  = 0x3C0000000000ULL;
>> +  VirtualMemoryTable[Index].Length       = 0x40000000000ULL;
>> +  VirtualMemoryTable[Index].Attributes   = ARM_MEMORY_REGION_ATTRIBUTE_DEVICE;
>> +
>> +  /*
>> +   *  - 2P/PCIe Socket0 RCA3 32-bit Device memory
>> +   *  - 1P/PCIe consolidated to RCB3 32-bit Device memory
>> +   */
>> +  VirtualMemoryTable[++Index].PhysicalBase = 0x38000000ULL;
>> +  VirtualMemoryTable[Index].VirtualBase  = 0x38000000ULL;
>> +  VirtualMemoryTable[Index].Length       = 0x8000000ULL;
>> +  VirtualMemoryTable[Index].Attributes   = ARM_MEMORY_REGION_ATTRIBUTE_DEVICE;
>> +
>> +  /*
>> +   *  - PCIe RCB0 Device memory
>> +   */
>> +  VirtualMemoryTable[++Index].PhysicalBase = 0x200000000000ULL;
>> +  VirtualMemoryTable[Index].VirtualBase  = 0x200000000000ULL;
>> +  VirtualMemoryTable[Index].Length       = 0x40000000000ULL;
>> +  VirtualMemoryTable[Index].Attributes   = ARM_MEMORY_REGION_ATTRIBUTE_DEVICE;
>> +
>> +  /*
>> +   *  - 2P/PCIe Socket0 RCB0 32-bit Device memory
>> +   *  - 1P/PCIe consolidated to RCB0 32-bit Device memory
>> +   */
>> +  VirtualMemoryTable[++Index].PhysicalBase = 0x00000000ULL;
>> +  VirtualMemoryTable[Index].VirtualBase  = 0x00000000ULL;
>> +  VirtualMemoryTable[Index].Length       = 0x8000000ULL;
>> +  VirtualMemoryTable[Index].Attributes   = ARM_MEMORY_REGION_ATTRIBUTE_DEVICE;
>> +
>> +  /*
>> +   *  - PCIe RCB1 Device memory
>> +   */
>> +  VirtualMemoryTable[++Index].PhysicalBase = 0x240000000000ULL;
>> +  VirtualMemoryTable[Index].VirtualBase  = 0x240000000000ULL;
>> +  VirtualMemoryTable[Index].Length       = 0x40000000000ULL;
>> +  VirtualMemoryTable[Index].Attributes   = ARM_MEMORY_REGION_ATTRIBUTE_DEVICE;
>> +
>> +  /*
>> +   *  - 2P/PCIe Socket0 RCB1 32-bit Device memory
>> +   *  - 1P/PCIe consolidated to RCB0 32-bit Device memory
>> +   */
>> +  VirtualMemoryTable[++Index].PhysicalBase = 0x08000000ULL;
>> +  VirtualMemoryTable[Index].VirtualBase  = 0x08000000ULL;
>> +  VirtualMemoryTable[Index].Length       = 0x8000000ULL;
>> +  VirtualMemoryTable[Index].Attributes   = ARM_MEMORY_REGION_ATTRIBUTE_DEVICE;
>> +
>> +  /*
>> +   *  - PCIe RCB2 Device memory
>> +   */
>> +  VirtualMemoryTable[++Index].PhysicalBase = 0x280000000000ULL;
>> +  VirtualMemoryTable[Index].VirtualBase  = 0x280000000000ULL;
>> +  VirtualMemoryTable[Index].Length       = 0x40000000000ULL;
>> +  VirtualMemoryTable[Index].Attributes   = ARM_MEMORY_REGION_ATTRIBUTE_DEVICE;
>> +
>> +  /*
>> +   *  - 2P/PCIe Socket0 RCB2 32-bit Device memory
>> +   *  - 1P/PCIe consolidated to RCB1 32-bit Device memory
>> +   */
>> +  VirtualMemoryTable[++Index].PhysicalBase = 0x10000000ULL;
>> +  VirtualMemoryTable[Index].VirtualBase  = 0x10000000ULL;
>> +  VirtualMemoryTable[Index].Length       = 0x8000000ULL;
>> +  VirtualMemoryTable[Index].Attributes   = ARM_MEMORY_REGION_ATTRIBUTE_DEVICE;
>> +
>> +  /*
>> +   *  - PCIe RCB3 Device memory
>> +   */
>> +  VirtualMemoryTable[++Index].PhysicalBase = 0x2C0000000000ULL;
>> +  VirtualMemoryTable[Index].VirtualBase  = 0x2C0000000000ULL;
>> +  VirtualMemoryTable[Index].Length       = 0x40000000000ULL;
>> +  VirtualMemoryTable[Index].Attributes   = ARM_MEMORY_REGION_ATTRIBUTE_DEVICE;
>> +
>> +  /*
>> +   *  - 2P/PCIe Socket0 RCB3 32-bit Device memory
>> +   *  - 1P/PCIe consolidated to RCB1 32-bit Device memory
>> +   */
>> +  VirtualMemoryTable[++Index].PhysicalBase = 0x18000000ULL;
>> +  VirtualMemoryTable[Index].VirtualBase  = 0x18000000ULL;
>> +  VirtualMemoryTable[Index].Length       = 0x8000000ULL;
>> +  VirtualMemoryTable[Index].Attributes   = ARM_MEMORY_REGION_ATTRIBUTE_DEVICE;
>> +
>> +  if (IsSlaveSocketActive ()) {
>> +    // Slave socket exist
>> +    /*
>> +     *  - PCIe RCA0 Device memory
>> +     */
>> +    VirtualMemoryTable[++Index].PhysicalBase = 0x700000000000ULL;
>> +    VirtualMemoryTable[Index].VirtualBase  = 0x700000000000ULL;
>> +    VirtualMemoryTable[Index].Length       = 0x40000000000ULL;
>> +    VirtualMemoryTable[Index].Attributes   = ARM_MEMORY_REGION_ATTRIBUTE_DEVICE;
>> +
>> +    /*
>> +     *  - PCIe RCA1 Device memory
>> +     */
>> +    VirtualMemoryTable[++Index].PhysicalBase = 0x740000000000ULL;
>> +    VirtualMemoryTable[Index].VirtualBase  = 0x740000000000ULL;
>> +    VirtualMemoryTable[Index].Length       = 0x40000000000ULL;
>> +    VirtualMemoryTable[Index].Attributes   = ARM_MEMORY_REGION_ATTRIBUTE_DEVICE;
>> +
>> +    /*
>> +     *  - PCIe RCA2 Device memory
>> +     */
>> +    VirtualMemoryTable[++Index].PhysicalBase = 0x780000000000ULL;
>> +    VirtualMemoryTable[Index].VirtualBase  = 0x780000000000ULL;
>> +    VirtualMemoryTable[Index].Length       = 0x40000000000ULL;
>> +    VirtualMemoryTable[Index].Attributes   = ARM_MEMORY_REGION_ATTRIBUTE_DEVICE;
>> +
>> +    /*
>> +     *  - PCIe RCA3 Device memory
>> +     */
>> +    VirtualMemoryTable[++Index].PhysicalBase = 0x7C0000000000ULL;
>> +    VirtualMemoryTable[Index].VirtualBase  = 0x7C0000000000ULL;
>> +    VirtualMemoryTable[Index].Length       = 0x40000000000ULL;
>> +    VirtualMemoryTable[Index].Attributes   = ARM_MEMORY_REGION_ATTRIBUTE_DEVICE;
>> +
>> +    /*
>> +     *  - PCIe RCB0 Device memory
>> +     */
>> +    VirtualMemoryTable[++Index].PhysicalBase = 0x600000000000ULL;
>> +    VirtualMemoryTable[Index].VirtualBase  = 0x600000000000ULL;
>> +    VirtualMemoryTable[Index].Length       = 0x40000000000ULL;
>> +    VirtualMemoryTable[Index].Attributes   = ARM_MEMORY_REGION_ATTRIBUTE_DEVICE;
>> +
>> +    /*
>> +     *  - PCIe RCB1 Device memory
>> +     */
>> +    VirtualMemoryTable[++Index].PhysicalBase = 0x640000000000ULL;
>> +    VirtualMemoryTable[Index].VirtualBase  = 0x640000000000ULL;
>> +    VirtualMemoryTable[Index].Length       = 0x40000000000ULL;
>> +    VirtualMemoryTable[Index].Attributes   = ARM_MEMORY_REGION_ATTRIBUTE_DEVICE;
>> +
>> +    /*
>> +     *  - PCIe RCB2 Device memory
>> +     */
>> +    VirtualMemoryTable[++Index].PhysicalBase = 0x680000000000ULL;
>> +    VirtualMemoryTable[Index].VirtualBase  = 0x680000000000ULL;
>> +    VirtualMemoryTable[Index].Length       = 0x40000000000ULL;
>> +    VirtualMemoryTable[Index].Attributes   = ARM_MEMORY_REGION_ATTRIBUTE_DEVICE;
>> +
>> +    /*
>> +     *  - PCIe RCB3 Device memory
>> +     */
>> +    VirtualMemoryTable[++Index].PhysicalBase = 0x6C0000000000ULL;
>> +    VirtualMemoryTable[Index].VirtualBase  = 0x6C0000000000ULL;
>> +    VirtualMemoryTable[Index].Length       = 0x40000000000ULL;
>> +    VirtualMemoryTable[Index].Attributes   = ARM_MEMORY_REGION_ATTRIBUTE_DEVICE;
>> +  }
>> +
>> +  /*
>> +   *  - 2P/PCIe Socket1 RCA0 32-bit Device memory
>> +   *  - 1P/PCIe consolidated to RCA2 32-bit Device memory
>> +   */
>> +  VirtualMemoryTable[++Index].PhysicalBase = 0x60000000ULL;
>> +  VirtualMemoryTable[Index].VirtualBase  = 0x60000000ULL;
>> +  VirtualMemoryTable[Index].Length       = 0x8000000ULL;
>> +  VirtualMemoryTable[Index].Attributes   = ARM_MEMORY_REGION_ATTRIBUTE_DEVICE;
>> +
>> +  /*
>> +   *  - 2P/PCIe Socket1 RCA1 32-bit Device memory
>> +   *  - 1P/PCIe consolidated to RCA2 32-bit Device memory
>> +   */
>> +  VirtualMemoryTable[++Index].PhysicalBase = 0x68000000ULL;
>> +  VirtualMemoryTable[Index].VirtualBase  = 0x68000000ULL;
>> +  VirtualMemoryTable[Index].Length       = 0x8000000ULL;
>> +  VirtualMemoryTable[Index].Attributes   = ARM_MEMORY_REGION_ATTRIBUTE_DEVICE;
>> +
>> +  /*
>> +   *  - 2P/PCIe Socket1 RCA2 32-bit Device memory
>> +   *  - 1P/PCIe consolidated to RCA3 32-bit Device memory
>> +   */
>> +  VirtualMemoryTable[++Index].PhysicalBase = 0x70000000ULL;
>> +  VirtualMemoryTable[Index].VirtualBase  = 0x70000000ULL;
>> +  VirtualMemoryTable[Index].Length       = 0x8000000ULL;
>> +  VirtualMemoryTable[Index].Attributes   = ARM_MEMORY_REGION_ATTRIBUTE_DEVICE;
>> +
>> +  /*
>> +   *  - 2P/PCIe Socket1 RCA3 32-bit Device memory
>> +   *  - 1P/PCIe consolidated to RCA3 32-bit Device memory
>> +   */
>> +  VirtualMemoryTable[++Index].PhysicalBase = 0x78000000ULL;
>> +  VirtualMemoryTable[Index].VirtualBase  = 0x78000000ULL;
>> +  VirtualMemoryTable[Index].Length       = 0x8000000ULL;
>> +  VirtualMemoryTable[Index].Attributes   = ARM_MEMORY_REGION_ATTRIBUTE_DEVICE;
>> +
>> +  /*
>> +   *  - 2P/PCIe Socket1 RCB0 32-bit Device memory
>> +   *  - 1P/PCIe consolidated to RCA0 32-bit Device memory
>> +   */
>> +  VirtualMemoryTable[++Index].PhysicalBase = 0x40000000ULL;
>> +  VirtualMemoryTable[Index].VirtualBase  = 0x40000000ULL;
>> +  VirtualMemoryTable[Index].Length       = 0x8000000ULL;
>> +  VirtualMemoryTable[Index].Attributes   = ARM_MEMORY_REGION_ATTRIBUTE_DEVICE;
>> +
>> +  /*
>> +   *  - 2P/PCIe Socket1 RCB1 32-bit Device memory
>> +   *  - 1P/PCIe consolidated to RCA0 32-bit Device memory
>> +   */
>> +  VirtualMemoryTable[++Index].PhysicalBase = 0x48000000ULL;
>> +  VirtualMemoryTable[Index].VirtualBase  = 0x48000000ULL;
>> +  VirtualMemoryTable[Index].Length       = 0x8000000ULL;
>> +  VirtualMemoryTable[Index].Attributes   = ARM_MEMORY_REGION_ATTRIBUTE_DEVICE;
>> +
>> +  /*
>> +   *  - 2P/PCIe Socket1 RCB2 32-bit Device memory
>> +   *  - 1P/PCIe consolidated to RCA1 32-bit Device memory
>> +   */
>> +  VirtualMemoryTable[++Index].PhysicalBase = 0x50000000ULL;
>> +  VirtualMemoryTable[Index].VirtualBase  = 0x50000000ULL;
>> +  VirtualMemoryTable[Index].Length       = 0x8000000ULL;
>> +  VirtualMemoryTable[Index].Attributes   = ARM_MEMORY_REGION_ATTRIBUTE_DEVICE;
>> +
>> +  /*
>> +   *  - 2P/PCIe Socket1 RCB3 32-bit Device memory
>> +   *  - 1P/PCIe consolidated to RCA1 32-bit Device memory
>> +   */
>> +  VirtualMemoryTable[++Index].PhysicalBase = 0x58000000ULL;
>> +  VirtualMemoryTable[Index].VirtualBase  = 0x58000000ULL;
>> +  VirtualMemoryTable[Index].Length       = 0x8000000ULL;
>> +  VirtualMemoryTable[Index].Attributes   = ARM_MEMORY_REGION_ATTRIBUTE_DEVICE;
>> +
>> +  /*
>> +   *  - BERT memory region
>> +   */
>> +  VirtualMemoryTable[++Index].PhysicalBase = 0x88230000ULL;
>> +  VirtualMemoryTable[Index].VirtualBase  = 0x88230000ULL;
>> +  VirtualMemoryTable[Index].Length       = 0x50000ULL;
>> +  VirtualMemoryTable[Index].Attributes   = ARM_MEMORY_REGION_ATTRIBUTE_DEVICE;
>> +
>> +  /*
>> +   *  - DDR memory region
>> +   */
>> +  NumRegion = PlatformHob->DramInfo.NumRegion;
>> +  Count = 0;
>> +  while (NumRegion-- > 0) {
>> +    if (PlatformHob->DramInfo.NvdRegion[Count]) { /* Skip NVDIMM Region */
>> +      Count++;
>> +      continue;
>> +    }
>> +
>> +    VirtualMemoryTable[++Index].PhysicalBase = PlatformHob->DramInfo.Base[Count];
>> +    VirtualMemoryTable[Index].VirtualBase  = PlatformHob->DramInfo.Base[Count];
>> +    VirtualMemoryTable[Index].Length       = PlatformHob->DramInfo.Size[Count];
>> +    VirtualMemoryTable[Index].Attributes   = DDR_ATTRIBUTES_CACHED;
>> +    Count++;
>> +  }
>> +
>> +  /* SPM MM NS Buffer for MmCommunicateDxe */
>> +  VirtualMemoryTable[++Index].PhysicalBase = PcdGet64 (PcdMmBufferBase);
>> +  VirtualMemoryTable[Index].VirtualBase  = PcdGet64 (PcdMmBufferBase);
>> +  VirtualMemoryTable[Index].Length       = PcdGet64 (PcdMmBufferSize);
>> +  VirtualMemoryTable[Index].Attributes   = DDR_ATTRIBUTES_CACHED;
>> +
>> +  /* End of Table */
>> +  VirtualMemoryTable[++Index].PhysicalBase = 0;
>> +  VirtualMemoryTable[Index].VirtualBase  = 0;
>> +  VirtualMemoryTable[Index].Length       = 0;
>> +  VirtualMemoryTable[Index].Attributes   = (ARM_MEMORY_REGION_ATTRIBUTES)0;
>> +
>> +  ASSERT ((Index + 1) <= MAX_VIRTUAL_MEMORY_MAP_DESCRIPTORS);
>> +
>> +  *VirtualMemoryMap = VirtualMemoryTable;
>> +}
>
>
>> diff --git a/Silicon/Ampere/AmpereAltraPkg/Library/MailboxInterfaceLib/MailboxInterfaceLib.c b/Silicon/Ampere/AmpereAltraPkg/Library/MailboxInterfaceLib/MailboxInterfaceLib.c
>> new file mode 100644
>> index 000000000000..0da1f90699f6
>> --- /dev/null
>> +++ b/Silicon/Ampere/AmpereAltraPkg/Library/MailboxInterfaceLib/MailboxInterfaceLib.c
>> @@ -0,0 +1,282 @@
>> +/** @file
>> +  The library implements the hardware Mailbox (Doorbell) interface for communication
>> +  between the Application Processor (ARMv8) and the System Control Processors (SMpro/PMpro).
>> +
>> +  Copyright (c) 2021, Ampere Computing LLC. All rights reserved.<BR>
>> +
>> +  SPDX-License-Identifier: BSD-2-Clause-Patent
>> +
>> +**/
>> +
>> +#include <Uefi.h>
>> +
>> +#include <Library/AmpereCpuLib.h>
>> +#include <Library/BaseMemoryLib.h>
>> +#include <Library/DebugLib.h>
>> +#include <Library/MailboxInterfaceLib.h>
>> +#include <Library/TimerLib.h>
>> +#include <Library/IoLib.h>
>> +
>> +//
>> +// Hardware Doorbells
>> +//
>> +#define SMPRO_DB0_IRQ_OFST               40
>> +#define SMPRO_DB0_BASE_ADDRESS           (FixedPcdGet64 (PcdSmproDbBaseReg))
>> +
>> +#define PMPRO_DB0_IRQ_OFST               56
>> +#define PMPRO_DB0_BASE_ADDRESS           (FixedPcdGet64 (PcdPmproDbBaseReg))
>> +
>> +#define SLAVE_SOCKET_BASE_ADDRESS_OFFSET 0x400000000000
>> +
>> +//
>> +// The base SPI interrupt number of the Slave socket
>> +//
>> +#define SLAVE_SOCKET_SPI_INTERRUPT 352
>> +
>> +#define SLAVE_SOCKET_DOORBELL_INTERRUPT_BASE(Socket) ((Socket) * SLAVE_SOCKET_SPI_INTERRUPT - 32)
>> +
>> +//
>> +// Doorbell base register stride size
>> +//
>> +#define DB_BASE_REG_STRIDE 0x00001000
>> +
>> +#define SMPRO_DBx_ADDRESS(socket, db) \
>> +        ((socket) * SLAVE_SOCKET_BASE_ADDRESS_OFFSET + SMPRO_DB0_BASE_ADDRESS + DB_BASE_REG_STRIDE * (db))
>> +
>> +#define PMPRO_DBx_ADDRESS(socket, db) \
>> +        ((socket) * SLAVE_SOCKET_BASE_ADDRESS_OFFSET + PMPRO_DB0_BASE_ADDRESS + DB_BASE_REG_STRIDE * (db))
>> +
>> +//
>> +// Doorbell Status Bits
>> +//
>> +#define DB_STATUS_AVAIL_BIT       BIT16
>> +#define DB_STATUS_ACK_BIT         BIT0
>> +
>> +/**
>> +  Get the base address of a doorbell.
>> +
>> +  @param[in]  Socket            Active socket index.
>> +  @param[in]  Doorbell          Doorbell channel for communication with the SMpro/PMpro.
>> +
>> +  @retval UINT32                The base address of the doorbell.
>> +                                The returned value is 0 indicate that the input parameters are invalid.
>> +
>> +**/
>> +UINTN
>> +EFIAPI
>> +MailboxGetDoorbellAddress (
>> +  IN UINT8             Socket,
>> +  IN DOORBELL_CHANNELS Doorbell
>> +  )
>> +{
>> +  UINTN DoorbellAddress;
>> +
>> +  if (Socket >= GetNumberOfActiveSockets ()
>> +      || Doorbell >= NUMBER_OF_DOORBELLS_PER_SOCKET)
>> +  {
>> +    return 0;
>> +  }
> Coding style is
>   if () {
>   }
>
> This file gets it consistently wrong.

I agree that it should be consistent. But that coding style conforms to 
"5.2.1.6 Each sub-expression of a complex predicate expression must be 
on a separate line" in EDK II Coding Standards Spec 
(https://edk2-docs.gitbook.io/edk-ii-c-coding-standards-specification/5_source_files/52_spacing#5-2-1-6-each-sub-expression-of-a-complex-predicate-expression-must-be-on-a-separate-line).

"Predicate expressions containing multiple operators with 
sub-expressions joined by && or || must have each sub-expression on a 
separate line. The opening brace, '|{|' of the body shall be on a line 
by itself and aligned in the starting column of the associated keyword.

while ( ( Code == MEETS_STANDARD)
   && ( Code == FUNCTIONAL))
{
   ShipIt();
}

"

However, I'm OK to change it as your suggestion.


Thanks,

Nhi

>
>> +
>> +  if (Doorbell >= SMproDoorbellChannel0) {
>> +    DoorbellAddress = SMPRO_DBx_ADDRESS (Socket, (UINT8)(Doorbell - SMproDoorbellChannel0));
>> +  } else {
>> +    DoorbellAddress = PMPRO_DBx_ADDRESS (Socket, (UINT8)Doorbell);
>> +  }
>> +
>> +  return DoorbellAddress;
>> +}
>> +
>> +/**
>> +  Get the interrupt number of a doorbell.
>> +
>> +  @param[in]  Socket            Active socket index.
>> +  @param[in]  Doorbell          Doorbell channel for communication with the SMpro/PMpro.
>> +
>> +  @retval UINT32                The interrupt number.
>> +                                The returned value is 0 indicate that the input parameters are invalid.
>> +
>> +**/
>> +UINT32
>> +EFIAPI
>> +MailboxGetDoorbellInterruptNumber (
>> +  IN UINT8             Socket,
>> +  IN DOORBELL_CHANNELS Doorbell
>> +  )
>> +{
>> +  UINT32 DoorbellInterruptNumber;
>> +
>> +  if (Socket >= GetNumberOfActiveSockets ()
>> +      || Doorbell >= NUMBER_OF_DOORBELLS_PER_SOCKET)
>> +  {
>> +    return 0;
>> +  }
>> +
>> +  DoorbellInterruptNumber = 0;
>> +
>> +  if (Socket > 0) {
>> +    DoorbellInterruptNumber = SLAVE_SOCKET_DOORBELL_INTERRUPT_BASE (Socket);
>> +  }
>> +
>> +  if (Doorbell >= SMproDoorbellChannel0) {
>> +    DoorbellInterruptNumber += SMPRO_DB0_IRQ_OFST + (UINT8)(Doorbell - SMproDoorbellChannel0);
>> +  } else {
>> +    DoorbellInterruptNumber += PMPRO_DB0_IRQ_OFST + (UINT8)Doorbell;
>> +  }
>> +
>> +  return DoorbellInterruptNumber;
>> +}
>> +
>> +/**
>> +  Read a message via the hardware Doorbell interface.
>> +
>> +  @param[in]  Socket            Active socket index.
>> +  @param[in]  Doorbell          Doorbell channel for communication with the SMpro/PMpro.
>> +  @param[out] Message           Pointer to the Mailbox message.
>> +
>> +  @retval EFI_SUCCESS           Read the message successfully.
>> +  @retval EFI_TIMEOUT           Timeout occurred when waiting for available message in the mailbox.
>> +  @retval EFI_INVALID_PARAMETER A parameter is invalid.
>> +**/
>> +EFI_STATUS
>> +EFIAPI
>> +MailboxRead (
>> +  IN  UINT8                Socket,
>> +  IN  DOORBELL_CHANNELS    Doorbell,
>> +  OUT MAILBOX_MESSAGE_DATA *Message
>> +  )
>> +{
>> +  UINTN TimeoutCount;
>> +  UINTN DoorbellAddress;
>> +
>> +  if (Socket >= GetNumberOfActiveSockets ()
>> +      || Doorbell >= NUMBER_OF_DOORBELLS_PER_SOCKET
>> +      || Message == NULL)
>> +  {
>> +    return EFI_INVALID_PARAMETER;
>> +  }
>> +
>> +  TimeoutCount = MAILBOX_POLL_COUNT;
>> +
>> +  DoorbellAddress = MailboxGetDoorbellAddress (Socket, Doorbell);
>> +  ASSERT (DoorbellAddress != 0);
>> +
>> +  //
>> +  // Polling Doorbell status
>> +  //
>> +  while ((MmioRead32 ((DoorbellAddress + DB_STATUS_REG_OFST)) & DB_STATUS_AVAIL_BIT) == 0) {
>> +    MicroSecondDelay (MAILBOX_POLL_INTERVAL_US);
>> +    if (--TimeoutCount == 0) {
>> +      return EFI_TIMEOUT;
>> +    }
>> +  }
>> +
>> +  Message->ExtendedData[0] = MmioRead32 (DoorbellAddress + DB_DIN0_REG_OFST);
>> +  Message->ExtendedData[1] = MmioRead32 (DoorbellAddress + DB_DIN1_REG_OFST);
>> +  Message->Data = MmioRead32 (DoorbellAddress + DB_IN_REG_OFST);
>> +
>> +  //
>> +  // Write 1 to clear the AVAIL status
>> +  //
>> +  MmioWrite32 (DoorbellAddress + DB_STATUS_REG_OFST, DB_STATUS_AVAIL_BIT);
>> +
>> +  return EFI_SUCCESS;
>> +}
>> +
>> +/**
>> +  Write a message via the hardware Doorbell interface.
>> +
>> +  @param[in]  Socket            Active socket index.
>> +  @param[in]  Doorbell          Doorbel channel for communication with the SMpro/PMpro.
>> +  @param[in]  Message           Pointer to the Mailbox message.
>> +
>> +  @retval EFI_SUCCESS           Write the message successfully.
>> +  @retval EFI_TIMEOUT           Timeout occurred when waiting for acknowledge signal from the mailbox.
>> +  @retval EFI_INVALID_PARAMETER A parameter is invalid.
>> +**/
>> +EFI_STATUS
>> +EFIAPI
>> +MailboxWrite (
>> +  IN UINT8                Socket,
>> +  IN DOORBELL_CHANNELS    Doorbell,
>> +  IN MAILBOX_MESSAGE_DATA *Message
>> +  )
>> +{
>> +  UINTN TimeoutCount;
>> +  UINTN DoorbellAddress;
>> +
>> +  if (Socket >= GetNumberOfActiveSockets ()
>> +      || Doorbell >= NUMBER_OF_DOORBELLS_PER_SOCKET
>> +      || Message == NULL)
>> +  {
>> +    return EFI_INVALID_PARAMETER;
>> +  }
>> +
>> +  TimeoutCount = MAILBOX_POLL_COUNT;
>> +
>> +  DoorbellAddress = MailboxGetDoorbellAddress (Socket, Doorbell);
>> +  ASSERT (DoorbellAddress != 0);
>> +
>> +  //
>> +  // Clear previous pending ack if any
>> +  //
>> +  if ((MmioRead32 (DoorbellAddress + DB_STATUS_REG_OFST) & DB_STATUS_ACK_BIT) != 0) {
>> +    MmioWrite32 (DoorbellAddress + DB_STATUS_REG_OFST, DB_STATUS_ACK_BIT);
>> +  }
>> +
>> +  //
>> +  // Send message
>> +  //
>> +  MmioWrite32 (DoorbellAddress + DB_DOUT0_REG_OFST, Message->ExtendedData[0]);
>> +  MmioWrite32 (DoorbellAddress + DB_DOUT1_REG_OFST, Message->ExtendedData[1]);
>> +  MmioWrite32 (DoorbellAddress + DB_OUT_REG_OFST, Message->Data);
>> +
>> +  //
>> +  // Wait for ACK
>> +  //
>> +  while ((MmioRead32 (DoorbellAddress + DB_STATUS_REG_OFST) & DB_STATUS_ACK_BIT) == 0) {
>> +    MicroSecondDelay (MAILBOX_POLL_INTERVAL_US);
>> +    if (--TimeoutCount == 0) {
>> +      return EFI_TIMEOUT;
>> +    }
>> +  }
>> +
>> +  //
>> +  // Write 1 to clear the ACK status
>> +  //
>> +  MmioWrite32 (DoorbellAddress + DB_STATUS_REG_OFST, DB_STATUS_ACK_BIT);
>> +
>> +  return EFI_SUCCESS;
>> +}
>> +
>> +/**
>> +  Unmask the Doorbell interrupt status.
>> +
>> +  @param  Socket    Active socket index.
>> +  @param  Doorbell  Doorbel channel for communication with the SMpro/PMpro.
>> +
>> +  @retval EFI_SUCCESS            Unmask the Doorbell interrupt successfully.
>> +  @retval EFI_INVALID_PARAMETER  A parameter is invalid.
>> +
>> +**/
>> +EFI_STATUS
>> +EFIAPI
>> +MailboxUnmaskInterrupt (
>> +  IN UINT8  Socket,
>> +  IN UINT16 Doorbell
>> +  )
>> +{
>> +  UINTN DoorbellAddress;
>> +
>> +  if (Socket >= GetNumberOfActiveSockets ()
>> +      || Doorbell >= NUMBER_OF_DOORBELLS_PER_SOCKET)
>> +  {
>> +    return EFI_INVALID_PARAMETER;
>> +  }
>> +
>> +  DoorbellAddress = MailboxGetDoorbellAddress (Socket, Doorbell);
>> +  ASSERT (DoorbellAddress != 0);
>> +
>> +  MmioWrite32 (DoorbellAddress + DB_STATUS_MASK_REG_OFST, ~DB_STATUS_AVAIL_BIT);
>> +
>> +  return EFI_SUCCESS;
>> +}
>
>> diff --git a/Silicon/Ampere/AmpereAltraPkg/Library/MmCommunicationLib/MmCommunicationLib.c b/Silicon/Ampere/AmpereAltraPkg/Library/MmCommunicationLib/MmCommunicationLib.c
>> new file mode 100644
>> index 000000000000..bf400ec0a835
>> --- /dev/null
>> +++ b/Silicon/Ampere/AmpereAltraPkg/Library/MmCommunicationLib/MmCommunicationLib.c
>> @@ -0,0 +1,184 @@
>> +/** @file
>> +
>> +  Copyright (c) 2020 - 2021, Ampere Computing LLC. All rights reserved.<BR>
>> +
>> +  SPDX-License-Identifier: BSD-2-Clause-Patent
>> +
>> +**/
>> +
>> +#include <IndustryStandard/ArmStdSmc.h>
>> +#include <Library/ArmLib.h>
>> +#include <Library/ArmSmcLib.h>
>> +#include <Library/BaseMemoryLib.h>
>> +#include <Library/DebugLib.h>
>> +#include <Library/MmCommunicationLib.h>
>> +#include <Library/PcdLib.h>
>> +#include <Protocol/MmCommunication.h>
>> +
>> +//
>> +// Address, Length of the pre-allocated buffer for communication with the secure
>> +// world.
>> +//
>> +STATIC ARM_MEMORY_REGION_DESCRIPTOR mNsCommBuffMemRegion;
>> +
>> +EFI_STATUS
>> +EFIAPI
>> +MmCommunicationLibConstructor (
>> +  VOID
>> +  )
>> +{
>> +  mNsCommBuffMemRegion.PhysicalBase = PcdGet64 (PcdMmBufferBase);
>> +  // During boot , Virtual and Physical are same
> Ideally, use UEFI-defined terms. "During boot" is quite ambiguous.
>
>
>> +  mNsCommBuffMemRegion.VirtualBase = mNsCommBuffMemRegion.PhysicalBase;
>> +  mNsCommBuffMemRegion.Length = PcdGet64 (PcdMmBufferSize);
>> +
>> +  return EFI_SUCCESS;
>> +}
>> +
>> +/**
>> +  Communicates with a registered handler.
>> +
>> +  This function provides an interface to send and receive messages to the
>> +  Standalone MM environment in UEFI PEI phase.
>> +
>> +  @param[in, out] CommBuffer          A pointer to the buffer to convey
>> +                                      into MMRAM.
>> +  @param[in, out] CommSize            The size of the data buffer being
>> +                                      passed in. This is optional.
>> +
>> +  @retval EFI_SUCCESS                 The message was successfully posted.
>> +  @retval EFI_INVALID_PARAMETER       The CommBuffer was NULL.
>> +  @retval EFI_BAD_BUFFER_SIZE         The buffer size is incorrect for the MM
>> +                                      implementation. If this error is
>> +                                      returned, the MessageLength field in
>> +                                      the CommBuffer header or the integer
>> +                                      pointed by CommSize are updated to reflect
>> +                                      the maximum payload size the
>> +                                      implementation can accommodate.
>> +  @retval EFI_ACCESS_DENIED           The CommunicateBuffer parameter
>> +                                      or CommSize parameter, if not omitted,
>> +                                      are in address range that cannot be
>> +                                      accessed by the MM environment
>> +**/
>> +EFI_STATUS
>> +EFIAPI
>> +MmCommunicationCommunicate (
>> +  IN OUT VOID  *CommBuffer,
>> +  IN OUT UINTN *CommSize OPTIONAL
>> +  )
>> +{
>> +  EFI_MM_COMMUNICATE_HEADER *CommunicateHeader;
>> +  ARM_SMC_ARGS              CommunicateSmcArgs;
>> +  EFI_STATUS                Status;
>> +  UINTN                     BufferSize;
>> +
>> +  Status = EFI_ACCESS_DENIED;
>> +  BufferSize = 0;
>> +
>> +  ZeroMem (&CommunicateSmcArgs, sizeof (ARM_SMC_ARGS));
>> +
>> +  //
>> +  // Check parameters
>> +  //
>> +  if (CommBuffer == NULL) {
>> +    return EFI_INVALID_PARAMETER;
>> +  }
>> +
>> +  CommunicateHeader = CommBuffer;
>> +  // CommBuffer is a mandatory parameter. Hence, Rely on
>> +  // MessageLength + Header to ascertain the
>> +  // total size of the communication payload rather than
>> +  // rely on optional CommSize parameter
>> +  BufferSize = CommunicateHeader->MessageLength +
>> +               sizeof (CommunicateHeader->HeaderGuid) +
>> +               sizeof (CommunicateHeader->MessageLength);
>> +
>> +  // If the length of the CommBuffer is 0 then return the expected length.
>> +  if (CommSize != NULL) {
>> +    // This case can be used by the consumer of this driver to find out the
>> +    // max size that can be used for allocating CommBuffer.
>> +    if ((*CommSize == 0) ||
>> +        (*CommSize > mNsCommBuffMemRegion.Length))
>> +    {
> { at end of preceding line.
> Please address throughout this file.
>
>> +      *CommSize = mNsCommBuffMemRegion.Length;
>> +      return EFI_BAD_BUFFER_SIZE;
>> +    }
>> +    //
>> +    // CommSize must match MessageLength + sizeof (EFI_MM_COMMUNICATE_HEADER);
>> +    //
>> +    if (*CommSize != BufferSize) {
>> +      return EFI_INVALID_PARAMETER;
>> +    }
>> +  }
>> +
>> +  //
>> +  // If the buffer size is 0 or greater than what can be tolerated by the MM
>> +  // environment then return the expected size.
>> +  //
>> +  if ((BufferSize == 0) ||
>> +      (BufferSize > mNsCommBuffMemRegion.Length))
>> +  {
>> +    CommunicateHeader->MessageLength = mNsCommBuffMemRegion.Length -
>> +                                       sizeof (CommunicateHeader->HeaderGuid) -
>> +                                       sizeof (CommunicateHeader->MessageLength);
>> +    return EFI_BAD_BUFFER_SIZE;
>> +  }
>> +
>> +  // SMC Function ID
>> +  CommunicateSmcArgs.Arg0 = ARM_SMC_ID_MM_COMMUNICATE_AARCH64;
>> +
>> +  // Cookie
>> +  CommunicateSmcArgs.Arg1 = 0;
>> +
>> +  // Copy Communication Payload
>> +  CopyMem ((VOID *)mNsCommBuffMemRegion.VirtualBase, CommBuffer, BufferSize);
>> +
>> +  // comm_buffer_address (64-bit physical address)
>> +  CommunicateSmcArgs.Arg2 = (UINTN)mNsCommBuffMemRegion.PhysicalBase;
>> +
>> +  // comm_size_address (not used, indicated by setting to zero)
>> +  CommunicateSmcArgs.Arg3 = 0;
>> +
>> +  // Call the Standalone MM environment.
>> +  ArmCallSmc (&CommunicateSmcArgs);
>> +
>> +  switch (CommunicateSmcArgs.Arg0) {
>> +  case ARM_SMC_MM_RET_SUCCESS:
>> +    ZeroMem (CommBuffer, BufferSize);
>> +    // On successful return, the size of data being returned is inferred from
>> +    // MessageLength + Header.
>> +    CommunicateHeader = (EFI_MM_COMMUNICATE_HEADER *)mNsCommBuffMemRegion.VirtualBase;
>> +    BufferSize = CommunicateHeader->MessageLength +
>> +                 sizeof (CommunicateHeader->HeaderGuid) +
>> +                 sizeof (CommunicateHeader->MessageLength);
>> +
>> +    CopyMem (
>> +      CommBuffer,
>> +      (VOID *)mNsCommBuffMemRegion.VirtualBase,
>> +      BufferSize
>> +      );
>> +    Status = EFI_SUCCESS;
>> +    break;
>> +
>> +  case ARM_SMC_MM_RET_INVALID_PARAMS:
>> +    Status = EFI_INVALID_PARAMETER;
>> +    break;
>> +
>> +  case ARM_SMC_MM_RET_DENIED:
>> +    Status = EFI_ACCESS_DENIED;
>> +    break;
>> +
>> +  case ARM_SMC_MM_RET_NO_MEMORY:
>> +    // Unexpected error since the CommSize was checked for zero length
>> +    // prior to issuing the SMC
>> +    Status = EFI_OUT_OF_RESOURCES;
>> +    ASSERT (0);
>> +    break;
>> +
>> +  default:
>> +    Status = EFI_ACCESS_DENIED;
>> +    ASSERT (0);
>> +  }
>> +
>> +  return Status;
>> +}
>> diff --git a/Platform/Ampere/JadePkg/JadeBoardSetting.cfg b/Platform/Ampere/JadePkg/JadeBoardSetting.cfg
>> new file mode 100644
>> index 000000000000..5a67e8fc6a75
>> --- /dev/null
>> +++ b/Platform/Ampere/JadePkg/JadeBoardSetting.cfg
>> @@ -0,0 +1,209 @@
>> +# Sample board setting
>> +#
>> +# This is a sample board setting as used for the
>> +# Ampere Altra reference design.
> What is a board setting?
>
>> +#
>> +# Name, offset (hex), value
>> +# value can be hex or decimal
>> +#
>> +
>> +NV_SI_RO_BOARD_VENDOR, 0x0000, 0x0000CD3A
>> +NV_SI_RO_BOARD_TYPE, 0x0008, 0x00000000
>> +NV_SI_RO_BOARD_REV, 0x0010, 0x00000000
>> +NV_SI_RO_BOARD_CFG, 0x0018, 0x00000000
>> +NV_SI_RO_BOARD_S0_DIMM_AVAIL, 0x0020, 0x0000FFFF
>> +NV_SI_RO_BOARD_S1_DIMM_AVAIL, 0x0028, 0x0000FFFF
>> +NV_SI_RO_BOARD_SPI0CS0_FREQ_KHZ, 0x0030, 0x000080E8
>> +NV_SI_RO_BOARD_SPI0CS1_FREQ_KHZ, 0x0038, 0x000080E8
>> +NV_SI_RO_BOARD_SPI1CS0_FREQ_KHZ, 0x0040, 0x00002710
>> +NV_SI_RO_BOARD_SPI1CS1_FREQ_KHZ, 0x0048, 0x00002710
>> +NV_SI_RO_BOARD_TPM_LOC, 0x0050, 0x00000000
>> +NV_SI_RO_BOARD_I2C0_FREQ_KHZ, 0x0058, 0x00000190
>> +NV_SI_RO_BOARD_I2C1_FREQ_KHZ, 0x0060, 0x00000190
>> +NV_SI_RO_BOARD_I2C2_10_FREQ_KHZ, 0x0068, 0x00000190
>> +NV_SI_RO_BOARD_I2C3_FREQ_KHZ, 0x0070, 0x00000190
>> +NV_SI_RO_BOARD_I2C9_FREQ_KHZ, 0x0078, 0x00000190
>> +NV_SI_RO_BOARD_2P_CFG, 0x0080, 0xFFFFFF01
>> +NV_SI_RO_BOARD_S0_RCA0_CFG, 0x0088, 0x00000000
>> +NV_SI_RO_BOARD_S0_RCA1_CFG, 0x0090, 0x00000000
>> +NV_SI_RO_BOARD_S0_RCA2_CFG, 0x0098, 0x00000004
>> +NV_SI_RO_BOARD_S0_RCA3_CFG, 0x00A0, 0x00000004
>> +NV_SI_RO_BOARD_S0_RCB0_LO_CFG, 0x00A8, 0x00020002
>> +NV_SI_RO_BOARD_S0_RCB0_HI_CFG, 0x00B0, 0x00020002
>> +NV_SI_RO_BOARD_S0_RCB1_LO_CFG, 0x00B8, 0x00020002
>> +NV_SI_RO_BOARD_S0_RCB1_HI_CFG, 0x00C0, 0x00020002
>> +NV_SI_RO_BOARD_S0_RCB2_LO_CFG, 0x00C8, 0x00020002
>> +NV_SI_RO_BOARD_S0_RCB2_HI_CFG, 0x00D0, 0x00000003
>> +NV_SI_RO_BOARD_S0_RCB3_LO_CFG, 0x00D8, 0x00000003
>> +NV_SI_RO_BOARD_S0_RCB3_HI_CFG, 0x00E0, 0x00020002
>> +NV_SI_RO_BOARD_S1_RCA0_CFG, 0x00E8, 0x00000000
>> +NV_SI_RO_BOARD_S1_RCA1_CFG, 0x00F0, 0x00000000
>> +NV_SI_RO_BOARD_S1_RCA2_CFG, 0x00F8, 0x02020202
>> +NV_SI_RO_BOARD_S1_RCA3_CFG, 0x0100, 0x00030003
>> +NV_SI_RO_BOARD_S1_RCB0_LO_CFG, 0x0108, 0x00000003
>> +NV_SI_RO_BOARD_S1_RCB0_HI_CFG, 0x0110, 0x00020002
>> +NV_SI_RO_BOARD_S1_RCB1_LO_CFG, 0x0118, 0x00020002
>> +NV_SI_RO_BOARD_S1_RCB1_HI_CFG, 0x0120, 0x00000003
>> +NV_SI_RO_BOARD_S1_RCB2_LO_CFG, 0x0128, 0x00020002
>> +NV_SI_RO_BOARD_S1_RCB2_HI_CFG, 0x0130, 0x00020002
>> +NV_SI_RO_BOARD_S1_RCB3_LO_CFG, 0x0138, 0x00020002
>> +NV_SI_RO_BOARD_S1_RCB3_HI_CFG, 0x0140, 0x00020002
>> +NV_SI_RO_BOARD_T_LTLM_DELTA_P0, 0x0148, 0x00000001
>> +NV_SI_RO_BOARD_T_LTLM_DELTA_P1, 0x0150, 0x00000002
>> +NV_SI_RO_BOARD_T_LTLM_DELTA_P2, 0x0158, 0x00000003
>> +NV_SI_RO_BOARD_T_LTLM_DELTA_P3, 0x0160, 0x00000004
>> +NV_SI_RO_BOARD_T_LTLM_DELTA_M1, 0x0168, 0xFFFFFFFF
>> +NV_SI_RO_BOARD_T_LTLM_DELTA_M2, 0x0170, 0xFFFFFFFE
>> +NV_SI_RO_BOARD_T_LTLM_DELTA_M3, 0x0178, 0xFFFFFFFD
>> +NV_SI_RO_BOARD_P_LM_PID_P, 0x0180, 0x00000000
>> +NV_SI_RO_BOARD_P_LM_PID_I, 0x0188, 0x00000000
>> +NV_SI_RO_BOARD_P_LM_PID_I_L_THOLD, 0x0190, 0x00000000
>> +NV_SI_RO_BOARD_P_LM_PID_I_H_THOLD, 0x0198, 0x00000000
>> +NV_SI_RO_BOARD_P_LM_PID_D, 0x01A0, 0x00000000
>> +NV_SI_RO_BOARD_P_LM_EXP_SMOOTH_CONST, 0x01A8, 0x00000000
>> +NV_SI_RO_BOARD_TPM_ALG_ID, 0x01B0, 0x00000002
>> +NV_SI_RO_BOARD_DDR_SPEED_GRADE, 0x01B8, 0x00000C80
>> +NV_SI_RO_BOARD_DDR_S0_RTT_WR, 0x01C0, 0x00020000
>> +NV_SI_RO_BOARD_DDR_S1_RTT_WR, 0x01C8, 0x00020000
>> +NV_SI_RO_BOARD_DDR_S0_RTT_NOM, 0x01D0, 0xFF060177
>> +NV_SI_RO_BOARD_DDR_S1_RTT_NOM, 0x01D8, 0xFF060177
>> +NV_SI_RO_BOARD_DDR_S0_RTT_PARK, 0x01E0, 0x00060070
>> +NV_SI_RO_BOARD_DDR_S1_RTT_PARK, 0x01E8, 0x00060070
>> +NV_SI_RO_BOARD_DDR_CS0_RDODT_MASK_1DPC, 0x01F0, 0x00000000
>> +NV_SI_RO_BOARD_DDR_CS1_RDODT_MASK_1DPC, 0x01F8, 0x00000000
>> +NV_SI_RO_BOARD_DDR_CS2_RDODT_MASK_1DPC, 0x0200, 0x00000000
>> +NV_SI_RO_BOARD_DDR_CS3_RDODT_MASK_1DPC, 0x0208, 0x00000000
>> +NV_SI_RO_BOARD_DDR_CS0_RDODT_MASK_2DPC, 0x0210, 0x000C0CCC
>> +NV_SI_RO_BOARD_DDR_CS1_RDODT_MASK_2DPC, 0x0218, 0x000C0CCC
>> +NV_SI_RO_BOARD_DDR_CS2_RDODT_MASK_2DPC, 0x0220, 0x00030333
>> +NV_SI_RO_BOARD_DDR_CS3_RDODT_MASK_2DPC, 0x0228, 0x00030333
>> +NV_SI_RO_BOARD_DDR_CS0_WRODT_MASK_1DPC, 0x0230, 0x00030333
>> +NV_SI_RO_BOARD_DDR_CS1_WRODT_MASK_1DPC, 0x0238, 0x00030333
>> +NV_SI_RO_BOARD_DDR_CS2_WRODT_MASK_1DPC, 0x0240, 0x00030333
>> +NV_SI_RO_BOARD_DDR_CS3_WRODT_MASK_1DPC, 0x0248, 0x00030333
>> +NV_SI_RO_BOARD_DDR_CS0_WRODT_MASK_2DPC, 0x0250, 0x000EDEED
>> +NV_SI_RO_BOARD_DDR_CS1_WRODT_MASK_2DPC, 0x0258, 0x000DEDDE
>> +NV_SI_RO_BOARD_DDR_CS2_WRODT_MASK_2DPC, 0x0260, 0x000B7BB7
>> +NV_SI_RO_BOARD_DDR_CS3_WRODT_MASK_2DPC, 0x0268, 0x0007B77B
>> +NV_SI_RO_BOARD_DDR_PHY_TERM_DQ_CTRL_1DPC, 0x0270, 0x00000005
>> +NV_SI_RO_BOARD_DDR_PHY_TERM_DQ_VAL_1DPC, 0x0278, 0x0090DD90
>> +NV_SI_RO_BOARD_DDR_PHY_TERM_DQS_CTRL_1DPC, 0x0280, 0x00000005
>> +NV_SI_RO_BOARD_DDR_PHY_TERM_DQS_VAL_1DPC, 0x0288, 0x0090DD90
>> +NV_SI_RO_BOARD_DDR_PHY_TERM_DQ_CTRL_2DPC, 0x0290, 0x00000005
>> +NV_SI_RO_BOARD_DDR_PHY_TERM_DQ_VAL_2DPC, 0x0298, 0x0090DD90
>> +NV_SI_RO_BOARD_DDR_PHY_TERM_DQS_CTRL_2DPC, 0x02A0, 0x00000005
>> +NV_SI_RO_BOARD_DDR_PHY_TERM_DQS_VAL_2DPC, 0x02A8, 0x0090DD90
>> +NV_SI_RO_BOARD_DDR_PHY_VREFDQ_RANGE_VAL_1DPC, 0x02B0, 0x00000024
>> +NV_SI_RO_BOARD_DDR_DRAM_VREFDQ_RANGE_VAL_1DPC, 0x02B8, 0x0000001A
>> +NV_SI_RO_BOARD_DDR_PHY_VREFDQ_RANGE_VAL_2DPC, 0x02C0, 0x00000050
>> +NV_SI_RO_BOARD_DDR_DRAM_VREFDQ_RANGE_VAL_2DPC, 0x02C8, 0x00000020
>> +NV_SI_RO_BOARD_DDR_CLK_WRDQ_DLY_DEFAULT, 0x02D0, 0x02800280
>> +NV_SI_RO_BOARD_DDR_RDDQS_DQ_DLY_DEFAULT, 0x02D8, 0x90909090
>> +NV_SI_RO_BOARD_DDR_WRDQS_SHIFT_DEFAULT, 0x02E0, 0x00000000
>> +NV_SI_RO_BOARD_DDR_ADCMD_DLY_DEFAULT, 0x02E8, 0x00C000C0
>> +NV_SI_RO_BOARD_DDR_CLK_WRDQ_DLY_ADJ, 0x02F0, 0x00000000
>> +NV_SI_RO_BOARD_DDR_RDDQS_DQ_DLY_ADJ, 0x02F8, 0x00000000
>> +NV_SI_RO_BOARD_DDR_PHY_VREF_ADJ, 0x0300, 0x00000000
>> +NV_SI_RO_BOARD_DDR_DRAM_VREF_ADJ, 0x0308, 0x00000000
>> +NV_SI_RO_BOARD_DDR_WR_PREAMBLE_CYCLE, 0x0310, 0x02010201
>> +NV_SI_RO_BOARD_DDR_ADCMD_2T_MODE, 0x0318, 0x00000000
>> +NV_SI_RO_BOARD_I2C_VRD_CONFIG_INFO, 0x0320, 0x00000000
>> +NV_SI_RO_BOARD_DDR_PHY_FEATURE_CTRL, 0x0328, 0x00000000
>> +NV_SI_RO_BOARD_BMC_HANDSHAKE_SPI_ACCESS, 0x0330, 0x01050106
>> +NV_SI_RO_BOARD_DIMM_TEMP_THRESHOLD, 0x0338, 0x000005F4
>> +NV_SI_RO_BOARD_DIMM_SPD_COMPARE_DISABLE, 0x0340, 0x00000000
>> +NV_SI_RO_BOARD_S0_PCIE_CLK_CFG, 0x0348, 0x00000000
>> +NV_SI_RO_BOARD_S0_RCA4_CFG, 0x0350, 0x02020202
>> +NV_SI_RO_BOARD_S0_RCA5_CFG, 0x0358, 0x02020202
>> +NV_SI_RO_BOARD_S0_RCA6_CFG, 0x0360, 0x02020202
>> +NV_SI_RO_BOARD_S0_RCA7_CFG, 0x0368, 0x02020003
>> +NV_SI_RO_BOARD_S0_RCA0_TXRX_G3PRESET, 0x0370, 0x00000000
>> +NV_SI_RO_BOARD_S0_RCA1_TXRX_G3PRESET, 0x0378, 0x00000000
>> +NV_SI_RO_BOARD_S0_RCA2_TXRX_G3PRESET, 0x0380, 0x00000000
>> +NV_SI_RO_BOARD_S0_RCA3_TXRX_G3PRESET, 0x0388, 0x00000000
>> +NV_SI_RO_BOARD_S0_RCB0A_TXRX_G3PRESET, 0x0390, 0x00000000
>> +NV_SI_RO_BOARD_S0_RCB0B_TXRX_G3PRESET, 0x0398, 0x00000000
>> +NV_SI_RO_BOARD_S0_RCB1A_TXRX_G3PRESET, 0x03A0, 0x00000000
>> +NV_SI_RO_BOARD_S0_RCB1B_TXRX_G3PRESET, 0x03A8, 0x00000000
>> +NV_SI_RO_BOARD_S0_RCB2A_TXRX_G3PRESET, 0x03B0, 0x00000000
>> +NV_SI_RO_BOARD_S0_RCB2B_TXRX_G3PRESET, 0x03B8, 0x00000000
>> +NV_SI_RO_BOARD_S0_RCB3A_TXRX_G3PRESET, 0x03C0, 0x00000000
>> +NV_SI_RO_BOARD_S0_RCB3B_TXRX_G3PRESET, 0x03C8, 0x00000000
>> +NV_SI_RO_BOARD_S0_RCA4_TXRX_G3PRESET, 0x03D0, 0x00000000
>> +NV_SI_RO_BOARD_S0_RCA5_TXRX_G3PRESET, 0x03D8, 0x00000000
>> +NV_SI_RO_BOARD_S0_RCA6_TXRX_G3PRESET, 0x03E0, 0x00000000
>> +NV_SI_RO_BOARD_S0_RCA7_TXRX_G3PRESET, 0x03E8, 0x00000000
>> +NV_SI_RO_BOARD_S0_RCA0_TXRX_G4PRESET, 0x03F0, 0x57575757
>> +NV_SI_RO_BOARD_S0_RCA1_TXRX_G4PRESET, 0x03F8, 0x57575757
>> +NV_SI_RO_BOARD_S0_RCA2_TXRX_G4PRESET, 0x0400, 0x57575757
>> +NV_SI_RO_BOARD_S0_RCA3_TXRX_G4PRESET, 0x0408, 0x57575757
>> +NV_SI_RO_BOARD_S0_RCB0A_TXRX_G4PRESET, 0x0410, 0x57575757
>> +NV_SI_RO_BOARD_S0_RCB0B_TXRX_G4PRESET, 0x0418, 0x57575757
>> +NV_SI_RO_BOARD_S0_RCB1A_TXRX_G4PRESET, 0x0420, 0x57575757
>> +NV_SI_RO_BOARD_S0_RCB1B_TXRX_G4PRESET, 0x0428, 0x57575757
>> +NV_SI_RO_BOARD_S0_RCB2A_TXRX_G4PRESET, 0x0430, 0x57575757
>> +NV_SI_RO_BOARD_S0_RCB2B_TXRX_G4PRESET, 0x0438, 0x57575757
>> +NV_SI_RO_BOARD_S0_RCB3A_TXRX_G4PRESET, 0x0440, 0x57575757
>> +NV_SI_RO_BOARD_S0_RCB3B_TXRX_G4PRESET, 0x0448, 0x57575757
>> +NV_SI_RO_BOARD_S0_RCA4_TXRX_G4PRESET, 0x0450, 0x57575757
>> +NV_SI_RO_BOARD_S0_RCA5_TXRX_G4PRESET, 0x0458, 0x57575757
>> +NV_SI_RO_BOARD_S0_RCA6_TXRX_G4PRESET, 0x0460, 0x57575757
>> +NV_SI_RO_BOARD_S0_RCA7_TXRX_G4PRESET, 0x0468, 0x57575757
>> +NV_SI_RO_BOARD_S1_PCIE_CLK_CFG, 0x0470, 0x00000000
>> +NV_SI_RO_BOARD_S1_RCA4_CFG, 0x0478, 0x02020202
>> +NV_SI_RO_BOARD_S1_RCA5_CFG, 0x0480, 0x02020202
>> +NV_SI_RO_BOARD_S1_RCA6_CFG, 0x0488, 0x02020202
>> +NV_SI_RO_BOARD_S1_RCA7_CFG, 0x0490, 0x02020003
>> +NV_SI_RO_BOARD_S1_RCA2_TXRX_G3PRESET, 0x0498, 0x00000000
>> +NV_SI_RO_BOARD_S1_RCA3_TXRX_G3PRESET, 0x04A0, 0x00000000
>> +NV_SI_RO_BOARD_S1_RCB0A_TXRX_G3PRESET, 0x04A8, 0x00000000
>> +NV_SI_RO_BOARD_S1_RCB0B_TXRX_G3PRESET, 0x04B0, 0x00000000
>> +NV_SI_RO_BOARD_S1_RCB1A_TXRX_G3PRESET, 0x04B8, 0x00000000
>> +NV_SI_RO_BOARD_S1_RCB1B_TXRX_G3PRESET, 0x04C0, 0x00000000
>> +NV_SI_RO_BOARD_S1_RCB2A_TXRX_G3PRESET, 0x04C8, 0x00000000
>> +NV_SI_RO_BOARD_S1_RCB2B_TXRX_G3PRESET, 0x04D0, 0x00000000
>> +NV_SI_RO_BOARD_S1_RCB3A_TXRX_G3PRESET, 0x04D8, 0x00000000
>> +NV_SI_RO_BOARD_S1_RCB3B_TXRX_G3PRESET, 0x04E0, 0x00000000
>> +NV_SI_RO_BOARD_S1_RCA4_TXRX_G3PRESET, 0x04E8, 0x00000000
>> +NV_SI_RO_BOARD_S1_RCA5_TXRX_G3PRESET, 0x04F0, 0x00000000
>> +NV_SI_RO_BOARD_S1_RCA6_TXRX_G3PRESET, 0x04F8, 0x00000000
>> +NV_SI_RO_BOARD_S1_RCA7_TXRX_G3PRESET, 0x0500, 0x00000000
>> +NV_SI_RO_BOARD_S1_RCA2_TXRX_G4PRESET, 0x0508, 0x57575757
>> +NV_SI_RO_BOARD_S1_RCA3_TXRX_G4PRESET, 0x0510, 0x57575757
>> +NV_SI_RO_BOARD_S1_RCB0A_TXRX_G4PRESET, 0x0518, 0x57575757
>> +NV_SI_RO_BOARD_S1_RCB0B_TXRX_G4PRESET, 0x0520, 0x57575757
>> +NV_SI_RO_BOARD_S1_RCB1A_TXRX_G4PRESET, 0x0528, 0x57575757
>> +NV_SI_RO_BOARD_S1_RCB1B_TXRX_G4PRESET, 0x0530, 0x57575757
>> +NV_SI_RO_BOARD_S1_RCB2A_TXRX_G4PRESET, 0x0538, 0x57575757
>> +NV_SI_RO_BOARD_S1_RCB2B_TXRX_G4PRESET, 0x0540, 0x57575757
>> +NV_SI_RO_BOARD_S1_RCB3A_TXRX_G4PRESET, 0x0548, 0x57575757
>> +NV_SI_RO_BOARD_S1_RCB3B_TXRX_G4PRESET, 0x0550, 0x57575757
>> +NV_SI_RO_BOARD_S1_RCA4_TXRX_G4PRESET, 0x0558, 0x57575757
>> +NV_SI_RO_BOARD_S1_RCA5_TXRX_G4PRESET, 0x0560, 0x57575757
>> +NV_SI_RO_BOARD_S1_RCA6_TXRX_G4PRESET, 0x0568, 0x57575757
>> +NV_SI_RO_BOARD_S1_RCA7_TXRX_G4PRESET, 0x0570, 0x57575757
>> +NV_SI_RO_BOARD_2P_CE_MASK_THRESHOLD, 0x0578, 0x00000003
>> +NV_SI_RO_BOARD_2P_CE_MASK_INTERVAL, 0x0580, 0x000001A4
>> +NV_SI_RO_BOARD_SX_PHY_CFG_SETTING, 0x0588, 0x00000000
>> +NV_SI_RO_BOARD_DDR_PHY_DC_CLK, 0x0590, 0x00018000
>> +NV_SI_RO_BOARD_DDR_PHY_DC_DATA, 0x0598, 0x80018000
>> +NV_SI_RO_BOARD_SX_RCA0_TXRX_20GPRESET, 0x05A0, 0x00000000
>> +NV_SI_RO_BOARD_SX_RCA1_TXRX_20GPRESET, 0x05A8, 0x00000000
>> +NV_SI_RO_BOARD_SX_RCA2_TXRX_20GPRESET, 0x05B0, 0x00000000
>> +NV_SI_RO_BOARD_SX_RCA3_TXRX_20GPRESET, 0x05B8, 0x00000000
>> +NV_SI_RO_BOARD_SX_RCA0_TXRX_25GPRESET, 0x05C0, 0x00000000
>> +NV_SI_RO_BOARD_SX_RCA1_TXRX_25GPRESET, 0x05C8, 0x00000000
>> +NV_SI_RO_BOARD_SX_RCA2_TXRX_25GPRESET, 0x05D0, 0x00000000
>> +NV_SI_RO_BOARD_SX_RCA3_TXRX_25GPRESET, 0x05D8, 0x00000000
>> +NV_SI_RO_BOARD_DDR_2X_REFRESH_TEMP_THRESHOLD, 0x05E0, 0x00550055
>> +NV_SI_RO_BOARD_PCP_VRD_VOUT_WAIT_US, 0x05E8, 0x00000064
>> +NV_SI_RO_BOARD_PCP_VRD_VOUT_RESOLUTION_MV, 0x05F0, 0x00000005
>> +NV_SI_RO_BOARD_DVFS_VOLT_READ_BACK_EN, 0x05F8, 0x00000001
>> +NV_SI_RO_BOARD_DVFS_VOLT_READ_BACK_TIME, 0x0600, 0x00000002
>> +NV_SI_RO_BOARD_DVFS_VOUT_20MV_RAMP_TIME_US, 0x0608, 0x00000005
>> +NV_SI_RO_BOARD_PCIE_AER_FW_FIRST, 0x0610, 0x00000000
>> +NV_SI_RO_BOARD_RTC_GPI_LOCK_BYPASS, 0x0618, 0x00000000
>> +NV_SI_RO_BOARD_TPM_DISABLE, 0x0620, 0x00000000
>> +NV_SI_RO_BOARD_MESH_S0_CXG_RC_STRONG_ORDERING_EN, 0x0628, 0x00000000
>> +NV_SI_RO_BOARD_MESH_S1_CXG_RC_STRONG_ORDERING_EN, 0x0630, 0x00000000
>> +NV_SI_RO_BOARD_GPIO_SW_WATCHDOG_EN, 0x0638, 0x00000000
> There was also a few things in this patch where I felt names had
> insufficient namespace - such as starting with TRNG_ or NV_.
> I'm not going to insist on adding prefixes to those, I'm just going to
> say I have warned you, and those might get you in trouble in the
> future :)
>
> Best Regards,
>
> Leif

--------------4BF9D6D8EBC1A676687FE92C
Content-Type: text/html; charset=utf-8
Content-Transfer-Encoding: base64

PGh0bWw+PGhlYWQ+DQo8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRl
eHQvaHRtbDsgY2hhcnNldD11dGYtOCI+CiAgPC9oZWFkPgogIDxib2R5PgogICAgPGRpdiBjbGFz
cz0ibW96LWNpdGUtcHJlZml4Ij5PbiA2LzUvMjEgMDY6MDQsIExlaWYgTGluZGhvbG0gd3JvdGU6
PGJyPgogICAgPC9kaXY+CiAgICA8YmxvY2txdW90ZSB0eXBlPSJjaXRlIiBjaXRlPSJtaWQ6MjAy
MTA2MDQyMzA0MTAuczd2dWFyeGlyMmZxa3F0d0BsZXZpYXRoYW4iPgogICAgICA8cHJlIGNsYXNz
PSJtb3otcXVvdGUtcHJlIiB3cmFwPSIiPk9uIFdlZCwgTWF5IDI2LCAyMDIxIGF0IDE3OjA2OjUy
ICswNzAwLCBOaGkgUGhhbSB3cm90ZToKPC9wcmU+CiAgICAgIDxibG9ja3F1b3RlIHR5cGU9ImNp
dGUiPgogICAgICAgIDxwcmUgY2xhc3M9Im1vei1xdW90ZS1wcmUiIHdyYXA9IiI+RnJvbTogVnUg
Tmd1eWVuIDxhIGNsYXNzPSJtb3otdHh0LWxpbmstcmZjMjM5NkUiIGhyZWY9Im1haWx0bzp2dW5n
dXllbkBvcy5hbXBlcmVjb21wdXRpbmcuY29tIj4mbHQ7dnVuZ3V5ZW5Ab3MuYW1wZXJlY29tcHV0
aW5nLmNvbSZndDs8L2E+CgpUaGlzIGNvbW1pdCBhZGRzIHRoZSBzdXBwb3J0IGZvciBBbXBlcmXi
gJlzIEFsdHJhIHByb2Nlc3Nvci1iYXNlZCBNdC4gSmFkZQpwbGF0Zm9ybSB0aGF0IHByb3ZpZGVz
IHVwIHRvIDE2MCBwcm9jZXNzb3IgY29yZXMgaW4gYSBkdWFsIHNvY2tldApjb25maWd1cmF0aW9u
LiBUaGUgZXNzZW50aWFsIG1vZHVsZXMgYXJlIHdpcmVkIHVwIGVub3VnaCB0byBib290IHN5c3Rl
bQp0byBFREsyIFVpQXBwLgoKQ2M6IFRoYW5nIE5ndXllbiA8YSBjbGFzcz0ibW96LXR4dC1saW5r
LXJmYzIzOTZFIiBocmVmPSJtYWlsdG86dGhhbmdAb3MuYW1wZXJlY29tcHV0aW5nLmNvbSI+Jmx0
O3RoYW5nQG9zLmFtcGVyZWNvbXB1dGluZy5jb20mZ3Q7PC9hPgpDYzogQ2h1b25nIFRyYW4gPGEg
Y2xhc3M9Im1vei10eHQtbGluay1yZmMyMzk2RSIgaHJlZj0ibWFpbHRvOmNodW9uZ0Bvcy5hbXBl
cmVjb21wdXRpbmcuY29tIj4mbHQ7Y2h1b25nQG9zLmFtcGVyZWNvbXB1dGluZy5jb20mZ3Q7PC9h
PgpDYzogUGhvbmcgVm8gPGEgY2xhc3M9Im1vei10eHQtbGluay1yZmMyMzk2RSIgaHJlZj0ibWFp
bHRvOnBob25nQG9zLmFtcGVyZWNvbXB1dGluZy5jb20iPiZsdDtwaG9uZ0Bvcy5hbXBlcmVjb21w
dXRpbmcuY29tJmd0OzwvYT4KQ2M6IExlaWYgTGluZGhvbG0gPGEgY2xhc3M9Im1vei10eHQtbGlu
ay1yZmMyMzk2RSIgaHJlZj0ibWFpbHRvOmxlaWZAbnV2aWFpbmMuY29tIj4mbHQ7bGVpZkBudXZp
YWluYy5jb20mZ3Q7PC9hPgpDYzogTWljaGFlbCBEIEtpbm5leSA8YSBjbGFzcz0ibW96LXR4dC1s
aW5rLXJmYzIzOTZFIiBocmVmPSJtYWlsdG86bWljaGFlbC5kLmtpbm5leUBpbnRlbC5jb20iPiZs
dDttaWNoYWVsLmQua2lubmV5QGludGVsLmNvbSZndDs8L2E+CkNjOiBBcmQgQmllc2hldXZlbCA8
YSBjbGFzcz0ibW96LXR4dC1saW5rLXJmYzIzOTZFIiBocmVmPSJtYWlsdG86YXJkYit0aWFub2Nv
cmVAa2VybmVsLm9yZyI+Jmx0O2FyZGIrdGlhbm9jb3JlQGtlcm5lbC5vcmcmZ3Q7PC9hPgpDYzog
TmF0ZSBEZVNpbW9uZSA8YSBjbGFzcz0ibW96LXR4dC1saW5rLXJmYzIzOTZFIiBocmVmPSJtYWls
dG86bmF0aGFuaWVsLmwuZGVzaW1vbmVAaW50ZWwuY29tIj4mbHQ7bmF0aGFuaWVsLmwuZGVzaW1v
bmVAaW50ZWwuY29tJmd0OzwvYT4KClNpZ25lZC1vZmYtYnk6IFZ1IE5ndXllbiA8YSBjbGFzcz0i
bW96LXR4dC1saW5rLXJmYzIzOTZFIiBocmVmPSJtYWlsdG86dnVuZ3V5ZW5Ab3MuYW1wZXJlY29t
cHV0aW5nLmNvbSI+Jmx0O3Z1bmd1eWVuQG9zLmFtcGVyZWNvbXB1dGluZy5jb20mZ3Q7PC9hPgot
LS0KIFBsYXRmb3JtL0FtcGVyZS9BbXBlcmVQbGF0Zm9ybVBrZy9BbXBlcmVQbGF0Zm9ybVBrZy5k
ZWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgIDI4ICsKIFNpbGlj
b24vQW1wZXJlL0FtcGVyZUFsdHJhUGtnL0FtcGVyZUFsdHJhUGtnLmRlYyAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgIDQyICsrCiBTaWxpY29uL0FtcGVy
ZS9BbXBlcmVTaWxpY29uUGtnL0FtcGVyZVNpbGljb25Qa2cuZGVjICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICB8ICA0NiArKwogU2lsaWNvbi9BbXBlcmUvQW1wZXJl
QWx0cmFQa2cvQW1wZXJlQWx0cmFQa2cuZHNjLmluYyAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgfCA2NzQgKysrKysrKysrKysrKysrKysrKwogUGxhdGZvcm0vQW1w
ZXJlL0phZGVQa2cvSmFkZS5kc2MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxMDAgKysrCiBQbGF0Zm9ybS9BbXBlcmUvSmFk
ZVBrZy9KYWRlLmZkZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICB8IDIyNSArKysrKysrCiBTaWxpY29uL0FtcGVyZS9BbXBlcmVB
bHRyYVBrZy9Ecml2ZXJzL0FURkhvYlBlaS9BVEZIb2JQZWltLmluZiAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICB8ICA0MSArKwogU2lsaWNvbi9BbXBlcmUvQW1wZXJlQWx0cmFQa2cv
RHJpdmVycy9NZW1vcnlJbml0UGVpbS9NZW1vcnlJbml0UGVpbS5pbmYgICAgICAgICAgICAgICAg
ICAgICAgICAgfCAgNjQgKysKIFNpbGljb24vQW1wZXJlL0FtcGVyZUFsdHJhUGtnL0xpYnJhcnkv
QW1wZXJlQ3B1TGliL0FtcGVyZUNwdUxpYi5pbmYgICAgICAgICAgICAgICAgICAgICAgICAgICAg
IHwgIDQ0ICsrCiBTaWxpY29uL0FtcGVyZS9BbXBlcmVBbHRyYVBrZy9MaWJyYXJ5L0FybVBsYXRm
b3JtTGliL0FybVBsYXRmb3JtTGliLmluZiAgICAgICAgICAgICAgICAgICAgICAgICB8ICA1NyAr
KwogU2lsaWNvbi9BbXBlcmUvQW1wZXJlQWx0cmFQa2cvTGlicmFyeS9NYWlsYm94SW50ZXJmYWNl
TGliL01haWxib3hJbnRlcmZhY2VMaWIuaW5mICAgICAgICAgICAgICAgfCAgMzcgKwogU2lsaWNv
bi9BbXBlcmUvQW1wZXJlQWx0cmFQa2cvTGlicmFyeS9NZW1vcnlJbml0UGVpTGliL01lbW9yeUlu
aXRQZWlMaWIuaW5mICAgICAgICAgICAgICAgICAgICAgfCAgNjMgKysKIFNpbGljb24vQW1wZXJl
L0FtcGVyZUFsdHJhUGtnL0xpYnJhcnkvTW1Db21tdW5pY2F0aW9uTGliL01tQ29tbXVuaWNhdGlv
bkxpYi5pbmYgICAgICAgICAgICAgICAgIHwgIDM1ICsKIFNpbGljb24vQW1wZXJlL0FtcGVyZUFs
dHJhUGtnL0xpYnJhcnkvTlZQYXJhbUxpYi9OVlBhcmFtTGliLmluZiAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIHwgIDMyICsKIFNpbGljb24vQW1wZXJlL0FtcGVyZUFsdHJhUGtnL0xp
YnJhcnkvUGxhdGZvcm1QZWlMaWIvUGxhdGZvcm1QZWlMaWIuaW5mICAgICAgICAgICAgICAgICAg
ICAgICAgIHwgIDQyICsrCiBTaWxpY29uL0FtcGVyZS9BbXBlcmVBbHRyYVBrZy9MaWJyYXJ5L1Ju
Z0xpYi9SbmdMaWIuaW5mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8
ICAyOSArCiBTaWxpY29uL0FtcGVyZS9BbXBlcmVBbHRyYVBrZy9MaWJyYXJ5L1N5c3RlbUZpcm13
YXJlSW50ZXJmYWNlTGliL1N5c3RlbUZpcm13YXJlSW50ZXJmYWNlTGliLmluZiB8ICAzMCArCiBT
aWxpY29uL0FtcGVyZS9BbXBlcmVBbHRyYVBrZy9MaWJyYXJ5L1RybmdMaWIvVHJuZ0xpYi5pbmYg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAyOSArCiBTaWxpY29uL0Ft
cGVyZS9BbXBlcmVBbHRyYVBrZy9JbmNsdWRlL0d1aWQvUGxhdGZvcm1JbmZvSG9iR3VpZC5oICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAxNyArCiBTaWxpY29uL0FtcGVyZS9BbXBl
cmVBbHRyYVBrZy9JbmNsdWRlL0xpYnJhcnkvQW1wZXJlQ3B1TGliLmggICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICB8IDI4MiArKysrKysrKwogU2lsaWNvbi9BbXBlcmUvQW1wZXJl
QWx0cmFQa2cvSW5jbHVkZS9MaWJyYXJ5L01haWxib3hJbnRlcmZhY2VMaWIuaCAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgfCAxNzIgKysrKysKIFNpbGljb24vQW1wZXJlL0FtcGVyZUFsdHJh
UGtnL0luY2x1ZGUvTGlicmFyeS9NbUNvbW11bmljYXRpb25MaWIuaCAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIHwgIDE5ICsKIFNpbGljb24vQW1wZXJlL0FtcGVyZUFsdHJhUGtnL0luY2x1
ZGUvTGlicmFyeS9OVlBhcmFtTGliLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIHwgMTMzICsrKysKIFNpbGljb24vQW1wZXJlL0FtcGVyZUFsdHJhUGtnL0luY2x1ZGUvTGli
cmFyeS9TeXN0ZW1GaXJtd2FyZUludGVyZmFjZUxpYi5oICAgICAgICAgICAgICAgICAgICAgIHwg
MjgyICsrKysrKysrCiBTaWxpY29uL0FtcGVyZS9BbXBlcmVBbHRyYVBrZy9JbmNsdWRlL0xpYnJh
cnkvVHJuZ0xpYi5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAz
MSArCiBTaWxpY29uL0FtcGVyZS9BbXBlcmVBbHRyYVBrZy9JbmNsdWRlL01tTGliLmggICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICA3OSArKysKIFNp
bGljb24vQW1wZXJlL0FtcGVyZUFsdHJhUGtnL0luY2x1ZGUvTlZQYXJhbURlZi5oICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgNTE1ICsrKysrKysrKysrKysr
CiBTaWxpY29uL0FtcGVyZS9BbXBlcmVBbHRyYVBrZy9JbmNsdWRlL1BsYXRmb3JtL0FjMDEuaCAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDE0NiArKysrCiBTaWxp
Y29uL0FtcGVyZS9BbXBlcmVBbHRyYVBrZy9JbmNsdWRlL1BsYXRmb3JtSW5mb0hvYi5oICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDE4MiArKysrKwogU2lsaWNvbi9B
bXBlcmUvQW1wZXJlQWx0cmFQa2cvRHJpdmVycy9BVEZIb2JQZWkvQVRGSG9iUGVpbS5jICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgNTIgKysKIFNpbGljb24vQW1wZXJlL0Ft
cGVyZUFsdHJhUGtnL0RyaXZlcnMvTWVtb3J5SW5pdFBlaW0vTWVtb3J5SW5pdFBlaW0uYyAgICAg
ICAgICAgICAgICAgICAgICAgICAgIHwgMTUxICsrKysrCiBTaWxpY29uL0FtcGVyZS9BbXBlcmVB
bHRyYVBrZy9MaWJyYXJ5L0FtcGVyZUNwdUxpYi9BbXBlcmVDcHVMaWIuYyAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICB8IDcwNiArKysrKysrKysrKysrKysrKysrKwogU2lsaWNvbi9BbXBl
cmUvQW1wZXJlQWx0cmFQa2cvTGlicmFyeS9Bcm1QbGF0Zm9ybUxpYi9Bcm1QbGF0Zm9ybUxpYi5j
ICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxNjkgKysrKysKIFNpbGljb24vQW1wZXJlL0Ft
cGVyZUFsdHJhUGtnL0xpYnJhcnkvQXJtUGxhdGZvcm1MaWIvQXJtUGxhdGZvcm1MaWJNZW1vcnku
YyAgICAgICAgICAgICAgICAgICAgIHwgMzk5ICsrKysrKysrKysrCiBTaWxpY29uL0FtcGVyZS9B
bXBlcmVBbHRyYVBrZy9MaWJyYXJ5L01haWxib3hJbnRlcmZhY2VMaWIvTWFpbGJveEludGVyZmFj
ZUxpYi5jICAgICAgICAgICAgICAgICB8IDI4MiArKysrKysrKwogU2lsaWNvbi9BbXBlcmUvQW1w
ZXJlQWx0cmFQa2cvTGlicmFyeS9NZW1vcnlJbml0UGVpTGliL01lbW9yeUluaXRQZWlMaWIuYyAg
ICAgICAgICAgICAgICAgICAgICAgfCAgOTMgKysrCiBTaWxpY29uL0FtcGVyZS9BbXBlcmVBbHRy
YVBrZy9MaWJyYXJ5L01tQ29tbXVuaWNhdGlvbkxpYi9NbUNvbW11bmljYXRpb25MaWIuYyAgICAg
ICAgICAgICAgICAgICB8IDE4NCArKysrKwogU2lsaWNvbi9BbXBlcmUvQW1wZXJlQWx0cmFQa2cv
TGlicmFyeS9OVlBhcmFtTGliL05WUGFyYW1MaWIuYyAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgfCAyMDIgKysrKysrCiBTaWxpY29uL0FtcGVyZS9BbXBlcmVBbHRyYVBrZy9MaWJy
YXJ5L1BsYXRmb3JtUGVpTGliL1BsYXRmb3JtUGVpTGliLmMgICAgICAgICAgICAgICAgICAgICAg
ICAgICB8ICA0MCArKwogU2lsaWNvbi9BbXBlcmUvQW1wZXJlQWx0cmFQa2cvTGlicmFyeS9SbmdM
aWIvUm5nTGliLmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAx
NDEgKysrKwogU2lsaWNvbi9BbXBlcmUvQW1wZXJlQWx0cmFQa2cvTGlicmFyeS9TeXN0ZW1GaXJt
d2FyZUludGVyZmFjZUxpYi9TeXN0ZW1GaXJtd2FyZUludGVyZmFjZUxpYi5jICAgfCAzMjggKysr
KysrKysrCiBTaWxpY29uL0FtcGVyZS9BbXBlcmVBbHRyYVBrZy9MaWJyYXJ5L1RybmdMaWIvVHJu
Z0xpYi5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICA2MyArKwog
UGxhdGZvcm0vQW1wZXJlL0FtcGVyZVBsYXRmb3JtUGtnL0Z2UnVsZXMuZmRmLmluYyAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxNzYgKysrKysKIFBsYXRm
b3JtL0FtcGVyZS9KYWRlUGtnL0phZGVCb2FyZFNldHRpbmcuY2ZnICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgMjA5ICsrKysrKwogU2lsaWNvbi9B
bXBlcmUvQW1wZXJlQWx0cmFQa2cvTGlicmFyeS9Bcm1QbGF0Zm9ybUxpYi9Bcm1QbGF0Zm9ybUhl
bHBlci5TICAgICAgICAgICAgICAgICAgICAgICAgfCAgNDUgKysKIFNpbGljb24vQW1wZXJlL0Ft
cGVyZUFsdHJhUGtnL0xpYnJhcnkvUm5nTGliL1JuZ0xpYi51bmkgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIHwgIDEzICsKIDQ2IGZpbGVzIGNoYW5nZWQsIDY3MjkgaW5z
ZXJ0aW9ucygrKQoKPC9wcmU+CiAgICAgIDwvYmxvY2txdW90ZT4KICAgICAgPHByZSBjbGFzcz0i
bW96LXF1b3RlLXByZSIgd3JhcD0iIj4KPC9wcmU+CiAgICAgIDxibG9ja3F1b3RlIHR5cGU9ImNp
dGUiPgogICAgICAgIDxwcmUgY2xhc3M9Im1vei1xdW90ZS1wcmUiIHdyYXA9IiI+ZGlmZiAtLWdp
dCBhL1BsYXRmb3JtL0FtcGVyZS9KYWRlUGtnL0phZGUuZHNjIGIvUGxhdGZvcm0vQW1wZXJlL0ph
ZGVQa2cvSmFkZS5kc2MKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMDAwMDAwLi5m
NjhhZjI0YTBkNzgKLS0tIC9kZXYvbnVsbAorKysgYi9QbGF0Zm9ybS9BbXBlcmUvSmFkZVBrZy9K
YWRlLmRzYwpAQCAtMCwwICsxLDEwMCBAQAorIyMgQGZpbGUKKyMKKyMgQ29weXJpZ2h0IChjKSAy
MDIwIC0gMjAyMSwgQW1wZXJlIENvbXB1dGluZyBMTEMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuJmx0
O0JSJmd0OworIworIyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTItQ2xhdXNlLVBhdGVu
dAorIworIyMKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj
IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgRGVmaW5lcyBTZWN0aW9u
IC0gc3RhdGVtZW50cyB0aGF0IHdpbGwgYmUgcHJvY2Vzc2VkIHRvIGNyZWF0ZSBhIE1ha2VmaWxl
LgorIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj
IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKK1tEZWZpbmVzXQorICBQTEFURk9STV9OQU1F
ICAgICAgICAgICAgICAgICAgPSBKYWRlCisgIFBMQVRGT1JNX0dVSUQgICAgICAgICAgICAgICAg
ICA9IDdCREQwMEMwLTY4RjMtNENDMS04Nzc1LUYwRjAwNTcyMDE5RgorICBQTEFURk9STV9WRVJT
SU9OICAgICAgICAgICAgICAgPSAwLjEKKyAgRFNDX1NQRUNJRklDQVRJT04gICAgICAgICAgICAg
ID0gMHgwMDAxMDAxQgorICBPVVRQVVRfRElSRUNUT1JZICAgICAgICAgICAgICAgPSBCdWlsZC9K
YWRlCisgIFNVUFBPUlRFRF9BUkNISVRFQ1RVUkVTICAgICAgICA9IEFBUkNINjQKKyAgQlVJTERf
VEFSR0VUUyAgICAgICAgICAgICAgICAgID0gREVCVUd8UkVMRUFTRXxOT09QVAorICBTS1VJRF9J
REVOVElGSUVSICAgICAgICAgICAgICAgPSBERUZBVUxUCisgIEZMQVNIX0RFRklOSVRJT04gICAg
ICAgICAgICAgICA9IFBsYXRmb3JtL0FtcGVyZS9KYWRlUGtnL0phZGUuZmRmCisKKyAgIworICAj
IERlZmluZXMgZm9yIGRlZmF1bHQgc3RhdGVzLiBUaGVzZSBjYW4gYmUgY2hhbmdlZCBvbiB0aGUg
Y29tbWFuZCBsaW5lLgorICAjIC1EIEZMQUc9VkFMVUUKKyAgIworCisgICMgIERFQlVHX0lOSVQg
ICAgICAweDAwMDAwMDAxICAvLyBJbml0aWFsaXphdGlvbgorICAjICBERUJVR19XQVJOICAgICAg
MHgwMDAwMDAwMiAgLy8gV2FybmluZ3MKKyAgIyAgREVCVUdfTE9BRCAgICAgIDB4MDAwMDAwMDQg
IC8vIExvYWQgZXZlbnRzCisgICMgIERFQlVHX0ZTICAgICAgICAweDAwMDAwMDA4ICAvLyBFRkkg
RmlsZSBzeXN0ZW0KKyAgIyAgREVCVUdfUE9PTCAgICAgIDB4MDAwMDAwMTAgIC8vIEFsbG9jICZh
bXA7IEZyZWUgKHBvb2wpCisgICMgIERFQlVHX1BBR0UgICAgICAweDAwMDAwMDIwICAvLyBBbGxv
YyAmYW1wOyBGcmVlIChwYWdlKQorICAjICBERUJVR19JTkZPICAgICAgMHgwMDAwMDA0MCAgLy8g
SW5mb3JtYXRpb25hbCBkZWJ1ZyBtZXNzYWdlcworICAjICBERUJVR19ESVNQQVRDSCAgMHgwMDAw
MDA4MCAgLy8gUEVJL0RYRS9TTU0gRGlzcGF0Y2hlcnMKKyAgIyAgREVCVUdfVkFSSUFCTEUgIDB4
MDAwMDAxMDAgIC8vIFZhcmlhYmxlCisgICMgIERFQlVHX0JNICAgICAgICAweDAwMDAwNDAwICAv
LyBCb290IE1hbmFnZXIKKyAgIyAgREVCVUdfQkxLSU8gICAgIDB4MDAwMDEwMDAgIC8vIEJsa0lv
IERyaXZlcgorICAjICBERUJVR19ORVQgICAgICAgMHgwMDAwNDAwMCAgLy8gU05QIERyaXZlcgor
ICAjICBERUJVR19VTkRJICAgICAgMHgwMDAxMDAwMCAgLy8gVU5ESSBEcml2ZXIKKyAgIyAgREVC
VUdfTE9BREZJTEUgIDB4MDAwMjAwMDAgIC8vIExvYWRGaWxlCisgICMgIERFQlVHX0VWRU5UICAg
ICAweDAwMDgwMDAwICAvLyBFdmVudCBtZXNzYWdlcworICAjICBERUJVR19HQ0QgICAgICAgMHgw
MDEwMDAwMCAgLy8gR2xvYmFsIENvaGVyZW5jeSBEYXRhYmFzZSBjaGFuZ2VzCisgICMgIERFQlVH
X0NBQ0hFICAgICAweDAwMjAwMDAwICAvLyBNZW1vcnkgcmFuZ2UgY2FjaGFiaWxpdHkgY2hhbmdl
cworICAjICBERUJVR19WRVJCT1NFICAgMHgwMDQwMDAwMCAgLy8gRGV0YWlsZWQgZGVidWcgbWVz
c2FnZXMgdGhhdCBtYXkKKyAgIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNpZ25p
ZmljYW50bHkgaW1wYWN0IGJvb3QgcGVyZm9ybWFuY2UKKyAgIyAgREVCVUdfRVJST1IgICAgIDB4
ODAwMDAwMDAgIC8vIEVycm9yCisgIERFRklORSBERUJVR19QUklOVF9FUlJPUl9MRVZFTCA9IDB4
ODAwMDAwMEYKKyAgREVGSU5FIEZJUk1XQVJFX1ZFUiAgICAgICAgICAgID0gMC4wMS4wMDEKKyAg
REVGSU5FIEVESzJfU0tJUF9QRUlDT1JFICAgICAgID0gVFJVRQorICBERUZJTkUgU0VDVVJFX0JP
T1RfRU5BQkxFICAgICAgPSBGQUxTRQorICBERUZJTkUgSU5DTFVERV9URlRQX0NPTU1BTkQgICAg
PSBUUlVFCisKKyAgIworICAjIE5ldHdvcmsgZGVmaW5pdGlvbgorICAjCisgIERFRklORSBORVRX
T1JLX0lQNl9FTkFCTEUgICAgICAgICAgICAgICAgICA9IEZBTFNFCisgIERFRklORSBORVRXT1JL
X0hUVFBfQk9PVF9FTkFCTEUgICAgICAgICAgICA9IFRSVUUKKyAgREVGSU5FIE5FVFdPUktfQUxM
T1dfSFRUUF9DT05ORUNUSU9OUyAgICAgID0gVFJVRQorICBERUZJTkUgTkVUV09SS19UTFNfRU5B
QkxFICAgICAgICAgICAgICAgICAgPSBGQUxTRQorCjwvcHJlPgogICAgICA8L2Jsb2NrcXVvdGU+
CiAgICAgIDxwcmUgY2xhc3M9Im1vei1xdW90ZS1wcmUiIHdyYXA9IiI+CllvdSdsbCB3YW50IHRv
IGluY2x1ZGUgdGhhdCAhaW5jbHVkZSBNZGVQa2cvTWRlTGlicy5kc2MuaW5jIGJpdApzb21ld2hl
cmUgaGVyZS4KCjwvcHJlPgogICAgICA8YmxvY2txdW90ZSB0eXBlPSJjaXRlIj4KICAgICAgICA8
cHJlIGNsYXNzPSJtb3otcXVvdGUtcHJlIiB3cmFwPSIiPisjIEluY2x1ZGUgZGVmYXVsdCBBbXBl
cmUgUGxhdGZvcm0gRFNDIGZpbGUKKyFpbmNsdWRlIFNpbGljb24vQW1wZXJlL0FtcGVyZUFsdHJh
UGtnL0FtcGVyZUFsdHJhUGtnLmRzYy5pbmMKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj
IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMK
KyMgU3BlY2lmaWMgUGxhdGZvcm0gTGlicmFyeQorIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj
IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMK
K1tMaWJyYXJ5Q2xhc3Nlc10KKyAgIworICAjIFJUQyBMaWJyYXJ5OiBDb21tb24gUlRDCisgICMK
KyAgUmVhbFRpbWVDbG9ja0xpYnxFbWJlZGRlZFBrZy9MaWJyYXJ5L1ZpcnR1YWxSZWFsVGltZUNs
b2NrTGliL1ZpcnR1YWxSZWFsVGltZUNsb2NrTGliLmluZgorCisjIyMjIyMjIyMjIyMjIyMjIyMj
IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj
IyMjIworIworIyBTcGVjaWZpYyBQbGF0Zm9ybSBQY2RzCisjCisjIyMjIyMjIyMjIyMjIyMjIyMj
IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj
IyMjIworW1BjZHNGZWF0dXJlRmxhZy5jb21tb25dCitbUGNkc0ZpeGVkQXRCdWlsZC5jb21tb25d
CisKKyFpZiAkKFNFQ1VSRV9CT09UX0VOQUJMRSkgPT0gVFJVRQorICAjIE92ZXJyaWRlIHRoZSBk
ZWZhdWx0IHZhbHVlcyBmcm9tIFNlY3VyaXR5UGtnIHRvIGVuc3VyZSBpbWFnZXMKKyAgIyBmcm9t
IGFsbCBzb3VyY2VzIGFyZSB2ZXJpZmllZCBpbiBzZWN1cmUgYm9vdAorICBnRWZpU2VjdXJpdHlQ
a2dUb2tlblNwYWNlR3VpZC5QY2RPcHRpb25Sb21JbWFnZVZlcmlmaWNhdGlvblBvbGljeXwweDA0
CisgIGdFZmlTZWN1cml0eVBrZ1Rva2VuU3BhY2VHdWlkLlBjZEZpeGVkTWVkaWFJbWFnZVZlcmlm
aWNhdGlvblBvbGljeXwweDA0CisgIGdFZmlTZWN1cml0eVBrZ1Rva2VuU3BhY2VHdWlkLlBjZFJl
bW92YWJsZU1lZGlhSW1hZ2VWZXJpZmljYXRpb25Qb2xpY3l8MHgwNAorIWVuZGlmCisKKworIyMj
IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj
IyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgU3BlY2lmaWMgUGxhdGZvcm0gQ29tcG9uZW50Cisj
CisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj
IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworW0NvbXBvbmVudHMuY29tbW9uXQo8L3ByZT4KICAg
ICAgPC9ibG9ja3F1b3RlPgogICAgICA8cHJlIGNsYXNzPSJtb3otcXVvdGUtcHJlIiB3cmFwPSIi
PgoKCjwvcHJlPgogICAgICA8YmxvY2txdW90ZSB0eXBlPSJjaXRlIj4KICAgICAgICA8cHJlIGNs
YXNzPSJtb3otcXVvdGUtcHJlIiB3cmFwPSIiPmRpZmYgLS1naXQgYS9TaWxpY29uL0FtcGVyZS9B
bXBlcmVBbHRyYVBrZy9JbmNsdWRlL0xpYnJhcnkvQW1wZXJlQ3B1TGliLmggYi9TaWxpY29uL0Ft
cGVyZS9BbXBlcmVBbHRyYVBrZy9JbmNsdWRlL0xpYnJhcnkvQW1wZXJlQ3B1TGliLmgKbmV3IGZp
bGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwLi5kZTU3NjQ3NGZiNDgKLS0tIC9kZXYv
bnVsbAorKysgYi9TaWxpY29uL0FtcGVyZS9BbXBlcmVBbHRyYVBrZy9JbmNsdWRlL0xpYnJhcnkv
QW1wZXJlQ3B1TGliLmgKQEAgLTAsMCArMSwyODIgQEAKKy8qKiBAZmlsZQorCisgIENvcHlyaWdo
dCAoYykgMjAyMCAtIDIwMjEsIEFtcGVyZSBDb21wdXRpbmcgTExDLiBBbGwgcmlnaHRzIHJlc2Vy
dmVkLiZsdDtCUiZndDsKKworICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTItQ2xhdXNl
LVBhdGVudAorCisqKi8KKworI2lmbmRlZiBBTVBFUkVfQ1BVX0xJQl9IXworI2RlZmluZSBBTVBF
UkVfQ1BVX0xJQl9IXworCisvKiBDdHlwZW4sIGJpdHNbMyhuIC0gMSkgKyAyIDogMyhuIC0gMSld
LCBmb3IgbiA9IDEgdG8gNyAqLworI2RlZmluZSBDTElEUl9DVFlQRV9TSElGVChMZXZlbCkgICAg
KDMgKiAoTGV2ZWwgLSAxKSkKKyNkZWZpbmUgQ0xJRFJfQ1RZUEVfTUFTSyhMZXZlbCkgICAgICg3
ICZsdDsmbHQ7IENMSURSX0NUWVBFX1NISUZUKExldmVsKSkKKyNkZWZpbmUgQ0xJRFJfQ1RZUEUo
Q2xpZHIsIExldmVsKSBcCisgICgoKENsaWRyKSAmYW1wOyBDTElEUl9DVFlQRV9NQVNLKExldmVs
KSkgJmd0OyZndDsgQ0xJRFJfQ1RZUEVfU0hJRlQoTGV2ZWwpKQorCisjZGVmaW5lIENDU0lEUl9O
VU1TRVRTX1NISUZUICAgICAgICAxMworI2RlZmluZSBDQ1NJRFJfTlVNU0VUU19NQVNLICAgICAg
ICAgMHhGRkZFMDAwCisjZGVmaW5lIENDU0lEUl9OVU1TRVRTKENjc2lkcikgXAorICAoKChDY3Np
ZHIpICZhbXA7IENDU0lEUl9OVU1TRVRTX01BU0spICZndDsmZ3Q7IENDU0lEUl9OVU1TRVRTX1NI
SUZUKQorI2RlZmluZSBDQ1NJRFJfQVNTT0NJQVRJVklUWV9TSElGVCAgMworI2RlZmluZSBDQ1NJ
RFJfQVNTT0NJQVRJVklUWV9NQVNLICAgMHgxRkY4CisjZGVmaW5lIENDU0lEUl9BU1NPQ0lBVElW
SVRZKENjc2lkcikgXAorICAoKChDY3NpZHIpICZhbXA7IENDU0lEUl9BU1NPQ0lBVElWSVRZX01B
U0spICZndDsmZ3Q7IENDU0lEUl9BU1NPQ0lBVElWSVRZX1NISUZUKQorI2RlZmluZSBDQ1NJRFJf
TElORV9TSVpFX1NISUZUICAgICAgMAorI2RlZmluZSBDQ1NJRFJfTElORV9TSVpFX01BU0sgICAg
ICAgMHg3CisjZGVmaW5lIENDU0lEUl9MSU5FX1NJWkUoQ2NzaWRyKSBcCisgICgoKENjc2lkcikg
JmFtcDsgQ0NTSURSX0xJTkVfU0laRV9NQVNLKSAmZ3Q7Jmd0OyBDQ1NJRFJfTElORV9TSVpFX1NI
SUZUKQo8L3ByZT4KICAgICAgPC9ibG9ja3F1b3RlPgogICAgICA8cHJlIGNsYXNzPSJtb3otcXVv
dGUtcHJlIiB3cmFwPSIiPgpBbGwgb2YgdGhlIGFib3ZlIChDTElEUi9DQ1NJRFIpIGFyZSBhcmNo
aXRlY3R1cmFsLgpXZSd2ZSBhbHNvIGRldmVsb3BlZCBzb21lIG5ldyBhY2Nlc3NvcnMgYW5kIHN0
dWZmIGZvciB0aGVzZSwgYXMgcGFydApvZiBBcm1Qa2cvVW5pdmVyc2FsL1NtYmlvc0R4ZSB3b3Jr
IHRoYXQncyBnb25lIG9uIHNpbmNlIHYxIG9mIHRoaXMgc2V0LgpXZSBtYXkgbmVlZCB0byBjbGVh
biBzb21lIGludGVyZmFjZXMgdXAsIGJ1dCBpZGVhbGx5IEknZCBwcmVmZXIgaWYgeW91CmNvdWxk
IHVzZSBzb21lIGFjY2Vzc29ycyBmcm9tIEFybUxpYiBvciBzdWNoLgoKPC9wcmU+CiAgICAgIDxi
bG9ja3F1b3RlIHR5cGU9ImNpdGUiPgogICAgICAgIDxwcmUgY2xhc3M9Im1vei1xdW90ZS1wcmUi
IHdyYXA9IiI+KworI2RlZmluZSBTVUJOVU1BX01PREVfTU9OT0xJVEhJQyAgICAgICAgMAorI2Rl
ZmluZSBTVUJOVU1BX01PREVfSEVNSVNQSEVSRSAgICAgICAgMQorI2RlZmluZSBTVUJOVU1BX01P
REVfUVVBRFJBTlQgICAgICAgICAgMgorCisjZGVmaW5lIE1PTk9MSVRJQ19OVU1fT0ZfUkVHSU9O
ICAgICAgICAxCisjZGVmaW5lIEhFTUlTUEhFUkVfTlVNX09GX1JFR0lPTiAgICAgICAyCisjZGVm
aW5lIFFVQURSQU5UX05VTV9PRl9SRUdJT04gICAgICAgICA0CisjZGVmaW5lIFNVQk5VTUFfQ1BN
X1JFR0lPTl9TSVpFICAgICAgICA0CisjZGVmaW5lIE5VTV9PRl9DUE1fUEVSX01FU0hfUk9XICAg
ICAgICA4CisKKyNkZWZpbmUgQ1BNX1BFUl9ST1dfT0ZGU0VUKENwbUlkKSAgICAgICgoQ3BtSWQp
ICUgTlVNX09GX0NQTV9QRVJfTUVTSF9ST1cpCisjZGVmaW5lIENQTV9ST1dfTlVNQkVSKENwbUlk
KSAgICAgICAgICAoKENwbUlkKSAvIE5VTV9PRl9DUE1fUEVSX01FU0hfUk9XKQorCisjZGVmaW5l
IFNPQ0tFVF9JRChDcHVJZCkgICAgICAgICAgICAgICAoKENwdUlkKSAvIChQTEFURk9STV9DUFVf
TUFYX0NQTSAqIFBMQVRGT1JNX0NQVV9OVU1fQ09SRVNfUEVSX0NQTSkpCisjZGVmaW5lIENMVVNU
RVJfSUQoQ3B1SWQpICAgICAgICAgICAgICAoKChDcHVJZCkgLyBQTEFURk9STV9DUFVfTlVNX0NP
UkVTX1BFUl9DUE0pICUgUExBVEZPUk1fQ1BVX01BWF9DUE0pCisKKworLyoqCisgIEdldCB0aGUg
U3ViTlVNQSBtb2RlLgorCisgIEByZXR1cm4gICBVSU5UOCAgICAgIFRoZSBTdWJOVU1BIG1vZGUu
CisKKyoqLworVUlOVDgKK0VGSUFQSQorQ3B1R2V0U3ViTnVtYU1vZGUgKAorICBWT0lECisgICk7
CisKKy8qKgorICBHZXQgdGhlIG51bWJlciBvZiBTdWJOVU1BIHJlZ2lvbi4KKworICBAcmV0dXJu
ICAgVUlOVDggICAgICBUaGUgbnVtYmVyIG9mIFN1Yk5VTUEgcmVnaW9uLgorCisqKi8KK1VJTlQ4
CitFRklBUEkKK0NwdUdldE51bWJlck9mU3ViTnVtYVJlZ2lvbiAoCisgIFZPSUQKKyAgKTsKKwor
LyoqCisgIEdldCB0aGUgU3ViTlVNQSBub2RlIG9mIGEgQ1BNLgorCisgIEBwYXJhbSAgICBTb2Nr
ZXRJZCAgICBTb2NrZXQgaW5kZXguCisgIEBwYXJhbSAgICBDcG0gICAgICAgICBDUE0gaW5kZXgu
CisgIEByZXR1cm4gICBVSU5UOCAgICAgICBUaGUgU3ViTlVNQSBub2RlIG9mIGEgQ1BNLgorCisq
Ki8KK1VJTlQ4CitFRklBUEkKK0NwdUdldFN1Yk51bU5vZGUgKAorICBVSU5UOCAgU29ja2V0LAor
ICBVSU5UMTYgQ3BtCisgICk7CisKKy8qKgorICBHZXQgdGhlIGFzc29jaWF0aXZpdHkgb2YgY2Fj
aGUuCisKKyAgQHBhcmFtICAgIExldmVsICAgICAgIENhY2hlIGxldmVsLgorICBAcmV0dXJuICAg
VUlOVDMyICAgICAgQXNzb2NpYXRpdml0eSBvZiBjYWNoZS4KKworKiovCitVSU5UMzIKK0VGSUFQ
SQorQ3B1R2V0QXNzb2NpYXRpdml0eSAoCisgIFVJTlQzMiBMZXZlbAorICApOworCisvKioKKyAg
R2V0IHRoZSBjYWNoZSBzaXplLgorCisgIEBwYXJhbSAgICBMZXZlbCAgICAgICBDYWNoZSBsZXZl
bC4KKyAgQHJldHVybiAgIFVJTlQzMiAgICAgIENhY2hlIHNpemUuCisKKyoqLworVUlOVDMyCitF
RklBUEkKK0NwdUdldENhY2hlU2l6ZSAoCisgIFVJTlQzMiBMZXZlbAorICApOworCisvKioKKyAg
R2V0IHRoZSBudW1iZXIgb2Ygc3VwcG9ydGVkIHNvY2tldC4KKworICBAcmV0dXJuICAgVUlOVDgg
ICAgICBOdW1iZXIgb2Ygc3VwcG9ydGVkIHNvY2tldC4KKworKiovCitVSU5UOAorRUZJQVBJCitH
ZXROdW1iZXJPZlN1cHBvcnRlZFNvY2tldHMgKAorICBWT0lECisgICk7CisKKy8qKgorICBHZXQg
dGhlIG51bWJlciBvZiBhY3RpdmUgc29ja2V0LgorCisgIEByZXR1cm4gICBVSU5UOCAgICAgIE51
bWJlciBvZiBhY3RpdmUgc29ja2V0LgorCisqKi8KK1VJTlQ4CitFRklBUEkKK0dldE51bWJlck9m
QWN0aXZlU29ja2V0cyAoCisgIFZPSUQKKyAgKTsKKworLyoqCisgIEdldCB0aGUgbnVtYmVyIG9m
IGFjdGl2ZSBDUE0gcGVyIHNvY2tldC4KKworICBAcGFyYW0gICAgU29ja2V0SWQgICAgU29ja2V0
IGluZGV4LgorICBAcmV0dXJuICAgVUlOVDE2ICAgICAgTnVtYmVyIG9mIENQTS4KKworKiovCitV
SU5UMTYKK0VGSUFQSQorR2V0TnVtYmVyT2ZBY3RpdmVDUE1zUGVyU29ja2V0ICgKKyAgVUlOVDgg
U29ja2V0SWQKKyAgKTsKKworLyoqCisgIEdldCB0aGUgbnVtYmVyIG9mIGNvbmZpZ3VyZWQgQ1BN
IHBlciBzb2NrZXQuCisKKyAgQHBhcmFtICAgIFNvY2tldElkICAgIFNvY2tldCBpbmRleC4KKyAg
QHJldHVybiAgIFVJTlQxNiAgICAgIE51bWJlciBvZiBjb25maWd1cmVkIENQTS4KKworKiovCitV
SU5UMTYKK0VGSUFQSQorR2V0TnVtYmVyT2ZDb25maWd1cmVkQ1BNcyAoCisgIFVJTlQ4IFNvY2tl
dElkCisgICk7CisKKy8qKgorICBTZXQgdGhlIG51bWJlciBvZiBjb25maWd1cmVkIENQTSBwZXIg
c29ja2V0LgorCisgIEBwYXJhbSAgICBTb2NrZXRJZCAgICAgICAgU29ja2V0IGluZGV4LgorICBA
cGFyYW0gICAgTnVtYmVyT2ZDUE1zICAgIE51bWJlciBvZiBDUE0gdG8gYmUgY29uZmlndXJlZC4K
KyAgQHJldHVybiAgIEVGSV9TVUNDRVNTICAgICBPcGVyYXRpb24gc3VjY2VlZGVkLgorICBAcmV0
dXJuICAgT3RoZXJzICAgICAgICAgIEFuIGVycm9yIGhhcyBvY2N1cnJlZC4KKworKiovCitFRklf
U1RBVFVTCitFRklBUEkKK1NldE51bWJlck9mQ29uZmlndXJlZENQTXMgKAorICBVSU5UOCAgU29j
a2V0SWQsCisgIFVJTlQxNiBOdW1iZXJPZkNQTXMKKyAgKTsKKworLyoqCisgIEdldCB0aGUgbWF4
aW11bSBudW1iZXIgb2YgY29yZSBwZXIgc29ja2V0LiBUaGlzIG51bWJlcgorICBzaG91bGQgYmUg
dGhlIHNhbWUgZm9yIGFsbCBzb2NrZXRzLgorCisgIEByZXR1cm4gICBVSU5UMTYgICAgICBNYXhp
bXVtIG51bWJlciBvZiBjb3JlLgorCisqKi8KK1VJTlQxNgorRUZJQVBJCitHZXRNYXhpbXVtTnVt
YmVyT2ZDb3JlcyAoCisgIFZPSUQKKyAgKTsKKworLyoqCisgIEdldCB0aGUgbWF4aW11bSBudW1i
ZXIgb2YgQ1BNIHBlciBzb2NrZXQuIFRoaXMgbnVtYmVyCisgIHNob3VsZCBiZSB0aGUgc2FtZSBm
b3IgYWxsIHNvY2tldHMuCisKKyAgQHJldHVybiAgIFVJTlQzMiAgICAgIE1heGltdW0gbnVtYmVy
IG9mIENQTS4KKworKiovCitVSU5UMTYKK0VGSUFQSQorR2V0TWF4aW11bU51bWJlck9mQ1BNcyAo
CisgIFZPSUQKKyAgKTsKKworLyoqCisgIEdldCB0aGUgbnVtYmVyIG9mIGFjdGl2ZSBjb3JlcyBv
ZiBhIHNvY2tldHMuCisKKyAgQHJldHVybiAgIFVJTlQxNiAgICAgIE51bWJlciBvZiBhY3RpdmUg
Y29yZS4KKworKiovCitVSU5UMTYKK0VGSUFQSQorR2V0TnVtYmVyT2ZBY3RpdmVDb3Jlc1BlclNv
Y2tldCAoCisgIFVJTlQ4IFNvY2tldElkCisgICk7CisKKy8qKgorICBHZXQgdGhlIG51bWJlciBv
ZiBhY3RpdmUgY29yZXMgb2YgYWxsIHNvY2tldC4KKworICBAcmV0dXJuICAgVUlOVDE2ICAgICAg
TnVtYmVyIG9mIGFjdGl2ZSBjb3JlLgorCisqKi8KK1VJTlQxNgorRUZJQVBJCitHZXROdW1iZXJP
ZkFjdGl2ZUNvcmVzICgKKyAgVk9JRAorICApOworCisvKioKKyAgQ2hlY2sgaWYgdGhlIGxvZ2lj
YWwgQ1BVIGlzIGVuYWJsZWQgb3Igbm90LgorCisgIEBwYXJhbSAgICBDcHVJZCAgICAgICBUaGUg
bG9naWNhbCBDcHUgSUQuIFN0YXJ0ZWQgZnJvbSAwLgorICBAcmV0dXJuICAgQk9PTEVBTiAgICAg
VFJVRSBpZiB0aGUgQ3B1IGVuYWJsZWQKKyAgICAgICAgICAgICAgICAgICAgICAgIEZBTFNFIGlm
IHRoZSBDcHUgZGlzYWJsZWQuCisKKyoqLworQk9PTEVBTgorRUZJQVBJCitJc0NwdUVuYWJsZWQg
KAorICBVSU5UMTYgQ3B1SWQKKyAgKTsKKworCisvKioKKyAgQ2hlY2sgaWYgdGhlIHNsYXZlIHNv
Y2tldCBpcyBwcmVzZW50CisKKyAgQHJldHVybiAgIEJPT0xFQU4gICAgIFRSVUUgaWYgdGhlIFNs
YXZlIENwdSBpcyBwcmVzZW50CisgICAgICAgICAgICAgICAgICAgICAgICBGQUxTRSBpZiB0aGUg
U2xhdmUgQ3B1IGlzIG5vdCBwcmVzZW50CisKKyoqLworQk9PTEVBTgorRUZJQVBJCitJc1NsYXZl
U29ja2V0UHJlc2VudCAoCisgIFZPSUQKKyAgKTsKKworLyoqCisgIENoZWNrIGlmIHRoZSBzbGF2
ZSBzb2NrZXQgaXMgYWN0aXZlCisKKyAgQHJldHVybiAgIEJPT0xFQU4gICAgIFRSVUUgaWYgdGhl
IFNsYXZlIENQVSBTb2NrZXQgaXMgYWN0aXZlLgorICAgICAgICAgICAgICAgICAgICAgICAgRkFM
U0UgaWYgdGhlIFNsYXZlIENQVSBTb2NrZXQgaXMgbm90IGFjdGl2ZS4KKworKiovCitCT09MRUFO
CitFRklBUEkKK0lzU2xhdmVTb2NrZXRBY3RpdmUgKAorICBWT0lECisgICk7CisKKy8qKgorICBD
aGVjayBpZiB0aGUgQ1BVIHByb2R1Y3QgSUQgaXMgQWMwMQorICBAcmV0dXJuICAgQk9PTEVBTiAg
ICAgVFJVRSBpZiB0aGUgUHJvZHVjdCBJRCBpcyBBYzAxCisgICAgICAgICAgICAgICAgICAgICAg
ICBGQUxTRSBvdGhlcndpc2UuCisKKyoqLworQk9PTEVBTgorRUZJQVBJCitJc0FjMDFQcm9jZXNz
b3IgKAorICBWT0lECisgICk7CisKKyNlbmRpZiAvKiBBTVBFUkVfQ1BVX0xJQl9IXyAqLwo8L3By
ZT4KICAgICAgPC9ibG9ja3F1b3RlPgogICAgICA8cHJlIGNsYXNzPSJtb3otcXVvdGUtcHJlIiB3
cmFwPSIiPgoKPC9wcmU+CiAgICAgIDxibG9ja3F1b3RlIHR5cGU9ImNpdGUiPgogICAgICAgIDxw
cmUgY2xhc3M9Im1vei1xdW90ZS1wcmUiIHdyYXA9IiI+ZGlmZiAtLWdpdCBhL1NpbGljb24vQW1w
ZXJlL0FtcGVyZUFsdHJhUGtnL0xpYnJhcnkvQW1wZXJlQ3B1TGliL0FtcGVyZUNwdUxpYi5jIGIv
U2lsaWNvbi9BbXBlcmUvQW1wZXJlQWx0cmFQa2cvTGlicmFyeS9BbXBlcmVDcHVMaWIvQW1wZXJl
Q3B1TGliLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwLi44ZGE2OThl
MGI4NTUKLS0tIC9kZXYvbnVsbAorKysgYi9TaWxpY29uL0FtcGVyZS9BbXBlcmVBbHRyYVBrZy9M
aWJyYXJ5L0FtcGVyZUNwdUxpYi9BbXBlcmVDcHVMaWIuYwpAQCAtMCwwICsxLDcwNiBAQAorLyoq
IEBmaWxlCisKKyAgQ29weXJpZ2h0IChjKSAyMDIwIC0gMjAyMSwgQW1wZXJlIENvbXB1dGluZyBM
TEMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuJmx0O0JSJmd0OworCisgIFNQRFgtTGljZW5zZS1JZGVu
dGlmaWVyOiBCU0QtMi1DbGF1c2UtUGF0ZW50CisKKyoqLworCisjaW5jbHVkZSAmbHQ7UGlQZWku
aCZndDsKKyNpbmNsdWRlICZsdDtVZWZpLmgmZ3Q7CisKKyNpbmNsdWRlICZsdDtHdWlkL1BsYXRm
b3JtSW5mb0hvYkd1aWQuaCZndDsKKyNpbmNsdWRlICZsdDtMaWJyYXJ5L0FtcGVyZUNwdUxpYi5o
Jmd0OworI2luY2x1ZGUgJmx0O0xpYnJhcnkvQXJtTGliL0FybUxpYlByaXZhdGUuaCZndDsKKyNp
bmNsdWRlICZsdDtMaWJyYXJ5L0Jhc2VNZW1vcnlMaWIuaCZndDsKKyNpbmNsdWRlICZsdDtMaWJy
YXJ5L0RlYnVnTGliLmgmZ3Q7CisjaW5jbHVkZSAmbHQ7TGlicmFyeS9Ib2JMaWIuaCZndDsKKyNp
bmNsdWRlICZsdDtMaWJyYXJ5L0lvTGliLmgmZ3Q7CisjaW5jbHVkZSAmbHQ7TGlicmFyeS9OVlBh
cmFtTGliLmgmZ3Q7CisjaW5jbHVkZSAmbHQ7TlZQYXJhbURlZi5oJmd0OworI2luY2x1ZGUgJmx0
O1BsYXRmb3JtL0FjMDEuaCZndDsKKyNpbmNsdWRlICZsdDtQbGF0Zm9ybUluZm9Ib2IuaCZndDsK
KworU1RBVElDIFBMQVRGT1JNX0lORk9fSE9CICptUGxhdGZvcm1JbmZvSG9iID0gTlVMTDsKKwor
UExBVEZPUk1fSU5GT19IT0IgKgorR2V0UGxhdGZvcm1Ib2IgKAorICBWT0lECisgICkKK3sKKyAg
Vk9JRCAqSG9iOworCisgIGlmIChtUGxhdGZvcm1JbmZvSG9iID09IE5VTEwpIHsKKyAgICBIb2Ig
PSBHZXROZXh0R3VpZEhvYiAoCisgICAgICAgICAgICAmYW1wO2dQbGF0Zm9ybUhvYkd1aWQsCisg
ICAgICAgICAgICAoQ09OU1QgVk9JRCAqKUZpeGVkUGNkR2V0NjQgKFBjZFN5c3RlbU1lbW9yeUJh
c2UpCisgICAgICAgICAgICApOworICAgIEFTU0VSVCAoSG9iICE9IE5VTEwpOworICAgIGlmIChI
b2IgPT0gTlVMTCkgeworICAgICAgREVCVUcgKChERUJVR19FUlJPUiwgJnF1b3Q7JWE6IEZhaWxl
ZCB0byBnZXQgZ1BsYXRmb3JtSG9iR3VpZCFcbiZxdW90OywgX19GVU5DVElPTl9fKSk7CisgICAg
ICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBtUGxhdGZvcm1JbmZvSG9iID0gKFBMQVRGT1JN
X0lORk9fSE9CICopR0VUX0dVSURfSE9CX0RBVEEgKEhvYik7CisgIH0KKworICByZXR1cm4gbVBs
YXRmb3JtSW5mb0hvYjsKK30KKworLyoqCisgIEdldCB0aGUgU3ViTlVNQSBtb2RlLgorCisgIEBy
ZXR1cm4gICBVSU5UOCAgICAgIFRoZSBTdWJOVU1BIG1vZGUuCisKKyoqLworVUlOVDgKK0VGSUFQ
SQorQ3B1R2V0U3ViTnVtYU1vZGUgKAorICBWT0lECisgICkKK3sKKyAgUExBVEZPUk1fSU5GT19I
T0IgICpQbGF0Zm9ybUhvYjsKKworICBQbGF0Zm9ybUhvYiA9IEdldFBsYXRmb3JtSG9iICgpOwor
ICBpZiAoUGxhdGZvcm1Ib2IgPT0gTlVMTCkgeworICAgIHJldHVybiBTVUJOVU1BX01PREVfTU9O
T0xJVEhJQzsKKyAgfQorCisgIHJldHVybiBQbGF0Zm9ybUhvYi0mZ3Q7U3ViTnVtYU1vZGVbMF07
Cit9CisKKy8qKgorICBHZXQgdGhlIG51bWJlciBvZiBTdWJOVU1BIHJlZ2lvbi4KKworICBAcmV0
dXJuICAgVUlOVDggICAgICBUaGUgbnVtYmVyIG9mIFN1Yk5VTUEgcmVnaW9uLgorCisqKi8KK1VJ
TlQ4CitFRklBUEkKK0NwdUdldE51bWJlck9mU3ViTnVtYVJlZ2lvbiAoCisgIFZPSUQKKyAgKQor
eworICBVSU5UOCBTdWJOdW1hTW9kZTsKKyAgVUlOVDggTnVtYmVyT2ZTdWJOdW1hUmVnaW9uOwor
CisgIFN1Yk51bWFNb2RlID0gQ3B1R2V0U3ViTnVtYU1vZGUgKCk7CisgIEFTU0VSVCAoU3ViTnVt
YU1vZGUgJmx0Oz0gU1VCTlVNQV9NT0RFX1FVQURSQU5UKTsKKworICBzd2l0Y2ggKFN1Yk51bWFN
b2RlKSB7CisgIGNhc2UgU1VCTlVNQV9NT0RFX01PTk9MSVRISUM6CisgICAgTnVtYmVyT2ZTdWJO
dW1hUmVnaW9uID0gTU9OT0xJVElDX05VTV9PRl9SRUdJT047CisgICAgYnJlYWs7CisKKyAgY2Fz
ZSBTVUJOVU1BX01PREVfSEVNSVNQSEVSRToKKyAgICBOdW1iZXJPZlN1Yk51bWFSZWdpb24gPSBI
RU1JU1BIRVJFX05VTV9PRl9SRUdJT047CisgICAgYnJlYWs7CisKKyAgY2FzZSBTVUJOVU1BX01P
REVfUVVBRFJBTlQ6CisgICAgTnVtYmVyT2ZTdWJOdW1hUmVnaW9uID0gUVVBRFJBTlRfTlVNX09G
X1JFR0lPTjsKKyAgICBicmVhazsKKworICBkZWZhdWx0OgorICAgIC8vIFNob3VsZCBuZXZlciBy
ZWFjaCB0aGVyZS4KKyAgICBBU1NFUlQgKEZBTFNFKTsKKyAgICBicmVhazsKKyAgfQorCisgIHJl
dHVybiBOdW1iZXJPZlN1Yk51bWFSZWdpb247Cit9CisKKy8qKgorICBHZXQgdGhlIFN1Yk5VTUEg
bm9kZSBvZiBhIENQTS4KKworICBAcGFyYW0gICAgU29ja2V0SWQgICAgU29ja2V0IGluZGV4Lgor
ICBAcGFyYW0gICAgQ3BtICAgICAgICAgQ1BNIGluZGV4LgorICBAcmV0dXJuICAgVUlOVDggICAg
ICAgVGhlIFN1Yk5VTUEgbm9kZSBvZiBhIENQTS4KKworKiovCitVSU5UOAorRUZJQVBJCitDcHVH
ZXRTdWJOdW1Ob2RlICgKKyAgVUlOVDggIFNvY2tldElkLAorICBVSU5UMTYgQ3BtCisgICkKK3sK
KyAgQk9PTEVBTiBJc0FzeW1NZXNoOworICBVSU5UOCAgIFN1Yk51bWFOb2RlOworICBVSU5UMTYg
IE1heE51bWJlck9mQ1BNOworICBVSU5UOCAgIE1pZGRsZVJvdzsKKyAgVUlOVDggICBRdWFkcmFu
dEhpZ2hlclJvd05vZGVOdW1iZXJbTlVNX09GX0NQTV9QRVJfTUVTSF9ST1ddID0gezEsIDEsIDEs
IDEsIDMsIDMsIDMsIDN9OworICBVSU5UOCAgIFF1YWRyYW50TG93ZXJSb3dOb2RlTnVtYmVyW05V
TV9PRl9DUE1fUEVSX01FU0hfUk9XXSAgPSB7MCwgMCwgMCwgMCwgMiwgMiwgMiwgMn07CisgIFVJ
TlQ4ICAgUXVhZHJhbnRNaWRkbGVSb3dOb2RlTnVtYmVyW05VTV9PRl9DUE1fUEVSX01FU0hfUk9X
XSA9IHswLCAwLCAxLCAxLCAzLCAzLCAyLCAyfTsKKyAgVUlOVDggICBTdWJOdW1hTW9kZTsKKwor
ICBNYXhOdW1iZXJPZkNQTSA9IEdldE1heGltdW1OdW1iZXJPZkNQTXMgKCk7CisgIFN1Yk51bWFN
b2RlID0gQ3B1R2V0U3ViTnVtYU1vZGUgKCk7CisgIEFTU0VSVCAoU3ViTnVtYU1vZGUgJmx0Oz0g
U1VCTlVNQV9NT0RFX1FVQURSQU5UKTsKKworICBzd2l0Y2ggKFN1Yk51bWFNb2RlKSB7CisgIGNh
c2UgU1VCTlVNQV9NT0RFX01PTk9MSVRISUM6CisgICAgU3ViTnVtYU5vZGUgPSAoU29ja2V0SWQg
PT0gMCkgPyAwIDogMTsKKyAgICBicmVhazsKKworICBjYXNlIFNVQk5VTUFfTU9ERV9IRU1JU1BI
RVJFOgorICAgIGlmIChDUE1fUEVSX1JPV19PRkZTRVQgKENwbSkgJmd0Oz0gU1VCTlVNQV9DUE1f
UkVHSU9OX1NJWkUpIHsKKyAgICAgIFN1Yk51bWFOb2RlID0gMTsKKyAgICB9IGVsc2UgeworICAg
ICAgU3ViTnVtYU5vZGUgPSAwOworICAgIH0KKworICAgIGlmIChTb2NrZXRJZCA9PSAxKSB7Cisg
ICAgICBTdWJOdW1hTm9kZSArPSBIRU1JU1BIRVJFX05VTV9PRl9SRUdJT047CisgICAgfQorICAg
IGJyZWFrOworCisgIGNhc2UgU1VCTlVNQV9NT0RFX1FVQURSQU5UOgorICAgIC8vCisgICAgLy8g
Q1BNIE1lc2ggUm93cworICAgIC8vCisgICAgLy8gfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLXwKKyAgICAvLyB8IDAwIC0tLS0tLS0tLS0tIDAzIHwgMDQgLS0tLS0tLS0t
LS0gMDcgfCBSb3cgMAorICAgIC8vIHwtLS0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0t
LS0tLS18CisgICAgLy8gfCAwOCAtLS0tLS0tLS0tLSAxMSB8IDEyIC0tLS0tLS0tLS0tIDE1IHwg
Um93IDEKKyAgICAvLyB8LS0tLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tfAor
ICAgIC8vIHwgMTYgLSAxNyB8IDE4IC0gMTkgfCAyMCAtIDIxIHwgMjIgLSAyMyB8IE1pZGRsZSBS
b3cKKyAgICAvLyB8LS0tLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tfAorICAg
IC8vIHwgMjQgLS0tLS0tLS0tLS0gMjcgfCAyOCAtLS0tLS0tLS0tLSAzMSB8IFJvdyAzCisgICAg
Ly8gfC0tLS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLXwKKyAgICAvLyB8IDMy
IC0tLS0tLS0tLS0tIDM1IHwgMzYgLS0tLS0tLS0tLS0gMzkgfCBSb3cgNAorICAgIC8vIHwtLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18CisgICAgLy8KKworICAgIElzQXN5
bU1lc2ggPSAoQk9PTEVBTikoQ1BNX1JPV19OVU1CRVIgKE1heE51bWJlck9mQ1BNKSAlIDIgIT0g
MCk7CisgICAgTWlkZGxlUm93ID0gQ1BNX1JPV19OVU1CRVIgKE1heE51bWJlck9mQ1BNKSAvIDI7
CisgICAgaWYgKElzQXN5bU1lc2gKKyAgICAgICAgJmFtcDsmYW1wOyBDUE1fUk9XX05VTUJFUiAo
Q3BtKSA9PSBNaWRkbGVSb3cpCisgICAgeworICAgICAgU3ViTnVtYU5vZGUgPSBRdWFkcmFudE1p
ZGRsZVJvd05vZGVOdW1iZXJbQ1BNX1BFUl9ST1dfT0ZGU0VUIChDcG0pXTsKKworICAgIH0gZWxz
ZSBpZiAoQ1BNX1JPV19OVU1CRVIgKENwbSkgJmd0Oz0gTWlkZGxlUm93KSB7CisgICAgICBTdWJO
dW1hTm9kZSA9IFF1YWRyYW50SGlnaGVyUm93Tm9kZU51bWJlcltDUE1fUEVSX1JPV19PRkZTRVQg
KENwbSldOworCisgICAgfSBlbHNlIHsKKyAgICAgIFN1Yk51bWFOb2RlID0gUXVhZHJhbnRMb3dl
clJvd05vZGVOdW1iZXJbQ1BNX1BFUl9ST1dfT0ZGU0VUIChDcG0pXTsKKyAgICB9CisKKyAgICBp
ZiAoU29ja2V0SWQgPT0gMSkgeworICAgICAgU3ViTnVtYU5vZGUgKz0gUVVBRFJBTlRfTlVNX09G
X1JFR0lPTjsKKyAgICB9CisgICAgYnJlYWs7CisKKyAgZGVmYXVsdDoKKyAgICAvLyBTaG91bGQg
bmV2ZXIgcmVhY2ggdGhlcmUuCisgICAgQVNTRVJUIChGQUxTRSk7CisgICAgYnJlYWs7CisgIH0K
KworICByZXR1cm4gU3ViTnVtYU5vZGU7Cit9CisKKy8qKgorICBHZXQgdGhlIGFzc29jaWF0aXZp
dHkgb2YgY2FjaGUuCisKKyAgQHBhcmFtICAgIExldmVsICAgICAgIENhY2hlIGxldmVsLgorICBA
cmV0dXJuICAgVUlOVDMyICAgICAgQXNzb2NpYXRpdml0eSBvZiBjYWNoZS4KKworKiovCitVSU5U
MzIKK0VGSUFQSQorQ3B1R2V0QXNzb2NpYXRpdml0eSAoCisgIFVJTlQzMiBMZXZlbAorICApCit7
CjwvcHJlPgogICAgICA8L2Jsb2NrcXVvdGU+CiAgICAgIDxwcmUgY2xhc3M9Im1vei1xdW90ZS1w
cmUiIHdyYXA9IiI+CkkgZG8gZmVlbCBzb21lIG9mIHRoaXMgc3R1ZmYgY291bGQgYmUgcmVwbGFj
ZWQgYnkgdGhlIGNvbW1vbiBmdW5jdGlvbnMKd2Ugbm93IGhhdmUgaW4gQXJtTGliICh0aGF0IHdl
IGRpZG4ndCB3aGVuIHYxIHdlbnQgb3V0KS4KCjwvcHJlPgogICAgICA8YmxvY2txdW90ZSB0eXBl
PSJjaXRlIj4KICAgICAgICA8cHJlIGNsYXNzPSJtb3otcXVvdGUtcHJlIiB3cmFwPSIiPisgIFVJ
TlQ2NCBDYWNoZUNDU0lEUjsKKyAgVUlOVDY0IENhY2hlQ0xJRFI7CisgIFVJTlQzMiBWYWx1ZSA9
IDB4MjsgLyogVW5rbm93biBTZXQtQXNzb2NpYXRpdml0eSAqLworCisgIENhY2hlQ0xJRFIgPSBS
ZWFkQ0xJRFIgKCk7CisgIGlmICghQ0xJRFJfQ1RZUEUgKENhY2hlQ0xJRFIsIExldmVsKSkgewor
ICAgIHJldHVybiBWYWx1ZTsKKyAgfQorCisgIENhY2hlQ0NTSURSID0gUmVhZENDU0lEUiAoTGV2
ZWwpOworICBzd2l0Y2ggKENDU0lEUl9BU1NPQ0lBVElWSVRZIChDYWNoZUNDU0lEUikpIHsKKyAg
Y2FzZSAwOgorICAgIC8qIERpcmVjdCBtYXBwZWQgKi8KKyAgICBWYWx1ZSA9IDB4MzsKKyAgICBi
cmVhazsKKworICBjYXNlIDE6CisgICAgLyogMi13YXkgU2V0LUFzc29jaWF0aXZpdHkgKi8KKyAg
ICBWYWx1ZSA9IDB4NDsKKyAgICBicmVhazsKKworICBjYXNlIDM6CisgICAgLyogNC13YXkgU2V0
LUFzc29jaWF0aXZpdHkgKi8KKyAgICBWYWx1ZSA9IDB4NTsKKyAgICBicmVhazsKKworICBjYXNl
IDc6CisgICAgLyogOC13YXkgU2V0LUFzc29jaWF0aXZpdHkgKi8KKyAgICBWYWx1ZSA9IDB4NzsK
KyAgICBicmVhazsKKworICBjYXNlIDE1OgorICAgIC8qIDE2LXdheSBTZXQtQXNzb2NpYXRpdml0
eSAqLworICAgIFZhbHVlID0gMHg4OworICAgIGJyZWFrOworCisgIGNhc2UgMTE6CisgICAgLyog
MTItd2F5IFNldC1Bc3NvY2lhdGl2aXR5ICovCisgICAgVmFsdWUgPSAweDk7CisgICAgYnJlYWs7
CisKKyAgY2FzZSAyMzoKKyAgICAvKiAyNC13YXkgU2V0LUFzc29jaWF0aXZpdHkgKi8KKyAgICBW
YWx1ZSA9IDB4QTsKKyAgICBicmVhazsKKworICBjYXNlIDMxOgorICAgIC8qIDMyLXdheSBTZXQt
QXNzb2NpYXRpdml0eSAqLworICAgIFZhbHVlID0gMHhCOworICAgIGJyZWFrOworCisgIGNhc2Ug
NDc6CisgICAgLyogNDgtd2F5IFNldC1Bc3NvY2lhdGl2aXR5ICovCisgICAgVmFsdWUgPSAweEM7
CisgICAgYnJlYWs7CisKKyAgY2FzZSA2MzoKKyAgICAvKiA2NC13YXkgU2V0LUFzc29jaWF0aXZp
dHkgKi8KKyAgICBWYWx1ZSA9IDB4RDsKKyAgICBicmVhazsKKworICBjYXNlIDE5OgorICAgIC8q
IDIwLXdheSBTZXQtQXNzb2NpYXRpdml0eSAqLworICAgIFZhbHVlID0gMHhFOworICAgIGJyZWFr
OworICB9CisKKyAgcmV0dXJuIFZhbHVlOworfQorCisvKioKKyAgR2V0IHRoZSBjYWNoZSBzaXpl
LgorCisgIEBwYXJhbSAgICBMZXZlbCAgICAgICBDYWNoZSBsZXZlbC4KKyAgQHJldHVybiAgIFVJ
TlQzMiAgICAgIENhY2hlIHNpemUuCisKKyoqLworVUlOVDMyCitFRklBUEkKK0NwdUdldENhY2hl
U2l6ZSAoCisgIFVJTlQzMiBMZXZlbAorICApCit7CisgIFVJTlQzMiBDYWNoZUxpbmVTaXplOwor
ICBVSU5UMzIgQ291bnQ7CisgIFVJTlQ2NCBDYWNoZUNDU0lEUjsKKyAgVUlOVDY0IENhY2hlQ0xJ
RFI7CisKKyAgQ2FjaGVDTElEUiA9IFJlYWRDTElEUiAoKTsKKyAgaWYgKCFDTElEUl9DVFlQRSAo
Q2FjaGVDTElEUiwgTGV2ZWwpKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKworICBDYWNoZUNDU0lE
UiA9IFJlYWRDQ1NJRFIgKExldmVsKTsKKyAgQ2FjaGVMaW5lU2l6ZSA9IDE7CisgIENvdW50ID0g
Q0NTSURSX0xJTkVfU0laRSAoQ2FjaGVDQ1NJRFIpICsgNDsKKyAgd2hpbGUgKENvdW50LS0gJmd0
OyAwKSB7CisgICAgQ2FjaGVMaW5lU2l6ZSAqPSAyOworICB9CisKKyAgcmV0dXJuICgoQ0NTSURS
X05VTVNFVFMgKENhY2hlQ0NTSURSKSArIDEpICoKKyAgICAgICAgICAoQ0NTSURSX0FTU09DSUFU
SVZJVFkgKENhY2hlQ0NTSURSKSArIDEpICoKKyAgICAgICAgICBDYWNoZUxpbmVTaXplKTsKK30K
KworLyoqCisgIEdldCB0aGUgbnVtYmVyIG9mIHN1cHBvcnRlZCBzb2NrZXQuCisKKyAgQHJldHVy
biAgIFVJTlQ4ICAgICAgTnVtYmVyIG9mIHN1cHBvcnRlZCBzb2NrZXQuCisKKyoqLworVUlOVDgK
K0VGSUFQSQorR2V0TnVtYmVyT2ZTdXBwb3J0ZWRTb2NrZXRzICgKKyAgVk9JRAorICApCit7Cisg
IFBMQVRGT1JNX0lORk9fSE9CICAqUGxhdGZvcm1Ib2I7CisKKyAgUGxhdGZvcm1Ib2IgPSBHZXRQ
bGF0Zm9ybUhvYiAoKTsKKyAgaWYgKFBsYXRmb3JtSG9iID09IE5VTEwpIHsKKyAgICAvLworICAg
IC8vIEJ5IGRlZmF1bHQsIHRoZSBudW1iZXIgb2Ygc3VwcG9ydGVkIHNvY2tldHMgaXMgMS4KKyAg
ICAvLworICAgIHJldHVybiAxOworICB9CisKKyAgcmV0dXJuIChzaXplb2YgKFBsYXRmb3JtSG9i
LSZndDtDbHVzdGVyRW4pIC8gc2l6ZW9mIChQTEFURk9STV9DTFVTVEVSX0VOKSk7Cit9CisKKy8q
KgorICBHZXQgdGhlIG51bWJlciBvZiBhY3RpdmUgc29ja2V0LgorCisgIEByZXR1cm4gICBVSU5U
OCAgICAgIE51bWJlciBvZiBhY3RpdmUgc29ja2V0LgorCisqKi8KK1VJTlQ4CitFRklBUEkKK0dl
dE51bWJlck9mQWN0aXZlU29ja2V0cyAoCisgIFZPSUQKKyAgKQoreworICBVSU5UOCAgICAgICAg
ICAgICAgIE51bWJlck9mQWN0aXZlU29ja2V0cywgQ291bnQsIEluZGV4LCBJbmRleDE7CisgIFBM
QVRGT1JNX0NMVVNURVJfRU4gKlNvY2tldDsKKyAgUExBVEZPUk1fSU5GT19IT0IgICAqUGxhdGZv
cm1Ib2I7CisKKyAgUGxhdGZvcm1Ib2IgPSBHZXRQbGF0Zm9ybUhvYiAoKTsKKyAgaWYgKFBsYXRm
b3JtSG9iID09IE5VTEwpIHsKKyAgICAvLworICAgIC8vIEJ5IGRlZmF1bHQsIHRoZSBudW1iZXIg
b2YgYWN0aXZlIHNvY2tldHMgaXMgMS4KKyAgICAvLworICAgIHJldHVybiAxOworICB9CisKKyAg
TnVtYmVyT2ZBY3RpdmVTb2NrZXRzID0gMDsKKworICBmb3IgKEluZGV4ID0gMDsgSW5kZXggJmx0
OyBHZXROdW1iZXJPZlN1cHBvcnRlZFNvY2tldHMgKCk7IEluZGV4KyspIHsKKyAgICBTb2NrZXQg
PSAmYW1wO1BsYXRmb3JtSG9iLSZndDtDbHVzdGVyRW5bSW5kZXhdOworICAgIENvdW50ID0gQVJS
QVlfU0laRSAoU29ja2V0LSZndDtFbmFibGVNYXNrKTsKKyAgICBmb3IgKEluZGV4MSA9IDA7IElu
ZGV4MSAmbHQ7IENvdW50OyBJbmRleDErKykgeworICAgICAgaWYgKFNvY2tldC0mZ3Q7RW5hYmxl
TWFza1tJbmRleDFdICE9IDApIHsKKyAgICAgICAgTnVtYmVyT2ZBY3RpdmVTb2NrZXRzKys7Cisg
ICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKyAgfQorCisgIHJldHVybiBOdW1iZXJPZkFj
dGl2ZVNvY2tldHM7Cit9CisKKy8qKgorICBHZXQgdGhlIG51bWJlciBvZiBhY3RpdmUgQ1BNIHBl
ciBzb2NrZXQuCisKKyAgQHBhcmFtICAgIFNvY2tldElkICAgIFNvY2tldCBpbmRleC4KKyAgQHJl
dHVybiAgIFVJTlQxNiAgICAgIE51bWJlciBvZiBDUE0uCisKKyoqLworVUlOVDE2CitFRklBUEkK
K0dldE51bWJlck9mQWN0aXZlQ1BNc1BlclNvY2tldCAoCisgIFVJTlQ4IFNvY2tldElkCisgICkK
K3sKKyAgVUlOVDE2ICAgICAgICAgICAgICBOdW1iZXJPZkNQTXMsIENvdW50LCBJbmRleDsKKyAg
VUlOVDMyICAgICAgICAgICAgICBWYWwzMjsKKyAgUExBVEZPUk1fQ0xVU1RFUl9FTiAqU29ja2V0
OworICBQTEFURk9STV9JTkZPX0hPQiAgICpQbGF0Zm9ybUhvYjsKKworICBQbGF0Zm9ybUhvYiA9
IEdldFBsYXRmb3JtSG9iICgpOworICBpZiAoUGxhdGZvcm1Ib2IgPT0gTlVMTCkgeworICAgIHJl
dHVybiAwOworICB9CisKKyAgaWYgKFNvY2tldElkICZndDs9IEdldE51bWJlck9mQWN0aXZlU29j
a2V0cyAoKSkgeworICAgIHJldHVybiAwOworICB9CisKKyAgTnVtYmVyT2ZDUE1zID0gMDsKKyAg
U29ja2V0ID0gJmFtcDtQbGF0Zm9ybUhvYi0mZ3Q7Q2x1c3RlckVuW1NvY2tldElkXTsKKyAgQ291
bnQgPSBBUlJBWV9TSVpFIChTb2NrZXQtJmd0O0VuYWJsZU1hc2spOworICBmb3IgKEluZGV4ID0g
MDsgSW5kZXggJmx0OyBDb3VudDsgSW5kZXgrKykgeworICAgIFZhbDMyID0gU29ja2V0LSZndDtF
bmFibGVNYXNrW0luZGV4XTsKKyAgICB3aGlsZSAoVmFsMzIgJmd0OyAwKSB7CisgICAgICBpZiAo
KFZhbDMyICZhbXA7IDB4MSkgIT0gMCkgeworICAgICAgICBOdW1iZXJPZkNQTXMrKzsKKyAgICAg
IH0KKyAgICAgIFZhbDMyICZndDsmZ3Q7PSAxOworICAgIH0KKyAgfQorCisgIHJldHVybiBOdW1i
ZXJPZkNQTXM7Cit9CisKKy8qKgorICBHZXQgdGhlIG51bWJlciBvZiBjb25maWd1cmVkIENQTSBw
ZXIgc29ja2V0LiBUaGlzIG51bWJlcgorICBzaG91bGQgYmUgdGhlIHNhbWUgZm9yIGFsbCBzb2Nr
ZXRzLgorCisgIEBwYXJhbSAgICBTb2NrZXRJZCAgICBTb2NrZXQgaW5kZXguCisgIEByZXR1cm4g
ICBVSU5UOCAgICAgICBOdW1iZXIgb2YgY29uZmlndXJlZCBDUE0uCisKKyoqLworVUlOVDE2CitF
RklBUEkKK0dldE51bWJlck9mQ29uZmlndXJlZENQTXMgKAorICBVSU5UOCBTb2NrZXRJZAorICAp
Cit7CisgIEVGSV9TVEFUVVMgU3RhdHVzOworICBVSU5UMzIgICAgIFZhbHVlOworICBVSU5UMzIg
ICAgIFBhcmFtLCBQYXJhbVN0YXJ0LCBQYXJhbUVuZDsKKyAgVUlOVDE2ICAgICBDb3VudDsKKwor
ICBDb3VudCA9IDA7CisgIFBhcmFtU3RhcnQgPSBOVl9TSV9TMF9QQ1BfQUNUSVZFQ1BNXzBfMzEg
KyBTb2NrZXRJZCAqIE5WX1BBUkFNX0VOVFJZU0laRSAqIChQTEFURk9STV9DUFVfTUFYX0NQTSAv
IDMyKTsKKyAgUGFyYW1FbmQgPSBQYXJhbVN0YXJ0ICsgTlZfUEFSQU1fRU5UUllTSVpFICogKFBM
QVRGT1JNX0NQVV9NQVhfQ1BNIC8gMzIpOworICBmb3IgKFBhcmFtID0gUGFyYW1TdGFydDsgUGFy
YW0gJmx0OyBQYXJhbUVuZDsgUGFyYW0gKz0gTlZfUEFSQU1fRU5UUllTSVpFKSB7CisgICAgU3Rh
dHVzID0gTlZQYXJhbUdldCAoCisgICAgICAgICAgICAgICBQYXJhbSwKKyAgICAgICAgICAgICAg
IE5WX1BFUk1fQVRGIHwgTlZfUEVSTV9CSU9TIHwgTlZfUEVSTV9NQU5VIHwgTlZfUEVSTV9CTUMs
CisgICAgICAgICAgICAgICAmYW1wO1ZhbHVlCisgICAgICAgICAgICAgICApOworICAgIGlmIChF
RklfRVJST1IgKFN0YXR1cykpIHsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICB3aGlsZSAoVmFs
dWUgIT0gMCkgeworICAgICAgaWYgKChWYWx1ZSAmYW1wOyAweDAxKSAhPSAwKSB7CisgICAgICAg
IENvdW50Kys7CisgICAgICB9CisgICAgICBWYWx1ZSAmZ3Q7Jmd0Oz0gMTsKKyAgICB9CisgIH0K
KworICByZXR1cm4gQ291bnQ7Cit9CisKKy8qKgorICBTZXQgdGhlIG51bWJlciBvZiBjb25maWd1
cmVkIENQTSBwZXIgc29ja2V0LgorCisgIEBwYXJhbSAgICBTb2NrZXRJZCAgICAgICAgU29ja2V0
IGluZGV4LgorICBAcGFyYW0gICAgTnVtYmVyT2ZDUE1zICAgIE51bWJlciBvZiBDUE0gdG8gYmUg
Y29uZmlndXJlZC4KKyAgQHJldHVybiAgIEVGSV9TVUNDRVNTICAgICBPcGVyYXRpb24gc3VjY2Vl
ZGVkLgorICBAcmV0dXJuICAgT3RoZXJzICAgICAgICAgIEFuIGVycm9yIGhhcyBvY2N1cnJlZC4K
KworKiovCitFRklfU1RBVFVTCitFRklBUEkKK1NldE51bWJlck9mQ29uZmlndXJlZENQTXMgKAor
ICBVSU5UOCAgU29ja2V0SWQsCisgIFVJTlQxNiBOdW1iZXJPZkNQTXMKKyAgKQoreworICBFRklf
U1RBVFVTIFN0YXR1czsKKyAgVUlOVDMyICAgICBWYWx1ZTsKKyAgVUlOVDMyICAgICBQYXJhbSwg
UGFyYW1TdGFydCwgUGFyYW1FbmQ7CisgIEJPT0xFQU4gICAgSXNDbGVhcjsKKworICBJc0NsZWFy
ID0gRkFMU0U7CisgIGlmIChOdW1iZXJPZkNQTXMgPT0gMCkgeworICAgIElzQ2xlYXIgPSBUUlVF
OworICB9CisKKyAgU3RhdHVzID0gRUZJX1NVQ0NFU1M7CisKKyAgUGFyYW1TdGFydCA9IE5WX1NJ
X1MwX1BDUF9BQ1RJVkVDUE1fMF8zMSArIFNvY2tldElkICogTlZfUEFSQU1fRU5UUllTSVpFICog
KFBMQVRGT1JNX0NQVV9NQVhfQ1BNIC8gMzIpOworICBQYXJhbUVuZCA9IFBhcmFtU3RhcnQgKyBO
Vl9QQVJBTV9FTlRSWVNJWkUgKiAoUExBVEZPUk1fQ1BVX01BWF9DUE0gLyAzMik7CisgIGZvciAo
UGFyYW0gPSBQYXJhbVN0YXJ0OyBQYXJhbSAmbHQ7IFBhcmFtRW5kOyBQYXJhbSArPSBOVl9QQVJB
TV9FTlRSWVNJWkUpIHsKKyAgICBpZiAoTnVtYmVyT2ZDUE1zICZndDs9IDMyKSB7CisgICAgICBW
YWx1ZSA9IDB4ZmZmZmZmZmY7CisgICAgICBOdW1iZXJPZkNQTXMgLT0gMzI7CisgICAgfSBlbHNl
IHsKKyAgICAgIFZhbHVlID0gMDsKKyAgICAgIHdoaWxlIChOdW1iZXJPZkNQTXMgJmd0OyAwKSB7
CisgICAgICAgIFZhbHVlIHw9ICgxICZsdDsmbHQ7ICgtLU51bWJlck9mQ1BNcykpOworICAgICAg
fQorICAgIH0KKyAgICBpZiAoSXNDbGVhcikgeworICAgICAgLyogQ2xlYXIgdGhpcyBwYXJhbSAq
LworICAgICAgU3RhdHVzID0gTlZQYXJhbUNsciAoCisgICAgICAgICAgICAgICAgIFBhcmFtLAor
ICAgICAgICAgICAgICAgICBOVl9QRVJNX0JJT1MgfCBOVl9QRVJNX01BTlUKKyAgICAgICAgICAg
ICAgICAgKTsKKyAgICB9IGVsc2UgeworICAgICAgU3RhdHVzID0gTlZQYXJhbVNldCAoCisgICAg
ICAgICAgICAgICAgIFBhcmFtLAorICAgICAgICAgICAgICAgICBOVl9QRVJNX0FURiB8IE5WX1BF
Uk1fQklPUyB8IE5WX1BFUk1fTUFOVSB8IE5WX1BFUk1fQk1DLAorICAgICAgICAgICAgICAgICBO
Vl9QRVJNX0JJT1MgfCBOVl9QRVJNX01BTlUsCisgICAgICAgICAgICAgICAgIFZhbHVlCisgICAg
ICAgICAgICAgICAgICk7CisgICAgfQorICB9CisKKyAgcmV0dXJuIFN0YXR1czsKK30KKworLyoq
CisgIEdldCB0aGUgbWF4aW11bSBudW1iZXIgb2YgY29yZSBwZXIgc29ja2V0LgorCisgIEByZXR1
cm4gICBVSU5UMTYgICAgICBNYXhpbXVtIG51bWJlciBvZiBjb3JlLgorCisqKi8KK1VJTlQxNgor
RUZJQVBJCitHZXRNYXhpbXVtTnVtYmVyT2ZDb3JlcyAoCisgIFZPSUQKKyAgKQoreworICBQTEFU
Rk9STV9JTkZPX0hPQiAgKlBsYXRmb3JtSG9iOworCisgIFBsYXRmb3JtSG9iID0gR2V0UGxhdGZv
cm1Ib2IgKCk7CisgIGlmIChQbGF0Zm9ybUhvYiA9PSBOVUxMKSB7CisgICAgcmV0dXJuIDA7Cisg
IH0KKworICByZXR1cm4gUGxhdGZvcm1Ib2ItJmd0O01heE51bU9mQ29yZVswXTsKK30KKworLyoq
CisgIEdldCB0aGUgbWF4aW11bSBudW1iZXIgb2YgQ1BNIHBlciBzb2NrZXQuIFRoaXMgbnVtYmVy
CisgIHNob3VsZCBiZSB0aGUgc2FtZSBmb3IgYWxsIHNvY2tldHMuCisKKyAgQHJldHVybiAgIFVJ
TlQxNiAgICAgIE1heGltdW0gbnVtYmVyIG9mIENQTS4KKworKiovCitVSU5UMTYKK0VGSUFQSQor
R2V0TWF4aW11bU51bWJlck9mQ1BNcyAoCisgIFZPSUQKKyAgKQoreworICByZXR1cm4gR2V0TWF4
aW11bU51bWJlck9mQ29yZXMgKCkgLyBQTEFURk9STV9DUFVfTlVNX0NPUkVTX1BFUl9DUE07Cit9
CisKKy8qKgorICBHZXQgdGhlIG51bWJlciBvZiBhY3RpdmUgY29yZXMgb2YgYSBzb2NrZXRzLgor
CisgIEBwYXJhbSAgICBTb2NrZXRJZCAgICBTb2NrZXQgSW5kZXguCisgIEByZXR1cm4gICBVSU5U
MTYgICAgICBOdW1iZXIgb2YgYWN0aXZlIGNvcmUuCisKKyoqLworVUlOVDE2CitFRklBUEkKK0dl
dE51bWJlck9mQWN0aXZlQ29yZXNQZXJTb2NrZXQgKAorICBVSU5UOCBTb2NrZXRJZAorICApCit7
CisgIHJldHVybiBHZXROdW1iZXJPZkFjdGl2ZUNQTXNQZXJTb2NrZXQgKFNvY2tldElkKSAqIFBM
QVRGT1JNX0NQVV9OVU1fQ09SRVNfUEVSX0NQTTsKK30KKworLyoqCisgIEdldCB0aGUgbnVtYmVy
IG9mIGFjdGl2ZSBjb3JlcyBvZiBhbGwgc29ja2V0cy4KKworICBAcmV0dXJuICAgVUlOVDE2ICAg
ICAgTnVtYmVyIG9mIGFjdGl2ZSBjb3JlLgorCisqKi8KK1VJTlQxNgorRUZJQVBJCitHZXROdW1i
ZXJPZkFjdGl2ZUNvcmVzICgKKyAgVk9JRAorICApCit7CisgIFVJTlQxNiBOdW1iZXJPZkFjdGl2
ZUNvcmVzOworICBVSU5UOCAgSW5kZXg7CisKKyAgTnVtYmVyT2ZBY3RpdmVDb3JlcyA9IDA7CisK
KyAgZm9yIChJbmRleCA9IDA7IEluZGV4ICZsdDsgR2V0TnVtYmVyT2ZBY3RpdmVTb2NrZXRzICgp
OyBJbmRleCsrKSB7CisgICAgTnVtYmVyT2ZBY3RpdmVDb3JlcyArPSBHZXROdW1iZXJPZkFjdGl2
ZUNvcmVzUGVyU29ja2V0IChJbmRleCk7CisgIH0KKworICByZXR1cm4gTnVtYmVyT2ZBY3RpdmVD
b3JlczsKK30KKworLyoqCisgIENoZWNrIGlmIHRoZSBsb2dpY2FsIENQVSBpcyBlbmFibGVkIG9y
IG5vdC4KKworICBAcGFyYW0gICAgQ3B1SWQgICAgICAgVGhlIGxvZ2ljYWwgQ3B1IElELiBTdGFy
dGVkIGZyb20gMC4KKyAgQHJldHVybiAgIEJPT0xFQU4gICAgIFRSVUUgaWYgdGhlIENwdSBlbmFi
bGVkCisgICAgICAgICAgICAgICAgICAgICAgICBGQUxTRSBpZiB0aGUgQ3B1IGRpc2FibGVkLgor
CisqKi8KK0JPT0xFQU4KK0VGSUFQSQorSXNDcHVFbmFibGVkICgKKyAgVUlOVDE2IENwdUlkCisg
ICkKK3sKKyAgUExBVEZPUk1fQ0xVU1RFUl9FTiAqU29ja2V0OworICBQTEFURk9STV9JTkZPX0hP
QiAgICpQbGF0Zm9ybUhvYjsKKyAgVUlOVDggICAgICAgICAgICAgICBTb2NrZXRJZDsKKyAgVUlO
VDE2ICAgICAgICAgICAgICBDbHVzdGVySWQ7CisKKyAgU29ja2V0SWQgPSBTT0NLRVRfSUQgKENw
dUlkKTsKKyAgQ2x1c3RlcklkID0gQ0xVU1RFUl9JRCAoQ3B1SWQpOworCisgIFBsYXRmb3JtSG9i
ID0gR2V0UGxhdGZvcm1Ib2IgKCk7CisgIGlmIChQbGF0Zm9ybUhvYiA9PSBOVUxMKSB7CisgICAg
cmV0dXJuIEZBTFNFOworICB9CisKKyAgaWYgKFNvY2tldElkICZndDs9IEdldE51bWJlck9mQWN0
aXZlU29ja2V0cyAoKSkgeworICAgIHJldHVybiBGQUxTRTsKKyAgfQorCisgIFNvY2tldCA9ICZh
bXA7UGxhdGZvcm1Ib2ItJmd0O0NsdXN0ZXJFbltTb2NrZXRJZF07CisgIGlmICgoU29ja2V0LSZn
dDtFbmFibGVNYXNrW0NsdXN0ZXJJZCAvIDMyXSAmYW1wOyAoMSAmbHQ7Jmx0OyAoQ2x1c3Rlcklk
ICUgMzIpKSkgIT0gMCkgeworICAgIHJldHVybiBUUlVFOworICB9CisKKyAgcmV0dXJuIEZBTFNF
OworfQorCisvKioKKyAgQ2hlY2sgaWYgdGhlIHNsYXZlIHNvY2tldCBpcyBwcmVzZW50CisKKyAg
QHJldHVybiAgIEJPT0xFQU4gICAgIFRSVUUgaWYgdGhlIFNsYXZlIENwdSBpcyBwcmVzZW50Cisg
ICAgICAgICAgICAgICAgICAgICAgICBGQUxTRSBpZiB0aGUgU2xhdmUgQ3B1IGlzIG5vdCBwcmVz
ZW50CisKKyoqLworQk9PTEVBTgorRUZJQVBJCitJc1NsYXZlU29ja2V0UHJlc2VudCAoCisgIFZP
SUQKKyAgKQoreworICBVSU5UMzIgVmFsdWU7CisKKyAgVmFsdWUgPSBNbWlvUmVhZDMyIChTTVBS
T19FRlVTRV9TSEFET1cwICsgQ0ZHMlBfT0ZGU0VUKTsKKworICByZXR1cm4gKChWYWx1ZSAmYW1w
OyBTTEFWRV9QUkVTRU5UX04pICE9IDApID8gRkFMU0UgOiBUUlVFOworfQorCisvKioKKyAgQ2hl
Y2sgaWYgdGhlIHNsYXZlIHNvY2tldCBpcyBhY3RpdmUKKworICBAcmV0dXJuICAgQk9PTEVBTiAg
ICAgVFJVRSBpZiB0aGUgU2xhdmUgQ1BVIFNvY2tldCBpcyBhY3RpdmUuCisgICAgICAgICAgICAg
ICAgICAgICAgICBGQUxTRSBpZiB0aGUgU2xhdmUgQ1BVIFNvY2tldCBpcyBub3QgYWN0aXZlLgor
CisqKi8KK0JPT0xFQU4KK0VGSUFQSQorSXNTbGF2ZVNvY2tldEFjdGl2ZSAoCisgIFZPSUQKKyAg
KQoreworICByZXR1cm4gKEdldE51bWJlck9mQWN0aXZlU29ja2V0cyAoKSAmZ3Q7IDEpID8gVFJV
RSA6IEZBTFNFOworfQorCisvKioKKyAgQ2hlY2sgaWYgdGhlIENQVSBwcm9kdWN0IElEIGlzIEFj
MDEKKyAgQHJldHVybiAgIEJPT0xFQU4gICAgIFRSVUUgaWYgdGhlIFByb2R1Y3QgSUQgaXMgQWMw
MQorICAgICAgICAgICAgICAgICAgICAgICAgRkFMU0Ugb3RoZXJ3aXNlLgorCisqKi8KK0JPT0xF
QU4KK0VGSUFQSQorSXNBYzAxUHJvY2Vzc29yICgKKyAgVk9JRAorICApCit7CisgIFBMQVRGT1JN
X0lORk9fSE9CICAqUGxhdGZvcm1Ib2I7CisKKyAgUGxhdGZvcm1Ib2IgPSBHZXRQbGF0Zm9ybUhv
YiAoKTsKKyAgQVNTRVJUIChQbGF0Zm9ybUhvYiAhPSBOVUxMKTsKKworICBpZiAoUGxhdGZvcm1I
b2IgIT0gTlVMTCkgeworICAgIGlmICgoUGxhdGZvcm1Ib2ItJmd0O1NjdVByb2R1Y3RJZFswXSAm
YW1wOyAweEZGKSA9PSAweDAxKSB7CisgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisgIH0KKwor
ICByZXR1cm4gRkFMU0U7Cit9CjwvcHJlPgogICAgICA8L2Jsb2NrcXVvdGU+CiAgICAgIDxwcmUg
Y2xhc3M9Im1vei1xdW90ZS1wcmUiIHdyYXA9IiI+CgoKPC9wcmU+CiAgICAgIDxibG9ja3F1b3Rl
IHR5cGU9ImNpdGUiPgogICAgICAgIDxwcmUgY2xhc3M9Im1vei1xdW90ZS1wcmUiIHdyYXA9IiI+
ZGlmZiAtLWdpdCBhL1NpbGljb24vQW1wZXJlL0FtcGVyZUFsdHJhUGtnL0xpYnJhcnkvQXJtUGxh
dGZvcm1MaWIvQXJtUGxhdGZvcm1MaWIuYyBiL1NpbGljb24vQW1wZXJlL0FtcGVyZUFsdHJhUGtn
L0xpYnJhcnkvQXJtUGxhdGZvcm1MaWIvQXJtUGxhdGZvcm1MaWIuYwpuZXcgZmlsZSBtb2RlIDEw
MDY0NAppbmRleCAwMDAwMDAwMDAwMDAuLjhjMWViOTNmMDBmZAotLS0gL2Rldi9udWxsCisrKyBi
L1NpbGljb24vQW1wZXJlL0FtcGVyZUFsdHJhUGtnL0xpYnJhcnkvQXJtUGxhdGZvcm1MaWIvQXJt
UGxhdGZvcm1MaWIuYwpAQCAtMCwwICsxLDE2OSBAQAorLyoqIEBmaWxlCisKKyAgQ29weXJpZ2h0
IChjKSAyMDIwIC0gMjAyMSwgQW1wZXJlIENvbXB1dGluZyBMTEMuIEFsbCByaWdodHMgcmVzZXJ2
ZWQuJmx0O0JSJmd0OworCisgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBCU0QtMi1DbGF1c2Ut
UGF0ZW50CisKKyoqLworCisjaW5jbHVkZSAmbHQ7VWVmaS5oJmd0OworCisjaW5jbHVkZSAmbHQ7
R3VpZC9QbGF0Zm9ybUluZm9Ib2JHdWlkLmgmZ3Q7CisjaW5jbHVkZSAmbHQ7TGlicmFyeS9BbXBl
cmVDcHVMaWIuaCZndDsKKyNpbmNsdWRlICZsdDtMaWJyYXJ5L0FybUxpYi5oJmd0OworI2luY2x1
ZGUgJmx0O0xpYnJhcnkvQXJtUGxhdGZvcm1MaWIuaCZndDsKKyNpbmNsdWRlICZsdDtMaWJyYXJ5
L0Jhc2VNZW1vcnlMaWIuaCZndDsKKyNpbmNsdWRlICZsdDtMaWJyYXJ5L0RlYnVnTGliLmgmZ3Q7
CisjaW5jbHVkZSAmbHQ7TGlicmFyeS9Ib2JMaWIuaCZndDsKKyNpbmNsdWRlICZsdDtMaWJyYXJ5
L0lvTGliLmgmZ3Q7CisjaW5jbHVkZSAmbHQ7TGlicmFyeS9NZW1vcnlBbGxvY2F0aW9uTGliLmgm
Z3Q7CisjaW5jbHVkZSAmbHQ7TGlicmFyeS9QY2RMaWIuaCZndDsKKyNpbmNsdWRlICZsdDtMaWJy
YXJ5L1BMMDExVWFydExpYi5oJmd0OworI2luY2x1ZGUgJmx0O0xpYnJhcnkvU2VyaWFsUG9ydExp
Yi5oJmd0OworI2luY2x1ZGUgJmx0O1BsYXRmb3JtL0FjMDEuaCZndDsKKyNpbmNsdWRlICZsdDtQ
bGF0Zm9ybUluZm9Ib2IuaCZndDsKKyNpbmNsdWRlICZsdDtQcGkvQXJtTXBDb3JlSW5mby5oJmd0
OworI2luY2x1ZGUgJmx0O1BwaS9UZW1wb3JhcnlSYW1TdXBwb3J0LmgmZ3Q7CisKK0FSTV9DT1JF
X0lORk8gbUFybVBsYXRmb3JtTXBDb3JlSW5mb1RhYmxlW1BMQVRGT1JNX0NQVV9NQVhfTlVNX0NP
UkVTXTsKKworLyoqCisgIFJldHVybiB0aGUgY3VycmVudCBCb290IE1vZGUKKworICBUaGlzIGZ1
bmN0aW9uIHJldHVybnMgdGhlIGJvb3QgcmVhc29uIG9uIHRoZSBwbGF0Zm9ybQorCisgIEByZXR1
cm4gICBSZXR1cm4gdGhlIGN1cnJlbnQgQm9vdCBNb2RlIG9mIHRoZSBwbGF0Zm9ybQorCisqKi8K
K0VGSV9CT09UX01PREUKK0FybVBsYXRmb3JtR2V0Qm9vdE1vZGUgKAorICBWT0lECisgICkKK3sK
KyAgcmV0dXJuIEJPT1RfV0lUSF9GVUxMX0NPTkZJR1VSQVRJT047Cit9CisKKy8qKgorICBJbml0
aWFsaXplIGNvbnRyb2xsZXJzIHRoYXQgbXVzdCBzZXR1cCBpbiB0aGUgbm9ybWFsIHdvcmxkCisK
KyAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgdGhlIEFybVBsYXRmb3JtUGtnL1ByZVBpIG9y
IEFybVBsYXRmb3JtUGtnL1BsYXRmb3JtUGVpCisgIGluIHRoZSBQRUkgcGhhc2UuCisKKyoqLwor
RUZJX1NUQVRVUworQXJtUGxhdGZvcm1Jbml0aWFsaXplICgKKyAgSU4gVUlOVE4gTXBJZAorICAp
Cit7CisgIFJFVFVSTl9TVEFUVVMgICAgICBTdGF0dXM7CisgIFVJTlQ2NCAgICAgICAgICAgICBC
YXVkUmF0ZTsKKyAgVUlOVDMyICAgICAgICAgICAgIFJlY2VpdmVGaWZvRGVwdGg7CisgIEVGSV9Q
QVJJVFlfVFlQRSAgICBQYXJpdHk7CisgIFVJTlQ4ICAgICAgICAgICAgICBEYXRhQml0czsKKyAg
RUZJX1NUT1BfQklUU19UWVBFIFN0b3BCaXRzOworCisgIFN0YXR1cyA9IEVGSV9TVUNDRVNTOwor
CisgIGlmIChGaXhlZFBjZEdldDY0IChQY2RTZXJpYWxSZWdpc3RlckJhc2UpICE9IDApIHsKKyAg
ICAvKiBEZWJ1ZyBwb3J0IHNob3VsZCB1c2UgdGhlIHNhbWUgcGFyYW1ldGVycyB3aXRoIGNvbnNv
bGUgKi8KKyAgICBCYXVkUmF0ZSA9IEZpeGVkUGNkR2V0NjQgKFBjZFVhcnREZWZhdWx0QmF1ZFJh
dGUpOworICAgIFJlY2VpdmVGaWZvRGVwdGggPSBGaXhlZFBjZEdldDMyIChQY2RVYXJ0RGVmYXVs
dFJlY2VpdmVGaWZvRGVwdGgpOworICAgIFBhcml0eSA9IChFRklfUEFSSVRZX1RZUEUpRml4ZWRQ
Y2RHZXQ4IChQY2RVYXJ0RGVmYXVsdFBhcml0eSk7CisgICAgRGF0YUJpdHMgPSBGaXhlZFBjZEdl
dDggKFBjZFVhcnREZWZhdWx0RGF0YUJpdHMpOworICAgIFN0b3BCaXRzID0gKEVGSV9TVE9QX0JJ
VFNfVFlQRSlGaXhlZFBjZEdldDggKFBjZFVhcnREZWZhdWx0U3RvcEJpdHMpOworCisgICAgLyog
SW5pdGlhbGl6ZSB1YXJ0IGRlYnVnIHBvcnQgKi8KKyAgICBTdGF0dXMgPSBQTDAxMVVhcnRJbml0
aWFsaXplUG9ydCAoCisgICAgICAgICAgICAgICAoVUlOVE4pRml4ZWRQY2RHZXQ2NCAoUGNkU2Vy
aWFsUmVnaXN0ZXJCYXNlKSwKKyAgICAgICAgICAgICAgIEZpeGVkUGNkR2V0MzIgKFBMMDExVWFy
dENsa0luSHopLAorICAgICAgICAgICAgICAgJmFtcDtCYXVkUmF0ZSwKKyAgICAgICAgICAgICAg
ICZhbXA7UmVjZWl2ZUZpZm9EZXB0aCwKKyAgICAgICAgICAgICAgICZhbXA7UGFyaXR5LAorICAg
ICAgICAgICAgICAgJmFtcDtEYXRhQml0cywKKyAgICAgICAgICAgICAgICZhbXA7U3RvcEJpdHMK
KyAgICAgICAgICAgICAgICk7CisgIH0KKworICByZXR1cm4gU3RhdHVzOworfQorCitFRklfU1RB
VFVTCitQcmVQZWlDb3JlR2V0TXBDb3JlSW5mbyAoCisgIE9VVCBVSU5UTiAgICAgICAgICpDb3Jl
Q291bnQsCisgIE9VVCBBUk1fQ09SRV9JTkZPICoqQXJtQ29yZVRhYmxlCisgICkKK3sKKyAgVUlO
VE4gICAgICAgICAgICAgIG1Bcm1QbGF0Zm9ybUNvcmVDb3VudDsKKyAgVUlOVE4gICAgICAgICAg
ICAgIENsdXN0ZXJJZDsKKyAgVUlOVE4gICAgICAgICAgICAgIFNvY2tldElkOworICBVSU5UTiAg
ICAgICAgICAgICAgSW5kZXg7CisKKyAgQVNTRVJUIChDb3JlQ291bnQgIT0gTlVMTCk7CisgIEFT
U0VSVCAoQXJtQ29yZVRhYmxlICE9IE5VTEwpOworICBBU1NFUlQgKCpBcm1Db3JlVGFibGUgIT0g
TlVMTCk7CisKKyAgbUFybVBsYXRmb3JtQ29yZUNvdW50ID0gMDsKKyAgZm9yICAoSW5kZXggPSAw
OyBJbmRleCAmbHQ7IFBMQVRGT1JNX0NQVV9NQVhfTlVNX0NPUkVTOyBJbmRleCsrKSB7CisgICAg
aWYgKCFJc0NwdUVuYWJsZWQgKEluZGV4KSkgeworICAgICAgY29udGludWU7CisgICAgfQorICAg
IFNvY2tldElkID0gU09DS0VUX0lEIChJbmRleCk7CisgICAgQ2x1c3RlcklkID0gQ0xVU1RFUl9J
RCAoSW5kZXgpOworICAgIG1Bcm1QbGF0Zm9ybU1wQ29yZUluZm9UYWJsZVttQXJtUGxhdGZvcm1D
b3JlQ291bnRdLkNsdXN0ZXJJZCA9IFNvY2tldElkOworICAgIG1Bcm1QbGF0Zm9ybU1wQ29yZUlu
Zm9UYWJsZVttQXJtUGxhdGZvcm1Db3JlQ291bnRdLkNvcmVJZCA9CisgICAgICAoQ2x1c3Rlcklk
ICZsdDsmbHQ7IDgpIHwgKEluZGV4ICUgUExBVEZPUk1fQ1BVX05VTV9DT1JFU19QRVJfQ1BNKTsK
KyAgICBtQXJtUGxhdGZvcm1NcENvcmVJbmZvVGFibGVbbUFybVBsYXRmb3JtQ29yZUNvdW50XS5N
YWlsYm94Q2xlYXJBZGRyZXNzID0gMDsKKyAgICBtQXJtUGxhdGZvcm1NcENvcmVJbmZvVGFibGVb
bUFybVBsYXRmb3JtQ29yZUNvdW50XS5NYWlsYm94Q2xlYXJWYWx1ZSA9IDA7CisgICAgbUFybVBs
YXRmb3JtTXBDb3JlSW5mb1RhYmxlW21Bcm1QbGF0Zm9ybUNvcmVDb3VudF0uTWFpbGJveEdldEFk
ZHJlc3MgPSAwOworICAgIG1Bcm1QbGF0Zm9ybU1wQ29yZUluZm9UYWJsZVttQXJtUGxhdGZvcm1D
b3JlQ291bnRdLk1haWxib3hTZXRBZGRyZXNzID0gMDsKKyAgICBtQXJtUGxhdGZvcm1Db3JlQ291
bnQrKzsKKyAgfQorCisgICpDb3JlQ291bnQgPSBtQXJtUGxhdGZvcm1Db3JlQ291bnQ7CisKKyAg
KkFybUNvcmVUYWJsZSA9IG1Bcm1QbGF0Zm9ybU1wQ29yZUluZm9UYWJsZTsKKyAgQVNTRVJUICgq
QXJtQ29yZVRhYmxlICE9IE5VTEwpOworCisgIHJldHVybiBFRklfU1VDQ0VTUzsKK30KKworLy8g
TmVlZHMgdG8gYmUgZGVjbGFyZWQgaW4gdGhlIGZpbGUuIE90aGVyd2lzZSBnQXJtTXBDb3JlSW5m
b1BwaUd1aWQgaXMgdW5kZWZpbmVkIGluIHRoZSBjb250ZWN0IG9mIFByZVBlaUNvcmUKK0VGSV9H
VUlEICAgICAgICAgICAgIG1Bcm1NcENvcmVJbmZvUHBpR3VpZCA9IEFSTV9NUF9DT1JFX0lORk9f
UFBJX0dVSUQ7CitBUk1fTVBfQ09SRV9JTkZPX1BQSSBtTXBDb3JlSW5mb1BwaSA9IHsgUHJlUGVp
Q29yZUdldE1wQ29yZUluZm8gfTsKKworRUZJX1BFSV9QUElfREVTQ1JJUFRPUiBnUGxhdGZvcm1Q
cGlUYWJsZVtdID0geworICB7CisgICAgRUZJX1BFSV9QUElfREVTQ1JJUFRPUl9QUEksCisgICAg
JmFtcDttQXJtTXBDb3JlSW5mb1BwaUd1aWQsCisgICAgJmFtcDttTXBDb3JlSW5mb1BwaQorICB9
LAorfTsKKworLyoqCisgIFJldHVybiB0aGUgUGxhdGZvcm0gc3BlY2lmaWMgUFBJcworCisgIFRo
aXMgZnVuY3Rpb24gZXhwb3NlcyB0aGUgUGxhdGZvcm0gU3BlY2lmaWMgUFBJcy4gVGhleSBjYW4g
YmUgdXNlZCBieSBhbnkgUHJlUGkgbW9kdWxlcyBvciBwYXNzZWQKKyAgdG8gdGhlIFBlaUNvcmUg
YnkgUHJlUGVpQ29yZS4KKworICBAcGFyYW1bb3V0XSAgIFBwaUxpc3RTaXplICAgICAgICAgU2l6
ZSBpbiBCeXRlcyBvZiB0aGUgUGxhdGZvcm0gUFBJIExpc3QKKyAgQHBhcmFtW291dF0gICBQcGlM
aXN0ICAgICAgICAgICAgIFBsYXRmb3JtIFBQSSBMaXN0CisKKyoqLworVk9JRAorQXJtUGxhdGZv
cm1HZXRQbGF0Zm9ybVBwaUxpc3QgKAorICBPVVQgVUlOVE4gICAgICAgICAgICAgICAgICAqUHBp
TGlzdFNpemUsCisgIE9VVCBFRklfUEVJX1BQSV9ERVNDUklQVE9SICoqUHBpTGlzdAorICApCit7
CisgIEFTU0VSVCAoUHBpTGlzdFNpemUgIT0gTlVMTCk7CisgIEFTU0VSVCAoUHBpTGlzdCAhPSBO
VUxMKTsKKyAgQVNTRVJUICgqUHBpTGlzdCAhPSBOVUxMKTsKKworICBpZiAoQXJtSXNNcENvcmUg
KCkpIHsKKyAgICAqUHBpTGlzdFNpemUgPSBzaXplb2YgKGdQbGF0Zm9ybVBwaVRhYmxlKTsKKyAg
ICAqUHBpTGlzdCA9IGdQbGF0Zm9ybVBwaVRhYmxlOworICB9IGVsc2UgeworICAgICpQcGlMaXN0
U2l6ZSA9IDA7CisgICAgKlBwaUxpc3QgPSBOVUxMOworICB9Cit9CmRpZmYgLS1naXQgYS9TaWxp
Y29uL0FtcGVyZS9BbXBlcmVBbHRyYVBrZy9MaWJyYXJ5L0FybVBsYXRmb3JtTGliL0FybVBsYXRm
b3JtTGliTWVtb3J5LmMgYi9TaWxpY29uL0FtcGVyZS9BbXBlcmVBbHRyYVBrZy9MaWJyYXJ5L0Fy
bVBsYXRmb3JtTGliL0FybVBsYXRmb3JtTGliTWVtb3J5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQK
aW5kZXggMDAwMDAwMDAwMDAwLi4xMTdjOWNjNTZhYzIKLS0tIC9kZXYvbnVsbAorKysgYi9TaWxp
Y29uL0FtcGVyZS9BbXBlcmVBbHRyYVBrZy9MaWJyYXJ5L0FybVBsYXRmb3JtTGliL0FybVBsYXRm
b3JtTGliTWVtb3J5LmMKQEAgLTAsMCArMSwzOTkgQEAKKy8qKiBAZmlsZQorCisgIENvcHlyaWdo
dCAoYykgMjAyMCAtIDIwMjEsIEFtcGVyZSBDb21wdXRpbmcgTExDLiBBbGwgcmlnaHRzIHJlc2Vy
dmVkLiZsdDtCUiZndDsKKworICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTItQ2xhdXNl
LVBhdGVudAorCisqKi8KKworI2luY2x1ZGUgJmx0O1VlZmkuaCZndDsKKworI2luY2x1ZGUgJmx0
O0d1aWQvUGxhdGZvcm1JbmZvSG9iR3VpZC5oJmd0OworI2luY2x1ZGUgJmx0O0xpYnJhcnkvQW1w
ZXJlQ3B1TGliLmgmZ3Q7CisjaW5jbHVkZSAmbHQ7TGlicmFyeS9Bcm1QbGF0Zm9ybUxpYi5oJmd0
OworI2luY2x1ZGUgJmx0O0xpYnJhcnkvRGVidWdMaWIuaCZndDsKKyNpbmNsdWRlICZsdDtMaWJy
YXJ5L0hvYkxpYi5oJmd0OworI2luY2x1ZGUgJmx0O0xpYnJhcnkvTWVtb3J5QWxsb2NhdGlvbkxp
Yi5oJmd0OworI2luY2x1ZGUgJmx0O0xpYnJhcnkvUGNkTGliLmgmZ3Q7CisjaW5jbHVkZSAmbHQ7
UGxhdGZvcm1JbmZvSG9iLmgmZ3Q7CisKKy8qIE51bWJlciBvZiBWaXJ0dWFsIE1lbW9yeSBNYXAg
RGVzY3JpcHRvcnMgKi8KKyNkZWZpbmUgTUFYX1ZJUlRVQUxfTUVNT1JZX01BUF9ERVNDUklQVE9S
UyAgICAgICAgICA1MAorCisvKiBERFIgYXR0cmlidXRlcyAqLworI2RlZmluZSBERFJfQVRUUklC
VVRFU19DQUNIRUQgICAgICAgICAgIEFSTV9NRU1PUllfUkVHSU9OX0FUVFJJQlVURV9XUklURV9C
QUNLCisjZGVmaW5lIEREUl9BVFRSSUJVVEVTX1VOQ0FDSEVEICAgICAgICAgQVJNX01FTU9SWV9S
RUdJT05fQVRUUklCVVRFX1VOQ0FDSEVEX1VOQlVGRkVSRUQKKworLyoqCisgIFJldHVybiB0aGUg
VmlydHVhbCBNZW1vcnkgTWFwIG9mIHlvdXIgcGxhdGZvcm0KKworICBUaGlzIFZpcnR1YWwgTWVt
b3J5IE1hcCBpcyB1c2VkIGJ5IE1lbW9yeUluaXRQZWkgTW9kdWxlIHRvIGluaXRpYWxpemUgdGhl
IE1NVSBvbiB5b3VyIHBsYXRmb3JtLgorCisgIEBwYXJhbVtvdXRdICAgVmlydHVhbE1lbW9yeU1h
cCAgICBBcnJheSBvZiBBUk1fTUVNT1JZX1JFR0lPTl9ERVNDUklQVE9SIGRlc2NyaWJpbmcgYSBQ
aHlzaWNhbC10by0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZpcnR1YWwg
TWVtb3J5IG1hcHBpbmcuIFRoaXMgYXJyYXkgbXVzdCBiZSBlbmRlZCBieSBhIHplcm8tZmlsbGVk
CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnRyeQorCisqKi8KK1ZPSUQK
K0FybVBsYXRmb3JtR2V0VmlydHVhbE1lbW9yeU1hcCAoCisgIE9VVCBBUk1fTUVNT1JZX1JFR0lP
Tl9ERVNDUklQVE9SICoqVmlydHVhbE1lbW9yeU1hcAorICApCit7CisgIFVJTlROICAgICAgICAg
ICAgICAgICAgICAgICAgSW5kZXggPSAwOworICBBUk1fTUVNT1JZX1JFR0lPTl9ERVNDUklQVE9S
ICpWaXJ0dWFsTWVtb3J5VGFibGU7CisgIFVJTlQzMiAgICAgICAgICAgICAgICAgICAgICAgTnVt
UmVnaW9uOworICBVSU5UTiAgICAgICAgICAgICAgICAgICAgICAgIENvdW50OworICBWT0lEICAg
ICAgICAgICAgICAgICAgICAgICAgICpIb2I7CisgIFBMQVRGT1JNX0lORk9fSE9CICAgICAgICAg
ICAgKlBsYXRmb3JtSG9iOworCisgIEhvYiA9IEdldEZpcnN0R3VpZEhvYiAoJmFtcDtnUGxhdGZv
cm1Ib2JHdWlkKTsKKyAgQVNTRVJUIChIb2IgIT0gTlVMTCk7CisgIGlmIChIb2IgPT0gTlVMTCkg
eworICAgIHJldHVybjsKKyAgfQorCisgIFBsYXRmb3JtSG9iID0gKFBMQVRGT1JNX0lORk9fSE9C
ICopR0VUX0dVSURfSE9CX0RBVEEgKEhvYik7CisKKyAgQVNTRVJUIChWaXJ0dWFsTWVtb3J5TWFw
ICE9IE5VTEwpOworCisgIFZpcnR1YWxNZW1vcnlUYWJsZSA9IChBUk1fTUVNT1JZX1JFR0lPTl9E
RVNDUklQVE9SICopQWxsb2NhdGVQYWdlcyAoRUZJX1NJWkVfVE9fUEFHRVMgKHNpemVvZiAoQVJN
X01FTU9SWV9SRUdJT05fREVTQ1JJUFRPUikgKiBNQVhfVklSVFVBTF9NRU1PUllfTUFQX0RFU0NS
SVBUT1JTKSk7CisgIGlmIChWaXJ0dWFsTWVtb3J5VGFibGUgPT0gTlVMTCkgeworICAgIHJldHVy
bjsKKyAgfQorCisgIC8qIEZvciBBZGRyZXNzIHNwYWNlIDB4MTAwMF8wMDAwXzAwMDAgdG8gMHgx
MDAxXzAwRkZfRkZGRgorICAgKiAgLSBEZXZpY2UgbWVtb3J5CisgICAqLworICBWaXJ0dWFsTWVt
b3J5VGFibGVbSW5kZXhdLlBoeXNpY2FsQmFzZSA9IDB4MTAwMDAwMDAwMDAwVUxMOworICBWaXJ0
dWFsTWVtb3J5VGFibGVbSW5kZXhdLlZpcnR1YWxCYXNlICA9IDB4MTAwMDAwMDAwMDAwVUxMOwor
ICBWaXJ0dWFsTWVtb3J5VGFibGVbSW5kZXhdLkxlbmd0aCAgICAgICA9IDB4MTAyMDAwMDAwVUxM
Owo8L3ByZT4KICAgICAgPC9ibG9ja3F1b3RlPgogICAgICA8cHJlIGNsYXNzPSJtb3otcXVvdGUt
cHJlIiB3cmFwPSIiPgpQbGVhc2UgbW92ZSBhbGwgb2YgdGhlc2UgbGl2ZS1jb2RlZCBhZGRyZXNz
ZXMvc2l6ZXMgdG8gYSBwcml2YXRlIC5oCmFuZCB1c2Ugc3ltYm9saWMgbmFtZXMgaGVyZS4KCjwv
cHJlPgogICAgICA8YmxvY2txdW90ZSB0eXBlPSJjaXRlIj4KICAgICAgICA8cHJlIGNsYXNzPSJt
b3otcXVvdGUtcHJlIiB3cmFwPSIiPisgIFZpcnR1YWxNZW1vcnlUYWJsZVtJbmRleF0uQXR0cmli
dXRlcyAgID0gQVJNX01FTU9SWV9SRUdJT05fQVRUUklCVVRFX0RFVklDRTsKKworICAvKiBGb3Ig
QWRkcmVzcyBzcGFjZSAweDUwMDBfMDAwMF8wMDAwIHRvIDB4NTAwMV8wMEZGX0ZGRkYKKyAgICog
IC0gRGV2aWNlIG1lbW9yeQorICAgKi8KKyAgaWYgKElzU2xhdmVTb2NrZXRBY3RpdmUgKCkpCisg
IHsKKyAgICBWaXJ0dWFsTWVtb3J5VGFibGVbKytJbmRleF0uUGh5c2ljYWxCYXNlID0gMHg1MDAw
MDAwMDAwMDBVTEw7CisgICAgVmlydHVhbE1lbW9yeVRhYmxlW0luZGV4XS5WaXJ0dWFsQmFzZSAg
PSAweDUwMDAwMDAwMDAwMFVMTDsKKyAgICBWaXJ0dWFsTWVtb3J5VGFibGVbSW5kZXhdLkxlbmd0
aCAgICAgICA9IDB4MTAxMDAwMDAwVUxMOworICAgIFZpcnR1YWxNZW1vcnlUYWJsZVtJbmRleF0u
QXR0cmlidXRlcyAgID0gQVJNX01FTU9SWV9SRUdJT05fQVRUUklCVVRFX0RFVklDRTsKKyAgfQor
CisgIC8qCisgICAqICAtIFBDSWUgUkNBMCBEZXZpY2UgbWVtb3J5CisgICAqLworICBWaXJ0dWFs
TWVtb3J5VGFibGVbKytJbmRleF0uUGh5c2ljYWxCYXNlID0gMHgzMDAwMDAwMDAwMDBVTEw7Cisg
IFZpcnR1YWxNZW1vcnlUYWJsZVtJbmRleF0uVmlydHVhbEJhc2UgID0gMHgzMDAwMDAwMDAwMDBV
TEw7CisgIFZpcnR1YWxNZW1vcnlUYWJsZVtJbmRleF0uTGVuZ3RoICAgICAgID0gMHg0MDAwMDAw
MDAwMFVMTDsKKyAgVmlydHVhbE1lbW9yeVRhYmxlW0luZGV4XS5BdHRyaWJ1dGVzICAgPSBBUk1f
TUVNT1JZX1JFR0lPTl9BVFRSSUJVVEVfREVWSUNFOworCisgIC8qCisgICAqICAtIDJQL1BDSWUg
U29ja2V0MCBSQ0EwIDMyLWJpdCBEZXZpY2UgbWVtb3J5CisgICAqICAtIDFQL1BDSWUgY29uc29s
aWRhdGVkIHRvIFJDQjIgMzItYml0IERldmljZSBtZW1vcnkKKyAgICovCisgIFZpcnR1YWxNZW1v
cnlUYWJsZVsrK0luZGV4XS5QaHlzaWNhbEJhc2UgPSAweDIwMDAwMDAwVUxMOworICBWaXJ0dWFs
TWVtb3J5VGFibGVbSW5kZXhdLlZpcnR1YWxCYXNlICA9IDB4MjAwMDAwMDBVTEw7CisgIFZpcnR1
YWxNZW1vcnlUYWJsZVtJbmRleF0uTGVuZ3RoICAgICAgID0gMHg4MDAwMDAwVUxMOworICBWaXJ0
dWFsTWVtb3J5VGFibGVbSW5kZXhdLkF0dHJpYnV0ZXMgICA9IEFSTV9NRU1PUllfUkVHSU9OX0FU
VFJJQlVURV9ERVZJQ0U7CisKKyAgLyoKKyAgICogIC0gUENJZSBSQ0ExIERldmljZSBtZW1vcnkK
KyAgICovCisgIFZpcnR1YWxNZW1vcnlUYWJsZVsrK0luZGV4XS5QaHlzaWNhbEJhc2UgPSAweDM0
MDAwMDAwMDAwMFVMTDsKKyAgVmlydHVhbE1lbW9yeVRhYmxlW0luZGV4XS5WaXJ0dWFsQmFzZSAg
PSAweDM0MDAwMDAwMDAwMFVMTDsKKyAgVmlydHVhbE1lbW9yeVRhYmxlW0luZGV4XS5MZW5ndGgg
ICAgICAgPSAweDQwMDAwMDAwMDAwVUxMOworICBWaXJ0dWFsTWVtb3J5VGFibGVbSW5kZXhdLkF0
dHJpYnV0ZXMgICA9IEFSTV9NRU1PUllfUkVHSU9OX0FUVFJJQlVURV9ERVZJQ0U7CisKKyAgLyoK
KyAgICogIC0gMlAvUENJZSBTb2NrZXQwIFJDQTEgMzItYml0IERldmljZSBtZW1vcnkKKyAgICog
IC0gMVAvUENJZSBjb25zb2xpZGF0ZWQgdG8gUkNCMiAzMi1iaXQgRGV2aWNlIG1lbW9yeQorICAg
Ki8KKyAgVmlydHVhbE1lbW9yeVRhYmxlWysrSW5kZXhdLlBoeXNpY2FsQmFzZSA9IDB4MjgwMDAw
MDBVTEw7CisgIFZpcnR1YWxNZW1vcnlUYWJsZVtJbmRleF0uVmlydHVhbEJhc2UgID0gMHgyODAw
MDAwMFVMTDsKKyAgVmlydHVhbE1lbW9yeVRhYmxlW0luZGV4XS5MZW5ndGggICAgICAgPSAweDgw
MDAwMDBVTEw7CisgIFZpcnR1YWxNZW1vcnlUYWJsZVtJbmRleF0uQXR0cmlidXRlcyAgID0gQVJN
X01FTU9SWV9SRUdJT05fQVRUUklCVVRFX0RFVklDRTsKKworICAvKgorICAgKiAgLSBQQ0llIFJD
QTIgRGV2aWNlIG1lbW9yeQorICAgKi8KKyAgVmlydHVhbE1lbW9yeVRhYmxlWysrSW5kZXhdLlBo
eXNpY2FsQmFzZSA9IDB4MzgwMDAwMDAwMDAwVUxMOworICBWaXJ0dWFsTWVtb3J5VGFibGVbSW5k
ZXhdLlZpcnR1YWxCYXNlICA9IDB4MzgwMDAwMDAwMDAwVUxMOworICBWaXJ0dWFsTWVtb3J5VGFi
bGVbSW5kZXhdLkxlbmd0aCAgICAgICA9IDB4NDAwMDAwMDAwMDBVTEw7CisgIFZpcnR1YWxNZW1v
cnlUYWJsZVtJbmRleF0uQXR0cmlidXRlcyAgID0gQVJNX01FTU9SWV9SRUdJT05fQVRUUklCVVRF
X0RFVklDRTsKKworICAvKgorICAgKiAgLSAyUC9QQ0llIFNvY2tldDAgUkNBMiAzMi1iaXQgRGV2
aWNlIG1lbW9yeQorICAgKiAgLSAxUC9QQ0llIGNvbnNvbGlkYXRlZCB0byBSQ0IzIDMyLWJpdCBE
ZXZpY2UgbWVtb3J5CisgICAqLworICBWaXJ0dWFsTWVtb3J5VGFibGVbKytJbmRleF0uUGh5c2lj
YWxCYXNlID0gMHgzMDAwMDAwMFVMTDsKKyAgVmlydHVhbE1lbW9yeVRhYmxlW0luZGV4XS5WaXJ0
dWFsQmFzZSAgPSAweDMwMDAwMDAwVUxMOworICBWaXJ0dWFsTWVtb3J5VGFibGVbSW5kZXhdLkxl
bmd0aCAgICAgICA9IDB4ODAwMDAwMFVMTDsKKyAgVmlydHVhbE1lbW9yeVRhYmxlW0luZGV4XS5B
dHRyaWJ1dGVzICAgPSBBUk1fTUVNT1JZX1JFR0lPTl9BVFRSSUJVVEVfREVWSUNFOworCisgIC8q
CisgICAqICAtIFBDSWUgUkNBMyBEZXZpY2UgbWVtb3J5CisgICAqLworICBWaXJ0dWFsTWVtb3J5
VGFibGVbKytJbmRleF0uUGh5c2ljYWxCYXNlID0gMHgzQzAwMDAwMDAwMDBVTEw7CisgIFZpcnR1
YWxNZW1vcnlUYWJsZVtJbmRleF0uVmlydHVhbEJhc2UgID0gMHgzQzAwMDAwMDAwMDBVTEw7Cisg
IFZpcnR1YWxNZW1vcnlUYWJsZVtJbmRleF0uTGVuZ3RoICAgICAgID0gMHg0MDAwMDAwMDAwMFVM
TDsKKyAgVmlydHVhbE1lbW9yeVRhYmxlW0luZGV4XS5BdHRyaWJ1dGVzICAgPSBBUk1fTUVNT1JZ
X1JFR0lPTl9BVFRSSUJVVEVfREVWSUNFOworCisgIC8qCisgICAqICAtIDJQL1BDSWUgU29ja2V0
MCBSQ0EzIDMyLWJpdCBEZXZpY2UgbWVtb3J5CisgICAqICAtIDFQL1BDSWUgY29uc29saWRhdGVk
IHRvIFJDQjMgMzItYml0IERldmljZSBtZW1vcnkKKyAgICovCisgIFZpcnR1YWxNZW1vcnlUYWJs
ZVsrK0luZGV4XS5QaHlzaWNhbEJhc2UgPSAweDM4MDAwMDAwVUxMOworICBWaXJ0dWFsTWVtb3J5
VGFibGVbSW5kZXhdLlZpcnR1YWxCYXNlICA9IDB4MzgwMDAwMDBVTEw7CisgIFZpcnR1YWxNZW1v
cnlUYWJsZVtJbmRleF0uTGVuZ3RoICAgICAgID0gMHg4MDAwMDAwVUxMOworICBWaXJ0dWFsTWVt
b3J5VGFibGVbSW5kZXhdLkF0dHJpYnV0ZXMgICA9IEFSTV9NRU1PUllfUkVHSU9OX0FUVFJJQlVU
RV9ERVZJQ0U7CisKKyAgLyoKKyAgICogIC0gUENJZSBSQ0IwIERldmljZSBtZW1vcnkKKyAgICov
CisgIFZpcnR1YWxNZW1vcnlUYWJsZVsrK0luZGV4XS5QaHlzaWNhbEJhc2UgPSAweDIwMDAwMDAw
MDAwMFVMTDsKKyAgVmlydHVhbE1lbW9yeVRhYmxlW0luZGV4XS5WaXJ0dWFsQmFzZSAgPSAweDIw
MDAwMDAwMDAwMFVMTDsKKyAgVmlydHVhbE1lbW9yeVRhYmxlW0luZGV4XS5MZW5ndGggICAgICAg
PSAweDQwMDAwMDAwMDAwVUxMOworICBWaXJ0dWFsTWVtb3J5VGFibGVbSW5kZXhdLkF0dHJpYnV0
ZXMgICA9IEFSTV9NRU1PUllfUkVHSU9OX0FUVFJJQlVURV9ERVZJQ0U7CisKKyAgLyoKKyAgICog
IC0gMlAvUENJZSBTb2NrZXQwIFJDQjAgMzItYml0IERldmljZSBtZW1vcnkKKyAgICogIC0gMVAv
UENJZSBjb25zb2xpZGF0ZWQgdG8gUkNCMCAzMi1iaXQgRGV2aWNlIG1lbW9yeQorICAgKi8KKyAg
VmlydHVhbE1lbW9yeVRhYmxlWysrSW5kZXhdLlBoeXNpY2FsQmFzZSA9IDB4MDAwMDAwMDBVTEw7
CisgIFZpcnR1YWxNZW1vcnlUYWJsZVtJbmRleF0uVmlydHVhbEJhc2UgID0gMHgwMDAwMDAwMFVM
TDsKKyAgVmlydHVhbE1lbW9yeVRhYmxlW0luZGV4XS5MZW5ndGggICAgICAgPSAweDgwMDAwMDBV
TEw7CisgIFZpcnR1YWxNZW1vcnlUYWJsZVtJbmRleF0uQXR0cmlidXRlcyAgID0gQVJNX01FTU9S
WV9SRUdJT05fQVRUUklCVVRFX0RFVklDRTsKKworICAvKgorICAgKiAgLSBQQ0llIFJDQjEgRGV2
aWNlIG1lbW9yeQorICAgKi8KKyAgVmlydHVhbE1lbW9yeVRhYmxlWysrSW5kZXhdLlBoeXNpY2Fs
QmFzZSA9IDB4MjQwMDAwMDAwMDAwVUxMOworICBWaXJ0dWFsTWVtb3J5VGFibGVbSW5kZXhdLlZp
cnR1YWxCYXNlICA9IDB4MjQwMDAwMDAwMDAwVUxMOworICBWaXJ0dWFsTWVtb3J5VGFibGVbSW5k
ZXhdLkxlbmd0aCAgICAgICA9IDB4NDAwMDAwMDAwMDBVTEw7CisgIFZpcnR1YWxNZW1vcnlUYWJs
ZVtJbmRleF0uQXR0cmlidXRlcyAgID0gQVJNX01FTU9SWV9SRUdJT05fQVRUUklCVVRFX0RFVklD
RTsKKworICAvKgorICAgKiAgLSAyUC9QQ0llIFNvY2tldDAgUkNCMSAzMi1iaXQgRGV2aWNlIG1l
bW9yeQorICAgKiAgLSAxUC9QQ0llIGNvbnNvbGlkYXRlZCB0byBSQ0IwIDMyLWJpdCBEZXZpY2Ug
bWVtb3J5CisgICAqLworICBWaXJ0dWFsTWVtb3J5VGFibGVbKytJbmRleF0uUGh5c2ljYWxCYXNl
ID0gMHgwODAwMDAwMFVMTDsKKyAgVmlydHVhbE1lbW9yeVRhYmxlW0luZGV4XS5WaXJ0dWFsQmFz
ZSAgPSAweDA4MDAwMDAwVUxMOworICBWaXJ0dWFsTWVtb3J5VGFibGVbSW5kZXhdLkxlbmd0aCAg
ICAgICA9IDB4ODAwMDAwMFVMTDsKKyAgVmlydHVhbE1lbW9yeVRhYmxlW0luZGV4XS5BdHRyaWJ1
dGVzICAgPSBBUk1fTUVNT1JZX1JFR0lPTl9BVFRSSUJVVEVfREVWSUNFOworCisgIC8qCisgICAq
ICAtIFBDSWUgUkNCMiBEZXZpY2UgbWVtb3J5CisgICAqLworICBWaXJ0dWFsTWVtb3J5VGFibGVb
KytJbmRleF0uUGh5c2ljYWxCYXNlID0gMHgyODAwMDAwMDAwMDBVTEw7CisgIFZpcnR1YWxNZW1v
cnlUYWJsZVtJbmRleF0uVmlydHVhbEJhc2UgID0gMHgyODAwMDAwMDAwMDBVTEw7CisgIFZpcnR1
YWxNZW1vcnlUYWJsZVtJbmRleF0uTGVuZ3RoICAgICAgID0gMHg0MDAwMDAwMDAwMFVMTDsKKyAg
VmlydHVhbE1lbW9yeVRhYmxlW0luZGV4XS5BdHRyaWJ1dGVzICAgPSBBUk1fTUVNT1JZX1JFR0lP
Tl9BVFRSSUJVVEVfREVWSUNFOworCisgIC8qCisgICAqICAtIDJQL1BDSWUgU29ja2V0MCBSQ0Iy
IDMyLWJpdCBEZXZpY2UgbWVtb3J5CisgICAqICAtIDFQL1BDSWUgY29uc29saWRhdGVkIHRvIFJD
QjEgMzItYml0IERldmljZSBtZW1vcnkKKyAgICovCisgIFZpcnR1YWxNZW1vcnlUYWJsZVsrK0lu
ZGV4XS5QaHlzaWNhbEJhc2UgPSAweDEwMDAwMDAwVUxMOworICBWaXJ0dWFsTWVtb3J5VGFibGVb
SW5kZXhdLlZpcnR1YWxCYXNlICA9IDB4MTAwMDAwMDBVTEw7CisgIFZpcnR1YWxNZW1vcnlUYWJs
ZVtJbmRleF0uTGVuZ3RoICAgICAgID0gMHg4MDAwMDAwVUxMOworICBWaXJ0dWFsTWVtb3J5VGFi
bGVbSW5kZXhdLkF0dHJpYnV0ZXMgICA9IEFSTV9NRU1PUllfUkVHSU9OX0FUVFJJQlVURV9ERVZJ
Q0U7CisKKyAgLyoKKyAgICogIC0gUENJZSBSQ0IzIERldmljZSBtZW1vcnkKKyAgICovCisgIFZp
cnR1YWxNZW1vcnlUYWJsZVsrK0luZGV4XS5QaHlzaWNhbEJhc2UgPSAweDJDMDAwMDAwMDAwMFVM
TDsKKyAgVmlydHVhbE1lbW9yeVRhYmxlW0luZGV4XS5WaXJ0dWFsQmFzZSAgPSAweDJDMDAwMDAw
MDAwMFVMTDsKKyAgVmlydHVhbE1lbW9yeVRhYmxlW0luZGV4XS5MZW5ndGggICAgICAgPSAweDQw
MDAwMDAwMDAwVUxMOworICBWaXJ0dWFsTWVtb3J5VGFibGVbSW5kZXhdLkF0dHJpYnV0ZXMgICA9
IEFSTV9NRU1PUllfUkVHSU9OX0FUVFJJQlVURV9ERVZJQ0U7CisKKyAgLyoKKyAgICogIC0gMlAv
UENJZSBTb2NrZXQwIFJDQjMgMzItYml0IERldmljZSBtZW1vcnkKKyAgICogIC0gMVAvUENJZSBj
b25zb2xpZGF0ZWQgdG8gUkNCMSAzMi1iaXQgRGV2aWNlIG1lbW9yeQorICAgKi8KKyAgVmlydHVh
bE1lbW9yeVRhYmxlWysrSW5kZXhdLlBoeXNpY2FsQmFzZSA9IDB4MTgwMDAwMDBVTEw7CisgIFZp
cnR1YWxNZW1vcnlUYWJsZVtJbmRleF0uVmlydHVhbEJhc2UgID0gMHgxODAwMDAwMFVMTDsKKyAg
VmlydHVhbE1lbW9yeVRhYmxlW0luZGV4XS5MZW5ndGggICAgICAgPSAweDgwMDAwMDBVTEw7Cisg
IFZpcnR1YWxNZW1vcnlUYWJsZVtJbmRleF0uQXR0cmlidXRlcyAgID0gQVJNX01FTU9SWV9SRUdJ
T05fQVRUUklCVVRFX0RFVklDRTsKKworICBpZiAoSXNTbGF2ZVNvY2tldEFjdGl2ZSAoKSkgewor
ICAgIC8vIFNsYXZlIHNvY2tldCBleGlzdAorICAgIC8qCisgICAgICogIC0gUENJZSBSQ0EwIERl
dmljZSBtZW1vcnkKKyAgICAgKi8KKyAgICBWaXJ0dWFsTWVtb3J5VGFibGVbKytJbmRleF0uUGh5
c2ljYWxCYXNlID0gMHg3MDAwMDAwMDAwMDBVTEw7CisgICAgVmlydHVhbE1lbW9yeVRhYmxlW0lu
ZGV4XS5WaXJ0dWFsQmFzZSAgPSAweDcwMDAwMDAwMDAwMFVMTDsKKyAgICBWaXJ0dWFsTWVtb3J5
VGFibGVbSW5kZXhdLkxlbmd0aCAgICAgICA9IDB4NDAwMDAwMDAwMDBVTEw7CisgICAgVmlydHVh
bE1lbW9yeVRhYmxlW0luZGV4XS5BdHRyaWJ1dGVzICAgPSBBUk1fTUVNT1JZX1JFR0lPTl9BVFRS
SUJVVEVfREVWSUNFOworCisgICAgLyoKKyAgICAgKiAgLSBQQ0llIFJDQTEgRGV2aWNlIG1lbW9y
eQorICAgICAqLworICAgIFZpcnR1YWxNZW1vcnlUYWJsZVsrK0luZGV4XS5QaHlzaWNhbEJhc2Ug
PSAweDc0MDAwMDAwMDAwMFVMTDsKKyAgICBWaXJ0dWFsTWVtb3J5VGFibGVbSW5kZXhdLlZpcnR1
YWxCYXNlICA9IDB4NzQwMDAwMDAwMDAwVUxMOworICAgIFZpcnR1YWxNZW1vcnlUYWJsZVtJbmRl
eF0uTGVuZ3RoICAgICAgID0gMHg0MDAwMDAwMDAwMFVMTDsKKyAgICBWaXJ0dWFsTWVtb3J5VGFi
bGVbSW5kZXhdLkF0dHJpYnV0ZXMgICA9IEFSTV9NRU1PUllfUkVHSU9OX0FUVFJJQlVURV9ERVZJ
Q0U7CisKKyAgICAvKgorICAgICAqICAtIFBDSWUgUkNBMiBEZXZpY2UgbWVtb3J5CisgICAgICov
CisgICAgVmlydHVhbE1lbW9yeVRhYmxlWysrSW5kZXhdLlBoeXNpY2FsQmFzZSA9IDB4NzgwMDAw
MDAwMDAwVUxMOworICAgIFZpcnR1YWxNZW1vcnlUYWJsZVtJbmRleF0uVmlydHVhbEJhc2UgID0g
MHg3ODAwMDAwMDAwMDBVTEw7CisgICAgVmlydHVhbE1lbW9yeVRhYmxlW0luZGV4XS5MZW5ndGgg
ICAgICAgPSAweDQwMDAwMDAwMDAwVUxMOworICAgIFZpcnR1YWxNZW1vcnlUYWJsZVtJbmRleF0u
QXR0cmlidXRlcyAgID0gQVJNX01FTU9SWV9SRUdJT05fQVRUUklCVVRFX0RFVklDRTsKKworICAg
IC8qCisgICAgICogIC0gUENJZSBSQ0EzIERldmljZSBtZW1vcnkKKyAgICAgKi8KKyAgICBWaXJ0
dWFsTWVtb3J5VGFibGVbKytJbmRleF0uUGh5c2ljYWxCYXNlID0gMHg3QzAwMDAwMDAwMDBVTEw7
CisgICAgVmlydHVhbE1lbW9yeVRhYmxlW0luZGV4XS5WaXJ0dWFsQmFzZSAgPSAweDdDMDAwMDAw
MDAwMFVMTDsKKyAgICBWaXJ0dWFsTWVtb3J5VGFibGVbSW5kZXhdLkxlbmd0aCAgICAgICA9IDB4
NDAwMDAwMDAwMDBVTEw7CisgICAgVmlydHVhbE1lbW9yeVRhYmxlW0luZGV4XS5BdHRyaWJ1dGVz
ICAgPSBBUk1fTUVNT1JZX1JFR0lPTl9BVFRSSUJVVEVfREVWSUNFOworCisgICAgLyoKKyAgICAg
KiAgLSBQQ0llIFJDQjAgRGV2aWNlIG1lbW9yeQorICAgICAqLworICAgIFZpcnR1YWxNZW1vcnlU
YWJsZVsrK0luZGV4XS5QaHlzaWNhbEJhc2UgPSAweDYwMDAwMDAwMDAwMFVMTDsKKyAgICBWaXJ0
dWFsTWVtb3J5VGFibGVbSW5kZXhdLlZpcnR1YWxCYXNlICA9IDB4NjAwMDAwMDAwMDAwVUxMOwor
ICAgIFZpcnR1YWxNZW1vcnlUYWJsZVtJbmRleF0uTGVuZ3RoICAgICAgID0gMHg0MDAwMDAwMDAw
MFVMTDsKKyAgICBWaXJ0dWFsTWVtb3J5VGFibGVbSW5kZXhdLkF0dHJpYnV0ZXMgICA9IEFSTV9N
RU1PUllfUkVHSU9OX0FUVFJJQlVURV9ERVZJQ0U7CisKKyAgICAvKgorICAgICAqICAtIFBDSWUg
UkNCMSBEZXZpY2UgbWVtb3J5CisgICAgICovCisgICAgVmlydHVhbE1lbW9yeVRhYmxlWysrSW5k
ZXhdLlBoeXNpY2FsQmFzZSA9IDB4NjQwMDAwMDAwMDAwVUxMOworICAgIFZpcnR1YWxNZW1vcnlU
YWJsZVtJbmRleF0uVmlydHVhbEJhc2UgID0gMHg2NDAwMDAwMDAwMDBVTEw7CisgICAgVmlydHVh
bE1lbW9yeVRhYmxlW0luZGV4XS5MZW5ndGggICAgICAgPSAweDQwMDAwMDAwMDAwVUxMOworICAg
IFZpcnR1YWxNZW1vcnlUYWJsZVtJbmRleF0uQXR0cmlidXRlcyAgID0gQVJNX01FTU9SWV9SRUdJ
T05fQVRUUklCVVRFX0RFVklDRTsKKworICAgIC8qCisgICAgICogIC0gUENJZSBSQ0IyIERldmlj
ZSBtZW1vcnkKKyAgICAgKi8KKyAgICBWaXJ0dWFsTWVtb3J5VGFibGVbKytJbmRleF0uUGh5c2lj
YWxCYXNlID0gMHg2ODAwMDAwMDAwMDBVTEw7CisgICAgVmlydHVhbE1lbW9yeVRhYmxlW0luZGV4
XS5WaXJ0dWFsQmFzZSAgPSAweDY4MDAwMDAwMDAwMFVMTDsKKyAgICBWaXJ0dWFsTWVtb3J5VGFi
bGVbSW5kZXhdLkxlbmd0aCAgICAgICA9IDB4NDAwMDAwMDAwMDBVTEw7CisgICAgVmlydHVhbE1l
bW9yeVRhYmxlW0luZGV4XS5BdHRyaWJ1dGVzICAgPSBBUk1fTUVNT1JZX1JFR0lPTl9BVFRSSUJV
VEVfREVWSUNFOworCisgICAgLyoKKyAgICAgKiAgLSBQQ0llIFJDQjMgRGV2aWNlIG1lbW9yeQor
ICAgICAqLworICAgIFZpcnR1YWxNZW1vcnlUYWJsZVsrK0luZGV4XS5QaHlzaWNhbEJhc2UgPSAw
eDZDMDAwMDAwMDAwMFVMTDsKKyAgICBWaXJ0dWFsTWVtb3J5VGFibGVbSW5kZXhdLlZpcnR1YWxC
YXNlICA9IDB4NkMwMDAwMDAwMDAwVUxMOworICAgIFZpcnR1YWxNZW1vcnlUYWJsZVtJbmRleF0u
TGVuZ3RoICAgICAgID0gMHg0MDAwMDAwMDAwMFVMTDsKKyAgICBWaXJ0dWFsTWVtb3J5VGFibGVb
SW5kZXhdLkF0dHJpYnV0ZXMgICA9IEFSTV9NRU1PUllfUkVHSU9OX0FUVFJJQlVURV9ERVZJQ0U7
CisgIH0KKworICAvKgorICAgKiAgLSAyUC9QQ0llIFNvY2tldDEgUkNBMCAzMi1iaXQgRGV2aWNl
IG1lbW9yeQorICAgKiAgLSAxUC9QQ0llIGNvbnNvbGlkYXRlZCB0byBSQ0EyIDMyLWJpdCBEZXZp
Y2UgbWVtb3J5CisgICAqLworICBWaXJ0dWFsTWVtb3J5VGFibGVbKytJbmRleF0uUGh5c2ljYWxC
YXNlID0gMHg2MDAwMDAwMFVMTDsKKyAgVmlydHVhbE1lbW9yeVRhYmxlW0luZGV4XS5WaXJ0dWFs
QmFzZSAgPSAweDYwMDAwMDAwVUxMOworICBWaXJ0dWFsTWVtb3J5VGFibGVbSW5kZXhdLkxlbmd0
aCAgICAgICA9IDB4ODAwMDAwMFVMTDsKKyAgVmlydHVhbE1lbW9yeVRhYmxlW0luZGV4XS5BdHRy
aWJ1dGVzICAgPSBBUk1fTUVNT1JZX1JFR0lPTl9BVFRSSUJVVEVfREVWSUNFOworCisgIC8qCisg
ICAqICAtIDJQL1BDSWUgU29ja2V0MSBSQ0ExIDMyLWJpdCBEZXZpY2UgbWVtb3J5CisgICAqICAt
IDFQL1BDSWUgY29uc29saWRhdGVkIHRvIFJDQTIgMzItYml0IERldmljZSBtZW1vcnkKKyAgICov
CisgIFZpcnR1YWxNZW1vcnlUYWJsZVsrK0luZGV4XS5QaHlzaWNhbEJhc2UgPSAweDY4MDAwMDAw
VUxMOworICBWaXJ0dWFsTWVtb3J5VGFibGVbSW5kZXhdLlZpcnR1YWxCYXNlICA9IDB4NjgwMDAw
MDBVTEw7CisgIFZpcnR1YWxNZW1vcnlUYWJsZVtJbmRleF0uTGVuZ3RoICAgICAgID0gMHg4MDAw
MDAwVUxMOworICBWaXJ0dWFsTWVtb3J5VGFibGVbSW5kZXhdLkF0dHJpYnV0ZXMgICA9IEFSTV9N
RU1PUllfUkVHSU9OX0FUVFJJQlVURV9ERVZJQ0U7CisKKyAgLyoKKyAgICogIC0gMlAvUENJZSBT
b2NrZXQxIFJDQTIgMzItYml0IERldmljZSBtZW1vcnkKKyAgICogIC0gMVAvUENJZSBjb25zb2xp
ZGF0ZWQgdG8gUkNBMyAzMi1iaXQgRGV2aWNlIG1lbW9yeQorICAgKi8KKyAgVmlydHVhbE1lbW9y
eVRhYmxlWysrSW5kZXhdLlBoeXNpY2FsQmFzZSA9IDB4NzAwMDAwMDBVTEw7CisgIFZpcnR1YWxN
ZW1vcnlUYWJsZVtJbmRleF0uVmlydHVhbEJhc2UgID0gMHg3MDAwMDAwMFVMTDsKKyAgVmlydHVh
bE1lbW9yeVRhYmxlW0luZGV4XS5MZW5ndGggICAgICAgPSAweDgwMDAwMDBVTEw7CisgIFZpcnR1
YWxNZW1vcnlUYWJsZVtJbmRleF0uQXR0cmlidXRlcyAgID0gQVJNX01FTU9SWV9SRUdJT05fQVRU
UklCVVRFX0RFVklDRTsKKworICAvKgorICAgKiAgLSAyUC9QQ0llIFNvY2tldDEgUkNBMyAzMi1i
aXQgRGV2aWNlIG1lbW9yeQorICAgKiAgLSAxUC9QQ0llIGNvbnNvbGlkYXRlZCB0byBSQ0EzIDMy
LWJpdCBEZXZpY2UgbWVtb3J5CisgICAqLworICBWaXJ0dWFsTWVtb3J5VGFibGVbKytJbmRleF0u
UGh5c2ljYWxCYXNlID0gMHg3ODAwMDAwMFVMTDsKKyAgVmlydHVhbE1lbW9yeVRhYmxlW0luZGV4
XS5WaXJ0dWFsQmFzZSAgPSAweDc4MDAwMDAwVUxMOworICBWaXJ0dWFsTWVtb3J5VGFibGVbSW5k
ZXhdLkxlbmd0aCAgICAgICA9IDB4ODAwMDAwMFVMTDsKKyAgVmlydHVhbE1lbW9yeVRhYmxlW0lu
ZGV4XS5BdHRyaWJ1dGVzICAgPSBBUk1fTUVNT1JZX1JFR0lPTl9BVFRSSUJVVEVfREVWSUNFOwor
CisgIC8qCisgICAqICAtIDJQL1BDSWUgU29ja2V0MSBSQ0IwIDMyLWJpdCBEZXZpY2UgbWVtb3J5
CisgICAqICAtIDFQL1BDSWUgY29uc29saWRhdGVkIHRvIFJDQTAgMzItYml0IERldmljZSBtZW1v
cnkKKyAgICovCisgIFZpcnR1YWxNZW1vcnlUYWJsZVsrK0luZGV4XS5QaHlzaWNhbEJhc2UgPSAw
eDQwMDAwMDAwVUxMOworICBWaXJ0dWFsTWVtb3J5VGFibGVbSW5kZXhdLlZpcnR1YWxCYXNlICA9
IDB4NDAwMDAwMDBVTEw7CisgIFZpcnR1YWxNZW1vcnlUYWJsZVtJbmRleF0uTGVuZ3RoICAgICAg
ID0gMHg4MDAwMDAwVUxMOworICBWaXJ0dWFsTWVtb3J5VGFibGVbSW5kZXhdLkF0dHJpYnV0ZXMg
ICA9IEFSTV9NRU1PUllfUkVHSU9OX0FUVFJJQlVURV9ERVZJQ0U7CisKKyAgLyoKKyAgICogIC0g
MlAvUENJZSBTb2NrZXQxIFJDQjEgMzItYml0IERldmljZSBtZW1vcnkKKyAgICogIC0gMVAvUENJ
ZSBjb25zb2xpZGF0ZWQgdG8gUkNBMCAzMi1iaXQgRGV2aWNlIG1lbW9yeQorICAgKi8KKyAgVmly
dHVhbE1lbW9yeVRhYmxlWysrSW5kZXhdLlBoeXNpY2FsQmFzZSA9IDB4NDgwMDAwMDBVTEw7Cisg
IFZpcnR1YWxNZW1vcnlUYWJsZVtJbmRleF0uVmlydHVhbEJhc2UgID0gMHg0ODAwMDAwMFVMTDsK
KyAgVmlydHVhbE1lbW9yeVRhYmxlW0luZGV4XS5MZW5ndGggICAgICAgPSAweDgwMDAwMDBVTEw7
CisgIFZpcnR1YWxNZW1vcnlUYWJsZVtJbmRleF0uQXR0cmlidXRlcyAgID0gQVJNX01FTU9SWV9S
RUdJT05fQVRUUklCVVRFX0RFVklDRTsKKworICAvKgorICAgKiAgLSAyUC9QQ0llIFNvY2tldDEg
UkNCMiAzMi1iaXQgRGV2aWNlIG1lbW9yeQorICAgKiAgLSAxUC9QQ0llIGNvbnNvbGlkYXRlZCB0
byBSQ0ExIDMyLWJpdCBEZXZpY2UgbWVtb3J5CisgICAqLworICBWaXJ0dWFsTWVtb3J5VGFibGVb
KytJbmRleF0uUGh5c2ljYWxCYXNlID0gMHg1MDAwMDAwMFVMTDsKKyAgVmlydHVhbE1lbW9yeVRh
YmxlW0luZGV4XS5WaXJ0dWFsQmFzZSAgPSAweDUwMDAwMDAwVUxMOworICBWaXJ0dWFsTWVtb3J5
VGFibGVbSW5kZXhdLkxlbmd0aCAgICAgICA9IDB4ODAwMDAwMFVMTDsKKyAgVmlydHVhbE1lbW9y
eVRhYmxlW0luZGV4XS5BdHRyaWJ1dGVzICAgPSBBUk1fTUVNT1JZX1JFR0lPTl9BVFRSSUJVVEVf
REVWSUNFOworCisgIC8qCisgICAqICAtIDJQL1BDSWUgU29ja2V0MSBSQ0IzIDMyLWJpdCBEZXZp
Y2UgbWVtb3J5CisgICAqICAtIDFQL1BDSWUgY29uc29saWRhdGVkIHRvIFJDQTEgMzItYml0IERl
dmljZSBtZW1vcnkKKyAgICovCisgIFZpcnR1YWxNZW1vcnlUYWJsZVsrK0luZGV4XS5QaHlzaWNh
bEJhc2UgPSAweDU4MDAwMDAwVUxMOworICBWaXJ0dWFsTWVtb3J5VGFibGVbSW5kZXhdLlZpcnR1
YWxCYXNlICA9IDB4NTgwMDAwMDBVTEw7CisgIFZpcnR1YWxNZW1vcnlUYWJsZVtJbmRleF0uTGVu
Z3RoICAgICAgID0gMHg4MDAwMDAwVUxMOworICBWaXJ0dWFsTWVtb3J5VGFibGVbSW5kZXhdLkF0
dHJpYnV0ZXMgICA9IEFSTV9NRU1PUllfUkVHSU9OX0FUVFJJQlVURV9ERVZJQ0U7CisKKyAgLyoK
KyAgICogIC0gQkVSVCBtZW1vcnkgcmVnaW9uCisgICAqLworICBWaXJ0dWFsTWVtb3J5VGFibGVb
KytJbmRleF0uUGh5c2ljYWxCYXNlID0gMHg4ODIzMDAwMFVMTDsKKyAgVmlydHVhbE1lbW9yeVRh
YmxlW0luZGV4XS5WaXJ0dWFsQmFzZSAgPSAweDg4MjMwMDAwVUxMOworICBWaXJ0dWFsTWVtb3J5
VGFibGVbSW5kZXhdLkxlbmd0aCAgICAgICA9IDB4NTAwMDBVTEw7CisgIFZpcnR1YWxNZW1vcnlU
YWJsZVtJbmRleF0uQXR0cmlidXRlcyAgID0gQVJNX01FTU9SWV9SRUdJT05fQVRUUklCVVRFX0RF
VklDRTsKKworICAvKgorICAgKiAgLSBERFIgbWVtb3J5IHJlZ2lvbgorICAgKi8KKyAgTnVtUmVn
aW9uID0gUGxhdGZvcm1Ib2ItJmd0O0RyYW1JbmZvLk51bVJlZ2lvbjsKKyAgQ291bnQgPSAwOwor
ICB3aGlsZSAoTnVtUmVnaW9uLS0gJmd0OyAwKSB7CisgICAgaWYgKFBsYXRmb3JtSG9iLSZndDtE
cmFtSW5mby5OdmRSZWdpb25bQ291bnRdKSB7IC8qIFNraXAgTlZESU1NIFJlZ2lvbiAqLworICAg
ICAgQ291bnQrKzsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKworICAgIFZpcnR1YWxNZW1vcnlU
YWJsZVsrK0luZGV4XS5QaHlzaWNhbEJhc2UgPSBQbGF0Zm9ybUhvYi0mZ3Q7RHJhbUluZm8uQmFz
ZVtDb3VudF07CisgICAgVmlydHVhbE1lbW9yeVRhYmxlW0luZGV4XS5WaXJ0dWFsQmFzZSAgPSBQ
bGF0Zm9ybUhvYi0mZ3Q7RHJhbUluZm8uQmFzZVtDb3VudF07CisgICAgVmlydHVhbE1lbW9yeVRh
YmxlW0luZGV4XS5MZW5ndGggICAgICAgPSBQbGF0Zm9ybUhvYi0mZ3Q7RHJhbUluZm8uU2l6ZVtD
b3VudF07CisgICAgVmlydHVhbE1lbW9yeVRhYmxlW0luZGV4XS5BdHRyaWJ1dGVzICAgPSBERFJf
QVRUUklCVVRFU19DQUNIRUQ7CisgICAgQ291bnQrKzsKKyAgfQorCisgIC8qIFNQTSBNTSBOUyBC
dWZmZXIgZm9yIE1tQ29tbXVuaWNhdGVEeGUgKi8KKyAgVmlydHVhbE1lbW9yeVRhYmxlWysrSW5k
ZXhdLlBoeXNpY2FsQmFzZSA9IFBjZEdldDY0IChQY2RNbUJ1ZmZlckJhc2UpOworICBWaXJ0dWFs
TWVtb3J5VGFibGVbSW5kZXhdLlZpcnR1YWxCYXNlICA9IFBjZEdldDY0IChQY2RNbUJ1ZmZlckJh
c2UpOworICBWaXJ0dWFsTWVtb3J5VGFibGVbSW5kZXhdLkxlbmd0aCAgICAgICA9IFBjZEdldDY0
IChQY2RNbUJ1ZmZlclNpemUpOworICBWaXJ0dWFsTWVtb3J5VGFibGVbSW5kZXhdLkF0dHJpYnV0
ZXMgICA9IEREUl9BVFRSSUJVVEVTX0NBQ0hFRDsKKworICAvKiBFbmQgb2YgVGFibGUgKi8KKyAg
VmlydHVhbE1lbW9yeVRhYmxlWysrSW5kZXhdLlBoeXNpY2FsQmFzZSA9IDA7CisgIFZpcnR1YWxN
ZW1vcnlUYWJsZVtJbmRleF0uVmlydHVhbEJhc2UgID0gMDsKKyAgVmlydHVhbE1lbW9yeVRhYmxl
W0luZGV4XS5MZW5ndGggICAgICAgPSAwOworICBWaXJ0dWFsTWVtb3J5VGFibGVbSW5kZXhdLkF0
dHJpYnV0ZXMgICA9IChBUk1fTUVNT1JZX1JFR0lPTl9BVFRSSUJVVEVTKTA7CisKKyAgQVNTRVJU
ICgoSW5kZXggKyAxKSAmbHQ7PSBNQVhfVklSVFVBTF9NRU1PUllfTUFQX0RFU0NSSVBUT1JTKTsK
KworICAqVmlydHVhbE1lbW9yeU1hcCA9IFZpcnR1YWxNZW1vcnlUYWJsZTsKK30KPC9wcmU+CiAg
ICAgIDwvYmxvY2txdW90ZT4KICAgICAgPHByZSBjbGFzcz0ibW96LXF1b3RlLXByZSIgd3JhcD0i
Ij4KCgo8L3ByZT4KICAgICAgPGJsb2NrcXVvdGUgdHlwZT0iY2l0ZSI+CiAgICAgICAgPHByZSBj
bGFzcz0ibW96LXF1b3RlLXByZSIgd3JhcD0iIj5kaWZmIC0tZ2l0IGEvU2lsaWNvbi9BbXBlcmUv
QW1wZXJlQWx0cmFQa2cvTGlicmFyeS9NYWlsYm94SW50ZXJmYWNlTGliL01haWxib3hJbnRlcmZh
Y2VMaWIuYyBiL1NpbGljb24vQW1wZXJlL0FtcGVyZUFsdHJhUGtnL0xpYnJhcnkvTWFpbGJveElu
dGVyZmFjZUxpYi9NYWlsYm94SW50ZXJmYWNlTGliLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5k
ZXggMDAwMDAwMDAwMDAwLi4wZGExZjkwNjk5ZjYKLS0tIC9kZXYvbnVsbAorKysgYi9TaWxpY29u
L0FtcGVyZS9BbXBlcmVBbHRyYVBrZy9MaWJyYXJ5L01haWxib3hJbnRlcmZhY2VMaWIvTWFpbGJv
eEludGVyZmFjZUxpYi5jCkBAIC0wLDAgKzEsMjgyIEBACisvKiogQGZpbGUKKyAgVGhlIGxpYnJh
cnkgaW1wbGVtZW50cyB0aGUgaGFyZHdhcmUgTWFpbGJveCAoRG9vcmJlbGwpIGludGVyZmFjZSBm
b3IgY29tbXVuaWNhdGlvbgorICBiZXR3ZWVuIHRoZSBBcHBsaWNhdGlvbiBQcm9jZXNzb3IgKEFS
TXY4KSBhbmQgdGhlIFN5c3RlbSBDb250cm9sIFByb2Nlc3NvcnMgKFNNcHJvL1BNcHJvKS4KKwor
ICBDb3B5cmlnaHQgKGMpIDIwMjEsIEFtcGVyZSBDb21wdXRpbmcgTExDLiBBbGwgcmlnaHRzIHJl
c2VydmVkLiZsdDtCUiZndDsKKworICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTItQ2xh
dXNlLVBhdGVudAorCisqKi8KKworI2luY2x1ZGUgJmx0O1VlZmkuaCZndDsKKworI2luY2x1ZGUg
Jmx0O0xpYnJhcnkvQW1wZXJlQ3B1TGliLmgmZ3Q7CisjaW5jbHVkZSAmbHQ7TGlicmFyeS9CYXNl
TWVtb3J5TGliLmgmZ3Q7CisjaW5jbHVkZSAmbHQ7TGlicmFyeS9EZWJ1Z0xpYi5oJmd0OworI2lu
Y2x1ZGUgJmx0O0xpYnJhcnkvTWFpbGJveEludGVyZmFjZUxpYi5oJmd0OworI2luY2x1ZGUgJmx0
O0xpYnJhcnkvVGltZXJMaWIuaCZndDsKKyNpbmNsdWRlICZsdDtMaWJyYXJ5L0lvTGliLmgmZ3Q7
CisKKy8vCisvLyBIYXJkd2FyZSBEb29yYmVsbHMKKy8vCisjZGVmaW5lIFNNUFJPX0RCMF9JUlFf
T0ZTVCAgICAgICAgICAgICAgIDQwCisjZGVmaW5lIFNNUFJPX0RCMF9CQVNFX0FERFJFU1MgICAg
ICAgICAgIChGaXhlZFBjZEdldDY0IChQY2RTbXByb0RiQmFzZVJlZykpCisKKyNkZWZpbmUgUE1Q
Uk9fREIwX0lSUV9PRlNUICAgICAgICAgICAgICAgNTYKKyNkZWZpbmUgUE1QUk9fREIwX0JBU0Vf
QUREUkVTUyAgICAgICAgICAgKEZpeGVkUGNkR2V0NjQgKFBjZFBtcHJvRGJCYXNlUmVnKSkKKwor
I2RlZmluZSBTTEFWRV9TT0NLRVRfQkFTRV9BRERSRVNTX09GRlNFVCAweDQwMDAwMDAwMDAwMAor
CisvLworLy8gVGhlIGJhc2UgU1BJIGludGVycnVwdCBudW1iZXIgb2YgdGhlIFNsYXZlIHNvY2tl
dAorLy8KKyNkZWZpbmUgU0xBVkVfU09DS0VUX1NQSV9JTlRFUlJVUFQgMzUyCisKKyNkZWZpbmUg
U0xBVkVfU09DS0VUX0RPT1JCRUxMX0lOVEVSUlVQVF9CQVNFKFNvY2tldCkgKChTb2NrZXQpICog
U0xBVkVfU09DS0VUX1NQSV9JTlRFUlJVUFQgLSAzMikKKworLy8KKy8vIERvb3JiZWxsIGJhc2Ug
cmVnaXN0ZXIgc3RyaWRlIHNpemUKKy8vCisjZGVmaW5lIERCX0JBU0VfUkVHX1NUUklERSAweDAw
MDAxMDAwCisKKyNkZWZpbmUgU01QUk9fREJ4X0FERFJFU1Moc29ja2V0LCBkYikgXAorICAgICAg
ICAoKHNvY2tldCkgKiBTTEFWRV9TT0NLRVRfQkFTRV9BRERSRVNTX09GRlNFVCArIFNNUFJPX0RC
MF9CQVNFX0FERFJFU1MgKyBEQl9CQVNFX1JFR19TVFJJREUgKiAoZGIpKQorCisjZGVmaW5lIFBN
UFJPX0RCeF9BRERSRVNTKHNvY2tldCwgZGIpIFwKKyAgICAgICAgKChzb2NrZXQpICogU0xBVkVf
U09DS0VUX0JBU0VfQUREUkVTU19PRkZTRVQgKyBQTVBST19EQjBfQkFTRV9BRERSRVNTICsgREJf
QkFTRV9SRUdfU1RSSURFICogKGRiKSkKKworLy8KKy8vIERvb3JiZWxsIFN0YXR1cyBCaXRzCisv
LworI2RlZmluZSBEQl9TVEFUVVNfQVZBSUxfQklUICAgICAgIEJJVDE2CisjZGVmaW5lIERCX1NU
QVRVU19BQ0tfQklUICAgICAgICAgQklUMAorCisvKioKKyAgR2V0IHRoZSBiYXNlIGFkZHJlc3Mg
b2YgYSBkb29yYmVsbC4KKworICBAcGFyYW1baW5dICBTb2NrZXQgICAgICAgICAgICBBY3RpdmUg
c29ja2V0IGluZGV4LgorICBAcGFyYW1baW5dICBEb29yYmVsbCAgICAgICAgICBEb29yYmVsbCBj
aGFubmVsIGZvciBjb21tdW5pY2F0aW9uIHdpdGggdGhlIFNNcHJvL1BNcHJvLgorCisgIEByZXR2
YWwgVUlOVDMyICAgICAgICAgICAgICAgIFRoZSBiYXNlIGFkZHJlc3Mgb2YgdGhlIGRvb3JiZWxs
LgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgcmV0dXJuZWQgdmFsdWUgaXMg
MCBpbmRpY2F0ZSB0aGF0IHRoZSBpbnB1dCBwYXJhbWV0ZXJzIGFyZSBpbnZhbGlkLgorCisqKi8K
K1VJTlROCitFRklBUEkKK01haWxib3hHZXREb29yYmVsbEFkZHJlc3MgKAorICBJTiBVSU5UOCAg
ICAgICAgICAgICBTb2NrZXQsCisgIElOIERPT1JCRUxMX0NIQU5ORUxTIERvb3JiZWxsCisgICkK
K3sKKyAgVUlOVE4gRG9vcmJlbGxBZGRyZXNzOworCisgIGlmIChTb2NrZXQgJmd0Oz0gR2V0TnVt
YmVyT2ZBY3RpdmVTb2NrZXRzICgpCisgICAgICB8fCBEb29yYmVsbCAmZ3Q7PSBOVU1CRVJfT0Zf
RE9PUkJFTExTX1BFUl9TT0NLRVQpCisgIHsKKyAgICByZXR1cm4gMDsKKyAgfQo8L3ByZT4KICAg
ICAgPC9ibG9ja3F1b3RlPgogICAgICA8cHJlIGNsYXNzPSJtb3otcXVvdGUtcHJlIiB3cmFwPSIi
PgpDb2Rpbmcgc3R5bGUgaXMKIGlmICgpIHsKIH0KClRoaXMgZmlsZSBnZXRzIGl0IGNvbnNpc3Rl
bnRseSB3cm9uZy48L3ByZT4KICAgIDwvYmxvY2txdW90ZT4KICAgIDxwPkkgYWdyZWUgdGhhdCBp
dCBzaG91bGQgYmUgY29uc2lzdGVudC4gQnV0IHRoYXQgY29kaW5nIHN0eWxlCiAgICAgIGNvbmZv
cm1zIHRvICZxdW90OzUuMi4xLjYgRWFjaCBzdWItZXhwcmVzc2lvbiBvZiBhIGNvbXBsZXggcHJl
ZGljYXRlCiAgICAgIGV4cHJlc3Npb24gbXVzdCBiZSBvbiBhIHNlcGFyYXRlIGxpbmUmcXVvdDsg
aW4gRURLIElJIENvZGluZyBTdGFuZGFyZHMKICAgICAgU3BlYwooPGEgY2xhc3M9Im1vei10eHQt
bGluay1mcmVldGV4dCIgaHJlZj0iaHR0cHM6Ly9lZGsyLWRvY3MuZ2l0Ym9vay5pby9lZGstaWkt
Yy1jb2Rpbmctc3RhbmRhcmRzLXNwZWNpZmljYXRpb24vNV9zb3VyY2VfZmlsZXMvNTJfc3BhY2lu
ZyM1LTItMS02LWVhY2gtc3ViLWV4cHJlc3Npb24tb2YtYS1jb21wbGV4LXByZWRpY2F0ZS1leHBy
ZXNzaW9uLW11c3QtYmUtb24tYS1zZXBhcmF0ZS1saW5lIj5odHRwczovL2VkazItZG9jcy5naXRi
b29rLmlvL2Vkay1paS1jLWNvZGluZy1zdGFuZGFyZHMtc3BlY2lmaWNhdGlvbi81X3NvdXJjZV9m
aWxlcy81Ml9zcGFjaW5nIzUtMi0xLTYtZWFjaC1zdWItZXhwcmVzc2lvbi1vZi1hLWNvbXBsZXgt
cHJlZGljYXRlLWV4cHJlc3Npb24tbXVzdC1iZS1vbi1hLXNlcGFyYXRlLWxpbmU8L2E+KS48L3A+
CiAgICA8cD4mcXVvdDs8c3BhbiBkYXRhLW9mZnNldC1rZXk9IjYwMjYzOWQ4ZmFjNjQwZTI5OTE4
YzEwOTg2MDliYTg3OjAiPlByZWRpY2F0ZQogICAgICAgIGV4cHJlc3Npb25zIGNvbnRhaW5pbmcg
bXVsdGlwbGUgb3BlcmF0b3JzIHdpdGggc3ViLWV4cHJlc3Npb25zCiAgICAgICAgam9pbmVkIGJ5
ICZhbXA7JmFtcDsgb3IgfHwgbXVzdCBoYXZlIGVhY2ggc3ViLWV4cHJlc3Npb24gb24gYQogICAg
ICAgIHNlcGFyYXRlIGxpbmUuIFRoZSBvcGVuaW5nIGJyYWNlLCAnPC9zcGFuPjxzcGFuIGRhdGEt
b2Zmc2V0LWtleT0iNjAyNjM5ZDhmYWM2NDBlMjk5MThjMTA5ODYwOWJhODc6MSI+PGNvZGUgc3Bl
bGxjaGVjaz0iZmFsc2UiIGNsYXNzPSJjb2RlLTA0NThlMjFlIiBkYXRhLXNsYXRlLWxlYWY9InRy
dWUiPns8L2NvZGU+PC9zcGFuPjxzcGFuIGRhdGEtb2Zmc2V0LWtleT0iNjAyNjM5ZDhmYWM2NDBl
Mjk5MThjMTA5ODYwOWJhODc6MiIgZGF0YS1zbGF0ZS1mcmFnbWVudD0iSlRkQ0pUSXliMkpxWldO
MEpUSXlKVE5CSlRJeVpHOWpkVzFsYm5RbE1qSWxNa01sTWpKa1lYUmhKVEl5SlROQkpUZENKVGRF
SlRKREpUSXlibTlrWlhNbE1qSWxNMEVsTlVJbE4wSWxNakp2WW1wbFkzUWxNaklsTTBFbE1qSmli
RzlqYXlVeU1pVXlReVV5TW5SNWNHVWxNaklsTTBFbE1qSndZWEpoWjNKaGNHZ2xNaklsTWtNbE1q
SnBjMVp2YVdRbE1qSWxNMEZtWVd4elpTVXlReVV5TW1SaGRHRWxNaklsTTBFbE4wSWxOMFFsTWtN
bE1qSnViMlJsY3lVeU1pVXpRU1UxUWlVM1FpVXlNbTlpYW1WamRDVXlNaVV6UVNVeU1uUmxlSFFs
TWpJbE1rTWxNakpzWldGMlpYTWxNaklsTTBFbE5VSWxOMElsTWpKdlltcGxZM1FsTWpJbE0wRWxN
akpzWldGbUpUSXlKVEpESlRJeWRHVjRkQ1V5TWlVelFTVXlNbEJ5WldScFkyRjBaU1V5TUdWNGNI
SmxjM05wYjI1ekpUSXdZMjl1ZEdGcGJtbHVaeVV5TUcxMWJIUnBjR3hsSlRJd2IzQmxjbUYwYjNK
ekpUSXdkMmwwYUNVeU1ITjFZaTFsZUhCeVpYTnphVzl1Y3lVeU1HcHZhVzVsWkNVeU1HSjVKVEl3
SlRJMkpUSTJKVEl3YjNJbE1qQWxOME1sTjBNbE1qQnRkWE4wSlRJd2FHRjJaU1V5TUdWaFkyZ2xN
akJ6ZFdJdFpYaHdjbVZ6YzJsdmJpVXlNRzl1SlRJd1lTVXlNSE5sY0dGeVlYUmxKVEl3YkdsdVpT
NGxNakJVYUdVbE1qQnZjR1Z1YVc1bkpUSXdZbkpoWTJVbE1rTWxNakFuSlRJeUpUSkRKVEl5YldG
eWEzTWxNaklsTTBFbE5VSWxOVVFsTjBRbE1rTWxOMElsTWpKdlltcGxZM1FsTWpJbE0wRWxNakpz
WldGbUpUSXlKVEpESlRJeWRHVjRkQ1V5TWlVelFTVXlNaVUzUWlVeU1pVXlReVV5TW0xaGNtdHpK
VEl5SlROQkpUVkNKVGRDSlRJeWIySnFaV04wSlRJeUpUTkJKVEl5YldGeWF5VXlNaVV5UXlVeU1u
UjVjR1VsTWpJbE0wRWxNakpqYjJSbEpUSXlKVEpESlRJeVpHRjBZU1V5TWlVelFTVTNRaVUzUkNV
M1JDVTFSQ1UzUkNVeVF5VTNRaVV5TW05aWFtVmpkQ1V5TWlVelFTVXlNbXhsWVdZbE1qSWxNa01s
TWpKMFpYaDBKVEl5SlROQkpUSXlKeVV5TUc5bUpUSXdkR2hsSlRJd1ltOWtlU1V5TUhOb1lXeHNK
VEl3WW1VbE1qQnZiaVV5TUdFbE1qQnNhVzVsSlRJd1lua2xNakJwZEhObGJHWWxNakJoYm1RbE1q
QmhiR2xuYm1Wa0pUSXdhVzRsTWpCMGFHVWxNakJ6ZEdGeWRHbHVaeVV5TUdOdmJIVnRiaVV5TUc5
bUpUSXdkR2hsSlRJd1lYTnpiMk5wWVhSbFpDVXlNR3RsZVhkdmNtUXVKVEl5SlRKREpUSXliV0Z5
YTNNbE1qSWxNMEVsTlVJbE5VUWxOMFFsTlVRbE4wUWxOVVFsTjBRbE5VUWxOMFE9Ij4nCiAgICAg
ICAgb2YgdGhlIGJvZHkgc2hhbGwgYmUgb24gYSBsaW5lIGJ5IGl0c2VsZiBhbmQgYWxpZ25lZCBp
biB0aGUKICAgICAgICBzdGFydGluZyBjb2x1bW4gb2YgdGhlIGFzc29jaWF0ZWQga2V5d29yZC48
L3NwYW4+PC9wPgogICAgPHA+PHNwYW4gZGF0YS1vZmZzZXQta2V5PSI2MDI2MzlkOGZhYzY0MGUy
OTkxOGMxMDk4NjA5YmE4NzoyIiBkYXRhLXNsYXRlLWZyYWdtZW50PSJKVGRDSlRJeWIySnFaV04w
SlRJeUpUTkJKVEl5Wkc5amRXMWxiblFsTWpJbE1rTWxNakprWVhSaEpUSXlKVE5CSlRkQ0pUZEVK
VEpESlRJeWJtOWtaWE1sTWpJbE0wRWxOVUlsTjBJbE1qSnZZbXBsWTNRbE1qSWxNMEVsTWpKaWJH
OWpheVV5TWlVeVF5VXlNblI1Y0dVbE1qSWxNMEVsTWpKd1lYSmhaM0poY0dnbE1qSWxNa01sTWpK
cGMxWnZhV1FsTWpJbE0wRm1ZV3h6WlNVeVF5VXlNbVJoZEdFbE1qSWxNMEVsTjBJbE4wUWxNa01s
TWpKdWIyUmxjeVV5TWlVelFTVTFRaVUzUWlVeU1tOWlhbVZqZENVeU1pVXpRU1V5TW5SbGVIUWxN
aklsTWtNbE1qSnNaV0YyWlhNbE1qSWxNMEVsTlVJbE4wSWxNakp2WW1wbFkzUWxNaklsTTBFbE1q
SnNaV0ZtSlRJeUpUSkRKVEl5ZEdWNGRDVXlNaVV6UVNVeU1sQnlaV1JwWTJGMFpTVXlNR1Y0Y0hK
bGMzTnBiMjV6SlRJd1kyOXVkR0ZwYm1sdVp5VXlNRzExYkhScGNHeGxKVEl3YjNCbGNtRjBiM0p6
SlRJd2QybDBhQ1V5TUhOMVlpMWxlSEJ5WlhOemFXOXVjeVV5TUdwdmFXNWxaQ1V5TUdKNUpUSXdK
VEkySlRJMkpUSXdiM0lsTWpBbE4wTWxOME1sTWpCdGRYTjBKVEl3YUdGMlpTVXlNR1ZoWTJnbE1q
QnpkV0l0Wlhod2NtVnpjMmx2YmlVeU1HOXVKVEl3WVNVeU1ITmxjR0Z5WVhSbEpUSXdiR2x1WlM0
bE1qQlVhR1VsTWpCdmNHVnVhVzVuSlRJd1luSmhZMlVsTWtNbE1qQW5KVEl5SlRKREpUSXliV0Z5
YTNNbE1qSWxNMEVsTlVJbE5VUWxOMFFsTWtNbE4wSWxNakp2WW1wbFkzUWxNaklsTTBFbE1qSnNa
V0ZtSlRJeUpUSkRKVEl5ZEdWNGRDVXlNaVV6UVNVeU1pVTNRaVV5TWlVeVF5VXlNbTFoY210ekpU
SXlKVE5CSlRWQ0pUZENKVEl5YjJKcVpXTjBKVEl5SlROQkpUSXliV0Z5YXlVeU1pVXlReVV5TW5S
NWNHVWxNaklsTTBFbE1qSmpiMlJsSlRJeUpUSkRKVEl5WkdGMFlTVXlNaVV6UVNVM1FpVTNSQ1Uz
UkNVMVJDVTNSQ1V5UXlVM1FpVXlNbTlpYW1WamRDVXlNaVV6UVNVeU1teGxZV1lsTWpJbE1rTWxN
akowWlhoMEpUSXlKVE5CSlRJeUp5VXlNRzltSlRJd2RHaGxKVEl3WW05a2VTVXlNSE5vWVd4c0pU
SXdZbVVsTWpCdmJpVXlNR0VsTWpCc2FXNWxKVEl3WW5rbE1qQnBkSE5sYkdZbE1qQmhibVFsTWpC
aGJHbG5ibVZrSlRJd2FXNGxNakIwYUdVbE1qQnpkR0Z5ZEdsdVp5VXlNR052YkhWdGJpVXlNRzlt
SlRJd2RHaGxKVEl3WVhOemIyTnBZWFJsWkNVeU1HdGxlWGR2Y21RdUpUSXlKVEpESlRJeWJXRnlh
M01sTWpJbE0wRWxOVUlsTlVRbE4wUWxOVVFsTjBRbE5VUWxOMFFsTlVRbE4wUT0iPndoaWxlCiAg
ICAgICAgKCAoIENvZGUgPT0gTUVFVFNfU1RBTkRBUkQpPGJyPgogICAgICAgICZuYnNwOyAmYW1w
OyZhbXA7ICggQ29kZSA9PSBGVU5DVElPTkFMKSk8YnI+CiAgICAgICAgezxicj4KICAgICAgICAm
bmJzcDsgU2hpcEl0KCk7PGJyPgogICAgICAgIH08L3NwYW4+PGJyPgogICAgPC9wPgogICAgPHA+
JnF1b3Q7PGJyPgogICAgPC9wPgogICAgPHA+SG93ZXZlciwgSSdtIE9LIHRvIGNoYW5nZSBpdCBh
cyB5b3VyIHN1Z2dlc3Rpb24uPGJyPgogICAgPC9wPgogICAgPHA+PGJyPgogICAgPC9wPgogICAg
PHA+VGhhbmtzLDwvcD4KICAgIDxwPk5oaTxicj4KICAgIDwvcD4KICAgIDxibG9ja3F1b3RlIHR5
cGU9ImNpdGUiIGNpdGU9Im1pZDoyMDIxMDYwNDIzMDQxMC5zN3Z1YXJ4aXIyZnFrcXR3QGxldmlh
dGhhbiI+CiAgICAgIDxwcmUgY2xhc3M9Im1vei1xdW90ZS1wcmUiIHdyYXA9IiI+Cgo8L3ByZT4K
ICAgICAgPGJsb2NrcXVvdGUgdHlwZT0iY2l0ZSI+CiAgICAgICAgPHByZSBjbGFzcz0ibW96LXF1
b3RlLXByZSIgd3JhcD0iIj4rCisgIGlmIChEb29yYmVsbCAmZ3Q7PSBTTXByb0Rvb3JiZWxsQ2hh
bm5lbDApIHsKKyAgICBEb29yYmVsbEFkZHJlc3MgPSBTTVBST19EQnhfQUREUkVTUyAoU29ja2V0
LCAoVUlOVDgpKERvb3JiZWxsIC0gU01wcm9Eb29yYmVsbENoYW5uZWwwKSk7CisgIH0gZWxzZSB7
CisgICAgRG9vcmJlbGxBZGRyZXNzID0gUE1QUk9fREJ4X0FERFJFU1MgKFNvY2tldCwgKFVJTlQ4
KURvb3JiZWxsKTsKKyAgfQorCisgIHJldHVybiBEb29yYmVsbEFkZHJlc3M7Cit9CisKKy8qKgor
ICBHZXQgdGhlIGludGVycnVwdCBudW1iZXIgb2YgYSBkb29yYmVsbC4KKworICBAcGFyYW1baW5d
ICBTb2NrZXQgICAgICAgICAgICBBY3RpdmUgc29ja2V0IGluZGV4LgorICBAcGFyYW1baW5dICBE
b29yYmVsbCAgICAgICAgICBEb29yYmVsbCBjaGFubmVsIGZvciBjb21tdW5pY2F0aW9uIHdpdGgg
dGhlIFNNcHJvL1BNcHJvLgorCisgIEByZXR2YWwgVUlOVDMyICAgICAgICAgICAgICAgIFRoZSBp
bnRlcnJ1cHQgbnVtYmVyLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgcmV0
dXJuZWQgdmFsdWUgaXMgMCBpbmRpY2F0ZSB0aGF0IHRoZSBpbnB1dCBwYXJhbWV0ZXJzIGFyZSBp
bnZhbGlkLgorCisqKi8KK1VJTlQzMgorRUZJQVBJCitNYWlsYm94R2V0RG9vcmJlbGxJbnRlcnJ1
cHROdW1iZXIgKAorICBJTiBVSU5UOCAgICAgICAgICAgICBTb2NrZXQsCisgIElOIERPT1JCRUxM
X0NIQU5ORUxTIERvb3JiZWxsCisgICkKK3sKKyAgVUlOVDMyIERvb3JiZWxsSW50ZXJydXB0TnVt
YmVyOworCisgIGlmIChTb2NrZXQgJmd0Oz0gR2V0TnVtYmVyT2ZBY3RpdmVTb2NrZXRzICgpCisg
ICAgICB8fCBEb29yYmVsbCAmZ3Q7PSBOVU1CRVJfT0ZfRE9PUkJFTExTX1BFUl9TT0NLRVQpCisg
IHsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIERvb3JiZWxsSW50ZXJydXB0TnVtYmVyID0gMDsK
KworICBpZiAoU29ja2V0ICZndDsgMCkgeworICAgIERvb3JiZWxsSW50ZXJydXB0TnVtYmVyID0g
U0xBVkVfU09DS0VUX0RPT1JCRUxMX0lOVEVSUlVQVF9CQVNFIChTb2NrZXQpOworICB9CisKKyAg
aWYgKERvb3JiZWxsICZndDs9IFNNcHJvRG9vcmJlbGxDaGFubmVsMCkgeworICAgIERvb3JiZWxs
SW50ZXJydXB0TnVtYmVyICs9IFNNUFJPX0RCMF9JUlFfT0ZTVCArIChVSU5UOCkoRG9vcmJlbGwg
LSBTTXByb0Rvb3JiZWxsQ2hhbm5lbDApOworICB9IGVsc2UgeworICAgIERvb3JiZWxsSW50ZXJy
dXB0TnVtYmVyICs9IFBNUFJPX0RCMF9JUlFfT0ZTVCArIChVSU5UOClEb29yYmVsbDsKKyAgfQor
CisgIHJldHVybiBEb29yYmVsbEludGVycnVwdE51bWJlcjsKK30KKworLyoqCisgIFJlYWQgYSBt
ZXNzYWdlIHZpYSB0aGUgaGFyZHdhcmUgRG9vcmJlbGwgaW50ZXJmYWNlLgorCisgIEBwYXJhbVtp
bl0gIFNvY2tldCAgICAgICAgICAgIEFjdGl2ZSBzb2NrZXQgaW5kZXguCisgIEBwYXJhbVtpbl0g
IERvb3JiZWxsICAgICAgICAgIERvb3JiZWxsIGNoYW5uZWwgZm9yIGNvbW11bmljYXRpb24gd2l0
aCB0aGUgU01wcm8vUE1wcm8uCisgIEBwYXJhbVtvdXRdIE1lc3NhZ2UgICAgICAgICAgIFBvaW50
ZXIgdG8gdGhlIE1haWxib3ggbWVzc2FnZS4KKworICBAcmV0dmFsIEVGSV9TVUNDRVNTICAgICAg
ICAgICBSZWFkIHRoZSBtZXNzYWdlIHN1Y2Nlc3NmdWxseS4KKyAgQHJldHZhbCBFRklfVElNRU9V
VCAgICAgICAgICAgVGltZW91dCBvY2N1cnJlZCB3aGVuIHdhaXRpbmcgZm9yIGF2YWlsYWJsZSBt
ZXNzYWdlIGluIHRoZSBtYWlsYm94LgorICBAcmV0dmFsIEVGSV9JTlZBTElEX1BBUkFNRVRFUiBB
IHBhcmFtZXRlciBpcyBpbnZhbGlkLgorKiovCitFRklfU1RBVFVTCitFRklBUEkKK01haWxib3hS
ZWFkICgKKyAgSU4gIFVJTlQ4ICAgICAgICAgICAgICAgIFNvY2tldCwKKyAgSU4gIERPT1JCRUxM
X0NIQU5ORUxTICAgIERvb3JiZWxsLAorICBPVVQgTUFJTEJPWF9NRVNTQUdFX0RBVEEgKk1lc3Nh
Z2UKKyAgKQoreworICBVSU5UTiBUaW1lb3V0Q291bnQ7CisgIFVJTlROIERvb3JiZWxsQWRkcmVz
czsKKworICBpZiAoU29ja2V0ICZndDs9IEdldE51bWJlck9mQWN0aXZlU29ja2V0cyAoKQorICAg
ICAgfHwgRG9vcmJlbGwgJmd0Oz0gTlVNQkVSX09GX0RPT1JCRUxMU19QRVJfU09DS0VUCisgICAg
ICB8fCBNZXNzYWdlID09IE5VTEwpCisgIHsKKyAgICByZXR1cm4gRUZJX0lOVkFMSURfUEFSQU1F
VEVSOworICB9CisKKyAgVGltZW91dENvdW50ID0gTUFJTEJPWF9QT0xMX0NPVU5UOworCisgIERv
b3JiZWxsQWRkcmVzcyA9IE1haWxib3hHZXREb29yYmVsbEFkZHJlc3MgKFNvY2tldCwgRG9vcmJl
bGwpOworICBBU1NFUlQgKERvb3JiZWxsQWRkcmVzcyAhPSAwKTsKKworICAvLworICAvLyBQb2xs
aW5nIERvb3JiZWxsIHN0YXR1cworICAvLworICB3aGlsZSAoKE1taW9SZWFkMzIgKChEb29yYmVs
bEFkZHJlc3MgKyBEQl9TVEFUVVNfUkVHX09GU1QpKSAmYW1wOyBEQl9TVEFUVVNfQVZBSUxfQklU
KSA9PSAwKSB7CisgICAgTWljcm9TZWNvbmREZWxheSAoTUFJTEJPWF9QT0xMX0lOVEVSVkFMX1VT
KTsKKyAgICBpZiAoLS1UaW1lb3V0Q291bnQgPT0gMCkgeworICAgICAgcmV0dXJuIEVGSV9USU1F
T1VUOworICAgIH0KKyAgfQorCisgIE1lc3NhZ2UtJmd0O0V4dGVuZGVkRGF0YVswXSA9IE1taW9S
ZWFkMzIgKERvb3JiZWxsQWRkcmVzcyArIERCX0RJTjBfUkVHX09GU1QpOworICBNZXNzYWdlLSZn
dDtFeHRlbmRlZERhdGFbMV0gPSBNbWlvUmVhZDMyIChEb29yYmVsbEFkZHJlc3MgKyBEQl9ESU4x
X1JFR19PRlNUKTsKKyAgTWVzc2FnZS0mZ3Q7RGF0YSA9IE1taW9SZWFkMzIgKERvb3JiZWxsQWRk
cmVzcyArIERCX0lOX1JFR19PRlNUKTsKKworICAvLworICAvLyBXcml0ZSAxIHRvIGNsZWFyIHRo
ZSBBVkFJTCBzdGF0dXMKKyAgLy8KKyAgTW1pb1dyaXRlMzIgKERvb3JiZWxsQWRkcmVzcyArIERC
X1NUQVRVU19SRUdfT0ZTVCwgREJfU1RBVFVTX0FWQUlMX0JJVCk7CisKKyAgcmV0dXJuIEVGSV9T
VUNDRVNTOworfQorCisvKioKKyAgV3JpdGUgYSBtZXNzYWdlIHZpYSB0aGUgaGFyZHdhcmUgRG9v
cmJlbGwgaW50ZXJmYWNlLgorCisgIEBwYXJhbVtpbl0gIFNvY2tldCAgICAgICAgICAgIEFjdGl2
ZSBzb2NrZXQgaW5kZXguCisgIEBwYXJhbVtpbl0gIERvb3JiZWxsICAgICAgICAgIERvb3JiZWwg
Y2hhbm5lbCBmb3IgY29tbXVuaWNhdGlvbiB3aXRoIHRoZSBTTXByby9QTXByby4KKyAgQHBhcmFt
W2luXSAgTWVzc2FnZSAgICAgICAgICAgUG9pbnRlciB0byB0aGUgTWFpbGJveCBtZXNzYWdlLgor
CisgIEByZXR2YWwgRUZJX1NVQ0NFU1MgICAgICAgICAgIFdyaXRlIHRoZSBtZXNzYWdlIHN1Y2Nl
c3NmdWxseS4KKyAgQHJldHZhbCBFRklfVElNRU9VVCAgICAgICAgICAgVGltZW91dCBvY2N1cnJl
ZCB3aGVuIHdhaXRpbmcgZm9yIGFja25vd2xlZGdlIHNpZ25hbCBmcm9tIHRoZSBtYWlsYm94Lgor
ICBAcmV0dmFsIEVGSV9JTlZBTElEX1BBUkFNRVRFUiBBIHBhcmFtZXRlciBpcyBpbnZhbGlkLgor
KiovCitFRklfU1RBVFVTCitFRklBUEkKK01haWxib3hXcml0ZSAoCisgIElOIFVJTlQ4ICAgICAg
ICAgICAgICAgIFNvY2tldCwKKyAgSU4gRE9PUkJFTExfQ0hBTk5FTFMgICAgRG9vcmJlbGwsCisg
IElOIE1BSUxCT1hfTUVTU0FHRV9EQVRBICpNZXNzYWdlCisgICkKK3sKKyAgVUlOVE4gVGltZW91
dENvdW50OworICBVSU5UTiBEb29yYmVsbEFkZHJlc3M7CisKKyAgaWYgKFNvY2tldCAmZ3Q7PSBH
ZXROdW1iZXJPZkFjdGl2ZVNvY2tldHMgKCkKKyAgICAgIHx8IERvb3JiZWxsICZndDs9IE5VTUJF
Ul9PRl9ET09SQkVMTFNfUEVSX1NPQ0tFVAorICAgICAgfHwgTWVzc2FnZSA9PSBOVUxMKQorICB7
CisgICAgcmV0dXJuIEVGSV9JTlZBTElEX1BBUkFNRVRFUjsKKyAgfQorCisgIFRpbWVvdXRDb3Vu
dCA9IE1BSUxCT1hfUE9MTF9DT1VOVDsKKworICBEb29yYmVsbEFkZHJlc3MgPSBNYWlsYm94R2V0
RG9vcmJlbGxBZGRyZXNzIChTb2NrZXQsIERvb3JiZWxsKTsKKyAgQVNTRVJUIChEb29yYmVsbEFk
ZHJlc3MgIT0gMCk7CisKKyAgLy8KKyAgLy8gQ2xlYXIgcHJldmlvdXMgcGVuZGluZyBhY2sgaWYg
YW55CisgIC8vCisgIGlmICgoTW1pb1JlYWQzMiAoRG9vcmJlbGxBZGRyZXNzICsgREJfU1RBVFVT
X1JFR19PRlNUKSAmYW1wOyBEQl9TVEFUVVNfQUNLX0JJVCkgIT0gMCkgeworICAgIE1taW9Xcml0
ZTMyIChEb29yYmVsbEFkZHJlc3MgKyBEQl9TVEFUVVNfUkVHX09GU1QsIERCX1NUQVRVU19BQ0tf
QklUKTsKKyAgfQorCisgIC8vCisgIC8vIFNlbmQgbWVzc2FnZQorICAvLworICBNbWlvV3JpdGUz
MiAoRG9vcmJlbGxBZGRyZXNzICsgREJfRE9VVDBfUkVHX09GU1QsIE1lc3NhZ2UtJmd0O0V4dGVu
ZGVkRGF0YVswXSk7CisgIE1taW9Xcml0ZTMyIChEb29yYmVsbEFkZHJlc3MgKyBEQl9ET1VUMV9S
RUdfT0ZTVCwgTWVzc2FnZS0mZ3Q7RXh0ZW5kZWREYXRhWzFdKTsKKyAgTW1pb1dyaXRlMzIgKERv
b3JiZWxsQWRkcmVzcyArIERCX09VVF9SRUdfT0ZTVCwgTWVzc2FnZS0mZ3Q7RGF0YSk7CisKKyAg
Ly8KKyAgLy8gV2FpdCBmb3IgQUNLCisgIC8vCisgIHdoaWxlICgoTW1pb1JlYWQzMiAoRG9vcmJl
bGxBZGRyZXNzICsgREJfU1RBVFVTX1JFR19PRlNUKSAmYW1wOyBEQl9TVEFUVVNfQUNLX0JJVCkg
PT0gMCkgeworICAgIE1pY3JvU2Vjb25kRGVsYXkgKE1BSUxCT1hfUE9MTF9JTlRFUlZBTF9VUyk7
CisgICAgaWYgKC0tVGltZW91dENvdW50ID09IDApIHsKKyAgICAgIHJldHVybiBFRklfVElNRU9V
VDsKKyAgICB9CisgIH0KKworICAvLworICAvLyBXcml0ZSAxIHRvIGNsZWFyIHRoZSBBQ0sgc3Rh
dHVzCisgIC8vCisgIE1taW9Xcml0ZTMyIChEb29yYmVsbEFkZHJlc3MgKyBEQl9TVEFUVVNfUkVH
X09GU1QsIERCX1NUQVRVU19BQ0tfQklUKTsKKworICByZXR1cm4gRUZJX1NVQ0NFU1M7Cit9CisK
Ky8qKgorICBVbm1hc2sgdGhlIERvb3JiZWxsIGludGVycnVwdCBzdGF0dXMuCisKKyAgQHBhcmFt
ICBTb2NrZXQgICAgQWN0aXZlIHNvY2tldCBpbmRleC4KKyAgQHBhcmFtICBEb29yYmVsbCAgRG9v
cmJlbCBjaGFubmVsIGZvciBjb21tdW5pY2F0aW9uIHdpdGggdGhlIFNNcHJvL1BNcHJvLgorCisg
IEByZXR2YWwgRUZJX1NVQ0NFU1MgICAgICAgICAgICBVbm1hc2sgdGhlIERvb3JiZWxsIGludGVy
cnVwdCBzdWNjZXNzZnVsbHkuCisgIEByZXR2YWwgRUZJX0lOVkFMSURfUEFSQU1FVEVSICBBIHBh
cmFtZXRlciBpcyBpbnZhbGlkLgorCisqKi8KK0VGSV9TVEFUVVMKK0VGSUFQSQorTWFpbGJveFVu
bWFza0ludGVycnVwdCAoCisgIElOIFVJTlQ4ICBTb2NrZXQsCisgIElOIFVJTlQxNiBEb29yYmVs
bAorICApCit7CisgIFVJTlROIERvb3JiZWxsQWRkcmVzczsKKworICBpZiAoU29ja2V0ICZndDs9
IEdldE51bWJlck9mQWN0aXZlU29ja2V0cyAoKQorICAgICAgfHwgRG9vcmJlbGwgJmd0Oz0gTlVN
QkVSX09GX0RPT1JCRUxMU19QRVJfU09DS0VUKQorICB7CisgICAgcmV0dXJuIEVGSV9JTlZBTElE
X1BBUkFNRVRFUjsKKyAgfQorCisgIERvb3JiZWxsQWRkcmVzcyA9IE1haWxib3hHZXREb29yYmVs
bEFkZHJlc3MgKFNvY2tldCwgRG9vcmJlbGwpOworICBBU1NFUlQgKERvb3JiZWxsQWRkcmVzcyAh
PSAwKTsKKworICBNbWlvV3JpdGUzMiAoRG9vcmJlbGxBZGRyZXNzICsgREJfU1RBVFVTX01BU0tf
UkVHX09GU1QsIH5EQl9TVEFUVVNfQVZBSUxfQklUKTsKKworICByZXR1cm4gRUZJX1NVQ0NFU1M7
Cit9CjwvcHJlPgogICAgICA8L2Jsb2NrcXVvdGU+CiAgICAgIDxwcmUgY2xhc3M9Im1vei1xdW90
ZS1wcmUiIHdyYXA9IiI+Cgo8L3ByZT4KICAgICAgPGJsb2NrcXVvdGUgdHlwZT0iY2l0ZSI+CiAg
ICAgICAgPHByZSBjbGFzcz0ibW96LXF1b3RlLXByZSIgd3JhcD0iIj5kaWZmIC0tZ2l0IGEvU2ls
aWNvbi9BbXBlcmUvQW1wZXJlQWx0cmFQa2cvTGlicmFyeS9NbUNvbW11bmljYXRpb25MaWIvTW1D
b21tdW5pY2F0aW9uTGliLmMgYi9TaWxpY29uL0FtcGVyZS9BbXBlcmVBbHRyYVBrZy9MaWJyYXJ5
L01tQ29tbXVuaWNhdGlvbkxpYi9NbUNvbW11bmljYXRpb25MaWIuYwpuZXcgZmlsZSBtb2RlIDEw
MDY0NAppbmRleCAwMDAwMDAwMDAwMDAuLmJmNDAwZWMwYTgzNQotLS0gL2Rldi9udWxsCisrKyBi
L1NpbGljb24vQW1wZXJlL0FtcGVyZUFsdHJhUGtnL0xpYnJhcnkvTW1Db21tdW5pY2F0aW9uTGli
L01tQ29tbXVuaWNhdGlvbkxpYi5jCkBAIC0wLDAgKzEsMTg0IEBACisvKiogQGZpbGUKKworICBD
b3B5cmlnaHQgKGMpIDIwMjAgLSAyMDIxLCBBbXBlcmUgQ29tcHV0aW5nIExMQy4gQWxsIHJpZ2h0
cyByZXNlcnZlZC4mbHQ7QlImZ3Q7CisKKyAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEJTRC0y
LUNsYXVzZS1QYXRlbnQKKworKiovCisKKyNpbmNsdWRlICZsdDtJbmR1c3RyeVN0YW5kYXJkL0Fy
bVN0ZFNtYy5oJmd0OworI2luY2x1ZGUgJmx0O0xpYnJhcnkvQXJtTGliLmgmZ3Q7CisjaW5jbHVk
ZSAmbHQ7TGlicmFyeS9Bcm1TbWNMaWIuaCZndDsKKyNpbmNsdWRlICZsdDtMaWJyYXJ5L0Jhc2VN
ZW1vcnlMaWIuaCZndDsKKyNpbmNsdWRlICZsdDtMaWJyYXJ5L0RlYnVnTGliLmgmZ3Q7CisjaW5j
bHVkZSAmbHQ7TGlicmFyeS9NbUNvbW11bmljYXRpb25MaWIuaCZndDsKKyNpbmNsdWRlICZsdDtM
aWJyYXJ5L1BjZExpYi5oJmd0OworI2luY2x1ZGUgJmx0O1Byb3RvY29sL01tQ29tbXVuaWNhdGlv
bi5oJmd0OworCisvLworLy8gQWRkcmVzcywgTGVuZ3RoIG9mIHRoZSBwcmUtYWxsb2NhdGVkIGJ1
ZmZlciBmb3IgY29tbXVuaWNhdGlvbiB3aXRoIHRoZSBzZWN1cmUKKy8vIHdvcmxkLgorLy8KK1NU
QVRJQyBBUk1fTUVNT1JZX1JFR0lPTl9ERVNDUklQVE9SIG1Oc0NvbW1CdWZmTWVtUmVnaW9uOwor
CitFRklfU1RBVFVTCitFRklBUEkKK01tQ29tbXVuaWNhdGlvbkxpYkNvbnN0cnVjdG9yICgKKyAg
Vk9JRAorICApCit7CisgIG1Oc0NvbW1CdWZmTWVtUmVnaW9uLlBoeXNpY2FsQmFzZSA9IFBjZEdl
dDY0IChQY2RNbUJ1ZmZlckJhc2UpOworICAvLyBEdXJpbmcgYm9vdCAsIFZpcnR1YWwgYW5kIFBo
eXNpY2FsIGFyZSBzYW1lCjwvcHJlPgogICAgICA8L2Jsb2NrcXVvdGU+CiAgICAgIDxwcmUgY2xh
c3M9Im1vei1xdW90ZS1wcmUiIHdyYXA9IiI+CklkZWFsbHksIHVzZSBVRUZJLWRlZmluZWQgdGVy
bXMuICZxdW90O0R1cmluZyBib290JnF1b3Q7IGlzIHF1aXRlIGFtYmlndW91cy4KCgo8L3ByZT4K
ICAgICAgPGJsb2NrcXVvdGUgdHlwZT0iY2l0ZSI+CiAgICAgICAgPHByZSBjbGFzcz0ibW96LXF1
b3RlLXByZSIgd3JhcD0iIj4rICBtTnNDb21tQnVmZk1lbVJlZ2lvbi5WaXJ0dWFsQmFzZSA9IG1O
c0NvbW1CdWZmTWVtUmVnaW9uLlBoeXNpY2FsQmFzZTsKKyAgbU5zQ29tbUJ1ZmZNZW1SZWdpb24u
TGVuZ3RoID0gUGNkR2V0NjQgKFBjZE1tQnVmZmVyU2l6ZSk7CisKKyAgcmV0dXJuIEVGSV9TVUND
RVNTOworfQorCisvKioKKyAgQ29tbXVuaWNhdGVzIHdpdGggYSByZWdpc3RlcmVkIGhhbmRsZXIu
CisKKyAgVGhpcyBmdW5jdGlvbiBwcm92aWRlcyBhbiBpbnRlcmZhY2UgdG8gc2VuZCBhbmQgcmVj
ZWl2ZSBtZXNzYWdlcyB0byB0aGUKKyAgU3RhbmRhbG9uZSBNTSBlbnZpcm9ubWVudCBpbiBVRUZJ
IFBFSSBwaGFzZS4KKworICBAcGFyYW1baW4sIG91dF0gQ29tbUJ1ZmZlciAgICAgICAgICBBIHBv
aW50ZXIgdG8gdGhlIGJ1ZmZlciB0byBjb252ZXkKKyAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgaW50byBNTVJBTS4KKyAgQHBhcmFtW2luLCBvdXRdIENvbW1TaXplICAgICAg
ICAgICAgVGhlIHNpemUgb2YgdGhlIGRhdGEgYnVmZmVyIGJlaW5nCisgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIHBhc3NlZCBpbi4gVGhpcyBpcyBvcHRpb25hbC4KKworICBA
cmV0dmFsIEVGSV9TVUNDRVNTICAgICAgICAgICAgICAgICBUaGUgbWVzc2FnZSB3YXMgc3VjY2Vz
c2Z1bGx5IHBvc3RlZC4KKyAgQHJldHZhbCBFRklfSU5WQUxJRF9QQVJBTUVURVIgICAgICAgVGhl
IENvbW1CdWZmZXIgd2FzIE5VTEwuCisgIEByZXR2YWwgRUZJX0JBRF9CVUZGRVJfU0laRSAgICAg
ICAgIFRoZSBidWZmZXIgc2l6ZSBpcyBpbmNvcnJlY3QgZm9yIHRoZSBNTQorICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICBpbXBsZW1lbnRhdGlvbi4gSWYgdGhpcyBlcnJvciBp
cworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5lZCwgdGhlIE1l
c3NhZ2VMZW5ndGggZmllbGQgaW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgdGhlIENvbW1CdWZmZXIgaGVhZGVyIG9yIHRoZSBpbnRlZ2VyCisgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIHBvaW50ZWQgYnkgQ29tbVNpemUgYXJlIHVwZGF0ZWQgdG8g
cmVmbGVjdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgbWF4aW11
bSBwYXlsb2FkIHNpemUgdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
IGltcGxlbWVudGF0aW9uIGNhbiBhY2NvbW1vZGF0ZS4KKyAgQHJldHZhbCBFRklfQUNDRVNTX0RF
TklFRCAgICAgICAgICAgVGhlIENvbW11bmljYXRlQnVmZmVyIHBhcmFtZXRlcgorICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvciBDb21tU2l6ZSBwYXJhbWV0ZXIsIGlmIG5v
dCBvbWl0dGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmUgaW4g
YWRkcmVzcyByYW5nZSB0aGF0IGNhbm5vdCBiZQorICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICBhY2Nlc3NlZCBieSB0aGUgTU0gZW52aXJvbm1lbnQKKyoqLworRUZJX1NUQVRV
UworRUZJQVBJCitNbUNvbW11bmljYXRpb25Db21tdW5pY2F0ZSAoCisgIElOIE9VVCBWT0lEICAq
Q29tbUJ1ZmZlciwKKyAgSU4gT1VUIFVJTlROICpDb21tU2l6ZSBPUFRJT05BTAorICApCit7Cisg
IEVGSV9NTV9DT01NVU5JQ0FURV9IRUFERVIgKkNvbW11bmljYXRlSGVhZGVyOworICBBUk1fU01D
X0FSR1MgICAgICAgICAgICAgIENvbW11bmljYXRlU21jQXJnczsKKyAgRUZJX1NUQVRVUyAgICAg
ICAgICAgICAgICBTdGF0dXM7CisgIFVJTlROICAgICAgICAgICAgICAgICAgICAgQnVmZmVyU2l6
ZTsKKworICBTdGF0dXMgPSBFRklfQUNDRVNTX0RFTklFRDsKKyAgQnVmZmVyU2l6ZSA9IDA7CisK
KyAgWmVyb01lbSAoJmFtcDtDb21tdW5pY2F0ZVNtY0FyZ3MsIHNpemVvZiAoQVJNX1NNQ19BUkdT
KSk7CisKKyAgLy8KKyAgLy8gQ2hlY2sgcGFyYW1ldGVycworICAvLworICBpZiAoQ29tbUJ1ZmZl
ciA9PSBOVUxMKSB7CisgICAgcmV0dXJuIEVGSV9JTlZBTElEX1BBUkFNRVRFUjsKKyAgfQorCisg
IENvbW11bmljYXRlSGVhZGVyID0gQ29tbUJ1ZmZlcjsKKyAgLy8gQ29tbUJ1ZmZlciBpcyBhIG1h
bmRhdG9yeSBwYXJhbWV0ZXIuIEhlbmNlLCBSZWx5IG9uCisgIC8vIE1lc3NhZ2VMZW5ndGggKyBI
ZWFkZXIgdG8gYXNjZXJ0YWluIHRoZQorICAvLyB0b3RhbCBzaXplIG9mIHRoZSBjb21tdW5pY2F0
aW9uIHBheWxvYWQgcmF0aGVyIHRoYW4KKyAgLy8gcmVseSBvbiBvcHRpb25hbCBDb21tU2l6ZSBw
YXJhbWV0ZXIKKyAgQnVmZmVyU2l6ZSA9IENvbW11bmljYXRlSGVhZGVyLSZndDtNZXNzYWdlTGVu
Z3RoICsKKyAgICAgICAgICAgICAgIHNpemVvZiAoQ29tbXVuaWNhdGVIZWFkZXItJmd0O0hlYWRl
ckd1aWQpICsKKyAgICAgICAgICAgICAgIHNpemVvZiAoQ29tbXVuaWNhdGVIZWFkZXItJmd0O01l
c3NhZ2VMZW5ndGgpOworCisgIC8vIElmIHRoZSBsZW5ndGggb2YgdGhlIENvbW1CdWZmZXIgaXMg
MCB0aGVuIHJldHVybiB0aGUgZXhwZWN0ZWQgbGVuZ3RoLgorICBpZiAoQ29tbVNpemUgIT0gTlVM
TCkgeworICAgIC8vIFRoaXMgY2FzZSBjYW4gYmUgdXNlZCBieSB0aGUgY29uc3VtZXIgb2YgdGhp
cyBkcml2ZXIgdG8gZmluZCBvdXQgdGhlCisgICAgLy8gbWF4IHNpemUgdGhhdCBjYW4gYmUgdXNl
ZCBmb3IgYWxsb2NhdGluZyBDb21tQnVmZmVyLgorICAgIGlmICgoKkNvbW1TaXplID09IDApIHx8
CisgICAgICAgICgqQ29tbVNpemUgJmd0OyBtTnNDb21tQnVmZk1lbVJlZ2lvbi5MZW5ndGgpKQor
ICAgIHsKPC9wcmU+CiAgICAgIDwvYmxvY2txdW90ZT4KICAgICAgPHByZSBjbGFzcz0ibW96LXF1
b3RlLXByZSIgd3JhcD0iIj4KeyBhdCBlbmQgb2YgcHJlY2VkaW5nIGxpbmUuClBsZWFzZSBhZGRy
ZXNzIHRocm91Z2hvdXQgdGhpcyBmaWxlLgoKPC9wcmU+CiAgICAgIDxibG9ja3F1b3RlIHR5cGU9
ImNpdGUiPgogICAgICAgIDxwcmUgY2xhc3M9Im1vei1xdW90ZS1wcmUiIHdyYXA9IiI+KyAgICAg
ICpDb21tU2l6ZSA9IG1Oc0NvbW1CdWZmTWVtUmVnaW9uLkxlbmd0aDsKKyAgICAgIHJldHVybiBF
RklfQkFEX0JVRkZFUl9TSVpFOworICAgIH0KKyAgICAvLworICAgIC8vIENvbW1TaXplIG11c3Qg
bWF0Y2ggTWVzc2FnZUxlbmd0aCArIHNpemVvZiAoRUZJX01NX0NPTU1VTklDQVRFX0hFQURFUik7
CisgICAgLy8KKyAgICBpZiAoKkNvbW1TaXplICE9IEJ1ZmZlclNpemUpIHsKKyAgICAgIHJldHVy
biBFRklfSU5WQUxJRF9QQVJBTUVURVI7CisgICAgfQorICB9CisKKyAgLy8KKyAgLy8gSWYgdGhl
IGJ1ZmZlciBzaXplIGlzIDAgb3IgZ3JlYXRlciB0aGFuIHdoYXQgY2FuIGJlIHRvbGVyYXRlZCBi
eSB0aGUgTU0KKyAgLy8gZW52aXJvbm1lbnQgdGhlbiByZXR1cm4gdGhlIGV4cGVjdGVkIHNpemUu
CisgIC8vCisgIGlmICgoQnVmZmVyU2l6ZSA9PSAwKSB8fAorICAgICAgKEJ1ZmZlclNpemUgJmd0
OyBtTnNDb21tQnVmZk1lbVJlZ2lvbi5MZW5ndGgpKQorICB7CisgICAgQ29tbXVuaWNhdGVIZWFk
ZXItJmd0O01lc3NhZ2VMZW5ndGggPSBtTnNDb21tQnVmZk1lbVJlZ2lvbi5MZW5ndGggLQorICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mIChDb21tdW5pY2F0ZUhl
YWRlci0mZ3Q7SGVhZGVyR3VpZCkgLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgc2l6ZW9mIChDb21tdW5pY2F0ZUhlYWRlci0mZ3Q7TWVzc2FnZUxlbmd0aCk7CisgICAg
cmV0dXJuIEVGSV9CQURfQlVGRkVSX1NJWkU7CisgIH0KKworICAvLyBTTUMgRnVuY3Rpb24gSUQK
KyAgQ29tbXVuaWNhdGVTbWNBcmdzLkFyZzAgPSBBUk1fU01DX0lEX01NX0NPTU1VTklDQVRFX0FB
UkNINjQ7CisKKyAgLy8gQ29va2llCisgIENvbW11bmljYXRlU21jQXJncy5BcmcxID0gMDsKKwor
ICAvLyBDb3B5IENvbW11bmljYXRpb24gUGF5bG9hZAorICBDb3B5TWVtICgoVk9JRCAqKW1Oc0Nv
bW1CdWZmTWVtUmVnaW9uLlZpcnR1YWxCYXNlLCBDb21tQnVmZmVyLCBCdWZmZXJTaXplKTsKKwor
ICAvLyBjb21tX2J1ZmZlcl9hZGRyZXNzICg2NC1iaXQgcGh5c2ljYWwgYWRkcmVzcykKKyAgQ29t
bXVuaWNhdGVTbWNBcmdzLkFyZzIgPSAoVUlOVE4pbU5zQ29tbUJ1ZmZNZW1SZWdpb24uUGh5c2lj
YWxCYXNlOworCisgIC8vIGNvbW1fc2l6ZV9hZGRyZXNzIChub3QgdXNlZCwgaW5kaWNhdGVkIGJ5
IHNldHRpbmcgdG8gemVybykKKyAgQ29tbXVuaWNhdGVTbWNBcmdzLkFyZzMgPSAwOworCisgIC8v
IENhbGwgdGhlIFN0YW5kYWxvbmUgTU0gZW52aXJvbm1lbnQuCisgIEFybUNhbGxTbWMgKCZhbXA7
Q29tbXVuaWNhdGVTbWNBcmdzKTsKKworICBzd2l0Y2ggKENvbW11bmljYXRlU21jQXJncy5Bcmcw
KSB7CisgIGNhc2UgQVJNX1NNQ19NTV9SRVRfU1VDQ0VTUzoKKyAgICBaZXJvTWVtIChDb21tQnVm
ZmVyLCBCdWZmZXJTaXplKTsKKyAgICAvLyBPbiBzdWNjZXNzZnVsIHJldHVybiwgdGhlIHNpemUg
b2YgZGF0YSBiZWluZyByZXR1cm5lZCBpcyBpbmZlcnJlZCBmcm9tCisgICAgLy8gTWVzc2FnZUxl
bmd0aCArIEhlYWRlci4KKyAgICBDb21tdW5pY2F0ZUhlYWRlciA9IChFRklfTU1fQ09NTVVOSUNB
VEVfSEVBREVSICopbU5zQ29tbUJ1ZmZNZW1SZWdpb24uVmlydHVhbEJhc2U7CisgICAgQnVmZmVy
U2l6ZSA9IENvbW11bmljYXRlSGVhZGVyLSZndDtNZXNzYWdlTGVuZ3RoICsKKyAgICAgICAgICAg
ICAgICAgc2l6ZW9mIChDb21tdW5pY2F0ZUhlYWRlci0mZ3Q7SGVhZGVyR3VpZCkgKworICAgICAg
ICAgICAgICAgICBzaXplb2YgKENvbW11bmljYXRlSGVhZGVyLSZndDtNZXNzYWdlTGVuZ3RoKTsK
KworICAgIENvcHlNZW0gKAorICAgICAgQ29tbUJ1ZmZlciwKKyAgICAgIChWT0lEICopbU5zQ29t
bUJ1ZmZNZW1SZWdpb24uVmlydHVhbEJhc2UsCisgICAgICBCdWZmZXJTaXplCisgICAgICApOwor
ICAgIFN0YXR1cyA9IEVGSV9TVUNDRVNTOworICAgIGJyZWFrOworCisgIGNhc2UgQVJNX1NNQ19N
TV9SRVRfSU5WQUxJRF9QQVJBTVM6CisgICAgU3RhdHVzID0gRUZJX0lOVkFMSURfUEFSQU1FVEVS
OworICAgIGJyZWFrOworCisgIGNhc2UgQVJNX1NNQ19NTV9SRVRfREVOSUVEOgorICAgIFN0YXR1
cyA9IEVGSV9BQ0NFU1NfREVOSUVEOworICAgIGJyZWFrOworCisgIGNhc2UgQVJNX1NNQ19NTV9S
RVRfTk9fTUVNT1JZOgorICAgIC8vIFVuZXhwZWN0ZWQgZXJyb3Igc2luY2UgdGhlIENvbW1TaXpl
IHdhcyBjaGVja2VkIGZvciB6ZXJvIGxlbmd0aAorICAgIC8vIHByaW9yIHRvIGlzc3VpbmcgdGhl
IFNNQworICAgIFN0YXR1cyA9IEVGSV9PVVRfT0ZfUkVTT1VSQ0VTOworICAgIEFTU0VSVCAoMCk7
CisgICAgYnJlYWs7CisKKyAgZGVmYXVsdDoKKyAgICBTdGF0dXMgPSBFRklfQUNDRVNTX0RFTklF
RDsKKyAgICBBU1NFUlQgKDApOworICB9CisKKyAgcmV0dXJuIFN0YXR1czsKK30KPC9wcmU+CiAg
ICAgIDwvYmxvY2txdW90ZT4KICAgICAgPHByZSBjbGFzcz0ibW96LXF1b3RlLXByZSIgd3JhcD0i
Ij4KPC9wcmU+CiAgICAgIDxibG9ja3F1b3RlIHR5cGU9ImNpdGUiPgogICAgICAgIDxwcmUgY2xh
c3M9Im1vei1xdW90ZS1wcmUiIHdyYXA9IiI+ZGlmZiAtLWdpdCBhL1BsYXRmb3JtL0FtcGVyZS9K
YWRlUGtnL0phZGVCb2FyZFNldHRpbmcuY2ZnIGIvUGxhdGZvcm0vQW1wZXJlL0phZGVQa2cvSmFk
ZUJvYXJkU2V0dGluZy5jZmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAw
Li41YTY3ZThmYzZhNzUKLS0tIC9kZXYvbnVsbAorKysgYi9QbGF0Zm9ybS9BbXBlcmUvSmFkZVBr
Zy9KYWRlQm9hcmRTZXR0aW5nLmNmZwpAQCAtMCwwICsxLDIwOSBAQAorIyBTYW1wbGUgYm9hcmQg
c2V0dGluZworIworIyBUaGlzIGlzIGEgc2FtcGxlIGJvYXJkIHNldHRpbmcgYXMgdXNlZCBmb3Ig
dGhlCisjIEFtcGVyZSBBbHRyYSByZWZlcmVuY2UgZGVzaWduLgo8L3ByZT4KICAgICAgPC9ibG9j
a3F1b3RlPgogICAgICA8cHJlIGNsYXNzPSJtb3otcXVvdGUtcHJlIiB3cmFwPSIiPgpXaGF0IGlz
IGEgYm9hcmQgc2V0dGluZz8KCjwvcHJlPgogICAgICA8YmxvY2txdW90ZSB0eXBlPSJjaXRlIj4K
ICAgICAgICA8cHJlIGNsYXNzPSJtb3otcXVvdGUtcHJlIiB3cmFwPSIiPisjCisjIE5hbWUsIG9m
ZnNldCAoaGV4KSwgdmFsdWUKKyMgdmFsdWUgY2FuIGJlIGhleCBvciBkZWNpbWFsCisjCisKK05W
X1NJX1JPX0JPQVJEX1ZFTkRPUiwgMHgwMDAwLCAweDAwMDBDRDNBCitOVl9TSV9ST19CT0FSRF9U
WVBFLCAweDAwMDgsIDB4MDAwMDAwMDAKK05WX1NJX1JPX0JPQVJEX1JFViwgMHgwMDEwLCAweDAw
MDAwMDAwCitOVl9TSV9ST19CT0FSRF9DRkcsIDB4MDAxOCwgMHgwMDAwMDAwMAorTlZfU0lfUk9f
Qk9BUkRfUzBfRElNTV9BVkFJTCwgMHgwMDIwLCAweDAwMDBGRkZGCitOVl9TSV9ST19CT0FSRF9T
MV9ESU1NX0FWQUlMLCAweDAwMjgsIDB4MDAwMEZGRkYKK05WX1NJX1JPX0JPQVJEX1NQSTBDUzBf
RlJFUV9LSFosIDB4MDAzMCwgMHgwMDAwODBFOAorTlZfU0lfUk9fQk9BUkRfU1BJMENTMV9GUkVR
X0tIWiwgMHgwMDM4LCAweDAwMDA4MEU4CitOVl9TSV9ST19CT0FSRF9TUEkxQ1MwX0ZSRVFfS0ha
LCAweDAwNDAsIDB4MDAwMDI3MTAKK05WX1NJX1JPX0JPQVJEX1NQSTFDUzFfRlJFUV9LSFosIDB4
MDA0OCwgMHgwMDAwMjcxMAorTlZfU0lfUk9fQk9BUkRfVFBNX0xPQywgMHgwMDUwLCAweDAwMDAw
MDAwCitOVl9TSV9ST19CT0FSRF9JMkMwX0ZSRVFfS0haLCAweDAwNTgsIDB4MDAwMDAxOTAKK05W
X1NJX1JPX0JPQVJEX0kyQzFfRlJFUV9LSFosIDB4MDA2MCwgMHgwMDAwMDE5MAorTlZfU0lfUk9f
Qk9BUkRfSTJDMl8xMF9GUkVRX0tIWiwgMHgwMDY4LCAweDAwMDAwMTkwCitOVl9TSV9ST19CT0FS
RF9JMkMzX0ZSRVFfS0haLCAweDAwNzAsIDB4MDAwMDAxOTAKK05WX1NJX1JPX0JPQVJEX0kyQzlf
RlJFUV9LSFosIDB4MDA3OCwgMHgwMDAwMDE5MAorTlZfU0lfUk9fQk9BUkRfMlBfQ0ZHLCAweDAw
ODAsIDB4RkZGRkZGMDEKK05WX1NJX1JPX0JPQVJEX1MwX1JDQTBfQ0ZHLCAweDAwODgsIDB4MDAw
MDAwMDAKK05WX1NJX1JPX0JPQVJEX1MwX1JDQTFfQ0ZHLCAweDAwOTAsIDB4MDAwMDAwMDAKK05W
X1NJX1JPX0JPQVJEX1MwX1JDQTJfQ0ZHLCAweDAwOTgsIDB4MDAwMDAwMDQKK05WX1NJX1JPX0JP
QVJEX1MwX1JDQTNfQ0ZHLCAweDAwQTAsIDB4MDAwMDAwMDQKK05WX1NJX1JPX0JPQVJEX1MwX1JD
QjBfTE9fQ0ZHLCAweDAwQTgsIDB4MDAwMjAwMDIKK05WX1NJX1JPX0JPQVJEX1MwX1JDQjBfSElf
Q0ZHLCAweDAwQjAsIDB4MDAwMjAwMDIKK05WX1NJX1JPX0JPQVJEX1MwX1JDQjFfTE9fQ0ZHLCAw
eDAwQjgsIDB4MDAwMjAwMDIKK05WX1NJX1JPX0JPQVJEX1MwX1JDQjFfSElfQ0ZHLCAweDAwQzAs
IDB4MDAwMjAwMDIKK05WX1NJX1JPX0JPQVJEX1MwX1JDQjJfTE9fQ0ZHLCAweDAwQzgsIDB4MDAw
MjAwMDIKK05WX1NJX1JPX0JPQVJEX1MwX1JDQjJfSElfQ0ZHLCAweDAwRDAsIDB4MDAwMDAwMDMK
K05WX1NJX1JPX0JPQVJEX1MwX1JDQjNfTE9fQ0ZHLCAweDAwRDgsIDB4MDAwMDAwMDMKK05WX1NJ
X1JPX0JPQVJEX1MwX1JDQjNfSElfQ0ZHLCAweDAwRTAsIDB4MDAwMjAwMDIKK05WX1NJX1JPX0JP
QVJEX1MxX1JDQTBfQ0ZHLCAweDAwRTgsIDB4MDAwMDAwMDAKK05WX1NJX1JPX0JPQVJEX1MxX1JD
QTFfQ0ZHLCAweDAwRjAsIDB4MDAwMDAwMDAKK05WX1NJX1JPX0JPQVJEX1MxX1JDQTJfQ0ZHLCAw
eDAwRjgsIDB4MDIwMjAyMDIKK05WX1NJX1JPX0JPQVJEX1MxX1JDQTNfQ0ZHLCAweDAxMDAsIDB4
MDAwMzAwMDMKK05WX1NJX1JPX0JPQVJEX1MxX1JDQjBfTE9fQ0ZHLCAweDAxMDgsIDB4MDAwMDAw
MDMKK05WX1NJX1JPX0JPQVJEX1MxX1JDQjBfSElfQ0ZHLCAweDAxMTAsIDB4MDAwMjAwMDIKK05W
X1NJX1JPX0JPQVJEX1MxX1JDQjFfTE9fQ0ZHLCAweDAxMTgsIDB4MDAwMjAwMDIKK05WX1NJX1JP
X0JPQVJEX1MxX1JDQjFfSElfQ0ZHLCAweDAxMjAsIDB4MDAwMDAwMDMKK05WX1NJX1JPX0JPQVJE
X1MxX1JDQjJfTE9fQ0ZHLCAweDAxMjgsIDB4MDAwMjAwMDIKK05WX1NJX1JPX0JPQVJEX1MxX1JD
QjJfSElfQ0ZHLCAweDAxMzAsIDB4MDAwMjAwMDIKK05WX1NJX1JPX0JPQVJEX1MxX1JDQjNfTE9f
Q0ZHLCAweDAxMzgsIDB4MDAwMjAwMDIKK05WX1NJX1JPX0JPQVJEX1MxX1JDQjNfSElfQ0ZHLCAw
eDAxNDAsIDB4MDAwMjAwMDIKK05WX1NJX1JPX0JPQVJEX1RfTFRMTV9ERUxUQV9QMCwgMHgwMTQ4
LCAweDAwMDAwMDAxCitOVl9TSV9ST19CT0FSRF9UX0xUTE1fREVMVEFfUDEsIDB4MDE1MCwgMHgw
MDAwMDAwMgorTlZfU0lfUk9fQk9BUkRfVF9MVExNX0RFTFRBX1AyLCAweDAxNTgsIDB4MDAwMDAw
MDMKK05WX1NJX1JPX0JPQVJEX1RfTFRMTV9ERUxUQV9QMywgMHgwMTYwLCAweDAwMDAwMDA0CitO
Vl9TSV9ST19CT0FSRF9UX0xUTE1fREVMVEFfTTEsIDB4MDE2OCwgMHhGRkZGRkZGRgorTlZfU0lf
Uk9fQk9BUkRfVF9MVExNX0RFTFRBX00yLCAweDAxNzAsIDB4RkZGRkZGRkUKK05WX1NJX1JPX0JP
QVJEX1RfTFRMTV9ERUxUQV9NMywgMHgwMTc4LCAweEZGRkZGRkZECitOVl9TSV9ST19CT0FSRF9Q
X0xNX1BJRF9QLCAweDAxODAsIDB4MDAwMDAwMDAKK05WX1NJX1JPX0JPQVJEX1BfTE1fUElEX0ks
IDB4MDE4OCwgMHgwMDAwMDAwMAorTlZfU0lfUk9fQk9BUkRfUF9MTV9QSURfSV9MX1RIT0xELCAw
eDAxOTAsIDB4MDAwMDAwMDAKK05WX1NJX1JPX0JPQVJEX1BfTE1fUElEX0lfSF9USE9MRCwgMHgw
MTk4LCAweDAwMDAwMDAwCitOVl9TSV9ST19CT0FSRF9QX0xNX1BJRF9ELCAweDAxQTAsIDB4MDAw
MDAwMDAKK05WX1NJX1JPX0JPQVJEX1BfTE1fRVhQX1NNT09USF9DT05TVCwgMHgwMUE4LCAweDAw
MDAwMDAwCitOVl9TSV9ST19CT0FSRF9UUE1fQUxHX0lELCAweDAxQjAsIDB4MDAwMDAwMDIKK05W
X1NJX1JPX0JPQVJEX0REUl9TUEVFRF9HUkFERSwgMHgwMUI4LCAweDAwMDAwQzgwCitOVl9TSV9S
T19CT0FSRF9ERFJfUzBfUlRUX1dSLCAweDAxQzAsIDB4MDAwMjAwMDAKK05WX1NJX1JPX0JPQVJE
X0REUl9TMV9SVFRfV1IsIDB4MDFDOCwgMHgwMDAyMDAwMAorTlZfU0lfUk9fQk9BUkRfRERSX1Mw
X1JUVF9OT00sIDB4MDFEMCwgMHhGRjA2MDE3NworTlZfU0lfUk9fQk9BUkRfRERSX1MxX1JUVF9O
T00sIDB4MDFEOCwgMHhGRjA2MDE3NworTlZfU0lfUk9fQk9BUkRfRERSX1MwX1JUVF9QQVJLLCAw
eDAxRTAsIDB4MDAwNjAwNzAKK05WX1NJX1JPX0JPQVJEX0REUl9TMV9SVFRfUEFSSywgMHgwMUU4
LCAweDAwMDYwMDcwCitOVl9TSV9ST19CT0FSRF9ERFJfQ1MwX1JET0RUX01BU0tfMURQQywgMHgw
MUYwLCAweDAwMDAwMDAwCitOVl9TSV9ST19CT0FSRF9ERFJfQ1MxX1JET0RUX01BU0tfMURQQywg
MHgwMUY4LCAweDAwMDAwMDAwCitOVl9TSV9ST19CT0FSRF9ERFJfQ1MyX1JET0RUX01BU0tfMURQ
QywgMHgwMjAwLCAweDAwMDAwMDAwCitOVl9TSV9ST19CT0FSRF9ERFJfQ1MzX1JET0RUX01BU0tf
MURQQywgMHgwMjA4LCAweDAwMDAwMDAwCitOVl9TSV9ST19CT0FSRF9ERFJfQ1MwX1JET0RUX01B
U0tfMkRQQywgMHgwMjEwLCAweDAwMEMwQ0NDCitOVl9TSV9ST19CT0FSRF9ERFJfQ1MxX1JET0RU
X01BU0tfMkRQQywgMHgwMjE4LCAweDAwMEMwQ0NDCitOVl9TSV9ST19CT0FSRF9ERFJfQ1MyX1JE
T0RUX01BU0tfMkRQQywgMHgwMjIwLCAweDAwMDMwMzMzCitOVl9TSV9ST19CT0FSRF9ERFJfQ1Mz
X1JET0RUX01BU0tfMkRQQywgMHgwMjI4LCAweDAwMDMwMzMzCitOVl9TSV9ST19CT0FSRF9ERFJf
Q1MwX1dST0RUX01BU0tfMURQQywgMHgwMjMwLCAweDAwMDMwMzMzCitOVl9TSV9ST19CT0FSRF9E
RFJfQ1MxX1dST0RUX01BU0tfMURQQywgMHgwMjM4LCAweDAwMDMwMzMzCitOVl9TSV9ST19CT0FS
RF9ERFJfQ1MyX1dST0RUX01BU0tfMURQQywgMHgwMjQwLCAweDAwMDMwMzMzCitOVl9TSV9ST19C
T0FSRF9ERFJfQ1MzX1dST0RUX01BU0tfMURQQywgMHgwMjQ4LCAweDAwMDMwMzMzCitOVl9TSV9S
T19CT0FSRF9ERFJfQ1MwX1dST0RUX01BU0tfMkRQQywgMHgwMjUwLCAweDAwMEVERUVECitOVl9T
SV9ST19CT0FSRF9ERFJfQ1MxX1dST0RUX01BU0tfMkRQQywgMHgwMjU4LCAweDAwMERFRERFCitO
Vl9TSV9ST19CT0FSRF9ERFJfQ1MyX1dST0RUX01BU0tfMkRQQywgMHgwMjYwLCAweDAwMEI3QkI3
CitOVl9TSV9ST19CT0FSRF9ERFJfQ1MzX1dST0RUX01BU0tfMkRQQywgMHgwMjY4LCAweDAwMDdC
NzdCCitOVl9TSV9ST19CT0FSRF9ERFJfUEhZX1RFUk1fRFFfQ1RSTF8xRFBDLCAweDAyNzAsIDB4
MDAwMDAwMDUKK05WX1NJX1JPX0JPQVJEX0REUl9QSFlfVEVSTV9EUV9WQUxfMURQQywgMHgwMjc4
LCAweDAwOTBERDkwCitOVl9TSV9ST19CT0FSRF9ERFJfUEhZX1RFUk1fRFFTX0NUUkxfMURQQywg
MHgwMjgwLCAweDAwMDAwMDA1CitOVl9TSV9ST19CT0FSRF9ERFJfUEhZX1RFUk1fRFFTX1ZBTF8x
RFBDLCAweDAyODgsIDB4MDA5MEREOTAKK05WX1NJX1JPX0JPQVJEX0REUl9QSFlfVEVSTV9EUV9D
VFJMXzJEUEMsIDB4MDI5MCwgMHgwMDAwMDAwNQorTlZfU0lfUk9fQk9BUkRfRERSX1BIWV9URVJN
X0RRX1ZBTF8yRFBDLCAweDAyOTgsIDB4MDA5MEREOTAKK05WX1NJX1JPX0JPQVJEX0REUl9QSFlf
VEVSTV9EUVNfQ1RSTF8yRFBDLCAweDAyQTAsIDB4MDAwMDAwMDUKK05WX1NJX1JPX0JPQVJEX0RE
Ul9QSFlfVEVSTV9EUVNfVkFMXzJEUEMsIDB4MDJBOCwgMHgwMDkwREQ5MAorTlZfU0lfUk9fQk9B
UkRfRERSX1BIWV9WUkVGRFFfUkFOR0VfVkFMXzFEUEMsIDB4MDJCMCwgMHgwMDAwMDAyNAorTlZf
U0lfUk9fQk9BUkRfRERSX0RSQU1fVlJFRkRRX1JBTkdFX1ZBTF8xRFBDLCAweDAyQjgsIDB4MDAw
MDAwMUEKK05WX1NJX1JPX0JPQVJEX0REUl9QSFlfVlJFRkRRX1JBTkdFX1ZBTF8yRFBDLCAweDAy
QzAsIDB4MDAwMDAwNTAKK05WX1NJX1JPX0JPQVJEX0REUl9EUkFNX1ZSRUZEUV9SQU5HRV9WQUxf
MkRQQywgMHgwMkM4LCAweDAwMDAwMDIwCitOVl9TSV9ST19CT0FSRF9ERFJfQ0xLX1dSRFFfRExZ
X0RFRkFVTFQsIDB4MDJEMCwgMHgwMjgwMDI4MAorTlZfU0lfUk9fQk9BUkRfRERSX1JERFFTX0RR
X0RMWV9ERUZBVUxULCAweDAyRDgsIDB4OTA5MDkwOTAKK05WX1NJX1JPX0JPQVJEX0REUl9XUkRR
U19TSElGVF9ERUZBVUxULCAweDAyRTAsIDB4MDAwMDAwMDAKK05WX1NJX1JPX0JPQVJEX0REUl9B
RENNRF9ETFlfREVGQVVMVCwgMHgwMkU4LCAweDAwQzAwMEMwCitOVl9TSV9ST19CT0FSRF9ERFJf
Q0xLX1dSRFFfRExZX0FESiwgMHgwMkYwLCAweDAwMDAwMDAwCitOVl9TSV9ST19CT0FSRF9ERFJf
UkREUVNfRFFfRExZX0FESiwgMHgwMkY4LCAweDAwMDAwMDAwCitOVl9TSV9ST19CT0FSRF9ERFJf
UEhZX1ZSRUZfQURKLCAweDAzMDAsIDB4MDAwMDAwMDAKK05WX1NJX1JPX0JPQVJEX0REUl9EUkFN
X1ZSRUZfQURKLCAweDAzMDgsIDB4MDAwMDAwMDAKK05WX1NJX1JPX0JPQVJEX0REUl9XUl9QUkVB
TUJMRV9DWUNMRSwgMHgwMzEwLCAweDAyMDEwMjAxCitOVl9TSV9ST19CT0FSRF9ERFJfQURDTURf
MlRfTU9ERSwgMHgwMzE4LCAweDAwMDAwMDAwCitOVl9TSV9ST19CT0FSRF9JMkNfVlJEX0NPTkZJ
R19JTkZPLCAweDAzMjAsIDB4MDAwMDAwMDAKK05WX1NJX1JPX0JPQVJEX0REUl9QSFlfRkVBVFVS
RV9DVFJMLCAweDAzMjgsIDB4MDAwMDAwMDAKK05WX1NJX1JPX0JPQVJEX0JNQ19IQU5EU0hBS0Vf
U1BJX0FDQ0VTUywgMHgwMzMwLCAweDAxMDUwMTA2CitOVl9TSV9ST19CT0FSRF9ESU1NX1RFTVBf
VEhSRVNIT0xELCAweDAzMzgsIDB4MDAwMDA1RjQKK05WX1NJX1JPX0JPQVJEX0RJTU1fU1BEX0NP
TVBBUkVfRElTQUJMRSwgMHgwMzQwLCAweDAwMDAwMDAwCitOVl9TSV9ST19CT0FSRF9TMF9QQ0lF
X0NMS19DRkcsIDB4MDM0OCwgMHgwMDAwMDAwMAorTlZfU0lfUk9fQk9BUkRfUzBfUkNBNF9DRkcs
IDB4MDM1MCwgMHgwMjAyMDIwMgorTlZfU0lfUk9fQk9BUkRfUzBfUkNBNV9DRkcsIDB4MDM1OCwg
MHgwMjAyMDIwMgorTlZfU0lfUk9fQk9BUkRfUzBfUkNBNl9DRkcsIDB4MDM2MCwgMHgwMjAyMDIw
MgorTlZfU0lfUk9fQk9BUkRfUzBfUkNBN19DRkcsIDB4MDM2OCwgMHgwMjAyMDAwMworTlZfU0lf
Uk9fQk9BUkRfUzBfUkNBMF9UWFJYX0czUFJFU0VULCAweDAzNzAsIDB4MDAwMDAwMDAKK05WX1NJ
X1JPX0JPQVJEX1MwX1JDQTFfVFhSWF9HM1BSRVNFVCwgMHgwMzc4LCAweDAwMDAwMDAwCitOVl9T
SV9ST19CT0FSRF9TMF9SQ0EyX1RYUlhfRzNQUkVTRVQsIDB4MDM4MCwgMHgwMDAwMDAwMAorTlZf
U0lfUk9fQk9BUkRfUzBfUkNBM19UWFJYX0czUFJFU0VULCAweDAzODgsIDB4MDAwMDAwMDAKK05W
X1NJX1JPX0JPQVJEX1MwX1JDQjBBX1RYUlhfRzNQUkVTRVQsIDB4MDM5MCwgMHgwMDAwMDAwMAor
TlZfU0lfUk9fQk9BUkRfUzBfUkNCMEJfVFhSWF9HM1BSRVNFVCwgMHgwMzk4LCAweDAwMDAwMDAw
CitOVl9TSV9ST19CT0FSRF9TMF9SQ0IxQV9UWFJYX0czUFJFU0VULCAweDAzQTAsIDB4MDAwMDAw
MDAKK05WX1NJX1JPX0JPQVJEX1MwX1JDQjFCX1RYUlhfRzNQUkVTRVQsIDB4MDNBOCwgMHgwMDAw
MDAwMAorTlZfU0lfUk9fQk9BUkRfUzBfUkNCMkFfVFhSWF9HM1BSRVNFVCwgMHgwM0IwLCAweDAw
MDAwMDAwCitOVl9TSV9ST19CT0FSRF9TMF9SQ0IyQl9UWFJYX0czUFJFU0VULCAweDAzQjgsIDB4
MDAwMDAwMDAKK05WX1NJX1JPX0JPQVJEX1MwX1JDQjNBX1RYUlhfRzNQUkVTRVQsIDB4MDNDMCwg
MHgwMDAwMDAwMAorTlZfU0lfUk9fQk9BUkRfUzBfUkNCM0JfVFhSWF9HM1BSRVNFVCwgMHgwM0M4
LCAweDAwMDAwMDAwCitOVl9TSV9ST19CT0FSRF9TMF9SQ0E0X1RYUlhfRzNQUkVTRVQsIDB4MDNE
MCwgMHgwMDAwMDAwMAorTlZfU0lfUk9fQk9BUkRfUzBfUkNBNV9UWFJYX0czUFJFU0VULCAweDAz
RDgsIDB4MDAwMDAwMDAKK05WX1NJX1JPX0JPQVJEX1MwX1JDQTZfVFhSWF9HM1BSRVNFVCwgMHgw
M0UwLCAweDAwMDAwMDAwCitOVl9TSV9ST19CT0FSRF9TMF9SQ0E3X1RYUlhfRzNQUkVTRVQsIDB4
MDNFOCwgMHgwMDAwMDAwMAorTlZfU0lfUk9fQk9BUkRfUzBfUkNBMF9UWFJYX0c0UFJFU0VULCAw
eDAzRjAsIDB4NTc1NzU3NTcKK05WX1NJX1JPX0JPQVJEX1MwX1JDQTFfVFhSWF9HNFBSRVNFVCwg
MHgwM0Y4LCAweDU3NTc1NzU3CitOVl9TSV9ST19CT0FSRF9TMF9SQ0EyX1RYUlhfRzRQUkVTRVQs
IDB4MDQwMCwgMHg1NzU3NTc1NworTlZfU0lfUk9fQk9BUkRfUzBfUkNBM19UWFJYX0c0UFJFU0VU
LCAweDA0MDgsIDB4NTc1NzU3NTcKK05WX1NJX1JPX0JPQVJEX1MwX1JDQjBBX1RYUlhfRzRQUkVT
RVQsIDB4MDQxMCwgMHg1NzU3NTc1NworTlZfU0lfUk9fQk9BUkRfUzBfUkNCMEJfVFhSWF9HNFBS
RVNFVCwgMHgwNDE4LCAweDU3NTc1NzU3CitOVl9TSV9ST19CT0FSRF9TMF9SQ0IxQV9UWFJYX0c0
UFJFU0VULCAweDA0MjAsIDB4NTc1NzU3NTcKK05WX1NJX1JPX0JPQVJEX1MwX1JDQjFCX1RYUlhf
RzRQUkVTRVQsIDB4MDQyOCwgMHg1NzU3NTc1NworTlZfU0lfUk9fQk9BUkRfUzBfUkNCMkFfVFhS
WF9HNFBSRVNFVCwgMHgwNDMwLCAweDU3NTc1NzU3CitOVl9TSV9ST19CT0FSRF9TMF9SQ0IyQl9U
WFJYX0c0UFJFU0VULCAweDA0MzgsIDB4NTc1NzU3NTcKK05WX1NJX1JPX0JPQVJEX1MwX1JDQjNB
X1RYUlhfRzRQUkVTRVQsIDB4MDQ0MCwgMHg1NzU3NTc1NworTlZfU0lfUk9fQk9BUkRfUzBfUkNC
M0JfVFhSWF9HNFBSRVNFVCwgMHgwNDQ4LCAweDU3NTc1NzU3CitOVl9TSV9ST19CT0FSRF9TMF9S
Q0E0X1RYUlhfRzRQUkVTRVQsIDB4MDQ1MCwgMHg1NzU3NTc1NworTlZfU0lfUk9fQk9BUkRfUzBf
UkNBNV9UWFJYX0c0UFJFU0VULCAweDA0NTgsIDB4NTc1NzU3NTcKK05WX1NJX1JPX0JPQVJEX1Mw
X1JDQTZfVFhSWF9HNFBSRVNFVCwgMHgwNDYwLCAweDU3NTc1NzU3CitOVl9TSV9ST19CT0FSRF9T
MF9SQ0E3X1RYUlhfRzRQUkVTRVQsIDB4MDQ2OCwgMHg1NzU3NTc1NworTlZfU0lfUk9fQk9BUkRf
UzFfUENJRV9DTEtfQ0ZHLCAweDA0NzAsIDB4MDAwMDAwMDAKK05WX1NJX1JPX0JPQVJEX1MxX1JD
QTRfQ0ZHLCAweDA0NzgsIDB4MDIwMjAyMDIKK05WX1NJX1JPX0JPQVJEX1MxX1JDQTVfQ0ZHLCAw
eDA0ODAsIDB4MDIwMjAyMDIKK05WX1NJX1JPX0JPQVJEX1MxX1JDQTZfQ0ZHLCAweDA0ODgsIDB4
MDIwMjAyMDIKK05WX1NJX1JPX0JPQVJEX1MxX1JDQTdfQ0ZHLCAweDA0OTAsIDB4MDIwMjAwMDMK
K05WX1NJX1JPX0JPQVJEX1MxX1JDQTJfVFhSWF9HM1BSRVNFVCwgMHgwNDk4LCAweDAwMDAwMDAw
CitOVl9TSV9ST19CT0FSRF9TMV9SQ0EzX1RYUlhfRzNQUkVTRVQsIDB4MDRBMCwgMHgwMDAwMDAw
MAorTlZfU0lfUk9fQk9BUkRfUzFfUkNCMEFfVFhSWF9HM1BSRVNFVCwgMHgwNEE4LCAweDAwMDAw
MDAwCitOVl9TSV9ST19CT0FSRF9TMV9SQ0IwQl9UWFJYX0czUFJFU0VULCAweDA0QjAsIDB4MDAw
MDAwMDAKK05WX1NJX1JPX0JPQVJEX1MxX1JDQjFBX1RYUlhfRzNQUkVTRVQsIDB4MDRCOCwgMHgw
MDAwMDAwMAorTlZfU0lfUk9fQk9BUkRfUzFfUkNCMUJfVFhSWF9HM1BSRVNFVCwgMHgwNEMwLCAw
eDAwMDAwMDAwCitOVl9TSV9ST19CT0FSRF9TMV9SQ0IyQV9UWFJYX0czUFJFU0VULCAweDA0Qzgs
IDB4MDAwMDAwMDAKK05WX1NJX1JPX0JPQVJEX1MxX1JDQjJCX1RYUlhfRzNQUkVTRVQsIDB4MDRE
MCwgMHgwMDAwMDAwMAorTlZfU0lfUk9fQk9BUkRfUzFfUkNCM0FfVFhSWF9HM1BSRVNFVCwgMHgw
NEQ4LCAweDAwMDAwMDAwCitOVl9TSV9ST19CT0FSRF9TMV9SQ0IzQl9UWFJYX0czUFJFU0VULCAw
eDA0RTAsIDB4MDAwMDAwMDAKK05WX1NJX1JPX0JPQVJEX1MxX1JDQTRfVFhSWF9HM1BSRVNFVCwg
MHgwNEU4LCAweDAwMDAwMDAwCitOVl9TSV9ST19CT0FSRF9TMV9SQ0E1X1RYUlhfRzNQUkVTRVQs
IDB4MDRGMCwgMHgwMDAwMDAwMAorTlZfU0lfUk9fQk9BUkRfUzFfUkNBNl9UWFJYX0czUFJFU0VU
LCAweDA0RjgsIDB4MDAwMDAwMDAKK05WX1NJX1JPX0JPQVJEX1MxX1JDQTdfVFhSWF9HM1BSRVNF
VCwgMHgwNTAwLCAweDAwMDAwMDAwCitOVl9TSV9ST19CT0FSRF9TMV9SQ0EyX1RYUlhfRzRQUkVT
RVQsIDB4MDUwOCwgMHg1NzU3NTc1NworTlZfU0lfUk9fQk9BUkRfUzFfUkNBM19UWFJYX0c0UFJF
U0VULCAweDA1MTAsIDB4NTc1NzU3NTcKK05WX1NJX1JPX0JPQVJEX1MxX1JDQjBBX1RYUlhfRzRQ
UkVTRVQsIDB4MDUxOCwgMHg1NzU3NTc1NworTlZfU0lfUk9fQk9BUkRfUzFfUkNCMEJfVFhSWF9H
NFBSRVNFVCwgMHgwNTIwLCAweDU3NTc1NzU3CitOVl9TSV9ST19CT0FSRF9TMV9SQ0IxQV9UWFJY
X0c0UFJFU0VULCAweDA1MjgsIDB4NTc1NzU3NTcKK05WX1NJX1JPX0JPQVJEX1MxX1JDQjFCX1RY
UlhfRzRQUkVTRVQsIDB4MDUzMCwgMHg1NzU3NTc1NworTlZfU0lfUk9fQk9BUkRfUzFfUkNCMkFf
VFhSWF9HNFBSRVNFVCwgMHgwNTM4LCAweDU3NTc1NzU3CitOVl9TSV9ST19CT0FSRF9TMV9SQ0Iy
Ql9UWFJYX0c0UFJFU0VULCAweDA1NDAsIDB4NTc1NzU3NTcKK05WX1NJX1JPX0JPQVJEX1MxX1JD
QjNBX1RYUlhfRzRQUkVTRVQsIDB4MDU0OCwgMHg1NzU3NTc1NworTlZfU0lfUk9fQk9BUkRfUzFf
UkNCM0JfVFhSWF9HNFBSRVNFVCwgMHgwNTUwLCAweDU3NTc1NzU3CitOVl9TSV9ST19CT0FSRF9T
MV9SQ0E0X1RYUlhfRzRQUkVTRVQsIDB4MDU1OCwgMHg1NzU3NTc1NworTlZfU0lfUk9fQk9BUkRf
UzFfUkNBNV9UWFJYX0c0UFJFU0VULCAweDA1NjAsIDB4NTc1NzU3NTcKK05WX1NJX1JPX0JPQVJE
X1MxX1JDQTZfVFhSWF9HNFBSRVNFVCwgMHgwNTY4LCAweDU3NTc1NzU3CitOVl9TSV9ST19CT0FS
RF9TMV9SQ0E3X1RYUlhfRzRQUkVTRVQsIDB4MDU3MCwgMHg1NzU3NTc1NworTlZfU0lfUk9fQk9B
UkRfMlBfQ0VfTUFTS19USFJFU0hPTEQsIDB4MDU3OCwgMHgwMDAwMDAwMworTlZfU0lfUk9fQk9B
UkRfMlBfQ0VfTUFTS19JTlRFUlZBTCwgMHgwNTgwLCAweDAwMDAwMUE0CitOVl9TSV9ST19CT0FS
RF9TWF9QSFlfQ0ZHX1NFVFRJTkcsIDB4MDU4OCwgMHgwMDAwMDAwMAorTlZfU0lfUk9fQk9BUkRf
RERSX1BIWV9EQ19DTEssIDB4MDU5MCwgMHgwMDAxODAwMAorTlZfU0lfUk9fQk9BUkRfRERSX1BI
WV9EQ19EQVRBLCAweDA1OTgsIDB4ODAwMTgwMDAKK05WX1NJX1JPX0JPQVJEX1NYX1JDQTBfVFhS
WF8yMEdQUkVTRVQsIDB4MDVBMCwgMHgwMDAwMDAwMAorTlZfU0lfUk9fQk9BUkRfU1hfUkNBMV9U
WFJYXzIwR1BSRVNFVCwgMHgwNUE4LCAweDAwMDAwMDAwCitOVl9TSV9ST19CT0FSRF9TWF9SQ0Ey
X1RYUlhfMjBHUFJFU0VULCAweDA1QjAsIDB4MDAwMDAwMDAKK05WX1NJX1JPX0JPQVJEX1NYX1JD
QTNfVFhSWF8yMEdQUkVTRVQsIDB4MDVCOCwgMHgwMDAwMDAwMAorTlZfU0lfUk9fQk9BUkRfU1hf
UkNBMF9UWFJYXzI1R1BSRVNFVCwgMHgwNUMwLCAweDAwMDAwMDAwCitOVl9TSV9ST19CT0FSRF9T
WF9SQ0ExX1RYUlhfMjVHUFJFU0VULCAweDA1QzgsIDB4MDAwMDAwMDAKK05WX1NJX1JPX0JPQVJE
X1NYX1JDQTJfVFhSWF8yNUdQUkVTRVQsIDB4MDVEMCwgMHgwMDAwMDAwMAorTlZfU0lfUk9fQk9B
UkRfU1hfUkNBM19UWFJYXzI1R1BSRVNFVCwgMHgwNUQ4LCAweDAwMDAwMDAwCitOVl9TSV9ST19C
T0FSRF9ERFJfMlhfUkVGUkVTSF9URU1QX1RIUkVTSE9MRCwgMHgwNUUwLCAweDAwNTUwMDU1CitO
Vl9TSV9ST19CT0FSRF9QQ1BfVlJEX1ZPVVRfV0FJVF9VUywgMHgwNUU4LCAweDAwMDAwMDY0CitO
Vl9TSV9ST19CT0FSRF9QQ1BfVlJEX1ZPVVRfUkVTT0xVVElPTl9NViwgMHgwNUYwLCAweDAwMDAw
MDA1CitOVl9TSV9ST19CT0FSRF9EVkZTX1ZPTFRfUkVBRF9CQUNLX0VOLCAweDA1RjgsIDB4MDAw
MDAwMDEKK05WX1NJX1JPX0JPQVJEX0RWRlNfVk9MVF9SRUFEX0JBQ0tfVElNRSwgMHgwNjAwLCAw
eDAwMDAwMDAyCitOVl9TSV9ST19CT0FSRF9EVkZTX1ZPVVRfMjBNVl9SQU1QX1RJTUVfVVMsIDB4
MDYwOCwgMHgwMDAwMDAwNQorTlZfU0lfUk9fQk9BUkRfUENJRV9BRVJfRldfRklSU1QsIDB4MDYx
MCwgMHgwMDAwMDAwMAorTlZfU0lfUk9fQk9BUkRfUlRDX0dQSV9MT0NLX0JZUEFTUywgMHgwNjE4
LCAweDAwMDAwMDAwCitOVl9TSV9ST19CT0FSRF9UUE1fRElTQUJMRSwgMHgwNjIwLCAweDAwMDAw
MDAwCitOVl9TSV9ST19CT0FSRF9NRVNIX1MwX0NYR19SQ19TVFJPTkdfT1JERVJJTkdfRU4sIDB4
MDYyOCwgMHgwMDAwMDAwMAorTlZfU0lfUk9fQk9BUkRfTUVTSF9TMV9DWEdfUkNfU1RST05HX09S
REVSSU5HX0VOLCAweDA2MzAsIDB4MDAwMDAwMDAKK05WX1NJX1JPX0JPQVJEX0dQSU9fU1dfV0FU
Q0hET0dfRU4sIDB4MDYzOCwgMHgwMDAwMDAwMAo8L3ByZT4KICAgICAgPC9ibG9ja3F1b3RlPgog
ICAgICA8cHJlIGNsYXNzPSJtb3otcXVvdGUtcHJlIiB3cmFwPSIiPgpUaGVyZSB3YXMgYWxzbyBh
IGZldyB0aGluZ3MgaW4gdGhpcyBwYXRjaCB3aGVyZSBJIGZlbHQgbmFtZXMgaGFkCmluc3VmZmlj
aWVudCBuYW1lc3BhY2UgLSBzdWNoIGFzIHN0YXJ0aW5nIHdpdGggVFJOR18gb3IgTlZfLgpJJ20g
bm90IGdvaW5nIHRvIGluc2lzdCBvbiBhZGRpbmcgcHJlZml4ZXMgdG8gdGhvc2UsIEknbSBqdXN0
IGdvaW5nIHRvCnNheSBJIGhhdmUgd2FybmVkIHlvdSwgYW5kIHRob3NlIG1pZ2h0IGdldCB5b3Ug
aW4gdHJvdWJsZSBpbiB0aGUKZnV0dXJlIDopCgpCZXN0IFJlZ2FyZHMsCgpMZWlmCjwvcHJlPgog
ICAgPC9ibG9ja3F1b3RlPgogIDwvYm9keT4KPC9odG1sPgo=

--------------4BF9D6D8EBC1A676687FE92C--