Re: XDP CPU maps & shared umem
Yuval El-Hanany <[email protected]> Wed, 29 May 2024 07:51:43 +0000
| Newsgroups | org.kernel.vger.xdp-newbies |
|---|---|
| Message-ID | <[email protected]> |
WWVhaCwNCiAgICAgICAgSSB0b3RhbGx5IGFncmVlLiBJIGRpZG7igJl0IGtub3cgaWYgdGhlcmXi gJlzIHJvb20gZm9yIHRoZSB4ZHBfZnJhbWUgdG8gYWRkIG1vcmUgc3BhY2UsIHRoYXTigJlzIHdo eSBJIG9wdGVkIHRvIHNhdmUgc3BhY2UgYW5kIHBpZ2d5YmFjayB0aGVyZSBidXQgSSBkaWRu4oCZ dCBsaWtlIGl0LiBJIHdhc27igJl0IHRvbyBjb25jZXJuZWQgYWJvdXQgdGhlIGJpdCBmaWVsZHMg YXMgaXTigJlzIDE2IGJpdCBhbGlnbmVkLiBTdXJlIEkgY2FuIHJld29yayB0aGUgcGF0Y2guIFlv deKAmXJlIG5vdCBjb25jZXJuZWQgYWJvdXQgaGF2aW5nIGEgc2hhcmVkIHJ4X3F1ZXVlPyBZb3Ug aGF2ZSBhIG1vcmUgY29tcHJlaGVuc2l2ZSB2aWV3IG9mIHRoZSBjb2RlLg0KDQogICAgICAgIEkg ZGlkbuKAmXQga25vdyB0aGUgeGRwX2ZyYW1lIGlzIHN0b3JlZCBpbiB0aGUgaGVhZHJvb20uIElm IGl04oCZcyBzdG9yZWQgYXQgdGhlIGhlYWQgb2YgdGhlIHBhY2tldCwgdGhpcyBtZWFucyB0aGUg Y29uc3RydWN0aW9uIG9mIHRoZSB4ZHBfYnVmZiBpbiB0aGUgbG9vcCBjYXVzZXMgbWVtb3J5IGFj Y2VzcyB0byB0aGUgcGFja2V0cyBtZW1vcnkgd2hpY2ggYXJlIG5vdCBzdG9yZWQgc2VxdWVudGlh bGx5LiBQZXJoYXBzIGl04oCZcyB3b3J0aCBhZGRpbmcgcHJlZmV0Y2g/IEkgZGlkIHBhY2tldCBw cmVmZXRjaCBpbiBteSB1c2VyIGNvZGUgYW5kIGl0IGRpZCB3b25kZXJzIHdoZW4gdXNpbmcgeHNr LiBUaGUgWERQIHByb2dyYW1zIGFyZSBub3QgYW50aWNpcGF0ZWQgdG8gYmUgaHVnZSBkYXRhIHBy b2Nlc3NpbmcgY29kZSBzbyB0aGUgcHJlZmV0Y2ggaGFzIHBvdGVudGlhbCB0byBtYWtlIGEgZGlm ZmVyZW5jZS4NCg0KICAgICAgICBDaGVlcnMsDQogICAgICAgICAgICAgICAgWXV2YWwuDQoNCihP bmNlIGFnYWluIHBsYWluIHRleHQgcmVzZW5k4oCmKQ0KDQo+IE9uIDI5IE1heSAyMDI0LCBhdCA5 OjU3LCBNYWdudXMgS2FybHNzb24gPG1hZ251cy5rYXJsc3NvbkBnbWFpbC5jb20+IHdyb3RlOg0K Pg0KPiBDQVVUSU9OOkV4dGVybmFsIEVtYWlsLCBEbyBub3QgY2xpY2sgb24gbGlua3Mgb3Igb3Bl biBhdHRhY2htZW50cyB1bmxlc3MgeW91IHJlY29nbml6ZSB0aGUgc2VuZGVyIGFuZCBrbm93IHRo ZSBjb250ZW50IGlzIHNhZmUuDQo+DQo+IE9uIFR1ZSwgMjggTWF5IDIwMjQgYXQgMTg6MDMsIFl1 dmFsIEVsLUhhbmFueSA8eXV2YWxlQHJhZHdhcmUuY29tPiB3cm90ZToNCj4+DQo+PiBIaSwNCj4+ ICAgICAgICB0aGlzIGlzIG15IHRlbXBvcmFyeSBwYXRjaCB0byBnZXQgdGhlIHJlY2VpdmUgcXVl dWUgYWNyb3NzIHRoZSBDUFUtcy4gSeKAmW0gbm90IHN1cmUgSSByZWNvbW1lbmQgaXQuIEkgYXZv aWRlZCBpbmNyZWFzaW5nIHRoZSBmcmFtZSBzaXplIGJ5IHBpZ2d5IGJhY2tpbmcgb24gdGhlIG1l bW9yeSBtb2RlbCB0eXBlIHdoaWNoIHBsYWNlcyBkYXRhIGluIG5vbiByZWxldmFudCBzdHJ1Y3R1 cmVzLiBJdCBhbHNvIGxpbWl0cyB0aGUgcmVjZWl2ZSBxdWV1ZSBpbmRleCB0byB1MTYgKDI0IGJp dHMgd291bGQgYWxzbyBiZSBwb3NzaWJsZSkuIEl0IGRvZXMgd29yayBhbmQgdHJhZmZpYyBpcyBy dW5uaW5nIChJ4oCZbGwgcHJvYmFibHkgaGF2ZSBhIGZvbGxvd3VwIHF1ZXN0aW9uIG9uIHBlcmZv cm1hbmNlIEkgZXhwZWN0ZWQgYmV0dGVyIGJ1dCBJJ2xsIGRvIHNvbWUgbW9yZSB0ZXN0aW5nKS4g QW5vdGhlciBpc3N1ZSAtIGl0IHVwZGF0ZXMgdGhlIHJ4cSBpbiB4ZHBfYnVmZi4gSW4gdGhlIGNv bnRleHQgb2YgY3B1bWFwIGl04oCZcyBva2F5IGFzIHJ4cSBpcyBvbmx5IHVzZWQgaW1tZWRpYXRl bHkgaW4gdGhlIGxvb3AgYW5kIGRpc2NhcmRlZCBhZnRlciB0aGUgbG9vcC4gSSBoYXZlbuKAmXQg Zm91bmQgYW55d2hlcmUgaXTigJlzIHdyb25nLiBCdXQgdGhlb3JldGljYWxseSByeHEgbWF5IGhh dmUgYSBsb25nZXIgdGltZXNwYW4sIGFuZCBtYXkgYmUgc2hhcmVkIGFjcm9zcyBtdWx0aXBsZSBi dWZmZXJzLiBNb2RpZnlpbmcgaXQsIG1heSBhZmZlY3Qgb3RoZXIgYnVmZmVycyB0aGF0IGJlbG9u ZyB0byBkaWZmZXJlbnQgcmVjZWl2ZSBxdWV1ZSBpbmRleC4NCj4+DQo+PiAgICAgICAgKFNvcnJ5 IGZvciB0aGUgZG91YmxlIG1lc3NhZ2UsIHByZXZpb3VzIG9uZSB3YXMgbm90IHBsYWludGV4dCBz byBpdCB3YXMgcmVqZWN0ZWQgYnkgZ3JvdXAgc2VydmVyKQ0KPj4NCj4+ICAgICAgICBDaGVlcnMs DQo+PiAgICAgICAgICAgICAgICBZdXZhbC4NCj4+DQo+PiBkaWZmIC11ck4gYS9pbmNsdWRlL25l dC94ZHAuaCBiL2luY2x1ZGUvbmV0L3hkcC5oDQo+PiAtLS0gYS9pbmNsdWRlL25ldC94ZHAuaCAy MDIzLTA2LTA1IDA3OjIxOjI3LjAwMDAwMDAwMCArMDAwMA0KPj4gKysrIGIvaW5jbHVkZS9uZXQv eGRwLmggMjAyNC0wNS0yOCAwNzowNDowMC41NDk1MDczMTYgKzAwMDANCj4+IEBAIC00OCw3ICs0 OCw4IEBADQo+PiAjZGVmaW5lIFhEUF9YTUlUX0ZMQUdTX01BU0sgICAgWERQX1hNSVRfRkxVU0gN Cj4+DQo+PiBzdHJ1Y3QgeGRwX21lbV9pbmZvIHsNCj4+IC0gICAgICAgdTMyIHR5cGU7IC8qIGVu dW0geGRwX21lbV90eXBlLCBidXQga25vd24gc2l6ZSB0eXBlICovDQo+PiArICAgICAgIHUzMiB0 eXBlIDogMTY7IC8qIGVudW0geGRwX21lbV90eXBlLCBidXQga25vd24gc2l6ZSB0eXBlICovDQo+ PiArICAgIHUzMiByeF9xdWV1ZV9pbmRleCA6IDE2Ow0KPg0KPiBIb3cgYWJvdXQganVzdCBzdGlj a2luZyBhbiB1MzIgcXVldWVfaW5kZXggaW4gdGhlIHN0cnVjdCB4ZHBfZnJhbWU/DQo+IFRoZSB4 ZHBfZnJhbWUgaXMgc3RvcmVkIGF0IHRoZSBzdGFydCBvZiB0aGUgMjU2IGJ5dGUgWERQIG1ldGFk YXRhDQo+IHNlY3Rpb24gaW4gZnJvbnQgb2YgdGhlIHBhY2tldC4gSSBiZWxpZXZlIHRoZXJlIGlz IHJvb20gZm9yIGFuIGV4dHJhIDQNCj4gYnl0ZXMgdGhlcmUgd2l0aG91dCBzcGlsbGluZyBvdmVy IHRvIGEgbmV3IGNhY2hlIGxpbmUuIFRoZW4gaW4gdGhlDQo+IHhkcF9mcmFtZSBmcm9tIHhkcF9i dWZmIGNyZWF0aW9uIGZ1bmN0aW9uLCB5b3UgYWx3YXlzIGNvcHkgb3ZlciB0aGUNCj4gcXVldWVf aW5kZXggdG8gdGhlIHhkcF9mcmFtZS4gQnV0IHdoZW4gY29udmVydGluZyB0aGUgeGRwX2ZyYW1l IHRvIGFuDQo+IHhkcF9idWZmLCB5b3Ugb25seSBkbyB0aGlzIGZvciB0aGUgIlhEUCBwcm9ncmFt IG9uIGEgQ1BVTUFQIiBjYXNlIHdoZW4NCj4gdGhlIGFjdGlvbiBpcyBYRFBfUkVESVJFQ1QuIFRo ZXJlIGlzIGV2ZW4gYSAvKiBUT0RPICovIGluIHRoaXMNCj4gZnVuY3Rpb24gZm9yIGNvcHlpbmcg b3ZlciB0aGUgcXVldWVfaW5kZXguDQo+DQo+IFdoYXQgZG8geW91IHRoaW5rPyBXYW50IHRvIHRh a2UgYSBzdGFiIGF0IGl0IGFuZCBzdWJtaXQgYSBwYXRjaD8NCj4NCj4gQlRXLCBiaXRmaWVsZHMg YXJlIHNsb3cgc28geW91IGRvIG5vdCB3YW50IHRvIHVzZSB0aGF0LiBBbmQNCj4gcXVldWVfaW5k ZXggaGFzIG5vdGhpbmcgdG8gZG8gd2l0aCBtZW1vcnkgdHlwZSBzbyBpcyBub3QgYSBsb2dpY2Fs DQo+IHBsYWNlIGZvciBpdC4NCj4NCj4+ICAgICAgICB1MzIgaWQ7DQo+PiB9Ow0KPj4NCj4+IEBA IC0xODAsNiArMTgxLDEwIEBADQo+PiAgICAgICAgeGRwLT5kYXRhX2VuZCA9IGZyYW1lLT5kYXRh ICsgZnJhbWUtPmxlbjsNCj4+ICAgICAgICB4ZHAtPmRhdGFfbWV0YSA9IGZyYW1lLT5kYXRhIC0g ZnJhbWUtPm1ldGFzaXplOw0KPj4gICAgICAgIHhkcC0+ZnJhbWVfc3ogPSBmcmFtZS0+ZnJhbWVf c3o7DQo+PiArICAgICAgIGlmICh4ZHAtPnJ4cSAhPSBOVUxMKQ0KPj4gKyAgICAgICB7DQo+PiAr ICAgICAgICAgICAgICAgeGRwLT5yeHEtPnF1ZXVlX2luZGV4ID0gZnJhbWUtPm1lbS5yeF9xdWV1 ZV9pbmRleDsNCj4+ICsgICAgICAgfQ0KPj4gfQ0KPj4NCj4+IHN0YXRpYyBpbmxpbmUNCj4+IEBA IC0yMDYsNiArMjExLDggQEANCj4+ICAgICAgICB4ZHBfZnJhbWUtPmhlYWRyb29tID0gaGVhZHJv b20gLSBzaXplb2YoKnhkcF9mcmFtZSk7DQo+PiAgICAgICAgeGRwX2ZyYW1lLT5tZXRhc2l6ZSA9 IG1ldGFzaXplOw0KPj4gICAgICAgIHhkcF9mcmFtZS0+ZnJhbWVfc3ogPSB4ZHAtPmZyYW1lX3N6 Ow0KPj4gKyAgICAgICB4ZHBfZnJhbWUtPm1lbS5yeF9xdWV1ZV9pbmRleCA9DQo+PiArICAgICAg ICAgICAgICAgKHhkcC0+cnhxICE9IE5VTEwpID8geGRwLT5yeHEtPnF1ZXVlX2luZGV4IDogMDsN Cj4+DQo+PiAgICAgICAgcmV0dXJuIDA7DQo+PiB9DQo+PiBAQCAtMjI2LDYgKzIzMyw3IEBADQo+ Pg0KPj4gICAgICAgIC8qIHJ4cSBvbmx5IHZhbGlkIHVudGlsIG5hcGlfc2NoZWR1bGUgZW5kcywg Y29udmVydCB0byB4ZHBfbWVtX2luZm8gKi8NCj4+ICAgICAgICB4ZHBfZnJhbWUtPm1lbSA9IHhk cC0+cnhxLT5tZW07DQo+PiArICAgICAgIHhkcF9mcmFtZS0+bWVtLnJ4X3F1ZXVlX2luZGV4ID0g eGRwLT5yeHEtPnF1ZXVlX2luZGV4Ow0KPj4NCj4+ICAgICAgICByZXR1cm4geGRwX2ZyYW1lOw0K Pj4gfQ0KPj4gZGlmZiAtdXJOIGEvbmV0L2NvcmUveGRwLmMgYi9uZXQvY29yZS94ZHAuYw0KPj4g LS0tIGEvbmV0L2NvcmUveGRwLmMgICAgMjAyMy0wNi0wNSAwNzoyMToyNy4wMDAwMDAwMDAgKzAw MDANCj4+ICsrKyBiL25ldC9jb3JlL3hkcC5jICAgIDIwMjQtMDUtMjggMTQ6MDU6MjQuNTMxNjE3 Mjc5ICswMDAwDQo+PiBAQCAtNTM2LDYgKzUzNiw3IEBADQo+PiAgICAgICAgeGRwZi0+bWV0YXNp emUgPSBtZXRhc2l6ZTsNCj4+ICAgICAgICB4ZHBmLT5mcmFtZV9zeiA9IFBBR0VfU0laRTsNCj4+ ICAgICAgICB4ZHBmLT5tZW0udHlwZSA9IE1FTV9UWVBFX1BBR0VfT1JERVIwOw0KPj4gKyAgICB4 ZHBmLT5tZW0ucnhfcXVldWVfaW5kZXggPSAoeGRwLT5yeHEgIT0gTlVMTCkgPyB4ZHAtPnJ4cS0+ cXVldWVfaW5kZXggOiAwOw0KPj4NCj4+ICAgICAgICB4c2tfYnVmZl9mcmVlKHhkcCk7DQo+PiAg ICAgICAgcmV0dXJuIHhkcGY7DQo+Pg0KPj4+IE9uIDI4IE1heSAyMDI0LCBhdCAxNTozOCwgWXV2 YWwgRWwtSGFuYW55IDx5dXZhbGVAcmFkd2FyZS5jb20+IHdyb3RlOg0KPj4+DQo+Pj4gQ0FVVElP TjpFeHRlcm5hbCBFbWFpbCwgRG8gbm90IGNsaWNrIG9uIGxpbmtzIG9yIG9wZW4gYXR0YWNobWVu dHMgdW5sZXNzIHlvdSByZWNvZ25pemUgdGhlIHNlbmRlciBhbmQga25vdyB0aGUgY29udGVudCBp cyBzYWZlLg0KPj4+DQo+Pj4gU3VyZS4gVGhlIHR3byBwYXRjaGVzICh0aGUgc2Vjb25kIGlzIGp1 c3QgZG9jdW1lbnRhdGlvbikgYXJlIGJlbG93Lg0KPj4+DQo+Pj4gICAgICAgSeKAmW0gdHJ5aW5n IHRvIGFkZCB0aGUgcnggcXVldWUgZnJvbSB4ZHBfYnVmZiB0byB0aGUgeGRwX2ZyYW1lIGFuZCBl eHRyYWN0IGl0IGJhY2suIElzIHRoZSBzaXplIG9yIGFsaWdubWVudCBvZiB4ZHBfZnJhbWUgY3Jp dGljYWw/IElzIGl0IG9rYXkgdG8gYWRkIHRoZSByeCBxdWV1ZSBhcyBhbiBleHRyYSBmaWVsZCwg b3Igc2hvdWxkIEkgdHJ5IHRvIGFkZCBpdCBhcyBhIGJpdCBmaWVsZCBvbiBhbiBleGlzdGluZyBm aWVsZCBsaWtlIHRoZSBtZW1vcnkgdHlwZSB0aGF0IHRha2VzIDMyIGJpdHMgYnV0IGhhcyBvbmx5 IDQgdmFsdWVzPw0KPj4+DQo+Pj4gICAgICAgQ2hlZXJzLA0KPj4+ICAgICAgICAgICAgICAgWXV2 YWwuDQo+Pj4NCj4+PiBGcm9tOiBNYWdudXMgS2FybHNzb24gPG1hZ251cy5rYXJsc3NvbkBnbWFp bC5jb20+DQo+Pj4gU3ViamVjdDogW1BBVENIIGJwZi1uZXh0IDEvMl0geHNrOiBzdXBwb3J0IHJl ZGlyZWN0IHRvIGFueSBzb2NrZXQgYm91bmQgdG8gdGhlIHNhbWUgdW1lbQ0KPj4+IERhdGU6IDUg RmVicnVhcnkgMjAyNCBhdCAxNDozNTo1MCBHTVQrMg0KPj4+IFRvOiBtYWdudXMua2FybHNzb25A aW50ZWwuY29tLCBiam9ybkBrZXJuZWwub3JnLCBhc3RAa2VybmVsLm9yZywgZGFuaWVsQGlvZ2Vh cmJveC5uZXQsIG5ldGRldkB2Z2VyLmtlcm5lbC5vcmcsIG1hY2llai5maWphbGtvd3NraUBpbnRl bC5jb20sIHl1dmFsZUByYWR3YXJlLmNvbQ0KPj4+IENjOiBicGZAdmdlci5rZXJuZWwub3JnDQo+ Pj4NCj4+PiBDQVVUSU9OOkV4dGVybmFsIEVtYWlsLCBEbyBub3QgY2xpY2sgb24gbGlua3Mgb3Ig b3BlbiBhdHRhY2htZW50cyB1bmxlc3MgeW91IHJlY29nbml6ZSB0aGUgc2VuZGVyIGFuZCBrbm93 IHRoZSBjb250ZW50IGlzIHNhZmUuDQo+Pj4NCj4+PiBGcm9tOiBNYWdudXMgS2FybHNzb24gPG1h Z251cy5rYXJsc3NvbkBpbnRlbC5jb20+DQo+Pj4NCj4+PiBBZGQgc3VwcG9ydCBmb3IgZGlyZWN0 aW5nIGEgcGFja2V0IHRvIGFueSBzb2NrZXQgYm91bmQgdG8gdGhlIHNhbWUNCj4+PiB1bWVtLiBU aGlzIG1ha2VzIGl0IHBvc3NpYmxlIHRvIHVzZSB0aGUgWERQIHByb2dyYW0gdG8gc2VsZWN0IHdo YXQNCj4+PiBzb2NrZXQgdGhlIHBhY2tldCBzaG91bGQgYmUgcmVjZWl2ZWQgb24uIFRoZSB1c2Vy IGNhbiBwb3B1bGF0ZSB0aGUNCj4+PiBYU0tNQVAgd2l0aCB2YXJpb3VzIHNvY2tldHMgYW5kIGFz IGxvbmcgYXMgdGhleSBzaGFyZSB0aGUgc2FtZSB1bWVtLA0KPj4+IHRoZSBYRFAgcHJvZ3JhbSBj YW4gcGljayBhbnkgb25lIG9mIHRoZW0uDQo+Pj4NCj4+PiBTdWdnZXN0ZWQtYnk6IFl1dmFsIEVs LUhhbmFueSA8eXV2YWxlQHJhZHdhcmUuY29tPg0KPj4+IFNpZ25lZC1vZmYtYnk6IE1hZ251cyBL YXJsc3NvbiA8bWFnbnVzLmthcmxzc29uQGludGVsLmNvbT4NCj4+PiAtLS0NCj4+PiBuZXQveGRw L3hzay5jIHwgNSArKysrLQ0KPj4+IDEgZmlsZSBjaGFuZ2VkLCA0IGluc2VydGlvbnMoKyksIDEg ZGVsZXRpb24oLSkNCj4+Pg0KPj4+IGRpZmYgLS1naXQgYS9uZXQveGRwL3hzay5jIGIvbmV0L3hk cC94c2suYw0KPj4+IGluZGV4IDFlYWRmYWMwM2NjNC4uYTMzOWU5YTFiNTU3IDEwMDY0NA0KPj4+ IC0tLSBhL25ldC94ZHAveHNrLmMNCj4+PiArKysgYi9uZXQveGRwL3hzay5jDQo+Pj4gQEAgLTMx MywxMCArMzEzLDEzIEBAIHN0YXRpYyBib29sIHhza19pc19ib3VuZChzdHJ1Y3QgeGRwX3NvY2sg KnhzKQ0KPj4+DQo+Pj4gc3RhdGljIGludCB4c2tfcmN2X2NoZWNrKHN0cnVjdCB4ZHBfc29jayAq eHMsIHN0cnVjdCB4ZHBfYnVmZiAqeGRwLCB1MzIgbGVuKQ0KPj4+IHsNCj4+PiArICAgICAgIHN0 cnVjdCBuZXRfZGV2aWNlICpkZXYgPSB4ZHAtPnJ4cS0+ZGV2Ow0KPj4+ICsgICAgICAgdTMyIHFp ZCA9IHhkcC0+cnhxLT5xdWV1ZV9pbmRleDsNCj4+PiArDQo+Pj4gICAgICBpZiAoIXhza19pc19i b3VuZCh4cykpDQo+Pj4gICAgICAgICAgICAgIHJldHVybiAtRU5YSU87DQo+Pj4NCj4+PiAtICAg ICAgIGlmICh4cy0+ZGV2ICE9IHhkcC0+cnhxLT5kZXYgfHwgeHMtPnF1ZXVlX2lkICE9IHhkcC0+ cnhxLT5xdWV1ZV9pbmRleCkNCj4+PiArICAgICAgIGlmICghZGV2LT5fcnhbcWlkXS5wb29sIHx8 IHhzLT51bWVtICE9IGRldi0+X3J4W3FpZF0ucG9vbC0+dW1lbSkNCj4+PiAgICAgICAgICAgICAg cmV0dXJuIC1FSU5WQUw7DQo+Pj4NCj4+PiAgICAgIGlmIChsZW4gPiB4c2tfcG9vbF9nZXRfcnhf ZnJhbWVfc2l6ZSh4cy0+cG9vbCkgJiYgIXhzLT5zZykgew0KPj4+IC0tDQo+Pj4gMi40Mi4wDQo+ Pj4NCj4+PiBGcm9tOiBNYWdudXMgS2FybHNzb24gPG1hZ251cy5rYXJsc3NvbkBpbnRlbC5jb20+ DQo+Pj4NCj4+PiBEb2N1bWVudCB0aGUgYWJpbGl0eSB0byByZWRpcmVjdCB0byBhbnkgc29ja2V0 IGJvdW5kIHRvIHRoZSBzYW1lIHVtZW0uDQo+Pj4NCj4+PiBTaWduZWQtb2ZmLWJ5OiBNYWdudXMg S2FybHNzb24gPG1hZ251cy5rYXJsc3NvbkBpbnRlbC5jb20+DQo+Pj4gLS0tDQo+Pj4gRG9jdW1l bnRhdGlvbi9uZXR3b3JraW5nL2FmX3hkcC5yc3QgfCAzMyArKysrKysrKysrKysrKysrKy0tLS0t LS0tLS0tLQ0KPj4+IDEgZmlsZSBjaGFuZ2VkLCAxOSBpbnNlcnRpb25zKCspLCAxNCBkZWxldGlv bnMoLSkNCj4+Pg0KPj4+IGRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvYWZf eGRwLnJzdCBiL0RvY3VtZW50YXRpb24vbmV0d29ya2luZy9hZl94ZHAucnN0DQo+Pj4gaW5kZXgg ZGNlZWIwZDc2M2FhLi43MmRhNzA1N2U0Y2YgMTAwNjQ0DQo+Pj4gLS0tIGEvRG9jdW1lbnRhdGlv bi9uZXR3b3JraW5nL2FmX3hkcC5yc3QNCj4+PiArKysgYi9Eb2N1bWVudGF0aW9uL25ldHdvcmtp bmcvYWZfeGRwLnJzdA0KPj4+IEBAIC0zMjksMjMgKzMyOSwyNCBAQCBYRFBfU0hBUkVEX1VNRU0g b3B0aW9uIGFuZCBwcm92aWRlIHRoZSBpbml0aWFsIHNvY2tldCdzIGZkIGluIHRoZQ0KPj4+IHN4 ZHBfc2hhcmVkX3VtZW1fZmQgZmllbGQgYXMgeW91IHJlZ2lzdGVyZWQgdGhlIFVNRU0gb24gdGhh dA0KPj4+IHNvY2tldC4gVGhlc2UgdHdvIHNvY2tldHMgd2lsbCBub3cgc2hhcmUgb25lIGFuZCB0 aGUgc2FtZSBVTUVNLg0KPj4+DQo+Pj4gLVRoZXJlIGlzIG5vIG5lZWQgdG8gc3VwcGx5IGFuIFhE UCBwcm9ncmFtIGxpa2UgdGhlIG9uZSBpbiB0aGUgcHJldmlvdXMNCj4+PiAtY2FzZSB3aGVyZSBz b2NrZXRzIHdlcmUgYm91bmQgdG8gdGhlIHNhbWUgcXVldWUgaWQgYW5kDQo+Pj4gLWRldmljZS4g SW5zdGVhZCwgdXNlIHRoZSBOSUMncyBwYWNrZXQgc3RlZXJpbmcgY2FwYWJpbGl0aWVzIHRvIHN0 ZWVyDQo+Pj4gLXRoZSBwYWNrZXRzIHRvIHRoZSByaWdodCBxdWV1ZS4gSW4gdGhlIHByZXZpb3Vz IGV4YW1wbGUsIHRoZXJlIGlzIG9ubHkNCj4+PiAtb25lIHF1ZXVlIHNoYXJlZCBhbW9uZyBzb2Nr ZXRzLCBzbyB0aGUgTklDIGNhbm5vdCBkbyB0aGlzIHN0ZWVyaW5nLiBJdA0KPj4+IC1jYW4gb25s eSBzdGVlciBiZXR3ZWVuIHF1ZXVlcy4NCj4+PiAtDQo+Pj4gLUluIGxpYmJwZiwgeW91IG5lZWQg dG8gdXNlIHRoZSB4c2tfc29ja2V0X19jcmVhdGVfc2hhcmVkKCkgQVBJIGFzIGl0DQo+Pj4gLXRh a2VzIGEgcmVmZXJlbmNlIHRvIGEgRklMTCByaW5nIGFuZCBhIENPTVBMRVRJT04gcmluZyB0aGF0 IHdpbGwgYmUNCj4+PiAtY3JlYXRlZCBmb3IgeW91IGFuZCBib3VuZCB0byB0aGUgc2hhcmVkIFVN RU0uIFlvdSBjYW4gdXNlIHRoaXMNCj4+PiAtZnVuY3Rpb24gZm9yIGFsbCB0aGUgc29ja2V0cyB5 b3UgY3JlYXRlLCBvciB5b3UgY2FuIHVzZSBpdCBmb3IgdGhlDQo+Pj4gLXNlY29uZCBhbmQgZm9s bG93aW5nIG9uZXMgYW5kIHVzZSB4c2tfc29ja2V0X19jcmVhdGUoKSBmb3IgdGhlIGZpcnN0DQo+ Pj4gLW9uZS4gQm90aCBtZXRob2RzIHlpZWxkIHRoZSBzYW1lIHJlc3VsdC4NCj4+PiArSW4gdGhp cyBjYXNlLCBpdCBpcyBwb3NzaWJsZSB0byB1c2UgdGhlIE5JQydzIHBhY2tldCBzdGVlcmluZw0K Pj4+ICtjYXBhYmlsaXRpZXMgdG8gc3RlZXIgdGhlIHBhY2tldHMgdG8gdGhlIHJpZ2h0IHF1ZXVl LiBUaGlzIGlzIG5vdA0KPj4+ICtwb3NzaWJsZSBpbiB0aGUgcHJldmlvdXMgZXhhbXBsZSBhcyB0 aGVyZSBpcyBvbmx5IG9uZSBxdWV1ZSBzaGFyZWQNCj4+PiArYW1vbmcgc29ja2V0cywgc28gdGhl IE5JQyBjYW5ub3QgZG8gdGhpcyBzdGVlcmluZyBhcyBpdCBjYW4gb25seSBzdGVlcg0KPj4+ICti ZXR3ZWVuIHF1ZXVlcy4NCj4+PiArDQo+Pj4gK0luIGxpYnhkcCAob3IgbGliYnBmIHByaW9yIHRv IHZlcnNpb24gMS4wKSwgeW91IG5lZWQgdG8gdXNlIHRoZQ0KPj4+ICt4c2tfc29ja2V0X19jcmVh dGVfc2hhcmVkKCkgQVBJIGFzIGl0IHRha2VzIGEgcmVmZXJlbmNlIHRvIGEgRklMTCByaW5nDQo+ Pj4gK2FuZCBhIENPTVBMRVRJT04gcmluZyB0aGF0IHdpbGwgYmUgY3JlYXRlZCBmb3IgeW91IGFu ZCBib3VuZCB0byB0aGUNCj4+PiArc2hhcmVkIFVNRU0uIFlvdSBjYW4gdXNlIHRoaXMgZnVuY3Rp b24gZm9yIGFsbCB0aGUgc29ja2V0cyB5b3UgY3JlYXRlLA0KPj4+ICtvciB5b3UgY2FuIHVzZSBp dCBmb3IgdGhlIHNlY29uZCBhbmQgZm9sbG93aW5nIG9uZXMgYW5kIHVzZQ0KPj4+ICt4c2tfc29j a2V0X19jcmVhdGUoKSBmb3IgdGhlIGZpcnN0IG9uZS4gQm90aCBtZXRob2RzIHlpZWxkIHRoZSBz YW1lDQo+Pj4gK3Jlc3VsdC4NCj4+Pg0KPj4+IE5vdGUgdGhhdCBhIFVNRU0gY2FuIGJlIHNoYXJl ZCBiZXR3ZWVuIHNvY2tldHMgb24gdGhlIHNhbWUgcXVldWUgaWQNCj4+PiBhbmQgZGV2aWNlLCBh cyB3ZWxsIGFzIGJldHdlZW4gcXVldWVzIG9uIHRoZSBzYW1lIGRldmljZSBhbmQgYmV0d2Vlbg0K Pj4+IC1kZXZpY2VzIGF0IHRoZSBzYW1lIHRpbWUuDQo+Pj4gK2RldmljZXMgYXQgdGhlIHNhbWUg dGltZS4gSXQgaXMgYWxzbyBwb3NzaWJsZSB0byByZWRpcmVjdCB0byBhbnkNCj4+PiArc29ja2V0 IGFzIGxvbmcgYXMgaXQgaXMgYm91bmQgdG8gdGhlIHNhbWUgdW1lbSB3aXRoIFhEUF9TSEFSRURf VU1FTS4NCj4+Pg0KPj4+IFhEUF9VU0VfTkVFRF9XQUtFVVAgYmluZCBmbGFnDQo+Pj4gLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCj4+PiBAQCAtODIyLDYgKzgyMywxMCBAQCBBOiBUaGUg c2hvcnQgYW5zd2VyIGlzIG5vLCB0aGF0IGlzIG5vdCBzdXBwb3J0ZWQgYXQgdGhlIG1vbWVudC4g VGhlDQo+Pj4gIHN3aXRjaCwgb3Igb3RoZXIgZGlzdHJpYnV0aW9uIG1lY2hhbmlzbSwgaW4geW91 ciBOSUMgdG8gZGlyZWN0DQo+Pj4gIHRyYWZmaWMgdG8gdGhlIGNvcnJlY3QgcXVldWUgaWQgYW5k IHNvY2tldC4NCj4+Pg0KPj4+ICsgICBOb3RlIHRoYXQgaWYgeW91IGFyZSB1c2luZyB0aGUgWERQ X1NIQVJFRF9VTUVNIG9wdGlvbiwgaXQgaXMNCj4+PiArICAgcG9zc2libGUgdG8gc3dpdGNoIHRy YWZmaWMgYmV0d2VlbiBhbnkgc29ja2V0IGJvdW5kIHRvIHRoZSBzYW1lDQo+Pj4gKyAgIHVtZW0u DQo+Pj4gKw0KPj4+IFE6IE15IHBhY2tldHMgYXJlIHNvbWV0aW1lcyBjb3JydXB0ZWQuIFdoYXQg aXMgd3Jvbmc/DQo+Pj4NCj4+PiBBOiBDYXJlIGhhcyB0byBiZSB0YWtlbiBub3QgdG8gZmVlZCB0 aGUgc2FtZSBidWZmZXIgaW4gdGhlIFVNRU0gaW50bw0KPj4+IC0tDQo+Pj4gMi40Mi4wDQo+Pj4N Cj4+Pj4gT24gMjggTWF5IDIwMjQsIGF0IDE1OjIxLCBNYWdudXMgS2FybHNzb24gPG1hZ251cy5r YXJsc3NvbkBnbWFpbC5jb20+IHdyb3RlOg0KPj4+Pg0KPj4+PiBDQVVUSU9OOkV4dGVybmFsIEVt YWlsLCBEbyBub3QgY2xpY2sgb24gbGlua3Mgb3Igb3BlbiBhdHRhY2htZW50cyB1bmxlc3MgeW91 IHJlY29nbml6ZSB0aGUgc2VuZGVyIGFuZCBrbm93IHRoZSBjb250ZW50IGlzIHNhZmUuDQo+Pj4+ DQo+Pj4+IE9uIE1vbiwgMjcgTWF5IDIwMjQgYXQgMTA6MTEsIE1hZ251cyBLYXJsc3NvbiA8bWFn bnVzLmthcmxzc29uQGdtYWlsLmNvbT4gd3JvdGU6DQo+Pj4+Pg0KPj4+Pj4gT24gTW9uLCAyNyBN YXkgMjAyNCBhdCAwOTozNCwgWXV2YWwgRWwtSGFuYW55IDx5dXZhbGVAcmFkd2FyZS5jb20+IHdy b3RlOg0KPj4+Pj4+DQo+Pj4+Pj4gWWVhaCwNCj4+Pj4+PiAgICAgIGFzIGZhciBkb3duIGFzIEkg ZHVnIGluIHRoZSBjb2RlLCBpdCBzZWVtcyBpdOKAmXMgdGhlIG9ubHkgb25lIHRoYXTigJlzIHVz ZWQuIFRoZSBvdGhlciBtZW1iZXJzIGFyZSByZWdfc3RhdGUgJiBuYXBpX2lkLiBJ4oCZbSB1bmZh bWlsaWFyIHdpdGggdGhlaXIgZXhhY3QgcHVycG9zZXMsIGJ1dCBkb2VzbuKAmXQgc291bmQgbGlr ZSB0aGV54oCZcmUgbmVjZXNzYXJ5IGRvd24gdGhlIGxpbmUuIE9uZSBvdGhlciBjb25jZXJuIGlz IHR4cSBJTU8uIEl0IGlzIG5vdCBpbml0aWFsaXNlZCB0byBhbnkgdmFsdWUgaW4geGRwX2J1ZmYu IFdoaWxlIGl0IG1heSBub3QgYmUgcmVsZXZhbnQgY29uc2lkZXJpbmcgaXTigJlzIGEgcmVjZWl2 ZWQgcGFja2V0LCBpdCBzZWVtcyB3cm9uZyB0byBrZWVwIGEgZGFuZ2xpbmcgcG9pbnRlciBib3Ro IGluIHRlcm1zIG9mIHNlY3VyaXR5IChsZWFraW5nIHByZXZpb3VzIHZhbHVlcykgYW5kIHJvYnVz dG5lc3MuIE1heWJlIGp1c3Qgc2V0IGl0IHRvIE5VTEw/DQo+Pj4+Pj4NCj4+Pj4+PiAgICAgIEni gJl2ZSBiZWVuIHJhY2tpbmcgbXkgYnJhaW4gYXMgdG8gd2hhdCBpcyB0aGUgYWNjZXB0ZWQgbWV0 aG9kIHRvIHBhc3MgdGhlIHJlY2VpdmUgcXVldWUuIFBhc3NpbmcgaXQgb24gdGhlIHBhY2tldCBo ZWFkcm9vbSBzZWVtZWQgbGlrZSBhIHJlYXNvbmFibGUgc29sdXRpb24sIGJ1dCBpdCB3b3VsZCBt ZWFuIG1lbW9yeSBhY2Nlc3MgdG8gdGhlIHBhY2tldCBtZW1vcnkgb24gcGFja2V0IGFycml2YWwg b24gdGhlIHNlY29uZCBDUFUgd2hpY2ggbWF5IGJlIGhhcm1mdWwgdG8gcGVyZm9ybWFuY2UuIFRo ZSBxdWV1ZSBpdHNlbGYgaXMganVzdCBhIHBvaW50ZXIgcXVldWUgc28gY2Fu4oCZdCBwaWdneWJh Y2sgb24gaXQgdW5sZXNzIHVzaW5nIGEgZGlmZmVyZW50IGtpbmQgb2YgcXVldWUuIFdvdWxkIGJl IGdyZWF0IHRvIGhlYXIgaG93IGl0IHNob3VsZCBiZSBkb25lLg0KPj4+Pj4NCj4+Pj4+IExldCBt ZSBnZXQgaW50byB0aGlzIHBpZWNlIG9mIGNvZGUgYW5kIHNjcmF0Y2ggbXkgaGVhZCBmb3IgYSB3 aGlsZSBhbmQNCj4+Pj4+IEkgd2lsbCBnZXQgYmFjayB0byB5b3UuIERvIG5vdCBoYXZlIGEgc29s dXRpb24gb24gdG9wIG9mIG15IGhlYWQuIFdpbGwNCj4+Pj4+IGxvb3AgaW4gTWFjaWVqIHRvby4N Cj4+Pj4NCj4+Pj4gWXV2YWwsDQo+Pj4+DQo+Pj4+IENvdWxkIHlvdSBwbGVhc2Ugc2VuZCBtZSB0 aGUgcGF0Y2ggdGhhdCB5b3UgYXJlIHVzaW5nPyBJIGNhbm5vdA0KPj4+PiByZW1lbWJlciB3aGF0 IEkgc2VudCB5b3UgOi0pLg0KPj4+Pg0KPj4+Pj4gL01hZ251cw0KPj4+Pj4NCj4+Pj4+PiAgICAg IFRoYW5rcywNCj4+Pj4+PiAgICAgICAgICAgICAgWXV2YWwuDQo+Pj4+Pj4NCj4+Pj4+Pj4gT24g MjcgTWF5IDIwMjQsIGF0IDg6NDgsIE1hZ251cyBLYXJsc3NvbiA8bWFnbnVzLmthcmxzc29uQGdt YWlsLmNvbT4gd3JvdGU6DQo+Pj4+Pj4+DQo+Pj4+Pj4+IENBVVRJT046RXh0ZXJuYWwgRW1haWws IERvIG5vdCBjbGljayBvbiBsaW5rcyBvciBvcGVuIGF0dGFjaG1lbnRzIHVubGVzcyB5b3UgcmVj b2duaXplIHRoZSBzZW5kZXIgYW5kIGtub3cgdGhlIGNvbnRlbnQgaXMgc2FmZS4NCj4+Pj4+Pj4N Cj4+Pj4+Pj4gT24gU3VuLCAyNiBNYXkgMjAyNCBhdCAxNDo0OCwgWXV2YWwgRWwtSGFuYW55IDx5 dXZhbGVAcmFkd2FyZS5jb20+IHdyb3RlOg0KPj4+Pj4+Pj4NCj4+Pj4+Pj4+IENvcnJlY3Rpb24s DQo+Pj4+Pj4+PiAgICAgdGhlIHJ4cSBwb2ludGVyIGlzIGluaXTigJlkIGdsb2JhbGx5IGZvciBh bGwgZnJhbWVzIGJlZm9yZSB0aGUgZnJhbWUgbG9vcHMsIGJ1dCBvbmx5IHRoZSBkZXZpY2UgYW5k IHRoZSBtZW1vcnkgaW5mb3JtYXRpb24gYXJlIHNldCBmcm9tIHRoZSBYRFAgZnJhbWUuIFNvIHN0 aWxsIGFuIGlzc3VlIHdpdGggdGhlIHF1ZXVlX2luZGV4LCBidXQgdGhlIHRlc3RzIG9uIHRoZSBk ZXZpY2UgYW5kIG1lbW9yeSBpbmZvIGluIHhza19yY3Ygc2hvdWxkIGJlIGZpbmUuDQo+Pj4+Pj4+ Pg0KPj4+Pj4+Pj4gICAgIENoZWVycywNCj4+Pj4+Pj4+ICAgICAgICAgICAgIFl1dmFsLg0KPj4+ Pj4+Pg0KPj4+Pj4+PiBIaSBZdXZhbCwNCj4+Pj4+Pj4NCj4+Pj4+Pj4gTm93IEkgYW0gYmFjay4g WWVzLCB0aGlzIHNlZW1zIHRvIGJlIGEgYnVnIHNvIHRoYW5rIHlvdSBmb3Igc3BvdHRpbmcNCj4+ Pj4+Pj4gaXQuIFRoaXMgaXMgbm90aGluZyBJIGhhdmUgZXZlciB0ZXN0ZWQgc2luY2UgSSB0aG91 Z2h0IHlvdSB3b3VsZCBkbyBhbg0KPj4+Pj4+PiBYU0tNQVAgcmVkaXJlY3QgdG8gdGhlICJyaWdo dCIgY29yZSBmaXJzdC4gQnV0IHRoZXJlIGlzIG5vdGhpbmcNCj4+Pj4+Pj4gaGluZGVyaW5nIHRo YXQgc29tZW9uZSB3b3VsZCBkbyBhIENQVU1BUCByZWRpcmVjdCBmaXJzdCB0aGVuIGFuIFhTS01B UA0KPj4+Pj4+PiByZWRpcmVjdCwgc28gc2hvdWxkIGJlIHN1cHBvcnRlZC4gU28gaW4geW91ciBh bmFseXNpcywgaXMgaXQgb25seQ0KPj4+Pj4+PiBxdWV1ZV9pbmRleCB0aGF0IG5lZWRzIHRvIGJl IHBvcHVsYXRlZCBhdCBDUFVNQVAgcmVkaXJlY3QgdGltZSBmb3INCj4+Pj4+Pj4gdGhpcyB0byB3 b3JrPw0KPj4+Pj4+Pg0KPj4+Pj4+PiBUaGFua3M6IE1hZ251cw0KPj4+Pj4+Pg0KPj4+Pj4+Pj4+ IE9uIDI2IE1heSAyMDI0LCBhdCAxMjowMiwgWXV2YWwgRWwtSGFuYW55IDx5dXZhbGVAcmFkd2Fy ZS5jb20+IHdyb3RlOg0KPj4+Pj4+Pj4+DQo+Pj4+Pj4+Pj4gSGksDQo+Pj4+Pj4+Pj4gc28gSeKA mXZlIGR1ZyBhIGJpdCBkZWVwZXIuIEl0IHNlZW1zIHRoZSByZWNlaXZlIHF1ZXVlIGlzIG5vdCBt YWludGFpbmVkIGFjcm9zcyBDUFVzIGFuZCB0aGlzIG1heSBtYWtlIHRoZSB3aG9sZSBwcmFjdGlj ZSBvZiByZWRpcmVjdGluZyB0byBYU0sgdW5zYWZlIGlmIEkgcmVhZCB0aGUgY29kZSBjb3JyZWN0 bHkuIEl0IGFsc28gc2VlbXMgdGhpcyBwZXJzaXN0cyB0byBrZXJuZWwgNi42LjguIEFtIEkgbWlz c2luZyBzb21ldGhpbmc/DQo+Pj4+Pj4+Pj4NCj4+Pj4+Pj4+PiBUaGUgY29kZSBpbiBjcHVtYXAg cnVucyBYRFAgcHJvZ3JhbXMgQlVUIGRvZXNu4oCZdCBmaWxsIHRoZSByeHEgKHNlZSBhbHNvIHRo ZSBUT0RPIGNvbW1lbnQgaW4gdGhlIGNvZGUpLiBUaGUgWERQIGZyYW1lIGlzIGNvbnZlcnRlZCB0 byBYRFAgYnVmZmVyIGJ1dCB0aGUgcnhxIGFuZCB0eHEgYXJlIG5vdCBmaWxsZWQuIEl0IHNlZW1z IHRoZXkgcmVtYWluIGFzIGRhbmdsaW5nIHBvaW50ZXJzLiBXaGVuIF9feHNrX21hcF9yZWRpcmVj dCBpcyBjYWxsZWQgYW5kIGluIHR1cm4geHNrX3JjdiB0aGUgcnhxIGlzIGNvbnN1bHRlZCBib3Ro IHRvIGNoZWNrIGlmIHRoZSB1bWVtIGlzIHNoYXJlZCAoaW4gdGhlIG5ldyBwYXRjaCkgYXMgd2Vs bCBhcyBkZWNpZGUgd2hldGhlciB6ZXJvIGNvcHkgaXMgdXNlZCBvciBub3QuIFNpbmNlIHJ4cSBp cyBub3QgdmFsaWQsIEnigJltIG5vdCBjZXJ0YWluIHdoYXQgdGhlIG91dGNvbWUgaXMuIE9uY2Ug SSBieXBhc3NlZCB1bWVtIGNoZWNrLCBJIG5vIGxvbmdlciBjcmFzaCB0aGUga2VybmVsIGJ1dCBJ J20gZGVmaW5pdGVseSBub3Qgc2VlaW5nIHRyYWZmaWMgcnVubmluZy4NCj4+Pj4+Pj4+Pg0KPj4+ Pj4+Pj4+IFRoYW5rcywNCj4+Pj4+Pj4+PiBZdXZhbC4NCj4+Pj4+Pj4+Pg0KPj4+Pj4+Pj4+IEhl cmUgYXJlIHRoZSBleGNlcnB0cyBmcm9tIHRoZSBjb2RlICg1LjE1LjExNyk6DQo+Pj4+Pj4+Pj4N Cj4+Pj4+Pj4+PiBjcHVtYXAuYzoyMTIgPGNwdV9tYXBfYnBmX3Byb2dfcnVuX3hkcD4gPT09PT0g Tm90ZSB0aGUgY29tbWVudCBpbiB0aGUgY29kZS4gPT09PT0NCj4+Pj4+Pj4+PiBmb3IgKGkgPSAw OyBpIDwgbjsgaSsrKSB7DQo+Pj4+Pj4+Pj4gICAgc3RydWN0IHhkcF9mcmFtZSAqeGRwZiA9IGZy YW1lc1tpXTsNCj4+Pj4+Pj4+PiAgICB1MzIgYWN0Ow0KPj4+Pj4+Pj4+ICAgIGludCBlcnI7DQo+ Pj4+Pj4+Pj4NCj4+Pj4+Pj4+PiByeHEuZGV2ID0geGRwZi0+ZGV2X3J4Ow0KPj4+Pj4+Pj4+ICAg IHJ4cS5tZW0gPSB4ZHBmLT5tZW07DQo+Pj4+Pj4+Pj4gICAgLyogVE9ETzogcmVwb3J0IHF1ZXVl X2luZGV4IHRvIHhkcF9yeHFfaW5mbyAqLw0KPj4+Pj4+Pj4+DQo+Pj4+Pj4+Pj4gICAgeGRwX2Nv bnZlcnRfZnJhbWVfdG9fYnVmZih4ZHBmLCAmeGRwKTsNCj4+Pj4+Pj4+Pg0KPj4+Pj4+Pj4+ICAg IGFjdCA9IGJwZl9wcm9nX3J1bl94ZHAocmNwdS0+cHJvZywgJnhkcCk7DQo+Pj4+Pj4+Pj4NCj4+ Pj4+Pj4+PiB4ZHAuaDoxNzUgPT09PT0gcnhxICYgdHhxIGluIHRoZSB4ZHBfYnVmZiBhcmUgbm90 IGZpbGxlZCBvciBldmVuIHJlc2V0LiA9PT09PQ0KPj4+Pj4+Pj4+IHN0YXRpYyBpbmxpbmUNCj4+ Pj4+Pj4+PiB2b2lkIHhkcF9jb252ZXJ0X2ZyYW1lX3RvX2J1ZmYoc3RydWN0IHhkcF9mcmFtZSAq ZnJhbWUsIHN0cnVjdCB4ZHBfYnVmZiAqeGRwKQ0KPj4+Pj4+Pj4+IHsNCj4+Pj4+Pj4+PiB4ZHAt PmRhdGFfaGFyZF9zdGFydCA9IGZyYW1lLT5kYXRhIC0gZnJhbWUtPmhlYWRyb29tIC0gc2l6ZW9m KCpmcmFtZSk7DQo+Pj4+Pj4+Pj4geGRwLT5kYXRhID0gZnJhbWUtPmRhdGE7DQo+Pj4+Pj4+Pj4g eGRwLT5kYXRhX2VuZCA9IGZyYW1lLT5kYXRhICsgZnJhbWUtPmxlbjsNCj4+Pj4+Pj4+PiB4ZHAt PmRhdGFfbWV0YSA9IGZyYW1lLT5kYXRhIC0gZnJhbWUtPm1ldGFzaXplOw0KPj4+Pj4+Pj4+IHhk cC0+ZnJhbWVfc3ogPSBmcmFtZS0+ZnJhbWVfc3o7DQo+Pj4+Pj4+Pj4gfQ0KPj4+Pj4+Pj4+DQo+ Pj4+Pj4+Pj4geHNrLmM6MjY5ID09PT09IHhza19yY3YgY29uc3VsdHMgcnhxIGluIHhkcF9idWZm IHdoaWNoIGlzIG5vdCBmaWxsZWQhID09PT09DQo+Pj4+Pj4+Pj4gc3RhdGljIGludCB4c2tfcmN2 KHN0cnVjdCB4ZHBfc29jayAqeHMsIHN0cnVjdCB4ZHBfYnVmZiAqeGRwKQ0KPj4+Pj4+Pj4+IHsN Cj4+Pj4+Pj4+PiBpbnQgZXJyOw0KPj4+Pj4+Pj4+IHUzMiBsZW47DQo+Pj4+Pj4+Pj4NCj4+Pj4+ Pj4+PiBlcnIgPSB4c2tfcmN2X2NoZWNrKHhzLCB4ZHApOw0KPj4+Pj4+Pj4+IGlmIChlcnIpDQo+ Pj4+Pj4+Pj4gICAgcmV0dXJuIGVycjsNCj4+Pj4+Pj4+Pg0KPj4+Pj4+Pj4+IGlmICh4ZHAtPnJ4 cS0+bWVtLnR5cGUgPT0gTUVNX1RZUEVfWFNLX0JVRkZfUE9PTCkgew0KPj4+Pj4+Pj4+IGxlbiA9 IHhkcC0+ZGF0YV9lbmQgLSB4ZHAtPmRhdGE7DQo+Pj4+Pj4+Pj4gICAgcmV0dXJuIF9feHNrX3Jj dl96Yyh4cywgeGRwLCBsZW4pOw0KPj4+Pj4+Pj4+IH0NCj4+Pj4+Pj4+Pg0KPj4+Pj4+Pj4+IGVy ciA9IF9feHNrX3Jjdih4cywgeGRwKTsNCj4+Pj4+Pj4+PiBpZiAoIWVycikNCj4+Pj4+Pj4+PiB4 ZHBfcmV0dXJuX2J1ZmYoeGRwKTsNCj4+Pj4+Pj4+PiByZXR1cm4gZXJyOw0KPj4+Pj4+Pj4+IH0N Cj4+Pj4+Pj4+Pg0KPj4+Pj4+Pj4+IGludCBfX3hza19tYXBfcmVkaXJlY3Qoc3RydWN0IHhkcF9z b2NrICp4cywgc3RydWN0IHhkcF9idWZmICp4ZHApDQo+Pj4+Pj4+Pj4gew0KPj4+Pj4+Pj4+IHN0 cnVjdCBsaXN0X2hlYWQgKmZsdXNoX2xpc3QgPSB0aGlzX2NwdV9wdHIoJnhza21hcF9mbHVzaF9s aXN0KTsNCj4+Pj4+Pj4+PiBpbnQgZXJyOw0KPj4+Pj4+Pj4+DQo+Pj4+Pj4+Pj4gZXJyID0geHNr X3Jjdih4cywgeGRwKTsNCj4+Pj4+Pj4+PiBpZiAoZXJyKQ0KPj4+Pj4+Pj4+IHJldHVybiBlcnI7 DQo+Pj4+Pj4+Pj4NCj4+Pj4+Pj4+PiBpZiAoIXhzLT5mbHVzaF9ub2RlLnByZXYpDQo+Pj4+Pj4+ Pj4gICAgbGlzdF9hZGQoJnhzLT5mbHVzaF9ub2RlLCBmbHVzaF9saXN0KTsNCj4+Pj4+Pj4+Pg0K Pj4+Pj4+Pj4+IHJldHVybiAwOw0KPj4+Pj4+Pj4+IH0NCj4+Pj4+Pj4+Pg0KPj4+Pj4+Pj4+PiBP biAyNCBNYXkgMjAyNCwgYXQgMTg6NDksIFl1dmFsIEVsLUhhbmFueSA8WXV2YWxFQFJhZHdhcmUu Y29tPiB3cm90ZToNCj4+Pj4+Pj4+Pj4NCj4+Pj4+Pj4+Pj4gQ0FVVElPTjpFeHRlcm5hbCBFbWFp bCwgRG8gbm90IGNsaWNrIG9uIGxpbmtzIG9yIG9wZW4gYXR0YWNobWVudHMgdW5sZXNzIHlvdSBy ZWNvZ25pemUgdGhlIHNlbmRlciBhbmQga25vdyB0aGUgY29udGVudCBpcyBzYWZlLg0KPj4+Pj4+ Pj4+Pg0KPj4+Pj4+Pj4+PiBIaSBBbGwsDQo+Pj4+Pj4+Pj4+ICAgSSB3b3VsZCByZWFsbHkgYXBw cmVjaWF0ZSBzb21lIGd1aWRhbmNlIGhlcmUuIEFzIHRoaXMgaXNzdWUgc3BhbnMgYm90aCBuZXR3 b3JrIFhEUCBhbmQgQ1BVIG1hcCwgaXTigJlzIGEgYml0IG1vcmUgZGlmZmljdWx0IGZvciBtZSB0 byBmb2xsb3cgaW4gdGhlIGtlcm5lbCBjb2RlLiBJIGF0dGVtcHRlZCB0byB0cmFjZSB0aGUgaXNz dWUgaW4gdGhlIHNvdXJjZSwgYnV0IGl04oCZcyBhIGJpdCBjb21wbGV4IHRvIGVudGVyIGV4aXN0 aW5nIGNvZGUgYmFzZS4NCj4+Pj4+Pj4+Pj4NCj4+Pj4+Pj4+Pj4gICBJdCB3aWxsIGJlIGVhc2ll ciBpZiB5b3UgY2FuIHRlbGwgbWUgdGhlIGZvbGxvd2luZzoNCj4+Pj4+Pj4+Pj4gMS4gSXMgdGhl IHJlY2VpdmUgcXVldWUgbWV0YWRhdGEgbWFpbnRhaW5lZCBjb3JyZWN0bHkgdGhyb3VnaCB0aGUg Q1BVIHN3aXRjaCBpbiBDUFUgbWFwPyBJbiB0aGUgZGVzY3JpcHRpb24gb2YgQ1BVIG1hcCBpbiBY RFAgKGh0dHBzOi8vZGV2ZWxvcGVycy5yZWRoYXQuY29tL2Jsb2cvMjAyMS8wNS8xMy9yZWNlaXZl LXNpZGUtc2NhbGluZy1yc3Mtd2l0aC1lYnBmLWFuZC1jcHVtYXApLCBpdCBpcyBtZW50aW9uZWQg dGhhdCBzb21lIG1ldGFkYXRhIGlzIG5vdCBtYWludGFpbmVkIGFjcm9zcyB0aGUgQ1BVIHN3aXRj aCwgYnV0IHRoYXQgd291bGQgbWFrZSB0aGUgdW1lbSB0ZXN0IHByb2JsZW1hdGljLiBTaG91bGQg SSBhc3N1bWUgdGhlIHJlY2VpdmUgcXVldWUgaXMgbWFpbnRhaW5lZD8NCj4+Pj4+Pj4+Pj4gMi4g RG9lcyBYU0sgdW1lbSB1c2VyIGNvZGUgaGF2ZSBhY2Nlc3MgdG8gdGhlIHJlY2VpdmUgcXVldWUg bWV0YWRhdGEgbWVtb3J5PyBJdCBzZWVtcyB0byBiZSBpbiBhIGRpZmZlcmVudCBwb2ludGVyLCBi dXQgaXQgY291bGQgYmUgdGhhdCBpdCBwb2ludHMgdG8gdGhlIHBhY2tldCBoZWFkcm9vbSBpbiB0 aGUgdW1lbSBhY2Nlc3NpYmxlIG1lbW9yeS4NCj4+Pj4+Pj4+Pj4NCj4+Pj4+Pj4+Pj4gICBJZiB0 aGUgcmVjZWl2ZSBxdWV1ZSBpcyBub3QgbWFpbnRhaW5lZCBhY3Jvc3MgQ1BVIHN3aXRjaCB0aGVu IEkgdGhpbmsgdGhlIHNoYXJlZCB1bWVtIHRlc3Qgc2hvdWxkIHJ1biBhbG9uZyB0aGUgbGluZXMg b2YgdXNpbmcgc29tZSBkZWZhdWx0IHJlY2VpdmUgcXVldWUgYWZ0ZXIgc3dpdGNoaW5nIENQVXMu IE90aGVyd2lzZSwgaXQgc2hvdWxkIHByb2JhYmx5IGRyb3AgcGFja2V0cyB3aXRoIGludmFsaWQg cmVjZWl2ZSBxdWV1ZXMuDQo+Pj4+Pj4+Pj4+DQo+Pj4+Pj4+Pj4+ICAgVGhhbmtzLA0KPj4+Pj4+ Pj4+PiAgICAgICAgICAgWXV2YWwuDQo+Pj4+Pj4+Pj4+DQo+Pj4+Pj4+Pj4+PiBPbiAyMCBNYXkg MjAyNCwgYXQgMTg6MjQsIFl1dmFsIEVsLUhhbmFueSA8WXV2YWxFQFJhZHdhcmUuY29tPiB3cm90 ZToNCj4+Pj4+Pj4+Pj4+DQo+Pj4+Pj4+Pj4+PiBIaSwNCj4+Pj4+Pj4+Pj4+DQo+Pj4+Pj4+Pj4+ PiBTaG9ydCBWZXJzaW9uDQo+Pj4+Pj4+Pj4+PiBJ4oCZdmUgZW5jb3VudGVyZWQgYW4gaXNzdWUg cmVkaXJlY3RpbmcgdHJhZmZpYyB0byBhbm90aGVyIENQVSB3aGlsZSB1c2luZyBzaGFyZWQgVU1F TS4gVGhlIGZyYW1lIGFycml2ZWQgYXQgdGhlIHJlZGlyZWN0ZWQgQ1BVIHdpdGggaW52YWxpZCBy ZWNlaXZlIHF1ZXVlLiBUaGlzIGNhdXNlZCBhIGtlcm5lbCBjcmFzaCBvbiB0aGUgcGF0Y2ggdGhh dCBzdXBwb3J0cyByZWRpcmVjdGluZyB0byBwYWNrZXRzIHRvIGFueSBxdWV1ZSB3aXRoIHRoZSBz YW1lIHVtZW0gZHVlIHRvIGEgdGVzdCBiYXNlZCBvbiB0aGUgcmVjZWl2ZSBxdWV1ZS4NCj4+Pj4+ Pj4+Pj4+DQo+Pj4+Pj4+Pj4+PiBMb25nIFZlcnNpb24NCj4+Pj4+Pj4+Pj4+IEnigJl2ZSBjcmVh dGVkIGEgdGVzdCBwcm9ncmFtIHRoYXQgcmVkaXJlY3RzIHRyYWZmaWMgYmV0d2VlbiB0d28gaW50 ZXJmYWNlcyAocmVwbGFjaW5nIHRoZSBNQUMgYWRkcmVzcykuIFNlZSB0aGUgY29kZSBiZWxvdy4g SXQgc3RhcnRzIHR3byBzZXBhcmF0ZSBwcm9jZXNzZXMgb24gdHdvIGRpZmZlcmVudCBjb3Jlcy4g V2hlbiBkaXJlY3RpbmcgdHJhZmZpYyBkaXJlY3RseSB0byBhbiBYU0sgc29ja2V0IGFsbCB3b3Jr cyB3ZWxsLiBJ4oCZbSBydW5uaW5nIG9uIGtlcm5lbCA1LjE1LjExNyB3aXRoIE1hZ251cyBwYXRj aCBmb3Igc2hhcmVkIHVtZW0uDQo+Pj4+Pj4+Pj4+Pg0KPj4+Pj4+Pj4+Pj4gVGhlIG5leHQgc3Rl cCB3YXMgYW4gWERQIHByb2dyYW0gdGhhdCByZWRpcmVjdHMgZWFjaCBwYWNrZXQgdG8gdGhlIG90 aGVyIENQVSwgYW5kIHRoZSB4ZHAgQ1BVIHByb2dyYW0gcmVkaXJlY3QgdGhlIHBhY2tldHMgdG8g YW4gWERQIHNvY2tldC4gSW5pdGlhbGx5IHRoaXMgcmVzdWx0ZWQgaW4gYSBrZXJuZWwgY3Jhc2gu IFRoZSByZWFzb24gaXMgdGhhdCB0aGUgcmVjZWl2ZSBxdWV1ZSBpcyBub3QgcmVjZWl2ZWQgY29y cmVjdGx5IG9uY2UgdGhlIHBhY2tldCBzd2l0Y2hlcyBDUFUuDQo+Pj4+Pj4+Pj4+Pg0KPj4+Pj4+ Pj4+Pj4gSeKAmXZlIHBhdGNoZWQgdGhlIGtlcm5lbCBzbyBpdCBkb2VzIHNhbml0eSBjaGVjayBh bmQgZG9lcyBub3QgY3Jhc2ggYnV0IGRlZmF1bHRzIHRvIHF1ZXVlIDAganVzdCBmb3IgdGhlIHVt ZW0gdGVzdC4NCj4+Pj4+Pj4+Pj4+DQo+Pj4+Pj4+Pj4+PiBUaGUga2VybmVsIG5vIGxvbmdlciBj cmFzaGVzIGJ1dCBJIGRvbuKAmXQgZ2V0IHRoZSB0cmFmZmljIHRvIHRoZSBYU0sgc29ja2V0cywg YW5kIEkgbG9nIHRoZSByZWNlaXZlIHF1ZXVlcyBhbmQgdGhleSBkbyBub3Qgc2VlbSByYW5kb206 DQo+Pj4+Pj4+Pj4+PiBPbiBmaXJzdCBpbnRlcmZhY2U6DQo+Pj4+Pj4+Pj4+PiAweEMxMzIzRDUw DQo+Pj4+Pj4+Pj4+PiAweEMxMzQzRDE5DQo+Pj4+Pj4+Pj4+PiAweEMxMzQzRDUwDQo+Pj4+Pj4+ Pj4+Pg0KPj4+Pj4+Pj4+Pj4gT24gc2Vjb25kIGludGVyZmFjZToNCj4+Pj4+Pj4+Pj4+IDB4QzEz NEJENTANCj4+Pj4+Pj4+Pj4+IDB4QzEzNUJENTANCj4+Pj4+Pj4+Pj4+DQo+Pj4+Pj4+Pj4+PiBW ZXJ5IGZldyBiaXRzIGRpZmZlcmVuY2VzIGJldHdlZW4gZWFjaCBvZiB0aGUg4oCccmVjZWl2ZSBx dWV1ZXPigJ0uIEkgY291bGRu4oCZdCByZWFsbHkgZmluZCBzb21ldGhpbmcgaW4gbXkgcHJvZ3Jh bSB3aXRoIHRob3NlIG9yIHNpbWlsYXIgdmFsdWVzLCBvciBpbiB0aGUgcGFja2V0cyBzbyBpdCBt YWtlcyBpdCBsZXNzIGxpa2VseSBpdCBjb21lcyBmcm9tIHNvbWV0aGluZyBJIGRvIGluIHVzZXJz cGFjZS4gU2VlbXMgdG8gc3VnZ2VzdCBzb21lIGZsYWdzIGZpZWxkPyBUaGUgdmFsdWVzIGFyZSBu b3QgYWx3YXlzIHRoZSBzYW1lIGFjcm9zcyByZWJvb3RzIGJ1dCBwcmV0dHkgY2xvc2UuDQo+Pj4+ Pj4+Pj4+Pg0KPj4+Pj4+Pj4+Pj4gQW0gSSBkb2luZyBzb21ldGhpbmcgd3Jvbmc/IEl0IHNlZW1z IHByZXR0eSBiYXNpYy4gTW9zdCBvZiB0aGUgY29kZSBpbiB0aGUgWERQIHByb2dyYW0gd2FzIGp1 c3QgYWRkZWQgZm9yIGRlYnVnZ2luZy4gVGhlIG9ubHkgb2RkaXR5IHBlcmhhcHMgaXMgdXNpbmcg dGhlIHNoYXJlZCB1bWVtLg0KPj4+Pj4+Pj4+Pj4NCj4+Pj4+Pj4+Pj4+IFRoYW5rcywNCj4+Pj4+ Pj4+Pj4+IFl1dmFsLg0KPj4+Pj4+Pj4+Pj4NCj4+Pj4+Pj4+Pj4+IEnigJltIGF0dGFjaGluZyB0 aGUgcHJvZ3JhbSBhbmQgdmFsdWVzIGZyb20gbXkgImRlYnVnIG1hcOKAnS4gSW4gdGhlIGRlYnVn IG1hcDoNCj4+Pj4+Pj4+Pj4+IDAuIFZhbHVlcyAwLzEgLSBXaGljaCB0eXBlIG9mIHByb2dyYW0g cmFuICh3aXRoL3dpdGhvdXQgQ1BVIHJlZGlyZWN0aW9uKS4NCj4+Pj4+Pj4+Pj4+IDEuIFZhbHVl cyAyWFkgLSBwYWNrZXQgcmVkaXJlY3RlZCBmcm9tIGNvcmUgWCB0byBjb3JlIFkgKDFzdCBzdGFn ZSkuDQo+Pj4+Pj4+Pj4+PiAyLiBWYWx1ZXMgNFhZIC0gcGFja2V0IG9uIGNvcmUgWCByZXR1cm5z IGFjdGlvbiBZICgxc3Qgc3RhZ2UpLg0KPj4+Pj4+Pj4+Pj4gKFRoZXNlIHN1Z2dlc3QgdGhhdCAx c3Qgc3RhZ2Ugd29ya2VkIGNvcnJlY3RseSkuDQo+Pj4+Pj4+Pj4+PiAzLiBWYWx1ZXMgMVhYWVkg LSBwYWNrZXQgcmVjZWl2ZSBxdWV1ZSBYWCBvbiBjb3JlIFlZIChYWCA9IDEwIGlzIGludmFsaWQg cmVjZWl2ZSBxdWV1ZSBvdXRzaWRlIDIuLjUpLg0KPj4+Pj4+Pj4+Pj4gNC4gMlhYWFggLSBwYWNr ZXQgcmVjZWl2ZSBxdWV1ZSBvbiBhbnkgY29yZSAoWFhYWCAtIDQ5OTkgaW1lYW5zIHF1ZXVlIGdy ZWF0ZXIgdGhhbiA1MDAwKS4NCj4+Pj4+Pj4+Pj4+IDUuIFJhbmRvbSBlbnRyeSAtIGEgcmVjZWl2 ZSBxdWV1ZS4NCj4+Pj4+Pj4+Pj4+DQo+Pj4+Pj4+Pj4+PiBEZWJ1ZyBtYXAgdmFsdWVzIHdpdGhv dXQgQ1BVIHJlZGlyZWN0aW9uOg0KPj4+Pj4+Pj4+Pj4gKy0tLS0tLSstLS0tLS0rLS0tLS0tLS0t LS0tLS0rDQo+Pj4+Pj4+Pj4+PiB8IFBvcnQgfCBLZXkgIHwgICAgIFJlY2VpdmVkIHwNCj4+Pj4+ Pj4+Pj4+ICstLS0tLS0rLS0tLS0tKy0tLS0tLS0tLS0tLS0tKw0KPj4+Pj4+Pj4+Pj4gfCAgICAw IHwgMTAzMiB8ICAgICAgICAgIDUwNCB8DQo+Pj4+Pj4+Pj4+PiB8ICAgIDAgfCAxMDI0IHwgICAg IDM3MDA1OTkyIHwNCj4+Pj4+Pj4+Pj4+IHwgICAgMCB8IDEwMzQgfCAgICAgMzc1NDQwNTIgfA0K Pj4+Pj4+Pj4+Pj4gfCAgICAwIHwgICAgMCB8ICAgICA3NDU0Njg3NSB8DQo+Pj4+Pj4+Pj4+PiB8 ICAgIDEgfCAxMDM0IHwgICAgIDM1NzY1OTYxIHwNCj4+Pj4+Pj4+Pj4+IHwgICAgMSB8ICAgIDAg fCAgICAgNzE0OTI3NzMgfA0KPj4+Pj4+Pj4+Pj4gfCAgICAxIHwgMTAyNCB8ICAgICAzNTcyOTEw NyB8DQo+Pj4+Pj4+Pj4+PiB8ICAgIDEgfCAxMDMyIHwgICAgICAgICAgMjc3IHwNCj4+Pj4+Pj4+ Pj4+ICstLS0tLS0rLS0tLS0tKy0tLS0tLS0tLS0tLS0tKw0KPj4+Pj4+Pj4+Pj4NCj4+Pj4+Pj4+ Pj4+IERlYnVnIG1hcCB2YWx1ZSB3aXRoIENQVSByZWRpcmVjdGlvbiAobm8gb3RoZXIgY2hhbmdl KToNCj4+Pj4+Pj4+Pj4+ICstLS0tLS0rLS0tLS0tKy0tLS0tLS0tLS0tLS0tKw0KPj4+Pj4+Pj4+ Pj4gfCBQb3J0IHwgS2V5ICB8ICAgICBSZWNlaXZlZCB8DQo+Pj4+Pj4+Pj4+PiArLS0tLS0tKy0t LS0tLSstLS0tLS0tLS0tLS0tLSsNCj4+Pj4+Pj4+Pj4+IHwgICAgMCB8ICAgIDEgfCAgICAgICAg IDM0MDAgfA0KPj4+Pj4+Pj4+Pj4gfCAgICAwIHwgIDIyMyB8ICAgICAgICAgMjk0NyB8DQo+Pj4+ Pj4+Pj4+PiB8ICAgIDAgfCAgMjMyIHwgICAgICAgICAgNDU0IHwNCj4+Pj4+Pj4+Pj4+IHwgICAg MCB8ICA0MjQgfCAgICAgICAgICA0NTQgfA0KPj4+Pj4+Pj4+Pj4gfCAgICAwIHwgIDQzNCB8ICAg ICAgICAgMjk0NyB8DQo+Pj4+Pj4+Pj4+PiB8ICAgIDAgfCAxMTAwMiB8ICAgICAgICAgIDQ1NCB8 DQo+Pj4+Pj4+Pj4+PiB8ICAgIDAgfCAxMTAwMyB8ICAgICAgICAgMjk0NyB8DQo+Pj4+Pj4+Pj4+ PiB8ICAgIDAgfCAyMDAwMCB8ICAgICAgICAgIDEwNiB8DQo+Pj4+Pj4+Pj4+PiB8ICAgIDAgfCAy MDAxNiB8ICAgICAgICAgICAgNyB8DQo+Pj4+Pj4+Pj4+PiB8ICAgIDAgfCAyMDAyNCB8ICAgICAg ICAgMTA1OCB8DQo+Pj4+Pj4+Pj4+PiB8ICAgIDAgfCAyMDU4MiB8ICAgICAgICAgICAgMiB8DQo+ Pj4+Pj4+Pj4+PiB8ICAgIDAgfCAyNDk5OSB8ICAgICAgICAgMjIzMSB8DQo+Pj4+Pj4+Pj4+PiB8 ICAgIDAgfCAzMjQxMjk1MTg0IHwgICAgICAgICAgMzM5IHwNCj4+Pj4+Pj4+Pj4+IHwgICAgMCB8 IDMyNDE0MjYyMDEgfCAgICAgICAgICAgIDMgfA0KPj4+Pj4+Pj4+Pj4gfCAgICAwIHwgMzI0MTQy NjI1NiB8ICAgICAgICAgMTg5MSB8DQo+Pj4+Pj4+Pj4+PiB8ICAgIDEgfCAgICAxIHwgICAgICAg ICAxMDEzIHwNCj4+Pj4+Pj4+Pj4+IHwgICAgMSB8ICAyMjMgfCAgICAgICAgICA2MTAgfA0KPj4+ Pj4+Pj4+Pj4gfCAgICAxIHwgIDIzMiB8ICAgICAgICAgIDQwNCB8DQo+Pj4+Pj4+Pj4+PiB8ICAg IDEgfCAgNDI0IHwgICAgICAgICAgNDA0IHwNCj4+Pj4+Pj4+Pj4+IHwgICAgMSB8ICA0MzQgfCAg ICAgICAgICA2MTAgfA0KPj4+Pj4+Pj4+Pj4gfCAgICAxIHwgMTEwMDIgfCAgICAgICAgICA0MDQg fA0KPj4+Pj4+Pj4+Pj4gfCAgICAxIHwgMTEwMDMgfCAgICAgICAgICA2MTAgfA0KPj4+Pj4+Pj4+ Pj4gfCAgICAxIHwgMjAwMDAgfCAgICAgICAgICAgMTcgfA0KPj4+Pj4+Pj4+Pj4gfCAgICAxIHwg MjAwMjQgfCAgICAgICAgICAzMDkgfA0KPj4+Pj4+Pj4+Pj4gfCAgICAxIHwgMjQ5OTkgfCAgICAg ICAgICA2ODkgfA0KPj4+Pj4+Pj4+Pj4gfCAgICAxIHwgMzI0MTQ1OTAyNCB8ICAgICAgICAgIDMw OSB8DQo+Pj4+Pj4+Pj4+PiB8ICAgIDEgfCAzMjQxNTI0NTYwIHwgICAgICAgICAgMzgxIHwNCj4+ Pj4+Pj4+Pj4+ICstLS0tLS0rLS0tLS0tKy0tLS0tLS0tLS0tLS0tKw0KPj4+Pj4+Pj4+Pj4NCj4+ Pj4+Pj4+Pj4+IFRoZSBYRFAgY29kZSAoI2lmIDAgaXMgZm9yIHRoZSBubyBDUFUgcmVkaXJlY3Rp b24pOg0KPj4+Pj4+Pj4+Pj4gLyogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAgKi8N Cj4+Pj4+Pj4+Pj4+DQo+Pj4+Pj4+Pj4+PiAjaW5jbHVkZSA8bGludXgvaWZfZXRoZXIuaD4NCj4+ Pj4+Pj4+Pj4+ICNpbmNsdWRlIDxsaW51eC9icGYuaD4NCj4+Pj4+Pj4+Pj4+ICNpbmNsdWRlIDxs aW51eC9pbi5oPg0KPj4+Pj4+Pj4+Pj4NCj4+Pj4+Pj4+Pj4+ICNpbmNsdWRlIDxicGYvYnBmX2hl bHBlcnMuaD4NCj4+Pj4+Pj4+Pj4+ICNpbmNsdWRlIDxicGYvYnBmX2VuZGlhbi5oPg0KPj4+Pj4+ Pj4+Pj4NCj4+Pj4+Pj4+Pj4+ICNpbmNsdWRlICJ4ZHAvcGFyc2luZ19oZWxwZXJzLmgiDQo+Pj4+ Pj4+Pj4+Pg0KPj4+Pj4+Pj4+Pj4gLyogUmVkaXJlY3QgdG8gU1AgcXVldWVzIG1hcC4gKi8NCj4+ Pj4+Pj4+Pj4+IHN0cnVjdA0KPj4+Pj4+Pj4+Pj4gew0KPj4+Pj4+Pj4+Pj4gX191aW50ICh0eXBl LCBCUEZfTUFQX1RZUEVfWFNLTUFQKTsNCj4+Pj4+Pj4+Pj4+IF9fdHlwZSAoa2V5LCBfX3UzMik7 DQo+Pj4+Pj4+Pj4+PiBfX3R5cGUgKHZhbHVlLCBfX3UzMik7DQo+Pj4+Pj4+Pj4+PiBfX3VpbnQg KG1heF9lbnRyaWVzLCAxMjgpOw0KPj4+Pj4+Pj4+Pj4gfSB4c2tzX21hcCBTRUMoIi5tYXBzIik7 DQo+Pj4+Pj4+Pj4+Pg0KPj4+Pj4+Pj4+Pj4gLyogUmVkaXJlY3QgdG8gQ1BVcyBtYXAuICovDQo+ Pj4+Pj4+Pj4+PiBzdHJ1Y3QNCj4+Pj4+Pj4+Pj4+IHsNCj4+Pj4+Pj4+Pj4+IF9fdWludCAodHlw ZSwgQlBGX01BUF9UWVBFX0NQVU1BUCk7DQo+Pj4+Pj4+Pj4+PiBfX3VpbnQgKGtleV9zaXplLCBz aXplb2YgKF9fdTMyKSk7DQo+Pj4+Pj4+Pj4+PiBfX3VpbnQgKHZhbHVlX3NpemUsIHNpemVvZiAo c3RydWN0IGJwZl9jcHVtYXBfdmFsKSk7DQo+Pj4+Pj4+Pj4+PiBfX3VpbnQgKG1heF9lbnRyaWVz LCAzMik7DQo+Pj4+Pj4+Pj4+PiB9IGNwdV9tYXAgU0VDKCIubWFwcyIpOw0KPj4+Pj4+Pj4+Pj4N Cj4+Pj4+Pj4+Pj4+IC8qIFN0YXRpc3RpY3MgYW5kIGRlYnVnIG1hcHMuICovDQo+Pj4+Pj4+Pj4+ PiBzdHJ1Y3QNCj4+Pj4+Pj4+Pj4+IHsNCj4+Pj4+Pj4+Pj4+IF9fdWludCAodHlwZSwgQlBGX01B UF9UWVBFX1BFUkNQVV9BUlJBWSk7DQo+Pj4+Pj4+Pj4+PiBfX3R5cGUgKGtleSwgX191MzIpOw0K Pj4+Pj4+Pj4+Pj4gX190eXBlICh2YWx1ZSwgX191MzIpOw0KPj4+Pj4+Pj4+Pj4gX191aW50ICht YXhfZW50cmllcywgNjQpOw0KPj4+Pj4+Pj4+Pj4gfSB4ZHBfc3RhdHNfbWFwIFNFQygiLm1hcHMi KTsNCj4+Pj4+Pj4+Pj4+DQo+Pj4+Pj4+Pj4+PiBzdHJ1Y3QNCj4+Pj4+Pj4+Pj4+IHsNCj4+Pj4+ Pj4+Pj4+IF9fdWludCAodHlwZSwgQlBGX01BUF9UWVBFX0hBU0gpOw0KPj4+Pj4+Pj4+Pj4gX190 eXBlIChrZXksIF9fdTMyKTsNCj4+Pj4+Pj4+Pj4+IF9fdHlwZSAodmFsdWUsIF9fdTMyKTsNCj4+ Pj4+Pj4+Pj4+IF9fdWludCAobWF4X2VudHJpZXMsIDY0KTsNCj4+Pj4+Pj4+Pj4+IH0geGRwX2Rl YnVnX3Byb3RvIFNFQygiLm1hcHMiKTsNCj4+Pj4+Pj4+Pj4+DQo+Pj4+Pj4+Pj4+PiBzdGF0aWMg X191MzIgb25ldmFsID0gMTsNCj4+Pj4+Pj4+Pj4+DQo+Pj4+Pj4+Pj4+PiBpbnQgbXlfcGFyc2Vf ZXRoaGRyIChzdHJ1Y3QgaGRyX2N1cnNvciogbmgsIHZvaWQqIGRhdGFlbmQsIHN0cnVjdCBldGho ZHIqKiBldGgpDQo+Pj4+Pj4+Pj4+PiB7DQo+Pj4+Pj4+Pj4+PiBfX3UxNiBldGh0eXBlOw0KPj4+ Pj4+Pj4+Pj4gKmV0aCA9IG5oLT5wb3M7DQo+Pj4+Pj4+Pj4+PiBpZiAoKHZvaWQqKSAmKCpldGgp IFsxXSA+IGRhdGFlbmQpDQo+Pj4+Pj4+Pj4+PiB7DQo+Pj4+Pj4+Pj4+PiByZXR1cm4gKC0xKTsN Cj4+Pj4+Pj4+Pj4+IH0NCj4+Pj4+Pj4+Pj4+DQo+Pj4+Pj4+Pj4+PiBldGh0eXBlID0gKCpldGgp LT5oX3Byb3RvOw0KPj4+Pj4+Pj4+Pj4gbmgtPnBvcyA9ICYoKmV0aCkgWzFdOw0KPj4+Pj4+Pj4+ Pj4gaWYgKGV0aHR5cGUgPT0gYnBmX250b2hzIChFVEhfUF84MDIxUSkpDQo+Pj4+Pj4+Pj4+PiB7 DQo+Pj4+Pj4+Pj4+PiBzdHJ1Y3Qgdmxhbl9oZHIqIHZsYW4gPSAoc3RydWN0IHZsYW5faGRyKikg JigqZXRoKSBbMV07DQo+Pj4+Pj4+Pj4+PiBpZiAoKHZvaWQqKSAmdmxhbiBbMV0gPiBkYXRhZW5k KQ0KPj4+Pj4+Pj4+Pj4gew0KPj4+Pj4+Pj4+Pj4gICAgICAgcmV0dXJuICgtMSk7DQo+Pj4+Pj4+ Pj4+PiB9DQo+Pj4+Pj4+Pj4+PiAgIGV0aHR5cGUgPSB2bGFuLT5oX3ZsYW5fZW5jYXBzdWxhdGVk X3Byb3RvOw0KPj4+Pj4+Pj4+Pj4gLyogaW5jX2RlYnVnX21hcCAoMTAwMDArKGJwZl9udG9ocyAo dmxhbi0+aF92bGFuX1RDSSkgJiAweDBGRkYpKTsgKi8NCj4+Pj4+Pj4+Pj4+IC8qIGluY19kZWJ1 Z19tYXAgKHZsYW4tPmhfdmxhbl9UQ0kpOyAqLw0KPj4+Pj4+Pj4+Pj4gbmgtPnBvcyA9ICZ2bGFu IFsxXTsNCj4+Pj4+Pj4+Pj4+IH0NCj4+Pj4+Pj4+Pj4+DQo+Pj4+Pj4+Pj4+PiByZXR1cm4gKGV0 aHR5cGUpOw0KPj4+Pj4+Pj4+Pj4gfQ0KPj4+Pj4+Pj4+Pj4NCj4+Pj4+Pj4+Pj4+IHN0YXRpYyB2 b2lkIGluY19kZWJ1Z19tYXAgKF9fdTMyIGtleSkNCj4+Pj4+Pj4+Pj4+IHsNCj4+Pj4+Pj4+Pj4+ ICNpZmRlZiBXSVRIX1NUQVRTDQo+Pj4+Pj4+Pj4+PiBicGZfbWFwX3VwZGF0ZV9lbGVtICgmeGRw X2RlYnVnX3Byb3RvLA0KPj4+Pj4+Pj4+Pj4gICAgICAgICAgICAgICAgICAgICZrZXksIChfX3Uz MiopICZvbmV2YWwsIEJQRl9OT0VYSVNUKTsNCj4+Pj4+Pj4+Pj4+IF9fdTMyKiByZWMgPSBicGZf bWFwX2xvb2t1cF9lbGVtICgmeGRwX2RlYnVnX3Byb3RvLCAoX191MzIqKSAma2V5KTsNCj4+Pj4+ Pj4+Pj4+IGlmIChyZWMgIT0gTlVMTCkNCj4+Pj4+Pj4+Pj4+IHsNCj4+Pj4+Pj4+Pj4+ICsrKCpy ZWMpOw0KPj4+Pj4+Pj4+Pj4gfQ0KPj4+Pj4+Pj4+Pj4gI2VuZGlmDQo+Pj4+Pj4+Pj4+PiB9DQo+ Pj4+Pj4+Pj4+Pg0KPj4+Pj4+Pj4+Pj4NCj4+Pj4+Pj4+Pj4+DQo+Pj4+Pj4+Pj4+PiBTRUMgKCJ4 ZHAiKQ0KPj4+Pj4+Pj4+Pj4gaW50IHJkd3JfeHNrX3Byb2cgKHN0cnVjdCB4ZHBfbWQgKmN0eCkN Cj4+Pj4+Pj4+Pj4+IHsNCj4+Pj4+Pj4+Pj4+IGVudW0geGRwX2FjdGlvbiBhY3Rpb247DQo+Pj4+ Pj4+Pj4+PiBpbnQgaW5kZXggPSBjdHgtPnJ4X3F1ZXVlX2luZGV4Ow0KPj4+Pj4+Pj4+Pj4gdm9p ZCogZGF0YWVuZCA9ICh2b2lkICopKGxvbmcpY3R4LT5kYXRhX2VuZDsNCj4+Pj4+Pj4+Pj4+IHZv aWQqIGRhdGEgPSAodm9pZCAqKShsb25nKWN0eC0+ZGF0YTsNCj4+Pj4+Pj4+Pj4+IGludCBzdGFn ZSA9IDA7DQo+Pj4+Pj4+Pj4+Pg0KPj4+Pj4+Pj4+Pj4gc3RydWN0IGhkcl9jdXJzb3Igbmg7DQo+ Pj4+Pj4+Pj4+Pg0KPj4+Pj4+Pj4+Pj4gX191MzIgKnBrdF9jb3VudDsNCj4+Pj4+Pj4+Pj4+IHN0 cnVjdCBldGhoZHIqIGV0aDsNCj4+Pj4+Pj4+Pj4+DQo+Pj4+Pj4+Pj4+PiAjaWZkZWYgV0lUSF9T VEFUUw0KPj4+Pj4+Pj4+Pj4gcGt0X2NvdW50ID0gYnBmX21hcF9sb29rdXBfZWxlbSgmeGRwX3N0 YXRzX21hcCwgJmluZGV4KTsNCj4+Pj4+Pj4+Pj4+IGlmIChwa3RfY291bnQgIT0gTlVMTCkNCj4+ Pj4+Pj4+Pj4+IHsNCj4+Pj4+Pj4+Pj4+ICsrKnBrdF9jb3VudDsNCj4+Pj4+Pj4+Pj4+IH0NCj4+ Pj4+Pj4+Pj4+ICNlbmRpZg0KPj4+Pj4+Pj4+Pj4NCj4+Pj4+Pj4+Pj4+IC8qIFBhcnNlIEV0aGVy bmV0ICYgVkxBTiAqLw0KPj4+Pj4+Pj4+Pj4gbmgucG9zID0gZGF0YTsNCj4+Pj4+Pj4+Pj4+IGlu dCBldGh0eXBlID0gbXlfcGFyc2VfZXRoaGRyICgmbmgsIGRhdGFlbmQsICZldGgpOw0KPj4+Pj4+ Pj4+Pj4gaWYgKGV0aHR5cGUgIT0gYnBmX250b2hzICgweDA4MDApKQ0KPj4+Pj4+Pj4+Pj4gew0K Pj4+Pj4+Pj4+Pj4gcmV0dXJuIChYRFBfUEFTUyk7DQo+Pj4+Pj4+Pj4+PiB9DQo+Pj4+Pj4+Pj4+ Pg0KPj4+Pj4+Pj4+Pj4gLyogRGlyZWN0IFhTSyByZWRpcmVjdC4gKi8NCj4+Pj4+Pj4+Pj4+ICNp ZiAwDQo+Pj4+Pj4+Pj4+PiBpbmNfZGVidWdfbWFwIChzdGFnZSk7DQo+Pj4+Pj4+Pj4+PiBhY3Rp b24gPSAgYnBmX3JlZGlyZWN0X21hcCAoJnhza3NfbWFwLCBpbmRleCwgWERQX1BBU1MpOw0KPj4+ Pj4+Pj4+Pj4gaW5jX2RlYnVnX21hcCAoMTAwMCArIGluZGV4KjEwICsgYWN0aW9uKTsNCj4+Pj4+ Pj4+Pj4+ICNlbmRpZg0KPj4+Pj4+Pj4+Pj4gLyogQ1BVIG1hcCByZWRpcmVjdC4gKi8NCj4+Pj4+ Pj4+Pj4+IF9fdTMyIGNwdWlkID0gYnBmX2dldF9zbXBfcHJvY2Vzc29yX2lkICgpOw0KPj4+Pj4+ Pj4+Pj4gX191MzIgdGFyZ2V0Y3B1ID0gY3B1aWQgXiAweDAxOw0KPj4+Pj4+Pj4+Pj4gKytzdGFn ZTsNCj4+Pj4+Pj4+Pj4+IGluY19kZWJ1Z19tYXAgKHN0YWdlKTsNCj4+Pj4+Pj4+Pj4+IGluY19k ZWJ1Z19tYXAgKDIwMCArIGNwdWlkICogMTAgKyB0YXJnZXRjcHUpOw0KPj4+Pj4+Pj4+Pj4gYWN0 aW9uID0gIGJwZl9yZWRpcmVjdF9tYXAgKCZjcHVfbWFwLCB0YXJnZXRjcHUsIFhEUF9QQVNTKTsN Cj4+Pj4+Pj4+Pj4+IGluY19kZWJ1Z19tYXAgKDQwMCArIHRhcmdldGNwdSAqIDEwICsgYWN0aW9u KTsNCj4+Pj4+Pj4+Pj4+IHJldHVybiAoYWN0aW9uKTsNCj4+Pj4+Pj4+Pj4+IH0NCj4+Pj4+Pj4+ Pj4+DQo+Pj4+Pj4+Pj4+PiBTRUMgKCJ4ZHAvY3B1bWFwIikNCj4+Pj4+Pj4+Pj4+IGludCByZHdy X2NwdV9wcm9nKHN0cnVjdCB4ZHBfbWQgKmN0eCkNCj4+Pj4+Pj4+Pj4+IHsNCj4+Pj4+Pj4+Pj4+ IF9fdTY0KiBkYXRhZW5kNjQgPSAoX191NjQqKSAobG9uZykgY3R4LT5kYXRhX2VuZDsNCj4+Pj4+ Pj4+Pj4+IF9fdTY0KiBkYXRhNjQgPSAoX191NjQqKSAobG9uZykgY3R4LT5kYXRhOw0KPj4+Pj4+ Pj4+Pj4gX191MzIgcnhxdWV1ZSA9IGN0eC0+cnhfcXVldWVfaW5kZXg7DQo+Pj4+Pj4+Pj4+PiBp ZiAocnhxdWV1ZSA8IDUwMDApDQo+Pj4+Pj4+Pj4+PiB7DQo+Pj4+Pj4+Pj4+PiBpbmNfZGVidWdf bWFwICgyMDAwMCArIHJ4cXVldWUpOw0KPj4+Pj4+Pj4+Pj4gfQ0KPj4+Pj4+Pj4+Pj4gZWxzZQ0K Pj4+Pj4+Pj4+Pj4gew0KPj4+Pj4+Pj4+Pj4gaW5jX2RlYnVnX21hcCAocnhxdWV1ZSk7DQo+Pj4+ Pj4+Pj4+PiBpbmNfZGVidWdfbWFwICgyNDk5OSk7DQo+Pj4+Pj4+Pj4+PiB9DQo+Pj4+Pj4+Pj4+ Pg0KPj4+Pj4+Pj4+Pj4gcnhxdWV1ZSA9IChyeHF1ZXVlID49IDIgJiYgcnhxdWV1ZSA8IDYpID8g cnhxdWV1ZSA6IDEwOw0KPj4+Pj4+Pj4+Pj4gX191MzIgY3B1aWQgPSBicGZfZ2V0X3NtcF9wcm9j ZXNzb3JfaWQgKCk7DQo+Pj4+Pj4+Pj4+PiBjcHVpZCA9IChjcHVpZCA8IDEyKSA/IGNwdWlkIDog MjA7DQo+Pj4+Pj4+Pj4+PiBpbmNfZGVidWdfbWFwICgxMDAwMCArIDEwMCpyeHF1ZXVlICsgY3B1 aWQpOw0KPj4+Pj4+Pj4+Pj4NCj4+Pj4+Pj4+Pj4+IHJldHVybiBicGZfcmVkaXJlY3RfbWFwICgm eHNrc19tYXAsIGJwZl9nZXRfc21wX3Byb2Nlc3Nvcl9pZCAoKSwgMCk7DQo+Pj4+Pj4+Pj4+PiB9 DQoNCg0K