From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1756355AbcBCGNo (ORCPT ); Wed, 3 Feb 2016 01:13:44 -0500 Received: from mailout.micron.com ([137.201.242.129]:44606 "EHLO mailout.micron.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753028AbcBCGL4 (ORCPT ); Wed, 3 Feb 2016 01:11:56 -0500 From: =?gb2312?B?QmVhbiBIdW8gu/Sx87HzIChiZWFuaHVvKQ==?= To: Richard Weinberger , Bean Huo , "dedekind1@gmail.com" , "adrian.hunter@intel.com" , "computersforpeace@gmail.com" , "boris.brezillon@free-electrons.com" CC: "linux-mtd@lists.infradead.org" , "linux-kernel@vger.kernel.org" , "Zoltan Szubbocsev (zszubbocsev)" , =?gb2312?B?UGV0ZXIgUGFuIMXLtrAgKHBldGVycGFuZG9uZyk=?= Subject: RE: [PATCH v2 00/17] Add a bakvol module in UBI layer for MLC paired page power loss issue Thread-Topic: [PATCH v2 00/17] Add a bakvol module in UBI layer for MLC paired page power loss issue Thread-Index: AQHRXWH911hn6HMxNkKU1Vm3HHWaq58Y27sAgADJxRA= Date: Wed, 3 Feb 2016 06:11:18 +0000 Message-ID: References: <1454380252-16170-1-git-send-email-jackyard88@gmail.com> <56B13662.9020105@nod.at> In-Reply-To: <56B13662.9020105@nod.at> Accept-Language: zh-CN, en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: x-originating-ip: [10.167.84.5] x-tm-as-product-ver: SMEX-11.0.0.4179-8.000.1202-22108.003 x-tm-as-result: No--69.486000-0.000000-31 x-tm-as-user-approved-sender: Yes x-tm-as-user-blocked-sender: No x-mt-checkinternalsenderrule: True Content-Type: text/plain; charset="gb2312" MIME-Version: 1.0 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Transfer-Encoding: 8bit X-MIME-Autoconverted: from base64 to 8bit by mail.home.local id u136Dnka025700 Dear Richard Thanks for reviewing my patches and valuable feedback. I also want to work with you and Boris on such solution, I know this is a complicated task, need our joint effort. Following is my explanation for each of concerns: > Bean, > > Am 02.02.2016 um 03:30 schrieb Bean Huo: > > This version patches based on Linux kernel 4.2-rc7. > > > > v2: > > 1.Add CRC32 protection for user OOB area data. > > 2.Move recovery action from attach step to ubifs mount step. > > 3.Add more comments for some key function. > > 4.standard multi-plane program function. > > 5.Standard send-mail patches > > It is sad to see that you've ignored almost all review comments that have > been made. > Both comments made by Boris and me on the public mailing list as well as the > comments and I made on our phone call. > > To summarize, I see the following major issues with this patch series: > 1. It makes use of OOB, it was very clearly stated that this violates one of > UBI's design principles. Currently I still cannot find a good method on how to manage backup info. So now I still use OOB. Backup page OOB stores source page address, and source page OOB store backup page address, They store each other's page address, one is in order to indicate that backup page is really one copy data of source page, in case of source block being erased and re-mapped again. Another is in order to quickly find corresponding source page. > 2. It is not generic, you use hard coded constants for Micron 70s/80s MLC > NANDs. > And AFAICT it is not guaranteed that all MLC NANDs support multi pane > writes. Yes, so far ,different NAND vendor with different paired page sequence, So if guarantee all vendor NAND, should involve every vendor NAND paired page Sequence table or calculator function, but now I don't have other NAND vendor datasheet. > 3. Not all data is protected. Most of UBI's meta data (EC&VID headers, > volume table) > are explicitly not protected, as well as UBIFS's superblock and master > nodes. For master node: current UBIFS master node already has one copy for power loss, Just not cover MLC paired page power loss issue, if my previous Master node issue patch be accepted, master node totally does not need to protection. EC&VID: For EC header, according to my testing result data and our NAND PE cycle requirement, If EC header be damaged by power loss , mean erase count is ok, no impact on NAND life. But for VID header, because my solution uses dual plane page program, it has special page address Requirement on dual plane page address, that is page number should be the same. UBI already pre-program page 0 and page 1, so no page 1 is for VID. > 4. It mixes UBI and UBIFS code. Having code like this in UBI's EBA code is not > acceptable: > ubi_io_write_data(ubi, buf, pnum, offset, len, ((lnum < 3) ? 0 : 1)); > This hack is here to void safe writes of UBIFS's suberblock and master > nodes. > But UBIFS specific code has no business in UBI core code. Also See 3. These codes need to modify. Thanks. > 5. It does not scale. Having a backup of every important page would require > much more space. > Especially UBI EC and VID headers. I bet this is also the reason why the > current implementation > does not protect them. Otherwise the bakvol would fill up immediately. > Another scalability problem is that the whole bakvol has to be scanned > which will slow down > the attach/mount process and may void the speedup gained by Fastmap. This is also my concern, maybe next version I can fix this by store bakvol PEB info Into flash. > 6. It focuses only on UBIFS. ubi_corrupted_data_recovery() is only called > from UBIFS code. > If UBI is changed, we need a solution for all users on top of UBI. > Now I understand also why you want the "fs:ubifs:recovery:fixup UBIFS > cannot recover master node issue" > patch. As UBIFS master nodes are not protected by bakvol they will > corrupt and UBIFS is not able to recover > nor can run ubi_corrupted_data_recovery(). > > 7. A full bakvol is not proper handled. The implementation falls back to > "unsafe" writes. > dbg_gen("Allocate new PEB for Bakvol.\n"); > pbk = allo_new_block_for_bakvol(ubi, oppe_plane); > if (!pbk) { > ubi_err(ubi, "Allocate new PEB failed.\n"); > nobak = 1; > goto Only_source; > } > You cannot expect users to query the kernel log for such error messages. > > > Beside of these issues there are a lot of small implementation issues. > For example Fastmap is broken as UBI_FM_SB_VOLUME_ID clashes with > UBI_BACKUP_VOLUME_ID. > Or struct list_head is part of on-Flash data structures. > > That said, it don't think the bakvol approach is the solution we're looking for. > A proper solution has to fulfill the following conditions: > 1. No dependency on OOB data. > 2. Can work with any MLC NANDs and controllers. Boris and I have access to > Hynix, Micron and Toshiba NAND so far. > 3. If implemented on UBI level, it has to work for any user on top of UBI. > 4. Has to be able to protect all data. > 5. Must not regress current UBI or UBIFS. > > Boris and I are working on such a solution and would like to invite you to join > us. > The topic is complicated and not easy to solve. But with joined forces we will > be able to find a good solution. :-) Look forward to work with you for this. > Thanks, > //richard From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mailout.micron.com ([137.201.242.129]) by bombadil.infradead.org with esmtps (Exim 4.80.1 #2 (Red Hat Linux)) id 1aQqfO-00039C-1w for linux-mtd@lists.infradead.org; Wed, 03 Feb 2016 06:11:51 +0000 From: =?gb2312?B?QmVhbiBIdW8gu/Sx87HzIChiZWFuaHVvKQ==?= To: Richard Weinberger , Bean Huo , "dedekind1@gmail.com" , "adrian.hunter@intel.com" , "computersforpeace@gmail.com" , "boris.brezillon@free-electrons.com" CC: "linux-mtd@lists.infradead.org" , "linux-kernel@vger.kernel.org" , "Zoltan Szubbocsev (zszubbocsev)" , =?gb2312?B?UGV0ZXIgUGFuIMXLtrAgKHBldGVycGFuZG9uZyk=?= Subject: RE: [PATCH v2 00/17] Add a bakvol module in UBI layer for MLC paired page power loss issue Date: Wed, 3 Feb 2016 06:11:18 +0000 Message-ID: References: <1454380252-16170-1-git-send-email-jackyard88@gmail.com> <56B13662.9020105@nod.at> In-Reply-To: <56B13662.9020105@nod.at> Content-Language: en-US Content-Type: text/plain; charset="gb2312" Content-Transfer-Encoding: base64 MIME-Version: 1.0 List-Id: Linux MTD discussion mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , RGVhciBSaWNoYXJkDQpUaGFua3MgZm9yIHJldmlld2luZyBteSBwYXRjaGVzIGFuZCB2YWx1YWJs ZSBmZWVkYmFjay4gDQpJIGFsc28gd2FudCB0byB3b3JrIHdpdGggeW91IGFuZCBCb3JpcyBvbiBz dWNoIHNvbHV0aW9uLCANCkkga25vdyB0aGlzIGlzIGEgY29tcGxpY2F0ZWQgdGFzaywgbmVlZCBv dXIgam9pbnQgZWZmb3J0Lg0KDQpGb2xsb3dpbmcgaXMgbXkgZXhwbGFuYXRpb24gZm9yIGVhY2gg b2YgY29uY2VybnM6DQoNCj4gQmVhbiwNCj4gDQo+IEFtIDAyLjAyLjIwMTYgdW0gMDM6MzAgc2No cmllYiBCZWFuIEh1bzoNCj4gPiBUaGlzIHZlcnNpb24gcGF0Y2hlcyBiYXNlZCBvbiBMaW51eCBr ZXJuZWwgNC4yLXJjNy4NCj4gPg0KPiA+ICB2MjoNCj4gPiAgICAxLkFkZCBDUkMzMiBwcm90ZWN0 aW9uIGZvciB1c2VyIE9PQiBhcmVhIGRhdGEuDQo+ID4gICAgMi5Nb3ZlIHJlY292ZXJ5IGFjdGlv biBmcm9tIGF0dGFjaCBzdGVwIHRvIHViaWZzIG1vdW50IHN0ZXAuDQo+ID4gICAgMy5BZGQgbW9y ZSBjb21tZW50cyBmb3Igc29tZSBrZXkgZnVuY3Rpb24uDQo+ID4gICAgNC5zdGFuZGFyZCBtdWx0 aS1wbGFuZSBwcm9ncmFtIGZ1bmN0aW9uLg0KPiA+ICAgIDUuU3RhbmRhcmQgc2VuZC1tYWlsIHBh dGNoZXMNCj4gDQo+IEl0IGlzIHNhZCB0byBzZWUgdGhhdCB5b3UndmUgaWdub3JlZCBhbG1vc3Qg YWxsIHJldmlldyBjb21tZW50cyB0aGF0IGhhdmUNCj4gYmVlbiBtYWRlLg0KPiBCb3RoIGNvbW1l bnRzIG1hZGUgYnkgQm9yaXMgYW5kIG1lIG9uIHRoZSBwdWJsaWMgbWFpbGluZyBsaXN0IGFzIHdl bGwgYXMgdGhlDQo+IGNvbW1lbnRzIGFuZCBJIG1hZGUgb24gb3VyIHBob25lIGNhbGwuDQo+IA0K PiBUbyBzdW1tYXJpemUsIEkgc2VlIHRoZSBmb2xsb3dpbmcgbWFqb3IgaXNzdWVzIHdpdGggdGhp cyBwYXRjaCBzZXJpZXM6DQo+IDEuIEl0IG1ha2VzIHVzZSBvZiBPT0IsIGl0IHdhcyB2ZXJ5IGNs ZWFybHkgc3RhdGVkIHRoYXQgdGhpcyB2aW9sYXRlcyBvbmUgb2YNCj4gVUJJJ3MgZGVzaWduIHBy aW5jaXBsZXMuDQpDdXJyZW50bHkgSSBzdGlsbCBjYW5ub3QgZmluZCBhIGdvb2QgbWV0aG9kIG9u IGhvdyB0byBtYW5hZ2UgYmFja3VwIGluZm8uDQpTbyBub3cgSSBzdGlsbCB1c2UgT09CLg0KQmFj a3VwIHBhZ2UgT09CIHN0b3JlcyBzb3VyY2UgcGFnZSBhZGRyZXNzLCBhbmQgc291cmNlIHBhZ2Ug T09CIHN0b3JlIGJhY2t1cCBwYWdlIGFkZHJlc3MsDQpUaGV5IHN0b3JlIGVhY2ggb3RoZXIncyBw YWdlIGFkZHJlc3MsIG9uZSBpcyBpbiBvcmRlciB0byBpbmRpY2F0ZSB0aGF0IGJhY2t1cCBwYWdl DQppcyByZWFsbHkgb25lIGNvcHkgZGF0YSBvZiBzb3VyY2UgcGFnZSwgaW4gY2FzZSBvZiBzb3Vy Y2UgYmxvY2sgYmVpbmcgZXJhc2VkIGFuZCByZS1tYXBwZWQgYWdhaW4uDQpBbm90aGVyIGlzIGlu IG9yZGVyIHRvIHF1aWNrbHkgZmluZCBjb3JyZXNwb25kaW5nIHNvdXJjZSBwYWdlLg0KDQo+IDIu IEl0IGlzIG5vdCBnZW5lcmljLCB5b3UgdXNlIGhhcmQgY29kZWQgY29uc3RhbnRzIGZvciBNaWNy b24gNzBzLzgwcyBNTEMNCj4gTkFORHMuDQo+ICAgIEFuZCBBRkFJQ1QgaXQgaXMgbm90IGd1YXJh bnRlZWQgdGhhdCBhbGwgTUxDIE5BTkRzIHN1cHBvcnQgbXVsdGkgcGFuZQ0KPiB3cml0ZXMuDQpZ ZXMsIHNvIGZhciAsZGlmZmVyZW50IE5BTkQgdmVuZG9yIHdpdGggZGlmZmVyZW50IHBhaXJlZCBw YWdlIHNlcXVlbmNlLA0KU28gaWYgZ3VhcmFudGVlIGFsbCB2ZW5kb3IgTkFORCwgc2hvdWxkIGlu dm9sdmUgZXZlcnkgdmVuZG9yIE5BTkQgcGFpcmVkIHBhZ2UNClNlcXVlbmNlIHRhYmxlIG9yIGNh bGN1bGF0b3IgZnVuY3Rpb24sIGJ1dCBub3cgSSBkb24ndCBoYXZlIG90aGVyIE5BTkQgdmVuZG9y IA0KZGF0YXNoZWV0Lg0KDQo+IDMuIE5vdCBhbGwgZGF0YSBpcyBwcm90ZWN0ZWQuIE1vc3Qgb2Yg VUJJJ3MgbWV0YSBkYXRhIChFQyZWSUQgaGVhZGVycywNCj4gdm9sdW1lIHRhYmxlKQ0KPiAgICBh cmUgZXhwbGljaXRseSBub3QgcHJvdGVjdGVkLCBhcyB3ZWxsIGFzIFVCSUZTJ3Mgc3VwZXJibG9j ayBhbmQgbWFzdGVyDQo+IG5vZGVzLg0KRm9yIG1hc3RlciBub2RlOiANCmN1cnJlbnQgVUJJRlMg bWFzdGVyIG5vZGUgYWxyZWFkeSBoYXMgb25lIGNvcHkgZm9yIHBvd2VyIGxvc3MsDQpKdXN0IG5v dCBjb3ZlciBNTEMgcGFpcmVkIHBhZ2UgcG93ZXIgbG9zcyBpc3N1ZSwgaWYgbXkgcHJldmlvdXMg TWFzdGVyIG5vZGUgaXNzdWUgDQpwYXRjaCBiZSBhY2NlcHRlZCwgbWFzdGVyIG5vZGUgdG90YWxs eSBkb2VzIG5vdCBuZWVkIHRvIHByb3RlY3Rpb24uDQoNCkVDJlZJRDoNCkZvciBFQyBoZWFkZXIs IGFjY29yZGluZyB0byBteSB0ZXN0aW5nIHJlc3VsdCBkYXRhIGFuZCBvdXIgTkFORCBQRSBjeWNs ZSByZXF1aXJlbWVudCwNCklmIEVDIGhlYWRlciBiZSBkYW1hZ2VkIGJ5IHBvd2VyIGxvc3MgLCBt ZWFuIGVyYXNlIGNvdW50IGlzIG9rLCBubyBpbXBhY3Qgb24gTkFORCBsaWZlLg0KQnV0IGZvciBW SUQgaGVhZGVyLCBiZWNhdXNlIG15IHNvbHV0aW9uIHVzZXMgZHVhbCBwbGFuZSBwYWdlIHByb2dy YW0sIGl0IGhhcyBzcGVjaWFsIHBhZ2UgYWRkcmVzcw0KUmVxdWlyZW1lbnQgb24gZHVhbCBwbGFu ZSBwYWdlIGFkZHJlc3MsIHRoYXQgaXMgcGFnZSBudW1iZXIgc2hvdWxkIGJlIHRoZSBzYW1lLg0K VUJJIGFscmVhZHkgcHJlLXByb2dyYW0gcGFnZSAwIGFuZCBwYWdlIDEsIHNvIG5vIHBhZ2UgMSBp cyBmb3IgVklELg0KDQoNCj4gNC4gSXQgbWl4ZXMgVUJJIGFuZCBVQklGUyBjb2RlLiBIYXZpbmcg Y29kZSBsaWtlIHRoaXMgaW4gVUJJJ3MgRUJBIGNvZGUgaXMgbm90DQo+IGFjY2VwdGFibGU6DQo+ ICAgIHViaV9pb193cml0ZV9kYXRhKHViaSwgYnVmLCBwbnVtLCBvZmZzZXQsIGxlbiwgKChsbnVt IDwgMykgPyAwIDogMSkpOw0KPiAgICBUaGlzIGhhY2sgaXMgaGVyZSB0byB2b2lkIHNhZmUgd3Jp dGVzIG9mIFVCSUZTJ3Mgc3ViZXJibG9jayBhbmQgbWFzdGVyDQo+IG5vZGVzLg0KPiAgICBCdXQg VUJJRlMgc3BlY2lmaWMgY29kZSBoYXMgbm8gYnVzaW5lc3MgaW4gVUJJIGNvcmUgY29kZS4gQWxz byBTZWUgMy4NClRoZXNlIGNvZGVzIG5lZWQgdG8gbW9kaWZ5LiBUaGFua3MuDQoNCj4gNS4gSXQg ZG9lcyBub3Qgc2NhbGUuIEhhdmluZyBhIGJhY2t1cCBvZiBldmVyeSBpbXBvcnRhbnQgcGFnZSB3 b3VsZCByZXF1aXJlDQo+IG11Y2ggbW9yZSBzcGFjZS4NCj4gICAgRXNwZWNpYWxseSBVQkkgRUMg YW5kIFZJRCBoZWFkZXJzLiBJIGJldCB0aGlzIGlzIGFsc28gdGhlIHJlYXNvbiB3aHkgdGhlDQo+ IGN1cnJlbnQgaW1wbGVtZW50YXRpb24NCj4gICAgZG9lcyBub3QgcHJvdGVjdCB0aGVtLiBPdGhl cndpc2UgdGhlIGJha3ZvbCB3b3VsZCBmaWxsIHVwIGltbWVkaWF0ZWx5Lg0KPiAgICBBbm90aGVy IHNjYWxhYmlsaXR5IHByb2JsZW0gaXMgdGhhdCB0aGUgd2hvbGUgYmFrdm9sIGhhcyB0byBiZSBz Y2FubmVkDQo+IHdoaWNoIHdpbGwgc2xvdyBkb3duDQo+ICAgIHRoZSBhdHRhY2gvbW91bnQgcHJv Y2VzcyBhbmQgbWF5IHZvaWQgdGhlIHNwZWVkdXAgZ2FpbmVkIGJ5IEZhc3RtYXAuDQpUaGlzIGlz IGFsc28gbXkgY29uY2VybiwgbWF5YmUgbmV4dCB2ZXJzaW9uIEkgY2FuIGZpeCB0aGlzIGJ5IHN0 b3JlIGJha3ZvbCBQRUIgaW5mbw0KSW50byBmbGFzaC4NCg0KPiA2LiBJdCBmb2N1c2VzIG9ubHkg b24gVUJJRlMuIHViaV9jb3JydXB0ZWRfZGF0YV9yZWNvdmVyeSgpIGlzIG9ubHkgY2FsbGVkDQo+ IGZyb20gVUJJRlMgY29kZS4NCj4gICAgSWYgVUJJIGlzIGNoYW5nZWQsIHdlIG5lZWQgYSBzb2x1 dGlvbiBmb3IgYWxsIHVzZXJzIG9uIHRvcCBvZiBVQkkuDQo+ICAgIE5vdyBJIHVuZGVyc3RhbmQg YWxzbyB3aHkgeW91IHdhbnQgdGhlICJmczp1YmlmczpyZWNvdmVyeTpmaXh1cCBVQklGUw0KPiBj YW5ub3QgcmVjb3ZlciBtYXN0ZXIgbm9kZSBpc3N1ZSINCj4gICAgcGF0Y2guIEFzIFVCSUZTIG1h c3RlciBub2RlcyBhcmUgbm90IHByb3RlY3RlZCBieSBiYWt2b2wgdGhleSB3aWxsDQo+IGNvcnJ1 cHQgYW5kIFVCSUZTIGlzIG5vdCBhYmxlIHRvIHJlY292ZXINCj4gICAgbm9yIGNhbiBydW4gdWJp X2NvcnJ1cHRlZF9kYXRhX3JlY292ZXJ5KCkuDQo+IA0KPiA3LiBBIGZ1bGwgYmFrdm9sIGlzIG5v dCBwcm9wZXIgaGFuZGxlZC4gVGhlIGltcGxlbWVudGF0aW9uIGZhbGxzIGJhY2sgdG8NCj4gInVu c2FmZSIgd3JpdGVzLg0KPiAgICAgICAgICAgICAgICAgZGJnX2dlbigiQWxsb2NhdGUgbmV3IFBF QiBmb3IgQmFrdm9sLlxuIik7DQo+ICAgICAgICAgICAgICAgICBwYmsgPSBhbGxvX25ld19ibG9j a19mb3JfYmFrdm9sKHViaSwgb3BwZV9wbGFuZSk7DQo+ICAgICAgICAgICAgICAgICBpZiAoIXBi aykgew0KPiAgICAgICAgICAgICAgICAgICAgICAgICB1YmlfZXJyKHViaSwgIkFsbG9jYXRlIG5l dyBQRUIgZmFpbGVkLlxuIik7DQo+ICAgICAgICAgICAgICAgICAgICAgICAgIG5vYmFrID0gMTsN Cj4gICAgICAgICAgICAgICAgICAgICAgICAgZ290byBPbmx5X3NvdXJjZTsNCj4gICAgICAgICAg ICAgICAgIH0NCj4gICAgWW91IGNhbm5vdCBleHBlY3QgdXNlcnMgdG8gcXVlcnkgdGhlIGtlcm5l bCBsb2cgZm9yIHN1Y2ggZXJyb3IgbWVzc2FnZXMuDQo+IA0KPiANCj4gQmVzaWRlIG9mIHRoZXNl IGlzc3VlcyB0aGVyZSBhcmUgYSBsb3Qgb2Ygc21hbGwgaW1wbGVtZW50YXRpb24gaXNzdWVzLg0K PiBGb3IgZXhhbXBsZSBGYXN0bWFwIGlzIGJyb2tlbiBhcyBVQklfRk1fU0JfVk9MVU1FX0lEIGNs YXNoZXMgd2l0aA0KPiBVQklfQkFDS1VQX1ZPTFVNRV9JRC4NCj4gT3Igc3RydWN0IGxpc3RfaGVh ZCBpcyBwYXJ0IG9mIG9uLUZsYXNoIGRhdGEgc3RydWN0dXJlcy4NCj4gDQo+IFRoYXQgc2FpZCwg aXQgZG9uJ3QgdGhpbmsgdGhlIGJha3ZvbCBhcHByb2FjaCBpcyB0aGUgc29sdXRpb24gd2UncmUg bG9va2luZyBmb3IuDQo+IEEgcHJvcGVyIHNvbHV0aW9uIGhhcyB0byBmdWxmaWxsIHRoZSBmb2xs b3dpbmcgY29uZGl0aW9uczoNCj4gMS4gTm8gZGVwZW5kZW5jeSBvbiBPT0IgZGF0YS4NCj4gMi4g Q2FuIHdvcmsgd2l0aCBhbnkgTUxDIE5BTkRzIGFuZCBjb250cm9sbGVycy4gQm9yaXMgYW5kIEkg aGF2ZSBhY2Nlc3MgdG8NCj4gSHluaXgsIE1pY3JvbiBhbmQgVG9zaGliYSBOQU5EIHNvIGZhci4N Cj4gMy4gSWYgaW1wbGVtZW50ZWQgb24gVUJJIGxldmVsLCBpdCBoYXMgdG8gd29yayBmb3IgYW55 IHVzZXIgb24gdG9wIG9mIFVCSS4NCj4gNC4gSGFzIHRvIGJlIGFibGUgdG8gcHJvdGVjdCBhbGwg ZGF0YS4NCj4gNS4gTXVzdCBub3QgcmVncmVzcyBjdXJyZW50IFVCSSBvciBVQklGUy4NCj4gDQo+ IEJvcmlzIGFuZCBJIGFyZSB3b3JraW5nIG9uIHN1Y2ggYSBzb2x1dGlvbiBhbmQgd291bGQgbGlr ZSB0byBpbnZpdGUgeW91IHRvIGpvaW4NCj4gdXMuDQo+IFRoZSB0b3BpYyBpcyBjb21wbGljYXRl ZCBhbmQgbm90IGVhc3kgdG8gc29sdmUuIEJ1dCB3aXRoIGpvaW5lZCBmb3JjZXMgd2Ugd2lsbA0K PiBiZSBhYmxlIHRvIGZpbmQgYSBnb29kIHNvbHV0aW9uLiA6LSkNCkxvb2sgZm9yd2FyZCB0byB3 b3JrIHdpdGggeW91IGZvciB0aGlzLg0KDQo+IFRoYW5rcywNCj4gLy9yaWNoYXJkDQo=