From mboxrd@z Thu Jan 1 00:00:00 1970 From: "Jan Beulich" Subject: Re: [PATCH v3 5/9] xen/vpci: add handlers to map the BARs Date: Fri, 23 Jun 2017 02:58:28 -0600 Message-ID: <594CF45402000078001661F9@prv-mh.provo.novell.com> References: <20170427143546.14662-1-roger.pau@citrix.com> <20170427143546.14662-6-roger.pau@citrix.com> <591F29B4020000780015B5AE@prv-mh.provo.novell.com> <20170622171344.rqkk5daaeiwysiii@dhcp-3-128.uk.xensource.com> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: Received: from mail6.bemta3.messagelabs.com ([195.245.230.39]) by lists.xenproject.org with esmtp (Exim 4.84_2) (envelope-from ) id 1dOKQC-0002kN-36 for xen-devel@lists.xenproject.org; Fri, 23 Jun 2017 08:58:32 +0000 In-Reply-To: <20170622171344.rqkk5daaeiwysiii@dhcp-3-128.uk.xensource.com> Content-Disposition: inline List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Errors-To: xen-devel-bounces@lists.xen.org Sender: "Xen-devel" To: Roger Pau Monne Cc: StefanoStabellini , Wei Liu , George Dunlap , Andrew Cooper , IanJackson , Tim Deegan , julien.grall@arm.com, xen-devel@lists.xenproject.org, boris.ostrovsky@oracle.com List-Id: xen-devel@lists.xenproject.org Pj4+IE9uIDIyLjA2LjE3IGF0IDE5OjEzLCA8cm9nZXIucGF1QGNpdHJpeC5jb20+IHdyb3RlOgo+ IE9uIEZyaSwgTWF5IDE5LCAyMDE3IGF0IDA5OjIxOjU2QU0gLTA2MDAsIEphbiBCZXVsaWNoIHdy b3RlOgo+PiA+Pj4gT24gMjcuMDQuMTcgYXQgMTY6MzUsIDxyb2dlci5wYXVAY2l0cml4LmNvbT4g d3JvdGU6Cj4+ID4gK3N0YXRpYyBpbnQgdnBjaV9tb2RpZnlfYmFycyhzdHJ1Y3QgcGNpX2RldiAq cGRldiwgY29uc3QgYm9vbCBtYXApCj4+ID4gK3sKPj4gPiArICAgIHN0cnVjdCB2cGNpX2hlYWRl ciAqaGVhZGVyID0gJnBkZXYtPnZwY2ktPmhlYWRlcjsKPj4gPiArICAgIHVuc2lnbmVkIGludCBp Owo+PiA+ICsgICAgaW50IHJjID0gMDsKPj4gPiArCj4+ID4gKyAgICBmb3IgKCBpID0gMDsgaSA8 IEFSUkFZX1NJWkUoaGVhZGVyLT5iYXJzKTsgaSsrICkKPj4gPiArICAgIHsKPj4gPiArICAgICAg ICBwYWRkcl90IGdhZGRyID0gbWFwID8gaGVhZGVyLT5iYXJzW2ldLmdhZGRyCj4+ID4gKyAgICAg ICAgICAgICAgICAgICAgICAgICAgICA6IGhlYWRlci0+YmFyc1tpXS5tYXBwZWRfYWRkcjsKPj4g PiArICAgICAgICBwYWRkcl90IHBhZGRyID0gaGVhZGVyLT5iYXJzW2ldLnBhZGRyOwo+PiA+ICsK Pj4gPiArICAgICAgICBpZiAoIGhlYWRlci0+YmFyc1tpXS50eXBlICE9IFZQQ0lfQkFSX01FTSAm Jgo+PiA+ICsgICAgICAgICAgICAgaGVhZGVyLT5iYXJzW2ldLnR5cGUgIT0gVlBDSV9CQVJfTUVN NjRfTE8gKQo+PiA+ICsgICAgICAgICAgICBjb250aW51ZTsKPj4gPiArCj4+ID4gKyAgICAgICAg cmMgPSBtb2RpZnlfbW1pbyhwZGV2LT5kb21haW4sIF9nZm4oUEZOX0RPV04oZ2FkZHIpKSwKPj4g PiArICAgICAgICAgICAgICAgICAgICAgICAgIF9tZm4oUEZOX0RPV04ocGFkZHIpKSwgUEZOX1VQ KGhlYWRlci0+YmFyc1tpXS5zaXplKSwKPj4gCj4+IFRoZSBQRk5fVVAoKSBpbmRpY2F0ZXMgYSBw cm9ibGVtOiBGb3Igc3ViLXBhZ2UgQkFScyB5b3UgY2FuJ3QKPj4gYmxpbmRseSBtYXAvdW5tYXAg dGhlbSB3aXRob3V0IHRha2luZyBpbnRvIGNvbnNpZGVyYXRpb24gb3RoZXIKPj4gZGV2aWNlcyBz aGFyaW5nIHRoZSBzYW1lIHBhZ2UuCj4gCj4gSSdtIG5vdCBzdXJlIEkgZm9sbG93LCB0aGUgc3Rh cnQgYWRkcmVzcyBvZiBCQVJzIGlzIGFsd2F5cyBhbGlnbmVkIHRvCj4gYSA0S0IgYm91bmRhcnks IHNvIHRoZXJlJ3Mgbm8gY2hhbmNlIG9mIHRoZSBzYW1lIHBhZ2UgYmVpbmcgdXNlZCBieQo+IHR3 byBkaWZmZXJlbnQgQkFScyBhdCB0aGUgc2FtZSB0aW1lLgoKSSdtIG5vdCBzdXJlIHdoZXJlIHlv dSdyZSB0YWtpbmcgdGhpcyBmcm9tLiBNb2Rlcm4gQklPU2VzIG1heQphaW0gYXQgZG9pbmcgc28s IGJ1dCBmb3Igb25lIEknbSBzdXJlIEkndmUgc2VlbiBzbWFsbGVyIGFsaWdubWVudApxdWl0ZSBv ZnRlbiBvbiBvbGRlciBtYWNoaW5lcywgYW5kIHRoZW4gbXkgbW9zdCBtb2Rlcm4gQU1ECm9uZSBo YXMgdGhlc2UgdGhyZWUgZGV2aWNlcywgZm9yIGV4YW1wbGU6CgowMDoxMS4wIFNBVEEgY29udHJv bGxlcjogQWR2YW5jZWQgTWljcm8gRGV2aWNlcyBbQU1EXSBuZWUgQVRJIFNCN3gwL1NCOHgwL1NC OXgwIFNBVEEgQ29udHJvbGxlciBbQUhDSSBtb2RlXSAocHJvZy1pZiAwMSBbQUhDSSAxLjBdKQoJ U3Vic3lzdGVtOiBBZHZhbmNlZCBNaWNybyBEZXZpY2VzIFtBTURdIG5lZSBBVEkgU0I3eDAvU0I4 eDAvU0I5eDAgU0FUQSBDb250cm9sbGVyIFtBSENJIG1vZGVdCglDb250cm9sOiBJL08rIE1lbSsg QnVzTWFzdGVyKyBTcGVjQ3ljbGUtIE1lbVdJTlYtIFZHQVNub29wLSBQYXJFcnItIFN0ZXBwaW5n LSBTRVJSLSBGYXN0QjJCLSBEaXNJTlR4LQoJU3RhdHVzOiBDYXArIDY2TUh6KyBVREYtIEZhc3RC MkItIFBhckVyci0gREVWU0VMPW1lZGl1bSA+VEFib3J0LSA8VEFib3J0LSA8TUFib3J0LSA+U0VS Ui0gPFBFUlItIElOVHgtCglMYXRlbmN5OiA2NAoJSW50ZXJydXB0OiBwaW4gQSByb3V0ZWQgdG8g SVJRIDIyCglSZWdpb24gMDogSS9PIHBvcnRzIGF0IDI0MzAgW3NpemU9OF0KCVJlZ2lvbiAxOiBJ L08gcG9ydHMgYXQgMjQyNCBbc2l6ZT00XQoJUmVnaW9uIDI6IEkvTyBwb3J0cyBhdCAyNDI4IFtz aXplPThdCglSZWdpb24gMzogSS9PIHBvcnRzIGF0IDI0MjAgW3NpemU9NF0KCVJlZ2lvbiA0OiBJ L08gcG9ydHMgYXQgMjQwMCBbc2l6ZT0xNl0KCVJlZ2lvbiA1OiBNZW1vcnkgYXQgYzgwMTQwMDAg KDMyLWJpdCwgbm9uLXByZWZldGNoYWJsZSkgW3NpemU9MUtdCglDYXBhYmlsaXRpZXM6IFs2MF0g UG93ZXIgTWFuYWdlbWVudCB2ZXJzaW9uIDIKCQlGbGFnczogUE1FQ2xrLSBEU0krIEQxLSBEMi0g QXV4Q3VycmVudD0wbUEgUE1FKEQwLSxEMS0sRDItLEQzaG90LSxEM2NvbGQtKQoJCVN0YXR1czog RDAgTm9Tb2Z0UnN0LSBQTUUtRW5hYmxlLSBEU2VsPTAgRFNjYWxlPTAgUE1FLQoJQ2FwYWJpbGl0 aWVzOiBbNzBdIFNBVEEgSEJBIHYxLjAgSW5DZmdTcGFjZQoJS2VybmVsIGRyaXZlciBpbiB1c2U6 IGFoY2kKCUtlcm5lbCBtb2R1bGVzOiBhaGNpCgowMDoxMi4yIFVTQiBjb250cm9sbGVyOiBBZHZh bmNlZCBNaWNybyBEZXZpY2VzIFtBTURdIG5lZSBBVEkgU0I3eDAvU0I4eDAvU0I5eDAgVVNCIEVI Q0kgQ29udHJvbGxlciAocHJvZy1pZiAyMCBbRUhDSV0pCglTdWJzeXN0ZW06IEFkdmFuY2VkIE1p Y3JvIERldmljZXMgW0FNRF0gbmVlIEFUSSBTQjd4MC9TQjh4MC9TQjl4MCBVU0IgRUhDSSBDb250 cm9sbGVyCglDb250cm9sOiBJL08rIE1lbSsgQnVzTWFzdGVyKyBTcGVjQ3ljbGUtIE1lbVdJTlYr IFZHQVNub29wLSBQYXJFcnItIFN0ZXBwaW5nLSBTRVJSLSBGYXN0QjJCLSBEaXNJTlR4LQoJU3Rh dHVzOiBDYXArIDY2TUh6KyBVREYtIEZhc3RCMkIrIFBhckVyci0gREVWU0VMPW1lZGl1bSA+VEFi b3J0LSA8VEFib3J0LSA8TUFib3J0LSA+U0VSUi0gPFBFUlItIElOVHgtCglMYXRlbmN5OiA2NCwg Q2FjaGUgTGluZSBTaXplOiAzMiBieXRlcwoJSW50ZXJydXB0OiBwaW4gQiByb3V0ZWQgdG8gSVJR IDE3CglSZWdpb24gMDogTWVtb3J5IGF0IGM4MDE0NDAwICgzMi1iaXQsIG5vbi1wcmVmZXRjaGFi bGUpIFtzaXplPTI1Nl0KCUNhcGFiaWxpdGllczogW2MwXSBQb3dlciBNYW5hZ2VtZW50IHZlcnNp b24gMgoJCUZsYWdzOiBQTUVDbGstIERTSS0gRDErIEQyKyBBdXhDdXJyZW50PTBtQSBQTUUoRDAr LEQxKyxEMissRDNob3QrLEQzY29sZC0pCgkJU3RhdHVzOiBEMCBOb1NvZnRSc3QtIFBNRS1FbmFi bGUtIERTZWw9MCBEU2NhbGU9MCBQTUUtCgkJQnJpZGdlOiBQTS0gQjMrCglDYXBhYmlsaXRpZXM6 IFtlNF0gRGVidWcgcG9ydDogQkFSPTEgb2Zmc2V0PTAwZTAKCUtlcm5lbCBkcml2ZXIgaW4gdXNl OiBlaGNpX2hjZAoJS2VybmVsIG1vZHVsZXM6IGVoY2ktaGNkCgowMDoxMy4yIFVTQiBjb250cm9s bGVyOiBBZHZhbmNlZCBNaWNybyBEZXZpY2VzIFtBTURdIG5lZSBBVEkgU0I3eDAvU0I4eDAvU0I5 eDAgVVNCIEVIQ0kgQ29udHJvbGxlciAocHJvZy1pZiAyMCBbRUhDSV0pCglTdWJzeXN0ZW06IEFk dmFuY2VkIE1pY3JvIERldmljZXMgW0FNRF0gbmVlIEFUSSBTQjd4MC9TQjh4MC9TQjl4MCBVU0Ig RUhDSSBDb250cm9sbGVyCglDb250cm9sOiBJL08rIE1lbSsgQnVzTWFzdGVyKyBTcGVjQ3ljbGUt IE1lbVdJTlYrIFZHQVNub29wLSBQYXJFcnItIFN0ZXBwaW5nLSBTRVJSLSBGYXN0QjJCLSBEaXNJ TlR4LQoJU3RhdHVzOiBDYXArIDY2TUh6KyBVREYtIEZhc3RCMkIrIFBhckVyci0gREVWU0VMPW1l ZGl1bSA+VEFib3J0LSA8VEFib3J0LSA8TUFib3J0LSA+U0VSUi0gPFBFUlItIElOVHgtCglMYXRl bmN5OiA2NCwgQ2FjaGUgTGluZSBTaXplOiAzMiBieXRlcwoJSW50ZXJydXB0OiBwaW4gQiByb3V0 ZWQgdG8gSVJRIDE5CglSZWdpb24gMDogTWVtb3J5IGF0IGM4MDE0ODAwICgzMi1iaXQsIG5vbi1w cmVmZXRjaGFibGUpIFtzaXplPTI1Nl0KCUNhcGFiaWxpdGllczogW2MwXSBQb3dlciBNYW5hZ2Vt ZW50IHZlcnNpb24gMgoJCUZsYWdzOiBQTUVDbGstIERTSS0gRDErIEQyKyBBdXhDdXJyZW50PTBt QSBQTUUoRDArLEQxKyxEMissRDNob3QrLEQzY29sZC0pCgkJU3RhdHVzOiBEMCBOb1NvZnRSc3Qt IFBNRS1FbmFibGUtIERTZWw9MCBEU2NhbGU9MCBQTUUtCgkJQnJpZGdlOiBQTS0gQjMrCglDYXBh YmlsaXRpZXM6IFtlNF0gRGVidWcgcG9ydDogQkFSPTEgb2Zmc2V0PTAwZTAKCUtlcm5lbCBkcml2 ZXIgaW4gdXNlOiBlaGNpX2hjZAoJS2VybmVsIG1vZHVsZXM6IGVoY2ktaGNkCgo+IFRoZSBzaXpl IGlzIGluZGVlZCBub3QgYWxpZ25lZCB0byA0S0IsIGJ1dCBJIGRvbid0IHNlZSBob3cgdGhpcyBj YW4KPiBjYXVzZSBjb2xsaXNpb25zIHdpdGggb3RoZXIgQkFScyB1bmxlc3MgdGhlIGRvbWFpbiBp cyBhY3RpdmVseSB0cnlpbmcKPiB0byBtYWtlIHRoZSBCQVJzIG92ZXJsYXAsIGluIHdoaWNoIGNh c2UgdGhlcmUncyBub3QgbXVjaCBYZW4gY2FuIGRvLgoKVGhlIGFib3ZlIGlzIG5vdCB3aGF0IERv bTAgZGlkLCBidXQgaG93IHRoZSBzeXN0ZW0gYm9vdHMgdXAuCkFuZCB0aGlzICJ0aGVyZSdzIG5v dCBtdWNoIFhlbiBjYW4gZG8iIGlzIHdoYXQgSSd2ZSBiZWVuIHRyeWluZwp0byBnZXQgYXQgd2l0 aCBteSBjb21tZW50OiBBIHNvbHV0aW9uIGlzIG5lZWRlZCBoZXJlIGZvciB5b3VyCmFwcHJvYWNo IHRvIHZQQ0kgaGFuZGxpbmcgdG8gYmUgdmlhYmxlLgoKPj4gPiArc3RhdGljIGludCB2cGNpX2Nt ZF93cml0ZShzdHJ1Y3QgcGNpX2RldiAqcGRldiwgdW5zaWduZWQgaW50IHJlZywKPj4gPiArICAg ICAgICAgICAgICAgICAgICAgICAgICB1bmlvbiB2cGNpX3ZhbCB2YWwsIHZvaWQgKmRhdGEpCj4+ ID4gK3sKPj4gPiArICAgIHN0cnVjdCB2cGNpX2hlYWRlciAqaGVhZGVyID0gZGF0YTsKPj4gPiAr ICAgIHVpbnQxNl90IG5ld19jbWQsIHNhdmVkX2NtZDsKPj4gPiArICAgIHVpbnQ4X3Qgc2VnID0g cGRldi0+c2VnLCBidXMgPSBwZGV2LT5idXM7Cj4+ID4gKyAgICB1aW50OF90IHNsb3QgPSBQQ0lf U0xPVChwZGV2LT5kZXZmbiksIGZ1bmMgPSBQQ0lfRlVOQyhwZGV2LT5kZXZmbik7Cj4+ID4gKyAg ICBpbnQgcmM7Cj4+ID4gKwo+PiA+ICsgICAgbmV3X2NtZCA9IHZhbC53b3JkOwo+PiA+ICsgICAg c2F2ZWRfY21kID0gaGVhZGVyLT5jb21tYW5kOwo+PiA+ICsKPj4gPiArICAgIGlmICggISgobmV3 X2NtZCBeIHNhdmVkX2NtZCkgJiBQQ0lfQ09NTUFORF9NRU1PUlkpICkKPj4gPiArICAgICAgICBn b3RvIG91dDsKPj4gPiArCj4+ID4gKyAgICAvKiBNZW1vcnkgc3BhY2UgYWNjZXNzIGNoYW5nZS4g Ki8KPj4gPiArICAgIHJjID0gdnBjaV9tb2RpZnlfYmFycyhwZGV2LCBuZXdfY21kICYgUENJX0NP TU1BTkRfTUVNT1JZKTsKPj4gPiArICAgIGlmICggcmMgKQo+PiA+ICsgICAgewo+PiA+ICsgICAg ICAgIGRwcmludGsoWEVOTE9HX0VSUiwKPj4gPiArICAgICAgICAgICAgICAgICIlMDR4OiUwMng6 JTAyeC4ldTp1bmFibGUgdG8gJXNtYXAgQkFSczogJWRcbiIsCj4+ID4gKyAgICAgICAgICAgICAg ICBzZWcsIGJ1cywgc2xvdCwgZnVuYywKPj4gPiArICAgICAgICAgICAgICAgIG5ld19jbWQgJiBQ Q0lfQ09NTUFORF9NRU1PUlkgPyAiIiA6ICJ1biIsIHJjKTsKPj4gPiArICAgICAgICByZXR1cm4g cmM7Cj4+IAo+PiBJIGd1ZXNzIHlvdSBjYW4gZ3Vlc3MgdGhlIHF1ZXN0aW9uIGFscmVhZHk6IFdo YXQgaXMgdGhlIGJhcmUKPj4gaGFyZHdhcmUgZXF1aXZhbGVudCBvZiB0aGlzIGZhaWx1cmUgcmV0 dXJuPwo+IAo+IFllcywgdGhpcyBpcyBhbHJlYWR5IGZpeGVkIHNpbmNlIHdyaXRlIGhhbmRsZXJz IHNpbXBseSByZXR1cm4gdm9pZC4KPiBUaGUgaHcgZXF1aXZhbGVudCB3b3VsZCBiZSB0byBpZ25v cmUgdGhlIHdyaXRlIEFGQUlDVCAoaWU6IG1lbW9yeQo+IGRlY29kaW5nIHdpbGwgbm90IGJlIGVu YWJsZWQpLgo+IAo+IEFyZSB5b3UgZmluZSB3aXRoIHRoZSBkcHJpbnRrIG9yIHdvdWxkIHlvdSBh bHNvIGxpa2UgbWUgdG8gcmVtb3ZlCj4gdGhhdD8gKElNSE8gaXQncyBoZWxwZnVsIGZvciBkZWJ1 Z2dpbmcpLgoKSSB0aGluayBpdCBjYW4gc3RheSB0aGVyZSBmb3IgdGhlIGluaXRpYWwgcGhhc2Uu IExhdGVyIChiZWZvcmUKZGVjbGFyaW5nIFBWSHYyIGZ1bGx5IHN1cHBvcnRlZCkgd2UgbWF5IHdh bnQgdG8gcmUtY29uc2lkZXIKd2hpY2ggb2Ygc3VjaCBtZXNzYWdlcyBhcmUgdXNlZnVsIHRvIGtl ZXAuCgo+PiA+ICtzdGF0aWMgaW50IHZwY2lfYmFyX3dyaXRlKHN0cnVjdCBwY2lfZGV2ICpwZGV2 LCB1bnNpZ25lZCBpbnQgcmVnLAo+PiA+ICsgICAgICAgICAgICAgICAgICAgICAgICAgIHVuaW9u IHZwY2lfdmFsIHZhbCwgdm9pZCAqZGF0YSkKPj4gPiArewo+PiA+ICsgICAgc3RydWN0IHZwY2lf YmFyICpiYXIgPSBkYXRhOwo+PiA+ICsgICAgdWludDMyX3Qgd2RhdGEgPSB2YWwuZG91YmxlX3dv cmQ7Cj4+ID4gKyAgICBib29sIGhpID0gZmFsc2UsIHVuc2V0ID0gZmFsc2U7Cj4+ID4gKwo+PiA+ ICsgICAgQVNTRVJUKGJhci0+dHlwZSA9PSBWUENJX0JBUl9NRU0gfHwgYmFyLT50eXBlID09IFZQ Q0lfQkFSX01FTTY0X0xPIHx8Cj4+ID4gKyAgICAgICAgICAgYmFyLT50eXBlID09IFZQQ0lfQkFS X01FTTY0X0hJKTsKPj4gPiArCj4+ID4gKyAgICBpZiAoIHdkYXRhID09IEdFTk1BU0soMzEsIDAp ICkKPj4gCj4+IEknbSBhZnJhaWQgdGhpcyBhZ2FpbiBkb2Vzbid0IG1hdGNoIHJlYWwgaGFyZHdh cmUgYmVoYXZpb3I6IEFzIHRoZQo+PiBsb3cgYml0cyBhcmUgci9vLCB3cml0ZXMgd2l0aCB0aGVt IGhhdmluZyBhbnkgdmFsdWUsIGJ1dCBhbGwgb3RoZXIKPj4gYml0cyBiZWluZyAxIHNob3VsZCBo YXZlIHRoZSBzYW1lIGVmZmVjdC4gSSBub3RpY2UgdGhhdCB3aGlsZSBJIGhhZAo+PiBmaXhlZCB0 aGlzIGZvciB0aGUgUk9NIEJBUiBpbiBMaW51eCdlcyBwY2liYWNrLCBJIHNob3VsZCBoYXZlIGFs c28KPj4gZml4ZWQgdGhpcyBmb3Igb3JkaW5hcnkgb25lcy4KPiAKPiBJJ3ZlIGNoYW5nZWQgdGhp cyB0bzoKPiAKPiAgICAgc3dpdGNoICggYmFyLT50eXBlICkKPiAgICAgewo+ICAgICBjYXNlIFZQ Q0lfQkFSX01FTToKPiAgICAgICAgIHNpemVfbWFzayA9IEdFTk1BU0soMzEsIDEyKTsKClJlbGF0 aW5nIHRvIHRoZSBjb21tZW50IGZ1cnRoZXIgdXAgLSB3aGVyZSdzIHRoaXMgMTIgY29taW5nIGZy b20/Cgo+ICAgICAgICAgYnJlYWs7Cj4gICAgIGNhc2UgVlBDSV9CQVJfTUVNNjRfTE86Cj4gICAg ICAgICBzaXplX21hc2sgPSBHRU5NQVNLKDMxLCAyNik7CgpBbmQgdGhpcyAyNj8KCj4gICAgICAg ICBicmVhazsKPiAgICAgY2FzZSBWUENJX0JBUl9NRU02NF9ISToKPiAgICAgICAgIHNpemVfbWFz ayA9IEdFTk1BU0soMzEsIDApOwo+ICAgICAgICAgYnJlYWs7Cj4gICAgIGRlZmF1bHQ6Cj4gICAg ICAgICBBU1NFUlRfVU5SRUFDSEFCTEUoKTsKPiAgICAgICAgIGJyZWFrOwoKWW91IHdhbnQgdG8g cmV0dXJuIGhlcmUuCgo+PiA+ICsgICAgfQo+PiA+ICsKPj4gPiArICAgIEFTU0VSVChJU19BTElH TkVEKGJhci0+Z2FkZHIsIFBBR0VfU0laRSkpOwo+PiAKPj4gVXJnaC4KPiAKPiBSZW1vdmVkLgoK V2l0aCB5b3VyIGNvbW1lbnQgZnVydGhlciB1cCwgeW91IHNob3VsZCBoYXZlIHJlZnVzZWQgdG8g ZG8gc28KKGkuZS4gSSdtIGdldHRpbmcgdGhlIGltcHJlc3Npb24geW91J3JlIG5vdCByZWFsbHkg c3VyZSBhYm91dCB0aGF0CnN1cHBvc2VkIDRrIGFsaWdubWVudCkuCgo+PiA+ICsgICAgICAgIGlm ICggKGJhcnNbaV0udHlwZSA9PSBWUENJX0JBUl9NRU0gJiYgYWRkciA9PSBHRU5NQVNLKDMxLCAx MikpIHx8Cj4+ID4gKyAgICAgICAgICAgICBhZGRyID09IEdFTk1BU0soNjMsIDI2KSApCj4+IAo+ PiBXaGVyZSBpcyB0aGlzIDI2IGNvbWluZyBmcm9tPwo+PiAKPj4gUGVyaGFwcwo+PiAKPj4gICAg IGlmICggYWRkciA9PSBHRU5NQVNLKGJhcnNbaV0udHlwZSA9PSBWUENJX0JBUl9NRU0gPyAzMSA6 IDYzLCAxMikgKQo+IAo+IEknbSBjaGVja2luZyB0aGUgbWVtb3J5IGRlY29kZSBiaXQgaGVyZSBp bnN0ZWFkIGluIG9yZGVyIHRvIGZpZ3VyZSBvdXQKPiBpZiB0aGUgQkFSIGlzIG5vdCBwb3NpdGlv bmVkLgo+IAo+PiA/IEFsYmVpdCBJJ20gdW5jb252aW5jZWQgR0VOTUFTSygpIGlzIHVzZWZ1bCB0 byBiZSB1c2VkIGhlcmUgYW55d2F5Cj4+IChzZWUgYWxzbyBiZWxvdykuCj4gCj4gUmlnaHQsIHJl Z2FyZGxlc3Mgb2YgdGhlIHNwZWNpZmljIHVzYWdlIGFib3ZlLCB3aGF0IHdvdWxkIHlvdQo+IHJl Y29tbWVuZCByZWdhcmRpbmcgdGhlIHVzYWdlIG9mIEdFTk1BU0s/Cj4gCj4gSnVsaWVuIHN1Z2dl c3RlZCBpbnRyb2R1Y2luZyBHRU5NQVNLX1VMTC4gU2hvdWxkIEkgZ28gdGhhdCByb3V0ZSwgb3IK PiBpbnRyb2R1Y2Ugc29tZXRoaW5nIGxvY2FsbHkgZm9yIHZQQ0k/CgpCYWNrIHdoZW4gR0VOTUFT SygpIHdhcyBpbnRyb2R1Y2VkIHRvIG91ciBjb2RlIGJhc2UgSSd2ZQphbHJlYWR5IGluZGljYXRl ZCB0aGF0IEknbSBub3QgcmVhbGx5IGluIGZhdm9yIG9mIGl0LiBJIGRvbid0IHRoaW5rCml0IHJl YWxseSBoZWxwcyByZWFkYWJpbGl0eSBhbGwgdGhhdCBtdWNoICh0byBtZSwgcGxhaW4gaGV4Cm51 bWJlcnMgYXJlIGVhc2llciB0byBncm9rLCBhbGJlaXQgSSBhZG1pdCBvbmVzIGV4dGVuZGluZwpi ZXlvbmQgOCBvciAxMCBkaWdpdHMgYXJlIGxlc3MgZWFzeSB0byBkaWdlc3Q7IHNhZGx5IHRoZSBv bmNlCnByb3Bvc2VkIFtieSBJbnRlbCwgSSB0aGluaywgaW4gdGhlIGVhcmx5IGlhNjQgZGF5c10g bGFuZ3VhZ2UKZXh0ZW5zaW9uIHRvIHBlcm1pdCBfIHNlcGFyYXRvcnMgaW4gbnVtYmVycyBkb2Vz bid0IGFwcGVhcgp0byBoYXZlIG1hZGUgaXQgYW55d2hlcmUpLgoKPj4gPiArICAgICAgICB9IGJh cnNbNl07Cj4+IAo+PiBXaGF0IGFib3V0IHRoZSBST00gYW5kIFNSLUlPViBvbmVzPwo+IAo+IEkn dmUgaW1wbGVtZW50ZWQgc3VwcG9ydCBmb3IgdGhlIGV4cGFuc2lvbiBST00gQkFSICh3aGljaCBJ IHN0aWxsIG5lZWQKPiB0byBmaWd1cmUgb3V0IGhvdyB0byB0ZXN0KSwKClRoZXJlIHNob3VsZCBi ZSBoYXJkbHkgYW55IGdyYXBoaWNzIGNhcmQgd2l0aG91dCBhIFJPTS4gRm9yCnJlbW90ZSBib290 IHB1cnBvc2VzIGFsc28gbW9zdCBOSUNzIGNvbWUgd2l0aCBhIFJPTSwgYWxiZWl0Cm1hbnkgQklP U2VzIGFsbG93IHR1cm5pbmcgaXQgb2ZmLiBNb3N0IFNDU0kgY2FyZHMgSSd2ZSBzZWVtCmhhdmUg YSAoY29uZmlndXJhdGlvbikgUk9NIHRvby4KCj4gYnV0IEkgd291bGQgbGlrZSB0byBkZWZlciBT Ui1JT1YgZm9yIGxhdGVyCj4gYmVjYXVzZSBpdCBpbnZvbHZlcyBhIG5vbi10cml2aWFsIGFtb3Vu dCBvZiB3b3JrLCBhbmQgd2l0aCB0aGlzIHNlcmllcwo+IG9uZSBjYW4gYWxyZWFkeSBib290IGEg UFZIIERvbTAgKG1pbnVzIFNSLUlPViBvZiBjb3Vyc2UpLgoKVGhhdCdzIGxpa2VseSBva2F5IGFz IGxvbmcgYXMgdGhlcmUncyBhIHN1aXRhYmxlLCBtdWNoIGJlbG92ZWQKImZpeG1lIiBjb21tZW50 IHNvbWV3aGVyZS4KCkphbgoKX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX18KWGVuLWRldmVsIG1haWxpbmcgbGlzdApYZW4tZGV2ZWxAbGlzdHMueGVuLm9yZwpo dHRwczovL2xpc3RzLnhlbi5vcmcveGVuLWRldmVsCg==