From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from dpdk.org (dpdk.org [92.243.14.124]) by inbox.dpdk.org (Postfix) with ESMTP id 68361A04FA; Wed, 8 Jan 2020 11:15:41 +0100 (CET) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 2778B1D99E; Wed, 8 Jan 2020 11:15:41 +0100 (CET) Received: from mga11.intel.com (mga11.intel.com [192.55.52.93]) by dpdk.org (Postfix) with ESMTP id 7C7901D99B for ; Wed, 8 Jan 2020 11:15:39 +0100 (CET) X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from orsmga001.jf.intel.com ([10.7.209.18]) by fmsmga102.fm.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 08 Jan 2020 02:15:38 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.69,409,1571727600"; d="scan'208";a="303518745" Received: from fmsmsx108.amr.corp.intel.com ([10.18.124.206]) by orsmga001.jf.intel.com with ESMTP; 08 Jan 2020 02:15:38 -0800 Received: from shsmsx152.ccr.corp.intel.com (10.239.6.52) by FMSMSX108.amr.corp.intel.com (10.18.124.206) with Microsoft SMTP Server (TLS) id 14.3.439.0; Wed, 8 Jan 2020 02:15:37 -0800 Received: from shsmsx101.ccr.corp.intel.com ([169.254.1.30]) by SHSMSX152.ccr.corp.intel.com ([169.254.6.203]) with mapi id 14.03.0439.000; Wed, 8 Jan 2020 18:15:34 +0800 From: "Di, ChenxuX" To: "Ananyev, Konstantin" , "dev@dpdk.org" CC: "Yang, Qiming" Thread-Topic: [dpdk-dev] [PATCH v6 3/4] net/ixgbe: cleanup Tx buffers Thread-Index: AQHVvvUG2XKE65EZ4ECFZ4yLvAYxOqfSHGAAgATnLxCABTo6gIAA/MyA///rM4CAAeIGYP//vGEAgAHQE1A= Date: Wed, 8 Jan 2020 10:15:33 +0000 Message-ID: <3B926E44943CB04AA3A39AC16328CE39B94811@SHSMSX101.ccr.corp.intel.com> References: <20191203055134.72874-1-chenxux.di@intel.com> <20191230093840.17701-1-chenxux.di@intel.com> <20191230093840.17701-4-chenxux.di@intel.com> <3B926E44943CB04AA3A39AC16328CE39B9262D@SHSMSX101.ccr.corp.intel.com> <3B926E44943CB04AA3A39AC16328CE39B93D08@SHSMSX101.ccr.corp.intel.com> <3B926E44943CB04AA3A39AC16328CE39B9440F@SHSMSX101.ccr.corp.intel.com> In-Reply-To: Accept-Language: en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: x-originating-ip: [10.239.127.40] Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 MIME-Version: 1.0 Subject: Re: [dpdk-dev] [PATCH v6 3/4] net/ixgbe: cleanup Tx buffers X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Sender: "dev" SGksIEtvbnN0YW50aW4NCg0KVGhhbmtzIGZvciB5b3VyIHJlYWQuDQoNCmZvciBvdXIgcmVzZWFy Y2gsIHdlIGRvbid0IHRoaW5rIGl0IGlzIGEgZ29vZCBwbGFuIHRoYXQgcmV1c2UgaXhnYmVfeG1p dF9jbGVhbnVwKCkgb3IgaXhnYmVfdHhfZnJlZV9idWZzLg0KZm9sbG93aW5nIHR3byBvcGluaW9u IHdpbGwgc2hvdyB0aGUgcmVhc29uLg0KDQoNCmZpcnN0LCBpdCBkb2Vzbid0IHNvbHZlIHRoZSBp c2l0dWF0aW9ucyB3aGVuIGNudCAlIHJzX3RocmVzaCAhPSAwIGV2ZW4gYnkgdXNpbmcgeW91ciBw bGFuLg0KDQpGb3IgZXhhbXBsZSwgdGhlIHBhcmFtZXRlcnMgb2YgQVBJIHJ0ZV9ldGhfdHhfZG9u ZV9jbGVhbnVwIGZyZWVfY250PTAsIHRoYXQgbWVhbnMgd2Ugd2FudCB0byBmcmVlIGFsbCBwb3Nz aWJsZSBtYnVmcyhvbmUgbWJ1ZiBwZXIgcGFja2V0KS4gd2UgZmluZCBpdCBhZnRlciBjaGVja2lu ZyB0aGF0DQpOby4xOCBtYnVmIHN0YXR1cyBpcyBERCwgYW5kIHRoZSBzdGF0dXMgb2YgbWJ1ZiBh ZnRlciBOby4xOSBpcyBpbiB1c2UuDQoNCklmIHRoZSBwbGFuIGlzIHRoYXQgY2FsbCBpeGdiZV94 bWl0X2NsZWFudXAoKSBjbnQgL3JzX3RocmVzaCArIDEgdGltZXMoIDEgaW4gdGhpcyBleGFtcGxl KS4NCkFmdGVyIGl4Z2JlX3htaXRfY2xlYW51cCgpICB0aGUgdmFsdWUgb2YgbGFzdF9kZXNjX2Ns ZWFuZWQgaXMgbm90IHNhbWUgYXMgdGhlIGFjdHVhbC4gIA0KdGhlIGZ1bmN0aW9uIGl4Z2JlX3ht aXRfcGt0cyB3aWxsIGNhbGwgaXhnYmVfeG1pdF9jbGVhbnVwIGF1dG9tYXRpY2FsbHkgd2hlbiBu Yl90eF9mcmVlPHR4X2ZyZWVfdGhyZXNoLCBtYnVmcyBiZWZvcmUgbGFzdF9kZXNjX2NsZWFuZWQg KE5vLjE5fk5vLjMxIGZvciB0aGlzIGV4YW1wbGUpd2lsbCBub3QgYmUgZnJlZWQNCg0KaG93ZXZl ciwgYWxsIG9mIGFib3ZlIGlzIGZvciBpeGdiZV94bWl0X3BrdHMoKSBhbmQgaXhnYmVfeG1pdF9j bGVhbnVwKCkuIGlmIHRoYXQgZm9yIGl4Z2JlX3htaXRfcGt0c19zaW1wbGUoKSBhbmQgaXhnYmVf dHhfZnJlZV9idWZzKCksaXQgbWF5IGJlIHdvcnNlLg0KYmVjYXVzZSB0aGUgZnJlZSBidWZmIGFj dGlvbiBpcyBpbiB0aGUgZnVuY3Rpb24gaXhnYmVfdHhfZnJlZV9idWZzLCB3ZSB3b24ndCAgZG8g ZnJlZSBpbiB0aGUgb3V0c2lkZSBjb2RlLiBBbmQgIG5vIG1idWZzIHdpbGwgYmUgZnJlZWQuDQoN CklmIHlvdSBkbyBmcmVlIGluIG91dHNpZGUgY29kZSBmb3IgdGhlIE1PRCBtYnVmcyBhbmQgdXBk YXRlIHRoZSB2YWx1ZSBvZiB0eF9uZXh0X2RkIGFuZCBuYl90eF9mcmVlLiB0aGVyZSBpcyBubyBu ZWVkIHRvIGNhbGwgaXhnYmVfdHhfZnJlZV9idWZzLg0KIA0KaGVyZSBpcyB0d28gY2FzZSBhYm91 dCB0eF9kb25lX2NsZWFudXAgYW5kIGl4Z2JlX3R4X2ZyZWVfYnVmcy4gaXQgbWF5IGJlIG1vcmUg ZGV0YWlsDQoNCkNhc2UgMQ0KU3RhdHVzOg0KCVN1cHBvc2UgYmVmb3JlIGNhbGxpbmcgdHhfZG9u ZV9jbGVhbnVwKC4uLiwgdWludDMyX3QgY250KSwgdHhxIHN0YXR1cyBhcmUgYXMgZm9sbG93aW5n cy4NCgkNCglvbmUgbWJ1ZiBwZXIgcGFja2V0DQoJdHhxLT50eF9yc190aHJlc2ggPSAzMjsNCglj bGVhbiBtYnVmIGZyb20gaW5kZXggaWQNCgl0eHJbaWQrOV0ud2Iuc3RhdHVzICYgSVhHQkVfVFhE X1NUQVRfREQgIT0gMC4gICAvLyBtZWFucyB3ZSBjbG91ZCBmcmVlIDEwIHBhY2tldHMNCgl0eHJb aWQrMzFdLndiLnN0YXR1cyAmIElYR0JFX1RYRF9TVEFUX0REID09IDAuICAvLyBtZWFucyB3ZSBj bG91ZCBub3QgY2xlYW4gMzIgcGFja2V0cw0KDQpQcm9jZXNzIEZsb3c6DQoJdHhfZG9uZV9jbGVh bnVwKC4uLiwgMTApIGJlIGludm9rZWQgdG8gZnJlZSAxMCBwYWNrZXRzLg0KCUZpcnN0bHkgLHR4 X2RvbmVfY2xlYW51cCB3aWxsIGludm9rZSBpeGdiZV94bWl0X2NsZWFudXAgdG8gY291bnQgaG93 IG1hbnkgbWJ1ZnMgY291bGQgZnJlZS4NCglCdXQgaXhnYmVfeG1pdF9jbGVhbnVwIHdpbGwgcmV0 dXJuIC0xIChtZWFucyBubyBtYnVmcyB0byBmcmVlKSwgcGxlYXNlIHJlZiBjb2RlIGJlbGxvdw0K DQoJc3RhdHVzID0gdHhyW2Rlc2NfdG9fY2xlYW5fdG9dLndiLnN0YXR1czsNCglpZiAoIShzdGF0 dXMgJiBydGVfY3B1X3RvX2xlXzMyKElYR0JFX1RYRF9TVEFUX0REKSkpIHsNCgkJUE1EX1RYX0ZS RUVfTE9HKERFQlVHLA0KCQkJCSJUWCBkZXNjcmlwdG9yICU0dSBpcyBub3QgZG9uZSINCgkJCQki KHBvcnQ9JWQgcXVldWU9JWQpIiwNCgkJCQlkZXNjX3RvX2NsZWFuX3RvLA0KCQkJCXR4cS0+cG9y dF9pZCwgdHhxLT5xdWV1ZV9pZCk7DQoJCS8qIEZhaWxlZCB0byBjbGVhbiBhbnkgZGVzY3JpcHRv cnMsIGJldHRlciBsdWNrIG5leHQgdGltZSAqLw0KCQlyZXR1cm4gLSgxKTsNCgl9DQoNClJlc3Vs dDoNCglXZSBkbyBub3RoaW5nDQoNCkV4cGVjdDoNCglGcmVlIDEwIHBhY2tldHMuDQoNClRob3Vn aHRzOg0KCUlmIHdlIHRyeSB0byBjaGVjayBzdGF0dXMgZnJvbSB0eHJbaWRdLndiLnN0YXR1cyB0 byB0eHJbaWQrMzFdLndiLnN0YXR1cyBvbmUgYnkgb25lLCB3ZSBjb3VsZCBmaW5kIHR4cltpZF0u d2Iuc3RhdHVzLCB0eHJbaWQrMV0ud2Iuc3RhdHVzLCB0eHJbaWQrMl0ud2Iuc3RhdHVzIOKApuKA pnR4cltpZCs5XS53Yi5zdGF0dXMsIGFsbCBvZiB0aGVtIHN0YXR1cyBhcmUgSVhHQkVfVFhEX1NU QVRfREQsIHNvIGFjdHVhbGx5IHdlIGhhdmUgdGhlIGFiaWxpdHkgdG8gZnJlZSAxMCBwYWNrZXRz Lg0KDQoNCg0KQ2FzZSAyOg0KU3RhdHVzOg0KCVN1cHBvc2UgYmVmb3JlIGNhbGxpbmcgdHhfZG9u ZV9jbGVhbnVwKC4uLiwgdWludDMyX3QgY250KSwgdHhxIHN0YXR1cyBhcmUgYXMgZm9sbG93aW5n cy4NCg0KCW9uZSBtYnVmIHBlciBwYWNrZXQNCgl0eHEtPnR4X3JzX3RocmVzaCA9IDMyOw0KCWNs ZWFuIG1idWYgZnJvbSBpbmRleCBpZA0KCXR4cltpZCszMV0ud2Iuc3RhdHVzICYgSVhHQkVfVFhE X1NUQVRfREQgIT0gMC4gICAvLyBtZWFucyB3ZSBjbG91ZCBmcmVlIDMyIHBhY2tldHMNCg0KUHJv Y2VzcyBGbG93Og0KCXR4X2RvbmVfY2xlYW51cCguLi4sIDEwKSBiZSBpbnZva2VkIHRvIGZyZWUg MTAgcGFja2V0cy4NCglXaGVuIHR4X2RvbmVfY2xlYW51cCBpbnZva2UgaXhnYmVfdHhfZnJlZV9i dWZzIGZyZWUgYnVmcywgaXQgd2lsbCBmcmVlIDMyIHBhY2tldHMuLg0KDQpSZXN1bHQ6DQoJRnJl ZSAzMiBwYWNrZXRzLg0KDQpFeHBlY3Q6DQoJRnJlZSAxMCBwYWNrZXRzLg0KDQpUaG91Z2h0czoN CglJZiB3ZSB0cnkgdG8gY2hlY2sgc3RhdHVzIGZyb20gdHhyW2lkXS53Yi5zdGF0dXMgdG8gdHhy W2lkKzMxXS53Yi5zdGF0dXMgb25lIGJ5IG9uZSwgd2UgY291bGQgZmluZCB0eHJbaWRdLndiLnN0 YXR1cywgdHhyW2lkKzFdLndiLnN0YXR1cywgdHhyW2lkKzJdLndiLnN0YXR1cyDigKbigKZ0eHJb aWQrMTBdLndiLnN0YXR1cywgYWxsIG9mIHRoZW0gc3RhdHVzIGFyZSBJWEdCRV9UWERfU1RBVF9E RCwgc28gd2UgaGF2ZSB0aGUgYWJpbGl0eSB0byBmcmVlIDEwIHBhY2tldHMgb25seS4NCg0KDQoN Cg0KIHNlY29uZCwgd2UgaGF2ZSBhIGxvdCBvZiBjb2RlcyB3aGF0IGlzIHNhbWUgYXMgaXQgaW4g ZnVuY3Rpb24gaXhnYmVfeG1pdF9jbGVhbnVwLg0KIA0KDQogd2UgZG8gYW5hbHlzaXMgZm9yIGZ1 bmN0aW9uIGl4Z2JlX3R4X2ZyZWVfYnVmcyBhbmQgaXhnYmVfeG1pdF9jbGVhbnVwIGFuZCBzZWdt ZW50IHRoZWlyIGFjdGlvbnMuDQogdGhlIGFjdHVhbCBhY3Rpb24gb2YgY29kZXMgYXJlIGZvbGxv d2luZyBwb2ludHM6DQoxLiBEZXRlcm1pbmUgdGhlIHN0YXJ0IHBvc2l0aW9uIG9mIHRoZSBmcmVl IGFjdGlvbi4NCjIuIENoZWNrIHdoZXRoZXIgdGhlIHN0YXR1cyBvZiB0aGUgZW5kIHBvc2l0aW9u IGlzIEREDQozLiBGcmVlICggc2V0IHN0YXR1cz0wIGluIHhtaXRfY2xlYW51cCgpIHdoaWxlIGNh bGwgcnRlX21lbXBvb2xfcHV0X2J1bGsoKSBpbiB0eF9mcmVlX2J1ZnMoKSkNCjQuIFVwZGF0ZSBs b2NhdGlvbiB2YXJpYWJsZXMoIGxhc3RfZGVzY19jbGVhbmVkIGluIHhtaXRfY2xlYW51cCgpIGFu ZCAgdHhfbmV4dF9kZCAgaW4gdHhfZnJlZV9idWZzKCkgYW5kIG5iX3R4X2ZyZWUgaW4gYm90aCku DQogDQpJZiByZXVzZSBpeGdiZV94bWl0X2NsZWFudXAsIHdlIG5lZWQgZ2V0IHRoZSBudW1iZXIg b2YgbWJ1ZnMgYmVmb3JlIGNhbGxpbmcgaXhnYmVfeG1pdF9jbGVhbnVwKCkNCldlIGFsc28gbmVl ZCB0byBpbXBsZW1lbnQgdGhlIGZvbGxvd2luZyBhY3Rpb25zOg0KMS4gRGV0ZXJtaW5lIHRoZSBz dGFydGluZyBwb3NpdGlvbg0KMi4gRmluZCB0aGUgbGFzdCBtYnVmIG9mIGVhY2ggUEtUIGFuZCBj b25maXJtIHdoZXRoZXIgaXRzIHN0YXR1cyBpcyBERA0KMy4gRnJlZSAoZG9uJ3QgZG8gZm9yIHR4 X2ZyZWVfYnVmcygpKQ0KNC4gY2FsbCB4bWl0X2NsZWFudXAgZnVuY3Rpb24gaW4gbG9vcC4NCiAN CkJ5IGNvbXBhcmlzb24sIGl0IGlzIHBvc3NpYmxlIHRvIHNlZSB0aGF0IDMvNCBmdW5jdGlvbnMg b2YgaXhnYmVfeG1pdF9jbGVhbnVwIGFyZSBhbHJlYWR5IGJlaW5nIGNhbGxlZCBiZWZvcmUsIA0K aXQgbWVhbnMgdGhhdCBpeGdiZV94bWl0X2NsZWFudXAgaXMgbm90IGhpZ2hseSByZXVzYWJsZSwg dGhlIHJlcGVhdCBjb2RlcyBpcyBzbyBtYW55Lg0KIA0KIA0KZm9sbG93aW5nIGNvZGUgaXMgdGhl IG1haW4gY29kZSBpbiBpeGdiZV94bWl0X2NsZWFudXAoKSBhbmQgdGhlIGFjdGlvbiBjb2RlLg0K IA0KIDEuDQoJbGFzdF9kZXNjX2NsZWFuZWQgPSB0eHEtPmxhc3RfZGVzY19jbGVhbmVkOw0KIA0K IDIuDQoJLyogRGV0ZXJtaW5lIHRoZSBsYXN0IGRlc2NyaXB0b3IgbmVlZGluZyB0byBiZSBjbGVh bmVkICovDQoJZGVzY190b19jbGVhbl90byA9ICh1aW50MTZfdCkobGFzdF9kZXNjX2NsZWFuZWQg KyB0eHEtPnR4X3JzX3RocmVzaCk7DQoJaWYgKGRlc2NfdG9fY2xlYW5fdG8gPj0gbmJfdHhfZGVz YykNCgkJZGVzY190b19jbGVhbl90byA9ICh1aW50MTZfdCkoZGVzY190b19jbGVhbl90byAtIG5i X3R4X2Rlc2MpOw0KDQoJLyogQ2hlY2sgdG8gbWFrZSBzdXJlIHRoZSBsYXN0IGRlc2NyaXB0b3Ig dG8gY2xlYW4gaXMgZG9uZSAqLw0KCWRlc2NfdG9fY2xlYW5fdG8gPSBzd19yaW5nW2Rlc2NfdG9f Y2xlYW5fdG9dLmxhc3RfaWQ7DQoJc3RhdHVzID0gdHhyW2Rlc2NfdG9fY2xlYW5fdG9dLndiLnN0 YXR1czsNCglpZiAoIShzdGF0dXMgJiBydGVfY3B1X3RvX2xlXzMyKElYR0JFX1RYRF9TVEFUX0RE KSkpIHsNCgkJUE1EX1RYX0ZSRUVfTE9HKERFQlVHLA0KCQlyZXR1cm4gLSgxKTsNCgl9DQozLg0K CS8qIEZpZ3VyZSBvdXQgaG93IG1hbnkgZGVzY3JpcHRvcnMgd2lsbCBiZSBjbGVhbmVkICovDQoJ aWYgKGxhc3RfZGVzY19jbGVhbmVkID4gZGVzY190b19jbGVhbl90bykNCgkJbmJfdHhfdG9fY2xl YW4gPSAodWludDE2X3QpKChuYl90eF9kZXNjIC0gbGFzdF9kZXNjX2NsZWFuZWQpICsNCgkJCQkJ CQlkZXNjX3RvX2NsZWFuX3RvKTsNCgllbHNlDQoJCW5iX3R4X3RvX2NsZWFuID0gKHVpbnQxNl90 KShkZXNjX3RvX2NsZWFuX3RvIC0NCgkJCQkJCWxhc3RfZGVzY19jbGVhbmVkKTsNCgl0eHJbZGVz Y190b19jbGVhbl90b10ud2Iuc3RhdHVzID0gMDsNCjQuDQoJLyogVXBkYXRlIHRoZSB0eHEgdG8g cmVmbGVjdCB0aGUgbGFzdCBkZXNjcmlwdG9yIHRoYXQgd2FzIGNsZWFuZWQgKi8NCgl0eHEtPmxh c3RfZGVzY19jbGVhbmVkID0gZGVzY190b19jbGVhbl90bzsNCgl0eHEtPm5iX3R4X2ZyZWUgPSAo dWludDE2X3QpKHR4cS0+bmJfdHhfZnJlZSArIG5iX3R4X3RvX2NsZWFuKTsNCiANCg0KDQoNCg0K DQoNCg0KDQo+IC0tLS0tT3JpZ2luYWwgTWVzc2FnZS0tLS0tDQo+IEZyb206IEFuYW55ZXYsIEtv bnN0YW50aW4NCj4gU2VudDogVHVlc2RheSwgSmFudWFyeSA3LCAyMDIwIDEwOjEwIFBNDQo+IFRv OiBEaSwgQ2hlbnh1WCA8Y2hlbnh1eC5kaUBpbnRlbC5jb20+OyBkZXZAZHBkay5vcmcNCj4gQ2M6 IFlhbmcsIFFpbWluZyA8cWltaW5nLnlhbmdAaW50ZWwuY29tPg0KPiBTdWJqZWN0OiBSRTogW2Rw ZGstZGV2XSBbUEFUQ0ggdjYgMy80XSBuZXQvaXhnYmU6IGNsZWFudXAgVHggYnVmZmVycw0KPiAN Cj4gDQo+IEhpIENoZW54dSwNCj4gDQo+ID4gPiA+ID4gPiA+ID4gKyAqIHR4X3RhaWwgaXMgdGhl IGxhc3Qgc2VudCBwYWNrZXQgb24gdGhlIHN3X3JpbmcuIEdvdG8NCj4gPiA+ID4gPiA+ID4gPiAr IHRoZSBlbmQNCj4gPiA+ID4gPiA+ID4gPiArICogb2YgdGhhdCBwYWNrZXQgKHRoZSBsYXN0IHNl Z21lbnQgaW4gdGhlIHBhY2tldCBjaGFpbikNCj4gPiA+ID4gPiA+ID4gPiArIGFuZA0KPiA+ID4g PiA+ID4gPiA+ICsgKiB0aGVuIHRoZSBuZXh0IHNlZ21lbnQgd2lsbCBiZSB0aGUgc3RhcnQgb2Yg dGhlIG9sZGVzdA0KPiA+ID4gPiA+ID4gPiA+ICsgc2VnbWVudA0KPiA+ID4gPiA+ID4gPiA+ICsg KiBpbiB0aGUgc3dfcmluZy4NCj4gPiA+ID4gPiA+ID4NCj4gPiA+ID4gPiA+ID4gTm90IHN1cmUg SSB1bmRlcnN0YW5kIHRoZSBzZW50ZW5jZSBhYm92ZS4NCj4gPiA+ID4gPiA+ID4gdHhfdGFpbCBp cyB0aGUgdmFsdWUgb2YgVERUIEhXIHJlZ2lzdGVyIChtb3N0IHJlY2VudGx5IGFybWVkIGJ5IFNX DQo+IFREKS4NCj4gPiA+ID4gPiA+ID4gbGFzdF9pZCAgaXMgdGhlIGluZGV4IG9mIGxhc3QgZGVz Y3JpcHRvciBmb3IgbXVsdGktc2VnIHBhY2tldC4NCj4gPiA+ID4gPiA+ID4gbmV4dF9pZCBpcyBq dXN0IHRoZSBpbmRleCBvZiBuZXh0IGRlc2NyaXB0b3IgaW4gSFcgVEQgcmluZy4NCj4gPiA+ID4g PiA+ID4gSG93IGRvIHlvdSBjb25jbHVkZSB0aGF0IGl0IHdpbGwgYmUgdGhlICcgb2xkZXN0IHNl Z21lbnQgaW4gdGhlDQo+IHN3X3JpbmcnPw0KPiA+ID4gPiA+ID4gPg0KPiA+ID4gPiA+ID4NCj4g PiA+ID4gPiA+IFRoZSB0eF90YWlsIGlzIHRoZSBsYXN0IHNlbnQgcGFja2V0IG9uIHRoZSBzd19y aW5nLiBXaGlsZSB0aGUNCj4gPiA+ID4gPiA+IHhtaXRfY2xlYW51cCBvciBUeF9mcmVlX2J1ZnMg d2lsbCBiZSBjYWxsIHdoZW4gdGhlIG5iX3R4X2ZyZWUNCj4gPiA+ID4gPiA+IDwNCj4gPiA+ID4g PiB0eF9mcmVlX3RocmVzaCAuDQo+ID4gPiA+ID4gPiBTbyB0aGUgc3dfcmluZ1t0eF90YWlsXS5u ZXh0X2lkIG11c3QgYmUgdGhlIGJlZ2luIG9mIG1idWZzDQo+ID4gPiA+ID4gPiB3aGljaCBhcmUg bm90IHVzZWQgb3IgIEFscmVhZHkgZnJlZWQgLiB0aGVuIGJlZ2luIHRoZSBsb29wDQo+ID4gPiA+ ID4gPiB1bnRpbCB0aGUgbWJ1ZiBpcyB1c2VkIGFuZA0KPiA+ID4gPiA+IGJlZ2luIHRvIGZyZWUg dGhlbS4NCj4gPiA+ID4gPiA+DQo+ID4gPiA+ID4gPg0KPiA+ID4gPiA+ID4NCj4gPiA+ID4gPiA+ ID4gQW5vdGhlciBxdWVzdGlvbiB3aHkgZG8geW91IG5lZWQgdG8gd3JpdGUgeW91ciBvd24gZnVu Y3Rpb25zPw0KPiA+ID4gPiA+ID4gPiBXaHkgY2FuJ3QgeW91IHJldXNlIGV4aXN0aW5nIGl4Z2Jl X3htaXRfY2xlYW51cCgpIGZvcg0KPiA+ID4gPiA+ID4gPiBmdWxsKG9mZmxvYWQpIHBhdGggYW5k DQo+ID4gPiA+ID4gPiA+IGl4Z2JlX3R4X2ZyZWVfYnVmcygpIGZvciBzaW1wbGUgcGF0aD8NCj4g PiA+ID4gPiA+ID4gWWVzLCAgaXhnYmVfeG1pdF9jbGVhbnVwKCkgZG9lc24ndCBmcmVlIG1idWZz LCBidXQgYXQgbGVhc3QNCj4gPiA+ID4gPiA+ID4gaXQgY291bGQgYmUgdXNlZCB0byBkZXRlcm1p bmUgZmluaXNoZWQgVFggZGVzY3JpcHRvcnMuDQo+ID4gPiA+ID4gPiA+IEJhc2VkIG9uIHRoYXQg eW91IGNhbiB5b3UgY2FuIGZyZWUgYXBwcm9wcmlhdGUgc3dfcmluZ1tdIGVudHJpZXMuDQo+ID4g PiA+ID4gPiA+DQo+ID4gPiA+ID4gPg0KPiA+ID4gPiA+ID4gVGhlIHJlYXNvbiB3aHkgSSBkb24n dCByZXVzZSBleGlzdGluZyBmdW5jdGlvbiBpcyB0aGF0IHRoZXkNCj4gPiA+ID4gPiA+IGFsbCBm cmVlIHNldmVyYWwgbWJ1ZnMgV2hpbGUgdGhlIGZyZWVfY250IG9mIHRoZSBBUEkNCj4gPiA+ID4g PiA+IHJ0ZV9ldGhfdHhfZG9uZV9jbGVhbnVwKCkgaXMgdGhlDQo+ID4gPiA+ID4gbnVtYmVyIG9m IHBhY2tldHMuDQo+ID4gPiA+ID4gPiBJdCBhbHNvIG5lZWQgdG8gYmUgZG9uZSB0aGF0IGNoZWNr IHdoaWNoIG1idWZmcyBhcmUgZnJvbSB0aGUgc2FtZQ0KPiBwYWNrZXQuDQo+ID4gPiA+ID4NCj4g PiA+ID4gPiBBdCBmaXJzdCwgSSBkb24ndCBzZWUgYW55dGhpbmcgYmFkIGlmIHR4X2RvbmVfY2xl YW51cCgpIHdpbGwNCj4gPiA+ID4gPiBmcmVlIG9ubHkgc29tZSBzZWdtZW50cyBmcm9tIHRoZSBw YWNrZXQuIEFzIGxvbmcgYXMgaXQgaXMgc2FmZSAtDQo+ID4gPiA+ID4gdGhlcmUgaXMgbm8NCj4g PiA+IHByb2JsZW0gd2l0aCB0aGF0Lg0KPiA+ID4gPiA+IEkgdGhpbmsgcnRlX2V0aF90eF9kb25l X2NsZWFudXAoKSBvcGVyYXRlcyBvbiBtYnVmLCBub3QgcGFja2V0DQo+IHF1YW50aXRpZXMuDQo+ ID4gPiA+ID4gQnV0IGluIG91ciBjYXNlIEkgdGhpbmsgaXQgZG9lc24ndCBtYXR0ZXIsIGFzDQo+ ID4gPiA+ID4gaXhnYmVfeG1pdF9jbGVhbnVwKCkgbWFyayBUWERzIGFzIGZyZWUgb25seSB3aGVu IEhXIGlzIGRvbmUgd2l0aCBhbGwNCj4gVFhEcyBmb3IgdGhhdCBwYWNrZXQuDQo+ID4gPiA+ID4g QXMgbG9uZyBhcyB0aGVyZSBpcyBhIHdheSB0byByZXVzZSBleGlzdGluZyBjb2RlIGFuZCBhdm9p ZA0KPiA+ID4gPiA+IGR1cGxpY2F0aW9uICh3aXRob3V0IGludHJvZHVjaW5nIGFueSBkZWdyYWRh dGlvbikgLSB3ZSBzaG91bGQgdXNlIGl0Lg0KPiA+ID4gPiA+IEFuZCBJIHRoaW5rIHRoZXJlIGlz IGEgdmVyeSBnb29kIG9wcG9ydHVuaXR5IGhlcmUgdG8gcmV1c2UNCj4gPiA+ID4gPiBleGlzdGlu Zw0KPiA+ID4gPiA+IGl4Z2JlX3htaXRfY2xlYW51cCgpIGZvciB0eF9kb25lX2NsZWFudXAoKSBp bXBsZW1lbnRhdGlvbi4NCj4gPiA+ID4gPiBNb3Jlb3ZlciBiZWNhdXNlIHlvdXIgY29kZSBkb2Vz buKAmXQgZm9sbG93DQo+ID4gPiA+ID4gaXhnYmVfeG1pdF9wa3RzKCkvaXhnYmVfeG1pdF9jbGVh bnVwKCkNCj4gPiA+ID4gPiBsb2dpYyBhbmQgaW5mcmFzdHJ1Y3R1cmUsIGl0IGludHJvZHVjZXMg dW5uZWNlc3Nhcnkgc2NhbnMgb3Zlcg0KPiA+ID4gPiA+IFRYRCByaW5nLCBhbmQgaW4gc29tZSBj YXNlcyBkb2Vzbid0IHdvcmsgYXMgZXhwZWN0ZWQ6DQo+ID4gPiA+ID4NCj4gPiA+ID4gPiArd2hp bGUgKDEpIHsNCj4gPiA+ID4gPiArdHhfbGFzdCA9IHN3X3JpbmdbdHhfaWRdLmxhc3RfaWQ7DQo+ ID4gPiA+ID4gKw0KPiA+ID4gPiA+ICtpZiAoc3dfcmluZ1t0eF9sYXN0XS5tYnVmKSB7DQo+ID4g PiA+ID4gK2lmICh0eHJbdHhfbGFzdF0ud2Iuc3RhdHVzICYNCj4gPiA+ID4gPiArSVhHQkVfVFhE X1NUQVRfREQpIHsNCj4gPiA+ID4gPiAuLi4NCj4gPiA+ID4gPiArfSBlbHNlIHsNCj4gPiA+ID4g PiArLyoNCj4gPiA+ID4gPiArICogbWJ1ZiBzdGlsbCBpbiB1c2UsIG5vdGhpbmcgbGVmdCB0bw0K PiA+ID4gPiA+ICsgKiBmcmVlLg0KPiA+ID4gPiA+ICsgKi8NCj4gPiA+ID4gPiArYnJlYWs7DQo+ ID4gPiA+ID4NCj4gPiA+ID4gPiBJdCBpcyBub3QgY29ycmVjdCB0byBleHBlY3QgdGhhdCBJWEdC RV9UWERfU1RBVF9ERCB3aWxsIGJlIHNldA0KPiA+ID4gPiA+IG9uIGxhc3QgVFhEIGZvcg0KPiA+ ID4gPiA+ICpldmVyeSogcGFja2V0Lg0KPiA+ID4gPiA+IFdlIHNldCBJWEdCRV9UWERfQ01EX1JT IGJpdCBvbmx5IG9uIHRocmVzaG9sZCBwYWNrZXQgbGFzdCBkZXNjcmlwdG9yLg0KPiA+ID4gPiA+ IFBsdXMgaXhnYmVfeG1pdF9jbGVhbnVwKCkgY2FuIGNsZWFudXAgVFhEIHdiLnN0YXR1cy4NCj4g PiA+ID4gPg0KPiA+ID4gPiA+IFNvIEkgc3Ryb25nbHkgcmVjb21tZW5kIHRvIHJldXNlIGl4Z2Jl X3htaXRfY2xlYW51cCgpIGhlcmUuDQo+ID4gPiA+ID4gSXQgd291bGQgYmUgbXVjaCBsZXNzIGVy cm9yIHByb25lIGFuZCB3aWxsIGhlbHAgdG8gYXZvaWQgY29kZSBkdXBsaWNhdGlvbi4NCj4gPiA+ ID4gPg0KPiA+ID4gPiA+IEtvbnN0YW50aW4NCj4gPiA+ID4gPg0KPiA+ID4gPg0KPiA+ID4gPiBB dCBmaXJzdC4NCj4gPiA+ID4gVGhlIGZ1bmN0aW9uIGl4Z2JlX3htaXRfY2xlYW51cChzdHJ1Y3Qg aXhnYmVfdHhfcXVldWUgKnR4cSkgd2lsbA0KPiA+ID4gPiBjbGVhbnVwDQo+ID4gPiBUWEQgd2Iu c3RhdHVzLg0KPiA+ID4gPiB0aGUgbnVtYmVyIG9mIHN0YXR1cyBjbGVhbnVwZWQgaXMgYWx3YXlz IHR4cS0+dHhfcnNfdGhyZXNoLg0KPiA+ID4NCj4gPiA+IFllcywgYW5kIHdoYXQncyB3cm9uZyB3 aXRoIGl0Pw0KPiA+ID4NCj4gPiA+ID4NCj4gPiA+ID4gVGhlICBBUEkgcnRlX2V0aF90eF9kb25l X2NsZWFudXAoKSBpbiBydGVfZXRoX2Rldi5oIHNob3cgdGhhdA0KPiA+ID4gPiBAcGFyYW0gZnJl ZV9jbnQNCj4gPiA+ID4gICogICBNYXhpbXVtIG51bWJlciBvZiBwYWNrZXRzIHRvIGZyZWUuIFVz ZSAwIHRvIGluZGljYXRlIGFsbCBwb3NzaWJsZQ0KPiBwYWNrZXRzDQo+ID4gPiA+ICAqICAgc2hv dWxkIGJlIGZyZWVkLiBOb3RlIHRoYXQgYSBwYWNrZXQgbWF5IGJlIHVzaW5nIG11bHRpcGxlIG1i dWZzLg0KPiA+ID4NCj4gPiA+IEkgZG9uJ3QgdGhpbmsgaXQgaXMgYSBnb29kIGFwcHJvYWNoLCBi ZXR0ZXIgd291bGQgYmUgdG8gcmVwb3J0DQo+ID4gPiBudW1iZXIgb2YgZnJlZWQgbWJ1ZnMsIGJ1 dCBvaywgYXMgaXQgaXMgYSBwdWJsaWMgQVBJLCB3ZSBwcm9iYWJseSBuZWVkIHRvDQo+IGtlZXAg aXQgYXMgaXQgaXMuDQo+ID4gPg0KPiA+ID4gPiBhIG51bWJlciBtdXN0IGJlIHNldCB3aGlsZSBp eGdiZV94bWl0X2NsZWFudXAgYW5kDQo+ID4gPiA+IGl4Z2JlX3R4X2ZyZWVfYnVmcyBvbmx5DQo+ ID4gPiBoYXZlIG9uZSBwYXJhbWV0ZXIgdHhxLg0KPiA+ID4NCj4gPiA+IFllcywgaXhnYmVfeG1p dF9jbGVhbnVwKCkgY2xlYW5zIHVwIGF0IGxlYXN0IHR4cS0+dHhfcnNfdGhyZXNoIFRYRHMuDQo+ ID4gPiBTbyBpZiB1c2VyIHJlcXVlc3RlZCBtb3JlIHBhY2tldHMgdG8gYmUgZnJlZWQgd2UgY2Fu IGNhbGwNCj4gPiA+IGl4Z2JlX3htaXRfY2xlYW51cCgpIGluIGEgbG9vcC4NCj4gPiA+DQo+ID4N Cj4gPiBUaGF0IGlzIGEgZ3JlYXQgaWRlYSBhbmQgSSBkaXNjdXNzIHdpdGggbXkgd29ya21hdGUg YWJvdXQgaXQgdG9kYXkuDQo+ID4gdGhlcmUgaXMgYWxzbyBzb21lIFF1ZXN0aW9uIHRoYXQgd2Ug ZG9u4oCZdCBjb25maXJtLg0KPiA+IEFjdHVhbGx5IGl0IGNhbiBjYWxsIGl4Z2JlX3htaXRfY2xl YW51cCgpIGluIGEgbG9vcCBpZiB1c2VyIHJlcXVlc3RlZA0KPiA+IG1vcmUgcGFja2V0cywgSG93 IHRvIGRlYWwgd2l0aCB0aGUgTU9ELiBGb3IgZXhhbXBsZToNCj4gPiBUaGUgZGVmYXVsdCB0eF9y c190aHJlc2ggaXMgMzIuaWYgdGhlIGNvdW50IG9mIG1idWZzIHdlIG5lZWQgZnJlZSBpcyA1MC4N Cj4gPiBXZSBjYW4gY2FsbCBpeGdiZV94bWl0X2NsZWFudXAoKSBvbmUgdGltZSB0byBmcmVlIDMy IG1idWZzLg0KPiA+IFRoZW4gaG93IGFib3V0IG90aGVyIDE4IG1idWZzLg0KPiA+IDEuSWYgd2Ug ZG8gbm90aGluZywgaXQgbG9va3Mgbm90IGdvb2QuDQo+ID4gMi5pZiB3ZSBjYWxsIGl4Z2JlX3ht aXRfY2xlYW51cCgpIHN1Y2Nlc3NmdWxseSwgd2UgZnJlZSAxNCBtYnVmcyBtb3JlLg0KPiA+IDMu aWYgd2UgY2FsbCBpeGdiZV94bWl0X2NsZWFudXAoKSBmYWlsLCB0aGUgc3RhdHVzIG9mIE5vLjMy IG1idWZzIGlzIG5vdCBERA0KPiA+ICAgV2hpbGUgTm8gLjE4IGlzIERELiBTbyB3ZSBkbyBub3Qg ZnJlZSAxOCBtYnVmcyB3aGF0IHdlIGNhbiBhbmQgc2hvdWxkIGZyZWUuDQo+ID4NCj4gPiBXZSBo YXZlIHRyeSBzb21lIHBsYW5zIGFib3V0IGl0LCBsaWtlcyBhZGQgcGFyYW1ldGVyIGZvcg0KPiA+ IGl4Z2JlX3htaXRfY2xlYW51cCgpLCBjaGFuZ2UgIFR4X3JzX3RocmVzaCBvciBjb3B5IHRoZSBj b2RlIG9yDQo+ID4gaXhnYmVfeG1pdF9jbGVhbnVwKCkgYXMgYSBuZXcgZnVuY3Rpb24gd2l0aCBt b3JlIFBhcmFtZXRlci4gQnV0IGFsbCBvZiB0aGVtDQo+IHNlZW0gbm90IHBlcmZlY3QuDQo+ID4N Cj4gPiBTbyAgY2FuIHlvdSBnaXZlIHNvbWUgY29tbWVudCBhYm91dCBpdD8gSXQgc2VlbXMgbm90 IGVhc3kgYXMgd2UgdGhpbmsgYnkNCj4gcmV1c2UgZnVuY3Rpb24uDQo+IA0KPiBNeSB0aG91Z2h0 IGFib3V0IGl0Og0KPiBmb3Igc2l0dWF0aW9ucyB3aGVuIGNudCAlIHJzX3RocmVzaCAhPSAwIHdl J2xsIHN0aWxsIGNhbGwgaXhnYmVfeG1pdF9jbGVhbnVwKCkgY250IC8NCj4gcnNfdGhyZXNoICsg MSB0aW1lcy4NCj4gQnV0IHRoZW4sIHdlIGNhbiBmcmVlIGp1c3QgY250ICUgcnNfdGhyZXNoIG1i dWZzLCB3aGlsZSBrZWVwaW5nIHJlc3Qgb2YgdGhlbQ0KPiBpbnRhY3QuDQo+IA0KPiBMZXQgc2F5 IGF0IHNvbWUgbW9tZW50IHdlIGhhdmUgdHhxLT5uYl90eF9mcmVlPT0wLCBhbmQgdXNlciBjYWxs ZWQNCj4gdHhfZG9uZV9jbGVhbnVwKHR4cSwgLi4uLCBjbnQ9PTUwKSBTbyB3ZSBjYWxsIGl4Z2Jl X3htaXRfY2xlYW51cCh0eHEpIGZpcnN0IHRpbWUuDQo+IFN1cHBvc2UgaXQgZnJlZXMgMzIgVFhE cywgdGhlbiB3ZSB3YWxrIHRocm91Z2ggY29ycmVzcG9uZGluZyBzd19yaW5nW10gZW50cmllcw0K PiBhbmQgbGV0IHNheSBmcmVlIDMyIHBhY2tldHMgKG9uZSBtYnVmIHBlciBwYWNrZXQpLg0KPiBU aGVuIHdlIGNhbGwgaXhnYmVfeG1pdF9jbGVhbnVwKHR4cSkgIHNlY29uZCB0aW1lLg0KPiBTdXBw b3NlIGl0IHdpbGwgZnJlZSBhbm90aGVyIDMyIFRYRHMsIHdlIGFnYWluIHdhbGsgdGhvdXIgc3df cmluZ1tdLCBidXQgZnJlZQ0KPiBvbmx5IGZpcnN0IDE4IG1idWZzIGFuZCByZXR1cm4uDQo+IFN1 cHBvc2Ugd2UgY2FsbCB0eF9kb25lX2NsZWFudXAodHhxLCBjbnQ9NTApIGltbWVkaWF0ZWx5IGFn YWluLg0KPiBOb3cgdHhxLT5uYl90eF9mcmVlPT02NCwgc28gd2UgY2FuIHN0YXJ0IHRvIHNjYW4g c3dfZW50cmllc1tdIGZyb20gdHhfdGFpbA0KPiBzdHJhaWdodHdheS4gV2UnbGwgc2tpcCBmaXJz dCA1MCBlbnRyaWVzIGFzIHRoZXkgYXJlIGFscmVhZHkgZW1wdHksIHRoZW4gZnJlZQ0KPiByZW1h aW5pbmcgMTQgbWJ1ZnMsIHRoZW4gd2lsbCBjYWxsIGl4Z2JlX3htaXRfY2xlYW51cCh0eHEpIGFn YWluLCBhbmQgaWYgaXQgd291bGQNCj4gYmUgc3VjY2Vzc2Z1bCwgd2lsbCBzY2FuIGFuZCBmcmVl IGFub3RoZXIgMzIgc3dfcmluZ1tdIGVudHJpZXMuDQo+IFRoZW4gYWdhaW4gd2lsbCBjYWxsIGl4 Z2JlX3htaXRfY2xlYW51cCh0eHEpLCBidXQgd2lsbCBmcmVlDQo+IG9ubHkgZmlyc3QgOCBhdmFp bGFibGUgc3dfcmluZ1tdLm1idWYuDQo+IFByb2JhYmx5IGEgYml0IGVhc2llciB3aXRoIHRoZSBj b2RlOg0KPiANCj4gdHhfZG9uZV9jbGVhbnVwKC4uLiwgdWludDMyX3QgY250KQ0KPiB7DQo+ICAg ICAgICBzd3IgPSB0eHEtPnN3X3Jpbmc7DQo+ICAgICAgICB0eHIgICAgID0gdHhxLT50eF9yaW5n Ow0KPiAgICAgICAgaWQgICA9IHR4cS0+dHhfdGFpbDsNCj4gDQo+ICAgICAgIGlmICh0eHEtPm5i X3R4X2ZyZWUgPT0gMCkNCj4gICAgICAgICAgaXhnYmVfeG1pdF9jbGVhbnVwKHR4cSk7DQo+IA0K PiAgICAgICBmcmVlID0gIHR4cS0+bmJfdHhfZnJlZTsNCj4gICAgICAgZm9yIChuID0gMDsgbiA8 IGNudCAmJiBmcmVlICE9IDA7ICkgew0KPiANCj4gICAgICAgICAgIGZvciAoaiA9IDA7IGogIT0g ZnJlZSAmJiBuIDwgY250OyBqKyspIHsNCj4gICAgICAgICAgICAgIHN3ZSA9ICZzd3JbaWQgKyBq XTsNCj4gICAgICAgICAgICAgIGlmIChzd2UtPm1idWYgIT0gTlVMTCkgew0KPiAgICAgICAgICAg ICAgICAgICAgcnRlX3BrdG1idWZfZnJlZV9zZWcoc3dlLT5tYnVmKTsNCj4gICAgICAgICAgICAg ICAgICAgIHN3ZS0+bWJ1ZiA9IE5VTEw7DQo+IA0KPiAgICAgICAgICAgICAgICAgICAvKiBsYXN0 IHNlZ21lbnQgaW4gdGhlIHBhY2tldCwgaW5jcmVtZW50IHBhY2tldCBjb3VudCAqLw0KPiAgICAg ICAgICAgICAgICAgICBuICs9IChzd2UtPmxhc3RfaWQgPT0gaWQgKyBqKTsNCj4gICAgICAgICAg ICAgIH0NCj4gICAgICAgICAgIH0NCj4gDQo+ICAgICAgICAgICBpZiAobiA8IGNudCkgew0KPiAg ICAgICAgICAgICAgICBpeGdiZV94bWl0X2NsZWFudXAodHhxKTsNCj4gICAgICAgICAgICAgICAg ZnJlZSA9ICAgdHhxLT5uYl90eF9mcmVlIC0gZnJlZTsNCj4gICAgICAgICAgIH0NCj4gICAgICB9 DQo+ICAgICAgcmV0dXJuIG47DQo+IH0NCj4gDQo+IEZvciB0aGUgc2l0dWF0aW9uIHdoZW4gdGhl cmUgYXJlIGxlc3MgdGhlbiByeF90aHJlc2ggZnJlZSBUWERzICgodHhxLQ0KPiA+dHhfcmluZ1tk ZXNjX3RvX2NsZWFuX3RvXS53Yi5zdGF0dXMgJiBJWEdCRV9UWERfU1RBVF9ERCkgPT0gMCkgd2Ug ZG8NCj4gbm90aGluZyAtIGluIHRoYXQgY2FzZSB3ZSBjb25zaWRlciB0aGVyZSBhcmUgbm8gbW9y ZSBtYnVmcyB0byBmcmVlLg0KPiANCj4gPg0KPiA+DQo+ID4gPiA+IEFuZCB3aGF0IHNob3VsZCBk byBpcyBub3Qgb25seSBmcmVlIGJ1ZmZlcnMgYW5kIHN0YXR1cyBidXQgYWxzbw0KPiA+ID4gPiBj aGVjayB3aGljaCBidWZzIGFyZSBmcm9tICBPbmUgcGFja2V0IGFuZCBjb3VudCB0aGUgcGFja2V0 IGZyZWVkLg0KPiA+ID4NCj4gPiA+IGl4Z2JlX3htaXRfY2xlYW51cCgpIGl0c2VsZiBkb2Vzbid0 IGZyZWUgbWJ1ZnMgaXRzZWxmLg0KPiA+ID4gSXQgb25seSBjbGVhbnMgdXAgVFhEcy4NCj4gPiA+ IFNvIGluIHR4X2RvbmVfY2xlYW51cCgpIGFmdGVyIGNhbGxpbmcgaXhnYmVfeG1pdF9jbGVhbnVw KCkgeW91J2xsDQo+ID4gPiBzdGlsbCBuZWVkIHRvIGdvIHRocm91Z2ggc3dfcmluZ1tdIGVudHJp ZXMgdGhhdCBjb3JyZXNwb25kIHRvIGZyZWUgVFhEcyBhbmQNCj4gY2FsbCBtYnVmX3NlZ19mcmVl KCkuDQo+ID4gPiBZb3UgY2FuIGNvdW50IG51bWJlciBvZiBmdWxsIHBhY2tldHMgaGVyZS4NCj4g PiA+DQo+ID4gPiA+IFNvIEkgdGhpbmsgaXQgY2FuJ3QgYmUgaW1wbGVtZW50ZWQgdGhhdCByZXVz ZSBmdW5jdGlvbg0KPiA+ID4gPiB4bWl0X2NsZWFudXAgd2l0aG91dA0KPiA+ID4gY2hhbmdlIGl0 Lg0KPiA+ID4gPiBBbmQgY3JlYXRlIGEgbmV3IGZ1bmN0aW9uIHdpdGggdGhlIGNvZGUgb2YgeG1p dF9jbGVhbnVwIHdpbGwgY2F1c2UNCj4gPiA+ID4gbWFueQ0KPiA+ID4gZHVwbGljYXRpb24uDQo+ ID4gPg0KPiA+ID4gSSBkb24ndCB0aGluayBpdCB3b3VsZC4NCj4gPiA+IEkgdGhpbmsgYWxsIHdl IG5lZWQgaGVyZSBpcyBzb21ldGhpbmcgbGlrZSB0aGF0IChub3RlIGl0IGlzDQo+ID4gPiBzY2hl bWF0aWMgb25lLCBkb2Vzbid0IHRha2UgaW50byBhY2NvdW5mIHRoYXQgVFhEIHJpbmcgaXMgY2ly Y3VsYXIpOg0KPiA+ID4NCj4gPiA+IHR4X2RvbmVfY2xlYW51cCguLi4sIHVpbnQzMl90IGNudCkN Cj4gPiA+IHsNCj4gPiA+ICAgICAgIC8qIHdlIGhhdmUgdHhxLT5uYl90eF9mcmVlIFRYRHMgc3Rh cnRpbmcgZnJvbSB0eHEtPnR4X3RhaWwuDQo+ID4gPiAgICAgICAgICAgIFNjYW4gdGhlbSBmaXJz dCBhbmQgZnJlZSBhcyBtYW55IG1idWZzIGFzIHdlIGNhbi4NCj4gPiA+ICAgICAgICAgICAgSWYg d2UgbmVlZCBtb3JlIG1idWZzIHRvIGZyZWUgY2FsbCAgaXhnYmVfeG1pdF9jbGVhbnVwKCkNCj4g PiA+ICAgICAgICAgICAgdG8gZnJlZSBtb3JlIFRYRHMuICovDQo+ID4gPg0KPiA+ID4gICAgICAg IHN3ciA9IHR4cS0+c3dfcmluZzsNCj4gPiA+ICAgICAgICB0eHIgICAgID0gdHhxLT50eF9yaW5n Ow0KPiA+ID4gICAgICAgIGlkICAgPSB0eHEtPnR4X3RhaWw7DQo+ID4gPiAgICAgICAgZnJlZSA9 ICB0eHEtPm5iX3R4X2ZyZWU7DQo+ID4gPg0KPiA+ID4gICAgICAgIGZvciAobiA9IDA7IG4gPCBj bnQgJiYgZnJlZSAhPSAwOyApIHsNCj4gPiA+DQo+ID4gPiAgICAgICAgICAgZm9yIChqID0gMDsg aiAhPSBmcmVlICYmIG4gPCBjbnQ7IGorKykgew0KPiA+ID4gICAgICAgICAgICAgIHN3ZSA9ICZz d3JbaWQgKyBqXTsNCj4gPiA+ICAgICAgICAgICAgICBpZiAoc3dlLT5tYnVmICE9IE5VTEwpIHsN Cj4gPiA+ICAgICAgICAgICAgICAgICAgICBydGVfcGt0bWJ1Zl9mcmVlX3NlZyhzd2UtPm1idWYp Ow0KPiA+ID4gICAgICAgICAgICAgICAgICAgIHN3ZS0+bWJ1ZiA9IE5VTEw7DQo+ID4gPiAgICAg ICAgICAgICAgfQ0KPiA+ID4gICAgICAgICAgICAgIG4gKz0gKHN3ZS0+bGFzdF9pZCA9PSBpZCAr IGopDQo+ID4gPiAgICAgICAgICAgfQ0KPiA+ID4NCj4gPiA+ICAgICAgICAgICBpZiAobiA8IGNu dCkgew0KPiA+ID4gICAgICAgICAgICAgICAgaXhnYmVfeG1pdF9jbGVhbnVwKHR4cSk7DQo+ID4g PiAgICAgICAgICAgICAgICBmcmVlID0gICB0eHEtPm5iX3R4X2ZyZWUgLSBmcmVlOw0KPiA+ID4g ICAgICAgICAgIH0NCj4gPiA+ICAgICAgfQ0KPiA+ID4gICAgICByZXR1cm4gbjsNCj4gPiA+IH0N Cj4gPiA+DQo+ID4gPiA+DQo+ID4gPiA+IEFib3ZlIGFsbCAsIGl0IHNlZW0gbm90IGEgcGVyZmVj dCBpZGVhIHRvIHJldXNlIGl4Z2JlX3htaXRfY2xlYW51cCgpLg0KPiA+ID4NCj4gPiA+IFRvdGFs bHkgZGlzYWdyZWUsIHNlZSBhYm92ZS4NCj4gPiA+DQo+ID4gPiA+DQo+ID4gPiA+IFNlY29uZC4N Cj4gPiA+ID4gVGhlIGZ1bmN0aW9uIGluIHBhdGNoIGlzIGNvcHkgZnJvbSBjb2RlIGluIGlnYl9y eHR4LmMuIGl0IGFscmVhZHkNCj4gPiA+ID4gdXBkYXRlZCBpbiAyMDE3LCBUaGUgY29tbWl0IGlk IGlzDQo+ID4gPiA4ZDkwN2QyYjc5ZjdhNTRjODA5ZjFjNDQ5NzBmZjQ1NWZhMjg2NWUxLg0KPiA+ ID4NCj4gPiA+IEkgcmVhbGl6ZWQgdGhhdC4NCj4gPiA+IEJ1dCBJIHRoaW5rIGl0IGFzIGEgcHJv YmxlbSwgbm90IGEgcG9zaXRpdmUgdGhpbmcuDQo+ID4gPiBXaGlsZSB0aGV5IGRvIGhhdmUgc29t ZSBzaW1pbGFyaXRpZXMsIGlnYiBhYmQgaXhnYmUgYXJlIFBNRHMgZm9yDQo+ID4gPiBkaWZmZXJl bnQgZGV2aWNlcywgYW5kIHRoZWlyIFRYIGNvZGUgZGlmZmVycyBxdWl0ZSBhIGxvdC4gTGV0IHNh eQ0KPiA+ID4gaWdiIGRvZXNuJ3QgdXNlIHR4X3JzX3RocmVzaG9sZCwgYnV0IGluc3RlYWQgc2V0 IFJTIGJpdCBmb3IgZWFjaCBsYXN0IFRYRC4NCj4gPiA+IFNvLCBqdXN0IGJsaW5kbHkgY29weWlu ZyB0eF9kb25lX2NsZWFudXAoKSBmcm9tIGlnYiB0byBpeGdiZSBkb2Vzbid0DQo+ID4gPiBsb29r IGxpa2UgYSBnb29kIGlkZWEgdG8gbWUuDQo+ID4gPg0KPiA+ID4gPiBJIHRydXN0IHRoZSBsb2dp YyBvZiBjb2RlIGlzIHJpZ2h0Lg0KPiA+ID4gPiBBY3R1YWxseSBpdCBkb24ndCBjb21wbGV0ZSBm b3IgaXhnYmUsIGk0MGUgYW5kIGljZSwgd2hpbGUgaXQgZG9uJ3QNCj4gPiA+ID4gY2hhbmdlIHRo ZSB2YWx1ZSBvZiBsYXN0X2Rlc2NfY2xlYW5lZCBhbmQgdHhfbmV4dF9kZC4gQW5kIGl0J3MNCj4g PiA+ID4gYmVnaW5uaW5nIHByZWZlciBsYXN0X2Rlc2NfY2xlYW5lZCBvciAgdHhfbmV4dF9kZChm b3Igb2ZmbG9hZCBvcg0KPiA+ID4gPiBzaW1wbGUpIHRvDQo+ID4gPiB0eF90YWlsLg0KPiA+ID4g Pg0KPiA+ID4gPiBTbywgSSBzdWdnZXN0IHRvIHVzZSB0aGUgb2xkIGZ1bmN0aW9uIGFuZCBmaXgg dGhlIGlzc3VlLg0KPiA+ID4gPg0KPiA+ID4gPiA+ID4NCj4gPiA+ID4gPiA+DQo+ID4gPiA+ID4g PiA+ID5UaGlzIGlzIHRoZSBmaXJzdCBwYWNrZXQgdGhhdCB3aWxsIGJlDQo+ID4gPiA+ID4gPiA+ ID4gKyAqIGF0dGVtcHRlZCB0byBiZSBmcmVlZC4NCj4gPiA+ID4gPiA+ID4gPiArICovDQo+ID4g PiA+ID4gPiA+ID4gKw0KPiA+ID4gPiA+ID4gPiA+ICsvKiBHZXQgbGFzdCBzZWdtZW50IGluIG1v c3QgcmVjZW50bHkgYWRkZWQgcGFja2V0LiAqLw0KPiA+ID4gPiA+ID4gPiA+ICt0eF9sYXN0ID0g c3dfcmluZ1t0eHEtPnR4X3RhaWxdLmxhc3RfaWQ7DQo+ID4gPiA+ID4gPiA+ID4gKw0KPiA+ID4g PiA+ID4gPiA+ICsvKiBHZXQgdGhlIG5leHQgc2VnbWVudCwgd2hpY2ggaXMgdGhlIG9sZGVzdCBz ZWdtZW50IGluIHJpbmcuDQo+ID4gPiA+ID4gPiA+ID4gKyovIHR4X2ZpcnN0ID0gc3dfcmluZ1t0 eF9sYXN0XS5uZXh0X2lkOw0KPiA+ID4gPiA+ID4gPiA+ICsNCj4gPiA+ID4gPiA+ID4gPiArLyog U2V0IHRoZSBjdXJyZW50IGluZGV4IHRvIHRoZSBmaXJzdC4gKi8gdHhfaWQgPQ0KPiA+ID4gPiA+ ID4gPiA+ICt0eF9maXJzdDsNCj4gPiA+ID4gPiA+ID4gPiArDQo+ID4gPiA+ID4gPiA+ID4gKy8q DQo+ID4gPiA+ID4gPiA+ID4gKyAqIExvb3AgdGhyb3VnaCBlYWNoIHBhY2tldC4gRm9yIGVhY2gg cGFja2V0LCB2ZXJpZnkgdGhhdA0KPiA+ID4gPiA+ID4gPiA+ICthbg0KPiA+ID4gPiA+ID4gPiA+ ICsgKiBtYnVmIGV4aXN0cyBhbmQgdGhhdCB0aGUgbGFzdCBzZWdtZW50IGlzIGZyZWUuIElmIHNv LA0KPiA+ID4gPiA+ID4gPiA+ICtmcmVlDQo+ID4gPiA+ID4gPiA+ID4gKyAqIGl0IGFuZCBtb3Zl IG9uLg0KPiA+ID4gPiA+ID4gPiA+ICsgKi8NCj4gPiA+ID4gPiA+ID4gPiArd2hpbGUgKDEpIHsN Cj4gPiA+ID4gPiA+ID4gPiArdHhfbGFzdCA9IHN3X3JpbmdbdHhfaWRdLmxhc3RfaWQ7DQo+ID4g PiA+ID4gPiA+ID4gKw0KPiA+ID4gPiA+ID4gPiA+ICtpZiAoc3dfcmluZ1t0eF9sYXN0XS5tYnVm KSB7IGlmICghKHR4clt0eF9sYXN0XS53Yi5zdGF0dXMNCj4gPiA+ID4gPiA+ID4gPiArJg0KPiA+ ID4gPiA+ID4gPiA+ICtJWEdCRV9UWERfU1RBVF9ERCkpDQo+ID4gPiA+ID4gPiA+ID4gK2JyZWFr Ow0KPiA+ID4gPiA+ID4gPiA+ICsNCj4gPiA+ID4gPiA+ID4gPiArLyogR2V0IHRoZSBzdGFydCBv ZiB0aGUgbmV4dCBwYWNrZXQuICovIHR4X25leHQgPQ0KPiA+ID4gPiA+ID4gPiA+ICtzd19yaW5n W3R4X2xhc3RdLm5leHRfaWQ7DQo+ID4gPiA+ID4gPiA+ID4gKw0KPiA+ID4gPiA+ID4gPiA+ICsv Kg0KPiA+ID4gPiA+ID4gPiA+ICsgKiBMb29wIHRocm91Z2ggYWxsIHNlZ21lbnRzIGluIGENCj4g PiA+ID4gPiA+ID4gPiArICogcGFja2V0Lg0KPiA+ID4gPiA+ID4gPiA+ICsgKi8NCj4gPiA+ID4g PiA+ID4gPiArZG8gew0KPiA+ID4gPiA+ID4gPiA+ICtydGVfcGt0bWJ1Zl9mcmVlX3NlZyhzd19y aW5nW3R4X2lkXS5tYnVmKTsNCj4gPiA+ID4gPiA+ID4gPiArc3dfcmluZ1t0eF9pZF0ubWJ1ZiA9 IE5VTEw7IHN3X3JpbmdbdHhfaWRdLmxhc3RfaWQgPQ0KPiA+ID4gPiA+ID4gPiA+ICt0eF9pZDsN Cj4gPiA+ID4gPiA+ID4gPiArDQo+ID4gPiA+ID4gPiA+ID4gKy8qIE1vdmUgdG8gbmV4dCBzZWdt ZW50LiAqLyB0eF9pZCA9DQo+ID4gPiA+ID4gPiA+ID4gK3N3X3JpbmdbdHhfaWRdLm5leHRfaWQ7 DQo+ID4gPiA+ID4gPiA+ID4gKw0KPiA+ID4gPiA+ID4gPiA+ICt9IHdoaWxlICh0eF9pZCAhPSB0 eF9uZXh0KTsNCj4gPiA+ID4gPiA+ID4gPiArDQo+ID4gPiA+ID4gPiA+ID4gKy8qDQo+ID4gPiA+ ID4gPiA+ID4gKyAqIEluY3JlbWVudCB0aGUgbnVtYmVyIG9mIHBhY2tldHMNCj4gPiA+ID4gPiA+ ID4gPiArICogZnJlZWQuDQo+ID4gPiA+ID4gPiA+ID4gKyAqLw0KPiA+ID4gPiA+ID4gPiA+ICtj b3VudCsrOw0KPiA+ID4gPiA+ID4gPiA+ICsNCj4gPiA+ID4gPiA+ID4gPiAraWYgKHVubGlrZWx5 KGNvdW50ID09IChpbnQpZnJlZV9jbnQpKSBicmVhazsgfSBlbHNlIHsNCj4gPiA+ID4gPiA+ID4g PiArLyoNCj4gPiA+ID4gPiA+ID4gPiArICogVGhlcmUgYXJlIG11bHRpcGxlIHJlYXNvbnMgdG8g YmUgaGVyZToNCj4gPiA+ID4gPiA+ID4gPiArICogMSkgQWxsIHRoZSBwYWNrZXRzIG9uIHRoZSBy aW5nIGhhdmUgYmVlbg0KPiA+ID4gPiA+ID4gPiA+ICsgKiAgICBmcmVlZCAtIHR4X2lkIGlzIGVx dWFsIHRvIHR4X2ZpcnN0DQo+ID4gPiA+ID4gPiA+ID4gKyAqICAgIGFuZCBzb21lIHBhY2tldHMg aGF2ZSBiZWVuIGZyZWVkLg0KPiA+ID4gPiA+ID4gPiA+ICsgKiAgICAtIERvbmUsIGV4aXQNCj4g PiA+ID4gPiA+ID4gPiArICogMikgSW50ZXJmYWNlcyBoYXMgbm90IHNlbnQgYSByaW5ncyB3b3J0 aCBvZg0KPiA+ID4gPiA+ID4gPiA+ICsgKiAgICBwYWNrZXRzIHlldCwgc28gdGhlIHNlZ21lbnQg YWZ0ZXIgdGFpbCBpcw0KPiA+ID4gPiA+ID4gPiA+ICsgKiAgICBzdGlsbCBlbXB0eS4gT3IgYSBw cmV2aW91cyBjYWxsIHRvIHRoaXMNCj4gPiA+ID4gPiA+ID4gPiArICogICAgZnVuY3Rpb24gZnJl ZWQgc29tZSBvZiB0aGUgc2VnbWVudHMgYnV0DQo+ID4gPiA+ID4gPiA+ID4gKyAqICAgIG5vdCBh bGwgc28gdGhlcmUgaXMgYSBob2xlIGluIHRoZSBsaXN0Lg0KPiA+ID4gPiA+ID4gPiA+ICsgKiAg ICBIb3BlZnVsbHkgdGhpcyBpcyBhIHJhcmUgY2FzZS4NCj4gPiA+ID4gPiA+ID4gPiArICogICAg LSBXYWxrIHRoZSBsaXN0IGFuZCBmaW5kIHRoZSBuZXh0IG1idWYuIElmDQo+ID4gPiA+ID4gPiA+ ID4gKyAqICAgICAgdGhlcmUgaXNuJ3Qgb25lLCB0aGVuIGRvbmUuDQo+ID4gPiA+ID4gPiA+ID4g KyAqLw0KPiA+ID4gPiA+ID4gPiA+ICtpZiAobGlrZWx5KHR4X2lkID09IHR4X2ZpcnN0ICYmIGNv dW50ICE9IDApKSBicmVhazsNCj4gPiA+ID4gPiA+ID4gPiArDQo+ID4gPiA+ID4gPiA+ID4gKy8q DQo+ID4gPiA+ID4gPiA+ID4gKyAqIFdhbGsgdGhlIGxpc3QgYW5kIGZpbmQgdGhlIG5leHQgbWJ1 ZiwgaWYgYW55Lg0KPiA+ID4gPiA+ID4gPiA+ICsgKi8NCj4gPiA+ID4gPiA+ID4gPiArZG8gew0K PiA+ID4gPiA+ID4gPiA+ICsvKiBNb3ZlIHRvIG5leHQgc2VnbWVudC4gKi8gdHhfaWQgPQ0KPiA+ ID4gPiA+ID4gPiA+ICtzd19yaW5nW3R4X2lkXS5uZXh0X2lkOw0KPiA+ID4gPiA+ID4gPiA+ICsN Cj4gPiA+ID4gPiA+ID4gPiAraWYgKHN3X3JpbmdbdHhfaWRdLm1idWYpDQo+ID4gPiA+ID4gPiA+ ID4gK2JyZWFrOw0KPiA+ID4gPiA+ID4gPiA+ICsNCj4gPiA+ID4gPiA+ID4gPiArfSB3aGlsZSAo dHhfaWQgIT0gdHhfZmlyc3QpOw0KPiA+ID4gPiA+ID4gPiA+ICsNCj4gPiA+ID4gPiA+ID4gPiAr LyoNCj4gPiA+ID4gPiA+ID4gPiArICogRGV0ZXJtaW5lIHdoeSBwcmV2aW91cyBsb29wIGJhaWxl ZC4gSWYgdGhlcmUNCj4gPiA+ID4gPiA+ID4gPiArICogaXMgbm90IGFuIG1idWYsIGRvbmUuDQo+ ID4gPiA+ID4gPiA+ID4gKyAqLw0KPiA+ID4gPiA+ID4gPiA+ICtpZiAoc3dfcmluZ1t0eF9pZF0u bWJ1ZiA9PSBOVUxMKSBicmVhazsgfSB9DQo+ID4gPiA+ID4gPiA+ID4gKw0KPiA+ID4gPiA+ID4g PiA+ICtyZXR1cm4gY291bnQ7DQo+ID4gPiA+ID4gPiA+ID4gK30NCj4gPiA+ID4gPiA+ID4gPiAr DQo+ID4gPiA+ID4gPiA+ID4gIHN0YXRpYyB2b2lkIF9fYXR0cmlidXRlX18oKGNvbGQpKQ0KPiA+ ID4gPiA+ID4gPiA+IGl4Z2JlX3R4X2ZyZWVfc3dyaW5nKHN0cnVjdCBpeGdiZV90eF9xdWV1ZSAq dHhxKSAgeyBkaWZmDQo+ID4gPiA+ID4gPiA+ID4gLS1naXQgYS9kcml2ZXJzL25ldC9peGdiZS9p eGdiZV9yeHR4LmgNCj4gPiA+ID4gPiA+ID4gPiBiL2RyaXZlcnMvbmV0L2l4Z2JlL2l4Z2JlX3J4 dHguaCBpbmRleA0KPiA+ID4gPiA+ID4gPiA+IDUwNWQzNDRiOS4uMmMzNzcwYWY2DQo+ID4gPiA+ ID4gPiA+ID4gMTAwNjQ0DQo+ID4gPiA+ID4gPiA+ID4gLS0tIGEvZHJpdmVycy9uZXQvaXhnYmUv aXhnYmVfcnh0eC5oDQo+ID4gPiA+ID4gPiA+ID4gKysrIGIvZHJpdmVycy9uZXQvaXhnYmUvaXhn YmVfcnh0eC5oDQo+ID4gPiA+ID4gPiA+ID4gQEAgLTI4NSw2ICsyODUsOCBAQCBpbnQNCj4gPiA+ ID4gPiA+ID4gPiBpeGdiZV9yeF92ZWNfZGV2X2NvbmZfY29uZGl0aW9uX2NoZWNrKHN0cnVjdA0K PiA+ID4gPiA+ID4gPiA+IHJ0ZV9ldGhfZGV2ICpkZXYpOyAgaW50IGl4Z2JlX3J4cV92ZWNfc2V0 dXAoc3RydWN0DQo+ID4gPiA+ID4gPiA+ID4gaXhnYmVfcnhfcXVldWUgKnJ4cSk7ICB2b2lkDQo+ ID4gPiA+ID4gPiA+ID4gaXhnYmVfcnhfcXVldWVfcmVsZWFzZV9tYnVmc192ZWMoc3RydWN0DQo+ ID4gPiA+ID4gPiA+ID4gaXhnYmVfcnhfcXVldWUgKnJ4cSk7DQo+ID4gPiA+ID4gPiA+ID4NCj4g PiA+ID4gPiA+ID4gPiAraW50IGl4Z2JlX3R4X2RvbmVfY2xlYW51cCh2b2lkICp0eHEsIHVpbnQz Ml90IGZyZWVfY250KTsNCj4gPiA+ID4gPiA+ID4gPiArDQo+ID4gPiA+ID4gPiA+ID4gIGV4dGVy biBjb25zdCB1aW50MzJfdCBwdHlwZV90YWJsZVtJWEdCRV9QQUNLRVRfVFlQRV9NQVhdOw0KPiA+ ID4gPiA+ID4gPiA+ICBleHRlcm4gY29uc3QgdWludDMyX3QNCj4gPiA+ID4gPiA+ID4gPiBwdHlw ZV90YWJsZV90bltJWEdCRV9QQUNLRVRfVFlQRV9UTl9NQVhdOw0KPiA+ID4gPiA+ID4gPiA+DQo+ ID4gPiA+ID4gPiA+ID4gLS0NCj4gPiA+ID4gPiA+ID4gPiAyLjE3LjENCj4gPiA+ID4gPiA+ID4N Cj4gPiA+ID4gPiA+DQo+ID4gPiA+ID4NCj4gPiA+ID4NCj4gPiA+DQo+ID4NCj4gDQoNCg==