From mboxrd@z Thu Jan 1 00:00:00 1970 From: Julien Grall Subject: Re: [RFC v2 5/6] xen/arm: zynqmp: Forward plaform specific firmware calls Date: Fri, 17 Feb 2017 18:47:59 +0000 Message-ID: References: <1486496525-14637-1-git-send-email-edgar.iglesias@gmail.com> <1486496525-14637-6-git-send-email-edgar.iglesias@gmail.com> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8"; Format="flowed" Content-Transfer-Encoding: base64 Return-path: In-Reply-To: <1486496525-14637-6-git-send-email-edgar.iglesias@gmail.com> List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Errors-To: xen-devel-bounces@lists.xen.org Sender: "Xen-devel" To: "Edgar E. Iglesias" , xen-devel@lists.xen.org Cc: edgar.iglesias@xilinx.com, nd@arm.com, sstabellini@kernel.org List-Id: xen-devel@lists.xenproject.org SGkgRWRnYXIsCgpPbiAwNy8wMi8xNyAxOTo0MiwgRWRnYXIgRS4gSWdsZXNpYXMgd3JvdGU6Cj4g RnJvbTogIkVkZ2FyIEUuIElnbGVzaWFzIiA8ZWRnYXIuaWdsZXNpYXNAeGlsaW54LmNvbT4KPgo+ IEltcGxlbWVudCBhbiBFRU1JIG1lZGlhdG9yIGFuZCBmb3J3YXJkIHBsYXRmb3JtIHNwZWNpZmlj Cj4gZmlybXdhcmUgY2FsbHMgZnJvbSBndWVzdHMgdG8gZmlybXdhcmUuCj4KPiBUaGUgRUVNSSBt ZWRpYXRvciBpcyByZXNwb25zaWJsZSBmb3IgaW1wbGVtZW50aW5nIGFjY2Vzcwo+IGNvbnRyb2xz IG1vZGlmeWluZyBvciBibG9ja2luZyBjYWxscyB0aGF0IHRyeSB0byBvcGVyYXRlCj4gb24gc2V0 dXAgZm9yIGRldmljZXMgdGhhdCBhcmUgbm90IHVuZGVyIHRoZSBjYWxsaW5nIGd1ZXN0J3MKPiBj b250cm9sLgo+Cj4gRUVNSToKPiBodHRwczovL3d3dy54aWxpbnguY29tL3N1cHBvcnQvZG9jdW1l bnRhdGlvbi91c2VyX2d1aWRlcy91ZzEyMDAtZWVtaS1hcGkucGRmCj4KPiBTaWduZWQtb2ZmLWJ5 OiBFZGdhciBFLiBJZ2xlc2lhcyA8ZWRnYXIuaWdsZXNpYXNAeGlsaW54LmNvbT4KPiAtLS0KPiAg eGVuL2FyY2gvYXJtL3BsYXRmb3Jtcy9NYWtlZmlsZSAgICAgICAgICAgICAgICAgICAgfCAgIDEg Kwo+ICB4ZW4vYXJjaC9hcm0vcGxhdGZvcm1zL3hpbGlueC16eW5xbXAtZWVtaS5jICAgICAgICB8 IDc5NCArKysrKysrKysrKysrKysrKysrKysKPiAgeGVuL2FyY2gvYXJtL3BsYXRmb3Jtcy94aWxp bngtenlucW1wLmMgICAgICAgICAgICAgfCAgMTggKwo+ICB4ZW4vaW5jbHVkZS9hc20tYXJtL3Bs YXRmb3Jtcy94aWxpbngtenlucW1wLWVlbWkuaCB8IDMzNyArKysrKysrKysKPiAgeGVuL2luY2x1 ZGUvYXNtLWFybS9wbGF0Zm9ybXMveGlsaW54LXp5bnFtcC1tbS5oICAgfCAyODQgKysrKysrKysK PiAgNSBmaWxlcyBjaGFuZ2VkLCAxNDM0IGluc2VydGlvbnMoKykKPiAgY3JlYXRlIG1vZGUgMTAw NjQ0IHhlbi9hcmNoL2FybS9wbGF0Zm9ybXMveGlsaW54LXp5bnFtcC1lZW1pLmMKPiAgY3JlYXRl IG1vZGUgMTAwNjQ0IHhlbi9pbmNsdWRlL2FzbS1hcm0vcGxhdGZvcm1zL3hpbGlueC16eW5xbXAt ZWVtaS5oCj4gIGNyZWF0ZSBtb2RlIDEwMDY0NCB4ZW4vaW5jbHVkZS9hc20tYXJtL3BsYXRmb3Jt cy94aWxpbngtenlucW1wLW1tLmgKPgo+IGRpZmYgLS1naXQgYS94ZW4vYXJjaC9hcm0vcGxhdGZv cm1zL01ha2VmaWxlIGIveGVuL2FyY2gvYXJtL3BsYXRmb3Jtcy9NYWtlZmlsZQo+IGluZGV4IDQ5 ZmE2ODMuLmI1OGI3MWYgMTAwNjQ0Cj4gLS0tIGEveGVuL2FyY2gvYXJtL3BsYXRmb3Jtcy9NYWtl ZmlsZQo+ICsrKyBiL3hlbi9hcmNoL2FybS9wbGF0Zm9ybXMvTWFrZWZpbGUKPiBAQCAtOCwzICs4 LDQgQEAgb2JqLSQoQ09ORklHX0FSTV82NCkgKz0gc2VhdHRsZS5vCj4gIG9iai0kKENPTkZJR19B Uk1fMzIpICs9IHN1bnhpLm8KPiAgb2JqLSQoQ09ORklHX0FSTV82NCkgKz0geGdlbmUtc3Rvcm0u bwo+ICBvYmotJChDT05GSUdfQVJNXzY0KSArPSB4aWxpbngtenlucW1wLm8KPiArb2JqLSQoQ09O RklHX0FSTV82NCkgKz0geGlsaW54LXp5bnFtcC1lZW1pLm8KPiBkaWZmIC0tZ2l0IGEveGVuL2Fy Y2gvYXJtL3BsYXRmb3Jtcy94aWxpbngtenlucW1wLWVlbWkuYyBiL3hlbi9hcmNoL2FybS9wbGF0 Zm9ybXMveGlsaW54LXp5bnFtcC1lZW1pLmMKPiBuZXcgZmlsZSBtb2RlIDEwMDY0NAo+IGluZGV4 IDAwMDAwMDAuLmMyYzE4NGQKPiAtLS0gL2Rldi9udWxsCj4gKysrIGIveGVuL2FyY2gvYXJtL3Bs YXRmb3Jtcy94aWxpbngtenlucW1wLWVlbWkuYwoKQXMgeW91IGludHJvZHVjZSBhbm90aGVyIGZp bGUgZm9yIFhpbGlueCwgaXQgbWlnaHQgYmUgd29ydGggY29uc2lkZXJpbmcgCmEgbmV3IGRpcmVj dG9yeSB4aWxpbnggaW4gdGhlIHBsYXRmb3Jtcy4KCj4gQEAgLTAsMCArMSw3OTQgQEAKPiArLyoK PiArICogeGVuL2FyY2gvYXJtL3BsYXRmb3Jtcy94aWxpbngtenlucW1wLWVlbWkuYwo+ICsgKgo+ ICsgKiBYaWxpbnggWnlucU1QIEVFTUkgQVBJIG1lZGlhdG9yLgo+ICsgKgo+ICsgKiBDb3B5cmln aHQgKGMpIDIwMTcgWGlsaW54IEluYy4KPiArICogV3JpdHRlbiBieSBFZGdhciBFLiBJZ2xlc2lh cyA8ZWRnYXIuaWdsZXNpYXNAeGlsaW54LmNvbT4KPiArICoKPiArICogVGhpcyBwcm9ncmFtIGlz IGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKPiAr ICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBh cyBwdWJsaXNoZWQgYnkKPiArICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVy IHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKPiArICogKGF0IHlvdXIgb3B0aW9uKSBhbnkg bGF0ZXIgdmVyc2lvbi4KCldlIGhhZCBhIGJhZCBoYWJpdCBvbiBBUk0gdG8gdXNlICJlaXRoZXIg dmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAKKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIg dmVyc2lvbiIuIEhvd2V2ZXIgWGVuIGlzIEdQTHYyIG9ubHkgKHNlZSAKQ09OVFJJQlVUSU5HKS4g Q291bGQgeW91IHVwZGF0ZSB0aGUgbGljZW5zZSB0bzoKCiJUaGlzIHByb2dyYW0gaXMgZnJlZSBz b2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCm1vZGlmeSBpdCB1bmRlciB0 aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwpMaWNlbnNl LCB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9u LiIKCj4gKyAqCj4gKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0 aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAo+ICsgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdp dGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgo+ICsgKiBNRVJDSEFOVEFCSUxJVFkg b3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCj4gKyAqIEdOVSBH ZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCj4gKyAqLwo+ICsKPiArLyoK PiArICogTWVkaWF0b3IgZm9yIHRoZSBFRU1JIFBvd2VyIE1hbmdlbWVudCBBUEkuCgpzL01hbmdl bWVudC9NYW5hZ2VtZW50LwoKPiArICoKPiArICogUmVmczoKPiArICogaHR0cHM6Ly93d3cueGls aW54LmNvbS9zdXBwb3J0L2RvY3VtZW50YXRpb24vdXNlcl9ndWlkZXMvdWcxMjAwLWVlbWktYXBp LnBkZgo+ICsgKgo+ICsgKiBCYWNrZ3JvdW5kOgo+ICsgKiBUaGUgWnlucU1QIGhhcyBhIHN1YnN5 c3RlbSBuYW1lZCB0aGUgUE1VIHdpdGggYSBDUFUgYW5kIHNwZWNpYWwgZGV2aWNlcwo+ICsgKiBk ZWRpY2F0ZWQgdG8gcnVubmluZyBQb3dlciBNYW5hZ2VtZW50IEZpcm13YXJlLiBPdGhlciBtYXN0 ZXJzIGluIHRoZQo+ICsgKiBzeXN0ZW0gbmVlZCB0byBzZW5kIHJlcXVlc3RzIHRvIHRoZSBQTVUg aW4gb3JkZXIgdG8gZm9yIGV4YW1wbGU6Cj4gKyAqICogTWFuYWdlIHBvd2VyIHN0YXRlCj4gKyAq ICogQ29uZmlndXJlIGNsb2Nrcwo+ICsgKiAqIFByb2dyYW0gYml0c3RyZWFtcyBmb3IgdGhlIHBy b2dyYW1tYWJsZSBsb2dpYwo+ICsgKiAqIGV0Ywo+ICsgKgo+ICsgKiBBbGx0aG91Z2ggdGhlIGRl dGFpbHMgb2YgdGhlIHNldHVwIGFyZSBjb25maWd1cmFibGUsIGluIHRoZSBjb21tb24gY2FzZQoK cy9BbGx0aG91Z2gvYWx0aG91Z2gvCgo+ICsgKiB0aGUgUE1VIGxpdmVzIGluIHRoZSBTZWN1cmUg d29ybGQuIE5TIFdvcmxkIGNhbm5vdCBkaXJlY3RseSBjb21tdW5pY2F0ZQo+ICsgKiB3aXRoIGl0 IGFuZCBtdXN0IHVzZSBwcm94eSBzZXJ2aWNlcyBmcm9tIEFSTSBUcnVzdGVkIEZpcm13YXJlIHRv IHJlYWNoCj4gKyAqIHRoZSBQTVUuCj4gKyAqCj4gKyAqIFBvd2VyIE1hbmFnZW1lbnQgb24gdGhl IFp5bnFNUCBpcyBpbXBsZW1lbnRlZCBpbiBhIGxheWVyZWQgbWFubmVyLgo+ICsgKiBUaGUgUE1V IGtub3dzIGFib3V0IHZhcmlvdXMgbWFzdGVycyBhbmQgd2lsbCBlbmZvcmNlIGFjY2VzcyBjb250 cm9scwo+ICsgKiBiYXNlZCBvbiBhIHByZS1jb25maWd1cmVkIHBhcnRpdGlvbmluZy4gVGhpcyBj b25maWd1cmF0aW9uIGRpY3RhdGVzCj4gKyAqIHdoaWNoIGRldmljZXMgYXJlIG93bmVkIGJ5IHRo ZSB2YXJpb3VzIG1hc3RlcnMgYW5kIHRoZSBQTVUgRlcgbWFrZXMgc3VyZQo+ICsgKiB0aGF0IGEg Z2l2ZW4gbWFzdGVyIGNhbm5vdCB0dXJuIG9mZiBhIGRldmljZSB0aGF0IGl0IGRvZXMgbm90IG93 biBvciB0aGF0Cj4gKyAqIGlzIGluIHVzZSBieSBvdGhlciBtYXN0ZXJzLgo+ICsgKgo+ICsgKiBU aGUgUE1VIGlzIG5vdCBhd2FyZSBvZiBtdWx0aXBsZSBleGVjdXRpb24gc3RhdGVzIGluIG1hc3Rl cnMuCj4gKyAqIEZvciBleGFtcGxlLCBpdCB0cmVhdHMgdGhlIEFSTXY4IGNvcmVzIGFzIHNpbmds ZSB1bml0cyBhbmQgZG9lcyBub3QKPiArICogZGlzdGluZ3Vpc2ggYmV0d2VlbiBTZWN1cmUgdnMg TlMgT1M6cyBub3IgZG9lcyBpdCBrbm93IGFib3V0IEh5cGVydmlzb3JzCj4gKyAqIGFuZCBtdWx0 aXBsZSBndWVzdHMuIEl0IGlzIHVwIHRvIHNvZnR3YXJlIG9uIHRoZSBBUk12OCBjb3JlcyB0byBw cmVzZW50Cj4gKyAqIGEgdW5pZmllZCB2aWV3IG9mIGl0cyBwb3dlciByZXF1aXJlbWVudHMuCj4g KyAqCj4gKyAqIFRvIGltcGxlbWVudCB0aGlzIHVuaWZpZWQgdmlldywgQVJNIFRydXN0ZWQgRmly bXdhcmUgYXQgRUwzIHByb3ZpZGVzCj4gKyAqIGFjY2VzcyB0byB0aGUgUE0gQVBJIHZpYSBTTUMg Y2FsbHMuIEFSTSBUcnVzdGVkIEZpcm13YXJlIGlzIHJlc3BvbnNpYmxlCj4gKyAqIGZvciBtZWRp YXRpbmcgYmV0d2VlbiB0aGUgU2VjdXJlIGFuZCB0aGUgTlMgd29ybGQsIHJlamVjdGluZyBTTUMg Y2FsbHMKPiArICogdGhhdCByZXF1ZXN0IGNoYW5nZXMgdGhhdCBhcmUgbm90IGFsbG93ZWQuCj4g KyAqCj4gKyAqIFhlbiBydW5uaW5nIGFib3ZlIEFURiBvd25zIHRoZSBOUyB3b3JsZCBhbmQgaXMg cmVzcG9uc2libGUgZm9yIHByZXNlbnRpbmcKPiArICogdW5pZmllZCBQTSByZXF1ZXN0cyB0YWtp bmcgYWxsIGd1ZXN0cyBhbmQgdGhlIGh5cGVydmlzb3IgaW50byBhY2NvdW50Lgo+ICsgKgo+ICsg KiBJbXBsZW1lbnRhdGlvbjoKPiArICogVGhlIFBNIEFQSSBjb250YWlucyBkaWZmZXJlbnQgY2xh c3NlcyBvZiBjYWxscy4KPiArICogQ2VydGFpbiBjYWxscyBhcmUgaGFybWxlc3MgdG8gZXhwb3Nl IHRvIGFueSBndWVzdC4KPiArICogVGhlc2UgaW5jbHVkZSBjYWxscyB0byBnZXQgdGhlIFBNIEFQ SSBWZXJzaW9uLCBvciB0byByZWFkIG91dCB0aGUgdmVyc2lvbgo+ICsgKiBvZiB0aGUgY2hpcCB3 ZSdyZSBydW5uaW5nIG9uLgo+ICsgKgo+ICsgKiBPdGhlciBjYWxscyBhcmUgbW9yZSBwcm9ibGVt YXRpYy4gSGVyZSdyZSBzb21lOgoKSSBkb24ndCB0aGluayB5b3UgY2FuIHRoZSBjb250cmFjdGlv biAiaGVyZSdyZSIuCgo+ICsgKiAqIFBvd2VyIHJlcXVlc3RzIGZvciBub2RlcyAoaS5lIHR1cm4g b24gb3Igb2ZmIGEgZ2l2ZW4gZGV2aWNlKQo+ICsgKiAqIFJlc2V0IGxpbmUgY29udHJvbCAoaS5l IHJlc2V0IGEgZ2l2ZW4gZGV2aWNlKQo+ICsgKiAqIE1NSU8gYWNjZXNzIChpLmUgZGlyZWN0bHkg YWNjZXNzIGNsb2NrIGFuZCByZXNldCByZWdpc3RlcnMpCj4gKyAqCj4gKyAqIFBvd2VyIHJlcXVl c3RzIGZvciBub2RlczoKPiArICogSW4gb3JkZXIgdG8gY29ycmVjdGx5IG1lZGlhdGUgdGhlc2Ug Y2FsbHMsIHdlIG5lZWQgdG8ga25vdyBpZgo+ICsgKiBndWVzdHMgaXNzdWluZyB0aGVzZSBjYWxs cyBoYXZlIG93bmVyc2hpcCBvZiB0aGUgZ2l2ZW4gZGV2aWNlLgo+ICsgKiBUaGUgYXBwcm9hY2gg dGFrZW4gaGVyZSBpcyB0byBtYXAgUE0gQVBJIE5vZGVzIGlkZW50aWZ5aW5nCj4gKyAqIGEgZGV2 aWNlIGludG8gYmFzZSBhZGRyZXNzZXMgZm9yIHJlZ2lzdGVycyB0aGF0IGJlbG9uZyB0byB0aGF0 Cj4gKyAqIHNhbWUgZGV2aWNlLgo+ICsgKgo+ICsgKiBJZiB0aGUgZ3Vlc3QgaGFzIGFjY2VzcyB0 byBhIGRldmljZXMgcmVnaXN0ZXJzLCB3ZSBnaXZlIHRoZSBndWVzdAo+ICsgKiBhY2Nlc3MgdG8g UE0gQVBJIGNhbGxzIHRoYXQgYWZmZWN0IHRoYXQgZGV2aWNlLiBUaGlzIGlzIGltcGxlbWVudGVk Cj4gKyAqIGJ5IHBtX25vZGVfYWNjZXNzIGFuZCBkb21haW5faGFzX25vZGVfYWNjZXNzKCkuCj4g KyAqCj4gKyAqIFJlc2V0IGxpbmVzOgo+ICsgKiBSZXNldCBsaW5lcyBhcmUgaWRlbnRpZmllZCBi eSBhIGxpc3Qgb2YgaWRlbnRpZmllcnMgdGhhdCBkbyBub3QgcmVsYXRlCj4gKyAqIHRvIGRldmlj ZSBub2Rlcy4gV2UgY2FuIHVzZSB0aGUgc2FtZSBhcHByb2FjaCBoZXJlIGFzIGZvciBub2Rlcywg ZXhjZXB0Cj4gKyAqIHRoYXQgd2UgbmVlZCBhIHNlcGFyYXRlIHRhYmxlIG1hcHBpbmcgcmVzZXQg bGluZXMgdG8gYmFzZSBhZGRyZXNzZXMuCj4gKyAqIFRoaXMgaXMgaW1wbGVtZW50ZWQgYnkgcG1f cmVzZXRfYWNjZXNzLgo+ICsgKgo+ICsgKiBNTUlPIGFjY2VzczoKPiArICogVGhlc2UgY2FsbHMg YWxsb3cgZ3Vlc3RzIHRvIGFjY2VzcyBjZXJ0YWluIG1lbW9yeSByYW5nZXMuIFRoZXNlIHJhbmdl cwo+ICsgKiBhcmUgdHlwaWNhbGx5IHByb3RlY3RlZCBmb3Igc2VjdXJlLXdvcmxkIGFjY2VzcyBv bmx5IGFuZCBhbHNvIGZyb20KPiArICogY2VydGFpbiBtYXN0ZXJzIG9ubHksIHNvIGd1ZXN0cyBj YW5ub3QgYWNjZXNzIHRoZW0gZGlyZWN0bHkuCj4gKyAqIFJlZ2lzdGVycyB3aXRoaW4gdGhlIG1l bW9yeSByZWdpb25zIGFmZmVjdCBjZXJ0YWluIG5vZGVzLiBJbiB0aGlzIGNhc2UsCj4gKyAqIG91 ciBpbXB1dCBpcyBhbiBhZGRyZXNzIGFuZCB3ZSBtYXAgdGhhdCBhZGRyZXNzIGludG8gYSBub2Rl LiBJZiB0aGUKPiArICogZ3Vlc3QgaGFzIG93bmVyc2hpcCBvZiB0aGF0IG5vZGUsIHRoZSBhY2Nl c3MgaXMgYWxsb3dlZC4KPiArICogU29tZSByZWdpc3RlcnMgY29udGFpbiBiaXRmaWVsZHMgYW5k IGEgc2luZ2xlIHJlZ2lzdGVyIG1heSBjb250YWluCj4gKyAqIGJpdHMgdGhhdCBhZmZlY3QgbXVs dGlwbGUgbm9kZXMuCj4gKyAqCj4gKyAqIFNvbWUgb2YgdGhlIGNhbGxzIGFjdCBvbiBtb3JlIGds b2JhbCBzdGF0ZS4gRm9yIGV4YW1wbGUgYWN0aW5nIG9uCj4gKyAqIE5PREVfUFMsIHdoaWNoIGFm ZmVjdHMgbWFueSBhIGxvdCBvZiBub2Rlcy4gVGhpcyBoaWdoZXIgbGV2ZWwKPiArICogb3JjaGVz dHJhdGluZyBpcyBsZWZ0IGZvciB0aGUgaGFyZHdhcmUtZG9tYWluIG9ubHkuCj4gKyAqLwo+ICsK PiArI2luY2x1ZGUgPHhlbi9pb2NhcC5oPgo+ICsjaW5jbHVkZSA8YXNtL3BsYXRmb3JtLmg+Cj4g KyNpbmNsdWRlIDxhc20vcGxhdGZvcm1zL3hpbGlueC16eW5xbXAtZWVtaS5oPgo+ICsjaW5jbHVk ZSA8YXNtL3BsYXRmb3Jtcy94aWxpbngtenlucW1wLW1tLmg+Cj4gKwo+ICtzdHJ1Y3QgcG1fYWNj ZXNzCj4gK3sKPiArICAgIHVpbnQ2NF90IGFkZHI7CgpQbGVhc2UgdXNlIHBhZGRyX3QgaGVyZS4K Cj4gKyAgICBib29sIGh3ZG9tX2FjY2VzczsgICAgLyogSFcgZG9tYWluIGdldHMgYWNjZXNzIHJl Z2FyZGxlc3MuICAqLwo+ICt9OwoKClsuLi5dCgo+ICsvKgo+ICsgKiBUaGlzIHRhYmxlIG1hcHMg cmVzZXQgbGluZSBJRHMgaW50byBhIG1lbW9yeSBhZGRyZXNzLgo+ICsgKiBJZiBhIGd1ZXN0IGhh cyBhY2Nlc3MgdG8gdGhlIGFkZHJlc3MsIGl0IGhhcyBlbm91Z2ggY29udHJvbAo+ICsgKiBvdmVy IHRoZSBhZmZlY3RlZCBub2RlIHRvIGdyYW50IGl0IGFjY2VzcyB0byBFRU1JIGNhbGxzIGZvcgo+ ICsgKiByZXNldHRpbmcgdGhhdCBub2RlLgo+ICsgKi8KPiArc3RhdGljIGNvbnN0IHN0cnVjdCB7 Cj4gKyAgICB1aW50NjRfdCBzdGFydDsKPiArICAgIHVpbnQ2NF90IGVuZDsgICAgLyogSW5jbHVz aXZlLiBJZiBub3Qgc2V0LCBzaW5nbGUgcmVnIGVudHJ5LiAgKi8KCkZvciBib3RoLCBzL3VpbnQ2 NF90L3BhZGRyX3QvCgo+ICsgICAgdWludDMyX3QgbWFzazsgICAvKiBaZXJvIG1lYW5zIG5vIG1h c2ssIGkuZSBhbGwgYml0cy4gICovCj4gKyAgICBlbnVtIHBtX25vZGVfaWQgbm9kZTsKPiArICAg IGJvb2wgaHdkb21fYWNjZXNzOwo+ICsgICAgYm9vbCByZWFkb25seTsKPiArfSBwbV9tbWlvX2Fj Y2Vzc1tdID0gewoKQ291bGQgbm90IHdlIGZpbmQgYWxsIHRob3NlIGluZm9ybWF0aW9uIGZyb20g dGhlIGRldmljZS10cmVlPwoKPiArc3RhdGljIGJvb2wgcG1fY2hlY2tfYWNjZXNzKGNvbnN0IHN0 cnVjdCBwbV9hY2Nlc3MgKmFjbCwgc3RydWN0IGRvbWFpbiAqZCwgaW50IGlkeCkKPiArewo+ICsg ICAgdW5zaWduZWQgbG9uZyBtZm47Cj4gKwo+ICsgICAgaWYgKCBhY2xbaWR4XS5od2RvbV9hY2Nl c3MgJiYgaXNfaGFyZHdhcmVfZG9tYWluKGQpICkKPiArICAgICAgICByZXR1cm4gdHJ1ZTsKPiAr Cj4gKyAgICBtZm4gPSBwYWRkcl90b19wZm4oYWNsW2lkeF0uYWRkcik7CgphY2xbaWR4XS5hZGRy IG1heSBub3QgYmUgcGFnZSBhbGlnbmVkLCBzbyBpcyB0aGVyZSBhbnkgcG9zc2liaWxpdHkgdG8g CmhhdmUgYSBzYW1lIHBhZ2UgcGVybWl0dGVkIGluIG11bHRpcGxlIGRvbWFpbj8KCj4gKyAgICBp ZiAoICFtZm4gKQo+ICsgICAgICAgIHJldHVybiBmYWxzZTsKPiArCj4gKyAgICByZXR1cm4gaW9t ZW1fYWNjZXNzX3Blcm1pdHRlZChkLCBtZm4sIG1mbik7CgpXaG8gd2lsbCBnaXZlIGFjY2VzcyB0 byB0aGUgTU1JTyByZWdpb24/IElzIGl0IHRoZSB0b29sc3RhY2sgdmlhIAppb21lbT0iLi4uIj8K CkFsc28sIGdpdmluZyBhY2Nlc3MgdG8gdGhlIE1NSU8gYWxzbyBtZWFucyB0aGUgZ3Vlc3Qgd2ls bCBiZSBhYmxlIHRvIG1hcCAKaXQuIEFmdGVyIHJlYWRpbmcgdGhlIGNvbW1lbnQgYXQgdGhlIHRv cCBvZiB0aGUgZmlsZSwgSSBhbSBub3Qgc3VyZSB0aGlzIAppcyB3aGF0IHlvdSB3YW50LgoKPiAr fQo+ICsKPiArLyogQ2hlY2sgaWYgYSBkb21haW4gaGFzIGFjY2VzcyB0byBhIG5vZGUuICAqLwo+ ICtzdGF0aWMgYm9vbCBkb21haW5faGFzX25vZGVfYWNjZXNzKHN0cnVjdCBkb21haW4gKmQsIGVu dW0gcG1fbm9kZV9pZCBub2RlKQo+ICt7Cj4gKyAgICBpZiAoIG5vZGUgPD0gMCB8fCBub2RlID4g QVJSQVlfU0laRShwbV9ub2RlX2FjY2VzcykgKQoKU29tZSBjb21waWxlciB3aWxsIGNvbXBsYWlu IG9mIHRoZSBmaXJzdCBjaGVjayBiZWNhdXNlIHRoZSBlbnVtIGlzIAphbHdheXMgcG9zaXRpdmUu CgpBbHNvLCB3aGF0IGFyZSB5b3UgdHJ5aW5nIHRvIGNoZWNrIGdpdmVuIHRoZSBub2RlIGlzIGFu IGVudW0gYW5kIHNob3VsZCAKZmFsbCBpbnRvIHRoZSBhcnJheT8KCj4gKyAgICAgICAgcmV0dXJu IGZhbHNlOwo+ICsKPiArICAgIC8qIE5PREVfVU5LTk9XTiBpcyB0cmVhdGVkIGFzIGEgd2lsZGNh cmQuICAqLwo+ICsgICAgaWYgKCBub2RlID09IE5PREVfVU5LTk9XTiApCj4gKyAgICAgICAgcmV0 dXJuIHRydWU7CgpXaGljaCBtZWFucyBldmVyeSBkb21haW4gd2lsbCBhY2Nlc3MgdG8gaXQuIEkg dGhpbmsgdGhpcyBpcyBlYXNpbHkgCmVycm9yLXByb25lIGJlY2F1c2UgTk9ERV9VTktPV04gaXMg MC4gU28geW91IG1heSBnaXZlIGFjY2VzcyB0byBhbnlvbmUgCmJ5IG1pc3Rha2UuCgpMb29raW5n IGF0IHRoZSBwbV9tbWlvX2FjY2VzcyBsaXN0LCBteSB1bmRlcnN0YW5kaW5nIGlzIE5PREVfVU5L Tk9XTiAKd2lsbCBiZSB1c2VkIHdoZW4gb25seSB0aGUgaGFyZHdhcmUgZG9tYWluIGNhbiBhY2Nl c3MgaXQgb3IgdGhlIHJlZ2lvbiAKaXMgcmVhZC1vbmx5LgoKU28gSSB3b3VsZCB1c2UgdGhlIHJl YWQtb25seSBwcm9wZXJ0eSB0byBrbm93IHdoZXRoZXIgYW55IGRvbWFpbiBoYXMgYWNjZXNzLgoK PiArCj4gKyAgICByZXR1cm4gcG1fY2hlY2tfYWNjZXNzKHBtX25vZGVfYWNjZXNzLCBkLCBub2Rl KTsKPiArfQo+ICsKPiArLyogQ2hlY2sgaWYgYSBkb21haW4gaGFzIGFjY2VzcyB0byBhIHJlc2V0 IGxpbmUuICAqLwo+ICtzdGF0aWMgYm9vbCBkb21haW5faGFzX3Jlc2V0X2FjY2VzcyhzdHJ1Y3Qg ZG9tYWluICpkLCBlbnVtIHBtX3Jlc2V0IHJzdCkKPiArewo+ICsgICAgaW50IHJzdF9pZHggPSBQ TV9SRVNFVF9JRFgocnN0KTsKPiArCj4gKyAgICBpZiAoIHJzdF9pZHggPCAwIHx8IHJzdF9pZHgg PiBBUlJBWV9TSVpFKHBtX3Jlc2V0X2FjY2VzcykgKQoKU2FtZSBxdWVzdGlvbiBhcyBhYm92ZSBm b3IgdGhlIGJvdW5kIGNoZWNrLgoKPiArICAgICAgICByZXR1cm4gZmFsc2U7Cj4gKwo+ICsgICAg cmV0dXJuIHBtX2NoZWNrX2FjY2VzcyhwbV9yZXNldF9hY2Nlc3MsIGQsIHJzdF9pZHgpOwo+ICt9 Cj4gKwo+ICsvKgo+ICsgKiBDaGVjayBpZiBhIGdpdmVuIGRvbWFpbiBoYXMgYWNjZXNzIHRvIHBl cmZvcm0gYW4gaW5kaXJlY3QKPiArICogTU1JTyBhY2Nlc3MuCj4gKyAqCj4gKyAqIElmIHRoZSBw cm92aWRlZCBtYXNrIGlzIGludmFsaWQsIGl0IHdpbGwgYmUgZml4ZWQgdXAuCj4gKyAqLwo+ICtz dGF0aWMgYm9vbCBkb21haW5fbWVkaWF0ZV9tbWlvX2FjY2VzcyhzdHJ1Y3QgZG9tYWluICpkLAo+ ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHdyaXRlLCB1aW50 NjRfdCBhZGRyLAoKcy91aW50NjRfdC9wYWRkcl90LwoKPiArICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgdWludDMyX3QgKm1hc2spCj4gK3sKPiArICAgIHVuc2lnbmVkIGlu dCBpOwo+ICsgICAgYm9vbCByZXQgPSBmYWxzZTsKPiArICAgIHVpbnQzMl90IHByb3RfbWFzayA9 IDA7Cj4gKwo+ICsgICAgQVNTRVJUKG1hc2spOwo+ICsKPiArICAgIC8qCj4gKyAgICAgKiBUaGUg aGFyZHdhcmUgZG9tYWluIGdldHMgcmVhZCBhY2Nlc3MgdG8gZXZlcnl0aGluZy4KPiArICAgICAq IExvd2VyIGxheWVycyB3aWxsIGRvIGZ1cnRoZXIgZmlsdGVyaW5nLgo+ICsgICAgICovCj4gKyAg ICBpZiAoICF3cml0ZSAmJiBpc19oYXJkd2FyZV9kb21haW4oZCkgKQo+ICsgICAgICAgIHJldHVy biB0cnVlOwo+ICsKPiArICAgIC8qIFNjYW4gdGhlIEFDTC4gICovCj4gKyAgICBmb3IgKCBpID0g MDsgaSA8IEFSUkFZX1NJWkUocG1fbW1pb19hY2Nlc3MpOyBpKysgKSB7Cj4gKyAgICAgICAgYm9v bCByOwo+ICsKPiArICAgICAgICAvKiBDaGVjayBpZiB0aGUgYWRkcmVzcyBpcyBPSy4gICovCj4g KyAgICAgICAgaWYgKCBwbV9tbWlvX2FjY2Vzc1tpXS5lbmQgKSB7Cj4gKyAgICAgICAgICAgIC8q IE1lbW9yeSByYW5nZS4gICovCj4gKyAgICAgICAgICAgIGlmICggYWRkciA8IHBtX21taW9fYWNj ZXNzW2ldLnN0YXJ0ICkKPiArICAgICAgICAgICAgICAgIGNvbnRpbnVlOwo+ICsgICAgICAgICAg ICBpZiAoIGFkZHIgPiBwbV9tbWlvX2FjY2Vzc1tpXS5lbmQgKQo+ICsgICAgICAgICAgICAgICAg Y29udGludWU7Cj4gKyAgICAgICAgfSBlbHNlIHsKPiArICAgICAgICAgICAgLyogU2luZ2xlIHJl Z2lzdGVyLiAgKi8KCkFyZSB0aGUgc2luZ2xlIHJlZ2lzdGVyIG9ubHkgYSBieXRlPyBJZiBub3Qs IGluIHRoZSBjYXNlIG9mIGEgcmVnaW9uIGlzIAppdCBzYWZlIHRvIGFjY2VzcyBpbiBhIG1pZGRs ZSBvZiBhIHJlZ2lzdGVyPwoKPiArICAgICAgICAgICAgaWYgKCBhZGRyICE9IHBtX21taW9fYWNj ZXNzW2ldLnN0YXJ0ICkKPiArICAgICAgICAgICAgICAgIGNvbnRpbnVlOwo+ICsgICAgICAgIH0K Ckkgd291bGQgZHJvcCB0aGUgc2luZ2xlIHJlZ2lzdGVyIGNhc2UgYW5kIHVzZSBtYWtlIC5lbmQg PSAuc3RhcnQuIFRoaXMgCndvdWxkIGF2b2lkIHBvdGVudGlhbGx5IG1pc3Rha2UgaW4gdGhlIGNv ZGUuCgpJZiB5b3UgYXJlIGNvbmNlcm4gYWJvdXQgdGhlIHJlYWRhYmlsaXR5IG9mIHRoZSBhcnJh eSwgeW91IGNvdWxkIHVzZSBhIAptYWNyby4KCj4gKwo+ICsgICAgICAgIGlmICggd3JpdGUgJiYg cG1fbW1pb19hY2Nlc3NbaV0ucmVhZG9ubHkgKQo+ICsgICAgICAgICAgICBjb250aW51ZTsKPiAr ICAgICAgICBpZiAoIHBtX21taW9fYWNjZXNzW2ldLmh3ZG9tX2FjY2VzcyAmJiAhaXNfaGFyZHdh cmVfZG9tYWluKGQpICkKPiArICAgICAgICAgICAgY29udGludWU7Cj4gKwo+ICsgICAgICAgIC8q IFVubGltaXRlZCBhY2Nlc3MgaXMgcmVwcmVzZW50ZWQgYnkgYSB6ZXJvIG1hc2suICAqLwo+ICsg ICAgICAgIEFTU0VSVCggcG1fbW1pb19hY2Nlc3NbaV0ubWFzayAhPSAweEZGRkZGRkZGICk7CgpX aHk/IFdvdWxkIG5vdCBpdCBtYWtlIHRoZSBsb2dpYyBlYXNpZXIgdG8gaGFuZGxlIHVubGltaXRl ZCBhY2Nlc3MgdXNpbmcgCjB4RkZGRkZGRkY/CgpZb3UgY291bGQgdXNlIG1hY3JvIGZvciB0aGF0 IHB1cnBvc2UuCgo+ICsKPiArICAgICAgICByID0gZG9tYWluX2hhc19ub2RlX2FjY2VzcyhkLCBw bV9tbWlvX2FjY2Vzc1tpXS5ub2RlKTsKPiArICAgICAgICBpZiAoIHIgKSB7Cj4gKyAgICAgICAg ICAgIC8qIFdlJ3ZlIGdvdCBhY2Nlc3MgdG8gdGhpcyByZWcgKG9yIHBhcnRzIG9mIGl0KS4gICov Cj4gKyAgICAgICAgICAgIHJldCA9IHRydWU7Cj4gKyAgICAgICAgICAgIC8qIE1hc2tpbmcgb25s eSBhcHBsaWVzIHRvIHdyaXRlcywgc28gcmVhZHMgY2FuIGV4aXQgaGVyZS4gICovCgpJZiB5b3Ug ZG8gdGhhdCBhIGd1ZXN0IGNvdWxkIHBvdGVudGlhbGx5IHJlYWQgc29tZSBtZW1vcnkgaXQgaXMg bm90IAphbGxvd2VkLiBEb24ndCB5b3UgZXhwZWN0IHNlbnNpdGl2ZSBkYXRhIGluIHRoZSBNTUlP PwoKPiArICAgICAgICAgICAgaWYgKCAhd3JpdGUgKQo+ICsgICAgICAgICAgICAgICAgYnJlYWs7 Cj4gKwo+ICsgICAgICAgICAgICAvKiBQZXJtaXQgd3JpdGUgYWNjZXNzIHRvIHNlbGVjdGVkIGJp dHMuICAqLwo+ICsgICAgICAgICAgICBwcm90X21hc2sgfD0gcG1fbW1pb19hY2Nlc3NbaV0ubWFz ayA/IHBtX21taW9fYWNjZXNzW2ldLm1hc2sgOiB+MDsKPiArICAgICAgICAgICAgcHJpbnRrKCJt YXRjaDogbWFzaz0leCBwcm90X21hc2s9JXhcbiIsCj4gKyAgICAgICAgICAgICAgICAgICBwbV9t bWlvX2FjY2Vzc1tpXS5tYXNrLCBwcm90X21hc2spOwo+ICsgICAgICAgICAgICBpZiAoIHByb3Rf bWFzayA9PSAweEZGRkZGRkZGICkKPiArICAgICAgICAgICAgICAgIGJyZWFrOyAvKiBGdWxsIGFj Y2Vzcywgd2UncmUgZG9uZS4gICovCj4gKyAgICAgICAgfSBlbHNlIHsKPiArICAgICAgICAgICAg aWYgKCAhcG1fbW1pb19hY2Nlc3NbaV0ubWFzayApIHsKPiArICAgICAgICAgICAgICAgIC8qCj4g KyAgICAgICAgICAgICAgICAgKiBUaGUgZW50aXJlIHJlZyBpcyB0aWVkIHRvIGEgZGV2aWNlIHRo YXQgd2UgZG9uJ3QgaGF2ZQo+ICsgICAgICAgICAgICAgICAgICogYWNjZXNzIHRvLiBObyBwb2lu dCBpbiBjb250aW51aW5nLgo+ICsgICAgICAgICAgICAgICAgICovCgpJIGFtIG5vdCBzdXJlIHRv IHVuZGVyc3RhbmQgdGhpcywgYWJvdmUgeW91IGxvb3Agb3ZlciB1bnRpbCB5b3UgbWF5IGdldCAK cHJvdF9tYXNrIGZ1bGwuIEJ1dCBoZXJlIHlvdSBleGlzdCBhcyBzb29uIGFzIG9uZSBtYXNrIG1h eSBub3QgYmUgdmFsaWQuCgo+ICsgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwo+ICsgICAg ICAgICAgICB9Cj4gKyAgICAgICAgfQo+ICsgICAgfQo+ICsKPiArICAgIC8qIE1hc2tpbmcgb25s eSBhcHBsaWVzIHRvIHdyaXRlcy4gICovCj4gKyAgICBpZiAoIHdyaXRlICkKPiArICAgICAgICAq bWFzayAmPSBwcm90X21hc2s7CgpOZXdsaW5lIGhlcmUgcGxlYXNlLgoKPiArICAgIHJldHVybiBy ZXQ7Cj4gK30KPiArCj4gK2Jvb2wgenlucW1wX2VlbWlfbWVkaWF0ZShyZWdpc3Rlcl90IGZpZCwK PiArICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyX3QgYTAsCj4gKyAgICAgICAgICAg ICAgICAgICAgICAgICByZWdpc3Rlcl90IGExLAo+ICsgICAgICAgICAgICAgICAgICAgICAgICAg cmVnaXN0ZXJfdCBhMiwKPiArICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyX3QgYTMs Cj4gKyAgICAgICAgICAgICAgICAgICAgICAgICByZWdpc3Rlcl90IGE0LAo+ICsgICAgICAgICAg ICAgICAgICAgICAgICAgcmVnaXN0ZXJfdCBhNSwKPiArICAgICAgICAgICAgICAgICAgICAgICAg IHJlZ2lzdGVyX3QgKnJldCkKPiArewo+ICsgICAgYm9vbCBpc19tbWlvX3dyaXRlID0gZmFsc2U7 Cj4gKyAgICB1bnNpZ25lZCBpbnQgcG1fZm4gPSBmaWQgJiAweEZGRkY7Cj4gKyAgICB1aW50MzJf dCBwbV9hcmdbNF07Cj4gKwo+ICsgICAgLyogRGVjb2RlIHBtIGFyZ3MuICAqLwo+ICsgICAgcG1f YXJnWzBdID0gYTA7Cj4gKyAgICBwbV9hcmdbMV0gPSBhMCA+PiAzMjsKPiArICAgIHBtX2FyZ1sy XSA9IGExOwo+ICsgICAgcG1fYXJnWzNdID0gYTEgPj4gMzI7Cj4gKwo+ICsgICAgQVNTRVJUKHJl dCk7Cj4gKwo+ICsgICAgc3dpdGNoIChwbV9mbikKPiArICAgIHsKPiArICAgIC8qCj4gKyAgICAg KiBXZSBjYW4ndCBhbGxvdyBDUFVzIHRvIHN1c3BlbmQgd2l0aG91dCBYZW4ga25vd2luZyBhYm91 dCBpdC4KPiArICAgICAqIFdlIGFjY2VwdCBidXQgaWdub3JlIHRoZSByZXF1ZXN0IGFuZCB3YWl0 IGZvciB0aGUgZ3Vlc3QgdG8gaXNzdWUKPiArICAgICAqIGEgV0ZJIHdoaWNoIFhlbiB3aWxsIHRy YXAgYW5kIGFjdCBhY2NvcmRpbmdseSB1cG9uLgo+ICsgICAgICovCj4gKyAgICBjYXNlIFBNX1NF TEZfU1VTUEVORDoKPiArICAgICAgICByZXRbMF0gPSBQTV9SRVRfU1VDQ0VTUzsKPiArICAgICAg ICBnb3RvIGRvbmU7Cj4gKwo+ICsgICAgY2FzZSBQTV9HRVRfTk9ERV9TVEFUVVM6Cj4gKyAgICAv KiBBUEkgZm9yIFBVcy4gICovCgpXaGF0IFBVcyBzdGFuZCBmb3I/Cgo+ICsgICAgY2FzZSBQTV9S RVFfU1VTUEVORDoKPiArICAgIGNhc2UgUE1fRk9SQ0VfUE9XRVJET1dOOgo+ICsgICAgY2FzZSBQ TV9BQk9SVF9TVVNQRU5EOgo+ICsgICAgY2FzZSBQTV9SRVFfV0FLRVVQOgo+ICsgICAgY2FzZSBQ TV9TRVRfV0FLRVVQX1NPVVJDRToKPiArICAgIC8qIEFQSSBmb3Igc2xhdmVzLiAgKi8KPiArICAg IGNhc2UgUE1fUkVRX05PREU6Cj4gKyAgICBjYXNlIFBNX1JFTEVBU0VfTk9ERToKPiArICAgIGNh c2UgUE1fU0VUX1JFUVVJUkVNRU5UOgo+ICsgICAgY2FzZSBQTV9TRVRfTUFYX0xBVEVOQ1k6Cj4g KyAgICAgICAgaWYgKCAhZG9tYWluX2hhc19ub2RlX2FjY2VzcyhjdXJyZW50LT5kb21haW4sIHBt X2FyZ1swXSkgKSB7CgpDb2Rpbmcgc3R5bGU6CgppZiAoIC4uLiApCnsKCj4gKyAgICAgICAgICAg IHByaW50aygienlucW1wLXBtOiBmbj0lZCBObyBhY2Nlc3MgdG8gbm9kZSAlZFxuIiwgcG1fZm4s IHBtX2FyZ1swXSk7CgpQcmludGsgaXMgbm90IHJhdGUtbGltaXRlZCwgdGhpcyBtZWFucyBhIGd1 ZXN0IGNvdWxkIGZsb29kIFhlbiB3aXRoIAplcnJvciBtZXNzYWdlIGlmIGl0IGRvZXMgbm90IGhh dmUgYWNjZXNzIHRvIHRoZSByZWdpb24uCgpQbGVhc2UgdXNlIGdwcmludGsoKSBoZXJlLCBpdCB3 aWxsIHByaW50IHRoZSBkb21haW4gSUQgYW5kIGFsc28KcmF0ZS1saW1pdCB0aGUgbG9nLgoKQWxz bywgcG1fZm4gYW5kIHBtX2FyZyBhcmUgdW5zaWduZWQsIHNvIHBsZWFzZSB1c2UgJXUuCgoKPiAr ICAgICAgICAgICAgcmV0WzBdID0gUE1fUkVUX0VSUk9SX0FDQ0VTUzsKPiArICAgICAgICAgICAg Z290byBkb25lOwo+ICsgICAgICAgIH0KPiArICAgICAgICBnb3RvIGZvcndhcmRfdG9fZnc7Cj4g Kwo+ICsgICAgY2FzZSBQTV9SRVNFVF9BU1NFUlQ6Cj4gKyAgICBjYXNlIFBNX1JFU0VUX0dFVF9T VEFUVVM6Cj4gKyAgICAgICAgaWYgKCAhZG9tYWluX2hhc19yZXNldF9hY2Nlc3MoY3VycmVudC0+ ZG9tYWluLCBwbV9hcmdbMF0pICkgewoKQ29kaW5nIHN0eWxlLgoKPiArICAgICAgICAgICAgcHJp bnRrKCJ6eW5xbXAtcG06IGZuPSVkIE5vIGFjY2VzcyB0byByZXNldCAlZFxuIiwgcG1fZm4sIHBt X2FyZ1swXSk7CgpTYW1lIGFzIGFib3ZlIGZvciB0aGUgcHJpbnRrLgoKPiArICAgICAgICAgICAg cmV0WzBdID0gUE1fUkVUX0VSUk9SX0FDQ0VTUzsKPiArICAgICAgICAgICAgZ290byBkb25lOwo+ ICsgICAgICAgIH0KPiArICAgICAgICBnb3RvIGZvcndhcmRfdG9fZnc7Cj4gKwo+ICsgICAgLyog VGhlc2UgY2FsbHMgYXJlIHNhZmUgYW5kIGFsd2F5cyBhbGxvd2VkLiAgKi8KPiArICAgIGNhc2Ug WllOUU1QX1NJUF9TVkNfQ0FMTF9DT1VOVDoKPiArICAgIGNhc2UgWllOUU1QX1NJUF9TVkNfVUlE Ogo+ICsgICAgY2FzZSBaWU5RTVBfU0lQX1NWQ19WRVJTSU9OOgo+ICsgICAgY2FzZSBQTV9HRVRf QVBJX1ZFUlNJT046Cj4gKyAgICBjYXNlIFBNX0dFVF9DSElQSUQ6Cj4gKyAgICAgICAgZ290byBm b3J3YXJkX3RvX2Z3Owo+ICsKPiArICAgIC8qIE1lZGlhdGVkIE1NSU8gYWNjZXNzLiAgKi8KPiAr ICAgIGNhc2UgUE1fTU1JT19XUklURToKPiArICAgICAgICBpc19tbWlvX3dyaXRlID0gdHJ1ZTsK PiArICAgIC8qIEZhbGx0aHJvdWdoLiAgKi8KPiArICAgIGNhc2UgUE1fTU1JT19SRUFEOgo+ICsg ICAgICAgIGlmICggIWRvbWFpbl9tZWRpYXRlX21taW9fYWNjZXNzKGN1cnJlbnQtPmRvbWFpbiwK PiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc19tbWlvX3dyaXRl LAo+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBtX2FyZ1swXSwg JnBtX2FyZ1sxXSkgKSB7CgpTZWUgYWJvdmUgZm9yIHRoZSBjb2Rpbmcgc3R5bGUuCgo+ICsgICAg ICAgICAgICBwcmludGsoImVlbWk6IGZuPSVkIE5vIGFjY2VzcyB0byBNTUlPICVzICV4XG4iLAo+ ICsgICAgICAgICAgICAgICAgICAgcG1fZm4sIGlzX21taW9fd3JpdGUgPyAid3JpdGUiIDogInJl YWQiLCBwbV9hcmdbMF0pOwoKU2VlIGFib3ZlIGZvciB0aGUgcHJpbnRrLiBBbHNvLCBwbGVhc2Ug dXNlICUjeCBpZiB5b3UgcHJpbnQgaGV4YSB0byBub3QgCmNvbmZ1c2Ugd2l0aCBkZWNpbWFsLiBC dXQgd2h5IGRvIHlvdSBwcmludCBwbV9hcmcgaW4gaGV4YSBoZXJlIGFuZCAKZGVjaW1hbCBhYm92 ZT8KCj4gKyAgICAgICAgICAgIHJldFswXSA9IFBNX1JFVF9FUlJPUl9BQ0NFU1M7Cj4gKyAgICAg ICAgICAgIGdvdG8gZG9uZTsKPiArICAgICAgICB9Cj4gKyAgICAgICAgZ290byBmb3J3YXJkX3Rv X2Z3Owo+ICsKPiArICAgIC8qIEV4Y2x1c2l2ZSB0byBEb20wLiAgKi8KPiArICAgIGNhc2UgUE1f SU5JVDoKPiArICAgIGNhc2UgUE1fU0VUX0NPTkZJR1VSQVRJT046Cj4gKyAgICBjYXNlIFBNX0ZQ R0FfTE9BRDoKPiArICAgIGNhc2UgUE1fRlBHQV9HRVRfU1RBVFVTOgo+ICsgICAgICAgIGlmICgg IWlzX2hhcmR3YXJlX2RvbWFpbihjdXJyZW50LT5kb21haW4pICkgewoKU2VlIGFib3ZlIGZvciB0 aGUgY29kaW5nIHN0eWxlLgoKPiArICAgICAgICAgICAgcHJpbnRrKCJlZW1pOiBmbj0lZCBObyBh Y2Nlc3MiLCBwbV9mbik7CgpTZWUgYWJvdmUgZm9yIHRoZSBwcmludGsuCgo+ICsgICAgICAgICAg ICByZXRbMF0gPSBQTV9SRVRfRVJST1JfQUNDRVNTOwo+ICsgICAgICAgICAgICBnb3RvIGRvbmU7 Cj4gKyAgICAgICAgfQo+ICsgICAgICAgIGdvdG8gZm9yd2FyZF90b19mdzsKPiArCj4gKyAgICAv KiBUaGVzZSBjYWxscyBhcmUgbmV2ZXIgYWxsb3dlZC4gICovCj4gKyAgICBjYXNlIFBNX1NZU1RF TV9TSFVURE9XTjoKPiArICAgICAgICByZXRbMF0gPSBQTV9SRVRfRVJST1JfQUNDRVNTOwo+ICsg ICAgICAgIGdvdG8gZG9uZTsKPiArCj4gKyAgICBkZWZhdWx0Ogo+ICsgICAgICAgIHByaW50aygi enlucW1wLXBtOiBVbmhhbmRsZWQgUE0gQ2FsbDogJWRcbiIsICh1MzIpZmlkKTsKClNlZSBhYm92 ZSBmb3IgdGhlIHByaW50ay4gQWxzbyB3aHkgZG8geW91IGNhc3QgZmlkPwoKPiArICAgICAgICBy ZXR1cm4gZmFsc2U7Cj4gKyAgICB9Cj4gKwo+ICtmb3J3YXJkX3RvX2Z3Ogo+ICsgICAgLyogUmUt ZW5jb2RlIHBtIGFyZ3MuICAqLwo+ICsgICAgYTAgPSAoKHVpbnQ2NF90KXBtX2FyZ1sxXSA8PCAz MikgfCBwbV9hcmdbMF07Cj4gKyAgICBhMSA9ICgodWludDY0X3QpcG1fYXJnWzNdIDw8IDMyKSB8 IHBtX2FyZ1syXTsKPiArICAgIGNhbGxfc21jYzY0KGZpZCwgYTAsIGExLCBhMiwgYTMsIGE0LCBh NSwgcmV0KTsKPiArZG9uZToKPiArICAgIHJldHVybiB0cnVlOwo+ICt9Cj4gKwo+ICsvKgo+ICsg KiBMb2NhbCB2YXJpYWJsZXM6Cj4gKyAqIG1vZGU6IEMKPiArICogYy1maWxlLXN0eWxlOiAiQlNE Igo+ICsgKiBjLWJhc2ljLW9mZnNldDogNAo+ICsgKiBpbmRlbnQtdGFicy1tb2RlOiBuaWwKPiAr ICogRW5kOgo+ICsgKi8KPiBkaWZmIC0tZ2l0IGEveGVuL2FyY2gvYXJtL3BsYXRmb3Jtcy94aWxp bngtenlucW1wLmMgYi94ZW4vYXJjaC9hcm0vcGxhdGZvcm1zL3hpbGlueC16eW5xbXAuYwo+IGlu ZGV4IDJhZGVlOTEuLmQ4MjYyODIgMTAwNjQ0Cj4gLS0tIGEveGVuL2FyY2gvYXJtL3BsYXRmb3Jt cy94aWxpbngtenlucW1wLmMKPiArKysgYi94ZW4vYXJjaC9hcm0vcGxhdGZvcm1zL3hpbGlueC16 eW5xbXAuYwo+IEBAIC0xOCw2ICsxOCw3IEBACj4gICAqLwo+Cj4gICNpbmNsdWRlIDxhc20vcGxh dGZvcm0uaD4KPiArI2luY2x1ZGUgPGFzbS9wbGF0Zm9ybXMveGlsaW54LXp5bnFtcC1lZW1pLmg+ Cj4KPiAgc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCB6eW5xbXBfZHRfY29tcGF0W10gX19pbml0 Y29uc3QgPQo+ICB7Cj4gQEAgLTMyLDggKzMzLDI1IEBAIHN0YXRpYyBjb25zdCBzdHJ1Y3QgZHRf ZGV2aWNlX21hdGNoIHp5bnFtcF9ibGFja2xpc3RfZGV2W10gX19pbml0Y29uc3QgPQo+ICAgICAg eyAvKiBzZW50aW5lbCAqLyB9LAo+ICB9Owo+Cj4gK2Jvb2wgenlucW1wX2h2YyhzdHJ1Y3QgY3B1 X3VzZXJfcmVncyAqcmVncykKClRoaXMgZnVuY3Rpb24gc2hvdWxkIGJlIHN0YXRpYy4KCj4gK3sK PiArICAgIHJlZ2lzdGVyX3QgcmV0WzRdID0geyAwIH07Cj4gKwo+ICsgICAgaWYgKCAhenlucW1w X2VlbWlfbWVkaWF0ZShyZWdzLT54MCwgcmVncy0+eDEsIHJlZ3MtPngyLCByZWdzLT54MywKPiAr ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVncy0+eDQsIHJlZ3MtPng1LCByZWdzLT54 NiwgcmV0KSApCj4gKyAgICAgICAgcmV0dXJuIGZhbHNlOwo+ICsKPiArICAgIC8qIFRyYW5zZmVy IHJldHVybiB2YWx1ZXMgaW50byBndWVzdCByZWdpc3RlcnMuICAqLwo+ICsgICAgcmVncy0+eDAg PSByZXRbMF07Cj4gKyAgICByZWdzLT54MSA9IHJldFsxXTsKPiArICAgIHJlZ3MtPngyID0gcmV0 WzJdOwo+ICsgICAgcmVncy0+eDMgPSByZXRbM107CgpOZXdsaW5lIGhlcmUgcGxlYXNlLgoKPiAr ICAgIHJldHVybiB0cnVlOwo+ICt9Cj4gKwo+ICBQTEFURk9STV9TVEFSVCh4Z2VuZV9zdG9ybSwg IlhpbGlueCBaeW5xTVAiKQo+ICAgICAgLmNvbXBhdGlibGUgPSB6eW5xbXBfZHRfY29tcGF0LAo+ ICsgICAgLmh2YyA9IHp5bnFtcF9odmMsCj4gICAgICAuYmxhY2tsaXN0X2RldiA9IHp5bnFtcF9i bGFja2xpc3RfZGV2LAo+ICBQTEFURk9STV9FTkQKPgo+IGRpZmYgLS1naXQgYS94ZW4vaW5jbHVk ZS9hc20tYXJtL3BsYXRmb3Jtcy94aWxpbngtenlucW1wLWVlbWkuaCBiL3hlbi9pbmNsdWRlL2Fz bS1hcm0vcGxhdGZvcm1zL3hpbGlueC16eW5xbXAtZWVtaS5oCj4gbmV3IGZpbGUgbW9kZSAxMDA2 NDQKPiBpbmRleCAwMDAwMDAwLi43NzQ1OTNjCj4gLS0tIC9kZXYvbnVsbAo+ICsrKyBiL3hlbi9p bmNsdWRlL2FzbS1hcm0vcGxhdGZvcm1zL3hpbGlueC16eW5xbXAtZWVtaS5oCgpbLi4uXQoKPiAr LyoqCj4gKyAqIEBQTV9SRVRfU1VDQ0VTUzoJCXN1Y2Nlc3MKPiArICogQFBNX1JFVF9FUlJPUl9B UkdTOgkJaWxsZWdhbCBhcmd1bWVudHMgcHJvdmlkZWQKPiArICogQFBNX1JFVF9FUlJPUl9BQ0NF U1M6CWFjY2VzcyByaWdodHMgdmlvbGF0aW9uCj4gKyAqIEBQTV9SRVRfRVJST1JfVElNRU9VVDoJ dGltZW91dCBpbiBjb21tdW5pY2F0aW9uIHdpdGggUE1VCj4gKyAqIEBQTV9SRVRfRVJST1JfTk9U U1VQUE9SVEVEOglmZWF0dXJlIG5vdCBzdXBwb3J0ZWQKPiArICogQFBNX1JFVF9FUlJPUl9QUk9D OgkJbm9kZSBpcyBub3QgYSBwcm9jZXNzb3Igbm9kZQo+ICsgKiBAUE1fUkVUX0VSUk9SX0FQSV9J RDoJaWxsZWdhbCBBUEkgSUQKPiArICogQFBNX1JFVF9FUlJPUl9PVEhFUjoJCW90aGVyIGVycm9y Cj4gKyAqLwo+ICtlbnVtIHBtX3JldF9zdGF0dXMgewo+ICsJUE1fUkVUX1NVQ0NFU1MsCgpJIGxv b2tlZCBhdCB0aGUgc3BlYyB5b3UgcHJvdmlkZSBpbiB0aGUgY29tbWl0IG1lc3NhZ2UgYW5kIEkg Y2Fubm90IGZpbmQgCnRob3NlIG5hbWUuIElzIGl0IHJlbGF0ZWQgdG8gRUVNSV9TVUNDRVNTPyBJ ZiBzbywgSSB3b3VsZCBwcmVmZXIgaWYgd2UgCnVzZSB0aGUgbmFtZSBmcm9tIHRoZSBzcGVjLgoK RnVydGhlcm1vcmUsIGl0IGRvZXMgbm90IHNlZW0gdGhhdCB2YWx1ZXMgYXJlIHByb3ZpZGVkIGlu IHRoZSBzcGVjLgoKPiArCVBNX1JFVF9FUlJPUl9BUkdTLAo+ICsJUE1fUkVUX0VSUk9SX0FDQ0VT UywKPiArCVBNX1JFVF9FUlJPUl9USU1FT1VULAo+ICsJUE1fUkVUX0VSUk9SX05PVFNVUFBPUlRF RCwKPiArCVBNX1JFVF9FUlJPUl9QUk9DLAo+ICsJUE1fUkVUX0VSUk9SX0FQSV9JRCwKPiArCVBN X1JFVF9FUlJPUl9GQUlMVVJFLAo+ICsJUE1fUkVUX0VSUk9SX0NPTU1VTklDLAo+ICsJUE1fUkVU X0VSUk9SX0RPVUJMRVJFUSwKPiArCVBNX1JFVF9FUlJPUl9PVEhFUiwKPiArfTsKClsuLi5dCgo+ IGRpZmYgLS1naXQgYS94ZW4vaW5jbHVkZS9hc20tYXJtL3BsYXRmb3Jtcy94aWxpbngtenlucW1w LW1tLmggYi94ZW4vaW5jbHVkZS9hc20tYXJtL3BsYXRmb3Jtcy94aWxpbngtenlucW1wLW1tLmgK PiBuZXcgZmlsZSBtb2RlIDEwMDY0NAo+IGluZGV4IDAwMDAwMDAuLjRmYjE2OTUKPiAtLS0gL2Rl di9udWxsCj4gKysrIGIveGVuL2luY2x1ZGUvYXNtLWFybS9wbGF0Zm9ybXMveGlsaW54LXp5bnFt cC1tbS5oCgpJIGZlZWwgYSBiaXQgdW5zdXJlIHRvIHNlZSB0aGF0IG1hbnkgaGFyZGNvZGVkIHZh bHVlcyBpbiBYZW4uIElzIGl0IHRoZSAKb25seSB3YXkgdG8gcmV0cmlldmUgdGhlIG1taW8vcG93 ZXIgaW5mb3JtYXRpb24/CgpSZWdhcmRzLAoKLS0gCkp1bGllbiBHcmFsbAoKX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KWGVuLWRldmVsIG1haWxpbmcgbGlz dApYZW4tZGV2ZWxAbGlzdHMueGVuLm9yZwpodHRwczovL2xpc3RzLnhlbi5vcmcveGVuLWRldmVs Cg==