Received: by 2002:a05:6358:9144:b0:117:f937:c515 with SMTP id r4csp1942471rwr; Fri, 21 Apr 2023 01:43:37 -0700 (PDT) X-Google-Smtp-Source: AKy350b9xzDT/sXCGca2FDUQ4aFd0EeeO2kMOHXgvrKVCgGI1i71gdYxm1CxlOqbsIEi4o9WoOre X-Received: by 2002:a17:903:2012:b0:1a2:6257:36b9 with SMTP id s18-20020a170903201200b001a2625736b9mr3820036pla.31.1682066616831; Fri, 21 Apr 2023 01:43:36 -0700 (PDT) ARC-Seal: i=2; a=rsa-sha256; t=1682066616; cv=pass; d=google.com; s=arc-20160816; b=IKGhgiqKNsTyo1PTs7rzZsc/6CdYh9ia8ux3hjCCX6xeiB42M3DwENIRV9MJm8IEB9 +XObJMNH1DPLd5+22OM4gNsX94GHjdS4zU8gy5KZtV0NEj+ZhaouFC4lIuHjSCaCK7op MFQNCrT3S0fFJ4fmtRFdHz8YNbkrhFBRC1iS5rEWso4DWnZYamWm5w8AheYXDheMq+WW 0Bgvf4W5kkevLnMwnM6hMlC7G6d1RO9ukO9kuEpN/Qb5NZik+fYkLuS7F1dFJ1TSZ56h 148KQUgWHnMtpQuLO1OKSxbdtoNGVCr+tzuov7wdgezLWzte9k+Ujt3c3QCKJ2KURhDX eMVg== ARC-Message-Signature: i=2; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:mime-version:content-transfer-encoding :content-id:content-language:accept-language:in-reply-to:references :message-id:date:thread-index:thread-topic:subject:cc:to:from :dkim-signature; bh=TXOG6R6/Y94Xr88AcrnVr0Zyk8xvbxBh53jLuIg/PQo=; b=09FE5zWLpikWClfcMFBmhO1qnAbI7YEFIrV2PH8kKSjmwbR4YFKXAodCpsT2FZ1isO Fyd5GG4EbvVMYS8Xr9eLwGtkAIDBohRB+Zuykza0kBVQC4iayUcXBSDc6qOy0vkbxood YvodJYt+HimQevdy0yad1EzHs+PDzfR4n58sVSbRfSXi80av478Z4pwqKmss/ZwSAZ54 tgxfTSIK4+Ok7JoDBUau18vcQlKadxeo1PWqGvq54OVqcUyPCGHg9nYzzHtFNEEsYXGl VApf4SmDQIm43mGtI9oarcWK6f60RQqvLrRy5+Ri2k4+iuSngOaJSVj/LVSRVBFNInVU 9SgA== ARC-Authentication-Results: i=2; mx.google.com; dkim=pass header.i=@epam.com header.s=selector2 header.b=cetyitKr; arc=pass (i=1 spf=pass spfdomain=epam.com dkim=pass dkdomain=epam.com dmarc=pass fromdomain=epam.com); spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=QUARANTINE sp=QUARANTINE dis=NONE) header.from=epam.com Return-Path: Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id jl17-20020a170903135100b001a6386f39bfsi3636518plb.186.2023.04.21.01.43.25; Fri, 21 Apr 2023 01:43:36 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) client-ip=2620:137:e000::1:20; Authentication-Results: mx.google.com; dkim=pass header.i=@epam.com header.s=selector2 header.b=cetyitKr; arc=pass (i=1 spf=pass spfdomain=epam.com dkim=pass dkdomain=epam.com dmarc=pass fromdomain=epam.com); spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=QUARANTINE sp=QUARANTINE dis=NONE) header.from=epam.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S231234AbjDUIlV (ORCPT + 99 others); Fri, 21 Apr 2023 04:41:21 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:33686 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231285AbjDUIlN (ORCPT ); Fri, 21 Apr 2023 04:41:13 -0400 Received: from mx0b-0039f301.pphosted.com (mx0b-0039f301.pphosted.com [148.163.137.242]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 58DA1A258; Fri, 21 Apr 2023 01:41:06 -0700 (PDT) Received: from pps.filterd (m0174682.ppops.net [127.0.0.1]) by mx0b-0039f301.pphosted.com (8.17.1.19/8.17.1.19) with ESMTP id 33L7QPSg007684; Fri, 21 Apr 2023 08:40:52 GMT Received: from eur02-vi1-obe.outbound.protection.outlook.com (mail-vi1eur02lp2048.outbound.protection.outlook.com [104.47.11.48]) by mx0b-0039f301.pphosted.com (PPS) with ESMTPS id 3q3p3fg8ef-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Fri, 21 Apr 2023 08:40:51 +0000 ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=dsmBunaJ8vPQi6UPYmNTzwqEjWxL3RgG7XPitDAC2BtANEBBb6N5Xy7zqhhBlhdR4vw/2Bq9TzDQBNn1b5CiQr7+3bKcyliXsIn16WpRJ34izvXGByEHqJNU/TCxLcTR6MsK5KCV9iv/7sxwdN52o17wQXX/Mwb7pXIq3KNH3IKuYDhdTeV2Kh9C4BXrKuKrCIWoYTEWDmVvGnkLxA7skRVEdZ45ecLtPf6EufiDy0yuCxBOuR4jgbHCfOA/idsBGPAUq8ZL+DILSNtSULELySyBwfcxR7dRmyPNLEboOeqoYDR9JXSaMYDf/2RZv89fECSBs0peno9dpSxdMlRDKw== 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-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=TXOG6R6/Y94Xr88AcrnVr0Zyk8xvbxBh53jLuIg/PQo=; b=ncyJ2ajCrL5JqmzAAkIUHXgPALTEyjBlyTWH4z2CQAV8lzT8C5YuGLk+993WcKBBiMeaXdStxAW0h6vjwTSdfYhRjCtLUydjzqyWi5pZXaopdJWdSBTWEdygTJ9mzn2vtQHPAOPvb50vIPmav+aMipM0nNYXWDpUz/62HuXPYu01I+sq2ckM59/BacNV+9784wOEIrMuB6n+rhDvWPztPXePqzT2VW3nUUImCGrLesQYzazUa8+1gnPqm52Yl9+PH8orcn26Z2EiSKKq3HwQw1dEdetgL/VXO6b0MXt+RXq+Vh4XKG/M4/cXmqx+sHiuqRjXsg/S8ud2NFNIeQIV4Q== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=epam.com; dmarc=pass action=none header.from=epam.com; dkim=pass header.d=epam.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=epam.com; s=selector2; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=TXOG6R6/Y94Xr88AcrnVr0Zyk8xvbxBh53jLuIg/PQo=; b=cetyitKrsVIR2uMkMZWbDeN82zAf78/86uU737RNxr0ZZafvcqK19VCk0Kw18HecjzqlgS/n+C0aDzYryhL8l/hHFBnU0YtC8HEh+ZiVFAk6Fo2/JDBK9tCoFIIyoOQ4o5OBB4SunCgGEjb9LhOQhKvaANXrR195zuZx2cgKJOy+jv8RWKE9sGIxorXL001bvfcnD2Fl+/azBi8xSg85ZBagIlLYxHQnNsBD1t7HDFN7FiytY8QXxinQOpxoUoRLBWlg3dGmzHTAiGJ/7UCi4ZFWaGqv3k6ODZ59CD/hUxBgZtsLZhM3VPHkYOpDOzjt1g8ca2ARwQteeVOJnP7Z9Q== Received: from PA4PR03MB7136.eurprd03.prod.outlook.com (2603:10a6:102:ea::23) by DBAPR03MB6405.eurprd03.prod.outlook.com (2603:10a6:10:199::22) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.6298.45; Fri, 21 Apr 2023 08:40:47 +0000 Received: from PA4PR03MB7136.eurprd03.prod.outlook.com ([fe80::bcf5:cd14:fd35:1300]) by PA4PR03MB7136.eurprd03.prod.outlook.com ([fe80::bcf5:cd14:fd35:1300%9]) with mapi id 15.20.6298.045; Fri, 21 Apr 2023 08:40:47 +0000 From: Oleksii Moisieiev To: Peng Fan , Cristian Marussi CC: "sudeep.holla@arm.com" , Linus Walleij , "linux-kernel@vger.kernel.org" , "linux-arm-kernel@lists.infradead.org" , "linux-gpio@vger.kernel.org" , "michal.simek@amd.com" , "vincent.guittot@linaro.org" , "souvik.chakravarty@arm.com" Subject: Re: [RFC v1 1/2] scmi: Introduce pinctrl SCMI protocol driver Thread-Topic: [RFC v1 1/2] scmi: Introduce pinctrl SCMI protocol driver Thread-Index: AQHZaTpLwL07BD9460y7/F64OnMs/q8oQvCAgAaar4CABqnaAA== Date: Fri, 21 Apr 2023 08:40:47 +0000 Message-ID: References: <54119b2cb43e29f69c5858a5320d3a58f23fed21.1680793130.git.oleksii_moisieiev@epam.com> <6dc456ff-7fc6-3b73-3727-dd048e9a9629@oss.nxp.com> In-Reply-To: <6dc456ff-7fc6-3b73-3727-dd048e9a9629@oss.nxp.com> Accept-Language: en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: x-ms-publictraffictype: Email x-ms-traffictypediagnostic: PA4PR03MB7136:EE_|DBAPR03MB6405:EE_ x-ms-office365-filtering-correlation-id: c8f8e653-46cd-4fc2-b3b6-08db42441a71 x-ms-exchange-senderadcheck: 1 x-ms-exchange-antispam-relay: 0 x-microsoft-antispam: BCL:0; x-microsoft-antispam-message-info: YmxfHA21/IBaM0xdNX1KRqEYs1NWa5ONfUxYuImSv4IklW+nurXlSh4bhUDc4onuEDXszNhnNlHaf1P0825d0Cs968FPq/J74yRZUPW0QktAOiwmB/vk2AcRTeLBDb4d5/sct0s7XOolr+1RJkzC4Di1N+hzmvMpSpF/FrCu5B+AMG9Osqkrqg+ETTfTkRV8s4w5RMgZmjDtPHMFyUDRbCR0GNZkslEi4tomgoLrqQIlLYF0qXfv5Tx8u+VLM7K34g/sh1qoHDtLbgnlEMVCbg6HtDg7Ke2XLEwRaNNSBrCQNJatn3sHTefo8ihc6wmz6fJQhAipslYXqnTie2dQ+XMJ/wm6vaLWvde5p8cbKML41E70UjDrX2mT2bnph7+Q4C3z8JdoepZiQks9j/jdd+aDrR5G1C3hCFxwoeDEZmwK+8glF2oiNHXzmQLVBM/TpB9RBH0o/Nzh6urp+1CvxFRK+dEDuGERZMwWTFdBvRR3DDjyN+yQ6GM7ylSooOUgk3MQsdu+oQgFIbA3rs5qwhtuO3v6GrEoLI+6mXZ5h3n5wmtE18BTJXNdpQW4HVZD/zigKIWCrSJOkJel+3PYviMQBXx4djD5iV5T/ugRCV5Xkrvqylcc23UNhoeXV/2XQsImRU/zVje6STqqpoj6sQ== x-forefront-antispam-report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:PA4PR03MB7136.eurprd03.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230028)(4636009)(376002)(346002)(136003)(39860400002)(366004)(396003)(451199021)(66556008)(6512007)(6506007)(26005)(186003)(53546011)(966005)(2616005)(31686004)(64756008)(110136005)(6486002)(83380400001)(71200400001)(36756003)(8676002)(478600001)(5660300002)(316002)(30864003)(54906003)(2906002)(41300700001)(86362001)(38070700005)(7416002)(38100700002)(31696002)(4326008)(8936002)(122000001)(91956017)(76116006)(66946007)(66476007)(66446008)(45980500001)(559001)(579004);DIR:OUT;SFP:1101; x-ms-exchange-antispam-messagedata-chunkcount: 1 x-ms-exchange-antispam-messagedata-0: =?utf-8?B?Unc2djNTZ3RBUG5FWVZoeWQzd1hsNStVWFFnV0pIZlVhSjloY1lKL1lkUyt3?= =?utf-8?B?YnZXZHBwcnY5Y09sakxXcC9ueVhHaEZmaFZTbUsvRUhPb0FaK2lQeUVlalhY?= =?utf-8?B?d2pJUFVJV1lFbnpWaEUzZy9QQ2xCVW1zdzhsTXlWeVBqU3MycFY3L3BZTTRk?= =?utf-8?B?MFFKTmg2eWNSdWIvTWxLWUJUNjFydU9PQkZxTXp5U0RQNEYvVWk2UGNHMmpo?= =?utf-8?B?ZXh1a3p5U2dLOERETStsRmZNbVpQbXRiVWEyQkNmRnUvemwrMjhobmhzeGl0?= =?utf-8?B?NEJWdjdZdndwdTJIcTVqdUIvWXJXSUlBV1lhemUrRys0V0hEMDZrb0lUejIv?= =?utf-8?B?ekxBeXlzcWpUYkpzV2dPNHEzTjBaZmhIV09zUEY1RUhvL2NwaG1iSTRKc3p5?= =?utf-8?B?MGdHb3cwckJDakkvaU1HWjJqczhOOXErMjU3ZWdMcFRBQVUzanJPT3A3SlRY?= =?utf-8?B?THl3dGVDZXZMa2JCQnhOTFBjWDgyRXAwNit0WkcvTUNmeXp2WFNxc04vUk0z?= =?utf-8?B?Ym5GOHA1b1VjbkExV3Q3RHJSWkpGQUtydllLNzRmRnMvNGt6SkwraTlqbEkv?= =?utf-8?B?akFDOWdtZjBkUzAzRWZNQlBwWmdwZnhhUW1lNmt0L2VxZ0xOVjFTS0graitT?= =?utf-8?B?TkxZTTNYbzRxWTc5bGRhQ05vODNtVkZRWjhmWk1aTENMYlFKeEd3QzNqNkFW?= =?utf-8?B?RnhGWVBjTTdUT0txd0xrRVZZdGVNQ0t6SGNlS1BtcWlBTDdQWFl0Q21JQUNh?= =?utf-8?B?UUxkVUEvWVVaUTc4L1dhZHZsdnFVTDhualpiZG12eWdmcFZldjRkZWJnZ2Zz?= =?utf-8?B?VWkxYlFwc0dXNDFYZVA3STJKQy9RVW1haHFPWXIzNEhNSUxpemxOUFVNdUs5?= =?utf-8?B?M25uMlcwc00xMVlsSm9kSmdnOVA5MjVXUUp2cUpuYmJGRmJSREx0dHpVTU54?= =?utf-8?B?bEJYelhxLzIvbkRmYjVicnBqUG9zU3FwckRDSmFrY2xHSHlMUVBtczNVaWYz?= =?utf-8?B?ZlNrNXhKVHpzek9RRVM0Sm5hMTZPUFVxK3oybVR1VEVCZS94UTBtaXp6b1hD?= =?utf-8?B?Z3M5cTN5N2JUdlY2aWRYWUZoZnlWbmRIcHZETmhuK1krbXNzSHkxdC9mU1hv?= =?utf-8?B?WXc0Sko3YlVzR0o4QlUwL1p1Q3pzMGxtdXRoUzdTMGFVeU9Fa0t5NDgzVEo4?= =?utf-8?B?VGE0Ti91Y2NTTVFOSEtjLzk1bitsSmRMUkZEWk82bkFuZjRoZmZZUnJ2WUdN?= =?utf-8?B?R0VmM0RoU0hHUUN5OWxvNEFCOHFYWVMrUW91dHU3aWtNMnk1M3ByRTY5ZnlW?= =?utf-8?B?RXN3MjRhWmlqVzc1eW9URzd6aWFyYTF0aTd3cExsYnJSZjcxWGdUVzNIcldv?= =?utf-8?B?UnRkS1pBbXR5VFdkZGc4Ymw0aVRZZTRiRGtLS28zOU1hVzRja2FUTUp1TWJ3?= =?utf-8?B?dTVvaGtEblNWZ0QyeFFqVkNPbnY3dGxzc2RoK0ViMDlVOG1waVZDWVMvRmh4?= =?utf-8?B?eDR3YXR1ZFFGYzBDMkVONE5wZFMwSy9QRkNmSExSd0ZMajRIMWdmK0JPQ1JX?= =?utf-8?B?RVEzTkRZWkFEZ1NtWWJML1duMTIzMGhDWXlDcGc5QjRuWkNVa1ZoNnRObkNR?= =?utf-8?B?UUFlNWx5ZmhJOTBENlFudTFVVnozaGZDZUxIVUpSWTBEbThUMHEwOHo4VHlT?= =?utf-8?B?K255dU1VSkRQSW5GWVRDeWFZeWxKRlVtbUpmdVE5YVkranhNVmc4ektRNmNm?= =?utf-8?B?Y1FmaE5QMjVRTnNOYm00bVlCR3kramlzaXlJNHRzMzRPT0RCQmtiNlNGUEZt?= =?utf-8?B?bFgvRmlCRVZHL2FtREE2aWRwbVNFYXR1QUtnZHNhd21nbVVsMWQ4RFdIYW9O?= =?utf-8?B?cVNxRFV1Wm9Pa2VSS056clB4N3hKeWNONFJYOWRIZ1plS2xtL0tkUWsrOWRm?= =?utf-8?B?WDVZVVc1c3N0M0N2MUxHTXpOSDErbi95TlFNZUhyb05HYTJOLzVNS09ZZWpO?= =?utf-8?B?SDNZVVdGSGlNak1NMm9lOU85OHJlLytUclZ3aDh2NFhkNVgzL0xTdDVQTEpT?= =?utf-8?B?elljMW8xK3dVUW5CQWt0V2djUk04aGwwNnZjeVdOM3Z4VEtKMXRySFA1dXYw?= =?utf-8?B?N09wVEtZdXgvWHhHQTdwckdlRWxxSWhwM3BjdUh3K2kvQy9mcWJBV0NSSXFO?= =?utf-8?B?cWc9PQ==?= Content-Type: text/plain; charset="utf-8" Content-ID: <45A11EE65B3C664F9A2B53F9B28A0BB0@eurprd03.prod.outlook.com> Content-Transfer-Encoding: base64 MIME-Version: 1.0 X-OriginatorOrg: epam.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-AuthSource: PA4PR03MB7136.eurprd03.prod.outlook.com X-MS-Exchange-CrossTenant-Network-Message-Id: c8f8e653-46cd-4fc2-b3b6-08db42441a71 X-MS-Exchange-CrossTenant-originalarrivaltime: 21 Apr 2023 08:40:47.1751 (UTC) X-MS-Exchange-CrossTenant-fromentityheader: Hosted X-MS-Exchange-CrossTenant-id: b41b72d0-4e9f-4c26-8a69-f949f367c91d X-MS-Exchange-CrossTenant-mailboxtype: HOSTED X-MS-Exchange-CrossTenant-userprincipalname: RUlQYg0DnJSfzO/6Rdw6gkYXYUwshMCBWDPt03YStmQGMovHm2k3xeBCjIs9f3dEsOLdkOrFb8jGYBk+RLThomTRIP46SzSJFvCYuixUMYE= X-MS-Exchange-Transport-CrossTenantHeadersStamped: DBAPR03MB6405 X-Proofpoint-GUID: w6gcVb2KhOYZCDLmqiRLRNjskuOY8VpM X-Proofpoint-ORIG-GUID: w6gcVb2KhOYZCDLmqiRLRNjskuOY8VpM X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.254,Aquarius:18.0.942,Hydra:6.0.573,FMLib:17.11.170.22 definitions=2023-04-21_02,2023-04-20_01,2023-02-09_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 bulkscore=0 lowpriorityscore=0 phishscore=0 suspectscore=0 priorityscore=1501 spamscore=0 mlxlogscore=999 clxscore=1011 mlxscore=0 adultscore=0 malwarescore=0 impostorscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.12.0-2303200000 definitions=main-2304210075 X-Spam-Status: No, score=-2.8 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,RCVD_IN_DNSWL_LOW,SPF_HELO_NONE, SPF_NONE,T_SCC_BODY_TEXT_LINE,URIBL_BLOCKED autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org SGkgUGVuZyBGYW4sDQoNCk9uIDE3LjA0LjIzIDA1OjU1LCBQZW5nIEZhbiB3cm90ZToNCj4NCj4N Cj4gT24gNC8xMy8yMDIzIDY6MDQgQU0sIENyaXN0aWFuIE1hcnVzc2kgd3JvdGU6DQo+PiBPbiBG cmksIEFwciAwNywgMjAyMyBhdCAxMDoxODoyN0FNICswMDAwLCBPbGVrc2lpIE1vaXNpZWlldiB3 cm90ZToNCj4+PiBJbXBsZW1lbnRhdGlvbiBvZiB0aGUgU0NNSSBjbGllbnQgZHJpdmVyLCB3aGlj aCBpbXBsZW1lbnRzDQo+Pj4gUElOQ1RSTF9QUk9UT0NPTC4gVGhpcyBwcm90b2NvbCBoYXMgSUQg MTkgYW5kIGlzIGRlc2NyaWJlZA0KPj4+IGluIHRoZSBsYXRlc3QgREVOMDA1NiBkb2N1bWVudC4N Cj4+DQo+PiBIaSwNCj4+DQo+Pj4gVGhpcyBwcm90b2NvbCBpcyBwYXJ0IG9mIHRoZSBmZWF0dXJl IHRoYXQgd2FzIGRlc2lnbmVkIHRvDQo+Pj4gc2VwYXJhdGUgdGhlIHBpbmN0cmwgc3Vic3lzdGVt IGZyb20gdGhlIFNDUCBmaXJtd2FyZS4NCj4+PiBUaGUgaWRlYSBpcyB0byBzZXBhcmF0ZSBjb21t dW5pY2F0aW9uIG9mIHRoZSBwaW4gY29udHJvbA0KPj4+IHN1YnN5c3RlbSB3aXRoIHRoZSBoYXJk d2FyZSB0byBTQ1AgZmlybXdhcmUNCj4+PiAob3IgYSBzaW1pbGFyIHN5c3RlbSwgc3VjaCBhcyBB VEYpLCB3aGljaCBwcm92aWRlcyBhbiBpbnRlcmZhY2UNCj4+PiB0byBnaXZlIHRoZSBPUyBhYmls aXR5IHRvIGNvbnRyb2wgdGhlIGhhcmR3YXJlIHRocm91Z2ggU0NNSSBwcm90b2NvbC4NCj4+PiBU aGlzIGlzIGEgZ2VuZXJpYyBkcml2ZXIgdGhhdCBpbXBsZW1lbnRzIFNDTUkgcHJvdG9jb2wsDQo+ Pj4gaW5kZXBlbmRlbnQgb2YgdGhlIHBsYXRmb3JtIHR5cGUuDQo+Pj4NCj4+PiBERU4wMDU2IGRv Y3VtZW50Og0KPj4+IGh0dHBzOi8vdXJsZGVmZW5zZS5jb20vdjMvX19odHRwczovL2RldmVsb3Bl ci5hcm0uY29tL2RvY3VtZW50YXRpb24vZGVuMDA1Ni9sYXRlc3RfXzshIUdGXzI5ZGJjUUlVQlBB IXkyaFIzUEVHR3hpUGpWZVhCY2dHeVYwM0RQRGh6Z1VLUjB1SHZzVHBpYWZLZ0JhcjhFZ2M2b09P cy1Ja0ZJcXVoU2YtcUJ6bHRxRU15elJaSHE4ZUM0ZyQgDQo+Pj4gW2RldmVsb3BlclsuXWFybVsu XWNvbV0NCj4+Pg0KPj4NCj4+IE5vIG5lZWQgdG8gc3BlY2lmeSBhbGwgb2YgdGhpcyBpbiB0aGUg Y29tbWl0IG1lc3NhZ2UsIGp1c3QgYSBub3RlIHRoYXQNCj4+IHlvdSBhcmUgYWRkaW5nIGEgbmV3 IFNDTUl2My4yIFBpbmNvbnRyb2wgcHJvdG9jb2wsIGhpZ2hsaWdodGluZyBhbnl0aGluZw0KPj4g dGhhdCBoYXMgYmVlbiBsZWZ0IG91dCBpbiB0aGlzIHBhdGNoIChpZiBhbnkpIHdpbGwgYmUgZW5v dWdoLg0KPg0KPiBJcyBpdCBwb3NzaWJsZSB0byBleHRlbmQgdGhlIHNwZWMgdG8gc3VwcG9ydCBt dWx0aWxwbGUgdWludDMyX3QgZm9yIFBJTg0KPiBDT05GSUcgU0VUPw0KPg0KPiBXaXRoIG9ubHkg b25lIHVpbnQzMl90IGNvdWxkIG5vdCBzYXRpc2Z5IGkuTVggcmVxdWlyZW1lbnQuDQo+DQo+IFRo YW5rcywNCj4gUGVuZy4NCj4NCklJVUMgeW91IGFyZSBleHBlY3RpbmcgdG8gaGF2ZSBhbiBhYmls aXR5IHRvIHNldCBzb21lIGtpbmQgb2YgYXJyYXkgb2YgDQp1aW50MzJfdCBjb25maWcgdmFsdWVz IHRvIHNvbWUgc3BlY2lmaWMgQ29uZmlnVHlwZT8NCg0KSSdtIG5vdCBzdXJlIGlmIGl0J3Mgc3Vw cG9ydGVkIGJ5IHBpbnRjdHJsIHN1YnN5c3RlbSByaWdodCBub3cuIEkgd2FzIA0KdW5hYmxlIHRv IGZpbmQgYW4gZXhhbXBsZSBpbiB0aGUgZXhpc3RpbmcgZGV2aWNlLXRyZWUgcGluY3RybCBiaW5k aW5ncy4gDQpUaGlzIG1ha2VzIG1lIHRoaW5rIHRoYXQgdGhpcyBraW5kIG9mIGJpbmRpbmcgaXMg T0VNIHNwZWNpZmljLg0KDQpNYXliZSBpdCBjYW4gYmUgaW1wbGVtZW50ZWQgYnkgYWRkaW5nIG5l dyBJRHMgdG8gT0VNIHNwZWNpZmljIHJhbmdlIA0KKDE5Mi0yNTUpIHdoaWNoIGlzIHJlc2VydmVk IGZvciBPRU0gc3BlY2lmaWMgdW5pdHMgKFNlZSBUYWJsZSAyMyBvZiANCkRFTjAwNTZFKS4NCg0K QmVzdCByZWdhcmRzLA0KDQpPbGVrc2lpDQoNCg0KPj4gWW91IGNhbiBsb29rIGF0IHRoZSB2ZXJ5 IGZpcnN0IGNvbW1pdCBsb2dzIG9mIGV4aXN0aW5nIHByb3RvcyBhcyBhbg0KPj4gZXhhbXBsZSBs aWtlOiBkcml2ZXJzL2Zpcm13YXJlL2FybV9zY21pL3Bvd2VyY2FwLmMNCj4+DQo+PiBTb21lIG1v cmUgY29tbWVudHMgZG93biBiZWxvdywgSSdsbCBtb3N0bHkgc2tpcCBhbnl0aGluZyByZWxhdGVk IHRvIHRoZQ0KPj4gU0NNSSBBUEkgY2hhbmdlIEkgbWVudGlvbmVkIGJlZm9yZS4uLg0KPj4NCj4+ IEknbGwgYWxzbyB3b250IGNvbW1lbnQgb24gbW9yZSB0cml2aWFsIHN0dWZmIHJlbGF0ZWQgdG8g c3R5bGUsIEJVVCB0aGVyZQ0KPj4gYXJlIGxvdHMgb2YgdGhlbTogeW91IHNob3VsZCBydW4NCj4+ DQo+PiAuL3NjcmlwdHMvY2hlY2twYXRjaC5wbCAtLXN0cmljdCA8eW91ci1naXQtZm9ybWF0LXBh dGNoLWZpbGU+DQo+Pg0KPj4gZm9yIGVhY2ggcGF0Y2ggaW4gdGhlIHNlcmllcy4gKGFuZCBmaXgg YWNjb3JkaW5nbHkuLnNwYWNpbmcsIA0KPj4gYnJhY2tldHMuLi5ldGMpDQo+Pg0KPj4+IFNpZ25l ZC1vZmYtYnk6IE9sZWtzaWkgTW9pc2llaWV2IDxvbGVrc2lpX21vaXNpZWlldkBlcGFtLmNvbT4N Cj4+PiAtLS0NCj4+PiDCoCBNQUlOVEFJTkVSU8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoCB8wqDCoCA2ICsNCj4+PiDCoCBkcml2ZXJzL2Zpcm13YXJlL2Fy bV9zY21pL01ha2VmaWxlwqAgfMKgwqAgMiArLQ0KPj4+IMKgIGRyaXZlcnMvZmlybXdhcmUvYXJt X3NjbWkvY29tbW9uLmjCoCB8wqDCoCAxICsNCj4+PiDCoCBkcml2ZXJzL2Zpcm13YXJlL2FybV9z Y21pL2RyaXZlci5jwqAgfMKgwqAgMyArDQo+Pj4gwqAgZHJpdmVycy9maXJtd2FyZS9hcm1fc2Nt aS9waW5jdHJsLmMgfCA5MDUgDQo+Pj4gKysrKysrKysrKysrKysrKysrKysrKysrKysrKw0KPj4+ IMKgIGRyaXZlcnMvcGluY3RybC9LY29uZmlnwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHzCoMKg IDkgKw0KPj4+IMKgIGluY2x1ZGUvbGludXgvc2NtaV9wcm90b2NvbC5owqDCoMKgwqDCoMKgIHzC oCA1OCArLQ0KPj4+IMKgIDcgZmlsZXMgY2hhbmdlZCwgOTgyIGluc2VydGlvbnMoKyksIDIgZGVs ZXRpb25zKC0pDQo+Pj4gwqAgY3JlYXRlIG1vZGUgMTAwNjQ0IGRyaXZlcnMvZmlybXdhcmUvYXJt X3NjbWkvcGluY3RybC5jDQo+Pj4NCj4+PiBkaWZmIC0tZ2l0IGEvTUFJTlRBSU5FUlMgYi9NQUlO VEFJTkVSUw0KPj4+IGluZGV4IDI4MWRlMjEzZWY0Ny4uYWJjNTQzZmQ3NTQ0IDEwMDY0NA0KPj4+ IC0tLSBhL01BSU5UQUlORVJTDQo+Pj4gKysrIGIvTUFJTlRBSU5FUlMNCj4+PiBAQCAtMTY5NjEs NiArMTY5NjEsMTIgQEAgRjrCoMKgwqAgZHJpdmVycy9yZXNldC9yZXNldC1zY21pLmMNCj4+PiDC oCBGOsKgwqDCoCBpbmNsdWRlL2xpbnV4L3NjW21wXWlfcHJvdG9jb2wuaA0KPj4+IMKgIEY6wqDC oMKgIGluY2x1ZGUvdHJhY2UvZXZlbnRzL3NjbWkuaA0KPj4+IMKgICtQSU5DVFJMIERSSVZFUiBG T1IgU1lTVEVNIENPTlRST0wgJiBQT1dFUi9NQU5BR0VNRU5UIElOVEVSRkFDRSANCj4+PiAoU0NQ SS9TQ01JKQ0KPj4+ICtNOsKgwqDCoCBPbGVrc2lpIE1vaXNpZWlldiA8b2xla3NpaV9tb2lzaWVp ZXZAZXBhbS5jb20+DQo+Pj4gK0w6wqDCoMKgIGxpbnV4LWFybS1rZXJuZWxAbGlzdHMuaW5mcmFk ZWFkLm9yZw0KPj4+ICtTOsKgwqDCoCBNYWludGFpbmVkDQo+Pj4gK0Y6wqDCoMKgIGRyaXZlcnMv ZmlybXdhcmUvYXJtX3NjbWkvcGluY3RybC5jDQo+Pj4gKw0KPj4+IMKgIFNZU1RFTSBSRVNFVC9T SFVURE9XTiBEUklWRVJTDQo+Pj4gwqAgTTrCoMKgwqAgU2ViYXN0aWFuIFJlaWNoZWwgPHNyZUBr ZXJuZWwub3JnPg0KPj4+IMKgIEw6wqDCoMKgIGxpbnV4LXBtQHZnZXIua2VybmVsLm9yZw0KPj4+ IGRpZmYgLS1naXQgYS9kcml2ZXJzL2Zpcm13YXJlL2FybV9zY21pL01ha2VmaWxlIA0KPj4+IGIv ZHJpdmVycy9maXJtd2FyZS9hcm1fc2NtaS9NYWtlZmlsZQ0KPj4+IGluZGV4IGJjMGQ1NGY4ZTg2 MS4uNWNlYzM1N2ZiZmE4IDEwMDY0NA0KPj4+IC0tLSBhL2RyaXZlcnMvZmlybXdhcmUvYXJtX3Nj bWkvTWFrZWZpbGUNCj4+PiArKysgYi9kcml2ZXJzL2Zpcm13YXJlL2FybV9zY21pL01ha2VmaWxl DQo+Pj4gQEAgLTQsNyArNCw3IEBAIHNjbWktZHJpdmVyLXkgPSBkcml2ZXIubyBub3RpZnkubw0K Pj4+IMKgIHNjbWktdHJhbnNwb3J0LXkgPSBzaG1lbS5vDQo+Pj4gwqAgc2NtaS10cmFuc3BvcnQt JChDT05GSUdfTUFJTEJPWCkgKz0gbWFpbGJveC5vDQo+Pj4gwqAgc2NtaS10cmFuc3BvcnQtJChD T05GSUdfSEFWRV9BUk1fU01DQ0NfRElTQ09WRVJZKSArPSBzbWMubw0KPj4+IC1zY21pLXByb3Rv Y29scy15ID0gYmFzZS5vIGNsb2NrLm8gcGVyZi5vIHBvd2VyLm8gcmVzZXQubyBzZW5zb3JzLm8g DQo+Pj4gc3lzdGVtLm8NCj4+PiArc2NtaS1wcm90b2NvbHMteSA9IGJhc2UubyBjbG9jay5vIHBl cmYubyBwb3dlci5vIHJlc2V0Lm8gc2Vuc29ycy5vIA0KPj4+IHN5c3RlbS5vIHBpbmN0cmwubw0K Pj4+IMKgIHNjbWktbW9kdWxlLW9ianMgOj0gJChzY21pLWJ1cy15KSAkKHNjbWktZHJpdmVyLXkp IA0KPj4+ICQoc2NtaS1wcm90b2NvbHMteSkgXA0KPj4+IMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgICQoc2NtaS10cmFuc3BvcnQteSkNCj4+PiDCoCBvYmotJChDT05GSUdfQVJNX1NDTUlfUFJP VE9DT0wpICs9IHNjbWktbW9kdWxlLm8NCj4+PiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9maXJtd2Fy ZS9hcm1fc2NtaS9jb21tb24uaCANCj4+PiBiL2RyaXZlcnMvZmlybXdhcmUvYXJtX3NjbWkvY29t bW9uLmgNCj4+PiBpbmRleCA2NTA2M2ZhOTQ4ZDQuLjhiYmI0MDRhYmU4ZCAxMDA2NDQNCj4+PiAt LS0gYS9kcml2ZXJzL2Zpcm13YXJlL2FybV9zY21pL2NvbW1vbi5oDQo+Pj4gKysrIGIvZHJpdmVy cy9maXJtd2FyZS9hcm1fc2NtaS9jb21tb24uaA0KPj4+IEBAIC0xNzAsNiArMTcwLDcgQEAgREVD TEFSRV9TQ01JX1JFR0lTVEVSX1VOUkVHSVNURVIocG93ZXIpOw0KPj4+IMKgIERFQ0xBUkVfU0NN SV9SRUdJU1RFUl9VTlJFR0lTVEVSKHJlc2V0KTsNCj4+PiDCoCBERUNMQVJFX1NDTUlfUkVHSVNU RVJfVU5SRUdJU1RFUihzZW5zb3JzKTsNCj4+PiDCoCBERUNMQVJFX1NDTUlfUkVHSVNURVJfVU5S RUdJU1RFUihzeXN0ZW0pOw0KPj4+ICtERUNMQVJFX1NDTUlfUkVHSVNURVJfVU5SRUdJU1RFUihw aW5jdHJsKTsNCj4+PiDCoCDCoCAjZGVmaW5lIERFRklORV9TQ01JX1BST1RPQ09MX1JFR0lTVEVS X1VOUkVHSVNURVIoaWQsIG5hbWUpIFwNCj4+PiDCoCBpbnQgX19pbml0IHNjbWlfIyNuYW1lIyNf cmVnaXN0ZXIodm9pZCkgXA0KPj4+IGRpZmYgLS1naXQgYS9kcml2ZXJzL2Zpcm13YXJlL2FybV9z Y21pL2RyaXZlci5jIA0KPj4+IGIvZHJpdmVycy9maXJtd2FyZS9hcm1fc2NtaS9kcml2ZXIuYw0K Pj4+IGluZGV4IDNkZmQ4YjZhMGViZi4uZmI5NTI1ZmIzYzI0IDEwMDY0NA0KPj4+IC0tLSBhL2Ry aXZlcnMvZmlybXdhcmUvYXJtX3NjbWkvZHJpdmVyLmMNCj4+PiArKysgYi9kcml2ZXJzL2Zpcm13 YXJlL2FybV9zY21pL2RyaXZlci5jDQo+Pj4gQEAgLTc0Myw2ICs3NDMsNyBAQCBzdGF0aWMgc3Ry dWN0IHNjbWlfcHJvdF9kZXZuYW1lcyBkZXZuYW1lc1tdID0gew0KPj4+IMKgwqDCoMKgwqAgeyBT Q01JX1BST1RPQ09MX0NMT0NLLMKgIHsgImNsb2NrcyIgfSx9LA0KPj4+IMKgwqDCoMKgwqAgeyBT Q01JX1BST1RPQ09MX1NFTlNPUiwgeyAiaHdtb24iIH0sfSwNCj4+PiDCoMKgwqDCoMKgIHsgU0NN SV9QUk9UT0NPTF9SRVNFVCzCoCB7ICJyZXNldCIgfSx9LA0KPj4+ICvCoMKgwqAgeyBTQ01JX1BS T1RPQ09MX1BJTkNUUkwswqAgeyAicGluY3RybCIgfSx9LA0KPj4+IMKgIH07DQo+Pj4gwqAgwqAg c3RhdGljIGlubGluZSB2b2lkDQo+Pj4gQEAgLTk0Nyw2ICs5NDgsNyBAQCBzdGF0aWMgaW50IF9f aW5pdCBzY21pX2RyaXZlcl9pbml0KHZvaWQpDQo+Pj4gwqDCoMKgwqDCoCBzY21pX3Jlc2V0X3Jl Z2lzdGVyKCk7DQo+Pj4gwqDCoMKgwqDCoCBzY21pX3NlbnNvcnNfcmVnaXN0ZXIoKTsNCj4+PiDC oMKgwqDCoMKgIHNjbWlfc3lzdGVtX3JlZ2lzdGVyKCk7DQo+Pj4gK8KgwqDCoCBzY21pX3BpbmN0 cmxfcmVnaXN0ZXIoKTsNCj4+PiDCoCDCoMKgwqDCoMKgIHJldHVybiBwbGF0Zm9ybV9kcml2ZXJf cmVnaXN0ZXIoJnNjbWlfZHJpdmVyKTsNCj4+PiDCoCB9DQo+Pj4gQEAgLTk2Miw2ICs5NjQsNyBA QCBzdGF0aWMgdm9pZCBfX2V4aXQgc2NtaV9kcml2ZXJfZXhpdCh2b2lkKQ0KPj4+IMKgwqDCoMKg wqAgc2NtaV9yZXNldF91bnJlZ2lzdGVyKCk7DQo+Pj4gwqDCoMKgwqDCoCBzY21pX3NlbnNvcnNf dW5yZWdpc3RlcigpOw0KPj4+IMKgwqDCoMKgwqAgc2NtaV9zeXN0ZW1fdW5yZWdpc3RlcigpOw0K Pj4+ICvCoMKgwqAgc2NtaV9waW5jdHJsX3VucmVnaXN0ZXIoKTsNCj4+PiDCoCDCoMKgwqDCoMKg IHBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZzY21pX2RyaXZlcik7DQo+Pj4gwqAgfQ0KPj4+ IGRpZmYgLS1naXQgYS9kcml2ZXJzL2Zpcm13YXJlL2FybV9zY21pL3BpbmN0cmwuYyANCj4+PiBi L2RyaXZlcnMvZmlybXdhcmUvYXJtX3NjbWkvcGluY3RybC5jDQo+Pj4gbmV3IGZpbGUgbW9kZSAx MDA2NDQNCj4+PiBpbmRleCAwMDAwMDAwMDAwMDAuLjAzNzI3MGQ3ZjM5Yg0KPj4+IC0tLSAvZGV2 L251bGwNCj4+PiArKysgYi9kcml2ZXJzL2Zpcm13YXJlL2FybV9zY21pL3BpbmN0cmwuYw0KPj4+ IEBAIC0wLDAgKzEsOTA1IEBADQo+Pj4gKy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwt Mi4wDQo+Pj4gKy8qDQo+Pj4gKyAqIFN5c3RlbSBDb250cm9sIGFuZCBNYW5hZ2VtZW50IEludGVy ZmFjZSAoU0NNSSkgUGluY3RybCBQcm90b2NvbA0KPj4+ICsgKg0KPj4+ICsgKiBDb3B5cmlnaHQg KEMpIDIwMjEgRVBBTS4NCj4+DQo+PiBuaXRwaWNrOiB1cGRhdGUgKEMpIHllYXJzDQo+Pg0KPj4+ ICsgKi8NCj4+PiArDQo+Pj4gKyNkZWZpbmUgcHJfZm10KGZtdCkgIlNDTUkgTm90aWZpY2F0aW9u cyBQSU5DVFJMIC0gIiBmbXQNCj4+PiArDQo+Pg0KPj4gVGhpcyBpcyBub3QgbmVlZGVkLCBubyBu b3RpZnMgaW4gdGhpcyBwcm90by4NCj4+DQo+Pj4gKyNpbmNsdWRlIDxsaW51eC9zY21pX3Byb3Rv Y29sLmg+DQo+Pj4gKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+DQo+Pj4gKw0KPj4+ICsjaW5jbHVk ZSAiY29tbW9uLmgiDQo+Pj4gKyNpbmNsdWRlICJub3RpZnkuaCINCj4+DQo+PiBOb3RpZnMgbm90 IG5lZWRlZCwgYW5kIGluIHRoZSBuZXcgQVBJIHdvcmxkIHlvdSdsbCBqdXN0IG5lZWQgYToNCj4+ DQo+PiDCoCAjaW5jbHVkZSAicHJvdG9jb2xzLmgiDQo+Pg0KPj4+ICsNCj4+PiArI2RlZmluZSBT RVRfVFlQRSh4KSAoKHgpICYgMHgzKQ0KPj4+ICsNCj4+DQo+PiBFdmVuIGlmIHRyaXZpYWwgYmV0 dGVyIHRvIHVzZSBzdGQgYml0ZmllbGQuaCBtYWNyb3MgbGlrZQ0KPj4gRklFTERfR0VUKCkgQklU KCkgLi4uIGV0Yw0KPj4NCj4+PiArZW51bSBzY21pX3BpbmN0cmxfcHJvdG9jb2xfY21kIHsNCj4+ PiArwqDCoMKgIFBJTkNUUkxfQVRUUklCVVRFUyA9IDB4MywNCj4+PiArwqDCoMKgIFBJTkNUUkxf TElTVF9BU1NPQ0lBVElPTlMgPSAweDQsDQo+Pj4gK8KgwqDCoCBQSU5DVFJMX0NPTkZJR19HRVQg PSAweDUsDQo+Pj4gK8KgwqDCoCBQSU5DVFJMX0NPTkZJR19TRVQgPSAweDYsDQo+Pj4gK8KgwqDC oCBQSU5DVFJMX0ZVTkNUSU9OX1NFTEVDVCA9IDB4NywNCj4+PiArwqDCoMKgIFBJTkNUUkxfUkVR VUVTVCA9IDB4OCwNCj4+PiArwqDCoMKgIFBJTkNUUkxfUkVMRUFTRSA9IDB4OSwNCj4+PiArwqDC oMKgIFBJTkNUUkxfTkFNRV9HRVQgPSAweGEsDQo+Pj4gK8KgwqDCoCBQSU5DVFJMX1NFVF9QRVJN SVNTSU9OUyA9IDB4Yg0KPj4+ICt9Ow0KPj4+ICsNCj4+PiArZW51bSBzY21pX3BpbmN0cmxfc2Vs ZWN0b3JfdHlwZSB7DQo+Pj4gK8KgwqDCoCBQSU5fVFlQRSA9IDAsDQo+Pj4gK8KgwqDCoCBHUk9V UF9UWVBFLA0KPj4+ICvCoMKgwqAgRlVOQ1RJT05fVFlQRQ0KPj4+ICt9Ow0KPj4+ICsNCj4+PiAr c3RydWN0IHNjbWlfZ3JvdXBfaW5mbyB7DQo+Pj4gK8KgwqDCoCBib29sIHByZXNlbnQ7DQo+Pj4g K8KgwqDCoCBjaGFyICpuYW1lOw0KPj4+ICvCoMKgwqAgdW5zaWduZWQgaW50ICpncm91cF9waW5z Ow0KPj4+ICvCoMKgwqAgdW5zaWduZWQgaW50IG5yX3BpbnM7DQo+Pj4gK307DQo+Pj4gKw0KPj4+ ICtzdHJ1Y3Qgc2NtaV9mdW5jdGlvbl9pbmZvIHsNCj4+PiArwqDCoMKgIGJvb2wgcHJlc2VudDsN Cj4+PiArwqDCoMKgIGNoYXIgKm5hbWU7DQo+Pj4gK8KgwqDCoCB1bnNpZ25lZCBpbnQgKmdyb3Vw czsNCj4+PiArwqDCoMKgIHVuc2lnbmVkIGludCBucl9ncm91cHM7DQo+Pj4gK307DQo+Pj4gKw0K Pj4+ICtzdHJ1Y3Qgc2NtaV9waW5faW5mbyB7DQo+Pj4gK8KgwqDCoCBib29sIHByZXNlbnQ7DQo+ Pj4gK8KgwqDCoCBjaGFyICpuYW1lOw0KPj4+ICt9Ow0KPj4+ICsNCj4+PiArc3RydWN0IHNjbWlf cGluY3RybF9pbmZvIHsNCj4+PiArwqDCoMKgIHUzMiB2ZXJzaW9uOw0KPj4+ICvCoMKgwqAgdTE2 IG5yX2dyb3VwczsNCj4+PiArwqDCoMKgIHUxNiBucl9mdW5jdGlvbnM7DQo+Pj4gK8KgwqDCoCB1 MTYgbnJfcGluczsNCj4+DQo+PiBTaW5jZSB0aGVzZSB2YXJzIGFyZSBub3QgcmVsYXRlZCB0byBz dHJpY2x5IHNwYWNlZCBtZXNzYWdlIGZpZWxkcyANCj4+IChldmVuIHRob3VnaA0KPj4gZGVyaXZl ZCBmcm9tIHN1Y2ggbWVzc2FnZXMpIGRvIG5vdCB1c2Ugc2l6ZWQgdHlwZXMsIHlvdSBjYW4ganVz dCANCj4+IHN0aWNrIHdpdGgNCj4+IHVuc2lnbmVkIGludC4gKGl0IGlzIGFsc28gYmV0dGVyIG5v dCB0byBtaXggc2l6ZWQgYW5kIHVuc2l6ZWQgdHlwZXMgDQo+PiBpbiB0aGUgc2FtZQ0KPj4gc3Ry dWN0KS4gVGhpcyBhbHNvIGNvdWxkIGNvbWUgaGFuZHkgaWYgdGhlc2Ugd2lsbCBiZSBleHBvc2Vk IHRvIHRoZSB1c2VyDQo+PiBpbiBzY21pX3Byb3RvY29sLmggaW4gdGhlIGZ1dHVyZSAobW9yZSBv biB0aGlzIGRvd24gYmVsb3cpDQo+Pg0KPj4+ICvCoMKgwqAgc3RydWN0IHNjbWlfZ3JvdXBfaW5m byAqZ3JvdXBzOw0KPj4+ICvCoMKgwqAgc3RydWN0IHNjbWlfZnVuY3Rpb25faW5mbyAqZnVuY3Rp b25zOw0KPj4+ICvCoMKgwqAgc3RydWN0IHNjbWlfcGluX2luZm8gKnBpbnM7DQo+Pj4gK307DQo+ Pj4gKw0KPj4+ICtzdHJ1Y3Qgc2NtaV9jb25mX3R4IHsNCj4+PiArwqDCoMKgIF9fbGUzMiBpZGVu dGlmaWVyOw0KPj4+ICsjZGVmaW5lIFNFVF9UWVBFX0JJVFMoYXR0ciwgeCkgKCgoYXR0cikgJiAw eEZGRkZGQ0ZGKSB8ICh4ICYgMHgzKSANCj4+PiA8PCA4KQ0KPj4+ICsjZGVmaW5lIFNFVF9DT05G SUcoYXR0ciwgeCkgKCgoYXR0cikgJiAweEZGKSB8ICh4ICYgMHhGRikpDQo+Pg0KPj4gVXNlIGJp dGZpZWxkLmggbGlrZSBGSUVMRF9TRVQgLyBHRU5NQVNLIGV0Yw0KPj4NCj4+PiArwqDCoMKgIF9f bGUzMiBhdHRyaWJ1dGVzOw0KPj4+ICt9Ow0KPj4+ICsNCj4+PiArc3RhdGljIGludCBzY21pX3Bp bmN0cmxfYXR0cmlidXRlc19nZXQoY29uc3Qgc3RydWN0IHNjbWlfaGFuZGxlIA0KPj4+ICpoYW5k bGUsDQo+Pj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHN0 cnVjdCBzY21pX3BpbmN0cmxfaW5mbyAqcGkpDQo+Pj4gK3sNCj4+PiArwqDCoMKgIGludCByZXQ7 DQo+Pj4gK8KgwqDCoCBzdHJ1Y3Qgc2NtaV94ZmVyICp0Ow0KPj4+ICvCoMKgwqAgc3RydWN0IHNj bWlfbXNnX3BpbmN0cmxfcHJvdG9jb2xfYXR0cmlidXRlcyB7DQo+Pj4gKyNkZWZpbmUgR1JPVVBT X05SKHgpICgoeCkgPj4gMTYpDQo+Pj4gKyNkZWZpbmUgUElOU19OUih4KSAoKHgpICYgMHhmZmZm KQ0KPj4+ICvCoMKgwqDCoMKgwqDCoCBfX2xlMzIgYXR0cmlidXRlc19sb3c7DQo+Pj4gKyNkZWZp bmUgRlVOQ1RJT05TX05SKHgpICgoeCkgJiAweGZmZmYpDQo+Pj4gK8KgwqDCoMKgwqDCoMKgIF9f bGUzMiBhdHRyaWJ1dGVzX2hpZ2g7DQo+Pj4gK8KgwqDCoCB9ICphdHRyOw0KPj4NCj4+IEZvciBj b25zaXN0ZW5jeSB3aXRoIHRoZSByZXN0IG9mIHRoZSBzdGFjayAobW9zdGx5IDpEKSwgcGxlYXNl IG1vdmUgDQo+PiB0aGlzIHN0cnVjdA0KPj4gZGVmaW5pdGlvbiBhbmQgcmVsYXRlZCBtYWNyb3Mg b3V0c2lkZSBpbiB0aGUgZ2xvYmFsIHNjb3BlIHJpZ2h0IGFmdGVyIA0KPj4gY29tbWFuZA0KPj4g ZW51bS4gKGFuZCB1c2UgYml0ZmllbGQgbWFjcm9zIC4uLikNCj4+DQo+Pj4gKw0KPj4+ICvCoMKg wqAgaWYgKCFwaSkNCj4+PiArwqDCoMKgwqDCoMKgwqAgcmV0dXJuIC1FSU5WQUw7DQo+Pj4gKw0K Pj4+ICvCoMKgwqAgcmV0ID0gc2NtaV94ZmVyX2dldF9pbml0KGhhbmRsZSwgUFJPVE9DT0xfQVRU UklCVVRFUywNCj4+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgU0NNSV9QUk9U T0NPTF9QSU5DVFJMLCAwLCBzaXplb2YoKmF0dHIpLCAmdCk7DQo+Pj4gK8KgwqDCoCBpZiAocmV0 KQ0KPj4+ICvCoMKgwqDCoMKgwqDCoCByZXR1cm4gcmV0Ow0KPj4+ICsNCj4+PiArwqDCoMKgIGF0 dHIgPSB0LT5yeC5idWY7DQo+Pj4gKw0KPj4+ICvCoMKgwqAgcmV0ID0gc2NtaV9kb194ZmVyKGhh bmRsZSwgdCk7DQo+Pj4gK8KgwqDCoCBpZiAoIXJldCkgew0KPj4+ICvCoMKgwqDCoMKgwqDCoCBw aS0+bnJfZnVuY3Rpb25zID0NCj4+PiArIGxlMTZfdG9fY3B1KEZVTkNUSU9OU19OUihhdHRyLT5h dHRyaWJ1dGVzX2hpZ2gpKTsNCj4+PiArwqDCoMKgwqDCoMKgwqAgcGktPm5yX2dyb3VwcyA9IGxl MTZfdG9fY3B1KEdST1VQU19OUihhdHRyLT5hdHRyaWJ1dGVzX2xvdykpOw0KPj4+ICvCoMKgwqDC oMKgwqDCoCBwaS0+bnJfcGlucyA9IGxlMTZfdG9fY3B1KFBJTlNfTlIoYXR0ci0+YXR0cmlidXRl c19sb3cpKTsNCj4+PiArwqDCoMKgIH0NCj4+PiArDQo+Pj4gK8KgwqDCoCBzY21pX3hmZXJfcHV0 KGhhbmRsZSwgdCk7DQo+Pj4gK8KgwqDCoCByZXR1cm4gcmV0Ow0KPj4+ICt9DQo+Pj4gKw0KPj4+ ICtzdGF0aWMgaW50IHNjbWlfcGluY3RybF9nZXRfZ3JvdXBzX2NvdW50KGNvbnN0IHN0cnVjdCBz Y21pX2hhbmRsZSANCj4+PiAqaGFuZGxlKQ0KPj4+ICt7DQo+Pj4gK8KgwqDCoCBzdHJ1Y3Qgc2Nt aV9waW5jdHJsX2luZm8gKnBpOw0KPj4+ICsNCj4+PiArwqDCoMKgIGlmICghaGFuZGxlIHx8ICFo YW5kbGUtPnBpbmN0cmxfcHJpdikNCj4+PiArwqDCoMKgwqDCoMKgwqAgcmV0dXJuIC1FTk9ERVY7 DQo+Pj4gKw0KPj4+ICvCoMKgwqAgcGkgPSBoYW5kbGUtPnBpbmN0cmxfcHJpdjsNCj4+PiArDQo+ Pj4gK8KgwqDCoCByZXR1cm4gcGktPm5yX2dyb3VwczsNCj4+PiArfQ0KPj4+ICsNCj4+PiArc3Rh dGljIGludCBzY21pX3BpbmN0cmxfZ2V0X3BpbnNfY291bnQoY29uc3Qgc3RydWN0IHNjbWlfaGFu ZGxlIA0KPj4+ICpoYW5kbGUpDQo+Pj4gK3sNCj4+PiArwqDCoMKgIHN0cnVjdCBzY21pX3BpbmN0 cmxfaW5mbyAqcGk7DQo+Pj4gKw0KPj4+ICvCoMKgwqAgaWYgKCFoYW5kbGUgfHwgIWhhbmRsZS0+ cGluY3RybF9wcml2KQ0KPj4+ICvCoMKgwqDCoMKgwqDCoCByZXR1cm4gLUVOT0RFVjsNCj4+PiAr DQo+Pj4gK8KgwqDCoCBwaSA9IGhhbmRsZS0+cGluY3RybF9wcml2Ow0KPj4+ICsNCj4+PiArwqDC oMKgIHJldHVybiBwaS0+bnJfcGluczsNCj4+PiArfQ0KPj4+ICsNCj4+PiArc3RhdGljIGludCBz Y21pX3BpbmN0cmxfZ2V0X2Z1bmN0aW9uc19jb3VudChjb25zdCBzdHJ1Y3QgDQo+Pj4gc2NtaV9o YW5kbGUgKmhhbmRsZSkNCj4+PiArew0KPj4+ICvCoMKgwqAgc3RydWN0IHNjbWlfcGluY3RybF9p bmZvICpwaTsNCj4+PiArDQo+Pj4gK8KgwqDCoCBpZiAoIWhhbmRsZSB8fCAhaGFuZGxlLT5waW5j dHJsX3ByaXYpDQo+Pj4gK8KgwqDCoMKgwqDCoMKgIHJldHVybiAtRU5PREVWOw0KPj4+ICsNCj4+ PiArwqDCoMKgIHBpID0gaGFuZGxlLT5waW5jdHJsX3ByaXY7DQo+Pj4gKw0KPj4+ICvCoMKgwqAg cmV0dXJuIHBpLT5ucl9mdW5jdGlvbnM7DQo+Pj4gK30NCj4+PiArDQo+Pj4gK3N0YXRpYyBpbnQg c2NtaV9waW5jdHJsX3ZhbGlkYXRlX2lkKGNvbnN0IHN0cnVjdCBzY21pX2hhbmRsZSAqaGFuZGxl LA0KPj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCB1MzIgaWRlbnRp ZmllciwNCj4+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgZW51bSBz Y21pX3BpbmN0cmxfc2VsZWN0b3JfdHlwZSB0eXBlKQ0KPj4+ICt7DQo+Pj4gK8KgwqDCoCBzdHJ1 Y3Qgc2NtaV9waW5jdHJsX2luZm8gKnBpOw0KPj4+ICsNCj4+PiArwqDCoMKgIGlmICghaGFuZGxl IHx8ICFoYW5kbGUtPnBpbmN0cmxfcHJpdikNCj4+PiArwqDCoMKgwqDCoMKgwqAgcmV0dXJuIC1F Tk9ERVY7DQo+Pj4gKw0KPj4+ICvCoMKgwqAgc3dpdGNoICh0eXBlKSB7DQo+Pj4gK8KgwqDCoCBj YXNlIFBJTl9UWVBFOg0KPj4+ICvCoMKgwqDCoMKgwqDCoCBwaSA9IGhhbmRsZS0+cGluY3RybF9w cml2Ow0KPj4+ICsNCj4+PiArwqDCoMKgwqDCoMKgwqAgcmV0dXJuIChpZGVudGlmaWVyIDwgcGkt Pm5yX3BpbnMpID8gMCA6IC1FSU5WQUw7DQo+Pj4gK8KgwqDCoCBjYXNlIEdST1VQX1RZUEU6DQo+ Pj4gK8KgwqDCoMKgwqDCoMKgIHJldHVybiAoaWRlbnRpZmllciA8DQo+Pj4gK8KgwqDCoMKgwqDC oMKgwqDCoMKgwqAgc2NtaV9waW5jdHJsX2dldF9ncm91cHNfY291bnQoaGFuZGxlKSkgPw0KPj4+ ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIDAgOiAtRUlOVkFMOw0KPj4+ICvCoMKgwqAgY2FzZSBG VU5DVElPTl9UWVBFOg0KPj4+ICvCoMKgwqDCoMKgwqDCoCByZXR1cm4gKGlkZW50aWZpZXIgPA0K Pj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHNjbWlfcGluY3RybF9nZXRfZnVuY3Rpb25zX2Nv dW50KGhhbmRsZSkpID8NCj4+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCAwIDogLUVJTlZBTDsN Cj4+PiArwqDCoMKgIGRlZmF1bHQ6DQo+Pj4gK8KgwqDCoMKgwqDCoMKgIHJldHVybiAtRUlOVkFM Ow0KPj4+ICvCoMKgwqAgfQ0KPj4NCj4+IEhlcmUgSSB3b3VsZCBqdXN0IHBpY2sgdGhlIHJpZ2h0 IHZhbHVlIHRvIGNvbXBhcmUsIGJyZWFrIGFuZCB0aGVuDQo+PiBjb21wYXJlIGFuZCBleGl0LCBz b21ldGhpbmcgYXJvdW5kZiB0aGUgbGluZXMgb2Y6DQo+Pg0KPj4gwqDCoMKgwqBjYXNlIFBJTl9U WVBFOg0KPj4gwqDCoMKgwqDCoMKgwqAgLi4uDQo+PiDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHZh bCA9IHBpLT5ucl9waW5zOw0KPj4gwqDCoMKgwqDCoMKgwqAgYnJlYWs7DQo+PiDCoMKgwqDCoMKg wqDCoCAuLi4NCj4+IMKgwqDCoMKgY2FzZSBHUk9VUF9UWVBFOg0KPj4gwqDCoMKgwqDCoMKgwqAg dmFsID0gc2NtaV9waW5jdHJsX2dldF9ncm91cHNfY291bnQoKSk7DQo+PiDCoMKgwqDCoMKgwqDC oCBicmVhazsNCj4+DQo+PiDCoMKgwqDCoC4uLi4NCj4+IMKgwqDCoMKgLi4uLg0KPj4gwqDCoMKg wqDCoMKgwqAgZGVmYXVsdDoNCj4+IMKgwqDCoMKgwqDCoMKgIHJldHVybiAtRUlOVkFMOw0KPj4g wqDCoMKgwqB9DQo+Pg0KPj4gwqDCoMKgwqBpZiAoaWRlbnRpZmllciA+PSB2YWwpDQo+PiDCoMKg wqDCoMKgwqDCoCByZXR1cm4gLUVJTlZBTDsNCj4+DQo+PiDCoMKgwqDCoHJldHVybiAwOw0KPj4g fQ0KPj4NCj4+IC4uLiBpdCdzIGVhc2llciB0byByZWFkLiBXaGF0IGRvIHlvdSB0aGluayA/DQo+ Pg0KPj4NCj4+PiArfQ0KPj4+ICsNCj4+PiArc3RhdGljIGludCBzY21pX3BpbmN0cmxfZ2V0X25h bWUoY29uc3Qgc3RydWN0IHNjbWlfaGFuZGxlICpoYW5kbGUsDQo+Pj4gK8KgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgIHUzMiBpZGVudGlmaWVyLA0KPj4+ICvCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoCBlbnVtIHNjbWlfcGluY3RybF9zZWxlY3Rvcl90eXBlIHR5cGUsDQo+ Pj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGNoYXIgKipuYW1lKQ0KPj4+ICt7 DQo+Pg0KPj4gQXMgc2FpZCwgdGhlcmUgaXMgY29tbW9uIGhlbHBlciBmb3IgdGhpcywgYnV0IGl0 IHdpbGwgbmVlZCBzb21lIHNtYWxsDQo+PiBhZGFwdGF0aW9uIGluIHRoZSBTQ01JIGNvcmUgdG8g d29yayBoZXJlIHNvIGtlZXAgaXQgYXMgaXQgaXMsIGFuZCANCj4+IEknbGwgdGFrZQ0KPj4gY2Fy ZSBvZiB0aGlzIGxhdGVyLCBpZiBpdCBzb3VuZHMgZmluZSBmb3IgeW91Lg0KPj4NCj4+PiArwqDC oMKgIHN0cnVjdCBzY21pX3hmZXIgKnQ7DQo+Pj4gK8KgwqDCoCBpbnQgcmV0ID0gMDsNCj4+PiAr wqDCoMKgIHN0cnVjdCBzY21pX25hbWVfdHggew0KPj4+ICvCoMKgwqDCoMKgwqDCoCBfX2xlMzIg aWRlbnRpZmllcjsNCj4+PiArwqDCoMKgwqDCoMKgwqAgX19sZTMyIGZsYWdzOw0KPj4+ICvCoMKg wqAgfSAqdHg7DQo+Pj4gK8KgwqDCoCBzdHJ1Y3Qgc2NtaV9uYW1lX3J4IHsNCj4+PiArwqDCoMKg wqDCoMKgwqAgX19sZTMyIGZsYWdzOw0KPj4+ICvCoMKgwqDCoMKgwqDCoCB1OCBuYW1lWzY0XTsN Cj4+PiArwqDCoMKgIH0gKnJ4Ow0KPj4+ICsNCj4+PiArwqDCoMKgIGlmICghaGFuZGxlIHx8ICFu YW1lKQ0KPj4+ICvCoMKgwqDCoMKgwqDCoCByZXR1cm4gLUVJTlZBTDsNCj4+PiArDQo+Pj4gK8Kg wqDCoCByZXQgPSBzY21pX3BpbmN0cmxfdmFsaWRhdGVfaWQoaGFuZGxlLCBpZGVudGlmaWVyLCB0 eXBlKTsNCj4+PiArwqDCoMKgIGlmIChyZXQpDQo+Pj4gK8KgwqDCoMKgwqDCoMKgIHJldHVybiBy ZXQ7DQo+Pj4gKw0KPj4+ICvCoMKgwqAgcmV0ID0gc2NtaV94ZmVyX2dldF9pbml0KGhhbmRsZSwg UElOQ1RSTF9OQU1FX0dFVCwNCj4+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAg U0NNSV9QUk9UT0NPTF9QSU5DVFJMLA0KPj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoCBzaXplb2YoKnR4KSwgc2l6ZW9mKCpyeCksICZ0KTsNCj4+PiArDQo+Pj4gK8KgwqDCoCB0 eCA9IHQtPnR4LmJ1ZjsNCj4+PiArwqDCoMKgIHJ4ID0gdC0+cnguYnVmOw0KPj4+ICvCoMKgwqAg dHgtPmlkZW50aWZpZXIgPSBpZGVudGlmaWVyOw0KPj4+ICvCoMKgwqAgdHgtPmZsYWdzID0gU0VU X1RZUEUoY3B1X3RvX2xlMzIodHlwZSkpOw0KPj4+ICsNCj4+PiArwqDCoMKgIHJldCA9IHNjbWlf ZG9feGZlcihoYW5kbGUsIHQpOw0KPj4+ICvCoMKgwqAgaWYgKHJldCkNCj4+PiArwqDCoMKgwqDC oMKgwqAgZ290byBvdXQ7DQo+Pj4gKw0KPj4+ICvCoMKgwqAgaWYgKHJ4LT5mbGFncykgew0KPj4+ ICvCoMKgwqDCoMKgwqDCoCByZXQgPSAtRUlOVkFMOw0KPj4+ICvCoMKgwqDCoMKgwqDCoCBnb3Rv IG91dDsNCj4+PiArwqDCoMKgIH0NCj4+PiArDQo+Pj4gK8KgwqDCoCAqbmFtZSA9IGthc3ByaW50 ZihHRlBfS0VSTkVMLCAiJXMiLCByeC0+bmFtZSk7DQo+Pj4gK8KgwqDCoCBpZiAoISpuYW1lKQ0K Pj4+ICvCoMKgwqDCoMKgwqDCoCByZXQgPSAtRU5PTUVNOw0KPj4+ICsgb3V0Og0KPj4+ICvCoMKg wqAgc2NtaV94ZmVyX3B1dChoYW5kbGUsIHQpOw0KPj4+ICsNCj4+PiArwqDCoMKgIHJldHVybiBy ZXQ7DQo+Pj4gK30NCj4+PiArDQo+Pj4gK3N0YXRpYyBpbnQgc2NtaV9waW5jdHJsX2F0dHJpYnV0 ZXMoY29uc3Qgc3RydWN0IHNjbWlfaGFuZGxlICpoYW5kbGUsDQo+Pj4gK8KgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBlbnVtIHNjbWlfcGluY3RybF9zZWxlY3Rvcl90eXBlIHR5 cGUsDQo+Pj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCB1MzIgc2VsZWN0 b3IsIGNoYXIgKipuYW1lLA0KPj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqAgdW5zaWduZWQgaW50ICpuX2VsZW1zKQ0KPj4+ICt7DQo+Pj4gK8KgwqDCoCBpbnQgcmV0ID0g MDsNCj4+PiArwqDCoMKgIHN0cnVjdCBzY21pX3hmZXIgKnQ7DQo+Pj4gK8KgwqDCoCBzdHJ1Y3Qg c2NtaV9waW5jdHJsX2F0dHJpYnV0ZXNfdHggew0KPj4+ICvCoMKgwqDCoMKgwqDCoCBfX2xlMzIg aWRlbnRpZmllcjsNCj4+PiArwqDCoMKgwqDCoMKgwqAgX19sZTMyIGZsYWdzOw0KPj4+ICvCoMKg wqAgfSAqdHg7DQo+Pj4gK8KgwqDCoCBzdHJ1Y3Qgc2NtaV9waW5jdHJsX2F0dHJpYnV0ZXNfcngg ew0KPj4+ICsjZGVmaW5lIEVYVF9OQU1FX0ZMQUcoeCkgKCh4KSAmIEJJVCgzMSkpDQo+Pj4gKyNk ZWZpbmUgTlVNX0VMRU1TKHgpICgoeCkgJiAweGZmZmYpDQo+Pj4gK8KgwqDCoMKgwqDCoMKgIF9f bGUzMiBhdHRyaWJ1dGVzOw0KPj4+ICvCoMKgwqDCoMKgwqDCoCB1OCBuYW1lWzE2XTsNCj4+PiAr wqDCoMKgIH0gKnJ4Ow0KPj4NCj4+IERpdHRvLiBNb3ZlIHRoZXNlIGRlZnMgb3V0c2lkZSwgYml0 ZmllbGQuaCBmb3IgbWFjcm9zIGFuZCB0cnkgdG8gdXNlIHRoZQ0KPj4gc2FtZSBuYW1pbmcgc3R5 bGUgZm9yIG1lc3NhZ2Ugc3RydWN0cyBhcyBpbiBvdGhlciBwcm90b3MsIGkuZS4NCj4+DQo+PiDC oMKgwqDCoGZvciBjb21tYW5kczrCoMKgwqDCoCBzdHJ1Y3Qgc2NtaV9tc2dfcGluY3RybF9hdHRy aWJ1dGVzDQo+PiDCoMKgwqDCoGZvciByZXBsaWVzOsKgwqDCoMKgIHN0cnVjdCBzY21pX3Jlc3Bf cGluY3RybF9hdHRyaWJ1dGVzDQo+Pg0KPj4gKG9yIHNvbWUgdmFyaWF0aW9ucyBhcm91bmQgdGhh dC4uLg0KPj4gwqDCoMKgwqBzY21pX21zZ19jbWRfKsKgIHNjbWlfbXNnX3Jlc3BfKg0KPj4NCj4+ IMKgwqAgd2UgaGF2ZSBub3QgYmVlbiBmdWxseSBjb25zaXN0ZW50IHJlYWxseSwgc28gSSBkb250 IHdhbnQgdG8gYmUNCj4+IMKgwqAgcGVkYW50aWMgaGVyZSwgYnV0IHdlIG5ldmVyIHVzZWQgdHgv cnggaW4gbWVzc2FnZSBjb250ZXh0IHNpbmNlIGl0IGlzDQo+PiDCoMKgIGFscmVhZHkgKG1pcykt dXNlZCBpbiBTQ01JIGNoYW5uZWwgY29udGV4dC4uLikNCj4+DQo+Pj4gKw0KPj4+ICvCoMKgwqAg aWYgKCFoYW5kbGUgfHwgIW5hbWUpDQo+Pj4gK8KgwqDCoMKgwqDCoMKgIHJldHVybiAtRUlOVkFM Ow0KPj4+ICsNCj4+PiArwqDCoMKgIHJldCA9IHNjbWlfcGluY3RybF92YWxpZGF0ZV9pZChoYW5k bGUsIHNlbGVjdG9yLCB0eXBlKTsNCj4+PiArwqDCoMKgIGlmIChyZXQpDQo+Pj4gK8KgwqDCoMKg wqDCoMKgIHJldHVybiByZXQ7DQo+Pj4gKw0KPj4+ICvCoMKgwqAgcmV0ID0gc2NtaV94ZmVyX2dl dF9pbml0KGhhbmRsZSwgUElOQ1RSTF9BVFRSSUJVVEVTLA0KPj4+ICvCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqAgU0NNSV9QUk9UT0NPTF9QSU5DVFJMLCBzaXplb2YoKnR4KSwgc2l6ZW9mKCpyeCks ICZ0KTsNCj4+PiArwqDCoMKgIGlmIChyZXQpDQo+Pj4gK8KgwqDCoMKgwqDCoMKgIHJldHVybiBy ZXQ7DQo+Pj4gKw0KPj4+ICvCoMKgwqAgdHggPSB0LT50eC5idWY7DQo+Pj4gK8KgwqDCoCByeCA9 IHQtPnJ4LmJ1ZjsNCj4+PiArwqDCoMKgIHR4LT5pZGVudGlmaWVyID0gc2VsZWN0b3I7DQo+Pj4g K8KgwqDCoCB0eC0+ZmxhZ3MgPSBTRVRfVFlQRShjcHVfdG9fbGUzMih0eXBlKSk7DQo+Pj4gKw0K Pj4+ICvCoMKgwqAgcmV0ID0gc2NtaV9kb194ZmVyKGhhbmRsZSwgdCk7DQo+Pj4gK8KgwqDCoCBp ZiAocmV0KQ0KPj4+ICvCoMKgwqDCoMKgwqDCoCBnb3RvIG91dDsNCj4+PiArDQo+Pj4gK8KgwqDC oCAqbl9lbGVtcyA9IE5VTV9FTEVNUyhyeC0+YXR0cmlidXRlcyk7DQo+Pj4gKw0KPj4+ICvCoMKg wqAgaWYgKCFFWFRfTkFNRV9GTEFHKHJ4LT5hdHRyaWJ1dGVzKSkgew0KPj4+ICvCoMKgwqDCoMKg wqDCoCAqbmFtZSA9IGthc3ByaW50ZihHRlBfS0VSTkVMLCAiJXMiLCByeC0+bmFtZSk7DQo+Pj4g K8KgwqDCoMKgwqDCoMKgIGlmICghKm5hbWUpDQo+Pj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqAg cmV0ID0gLUVOT01FTTsNCj4+PiArwqDCoMKgIH0gZWxzZQ0KPj4+ICvCoMKgwqDCoMKgwqDCoCBy ZXQgPSBzY21pX3BpbmN0cmxfZ2V0X25hbWUoaGFuZGxlLCBzZWxlY3RvciwgdHlwZSwgbmFtZSk7 DQo+Pj4gKyBvdXQ6DQo+Pj4gK8KgwqDCoCBzY21pX3hmZXJfcHV0KGhhbmRsZSwgdCk7DQo+Pj4g K8KgwqDCoCByZXR1cm4gcmV0Ow0KPj4+ICt9DQo+Pj4gKw0KPj4+ICtzdGF0aWMgaW50IHNjbWlf cGluY3RybF9saXN0X2Fzc29jaWF0aW9ucyhjb25zdCBzdHJ1Y3Qgc2NtaV9oYW5kbGUgDQo+Pj4g KmhhbmRsZSwNCj4+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg IHUzMiBzZWxlY3RvciwNCj4+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgIGVudW0gc2NtaV9waW5jdHJsX3NlbGVjdG9yX3R5cGUgdHlwZSwNCj4+PiArwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHVpbnQxNl90IHNpemUsIHVuc2ln bmVkIGludCAqYXJyYXkpDQo+Pj4gK3sNCj4+DQo+PiBUaGlzIGlzIHRoZSBvdGhlciBmdW5jdGlv bmFsaXRpZXMgeW91IGNvdWxkIGltcGxlbWVudCBzdHJhaWdodCBhd2F5IA0KPj4gdXNpbmcNCj4+ IHBoLT5ob3BzIGhlbHBlcnMgKGl0ZXJhdG9ycykgYnV0IGp1c3QgbGVhdmUgaXQgdGhpcyB3YXks IGFuZCBJJ2xsIA0KPj4gcG9ydCBpdCBsYXRlcg0KPj4gKG9uY2Ugd2UgcmV0ZXN0ZWQgYWxsIG9m IHRoaXMgYXMgd29ya2luZyB3aXRoIHRoZSBuZXcgQVBJIGJ1dCB3aXRob3V0IA0KPj4gYW55DQo+ PiBwaC0+aG9wcyB1c2FnZS4uSSB0aGluayBpdCBpcyBzYWZlciB0byBjaGFuZ2Ugb25lIGJpdCBh dCB0aW1lLi4uIDpQKQ0KPj4NCj4+PiArwqDCoMKgIHN0cnVjdCBzY21pX3hmZXIgKnQ7DQo+Pj4g K8KgwqDCoCBzdHJ1Y3Qgc2NtaV9waW5jdHJsX2xpc3RfYXNzb2NfdHggew0KPj4+ICvCoMKgwqDC oMKgwqDCoCBfX2xlMzIgaWRlbnRpZmllcjsNCj4+PiArwqDCoMKgwqDCoMKgwqAgX19sZTMyIGZs YWdzOw0KPj4+ICvCoMKgwqDCoMKgwqDCoCBfX2xlMzIgaW5kZXg7DQo+Pj4gK8KgwqDCoCB9ICp0 eDsNCj4+PiArwqDCoMKgIHN0cnVjdCBzY21pX3BpbmN0cmxfbGlzdF9hc3NvY19yeCB7DQo+Pj4g KyNkZWZpbmUgUkVUVVJORUQoeCkgKCh4KSAmIDB4RkZGKQ0KPj4+ICsjZGVmaW5lIFJFTUFJTklO Ryh4KSAoKHgpID4+IDE2KQ0KPj4+ICvCoMKgwqDCoMKgwqDCoCBfX2xlMzIgZmxhZ3M7DQo+Pj4g K8KgwqDCoMKgwqDCoMKgIF9fbGUxNiBhcnJheVtdOw0KPj4+ICvCoMKgwqAgfSAqcng7DQo+Pg0K Pj4gRGl0dG8sIGFib3V0IHN0cnVjdCBuYW1pbmcgYW5kIG1hY3Jvcy4NCj4+DQo+Pj4gK8KgwqDC oCB1MTYgdG90X251bV9yZXQgPSAwLCBsb29wX251bV9yZXQ7DQo+Pj4gK8KgwqDCoCB1MTYgcmVt YWluaW5nX251bV9yZXQ7DQo+Pj4gK8KgwqDCoCBpbnQgcmV0LCBsb29wOw0KPj4+ICsNCj4+PiAr wqDCoMKgIGlmICghaGFuZGxlIHx8ICFhcnJheSB8fCAhc2l6ZSkNCj4+PiArwqDCoMKgwqDCoMKg wqAgcmV0dXJuIC1FSU5WQUw7DQo+Pj4gKw0KPj4+ICvCoMKgwqAgaWYgKHR5cGUgPT0gUElOX1RZ UEUpDQo+Pj4gK8KgwqDCoMKgwqDCoMKgIHJldHVybiAtRUlOVkFMOw0KPj4+ICsNCj4+PiArwqDC oMKgIHJldCA9IHNjbWlfcGluY3RybF92YWxpZGF0ZV9pZChoYW5kbGUsIHNlbGVjdG9yLCB0eXBl KTsNCj4+PiArwqDCoMKgIGlmIChyZXQpDQo+Pj4gK8KgwqDCoMKgwqDCoMKgIHJldHVybiByZXQ7 DQo+Pj4gKw0KPj4+ICvCoMKgwqAgcmV0ID0gc2NtaV94ZmVyX2dldF9pbml0KGhhbmRsZSwgUElO Q1RSTF9MSVNUX0FTU09DSUFUSU9OUywNCj4+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqAgU0NNSV9QUk9UT0NPTF9QSU5DVFJMLCBzaXplb2YoKnR4KSwNCj4+PiArwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgMCwgJnQpOw0KPj4+ICvCoMKgwqAgaWYgKHJldCkNCj4+ PiArwqDCoMKgwqDCoMKgwqAgcmV0dXJuIHJldDsNCj4+PiArDQo+Pj4gK8KgwqDCoCB0eCA9IHQt PnR4LmJ1ZjsNCj4+PiArwqDCoMKgIHJ4ID0gdC0+cnguYnVmOw0KPj4+ICsNCj4+PiArwqDCoMKg IGRvIHsNCj4+PiArwqDCoMKgwqDCoMKgwqAgdHgtPmlkZW50aWZpZXIgPSBjcHVfdG9fbGUzMihz ZWxlY3Rvcik7DQo+Pj4gK8KgwqDCoMKgwqDCoMKgIHR4LT5mbGFncyA9IFNFVF9UWVBFKGNwdV90 b19sZTMyKHR5cGUpKTsNCj4+PiArwqDCoMKgwqDCoMKgwqAgdHgtPmluZGV4ID0gY3B1X3RvX2xl MzIodG90X251bV9yZXQpOw0KPj4+ICsNCj4+PiArwqDCoMKgwqDCoMKgwqAgcmV0ID0gc2NtaV9k b194ZmVyKGhhbmRsZSwgdCk7DQo+Pj4gK8KgwqDCoMKgwqDCoMKgIGlmIChyZXQpDQo+Pj4gK8Kg wqDCoMKgwqDCoMKgwqDCoMKgwqAgYnJlYWs7DQo+Pj4gKw0KPj4+ICvCoMKgwqDCoMKgwqDCoCBs b29wX251bV9yZXQgPSBsZTMyX3RvX2NwdShSRVRVUk5FRChyeC0+ZmxhZ3MpKTsNCj4+PiArwqDC oMKgwqDCoMKgwqAgcmVtYWluaW5nX251bV9yZXQgPSBsZTMyX3RvX2NwdShSRU1BSU5JTkcocngt PmZsYWdzKSk7DQo+Pj4gKw0KPj4+ICvCoMKgwqDCoMKgwqDCoCBmb3IgKGxvb3AgPSAwOyBsb29w IDwgbG9vcF9udW1fcmV0OyBsb29wKyspIHsNCj4+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBp ZiAodG90X251bV9yZXQgKyBsb29wID49IHNpemUpIHsNCj4+PiArwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgIHJldCA9IC1FTVNHU0laRTsNCj4+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgIGdvdG8gb3V0Ow0KPj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIH0NCj4+PiAr DQo+Pj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqAgYXJyYXlbdG90X251bV9yZXQgKyBsb29wXSA9 DQo+Pj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBsZTE2X3RvX2NwdShyeC0+YXJy YXlbbG9vcF0pOw0KPj4+ICvCoMKgwqDCoMKgwqDCoCB9DQo+Pj4gKw0KPj4+ICvCoMKgwqDCoMKg wqDCoCB0b3RfbnVtX3JldCArPSBsb29wX251bV9yZXQ7DQo+Pj4gKw0KPj4+ICvCoMKgwqDCoMKg wqDCoCBzY21pX3Jlc2V0X3J4X3RvX21heHN6KGhhbmRsZSwgdCk7DQo+Pj4gK8KgwqDCoCB9IHdo aWxlIChyZW1haW5pbmdfbnVtX3JldCA+IDApOw0KPj4+ICtvdXQ6DQo+Pj4gK8KgwqDCoCBzY21p X3hmZXJfcHV0KGhhbmRsZSwgdCk7DQo+Pj4gK8KgwqDCoCByZXR1cm4gcmV0Ow0KPj4+ICt9DQo+ Pj4gKw0KPj4+ICtzdGF0aWMgaW50IHNjbWlfcGluY3RybF9yZXF1ZXN0X2NvbmZpZyhjb25zdCBz dHJ1Y3Qgc2NtaV9oYW5kbGUgDQo+Pj4gKmhhbmRsZSwNCj4+PiArwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgdTMyIHNlbGVjdG9yLA0KPj4+ICvCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBlbnVtIHNjbWlfcGluY3RybF9zZWxl Y3Rvcl90eXBlIHR5cGUsDQo+Pj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgIHUzMiAqY29uZmlnKQ0KPj4+ICt7DQo+Pj4gK8KgwqDCoCBzdHJ1Y3Qgc2NtaV94 ZmVyICp0Ow0KPj4+ICvCoMKgwqAgc3RydWN0IHNjbWlfY29uZl90eCAqdHg7DQo+Pj4gK8KgwqDC oCBfX2xlMzIgKnBhY2tlZF9jb25maWc7DQo+Pj4gK8KgwqDCoCB1MzIgYXR0cmlidXRlcyA9IDA7 DQo+Pj4gK8KgwqDCoCBpbnQgcmV0Ow0KPj4+ICsNCj4+PiArwqDCoMKgIGlmICghaGFuZGxlIHx8 ICFjb25maWcgfHwgdHlwZSA9PSBGVU5DVElPTl9UWVBFKQ0KPj4+ICvCoMKgwqDCoMKgwqDCoCBy ZXR1cm4gLUVJTlZBTDsNCj4+PiArDQo+Pj4gK8KgwqDCoCByZXQgPSBzY21pX3BpbmN0cmxfdmFs aWRhdGVfaWQoaGFuZGxlLCBzZWxlY3RvciwgdHlwZSk7DQo+Pj4gK8KgwqDCoCBpZiAocmV0KQ0K Pj4+ICvCoMKgwqDCoMKgwqDCoCByZXR1cm4gcmV0Ow0KPj4+ICsNCj4+PiArwqDCoMKgIHJldCA9 IHNjbWlfeGZlcl9nZXRfaW5pdChoYW5kbGUsIFBJTkNUUkxfQ09ORklHX0dFVCwNCj4+PiArwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgU0NNSV9QUk9UT0NPTF9QSU5DVFJMLA0KPj4+ ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBzaXplb2YoKnR4KSwgc2l6ZW9mKCpw YWNrZWRfY29uZmlnKSwgJnQpOw0KPj4+ICvCoMKgwqAgaWYgKHJldCkNCj4+PiArwqDCoMKgwqDC oMKgwqAgcmV0dXJuIHJldDsNCj4+PiArDQo+Pj4gK8KgwqDCoCB0eCA9IHQtPnR4LmJ1ZjsNCj4+ PiArwqDCoMKgIHBhY2tlZF9jb25maWcgPSB0LT5yeC5idWY7DQo+Pj4gK8KgwqDCoCB0eC0+aWRl bnRpZmllciA9IGNwdV90b19sZTMyKHNlbGVjdG9yKTsNCj4+PiArwqDCoMKgIGF0dHJpYnV0ZXMg PSBTRVRfVFlQRV9CSVRTKGF0dHJpYnV0ZXMsIHR5cGUpOw0KPj4+ICvCoMKgwqAgYXR0cmlidXRl cyA9IFNFVF9DT05GSUcoYXR0cmlidXRlcywgKmNvbmZpZyk7DQo+Pj4gKw0KPj4+ICvCoMKgwqAg dHgtPmF0dHJpYnV0ZXMgPSBjcHVfdG9fbGUzMihhdHRyaWJ1dGVzKTsNCj4+PiArDQo+Pj4gK8Kg wqDCoCByZXQgPSBzY21pX2RvX3hmZXIoaGFuZGxlLCB0KTsNCj4+PiArDQo+Pj4gK8KgwqDCoCBp ZiAoIXJldCkNCj4+PiArwqDCoMKgwqDCoMKgwqAgKmNvbmZpZyA9IGxlMzJfdG9fY3B1KCpwYWNr ZWRfY29uZmlnKTsNCj4+PiArDQo+Pj4gK8KgwqDCoCBzY21pX3hmZXJfcHV0KGhhbmRsZSwgdCk7 DQo+Pj4gK8KgwqDCoCByZXR1cm4gcmV0Ow0KPj4+ICt9DQo+Pj4gKw0KPj4+ICtzdGF0aWMgaW50 IHNjbWlfcGluY3RybF9nZXRfY29uZmlnKGNvbnN0IHN0cnVjdCBzY21pX2hhbmRsZSANCj4+PiAq aGFuZGxlLCB1MzIgcGluLA0KPj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqAgdTMyICpjb25maWcpDQo+Pj4gK3sNCj4+PiArwqDCoMKgIHJldHVybiBzY21pX3BpbmN0cmxf cmVxdWVzdF9jb25maWcoaGFuZGxlLCBwaW4sIFBJTl9UWVBFLCBjb25maWcpOw0KPj4+ICt9DQo+ Pj4gKw0KPj4+ICtzdGF0aWMgaW50IHNjbWlfcGluY3RybF9hcHBseV9jb25maWcoY29uc3Qgc3Ry dWN0IHNjbWlfaGFuZGxlICpoYW5kbGUsDQo+Pj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqAgdTMyIHNlbGVjdG9yLA0KPj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgIGVudW0gc2NtaV9waW5jdHJsX3NlbGVjdG9yX3R5cGUgdHlwZSwN Cj4+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCB1MzIgY29uZmln KQ0KPj4+ICt7DQo+Pj4gK8KgwqDCoCBzdHJ1Y3Qgc2NtaV94ZmVyICp0Ow0KPj4+ICvCoMKgwqAg c3RydWN0IHNjbWlfY29uZl90eCAqdHg7DQo+Pj4gK8KgwqDCoCB1MzIgYXR0cmlidXRlcyA9IDA7 DQo+Pj4gK8KgwqDCoCBpbnQgcmV0Ow0KPj4+ICsNCj4+PiArwqDCoMKgIGlmICghaGFuZGxlIHx8 IHR5cGUgPT0gRlVOQ1RJT05fVFlQRSkNCj4+PiArwqDCoMKgwqDCoMKgwqAgcmV0dXJuIC1FSU5W QUw7DQo+Pj4gKw0KPj4+ICvCoMKgwqAgcmV0ID0gc2NtaV9waW5jdHJsX3ZhbGlkYXRlX2lkKGhh bmRsZSwgc2VsZWN0b3IsIHR5cGUpOw0KPj4+ICvCoMKgwqAgaWYgKHJldCkNCj4+PiArwqDCoMKg wqDCoMKgwqAgcmV0dXJuIHJldDsNCj4+PiArDQo+Pj4gK8KgwqDCoCByZXQgPSBzY21pX3hmZXJf Z2V0X2luaXQoaGFuZGxlLCBQSU5DVFJMX0NPTkZJR19TRVQsDQo+Pj4gK8KgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgIFNDTUlfUFJPVE9DT0xfUElOQ1RSTCwNCj4+PiArwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgc2l6ZW9mKCp0eCksIDAsICZ0KTsNCj4+PiArwqDCoMKg IGlmIChyZXQpDQo+Pj4gK8KgwqDCoMKgwqDCoMKgIHJldHVybiByZXQ7DQo+Pj4gKw0KPj4+ICvC oMKgwqAgdHggPSB0LT50eC5idWY7DQo+Pj4gK8KgwqDCoCB0eC0+aWRlbnRpZmllciA9IGNwdV90 b19sZTMyKHNlbGVjdG9yKTsNCj4+PiArwqDCoMKgIGF0dHJpYnV0ZXMgPSBTRVRfVFlQRV9CSVRT KGF0dHJpYnV0ZXMsIHR5cGUpOw0KPj4+ICvCoMKgwqAgYXR0cmlidXRlcyA9IFNFVF9DT05GSUco YXR0cmlidXRlcywgY29uZmlnKTsNCj4+PiArwqDCoMKgIHR4LT5hdHRyaWJ1dGVzID0gY3B1X3Rv X2xlMzIoYXR0cmlidXRlcyk7DQo+Pj4gKw0KPj4+ICvCoMKgwqAgcmV0ID0gc2NtaV9kb194ZmVy KGhhbmRsZSwgdCk7DQo+Pj4gKw0KPj4+ICvCoMKgwqAgc2NtaV94ZmVyX3B1dChoYW5kbGUsIHQp Ow0KPj4+ICvCoMKgwqAgcmV0dXJuIHJldDsNCj4+PiArfQ0KPj4+ICsNCj4+PiArc3RhdGljIGlu dCBzY21pX3BpbmN0cmxfc2V0X2NvbmZpZyhjb25zdCBzdHJ1Y3Qgc2NtaV9oYW5kbGUgDQo+Pj4g KmhhbmRsZSwgdTMyIHBpbiwNCj4+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgIHUzMiBjb25maWcpDQo+Pj4gK3sNCj4+PiArwqDCoMKgIHJldHVybiBzY21pX3BpbmN0cmxf YXBwbHlfY29uZmlnKGhhbmRsZSwgcGluLCBQSU5fVFlQRSwgY29uZmlnKTsNCj4+PiArfQ0KPj4+ ICsNCj4+PiArc3RhdGljIGludCBzY21pX3BpbmN0cmxfZ2V0X2NvbmZpZ19ncm91cChjb25zdCBz dHJ1Y3Qgc2NtaV9oYW5kbGUgDQo+Pj4gKmhhbmRsZSwNCj4+PiArwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoCB1MzIgZ3JvdXAsIHUzMiAqY29uZmlnKQ0KPj4+ICt7DQo+ Pj4gK8KgwqDCoCByZXR1cm4gc2NtaV9waW5jdHJsX3JlcXVlc3RfY29uZmlnKGhhbmRsZSwgZ3Jv dXAsIEdST1VQX1RZUEUsIA0KPj4+IGNvbmZpZyk7DQo+Pj4gK30NCj4+PiArDQo+Pj4gK3N0YXRp YyBpbnQgc2NtaV9waW5jdHJsX3NldF9jb25maWdfZ3JvdXAoY29uc3Qgc3RydWN0IHNjbWlfaGFu ZGxlIA0KPj4+ICpoYW5kbGUsDQo+Pj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqAgdTMyIGdyb3VwLCB1MzIgY29uZmlnKQ0KPj4+ICt7DQo+Pj4gK8KgwqDCoCByZXR1 cm4gc2NtaV9waW5jdHJsX2FwcGx5X2NvbmZpZyhoYW5kbGUsIGdyb3VwLCBHUk9VUF9UWVBFLCAN Cj4+PiBjb25maWcpOw0KPj4+ICt9DQo+Pj4gKw0KPj4+ICtzdGF0aWMgaW50IHNjbWlfcGluY3Ry bF9mdW5jdGlvbl9zZWxlY3QoY29uc3Qgc3RydWN0IHNjbWlfaGFuZGxlIA0KPj4+ICpoYW5kbGUs DQo+Pj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHUzMiBpZGVudGlm aWVyLA0KPj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBlbnVtIHNj bWlfcGluY3RybF9zZWxlY3Rvcl90eXBlIHR5cGUsDQo+Pj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgIHUzMiBmdW5jdGlvbl9pZCkNCj4+PiArew0KPj4+ICvCoMKgwqAg c3RydWN0IHNjbWlfeGZlciAqdDsNCj4+PiArwqDCoMKgIHN0cnVjdCBzY21pX2Z1bmNfc2V0X3R4 IHsNCj4+PiArwqDCoMKgwqDCoMKgwqAgX19sZTMyIGlkZW50aWZpZXI7DQo+Pj4gK8KgwqDCoMKg wqDCoMKgIF9fbGUzMiBmdW5jdGlvbl9pZDsNCj4+PiArwqDCoMKgwqDCoMKgwqAgX19sZTMyIGZs YWdzOw0KPj4+ICvCoMKgwqAgfSAqdHg7DQo+Pg0KPj4gRGl0dG8uDQo+Pg0KPj4+ICvCoMKgwqAg aW50IHJldDsNCj4+PiArDQo+Pj4gK8KgwqDCoCBpZiAoIWhhbmRsZSB8fCB0eXBlID09IEZVTkNU SU9OX1RZUEUpDQo+Pj4gK8KgwqDCoMKgwqDCoMKgIHJldHVybiAtRUlOVkFMOw0KPj4+ICsNCj4+ PiArwqDCoMKgIHJldCA9IHNjbWlfcGluY3RybF92YWxpZGF0ZV9pZChoYW5kbGUsIGlkZW50aWZp ZXIsIHR5cGUpOw0KPj4+ICvCoMKgwqAgaWYgKHJldCkNCj4+PiArwqDCoMKgwqDCoMKgwqAgcmV0 dXJuIHJldDsNCj4+PiArDQo+Pj4gK8KgwqDCoCByZXQgPSBzY21pX3hmZXJfZ2V0X2luaXQoaGFu ZGxlLCBQSU5DVFJMX0ZVTkNUSU9OX1NFTEVDVCwNCj4+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqAgU0NNSV9QUk9UT0NPTF9QSU5DVFJMLA0KPj4+ICvCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoCBzaXplb2YoKnR4KSwgMCwgJnQpOw0KPj4+ICvCoMKgwqAgaWYgKHJl dCkNCj4+PiArwqDCoMKgwqDCoMKgwqAgcmV0dXJuIHJldDsNCj4+PiArDQo+Pj4gK8KgwqDCoCB0 eCA9IHQtPnR4LmJ1ZjsNCj4+PiArwqDCoMKgIHR4LT5pZGVudGlmaWVyID0gY3B1X3RvX2xlMzIo aWRlbnRpZmllcik7DQo+Pj4gK8KgwqDCoCB0eC0+ZnVuY3Rpb25faWQgPSBjcHVfdG9fbGUzMihm dW5jdGlvbl9pZCk7DQo+Pj4gK8KgwqDCoCB0eC0+ZmxhZ3MgPSBTRVRfVFlQRShjcHVfdG9fbGUz Mih0eXBlKSk7DQo+Pj4gKw0KPj4+ICvCoMKgwqAgcmV0ID0gc2NtaV9kb194ZmVyKGhhbmRsZSwg dCk7DQo+Pj4gK8KgwqDCoCBzY21pX3hmZXJfcHV0KGhhbmRsZSwgdCk7DQo+Pj4gKw0KPj4+ICvC oMKgwqAgcmV0dXJuIHJldDsNCj4+PiArfQ0KPj4+ICsNCj4+PiArc3RhdGljIGludCBzY21pX3Bp bmN0cmxfcmVxdWVzdChjb25zdCBzdHJ1Y3Qgc2NtaV9oYW5kbGUgKmhhbmRsZSwNCj4+PiArwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHUzMiBpZGVudGlmaWVyLA0KPj4+ICvCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgZW51bSBzY21pX3BpbmN0cmxfc2VsZWN0b3JfdHlwZSB0 eXBlKQ0KPj4+ICt7DQo+Pj4gK8KgwqDCoCBzdHJ1Y3Qgc2NtaV94ZmVyICp0Ow0KPj4+ICvCoMKg wqAgaW50IHJldDsNCj4+PiArwqDCoMKgIHN0cnVjdCBzY21pX3JlcXVlc3RfdHggew0KPj4+ICvC oMKgwqDCoMKgwqDCoCBfX2xlMzIgaWRlbnRpZmllcjsNCj4+PiArwqDCoMKgwqDCoMKgwqAgX19s ZTMyIGZsYWdzOw0KPj4+ICvCoMKgwqAgfSAqdHg7DQo+Pj4gKw0KPj4NCj4+IERpdHRvLg0KPj4N Cj4+PiArwqDCoMKgIGlmICghaGFuZGxlIHx8IHR5cGUgPT0gRlVOQ1RJT05fVFlQRSkNCj4+PiAr wqDCoMKgwqDCoMKgwqAgcmV0dXJuIC1FSU5WQUw7DQo+Pj4gKw0KPj4+ICvCoMKgwqAgcmV0ID0g c2NtaV9waW5jdHJsX3ZhbGlkYXRlX2lkKGhhbmRsZSwgaWRlbnRpZmllciwgdHlwZSk7DQo+Pj4g K8KgwqDCoCBpZiAocmV0KQ0KPj4+ICvCoMKgwqDCoMKgwqDCoCByZXR1cm4gcmV0Ow0KPj4+ICsN Cj4+PiArwqDCoMKgIHJldCA9IHNjbWlfeGZlcl9nZXRfaW5pdChoYW5kbGUsIFBJTkNUUkxfUkVR VUVTVCwgDQo+Pj4gU0NNSV9QUk9UT0NPTF9QSU5DVFJMLA0KPj4+ICvCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoCBzaXplb2YoKnR4KSwgMCwgJnQpOw0KPj4+ICsNCj4+PiArwqDCoMKg IHR4ID0gdC0+dHguYnVmOw0KPj4+ICvCoMKgwqAgdHgtPmlkZW50aWZpZXIgPSBpZGVudGlmaWVy Ow0KPj4+ICvCoMKgwqAgdHgtPmZsYWdzID0gU0VUX1RZUEUoY3B1X3RvX2xlMzIodHlwZSkpOw0K Pj4+ICsNCj4+PiArwqDCoMKgIHJldCA9IHNjbWlfZG9feGZlcihoYW5kbGUsIHQpOw0KPj4+ICvC oMKgwqAgc2NtaV94ZmVyX3B1dChoYW5kbGUsIHQpOw0KPj4+ICsNCj4+PiArwqDCoMKgIHJldHVy biByZXQ7DQo+Pj4gK30NCj4+PiArDQo+Pj4gK3N0YXRpYyBpbnQgc2NtaV9waW5jdHJsX3JlcXVl c3RfcGluKGNvbnN0IHN0cnVjdCBzY21pX2hhbmRsZSANCj4+PiAqaGFuZGxlLCB1MzIgcGluKQ0K Pj4+ICt7DQo+Pj4gK8KgwqDCoCByZXR1cm4gc2NtaV9waW5jdHJsX3JlcXVlc3QoaGFuZGxlLCBw aW4sIFBJTl9UWVBFKTsNCj4+PiArfQ0KPj4+ICsNCj4+PiArc3RhdGljIGludCBzY21pX3BpbmN0 cmxfZnJlZShjb25zdCBzdHJ1Y3Qgc2NtaV9oYW5kbGUgKmhhbmRsZSwgdTMyIA0KPj4+IGlkZW50 aWZpZXIsDQo+Pj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGVudW0gc2NtaV9w aW5jdHJsX3NlbGVjdG9yX3R5cGUgdHlwZSkNCj4+PiArew0KPj4+ICvCoMKgwqAgc3RydWN0IHNj bWlfeGZlciAqdDsNCj4+PiArwqDCoMKgIGludCByZXQ7DQo+Pj4gK8KgwqDCoCBzdHJ1Y3Qgc2Nt aV9yZXF1ZXN0X3R4IHsNCj4+PiArwqDCoMKgwqDCoMKgwqAgX19sZTMyIGlkZW50aWZpZXI7DQo+ Pj4gK8KgwqDCoMKgwqDCoMKgIF9fbGUzMiBmbGFnczsNCj4+PiArwqDCoMKgIH0gKnR4Ow0KPj4+ ICsNCj4+IERpdHRvLg0KPj4NCj4+PiArwqDCoMKgIGlmICghaGFuZGxlIHx8IHR5cGUgPT0gRlVO Q1RJT05fVFlQRSkNCj4+PiArwqDCoMKgwqDCoMKgwqAgcmV0dXJuIC1FSU5WQUw7DQo+Pj4gKw0K Pj4+ICvCoMKgwqAgcmV0ID0gc2NtaV9waW5jdHJsX3ZhbGlkYXRlX2lkKGhhbmRsZSwgaWRlbnRp ZmllciwgdHlwZSk7DQo+Pj4gK8KgwqDCoCBpZiAocmV0KQ0KPj4+ICvCoMKgwqDCoMKgwqDCoCBy ZXR1cm4gcmV0Ow0KPj4+ICsNCj4+PiArwqDCoMKgIHJldCA9IHNjbWlfeGZlcl9nZXRfaW5pdCho YW5kbGUsIFBJTkNUUkxfUkVMRUFTRSwgDQo+Pj4gU0NNSV9QUk9UT0NPTF9QSU5DVFJMLA0KPj4+ ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBzaXplb2YoKnR4KSwgMCwgJnQpOw0K Pj4+ICsNCj4+PiArwqDCoMKgIHR4ID0gdC0+dHguYnVmOw0KPj4+ICvCoMKgwqAgdHgtPmlkZW50 aWZpZXIgPSBpZGVudGlmaWVyOw0KPj4+ICvCoMKgwqAgdHgtPmZsYWdzID0gU0VUX1RZUEUoY3B1 X3RvX2xlMzIodHlwZSkpOw0KPj4+ICsNCj4+PiArwqDCoMKgIHJldCA9IHNjbWlfZG9feGZlciho YW5kbGUsIHQpOw0KPj4+ICvCoMKgwqAgc2NtaV94ZmVyX3B1dChoYW5kbGUsIHQpOw0KPj4+ICsN Cj4+PiArwqDCoMKgIHJldHVybiByZXQ7DQo+Pj4gK30NCj4+PiArDQo+Pj4gK3N0YXRpYyBpbnQg c2NtaV9waW5jdHJsX2ZyZWVfcGluKGNvbnN0IHN0cnVjdCBzY21pX2hhbmRsZSAqaGFuZGxlLCAN Cj4+PiB1MzIgcGluKQ0KPj4+ICt7DQo+Pj4gK8KgwqDCoCByZXR1cm4gc2NtaV9waW5jdHJsX2Zy ZWUoaGFuZGxlLCBwaW4sIFBJTl9UWVBFKTsNCj4+PiArfQ0KPj4+ICsNCj4+PiArDQo+Pj4gK3N0 YXRpYyBpbnQgc2NtaV9waW5jdHJsX2dldF9ncm91cF9pbmZvKGNvbnN0IHN0cnVjdCBzY21pX2hh bmRsZSANCj4+PiAqaGFuZGxlLA0KPj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoCB1MzIgc2VsZWN0b3IsDQo+Pj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgIHN0cnVjdCBzY21pX2dyb3VwX2luZm8gKmdyb3VwKQ0KPj4+ ICt7DQo+Pj4gK8KgwqDCoCBpbnQgcmV0ID0gMDsNCj4+PiArwqDCoMKgIHN0cnVjdCBzY21pX3Bp bmN0cmxfaW5mbyAqcGk7DQo+Pj4gKw0KPj4+ICvCoMKgwqAgaWYgKCFoYW5kbGUgfHwgIWhhbmRs ZS0+cGluY3RybF9wcml2IHx8ICFncm91cCkNCj4+PiArwqDCoMKgwqDCoMKgwqAgcmV0dXJuIC1F SU5WQUw7DQo+Pj4gKw0KPj4+ICvCoMKgwqAgcGkgPSBoYW5kbGUtPnBpbmN0cmxfcHJpdjsNCj4+ PiArDQo+Pj4gK8KgwqDCoCByZXQgPSBzY21pX3BpbmN0cmxfYXR0cmlidXRlcyhoYW5kbGUsIEdS T1VQX1RZUEUsIHNlbGVjdG9yLA0KPj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqAgJmdyb3VwLT5uYW1lLA0KPj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqAgJmdyb3VwLT5ucl9waW5zKTsNCj4+PiArwqDCoMKgIGlmIChyZXQp DQo+Pj4gK8KgwqDCoMKgwqDCoMKgIHJldHVybiByZXQ7DQo+Pj4gKw0KPj4+ICvCoMKgwqAgaWYg KCFncm91cC0+bnJfcGlucykgew0KPj4+ICvCoMKgwqDCoMKgwqDCoCBkZXZfZXJyKGhhbmRsZS0+ ZGV2LCAiR3JvdXAgJWQgaGFzIDAgZWxlbWVudHMiLCBzZWxlY3Rvcik7DQo+Pj4gK8KgwqDCoMKg wqDCoMKgIHJldHVybiAtRU5PREFUQTsNCj4+PiArwqDCoMKgIH0NCj4+PiArDQo+Pj4gK8KgwqDC oCBncm91cC0+Z3JvdXBfcGlucyA9IGRldm1fa21hbGxvY19hcnJheShoYW5kbGUtPmRldiwgDQo+ Pj4gZ3JvdXAtPm5yX3BpbnMsDQo+Pj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqAgc2l6ZW9mKCpncm91cC0+Z3JvdXBfcGlucyksDQo+Pj4gK8Kg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgR0ZQX0tF Uk5FTCk7DQo+Pg0KPj4gSSB0aGluayB5b3UgY2FuIGp1c3QgdXNlIGZvciB0aGUgYXJyYXkgYWxs b2NhdGlvbg0KPj4NCj4+IMKgwqDCoMKgZGV2bV9rY2FsbG9jKGRldiwgbiwgc2l6ZSwgZmxhZ3Mp DQo+Pg0KPj4gYW5kIGl0IHdpbGwgYWRkIGFsc28gX19HRlBfWkVSTyBpbnRlcm5hbGx5IHRvIGNs ZWFyIGl0Lg0KPj4gKGluZGVlZCBpdCBjYWxscyBpbiB0dXJuIGRldm1fa21hbGxvY19hcnJheSkN Cj4+DQo+PiAuLi5CVVQgSSB0aGluayB0aGVyZSBpcyBhIGZ1cnRoZXIgdHJpY2t5IGlzc3VlIGhl cmUgcmVsYXRlZCB0byBtZW1vcnkgDQo+PiBhbGxvY2F0aW9uLi4uDQo+Pg0KPj4gWW91IGNhbGwg dGhpcyBhbmQgb3RoZXJzIGZ1bmN0aW9uIG9mIHRoaXMga2luZCBmcm9tIHNvbWUgDQo+PiBzY21p X3BpbmN0cmxfb3BzLA0KPj4gbGlrZSBpbiBzY21pX3BpbmN0cmxfZ2V0X2dyb3VwX3BpbnMgKHNj bWlfcGluY3RybF9vcHMtPmdldF9ncm91cF9waW5zKSwNCj4+IGFuZCB0aGVuIHRoaXMgaXMgaW4g dHVybiBjYWxsZWQgYnkgdGhlIFNDTUkgUGluY3RybCBkcml2ZXIgdmlhDQo+PiBwaW5jdHJsX29w cy0+Z2V0X2dyb3VwX3BpbnMgQU5EIHlvdSBzZXQgYSBwcmVzZW50IGZsYWcgc28gdGhhdCB5b3Ug DQo+PiBpc3N1ZSBhDQo+PiBQSU5DVFJMX0xJU1RfQVNTT0NJQVRJT05TIGFuZCBhbGxvY2F0ZSBo ZXJlIGEgbmV3IGdyb3VwX3BpbnMgYXJyYXkganVzdA0KPj4gdGhlIGZpcnN0IHRpbWU6IGJ1dCB0 aGVzZSBhcmUgbmV2ZXIgcmVsZWFzZWQgYW55d2hlcmUsIHNpbmNlLCBldmVuIA0KPj4gdGhvdWdo DQo+PiBsYXppbHkgZHluYW1pY2FsbHkgYWxsb2NhdGVkIHdoZW4gYXNrZWQgZm9yLCB0aGVzZSBh cmUgc3RhdGljIGRhdGEgdGhhdA0KPj4geW91IHBhc3MgdG8gdGhlIGNhbGxlci91c2VyIG9mIHRo aXMgcHJvdG9jb2wgYW5kIHNvIHlvdSBjYW5ub3QgcmVsZWFzZQ0KPj4gdGhlbSBhbnl0aW1lIHNv b24sIGluZGVlZC4NCj4+DQo+PiBUaGUgY29yZSBTQ01JIHN0YWNrIHVzdWFsbHkgdGFrZXMgY2Fy ZSB0byB0cmFjayBhbmQgcmVsZWFzZSBhbGwgdGhlIA0KPj4gZGV2bV8NCj4+IHJlc291cmNlcyBh bGxvY2F0ZWQgYnkgdGhlIHByb3RvY29sIE9OTFkgaWYgdGhleSB3ZXJlIGFsbG9jYXRlZCB3aXRo IA0KPj4gZGV2cmVzDQo+PiB3aGlsZSBpbnNpZGUgc2NtaV9waW5jdHJsX3Byb3RvY29sX2luaXQo KSBmdW5jdGlvbi4NCj4+IChzZWUgDQo+PiBkcml2ZXJzL2Zpcm13YXJlL2FybS1zY21pL2RyaXZl ci5jOnNjbWlfYWxsb2NfaW5pdF9wcm90b2NvbF9pbnN0YW5jZSgpDQo+PiDCoCBhbmQgc2NtaV9w cm90b2NvbF9yZWxlYXNlKQ0KPj4NCj4+IEJVVCB5b3UgZG8gbm90IGFsbG9jYXRlIHRoZXNlIGFy cmF5cyBpbnNpZGUgdGhlIHByb3RvY29sLWluaXQgZnVuY3Rpb24sDQo+PiB5b3UgYWxsb2NhdGUg dGhlbSB0aGUgZmlyc3QgdGltZSB0aGVzZSBvcHMgYXJlIGNhbGxlZCBhdCBydW50aW1lLg0KPj4N Cj4+IElmIHlvdSB1bmJpbmQvdW5sb2FkIGFsbCB0aGUgZHJpdmVycyB1c2luZyB0aGlzIHByb3Rv Y29sIGFuZCB0aGVuIHJlbG9hZA0KPj4gdGhlbSwgYWxsIHRoZSBkZXZtXyBhbGxvY2F0aW9ucyBp biBwcm90b2NvbF9pbml0IHdpbGwgYmUgZnJlZWQgYW5kDQo+PiByZWFsbG9jYXRlZCBCVVQgdGhl c2UgYXJyYXlzIHdpbGwgbmV2ZXIgYmUgZnJlZWQgKHRoZXkgYXJlIGJvdWRuIHRvIA0KPj4gaGFu ZGxlLT5kZXYpDQo+PiBhbmQgaW5zdGVhZCB0aGV5IHdpbGwgYmUgcmVhbGxvY2F0ZWQgbXVsdGlw bGUgdGltZXMgKHByZXNlbnQgZmxhZyANCj4+IHdpbGwgYmUgY2xlYXJlZA0KPj4gb24gdW5sb2Fk KSwgcmVtYWluZWQgdW51c2VkIGFuZCBmcmVlZCBmaW5hbGx5IG9ubHkgd2hlbiB0aGUgd2hvbGUg DQo+PiBTQ01JIHN0YWNrIGlzDQo+PiB1bmJpbmQvdW5sb2FkZWQuDQo+Pg0KPj4gWW91IHVzZSBh IHByZXNlbnQgZmxhZyB0byBhdm9pZCByZWlzc3VpbmcgdGhlIHNhbWUgcXVlcnkgYW5kDQo+PiBy ZWFsbG9jYXRpbmcgYWxsIHRoZSBhcnJheXMgZWFjaCB0aW1lIGEgZHJpdmVyIGNhbGxzIHRoZXNl DQo+PiBwcm90b2NvbF9vcHMgb25lLCBidXQgcmVhbGx5IGFsbCB0aGVzZSBkYXRhIGlzIGF2YWls YWJsZSBlYXJseSBvbiBhdA0KPj4gcHJvdG9jb2wgaW5pdCB0aW1lIGFuZCB0aGV5IGFyZSBub3Qg c3VwcG9zZWQgdG8gY2hhbmdlIGF0IHJ1bnRpbWUsIA0KPj4gZG9udCB0aGV5ID8NCj4+DQo+PiBF dmVuIGluIGEgdmlydHVhbGl6ZWQgZW52aXJvbm1lbnQsIHlvdSBib290IGFuIGFnZW50IGFuZCB0 aGUgU0NNSQ0KPj4gcGxhdGZvcm0gc2VydmVyIHByb3ZpZGVzIHRvIHRoZSBhZ2VudCB0aGUgbGlz dCBvZiBhc3NvY2lhdGlvbnMgd2hlbg0KPj4gcXVlcmllZCBidXQgdGhlbiB0aGlzIGRvZXMgbm90 IGNoYW5nZSB1bnRpbCB0aGUgbmV4dCByZWJvb3QgcmlnaHQgPw0KPj4gKGluZGVlZCB5b3UgZG8g bm90IHF1ZXJ5IG1vcmUgdGhhbiBvbmNlLi4uKQ0KPj4NCj4+IFRoZSBhZ2VudCBjYW4gb25seSBj aGFuZ2UgdGhlIFBJTiBzdGF0dXMgd2l0aCBDT05GSUdfU0VUIG9yDQo+PiBGVU5DVElPTl9TRUxF Q1Qgb3IgUkVRVUVTVCB0aGUgZXhjbHVzaXZlIHVzZSBvZiBhIHBpbi9ncm91cCwgYnV0IGl0IGlz DQo+PiBub3QgdGhhdCB0aGUgcGxhdGZvcm0gY2FuIGNoYW5nZSB0aGUgcGluL2dyb3VwcyBhc3Nv Y2lhaW9uIGZvciB0aGUgc2FtZQ0KPj4gYWdlbnQgYXQgcnVuIHRpbWUsIHRoaXMgYXJlIHN0YXRp YyBkYXRhIGZvciB0aGUgd2hvbGUgbGlmZSBvZiB0aGUgYWdlbnQuDQo+Pg0KPj4gQW0gSSByaWdo dCA/DQo+Pg0KPj4gSU9XIEkgdGhpbmsgdGhlcmUgaXMgc29tZSBwb3RlbnRpYWwgbWVtb3J5IGxl YWsgb24gdW5iaW5kL2JpbmQgYW5kIGl0IA0KPj4gd291bGQNCj4+IGJlIGJldHRlciB0byBxdWVy eSBhbmQgYWxsb2NhdGUgYWxsIG9mIHRoZXNlIHJlc291cmNlcyBhdCBpbml0IHRpbWUgDQo+PiBh bmQga2VlcA0KPj4gdGhlbSByZWFkeSB0byBiZSByZXRyaWV2ZWQgYnkgc3Vic2VxdWVudCBvcGVy YXRpb25zLCBzaW5jZSB0aGUgbGlmZXRpbWUNCj4+IG9mIHRoZXNlIHJlc291cmNlcyBpcyBwcmV0 dHkgbG9uZyBhbmQgdGhleSBhcmUgYmFzaWNhbGx5IHJlcHJlc2VudGluZw0KPj4gc3RhdGljIGRh dGEgdGhhdCBkb2VzIG5vdCBjaGFuZ2UgYWZ0ZXIgdGhlIGluaXQvcHJvYmUgcGhhc2VzLg0KPj4N Cj4+IEluZGVlZCwgYWxsIHRoZSBvdGhlciBwcm90b2NvbHMgdXN1YWxseSBhbGxvY2F0ZSBhbGwg dGhlIG5lZWRlZA0KPj4gcmVzb3VyY2VzIGFuZCBxdWVyeSBhbGwgdGhlIGF2YWlsYWJsZSBTQ01J IHJlc291cmNlcyBvbmNlIGZvciBhbGwgZHVyaW5nDQo+PiB0aGUgcHJvdG9jb2xfaW5pdCwgc3Rv cmluZyBhbGwgdGhlIHJldHJpZXZlZCBpbmZvIGluIHNvbWUgc3RydWN0ICpfaW5mbw0KPj4gZXhw b3NlZCBpbiBzY21pX3Byb3RvY29sLmggYW5kIHRoZW4gcHJvdmlkZSBzb21lIHJlbGF0ZWQgcHJv dG9jb2xfb3BzIHRvDQo+PiBnZXQgdGhlIG51bWJlciBvZiByZXNvdXJjZXMgYW5kIHRvIHJldHJp ZXZlIHNwZWNpZmljIGRvbWFpbiBpbmZvIA0KPj4gZGVzY3JpcHRvcnMuDQo+PiAodm9sdGFnZS5j IGlzIGFuIGV4YW1wbGUgYW5kIG1vcmUgb24gdGhpcyBkb3duIGJlbG93Li4uKQ0KPj4NCj4+IFRo aXMgd2F5LCBhbnkgZHluYW1pYyBhbGxvY2F0aW9uIGlzIGRvbmUgZHVyaW5nIHByb3RvY29sX2lu aXQsIHNvDQo+PiBpdCBjYW4gYmUgYXV0b21hdGljYWxseSBmcmVlZCBieSB0aGUgU0NNSSBjb3Jl IG9uY2UgdGhlcmUgYXJlIG5vIG1vcmUNCj4+IHVzZXJzIG9mIHRoYXQgcHJvdG9jb2wsIGFuZCBh bGwgb2YgdGhpcyBzdGF0aWMgaW5mbyBkYXRhIGlzIHF1ZXJpZWQNCj4+IGFuZCByZXRyaWV2ZWQg b25jZSBmb3IgYWxsIGF0IHByb3RvY29sIGluaXRpYWxpemF0aW9uIHRpbWUsIGF2b2lkaW5nDQo+ PiB1bm5lZWRlZCBtZXNzYWdlIGV4Y2hhbmdlcyB0byByZXRyaWV2ZSBhbHdheXMgdGhlIHNhbWUg ZGF0YS4NCj4+ICh3aGljaCB5b3UgYXZvaWQgYW55d2F5IHdpdGggdGhlIHByZXNlbnQgZmxhZykN Cj4+DQo+PiBJZiB5b3UgaGF2ZSBhIGdvb2QgcmVhc29uIHRvIGluc3RlYWQgcGVyZm9ybSB0aGlz IHNvcnQgb2YgbGF6eQ0KPj4gYWxsb2NhdGlvbi9xdWVyeSBwZXJmb3JtZWQgb25seSBhdCB0aGUg bGFzdCBtaW51dGUgd2hlbiBzb21lb25lIGFzayBmb3INCj4+IHRoYXQgc3BlY2lmaWMgcmVzb3Vy Y2UsIHlvdSB3aWxswqAgaGF2ZSB0byBwcm92aWRlIGFsc28gYSANCj4+IC5pbnN0YW5jZV9kZWlu aXQNCj4+IGZ1bmN0aW9uIHRvIGNsZWFuIGFueXRoaW5nIHlvdSBhbGxvY2F0ZWQgb3V0IG9mIHRo ZSAuaW5zdGFuY2VfaW5pdA0KPj4gcm91dGluZTsgYnV0IHRoaXMgd291bGQgc2VlbSBzdHJhbmdl IHRvIG1lIHNpbmNlIGFueSByZXNvdXJjZSB0aGF0IGlzDQo+PiBkaXNjb3ZlcmVkIGF0IGluaXQg d2lsbCBiZSBldmVudHVhbGx5IGltbWVkaWF0ZWx5IHF1ZXJpZWQgYnkgYSBkcml2ZXINCj4+IHdo aWNoIHVzZXMgdGhpcyBwcm90b2NvbC4uLmFtIEkgbWlzc2luZyBzb21ldGhpbmcgPw0KPj4NCj4+ PiArwqDCoMKgIGlmICghZ3JvdXAtPmdyb3VwX3BpbnMpIHsNCj4+PiArwqDCoMKgwqDCoMKgwqAg cmV0ID0gLUVOT01FTTsNCj4+PiArwqDCoMKgwqDCoMKgwqAgZ290byBlcnI7DQo+Pj4gK8KgwqDC oCB9DQo+Pj4gKw0KPj4+ICvCoMKgwqAgcmV0ID0gc2NtaV9waW5jdHJsX2xpc3RfYXNzb2NpYXRp b25zKGhhbmRsZSwgc2VsZWN0b3IsIEdST1VQX1RZUEUsDQo+Pj4gK8KgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBncm91cC0+bnJfcGlucywgZ3JvdXAtPmdy b3VwX3BpbnMpOw0KPj4+ICvCoMKgwqAgaWYgKHJldCkNCj4+PiArwqDCoMKgwqDCoMKgwqAgZ290 byBlcnJfZ3JvdXBzOw0KPj4+ICsNCj4+PiArwqDCoMKgIGdyb3VwLT5wcmVzZW50ID0gdHJ1ZTsN Cj4+PiArwqDCoMKgIHJldHVybiAwOw0KPj4+ICsNCj4+PiArIGVycl9ncm91cHM6DQo+Pj4gK8Kg wqDCoCBrZnJlZShncm91cC0+Z3JvdXBfcGlucyk7DQo+Pj4gKyBlcnI6DQo+Pj4gK8KgwqDCoCBr ZnJlZShncm91cC0+bmFtZSk7DQo+Pj4gK8KgwqDCoCByZXR1cm4gcmV0Ow0KPj4+ICt9DQo+Pj4g Kw0KPj4+ICtzdGF0aWMgaW50IHNjbWlfcGluY3RybF9nZXRfZ3JvdXBfbmFtZShjb25zdCBzdHJ1 Y3Qgc2NtaV9oYW5kbGUgDQo+Pj4gKmhhbmRsZSwNCj4+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgdTMyIHNlbGVjdG9yLCBjb25zdCBjaGFyICoqbmFtZSkN Cj4+PiArew0KPj4+ICvCoMKgwqAgaW50IHJldDsNCj4+PiArwqDCoMKgIHN0cnVjdCBzY21pX3Bp bmN0cmxfaW5mbyAqcGk7DQo+Pj4gKw0KPj4+ICvCoMKgwqAgaWYgKCFoYW5kbGUgfHwgIWhhbmRs ZS0+cGluY3RybF9wcml2IHx8ICFuYW1lKQ0KPj4+ICvCoMKgwqDCoMKgwqDCoCByZXR1cm4gLUVJ TlZBTDsNCj4+PiArDQo+Pj4gK8KgwqDCoCBwaSA9IGhhbmRsZS0+cGluY3RybF9wcml2Ow0KPj4+ ICsNCj4+PiArwqDCoMKgIGlmIChzZWxlY3RvciA+IHBpLT5ucl9ncm91cHMpDQo+Pj4gK8KgwqDC oMKgwqDCoMKgIHJldHVybiAtRUlOVkFMOw0KPj4+ICsNCj4+PiArwqDCoMKgIGlmICghcGktPmdy b3Vwc1tzZWxlY3Rvcl0ucHJlc2VudCkgew0KPj4+ICvCoMKgwqDCoMKgwqDCoCByZXQgPSBzY21p X3BpbmN0cmxfZ2V0X2dyb3VwX2luZm8oaGFuZGxlLCBzZWxlY3RvciwNCj4+PiArwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgJnBpLT5ncm91cHNbc2Vs ZWN0b3JdKTsNCj4+PiArwqDCoMKgwqDCoMKgwqAgaWYgKHJldCkNCj4+PiArwqDCoMKgwqDCoMKg wqDCoMKgwqDCoCByZXR1cm4gcmV0Ow0KPj4+ICvCoMKgwqAgfQ0KPj4+ICsNCj4+PiArwqDCoMKg ICpuYW1lID0gcGktPmdyb3Vwc1tzZWxlY3Rvcl0ubmFtZTsNCj4+PiArDQo+Pj4gK8KgwqDCoCBy ZXR1cm4gMDsNCj4+PiArfQ0KPj4+ICsNCj4+PiArc3RhdGljIGludCBzY21pX3BpbmN0cmxfZ2V0 X2dyb3VwX3BpbnMoY29uc3Qgc3RydWN0IHNjbWlfaGFuZGxlIA0KPj4+ICpoYW5kbGUsDQo+Pj4g K8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHUzMiBzZWxlY3Rv ciwgY29uc3QgdW5zaWduZWQgaW50ICoqcGlucywNCj4+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgdW5zaWduZWQgaW50ICpucl9waW5zKQ0KPj4+ICt7DQo+ Pj4gK8KgwqDCoCBpbnQgcmV0Ow0KPj4+ICvCoMKgwqAgc3RydWN0IHNjbWlfcGluY3RybF9pbmZv ICpwaTsNCj4+PiArDQo+Pj4gK8KgwqDCoCBpZiAoIWhhbmRsZSB8fCAhaGFuZGxlLT5waW5jdHJs X3ByaXYgfHwgIXBpbnMgfHwgIW5yX3BpbnMpDQo+Pj4gK8KgwqDCoMKgwqDCoMKgIHJldHVybiAt RUlOVkFMOw0KPj4+ICsNCj4+PiArwqDCoMKgIHBpID0gaGFuZGxlLT5waW5jdHJsX3ByaXY7DQo+ Pj4gKw0KPj4+ICvCoMKgwqAgaWYgKHNlbGVjdG9yID4gcGktPm5yX2dyb3VwcykNCj4+PiArwqDC oMKgwqDCoMKgwqAgcmV0dXJuIC1FSU5WQUw7DQo+Pj4gKw0KPj4+ICvCoMKgwqAgaWYgKCFwaS0+ Z3JvdXBzW3NlbGVjdG9yXS5wcmVzZW50KSB7DQo+Pj4gK8KgwqDCoMKgwqDCoMKgIHJldCA9IHNj bWlfcGluY3RybF9nZXRfZ3JvdXBfaW5mbyhoYW5kbGUsIHNlbGVjdG9yLA0KPj4+ICvCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCAmcGktPmdyb3Vwc1tz ZWxlY3Rvcl0pOw0KPj4+ICvCoMKgwqDCoMKgwqDCoCBpZiAocmV0KQ0KPj4+ICvCoMKgwqDCoMKg wqDCoMKgwqDCoMKgIHJldHVybiByZXQ7DQo+Pj4gK8KgwqDCoCB9DQo+Pj4gKw0KPj4+ICvCoMKg wqAgKnBpbnMgPSBwaS0+Z3JvdXBzW3NlbGVjdG9yXS5ncm91cF9waW5zOw0KPj4+ICvCoMKgwqAg Km5yX3BpbnMgPSBwaS0+Z3JvdXBzW3NlbGVjdG9yXS5ucl9waW5zOw0KPj4+ICsNCj4+PiArwqDC oMKgIHJldHVybiByZXQ7DQo+Pj4gK30NCj4+PiArDQo+Pj4gK3N0YXRpYyBpbnQgc2NtaV9waW5j dHJsX2dldF9mdW5jdGlvbl9pbmZvKGNvbnN0IHN0cnVjdCBzY21pX2hhbmRsZSANCj4+PiAqaGFu ZGxlLA0KPj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgdTMy IHNlbGVjdG9yLA0KPj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqAgc3RydWN0IHNjbWlfZnVuY3Rpb25faW5mbyAqZnVuYykNCj4+PiArew0KPj4+ICvCoMKgwqAg aW50IHJldCA9IDA7DQo+Pj4gK8KgwqDCoCBzdHJ1Y3Qgc2NtaV9waW5jdHJsX2luZm8gKnBpOw0K Pj4+ICsNCj4+PiArwqDCoMKgIGlmICghaGFuZGxlIHx8ICFoYW5kbGUtPnBpbmN0cmxfcHJpdiB8 fCAhZnVuYykNCj4+PiArwqDCoMKgwqDCoMKgwqAgcmV0dXJuIC1FSU5WQUw7DQo+Pj4gKw0KPj4+ ICvCoMKgwqAgcGkgPSBoYW5kbGUtPnBpbmN0cmxfcHJpdjsNCj4+PiArDQo+Pj4gK8KgwqDCoCBy ZXQgPSBzY21pX3BpbmN0cmxfYXR0cmlidXRlcyhoYW5kbGUsIEZVTkNUSU9OX1RZUEUsIHNlbGVj dG9yLA0KPj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgJmZ1 bmMtPm5hbWUsDQo+Pj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oCAmZnVuYy0+bnJfZ3JvdXBzKTsNCj4+PiArwqDCoMKgIGlmIChyZXQpDQo+Pj4gK8KgwqDCoMKg wqDCoMKgIHJldHVybiByZXQ7DQo+Pj4gKw0KPj4+ICvCoMKgwqAgaWYgKCFmdW5jLT5ucl9ncm91 cHMpIHsNCj4+PiArwqDCoMKgwqDCoMKgwqAgZGV2X2VycihoYW5kbGUtPmRldiwgIkZ1bmN0aW9u ICVkIGhhcyAwIGVsZW1lbnRzIiwgc2VsZWN0b3IpOw0KPj4+ICvCoMKgwqDCoMKgwqDCoCByZXR1 cm4gLUVOT0RBVEE7DQo+Pj4gK8KgwqDCoCB9DQo+Pj4gKw0KPj4+ICvCoMKgwqAgZnVuYy0+Z3Jv dXBzID0gZGV2bV9rbWFsbG9jX2FycmF5KGhhbmRsZS0+ZGV2LCBmdW5jLT5ucl9ncm91cHMsDQo+ Pj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBzaXplb2YoKmZ1 bmMtPmdyb3VwcyksDQo+Pj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoCBHRlBfS0VSTkVMKTsNCj4+PiArwqDCoMKgIGlmICghZnVuYy0+Z3JvdXBzKSB7DQo+Pj4g K8KgwqDCoMKgwqDCoMKgIHJldCA9IC1FTk9NRU07DQo+Pj4gK8KgwqDCoMKgwqDCoMKgIGdvdG8g ZXJyOw0KPj4+ICvCoMKgwqAgfQ0KPj4+ICsNCj4+PiArwqDCoMKgIHJldCA9IHNjbWlfcGluY3Ry bF9saXN0X2Fzc29jaWF0aW9ucyhoYW5kbGUsIHNlbGVjdG9yLCANCj4+PiBGVU5DVElPTl9UWVBF LA0KPj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAg ZnVuYy0+bnJfZ3JvdXBzLCBmdW5jLT5ncm91cHMpOw0KPj4+ICvCoMKgwqAgaWYgKHJldCkNCj4+ PiArwqDCoMKgwqDCoMKgwqAgZ290byBlcnJfZnVuY3M7DQo+Pj4gKw0KPj4+ICvCoMKgwqAgZnVu Yy0+cHJlc2VudCA9IHRydWU7DQo+Pj4gK8KgwqDCoCByZXR1cm4gMDsNCj4+PiArDQo+Pj4gKyBl cnJfZnVuY3M6DQo+Pj4gK8KgwqDCoCBrZnJlZShmdW5jLT5ncm91cHMpOw0KPj4+ICsgZXJyOg0K Pj4+ICvCoMKgwqAga2ZyZWUoZnVuYy0+bmFtZSk7DQo+Pj4gK8KgwqDCoCByZXR1cm4gcmV0Ow0K Pj4+ICt9DQo+Pj4gKw0KPj4+ICtzdGF0aWMgaW50IHNjbWlfcGluY3RybF9nZXRfZnVuY3Rpb25f bmFtZShjb25zdCBzdHJ1Y3Qgc2NtaV9oYW5kbGUgDQo+Pj4gKmhhbmRsZSwNCj4+PiArwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHUzMiBzZWxlY3RvciwgY29uc3Qg Y2hhciAqKm5hbWUpDQo+Pj4gK3sNCj4+PiArwqDCoMKgIGludCByZXQ7DQo+Pj4gK8KgwqDCoCBz dHJ1Y3Qgc2NtaV9waW5jdHJsX2luZm8gKnBpOw0KPj4+ICsNCj4+PiArwqDCoMKgIGlmICghaGFu ZGxlIHx8ICFoYW5kbGUtPnBpbmN0cmxfcHJpdiB8fCAhbmFtZSkNCj4+PiArwqDCoMKgwqDCoMKg wqAgcmV0dXJuIC1FSU5WQUw7DQo+Pj4gKw0KPj4+ICvCoMKgwqAgcGkgPSBoYW5kbGUtPnBpbmN0 cmxfcHJpdjsNCj4+PiArDQo+Pj4gK8KgwqDCoCBpZiAoc2VsZWN0b3IgPiBwaS0+bnJfZnVuY3Rp b25zKQ0KPj4+ICvCoMKgwqDCoMKgwqDCoCByZXR1cm4gLUVJTlZBTDsNCj4+PiArDQo+Pj4gK8Kg wqDCoCBpZiAoIXBpLT5mdW5jdGlvbnNbc2VsZWN0b3JdLnByZXNlbnQpIHsNCj4+PiArwqDCoMKg wqDCoMKgwqAgcmV0ID0gc2NtaV9waW5jdHJsX2dldF9mdW5jdGlvbl9pbmZvKGhhbmRsZSwgc2Vs ZWN0b3IsDQo+Pj4gKyAmcGktPmZ1bmN0aW9uc1tzZWxlY3Rvcl0pOw0KPj4+ICvCoMKgwqDCoMKg wqDCoCBpZiAocmV0KQ0KPj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHJldHVybiByZXQ7DQo+ Pj4gK8KgwqDCoCB9DQo+Pj4gKw0KPj4+ICvCoMKgwqAgKm5hbWUgPSBwaS0+ZnVuY3Rpb25zW3Nl bGVjdG9yXS5uYW1lOw0KPj4+ICvCoMKgwqAgcmV0dXJuIDA7DQo+Pj4gK30NCj4+PiArDQo+Pj4g K3N0YXRpYyBpbnQgc2NtaV9waW5jdHJsX2dldF9mdW5jdGlvbl9ncm91cHMoY29uc3Qgc3RydWN0 IA0KPj4+IHNjbWlfaGFuZGxlICpoYW5kbGUsDQo+Pj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgdTMyIHNlbGVjdG9yLA0KPj4+ICvCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHVuc2lnbmVkIGludCAqbnJfZ3JvdXBz LA0KPj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGNv bnN0IHVuc2lnbmVkIGludCAqKmdyb3VwcykNCj4+PiArew0KPj4+ICvCoMKgwqAgaW50IHJldDsN Cj4+PiArwqDCoMKgIHN0cnVjdCBzY21pX3BpbmN0cmxfaW5mbyAqcGk7DQo+Pj4gKw0KPj4+ICvC oMKgwqAgaWYgKCFoYW5kbGUgfHwgIWhhbmRsZS0+cGluY3RybF9wcml2IHx8ICFncm91cHMgfHwg IW5yX2dyb3VwcykNCj4+PiArwqDCoMKgwqDCoMKgwqAgcmV0dXJuIC1FSU5WQUw7DQo+Pj4gKw0K Pj4+ICvCoMKgwqAgcGkgPSBoYW5kbGUtPnBpbmN0cmxfcHJpdjsNCj4+PiArDQo+Pj4gK8KgwqDC oCBpZiAoc2VsZWN0b3IgPiBwaS0+bnJfZnVuY3Rpb25zKQ0KPj4+ICvCoMKgwqDCoMKgwqDCoCBy ZXR1cm4gLUVJTlZBTDsNCj4+PiArDQo+Pj4gK8KgwqDCoCBpZiAoIXBpLT5mdW5jdGlvbnNbc2Vs ZWN0b3JdLnByZXNlbnQpIHsNCj4+PiArwqDCoMKgwqDCoMKgwqAgcmV0ID0gc2NtaV9waW5jdHJs X2dldF9mdW5jdGlvbl9pbmZvKGhhbmRsZSwgc2VsZWN0b3IsDQo+Pj4gKyAmcGktPmZ1bmN0aW9u c1tzZWxlY3Rvcl0pOw0KPj4+ICvCoMKgwqDCoMKgwqDCoCBpZiAocmV0KQ0KPj4+ICvCoMKgwqDC oMKgwqDCoMKgwqDCoMKgIHJldHVybiByZXQ7DQo+Pj4gK8KgwqDCoCB9DQo+Pj4gKw0KPj4+ICvC oMKgwqAgKmdyb3VwcyA9IHBpLT5mdW5jdGlvbnNbc2VsZWN0b3JdLmdyb3VwczsNCj4+PiArwqDC oMKgICpucl9ncm91cHMgPSBwaS0+ZnVuY3Rpb25zW3NlbGVjdG9yXS5ucl9ncm91cHM7DQo+Pj4g Kw0KPj4+ICvCoMKgwqAgcmV0dXJuIHJldDsNCj4+PiArfQ0KPj4+ICsNCj4+PiArc3RhdGljIGlu dCBzY21pX3BpbmN0cmxfc2V0X211eChjb25zdCBzdHJ1Y3Qgc2NtaV9oYW5kbGUgKmhhbmRsZSwg DQo+Pj4gdTMyIHNlbGVjdG9yLA0KPj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAg dTMyIGdyb3VwKQ0KPj4+ICt7DQo+Pj4gK8KgwqDCoCByZXR1cm4gc2NtaV9waW5jdHJsX2Z1bmN0 aW9uX3NlbGVjdChoYW5kbGUsIGdyb3VwLCBHUk9VUF9UWVBFLA0KPj4+ICvCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHNlbGVjdG9yKTsNCj4+PiArfQ0KPj4+ ICsNCj4+PiArc3RhdGljIGludCBzY21pX3BpbmN0cmxfZ2V0X3Bpbl9pbmZvKGNvbnN0IHN0cnVj dCBzY21pX2hhbmRsZSAqaGFuZGxlLA0KPj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgIHUzMiBzZWxlY3Rvciwgc3RydWN0IHNjbWlfcGluX2luZm8gKnBpbikNCj4+ PiArew0KPj4+ICvCoMKgwqAgaW50IHJldCA9IDA7DQo+Pj4gK8KgwqDCoCBzdHJ1Y3Qgc2NtaV9w aW5jdHJsX2luZm8gKnBpOw0KPj4+ICvCoMKgwqAgdW5zaWduZWQgaW50IG5fZWxlbXM7DQo+Pj4g Kw0KPj4+ICvCoMKgwqAgaWYgKCFoYW5kbGUgfHwgIWhhbmRsZS0+cGluY3RybF9wcml2IHx8ICFw aW4pDQo+Pj4gK8KgwqDCoMKgwqDCoMKgIHJldHVybiAtRUlOVkFMOw0KPj4+ICsNCj4+PiArwqDC oMKgIHBpID0gaGFuZGxlLT5waW5jdHJsX3ByaXY7DQo+Pj4gKw0KPj4+ICvCoMKgwqAgcmV0ID0g c2NtaV9waW5jdHJsX2F0dHJpYnV0ZXMoaGFuZGxlLCBQSU5fVFlQRSwgc2VsZWN0b3IsDQo+Pj4g K8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCAmcGluLT5uYW1lLA0K Pj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgJm5fZWxlbXMp Ow0KPj4+ICvCoMKgwqAgaWYgKHJldCkNCj4+PiArwqDCoMKgwqDCoMKgwqAgcmV0dXJuIHJldDsN Cj4+PiArDQo+Pj4gK8KgwqDCoCBpZiAobl9lbGVtcyAhPSBwaS0+bnJfcGlucykgew0KPj4+ICvC oMKgwqDCoMKgwqDCoCBkZXZfZXJyKGhhbmRsZS0+ZGV2LCAiV3JvbmcgcGluIGNvdW50IGV4cGVj dGVkICVkIGhhcyAlZCIsDQo+Pj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqAgcGktPm5yX3BpbnMs IG5fZWxlbXMpOw0KPj4+ICvCoMKgwqDCoMKgwqDCoCByZXR1cm4gLUVOT0RBVEE7DQo+Pj4gK8Kg wqDCoCB9DQo+Pj4gKw0KPj4+ICvCoMKgwqAgaWYgKCoocGluLT5uYW1lKSA9PSAwKSB7DQo+Pj4g K8KgwqDCoMKgwqDCoMKgIGRldl9lcnIoaGFuZGxlLT5kZXYsICJQaW4gbmFtZSBpcyBlbXB0eSIp Ow0KPj4+ICvCoMKgwqDCoMKgwqDCoCBnb3RvIGVycjsNCj4+PiArwqDCoMKgIH0NCj4+PiArDQo+ Pj4gK8KgwqDCoCBwaW4tPnByZXNlbnQgPSB0cnVlOw0KPj4+ICvCoMKgwqAgcmV0dXJuIDA7DQo+ Pj4gKw0KPj4+ICsgZXJyOg0KPj4+ICvCoMKgwqAga2ZyZWUocGluLT5uYW1lKTsNCj4+PiArwqDC oMKgIHJldHVybiByZXQ7DQo+Pj4gK30NCj4+PiArDQo+Pj4gK3N0YXRpYyBpbnQgc2NtaV9waW5j dHJsX2dldF9waW5fbmFtZShjb25zdCBzdHJ1Y3Qgc2NtaV9oYW5kbGUgDQo+Pj4gKmhhbmRsZSwg dTMyIHNlbGVjdG9yLA0KPj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgIGNvbnN0IGNoYXIgKipuYW1lKQ0KPj4+ICt7DQo+Pj4gKw0KPj4+ICvCoMKgwqAgaW50IHJl dDsNCj4+PiArwqDCoMKgIHN0cnVjdCBzY21pX3BpbmN0cmxfaW5mbyAqcGk7DQo+Pj4gKw0KPj4+ ICvCoMKgwqAgaWYgKCFoYW5kbGUgfHwgIWhhbmRsZS0+cGluY3RybF9wcml2IHx8ICFuYW1lKQ0K Pj4+ICvCoMKgwqDCoMKgwqDCoCByZXR1cm4gLUVJTlZBTDsNCj4+PiArDQo+Pj4gK8KgwqDCoCBw aSA9IGhhbmRsZS0+cGluY3RybF9wcml2Ow0KPj4+ICsNCj4+PiArwqDCoMKgIGlmIChzZWxlY3Rv ciA+IHBpLT5ucl9waW5zKQ0KPj4+ICvCoMKgwqDCoMKgwqDCoCByZXR1cm4gLUVJTlZBTDsNCj4+ PiArDQo+Pj4gK8KgwqDCoCBpZiAoIXBpLT5waW5zW3NlbGVjdG9yXS5wcmVzZW50KSB7DQo+Pj4g K8KgwqDCoMKgwqDCoMKgIHJldCA9IHNjbWlfcGluY3RybF9nZXRfcGluX2luZm8oaGFuZGxlLCBz ZWxlY3RvciwNCj4+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoCAmcGktPnBpbnNbc2VsZWN0b3JdKTsNCj4+PiArwqDCoMKgwqDCoMKgwqAgaWYgKHJldCkN Cj4+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCByZXR1cm4gcmV0Ow0KPj4+ICvCoMKgwqAgfQ0K Pj4+ICsNCj4+PiArwqDCoMKgICpuYW1lID0gcGktPnBpbnNbc2VsZWN0b3JdLm5hbWU7DQo+Pj4g Kw0KPj4+ICvCoMKgwqAgcmV0dXJuIDA7DQo+Pj4gK30NCj4+PiArDQo+Pj4gKw0KPj4+ICtzdGF0 aWMgY29uc3Qgc3RydWN0IHNjbWlfcGluY3RybF9vcHMgcGluY3RybF9vcHMgPSB7DQo+Pj4gK8Kg wqDCoCAuZ2V0X2dyb3Vwc19jb3VudCA9IHNjbWlfcGluY3RybF9nZXRfZ3JvdXBzX2NvdW50LA0K Pj4+ICvCoMKgwqAgLmdldF9ncm91cF9uYW1lID0gc2NtaV9waW5jdHJsX2dldF9ncm91cF9uYW1l LA0KPj4+ICvCoMKgwqAgLmdldF9ncm91cF9waW5zID0gc2NtaV9waW5jdHJsX2dldF9ncm91cF9w aW5zLA0KPj4+ICvCoMKgwqAgLmdldF9mdW5jdGlvbnNfY291bnQgPSBzY21pX3BpbmN0cmxfZ2V0 X2Z1bmN0aW9uc19jb3VudCwNCj4+PiArwqDCoMKgIC5nZXRfZnVuY3Rpb25fbmFtZSA9IHNjbWlf cGluY3RybF9nZXRfZnVuY3Rpb25fbmFtZSwNCj4+PiArwqDCoMKgIC5nZXRfZnVuY3Rpb25fZ3Jv dXBzID0gc2NtaV9waW5jdHJsX2dldF9mdW5jdGlvbl9ncm91cHMsDQo+Pj4gK8KgwqDCoCAuc2V0 X211eCA9IHNjbWlfcGluY3RybF9zZXRfbXV4LA0KPj4+ICvCoMKgwqAgLmdldF9waW5fbmFtZSA9 IHNjbWlfcGluY3RybF9nZXRfcGluX25hbWUsDQo+Pj4gK8KgwqDCoCAuZ2V0X3BpbnNfY291bnQg PSBzY21pX3BpbmN0cmxfZ2V0X3BpbnNfY291bnQsDQo+Pj4gK8KgwqDCoCAuZ2V0X2NvbmZpZyA9 IHNjbWlfcGluY3RybF9nZXRfY29uZmlnLA0KPj4+ICvCoMKgwqAgLnNldF9jb25maWcgPSBzY21p X3BpbmN0cmxfc2V0X2NvbmZpZywNCj4+PiArwqDCoMKgIC5nZXRfY29uZmlnX2dyb3VwID0gc2Nt aV9waW5jdHJsX2dldF9jb25maWdfZ3JvdXAsDQo+Pj4gK8KgwqDCoCAuc2V0X2NvbmZpZ19ncm91 cCA9IHNjbWlfcGluY3RybF9zZXRfY29uZmlnX2dyb3VwLA0KPj4+ICvCoMKgwqAgLnJlcXVlc3Rf cGluID0gc2NtaV9waW5jdHJsX3JlcXVlc3RfcGluLA0KPj4+ICvCoMKgwqAgLmZyZWVfcGluID0g c2NtaV9waW5jdHJsX2ZyZWVfcGluDQo+Pj4gK307DQo+Pj4gKw0KPj4+ICtzdGF0aWMgaW50IHNj bWlfcGluY3RybF9wcm90b2NvbF9pbml0KHN0cnVjdCBzY21pX2hhbmRsZSAqaGFuZGxlKQ0KPj4+ ICt7DQo+Pj4gK8KgwqDCoCB1MzIgdmVyc2lvbjsNCj4+PiArwqDCoMKgIHN0cnVjdCBzY21pX3Bp bmN0cmxfaW5mbyAqcGluZm87DQo+Pj4gK8KgwqDCoCBpbnQgcmV0Ow0KPj4+ICsNCj4+PiArwqDC oMKgIGlmICghaGFuZGxlKQ0KPj4+ICvCoMKgwqDCoMKgwqDCoCByZXR1cm4gLUVJTlZBTDsNCj4+ PiArDQo+Pj4gK8KgwqDCoCBzY21pX3ZlcnNpb25fZ2V0KGhhbmRsZSwgU0NNSV9QUk9UT0NPTF9Q SU5DVFJMLCAmdmVyc2lvbik7DQo+Pj4gKw0KPj4+ICvCoMKgwqAgZGV2X2RiZyhoYW5kbGUtPmRl diwgIlBpbmN0cmwgVmVyc2lvbiAlZC4lZFxuIiwNCj4+PiArwqDCoMKgwqDCoMKgwqAgUFJPVE9D T0xfUkVWX01BSk9SKHZlcnNpb24pLCBQUk9UT0NPTF9SRVZfTUlOT1IodmVyc2lvbikpOw0KPj4+ ICsNCj4+PiArwqDCoMKgIHBpbmZvID0gZGV2bV9remFsbG9jKGhhbmRsZS0+ZGV2LCBzaXplb2Yo KnBpbmZvKSwgR0ZQX0tFUk5FTCk7DQo+Pj4gK8KgwqDCoCBpZiAoIXBpbmZvKQ0KPj4+ICvCoMKg wqDCoMKgwqDCoCByZXR1cm4gLUVOT01FTTsNCj4+PiArDQo+Pj4gK8KgwqDCoCByZXQgPSBzY21p X3BpbmN0cmxfYXR0cmlidXRlc19nZXQoaGFuZGxlLCBwaW5mbyk7DQo+Pj4gK8KgwqDCoCBpZiAo cmV0KQ0KPj4+ICvCoMKgwqDCoMKgwqDCoCBnb3RvIGZyZWU7DQo+Pj4gKw0KPj4+ICvCoMKgwqAg cGluZm8tPnBpbnMgPSBkZXZtX2ttYWxsb2NfYXJyYXkoaGFuZGxlLT5kZXYsIHBpbmZvLT5ucl9w aW5zLA0KPj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHNpemVv ZigqcGluZm8tPnBpbnMpLA0KPj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgIEdGUF9LRVJORUwgfCBfX0dGUF9aRVJPKTsNCj4+DQo+PiDCoCBkZXZtX2tjYWxsb2Mo KSB6ZXJvZXMgb24gaXRzIG93bg0KPj4NCj4+PiArwqDCoMKgIGlmICghcGluZm8tPnBpbnMpIHsN Cj4+PiArwqDCoMKgwqDCoMKgwqAgcmV0ID0gLUVOT01FTTsNCj4+PiArwqDCoMKgwqDCoMKgwqAg Z290byBmcmVlOw0KPj4+ICvCoMKgwqAgfQ0KPj4+ICsNCj4+PiArwqDCoMKgIHBpbmZvLT5ncm91 cHMgPSBkZXZtX2ttYWxsb2NfYXJyYXkoaGFuZGxlLT5kZXYsIHBpbmZvLT5ucl9ncm91cHMsDQo+ Pj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHNpemVvZigq cGluZm8tPmdyb3VwcyksDQo+Pj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgIEdGUF9LRVJORUwgfCBfX0dGUF9aRVJPKTsNCj4+DQo+PiBEaXR0by4NCj4+PiAr wqDCoMKgIGlmICghcGluZm8tPmdyb3Vwcykgew0KPj4+ICvCoMKgwqDCoMKgwqDCoCByZXQgPSAt RU5PTUVNOw0KPj4+ICvCoMKgwqDCoMKgwqDCoCBnb3RvIGZyZWU7DQo+Pj4gK8KgwqDCoCB9DQo+ Pj4gKw0KPj4+ICvCoMKgwqAgcGluZm8tPmZ1bmN0aW9ucyA9IGRldm1fa21hbGxvY19hcnJheSho YW5kbGUtPmRldiwgDQo+Pj4gcGluZm8tPm5yX2Z1bmN0aW9ucywNCj4+PiArwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgc2l6ZW9mKCpwaW5mby0+ZnVu Y3Rpb25zKSwNCj4+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqAgR0ZQX0tFUk5FTCB8IF9fR0ZQX1pFUk8pOw0KPj4+ICvCoMKgwqAgaWYgKCFwaW5m by0+ZnVuY3Rpb25zKSB7DQo+Pj4gK8KgwqDCoMKgwqDCoMKgIHJldCA9IC1FTk9NRU07DQo+Pj4g K8KgwqDCoMKgwqDCoMKgIGdvdG8gZnJlZTsNCj4+PiArwqDCoMKgIH0NCj4+PiArDQo+Pj4gK8Kg wqDCoCBwaW5mby0+dmVyc2lvbiA9IHZlcnNpb247DQo+Pj4gK8KgwqDCoCBoYW5kbGUtPnBpbmN0 cmxfb3BzID0gJnBpbmN0cmxfb3BzOw0KPj4+ICvCoMKgwqAgaGFuZGxlLT5waW5jdHJsX3ByaXYg PSBwaW5mbzsNCj4+PiArDQo+Pj4gK8KgwqDCoCByZXR1cm4gMDsNCj4+PiArZnJlZToNCj4+PiAr wqDCoMKgIGlmIChwaW5mbykgew0KPj4+ICvCoMKgwqDCoMKgwqDCoCBkZXZtX2tmcmVlKGhhbmRs ZS0+ZGV2LCBwaW5mby0+cGlucyk7DQo+Pj4gK8KgwqDCoMKgwqDCoMKgIGRldm1fa2ZyZWUoaGFu ZGxlLT5kZXYsIHBpbmZvLT5mdW5jdGlvbnMpOw0KPj4+ICvCoMKgwqDCoMKgwqDCoCBkZXZtX2tm cmVlKGhhbmRsZS0+ZGV2LCBwaW5mby0+Z3JvdXBzKTsNCj4+PiArwqDCoMKgIH0NCj4+DQo+PiBU aGVzZSBmcmVlcyBhcmUgcmVhbGx5IG5vdCBuZWVkZWQuLi5pZiB0aGlzIGZ1bmN0aW9uIHJldHVy biBmYWlsdXJlIGFueQ0KPj4gZGV2cmVzIGFsbG9jYXRlZCBpbiBpdCBpcyBmcmVlZCBieSB0aGUg U0NNSSBjb3JlLiAoYXMgc2FpZCBhYm92ZS4uLmluIGENCj4+IHJlY2VudCBrZXJuZWwgd2l0aCB0 aGUgbmV3IEFQSSBvZiBjb3Vyc2UpDQo+Pg0KPj4+ICsNCj4+PiArwqDCoMKgIGRldm1fa2ZyZWUo aGFuZGxlLT5kZXYsIHBpbmZvKTsNCj4+PiArDQo+Pj4gK8KgwqDCoCByZXR1cm4gcmV0Ow0KPj4+ ICt9DQo+Pj4gKw0KPj4+ICtERUZJTkVfU0NNSV9QUk9UT0NPTF9SRUdJU1RFUl9VTlJFR0lTVEVS KFNDTUlfUFJPVE9DT0xfUElOQ1RSTCwgDQo+Pj4gcGluY3RybCkNCj4+PiBkaWZmIC0tZ2l0IGEv ZHJpdmVycy9waW5jdHJsL0tjb25maWcgYi9kcml2ZXJzL3BpbmN0cmwvS2NvbmZpZw0KPj4+IGlu ZGV4IDgxNTA5NTMyNmUyZC4uNjhhZGQ0ZDA2ZThjIDEwMDY0NA0KPj4+IC0tLSBhL2RyaXZlcnMv cGluY3RybC9LY29uZmlnDQo+Pj4gKysrIGIvZHJpdmVycy9waW5jdHJsL0tjb25maWcNCj4+PiBA QCAtNDMxLDQgKzQzMSwxMyBAQCBjb25maWcgUElOQ1RSTF9FUVVJTElCUklVTQ0KPj4+IMKgwqDC oMKgwqDCoMKgIHBpbiBmdW5jdGlvbnMsIGNvbmZpZ3VyZSBHUElPIGF0dHJpYnV0ZXMgZm9yIExH TSBTb0MgcGlucy4gDQo+Pj4gUGlubXV4IGFuZA0KPj4+IMKgwqDCoMKgwqDCoMKgIHBpbmNvbmYg c2V0dGluZ3MgYXJlIHJldHJpZXZlZCBmcm9tIGRldmljZSB0cmVlLg0KPj4+IMKgICtjb25maWcg UElOQ1RSTF9TQ01JDQo+Pj4gK8KgwqDCoCBib29sICJQaW5jdHJsIGRyaXZlciBjb250cm9sbGVk IHZpYSBTQ01JIGludGVyZmFjZSINCj4+PiArwqDCoMKgIGRlcGVuZHMgb24gQVJNX1NDTUlfUFJP VE9DT0wgfHwgQ09NUElMRV9URVNUDQo+Pj4gK8KgwqDCoCBoZWxwDQo+Pj4gK8KgwqDCoMKgwqAg VGhpcyBkcml2ZXIgcHJvdmlkZXMgc3VwcG9ydCBmb3IgcGluY3RybCB3aGljaCBpcyBjb250cm9s bGVkDQo+Pj4gK8KgwqDCoMKgwqAgYnkgZmlybXdhcmUgdGhhdCBpbXBsZW1lbnRzIHRoZSBTQ01J IGludGVyZmFjZS4NCj4+PiArwqDCoMKgwqDCoCBJdCB1c2VzIFNDTUkgTWVzc2FnZSBQcm90b2Nv bCB0byBpbnRlcmFjdCB3aXRoIHRoZQ0KPj4+ICvCoMKgwqDCoMKgIGZpcm13YXJlIHByb3ZpZGlu ZyBhbGwgdGhlIHBpbmN0cmwgY29udHJvbHMuDQo+Pj4gKw0KPj4NCj4+IFRoaXMgZG9lcyBOT1Qg YmVsb25nIHRvIHRoaXMgcGF0Y2gsIGJ1dCB0byB0aGUgbmV4dCByaWdodCA/DQo+Pg0KPj4+IMKg IGVuZGlmDQo+Pj4gZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvc2NtaV9wcm90b2NvbC5oIA0K Pj4+IGIvaW5jbHVkZS9saW51eC9zY21pX3Byb3RvY29sLmgNCj4+PiBpbmRleCA5Y2QzMTJhMWZm OTIuLjZhOTA5ZWYzYmY1MSAxMDA2NDQNCj4+PiAtLS0gYS9pbmNsdWRlL2xpbnV4L3NjbWlfcHJv dG9jb2wuaA0KPj4+ICsrKyBiL2luY2x1ZGUvbGludXgvc2NtaV9wcm90b2NvbC5oDQo+Pj4gQEAg LTEyLDcgKzEyLDggQEANCj4+PiDCoCAjaW5jbHVkZSA8bGludXgvbm90aWZpZXIuaD4NCj4+PiDC oCAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4NCj4+PiDCoCAtI2RlZmluZSBTQ01JX01BWF9TVFJf U0laRcKgwqDCoCAxNg0KPj4+ICsjZGVmaW5lIFNDTUlfTUFYX1NUUl9TSVpFIDE2DQo+Pj4gKyNk ZWZpbmUgU0NNSV9NQVhfU1RSX0VYVF9TSVpFIDY0DQo+Pg0KPj4gVGhpcyBpcyBoYW5kbGVkIGFz IHBhcnQgb2YgaG93IHRoZSBleHRlbmRlZCBuYW1lcyBhcmUgaGFuZGxlZCB3aXRoIA0KPj4gcGgt PmhvcHMNCj4+IGluIGEgY29tbW9uIHdheSwgYXMgSSB3YXMgc2F5aW5nLCBzbyBwbGVhc2UgbW92 ZSB0aGlzIGlmIHlvdSBuZWVkIGl0IGluDQo+PiB0aGUgcHJvdG9jb2wgY29kZSwgdGhlbiBJJ2xs IHBvcnQgdG8gdGhlIHBoLT5ob3BzIGludGVyZmFjZSBhbmQgY2xlYW4NCj4+IHVwLg0KPj4NCj4+ PiDCoCAjZGVmaW5lIFNDTUlfTUFYX05VTV9SQVRFU8KgwqDCoCAxNg0KPj4+IMKgIMKgIC8qKg0K Pj4+IEBAIC0yNTIsNiArMjUzLDU1IEBAIHN0cnVjdCBzY21pX25vdGlmeV9vcHMgew0KPj4+IMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHN0cnVjdCBub3RpZmll cl9ibG9jayAqbmIpOw0KPj4+IMKgIH07DQo+Pj4gwqAgKy8qKg0KPj4+ICsgKiBzdHJ1Y3Qgc2Nt aV9waW5jdHJsX29wcyAtIHJlcHJlc2VudHMgdGhlIHZhcmlvdXMgb3BlcmF0aW9ucyANCj4+PiBw cm92aWRlZA0KPj4+ICsgKiBieSBTQ01JIFBpbmN0cmwgUHJvdG9jb2wNCj4+PiArICoNCj4+PiAr ICogQGdldF9ncm91cHNfY291bnQ6IHJldHVybnMgY291bnQgb2YgdGhlIHJlZ2lzdGVyZWQgZ3Jv dXBzDQo+Pj4gKyAqIEBnZXRfZ3JvdXBfbmFtZTogcmV0dXJucyBncm91cCBuYW1lIGJ5IGluZGV4 DQo+Pj4gKyAqIEBnZXRfZ3JvdXBfcGluczogcmV0dXJucyB0aGUgc2V0IG9mIHBpbnMsIGFzc2ln bmVkIHRvIHRoZSANCj4+PiBzcGVjaWZpZWQgZ3JvdXANCj4+PiArICogQGdldF9mdW5jdGlvbnNf Y291bnQ6IHJldHVybnMgY291bnQgb2YgdGhlIHJlZ2lzdGVyZWQgZnVjbnRpb25zDQo+Pj4gKyAq IEBnZXRfZnVuY3Rpb25fbmFtZTogcmV0dXJucyBmdW5jdGlvbiBuYW1lIGJ5IGluZGVzDQo+Pj4g KyAqIEBnZXRfZnVuY3Rpb25fZ3JvdXBzOiByZXR1cm5zIHRoZSBzZXQgb2YgZ3JvdXBzLCBhc3Np Z25lZCB0byB0aGUgDQo+Pj4gc3BlY2lmaWVkDQo+Pj4gKyAqwqDCoMKgIGZ1bmN0aW9uDQo+Pj4g KyAqIEBzZXRfbXV4OiBzZXQgbXV4aW5nIGZ1bmN0aW9uIGZvciBncm91cHMgb2YgcGlucw0KPj4+ ICsgKiBAZ2V0X3BpbnM6IHJldHVybnMgdGhlIHNldCBvZiBwaW5zLCByZWdpc3RlcmVkIGluIGRy aXZlcg0KPj4+ICsgKiBAZ2V0X2NvbmZpZzogcmV0dXJucyBjb25maWd1cmF0aW9uIHBhcmFtZXRl ciBmb3IgcGluDQo+Pj4gKyAqIEBzZXRfY29uZmlnOiBzZXRzIHRoZSBjb25maWd1cmF0aW9uIHBh cmFtZXRlciBmb3IgcGluDQo+Pj4gKyAqIEBnZXRfY29uZmlnX2dyb3VwOiByZXR1cm5zIHRoZSBj b25maWd1cmF0aW9uIHBhcmFtZXRlciBmb3IgYSANCj4+PiBncm91cCBvZiBwaW5zDQo+Pj4gKyAq IEBzZXRfY29uZmlnX2dyb3VwOiBzZXRzIHRoZSBjb25maWd1cmF0aW9uIHBhcmFtZXRlciBmb3Ig YSBncm91cHMgDQo+Pj4gb2YgcGlucw0KPj4+ICsgKiBAcmVxdWVzdF9waW46IGFxdWlyZSBwaW4g YmVmb3JlIHNlbGVjdGluZyBtdXggc2V0dGluZw0KPj4+ICsgKiBAZnJlZV9waW46IGZyZWVzIHBp biwgYWNxdWlyZWQgYnkgcmVxdWVzdF9waW4gY2FsbA0KPj4+ICsgKi8NCj4+PiArc3RydWN0IHNj bWlfcGluY3RybF9vcHMgew0KPj4+ICvCoMKgwqAgaW50ICgqZ2V0X2dyb3Vwc19jb3VudCkoY29u c3Qgc3RydWN0IHNjbWlfaGFuZGxlICpoYW5kbGUpOw0KPj4+ICvCoMKgwqAgaW50ICgqZ2V0X2dy b3VwX25hbWUpKGNvbnN0IHN0cnVjdCBzY21pX2hhbmRsZSAqaGFuZGxlcywgdTMyIA0KPj4+IHNl bGVjdG9yLA0KPj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGNvbnN0IGNo YXIgKipuYW1lKTsNCj4+PiArwqDCoMKgIGludCAoKmdldF9ncm91cF9waW5zKShjb25zdCBzdHJ1 Y3Qgc2NtaV9oYW5kbGUgKmhhbmRsZSwgdTMyIA0KPj4+IHNlbGVjdG9yLA0KPj4+ICvCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGNvbnN0IHVuc2lnbmVkIGludCAqKnBpbnMsIHVu c2lnbmVkIGludCAqbnJfcGlucyk7DQo+Pj4gK8KgwqDCoCBpbnQgKCpnZXRfZnVuY3Rpb25zX2Nv dW50KShjb25zdCBzdHJ1Y3Qgc2NtaV9oYW5kbGUgKmhhbmRsZSk7DQo+Pj4gK8KgwqDCoCBpbnQg KCpnZXRfZnVuY3Rpb25fbmFtZSkoY29uc3Qgc3RydWN0IHNjbWlfaGFuZGxlICpoYW5kbGUsIHUz MiANCj4+PiBzZWxlY3RvciwNCj4+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAg Y29uc3QgY2hhciAqKm5hbWUpOw0KPj4+ICvCoMKgwqAgaW50ICgqZ2V0X2Z1bmN0aW9uX2dyb3Vw cykoY29uc3Qgc3RydWN0IHNjbWlfaGFuZGxlICpoYW5kbGUsDQo+Pj4gK8KgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoCB1MzIgc2VsZWN0b3IsIHVuc2lnbmVkIGludCAqbnJfZ3Jv dXBzLA0KPj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgY29uc3QgdW5z aWduZWQgaW50ICoqZ3JvdXBzKTsNCj4+PiArwqDCoMKgIGludCAoKnNldF9tdXgpKGNvbnN0IHN0 cnVjdCBzY21pX2hhbmRsZSAqaGFuZGxlLCB1MzIgc2VsZWN0b3IsDQo+Pj4gK8KgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqAgdTMyIGdyb3VwKTsNCj4+PiArwqDCoMKgIGludCAoKmdldF9waW5f bmFtZSkoY29uc3Qgc3RydWN0IHNjbWlfaGFuZGxlICpoYW5kbGUsIHUzMiANCj4+PiBzZWxlY3Rv ciwNCj4+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGNvbnN0IGNoYXIgKipuYW1l KTsNCj4+PiArwqDCoMKgIGludCAoKmdldF9waW5zX2NvdW50KShjb25zdCBzdHJ1Y3Qgc2NtaV9o YW5kbGUgKmhhbmRsZSk7DQo+Pj4gK8KgwqDCoCBpbnQgKCpnZXRfY29uZmlnKShjb25zdCBzdHJ1 Y3Qgc2NtaV9oYW5kbGUgKmhhbmRsZSwgdTMyIHBpbiwNCj4+PiArwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqAgdTMyICpjb25maWcpOw0KPj4+ICvCoMKgwqAgaW50ICgqc2V0X2NvbmZpZykoY29u c3Qgc3RydWN0IHNjbWlfaGFuZGxlICpoYW5kbGUsIHUzMiBwaW4sDQo+Pj4gK8KgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgIHUzMiBjb25maWcpOw0KPj4+ICvCoMKgwqAgaW50ICgqZ2V0X2NvbmZp Z19ncm91cCkoY29uc3Qgc3RydWN0IHNjbWlfaGFuZGxlICpoYW5kbGUsIHUzMiBwaW4sDQo+Pj4g K8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHUzMiAqY29uZmlnKTsNCj4+PiArwqDCoMKgIGlu dCAoKnNldF9jb25maWdfZ3JvdXApKGNvbnN0IHN0cnVjdCBzY21pX2hhbmRsZSAqaGFuZGxlLCB1 MzIgcGluLA0KPj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCB1MzIgY29uZmlnKTsNCj4+ PiArwqDCoMKgIGludCAoKnJlcXVlc3RfcGluKShjb25zdCBzdHJ1Y3Qgc2NtaV9oYW5kbGUgKmhh bmRsZSwgdTMyIHBpbik7DQo+Pj4gK8KgwqDCoCBpbnQgKCpmcmVlX3BpbikoY29uc3Qgc3RydWN0 IHNjbWlfaGFuZGxlICpoYW5kbGUsIHUzMiBwaW4pOw0KPj4+ICt9Ow0KPj4+ICsNCj4+DQo+PiBB cyBtZW50aW9uZWQgYWJvdmUsIGhlcmUgeW91IGNvdWxkIGRyb3AgYSBsb3Qgb2YgdGhpcyANCj4+ IGdldF9YX2NvdW50L25hbWUvcGlucw0KPj4gYW5kIGluc3RlYWQgZXhwb3NlIGEgZmV3IG9mIHRo ZSBpbnRlcm5hbCBwcm9vY29sIHN0cnVjdCBzY21pX19YX2luZm8gDQo+PiBhbmQgdGhlbg0KPj4g cHJvdmlkZSBqdXN0IGEgbWVhbiB0byBxdWVyeSBob3cgbWFueSByZXNvdXJjZSBhcmUgdGhlcmUg YW5kIHRoZW4gZ2V0IA0KPj4gdGhlIGluZm8NCj4+IGRlc2NyaXB0b3IgeW91IHdhbnQgZm9yIHRo ZSBzcGVjaWZpYyBkb21haW5faWQsIGkuZS46DQo+Pg0KPj4gwqDCoMKgwqAgaW50ICgqbnVtX2Rv bWFpbnNfZ2V0KShwaCwgdHlwZSkNCj4+IMKgwqDCoMKgIHZvaWQgKigqaW5mb19nZXQpKHBoLCB0 eXBlLCBkb21haW5faWQpOw0KPj4NCj4+IFRoYW5rcywNCj4+IENyaXN0aWFuDQo+Pg0KPj4NCj4+ IF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fDQo+PiBsaW51 eC1hcm0ta2VybmVsIG1haWxpbmcgbGlzdA0KPj4gbGludXgtYXJtLWtlcm5lbEBsaXN0cy5pbmZy YWRlYWQub3JnDQo+PiBodHRwczovL3VybGRlZmVuc2UuY29tL3YzL19faHR0cDovL2xpc3RzLmlu ZnJhZGVhZC5vcmcvbWFpbG1hbi9saXN0aW5mby9saW51eC1hcm0ta2VybmVsX187ISFHRl8yOWRi Y1FJVUJQQSF5MmhSM1BFR0d4aVBqVmVYQmNnR3lWMDNEUERoemdVS1IwdUh2c1RwaWFmS2dCYXI4 RWdjNm9PT3MtSWtGSXF1aFNmLXFCemx0cUVNeXpSWnJaaTdxbGskIA0KPj4gW2xpc3RzWy5daW5m cmFkZWFkWy5db3JnXQ==