From mboxrd@z Thu Jan 1 00:00:00 1970 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 bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id B66E7C4345F for ; Mon, 22 Apr 2024 16:33:45 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender: Content-Transfer-Encoding:Content-Type:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:In-Reply-To:From:References:Cc:To: Subject:MIME-Version:Date:Message-ID:Reply-To:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=XpDiQyt/eZMlE/71NWUwnG+JspcLS/6ip8OKaWdkMpw=; b=ieg+ar1GwrNgSf M7oiFEt37i0k9ZpNuRSHoEtfgbmgIfHmhg0r8//rS83h7IgnzjoS6Z//NkVuJOl8ZdlUiHSI6ZBj1 fB8kfYl4R0iZj9nOQfrDjYBxwspDeJUI9TfxezB8x7jllo5HzdTz+QAQ8atnfkQkdz5yAGsljhBYR Jpufxwr6f3MGtZz70PGh0qQj51CBh3DPtdKECdQt4HzWec/7Gm5q19534vJwDc2Kjhrsm16cRNJeR brvjv8uqLPo06sFyvy9ZytPHh6YxNfcTr01aiQX7/e0L+QxjbTF8HliQSq+83pIKaO0DfdQ0FY8T/ 0KkOyhwN0kHwqVanS8MA==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.97.1 #2 (Red Hat Linux)) id 1rywbe-0000000EIcL-2hoJ; Mon, 22 Apr 2024 16:33:26 +0000 Received: from foss.arm.com ([217.140.110.172]) by bombadil.infradead.org with esmtp (Exim 4.97.1 #2 (Red Hat Linux)) id 1rywbb-0000000EIbl-0fMe for linux-arm-kernel@lists.infradead.org; Mon, 22 Apr 2024 16:33:25 +0000 Received: from usa-sjc-imap-foss1.foss.arm.com (unknown [10.121.207.14]) by usa-sjc-mx-foss1.foss.arm.com (Postfix) with ESMTP id 52910339; Mon, 22 Apr 2024 09:33:47 -0700 (PDT) Received: from [10.57.54.223] (unknown [10.57.54.223]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPSA id 742553F7BD; Mon, 22 Apr 2024 09:33:15 -0700 (PDT) Message-ID: Date: Mon, 22 Apr 2024 17:33:16 +0100 MIME-Version: 1.0 User-Agent: Mozilla Thunderbird Subject: Re: [PATCH v2 09/43] arm64: RME: ioctls to create and configure realms To: Suzuki K Poulose , kvm@vger.kernel.org, kvmarm@lists.linux.dev Cc: Catalin Marinas , Marc Zyngier , Will Deacon , James Morse , Oliver Upton , Zenghui Yu , linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, Joey Gouly , Alexandru Elisei , Christoffer Dall , Fuad Tabba , linux-coco@lists.linux.dev, Ganapatrao Kulkarni , Jean-Philippe Brucker References: <20240412084056.1733704-1-steven.price@arm.com> <20240412084309.1733783-1-steven.price@arm.com> <20240412084309.1733783-10-steven.price@arm.com> <03030dd1-9980-4050-a950-bb82cef27def@arm.com> From: Steven Price Content-Language: en-GB In-Reply-To: <03030dd1-9980-4050-a950-bb82cef27def@arm.com> X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20240422_093323_507017_19BF8A1A X-CRM114-Status: GOOD ( 50.29 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org T24gMTcvMDQvMjAyNCAxMDo1MSwgU3V6dWtpIEsgUG91bG9zZSB3cm90ZToKPiBIaSBTdGV2ZW4K PiAKPiBPbiAxMi8wNC8yMDI0IDA5OjQyLCBTdGV2ZW4gUHJpY2Ugd3JvdGU6Cj4+IEFkZCB0aGUg S1ZNX0NBUF9BUk1fUk1FX0NSRUFURV9GRCBpb2N0bCB0byBjcmVhdGUgYSByZWFsbS4gVGhpcyBp bnZvbHZlcwo+IAo+IG1pbm9yIG5pdDogcy9GRC9SRAo+IAo+PiBkZWxlZ2F0aW5nIHBhZ2VzIHRv IHRoZSBSTU0gdG8gaG9sZCB0aGUgUmVhbG0gRGVzY3JpcHRvciAoUkQpIGFuZCBmb3IKPj4gdGhl IGJhc2UgbGV2ZWwgb2YgdGhlIFJlYWxtIFRyYW5zbGF0aW9uIFRhYmxlcyAoUlRUKS4gQSBWTUlE IGFsc28gbmVlZAo+PiB0byBiZSBwaWNrZWQsIHNpbmNlIHRoZSBSTU0gaGFzIGEgc2VwYXJhdGUg Vk1JRCBhZGRyZXNzIHNwYWNlIGEKPj4gZGVkaWNhdGVkIGFsbG9jYXRvciBpcyBhZGRlZCBmb3Ig dGhpcyBwdXJwb3NlLgo+Pgo+PiBLVk1fQ0FQX0FSTV9STUVfQ09ORklHX1JFQUxNIGlzIHByb3Zp ZGVkIHRvIGFsbG93IGNvbmZpZ3VyaW5nIHRoZSByZWFsbQo+PiBiZWZvcmUgaXQgaXMgY3JlYXRl ZC4KPiAKPiBJdCBtaWdodCBiZSBoZWxwZnVsIHRvIHByb3ZpZGUgYSBiaXQgbW9yZSBiYWNrZ3Jv dW5kIG9uIHRoZSBSZWFsbQo+IHBhcmFtZXRlcnMuIFNvbWV0aGluZyBsaWtlOgo+IAo+IFJlYWxt IHBhcmFtZXRlcnMgZm9yIFJlYWxtIERlc2NyaXB0b3IgY3JlYXRpb24gY291bGQgYmUgY2xhc3Np ZmllZCBhczoKPiAKPiDCoDEuIFBhcmFtZXRlcnMgc3BlY2lmaWMgdG8gdGhlIFJlYWxtIHN0YWdl MiAoZS5nLiBJUEEgU2l6ZSwgdm1pZCwgc3RhZ2UyCj4gwqDCoMKgIGVudHJ5IGxldmVsLCBlbnRy eSBsZXZlbCBSVFRzLCBudW1iZXIgb2YgUlRUcyBpbiBzdGFydCBsZXZlbCwgTFBBMikKPiDCoMKg wqAgTW9zdCBvZiB0aGVzZSBhcmUgbm90IG1lYXN1cmVkIGJ5IFJNTSBhbmQgY29tZXMgZnJvbSBL Vk0gYm9vawo+IMKgwqDCoCBrZWVwaW5nLgo+IAo+IMKgMi4gUGFyYW1ldGVycyBjb250cm9sbGlu ZyAiQXJtIEFyY2hpdGVjdHVyZSBmZWF0dXJlcyBmb3IgdGhlIFZNIi4gKGUuZy4KPiDCoMKgwqAg U1ZFIFZMLCBQTVUgY291bnRlcnMsIG51bWJlciBvZiBIVyBCUlBzL1dQcyksIGNvbmZpZ3VyZWQg YnkgdGhlIFZNTQo+IMKgwqDCoCB1c2luZyB0aGUgInVzZXIgSUQgcmVnaXN0ZXIgd3JpdGUiIG1l Y2hhbmlzbS4gVGhlc2Ugd2lsbCBiZQo+IMKgwqDCoCBzdXBwb3J0ZWQgaW4gdGhlIGxhdGVyIHBh dGNoZXMuCj4gCj4gwqAzLiBQYXJhbWV0ZXJzIGFyZSBub3QgcGFydCBvZiB0aGUgY29yZSBBcm0g YXJjaGl0ZWN0dXJlIGJ1dCBkZWZpbmVkCj4gwqDCoMKgIGJ5IHRoZSBSTU0gc3BlYyAoZS5nLiBI YXNoIGFsZ29yaXRobSBmb3IgbWVhc3VyZW1lbnQsCj4gwqDCoMKgIFBlcnNvbmFsaXNhdGlvbiB2 YWx1ZSkuIFRoZXNlIGFyZSBwcm9ncmFtbWVkIHZpYQo+IMKgwqDCoCBLVk1fQ0FQX0FSTV9STUVf Q09ORklHX1JFQUxNLgo+IAoKVGhhbmtzLCBJJ2xsIHN0ZWFsIHRoYXQgd29yZGluZyA7KQoKPiAK PiBBbHNvIGl0IG1heSBiZSBhIGdvb2QgaWRlYSB0byBjYWxsIG91dCBvbmUgb2YgdGhlIGlzc3Vl cyB0aGF0IHdlIGhhdmUKPiB3aXRoIHRoZSBVQUJJIHcuci50IHRoZSBJUEEgU2l6ZS4gVGhlIElQ QSBTaXplIHN1cHBvcnRlZCBieSBSTU0gKmNvdWxkKgo+IGJlIGRpZmZlcmVudCBmcm9tIHRoZSBu b3JtYWwgSVBBIFNpemUgYXMgc3VwcG9ydGVkIGJ5IEtWTS4gV2UgZG8gbm90Cj4gZXhwZWN0IHRo aXMgdG8gYmUgY29tbW9uLCBidXQgaXMgbm90IGltcG9zc2libGUuCj4gCj4gSWYgdGhlIFJNTV9J UEFfU2l6ZSA8IE5vcm1hbF9JUEFfU2l6ZSwgd2UgaGF2ZSBhIHByb2JsZW0gd2l0aAo+IGFkdmVy dGlzaW5nIHRoZSAiSVBBIFNpemUiIHRvIHRoZSBWTU0uIFJpZ2h0IG5vdyB3ZSBhZHZlcnRpc2UK PiB0aGUgIm5vcm1hbCBsaW1pdCIgYnkgS1ZNX0NBUF9BUk1fVk1fSVBBX1NJWkUgYW5kIHRoZSBJ UEEgU2l6ZQo+IGlzIGNvbmZpZ3VyZWQgdmlhIHZtX3R5cGVbNzowXSBpbiBLVk1fQ1JFQVRFX1ZN LiBHaXZlbiB3ZSBoYXZlCj4gdG8gY29uZmlndXJlIHRoZSBJUEEgc2l6ZSBmb3IgYSAiUmVhbG0g Vk0iIGF0IENSRUFURV9WTSB0aW1lIHRvbywKPiB0aGUgVk1NIGlzIHVuYWJsZSB0byBjaG9vc2Ug YSB2YWxpZCBJUEEgU2l6ZSBmb3IgdGhlIFJlYWxtLiBXZQo+IGhhdmUgdGhlIGZvbGxvd2luZyBv cHRpb25zOgo+IAo+IDEuIEdpdmVuIElQQSBTaXplIGZvciBhIFJlYWxtIGlzIG1lYXN1cmVkLCB0 aGUgdXNlciBtdXN0IGdldAo+IMKgwqAgd2hhdCB0aGV5IGNob29zZS4gaS5lLiwgaWYgdGhlIHBs YXRmb3JtIGNhbm5vdCBzdXBwb3J0IHRoZQo+IMKgwqAgcmVxdWVzdGVkIHNpemUsIGRvbid0IHJ1 biB5b3VyIFJlYWxtIFZNLiBJbiB0aGlzIGNhc2UsIHdlCj4gwqDCoCBkb24ndCBuZWVkIHRvIGRv IGFueXRoaW5nLgo+IAo+IDIuIEFkZCBLVk1fQ0FQX0FSTV9WTV9STU1fSVBBX1NJWkUgdG8gZXhw b3NlIHRoZSBSTU0gbGltaXQKPiDCoMKgIGZvciB0aGUgVk1NIHRvIGNob29zZS4KPiAKPiAzLiBW TU0gdG8gY3JlYXRlIGEgUmVhbG0gVk0gdXNpbmcgdGhlIGRlZmF1bHQgSVBBIFNpemUgYW5kIHRo ZW4KPiDCoMKgIGNoZWNrIHRoZSBLVk1fQ0FQX0FSTV9WTV9JUEFfU0laRSBvbiB0aGUgImt2bSIg aW5zdGFuY2UgKHdoaWNoCj4gwqDCoCBpcyBSZWFsbSkgYW5kIGdldCB0aGUgUk1NIElQQSBsaW1p dC4KPiAKPiBJIHByZWZlciAyIG9yIDEsIGluIHRoYXQgb3JkZXIgb2YgcHJlZmVyZW5jZS4gSGFw cHkgdG8gaGVhciBzdWdnZXN0aW9ucy4KCk15IGd1dCBmZWVsaW5nIGlzIHRoYXQgd2Ugc2hvdWxk IGdvIGZvciAxLCBhbmQgYWRkIDIgaWYgd2UgYWN0dWFsbHkgc2VlCmEgbmVlZCBmb3IgaXQuCgpJ J20gc3RydWdnbGluZyB0byBzZWUgd2h5IHRoZSBWTU0gd291bGQgd2FudCB0byBjaG9vc2UgdGhl IElQQSBzaXplCmR5bmFtaWNhbGx5IChzdXJlbHkgdGhlIGF0dGVzdGF0aW9uIHNlcnZlciBkb2Vz bid0IHdhbnQgdG8gZGVhbCB3aXRoCmRpZmZlcmVudCBJUEEgc2l6ZXM/KS4gU28gdGhlIElQQSBz aXplIGlzIGdvaW5nIHRvIGJlIHBpY2tlZCBieSB0aGUKY29udGFpbmVyIG93bmVyIGJhc2VkIG9u IGFjdHVhbCBuZWVkIGFuZCB0aGUgVk1NIGNhbiBhdHRlbXB0IHRvIGNyZWF0ZSBhClZNIGFuZCBm YWlsIGlmIHRoZSBwbGF0Zm9ybSBkb2Vzbid0IHN1cHBvcnQgdGhhdCBzaXplLiBJbiB0aGF0IGNh c2UKYmVjYXVzZSBhdHRlc3RhdGlvbiB3b3VsZCBmYWlsIHdpdGggYSBzbWFsbGVyIElQQSBzaXpl IHRoZSBjb3JyZWN0CnJlc3BvbnNlIGlzIGZhaWx1cmUuCgpJJ2xsIHN0aWNrIHNvbWV0aGluZyBp biB0aGUgY29tbWl0IG1lc3NhZ2UgdG8gcmVjb3JkIHRoYXQuCgo+Pgo+PiBDby1kZXZlbG9wZWQt Ynk6IFN1enVraSBLIFBvdWxvc2UgPHN1enVraS5wb3Vsb3NlQGFybS5jb20+Cj4+IFNpZ25lZC1v ZmYtYnk6IFN1enVraSBLIFBvdWxvc2UgPHN1enVraS5wb3Vsb3NlQGFybS5jb20+Cj4+IFNpZ25l ZC1vZmYtYnk6IFN0ZXZlbiBQcmljZSA8c3RldmVuLnByaWNlQGFybS5jb20+Cj4+IFNpZ25lZC1v ZmYtYnk6IEplYW4tUGhpbGlwcGUgQnJ1Y2tlciA8amVhbi1waGlsaXBwZUBsaW5hcm8ub3JnPgo+ PiAtLS0KPj4gwqAgYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9rdm1fZW11bGF0ZS5oIHzCoMKgIDUg Kwo+PiDCoCBhcmNoL2FybTY0L2luY2x1ZGUvYXNtL2t2bV9ybWUuaMKgwqDCoMKgIHzCoCAxOSAr Kwo+PiDCoCBhcmNoL2FybTY0L2t2bS9hcm0uY8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgIHzCoCAxOCArKwo+PiDCoCBhcmNoL2FybTY0L2t2bS9tbXUuY8KgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgIHzCoCAxNSArLQo+PiDCoCBhcmNoL2FybTY0L2t2bS9ybWUuY8KgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHwgMjgyICsrKysrKysrKysrKysrKysrKysrKysr KysrKwo+PiDCoCA1IGZpbGVzIGNoYW5nZWQsIDMzNyBpbnNlcnRpb25zKCspLCAyIGRlbGV0aW9u cygtKQo+Pgo+PiBkaWZmIC0tZ2l0IGEvYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9rdm1fZW11bGF0 ZS5oCj4+IGIvYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9rdm1fZW11bGF0ZS5oCj4+IGluZGV4IDZm MDgzOTg1MzdlMi4uYzYwNjMxNmY0NzI5IDEwMDY0NAo+PiAtLS0gYS9hcmNoL2FybTY0L2luY2x1 ZGUvYXNtL2t2bV9lbXVsYXRlLmgKPj4gKysrIGIvYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9rdm1f ZW11bGF0ZS5oCj4+IEBAIC02MjQsNiArNjI0LDExIEBAIHN0YXRpYyBpbmxpbmUgZW51bSByZWFs bV9zdGF0ZQo+PiBrdm1fcmVhbG1fc3RhdGUoc3RydWN0IGt2bSAqa3ZtKQo+PiDCoMKgwqDCoMKg IHJldHVybiBSRUFEX09OQ0Uoa3ZtLT5hcmNoLnJlYWxtLnN0YXRlKTsKPj4gwqAgfQo+PiDCoCAr c3RhdGljIGlubGluZSBib29sIGt2bV9yZWFsbV9pc19jcmVhdGVkKHN0cnVjdCBrdm0gKmt2bSkK Pj4gK3sKPj4gK8KgwqDCoCByZXR1cm4ga3ZtX2lzX3JlYWxtKGt2bSkgJiYga3ZtX3JlYWxtX3N0 YXRlKGt2bSkgIT0KPj4gUkVBTE1fU1RBVEVfTk9ORTsKPj4gK30KPj4gKwo+PiDCoCBzdGF0aWMg aW5saW5lIGJvb2wgdmNwdV9pc19yZWMoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KQo+PiDCoCB7Cj4+ IMKgwqDCoMKgwqAgcmV0dXJuIGZhbHNlOwo+PiBkaWZmIC0tZ2l0IGEvYXJjaC9hcm02NC9pbmNs dWRlL2FzbS9rdm1fcm1lLmgKPj4gYi9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL2t2bV9ybWUuaAo+ PiBpbmRleCA5MjJkYTNmNDcyMjcuLmNmOGNjNGQzMDM2NCAxMDA2NDQKPj4gLS0tIGEvYXJjaC9h cm02NC9pbmNsdWRlL2FzbS9rdm1fcm1lLmgKPj4gKysrIGIvYXJjaC9hcm02NC9pbmNsdWRlL2Fz bS9rdm1fcm1lLmgKPj4gQEAgLTYsNiArNiw4IEBACj4+IMKgICNpZm5kZWYgX19BU01fS1ZNX1JN RV9ICj4+IMKgICNkZWZpbmUgX19BU01fS1ZNX1JNRV9ICj4+IMKgICsjaW5jbHVkZSA8dWFwaS9s aW51eC9rdm0uaD4KPj4gKwo+PiDCoCAvKioKPj4gwqDCoCAqIGVudW0gcmVhbG1fc3RhdGUgLSBT dGF0ZSBvZiBhIFJlYWxtCj4+IMKgwqAgKi8KPj4gQEAgLTQ2LDExICs0OCwyOCBAQCBlbnVtIHJl YWxtX3N0YXRlIHsKPj4gwqDCoCAqIHN0cnVjdCByZWFsbSAtIEFkZGl0aW9uYWwgcGVyIFZNIGRh dGEgZm9yIGEgUmVhbG0KPj4gwqDCoCAqCj4+IMKgwqAgKiBAc3RhdGU6IFRoZSBsaWZldGltZSBz dGF0ZSBtYWNoaW5lIGZvciB0aGUgcmVhbG0KPj4gKyAqIEByZDogS2VybmVsIG1hcHBpbmcgb2Yg dGhlIFJlYWxtIERlc2NyaXB0b3IgKFJEKQo+PiArICogQHBhcmFtczogUGFyYW1ldGVycyBmb3Ig dGhlIFJNSV9SRUFMTV9DUkVBVEUgY29tbWFuZAo+PiArICogQG51bV9hdXg6IFRoZSBudW1iZXIg b2YgYXV4aWxpYXJ5IHBhZ2VzIHJlcXVpcmVkIGJ5IHRoZSBSTU0KPj4gKyAqIEB2bWlkOiBWTUlE IHRvIGJlIHVzZWQgYnkgdGhlIFJNTSBmb3IgdGhlIHJlYWxtCj4+ICsgKiBAaWFfYml0czogTnVt YmVyIG9mIHZhbGlkIElucHV0IEFkZHJlc3MgYml0cyBpbiB0aGUgSVBBCj4+IMKgwqAgKi8KPj4g wqAgc3RydWN0IHJlYWxtIHsKPj4gwqDCoMKgwqDCoCBlbnVtIHJlYWxtX3N0YXRlIHN0YXRlOwo+ PiArCj4+ICvCoMKgwqAgdm9pZCAqcmQ7Cj4+ICvCoMKgwqAgc3RydWN0IHJlYWxtX3BhcmFtcyAq cGFyYW1zOwo+PiArCj4+ICvCoMKgwqAgdW5zaWduZWQgbG9uZyBudW1fYXV4Owo+PiArwqDCoMKg IHVuc2lnbmVkIGludCB2bWlkOwo+PiArwqDCoMKgIHVuc2lnbmVkIGludCBpYV9iaXRzOwo+PiDC oCB9Owo+PiDCoCDCoCBpbnQga3ZtX2luaXRfcm1lKHZvaWQpOwo+PiArdTMyIGt2bV9yZWFsbV9p cGFfbGltaXQodm9pZCk7Cj4+ICsKPj4gK2ludCBrdm1fcmVhbG1fZW5hYmxlX2NhcChzdHJ1Y3Qg a3ZtICprdm0sIHN0cnVjdCBrdm1fZW5hYmxlX2NhcCAqY2FwKTsKPj4gK2ludCBrdm1faW5pdF9y ZWFsbV92bShzdHJ1Y3Qga3ZtICprdm0pOwo+PiArdm9pZCBrdm1fZGVzdHJveV9yZWFsbShzdHJ1 Y3Qga3ZtICprdm0pOwo+PiDCoCDCoCAjZW5kaWYKPj4gZGlmZiAtLWdpdCBhL2FyY2gvYXJtNjQv a3ZtL2FybS5jIGIvYXJjaC9hcm02NC9rdm0vYXJtLmMKPj4gaW5kZXggMjA1NmM2NjBjNWVlLi41 NzI5ZWE0MzBkNmQgMTAwNjQ0Cj4+IC0tLSBhL2FyY2gvYXJtNjQva3ZtL2FybS5jCj4+ICsrKyBi L2FyY2gvYXJtNjQva3ZtL2FybS5jCj4+IEBAIC0xMTksNiArMTE5LDEzIEBAIGludCBrdm1fdm1f aW9jdGxfZW5hYmxlX2NhcChzdHJ1Y3Qga3ZtICprdm0sCj4+IMKgwqDCoMKgwqDCoMKgwqDCoCB9 Cj4+IMKgwqDCoMKgwqDCoMKgwqDCoCBtdXRleF91bmxvY2soJmt2bS0+c2xvdHNfbG9jayk7Cj4+ IMKgwqDCoMKgwqDCoMKgwqDCoCBicmVhazsKPj4gK8KgwqDCoCBjYXNlIEtWTV9DQVBfQVJNX1JN RToKPj4gK8KgwqDCoMKgwqDCoMKgIGlmICgha3ZtX2lzX3JlYWxtKGt2bSkpCj4+ICvCoMKgwqDC oMKgwqDCoMKgwqDCoMKgIHJldHVybiAtRUlOVkFMOwo+PiArwqDCoMKgwqDCoMKgwqAgbXV0ZXhf bG9jaygma3ZtLT5sb2NrKTsKPj4gK8KgwqDCoMKgwqDCoMKgIHIgPSBrdm1fcmVhbG1fZW5hYmxl X2NhcChrdm0sIGNhcCk7Cj4+ICvCoMKgwqDCoMKgwqDCoCBtdXRleF91bmxvY2soJmt2bS0+bG9j ayk7Cj4+ICvCoMKgwqDCoMKgwqDCoCBicmVhazsKPj4gwqDCoMKgwqDCoCBkZWZhdWx0Ogo+PiDC oMKgwqDCoMKgwqDCoMKgwqAgciA9IC1FSU5WQUw7Cj4+IMKgwqDCoMKgwqDCoMKgwqDCoCBicmVh azsKPj4gQEAgLTE3OSw2ICsxODYsMTMgQEAgaW50IGt2bV9hcmNoX2luaXRfdm0oc3RydWN0IGt2 bSAqa3ZtLCB1bnNpZ25lZAo+PiBsb25nIHR5cGUpCj4+IMKgIMKgwqDCoMKgwqAgYml0bWFwX3pl cm8oa3ZtLT5hcmNoLnZjcHVfZmVhdHVyZXMsIEtWTV9WQ1BVX01BWF9GRUFUVVJFUyk7Cj4+IMKg ICvCoMKgwqAgLyogSW5pdGlhbGlzZSB0aGUgcmVhbG0gYml0cyBhZnRlciB0aGUgZ2VuZXJpYyBi aXRzIGFyZSBlbmFibGVkICovCj4+ICvCoMKgwqAgaWYgKGt2bV9pc19yZWFsbShrdm0pKSB7Cj4+ ICvCoMKgwqDCoMKgwqDCoCByZXQgPSBrdm1faW5pdF9yZWFsbV92bShrdm0pOwo+PiArwqDCoMKg wqDCoMKgwqAgaWYgKHJldCkKPj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqAgZ290byBlcnJfZnJl ZV9jcHVtYXNrOwo+PiArwqDCoMKgIH0KPj4gKwo+PiDCoMKgwqDCoMKgIHJldHVybiAwOwo+PiDC oCDCoCBlcnJfZnJlZV9jcHVtYXNrOgo+PiBAQCAtMjE5LDYgKzIzMyw3IEBAIHZvaWQga3ZtX2Fy Y2hfZGVzdHJveV92bShzdHJ1Y3Qga3ZtICprdm0pCj4+IMKgwqDCoMKgwqAga3ZtX3Vuc2hhcmVf aHlwKGt2bSwga3ZtICsgMSk7Cj4+IMKgIMKgwqDCoMKgwqAga3ZtX2FybV90ZWFyZG93bl9oeXBl cmNhbGxzKGt2bSk7Cj4+ICvCoMKgwqAga3ZtX2Rlc3Ryb3lfcmVhbG0oa3ZtKTsKPj4gwqAgfQo+ PiDCoCDCoCBpbnQga3ZtX3ZtX2lvY3RsX2NoZWNrX2V4dGVuc2lvbihzdHJ1Y3Qga3ZtICprdm0s IGxvbmcgZXh0KQo+PiBAQCAtMzI4LDYgKzM0Myw5IEBAIGludCBrdm1fdm1faW9jdGxfY2hlY2tf ZXh0ZW5zaW9uKHN0cnVjdCBrdm0gKmt2bSwKPj4gbG9uZyBleHQpCj4+IMKgwqDCoMKgwqAgY2Fz ZSBLVk1fQ0FQX0FSTV9TVVBQT1JURURfUkVHX01BU0tfUkFOR0VTOgo+PiDCoMKgwqDCoMKgwqDC oMKgwqAgciA9IEJJVCgwKTsKPj4gwqDCoMKgwqDCoMKgwqDCoMKgIGJyZWFrOwo+PiArwqDCoMKg IGNhc2UgS1ZNX0NBUF9BUk1fUk1FOgo+PiArwqDCoMKgwqDCoMKgwqAgciA9IHN0YXRpY19rZXlf ZW5hYmxlZCgma3ZtX3JtZV9pc19hdmFpbGFibGUpOwo+PiArwqDCoMKgwqDCoMKgwqAgYnJlYWs7 Cj4+IMKgwqDCoMKgwqAgZGVmYXVsdDoKPj4gwqDCoMKgwqDCoMKgwqDCoMKgIHIgPSAwOwo+PiDC oMKgwqDCoMKgIH0KPj4gZGlmZiAtLWdpdCBhL2FyY2gvYXJtNjQva3ZtL21tdS5jIGIvYXJjaC9h cm02NC9rdm0vbW11LmMKPj4gaW5kZXggMTg2ODA3NzFjZGIwLi5hYWUzNjU2NDdiNjIgMTAwNjQ0 Cj4+IC0tLSBhL2FyY2gvYXJtNjQva3ZtL21tdS5jCj4+ICsrKyBiL2FyY2gvYXJtNjQva3ZtL21t dS5jCj4+IEBAIC04NzIsNiArODcyLDEwIEBAIGludCBrdm1faW5pdF9zdGFnZTJfbW11KHN0cnVj dCBrdm0gKmt2bSwgc3RydWN0Cj4+IGt2bV9zMl9tbXUgKm1tdSwgdW5zaWduZWQgbG9uZyB0Cj4+ IMKgwqDCoMKgwqAgc3RydWN0IGt2bV9wZ3RhYmxlICpwZ3Q7Cj4+IMKgwqDCoMKgwqAgdTY0IG1t ZnIwLCBtbWZyMTsKPj4gwqDCoMKgwqDCoCB1MzIgcGh5c19zaGlmdDsKPj4gK8KgwqDCoCB1MzIg aXBhX2xpbWl0ID0ga3ZtX2lwYV9saW1pdDsKPj4gKwo+PiArwqDCoMKgIGlmIChrdm1faXNfcmVh bG0oa3ZtKSkKPj4gK8KgwqDCoMKgwqDCoMKgIGlwYV9saW1pdCA9IGt2bV9yZWFsbV9pcGFfbGlt aXQoKTsKPj4gwqAgwqDCoMKgwqDCoCBpZiAodHlwZSAmIH5LVk1fVk1fVFlQRV9BUk1fSVBBX1NJ WkVfTUFTSykKPj4gwqDCoMKgwqDCoMKgwqDCoMKgIHJldHVybiAtRUlOVkFMOwo+PiBAQCAtODgw LDEyICs4ODQsMTIgQEAgaW50IGt2bV9pbml0X3N0YWdlMl9tbXUoc3RydWN0IGt2bSAqa3ZtLCBz dHJ1Y3QKPj4ga3ZtX3MyX21tdSAqbW11LCB1bnNpZ25lZCBsb25nIHQKPj4gwqDCoMKgwqDCoCBp ZiAoaXNfcHJvdGVjdGVkX2t2bV9lbmFibGVkKCkpIHsKPj4gwqDCoMKgwqDCoMKgwqDCoMKgIHBo eXNfc2hpZnQgPSBrdm1faXBhX2xpbWl0Owo+PiDCoMKgwqDCoMKgIH0gZWxzZSBpZiAocGh5c19z aGlmdCkgewo+PiAtwqDCoMKgwqDCoMKgwqAgaWYgKHBoeXNfc2hpZnQgPiBrdm1faXBhX2xpbWl0 IHx8Cj4+ICvCoMKgwqDCoMKgwqDCoCBpZiAocGh5c19zaGlmdCA+IGlwYV9saW1pdCB8fAo+PiDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBwaHlzX3NoaWZ0IDwgQVJNNjRfTUlOX1BBUkFOR0Vf QklUUykKPj4gwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgcmV0dXJuIC1FSU5WQUw7Cj4+IMKg wqDCoMKgwqAgfSBlbHNlIHsKPj4gwqDCoMKgwqDCoMKgwqDCoMKgIHBoeXNfc2hpZnQgPSBLVk1f UEhZU19TSElGVDsKPj4gLcKgwqDCoMKgwqDCoMKgIGlmIChwaHlzX3NoaWZ0ID4ga3ZtX2lwYV9s aW1pdCkgewo+PiArwqDCoMKgwqDCoMKgwqAgaWYgKHBoeXNfc2hpZnQgPiBpcGFfbGltaXQpIHsK Pj4gwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgcHJfd2Fybl9vbmNlKCIlcyB1c2luZyB1bnN1 cHBvcnRlZCBkZWZhdWx0IElQQSBsaW1pdCwKPj4gdXBncmFkZSB5b3VyIFZNTVxuIiwKPj4gwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgY3VycmVudC0+Y29tbSk7 Cj4+IMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHJldHVybiAtRUlOVkFMOwo+PiBAQCAtMTAx NCw2ICsxMDE4LDEzIEBAIHZvaWQga3ZtX2ZyZWVfc3RhZ2UyX3BnZChzdHJ1Y3Qga3ZtX3MyX21t dSAqbW11KQo+PiDCoMKgwqDCoMKgIHN0cnVjdCBrdm1fcGd0YWJsZSAqcGd0ID0gTlVMTDsKPj4g wqAgwqDCoMKgwqDCoCB3cml0ZV9sb2NrKCZrdm0tPm1tdV9sb2NrKTsKPj4gK8KgwqDCoCBpZiAo a3ZtX2lzX3JlYWxtKGt2bSkgJiYKPj4gK8KgwqDCoMKgwqDCoMKgIChrdm1fcmVhbG1fc3RhdGUo a3ZtKSAhPSBSRUFMTV9TVEFURV9ERUFEICYmCj4+ICvCoMKgwqDCoMKgwqDCoMKgIGt2bV9yZWFs bV9zdGF0ZShrdm0pICE9IFJFQUxNX1NUQVRFX05PTkUpKSB7Cj4+ICvCoMKgwqDCoMKgwqDCoCAv KiBUT0RPOiB0ZWFyZG93biBydHRzICovCj4+ICvCoMKgwqDCoMKgwqDCoCB3cml0ZV91bmxvY2so Jmt2bS0+bW11X2xvY2spOwo+PiArwqDCoMKgwqDCoMKgwqAgcmV0dXJuOwo+PiArwqDCoMKgIH0K PiAKPiBUaGlzIG5lZWRzIGEgY29tbWVudCB0byBleHBsYWluIHRoZSByYXRpb25hbGUgb2YgZGVm ZXJyaW5nIHRoZQo+IFN0YWdlMiBwZ3QgZnJlZWluZy4gU29tZXRoaW5nIGxpa2UgOgo+IAo+IMKg wqDCoMKgLyoKPiDCoMKgwqDCoCAqIEZvciByZWFsbXMsIHdlIGNhbiBmcmVlIHRoZSBlbnRyeSBs ZXZlbCBSVFRzCj4gwqDCoMKgwqAgKiBvbmx5IGFmdGVyIDoKPiDCoMKgwqDCoCAqwqAgMS4gQWxs IG9mIHRoZSBzdGFnZTIgbWFwcGluZ3MgYXJlIHRvcm4gZG93bi4KPiDCoMKgwqDCoCAqwqAgMi4g VGhlIFJlYWxtIGhhcyBiZWVuIGRlc3Ryb3llZC4KPiDCoMKgwqDCoCAqCj4gwqDCoMKgwqAgKiBT bywgY29tZSBiYWNrIGxhdGVyIG9uY2UgdGhlIFJEIGhhcyBiZWVuIGRlc3Ryb3llZC4KPiDCoMKg wqDCoCAqLwoKQWN0dWFsbHkgdGhlICdUT0RPJyBpcyByZWFsbHkgInRoaXMgaXMgaGFuZGxlZCBp biBhIGZ1dHVyZSBwYXRjaCIuIEknbGwKbWFrZSB0aGF0IG1vcmUgb2J2aW91cy4KCj4+IMKgwqDC oMKgwqAgcGd0ID0gbW11LT5wZ3Q7Cj4+IMKgwqDCoMKgwqAgaWYgKHBndCkgewo+PiDCoMKgwqDC oMKgwqDCoMKgwqAgbW11LT5wZ2RfcGh5cyA9IDA7Cj4+IGRpZmYgLS1naXQgYS9hcmNoL2FybTY0 L2t2bS9ybWUuYyBiL2FyY2gvYXJtNjQva3ZtL3JtZS5jCj4+IGluZGV4IDNkYmJmOWQwNDZiZi4u NjU4ZDE0ZThkODdkIDEwMDY0NAo+PiAtLS0gYS9hcmNoL2FybTY0L2t2bS9ybWUuYwo+PiArKysg Yi9hcmNoL2FybTY0L2t2bS9ybWUuYwo+PiBAQCAtNSw5ICs1LDIwIEBACj4+IMKgIMKgICNpbmNs dWRlIDxsaW51eC9rdm1faG9zdC5oPgo+PiDCoCArI2luY2x1ZGUgPGFzbS9rdm1fZW11bGF0ZS5o Pgo+PiArI2luY2x1ZGUgPGFzbS9rdm1fbW11Lmg+Cj4+IMKgICNpbmNsdWRlIDxhc20vcm1pX2Nt ZHMuaD4KPj4gwqAgI2luY2x1ZGUgPGFzbS92aXJ0Lmg+Cj4+IMKgICsjaW5jbHVkZSA8YXNtL2t2 bV9wZ3RhYmxlLmg+Cj4+ICsKPj4gK3N0YXRpYyB1bnNpZ25lZCBsb25nIHJtbV9mZWF0X3JlZzA7 Cj4+ICsKPj4gK3N0YXRpYyBib29sIHJtZV9zdXBwb3J0cyh1bnNpZ25lZCBsb25nIGZlYXR1cmUp Cj4+ICt7Cj4+ICvCoMKgwqAgcmV0dXJuICEhdTY0X2dldF9iaXRzKHJtbV9mZWF0X3JlZzAsIGZl YXR1cmUpOwo+PiArfQo+PiArCj4+IMKgIHN0YXRpYyBpbnQgcm1pX2NoZWNrX3ZlcnNpb24odm9p ZCkKPj4gwqAgewo+PiDCoMKgwqDCoMKgIHN0cnVjdCBhcm1fc21jY2NfcmVzIHJlczsKPj4gQEAg LTM2LDggKzQ3LDI3MiBAQCBzdGF0aWMgaW50IHJtaV9jaGVja192ZXJzaW9uKHZvaWQpCj4+IMKg wqDCoMKgwqAgcmV0dXJuIDA7Cj4+IMKgIH0KPj4gwqAgK3UzMiBrdm1fcmVhbG1faXBhX2xpbWl0 KHZvaWQpCj4+ICt7Cj4+ICvCoMKgwqAgcmV0dXJuIHU2NF9nZXRfYml0cyhybW1fZmVhdF9yZWcw LCBSTUlfRkVBVFVSRV9SRUdJU1RFUl8wX1MyU1opOwo+PiArfQo+PiArCj4+ICtzdGF0aWMgaW50 IGdldF9zdGFydF9sZXZlbChzdHJ1Y3QgcmVhbG0gKnJlYWxtKQo+PiArewo+PiArwqDCoMKgIHJl dHVybiA0IC0gc3RhZ2UyX3BndGFibGVfbGV2ZWxzKHJlYWxtLT5pYV9iaXRzKTsKPj4gK30KPj4g Kwo+PiArc3RhdGljIGludCByZWFsbV9jcmVhdGVfcmQoc3RydWN0IGt2bSAqa3ZtKQo+PiArewo+ PiArwqDCoMKgIHN0cnVjdCByZWFsbSAqcmVhbG0gPSAma3ZtLT5hcmNoLnJlYWxtOwo+PiArwqDC oMKgIHN0cnVjdCByZWFsbV9wYXJhbXMgKnBhcmFtcyA9IHJlYWxtLT5wYXJhbXM7Cj4+ICvCoMKg wqAgdm9pZCAqcmQgPSBOVUxMOwo+PiArwqDCoMKgIHBoeXNfYWRkcl90IHJkX3BoeXMsIHBhcmFt c19waHlzOwo+PiArwqDCoMKgIHN0cnVjdCBrdm1fcGd0YWJsZSAqcGd0ID0ga3ZtLT5hcmNoLm1t dS5wZ3Q7Cj4+ICvCoMKgwqAgaW50IGksIHI7Cj4+ICsKPj4gK8KgwqDCoCBpZiAoV0FSTl9PTihy ZWFsbS0+cmQpIHx8IFdBUk5fT04oIXJlYWxtLT5wYXJhbXMpKQo+PiArwqDCoMKgwqDCoMKgwqAg cmV0dXJuIC1FRVhJU1Q7Cj4+ICsKPj4gK8KgwqDCoCByZCA9ICh2b2lkICopX19nZXRfZnJlZV9w YWdlKEdGUF9LRVJORUwpOwo+PiArwqDCoMKgIGlmICghcmQpCj4+ICvCoMKgwqDCoMKgwqDCoCBy ZXR1cm4gLUVOT01FTTsKPj4gKwo+PiArwqDCoMKgIHJkX3BoeXMgPSB2aXJ0X3RvX3BoeXMocmQp Owo+PiArwqDCoMKgIGlmIChybWlfZ3JhbnVsZV9kZWxlZ2F0ZShyZF9waHlzKSkgewo+PiArwqDC oMKgwqDCoMKgwqAgciA9IC1FTlhJTzsKPj4gK8KgwqDCoMKgwqDCoMKgIGdvdG8gb3V0Owo+IAo+ IHN1cGVyIG1pbm9yIG5pdDogcy9vdXQvZnJlZV9yZC8gaXMgYSBiaXQgbW9yZSByZWFkYWJsZS4g SGVyZSAib3V0IiBpcwo+IG9ubHkgdXNlZCBmb3IgZXJyb3IgZXhpdHMgYW5kIGNvdWxkIGJlIGNv bmZ1c2luZy4KCkl0J3MgYSBnb29kIHBvaW50IC0gSSdsbCBmaXguCgo+PiArwqDCoMKgIH0KPj4g Kwo+PiArwqDCoMKgIGZvciAoaSA9IDA7IGkgPCBwZ3QtPnBnZF9wYWdlczsgaSsrKSB7Cj4+ICvC oMKgwqDCoMKgwqDCoCBwaHlzX2FkZHJfdCBwZ2RfcGh5cyA9IGt2bS0+YXJjaC5tbXUucGdkX3Bo eXMgKyBpICogUEFHRV9TSVpFOwo+PiArCj4+ICvCoMKgwqDCoMKgwqDCoCBpZiAocm1pX2dyYW51 bGVfZGVsZWdhdGUocGdkX3BoeXMpKSB7Cj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHIgPSAt RU5YSU87Cj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGdvdG8gb3V0X3VuZGVsZWdhdGVfdGFi bGVzOwo+PiArwqDCoMKgwqDCoMKgwqAgfQo+PiArwqDCoMKgIH0KPj4gKwo+PiArwqDCoMKgIHJl YWxtLT5pYV9iaXRzID0gVlRDUl9FTDJfSVBBKGt2bS0+YXJjaC5tbXUudnRjcik7Cj4+ICsKPj4g K8KgwqDCoCBwYXJhbXMtPnJ0dF9sZXZlbF9zdGFydCA9IGdldF9zdGFydF9sZXZlbChyZWFsbSk7 Cj4+ICvCoMKgwqAgcGFyYW1zLT5ydHRfbnVtX3N0YXJ0ID0gcGd0LT5wZ2RfcGFnZXM7Cj4+ICvC oMKgwqAgcGFyYW1zLT5ydHRfYmFzZSA9IGt2bS0+YXJjaC5tbXUucGdkX3BoeXM7Cj4+ICvCoMKg wqAgcGFyYW1zLT52bWlkID0gcmVhbG0tPnZtaWQ7Cj4+ICsKPj4gK8KgwqDCoCBwYXJhbXNfcGh5 cyA9IHZpcnRfdG9fcGh5cyhwYXJhbXMpOwo+PiArCj4+ICvCoMKgwqAgaWYgKHJtaV9yZWFsbV9j cmVhdGUocmRfcGh5cywgcGFyYW1zX3BoeXMpKSB7Cj4+ICvCoMKgwqDCoMKgwqDCoCByID0gLUVO WElPOwo+PiArwqDCoMKgwqDCoMKgwqAgZ290byBvdXRfdW5kZWxlZ2F0ZV90YWJsZXM7Cj4+ICvC oMKgwqAgfQo+PiArCj4+ICvCoMKgwqAgcmVhbG0tPnJkID0gcmQ7Cj4+ICsKPj4gK8KgwqDCoCBp ZiAoV0FSTl9PTihybWlfcmVjX2F1eF9jb3VudChyZF9waHlzLCAmcmVhbG0tPm51bV9hdXgpKSkg ewo+PiArwqDCoMKgwqDCoMKgwqAgV0FSTl9PTihybWlfcmVhbG1fZGVzdHJveShyZF9waHlzKSk7 Cj4+ICvCoMKgwqDCoMKgwqDCoCBnb3RvIG91dF91bmRlbGVnYXRlX3RhYmxlczsKPj4gK8KgwqDC oCB9Cj4+ICsKPj4gK8KgwqDCoCByZXR1cm4gMDsKPj4gKwo+PiArb3V0X3VuZGVsZWdhdGVfdGFi bGVzOgo+PiArwqDCoMKgIHdoaWxlICgtLWkgPj0gMCkgewo+PiArwqDCoMKgwqDCoMKgwqAgcGh5 c19hZGRyX3QgcGdkX3BoeXMgPSBrdm0tPmFyY2gubW11LnBnZF9waHlzICsgaSAqIFBBR0VfU0la RTsKPj4gKwo+PiArwqDCoMKgwqDCoMKgwqAgV0FSTl9PTihybWlfZ3JhbnVsZV91bmRlbGVnYXRl KHBnZF9waHlzKSk7Cj4+ICvCoMKgwqAgfQo+PiArwqDCoMKgIFdBUk5fT04ocm1pX2dyYW51bGVf dW5kZWxlZ2F0ZShyZF9waHlzKSk7Cj4+ICtvdXQ6Cj4+ICvCoMKgwqAgZnJlZV9wYWdlKCh1bnNp Z25lZCBsb25nKXJkKTsKPj4gK8KgwqDCoCByZXR1cm4gcjsKPj4gK30KPj4gKwo+PiArLyogUHJv dGVjdHMgYWNjZXNzIHRvIHJtZV92bWlkX2JpdG1hcCAqLwo+PiArc3RhdGljIERFRklORV9TUElO TE9DSyhybWVfdm1pZF9sb2NrKTsKPj4gK3N0YXRpYyB1bnNpZ25lZCBsb25nICpybWVfdm1pZF9i aXRtYXA7Cj4+ICsKPj4gK3N0YXRpYyBpbnQgcm1lX3ZtaWRfaW5pdCh2b2lkKQo+PiArewo+PiAr wqDCoMKgIHVuc2lnbmVkIGludCB2bWlkX2NvdW50ID0gMSA8PCBrdm1fZ2V0X3ZtaWRfYml0cygp Owo+IAo+IG1pbm9yIG5pdDogUk1NIGhhcyBhIGZpeGVkIFZNSUQgd2lkdGggb2YgMTZiaXRzLiBE byB3ZSBuZWVkIHRvCj4gZXhwbGljaXRseSB1c2UgdGhhdCwgaW5zdGVhZCBvZiByZWx5aW5nIHdo YXQga3ZtIHRoaW5rcyA/IChUaG91Z2gKPiBpbiBwcmFjdGlzZSwgdGhpcyB3b3VsZCBvbmx5IGJl IGEgcHJvYmxlbSBpZiB0aGUgYXJjaGl0ZWN0dXJlCj4gZXZvbHZlcyB0byBzdXBwb3J0IHNvbWV0 aGluZyBtb3JlKS4KCkkgZG9uJ3QgdGhpbmsgdGhlIFJNTSBoYXMgYSBmaXhlZCBWTUlEIHdpZHRo IGFjY29yZGluZyB0byB0aGUgc3BlYy4gSXQgc2F5czoKClRoZSBWTUlEIG9mIGEgUmVhbG0gaXMg Y2hvc2VuIGJ5IHRoZSBIb3N0LiBUaGUgVk1JRCBtdXN0IGJlIHdpdGhpbiB0aGUKcmFuZ2Ugc3Vw cG9ydGVkIGJ5IHRoZSBoYXJkd2FyZSBwbGF0Zm9ybS4gVGhlIFJNTSBlbnN1cmVzIHRoYXQgZXZl cnkKUmVhbG0gb24gdGhlIHN5c3RlbSBoYXMgYSB1bmlxdWUgVk1JRC4KCkl0IGFsc28gZGVjbGFy ZXMgYSBwc2V1ZG8tY29kZSBWbWlkSXNWYWxpZCBmdW5jdGlvbiB3aGljaCBzYXlzOgoKSWYgdGhl IHVuZGVybHlpbmcgaGFyZHdhcmUgcGxhdGZvcm0gZG9lcyBub3QgaW1wbGVtZW50IEZFQVRfVk1J RDE2IHRoZW4KYSBWTUlEIHZhbHVlIHdpdGggdm1pZFsxNTo4XSAhPSAwIGlzIGludmFsaWQuCgpT byBpdCB3b3VsZCBzZWVtIGZyb20gdGhlIHNwZWMgdGhhdCBhIFZNSUQgd2lkdGggPDE2IGJpdHMg aXMgc3VwcG9ydGVkLgpPbiB0aGUgb3RoZXIgaGFuZCBpZiB3ZSBldmVyIGdldCA+MTYgYml0IFZN SUQgc3VwcG9ydCBpbiB0aGUKYXJjaGl0ZWN0dXJlIHRoZW4gdGhlIDE2IGJpdCB2bWlkIGZpZWxk IGluIFJtaVJlYWxtUGFyYW1zIGlzIGNsZWFybHkKZ29pbmcgdG8gdHJpcCB1cyB1cC4KCkF0IHRo ZSBtb21lbnQgbXkgZmVlbGluZyBpcyB0aGF0IDE2IGJpdCBWTUlEcyBvdWdodCB0byBiZSBlbm91 Z2ggZm9yCmFueWJvZHkgLi4uIDspCgo+PiArCj4+ICvCoMKgwqAgcm1lX3ZtaWRfYml0bWFwID0g Yml0bWFwX3phbGxvYyh2bWlkX2NvdW50LCBHRlBfS0VSTkVMKTsKPj4gK8KgwqDCoCBpZiAoIXJt ZV92bWlkX2JpdG1hcCkgewo+PiArwqDCoMKgwqDCoMKgwqAga3ZtX2VycigiJXM6IENvdWxkbid0 IGFsbG9jYXRlIHJtZSB2bWlkIGJpdG1hcFxuIiwgX19mdW5jX18pOwo+PiArwqDCoMKgwqDCoMKg wqAgcmV0dXJuIC1FTk9NRU07Cj4+ICvCoMKgwqAgfQo+PiArCj4+ICvCoMKgwqAgcmV0dXJuIDA7 Cj4+ICt9Cj4+ICsKPj4gK3N0YXRpYyBpbnQgcm1lX3ZtaWRfcmVzZXJ2ZSh2b2lkKQo+PiArewo+ PiArwqDCoMKgIGludCByZXQ7Cj4+ICvCoMKgwqAgdW5zaWduZWQgaW50IHZtaWRfY291bnQgPSAx IDw8IGt2bV9nZXRfdm1pZF9iaXRzKCk7Cj4+ICsKPj4gK8KgwqDCoCBzcGluX2xvY2soJnJtZV92 bWlkX2xvY2spOwo+PiArwqDCoMKgIHJldCA9IGJpdG1hcF9maW5kX2ZyZWVfcmVnaW9uKHJtZV92 bWlkX2JpdG1hcCwgdm1pZF9jb3VudCwgMCk7Cj4+ICvCoMKgwqAgc3Bpbl91bmxvY2soJnJtZV92 bWlkX2xvY2spOwo+PiArCj4+ICvCoMKgwqAgcmV0dXJuIHJldDsKPj4gK30KPj4gKwo+PiArc3Rh dGljIHZvaWQgcm1lX3ZtaWRfcmVsZWFzZSh1bnNpZ25lZCBpbnQgdm1pZCkKPj4gK3sKPj4gK8Kg wqDCoCBzcGluX2xvY2soJnJtZV92bWlkX2xvY2spOwo+PiArwqDCoMKgIGJpdG1hcF9yZWxlYXNl X3JlZ2lvbihybWVfdm1pZF9iaXRtYXAsIHZtaWQsIDApOwo+PiArwqDCoMKgIHNwaW5fdW5sb2Nr KCZybWVfdm1pZF9sb2NrKTsKPj4gK30KPj4gKwo+PiArc3RhdGljIGludCBrdm1fY3JlYXRlX3Jl YWxtKHN0cnVjdCBrdm0gKmt2bSkKPj4gK3sKPj4gK8KgwqDCoCBzdHJ1Y3QgcmVhbG0gKnJlYWxt ID0gJmt2bS0+YXJjaC5yZWFsbTsKPj4gK8KgwqDCoCBpbnQgcmV0Owo+PiArCj4+ICvCoMKgwqAg aWYgKCFrdm1faXNfcmVhbG0oa3ZtKSB8fCBrdm1fcmVhbG1faXNfY3JlYXRlZChrdm0pKQo+PiAr wqDCoMKgwqDCoMKgwqAgcmV0dXJuIC1FRVhJU1Q7Cj4gCj4gTWlub3Igbml0Ogo+IAo+IMKgwqDC oMKgaWYgKCFrdm1faXNfcmVhbG0oa3ZtKQo+IMKgwqDCoMKgwqDCoMKgIHJldHVybiAtRUlPIG9y IGV2ZW4gLUVJTlZBTCA/Cj4gCj4gwqDCoMKgwqBpZiAoa3ZtX3JlYWxtX2lzX2NyZWF0ZWQoa3Zt KSkKPiDCoMKgwqDCoMKgwqDCoCByZXR1cm4gLUVFWElTVDsKCkluZGVlZCBFRVhJU1QgaXMgYSB0 ZXJyaWJsZSBlcnJvciBjb2RlIGZvciAhcmVhbG0uIE15IHByZWZlcmVuY2UgaXMgRUlPLgoKPj4g Kwo+PiArwqDCoMKgIHJldCA9IHJtZV92bWlkX3Jlc2VydmUoKTsKPj4gK8KgwqDCoCBpZiAocmV0 IDwgMCkKPj4gK8KgwqDCoMKgwqDCoMKgIHJldHVybiByZXQ7Cj4+ICvCoMKgwqAgcmVhbG0tPnZt aWQgPSByZXQ7Cj4+ICsKPj4gK8KgwqDCoCByZXQgPSByZWFsbV9jcmVhdGVfcmQoa3ZtKTsKPj4g K8KgwqDCoCBpZiAocmV0KSB7Cj4+ICvCoMKgwqDCoMKgwqDCoCBybWVfdm1pZF9yZWxlYXNlKHJl YWxtLT52bWlkKTsKPj4gK8KgwqDCoMKgwqDCoMKgIHJldHVybiByZXQ7Cj4+ICvCoMKgwqAgfQo+ PiArCj4+ICvCoMKgwqAgV1JJVEVfT05DRShyZWFsbS0+c3RhdGUsIFJFQUxNX1NUQVRFX05FVyk7 Cj4+ICsKPj4gK8KgwqDCoCAvKiBUaGUgcmVhbG0gaXMgdXAsIGZyZWUgdGhlIHBhcmFtZXRlcnMu wqAgKi8KPj4gK8KgwqDCoCBmcmVlX3BhZ2UoKHVuc2lnbmVkIGxvbmcpcmVhbG0tPnBhcmFtcyk7 Cj4+ICvCoMKgwqAgcmVhbG0tPnBhcmFtcyA9IE5VTEw7Cj4+ICsKPj4gK8KgwqDCoCByZXR1cm4g MDsKPj4gK30KPj4gKwo+PiArc3RhdGljIGludCBjb25maWdfcmVhbG1faGFzaF9hbGdvKHN0cnVj dCByZWFsbSAqcmVhbG0sCj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHN0 cnVjdCBrdm1fY2FwX2FybV9ybWVfY29uZmlnX2l0ZW0gKmNmZykKPj4gK3sKPj4gK8KgwqDCoCBz d2l0Y2ggKGNmZy0+aGFzaF9hbGdvKSB7Cj4+ICvCoMKgwqAgY2FzZSBLVk1fQ0FQX0FSTV9STUVf TUVBU1VSRU1FTlRfQUxHT19TSEEyNTY6Cj4+ICvCoMKgwqDCoMKgwqDCoCBpZiAoIXJtZV9zdXBw b3J0cyhSTUlfRkVBVFVSRV9SRUdJU1RFUl8wX0hBU0hfU0hBXzI1NikpCj4+ICvCoMKgwqDCoMKg wqDCoMKgwqDCoMKgIHJldHVybiAtRUlOVkFMOwo+PiArwqDCoMKgwqDCoMKgwqAgYnJlYWs7Cj4+ ICvCoMKgwqAgY2FzZSBLVk1fQ0FQX0FSTV9STUVfTUVBU1VSRU1FTlRfQUxHT19TSEE1MTI6Cj4+ ICvCoMKgwqDCoMKgwqDCoCBpZiAoIXJtZV9zdXBwb3J0cyhSTUlfRkVBVFVSRV9SRUdJU1RFUl8w X0hBU0hfU0hBXzUxMikpCj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHJldHVybiAtRUlOVkFM Owo+IAo+IERvIHdlIG5lZWQgdG8gYWRkIGEgY29tbWVudCBoZXJlIG9uIHdoeSB3ZSBkb24ndCBl eHBvc2UgdGhlIHN1cHBvcnRlZAo+ICJoYXNoIiBhbGdvIGFzIHBhcnQgb2YgdGhlIFVBQkkgPyBT b21ldGhpbmcgbGlrZSA6Cj4gCj4gwqDCoMKgwqAvKgo+IMKgwqDCoMKgICogVGhlIGhhc2ggYWxn b3JpdGhtIGZvciB0aGUgbWVhc3VyZW1lbnRzIGlzIGEgY2hvb3NlbiBieQo+IMKgwqDCoMKgICog dGhlIFJlYWxtIG93bmVyIChzaW5jZSBpdCBhZmZlY3RzIHRoZSBhdHRlc3RhdGlvbiksIHdlCj4g wqDCoMKgwqAgKiB3b3VsZCBsaWtlIHRoZSBvd25lciB0byBnZXQgd2hhdCB0aGV5IHdhbnRzLgo+ IMKgwqDCoMKgICovCgpJJ20gbm90IHJlYWxseSBzdXJlIGhlcmUncyB0aGUgcmlnaHQgcGxhY2Ug Zm9yIHN1Y2ggYSBjb21tZW50LiBDbGVhcmx5CmhlcmUgd2UncmUganVzdCBkb2luZyB3aGF0ZXZl ciB0aGUgVk1NIHJlcXVlc3RlZCBhbmQgcmV0dXJuaW5nIC1FSU5WQUwKaWYgaXQncyBub3Qgc3Vw cG9ydGVkIChieSBLVk0gb3IgdGhlIFJNTSkuCgpUaGVyZSBpcyB0aGUgYmlnZ2VyIHF1ZXN0aW9u IG9uIHdoZXRoZXIgZGlzY292ZXJ5IG9mIHRoZSBSTU0ncyBmZWF0dXJlCnNldCBpcyBuZWNlc3Nh cnkgYW5kIGVhc3kgZW5vdWdoIHdpdGggdGhlIGN1cnJlbnQgdUFQSS4gQXMgeW91IHNheSB0aGVy ZQppcyBhIHJlYXNvbmFibGUgYXJndW1lbnQgdGhhdCB0aGUgVk1NIGRvZXNuJ3QgaGF2ZSBhIGNo b2ljZSBzbyB0aGVyZSdzCm5vIG5lZWQgZm9yIGRpc2NvdmVyeS4gRXF1YWxseSBhZGRpbmcgYW4g ZXh0cmEgQ0FQIGlvY3RsIGZvciBkaXNjb3ZlcnkKbGF0ZXIgaXMgZWFzeSBlbm91Z2guCgo+PiAr wqDCoMKgwqDCoMKgwqAgYnJlYWs7Cj4+ICvCoMKgwqAgZGVmYXVsdDoKPj4gK8KgwqDCoMKgwqDC oMKgIHJldHVybiAtRUlOVkFMOwo+PiArwqDCoMKgIH0KPj4gK8KgwqDCoCByZWFsbS0+cGFyYW1z LT5oYXNoX2FsZ28gPSBjZmctPmhhc2hfYWxnbzsKPj4gK8KgwqDCoCByZXR1cm4gMDsKPj4gK30K Pj4gKwo+PiArc3RhdGljIGludCBrdm1fcm1lX2NvbmZpZ19yZWFsbShzdHJ1Y3Qga3ZtICprdm0s IHN0cnVjdAo+PiBrdm1fZW5hYmxlX2NhcCAqY2FwKQo+PiArewo+PiArwqDCoMKgIHN0cnVjdCBr dm1fY2FwX2FybV9ybWVfY29uZmlnX2l0ZW0gY2ZnOwo+PiArwqDCoMKgIHN0cnVjdCByZWFsbSAq cmVhbG0gPSAma3ZtLT5hcmNoLnJlYWxtOwo+PiArwqDCoMKgIGludCByID0gMDsKPj4gKwo+PiAr wqDCoMKgIGlmIChrdm1fcmVhbG1faXNfY3JlYXRlZChrdm0pKQo+PiArwqDCoMKgwqDCoMKgwqAg cmV0dXJuIC1FSU5WQUw7Cj4gCj4gbWlub3Igbml0OiBNYXkgYmUgcmV0dXJuIC1FRVhJU1Qgb3Ig LUVJTyByYXRoZXIgdGhhbiwgIkludmFsaWQKPiAocGFyYW1ldGVyKSIgPwoKWWVwLCBhbHRob3Vn aCBFQlVTWSBzZWVtcyBsaWtlIHRoZSBtb3N0IGRlc2NyaXB0aXZlIHRvIG1lLgoKPiAKPj4gKwo+ PiArwqDCoMKgIGlmIChjb3B5X2Zyb21fdXNlcigmY2ZnLCAodm9pZCBfX3VzZXIgKiljYXAtPmFy Z3NbMV0sIHNpemVvZihjZmcpKSkKPj4gK8KgwqDCoMKgwqDCoMKgIHJldHVybiAtRUZBVUxUOwo+ PiArCj4+ICvCoMKgwqAgc3dpdGNoIChjZmcuY2ZnKSB7Cj4+ICvCoMKgwqAgY2FzZSBLVk1fQ0FQ X0FSTV9STUVfQ0ZHX1JQVjoKPj4gK8KgwqDCoMKgwqDCoMKgIG1lbWNweSgmcmVhbG0tPnBhcmFt cy0+cnB2LCAmY2ZnLnJwdiwgc2l6ZW9mKGNmZy5ycHYpKTsKPj4gK8KgwqDCoMKgwqDCoMKgIGJy ZWFrOwo+PiArwqDCoMKgIGNhc2UgS1ZNX0NBUF9BUk1fUk1FX0NGR19IQVNIX0FMR086Cj4+ICvC oMKgwqDCoMKgwqDCoCByID0gY29uZmlnX3JlYWxtX2hhc2hfYWxnbyhyZWFsbSwgJmNmZyk7Cj4+ ICvCoMKgwqDCoMKgwqDCoCBicmVhazsKPj4gK8KgwqDCoCBkZWZhdWx0Ogo+PiArwqDCoMKgwqDC oMKgwqAgciA9IC1FSU5WQUw7Cj4+ICvCoMKgwqAgfQo+PiArCj4+ICvCoMKgwqAgcmV0dXJuIHI7 Cj4+ICt9Cj4+ICsKPj4gK2ludCBrdm1fcmVhbG1fZW5hYmxlX2NhcChzdHJ1Y3Qga3ZtICprdm0s IHN0cnVjdCBrdm1fZW5hYmxlX2NhcCAqY2FwKQo+PiArewo+PiArwqDCoMKgIGludCByID0gMDsK Pj4gKwo+PiArwqDCoMKgIGlmICgha3ZtX2lzX3JlYWxtKGt2bSkpCj4+ICvCoMKgwqDCoMKgwqDC oCByZXR1cm4gLUVJTlZBTDsKPj4gKwo+PiArwqDCoMKgIHN3aXRjaCAoY2FwLT5hcmdzWzBdKSB7 Cj4+ICvCoMKgwqAgY2FzZSBLVk1fQ0FQX0FSTV9STUVfQ09ORklHX1JFQUxNOgo+PiArwqDCoMKg wqDCoMKgwqAgciA9IGt2bV9ybWVfY29uZmlnX3JlYWxtKGt2bSwgY2FwKTsKPj4gK8KgwqDCoMKg wqDCoMKgIGJyZWFrOwo+PiArwqDCoMKgIGNhc2UgS1ZNX0NBUF9BUk1fUk1FX0NSRUFURV9SRDoK Pj4gK8KgwqDCoMKgwqDCoMKgIHIgPSBrdm1fY3JlYXRlX3JlYWxtKGt2bSk7Cj4+ICvCoMKgwqDC oMKgwqDCoCBicmVhazsKPj4gK8KgwqDCoCBkZWZhdWx0Ogo+PiArwqDCoMKgwqDCoMKgwqAgciA9 IC1FSU5WQUw7Cj4+ICvCoMKgwqDCoMKgwqDCoCBicmVhazsKPj4gK8KgwqDCoCB9Cj4+ICsKPj4g K8KgwqDCoCByZXR1cm4gcjsKPj4gK30KPj4gKwo+PiArdm9pZCBrdm1fZGVzdHJveV9yZWFsbShz dHJ1Y3Qga3ZtICprdm0pCj4+ICt7Cj4+ICvCoMKgwqAgc3RydWN0IHJlYWxtICpyZWFsbSA9ICZr dm0tPmFyY2gucmVhbG07Cj4+ICvCoMKgwqAgc3RydWN0IGt2bV9wZ3RhYmxlICpwZ3QgPSBrdm0t PmFyY2gubW11LnBndDsKPj4gK8KgwqDCoCBpbnQgaTsKPj4gKwo+PiArwqDCoMKgIGlmIChyZWFs bS0+cGFyYW1zKSB7Cj4+ICvCoMKgwqDCoMKgwqDCoCBmcmVlX3BhZ2UoKHVuc2lnbmVkIGxvbmcp cmVhbG0tPnBhcmFtcyk7Cj4+ICvCoMKgwqDCoMKgwqDCoCByZWFsbS0+cGFyYW1zID0gTlVMTDsK Pj4gK8KgwqDCoCB9Cj4+ICsKPj4gK8KgwqDCoCBpZiAoIWt2bV9yZWFsbV9pc19jcmVhdGVkKGt2 bSkpCj4+ICvCoMKgwqDCoMKgwqDCoCByZXR1cm47Cj4+ICsKPj4gK8KgwqDCoCBXUklURV9PTkNF KHJlYWxtLT5zdGF0ZSwgUkVBTE1fU1RBVEVfRFlJTkcpOwo+PiArCj4+ICvCoMKgwqAgaWYgKHJl YWxtLT5yZCkgewo+PiArwqDCoMKgwqDCoMKgwqAgcGh5c19hZGRyX3QgcmRfcGh5cyA9IHZpcnRf dG9fcGh5cyhyZWFsbS0+cmQpOwo+PiArCj4+ICvCoMKgwqDCoMKgwqDCoCBpZiAoV0FSTl9PTihy bWlfcmVhbG1fZGVzdHJveShyZF9waHlzKSkpCj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHJl dHVybjsKPj4gK8KgwqDCoMKgwqDCoMKgIGlmIChXQVJOX09OKHJtaV9ncmFudWxlX3VuZGVsZWdh dGUocmRfcGh5cykpKQo+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCByZXR1cm47Cj4+ICvCoMKg wqDCoMKgwqDCoCBmcmVlX3BhZ2UoKHVuc2lnbmVkIGxvbmcpcmVhbG0tPnJkKTsKPj4gK8KgwqDC oMKgwqDCoMKgIHJlYWxtLT5yZCA9IE5VTEw7Cj4+ICvCoMKgwqAgfQo+PiArCj4+ICvCoMKgwqAg cm1lX3ZtaWRfcmVsZWFzZShyZWFsbS0+dm1pZCk7Cj4+ICsKPj4gK8KgwqDCoCBmb3IgKGkgPSAw OyBpIDwgcGd0LT5wZ2RfcGFnZXM7IGkrKykgewo+PiArwqDCoMKgwqDCoMKgwqAgcGh5c19hZGRy X3QgcGdkX3BoeXMgPSBrdm0tPmFyY2gubW11LnBnZF9waHlzICsgaSAqIFBBR0VfU0laRTsKPj4g Kwo+PiArwqDCoMKgwqDCoMKgwqAgaWYgKFdBUk5fT04ocm1pX2dyYW51bGVfdW5kZWxlZ2F0ZShw Z2RfcGh5cykpKQo+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCByZXR1cm47Cj4+ICvCoMKgwqAg fQo+PiArCj4+ICvCoMKgwqAgV1JJVEVfT05DRShyZWFsbS0+c3RhdGUsIFJFQUxNX1NUQVRFX0RF QUQpOwo+PiArCj4gCj4gTWF5IGJlIGFkZCBpbiBhIGNvbW1lbnQgaGVyZToKPiAKPiDCoMKgwqDC oCAvKiBOb3cgdGhhdCB0aGUgUmVhbG0gaXMgZGVzdHJveWVkLCBmcmVlIHRoZSBlbnRyeSBsZXZl bCBSVFRzICovCj4+ICvCoMKgwqAga3ZtX2ZyZWVfc3RhZ2UyX3BnZCgma3ZtLT5hcmNoLm1tdSk7 Cj4gCj4gCj4gCj4+ICt9Cj4+ICsKPj4gK2ludCBrdm1faW5pdF9yZWFsbV92bShzdHJ1Y3Qga3Zt ICprdm0pCj4+ICt7Cj4+ICvCoMKgwqAgc3RydWN0IHJlYWxtX3BhcmFtcyAqcGFyYW1zOwo+PiAr Cj4+ICvCoMKgwqAgcGFyYW1zID0gKHN0cnVjdCByZWFsbV9wYXJhbXMgKilnZXRfemVyb2VkX3Bh Z2UoR0ZQX0tFUk5FTCk7Cj4+ICvCoMKgwqAgaWYgKCFwYXJhbXMpCj4+ICvCoMKgwqDCoMKgwqDC oCByZXR1cm4gLUVOT01FTTsKPj4gKwo+PiArwqDCoMKgIC8qIERlZmF1bHQgcGFyYW1ldGVycywg bm90IGV4cG9zZWQgdG8gdXNlciBzcGFjZSAqLwo+IAo+IFRoaXMgaXMgYSBiaXQgbWlzbGVhZGlu Zy4gVGhlIHZhbHVlIGNvbWVzIGZyb20gdGhlIHVzZXJzcGFjZSBhbmQuLi4KPiAKPj4gK8KgwqDC oCBwYXJhbXMtPnMyc3ogPSBWVENSX0VMMl9JUEEoa3ZtLT5hcmNoLm1tdS52dGNyKTsKPiAKPiAo bWlub3Igbml0KSB3ZSBpbml0aWFsaXNlIG1vc3Qgb2YgdGhlIHBhcmFtcywgaW5jbHVkaW5nIHRo b3NlIHRoYXQgY29tZQo+IGZyb20gS1ZNIGxhdGVyLiBTbywgYXMgc3VjaCBtYXkgYmUgYSBnb29k IGlkZWEgdG8gbW92ZSBpdCB0b2dldGhlciBhdAo+IGNyZWF0ZV9yZWFsbSwgdW5sZXNzIHdlIG5l ZWQgaXQuCgpJbmRlZWQgSSdsbCBtb3ZlIHRoaXMgdG8gY3JlYXRlX3JlYWxtLgoKVGhhbmtzLAoK U3RldmUKCj4+ICvCoMKgwqAga3ZtLT5hcmNoLnJlYWxtLnBhcmFtcyA9IHBhcmFtczsKPj4gK8Kg wqDCoCByZXR1cm4gMDsKPj4gK30KPj4gKwo+PiDCoCBpbnQga3ZtX2luaXRfcm1lKHZvaWQpCj4+ IMKgIHsKPj4gK8KgwqDCoCBpbnQgcmV0Owo+PiArCj4+IMKgwqDCoMKgwqAgaWYgKFBBR0VfU0la RSAhPSBTWl80SykKPj4gwqDCoMKgwqDCoMKgwqDCoMKgIC8qIE9ubHkgNGsgcGFnZSBzaXplIG9u IHRoZSBob3N0IGlzIHN1cHBvcnRlZCAqLwo+PiDCoMKgwqDCoMKgwqDCoMKgwqAgcmV0dXJuIDA7 Cj4+IEBAIC00Niw2ICszMjEsMTMgQEAgaW50IGt2bV9pbml0X3JtZSh2b2lkKQo+PiDCoMKgwqDC oMKgwqDCoMKgwqAgLyogQ29udGludWUgd2l0aG91dCByZWFsbSBzdXBwb3J0ICovCj4+IMKgwqDC oMKgwqDCoMKgwqDCoCByZXR1cm4gMDsKPj4gwqAgK8KgwqDCoCBpZiAoV0FSTl9PTihybWlfZmVh dHVyZXMoMCwgJnJtbV9mZWF0X3JlZzApKSkKPj4gK8KgwqDCoMKgwqDCoMKgIHJldHVybiAwOwo+ PiArCj4+ICvCoMKgwqAgcmV0ID0gcm1lX3ZtaWRfaW5pdCgpOwo+PiArwqDCoMKgIGlmIChyZXQp Cj4+ICvCoMKgwqDCoMKgwqDCoCByZXR1cm4gcmV0Owo+PiArCj4+IMKgwqDCoMKgwqAgLyogRnV0 dXJlIHBhdGNoIHdpbGwgZW5hYmxlIHN0YXRpYyBicmFuY2gga3ZtX3JtZV9pc19hdmFpbGFibGUg Ki8KPj4gwqAgwqDCoMKgwqDCoCByZXR1cm4gMDsKPiAKPiAKPiBTdXp1a2kKPiAKCgpfX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwpsaW51eC1hcm0ta2VybmVs IG1haWxpbmcgbGlzdApsaW51eC1hcm0ta2VybmVsQGxpc3RzLmluZnJhZGVhZC5vcmcKaHR0cDov L2xpc3RzLmluZnJhZGVhZC5vcmcvbWFpbG1hbi9saXN0aW5mby9saW51eC1hcm0ta2VybmVsCg==