Received: by 2002:a05:6a10:2726:0:0:0:0 with SMTP id ib38csp771651pxb; Tue, 5 Apr 2022 22:39:01 -0700 (PDT) X-Google-Smtp-Source: ABdhPJyh2jDnjT6QFUSovJbZEpb4LGMCgmBkuLBm8eIkhyncO2iDZD195LKZ41hfrZMjyti5SsNv X-Received: by 2002:a17:90b:3a8a:b0:1c6:47fe:c9b0 with SMTP id om10-20020a17090b3a8a00b001c647fec9b0mr8009853pjb.151.1649223541242; Tue, 05 Apr 2022 22:39:01 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1649223541; cv=none; d=google.com; s=arc-20160816; b=xB4F0HHHRRTHPbpdGAaLtDToiDqnoCnaWSNxuW2wlXI940sC5OGLDCzlGAZmRoIwCa T9z7tlp9lmUizwAwSORUbzVkMN+r08DxdVNWma0gAQ48nros5xBDnTZrlqxxtdQUmlAZ aHoMHrLLD/zs3jxcx1ZHDh2FAHgFlzpoTIGdhZLFy8xWVR99/hh5umrYMU7oSneK/B/i UysUcEisCaM39WrpgtWAZyj8uH1Ke3hGyYgPRMoFLMQ6V1OuGH4zScQOsf0YcWqKL7W7 rr9po5NFF5PmD2Q0MX/TOzN9DhdX1tYR722B5mL+yWzc1r2upqss081pHFkgJve9lFSm HKVA== 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=ffE1LZly5w6gMkgddlQv2dB32xtZwVKzuDblHKnLSsY=; b=k7YKn7xV7b7G2OJ3D92xMkb5LRfW1QrMB/es9wO+ewCqQYtYFxWmwKVQkhUz1cmZ0a ALpEuUC1XmLR644HcWZGv8N7FgZ1VYlyyCWXPGawXEzhv8GPJKS9Mgpr0jRHSrswAlUI URHJ0o3lE9Yp597SHGuxh65mhGXAj3DhYUNqDRgl3+dtOQJ77kNUy1aCGMQCXtcypUGg ObKXL+i+UnZNcqHlX9MdzI1Ks+mme5xwHYlHaiu43Lu8jFeRLQRBu6LaZ8NYxh6OHtey /1KyWdwT2yBzrlg+nIz8DgHUZXsG+1dBI99jZP40KH4AT4n6DZ9wXhO01cOtYA2Zh6DS Ih1w== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=k20201202 header.b=XyjysOjv; spf=softfail (google.com: domain of transitioning linux-kernel-owner@vger.kernel.org does not designate 23.128.96.19 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 lindbergh.monkeyblade.net (lindbergh.monkeyblade.net. [23.128.96.19]) by mx.google.com with ESMTPS id f10-20020a170902ff0a00b00153b2d165bfsi13933162plj.455.2022.04.05.22.39.00 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 05 Apr 2022 22:39:01 -0700 (PDT) Received-SPF: softfail (google.com: domain of transitioning linux-kernel-owner@vger.kernel.org does not designate 23.128.96.19 as permitted sender) client-ip=23.128.96.19; Authentication-Results: mx.google.com; dkim=pass header.i=@kernel.org header.s=k20201202 header.b=XyjysOjv; spf=softfail (google.com: domain of transitioning linux-kernel-owner@vger.kernel.org does not designate 23.128.96.19 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by lindbergh.monkeyblade.net (Postfix) with ESMTP id 34037ED916; Tue, 5 Apr 2022 21:36:51 -0700 (PDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S233577AbiDEWtd (ORCPT + 99 others); Tue, 5 Apr 2022 18:49:33 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:49108 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1448336AbiDEPsF (ORCPT ); Tue, 5 Apr 2022 11:48:05 -0400 Received: from sin.source.kernel.org (sin.source.kernel.org [IPv6:2604:1380:40e1:4800::1]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 465671A634A; Tue, 5 Apr 2022 07:26:43 -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 sin.source.kernel.org (Postfix) with ESMTPS id D2E2BCE1E53; Tue, 5 Apr 2022 14:26:41 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id 9EDF1C385A1; Tue, 5 Apr 2022 14:26:39 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1649168800; bh=ffE1LZly5w6gMkgddlQv2dB32xtZwVKzuDblHKnLSsY=; h=Subject:From:To:Cc:Date:In-Reply-To:References:From; b=XyjysOjvHj0Q/n+8Cu3CrqGykBhGkAeehzaaqiniFTfvt6uDlX5//L7zfCjFMoUqr pzvz/dyYDZhsBFJrJiw4z7s2pKg+jiYUAgkIXYSdexFFAF64MRpkMMeCdVyrFV5Bzf YrQ4lvB0XPnVrI6ZgSmtYnWp6rAi7Lz+TaISJ+PI5EWFC9XsQPm5LG4Qpl88dyYDw0 YNd3QPl/mA+3XS0Uy9U64dhjcDCr+1DBkSVvgXMyAg5WKOYTWtm/F9BiHYYfX2Gx0r BG+IoC5PcBF/1UFBkzYnRfWIju6kd1t4Y7IwgZEcP3yLKbQ/aaNlpn+ExCGynNFhmf omXtqKu67WFZw== Message-ID: <6e0feeadc562b9e3f0a524040469d4f5c3484824.camel@kernel.org> 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, nathaniel@profian.com Date: Tue, 05 Apr 2022 17:27:50 +0300 In-Reply-To: <10303ca73ea02a300636580e87446766374f66cb.camel@kernel.org> References: <8ed9ee98ca26c9eefde0fd49062bca6e7b9efe80.1648847675.git.reinette.chatre@intel.com> <26ab773de8842d03b40caf8645ca86884b195901.camel@kernel.org> <91a02d50b2cba34dfb058fd864ba20ef1e6a5554.camel@kernel.org> <10303ca73ea02a300636580e87446766374f66cb.camel@kernel.org> 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=-2.3 required=5.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,MAILING_LIST_MULTI, RDNS_NONE,SPF_HELO_NONE,T_SCC_BODY_TEXT_LINE autolearn=unavailable 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 T24gVHVlLCAyMDIyLTA0LTA1IGF0IDE3OjE5ICswMzAwLCBKYXJra28gU2Fra2luZW4gd3JvdGU6 Cj4gT24gVHVlLCAyMDIyLTA0LTA1IGF0IDE2OjQwICswMzAwLCBKYXJra28gU2Fra2luZW4gd3Jv dGU6Cj4gPiBPbiBUdWUsIDIwMjItMDQtMDUgYXQgMDg6MDcgKzAzMDAsIEphcmtrbyBTYWtraW5l biB3cm90ZToKPiA+ID4gT24gVHVlLCAyMDIyLTA0LTA1IGF0IDA4OjAzICswMzAwLCBKYXJra28g U2Fra2luZW4gd3JvdGU6Cj4gPiA+ID4gT24gTW9uLCAyMDIyLTA0LTA0IGF0IDA5OjQ5IC0wNzAw LCBSZWluZXR0ZSBDaGF0cmUgd3JvdGU6Cj4gPiA+ID4gPiBJbiB0aGUgaW5pdGlhbCAoU0dYMSkg dmVyc2lvbiBvZiBTR1gsIHBhZ2VzIGluIGFuIGVuY2xhdmUgbmVlZCB0byBiZQo+ID4gPiA+ID4g Y3JlYXRlZCB3aXRoIHBlcm1pc3Npb25zIHRoYXQgc3VwcG9ydCBhbGwgdXNhZ2VzIG9mIHRoZSBw YWdlcywgZnJvbSB0aGUKPiA+ID4gPiA+IHRpbWUgdGhlIGVuY2xhdmUgaXMgaW5pdGlhbGl6ZWQg dW50aWwgaXQgaXMgdW5sb2FkZWQuIEZvciBleGFtcGxlLAo+ID4gPiA+ID4gcGFnZXMgdXNlZCBi eSBhIEpJVCBjb21waWxlciBvciB3aGVuIGNvZGUgbmVlZHMgdG8gb3RoZXJ3aXNlIGJlCj4gPiA+ ID4gPiByZWxvY2F0ZWQgbmVlZCB0byBhbHdheXMgaGF2ZSBSV1ggcGVybWlzc2lvbnMuCj4gPiA+ ID4gPiAKPiA+ID4gPiA+IFNHWDIgaW5jbHVkZXMgYSBuZXcgZnVuY3Rpb24gRU5DTFNbRU1PRFBS XSB0aGF0IGlzIHJ1biBmcm9tIHRoZSBrZXJuZWwKPiA+ID4gPiA+IGFuZCBjYW4gYmUgdXNlZCB0 byByZXN0cmljdCB0aGUgRVBDTSBwZXJtaXNzaW9ucyBvZiByZWd1bGFyIGVuY2xhdmUKPiA+ID4g PiA+IHBhZ2VzIHdpdGhpbiBhbiBpbml0aWFsaXplZCBlbmNsYXZlLgo+ID4gPiA+ID4gCj4gPiA+ ID4gPiBJbnRyb2R1Y2UgaW9jdGwoKSBTR1hfSU9DX0VOQ0xBVkVfUkVTVFJJQ1RfUEVSTUlTU0lP TlMgdG8gc3VwcG9ydAo+ID4gPiA+ID4gcmVzdHJpY3RpbmcgRVBDTSBwZXJtaXNzaW9ucy4gV2l0 aCB0aGlzIGlvY3RsKCkgdGhlIHVzZXIgc3BlY2lmaWVzCj4gPiA+ID4gPiBhIHBhZ2UgcmFuZ2Ug YW5kIHRoZSBFUENNIHBlcm1pc3Npb25zIHRvIGJlIGFwcGxpZWQgdG8gYWxsIHBhZ2VzIGluCj4g PiA+ID4gPiB0aGUgcHJvdmlkZWQgcmFuZ2UuIEVOQ0xTW0VNT0RQUl0gaXMgcnVuIHRvIHJlc3Ry aWN0IHRoZSBFUENNCj4gPiA+ID4gPiBwZXJtaXNzaW9ucyBmb2xsb3dlZCBieSB0aGUgRU5DTFNb RVRSQUNLXSBmbG93IHRoYXQgd2lsbCBlbnN1cmUKPiA+ID4gPiA+IG5vIGNhY2hlZCBsaW5lYXIt dG8tcGh5c2ljYWwgYWRkcmVzcyBtYXBwaW5ncyB0byB0aGUgY2hhbmdlZAo+ID4gPiA+ID4gcGFn ZXMgcmVtYWluLgo+ID4gPiA+ID4gCj4gPiA+ID4gPiBJdCBpcyBwb3NzaWJsZSBmb3IgdGhlIHBl cm1pc3Npb24gY2hhbmdlIHJlcXVlc3QgdG8gZmFpbCBvbiBhbnkKPiA+ID4gPiA+IHBhZ2Ugd2l0 aGluIHRoZSBwcm92aWRlZCByYW5nZSwgZWl0aGVyIHdpdGggYW4gZXJyb3IgZW5jb3VudGVyZWQK PiA+ID4gPiA+IGJ5IHRoZSBrZXJuZWwgb3IgYnkgdGhlIFNHWCBoYXJkd2FyZSB3aGlsZSBydW5u aW5nCj4gPiA+ID4gPiBFTkNMU1tFTU9EUFJdLiBUbyBzdXBwb3J0IHBhcnRpYWwgc3VjY2VzcyB0 aGUgaW9jdGwoKSByZXR1cm5zIGFuCj4gPiA+ID4gPiBlcnJvciBjb2RlIGJhc2VkIG9uIGZhaWx1 cmVzIGVuY291bnRlcmVkIGJ5IHRoZSBrZXJuZWwgYXMgd2VsbAo+ID4gPiA+ID4gYXMgdHdvIHJl c3VsdCBvdXRwdXQgcGFyYW1ldGVyczogb25lIGZvciB0aGUgbnVtYmVyIG9mIHBhZ2VzCj4gPiA+ ID4gPiB0aGF0IHdlcmUgc3VjY2Vzc2Z1bGx5IGNoYW5nZWQgYW5kIG9uZSBmb3IgdGhlIFNHWCBy ZXR1cm4gY29kZS4KPiA+ID4gPiA+IAo+ID4gPiA+ID4gVGhlIHBhZ2UgdGFibGUgZW50cnkgcGVy bWlzc2lvbnMgYXJlIG5vdCBpbXBhY3RlZCBieSB0aGUgRVBDTQo+ID4gPiA+ID4gcGVybWlzc2lv biBjaGFuZ2VzLiBWTUFzIGFuZCBQVEVzIHdpbGwgY29udGludWUgdG8gYWxsb3cgdGhlCj4gPiA+ ID4gPiBtYXhpbXVtIHZldHRlZCBwZXJtaXNzaW9ucyBkZXRlcm1pbmVkIGF0IHRoZSB0aW1lIHRo ZSBwYWdlcwo+ID4gPiA+ID4gYXJlIGFkZGVkIHRvIHRoZSBlbmNsYXZlLiBUaGUgU0dYIGVycm9y IGNvZGUgaW4gYSBwYWdlIGZhdWx0Cj4gPiA+ID4gPiB3aWxsIGluZGljYXRlIGlmIGl0IHdhcyBh biBFUENNIHBlcm1pc3Npb24gY2hlY2sgdGhhdCBwcmV2ZW50ZWQKPiA+ID4gPiA+IGFuIGFjY2Vz cyBhdHRlbXB0Lgo+ID4gPiA+ID4gCj4gPiA+ID4gPiBObyBjaGVja2luZyBpcyBkb25lIHRvIGVu c3VyZSB0aGF0IHRoZSBwZXJtaXNzaW9ucyBhcmUgYWN0dWFsbHkKPiA+ID4gPiA+IGJlaW5nIHJl c3RyaWN0ZWQuIFRoaXMgaXMgYmVjYXVzZSB0aGUgZW5jbGF2ZSBtYXkgaGF2ZSByZWxheGVkCj4g PiA+ID4gPiB0aGUgRVBDTSBwZXJtaXNzaW9ucyBmcm9tIHdpdGhpbiB0aGUgZW5jbGF2ZSB3aXRo b3V0IGxldHRpbmcgdGhlCj4gPiA+ID4gPiBrZXJuZWwga25vdy4gQW4gYXR0ZW1wdCB0byByZWxh eCBwZXJtaXNzaW9ucyB1c2luZyB0aGlzIGNhbGwgd2lsbAo+ID4gPiA+ID4gYmUgaWdub3JlZCBi eSB0aGUgaGFyZHdhcmUuCj4gPiA+ID4gPiAKPiA+ID4gPiA+IFNpZ25lZC1vZmYtYnk6IFJlaW5l dHRlIENoYXRyZSA8cmVpbmV0dGUuY2hhdHJlQGludGVsLmNvbT4KPiA+ID4gPiA+IC0tLQo+ID4g PiA+ID4gQ2hhbmdlcyBzaW5jZSBWMjoKPiA+ID4gPiA+IC0gSW5jbHVkZSB0aGUgc2d4X2lvY19z Z3gyX3JlYWR5KCkgdXRpbGl0eQo+ID4gPiA+ID4gwqAgdGhhdCBwcmV2aW91c2x5IHdhcyBpbiAi eDg2L3NneDogU3VwcG9ydCByZWxheGluZyBvZiBlbmNsYXZlIHBhZ2UKPiA+ID4gPiA+IMKgIHBl cm1pc3Npb25zIiB0aGF0IGlzIHJlbW92ZWQgZnJvbSB0aGUgbmV4dCB2ZXJzaW9uLgo+ID4gPiA+ ID4gLSBGZXcgcmVuYW1lcyByZXF1ZXN0ZWQgYnkgSmFya2tvOgo+ID4gPiA+ID4gwqAgc3RydWN0 IHNneF9lbmNsYXZlX3Jlc3RyaWN0X3Blcm0gLT4KPiA+ID4gPiA+IMKgwqDCoMKgwqDCoMKgwqAg c3RydWN0IHNneF9lbmNsYXZlX3Jlc3RyaWN0X3Blcm1pc3Npb25zCj4gPiA+ID4gPiDCoCBzZ3hf ZW5jbGF2ZV9yZXN0cmljdF9wZXJtKCnCoMKgwqDCoCAtPgo+ID4gPiA+ID4gwqDCoMKgwqDCoMKg wqDCoCBzZ3hfZW5jbGF2ZV9yZXN0cmljdF9wZXJtaXNzaW9ucygpCj4gPiA+ID4gPiDCoCBzZ3hf aW9jX2VuY2xhdmVfcmVzdHJpY3RfcGVybSgpIC0+Cj4gPiA+ID4gPiDCoMKgwqDCoMKgwqDCoMKg IHNneF9pb2NfZW5jbGF2ZV9yZXN0cmljdF9wZXJtaXNzaW9ucygpCj4gPiA+ID4gPiAtIE1ha2Ug RVBDTSBwZXJtaXNzaW9ucyBpbmRlcGVuZGVudCBmcm9tIGtlcm5lbCB2aWV3IG9mCj4gPiA+ID4g PiDCoCBwZXJtaXNzaW9ucy7CoCAoSmFya2tvKQo+ID4gPiA+ID4gwqAgLSBSZW1vdmUgYXR0ZW1w dCBhdCBydW50aW1lIHRyYWNraW5nIG9mIEVQQ00gcGVybWlzc2lvbnMKPiA+ID4gPiA+IMKgwqDC oCAoc2d4X2VuY2xfcGFnZS0+dm1fcnVuX3Byb3RfYml0cykuCj4gPiA+ID4gPiDCoCAtIERvIG5v dCBmbHVzaCBwYWdlIHRhYmxlIGVudHJpZXMgLSB0aGV5IGFyZSBubyBsb25nZXIgaW1wYWN0ZWQg YnkKPiA+ID4gPiA+IMKgwqDCoCBFUENNIHBlcm1pc3Npb24gY2hhbmdlcy4KPiA+ID4gPiA+IMKg IC0gTW9kaWZ5IGNoYW5nZWxvZyB0byByZWZsZWN0IG5ldyBhcmNoaXRlY3R1cmUuCj4gPiA+ID4g PiAtIEVuc3VyZSBhdCBsZWFzdCBQUk9UX1JFQUQgaXMgcmVxdWVzdGVkIC0gZW5jbGF2ZSByZXF1 aXJlcyByZWFkCj4gPiA+ID4gPiDCoCBhY2Nlc3MgdG8gdGhlIHBhZ2UgZm9yIGNvbW1hbmRzIGxp a2UgRU1PRFBFIGFuZCBFQUNDRVBULiAoSmFya2tvKQo+ID4gPiA+ID4gCj4gPiA+ID4gPiBDaGFu Z2VzIHNpbmNlIFYxOgo+ID4gPiA+ID4gLSBDaGFuZ2UgdGVybWlub2xvZ3kgdG8gdXNlICJyZWxh eCIgaW5zdGVhZCBvZiAiZXh0ZW5kIiB0byByZWZlciB0bwo+ID4gPiA+ID4gwqAgdGhlIGNhc2Ug d2hlbiBlbmNsYXZlIHBhZ2UgcGVybWlzc2lvbnMgYXJlIGFkZGVkIChEYXZlKS4KPiA+ID4gPiA+ IC0gVXNlIGlvY3RsKCkgaW4gY29tbWl0IG1lc3NhZ2UgKERhdmUpLgo+ID4gPiA+ID4gLSBBZGQg ZXhhbXBsZXMgb24gd2hhdCBwZXJtaXNzaW9ucyB3b3VsZCBiZSBhbGxvd2VkIChEYXZlKS4KPiA+ ID4gPiA+IC0gU3BsaXQgZW5jbGF2ZSBwYWdlIHBlcm1pc3Npb24gY2hhbmdlcyBpbnRvIHR3byBp b2N0bCgpcywgb25lIGZvcgo+ID4gPiA+ID4gwqAgcGVybWlzc2lvbiByZXN0cmljdGluZyAoU0dY X0lPQ19FTkNMQVZFX1JFU1RSSUNUX1BFUk1JU1NJT05TKQo+ID4gPiA+ID4gwqAgYW5kIG9uZSBm b3IgcGVybWlzc2lvbiByZWxheGluZyAoU0dYX0lPQ19FTkNMQVZFX1JFTEFYX1BFUk1JU1NJT05T KQo+ID4gPiA+ID4gwqAgKEphcmtrbykuCj4gPiA+ID4gPiAtIEluIHN1cHBvcnQgb2YgdGhlIGlv Y3RsKCkgbmFtZSBjaGFuZ2UgdGhlIGZvbGxvd2luZyBuYW1lcyBoYXZlIGJlZW4KPiA+ID4gPiA+ IMKgIGNoYW5nZWQ6Cj4gPiA+ID4gPiDCoCBzdHJ1Y3Qgc2d4X3BhZ2VfbW9kcCAtPiBzdHJ1Y3Qg c2d4X2VuY2xhdmVfcmVzdHJpY3RfcGVybQo+ID4gPiA+ID4gwqAgc2d4X2lvY19wYWdlX21vZHAo KSAtPiBzZ3hfaW9jX2VuY2xhdmVfcmVzdHJpY3RfcGVybSgpCj4gPiA+ID4gPiDCoCBzZ3hfcGFn ZV9tb2RwKCkgLT4gc2d4X2VuY2xhdmVfcmVzdHJpY3RfcGVybSgpCj4gPiA+ID4gPiAtIGlvY3Rs KCkgdGFrZXMgZW50aXJlIHNlY2luZm8gYXMgaW5wdXQgaW5zdGVhZCBvZgo+ID4gPiA+ID4gwqAg cGFnZSBwZXJtaXNzaW9ucyBvbmx5IChKYXJra28pLgo+ID4gPiA+ID4gLSBGaXgga2VybmVsLWRv YyB0byBpbmNsdWRlICgpIGluIGZ1bmN0aW9uIG5hbWUuCj4gPiA+ID4gPiAtIENyZWF0ZSBhbmQg dXNlIHV0aWxpdHkgZm9yIHRoZSBFVFJBQ0sgZmxvdy4KPiA+ID4gPiA+IC0gRml4dXBzIGluIGNv bW1lbnRzCj4gPiA+ID4gPiAtIE1vdmUga2VybmVsLWRvYyB0byBmdW5jdGlvbiB0aGF0IHByb3Zp ZGVzIGRvY3VtZW50YXRpb24gZm9yCj4gPiA+ID4gPiDCoCBEb2N1bWVudGF0aW9uL3g4Ni9zZ3gu cnN0Lgo+ID4gPiA+ID4gLSBSZW1vdmUgcmVkdW5kYW50IGNvbW1lbnQuCj4gPiA+ID4gPiAtIE1h a2UgZXhwbGljaXQgd2hpY2ggbWVtYmVycyBvZiBzdHJ1Y3Qgc2d4X2VuY2xhdmVfcmVzdHJpY3Rf cGVybQo+ID4gPiA+ID4gwqAgYXJlIGZvciBvdXRwdXQgKERhdmUpLgo+ID4gPiA+ID4gCj4gPiA+ ID4gPiDCoGFyY2gveDg2L2luY2x1ZGUvdWFwaS9hc20vc2d4LmggfMKgIDIxICsrKwo+ID4gPiA+ ID4gwqBhcmNoL3g4Ni9rZXJuZWwvY3B1L3NneC9pb2N0bC5jIHwgMjQyICsrKysrKysrKysrKysr KysrKysrKysrKysrKysrKysrCj4gPiA+ID4gPiDCoDIgZmlsZXMgY2hhbmdlZCwgMjYzIGluc2Vy dGlvbnMoKykKPiA+ID4gPiA+IAo+ID4gPiA+ID4gZGlmZiAtLWdpdCBhL2FyY2gveDg2L2luY2x1 ZGUvdWFwaS9hc20vc2d4LmggYi9hcmNoL3g4Ni9pbmNsdWRlL3VhcGkvYXNtL3NneC5oCj4gPiA+ ID4gPiBpbmRleCBmNGI4MTU4N2U5MGIuLmEwYTI0ZTk0ZmIyNyAxMDA2NDQKPiA+ID4gPiA+IC0t LSBhL2FyY2gveDg2L2luY2x1ZGUvdWFwaS9hc20vc2d4LmgKPiA+ID4gPiA+ICsrKyBiL2FyY2gv eDg2L2luY2x1ZGUvdWFwaS9hc20vc2d4LmgKPiA+ID4gPiA+IEBAIC0yOSw2ICsyOSw4IEBAIGVu dW0gc2d4X3BhZ2VfZmxhZ3Mgewo+ID4gPiA+ID4gwqDCoMKgwqDCoMKgwqDCoF9JT1coU0dYX01B R0lDLCAweDAzLCBzdHJ1Y3Qgc2d4X2VuY2xhdmVfcHJvdmlzaW9uKQo+ID4gPiA+ID4gwqAjZGVm aW5lIFNHWF9JT0NfVkVQQ19SRU1PVkVfQUxMIFwKPiA+ID4gPiA+IMKgwqDCoMKgwqDCoMKgwqBf SU8oU0dYX01BR0lDLCAweDA0KQo+ID4gPiA+ID4gKyNkZWZpbmUgU0dYX0lPQ19FTkNMQVZFX1JF U1RSSUNUX1BFUk1JU1NJT05TIFwKPiA+ID4gPiA+ICvCoMKgwqDCoMKgwqDCoF9JT1dSKFNHWF9N QUdJQywgMHgwNSwgc3RydWN0IHNneF9lbmNsYXZlX3Jlc3RyaWN0X3Blcm1pc3Npb25zKQo+ID4g PiA+ID4gwqAKPiA+ID4gPiA+IMKgLyoqCj4gPiA+ID4gPiDCoCAqIHN0cnVjdCBzZ3hfZW5jbGF2 ZV9jcmVhdGUgLSBwYXJhbWV0ZXIgc3RydWN0dXJlIGZvciB0aGUKPiA+ID4gPiA+IEBAIC03Niw2 ICs3OCwyNSBAQCBzdHJ1Y3Qgc2d4X2VuY2xhdmVfcHJvdmlzaW9uIHsKPiA+ID4gPiA+IMKgwqDC oMKgwqDCoMKgwqBfX3U2NCBmZDsKPiA+ID4gPiA+IMKgfTsKPiA+ID4gPiA+IMKgCj4gPiA+ID4g PiArLyoqCj4gPiA+ID4gPiArICogc3RydWN0IHNneF9lbmNsYXZlX3Jlc3RyaWN0X3Blcm1pc3Np b25zIC0gcGFyYW1ldGVycyBmb3IgaW9jdGwKPiA+ID4gPiA+ICsgKsKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoCAlU0dYX0lPQ19FTkNMQVZFX1JFU1RSSUNUX1BFUk1JU1NJT05TCj4gPiA+ID4gPiArICog QG9mZnNldDrCoMKgwqDCoHN0YXJ0aW5nIHBhZ2Ugb2Zmc2V0IChwYWdlIGFsaWduZWQgcmVsYXRp dmUgdG8gZW5jbGF2ZSBiYXNlCj4gPiA+ID4gPiArICrCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oGFkZHJlc3MgZGVmaW5lZCBpbiBTRUNTKQo+ID4gPiA+ID4gKyAqIEBsZW5ndGg6wqDCoMKgwqBs ZW5ndGggb2YgbWVtb3J5IChtdWx0aXBsZSBvZiB0aGUgcGFnZSBzaXplKQo+ID4gPiA+ID4gKyAq IEBzZWNpbmZvOsKgwqDCoGFkZHJlc3MgZm9yIHRoZSBTRUNJTkZPIGRhdGEgY29udGFpbmluZyB0 aGUgbmV3IHBlcm1pc3Npb24gYml0cwo+ID4gPiA+ID4gKyAqwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqBmb3IgcGFnZXMgaW4gcmFuZ2UgZGVzY3JpYmVkIGJ5IEBvZmZzZXQgYW5kIEBsZW5ndGgK PiA+ID4gPiA+ICsgKiBAcmVzdWx0OsKgwqDCoMKgKG91dHB1dCkgU0dYIHJlc3VsdCBjb2RlIG9m IEVOQ0xTW0VNT0RQUl0gZnVuY3Rpb24KPiA+ID4gPiA+ICsgKiBAY291bnQ6wqDCoMKgwqDCoChv dXRwdXQpIGJ5dGVzIHN1Y2Nlc3NmdWxseSBjaGFuZ2VkIChtdWx0aXBsZSBvZiBwYWdlIHNpemUp Cj4gPiA+ID4gPiArICovCj4gPiA+ID4gPiArc3RydWN0IHNneF9lbmNsYXZlX3Jlc3RyaWN0X3Bl cm1pc3Npb25zIHsKPiA+ID4gPiA+ICvCoMKgwqDCoMKgwqDCoF9fdTY0IG9mZnNldDsKPiA+ID4g PiA+ICvCoMKgwqDCoMKgwqDCoF9fdTY0IGxlbmd0aDsKPiA+ID4gPiA+ICvCoMKgwqDCoMKgwqDC oF9fdTY0IHNlY2luZm87Cj4gPiA+ID4gPiArwqDCoMKgwqDCoMKgwqBfX3U2NCByZXN1bHQ7Cj4g PiA+ID4gPiArwqDCoMKgwqDCoMKgwqBfX3U2NCBjb3VudDsKPiA+ID4gPiA+ICt9Owo+ID4gPiA+ ID4gKwo+ID4gPiA+ID4gwqBzdHJ1Y3Qgc2d4X2VuY2xhdmVfcnVuOwo+ID4gPiA+ID4gwqAKPiA+ ID4gPiA+IMKgLyoqCj4gPiA+ID4gPiBkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL2NwdS9z Z3gvaW9jdGwuYyBiL2FyY2gveDg2L2tlcm5lbC9jcHUvc2d4L2lvY3RsLmMKPiA+ID4gPiA+IGlu ZGV4IDA0NjBmZDIyNGEwNS4uNGQ4OGJmZDE2M2U3IDEwMDY0NAo+ID4gPiA+ID4gLS0tIGEvYXJj aC94ODYva2VybmVsL2NwdS9zZ3gvaW9jdGwuYwo+ID4gPiA+ID4gKysrIGIvYXJjaC94ODYva2Vy bmVsL2NwdS9zZ3gvaW9jdGwuYwo+ID4gPiA+ID4gQEAgLTY2MCw2ICs2NjAsMjQ0IEBAIHN0YXRp YyBsb25nIHNneF9pb2NfZW5jbGF2ZV9wcm92aXNpb24oc3RydWN0IHNneF9lbmNsICplbmNsLCB2 b2lkIF9fdXNlciAqYXJnKQo+ID4gPiA+ID4gwqDCoMKgwqDCoMKgwqDCoHJldHVybiBzZ3hfc2V0 X2F0dHJpYnV0ZSgmZW5jbC0+YXR0cmlidXRlc19tYXNrLCBwYXJhbXMuZmQpOwo+ID4gPiA+ID4g wqB9Cj4gPiA+ID4gPiDCoAo+ID4gPiA+ID4gKy8qCj4gPiA+ID4gPiArICogRW5zdXJlIGVuY2xh dmUgaXMgcmVhZHkgZm9yIFNHWDIgZnVuY3Rpb25zLiBSZWFkaW5lc3MgaXMgY2hlY2tlZAo+ID4g PiA+ID4gKyAqIGJ5IGVuc3VyaW5nIHRoZSBoYXJkd2FyZSBzdXBwb3J0cyBTR1gyIGFuZCB0aGUg ZW5jbGF2ZSBpcyBpbml0aWFsaXplZAo+ID4gPiA+ID4gKyAqIGFuZCB0aHVzIGFibGUgdG8gaGFu ZGxlIHJlcXVlc3RzIHRvIG1vZGlmeSBwYWdlcyB3aXRoaW4gaXQuCj4gPiA+ID4gPiArICovCj4g PiA+ID4gPiArc3RhdGljIGludCBzZ3hfaW9jX3NneDJfcmVhZHkoc3RydWN0IHNneF9lbmNsICpl bmNsKQo+ID4gPiA+ID4gK3sKPiA+ID4gPiA+ICvCoMKgwqDCoMKgwqDCoGlmICghKGNwdV9mZWF0 dXJlX2VuYWJsZWQoWDg2X0ZFQVRVUkVfU0dYMikpKQo+ID4gPiA+ID4gK8KgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoHJldHVybiAtRU5PREVWOwo+ID4gPiA+ID4gKwo+ID4gPiA+ID4gK8Kg wqDCoMKgwqDCoMKgaWYgKCF0ZXN0X2JpdChTR1hfRU5DTF9JTklUSUFMSVpFRCwgJmVuY2wtPmZs YWdzKSkKPiA+ID4gPiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqByZXR1cm4gLUVJ TlZBTDsKPiA+ID4gPiA+ICsKPiA+ID4gPiA+ICvCoMKgwqDCoMKgwqDCoHJldHVybiAwOwo+ID4g PiA+ID4gK30KPiA+ID4gPiA+ICsKPiA+ID4gPiA+ICsvKgo+ID4gPiA+ID4gKyAqIFJldHVybiB2 YWxpZCBwZXJtaXNzaW9uIGZpZWxkcyBmcm9tIGEgc2VjaW5mbyBzdHJ1Y3R1cmUgcHJvdmlkZWQg YnkKPiA+ID4gPiA+ICsgKiB1c2VyIHNwYWNlLiBUaGUgc2VjaW5mbyBzdHJ1Y3R1cmUgaXMgcmVx dWlyZWQgdG8gb25seSBoYXZlIGJpdHMgaW4KPiA+ID4gPiA+ICsgKiB0aGUgcGVybWlzc2lvbiBm aWVsZHMgc2V0Lgo+ID4gPiA+ID4gKyAqLwo+ID4gPiA+ID4gK3N0YXRpYyBpbnQgc2d4X3Blcm1f ZnJvbV91c2VyX3NlY2luZm8odm9pZCBfX3VzZXIgKl9zZWNpbmZvLCB1NjQgKnNlY2luZm9fcGVy bSkKPiA+ID4gPiA+ICt7Cj4gPiA+ID4gPiArwqDCoMKgwqDCoMKgwqBzdHJ1Y3Qgc2d4X3NlY2lu Zm8gc2VjaW5mbzsKPiA+ID4gPiA+ICvCoMKgwqDCoMKgwqDCoHU2NCBwZXJtOwo+ID4gPiA+ID4g Kwo+ID4gPiA+ID4gK8KgwqDCoMKgwqDCoMKgaWYgKGNvcHlfZnJvbV91c2VyKCZzZWNpbmZvLCAo dm9pZCBfX3VzZXIgKilfc2VjaW5mbywKPiA+ID4gPiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBzaXplb2Yoc2VjaW5mbykpKQo+ID4gPiA+ID4g K8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoHJldHVybiAtRUZBVUxUOwo+ID4gPiA+ID4g Kwo+ID4gPiA+ID4gK8KgwqDCoMKgwqDCoMKgaWYgKHNlY2luZm8uZmxhZ3MgJiB+U0dYX1NFQ0lO Rk9fUEVSTUlTU0lPTl9NQVNLKQo+ID4gPiA+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoHJldHVybiAtRUlOVkFMOwo+ID4gPiA+ID4gKwo+ID4gPiA+ID4gK8KgwqDCoMKgwqDCoMKg aWYgKG1lbWNocl9pbnYoc2VjaW5mby5yZXNlcnZlZCwgMCwgc2l6ZW9mKHNlY2luZm8ucmVzZXJ2 ZWQpKSkKPiA+ID4gPiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqByZXR1cm4gLUVJ TlZBTDsKPiA+ID4gPiA+ICsKPiA+ID4gPiA+ICvCoMKgwqDCoMKgwqDCoHBlcm0gPSBzZWNpbmZv LmZsYWdzICYgU0dYX1NFQ0lORk9fUEVSTUlTU0lPTl9NQVNLOwo+ID4gPiA+ID4gKwo+ID4gPiA+ ID4gK8KgwqDCoMKgwqDCoMKgLyoKPiA+ID4gPiA+ICvCoMKgwqDCoMKgwqDCoCAqIFJlYWQgYWNj ZXNzIGlzIHJlcXVpcmVkIGZvciB0aGUgZW5jbGF2ZSB0byBiZSBhYmxlIHRvIHVzZSB0aGUgcGFn ZS4KPiA+ID4gPiA+ICvCoMKgwqDCoMKgwqDCoCAqIFNHWCBpbnN0cnVjdGlvbnMgbGlrZSBFTkNM VVtFTU9EUEVdIGFuZCBFTkNMVVtFQUNDRVBUXSByZXF1aXJlCj4gPiA+ID4gPiArwqDCoMKgwqDC oMKgwqAgKiByZWFkIGFjY2Vzcy4KPiA+ID4gPiA+ICvCoMKgwqDCoMKgwqDCoCAqLwo+ID4gPiA+ ID4gK8KgwqDCoMKgwqDCoMKgaWYgKCEocGVybSAmIFNHWF9TRUNJTkZPX1IpKQo+ID4gPiA+ID4g K8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoHJldHVybiAtRUlOVkFMOwo+ID4gPiA+ID4g Kwo+ID4gPiA+ID4gK8KgwqDCoMKgwqDCoMKgKnNlY2luZm9fcGVybSA9IHBlcm07Cj4gPiA+ID4g PiArCj4gPiA+ID4gPiArwqDCoMKgwqDCoMKgwqByZXR1cm4gMDsKPiA+ID4gPiA+ICt9Cj4gPiA+ ID4gPiArCj4gPiA+ID4gPiArLyoKPiA+ID4gPiA+ICsgKiBTb21lIFNHWCBmdW5jdGlvbnMgcmVx dWlyZSB0aGF0IG5vIGNhY2hlZCBsaW5lYXItdG8tcGh5c2ljYWwgYWRkcmVzcwo+ID4gPiA+ID4g KyAqIG1hcHBpbmdzIGFyZSBwcmVzZW50IGJlZm9yZSB0aGV5IGNhbiBzdWNjZWVkLiBDb2xsYWJv cmF0ZSB3aXRoCj4gPiA+ID4gPiArICogaGFyZHdhcmUgdmlhIEVOQ0xTW0VUUkFDS10gdG8gZW5z dXJlIHRoYXQgYWxsIGNhY2hlZAo+ID4gPiA+ID4gKyAqIGxpbmVhci10by1waHlzaWNhbCBhZGRy ZXNzIG1hcHBpbmdzIGJlbG9uZ2luZyB0byBhbGwgdGhyZWFkcyBvZgo+ID4gPiA+ID4gKyAqIHRo ZSBlbmNsYXZlIGFyZSBjbGVhcmVkLiBTZWUgc2d4X2VuY2xfY3B1bWFzaygpIGZvciBkZXRhaWxz Lgo+ID4gPiA+ID4gKyAqLwo+ID4gPiA+ID4gK3N0YXRpYyBpbnQgc2d4X2VuY2xhdmVfZXRyYWNr KHN0cnVjdCBzZ3hfZW5jbCAqZW5jbCkKPiA+ID4gPiA+ICt7Cj4gPiA+ID4gPiArwqDCoMKgwqDC oMKgwqB2b2lkICplcGNfdmlydDsKPiA+ID4gPiA+ICvCoMKgwqDCoMKgwqDCoGludCByZXQ7Cj4g PiA+ID4gPiArCj4gPiA+ID4gPiArwqDCoMKgwqDCoMKgwqBlcGNfdmlydCA9IHNneF9nZXRfZXBj X3ZpcnRfYWRkcihlbmNsLT5zZWNzLmVwY19wYWdlKTsKPiA+ID4gPiA+ICvCoMKgwqDCoMKgwqDC oHJldCA9IF9fZXRyYWNrKGVwY192aXJ0KTsKPiA+ID4gPiA+ICvCoMKgwqDCoMKgwqDCoGlmIChy ZXQpIHsKPiA+ID4gPiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAvKgo+ID4gPiA+ ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCAqIEVUUkFDSyBvbmx5IGZhaWxzIHdo ZW4gdGhlcmUgaXMgYW4gT1MgaXNzdWUuIEZvcgo+ID4gPiA+ID4gK8KgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoCAqIGV4YW1wbGUsIHR3byBjb25zZWN1dGl2ZSBFVFJBQ0sgd2FzIHNlbnQg d2l0aG91dAo+ID4gPiA+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCAqIGNvbXBs ZXRlZCBJUEkgYmV0d2Vlbi4KPiA+ID4gPiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqAgKi8KPiA+ID4gPiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBwcl9lcnJfb25j ZSgiRVRSQUNLIHJldHVybmVkICVkICgweCV4KSIsIHJldCwgcmV0KTsKPiA+ID4gPiA+ICvCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAvKgo+ID4gPiA+ID4gK8KgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoCAqIFNlbmQgSVBJcyB0byBraWNrIENQVXMgb3V0IG9mIHRoZSBlbmNsYXZl IGFuZAo+ID4gPiA+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCAqIHRyeSBFVFJB Q0sgYWdhaW4uCj4gPiA+ID4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgICovCj4g PiA+ID4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgb25fZWFjaF9jcHVfbWFzayhz Z3hfZW5jbF9jcHVtYXNrKGVuY2wpLCBzZ3hfaXBpX2NiLCBOVUxMLCAxKTsKPiA+ID4gPiA+ICvC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqByZXQgPSBfX2V0cmFjayhlcGNfdmlydCk7Cj4g PiA+ID4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgaWYgKHJldCkgewo+ID4gPiA+ ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBwcl9lcnJf b25jZSgiRVRSQUNLIHJlcGVhdCByZXR1cm5lZCAlZCAoMHgleCkiLAo+ID4gPiA+ID4gK8KgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgIHJldCwgcmV0KTsKPiA+ID4gPiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgcmV0dXJuIC1FRkFVTFQ7Cj4gPiA+ID4gPiArwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgfQo+ID4gPiA+ID4gK8KgwqDCoMKgwqDCoMKgfQo+ID4gPiA+ID4g K8KgwqDCoMKgwqDCoMKgb25fZWFjaF9jcHVfbWFzayhzZ3hfZW5jbF9jcHVtYXNrKGVuY2wpLCBz Z3hfaXBpX2NiLCBOVUxMLCAxKTsKPiA+ID4gPiA+ICsKPiA+ID4gPiA+ICvCoMKgwqDCoMKgwqDC oHJldHVybiAwOwo+ID4gPiA+ID4gK30KPiA+ID4gPiA+ICsKPiA+ID4gPiA+ICsvKioKPiA+ID4g PiA+ICsgKiBzZ3hfZW5jbGF2ZV9yZXN0cmljdF9wZXJtaXNzaW9ucygpIC0gUmVzdHJpY3QgRVBD TSBwZXJtaXNzaW9ucwo+ID4gPiA+ID4gKyAqIEBlbmNsOsKgwqDCoMKgwqDCoEVuY2xhdmUgdG8g d2hpY2ggdGhlIHBhZ2VzIGJlbG9uZy4KPiA+ID4gPiA+ICsgKiBAbW9kcDrCoMKgwqDCoMKgwqBD aGVja2VkIHBhcmFtZXRlcnMgZnJvbSB1c2VyIG9uIHdoaWNoIHBhZ2VzIG5lZWQgbW9kaWZ5aW5n Lgo+ID4gPiA+ID4gKyAqIEBzZWNpbmZvX3Blcm06IE5ldyAodmFsaWRhdGVkKSBwZXJtaXNzaW9u IGJpdHMuCj4gPiA+ID4gPiArICoKPiA+ID4gPiA+ICsgKiBSZXR1cm46Cj4gPiA+ID4gPiArICog LSAwOsKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgU3VjY2Vzcy4KPiA+ID4gPiA+ICsg KiAtIC1lcnJubzrCoMKgwqBPdGhlcndpc2UuCj4gPiA+ID4gPiArICovCj4gPiA+ID4gPiArc3Rh dGljIGxvbmcKPiA+ID4gPiA+ICtzZ3hfZW5jbGF2ZV9yZXN0cmljdF9wZXJtaXNzaW9ucyhzdHJ1 Y3Qgc2d4X2VuY2wgKmVuY2wsCj4gPiA+ID4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgc3RydWN0IHNneF9lbmNsYXZlX3Jl c3RyaWN0X3Blcm1pc3Npb25zICptb2RwLAo+ID4gPiA+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHU2NCBzZWNpbmZvX3Bl cm0pCj4gPiA+ID4gPiArewo+ID4gPiA+ID4gK8KgwqDCoMKgwqDCoMKgc3RydWN0IHNneF9lbmNs X3BhZ2UgKmVudHJ5Owo+ID4gPiA+ID4gK8KgwqDCoMKgwqDCoMKgc3RydWN0IHNneF9zZWNpbmZv IHNlY2luZm87Cj4gPiA+ID4gPiArwqDCoMKgwqDCoMKgwqB1bnNpZ25lZCBsb25nIGFkZHI7Cj4g PiA+ID4gPiArwqDCoMKgwqDCoMKgwqB1bnNpZ25lZCBsb25nIGM7Cj4gPiA+ID4gPiArwqDCoMKg wqDCoMKgwqB2b2lkICplcGNfdmlydDsKPiA+ID4gPiA+ICvCoMKgwqDCoMKgwqDCoGludCByZXQ7 Cj4gPiA+ID4gPiArCj4gPiA+ID4gPiArwqDCoMKgwqDCoMKgwqBtZW1zZXQoJnNlY2luZm8sIDAs IHNpemVvZihzZWNpbmZvKSk7Cj4gPiA+ID4gPiArwqDCoMKgwqDCoMKgwqBzZWNpbmZvLmZsYWdz ID0gc2VjaW5mb19wZXJtOwo+ID4gPiA+ID4gKwo+ID4gPiA+ID4gK8KgwqDCoMKgwqDCoMKgZm9y IChjID0gMCA7IGMgPCBtb2RwLT5sZW5ndGg7IGMgKz0gUEFHRV9TSVpFKSB7Cj4gPiA+ID4gPiAr wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgYWRkciA9IGVuY2wtPmJhc2UgKyBtb2RwLT5v ZmZzZXQgKyBjOwo+ID4gPiA+ID4gKwo+ID4gPiA+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoG11dGV4X2xvY2soJmVuY2wtPmxvY2spOwo+ID4gPiA+ID4gKwo+ID4gPiA+ID4gK8Kg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGVudHJ5ID0gc2d4X2VuY2xfbG9hZF9wYWdlKGVu Y2wsIGFkZHIpOwo+ID4gPiA+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGlmIChJ U19FUlIoZW50cnkpKSB7Cj4gPiA+ID4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoHJldCA9IFBUUl9FUlIoZW50cnkpID09IC1FQlVTWSA/IC1FQUdBSU4g OiAtRUZBVUxUOwo+ID4gPiA+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqBnb3RvIG91dF91bmxvY2s7Cj4gPiA+ID4gPiArwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgfQo+ID4gPiA+ID4gKwo+ID4gPiA+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoC8qCj4gPiA+ID4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgICog Q2hhbmdpbmcgRVBDTSBwZXJtaXNzaW9ucyBpcyBvbmx5IHN1cHBvcnRlZCBvbiByZWd1bGFyCj4g PiA+ID4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgICogU0dYIHBhZ2VzLiBBdHRl bXB0aW5nIHRoaXMgY2hhbmdlIG9uIG90aGVyIHBhZ2VzIHdpbGwKPiA+ID4gPiA+ICvCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgKiByZXN1bHQgaW4gI1BGLgo+ID4gPiA+ID4gK8KgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCAqLwo+ID4gPiA+ID4gK8KgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoGlmIChlbnRyeS0+dHlwZSAhPSBTR1hfUEFHRV9UWVBFX1JFRykgewo+ID4g PiA+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqByZXQg PSAtRUlOVkFMOwo+ID4gPiA+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqBnb3RvIG91dF91bmxvY2s7Cj4gPiA+ID4gPiArwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgfQo+ID4gPiA+ID4gKwo+ID4gPiA+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoC8qCj4gPiA+ID4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgICog RG8gbm90IHZlcmlmeSB0aGUgcGVybWlzc2lvbiBiaXRzIHJlcXVlc3RlZC4gS2VybmVsCj4gPiA+ ID4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgICogaGFzIG5vIGNvbnRyb2wgb3Zl ciBob3cgRVBDTSBwZXJtaXNzaW9ucyBjYW4gYmUgcmVsYXhlZAo+ID4gPiA+ID4gK8KgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoCAqIGZyb20gd2l0aGluIHRoZSBlbmNsYXZlLiBFTkNMU1tF TU9EUFJdIGNhbiBvbmx5Cj4gPiA+ID4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg ICogcmVtb3ZlIGV4aXN0aW5nIEVQQ00gcGVybWlzc2lvbnMsIGF0dGVtcHRpbmcgdG8gc2V0Cj4g PiA+ID4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgICogbmV3IHBlcm1pc3Npb25z IHdpbGwgYmUgaWdub3JlZCBieSB0aGUgaGFyZHdhcmUuCj4gPiA+ID4gPiArwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgICovCj4gPiA+ID4gPiArCj4gPiA+ID4gPiArwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgLyogQ2hhbmdlIEVQQ00gcGVybWlzc2lvbnMuICovCj4gPiA+ID4g PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgZXBjX3ZpcnQgPSBzZ3hfZ2V0X2VwY192 aXJ0X2FkZHIoZW50cnktPmVwY19wYWdlKTsKPiA+ID4gPiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqByZXQgPSBfX2Vtb2Rwcigmc2VjaW5mbywgZXBjX3ZpcnQpOwo+ID4gPiA+ID4g K8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGlmIChlbmNsc19mYXVsdGVkKHJldCkpIHsK PiA+ID4gPiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg LyoKPiA+ID4gPiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgICogQWxsIHBvc3NpYmxlIGZhdWx0cyBzaG91bGQgYmUgYXZvaWRhYmxlOgo+ID4gPiA+ID4g K8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgKiBwYXJhbWV0 ZXJzIGhhdmUgYmVlbiBjaGVja2VkLCB3aWxsIG9ubHkgY2hhbmdlCj4gPiA+ID4gPiArwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCAqIHBlcm1pc3Npb25zIG9m IGEgcmVndWxhciBwYWdlLCBhbmQgbm8gY29uY3VycmVudAo+ID4gPiA+ID4gK8KgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgKiBTR1gxL1NHWDIgRU5DTFMgaW5z dHJ1Y3Rpb25zIHNpbmNlIHRoZXNlCj4gPiA+ID4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoCAqIGFyZSBwcm90ZWN0ZWQgd2l0aCBtdXRleC4KPiA+ID4g PiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgICovCj4g PiA+ID4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoHBy X2Vycl9vbmNlKCJFTU9EUFIgZW5jb3VudGVyZWQgZXhjZXB0aW9uICVkXG4iLAo+ID4gPiA+ID4g K8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgIEVOQ0xTX1RSQVBOUihyZXQpKTsKPiA+ID4gPiA+ICvCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgcmV0ID0gLUVGQVVMVDsKPiA+ID4gPiA+ ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgZ290byBvdXRf dW5sb2NrOwo+ID4gPiA+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoH0KPiA+ID4g PiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBpZiAoZW5jbHNfZmFpbGVkKHJldCkp IHsKPiA+ID4gPiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgbW9kcC0+cmVzdWx0ID0gcmV0Owo+ID4gPiA+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqByZXQgPSAtRUZBVUxUOwo+ID4gPiA+ID4gK8KgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBnb3RvIG91dF91bmxvY2s7Cj4g PiA+ID4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgfQo+ID4gPiA+ID4gKwo+ID4g PiA+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoHJldCA9IHNneF9lbmNsYXZlX2V0 cmFjayhlbmNsKTsKPiA+ID4gPiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBpZiAo cmV0KSB7Cj4gPiA+ID4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoHJldCA9IC1FRkFVTFQ7Cj4gPiA+ID4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoGdvdG8gb3V0X3VubG9jazsKPiA+ID4gPiA+ICvCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqB9Cj4gPiA+ID4gPiArCj4gPiA+ID4gPiArwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgbXV0ZXhfdW5sb2NrKCZlbmNsLT5sb2NrKTsKPiA+ID4gPiA+ ICvCoMKgwqDCoMKgwqDCoH0KPiA+ID4gPiA+ICsKPiA+ID4gPiA+ICvCoMKgwqDCoMKgwqDCoHJl dCA9IDA7Cj4gPiA+ID4gPiArwqDCoMKgwqDCoMKgwqBnb3RvIG91dDsKPiA+ID4gPiA+ICsKPiA+ ID4gPiA+ICtvdXRfdW5sb2NrOgo+ID4gPiA+ID4gK8KgwqDCoMKgwqDCoMKgbXV0ZXhfdW5sb2Nr KCZlbmNsLT5sb2NrKTsKPiA+ID4gPiA+ICtvdXQ6Cj4gPiA+ID4gPiArwqDCoMKgwqDCoMKgwqBt b2RwLT5jb3VudCA9IGM7Cj4gPiA+ID4gPiArCj4gPiA+ID4gPiArwqDCoMKgwqDCoMKgwqByZXR1 cm4gcmV0Owo+ID4gPiA+ID4gK30KPiA+ID4gPiA+ICsKPiA+ID4gPiA+ICsvKioKPiA+ID4gPiA+ ICsgKiBzZ3hfaW9jX2VuY2xhdmVfcmVzdHJpY3RfcGVybWlzc2lvbnMoKSAtIGhhbmRsZXIgZm9y Cj4gPiA+ID4gPiArICrCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgJVNHWF9JT0NfRU5DTEFWRV9SRVNU UklDVF9QRVJNSVNTSU9OUwo+ID4gPiA+ID4gKyAqIEBlbmNsOsKgwqDCoMKgwqDCoGFuIGVuY2xh dmUgcG9pbnRlcgo+ID4gPiA+ID4gKyAqIEBhcmc6wqDCoMKgwqDCoMKgwqB1c2Vyc3BhY2UgcG9p bnRlciB0byBhICZzdHJ1Y3Qgc2d4X2VuY2xhdmVfcmVzdHJpY3RfcGVybWlzc2lvbnMKPiA+ID4g PiA+ICsgKsKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgaW5zdGFuY2UKPiA+ID4gPiA+ICsgKgo+ ID4gPiA+ID4gKyAqIFNHWDIgZGlzdGluZ3Vpc2hlcyBiZXR3ZWVuIHJlbGF4aW5nIGFuZCByZXN0 cmljdGluZyB0aGUgZW5jbGF2ZSBwYWdlCj4gPiA+ID4gPiArICogcGVybWlzc2lvbnMgbWFpbnRh aW5lZCBieSB0aGUgaGFyZHdhcmUgKEVQQ00gcGVybWlzc2lvbnMpIG9mIHBhZ2VzCj4gPiA+ID4g PiArICogYmVsb25naW5nIHRvIGFuIGluaXRpYWxpemVkIGVuY2xhdmUgKGFmdGVyIFNHWF9JT0Nf RU5DTEFWRV9JTklUKS4KPiA+ID4gPiA+ICsgKgo+ID4gPiA+ID4gKyAqIEVQQ00gcGVybWlzc2lv bnMgY2Fubm90IGJlIHJlc3RyaWN0ZWQgZnJvbSB3aXRoaW4gdGhlIGVuY2xhdmUsIHRoZSBlbmNs YXZlCj4gPiA+ID4gPiArICogcmVxdWlyZXMgdGhlIGtlcm5lbCB0byBydW4gdGhlIHByaXZpbGVn ZWQgbGV2ZWwgMCBpbnN0cnVjdGlvbnMgRU5DTFNbRU1PRFBSXQo+ID4gPiA+ID4gKyAqIGFuZCBF TkNMU1tFVFJBQ0tdLiBBbiBhdHRlbXB0IHRvIHJlbGF4IEVQQ00gcGVybWlzc2lvbnMgd2l0aCB0 aGlzIGNhbGwKPiA+ID4gPiA+ICsgKiB3aWxsIGJlIGlnbm9yZWQgYnkgdGhlIGhhcmR3YXJlLgo+ ID4gPiA+ID4gKyAqCj4gPiA+ID4gPiArICogUmV0dXJuOgo+ID4gPiA+ID4gKyAqIC0gMDrCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoFN1Y2Nlc3MKPiA+ID4gPiA+ICsgKiAtIC1lcnJu bzrCoMKgwqBPdGhlcndpc2UKPiA+ID4gPiA+ICsgKi8KPiA+ID4gPiA+ICtzdGF0aWMgbG9uZyBz Z3hfaW9jX2VuY2xhdmVfcmVzdHJpY3RfcGVybWlzc2lvbnMoc3RydWN0IHNneF9lbmNsICplbmNs LAo+ID4gPiA+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgdm9pZCBf X3VzZXIgKmFyZykKPiA+ID4gPiA+ICt7Cj4gPiA+ID4gPiArwqDCoMKgwqDCoMKgwqBzdHJ1Y3Qg c2d4X2VuY2xhdmVfcmVzdHJpY3RfcGVybWlzc2lvbnMgcGFyYW1zOwo+ID4gPiA+ID4gK8KgwqDC oMKgwqDCoMKgdTY0IHNlY2luZm9fcGVybTsKPiA+ID4gPiA+ICvCoMKgwqDCoMKgwqDCoGxvbmcg cmV0Owo+ID4gPiA+ID4gKwo+ID4gPiA+ID4gK8KgwqDCoMKgwqDCoMKgcmV0ID0gc2d4X2lvY19z Z3gyX3JlYWR5KGVuY2wpOwo+ID4gPiA+ID4gK8KgwqDCoMKgwqDCoMKgaWYgKHJldCkKPiA+ID4g PiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqByZXR1cm4gcmV0Owo+ID4gPiA+ID4g Kwo+ID4gPiA+ID4gK8KgwqDCoMKgwqDCoMKgaWYgKGNvcHlfZnJvbV91c2VyKCZwYXJhbXMsIGFy Zywgc2l6ZW9mKHBhcmFtcykpKQo+ID4gPiA+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoHJldHVybiAtRUZBVUxUOwo+ID4gPiA+ID4gKwo+ID4gPiA+ID4gK8KgwqDCoMKgwqDCoMKg aWYgKHNneF92YWxpZGF0ZV9vZmZzZXRfbGVuZ3RoKGVuY2wsIHBhcmFtcy5vZmZzZXQsIHBhcmFt cy5sZW5ndGgpKQo+ID4gPiA+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoHJldHVy biAtRUlOVkFMOwo+ID4gPiA+ID4gKwo+ID4gPiA+ID4gK8KgwqDCoMKgwqDCoMKgcmV0ID0gc2d4 X3Blcm1fZnJvbV91c2VyX3NlY2luZm8oKHZvaWQgX191c2VyICopcGFyYW1zLnNlY2luZm8sCj4g PiA+ID4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgICZzZWNpbmZvX3Blcm0pOwo+ID4gPiA+ID4g K8KgwqDCoMKgwqDCoMKgaWYgKHJldCkKPiA+ID4gPiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqByZXR1cm4gcmV0Owo+ID4gPiA+ID4gKwo+ID4gPiA+ID4gK8KgwqDCoMKgwqDCoMKg aWYgKHBhcmFtcy5yZXN1bHQgfHwgcGFyYW1zLmNvdW50KQo+ID4gPiA+ID4gK8KgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoHJldHVybiAtRUlOVkFMOwo+ID4gPiA+ID4gKwo+ID4gPiA+ID4g K8KgwqDCoMKgwqDCoMKgcmV0ID0gc2d4X2VuY2xhdmVfcmVzdHJpY3RfcGVybWlzc2lvbnMoZW5j bCwgJnBhcmFtcywgc2VjaW5mb19wZXJtKTsKPiA+ID4gPiA+ICsKPiA+ID4gPiA+ICvCoMKgwqDC oMKgwqDCoGlmIChjb3B5X3RvX3VzZXIoYXJnLCAmcGFyYW1zLCBzaXplb2YocGFyYW1zKSkpCj4g PiA+ID4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgcmV0dXJuIC1FRkFVTFQ7Cj4g PiA+ID4gPiArCj4gPiA+ID4gPiArwqDCoMKgwqDCoMKgwqByZXR1cm4gcmV0Owo+ID4gPiA+ID4g K30KPiA+ID4gPiA+ICsKPiA+ID4gPiA+IMKgbG9uZyBzZ3hfaW9jdGwoc3RydWN0IGZpbGUgKmZp bGVwLCB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKPiA+ID4gPiA+IMKgewo+ ID4gPiA+ID4gwqDCoMKgwqDCoMKgwqDCoHN0cnVjdCBzZ3hfZW5jbCAqZW5jbCA9IGZpbGVwLT5w cml2YXRlX2RhdGE7Cj4gPiA+ID4gPiBAQCAtNjgxLDYgKzkxOSwxMCBAQCBsb25nIHNneF9pb2N0 bChzdHJ1Y3QgZmlsZSAqZmlsZXAsIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJn KQo+ID4gPiA+ID4gwqDCoMKgwqDCoMKgwqDCoGNhc2UgU0dYX0lPQ19FTkNMQVZFX1BST1ZJU0lP TjoKPiA+ID4gPiA+IMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgcmV0ID0gc2d4X2lv Y19lbmNsYXZlX3Byb3Zpc2lvbihlbmNsLCAodm9pZCBfX3VzZXIgKilhcmcpOwo+ID4gPiA+ID4g wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBicmVhazsKPiA+ID4gPiA+ICvCoMKgwqDC oMKgwqDCoGNhc2UgU0dYX0lPQ19FTkNMQVZFX1JFU1RSSUNUX1BFUk1JU1NJT05TOgo+ID4gPiA+ ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoHJldCA9IHNneF9pb2NfZW5jbGF2ZV9y ZXN0cmljdF9wZXJtaXNzaW9ucyhlbmNsLAo+ID4gPiA+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCAodm9pZCBfX3VzZXIgKilhcmcp Owo+ID4gPiA+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGJyZWFrOwo+ID4gPiA+ ID4gwqDCoMKgwqDCoMKgwqDCoGRlZmF1bHQ6Cj4gPiA+ID4gPiDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoHJldCA9IC1FTk9JT0NUTENNRDsKPiA+ID4gPiA+IMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgYnJlYWs7Cj4gPiA+ID4gCj4gPiA+ID4gSSB0aGluayB0aGlzIGEg YmlnIGltcHJvdmVtZW50IGFsbCB0aGluZ3MgY29uc2lkZXJlZC4gSSBqdXN0IHB1dMKgCj4gPiA+ ID4gYSBrZXJuZWwgYnVpbGRpbmcgYW5kIHNlZSBpZiBJIGdldCB0aGlzIHdpcmVkIHRvIG91ciBj b2RlOgo+ID4gPiA+IAo+ID4gPiA+IGh0dHBzOi8vZ2l0aHViLmNvbS9qYXJra29qcy9hdXItbGlu dXgtc2d4L2FjdGlvbnMvcnVucy8yMDk0MDg0OTQzCj4gPiA+ID4gCj4gPiA+ID4gSSdsbCByZXBv cnQgbXkgZmluZGluZ3MgbGF0ZXIgb24uCj4gPiA+IAo+ID4gPiBJIHB1bGxlZCB0aGUgcGF0Y2hl cyBmcm9tIHNneDJfc3VibWl0dGVkX3YzX3BsdXNfcnd4IGJyYW5jaC4gSnVzdAo+ID4gPiBzYW5p dHkgY2hlY2tpbmcgdGhhdCBpdCBpcyB2MywgY29ycmVjdD8KPiA+IAo+ID4gSSdtIGdldHRpbmcg RUlOVkFMIHdpdGggU0VDSU5GTyB0aGF0IEkgdGhpbmsgaXMgbGVnaXQ6Cj4gPiAKPiA+IGxldCBt dXQgc2VjaW5mb19idWY6IFt1ODsgNjRdID0gWzA7IDY0XTsgLy8gSW5pdGlhbGl6ZSB3aXRoIHpl cm9zCj4gPiBzZWNpbmZvX2J1ZlswXSA9IDE7IC8vIFJFQUQKPiA+IHNlY2luZm9fYnVmWzFdID0g MjsgLy8gUmVndWxhcgo+ID4gCj4gPiBJIG1hZGUgYSBzbWFsbCBicGZ0cmFjZSBzY3JpcHQsIGFu ZCBoZXJlJ3Mgd2hhdCBoYXBwZW5zOgo+ID4gCj4gPiAkIGNhdCBzZ3guYnQKPiA+IGtyZXRwcm9i ZTpzZ3hfaW9jdGwgL3JldHZhbCAhPSAwLwo+ID4gewo+ID4gwqDCoMKgwqDCoMKgwqDCoHByaW50 Zigic2d4X2lvY3RsOiAlZFxuIiwgcmV0dmFsKQo+ID4gfQo+ID4gCj4gPiBrcmV0cHJvYmU6c2d4 X3Blcm1fZnJvbV91c2VyX3NlY2luZm8uY29uc3Rwcm9wLjAgL3JldHZhbC8KPiA+IHsKPiA+IMKg wqDCoMKgwqDCoMKgwqBwcmludGYoInNneF9wZXJtX2Zyb21fdXNlcl9zZWNpbmZvLmNvbnN0cHJv cC4wICVkXG4iLCByZXR2YWwpCj4gPiB9Cj4gPiAKPiA+IGtyZXRwcm9iZTpzZ3hfZW5jbGF2ZV9y ZXN0cmljdF9wZXJtaXNzaW9ucyAvcmV0dmFsLwo+ID4gewo+ID4gwqDCoMKgwqDCoMKgwqDCoHBy aW50Zigic2d4X2VuY2xhdmVfcmVzdHJpY3RfcGVybWlzc2lvbnM6ICVkXG4iLCByZXR2YWwpCj4g PiB9Cj4gPiAKPiA+ICQgc3VkbyBicGZ0cmFjZSBzZ3guYnQKPiA+IFtzdWRvXSBwYXNzd29yZCBm b3IgamFya2tvOiAKPiA+IEF0dGFjaGluZyAzIHByb2Jlcy4uLgo+ID4gc2d4X3Blcm1fZnJvbV91 c2VyX3NlY2luZm8uY29uc3Rwcm9wLjAgLTIyCj4gPiBzZ3hfaW9jdGw6IC0yMgo+ID4gCj4gPiBD b3VsZCBiZSB0aGF0IEknbSBkb2luZyBzb21ldGhpbmcgd3JvbmcgYnV0IGluc3RhbnRseSBkbyBu b3Qgc2VlCj4gPiBhbnl0aGluZyBvYnZpb3VzLi4uCj4gCj4gSXQgd2FzIG15IGJhZCwgaS5lLgo+ IAo+IGxldCBtdXQgc2VjaW5mb19idWY6IFt1ODsgNjRdID0gWzA7IDY0XTsKPiBzZWNpbmZvX2J1 ZlswXSA9IDE7Cj4gc2VjaW5mb19idWZbMV0gPSAwOwo+IMKgCj4gQlIsIEphcmtrbwoKQWNjb3Jk aW5nIHRvIFNETSBoYXZpbmcgcGFnZSB0eXBlIGFzIHJlZ3VsYXIgaXMgZmluZSBmb3IgRU1PRFBS LAppLmUuIHRoYXQncyB3aHkgSSBkaWQgbm90IGNhcmUgYWJvdXQgaGF2aW5nIGl0IGluIFNFQ0lO Rk8uCgpHaXZlbiB0aGF0IHRoZSBvcGNvZGUgaXRzZWxmIGNvbnRhaW5zIHZhbGlkYXRpb24sIEkg d29uZGVyCndoeSB0aGlzIG5lZWRzIHRvIGJlIGRvbmU6CgppZiAoc2VjaW5mby5mbGFncyAmIH5T R1hfU0VDSU5GT19QRVJNSVNTSU9OX01BU0spCgkJcmV0dXJuIC1FSU5WQUw7CgppZiAobWVtY2hy X2ludihzZWNpbmZvLnJlc2VydmVkLCAwLCBzaXplb2Yoc2VjaW5mby5yZXNlcnZlZCkpKQoJCXJl dHVybiAtRUlOVkFMOwoKcGVybSA9IHNlY2luZm8uZmxhZ3MgJiBTR1hfU0VDSU5GT19QRVJNSVNT SU9OX01BU0s7CgpJLmUuIHdoeSBkdXBsaWNhdGUgdmFsaWRhdGlvbiBhbmQgd2h5IGRvZXMgaXQg aGF2ZSBkaWZmZXJlbnQKaW52YXJpYW50IHRoYW4gdGhlIG9wY29kZT8KCldoaWxlIGxvb2tpbmcg aW50byB0aGlzIEkgYWxzbyBub3RpY2VkOgoKc3RhdGljIGludCBzZ3hfdmFsaWRhdGVfb2Zmc2V0 X2xlbmd0aChzdHJ1Y3Qgc2d4X2VuY2wgKmVuY2wsCgkJCQkgICAgICB1bnNpZ25lZCBsb25nIG9m ZnNldCwKCQkJCSAgICAgIHVuc2lnbmVkIGxvbmcgbGVuZ3RoKQp7CglpZiAoIUlTX0FMSUdORUQo b2Zmc2V0LCBQQUdFX1NJWkUpKQoJCXJldHVybiAtRUlOVkFMOwoKCWlmICghbGVuZ3RoIHx8IGxl bmd0aCAmIChQQUdFX1NJWkUgLSAxKSkKCQlyZXR1cm4gLUVJTlZBTDsKCkkgZ3Vlc3MgYWxzbyBm b3IgbGVuZ3RoIHdvdWxkIGJlIGdvb2QgaWRlYSB0byB1c2UgSVNfQUxJR05FRCgpCih0aGlzIGlu Y29uc2lzdGVuY3kgaW5oZXJpdHMgZnJvbSB0aGUgcHJlLWV4aXN0aW5nIGNvZGUpLgoKQlIsIEph cmtrbwoKCg==