From mboxrd@z Thu Jan 1 00:00:00 1970 From: =?UTF-8?Q?Christian_K=c3=b6nig?= Subject: Re: [PATCH 6/8] drm/amdgpu: meld together VM fragment and huge page handling Date: Mon, 12 Nov 2018 16:16:25 +0100 Message-ID: <0d147f17-bfe6-ce5b-e8c5-ee433f4f1990@gmail.com> References: <20180912085445.3245-1-christian.koenig@amd.com> <20180912085445.3245-6-christian.koenig@amd.com> <363ce01b-c6f1-21bc-329e-bbb4ec568ba8@gmail.com> Reply-To: christian.koenig-5C7GfCeVMHo@public.gmane.org Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8"; Format="flowed" Content-Transfer-Encoding: base64 Return-path: In-Reply-To: Content-Language: en-US List-Id: Discussion list for AMD gfx List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: amd-gfx-bounces-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW@public.gmane.org Sender: "amd-gfx" To: "Koenig, Christian" , Samuel Pitoiset , "amd-gfx-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW@public.gmane.org" , "Liu, Aaron" QW0gMDkuMTEuMTggdW0gMTM6MTMgc2NocmllYiBLb2VuaWcsIENocmlzdGlhbjoKPiBBZGRpbmcg QWFyb24gd2hvIGluaXRpYWxseSByZXBvcnRlZCB0aGUgcHJvYmxlbSB3aXRoIHRoaXMgcGF0Y2gg YW5kCj4gc3VzcGVuZC9yZXN1bWUuCj4KPiBBbSAwOC4xMS4xOCB1bSAyMDozNSBzY2hyaWViIFNh bXVlbCBQaXRvaXNldDoKPj4gT24gMTEvOC8xOCA1OjUwIFBNLCBDaHJpc3RpYW4gS8O2bmlnIHdy b3RlOgo+Pj4gSGkgU2FtdWVsLAo+Pj4KPj4+IHllYWgsIHRoYXQgaXMgYSBrbm93biBpc3N1ZSBh bmQgSSB3YXMgYWxyZWFkeSBsb29raW5nIGludG8gdGhhdCBhbGwKPj4+IGRheSB0b2RheS4gUHJv YmxlbSBpcyB0aGF0IEkgY2FuJ3QgcmVwcm9kdWNlIGl0IHJlbGlhYmxlLgo+Pj4KPj4+IERvIHlv dSBoYXZlIGFueSBoaW50IGhvdyB0byB0cmlnZ2VyIHRoYXQ/IEUuZy4gbWVtb3J5IGV4aGF1c3Rp b24gbWF5YmU/Cj4+IEhpIENocmlzdGlhbiwKPj4KPj4gR29vZCB0byBoZWFyIHRoYXQgeW91IGFy ZSBhbHJlYWR5IHdvcmtpbmcgb24uCj4+Cj4+IFRoZSBHUFUgaGFuZyB3aXRoIFJpc2Ugb2YgVG9t YiBSYWlkZXIgaXMgcmVsaWFibGUgb24gbXkgc2lkZS4gSXQKPj4gYWx3YXlzIGhhbmdzIHdoaWxl IGxvYWRpbmcgdGhlIGJlbmNobWFyay4gSSB1c2UgdGhlIFVsdHJhIEhpZ2ggcHJlc2V0Lgo+Pgo+ PiBEbyB5b3UgaGF2ZSBhY2Nlc3MgdG8gdGhhdCBnYW1lPyBBcyBtZW50aW9uZWQsIEYxIDIwMTcg aXMgYWxzbwo+PiBhZmZlY3RlZCBidXQgSSB1c2VkIFJvVFIgZHVyaW5nIG15IGJpc2VjdC4KPiBJ IHdhcyBhYmxlIHRvIHJlcHJvZHVjZSB0aGUgcHJvYmxlbSB3aXRoIGEgbWVtb3J5IHN0cmVzcyB0 ZXN0LCBidXQgc3RpbGwKPiBoYXZlIG5vdCB0aGUgc2xpZ2h0ZXN0IGlkZWEgd2hhdCBpcyBnb2lu ZyB3cm9uZyBoZXJlLgoKT2ssIGZvdW5kIHRoZSByb290IGNhdXNlLiBXZSBhcmUgc2V0dGluZyB0 aGUgaHVnZSBwYWdlIGZsYWcgb24gdGhlIHdyb25nIApsZXZlbCAoYXQgdGhlIHBhcmVudCBpbnN0 ZWFkIG9mIHRoZSBjaGlsZCkuCgpDdXJyZW50bHkgdGVzdGluZyBhIGZpeCBmb3IgdGhpcywKQ2hy aXN0aWFuLgoKPgo+IEdvaW5nIHRvIGludmVzdGlnYXRlIGZ1cnRoZXIsCj4gQ2hyaXN0aWFuLgo+ Cj4+IFRoYW5rcy4KPj4KPj4+IFRoYW5rcywKPj4+IENocmlzdGlhbi4KPj4+Cj4+PiBBbSAwOC4x MS4xOCB1bSAxNzoxNyBzY2hyaWViIFNhbXVlbCBQaXRvaXNldDoKPj4+PiBIaSwKPj4+Pgo+Pj4+ IFRoaXMgY2hhbmdlIGludHJvZHVjZXMgR1BVIGhhbmdzIHdpdGggRjEgMjAxNyBhbmQgUmlzZSBv ZiBUb21iCj4+Pj4gUmFpZGVyIG9uIFJBRFYvR0ZYOS4gSSBiaXNlY3RlZCB0aGUgaXNzdWUuCj4+ Pj4KPj4+PiBDYW4geW91IGhhdmUgYSBsb29rPwo+Pj4+Cj4+Pj4gVGhhbmtzIQo+Pj4+Cj4+Pj4g T24gOS8xMi8xOCAxMDo1NCBBTSwgQ2hyaXN0aWFuIEvDtm5pZyB3cm90ZToKPj4+Pj4gVGhpcyBv cHRpbWl6ZXMgdGhlIGdlbmVyYXRpbmcgb2YgUFRFcyBieSB3YWxraW5nIHRoZSBoaWVyYXJjaHkg b25seQo+Pj4+PiBvbmNlCj4+Pj4+IGZvciBhIHJhbmdlIGFuZCBtYWtpbmcgY2hhbmdlcyBhcyBu ZWNlc3NhcnkuCj4+Pj4+Cj4+Pj4+IEl0IGFsbG93cyBmb3IgYm90aCBodWdlICgyTUIpIGFzIHdl bGwgZ2lhbnQgKDFHQikgcGFnZXMgdG8gYmUgdXNlZCBvbgo+Pj4+PiBWZWdhIGFuZCBSYXZlbi4K Pj4+Pj4KPj4+Pj4gU2lnbmVkLW9mZi1ieTogQ2hyaXN0aWFuIEvDtm5pZyA8Y2hyaXN0aWFuLmtv ZW5pZ0BhbWQuY29tPgo+Pj4+PiBSZXZpZXdlZC1ieTogRmVsaXggS3VlaGxpbmcgPEZlbGl4Lkt1 ZWhsaW5nQGFtZC5jb20+Cj4+Pj4+IEFja2VkLWJ5OiBKdW53ZWkgWmhhbmcgPEplcnJ5LlpoYW5n QGFtZC5jb20+Cj4+Pj4+IC0tLQo+Pj4+PiAgwqAgZHJpdmVycy9ncHUvZHJtL2FtZC9hbWRncHUv YW1kZ3B1X3ZtLmMgfCAyNjcKPj4+Pj4gKysrKysrKysrKysrKysrKysrLS0tLS0tLS0tLS0tLS0t Cj4+Pj4+ICDCoCAxIGZpbGUgY2hhbmdlZCwgMTQ3IGluc2VydGlvbnMoKyksIDEyMCBkZWxldGlv bnMoLSkKPj4+Pj4KPj4+Pj4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9hbWQvYW1kZ3B1 L2FtZGdwdV92bS5jCj4+Pj4+IGIvZHJpdmVycy9ncHUvZHJtL2FtZC9hbWRncHUvYW1kZ3B1X3Zt LmMKPj4+Pj4gaW5kZXggNzQ3YjZmZjZmZWE3Li4zMjgzMjUzMjRhMWQgMTAwNjQ0Cj4+Pj4+IC0t LSBhL2RyaXZlcnMvZ3B1L2RybS9hbWQvYW1kZ3B1L2FtZGdwdV92bS5jCj4+Pj4+ICsrKyBiL2Ry aXZlcnMvZ3B1L2RybS9hbWQvYW1kZ3B1L2FtZGdwdV92bS5jCj4+Pj4+IEBAIC0xNDg4LDQ2ICsx NDg4LDc2IEBAIGludCBhbWRncHVfdm1fdXBkYXRlX2RpcmVjdG9yaWVzKHN0cnVjdAo+Pj4+PiBh bWRncHVfZGV2aWNlICphZGV2LAo+Pj4+PiAgwqAgfQo+Pj4+PiAgwqAgwqAgLyoqCj4+Pj4+IC0g KiBhbWRncHVfdm1faGFuZGxlX2h1Z2VfcGFnZXMgLSBoYW5kbGUgdXBkYXRpbmcgdGhlIFBEIHdp dGggaHVnZQo+Pj4+PiBwYWdlcwo+Pj4+PiArICogYW1kZ3B1X3ZtX3VwZGF0ZV9odWdlIC0gZmln dXJlIG91dCBwYXJhbWV0ZXJzIGZvciBQVEUgdXBkYXRlcwo+Pj4+PiAgwqDCoCAqCj4+Pj4+IC0g KiBAcDogc2VlIGFtZGdwdV9wdGVfdXBkYXRlX3BhcmFtcyBkZWZpbml0aW9uCj4+Pj4+IC0gKiBA ZW50cnk6IHZtX3B0IGVudHJ5IHRvIGNoZWNrCj4+Pj4+IC0gKiBAcGFyZW50OiBwYXJlbnQgZW50 cnkKPj4+Pj4gLSAqIEBucHRlczogbnVtYmVyIG9mIFBURXMgdXBkYXRlZCB3aXRoIHRoaXMgb3Bl cmF0aW9uCj4+Pj4+IC0gKiBAZHN0OiBkZXN0aW5hdGlvbiBhZGRyZXNzIHdoZXJlIHRoZSBQVEVz IHNob3VsZCBwb2ludCB0bwo+Pj4+PiAtICogQGZsYWdzOiBhY2Nlc3MgZmxhZ3MgZnJvIHRoZSBQ VEVzCj4+Pj4+IC0gKgo+Pj4+PiAtICogQ2hlY2sgaWYgd2UgY2FuIHVwZGF0ZSB0aGUgUEQgd2l0 aCBhIGh1Z2UgcGFnZS4KPj4+Pj4gKyAqIE1ha2Ugc3VyZSB0byBzZXQgdGhlIHJpZ2h0IGZsYWdz IGZvciB0aGUgUFRFcyBhdCB0aGUgZGVzaXJlZAo+Pj4+PiBsZXZlbC4KPj4+Pj4gIMKgwqAgKi8K Pj4+Pj4gLXN0YXRpYyB2b2lkIGFtZGdwdV92bV9oYW5kbGVfaHVnZV9wYWdlcyhzdHJ1Y3QKPj4+ Pj4gYW1kZ3B1X3B0ZV91cGRhdGVfcGFyYW1zICpwLAo+Pj4+PiAtwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqAgc3RydWN0IGFtZGdwdV92bV9wdCAqZW50cnksCj4+Pj4+IC3C oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBzdHJ1Y3QgYW1kZ3B1X3ZtX3B0 ICpwYXJlbnQsCj4+Pj4+IC3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCB1 bnNpZ25lZCBucHRlcywgdWludDY0X3QgZHN0LAo+Pj4+PiAtwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqAgdWludDY0X3QgZmxhZ3MpCj4+Pj4+IC17Cj4+Pj4+IC3CoMKgwqAg dWludDY0X3QgcGRlOwo+Pj4+PiArc3RhdGljIHZvaWQgYW1kZ3B1X3ZtX3VwZGF0ZV9odWdlKHN0 cnVjdCBhbWRncHVfcHRlX3VwZGF0ZV9wYXJhbXMKPj4+Pj4gKnBhcmFtcywKPj4+Pj4gK8KgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgc3RydWN0IGFtZGdwdV9ibyAqYm8sIHVuc2ln bmVkIGxldmVsLAo+Pj4+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCB1aW50 NjRfdCBwZSwgdWludDY0X3QgYWRkciwKPj4+Pj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqAgdW5zaWduZWQgY291bnQsIHVpbnQzMl90IGluY3IsCj4+Pj4+ICvCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHVpbnQ2NF90IGZsYWdzKQo+Pj4+PiAgwqAgLcKgwqDC oCAvKiBJbiB0aGUgY2FzZSBvZiBhIG1peGVkIFBUIHRoZSBQREUgbXVzdCBwb2ludCB0byBpdCov Cj4+Pj4+IC3CoMKgwqAgaWYgKHAtPmFkZXYtPmFzaWNfdHlwZSA+PSBDSElQX1ZFR0ExMCAmJiAh cC0+c3JjICYmCj4+Pj4+IC3CoMKgwqDCoMKgwqDCoCBucHRlcyA9PSBBTURHUFVfVk1fUFRFX0NP VU5UKHAtPmFkZXYpKSB7Cj4+Pj4+IC3CoMKgwqDCoMKgwqDCoCAvKiBTZXQgdGhlIGh1Z2UgcGFn ZSBmbGFnIHRvIHN0b3Agc2Nhbm5pbmcgYXQgdGhpcyBQREUgKi8KPj4+Pj4gK3sKPj4+Pj4gK8Kg wqDCoCBpZiAobGV2ZWwgIT0gQU1ER1BVX1ZNX1BUQikgewo+Pj4+PiAgwqDCoMKgwqDCoMKgwqDC oMKgIGZsYWdzIHw9IEFNREdQVV9QREVfUFRFOwo+Pj4+PiArwqDCoMKgwqDCoMKgwqAgYW1kZ3B1 X2dtY19nZXRfdm1fcGRlKHBhcmFtcy0+YWRldiwgbGV2ZWwsICZhZGRyLCAmZmxhZ3MpOwo+Pj4+ PiAgwqDCoMKgwqDCoCB9Cj4+Pj4+ICDCoCAtwqDCoMKgIGlmICghKGZsYWdzICYgQU1ER1BVX1BE RV9QVEUpKSB7Cj4+Pj4+IC3CoMKgwqDCoMKgwqDCoCBpZiAoZW50cnktPmh1Z2UpIHsKPj4+Pj4g LcKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgLyogQWRkIHRoZSBlbnRyeSB0byB0aGUgcmVsb2NhdGVk IGxpc3QgdG8gdXBkYXRlIGl0LiAqLwo+Pj4+PiAtwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBlbnRy eS0+aHVnZSA9IGZhbHNlOwo+Pj4+PiAtwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBhbWRncHVfdm1f Ym9fcmVsb2NhdGVkKCZlbnRyeS0+YmFzZSk7Cj4+Pj4+IC3CoMKgwqDCoMKgwqDCoCB9Cj4+Pj4+ ICvCoMKgwqAgYW1kZ3B1X3ZtX3VwZGF0ZV9mdW5jKHBhcmFtcywgYm8sIHBlLCBhZGRyLCBjb3Vu dCwgaW5jciwgZmxhZ3MpOwo+Pj4+PiArfQo+Pj4+PiArCj4+Pj4+ICsvKioKPj4+Pj4gKyAqIGFt ZGdwdV92bV9mcmFnbWVudCAtIGdldCBmcmFnbWVudCBmb3IgUFRFcwo+Pj4+PiArICoKPj4+Pj4g KyAqIEBwYXJhbXM6IHNlZSBhbWRncHVfcHRlX3VwZGF0ZV9wYXJhbXMgZGVmaW5pdGlvbgo+Pj4+ PiArICogQHN0YXJ0OiBmaXJzdCBQVEUgdG8gaGFuZGxlCj4+Pj4+ICsgKiBAZW5kOiBsYXN0IFBU RSB0byBoYW5kbGUKPj4+Pj4gKyAqIEBmbGFnczogaHcgbWFwcGluZyBmbGFncwo+Pj4+PiArICog QGZyYWc6IHJlc3VsdGluZyBmcmFnbWVudCBzaXplCj4+Pj4+ICsgKiBAZnJhZ19lbmQ6IGVuZCBv ZiB0aGlzIGZyYWdtZW50Cj4+Pj4+ICsgKgo+Pj4+PiArICogUmV0dXJucyB0aGUgZmlyc3QgcG9z c2libGUgZnJhZ21lbnQgZm9yIHRoZSBzdGFydCBhbmQgZW5kIGFkZHJlc3MuCj4+Pj4+ICsgKi8K Pj4+Pj4gK3N0YXRpYyB2b2lkIGFtZGdwdV92bV9mcmFnbWVudChzdHJ1Y3QgYW1kZ3B1X3B0ZV91 cGRhdGVfcGFyYW1zCj4+Pj4+ICpwYXJhbXMsCj4+Pj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqAgdWludDY0X3Qgc3RhcnQsIHVpbnQ2NF90IGVuZCwgdWludDY0X3QgZmxh Z3MsCj4+Pj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgdW5zaWduZWQg aW50ICpmcmFnLCB1aW50NjRfdCAqZnJhZ19lbmQpCj4+Pj4+ICt7Cj4+Pj4+ICvCoMKgwqAgLyoq Cj4+Pj4+ICvCoMKgwqDCoCAqIFRoZSBNQyBMMSBUTEIgc3VwcG9ydHMgdmFyaWFibGUgc2l6ZWQg cGFnZXMsIGJhc2VkIG9uIGEKPj4+Pj4gZnJhZ21lbnQKPj4+Pj4gK8KgwqDCoMKgICogZmllbGQg aW4gdGhlIFBURS4gV2hlbiB0aGlzIGZpZWxkIGlzIHNldCB0byBhIG5vbi16ZXJvCj4+Pj4+IHZh bHVlLCBwYWdlCj4+Pj4+ICvCoMKgwqDCoCAqIGdyYW51bGFyaXR5IGlzIGluY3JlYXNlZCBmcm9t IDRLQiB0byAoMSA8PCAoMTIgKyBmcmFnKSkuCj4+Pj4+IFRoZSBQVEUKPj4+Pj4gK8KgwqDCoMKg ICogZmxhZ3MgYXJlIGNvbnNpZGVyZWQgdmFsaWQgZm9yIGFsbCBQVEVzIHdpdGhpbiB0aGUgZnJh Z21lbnQKPj4+Pj4gcmFuZ2UKPj4+Pj4gK8KgwqDCoMKgICogYW5kIGNvcnJlc3BvbmRpbmcgbWFw cGluZ3MgYXJlIGFzc3VtZWQgdG8gYmUgcGh5c2ljYWxseQo+Pj4+PiBjb250aWd1b3VzLgo+Pj4+ PiArwqDCoMKgwqAgKgo+Pj4+PiArwqDCoMKgwqAgKiBUaGUgTDEgVExCIGNhbiBzdG9yZSBhIHNp bmdsZSBQVEUgZm9yIHRoZSB3aG9sZSBmcmFnbWVudCwKPj4+Pj4gK8KgwqDCoMKgICogc2lnbmlm aWNhbnRseSBpbmNyZWFzaW5nIHRoZSBzcGFjZSBhdmFpbGFibGUgZm9yIHRyYW5zbGF0aW9uCj4+ Pj4+ICvCoMKgwqDCoCAqIGNhY2hpbmcuIFRoaXMgbGVhZHMgdG8gbGFyZ2UgaW1wcm92ZW1lbnRz IGluIHRocm91Z2hwdXQKPj4+Pj4gd2hlbiB0aGUKPj4+Pj4gK8KgwqDCoMKgICogVExCIGlzIHVu ZGVyIHByZXNzdXJlLgo+Pj4+PiArwqDCoMKgwqAgKgo+Pj4+PiArwqDCoMKgwqAgKiBUaGUgTDIg VExCIGRpc3RyaWJ1dGVzIHNtYWxsIGFuZCBsYXJnZSBmcmFnbWVudHMgaW50byB0d28KPj4+Pj4g K8KgwqDCoMKgICogYXN5bW1ldHJpYyBwYXJ0aXRpb25zLiBUaGUgbGFyZ2UgZnJhZ21lbnQgY2Fj aGUgaXMKPj4+Pj4gc2lnbmlmaWNhbnRseQo+Pj4+PiArwqDCoMKgwqAgKiBsYXJnZXIuIFRodXMs IHdlIHRyeSB0byB1c2UgbGFyZ2UgZnJhZ21lbnRzIHdoZXJldmVyIHBvc3NpYmxlLgo+Pj4+PiAr wqDCoMKgwqAgKiBVc2Vyc3BhY2UgY2FuIHN1cHBvcnQgdGhpcyBieSBhbGlnbmluZyB2aXJ0dWFs IGJhc2UgYWRkcmVzcwo+Pj4+PiBhbmQKPj4+Pj4gK8KgwqDCoMKgICogYWxsb2NhdGlvbiBzaXpl IHRvIHRoZSBmcmFnbWVudCBzaXplLgo+Pj4+PiArwqDCoMKgwqAgKi8KPj4+Pj4gK8KgwqDCoCB1 bnNpZ25lZCBtYXhfZnJhZyA9IHBhcmFtcy0+YWRldi0+dm1fbWFuYWdlci5mcmFnbWVudF9zaXpl Owo+Pj4+PiArCj4+Pj4+ICvCoMKgwqAgLyogc3lzdGVtIHBhZ2VzIGFyZSBub24gY29udGludW91 c2x5ICovCj4+Pj4+ICvCoMKgwqAgaWYgKHBhcmFtcy0+c3JjIHx8ICEoZmxhZ3MgJiBBTURHUFVf UFRFX1ZBTElEKSkgewo+Pj4+PiArwqDCoMKgwqDCoMKgwqAgKmZyYWcgPSAwOwo+Pj4+PiArwqDC oMKgwqDCoMKgwqAgKmZyYWdfZW5kID0gZW5kOwo+Pj4+PiAgwqDCoMKgwqDCoMKgwqDCoMKgIHJl dHVybjsKPj4+Pj4gIMKgwqDCoMKgwqAgfQo+Pj4+PiAgwqAgLcKgwqDCoCBlbnRyeS0+aHVnZSA9 IHRydWU7Cj4+Pj4+IC3CoMKgwqAgYW1kZ3B1X2dtY19nZXRfdm1fcGRlKHAtPmFkZXYsIEFNREdQ VV9WTV9QREIwLCAmZHN0LCAmZmxhZ3MpOwo+Pj4+PiAtCj4+Pj4+IC3CoMKgwqAgcGRlID0gKGVu dHJ5IC0gcGFyZW50LT5lbnRyaWVzKSAqIDg7Cj4+Pj4+IC3CoMKgwqAgYW1kZ3B1X3ZtX3VwZGF0 ZV9mdW5jKHAsIHBhcmVudC0+YmFzZS5ibywgcGRlLCBkc3QsIDEsIDAsIGZsYWdzKTsKPj4+Pj4g K8KgwqDCoCAvKiBUaGlzIGludGVudGlvbmFsbHkgd3JhcHMgYXJvdW5kIGlmIG5vIGJpdCBpcyBz ZXQgKi8KPj4+Pj4gK8KgwqDCoCAqZnJhZyA9IG1pbigodW5zaWduZWQpZmZzKHN0YXJ0KSAtIDEs ICh1bnNpZ25lZClmbHM2NChlbmQgLQo+Pj4+PiBzdGFydCkgLSAxKTsKPj4+Pj4gK8KgwqDCoCBp ZiAoKmZyYWcgPj0gbWF4X2ZyYWcpIHsKPj4+Pj4gK8KgwqDCoMKgwqDCoMKgICpmcmFnID0gbWF4 X2ZyYWc7Cj4+Pj4+ICvCoMKgwqDCoMKgwqDCoCAqZnJhZ19lbmQgPSBlbmQgJiB+KCgxVUxMIDw8 IG1heF9mcmFnKSAtIDEpOwo+Pj4+PiArwqDCoMKgIH0gZWxzZSB7Cj4+Pj4+ICvCoMKgwqDCoMKg wqDCoCAqZnJhZ19lbmQgPSBzdGFydCArICgxIDw8ICpmcmFnKTsKPj4+Pj4gK8KgwqDCoCB9Cj4+ Pj4+ICDCoCB9Cj4+Pj4+ICDCoCDCoCAvKioKPj4+Pj4gQEAgLTE1NDUsMTA4ICsxNTc1LDEwNSBA QCBzdGF0aWMgdm9pZAo+Pj4+PiBhbWRncHVfdm1faGFuZGxlX2h1Z2VfcGFnZXMoc3RydWN0IGFt ZGdwdV9wdGVfdXBkYXRlX3BhcmFtcyAqcCwKPj4+Pj4gIMKgwqAgKiAwIGZvciBzdWNjZXNzLCAt RUlOVkFMIGZvciBmYWlsdXJlLgo+Pj4+PiAgwqDCoCAqLwo+Pj4+PiAgwqAgc3RhdGljIGludCBh bWRncHVfdm1fdXBkYXRlX3B0ZXMoc3RydWN0IGFtZGdwdV9wdGVfdXBkYXRlX3BhcmFtcwo+Pj4+ PiAqcGFyYW1zLAo+Pj4+PiAtwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCB1aW50 NjRfdCBzdGFydCwgdWludDY0X3QgZW5kLAo+Pj4+PiAtwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoCB1aW50NjRfdCBkc3QsIHVpbnQ2NF90IGZsYWdzKQo+Pj4+PiArwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgdWludDY0X3Qgc3RhcnQsIHVpbnQ2NF90IGVuZCwKPj4+ Pj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHVpbnQ2NF90IGRzdCwgdWludDY0 X3QgZmxhZ3MpCj4+Pj4+ICDCoCB7Cj4+Pj4+ICDCoMKgwqDCoMKgIHN0cnVjdCBhbWRncHVfZGV2 aWNlICphZGV2ID0gcGFyYW1zLT5hZGV2Owo+Pj4+PiAtwqDCoMKgIGNvbnN0IHVpbnQ2NF90IG1h c2sgPSBBTURHUFVfVk1fUFRFX0NPVU5UKGFkZXYpIC0gMTsKPj4+Pj4gIMKgwqDCoMKgwqAgc3Ry dWN0IGFtZGdwdV92bV9wdF9jdXJzb3IgY3Vyc29yOwo+Pj4+PiArwqDCoMKgIHVpbnQ2NF90IGZy YWdfc3RhcnQgPSBzdGFydCwgZnJhZ19lbmQ7Cj4+Pj4+ICvCoMKgwqAgdW5zaWduZWQgaW50IGZy YWc7Cj4+Pj4+ICDCoCAtwqDCoMKgIC8qIHdhbGsgb3ZlciB0aGUgYWRkcmVzcyBzcGFjZSBhbmQg dXBkYXRlIHRoZSBwYWdlIHRhYmxlcyAqLwo+Pj4+PiAtwqDCoMKgIGZvcl9lYWNoX2FtZGdwdV92 bV9wdF9sZWFmKGFkZXYsIHBhcmFtcy0+dm0sIHN0YXJ0LCBlbmQgLSAxLAo+Pj4+PiBjdXJzb3Ip IHsKPj4+Pj4gK8KgwqDCoCAvKiBmaWd1cmUgb3V0IHRoZSBpbml0aWFsIGZyYWdtZW50ICovCj4+ Pj4+ICvCoMKgwqAgYW1kZ3B1X3ZtX2ZyYWdtZW50KHBhcmFtcywgZnJhZ19zdGFydCwgZW5kLCBm bGFncywgJmZyYWcsCj4+Pj4+ICZmcmFnX2VuZCk7Cj4+Pj4+ICsKPj4+Pj4gK8KgwqDCoCAvKiB3 YWxrIG92ZXIgdGhlIGFkZHJlc3Mgc3BhY2UgYW5kIHVwZGF0ZSB0aGUgUFRzICovCj4+Pj4+ICvC oMKgwqAgYW1kZ3B1X3ZtX3B0X3N0YXJ0KGFkZXYsIHBhcmFtcy0+dm0sIHN0YXJ0LCAmY3Vyc29y KTsKPj4+Pj4gK8KgwqDCoCB3aGlsZSAoY3Vyc29yLnBmbiA8IGVuZCkgewo+Pj4+PiAgwqDCoMKg wqDCoMKgwqDCoMKgIHN0cnVjdCBhbWRncHVfYm8gKnB0ID0gY3Vyc29yLmVudHJ5LT5iYXNlLmJv Owo+Pj4+PiAtwqDCoMKgwqDCoMKgwqAgdWludDY0X3QgcGVfc3RhcnQ7Cj4+Pj4+IC3CoMKgwqDC oMKgwqDCoCB1bnNpZ25lZCBucHRlczsKPj4+Pj4gK8KgwqDCoMKgwqDCoMKgIHVuc2lnbmVkIHNo aWZ0LCBwYXJlbnRfc2hpZnQsIG51bV9lbnRyaWVzOwo+Pj4+PiArwqDCoMKgwqDCoMKgwqAgdWlu dDY0X3QgaW5jciwgZW50cnlfZW5kLCBwZV9zdGFydDsKPj4+Pj4gIMKgIC3CoMKgwqDCoMKgwqDC oCBpZiAoIXB0IHx8IGN1cnNvci5sZXZlbCAhPSBBTURHUFVfVk1fUFRCKQo+Pj4+PiArwqDCoMKg wqDCoMKgwqAgaWYgKCFwdCkKPj4+Pj4gIMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHJldHVy biAtRU5PRU5UOwo+Pj4+PiAgwqAgLcKgwqDCoMKgwqDCoMKgIGlmICgoY3Vyc29yLnBmbiAmIH5t YXNrKSA9PSAoZW5kICYgfm1hc2spKQo+Pj4+PiAtwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBucHRl cyA9IGVuZCAtIGN1cnNvci5wZm47Cj4+Pj4+IC3CoMKgwqDCoMKgwqDCoCBlbHNlCj4+Pj4+IC3C oMKgwqDCoMKgwqDCoMKgwqDCoMKgIG5wdGVzID0gQU1ER1BVX1ZNX1BURV9DT1VOVChhZGV2KSAt IChjdXJzb3IucGZuICYgbWFzayk7Cj4+Pj4+IC0KPj4+Pj4gLcKgwqDCoMKgwqDCoMKgIGFtZGdw dV92bV9oYW5kbGVfaHVnZV9wYWdlcyhwYXJhbXMsIGN1cnNvci5lbnRyeSwKPj4+Pj4gY3Vyc29y LnBhcmVudCwKPj4+Pj4gLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqAgbnB0ZXMsIGRzdCwgZmxhZ3MpOwo+Pj4+PiAtwqDCoMKgwqDCoMKgwqAgLyogV2UgZG9u J3QgbmVlZCB0byB1cGRhdGUgUFRFcyBmb3IgaHVnZSBwYWdlcyAqLwo+Pj4+PiAtwqDCoMKgwqDC oMKgwqAgaWYgKGN1cnNvci5lbnRyeS0+aHVnZSkgewo+Pj4+PiAtwqDCoMKgwqDCoMKgwqDCoMKg wqDCoCBkc3QgKz0gbnB0ZXMgKiBBTURHUFVfR1BVX1BBR0VfU0laRTsKPj4+Pj4gK8KgwqDCoMKg wqDCoMKgIC8qIFRoZSByb290IGxldmVsIGNhbid0IGJlIGEgaHVnZSBwYWdlICovCj4+Pj4+ICvC oMKgwqDCoMKgwqDCoCBpZiAoY3Vyc29yLmxldmVsID09IGFkZXYtPnZtX21hbmFnZXIucm9vdF9s ZXZlbCkgewo+Pj4+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBpZiAoIWFtZGdwdV92bV9wdF9k ZXNjZW5kYW50KGFkZXYsICZjdXJzb3IpKQo+Pj4+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgIHJldHVybiAtRU5PRU5UOwo+Pj4+PiAgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAg Y29udGludWU7Cj4+Pj4+ICDCoMKgwqDCoMKgwqDCoMKgwqAgfQo+Pj4+PiAgwqAgLcKgwqDCoMKg wqDCoMKgIHBlX3N0YXJ0ID0gKGN1cnNvci5wZm4gJiBtYXNrKSAqIDg7Cj4+Pj4+IC3CoMKgwqDC oMKgwqDCoCBhbWRncHVfdm1fdXBkYXRlX2Z1bmMocGFyYW1zLCBwdCwgcGVfc3RhcnQsIGRzdCwg bnB0ZXMsCj4+Pj4+IC3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAg QU1ER1BVX0dQVV9QQUdFX1NJWkUsIGZsYWdzKTsKPj4+Pj4gLcKgwqDCoMKgwqDCoMKgIGRzdCAr PSBucHRlcyAqIEFNREdQVV9HUFVfUEFHRV9TSVpFOwo+Pj4+PiAtwqDCoMKgIH0KPj4+Pj4gLQo+ Pj4+PiAtwqDCoMKgIHJldHVybiAwOwo+Pj4+PiAtfQo+Pj4+PiArwqDCoMKgwqDCoMKgwqAgLyog Rmlyc3QgY2hlY2sgaWYgdGhlIGVudHJ5IGlzIGFscmVhZHkgaGFuZGxlZCAqLwo+Pj4+PiArwqDC oMKgwqDCoMKgwqAgaWYgKGN1cnNvci5wZm4gPCBmcmFnX3N0YXJ0KSB7Cj4+Pj4+ICvCoMKgwqDC oMKgwqDCoMKgwqDCoMKgIGN1cnNvci5lbnRyeS0+aHVnZSA9IHRydWU7Cj4+Pj4+ICvCoMKgwqDC oMKgwqDCoMKgwqDCoMKgIGFtZGdwdV92bV9wdF9uZXh0KGFkZXYsICZjdXJzb3IpOwo+Pj4+PiAr wqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBjb250aW51ZTsKPj4+Pj4gK8KgwqDCoMKgwqDCoMKgIH0K Pj4+Pj4gIMKgIC0vKgo+Pj4+PiAtICogYW1kZ3B1X3ZtX2ZyYWdfcHRlcyAtIGFkZCBmcmFnbWVu dCBpbmZvcm1hdGlvbiB0byBQVEVzCj4+Pj4+IC0gKgo+Pj4+PiAtICogQHBhcmFtczogc2VlIGFt ZGdwdV9wdGVfdXBkYXRlX3BhcmFtcyBkZWZpbml0aW9uCj4+Pj4+IC0gKiBAdm06IHJlcXVlc3Rl ZCB2bQo+Pj4+PiAtICogQHN0YXJ0OiBmaXJzdCBQVEUgdG8gaGFuZGxlCj4+Pj4+IC0gKiBAZW5k OiBsYXN0IFBURSB0byBoYW5kbGUKPj4+Pj4gLSAqIEBkc3Q6IGFkZHIgdGhvc2UgUFRFcyBzaG91 bGQgcG9pbnQgdG8KPj4+Pj4gLSAqIEBmbGFnczogaHcgbWFwcGluZyBmbGFncwo+Pj4+PiAtICoK Pj4+Pj4gLSAqIFJldHVybnM6Cj4+Pj4+IC0gKiAwIGZvciBzdWNjZXNzLCAtRUlOVkFMIGZvciBm YWlsdXJlLgo+Pj4+PiAtICovCj4+Pj4+IC1zdGF0aWMgaW50IGFtZGdwdV92bV9mcmFnX3B0ZXMo c3RydWN0IGFtZGdwdV9wdGVfdXBkYXRlX3BhcmFtcwo+Pj4+PiAqcGFyYW1zLAo+Pj4+PiAtwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHVpbnQ2NF90IHN0YXJ0LCB1aW50NjRfdCBlbmQs Cj4+Pj4+IC3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgdWludDY0X3QgZHN0LCB1aW50 NjRfdCBmbGFncykKPj4+Pj4gLXsKPj4+Pj4gLcKgwqDCoCAvKioKPj4+Pj4gLcKgwqDCoMKgICog VGhlIE1DIEwxIFRMQiBzdXBwb3J0cyB2YXJpYWJsZSBzaXplZCBwYWdlcywgYmFzZWQgb24gYQo+ Pj4+PiBmcmFnbWVudAo+Pj4+PiAtwqDCoMKgwqAgKiBmaWVsZCBpbiB0aGUgUFRFLiBXaGVuIHRo aXMgZmllbGQgaXMgc2V0IHRvIGEgbm9uLXplcm8KPj4+Pj4gdmFsdWUsIHBhZ2UKPj4+Pj4gLcKg wqDCoMKgICogZ3JhbnVsYXJpdHkgaXMgaW5jcmVhc2VkIGZyb20gNEtCIHRvICgxIDw8ICgxMiAr IGZyYWcpKS4KPj4+Pj4gVGhlIFBURQo+Pj4+PiAtwqDCoMKgwqAgKiBmbGFncyBhcmUgY29uc2lk ZXJlZCB2YWxpZCBmb3IgYWxsIFBURXMgd2l0aGluIHRoZSBmcmFnbWVudAo+Pj4+PiByYW5nZQo+ Pj4+PiAtwqDCoMKgwqAgKiBhbmQgY29ycmVzcG9uZGluZyBtYXBwaW5ncyBhcmUgYXNzdW1lZCB0 byBiZSBwaHlzaWNhbGx5Cj4+Pj4+IGNvbnRpZ3VvdXMuCj4+Pj4+IC3CoMKgwqDCoCAqCj4+Pj4+ IC3CoMKgwqDCoCAqIFRoZSBMMSBUTEIgY2FuIHN0b3JlIGEgc2luZ2xlIFBURSBmb3IgdGhlIHdo b2xlIGZyYWdtZW50LAo+Pj4+PiAtwqDCoMKgwqAgKiBzaWduaWZpY2FudGx5IGluY3JlYXNpbmcg dGhlIHNwYWNlIGF2YWlsYWJsZSBmb3IgdHJhbnNsYXRpb24KPj4+Pj4gLcKgwqDCoMKgICogY2Fj aGluZy4gVGhpcyBsZWFkcyB0byBsYXJnZSBpbXByb3ZlbWVudHMgaW4gdGhyb3VnaHB1dAo+Pj4+ PiB3aGVuIHRoZQo+Pj4+PiAtwqDCoMKgwqAgKiBUTEIgaXMgdW5kZXIgcHJlc3N1cmUuCj4+Pj4+ IC3CoMKgwqDCoCAqCj4+Pj4+IC3CoMKgwqDCoCAqIFRoZSBMMiBUTEIgZGlzdHJpYnV0ZXMgc21h bGwgYW5kIGxhcmdlIGZyYWdtZW50cyBpbnRvIHR3bwo+Pj4+PiAtwqDCoMKgwqAgKiBhc3ltbWV0 cmljIHBhcnRpdGlvbnMuIFRoZSBsYXJnZSBmcmFnbWVudCBjYWNoZSBpcwo+Pj4+PiBzaWduaWZp Y2FudGx5Cj4+Pj4+IC3CoMKgwqDCoCAqIGxhcmdlci4gVGh1cywgd2UgdHJ5IHRvIHVzZSBsYXJn ZSBmcmFnbWVudHMgd2hlcmV2ZXIgcG9zc2libGUuCj4+Pj4+IC3CoMKgwqDCoCAqIFVzZXJzcGFj ZSBjYW4gc3VwcG9ydCB0aGlzIGJ5IGFsaWduaW5nIHZpcnR1YWwgYmFzZSBhZGRyZXNzCj4+Pj4+ IGFuZAo+Pj4+PiAtwqDCoMKgwqAgKiBhbGxvY2F0aW9uIHNpemUgdG8gdGhlIGZyYWdtZW50IHNp emUuCj4+Pj4+IC3CoMKgwqDCoCAqLwo+Pj4+PiAtwqDCoMKgIHVuc2lnbmVkIG1heF9mcmFnID0g cGFyYW1zLT5hZGV2LT52bV9tYW5hZ2VyLmZyYWdtZW50X3NpemU7Cj4+Pj4+IC3CoMKgwqAgaW50 IHI7Cj4+Pj4+ICvCoMKgwqDCoMKgwqDCoCAvKiBJZiBpdCBpc24ndCBhbHJlYWR5IGhhbmRsZWQg aXQgY2FuJ3QgYmUgYSBodWdlIHBhZ2UgKi8KPj4+Pj4gK8KgwqDCoMKgwqDCoMKgIGlmIChjdXJz b3IuZW50cnktPmh1Z2UpIHsKPj4+Pj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqAgLyogQWRkIHRo ZSBlbnRyeSB0byB0aGUgcmVsb2NhdGVkIGxpc3QgdG8gdXBkYXRlIGl0LiAqLwo+Pj4+PiArwqDC oMKgwqDCoMKgwqDCoMKgwqDCoCBjdXJzb3IuZW50cnktPmh1Z2UgPSBmYWxzZTsKPj4+Pj4gKyBh bWRncHVfdm1fYm9fcmVsb2NhdGVkKCZjdXJzb3IuZW50cnktPmJhc2UpOwo+Pj4+PiArwqDCoMKg wqDCoMKgwqAgfQo+Pj4+PiAgwqAgLcKgwqDCoCAvKiBzeXN0ZW0gcGFnZXMgYXJlIG5vbiBjb250 aW51b3VzbHkgKi8KPj4+Pj4gLcKgwqDCoCBpZiAocGFyYW1zLT5zcmMgfHwgIShmbGFncyAmIEFN REdQVV9QVEVfVkFMSUQpKQo+Pj4+PiAtwqDCoMKgwqDCoMKgwqAgcmV0dXJuIGFtZGdwdV92bV91 cGRhdGVfcHRlcyhwYXJhbXMsIHN0YXJ0LCBlbmQsIGRzdCwgZmxhZ3MpOwo+Pj4+PiAtCj4+Pj4+ IC3CoMKgwqAgd2hpbGUgKHN0YXJ0ICE9IGVuZCkgewo+Pj4+PiAtwqDCoMKgwqDCoMKgwqAgdWlu dDY0X3QgZnJhZ19mbGFncywgZnJhZ19lbmQ7Cj4+Pj4+IC3CoMKgwqDCoMKgwqDCoCB1bnNpZ25l ZCBmcmFnOwo+Pj4+PiAtCj4+Pj4+IC3CoMKgwqDCoMKgwqDCoCAvKiBUaGlzIGludGVudGlvbmFs bHkgd3JhcHMgYXJvdW5kIGlmIG5vIGJpdCBpcyBzZXQgKi8KPj4+Pj4gLcKgwqDCoMKgwqDCoMKg IGZyYWcgPSBtaW4oKHVuc2lnbmVkKWZmcyhzdGFydCkgLSAxLAo+Pj4+PiAtwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoCAodW5zaWduZWQpZmxzNjQoZW5kIC0gc3RhcnQpIC0gMSk7Cj4+Pj4+ IC3CoMKgwqDCoMKgwqDCoCBpZiAoZnJhZyA+PSBtYXhfZnJhZykgewo+Pj4+PiAtwqDCoMKgwqDC oMKgwqDCoMKgwqDCoCBmcmFnX2ZsYWdzID0gQU1ER1BVX1BURV9GUkFHKG1heF9mcmFnKTsKPj4+ Pj4gLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgZnJhZ19lbmQgPSBlbmQgJiB+KCgxVUxMIDw8IG1h eF9mcmFnKSAtIDEpOwo+Pj4+PiAtwqDCoMKgwqDCoMKgwqAgfSBlbHNlIHsKPj4+Pj4gLcKgwqDC oMKgwqDCoMKgwqDCoMKgwqAgZnJhZ19mbGFncyA9IEFNREdQVV9QVEVfRlJBRyhmcmFnKTsKPj4+ Pj4gLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgZnJhZ19lbmQgPSBzdGFydCArICgxIDw8IGZyYWcp Owo+Pj4+PiArwqDCoMKgwqDCoMKgwqAgc2hpZnQgPSBhbWRncHVfdm1fbGV2ZWxfc2hpZnQoYWRl diwgY3Vyc29yLmxldmVsKTsKPj4+Pj4gK8KgwqDCoMKgwqDCoMKgIHBhcmVudF9zaGlmdCA9IGFt ZGdwdV92bV9sZXZlbF9zaGlmdChhZGV2LCBjdXJzb3IubGV2ZWwgLSAxKTsKPj4+Pj4gK8KgwqDC oMKgwqDCoMKgIGlmIChhZGV2LT5hc2ljX3R5cGUgPCBDSElQX1ZFR0ExMCkgewo+Pj4+PiArwqDC oMKgwqDCoMKgwqDCoMKgwqDCoCAvKiBObyBodWdlIHBhZ2Ugc3VwcG9ydCBiZWZvcmUgR01DIHY5 ICovCj4+Pj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGlmIChjdXJzb3IubGV2ZWwgIT0gQU1E R1BVX1ZNX1BUQikgewo+Pj4+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGlmICgh YW1kZ3B1X3ZtX3B0X2Rlc2NlbmRhbnQoYWRldiwgJmN1cnNvcikpCj4+Pj4+ICvCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCByZXR1cm4gLUVOT0VOVDsKPj4+Pj4gK8KgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBjb250aW51ZTsKPj4+Pj4gK8KgwqDCoMKgwqDCoMKg wqDCoMKgwqAgfQo+Pj4+PiArwqDCoMKgwqDCoMKgwqAgfSBlbHNlIGlmIChmcmFnIDwgc2hpZnQp IHsKPj4+Pj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqAgLyogV2UgY2FuJ3QgdXNlIHRoaXMgbGV2 ZWwgd2hlbiB0aGUgZnJhZ21lbnQgc2l6ZSBpcwo+Pj4+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgICogc21hbGxlciB0aGFuIHRoZSBhZGRyZXNzIHNoaWZ0LiBHbyB0byB0aGUgbmV4dAo+Pj4+ PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgICogY2hpbGQgZW50cnkgYW5kIHRyeSBhZ2Fpbi4K Pj4+Pj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCAqLwo+Pj4+PiArwqDCoMKgwqDCoMKgwqDC oMKgwqDCoCBpZiAoIWFtZGdwdV92bV9wdF9kZXNjZW5kYW50KGFkZXYsICZjdXJzb3IpKQo+Pj4+ PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHJldHVybiAtRU5PRU5UOwo+Pj4+PiAr wqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBjb250aW51ZTsKPj4+Pj4gK8KgwqDCoMKgwqDCoMKgIH0g ZWxzZSBpZiAoZnJhZyA+PSBwYXJlbnRfc2hpZnQpIHsKPj4+Pj4gK8KgwqDCoMKgwqDCoMKgwqDC oMKgwqAgLyogSWYgdGhlIGZyYWdtZW50IHNpemUgaXMgZXZlbiBsYXJnZXIgdGhhbiB0aGUgcGFy ZW50Cj4+Pj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgKiBzaGlmdCB3ZSBzaG91bGQgZ28g dXAgb25lIGxldmVsIGFuZCBjaGVjayBpdCBhZ2Fpbi4KPj4+Pj4gK8KgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoCAqLwo+Pj4+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBpZiAoIWFtZGdwdV92bV9w dF9hbmNlc3RvcigmY3Vyc29yKSkKPj4+Pj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oCByZXR1cm4gLUVOT0VOVDsKPj4+Pj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqAgY29udGludWU7 Cj4+Pj4+ICDCoMKgwqDCoMKgwqDCoMKgwqAgfQo+Pj4+PiAgwqAgLcKgwqDCoMKgwqDCoMKgIHIg PSBhbWRncHVfdm1fdXBkYXRlX3B0ZXMocGFyYW1zLCBzdGFydCwgZnJhZ19lbmQsIGRzdCwKPj4+ Pj4gLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBmbGFncyB8IGZy YWdfZmxhZ3MpOwo+Pj4+PiAtwqDCoMKgwqDCoMKgwqAgaWYgKHIpCj4+Pj4+IC3CoMKgwqDCoMKg wqDCoMKgwqDCoMKgIHJldHVybiByOwo+Pj4+PiArwqDCoMKgwqDCoMKgwqAgLyogTG9va3MgZ29v ZCBzbyBmYXIsIGNhbGN1bGF0ZSBwYXJhbWV0ZXJzIGZvciB0aGUgdXBkYXRlICovCj4+Pj4+ICvC oMKgwqDCoMKgwqDCoCBpbmNyID0gQU1ER1BVX0dQVV9QQUdFX1NJWkUgPDwgc2hpZnQ7Cj4+Pj4+ ICvCoMKgwqDCoMKgwqDCoCBudW1fZW50cmllcyA9IGFtZGdwdV92bV9udW1fZW50cmllcyhhZGV2 LCBjdXJzb3IubGV2ZWwpOwo+Pj4+PiArwqDCoMKgwqDCoMKgwqAgcGVfc3RhcnQgPSAoKGN1cnNv ci5wZm4gPj4gc2hpZnQpICYgKG51bV9lbnRyaWVzIC0gMSkpICogODsKPj4+Pj4gK8KgwqDCoMKg wqDCoMKgIGVudHJ5X2VuZCA9IG51bV9lbnRyaWVzIDw8IHNoaWZ0Owo+Pj4+PiArwqDCoMKgwqDC oMKgwqAgZW50cnlfZW5kICs9IGN1cnNvci5wZm4gJiB+KGVudHJ5X2VuZCAtIDEpOwo+Pj4+PiAr wqDCoMKgwqDCoMKgwqAgZW50cnlfZW5kID0gbWluKGVudHJ5X2VuZCwgZW5kKTsKPj4+Pj4gKwo+ Pj4+PiArwqDCoMKgwqDCoMKgwqAgZG8gewo+Pj4+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCB1 aW50NjRfdCB1cGRfZW5kID0gbWluKGVudHJ5X2VuZCwgZnJhZ19lbmQpOwo+Pj4+PiArwqDCoMKg wqDCoMKgwqDCoMKgwqDCoCB1bnNpZ25lZCBucHRlcyA9ICh1cGRfZW5kIC0gZnJhZ19zdGFydCkg Pj4gc2hpZnQ7Cj4+Pj4+ICsKPj4+Pj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqAgYW1kZ3B1X3Zt X3VwZGF0ZV9odWdlKHBhcmFtcywgcHQsIGN1cnNvci5sZXZlbCwKPj4+Pj4gK8KgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHBlX3N0YXJ0LCBkc3QsIG5w dGVzLCBpbmNyLAo+Pj4+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqAgZmxhZ3MgfCBBTURHUFVfUFRFX0ZSQUcoZnJhZykpOwo+Pj4+PiArCj4+Pj4+ ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHBlX3N0YXJ0ICs9IG5wdGVzICogODsKPj4+Pj4gK8Kg wqDCoMKgwqDCoMKgwqDCoMKgwqAgZHN0ICs9IG5wdGVzICogQU1ER1BVX0dQVV9QQUdFX1NJWkUg PDwgc2hpZnQ7Cj4+Pj4+ICsKPj4+Pj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqAgZnJhZ19zdGFy dCA9IHVwZF9lbmQ7Cj4+Pj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGlmIChmcmFnX3N0YXJ0 ID49IGZyYWdfZW5kKSB7Cj4+Pj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgLyog ZmlndXJlIG91dCB0aGUgbmV4dCBmcmFnbWVudCAqLwo+Pj4+PiArwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgIGFtZGdwdV92bV9mcmFnbWVudChwYXJhbXMsIGZyYWdfc3RhcnQsIGVuZCwK Pj4+Pj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqAgZmxhZ3MsICZmcmFnLCAmZnJhZ19lbmQpOwo+Pj4+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgIGlmIChmcmFnIDwgc2hpZnQpCj4+Pj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoCBicmVhazsKPj4+Pj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqAgfQo+ Pj4+PiArwqDCoMKgwqDCoMKgwqAgfSB3aGlsZSAoZnJhZ19zdGFydCA8IGVudHJ5X2VuZCk7Cj4+ Pj4+ICDCoCAtwqDCoMKgwqDCoMKgwqAgZHN0ICs9IChmcmFnX2VuZCAtIHN0YXJ0KSAqIEFNREdQ VV9HUFVfUEFHRV9TSVpFOwo+Pj4+PiAtwqDCoMKgwqDCoMKgwqAgc3RhcnQgPSBmcmFnX2VuZDsK Pj4+Pj4gK8KgwqDCoMKgwqDCoMKgIGlmIChmcmFnID49IHNoaWZ0KQo+Pj4+PiArwqDCoMKgwqDC oMKgwqDCoMKgwqDCoCBhbWRncHVfdm1fcHRfbmV4dChhZGV2LCAmY3Vyc29yKTsKPj4+Pj4gIMKg wqDCoMKgwqAgfQo+Pj4+PiAgwqAgwqDCoMKgwqDCoCByZXR1cm4gMDsKPj4+Pj4gQEAgLTE3MDgs OCArMTczNSw4IEBAIHN0YXRpYyBpbnQgYW1kZ3B1X3ZtX2JvX3VwZGF0ZV9tYXBwaW5nKHN0cnVj dAo+Pj4+PiBhbWRncHVfZGV2aWNlICphZGV2LAo+Pj4+PiAgwqAgwqDCoMKgwqDCoMKgwqDCoMKg IHBhcmFtcy5mdW5jID0gYW1kZ3B1X3ZtX2NwdV9zZXRfcHRlczsKPj4+Pj4gIMKgwqDCoMKgwqDC oMKgwqDCoCBwYXJhbXMucGFnZXNfYWRkciA9IHBhZ2VzX2FkZHI7Cj4+Pj4+IC3CoMKgwqDCoMKg wqDCoCByZXR1cm4gYW1kZ3B1X3ZtX2ZyYWdfcHRlcygmcGFyYW1zLCBzdGFydCwgbGFzdCArIDEs Cj4+Pj4+IC3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBhZGRy LCBmbGFncyk7Cj4+Pj4+ICvCoMKgwqDCoMKgwqDCoCByZXR1cm4gYW1kZ3B1X3ZtX3VwZGF0ZV9w dGVzKCZwYXJhbXMsIHN0YXJ0LCBsYXN0ICsgMSwKPj4+Pj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBhZGRyLCBmbGFncyk7Cj4+Pj4+ICDCoMKgwqDC oMKgIH0KPj4+Pj4gIMKgIMKgwqDCoMKgwqAgcmluZyA9IGNvbnRhaW5lcl9vZih2bS0+ZW50aXR5 LnJxLT5zY2hlZCwgc3RydWN0Cj4+Pj4+IGFtZGdwdV9yaW5nLCBzY2hlZCk7Cj4+Pj4+IEBAIC0x Nzg4LDcgKzE4MTUsNyBAQCBzdGF0aWMgaW50IGFtZGdwdV92bV9ib191cGRhdGVfbWFwcGluZyhz dHJ1Y3QKPj4+Pj4gYW1kZ3B1X2RldmljZSAqYWRldiwKPj4+Pj4gIMKgwqDCoMKgwqAgaWYgKHIp Cj4+Pj4+ICDCoMKgwqDCoMKgwqDCoMKgwqAgZ290byBlcnJvcl9mcmVlOwo+Pj4+PiAgwqAgLcKg wqDCoCByID0gYW1kZ3B1X3ZtX2ZyYWdfcHRlcygmcGFyYW1zLCBzdGFydCwgbGFzdCArIDEsIGFk ZHIsIGZsYWdzKTsKPj4+Pj4gK8KgwqDCoCByID0gYW1kZ3B1X3ZtX3VwZGF0ZV9wdGVzKCZwYXJh bXMsIHN0YXJ0LCBsYXN0ICsgMSwgYWRkciwgZmxhZ3MpOwo+Pj4+PiAgwqDCoMKgwqDCoCBpZiAo cikKPj4+Pj4gIMKgwqDCoMKgwqDCoMKgwqDCoCBnb3RvIGVycm9yX2ZyZWU7Cj4+Pj4+Cj4gX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KPiBhbWQtZ2Z4IG1h aWxpbmcgbGlzdAo+IGFtZC1nZnhAbGlzdHMuZnJlZWRlc2t0b3Aub3JnCj4gaHR0cHM6Ly9saXN0 cy5mcmVlZGVza3RvcC5vcmcvbWFpbG1hbi9saXN0aW5mby9hbWQtZ2Z4CgpfX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwphbWQtZ2Z4IG1haWxpbmcgbGlzdAph bWQtZ2Z4QGxpc3RzLmZyZWVkZXNrdG9wLm9yZwpodHRwczovL2xpc3RzLmZyZWVkZXNrdG9wLm9y Zy9tYWlsbWFuL2xpc3RpbmZvL2FtZC1nZngK