Received: by 2002:a05:6a10:2726:0:0:0:0 with SMTP id ib38csp17133pxb; Mon, 4 Apr 2022 22:22:08 -0700 (PDT) X-Google-Smtp-Source: ABdhPJz39fVS0QZ+H46mE6xLkIcmfgVV2eSOEJCKNpt4pz27Ecwtlg61pFJLR4OKtB9jyfDJ2Fbs X-Received: by 2002:a17:90a:4581:b0:1bc:d215:8722 with SMTP id v1-20020a17090a458100b001bcd2158722mr2076672pjg.149.1649136127804; Mon, 04 Apr 2022 22:22:07 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1649136127; cv=none; d=google.com; s=arc-20160816; b=HvPA8/tpz1Om2oBNXJAzM2/PDDEE/vGvcKmaPAhZ3uTjtkNgXpXFByDkAJjdwjXcXY 7Tom0M1gdU7XPXYjxXjLo2Am/nUPXwkYEPH4qAslQKED1jOo7F7HMO3KhsCT4rO5qO4M bCR3wk9aVkDkkAtFTGMxkwKMuWEcKH2hqrZkZwnizxj3NZR4MdXBAYyzNUVyS1dD1YEe S+ErRsA95xGX00ODLtQkoHBLkVmpS1ngbHUEAR2yoVppcQ9st6H5XzIavtvUSfCOi4kH YBuPbnT+M6nsCMA+fO7X+H+V5pI+SnkDEXs6fHPSZG4cqul0FFLpaGsg6ojygFZ2xaCS 4h+A== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:mime-version:user-agent :content-transfer-encoding:references:in-reply-to:date:cc:to:from :subject:message-id:dkim-signature; bh=w9njioHPWxQrmsBb2EufwdcJnH0UBdvYVViBnZu8n68=; b=QZqq/Y2/eP780gNWLdhyDc4hYIvtapWXs/+ZF7Q7YTwsU4xf04lRlZlVL00G41UfRl MtO/VGDP4tRxj2OZrYu6sNISZuRteCJ8HkAlfkFadMRHqlwADn1lYZxr351wRQNtJelz WajY+al73RGshnd0Mw0UBKNKuBVPsL08qJABowW4SHf1XRdneijtGSiv12Bb8VhfcmRy Ao0wb7Ld+A1WhoI8vuzbGTT+pKeng0bLRcsYc3BVnAzEj5ukB8Vg4mXHIYwJZ0u2+YK1 LOaq24LktO6WTBgDrIRuttpjWKbDPF670oS53upyjsqetffDr6L8Cmtpc4Rx3HsMQZ6z 8xHg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=k20201202 header.b=tMEPQ8T6; 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=NONE sp=NONE dis=NONE) header.from=kernel.org Return-Path: Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id a13-20020a170902eccd00b00156b62d6cf6si3374875plh.493.2022.04.04.22.21.55; Mon, 04 Apr 2022 22:22:07 -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=@kernel.org header.s=k20201202 header.b=tMEPQ8T6; 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=NONE sp=NONE dis=NONE) header.from=kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229511AbiDEFFZ (ORCPT + 99 others); Tue, 5 Apr 2022 01:05:25 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:47440 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229689AbiDEFEo (ORCPT ); Tue, 5 Apr 2022 01:04:44 -0400 Received: from ams.source.kernel.org (ams.source.kernel.org [145.40.68.75]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 524F019C00; Mon, 4 Apr 2022 22:02:13 -0700 (PDT) Received: from smtp.kernel.org (relay.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ams.source.kernel.org (Postfix) with ESMTPS id D053CB81A1C; Tue, 5 Apr 2022 05:02:11 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id 454BEC340EE; Tue, 5 Apr 2022 05:02:10 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1649134930; bh=w9njioHPWxQrmsBb2EufwdcJnH0UBdvYVViBnZu8n68=; h=Subject:From:To:Cc:Date:In-Reply-To:References:From; b=tMEPQ8T6vMhuSpreE4fUoYLg45mB7BkrxSiUlgG++CwPV7QCV/tPA8oyBiuec+INH 9DndKI/VaYvXN4SGOb3vxDOdvRnSPIFZ60D9Vyo7xqJQACaXB/e6db4bcW8H+9XPg3 lyZNwX3/8MQcHUvZLtI1mO4Oqt9kWWLg1VbvocG+1eYQg36MiEy91BWldTpoYsptbo glLn1nTh++FcRDbxkKjOEMxSp6CBOdIutMdam0Xdlv2/XwMpyT7u3hE/tJ46UOK+Ag vWKqty/4usL++sctvB9oKBI7rgzyCWQXoEF7Vxzavum7oxxOtn1KPIxGiRzAzSzr4K cT56h5YIuugbg== Message-ID: Subject: Re: [PATCH V3 14/30] x86/sgx: Support restricting of enclave page permissions From: Jarkko Sakkinen To: Reinette Chatre , dave.hansen@linux.intel.com, tglx@linutronix.de, bp@alien8.de, luto@kernel.org, mingo@redhat.com, linux-sgx@vger.kernel.org, x86@kernel.org Cc: seanjc@google.com, kai.huang@intel.com, cathy.zhang@intel.com, cedric.xing@intel.com, haitao.huang@intel.com, mark.shanahan@intel.com, hpa@zytor.com, linux-kernel@vger.kernel.org Date: Tue, 05 Apr 2022 08:03:21 +0300 In-Reply-To: <8ed9ee98ca26c9eefde0fd49062bca6e7b9efe80.1648847675.git.reinette.chatre@intel.com> References: <8ed9ee98ca26c9eefde0fd49062bca6e7b9efe80.1648847675.git.reinette.chatre@intel.com> Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: base64 User-Agent: Evolution 3.42.4 MIME-Version: 1.0 X-Spam-Status: No, score=-7.1 required=5.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,RCVD_IN_DNSWL_HI, SPF_HELO_NONE,SPF_PASS,T_SCC_BODY_TEXT_LINE 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 T24gTW9uLCAyMDIyLTA0LTA0IGF0IDA5OjQ5IC0wNzAwLCBSZWluZXR0ZSBDaGF0cmUgd3JvdGU6 Cj4gSW4gdGhlIGluaXRpYWwgKFNHWDEpIHZlcnNpb24gb2YgU0dYLCBwYWdlcyBpbiBhbiBlbmNs YXZlIG5lZWQgdG8gYmUKPiBjcmVhdGVkIHdpdGggcGVybWlzc2lvbnMgdGhhdCBzdXBwb3J0IGFs bCB1c2FnZXMgb2YgdGhlIHBhZ2VzLCBmcm9tIHRoZQo+IHRpbWUgdGhlIGVuY2xhdmUgaXMgaW5p dGlhbGl6ZWQgdW50aWwgaXQgaXMgdW5sb2FkZWQuIEZvciBleGFtcGxlLAo+IHBhZ2VzIHVzZWQg YnkgYSBKSVQgY29tcGlsZXIgb3Igd2hlbiBjb2RlIG5lZWRzIHRvIG90aGVyd2lzZSBiZQo+IHJl bG9jYXRlZCBuZWVkIHRvIGFsd2F5cyBoYXZlIFJXWCBwZXJtaXNzaW9ucy4KPiAKPiBTR1gyIGlu Y2x1ZGVzIGEgbmV3IGZ1bmN0aW9uIEVOQ0xTW0VNT0RQUl0gdGhhdCBpcyBydW4gZnJvbSB0aGUg a2VybmVsCj4gYW5kIGNhbiBiZSB1c2VkIHRvIHJlc3RyaWN0IHRoZSBFUENNIHBlcm1pc3Npb25z IG9mIHJlZ3VsYXIgZW5jbGF2ZQo+IHBhZ2VzIHdpdGhpbiBhbiBpbml0aWFsaXplZCBlbmNsYXZl Lgo+IAo+IEludHJvZHVjZSBpb2N0bCgpIFNHWF9JT0NfRU5DTEFWRV9SRVNUUklDVF9QRVJNSVNT SU9OUyB0byBzdXBwb3J0Cj4gcmVzdHJpY3RpbmcgRVBDTSBwZXJtaXNzaW9ucy4gV2l0aCB0aGlz IGlvY3RsKCkgdGhlIHVzZXIgc3BlY2lmaWVzCj4gYSBwYWdlIHJhbmdlIGFuZCB0aGUgRVBDTSBw ZXJtaXNzaW9ucyB0byBiZSBhcHBsaWVkIHRvIGFsbCBwYWdlcyBpbgo+IHRoZSBwcm92aWRlZCBy YW5nZS4gRU5DTFNbRU1PRFBSXSBpcyBydW4gdG8gcmVzdHJpY3QgdGhlIEVQQ00KPiBwZXJtaXNz aW9ucyBmb2xsb3dlZCBieSB0aGUgRU5DTFNbRVRSQUNLXSBmbG93IHRoYXQgd2lsbCBlbnN1cmUK PiBubyBjYWNoZWQgbGluZWFyLXRvLXBoeXNpY2FsIGFkZHJlc3MgbWFwcGluZ3MgdG8gdGhlIGNo YW5nZWQKPiBwYWdlcyByZW1haW4uCj4gCj4gSXQgaXMgcG9zc2libGUgZm9yIHRoZSBwZXJtaXNz aW9uIGNoYW5nZSByZXF1ZXN0IHRvIGZhaWwgb24gYW55Cj4gcGFnZSB3aXRoaW4gdGhlIHByb3Zp ZGVkIHJhbmdlLCBlaXRoZXIgd2l0aCBhbiBlcnJvciBlbmNvdW50ZXJlZAo+IGJ5IHRoZSBrZXJu ZWwgb3IgYnkgdGhlIFNHWCBoYXJkd2FyZSB3aGlsZSBydW5uaW5nCj4gRU5DTFNbRU1PRFBSXS4g VG8gc3VwcG9ydCBwYXJ0aWFsIHN1Y2Nlc3MgdGhlIGlvY3RsKCkgcmV0dXJucyBhbgo+IGVycm9y IGNvZGUgYmFzZWQgb24gZmFpbHVyZXMgZW5jb3VudGVyZWQgYnkgdGhlIGtlcm5lbCBhcyB3ZWxs Cj4gYXMgdHdvIHJlc3VsdCBvdXRwdXQgcGFyYW1ldGVyczogb25lIGZvciB0aGUgbnVtYmVyIG9m IHBhZ2VzCj4gdGhhdCB3ZXJlIHN1Y2Nlc3NmdWxseSBjaGFuZ2VkIGFuZCBvbmUgZm9yIHRoZSBT R1ggcmV0dXJuIGNvZGUuCj4gCj4gVGhlIHBhZ2UgdGFibGUgZW50cnkgcGVybWlzc2lvbnMgYXJl IG5vdCBpbXBhY3RlZCBieSB0aGUgRVBDTQo+IHBlcm1pc3Npb24gY2hhbmdlcy4gVk1BcyBhbmQg UFRFcyB3aWxsIGNvbnRpbnVlIHRvIGFsbG93IHRoZQo+IG1heGltdW0gdmV0dGVkIHBlcm1pc3Np b25zIGRldGVybWluZWQgYXQgdGhlIHRpbWUgdGhlIHBhZ2VzCj4gYXJlIGFkZGVkIHRvIHRoZSBl bmNsYXZlLiBUaGUgU0dYIGVycm9yIGNvZGUgaW4gYSBwYWdlIGZhdWx0Cj4gd2lsbCBpbmRpY2F0 ZSBpZiBpdCB3YXMgYW4gRVBDTSBwZXJtaXNzaW9uIGNoZWNrIHRoYXQgcHJldmVudGVkCj4gYW4g YWNjZXNzIGF0dGVtcHQuCj4gCj4gTm8gY2hlY2tpbmcgaXMgZG9uZSB0byBlbnN1cmUgdGhhdCB0 aGUgcGVybWlzc2lvbnMgYXJlIGFjdHVhbGx5Cj4gYmVpbmcgcmVzdHJpY3RlZC4gVGhpcyBpcyBi ZWNhdXNlIHRoZSBlbmNsYXZlIG1heSBoYXZlIHJlbGF4ZWQKPiB0aGUgRVBDTSBwZXJtaXNzaW9u cyBmcm9tIHdpdGhpbiB0aGUgZW5jbGF2ZSB3aXRob3V0IGxldHRpbmcgdGhlCj4ga2VybmVsIGtu b3cuIEFuIGF0dGVtcHQgdG8gcmVsYXggcGVybWlzc2lvbnMgdXNpbmcgdGhpcyBjYWxsIHdpbGwK PiBiZSBpZ25vcmVkIGJ5IHRoZSBoYXJkd2FyZS4KPiAKPiBTaWduZWQtb2ZmLWJ5OiBSZWluZXR0 ZSBDaGF0cmUgPHJlaW5ldHRlLmNoYXRyZUBpbnRlbC5jb20+Cj4gLS0tCj4gQ2hhbmdlcyBzaW5j ZSBWMjoKPiAtIEluY2x1ZGUgdGhlIHNneF9pb2Nfc2d4Ml9yZWFkeSgpIHV0aWxpdHkKPiDCoCB0 aGF0IHByZXZpb3VzbHkgd2FzIGluICJ4ODYvc2d4OiBTdXBwb3J0IHJlbGF4aW5nIG9mIGVuY2xh dmUgcGFnZQo+IMKgIHBlcm1pc3Npb25zIiB0aGF0IGlzIHJlbW92ZWQgZnJvbSB0aGUgbmV4dCB2 ZXJzaW9uLgo+IC0gRmV3IHJlbmFtZXMgcmVxdWVzdGVkIGJ5IEphcmtrbzoKPiDCoCBzdHJ1Y3Qg c2d4X2VuY2xhdmVfcmVzdHJpY3RfcGVybSAtPgo+IMKgwqDCoMKgwqDCoMKgwqAgc3RydWN0IHNn eF9lbmNsYXZlX3Jlc3RyaWN0X3Blcm1pc3Npb25zCj4gwqAgc2d4X2VuY2xhdmVfcmVzdHJpY3Rf cGVybSgpwqDCoMKgwqAgLT4KPiDCoMKgwqDCoMKgwqDCoMKgIHNneF9lbmNsYXZlX3Jlc3RyaWN0 X3Blcm1pc3Npb25zKCkKPiDCoCBzZ3hfaW9jX2VuY2xhdmVfcmVzdHJpY3RfcGVybSgpIC0+Cj4g wqDCoMKgwqDCoMKgwqDCoCBzZ3hfaW9jX2VuY2xhdmVfcmVzdHJpY3RfcGVybWlzc2lvbnMoKQo+ IC0gTWFrZSBFUENNIHBlcm1pc3Npb25zIGluZGVwZW5kZW50IGZyb20ga2VybmVsIHZpZXcgb2YK PiDCoCBwZXJtaXNzaW9ucy7CoCAoSmFya2tvKQo+IMKgIC0gUmVtb3ZlIGF0dGVtcHQgYXQgcnVu dGltZSB0cmFja2luZyBvZiBFUENNIHBlcm1pc3Npb25zCj4gwqDCoMKgIChzZ3hfZW5jbF9wYWdl LT52bV9ydW5fcHJvdF9iaXRzKS4KPiDCoCAtIERvIG5vdCBmbHVzaCBwYWdlIHRhYmxlIGVudHJp ZXMgLSB0aGV5IGFyZSBubyBsb25nZXIgaW1wYWN0ZWQgYnkKPiDCoMKgwqAgRVBDTSBwZXJtaXNz aW9uIGNoYW5nZXMuCj4gwqAgLSBNb2RpZnkgY2hhbmdlbG9nIHRvIHJlZmxlY3QgbmV3IGFyY2hp dGVjdHVyZS4KPiAtIEVuc3VyZSBhdCBsZWFzdCBQUk9UX1JFQUQgaXMgcmVxdWVzdGVkIC0gZW5j bGF2ZSByZXF1aXJlcyByZWFkCj4gwqAgYWNjZXNzIHRvIHRoZSBwYWdlIGZvciBjb21tYW5kcyBs aWtlIEVNT0RQRSBhbmQgRUFDQ0VQVC4gKEphcmtrbykKPiAKPiBDaGFuZ2VzIHNpbmNlIFYxOgo+ IC0gQ2hhbmdlIHRlcm1pbm9sb2d5IHRvIHVzZSAicmVsYXgiIGluc3RlYWQgb2YgImV4dGVuZCIg dG8gcmVmZXIgdG8KPiDCoCB0aGUgY2FzZSB3aGVuIGVuY2xhdmUgcGFnZSBwZXJtaXNzaW9ucyBh cmUgYWRkZWQgKERhdmUpLgo+IC0gVXNlIGlvY3RsKCkgaW4gY29tbWl0IG1lc3NhZ2UgKERhdmUp Lgo+IC0gQWRkIGV4YW1wbGVzIG9uIHdoYXQgcGVybWlzc2lvbnMgd291bGQgYmUgYWxsb3dlZCAo RGF2ZSkuCj4gLSBTcGxpdCBlbmNsYXZlIHBhZ2UgcGVybWlzc2lvbiBjaGFuZ2VzIGludG8gdHdv IGlvY3RsKClzLCBvbmUgZm9yCj4gwqAgcGVybWlzc2lvbiByZXN0cmljdGluZyAoU0dYX0lPQ19F TkNMQVZFX1JFU1RSSUNUX1BFUk1JU1NJT05TKQo+IMKgIGFuZCBvbmUgZm9yIHBlcm1pc3Npb24g cmVsYXhpbmcgKFNHWF9JT0NfRU5DTEFWRV9SRUxBWF9QRVJNSVNTSU9OUykKPiDCoCAoSmFya2tv KS4KPiAtIEluIHN1cHBvcnQgb2YgdGhlIGlvY3RsKCkgbmFtZSBjaGFuZ2UgdGhlIGZvbGxvd2lu ZyBuYW1lcyBoYXZlIGJlZW4KPiDCoCBjaGFuZ2VkOgo+IMKgIHN0cnVjdCBzZ3hfcGFnZV9tb2Rw IC0+IHN0cnVjdCBzZ3hfZW5jbGF2ZV9yZXN0cmljdF9wZXJtCj4gwqAgc2d4X2lvY19wYWdlX21v ZHAoKSAtPiBzZ3hfaW9jX2VuY2xhdmVfcmVzdHJpY3RfcGVybSgpCj4gwqAgc2d4X3BhZ2VfbW9k cCgpIC0+IHNneF9lbmNsYXZlX3Jlc3RyaWN0X3Blcm0oKQo+IC0gaW9jdGwoKSB0YWtlcyBlbnRp cmUgc2VjaW5mbyBhcyBpbnB1dCBpbnN0ZWFkIG9mCj4gwqAgcGFnZSBwZXJtaXNzaW9ucyBvbmx5 IChKYXJra28pLgo+IC0gRml4IGtlcm5lbC1kb2MgdG8gaW5jbHVkZSAoKSBpbiBmdW5jdGlvbiBu YW1lLgo+IC0gQ3JlYXRlIGFuZCB1c2UgdXRpbGl0eSBmb3IgdGhlIEVUUkFDSyBmbG93Lgo+IC0g Rml4dXBzIGluIGNvbW1lbnRzCj4gLSBNb3ZlIGtlcm5lbC1kb2MgdG8gZnVuY3Rpb24gdGhhdCBw cm92aWRlcyBkb2N1bWVudGF0aW9uIGZvcgo+IMKgIERvY3VtZW50YXRpb24veDg2L3NneC5yc3Qu Cj4gLSBSZW1vdmUgcmVkdW5kYW50IGNvbW1lbnQuCj4gLSBNYWtlIGV4cGxpY2l0IHdoaWNoIG1l bWJlcnMgb2Ygc3RydWN0IHNneF9lbmNsYXZlX3Jlc3RyaWN0X3Blcm0KPiDCoCBhcmUgZm9yIG91 dHB1dCAoRGF2ZSkuCj4gCj4gwqBhcmNoL3g4Ni9pbmNsdWRlL3VhcGkvYXNtL3NneC5oIHzCoCAy MSArKysKPiDCoGFyY2gveDg2L2tlcm5lbC9jcHUvc2d4L2lvY3RsLmMgfCAyNDIgKysrKysrKysr KysrKysrKysrKysrKysrKysrKysrKysKPiDCoDIgZmlsZXMgY2hhbmdlZCwgMjYzIGluc2VydGlv bnMoKykKPiAKPiBkaWZmIC0tZ2l0IGEvYXJjaC94ODYvaW5jbHVkZS91YXBpL2FzbS9zZ3guaCBi L2FyY2gveDg2L2luY2x1ZGUvdWFwaS9hc20vc2d4LmgKPiBpbmRleCBmNGI4MTU4N2U5MGIuLmEw YTI0ZTk0ZmIyNyAxMDA2NDQKPiAtLS0gYS9hcmNoL3g4Ni9pbmNsdWRlL3VhcGkvYXNtL3NneC5o Cj4gKysrIGIvYXJjaC94ODYvaW5jbHVkZS91YXBpL2FzbS9zZ3guaAo+IEBAIC0yOSw2ICsyOSw4 IEBAIGVudW0gc2d4X3BhZ2VfZmxhZ3Mgewo+IMKgwqDCoMKgwqDCoMKgwqBfSU9XKFNHWF9NQUdJ QywgMHgwMywgc3RydWN0IHNneF9lbmNsYXZlX3Byb3Zpc2lvbikKPiDCoCNkZWZpbmUgU0dYX0lP Q19WRVBDX1JFTU9WRV9BTEwgXAo+IMKgwqDCoMKgwqDCoMKgwqBfSU8oU0dYX01BR0lDLCAweDA0 KQo+ICsjZGVmaW5lIFNHWF9JT0NfRU5DTEFWRV9SRVNUUklDVF9QRVJNSVNTSU9OUyBcCj4gK8Kg wqDCoMKgwqDCoMKgX0lPV1IoU0dYX01BR0lDLCAweDA1LCBzdHJ1Y3Qgc2d4X2VuY2xhdmVfcmVz dHJpY3RfcGVybWlzc2lvbnMpCj4gwqAKPiDCoC8qKgo+IMKgICogc3RydWN0IHNneF9lbmNsYXZl X2NyZWF0ZSAtIHBhcmFtZXRlciBzdHJ1Y3R1cmUgZm9yIHRoZQo+IEBAIC03Niw2ICs3OCwyNSBA QCBzdHJ1Y3Qgc2d4X2VuY2xhdmVfcHJvdmlzaW9uIHsKPiDCoMKgwqDCoMKgwqDCoMKgX191NjQg ZmQ7Cj4gwqB9Owo+IMKgCj4gKy8qKgo+ICsgKiBzdHJ1Y3Qgc2d4X2VuY2xhdmVfcmVzdHJpY3Rf cGVybWlzc2lvbnMgLSBwYXJhbWV0ZXJzIGZvciBpb2N0bAo+ICsgKsKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoCAlU0dYX0lPQ19FTkNMQVZFX1JFU1RSSUNUX1BFUk1JU1NJT05TCj4gKyAqIEBvZmZzZXQ6 wqDCoMKgwqBzdGFydGluZyBwYWdlIG9mZnNldCAocGFnZSBhbGlnbmVkIHJlbGF0aXZlIHRvIGVu Y2xhdmUgYmFzZQo+ICsgKsKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgYWRkcmVzcyBkZWZpbmVk IGluIFNFQ1MpCj4gKyAqIEBsZW5ndGg6wqDCoMKgwqBsZW5ndGggb2YgbWVtb3J5IChtdWx0aXBs ZSBvZiB0aGUgcGFnZSBzaXplKQo+ICsgKiBAc2VjaW5mbzrCoMKgwqBhZGRyZXNzIGZvciB0aGUg U0VDSU5GTyBkYXRhIGNvbnRhaW5pbmcgdGhlIG5ldyBwZXJtaXNzaW9uIGJpdHMKPiArICrCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoGZvciBwYWdlcyBpbiByYW5nZSBkZXNjcmliZWQgYnkgQG9m ZnNldCBhbmQgQGxlbmd0aAo+ICsgKiBAcmVzdWx0OsKgwqDCoMKgKG91dHB1dCkgU0dYIHJlc3Vs dCBjb2RlIG9mIEVOQ0xTW0VNT0RQUl0gZnVuY3Rpb24KPiArICogQGNvdW50OsKgwqDCoMKgwqAo b3V0cHV0KSBieXRlcyBzdWNjZXNzZnVsbHkgY2hhbmdlZCAobXVsdGlwbGUgb2YgcGFnZSBzaXpl KQo+ICsgKi8KPiArc3RydWN0IHNneF9lbmNsYXZlX3Jlc3RyaWN0X3Blcm1pc3Npb25zIHsKPiAr wqDCoMKgwqDCoMKgwqBfX3U2NCBvZmZzZXQ7Cj4gK8KgwqDCoMKgwqDCoMKgX191NjQgbGVuZ3Ro Owo+ICvCoMKgwqDCoMKgwqDCoF9fdTY0IHNlY2luZm87Cj4gK8KgwqDCoMKgwqDCoMKgX191NjQg cmVzdWx0Owo+ICvCoMKgwqDCoMKgwqDCoF9fdTY0IGNvdW50Owo+ICt9Owo+ICsKPiDCoHN0cnVj dCBzZ3hfZW5jbGF2ZV9ydW47Cj4gwqAKPiDCoC8qKgo+IGRpZmYgLS1naXQgYS9hcmNoL3g4Ni9r ZXJuZWwvY3B1L3NneC9pb2N0bC5jIGIvYXJjaC94ODYva2VybmVsL2NwdS9zZ3gvaW9jdGwuYwo+ IGluZGV4IDA0NjBmZDIyNGEwNS4uNGQ4OGJmZDE2M2U3IDEwMDY0NAo+IC0tLSBhL2FyY2gveDg2 L2tlcm5lbC9jcHUvc2d4L2lvY3RsLmMKPiArKysgYi9hcmNoL3g4Ni9rZXJuZWwvY3B1L3NneC9p b2N0bC5jCj4gQEAgLTY2MCw2ICs2NjAsMjQ0IEBAIHN0YXRpYyBsb25nIHNneF9pb2NfZW5jbGF2 ZV9wcm92aXNpb24oc3RydWN0IHNneF9lbmNsICplbmNsLCB2b2lkIF9fdXNlciAqYXJnKQo+IMKg wqDCoMKgwqDCoMKgwqByZXR1cm4gc2d4X3NldF9hdHRyaWJ1dGUoJmVuY2wtPmF0dHJpYnV0ZXNf bWFzaywgcGFyYW1zLmZkKTsKPiDCoH0KPiDCoAo+ICsvKgo+ICsgKiBFbnN1cmUgZW5jbGF2ZSBp cyByZWFkeSBmb3IgU0dYMiBmdW5jdGlvbnMuIFJlYWRpbmVzcyBpcyBjaGVja2VkCj4gKyAqIGJ5 IGVuc3VyaW5nIHRoZSBoYXJkd2FyZSBzdXBwb3J0cyBTR1gyIGFuZCB0aGUgZW5jbGF2ZSBpcyBp bml0aWFsaXplZAo+ICsgKiBhbmQgdGh1cyBhYmxlIHRvIGhhbmRsZSByZXF1ZXN0cyB0byBtb2Rp ZnkgcGFnZXMgd2l0aGluIGl0Lgo+ICsgKi8KPiArc3RhdGljIGludCBzZ3hfaW9jX3NneDJfcmVh ZHkoc3RydWN0IHNneF9lbmNsICplbmNsKQo+ICt7Cj4gK8KgwqDCoMKgwqDCoMKgaWYgKCEoY3B1 X2ZlYXR1cmVfZW5hYmxlZChYODZfRkVBVFVSRV9TR1gyKSkpCj4gK8KgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoHJldHVybiAtRU5PREVWOwo+ICsKPiArwqDCoMKgwqDCoMKgwqBpZiAoIXRl c3RfYml0KFNHWF9FTkNMX0lOSVRJQUxJWkVELCAmZW5jbC0+ZmxhZ3MpKQo+ICvCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqByZXR1cm4gLUVJTlZBTDsKPiArCj4gK8KgwqDCoMKgwqDCoMKg cmV0dXJuIDA7Cj4gK30KPiArCj4gKy8qCj4gKyAqIFJldHVybiB2YWxpZCBwZXJtaXNzaW9uIGZp ZWxkcyBmcm9tIGEgc2VjaW5mbyBzdHJ1Y3R1cmUgcHJvdmlkZWQgYnkKPiArICogdXNlciBzcGFj ZS4gVGhlIHNlY2luZm8gc3RydWN0dXJlIGlzIHJlcXVpcmVkIHRvIG9ubHkgaGF2ZSBiaXRzIGlu Cj4gKyAqIHRoZSBwZXJtaXNzaW9uIGZpZWxkcyBzZXQuCj4gKyAqLwo+ICtzdGF0aWMgaW50IHNn eF9wZXJtX2Zyb21fdXNlcl9zZWNpbmZvKHZvaWQgX191c2VyICpfc2VjaW5mbywgdTY0ICpzZWNp bmZvX3Blcm0pCj4gK3sKPiArwqDCoMKgwqDCoMKgwqBzdHJ1Y3Qgc2d4X3NlY2luZm8gc2VjaW5m bzsKPiArwqDCoMKgwqDCoMKgwqB1NjQgcGVybTsKPiArCj4gK8KgwqDCoMKgwqDCoMKgaWYgKGNv cHlfZnJvbV91c2VyKCZzZWNpbmZvLCAodm9pZCBfX3VzZXIgKilfc2VjaW5mbywKPiArwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgc2l6ZW9mKHNlY2lu Zm8pKSkKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgcmV0dXJuIC1FRkFVTFQ7Cj4g Kwo+ICvCoMKgwqDCoMKgwqDCoGlmIChzZWNpbmZvLmZsYWdzICYgflNHWF9TRUNJTkZPX1BFUk1J U1NJT05fTUFTSykKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgcmV0dXJuIC1FSU5W QUw7Cj4gKwo+ICvCoMKgwqDCoMKgwqDCoGlmIChtZW1jaHJfaW52KHNlY2luZm8ucmVzZXJ2ZWQs IDAsIHNpemVvZihzZWNpbmZvLnJlc2VydmVkKSkpCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoHJldHVybiAtRUlOVkFMOwo+ICsKPiArwqDCoMKgwqDCoMKgwqBwZXJtID0gc2VjaW5m by5mbGFncyAmIFNHWF9TRUNJTkZPX1BFUk1JU1NJT05fTUFTSzsKPiArCj4gK8KgwqDCoMKgwqDC oMKgLyoKPiArwqDCoMKgwqDCoMKgwqAgKiBSZWFkIGFjY2VzcyBpcyByZXF1aXJlZCBmb3IgdGhl IGVuY2xhdmUgdG8gYmUgYWJsZSB0byB1c2UgdGhlIHBhZ2UuCj4gK8KgwqDCoMKgwqDCoMKgICog U0dYIGluc3RydWN0aW9ucyBsaWtlIEVOQ0xVW0VNT0RQRV0gYW5kIEVOQ0xVW0VBQ0NFUFRdIHJl cXVpcmUKPiArwqDCoMKgwqDCoMKgwqAgKiByZWFkIGFjY2Vzcy4KPiArwqDCoMKgwqDCoMKgwqAg Ki8KPiArwqDCoMKgwqDCoMKgwqBpZiAoIShwZXJtICYgU0dYX1NFQ0lORk9fUikpCj4gK8KgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoHJldHVybiAtRUlOVkFMOwo+ICsKPiArwqDCoMKgwqDC oMKgwqAqc2VjaW5mb19wZXJtID0gcGVybTsKPiArCj4gK8KgwqDCoMKgwqDCoMKgcmV0dXJuIDA7 Cj4gK30KPiArCj4gKy8qCj4gKyAqIFNvbWUgU0dYIGZ1bmN0aW9ucyByZXF1aXJlIHRoYXQgbm8g Y2FjaGVkIGxpbmVhci10by1waHlzaWNhbCBhZGRyZXNzCj4gKyAqIG1hcHBpbmdzIGFyZSBwcmVz ZW50IGJlZm9yZSB0aGV5IGNhbiBzdWNjZWVkLiBDb2xsYWJvcmF0ZSB3aXRoCj4gKyAqIGhhcmR3 YXJlIHZpYSBFTkNMU1tFVFJBQ0tdIHRvIGVuc3VyZSB0aGF0IGFsbCBjYWNoZWQKPiArICogbGlu ZWFyLXRvLXBoeXNpY2FsIGFkZHJlc3MgbWFwcGluZ3MgYmVsb25naW5nIHRvIGFsbCB0aHJlYWRz IG9mCj4gKyAqIHRoZSBlbmNsYXZlIGFyZSBjbGVhcmVkLiBTZWUgc2d4X2VuY2xfY3B1bWFzaygp IGZvciBkZXRhaWxzLgo+ICsgKi8KPiArc3RhdGljIGludCBzZ3hfZW5jbGF2ZV9ldHJhY2soc3Ry dWN0IHNneF9lbmNsICplbmNsKQo+ICt7Cj4gK8KgwqDCoMKgwqDCoMKgdm9pZCAqZXBjX3ZpcnQ7 Cj4gK8KgwqDCoMKgwqDCoMKgaW50IHJldDsKPiArCj4gK8KgwqDCoMKgwqDCoMKgZXBjX3ZpcnQg PSBzZ3hfZ2V0X2VwY192aXJ0X2FkZHIoZW5jbC0+c2Vjcy5lcGNfcGFnZSk7Cj4gK8KgwqDCoMKg wqDCoMKgcmV0ID0gX19ldHJhY2soZXBjX3ZpcnQpOwo+ICvCoMKgwqDCoMKgwqDCoGlmIChyZXQp IHsKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgLyoKPiArwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgICogRVRSQUNLIG9ubHkgZmFpbHMgd2hlbiB0aGVyZSBpcyBhbiBPUyBp c3N1ZS4gRm9yCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCAqIGV4YW1wbGUsIHR3 byBjb25zZWN1dGl2ZSBFVFJBQ0sgd2FzIHNlbnQgd2l0aG91dAo+ICvCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqAgKiBjb21wbGV0ZWQgSVBJIGJldHdlZW4uCj4gK8KgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoCAqLwo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBwcl9l cnJfb25jZSgiRVRSQUNLIHJldHVybmVkICVkICgweCV4KSIsIHJldCwgcmV0KTsKPiArwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgLyoKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgICogU2VuZCBJUElzIHRvIGtpY2sgQ1BVcyBvdXQgb2YgdGhlIGVuY2xhdmUgYW5kCj4gK8Kg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCAqIHRyeSBFVFJBQ0sgYWdhaW4uCj4gK8KgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCAqLwo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqBvbl9lYWNoX2NwdV9tYXNrKHNneF9lbmNsX2NwdW1hc2soZW5jbCksIHNneF9pcGlfY2Is IE5VTEwsIDEpOwo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqByZXQgPSBfX2V0cmFj ayhlcGNfdmlydCk7Cj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGlmIChyZXQpIHsK PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoHByX2Vycl9v bmNlKCJFVFJBQ0sgcmVwZWF0IHJldHVybmVkICVkICgweCV4KSIsCj4gK8KgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHJl dCwgcmV0KTsKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oHJldHVybiAtRUZBVUxUOwo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqB9Cj4gK8Kg wqDCoMKgwqDCoMKgfQo+ICvCoMKgwqDCoMKgwqDCoG9uX2VhY2hfY3B1X21hc2soc2d4X2VuY2xf Y3B1bWFzayhlbmNsKSwgc2d4X2lwaV9jYiwgTlVMTCwgMSk7Cj4gKwo+ICvCoMKgwqDCoMKgwqDC oHJldHVybiAwOwo+ICt9Cj4gKwo+ICsvKioKPiArICogc2d4X2VuY2xhdmVfcmVzdHJpY3RfcGVy bWlzc2lvbnMoKSAtIFJlc3RyaWN0IEVQQ00gcGVybWlzc2lvbnMKPiArICogQGVuY2w6wqDCoMKg wqDCoMKgRW5jbGF2ZSB0byB3aGljaCB0aGUgcGFnZXMgYmVsb25nLgo+ICsgKiBAbW9kcDrCoMKg wqDCoMKgwqBDaGVja2VkIHBhcmFtZXRlcnMgZnJvbSB1c2VyIG9uIHdoaWNoIHBhZ2VzIG5lZWQg bW9kaWZ5aW5nLgo+ICsgKiBAc2VjaW5mb19wZXJtOiBOZXcgKHZhbGlkYXRlZCkgcGVybWlzc2lv biBiaXRzLgo+ICsgKgo+ICsgKiBSZXR1cm46Cj4gKyAqIC0gMDrCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoFN1Y2Nlc3MuCj4gKyAqIC0gLWVycm5vOsKgwqDCoE90aGVyd2lzZS4KPiAr ICovCj4gK3N0YXRpYyBsb25nCj4gK3NneF9lbmNsYXZlX3Jlc3RyaWN0X3Blcm1pc3Npb25zKHN0 cnVjdCBzZ3hfZW5jbCAqZW5jbCwKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgc3RydWN0IHNneF9lbmNsYXZlX3Jlc3RyaWN0 X3Blcm1pc3Npb25zICptb2RwLAo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCB1NjQgc2VjaW5mb19wZXJtKQo+ICt7Cj4gK8Kg wqDCoMKgwqDCoMKgc3RydWN0IHNneF9lbmNsX3BhZ2UgKmVudHJ5Owo+ICvCoMKgwqDCoMKgwqDC oHN0cnVjdCBzZ3hfc2VjaW5mbyBzZWNpbmZvOwo+ICvCoMKgwqDCoMKgwqDCoHVuc2lnbmVkIGxv bmcgYWRkcjsKPiArwqDCoMKgwqDCoMKgwqB1bnNpZ25lZCBsb25nIGM7Cj4gK8KgwqDCoMKgwqDC oMKgdm9pZCAqZXBjX3ZpcnQ7Cj4gK8KgwqDCoMKgwqDCoMKgaW50IHJldDsKPiArCj4gK8KgwqDC oMKgwqDCoMKgbWVtc2V0KCZzZWNpbmZvLCAwLCBzaXplb2Yoc2VjaW5mbykpOwo+ICvCoMKgwqDC oMKgwqDCoHNlY2luZm8uZmxhZ3MgPSBzZWNpbmZvX3Blcm07Cj4gKwo+ICvCoMKgwqDCoMKgwqDC oGZvciAoYyA9IDAgOyBjIDwgbW9kcC0+bGVuZ3RoOyBjICs9IFBBR0VfU0laRSkgewo+ICvCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBhZGRyID0gZW5jbC0+YmFzZSArIG1vZHAtPm9mZnNl dCArIGM7Cj4gKwo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBtdXRleF9sb2NrKCZl bmNsLT5sb2NrKTsKPiArCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGVudHJ5ID0g c2d4X2VuY2xfbG9hZF9wYWdlKGVuY2wsIGFkZHIpOwo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqBpZiAoSVNfRVJSKGVudHJ5KSkgewo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgcmV0ID0gUFRSX0VSUihlbnRyeSkgPT0gLUVCVVNZID8gLUVB R0FJTiA6IC1FRkFVTFQ7Cj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqBnb3RvIG91dF91bmxvY2s7Cj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oH0KPiArCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoC8qCj4gK8KgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoCAqIENoYW5naW5nIEVQQ00gcGVybWlzc2lvbnMgaXMgb25seSBz dXBwb3J0ZWQgb24gcmVndWxhcgo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgKiBT R1ggcGFnZXMuIEF0dGVtcHRpbmcgdGhpcyBjaGFuZ2Ugb24gb3RoZXIgcGFnZXMgd2lsbAo+ICvC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgKiByZXN1bHQgaW4gI1BGLgo+ICvCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgKi8KPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgaWYgKGVudHJ5LT50eXBlICE9IFNHWF9QQUdFX1RZUEVfUkVHKSB7Cj4gK8KgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqByZXQgPSAtRUlOVkFMOwo+ICvCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgZ290byBvdXRfdW5sb2Nr Owo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqB9Cj4gKwo+ICvCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqAvKgo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgKiBE byBub3QgdmVyaWZ5IHRoZSBwZXJtaXNzaW9uIGJpdHMgcmVxdWVzdGVkLiBLZXJuZWwKPiArwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgICogaGFzIG5vIGNvbnRyb2wgb3ZlciBob3cgRVBD TSBwZXJtaXNzaW9ucyBjYW4gYmUgcmVsYXhlZAo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqAgKiBmcm9tIHdpdGhpbiB0aGUgZW5jbGF2ZS4gRU5DTFNbRU1PRFBSXSBjYW4gb25seQo+ ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgKiByZW1vdmUgZXhpc3RpbmcgRVBDTSBw ZXJtaXNzaW9ucywgYXR0ZW1wdGluZyB0byBzZXQKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgICogbmV3IHBlcm1pc3Npb25zIHdpbGwgYmUgaWdub3JlZCBieSB0aGUgaGFyZHdhcmUu Cj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCAqLwo+ICsKPiArwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgLyogQ2hhbmdlIEVQQ00gcGVybWlzc2lvbnMuICovCj4gK8KgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGVwY192aXJ0ID0gc2d4X2dldF9lcGNfdmlydF9hZGRy KGVudHJ5LT5lcGNfcGFnZSk7Cj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoHJldCA9 IF9fZW1vZHByKCZzZWNpbmZvLCBlcGNfdmlydCk7Cj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoGlmIChlbmNsc19mYXVsdGVkKHJldCkpIHsKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoC8qCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqAgKiBBbGwgcG9zc2libGUgZmF1bHRzIHNob3VsZCBiZSBhdm9p ZGFibGU6Cj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAg KiBwYXJhbWV0ZXJzIGhhdmUgYmVlbiBjaGVja2VkLCB3aWxsIG9ubHkgY2hhbmdlCj4gK8KgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgKiBwZXJtaXNzaW9ucyBv ZiBhIHJlZ3VsYXIgcGFnZSwgYW5kIG5vIGNvbmN1cnJlbnQKPiArwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCAqIFNHWDEvU0dYMiBFTkNMUyBpbnN0cnVjdGlv bnMgc2luY2UgdGhlc2UKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoCAqIGFyZSBwcm90ZWN0ZWQgd2l0aCBtdXRleC4KPiArwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCAqLwo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgcHJfZXJyX29uY2UoIkVNT0RQUiBlbmNvdW50ZXJlZCBl eGNlcHRpb24gJWRcbiIsCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIEVOQ0xTX1RSQVBOUihyZXQpKTsKPiArwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoHJldCA9IC1FRkFVTFQ7 Cj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBnb3RvIG91 dF91bmxvY2s7Cj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoH0KPiArwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgaWYgKGVuY2xzX2ZhaWxlZChyZXQpKSB7Cj4gK8KgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBtb2RwLT5yZXN1bHQgPSByZXQ7 Cj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqByZXQgPSAt RUZBVUxUOwo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg Z290byBvdXRfdW5sb2NrOwo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqB9Cj4gKwo+ ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqByZXQgPSBzZ3hfZW5jbGF2ZV9ldHJhY2so ZW5jbCk7Cj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGlmIChyZXQpIHsKPiArwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoHJldCA9IC1FRkFVTFQ7 Cj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBnb3RvIG91 dF91bmxvY2s7Cj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoH0KPiArCj4gK8KgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoG11dGV4X3VubG9jaygmZW5jbC0+bG9jayk7Cj4gK8Kg wqDCoMKgwqDCoMKgfQo+ICsKPiArwqDCoMKgwqDCoMKgwqByZXQgPSAwOwo+ICvCoMKgwqDCoMKg wqDCoGdvdG8gb3V0Owo+ICsKPiArb3V0X3VubG9jazoKPiArwqDCoMKgwqDCoMKgwqBtdXRleF91 bmxvY2soJmVuY2wtPmxvY2spOwo+ICtvdXQ6Cj4gK8KgwqDCoMKgwqDCoMKgbW9kcC0+Y291bnQg PSBjOwo+ICsKPiArwqDCoMKgwqDCoMKgwqByZXR1cm4gcmV0Owo+ICt9Cj4gKwo+ICsvKioKPiAr ICogc2d4X2lvY19lbmNsYXZlX3Jlc3RyaWN0X3Blcm1pc3Npb25zKCkgLSBoYW5kbGVyIGZvcgo+ ICsgKsKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCAlU0dYX0lPQ19FTkNMQVZFX1JFU1RSSUNUX1BFUk1J U1NJT05TCj4gKyAqIEBlbmNsOsKgwqDCoMKgwqDCoGFuIGVuY2xhdmUgcG9pbnRlcgo+ICsgKiBA YXJnOsKgwqDCoMKgwqDCoMKgdXNlcnNwYWNlIHBvaW50ZXIgdG8gYSAmc3RydWN0IHNneF9lbmNs YXZlX3Jlc3RyaWN0X3Blcm1pc3Npb25zCj4gKyAqwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBp bnN0YW5jZQo+ICsgKgo+ICsgKiBTR1gyIGRpc3Rpbmd1aXNoZXMgYmV0d2VlbiByZWxheGluZyBh bmQgcmVzdHJpY3RpbmcgdGhlIGVuY2xhdmUgcGFnZQo+ICsgKiBwZXJtaXNzaW9ucyBtYWludGFp bmVkIGJ5IHRoZSBoYXJkd2FyZSAoRVBDTSBwZXJtaXNzaW9ucykgb2YgcGFnZXMKPiArICogYmVs b25naW5nIHRvIGFuIGluaXRpYWxpemVkIGVuY2xhdmUgKGFmdGVyIFNHWF9JT0NfRU5DTEFWRV9J TklUKS4KPiArICoKPiArICogRVBDTSBwZXJtaXNzaW9ucyBjYW5ub3QgYmUgcmVzdHJpY3RlZCBm cm9tIHdpdGhpbiB0aGUgZW5jbGF2ZSwgdGhlIGVuY2xhdmUKPiArICogcmVxdWlyZXMgdGhlIGtl cm5lbCB0byBydW4gdGhlIHByaXZpbGVnZWQgbGV2ZWwgMCBpbnN0cnVjdGlvbnMgRU5DTFNbRU1P RFBSXQo+ICsgKiBhbmQgRU5DTFNbRVRSQUNLXS4gQW4gYXR0ZW1wdCB0byByZWxheCBFUENNIHBl cm1pc3Npb25zIHdpdGggdGhpcyBjYWxsCj4gKyAqIHdpbGwgYmUgaWdub3JlZCBieSB0aGUgaGFy ZHdhcmUuCj4gKyAqCj4gKyAqIFJldHVybjoKPiArICogLSAwOsKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgU3VjY2Vzcwo+ICsgKiAtIC1lcnJubzrCoMKgwqBPdGhlcndpc2UKPiArICov Cj4gK3N0YXRpYyBsb25nIHNneF9pb2NfZW5jbGF2ZV9yZXN0cmljdF9wZXJtaXNzaW9ucyhzdHJ1 Y3Qgc2d4X2VuY2wgKmVuY2wsCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqAgdm9pZCBfX3VzZXIgKmFyZykKPiArewo+ICvCoMKgwqDCoMKgwqDCoHN0cnVjdCBzZ3hfZW5j bGF2ZV9yZXN0cmljdF9wZXJtaXNzaW9ucyBwYXJhbXM7Cj4gK8KgwqDCoMKgwqDCoMKgdTY0IHNl Y2luZm9fcGVybTsKPiArwqDCoMKgwqDCoMKgwqBsb25nIHJldDsKPiArCj4gK8KgwqDCoMKgwqDC oMKgcmV0ID0gc2d4X2lvY19zZ3gyX3JlYWR5KGVuY2wpOwo+ICvCoMKgwqDCoMKgwqDCoGlmIChy ZXQpCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoHJldHVybiByZXQ7Cj4gKwo+ICvC oMKgwqDCoMKgwqDCoGlmIChjb3B5X2Zyb21fdXNlcigmcGFyYW1zLCBhcmcsIHNpemVvZihwYXJh bXMpKSkKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgcmV0dXJuIC1FRkFVTFQ7Cj4g Kwo+ICvCoMKgwqDCoMKgwqDCoGlmIChzZ3hfdmFsaWRhdGVfb2Zmc2V0X2xlbmd0aChlbmNsLCBw YXJhbXMub2Zmc2V0LCBwYXJhbXMubGVuZ3RoKSkKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgcmV0dXJuIC1FSU5WQUw7Cj4gKwo+ICvCoMKgwqDCoMKgwqDCoHJldCA9IHNneF9wZXJt X2Zyb21fdXNlcl9zZWNpbmZvKCh2b2lkIF9fdXNlciAqKXBhcmFtcy5zZWNpbmZvLAo+ICvCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqAgJnNlY2luZm9fcGVybSk7Cj4gK8KgwqDCoMKgwqDCoMKgaWYgKHJl dCkKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgcmV0dXJuIHJldDsKPiArCj4gK8Kg wqDCoMKgwqDCoMKgaWYgKHBhcmFtcy5yZXN1bHQgfHwgcGFyYW1zLmNvdW50KQo+ICvCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqByZXR1cm4gLUVJTlZBTDsKPiArCj4gK8KgwqDCoMKgwqDC oMKgcmV0ID0gc2d4X2VuY2xhdmVfcmVzdHJpY3RfcGVybWlzc2lvbnMoZW5jbCwgJnBhcmFtcywg c2VjaW5mb19wZXJtKTsKPiArCj4gK8KgwqDCoMKgwqDCoMKgaWYgKGNvcHlfdG9fdXNlcihhcmcs ICZwYXJhbXMsIHNpemVvZihwYXJhbXMpKSkKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgcmV0dXJuIC1FRkFVTFQ7Cj4gKwo+ICvCoMKgwqDCoMKgwqDCoHJldHVybiByZXQ7Cj4gK30K PiArCj4gwqBsb25nIHNneF9pb2N0bChzdHJ1Y3QgZmlsZSAqZmlsZXAsIHVuc2lnbmVkIGludCBj bWQsIHVuc2lnbmVkIGxvbmcgYXJnKQo+IMKgewo+IMKgwqDCoMKgwqDCoMKgwqBzdHJ1Y3Qgc2d4 X2VuY2wgKmVuY2wgPSBmaWxlcC0+cHJpdmF0ZV9kYXRhOwo+IEBAIC02ODEsNiArOTE5LDEwIEBA IGxvbmcgc2d4X2lvY3RsKHN0cnVjdCBmaWxlICpmaWxlcCwgdW5zaWduZWQgaW50IGNtZCwgdW5z aWduZWQgbG9uZyBhcmcpCj4gwqDCoMKgwqDCoMKgwqDCoGNhc2UgU0dYX0lPQ19FTkNMQVZFX1BS T1ZJU0lPTjoKPiDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoHJldCA9IHNneF9pb2Nf ZW5jbGF2ZV9wcm92aXNpb24oZW5jbCwgKHZvaWQgX191c2VyICopYXJnKTsKPiDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoGJyZWFrOwo+ICvCoMKgwqDCoMKgwqDCoGNhc2UgU0dYX0lP Q19FTkNMQVZFX1JFU1RSSUNUX1BFUk1JU1NJT05TOgo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqByZXQgPSBzZ3hfaW9jX2VuY2xhdmVfcmVzdHJpY3RfcGVybWlzc2lvbnMoZW5jbCwK PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgICh2b2lkIF9fdXNlciAqKWFyZyk7Cj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oGJyZWFrOwo+IMKgwqDCoMKgwqDCoMKgwqBkZWZhdWx0Ogo+IMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgcmV0ID0gLUVOT0lPQ1RMQ01EOwo+IMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgYnJlYWs7CgpJIHRoaW5rIHRoaXMgYSBiaWcgaW1wcm92ZW1lbnQgYWxsIHRoaW5n cyBjb25zaWRlcmVkLiBJIGp1c3QgcHV0wqAKYSBrZXJuZWwgYnVpbGRpbmcgYW5kIHNlZSBpZiBJ IGdldCB0aGlzIHdpcmVkIHRvIG91ciBjb2RlOgoKaHR0cHM6Ly9naXRodWIuY29tL2phcmtrb2pz L2F1ci1saW51eC1zZ3gvYWN0aW9ucy9ydW5zLzIwOTQwODQ5NDMKCkknbGwgcmVwb3J0IG15IGZp bmRpbmdzIGxhdGVyIG9uLgoKQlIsIEphcmtrbwo=