Re: XDP CPU maps & shared umem
Yuval El-Hanany <[email protected]> Mon, 27 May 2024 07:34:30 +0000
| Newsgroups | org.kernel.vger.xdp-newbies |
|---|---|
| Message-ID | <[email protected]> |
WWVhaCwNCiAgICAgICAgYXMgZmFyIGRvd24gYXMgSSBkdWcgaW4gdGhlIGNvZGUsIGl0IHNlZW1z IGl04oCZcyB0aGUgb25seSBvbmUgdGhhdOKAmXMgdXNlZC4gVGhlIG90aGVyIG1lbWJlcnMgYXJl IHJlZ19zdGF0ZSAmIG5hcGlfaWQuIEnigJltIHVuZmFtaWxpYXIgd2l0aCB0aGVpciBleGFjdCBw dXJwb3NlcywgYnV0IGRvZXNu4oCZdCBzb3VuZCBsaWtlIHRoZXnigJlyZSBuZWNlc3NhcnkgZG93 biB0aGUgbGluZS4gT25lIG90aGVyIGNvbmNlcm4gaXMgdHhxIElNTy4gSXQgaXMgbm90IGluaXRp YWxpc2VkIHRvIGFueSB2YWx1ZSBpbiB4ZHBfYnVmZi4gV2hpbGUgaXQgbWF5IG5vdCBiZSByZWxl dmFudCBjb25zaWRlcmluZyBpdOKAmXMgYSByZWNlaXZlZCBwYWNrZXQsIGl0IHNlZW1zIHdyb25n IHRvIGtlZXAgYSBkYW5nbGluZyBwb2ludGVyIGJvdGggaW4gdGVybXMgb2Ygc2VjdXJpdHkgKGxl YWtpbmcgcHJldmlvdXMgdmFsdWVzKSBhbmQgcm9idXN0bmVzcy4gTWF5YmUganVzdCBzZXQgaXQg dG8gTlVMTD8NCg0KICAgICAgICBJ4oCZdmUgYmVlbiByYWNraW5nIG15IGJyYWluIGFzIHRvIHdo YXQgaXMgdGhlIGFjY2VwdGVkIG1ldGhvZCB0byBwYXNzIHRoZSByZWNlaXZlIHF1ZXVlLiBQYXNz aW5nIGl0IG9uIHRoZSBwYWNrZXQgaGVhZHJvb20gc2VlbWVkIGxpa2UgYSByZWFzb25hYmxlIHNv bHV0aW9uLCBidXQgaXQgd291bGQgbWVhbiBtZW1vcnkgYWNjZXNzIHRvIHRoZSBwYWNrZXQgbWVt b3J5IG9uIHBhY2tldCBhcnJpdmFsIG9uIHRoZSBzZWNvbmQgQ1BVIHdoaWNoIG1heSBiZSBoYXJt ZnVsIHRvIHBlcmZvcm1hbmNlLiBUaGUgcXVldWUgaXRzZWxmIGlzIGp1c3QgYSBwb2ludGVyIHF1 ZXVlIHNvIGNhbuKAmXQgcGlnZ3liYWNrIG9uIGl0IHVubGVzcyB1c2luZyBhIGRpZmZlcmVudCBr aW5kIG9mIHF1ZXVlLiBXb3VsZCBiZSBncmVhdCB0byBoZWFyIGhvdyBpdCBzaG91bGQgYmUgZG9u ZS4NCg0KICAgICAgICBUaGFua3MsDQogICAgICAgICAgICAgICAgWXV2YWwuDQoNCj4gT24gMjcg TWF5IDIwMjQsIGF0IDg6NDgsIE1hZ251cyBLYXJsc3NvbiA8bWFnbnVzLmthcmxzc29uQGdtYWls LmNvbT4gd3JvdGU6DQo+DQo+IENBVVRJT046RXh0ZXJuYWwgRW1haWwsIERvIG5vdCBjbGljayBv biBsaW5rcyBvciBvcGVuIGF0dGFjaG1lbnRzIHVubGVzcyB5b3UgcmVjb2duaXplIHRoZSBzZW5k ZXIgYW5kIGtub3cgdGhlIGNvbnRlbnQgaXMgc2FmZS4NCj4NCj4gT24gU3VuLCAyNiBNYXkgMjAy NCBhdCAxNDo0OCwgWXV2YWwgRWwtSGFuYW55IDx5dXZhbGVAcmFkd2FyZS5jb20+IHdyb3RlOg0K Pj4NCj4+IENvcnJlY3Rpb24sDQo+PiAgICAgICAgdGhlIHJ4cSBwb2ludGVyIGlzIGluaXTigJlk IGdsb2JhbGx5IGZvciBhbGwgZnJhbWVzIGJlZm9yZSB0aGUgZnJhbWUgbG9vcHMsIGJ1dCBvbmx5 IHRoZSBkZXZpY2UgYW5kIHRoZSBtZW1vcnkgaW5mb3JtYXRpb24gYXJlIHNldCBmcm9tIHRoZSBY RFAgZnJhbWUuIFNvIHN0aWxsIGFuIGlzc3VlIHdpdGggdGhlIHF1ZXVlX2luZGV4LCBidXQgdGhl IHRlc3RzIG9uIHRoZSBkZXZpY2UgYW5kIG1lbW9yeSBpbmZvIGluIHhza19yY3Ygc2hvdWxkIGJl IGZpbmUuDQo+Pg0KPj4gICAgICAgIENoZWVycywNCj4+ICAgICAgICAgICAgICAgIFl1dmFsLg0K Pg0KPiBIaSBZdXZhbCwNCj4NCj4gTm93IEkgYW0gYmFjay4gWWVzLCB0aGlzIHNlZW1zIHRvIGJl IGEgYnVnIHNvIHRoYW5rIHlvdSBmb3Igc3BvdHRpbmcNCj4gaXQuIFRoaXMgaXMgbm90aGluZyBJ IGhhdmUgZXZlciB0ZXN0ZWQgc2luY2UgSSB0aG91Z2h0IHlvdSB3b3VsZCBkbyBhbg0KPiBYU0tN QVAgcmVkaXJlY3QgdG8gdGhlICJyaWdodCIgY29yZSBmaXJzdC4gQnV0IHRoZXJlIGlzIG5vdGhp bmcNCj4gaGluZGVyaW5nIHRoYXQgc29tZW9uZSB3b3VsZCBkbyBhIENQVU1BUCByZWRpcmVjdCBm aXJzdCB0aGVuIGFuIFhTS01BUA0KPiByZWRpcmVjdCwgc28gc2hvdWxkIGJlIHN1cHBvcnRlZC4g U28gaW4geW91ciBhbmFseXNpcywgaXMgaXQgb25seQ0KPiBxdWV1ZV9pbmRleCB0aGF0IG5lZWRz IHRvIGJlIHBvcHVsYXRlZCBhdCBDUFVNQVAgcmVkaXJlY3QgdGltZSBmb3INCj4gdGhpcyB0byB3 b3JrPw0KPg0KPiBUaGFua3M6IE1hZ251cw0KPg0KPj4+IE9uIDI2IE1heSAyMDI0LCBhdCAxMjow MiwgWXV2YWwgRWwtSGFuYW55IDx5dXZhbGVAcmFkd2FyZS5jb20+IHdyb3RlOg0KPj4+DQo+Pj4g SGksDQo+Pj4gc28gSeKAmXZlIGR1ZyBhIGJpdCBkZWVwZXIuIEl0IHNlZW1zIHRoZSByZWNlaXZl IHF1ZXVlIGlzIG5vdCBtYWludGFpbmVkIGFjcm9zcyBDUFVzIGFuZCB0aGlzIG1heSBtYWtlIHRo ZSB3aG9sZSBwcmFjdGljZSBvZiByZWRpcmVjdGluZyB0byBYU0sgdW5zYWZlIGlmIEkgcmVhZCB0 aGUgY29kZSBjb3JyZWN0bHkuIEl0IGFsc28gc2VlbXMgdGhpcyBwZXJzaXN0cyB0byBrZXJuZWwg Ni42LjguIEFtIEkgbWlzc2luZyBzb21ldGhpbmc/DQo+Pj4NCj4+PiBUaGUgY29kZSBpbiBjcHVt YXAgcnVucyBYRFAgcHJvZ3JhbXMgQlVUIGRvZXNu4oCZdCBmaWxsIHRoZSByeHEgKHNlZSBhbHNv IHRoZSBUT0RPIGNvbW1lbnQgaW4gdGhlIGNvZGUpLiBUaGUgWERQIGZyYW1lIGlzIGNvbnZlcnRl ZCB0byBYRFAgYnVmZmVyIGJ1dCB0aGUgcnhxIGFuZCB0eHEgYXJlIG5vdCBmaWxsZWQuIEl0IHNl ZW1zIHRoZXkgcmVtYWluIGFzIGRhbmdsaW5nIHBvaW50ZXJzLiBXaGVuIF9feHNrX21hcF9yZWRp cmVjdCBpcyBjYWxsZWQgYW5kIGluIHR1cm4geHNrX3JjdiB0aGUgcnhxIGlzIGNvbnN1bHRlZCBi b3RoIHRvIGNoZWNrIGlmIHRoZSB1bWVtIGlzIHNoYXJlZCAoaW4gdGhlIG5ldyBwYXRjaCkgYXMg d2VsbCBhcyBkZWNpZGUgd2hldGhlciB6ZXJvIGNvcHkgaXMgdXNlZCBvciBub3QuIFNpbmNlIHJ4 cSBpcyBub3QgdmFsaWQsIEnigJltIG5vdCBjZXJ0YWluIHdoYXQgdGhlIG91dGNvbWUgaXMuIE9u Y2UgSSBieXBhc3NlZCB1bWVtIGNoZWNrLCBJIG5vIGxvbmdlciBjcmFzaCB0aGUga2VybmVsIGJ1 dCBJJ20gZGVmaW5pdGVseSBub3Qgc2VlaW5nIHRyYWZmaWMgcnVubmluZy4NCj4+Pg0KPj4+IFRo YW5rcywNCj4+PiBZdXZhbC4NCj4+Pg0KPj4+IEhlcmUgYXJlIHRoZSBleGNlcnB0cyBmcm9tIHRo ZSBjb2RlICg1LjE1LjExNyk6DQo+Pj4NCj4+PiBjcHVtYXAuYzoyMTIgPGNwdV9tYXBfYnBmX3By b2dfcnVuX3hkcD4gPT09PT0gTm90ZSB0aGUgY29tbWVudCBpbiB0aGUgY29kZS4gPT09PT0NCj4+ PiAgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsNCj4+PiAgICAgICBzdHJ1Y3QgeGRwX2ZyYW1l ICp4ZHBmID0gZnJhbWVzW2ldOw0KPj4+ICAgICAgIHUzMiBhY3Q7DQo+Pj4gICAgICAgaW50IGVy cjsNCj4+Pg0KPj4+IHJ4cS5kZXYgPSB4ZHBmLT5kZXZfcng7DQo+Pj4gICAgICAgcnhxLm1lbSA9 IHhkcGYtPm1lbTsNCj4+PiAgICAgICAvKiBUT0RPOiByZXBvcnQgcXVldWVfaW5kZXggdG8geGRw X3J4cV9pbmZvICovDQo+Pj4NCj4+PiAgICAgICB4ZHBfY29udmVydF9mcmFtZV90b19idWZmKHhk cGYsICZ4ZHApOw0KPj4+DQo+Pj4gICAgICAgYWN0ID0gYnBmX3Byb2dfcnVuX3hkcChyY3B1LT5w cm9nLCAmeGRwKTsNCj4+Pg0KPj4+IHhkcC5oOjE3NSA9PT09PSByeHEgJiB0eHEgaW4gdGhlIHhk cF9idWZmIGFyZSBub3QgZmlsbGVkIG9yIGV2ZW4gcmVzZXQuID09PT09DQo+Pj4gc3RhdGljIGlu bGluZQ0KPj4+IHZvaWQgeGRwX2NvbnZlcnRfZnJhbWVfdG9fYnVmZihzdHJ1Y3QgeGRwX2ZyYW1l ICpmcmFtZSwgc3RydWN0IHhkcF9idWZmICp4ZHApDQo+Pj4gew0KPj4+ICAgeGRwLT5kYXRhX2hh cmRfc3RhcnQgPSBmcmFtZS0+ZGF0YSAtIGZyYW1lLT5oZWFkcm9vbSAtIHNpemVvZigqZnJhbWUp Ow0KPj4+ICAgeGRwLT5kYXRhID0gZnJhbWUtPmRhdGE7DQo+Pj4gICB4ZHAtPmRhdGFfZW5kID0g ZnJhbWUtPmRhdGEgKyBmcmFtZS0+bGVuOw0KPj4+ICAgeGRwLT5kYXRhX21ldGEgPSBmcmFtZS0+ ZGF0YSAtIGZyYW1lLT5tZXRhc2l6ZTsNCj4+PiAgIHhkcC0+ZnJhbWVfc3ogPSBmcmFtZS0+ZnJh bWVfc3o7DQo+Pj4gfQ0KPj4+DQo+Pj4geHNrLmM6MjY5ID09PT09IHhza19yY3YgY29uc3VsdHMg cnhxIGluIHhkcF9idWZmIHdoaWNoIGlzIG5vdCBmaWxsZWQhID09PT09DQo+Pj4gc3RhdGljIGlu dCB4c2tfcmN2KHN0cnVjdCB4ZHBfc29jayAqeHMsIHN0cnVjdCB4ZHBfYnVmZiAqeGRwKQ0KPj4+ IHsNCj4+PiAgIGludCBlcnI7DQo+Pj4gICB1MzIgbGVuOw0KPj4+DQo+Pj4gICBlcnIgPSB4c2tf cmN2X2NoZWNrKHhzLCB4ZHApOw0KPj4+ICAgaWYgKGVycikNCj4+PiAgICAgICByZXR1cm4gZXJy Ow0KPj4+DQo+Pj4gICBpZiAoeGRwLT5yeHEtPm1lbS50eXBlID09IE1FTV9UWVBFX1hTS19CVUZG X1BPT0wpIHsNCj4+PiBsZW4gPSB4ZHAtPmRhdGFfZW5kIC0geGRwLT5kYXRhOw0KPj4+ICAgICAg IHJldHVybiBfX3hza19yY3ZfemMoeHMsIHhkcCwgbGVuKTsNCj4+PiAgIH0NCj4+Pg0KPj4+ICAg ZXJyID0gX194c2tfcmN2KHhzLCB4ZHApOw0KPj4+ICAgaWYgKCFlcnIpDQo+Pj4geGRwX3JldHVy bl9idWZmKHhkcCk7DQo+Pj4gICByZXR1cm4gZXJyOw0KPj4+IH0NCj4+Pg0KPj4+IGludCBfX3hz a19tYXBfcmVkaXJlY3Qoc3RydWN0IHhkcF9zb2NrICp4cywgc3RydWN0IHhkcF9idWZmICp4ZHAp DQo+Pj4gew0KPj4+ICAgc3RydWN0IGxpc3RfaGVhZCAqZmx1c2hfbGlzdCA9IHRoaXNfY3B1X3B0 cigmeHNrbWFwX2ZsdXNoX2xpc3QpOw0KPj4+ICAgaW50IGVycjsNCj4+Pg0KPj4+ICAgZXJyID0g eHNrX3Jjdih4cywgeGRwKTsNCj4+PiAgIGlmIChlcnIpDQo+Pj4gcmV0dXJuIGVycjsNCj4+Pg0K Pj4+ICAgaWYgKCF4cy0+Zmx1c2hfbm9kZS5wcmV2KQ0KPj4+ICAgICAgIGxpc3RfYWRkKCZ4cy0+ Zmx1c2hfbm9kZSwgZmx1c2hfbGlzdCk7DQo+Pj4NCj4+PiAgIHJldHVybiAwOw0KPj4+IH0NCj4+ Pg0KPj4+PiBPbiAyNCBNYXkgMjAyNCwgYXQgMTg6NDksIFl1dmFsIEVsLUhhbmFueSA8WXV2YWxF QFJhZHdhcmUuY29tPiB3cm90ZToNCj4+Pj4NCj4+Pj4gQ0FVVElPTjpFeHRlcm5hbCBFbWFpbCwg RG8gbm90IGNsaWNrIG9uIGxpbmtzIG9yIG9wZW4gYXR0YWNobWVudHMgdW5sZXNzIHlvdSByZWNv Z25pemUgdGhlIHNlbmRlciBhbmQga25vdyB0aGUgY29udGVudCBpcyBzYWZlLg0KPj4+Pg0KPj4+ PiBIaSBBbGwsDQo+Pj4+ICAgICAgSSB3b3VsZCByZWFsbHkgYXBwcmVjaWF0ZSBzb21lIGd1aWRh bmNlIGhlcmUuIEFzIHRoaXMgaXNzdWUgc3BhbnMgYm90aCBuZXR3b3JrIFhEUCBhbmQgQ1BVIG1h cCwgaXTigJlzIGEgYml0IG1vcmUgZGlmZmljdWx0IGZvciBtZSB0byBmb2xsb3cgaW4gdGhlIGtl cm5lbCBjb2RlLiBJIGF0dGVtcHRlZCB0byB0cmFjZSB0aGUgaXNzdWUgaW4gdGhlIHNvdXJjZSwg YnV0IGl04oCZcyBhIGJpdCBjb21wbGV4IHRvIGVudGVyIGV4aXN0aW5nIGNvZGUgYmFzZS4NCj4+ Pj4NCj4+Pj4gICAgICBJdCB3aWxsIGJlIGVhc2llciBpZiB5b3UgY2FuIHRlbGwgbWUgdGhlIGZv bGxvd2luZzoNCj4+Pj4gMS4gSXMgdGhlIHJlY2VpdmUgcXVldWUgbWV0YWRhdGEgbWFpbnRhaW5l ZCBjb3JyZWN0bHkgdGhyb3VnaCB0aGUgQ1BVIHN3aXRjaCBpbiBDUFUgbWFwPyBJbiB0aGUgZGVz Y3JpcHRpb24gb2YgQ1BVIG1hcCBpbiBYRFAgKGh0dHBzOi8vZGV2ZWxvcGVycy5yZWRoYXQuY29t L2Jsb2cvMjAyMS8wNS8xMy9yZWNlaXZlLXNpZGUtc2NhbGluZy1yc3Mtd2l0aC1lYnBmLWFuZC1j cHVtYXApLCBpdCBpcyBtZW50aW9uZWQgdGhhdCBzb21lIG1ldGFkYXRhIGlzIG5vdCBtYWludGFp bmVkIGFjcm9zcyB0aGUgQ1BVIHN3aXRjaCwgYnV0IHRoYXQgd291bGQgbWFrZSB0aGUgdW1lbSB0 ZXN0IHByb2JsZW1hdGljLiBTaG91bGQgSSBhc3N1bWUgdGhlIHJlY2VpdmUgcXVldWUgaXMgbWFp bnRhaW5lZD8NCj4+Pj4gMi4gRG9lcyBYU0sgdW1lbSB1c2VyIGNvZGUgaGF2ZSBhY2Nlc3MgdG8g dGhlIHJlY2VpdmUgcXVldWUgbWV0YWRhdGEgbWVtb3J5PyBJdCBzZWVtcyB0byBiZSBpbiBhIGRp ZmZlcmVudCBwb2ludGVyLCBidXQgaXQgY291bGQgYmUgdGhhdCBpdCBwb2ludHMgdG8gdGhlIHBh Y2tldCBoZWFkcm9vbSBpbiB0aGUgdW1lbSBhY2Nlc3NpYmxlIG1lbW9yeS4NCj4+Pj4NCj4+Pj4g ICAgICBJZiB0aGUgcmVjZWl2ZSBxdWV1ZSBpcyBub3QgbWFpbnRhaW5lZCBhY3Jvc3MgQ1BVIHN3 aXRjaCB0aGVuIEkgdGhpbmsgdGhlIHNoYXJlZCB1bWVtIHRlc3Qgc2hvdWxkIHJ1biBhbG9uZyB0 aGUgbGluZXMgb2YgdXNpbmcgc29tZSBkZWZhdWx0IHJlY2VpdmUgcXVldWUgYWZ0ZXIgc3dpdGNo aW5nIENQVXMuIE90aGVyd2lzZSwgaXQgc2hvdWxkIHByb2JhYmx5IGRyb3AgcGFja2V0cyB3aXRo IGludmFsaWQgcmVjZWl2ZSBxdWV1ZXMuDQo+Pj4+DQo+Pj4+ICAgICAgVGhhbmtzLA0KPj4+PiAg ICAgICAgICAgICAgWXV2YWwuDQo+Pj4+DQo+Pj4+PiBPbiAyMCBNYXkgMjAyNCwgYXQgMTg6MjQs IFl1dmFsIEVsLUhhbmFueSA8WXV2YWxFQFJhZHdhcmUuY29tPiB3cm90ZToNCj4+Pj4+DQo+Pj4+ PiBIaSwNCj4+Pj4+DQo+Pj4+PiBTaG9ydCBWZXJzaW9uDQo+Pj4+PiBJ4oCZdmUgZW5jb3VudGVy ZWQgYW4gaXNzdWUgcmVkaXJlY3RpbmcgdHJhZmZpYyB0byBhbm90aGVyIENQVSB3aGlsZSB1c2lu ZyBzaGFyZWQgVU1FTS4gVGhlIGZyYW1lIGFycml2ZWQgYXQgdGhlIHJlZGlyZWN0ZWQgQ1BVIHdp dGggaW52YWxpZCByZWNlaXZlIHF1ZXVlLiBUaGlzIGNhdXNlZCBhIGtlcm5lbCBjcmFzaCBvbiB0 aGUgcGF0Y2ggdGhhdCBzdXBwb3J0cyByZWRpcmVjdGluZyB0byBwYWNrZXRzIHRvIGFueSBxdWV1 ZSB3aXRoIHRoZSBzYW1lIHVtZW0gZHVlIHRvIGEgdGVzdCBiYXNlZCBvbiB0aGUgcmVjZWl2ZSBx dWV1ZS4NCj4+Pj4+DQo+Pj4+PiBMb25nIFZlcnNpb24NCj4+Pj4+IEnigJl2ZSBjcmVhdGVkIGEg dGVzdCBwcm9ncmFtIHRoYXQgcmVkaXJlY3RzIHRyYWZmaWMgYmV0d2VlbiB0d28gaW50ZXJmYWNl cyAocmVwbGFjaW5nIHRoZSBNQUMgYWRkcmVzcykuIFNlZSB0aGUgY29kZSBiZWxvdy4gSXQgc3Rh cnRzIHR3byBzZXBhcmF0ZSBwcm9jZXNzZXMgb24gdHdvIGRpZmZlcmVudCBjb3Jlcy4gV2hlbiBk aXJlY3RpbmcgdHJhZmZpYyBkaXJlY3RseSB0byBhbiBYU0sgc29ja2V0IGFsbCB3b3JrcyB3ZWxs LiBJ4oCZbSBydW5uaW5nIG9uIGtlcm5lbCA1LjE1LjExNyB3aXRoIE1hZ251cyBwYXRjaCBmb3Ig c2hhcmVkIHVtZW0uDQo+Pj4+Pg0KPj4+Pj4gVGhlIG5leHQgc3RlcCB3YXMgYW4gWERQIHByb2dy YW0gdGhhdCByZWRpcmVjdHMgZWFjaCBwYWNrZXQgdG8gdGhlIG90aGVyIENQVSwgYW5kIHRoZSB4 ZHAgQ1BVIHByb2dyYW0gcmVkaXJlY3QgdGhlIHBhY2tldHMgdG8gYW4gWERQIHNvY2tldC4gSW5p dGlhbGx5IHRoaXMgcmVzdWx0ZWQgaW4gYSBrZXJuZWwgY3Jhc2guIFRoZSByZWFzb24gaXMgdGhh dCB0aGUgcmVjZWl2ZSBxdWV1ZSBpcyBub3QgcmVjZWl2ZWQgY29ycmVjdGx5IG9uY2UgdGhlIHBh Y2tldCBzd2l0Y2hlcyBDUFUuDQo+Pj4+Pg0KPj4+Pj4gSeKAmXZlIHBhdGNoZWQgdGhlIGtlcm5l bCBzbyBpdCBkb2VzIHNhbml0eSBjaGVjayBhbmQgZG9lcyBub3QgY3Jhc2ggYnV0IGRlZmF1bHRz IHRvIHF1ZXVlIDAganVzdCBmb3IgdGhlIHVtZW0gdGVzdC4NCj4+Pj4+DQo+Pj4+PiBUaGUga2Vy bmVsIG5vIGxvbmdlciBjcmFzaGVzIGJ1dCBJIGRvbuKAmXQgZ2V0IHRoZSB0cmFmZmljIHRvIHRo ZSBYU0sgc29ja2V0cywgYW5kIEkgbG9nIHRoZSByZWNlaXZlIHF1ZXVlcyBhbmQgdGhleSBkbyBu b3Qgc2VlbSByYW5kb206DQo+Pj4+PiBPbiBmaXJzdCBpbnRlcmZhY2U6DQo+Pj4+PiAweEMxMzIz RDUwDQo+Pj4+PiAweEMxMzQzRDE5DQo+Pj4+PiAweEMxMzQzRDUwDQo+Pj4+Pg0KPj4+Pj4gT24g c2Vjb25kIGludGVyZmFjZToNCj4+Pj4+IDB4QzEzNEJENTANCj4+Pj4+IDB4QzEzNUJENTANCj4+ Pj4+DQo+Pj4+PiBWZXJ5IGZldyBiaXRzIGRpZmZlcmVuY2VzIGJldHdlZW4gZWFjaCBvZiB0aGUg 4oCccmVjZWl2ZSBxdWV1ZXPigJ0uIEkgY291bGRu4oCZdCByZWFsbHkgZmluZCBzb21ldGhpbmcg aW4gbXkgcHJvZ3JhbSB3aXRoIHRob3NlIG9yIHNpbWlsYXIgdmFsdWVzLCBvciBpbiB0aGUgcGFj a2V0cyBzbyBpdCBtYWtlcyBpdCBsZXNzIGxpa2VseSBpdCBjb21lcyBmcm9tIHNvbWV0aGluZyBJ IGRvIGluIHVzZXJzcGFjZS4gU2VlbXMgdG8gc3VnZ2VzdCBzb21lIGZsYWdzIGZpZWxkPyBUaGUg dmFsdWVzIGFyZSBub3QgYWx3YXlzIHRoZSBzYW1lIGFjcm9zcyByZWJvb3RzIGJ1dCBwcmV0dHkg Y2xvc2UuDQo+Pj4+Pg0KPj4+Pj4gQW0gSSBkb2luZyBzb21ldGhpbmcgd3Jvbmc/IEl0IHNlZW1z IHByZXR0eSBiYXNpYy4gTW9zdCBvZiB0aGUgY29kZSBpbiB0aGUgWERQIHByb2dyYW0gd2FzIGp1 c3QgYWRkZWQgZm9yIGRlYnVnZ2luZy4gVGhlIG9ubHkgb2RkaXR5IHBlcmhhcHMgaXMgdXNpbmcg dGhlIHNoYXJlZCB1bWVtLg0KPj4+Pj4NCj4+Pj4+IFRoYW5rcywNCj4+Pj4+IFl1dmFsLg0KPj4+ Pj4NCj4+Pj4+IEnigJltIGF0dGFjaGluZyB0aGUgcHJvZ3JhbSBhbmQgdmFsdWVzIGZyb20gbXkg ImRlYnVnIG1hcOKAnS4gSW4gdGhlIGRlYnVnIG1hcDoNCj4+Pj4+IDAuIFZhbHVlcyAwLzEgLSBX aGljaCB0eXBlIG9mIHByb2dyYW0gcmFuICh3aXRoL3dpdGhvdXQgQ1BVIHJlZGlyZWN0aW9uKS4N Cj4+Pj4+IDEuIFZhbHVlcyAyWFkgLSBwYWNrZXQgcmVkaXJlY3RlZCBmcm9tIGNvcmUgWCB0byBj b3JlIFkgKDFzdCBzdGFnZSkuDQo+Pj4+PiAyLiBWYWx1ZXMgNFhZIC0gcGFja2V0IG9uIGNvcmUg WCByZXR1cm5zIGFjdGlvbiBZICgxc3Qgc3RhZ2UpLg0KPj4+Pj4gKFRoZXNlIHN1Z2dlc3QgdGhh dCAxc3Qgc3RhZ2Ugd29ya2VkIGNvcnJlY3RseSkuDQo+Pj4+PiAzLiBWYWx1ZXMgMVhYWVkgLSBw YWNrZXQgcmVjZWl2ZSBxdWV1ZSBYWCBvbiBjb3JlIFlZIChYWCA9IDEwIGlzIGludmFsaWQgcmVj ZWl2ZSBxdWV1ZSBvdXRzaWRlIDIuLjUpLg0KPj4+Pj4gNC4gMlhYWFggLSBwYWNrZXQgcmVjZWl2 ZSBxdWV1ZSBvbiBhbnkgY29yZSAoWFhYWCAtIDQ5OTkgaW1lYW5zIHF1ZXVlIGdyZWF0ZXIgdGhh biA1MDAwKS4NCj4+Pj4+IDUuIFJhbmRvbSBlbnRyeSAtIGEgcmVjZWl2ZSBxdWV1ZS4NCj4+Pj4+ DQo+Pj4+PiBEZWJ1ZyBtYXAgdmFsdWVzIHdpdGhvdXQgQ1BVIHJlZGlyZWN0aW9uOg0KPj4+Pj4g Ky0tLS0tLSstLS0tLS0rLS0tLS0tLS0tLS0tLS0rDQo+Pj4+PiB8IFBvcnQgfCBLZXkgIHwgICAg IFJlY2VpdmVkIHwNCj4+Pj4+ICstLS0tLS0rLS0tLS0tKy0tLS0tLS0tLS0tLS0tKw0KPj4+Pj4g fCAgICAwIHwgMTAzMiB8ICAgICAgICAgIDUwNCB8DQo+Pj4+PiB8ICAgIDAgfCAxMDI0IHwgICAg IDM3MDA1OTkyIHwNCj4+Pj4+IHwgICAgMCB8IDEwMzQgfCAgICAgMzc1NDQwNTIgfA0KPj4+Pj4g fCAgICAwIHwgICAgMCB8ICAgICA3NDU0Njg3NSB8DQo+Pj4+PiB8ICAgIDEgfCAxMDM0IHwgICAg IDM1NzY1OTYxIHwNCj4+Pj4+IHwgICAgMSB8ICAgIDAgfCAgICAgNzE0OTI3NzMgfA0KPj4+Pj4g fCAgICAxIHwgMTAyNCB8ICAgICAzNTcyOTEwNyB8DQo+Pj4+PiB8ICAgIDEgfCAxMDMyIHwgICAg ICAgICAgMjc3IHwNCj4+Pj4+ICstLS0tLS0rLS0tLS0tKy0tLS0tLS0tLS0tLS0tKw0KPj4+Pj4N Cj4+Pj4+IERlYnVnIG1hcCB2YWx1ZSB3aXRoIENQVSByZWRpcmVjdGlvbiAobm8gb3RoZXIgY2hh bmdlKToNCj4+Pj4+ICstLS0tLS0rLS0tLS0tKy0tLS0tLS0tLS0tLS0tKw0KPj4+Pj4gfCBQb3J0 IHwgS2V5ICB8ICAgICBSZWNlaXZlZCB8DQo+Pj4+PiArLS0tLS0tKy0tLS0tLSstLS0tLS0tLS0t LS0tLSsNCj4+Pj4+IHwgICAgMCB8ICAgIDEgfCAgICAgICAgIDM0MDAgfA0KPj4+Pj4gfCAgICAw IHwgIDIyMyB8ICAgICAgICAgMjk0NyB8DQo+Pj4+PiB8ICAgIDAgfCAgMjMyIHwgICAgICAgICAg NDU0IHwNCj4+Pj4+IHwgICAgMCB8ICA0MjQgfCAgICAgICAgICA0NTQgfA0KPj4+Pj4gfCAgICAw IHwgIDQzNCB8ICAgICAgICAgMjk0NyB8DQo+Pj4+PiB8ICAgIDAgfCAxMTAwMiB8ICAgICAgICAg IDQ1NCB8DQo+Pj4+PiB8ICAgIDAgfCAxMTAwMyB8ICAgICAgICAgMjk0NyB8DQo+Pj4+PiB8ICAg IDAgfCAyMDAwMCB8ICAgICAgICAgIDEwNiB8DQo+Pj4+PiB8ICAgIDAgfCAyMDAxNiB8ICAgICAg ICAgICAgNyB8DQo+Pj4+PiB8ICAgIDAgfCAyMDAyNCB8ICAgICAgICAgMTA1OCB8DQo+Pj4+PiB8 ICAgIDAgfCAyMDU4MiB8ICAgICAgICAgICAgMiB8DQo+Pj4+PiB8ICAgIDAgfCAyNDk5OSB8ICAg ICAgICAgMjIzMSB8DQo+Pj4+PiB8ICAgIDAgfCAzMjQxMjk1MTg0IHwgICAgICAgICAgMzM5IHwN Cj4+Pj4+IHwgICAgMCB8IDMyNDE0MjYyMDEgfCAgICAgICAgICAgIDMgfA0KPj4+Pj4gfCAgICAw IHwgMzI0MTQyNjI1NiB8ICAgICAgICAgMTg5MSB8DQo+Pj4+PiB8ICAgIDEgfCAgICAxIHwgICAg ICAgICAxMDEzIHwNCj4+Pj4+IHwgICAgMSB8ICAyMjMgfCAgICAgICAgICA2MTAgfA0KPj4+Pj4g fCAgICAxIHwgIDIzMiB8ICAgICAgICAgIDQwNCB8DQo+Pj4+PiB8ICAgIDEgfCAgNDI0IHwgICAg ICAgICAgNDA0IHwNCj4+Pj4+IHwgICAgMSB8ICA0MzQgfCAgICAgICAgICA2MTAgfA0KPj4+Pj4g fCAgICAxIHwgMTEwMDIgfCAgICAgICAgICA0MDQgfA0KPj4+Pj4gfCAgICAxIHwgMTEwMDMgfCAg ICAgICAgICA2MTAgfA0KPj4+Pj4gfCAgICAxIHwgMjAwMDAgfCAgICAgICAgICAgMTcgfA0KPj4+ Pj4gfCAgICAxIHwgMjAwMjQgfCAgICAgICAgICAzMDkgfA0KPj4+Pj4gfCAgICAxIHwgMjQ5OTkg fCAgICAgICAgICA2ODkgfA0KPj4+Pj4gfCAgICAxIHwgMzI0MTQ1OTAyNCB8ICAgICAgICAgIDMw OSB8DQo+Pj4+PiB8ICAgIDEgfCAzMjQxNTI0NTYwIHwgICAgICAgICAgMzgxIHwNCj4+Pj4+ICst LS0tLS0rLS0tLS0tKy0tLS0tLS0tLS0tLS0tKw0KPj4+Pj4NCj4+Pj4+IFRoZSBYRFAgY29kZSAo I2lmIDAgaXMgZm9yIHRoZSBubyBDUFUgcmVkaXJlY3Rpb24pOg0KPj4+Pj4gLyogU1BEWC1MaWNl bnNlLUlkZW50aWZpZXI6IEdQTC0yLjAgKi8NCj4+Pj4+DQo+Pj4+PiAjaW5jbHVkZSA8bGludXgv aWZfZXRoZXIuaD4NCj4+Pj4+ICNpbmNsdWRlIDxsaW51eC9icGYuaD4NCj4+Pj4+ICNpbmNsdWRl IDxsaW51eC9pbi5oPg0KPj4+Pj4NCj4+Pj4+ICNpbmNsdWRlIDxicGYvYnBmX2hlbHBlcnMuaD4N Cj4+Pj4+ICNpbmNsdWRlIDxicGYvYnBmX2VuZGlhbi5oPg0KPj4+Pj4NCj4+Pj4+ICNpbmNsdWRl ICJ4ZHAvcGFyc2luZ19oZWxwZXJzLmgiDQo+Pj4+Pg0KPj4+Pj4gLyogUmVkaXJlY3QgdG8gU1Ag cXVldWVzIG1hcC4gKi8NCj4+Pj4+IHN0cnVjdA0KPj4+Pj4gew0KPj4+Pj4gIF9fdWludCAodHlw ZSwgQlBGX01BUF9UWVBFX1hTS01BUCk7DQo+Pj4+PiAgX190eXBlIChrZXksIF9fdTMyKTsNCj4+ Pj4+ICBfX3R5cGUgKHZhbHVlLCBfX3UzMik7DQo+Pj4+PiAgX191aW50IChtYXhfZW50cmllcywg MTI4KTsNCj4+Pj4+IH0geHNrc19tYXAgU0VDKCIubWFwcyIpOw0KPj4+Pj4NCj4+Pj4+IC8qIFJl ZGlyZWN0IHRvIENQVXMgbWFwLiAqLw0KPj4+Pj4gc3RydWN0DQo+Pj4+PiB7DQo+Pj4+PiAgX191 aW50ICh0eXBlLCBCUEZfTUFQX1RZUEVfQ1BVTUFQKTsNCj4+Pj4+ICBfX3VpbnQgKGtleV9zaXpl LCBzaXplb2YgKF9fdTMyKSk7DQo+Pj4+PiAgX191aW50ICh2YWx1ZV9zaXplLCBzaXplb2YgKHN0 cnVjdCBicGZfY3B1bWFwX3ZhbCkpOw0KPj4+Pj4gIF9fdWludCAobWF4X2VudHJpZXMsIDMyKTsN Cj4+Pj4+IH0gY3B1X21hcCBTRUMoIi5tYXBzIik7DQo+Pj4+Pg0KPj4+Pj4gLyogU3RhdGlzdGlj cyBhbmQgZGVidWcgbWFwcy4gKi8NCj4+Pj4+IHN0cnVjdA0KPj4+Pj4gew0KPj4+Pj4gIF9fdWlu dCAodHlwZSwgQlBGX01BUF9UWVBFX1BFUkNQVV9BUlJBWSk7DQo+Pj4+PiAgX190eXBlIChrZXks IF9fdTMyKTsNCj4+Pj4+ICBfX3R5cGUgKHZhbHVlLCBfX3UzMik7DQo+Pj4+PiAgX191aW50ICht YXhfZW50cmllcywgNjQpOw0KPj4+Pj4gfSB4ZHBfc3RhdHNfbWFwIFNFQygiLm1hcHMiKTsNCj4+ Pj4+DQo+Pj4+PiBzdHJ1Y3QNCj4+Pj4+IHsNCj4+Pj4+ICBfX3VpbnQgKHR5cGUsIEJQRl9NQVBf VFlQRV9IQVNIKTsNCj4+Pj4+ICBfX3R5cGUgKGtleSwgX191MzIpOw0KPj4+Pj4gIF9fdHlwZSAo dmFsdWUsIF9fdTMyKTsNCj4+Pj4+ICBfX3VpbnQgKG1heF9lbnRyaWVzLCA2NCk7DQo+Pj4+PiB9 IHhkcF9kZWJ1Z19wcm90byBTRUMoIi5tYXBzIik7DQo+Pj4+Pg0KPj4+Pj4gc3RhdGljIF9fdTMy IG9uZXZhbCA9IDE7DQo+Pj4+Pg0KPj4+Pj4gaW50IG15X3BhcnNlX2V0aGhkciAoc3RydWN0IGhk cl9jdXJzb3IqIG5oLCB2b2lkKiBkYXRhZW5kLCBzdHJ1Y3QgZXRoaGRyKiogZXRoKQ0KPj4+Pj4g ew0KPj4+Pj4gIF9fdTE2IGV0aHR5cGU7DQo+Pj4+PiAgKmV0aCA9IG5oLT5wb3M7DQo+Pj4+PiAg aWYgKCh2b2lkKikgJigqZXRoKSBbMV0gPiBkYXRhZW5kKQ0KPj4+Pj4gIHsNCj4+Pj4+ICAgcmV0 dXJuICgtMSk7DQo+Pj4+PiAgfQ0KPj4+Pj4NCj4+Pj4+ICBldGh0eXBlID0gKCpldGgpLT5oX3By b3RvOw0KPj4+Pj4gIG5oLT5wb3MgPSAmKCpldGgpIFsxXTsNCj4+Pj4+ICBpZiAoZXRodHlwZSA9 PSBicGZfbnRvaHMgKEVUSF9QXzgwMjFRKSkNCj4+Pj4+ICB7DQo+Pj4+PiAgIHN0cnVjdCB2bGFu X2hkciogdmxhbiA9IChzdHJ1Y3Qgdmxhbl9oZHIqKSAmKCpldGgpIFsxXTsNCj4+Pj4+IGlmICgo dm9pZCopICZ2bGFuIFsxXSA+IGRhdGFlbmQpDQo+Pj4+PiB7DQo+Pj4+PiAgICAgICAgICByZXR1 cm4gKC0xKTsNCj4+Pj4+IH0NCj4+Pj4+ICAgICAgZXRodHlwZSA9IHZsYW4tPmhfdmxhbl9lbmNh cHN1bGF0ZWRfcHJvdG87DQo+Pj4+PiAvKiBpbmNfZGVidWdfbWFwICgxMDAwMCsoYnBmX250b2hz ICh2bGFuLT5oX3ZsYW5fVENJKSAmIDB4MEZGRikpOyAqLw0KPj4+Pj4gLyogaW5jX2RlYnVnX21h cCAodmxhbi0+aF92bGFuX1RDSSk7ICovDQo+Pj4+PiBuaC0+cG9zID0gJnZsYW4gWzFdOw0KPj4+ Pj4gIH0NCj4+Pj4+DQo+Pj4+PiAgcmV0dXJuIChldGh0eXBlKTsNCj4+Pj4+IH0NCj4+Pj4+DQo+ Pj4+PiBzdGF0aWMgdm9pZCBpbmNfZGVidWdfbWFwIChfX3UzMiBrZXkpDQo+Pj4+PiB7DQo+Pj4+ PiAjaWZkZWYgV0lUSF9TVEFUUw0KPj4+Pj4gIGJwZl9tYXBfdXBkYXRlX2VsZW0gKCZ4ZHBfZGVi dWdfcHJvdG8sDQo+Pj4+PiAgICAgICAgICAgICAgICAgICAgICAgJmtleSwgKF9fdTMyKikgJm9u ZXZhbCwgQlBGX05PRVhJU1QpOw0KPj4+Pj4gIF9fdTMyKiByZWMgPSBicGZfbWFwX2xvb2t1cF9l bGVtICgmeGRwX2RlYnVnX3Byb3RvLCAoX191MzIqKSAma2V5KTsNCj4+Pj4+ICBpZiAocmVjICE9 IE5VTEwpDQo+Pj4+PiAgew0KPj4+Pj4gICArKygqcmVjKTsNCj4+Pj4+ICB9DQo+Pj4+PiAjZW5k aWYNCj4+Pj4+IH0NCj4+Pj4+DQo+Pj4+Pg0KPj4+Pj4NCj4+Pj4+IFNFQyAoInhkcCIpDQo+Pj4+ PiBpbnQgcmR3cl94c2tfcHJvZyAoc3RydWN0IHhkcF9tZCAqY3R4KQ0KPj4+Pj4gew0KPj4+Pj4g IGVudW0geGRwX2FjdGlvbiBhY3Rpb247DQo+Pj4+PiAgaW50IGluZGV4ID0gY3R4LT5yeF9xdWV1 ZV9pbmRleDsNCj4+Pj4+ICB2b2lkKiBkYXRhZW5kID0gKHZvaWQgKikobG9uZyljdHgtPmRhdGFf ZW5kOw0KPj4+Pj4gIHZvaWQqIGRhdGEgPSAodm9pZCAqKShsb25nKWN0eC0+ZGF0YTsNCj4+Pj4+ ICBpbnQgc3RhZ2UgPSAwOw0KPj4+Pj4NCj4+Pj4+ICBzdHJ1Y3QgaGRyX2N1cnNvciBuaDsNCj4+ Pj4+DQo+Pj4+PiAgX191MzIgKnBrdF9jb3VudDsNCj4+Pj4+ICBzdHJ1Y3QgZXRoaGRyKiBldGg7 DQo+Pj4+Pg0KPj4+Pj4gI2lmZGVmIFdJVEhfU1RBVFMNCj4+Pj4+ICBwa3RfY291bnQgPSBicGZf bWFwX2xvb2t1cF9lbGVtKCZ4ZHBfc3RhdHNfbWFwLCAmaW5kZXgpOw0KPj4+Pj4gIGlmIChwa3Rf Y291bnQgIT0gTlVMTCkNCj4+Pj4+ICB7DQo+Pj4+PiAgICsrKnBrdF9jb3VudDsNCj4+Pj4+ICB9 DQo+Pj4+PiAjZW5kaWYNCj4+Pj4+DQo+Pj4+PiAgLyogUGFyc2UgRXRoZXJuZXQgJiBWTEFOICov DQo+Pj4+PiAgbmgucG9zID0gZGF0YTsNCj4+Pj4+ICBpbnQgZXRodHlwZSA9IG15X3BhcnNlX2V0 aGhkciAoJm5oLCBkYXRhZW5kLCAmZXRoKTsNCj4+Pj4+ICBpZiAoZXRodHlwZSAhPSBicGZfbnRv aHMgKDB4MDgwMCkpDQo+Pj4+PiAgew0KPj4+Pj4gICByZXR1cm4gKFhEUF9QQVNTKTsNCj4+Pj4+ ICB9DQo+Pj4+Pg0KPj4+Pj4gIC8qIERpcmVjdCBYU0sgcmVkaXJlY3QuICovDQo+Pj4+PiAjaWYg MA0KPj4+Pj4gIGluY19kZWJ1Z19tYXAgKHN0YWdlKTsNCj4+Pj4+ICBhY3Rpb24gPSAgYnBmX3Jl ZGlyZWN0X21hcCAoJnhza3NfbWFwLCBpbmRleCwgWERQX1BBU1MpOw0KPj4+Pj4gIGluY19kZWJ1 Z19tYXAgKDEwMDAgKyBpbmRleCoxMCArIGFjdGlvbik7DQo+Pj4+PiAjZW5kaWYNCj4+Pj4+ICAv KiBDUFUgbWFwIHJlZGlyZWN0LiAqLw0KPj4+Pj4gIF9fdTMyIGNwdWlkID0gYnBmX2dldF9zbXBf cHJvY2Vzc29yX2lkICgpOw0KPj4+Pj4gIF9fdTMyIHRhcmdldGNwdSA9IGNwdWlkIF4gMHgwMTsN Cj4+Pj4+ICArK3N0YWdlOw0KPj4+Pj4gIGluY19kZWJ1Z19tYXAgKHN0YWdlKTsNCj4+Pj4+ICBp bmNfZGVidWdfbWFwICgyMDAgKyBjcHVpZCAqIDEwICsgdGFyZ2V0Y3B1KTsNCj4+Pj4+ICBhY3Rp b24gPSAgYnBmX3JlZGlyZWN0X21hcCAoJmNwdV9tYXAsIHRhcmdldGNwdSwgWERQX1BBU1MpOw0K Pj4+Pj4gIGluY19kZWJ1Z19tYXAgKDQwMCArIHRhcmdldGNwdSAqIDEwICsgYWN0aW9uKTsNCj4+ Pj4+ICByZXR1cm4gKGFjdGlvbik7DQo+Pj4+PiB9DQo+Pj4+Pg0KPj4+Pj4gU0VDICgieGRwL2Nw dW1hcCIpDQo+Pj4+PiBpbnQgcmR3cl9jcHVfcHJvZyhzdHJ1Y3QgeGRwX21kICpjdHgpDQo+Pj4+ PiB7DQo+Pj4+PiAgX191NjQqIGRhdGFlbmQ2NCA9IChfX3U2NCopIChsb25nKSBjdHgtPmRhdGFf ZW5kOw0KPj4+Pj4gIF9fdTY0KiBkYXRhNjQgPSAoX191NjQqKSAobG9uZykgY3R4LT5kYXRhOw0K Pj4+Pj4gIF9fdTMyIHJ4cXVldWUgPSBjdHgtPnJ4X3F1ZXVlX2luZGV4Ow0KPj4+Pj4gIGlmIChy eHF1ZXVlIDwgNTAwMCkNCj4+Pj4+ICB7DQo+Pj4+PiAgIGluY19kZWJ1Z19tYXAgKDIwMDAwICsg cnhxdWV1ZSk7DQo+Pj4+PiAgfQ0KPj4+Pj4gIGVsc2UNCj4+Pj4+ICB7DQo+Pj4+PiAgIGluY19k ZWJ1Z19tYXAgKHJ4cXVldWUpOw0KPj4+Pj4gaW5jX2RlYnVnX21hcCAoMjQ5OTkpOw0KPj4+Pj4g IH0NCj4+Pj4+DQo+Pj4+PiAgcnhxdWV1ZSA9IChyeHF1ZXVlID49IDIgJiYgcnhxdWV1ZSA8IDYp ID8gcnhxdWV1ZSA6IDEwOw0KPj4+Pj4gIF9fdTMyIGNwdWlkID0gYnBmX2dldF9zbXBfcHJvY2Vz c29yX2lkICgpOw0KPj4+Pj4gIGNwdWlkID0gKGNwdWlkIDwgMTIpID8gY3B1aWQgOiAyMDsNCj4+ Pj4+ICBpbmNfZGVidWdfbWFwICgxMDAwMCArIDEwMCpyeHF1ZXVlICsgY3B1aWQpOw0KPj4+Pj4N Cj4+Pj4+ICByZXR1cm4gYnBmX3JlZGlyZWN0X21hcCAoJnhza3NfbWFwLCBicGZfZ2V0X3NtcF9w cm9jZXNzb3JfaWQgKCksIDApOw0KPj4+Pj4gfQ0KPj4+Pj4NCj4+Pj4NCj4+Pg0KPj4NCg0K