Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 8185BC678D5 for ; Wed, 8 Mar 2023 11:07:21 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S230037AbjCHLHT (ORCPT ); Wed, 8 Mar 2023 06:07:19 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:40326 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229605AbjCHLHI (ORCPT ); Wed, 8 Mar 2023 06:07:08 -0500 Received: from fd01.gateway.ufhost.com (fd01.gateway.ufhost.com [61.152.239.71]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 1D16895451 for ; Wed, 8 Mar 2023 03:07:04 -0800 (PST) Received: from EXMBX165.cuchost.com (unknown [175.102.18.54]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (Client CN "EXMBX165", Issuer "EXMBX165" (not verified)) by fd01.gateway.ufhost.com (Postfix) with ESMTP id D408C24E06F; Wed, 8 Mar 2023 19:07:02 +0800 (CST) Received: from EXMBX162.cuchost.com (172.16.6.72) by EXMBX165.cuchost.com (172.16.6.75) with Microsoft SMTP Server (TLS) id 15.0.1497.42; Wed, 8 Mar 2023 19:07:03 +0800 Received: from EXMBX066.cuchost.com (172.16.7.66) by EXMBX162.cuchost.com (172.16.6.72) with Microsoft SMTP Server (TLS) id 15.0.1497.42; Wed, 8 Mar 2023 19:07:02 +0800 Received: from EXMBX066.cuchost.com ([fe80::5947:9245:907e:339f]) by EXMBX066.cuchost.com ([fe80::5947:9245:907e:339f%17]) with mapi id 15.00.1497.044; Wed, 8 Mar 2023 19:07:02 +0800 From: JeeHeng Sia To: Alexandre Ghiti , "paul.walmsley@sifive.com" , "palmer@dabbelt.com" , "aou@eecs.berkeley.edu" CC: "linux-riscv@lists.infradead.org" , "linux-kernel@vger.kernel.org" , Leyfoon Tan , Mason Huo Subject: RE: [PATCH v5 4/4] RISC-V: Add arch functions to support hibernation/suspend-to-disk Thread-Topic: [PATCH v5 4/4] RISC-V: Add arch functions to support hibernation/suspend-to-disk Thread-Index: AQHZUZTpaW/r1KSFp0W7twGMrJClqa7wEbcAgAAFjQCAAJ2K8A== Date: Wed, 8 Mar 2023 11:07:02 +0000 Message-ID: References: <20230308080612.122398-1-jeeheng.sia@starfivetech.com> <20230308080612.122398-5-jeeheng.sia@starfivetech.com> <471a1ab7-2949-2572-38c3-13ed3c26b7d5@ghiti.fr> <6e3a4ff7-2ddb-7b2c-f673-311062ad8223@ghiti.fr> In-Reply-To: <6e3a4ff7-2ddb-7b2c-f673-311062ad8223@ghiti.fr> Accept-Language: en-US, zh-CN Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: x-ms-exchange-transport-fromentityheader: Hosted x-originating-ip: [60.50.196.81] x-yovoleruleagent: yovoleflag Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org DQoNCj4gLS0tLS1PcmlnaW5hbCBNZXNzYWdlLS0tLS0NCj4gRnJvbTogQWxleGFuZHJlIEdoaXRp IDxhbGV4QGdoaXRpLmZyPg0KPiBTZW50OiBXZWRuZXNkYXksIE1hcmNoIDgsIDIwMjMgNToyOCBQ TQ0KPiBUbzogSmVlSGVuZyBTaWEgPGplZWhlbmcuc2lhQHN0YXJmaXZldGVjaC5jb20+OyBwYXVs LndhbG1zbGV5QHNpZml2ZS5jb207IHBhbG1lckBkYWJiZWx0LmNvbTsgYW91QGVlY3MuYmVya2Vs ZXkuZWR1DQo+IENjOiBsaW51eC1yaXNjdkBsaXN0cy5pbmZyYWRlYWQub3JnOyBsaW51eC1rZXJu ZWxAdmdlci5rZXJuZWwub3JnOyBMZXlmb29uIFRhbiA8bGV5Zm9vbi50YW5Ac3RhcmZpdmV0ZWNo LmNvbT47IE1hc29uIEh1bw0KPiA8bWFzb24uaHVvQHN0YXJmaXZldGVjaC5jb20+DQo+IFN1Ympl Y3Q6IFJlOiBbUEFUQ0ggdjUgNC80XSBSSVNDLVY6IEFkZCBhcmNoIGZ1bmN0aW9ucyB0byBzdXBw b3J0IGhpYmVybmF0aW9uL3N1c3BlbmQtdG8tZGlzaw0KPiANCj4gDQo+IE9uIDMvOC8yMyAxMDow OCwgQWxleGFuZHJlIEdoaXRpIHdyb3RlOg0KPiA+DQo+ID4gT24gMy84LzIzIDA5OjA2LCBTaWEg SmVlIEhlbmcgd3JvdGU6DQo+ID4+IExvdyBsZXZlbCBBcmNoIGZ1bmN0aW9ucyB3ZXJlIGNyZWF0 ZWQgdG8gc3VwcG9ydCBoaWJlcm5hdGlvbi4NCj4gPj4gc3dzdXNwX2FyY2hfc3VzcGVuZCgpIHJl bGllcyBjb2RlIGZyb20gX19jcHVfc3VzcGVuZF9lbnRlcigpIHRvIHdyaXRlDQo+ID4+IGNwdSBz dGF0ZSBvbnRvIHRoZSBzdGFjaywgdGhlbiBjYWxsaW5nIHN3c3VzcF9zYXZlKCkgdG8gc2F2ZSB0 aGUgbWVtb3J5DQo+ID4+IGltYWdlLg0KPiA+Pg0KPiA+PiBBcmNoIHNwZWNpZmljIGhpYmVybmF0 aW9uIGhlYWRlciBpcyBpbXBsZW1lbnRlZCBhbmQgaXMgdXRpbGl6ZWQgYnkgdGhlDQo+ID4+IGFy Y2hfaGliZXJuYXRpb25faGVhZGVyX3Jlc3RvcmUoKSBhbmQgYXJjaF9oaWJlcm5hdGlvbl9oZWFk ZXJfc2F2ZSgpDQo+ID4+IGZ1bmN0aW9ucy4gVGhlIGFyY2ggc3BlY2lmaWMgaGliZXJuYXRpb24g aGVhZGVyIGNvbnNpc3RzIG9mIHNhdHAsDQo+ID4+IGhhcnRpZCwNCj4gPj4gYW5kIHRoZSBjcHVf cmVzdW1lIGFkZHJlc3MuIFRoZSBrZXJuZWwgYnVpbHQgdmVyc2lvbiBpcyBhbHNvIG5lZWQgdG8g YmUNCj4gPj4gc2F2ZWQgaW50byB0aGUgaGliZXJuYXRpb24gaW1hZ2UgaGVhZGVyIHRvIG1ha2lu ZyBzdXJlIG9ubHkgdGhlIHNhbWUNCj4gPj4ga2VybmVsIGlzIHJlc3RvcmUgd2hlbiByZXN1bWUu DQo+ID4+DQo+ID4+IHN3c3VzcF9hcmNoX3Jlc3VtZSgpIGNyZWF0ZXMgYSB0ZW1wb3JhcnkgcGFn ZSB0YWJsZSB0aGF0IGNvdmVyaW5nIG9ubHkNCj4gPj4gdGhlIGxpbmVhciBtYXAuIEl0IGNvcGll cyB0aGUgcmVzdG9yZSBjb2RlIHRvIGEgJ3NhZmUnIHBhZ2UsIHRoZW4gc3RhcnQNCj4gPj4gdG8g cmVzdG9yZSB0aGUgbWVtb3J5IGltYWdlLiBPbmNlIGNvbXBsZXRlZCwgaXQgcmVzdG9yZXMgdGhl IG9yaWdpbmFsDQo+ID4+IGtlcm5lbCdzIHBhZ2UgdGFibGUuIEl0IHRoZW4gY2FsbHMgaW50byBf X2hpYmVybmF0ZV9jcHVfcmVzdW1lKCkNCj4gPj4gdG8gcmVzdG9yZSB0aGUgQ1BVIGNvbnRleHQu IEZpbmFsbHksIGl0IGZvbGxvd3MgdGhlIG5vcm1hbCBoaWJlcm5hdGlvbg0KPiA+PiBwYXRoIGJh Y2sgdG8gdGhlIGhpYmVybmF0aW9uIGNvcmUuDQo+ID4+DQo+ID4+IFRvIGVuYWJsZSBoaWJlcm5h dGlvbi9zdXNwZW5kIHRvIGRpc2sgaW50byBSSVNDViwgdGhlIGJlbG93IGNvbmZpZw0KPiA+PiBu ZWVkIHRvIGJlIGVuYWJsZWQ6DQo+ID4+IC0gQ09ORklHX0FSQ0hfSElCRVJOQVRJT05fSEVBREVS DQo+ID4+IC0gQ09ORklHX0FSQ0hfSElCRVJOQVRJT05fUE9TU0lCTEUNCj4gPj4NCj4gPj4gU2ln bmVkLW9mZi1ieTogU2lhIEplZSBIZW5nIDxqZWVoZW5nLnNpYUBzdGFyZml2ZXRlY2guY29tPg0K PiA+PiBSZXZpZXdlZC1ieTogTGV5IEZvb24gVGFuIDxsZXlmb29uLnRhbkBzdGFyZml2ZXRlY2gu Y29tPg0KPiA+PiBSZXZpZXdlZC1ieTogTWFzb24gSHVvIDxtYXNvbi5odW9Ac3RhcmZpdmV0ZWNo LmNvbT4NCj4gPj4gLS0tDQo+ID4+IMKgIGFyY2gvcmlzY3YvS2NvbmZpZ8KgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgIHzCoMKgIDYgKw0KPiA+PiDCoCBhcmNoL3Jpc2N2L2luY2x1ZGUv YXNtL2Fzc2VtYmxlci5oIHzCoCAyMCArKw0KPiA+PiDCoCBhcmNoL3Jpc2N2L2luY2x1ZGUvYXNt L3N1c3BlbmQuaMKgwqAgfMKgIDE5ICsrDQo+ID4+IMKgIGFyY2gvcmlzY3Yva2VybmVsL01ha2Vm aWxlwqDCoMKgwqDCoMKgwqDCoCB8wqDCoCAxICsNCj4gPj4gwqAgYXJjaC9yaXNjdi9rZXJuZWwv YXNtLW9mZnNldHMuY8KgwqDCoCB8wqDCoCA1ICsNCj4gPj4gwqAgYXJjaC9yaXNjdi9rZXJuZWwv aGliZXJuYXRlLWFzbS5TwqAgfMKgIDc3ICsrKysrKw0KPiA+PiDCoCBhcmNoL3Jpc2N2L2tlcm5l bC9oaWJlcm5hdGUuY8KgwqDCoMKgwqAgfCA0MjQgKysrKysrKysrKysrKysrKysrKysrKysrKysr KysNCj4gPj4gwqAgNyBmaWxlcyBjaGFuZ2VkLCA1NTIgaW5zZXJ0aW9ucygrKQ0KPiA+PiDCoCBj cmVhdGUgbW9kZSAxMDA2NDQgYXJjaC9yaXNjdi9rZXJuZWwvaGliZXJuYXRlLWFzbS5TDQo+ID4+ IMKgIGNyZWF0ZSBtb2RlIDEwMDY0NCBhcmNoL3Jpc2N2L2tlcm5lbC9oaWJlcm5hdGUuYw0KPiA+ Pg0KPiA+PiBkaWZmIC0tZ2l0IGEvYXJjaC9yaXNjdi9LY29uZmlnIGIvYXJjaC9yaXNjdi9LY29u ZmlnDQo+ID4+IGluZGV4IGM1ZTQyY2MzNzYwNC4uNDczYzJhMWE2ODg0IDEwMDY0NA0KPiA+PiAt LS0gYS9hcmNoL3Jpc2N2L0tjb25maWcNCj4gPj4gKysrIGIvYXJjaC9yaXNjdi9LY29uZmlnDQo+ ID4+IEBAIC03MDcsNiArNzA3LDEyIEBAIG1lbnUgIlBvd2VyIG1hbmFnZW1lbnQgb3B0aW9ucyIN Cj4gPj4gwqAgwqAgc291cmNlICJrZXJuZWwvcG93ZXIvS2NvbmZpZyINCj4gPj4gwqAgK2NvbmZp ZyBBUkNIX0hJQkVSTkFUSU9OX1BPU1NJQkxFDQo+ID4+ICvCoMKgwqAgZGVmX2Jvb2wgeQ0KPiA+ PiArDQo+ID4+ICtjb25maWcgQVJDSF9ISUJFUk5BVElPTl9IRUFERVINCj4gPj4gK8KgwqDCoCBk ZWZfYm9vbCBISUJFUk5BVElPTg0KPiA+PiArDQo+ID4+IMKgIGVuZG1lbnUgIyAiUG93ZXIgbWFu YWdlbWVudCBvcHRpb25zIg0KPiA+PiDCoCDCoCBtZW51ICJDUFUgUG93ZXIgTWFuYWdlbWVudCIN Cj4gPj4gZGlmZiAtLWdpdCBhL2FyY2gvcmlzY3YvaW5jbHVkZS9hc20vYXNzZW1ibGVyLmgNCj4g Pj4gYi9hcmNoL3Jpc2N2L2luY2x1ZGUvYXNtL2Fzc2VtYmxlci5oDQo+ID4+IGluZGV4IGJhNTlk MzhmODkzNy4uNDRiMTQ1N2QzZTk1IDEwMDY0NA0KPiA+PiAtLS0gYS9hcmNoL3Jpc2N2L2luY2x1 ZGUvYXNtL2Fzc2VtYmxlci5oDQo+ID4+ICsrKyBiL2FyY2gvcmlzY3YvaW5jbHVkZS9hc20vYXNz ZW1ibGVyLmgNCj4gPj4gQEAgLTU5LDQgKzU5LDI0IEBADQo+ID4+IMKgwqDCoMKgwqDCoMKgwqDC oCBSRUdfTMKgwqDCoCBzMTEsIChTVVNQRU5EX0NPTlRFWFRfUkVHUyArIFBUX1MxMSkoYTApDQo+ ID4+IMKgwqDCoMKgwqAgLmVuZG0NCj4gPj4gwqAgKy8qDQo+ID4+ICsgKiBjb3B5X3BhZ2UgLSBj b3B5IDEgcGFnZSAoNEtCKSBvZiBkYXRhIGZyb20gc291cmNlIHRvIGRlc3RpbmF0aW9uDQo+ID4+ ICsgKiBAYTAgLSBkZXN0aW5hdGlvbg0KPiA+PiArICogQGExIC0gc291cmNlDQo+ID4+ICsgKi8N Cj4gPj4gK8KgwqDCoCAubWFjcm/CoMKgwqAgY29weV9wYWdlIGEwLCBhMQ0KPiA+PiArwqDCoMKg wqDCoMKgwqAgbHVpwqDCoMKgIGEyLCAweDENCj4gPj4gK8KgwqDCoMKgwqDCoMKgIGFkZMKgwqDC oCBhMiwgYTIsIGEwDQo+ID4+ICsxIDoNCj4gPj4gK8KgwqDCoMKgwqDCoMKgIFJFR19MwqDCoMKg IHQwLCAwKGExKQ0KPiA+PiArwqDCoMKgwqDCoMKgwqAgUkVHX0zCoMKgwqAgdDEsIFNaUkVHKGEx KQ0KPiA+PiArDQo+ID4+ICvCoMKgwqDCoMKgwqDCoCBSRUdfU8KgwqDCoCB0MCwgMChhMCkNCj4g Pj4gK8KgwqDCoMKgwqDCoMKgIFJFR19TwqDCoMKgIHQxLCBTWlJFRyhhMCkNCj4gPj4gKw0KPiA+ PiArwqDCoMKgwqDCoMKgwqAgYWRkacKgwqDCoCBhMCwgYTAsIDIgKiBTWlJFRw0KPiA+PiArwqDC oMKgwqDCoMKgwqAgYWRkacKgwqDCoCBhMSwgYTEsIDIgKiBTWlJFRw0KPiA+PiArwqDCoMKgwqDC oMKgwqAgYm5lwqDCoMKgIGEyLCBhMCwgMWINCj4gPj4gK8KgwqDCoCAuZW5kbQ0KPiA+PiArDQo+ ID4+IMKgICNlbmRpZsKgwqDCoCAvKiBfX0FTTV9BU1NFTUJMRVJfSCAqLw0KPiA+PiBkaWZmIC0t Z2l0IGEvYXJjaC9yaXNjdi9pbmNsdWRlL2FzbS9zdXNwZW5kLmgNCj4gPj4gYi9hcmNoL3Jpc2N2 L2luY2x1ZGUvYXNtL3N1c3BlbmQuaA0KPiA+PiBpbmRleCA2N2UwNDc0NDU2NjIuLjAyZjg3ODY3 Mzg5YSAxMDA2NDQNCj4gPj4gLS0tIGEvYXJjaC9yaXNjdi9pbmNsdWRlL2FzbS9zdXNwZW5kLmgN Cj4gPj4gKysrIGIvYXJjaC9yaXNjdi9pbmNsdWRlL2FzbS9zdXNwZW5kLmgNCj4gPj4gQEAgLTIx LDYgKzIxLDExIEBAIHN0cnVjdCBzdXNwZW5kX2NvbnRleHQgew0KPiA+PiDCoCAjZW5kaWYNCj4g Pj4gwqAgfTsNCj4gPj4gwqAgKy8qDQo+ID4+ICsgKiBVc2VkIGJ5IGhpYmVybmF0aW9uIGNvcmUg YW5kIGNsZWFyZWQgZHVyaW5nIHJlc3VtZSBzZXF1ZW5jZQ0KPiA+PiArICovDQo+ID4+ICtleHRl cm4gaW50IGluX3N1c3BlbmQ7DQo+ID4+ICsNCj4gPj4gwqAgLyogTG93LWxldmVsIENQVSBzdXNw ZW5kIGVudHJ5IGZ1bmN0aW9uICovDQo+ID4+IMKgIGludCBfX2NwdV9zdXNwZW5kX2VudGVyKHN0 cnVjdCBzdXNwZW5kX2NvbnRleHQgKmNvbnRleHQpOw0KPiA+PiDCoCBAQCAtMzYsNCArNDEsMTgg QEAgaW50IF9fY3B1X3Jlc3VtZV9lbnRlcih1bnNpZ25lZCBsb25nIGhhcnRpZCwNCj4gPj4gdW5z aWduZWQgbG9uZyBjb250ZXh0KTsNCj4gPj4gwqAgLyogVXNlZCB0byBzYXZlIGFuZCByZXN0b3Jl IHRoZSBDU1JzICovDQo+ID4+IMKgIHZvaWQgc3VzcGVuZF9zYXZlX2NzcnMoc3RydWN0IHN1c3Bl bmRfY29udGV4dCAqY29udGV4dCk7DQo+ID4+IMKgIHZvaWQgc3VzcGVuZF9yZXN0b3JlX2NzcnMo c3RydWN0IHN1c3BlbmRfY29udGV4dCAqY29udGV4dCk7DQo+ID4+ICsNCj4gPj4gKy8qIExvdy1s ZXZlbCBBUEkgdG8gc3VwcG9ydCBoaWJlcm5hdGlvbiAqLw0KPiA+PiAraW50IHN3c3VzcF9hcmNo X3N1c3BlbmQodm9pZCk7DQo+ID4+ICtpbnQgc3dzdXNwX2FyY2hfcmVzdW1lKHZvaWQpOw0KPiA+ PiAraW50IGFyY2hfaGliZXJuYXRpb25faGVhZGVyX3NhdmUodm9pZCAqYWRkciwgdW5zaWduZWQg aW50IG1heF9zaXplKTsNCj4gPj4gK2ludCBhcmNoX2hpYmVybmF0aW9uX2hlYWRlcl9yZXN0b3Jl KHZvaWQgKmFkZHIpOw0KPiA+PiAraW50IF9faGliZXJuYXRlX2NwdV9yZXN1bWUodm9pZCk7DQo+ ID4+ICsNCj4gPj4gKy8qIFVzZWQgdG8gcmVzdW1lIG9uIHRoZSBDUFUgd2UgaGliZXJuYXRlZCBv biAqLw0KPiA+PiAraW50IGhpYmVybmF0ZV9yZXN1bWVfbm9uYm9vdF9jcHVfZGlzYWJsZSh2b2lk KTsNCj4gPj4gKw0KPiA+PiArYXNtbGlua2FnZSB2b2lkIGhpYmVybmF0ZV9yZXN0b3JlX2ltYWdl KHVuc2lnbmVkIGxvbmcgcmVzdW1lX3NhdHAsDQo+ID4+IHVuc2lnbmVkIGxvbmcgc2F0cF90ZW1w LA0KPiA+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgdW5zaWduZWQg bG9uZyBjcHVfcmVzdW1lKTsNCj4gPj4gK2FzbWxpbmthZ2UgaW50IGhpYmVybmF0ZV9jb3JlX3Jl c3RvcmVfY29kZSh2b2lkKTsNCj4gPj4gwqAgI2VuZGlmDQo+ID4+IGRpZmYgLS1naXQgYS9hcmNo L3Jpc2N2L2tlcm5lbC9NYWtlZmlsZSBiL2FyY2gvcmlzY3Yva2VybmVsL01ha2VmaWxlDQo+ID4+ IGluZGV4IDRjZjMwM2E3NzlhYi4uZGFhYjM0MWQ1NWU0IDEwMDY0NA0KPiA+PiAtLS0gYS9hcmNo L3Jpc2N2L2tlcm5lbC9NYWtlZmlsZQ0KPiA+PiArKysgYi9hcmNoL3Jpc2N2L2tlcm5lbC9NYWtl ZmlsZQ0KPiA+PiBAQCAtNjQsNiArNjQsNyBAQCBvYmotJChDT05GSUdfTU9EVUxFUynCoMKgwqDC oMKgwqDCoCArPSBtb2R1bGUubw0KPiA+PiDCoCBvYmotJChDT05GSUdfTU9EVUxFX1NFQ1RJT05T KcKgwqDCoCArPSBtb2R1bGUtc2VjdGlvbnMubw0KPiA+PiDCoCDCoCBvYmotJChDT05GSUdfQ1BV X1BNKcKgwqDCoMKgwqDCoMKgICs9IHN1c3BlbmRfZW50cnkubyBzdXNwZW5kLm8NCj4gPj4gK29i ai0kKENPTkZJR19ISUJFUk5BVElPTinCoMKgwqAgKz0gaGliZXJuYXRlLm8gaGliZXJuYXRlLWFz bS5vDQo+ID4+IMKgIMKgIG9iai0kKENPTkZJR19GVU5DVElPTl9UUkFDRVIpwqDCoMKgICs9IG1j b3VudC5vIGZ0cmFjZS5vDQo+ID4+IMKgIG9iai0kKENPTkZJR19EWU5BTUlDX0ZUUkFDRSnCoMKg wqAgKz0gbWNvdW50LWR5bi5vDQo+ID4+IGRpZmYgLS1naXQgYS9hcmNoL3Jpc2N2L2tlcm5lbC9h c20tb2Zmc2V0cy5jDQo+ID4+IGIvYXJjaC9yaXNjdi9rZXJuZWwvYXNtLW9mZnNldHMuYw0KPiA+ PiBpbmRleCBkZjk0NDQzOTc5MDguLmQ2YTc1YWFjMWQyNyAxMDA2NDQNCj4gPj4gLS0tIGEvYXJj aC9yaXNjdi9rZXJuZWwvYXNtLW9mZnNldHMuYw0KPiA+PiArKysgYi9hcmNoL3Jpc2N2L2tlcm5l bC9hc20tb2Zmc2V0cy5jDQo+ID4+IEBAIC05LDYgKzksNyBAQA0KPiA+PiDCoCAjaW5jbHVkZSA8 bGludXgva2J1aWxkLmg+DQo+ID4+IMKgICNpbmNsdWRlIDxsaW51eC9tbS5oPg0KPiA+PiDCoCAj aW5jbHVkZSA8bGludXgvc2NoZWQuaD4NCj4gPj4gKyNpbmNsdWRlIDxsaW51eC9zdXNwZW5kLmg+ DQo+ID4+IMKgICNpbmNsdWRlIDxhc20va3ZtX2hvc3QuaD4NCj4gPj4gwqAgI2luY2x1ZGUgPGFz bS90aHJlYWRfaW5mby5oPg0KPiA+PiDCoCAjaW5jbHVkZSA8YXNtL3B0cmFjZS5oPg0KPiA+PiBA QCAtMTE2LDYgKzExNywxMCBAQCB2b2lkIGFzbV9vZmZzZXRzKHZvaWQpDQo+ID4+IMKgIMKgwqDC oMKgwqAgT0ZGU0VUKFNVU1BFTkRfQ09OVEVYVF9SRUdTLCBzdXNwZW5kX2NvbnRleHQsIHJlZ3Mp Ow0KPiA+PiDCoCArwqDCoMKgIE9GRlNFVChISUJFUk5fUEJFX0FERFIsIHBiZSwgYWRkcmVzcyk7 DQo+ID4+ICvCoMKgwqAgT0ZGU0VUKEhJQkVSTl9QQkVfT1JJRywgcGJlLCBvcmlnX2FkZHJlc3Mp Ow0KPiA+PiArwqDCoMKgIE9GRlNFVChISUJFUk5fUEJFX05FWFQsIHBiZSwgbmV4dCk7DQo+ID4+ ICsNCj4gPj4gwqDCoMKgwqDCoCBPRkZTRVQoS1ZNX0FSQ0hfR1VFU1RfWkVSTywga3ZtX3ZjcHVf YXJjaCwgZ3Vlc3RfY29udGV4dC56ZXJvKTsNCj4gPj4gwqDCoMKgwqDCoCBPRkZTRVQoS1ZNX0FS Q0hfR1VFU1RfUkEsIGt2bV92Y3B1X2FyY2gsIGd1ZXN0X2NvbnRleHQucmEpOw0KPiA+PiDCoMKg wqDCoMKgIE9GRlNFVChLVk1fQVJDSF9HVUVTVF9TUCwga3ZtX3ZjcHVfYXJjaCwgZ3Vlc3RfY29u dGV4dC5zcCk7DQo+ID4+IGRpZmYgLS1naXQgYS9hcmNoL3Jpc2N2L2tlcm5lbC9oaWJlcm5hdGUt YXNtLlMNCj4gPj4gYi9hcmNoL3Jpc2N2L2tlcm5lbC9oaWJlcm5hdGUtYXNtLlMNCj4gPj4gbmV3 IGZpbGUgbW9kZSAxMDA2NDQNCj4gPj4gaW5kZXggMDAwMDAwMDAwMDAwLi5lZmZhZjVjYTVkYTAN Cj4gPj4gLS0tIC9kZXYvbnVsbA0KPiA+PiArKysgYi9hcmNoL3Jpc2N2L2tlcm5lbC9oaWJlcm5h dGUtYXNtLlMNCj4gPj4gQEAgLTAsMCArMSw3NyBAQA0KPiA+PiArLyogU1BEWC1MaWNlbnNlLUlk ZW50aWZpZXI6IEdQTC0yLjAtb25seSAqLw0KPiA+PiArLyoNCj4gPj4gKyAqIEhpYmVybmF0aW9u IGxvdyBsZXZlbCBzdXBwb3J0IGZvciBSSVNDVi4NCj4gPj4gKyAqDQo+ID4+ICsgKiBDb3B5cmln aHQgKEMpIDIwMjMgU3RhckZpdmUgVGVjaG5vbG9neSBDby4sIEx0ZC4NCj4gPj4gKyAqDQo+ID4+ ICsgKiBBdXRob3I6IEplZSBIZW5nIFNpYSA8amVlaGVuZy5zaWFAc3RhcmZpdmV0ZWNoLmNvbT4N Cj4gPj4gKyAqLw0KPiA+PiArDQo+ID4+ICsjaW5jbHVkZSA8YXNtL2FzbS5oPg0KPiA+PiArI2lu Y2x1ZGUgPGFzbS9hc20tb2Zmc2V0cy5oPg0KPiA+PiArI2luY2x1ZGUgPGFzbS9hc3NlbWJsZXIu aD4NCj4gPj4gKyNpbmNsdWRlIDxhc20vY3NyLmg+DQo+ID4+ICsNCj4gPj4gKyNpbmNsdWRlIDxs aW51eC9saW5rYWdlLmg+DQo+ID4+ICsNCj4gPj4gKy8qDQo+ID4+ICsgKiBpbnQgX19oaWJlcm5h dGVfY3B1X3Jlc3VtZSh2b2lkKQ0KPiA+PiArICogU3dpdGNoIGJhY2sgdG8gdGhlIGhpYmVybmF0 ZWQgaW1hZ2UncyBwYWdlIHRhYmxlIHByaW9yIHRvDQo+ID4+IHJlc3RvcmluZyB0aGUgQ1BVDQo+ ID4+ICsgKiBjb250ZXh0Lg0KPiA+PiArICoNCj4gPj4gKyAqIEFsd2F5cyByZXR1cm5zIDANCj4g Pj4gKyAqLw0KPiA+PiArRU5UUlkoX19oaWJlcm5hdGVfY3B1X3Jlc3VtZSkNCj4gPj4gK8KgwqDC oCAvKiBzd2l0Y2ggdG8gaGliZXJuYXRlZCBpbWFnZSdzIHBhZ2UgdGFibGUuICovDQo+ID4+ICvC oMKgwqAgY3NydyBDU1JfU0FUUCwgczANCj4gPj4gK8KgwqDCoCBzZmVuY2Uudm1hDQo+ID4+ICsN Cj4gPj4gK8KgwqDCoCBSRUdfTMKgwqDCoCBhMCwgaGliZXJuYXRlX2NwdV9jb250ZXh0DQo+ID4+ ICsNCj4gPj4gK8KgwqDCoCBzdXNwZW5kX3Jlc3RvcmVfY3Nycw0KPiA+PiArwqDCoMKgIHN1c3Bl bmRfcmVzdG9yZV9yZWdzDQo+ID4+ICsNCj4gPj4gK8KgwqDCoCAvKiBSZXR1cm4gemVybyB2YWx1 ZS4gKi8NCj4gPj4gK8KgwqDCoCBtdsKgwqDCoCBhMCwgemVybw0KPiA+PiArDQo+ID4+ICvCoMKg wqAgcmV0DQo+ID4+ICtFTkQoX19oaWJlcm5hdGVfY3B1X3Jlc3VtZSkNCj4gPj4gKw0KPiA+PiAr LyoNCj4gPj4gKyAqIFByZXBhcmUgdG8gcmVzdG9yZSB0aGUgaW1hZ2UuDQo+ID4+ICsgKiBhMDog c2F0cCBvZiBzYXZlZCBwYWdlIHRhYmxlcy4NCj4gPj4gKyAqIGExOiBzYXRwIG9mIHRlbXBvcmFy eSBwYWdlIHRhYmxlcy4NCj4gPj4gKyAqIGEyOiBjcHVfcmVzdW1lLg0KPiA+PiArICovDQo+ID4+ ICtFTlRSWShoaWJlcm5hdGVfcmVzdG9yZV9pbWFnZSkNCj4gPj4gK8KgwqDCoCBtdsKgwqDCoCBz MCwgYTANCj4gPj4gK8KgwqDCoCBtdsKgwqDCoCBzMSwgYTENCj4gPj4gK8KgwqDCoCBtdsKgwqDC oCBzMiwgYTINCj4gPj4gK8KgwqDCoCBSRUdfTMKgwqDCoCBzNCwgcmVzdG9yZV9wYmxpc3QNCj4g Pj4gK8KgwqDCoCBSRUdfTMKgwqDCoCBhMSwgcmVsb2NhdGVkX3Jlc3RvcmVfY29kZQ0KPiA+PiAr DQo+ID4+ICvCoMKgwqAgamFscsKgwqDCoCBhMQ0KPiA+PiArRU5EKGhpYmVybmF0ZV9yZXN0b3Jl X2ltYWdlKQ0KPiA+PiArDQo+ID4+ICsvKg0KPiA+PiArICogVGhlIGJlbG93IGNvZGUgd2lsbCBi ZSBleGVjdXRlZCBmcm9tIGEgJ3NhZmUnIHBhZ2UuDQo+ID4+ICsgKiBJdCBmaXJzdCBzd2l0Y2hl cyB0byB0aGUgdGVtcG9yYXJ5IHBhZ2UgdGFibGUsIHRoZW4gc3RhcnRzIHRvDQo+ID4+IGNvcHkg dGhlIHBhZ2VzDQo+ID4+ICsgKiBiYWNrIHRvIHRoZSBvcmlnaW5hbCBtZW1vcnkgbG9jYXRpb24u IEZpbmFsbHksIGl0IGp1bXBzIHRvDQo+ID4+IF9faGliZXJuYXRlX2NwdV9yZXN1bWUoKQ0KPiA+ PiArICogdG8gcmVzdG9yZSB0aGUgQ1BVIGNvbnRleHQuDQo+ID4+ICsgKi8NCj4gPj4gK0VOVFJZ KGhpYmVybmF0ZV9jb3JlX3Jlc3RvcmVfY29kZSkNCj4gPj4gK8KgwqDCoCAvKiBzd2l0Y2ggdG8g dGVtcCBwYWdlIHRhYmxlLiAqLw0KPiA+PiArwqDCoMKgIGNzcncgc2F0cCwgczENCj4gPj4gK8Kg wqDCoCBzZmVuY2Uudm1hDQo+ID4+ICsuTGNvcHk6DQo+ID4+ICvCoMKgwqAgLyogVGhlIGJlbG93 IGNvZGUgd2lsbCByZXN0b3JlIHRoZSBoaWJlcm5hdGVkIGltYWdlLiAqLw0KPiA+PiArwqDCoMKg IFJFR19MwqDCoMKgIGExLCBISUJFUk5fUEJFX0FERFIoczQpDQo+ID4+ICvCoMKgwqAgUkVHX0zC oMKgwqAgYTAsIEhJQkVSTl9QQkVfT1JJRyhzNCkNCj4gPj4gKw0KPiA+PiArwqDCoMKgIGNvcHlf cGFnZSBhMCwgYTENCj4gPj4gKw0KPiA+PiArwqDCoMKgIFJFR19MwqDCoMKgIHM0LCBISUJFUk5f UEJFX05FWFQoczQpDQo+ID4+ICvCoMKgwqAgYm5lesKgwqDCoCBzNCwgLkxjb3B5DQo+ID4+ICsN Cj4gPj4gK8KgwqDCoCBqYWxywqDCoMKgIHMyDQo+ID4+ICtFTkQoaGliZXJuYXRlX2NvcmVfcmVz dG9yZV9jb2RlKQ0KPiA+PiBkaWZmIC0tZ2l0IGEvYXJjaC9yaXNjdi9rZXJuZWwvaGliZXJuYXRl LmMNCj4gPj4gYi9hcmNoL3Jpc2N2L2tlcm5lbC9oaWJlcm5hdGUuYw0KPiA+PiBuZXcgZmlsZSBt b2RlIDEwMDY0NA0KPiA+PiBpbmRleCAwMDAwMDAwMDAwMDAuLjhmYWI1MDEyMmU1NA0KPiA+PiAt LS0gL2Rldi9udWxsDQo+ID4+ICsrKyBiL2FyY2gvcmlzY3Yva2VybmVsL2hpYmVybmF0ZS5jDQo+ ID4+IEBAIC0wLDAgKzEsNDI0IEBADQo+ID4+ICsvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjog R1BMLTIuMC1vbmx5DQo+ID4+ICsvKg0KPiA+PiArICogSGliZXJuYXRpb24gc3VwcG9ydCBmb3Ig UklTQ1YNCj4gPj4gKyAqDQo+ID4+ICsgKiBDb3B5cmlnaHQgKEMpIDIwMjMgU3RhckZpdmUgVGVj aG5vbG9neSBDby4sIEx0ZC4NCj4gPj4gKyAqDQo+ID4+ICsgKiBBdXRob3I6IEplZSBIZW5nIFNp YSA8amVlaGVuZy5zaWFAc3RhcmZpdmV0ZWNoLmNvbT4NCj4gPj4gKyAqLw0KPiA+PiArDQo+ID4+ ICsjaW5jbHVkZSA8YXNtL2JhcnJpZXIuaD4NCj4gPj4gKyNpbmNsdWRlIDxhc20vY2FjaGVmbHVz aC5oPg0KPiA+PiArI2luY2x1ZGUgPGFzbS9tbXVfY29udGV4dC5oPg0KPiA+PiArI2luY2x1ZGUg PGFzbS9wYWdlLmg+DQo+ID4+ICsjaW5jbHVkZSA8YXNtL3BnYWxsb2MuaD4NCj4gPj4gKyNpbmNs dWRlIDxhc20vcGd0YWJsZS5oPg0KPiA+PiArI2luY2x1ZGUgPGFzbS9zZWN0aW9ucy5oPg0KPiA+ PiArI2luY2x1ZGUgPGFzbS9zZXRfbWVtb3J5Lmg+DQo+ID4+ICsjaW5jbHVkZSA8YXNtL3NtcC5o Pg0KPiA+PiArI2luY2x1ZGUgPGFzbS9zdXNwZW5kLmg+DQo+ID4+ICsNCj4gPj4gKyNpbmNsdWRl IDxsaW51eC9jcHUuaD4NCj4gPj4gKyNpbmNsdWRlIDxsaW51eC9tZW1ibG9jay5oPg0KPiA+PiAr I2luY2x1ZGUgPGxpbnV4L3BtLmg+DQo+ID4+ICsjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4NCj4g Pj4gKyNpbmNsdWRlIDxsaW51eC9zdXNwZW5kLmg+DQo+ID4+ICsjaW5jbHVkZSA8bGludXgvdXRz bmFtZS5oPg0KPiA+PiArDQo+ID4+ICsvKiBUaGUgbG9naWNhbCBjcHUgbnVtYmVyIHdlIHNob3Vs ZCByZXN1bWUgb24sIGluaXRpYWxpc2VkIHRvIGENCj4gPj4gbm9uLWNwdSBudW1iZXIuICovDQo+ ID4+ICtzdGF0aWMgaW50IHNsZWVwX2NwdSA9IC1FSU5WQUw7DQo+ID4+ICsNCj4gPj4gKy8qIFBv aW50ZXIgdG8gdGhlIHRlbXBvcmFyeSByZXN1bWUgcGFnZSB0YWJsZS4gKi8NCj4gPj4gK3N0YXRp YyBwZ2RfdCAqcmVzdW1lX3BnX2RpcjsNCj4gPj4gKw0KPiA+PiArLyogQ1BVIGNvbnRleHQgdG8g YmUgc2F2ZWQuICovDQo+ID4+ICtzdHJ1Y3Qgc3VzcGVuZF9jb250ZXh0ICpoaWJlcm5hdGVfY3B1 X2NvbnRleHQ7DQo+ID4+ICtFWFBPUlRfU1lNQk9MX0dQTChoaWJlcm5hdGVfY3B1X2NvbnRleHQp Ow0KPiA+PiArDQo+ID4+ICt1bnNpZ25lZCBsb25nIHJlbG9jYXRlZF9yZXN0b3JlX2NvZGU7DQo+ ID4+ICtFWFBPUlRfU1lNQk9MX0dQTChyZWxvY2F0ZWRfcmVzdG9yZV9jb2RlKTsNCj4gPj4gKw0K PiA+PiArLyoqDQo+ID4+ICsgKiBzdHJ1Y3QgYXJjaF9oaWJlcm5hdGVfaGRyX2ludmFyaWFudHMg LSBjb250YWluZXIgdG8gc3RvcmUga2VybmVsDQo+ID4+IGJ1aWxkIHZlcnNpb24uDQo+ID4+ICsg KiBAdXRzX3ZlcnNpb246IHRvIHNhdmUgdGhlIGJ1aWxkIG51bWJlciBhbmQgZGF0ZSBzbyB0aGF0 IHRoZSB3ZSBkbw0KPiA+PiBub3QgcmVzdW1lIHdpdGgNCj4gPj4gKyAqwqDCoMKgwqDCoMKgwqAg YSBkaWZmZXJlbnQga2VybmVsLg0KPiA+PiArICovDQo+ID4+ICtzdHJ1Y3QgYXJjaF9oaWJlcm5h dGVfaGRyX2ludmFyaWFudHMgew0KPiA+PiArwqDCoMKgIGNoYXLCoMKgwqDCoMKgwqDCoCB1dHNf dmVyc2lvbltfX05FV19VVFNfTEVOICsgMV07DQo+ID4+ICt9Ow0KPiA+PiArDQo+ID4+ICsvKioN Cj4gPj4gKyAqIHN0cnVjdCBhcmNoX2hpYmVybmF0ZV9oZHIgLSBoZWxwZXIgcGFyYW1ldGVycyB0 aGF0IGhlbHAgdXMgdG8NCj4gPj4gcmVzdG9yZSB0aGUgaW1hZ2UuDQo+ID4+ICsgKiBAaW52YXJp YW50czogY29udGFpbmVyIHRvIHN0b3JlIGtlcm5lbCBidWlsZCB2ZXJzaW9uLg0KPiA+PiArICog QGhhcnRpZDogdG8gbWFrZSBzdXJlIHNhbWUgYm9vdF9jcHUgZXhlY3V0ZXMgdGhlDQo+ID4+IGhp YmVybmF0ZS9yZXN0b3JlIGNvZGUuDQo+ID4+ICsgKiBAc2F2ZWRfc2F0cDogb3JpZ2luYWwgcGFn ZSB0YWJsZSB1c2VkIGJ5IHRoZSBoaWJlcm5hdGVkIGltYWdlLg0KPiA+PiArICogQHJlc3RvcmVf Y3B1X2FkZHI6IHRoZSBrZXJuZWwncyBpbWFnZSBhZGRyZXNzIHRvIHJlc3RvcmUgdGhlIENQVQ0K PiA+PiBjb250ZXh0Lg0KPiA+PiArICovDQo+ID4+ICtzdGF0aWMgc3RydWN0IGFyY2hfaGliZXJu YXRlX2hkciB7DQo+ID4+ICvCoMKgwqAgc3RydWN0IGFyY2hfaGliZXJuYXRlX2hkcl9pbnZhcmlh bnRzIGludmFyaWFudHM7DQo+ID4+ICvCoMKgwqAgdW5zaWduZWQgbG9uZ8KgwqDCoCBoYXJ0aWQ7 DQo+ID4+ICvCoMKgwqAgdW5zaWduZWQgbG9uZ8KgwqDCoCBzYXZlZF9zYXRwOw0KPiA+PiArwqDC oMKgIHVuc2lnbmVkIGxvbmfCoMKgwqAgcmVzdG9yZV9jcHVfYWRkcjsNCj4gPj4gK30gcmVzdW1l X2hkcjsNCj4gPj4gKw0KPiA+PiArc3RhdGljIHZvaWQgYXJjaF9oZHJfaW52YXJpYW50cyhzdHJ1 Y3QgYXJjaF9oaWJlcm5hdGVfaGRyX2ludmFyaWFudHMNCj4gPj4gKmkpDQo+ID4+ICt7DQo+ID4+ ICvCoMKgwqAgbWVtc2V0KGksIDAsIHNpemVvZigqaSkpOw0KPiA+PiArwqDCoMKgIG1lbWNweShp LT51dHNfdmVyc2lvbiwgaW5pdF91dHNuYW1lKCktPnZlcnNpb24sDQo+ID4+IHNpemVvZihpLT51 dHNfdmVyc2lvbikpOw0KPiA+PiArfQ0KPiA+PiArDQo+ID4+ICsvKg0KPiA+PiArICogQ2hlY2sg aWYgdGhlIGdpdmVuIHBmbiBpcyBpbiB0aGUgJ25vc2F2ZScgc2VjdGlvbi4NCj4gPj4gKyAqLw0K PiA+PiAraW50IHBmbl9pc19ub3NhdmUodW5zaWduZWQgbG9uZyBwZm4pDQo+ID4+ICt7DQo+ID4+ ICvCoMKgwqAgdW5zaWduZWQgbG9uZyBub3NhdmVfYmVnaW5fcGZuID0gc3ltX3RvX3BmbigmX19u b3NhdmVfYmVnaW4pOw0KPiA+PiArwqDCoMKgIHVuc2lnbmVkIGxvbmcgbm9zYXZlX2VuZF9wZm4g PSBzeW1fdG9fcGZuKCZfX25vc2F2ZV9lbmQgLSAxKTsNCj4gPj4gKw0KPiA+PiArwqDCoMKgIHJl dHVybiAoKHBmbiA+PSBub3NhdmVfYmVnaW5fcGZuKSAmJiAocGZuIDw9IG5vc2F2ZV9lbmRfcGZu KSk7DQo+ID4+ICt9DQo+ID4+ICsNCj4gPj4gK3ZvaWQgbm90cmFjZSBzYXZlX3Byb2Nlc3Nvcl9z dGF0ZSh2b2lkKQ0KPiA+PiArew0KPiA+PiArwqDCoMKgIFdBUk5fT04obnVtX29ubGluZV9jcHVz KCkgIT0gMSk7DQo+ID4+ICt9DQo+ID4+ICsNCj4gPj4gK3ZvaWQgbm90cmFjZSByZXN0b3JlX3By b2Nlc3Nvcl9zdGF0ZSh2b2lkKQ0KPiA+PiArew0KPiA+PiArfQ0KPiA+PiArDQo+ID4+ICsvKg0K PiA+PiArICogSGVscGVyIHBhcmFtZXRlcnMgbmVlZCB0byBiZSBzYXZlZCB0byB0aGUgaGliZXJu YXRpb24gaW1hZ2UgaGVhZGVyLg0KPiA+PiArICovDQo+ID4+ICtpbnQgYXJjaF9oaWJlcm5hdGlv bl9oZWFkZXJfc2F2ZSh2b2lkICphZGRyLCB1bnNpZ25lZCBpbnQgbWF4X3NpemUpDQo+ID4+ICt7 DQo+ID4+ICvCoMKgwqAgc3RydWN0IGFyY2hfaGliZXJuYXRlX2hkciAqaGRyID0gYWRkcjsNCj4g Pj4gKw0KPiA+PiArwqDCoMKgIGlmIChtYXhfc2l6ZSA8IHNpemVvZigqaGRyKSkNCj4gPj4gK8Kg wqDCoMKgwqDCoMKgIHJldHVybiAtRU9WRVJGTE9XOw0KPiA+PiArDQo+ID4+ICvCoMKgwqAgYXJj aF9oZHJfaW52YXJpYW50cygmaGRyLT5pbnZhcmlhbnRzKTsNCj4gPj4gKw0KPiA+PiArwqDCoMKg IGhkci0+aGFydGlkID0gY3B1aWRfdG9faGFydGlkX21hcChzbGVlcF9jcHUpOw0KPiA+PiArwqDC oMKgIGhkci0+c2F2ZWRfc2F0cCA9IGNzcl9yZWFkKENTUl9TQVRQKTsNCj4gPj4gK8KgwqDCoCBo ZHItPnJlc3RvcmVfY3B1X2FkZHIgPSAodW5zaWduZWQgbG9uZylfX2hpYmVybmF0ZV9jcHVfcmVz dW1lOw0KPiA+PiArDQo+ID4+ICvCoMKgwqAgcmV0dXJuIDA7DQo+ID4+ICt9DQo+ID4+ICtFWFBP UlRfU1lNQk9MX0dQTChhcmNoX2hpYmVybmF0aW9uX2hlYWRlcl9zYXZlKTsNCj4gPj4gKw0KPiA+ PiArLyoNCj4gPj4gKyAqIFJldHJpZXZlIHRoZSBoZWxwZXIgcGFyYW1ldGVycyBmcm9tIHRoZSBo aWJlcm5hdGlvbiBpbWFnZSBoZWFkZXIuDQo+ID4+ICsgKi8NCj4gPj4gK2ludCBhcmNoX2hpYmVy bmF0aW9uX2hlYWRlcl9yZXN0b3JlKHZvaWQgKmFkZHIpDQo+ID4+ICt7DQo+ID4+ICvCoMKgwqAg c3RydWN0IGFyY2hfaGliZXJuYXRlX2hkcl9pbnZhcmlhbnRzIGludmFyaWFudHM7DQo+ID4+ICvC oMKgwqAgc3RydWN0IGFyY2hfaGliZXJuYXRlX2hkciAqaGRyID0gYWRkcjsNCj4gPj4gK8KgwqDC oCBpbnQgcmV0ID0gMDsNCj4gPj4gKw0KPiA+PiArwqDCoMKgIGFyY2hfaGRyX2ludmFyaWFudHMo JmludmFyaWFudHMpOw0KPiA+PiArDQo+ID4+ICvCoMKgwqAgaWYgKG1lbWNtcCgmaGRyLT5pbnZh cmlhbnRzLCAmaW52YXJpYW50cywgc2l6ZW9mKGludmFyaWFudHMpKSkgew0KPiA+PiArwqDCoMKg wqDCoMKgwqAgcHJfY3JpdCgiSGliZXJuYXRlIGltYWdlIG5vdCBnZW5lcmF0ZWQgYnkgdGhpcyBr ZXJuZWwhXG4iKTsNCj4gPj4gK8KgwqDCoMKgwqDCoMKgIHJldHVybiAtRUlOVkFMOw0KPiA+PiAr wqDCoMKgIH0NCj4gPj4gKw0KPiA+PiArwqDCoMKgIHNsZWVwX2NwdSA9IHJpc2N2X2hhcnRpZF90 b19jcHVpZChoZHItPmhhcnRpZCk7DQo+ID4+ICvCoMKgwqAgaWYgKHNsZWVwX2NwdSA8IDApIHsN Cj4gPj4gK8KgwqDCoMKgwqDCoMKgIHByX2NyaXQoIkhpYmVybmF0ZWQgb24gYSBDUFUgbm90IGtu b3duIHRvIHRoaXMga2VybmVsIVxuIik7DQo+ID4+ICvCoMKgwqDCoMKgwqDCoCBzbGVlcF9jcHUg PSAtRUlOVkFMOw0KPiA+PiArwqDCoMKgwqDCoMKgwqAgcmV0dXJuIC1FSU5WQUw7DQo+ID4+ICvC oMKgwqAgfQ0KPiA+PiArDQo+ID4+ICsjaWZkZWYgQ09ORklHX1NNUA0KPiA+PiArwqDCoMKgIHJl dCA9IGJyaW5ndXBfaGliZXJuYXRlX2NwdShzbGVlcF9jcHUpOw0KPiA+PiArwqDCoMKgIGlmIChy ZXQpIHsNCj4gPj4gK8KgwqDCoMKgwqDCoMKgIHNsZWVwX2NwdSA9IC1FSU5WQUw7DQo+ID4+ICvC oMKgwqDCoMKgwqDCoCByZXR1cm4gcmV0Ow0KPiA+PiArwqDCoMKgIH0NCj4gPj4gKyNlbmRpZg0K PiA+PiArwqDCoMKgIHJlc3VtZV9oZHIgPSAqaGRyOw0KPiA+PiArDQo+ID4+ICvCoMKgwqAgcmV0 dXJuIHJldDsNCj4gPj4gK30NCj4gPj4gK0VYUE9SVF9TWU1CT0xfR1BMKGFyY2hfaGliZXJuYXRp b25faGVhZGVyX3Jlc3RvcmUpOw0KPiA+PiArDQo+ID4+ICtpbnQgc3dzdXNwX2FyY2hfc3VzcGVu ZCh2b2lkKQ0KPiA+PiArew0KPiA+PiArwqDCoMKgIGludCByZXQgPSAwOw0KPiA+PiArDQo+ID4+ ICvCoMKgwqAgaWYgKF9fY3B1X3N1c3BlbmRfZW50ZXIoaGliZXJuYXRlX2NwdV9jb250ZXh0KSkg ew0KPiA+PiArwqDCoMKgwqDCoMKgwqAgc2xlZXBfY3B1ID0gc21wX3Byb2Nlc3Nvcl9pZCgpOw0K PiA+PiArwqDCoMKgwqDCoMKgwqAgc3VzcGVuZF9zYXZlX2NzcnMoaGliZXJuYXRlX2NwdV9jb250 ZXh0KTsNCj4gPj4gK8KgwqDCoMKgwqDCoMKgIHJldCA9IHN3c3VzcF9zYXZlKCk7DQo+ID4+ICvC oMKgwqAgfSBlbHNlIHsNCj4gPj4gK8KgwqDCoMKgwqDCoMKgIHN1c3BlbmRfcmVzdG9yZV9jc3Jz KGhpYmVybmF0ZV9jcHVfY29udGV4dCk7DQo+ID4+ICvCoMKgwqDCoMKgwqDCoCBmbHVzaF90bGJf YWxsKCk7DQo+ID4+ICvCoMKgwqDCoMKgwqDCoCBmbHVzaF9pY2FjaGVfYWxsKCk7DQo+ID4+ICsN Cj4gPj4gK8KgwqDCoMKgwqDCoMKgIC8qDQo+ID4+ICvCoMKgwqDCoMKgwqDCoMKgICogVGVsbCB0 aGUgaGliZXJuYXRpb24gY29yZSB0aGF0IHdlJ3ZlIGp1c3QgcmVzdG9yZWQgdGhlDQo+ID4+IG1l bW9yeS4NCj4gPj4gK8KgwqDCoMKgwqDCoMKgwqAgKi8NCj4gPj4gK8KgwqDCoMKgwqDCoMKgIGlu X3N1c3BlbmQgPSAwOw0KPiA+PiArwqDCoMKgwqDCoMKgwqAgc2xlZXBfY3B1ID0gLUVJTlZBTDsN Cj4gPj4gK8KgwqDCoCB9DQo+ID4+ICsNCj4gPj4gK8KgwqDCoCByZXR1cm4gcmV0Ow0KPiA+PiAr fQ0KPiA+PiArDQo+ID4+ICtzdGF0aWMgaW50IHRlbXBfcGd0YWJsZV9tYXBfcHRlKHBtZF90ICpk c3RfcG1kcCwgcG1kX3QgKnNyY19wbWRwLA0KPiA+PiB1bnNpZ25lZCBsb25nIHN0YXJ0LA0KPiA+ PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHVuc2lnbmVkIGxvbmcgZW5kLCBwZ3By b3RfdCBwcm90KQ0KPiA+PiArew0KPiA+PiArwqDCoMKgIHB0ZV90ICpzcmNfcHRlcDsNCj4gPj4g K8KgwqDCoCBwdGVfdCAqZHN0X3B0ZXA7DQo+ID4+ICsNCj4gPj4gK8KgwqDCoCBpZiAocG1kX25v bmUoUkVBRF9PTkNFKCpkc3RfcG1kcCkpKSB7DQo+ID4+ICvCoMKgwqDCoMKgwqDCoCBkc3RfcHRl cCA9IChwdGVfdCAqKWdldF9zYWZlX3BhZ2UoR0ZQX0FUT01JQyk7DQo+ID4+ICvCoMKgwqDCoMKg wqDCoCBpZiAoIWRzdF9wdGVwKQ0KPiA+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCByZXR1cm4g LUVOT01FTTsNCj4gPj4gKw0KPiA+PiArwqDCoMKgwqDCoMKgwqAgcG1kX3BvcHVsYXRlX2tlcm5l bChOVUxMLCBkc3RfcG1kcCwgZHN0X3B0ZXApOw0KPiA+PiArwqDCoMKgIH0NCj4gPj4gKw0KPiA+ PiArwqDCoMKgIGRzdF9wdGVwID0gcHRlX29mZnNldF9rZXJuZWwoZHN0X3BtZHAsIHN0YXJ0KTsN Cj4gPj4gK8KgwqDCoCBzcmNfcHRlcCA9IHB0ZV9vZmZzZXRfa2VybmVsKHNyY19wbWRwLCBzdGFy dCk7DQo+ID4+ICsNCj4gPj4gK8KgwqDCoCBkbyB7DQo+ID4+ICvCoMKgwqDCoMKgwqDCoCBwdGVf dCBwdGUgPSBSRUFEX09OQ0UoKnNyY19wdGVwKTsNCj4gPj4gKw0KPiA+PiArwqDCoMKgwqDCoMKg wqAgaWYgKHB0ZV9wcmVzZW50KHB0ZSkpDQo+ID4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHNl dF9wdGUoZHN0X3B0ZXAsIF9fcHRlKHB0ZV92YWwocHRlKSB8IHBncHJvdF92YWwocHJvdCkpKTsN Cj4gPj4gK8KgwqDCoCB9IHdoaWxlIChkc3RfcHRlcCsrLCBzcmNfcHRlcCsrLCBzdGFydCArPSBQ QUdFX1NJWkUsIHN0YXJ0IDwgZW5kKTsNCj4gPj4gKw0KPiA+PiArwqDCoMKgIHJldHVybiAwOw0K PiA+PiArfQ0KPiA+PiArDQo+ID4+ICtzdGF0aWMgaW50IHRlbXBfcGd0YWJsZV9tYXBfcG1kKHB1 ZF90ICpkc3RfcHVkcCwgcHVkX3QgKnNyY19wdWRwLA0KPiA+PiB1bnNpZ25lZCBsb25nIHN0YXJ0 LA0KPiA+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHVuc2lnbmVkIGxvbmcgZW5k LCBwZ3Byb3RfdCBwcm90KQ0KPiA+PiArew0KPiA+PiArwqDCoMKgIHVuc2lnbmVkIGxvbmcgbmV4 dDsNCj4gPj4gK8KgwqDCoCB1bnNpZ25lZCBsb25nIHJldDsNCj4gPj4gK8KgwqDCoCBwbWRfdCAq c3JjX3BtZHA7DQo+ID4+ICvCoMKgwqAgcG1kX3QgKmRzdF9wbWRwOw0KPiA+PiArDQo+ID4+ICvC oMKgwqAgaWYgKHB1ZF9ub25lKFJFQURfT05DRSgqZHN0X3B1ZHApKSkgew0KPiA+PiArwqDCoMKg wqDCoMKgwqAgZHN0X3BtZHAgPSAocG1kX3QgKilnZXRfc2FmZV9wYWdlKEdGUF9BVE9NSUMpOw0K PiA+PiArwqDCoMKgwqDCoMKgwqAgaWYgKCFkc3RfcG1kcCkNCj4gPj4gK8KgwqDCoMKgwqDCoMKg wqDCoMKgwqAgcmV0dXJuIC1FTk9NRU07DQo+ID4+ICsNCj4gPj4gK8KgwqDCoMKgwqDCoMKgIHB1 ZF9wb3B1bGF0ZShOVUxMLCBkc3RfcHVkcCwgZHN0X3BtZHApOw0KPiA+PiArwqDCoMKgIH0NCj4g Pj4gKw0KPiA+PiArwqDCoMKgIGRzdF9wbWRwID0gcG1kX29mZnNldChkc3RfcHVkcCwgc3RhcnQp Ow0KPiA+PiArwqDCoMKgIHNyY19wbWRwID0gcG1kX29mZnNldChzcmNfcHVkcCwgc3RhcnQpOw0K PiA+PiArDQo+ID4+ICvCoMKgwqAgZG8gew0KPiA+PiArwqDCoMKgwqDCoMKgwqAgcG1kX3QgcG1k ID0gUkVBRF9PTkNFKCpzcmNfcG1kcCk7DQo+ID4+ICsNCj4gPj4gK8KgwqDCoMKgwqDCoMKgIG5l eHQgPSBwbWRfYWRkcl9lbmQoc3RhcnQsIGVuZCk7DQo+ID4+ICsNCj4gPj4gK8KgwqDCoMKgwqDC oMKgIGlmIChwbWRfbm9uZShwbWQpKQ0KPiA+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBjb250 aW51ZTsNCj4gPj4gKw0KPiA+PiArwqDCoMKgwqDCoMKgwqAgaWYgKHBtZF9sZWFmKHBtZCkpIHsN Cj4gPj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqAgc2V0X3BtZChkc3RfcG1kcCwgX19wbWQocG1k X3ZhbChwbWQpIHwgcGdwcm90X3ZhbChwcm90KSkpOw0KPiA+PiArwqDCoMKgwqDCoMKgwqAgfSBl bHNlIHsNCj4gPj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqAgcmV0ID0gdGVtcF9wZ3RhYmxlX21h cF9wdGUoZHN0X3BtZHAsIHNyY19wbWRwLCBzdGFydCwNCj4gPj4gbmV4dCwgcHJvdCk7DQo+ID4+ ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGlmIChyZXQpDQo+ID4+ICvCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqAgcmV0dXJuIC1FTk9NRU07DQo+ID4+ICvCoMKgwqDCoMKgwqDCoCB9DQo+ ID4+ICvCoMKgwqAgfSB3aGlsZSAoZHN0X3BtZHArKywgc3JjX3BtZHArKywgc3RhcnQgPSBuZXh0 LCBzdGFydCAhPSBlbmQpOw0KPiA+PiArDQo+ID4+ICvCoMKgwqAgcmV0dXJuIDA7DQo+ID4+ICt9 DQo+ID4+ICsNCj4gPj4gK3N0YXRpYyBpbnQgdGVtcF9wZ3RhYmxlX21hcF9wdWQocDRkX3QgKmRz dF9wNGRwLCBwNGRfdCAqc3JjX3A0ZHAsDQo+ID4+IHVuc2lnbmVkIGxvbmcgc3RhcnQsDQo+ID4+ ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgdW5zaWduZWQgbG9uZyBlbmQsIHBncHJv dF90IHByb3QpDQo+ID4+ICt7DQo+ID4+ICvCoMKgwqAgdW5zaWduZWQgbG9uZyBuZXh0Ow0KPiA+ PiArwqDCoMKgIHVuc2lnbmVkIGxvbmcgcmV0Ow0KPiA+PiArwqDCoMKgIHB1ZF90ICpkc3RfcHVk cDsNCj4gPj4gK8KgwqDCoCBwdWRfdCAqc3JjX3B1ZHA7DQo+ID4+ICsNCj4gPj4gK8KgwqDCoCBp ZiAocDRkX25vbmUoUkVBRF9PTkNFKCpkc3RfcDRkcCkpKSB7DQo+ID4+ICvCoMKgwqDCoMKgwqDC oCBkc3RfcHVkcCA9IChwdWRfdCAqKWdldF9zYWZlX3BhZ2UoR0ZQX0FUT01JQyk7DQo+ID4+ICvC oMKgwqDCoMKgwqDCoCBpZiAoIWRzdF9wdWRwKQ0KPiA+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDC oCByZXR1cm4gLUVOT01FTTsNCj4gPj4gKw0KPiA+PiArwqDCoMKgwqDCoMKgwqAgcDRkX3BvcHVs YXRlKE5VTEwsIGRzdF9wNGRwLCBkc3RfcHVkcCk7DQo+ID4+ICvCoMKgwqAgfQ0KPiA+PiArDQo+ ID4+ICvCoMKgwqAgZHN0X3B1ZHAgPSBwdWRfb2Zmc2V0KGRzdF9wNGRwLCBzdGFydCk7DQo+ID4+ ICvCoMKgwqAgc3JjX3B1ZHAgPSBwdWRfb2Zmc2V0KHNyY19wNGRwLCBzdGFydCk7DQo+ID4+ICsN Cj4gPj4gK8KgwqDCoCBkbyB7DQo+ID4+ICvCoMKgwqDCoMKgwqDCoCBwdWRfdCBwdWQgPSBSRUFE X09OQ0UoKnNyY19wdWRwKTsNCj4gPj4gKw0KPiA+PiArwqDCoMKgwqDCoMKgwqAgbmV4dCA9IHB1 ZF9hZGRyX2VuZChzdGFydCwgZW5kKTsNCj4gPj4gKw0KPiA+PiArwqDCoMKgwqDCoMKgwqAgaWYg KHB1ZF9ub25lKHB1ZCkpDQo+ID4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGNvbnRpbnVlOw0K PiA+PiArDQo+ID4+ICvCoMKgwqDCoMKgwqDCoCBpZiAocHVkX2xlYWYocHVkKSkgew0KPiA+PiAr wqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBzZXRfcHVkKGRzdF9wdWRwLCBfX3B1ZChwdWRfdmFsKHB1 ZCkgfCBwZ3Byb3RfdmFsKHByb3QpKSk7DQo+ID4+ICvCoMKgwqDCoMKgwqDCoCB9IGVsc2Ugew0K PiA+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCByZXQgPSB0ZW1wX3BndGFibGVfbWFwX3BtZChk c3RfcHVkcCwgc3JjX3B1ZHAsIHN0YXJ0LA0KPiA+PiBuZXh0LCBwcm90KTsNCj4gPj4gK8KgwqDC oMKgwqDCoMKgwqDCoMKgwqAgaWYgKHJldCkNCj4gPj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoCByZXR1cm4gLUVOT01FTTsNCj4gPj4gK8KgwqDCoMKgwqDCoMKgIH0NCj4gPj4gK8Kg wqDCoCB9IHdoaWxlIChkc3RfcHVkcCsrLCBzcmNfcHVkcCsrLCBzdGFydCA9IG5leHQsIHN0YXJ0 ICE9IGVuZCk7DQo+ID4+ICsNCj4gPj4gK8KgwqDCoCByZXR1cm4gMDsNCj4gPj4gK30NCj4gPj4g Kw0KPiA+PiArc3RhdGljIGludCB0ZW1wX3BndGFibGVfbWFwX3A0ZChwZ2RfdCAqZHN0X3BnZHAs IHBnZF90ICpzcmNfcGdkcCwNCj4gPj4gdW5zaWduZWQgbG9uZyBzdGFydCwNCj4gPj4gK8KgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCB1bnNpZ25lZCBsb25nIGVuZCwgcGdwcm90X3QgcHJv dCkNCj4gPj4gK3sNCj4gPj4gK8KgwqDCoCB1bnNpZ25lZCBsb25nIG5leHQ7DQo+ID4+ICvCoMKg wqAgdW5zaWduZWQgbG9uZyByZXQ7DQo+ID4+ICvCoMKgwqAgcDRkX3QgKmRzdF9wNGRwOw0KPiA+ PiArwqDCoMKgIHA0ZF90ICpzcmNfcDRkcDsNCj4gPj4gKw0KPiA+PiArwqDCoMKgIGlmIChwZ2Rf bm9uZShSRUFEX09OQ0UoKmRzdF9wZ2RwKSkpIHsNCj4gPj4gK8KgwqDCoMKgwqDCoMKgIGRzdF9w NGRwID0gKHA0ZF90ICopZ2V0X3NhZmVfcGFnZShHRlBfQVRPTUlDKTsNCj4gPj4gK8KgwqDCoMKg wqDCoMKgIGlmICghZHN0X3A0ZHApDQo+ID4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHJldHVy biAtRU5PTUVNOw0KPiA+PiArDQo+ID4+ICvCoMKgwqDCoMKgwqDCoCBwZ2RfcG9wdWxhdGUoTlVM TCwgZHN0X3BnZHAsIGRzdF9wNGRwKTsNCj4gPj4gK8KgwqDCoCB9DQo+ID4+ICsNCj4gPj4gK8Kg wqDCoCBkc3RfcDRkcCA9IHA0ZF9vZmZzZXQoZHN0X3BnZHAsIHN0YXJ0KTsNCj4gPj4gK8KgwqDC oCBzcmNfcDRkcCA9IHA0ZF9vZmZzZXQoc3JjX3BnZHAsIHN0YXJ0KTsNCj4gPj4gKw0KPiA+PiAr wqDCoMKgIGRvIHsNCj4gPj4gK8KgwqDCoMKgwqDCoMKgIHA0ZF90IHA0ZCA9IFJFQURfT05DRSgq c3JjX3A0ZHApOw0KPiA+PiArDQo+ID4+ICvCoMKgwqDCoMKgwqDCoCBuZXh0ID0gcDRkX2FkZHJf ZW5kKHN0YXJ0LCBlbmQpOw0KPiA+PiArDQo+ID4+ICvCoMKgwqDCoMKgwqDCoCBpZiAocDRkX25v bmUocDRkKSkNCj4gPj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqAgY29udGludWU7DQo+ID4+ICsN Cj4gPj4gK8KgwqDCoMKgwqDCoMKgIGlmIChwNGRfbGVhZihwNGQpKSB7DQo+ID4+ICvCoMKgwqDC oMKgwqDCoMKgwqDCoMKgIHNldF9wNGQoZHN0X3A0ZHAsIF9fcDRkKHA0ZF92YWwocDRkKSB8IHBn cHJvdF92YWwocHJvdCkpKTsNCj4gPj4gK8KgwqDCoMKgwqDCoMKgIH0gZWxzZSB7DQo+ID4+ICvC oMKgwqDCoMKgwqDCoMKgwqDCoMKgIHJldCA9IHRlbXBfcGd0YWJsZV9tYXBfcHVkKGRzdF9wNGRw LCBzcmNfcDRkcCwgc3RhcnQsDQo+ID4+IG5leHQsIHByb3QpOw0KPiA+PiArwqDCoMKgwqDCoMKg wqDCoMKgwqDCoCBpZiAocmV0KQ0KPiA+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg IHJldHVybiAtRU5PTUVNOw0KPiA+PiArwqDCoMKgwqDCoMKgwqAgfQ0KPiA+PiArwqDCoMKgIH0g d2hpbGUgKGRzdF9wNGRwKyssIHNyY19wNGRwKyssIHN0YXJ0ID0gbmV4dCwgc3RhcnQgIT0gZW5k KTsNCj4gPj4gKw0KPiA+PiArwqDCoMKgIHJldHVybiAwOw0KPiA+PiArfQ0KPiA+PiArDQo+ID4+ ICtzdGF0aWMgaW50IHRlbXBfcGd0YWJsZV9tYXBwaW5nKHBnZF90ICpwZ2RwLCB1bnNpZ25lZCBs b25nIHN0YXJ0LA0KPiA+PiB1bnNpZ25lZCBsb25nIGVuZCwgcGdwcm90X3QgcHJvdCkNCj4gPj4g K3sNCj4gPj4gK8KgwqDCoCBwZ2RfdCAqZHN0X3BnZHAgPSBwZ2Rfb2Zmc2V0X3BnZChwZ2RwLCBz dGFydCk7DQo+ID4+ICvCoMKgwqAgcGdkX3QgKnNyY19wZ2RwID0gcGdkX29mZnNldF9rKHN0YXJ0 KTsNCj4gPj4gK8KgwqDCoCB1bnNpZ25lZCBsb25nIG5leHQ7DQo+ID4+ICvCoMKgwqAgdW5zaWdu ZWQgbG9uZyByZXQ7DQo+ID4+ICsNCj4gPj4gK8KgwqDCoCBkbyB7DQo+ID4+ICvCoMKgwqDCoMKg wqDCoCBwZ2RfdCBwZ2QgPSBSRUFEX09OQ0UoKnNyY19wZ2RwKTsNCj4gPj4gKw0KPiA+PiArwqDC oMKgwqDCoMKgwqAgbmV4dCA9IHBnZF9hZGRyX2VuZChzdGFydCwgZW5kKTsNCj4gPj4gKw0KPiA+ PiArwqDCoMKgwqDCoMKgwqAgaWYgKHBnZF9ub25lKHBnZCkpDQo+ID4+ICvCoMKgwqDCoMKgwqDC oMKgwqDCoMKgIGNvbnRpbnVlOw0KPiA+PiArDQo+ID4+ICvCoMKgwqDCoMKgwqDCoCBpZiAocGdk X2xlYWYocGdkKSkgew0KPiA+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBzZXRfcGdkKGRzdF9w Z2RwLCBfX3BnZChwZ2RfdmFsKHBnZCkgfCBwZ3Byb3RfdmFsKHByb3QpKSk7DQo+ID4+ICvCoMKg wqDCoMKgwqDCoCB9IGVsc2Ugew0KPiA+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCByZXQgPSB0 ZW1wX3BndGFibGVfbWFwX3A0ZChkc3RfcGdkcCwgc3JjX3BnZHAsIHN0YXJ0LA0KPiA+PiBuZXh0 LCBwcm90KTsNCj4gPj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqAgaWYgKHJldCkNCj4gPj4gK8Kg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCByZXR1cm4gLUVOT01FTTsNCj4gPj4gK8KgwqDC oMKgwqDCoMKgIH0NCj4gPj4gK8KgwqDCoCB9IHdoaWxlIChkc3RfcGdkcCsrLCBzcmNfcGdkcCsr LCBzdGFydCA9IG5leHQsIHN0YXJ0ICE9IGVuZCk7DQo+ID4+ICsNCj4gPj4gK8KgwqDCoCByZXR1 cm4gMDsNCj4gPj4gK30NCj4gPj4gKw0KPiA+PiArc3RhdGljIHVuc2lnbmVkIGxvbmcgcmVsb2Nh dGVfcmVzdG9yZV9jb2RlKHZvaWQpDQo+ID4+ICt7DQo+ID4+ICvCoMKgwqAgdm9pZCAqcGFnZSA9 ICh2b2lkICopZ2V0X3NhZmVfcGFnZShHRlBfQVRPTUlDKTsNCj4gPj4gKw0KPiA+PiArwqDCoMKg IGlmICghcGFnZSkNCj4gPj4gK8KgwqDCoMKgwqDCoMKgIHJldHVybiAtRU5PTUVNOw0KPiA+PiAr DQo+ID4+ICvCoMKgwqAgY29weV9wYWdlKHBhZ2UsIGhpYmVybmF0ZV9jb3JlX3Jlc3RvcmVfY29k ZSk7DQo+ID4+ICsNCj4gPj4gK8KgwqDCoCAvKiBNYWtlIHRoZSBwYWdlIGNvbnRhaW5pbmcgdGhl IHJlbG9jYXRlZCBjb2RlIGV4ZWN1dGFibGUuICovDQo+ID4+ICvCoMKgwqAgc2V0X21lbW9yeV94 KCh1bnNpZ25lZCBsb25nKXBhZ2UsIDEpOw0KPiA+PiArDQo+ID4+ICvCoMKgwqAgcmV0dXJuICh1 bnNpZ25lZCBsb25nKXBhZ2U7DQo+ID4+ICt9DQo+ID4+ICsNCj4gPj4gK2ludCBzd3N1c3BfYXJj aF9yZXN1bWUodm9pZCkNCj4gPj4gK3sNCj4gPj4gK8KgwqDCoCB1bnNpZ25lZCBsb25nIGVuZCA9 ICh1bnNpZ25lZCBsb25nKXBmbl90b192aXJ0KG1heF9sb3dfcGZuKTsNCj4gPj4gK8KgwqDCoCB1 bnNpZ25lZCBsb25nIHN0YXJ0ID0gUEFHRV9PRkZTRVQ7DQo+ID4+ICvCoMKgwqAgaW50IHJldDsN Cj4gPj4gKw0KPiA+PiArwqDCoMKgIC8qDQo+ID4+ICvCoMKgwqDCoCAqIE1lbW9yeSBhbGxvY2F0 ZWQgYnkgZ2V0X3NhZmVfcGFnZSgpIHdpbGwgYmUgZGVhbHQgd2l0aCBieSB0aGUNCj4gPj4gaGli ZXJuYXRpb24gY29yZSwNCj4gPj4gK8KgwqDCoMKgICogd2UgZG9uJ3QgbmVlZCB0byBmcmVlIGl0 IGhlcmUuDQo+ID4+ICvCoMKgwqDCoCAqLw0KPiA+PiArwqDCoMKgIHJlc3VtZV9wZ19kaXIgPSAo cGdkX3QgKilnZXRfc2FmZV9wYWdlKEdGUF9BVE9NSUMpOw0KPiA+PiArwqDCoMKgIGlmICghcmVz dW1lX3BnX2RpcikNCj4gPj4gK8KgwqDCoMKgwqDCoMKgIHJldHVybiAtRU5PTUVNOw0KPiA+PiAr DQo+ID4+ICvCoMKgwqAgLyoNCj4gPj4gK8KgwqDCoMKgICogQ3JlYXRlIGEgdGVtcG9yYXJ5IHBh Z2UgdGFibGUgYW5kIG1hcCB0aGUgd2hvbGUgbGluZWFyIHJlZ2lvbg0KPiA+PiBhcyBleGVjdXRh YmxlIGFuZA0KPiA+PiArwqDCoMKgwqAgKiB3cml0YWJsZS4NCj4gPj4gK8KgwqDCoMKgICovDQo+ ID4+ICvCoMKgwqAgcmV0ID0gdGVtcF9wZ3RhYmxlX21hcHBpbmcocmVzdW1lX3BnX2Rpciwgc3Rh cnQsIGVuZCwNCj4gPj4gX19wZ3Byb3QoX1BBR0VfV1JJVEUgfCBfUEFHRV9FWEVDKSk7DQo+ID4N Cj4gPg0KPiA+IEhtbSB3ZWlyZCBwcm90ZWN0aW9ucywgUEFHRV9QUkVTRU5UIGFuZCBQQUdFX1JF QUQgYXJlIG5vdCBldmVuIHNldC4NCj4gPiBTaG91bGRuJ3QgeW91IHVzZSBQQUdFX0tFUk5FTF9F WEVDIGluc3RlYWQ/DQo+IA0KPiANCj4gRm9yZ2V0IHRoaXMgb25lLCB0aGF0J3MgdGhlIHByb3Rl Y3Rpb25zIHlvdSBhZGQsIHNvIHRoYXQncyBnb29kIDopDQpPSy4NCj4gDQo+IA0KPiA+DQo+ID4N Cj4gPj4gK8KgwqDCoCBpZiAocmV0KQ0KPiA+PiArwqDCoMKgwqDCoMKgwqAgcmV0dXJuIHJldDsN Cj4gPj4gKw0KPiA+PiArwqDCoMKgIC8qIE1vdmUgdGhlIHJlc3RvcmUgY29kZSB0byBhIG5ldyBw YWdlIHNvIHRoYXQgaXQgZG9lc24ndCBnZXQNCj4gPj4gb3ZlcndyaXR0ZW4gYnkgaXRzZWxmLiAq Lw0KPiA+PiArwqDCoMKgIHJlbG9jYXRlZF9yZXN0b3JlX2NvZGUgPSByZWxvY2F0ZV9yZXN0b3Jl X2NvZGUoKTsNCj4gPj4gK8KgwqDCoCBpZiAocmVsb2NhdGVkX3Jlc3RvcmVfY29kZSA9PSAtRU5P TUVNKQ0KPiA+PiArwqDCoMKgwqDCoMKgwqAgcmV0dXJuIC1FTk9NRU07DQo+ID4+ICsNCj4gPj4g K8KgwqDCoCAvKg0KPiA+PiArwqDCoMKgwqAgKiBNYXAgdGhlIF9faGliZXJuYXRlX2NwdV9yZXN1 bWUoKSBhZGRyZXNzIHRvIHRoZSB0ZW1wb3JhcnkNCj4gPj4gcGFnZSB0YWJsZSBzbyB0aGF0IHRo ZQ0KPiA+PiArwqDCoMKgwqAgKiByZXN0b3JlIGNvZGUgY2FuIGp1bXBzIHRvIGl0IGFmdGVyIGZp bmlzaGVkIHJlc3RvcmUgdGhlDQo+ID4+IGltYWdlLiBUaGUgbmV4dCBleGVjdXRpb24NCj4gPj4g K8KgwqDCoMKgICogY29kZSBkb2Vzbid0IGZpbmQgaXRzZWxmIGluIGEgZGlmZmVyZW50IGFkZHJl c3Mgc3BhY2UgYWZ0ZXINCj4gPj4gc3dpdGNoaW5nIG92ZXIgdG8gdGhlDQo+ID4+ICvCoMKgwqDC oCAqIG9yaWdpbmFsIHBhZ2UgdGFibGUgdXNlZCBieSB0aGUgaGliZXJuYXRlZCBpbWFnZS4NCj4g Pj4gK8KgwqDCoMKgICoNCj4gPj4gK8KgwqDCoMKgICovDQo+ID4+ICvCoMKgwqAgc3RhcnQgPSAo dW5zaWduZWQgbG9uZylyZXN1bWVfaGRyLnJlc3RvcmVfY3B1X2FkZHI7DQo+ID4+ICvCoMKgwqAg ZW5kID0gc3RhcnQgKyBQQUdFX1NJWkU7DQo+ID4+ICsNCj4gPj4gK8KgwqDCoCByZXQgPSB0ZW1w X3BndGFibGVfbWFwcGluZyhyZXN1bWVfcGdfZGlyLCBzdGFydCwgZW5kLA0KPiA+PiBfX3BncHJv dChfUEFHRV9XUklURSB8IF9QQUdFX0VYRUMpKTsNCj4gPj4gK8KgwqDCoCBpZiAocmV0KQ0KPiA+ PiArwqDCoMKgwqDCoMKgwqAgcmV0dXJuIHJldDsNCj4gPg0KPiA+DQo+ID4gWW91IHNldCB0aGUg bGluZWFyIG1hcHBpbmcgYXMgZXhlY3V0YWJsZSBzbyBubyBuZWVkIGZvciB0aGlzLg0KV2UgbmVl ZCB0aGlzIG1hcHBpbmcgYmVjYXVzZSB0aGUga2VybmVsIGFkZHJlc3NlcyBhbmQgdGhlIGxpbmVh ciBhZGRyZXNzZXMgaW4gcmlzY3YtNjRiaXQgYXJlIGluIGRpZmZlcmVudCBib3VuZGFyeS4gRm9y IGV4YW1wbGU6DQpMaW5lYXIgYWRkcmVzcyBzdGFydCB3aXRoIDB4ZmY2MDAwMDAwMDAwMDAwMA0K S2VybmVsIGFkZHJlc3Mgc3RhcnQgd2l0aCAweGZmZmZmZmZmODAwMDAwMDANCj4gPg0KPiA+DQo+ ID4+ICsNCj4gPj4gK8KgwqDCoCBoaWJlcm5hdGVfcmVzdG9yZV9pbWFnZShyZXN1bWVfaGRyLnNh dmVkX3NhdHAsDQo+ID4+IChQRk5fRE9XTihfX3BhKHJlc3VtZV9wZ19kaXIpKSB8IHNhdHBfbW9k ZSksDQo+ID4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgcmVzdW1lX2hkci5yZXN0 b3JlX2NwdV9hZGRyKTsNCj4gPj4gKw0KPiA+PiArwqDCoMKgIHJldHVybiAwOw0KPiA+PiArfQ0K PiA+PiArDQo+ID4+ICsjaWZkZWYgQ09ORklHX1BNX1NMRUVQX1NNUA0KPiA+PiAraW50IGhpYmVy bmF0ZV9yZXN1bWVfbm9uYm9vdF9jcHVfZGlzYWJsZSh2b2lkKQ0KPiA+PiArew0KPiA+PiArwqDC oMKgIGlmIChzbGVlcF9jcHUgPCAwKSB7DQo+ID4+ICvCoMKgwqDCoMKgwqDCoCBwcl9lcnIoIkZh aWxpbmcgdG8gcmVzdW1lIGZyb20gaGliZXJuYXRlIG9uIGFuIHVua25vd24gQ1BVXG4iKTsNCj4g Pj4gK8KgwqDCoMKgwqDCoMKgIHJldHVybiAtRU5PREVWOw0KPiA+PiArwqDCoMKgIH0NCj4gPj4g Kw0KPiA+PiArwqDCoMKgIHJldHVybiBmcmVlemVfc2Vjb25kYXJ5X2NwdXMoc2xlZXBfY3B1KTsN Cj4gPj4gK30NCj4gPj4gKyNlbmRpZg0KPiA+PiArDQo+ID4+ICtzdGF0aWMgaW50IF9faW5pdCBy aXNjdl9oaWJlcm5hdGVfaW5pdCh2b2lkKQ0KPiA+PiArew0KPiA+PiArwqDCoMKgIGhpYmVybmF0 ZV9jcHVfY29udGV4dCA9IGt6YWxsb2Moc2l6ZW9mKCpoaWJlcm5hdGVfY3B1X2NvbnRleHQpLA0K PiA+PiBHRlBfS0VSTkVMKTsNCj4gPj4gKw0KPiA+PiArwqDCoMKgIGlmIChXQVJOX09OKCFoaWJl cm5hdGVfY3B1X2NvbnRleHQpKQ0KPiA+PiArwqDCoMKgwqDCoMKgwqAgcmV0dXJuIC1FTk9NRU07 DQo+ID4+ICsNCj4gPj4gK8KgwqDCoCByZXR1cm4gMDsNCj4gPj4gK30NCj4gPj4gKw0KPiA+PiAr ZWFybHlfaW5pdGNhbGwocmlzY3ZfaGliZXJuYXRlX2luaXQpOw0KPiA+DQo+ID4gX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18NCj4gPiBsaW51eC1yaXNjdiBt YWlsaW5nIGxpc3QNCj4gPiBsaW51eC1yaXNjdkBsaXN0cy5pbmZyYWRlYWQub3JnDQo+ID4gaHR0 cDovL2xpc3RzLmluZnJhZGVhZC5vcmcvbWFpbG1hbi9saXN0aW5mby9saW51eC1yaXNjdg0K