From mboxrd@z Thu Jan 1 00:00:00 1970 From: Julien Grall Subject: Re: [RFC] WIP: optee: add OP-TEE mediator Date: Mon, 4 Dec 2017 14:30:32 +0000 Message-ID: <79401ae2-a697-948e-3a2b-1c618d32004c@linaro.org> References: <92b77e94-00ff-d81b-e4e0-bb7cf4ce5a55@linaro.org> <1511802097-17286-1-git-send-email-volodymyr_babchuk@epam.com> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8"; Format="flowed" Content-Transfer-Encoding: base64 Return-path: Received: from us1-rack-dfw2.inumbo.com ([104.130.134.6]) by lists.xenproject.org with esmtp (Exim 4.84_2) (envelope-from ) id 1eLrlX-0001no-5C for xen-devel@lists.xenproject.org; Mon, 04 Dec 2017 14:30:39 +0000 Received: by mail-wm0-x22e.google.com with SMTP id l141so6166044wmg.1 for ; Mon, 04 Dec 2017 06:30:35 -0800 (PST) In-Reply-To: Content-Language: en-US List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Errors-To: xen-devel-bounces@lists.xenproject.org Sender: "Xen-devel" To: Stefano Stabellini , Volodymyr Babchuk Cc: xen-devel , stuart.yoder@arm.com List-Id: xen-devel@lists.xenproject.org SGksCgpJIGFtIGdvaW5nIHRvIGFuc3dlciBib3RoIGUtbWFpbHMgKFN0ZWZhbm8gYW5kIFZvbG9k eW15cikgYXQgb25jZS4KCk9uIDAxLzEyLzE3IDIyOjU4LCBTdGVmYW5vIFN0YWJlbGxpbmkgd3Jv dGU6Cj4gT24gTW9uLCAyNyBOb3YgMjAxNywgVm9sb2R5bXlyIEJhYmNodWsgd3JvdGU6Cj4+IFRo aXMgaXMgZm9sbG93LXVwIHRvIG91ciBjb252ZXJzYXRpb24gZHVyaW5nIGNvbW11bml0eSBjYWxs Lgo+PiBZb3UgYXNrZWQgbWUgdG8gc2VuZCBPUC1URUUgbWVkaWF0b3IgYXMgYSBwYXRjaCwgc28g d2UgY2FuCj4+IGRpc2N1c3MgaXQgaW4gdGhlIG1haWxpbmcgbGlzdC4gU28sIHRoZXJlIGl0IGlz LiBJIHNxdWFzaGVkCj4+IHR3byBwYXRjaGVzIGludG8gb25lIGFuZCBza2lwcGVkIHBhdGNoZXMg dGhhdCB3ZSBhbHJlYWR5Cj4+IGRpc2N1c3NlZC4KPj4KPj4gU28sIHRoaXMgaXMgYmFzaWNhbGx5 IGFsbCB3aGF0IGlzIG5lZWRlZCB0byBzdXBwb3J0IE9QLVRFRSBpbiBYRU4uCj4+IFRoZXJlIGFy ZSBzb21lIFRPRE9zIGxlZnQgYWxsIG92ZXIgdGhlIGNvZGUuIEJ1dCwgSSBkb24ndAo+PiBleHBl Y3QgdGhhdCBUT0RPcyBpbXBsZW1lbnRhdGlvbiB3b3VsZCBzaWduaWZpY2FudGx5Cj4+IGluY3Jl YXNlIGNvZGViYXNlLiBDdXJyZW50bHkgbWVkaWF0b3IgcGFyc2VzIHJlcXVlc3RzIHRvIHBlcmZv cm0KPj4gYWRkcmVzc2VzIHRyYW5zbGF0aW9uIGFuZCB0aGF0J3MgYWxsIHdoYXQgaXMgc2hvdWxk IGJlIGRvbmUKPj4gdG8gYWxsb3cgZ3Vlc3RzIHRvIHdvcmsgd2l0aCBPUC1URUUuCj4+Cj4+IFRo aXMgYmVjb21lIHBvc3NpYmxlIGJlY2F1c2UgSSBjb21wbGV0ZWx5IHJldmlzaXRlZCB2aXJ0dWFs aXphdGlvbgo+PiBzdXBwb3J0IGluIE9QLVRFRS4gSSBoYXZlIGZvdW5kIHdheSB0byBlbmZvcmNl IGNvbXBsZXRlIGlzb2xhdGlvbgo+PiBiZXR3ZWVuIGRpZmZlcmVudCBndWVzdCBzdGF0ZXMuIFRo aXMgbGlmdHMgbWFueSBxdWVzdGlvbnMgbGlrZSB1c2FnZQo+PiBxdW90YXMsIFJQQyByb3V0aW5n LCBzdWRkZW4gZ3Vlc3QgZGVhdGgsIGRhdGEgaXNvbGF0aW9uLCBldGMuCgpJIGRpc2FncmVlIGhl cmUuIFlvdSBzdGlsbCBoYXZlIHRvIGhhbmRsZSBzdWRkZW4gZ3Vlc3QgZGVhdGggaW4gWGVuIGFu ZCAKcmVsZWFzZSBhbnkgbWVtb3J5IGFsbG9jYXRlZCBpbiB0aGUgaHlwZXJ2aXNvciBmb3IgdGhh dCBndWVzdHMuCgo+Pgo+PiBJJ20gYXdhcmUgdGhhdCBJIGRpZG4ndCBhZGRyZXNzZWQgYWxsIGNv bW1lbnRzIGZyb20gcHJldmlvdXMKPj4gZGlzY3Vzc2lvbi4gU29ycnkgZm9yIHRoaXMuIEknbSBj dXJyZW50bHkgYnVzeSB3aXRoIE9QLVRFRSwKPj4gYW5kIEkgdGhpbmsgcHJvcGVyIG1lZGlhdG9y IGltcGxlbWVudGF0aW9uIHdpbGwgYmUgcG9zc2libGUKPj4gb25seSBhZnRlciBJJ2xsIHN0YWJp bGl6ZSBPUC1URUUgcGFydC4KPj4KPj4gU28gSSBkb24ndCBhc2sgYW55Ym9keSB0byBkbyB0aG9y b3VnaCByZXZpZXcuIEkganVzdCB3YW50IHRvCj4+IHNoYXJlIG15IHN0YXR1cyBhbmQgZGlzY3Vz cyB0aGlzIGNvZGUgYSB3aG9sZS4KPiAKPiBUaGFuayB5b3UgZm9yIHNoYXJpbmchIEFjdHVhbGx5 LCBJIHRoaW5rIGl0IGlzIG5vdCB0b28gYmFkIGFzIGEgc3RhcnRpbmcKPiBwb2ludC4KPiAKPiBJ J2xsIGFsc28gdHJ5IHRvIHN1bW1hcml6ZSBzb21lIGtleSBjb25jZXB0IHdlIGhhdmUgYmVlbiBk aXNjdXNzaW5nCj4gYWJvdXQgT1AtVEVFIHN1cHBvcnQgaW4gWGVuLgo+IAo+IAo+ID0gWGVuIGNh bm5vdCBwcm90ZWN0IHRoZSBzeXN0ZW0gZnJvbSBhIGJyb2tlbi9pbnNlY3VyZSBPUC1URUUgPQo+ IAo+IE9QLVRFRSBydW5zIGF0IGEgaGlnaGVyIHByaXZpbGVnZSBsZXZlbCB0aGFuIFhlbiwgdGh1 cywgd2UgY2FuJ3QgcmVhbGx5Cj4gZXhwZWN0IFhlbiB0byBwcm90ZWN0IHRoZSBzeXN0ZW0gZnJv bSBhIGJyb2tlbiBPUC1URUUuIEFsc28sIFhlbiBjYW5ub3QKPiByZWFsbHkgcHJvdGVjdCBPUC1U RUUgZnJvbSBhIG1hbGljaW91cyBjYWxsZXIuCj4gCj4gV2hhdCB3ZSBjYW4gYW5kIHNob3VsZCBk byBpcyB0byBwcm90ZWN0IFhlbiwgdGhlIE9QLVRFRSBtZWRpYXRvciBpbiBYZW4KPiBzcGVjaWZp Y2FsbHksIGZyb20gbWFsaWNpb3VzIGF0dGFja2Vycy4KPiAKPiBJbiBvdGhlciB3b3Jkcywgd2Ug YXJlIG5vdCByZXNwb25zaWJsZSBpZiBhIGNhbGwsIGZvcndhcmRlZCB0byBPUC1URUUgYnkKPiBY ZW4sIGVuZHMgdXAgY3Jhc2hpbmcgT1AtVEVFLCB0aGVyZWZvcmUgdGFraW5nIGRvd24gdGhlIHN5 c3RlbS4KPiAKPiBIb3dldmVyLCB3ZSBoYXZlIHRvIHBheSBzcGVjaWFsIGNhcmUgdG8gYXZvaWQg Y2FsbGVycyB0byBjcmFzaCBvciB0YWtlCj4gb3ZlciB0aGUgbWVkaWF0b3IgaW4gWGVuLiBXZSBh bHNvIGhhdmUgdG8gcGF5IGF0dGVudGlvbiBzbyB0aGF0IGEgY2FsbGVyCj4gd29uJ3QgYmUgYWJs ZSB0byBleGhhdXN0IFhlbiByZXNvdXJjZXMgb3IgRE9TIFhlbiAoYWxsb2NhdGUgdG9vIG11Y2gK PiBtZW1vcnksIGluZmluaXRlIGxvb3BzIGluIFhlbiwgZXRjKS4gVGhpcyBicmluZ3MgbWUgdG8g dGhlIG5leHQgdG9waWMuCj4gCj4gCj4gPSBFcnJvciBjaGVja2luZyAvIERPUyBwcm90ZWN0aW9u ID0KPiAKPiBXZSBuZWVkIHBvd2VyZnVsIGNoZWNrcyBvbiBhcmd1bWVudHMgcGFzc2VkIGJ5IHRo ZSBjYWxsZXIgYW5kIGV2YWx1YXRlZAo+IGJ5IHRoZSBtZWRpYXRvci4KPiAKPiBGb3IgZXhhbXBs ZSwgd2UgY2Fubm90IGV4cGVjdCB0aGUgZ3Vlc3QgdG8gYWN0dWFsbHkgcGFzcyBhcmd1bWVudHMg aW4KPiB0aGUgZm9ybWF0IGV4cGVjdGVkIGJ5IHRyYW5zbGF0ZV9wYXJhbXMuIGN0eC0+eGVuX2Fy ZyBjb3VsZCBiZQo+IGdpYmJlcmlzaC4KPiAKPiAgRnJvbSB0aGUgcmVzb3VyY2UgYWxsb2NhdGlv biBwb2ludCBvZiB2aWV3LCBpdCBsb29rcyBsaWtlIGV2ZXJ5Cj4gaGFuZGxlX3N0ZF9jYWxsIGFs bG9jYXRlcyBhIG5ldyBjb250ZXh0OyBldmVyeSBjb3B5X3N0ZF9yZXF1ZXN0Cj4gYWxsb2NhdGVz IGEgbmV3IFhlbiBwYWdlLiBJdCB3b3VsZCBiZSBlYXN5IHRvIGV4aGF1c3QgWGVuIHJlc291cmNl cy4KPiBNYXliZSB3ZSBuZWVkIGEgbWF4IGNvbmN1cnJlbnQgcmVxdWVzdCBsaW1pdCBvciBtYXgg cGFnZSBhbGxvY2F0aW9uIHBlcgo+IGRvbWFpbiBvciBzb21ldGhpbmcgb2YgdGhlIGtpbmQuCj4g Cj4gCj4gPSBMb2NrcyBhbmQgTGlzdHMgPQo+IAo+IFRoZSBjdXJyZW50IGxvY2sgYW5kIGxpc3Qg aXMgZ2xvYmFsLiBEbyB5b3UgdGhpbmsgaXQgc2hvdWxkIGFjdHVhbGx5IGJlCj4gZ2xvYmFsIG9y IHBlci1kb21haW4/IEkgZG8gcmVhbGl6ZSB0aGF0IG9ubHkgZG9tMCBpcyBhbGxvd2VkIHRvIG1h a2UKPiBjYWxscyBub3cgc28gdGhlIHF1ZXN0aW9uIGZvciB0aGUgbW9tZW50IGlzIG5vdCB0b28g dXNlZnVsLgoKSG1tbSwgdGhlIGNvbW1pdCBtZXNzYWdlIHNheXM6ICJXaXRoIHRoaXMgcGF0Y2gg T1AtVEVFIHN1Y2Nlc3NmdWxseSAKcGFzc2VzIG93biB0ZXN0cywgd2hpbGUgY2xpZW50IGlzIHJ1 bm5pbmcgaW4gRG9tVS4iLiBBcyBzYWlkIGFib3ZlLCB3ZSAKbmVlZCB0byBtYWtlIHN1cmUgdGhh dCBYZW4gd2lsbCByZWxlYXNlIG1lbW9yeSBhbGxvY2F0ZWQgZm9yIFNNQyAKcmVxdWVzdHMgd2hl biBhIGRvbWFpbiBkaWVzLiBTbyBoYXZlIGEgbGlzdC9sb2NrIHBlciBkb21haW4gd291bGQgbWFr ZSAKbW9yZSBzZW5zZSAoZWFzaWVyIHRvIGdvIHRocm91Z2gpLgoKPiAKPiAKPiA9IFhlbiBjb21t YW5kIGZvcndhcmRpbmcgPQo+IAo+IEluIHRoZSBjb2RlIGJlbG93LCBpdCBsb29rcyBsaWtlIFhl biBpcyBmb3J3YXJkaW5nIGV2ZXJ5dGhpbmcgdG8gT1AtVEVFLgo+IEFyZSB0aGVyZSBzb21lIGNv bW1hbmRzIFhlbiBzaG91bGQgYXZvaWQgZm9yd2FyZGluZz8gU2hvdWxkIHdlIGhhdmUgYQo+IHdo aXRlbGlzdCBvciBhIGJsYWNrbGlzdD8KPiAKPiAKPiA9IExvbmcgcnVubmluZyBPUC1URUUgY29t bWFuZHMgYW5kIGludGVycnVwdGlvbnMgPQo+IAo+IEkgaGF2ZSBiZWVuIHRvbGQgdGhhdCBzb21l IE9QLVRFRSBSUEMgY29tbWFuZHMgbWlnaHQgdGFrZSBsb25nIHRvCj4gY29tcGxldGUuIElzIHRo YXQgcmlnaHQ/IExpa2UgZm9yIGV4YW1wbGUgb25lIG9mIHRoZQo+IE9QVEVFX01TR19SUENfQ01E Xyo/Cj4gCj4gSWYgc28sIHdlIG5lZWQgdG8gdGhpbmsgd2hhdCB0byBkbyBpbiB0aG9zZSBjYXNl cy4gU3BlY2lmaWNhbGx5LCBkbyB3ZQo+IG5lZWQgYSB0ZWNobmlxdWUgdG8gcmVzdGFydCBjZXJ0 YWluIGNvbW1hbmRzIGluIFhlbiwgc28gdGhhdCB3aGVuIHRoZXkKPiBydW4gZm9yIHRvbyBsb25n IGFuZCBnZXQgaW50ZXJydXB0ZWQgYnkgc29tZXRoaW5nIChzdWNoIGFzIGFuCj4gaW50ZXJydXB0 KSB3ZSBrbm93IGhvdyB0byByZXN0YXJ0IHRoZW0/IEluIGZhY3QsIGRvIHdlIG5lZWQgdG8gc2V0 dXAgYQo+IHRpbWVyIGludGVycnVwdCB0byBtYWtlIHN1cmUgdGhlIGNvbW1hbmQgZG9lc24ndCBi bG9jayBYZW4gZm9yIHRvbyBsb25nLAo+IGNvbnN1bWluZyB0aGUgbmV4dCB2Y3B1J3Mgc2xvdCBh cyB3ZWxsPwoKSSBhbSBub3Qgc3VyZSB0byB1bmRlcnN0YW5kIHlvdXIgc3VnZ2VzdGlvbiBoZXJl LiBXaGVyZSBkbyB5b3Ugd2FudCB0aGF0IAp0aW1lcj8gSW4gWGVuPyBJZiBzbywgSSBkb24ndCB0 aGluayB0aGlzIGNvdWxkIHdvcmsuIFRoYXQncyBPUC1URUUgam9iIAp0byBicmVhayBkb3duIGxv bmcgcnVubmluZyBvcGVyYXRpb24uCgpUaGlzIGlzIHZlcnkgc2ltaWxhciB0byB3aGVuIGEgZ3Vl c3QgaXMgZG9pbmcgYW4gaHlwZXJjYWxsLiBFdmVuIGlmIApzZXR1cCBhIHRpbWVyLCB0aGUgaW50 ZXJydXB0IHdpbGwgb25seSBiZSByZWNlaXZlZCBvbmNlIHRoZSBoeXBlcmNhbGwgaXMgCmRvbmUg KG9yIFhlbiBkZWNpZGVkIHRvIHByZWVtcHQgaXQpLgoKPiAKPiAKPiA9IFBhZ2UgcGlubmluZyA9 Cj4gCj4gR3Vlc3QgcGFnZXMgcGFzc2VkIHRvIE9QLVRFRSBuZWVkIHRvIGJlIHBpbm5lZCAob3Ro ZXJ3aXNlIFhlbiBkb2Vzbid0Cj4gZ3VhcmFudGVlIHRoZXknbGwgYmUgYXZhaWxhYmxlKS4gSSB0 aGluayB0aGUgcmlnaHQgZnVuY3Rpb24gdG8gY2FsbCBmb3IKPiB0aGF0IGlzIGdldF9wYWdlX2Zy b21fZ2ZuIG9yIGdldF9wYWdlLgoKTm8gZGlyZWN0IHVzZSBvZiBnZXRfcGFnZSBwbGVhc2UuIFdl IGFscmVhZHkgaGF2ZSBwbGVudHkgb2YgaGVscGVyIHRvIApkZWFsIHdpdGggdGhlIHRyYW5zbGF0 aW9uIEdGTiAtPiBQYWdlIG9yIGV2ZW4gY29weWluZyBkYXRhLiBJIGRvbid0IHdhbnQgCnRvIHNl ZSBtb3JlIG9wZW4tY29kaW5nIHZlcnNpb24gYmVjYXVzZSBpdCBtYWtlcyBkaWZmaWN1bHQgdG8g CmludGVyYWN0aW9uIHdpdGggb3RoZXIgZmVhdHVyZXMgc3VjaCBhcyBtZW1hY2Nlc3MgYW5kIFBv RC4KCj4+IC0tLQo+Pgo+PiBBZGQgT1AtVEVFIG1lZGlhdG9yIGFzIGFuIGV4YW1wbGUgaG93IFRF RSBtZWRpYXRvciBmcmFtZXdvcmsKPj4gd29ya3MuCj4+Cj4+IE9QLVRFRSBtZWRpYXRvciBzdXBw b3J0IGFkZHJlc3MgdHJhbnNsYXRpb24gZm9yIERvbVVzLgo+PiBJdCB0cmFja3MgZXhlY3V0aW9u IG9mIFNURCBjYWxscywgY29ycmVjdGx5IGhhbmRsZXMgbWVtb3J5LXJlbGF0ZWQgUlBDCj4+IHJl cXVlc3RzLCB0cmFja3MgYnVmZmVyIGFsbG9jYXRlZCBmb3IgUlBDcy4KPj4KPj4gV2l0aCB0aGlz IHBhdGNoIE9QLVRFRSBzdWNjZXNzZnVsbHkgcGFzc2VzIG93biB0ZXN0cywgd2hpbGUgY2xpZW50 IGlzCj4+IHJ1bm5pbmcgaW4gRG9tVS4gQ3VycmVudGx5IGl0IGxhY2tzIHNvbWUgY29kZSBmb3Ig ZXhjZXB0aW9uYWwgY2FzZXMsCj4+IGJlY2F1c2UgdGhpcyBwYXRjaCB3YXMgdXNlZCBtb3N0bHkg dG8gZGVidWcgdmlydHVhbGl6YXRpb24gaW4gT1AtVEVFLgo+PiBOZXZlcnRoZWxlc3MsIGl0IHBy b3ZpZGVzIGFsbCBmZWF0dXJlcyBuZWVkZWQgZm9yIE9QLVRFRSBtZWRpYXRpb24uCj4+Cj4+IFdB Uk5JTkc6IFRoaXMgaXMgYSBkZXZlbG9wbWVudCBwYXRjaCwgaXQgZG9lcyBub3QgY292ZXIgYWxs IGNvcm5lcgo+PiBjYXNlcywgc28sIHBsZWFzZSBkb24ndCB1c2UgaXQgaW4gcHJvZHVjdGlvbi4K Pj4KPj4gSXQgd2FzIHRlc3RlZCBvbiBSQ0FSIFNhbHZhdG9yLU0zIGJvYXJkLgo+Pgo+PiBTaWdu ZWQtb2ZmLWJ5OiBWb2xvZHlteXIgQmFiY2h1ayA8dm9sb2R5bXlyX2JhYmNodWtAZXBhbS5jb20+ Cj4+IC0tLQo+PiAgIHhlbi9hcmNoL2FybS90ZWUvS2NvbmZpZyAgICAgfCAgIDQgKwo+PiAgIHhl bi9hcmNoL2FybS90ZWUvTWFrZWZpbGUgICAgfCAgIDEgKwo+PiAgIHhlbi9hcmNoL2FybS90ZWUv b3B0ZWUuYyAgICAgfCA3NjUgKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysr KysrKwo+PiAgIHhlbi9hcmNoL2FybS90ZWUvb3B0ZWVfc21jLmggfCAgNTAgKysrCj4+ICAgNCBm aWxlcyBjaGFuZ2VkLCA4MjAgaW5zZXJ0aW9ucygrKQo+PiAgIGNyZWF0ZSBtb2RlIDEwMDY0NCB4 ZW4vYXJjaC9hcm0vdGVlL29wdGVlLmMKPj4KPj4gZGlmZiAtLWdpdCBhL3hlbi9hcmNoL2FybS90 ZWUvS2NvbmZpZyBiL3hlbi9hcmNoL2FybS90ZWUvS2NvbmZpZwo+PiBpbmRleCBlNjlkZTI5Li43 YzZiNWM2IDEwMDY0NAo+PiAtLS0gYS94ZW4vYXJjaC9hcm0vdGVlL0tjb25maWcKPj4gKysrIGIv eGVuL2FyY2gvYXJtL3RlZS9LY29uZmlnCj4+IEBAIC0wLDAgKzEsNCBAQAo+PiArY29uZmlnIEFS TV9PUFRFRQo+PiArCWJvb2wgIkVuYWJsZSBPUC1URUUgbWVkaWF0b3IiCj4+ICsJZGVmYXVsdCBu Cj4+ICsJZGVwZW5kcyBvbiBBUk1fVEVFCj4+IGRpZmYgLS1naXQgYS94ZW4vYXJjaC9hcm0vdGVl L01ha2VmaWxlIGIveGVuL2FyY2gvYXJtL3RlZS9NYWtlZmlsZQo+PiBpbmRleCBjNTRkNDc5Li45 ZDkzYjQyIDEwMDY0NAo+PiAtLS0gYS94ZW4vYXJjaC9hcm0vdGVlL01ha2VmaWxlCj4+ICsrKyBi L3hlbi9hcmNoL2FybS90ZWUvTWFrZWZpbGUKPj4gQEAgLTEgKzEsMiBAQAo+PiAgIG9iai15ICs9 IHRlZS5vCj4+ICtvYmotJChDT05GSUdfQVJNX09QVEVFKSArPSBvcHRlZS5vCj4+IGRpZmYgLS1n aXQgYS94ZW4vYXJjaC9hcm0vdGVlL29wdGVlLmMgYi94ZW4vYXJjaC9hcm0vdGVlL29wdGVlLmMK Pj4gbmV3IGZpbGUgbW9kZSAxMDA2NDQKPj4gaW5kZXggMDAwMDAwMC4uNTljMzYwMAo+PiAtLS0g L2Rldi9udWxsCj4+ICsrKyBiL3hlbi9hcmNoL2FybS90ZWUvb3B0ZWUuYwo+PiBAQCAtMCwwICsx LDc2NSBAQAo+PiArLyoKPj4gKyAqIHhlbi9hcmNoL2FybS90ZWUvb3B0ZWUuYwo+PiArICoKPj4g KyAqIE9QLVRFRSBtZWRpYXRvcgo+PiArICoKPj4gKyAqIFZvbG9keW15ciBCYWJjaHVrIDx2b2xv ZHlteXJfYmFiY2h1a0BlcGFtLmNvbT4KPj4gKyAqIENvcHlyaWdodCAoYykgMjAxNyBFUEFNIFN5 c3RlbXMuCj4+ICsgKgo+PiArICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBj YW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKPj4gKyAqIGl0IHVuZGVyIHRoZSB0ZXJt cyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCj4+ICsgKiBw dWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KPj4gKyAqCj4+ICsgKiBU aGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVz ZWZ1bCwKPj4gKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBp bXBsaWVkIHdhcnJhbnR5IG9mCj4+ICsgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1Ig QSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCj4+ICsgKiBHTlUgR2VuZXJhbCBQdWJsaWMg TGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgo+PiArICovCj4+ICsKPj4gKyNpbmNsdWRlIDx4ZW4v ZG9tYWluX3BhZ2UuaD4KPj4gKyNpbmNsdWRlIDx4ZW4vdHlwZXMuaD4KPj4gKyNpbmNsdWRlIDx4 ZW4vc2NoZWQuaD4KPj4gKwo+PiArI2luY2x1ZGUgPGFzbS9wMm0uaD4KPj4gKyNpbmNsdWRlIDxh c20vdGVlLmg+Cj4+ICsKPj4gKyNpbmNsdWRlICJvcHRlZV9tc2cuaCIKPj4gKyNpbmNsdWRlICJv cHRlZV9zbWMuaCIKPj4gKwo+PiArLyoKPj4gKyAqIEdsb2JhbCBUT0RPOgo+PiArICogIDEuIENy ZWF0ZSBwZXItZG9tYWluIGNvbnRleHQsIHdoZXJlIGNhbGwgYW5kIHNobSB3aWxsIGJlIHN0b3Jl ZAo+PiArICogIDIuIFBpbiBwYWdlcyBzaGFyZWQgYmV0d2VlbiBPUC1URUUgYW5kIGd1ZXN0Cj4+ ICsgKi8KPj4gKy8qCj4+ICsgKiBPUC1URUUgdmlvbGF0ZXMgU01DQ0Mgd2hlbiBpdCBkZWZpbmVz IG93biBVSUQuIFNvIHdlIG5lZWQKPj4gKyAqIHRvIHBsYWNlIGJ5dGVzIGluIGNvcnJlY3Qgb3Jk ZXIuCj4+ICsgKi8KPj4gKyNkZWZpbmUgT1BURUVfVUlEICAoeGVuX3V1aWRfdCl7eyAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAo+PiArICAgICh1aW50OF90 KShPUFRFRV9NU0dfVUlEXzAgPj4gIDApLCAodWludDhfdCkoT1BURUVfTVNHX1VJRF8wID4+ICA4 KSwgICAgICAgICBcCj4+ICsgICAgKHVpbnQ4X3QpKE9QVEVFX01TR19VSURfMCA+PiAxNiksICh1 aW50OF90KShPUFRFRV9NU0dfVUlEXzAgPj4gMjQpLCAgICAgICAgIFwKPj4gKyAgICAodWludDhf dCkoT1BURUVfTVNHX1VJRF8xID4+ICAwKSwgKHVpbnQ4X3QpKE9QVEVFX01TR19VSURfMSA+PiAg OCksICAgICAgICAgXAo+PiArICAgICh1aW50OF90KShPUFRFRV9NU0dfVUlEXzEgPj4gMTYpLCAo dWludDhfdCkoT1BURUVfTVNHX1VJRF8xID4+IDI0KSwgICAgICAgICBcCj4+ICsgICAgKHVpbnQ4 X3QpKE9QVEVFX01TR19VSURfMiA+PiAgMCksICh1aW50OF90KShPUFRFRV9NU0dfVUlEXzIgPj4g IDgpLCAgICAgICAgIFwKPj4gKyAgICAodWludDhfdCkoT1BURUVfTVNHX1VJRF8yID4+IDE2KSwg KHVpbnQ4X3QpKE9QVEVFX01TR19VSURfMiA+PiAyNCksICAgICAgICAgXAo+PiArICAgICh1aW50 OF90KShPUFRFRV9NU0dfVUlEXzMgPj4gIDApLCAodWludDhfdCkoT1BURUVfTVNHX1VJRF8zID4+ ICA4KSwgICAgICAgICBcCj4+ICsgICAgKHVpbnQ4X3QpKE9QVEVFX01TR19VSURfMyA+PiAxNiks ICh1aW50OF90KShPUFRFRV9NU0dfVUlEXzMgPj4gMjQpLCAgICAgICAgIFwKPj4gKyAgICB9fQo+ PiArCj4+ICsjZGVmaW5lIE1BWF9OT05DT05USUdfRU5UUklFUyAgIDgKPj4gKwo+PiArLyoKPj4g KyAqIENhbGwgY29udGV4dC4gT1AtVEVFIGNhbiBpc3N1ZSBtdWxpdHBsZSBSUEMgcmV0dXJucyBk dXJpbmcgb25lIGNhbGwuCj4+ICsgKiBXZSBuZWVkIHRvIHByZXNlcnZlIGNvbnRleHQgZHVyaW5n IHRoZW0uCj4+ICsgKi8KPj4gK3N0cnVjdCBzdGRfY2FsbF9jdHggewo+PiArICAgIHN0cnVjdCBs aXN0X2hlYWQgbGlzdDsKPj4gKyAgICBzdHJ1Y3Qgb3B0ZWVfbXNnX2FyZyAqZ3Vlc3RfYXJnOwo+ PiArICAgIHN0cnVjdCBvcHRlZV9tc2dfYXJnICp4ZW5fYXJnOwo+PiArICAgIHZvaWQgKm5vbl9j b250aWdbTUFYX05PTkNPTlRJR19FTlRSSUVTXTsKPj4gKyAgICBpbnQgbm9uX2NvbnRpZ19vcmRl cltNQVhfTk9OQ09OVElHX0VOVFJJRVNdOwo+PiArICAgIGludCBvcHRlZV90aHJlYWRfaWQ7Cj4+ ICsgICAgaW50IHJwY19vcDsKPj4gKyAgICBkb21pZF90IGRvbWlkOwo+PiArfTsKPj4gK3N0YXRp YyBMSVNUX0hFQUQoY2FsbF9jdHhfbGlzdCk7Cj4+ICtzdGF0aWMgREVGSU5FX1NQSU5MT0NLKGNh bGxfY3R4X2xpc3RfbG9jayk7Cj4+ICsKPj4gKy8qCj4+ICsgKiBDb21tYW5kIGJ1ZmZlciBzaGFy ZWQgYmV0d2VlbiBPUC1URUUgYW5kIGd1ZXN0Lgo+PiArICogV2FybmluZyEgSW4gdGhlIHByb3Bl ciBpbXBsZW1lbnRhdGlvbiB0aGlzIFNITSBidWZmZXIgKnByb2JhYmx5KiBzaG91bGQKPj4gKyAq IGJ5IHNoYWRvd2VkIGJ5IFhFTi4KPj4gKyAqIFRPRE86IFJlY29uc2lkZXIgdGhpcy4KPj4gKyAq Lwo+PiArc3RydWN0IHNobSB7Cj4+ICsgICAgc3RydWN0IGxpc3RfaGVhZCBsaXN0Owo+PiArICAg IHN0cnVjdCBvcHRlZV9tc2dfYXJnICpndWVzdF9hcmc7Cj4+ICsgICAgc3RydWN0IHBhZ2UgKmd1 ZXN0X3BhZ2U7Cj4+ICsgICAgbWZuX3QgZ3Vlc3RfbWZuOwo+PiArICAgIHVpbnQ2NF90IGNvb2tp ZTsKPj4gKyAgICBkb21pZF90IGRvbWlkOwo+PiArfTsKPj4gKwo+PiArc3RhdGljIExJU1RfSEVB RChzaG1fbGlzdCk7Cj4+ICtzdGF0aWMgREVGSU5FX1NQSU5MT0NLKHNobV9saXN0X2xvY2spOwo+ PiArCj4+ICtzdGF0aWMgaW50IG9wdGVlX2luaXQodm9pZCkKPj4gK3sKPj4gKyAgICBwcmludGso Ik9QLVRFRSBtZWRpYXRvciBpbml0IGRvbmVcbiIpOwo+PiArICAgIHJldHVybiAwOwo+PiArfQo+ PiArCj4+ICtzdGF0aWMgdm9pZCBvcHRlZV9kb21haW5fY3JlYXRlKHN0cnVjdCBkb21haW4gKmQp Cj4+ICt7Cj4+ICsgICAgcmVnaXN0ZXJfdCByZXNwWzRdOwo+PiArICAgIGNhbGxfc21jY2Nfc21j KE9QVEVFX1NNQ19WTV9DUkVBVEVELAo+PiArICAgICAgICAgICAgICAgICAgIGQtPmRvbWFpbl9p ZCArIDEsIDAsIDAsIDAsIDAsIDAsIDAsIHJlc3ApOwo+PiArICAgIGlmICggcmVzcFswXSAhPSBP UFRFRV9TTUNfUkVUVVJOX09LICkKPj4gKyAgICAgICAgZ3ByaW50ayhYRU5MT0dfV0FSTklORywg Ik9QLVRFRSBkb24ndCB3YW50IHRvIHN1cHBvcnQgZG9tYWluOiAlZFxuIiwKPj4gKyAgICAgICAg ICAgICAgICAodWludDMyX3QpcmVzcFswXSk7Cj4+ICsgICAgLyogVE9ETzogQ2hhbmdlIGZ1bmN0 aW9uIGRlY2xhcmF0aW9uIHRvIGJlIGFibGUgdG8gcmV0dW4gZXJyb3IgKi8KPj4gK30KPj4gKwo+ PiArc3RhdGljIHZvaWQgb3B0ZWVfZG9tYWluX2Rlc3Ryb3koc3RydWN0IGRvbWFpbiAqZCkKPj4g K3sKPj4gKyAgICByZWdpc3Rlcl90IHJlc3BbNF07Cj4+ICsgICAgY2FsbF9zbWNjY19zbWMoT1BU RUVfU01DX1ZNX0RFU1RST1lFRCwKPj4gKyAgICAgICAgICAgICAgICAgICBkLT5kb21haW5faWQg KyAxLCAwLCAwLCAwLCAwLCAwLCAwLCByZXNwKTsKPj4gKyAgICAvKiBUT0RPOiBDbGVhbiBjYWxs IGNvbnRleHRzIGFuZCBTSE1zIGFzc29jaWF0ZWQgd2l0aCBkb21haW4gKi8KPj4gK30KPj4gKwo+ PiArc3RhdGljIGJvb2wgZm9yd2FyZF9jYWxsKHN0cnVjdCBjcHVfdXNlcl9yZWdzICpyZWdzKQo+ PiArewo+PiArICAgIHJlZ2lzdGVyX3QgcmVzcFs0XTsKPj4gKwo+PiArICAgIC8qIFRPRE86IFVz ZSBzZXBhcmF0ZSByZWdpc3RlcnMgc2V0IHRvIHByZXZlbnQgbGVha2FnZSB0byBndWVzdCAqLwo+ PiArICAgIGNhbGxfc21jY2Nfc21jKGdldF91c2VyX3JlZyhyZWdzLCAwKSwKPj4gKyAgICAgICAg ICAgICAgICAgICBnZXRfdXNlcl9yZWcocmVncywgMSksCj4+ICsgICAgICAgICAgICAgICAgICAg Z2V0X3VzZXJfcmVnKHJlZ3MsIDIpLAo+PiArICAgICAgICAgICAgICAgICAgIGdldF91c2VyX3Jl ZyhyZWdzLCAzKSwKPj4gKyAgICAgICAgICAgICAgICAgICBnZXRfdXNlcl9yZWcocmVncywgNCks Cj4+ICsgICAgICAgICAgICAgICAgICAgZ2V0X3VzZXJfcmVnKHJlZ3MsIDUpLAo+PiArICAgICAg ICAgICAgICAgICAgIGdldF91c2VyX3JlZyhyZWdzLCA2KSwKPj4gKyAgICAgICAgICAgICAgICAg ICAvKiBWTSBpZCAwIGlzIHJlc2VydmVkIGZvciBoeXBlcnZpc29yIGl0c2VsZiAqLwo+PiArICAg ICAgICAgICAgICAgICAgIGN1cnJlbnQtPmRvbWFpbi0+ZG9tYWluX2lkICsgMSwKPiAKPiBUaGlz IGRvZXNuJ3QgbG9vayBsaWtlIGl0IHdvdWxkIHdyYXAgYXJvdW5kIHNhZmVseS4KCldlbGwgb3Jk aW5hcnkgZG9tYWluIHdpbGwgYWx3YXlzIGhhdmUgYSBkb21haW4gSUQgPCBET01JRF9GSVJTVF9S RVNFUlZFUiAKKDB4N0ZGMCkuIFNvIHRoZXJlIGFyZSBubyBpc3N1ZSBoZXJlLiBBbHRob3VnaCwg d2UgbWF5IHdhbnQgYSAKQlVJTERfQlVHX09OKCkgdG8gY2F0Y2ggY2hhbmdlIG9mIERPTUlEX0ZJ UlNUX1JFU0VSVkVELgoKPiAKPiAKPj4gKyAgICAgICAgICAgICAgICAgICByZXNwKTsKPj4gKwo+ PiArICAgIHNldF91c2VyX3JlZyhyZWdzLCAwLCByZXNwWzBdKTsKPj4gKyAgICBzZXRfdXNlcl9y ZWcocmVncywgMSwgcmVzcFsxXSk7Cj4+ICsgICAgc2V0X3VzZXJfcmVnKHJlZ3MsIDIsIHJlc3Bb Ml0pOwo+PiArICAgIHNldF91c2VyX3JlZyhyZWdzLCAzLCByZXNwWzNdKTsKPj4gKwo+PiArICAg IHJldHVybiB0cnVlOwo+PiArfQo+PiArCj4+ICtzdGF0aWMgc3RydWN0IHN0ZF9jYWxsX2N0eCAq YWxsb2NhdGVfc3RkX2NhbGxfY3R4KHZvaWQpCj4+ICt7Cj4+ICsgICAgc3RydWN0IHN0ZF9jYWxs X2N0eCAqcmV0Owo+PiArCj4+ICsgICAgcmV0ID0geHphbGxvYyhzdHJ1Y3Qgc3RkX2NhbGxfY3R4 KTsKPj4gKyAgICBpZiAoICFyZXQgKQo+PiArICAgICAgICByZXR1cm4gTlVMTDsKPj4gKwo+PiAr ICAgIHJldC0+b3B0ZWVfdGhyZWFkX2lkID0gLTE7CgpZb3Ugc2V0IGl0IHRvIC0xLiBCdXQgbm8t b25lIGlzIGNoZWNraW5nIHRoYXQgdmFsdWUuIFNvIHdoYXQgaXMgdGhlIApwdXJwb3NlIG9mIHNl dHRpbmcgdG8gLTEgYW5kIG5vdCAwPwoKPj4gKyAgICByZXQtPmRvbWlkID0gLTE7CgpQbGVhc2Ug dXNlIERPTUlEX0lOVkFMSUQgcmF0aGVyIHRoYW4gLTEuIFlvdSBkb24ndCBrbm93IHdoZXRoZXIg dGhlIApsYXR0ZXIgd2lsbCBiZSB1c2VkIGluIHRoZSBmdXR1cmUgZm9yIGEgZG9tYWluLgoKPj4g Kwo+PiArICAgIHNwaW5fbG9jaygmY2FsbF9jdHhfbGlzdF9sb2NrKTsKPj4gKyAgICBsaXN0X2Fk ZF90YWlsKCZyZXQtPmxpc3QsICZjYWxsX2N0eF9saXN0KTsKPj4gKyAgICBzcGluX3VubG9jaygm Y2FsbF9jdHhfbGlzdF9sb2NrKTsKPj4gKwo+PiArICAgIHJldHVybiByZXQ7Cj4+ICt9Cj4+ICsK Pj4gK3N0YXRpYyB2b2lkIGZyZWVfc3RkX2NhbGxfY3R4KHN0cnVjdCBzdGRfY2FsbF9jdHggKmN0 eCkKPj4gK3sKPj4gKyAgICBzcGluX2xvY2soJmNhbGxfY3R4X2xpc3RfbG9jayk7Cj4+ICsgICAg bGlzdF9kZWwoJmN0eC0+bGlzdCk7Cj4+ICsgICAgc3Bpbl91bmxvY2soJmNhbGxfY3R4X2xpc3Rf bG9jayk7Cj4+ICsKPj4gKyAgICBpZiAoY3R4LT54ZW5fYXJnKQo+PiArICAgICAgICBmcmVlX3hl bmhlYXBfcGFnZShjdHgtPnhlbl9hcmcpOwo+PiArCj4+ICsgICAgaWYgKGN0eC0+Z3Vlc3RfYXJn KQo+PiArICAgICAgICB1bm1hcF9kb21haW5fcGFnZShjdHgtPmd1ZXN0X2FyZyk7Cj4+ICsKPj4g KyAgICBmb3IgKGludCBpID0gMDsgaSA8IE1BWF9OT05DT05USUdfRU5UUklFUzsgaSsrKSB7Cj4+ ICsgICAgICAgIGlmIChjdHgtPm5vbl9jb250aWdbaV0pCj4+ICsgICAgICAgICAgICBmcmVlX3hl bmhlYXBfcGFnZXMoY3R4LT5ub25fY29udGlnW2ldLCBjdHgtPm5vbl9jb250aWdfb3JkZXJbaV0p Owo+PiArICAgIH0KPj4gKwo+PiArICAgIHhmcmVlKGN0eCk7Cj4+ICt9Cj4+ICsKPj4gK3N0YXRp YyBzdHJ1Y3Qgc3RkX2NhbGxfY3R4ICpmaW5kX2N0eChpbnQgdGhyZWFkX2lkLCBkb21pZF90IGRv bWlkKQo+PiArewo+PiArICAgIHN0cnVjdCBzdGRfY2FsbF9jdHggKmN0eDsKPj4gKwo+PiArICAg IHNwaW5fbG9jaygmY2FsbF9jdHhfbGlzdF9sb2NrKTsKPj4gKyAgICBsaXN0X2Zvcl9lYWNoX2Vu dHJ5KCBjdHgsICZjYWxsX2N0eF9saXN0LCBsaXN0ICkKPj4gKyAgICB7Cj4+ICsgICAgICAgIGlm ICAoY3R4LT5kb21pZCA9PSBkb21pZCAmJiBjdHgtPm9wdGVlX3RocmVhZF9pZCA9PSB0aHJlYWRf aWQgKQo+PiArICAgICAgICB7Cj4+ICsgICAgICAgICAgICAgICAgc3Bpbl91bmxvY2soJmNhbGxf Y3R4X2xpc3RfbG9jayk7Cj4+ICsgICAgICAgICAgICAgICAgcmV0dXJuIGN0eDsKPj4gKyAgICAg ICAgfQo+PiArICAgIH0KPj4gKyAgICBzcGluX3VubG9jaygmY2FsbF9jdHhfbGlzdF9sb2NrKTsK Pj4gKwo+PiArICAgIHJldHVybiBOVUxMOwo+PiArfQo+PiArCj4+ICsjZGVmaW5lIFBBR0VMSVNU X0VOVFJJRVNfUEVSX1BBR0UgICAgICAgICAgICAgICAgICAgICAgIFwKPj4gKyAgICAoKE9QVEVF X01TR19OT05DT05USUdfUEFHRV9TSVpFIC8gc2l6ZW9mKHU2NCkpIC0gMSkKPj4gKwo+PiArc3Rh dGljIHNpemVfdCBnZXRfcGFnZXNfbGlzdF9zaXplKHNpemVfdCBudW1fZW50cmllcykKPj4gK3sK Pj4gKyAgICBpbnQgcGFnZXMgPSBESVZfUk9VTkRfVVAobnVtX2VudHJpZXMsIFBBR0VMSVNUX0VO VFJJRVNfUEVSX1BBR0UpOwo+PiArCj4+ICsgICAgcmV0dXJuIHBhZ2VzICogT1BURUVfTVNHX05P TkNPTlRJR19QQUdFX1NJWkU7Cj4+ICt9Cj4+ICsKPj4gK3N0YXRpYyBtZm5fdCBsb29rdXBfZ3Vl c3RfcmFtX2FkZHIocGFkZHJfdCBnYWRkcikKPj4gK3sKPj4gKyAgICBtZm5fdCBtZm47Cj4+ICsg ICAgZ2ZuX3QgZ2ZuOwo+PiArICAgIHAybV90eXBlX3QgdDsKPj4gKyAgICBnZm4gPSBnYWRkcl90 b19nZm4oZ2FkZHIpOwo+PiArICAgIG1mbiA9IHAybV9sb29rdXAoY3VycmVudC0+ZG9tYWluLCBn Zm4sICZ0KTsKPj4gKyAgICBpZiAoIHQgIT0gcDJtX3JhbV9ydyB8fCBtZm5fZXEobWZuLCBJTlZB TElEX01GTikgKSB7Cj4+ICsgICAgICAgIGdwcmludGsoWEVOTE9HX0lORk8sICJEb21haW4gdHJp ZXMgdG8gdXNlIGludmFsaWQgZ2ZuXG4iKTsKPj4gKyAgICAgICAgcmV0dXJuIElOVkFMSURfTUZO Owo+PiArICAgIH0KPj4gKyAgICByZXR1cm4gbWZuOwo+PiArfSA+PiArCj4+ICtzdGF0aWMgc3Ry dWN0IHNobSAqYWxsb2NhdGVfYW5kX21hcF9zaG0ocGFkZHJfdCBnYWRkciwgdWludDY0X3QgY29v a2llKQo+PiArewo+PiArICAgIHN0cnVjdCBzaG0gKnJldDsKPj4gKwo+PiArICAgIHJldCA9IHh6 YWxsb2Moc3RydWN0IHNobSk7Cj4+ICsgICAgaWYgKCAhcmV0ICkKPj4gKyAgICAgICAgcmV0dXJu IE5VTEw7Cj4+ICsKPj4gKyAgICByZXQtPmd1ZXN0X21mbiA9IGxvb2t1cF9ndWVzdF9yYW1fYWRk cihnYWRkcik7Cj4+ICsKPj4gKyAgICBpZiAoIG1mbl9lcShyZXQtPmd1ZXN0X21mbiwgSU5WQUxJ RF9NRk4pICkKPj4gKyAgICB7Cj4+ICsgICAgICAgIHhmcmVlKHJldCk7Cj4+ICsgICAgICAgIHJl dHVybiBOVUxMOwo+PiArICAgIH0KPj4gKwo+PiArICAgIHJldC0+Z3Vlc3RfYXJnID0gbWFwX2Rv bWFpbl9wYWdlKHJldC0+Z3Vlc3RfbWZuKTsKCm1hcF9kb21haW5fcGFnZSgpIGNhbiBuZXZlciBm YWlsLCBidXQgeW91IHVzZSBpdCB0aGUgd3Jvbmcgd2F5LiBUaGUgCnB1cnBvc2Ugb2YgdGhpcyBm dW5jdGlvbiBpcyB0byBtYXAgdGhlIG1lbW9yeSBmb3IgYSB2ZXJ5IHNob3J0IGxpZmV0aW1lLCAK YW5kIG9ubHkgYSB0aGUgY3VycmVudCBwQ1BVICh3aGVuIHRoZSBhbGwgdGhlIFJBTSBpcyBub3Qg YWx3YXlzIG1hcHBlZCkuIApIZXJlLCB5b3Ugc2VlbSB0byB1c2UgYWNyb3NzIFNNQyBjYWxsIChl LmcgZm9yIFJQQykuCgpMb29raW5nIGF0IHRoZSB1c2FnZSBpbiB0aGUgY29kZSwgeW91IG9ubHkg bWFwIGl0IGluIG9yZGVyIHRvIGNvcHkgdGhlIAphcmd1bWVudHMgdG8vZnJvbSB0aGUgZ3Vlc3Qu CgptYXBfZG9tYWluX3BhZ2UoKSB3aWxsIG5vdCB0YWtlIGEgcmVmZXJlbmNlIG9uIHRoZSBwYWdl IGFuZCBwcmV2ZW50IHRoZSAKcGFnZSB0byBkaXNhcHBlYXIgZnJvbSB0aGUgZ3Vlc3QuIFNvIHRo aXMgYml0cyBpcyB1bnNhZmUuCgpGb3IgdGhlIGFyZ3VtZW50cywgdGhlIGJlc3QgaXMgdG8gdXNl IGd1ZXN0IGNvcHkgaGVscGVycyAoc2VlIAphY2Nlc3NfZ3Vlc3RfbWVtb3J5X2J5X2lwYSkuIFlv dSBtaWdodCB3YW50IHRvIGxvb2sgYXQgWzFdIGFzIGl0IAppbXByb3ZlcyB0aGUgdXNlIG9mIGFj Y2Vzc19ndWVzdF9tZW1vcnlfYnlfaXBhLgoKPj4gKyAgICBpZiAoICFyZXQtPmd1ZXN0X2FyZyAp Cj4+ICsgICAgewo+PiArICAgICAgICBncHJpbnRrKFhFTkxPR19JTkZPLCAiQ291bGQgbm90IG1h cCBkb21haW4gcGFnZVxuIik7Cj4+ICsgICAgICAgIHhmcmVlKHJldCk7Cj4+ICsgICAgICAgIHJl dHVybiBOVUxMOwo+PiArICAgIH0KPj4gKyAgICByZXQtPmNvb2tpZSA9IGNvb2tpZTsKPj4gKyAg ICByZXQtPmRvbWlkID0gY3VycmVudC0+ZG9tYWluLT5kb21haW5faWQ7Cj4+ICsKPj4gKyAgICBz cGluX2xvY2soJnNobV9saXN0X2xvY2spOwo+PiArICAgIGxpc3RfYWRkX3RhaWwoJnJldC0+bGlz dCwgJnNobV9saXN0KTsKPj4gKyAgICBzcGluX3VubG9jaygmc2htX2xpc3RfbG9jayk7Cj4+ICsg ICAgcmV0dXJuIHJldDsKPj4gK30KPj4gKwo+PiArc3RhdGljIHZvaWQgZnJlZV9zaG0odWludDY0 X3QgY29va2llLCBkb21pZF90IGRvbWlkKQo+PiArewo+PiArICAgIHN0cnVjdCBzaG0gKnNobSwg KmZvdW5kID0gTlVMTDsKPj4gKyAgICBzcGluX2xvY2soJnNobV9saXN0X2xvY2spOwo+PiArCj4+ ICsgICAgbGlzdF9mb3JfZWFjaF9lbnRyeSggc2htLCAmc2htX2xpc3QsIGxpc3QgKQo+PiArICAg IHsKPj4gKyAgICAgICAgaWYgIChzaG0tPmRvbWlkID09IGRvbWlkICYmIHNobS0+Y29va2llID09 IGNvb2tpZSApCj4+ICsgICAgICAgIHsKPj4gKyAgICAgICAgICAgIGZvdW5kID0gc2htOwo+PiAr ICAgICAgICAgICAgbGlzdF9kZWwoJmZvdW5kLT5saXN0KTsKPj4gKyAgICAgICAgICAgIGJyZWFr Owo+PiArICAgICAgICB9Cj4+ICsgICAgfQo+PiArICAgIHNwaW5fdW5sb2NrKCZzaG1fbGlzdF9s b2NrKTsKPj4gKwo+PiArICAgIGlmICggIWZvdW5kICkgewo+PiArICAgICAgICByZXR1cm47Cj4+ ICsgICAgfQo+PiArCj4+ICsgICAgaWYgKCBmb3VuZC0+Z3Vlc3RfYXJnICkKPj4gKyAgICAgICAg dW5tYXBfZG9tYWluX3BhZ2UoZm91bmQtPmd1ZXN0X2FyZyk7Cj4+ICsKPj4gKyAgICB4ZnJlZShm b3VuZCk7Cj4+ICt9Cj4+ICsKPj4gK3N0YXRpYyBzdHJ1Y3Qgc2htICpmaW5kX3NobSh1aW50NjRf dCBjb29raWUsIGRvbWlkX3QgZG9taWQpCj4+ICt7Cj4+ICsgICAgc3RydWN0IHNobSAqc2htOwo+ PiArCj4+ICsgICAgc3Bpbl9sb2NrKCZzaG1fbGlzdF9sb2NrKTsKPj4gKyAgICBsaXN0X2Zvcl9l YWNoX2VudHJ5KCBzaG0sICZzaG1fbGlzdCwgbGlzdCApCj4+ICsgICAgewo+PiArICAgICAgICBp ZiAoIHNobS0+ZG9taWQgPT0gZG9taWQgJiYgc2htLT5jb29raWUgPT0gY29va2llICkKPj4gKyAg ICAgICAgewo+PiArICAgICAgICAgICAgICAgIHNwaW5fdW5sb2NrKCZzaG1fbGlzdF9sb2NrKTsK Pj4gKyAgICAgICAgICAgICAgICByZXR1cm4gc2htOwo+PiArICAgICAgICB9Cj4+ICsgICAgfQo+ PiArICAgIHNwaW5fdW5sb2NrKCZzaG1fbGlzdF9sb2NrKTsKPj4gKwo+PiArICAgIHJldHVybiBO VUxMOwo+PiArfQo+PiArCj4+ICtzdGF0aWMgYm9vbCB0cmFuc2xhdGVfbm9uY29udGlnKHN0cnVj dCBzdGRfY2FsbF9jdHggKmN0eCwKPj4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg c3RydWN0IG9wdGVlX21zZ19wYXJhbSAqcGFyYW0sCj4+ICsgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgIGludCBpZHgpCj4+ICt7Cj4+ICsgICAgLyoKPj4gKyAgICAgKiBSZWZlciB0byBP UFRFRV9NU0dfQVRUUl9OT05DT05USUcgZGVzY3JpcHRpb24gaW4gb3B0ZWVfbXNnLmggZm9yIGRl dGFpbHMuCj4+ICsgICAgICoKPj4gKyAgICAgKiBXQVJOSU5HOiBUaGlzIGlzIHRlc3QgY29kZS4g SXQgd29ya3Mgb25seSB3aXRoIHhlbiBwYWdlIHNpemUgPT0gNDA5NgoKVGhhdCdzIGEgY2FsbCBm b3IgYSBCVUlMRF9CVUdfT04oKS4KCj4+ICsgICAgICovCj4+ICsgICAgdWludDY0X3Qgc2l6ZTsK Pj4gKyAgICBpbnQgcGFnZV9vZmZzZXQ7Cj4+ICsgICAgaW50IG51bV9wYWdlczsKPj4gKyAgICBp bnQgb3JkZXI7Cj4+ICsgICAgaW50IGVudHJpZXNfb25fcGFnZSA9IDA7Cj4+ICsgICAgcGFkZHJf dCBnYWRkcjsKPj4gKyAgICBtZm5fdCBndWVzdF9tZm47Cj4+ICsgICAgc3RydWN0IHsKPj4gKyAg ICAgICAgdWludDY0X3QgcGFnZXNfbGlzdFtQQUdFTElTVF9FTlRSSUVTX1BFUl9QQUdFXTsKPj4g KyAgICAgICAgdWludDY0X3QgbmV4dF9wYWdlX2RhdGE7Cj4+ICsgICAgfSAqcGFnZXNfZGF0YV9n dWVzdCwgKnBhZ2VzX2RhdGFfeGVuLCAqcGFnZXNfZGF0YV94ZW5fc3RhcnQ7Cj4+ICsKPj4gKyAg ICBwYWdlX29mZnNldCA9IHBhcmFtLT51LnRtZW0uYnVmX3B0ciAmIChPUFRFRV9NU0dfTk9OQ09O VElHX1BBR0VfU0laRSAtIDEpOwo+PiArCj4+ICsgICAgc2l6ZSA9IFJPVU5EVVAocGFyYW0tPnUu dG1lbS5zaXplICsgcGFnZV9vZmZzZXQsCj4+ICsgICAgICAgICAgICAgICAgICAgT1BURUVfTVNH X05PTkNPTlRJR19QQUdFX1NJWkUpOwo+PiArCj4+ICsgICAgbnVtX3BhZ2VzID0gRElWX1JPVU5E X1VQKHNpemUsIE9QVEVFX01TR19OT05DT05USUdfUEFHRV9TSVpFKTsKCldoYXQgaXMgdGhlIGxp bWl0IGZvciBudW1fcGFnZXM/IEkgY2FuJ3Qgc2VlIGFueXRoaW5nIGluIHRoZSBjb2RlIHRoYXQg CnByZXZlbnQgYW55IGhpZ2ggbnVtYmVyIGFuZCBtaWdodCBleGhhdXN0IFhlbiBtZW1vcnkuCgo+ PiArCj4+ICsgICAgb3JkZXIgPSBnZXRfb3JkZXJfZnJvbV9ieXRlcyhnZXRfcGFnZXNfbGlzdF9z aXplKG51bV9wYWdlcykpOwo+PiArCj4+ICsgICAgcGFnZXNfZGF0YV94ZW5fc3RhcnQgPSBhbGxv Y194ZW5oZWFwX3BhZ2VzKG9yZGVyLCAwKTsKPj4gKyAgICBpZiAoIXBhZ2VzX2RhdGFfeGVuX3N0 YXJ0KQo+PiArICAgICAgICByZXR1cm4gZmFsc2U7Cj4+ICsKPj4gKyAgICBnYWRkciA9IHBhcmFt LT51LnRtZW0uYnVmX3B0ciAmIH4oT1BURUVfTVNHX05PTkNPTlRJR19QQUdFX1NJWkUgLSAxKTsK Pj4gKyAgICBndWVzdF9tZm4gPSBsb29rdXBfZ3Vlc3RfcmFtX2FkZHIoZ2FkZHIpOwo+PiArICAg IGlmICggbWZuX2VxKGd1ZXN0X21mbiwgSU5WQUxJRF9NRk4pICkKPj4gKyAgICAgICAgZ290byBl cnJfZnJlZTsKPj4gKwo+PiArICAgIHBhZ2VzX2RhdGFfZ3Vlc3QgPSBtYXBfZG9tYWluX3BhZ2Uo Z3Vlc3RfbWZuKTsKClNpbWlsYXJseSBoZXJlLCB5b3UgbWF5IHdhbnQgdG8gdXNlIGFjY2Vzc19n dWVzdF9ieV9pcGEuIFRoaXMgd2lsbCBkbyAKYWxsIHRoZSBzYWZldHkgY2hlY2sgZm9yIGNvcHkg ZnJvbSBndWVzdCBtZW1vcnkuCgpGdXJ0aGVybW9yZSwgSSB0aGluayB0aGlzIGlzIGdvaW5nIHRv IHNpbXBsaWZ5IGEgbG90IHRoaXMgY29kZS4KCgo+PiArICAgIGlmICghcGFnZXNfZGF0YV9ndWVz dCkKPj4gKyAgICAgICAgZ290byBlcnJfZnJlZTsKPj4gKwo+PiArICAgIHBhZ2VzX2RhdGFfeGVu ID0gcGFnZXNfZGF0YV94ZW5fc3RhcnQ7Cj4+ICsgICAgd2hpbGUgKCBudW1fcGFnZXMgKSB7Cj4+ ICsgICAgICAgIG1mbl90IGVudHJ5X21mbiA9IGxvb2t1cF9ndWVzdF9yYW1fYWRkcigKPj4gKyAg ICAgICAgICAgIHBhZ2VzX2RhdGFfZ3Vlc3QtPnBhZ2VzX2xpc3RbZW50cmllc19vbl9wYWdlXSk7 Cj4+ICsKPj4gKyAgICAgICAgaWYgKCBtZm5fZXEoZW50cnlfbWZuLCBJTlZBTElEX01GTikgKQo+ PiArICAgICAgICAgICAgZ290byBlcnJfdW5tYXA7CgpZb3Ugd291bGQgbmVlZCB0byBnZXQgYSBy ZWZlcmVuY2Ugb24gZWFjaCBwYWdlLCBhbmQgcmVsZWFzZSBpdCBpbiAKZXJyX3VubWFwIG9yIHdo ZW4gdGhlIGNvbW1hbmQgaXMgZG9uZS4gZ2V0X3BhZ2VfZnJvbV9nZm4gY291bGQgZG8gaXQgZm9y IAp5b3UuCgo+PiArCj4+ICsgICAgICAgIHBhZ2VzX2RhdGFfeGVuLT5wYWdlc19saXN0W2VudHJp ZXNfb25fcGFnZV0gPSBtZm5fdG9fbWFkZHIoZW50cnlfbWZuKTsKPj4gKyAgICAgICAgZW50cmll c19vbl9wYWdlKys7Cj4+ICsKPj4gKyAgICAgICAgaWYgKCBlbnRyaWVzX29uX3BhZ2UgPT0gUEFH RUxJU1RfRU5UUklFU19QRVJfUEFHRSApIHsKPj4gKyAgICAgICAgICAgIHBhZ2VzX2RhdGFfeGVu LT5uZXh0X3BhZ2VfZGF0YSA9IHZpcnRfdG9fbWFkZHIocGFnZXNfZGF0YV94ZW4gKyAxKTsKPj4g KyAgICAgICAgICAgIHBhZ2VzX2RhdGFfeGVuKys7Cj4+ICsgICAgICAgICAgICBnYWRkciA9IHBh Z2VzX2RhdGFfZ3Vlc3QtPm5leHRfcGFnZV9kYXRhOwo+PiArICAgICAgICAgICAgdW5tYXBfZG9t YWluX3BhZ2UocGFnZXNfZGF0YV9ndWVzdCk7Cj4+ICsgICAgICAgICAgICBndWVzdF9tZm4gPSBs b29rdXBfZ3Vlc3RfcmFtX2FkZHIoZ2FkZHIpOwo+PiArICAgICAgICAgICAgaWYgKCBtZm5fZXEo Z3Vlc3RfbWZuLCBJTlZBTElEX01GTikgKQo+PiArICAgICAgICAgICAgICAgIGdvdG8gZXJyX2Zy ZWU7Cj4+ICsKPj4gKyAgICAgICAgICAgIHBhZ2VzX2RhdGFfZ3Vlc3QgPSBtYXBfZG9tYWluX3Bh Z2UoZ3Vlc3RfbWZuKTsKPj4gKyAgICAgICAgICAgIGlmICggIXBhZ2VzX2RhdGFfZ3Vlc3QgKQo+ PiArICAgICAgICAgICAgICAgIGdvdG8gZXJyX2ZyZWU7Cj4+ICsgICAgICAgICAgICAvKiBSb2xs IG92ZXIgdG8gdGhlIG5leHQgcGFnZSAqLwo+PiArICAgICAgICAgICAgZW50cmllc19vbl9wYWdl ID0gMDsKPj4gKyAgICAgICAgfQo+PiArICAgICAgICBudW1fcGFnZXMtLTsKPj4gKyAgICB9Cj4+ ICsKPj4gKyAgICB1bm1hcF9kb21haW5fcGFnZShwYWdlc19kYXRhX2d1ZXN0KTsKPj4gKwo+PiAr ICAgIHBhcmFtLT51LnRtZW0uYnVmX3B0ciA9IHZpcnRfdG9fbWFkZHIocGFnZXNfZGF0YV94ZW5f c3RhcnQpIHwgcGFnZV9vZmZzZXQ7CgpJIGFtIG5vdCBzdXJlIHRvIHVuZGVyc3RhbmQgd2h5IHlv dSBhcmUgYXBwbHkgdGhlIG9mZnNldCBvZiB0aGUgZ3Vlc3QgCmJ1ZmZlciB0byB4ZW4gYnVmZmVy LgoKPj4gKwo+PiArICAgIGN0eC0+bm9uX2NvbnRpZ1tpZHhdID0gcGFnZXNfZGF0YV94ZW5fc3Rh cnQ7Cj4+ICsgICAgY3R4LT5ub25fY29udGlnX29yZGVyW2lkeF0gPSBvcmRlcjsKPj4gKwo+PiAr ICAgIHVubWFwX2RvbWFpbl9wYWdlKHBhZ2VzX2RhdGFfZ3Vlc3QpOwo+PiArICAgIHJldHVybiB0 cnVlOwo+PiArCj4+ICtlcnJfdW5tYXA6Cj4+ICsgICAgdW5tYXBfZG9tYWluX3BhZ2UocGFnZXNf ZGF0YV9ndWVzdCk7Cj4+ICtlcnJfZnJlZToKPj4gKyAgICBmcmVlX3hlbmhlYXBfcGFnZXMocGFn ZXNfZGF0YV94ZW5fc3RhcnQsIG9yZGVyKTsKPj4gKyAgICByZXR1cm4gZmFsc2U7Cj4+ICt9Cj4+ ICsKPj4gK3N0YXRpYyBib29sIHRyYW5zbGF0ZV9wYXJhbXMoc3RydWN0IHN0ZF9jYWxsX2N0eCAq Y3R4KQo+PiArewo+PiArICAgIHVuc2lnbmVkIGludCBpOwo+PiArICAgIHVpbnQzMl90IGF0dHI7 Cj4+ICsKPj4gKyAgICBmb3IgKCBpID0gMDsgaSA8IGN0eC0+eGVuX2FyZy0+bnVtX3BhcmFtczsg aSsrICkgewo+PiArICAgICAgICBhdHRyID0gY3R4LT54ZW5fYXJnLT5wYXJhbXNbaV0uYXR0cjsK Pj4gKwo+PiArICAgICAgICBzd2l0Y2ggKCBhdHRyICYgT1BURUVfTVNHX0FUVFJfVFlQRV9NQVNL ICkgewo+PiArICAgICAgICBjYXNlIE9QVEVFX01TR19BVFRSX1RZUEVfVE1FTV9JTlBVVDoKPj4g KyAgICAgICAgY2FzZSBPUFRFRV9NU0dfQVRUUl9UWVBFX1RNRU1fT1VUUFVUOgo+PiArICAgICAg ICBjYXNlIE9QVEVFX01TR19BVFRSX1RZUEVfVE1FTV9JTk9VVDoKPj4gKyAgICAgICAgICAgIGlm ICggYXR0ciAmIE9QVEVFX01TR19BVFRSX05PTkNPTlRJRyApIHsKPj4gKyAgICAgICAgICAgICAg ICBpZiAoICF0cmFuc2xhdGVfbm9uY29udGlnKGN0eCwgY3R4LT54ZW5fYXJnLT5wYXJhbXMgKyBp LCBpKSApCj4+ICsgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKPj4gKyAgICAgICAg ICAgIH0KPj4gKyAgICAgICAgICAgIGVsc2Ugewo+PiArICAgICAgICAgICAgICAgIGdwcmludGso WEVOTE9HX1dBUk5JTkcsICJHdWVzdCB0cmllcyB0byB1c2Ugb2xkIHRtZW0gYXJnXG4iKTsKPj4g KyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Cj4+ICsgICAgICAgICAgICB9Cj4+ICsgICAg ICAgICAgICBicmVhazsKPj4gKyAgICAgICAgY2FzZSBPUFRFRV9NU0dfQVRUUl9UWVBFX05PTkU6 Cj4+ICsgICAgICAgIGNhc2UgT1BURUVfTVNHX0FUVFJfVFlQRV9WQUxVRV9JTlBVVDoKPj4gKyAg ICAgICAgY2FzZSBPUFRFRV9NU0dfQVRUUl9UWVBFX1ZBTFVFX09VVFBVVDoKPj4gKyAgICAgICAg Y2FzZSBPUFRFRV9NU0dfQVRUUl9UWVBFX1ZBTFVFX0lOT1VUOgo+PiArICAgICAgICBjYXNlIE9Q VEVFX01TR19BVFRSX1RZUEVfUk1FTV9JTlBVVDoKPj4gKyAgICAgICAgY2FzZSBPUFRFRV9NU0df QVRUUl9UWVBFX1JNRU1fT1VUUFVUOgo+PiArICAgICAgICBjYXNlIE9QVEVFX01TR19BVFRSX1RZ UEVfUk1FTV9JTk9VVDoKPj4gKyAgICAgICAgICAgIGNvbnRpbnVlOwo+PiArICAgICAgICB9Cj4+ ICsgICAgfQo+PiArICAgIHJldHVybiB0cnVlOwo+PiArfQo+PiArCj4+ICsvKgo+PiArICogQ29w eSBjb21tYW5kIGJ1ZmZlciBpbnRvIHhlbiBtZW1vcnkgdG86Cj4+ICsgKiAxKSBIaWRlIHRyYW5z bGF0ZWQgYWRkcmVzc2VzIGZyb20gZ3Vlc3QKPj4gKyAqIDIpIE1ha2Ugc3VyZSB0aGF0IGd1ZXN0 IHdvdWxkbid0IGNoYW5nZSBkYXRhIGluIGNvbW1hbmQgYnVmZmVyIGR1cmluZyBjYWxsCj4+ICsg Ki8KPj4gK3N0YXRpYyBib29sIGNvcHlfc3RkX3JlcXVlc3Qoc3RydWN0IGNwdV91c2VyX3JlZ3Mg KnJlZ3MsCj4+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBzdGRfY2FsbF9j dHggKmN0eCkKPj4gK3sKPj4gKyAgICBwYWRkcl90IGNtZF9nYWRkciwgeGVuX2FkZHI7Cj4+ICsg ICAgbWZuX3QgY21kX21mbjsKPj4gKwo+PiArICAgIGNtZF9nYWRkciA9IChwYWRkcl90KWdldF91 c2VyX3JlZyhyZWdzLCAxKSA8PCAzMiB8Cj4+ICsgICAgICAgIGdldF91c2VyX3JlZyhyZWdzLCAy KTsKPj4gKwo+PiArICAgIC8qCj4+ICsgICAgICogQ29tbWFuZCBidWZmZXIgc2hvdWxkIHN0YXJ0 IGF0IHBhZ2UgYm91bmRhcnkuCj4+ICsgICAgICogVGhpcyBpcyBPUC1URUUgQUJJIHJlcXVpcmVt ZW50Lgo+PiArICAgICAqLwo+PiArICAgIGlmICggY21kX2dhZGRyICYgKE9QVEVFX01TR19OT05D T05USUdfUEFHRV9TSVpFIC0gMSkgKQo+PiArICAgICAgICByZXR1cm4gZmFsc2U7Cj4+ICsKPj4g KyAgICBjbWRfbWZuID0gbG9va3VwX2d1ZXN0X3JhbV9hZGRyKGNtZF9nYWRkcik7Cj4+ICsgICAg aWYgKCBtZm5fZXEoY21kX21mbiwgSU5WQUxJRF9NRk4pICkKPj4gKyAgICAgICAgcmV0dXJuIGZh bHNlOwo+PiArCj4+ICsgICAgY3R4LT5ndWVzdF9hcmcgPSBtYXBfZG9tYWluX3BhZ2UoY21kX21m bik7Cj4+ICsgICAgaWYgKCAhY3R4LT5ndWVzdF9hcmcgKQo+PiArICAgICAgICByZXR1cm4gZmFs c2U7Cj4+ICsKPj4gKyAgICBjdHgtPnhlbl9hcmcgPSBhbGxvY194ZW5oZWFwX3BhZ2UoKTsKPj4g KyAgICBpZiAoICFjdHgtPnhlbl9hcmcgKQo+PiArICAgICAgICByZXR1cm4gZmFsc2U7Cj4+ICsK Pj4gKyAgICBtZW1jcHkoY3R4LT54ZW5fYXJnLCBjdHgtPmd1ZXN0X2FyZywgT1BURUVfTVNHX05P TkNPTlRJR19QQUdFX1NJWkUpOwoKSGF2ZSBhIGxvb2sgYSBndWVzdCBjb3B5IGhlbHBlcnMuCgpD aGVlcnMsCgpbMV0gCmh0dHBzOi8vbGlzdHMueGVucHJvamVjdC5vcmcvYXJjaGl2ZXMvaHRtbC94 ZW4tZGV2ZWwvMjAxNy0xMS9tc2cwMTQ4MS5odG1sCgotLSAKSnVsaWVuIEdyYWxsCgpfX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwpYZW4tZGV2ZWwgbWFpbGlu ZyBsaXN0Clhlbi1kZXZlbEBsaXN0cy54ZW5wcm9qZWN0Lm9yZwpodHRwczovL2xpc3RzLnhlbnBy b2plY3Qub3JnL21haWxtYW4vbGlzdGluZm8veGVuLWRldmVs