From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mails.dpdk.org (mails.dpdk.org [217.70.189.124]) by inbox.dpdk.org (Postfix) with ESMTP id ED0FAA04FD; Fri, 29 Jul 2022 12:47:02 +0200 (CEST) Received: from [217.70.189.124] (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id D465B4069C; Fri, 29 Jul 2022 12:47:02 +0200 (CEST) Received: from smartserver.smartsharesystems.com (smartserver.smartsharesystems.com [77.243.40.215]) by mails.dpdk.org (Postfix) with ESMTP id 1FD1840151 for ; Fri, 29 Jul 2022 12:47:01 +0200 (CEST) X-MimeOLE: Produced By Microsoft Exchange V6.5 Content-class: urn:content-classes:message MIME-Version: 1.0 Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: base64 Subject: RE: [RFC v2] non-temporal memcpy Date: Fri, 29 Jul 2022 12:46:59 +0200 Message-ID: <98CBD80474FA8B44BF855DF32C47DC35D8720C@smartserver.smartshare.dk> In-Reply-To: <2c646d01-14d0-e5cb-2d7c-50c8456fc3e5@yandex.ru> X-MS-Has-Attach: X-MS-TNEF-Correlator: Thread-Topic: [RFC v2] non-temporal memcpy Thread-Index: AdijMgXk1imAq/7NQEukoFOQX6h6jwAAJwkA References: <98CBD80474FA8B44BF855DF32C47DC35D871D4@smartserver.smartshare.dk> <98CBD80474FA8B44BF855DF32C47DC35D871DB@smartserver.smartshare.dk> <262c214b-7870-a221-2621-6684dce42823@yandex.ru> <98CBD80474FA8B44BF855DF32C47DC35D871E6@smartserver.smartshare.dk> <2c646d01-14d0-e5cb-2d7c-50c8456fc3e5@yandex.ru> From: =?UTF-8?B?TW9ydGVuIEJyw7hydXA=?= To: "Konstantin Ananyev" , , "Bruce Richardson" Cc: "Jan Viktorin" , "Ruifeng Wang" , "David Christensen" , "Stanislaw Kardach" X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org PiBGcm9tOiBLb25zdGFudGluIEFuYW55ZXYgW21haWx0bzprb25zdGFudGluLnYuYW5hbnlldkB5 YW5kZXgucnVdDQo+IFNlbnQ6IEZyaWRheSwgMjkgSnVseSAyMDIyIDEyLjAwDQo+IA0KPiAyNC8w Ny8yMDIyIDIzOjE4LCBNb3J0ZW4gQnLDuHJ1cCDQv9C40YjQtdGCOg0KPiA+PiBGcm9tOiBLb25z dGFudGluIEFuYW55ZXYgW21haWx0bzprb25zdGFudGluLnYuYW5hbnlldkB5YW5kZXgucnVdDQo+ ID4+IFNlbnQ6IFN1bmRheSwgMjQgSnVseSAyMDIyIDE1LjM1DQo+ID4+DQo+ID4+IDIyLzA3LzIw MjIgMTE6NDQsIE1vcnRlbiBCcsO4cnVwINC/0LjRiNC10YI6DQo+ID4+Pj4gRnJvbTogS29uc3Rh bnRpbiBBbmFueWV2IFttYWlsdG86a29uc3RhbnRpbi52LmFuYW55ZXZAeWFuZGV4LnJ1XQ0KPiA+ Pj4+IFNlbnQ6IEZyaWRheSwgMjIgSnVseSAyMDIyIDAxLjIwDQo+ID4+Pj4NCj4gPj4+PiBIaSBN b3J0ZW4sDQo+ID4+Pj4NCj4gPj4+Pj4gVGhpcyBSRkMgcHJvcG9zZXMgYSBzZXQgb2YgZnVuY3Rp b25zIG9wdGltaXplZCBmb3Igbm9uLXRlbXBvcmFsDQo+ID4+Pj4gbWVtb3J5IGNvcHkuDQo+ID4+ Pj4+DQo+ID4+Pj4+IEF0IHRoaXMgc3RhZ2UsIEkgYW0gYXNraW5nIGZvciBmZWVkYmFjayBvbiB0 aGUgY29uY2VwdC4NCj4gPj4+Pj4NCj4gPj4+Pj4gQXBwbGljYXRpb25zIHNvbWV0aW1lcyBkYXRh IHRvIGFub3RoZXIgbWVtb3J5IGxvY2F0aW9uLCB3aGljaCBpcw0KPiA+PiBvbmx5DQo+ID4+Pj4g dXNlZA0KPiA+Pj4+PiBtdWNoIGxhdGVyLg0KPiA+Pj4+PiBJbiB0aGlzIGNhc2UsIGl0IGlzIGlu ZWZmaWNpZW50IHRvIHBvbGx1dGUgdGhlIGRhdGEgY2FjaGUgd2l0aA0KPiB0aGUNCj4gPj4+PiBj b3BpZWQNCj4gPj4+Pj4gZGF0YS4NCj4gPj4+Pj4NCj4gPj4+Pj4gQW4gZXhhbXBsZSB1c2UgY2Fz ZSAob3JpZ2luYXRpbmcgZnJvbSBhIHJlYWwgbGlmZSBhcHBsaWNhdGlvbik6DQo+ID4+Pj4+IENv cHlpbmcgZmlsdGVyZWQgcGFja2V0cywgb3IgdGhlIGZpcnN0IHBhcnQgb2YgdGhlbSwgaW50byBh DQo+IGNhcHR1cmUNCj4gPj4+PiBidWZmZXINCj4gPj4+Pj4gZm9yIG9mZmxpbmUgYW5hbHlzaXMu DQo+ID4+Pj4+DQo+ID4+Pj4+IFRoZSBwdXJwb3NlIG9mIHRoZXNlIGZ1bmN0aW9ucyBpcyB0byBh Y2hpZXZlIGEgcGVyZm9ybWFuY2UgZ2Fpbg0KPiBieQ0KPiA+Pj4+IG5vdA0KPiA+Pj4+PiBwb2xs dXRpbmcgdGhlIGNhY2hlIHdoZW4gY29weWluZyBkYXRhLg0KPiA+Pj4+PiBBbHRob3VnaCB0aGUg dGhyb3VnaHB1dCBtYXkgYmUgaW1wcm92ZWQgYnkgZnVydGhlciBvcHRpbWl6YXRpb24sDQo+IEkN Cj4gPj4gZG8NCj4gPj4+PiBub3QNCj4gPj4+Pj4gY29uc2lkZXIgdGhyb3VncHV0IG9wdGltaXph dGlvbiByZWxldmFudCBpbml0aWFsbHkuDQo+ID4+Pj4+DQo+ID4+Pj4+IFRoZSB4ODYgbm9uLXRl bXBvcmFsIGxvYWQgaW5zdHJ1Y3Rpb25zIGhhdmUgMTYgYnl0ZSBhbGlnbm1lbnQNCj4gPj4+Pj4g cmVxdWlyZW1lbnRzIFsxXSwgd2hpbGUgQVJNIG5vbi10ZW1wb3JhbCBsb2FkIGluc3RydWN0aW9u cyBhcmUNCj4gPj4+PiBhdmFpbGFibGUgd2l0aA0KPiA+Pj4+PiA0IGJ5dGUgYWxpZ25tZW50IHJl cXVpcmVtZW50cyBbMl0uDQo+ID4+Pj4+IEJvdGggcGxhdGZvcm1zIG9mZmVyIG5vbi10ZW1wb3Jh bCBzdG9yZSBpbnN0cnVjdGlvbnMgd2l0aCA0IGJ5dGUNCj4gPj4+PiBhbGlnbm1lbnQNCj4gPj4+ Pj4gcmVxdWlyZW1lbnRzLg0KPiA+Pj4+Pg0KPiA+Pj4+PiBJbiBhZGRpdGlvbiB0byB0aGUgcHJp bWFyeSBmdW5jdGlvbiB3aXRob3V0IGFueSBhbGlnbm1lbnQNCj4gPj4+PiByZXF1aXJlbWVudHMs IHdlDQo+ID4+Pj4+IGFsc28gcHJvdmlkZSBmdW5jdGlvbnMgZm9yIHJlc3BlY3Rpdmx5IDE2IGFu ZCA0IGJ5dGUgYWxpZ25lZA0KPiBhY2Nlc3MNCj4gPj4+PiBmb3INCj4gPj4+Pj4gcGVyZm9ybWFu Y2UgcHVycG9zZXMuDQo+ID4+Pj4+DQo+ID4+Pj4+IFRoZSBmdW5jdGlvbiBuYW1lcyByZXNlbWJs ZSBzdGFuZGFyZCBDIGxpYnJhcnkgZnVuY3Rpb24gbmFtZXMsDQo+IGJ1dA0KPiA+Pj4+IHRoZWly DQo+ID4+Pj4+IHNpZ25hdHVyZXMgYXJlIGludGVudGlvbmFsbHkgZGlmZmVyZW50LiBObyBuZWVk IHRvIGRyYWcgbGVnYWN5DQo+IGludG8NCj4gPj4+PiBpdC4NCj4gPj4+Pj4NCj4gPj4+Pj4gTkI6 IERvbid0IGNvbW1lbnQgb24gc3BhY2VzIGZvciBpbmRlbnRhdGlvbjsgYSBwYXRjaCB3aWxsIGZv bGxvdw0KPiA+PiBEUERLDQo+ID4+Pj4gY29kaW5nDQo+ID4+Pj4+IHN0eWxlIGFuZCB1c2UgVEFC Lg0KPiA+Pj4+DQo+ID4+Pj4NCj4gPj4+PiBJIHRoaW5rIHRoZXJlIHdlcmUgZGlzY3Vzc2lvbnMg aW4gb3RoZXIgZGlyZWN0aW9uIC0gcmVtb3ZlDQo+ID4+IHJ0ZV9tZW1jcHkoKQ0KPiA+Pj4+IGNv bXBsZXRlbHkgYW5kIHVzZSBtZW1jcHkoKSBpbnN0ZWFkLi4uDQo+ID4+Pg0KPiA+Pj4gWWVzLCB0 aGUgaGlnaGx5IG9wdGltaXplZCBydGVfbWVtY3B5KCkgaW1wbGVtZW50YXRpb24gb2YgbWVtY3B5 KCkNCj4gaGFzDQo+ID4+IGJlY29tZSBvYnNvbGV0ZSwgbm93IHRoYXQgbW9kZXJuIGNvbXBpbGVy cyBwcm92aWRlIGFuIGVmZmljaWVudA0KPiA+PiBtZW1jcHkoKSBpbXBsZW1lbnRhdGlvbi4NCj4g Pj4+DQo+ID4+PiBJdCdzIGFuIGV4Y2VsbGVudCByZWZlcmVuY2UsIGJlY2F1c2Ugd2Ugc2hvdWxk IGxlYXJuIGZyb20gaXQsIGFuZA0KPiA+PiBhdm9pZCBpbnRyb2R1Y2luZyBzaW1pbGFyIG1pc3Rh a2VzIHdpdGggbm9uLXRlbXBvcmFsIG1lbWNweS4NCj4gPj4+DQo+ID4+Pj4gQnV0IGlmIHdlIGhh dmUgYSBnb29kIHVzZSBjYXNlIGZvciB0aGF0LCB0aGVuIEkgYW0gcG9zaXRpdmUgaW4NCj4gPj4+ PiBwcmluY2lwbGUuDQo+ID4+Pg0KPiA+Pj4gVGhlIHN0YW5kYXJkIEMgbGlicmFyeSBkb2Vzbid0 IG9mZmVyIG5vbi10ZW1wb3JhbCBtZW1jcHkoKSwgc28gd2UNCj4gPj4gbmVlZCB0byBpbXBsZW1l bnQgaXQgb3Vyc2VsdmVzLg0KPiA+Pj4NCj4gPj4+PiBUaG91Z2ggSSB0aGluayB3ZSBuZWVkIGEg Y2xlYXIgdXNlLWNhc2Ugd2l0aGluIGRwZGsgZm9yIGl0DQo+ID4+Pj4gdG8gZGVtb25zdHJhdGUg cGVyZm9tYW5jZSBnYWluLg0KPiA+Pj4NCj4gPj4+IFRoZSBwZXJmb3JtYW5jZSBnYWluIGlzIHRv IGF2b2lkIHBvbGx1dGluZyB0aGUgZGF0YSBjYWNoZS4gRFBESw0KPiA+PiBleGFtcGxlIGFwcGxp Y2F0aW9ucywgbGlrZSBsM2Z3ZCwgYXJlIHByb2JhYmx5IHRvbyBwcmltaXRpdmUgdG8NCj4gbWVh c3VyZQ0KPiA+PiBhbnkgYmVuZWZpdCBpbiB0aGlzIHJlZ2FyZC4NCj4gPj4+DQo+ID4+Pj4gUHJv YmFibHkgY29weWluZyBwYWNrZXRzIHdpdGhpbiBwZHVtcCBsaWIsIG9yIGV4YW1wbGVzL2RtYS4g b3IgLi4uDQo+ID4+Pg0KPiA+Pj4gR29vZCBwb2ludCAtIHRoZSBuZXcgZnVuY3Rpb25zIHNob3Vs ZCBiZSB1c2VkIHNvbWV3aGVyZSB3aXRoaW4NCj4gRFBESy4NCj4gPj4gRm9yIHRoaXMgcHVycG9z ZSwgSSB3aWxsIGxvb2sgaW50byBtb2RpZnlpbmcgcnRlX3BrdG1idWZfY29weSgpLA0KPiB3aGlj aA0KPiA+PiBpcyB1c2VkIGJ5IHBkdW1wX2NvcHkoKSwgdG8gdXNlIG5vbi10ZW1wb3JhbCBjb3B5 aW5nIG9mIHRoZSBwYWNrZXQNCj4gPj4gZGF0YS4NCj4gPj4+DQo+ID4+Pj4gQW5vdGhlciB0aG91 Z2h0IC0gZG8gd2UgcmVhbGx5IG5lZWQgYSBzZXBhcmF0ZSBpbmxpbmUgZnVuY3Rpb24gZm9yDQo+ ID4+IGVhY2gNCj4gPj4+PiBmbGF2b3VyPw0KPiA+Pj4+IE1pZ2h0IGJlIGp1c3Qgb25lIG5vbi1p bmxpbmUgcnRlX21lbWNweV9udChkc3QsIHNyYywgc2l6ZSwgZmxhZ3MpLA0KPiA+Pj4+IHdoZXJl IGZsYWdzIGNvdWxkIGJlIGNvbWJpbmF0aW9uIG9mIE5UX1NSQywgTlRfRFNULCBhbmQga2VlcA0K PiA+PiBhbGlnbm1lbnQNCj4gPj4+PiBkZXRlY3Rpb24vZGVjaXNpb25zIHRvIHBhcnRpY3VsYXIg aW1wbGVtZW50YXRpb24/DQo+ID4+Pg0KPiA+Pj4gVGhhbmsgeW91IGZvciB0aGUgZmVlZGJhY2ss IEtvbnN0YW50aW4uDQo+ID4+Pg0KPiA+Pj4gTXkgYW5zd2VyIHRvIHRoaXMgc3VnZ2VzdGlvbiBn ZXRzIGEgbGl0dGxlIGxvbmd3aW5kZWQuLi4NCj4gPj4+DQo+ID4+PiBMb29raW5nIGF0IHRoZSBE UERLIHBjYXBuZyBsaWJyYXJ5LCBpdCBjb3BpZXMgYSA0IGJ5dGUgYWxpZ25lZA0KPiA+PiBtZXRh ZGF0YSBzdHJ1Y3R1cmUgc2l6ZWQgMjggYnl0ZS4gU28gaXQgY2FuIGRvIHdpdGggNCBieXRlIGFs aWduZWQNCj4gPj4gZnVuY3Rpb25zLg0KPiA+Pj4NCj4gPj4+IE91ciBhcHBsaWNhdGlvbiBjYW4g Y2FwdHVyZSBwYWNrZXRzIHN0YXJ0aW5nIGF0IHRoZSBJUCBoZWFkZXIsDQo+IHdoaWNoDQo+ID4+ IGlzIG9mZnNldCBieSAxNCBieXRlIChFdGhlcm5ldCBoZWFkZXIgc2l6ZSkgZnJvbSB0aGUgcGFj a2V0IGJ1ZmZlciwNCj4gc28NCj4gPj4gaXQgcmVxdWlyZXMgMiBieXRlIGFsaWdubWVudC4gQW5k IHRodXMsIHJlcXVpcmluZyA0IGJ5dGUgYWxpZ25tZW50DQo+IGlzDQo+ID4+IG5vdCBhY2NlcHRh YmxlLg0KPiA+Pj4NCj4gPj4+IE91ciBhcHBsaWNhdGlvbiB1c2VzIDE2IGJ5dGUgYWxpZ25tZW50 IGluIHRoZSBjYXB0dXJlIGJ1ZmZlciBhcmVhLA0KPiA+PiBhbmQgY2FuIGJlbmVmaXQgZnJvbSAx NiBieXRlIGFsaWduZWQgZnVuY3Rpb25zLiBGdXJ0aGVybW9yZSwgeDg2DQo+ID4+IHByb2Nlc3Nv cnMgcmVxdWlyZSAxNiBieXRlIGFsaWdubWVudCBmb3Igbm9uLXRlbXBvcmFsIGxvYWQNCj4gPj4g aW5zdHJ1Y3Rpb25zLCBzbyBJIHRoaW5rIGEgMTYgYnl0ZSBhbGlnbmVkIG5vbi10ZW1wb3JhbCBt ZW1jcHkNCj4gZnVuY3Rpb24NCj4gPj4gc2hvdWxkIGJlIG9mZmVyZWQuDQo+ID4+DQo+ID4+DQo+ ID4+IFllcywgeDg2IG5lZWRzIDE2QiBhbGlnbm1lbnQgZm9yIE5UIGxvYWQvc3RvcmVzDQo+ID4+ IEJ1dCB0aGF0J3Mgc3VwcG9zZWQgdG8gYmUgYXJjaCBzcGVjaWZpYyBsaW1pdGF0aW9uLA0KPiA+ PiB0aGF0IHdlIHByb2JhYmx5IHdhbnQgdG8gaGlkZSwgbm8/DQo+ID4NCj4gPiBBZ3JlZS4NCj4g Pg0KPiA+PiBJbnNpZGUgdGhlIGZ1bmN0aW9uIGNhbiBjaGVjayBhbGlnbm1lbnQgb2YgYm90aCBz cmMgYW5kIGRzdA0KPiA+PiBhbmQgZGVjaWRlIHNob3VsZCBpdCB1c2UgTlQgbG9hZC9zdG9yZSBp bnN0cnVjdGlvbnMgb3IganVzdA0KPiA+PiBkbyBub3JtYWwgY29weS4NCj4gPg0KPiA+IFllcywg SSdtIGV4cGVyaW1lbnRpbmcgd2l0aCB0aGUgeDg2IGlubGluZSBmdW5jdGlvbiBzaG93biBiZWxv dy4gQW5kDQo+IGhvcGVmdWxseSwgd2l0aCBzb21lICJleHRlcm4gaW5saW5lIiBvciBvdGhlciBt YWdpYywgSSBjYW4gaGlkZSB0aGUNCj4gZGlmZmVyZW50IGltcGxlbWVudGF0aW9ucyBpbiB0aGUg YXJjaCBzcGVjaWZpYyBoZWFkZXJzLCBhbmQgb25seSBleHBvc2UNCj4gdGhlIGZ1bmN0aW9uIGRl Y2xhcmF0aW9uIG9mIHJ0ZV9tZW1jcHlfbnQoKSBpbiB0aGUgY29tbW9uIGhlYWRlci4NCj4gPg0K PiA+IEknbSBjdXJyZW50bHkgd29ya2luZyBvbiB0aGUgeDg2IGltcGxlbWVudGF0aW9uIC0gd2hl biBJJ20gc2F0aXNmaWVkDQo+IHdpdGggdGhhdCwgSSdsbCBsb29rIGludG8gaG93IHRvIGhpZGUg dGhlIGltcGxlbWVudGF0aW9ucyBpbiB0aGUgYXJjaA0KPiBzcGVjaWZpYyBoZWFkZXIgZmlsZXMs IGFuZCBvbmx5IGV4cG9zZSB0aGUgY29tbW9uIGZ1bmN0aW9uIGRlY2xhcmF0aW9uDQo+IGluIHRo ZSBnZW5lcmljIGhlYWRlciBmaWxlIGFsc28gdXNlZCBmb3IgZG9jdW1lbnRhdGlvbi4gSSB3b3Jr cyBmb3INCj4gcnRlX21lbWNweSgpLCBzbyBJIGNhbiBwcm9iYWJseSBmaW5kIHRoZSB3YXkgdG8g ZG8gaXQgdGhlcmUuDQo+ID4NCj4gPiAvKg0KPiA+ICAgKiBOb24tVGVtcG9yYWwgTWVtb3J5IE9w ZXJhdGlvbnMgRmxhZ3MuDQo+ID4gICAqLw0KPiA+DQo+ID4gI2RlZmluZSBSVEVfTUVNT1BTX0Zf TEVOQV9NQVNLICAoVUlOVDY0X0MoMHhGRSkgPDwgMCkgICAvKiogTGVuZ3RoDQo+IGFsaWdubWVu dCBtYXNrLiAqLw0KPiA+ICNkZWZpbmUgUlRFX01FTU9QU19GX0xFTjJBICAgICAgKFVJTlQ2NF9D KDIpIDw8IDApICAgICAgLyoqIExlbmd0aCBpcw0KPiAyIGJ5dGUgYWxpZ25lZC4gKi8NCj4gPiAj ZGVmaW5lIFJURV9NRU1PUFNfRl9MRU40QSAgICAgIChVSU5UNjRfQyg0KSA8PCAwKSAgICAgIC8q KiBMZW5ndGggaXMNCj4gNCBieXRlIGFsaWduZWQuICovDQo+ID4gI2RlZmluZSBSVEVfTUVNT1BT X0ZfTEVOOEEgICAgICAoVUlOVDY0X0MoOCkgPDwgMCkgICAgICAvKiogTGVuZ3RoIGlzDQo+IDgg Ynl0ZSBhbGlnbmVkLiAqLw0KPiA+ICNkZWZpbmUgUlRFX01FTU9QU19GX0xFTjE2QSAgICAgKFVJ TlQ2NF9DKDE2KSA8PCAwKSAgICAgLyoqIExlbmd0aCBpcw0KPiAxNiBieXRlIGFsaWduZWQuICov DQo+ID4gI2RlZmluZSBSVEVfTUVNT1BTX0ZfTEVOMzJBICAgICAoVUlOVDY0X0MoMzIpIDw8IDAp ICAgICAvKiogTGVuZ3RoIGlzDQo+IDMyIGJ5dGUgYWxpZ25lZC4gKi8NCj4gPiAjZGVmaW5lIFJU RV9NRU1PUFNfRl9MRU42NEEgICAgIChVSU5UNjRfQyg2NCkgPDwgMCkgICAgIC8qKiBMZW5ndGgg aXMNCj4gNjQgYnl0ZSBhbGlnbmVkLiAqLw0KPiA+ICNkZWZpbmUgUlRFX01FTU9QU19GX0xFTjEy OEEgICAgKFVJTlQ2NF9DKDEyOCkgPDwgMCkgICAgLyoqIExlbmd0aCBpcw0KPiAxMjggYnl0ZSBh bGlnbmVkLiAqLw0KPiA+DQo+ID4gI2RlZmluZSBSVEVfTUVNT1BTX0ZfRFNUQV9NQVNLICAoVUlO VDY0X0MoMHhGRSkgPDwgOCkgICAvKioNCj4gRGVzdGluYXRpb24gYWRkcmVzcyBhbGlnbm1lbnQg bWFzay4gKi8NCj4gPiAjZGVmaW5lIFJURV9NRU1PUFNfRl9EU1QyQSAgICAgIChVSU5UNjRfQygy KSA8PCA4KSAgICAgIC8qKg0KPiBEZXN0aW5hdGlvbiBhZGRyZXNzIGlzIDIgYnl0ZSBhbGlnbmVk LiAqLw0KPiA+ICNkZWZpbmUgUlRFX01FTU9QU19GX0RTVDRBICAgICAgKFVJTlQ2NF9DKDQpIDw8 IDgpICAgICAgLyoqDQo+IERlc3RpbmF0aW9uIGFkZHJlc3MgaXMgNCBieXRlIGFsaWduZWQuICov DQo+ID4gI2RlZmluZSBSVEVfTUVNT1BTX0ZfRFNUOEEgICAgICAoVUlOVDY0X0MoOCkgPDwgOCkg ICAgICAvKioNCj4gRGVzdGluYXRpb24gYWRkcmVzcyBpcyA4IGJ5dGUgYWxpZ25lZC4gKi8NCj4g PiAjZGVmaW5lIFJURV9NRU1PUFNfRl9EU1QxNkEgICAgIChVSU5UNjRfQygxNikgPDwgOCkgICAg IC8qKg0KPiBEZXN0aW5hdGlvbiBhZGRyZXNzIGlzIDE2IGJ5dGUgYWxpZ25lZC4gKi8NCj4gPiAj ZGVmaW5lIFJURV9NRU1PUFNfRl9EU1QzMkEgICAgIChVSU5UNjRfQygzMikgPDwgOCkgICAgIC8q Kg0KPiBEZXN0aW5hdGlvbiBhZGRyZXNzIGlzIDMyIGJ5dGUgYWxpZ25lZC4gKi8NCj4gPiAjZGVm aW5lIFJURV9NRU1PUFNfRl9EU1Q2NEEgICAgIChVSU5UNjRfQyg2NCkgPDwgOCkgICAgIC8qKg0K PiBEZXN0aW5hdGlvbiBhZGRyZXNzIGlzIDY0IGJ5dGUgYWxpZ25lZC4gKi8NCj4gPiAjZGVmaW5l IFJURV9NRU1PUFNfRl9EU1QxMjhBICAgIChVSU5UNjRfQygxMjgpIDw8IDgpICAgIC8qKg0KPiBE ZXN0aW5hdGlvbiBhZGRyZXNzIGlzIDEyOCBieXRlIGFsaWduZWQuICovDQo+ID4NCj4gPiAjZGVm aW5lIFJURV9NRU1PUFNfRl9TUkNBX01BU0sgIChVSU5UNjRfQygweEZFKSA8PCAxNikgIC8qKiBT b3VyY2UNCj4gYWRkcmVzcyBhbGlnbm1lbnQgbWFzay4gKi8NCj4gPiAjZGVmaW5lIFJURV9NRU1P UFNfRl9TUkMyQSAgICAgIChVSU5UNjRfQygyKSA8PCAxNikgICAgIC8qKiBTb3VyY2UNCj4gYWRk cmVzcyBpcyAyIGJ5dGUgYWxpZ25lZC4gKi8NCj4gPiAjZGVmaW5lIFJURV9NRU1PUFNfRl9TUkM0 QSAgICAgIChVSU5UNjRfQyg0KSA8PCAxNikgICAgIC8qKiBTb3VyY2UNCj4gYWRkcmVzcyBpcyA0 IGJ5dGUgYWxpZ25lZC4gKi8NCj4gPiAjZGVmaW5lIFJURV9NRU1PUFNfRl9TUkM4QSAgICAgIChV SU5UNjRfQyg4KSA8PCAxNikgICAgIC8qKiBTb3VyY2UNCj4gYWRkcmVzcyBpcyA4IGJ5dGUgYWxp Z25lZC4gKi8NCj4gPiAjZGVmaW5lIFJURV9NRU1PUFNfRl9TUkMxNkEgICAgIChVSU5UNjRfQygx NikgPDwgMTYpICAgIC8qKiBTb3VyY2UNCj4gYWRkcmVzcyBpcyAxNiBieXRlIGFsaWduZWQuICov DQo+ID4gI2RlZmluZSBSVEVfTUVNT1BTX0ZfU1JDMzJBICAgICAoVUlOVDY0X0MoMzIpIDw8IDE2 KSAgICAvKiogU291cmNlDQo+IGFkZHJlc3MgaXMgMzIgYnl0ZSBhbGlnbmVkLiAqLw0KPiA+ICNk ZWZpbmUgUlRFX01FTU9QU19GX1NSQzY0QSAgICAgKFVJTlQ2NF9DKDY0KSA8PCAxNikgICAgLyoq IFNvdXJjZQ0KPiBhZGRyZXNzIGlzIDY0IGJ5dGUgYWxpZ25lZC4gKi8NCj4gPiAjZGVmaW5lIFJU RV9NRU1PUFNfRl9TUkMxMjhBICAgIChVSU5UNjRfQygxMjgpIDw8IDE2KSAgIC8qKiBTb3VyY2UN Cj4gYWRkcmVzcyBpcyAxMjggYnl0ZSBhbGlnbmVkLiAqLw0KPiA+DQo+ID4gLyoqDQo+ID4gICAq IEB3YXJuaW5nDQo+ID4gICAqIEBiIEVYUEVSSU1FTlRBTDogdGhpcyBBUEkgbWF5IGNoYW5nZSB3 aXRob3V0IHByaW9yIG5vdGljZS4NCj4gPiAgICoNCj4gPiAgICogTm9uLXRlbXBvcmFsIG1lbW9y eSBjb3B5Lg0KPiA+ICAgKiBUaGUgbWVtb3J5IGFyZWFzIG11c3Qgbm90IG92ZXJsYXAuDQo+ID4g ICAqDQo+ID4gICAqIEBub3RlDQo+ID4gICAqIElmIHRoZSBkZXN0aW5hdGlvbiBhbmQvb3IgbGVu Z3RoIGlzIHVuYWxpZ25lZCwgc29tZSBjb3BpZWQgYnl0ZXMNCj4gd2lsbCBiZQ0KPiA+ICAgKiBz dG9yZWQgaW4gdGhlIGRlc3RpbmF0aW9uIG1lbW9yeSBhcmVhIHVzaW5nIHRlbXBvcmFsIGFjY2Vz cy4NCj4gPiAgICoNCj4gPiAgICogQHBhcmFtIGRzdA0KPiA+ICAgKiAgIFBvaW50ZXIgdG8gdGhl IG5vbi10ZW1wb3JhbCBkZXN0aW5hdGlvbiBtZW1vcnkgYXJlYS4NCj4gPiAgICogQHBhcmFtIHNy Yw0KPiA+ICAgKiAgIFBvaW50ZXIgdG8gdGhlIG5vbi10ZW1wb3JhbCBzb3VyY2UgbWVtb3J5IGFy ZWEuDQo+ID4gICAqIEBwYXJhbSBsZW4NCj4gPiAgICogICBOdW1iZXIgb2YgYnl0ZXMgdG8gY29w eS4NCj4gPiAgICogQHBhcmFtIGZsYWdzDQo+ID4gICAqICAgSGludHMgZm9yIG1lbW9yeSBhY2Nl c3MuDQo+ID4gICAqICAgQW55IG9mIHRoZSBSVEVfTUVNT1BTX0ZfTEVObkEsIFJURV9NRU1PUFNf Rl9EU1RuQSwNCj4gUlRFX01FTU9QU19GX1NSQ25BIGZsYWdzLg0KPiA+ICAgKi8NCj4gPiBfX3J0 ZV9leHBlcmltZW50YWwNCj4gPiBzdGF0aWMgX19ydGVfYWx3YXlzX2lubGluZQ0KPiA+IF9fYXR0 cmlidXRlX18oKF9fbm9ubnVsbF9fKDEsIDIpLCBfX2FjY2Vzc19fKHdyaXRlX29ubHksIDEsIDMp LA0KPiBfX2FjY2Vzc19fKHJlYWRfb25seSwgMiwgMykpKQ0KPiA+IHZvaWQgcnRlX21lbWNweV9u dCh2b2lkICogX19ydGVfcmVzdHJpY3QgZHN0LCBjb25zdCB2b2lkICoNCj4gX19ydGVfcmVzdHJp Y3Qgc3JjLCBzaXplX3QgbGVuLA0KPiA+ICAgICAgICAgIGNvbnN0IHVpbnQ2NF90IGZsYWdzKQ0K PiA+IHsNCj4gPiAgICAgIGlmIChfX2J1aWx0aW5fY29uc3RhbnRfcChmbGFncykgPw0KPiA+ICAg ICAgICAgICAgICAoKGZsYWdzICYgUlRFX01FTU9QU19GX0xFTkFfTUFTSykgPj0gUlRFX01FTU9Q U19GX0xFTjE2QQ0KPiAmJg0KPiA+ICAgICAgICAgICAgICAoZmxhZ3MgJiBSVEVfTUVNT1BTX0Zf RFNUQV9NQVNLKSA+PSBSVEVfTUVNT1BTX0ZfRFNUMTZBKQ0KPiA6DQo+ID4gICAgICAgICAgICAg ICEoKCh1aW50cHRyX3QpZHN0IHwgbGVuKSAmICgxNiAtIDEpKSkgew0KPiA+ICAgICAgICAgIGlm IChfX2J1aWx0aW5fY29uc3RhbnRfcChmbGFncykgPw0KPiA+ICAgICAgICAgICAgICAgICAgKGZs YWdzICYgUlRFX01FTU9QU19GX1NSQ0FfTUFTSykgPj0NCj4gUlRFX01FTU9QU19GX1NSQzE2QSA6 DQo+ID4gICAgICAgICAgICAgICAgICAhKCh1aW50cHRyX3Qpc3JjICYgKDE2IC0gMSkpKQ0KPiA+ ICAgICAgICAgICAgICBydGVfbWVtY3B5X250MTZhKGRzdCwgc3JjLCBsZW4vKiwgZmxhZ3MqLyk7 DQo+ID4gICAgICAgICAgZWxzZQ0KPiA+ICAgICAgICAgICAgICBydGVfbWVtY3B5X250MTZkbGEo ZHN0LCBzcmMsIGxlbi8qLCBmbGFncyovKTsNCj4gPiAgICAgIH0NCj4gPiAgICAgIGVsc2UgaWYg KF9fYnVpbHRpbl9jb25zdGFudF9wKGZsYWdzKSA/ICgNCj4gPiAgICAgICAgICAgICAgKGZsYWdz ICYgUlRFX01FTU9QU19GX0xFTkFfTUFTSykgPj0gUlRFX01FTU9QU19GX0xFTjRBDQo+ICYmDQo+ ID4gICAgICAgICAgICAgIChmbGFncyAmIFJURV9NRU1PUFNfRl9EU1RBX01BU0spID49IFJURV9N RU1PUFNfRl9EU1Q0QQ0KPiAmJg0KPiA+ICAgICAgICAgICAgICAoZmxhZ3MgJiBSVEVfTUVNT1BT X0ZfU1JDQV9NQVNLKSA+PSBSVEVfTUVNT1BTX0ZfU1JDNEEpDQo+IDoNCj4gPiAgICAgICAgICAg ICAgISgoKHVpbnRwdHJfdClkc3QgfCAodWludHB0cl90KXNyYyB8IGxlbikgJiAoNCAtIDEpKSkg ew0KPiA+ICAgICAgICAgIHJ0ZV9tZW1jcHlfbnQ0YShkc3QsIHNyYywgbGVuLyosIGZsYWdzKi8p Ow0KPiA+ICAgICAgfQ0KPiA+ICAgICAgZWxzZQ0KPiA+ICAgICAgICAgIHJ0ZV9tZW1jcHlfbnRf dW5hbGlnbmVkKGRzdCwgc3JjLCBsZW4vKiwgZmxhZ3MqLyk7DQo+ID4gfQ0KPiANCj4gDQo+IERv IHdlIHJlYWxseSBuZWVkIHRvIGV4cG9zZSBhbGwgdGhlc2UgZG96ZW4gZmxhZ3M/DQo+IE15IHRo b3VnaHQgYXQgbGVhc3QgYWJvdXQgeDg2IGltcGxlbWVudGFpb24gd2FzIGFib3V0IHNvbWV0aGlu ZyBtb3JlDQo+IHNpbXBsZSBsaWtlOg0KPiB2b2lkIHJ0ZV9tZW1jcHlfbnQodm9pZCAqIF9fcnRl X3Jlc3RyaWN0IGRzdCwNCj4gCWNvbnN0IHZvaWQgKiBfX3J0ZV9yZXN0cmljdCBzcmMsIHNpemVf dCBsZW4sDQo+IAljb25zdCB1aW50NjRfdCBmbGFncykNCj4gew0KPiANCj4gCWlmIChmbGFncyA9 PSAoU1JDX05UIHwgRFNUX05UKSAmJiAoKGRzdCB8IHNyYykgJiAweGYpID09IDApIHsNCj4gCQlf ZG9fbnRfc3JjX250X2RzdF9udCguLi4pOw0KPiAJfSBlbHNlIGlmIChmbGFncyA9PSBEU1RfTlQg JiYgKGRzdCAmIDB4ZikgPT0gMCkgew0KPiAJCV9kb19zcmNfbmFfZHN0X250KC4uLik7DQo+IAl9 IGVsc2UgaWYgKGZsYWdzID09IFNSQ19OVCAmJiAoc3JjICYgMHhmKSA9PSAwKSB7DQo+IAkJX2Rv X3NyY19udF9kc3RfbmEoLi4uKTsNCj4gCX0gZWxzZQ0KPiAJCW1lbWNweShkc3QsIHNyYywgbGVu KTsNCj4gfQ0KDQpUaGUgY29tYmluYXRpb24gb2YgZmxhZ3MsIGlubGluZSBhbmQgX19idWlsdGlu X2NvbnN0YW50X3AoKSBhbGxvd3MgdGhlIGNvbXBpbGVyIHRvIHByb2R1Y2UgemVyby1vdmVyaGVh ZCBjb2RlLiBXaXRob3V0IGl0LCB0aGUgcmVzdWx0aW5nIGNvZGUgd2lsbCBjb250YWluIGEgYnVu Y2ggb2YgcnVuLXRpbWUgYml0bWFzayBjb21wYXJpc29ucyBhbmQgYnJhbmNoZXMgdG8gZGV0ZXJt aW5lIHRoZSB1bHRpbWF0ZSBjb3B5IGZ1bmN0aW9uLiBPbiB4ODYgdGhlcmUgYXJlIG5vdCBvbmx5 IDE2IGJ5dGUsIGJ1dCBhbHNvIDQgYnl0ZSBhbGlnbm1lbnQgdmFyaWFudHMgb2Ygbm9uLXRlbXBv cmFsIHN0b3JlLiBUaGUgYmVhdXR5IG9mIGl0IHdpbGwgYmUgbW9yZSBvYnZpb3VzIHdoZW4gdGhl IHBhdGNoIGlzIHJlYWR5Lg0KDQpBbmQgaW4gbXkgY3VycmVudCB3b3JraW5nIHZlcnNpb24gKG5v dCB0aGUgY29kZSBwcm92aWRlZCBoZXJlKSwgdGhlIGZsYWdzIGFyZSBoaW50cywgc28gdXNpbmcg dGhlbSB3aWxsIGJlIG9wdGlvbmFsLiBUaGUgZnVuY3Rpb24gaGVhZGVycyB3aWxsIGxvb2sgcm91 Z2hseSBsaWtlIHRoaXM6DQoNCnN0YXRpYyBpbmxpbmUgdm9pZCBydGVfbWVtY3B5X250X2V4KA0K CQl2b2lkICogZHN0LCBjb25zdCB2b2lkICogc3JjLA0KCQlzaXplX3QgbGVuLCB1aW50NjRfdCBm bGFncyk7DQoNCnN0YXRpYyBpbmxpbmUgdm9pZCBydGVfbWVtY3B5X250KA0KCQl2b2lkICogZHN0 LCBjb25zdCB2b2lkICogc3JjLA0KCQlzaXplX3QgbGVuKSANCnsNCglydGVfbWVtY3B5X250X2V4 KGRzdCwgc3JjLCBsZW4sIDApOw0KfQ0KDQpJIG1pZ2h0IGFkZCBhbiBfZXggcG9zdGZpeCB2YXJp YW50IG9mIHRoZSBtYnVmIHBhY2tldCBub24tdGVtcG9yYWwgY29weSBmdW5jdGlvbiB0b28sIGJ1 dCBJJ20gbm90IHdvcmtpbmcgb24gdGhhdCBmdW5jdGlvbiB5ZXQsIHNvIEkgZG9uJ3QgeWV0IGtu b3cgaWYgaXQgbWFrZXMgc2Vuc2Ugb3Igbm90Lg0KDQpNeSBjb25jZXB0IGZvciBidWlsZCB0aW1l IGFsaWdubWVudCBoaW50cyBjYW4gYWxzbyBiZSBjb3BpZWQgaW50byBhbiBydGVfbWVtY3B5X2V4 KCkgZnVuY3Rpb24gZm9yIGltcHJvdmVkIHBlcmZvcm1hbmNlLiBCdXQgSSBkb24ndCB3YW50IG15 IHBhdGNoIHRvIGV4cGFuZCB0b28gbXVjaCBvdXRzaWRlIGl0cyBpbml0aWFsIHNjb3BlLCBzbyBJ IHdpbGwgbm90IG1vZGlmeSBydGVfbWVtY3B5KCkgd2l0aCB0aGlzIHBhdGNoLg0KDQpBbHRlcm5h dGl2ZWx5LCBJIGNvdWxkIHByb3ZpZGUgcnRlX21lbWNweV9leChkLHMsbCxmbGFncykgaW5zdGVh ZCBvZiBydGVfbWVtY3B5X250W19leF0oKSwgYW5kIHVzZSB0aGUgZmxhZ3MgdG8gaW5kaWNhdGUg bm9uLXRlbXBvcmFsIHNvdXJjZSBhbmQgZGVzdGluYXRpb24uDQoNClRoaXMgaXMgb25seSBhIHF1 ZXN0aW9uIGFib3V0IHdoaWNoIEFQSSB0aGUgY29tbXVuaXR5IHByZWZlcnMuIEkgd2lsbCBub3Qg Y2hhbmdlIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiBydGVfbWVtY3B5KCkgd2l0aCB0aGlzIHBhdGNo IC0gaXQncyBhbm90aGVyIGpvYiB0byBkbyB0aGF0Lg0KDQo+IA0KPiA+DQo+ID4NCj4gPj4NCj4g Pj4NCj4gPj4+IFdoaWxlIHdvcmtpbmcgb24gdGhlc2UgZnVudGlvbnMsIEkgZXhwZXJpbWVudGVk IHdpdGggYW4NCj4gPj4gcnRlX21lbWNweV9udCgpIHRha2luZyBmbGFncywgd2hpY2ggaXMgYWxz byBteSBwZXJzb25hbCBwcmVmZXJlbmNlLA0KPiBidXQNCj4gPj4gaGF2ZW4ndCBzdWNjZWVkIHll dC4gRXNwZWNpYWxseSB3aGVuIGNvcHlpbmcgYSAxNiBieXRlIGFsaWduZWQNCj4gPj4gc3RydWN0 dXJlIG9mIG9ubHkgMTYgYnl0ZSwgdGhlIG92ZXJoZWFkIG9mIHRoZSBmdW5jdGlvbiBjYWxsICsN Cj4gPj4gY29tcGFyaW5nIHRoZSBmbGFncyArIHRoZSBjb3B5IGxvb3Agb3ZlcmhlYWQgaXMgc2ln bmlmaWNhbnQsDQo+IGNvbXBhcmVkDQo+ID4+IHRvIGlubGluZSBjb2RlIGNvbnNpc3Rpbmcgb2Yg b25seSBvbmUgcGFpciBvZiAibW92bnRkcWENCj4gKCVyc2kpLCV4bW0wOw0KPiA+PiBtb3ZudGRx ICV4bW0wLCglcmRpKSIgaW5zdHJ1Y3Rpb25zLg0KPiA+Pj4NCj4gPj4+IFJlbWVtYmVyIHRoYXQg YSBub24taW5saW5lZCBydGVfbWVtY3B5X250KCkgd2lsbCBiZSBjYWxsZWQgd2l0aA0KPiB2ZXJ5 DQo+ID4+IHZhcnlpbmcgc2l6ZSwgZHVlIHRvIHRoZSB0eXBpY2FsIG1peCBvZiBzbWFsbCBhbmQg YmlnIHBhY2tldHMsIHNvDQo+ID4+IGJyYW5jaCBwcmVkaWN0aW9uIHdpbGwgbm90IGhlbHAuDQo+ ID4+Pg0KPiA+Pj4gVGhpcyBSRkMgZG9lcyBub3QgeWV0IHNob3cgdGhlIHJ0ZV9tZW1jcHlfbnQo KSBmdW5jdGlvbiBoYW5kbGluZw0KPiA+PiB1bmFsaWduZWQgbG9hZC9zdG9yZSwgYnV0IGl0IGlz IG1vcmUgY29tcGxleCB0aGFuIHRoZSBhbGlnbmVkDQo+ID4+IGZ1bmN0aW9ucy4gU28gSSB0aGlu ayB0aGUgYWxpZ25lZCB2YXJpYW50cyBhcmUgd2FycmFudGVkIC0gZm9yDQo+ID4+IHBlcmZvcm1h bmNlIHJlYXNvbnMuDQo+ID4+Pg0KPiA+Pj4gU29tZSBvZiB0aGUgbmVlZCBmb3IgZXhwb3Npbmcg aW5kaXZpZHVhbCBmdW5jdGlvbnMgZm9yIGRpZmZlcmVudA0KPiA+PiBhbGlnbm1lbnQgc3RlbXMg ZnJvbSB0aGUgY29tcGlsZXIgYmVpbmcgdW5hYmxlIHRvIGRldGVybWluZSB0aGUNCj4gPj4gYWxp Z25tZW50IG9mIHRoZSBzb3VyY2UgYW5kIGRlc3RpbmF0aW9uIHBvaW50ZXJzIGF0IGJ1aWxkIHRp bWUuIFNvDQo+IHdlDQo+ID4+IG5lZWQgdG8gaGVscCB0aGUgY29tcGlsZXIgd2l0aCB0aGlzIGF0 IGJ1aWxkIHRpbWUsIGFuZCB0aHVzIHRoZSBuZWVkDQo+ID4+IGZvciBpbmxpbmluZyB0aGUgZnVu Y3Rpb24uIElmIHdlIGV4cG9zZSBhIGJ1bmNoIG9mIHNtYWxsIGlubGluZQ0KPiA+PiBmdW5jdGlv bnMgb3IgYSBiaWcgaW5saW5lIGZ1bmN0aW9uIHdpdGggZmxhZ3Mgc2VlbXMgdG8gYmUgYSBtYXR0 ZXINCj4gb2YNCj4gPj4gdGFzdGUuDQo+ID4+Pg0KPiA+Pj4gVGhpbmtpbmcgYWJvdXQgaXQsIHlv dSBhcmUgcHJvYmFibHkgcmlnaHQgdGhhdCBleHBvc2luZyBhIHNpbmdsZQ0KPiA+PiBmdW5jdGlv biB3aXRoIGZsYWdzIGlzIGJldHRlciBmb3IgZG9jdW1lbnRhdGlvbiBwdXJwb3NlcyBhbmQgZWFz aWVyDQo+IGZvcg0KPiA+PiBvdGhlciBhcmNoaXRlY3R1cmVzIHRvIGltcGxlbWVudC4gQnV0IGl0 IHN0aWxsIG5lZWRzIHRvIGJlIGlubGluZSwNCj4gZm9yDQo+ID4+IHRoZSByZWFzb25zIGRlc2Ny aWJlZCBhYm92ZS4NCj4gPj4NCj4gPj4NCj4gPj4gT2ssIG15IGluaXRpYWwgdGhvdWdodCB3YXMg dGhhdCBtYWluIHVzZS1jYXNlIGZvciBpdCB3b3VsZCBiZQ0KPiBjb3B5aW5nDQo+ID4+IG9mDQo+ ID4+IGJpZyBjaHVua3Mgb2YgZGF0YSwgYnV0IGZyb20geW91ciBkZXNjcmlwdGlvbiBpdCBtaWdo dCBub3QgYmUgdGhlDQo+IGNhc2UuDQo+ID4NCj4gPiBUaGlzIGlzIGZvciBxdWlja2x5IGNvcHlp bmcgcmVsYXRpdmVseSBzbWFsbCBwaWVjZXMgb2YgZGF0YQ0KPiBzeW5jaHJvbm91c2x5IHdpdGhv dXQgcG9sbHV0aW5nIHRoZSBDUFVzIGRhdGEgY2FjaGUsIGUuZy4ganVzdCBiZWZvcmUNCj4gcGFz c2luZyBvbiBhIHBhY2tldCB0byBhbiBFdGhlcm5ldCBQTUQgZm9yIHRyYW5zbWlzc2lvbi4NCj4g Pg0KPiA+IEJpZyBjaHVua3Mgb2YgZGF0YSBzaG91bGQgYmUgY29waWVkIGFzeW5jaHJvbm91c2x5 IGJ5IERNQS4NCj4gPg0KPiA+PiBZZXMsIGZvciBqdXN0IDE2LzMyQiBjb3B5IGZ1bmN0aW9uIGNh bGwgb3ZlcmhlYWQgbWlnaHQgYmUgd2F5IHRvbw0KPiA+PiBoaWdoLi4uDQo+ID4+IEFzIGFub3Ro ZXIgYWx0ZXJuYXRpdmUgLSB3b3VsZCBtZW1jcHlfbnRfYnVsaygpIGhlbHAgc29tZWhvdz8NCj4g Pj4gSXQgY2FuIGRvIGNvcHlpbmcgZm9yIHRoZSBzZXZlcmFsIHNyYy9kc3QgcGFpcnMgYXQgb25j ZSBhbmQNCj4gPj4gdGhhdCBtaWdodCBoZWxwIHRvIGFtb3J0aXplIGNvc3Qgb2YgZnVuY3Rpb24g Y2FsbC4NCj4gPg0KPiA+IEluIG1hbnkgY2FzZXMsIG1lbWNweV9udCgpIHdpbGwgcmVwbGFjZSBt ZW1jcHkoKSBpbnNpZGUgbG9vcHMsIHNvIGl0DQo+IHNob3VsZCBiZSBqdXN0IGFzIGVhc3kgdG8g dXNlIGFzIG1lbWNweSgpLiBFLmcuIGxvb2sgYXQNCj4gcnRlX3BrdG1idWZfY29weSgpLi4uIEJ1 aWxkaW5nIGEgbWVtY29weSBhcnJheSB0byBwYXNzIHRvDQo+IG1lbWNweV9udF9idWxrKCkgZnJv bSBydGVfcGt0bWJ1Zl9jb3B5KCkgd291bGQgcmVxdWlyZSBhIHNpZ25pZmljYW50DQo+IHJld3Jp dGUgb2YgcnRlX3BrdG1idWZfY29weSgpLCBjb21wYXJlZCB0byBqdXN0IHJlcGxhY2luZyBydGVf bWVtY3B5KCkNCj4gd2l0aCBydGVfbWVtY3B5X250KCkuIEFuZCB0aGlzIGlzIGp1c3Qgb25lIGZ1 bmN0aW9uIHVzaW5nIG1lbWNweSgpLg0KPiANCj4gQWN0dWFsbHksIG9uZSBxdWVzdGlvbiBJIGhh dmUgZm9yIHN1Y2ggc21hbGwgZGF0YS10cmFuc2Zlcg0KPiAoMTZCIHBlciBwYWNrZXQpIC0gZG8g eW91IHN0aWxsIHNlZSBzb21lIG5vdGljYWJsZSBwZXJmb21hbmNlDQo+IGltcHJvdmVtZW50IGZv ciBzdWNoIHNjZW5hcmlvPw0KDQpDb3B5aW5nIDE2IGJ5dGUgZnJvbSBlYWNoIHBhY2tldCBpbiBh IGJ1cnN0IG9mIDMyIHBhY2tldHMgd291bGQgb3RoZXJ3aXNlIHBvbGx1dGUgNjQgY2FjaGUgbGlu ZXMgPSA0IEtCIGNhY2hlLiBXaXRoIHR5cGljYWxseSA2NCBLQiBMMSBjYWNoZSwgSSB0aGluayBp dCBtYWtlcyBhIGRpZmZlcmVuY2UuDQoNCj4gQW5vdGhlciBxdWVzdGlvbiAtIHdobyB3aWxsIGRv ICdzZmVuY2UnIGFmdGVyIHRoZSBjb3B5aW5nPw0KPiBXb3VsZCBpdCBiZSBpbnNpZGUgbWVtY3B5 X250IChzZWVtcyBxdWl0ZSBjb3N0bHkpLCBvciB3b3VsZA0KPiBpdCBiZSBhbm90aGVyIEFQSSBm dW5jdGlvbiBmb3IgdGhhdDogbWVtY3B5X250X2ZsdXNoKCkgb3Igc28/DQoNCk91dHNpZGUuIE9u bHkgdGhlIGRldmVsb3BlciBrbm93cyB3aGVuIGl0IGlzIHJlcXVpcmVkLCBzbyBpdCB3b3VsZG4n dCBtYWtlIGFueSBzZW5zZSB0byBhZGQgdGhlIGNvc3QgaW5zaWRlIG1lbWNweV9udCgpLg0KDQpJ IGRvbid0IHRoaW5rIHdlIHNob3VsZCBhZGQgYSBmbHVzaCBmdW5jdGlvbjsgaXQgd291bGQganVz dCBiZSBhbm90aGVyIG5hbWUgZm9yIGFuIGFscmVhZHkgZXhpc3RpbmcgZnVuY3Rpb24uIFJlZmVy cmluZyB0byB0aGUgcmVxdWlyZWQgb3BlcmF0aW9uIGluIHRoZSBtZW1jcHlfbnQoKSBmdW5jdGlv biBkb2N1bWVudGF0aW9uIHNob3VsZCBzdWZmaWNlLg0KDQo+IA0KPiA+Pg0KPiA+Pg0KPiA+Pj4N Cj4gPj4+Pg0KPiA+Pj4+DQo+ID4+Pj4+IFsxXSBodHRwczovL3d3dy5pbnRlbC5jb20vY29udGVu dC93d3cvdXMvZW4vZG9jcy9pbnRyaW5zaWNzLQ0KPiA+Pj4+IGd1aWRlL2luZGV4Lmh0bWwjdGV4 dD1fbW1fc3RyZWFtX2xvYWQNCj4gPj4+Pj4gWzJdIGh0dHBzOi8vZGV2ZWxvcGVyLmFybS5jb20v ZG9jdW1lbnRhdGlvbi8xMDAwNzYvMDEwMC9BNjQtDQo+ID4+Pj4gSW5zdHJ1Y3Rpb24tU2V0LVJl ZmVyZW5jZS9BNjQtRmxvYXRpbmctcG9pbnQtSW5zdHJ1Y3Rpb25zL0xETlAtLQ0KPiA+PiBTSU1E LQ0KPiA+Pj4+IGFuZC1GUC0NCj4gPj4+Pj4NCj4gPj4+Pj4gVjI6DQo+ID4+Pj4+IC0gT25seSBj b3B5IGZyb20gbm9uLXRlbXBvcmFsIHNvdXJjZSB0byBub24tdGVtcG9yYWwgZGVzdGluYXRpb24u DQo+ID4+Pj4+ICAgICAgSS5lLiByZW1vdmUgdGhlIHR3byB2YXJpYW50cyB3aXRoIG9ubHkgc291 cmNlIGFuZC9vcg0KPiA+PiBkZXN0aW5hdGlvbg0KPiA+Pj4+IGJlaW5nDQo+ID4+Pj4+ICAgICAg bm9uLXRlbXBvcmFsLg0KPiA+Pj4+PiAtIERvIG5vdCByZXF1aXJlIGFsaWdubWVudC4NCj4gPj4+ Pj4gICAgICBJbnN0ZWFkLCBvZmZlciBhZGRpdGlvbmFsIDQgYW5kIDE2IGJ5dGUgYWxpZ25lZCBm dW5jdGlvbnMNCj4gZm9yDQo+ID4+Pj4gcGVyZm9ybWFuY2UNCj4gPj4+Pj4gICAgICBwdXJwb3Nl cy4NCj4gPj4+Pj4gLSBJbXBsZW1lbnRlZCB0d28gb2YgdGhlIGZ1bmN0aW9ucyBmb3IgeDg2Lg0K PiA+Pj4+PiAtIFJlbW92ZSBtZW1zZXQgZnVuY3Rpb24uDQo+ID4+Pj4+DQo+ID4+Pj4+IFNpZ25l ZC1vZmYtYnk6IE1vcnRlbiBCcsO4cnVwIDxtYkBzbWFydHNoYXJlc3lzdGVtcy5jb20+DQo+ID4+ Pj4+IC0tLQ0KPiA+Pj4+Pg0KPiA+Pj4+PiAvKioNCj4gPj4+Pj4gICAgICogQHdhcm5pbmcNCj4g Pj4+Pj4gICAgICogQGIgRVhQRVJJTUVOVEFMOiB0aGlzIEFQSSBtYXkgY2hhbmdlIHdpdGhvdXQg cHJpb3Igbm90aWNlLg0KPiA+Pj4+PiAgICAgKg0KPiA+Pj4+PiAgICAgKiBDb3B5IGRhdGEgZnJv bSBub24tdGVtcG9yYWwgc291cmNlIHRvIG5vbi10ZW1wb3JhbA0KPiA+PiBkZXN0aW5hdGlvbi4N Cj4gPj4+Pj4gICAgICoNCj4gPj4+Pj4gICAgICogQHBhcmFtIGRzdA0KPiA+Pj4+PiAgICAgKiAg IFBvaW50ZXIgdG8gdGhlIG5vbi10ZW1wb3JhbCBkZXN0aW5hdGlvbiBvZiB0aGUgZGF0YS4NCj4g Pj4+Pj4gICAgICogICBTaG91bGQgYmUgNCBieXRlIGFsaWduZWQsIGZvciBvcHRpbWFsIHBlcmZv cm1hbmNlLg0KPiA+Pj4+PiAgICAgKiBAcGFyYW0gc3JjDQo+ID4+Pj4+ICAgICAqICAgUG9pbnRl ciB0byB0aGUgbm9uLXRlbXBvcmFsIHNvdXJjZSBkYXRhLg0KPiA+Pj4+PiAgICAgKiAgIE5vIGFs aWdubWVudCByZXF1aXJlbWVudHMuDQo+ID4+Pj4+ICAgICAqIEBwYXJhbSBsZW4NCj4gPj4+Pj4g ICAgICogICBOdW1iZXIgb2YgYnl0ZXMgdG8gY29weS4NCj4gPj4+Pj4gICAgICogICBTaG91bGQg YmUgYmUgZGl2aXNpYmxlIGJ5IDQsIGZvciBvcHRpbWFsIHBlcmZvcm1hbmNlLg0KPiA+Pj4+PiAg ICAgKi8NCj4gPj4+Pj4gX19ydGVfZXhwZXJpbWVudGFsDQo+ID4+Pj4+IHN0YXRpYyBfX3J0ZV9h bHdheXNfaW5saW5lDQo+ID4+Pj4+IF9fYXR0cmlidXRlX18oKF9fbm9ubnVsbF9fKDEsIDIpLCBf X2FjY2Vzc19fKHdyaXRlX29ubHksIDEsIDMpLA0KPiA+Pj4+IF9fYWNjZXNzX18ocmVhZF9vbmx5 LCAyLCAzKSkpDQo+ID4+Pj4+IHZvaWQgcnRlX21lbWNweV9udCh2b2lkICogX19ydGVfcmVzdHJp Y3QgZHN0LCBjb25zdCB2b2lkICoNCj4gPj4+PiBfX3J0ZV9yZXN0cmljdCBzcmMsIHNpemVfdCBs ZW4pDQo+ID4+Pj4+IC8qIEltcGxlbWVudGF0aW9uIFQuQi5ELiAqLw0KPiA+Pj4+Pg0KPiA+Pj4+ PiAvKioNCj4gPj4+Pj4gICAgICogQHdhcm5pbmcNCj4gPj4+Pj4gICAgICogQGIgRVhQRVJJTUVO VEFMOiB0aGlzIEFQSSBtYXkgY2hhbmdlIHdpdGhvdXQgcHJpb3Igbm90aWNlLg0KPiA+Pj4+PiAg ICAgKg0KPiA+Pj4+PiAgICAgKiBDb3B5IGRhdGEgaW4gYmxvY2tzIG9mIDE2IGJ5dGUgZnJvbSBh bGlnbmVkIG5vbi10ZW1wb3JhbA0KPiA+PiBzb3VyY2UNCj4gPj4+Pj4gICAgICogdG8gYWxpZ25l ZCBub24tdGVtcG9yYWwgZGVzdGluYXRpb24uDQo+ID4+Pj4+ICAgICAqDQo+ID4+Pj4+ICAgICAq IEBwYXJhbSBkc3QNCj4gPj4+Pj4gICAgICogICBQb2ludGVyIHRvIHRoZSBub24tdGVtcG9yYWwg ZGVzdGluYXRpb24gb2YgdGhlIGRhdGEuDQo+ID4+Pj4+ICAgICAqICAgTXVzdCBiZSAxNiBieXRl IGFsaWduZWQuDQo+ID4+Pj4+ICAgICAqIEBwYXJhbSBzcmMNCj4gPj4+Pj4gICAgICogICBQb2lu dGVyIHRvIHRoZSBub24tdGVtcG9yYWwgc291cmNlIGRhdGEuDQo+ID4+Pj4+ICAgICAqICAgTXVz dCBiZSAxNiBieXRlIGFsaWduZWQuDQo+ID4+Pj4+ICAgICAqIEBwYXJhbSBsZW4NCj4gPj4+Pj4g ICAgICogICBOdW1iZXIgb2YgYnl0ZXMgdG8gY29weS4NCj4gPj4+Pj4gICAgICogICBNdXN0IGJl IGRpdmlzaWJsZSBieSAxNi4NCj4gPj4+Pj4gICAgICovDQo+ID4+Pj4+IF9fcnRlX2V4cGVyaW1l bnRhbA0KPiA+Pj4+PiBzdGF0aWMgX19ydGVfYWx3YXlzX2lubGluZQ0KPiA+Pj4+PiBfX2F0dHJp YnV0ZV9fKChfX25vbm51bGxfXygxLCAyKSwgX19hY2Nlc3NfXyh3cml0ZV9vbmx5LCAxLCAzKSwN Cj4gPj4+PiBfX2FjY2Vzc19fKHJlYWRfb25seSwgMiwgMykpKQ0KPiA+Pj4+PiB2b2lkIHJ0ZV9t ZW1jcHlfbnQxNmEodm9pZCAqIF9fcnRlX3Jlc3RyaWN0IGRzdCwgY29uc3Qgdm9pZCAqDQo+ID4+ Pj4gX19ydGVfcmVzdHJpY3Qgc3JjLCBzaXplX3QgbGVuKQ0KPiA+Pj4+PiB7DQo+ID4+Pj4+ICAg ICAgICBjb25zdCB2b2lkICogY29uc3QgIGVuZCA9IFJURV9QVFJfQUREKHNyYywgbGVuKTsNCj4g Pj4+Pj4NCj4gPj4+Pj4gICAgICAgIFJURV9BU1NFUlQocnRlX2lzX2FsaWduZWQoZHN0LCBzaXpl b2YoX19tMTI4aSkpKTsNCj4gPj4+Pj4gICAgICAgIFJURV9BU1NFUlQocnRlX2lzX2FsaWduZWQo c3JjLCBzaXplb2YoX19tMTI4aSkpKTsNCj4gPj4+Pj4gICAgICAgIFJURV9BU1NFUlQocnRlX2lz X2FsaWduZWQobGVuLCBzaXplb2YoX19tMTI4aSkpKTsNCj4gPj4+Pj4NCj4gPj4+Pj4gICAgICAg IC8qIENvcHkgbGFyZ2UgcG9ydGlvbiBvZiBkYXRhLiAqLw0KPiA+Pj4+PiAgICAgICAgd2hpbGUg KFJURV9QVFJfRElGRihlbmQsIHNyYykgPj0gNCAqIHNpemVvZihfX20xMjhpKSkgew0KPiA+Pj4+ PiAgICAgICAgICAgIHJlZ2lzdGVyIF9fbTEyOGkgICAgeG1tMCwgeG1tMSwgeG1tMiwgeG1tMzsN Cj4gPj4+Pj4NCj4gPj4+Pj4gLyogTm90ZTogV29ya2Fyb3VuZCBmb3IgX21tX3N0cmVhbV9sb2Fk X3NpMTI4KCkgbm90IHRha2luZyBhDQo+IGNvbnN0DQo+ID4+Pj4gcG9pbnRlciBhcyBwYXJhbWV0 ZXIuICovDQo+ID4+Pj4+ICNwcmFnbWEgR0NDIGRpYWdub3N0aWMgcHVzaA0KPiA+Pj4+PiAjcHJh Z21hIEdDQyBkaWFnbm9zdGljIGlnbm9yZWQgIi1XZGlzY2FyZGVkLXF1YWxpZmllcnMiDQo+ID4+ Pj4+ICAgICAgICAgICAgeG1tMCA9IF9tbV9zdHJlYW1fbG9hZF9zaTEyOChSVEVfUFRSX0FERChz cmMsIDAgKg0KPiA+Pj4+IHNpemVvZihfX20xMjhpKSkpOw0KPiA+Pj4+PiAgICAgICAgICAgIHht bTEgPSBfbW1fc3RyZWFtX2xvYWRfc2kxMjgoUlRFX1BUUl9BREQoc3JjLCAxICoNCj4gPj4+PiBz aXplb2YoX19tMTI4aSkpKTsNCj4gPj4+Pj4gICAgICAgICAgICB4bW0yID0gX21tX3N0cmVhbV9s b2FkX3NpMTI4KFJURV9QVFJfQUREKHNyYywgMiAqDQo+ID4+Pj4gc2l6ZW9mKF9fbTEyOGkpKSk7 DQo+ID4+Pj4+ICAgICAgICAgICAgeG1tMyA9IF9tbV9zdHJlYW1fbG9hZF9zaTEyOChSVEVfUFRS X0FERChzcmMsIDMgKg0KPiA+Pj4+IHNpemVvZihfX20xMjhpKSkpOw0KPiA+Pj4+PiAjcHJhZ21h IEdDQyBkaWFnbm9zdGljIHBvcA0KPiA+Pj4+PiAgICAgICAgICAgIF9tbV9zdHJlYW1fc2kxMjgo UlRFX1BUUl9BREQoZHN0LCAwICoNCj4gc2l6ZW9mKF9fbTEyOGkpKSwNCj4gPj4+PiB4bW0wKTsN Cj4gPj4+Pj4gICAgICAgICAgICBfbW1fc3RyZWFtX3NpMTI4KFJURV9QVFJfQUREKGRzdCwgMSAq DQo+IHNpemVvZihfX20xMjhpKSksDQo+ID4+Pj4geG1tMSk7DQo+ID4+Pj4+ICAgICAgICAgICAg X21tX3N0cmVhbV9zaTEyOChSVEVfUFRSX0FERChkc3QsIDIgKg0KPiBzaXplb2YoX19tMTI4aSkp LA0KPiA+Pj4+IHhtbTIpOw0KPiA+Pj4+PiAgICAgICAgICAgIF9tbV9zdHJlYW1fc2kxMjgoUlRF X1BUUl9BREQoZHN0LCAzICoNCj4gc2l6ZW9mKF9fbTEyOGkpKSwNCj4gPj4+PiB4bW0zKTsNCj4g Pj4+Pj4gICAgICAgICAgICBzcmMgPSBSVEVfUFRSX0FERChzcmMsIDQgKiBzaXplb2YoX19tMTI4 aSkpOw0KPiA+Pj4+PiAgICAgICAgICAgIGRzdCA9IFJURV9QVFJfQUREKGRzdCwgNCAqIHNpemVv ZihfX20xMjhpKSk7DQo+ID4+Pj4+ICAgICAgICB9DQo+ID4+Pj4+DQo+ID4+Pj4+ICAgICAgICAv KiBDb3B5IHJlbWFpbmluZyBkYXRhLiAqLw0KPiA+Pj4+PiAgICAgICAgd2hpbGUgKHNyYyAhPSBl bmQpIHsNCj4gPj4+Pj4gICAgICAgICAgICByZWdpc3RlciBfX20xMjhpICAgIHhtbTsNCj4gPj4+ Pj4NCj4gPj4+Pj4gLyogTm90ZTogV29ya2Fyb3VuZCBmb3IgX21tX3N0cmVhbV9sb2FkX3NpMTI4 KCkgbm90IHRha2luZyBhDQo+IGNvbnN0DQo+ID4+Pj4gcG9pbnRlciBhcyBwYXJhbWV0ZXIuICov DQo+ID4+Pj4+ICNwcmFnbWEgR0NDIGRpYWdub3N0aWMgcHVzaA0KPiA+Pj4+PiAjcHJhZ21hIEdD QyBkaWFnbm9zdGljIGlnbm9yZWQgIi1XZGlzY2FyZGVkLXF1YWxpZmllcnMiDQo+ID4+Pj4+ICAg ICAgICAgICAgeG1tID0gX21tX3N0cmVhbV9sb2FkX3NpMTI4KHNyYyk7DQo+ID4+Pj4+ICNwcmFn bWEgR0NDIGRpYWdub3N0aWMgcG9wDQo+ID4+Pj4+ICAgICAgICAgICAgX21tX3N0cmVhbV9zaTEy OChkc3QsIHhtbSk7DQo+ID4+Pj4+ICAgICAgICAgICAgc3JjID0gUlRFX1BUUl9BREQoc3JjLCBz aXplb2YoX19tMTI4aSkpOw0KPiA+Pj4+PiAgICAgICAgICAgIGRzdCA9IFJURV9QVFJfQUREKGRz dCwgc2l6ZW9mKF9fbTEyOGkpKTsNCj4gPj4+Pj4gICAgICAgIH0NCj4gPj4+Pj4gfQ0KPiA+Pj4+ Pg0KPiA+Pj4+PiAvKioNCj4gPj4+Pj4gICAgICogQHdhcm5pbmcNCj4gPj4+Pj4gICAgICogQGIg RVhQRVJJTUVOVEFMOiB0aGlzIEFQSSBtYXkgY2hhbmdlIHdpdGhvdXQgcHJpb3Igbm90aWNlLg0K PiA+Pj4+PiAgICAgKg0KPiA+Pj4+PiAgICAgKiBDb3B5IGRhdGEgaW4gYmxvY2tzIG9mIDQgYnl0 ZSBmcm9tIGFsaWduZWQgbm9uLXRlbXBvcmFsDQo+IHNvdXJjZQ0KPiA+Pj4+PiAgICAgKiB0byBh bGlnbmVkIG5vbi10ZW1wb3JhbCBkZXN0aW5hdGlvbi4NCj4gPj4+Pj4gICAgICoNCj4gPj4+Pj4g ICAgICogQHBhcmFtIGRzdA0KPiA+Pj4+PiAgICAgKiAgIFBvaW50ZXIgdG8gdGhlIG5vbi10ZW1w b3JhbCBkZXN0aW5hdGlvbiBvZiB0aGUgZGF0YS4NCj4gPj4+Pj4gICAgICogICBNdXN0IGJlIDQg Ynl0ZSBhbGlnbmVkLg0KPiA+Pj4+PiAgICAgKiBAcGFyYW0gc3JjDQo+ID4+Pj4+ICAgICAqICAg UG9pbnRlciB0byB0aGUgbm9uLXRlbXBvcmFsIHNvdXJjZSBkYXRhLg0KPiA+Pj4+PiAgICAgKiAg IE11c3QgYmUgNCBieXRlIGFsaWduZWQuDQo+ID4+Pj4+ICAgICAqIEBwYXJhbSBsZW4NCj4gPj4+ Pj4gICAgICogICBOdW1iZXIgb2YgYnl0ZXMgdG8gY29weS4NCj4gPj4+Pj4gICAgICogICBNdXN0 IGJlIGRpdmlzaWJsZSBieSA0Lg0KPiA+Pj4+PiAgICAgKi8NCj4gPj4+Pj4gX19ydGVfZXhwZXJp bWVudGFsDQo+ID4+Pj4+IHN0YXRpYyBfX3J0ZV9hbHdheXNfaW5saW5lDQo+ID4+Pj4+IF9fYXR0 cmlidXRlX18oKF9fbm9ubnVsbF9fKDEsIDIpLCBfX2FjY2Vzc19fKHdyaXRlX29ubHksIDEsIDMp LA0KPiA+Pj4+IF9fYWNjZXNzX18ocmVhZF9vbmx5LCAyLCAzKSkpDQo+ID4+Pj4+IHZvaWQgcnRl X21lbWNweV9udDRhKHZvaWQgKiBfX3J0ZV9yZXN0cmljdCBkc3QsIGNvbnN0IHZvaWQgKg0KPiA+ Pj4+IF9fcnRlX3Jlc3RyaWN0IHNyYywgc2l6ZV90IGxlbikNCj4gPj4+Pj4gew0KPiA+Pj4+PiAg ICAgICAgaW50MzJfdCAgICAgICAgICAgICBidWZbc2l6ZW9mKF9fbTEyOGkpIC8gc2l6ZW9mKGlu dDMyX3QpXQ0KPiA+Pj4+IF9fcnRlX2FsaWduZWQoc2l6ZW9mKF9fbTEyOGkpKTsNCj4gPj4+Pj4g ICAgICAgIC8qKiBBZGRyZXNzIG9mIHNvdXJjZSBkYXRhLCByb3VuZGVkIGRvd24gdG8gYWNoaWV2 ZQ0KPiA+PiBhbGlnbm1lbnQuDQo+ID4+Pj4gKi8NCj4gPj4+Pj4gICAgICAgIGNvbnN0IHZvaWQg KiAgICAgICAgc3JjYSA9IFJURV9QVFJfQUxJR05fRkxPT1Ioc3JjLA0KPiA+Pj4+IHNpemVvZihf X20xMjhpKSk7DQo+ID4+Pj4+ICAgICAgICAvKiogQWRkcmVzcyBvZiBlbmQgb2Ygc291cmNlIGRh dGEsIHJvdW5kZWQgZG93biB0byBhY2hpZXZlDQo+ID4+Pj4gYWxpZ25tZW50LiAqLw0KPiA+Pj4+ PiAgICAgICAgY29uc3Qgdm9pZCAqIGNvbnN0ICBzcmNlbmRhID0NCj4gPj4+PiBSVEVfUFRSX0FM SUdOX0ZMT09SKFJURV9QVFJfQUREKHNyYywgbGVuKSwgc2l6ZW9mKF9fbTEyOGkpKTsNCj4gPj4+ Pj4gICAgICAgIGNvbnN0IGludCAgICAgICAgICAgb2Zmc2V0ID0gIFJURV9QVFJfRElGRihzcmMs IHNyY2EpIC8NCj4gPj4+PiBzaXplb2YoaW50MzJfdCk7DQo+ID4+Pj4+ICAgICAgICByZWdpc3Rl ciBfX20xMjhpICAgIHhtbTA7DQo+ID4+Pj4+DQo+ID4+Pj4+ICAgICAgICBSVEVfQVNTRVJUKHJ0 ZV9pc19hbGlnbmVkKGRzdCwgc2l6ZW9mKGludDMyX3QpKSk7DQo+ID4+Pj4+ICAgICAgICBSVEVf QVNTRVJUKHJ0ZV9pc19hbGlnbmVkKHNyYywgc2l6ZW9mKGludDMyX3QpKSk7DQo+ID4+Pj4+ICAg ICAgICBSVEVfQVNTRVJUKHJ0ZV9pc19hbGlnbmVkKGxlbiwgc2l6ZW9mKGludDMyX3QpKSk7DQo+ ID4+Pj4+DQo+ID4+Pj4+ICAgICAgICBpZiAodW5saWtlbHkobGVuID09IDApKSByZXR1cm47DQo+ ID4+Pj4+DQo+ID4+Pj4+ICAgICAgICAvKiBDb3B5IGZpcnN0LCBub24tX19tMTI4aSBhbGlnbmVk LCBwYXJ0IG9mIHNvdXJjZSBkYXRhLg0KPiAqLw0KPiA+Pj4+PiAgICAgICAgaWYgKG9mZnNldCkg ew0KPiA+Pj4+PiAvKiBOb3RlOiBXb3JrYXJvdW5kIGZvciBfbW1fc3RyZWFtX2xvYWRfc2kxMjgo KSBub3QgdGFraW5nIGENCj4gY29uc3QNCj4gPj4+PiBwb2ludGVyIGFzIHBhcmFtZXRlci4gKi8N Cj4gPj4+Pj4gI3ByYWdtYSBHQ0MgZGlhZ25vc3RpYyBwdXNoDQo+ID4+Pj4+ICNwcmFnbWEgR0ND IGRpYWdub3N0aWMgaWdub3JlZCAiLVdkaXNjYXJkZWQtcXVhbGlmaWVycyINCj4gPj4+Pj4gICAg ICAgICAgICB4bW0wID0gX21tX3N0cmVhbV9sb2FkX3NpMTI4KHNyY2EpOw0KPiA+Pj4+PiAgICAg ICAgICAgIF9tbV9zdG9yZV9zaTEyOCgodm9pZCAqKWJ1ZiwgeG1tMCk7DQo+ID4+Pj4+ICNwcmFn bWEgR0NDIGRpYWdub3N0aWMgcG9wDQo+ID4+Pj4+ICAgICAgICAgICAgc3dpdGNoIChvZmZzZXQp IHsNCj4gPj4+Pj4gICAgICAgICAgICAgICAgY2FzZSAxOg0KPiA+Pj4+PiAgICAgICAgICAgICAg ICAgICAgX21tX3N0cmVhbV9zaTMyKFJURV9QVFJfQUREKGRzdCwgMCAqDQo+ID4+Pj4gc2l6ZW9m KGludDMyX3QpKSwgYnVmWzFdKTsNCj4gPj4+Pj4gICAgICAgICAgICAgICAgICAgIGlmICh1bmxp a2VseShsZW4gPT0gMSAqIHNpemVvZihpbnQzMl90KSkpDQo+IHJldHVybjsNCj4gPj4+Pj4gICAg ICAgICAgICAgICAgICAgIF9tbV9zdHJlYW1fc2kzMihSVEVfUFRSX0FERChkc3QsIDEgKg0KPiA+ Pj4+IHNpemVvZihpbnQzMl90KSksIGJ1ZlsyXSk7DQo+ID4+Pj4+ICAgICAgICAgICAgICAgICAg ICBpZiAodW5saWtlbHkobGVuID09IDIgKiBzaXplb2YoaW50MzJfdCkpKQ0KPiByZXR1cm47DQo+ ID4+Pj4+ICAgICAgICAgICAgICAgICAgICBfbW1fc3RyZWFtX3NpMzIoUlRFX1BUUl9BREQoZHN0 LCAyICoNCj4gPj4+PiBzaXplb2YoaW50MzJfdCkpLCBidWZbM10pOw0KPiA+Pj4+PiAgICAgICAg ICAgICAgICAgICAgYnJlYWs7DQo+ID4+Pj4+ICAgICAgICAgICAgICAgIGNhc2UgMjoNCj4gPj4+ Pj4gICAgICAgICAgICAgICAgICAgIF9tbV9zdHJlYW1fc2kzMihSVEVfUFRSX0FERChkc3QsIDAg Kg0KPiA+Pj4+IHNpemVvZihpbnQzMl90KSksIGJ1ZlsyXSk7DQo+ID4+Pj4+ICAgICAgICAgICAg ICAgICAgICBpZiAodW5saWtlbHkobGVuID09IDEgKiBzaXplb2YoaW50MzJfdCkpKQ0KPiByZXR1 cm47DQo+ID4+Pj4+ICAgICAgICAgICAgICAgICAgICBfbW1fc3RyZWFtX3NpMzIoUlRFX1BUUl9B REQoZHN0LCAxICoNCj4gPj4+PiBzaXplb2YoaW50MzJfdCkpLCBidWZbM10pOw0KPiA+Pj4+PiAg ICAgICAgICAgICAgICAgICAgYnJlYWs7DQo+ID4+Pj4+ICAgICAgICAgICAgICAgIGNhc2UgMzoN Cj4gPj4+Pj4gICAgICAgICAgICAgICAgICAgIF9tbV9zdHJlYW1fc2kzMihSVEVfUFRSX0FERChk c3QsIDAgKg0KPiA+Pj4+IHNpemVvZihpbnQzMl90KSksIGJ1ZlszXSk7DQo+ID4+Pj4+ICAgICAg ICAgICAgICAgICAgICBicmVhazsNCj4gPj4+Pj4gICAgICAgICAgICB9DQo+ID4+Pj4+ICAgICAg ICAgICAgc3JjYSA9IFJURV9QVFJfQUREKHNyY2EsICg0IC0gb2Zmc2V0KSAqDQo+IHNpemVvZihp bnQzMl90KSk7DQo+ID4+Pj4+ICAgICAgICAgICAgZHN0ID0gUlRFX1BUUl9BREQoZHN0LCAoNCAt IG9mZnNldCkgKg0KPiBzaXplb2YoaW50MzJfdCkpOw0KPiA+Pj4+PiAgICAgICAgfQ0KPiA+Pj4+ Pg0KPiA+Pj4+PiAgICAgICAgLyogQ29weSBtaWRkbGUsIF9fbTEyOGkgYWxpZ25lZCwgcGFydCBv ZiBzb3VyY2UgZGF0YS4gKi8NCj4gPj4+Pj4gICAgICAgIHdoaWxlIChzcmNhICE9IHNyY2VuZGEp IHsNCj4gPj4+Pj4gLyogTm90ZTogV29ya2Fyb3VuZCBmb3IgX21tX3N0cmVhbV9sb2FkX3NpMTI4 KCkgbm90IHRha2luZyBhDQo+IGNvbnN0DQo+ID4+Pj4gcG9pbnRlciBhcyBwYXJhbWV0ZXIuICov DQo+ID4+Pj4+ICNwcmFnbWEgR0NDIGRpYWdub3N0aWMgcHVzaA0KPiA+Pj4+PiAjcHJhZ21hIEdD QyBkaWFnbm9zdGljIGlnbm9yZWQgIi1XZGlzY2FyZGVkLXF1YWxpZmllcnMiDQo+ID4+Pj4+ICAg ICAgICAgICAgeG1tMCA9IF9tbV9zdHJlYW1fbG9hZF9zaTEyOChzcmNhKTsNCj4gPj4+Pj4gI3By YWdtYSBHQ0MgZGlhZ25vc3RpYyBwb3ANCj4gPj4+Pj4gICAgICAgICAgICBfbW1fc3RvcmVfc2kx MjgoKHZvaWQgKilidWYsIHhtbTApOw0KPiA+Pj4+PiAgICAgICAgICAgIF9tbV9zdHJlYW1fc2kz MihSVEVfUFRSX0FERChkc3QsIDAgKiBzaXplb2YoaW50MzJfdCkpLA0KPiA+Pj4+IGJ1ZlswXSk7 DQo+ID4+Pj4+ICAgICAgICAgICAgX21tX3N0cmVhbV9zaTMyKFJURV9QVFJfQUREKGRzdCwgMSAq IHNpemVvZihpbnQzMl90KSksDQo+ID4+Pj4gYnVmWzFdKTsNCj4gPj4+Pj4gICAgICAgICAgICBf bW1fc3RyZWFtX3NpMzIoUlRFX1BUUl9BREQoZHN0LCAyICogc2l6ZW9mKGludDMyX3QpKSwNCj4g Pj4+PiBidWZbMl0pOw0KPiA+Pj4+PiAgICAgICAgICAgIF9tbV9zdHJlYW1fc2kzMihSVEVfUFRS X0FERChkc3QsIDMgKiBzaXplb2YoaW50MzJfdCkpLA0KPiA+Pj4+IGJ1ZlszXSk7DQo+ID4+Pj4+ ICAgICAgICAgICAgc3JjYSA9IFJURV9QVFJfQUREKHNyY2EsIHNpemVvZihfX20xMjhpKSk7DQo+ ID4+Pj4+ICAgICAgICAgICAgZHN0ID0gUlRFX1BUUl9BREQoZHN0LCA0ICogc2l6ZW9mKGludDMy X3QpKTsNCj4gPj4+Pj4gICAgICAgIH0NCj4gPj4+Pj4NCj4gPj4+Pj4gICAgICAgIC8qIENvcHkg bGFzdCwgbm9uLV9fbTEyOGkgYWxpZ25lZCwgcGFydCBvZiBzb3VyY2UgZGF0YS4gKi8NCj4gPj4+ Pj4gICAgICAgIGlmIChSVEVfUFRSX0RJRkYoc3JjYSwgc3JjKSAhPSA0KSB7DQo+ID4+Pj4+IC8q IE5vdGU6IFdvcmthcm91bmQgZm9yIF9tbV9zdHJlYW1fbG9hZF9zaTEyOCgpIG5vdCB0YWtpbmcg YQ0KPiBjb25zdA0KPiA+Pj4+IHBvaW50ZXIgYXMgcGFyYW1ldGVyLiAqLw0KPiA+Pj4+PiAjcHJh Z21hIEdDQyBkaWFnbm9zdGljIHB1c2gNCj4gPj4+Pj4gI3ByYWdtYSBHQ0MgZGlhZ25vc3RpYyBp Z25vcmVkICItV2Rpc2NhcmRlZC1xdWFsaWZpZXJzIg0KPiA+Pj4+PiAgICAgICAgICAgIHhtbTAg PSBfbW1fc3RyZWFtX2xvYWRfc2kxMjgoc3JjYSk7DQo+ID4+Pj4+ICAgICAgICAgICAgX21tX3N0 b3JlX3NpMTI4KCh2b2lkICopYnVmLCB4bW0wKTsNCj4gPj4+Pj4gI3ByYWdtYSBHQ0MgZGlhZ25v c3RpYyBwb3ANCj4gPj4+Pj4gICAgICAgICAgICBzd2l0Y2ggKG9mZnNldCkgew0KPiA+Pj4+PiAg ICAgICAgICAgICAgICBjYXNlIDE6DQo+ID4+Pj4+ICAgICAgICAgICAgICAgICAgICBfbW1fc3Ry ZWFtX3NpMzIoUlRFX1BUUl9BREQoZHN0LCAwICoNCj4gPj4+PiBzaXplb2YoaW50MzJfdCkpLCBi dWZbMF0pOw0KPiA+Pj4+PiAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQo+ID4+Pj4+ICAgICAg ICAgICAgICAgIGNhc2UgMjoNCj4gPj4+Pj4gICAgICAgICAgICAgICAgICAgIF9tbV9zdHJlYW1f c2kzMihSVEVfUFRSX0FERChkc3QsIDAgKg0KPiA+Pj4+IHNpemVvZihpbnQzMl90KSksIGJ1Zlsw XSk7DQo+ID4+Pj4+ICAgICAgICAgICAgICAgICAgICBpZiAodW5saWtlbHkoUlRFX1BUUl9ESUZG KHNyY2EsIHNyYykgPT0gMSAqDQo+ID4+Pj4gc2l6ZW9mKGludDMyX3QpKSkgcmV0dXJuOw0KPiA+ Pj4+PiAgICAgICAgICAgICAgICAgICAgX21tX3N0cmVhbV9zaTMyKFJURV9QVFJfQUREKGRzdCwg MSAqDQo+ID4+Pj4gc2l6ZW9mKGludDMyX3QpKSwgYnVmWzFdKTsNCj4gPj4+Pj4gICAgICAgICAg ICAgICAgICAgIGJyZWFrOw0KPiA+Pj4+PiAgICAgICAgICAgICAgICBjYXNlIDM6DQo+ID4+Pj4+ ICAgICAgICAgICAgICAgICAgICBfbW1fc3RyZWFtX3NpMzIoUlRFX1BUUl9BREQoZHN0LCAwICoN Cj4gPj4+PiBzaXplb2YoaW50MzJfdCkpLCBidWZbMF0pOw0KPiA+Pj4+PiAgICAgICAgICAgICAg ICAgICAgaWYgKHVubGlrZWx5KFJURV9QVFJfRElGRihzcmNhLCBzcmMpID09IDEgKg0KPiA+Pj4+ IHNpemVvZihpbnQzMl90KSkpIHJldHVybjsNCj4gPj4+Pj4gICAgICAgICAgICAgICAgICAgIF9t bV9zdHJlYW1fc2kzMihSVEVfUFRSX0FERChkc3QsIDEgKg0KPiA+Pj4+IHNpemVvZihpbnQzMl90 KSksIGJ1ZlsxXSk7DQo+ID4+Pj4+ICAgICAgICAgICAgICAgICAgICBpZiAodW5saWtlbHkoUlRF X1BUUl9ESUZGKHNyY2EsIHNyYykgPT0gMiAqDQo+ID4+Pj4gc2l6ZW9mKGludDMyX3QpKSkgcmV0 dXJuOw0KPiA+Pj4+PiAgICAgICAgICAgICAgICAgICAgX21tX3N0cmVhbV9zaTMyKFJURV9QVFJf QUREKGRzdCwgMiAqDQo+ID4+Pj4gc2l6ZW9mKGludDMyX3QpKSwgYnVmWzJdKTsNCj4gPj4+Pj4g ICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KPiA+Pj4+PiAgICAgICAgICAgIH0NCj4gPj4+Pj4g ICAgICAgIH0NCj4gPj4+Pj4gfQ0KPiA+Pj4+Pg0KPiA+Pj4+DQo+ID4+Pg0KPiA+Pg0KPiA+DQo+ IA0KDQo=