From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from mm01.cs.columbia.edu (mm01.cs.columbia.edu [128.59.11.253]) by smtp.lore.kernel.org (Postfix) with ESMTP id 98D97C433F5 for ; Thu, 27 Jan 2022 13:18:00 +0000 (UTC) Received: from localhost (localhost [127.0.0.1]) by mm01.cs.columbia.edu (Postfix) with ESMTP id 1032849F02; Thu, 27 Jan 2022 08:18:00 -0500 (EST) X-Virus-Scanned: at lists.cs.columbia.edu Authentication-Results: mm01.cs.columbia.edu (amavisd-new); dkim=softfail (fail, message has been altered) header.i=@redhat.com Received: from mm01.cs.columbia.edu ([127.0.0.1]) by localhost (mm01.cs.columbia.edu [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id QN6bpo2NjIQV; Thu, 27 Jan 2022 08:17:53 -0500 (EST) Received: from mm01.cs.columbia.edu (localhost [127.0.0.1]) by mm01.cs.columbia.edu (Postfix) with ESMTP id AC70C49F18; Thu, 27 Jan 2022 08:17:53 -0500 (EST) Received: from localhost (localhost [127.0.0.1]) by mm01.cs.columbia.edu (Postfix) with ESMTP id 6C87849F02 for ; Thu, 27 Jan 2022 08:17:52 -0500 (EST) X-Virus-Scanned: at lists.cs.columbia.edu Received: from mm01.cs.columbia.edu ([127.0.0.1]) by localhost (mm01.cs.columbia.edu [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id zjsWBeT+kBTC for ; Thu, 27 Jan 2022 08:17:50 -0500 (EST) Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.129.124]) by mm01.cs.columbia.edu (Postfix) with ESMTP id ED66849F00 for ; Thu, 27 Jan 2022 08:17:49 -0500 (EST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1643289469; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=quNV7QiDJuWYENkY3uXPAoFpSOJDshvxFzH3jG4pZsA=; b=QzUO4aziyayvidv0GpPn9f3JZtveokx1QxjYuVPFmpn3QeYhF96SGnGXUET3FjnY4zqMlS 4z1lfwcIE5AiXNzUdouBGEsoz1k+hChnTMjYWZWIAZBuzzXuq2z0wDd2AkRKbWDuG08frr Abc9loqB1sj/YcAVVima7x1BNyoYv/g= Received: from mail-wm1-f70.google.com (mail-wm1-f70.google.com [209.85.128.70]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id us-mta-19-SpSlog0fM1Gi-ZLsLAIsHg-1; Thu, 27 Jan 2022 08:17:48 -0500 X-MC-Unique: SpSlog0fM1Gi-ZLsLAIsHg-1 Received: by mail-wm1-f70.google.com with SMTP id bg23-20020a05600c3c9700b0034bb19dfdc0so630667wmb.1 for ; Thu, 27 Jan 2022 05:17:48 -0800 (PST) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:subject:to:cc:references:from:message-id:date :user-agent:mime-version:in-reply-to:content-language :content-transfer-encoding; bh=quNV7QiDJuWYENkY3uXPAoFpSOJDshvxFzH3jG4pZsA=; b=NAnjV2Cg/x9j1sJFqSR6UU7Lmqzv5qkqgGxiA/Xq5glSpJwJzu9Juw9RUqI/+1sbvR hAUewwqDSzFe0RAKBvPiQE15cbk2ONoXOwX+lOdC2KKRfBt0jyTnqrGtSYFCGse3VS4i ah1JOdZGqYcN0nF4xRegP9Mg2rpjrCbS9uzSvWzL+8+xK01yhOxk9fu9EgFMDGK9L0e/ gdKfwH+Dd0OJs6fPXdspxeVndzxhVJWGNNZx+86i5Gc9ea/BrbxdeGO1YhCV9XJ1MAr0 PZQtqgUas8uAeHh28A6h8GbCXWbHN5y7NNj69KXqPnrNitcyGuRv3mm5H+FLDMOblcIy DRAg== X-Gm-Message-State: AOAM531iNhEfzEjJR+K8ZMNtgi+pdgA8De60NT8Y2ud0eSwQQMf3jWJf Gi/LUge9dw5of/3fI12l2G+k2r9T7dCaKE901ymhpYZ94mNfj9BAae/jFqktnE0t3b2zCZQMZtC rchi6LR3J2AxSCL0TGMzbkNPc X-Received: by 2002:adf:db0a:: with SMTP id s10mr3073185wri.267.1643289465453; Thu, 27 Jan 2022 05:17:45 -0800 (PST) X-Google-Smtp-Source: ABdhPJxlUJXRMO7owUEpQK9JMFUrslMP5gbTww4o6W4bhgGMe4i+pU39D/5BzhF+2L5LDzXSDLIMig== X-Received: by 2002:adf:db0a:: with SMTP id s10mr3073101wri.267.1643289464168; Thu, 27 Jan 2022 05:17:44 -0800 (PST) Received: from ?IPv6:2a01:e0a:59e:9d80:527b:9dff:feef:3874? ([2a01:e0a:59e:9d80:527b:9dff:feef:3874]) by smtp.gmail.com with ESMTPSA id u19sm1887305wmm.39.2022.01.27.05.17.42 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Thu, 27 Jan 2022 05:17:43 -0800 (PST) Subject: Re: [PATCH v4 02/21] KVM: arm64: Add SDEI virtualization infrastructure To: Gavin Shan , kvmarm@lists.cs.columbia.edu References: <20210815001352.81927-1-gshan@redhat.com> <20210815001352.81927-3-gshan@redhat.com> <8108db38-e0fa-774b-c884-70b8606a3ab9@redhat.com> From: Eric Auger Message-ID: <78c08701-324d-e519-2817-a923d282554a@redhat.com> Date: Thu, 27 Jan 2022 14:17:42 +0100 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:78.0) Gecko/20100101 Thunderbird/78.10.1 MIME-Version: 1.0 In-Reply-To: Authentication-Results: relay.mimecast.com; auth=pass smtp.auth=CUSA124A263 smtp.mailfrom=eauger@redhat.com X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Language: en-US Cc: maz@kernel.org, pbonzini@redhat.com, will@kernel.org, linux-kernel@vger.kernel.org, Jonathan.Cameron@huawei.com X-BeenThere: kvmarm@lists.cs.columbia.edu X-Mailman-Version: 2.1.14 Precedence: list List-Id: Where KVM/ARM decisions are made List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Errors-To: kvmarm-bounces@lists.cs.columbia.edu Sender: kvmarm-bounces@lists.cs.columbia.edu SGkgR2F2aW4sCgpPbiAxLzExLzIyIDEwOjIwIEFNLCBHYXZpbiBTaGFuIHdyb3RlOgo+IEhpIEVy aWMsCj4gCj4gT24gMTEvOS8yMSAxMTo0NSBQTSwgRXJpYyBBdWdlciB3cm90ZToKPj4gT24gOC8x NS8yMSAyOjEzIEFNLCBHYXZpbiBTaGFuIHdyb3RlOgo+Pj4gU29mdHdhcmUgRGVsZWdhdGVkIEV4 Y2VwdGlvbiBJbnRlcmZhY2UgKFNERUkpIHByb3ZpZGVzIGEgbWVjaGFuaXNtIGZvcgo+Pj4gcmVn aXN0ZXJpbmcgYW5kIHNlcnZpY2luZyBzeXN0ZW0gZXZlbnRzLiBUaG9zZSBzeXN0ZW0gZXZlbnRz IGFyZSBoaWdoCj4+PiBwcmlvcml0eSBldmVudHMsIHdoaWNoIG11c3QgYmUgc2VydmljZWQgaW1t ZWRpYXRlbHkuIEl0J3MgZ29pbmcgdG8gYmUKPj4+IHVzZWQgYnkgQXN5bmNocm9ub3VzIFBhZ2Ug RmF1bHQgKEFQRikgdG8gZGVsaXZlciBub3RpZmljYXRpb24gZnJvbSBLVk0KPj4+IHRvIGd1ZXN0 LiBJdCdzIG5vdGVkIHRoYXQgU0RFSSBpcyBkZWZpbmVkIGJ5IEFSTSBERU4wMDU0QSBzcGVjaWZp Y2F0aW9uLgo+Pj4KPj4+IFRoaXMgaW50cm9kdWNlcyBTREVJIHZpcnR1YWxpemF0aW9uIGluZnJh c3RydWN0dXJlIHdoZXJlIHRoZSBTREVJIGV2ZW50cwo+Pj4gYXJlIHJlZ2lzdGVyZWQgYW5kIG1h bnVwbGF0ZWQgYnkgdGhlIGd1ZXN0IHRocm91Z2ggaHlwZXJjYWxsLiBUaGUgU0RFSQo+PiBtYW5p cHVsYXRlZAo+IAo+IFRoYW5rcywgSXQgd2lsbCBiZSBjb3JyZWN0ZWQgaW4gbmV4dCByZXNwaW4u Cj4gCj4+PiBldmVudCBpcyBkZWxpdmVyZWQgdG8gb25lIHNwZWNpZmljIHZDUFUgYnkgS1ZNIG9u Y2UgaXQncyByYWlzZWQuIFRoaXMKPj4+IGludHJvZHVjZXMgZGF0YSBzdHJ1Y3R1cmVzIHRvIHJl cHJlc2VudCB0aGUgbmVlZGVkIG9iamVjdHMgdG8gaW1wbGVtZW50Cj4+PiB0aGUgZmVhdHVyZSwg d2hpY2ggaXMgaGlnaGxpZ2h0ZWQgYXMgYmVsb3cuIEFzIHRob3NlIG9iamVjdHMgY291bGQgYmUK Pj4+IG1pZ3JhdGVkIGJldHdlZW4gVk1zLCB0aGVzZSBkYXRhIHN0cnVjdHVyZXMgYXJlIHBhcnRp YWxseSBleHBvcnRlZCB0bwo+Pj4gdXNlciBzcGFjZS4KPj4+Cj4+PiDCoMKgwqAgKiBrdm1fc2Rl aV9ldmVudAo+Pj4gwqDCoMKgwqDCoCBTREVJIGV2ZW50cyBhcmUgZXhwb3J0ZWQgZnJvbSBLVk0g c28gdGhhdCBndWVzdCBpcyBhYmxlIHRvCj4+PiByZWdpc3Rlcgo+Pj4gwqDCoMKgwqDCoCBhbmQg bWFudXBsYXRlLgo+PiBtYW5pcHVsYXRlCj4gCj4gVGhhbmtzLCBJdCB3aWxsIGJlIGZpeGVkIGlu IG5leHQgcmVzcGluLiBJJ20gdW5jZXJ0YWluIGhvdyB0aGUgd3JvbmcKPiBzcGVsbGluZyBhcmUg c3RpbGwgZXhpc3RpbmcgZXZlbiB0aG91Z2ggSSBoYWQgc3BlbGxpbmcgY2hlY2sgd2l0aAo+ICJz Y3JpcHRzL2NoZWNrcGF0Y2gucGwgLS1jb2Rlc3BlbGwiLgpJIGRvbid0IGtub3cuIEkgYW0gbm90 IHVzZWQgdG8gaXQgOigKPiAKPj4+IMKgwqDCoCAqIGt2bV9zZGVpX2t2bV9ldmVudAo+Pj4gwqDC oMKgwqDCoCBTREVJIGV2ZW50IHRoYXQgaGFzIGJlZW4gcmVnaXN0ZXJlZCBieSBndWVzdC4KPj4g SSB3b3VsZCByZWNvbW1lbnQgdG8gcmV2aXNpdCB0aGUgbmFtZXMuIFdoeSBrdm0gZXZlbnQ/IFdo eSBub3QKPj4gcmVnaXN0ZXJlZF9ldmVudCBpbnN0ZWFkIHRoYXQgYWN0dWFsbHkgd291bGQgdGVs bCB3aGF0IGl0IGl0cy4gYWxzbyB5b3UKPj4gaGF2ZSBrdm0gdHdpY2UgaW4gdGhlIHN0cnVjdCBu YW1lLgo+IAo+IFllcCwgSSB0aGluayBJIG5lZWQgcmVjb25zaWRlciB0aGUgc3RydWN0IG5hbWVz LiBUaGUgcHJpbWFyeSByZWFzb24KPiB3aHkgSSBoYWQgdGhlIG5hbWVzIGFyZSBrZWVwaW5nIHRo ZSBzdHJ1Y3QgbmFtZXMgc2hvcnQgZW5vdWdoIHdoaWxlCj4gYmVpbmcgZWFzeSB0byBiZSBpZGVu dGlmaWVkOiAia3ZtX3NkZWkiIGlzIHRoZSBwcmVmaXguIEhvdyBhYm91dCB0bwo+IGhhdmUgdGhl IGZvbGxvd2luZyBzdHJ1Y3QgbmFtZXM/CmFsc28ga3ZtX3NkZWlfa3ZtIGxvb2tzIGF3a3dhcmQg dG8gbWUuIHNpbmNlIGl0IGlzIGFyY2ggc3BlY2lmaWMsCmNvdWxkbid0IHlvdSBuYW1lIGt2bV9z ZGVpX2FyY2g/Cj4gCj4gwqDCoMKgIGt2bV9zZGVpX2V2ZW50wqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgIGV2ZW50cyBleHBvcnRlZCBmcm9tIEtWTSB0byB1c2Vyc3BhY2UKPiDCoMKgwqAga3ZtX3Nk ZWlfa2V2ZW50wqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBldmVudHMgcmVnaXN0ZXJlZCAoYXNzb2Np YXRlZCkgdG8gS1ZNCkkgc3RpbGwgZG9uJ3QgZmluZCBrZXZlbnQgc2VsZiBleHBsYW5hdG9yeS4g YW5kIGV2ZW4gY29uZnVzaW5nIGJlY2F1c2UKaXQgbWFrZXMgbWUgdGhpbmsgb2YgZXZlbnRzIGV4 cG9zZWQgYnkga3ZtLgoKVG8gbWUgdGhlcmUgYXJlIGV4cG9zZWQgZXZlbnRzIGFuZCByZWdpc3Rl cmVkIGV2ZW50cyBhbmQgSSB0aGluayBpdAp3b3VsZCBiZSBzaW1wbGVyIHRvIHN0aWNrIHRvIHRo aXMgdGVybWlub2xvZ3kuIEkgd291bGQgcmF0aGVyIHJlbmFtZQprZXZlbnQgaW50byByZWdpc3Rl cmVkX2V2ZW50Lgo+IMKgwqDCoCBrdm1fc2RlaV92ZXZlbnTCoMKgwqDCoMKgwqDCoMKgwqDCoMKg IGV2ZW50cyBhc3NvY2lhdGVkIHdpdGggdkNQVQpzL3ZldmVudC92Y3B1X2V2ZW50IG90aGVyd2lz ZSBzb3VuZHMgbGlrZSB2aXJ0dWFsIGV2ZW50Cj4gwqDCoMKgIGt2bV9zZGVpX3ZjcHXCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoCB2Q1BVIGNvbnRleHQgZm9yIGV2ZW50IGRlbGl2ZXJ5Cj4gCj4+ PiDCoMKgwqAgKiBrdm1fc2RlaV9rdm1fdmNwdQo+PiBEaWRuJ3QgeW91IG1lYW4ga3ZtX3NkZWlf dmNwdV9ldmVudCBpbnN0ZWFkPwo+IAo+IFllYWgsIHlvdSdyZSBjb3JyZWN0LiBJIHdhcyBzdXBw b3NlZCB0byBleHBsYWluIGt2bV9zZGVpX3ZjcHVfZXZlbnQgaGVyZS4KPiAKPj4+IMKgwqDCoMKg wqAgU0RFSSBldmVudCB0aGF0IGhhcyBiZWVuIGRlbGl2ZXJlZCB0byB0aGUgdGFyZ2V0IHZDUFUu Cj4+PiDCoMKgwqAgKiBrdm1fc2RlaV9rdm0KPj4+IMKgwqDCoMKgwqAgUGxhY2UgaG9sZGVyIG9m IGV4cG9ydGVkIGFuZCByZWdpc3RlcmVkIFNERUkgZXZlbnRzLgo+Pj4gwqDCoMKgICoga3ZtX3Nk ZWlfdmNwdQo+Pj4gwqDCoMKgwqDCoCBBdXhpbGlhcnkgb2JqZWN0IHRvIHNhdmUgdGhlIHByZWVt cHRlZCBjb250ZXh0IGR1cmluZyBTREVJIGV2ZW50Cj4+PiDCoMKgwqDCoMKgIGRlbGl2ZXJ5Lgo+ Pj4KPj4+IFRoZSBlcnJvciBpcyByZXR1cm5lZCBmb3IgYWxsIFNERUkgaHlwZXJjYWxscyBmb3Ig bm93LiBUaGV5IHdpbGwgYmUKPj4+IGltcGxlbWVudGVkIGJ5IHRoZSBzdWJzZXF1ZW50IHBhdGNo ZXMuCj4+Pgo+Pj4gU2lnbmVkLW9mZi1ieTogR2F2aW4gU2hhbiA8Z3NoYW5AcmVkaGF0LmNvbT4K Pj4+IC0tLQo+Pj4gwqAgYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9rdm1faG9zdC5owqDCoMKgwqDC oCB8wqDCoCA2ICsKPj4+IMKgIGFyY2gvYXJtNjQvaW5jbHVkZS9hc20va3ZtX3NkZWkuaMKgwqDC oMKgwqAgfCAxMTggKysrKysrKysrKysrKysrCj4+PiDCoCBhcmNoL2FybTY0L2luY2x1ZGUvdWFw aS9hc20va3ZtLmjCoMKgwqDCoMKgIHzCoMKgIDEgKwo+Pj4gwqAgYXJjaC9hcm02NC9pbmNsdWRl L3VhcGkvYXNtL2t2bV9zZGVpLmggfMKgIDYwICsrKysrKysrCj4+PiDCoCBhcmNoL2FybTY0L2t2 bS9NYWtlZmlsZcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCB8wqDCoCAyICstCj4+PiDC oCBhcmNoL2FybTY0L2t2bS9hcm0uY8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oCB8wqDCoCA3ICsKPj4+IMKgIGFyY2gvYXJtNjQva3ZtL2h5cGVyY2FsbHMuY8KgwqDCoMKgwqDC oMKgwqDCoMKgwqAgfMKgIDE4ICsrKwo+Pj4gwqAgYXJjaC9hcm02NC9rdm0vc2RlaS5jwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCB8IDE5OCArKysrKysrKysrKysrKysrKysrKysr KysrCj4+PiDCoCA4IGZpbGVzIGNoYW5nZWQsIDQwOSBpbnNlcnRpb25zKCspLCAxIGRlbGV0aW9u KC0pCj4+PiDCoCBjcmVhdGUgbW9kZSAxMDA2NDQgYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9rdm1f c2RlaS5oCj4+PiDCoCBjcmVhdGUgbW9kZSAxMDA2NDQgYXJjaC9hcm02NC9pbmNsdWRlL3VhcGkv YXNtL2t2bV9zZGVpLmgKPj4+IMKgIGNyZWF0ZSBtb2RlIDEwMDY0NCBhcmNoL2FybTY0L2t2bS9z ZGVpLmMKPj4+Cj4+PiBkaWZmIC0tZ2l0IGEvYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9rdm1faG9z dC5oCj4+PiBiL2FyY2gvYXJtNjQvaW5jbHVkZS9hc20va3ZtX2hvc3QuaAo+Pj4gaW5kZXggNDE5 MTE1ODVhZTBjLi5hZWRmOTAxZTFlYzcgMTAwNjQ0Cj4+PiAtLS0gYS9hcmNoL2FybTY0L2luY2x1 ZGUvYXNtL2t2bV9ob3N0LmgKPj4+ICsrKyBiL2FyY2gvYXJtNjQvaW5jbHVkZS9hc20va3ZtX2hv c3QuaAo+Pj4gQEAgLTExMyw2ICsxMTMsOSBAQCBzdHJ1Y3Qga3ZtX2FyY2ggewo+Pj4gwqDCoMKg wqDCoCAvKiBJbnRlcnJ1cHQgY29udHJvbGxlciAqLwo+Pj4gwqDCoMKgwqDCoCBzdHJ1Y3Qgdmdp Y19kaXN0wqDCoMKgIHZnaWM7Cj4+PiDCoCArwqDCoMKgIC8qIFNERUkgc3VwcG9ydCAqLwo+PiBk b2VzIG5vdCBicmluZyBtdWNoLiBXaHkgbm90IHJldXNpbmcgdGhlIGNvbW1pdCBtc2cgZXhwbGFu YXRpb24/IEhlcmUKPj4gYW5kIGJlbG93Lgo+IAo+IEkgd291bGQgZHJvcCB0aGUgY29tbWVudCBp biBuZXh0IHJlc3BpbiBiZWNhdXNlIEkgd2FudCB0byBhdm9pZCB0b28gbXVjaAo+IGNvbW1lbnRz IHRvIGJlIGVtYmVkZGVkIGludG8gInN0cnVjdCBrdm1fYXJjaCIuIFRoZSBzdHJ1Y3QgaXMgYWxy ZWFkeQo+IGh1Z2UgaW4gdGVybXMgb2YgbnVtYmVyIG9mIGZpZWxkcy4KWWVwIEkgd291bGQgZHJv cCBpdCB0b28uCj4gCj4+PiArwqDCoMKgIHN0cnVjdCBrdm1fc2RlaV9rdm0gKnNkZWk7Cj4+PiAr Cj4+PiDCoMKgwqDCoMKgIC8qIE1hbmRhdGVkIHZlcnNpb24gb2YgUFNDSSAqLwo+Pj4gwqDCoMKg wqDCoCB1MzIgcHNjaV92ZXJzaW9uOwo+Pj4gwqAgQEAgLTMzOSw2ICszNDIsOSBAQCBzdHJ1Y3Qg a3ZtX3ZjcHVfYXJjaCB7Cj4+PiDCoMKgwqDCoMKgwqAgKiBoZXJlLgo+Pj4gwqDCoMKgwqDCoMKg ICovCj4+PiDCoCArwqDCoMKgIC8qIFNERUkgc3VwcG9ydCAqLwo+Pj4gK8KgwqDCoCBzdHJ1Y3Qg a3ZtX3NkZWlfdmNwdSAqc2RlaTs+ICsKPj4+IMKgwqDCoMKgwqAgLyoKPj4+IMKgwqDCoMKgwqDC oCAqIEd1ZXN0IHJlZ2lzdGVycyB3ZSBwcmVzZXJ2ZSBkdXJpbmcgZ3Vlc3QgZGVidWdnaW5nLgo+ Pj4gwqDCoMKgwqDCoMKgICoKPj4+IGRpZmYgLS1naXQgYS9hcmNoL2FybTY0L2luY2x1ZGUvYXNt L2t2bV9zZGVpLmgKPj4+IGIvYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9rdm1fc2RlaS5oCj4+PiBu ZXcgZmlsZSBtb2RlIDEwMDY0NAo+Pj4gaW5kZXggMDAwMDAwMDAwMDAwLi5iMGFiYzEzYTAyNTYK Pj4+IC0tLSAvZGV2L251bGwKPj4+ICsrKyBiL2FyY2gvYXJtNjQvaW5jbHVkZS9hc20va3ZtX3Nk ZWkuaAo+Pj4gQEAgLTAsMCArMSwxMTggQEAKPj4+ICsvKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmll cjogR1BMLTIuMC1vbmx5ICovCj4+PiArLyoKPj4+ICsgKiBEZWZpbml0aW9ucyBvZiB2YXJpb3Vz IEtWTSBTREVJIGV2ZW50cy4KPj4+ICsgKgo+Pj4gKyAqIENvcHlyaWdodCAoQykgMjAyMSBSZWQg SGF0LCBJbmMuCj4+PiArICoKPj4+ICsgKiBBdXRob3Iocyk6IEdhdmluIFNoYW4gPGdzaGFuQHJl ZGhhdC5jb20+Cj4+PiArICovCj4+PiArCj4+PiArI2lmbmRlZiBfX0FSTTY0X0tWTV9TREVJX0hf Xwo+Pj4gKyNkZWZpbmUgX19BUk02NF9LVk1fU0RFSV9IX18KPj4+ICsKPj4+ICsjaW5jbHVkZSA8 dWFwaS9saW51eC9hcm1fc2RlaS5oPj4gKyNpbmNsdWRlIDx1YXBpL2FzbS9rdm1fc2RlaS5oPgo+ Pj4gKyNpbmNsdWRlIDxsaW51eC9iaXRtYXAuaD4KPj4+ICsjaW5jbHVkZSA8bGludXgvbGlzdC5o Pgo+Pj4gKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgo+Pj4gKwo+Pj4gK3N0cnVjdCBrdm1f c2RlaV9ldmVudCB7Cj4+PiArwqDCoMKgIHN0cnVjdCBrdm1fc2RlaV9ldmVudF9zdGF0ZcKgwqDC oMKgwqDCoMKgIHN0YXRlOwo+Pj4gK8KgwqDCoCBzdHJ1Y3Qga3ZtwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgICprdm07Cj4+PiArwqDCoMKgIHN0cnVjdCBsaXN0X2hlYWTCoMKgwqDCoMKg wqDCoMKgwqDCoMKgIGxpbms7Pj4+ICt9Owo+Pj4gKwo+Pj4gK3N0cnVjdCBrdm1fc2RlaV9rdm1f ZXZlbnQgewo+Pj4gK8KgwqDCoCBzdHJ1Y3Qga3ZtX3NkZWlfa3ZtX2V2ZW50X3N0YXRlwqDCoMKg wqDCoMKgwqAgc3RhdGU7Cj4+PiArwqDCoMKgIHN0cnVjdCBrdm1fc2RlaV9ldmVudMKgwqDCoMKg wqDCoMKgwqDCoMKgwqAgKmtzZTsKPj4+ICvCoMKgwqAgc3RydWN0IGt2bcKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoCAqa3ZtOwo+PiBjYW4ndCB5b3UgcmV1c2UgdGhlIGt2bSBoYW5kbGUg aW4gc3RhdGU/Cj4gCj4gTm9wZSwgdGhlcmUgaXMgbm8ga3ZtIGhhbmRsZSBpbiBAc3RhdGUuCnJp Z2h0IG1peGVkIG5hbWVzIHNvcnJ5Cj4gCj4+PiArwqDCoMKgIHN0cnVjdCBsaXN0X2hlYWTCoMKg wqDCoMKgwqDCoMKgwqDCoMKgIGxpbms7Cj4+PiArfTsKPj4+ICsKPj4+ICtzdHJ1Y3Qga3ZtX3Nk ZWlfdmNwdV9ldmVudCB7Cj4+PiArwqDCoMKgIHN0cnVjdCBrdm1fc2RlaV92Y3B1X2V2ZW50X3N0 YXRlwqDCoMKgIHN0YXRlOwo+Pj4gK8KgwqDCoCBzdHJ1Y3Qga3ZtX3NkZWlfa3ZtX2V2ZW50wqDC oMKgwqDCoMKgwqAgKmtza2U7Cj4+PiArwqDCoMKgIHN0cnVjdCBrdm1fdmNwdcKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoCAqdmNwdTsKPj4+ICvCoMKgwqAgc3RydWN0IGxpc3RfaGVhZMKg wqDCoMKgwqDCoMKgwqDCoMKgwqAgbGluazsKPj4+ICt9Owo+Pj4gKwo+Pj4gK3N0cnVjdCBrdm1f c2RlaV9rdm0gewo+Pj4gK8KgwqDCoCBzcGlubG9ja190wqDCoMKgwqDCoMKgwqAgbG9jazsKPj4+ ICvCoMKgwqAgc3RydWN0IGxpc3RfaGVhZMKgwqDCoCBldmVudHM7wqDCoMKgwqDCoMKgwqAgLyog a3ZtX3NkZWlfZXZlbnQgKi8KPj4+ICvCoMKgwqAgc3RydWN0IGxpc3RfaGVhZMKgwqDCoCBrdm1f ZXZlbnRzO8KgwqDCoCAvKiBrdm1fc2RlaV9rdm1fZXZlbnQgKi8KPj4+ICt9Owo+Pj4gKwo+Pj4g K3N0cnVjdCBrdm1fc2RlaV92Y3B1IHsKPj4+ICvCoMKgwqAgc3BpbmxvY2tfdMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBsb2NrOwo+Pj4gK8KgwqDCoCBzdHJ1Y3Qg a3ZtX3NkZWlfdmNwdV9zdGF0ZcKgwqDCoMKgwqAgc3RhdGU7Cj4+IGNvdWxkIHlvdSBleHBsYWlu IHRoZSBmaWVsZHMgYmVsb3c/Cj4gCj4gQXMgZGVmaW5lZCBieSB0aGUgc3BlY2lmaWNhdGlvbiwg ZWFjaCBTREVJIGV2ZW50IGlzIGdpdmVuIHByaW9yaXR5Ogo+IGNyaXRpY2FsCj4gb3Igbm9ybWFs IHByaW9yaXR5LiBUaGUgcHJpb3JpdHkgYWZmZWN0cyBob3cgdGhlIFNERUkgZXZlbnQgaXMgZGVs aXZlcmVkLgo+IFRoZSBjcml0aWNhbCBldmVudCBjYW4gcHJlZW1wdCB0aGUgbm9ybWFsIG9uZSwg YnV0IHRoZSByZXZlcnNlIHRoaW5nIGNhbid0Cj4gYmUgZG9uZS4KPiAKPj4+ICvCoMKgwqAgc3Ry dWN0IGt2bV9zZGVpX3ZjcHVfZXZlbnTCoMKgwqDCoMKgICpjcml0aWNhbF9ldmVudDsKPj4+ICvC oMKgwqAgc3RydWN0IGt2bV9zZGVpX3ZjcHVfZXZlbnTCoMKgwqDCoMKgICpub3JtYWxfZXZlbnQ7 Cj4+PiArwqDCoMKgIHN0cnVjdCBsaXN0X2hlYWTCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqAgY3JpdGljYWxfZXZlbnRzOwo+Pj4gK8KgwqDCoCBzdHJ1Y3QgbGlzdF9oZWFkwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgIG5vcm1hbF9ldmVudHM7Cj4+PiArfTsKPj4+ICsKPj4+ICsv Kgo+Pj4gKyAqIEFjY29yZGluZyB0byBTREVJIHNwZWNpZmljYXRpb24gKHYxLjApLCB0aGUgZXZl bnQgbnVtYmVyIHNwYW5zCj4+PiAzMi1iaXRzCj4+PiArICogYW5kIHRoZSBsb3dlciAyNC1iaXRz IGFyZSB1c2VkIGFzIHRoZSAocmVhbCkgZXZlbnQgbnVtYmVyLiBJIGRvbid0Cj4+PiArICogdGhp bmsgd2UgY2FuIHVzZSB0aGF0IG11Y2ggU0RFSSBudW1iZXJzIGluIG9uZSBzeXN0ZW0uIFNvIHdl IHJlc2VydmUKPj4+ICsgKiB0d28gYml0cyBmcm9tIHRoZSAyNC1iaXRzIHJlYWwgZXZlbnQgbnVt YmVyLCB0byBpbmRpY2F0ZSBpdHMgdHlwZXM6Cj4+PiArICogcGh5c2ljYWwgZXZlbnQgYW5kIHZp cnR1YWwgZXZlbnQuIE9uZSByZXNlcnZlZCBiaXQgaXMgZW5vdWdoIGZvcgo+Pj4gbm93LAo+Pj4g KyAqIGJ1dCB0d28gYml0cyBhcmUgcmVzZXJ2ZWQgZm9yIHBvc3NpYmxlIGV4dGVuc2lvbiBpbiBm dXR1cmUuCj4+IEkgdGhpbmsgdGhpcyBhc3N1bXB0aW9uIGlzIHdvcnRoIHRvIGJlIG1lbnRpb25u ZWQgaW4gdGhlIGNvbW1pdCBtc2cuCj4gCj4gU3VyZSwgSSB3aWxsIGV4cGxhaW4gaXQgaW4gdGhl IGNvbW1pdCBsb2cgaW4gbmV4dCByZXNwaW4uCj4gCj4+PiArICoKPj4+ICsgKiBUaGUgcGh5c2lj YWwgZXZlbnRzIGFyZSBvd25lZCBieSB1bmRlcmx5IGZpcm13YXJlIHdoaWxlIHRoZSB2aXJ0dWFs Cj4+IHVuZGVybHk/Cj4gCj4gcy91bmRlcmx5IGZpcm13YXJlL2Zpcm13YXJlIGluIG5leHQgcmVz cGluLgo+IAo+Pj4gKyAqIGV2ZW50cyBhcmUgdXNlZCBieSBWTU0gYW5kIEtWTS4KPj4+ICsgKi8K Pj4+ICsjZGVmaW5lIEtWTV9TREVJX0VWX05VTV9UWVBFX1NISUZUwqDCoMKgIDIyCj4+PiArI2Rl ZmluZSBLVk1fU0RFSV9FVl9OVU1fVFlQRV9NQVNLwqDCoMKgIDMKPj4+ICsjZGVmaW5lIEtWTV9T REVJX0VWX05VTV9UWVBFX1BIWVPCoMKgwqAgMAo+Pj4gKyNkZWZpbmUgS1ZNX1NERUlfRVZfTlVN X1RZUEVfVklSVMKgwqDCoCAxCj4+PiArCj4+PiArc3RhdGljIGlubGluZSBib29sIGt2bV9zZGVp X2lzX3ZhbGlkX2V2ZW50X251bSh1bnNpZ25lZCBsb25nIG51bSkKPj4gdGhlIG5hbWUgb2YgdGhl IGZ1bmN0aW9uIGRvZXMgZG9lcyBub3QgcmVhbGx5IGRlc2NyaWJlIHdoYXQgaXQgZG9lcy4gSXQK Pj4gYWN0dWFsbHkgY2hlY2tzIHRoZSBzZGVpIGlzIGEgdmlydHVhbCBvbmUuIHN1Z2dlc3Qga3Zt X3NkZWlfaXNfdmlydHVhbD8KPiAKPiBUaGUgaGVhZGVyIGZpbGUgaXMgb25seSB1c2VkIGJ5IEtW TSB3aGVyZSB0aGUgdmlydHVhbCBTREVJIGV2ZW50IGlzIHRoZQo+IG9ubHkgY29uY2Vybi4gSG93 ZXZlciwga3ZtX3NkZWlfaXNfdmlydHVhbCgpIGlzIGEgYmV0dGVyIG5hbWUuCj4gCj4+PiArewo+ Pj4gK8KgwqDCoCB1bnNpZ25lZCBsb25nIHR5cGU7Cj4+PiArCj4+PiArwqDCoMKgIGlmIChudW0g Pj4gMzIpCj4+PiArwqDCoMKgwqDCoMKgwqAgcmV0dXJuIGZhbHNlOwo+Pj4gKwo+Pj4gK8KgwqDC oCB0eXBlID0gKG51bSA+PiBLVk1fU0RFSV9FVl9OVU1fVFlQRV9TSElGVCkgJgo+Pj4gS1ZNX1NE RUlfRVZfTlVNX1RZUEVfTUFTSzsKPj4gSSB0aGluayB0aGUgdGhlIG1hc2sgZ2VuZXJhbGx5IGlz IGFwcGxpZWQgYmVmb3JlIHNoaWZ0aW5nLiBTZWUKPj4gaW5jbHVkZS9saW51eC9pcnFjaGlwL2Fy bS1naWMtdjMuaAo+IAo+IE9rLCBJIHdpbGwgYWRvcHQgdGhlIHN0eWxlIGluIG5leHQgcmVzcGlu Lgo+IAo+Pj4gK8KgwqDCoCBpZiAodHlwZSAhPSBLVk1fU0RFSV9FVl9OVU1fVFlQRV9WSVJUKQo+ Pj4gK8KgwqDCoMKgwqDCoMKgIHJldHVybiBmYWxzZTsKPj4+ICsKPj4+ICvCoMKgwqAgcmV0dXJu IHRydWU7Cj4+PiArfQo+Pj4gKwo+Pj4gKy8qIEFjY2Vzc29ycyBmb3IgdGhlIHJlZ2lzdHJhdGlv biBvciBlbmFibGVtZW50IHN0YXRlcyBvZiBLVk0gZXZlbnQgKi8KPj4+ICsjZGVmaW5lIEtWTV9T REVJX0ZMQUdfRlVOQyhmaWVsZCnCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoCBcCj4+PiArc3RhdGljIGlubGluZSBib29sIGt2bV9zZGVpX2lzXyMjZmllbGQoc3Ry dWN0IGt2bV9zZGVpX2t2bV9ldmVudAo+Pj4gKmtza2UswqDCoMKgwqDCoMKgIFwKPj4+ICvCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCB1bnNpZ25lZCBpbnQgaW5k ZXgpwqDCoMKgwqDCoMKgwqDCoMKgwqAgXAo+Pj4gK3vCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIFwKPj4+ ICvCoMKgwqAgcmV0dXJuICEhdGVzdF9iaXQoaW5kZXgsICh2b2lkICopKGtza2UtPnN0YXRlLmZp ZWxkKSk7wqDCoMKgwqDCoMKgwqDCoMKgwqAgXAo+Pj4gK33CoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIFwK Pj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIFwKPj4+ICtzdGF0aWMgaW5saW5lIGJvb2wga3ZtX3Nk ZWlfZW1wdHlfIyNmaWVsZChzdHJ1Y3Qga3ZtX3NkZWlfa3ZtX2V2ZW50Cj4+PiAqa3NrZSkgXAo+ PiBuaXQ6IHMvZW1wdHkvbm9uZSA/Cj4gCj4gImVtcHR5IiBpcyBzdGlja3kgdG8gYml0bWFwX2Vt cHR5KCksIGJ1dCAibm9uZSIgaGVyZSBsb29rcyBiZXR0ZXIgOikKPiAKPj4+ICt7wqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoCBcCj4+PiArwqDCoMKgIHJldHVybiBiaXRtYXBfZW1wdHkoKHZvaWQgKikoa3Nr ZS0+c3RhdGUuZmllbGQpLMKgwqDCoMKgwqDCoMKgwqDCoMKgIFwKPj4+ICvCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqAgS1ZNX1NERUlfTUFYX1ZDUFVTKTvCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgIFwKPj4+ICt9wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBcCj4+PiArc3RhdGljIGlubGlu ZSB2b2lkIGt2bV9zZGVpX3NldF8jI2ZpZWxkKHN0cnVjdCBrdm1fc2RlaV9rdm1fZXZlbnQKPj4+ ICprc2tlLMKgwqAgXAo+Pj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg IHVuc2lnbmVkIGludCBpbmRleCnCoMKgwqDCoMKgwqDCoMKgwqDCoCBcCj4+PiAre8KgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqAgXAo+Pj4gK8KgwqDCoCBzZXRfYml0KGluZGV4LCAodm9pZCAqKShrc2tlLT5z dGF0ZS5maWVsZCkpO8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgXAo+Pj4gK33CoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgIFwKPj4+ICtzdGF0aWMgaW5saW5lIHZvaWQga3ZtX3NkZWlfY2xlYXJfIyNm aWVsZChzdHJ1Y3Qga3ZtX3NkZWlfa3ZtX2V2ZW50Cj4+PiAqa3NrZSwgXAo+Pj4gK8KgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCB1bnNpZ25lZCBpbnQgaW5kZXgpwqDC oMKgwqDCoMKgwqDCoMKgwqAgXAo+Pj4gK3vCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIFwKPj4+ICvCoMKg wqAgY2xlYXJfYml0KGluZGV4LCAodm9pZCAqKShrc2tlLT5zdGF0ZS5maWVsZCkpO8KgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqAgXAo+Pj4gK30KPj4+ICsKPj4+ICtLVk1fU0RFSV9GTEFHX0ZV TkMocmVnaXN0ZXJlZCkKPj4+ICtLVk1fU0RFSV9GTEFHX0ZVTkMoZW5hYmxlZCkKPj4+ICsKPj4+ ICsvKiBBUElzICovCj4+PiArdm9pZCBrdm1fc2RlaV9pbml0X3ZtKHN0cnVjdCBrdm0gKmt2bSk7 Cj4+PiArdm9pZCBrdm1fc2RlaV9jcmVhdGVfdmNwdShzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpOwo+ Pj4gK2ludCBrdm1fc2RlaV9oeXBlcmNhbGwoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KTsKPj4+ICt2 b2lkIGt2bV9zZGVpX2Rlc3Ryb3lfdmNwdShzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpOwo+Pj4gK3Zv aWQga3ZtX3NkZWlfZGVzdHJveV92bShzdHJ1Y3Qga3ZtICprdm0pOwo+Pj4gKwo+Pj4gKyNlbmRp ZiAvKiBfX0FSTTY0X0tWTV9TREVJX0hfXyAqLwo+Pj4gZGlmZiAtLWdpdCBhL2FyY2gvYXJtNjQv aW5jbHVkZS91YXBpL2FzbS9rdm0uaAo+Pj4gYi9hcmNoL2FybTY0L2luY2x1ZGUvdWFwaS9hc20v a3ZtLmgKPj4+IGluZGV4IGIzZWRkZTY4YmMzZS4uZTFiMjAwYmI2NDgyIDEwMDY0NAo+Pj4gLS0t IGEvYXJjaC9hcm02NC9pbmNsdWRlL3VhcGkvYXNtL2t2bS5oCj4+PiArKysgYi9hcmNoL2FybTY0 L2luY2x1ZGUvdWFwaS9hc20va3ZtLmgKPj4+IEBAIC0zNiw2ICszNiw3IEBACj4+PiDCoCAjaW5j bHVkZSA8bGludXgvdHlwZXMuaD4KPj4+IMKgICNpbmNsdWRlIDxhc20vcHRyYWNlLmg+Cj4+PiDC oCAjaW5jbHVkZSA8YXNtL3N2ZV9jb250ZXh0Lmg+Cj4+PiArI2luY2x1ZGUgPGFzbS9rdm1fc2Rl aS5oPgo+Pj4gwqAgwqAgI2RlZmluZSBfX0tWTV9IQVZFX0dVRVNUX0RFQlVHCj4+PiDCoCAjZGVm aW5lIF9fS1ZNX0hBVkVfSVJRX0xJTkUKPj4+IGRpZmYgLS1naXQgYS9hcmNoL2FybTY0L2luY2x1 ZGUvdWFwaS9hc20va3ZtX3NkZWkuaAo+Pj4gYi9hcmNoL2FybTY0L2luY2x1ZGUvdWFwaS9hc20v a3ZtX3NkZWkuaAo+Pj4gbmV3IGZpbGUgbW9kZSAxMDA2NDQKPj4+IGluZGV4IDAwMDAwMDAwMDAw MC4uODkyODAyNzAyM2Y2Cj4+PiAtLS0gL2Rldi9udWxsCj4+PiArKysgYi9hcmNoL2FybTY0L2lu Y2x1ZGUvdWFwaS9hc20va3ZtX3NkZWkuaAo+Pj4gQEAgLTAsMCArMSw2MCBAQAo+Pj4gKy8qIFNQ RFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wIFdJVEggTGludXgtc3lzY2FsbC1ub3RlICov Cj4+PiArLyoKPj4+ICsgKiBEZWZpbml0aW9ucyBvZiB2YXJpb3VzIEtWTSBTREVJIGV2ZW50IHN0 YXRlcy4KPj4+ICsgKgo+Pj4gKyAqIENvcHlyaWdodCAoQykgMjAyMSBSZWQgSGF0LCBJbmMuCj4+ PiArICoKPj4+ICsgKiBBdXRob3Iocyk6IEdhdmluIFNoYW4gPGdzaGFuQHJlZGhhdC5jb20+Cj4+ PiArICovCj4+PiArCj4+PiArI2lmbmRlZiBfVUFQSV9fQVNNX0tWTV9TREVJX0gKPj4+ICsjZGVm aW5lIF9VQVBJX19BU01fS1ZNX1NERUlfSAo+Pj4gKwo+Pj4gKyNpZm5kZWYgX19BU1NFTUJMWV9f Cj4+PiArI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+Cj4+PiArCj4+PiArI2RlZmluZSBLVk1fU0RF SV9NQVhfVkNQVVPCoMKgwqAgNTEyCj4+PiArI2RlZmluZSBLVk1fU0RFSV9JTlZBTElEX05VTcKg wqDCoCAwCj4+PiArI2RlZmluZSBLVk1fU0RFSV9ERUZBVUxUX05VTcKgwqDCoCAweDQwNDAwMDAw Cj4+Cj4+IFRoZSBtb3RpdmF0aW9uIGJlaGluZCBpbnRyb2R1Y2luZyBzdWNoIHVhcGkgc2hvdWxk IGJlIGNsZWFyZXIgKGJlc2lkZXMKPj4ganVzdCB0ZWxsaW5nIHRoaXMgYWltcyBhdCBtaWdyYXRp bmcpLiBUbyBtZSBhdG0sIHRoaXMganVzdGlmaWNhdGlvbiBkb2VzCj4+IG5vdCBtYWtlIHBvc3Np YmxlIHRvIHVuZGVyc3RhbmQgaWYgdGhvc2Ugc3RydWN0cyBhcmUgd2VsbCBzdWl0ZWQuIFlvdQo+ PiBzaG91bGQgZG9jdW1lbnQgdGhlIG1pZ3JhdGlvbiBwcm9jZXNzIEkgdGhpbmsuCj4+Cj4+IEkg d291bGQgcmVtb3ZlIF9zdGF0ZSBzdWZmaXggaW4gYWxsIG9mIHRoZW0uCj4gCj4gSSB0aGluayBz by4gSSB3aWxsIGFkZCBkb2N1bWVudCAiRG9jdW1lbnRhdGlvbi92aXJ0L2t2bS9hcm0vc2RlaS5y c3QiIHRvCj4gZXhwbGFpbiB0aGUgZGVzaWduIGFuZCB0aGUgY29ycmVzcG9uZGluZyBkYXRhIHN0 cnVjdHMgZm9yIG1pZ3JhdGlvbi4KPiBIb3dldmVyLAo+IEkgd291bGQga2VlcCAic3RhdGUiIHN1 ZmZpeCBiZWNhdXNlIEkgdXNlZCB0aGlzIGZpZWxkIGFzIGluZGljYXRvciBmb3IKPiBkYXRhIHN0 cnVjdHMgdG8gYmUgbWlncmF0ZWQuIEhvd2V2ZXIsIHRoZSBzdHJ1Y3RzIHNob3VsZCBiZSBuYW1l ZAo+IGFjY29yZGluZ2x5Cj4gc2luY2UgdGhleSdyZSBlbWJlZGRlZCB0byB0aGVpciBwYXJlbnQg c3RydWN0czoKPiAKPiDCoMKgIGt2bV9zZGVpX2V2ZW50X3N0YXRlCj4gwqDCoCBrdm1fc2RlaV9r ZXZlbnRfc3RhdGUKPiDCoMKgIGt2bV9zZGVpX3ZldmVudF9zdGF0ZQo+IMKgwqAga3ZtX3NkZWlf dmNwdV9zdGF0ZQoKPiAKPj4+ICsKPj4+ICtzdHJ1Y3Qga3ZtX3NkZWlfZXZlbnRfc3RhdGUgewo+ PiBUaGlzIGlzIG5vdCByZWFsbHkgYSBzdGF0ZSBiZWNhdXNlIGl0IGNhbm5vdCBiZSBjaGFuZ2Vk IGJ5IHRoZSBndWVzdCwKPj4gcmlnaHQ/IEkgd291bGQgcmVtb3ZlIF9zdGF0ZSBhbmQganVzdCBj YWxsIGl0IGt2bV9zZGVpX2V2ZW50Cj4gCj4gVGhlIG5hbWUga3ZtX3NkZWlfZXZlbnQgd2lsbCBi ZSBjb25mbGljdGluZyB3aXRoIHNhbWUgc3RydWN0LCBkZWZpbmVkCj4gaW4gaW5jbHVkZS9hc20v a3ZtX3NkZWkuaC4gTGV0cyBrZWVwICJfc3RhdGUiIGFzIEkgZXhwbGFpbmVkLiBJIHVzZQo+IHRo ZSBzdWZmaXggYXMgaW5kaWNhdG9yIHRvIHN0cnVjdHMgd2hpY2ggbmVlZCBtaWdyYXRpb24gZXZl biB0aG91Z2gKPiB0aGV5J3JlIG5vdCBjaGFuZ2VhYmxlLgpvawo+IAo+Pj4gK8KgwqDCoCBfX3U2 NMKgwqDCoCBudW07Cj4+PiArCj4+PiArwqDCoMKgIF9fdTjCoMKgwqAgdHlwZTsKPj4+ICvCoMKg wqAgX191OMKgwqDCoCBzaWduYWxlZDsKPj4+ICvCoMKgwqAgX191OMKgwqDCoCBwcmlvcml0eTsK Pj4geW91IG5lZWQgc29tZSBwYWRkaW5nIHRvIGJlIDY0LWJpdCBhbGlnbmVkLiBTZWUgaW4gZ2Vu ZXJpYyBvciBhYXJjaDY0Cj4+IGt2bS5oIGZvciBpbnN0YW5jZS4KPiAKPiBTdXJlLgo+IAo+Pj4g K307Cj4+PiArCj4+PiArc3RydWN0IGt2bV9zZGVpX2t2bV9ldmVudF9zdGF0ZSB7Cj4+IEkgd291 bGQgcmVuYW1lIGludG8ga3ZtX3NkZWlfcmVnaXN0ZXJlZF9ldmVudCBvciBzbXRoIGFsaWtlCmFu eXdheSB0aGUgZG9jIGV4cGxhaW5pbmcgdGhlIG1pZ3JhdGlvbiBwcm9jZXNzIHdpbGwgaGVscCBo ZXJlLgo+IAo+IEFzIGFib3ZlLCBpdCB3aWxsIGJlIGNvbmZsaWN0aW5nIHdpdGggaXRzIHBhcmVu dCBzdHJ1Y3QsIGRlZmluZWQKPiBpbiBpbmNsdWRlL2FzbS9rdm1fc2RlaS5oCj4gCj4+PiArwqDC oMKgIF9fdTY0wqDCoMKgIG51bTsKPj4gaG93IGRvZXMgdGhpcyBudW0gZGlmZmVyIGZyb20gdGhl IGV2ZW50IHN0YXRlIG9uZT8KPiAKPiBAbnVtIGlzIHNhbWUgdGhpbmcgdG8gdGhhdCBpbiBrdm1f c2RlaV9ldmVudF9zdGF0ZS4gSXQncyB1c2VkIGFzCj4gaW5kZXggdG8gcmV0cmlldmUgY29ycmVz cG9uZGluZyBrdm1fc2RlaV9ldmVudF9zdGF0ZS4gT25lCj4ga3ZtX3NkZWlfZXZlbnRfc3RhdGUK PiBpbnN0YW5jZSBjYW4gYmUgZGVyZWZlcmVuY2VkIGJ5IGt2bV9zZGVpX2t2bV9ldmVudF9zdGF0 ZSBhbmQKPiBrdm1fc2RlaV9rdm1fdmNwdV9ldmVudF9zdGF0ZS4KPiBJdCdzIHdoeSB3ZSBkb24n dCBlbWJlZCBrdm1fc2RlaV9ldmVudF9zdGF0ZSBpbiB0aGVtLCB0byBhdm9pZCBkdXBsaWNhdGVk Cj4gdHJhZmZpYyBpbiBtaWdyYXRpb24uCj4gCj4+PiArwqDCoMKgIF9fdTMywqDCoMKgIHJlZmNv dW50Owo+Pj4gKwo+Pj4gK8KgwqDCoCBfX3U4wqDCoMKgIHJvdXRlX21vZGU7Cj4+IHBhZGRpbmcg YWxzbyBoZXJlLiBTZWUgZm9yIGluc3RhbmNlCj4+IGh0dHBzOi8vbG9yZS5rZXJuZWwub3JnL2t2 bS8yMDIwMDkxMTE0NTQ0Ni4yZjlmNWViOEB3NTIwLmhvbWUvVC8jbTdiYWMyZmYyYjI4YTY4Zjhk MjE5NmVjNDUyYWZkM2U0NjY4Mjc2MGQKPj4KPj4KPj4gTWF5YmUgcHV0IHRoZSB0aGUgcm91dGVf bW9kZSBmaWVsZCBhbmQgcmVmY291bnQgYXQgdGhlIGVuZCBhbmQgYWRkIG9uZQo+PiBieXRlIG9m IHBhZGRpbmc/Cj4+Cj4+IFdoeSBjYW4ndCB3ZSBoYXZlIGEgc2luZ2xlIHNkZWlfZXZlbnQgdWFw aSByZXByZXNlbnRhdGlvbiB3aGVyZSByb3V0ZQo+PiBtb2RlIGRlZmF1bHRzIHRvIHVuc2V0IGFu ZCByZWZjb3VudCBkZWZhdWx0cyB0byAwIHdoZW4gbm90IHJlZ2lzdGVyZWQ/Cj4+Cj4gCj4gT2su IEkgd2lsbCBmaXggdGhlIHBhZGRpbmcgYW5kIGFsaWdubWVudCBpbiBuZXh0IHJlc3Bpbi4gVGhl Cj4gQHJvdXRlX2FmZmluaXR5Cj4gY2FuIGJlIGNoYW5nZWQgb24gcmVxdWVzdCBmcm9tIHRoZSBn dWVzdC4gVGhlIEByZWZjb3VudCBoZWxwcyB0byBwcmV2ZW50Cj4gdGhlCj4gZXZlbnQgZnJvbSBi ZWluZyB1bnJlZ2lzdGVyZWQgaWYgaXQncyBzdGlsbCBkZXJlZmVyZW5jZWQgYnkKPiBrdm1fc2Rl aV92Y3B1X2V2ZW50X3N0YXRlLgo+IAo+Pj4gK8KgwqDCoCBfX3U2NMKgwqDCoCByb3V0ZV9hZmZp bml0eTsKPj4+ICvCoMKgwqAgX191NjTCoMKgwqAgZW50cmllc1tLVk1fU0RFSV9NQVhfVkNQVVNd Owo+Pj4gK8KgwqDCoCBfX3U2NMKgwqDCoCBwYXJhbXNbS1ZNX1NERUlfTUFYX1ZDUFVTXTsKPj4g SSB3b3VsZCByZW5hbWUgZW50cmllcyBpbnRvIGVwX2FkZHJlc3MgYW5kIHBhcmFtcyBpbnRvIGVw X2FyZy4KPiAKPiBPaywgYnV0IHdoYXQgZG9lcyAiZXAiIG1lYW5zPyBJIGJhcmVseSBndWVzcyBp dCdzICJlbnRyeSBwb2ludCIuCj4gSSdtIG5vdCBzdXJlIGlmIHlvdSdyZSB0YWxraW5nIGFib3V0 ICJQRSIgaGVyZS4KZXAgPSBlbnRyeSBwb2ludAo+IAo+Pj4gK8KgwqDCoCBfX3U2NMKgwqDCoCBy ZWdpc3RlcmVkW0tWTV9TREVJX01BWF9WQ1BVUy82NF07Cj4+IG1heWJlIGFkZCBhIGNvbW1lbnQg YWxvbmcgd2l0aCBLVk1fU0RFSV9NQVhfVkNQVVMgdGhhdCBpdCBtdXN0IGJlIGEKPj4gbXVsdGlw bGUgb2YgNjQgKG9yIGEgYnVpbGQgY2hlY2spCj4+Cj4gCj4gU3VyZS4KPiDCoAo+Pj4gK8KgwqDC oCBfX3U2NMKgwqDCoCBlbmFibGVkW0tWTV9TREVJX01BWF9WQ1BVUy82NF07Cj4+IEFsc28geW91 IG1heSBjbGFyaWZ5IHdoYXQgdGhpcyBnZXRzIHVzZWQgZm9yIGEgc2hhcmVkIGV2ZW50LiBJIGd1 ZXNzCj4+IHRoaXMgb25seSBtYWtlcyBzZW5zZSBmb3IgYSBwcml2YXRlIGV2ZW50IHdoaWNoIGNh biBiZSByZWdpc3RlcmVkIGJ5Cj4+IHNldmVyYWwgRVBzPwo+IAo+IE5vcGUsIHRoZXkncmUgdXNl ZCBieSBib3RoIHNoYXJlZCBhbmQgcHJpdmF0ZSBldmVudHMuIEZvciBzaGFyZWQgZXZlbnQsCj4g dGhlIGJpdCMwIGlzIHVzZWQgdG8gaW5kaWNhdGUgdGhlIHN0YXRlLCB3aGlsZSB0aGUgaW5kaXZp ZHVhbCBiaXQgaXMKPiB1c2VkIGZvciB0aGUgcHJpdmF0ZSBldmVudFllcywgdGhlIHByaXZhdGUg ZXZlbnQgY2FuIGJlIHJlZ2lzdGVyZWQKPiBhbmQgZW5hYmxlZCBzZXBhcmF0ZWx5IG9uIG11bHRp cGxlIFBFcy4KPiAKPj4+ICt9Owo+Pj4gKwo+Pj4gK3N0cnVjdCBrdm1fc2RlaV92Y3B1X2V2ZW50 X3N0YXRlIHsKPj4+ICvCoMKgwqAgX191NjTCoMKgwqAgbnVtOwo+Pj4gK8KgwqDCoCBfX3UzMsKg wqDCoCByZWZjb3VudDsKPj4gaG93IGRvZXMgaXQgZGlmZmVyIGZyb20gbnVtIGFuZCByZWZjb3Vu dCBvZiB0aGUgcmVnaXN0ZXJlZCBldmVudD8KPj4gcGFkZGluZysrCj4gCj4gQWJvdXQgQG51bSBh bmQgQHJlZmNvdW50LCBwbGVhc2UgcmVmZXIgdG8gdGhlIGFib3ZlIGV4cGxhbmF0aW9uLiBZZXMs Cj4gSSB3aWxsIGZpeCBwYWRkaW5nIGluIG5leHQgcmVzcGluLgo+IAo+Pj4gK307Cj4+PiArCj4+ PiArc3RydWN0IGt2bV9zZGVpX3ZjcHVfcmVncyB7Cj4+PiArwqDCoMKgIF9fdTY0wqDCoMKgIHJl Z3NbMThdOwo+Pj4gK8KgwqDCoCBfX3U2NMKgwqDCoCBwYzsKPj4+ICvCoMKgwqAgX191NjTCoMKg wqAgcHN0YXRlOwo+Pj4gK307Cj4+PiArCj4+PiArc3RydWN0IGt2bV9zZGVpX3ZjcHVfc3RhdGUg ewo+Pj4gK8KgwqDCoCBfX3U4wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIG1hc2tlZDsK Pj4gcGFkZGluZysrCj4gCj4gT2suCj4gCj4+PiArwqDCoMKgIF9fdTY0wqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgIGNyaXRpY2FsX251bTsKPj4+ICvCoMKgwqAgX191NjTCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqAgbm9ybWFsX251bTsKPj4+ICvCoMKgwqAgc3RydWN0IGt2bV9z ZGVpX3ZjcHVfcmVnc8KgwqDCoCBjcml0aWNhbF9yZWdzOwo+Pj4gK8KgwqDCoCBzdHJ1Y3Qga3Zt X3NkZWlfdmNwdV9yZWdzwqDCoMKgIG5vcm1hbF9yZWdzOwo+Pj4gK307PiArCj4+PiArI2VuZGlm IC8qICFfX0FTU0VNQkxZX18gKi8KPj4+ICsjZW5kaWYgLyogX1VBUElfX0FTTV9LVk1fU0RFSV9I ICovCj4+PiBkaWZmIC0tZ2l0IGEvYXJjaC9hcm02NC9rdm0vTWFrZWZpbGUgYi9hcmNoL2FybTY0 L2t2bS9NYWtlZmlsZQo+Pj4gaW5kZXggOTg5YmI1ZGFkMmM4Li5lZWZjYThjYTM5NGQgMTAwNjQ0 Cj4+PiAtLS0gYS9hcmNoL2FybTY0L2t2bS9NYWtlZmlsZQo+Pj4gKysrIGIvYXJjaC9hcm02NC9r dm0vTWFrZWZpbGUKPj4+IEBAIC0xNiw3ICsxNiw3IEBAIGt2bS15IDo9ICQoS1ZNKS9rdm1fbWFp bi5vICQoS1ZNKS9jb2FsZXNjZWRfbW1pby5vCj4+PiAkKEtWTSkvZXZlbnRmZC5vIFwKPj4+IMKg wqDCoMKgwqDCoCBpbmplY3RfZmF1bHQubyB2YV9sYXlvdXQubyBoYW5kbGVfZXhpdC5vIFwKPj4+ IMKgwqDCoMKgwqDCoCBndWVzdC5vIGRlYnVnLm8gcmVzZXQubyBzeXNfcmVncy5vIFwKPj4+IMKg wqDCoMKgwqDCoCB2Z2ljLXN5cy1yZWctdjMubyBmcHNpbWQubyBwbXUubyBcCj4+PiAtwqDCoMKg wqAgYXJjaF90aW1lci5vIHRybmcub1wKPj4+ICvCoMKgwqDCoCBhcmNoX3RpbWVyLm8gdHJuZy5v IHNkZWkubyBcCj4+PiDCoMKgwqDCoMKgwqAgdmdpYy92Z2ljLm8gdmdpYy92Z2ljLWluaXQubyBc Cj4+PiDCoMKgwqDCoMKgwqAgdmdpYy92Z2ljLWlycWZkLm8gdmdpYy92Z2ljLXYyLm8gXAo+Pj4g wqDCoMKgwqDCoMKgIHZnaWMvdmdpYy12My5vIHZnaWMvdmdpYy12NC5vIFwKPj4+IGRpZmYgLS1n aXQgYS9hcmNoL2FybTY0L2t2bS9hcm0uYyBiL2FyY2gvYXJtNjQva3ZtL2FybS5jCj4+PiBpbmRl eCBlOWEyYjhmMjc3OTIuLjJmMDIxYWE0MTYzMiAxMDA2NDQKPj4+IC0tLSBhL2FyY2gvYXJtNjQv a3ZtL2FybS5jCj4+PiArKysgYi9hcmNoL2FybTY0L2t2bS9hcm0uYwo+Pj4gQEAgLTE1MCw2ICsx NTAsOCBAQCBpbnQga3ZtX2FyY2hfaW5pdF92bShzdHJ1Y3Qga3ZtICprdm0sIHVuc2lnbmVkCj4+ PiBsb25nIHR5cGUpCj4+PiDCoCDCoMKgwqDCoMKgIGt2bV92Z2ljX2Vhcmx5X2luaXQoa3ZtKTsK Pj4+IMKgICvCoMKgwqAga3ZtX3NkZWlfaW5pdF92bShrdm0pOwo+Pj4gKwo+Pj4gwqDCoMKgwqDC oCAvKiBUaGUgbWF4aW11bSBudW1iZXIgb2YgVkNQVXMgaXMgbGltaXRlZCBieSB0aGUgaG9zdCdz IEdJQwo+Pj4gbW9kZWwgKi8KPj4+IMKgwqDCoMKgwqAga3ZtLT5hcmNoLm1heF92Y3B1cyA9IGt2 bV9hcm1fZGVmYXVsdF9tYXhfdmNwdXMoKTsKPj4+IMKgIEBAIC0xNzksNiArMTgxLDggQEAgdm9p ZCBrdm1fYXJjaF9kZXN0cm95X3ZtKHN0cnVjdCBrdm0gKmt2bSkKPj4+IMKgIMKgwqDCoMKgwqAg a3ZtX3ZnaWNfZGVzdHJveShrdm0pOwo+Pj4gwqAgK8KgwqDCoCBrdm1fc2RlaV9kZXN0cm95X3Zt KGt2bSk7Cj4+PiArCj4+PiDCoMKgwqDCoMKgIGZvciAoaSA9IDA7IGkgPCBLVk1fTUFYX1ZDUFVT OyArK2kpIHsKPj4+IMKgwqDCoMKgwqDCoMKgwqDCoCBpZiAoa3ZtLT52Y3B1c1tpXSkgewo+Pj4g wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAga3ZtX3ZjcHVfZGVzdHJveShrdm0tPnZjcHVzW2ld KTsKPj4+IEBAIC0zMzMsNiArMzM3LDggQEAgaW50IGt2bV9hcmNoX3ZjcHVfY3JlYXRlKHN0cnVj dCBrdm1fdmNwdSAqdmNwdSkKPj4+IMKgIMKgwqDCoMKgwqAga3ZtX2FybV9wdnRpbWVfdmNwdV9p bml0KCZ2Y3B1LT5hcmNoKTsKPj4+IMKgICvCoMKgwqAga3ZtX3NkZWlfY3JlYXRlX3ZjcHUodmNw dSk7Cj4+PiArCj4+PiDCoMKgwqDCoMKgIHZjcHUtPmFyY2guaHdfbW11ID0gJnZjcHUtPmt2bS0+ YXJjaC5tbXU7Cj4+PiDCoCDCoMKgwqDCoMKgIGVyciA9IGt2bV92Z2ljX3ZjcHVfaW5pdCh2Y3B1 KTsKPj4+IEBAIC0zNTQsNiArMzYwLDcgQEAgdm9pZCBrdm1fYXJjaF92Y3B1X2Rlc3Ryb3koc3Ry dWN0IGt2bV92Y3B1ICp2Y3B1KQo+Pj4gwqDCoMKgwqDCoCBrdm1fbW11X2ZyZWVfbWVtb3J5X2Nh Y2hlKCZ2Y3B1LT5hcmNoLm1tdV9wYWdlX2NhY2hlKTsKPj4+IMKgwqDCoMKgwqAga3ZtX3RpbWVy X3ZjcHVfdGVybWluYXRlKHZjcHUpOwo+Pj4gwqDCoMKgwqDCoCBrdm1fcG11X3ZjcHVfZGVzdHJv eSh2Y3B1KTsKPj4+ICvCoMKgwqAga3ZtX3NkZWlfZGVzdHJveV92Y3B1KHZjcHUpOwo+Pj4gwqAg wqDCoMKgwqDCoCBrdm1fYXJtX3ZjcHVfZGVzdHJveSh2Y3B1KTsKPj4+IMKgIH0KPj4+IGRpZmYg LS1naXQgYS9hcmNoL2FybTY0L2t2bS9oeXBlcmNhbGxzLmMgYi9hcmNoL2FybTY0L2t2bS9oeXBl cmNhbGxzLmMKPj4+IGluZGV4IDMwZGE3OGY3MmIzYi4uZDNmYzg5M2E0ZjU4IDEwMDY0NAo+Pj4g LS0tIGEvYXJjaC9hcm02NC9rdm0vaHlwZXJjYWxscy5jCj4+PiArKysgYi9hcmNoL2FybTY0L2t2 bS9oeXBlcmNhbGxzLmMKPj4+IEBAIC0xMzksNiArMTM5LDI0IEBAIGludCBrdm1faHZjX2NhbGxf aGFuZGxlcihzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpCj4+PiDCoMKgwqDCoMKgIGNhc2UgQVJNX1NN Q0NDX1RSTkdfUk5EMzI6Cj4+PiDCoMKgwqDCoMKgIGNhc2UgQVJNX1NNQ0NDX1RSTkdfUk5ENjQ6 Cj4+PiDCoMKgwqDCoMKgwqDCoMKgwqAgcmV0dXJuIGt2bV90cm5nX2NhbGwodmNwdSk7Cj4+PiAr wqDCoMKgIGNhc2UgU0RFSV8xXzBfRk5fU0RFSV9WRVJTSU9OOgo+Pj4gK8KgwqDCoCBjYXNlIFNE RUlfMV8wX0ZOX1NERUlfRVZFTlRfUkVHSVNURVI6Cj4+PiArwqDCoMKgIGNhc2UgU0RFSV8xXzBf Rk5fU0RFSV9FVkVOVF9FTkFCTEU6Cj4+PiArwqDCoMKgIGNhc2UgU0RFSV8xXzBfRk5fU0RFSV9F VkVOVF9ESVNBQkxFOgo+Pj4gK8KgwqDCoCBjYXNlIFNERUlfMV8wX0ZOX1NERUlfRVZFTlRfQ09O VEVYVDoKPj4+ICvCoMKgwqAgY2FzZSBTREVJXzFfMF9GTl9TREVJX0VWRU5UX0NPTVBMRVRFOgo+ Pj4gK8KgwqDCoCBjYXNlIFNERUlfMV8wX0ZOX1NERUlfRVZFTlRfQ09NUExFVEVfQU5EX1JFU1VN RToKPj4+ICvCoMKgwqAgY2FzZSBTREVJXzFfMF9GTl9TREVJX0VWRU5UX1VOUkVHSVNURVI6Cj4+ PiArwqDCoMKgIGNhc2UgU0RFSV8xXzBfRk5fU0RFSV9FVkVOVF9TVEFUVVM6Cj4+PiArwqDCoMKg IGNhc2UgU0RFSV8xXzBfRk5fU0RFSV9FVkVOVF9HRVRfSU5GTzoKPj4+ICvCoMKgwqAgY2FzZSBT REVJXzFfMF9GTl9TREVJX0VWRU5UX1JPVVRJTkdfU0VUOgo+Pj4gK8KgwqDCoCBjYXNlIFNERUlf MV8wX0ZOX1NERUlfUEVfTUFTSzoKPj4+ICvCoMKgwqAgY2FzZSBTREVJXzFfMF9GTl9TREVJX1BF X1VOTUFTSzoKPj4+ICvCoMKgwqAgY2FzZSBTREVJXzFfMF9GTl9TREVJX0lOVEVSUlVQVF9CSU5E Ogo+Pj4gK8KgwqDCoCBjYXNlIFNERUlfMV8wX0ZOX1NERUlfSU5URVJSVVBUX1JFTEVBU0U6Cj4+ PiArwqDCoMKgIGNhc2UgU0RFSV8xXzBfRk5fU0RFSV9QUklWQVRFX1JFU0VUOgo+Pj4gK8KgwqDC oCBjYXNlIFNERUlfMV8wX0ZOX1NERUlfU0hBUkVEX1JFU0VUOgo+Pj4gK8KgwqDCoMKgwqDCoMKg IHJldHVybiBrdm1fc2RlaV9oeXBlcmNhbGwodmNwdSk7Cj4+PiDCoMKgwqDCoMKgIGRlZmF1bHQ6 Cj4+PiDCoMKgwqDCoMKgwqDCoMKgwqAgcmV0dXJuIGt2bV9wc2NpX2NhbGwodmNwdSk7Cj4+PiDC oMKgwqDCoMKgIH0KPj4+IGRpZmYgLS1naXQgYS9hcmNoL2FybTY0L2t2bS9zZGVpLmMgYi9hcmNo L2FybTY0L2t2bS9zZGVpLmMKPj4+IG5ldyBmaWxlIG1vZGUgMTAwNjQ0Cj4+PiBpbmRleCAwMDAw MDAwMDAwMDAuLmFiMzMwYjc0YTk2NQo+Pj4gLS0tIC9kZXYvbnVsbAo+Pj4gKysrIGIvYXJjaC9h cm02NC9rdm0vc2RlaS5jCj4+PiBAQCAtMCwwICsxLDE5OCBAQAo+Pj4gKy8vIFNQRFgtTGljZW5z ZS1JZGVudGlmaWVyOiBHUEwtMi4wLW9ubHkKPj4+ICsvKgo+Pj4gKyAqIFNERUkgdmlydHVhbGl6 YXRpb24gc3VwcG9ydC4KPj4+ICsgKgo+Pj4gKyAqIENvcHlyaWdodCAoQykgMjAyMSBSZWQgSGF0 LCBJbmMuCj4+PiArICoKPj4+ICsgKiBBdXRob3Iocyk6IEdhdmluIFNoYW4gPGdzaGFuQHJlZGhh dC5jb20+Cj4+PiArICovCj4+PiArCj4+PiArI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgo+Pj4g KyNpbmNsdWRlIDxsaW51eC9rdm1faG9zdC5oPgo+Pj4gKyNpbmNsdWRlIDxsaW51eC9zcGlubG9j ay5oPgo+Pj4gKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Cj4+PiArI2luY2x1ZGUgPGt2bS9hcm1f aHlwZXJjYWxscy5oPgo+Pj4gKwo+Pj4gK3N0YXRpYyBzdHJ1Y3Qga3ZtX3NkZWlfZXZlbnRfc3Rh dGUgZGVmaW5lZF9rc2VbXSA9IHsKPj4+ICvCoMKgwqAgeyBLVk1fU0RFSV9ERUZBVUxUX05VTSwK Pj4+ICvCoMKgwqDCoMKgIFNERUlfRVZFTlRfVFlQRV9QUklWQVRFLAo+Pj4gK8KgwqDCoMKgwqAg MSwKPj4+ICvCoMKgwqDCoMKgIFNERUlfRVZFTlRfUFJJT1JJVFlfQ1JJVElDQUwKPj4+ICvCoMKg wqAgfSwKPj4+ICt9Owo+PiBJIHVuZGVyc3RhbmQgZnJvbSB0aGUgYWJvdmUgd2UgY3VycmVudGx5 IG9ubHkgc3VwcG9ydCBhIHNpbmdsZSBzdGF0aWMgKH4KPj4gcGxhdGZvcm0pIFNERUkgZXZlbnQg d2l0aCBudW0gPSBLVk1fU0RFSV9ERUZBVUxUX05VTS4gV2UgZG8gbm90IHN1cHBvcnQKPj4gYm91 bmQgZXZlbnRzLiBZb3UgbWF5IGFkZCBhIGNvbW1lbnQgaGVyZSBhbmQgbWF5YmUgaW4gdGhlIGNv bW1pdCBtc2cuCj4+IEkgd291bGQgcmVuYW1lIHRoZSB2YXJpYWJsZSBpbnRvIGV4cG9ydGVkX2V2 ZW50cy4KPiAKPiBZZWFoLCB3ZSBtYXkgZW5oYW5jZSBpdCB0byBhbGxvdyB1c2Vyc3BhY2UgdG8g YWRkIG1vcmUgaW4gZnV0dXJlLCBidXQKPiBub3Qgbm93LiBPaywgSSB3aWxsIHJlbmFtZSBpdCB0 byBAZXhwb3J0ZWRfZXZlbnRzLgo+IAo+Pj4gKwo+Pj4gK3N0YXRpYyB2b2lkIGt2bV9zZGVpX3Jl bW92ZV9ldmVudHMoc3RydWN0IGt2bSAqa3ZtKQo+Pj4gK3sKPj4+ICvCoMKgwqAgc3RydWN0IGt2 bV9zZGVpX2t2bSAqa3NkZWkgPSBrdm0tPmFyY2guc2RlaTsKPj4+ICvCoMKgwqAgc3RydWN0IGt2 bV9zZGVpX2V2ZW50ICprc2UsICp0bXA7Cj4+PiArCj4+PiArwqDCoMKgIGxpc3RfZm9yX2VhY2hf ZW50cnlfc2FmZShrc2UsIHRtcCwgJmtzZGVpLT5ldmVudHMsIGxpbmspIHsKPj4+ICvCoMKgwqDC oMKgwqDCoCBsaXN0X2RlbCgma3NlLT5saW5rKTsKPj4+ICvCoMKgwqDCoMKgwqDCoCBrZnJlZShr c2UpOwo+Pj4gK8KgwqDCoCB9Cj4+PiArfQo+Pj4gKwo+Pj4gK3N0YXRpYyB2b2lkIGt2bV9zZGVp X3JlbW92ZV9rdm1fZXZlbnRzKHN0cnVjdCBrdm0gKmt2bSwKPj4+ICvCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCB1bnNpZ25lZCBpbnQgbWFzaywKPj4+ICvCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBib29sIGZvcmNlKQo+Pj4g K3sKPj4+ICvCoMKgwqAgc3RydWN0IGt2bV9zZGVpX2t2bSAqa3NkZWkgPSBrdm0tPmFyY2guc2Rl aTsKPj4+ICvCoMKgwqAgc3RydWN0IGt2bV9zZGVpX2V2ZW50ICprc2U7Cj4+PiArwqDCoMKgIHN0 cnVjdCBrdm1fc2RlaV9rdm1fZXZlbnQgKmtza2UsICp0bXA7Cj4+PiArCj4+PiArwqDCoMKgIGxp c3RfZm9yX2VhY2hfZW50cnlfc2FmZShrc2tlLCB0bXAsICZrc2RlaS0+a3ZtX2V2ZW50cywgbGlu aykgewo+Pj4gK8KgwqDCoMKgwqDCoMKgIGtzZSA9IGtza2UtPmtzZTsKPj4+ICsKPj4+ICvCoMKg wqDCoMKgwqDCoCBpZiAoISgoMSA8PCBrc2UtPnN0YXRlLnR5cGUpICYgbWFzaykpCj4+PiArwqDC oMKgwqDCoMKgwqDCoMKgwqDCoCBjb250aW51ZTsKPj4gZG9uJ3QgeW91IG5lZWQgdG8gaG9sZCBh IGxvY2sgYmVmb3JlIGxvb3Bpbmc/IFdoYXQgaWYgc2JkeSBjb25jdXJyZW50bHkKPj4gY2hhbmdl cyB0aGUgc3RhdGUgZmllbGRzLCBlc3BlY2lhbGx5IHRoZSByZWZjb3VudCBiZWxvdz8KPiAKPiBZ ZXMsIHRoZSBjYWxsZXIgaG9sZHMgQGt2bS0+c2RlaV9sb2NrLgo+IAo+Pj4gKwo+Pj4gK8KgwqDC oMKgwqDCoMKgIGlmICghZm9yY2UgJiYga3NrZS0+c3RhdGUucmVmY291bnQpCj4+PiArwqDCoMKg wqDCoMKgwqDCoMKgwqDCoCBjb250aW51ZTsKPj4gVXN1YWxseSB0aGUgcmVmY291bnQgaXMgdXNl ZCB0byBjb250cm9sIHRoZSBsaWZldGltZSBvZiB0aGUgb2JqZWN0LiBUaGUKPj4gJ2ZvcmNlJyBm bGFnIGxvb2tzIHdyb25nIGluIHRoYXQgY29udGV4dC4gU2hvdWxkbid0IHlvdSBtYWtlIHN1cmUg YWxsCj4+IHVzZXJzIGhhdmUgcmVsZWFzZWQgdGhlaXIgcmVmY291bnRzIGFuZCBvbiB0aGUgbGFz dCBkZWNyZW1lbnQsIGRlbGV0ZQo+PiB0aGUgb2JqZWN0Pwo+IAo+IEBmb3JjZSBpcyB1c2VkIGZv ciBleGNlcHRpb25hbCBjYXNlLiBGb3IgZXhhbXBsZSwgdGhlIEtWTSBwcm9jZXNzIGlzCj4ga2ls bGVkIGJlZm9yZSB0aGUgZXZlbnQgcmVmZXJlbmNlIGNvdW50IGdldHMgY2hhbmNlIHRvIGJlIGRy b3BwZWQuCmh1bSBub3QgdG90YWxseSBjb252aW5jZWQgaGVyZSBidXQgbGV0J3Mgc2VlIHlvdXIg bmV4dCB2ZXJzaW9uIDstKQo+IAo+Pj4gKwo+Pj4gK8KgwqDCoMKgwqDCoMKgIGxpc3RfZGVsKCZr c2tlLT5saW5rKTsKPj4+ICvCoMKgwqDCoMKgwqDCoCBrZnJlZShrc2tlKTsKPj4+ICvCoMKgwqAg fQo+Pj4gK30KPj4+ICsKPj4+ICtzdGF0aWMgdm9pZCBrdm1fc2RlaV9yZW1vdmVfdmNwdV9ldmVu dHMoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KQo+Pj4gK3sKPj4+ICvCoMKgwqAgc3RydWN0IGt2bV9z ZGVpX3ZjcHUgKnZzZGVpID0gdmNwdS0+YXJjaC5zZGVpOwo+Pj4gK8KgwqDCoCBzdHJ1Y3Qga3Zt X3NkZWlfdmNwdV9ldmVudCAqa3N2ZSwgKnRtcDsKPj4+ICsKPj4+ICvCoMKgwqAgbGlzdF9mb3Jf ZWFjaF9lbnRyeV9zYWZlKGtzdmUsIHRtcCwgJnZzZGVpLT5jcml0aWNhbF9ldmVudHMsCj4+PiBs aW5rKSB7Cj4+PiArwqDCoMKgwqDCoMKgwqAgbGlzdF9kZWwoJmtzdmUtPmxpbmspOwo+Pj4gK8Kg wqDCoMKgwqDCoMKgIGtmcmVlKGtzdmUpOwo+Pj4gK8KgwqDCoCB9Cj4+PiArCj4+PiArwqDCoMKg IGxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShrc3ZlLCB0bXAsICZ2c2RlaS0+bm9ybWFsX2V2ZW50 cywgbGluaykgewo+Pj4gK8KgwqDCoMKgwqDCoMKgIGxpc3RfZGVsKCZrc3ZlLT5saW5rKTsKPj4+ ICvCoMKgwqDCoMKgwqDCoCBrZnJlZShrc3ZlKTsKPj4+ICvCoMKgwqAgfQo+Pj4gK30KPj4+ICsK Pj4+ICtpbnQga3ZtX3NkZWlfaHlwZXJjYWxsKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSkKPj4+ICt7 Cj4+PiArwqDCoMKgIHUzMiBmdW5jID0gc21jY2NfZ2V0X2Z1bmN0aW9uKHZjcHUpOwo+Pj4gK8Kg wqDCoCBib29sIGhhc19yZXN1bHQgPSB0cnVlOwo+Pj4gK8KgwqDCoCB1bnNpZ25lZCBsb25nIHJl dDsKPj4+ICsKPj4+ICvCoMKgwqAgc3dpdGNoIChmdW5jKSB7Cj4+PiArwqDCoMKgIGNhc2UgU0RF SV8xXzBfRk5fU0RFSV9WRVJTSU9OOgo+Pj4gK8KgwqDCoCBjYXNlIFNERUlfMV8wX0ZOX1NERUlf RVZFTlRfUkVHSVNURVI6Cj4+PiArwqDCoMKgIGNhc2UgU0RFSV8xXzBfRk5fU0RFSV9FVkVOVF9F TkFCTEU6Cj4+PiArwqDCoMKgIGNhc2UgU0RFSV8xXzBfRk5fU0RFSV9FVkVOVF9ESVNBQkxFOgo+ Pj4gK8KgwqDCoCBjYXNlIFNERUlfMV8wX0ZOX1NERUlfRVZFTlRfQ09OVEVYVDoKPj4+ICvCoMKg wqAgY2FzZSBTREVJXzFfMF9GTl9TREVJX0VWRU5UX0NPTVBMRVRFOgo+Pj4gK8KgwqDCoCBjYXNl IFNERUlfMV8wX0ZOX1NERUlfRVZFTlRfQ09NUExFVEVfQU5EX1JFU1VNRToKPj4+ICvCoMKgwqAg Y2FzZSBTREVJXzFfMF9GTl9TREVJX0VWRU5UX1VOUkVHSVNURVI6Cj4+PiArwqDCoMKgIGNhc2Ug U0RFSV8xXzBfRk5fU0RFSV9FVkVOVF9TVEFUVVM6Cj4+PiArwqDCoMKgIGNhc2UgU0RFSV8xXzBf Rk5fU0RFSV9FVkVOVF9HRVRfSU5GTzoKPj4+ICvCoMKgwqAgY2FzZSBTREVJXzFfMF9GTl9TREVJ X0VWRU5UX1JPVVRJTkdfU0VUOgo+Pj4gK8KgwqDCoCBjYXNlIFNERUlfMV8wX0ZOX1NERUlfUEVf TUFTSzoKPj4+ICvCoMKgwqAgY2FzZSBTREVJXzFfMF9GTl9TREVJX1BFX1VOTUFTSzoKPj4+ICvC oMKgwqAgY2FzZSBTREVJXzFfMF9GTl9TREVJX0lOVEVSUlVQVF9CSU5EOgo+Pj4gK8KgwqDCoCBj YXNlIFNERUlfMV8wX0ZOX1NERUlfSU5URVJSVVBUX1JFTEVBU0U6Cj4+PiArwqDCoMKgIGNhc2Ug U0RFSV8xXzBfRk5fU0RFSV9QUklWQVRFX1JFU0VUOgo+Pj4gK8KgwqDCoCBjYXNlIFNERUlfMV8w X0ZOX1NERUlfU0hBUkVEX1JFU0VUOgo+Pj4gK8KgwqDCoCBkZWZhdWx0Ogo+Pj4gK8KgwqDCoMKg wqDCoMKgIHJldCA9IFNERUlfTk9UX1NVUFBPUlRFRDsKPj4+ICvCoMKgwqAgfQo+Pj4gKwo+Pj4g K8KgwqDCoCAvKgo+Pj4gK8KgwqDCoMKgICogV2UgZG9uJ3QgaGF2ZSByZXR1cm4gdmFsdWUgZm9y IENPTVBMRVRFIG9yIENPTVBMRVRFX0FORF9SRVNVTUUKPj4+ICvCoMKgwqDCoCAqIGh5cGVyY2Fs bHMuIE90aGVyd2lzZSwgdGhlIHJlc3RvcmVkIGNvbnRleHQgd2lsbCBiZSBjb3JydXB0ZWQuCj4+ PiArwqDCoMKgwqAgKi8KPj4+ICvCoMKgwqAgaWYgKGhhc19yZXN1bHQpCj4+PiArwqDCoMKgwqDC oMKgwqAgc21jY2Nfc2V0X3JldHZhbCh2Y3B1LCByZXQsIDAsIDAsIDApOwo+PiBJZiBJIHVuZGVy c3RhbmQgdGhlIGFib3ZlIGNvbW1lbnQsIENPTVBMRVRFIGFuZCBDT01QTEVURV9BTkRfUkVTVU1F Cj4+IHNob3VsZCBoYXZlIGhhc19yZXN1bHQgc2V0IHRvIGZhbHNlIHdoZXJlYXMgaW4gdGhhdCBj YXNlIHRoZXkgd2lsbAo+PiByZXR1cm4gTk9UX1NVUFBPUlRFRC4gSXMgdGhhdCBPSyBmb3IgdGhl IGNvbnRleHQgcmVzdG9yZT8KPiAKPiBOaWNlIGNhdGNoISBAaGFzX3Jlc3VsdCBuZWVkcyB0byBi ZSBmYWxzZSBmb3IgQ09NUExFVEUgYW5kCj4gQ09NUExFVEVfQU5EX1JFU1VNRS4KPiAKPj4+ICsK Pj4+ICvCoMKgwqAgcmV0dXJuIDE7Cj4+PiArfQo+Pj4gKwo+Pj4gK3ZvaWQga3ZtX3NkZWlfaW5p dF92bShzdHJ1Y3Qga3ZtICprdm0pCj4+PiArewo+Pj4gK8KgwqDCoCBzdHJ1Y3Qga3ZtX3NkZWlf a3ZtICprc2RlaTsKPj4+ICvCoMKgwqAgc3RydWN0IGt2bV9zZGVpX2V2ZW50ICprc2U7Cj4+PiAr wqDCoMKgIGludCBpOwo+Pj4gKwo+Pj4gK8KgwqDCoCBrc2RlaSA9IGt6YWxsb2Moc2l6ZW9mKCpr c2RlaSksIEdGUF9LRVJORUwpOwo+Pj4gK8KgwqDCoCBpZiAoIWtzZGVpKQo+Pj4gK8KgwqDCoMKg wqDCoMKgIHJldHVybjsKPj4+ICsKPj4+ICvCoMKgwqAgc3Bpbl9sb2NrX2luaXQoJmtzZGVpLT5s b2NrKTsKPj4+ICvCoMKgwqAgSU5JVF9MSVNUX0hFQUQoJmtzZGVpLT5ldmVudHMpOwo+Pj4gK8Kg wqDCoCBJTklUX0xJU1RfSEVBRCgma3NkZWktPmt2bV9ldmVudHMpOwo+Pj4gKwo+Pj4gK8KgwqDC oCAvKgo+Pj4gK8KgwqDCoMKgICogUG9wdWxhdGUgdGhlIGRlZmluZWQgS1ZNIFNERUkgZXZlbnRz LiBUaGUgd2hvbGUgZnVuY3Rpb25hbGl0eQo+Pj4gK8KgwqDCoMKgICogd2lsbCBiZSBkaXNhYmxl ZCBvbiBhbnkgZXJyb3JzLgo+PiBZb3Ugc2hvdWxkIGRlZmluaXRpdmVseSByZXZpc2UgeW91ciBu YW1pbmcgY29udmVudGlvbnMuIHRoaXMgYnJpbmdzCj4+IGNvbmZ1c2lvbiBpbmJldHdlZW4gZXhw b3J0ZWQgZXZlbnRzIGFuZCByZWdpc3RlcmVkIGV2ZW50cy4gV2h5IG5vdAo+PiBzaW1wbHkgYWRv cHQgdGhlIHNwZWMgdGVybWlub2xvZ3k/Cj4gCj4gWWVhaCwgSSB0aGluayBzbywgYnV0IEkgdGhp bmsgImRlZmluZWQgS1ZNIFNERUkgZXZlbnRzIiBpcyBmb2xsb3dpbmcKPiB0aGUgc3BlY2lmaWNh dGlvbiBiZWNhdXNlIHRoZSBTREVJIGV2ZW50IGlzIGRlZmluZWQgYnkgdGhlIGZpcm13YXJlCj4g YXMgdGhlIHNwZWNpZmljYXRpb24gc2F5cy4gV2UncmUgZW11bGF0aW5nIGZpcm13YXJlIGluIEtW TSBoZXJlLgo+IAo+Pj4gK8KgwqDCoMKgICovCj4+PiArwqDCoMKgIGZvciAoaSA9IDA7IGkgPCBB UlJBWV9TSVpFKGRlZmluZWRfa3NlKTsgaSsrKSB7Cj4+PiArwqDCoMKgwqDCoMKgwqAga3NlID0g a3phbGxvYyhzaXplb2YoKmtzZSksIEdGUF9LRVJORUwpOwo+Pj4gK8KgwqDCoMKgwqDCoMKgIGlm ICgha3NlKSB7Cj4+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBrdm1fc2RlaV9yZW1vdmVfZXZl bnRzKGt2bSk7Cj4+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBrZnJlZShrc2RlaSk7Cj4+PiAr wqDCoMKgwqDCoMKgwqDCoMKgwqDCoCByZXR1cm47Cj4+PiArwqDCoMKgwqDCoMKgwqAgfQo+PiBB ZGQgYSBjb21tZW50IHNheWluZyB0aGF0IGRlc3BpdGUgd2UgY3VycmVudGx5IHN1cHBvcnQgYSBz aW5nbGUgc3RhdGljCj4+IGV2ZW50IHdlIHByZXBhcmUgZm9yIGJpbmRpbmcgc3VwcG9ydCBieSBi dWlsZGluZyBhIGxpc3Qgb2YgZXhwb3NlZAo+PiBldmVudHM/Cj4+Cj4+IE9yIG1heWJlIHNpbXBs aWZ5IHRoZSBpbXBsZW1lbnRhdGlvbiBhdCB0aGlzIHN0YWdlIG9mIHRoZSBkZXZlbG9wbWVudAo+ PiBhc3N1bWluZyBhIHNpbmdsZSBwbGF0Zm9ybSBldmVudCBpcyBzdXBwb3J0ZWQ/Cj4gCj4gSSB3 aWxsIGFkZCBjb21tZW50IGFzIHlvdSBzdWdnZXN0ZWQgaW4gbmV4dCByZXNwaW4uIE5vdGUgdGhh dCBhbm90aGVyIGVudHJ5Cj4gd2lsbCBiZSBhZGRlZCB0byB0aGUgZGVmaW5lZCBldmVudCBhcnJh eSB3aGVuIEFzeW5jIFBGIGlzIGludm9sdmVkLgo+IAo+Pj4gKwo+Pj4gK8KgwqDCoMKgwqDCoMKg IGtzZS0+a3ZtwqDCoCA9IGt2bTsKPj4+ICvCoMKgwqDCoMKgwqDCoCBrc2UtPnN0YXRlID0gZGVm aW5lZF9rc2VbaV07Cj4+PiArwqDCoMKgwqDCoMKgwqAgbGlzdF9hZGRfdGFpbCgma3NlLT5saW5r LCAma3NkZWktPmV2ZW50cyk7Cj4+PiArwqDCoMKgIH0KPj4+ICsKPj4+ICvCoMKgwqAga3ZtLT5h cmNoLnNkZWkgPSBrc2RlaTsKPj4+ICt9Cj4+PiArCj4+PiArdm9pZCBrdm1fc2RlaV9jcmVhdGVf dmNwdShzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpCj4+PiArewo+Pj4gK8KgwqDCoCBzdHJ1Y3Qga3Zt ICprdm0gPSB2Y3B1LT5rdm07Cj4+PiArwqDCoMKgIHN0cnVjdCBrdm1fc2RlaV92Y3B1ICp2c2Rl aTsKPj4+ICsKPj4+ICvCoMKgwqAgaWYgKCFrdm0tPmFyY2guc2RlaSkKPj4+ICvCoMKgwqDCoMKg wqDCoCByZXR1cm47Cj4+PiArCj4+PiArwqDCoMKgIHZzZGVpID0ga3phbGxvYyhzaXplb2YoKnZz ZGVpKSwgR0ZQX0tFUk5FTCk7Cj4+PiArwqDCoMKgIGlmICghdnNkZWkpCj4+PiArwqDCoMKgwqDC oMKgwqAgcmV0dXJuOwo+Pj4gKwo+Pj4gK8KgwqDCoCBzcGluX2xvY2tfaW5pdCgmdnNkZWktPmxv Y2spOwo+Pj4gK8KgwqDCoCB2c2RlaS0+c3RhdGUubWFza2VkwqDCoMKgwqDCoMKgID0gMTsKPj4+ ICvCoMKgwqAgdnNkZWktPnN0YXRlLmNyaXRpY2FsX251bSA9IEtWTV9TREVJX0lOVkFMSURfTlVN Owo+Pj4gK8KgwqDCoCB2c2RlaS0+c3RhdGUubm9ybWFsX251bcKgwqAgPSBLVk1fU0RFSV9JTlZB TElEX05VTTsKPj4+ICvCoMKgwqAgdnNkZWktPmNyaXRpY2FsX2V2ZW50wqDCoMKgwqAgPSBOVUxM Owo+Pj4gK8KgwqDCoCB2c2RlaS0+bm9ybWFsX2V2ZW50wqDCoMKgwqDCoMKgID0gTlVMTDsKPj4+ ICvCoMKgwqAgSU5JVF9MSVNUX0hFQUQoJnZzZGVpLT5jcml0aWNhbF9ldmVudHMpOwo+Pj4gK8Kg wqDCoCBJTklUX0xJU1RfSEVBRCgmdnNkZWktPm5vcm1hbF9ldmVudHMpOwo+Pj4gKwo+Pj4gK8Kg wqDCoCB2Y3B1LT5hcmNoLnNkZWkgPSB2c2RlaTsKPj4+ICt9Cj4+PiArCj4+PiArdm9pZCBrdm1f c2RlaV9kZXN0cm95X3ZjcHUoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KQo+Pj4gK3sKPj4+ICvCoMKg wqAgc3RydWN0IGt2bV9zZGVpX3ZjcHUgKnZzZGVpID0gdmNwdS0+YXJjaC5zZGVpOwo+Pj4gKwo+ Pj4gK8KgwqDCoCBpZiAodnNkZWkpIHsKPj4+ICvCoMKgwqDCoMKgwqDCoCBzcGluX2xvY2soJnZz ZGVpLT5sb2NrKTsKPj4+ICvCoMKgwqDCoMKgwqDCoCBrdm1fc2RlaV9yZW1vdmVfdmNwdV9ldmVu dHModmNwdSk7Cj4+PiArwqDCoMKgwqDCoMKgwqAgc3Bpbl91bmxvY2soJnZzZGVpLT5sb2NrKTsK Pj4+ICsKPj4+ICvCoMKgwqDCoMKgwqDCoCBrZnJlZSh2c2RlaSk7Cj4+PiArwqDCoMKgwqDCoMKg wqAgdmNwdS0+YXJjaC5zZGVpID0gTlVMTDsKPj4+ICvCoMKgwqAgfQo+Pj4gK30KPj4+ICsKPj4+ ICt2b2lkIGt2bV9zZGVpX2Rlc3Ryb3lfdm0oc3RydWN0IGt2bSAqa3ZtKQo+Pj4gK3sKPj4+ICvC oMKgwqAgc3RydWN0IGt2bV9zZGVpX2t2bSAqa3NkZWkgPSBrdm0tPmFyY2guc2RlaTsKPj4+ICvC oMKgwqAgdW5zaWduZWQgaW50IG1hc2sgPSAoMSA8PCBTREVJX0VWRU5UX1RZUEVfUFJJVkFURSkg fAo+Pj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCAoMSA8PCBTREVJX0VWRU5UX1RZ UEVfU0hBUkVEKTsKPj4+ICsKPj4+ICvCoMKgwqAgaWYgKGtzZGVpKSB7Cj4+PiArwqDCoMKgwqDC oMKgwqAgc3Bpbl9sb2NrKCZrc2RlaS0+bG9jayk7Cj4+PiArwqDCoMKgwqDCoMKgwqAga3ZtX3Nk ZWlfcmVtb3ZlX2t2bV9ldmVudHMoa3ZtLCBtYXNrLCB0cnVlKTs+ICvCoMKgwqDCoMKgwqDCoAo+ Pj4ga3ZtX3NkZWlfcmVtb3ZlX2V2ZW50cyhrdm0pOwo+Pj4gK8KgwqDCoMKgwqDCoMKgIHNwaW5f dW5sb2NrKCZrc2RlaS0+bG9jayk7Cj4+PiArCj4+PiArwqDCoMKgwqDCoMKgwqAga2ZyZWUoa3Nk ZWkpOwo+Pj4gK8KgwqDCoMKgwqDCoMKgIGt2bS0+YXJjaC5zZGVpID0gTlVMTDsKPj4+ICvCoMKg wqAgfQo+Pj4gK30KPj4+Cj4gCj4gVGhhbmtzLAo+IEdhdmluCj4gClRoYW5rcwoKRXJpYwoKX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18Ka3ZtYXJtIG1haWxp bmcgbGlzdAprdm1hcm1AbGlzdHMuY3MuY29sdW1iaWEuZWR1Cmh0dHBzOi8vbGlzdHMuY3MuY29s dW1iaWEuZWR1L21haWxtYW4vbGlzdGluZm8va3ZtYXJtCg==