From mboxrd@z Thu Jan 1 00:00:00 1970 From: John Harrison Subject: Re: [PATCH v4 07/38] drm/i915: Start of GPU scheduler Date: Thu, 18 Feb 2016 14:22:56 +0000 Message-ID: <56C5D3C0.5070406@Intel.com> References: <1448278774-31376-1-git-send-email-John.C.Harrison@Intel.com> <1452537788-32136-1-git-send-email-John.C.Harrison@Intel.com> <1452537788-32136-8-git-send-email-John.C.Harrison@Intel.com> <1453295913.7637.55.camel@linux.intel.com> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8"; Format="flowed" Content-Transfer-Encoding: base64 Return-path: Received: from mga11.intel.com (mga11.intel.com [192.55.52.93]) by gabe.freedesktop.org (Postfix) with ESMTP id 21C416E353 for ; Thu, 18 Feb 2016 14:23:00 +0000 (UTC) In-Reply-To: <1453295913.7637.55.camel@linux.intel.com> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: intel-gfx-bounces@lists.freedesktop.org Sender: "Intel-gfx" To: Joonas Lahtinen , Intel-GFX@Lists.FreeDesktop.Org List-Id: intel-gfx@lists.freedesktop.org T24gMjAvMDEvMjAxNiAxMzoxOCwgSm9vbmFzIExhaHRpbmVuIHdyb3RlOgo+IEhpLAo+Cj4gQ29t bWVudHMgYmVsb3cgdGhpcyBwcmUgdGV4dC4KPgo+IE1hbnkgb2YgdGhlIGNvbW1lbnRzIGFyZSBy ZWxhdGVkIHRvIHRoZSBpbmRlbnQgYW5kIHN0eWxlIG9mIHRoZSBjb2RlLgo+IFRoYXQgc3R1ZmYg aXMgaW1wb3J0YW50IHRvIGZpeCBmb3IgZnV0dXJlIG1haW50YWluYWJpbGl0eS4gSW4gb3JkZXIg Zm9yCj4gdGhlIGZ1dHVyZSByZXZpZXcgdG8gYmUgbW9yZSBlZmZlY3RpdmUsIEknZCBsaWtlIHRv IG5leHQgc2VlIGEgdjUgb2YKPiB0aGUgc2VyaWVzIHdoZXJlIHRoZSBjb2RlIHF1YWxpdHkgY29u Y2VybnMgaGF2ZSBiZWVuIGFkZHJlc3NlZCwgcGF0Y2hlcwo+IHNxdWFzaGVkIHRvIGJlIGFjdHVh bCByZXZpZXdhYmxlIGNodW5rcyBhbmQgYXBwcm9wcmlhdGUga2VybmVsZG9jIGJlaW5nCj4gYWRk ZWQuCj4KPiBUbyBnaXZlIGFuIGlkZWEgb2YgcHJvcGVyIHNsaWNpbmcgb2YgcGF0Y2hlcywgZmly c3QgcHJvZHVjZSBhIG5vLW9wCj4gc2NoZWR1bGVyLCBhZGRpbmcgdGhlIGV4dHJhIGZ1bmN0aW9u IGNhbGxzIHdoZXJlIG5lZWRlZCBhbmQgc3RpbGwKPiBrZWVwaW5nIHRoZSBzY2hlZHVsaW5nIGNv bXBsZXRlbHkgbGluZWFyLiBTZWNvbmQgcGF0Y2ggY291bGQgaW50cm9kdWNlCj4gb3V0IG9mIG9y ZGVyIHN1Ym1pdHRpbmcsIHRoaXJkIG9uZSBwcmlvcml0eSBidW1waW5nLCBmb3VydGggcHJlLWVt cHRpbmcKPiBhbmQgc28gb24uIFRoYXQgd2F5LCBlYWNoIHBhdGNoIGV4dGVuZHMgdGhlIGZ1bmN0 aW9uYWxpdHkgYW5kIGlzIGl0c2VsZgo+IGFscmVhZHkgbWVyZ2VhYmxlLiBUaGF0IHdheSBJJ3Zl IGJlZW4gYWJsZSB0byBnbyB0aHJvdWdoIGFuZCB1bmRlcnN0YW5kCj4gdGhlIGV4aXN0aW5nIGNv ZGUsIGFuZCBJIGNhbiBhY3R1YWxseSByZXZpZXcgKG90aGVyIHRoYW4ganVzdCBuYWcgYWJvdXQK PiBpbmRlbnQgYW5kIGNvZGluZyBzdHlsZSkgaWYgdGhlIGNoYW5nZXMgYXJlIGFwcHJvcHJpYXRl IHRvIGJyaW5nIGluIHRoZQo+IGZ1bmN0aW9uYWxpdHkgZGVzaXJlZC4KPgo+IEluIHRoZSBjdXJy ZW50IHNwbGl0LCBmb3IgbWUgb3IgYW55b25lIHdobyBkaWQgbm90IHBhcnRpY2lwYXRlIHdyaXRp bmcKPiB0aGUgY29kZSwgaXQgaXMgb3RoZXJ3aXNlIHRvbyBjb25mdXNpbmcgdG8gdHJ5IHRvIGd1 ZXNzIHdoYXQgZnV0dXJlCj4gY2hhbmdlcyBtaWdodCBtYWtlIGVhY2ggcGllY2Ugb2YgY29kZSBt YWtlIHNlbnNlLCBhbmQgd2hpY2ggd2lsbCBiZQo+IHJlZHVuZGFudCBpbiB0aGUgZnV0dXJlIHRv by4gVGhlcmUgaXMgbm8gdmFsdWUgaW4gc3BsaXR0aW5nIGNvZGUgdG8KPiBjaHVua3MgdGhhdCBh cmUgbm90IGl0c2VsZiBmdW5jdGlvbmFsLgo+Cj4gUmVnYXJkcywgSm9vbmFzCj4KPiBPbiBNb24s IDIwMTYtMDEtMTEgYXQgMTg6NDIgKzAwMDAsIEpvaG4uQy5IYXJyaXNvbkBJbnRlbC5jb20gd3Jv dGU6Cj4+IEZyb206IEpvaG4gSGFycmlzb24gPEpvaG4uQy5IYXJyaXNvbkBJbnRlbC5jb20+Cj4+ Cj4+IEluaXRpYWwgY3JlYXRpb24gb2Ygc2NoZWR1bGVyIHNvdXJjZSBmaWxlcy4gTm90ZSB0aGF0 IHRoaXMgcGF0Y2gKPj4gaW1wbGVtZW50cyBtb3N0IG9mIHRoZSBzY2hlZHVsZXIgZnVuY3Rpb25h bGl0eSBidXQgZG9lcyBub3QgaG9vayBpdAo+PiBpbgo+PiB0byB0aGUgZHJpdmVyIHlldC4gSXQg YWxzbyBsZWF2ZXMgdGhlIHNjaGVkdWxlciBjb2RlIGluICdwYXNzCj4+IHRocm91Z2gnCj4+IG1v ZGUgc28gdGhhdCBldmVuIHdoZW4gaXQgaXMgaG9va2VkIGluLCBpdCB3aWxsIG5vdCBhY3R1YWxs eSBkbyB2ZXJ5Cj4+IG11Y2guIFRoaXMgYWxsb3dzIHRoZSBob29rcyB0byBiZSBhZGRlZCBvbmUg YXQgYSB0aW1lIGluIGJpdGUgc2l6ZQo+PiBjaHVua3MgYW5kIG9ubHkgd2hlbiB0aGUgc2NoZWR1 bGVyIGlzIGZpbmFsbHkgZW5hYmxlZCBhdCB0aGUgZW5kIGRvZXMKPj4gYW55dGhpbmcgc3RhcnQg aGFwcGVuaW5nLgo+Pgo+PiBUaGUgZ2VuZXJhbCB0aGVvcnkgb2Ygb3BlcmF0aW9uIGlzIHRoYXQg d2hlbiBiYXRjaCBidWZmZXJzIGFyZQo+PiBzdWJtaXR0ZWQgdG8gdGhlIGRyaXZlciwgdGhlIGV4 ZWNidWZmZXIoKSBjb2RlIHBhY2thZ2VzIHVwIGFsbCB0aGUKPj4gaW5mb3JtYXRpb24gcmVxdWly ZWQgdG8gZXhlY3V0ZSB0aGUgYmF0Y2ggYnVmZmVyIGF0IGEgbGF0ZXIgdGltZS4KPj4gVGhpcwo+ PiBwYWNrYWdlIGlzIGdpdmVuIG92ZXIgdG8gdGhlIHNjaGVkdWxlciB3aGljaCBhZGRzIGl0IHRv IGFuIGludGVybmFsCj4+IG5vZGUgbGlzdC4gVGhlIHNjaGVkdWxlciBhbHNvIHNjYW5zIHRoZSBs aXN0IG9mIG9iamVjdHMgYXNzb2NpYXRlZAo+PiB3aXRoIHRoZSBiYXRjaCBidWZmZXIgYW5kIGNv bXBhcmVzIHRoZW0gYWdhaW5zdCB0aGUgb2JqZWN0cyBhbHJlYWR5Cj4+IGluCj4+IHVzZSBieSBv dGhlciBidWZmZXJzIGluIHRoZSBub2RlIGxpc3QuIElmIG1hdGNoZXMgYXJlIGZvdW5kIHRoZW4g dGhlCj4+IG5ldyBiYXRjaCBidWZmZXIgbm9kZSBpcyBtYXJrZWQgYXMgYmVpbmcgZGVwZW5kZW50 IHVwb24gdGhlIG1hdGNoaW5nCj4+IG5vZGUuIFRoZSBzYW1lIGlzIGRvbmUgZm9yIHRoZSBjb250 ZXh0IG9iamVjdC4gVGhlIHNjaGVkdWxlciBhbHNvCj4+IGJ1bXBzIHVwIHRoZSBwcmlvcml0eSBv ZiBzdWNoIG1hdGNoaW5nIG5vZGVzIG9uIHRoZSBncm91bmRzIHRoYXQgdGhlCj4+IG1vcmUgZGVw ZW5kZW5jaWVzIGEgZ2l2ZW4gYmF0Y2ggYnVmZmVyIGhhcyB0aGUgbW9yZSBpbXBvcnRhbnQgaXQg aXMKPj4gbGlrZWx5IHRvIGJlLgo+Pgo+PiBUaGUgc2NoZWR1bGVyIGFpbXMgdG8gaGF2ZSBhIGdp dmVuICh0dW5lYWJsZSkgbnVtYmVyIG9mIGJhdGNoIGJ1ZmZlcnMKPj4gaW4gZmxpZ2h0IG9uIHRo ZSBoYXJkd2FyZSBhdCBhbnkgZ2l2ZW4gdGltZS4gSWYgZmV3ZXIgdGhhbiB0aGlzIGFyZQo+PiBj dXJyZW50bHkgZXhlY3V0aW5nIHdoZW4gYSBuZXcgbm9kZSBpcyBxdWV1ZWQsIHRoZW4gdGhlIG5v ZGUgaXMKPj4gcGFzc2VkCj4+IHN0cmFpZ2h0IHRocm91Z2ggdG8gdGhlIHN1Ym1pdCBmdW5jdGlv bi4gT3RoZXJ3aXNlIGl0IGlzIHNpbXBseSBhZGRlZAo+PiB0byB0aGUgcXVldWUgYW5kIHRoZSBk cml2ZXIgcmV0dXJucyBiYWNrIHRvIHVzZXIgbGFuZC4KPj4KPj4gVGhlIHNjaGVkdWxlciBpcyBu b3RpZmllZCB3aGVuIGVhY2ggYmF0Y2ggYnVmZmVyIGNvbXBsZXRlcyBhbmQKPj4gdXBkYXRlcwo+ PiBpdHMgaW50ZXJuYWwgdHJhY2tpbmcgYWNjb3JkaW5nbHkuIEF0IHRoZSBlbmQgb2YgdGhlIGNv bXBsZXRpb24KPj4gaW50ZXJydXB0IHByb2Nlc3NpbmcsIGlmIGFueSBzY2hlZHVsZXIgdHJhY2tl ZCBiYXRjaGVzIHdlcmUKPj4gcHJvY2Vzc2VkLAo+PiB0aGUgc2NoZWR1bGVyJ3MgZGVmZXJyZWQg d29ya2VyIHRocmVhZCBpcyB3b2tlbiB1cC4gVGhpcyBjYW4gZG8gbW9yZQo+PiBpbnZvbHZlZCBw cm9jZXNzaW5nIHN1Y2ggYXMgYWN0dWFsbHkgcmVtb3ZpbmcgY29tcGxldGVkIG5vZGVzIGZyb20K Pj4gdGhlCj4+IHF1ZXVlIGFuZCBmcmVlaW5nIHVwIHRoZSByZXNvdXJjZXMgYXNzb2NpYXRlZCB3 aXRoIHRoZW0gKGludGVybmFsCj4+IG1lbW9yeSBhbGxvY2F0aW9ucywgRFJNIG9iamVjdCByZWZl cmVuY2VzLCBjb250ZXh0IHJlZmVyZW5jZSwgZXRjLikuCj4+IFRoZSB3b3JrIGhhbmRsZXIgYWxz byBjaGVja3MgdGhlIGluIGZsaWdodCBjb3VudCBhbmQgY2FsbHMgdGhlCj4+IHN1Ym1pc3Npb24g Y29kZSBpZiBhIG5ldyBzbG90IGhhcyBhcHBlYXJlZC4KPj4KPj4gV2hlbiB0aGUgc2NoZWR1bGVy J3Mgc3VibWl0IGNvZGUgaXMgY2FsbGVkLCBpdCBzY2FucyB0aGUgcXVldWVkIG5vZGUKPj4gbGlz dCBmb3IgdGhlIGhpZ2hlc3QgcHJpb3JpdHkgbm9kZSB0aGF0IGhhcyBubyB1bm1ldCBkZXBlbmRl bmNpZXMuCj4+IE5vdGUgdGhhdCB0aGUgZGVwZW5kZW5jeSBjYWxjdWxhdGlvbiBpcyBjb21wbGV4 IGFzIGl0IG11c3QgdGFrZQo+PiBpbnRlci1yaW5nIGRlcGVuZGVuY2llcyBhbmQgcG90ZW50aWFs IHByZWVtcHRpb25zIGludG8gYWNjb3VudC4gTm90ZQo+PiBhbHNvIHRoYXQgaW4gdGhlIGZ1dHVy ZSB0aGlzIHdpbGwgYmUgZXh0ZW5kZWQgdG8gaW5jbHVkZSBleHRlcm5hbAo+PiBkZXBlbmRlbmNp ZXMgc3VjaCBhcyB0aGUgQW5kcm9pZCBOYXRpdmUgU3luYyBmaWxlIGRlc2NyaXB0b3JzIGFuZC9v cgo+PiB0aGUgbGludXggZG1hLWJ1ZmYgc3luY2hyb25pc2F0aW9uIHNjaGVtZS4KPj4KPj4gSWYg YSBzdWl0YWJsZSBub2RlIGlzIGZvdW5kIHRoZW4gaXQgaXMgc2VudCB0byBleGVjYnVmZl9maW5h bCgpIGZvcgo+PiBzdWJtaXNzaW9uIHRvIHRoZSBoYXJkd2FyZS4gVGhlIGluIGZsaWdodCBjb3Vu dCBpcyB0aGVuIHJlLWNoZWNrZWQKPj4gYW5kCj4+IGEgbmV3IG5vZGUgcG9wcGVkIGZyb20gdGhl IGxpc3QgaWYgYXBwcm9wcmlhdGUuCj4+Cj4+IE5vdGUgdGhhdCB0aGlzIHBhdGNoIGRvZXMgbm90 IGltcGxlbWVudCBwcmUtZW1wdGl2ZSBzY2hlZHVsaW5nLiBPbmx5Cj4+IGJhc2ljIHNjaGVkdWxp bmcgYnkgcmUtb3JkZXJpbmcgYmF0Y2ggYnVmZmVyIHN1Ym1pc3Npb24gaXMgY3VycmVudGx5Cj4+ IGltcGxlbWVudGVkLiBQcmUtZW1wdGlvbiBvZiBhY3RpdmVseSBleGVjdXRpbmcgYmF0Y2ggYnVm ZmVycyBjb21lcyBpbgo+PiB0aGUgbmV4dCBwYXRjaCBzZXJpZXMuCj4+Cj4+IHYyOiBDaGFuZ2Vk IHByaW9yaXR5IGxldmVscyB0byArLy0xMDIzIGR1ZSB0byBmZWVkYmFjayBmcm9tIENocmlzCj4+ IFdpbHNvbi4KPj4KPj4gUmVtb3ZlZCByZWR1bmRhbnQgaW5kZXggZnJvbSBzY2hlZHVsZXIgbm9k ZS4KPj4KPj4gQ2hhbmdlZCB0aW1lIHN0YW1wcyB0byB1c2UgamlmZmllcyBpbnN0ZWFkIG9mIHJh dyBtb25vdG9uaWMuIFRoaXMKPj4gcHJvdmlkZXMgbG93ZXIgcmVzb2x1dGlvbiBidXQgaW1wcm92 ZWQgY29tcGF0aWJpbGl0eSB3aXRoIG90aGVyIGk5MTUKPj4gY29kZS4KPj4KPj4gTWFqb3IgcmUt d3JpdGUgb2YgY29tcGxldGlvbiB0cmFja2luZyBjb2RlIGR1ZSB0byBzdHJ1Y3QgZmVuY2UKPj4g Y29udmVyc2lvbi4gVGhlIHNjaGVkdWxlciBubyBsb25nZXIgaGFzIGl0J3Mgb3duIHByaXZhdGUg SVJRIGhhbmRsZXIKPj4gYnV0IGp1c3QgbGV0cyB0aGUgZXhpc3RpbmcgcmVxdWVzdCBjb2RlIGhh bmRsZSBjb21wbGV0aW9uIGV2ZW50cy4KPj4gSW5zdGVhZCwgdGhlIHNjaGVkdWxlciBub3cgaG9v a3MgaW50byB0aGUgcmVxdWVzdCBub3RpZnkgY29kZSB0byBiZQo+PiB0b2xkIHdoZW4gYSByZXF1 ZXN0IGhhcyBjb21wbGV0ZWQuCj4+Cj4+IFJlZHVjZWQgZHJpdmVyIG11dGV4IGxvY2tpbmcgc2Nv cGUuIFJlbW92YWwgb2Ygc2NoZWR1bGVyIG5vZGVzIG5vCj4+IGxvbmdlciBncmFicyB0aGUgbXV0 ZXggbG9jay4KPj4KPj4gdjM6IFJlZmFjdG9yIG9mIGRlcGVuZGVuY3kgZ2VuZXJhdGlvbiB0byBt YWtlIHRoZSBjb2RlIG1vcmUgcmVhZGFibGUuCj4+IEFsc28gYWRkZWQgaW4gcmVhZC1yZWFkIG9w dGltaXNhdGlvbiBzdXBwb3J0IC0gaS5lLiwgZG9uJ3QgdHJlYXQgYQo+PiBzaGFyZWQgcmVhZC1v bmx5IGJ1ZmZlciBhcyBiZWluZyBhIGRlcGVuZGVuY3kuCj4+Cj4+IEFsbG93ZWQgdGhlIGtpbGxp bmcgb2YgcXVldWVkIG5vZGVzIHJhdGhlciB0aGFuIG9ubHkgZmx5aW5nIG9uZXMuCj4+Cj4+IHY0 OiBVcGRhdGVkIHRoZSBjb21taXQgbWVzc2FnZSB0byBiZXR0ZXIgcmVmbGVjdCB0aGUgY3VycmVu dCBzdGF0ZSBvZgo+PiB0aGUgY29kZS4gRG93bmdyYWRlZCBzb21lIEJVR19PTnMgdG8gV0FSTl9P TnMuIFVzZWQgdGhlIGNvcnJlY3QgYXJyYXkKPj4gbWVtb3J5IGFsbG9jYXRvciBmdW5jdGlvbiAo a21hbGxvY19hcnJheSBpbnN0ZWFkIG9mIGttYWxsb2MpLgo+PiBDb3JyZWN0ZWQgdGhlIGZvcm1h dCBvZiBzb21lIGNvbW1lbnRzLiBXcmFwcGVkIHNvbWUgbGluZXMgZGlmZmVyZW50bHkKPj4gdG8g a2VlcCB0aGUgc3R5bGUgY2hlY2tlciBoYXBweS4KPj4KPj4gRml4ZWQgYSBXQVJOX09OIHdoZW4g a2lsbGluZyBub2Rlcy4gVGhlIGRlcGVuZGVuY3kgcmVtb3ZhbCBjb2RlCj4+IGNoZWNrcwo+PiB0 aGF0IG5vZGVzIGJlaW5nIGRlc3Ryb3llZCBkbyBub3QgaGF2ZSBhbnkgb3VzdGFuZGluZyBkZXBl bmRlbmNpZXMKPj4gKHdoaWNoIHdvdWxkIGltcGx5IHRoZXkgc2hvdWxkIG5vdCBoYXZlIGJlZW4g ZXhlY3V0ZWQgeWV0KS4gSW4gdGhlCj4+IGNhc2Ugb2Ygbm9kZXMgYmVpbmcgZGVzdHJveWVkLCBl LmcuIGR1ZSB0byBjb250ZXh0IGJhbm5pbmcsIHRoZW4gdGhpcwo+PiBtaWdodCB3ZWxsIGJlIHRo ZSBjYXNlIC0gdGhleSBoYXZlIG5vdCBiZWVuIGV4ZWN1dGVkIGFuZCBkbyBpbmRlZWQKPj4gaGF2 ZSBvdXRzdGFuZGluZyBkZXBlbmRlbmNpZXMuCj4+Cj4+IFJlLWluc3RhdGVkIHRoZSBjb2RlIHRv IGRpc2JsZSBpbnRlcnJ1cHRzIHdoZW4gbm90IGluIHVzZS4gVGhlCj4+IHVuZGVybHlpbmcgcHJv YmxlbSBjYXVzaW5nIGJyb2tlbiBJUlEgcmVmZXJlbmNlIGNvdW50cyBzZWVtcyB0byBoYXZlCj4+ IGJlZW4gZml4ZWQgbm93Lgo+Pgo+PiBGb3I6IFZJWi0xNTg3Cj4+IFNpZ25lZC1vZmYtYnk6IEpv aG4gSGFycmlzb24gPEpvaG4uQy5IYXJyaXNvbkBJbnRlbC5jb20+Cj4+IC0tLQo+PiAgIGRyaXZl cnMvZ3B1L2RybS9pOTE1L01ha2VmaWxlICAgICAgICAgfCAgIDEgKwo+PiAgIGRyaXZlcnMvZ3B1 L2RybS9pOTE1L2k5MTVfZHJ2LmggICAgICAgfCAgIDQgKwo+PiAgIGRyaXZlcnMvZ3B1L2RybS9p OTE1L2k5MTVfZ2VtLmMgICAgICAgfCAgIDUgKwo+PiAgIGRyaXZlcnMvZ3B1L2RybS9pOTE1L2k5 MTVfc2NoZWR1bGVyLmMgfCA3OTcKPj4gKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysr Kwo+PiAgIGRyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfc2NoZWR1bGVyLmggfCAgOTEgKysrKwo+ PiAgIDUgZmlsZXMgY2hhbmdlZCwgODk4IGluc2VydGlvbnMoKykKPj4gICBjcmVhdGUgbW9kZSAx MDA2NDQgZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9zY2hlZHVsZXIuYwo+PiAgIGNyZWF0ZSBt b2RlIDEwMDY0NCBkcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X3NjaGVkdWxlci5oCj4+Cj4+IGRp ZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9NYWtlZmlsZSBiL2RyaXZlcnMvZ3B1L2Ry bS9pOTE1L01ha2VmaWxlCj4+IGluZGV4IDE1Mzk4YzUuLjc5Y2IzOGIgMTAwNjQ0Cj4+IC0tLSBh L2RyaXZlcnMvZ3B1L2RybS9pOTE1L01ha2VmaWxlCj4+ICsrKyBiL2RyaXZlcnMvZ3B1L2RybS9p OTE1L01ha2VmaWxlCj4+IEBAIC0xMCw2ICsxMCw3IEBAIGNjZmxhZ3MteSA6PSAtV2Vycm9yCj4+ ICAgaTkxNS15IDo9IGk5MTVfZHJ2Lm8gXAo+PiAgIAkgIGk5MTVfaXJxLm8gXAo+PiAgIAkgIGk5 MTVfcGFyYW1zLm8gXAo+PiArCSAgaTkxNV9zY2hlZHVsZXIubyBcCj4+ICAgICAgICAgICAgIGk5 MTVfc3VzcGVuZC5vIFwKPj4gICAJICBpOTE1X3N5c2ZzLm8gXAo+PiAgIAkgIGludGVsX2Nzci5v IFwKPj4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfZHJ2LmggYi9kcml2 ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2Rydi5oCj4+IGluZGV4IDEwZGZmZGQuLjM4ZjQyM2IgMTAw NjQ0Cj4+IC0tLSBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfZHJ2LmgKPj4gKysrIGIvZHJp dmVycy9ncHUvZHJtL2k5MTUvaTkxNV9kcnYuaAo+PiBAQCAtMTY5NSw2ICsxNjk1LDggQEAgc3Ry dWN0IGk5MTVfZXhlY2J1ZmZlcl9wYXJhbXMgewo+PiAgIAlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX3Jl cXVlc3QgICAgICpyZXF1ZXN0Owo+PiAgIH07Cj4+ICAgCj4+ICtzdHJ1Y3QgaTkxNV9zY2hlZHVs ZXI7Cj4+ICsKPiBSYXRoZXIgYWRkICJpOTE1X3NjaGVkdWxlci5oIiBpbmNsdWRlIGF0IHRoZSB0 b3AgYW5kIGVsaW1pbmF0ZSBjaXJjdWxhcgo+IGluY2x1ZGUgZGVwZW5kZW5jaWVzLiBUaGlzIGlz IG5lZWRlZCBmb3IgdGhlIG5leHQgY29tbWVudC4KPgo+PiAgIC8qIHVzZWQgaW4gY29tcHV0aW5n IHRoZSBuZXcgd2F0ZXJtYXJrcyBzdGF0ZSAqLwo+PiAgIHN0cnVjdCBpbnRlbF93bV9jb25maWcg ewo+PiAgIAl1bnNpZ25lZCBpbnQgbnVtX3BpcGVzX2FjdGl2ZTsKPj4gQEAgLTE5NDcsNiArMTk0 OSw4IEBAIHN0cnVjdCBkcm1faTkxNV9wcml2YXRlIHsKPj4gICAKPj4gICAJc3RydWN0IGk5MTVf cnVudGltZV9wbSBwbTsKPj4gICAKPj4gKwlzdHJ1Y3QgaTkxNV9zY2hlZHVsZXIgKnNjaGVkdWxl cjsKPj4gKwo+IEFzIHRoZSBzY2hlZHVsZXIgaXMgZ29pbmcgdG8gYmUgZW5hYmxlZCBvbiBhbGwg cGxhdGZvcm1zIHRvIGFuIGV4dGVudCwKPiBubyBwb2ludCBpbiBtYWtpbmcgaXQgYSBwb2ludGVy LiBKdXN0IG1ha2luZyBpdCBtZW1iZXIgbGlrZSAicG0iIGlzIHRoZQo+IGJlc3QsIHRoaXMgYWxz byByZXF1aXJlcyB0aGUgYWJvdmUgaW5jbHVkZSBjaGFuZ2UuCj4KPj4gICAJLyogQWJzdHJhY3Qg dGhlIHN1Ym1pc3Npb24gbWVjaGFuaXNtIChsZWdhY3kgcmluZ2J1ZmZlciBvciBleGVjbGlzdHMp IGF3YXkgKi8KPj4gICAJc3RydWN0IHsKPj4gICAJCWludCAoKmV4ZWNidWZfc3VibWl0KShzdHJ1 Y3QgaTkxNV9leGVjYnVmZmVyX3BhcmFtcyAqcGFyYW1zLAo+PiBkaWZmIC0tZ2l0IGEvZHJpdmVy cy9ncHUvZHJtL2k5MTUvaTkxNV9nZW0uYyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfZ2Vt LmMKPj4gaW5kZXggY2ZmMzc2OC4uNDdhYTg1YiAxMDA2NDQKPj4gLS0tIGEvZHJpdmVycy9ncHUv ZHJtL2k5MTUvaTkxNV9nZW0uYwo+PiArKysgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2dl bS5jCj4+IEBAIC0zNyw2ICszNyw3IEBACj4+ICAgI2luY2x1ZGUKPj4gICAjaW5jbHVkZQo+PiAg ICNpbmNsdWRlCj4+ICsjaW5jbHVkZSAiaTkxNV9zY2hlZHVsZXIuaCIKPj4gICAKPiBUaGlzIHNo b3VsZCBnbyBiZWZvcmUgYW55IDxsaW51eC8uLi4+IG5vdCB0byBtYXNrIG1pc3NpbmcgaW5jbHVk ZXMgZnJvbQo+IHRoZSBoZWFkZXIgaXRzZWxmLCBzbyBjb3JyZWN0IHBsYWNlIHdvdWxkIGJlIHJp Z2h0IGFmdGVyICNpbmNsdWRlCj4gImk5MTVfdHJhY2UuaCIKPgo+PiAgICNkZWZpbmUgUlFfQlVH X09OKGV4cHIpCj4+ICAgCj4+IEBAIC01MjQyLDYgKzUyNDMsMTAgQEAgaW50IGk5MTVfZ2VtX2lu aXQoc3RydWN0IGRybV9kZXZpY2UgKmRldikKPj4gICAJICovCj4+ICAgCWludGVsX3VuY29yZV9m b3JjZXdha2VfZ2V0KGRldl9wcml2LCBGT1JDRVdBS0VfQUxMKTsKPj4gICAKPj4gKwlyZXQgPSBp OTE1X3NjaGVkdWxlcl9pbml0KGRldik7Cj4+ICsJaWYgKHJldCkKPj4gKwkJZ290byBvdXRfdW5s b2NrOwo+PiArCj4+ICAgCXJldCA9IGk5MTVfZ2VtX2luaXRfdXNlcnB0cihkZXYpOwo+PiAgIAlp ZiAocmV0KQo+PiAgIAkJZ290byBvdXRfdW5sb2NrOwo+PiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9n cHUvZHJtL2k5MTUvaTkxNV9zY2hlZHVsZXIuYyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVf c2NoZWR1bGVyLmMKPj4gbmV3IGZpbGUgbW9kZSAxMDA2NDQKPj4gaW5kZXggMDAwMDAwMC4uOGNi OTA2Mwo+PiAtLS0gL2Rldi9udWxsCj4+ICsrKyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVf c2NoZWR1bGVyLmMKPj4gQEAgLTAsMCArMSw3OTcgQEAKPj4gKy8qCj4+ICsgKiBDb3B5cmlnaHQg KGMpIDIwMTQgSW50ZWwgQ29ycG9yYXRpb24KPj4gKyAqCj4+ICsgKiBQZXJtaXNzaW9uIGlzIGhl cmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQo+ PiArICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24g ZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKPj4gKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdp dGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KPj4gKyAqIHRo ZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRl LCBzdWJsaWNlbnNlLAo+PiArICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwg YW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCj4+ICsgKiBTb2Z0d2FyZSBpcyBmdXJu aXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgo+PiAr ICoKPj4gKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24g bm90aWNlIChpbmNsdWRpbmcgdGhlIG5leHQKPj4gKyAqIHBhcmFncmFwaCkgc2hhbGwgYmUgaW5j bHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUKPj4gKyAq IFNvZnR3YXJlLgo+PiArICoKPj4gKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMi LCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCj4+ICsgKiBJTVBMSUVE LCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5U QUJJTElUWSwKPj4gKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05J TkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAo+PiArICogVEhFIEFVVEhPUlMgT1IgQ09Q WVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIK Pj4gKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQg T1IgT1RIRVJXSVNFLCBBUklTSU5HCj4+ICsgKiBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElP TiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTCj4+ICsgKiBJ TiBUSEUgU09GVFdBUkUuCj4+ICsgKgo+PiArICovCj4+ICsKPj4gKyNpbmNsdWRlICJpOTE1X2Ry di5oIgo+PiArI2luY2x1ZGUgImludGVsX2Rydi5oIgo+PiArI2luY2x1ZGUgImk5MTVfc2NoZWR1 bGVyLmgiCj4gQWdhaW4sIHRoaXMgaW5jbHVkZSBzaG91bGQgYmUgdGhlIHRvcCBvbmUsIHNob3Vs ZCBub3QgcmVxdWlyZSBhbnkKPiBpbmNsdWRlcyBiZWZvcmUgaXQuCj4KPj4gKwo+PiArc3RhdGlj IGludCAgICAgICAgIGk5MTVfc2NoZWR1bGVyX2ZseV9ub2RlKHN0cnVjdCBpOTE1X3NjaGVkdWxl cl9xdWV1ZV9lbnRyeSAqbm9kZSk7Cj4+ICtzdGF0aWMgaW50ICAgICAgICAgaTkxNV9zY2hlZHVs ZXJfcmVtb3ZlX2RlcGVuZGVudChzdHJ1Y3QgaTkxNV9zY2hlZHVsZXIgKnNjaGVkdWxlciwKPj4g KwkJCQkJCSAgIHN0cnVjdCBpOTE1X3NjaGVkdWxlcl9xdWV1ZV9lbnRyeSAqcmVtb3ZlKTsKPj4g K3N0YXRpYyBpbnQgICAgICAgICBpOTE1X3NjaGVkdWxlcl9zdWJtaXQoc3RydWN0IGludGVsX2Vu Z2luZV9jcyAqcmluZywKPj4gKwkJCQkJIGJvb2wgaXNfbG9ja2VkKTsKPj4gK3N0YXRpYyB1aW50 MzJfdCAgICBpOTE1X3NjaGVkdWxlcl9jb3VudF9mbHlpbmcoc3RydWN0IGk5MTVfc2NoZWR1bGVy ICpzY2hlZHVsZXIsCj4+ICsJCQkJCSAgICAgICBzdHJ1Y3QgaW50ZWxfZW5naW5lX2NzICpyaW5n KTsKPj4gK3N0YXRpYyB2b2lkICAgICAgICBpOTE1X3NjaGVkdWxlcl9wcmlvcml0eV9idW1wX2Ns ZWFyKHN0cnVjdCBpOTE1X3NjaGVkdWxlciAqc2NoZWR1bGVyKTsKPj4gK3N0YXRpYyBpbnQgICAg ICAgICBpOTE1X3NjaGVkdWxlcl9wcmlvcml0eV9idW1wKHN0cnVjdCBpOTE1X3NjaGVkdWxlciAq c2NoZWR1bGVyLAo+PiArCQkJCQkJc3RydWN0IGk5MTVfc2NoZWR1bGVyX3F1ZXVlX2VudHJ5ICp0 YXJnZXQsCj4+ICsJCQkJCQl1aW50MzJfdCBidW1wKTsKPiBEbyBub3QgaW5kZW50IHRoZSBmdW5j dGlvbiBuYW1lcyBsaWtlIHRoaXMsIGl0IGJlY29tZXMgdW5tYWludGFpbmFibGUKPiBhbmQgbWVz c3kgdmVyeSBmYXN0IGlmIHNvbWVib2R5IGFkZHMgYSBuZXcgZnVuY3Rpb24gd2l0aCBhIG1vcmUg Y29tcGxleAo+IHJldHVybiB0eXBlLCB3aGljaCBpcyBhIHZlcnkgbGlrZWx5IHRoaW5nIHRvIGhh cHBlbi4KPgo+IFdoYXQgSSB3b3VsZCBkbyBpcyBtb3ZlIGFsbCB0aGUgaGVscGVyIGZ1bmN0aW9u cyBoZXJlIGF0IHRoZSB0b3AgYW5kCj4gb3JkZXIgdGhlbSBzbyB0aGF0IHRoZSBmb3J3YXJkIGRl Y2xhcmF0aW9ucyBhcmUgbm90IG5lZWRlZCwgYXQgbGVhc3QKPiBpOTE1X3NjaGVkdWxlcl9mbHlf bm9kZSBpcyBub3QgdXNlZCBiZWZvcmUgaXRzIGRlZmluaXRpb24uCj4KPj4gKwo+PiAraW50IGk5 MTVfc2NoZWR1bGVyX2luaXQoc3RydWN0IGRybV9kZXZpY2UgKmRldikKPj4gK3sKPj4gKwlzdHJ1 Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwo+PiArCXN0 cnVjdCBpOTE1X3NjaGVkdWxlciAgICpzY2hlZHVsZXIgPSBkZXZfcHJpdi0+c2NoZWR1bGVyOwo+ PiArCWludCAgICAgICAgICAgICAgICAgICAgIHI7Cj4gQWdhaW4sIHRoaXMgaW5kZW50IGlzIGEg bm8tZ28uIEknbGwgbm90IG1lbnRpb24gaXQgb24gZnVydGhlcgo+IGZ1bmN0aW9ucywgYXNzdW1l IGl0IHRvIGJlIGZpeGVkIGZvciBuZXh0IHJldmlzaW9uLgo+Cj4+ICsKPj4gKwlpZiAoc2NoZWR1 bGVyKQo+PiArCQlyZXR1cm4gMDsKPj4gKwo+PiArCXNjaGVkdWxlciA9IGt6YWxsb2Moc2l6ZW9m KCpzY2hlZHVsZXIpLCBHRlBfS0VSTkVMKTsKPj4gKwlpZiAoIXNjaGVkdWxlcikKPj4gKwkJcmV0 dXJuIC1FTk9NRU07Cj4+ICsKPj4gKwlzcGluX2xvY2tfaW5pdCgmc2NoZWR1bGVyLT5sb2NrKTsK Pj4gKwo+PiArCWZvciAociA9IDA7IHIgPCBJOTE1X05VTV9SSU5HUzsgcisrKQo+PiArCQlJTklU X0xJU1RfSEVBRCgmc2NoZWR1bGVyLT5ub2RlX3F1ZXVlW3JdKTsKPj4gKwo+PiArCS8qIERlZmF1 bHQgdHVuaW5nIHZhbHVlczogKi8KPj4gKwlzY2hlZHVsZXItPnByaW9yaXR5X2xldmVsX21pbiAg ICAgPSAtMTAyMzsKPj4gKwlzY2hlZHVsZXItPnByaW9yaXR5X2xldmVsX21heCAgICAgPSAxMDIz Owo+PiArCXNjaGVkdWxlci0+cHJpb3JpdHlfbGV2ZWxfcHJlZW1wdCA9IDkwMDsKPj4gKwlzY2hl ZHVsZXItPm1pbl9mbHlpbmcgICAgICAgICAgICAgPSAyOwo+IFRoaXMga2luZCBvZiBpbmRlbnQg aXMgdG9sZXJhYmxlIGJlY2F1c2UgaXQgaXMgYSBjb250YWluZWQgY29kZSBibG9jaywKPiBidXQg bm90IG5lZWRlZCBlaXRoZXIuCj4KPj4gKwo+PiArCWRldl9wcml2LT5zY2hlZHVsZXIgPSBzY2hl ZHVsZXI7Cj4+ICsKPj4gKwlyZXR1cm4gMDsKPj4gK30KPj4gKwo+PiArc3RhdGljIHZvaWQgaTkx NV9nZW5lcmF0ZV9kZXBlbmRlbmNpZXMoc3RydWN0IGk5MTVfc2NoZWR1bGVyICpzY2hlZHVsZXIs Cj4+ICsJCQkJICAgICAgIHN0cnVjdCBpOTE1X3NjaGVkdWxlcl9xdWV1ZV9lbnRyeSAqbm9kZSwK Pj4gKwkJCQkgICAgICAgdWludDMyX3QgcmluZykKPj4gK3sKPj4gKwlzdHJ1Y3QgaTkxNV9zY2hl ZHVsZXJfb2JqX2VudHJ5ICp0aGlzLCAqdGhhdDsKPj4gKwlzdHJ1Y3QgaTkxNV9zY2hlZHVsZXJf cXVldWVfZW50cnkgICp0ZXN0Owo+PiArCWludCAgICAgICAgICAgICAgICAgaSwgajsKPj4gKwli b29sICAgICAgICAgICAgICAgIGZvdW5kOwo+PiArCj4+ICsJbGlzdF9mb3JfZWFjaF9lbnRyeSh0 ZXN0LCAmc2NoZWR1bGVyLT5ub2RlX3F1ZXVlW3JpbmddLCBsaW5rKSB7Cj4+ICsJCWlmIChJOTE1 X1NRU19JU19DT01QTEVURSh0ZXN0KSkKPj4gKwkJCWNvbnRpbnVlOwo+PiArCj4+ICsJCS8qCj4+ ICsJCSAqIEJhdGNoZXMgb24gdGhlIHNhbWUgcmluZyBmb3IgdGhlIHNhbWUKPj4gKwkJICogY29u dGV4dCBtdXN0IGJlIGtlcHQgaW4gb3JkZXIuCj4+ICsJCSAqLwo+PiArCQlmb3VuZCA9IChub2Rl LT5wYXJhbXMuY3R4ID09IHRlc3QtPnBhcmFtcy5jdHgpICYmCj4+ICsJCQkobm9kZS0+cGFyYW1z LnJpbmcgPT0gdGVzdC0+cGFyYW1zLnJpbmcpOwo+PiArCj4+ICsJCWlmIChmb3VuZCkKPj4gKwkJ CWdvdG8gZGVwZW5kczsKPj4gKwo+IFRoaXMgaXMgbm90IG5lZWRlZC4KWWVhaCwgdGhpcyBjb2Rl IGJsb2NrIGhhcyBiZWVuIHJlLXdvcmtlZCBhIG51bWJlciBvZiB0aW1lcyB3aXRoIHRoaW5ncyAK YmVpbmcgYWRkZWQgYW5kL29yIHJlbW92ZWQuIEkgZ3Vlc3MgaXQgaGFkIGdvdHRlbiBhIGJpdCBt ZXNzeSBieSBub3cuCj4KPj4gKwkJLyoKPj4gKwkJICogQmF0Y2hlcyB3b3JraW5nIG9uIHRoZSBz YW1lIG9iamVjdHMgbXVzdAo+PiArCQkgKiBiZSBrZXB0IGluIG9yZGVyLgo+PiArCQkgKi8KPj4g KwkJZm9yIChpID0gMDsgKGkgPCBub2RlLT5udW1fb2JqcykgJiYgIWZvdW5kOyBpKyspIHsKPiBB cyB0aGUgdGVzdCBpcyBoZXJlIGFscmVhZHkgICAgICAgICAgICAgICAgICAgICAgICAgLS0tXgo+ Cj4+ICsJCQl0aGlzID0gbm9kZS0+c2F2ZWRfb2JqZWN0cyArIGk7Cj4+ICsKPj4gKwkJCWZvciAo aiA9IDA7IGogPCB0ZXN0LT5udW1fb2JqczsgaisrKSB7Cj4+ICsJCQkJdGhhdCA9IHRlc3QtPnNh dmVkX29iamVjdHMgKyBqOwo+PiArCj4+ICsJCQkJaWYgKHRoaXMtPm9iaiAhPSB0aGF0LT5vYmop Cj4+ICsJCQkJCWNvbnRpbnVlOwo+IEhvdyBhYm91dCBWTUFzPyBUaGVyZSBtaWdodCBiZSBtdWx0 aXBsZSBtYXBwaW5ncyB0byBhbiBvYmplY3QsIGlzbid0IGl0Cj4gZW5vdWdoIHRvIGRlcGVuZCBv biB0aGUgcmVxdWlyZWQgVk1BIGluc3RlYWQgb2YgdGhlIHdob2xlIG9iamVjdD8KVGhlIG9iamVj dCBpcyB3aGF0IHdlIGdldCBjb21pbmcgaW4gZnJvbSB1c2VyIGxhbmQgdGhyb3VnaCB0aGUgSU9D VEwuIFNvIAp3aHkgbWFrZSB0aGluZ3MgbW9yZSBjb21wbGljYXRlZD8gSWYgdGhlcmUgYXJlIG11 bHRpcGxlIFZNQXMgcmVmZXJyaW5nIAp0byB0aGUgc2FtZSBvYmplY3QgdGhlbiB3ZSBjYW4ndCBq dXN0IHRyYWNrIGFuIGluZGl2aWR1YWwgVk1BIGFzIHRoYXQgCndvdWxkIGxvb3NlIHRoZSBkZXBl bmRlbmN5IG9uIGFsbCB0aGUgb3RoZXIgVk1Bcy4gSnVzdCBiZWNhdXNlIHRoZSAKb2JqZWN0IGlz IG1hcHBlZCB0byBzb21lb25lIGVsc2UncyBhZGRyZXNzIHNwYWNlIGRvZXNuJ3QgbWVhbiB0aGF0 IHRoaXMgCmJhdGNoIGJ1ZmZlciBjYW4ndCBvdmVyd3JpdGUgZGF0YSB0aGV5IGFyZSByZWFkaW5n LgoKPgo+PiArCj4+ICsJCQkJLyogT25seSBuZWVkIHRvIHdvcnJ5IGFib3V0IHdyaXRlcyAqLwo+ PiArCQkJCWlmICh0aGlzLT5yZWFkX29ubHkgJiYgdGhhdC0+cmVhZF9vbmx5KQo+PiArCQkJCQlj b250aW51ZTsKPj4gKwo+PiArCQkJCWZvdW5kID0gdHJ1ZTsKPj4gKwkJCQlicmVhazsKPj4gKwkJ CX0KPj4gKwkJfQo+PiArCj4gVGhlIGZvbGxvd2luZyBibG9jayBpcyBub3QgbmVlZGVkLgo+Cj4+ ICsJCWlmICghZm91bmQpCj4+ICsJCQljb250aW51ZTsKPj4gKwo+PiArZGVwZW5kczoKPiBSYXRo ZXIgbGlrZSB0aGlzLCBpbiBvcmRlciB0byBhdm9pZCBhIGdvdG8gbGFiZWw7Cj4gaWYgKGZvdW5k KSB7Cj4gLi4uCj4KPgo+PiArCQlub2RlLT5kZXBfbGlzdFtub2RlLT5udW1fZGVwc10gPSB0ZXN0 Owo+PiArCQlub2RlLT5udW1fZGVwcysrOwo+PiArCX0KPj4gK30KPj4gKwo+IFBsZWFzZSBhZGQg YSBicmllZiBrZXJuZWxkb2MgYWJvdmUgZWFjaCBmdW5jdGlvbiBpbiB0aGUgaGVhZGVyLCBpdCdz Cj4gcmVxdWlyZWQuIEFkZGluZyBpdCB0byBub24tdHJpdmlhbCBpbmxpbmUgaGVscGVyIGZ1bmN0 aW9ucyB0b28gd2lsbAo+IG1ha2UgcmV2aWV3aW5nIG11Y2ggZWFzaWVyLgo+Cj4+ICtpbnQgaTkx NV9zY2hlZHVsZXJfcXVldWVfZXhlY2J1ZmZlcihzdHJ1Y3QgaTkxNV9zY2hlZHVsZXJfcXVldWVf ZW50cnkgKnFlKQo+PiArewo+PiArCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiA9 IHFlLT5wYXJhbXMuZGV2LT5kZXZfcHJpdmF0ZTsKPj4gKwlzdHJ1Y3QgaTkxNV9zY2hlZHVsZXIg ICAqc2NoZWR1bGVyID0gZGV2X3ByaXYtPnNjaGVkdWxlcjsKPj4gKwlzdHJ1Y3QgaW50ZWxfZW5n aW5lX2NzICAqcmluZyA9IHFlLT5wYXJhbXMucmluZzsKPj4gKwlzdHJ1Y3QgaTkxNV9zY2hlZHVs ZXJfcXVldWVfZW50cnkgICpub2RlOwo+PiArCXN0cnVjdCBpOTE1X3NjaGVkdWxlcl9xdWV1ZV9l bnRyeSAgKnRlc3Q7Cj4+ICsJdW5zaWduZWQgbG9uZyAgICAgICBmbGFnczsKPj4gKwlib29sICAg ICAgICAgICAgICAgIG5vdF9mbHlpbmc7Cj4+ICsJaW50ICAgICAgICAgICAgICAgICBpLCByOwo+ PiArCWludCAgICAgICAgICAgICAgICAgaW5jb21wbGV0ZSA9IDA7Cj4+ICsKPj4gKwlXQVJOX09O KCFzY2hlZHVsZXIpOwo+PiArCj4gVGhpcyBraW5kIG9mIHNpdHVhdGlvbnMgc2hvdWxkIGhhdmUg YSBiZSBhIEJVR19PTiwgYmVjYXVzZSBzY2hlZHVsZXIKPiBiZWluZyB6ZXJvIGlzIGxpdGVyYWxs eSBnb2luZyB0byBjYXVzZSBhbiBPT1BTIGluIHRoZSBuZXh0IGRlcmVmZXJlbmNlCj4gd2hpY2gg aXMgZ29pbmcgdG8gaGFwcGVuIHVuY29uZGl0aW9uYWxseS4gV0FSTiArIE9PUFMgaXMga2luZCBv ZiB3aGF0Cj4gQlVHX09OIHNob3VsZCBiZSB1c2VkIGF2b2lkLiBCdXQgdGhpcyBzaG91bGQgYmUg cmVtb3ZlZCBhbnl3YXkgYWZ0ZXIKPiBzY2hlZHVsZXIgaXMgbWFkZSBhIGRhdGEgbWVtYmVyIG9m IGRldl9wcml2LgoKVGhlIFdBUk5zIHdlcmUgb3JpZ2luYWxseSBCVUdzIGJ1dCBEYW5pZWwgVmV0 dGVyIGhhZCB0aGUgb3Bwb3NpdGUgCmRlbWFuZC4gSGlzIHZpZXcgd2FzIHRoZSBkcml2ZXIgc2hv dWxkIG5ldmVyIEJVRyB1bmRlciBhbnkgCmNpcmN1bXN0YW5jZXMuIEEgV0FSTiBmb2xsb3dlZCBi eSBhbiBvb3BzIGlzIGJldHRlciB0aGFuIGEgQlVHIGJlY2F1c2UgCm1heWJlIGl0IHdvbid0IGFj dHVhbGx5IG9vcHMuCgoKPgo+PiArCWlmICgxLyppOTE1LnNjaGVkdWxlcl9vdmVycmlkZSAmIGk5 MTVfc29fZGlyZWN0X3N1Ym1pdCovKSB7Cj4gSSBhc3N1bWUgdGhpcyBpcyBnb2luZyB0byBiZSBh ZGRyZXNzZWQgaW4gYSBmdXR1cmUgY29tbWl0LiBDb3VsZCBoYXZlCj4gYmVlbiBpbnRyb2R1Y2Vk IGluIHRoaXMgcGF0Y2gsIHRvby4KPgo+PiArCQlpbnQgcmV0Owo+PiArCj4+ICsJCXNjaGVkdWxl ci0+ZmxhZ3NbcWUtPnBhcmFtcy5yaW5nLT5pZF0gfD0gaTkxNV9zZl9zdWJtaXR0aW5nOwo+PiAr CQlyZXQgPSBkZXZfcHJpdi0+Z3QuZXhlY2J1Zl9maW5hbCgmcWUtPnBhcmFtcyk7Cj4+ICsJCXNj aGVkdWxlci0+ZmxhZ3NbcWUtPnBhcmFtcy5yaW5nLT5pZF0gJj0gfmk5MTVfc2Zfc3VibWl0dGlu ZzsKPj4gKwo+IFRoZSBrZXJuZWxkb2Mgc2hvdWxkIG1lbnRpb24gbG9ja2luZyByZXF1aXJlbWVu dHMgb2YgdGhpcyBmdW5jdGlvbi4KPgo+PiArCQkvKgo+PiArCQkgKiBEb24ndCBkbyBhbnkgY2xl YW4gdXAgb24gZmFpbHVyZSBiZWNhdXNlIHRoZSBjYWxsZXIgd2lsbAo+PiArCQkgKiBkbyBpdCBh bGwgYW55d2F5Lgo+PiArCQkgKi8KPj4gKwkJaWYgKHJldCkKPj4gKwkJCXJldHVybiByZXQ7Cj4+ ICsKPj4gKwkJLyogRnJlZSBldmVyeXRoaW5nIHRoYXQgaXMgb3duZWQgYnkgdGhlIFFFIHN0cnVj dHVyZTogKi8KPj4gKwkJa2ZyZWUocWUtPnBhcmFtcy5jbGlwcmVjdHMpOwo+PiArCQlpZiAocWUt PnBhcmFtcy5kaXNwYXRjaF9mbGFncyAmIEk5MTVfRElTUEFUQ0hfU0VDVVJFKQo+PiArCQkJaTkx NV9nZW1fZXhlY2J1ZmZfcmVsZWFzZV9iYXRjaF9vYmoocWUtPnBhcmFtcy5iYXRjaF9vYmopOwo+ PiArCj4+ICsJCXJldHVybiAwOwo+IEFib3ZlIHBpZWNlIG9mIGNvZGUgbG9va3MgbGlrZSBpdHMg b3duIGZ1bmN0aW9uLCBzbyBpdCBzaG91bGQgcHJvYmFibHkKPiBiZSBvbmUuCj4KPj4gKwl9Cj4+ ICsKPj4gKwlub2RlID0ga21hbGxvYyhzaXplb2YoKm5vZGUpLCBHRlBfS0VSTkVMKTsKPj4gKwlp ZiAoIW5vZGUpCj4+ICsJCXJldHVybiAtRU5PTUVNOwo+PiArCj4+ICsJKm5vZGUgPSAqcWU7Cj4g QW55IHJlYXNvbiB3ZSBjYW4ndCBzaW1wbHkgbW92ZSBvd25lcnNoaXAgb2YgcWU/IElmIG5vdCwg SSdkIHJhdGhlcgo+IG1ha2UgYSBjbG9uZSBmdW5jdGlvbgoKVGhlIHFlIHBvaW50ZXIgcGFzc2Vk IGluIGlzIGEgcmVmZXJlbmNlIHRvIGEgc3RhY2sgbG9jYWwgb2JqZWN0IGluIHRoZSAKZXhlY2J1 ZmYgY29kZSBwYXRoLiBUaHVzIG93bmVyc2hpcCBjYW5ub3QgYmUgdHJhbnNmZXJyZWQuIERvaW5n IGl0IHRoaXMgCndheSBrZWVwcyB0aGUgZXhlY2J1ZmYgY29kZSBuaWNlIGFuZCBzaW1wbGUgYW5k IGFsbCB0aGUgZHluYW1pYyBtZW1vcnkgCm1hbmFnZW1lbnQgYW5kIGxpc3QgdHJhY2tpbmcgaXMg c2VsZiBjb250YWluZWQgd2l0aGluIHRoZSBzY2hlZHVsZXIuCgo+Cj4+ICsJSU5JVF9MSVNUX0hF QUQoJm5vZGUtPmxpbmspOwo+PiArCW5vZGUtPnN0YXR1cyA9IGk5MTVfc3FzX3F1ZXVlZDsKPj4g Kwlub2RlLT5zdGFtcCAgPSBqaWZmaWVzOwo+PiArCWk5MTVfZ2VtX3JlcXVlc3RfcmVmZXJlbmNl KG5vZGUtPnBhcmFtcy5yZXF1ZXN0KTsKPj4gKwo+PiArCS8qIE5lZWQgdG8gZGV0ZXJtaW5lIHRo ZSBudW1iZXIgb2YgaW5jb21wbGV0ZSBlbnRyaWVzIGluIHRoZSBsaXN0IGFzCj4+ICsJICogdGhh dCB3aWxsIGJlIHRoZSBtYXhpbXVtIHNpemUgb2YgdGhlIGRlcGVuZGVuY3kgbGlzdC4KPj4gKwkg Kgo+PiArCSAqIE5vdGUgdGhhdCB0aGUgYWxsb2NhdGlvbiBtdXN0IG5vdCBiZSBtYWRlIHdpdGgg dGhlIHNwaW5sb2NrIGFjcXVpcmVkCj4+ICsJICogYXMga21hbGxvYyBjYW4gc2xlZXAuIEhvd2V2 ZXIsIHRoZSB1bmxvY2svcmVsb2NrIGlzIHNhZmUgYmVjYXVzZSBubwo+PiArCSAqIG5ldyBlbnRy aWVzIGNhbiBiZSBxdWV1ZWQgdXAgZHVyaW5nIHRoZSB1bmxvY2sgYXMgdGhlIGk5MTUgZHJpdmVy Cj4+ICsJICogbXV0ZXggaXMgc3RpbGwgaGVsZC4gRW50cmllcyBjb3VsZCBiZSByZW1vdmVkIGZy b20gdGhlIGxpc3QgYnV0IHRoYXQKPj4gKwkgKiBqdXN0IG1lYW5zIHRoZSBkZXBfbGlzdCB3aWxs IGJlIG92ZXItYWxsb2NhdGVkIHdoaWNoIGlzIGZpbmUuCj4+ICsJICovCj4+ICsJc3Bpbl9sb2Nr X2lycXNhdmUoJnNjaGVkdWxlci0+bG9jaywgZmxhZ3MpOwo+PiArCWZvciAociA9IDA7IHIgPCBJ OTE1X05VTV9SSU5HUzsgcisrKSB7Cj4+ICsJCWxpc3RfZm9yX2VhY2hfZW50cnkodGVzdCwgJnNj aGVkdWxlci0+bm9kZV9xdWV1ZVtyXSwgbGluaykgewo+PiArCQkJaWYgKEk5MTVfU1FTX0lTX0NP TVBMRVRFKHRlc3QpKQo+PiArCQkJCWNvbnRpbnVlOwo+PiArCj4+ICsJCQlpbmNvbXBsZXRlKys7 Cj4+ICsJCX0KPj4gKwl9Cj4+ICsKPj4gKwkvKiBUZW1wb3JhcmlseSB1bmxvY2sgdG8gYWxsb2Nh dGUgbWVtb3J5OiAqLwo+PiArCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNjaGVkdWxlci0+bG9j aywgZmxhZ3MpOwo+IEknZCBtYWtlIHRoZSBhYm92ZSBwaWVjZSBvZiBjb2RlIGEgaGVscGVyLCB0 aGVzZSBzdGF0cyBhcmUgdG8gYmUKPiBjb3VudGVkIGZvciBkZWJ1Z2ZzIGFueXdheSwgdG9vPwpU aGUgZGVidWdmcyBjb2RlIGNvdW50cyBhbGwgc3RhdGVzLCBub3QganVzdCBjb21wbGV0ZSwgYW5k IHJlcXVpcmVzIGEgCnNjaGVkdWxlciBzdGF0cyBvYmplY3QuIEFsc28sIHRoZSBhYm92ZSBleHBs YW5hdGlvbiBhYm91dCBsb2NraW5nIGlzIG5vdCAKYXBwbGljYWJsZSBpbiB0aGUgZGVidWdmcyBj YXNlLCBvbmx5IGhlcmUuIEFuZCBpdCBtYWtlcyBtdWNoIG1vcmUgc2Vuc2UgCnRvIG1lIHRvIGtl ZXAgdGhlIGNvbW1lbnQgYW5kIHRoZSBjb2RlIGFsbCB0b2dldGhlciBpbiBvbmUgdmVyeSBvYnZp b3VzIAphbmQgdW5kZXJzdGFuZGFibGUgYmxvY2sgdGhhbiBzcGxpdHRpbmcgaXQgdXAuCgoKPgo+ PiArCWlmIChpbmNvbXBsZXRlKSB7Cj4+ICsJCW5vZGUtPmRlcF9saXN0ID0ga21hbGxvY19hcnJh eShpbmNvbXBsZXRlLAo+PiArCQkJCQkgICAgICAgc2l6ZW9mKCpub2RlLT5kZXBfbGlzdCksCj4+ ICsJCQkJCSAgICAgICBHRlBfS0VSTkVMKTsKPj4gKwkJaWYgKCFub2RlLT5kZXBfbGlzdCkgewo+ PiArCQkJa2ZyZWUobm9kZSk7Cj4+ICsJCQlyZXR1cm4gLUVOT01FTTsKPj4gKwkJfQo+PiArCX0g ZWxzZQo+PiArCQlub2RlLT5kZXBfbGlzdCA9IE5VTEw7Cj4+ICsKPj4gKwlzcGluX2xvY2tfaXJx c2F2ZSgmc2NoZWR1bGVyLT5sb2NrLCBmbGFncyk7Cj4+ICsJbm9kZS0+bnVtX2RlcHMgPSAwOwo+ PiArCj4+ICsJaWYgKG5vZGUtPmRlcF9saXN0KSB7Cj4+ICsJCWZvciAociA9IDA7IHIgPCBJOTE1 X05VTV9SSU5HUzsgcisrKQo+PiArCQkJaTkxNV9nZW5lcmF0ZV9kZXBlbmRlbmNpZXMoc2NoZWR1 bGVyLCBub2RlLCByKTsKPj4gKwo+PiArCQlXQVJOX09OKG5vZGUtPm51bV9kZXBzID4gaW5jb21w bGV0ZSk7Cj4gV291bGRuJ3QgdGhpcyBjb25kaXRpb24gYWdhaW4gbGVhZCB0byBhIGNyYXNoPyBJ ZiBzbywgc2hvdWxkIGJlIEJVR19PTgo+IHRvIGNhdXNlIHRoYXQgY3Jhc2ggYXMgZWFybHkgYXMg cG9zc2libGUuIFdBUk5fT04gaXMgb25seSBnb29kIGlmIHRoZXJlCj4gaXMgYSB3YXkgb2YgY29w aW5nIHdpdGggdGhlIHNpdHVhdGlvbiBhbmQgbm8gaW1taW5lbnQgc3lzdGVtIGNyYXNoIGlzCj4g Ym91bmQgdG8gaGFwcGVuLgo+Cj4+ICsJfQo+PiArCj4+ICsJaWYgKG5vZGUtPnByaW9yaXR5ID4g c2NoZWR1bGVyLT5wcmlvcml0eV9sZXZlbF9tYXgpCj4+ICsJCW5vZGUtPnByaW9yaXR5ID0gc2No ZWR1bGVyLT5wcmlvcml0eV9sZXZlbF9tYXg7Cj4+ICsJZWxzZSBpZiAobm9kZS0+cHJpb3JpdHkg PCBzY2hlZHVsZXItPnByaW9yaXR5X2xldmVsX21pbikKPj4gKwkJbm9kZS0+cHJpb3JpdHkgPSBz Y2hlZHVsZXItPnByaW9yaXR5X2xldmVsX21pbjsKPj4gKwo+IFRoZXJlIGlzIGNsYW1wX3ZhbCBt YWNybyBpbiBsaW51eC9rZXJuZWwuaCAuCj4KPj4gKwlpZiAoKG5vZGUtPnByaW9yaXR5ID4gMCkg JiYgbm9kZS0+bnVtX2RlcHMpIHsKPj4gKwkJaTkxNV9zY2hlZHVsZXJfcHJpb3JpdHlfYnVtcF9j bGVhcihzY2hlZHVsZXIpOwo+PiArCj4+ICsJCWZvciAoaSA9IDA7IGkgPCBub2RlLT5udW1fZGVw czsgaSsrKQo+PiArCQkJaTkxNV9zY2hlZHVsZXJfcHJpb3JpdHlfYnVtcChzY2hlZHVsZXIsCj4+ ICsJCQkJCW5vZGUtPmRlcF9saXN0W2ldLCBub2RlLT5wcmlvcml0eSk7Cj4+ICsJfQo+PiArCj4+ ICsJbGlzdF9hZGRfdGFpbCgmbm9kZS0+bGluaywgJnNjaGVkdWxlci0+bm9kZV9xdWV1ZVtyaW5n LT5pZF0pOwo+PiArCj4+ICsJbm90X2ZseWluZyA9IGk5MTVfc2NoZWR1bGVyX2NvdW50X2ZseWlu ZyhzY2hlZHVsZXIsIHJpbmcpIDwKPj4gKwkJCQkJCSBzY2hlZHVsZXItPm1pbl9mbHlpbmc7Cj4+ ICsKPj4gKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzY2hlZHVsZXItPmxvY2ssIGZsYWdzKTsK Pj4gKwo+PiArCWlmIChub3RfZmx5aW5nKQo+PiArCQlpOTE1X3NjaGVkdWxlcl9zdWJtaXQocmlu ZywgdHJ1ZSk7Cj4+ICsKPj4gKwlyZXR1cm4gMDsKPj4gK30KPj4gKwo+PiArc3RhdGljIGludCBp OTE1X3NjaGVkdWxlcl9mbHlfbm9kZShzdHJ1Y3QgaTkxNV9zY2hlZHVsZXJfcXVldWVfZW50cnkg Km5vZGUpCj4+ICt7Cj4+ICsJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gbm9k ZS0+cGFyYW1zLmRldi0+ZGV2X3ByaXZhdGU7Cj4+ICsJc3RydWN0IGk5MTVfc2NoZWR1bGVyICAg KnNjaGVkdWxlciA9IGRldl9wcml2LT5zY2hlZHVsZXI7Cj4+ICsJc3RydWN0IGludGVsX2VuZ2lu ZV9jcyAgKnJpbmc7Cj4+ICsKPj4gKwlXQVJOX09OKCFzY2hlZHVsZXIpOwo+PiArCVdBUk5fT04o IW5vZGUpOwo+PiArCVdBUk5fT04obm9kZS0+c3RhdHVzICE9IGk5MTVfc3FzX3BvcHBlZCk7Cj4g T3RoZXIgc3RhdGVzIGhhZCB0aGVpciBJOTE1X1NRU19JU18qIG1hY3JvLCB3aHkgc29tZSBkb24n dD8KVGhlIHB1cnBvc2Ugb2YgdGhlIG1hY3JvIGlzIHRvIGFsbG93IHRoZSBjb21iaW5pbmcgb2Yg aW5kaXZpZHVhbCBzdGF0ZXMgCmludG8gY2xhc3Nlcy4gRS5nLiBkZWFkIGFuZCBjb21wbGV0ZSBj YW4gYm90aCBiZSBjb25zaWRlcmVkIGNvbXBsZXRlIGZvciAKdGhlIG1ham9yaXR5IG9mIGNhc2Vz LiBPbmx5IGluIGNlcnRhaW4gc2l0dWF0aW9ucyBkbyB5b3UgbmVlZCB0byBrbm93IAp0aGF0IGl0 IHJlYWxseSB3YXMgZGVhZC4gSGVuY2UgbW9zdCBwbGFjZXMgdGhhdCBkb24ndCByZWFsbHkgY2Fy ZSBqdXN0IAp1c2UgdGhlIG1lcmdlZCBtYWNyb3MsIHdoZXJlYXMgcGxhY2VzIGxpa2UgdGhpcyB0 aGF0IGRvIGNhcmUgdXNlIHRoZSAKZXhwbGljaXQgZW51bSB2YWx1ZS4KCj4KPj4gKwo+PiArCXJp bmcgPSBub2RlLT5wYXJhbXMucmluZzsKPj4gKwo+PiArCS8qCj4+ICsJICogQWRkIHRoZSBub2Rl ICh3aGljaCBzaG91bGQgY3VycmVudGx5IGJlIGluIHN0YXRlIHBvcHBlZCkgdG8gdGhlCj4+ICsJ ICogZnJvbnQgb2YgdGhlIHF1ZXVlLiBUaGlzIGVuc3VyZSB0aGF0IGZseWluZyBub2RlcyBhcmUg YWx3YXlzIGhlbGQKPj4gKwkgKiBpbiBoYXJkd2FyZSBzdWJtaXNzaW9uIG9yZGVyLgo+PiArCSAq Lwo+PiArCWxpc3RfYWRkKCZub2RlLT5saW5rLCAmc2NoZWR1bGVyLT5ub2RlX3F1ZXVlW3Jpbmct PmlkXSk7Cj4+ICsKPj4gKwlub2RlLT5zdGF0dXMgPSBpOTE1X3Nxc19mbHlpbmc7Cj4+ICsKPj4g KwlpZiAoIShzY2hlZHVsZXItPmZsYWdzW3JpbmctPmlkXSAmIGk5MTVfc2ZfaW50ZXJydXB0c19l bmFibGVkKSkgewo+PiArCQlib29sICAgIHN1Y2Nlc3MgPSB0cnVlOwo+PiArCj4+ICsJCXN1Y2Nl c3MgPSByaW5nLT5pcnFfZ2V0KHJpbmcpOwo+PiArCQlpZiAoc3VjY2VzcykKPj4gKwkJCXNjaGVk dWxlci0+ZmxhZ3NbcmluZy0+aWRdIHw9IGk5MTVfc2ZfaW50ZXJydXB0c19lbmFibGVkOwo+PiAr CQllbHNlCj4+ICsJCQlyZXR1cm4gLUVJTlZBTDsKPj4gKwl9Cj4+ICsKPj4gKwlyZXR1cm4gMDsK Pj4gK30KPj4gKwo+PiArLyoKPj4gKyAqIE5vZGVzIGFyZSBjb25zaWRlcmVkIHZhbGlkIGRlcGVu ZGVuY2llcyBpZiB0aGV5IGFyZSBxdWV1ZWQgb24gYW55IHJpbmcgb3IKPj4gKyAqIGlmIHRoZXkg YXJlIGluIGZsaWdodCBvbiBhIGRpZmZlcmVudCByaW5nLiBJbiBmbGlnaHQgb24gdGhlIHNhbWUg cmluZyBpcyBubwo+PiArICogbG9uZ2VyIGludGVyZXN0aW5nIGZvciBub24tcHJlbXB0aXZlIG5v ZGVzIGFzIHRoZSByaW5nIHNlcmlhbGlzZXMgZXhlY3V0aW9uLgo+PiArICogRm9yIHByZS1lbXB0 aW5nIG5vZGVzLCBhbGwgaW4gZmxpZ2h0IGRlcGVuZGVuY2llcyBhcmUgdmFsaWQgYXMgdGhleSBt dXN0IG5vdAo+PiArICogYmUganVtcGVkIGJ5IHRoZSBhY3Qgb2YgcHJlLWVtcHRpbmcuCj4+ICsg Kgo+PiArICogQW55dGhpbmcgdGhhdCBpcyBuZWl0aGVyIHF1ZXVlZCBub3IgZmx5aW5nIGlzIHVu aW50ZXJlc3RpbmcuCj4+ICsgKi8KPj4gK3N0YXRpYyBpbmxpbmUgYm9vbCBpOTE1X3NjaGVkdWxl cl9pc19kZXBlbmRlbmN5X3ZhbGlkKAo+PiArCQkJc3RydWN0IGk5MTVfc2NoZWR1bGVyX3F1ZXVl X2VudHJ5ICpub2RlLCB1aW50MzJfdCBpZHgpCj4+ICt7Cj4+ICsJc3RydWN0IGk5MTVfc2NoZWR1 bGVyX3F1ZXVlX2VudHJ5ICpkZXA7Cj4+ICsKPj4gKwlkZXAgPSBub2RlLT5kZXBfbGlzdFtpZHhd Owo+PiArCWlmICghZGVwKQo+PiArCQlyZXR1cm4gZmFsc2U7Cj4+ICsKPj4gKwlpZiAoSTkxNV9T UVNfSVNfUVVFVUVEKGRlcCkpCj4+ICsJCXJldHVybiB0cnVlOwo+PiArCj4+ICsJaWYgKEk5MTVf U1FTX0lTX0ZMWUlORyhkZXApKSB7Cj4+ICsJCWlmIChub2RlLT5wYXJhbXMucmluZyAhPSBkZXAt PnBhcmFtcy5yaW5nKQo+PiArCQkJcmV0dXJuIHRydWU7Cj4+ICsJfQo+PiArCj4+ICsJcmV0dXJu IGZhbHNlOwo+PiArfQo+PiArCj4+ICtzdGF0aWMgdWludDMyX3QgaTkxNV9zY2hlZHVsZXJfY291 bnRfZmx5aW5nKHN0cnVjdCBpOTE1X3NjaGVkdWxlciAqc2NoZWR1bGVyLAo+PiArCQkJCQkgICAg c3RydWN0IGludGVsX2VuZ2luZV9jcyAqcmluZykKPj4gK3sKPj4gKwlzdHJ1Y3QgaTkxNV9zY2hl ZHVsZXJfcXVldWVfZW50cnkgKm5vZGU7Cj4+ICsJdWludDMyX3QgICAgICAgICAgICAgICAgICAg ICAgICAgIGZseWluZyA9IDA7Cj4+ICsKPj4gKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KG5vZGUsICZz Y2hlZHVsZXItPm5vZGVfcXVldWVbcmluZy0+aWRdLCBsaW5rKQo+IFRoaXMgbG9vcCBrZWVwcyBw b3BwaW5nIHVwLCBpdCBjb3VsZCB1c2UgYSBkZWZpbmUgc2ltaWxhciB0byB0aGUgb25lcwo+IGlu IGk5MTVfZHJ2LmggOwo+Cj4gI2RlZmluZSBmb3JfZWFjaF9ocGRfcGluKF9fcGluKSBcCj4KPj4g KwkJaWYgKEk5MTVfU1FTX0lTX0ZMWUlORyhub2RlKSkKPj4gKwkJCWZseWluZysrOwo+PiArCj4+ ICsJcmV0dXJuIGZseWluZzsKPj4gK30KPj4gKwo+PiArLyoKPj4gKyAqIEFkZCBhIHBvcHBlZCBu b2RlIGJhY2sgaW4gdG8gdGhlIHF1ZXVlLiBGb3IgZXhhbXBsZSwgYmVjYXVzZSB0aGUgcmluZyB3 YXMKPj4gKyAqIGh1bmcgd2hlbiBleGVjZmluYWwoKSB3YXMgY2FsbGVkIGFuZCB0aHVzIHRoZSBy aW5nIHN1Ym1pc3Npb24gbmVlZHMgdG8gYmUKPj4gKyAqIHJldHJpZWQgbGF0ZXIuCj4+ICsgKi8K Pj4gK3N0YXRpYyB2b2lkIGk5MTVfc2NoZWR1bGVyX25vZGVfcmVxdWV1ZShzdHJ1Y3QgaTkxNV9z Y2hlZHVsZXJfcXVldWVfZW50cnkgKm5vZGUpCj4+ICt7Cj4+ICsJV0FSTl9PTighbm9kZSk7Cj4g CWlmIChXQVJOX09OKCFub2RlKSkKPiAJCXJldHVybjsKPgo+IE9yIHJhdGhlciBubyBjaGVjayBh dCBhbGwsIGl0J3MgZ29pbmcgdG8gY3Jhc2ggYW55d2F5IGV2ZW4gaW4gdGhlCj4gY2FsbGluZyBm dW5jdGlvbiBpZiB0aGVyZSdzIE5VTEwsIGFuZCBpdCdzIGludGVybmFsIGZ1bmN0aW9uLiBJdCdz Cj4gcmVsZXZhbnQgdG8gY2hlY2sgaWYgdGhlIHVzZXJzcGFjZS4KPgo+PiArCVdBUk5fT04oIUk5 MTVfU1FTX0lTX0ZMWUlORyhub2RlKSk7Cj4+ICsKPj4gKwkvKiBTZXFubyB3aWxsIGJlIHJlYXNz aWduZWQgb24gcmVsYXVuY2ggKi8KPj4gKwlub2RlLT5wYXJhbXMucmVxdWVzdC0+c2Vxbm8gPSAw Owo+PiArCW5vZGUtPnN0YXR1cyA9IGk5MTVfc3FzX3F1ZXVlZDsKPj4gK30KPj4gKwo+PiArLyoK Pj4gKyAqIEdpdmUgdXAgb24gYSBub2RlIGNvbXBsZXRlbHkuIEZvciBleGFtcGxlLCBiZWNhdXNl IGl0IGlzIGNhdXNpbmcgdGhlCj4+ICsgKiByaW5nIHRvIGhhbmcgb3IgaXMgdXNpbmcgc29tZSBy ZXNvdXJjZSB0aGF0IG5vIGxvbmdlciBleGlzdHMuCj4+ICsgKi8KPj4gK3N0YXRpYyB2b2lkIGk5 MTVfc2NoZWR1bGVyX25vZGVfa2lsbChzdHJ1Y3QgaTkxNV9zY2hlZHVsZXJfcXVldWVfZW50cnkg Km5vZGUpCj4+ICt7Cj4+ICsJV0FSTl9PTighbm9kZSk7Cj4+ICsJV0FSTl9PTihJOTE1X1NRU19J U19DT01QTEVURShub2RlKSk7Cj4+ICsKPj4gKwlub2RlLT5zdGF0dXMgPSBpOTE1X3Nxc19kZWFk Owo+PiArfQo+PiArCj4+ICsvKgo+PiArICogQSBzZXF1ZW5jZSBudW1iZXIgaGFzIHBvcHBlZCBv dXQgb2YgdGhlIGhhcmR3YXJlIGFuZCB0aGUgcmVxdWVzdCBoYW5kbGluZwo+PiArICogY29kZSBo YXMgbWFwcGVkIGl0IGJhY2sgdG8gYSByZXF1ZXN0IGFuZCB3aWxsIG1hcmsgdGhhdCByZXF1ZXN0 IGNvbXBsZXRlLgo+PiArICogSXQgYWxzbyBjYWxscyB0aGlzIGZ1bmN0aW9uIHRvIG5vdGlmeSB0 aGUgc2NoZWR1bGVyIGFib3V0IHRoZSBjb21wbGV0aW9uCj4+ICsgKiBzbyB0aGUgc2NoZWR1bGVy J3Mgbm9kZSBjYW4gYmUgdXBkYXRlZCBhcHByb3ByaWF0ZWx5Lgo+PiArICogUmV0dXJucyB0cnVl IGlmIHRoZSByZXF1ZXN0IGlzIHNjaGVkdWxlciBtYW5hZ2VkLCBmYWxzZSBpZiBub3QuCj4+ICsg Ki8KPj4gK2Jvb2wgaTkxNV9zY2hlZHVsZXJfbm90aWZ5X3JlcXVlc3Qoc3RydWN0IGRybV9pOTE1 X2dlbV9yZXF1ZXN0ICpyZXEpCj4+ICt7Cj4+ICsJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRl dl9wcml2ICA9IHRvX2k5MTUocmVxLT5yaW5nLT5kZXYpOwo+PiArCXN0cnVjdCBpOTE1X3NjaGVk dWxlciAgICpzY2hlZHVsZXIgPSBkZXZfcHJpdi0+c2NoZWR1bGVyOwo+PiArCS8qIFhYWDogTmVl ZCB0byBtYXAgYmFjayBmcm9tIHJlcXVlc3QgdG8gbm9kZSAqLwo+PiArCXN0cnVjdCBpOTE1X3Nj aGVkdWxlcl9xdWV1ZV9lbnRyeSAqbm9kZSA9IE5VTEw7Cj4+ICsJdW5zaWduZWQgbG9uZyAgICAg ICBmbGFnczsKPj4gKwo+PiArCWlmICghbm9kZSkKPj4gKwkJcmV0dXJuIGZhbHNlOwo+IE5vdCBz byBzdXJlIGlmIHNsaWNpbmcgdGhlIHNlcmllcyBkb3duIHRvIGFuIGV4dGVudCB0aGF0IGZ1bmN0 aW9ucyBhcmUKPiBpbXBvc3NpYmxlIHRvIHJldmlldywgd2FzIGEgZ29vZCBpZGVhLiBJZGVhIGlz IHRvIHNsaWNlIHRoaW5ncyBkb3duLCB0bwo+IHJldmlld2FibGUgcGllY2VzLiBJdCdzIGhhcmQg dG8gcHJlZGljdCBvciBrZWVwIGxvb2tpbmcgZm9yd2FyZCB0aGUKPiBzZXJpZXMgd2hhdCBpcyBn b2luZyB0byBjb21lLgo+Cj4+ICsKPj4gKwlzcGluX2xvY2tfaXJxc2F2ZSgmc2NoZWR1bGVyLT5s b2NrLCBmbGFncyk7Cj4+ICsKPj4gKwlXQVJOX09OKCFJOTE1X1NRU19JU19GTFlJTkcobm9kZSkp Owo+PiArCj4+ICsJLyogTm9kZSB3YXMgaW4gZmxpZ2h0IHNvIG1hcmsgaXQgYXMgY29tcGxldGUu ICovCj4+ICsJaWYgKHJlcS0+Y2FuY2VsbGVkKQo+PiArCQlub2RlLT5zdGF0dXMgPSBpOTE1X3Nx c19kZWFkOwo+PiArCWVsc2UKPj4gKwkJbm9kZS0+c3RhdHVzID0gaTkxNV9zcXNfY29tcGxldGU7 Cj4+ICsKPj4gKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzY2hlZHVsZXItPmxvY2ssIGZsYWdz KTsKPj4gKwo+PiArCS8qCj4+ICsJICogWFhYOiBJZiB0aGUgaW4tZmxpZ2h0IGxpc3QgaXMgbm93 IGVtcHR5IHRoZW4gbmV3IHdvcmsgc2hvdWxkIGJlCj4+ICsJICogc3VibWl0dGVkLiBIb3dldmVy LCB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBmcm9tIGludGVycnVwdCBjb250ZXh0Cj4+ICsJICog YW5kIHRodXMgY2Fubm90IGFjcXVpcmUgbXV0ZXggbG9ja3MgYW5kIG90aGVyIHN1Y2ggdGhpbmdz IHRoYXQgYXJlCj4+ICsJICogbmVjZXNzYXJ5IGZvciBmcmVzaCBzdWJtaXNzaW9uLgo+PiArCSAq Lwo+PiArCj4+ICsJcmV0dXJuIHRydWU7Cj4+ICt9Cj4+ICsKPj4gK2ludCBpOTE1X3NjaGVkdWxl cl9yZW1vdmUoc3RydWN0IGludGVsX2VuZ2luZV9jcyAqcmluZykKPj4gK3sKPj4gKwlzdHJ1Y3Qg ZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSByaW5nLT5kZXYtPmRldl9wcml2YXRlOwo+PiAr CXN0cnVjdCBpOTE1X3NjaGVkdWxlciAgICpzY2hlZHVsZXIgPSBkZXZfcHJpdi0+c2NoZWR1bGVy Owo+PiArCXN0cnVjdCBpOTE1X3NjaGVkdWxlcl9xdWV1ZV9lbnRyeSAgKm5vZGUsICpub2RlX25l eHQ7Cj4+ICsJdW5zaWduZWQgbG9uZyAgICAgICBmbGFnczsKPj4gKwlpbnQgICAgICAgICAgICAg ICAgIGZseWluZyA9IDAsIHF1ZXVlZCA9IDA7Cj4+ICsJaW50ICAgICAgICAgICAgICAgICByZXQg PSAwOwo+PiArCWJvb2wgICAgICAgICAgICAgICAgZG9fc3VibWl0Owo+PiArCXVpbnQzMl90ICAg ICAgICAgICAgbWluX3NlcW5vOwo+PiArCXN0cnVjdCBsaXN0X2hlYWQgICAgcmVtb3ZlOwo+PiAr Cj4+ICsJaWYgKGxpc3RfZW1wdHkoJnNjaGVkdWxlci0+bm9kZV9xdWV1ZVtyaW5nLT5pZF0pKQo+ PiArCQlyZXR1cm4gMDsKPj4gKwo+PiArCXNwaW5fbG9ja19pcnFzYXZlKCZzY2hlZHVsZXItPmxv Y2ssIGZsYWdzKTsKPj4gKwo+PiArCS8qIC9pOTE1X3NjaGVkdWxlcl9kdW1wX2xvY2tlZChyaW5n LCAicmVtb3ZlL3ByZSIpOy8gKi8KPj4gKwo+IFRoaXMgc2hvdWxkIG5vdCBiZSBoZXJlIGF0IGFs bC4KT29wcy4gT2xkIGRlYnVnIGNvZGUuIEhhZG4ndCBzcG90dGVkIGl0IHdhcyBzdGlsbCB0aGVy ZS4KCj4KPj4gKwkvKgo+PiArCSAqIEluIHRoZSBjYXNlIHdoZXJlIHRoZSBzeXN0ZW0gaXMgaWRs ZSwgc3RhcnRpbmcgJ21pbl9zZXFubycgZnJvbSBhIGJpZwo+PiArCSAqIG51bWJlciB3aWxsIGNh dXNlIGFsbCBub2RlcyB0byBiZSByZW1vdmVkIGFzIHRoZXkgYXJlIG5vdyBiYWNrIHRvCj4+ICsJ ICogYmVpbmcgaW4tb3JkZXIuIEhvd2V2ZXIsIHRoaXMgd2lsbCBiZSBhIHByb2JsZW0gaWYgdGhl IGxhc3Qgb25lIHRvCj4+ICsJICogY29tcGxldGUgd2FzIGFjdHVhbGx5IG91dC1vZi1vcmRlciBh cyB0aGUgcmluZyBzZXFubyB2YWx1ZSB3aWxsIGJlCj4+ICsJICogbG93ZXIgdGhhbiBvbmUgb3Ig bW9yZSBjb21wbGV0ZWQgYnVmZmVycy4gVGh1cyBjb2RlIGxvb2tpbmcgZm9yIHRoZQo+PiArCSAq IGNvbXBsZXRpb24gb2Ygc2FpZCBidWZmZXJzIHdpbGwgd2FpdCBmb3JldmVyLgo+PiArCSAqIElu c3RlYWQsIHVzZSB0aGUgaGFyZHdhcmUgc2Vxbm8gYXMgdGhlIHN0YXJ0aW5nIHBvaW50LiBUaGlz IG1lYW5zCj4+ICsJICogdGhhdCBzb21lIGJ1ZmZlcnMgbWlnaHQgYmUga2VwdCBhcm91bmQgZXZl biBpbiBhIGNvbXBsZXRlbHkgaWRsZQo+PiArCSAqIHN5c3RlbSBidXQgaXQgc2hvdWxkIGd1YXJh bnRlZSB0aGF0IG5vLW9uZSBldmVyIGdldHMgY29uZnVzZWQgd2hlbgo+PiArCSAqIHdhaXRpbmcg Zm9yIGJ1ZmZlciBjb21wbGV0aW9uLgo+PiArCSAqLwo+PiArCW1pbl9zZXFubyA9IHJpbmctPmdl dF9zZXFubyhyaW5nLCB0cnVlKTsKPj4gKwo+PiArCWxpc3RfZm9yX2VhY2hfZW50cnkobm9kZSwg JnNjaGVkdWxlci0+bm9kZV9xdWV1ZVtyaW5nLT5pZF0sIGxpbmspIHsKPj4gKwkJaWYgKEk5MTVf U1FTX0lTX1FVRVVFRChub2RlKSkKPj4gKwkJCXF1ZXVlZCsrOwo+PiArCQllbHNlIGlmIChJOTE1 X1NRU19JU19GTFlJTkcobm9kZSkpCj4+ICsJCQlmbHlpbmcrKzsKPj4gKwkJZWxzZSBpZiAoSTkx NV9TUVNfSVNfQ09NUExFVEUobm9kZSkpCj4+ICsJCQljb250aW51ZTsKPj4gKwo+PiArCQlpZiAo bm9kZS0+cGFyYW1zLnJlcXVlc3QtPnNlcW5vID09IDApCj4+ICsJCQljb250aW51ZTsKPj4gKwo+ PiArCQlpZiAoIWk5MTVfc2Vxbm9fcGFzc2VkKG5vZGUtPnBhcmFtcy5yZXF1ZXN0LT5zZXFubywg bWluX3NlcW5vKSkKPj4gKwkJCW1pbl9zZXFubyA9IG5vZGUtPnBhcmFtcy5yZXF1ZXN0LT5zZXFu bzsKPj4gKwl9Cj4gQ291bGRuJ3QgdGhlc2UgdmFsdWVzIGJlIGtlcHQgY2FjaGVkLCBpbnN0ZWFk IG9mIGNvdW50aW5nIHRoZW0gYXQgZWFjaAo+IGZ1bmN0aW9uPwpUaGUgJ3F1ZXVlZCcgYW5kIGZs eWluZyB0b3RhbHMgY291bGQgYmUga2VwdCBjYWNoZWQgYnV0IG1pbl9zZXFubyBpcyAKZGVwZW5k ZW50IHVwb24gdGhlIHN0YXRlIG9mIHRoZSBoYXJkd2FyZSBzbyBuZWVkcyB0byBiZSByZWNhbGN1 bGF0ZWQuIEluIAp3aGljaCBjYXNlIGNhbGN1bGF0aW5nIHRoZSB0b3RhbHMgaGVyZSBpcyB0cml2 aWFsIGFuZCBhdm9pZHMgaGF2aW5nIApleHRyYSBjb2RlIGVsc2V3aGVyZSB0byBrZWVwIHRoZW0g dXAgdG8gZGF0ZS4KCj4KPj4gKwo+PiArCUlOSVRfTElTVF9IRUFEKCZyZW1vdmUpOwo+PiArCWxp c3RfZm9yX2VhY2hfZW50cnlfc2FmZShub2RlLCBub2RlX25leHQsICZzY2hlZHVsZXItPm5vZGVf cXVldWVbcmluZy0+aWRdLCBsaW5rKSB7Cj4+ICsJCS8qCj4+ICsJCSAqIE9ubHkgcmVtb3ZlIGNv bXBsZXRlZCBub2RlcyB3aGljaCBoYXZlIGEgbG93ZXIgc2Vxbm8gdGhhbgo+PiArCQkgKiBhbGwg cGVuZGluZyBub2Rlcy4gV2hpbGUgdGhlcmUgaXMgdGhlIHBvc3NpYmlsaXR5IG9mIHRoZQo+PiAr CQkgKiByaW5nJ3Mgc2Vxbm8gY291bnRpbmcgYmFja3dhcmRzLCBhbGwgaGlnaGVyIGJ1ZmZlcnMg bXVzdAo+PiArCQkgKiBiZSByZW1lbWJlcmVkIHNvIHRoYXQgdGhlICdpOTE1X3NlcW5vX3Bhc3Nl ZCgpJyB0ZXN0IGNhbgo+PiArCQkgKiByZXBvcnQgdGhhdCB0aGV5IGhhdmUgaW4gZmFjdCBwYXNz ZWQuCj4+ICsJCSAqCj4+ICsJCSAqIE5COiBUaGlzIGlzIG5vdCB0cnVlIGZvciAnZGVhZCcgbm9k ZXMuIFRoZSBHUFUgcmVzZXQgY2F1c2VzCj4+ICsJCSAqIHRoZSBzb2Z0d2FyZSBzZXFubyB0byBy ZXN0YXJ0IGZyb20gaXRzIGluaXRpYWwgdmFsdWUuIFRodXMKPj4gKwkJICogdGhlIGRlYWQgbm9k ZXMgbXVzdCBiZSByZW1vdmVkIGV2ZW4gdGhvdWdoIHRoZWlyIHNlcW5vIHZhbHVlcwo+PiArCQkg KiBhcmUgcG90ZW50aWFsbHkgdmFzdGx5IGdyZWF0ZXIgdGhhbiB0aGUgY3VycmVudCByaW5nIHNl cW5vLgo+PiArCQkgKi8KPj4gKwkJaWYgKCFJOTE1X1NRU19JU19DT01QTEVURShub2RlKSkKPj4g KwkJCWNvbnRpbnVlOwo+PiArCj4+ICsJCWlmIChub2RlLT5zdGF0dXMgIT0gaTkxNV9zcXNfZGVh ZCkgewo+PiArCQkJaWYgKGk5MTVfc2Vxbm9fcGFzc2VkKG5vZGUtPnBhcmFtcy5yZXF1ZXN0LT5z ZXFubywgbWluX3NlcW5vKSAmJgo+PiArCQkJICAgIChub2RlLT5wYXJhbXMucmVxdWVzdC0+c2Vx bm8gIT0gbWluX3NlcW5vKSkKPj4gKwkJCQljb250aW51ZTsKPj4gKwkJfQo+PiArCj4+ICsJCWxp c3RfZGVsKCZub2RlLT5saW5rKTsKPj4gKwkJbGlzdF9hZGQoJm5vZGUtPmxpbmssICZyZW1vdmUp Owo+PiArCj4+ICsJCS8qIFN0cmlwIHRoZSBkZXBlbmRlbmN5IGluZm8gd2hpbGUgdGhlIG11dGV4 IGlzIHN0aWxsIGxvY2tlZCAqLwo+PiArCQlpOTE1X3NjaGVkdWxlcl9yZW1vdmVfZGVwZW5kZW50 KHNjaGVkdWxlciwgbm9kZSk7Cj4+ICsKPj4gKwkJY29udGludWU7Cj4+ICsJfQo+PiArCj4+ICsJ LyoKPj4gKwkgKiBSZWxlYXNlIHRoZSBpbnRlcnJ1cHQgcmVmZXJlbmNlIGNvdW50IGlmIHRoZXJl IGFyZSBubyBsb25nZXIgYW55Cj4+ICsJICogbm9kZXMgdG8gd29ycnkgYWJvdXQuCj4+ICsJICov Cj4+ICsJaWYgKCFmbHlpbmcgJiYgIXF1ZXVlZCAmJgo+PiArCSAgICAoc2NoZWR1bGVyLT5mbGFn c1tyaW5nLT5pZF0gJiBpOTE1X3NmX2ludGVycnVwdHNfZW5hYmxlZCkpIHsKPj4gKwkJcmluZy0+ aXJxX3B1dChyaW5nKTsKPj4gKwkJc2NoZWR1bGVyLT5mbGFnc1tyaW5nLT5pZF0gJj0gfmk5MTVf c2ZfaW50ZXJydXB0c19lbmFibGVkOwo+PiArCX0KPj4gKwo+PiArCS8qIExhdW5jaCBtb3JlIHBh Y2tldHMgbm93PyAqLwo+PiArCWRvX3N1Ym1pdCA9IChxdWV1ZWQgPiAwKSAmJiAoZmx5aW5nIDwg c2NoZWR1bGVyLT5taW5fZmx5aW5nKTsKPj4gKwo+PiArCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUo JnNjaGVkdWxlci0+bG9jaywgZmxhZ3MpOwo+PiArCj4+ICsJaWYgKCFkb19zdWJtaXQgJiYgbGlz dF9lbXB0eSgmcmVtb3ZlKSkKPj4gKwkJcmV0dXJuIHJldDsKPj4gKwo+PiArCW11dGV4X2xvY2so JnJpbmctPmRldi0+c3RydWN0X211dGV4KTsKPj4gKwo+PiArCWlmIChkb19zdWJtaXQpCj4+ICsJ CXJldCA9IGk5MTVfc2NoZWR1bGVyX3N1Ym1pdChyaW5nLCB0cnVlKTsKPiBDb25mdXNpbmcgdG8g aGF2ZSB0aGlzIGF0IGEgcmVtb3ZlIGZ1bmN0aW9uLiBGdW5jdGlvbiBuYW1pbmcgbmVlZHMgdG8K PiBiZSByZWNvbnNpZGVyZWQgb3IgbW92ZWQgb3V0IGZyb20gaGVyZS4KPgo+PiArCj4+ICsJd2hp bGUgKCFsaXN0X2VtcHR5KCZyZW1vdmUpKSB7Cj4+ICsJCW5vZGUgPSBsaXN0X2ZpcnN0X2VudHJ5 KCZyZW1vdmUsIHR5cGVvZigqbm9kZSksIGxpbmspOwo+PiArCQlsaXN0X2RlbCgmbm9kZS0+bGlu ayk7Cj4+ICsKPj4gKwkJLyoKPj4gKwkJICogVGhlIGJhdGNoIGJ1ZmZlciBtdXN0IGJlIHVucGlu bmVkIGJlZm9yZSBpdCBpcyB1bnJlZmVyZW5jZWQKPj4gKwkJICogb3RoZXJ3aXNlIHRoZSB1bnBp biBmYWlscyB3aXRoIGEgbWlzc2luZyB2bWEhPwo+PiArCQkgKi9wcmlvcml0eV9idW1wX2NsZWFy Cj4+ICsJCWlmIChub2RlLT5wYXJhbXMuZGlzcGF0Y2hfZmxhZ3MgJiBJOTE1X0RJU1BBVENIX1NF Q1VSRSkKPj4gKwkJCWk5MTVfZ2VtX2V4ZWNidWZmX3JlbGVhc2VfYmF0Y2hfb2JqKG5vZGUtPnBh cmFtcy5iYXRjaF9vYmopOwo+PiArCj4+ICsJCS8qIEZyZWUgZXZlcnl0aGluZyB0aGF0IGlzIG93 bmVkIGJ5IHRoZSBub2RlOiAqLwo+PiArCQlpOTE1X2dlbV9yZXF1ZXN0X3VucmVmZXJlbmNlKG5v ZGUtPnBhcmFtcy5yZXF1ZXN0KTsKPj4gKwkJa2ZyZWUobm9kZS0+cGFyYW1zLmNsaXByZWN0cyk7 Cj4+ICsJCWtmcmVlKG5vZGUtPmRlcF9saXN0KTsKPj4gKwkJa2ZyZWUobm9kZSk7Cj4+ICsJfQo+ PiArCj4+ICsJbXV0ZXhfdW5sb2NrKCZyaW5nLT5kZXYtPnN0cnVjdF9tdXRleCk7Cj4+ICsKPj4g KwlyZXR1cm4gcmV0Owo+PiArfQo+PiArCj4+ICtzdGF0aWMgdm9pZCBpOTE1X3NjaGVkdWxlcl9w cmlvcml0eV9idW1wX2NsZWFyKHN0cnVjdCBpOTE1X3NjaGVkdWxlciAqc2NoZWR1bGVyKQo+PiAr ewo+PiArCXN0cnVjdCBpOTE1X3NjaGVkdWxlcl9xdWV1ZV9lbnRyeSAqbm9kZTsKPj4gKwlpbnQg aTsKPj4gKwo+PiArCS8qCj4+ICsJICogRW5zdXJlIGNpcmN1bGFyIGRlcGVuZGVuY2llcyBkb24n dCBjYXVzZSBwcm9ibGVtcyBhbmQgdGhhdCBhIGJ1bXAKPj4gKwkgKiBieSBvYmplY3QgdXNhZ2Ug b25seSBidW1wcyBlYWNoIHVzaW5nIGJ1ZmZlciBvbmNlOgo+PiArCSAqLwo+PiArCWZvciAoaSA9 IDA7IGkgPCBJOTE1X05VTV9SSU5HUzsgaSsrKSB7Cj4+ICsJCWxpc3RfZm9yX2VhY2hfZW50cnko bm9kZSwgJnNjaGVkdWxlci0+bm9kZV9xdWV1ZVtpXSwgbGluaykKPj4gKwkJCW5vZGUtPmJ1bXBl ZCA9IGZhbHNlOwo+PiArCX0KPj4gK30KPj4gKwo+PiArc3RhdGljIGludCBpOTE1X3NjaGVkdWxl cl9wcmlvcml0eV9idW1wKHN0cnVjdCBpOTE1X3NjaGVkdWxlciAqc2NoZWR1bGVyLAo+PiArCQkJ CXN0cnVjdCBpOTE1X3NjaGVkdWxlcl9xdWV1ZV9lbnRyeSAqdGFyZ2V0LAo+PiArCQkJCXVpbnQz Ml90IGJ1bXApCj4+ICt7Cj4+ICsJdWludDMyX3QgbmV3X3ByaW9yaXR5Owo+PiArCWludCAgICAg IGksIGNvdW50Owo+PiArCj4+ICsJaWYgKHRhcmdldC0+cHJpb3JpdHkgPj0gc2NoZWR1bGVyLT5w cmlvcml0eV9sZXZlbF9tYXgpCj4+ICsJCXJldHVybiAxOwo+PiArCj4+ICsJaWYgKHRhcmdldC0+ YnVtcGVkKQo+PiArCQlyZXR1cm4gMDsKPj4gKwo+PiArCW5ld19wcmlvcml0eSA9IHRhcmdldC0+ cHJpb3JpdHkgKyBidW1wOwo+PiArCWlmICgobmV3X3ByaW9yaXR5IDw9IHRhcmdldC0+cHJpb3Jp dHkpIHx8Cj4+ICsJICAgIChuZXdfcHJpb3JpdHkgPiBzY2hlZHVsZXItPnByaW9yaXR5X2xldmVs X21heCkpCj4+ICsJCXRhcmdldC0+cHJpb3JpdHkgPSBzY2hlZHVsZXItPnByaW9yaXR5X2xldmVs X21heDsKPj4gKwllbHNlCj4+ICsJCXRhcmdldC0+cHJpb3JpdHkgPSBuZXdfcHJpb3JpdHk7Cj4+ ICsKPj4gKwljb3VudCA9IDE7Cj4+ICsJdGFyZ2V0LT5idW1wZWQgPSB0cnVlOwo+PiArCj4+ICsJ Zm9yIChpID0gMDsgaSA8IHRhcmdldC0+bnVtX2RlcHM7IGkrKykgewo+PiArCQlpZiAoIXRhcmdl dC0+ZGVwX2xpc3RbaV0pCj4+ICsJCQljb250aW51ZTsKPj4gKwo+PiArCQlpZiAodGFyZ2V0LT5k ZXBfbGlzdFtpXS0+YnVtcGVkKQo+PiArCQkJY29udGludWU7Cj4+ICsKPj4gKwkJY291bnQgKz0g aTkxNV9zY2hlZHVsZXJfcHJpb3JpdHlfYnVtcChzY2hlZHVsZXIsCj4+ICsJCQkJCQkgICAgICB0 YXJnZXQtPmRlcF9saXN0W2ldLAo+PiArCQkJCQkJICAgICAgYnVtcCk7Cj4+ICsJfQo+PiArCj4+ ICsJcmV0dXJuIGNvdW50Owo+PiArfQo+PiArCj4+ICtzdGF0aWMgaW50IGk5MTVfc2NoZWR1bGVy X3BvcF9mcm9tX3F1ZXVlX2xvY2tlZChzdHJ1Y3QgaW50ZWxfZW5naW5lX2NzICpyaW5nLAo+PiAr CQkJCXN0cnVjdCBpOTE1X3NjaGVkdWxlcl9xdWV1ZV9lbnRyeSAqKnBvcF9ub2RlLAo+PiArCQkJ CXVuc2lnbmVkIGxvbmcgKmZsYWdzKQo+PiArewo+PiArCXN0cnVjdCBkcm1faTkxNV9wcml2YXRl ICAgICAgICAgICAgKmRldl9wcml2ID0gcmluZy0+ZGV2LT5kZXZfcHJpdmF0ZTsKPj4gKwlzdHJ1 Y3QgaTkxNV9zY2hlZHVsZXIgICAgICAgICAgICAgICpzY2hlZHVsZXIgPSBkZXZfcHJpdi0+c2No ZWR1bGVyOwo+PiArCXN0cnVjdCBpOTE1X3NjaGVkdWxlcl9xdWV1ZV9lbnRyeSAgKmJlc3Q7Cj4+ ICsJc3RydWN0IGk5MTVfc2NoZWR1bGVyX3F1ZXVlX2VudHJ5ICAqbm9kZTsKPj4gKwlpbnQgICAg IHJldDsKPj4gKwlpbnQgICAgIGk7Cj4+ICsJYm9vbAlhbnlfcXVldWVkOwo+PiArCWJvb2wJaGFz X2xvY2FsLCBoYXNfcmVtb3RlLCBvbmx5X3JlbW90ZTsKPj4gKwo+PiArCSpwb3Bfbm9kZSA9IE5V TEw7Cj4+ICsJcmV0ID0gLUVOT0RBVEE7Cj4+ICsKPj4gKwlhbnlfcXVldWVkID0gZmFsc2U7Cj4+ ICsJb25seV9yZW1vdGUgPSBmYWxzZTsKPj4gKwliZXN0ID0gTlVMTDsKPiBUaGVzZSBzaG91bGQg anVzdCBiZSBpbml0aWFsaXplZCBpbi1wbGFjZS4gQnV0IGxvb2tpbmcgYXQgdGhlIGNvZGUKPiBm b3J3YXJkLgo+Cj4+ICsKPj4gKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KG5vZGUsICZzY2hlZHVsZXIt Pm5vZGVfcXVldWVbcmluZy0+aWRdLCBsaW5rKSB7Cj4+ICsJCWlmICghSTkxNV9TUVNfSVNfUVVF VUVEKG5vZGUpKQo+PiArCQkJY29udGludWU7Cj4+ICsJCWFueV9xdWV1ZWQgPSB0cnVlOwo+PiAr Cj4+ICsJCWhhc19sb2NhbCAgPSBmYWxzZTsKPj4gKwkJaGFzX3JlbW90ZSA9IGZhbHNlOwo+PiAr CQlmb3IgKGkgPSAwOyBpIDwgbm9kZS0+bnVtX2RlcHM7IGkrKykgewo+PiArCQkJaWYgKCFpOTE1 X3NjaGVkdWxlcl9pc19kZXBlbmRlbmN5X3ZhbGlkKG5vZGUsIGkpKQo+PiArCQkJCWNvbnRpbnVl Owo+PiArCj4+ICsJCQlpZiAobm9kZS0+ZGVwX2xpc3RbaV0tPnBhcmFtcy5yaW5nID09IG5vZGUt PnBhcmFtcy5yaW5nKQo+PiArCQkJCWhhc19sb2NhbCA9IHRydWU7Cj4+ICsJCQllbHNlCj4+ICsJ CQkJaGFzX3JlbW90ZSA9IHRydWU7Cj4+ICsJCX0KPj4gKwo+PiArCQlpZiAoaGFzX3JlbW90ZSAm JiAhaGFzX2xvY2FsKQo+PiArCQkJb25seV9yZW1vdGUgPSB0cnVlOwo+PiArCj4+ICsJCWlmICgh aGFzX2xvY2FsICYmICFoYXNfcmVtb3RlKSB7Cj4+ICsJCQlpZiAoIWJlc3QgfHwKPj4gKwkJCSAg ICAobm9kZS0+cHJpb3JpdHkgPiBiZXN0LT5wcmlvcml0eSkpCj4+ICsJCQkJYmVzdCA9IG5vZGU7 Cj4+ICsJCX0KPj4gKwl9Cj4+ICsKPj4gKwlpZiAoYmVzdCkgewo+PiArCQlsaXN0X2RlbCgmYmVz dC0+bGluayk7Cj4+ICsKPj4gKwkJSU5JVF9MSVNUX0hFQUQoJmJlc3QtPmxpbmspOwo+PiArCQli ZXN0LT5zdGF0dXMgID0gaTkxNV9zcXNfcG9wcGVkOwo+PiArCj4+ICsJCXJldCA9IDA7Cj4+ICsJ fSBlbHNlIHsKPj4gKwkJLyogQ2FuIG9ubHkgZ2V0IGhlcmUgaWY6Cj4+ICsJCSAqIChhKSB0aGVy ZSBhcmUgbm8gYnVmZmVycyBpbiB0aGUgcXVldWUKPj4gKwkJICogKGIpIGFsbCBxdWV1ZWQgYnVm ZmVycyBhcmUgZGVwZW5kZW50IG9uIG90aGVyIGJ1ZmZlcnMKPj4gKwkJICogICAgIGUuZy4gb24g YSBidWZmZXIgdGhhdCBpcyBpbiBmbGlnaHQgb24gYSBkaWZmZXJlbnQgcmluZwo+PiArCQkgKi8K Pj4gKwkJaWYgKG9ubHlfcmVtb3RlKSB7Cj4+ICsJCQkvKiBUaGUgb25seSBkZXBlbmRlbnQgYnVm ZmVycyBhcmUgb24gYW5vdGhlciByaW5nLiAqLwo+PiArCQkJcmV0ID0gLUVBR0FJTjsKPj4gKwkJ fSBlbHNlIGlmIChhbnlfcXVldWVkKSB7Cj4+ICsJCQkvKiBJdCBzZWVtcyB0aGF0IHNvbWV0aGlu ZyBoYXMgZ29uZSBob3JyaWJseSB3cm9uZyEgKi8KPj4gKwkJCURSTV9FUlJPUigiQnJva2VuIGRl cGVuZGVuY3kgdHJhY2tpbmcgb24gcmluZyAlZCFcbiIsCj4+ICsJCQkJICAoaW50KSByaW5nLT5p ZCk7Cj4+ICsJCX0KPj4gKwl9Cj4+ICsKPj4gKwkvKiBpOTE1X3NjaGVkdWxlcl9kdW1wX3F1ZXVl X3BvcChyaW5nLCBiZXN0KTsgKi8KPj4gKwo+PiArCSpwb3Bfbm9kZSA9IGJlc3Q7Cj4+ICsJcmV0 dXJuIHJldDsKPj4gK30KPj4gKwo+PiArc3RhdGljIGludCBpOTE1X3NjaGVkdWxlcl9zdWJtaXQo c3RydWN0IGludGVsX2VuZ2luZV9jcyAqcmluZywgYm9vbCB3YXNfbG9ja2VkKQo+PiArewo+PiAr CXN0cnVjdCBkcm1fZGV2aWNlICAgKmRldiA9IHJpbmctPmRldjsKPj4gKwlzdHJ1Y3QgZHJtX2k5 MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwo+PiArCXN0cnVjdCBpOTE1 X3NjaGVkdWxlciAgICpzY2hlZHVsZXIgPSBkZXZfcHJpdi0+c2NoZWR1bGVyOwo+PiArCXN0cnVj dCBpOTE1X3NjaGVkdWxlcl9xdWV1ZV9lbnRyeSAgKm5vZGU7Cj4+ICsJdW5zaWduZWQgbG9uZyAg ICAgICBmbGFnczsKPj4gKwlpbnQgICAgICAgICAgICAgICAgIHJldCA9IDAsIGNvdW50ID0gMDsK Pj4gKwo+PiArCWlmICghd2FzX2xvY2tlZCkgewo+PiArCQlyZXQgPSBpOTE1X211dGV4X2xvY2tf aW50ZXJydXB0aWJsZShkZXYpOwo+PiArCQlpZiAocmV0KQo+PiArCQkJcmV0dXJuIHJldDsKPj4g Kwl9Cj4+ICsKPiBJIGRvbid0IHJlYWxseSBmYW5jeSB0aGlzIGNvbnN0cnVjdC4gU2hvdWxkIGJl IG1vdmVkIG91dHNpZGUgb2YgdGhpcwo+IGZ1bmN0aW9uIGZvciBwcm9wZXIgbG9ja2RlcCB0cmFj a2luZy4KPgo+PiArCVdBUk5fT04oIW11dGV4X2lzX2xvY2tlZCgmZGV2LT5zdHJ1Y3RfbXV0ZXgp KTsKPj4gKwo+PiArCXNwaW5fbG9ja19pcnFzYXZlKCZzY2hlZHVsZXItPmxvY2ssIGZsYWdzKTsK Pj4gKwo+PiArCS8qIEZpcnN0IHRpbWUgYXJvdW5kLCBjb21wbGFpbiBpZiBhbnl0aGluZyB1bmV4 cGVjdGVkIG9jY3VyczogKi8KPj4gKwlyZXQgPSBpOTE1X3NjaGVkdWxlcl9wb3BfZnJvbV9xdWV1 ZV9sb2NrZWQocmluZywgJm5vZGUsICZmbGFncyk7Cj4+ICsJaWYgKHJldCkgewo+PiArCQlzcGlu X3VubG9ja19pcnFyZXN0b3JlKCZzY2hlZHVsZXItPmxvY2ssIGZsYWdzKTsKPj4gKwo+PiArCQlp ZiAoIXdhc19sb2NrZWQpCj4+ICsJCQltdXRleF91bmxvY2soJmRldi0+c3RydWN0X211dGV4KTsK Pj4gKwo+PiArCQlyZXR1cm4gcmV0Owo+PiArCX0KPj4gKwo+IERyb3BwaW5nIHRoZSB3YXNfbG9j a2VkIHN0dWZmLCB0aGlzIHNob3VsZCBiZWNvbWUgYSBwcm9wZXIgZ290byBlcnJvcgo+IGxhYmVs LiBlLmcuIG91dF91bmxvY2sKPgo+PiArCWRvIHsKPj4gKwkJV0FSTl9PTighbm9kZSk7Cj4+ICsJ CVdBUk5fT04obm9kZS0+cGFyYW1zLnJpbmcgIT0gcmluZyk7Cj4+ICsJCVdBUk5fT04obm9kZS0+ c3RhdHVzICE9IGk5MTVfc3FzX3BvcHBlZCk7Cj4+ICsJCWNvdW50Kys7Cj4+ICsKPj4gKwkJLyoK Pj4gKwkJICogVGhlIGNhbGwgdG8gcG9wIGFib3ZlIHdpbGwgaGF2ZSByZW1vdmVkIHRoZSBub2Rl IGZyb20gdGhlCj4+ICsJCSAqIGxpc3QuIFNvIGFkZCBpdCBiYWNrIGluIGFuZCBtYXJrIGl0IGFz IGluIGZsaWdodC4KPj4gKwkJICovCj4+ICsJCWk5MTVfc2NoZWR1bGVyX2ZseV9ub2RlKG5vZGUp Owo+IFdoeSBkbyB3ZSB3YW50IHRvIHB1bGwgYW4gb2JqZWN0IG91dCBvZiB0aGUgbGlzdCBpbnNp ZGUgc3BpbiBsb2NrIGFuZAo+IHB1c2ggaXQgYmFjayBpbW1lZGlhdGVseSBpbiBvdXIgY3JpdGlj YWwgY29kZSBwYXRoPyBTZWVtcyBsaWtlIGEgd2FzdGUKPiBmb3Igbm8gb2J2aW91cyBnYWluIGF0 IHRoaXMgcG9pbnQuIFdoeSBkbyBub3Qgd2UgcmF0aGVyIGp1c3Qgc2VsZWN0IGFuCj4gZW50cnkg YW5kIG1vZGlmeSBpdCBpbi1wbGFjZSwgaWYgaXQncyBnb2luZyB0byBzdGF5IGluIHRoZSBzYW1l IHF1ZXVlCj4gYW55d2F5LgpUaGUgbGlzdCBvcmRlciBpcyBzaWduaWZpY2FudC4gVGhlIGVsZW1l bnQgbXVzdCBiZSBtb3ZlZCB0byB0aGUgZnJvbnQgdG8gCmtlZXAgdGhlIHN1Ym1pdHRlZCBpdGVt cyBpbiBzdWJtaXNzaW9uIG9yZGVyLiBEb2luZyBpdCB0aGlzIHdheSBhbHNvIAprZWVwcyB0aGUg Y29kZSBuaWNlbHkgcGFydGl0aW9uZWQgYW5kIGVhc2llciB0byB1bmRlcnN0YW5kL21haW50YWlu LiAKUGx1cywgdGhlcmUgaXMgYSBwbGFuIHRvIG9wdGltaXNlIHRoZSBjb2RlIGJ5IHNwbGl0dGlu ZyB0aGUgb25lIHNpbmdsZSAKbGlzdCBpbnRvIHRocmVlIHNlcGFyYXRlIG9uZXMgLSBxdWV1ZWQs IGZseWluZywgY29tcGxldGUuIElmL3doZW4gdGhhdCAKaGFwcGVucywgdGhlIGVsZW1lbnQgd2ls bCBoYXZlIHRvIGJlIHJlbW92ZWQgZnJvbSBvbmUgbGlzdCBhbmQgYWRkZWQgdG8gCmFub3RoZXIu Cgo+Cj4+ICsKPj4gKwkJc2NoZWR1bGVyLT5mbGFnc1tyaW5nLT5pZF0gfD0gaTkxNV9zZl9zdWJt aXR0aW5nOwo+PiArCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzY2hlZHVsZXItPmxvY2ssIGZs YWdzKTsKPj4gKwkJcmV0ID0gZGV2X3ByaXYtPmd0LmV4ZWNidWZfZmluYWwoJm5vZGUtPnBhcmFt cyk7Cj4+ICsJCXNwaW5fbG9ja19pcnFzYXZlKCZzY2hlZHVsZXItPmxvY2ssIGZsYWdzKTsKPj4g KwkJc2NoZWR1bGVyLT5mbGFnc1tyaW5nLT5pZF0gJj0gfmk5MTVfc2Zfc3VibWl0dGluZzsKPj4g Kwo+PiArCQlpZiAocmV0KSB7Cj4+ICsJCQlpbnQgcmVxdWV1ZSA9IDE7Cj4gTXVsdGlwdXJwb3Nl IHZhcmlhYmxlLCBub3QgcmVhbGx5IGEgZ29vZCBpZGVhLiBBbmQgYXMgY29tbWVudGVkCj4gZnVy dGhlciwgc2hvdWxkIG5vdCBleGlzdCBhdCBhbGwuCj4KPj4gKwo+PiArCQkJLyoKPj4gKwkJCSAq IE9oIGRlYXIhIEVpdGhlciB0aGUgbm9kZSBpcyBicm9rZW4gb3IgdGhlIHJpbmcgaXMKPj4gKwkJ CSAqIGJ1c3kuIFNvIG5lZWQgdG8ga2lsbCB0aGUgbm9kZSBvciByZXF1ZXVlIGl0IGFuZCB0cnkK Pj4gKwkJCSAqIGFnYWluIGxhdGVyIGFzIGFwcHJvcHJpYXRlLgo+PiArCQkJICovCj4+ICsKPj4g KwkJCXN3aXRjaCAoLXJldCkgewo+PiArCQkJY2FzZSBFTk9ERVY6Cj4+ICsJCQljYXNlIEVOT0VO VDoKPj4gKwkJCQkvKiBGYXRhbCBlcnJvcnMuIEtpbGwgdGhlIG5vZGUuICovCj4+ICsJCQkJcmVx dWV1ZSA9IC0xOwo+PiArCQkJYnJlYWs7Cj4gImJyZWFrIiBpbmRlbnQgaXMgd3JvbmcuCj4KPj4g Kwo+PiArCQkJY2FzZSBFQUdBSU46Cj4+ICsJCQljYXNlIEVCVVNZOgo+PiArCQkJY2FzZSBFSU86 Cj4+ICsJCQljYXNlIEVOT01FTToKPj4gKwkJCWNhc2UgRVJFU1RBUlRTWVM6Cj4+ICsJCQljYXNl IEVJTlRSOgo+PiArCQkJCS8qIFN1cHBvc2VkbHkgcmVjb3ZlcmFibGUgZXJyb3JzLiAqLwo+PiAr CQkJYnJlYWs7Cj4+ICsKPj4gKwkJCWRlZmF1bHQ6Cj4+ICsJCQkJLyoKPj4gKwkJCQkgKiBBc3N1 bWUgdGhlIGVycm9yIGlzIHJlY292ZXJhYmxlIGFuZCBob3BlCj4+ICsJCQkJICogZm9yIHRoZSBi ZXN0Lgo+PiArCQkJCSAqLwo+PiArCQkJCURSTV9ERUJVR19EUklWRVIoIjwlcz4gR290IHVuZXhw ZWN0ZWQgZXJyb3IgZnJvbSBleGVjZmluYWwoKTogJWQhXG4iLAo+PiArCQkJCQkJIHJpbmctPm5h bWUsIHJldCk7Cj4gVGhlcmUncyBNSVNTSU5HX0NBU0UgbWFjcm8sIHNob3VsZCB1c2UgaXQuCj4K Pj4gKwkJCWJyZWFrOwo+PiArCQkJfQo+PiArCj4gSnVzdCBtb3ZlIHRoZSBjb2RlIGJlbG93IHRo aXMgcG9pbnQgdG8gdGhlIHN3aXRjaCwgbm8gcG9pbnQgaGF2aW5nIGEKPiBzd2l0Y2ggdG8gY2F0 ZWdvcml6ZSB5b3VyIG9wdGlvbnMgYW5kIHRoZW4gZG9pbmcgYnVuY2ggb2YgaWZzIHRvCj4gZXhl Y3V0ZSBjb2RlIHRoYXQgY291bGQgYmUgaW4gc3dpdGNoLgpPbmUgb2YgdGhlICdpZicgcGF0aHMg aXMgdG8gYnJlYWsgb3V0IG9mIHRoZSB3aGlsZSBsb29wLiBDYW4ndCBkbyB0aGF0IApmcm9tIGlu c2lkZSB0aGUgc3dpdGNoLgoKPj4gKwkJCS8qCj4+ICsJCQkgKiBDaGVjayB0aGF0IHRoZSB3YXRj aGRvZy9yZXNldCBjb2RlIGhhcyBub3QgbnVrZWQKPj4gKwkJCSAqIHRoZSBub2RlIHdoaWxlIHdl IHdlcmVuJ3QgbG9va2luZzoKPj4gKwkJCSAqLwo+PiArCQkJaWYgKG5vZGUtPnN0YXR1cyA9PSBp OTE1X3Nxc19kZWFkKQo+PiArCQkJCXJlcXVldWUgPSAwOwo+PiArCj4+ICsJCQlpZiAocmVxdWV1 ZSA9PSAxKSB7Cj4+ICsJCQkJaTkxNV9zY2hlZHVsZXJfbm9kZV9yZXF1ZXVlKG5vZGUpOwo+PiAr CQkJCS8qCj4+ICsJCQkJICogTm8gcG9pbnQgc3Bpbm5pbmcgaWYgdGhlIHJpbmcgaXMgY3VycmVu dGx5Cj4+ICsJCQkJICogdW5hdmFpbGFibGUgc28ganVzdCBnaXZlIHVwIGFuZCBjb21lIGJhY2sK Pj4gKwkJCQkgKiBsYXRlci4KPj4gKwkJCQkgKi8KPj4gKwkJCQlicmVhazsKPj4gKwkJCX0gZWxz ZSBpZiAocmVxdWV1ZSA9PSAtMSkKPj4gKwkJCQlpOTE1X3NjaGVkdWxlcl9ub2RlX2tpbGwobm9k ZSk7Cj4+ICsJCX0KPj4gKwo+IEVuZGluZyBoZXJlLCB0aGlzIGFjdHVhbCBzdWJtaXNzaW9uIG9m IGEgc2luZ2xlIG5vZGUgY291bGQgZ28gdG8gaXRzCj4gb3duIGhlbHBlciBmdW5jdGlvbiwgdGhl c2UgZnVuY3Rpb25zIG5vdyBiZWNvbWUgdG9vIGxvbmcgdG8gZm9sbG93LAo+IGFsdGhvdWdoIHRo ZXkgcmVhbGx5IGFyZSBub3QgZG9pbmcgYW55dGhpbmcgY29tcGxpY2F0ZWQuCj4KPj4gKwkJLyog S2VlcCBsYXVuY2hpbmcgdW50aWwgdGhlIHNreSBpcyBzdWZmaWNpZW50bHkgZnVsbC4gKi8KPj4g KwkJaWYgKGk5MTVfc2NoZWR1bGVyX2NvdW50X2ZseWluZyhzY2hlZHVsZXIsIHJpbmcpID49Cj4+ ICsJCQkJCQlzY2hlZHVsZXItPm1pbl9mbHlpbmcpCj4+ICsJCQlicmVhazsKPj4gKwo+PiArCQly ZXQgPSBpOTE1X3NjaGVkdWxlcl9wb3BfZnJvbV9xdWV1ZV9sb2NrZWQocmluZywgJm5vZGUsICZm bGFncyk7Cj4+ICsJfSB3aGlsZSAocmV0ID09IDApOwo+PiArCj4+ICsJc3Bpbl91bmxvY2tfaXJx cmVzdG9yZSgmc2NoZWR1bGVyLT5sb2NrLCBmbGFncyk7Cj4+ICsKPj4gKwlpZiAoIXdhc19sb2Nr ZWQpCj4+ICsJCW11dGV4X3VubG9jaygmZGV2LT5zdHJ1Y3RfbXV0ZXgpOwo+PiArCj4+ICsJLyog RG9uJ3QgY29tcGxhaW4gYWJvdXQgbm90IGJlaW5nIGFibGUgdG8gc3VibWl0IGV4dHJhIGVudHJp ZXMgKi8KPj4gKwlpZiAocmV0ID09IC1FTk9EQVRBKQo+PiArCQlyZXQgPSAwOwo+PiArCj4+ICsJ cmV0dXJuIChyZXQgPCAwKSA/IHJldCA6IGNvdW50Owo+IFRoaXMgaXMgYSBjb21iaW5lZCBlcnJv ciBhbmQgc3VjY2VzcyBwYXRoLCBrZWVwaW5nIHRvIHRoZSBjb252ZW50aW9uIG9mCj4ga2VybmVs IGRyaXZlcnMgaXMgcHJlZmVycmVkOwo+Cj4gCWlmIChyZXQgIT0gLUVOT0RBVEEpCj4gCQlnb3Rv IG91dF9mb287Cj4KPiAJcmV0dXJuIGNvdW50Owo+Cj4gb3V0X3VubG9jazoKPiAJc3Bpbl91bmxv Y2soLi4uKTsKPiBvdXRfZm9vOgo+IAlyZXR1cm4gcmV0Owo+Cj4KPgo+PiArfQo+PiArCj4+ICtz dGF0aWMgaW50IGk5MTVfc2NoZWR1bGVyX3JlbW92ZV9kZXBlbmRlbnQoc3RydWN0IGk5MTVfc2No ZWR1bGVyICpzY2hlZHVsZXIsCj4+ICsJCQkJc3RydWN0IGk5MTVfc2NoZWR1bGVyX3F1ZXVlX2Vu dHJ5ICpyZW1vdmUpCj4+ICt7Cj4+ICsJc3RydWN0IGk5MTVfc2NoZWR1bGVyX3F1ZXVlX2VudHJ5 ICAqbm9kZTsKPj4gKwlpbnQgICAgIGksIHI7Cj4+ICsJaW50ICAgICBjb3VudCA9IDA7Cj4+ICsK Pj4gKwkvKgo+PiArCSAqIEVuc3VyZSB0aGF0IGEgbm9kZSBpcyBub3QgYmVpbmcgcmVtb3ZlZCB3 aGljaCBpcyBzdGlsbCBkZXBlbmRlbnQKPj4gKwkgKiB1cG9uIG90aGVyIChub3QgY29tcGxldGVk KSB3b3JrLiBJZiB0aGF0IGhhcHBlbnMsIGl0IGltcGxpZXMKPj4gKwkgKiBzb21ldGhpbmcgaGFz IGdvbmUgdmVyeSB3cm9uZyB3aXRoIHRoZSBkZXBlbmRlbmN5IHRyYWNraW5nISBOb3RlCj4+ICsJ ICogdGhhdCB0aGVyZSBpcyBubyBuZWVkIHRvIHdvcnJ5IGlmIHRoaXMgbm9kZSBoYXMgYmVlbiBl eHBsaWNpdGx5Cj4+ICsJICoga2lsbGVkIGZvciBzb21lIHJlYXNvbiAtIGl0IG1pZ2h0IGJlIGJl aW5nIGtpbGxlZCBiZWZvcmUgaXQgZ290Cj4+ICsJICogc2VudCB0byB0aGUgaGFyZHdhcmUuCj4+ ICsJICovCj4+ICsJaWYgKHJlbW92ZS0+c3RhdHVzICE9IGk5MTVfc3FzX2RlYWQpIHsKPj4gKwkJ Zm9yIChpID0gMDsgaSA8IHJlbW92ZS0+bnVtX2RlcHM7IGkrKykKPj4gKwkJCWlmICgocmVtb3Zl LT5kZXBfbGlzdFtpXSkgJiYKPj4gKwkJCSAgICAoIUk5MTVfU1FTX0lTX0NPTVBMRVRFKHJlbW92 ZS0+ZGVwX2xpc3RbaV0pKSkKPj4gKwkJCQljb3VudCsrOwo+PiArCQlXQVJOX09OKGNvdW50KTsK Pj4gKwl9Cj4+ICsKPj4gKwkvKgo+PiArCSAqIFJlbW92ZSB0aGlzIG5vZGUgZnJvbSB0aGUgZGVw ZW5kZW5jeSBsaXN0cyBvZiBhbnkgb3RoZXIgbm9kZSB3aGljaAo+PiArCSAqIG1pZ2h0IGJlIHdh aXRpbmcgb24gaXQuCj4+ICsJICovCj4+ICsJZm9yIChyID0gMDsgciA8IEk5MTVfTlVNX1JJTkdT OyByKyspIHsKPj4gKwkJbGlzdF9mb3JfZWFjaF9lbnRyeShub2RlLCAmc2NoZWR1bGVyLT5ub2Rl X3F1ZXVlW3JdLCBsaW5rKSB7Cj4+ICsJCQlmb3IgKGkgPSAwOyBpIDwgbm9kZS0+bnVtX2RlcHM7 IGkrKykgewo+PiArCQkJCWlmIChub2RlLT5kZXBfbGlzdFtpXSAhPSByZW1vdmUpCj4+ICsJCQkJ CWNvbnRpbnVlOwo+PiArCj4+ICsJCQkJbm9kZS0+ZGVwX2xpc3RbaV0gPSBOVUxMOwo+PiArCQkJ fQo+PiArCQl9Cj4+ICsJfQo+PiArCj4+ICsJcmV0dXJuIDA7Cj4+ICt9Cj4+IGRpZmYgLS1naXQg YS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X3NjaGVkdWxlci5oIGIvZHJpdmVycy9ncHUvZHJt L2k5MTUvaTkxNV9zY2hlZHVsZXIuaAo+PiBuZXcgZmlsZSBtb2RlIDEwMDY0NAo+PiBpbmRleCAw MDAwMDAwLi4wMGRjN2YzCj4+IC0tLSAvZGV2L251bGwKPj4gKysrIGIvZHJpdmVycy9ncHUvZHJt L2k5MTUvaTkxNV9zY2hlZHVsZXIuaAo+PiBAQCAtMCwwICsxLDkxIEBACj4+ICsvKgo+PiArICog Q29weXJpZ2h0IChjKSAyMDE0IEludGVsIENvcnBvcmF0aW9uCj4+ICsgKgo+PiArICogUGVybWlz c2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0 YWluaW5nIGEKPj4gKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1 bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCj4+ICsgKiB0byBkZWFsIGluIHRoZSBT b2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9u Cj4+ICsgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwg ZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKPj4gKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUg U29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQo+PiArICogU29mdHdh cmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0 aW9uczoKPj4gKyAqCj4+ICsgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBw ZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZSBuZXh0Cj4+ICsgKiBwYXJhZ3JhcGgpIHNo YWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2Yg dGhlCj4+ICsgKiBTb2Z0d2FyZS4KPj4gKyAqCj4+ICsgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklE RUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgo+PiAr ICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBP RiBNRVJDSEFOVEFCSUxJVFksCj4+ICsgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9T RSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKPj4gKyAqIFRIRSBBVVRI T1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VT IE9SIE9USEVSCj4+ICsgKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRS QUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORwo+PiArICogRlJPTSwgT1VUIE9GIE9SIElO IENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5H Uwo+PiArICogSU4gVEhFIFNPRlRXQVJFLgo+PiArICoKPj4gKyAqLwo+PiArCj4+ICsjaWZuZGVm IF9JOTE1X1NDSEVEVUxFUl9IXwo+PiArI2RlZmluZSBfSTkxNV9TQ0hFRFVMRVJfSF8KPj4gKwo+ PiArZW51bSBpOTE1X3NjaGVkdWxlcl9xdWV1ZV9zdGF0dXMgewo+PiArCS8qIExpbWJvOiAqLwo+ PiArCWk5MTVfc3FzX25vbmUgPSAwLAo+PiArCS8qIE5vdCB5ZXQgc3VibWl0dGVkIHRvIGhhcmR3 YXJlOiAqLwo+PiArCWk5MTVfc3FzX3F1ZXVlZCwKPj4gKwkvKiBQb3BwZWQgZnJvbSBxdWV1ZSwg cmVhZHkgdG8gZmx5OiAqLwo+PiArCWk5MTVfc3FzX3BvcHBlZCwKPj4gKwkvKiBTZW50IHRvIGhh cmR3YXJlIGZvciBwcm9jZXNzaW5nOiAqLwo+PiArCWk5MTVfc3FzX2ZseWluZywKPj4gKwkvKiBG aW5pc2hlZCBwcm9jZXNzaW5nIG9uIHRoZSBoYXJkd2FyZTogKi8KPj4gKwlpOTE1X3Nxc19jb21w bGV0ZSwKPj4gKwkvKiBLaWxsZWQgYnkgd2F0Y2hkb2cgb3IgY2F0YXN0cm9waGljIHN1Ym1pc3Np b24gZmFpbHVyZTogKi8KPj4gKwlpOTE1X3Nxc19kZWFkLAo+PiArCS8qIExpbWl0IHZhbHVlIGZv ciB1c2Ugd2l0aCBhcnJheXMvbG9vcHMgKi8KPj4gKwlpOTE1X3Nxc19NQVgKPj4gK307Cj4gVGhl c2Ugc2hvdWxkIGJlIFVQUEVSQ0FTRV9GT1JfRU5VTV9WQUxVRVMgLiBTZWUgaTkxNV9kcnYuaCBm b3Igc2FtcGxlcy4KPgo+PiArCj4+ICsjZGVmaW5lIEk5MTVfU1FTX0lTX1FVRVVFRChub2RlKQko KChub2RlKS0+c3RhdHVzID09IGk5MTVfc3FzX3F1ZXVlZCkpCj4+ICsjZGVmaW5lIEk5MTVfU1FT X0lTX0ZMWUlORyhub2RlKQkoKChub2RlKS0+c3RhdHVzID09IGk5MTVfc3FzX2ZseWluZykpCj4+ ICsjZGVmaW5lIEk5MTVfU1FTX0lTX0NPTVBMRVRFKG5vZGUpCSgoKG5vZGUpLT5zdGF0dXMgPT0g aTkxNV9zcXNfY29tcGxldGUpIHx8IFwKPj4gKwkJCQkJICgobm9kZSktPnN0YXR1cyA9PSBpOTE1 X3Nxc19kZWFkKSkKPj4gKwo+IE1pZ2h0IGJlIHNsaWdodGx5IGNvbmZ1c2luZyB0aGF0IG5hbWUg aXMgSVNfQ09NUExFVEUgYW5kIHRoZXJlIGlzCj4gYWN0dWFsIENPTVBMRVRFIHZhbHVlLiBSYXRo ZXIgaGF2ZSB0aGUgdGVzdCBsaWtlIElTX0RPTkUgYW5kIHRoZW4gdGVzdAo+IGZvciBDT01QTEVU RSBvciBERUFELCBubyBjb25mdXNpb24uIEFsc28sIHNvbWUgc3RhdGVzIGhhdmUgdGhlaXIgSVNf Kgo+IG1hY3JvIGFuZCBvdGhlcnMgZG9uJ3QsIGlzIHRoZXJlIGdvaW5nIHRvIGJlIG1vcmU/Cj4K Pj4gK3N0cnVjdCBpOTE1X3NjaGVkdWxlcl9vYmpfZW50cnkgewo+PiArCXN0cnVjdCBkcm1faTkx NV9nZW1fb2JqZWN0ICAgICAgICAgICpvYmo7Cj4+ICsJYm9vbCAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgcmVhZF9vbmx5Owo+PiArfTsKPj4gKwo+PiArc3RydWN0IGk5MTVfc2NoZWR1 bGVyX3F1ZXVlX2VudHJ5IHsKPj4gKwlzdHJ1Y3QgaTkxNV9leGVjYnVmZmVyX3BhcmFtcyAgICAg ICBwYXJhbXM7Cj4+ICsJLyogLTEwMjMgPSBsb3dlc3QgcHJpb3JpdHksIDAgPSBkZWZhdWx0LCAx MDIzID0gaGlnaGVzdCAqLwo+PiArCWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAg IHByaW9yaXR5Owo+PiArCXN0cnVjdCBpOTE1X3NjaGVkdWxlcl9vYmpfZW50cnkgICAgICpzYXZl ZF9vYmplY3RzOwo+PiArCWludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bV9v YmpzOwo+PiArCWJvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1bXBlZDsKPj4g KwlzdHJ1Y3QgaTkxNV9zY2hlZHVsZXJfcXVldWVfZW50cnkgICAqKmRlcF9saXN0Owo+PiArCWlu dCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bV9kZXBzOwo+PiArCWVudW0gaTkx NV9zY2hlZHVsZXJfcXVldWVfc3RhdHVzICAgIHN0YXR1czsKPj4gKwl1bnNpZ25lZCBsb25nICAg ICAgICAgICAgICAgICAgICAgICBzdGFtcDsKPj4gKwlzdHJ1Y3QgbGlzdF9oZWFkICAgICAgICAg ICAgICAgICAgICBsaW5rOwo+PiArfTsKPj4gKwo+PiArc3RydWN0IGk5MTVfc2NoZWR1bGVyIHsK Pj4gKwlzdHJ1Y3QgbGlzdF9oZWFkICAgIG5vZGVfcXVldWVbSTkxNV9OVU1fUklOR1NdOwo+PiAr CXVpbnQzMl90ICAgICAgICAgICAgZmxhZ3NbSTkxNV9OVU1fUklOR1NdOwo+PiArCXNwaW5sb2Nr X3QgICAgICAgICAgbG9jazsKPj4gKwo+PiArCS8qIFR1bmluZyBwYXJhbWV0ZXJzOiAqLwo+PiAr CWludDMyX3QgICAgICAgICAgICAgcHJpb3JpdHlfbGV2ZWxfbWluOwo+PiArCWludDMyX3QgICAg ICAgICAgICAgcHJpb3JpdHlfbGV2ZWxfbWF4Owo+PiArCWludDMyX3QgICAgICAgICAgICAgcHJp b3JpdHlfbGV2ZWxfcHJlZW1wdDsKPj4gKwl1aW50MzJfdCAgICAgICAgICAgIG1pbl9mbHlpbmc7 Cj4+ICt9Owo+PiArCj4+ICsvKiBGbGFnIGJpdHMgZm9yIGk5MTVfc2NoZWR1bGVyOjpmbGFncyAq Lwo+PiArZW51bSB7Cj4+ICsJaTkxNV9zZl9pbnRlcnJ1cHRzX2VuYWJsZWQgID0gKDEgPDwgMCks Cj4+ICsJaTkxNV9zZl9zdWJtaXR0aW5nICAgICAgICAgID0gKDEgPDwgMSksCj4gQWdhaW4sIHNo b3VsZCBiZSB1cHBlcmNhc2UuIEFsc28sIGVudW1zIHRvIHRoZSBiZWdpbm5pbmcgb2YgZmlsZS4K Pgo+PiArfTsKPj4gKwo+PiAraW50ICAgICAgICAgaTkxNV9zY2hlZHVsZXJfaW5pdChzdHJ1Y3Qg ZHJtX2RldmljZSAqZGV2KTsKPj4gK2ludCAgICAgICAgIGk5MTVfc2NoZWR1bGVyX3F1ZXVlX2V4 ZWNidWZmZXIoc3RydWN0IGk5MTVfc2NoZWR1bGVyX3F1ZXVlX2VudHJ5ICpxZSk7Cj4+ICtib29s ICAgICAgICBpOTE1X3NjaGVkdWxlcl9ub3RpZnlfcmVxdWVzdChzdHJ1Y3QgZHJtX2k5MTVfZ2Vt X3JlcXVlc3QgKnJlcSk7Cj4+ICsKPj4gKyNlbmRpZiAgLyogX0k5MTVfU0NIRURVTEVSX0hfICov CgpfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwpJbnRlbC1n ZnggbWFpbGluZyBsaXN0CkludGVsLWdmeEBsaXN0cy5mcmVlZGVza3RvcC5vcmcKaHR0cHM6Ly9s aXN0cy5mcmVlZGVza3RvcC5vcmcvbWFpbG1hbi9saXN0aW5mby9pbnRlbC1nZngK