From mboxrd@z Thu Jan 1 00:00:00 1970 Authentication-Results: mx.groups.io; dkim=missing; spf=pass (domain: intel.com, ip: 134.134.136.65, mailfrom: liming.gao@intel.com) Received: from mga03.intel.com (mga03.intel.com [134.134.136.65]) by groups.io with SMTP; Mon, 15 Jul 2019 08:22:23 -0700 X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from orsmga006.jf.intel.com ([10.7.209.51]) by orsmga103.jf.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 15 Jul 2019 08:22:23 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.63,493,1557212400"; d="scan'208";a="172260265" Received: from fmsmsx108.amr.corp.intel.com ([10.18.124.206]) by orsmga006.jf.intel.com with ESMTP; 15 Jul 2019 08:22:22 -0700 Received: from fmsmsx115.amr.corp.intel.com (10.18.116.19) by FMSMSX108.amr.corp.intel.com (10.18.124.206) with Microsoft SMTP Server (TLS) id 14.3.439.0; Mon, 15 Jul 2019 08:22:22 -0700 Received: from shsmsx103.ccr.corp.intel.com (10.239.4.69) by fmsmsx115.amr.corp.intel.com (10.18.116.19) with Microsoft SMTP Server (TLS) id 14.3.439.0; Mon, 15 Jul 2019 08:22:21 -0700 Received: from shsmsx104.ccr.corp.intel.com ([169.254.5.110]) by SHSMSX103.ccr.corp.intel.com ([169.254.4.109]) with mapi id 14.03.0439.000; Mon, 15 Jul 2019 23:22:20 +0800 From: "Liming Gao" To: "devel@edk2.groups.io" , "lersek@redhat.com" , "Gao, Zhichao" , "Kinney, Michael D" CC: Marvin H?user , =?utf-8?B?UGhpbGlwcGUgTWF0aGlldS1EYXVkw6k=?= Subject: Re: [edk2-devel] [PATCH 2/3] MdePkg/BaseLib: rewrite Base64Decode() Thread-Topic: [edk2-devel] [PATCH 2/3] MdePkg/BaseLib: rewrite Base64Decode() Thread-Index: AQHVMMEBIc+dkukv2EOVhGiK4L1Nk6bFzDaAgAEc5QCABPbCcA== Date: Mon, 15 Jul 2019 15:22:19 +0000 Message-ID: <4A89E2EF3DFEDB4C8BFDE51014F606A14E4A8656@SHSMSX104.ccr.corp.intel.com> References: <20190702102836.27589-1-lersek@redhat.com> <20190702102836.27589-3-lersek@redhat.com> <3CE959C139B4C44DBEA1810E3AA6F9000B80750F@SHSMSX101.ccr.corp.intel.com> <35840ec1-6208-1a6f-b7a2-e63f929118fe@redhat.com> In-Reply-To: <35840ec1-6208-1a6f-b7a2-e63f929118fe@redhat.com> Accept-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: x-ctpclassification: CTP_NT x-titus-metadata-40: eyJDYXRlZ29yeUxhYmVscyI6IiIsIk1ldGFkYXRhIjp7Im5zIjoiaHR0cDpcL1wvd3d3LnRpdHVzLmNvbVwvbnNcL0ludGVsMyIsImlkIjoiMzBmYjlhMGEtMDI2Ny00YjMwLWE5NTgtZmI3NGVmZWI2OWMyIiwicHJvcHMiOlt7Im4iOiJDVFBDbGFzc2lmaWNhdGlvbiIsInZhbHMiOlt7InZhbHVlIjoiQ1RQX05UIn1dfV19LCJTdWJqZWN0TGFiZWxzIjpbXSwiVE1DVmVyc2lvbiI6IjE3LjEwLjE4MDQuNDkiLCJUcnVzdGVkTGFiZWxIYXNoIjoiaVZraUduQ1NIdFV0aHJUREtiR1JWNWRERGFDVFpCT2s2K3VzZHlEOGJiVUV5VlVCaG5TcThucVhoUVNLRWhpUSJ9 dlp-product: dlpe-windows dlp-version: 11.0.600.7 dlp-reaction: no-action x-originating-ip: [10.239.127.40] MIME-Version: 1.0 Return-Path: liming.gao@intel.com Content-Language: en-US Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 TGFzemxvOg0KDQo+IC0tLS0tT3JpZ2luYWwgTWVzc2FnZS0tLS0tDQo+IEZyb206IGRldmVsQGVk azIuZ3JvdXBzLmlvIFttYWlsdG86ZGV2ZWxAZWRrMi5ncm91cHMuaW9dIE9uIEJlaGFsZiBPZiBM YXN6bG8gRXJzZWsNCj4gU2VudDogU2F0dXJkYXksIEp1bHkgMTMsIDIwMTkgMzozMSBBTQ0KPiBU bzogR2FvLCBaaGljaGFvIDx6aGljaGFvLmdhb0BpbnRlbC5jb20+OyBkZXZlbEBlZGsyLmdyb3Vw cy5pbzsgR2FvLCBMaW1pbmcgPGxpbWluZy5nYW9AaW50ZWwuY29tPjsgS2lubmV5LCBNaWNoYWVs IEQNCj4gPG1pY2hhZWwuZC5raW5uZXlAaW50ZWwuY29tPg0KPiBDYzogTWFydmluIEjDpHVzZXIg PG1oYWV1c2VyQG91dGxvb2suZGU+OyBQaGlsaXBwZSBNYXRoaWV1LURhdWTDqSA8cGhpbG1kQHJl ZGhhdC5jb20+DQo+IFN1YmplY3Q6IFJlOiBbZWRrMi1kZXZlbF0gW1BBVENIIDIvM10gTWRlUGtn L0Jhc2VMaWI6IHJld3JpdGUgQmFzZTY0RGVjb2RlKCkNCj4gDQo+IE9uIDA3LzEyLzE5IDA0OjMx LCBHYW8sIFpoaWNoYW8gd3JvdGU6DQo+ID4gU29ycnkgZm9yIGxhdGUgcmVzcG9uZC4NCj4gPiBU aGUgd2hvbGUgY29kZSBpcyBPSyBmb3IgbWUuIEFuZCBJIHdyaXRlIGEgdGlueSB0ZXN0IGZvciBp dCB3aXRob3V0IHRoZSBtZW1vcnkgYWRkcmVzcyBjaGVjay4gU2VlDQo+IGh0dHBzOi8vZ2l0aHVi LmNvbS9aaGljaGFvR2FvL2VkazIvY29tbWl0LzYxNTM1NmJhMzJkMzE0Nzk1N2QyMTVkZWJkODQ0 ZTc3MDlmMDY4NDkgLiBJdCBpcyB0ZXN0ZWQgaW4gRW11bGF0b3IgZW52aXJvbm1lbnQuIElmDQo+ IGl0IGlzIE9LLCBJIHRoaW5rIHlvdSBjYW4gdGFrZSBteSBUZXN0ZWQtYnkgZm9yIHRoaXMgcGF0 Y2guIElmIHRoZXJlIGFyZSBzb21lIG1pc3NpbmcsIHBsZWFzZSBsZXQgbWUga25vdy4NCj4gDQo+ IFRoYW5rcyBmb3Igd3JpdGluZyB0aGF0IHRlc3QgYXBwLiBJdCBzZWVtcyB0byBoYXZlIHByZXR0 eSBnb29kIGNvdmVyYWdlLg0KPiBJIGxpa2UgdGhhdCBpdCBjb3ZlcnMgdGhlIGV4aXQgcG9pbnRz IHN5c3RlbWF0aWNhbGx5Lg0KPiANCj4gTWlrZSwgTGltaW5nOiBJIGludGVuZCB0byBwaWNrIHVw IFpoaWNoYW8ncyBULWIsIGZyb20gYWJvdmUuIElmIHlvdSBhcmUNCj4gYXdhcmUgb2YgYW5vdGhl ciB0ZXN0IHN1aXRlIChwZXJoYXBzIHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCB0aGUNCj4gb3Jp Z2luYWxseSBjb250cmlidXRlZCBCYXNlNjREZWNvZGUoKSBpbXBsKSwgcGxlYXNlIGxldCBtZSBr bm93Lg0KDQpPSyB0byBtZS4NCg0KPiANCj4gPiBCYXNlNjREZWNvZGUgcGFyYW1ldGVyIFNvdXJj ZSBpcyBpbmRpY2F0ZSBhcyBPUFRJT05BTC4gQWx0aG91Z2ggaXQgaXMgT0sgdG8gYmUgTlVMTCwg YW5kIHJldHVybiBEZXN0aW5hdGlvblNpemUgdG8gYmUgemVybyB3aXRoDQo+IHN1Y2Nlc3Mgc3Rh dHVzIHRvIGluZGljYXRlIG5vIGRlY29kZSBvY2N1cnJlZCAuIEkgZG9uJ3Qga25vdyBpZiBpdCBp cyBtZWFuaW5nZnVsIHRvIHJlcG9ydCB0aGUgcmVzdWx0IGFzIHRoYXQuIEluIG15IG9waW5pb24s IE5VTEwgU291cmNlIGlzDQo+IGFuIGludmFsaWQgaW5wdXQuIEp1c3QgbXkgb3BpbmlvbiwgaWYg dGhlIG1haW50YWluZXIgaXMgT0sgd2l0aCB0aGF0LCBJIGFtIE9LIHRvby4NCg0KWWVzLiBTb3Vy Y2UgaXMgTlVMTCwgU291cmNlU2l6ZSBpcyB6ZXJvLiBDb2RlIGRvZXMgbm90aGluZy4gSSBhbSBm aW5lIHdpdGggaXQuIA0KDQpJIGhhdmUgbm8gb3RoZXIgY29tbWVudHMgZm9yIHRoZSBjb2RlIGxv Z2ljLiBSZXZpZXdlZC1ieTogTGltaW5nIEdhbyA8bGltaW5nLmdhb0BpbnRlbC5jb20+DQoNCj4g DQo+IEkgdGhpbmsgdGhhdCBpdCBpcyBoZWxwZnVsLiBJdCBpcyBzaW1pbGFyIHRvIHRoZSBzdGFu ZGFyZCBDIGZ1bmN0aW9uDQo+IGZyZWUoKSBhY2NlcHRpbmcgTlVMTCAoaXQgaXMgYSBuby1vcCku IEVkazIncyBGcmVlUG9vbCgpIGRvZXNuJ3QgYWNjZXB0DQo+IE5VTEwsIGFuZCB0aGF0IGlzIGlu Y29udmVuaWVudCBzb21ldGltZXMuDQo+IA0KPiBDb25zaWRlciB0aGUgZm9sbG93aW5nIHVzZSBj YXNlLiBUaGVyZSBpcyBzb21lIGNvZGUgdGhhdCBvcHRpb25hbGx5DQo+IHJlY2VpdmVzIGRhdGEg YW5kIHRoZW4gZGVjb2RlcyBpdCBmcm9tIGJhc2U2NC4gQnkgZGVmYXVsdCB0aGF0IGRhdGEgaXMN Cj4gcmVwcmVzZW50ZWQgYXMgYSBOVUxMIHBvaW50ZXIsIHdpdGggc2l6ZSAwLiBJZiBCYXNlNjRE ZWNvZGUoKSBkb2VzIG5vdA0KPiBhY2NlcHQgTlVMTCBpbnB1dCB3aXRoIHNpemUgMCwgdGhlbiB0 aGUgY29kZSBpbiBxdWVzdGlvbiBoYXMgdG8NCj4gaW1wbGVtZW50IGEgc2VwYXJhdGUgY2hlY2sg Zm9yIHRoYXQuIEJ1dCBpdCBrZWVwcyB0aGUgY2FsbCBzaXRlIHNpbXBsZXINCj4gaWYgQmFzZTY0 RGVjb2RlKCkgZXhwbGljaXRseSBzcGVjaWZpZXMgImRvIG5vdGhpbmciLCBmb3IgdGhvc2UgcGFy YW1ldGVyDQo+IHZhbHVlcy4NCj4gDQo+IENvbnNpZGVyIENvcHlNZW0oKSBhbmQgQ29tcGFyZU1l bSgpIHRvby4gSW4gcHJhY3RpY2UsIGlmIHlvdSBwYXNzDQo+IExlbmd0aD0wLCB0aGV5IHdpbGwg d29yayBqdXN0IGZpbmUsIGV2ZW4gaW4gY2FzZSB0aGUgYnVmZmVycyBhcmUgTlVMTC4NCj4gVGhl c2UgZnVuY3Rpb25zIHdpbGwgZXhoaWJpdCB0aGUgZXhwZWN0ZWQgLyBpbnR1aXRpdmUgYmVoYXZp b3IgLS0gdGhleQ0KPiB3aWxsIG5vdCBkZXJlZmVyZW5jZSBOVUxMLiBIb3dldmVyLCBiZWNhdXNl IHRoZWlyIGludGVyZmFjZSBjb250cmFjdHMNCj4gZG9uJ3Qgc3BlbGwgb3V0IHRoaXMgY2FzZSBh cyB2YWxpZCAoaS5lLiBPUFRJT05BTCksICp0ZWNobmljYWxseSogc3VjaA0KPiBjYWxscyBhcmUg bm90IHBlcm1pdHRlZCwgYW5kIHNvIGV2ZXJ5IENvcHlNZW0oKSBhbmQgQ29tcGFyZU1lbSgpIGNh bGwNCj4gc2l0ZSBoYXMgdG8gYmUgc3Vycm91bmRlZCB3aXRoIGlmJ3MsIGlmIE5VTEwgYnVmZmVy cyB3aXRoIHNpemUgMCBhcmUNCj4gb3RoZXJ3aXNlIHBvc3NpYmxlIHRoZXJlLiBUaGF0J3MgYSB3 YXN0ZSAtLSBpdCBkdXBsaWNhdGVzIGNoZWNrcyBhbmQgaXQNCj4gbWFrZXMgdGhlIGNhbGwgc2l0 ZSBpbmNvbnZlbmllbnQuDQo+IA0KPiBOVUxMIGlucHV0IHdpdGggbm9uemVybyBzaXplIGlzIGNh dWdodCBhbmQgcmVqZWN0ZWQgKGFzIGRlc2NyaWJlZCBpbiB0aGUNCj4gZnVuY3Rpb24ncyBzcGVj aWZpY2F0aW9uKS4gIk9QVElPTkFMIiBkb2VzIG5vdCBtZWFuIHRoYXQgdGhlIGJ1ZmZlciBjYW4N Cj4gYmUgTlVMTCB1bmRlciAqYW55KiBjaXJjdW1zdGFuY2VzIC0tIGl0IG1lYW5zIHRoYXQgaXQg Y2FuIGJlIE5VTEwgdW5kZXINCj4gKnNvbWUqIChzcGVjaWZpZWQpIGNpcmN1bXN0YW5jZXMuDQo+ IA0KPiA+DQo+ID4gU29tZSBvdGhlciBtaW5vciBjb21tZW50IGFib3V0IHRoZSBibG9jayBzY29w ZSB2YXJpYWJsZSBibG93Lg0KPiA+DQo+ID4+IC0tLS0tT3JpZ2luYWwgTWVzc2FnZS0tLS0tDQo+ ID4+IEZyb206IGRldmVsQGVkazIuZ3JvdXBzLmlvIFttYWlsdG86ZGV2ZWxAZWRrMi5ncm91cHMu aW9dIE9uIEJlaGFsZiBPZg0KPiA+PiBMYXN6bG8gRXJzZWsNCj4gPj4gU2VudDogVHVlc2RheSwg SnVseSAyLCAyMDE5IDY6MjkgUE0NCj4gPj4gVG86IGVkazItZGV2ZWwtZ3JvdXBzLWlvIDxkZXZl bEBlZGsyLmdyb3Vwcy5pbz4NCj4gPj4gQ2M6IEdhbywgTGltaW5nIDxsaW1pbmcuZ2FvQGludGVs LmNvbT47IE1hcnZpbiBIw6R1c2VyDQo+ID4+IDxtaGFldXNlckBvdXRsb29rLmRlPjsgS2lubmV5 LCBNaWNoYWVsIEQgPG1pY2hhZWwuZC5raW5uZXlAaW50ZWwuY29tPjsNCj4gPj4gUGhpbGlwcGUg TWF0aGlldS1EYXVkw6kgPHBoaWxtZEByZWRoYXQuY29tPjsgR2FvLCBaaGljaGFvDQo+ID4+IDx6 aGljaGFvLmdhb0BpbnRlbC5jb20+DQo+ID4+IFN1YmplY3Q6IFtlZGsyLWRldmVsXSBbUEFUQ0gg Mi8zXSBNZGVQa2cvQmFzZUxpYjogcmV3cml0ZSBCYXNlNjREZWNvZGUoKQ0KPiA+Pg0KPiA+PiBS ZXdyaXRlIEJhc2U2NERlY29kZSgpIGZyb20gc2NyYXRjaCwgZHVlIHRvIHJlYXNvbnMgbGlzdGVk IGluIHRoZSBzZWNvbmQNCj4gPj4gcmVmZXJlbmNlIGJlbG93Lg0KPiA+Pg0KPiA+PiBJbXBsZW1l bnQgQmFzZTY0RGVjb2RlKCkgYWNjb3JkaW5nIHRvIHRoZSBzcGVjaWZpY2F0aW9uIGFkZGVkIGlu IHRoZQ0KPiA+PiBwcmV2aW91cyBwYXRjaC4gVGhlIGRlY29kZXIgc2NhbnMgdGhlIGlucHV0IGJ1 ZmZlciBvbmNlLCBpdCBoYXMgbm8gaW5uZXINCj4gPj4gbG9vcChzKSwgYW5kIGl0IHNwaWxscyBl YWNoIG91dHB1dCBieXRlIGFzIHNvb24gYXMgdGhlIG91dHB1dCBieXRlIGlzIGNvbXBsZXRlLg0K PiA+Pg0KPiA+PiBDYzogTGltaW5nIEdhbyA8bGltaW5nLmdhb0BpbnRlbC5jb20+DQo+ID4+IENj OiBNYXJ2aW4gSMOkdXNlciA8bWhhZXVzZXJAb3V0bG9vay5kZT4NCj4gPj4gQ2M6IE1pY2hhZWwg RCBLaW5uZXkgPG1pY2hhZWwuZC5raW5uZXlAaW50ZWwuY29tPg0KPiA+PiBDYzogUGhpbGlwcGUg TWF0aGlldS1EYXVkw6kgPHBoaWxtZEByZWRoYXQuY29tPg0KPiA+PiBDYzogWmhpY2hhbyBHYW8g PHpoaWNoYW8uZ2FvQGludGVsLmNvbT4NCj4gPj4gUmVmOiBodHRwczovL2J1Z3ppbGxhLnRpYW5v Y29yZS5vcmcvc2hvd19idWcuY2dpP2lkPTE4OTENCj4gPj4gUmVmOiBodHRwOi8vbWlkLm1haWwt YXJjaGl2ZS5jb20vYzQ5NWJkMGItZWE0ZC03MjA2LThhNGYtDQo+ID4+IGE3MTQ5NzYwZDE5YUBy ZWRoYXQuY29tDQo+ID4+IFNpZ25lZC1vZmYtYnk6IExhc3psbyBFcnNlayA8bGVyc2VrQHJlZGhh dC5jb20+DQo+ID4+IC0tLQ0KPiA+PiAgTWRlUGtnL0xpYnJhcnkvQmFzZUxpYi9TdHJpbmcuYyB8 IDI0OSArKysrKysrKysrKysrKysrKysrLQ0KPiA+PiAgMSBmaWxlIGNoYW5nZWQsIDI0NyBpbnNl cnRpb25zKCspLCAyIGRlbGV0aW9ucygtKQ0KPiA+Pg0KPiA+PiBkaWZmIC0tZ2l0IGEvTWRlUGtn L0xpYnJhcnkvQmFzZUxpYi9TdHJpbmcuYw0KPiA+PiBiL01kZVBrZy9MaWJyYXJ5L0Jhc2VMaWIv U3RyaW5nLmMgaW5kZXggZjgzOTcwMzVjMzJhLi42MTk4Y2NiYzk2NzINCj4gPj4gMTAwNjQ0DQo+ ID4+IC0tLSBhL01kZVBrZy9MaWJyYXJ5L0Jhc2VMaWIvU3RyaW5nLmMNCj4gPj4gKysrIGIvTWRl UGtnL0xpYnJhcnkvQmFzZUxpYi9TdHJpbmcuYw0KPiA+PiBAQCAtMTk3Myw4ICsxOTczLDI1MyBA QCBCYXNlNjREZWNvZGUgKA0KPiA+PiAgICBJTiBPVVQgVUlOVE4gICAgICAgKkRlc3RpbmF0aW9u U2l6ZQ0KPiA+PiAgICApDQo+ID4+ICB7DQo+ID4+IC0gIEFTU0VSVCAoRkFMU0UpOw0KPiA+PiAt ICByZXR1cm4gUkVUVVJOX0lOVkFMSURfUEFSQU1FVEVSOw0KPiA+PiArICBCT09MRUFOIFBhZGRp bmdNb2RlOw0KPiA+PiArICBVSU5UTiAgIFNpeEJpdEdyb3Vwc0NvbnN1bWVkOw0KPiA+PiArICBV SU5UMzIgIEFjY3VtdWxhdG9yOw0KPiA+PiArICBVSU5UTiAgIE9yaWdpbmFsRGVzdGluYXRpb25T aXplOw0KPiA+PiArICBVSU5UTiAgIFNvdXJjZUluZGV4Ow0KPiA+PiArDQo+ID4+ICsgIGlmIChE ZXN0aW5hdGlvblNpemUgPT0gTlVMTCkgew0KPiA+PiArICAgIHJldHVybiBSRVRVUk5fSU5WQUxJ RF9QQVJBTUVURVI7DQo+ID4+ICsgIH0NCj4gPj4gKw0KPiA+PiArICAvLw0KPiA+PiArICAvLyBD aGVjayBTb3VyY2UgYXJyYXkgdmFsaWRpdHkuDQo+ID4+ICsgIC8vDQo+ID4+ICsgIGlmIChTb3Vy Y2UgPT0gTlVMTCkgew0KPiA+PiArICAgIGlmIChTb3VyY2VTaXplID4gMCkgew0KPiA+PiArICAg ICAgLy8NCj4gPj4gKyAgICAgIC8vIEF0IGxlYXN0IG9uZSBDSEFSOCBlbGVtZW50IGF0IE5VTEwg U291cmNlLg0KPiA+PiArICAgICAgLy8NCj4gPj4gKyAgICAgIHJldHVybiBSRVRVUk5fSU5WQUxJ RF9QQVJBTUVURVI7DQo+ID4+ICsgICAgfQ0KPiA+PiArICB9IGVsc2UgaWYgKFNvdXJjZVNpemUg PiBNQVhfQUREUkVTUyAtIChVSU5UTilTb3VyY2UpIHsNCj4gPj4gKyAgICAvLw0KPiA+PiArICAg IC8vIE5vbi1OVUxMIFNvdXJjZSwgYnV0IGl0IHdyYXBzIGFyb3VuZC4NCj4gPj4gKyAgICAvLw0K PiA+PiArICAgIHJldHVybiBSRVRVUk5fSU5WQUxJRF9QQVJBTUVURVI7DQo+ID4+ICsgIH0NCj4g Pj4gKw0KPiA+PiArICAvLw0KPiA+PiArICAvLyBDaGVjayBEZXN0aW5hdGlvbiBhcnJheSB2YWxp ZGl0eS4NCj4gPj4gKyAgLy8NCj4gPj4gKyAgaWYgKERlc3RpbmF0aW9uID09IE5VTEwpIHsNCj4g Pj4gKyAgICBpZiAoKkRlc3RpbmF0aW9uU2l6ZSA+IDApIHsNCj4gPj4gKyAgICAgIC8vDQo+ID4+ ICsgICAgICAvLyBBdCBsZWFzdCBvbmUgVUlOVDggZWxlbWVudCBhdCBOVUxMIERlc3RpbmF0aW9u Lg0KPiA+PiArICAgICAgLy8NCj4gPj4gKyAgICAgIHJldHVybiBSRVRVUk5fSU5WQUxJRF9QQVJB TUVURVI7DQo+ID4+ICsgICAgfQ0KPiA+PiArICB9IGVsc2UgaWYgKCpEZXN0aW5hdGlvblNpemUg PiBNQVhfQUREUkVTUyAtIChVSU5UTilEZXN0aW5hdGlvbikgew0KPiA+PiArICAgIC8vDQo+ID4+ ICsgICAgLy8gTm9uLU5VTEwgRGVzdGluYXRpb24sIGJ1dCBpdCB3cmFwcyBhcm91bmQuDQo+ID4+ ICsgICAgLy8NCj4gPj4gKyAgICByZXR1cm4gUkVUVVJOX0lOVkFMSURfUEFSQU1FVEVSOw0KPiA+ PiArICB9DQo+ID4+ICsNCj4gPj4gKyAgLy8NCj4gPj4gKyAgLy8gQ2hlY2sgZm9yIG92ZXJsYXAu DQo+ID4+ICsgIC8vDQo+ID4+ICsgIGlmIChTb3VyY2UgIT0gTlVMTCAmJiBEZXN0aW5hdGlvbiAh PSBOVUxMKSB7DQo+ID4+ICsgICAgLy8NCj4gPj4gKyAgICAvLyBCb3RoIGFycmF5cyBoYXZlIGJl ZW4gcHJvdmlkZWQsIGFuZCB3ZSBrbm93IGZyb20gZWFybGllciB0aGF0IGVhY2gNCj4gPj4gYXJy YXkNCj4gPj4gKyAgICAvLyBpcyB2YWxpZCBpbiBpdHNlbGYuDQo+ID4+ICsgICAgLy8NCj4gPj4g KyAgICBpZiAoKFVJTlROKVNvdXJjZSArIFNvdXJjZVNpemUgPD0gKFVJTlROKURlc3RpbmF0aW9u KSB7DQo+ID4+ICsgICAgICAvLw0KPiA+PiArICAgICAgLy8gU291cmNlIGFycmF5IHByZWNlZGVz IERlc3RpbmF0aW9uIGFycmF5LCBPSy4NCj4gPj4gKyAgICAgIC8vDQo+ID4+ICsgICAgfSBlbHNl IGlmICgoVUlOVE4pRGVzdGluYXRpb24gKyAqRGVzdGluYXRpb25TaXplIDw9IChVSU5UTilTb3Vy Y2UpIHsNCj4gPj4gKyAgICAgIC8vDQo+ID4+ICsgICAgICAvLyBEZXN0aW5hdGlvbiBhcnJheSBw cmVjZWRlcyBTb3VyY2UgYXJyYXksIE9LLg0KPiA+PiArICAgICAgLy8NCj4gPj4gKyAgICB9IGVs c2Ugew0KPiA+PiArICAgICAgLy8NCj4gPj4gKyAgICAgIC8vIE92ZXJsYXAuDQo+ID4+ICsgICAg ICAvLw0KPiA+PiArICAgICAgcmV0dXJuIFJFVFVSTl9JTlZBTElEX1BBUkFNRVRFUjsNCj4gPj4g KyAgICB9DQo+ID4+ICsgIH0NCj4gPj4gKw0KPiA+PiArICAvLw0KPiA+PiArICAvLyBEZWNvZGlu ZyBsb29wIHNldHVwLg0KPiA+PiArICAvLw0KPiA+PiArICBQYWRkaW5nTW9kZSAgICAgICAgICAg ICA9IEZBTFNFOw0KPiA+PiArICBTaXhCaXRHcm91cHNDb25zdW1lZCAgICA9IDA7DQo+ID4+ICsg IEFjY3VtdWxhdG9yICAgICAgICAgICAgID0gMDsNCj4gPj4gKyAgT3JpZ2luYWxEZXN0aW5hdGlv blNpemUgPSAqRGVzdGluYXRpb25TaXplOw0KPiA+PiArICAqRGVzdGluYXRpb25TaXplICAgICAg ICA9IDA7DQo+ID4+ICsNCj4gPj4gKyAgLy8NCj4gPj4gKyAgLy8gRGVjb2RpbmcgbG9vcC4NCj4g Pj4gKyAgLy8NCj4gPj4gKyAgZm9yIChTb3VyY2VJbmRleCA9IDA7IFNvdXJjZUluZGV4IDwgU291 cmNlU2l6ZTsgU291cmNlSW5kZXgrKykgew0KPiA+PiArICAgIENIQVI4ICBTb3VyY2VDaGFyOw0K PiA+PiArICAgIFVJTlQzMiBCYXNlNjRWYWx1ZTsNCj4gPj4gKyAgICBVSU5UOCAgRGVzdGluYXRp b25PY3RldDsNCj4gPg0KPiA+IFRoZSBsb2NhbCB2YXJpYWJsZSBkZWZpbmUgaW4gYSBibG9jayBz Y29wZS4gRm9yIENTU18yXzEgU2VjdGlvbiA1LjQuMS4xICJCbG9jayAobG9jYWwpIFNjb3BlIi4g SXQgaXMgc3Ryb25nbHkgZGlzY291cmFnZWQuIE1heWJlIHdlIHNob3VsZA0KPiBtb3ZlIHRoZW0g dG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgZnVuY3Rpb24uDQo+IA0KPiBZZXMsIEkgY2FuIGRvIHRo YXQuIFRoYW5rcyBmb3IgcG9pbnRpbmcgb3V0IHRoZSBleGFjdCBsb2NhdGlvbiBpbiB0aGUNCj4g Q0NTLiBCZWZvcmUgSSBwb3N0IHYyIHRob3VnaCwgSSdkIGxpa2UgdG8gaGVhciBiYWNrIGZyb20g dGhlIE1kZVBrZw0KPiBtYWludGFpbmVycyBhcyB3ZWxsLg0KPiANCj4gVGhhbmsgeW91IQ0KPiBM YXN6bG8NCj4gDQo+ID4+ICsNCj4gPj4gKyAgICBTb3VyY2VDaGFyID0gU291cmNlW1NvdXJjZUlu ZGV4XTsNCj4gPj4gKw0KPiA+PiArICAgIC8vDQo+ID4+ICsgICAgLy8gV2hpdGVzcGFjZSBpcyBp Z25vcmVkIGF0IGFsbCBwb3NpdGlvbnMgKHJlZ2FyZGxlc3Mgb2YgcGFkZGluZyBtb2RlKS4NCj4g Pj4gKyAgICAvLw0KPiA+PiArICAgIGlmIChTb3VyY2VDaGFyID09ICdcdCcgfHwgU291cmNlQ2hh ciA9PSAnXG4nIHx8IFNvdXJjZUNoYXIgPT0gJ1x2JyB8fA0KPiA+PiArICAgICAgICBTb3VyY2VD aGFyID09ICdcZicgfHwgU291cmNlQ2hhciA9PSAnXHInIHx8IFNvdXJjZUNoYXIgPT0gJyAnKSB7 DQo+ID4+ICsgICAgICBjb250aW51ZTsNCj4gPj4gKyAgICB9DQo+ID4+ICsNCj4gPg0KPiANCj4g DQo+IA0KDQo=