From mboxrd@z Thu Jan 1 00:00:00 1970 From: "Yang, Qiming" Subject: Re: Example(Load_balancer) Tx Flush Bug(This bug DPDK each version) Date: Mon, 16 Jan 2017 11:09:34 +0000 Message-ID: References: <2016122121181642100644@raisecom.com>, <2016122121292174988745@raisecom.com> <2016122122394164225248@raisecom.com> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Cc: maintainers , ?? , ?? To: Maple , dev Return-path: In-Reply-To: <2016122122394164225248@raisecom.com> Content-Language: en-US List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Sender: "dev" PiAtLS0tLU9yaWdpbmFsIE1lc3NhZ2UtLS0tLQ0KPiBGcm9tOiBkZXYgW21haWx0bzpkZXYtYm91 bmNlc0BkcGRrLm9yZ10gT24gQmVoYWxmIE9mIE1hcGxlDQo+IFNlbnQ6IFdlZG5lc2RheSwgRGVj ZW1iZXIgMjEsIDIwMTYgMTA6NDAgUE0NCj4gVG86IGRldiA8ZGV2QGRwZGsub3JnPg0KPiBDYzog bWFpbnRhaW5lcnMgPG1haW50YWluZXJzQGRwZGsub3JnPjsg5p2O6Z2eIDxsaWZlaUByYWlzZWNv bS5jb20+OyDmlr3lsZUNCj4gPHNoaXpoYW5AcmFpc2Vjb20uY29tPg0KPiBTdWJqZWN0OiBbZHBk ay1kZXZdIEV4YW1wbGUoTG9hZF9iYWxhbmNlcikgVHggRmx1c2ggQnVnKFRoaXMgYnVnIERQREsN Cj4gZWFjaCB2ZXJzaW9uKQ0KVGhlIGZvcm1hdCBvZiB0aGUgdGl0bGUgaXMgbm90IGNvcnJlY3Qu IA0KWW91IHNob3VsZCB1c2UgJyBleGFtcGxlcy9sb2FkX2JhbGFuY2VyOiBmaXhlZCAuLi4uJw0K UGxlYXNlIHJlZmVyIHRvIG90aGVyIHBhdGNoZXMuIA0KPiANCj4gRnJvbSA5NGYyZWFlZDUxZTZl NTQwMmU4YzAzYjgwZTA5OTlhNGZkNDIwMzkwIE1vbiBTZXAgMTcgMDA6MDA6MDANCj4gMjAwMQ0K PiBGcm9tOiByb290IDxyb290QGxpdWppYW5AcmFpc2Vjb20uY29tPg0KPiBUbzogPGRldkBkcGRr Lm9yZz4NCj4gQ2M6IDx0aG9tYXMubW9uamFsb25ANndpbmQuY29tPiwNCj4gPGxpZmVpQHJhaXNl Y29tLmNvbT4sPHNoaXpoYW5AcmFpc2Vjb20uY29tPg0KPiBEYXRlOiBXZWQsIDIxIERlYyAyMDE2 IDIyOjMxOjI5ICswODAwDQo+IFN1YmplY3Q6IFtQQVRDSF0gbG9hZF9iYWxhbmNlciBUeCBGbHVz aCBCdWcNCj4gDQo+IFdlIGZvdW5kIGEgYnVnIGluIHVzZSBsb2FkX2JhbGFuY2VyIGV4YW1wbGUs YW5kLFRoaXMgYnVnIERQREsgZWFjaA0KPiB2ZXJzaW9uLg0KPiBJbiBJTyB0eCBmbHVzaCwgb25s eSBmbHVzaCBwb3J0IDAuDQo+IFNvLElmIEkgZW5hYmxlIG1vcmUgdGhhbiB0aGUgUG9ydCx0aGVu LEluIGFkZGl0aW9uIHRvIDAgcG9ydCB3b24ndCBmbHVzaC4NCj4gDQpJZiB0aGlzIGlzIGEgYnVn IGZpeCwgcGxlYXNlIGFkZCBhIGZpeCBsaW5lIGhlcmUuIFlvdSBzaG91bGQgZmluZCB0aGUgY29t bWl0IGxvZyBudW1iZXIgd2hpY2ggaW5kdWNlcyB0aGlzIGJ1Zy4NCkxpa2UgJ0ZpeGVzOiA8bnVt YmVyPicuIFBsZWFzZSByZWZlciB0byBvdGhlciBwYXRjaGVzLg0KPiBTaWduZWQtb2ZmLWJ5OiBy b290IDxyb290QGxpdWppYW5AcmFpc2Vjb20uY29tPg0KPiAtLS0NCj4gIGEvZXhhbXBsZXMvbG9h ZF9iYWxhbmNlci9ydW50aW1lLmMgfCA2NjcNCj4gKysrKysrKysrKysrKysrKysrKysrKysrKysr KysrKysrKysrDQo+ICBiL2V4YW1wbGVzL2xvYWRfYmFsYW5jZXIvcnVudGltZS5jIHwgNjY5DQo+ ICsrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysNCj4gIDIgZmlsZXMgY2hhbmdl ZCwgMTMzNiBpbnNlcnRpb25zKCspDQo+ICBjcmVhdGUgbW9kZSAxMDA2NDQgYS9leGFtcGxlcy9s b2FkX2JhbGFuY2VyL3J1bnRpbWUuYw0KPiAgY3JlYXRlIG1vZGUgMTAwNjQ0IGIvZXhhbXBsZXMv bG9hZF9iYWxhbmNlci9ydW50aW1lLmMNCj4gDQo+IGRpZmYgLS1naXQgYS9hL2V4YW1wbGVzL2xv YWRfYmFsYW5jZXIvcnVudGltZS5jDQo+IGIvYS9leGFtcGxlcy9sb2FkX2JhbGFuY2VyL3J1bnRp bWUuYw0KPiBuZXcgZmlsZSBtb2RlIDEwMDY0NA0KPiBpbmRleCAwMDAwMDAwLi45NjEyMzkyDQo+ IC0tLSAvZGV2L251bGwNCj4gKysrIGIvYS9leGFtcGxlcy9sb2FkX2JhbGFuY2VyL3J1bnRpbWUu Yw0KPiBAQCAtMCwwICsxLDY2NyBAQA0KPiArLyotDQo+ICsgKiAgIEJTRCBMSUNFTlNFDQo+ICsg Kg0KPiArICogICBDb3B5cmlnaHQoYykgMjAxMC0yMDE0IEludGVsIENvcnBvcmF0aW9uLiBBbGwg cmlnaHRzIHJlc2VydmVkLg0KPiArICogICBBbGwgcmlnaHRzIHJlc2VydmVkLg0KPiArICoNCj4g KyAqICAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywg d2l0aCBvciB3aXRob3V0DQo+ICsgKiAgIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92 aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucw0KPiArICogICBhcmUgbWV0Og0KPiAr ICoNCj4gKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFp biB0aGUgYWJvdmUgY29weXJpZ2h0DQo+ICsgKiAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBj b25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuDQo+ICsgKiAgICAgKiBSZWRp c3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHly aWdodA0KPiArICogICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhl IGZvbGxvd2luZyBkaXNjbGFpbWVyIGluDQo+ICsgKiAgICAgICB0aGUgZG9jdW1lbnRhdGlvbiBh bmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlDQo+ICsgKiAgICAgICBkaXN0 cmlidXRpb24uDQo+ICsgKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEludGVsIENvcnBvcmF0 aW9uIG5vciB0aGUgbmFtZXMgb2YgaXRzDQo+ICsgKiAgICAgICBjb250cmlidXRvcnMgbWF5IGJl IHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQNCj4gKyAqICAgICAg IGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlz c2lvbi4NCj4gKyAqDQo+ICsgKiAgIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENP UFlSSUdIVCBIT0xERVJTIEFORA0KPiBDT05UUklCVVRPUlMNCj4gKyAqICAgIkFTIElTIiBBTkQg QU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVA0KPiBOT1QN Cj4gKyAqICAgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFC SUxJVFkgQU5EDQo+IEZJVE5FU1MgRk9SDQo+ICsgKiAgIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFS RSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUNCj4gQ09QWVJJR0hUDQo+ICsgKiAg IE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNU LA0KPiBJTkNJREVOVEFMLA0KPiArICogICBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVF TlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQNCj4gTk9UDQo+ICsgKiAgIExJTUlURUQgVE8s IFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MNCj4gT0Yg VVNFLA0KPiArICogICBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04p IEhPV0VWRVIgQ0FVU0VEDQo+IEFORCBPTiBBTlkNCj4gKyAqICAgVEhFT1JZIE9GIExJQUJJTElU WSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1INCj4gVE9SVA0KPiAr ICogICAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBX QVkgT1VUIE9GDQo+IFRIRSBVU0UNCj4gKyAqICAgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBB RFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIDQo+IERBTUFHRS4NCj4gKyAqLw0KPiAr DQo+ICsjaW5jbHVkZSA8c3RkaW8uaD4NCj4gKyNpbmNsdWRlIDxzdGRsaWIuaD4NCj4gKyNpbmNs dWRlIDxzdGRpbnQuaD4NCj4gKyNpbmNsdWRlIDxpbnR0eXBlcy5oPg0KPiArI2luY2x1ZGUgPHN5 cy90eXBlcy5oPg0KPiArI2luY2x1ZGUgPHN0cmluZy5oPg0KPiArI2luY2x1ZGUgPHN5cy9xdWV1 ZS5oPg0KPiArI2luY2x1ZGUgPHN0ZGFyZy5oPg0KPiArI2luY2x1ZGUgPGVycm5vLmg+DQo+ICsj aW5jbHVkZSA8Z2V0b3B0Lmg+DQo+ICsNCj4gKyNpbmNsdWRlIDxydGVfY29tbW9uLmg+DQo+ICsj aW5jbHVkZSA8cnRlX2J5dGVvcmRlci5oPg0KPiArI2luY2x1ZGUgPHJ0ZV9sb2cuaD4NCj4gKyNp bmNsdWRlIDxydGVfbWVtb3J5Lmg+DQo+ICsjaW5jbHVkZSA8cnRlX21lbWNweS5oPg0KPiArI2lu Y2x1ZGUgPHJ0ZV9tZW16b25lLmg+DQo+ICsjaW5jbHVkZSA8cnRlX3RhaWxxLmg+DQo+ICsjaW5j bHVkZSA8cnRlX2VhbC5oPg0KPiArI2luY2x1ZGUgPHJ0ZV9wZXJfbGNvcmUuaD4NCj4gKyNpbmNs dWRlIDxydGVfbGF1bmNoLmg+DQo+ICsjaW5jbHVkZSA8cnRlX2F0b21pYy5oPg0KPiArI2luY2x1 ZGUgPHJ0ZV9jeWNsZXMuaD4NCj4gKyNpbmNsdWRlIDxydGVfcHJlZmV0Y2guaD4NCj4gKyNpbmNs dWRlIDxydGVfbGNvcmUuaD4NCj4gKyNpbmNsdWRlIDxydGVfcGVyX2xjb3JlLmg+DQo+ICsjaW5j bHVkZSA8cnRlX2JyYW5jaF9wcmVkaWN0aW9uLmg+DQo+ICsjaW5jbHVkZSA8cnRlX2ludGVycnVw dHMuaD4NCj4gKyNpbmNsdWRlIDxydGVfcGNpLmg+DQo+ICsjaW5jbHVkZSA8cnRlX3JhbmRvbS5o Pg0KPiArI2luY2x1ZGUgPHJ0ZV9kZWJ1Zy5oPg0KPiArI2luY2x1ZGUgPHJ0ZV9ldGhlci5oPg0K PiArI2luY2x1ZGUgPHJ0ZV9ldGhkZXYuaD4NCj4gKyNpbmNsdWRlIDxydGVfcmluZy5oPg0KPiAr I2luY2x1ZGUgPHJ0ZV9tZW1wb29sLmg+DQo+ICsjaW5jbHVkZSA8cnRlX21idWYuaD4NCj4gKyNp bmNsdWRlIDxydGVfaXAuaD4NCj4gKyNpbmNsdWRlIDxydGVfdGNwLmg+DQo+ICsjaW5jbHVkZSA8 cnRlX2xwbS5oPg0KPiArDQo+ICsjaW5jbHVkZSAibWFpbi5oIg0KPiArDQo+ICsjaWZuZGVmIEFQ UF9MQ09SRV9JT19GTFVTSA0KPiArI2RlZmluZSBBUFBfTENPUkVfSU9fRkxVU0ggICAgICAgICAg IDEwMDAwMDANCj4gKyNlbmRpZg0KPiArDQo+ICsjaWZuZGVmIEFQUF9MQ09SRV9XT1JLRVJfRkxV U0gNCj4gKyNkZWZpbmUgQVBQX0xDT1JFX1dPUktFUl9GTFVTSCAgICAgICAxMDAwMDAwDQo+ICsj ZW5kaWYNCj4gKw0KPiArI2lmbmRlZiBBUFBfU1RBVFMNCj4gKyNkZWZpbmUgQVBQX1NUQVRTICAg ICAgICAgICAgICAgICAgICAxMDAwMDAwDQo+ICsjZW5kaWYNCj4gKw0KPiArI2RlZmluZSBBUFBf SU9fUlhfRFJPUF9BTExfUEFDS0VUUyAgIDANCj4gKyNkZWZpbmUgQVBQX1dPUktFUl9EUk9QX0FM TF9QQUNLRVRTICAwDQo+ICsjZGVmaW5lIEFQUF9JT19UWF9EUk9QX0FMTF9QQUNLRVRTICAgMA0K PiArDQo+ICsjaWZuZGVmIEFQUF9JT19SWF9QUkVGRVRDSF9FTkFCTEUNCj4gKyNkZWZpbmUgQVBQ X0lPX1JYX1BSRUZFVENIX0VOQUJMRSAgICAxDQo+ICsjZW5kaWYNCj4gKw0KPiArI2lmbmRlZiBB UFBfV09SS0VSX1BSRUZFVENIX0VOQUJMRQ0KPiArI2RlZmluZSBBUFBfV09SS0VSX1BSRUZFVENI X0VOQUJMRSAgIDENCj4gKyNlbmRpZg0KPiArDQo+ICsjaWZuZGVmIEFQUF9JT19UWF9QUkVGRVRD SF9FTkFCTEUNCj4gKyNkZWZpbmUgQVBQX0lPX1RYX1BSRUZFVENIX0VOQUJMRSAgICAxDQo+ICsj ZW5kaWYNCj4gKw0KPiArI2lmIEFQUF9JT19SWF9QUkVGRVRDSF9FTkFCTEUNCj4gKyNkZWZpbmUg QVBQX0lPX1JYX1BSRUZFVENIMChwKSAgICAgICBydGVfcHJlZmV0Y2gwKHApDQo+ICsjZGVmaW5l IEFQUF9JT19SWF9QUkVGRVRDSDEocCkgICAgICAgcnRlX3ByZWZldGNoMShwKQ0KPiArI2Vsc2UN Cj4gKyNkZWZpbmUgQVBQX0lPX1JYX1BSRUZFVENIMChwKQ0KPiArI2RlZmluZSBBUFBfSU9fUlhf UFJFRkVUQ0gxKHApDQo+ICsjZW5kaWYNCj4gKw0KPiArI2lmIEFQUF9XT1JLRVJfUFJFRkVUQ0hf RU5BQkxFDQo+ICsjZGVmaW5lIEFQUF9XT1JLRVJfUFJFRkVUQ0gwKHApICAgICAgcnRlX3ByZWZl dGNoMChwKQ0KPiArI2RlZmluZSBBUFBfV09SS0VSX1BSRUZFVENIMShwKSAgICAgIHJ0ZV9wcmVm ZXRjaDEocCkNCj4gKyNlbHNlDQo+ICsjZGVmaW5lIEFQUF9XT1JLRVJfUFJFRkVUQ0gwKHApDQo+ ICsjZGVmaW5lIEFQUF9XT1JLRVJfUFJFRkVUQ0gxKHApDQo+ICsjZW5kaWYNCj4gKw0KPiArI2lm IEFQUF9JT19UWF9QUkVGRVRDSF9FTkFCTEUNCj4gKyNkZWZpbmUgQVBQX0lPX1RYX1BSRUZFVENI MChwKSAgICAgICBydGVfcHJlZmV0Y2gwKHApDQo+ICsjZGVmaW5lIEFQUF9JT19UWF9QUkVGRVRD SDEocCkgICAgICAgcnRlX3ByZWZldGNoMShwKQ0KPiArI2Vsc2UNCj4gKyNkZWZpbmUgQVBQX0lP X1RYX1BSRUZFVENIMChwKQ0KPiArI2RlZmluZSBBUFBfSU9fVFhfUFJFRkVUQ0gxKHApDQo+ICsj ZW5kaWYNCj4gKw0KPiArc3RhdGljIGlubGluZSB2b2lkDQo+ICthcHBfbGNvcmVfaW9fcnhfYnVm ZmVyX3RvX3NlbmQgKA0KPiArIHN0cnVjdCBhcHBfbGNvcmVfcGFyYW1zX2lvICpscCwNCj4gKyB1 aW50MzJfdCB3b3JrZXIsDQo+ICsgc3RydWN0IHJ0ZV9tYnVmICptYnVmLA0KPiArIHVpbnQzMl90 IGJzeikNCj4gK3sNCj4gKyB1aW50MzJfdCBwb3M7DQo+ICsgaW50IHJldDsNCj4gKw0KPiArIHBv cyA9IGxwLT5yeC5tYnVmX291dFt3b3JrZXJdLm5fbWJ1ZnM7DQo+ICsgbHAtPnJ4Lm1idWZfb3V0 W3dvcmtlcl0uYXJyYXlbcG9zICsrXSA9IG1idWY7DQo+ICsgaWYgKGxpa2VseShwb3MgPCBic3op KSB7DQo+ICsgbHAtPnJ4Lm1idWZfb3V0W3dvcmtlcl0ubl9tYnVmcyA9IHBvczsNCj4gKyByZXR1 cm47DQo+ICsgfQ0KPiArDQo+ICsgcmV0ID0gcnRlX3Jpbmdfc3BfZW5xdWV1ZV9idWxrKA0KPiAr IGxwLT5yeC5yaW5nc1t3b3JrZXJdLA0KPiArICh2b2lkICoqKSBscC0+cngubWJ1Zl9vdXRbd29y a2VyXS5hcnJheSwgYnN6KTsNCj4gKw0KPiArIGlmICh1bmxpa2VseShyZXQgPT0gLUVOT0JVRlMp KSB7DQo+ICsgdWludDMyX3QgazsNCj4gKyBmb3IgKGsgPSAwOyBrIDwgYnN6OyBrICsrKSB7DQo+ ICsgc3RydWN0IHJ0ZV9tYnVmICptID0gbHAtPnJ4Lm1idWZfb3V0W3dvcmtlcl0uYXJyYXlba107 DQo+ICsgcnRlX3BrdG1idWZfZnJlZShtKTsgfSB9DQo+ICsNCj4gKyBscC0+cngubWJ1Zl9vdXRb d29ya2VyXS5uX21idWZzID0gMDsNCj4gKyBscC0+cngubWJ1Zl9vdXRfZmx1c2hbd29ya2VyXSA9 IDA7DQo+ICsNCj4gKyNpZiBBUFBfU1RBVFMNCj4gKyBscC0+cngucmluZ3NfaXRlcnNbd29ya2Vy XSArKzsNCj4gKyBpZiAobGlrZWx5KHJldCA9PSAwKSkgew0KPiArIGxwLT5yeC5yaW5nc19jb3Vu dFt3b3JrZXJdICsrOw0KPiArIH0NCj4gKyBpZiAodW5saWtlbHkobHAtPnJ4LnJpbmdzX2l0ZXJz W3dvcmtlcl0gPT0gQVBQX1NUQVRTKSkgeyB1bnNpZ25lZA0KPiArIGxjb3JlID0gcnRlX2xjb3Jl X2lkKCk7DQo+ICsNCj4gKyBwcmludGYoIlx0SS9PIFJYICV1IG91dCAod29ya2VyICV1KTogZW5x IHN1Y2Nlc3MgcmF0ZSA9ICUuMmZcbiIsDQo+ICsgbGNvcmUsICh1bnNpZ25lZCl3b3JrZXIsDQo+ ICsgKChkb3VibGUpIGxwLT5yeC5yaW5nc19jb3VudFt3b3JrZXJdKSAvICgoZG91YmxlKQ0KPiAr IGxwLT5yeC5yaW5nc19pdGVyc1t3b3JrZXJdKSk7DQo+ICsgbHAtPnJ4LnJpbmdzX2l0ZXJzW3dv cmtlcl0gPSAwOw0KPiArIGxwLT5yeC5yaW5nc19jb3VudFt3b3JrZXJdID0gMDsNCj4gKyB9DQo+ ICsjZW5kaWYNCj4gK30NCj4gKw0KPiArc3RhdGljIGlubGluZSB2b2lkDQo+ICthcHBfbGNvcmVf aW9fcngoDQo+ICsgc3RydWN0IGFwcF9sY29yZV9wYXJhbXNfaW8gKmxwLA0KPiArIHVpbnQzMl90 IG5fd29ya2VycywNCj4gKyB1aW50MzJfdCBic3pfcmQsDQo+ICsgdWludDMyX3QgYnN6X3dyLA0K PiArIHVpbnQ4X3QgcG9zX2xiKQ0KPiArew0KPiArIHN0cnVjdCBydGVfbWJ1ZiAqbWJ1Zl8xXzAs ICptYnVmXzFfMSwgKm1idWZfMl8wLCAqbWJ1Zl8yXzE7ICB1aW50OF90DQo+ICsqZGF0YV8xXzAs ICpkYXRhXzFfMSA9IE5VTEw7ICB1aW50MzJfdCBpOw0KPiArDQo+ICsgZm9yIChpID0gMDsgaSA8 IGxwLT5yeC5uX25pY19xdWV1ZXM7IGkgKyspIHsgdWludDhfdCBwb3J0ID0NCj4gKyBscC0+cngu bmljX3F1ZXVlc1tpXS5wb3J0OyB1aW50OF90IHF1ZXVlID0gbHAtPnJ4Lm5pY19xdWV1ZXNbaV0u cXVldWU7DQo+ICsgdWludDMyX3Qgbl9tYnVmcywgajsNCj4gKw0KPiArIG5fbWJ1ZnMgPSBydGVf ZXRoX3J4X2J1cnN0KA0KPiArIHBvcnQsDQo+ICsgcXVldWUsDQo+ICsgbHAtPnJ4Lm1idWZfaW4u YXJyYXksDQo+ICsgKHVpbnQxNl90KSBic3pfcmQpOw0KPiArDQo+ICsgaWYgKHVubGlrZWx5KG5f bWJ1ZnMgPT0gMCkpIHsNCj4gKyBjb250aW51ZTsNCj4gKyB9DQo+ICsNCj4gKyNpZiBBUFBfU1RB VFMNCj4gKyBscC0+cngubmljX3F1ZXVlc19pdGVyc1tpXSArKzsNCj4gKyBscC0+cngubmljX3F1 ZXVlc19jb3VudFtpXSArPSBuX21idWZzOw0KPiArIGlmICh1bmxpa2VseShscC0+cngubmljX3F1 ZXVlc19pdGVyc1tpXSA9PSBBUFBfU1RBVFMpKSB7IHN0cnVjdA0KPiArIHJ0ZV9ldGhfc3RhdHMg c3RhdHM7IHVuc2lnbmVkIGxjb3JlID0gcnRlX2xjb3JlX2lkKCk7DQo+ICsNCj4gKyBydGVfZXRo X3N0YXRzX2dldChwb3J0LCAmc3RhdHMpOw0KPiArDQo+ICsgcHJpbnRmKCJJL08gUlggJXUgaW4g KE5JQyBwb3J0ICV1KTogTklDIGRyb3AgcmF0aW8gPSAlLjJmIGF2ZyBidXJzdA0KPiArIHNpemUg PSAlLjJmXG4iLCBsY29yZSwNCj4gKyAodW5zaWduZWQpIHBvcnQsDQo+ICsgKGRvdWJsZSkgc3Rh dHMuaW1pc3NlZCAvIChkb3VibGUpIChzdGF0cy5pbWlzc2VkICsgc3RhdHMuaXBhY2tldHMpLA0K PiArICgoZG91YmxlKSBscC0+cngubmljX3F1ZXVlc19jb3VudFtpXSkgLyAoKGRvdWJsZSkNCj4g KyBscC0+cngubmljX3F1ZXVlc19pdGVyc1tpXSkpOw0KPiArIGxwLT5yeC5uaWNfcXVldWVzX2l0 ZXJzW2ldID0gMDsNCj4gKyBscC0+cngubmljX3F1ZXVlc19jb3VudFtpXSA9IDA7DQo+ICsgfQ0K PiArI2VuZGlmDQo+ICsNCj4gKyNpZiBBUFBfSU9fUlhfRFJPUF9BTExfUEFDS0VUUw0KPiArIGZv ciAoaiA9IDA7IGogPCBuX21idWZzOyBqICsrKSB7DQo+ICsgc3RydWN0IHJ0ZV9tYnVmICpwa3Qg PSBscC0+cngubWJ1Zl9pbi5hcnJheVtqXTsNCj4gK3J0ZV9wa3RtYnVmX2ZyZWUocGt0KTsgIH0N Cj4gKw0KPiArIGNvbnRpbnVlOw0KPiArI2VuZGlmDQo+ICsNCj4gKyBtYnVmXzFfMCA9IGxwLT5y eC5tYnVmX2luLmFycmF5WzBdOw0KPiArIG1idWZfMV8xID0gbHAtPnJ4Lm1idWZfaW4uYXJyYXlb MV07DQo+ICsgZGF0YV8xXzAgPSBydGVfcGt0bWJ1Zl9tdG9kKG1idWZfMV8wLCB1aW50OF90ICop OyBpZiAobGlrZWx5KG5fbWJ1ZnMgPg0KPiArIDEpKSB7DQo+ICsgZGF0YV8xXzEgPSBydGVfcGt0 bWJ1Zl9tdG9kKG1idWZfMV8xLCB1aW50OF90ICopOyB9DQo+ICsNCj4gKyBtYnVmXzJfMCA9IGxw LT5yeC5tYnVmX2luLmFycmF5WzJdOw0KPiArIG1idWZfMl8xID0gbHAtPnJ4Lm1idWZfaW4uYXJy YXlbM107DQo+ICsgQVBQX0lPX1JYX1BSRUZFVENIMChtYnVmXzJfMCk7DQo+ICsgQVBQX0lPX1JY X1BSRUZFVENIMChtYnVmXzJfMSk7DQo+ICsNCj4gKyBmb3IgKGogPSAwOyBqICsgMyA8IG5fbWJ1 ZnM7IGogKz0gMikgeyBzdHJ1Y3QgcnRlX21idWYgKm1idWZfMF8wLA0KPiArICptYnVmXzBfMTsg dWludDhfdCAqZGF0YV8wXzAsICpkYXRhXzBfMTsgdWludDMyX3Qgd29ya2VyXzAsIHdvcmtlcl8x Ow0KPiArDQo+ICsgbWJ1Zl8wXzAgPSBtYnVmXzFfMDsNCj4gKyBtYnVmXzBfMSA9IG1idWZfMV8x Ow0KPiArIGRhdGFfMF8wID0gZGF0YV8xXzA7DQo+ICsgZGF0YV8wXzEgPSBkYXRhXzFfMTsNCj4g Kw0KPiArIG1idWZfMV8wID0gbWJ1Zl8yXzA7DQo+ICsgbWJ1Zl8xXzEgPSBtYnVmXzJfMTsNCj4g KyBkYXRhXzFfMCA9IHJ0ZV9wa3RtYnVmX210b2QobWJ1Zl8yXzAsIHVpbnQ4X3QgKik7DQo+ICsg ZGF0YV8xXzEgPSBydGVfcGt0bWJ1Zl9tdG9kKG1idWZfMl8xLCB1aW50OF90ICopOw0KPiArIEFQ UF9JT19SWF9QUkVGRVRDSDAoZGF0YV8xXzApOyBBUFBfSU9fUlhfUFJFRkVUQ0gwKGRhdGFfMV8x KTsNCj4gKw0KPiArIG1idWZfMl8wID0gbHAtPnJ4Lm1idWZfaW4uYXJyYXlbais0XTsNCj4gKyBt YnVmXzJfMSA9IGxwLT5yeC5tYnVmX2luLmFycmF5W2orNV07DQo+ICsgQVBQX0lPX1JYX1BSRUZF VENIMChtYnVmXzJfMCk7DQo+ICsgQVBQX0lPX1JYX1BSRUZFVENIMChtYnVmXzJfMSk7DQo+ICsN Cj4gKyB3b3JrZXJfMCA9IGRhdGFfMF8wW3Bvc19sYl0gJiAobl93b3JrZXJzIC0gMSk7DQo+ICsg d29ya2VyXzEgPSBkYXRhXzBfMVtwb3NfbGJdICYgKG5fd29ya2VycyAtIDEpOw0KPiArDQo+ICsg YXBwX2xjb3JlX2lvX3J4X2J1ZmZlcl90b19zZW5kKGxwLCB3b3JrZXJfMCwgbWJ1Zl8wXzAsIGJz el93cik7DQo+ICsgYXBwX2xjb3JlX2lvX3J4X2J1ZmZlcl90b19zZW5kKGxwLCB3b3JrZXJfMSwg bWJ1Zl8wXzEsIGJzel93cik7IH0NCj4gKw0KPiArIC8qIEhhbmRsZSB0aGUgbGFzdCAxLCAyICh3 aGVuIG5fbWJ1ZnMgaXMgZXZlbikgb3IgMyAod2hlbiBuX21idWZzIGlzDQo+ICsgb2RkKSBwYWNr ZXRzICAqLyBmb3IgKCA7IGogPCBuX21idWZzOyBqICs9IDEpIHsgc3RydWN0IHJ0ZV9tYnVmICpt YnVmOw0KPiArIHVpbnQ4X3QgKmRhdGE7IHVpbnQzMl90IHdvcmtlcjsNCj4gKw0KPiArIG1idWYg PSBtYnVmXzFfMDsNCj4gKyBtYnVmXzFfMCA9IG1idWZfMV8xOw0KPiArIG1idWZfMV8xID0gbWJ1 Zl8yXzA7DQo+ICsgbWJ1Zl8yXzAgPSBtYnVmXzJfMTsNCj4gKw0KPiArIGRhdGEgPSBydGVfcGt0 bWJ1Zl9tdG9kKG1idWYsIHVpbnQ4X3QgKik7DQo+ICsNCj4gKyBBUFBfSU9fUlhfUFJFRkVUQ0gw KG1idWZfMV8wKTsNCj4gKw0KPiArIHdvcmtlciA9IGRhdGFbcG9zX2xiXSAmIChuX3dvcmtlcnMg LSAxKTsNCj4gKw0KPiArIGFwcF9sY29yZV9pb19yeF9idWZmZXJfdG9fc2VuZChscCwgd29ya2Vy LCBtYnVmLCBic3pfd3IpOyAgfSAgfSB9DQo+ICsNCj4gK3N0YXRpYyBpbmxpbmUgdm9pZA0KPiAr YXBwX2xjb3JlX2lvX3J4X2ZsdXNoKHN0cnVjdCBhcHBfbGNvcmVfcGFyYW1zX2lvICpscCwgdWlu dDMyX3QNCj4gK25fd29ya2VycykgeyAgdWludDMyX3Qgd29ya2VyOw0KPiArDQo+ICsgZm9yICh3 b3JrZXIgPSAwOyB3b3JrZXIgPCBuX3dvcmtlcnM7IHdvcmtlciArKykgeyBpbnQgcmV0Ow0KPiAr DQo+ICsgaWYgKGxpa2VseSgobHAtPnJ4Lm1idWZfb3V0X2ZsdXNoW3dvcmtlcl0gPT0gMCkgfHwN Cj4gKyAgICAgICAgICAgIChscC0+cngubWJ1Zl9vdXRbd29ya2VyXS5uX21idWZzID09IDApKSkg ew0KPiArIGxwLT5yeC5tYnVmX291dF9mbHVzaFt3b3JrZXJdID0gMTsNCj4gKyBjb250aW51ZTsN Cj4gKyB9DQo+ICsNCj4gKyByZXQgPSBydGVfcmluZ19zcF9lbnF1ZXVlX2J1bGsoDQo+ICsgbHAt PnJ4LnJpbmdzW3dvcmtlcl0sDQo+ICsgKHZvaWQgKiopIGxwLT5yeC5tYnVmX291dFt3b3JrZXJd LmFycmF5LA0KPiArIGxwLT5yeC5tYnVmX291dFt3b3JrZXJdLm5fbWJ1ZnMpOw0KPiArDQo+ICsg aWYgKHVubGlrZWx5KHJldCA8IDApKSB7DQo+ICsgdWludDMyX3QgazsNCj4gKyBmb3IgKGsgPSAw OyBrIDwgbHAtPnJ4Lm1idWZfb3V0W3dvcmtlcl0ubl9tYnVmczsgayArKykgeyBzdHJ1Y3QNCj4g KyBydGVfbWJ1ZiAqcGt0X3RvX2ZyZWUgPSBscC0+cngubWJ1Zl9vdXRbd29ya2VyXS5hcnJheVtr XTsNCj4gKyBydGVfcGt0bWJ1Zl9mcmVlKHBrdF90b19mcmVlKTsgfSB9DQo+ICsNCj4gKyBscC0+ cngubWJ1Zl9vdXRbd29ya2VyXS5uX21idWZzID0gMDsNCj4gKyBscC0+cngubWJ1Zl9vdXRfZmx1 c2hbd29ya2VyXSA9IDE7DQo+ICsgfQ0KPiArfQ0KPiArDQo+ICtzdGF0aWMgaW5saW5lIHZvaWQN Cj4gK2FwcF9sY29yZV9pb190eCgNCj4gKyBzdHJ1Y3QgYXBwX2xjb3JlX3BhcmFtc19pbyAqbHAs DQo+ICsgdWludDMyX3Qgbl93b3JrZXJzLA0KPiArIHVpbnQzMl90IGJzel9yZCwNCj4gKyB1aW50 MzJfdCBic3pfd3IpDQo+ICt7DQo+ICsgdWludDMyX3Qgd29ya2VyOw0KPiArDQo+ICsgZm9yICh3 b3JrZXIgPSAwOyB3b3JrZXIgPCBuX3dvcmtlcnM7IHdvcmtlciArKykgeyB1aW50MzJfdCBpOw0K PiArDQo+ICsgZm9yIChpID0gMDsgaSA8IGxwLT50eC5uX25pY19wb3J0czsgaSArKykgeyB1aW50 OF90IHBvcnQgPQ0KPiArIGxwLT50eC5uaWNfcG9ydHNbaV07IHN0cnVjdCBydGVfcmluZyAqcmlu ZyA9DQo+ICsgbHAtPnR4LnJpbmdzW3BvcnRdW3dvcmtlcl07IHVpbnQzMl90IG5fbWJ1ZnMsIG5f cGt0czsgaW50IHJldDsNCj4gKw0KPiArIG5fbWJ1ZnMgPSBscC0+dHgubWJ1Zl9vdXRbcG9ydF0u bl9tYnVmczsgcmV0ID0NCj4gKyBydGVfcmluZ19zY19kZXF1ZXVlX2J1bGsoIHJpbmcsICh2b2lk ICoqKQ0KPiArICZscC0+dHgubWJ1Zl9vdXRbcG9ydF0uYXJyYXlbbl9tYnVmc10sDQo+ICsgYnN6 X3JkKTsNCj4gKw0KPiArIGlmICh1bmxpa2VseShyZXQgPT0gLUVOT0VOVCkpIHsNCj4gKyBjb250 aW51ZTsNCj4gKyB9DQo+ICsNCj4gKyBuX21idWZzICs9IGJzel9yZDsNCj4gKw0KPiArI2lmIEFQ UF9JT19UWF9EUk9QX0FMTF9QQUNLRVRTDQo+ICsgew0KPiArIHVpbnQzMl90IGo7DQo+ICsgQVBQ X0lPX1RYX1BSRUZFVENIMChscC0+dHgubWJ1Zl9vdXRbcG9ydF0uYXJyYXlbMF0pOw0KPiArIEFQ UF9JT19UWF9QUkVGRVRDSDAobHAtPnR4Lm1idWZfb3V0W3BvcnRdLmFycmF5WzFdKTsNCj4gKw0K PiArIGZvciAoaiA9IDA7IGogPCBuX21idWZzOyBqICsrKSB7DQo+ICsgaWYgKGxpa2VseShqIDwg bl9tYnVmcyAtIDIpKSB7DQo+ICsgQVBQX0lPX1RYX1BSRUZFVENIMChscC0+dHgubWJ1Zl9vdXRb cG9ydF0uYXJyYXlbaiArIDJdKTsgfQ0KPiArDQo+ICsgcnRlX3BrdG1idWZfZnJlZShscC0+dHgu bWJ1Zl9vdXRbcG9ydF0uYXJyYXlbal0pOw0KPiArIH0NCj4gKw0KPiArIGxwLT50eC5tYnVmX291 dFtwb3J0XS5uX21idWZzID0gMDsNCj4gKw0KPiArIGNvbnRpbnVlOw0KPiArIH0NCj4gKyNlbmRp Zg0KPiArDQo+ICsgaWYgKHVubGlrZWx5KG5fbWJ1ZnMgPCBic3pfd3IpKSB7DQo+ICsgbHAtPnR4 Lm1idWZfb3V0W3BvcnRdLm5fbWJ1ZnMgPSBuX21idWZzOw0KPiArIGNvbnRpbnVlOw0KPiArIH0N Cj4gKw0KPiArIG5fcGt0cyA9IHJ0ZV9ldGhfdHhfYnVyc3QoDQo+ICsgcG9ydCwNCj4gKyAwLA0K PiArIGxwLT50eC5tYnVmX291dFtwb3J0XS5hcnJheSwNCj4gKyAodWludDE2X3QpIG5fbWJ1ZnMp Ow0KPiArDQo+ICsjaWYgQVBQX1NUQVRTDQo+ICsgbHAtPnR4Lm5pY19wb3J0c19pdGVyc1twb3J0 XSArKzsNCj4gKyBscC0+dHgubmljX3BvcnRzX2NvdW50W3BvcnRdICs9IG5fcGt0czsNCj4gKyBp ZiAodW5saWtlbHkobHAtPnR4Lm5pY19wb3J0c19pdGVyc1twb3J0XSA9PSBBUFBfU1RBVFMpKSB7 IHVuc2lnbmVkDQo+ICsgbGNvcmUgPSBydGVfbGNvcmVfaWQoKTsNCj4gKw0KPiArIHByaW50Zigi XHRcdFx0SS9PIFRYICV1IG91dCAocG9ydCAldSk6IGF2ZyBidXJzdCBzaXplID0gJS4yZlxuIiwN Cj4gKyBsY29yZSwNCj4gKyAodW5zaWduZWQpIHBvcnQsDQo+ICsgKChkb3VibGUpIGxwLT50eC5u aWNfcG9ydHNfY291bnRbcG9ydF0pIC8gKChkb3VibGUpDQo+ICsgbHAtPnR4Lm5pY19wb3J0c19p dGVyc1twb3J0XSkpOw0KPiArIGxwLT50eC5uaWNfcG9ydHNfaXRlcnNbcG9ydF0gPSAwOw0KPiAr IGxwLT50eC5uaWNfcG9ydHNfY291bnRbcG9ydF0gPSAwOw0KPiArIH0NCj4gKyNlbmRpZg0KPiAr DQo+ICsgaWYgKHVubGlrZWx5KG5fcGt0cyA8IG5fbWJ1ZnMpKSB7DQo+ICsgdWludDMyX3QgazsN Cj4gKyBmb3IgKGsgPSBuX3BrdHM7IGsgPCBuX21idWZzOyBrICsrKSB7DQo+ICsgc3RydWN0IHJ0 ZV9tYnVmICpwa3RfdG9fZnJlZSA9IGxwLT50eC5tYnVmX291dFtwb3J0XS5hcnJheVtrXTsNCj4g KyBydGVfcGt0bWJ1Zl9mcmVlKHBrdF90b19mcmVlKTsgfSB9DQo+ICsgbHAtPnR4Lm1idWZfb3V0 W3BvcnRdLm5fbWJ1ZnMgPSAwOw0KPiArIGxwLT50eC5tYnVmX291dF9mbHVzaFtwb3J0XSA9IDA7 DQo+ICsgfQ0KPiArIH0NCj4gK30NCj4gKw0KPiArc3RhdGljIGlubGluZSB2b2lkDQo+ICthcHBf bGNvcmVfaW9fdHhfZmx1c2goc3RydWN0IGFwcF9sY29yZV9wYXJhbXNfaW8gKmxwKSB7ICB1aW50 OF90IHBvcnQ7DQo+ICsNCj4gKyBmb3IgKHBvcnQgPSAwOyBwb3J0IDwgbHAtPnR4Lm5fbmljX3Bv cnRzOyBwb3J0ICsrKSB7IHVpbnQzMl90IG5fcGt0czsNCj4gKw0KPiArIGlmIChsaWtlbHkoKGxw LT50eC5tYnVmX291dF9mbHVzaFtwb3J0XSA9PSAwKSB8fA0KPiArICAgICAgICAgICAgKGxwLT50 eC5tYnVmX291dFtwb3J0XS5uX21idWZzID09IDApKSkgew0KPiArIGxwLT50eC5tYnVmX291dF9m bHVzaFtwb3J0XSA9IDE7DQo+ICsgY29udGludWU7DQo+ICsgfQ0KPiArDQo+ICsgbl9wa3RzID0g cnRlX2V0aF90eF9idXJzdCgNCj4gKyBwb3J0LA0KPiArIDAsDQo+ICsgbHAtPnR4Lm1idWZfb3V0 W3BvcnRdLmFycmF5LA0KPiArICh1aW50MTZfdCkgbHAtPnR4Lm1idWZfb3V0W3BvcnRdLm5fbWJ1 ZnMpOw0KPiArDQo+ICsgaWYgKHVubGlrZWx5KG5fcGt0cyA8IGxwLT50eC5tYnVmX291dFtwb3J0 XS5uX21idWZzKSkgeyB1aW50MzJfdCBrOw0KPiArIGZvciAoayA9IG5fcGt0czsgayA8IGxwLT50 eC5tYnVmX291dFtwb3J0XS5uX21idWZzOyBrICsrKSB7IHN0cnVjdA0KPiArIHJ0ZV9tYnVmICpw a3RfdG9fZnJlZSA9IGxwLT50eC5tYnVmX291dFtwb3J0XS5hcnJheVtrXTsNCj4gKyBydGVfcGt0 bWJ1Zl9mcmVlKHBrdF90b19mcmVlKTsgfSB9DQo+ICsNCj4gKyBscC0+dHgubWJ1Zl9vdXRbcG9y dF0ubl9tYnVmcyA9IDA7DQo+ICsgbHAtPnR4Lm1idWZfb3V0X2ZsdXNoW3BvcnRdID0gMTsNCj4g KyB9DQo+ICt9DQo+ICsNCj4gK3N0YXRpYyB2b2lkDQo+ICthcHBfbGNvcmVfbWFpbl9sb29wX2lv KHZvaWQpDQo+ICt7DQo+ICsgdWludDMyX3QgbGNvcmUgPSBydGVfbGNvcmVfaWQoKTsNCj4gKyBz dHJ1Y3QgYXBwX2xjb3JlX3BhcmFtc19pbyAqbHAgPSAmYXBwLmxjb3JlX3BhcmFtc1tsY29yZV0u aW87DQo+ICt1aW50MzJfdCBuX3dvcmtlcnMgPSBhcHBfZ2V0X2xjb3Jlc193b3JrZXIoKTsgIHVp bnQ2NF90IGkgPSAwOw0KPiArDQo+ICsgdWludDMyX3QgYnN6X3J4X3JkID0gYXBwLmJ1cnN0X3Np emVfaW9fcnhfcmVhZDsgdWludDMyX3QgYnN6X3J4X3dyID0NCj4gKyBhcHAuYnVyc3Rfc2l6ZV9p b19yeF93cml0ZTsgdWludDMyX3QgYnN6X3R4X3JkID0NCj4gKyBhcHAuYnVyc3Rfc2l6ZV9pb190 eF9yZWFkOyB1aW50MzJfdCBic3pfdHhfd3IgPQ0KPiArIGFwcC5idXJzdF9zaXplX2lvX3R4X3dy aXRlOw0KPiArDQo+ICsgdWludDhfdCBwb3NfbGIgPSBhcHAucG9zX2xiOw0KPiArDQo+ICsgZm9y ICggOyA7ICkgew0KPiArIGlmIChBUFBfTENPUkVfSU9fRkxVU0ggJiYgKHVubGlrZWx5KGkgPT0g QVBQX0xDT1JFX0lPX0ZMVVNIKSkpIHsgaWYNCj4gKyAobGlrZWx5KGxwLT5yeC5uX25pY19xdWV1 ZXMgPiAwKSkgeyBhcHBfbGNvcmVfaW9fcnhfZmx1c2gobHAsDQo+ICsgbl93b3JrZXJzKTsgfQ0K PiArDQo+ICsgaWYgKGxpa2VseShscC0+dHgubl9uaWNfcG9ydHMgPiAwKSkgew0KPiArIGFwcF9s Y29yZV9pb190eF9mbHVzaChscCk7DQo+ICsgfQ0KPiArDQo+ICsgaSA9IDA7DQo+ICsgfQ0KPiAr DQo+ICsgaWYgKGxpa2VseShscC0+cngubl9uaWNfcXVldWVzID4gMCkpIHsgYXBwX2xjb3JlX2lv X3J4KGxwLCBuX3dvcmtlcnMsDQo+ICsgYnN6X3J4X3JkLCBic3pfcnhfd3IsIHBvc19sYik7IH0N Cj4gKw0KPiArIGlmIChsaWtlbHkobHAtPnR4Lm5fbmljX3BvcnRzID4gMCkpIHsNCj4gKyBhcHBf bGNvcmVfaW9fdHgobHAsIG5fd29ya2VycywgYnN6X3R4X3JkLCBic3pfdHhfd3IpOyB9DQo+ICsN Cj4gKyBpICsrOw0KPiArIH0NCj4gK30NCj4gKw0KPiArc3RhdGljIGlubGluZSB2b2lkDQo+ICth cHBfbGNvcmVfd29ya2VyKA0KPiArIHN0cnVjdCBhcHBfbGNvcmVfcGFyYW1zX3dvcmtlciAqbHAs DQo+ICsgdWludDMyX3QgYnN6X3JkLA0KPiArIHVpbnQzMl90IGJzel93cikNCj4gK3sNCj4gKyB1 aW50MzJfdCBpOw0KPiArDQo+ICsgZm9yIChpID0gMDsgaSA8IGxwLT5uX3JpbmdzX2luOyBpICsr KSB7IHN0cnVjdCBydGVfcmluZyAqcmluZ19pbiA9DQo+ICsgbHAtPnJpbmdzX2luW2ldOyB1aW50 MzJfdCBqOyBpbnQgcmV0Ow0KPiArDQo+ICsgcmV0ID0gcnRlX3Jpbmdfc2NfZGVxdWV1ZV9idWxr KA0KPiArIHJpbmdfaW4sDQo+ICsgKHZvaWQgKiopIGxwLT5tYnVmX2luLmFycmF5LA0KPiArIGJz el9yZCk7DQo+ICsNCj4gKyBpZiAodW5saWtlbHkocmV0ID09IC1FTk9FTlQpKSB7DQo+ICsgY29u dGludWU7DQo+ICsgfQ0KPiArDQo+ICsjaWYgQVBQX1dPUktFUl9EUk9QX0FMTF9QQUNLRVRTDQo+ ICsgZm9yIChqID0gMDsgaiA8IGJzel9yZDsgaiArKykgew0KPiArIHN0cnVjdCBydGVfbWJ1ZiAq cGt0ID0gbHAtPm1idWZfaW4uYXJyYXlbal07ICBydGVfcGt0bWJ1Zl9mcmVlKHBrdCk7DQo+ICt9 DQo+ICsNCj4gKyBjb250aW51ZTsNCj4gKyNlbmRpZg0KPiArDQo+ICsgQVBQX1dPUktFUl9QUkVG RVRDSDEocnRlX3BrdG1idWZfbXRvZChscC0+bWJ1Zl9pbi5hcnJheVswXSwNCj4gdW5zaWduZWQN Cj4gKyBjaGFyICopKTsgQVBQX1dPUktFUl9QUkVGRVRDSDAobHAtPm1idWZfaW4uYXJyYXlbMV0p Ow0KPiArDQo+ICsgZm9yIChqID0gMDsgaiA8IGJzel9yZDsgaiArKykgew0KPiArIHN0cnVjdCBy dGVfbWJ1ZiAqcGt0Ow0KPiArIHN0cnVjdCBpcHY0X2hkciAqaXB2NF9oZHI7DQo+ICsgdWludDMy X3QgaXB2NF9kc3QsIHBvczsNCj4gKyB1aW50OF90IHBvcnQ7DQo+ICsNCj4gKyBpZiAobGlrZWx5 KGogPCBic3pfcmQgLSAxKSkgew0KPiArIEFQUF9XT1JLRVJfUFJFRkVUQ0gxKHJ0ZV9wa3RtYnVm X210b2QobHAtPm1idWZfaW4uYXJyYXlbaisxXSwNCj4gdW5zaWduZWQNCj4gKyBjaGFyICopKTsg fSBpZiAobGlrZWx5KGogPCBic3pfcmQgLSAyKSkgew0KPiArIEFQUF9XT1JLRVJfUFJFRkVUQ0gw KGxwLT5tYnVmX2luLmFycmF5W2orMl0pOw0KPiArIH0NCj4gKw0KPiArIHBrdCA9IGxwLT5tYnVm X2luLmFycmF5W2pdOw0KPiArIGlwdjRfaGRyID0gKHN0cnVjdCBpcHY0X2hkciAqKShydGVfcGt0 bWJ1Zl9tdG9kKHBrdCwgdW5zaWduZWQgY2hhciAqKQ0KPiArICsgc2l6ZW9mKHN0cnVjdCBldGhl cl9oZHIpKTsgaXB2NF9kc3QgPQ0KPiArIHJ0ZV9iZV90b19jcHVfMzIoaXB2NF9oZHItPmRzdF9h ZGRyKTsNCj4gKw0KPiArIGlmICh1bmxpa2VseShydGVfbHBtX2xvb2t1cChscC0+bHBtX3RhYmxl LCBpcHY0X2RzdCwgJnBvcnQpICE9IDApKSB7DQo+ICsgcG9ydCA9IHBrdC0+cGt0LmluX3BvcnQ7 IH0NCj4gKw0KPiArIHBvcyA9IGxwLT5tYnVmX291dFtwb3J0XS5uX21idWZzOw0KPiArDQo+ICsg bHAtPm1idWZfb3V0W3BvcnRdLmFycmF5W3BvcyArK10gPSBwa3Q7DQo+ICsgaWYgKGxpa2VseShw b3MgPCBic3pfd3IpKSB7DQo+ICsgbHAtPm1idWZfb3V0W3BvcnRdLm5fbWJ1ZnMgPSBwb3M7DQo+ ICsgY29udGludWU7DQo+ICsgfQ0KPiArDQo+ICsgcmV0ID0gcnRlX3Jpbmdfc3BfZW5xdWV1ZV9i dWxrKA0KPiArIGxwLT5yaW5nc19vdXRbcG9ydF0sDQo+ICsgKHZvaWQgKiopIGxwLT5tYnVmX291 dFtwb3J0XS5hcnJheSwNCj4gKyBic3pfd3IpOw0KPiArDQo+ICsjaWYgQVBQX1NUQVRTDQo+ICsg bHAtPnJpbmdzX291dF9pdGVyc1twb3J0XSArKzsNCj4gKyBpZiAocmV0ID09IDApIHsNCj4gKyBs cC0+cmluZ3Nfb3V0X2NvdW50W3BvcnRdICs9IDE7DQo+ICsgfQ0KPiArIGlmIChscC0+cmluZ3Nf b3V0X2l0ZXJzW3BvcnRdID09IEFQUF9TVEFUUyl7IHByaW50ZigiXHRcdFdvcmtlciAldSBvdXQN Cj4gKyAoTklDIHBvcnQgJXUpOiBlbnEgc3VjY2VzcyByYXRlID0gJS4yZlxuIiwNCj4gKyAodW5z aWduZWQpIGxwLT53b3JrZXJfaWQsDQo+ICsgKHVuc2lnbmVkKSBwb3J0LA0KPiArICgoZG91Ymxl KSBscC0+cmluZ3Nfb3V0X2NvdW50W3BvcnRdKSAvICgoZG91YmxlKQ0KPiArIGxwLT5yaW5nc19v dXRfaXRlcnNbcG9ydF0pKTsNCj4gKyBscC0+cmluZ3Nfb3V0X2l0ZXJzW3BvcnRdID0gMDsNCj4g KyBscC0+cmluZ3Nfb3V0X2NvdW50W3BvcnRdID0gMDsNCj4gKyB9DQo+ICsjZW5kaWYNCj4gKw0K PiArIGlmICh1bmxpa2VseShyZXQgPT0gLUVOT0JVRlMpKSB7DQo+ICsgdWludDMyX3QgazsNCj4g KyBmb3IgKGsgPSAwOyBrIDwgYnN6X3dyOyBrICsrKSB7DQo+ICsgc3RydWN0IHJ0ZV9tYnVmICpw a3RfdG9fZnJlZSA9IGxwLT5tYnVmX291dFtwb3J0XS5hcnJheVtrXTsNCj4gKyBydGVfcGt0bWJ1 Zl9mcmVlKHBrdF90b19mcmVlKTsgfSB9DQo+ICsNCj4gKyBscC0+bWJ1Zl9vdXRbcG9ydF0ubl9t YnVmcyA9IDA7DQo+ICsgbHAtPm1idWZfb3V0X2ZsdXNoW3BvcnRdID0gMDsNCj4gKyB9DQo+ICsg fQ0KPiArfQ0KPiArDQo+ICtzdGF0aWMgaW5saW5lIHZvaWQNCj4gK2FwcF9sY29yZV93b3JrZXJf Zmx1c2goc3RydWN0IGFwcF9sY29yZV9wYXJhbXNfd29ya2VyICpscCkgeyAgdWludDMyX3QNCj4g K3BvcnQ7DQo+ICsNCj4gKyBmb3IgKHBvcnQgPSAwOyBwb3J0IDwgQVBQX01BWF9OSUNfUE9SVFM7 IHBvcnQgKyspIHsgaW50IHJldDsNCj4gKw0KPiArIGlmICh1bmxpa2VseShscC0+cmluZ3Nfb3V0 W3BvcnRdID09IE5VTEwpKSB7IGNvbnRpbnVlOyB9DQo+ICsNCj4gKyBpZiAobGlrZWx5KChscC0+ bWJ1Zl9vdXRfZmx1c2hbcG9ydF0gPT0gMCkgfHwNCj4gKyAgICAgICAgICAgIChscC0+bWJ1Zl9v dXRbcG9ydF0ubl9tYnVmcyA9PSAwKSkpIHsNCj4gKyBscC0+bWJ1Zl9vdXRfZmx1c2hbcG9ydF0g PSAxOw0KPiArIGNvbnRpbnVlOw0KPiArIH0NCj4gKw0KPiArIHJldCA9IHJ0ZV9yaW5nX3NwX2Vu cXVldWVfYnVsaygNCj4gKyBscC0+cmluZ3Nfb3V0W3BvcnRdLA0KPiArICh2b2lkICoqKSBscC0+ bWJ1Zl9vdXRbcG9ydF0uYXJyYXksDQo+ICsgbHAtPm1idWZfb3V0W3BvcnRdLm5fbWJ1ZnMpOw0K PiArDQo+ICsgaWYgKHVubGlrZWx5KHJldCA8IDApKSB7DQo+ICsgdWludDMyX3QgazsNCj4gKyBm b3IgKGsgPSAwOyBrIDwgbHAtPm1idWZfb3V0W3BvcnRdLm5fbWJ1ZnM7IGsgKyspIHsgc3RydWN0 IHJ0ZV9tYnVmDQo+ICsgKnBrdF90b19mcmVlID0gbHAtPm1idWZfb3V0W3BvcnRdLmFycmF5W2td Ow0KPiArIHJ0ZV9wa3RtYnVmX2ZyZWUocGt0X3RvX2ZyZWUpOyB9IH0NCj4gKw0KPiArIGxwLT5t YnVmX291dFtwb3J0XS5uX21idWZzID0gMDsNCj4gKyBscC0+bWJ1Zl9vdXRfZmx1c2hbcG9ydF0g PSAxOw0KPiArIH0NCj4gK30NCj4gKw0KPiArc3RhdGljIHZvaWQNCj4gK2FwcF9sY29yZV9tYWlu X2xvb3Bfd29ya2VyKHZvaWQpIHsNCj4gKyB1aW50MzJfdCBsY29yZSA9IHJ0ZV9sY29yZV9pZCgp Ow0KPiArIHN0cnVjdCBhcHBfbGNvcmVfcGFyYW1zX3dvcmtlciAqbHAgPSAmYXBwLmxjb3JlX3Bh cmFtc1tsY29yZV0ud29ya2VyOw0KPiArdWludDY0X3QgaSA9IDA7DQo+ICsNCj4gKyB1aW50MzJf dCBic3pfcmQgPSBhcHAuYnVyc3Rfc2l6ZV93b3JrZXJfcmVhZDsgdWludDMyX3QgYnN6X3dyID0N Cj4gKyBhcHAuYnVyc3Rfc2l6ZV93b3JrZXJfd3JpdGU7DQo+ICsNCj4gKyBmb3IgKCA7IDsgKSB7 DQo+ICsgaWYgKEFQUF9MQ09SRV9XT1JLRVJfRkxVU0ggJiYgKHVubGlrZWx5KGkgPT0NCj4gQVBQ X0xDT1JFX1dPUktFUl9GTFVTSCkpKQ0KPiArIHsgYXBwX2xjb3JlX3dvcmtlcl9mbHVzaChscCk7 IGkgPSAwOyB9DQo+ICsNCj4gKyBhcHBfbGNvcmVfd29ya2VyKGxwLCBic3pfcmQsIGJzel93cik7 DQo+ICsNCj4gKyBpICsrOw0KPiArIH0NCj4gK30NCj4gKw0KPiAraW50DQo+ICthcHBfbGNvcmVf bWFpbl9sb29wKF9fYXR0cmlidXRlX18oKHVudXNlZCkpIHZvaWQgKmFyZykgeyAgc3RydWN0DQo+ ICthcHBfbGNvcmVfcGFyYW1zICpscDsgIHVuc2lnbmVkIGxjb3JlOw0KPiArDQo+ICsgbGNvcmUg PSBydGVfbGNvcmVfaWQoKTsNCj4gKyBscCA9ICZhcHAubGNvcmVfcGFyYW1zW2xjb3JlXTsNCj4g Kw0KPiArIGlmIChscC0+dHlwZSA9PSBlX0FQUF9MQ09SRV9JTykgew0KPiArIHByaW50ZigiTG9n aWNhbCBjb3JlICV1IChJL08pIG1haW4gbG9vcC5cbiIsIGxjb3JlKTsNCj4gKyBhcHBfbGNvcmVf bWFpbl9sb29wX2lvKCk7IH0NCj4gKw0KPiArIGlmIChscC0+dHlwZSA9PSBlX0FQUF9MQ09SRV9X T1JLRVIpIHsNCj4gKyBwcmludGYoIkxvZ2ljYWwgY29yZSAldSAod29ya2VyICV1KSBtYWluIGxv b3AuXG4iLCBsY29yZSwNCj4gKyAodW5zaWduZWQpIGxwLT53b3JrZXIud29ya2VyX2lkKTsNCj4g KyBhcHBfbGNvcmVfbWFpbl9sb29wX3dvcmtlcigpOw0KPiArIH0NCj4gKw0KPiArIHJldHVybiAw Ow0KPiArfQ0KPiBkaWZmIC0tZ2l0IGEvYi9leGFtcGxlcy9sb2FkX2JhbGFuY2VyL3J1bnRpbWUu Yw0KPiBiL2IvZXhhbXBsZXMvbG9hZF9iYWxhbmNlci9ydW50aW1lLmMNCj4gbmV3IGZpbGUgbW9k ZSAxMDA2NDQNCj4gaW5kZXggMDAwMDAwMC4uM2EyZTkwMA0KPiAtLS0gL2Rldi9udWxsDQo+ICsr KyBiL2IvZXhhbXBsZXMvbG9hZF9iYWxhbmNlci9ydW50aW1lLmMNCj4gQEAgLTAsMCArMSw2Njkg QEANCj4gKy8qLQ0KPiArICogICBCU0QgTElDRU5TRQ0KPiArICoNCj4gKyAqICAgQ29weXJpZ2h0 KGMpIDIwMTAtMjAxNCBJbnRlbCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCj4g KyAqICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4NCj4gKyAqDQo+ICsgKiAgIFJlZGlzdHJpYnV0aW9u IGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dA0KPiAr ICogICBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93 aW5nIGNvbmRpdGlvbnMNCj4gKyAqICAgYXJlIG1ldDoNCj4gKyAqDQo+ICsgKiAgICAgKiBSZWRp c3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdo dA0KPiArICogICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZv bGxvd2luZyBkaXNjbGFpbWVyLg0KPiArICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFy eSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQNCj4gKyAqICAgICAgIG5v dGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1l ciBpbg0KPiArICogICAgICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFs cyBwcm92aWRlZCB3aXRoIHRoZQ0KPiArICogICAgICAgZGlzdHJpYnV0aW9uLg0KPiArICogICAg ICogTmVpdGhlciB0aGUgbmFtZSBvZiBJbnRlbCBDb3Jwb3JhdGlvbiBub3IgdGhlIG5hbWVzIG9m IGl0cw0KPiArICogICAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3Ig cHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkDQo+ICsgKiAgICAgICBmcm9tIHRoaXMgc29mdHdhcmUg d2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uDQo+ICsgKg0KPiArICog ICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQN Cj4gQ09OVFJJQlVUT1JTDQo+ICsgKiAgICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJ RUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQNCj4gTk9UDQo+ICsgKiAgIExJTUlURUQgVE8s IFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORA0KPiBGSVRORVNT IEZPUg0KPiArICogICBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8g RVZFTlQgU0hBTEwgVEhFDQo+IENPUFlSSUdIVA0KPiArICogICBPV05FUiBPUiBDT05UUklCVVRP UlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwNCj4gSU5DSURFTlRBTCwNCj4g KyAqICAgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xV RElORywgQlVUDQo+IE5PVA0KPiArICogICBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJT VElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTDQo+IE9GIFVTRSwNCj4gKyAqICAgREFUQSwg T1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRA0KPiBB TkQgT04gQU5ZDQo+ICsgKiAgIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJB Q1QsIFNUUklDVCBMSUFCSUxJVFksIE9SDQo+IFRPUlQNCj4gKyAqICAgKElOQ0xVRElORyBORUdM SUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRg0KPiBUSEUgVVNF DQo+ICsgKiAgIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lC SUxJVFkgT0YgU1VDSA0KPiBEQU1BR0UuDQo+ICsgKi8NCj4gKw0KPiArI2luY2x1ZGUgPHN0ZGlv Lmg+DQo+ICsjaW5jbHVkZSA8c3RkbGliLmg+DQo+ICsjaW5jbHVkZSA8c3RkaW50Lmg+DQo+ICsj aW5jbHVkZSA8aW50dHlwZXMuaD4NCj4gKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4NCj4gKyNpbmNs dWRlIDxzdHJpbmcuaD4NCj4gKyNpbmNsdWRlIDxzeXMvcXVldWUuaD4NCj4gKyNpbmNsdWRlIDxz dGRhcmcuaD4NCj4gKyNpbmNsdWRlIDxlcnJuby5oPg0KPiArI2luY2x1ZGUgPGdldG9wdC5oPg0K PiArDQo+ICsjaW5jbHVkZSA8cnRlX2NvbW1vbi5oPg0KPiArI2luY2x1ZGUgPHJ0ZV9ieXRlb3Jk ZXIuaD4NCj4gKyNpbmNsdWRlIDxydGVfbG9nLmg+DQo+ICsjaW5jbHVkZSA8cnRlX21lbW9yeS5o Pg0KPiArI2luY2x1ZGUgPHJ0ZV9tZW1jcHkuaD4NCj4gKyNpbmNsdWRlIDxydGVfbWVtem9uZS5o Pg0KPiArI2luY2x1ZGUgPHJ0ZV90YWlscS5oPg0KPiArI2luY2x1ZGUgPHJ0ZV9lYWwuaD4NCj4g KyNpbmNsdWRlIDxydGVfcGVyX2xjb3JlLmg+DQo+ICsjaW5jbHVkZSA8cnRlX2xhdW5jaC5oPg0K PiArI2luY2x1ZGUgPHJ0ZV9hdG9taWMuaD4NCj4gKyNpbmNsdWRlIDxydGVfY3ljbGVzLmg+DQo+ ICsjaW5jbHVkZSA8cnRlX3ByZWZldGNoLmg+DQo+ICsjaW5jbHVkZSA8cnRlX2xjb3JlLmg+DQo+ ICsjaW5jbHVkZSA8cnRlX3Blcl9sY29yZS5oPg0KPiArI2luY2x1ZGUgPHJ0ZV9icmFuY2hfcHJl ZGljdGlvbi5oPg0KPiArI2luY2x1ZGUgPHJ0ZV9pbnRlcnJ1cHRzLmg+DQo+ICsjaW5jbHVkZSA8 cnRlX3BjaS5oPg0KPiArI2luY2x1ZGUgPHJ0ZV9yYW5kb20uaD4NCj4gKyNpbmNsdWRlIDxydGVf ZGVidWcuaD4NCj4gKyNpbmNsdWRlIDxydGVfZXRoZXIuaD4NCj4gKyNpbmNsdWRlIDxydGVfZXRo ZGV2Lmg+DQo+ICsjaW5jbHVkZSA8cnRlX3JpbmcuaD4NCj4gKyNpbmNsdWRlIDxydGVfbWVtcG9v bC5oPg0KPiArI2luY2x1ZGUgPHJ0ZV9tYnVmLmg+DQo+ICsjaW5jbHVkZSA8cnRlX2lwLmg+DQo+ ICsjaW5jbHVkZSA8cnRlX3RjcC5oPg0KPiArI2luY2x1ZGUgPHJ0ZV9scG0uaD4NCj4gKw0KPiAr I2luY2x1ZGUgIm1haW4uaCINCj4gKw0KPiArI2lmbmRlZiBBUFBfTENPUkVfSU9fRkxVU0gNCj4g KyNkZWZpbmUgQVBQX0xDT1JFX0lPX0ZMVVNIICAgICAgICAgICAxMDAwMDAwDQo+ICsjZW5kaWYN Cj4gKw0KPiArI2lmbmRlZiBBUFBfTENPUkVfV09SS0VSX0ZMVVNIDQo+ICsjZGVmaW5lIEFQUF9M Q09SRV9XT1JLRVJfRkxVU0ggICAgICAgMTAwMDAwMA0KPiArI2VuZGlmDQo+ICsNCj4gKyNpZm5k ZWYgQVBQX1NUQVRTDQo+ICsjZGVmaW5lIEFQUF9TVEFUUyAgICAgICAgICAgICAgICAgICAgMTAw MDAwMA0KPiArI2VuZGlmDQo+ICsNCj4gKyNkZWZpbmUgQVBQX0lPX1JYX0RST1BfQUxMX1BBQ0tF VFMgICAwDQo+ICsjZGVmaW5lIEFQUF9XT1JLRVJfRFJPUF9BTExfUEFDS0VUUyAgMA0KPiArI2Rl ZmluZSBBUFBfSU9fVFhfRFJPUF9BTExfUEFDS0VUUyAgIDANCj4gKw0KPiArI2lmbmRlZiBBUFBf SU9fUlhfUFJFRkVUQ0hfRU5BQkxFDQo+ICsjZGVmaW5lIEFQUF9JT19SWF9QUkVGRVRDSF9FTkFC TEUgICAgMQ0KPiArI2VuZGlmDQo+ICsNCj4gKyNpZm5kZWYgQVBQX1dPUktFUl9QUkVGRVRDSF9F TkFCTEUNCj4gKyNkZWZpbmUgQVBQX1dPUktFUl9QUkVGRVRDSF9FTkFCTEUgICAxDQo+ICsjZW5k aWYNCj4gKw0KPiArI2lmbmRlZiBBUFBfSU9fVFhfUFJFRkVUQ0hfRU5BQkxFDQo+ICsjZGVmaW5l IEFQUF9JT19UWF9QUkVGRVRDSF9FTkFCTEUgICAgMQ0KPiArI2VuZGlmDQo+ICsNCj4gKyNpZiBB UFBfSU9fUlhfUFJFRkVUQ0hfRU5BQkxFDQo+ICsjZGVmaW5lIEFQUF9JT19SWF9QUkVGRVRDSDAo cCkgICAgICAgcnRlX3ByZWZldGNoMChwKQ0KPiArI2RlZmluZSBBUFBfSU9fUlhfUFJFRkVUQ0gx KHApICAgICAgIHJ0ZV9wcmVmZXRjaDEocCkNCj4gKyNlbHNlDQo+ICsjZGVmaW5lIEFQUF9JT19S WF9QUkVGRVRDSDAocCkNCj4gKyNkZWZpbmUgQVBQX0lPX1JYX1BSRUZFVENIMShwKQ0KPiArI2Vu ZGlmDQo+ICsNCj4gKyNpZiBBUFBfV09SS0VSX1BSRUZFVENIX0VOQUJMRQ0KPiArI2RlZmluZSBB UFBfV09SS0VSX1BSRUZFVENIMChwKSAgICAgIHJ0ZV9wcmVmZXRjaDAocCkNCj4gKyNkZWZpbmUg QVBQX1dPUktFUl9QUkVGRVRDSDEocCkgICAgICBydGVfcHJlZmV0Y2gxKHApDQo+ICsjZWxzZQ0K PiArI2RlZmluZSBBUFBfV09SS0VSX1BSRUZFVENIMChwKQ0KPiArI2RlZmluZSBBUFBfV09SS0VS X1BSRUZFVENIMShwKQ0KPiArI2VuZGlmDQo+ICsNCj4gKyNpZiBBUFBfSU9fVFhfUFJFRkVUQ0hf RU5BQkxFDQo+ICsjZGVmaW5lIEFQUF9JT19UWF9QUkVGRVRDSDAocCkgICAgICAgcnRlX3ByZWZl dGNoMChwKQ0KPiArI2RlZmluZSBBUFBfSU9fVFhfUFJFRkVUQ0gxKHApICAgICAgIHJ0ZV9wcmVm ZXRjaDEocCkNCj4gKyNlbHNlDQo+ICsjZGVmaW5lIEFQUF9JT19UWF9QUkVGRVRDSDAocCkNCj4g KyNkZWZpbmUgQVBQX0lPX1RYX1BSRUZFVENIMShwKQ0KPiArI2VuZGlmDQo+ICsNCj4gK3N0YXRp YyBpbmxpbmUgdm9pZA0KPiArYXBwX2xjb3JlX2lvX3J4X2J1ZmZlcl90b19zZW5kICgNCj4gKyBz dHJ1Y3QgYXBwX2xjb3JlX3BhcmFtc19pbyAqbHAsDQo+ICsgdWludDMyX3Qgd29ya2VyLA0KPiAr IHN0cnVjdCBydGVfbWJ1ZiAqbWJ1ZiwNCj4gKyB1aW50MzJfdCBic3opDQo+ICt7DQo+ICsgdWlu dDMyX3QgcG9zOw0KPiArIGludCByZXQ7DQo+ICsNCj4gKyBwb3MgPSBscC0+cngubWJ1Zl9vdXRb d29ya2VyXS5uX21idWZzOw0KPiArIGxwLT5yeC5tYnVmX291dFt3b3JrZXJdLmFycmF5W3BvcyAr K10gPSBtYnVmOw0KPiArIGlmIChsaWtlbHkocG9zIDwgYnN6KSkgew0KPiArIGxwLT5yeC5tYnVm X291dFt3b3JrZXJdLm5fbWJ1ZnMgPSBwb3M7DQo+ICsgcmV0dXJuOw0KPiArIH0NCj4gKw0KPiAr IHJldCA9IHJ0ZV9yaW5nX3NwX2VucXVldWVfYnVsaygNCj4gKyBscC0+cngucmluZ3Nbd29ya2Vy XSwNCj4gKyAodm9pZCAqKikgbHAtPnJ4Lm1idWZfb3V0W3dvcmtlcl0uYXJyYXksIGJzeik7DQo+ ICsNCj4gKyBpZiAodW5saWtlbHkocmV0ID09IC1FTk9CVUZTKSkgew0KPiArIHVpbnQzMl90IGs7 DQo+ICsgZm9yIChrID0gMDsgayA8IGJzejsgayArKykgew0KPiArIHN0cnVjdCBydGVfbWJ1ZiAq bSA9IGxwLT5yeC5tYnVmX291dFt3b3JrZXJdLmFycmF5W2tdOw0KPiArIHJ0ZV9wa3RtYnVmX2Zy ZWUobSk7IH0gfQ0KPiArDQo+ICsgbHAtPnJ4Lm1idWZfb3V0W3dvcmtlcl0ubl9tYnVmcyA9IDA7 DQo+ICsgbHAtPnJ4Lm1idWZfb3V0X2ZsdXNoW3dvcmtlcl0gPSAwOw0KPiArDQo+ICsjaWYgQVBQ X1NUQVRTDQo+ICsgbHAtPnJ4LnJpbmdzX2l0ZXJzW3dvcmtlcl0gKys7DQo+ICsgaWYgKGxpa2Vs eShyZXQgPT0gMCkpIHsNCj4gKyBscC0+cngucmluZ3NfY291bnRbd29ya2VyXSArKzsNCj4gKyB9 DQo+ICsgaWYgKHVubGlrZWx5KGxwLT5yeC5yaW5nc19pdGVyc1t3b3JrZXJdID09IEFQUF9TVEFU UykpIHsgdW5zaWduZWQNCj4gKyBsY29yZSA9IHJ0ZV9sY29yZV9pZCgpOw0KPiArDQo+ICsgcHJp bnRmKCJcdEkvTyBSWCAldSBvdXQgKHdvcmtlciAldSk6IGVucSBzdWNjZXNzIHJhdGUgPSAlLjJm XG4iLA0KPiArIGxjb3JlLCAodW5zaWduZWQpd29ya2VyLA0KPiArICgoZG91YmxlKSBscC0+cngu cmluZ3NfY291bnRbd29ya2VyXSkgLyAoKGRvdWJsZSkNCj4gKyBscC0+cngucmluZ3NfaXRlcnNb d29ya2VyXSkpOw0KPiArIGxwLT5yeC5yaW5nc19pdGVyc1t3b3JrZXJdID0gMDsNCj4gKyBscC0+ cngucmluZ3NfY291bnRbd29ya2VyXSA9IDA7DQo+ICsgfQ0KPiArI2VuZGlmDQo+ICt9DQo+ICsN Cj4gK3N0YXRpYyBpbmxpbmUgdm9pZA0KPiArYXBwX2xjb3JlX2lvX3J4KA0KPiArIHN0cnVjdCBh cHBfbGNvcmVfcGFyYW1zX2lvICpscCwNCj4gKyB1aW50MzJfdCBuX3dvcmtlcnMsDQo+ICsgdWlu dDMyX3QgYnN6X3JkLA0KPiArIHVpbnQzMl90IGJzel93ciwNCj4gKyB1aW50OF90IHBvc19sYikN Cj4gK3sNCj4gKyBzdHJ1Y3QgcnRlX21idWYgKm1idWZfMV8wLCAqbWJ1Zl8xXzEsICptYnVmXzJf MCwgKm1idWZfMl8xOyAgdWludDhfdA0KPiArKmRhdGFfMV8wLCAqZGF0YV8xXzEgPSBOVUxMOyAg dWludDMyX3QgaTsNCj4gKw0KPiArIGZvciAoaSA9IDA7IGkgPCBscC0+cngubl9uaWNfcXVldWVz OyBpICsrKSB7IHVpbnQ4X3QgcG9ydCA9DQo+ICsgbHAtPnJ4Lm5pY19xdWV1ZXNbaV0ucG9ydDsg dWludDhfdCBxdWV1ZSA9IGxwLT5yeC5uaWNfcXVldWVzW2ldLnF1ZXVlOw0KPiArIHVpbnQzMl90 IG5fbWJ1ZnMsIGo7DQo+ICsNCj4gKyBuX21idWZzID0gcnRlX2V0aF9yeF9idXJzdCgNCj4gKyBw b3J0LA0KPiArIHF1ZXVlLA0KPiArIGxwLT5yeC5tYnVmX2luLmFycmF5LA0KPiArICh1aW50MTZf dCkgYnN6X3JkKTsNCj4gKw0KPiArIGlmICh1bmxpa2VseShuX21idWZzID09IDApKSB7DQo+ICsg Y29udGludWU7DQo+ICsgfQ0KPiArDQo+ICsjaWYgQVBQX1NUQVRTDQo+ICsgbHAtPnJ4Lm5pY19x dWV1ZXNfaXRlcnNbaV0gKys7DQo+ICsgbHAtPnJ4Lm5pY19xdWV1ZXNfY291bnRbaV0gKz0gbl9t YnVmczsNCj4gKyBpZiAodW5saWtlbHkobHAtPnJ4Lm5pY19xdWV1ZXNfaXRlcnNbaV0gPT0gQVBQ X1NUQVRTKSkgeyBzdHJ1Y3QNCj4gKyBydGVfZXRoX3N0YXRzIHN0YXRzOyB1bnNpZ25lZCBsY29y ZSA9IHJ0ZV9sY29yZV9pZCgpOw0KPiArDQo+ICsgcnRlX2V0aF9zdGF0c19nZXQocG9ydCwgJnN0 YXRzKTsNCj4gKw0KPiArIHByaW50ZigiSS9PIFJYICV1IGluIChOSUMgcG9ydCAldSk6IE5JQyBk cm9wIHJhdGlvID0gJS4yZiBhdmcgYnVyc3QNCj4gKyBzaXplID0gJS4yZlxuIiwgbGNvcmUsDQo+ ICsgKHVuc2lnbmVkKSBwb3J0LA0KPiArIChkb3VibGUpIHN0YXRzLmltaXNzZWQgLyAoZG91Ymxl KSAoc3RhdHMuaW1pc3NlZCArIHN0YXRzLmlwYWNrZXRzKSwNCj4gKyAoKGRvdWJsZSkgbHAtPnJ4 Lm5pY19xdWV1ZXNfY291bnRbaV0pIC8gKChkb3VibGUpDQo+ICsgbHAtPnJ4Lm5pY19xdWV1ZXNf aXRlcnNbaV0pKTsNCj4gKyBscC0+cngubmljX3F1ZXVlc19pdGVyc1tpXSA9IDA7DQo+ICsgbHAt PnJ4Lm5pY19xdWV1ZXNfY291bnRbaV0gPSAwOw0KPiArIH0NCj4gKyNlbmRpZg0KPiArDQo+ICsj aWYgQVBQX0lPX1JYX0RST1BfQUxMX1BBQ0tFVFMNCj4gKyBmb3IgKGogPSAwOyBqIDwgbl9tYnVm czsgaiArKykgew0KPiArIHN0cnVjdCBydGVfbWJ1ZiAqcGt0ID0gbHAtPnJ4Lm1idWZfaW4uYXJy YXlbal07DQo+ICtydGVfcGt0bWJ1Zl9mcmVlKHBrdCk7ICB9DQo+ICsNCj4gKyBjb250aW51ZTsN Cj4gKyNlbmRpZg0KPiArDQo+ICsgbWJ1Zl8xXzAgPSBscC0+cngubWJ1Zl9pbi5hcnJheVswXTsN Cj4gKyBtYnVmXzFfMSA9IGxwLT5yeC5tYnVmX2luLmFycmF5WzFdOw0KPiArIGRhdGFfMV8wID0g cnRlX3BrdG1idWZfbXRvZChtYnVmXzFfMCwgdWludDhfdCAqKTsgaWYgKGxpa2VseShuX21idWZz ID4NCj4gKyAxKSkgew0KPiArIGRhdGFfMV8xID0gcnRlX3BrdG1idWZfbXRvZChtYnVmXzFfMSwg dWludDhfdCAqKTsgfQ0KPiArDQo+ICsgbWJ1Zl8yXzAgPSBscC0+cngubWJ1Zl9pbi5hcnJheVsy XTsNCj4gKyBtYnVmXzJfMSA9IGxwLT5yeC5tYnVmX2luLmFycmF5WzNdOw0KPiArIEFQUF9JT19S WF9QUkVGRVRDSDAobWJ1Zl8yXzApOw0KPiArIEFQUF9JT19SWF9QUkVGRVRDSDAobWJ1Zl8yXzEp Ow0KPiArDQo+ICsgZm9yIChqID0gMDsgaiArIDMgPCBuX21idWZzOyBqICs9IDIpIHsgc3RydWN0 IHJ0ZV9tYnVmICptYnVmXzBfMCwNCj4gKyAqbWJ1Zl8wXzE7IHVpbnQ4X3QgKmRhdGFfMF8wLCAq ZGF0YV8wXzE7IHVpbnQzMl90IHdvcmtlcl8wLCB3b3JrZXJfMTsNCj4gKw0KPiArIG1idWZfMF8w ID0gbWJ1Zl8xXzA7DQo+ICsgbWJ1Zl8wXzEgPSBtYnVmXzFfMTsNCj4gKyBkYXRhXzBfMCA9IGRh dGFfMV8wOw0KPiArIGRhdGFfMF8xID0gZGF0YV8xXzE7DQo+ICsNCj4gKyBtYnVmXzFfMCA9IG1i dWZfMl8wOw0KPiArIG1idWZfMV8xID0gbWJ1Zl8yXzE7DQo+ICsgZGF0YV8xXzAgPSBydGVfcGt0 bWJ1Zl9tdG9kKG1idWZfMl8wLCB1aW50OF90ICopOw0KPiArIGRhdGFfMV8xID0gcnRlX3BrdG1i dWZfbXRvZChtYnVmXzJfMSwgdWludDhfdCAqKTsNCj4gKyBBUFBfSU9fUlhfUFJFRkVUQ0gwKGRh dGFfMV8wKTsgQVBQX0lPX1JYX1BSRUZFVENIMChkYXRhXzFfMSk7DQo+ICsNCj4gKyBtYnVmXzJf MCA9IGxwLT5yeC5tYnVmX2luLmFycmF5W2orNF07DQo+ICsgbWJ1Zl8yXzEgPSBscC0+cngubWJ1 Zl9pbi5hcnJheVtqKzVdOw0KPiArIEFQUF9JT19SWF9QUkVGRVRDSDAobWJ1Zl8yXzApOw0KPiAr IEFQUF9JT19SWF9QUkVGRVRDSDAobWJ1Zl8yXzEpOw0KPiArDQo+ICsgd29ya2VyXzAgPSBkYXRh XzBfMFtwb3NfbGJdICYgKG5fd29ya2VycyAtIDEpOw0KPiArIHdvcmtlcl8xID0gZGF0YV8wXzFb cG9zX2xiXSAmIChuX3dvcmtlcnMgLSAxKTsNCj4gKw0KPiArIGFwcF9sY29yZV9pb19yeF9idWZm ZXJfdG9fc2VuZChscCwgd29ya2VyXzAsIG1idWZfMF8wLCBic3pfd3IpOw0KPiArIGFwcF9sY29y ZV9pb19yeF9idWZmZXJfdG9fc2VuZChscCwgd29ya2VyXzEsIG1idWZfMF8xLCBic3pfd3IpOyB9 DQo+ICsNCj4gKyAvKiBIYW5kbGUgdGhlIGxhc3QgMSwgMiAod2hlbiBuX21idWZzIGlzIGV2ZW4p IG9yIDMgKHdoZW4gbl9tYnVmcyBpcw0KPiArIG9kZCkgcGFja2V0cyAgKi8gZm9yICggOyBqIDwg bl9tYnVmczsgaiArPSAxKSB7IHN0cnVjdCBydGVfbWJ1ZiAqbWJ1ZjsNCj4gKyB1aW50OF90ICpk YXRhOyB1aW50MzJfdCB3b3JrZXI7DQo+ICsNCj4gKyBtYnVmID0gbWJ1Zl8xXzA7DQo+ICsgbWJ1 Zl8xXzAgPSBtYnVmXzFfMTsNCj4gKyBtYnVmXzFfMSA9IG1idWZfMl8wOw0KPiArIG1idWZfMl8w ID0gbWJ1Zl8yXzE7DQo+ICsNCj4gKyBkYXRhID0gcnRlX3BrdG1idWZfbXRvZChtYnVmLCB1aW50 OF90ICopOw0KPiArDQo+ICsgQVBQX0lPX1JYX1BSRUZFVENIMChtYnVmXzFfMCk7DQo+ICsNCj4g KyB3b3JrZXIgPSBkYXRhW3Bvc19sYl0gJiAobl93b3JrZXJzIC0gMSk7DQo+ICsNCj4gKyBhcHBf bGNvcmVfaW9fcnhfYnVmZmVyX3RvX3NlbmQobHAsIHdvcmtlciwgbWJ1ZiwgYnN6X3dyKTsgIH0g IH0gfQ0KPiArDQo+ICtzdGF0aWMgaW5saW5lIHZvaWQNCj4gK2FwcF9sY29yZV9pb19yeF9mbHVz aChzdHJ1Y3QgYXBwX2xjb3JlX3BhcmFtc19pbyAqbHAsIHVpbnQzMl90DQo+ICtuX3dvcmtlcnMp IHsgIHVpbnQzMl90IHdvcmtlcjsNCj4gKw0KPiArIGZvciAod29ya2VyID0gMDsgd29ya2VyIDwg bl93b3JrZXJzOyB3b3JrZXIgKyspIHsgaW50IHJldDsNCj4gKw0KPiArIGlmIChsaWtlbHkoKGxw LT5yeC5tYnVmX291dF9mbHVzaFt3b3JrZXJdID09IDApIHx8DQo+ICsgICAgICAgICAgICAobHAt PnJ4Lm1idWZfb3V0W3dvcmtlcl0ubl9tYnVmcyA9PSAwKSkpIHsNCj4gKyBscC0+cngubWJ1Zl9v dXRfZmx1c2hbd29ya2VyXSA9IDE7DQo+ICsgY29udGludWU7DQo+ICsgfQ0KPiArDQo+ICsgcmV0 ID0gcnRlX3Jpbmdfc3BfZW5xdWV1ZV9idWxrKA0KPiArIGxwLT5yeC5yaW5nc1t3b3JrZXJdLA0K PiArICh2b2lkICoqKSBscC0+cngubWJ1Zl9vdXRbd29ya2VyXS5hcnJheSwNCj4gKyBscC0+cngu bWJ1Zl9vdXRbd29ya2VyXS5uX21idWZzKTsNCj4gKw0KPiArIGlmICh1bmxpa2VseShyZXQgPCAw KSkgew0KPiArIHVpbnQzMl90IGs7DQo+ICsgZm9yIChrID0gMDsgayA8IGxwLT5yeC5tYnVmX291 dFt3b3JrZXJdLm5fbWJ1ZnM7IGsgKyspIHsgc3RydWN0DQo+ICsgcnRlX21idWYgKnBrdF90b19m cmVlID0gbHAtPnJ4Lm1idWZfb3V0W3dvcmtlcl0uYXJyYXlba107DQo+ICsgcnRlX3BrdG1idWZf ZnJlZShwa3RfdG9fZnJlZSk7IH0gfQ0KPiArDQo+ICsgbHAtPnJ4Lm1idWZfb3V0W3dvcmtlcl0u bl9tYnVmcyA9IDA7DQo+ICsgbHAtPnJ4Lm1idWZfb3V0X2ZsdXNoW3dvcmtlcl0gPSAxOw0KPiAr IH0NCj4gK30NCj4gKw0KPiArc3RhdGljIGlubGluZSB2b2lkDQo+ICthcHBfbGNvcmVfaW9fdHgo DQo+ICsgc3RydWN0IGFwcF9sY29yZV9wYXJhbXNfaW8gKmxwLA0KPiArIHVpbnQzMl90IG5fd29y a2VycywNCj4gKyB1aW50MzJfdCBic3pfcmQsDQo+ICsgdWludDMyX3QgYnN6X3dyKQ0KPiArew0K PiArIHVpbnQzMl90IHdvcmtlcjsNCj4gKw0KPiArIGZvciAod29ya2VyID0gMDsgd29ya2VyIDwg bl93b3JrZXJzOyB3b3JrZXIgKyspIHsgdWludDMyX3QgaTsNCj4gKw0KPiArIGZvciAoaSA9IDA7 IGkgPCBscC0+dHgubl9uaWNfcG9ydHM7IGkgKyspIHsgdWludDhfdCBwb3J0ID0NCj4gKyBscC0+ dHgubmljX3BvcnRzW2ldOyBzdHJ1Y3QgcnRlX3JpbmcgKnJpbmcgPQ0KPiArIGxwLT50eC5yaW5n c1twb3J0XVt3b3JrZXJdOyB1aW50MzJfdCBuX21idWZzLCBuX3BrdHM7IGludCByZXQ7DQo+ICsN Cj4gKyBuX21idWZzID0gbHAtPnR4Lm1idWZfb3V0W3BvcnRdLm5fbWJ1ZnM7IHJldCA9DQo+ICsg cnRlX3Jpbmdfc2NfZGVxdWV1ZV9idWxrKCByaW5nLCAodm9pZCAqKikNCj4gKyAmbHAtPnR4Lm1i dWZfb3V0W3BvcnRdLmFycmF5W25fbWJ1ZnNdLA0KPiArIGJzel9yZCk7DQo+ICsNCj4gKyBpZiAo dW5saWtlbHkocmV0ID09IC1FTk9FTlQpKSB7DQo+ICsgY29udGludWU7DQo+ICsgfQ0KPiArDQo+ ICsgbl9tYnVmcyArPSBic3pfcmQ7DQo+ICsNCj4gKyNpZiBBUFBfSU9fVFhfRFJPUF9BTExfUEFD S0VUUw0KPiArIHsNCj4gKyB1aW50MzJfdCBqOw0KPiArIEFQUF9JT19UWF9QUkVGRVRDSDAobHAt PnR4Lm1idWZfb3V0W3BvcnRdLmFycmF5WzBdKTsNCj4gKyBBUFBfSU9fVFhfUFJFRkVUQ0gwKGxw LT50eC5tYnVmX291dFtwb3J0XS5hcnJheVsxXSk7DQo+ICsNCj4gKyBmb3IgKGogPSAwOyBqIDwg bl9tYnVmczsgaiArKykgew0KPiArIGlmIChsaWtlbHkoaiA8IG5fbWJ1ZnMgLSAyKSkgew0KPiAr IEFQUF9JT19UWF9QUkVGRVRDSDAobHAtPnR4Lm1idWZfb3V0W3BvcnRdLmFycmF5W2ogKyAyXSk7 IH0NCj4gKw0KPiArIHJ0ZV9wa3RtYnVmX2ZyZWUobHAtPnR4Lm1idWZfb3V0W3BvcnRdLmFycmF5 W2pdKTsNCj4gKyB9DQo+ICsNCj4gKyBscC0+dHgubWJ1Zl9vdXRbcG9ydF0ubl9tYnVmcyA9IDA7 DQo+ICsNCj4gKyBjb250aW51ZTsNCj4gKyB9DQo+ICsjZW5kaWYNCj4gKw0KPiArIGlmICh1bmxp a2VseShuX21idWZzIDwgYnN6X3dyKSkgew0KPiArIGxwLT50eC5tYnVmX291dFtwb3J0XS5uX21i dWZzID0gbl9tYnVmczsNCj4gKyBjb250aW51ZTsNCj4gKyB9DQo+ICsNCj4gKyBuX3BrdHMgPSBy dGVfZXRoX3R4X2J1cnN0KA0KPiArIHBvcnQsDQo+ICsgMCwNCj4gKyBscC0+dHgubWJ1Zl9vdXRb cG9ydF0uYXJyYXksDQo+ICsgKHVpbnQxNl90KSBuX21idWZzKTsNCj4gKw0KPiArI2lmIEFQUF9T VEFUUw0KPiArIGxwLT50eC5uaWNfcG9ydHNfaXRlcnNbcG9ydF0gKys7DQo+ICsgbHAtPnR4Lm5p Y19wb3J0c19jb3VudFtwb3J0XSArPSBuX3BrdHM7DQo+ICsgaWYgKHVubGlrZWx5KGxwLT50eC5u aWNfcG9ydHNfaXRlcnNbcG9ydF0gPT0gQVBQX1NUQVRTKSkgeyB1bnNpZ25lZA0KPiArIGxjb3Jl ID0gcnRlX2xjb3JlX2lkKCk7DQo+ICsNCj4gKyBwcmludGYoIlx0XHRcdEkvTyBUWCAldSBvdXQg KHBvcnQgJXUpOiBhdmcgYnVyc3Qgc2l6ZSA9ICUuMmZcbiIsDQo+ICsgbGNvcmUsDQo+ICsgKHVu c2lnbmVkKSBwb3J0LA0KPiArICgoZG91YmxlKSBscC0+dHgubmljX3BvcnRzX2NvdW50W3BvcnRd KSAvICgoZG91YmxlKQ0KPiArIGxwLT50eC5uaWNfcG9ydHNfaXRlcnNbcG9ydF0pKTsNCj4gKyBs cC0+dHgubmljX3BvcnRzX2l0ZXJzW3BvcnRdID0gMDsNCj4gKyBscC0+dHgubmljX3BvcnRzX2Nv dW50W3BvcnRdID0gMDsNCj4gKyB9DQo+ICsjZW5kaWYNCj4gKw0KPiArIGlmICh1bmxpa2VseShu X3BrdHMgPCBuX21idWZzKSkgew0KPiArIHVpbnQzMl90IGs7DQo+ICsgZm9yIChrID0gbl9wa3Rz OyBrIDwgbl9tYnVmczsgayArKykgew0KPiArIHN0cnVjdCBydGVfbWJ1ZiAqcGt0X3RvX2ZyZWUg PSBscC0+dHgubWJ1Zl9vdXRbcG9ydF0uYXJyYXlba107DQo+ICsgcnRlX3BrdG1idWZfZnJlZShw a3RfdG9fZnJlZSk7IH0gfQ0KPiArIGxwLT50eC5tYnVmX291dFtwb3J0XS5uX21idWZzID0gMDsN Cj4gKyBscC0+dHgubWJ1Zl9vdXRfZmx1c2hbcG9ydF0gPSAwOw0KPiArIH0NCj4gKyB9DQo+ICt9 DQo+ICsNCj4gK3N0YXRpYyBpbmxpbmUgdm9pZA0KPiArYXBwX2xjb3JlX2lvX3R4X2ZsdXNoKHN0 cnVjdCBhcHBfbGNvcmVfcGFyYW1zX2lvICpscCkgeyAgdWludDhfdCBpOw0KPiArdWludDhfdCBw b3J0Ow0KPiArDQo+ICsgcG9ydCA9IGxwLT50eC5uaWNfcG9ydHNbMF07DQo+ICsgZm9yIChpID0g MDsgaSA8IGxwLT50eC5uX25pY19wb3J0czsgaSArKykgeyB1aW50MzJfdCBuX3BrdHM7DQo+ICsN Cj4gKyBpZiAobGlrZWx5KChscC0+dHgubWJ1Zl9vdXRfZmx1c2hbcG9ydF0gPT0gMCkgfHwNCj4g KyAgICAgICAgICAgIChscC0+dHgubWJ1Zl9vdXRbcG9ydF0ubl9tYnVmcyA9PSAwKSkpIHsNCj4g KyBscC0+dHgubWJ1Zl9vdXRfZmx1c2hbcG9ydF0gPSAxOw0KPiArIGNvbnRpbnVlOw0KPiArIH0N Cj4gKw0KPiArIG5fcGt0cyA9IHJ0ZV9ldGhfdHhfYnVyc3QoDQo+ICsgcG9ydCwNCj4gKyAwLA0K PiArIGxwLT50eC5tYnVmX291dFtwb3J0XS5hcnJheSwNCj4gKyAodWludDE2X3QpIGxwLT50eC5t YnVmX291dFtwb3J0XS5uX21idWZzKTsNCj4gKw0KPiArIGlmICh1bmxpa2VseShuX3BrdHMgPCBs cC0+dHgubWJ1Zl9vdXRbcG9ydF0ubl9tYnVmcykpIHsgdWludDMyX3QgazsNCj4gKyBmb3IgKGsg PSBuX3BrdHM7IGsgPCBscC0+dHgubWJ1Zl9vdXRbcG9ydF0ubl9tYnVmczsgayArKykgeyBzdHJ1 Y3QNCj4gKyBydGVfbWJ1ZiAqcGt0X3RvX2ZyZWUgPSBscC0+dHgubWJ1Zl9vdXRbcG9ydF0uYXJy YXlba107DQo+ICsgcnRlX3BrdG1idWZfZnJlZShwa3RfdG9fZnJlZSk7IH0gfQ0KPiArDQo+ICsg bHAtPnR4Lm1idWZfb3V0W3BvcnRdLm5fbWJ1ZnMgPSAwOw0KPiArIGxwLT50eC5tYnVmX291dF9m bHVzaFtwb3J0XSA9IDE7DQo+ICsgfQ0KPiArfQ0KPiArDQo+ICtzdGF0aWMgdm9pZA0KPiArYXBw X2xjb3JlX21haW5fbG9vcF9pbyh2b2lkKQ0KPiArew0KPiArIHVpbnQzMl90IGxjb3JlID0gcnRl X2xjb3JlX2lkKCk7DQo+ICsgc3RydWN0IGFwcF9sY29yZV9wYXJhbXNfaW8gKmxwID0gJmFwcC5s Y29yZV9wYXJhbXNbbGNvcmVdLmlvOw0KPiArdWludDMyX3Qgbl93b3JrZXJzID0gYXBwX2dldF9s Y29yZXNfd29ya2VyKCk7ICB1aW50NjRfdCBpID0gMDsNCj4gKw0KPiArIHVpbnQzMl90IGJzel9y eF9yZCA9IGFwcC5idXJzdF9zaXplX2lvX3J4X3JlYWQ7IHVpbnQzMl90IGJzel9yeF93ciA9DQo+ ICsgYXBwLmJ1cnN0X3NpemVfaW9fcnhfd3JpdGU7IHVpbnQzMl90IGJzel90eF9yZCA9DQo+ICsg YXBwLmJ1cnN0X3NpemVfaW9fdHhfcmVhZDsgdWludDMyX3QgYnN6X3R4X3dyID0NCj4gKyBhcHAu YnVyc3Rfc2l6ZV9pb190eF93cml0ZTsNCj4gKw0KPiArIHVpbnQ4X3QgcG9zX2xiID0gYXBwLnBv c19sYjsNCj4gKw0KPiArIGZvciAoIDsgOyApIHsNCj4gKyBpZiAoQVBQX0xDT1JFX0lPX0ZMVVNI ICYmICh1bmxpa2VseShpID09IEFQUF9MQ09SRV9JT19GTFVTSCkpKSB7IGlmDQo+ICsgKGxpa2Vs eShscC0+cngubl9uaWNfcXVldWVzID4gMCkpIHsgYXBwX2xjb3JlX2lvX3J4X2ZsdXNoKGxwLA0K PiArIG5fd29ya2Vycyk7IH0NCj4gKw0KPiArIGlmIChsaWtlbHkobHAtPnR4Lm5fbmljX3BvcnRz ID4gMCkpIHsNCj4gKyBhcHBfbGNvcmVfaW9fdHhfZmx1c2gobHApOw0KPiArIH0NCj4gKw0KPiAr IGkgPSAwOw0KPiArIH0NCj4gKw0KPiArIGlmIChsaWtlbHkobHAtPnJ4Lm5fbmljX3F1ZXVlcyA+ IDApKSB7IGFwcF9sY29yZV9pb19yeChscCwgbl93b3JrZXJzLA0KPiArIGJzel9yeF9yZCwgYnN6 X3J4X3dyLCBwb3NfbGIpOyB9DQo+ICsNCj4gKyBpZiAobGlrZWx5KGxwLT50eC5uX25pY19wb3J0 cyA+IDApKSB7DQo+ICsgYXBwX2xjb3JlX2lvX3R4KGxwLCBuX3dvcmtlcnMsIGJzel90eF9yZCwg YnN6X3R4X3dyKTsgfQ0KPiArDQo+ICsgaSArKzsNCj4gKyB9DQo+ICt9DQo+ICsNCj4gK3N0YXRp YyBpbmxpbmUgdm9pZA0KPiArYXBwX2xjb3JlX3dvcmtlcigNCj4gKyBzdHJ1Y3QgYXBwX2xjb3Jl X3BhcmFtc193b3JrZXIgKmxwLA0KPiArIHVpbnQzMl90IGJzel9yZCwNCj4gKyB1aW50MzJfdCBi c3pfd3IpDQo+ICt7DQo+ICsgdWludDMyX3QgaTsNCj4gKw0KPiArIGZvciAoaSA9IDA7IGkgPCBs cC0+bl9yaW5nc19pbjsgaSArKykgeyBzdHJ1Y3QgcnRlX3JpbmcgKnJpbmdfaW4gPQ0KPiArIGxw LT5yaW5nc19pbltpXTsgdWludDMyX3QgajsgaW50IHJldDsNCj4gKw0KPiArIHJldCA9IHJ0ZV9y aW5nX3NjX2RlcXVldWVfYnVsaygNCj4gKyByaW5nX2luLA0KPiArICh2b2lkICoqKSBscC0+bWJ1 Zl9pbi5hcnJheSwNCj4gKyBic3pfcmQpOw0KPiArDQo+ICsgaWYgKHVubGlrZWx5KHJldCA9PSAt RU5PRU5UKSkgew0KPiArIGNvbnRpbnVlOw0KPiArIH0NCj4gKw0KPiArI2lmIEFQUF9XT1JLRVJf RFJPUF9BTExfUEFDS0VUUw0KPiArIGZvciAoaiA9IDA7IGogPCBic3pfcmQ7IGogKyspIHsNCj4g KyBzdHJ1Y3QgcnRlX21idWYgKnBrdCA9IGxwLT5tYnVmX2luLmFycmF5W2pdOyAgcnRlX3BrdG1i dWZfZnJlZShwa3QpOw0KPiArfQ0KPiArDQo+ICsgY29udGludWU7DQo+ICsjZW5kaWYNCj4gKw0K PiArIEFQUF9XT1JLRVJfUFJFRkVUQ0gxKHJ0ZV9wa3RtYnVmX210b2QobHAtPm1idWZfaW4uYXJy YXlbMF0sDQo+IHVuc2lnbmVkDQo+ICsgY2hhciAqKSk7IEFQUF9XT1JLRVJfUFJFRkVUQ0gwKGxw LT5tYnVmX2luLmFycmF5WzFdKTsNCj4gKw0KPiArIGZvciAoaiA9IDA7IGogPCBic3pfcmQ7IGog KyspIHsNCj4gKyBzdHJ1Y3QgcnRlX21idWYgKnBrdDsNCj4gKyBzdHJ1Y3QgaXB2NF9oZHIgKmlw djRfaGRyOw0KPiArIHVpbnQzMl90IGlwdjRfZHN0LCBwb3M7DQo+ICsgdWludDhfdCBwb3J0Ow0K PiArDQo+ICsgaWYgKGxpa2VseShqIDwgYnN6X3JkIC0gMSkpIHsNCj4gKyBBUFBfV09SS0VSX1BS RUZFVENIMShydGVfcGt0bWJ1Zl9tdG9kKGxwLT5tYnVmX2luLmFycmF5W2orMV0sDQo+IHVuc2ln bmVkDQo+ICsgY2hhciAqKSk7IH0gaWYgKGxpa2VseShqIDwgYnN6X3JkIC0gMikpIHsNCj4gKyBB UFBfV09SS0VSX1BSRUZFVENIMChscC0+bWJ1Zl9pbi5hcnJheVtqKzJdKTsNCj4gKyB9DQo+ICsN Cj4gKyBwa3QgPSBscC0+bWJ1Zl9pbi5hcnJheVtqXTsNCj4gKyBpcHY0X2hkciA9IChzdHJ1Y3Qg aXB2NF9oZHIgKikocnRlX3BrdG1idWZfbXRvZChwa3QsIHVuc2lnbmVkIGNoYXIgKikNCj4gKyAr IHNpemVvZihzdHJ1Y3QgZXRoZXJfaGRyKSk7IGlwdjRfZHN0ID0NCj4gKyBydGVfYmVfdG9fY3B1 XzMyKGlwdjRfaGRyLT5kc3RfYWRkcik7DQo+ICsNCj4gKyBpZiAodW5saWtlbHkocnRlX2xwbV9s b29rdXAobHAtPmxwbV90YWJsZSwgaXB2NF9kc3QsICZwb3J0KSAhPSAwKSkgew0KPiArIHBvcnQg PSBwa3QtPnBrdC5pbl9wb3J0OyB9DQo+ICsNCj4gKyBwb3MgPSBscC0+bWJ1Zl9vdXRbcG9ydF0u bl9tYnVmczsNCj4gKw0KPiArIGxwLT5tYnVmX291dFtwb3J0XS5hcnJheVtwb3MgKytdID0gcGt0 Ow0KPiArIGlmIChsaWtlbHkocG9zIDwgYnN6X3dyKSkgew0KPiArIGxwLT5tYnVmX291dFtwb3J0 XS5uX21idWZzID0gcG9zOw0KPiArIGNvbnRpbnVlOw0KPiArIH0NCj4gKw0KPiArIHJldCA9IHJ0 ZV9yaW5nX3NwX2VucXVldWVfYnVsaygNCj4gKyBscC0+cmluZ3Nfb3V0W3BvcnRdLA0KPiArICh2 b2lkICoqKSBscC0+bWJ1Zl9vdXRbcG9ydF0uYXJyYXksDQo+ICsgYnN6X3dyKTsNCj4gKw0KPiAr I2lmIEFQUF9TVEFUUw0KPiArIGxwLT5yaW5nc19vdXRfaXRlcnNbcG9ydF0gKys7DQo+ICsgaWYg KHJldCA9PSAwKSB7DQo+ICsgbHAtPnJpbmdzX291dF9jb3VudFtwb3J0XSArPSAxOw0KPiArIH0N Cj4gKyBpZiAobHAtPnJpbmdzX291dF9pdGVyc1twb3J0XSA9PSBBUFBfU1RBVFMpeyBwcmludGYo Ilx0XHRXb3JrZXIgJXUgb3V0DQo+ICsgKE5JQyBwb3J0ICV1KTogZW5xIHN1Y2Nlc3MgcmF0ZSA9 ICUuMmZcbiIsDQo+ICsgKHVuc2lnbmVkKSBscC0+d29ya2VyX2lkLA0KPiArICh1bnNpZ25lZCkg cG9ydCwNCj4gKyAoKGRvdWJsZSkgbHAtPnJpbmdzX291dF9jb3VudFtwb3J0XSkgLyAoKGRvdWJs ZSkNCj4gKyBscC0+cmluZ3Nfb3V0X2l0ZXJzW3BvcnRdKSk7DQo+ICsgbHAtPnJpbmdzX291dF9p dGVyc1twb3J0XSA9IDA7DQo+ICsgbHAtPnJpbmdzX291dF9jb3VudFtwb3J0XSA9IDA7DQo+ICsg fQ0KPiArI2VuZGlmDQo+ICsNCj4gKyBpZiAodW5saWtlbHkocmV0ID09IC1FTk9CVUZTKSkgew0K PiArIHVpbnQzMl90IGs7DQo+ICsgZm9yIChrID0gMDsgayA8IGJzel93cjsgayArKykgew0KPiAr IHN0cnVjdCBydGVfbWJ1ZiAqcGt0X3RvX2ZyZWUgPSBscC0+bWJ1Zl9vdXRbcG9ydF0uYXJyYXlb a107DQo+ICsgcnRlX3BrdG1idWZfZnJlZShwa3RfdG9fZnJlZSk7IH0gfQ0KPiArDQo+ICsgbHAt Pm1idWZfb3V0W3BvcnRdLm5fbWJ1ZnMgPSAwOw0KPiArIGxwLT5tYnVmX291dF9mbHVzaFtwb3J0 XSA9IDA7DQo+ICsgfQ0KPiArIH0NCj4gK30NCj4gKw0KPiArc3RhdGljIGlubGluZSB2b2lkDQo+ ICthcHBfbGNvcmVfd29ya2VyX2ZsdXNoKHN0cnVjdCBhcHBfbGNvcmVfcGFyYW1zX3dvcmtlciAq bHApIHsgIHVpbnQzMl90DQo+ICtwb3J0Ow0KPiArDQo+ICsgZm9yIChwb3J0ID0gMDsgcG9ydCA8 IEFQUF9NQVhfTklDX1BPUlRTOyBwb3J0ICsrKSB7IGludCByZXQ7DQo+ICsNCj4gKyBpZiAodW5s aWtlbHkobHAtPnJpbmdzX291dFtwb3J0XSA9PSBOVUxMKSkgeyBjb250aW51ZTsgfQ0KPiArDQo+ ICsgaWYgKGxpa2VseSgobHAtPm1idWZfb3V0X2ZsdXNoW3BvcnRdID09IDApIHx8DQo+ICsgICAg ICAgICAgICAobHAtPm1idWZfb3V0W3BvcnRdLm5fbWJ1ZnMgPT0gMCkpKSB7DQo+ICsgbHAtPm1i dWZfb3V0X2ZsdXNoW3BvcnRdID0gMTsNCj4gKyBjb250aW51ZTsNCj4gKyB9DQo+ICsNCj4gKyBy ZXQgPSBydGVfcmluZ19zcF9lbnF1ZXVlX2J1bGsoDQo+ICsgbHAtPnJpbmdzX291dFtwb3J0XSwN Cj4gKyAodm9pZCAqKikgbHAtPm1idWZfb3V0W3BvcnRdLmFycmF5LA0KPiArIGxwLT5tYnVmX291 dFtwb3J0XS5uX21idWZzKTsNCj4gKw0KPiArIGlmICh1bmxpa2VseShyZXQgPCAwKSkgew0KPiAr IHVpbnQzMl90IGs7DQo+ICsgZm9yIChrID0gMDsgayA8IGxwLT5tYnVmX291dFtwb3J0XS5uX21i dWZzOyBrICsrKSB7IHN0cnVjdCBydGVfbWJ1Zg0KPiArICpwa3RfdG9fZnJlZSA9IGxwLT5tYnVm X291dFtwb3J0XS5hcnJheVtrXTsNCj4gKyBydGVfcGt0bWJ1Zl9mcmVlKHBrdF90b19mcmVlKTsg fSB9DQo+ICsNCj4gKyBscC0+bWJ1Zl9vdXRbcG9ydF0ubl9tYnVmcyA9IDA7DQo+ICsgbHAtPm1i dWZfb3V0X2ZsdXNoW3BvcnRdID0gMTsNCj4gKyB9DQo+ICt9DQo+ICsNCj4gK3N0YXRpYyB2b2lk DQo+ICthcHBfbGNvcmVfbWFpbl9sb29wX3dvcmtlcih2b2lkKSB7DQo+ICsgdWludDMyX3QgbGNv cmUgPSBydGVfbGNvcmVfaWQoKTsNCj4gKyBzdHJ1Y3QgYXBwX2xjb3JlX3BhcmFtc193b3JrZXIg KmxwID0gJmFwcC5sY29yZV9wYXJhbXNbbGNvcmVdLndvcmtlcjsNCj4gK3VpbnQ2NF90IGkgPSAw Ow0KPiArDQo+ICsgdWludDMyX3QgYnN6X3JkID0gYXBwLmJ1cnN0X3NpemVfd29ya2VyX3JlYWQ7 IHVpbnQzMl90IGJzel93ciA9DQo+ICsgYXBwLmJ1cnN0X3NpemVfd29ya2VyX3dyaXRlOw0KPiAr DQo+ICsgZm9yICggOyA7ICkgew0KPiArIGlmIChBUFBfTENPUkVfV09SS0VSX0ZMVVNIICYmICh1 bmxpa2VseShpID09DQo+IEFQUF9MQ09SRV9XT1JLRVJfRkxVU0gpKSkNCj4gKyB7IGFwcF9sY29y ZV93b3JrZXJfZmx1c2gobHApOyBpID0gMDsgfQ0KPiArDQo+ICsgYXBwX2xjb3JlX3dvcmtlcihs cCwgYnN6X3JkLCBic3pfd3IpOw0KPiArDQo+ICsgaSArKzsNCj4gKyB9DQo+ICt9DQo+ICsNCj4g K2ludA0KPiArYXBwX2xjb3JlX21haW5fbG9vcChfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKSB2b2lk ICphcmcpIHsgIHN0cnVjdA0KPiArYXBwX2xjb3JlX3BhcmFtcyAqbHA7ICB1bnNpZ25lZCBsY29y ZTsNCj4gKw0KPiArIGxjb3JlID0gcnRlX2xjb3JlX2lkKCk7DQo+ICsgbHAgPSAmYXBwLmxjb3Jl X3BhcmFtc1tsY29yZV07DQo+ICsNCj4gKyBpZiAobHAtPnR5cGUgPT0gZV9BUFBfTENPUkVfSU8p IHsNCj4gKyBwcmludGYoIkxvZ2ljYWwgY29yZSAldSAoSS9PKSBtYWluIGxvb3AuXG4iLCBsY29y ZSk7DQo+ICsgYXBwX2xjb3JlX21haW5fbG9vcF9pbygpOyB9DQo+ICsNCj4gKyBpZiAobHAtPnR5 cGUgPT0gZV9BUFBfTENPUkVfV09SS0VSKSB7DQo+ICsgcHJpbnRmKCJMb2dpY2FsIGNvcmUgJXUg KHdvcmtlciAldSkgbWFpbiBsb29wLlxuIiwgbGNvcmUsDQo+ICsgKHVuc2lnbmVkKSBscC0+d29y a2VyLndvcmtlcl9pZCk7DQo+ICsgYXBwX2xjb3JlX21haW5fbG9vcF93b3JrZXIoKTsNCj4gKyB9 DQo+ICsNCj4gKyByZXR1cm4gMDsNCj4gK30NCj4gLS0NCj4gMS45LjENCg0K