From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mga04.intel.com (mga04.intel.com [192.55.52.120]) by dpdk.org (Postfix) with ESMTP id B91FC3237 for ; Wed, 20 Jul 2016 04:16:56 +0200 (CEST) Received: from fmsmga002.fm.intel.com ([10.253.24.26]) by fmsmga104.fm.intel.com with ESMTP; 19 Jul 2016 19:16:55 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.28,392,1464678000"; d="scan'208";a="1025221583" Received: from fmsmsx103.amr.corp.intel.com ([10.18.124.201]) by fmsmga002.fm.intel.com with ESMTP; 19 Jul 2016 19:16:55 -0700 Received: from fmsmsx120.amr.corp.intel.com (10.18.124.208) by FMSMSX103.amr.corp.intel.com (10.18.124.201) with Microsoft SMTP Server (TLS) id 14.3.248.2; Tue, 19 Jul 2016 19:16:54 -0700 Received: from shsmsx151.ccr.corp.intel.com (10.239.6.50) by fmsmsx120.amr.corp.intel.com (10.18.124.208) with Microsoft SMTP Server (TLS) id 14.3.248.2; Tue, 19 Jul 2016 19:16:54 -0700 Received: from shsmsx102.ccr.corp.intel.com ([169.254.2.147]) by SHSMSX151.ccr.corp.intel.com ([169.254.3.150]) with mapi id 14.03.0248.002; Wed, 20 Jul 2016 10:16:52 +0800 From: "Lu, Wenzhuo" To: Adrien Mazarguil CC: "dev@dpdk.org" , Thomas Monjalon , "Zhang, Helin" , "Wu, Jingjing" , Rasesh Mody , "Ajit Khaparde" , Rahul Lakkireddy , Jan Medala , John Daley , "Chen, Jing D" , "Ananyev, Konstantin" , Matej Vido , Alejandro Lucero , Sony Chacko , Jerin Jacob , "De Lara Guarch, Pablo" , Olga Shern Thread-Topic: [RFC] Generic flow director/filtering/classification API Thread-Index: AQHR1uluLhaZlI58NEat0o4a8LsblaAMP0QAgAAA8QCAEynw4P//4EeAgAFO+PA= Date: Wed, 20 Jul 2016 02:16:51 +0000 Message-ID: <6A0DE07E22DDAD4C9103DF62FEBC090903492A93@shsmsx102.ccr.corp.intel.com> References: <20160705181646.GO7621@6wind.com> <6A0DE07E22DDAD4C9103DF62FEBC09090348E1A7@shsmsx102.ccr.corp.intel.com> <20160707102650.GU7621@6wind.com> <6A0DE07E22DDAD4C9103DF62FEBC090903492563@shsmsx102.ccr.corp.intel.com> <20160719131219.GK7621@6wind.com> In-Reply-To: <20160719131219.GK7621@6wind.com> 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] [RFC] Generic flow director/filtering/classification API X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: patches and discussions about DPDK List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 20 Jul 2016 02:16:57 -0000 SGkgQWRyaWVuLA0KDQoNCj4gLS0tLS1PcmlnaW5hbCBNZXNzYWdlLS0tLS0NCj4gRnJvbTogQWRy aWVuIE1hemFyZ3VpbCBbbWFpbHRvOmFkcmllbi5tYXphcmd1aWxANndpbmQuY29tXQ0KPiBTZW50 OiBUdWVzZGF5LCBKdWx5IDE5LCAyMDE2IDk6MTIgUE0NCj4gVG86IEx1LCBXZW56aHVvDQo+IENj OiBkZXZAZHBkay5vcmc7IFRob21hcyBNb25qYWxvbjsgWmhhbmcsIEhlbGluOyBXdSwgSmluZ2pp bmc7IFJhc2VzaCBNb2R5Ow0KPiBBaml0IEtoYXBhcmRlOyBSYWh1bCBMYWtraXJlZGR5OyBKYW4g TWVkYWxhOyBKb2huIERhbGV5OyBDaGVuLCBKaW5nIEQ7IEFuYW55ZXYsDQo+IEtvbnN0YW50aW47 IE1hdGVqIFZpZG87IEFsZWphbmRybyBMdWNlcm87IFNvbnkgQ2hhY2tvOyBKZXJpbiBKYWNvYjsg RGUgTGFyYQ0KPiBHdWFyY2gsIFBhYmxvOyBPbGdhIFNoZXJuDQo+IFN1YmplY3Q6IFJlOiBbUkZD XSBHZW5lcmljIGZsb3cgZGlyZWN0b3IvZmlsdGVyaW5nL2NsYXNzaWZpY2F0aW9uIEFQSQ0KPiAN Cj4gT24gVHVlLCBKdWwgMTksIDIwMTYgYXQgMDg6MTE6NDhBTSArMDAwMCwgTHUsIFdlbnpodW8g d3JvdGU6DQo+ID4gSGkgQWRyaWVuLA0KPiA+IFRoYW5rcyBmb3IgeW91ciBjbGFyaWZpY2F0aW9u LiAgTW9zdCBvZiBteSBxdWVzdGlvbnMgYXJlIGNsZWFyLCBidXQgc3RpbGwNCj4gc29tZXRoaW5n IG1heSBuZWVkIHRvIGJlIGRpc2N1c3NlZCwgY29tbWVudCBiZWxvdy4NCj4gDQo+IEhpIFdlbnpo dW8sDQo+IA0KPiBQbGVhc2Ugc2VlIGJlbG93Lg0KPiANCj4gWy4uLl0NCj4gPiA+ID4gPiBSZXF1 aXJlbWVudHMgZm9yIGEgbmV3IEFQSToNCj4gPiA+ID4gPg0KPiA+ID4gPiA+IC0gRmxleGlibGUg YW5kIGV4dGVuc2libGUgd2l0aG91dCBjYXVzaW5nIEFQSS9BQkkgcHJvYmxlbXMgZm9yIGV4aXN0 aW5nDQo+ID4gPiA+ID4gICBhcHBsaWNhdGlvbnMuDQo+ID4gPiA+ID4gLSBTaG91bGQgYmUgdW5h bWJpZ3VvdXMgYW5kIGVhc3kgdG8gdXNlLg0KPiA+ID4gPiA+IC0gU3VwcG9ydCBleGlzdGluZyBm aWx0ZXJpbmcgZmVhdHVyZXMgYW5kIGFjdGlvbnMgbGlzdGVkIGluIGBGaWx0ZXIgdHlwZXNgXy4N Cj4gPiA+ID4gPiAtIFN1cHBvcnQgcGFja2V0IGFsdGVyYXRpb24uDQo+ID4gPiA+ID4gLSBJbiBj YXNlIG9mIG92ZXJsYXBwaW5nIGZpbHRlcnMsIHRoZWlyIHByaW9yaXR5IHNob3VsZCBiZSB3ZWxs IGRvY3VtZW50ZWQuDQo+ID4gPiA+IERvZXMgdGhhdCBtZWFuIHdlIGRvbid0IGd1YXJhbnRlZSB0 aGUgY29uc2lzdGVudCBvZiBwcmlvcml0eT8gVGhlDQo+ID4gPiA+IHByaW9yaXR5IGNhbg0KPiA+ ID4gYmUgZGlmZmVyZW50IG9uIGRpZmZlcmVudCBOSUNzLiBTbyB0aGUgYmVoYXZpb3Igb2YgdGhl IGFjdGlvbnMgIGNhbiBiZQ0KPiBkaWZmZXJlbnQuDQo+ID4gPiBSaWdodD8NCj4gPiA+DQo+ID4g PiBObywgdGhlIGludGVudCBpcyBwcmVjaXNlbHkgdG8gZGVmaW5lIHdoYXQgaGFwcGVucyBpbiBv cmRlciB0byBnZXQgYQ0KPiA+ID4gY29uc2lzdGVudCByZXN1bHQgYWNyb3NzIGRpZmZlcmVudCBk ZXZpY2VzLCBhbmQgZG9jdW1lbnQgY2FzZXMgd2l0aA0KPiB1bmRlZmluZWQgYmVoYXZpb3IuDQo+ ID4gPiBUaGVyZSBtdXN0IGJlIG5vIHJvb20gbGVmdCBmb3IgaW50ZXJwcmV0YXRpb24uDQo+ID4g Pg0KPiA+ID4gRm9yIGV4YW1wbGUsIHRoZSBBUEkgbXVzdCBkZXNjcmliZSB3aGF0IGhhcHBlbnMg d2hlbiB0d28gb3ZlcmxhcHBpbmcNCj4gPiA+IGZpbHRlcnMgKGUuZy4gb25lIG1hdGNoaW5nIGFu IEV0aGVybmV0IGhlYWRlciwgYW5vdGhlciBvbmUgbWF0Y2hpbmcNCj4gPiA+IGFuIElQIGhlYWRl cikgbWF0Y2ggYSBnaXZlbiBwYWNrZXQgYXQgYSBnaXZlbiBwcmlvcml0eSBsZXZlbC4NCj4gPiA+ DQo+ID4gPiBJdCBpcyBkb2N1bWVudGVkIGluIHNlY3Rpb24gNC4xLjEgKHByaW9yaXRpZXMpIGFz ICJ1bmRlZmluZWQgYmVoYXZpb3IiLg0KPiA+ID4gQXBwbGljYXRpb25zIHJlbWFpbiBmcmVlIHRv IGRvIGl0IGFuZCBkZWFsIHdpdGggY29uc2VxdWVuY2VzLCBhdA0KPiA+ID4gbGVhc3QgdGhleSBr bm93IHRoZXkgY2Fubm90IGV4cGVjdCBhIGNvbnNpc3RlbnQgb3V0Y29tZSwgdW5sZXNzIHRoZXkN Cj4gPiA+IHVzZSBkaWZmZXJlbnQgcHJpb3JpdHkgbGV2ZWxzIGZvciBib3RoIHJ1bGVzLCBzZWUg YWxzbyA0LjQuNSAoZmxvdyBydWxlcyBwcmlvcml0eSkuDQo+ID4gPg0KPiA+ID4gPiBTZWVtcyB0 aGUgdXNlcnMgc3RpbGwgbmVlZCB0byBhd2FyZSB0aGUgc29tZSBkZXRhaWxzIG9mIHRoZSBIVz8g RG8NCj4gPiA+ID4gd2UgbmVlZA0KPiA+ID4gdG8gYWRkIHRoZSBuZWdvdGlhdGlvbiBmb3IgdGhl IHByaW9yaXR5Pw0KPiA+ID4NCj4gPiA+IFByaW9yaXRpZXMgYXMgZGVmaW5lZCBpbiB0aGlzIGRv Y3VtZW50IG1heSBub3QgYmUgZGlyZWN0bHkgbWFwcGFibGUNCj4gPiA+IHRvIEhXIGNhcGFiaWxp dGllcyAoZS5nLiBIVyBkb2VzIG5vdCBzdXBwb3J0IGVub3VnaCBwcmlvcml0aWVzLCBvcg0KPiA+ ID4gdGhhdCBzb21lIGNvcm5lciBjYXNlIG1ha2UgdGhlbSBub3Qgd29yayBhcyBkZXNjcmliZWQp LCBpbiB3aGljaA0KPiA+ID4gY2FzZSB0aGUgUE1EIG1heSBjaG9vc2UgdG8gc2ltdWxhdGUgcHJp b3JpdGllcyAoYWdhaW4gNC40LjUpLCBhcw0KPiA+ID4gbG9uZyBhcyB0aGUgZW5kIHJlc3VsdCBm b2xsb3dzIHRoZSBzcGVjaWZpY2F0aW9uLg0KPiA+ID4NCj4gPiA+IFNvIHVzZXJzIG11c3Qgbm90 IGJlIGF3YXJlIG9mIHNvbWUgSFcgZGV0YWlscywgdGhlIFBNRCBkb2VzIGFuZCBtdXN0DQo+ID4g PiBwZXJmb3JtIHRoZSBuZWVkZWQgd29ya2Fyb3VuZHMgdG8gc3VpdCB0aGVpciBleHBlY3RhdGlv bnMuIFVzZXJzIG1heQ0KPiA+ID4gb25seSBiZSBpbXBhY3RlZCBieSBlcnJvcnMgd2hpbGUgYXR0 ZW1wdGluZyB0byBjcmVhdGUgcnVsZXMgdGhhdCBhcmUNCj4gPiA+IGVpdGhlciB1bnN1cHBvcnRl ZCBvciB3b3VsZCBjYXVzZSB0aGVtIChvciBleGlzdGluZyBydWxlcykgdG8gZGl2ZXJnZSBmcm9t DQo+IHRoZSBzcGVjLg0KPiA+IFRoZSBwcm9ibGVtIGlzIHNvbWV0aW1lIHRoZSBwcmlvcml0eSBv ZiB0aGUgZmlsdGVycyBpcyBmaXhlZCBhY2NvcmRpbmcNCj4gPiB0bw0KPiA+ID4gSFcncyBpbXBs ZW1lbnRhdGlvbi4gRm9yIGV4YW1wbGUsIG9uIGl4Z2JlLCBuLXR1cGxlIGhhcyBhIGhpZ2hlcg0K PiA+ID4gcHJpb3JpdHkgdGhhbiBmbG93IGRpcmVjdG9yLg0KPiANCj4gQXMgYSBzaWRlIG5vdGUg SSBkaWQgbm90IGtub3cgdGhhdCBOLXR1cGxlIGhhZCBhIGhpZ2hlciBwcmlvcml0eSB0aGFuIGZs b3cNCj4gZGlyZWN0b3Igb24gaXhnYmUsIHByaW9yaXRpZXMgYW1vbmcgZmlsdGVyIHR5cGVzIGRv IG5vdCBzZWVtIHRvIGJlIGRvY3VtZW50ZWQgYXQNCj4gYWxsIGluIERQREsuIFRoaXMgaXMgb25l IG9mIHRoZSByZWFzb25zIEkgdGhpbmsgd2UgbmVlZCBhIGdlbmVyaWMgQVBJIHRvIGhhbmRsZQ0K PiBmbG93IGNvbmZpZ3VyYXRpb24uDQpUb3RhbGx5IGFncmVlIHdpdGggeW91LiBXZSBoYXZlbid0 IGRvY3VtZW50ZWQgdGhlIGluZm8gd2VsbCBlbm91Z2guIEFuZCBldmVuIHdlIGRvIHRoYXQsIHVz ZXJzIGhhdmUgdG8gc3R1ZHkgdGhlIGRldGFpbHMgb2YgZXZlcnkgTklDLCBpdCBjYW4gc3RpbGwg bWFrZSB0aGUgZmlsdGVycyB2ZXJ5IGhhcmQgdG8gdXNlLiBJIGJlbGlldmUgYSBnZW5lcmljIEFQ SSBpcyB2ZXJ5IGhlbHBmdWwgaGVyZSA6KQ0KDQo+IA0KPiANCj4gU28sIHRvZGF5IGFuIGFwcGxp Y2F0aW9uIGNhbm5vdCBjb21iaW5lIE4tdHVwbGUgYW5kIEZESVIgZmxvdyBydWxlcyBhbmQgZ2V0 IGENCj4gcmVsaWFibGUgb3V0Y29tZSwgdW5sZXNzIGl0IGlzIGRlc2lnbmVkIGZvciBzcGVjaWZp YyBkZXZpY2VzIHdpdGggYSBrbm93bg0KPiBiZWhhdmlvci4NCj4gDQo+ID4gV2hhdCdzIHRoZSBy aWdodCBiZWhhdmlvciBvZiBQTUQgaWYgQVBQIHdhbnQgdG8gY3JlYXRlIGEgZmxvdyBkaXJlY3Rv ciBydWxlDQo+IHdoaWNoIGhhcyBhIGhpZ2hlciBvciBldmVuIGVxdWFsIHByaW9yaXR5IHRoYW4g YW4gZXhpc3Rpbmcgbi10dXBsZSBydWxlPyBTaG91bGQNCj4gUE1EIHJldHVybiBmYWlsPw0KPiAN Cj4gRmlyc3QgcmVtZW1iZXIgYXBwbGljYXRpb25zIG9ubHkgZGVhbCB3aXRoIHRoZSBnZW5lcmlj IEFQSSwgUE1EcyBhcmUNCj4gcmVzcG9uc2libGUgZm9yIGNob29zaW5nIHRoZSBtb3N0IGFwcHJv cHJpYXRlIEhXIGltcGxlbWVudGF0aW9uIHRvIHVzZQ0KPiBhY2NvcmRpbmcgdG8gdGhlIHJlcXVl c3RlZCBmbG93IHJ1bGVzIChGRElSLCBOLXR1cGxlIG9yIGFueXRoaW5nIGVsc2UpLg0KPiANCj4g Rm9yIHRoZSBzcGVjaWZpYyBjYXNlIG9mIEZESVIgdnMgTi10dXBsZSwgaWYgdGhlIHVuZGVybHlp bmcgSFcgc3VwcG9ydHMgYm90aCBJIGRvDQo+IG5vdCBzZWUgd2h5IHRoZSBQTUQgd291bGQgY3Jl YXRlIGEgTi10dXBsZSBydWxlLiBEb2Vzbid0IEZESVIgc3VwcG9ydA0KPiBldmVyeXRoaW5nIE4t dHVwbGUgY2FuIGRvIGFuZCBtdWNoIG1vcmU/DQpUYWxraW5nIGFib3V0IHRoZSBmaWx0ZXJzLCBm ZGlyIGNhbiBjb3ZlciBuLXR1cGxlLiBJIHRoaW5rIHRoYXQncyB3aHkgaTQwZSBvbmx5IHN1cHBv cnRzIGZkaXIgYnV0IG5vdCBuLXR1cGxlLiBCdXQgbi10dXBsZSBoYXMgaXRzIG93biBoaWdobGln aHQuIEFzIHdlIGtub3csIGF0IGxlYXN0IG9uIGludGVsIE5JQ3MsIGZkaXIgb25seSBzdXBwb3J0 cyBwZXIgZGV2aWNlIG1hc2suIEJ1dCBuLXR1cGxlIGNhbiBzdXBwb3J0IHBlciBydWxlIG1hc2su DQpBcyBldmVyeSBwYXR0ZXJuIGhhcyBzcGVjIGFuZCBtYXNrIGJvdGgsIHdlIGNhbm5vdCBndWFy YW50ZWUgdGhlIG1hc2tzIGFyZSBzYW1lLiBJIHRoaW5rIGl4Z2JlIHdpbGwgdHJ5IHRvIHVzZSBu LXR1cGxlIGZpcnN0IGlmIGNhbi4gQmVjYXVzZSBldmVuIHRoZSBtYXNrcyBhcmUgZGlmZmVyZW50 LCB3ZSBjYW4gc3VwcG9ydCB0aGVtIGFsbC4NCg0KPiANCj4gQXNzdW1pbmcgc3VjaCBhIHRoaW5n IGhhcHBlbmVkIGFueXdheSwgdGhhdCB0aGUgUE1EIGhhZCB0byBjcmVhdGUgYSBydWxlDQo+IHVz aW5nIGEgaGlnaCBwcmlvcml0eSBmaWx0ZXIgdHlwZSBhbmQgdGhhdCB0aGUgYXBwbGljYXRpb24g cmVxdWVzdHMgdGhlIGNyZWF0aW9uIG9mIGENCj4gcnVsZSB0aGF0IGNhbiBvbmx5IGJlIGRvbmUg dXNpbmcgYSBsb3dlciBwcmlvcml0eSBmaWx0ZXIgdHlwZSwgYnV0IGFsc28gcmVxdWVzdGVkIGEN Cj4gaGlnaGVyIHByaW9yaXR5IGZvciB0aGF0IHJ1bGUsIHRoZW4geWVzLCBpdCBzaG91bGQgb2J2 aW91c2x5IGZhaWwuDQo+IA0KPiBUaGF0IGlzLCB1bmxlc3MgdGhlIFBNRCBjYW4gcGVyZm9ybSBz b21lIGtpbmQgb2Ygd29ya2Fyb3VuZCB0byBoYXZlIGJvdGguDQo+IA0KPiA+IElmIHNvLCBkbyB3 ZSBuZWVkIG1vcmUgZmFpbCByZWFzb25zPyBBY2NvcmRpbmcgdG8gdGhpcyBSRkMsIEkgdGhpbmsg d2UgbmVlZA0KPiByZXR1cm4gIiBFRVhJU1Q6IGNvbGxpc2lvbiB3aXRoIGFuIGV4aXN0aW5nIHJ1 bGUuICIsIGJ1dCBpdCdzIG5vdCB2ZXJ5IGNsZWFyLCBBUFANCj4gZG9lc24ndCBrbm93IHRoZSBw cm9ibGVtIGlzIHByaW9yaXR5LCBtYXliZSBtb3JlIGRldGFpbGVkIHJlYXNvbiBpcyBoZWxwZnVs Lg0KPiANCj4gUG9zc2libHksIEkndmUgZGVmaW5lZCBhIGJhc2ljIHNldCBvZiBlcnJvcnMsIHRo ZXJlIGFyZSBxdWl0ZSBhIG51bWJlciBvZiBlcnJubw0KPiB2YWx1ZXMgdG8gY2hvb3NlIGZyb20u IEhvd2V2ZXIgSSB0aGluayB3ZSBzaG91bGQgbm90IGRlZmluZSB0b28gbWFueSB2YWx1ZXMuDQo+ IEluIG15IG9waW5pb24gdGhlIGJhc2ljIHNldCBjb3ZlcnMgZXZlcnkgcG9zc2libGUgZmFpbHVy ZToNCj4gDQo+IC0gRUlOVkFMOiBpbnZhbGlkIGZvcm1hdCwgcnVsZSBpcyBicm9rZW4gb3IgY2Fu bm90IGJlIHVuZGVyc3Rvb2QgYnkgdGhlIFBNRA0KPiAgIGFueWhvdy4NCj4gDQo+IC0gRU5PVFNV UDogcGF0dGVybi9hY3Rpb25zIGxvb2sgZmluZSBidXQgc29tZXRoaW5nIGluIHRoZSByZXF1ZXN0 ZWQgcnVsZSBpcw0KPiAgIG5vdCBzdXBwb3J0ZWQgYW5kIHRodXMgY2Fubm90IGJlIGFwcGxpZWQu DQo+IA0KPiAtIEVFWElTVDogcGF0dGVybi9hY3Rpb25zIGFyZSBmaW5lIGFuZCBjb3VsZCBoYXZl IGJlZW4gYXBwbGllZCBpZiBvbmx5IHNvbWUNCj4gICBvdGhlciBydWxlIGRpZCBub3QgcHJldmVu dCB0aGUgUE1EIHRvIGRvIGl0IChJIHNlZSBpdCBhcyB0aGUgY2xvc2VzdCB0aGluZw0KPiAgIHRv ICJFVE9PQkFEIiB3aGljaCB1bmZvcnR1bmF0ZWx5IGRvZXMgbm90IGV4aXN0KS4NCj4gDQo+IC0g RU5PTUVNOiBsaWtlIEVFWElTVCwgZXhjZXB0IGl0IGlzIGR1ZSB0byB0aGUgbGFjayBvZiByZXNv dXJjZXMgbm90IGJlY2F1c2UNCj4gICBvZiBhbm90aGVyIHJ1bGUuIEkgd2Fzbid0IHN1cmUgd2hp Y2ggb2YgRU5PTUVNIG9yIEVOT1NQQyB3YXMgYmV0dGVyIGJ1dA0KPiAgIHNldHRsZWQgb24gRU5P TUVNIGFzIGl0IGlzIHdlbGwga25vd24uIFN0aWxsIG9wZW4gdG8gZGViYXRlLg0KPiANCj4gRXJy bm8gdmFsdWVzIGFyZSBvbmx5IHVzZWZ1bCB0byBnZXQgYSByb3VnaCBpZGVhIG9mIHRoZSByZWFz b24sIGFuZCBhbm90aGVyDQo+IG1lY2hhbmlzbSBpcyBuZWVkZWQgdG8gcGlucG9pbnQgdGhlIGV4 YWN0IHByb2JsZW0gZm9yIGRlYnVnZ2luZy9yZXBvcnRpbmcNCj4gcHVycG9zZXMsIHNvbWV0aGlu ZyBsaWtlOg0KPiANCj4gIGVudW0gcnRlX2Zsb3dfZXJyb3JfdHlwZSB7DQo+ICAgICAgUlRFX0ZM T1dfRVJST1JfVFlQRV9OT05FLA0KPiAgICAgIFJURV9GTE9XX0VSUk9SX1RZUEVfVU5LTk9XTiwN Cj4gICAgICBSVEVfRkxPV19FUlJPUl9UWVBFX1BSSU9SSVRZLA0KPiAgICAgIFJURV9GTE9XX0VS Uk9SX1RZUEVfUEFUVEVSTiwNCj4gICAgICBSVEVfRkxPV19FUlJPUl9UWVBFX0FDVElPTiwNCj4g IH07DQo+IA0KPiAgc3RydWN0IHJ0ZV9mbG93X2Vycm9yIHsNCj4gICAgICBlbnVtIHJ0ZV9mbG93 X2Vycm9yX3R5cGUgdHlwZTsNCj4gICAgICB2b2lkICpvZmZzZXQ7IC8qIFBvaW50cyB0byB0aGUg ZXhhY3QgcGF0dGVybiBpdGVtIG9yIGFjdGlvbi4gKi8NCj4gICAgICBjb25zdCBjaGFyICptZXNz YWdlOw0KPiAgfTsNCldoZW4gd2UgYXJlIHVzaW5nIGEgQ0xJIGFuZCBpdCBmYWlscywgbm9ybWFs bHkgaXQgd2lsbCBsZXQgdXMga25vdyB3aGljaCBwYXJhbWV0ZXIgaXMgbm90IGFwcHJvcHJpYXRl LiBTbywgSSB0aGluayBpdOKAmXMgYSBnb29kIGlkZWEgdG8gaGF2ZSB0aGlzIGVycm9yIHN0cnVj dHVyZSA6KQ0KDQo+IA0KPiBUaGVuIGVpdGhlciBwcm92aWRlIGFuIG9wdGlvbmFsIHN0cnVjdCBy dGVfZmxvd19lcnJvciBwb2ludGVyIHRvDQo+IHJ0ZV9mbG93X3ZhbGlkYXRlKCksIG9yIGEgc2Vw YXJhdGUgZnVuY3Rpb24gKHJ0ZV9mbG93X2FuYWx5emUoKT8pLCBzaW5jZQ0KPiBwcm9jZXNzaW5n IHRoaXMgbWF5IGJlIHF1aXRlIGV4cGVuc2l2ZSBhbmQgYXBwbGljYXRpb25zIG1heSBub3QgY2Fy ZSBhYm91dCB0aGUNCj4gZXhhY3QgcmVhc29uLg0KQWdyZWUgdGhlIHByb2Nlc3NpbmcgbWF5IGJl IHRvbyBleHBlbnNpdmUuIE1heWJlIHdlIGNhbiBzYXkgaXQncyBvcHRpb25hbCB0byByZXR1cm4g ZXJyb3IgZGV0YWlscy4gQW5kIHRoYXQncyBhIGdvb2QgcXVlc3Rpb24gdGhhdCB3aGF0IEFQUCBz aG91bGQgZG8gaWYgY3JlYXRpbmcgdGhlIHJ1bGUgZmFpbHMuIEkgYmVsaWV2ZSBub3JtYWxseSBp dCB3aWxsIGNob29zZSBoYW5kbGUgdGhlIHJ1bGUgYnkgaXRzZWxmLiBCdXQgSSB0aGluayBpdCdz IG5vdCBiYWQgdG8gZmVlZGJhY2sgbW9yZS4gT3IgZXZlbiB0aGUgQVBQIHdhbnQgdG8gYWRqdXN0 IHRoZSBydWxlcywgaXQgY2Fubm90IGJlIGFuIG9wdGlvbiBmb3IgbGFjayBvZiBpbmZvLg0KDQo+ IA0KPiBXaGF0IGRvIHlvdSBzdWdnZXN0Pw0KPiANCj4gPiA+ID4gPiBCZWhhdmlvcg0KPiA+ID4g PiA+IC0tLS0tLS0tDQo+ID4gPiA+ID4NCj4gPiA+ID4gPiAtIEFQSSBvcGVyYXRpb25zIGFyZSBz eW5jaHJvbm91cyBhbmQgYmxvY2tpbmcgKGBgRUFHQUlOYGAgY2Fubm90IGJlDQo+ID4gPiA+ID4g ICByZXR1cm5lZCkuDQo+ID4gPiA+ID4NCj4gPiA+ID4gPiAtIFRoZXJlIGlzIG5vIHByb3Zpc2lv biBmb3IgcmVlbnRyYW5jeS9tdWx0aS10aHJlYWQgc2FmZXR5LCBhbHRob3VnaA0KPiBub3RoaW5n DQo+ID4gPiA+ID4gICBzaG91bGQgcHJldmVudCBkaWZmZXJlbnQgZGV2aWNlcyBmcm9tIGJlaW5n IGNvbmZpZ3VyZWQgYXQgdGhlIHNhbWUNCj4gPiA+ID4gPiAgIHRpbWUuIFBNRHMgbWF5IHByb3Rl Y3QgdGhlaXIgY29udHJvbCBwYXRoIGZ1bmN0aW9ucyBhY2NvcmRpbmdseS4NCj4gPiA+ID4gPg0K PiA+ID4gPiA+IC0gU3RvcHBpbmcgdGhlIGRhdGEgcGF0aCAoVFgvUlgpIHNob3VsZCBub3QgYmUg bmVjZXNzYXJ5IHdoZW4NCj4gPiA+ID4gPiBtYW5hZ2luZw0KPiA+ID4gZmxvdw0KPiA+ID4gPiA+ ICAgcnVsZXMuIElmIHRoaXMgY2Fubm90IGJlIGFjaGlldmVkIG5hdHVyYWxseSBvciB3aXRoIHdv cmthcm91bmRzIChzdWNoIGFzDQo+ID4gPiA+ID4gICB0ZW1wb3JhcmlseSByZXBsYWNpbmcgdGhl IGJ1cnN0IGZ1bmN0aW9uIHBvaW50ZXJzKSwgYW4gYXBwcm9wcmlhdGUgZXJyb3INCj4gPiA+ID4g PiAgIGNvZGUgbXVzdCBiZSByZXR1cm5lZCAoYGBFQlVTWWBgKS4NCj4gPiA+ID4gUE1EIGNhbm5v dCBzdG9wIHRoZSBkYXRhIHBhdGggd2l0aG91dCBhZGRpbmcgbG9jay4gU28gSSB0aGluayBpZg0K PiA+ID4gPiBzb21lIHJ1bGVzDQo+ID4gPiBjYW5ub3QgYmUgYXBwbGllZCB3aXRob3V0IHN0b3Bw aW5nIHJ4L3R4LCBQTUQgaGFzIHRvIHJldHVybiBmYWlsLg0KPiA+ID4gPiBPciBsZXQgdGhlIEFQ UCB0byBzdG9wIHRoZSBkYXRhIHBhdGguDQo+ID4gPg0KPiA+ID4gQWdyZWVkLCB0aGF0IGlzIHRo ZSBpbnRlbnQuIElmIHRoZSBQTUQgY2Fubm90IHRvdWNoIGZsb3cgcnVsZXMgZm9yDQo+ID4gPiBz b21lIHJlYXNvbiBldmVuIGFmdGVyIHRyeWluZyByZWFsbHkgaGFyZCwgdGhlbiBpdCBqdXN0IHJl dHVybnMgRUJVU1kuDQo+ID4gPg0KPiA+ID4gUGVyaGFwcyB3ZSBzaG91bGQgd3JpdGUgZG93biB0 aGF0IGFwcGxpY2F0aW9ucyBtYXkgZ2V0IGEgZGlmZmVyZW50DQo+ID4gPiBvdXRjb21lIGFmdGVy IHN0b3BwaW5nIHRoZSBkYXRhIHBhdGggaWYgdGhleSBnZXQgRUJVU1k/DQo+ID4gQWdyZWUsIGl0 J3MgYmV0dGVyIHRvIGRlc2NyaWJlIG1vcmUgYWJvdXQgdGhlIEFQUC4gQlRXLCBJIGNoZWNrZWQg dGhlDQo+ID4gYmVoYXZpb3Igb2YgaXhnYmUvaWdiLCBJIHRoaW5rIHdlIGNhbiBhZGQvZGVsZXRl IGZpbHRlcnMgZHVyaW5nDQo+ID4gcnVudGltZS4gSG9wZWZ1bGx5IHdlJ2xsIG5vdCBoaXQgdG9v IG1hbnkgRUJVU1kgcHJvYmxlbXMgb24gb3RoZXIgTklDcw0KPiA+IDopDQo+IA0KPiBPSywgSSB3 aWxsIGFkZCBpdC4NCj4gDQo+ID4gPiA+ID4gLSBQTURzLCBub3QgYXBwbGljYXRpb25zLCBhcmUg cmVzcG9uc2libGUgZm9yIG1haW50YWluaW5nIGZsb3cgcnVsZXMNCj4gPiA+ID4gPiAgIGNvbmZp Z3VyYXRpb24gd2hlbiBzdG9wcGluZyBhbmQgcmVzdGFydGluZyBhIHBvcnQgb3IgcGVyZm9ybWlu ZyBvdGhlcg0KPiA+ID4gPiA+ICAgYWN0aW9ucyB3aGljaCBtYXkgYWZmZWN0IHRoZW0uIFRoZXkg Y2FuIG9ubHkgYmUgZGVzdHJveWVkIGV4cGxpY2l0bHkuDQo+ID4gPiA+IERvbuKAmXQgdW5kZXJz dGFuZCAiIFRoZXkgY2FuIG9ubHkgYmUgZGVzdHJveWVkIGV4cGxpY2l0bHkuIg0KPiA+ID4NCj4g PiA+IFRoaXMgcGFydCBzYXlzIHRoYXQgYXMgbG9uZyBhcyBhbiBhcHBsaWNhdGlvbiBoYXMgbm90 IGNhbGxlZA0KPiA+ID4gcnRlX2Zsb3dfZGVzdHJveSgpIG9uIGEgZmxvdyBydWxlLCBpdCBuZXZl ciBkaXNhcHBlYXJzLCB3aGF0ZXZlcg0KPiA+ID4gaGFwcGVucyB0byB0aGUgcG9ydCAoc3RvcHBl ZCwgcmVzdGFydGVkKS4gVGhlIGFwcGxpY2F0aW9uIGlzIG5vdA0KPiA+ID4gcmVzcG9uc2libGUg Zm9yIHJlLWNyZWF0aW5nIHJ1bGVzIGFmdGVyIHRoYXQuDQo+ID4gPg0KPiA+ID4gTm90ZSB0aGF0 IGFjY29yZGluZyB0byB0aGUgc3BlY2lmaWNhdGlvbiwgdGhpcyBtYXkgdHJhbnNsYXRlIHRvIG5v dA0KPiA+ID4gYmVpbmcgYWJsZSB0byBzdG9wIGEgcG9ydCBhcyBsb25nIGFzIGEgZmxvdyBydWxl IGlzIHByZXNlbnQsDQo+ID4gPiBkZXBlbmRpbmcgb24gaG93IG5pY2UgdGhlIFBNRCBpbnRlbmRz IHRvIGJlIHdpdGggYXBwbGljYXRpb25zLg0KPiA+ID4gSW1wbGVtZW50YXRpb24gY2FuIGJlIGRv bmUgaW4gc21hbGwgc3RlcHMgd2l0aCBtaW5pbWFsIGFtb3VudCBvZiBjb2RlIG9uDQo+IHRoZSBQ TUQgc2lkZS4NCj4gPiBEb2VzIGl0IG1lYW4gUE1EIHNob3VsZCBzdG9yZSBhbmQgbWFpbnRhaW4g YWxsIHRoZSBydWxlcz8gV2h5IG5vdCBsZXQgcnRlIGRvDQo+IHRoYXQ/IEkgdGhpbmsgaWYgUE1E IG1haW50YWluIGFsbCB0aGUgcnVsZXMsIGl0IG1lYW5zIGV2ZXJ5IGtpbmQgb2YgTklDIHNob3Vs ZCBoYXZlDQo+IGEgY29weSBvZiBjb2RlIGZvciB0aGUgcnVsZXMuIEJ1dCBpZiBydGUgZG8gdGhh dCwgb25seSBvbmUgY29weSBvZiBjb2RlIG5lZWQgdG8gYmUNCj4gbWFpbnRhaW5lZCwgcmlnaHQ/ DQo+IA0KPiBJJ3ZlIGNvbnNpZGVyZWQgaGF2aW5nIHJ1bGVzIHN0b3JlZCBpbiBhIGNvbW1vbiBm b3JtYXQgdW5kZXJzdG9vZCBhdCB0aGUgUlRFDQo+IGxldmVsIGFuZCBub3Qgc3BlY2lmaWMgdG8g ZWFjaCBQTUQgYW5kIGRlY2lkZWQgdGhhdCB0aGUgb3BhcXVlIHJ0ZV9mbG93IHBvaW50ZXINCj4g d2FzIGEgYmV0dGVyIGNob2ljZSBmb3IgdGhlIGZvbGxvd2luZyByZWFzb25zOg0KPiANCj4gLSBF dmVuIHRob3VnaCBmbG93IHJ1bGVzIG1hbmFnZW1lbnQgaXMgZG9uZSBpbiB0aGUgY29udHJvbCBw YXRoLCBwcm9jZXNzaW5nDQo+ICAgbXVzdCBiZSBhcyBmYXN0IGFzIHBvc3NpYmxlLiBMZXR0aW5n IFBNRHMgc3RvcmUgZmxvdyBydWxlcyB1c2luZyB0aGVpciBvd24NCj4gICBpbnRlcm5hbCByZXBy ZXNlbnRhdGlvbiBnaXZlcyB0aGVtIHRoZSBjaGFuY2UgdG8gYWNoaWV2ZSBiZXR0ZXINCj4gICBw ZXJmb3JtYW5jZS4NCk5vdCBxdWl0ZSB1bmRlcnN0YW5kLiBJIHRoaW5rIHdlJ3JlIHRhbGtpbmcg YWJvdXQgbWFpbnRhaW4gdGhlIHJ1bGVzIGJ5IFNXLiBJIGRvbuKAmXQgdGhpbmsgdGhlcmUncyBz b21ldGhpbmcgbmVlZCB0byBiZSBvcHRpbWl6ZWQgYWNjb3JkaW5nIHRvIHNwZWNpZmljIE5JQ3Mu IElmIHdlIG5lZWQgdG8gb3B0aW1pemUgdGhlIGNvZGUsIEkgdGhpbmsgd2UgbmVlZCB0byBjb25z aWRlciB0aGUgQ1BVLCBPUyAuLi4gYW5kIHNvbWUgY29tbW9uIG1lYW5zLiBJJ20gd3Jvbmc/DQoN Cj4gDQo+IC0gQW4gb3BhcXVlIGNvbnRleHQgbWFuYWdlZCBieSBQTURzIHdvdWxkIHByb2JhYmx5 IGhhdmUgdG8gYmUgc3RvcmVkDQo+ICAgc29tZXdoZXJlIGFzIHdlbGwgYW55d2F5Lg0KPiANCj4g LSBQTURzIG1heSBub3QgbmVlZCB0byBhbGxvY2F0ZS9zdG9yZSBhbnl0aGluZyBhdCBhbGwgaWYg dGhleSBleGNsdXNpdmVseQ0KPiAgIHJlbHkgb24gSFcgc3RhdGUgZm9yIGV2ZXJ5dGhpbmcuIElu IG15IG9waW5pb24sIHRoZSBnZW5lcmljIEFQSSBoYXMgZW5vdWdoDQo+ICAgY29uc3RyYWludHMg Zm9yIHRoaXMgdG8gd29yayBhbmQgbWFpbnRhaW4gY29uc2lzdGVuY3kgYmV0d2VlbiBmbG93DQo+ ICAgcnVsZXMuIE5vdGUgdGhpcyBpcyBjdXJyZW50bHkgaG93IG1vc3QgUE1EcyBpbXBsZW1lbnQg RkRJUiBhbmQgb3RoZXINCj4gICBmaWx0ZXIgdHlwZXMuDQpZZXMsIHRoZSBydWxlcyBhcmUgc3Rv cmVkIGJ5IEhXLiBCdXQgY29uc2lkZXJpbmcgc3RvcC9zdGFydCB0aGUgZGV2aWNlLCB0aGUgcnVs ZXMgaW4gSFcgd2lsbCBsb3NlLiB3ZSBoYXZlIHRvIHN0b3JlIHRoZSBydWxlcyBieSBTVyBhbmQg cmUtcHJvZ3JhbSB0aGVtIHdoZW4gcmVzdGFydGluZyB0aGUgZGV2aWNlLg0KQW5kIGluIGV4aXN0 aW5nIGNvZGUsIHdlIHN0b3JlIHRoZSBmaWx0ZXJzIGJ5IFNXIGF0IGxlYXN0IG9uIEludGVsIE5J Q3MuIEJ1dCBJIHRoaW5rIHdlIGNhbm5vdCByZXVzZSB0aGVtLCBiZWNhdXNlIGNvbnNpZGVyaW5n IHRoZSBwcmlvcml0eSBhbmQgd2hpY2ggY2F0ZWdvcnkgb2YgZmlsdGVyIHNob3VsZCBiZSBjaG9z ZW4sIEkgdGhpbmsgd2UgbmVlZCBhIHdob2xlIG5ldyB0YWJsZSBmb3IgZ2VuZXJpYyBBUEkuIEkg dGhpbmsgaXTigJlzIHdoYXQncyBkZXNpZ25lZCBub3csIHJpZ2h0Pw0KDQo+IA0KPiAtIFJURSBj YW4gKGFuZCB3aWxsKSBwcm92aWRlIGhlbHBlcnMgdG8gYXZvaWQgbW9zdCBvZiB0aGUgY29kZSBy ZWR1bmRhbmN5LA0KPiAgIFBNRHMgYXJlIGZyZWUgdG8gdXNlIHRoZW0gb3IgbWFuYWdlIGV2ZXJ5 dGhpbmcgYnkgdGhlbXNlbHZlcy4NCj4gDQo+IC0gR2l2ZW4gdGhhdCB0aGUgb3BhcXVlIHJ0ZV9m bG93IHBvaW50ZXIgYXNzb2NpYXRlZCB3aXRoIGEgZmxvdyBydWxlIGlzIHRvDQo+ICAgYmUgc3Rv cmVkIGJ5IHRoZSBhcHBsaWNhdGlvbiwgUE1EcyBkbyBub3QgZXZlbiBoYXZlIHRvIGtlZXAgcmVm ZXJlbmNlcyB0bw0KPiAgIHRoZW0uDQpEb27igJl0IHVuZGVyc3RhbmQuIE1vcmUgZGV0YWlscz8N Cg0KPiANCj4gLSBUaGUgZmxvdyBydWxlcyBmb3JtYXQgZGVzY3JpYmVkIGluIHRoaXMgc3BlY2lm aWNhdGlvbiAocGF0dGVybiAvIGFjdGlvbnMpDQo+ICAgd2lsbCBiZSB1c2VkIGJ5IGFwcGxpY2F0 aW9ucyBkaXJlY3RseSwgYW5kIHdpbGwgYmUgZnJlZSB0byBhcnJhbmdlIHRoZW0gaW4NCj4gICBs aXN0cywgdHJlZXMgb3IgaW4gYW55IG90aGVyIHdheSBpZiB0aGV5IG5lZWQgdG8ga2VlcCBmbG93 IHNwZWNpZmljYXRpb25zDQo+ICAgYXJvdW5kIGZvciBmdXJ0aGVyIHByb2Nlc3NpbmcuDQpXaG8g d2lsbCBjcmVhdGUgdGhlIGxpc3RzLCB0cmVlcyBvciBzb21ldGhpbmcgZWxzZT8gQWNjb3JkaW5n IHRvIHByZXZpb3VzIGRpc2N1c3Npb24sIEkgdGhpbmsgdGhlIEFQUCB3aWxsIHByb2dyYW0gdGhl IHJ1bGVzIG9uZSBieSBvbmUuIFNvIGlmIEFQUCBvcmdhbml6ZSB0aGUgcnVsZXMgdG8gbGlzdHMs IHRyZWVzLi4uLCBQTUQgZG9lc27igJl0IGtub3cgdGhhdC4gDQpBbmQgeW91IHNhaWQgIiBHaXZl biB0aGF0IHRoZSBvcGFxdWUgcnRlX2Zsb3cgcG9pbnRlciBhc3NvY2lhdGVkIHdpdGggYSBmbG93 IHJ1bGUgaXMgdG8gYmUgc3RvcmVkIGJ5IHRoZSBhcHBsaWNhdGlvbiAiLiBJJ20gbG9zdCBoZXJl Lg0KDQo+IA0KPiA+IFdoZW4gdGhlIHBvcnQgaXMgc3RvcHBlZCBhbmQgcmVzdGFydGVkLCBydGUg Y2FuIHJlY29uZmlndXJlIHRoZSBydWxlcy4gSXMgdGhlDQo+IGNvbmNlcm4gdGhhdCBQTUQgbWF5 IGFkanVzdCB0aGUgc2VxdWVuY2Ugb2YgdGhlIHJ1bGVzIGFjY29yZGluZyB0byB0aGUgcHJpb3Jp dHksDQo+IHNvIGV2ZXJ5IE5JQyBoYXMgYSBkaWZmZXJlbnQgbGlzdCBvZiBydWxlcz8gQnV0IFBN RCBjYW4gYWRqdXN0IHRoZW0gYWdhaW4gd2hlbg0KPiBydGUgcmVjb25maWd1cmluZyB0aGUgcnVs ZXMuDQo+IA0KPiBXaGF0IGFib3V0IFBNRHMgYWJsZSB0byBzdG9wIGFuZCByZXN0YXJ0IHBvcnRz IHdpdGhvdXQgZGVzdHJveWluZyB0aGVpciBvd24NCj4gZmxvdyBydWxlcz8gSWYgd2UgYXNzdW1l IGZsb3cgcnVsZXMgbXVzdCBiZSBkZXN0cm95ZWQgd2hlbiBzdG9wcGluZyBhIHBvcnQsDQo+IHRo ZXNlIFBNRHMgYXJlIG5lZWRsZXNzbHkgcGVuYWxpemVkIHdpdGggc2xvd2VyIHN0b3Avc3RhcnQg Y3ljbGVzLiBUaGluayBhYm91dA0KPiBpdCBhc3N1bWluZyB0aG91c2FuZHMgb2YgZmxvdyBydWxl cy4NCkkgYmVsaWV2ZSB0aGUgcnVsZXMgbWFpbnRhaW5lZCBieSBTVyBzaG91bGQgbm90IGJlIGRl c3Ryb3llZCwgYmVjYXVzZSB0aGV5J3JlIHVzZWQgdG8gYmUgcmUtcHJvZ3JhbWVkIHdoZW4gdGhl IGRldmljZSBzdGFydHMgYWdhaW4uDQoNCj4gDQo+IFRodXMgZnJvbSBhbiBhcHBsaWNhdGlvbiBw b2ludCBvZiB2aWV3LCB3aGF0ZXZlciBoYXBwZW5zIHdoZW4gc3RvcHBpbmcgYW5kDQo+IHJlc3Rh cnRpbmcgYSBwb3J0IHNob3VsZCBub3QgbWF0dGVyLiBJZiBhIGZsb3cgcnVsZSB3YXMgcHJlc2Vu dCBiZWZvcmUsIGl0IG11c3QNCj4gc3RpbGwgYmUgcHJlc2VudCBhZnRlcndhcmRzLiBJZiB0aGUg UE1EIGhhZCB0byBkZXN0cm95IGZsb3cgcnVsZXMgYW5kIHJlLWNyZWF0ZQ0KPiB0aGVtLCBpdCBk b2VzIG5vdCBhY3R1YWxseSBtYXR0ZXIgaWYgdGhleSBkaWZmZXIgc2xpZ2h0bHkgYXQgdGhlIEhX IGxldmVsLCBhcyBsb25nIGFzOg0KPiANCj4gLSBFeGlzdGluZyBvcGFxdWUgZmxvdyBydWxlIHBv aW50ZXJzIChydGVfZmxvdykgYXJlIHN0aWxsIHZhbGlkIHRvIHRoZSBQTUQNCj4gICBhbmQgcmVm ZXIgdG8gdGhlIHNhbWUgcnVsZXMuDQo+IA0KPiAtIFRoZSBvdmVyYWxsIGJlaGF2aW9yIG9mIGFs bCBydWxlcyBpcyB0aGUgc2FtZS4NCj4gDQo+IFRoZSBsaXN0IG9mIHJ1bGVzIHlvdSB0aGluayBv ZiAocGF0dGVybnMgLyBhY3Rpb25zKSBpcyBtYWludGFpbmVkIGJ5IGFwcGxpY2F0aW9ucw0KPiAo bm90IFJURSksIGFuZCBvbmx5IGlmIHRoZXkgbmVlZCB0aGVtLiBSVEUgd291bGQgbmVlZGxlc3Ns eSBkdXBsaWNhdGUgdGhpcy4NCkFzIHNhaWQgYmVmb3JlLCBuZWVkIG1vcmUgZGV0YWlscyB0byB1 bmRlcnN0YW5kIHRoaXMuIE1heWJlIGFuIGV4YW1wbGUgaXMgYmV0dGVyIDopDQoNCj4gDQo+IC0t DQo+IEFkcmllbiBNYXphcmd1aWwNCj4gNldJTkQNCg==