From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from web33610.mail.mud.yahoo.com ([68.142.198.156]) by bombadil.infradead.org with smtp (Exim 4.68 #1 (Red Hat Linux)) id 1KFRE9-000133-Ah for linux-mtd@lists.infradead.org; Sun, 06 Jul 2008 10:12:19 +0000 Date: Sun, 6 Jul 2008 03:12:14 -0700 (PDT) From: Frans Meulenbroeks Subject: [PATCH] [MTD] NAND nand_ecc.c: rewrite for improved performance To: linux-mtd@lists.infradead.org MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="0-945466422-1215339134=:94697" Message-ID: <878386.94697.qm@web33610.mail.mud.yahoo.com> List-Id: Linux MTD discussion mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , --0-945466422-1215339134=:94697 Content-Type: text/plain; charset=us-ascii [PATCH] [MTD] NAND nand_ecc.c: rewrite for improved performance First off upfront apologies if this is not fully according to the way to submit patches. Although far from new in the unix/linux world (yes I am the Frans Meulenbroeks from Minix for the Atari ST 1.5), it is the first time I try to submit a patch (so if I do things inappropriate, please friendly educate me and don't bash me :-) ) For a project for my employer (Koninklijke Philips Electronics), I investigated performance improvements in one of our products. One of the things that came out was that the software ecc correction ate up too much CPU cycles. I've completely rewritten drivers/mtd/nand/nand_ecc.c from scratch to resolve this. The new file is about 18 times as fast when it comes to calculating the ecc on my development system, and about 7 times as fast on the MIPS core for which this work was done. Repairing a faulty ECC is done in about half the time it used to take. Details of the way the new algorithm works are in the attached file ecc.txt Not too sure if this txt file should be part of the patch or not. I'll leave it up to the maintainers of MTD to decide. I've got permission from Koninklijke Philips Electronics to contribute this code. I have included the complete nand_ecc.c file. It was derived from scratch so a patch would have been much bigger. I also have a comparison program that I used for verifying correctness while developing and for doing performance measurements. Not too sure if it is useful for anyone, but if there is interest, just let me know. Enjoy, Frans. From: Frans Meulenbroeks [fransmeulenbroeks at yahoo dot com] --0-945466422-1215339134=:94697 Content-Type: text/x-csrc; name="nand_ecc.c" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="nand_ecc.c" LyoKICogVGhpcyBmaWxlIGNvbnRhaW5zIGFuIEVDQyBhbGdvcml0aG0gdGhh dCBkZXRlY3RzIGFuZCBjb3JyZWN0cyAxIGJpdAogKiBlcnJvcnMgaW4gYSAy NTYgYnl0ZSBibG9jayBvZiBkYXRhLgogKgogKiBkcml2ZXJzL210ZC9uYW5k L25hbmRfZWNjLmMKICoKICogQ29weXJpZ2h0IChDKSAyMDA4IEtvbmlua2xp amtlIFBoaWxpcHMgRWxlY3Ryb25pY3MgTlYuCiAqICAgICAgICAgICAgICAg ICAgICBBdXRob3I6IEZyYW5zIE1ldWxlbmJyb2VrcwogKgogKiBJbmZvcm1h dGlvbiBvbiBob3cgdGhpcyBhbGdvcml0aG0gd29ya3MgYW5kIGhvdyBpdCB3 YXMgZGV2ZWxvcGVkCiAqIGNhbiBiZSBmb3VuZCB0aHJvdWdoOgogKiBodHRw Oi8vZnJhbnNtZXVsZW5icm9la3MuaG9tZWxpbnV4Lm9yZy9saW51eC9lY2Mv ZWNjLnR4dAogKgogKiBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91 IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAogKiB1bmRl ciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNl IGFzIHB1Ymxpc2hlZCBieSB0aGUKICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0 aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9yIChhdCB5b3VyIG9wdGlvbikgYW55 CiAqIGxhdGVyIHZlcnNpb24uCiAqCiAqIFRoaXMgZmlsZSBpcyBkaXN0cmli dXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQg V0lUSE9VVAogKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1w bGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKICogRklUTkVT UyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5l cmFsIFB1YmxpYyBMaWNlbnNlCiAqIGZvciBtb3JlIGRldGFpbHMuCiAqCiAq IFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBH ZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCiAqIHdpdGggdGhpcyBmaWxl OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRp b24sIEluYy4sCiAqIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0 b24sIE1BIDAyMTExLTEzMDcgVVNBLgogKgogKi8KCi8qCiAgIFRoZSBTVEFO REFMT05FIG1hY3JvIGlzIHVzZWZ1bCB3aGVuIHJ1bm5pbmcgdGhlIGNvZGUg b3V0c2lkZSB0aGUga2VybmVsCiAgIGUuZy4gd2hlbiBydW5uaW5nIHRoZSBj b2RlIGluIGEgdGVzdGJlZCBvciBhIGJlbmNobWFyayBwcm9ncmFtLgogICBX aGVuIFNUQU5EQUxPTkUgaXMgdXNlZCwgdGhlIG1vZHVsZSByZWxhdGVkIG1h Y3JvcyBhcmUgY29tbWVudGVkIG91dAogICBhcyB3ZWxsIGFzIHRoZSBsaW51 eCBpbmNsdWRlIGZpbGVzLgogICBJbnN0ZWFkIGEgcHJpdmF0ZSBkZWZpbml0 aW9uIG9mIG10ZF9pbnRvIGlzIGdpdmVuIHRvIHNhdGlzZnkgdGhlIGNvbXBp bGVyCiAgICh0aGUgY29kZSBkb2VzIG5vdCB1c2UgbXRkX2luZm8sIHNvIHRo ZSBjb2RlIGRvZXMgbm90IGNhcmUpCiovCiNpZm5kZWYgU1RBTkRBTE9ORQoj aW5jbHVkZSA8bGludXgvdHlwZXMuaD4KI2luY2x1ZGUgPGxpbnV4L2tlcm5l bC5oPgojaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiNpbmNsdWRlIDxsaW51 eC9tdGQvbmFuZF9lY2MuaD4KI2Vsc2UKc3RydWN0IG10ZF9pbmZvIHsgaW50 IGR1bW15OyB9OwojZW5kaWYKCi8qCiAgICBpbnZwYXJpdHkgaXMgYSAyNTYg Ynl0ZSB0YWJsZSB0aGF0IGNvbnRhaW5zIHRoZSBvZGQgcGFyaXR5IAogICAg Zm9yIGVhY2ggYnl0ZS4gU28gaWYgdGhlIG51bWJlciBvZiBiaXRzIGluIGEg Ynl0ZSBpcyBldmVuLAogICAgdGhlIGFycmF5IGVsZW1lbnQgaXMgMSwgYW5k IHdoZW4gdGhlIG51bWJlciBvZiBiaXRzIGlzIG9kZAogICAgdGhlIGFycmF5 IGVsZWVtbnQgaXMgCiovCnN0YXRpYyBjb25zdCBjaGFyIGludnBhcml0eVsy NTZdID0gewogICAgMSwgMCwgMCwgMSwgMCwgMSwgMSwgMCwgMCwgMSwgMSwg MCwgMSwgMCwgMCwgMSwgCiAgICAwLCAxLCAxLCAwLCAxLCAwLCAwLCAxLCAx LCAwLCAwLCAxLCAwLCAxLCAxLCAwLCAKICAgIDAsIDEsIDEsIDAsIDEsIDAs IDAsIDEsIDEsIDAsIDAsIDEsIDAsIDEsIDEsIDAsIAogICAgMSwgMCwgMCwg MSwgMCwgMSwgMSwgMCwgMCwgMSwgMSwgMCwgMSwgMCwgMCwgMSwgCiAgICAw LCAxLCAxLCAwLCAxLCAwLCAwLCAxLCAxLCAwLCAwLCAxLCAwLCAxLCAxLCAw LCAKICAgIDEsIDAsIDAsIDEsIDAsIDEsIDEsIDAsIDAsIDEsIDEsIDAsIDEs IDAsIDAsIDEsIAogICAgMSwgMCwgMCwgMSwgMCwgMSwgMSwgMCwgMCwgMSwg MSwgMCwgMSwgMCwgMCwgMSwgCiAgICAwLCAxLCAxLCAwLCAxLCAwLCAwLCAx LCAxLCAwLCAwLCAxLCAwLCAxLCAxLCAwLCAKICAgIDAsIDEsIDEsIDAsIDEs IDAsIDAsIDEsIDEsIDAsIDAsIDEsIDAsIDEsIDEsIDAsIAogICAgMSwgMCwg MCwgMSwgMCwgMSwgMSwgMCwgMCwgMSwgMSwgMCwgMSwgMCwgMCwgMSwgCiAg ICAxLCAwLCAwLCAxLCAwLCAxLCAxLCAwLCAwLCAxLCAxLCAwLCAxLCAwLCAw LCAxLCAKICAgIDAsIDEsIDEsIDAsIDEsIDAsIDAsIDEsIDEsIDAsIDAsIDEs IDAsIDEsIDEsIDAsIAogICAgMSwgMCwgMCwgMSwgMCwgMSwgMSwgMCwgMCwg MSwgMSwgMCwgMSwgMCwgMCwgMSwgCiAgICAwLCAxLCAxLCAwLCAxLCAwLCAw LCAxLCAxLCAwLCAwLCAxLCAwLCAxLCAxLCAwLCAKICAgIDAsIDEsIDEsIDAs IDEsIDAsIDAsIDEsIDEsIDAsIDAsIDEsIDAsIDEsIDEsIDAsIAogICAgMSwg MCwgMCwgMSwgMCwgMSwgMSwgMCwgMCwgMSwgMSwgMCwgMSwgMCwgMCwgMQp9 OwoKLyoKICAgIGJpdHNwZXJieXRlIGNvbnRhaW5zIHRoZSBudW1iZXIgb2Yg Yml0cyBwZXIgYnl0ZQogICAgdGhpcyBpcyBvbmx5IHVzZWQgZm9yIHRlc3Rp bmcgYW5kIHJlcGFpcmluZyBwYXJpdHkKKi8Kc3RhdGljIGNvbnN0IGNoYXIg Yml0c3BlcmJ5dGVbMjU2XSA9IHsKICAgIDAsIDEsIDEsIDIsIDEsIDIsIDIs IDMsIDEsIDIsIDIsIDMsIDIsIDMsIDMsIDQsIAogICAgMSwgMiwgMiwgMywg MiwgMywgMywgNCwgMiwgMywgMywgNCwgMywgNCwgNCwgNSwgCiAgICAxLCAy LCAyLCAzLCAyLCAzLCAzLCA0LCAyLCAzLCAzLCA0LCAzLCA0LCA0LCA1LCAK ICAgIDIsIDMsIDMsIDQsIDMsIDQsIDQsIDUsIDMsIDQsIDQsIDUsIDQsIDUs IDUsIDYsIAogICAgMSwgMiwgMiwgMywgMiwgMywgMywgNCwgMiwgMywgMywg NCwgMywgNCwgNCwgNSwgCiAgICAyLCAzLCAzLCA0LCAzLCA0LCA0LCA1LCAz LCA0LCA0LCA1LCA0LCA1LCA1LCA2LCAKICAgIDIsIDMsIDMsIDQsIDMsIDQs IDQsIDUsIDMsIDQsIDQsIDUsIDQsIDUsIDUsIDYsIAogICAgMywgNCwgNCwg NSwgNCwgNSwgNSwgNiwgNCwgNSwgNSwgNiwgNSwgNiwgNiwgNywgCiAgICAx LCAyLCAyLCAzLCAyLCAzLCAzLCA0LCAyLCAzLCAzLCA0LCAzLCA0LCA0LCA1 LCAKICAgIDIsIDMsIDMsIDQsIDMsIDQsIDQsIDUsIDMsIDQsIDQsIDUsIDQs IDUsIDUsIDYsIAogICAgMiwgMywgMywgNCwgMywgNCwgNCwgNSwgMywgNCwg NCwgNSwgNCwgNSwgNSwgNiwgCiAgICAzLCA0LCA0LCA1LCA0LCA1LCA1LCA2 LCA0LCA1LCA1LCA2LCA1LCA2LCA2LCA3LCAKICAgIDIsIDMsIDMsIDQsIDMs IDQsIDQsIDUsIDMsIDQsIDQsIDUsIDQsIDUsIDUsIDYsIAogICAgMywgNCwg NCwgNSwgNCwgNSwgNSwgNiwgNCwgNSwgNSwgNiwgNSwgNiwgNiwgNywgCiAg ICAzLCA0LCA0LCA1LCA0LCA1LCA1LCA2LCA0LCA1LCA1LCA2LCA1LCA2LCA2 LCA3LCAKICAgIDQsIDUsIDUsIDYsIDUsIDYsIDYsIDcsIDUsIDYsIDYsIDcs IDYsIDcsIDcsIDgsCn07CgovKgogICAgYWRkcmVzc2JpdHMgaXMgYSBsb29r dXAgdGFibGUgdG8gZmlsdGVyIG91dCB0aGUgYml0cyBmcm9tIHRoZSB4b3It ZWQKICAgIGVjYyBkYXRhIHRoYXQgaWRlbnRpZnkgdGhlIGZhdWx0eSBsb2Nh dGlvbi4KICAgIHRoaXMgaXMgb25seSB1c2VkIGZvciByZXBhaXJpbmcgcGFy aXR5CiAgICBzZWUgdGhlIGNvbW1lbnRzIGluIG5hbmRfY29ycmVjdF9kYXRh IGZvciBtb3JlIGRldGFpbHMKKi8Kc3RhdGljIGNvbnN0IGNoYXIgYWRkcmVz c2JpdHNbMjU2XSA9IHsKICAgIDB4MDAsIDB4MDAsIDB4MDEsIDB4MDEsIDB4 MDAsIDB4MDAsIDB4MDEsIDB4MDEsIDB4MDIsIDB4MDIsIDB4MDMsIDB4MDMs IDB4MDIsIDB4MDIsIDB4MDMsIDB4MDMsIAogICAgMHgwMCwgMHgwMCwgMHgw MSwgMHgwMSwgMHgwMCwgMHgwMCwgMHgwMSwgMHgwMSwgMHgwMiwgMHgwMiwg MHgwMywgMHgwMywgMHgwMiwgMHgwMiwgMHgwMywgMHgwMywgCiAgICAweDA0 LCAweDA0LCAweDA1LCAweDA1LCAweDA0LCAweDA0LCAweDA1LCAweDA1LCAw eDA2LCAweDA2LCAweDA3LCAweDA3LCAweDA2LCAweDA2LCAweDA3LCAweDA3 LCAKICAgIDB4MDQsIDB4MDQsIDB4MDUsIDB4MDUsIDB4MDQsIDB4MDQsIDB4 MDUsIDB4MDUsIDB4MDYsIDB4MDYsIDB4MDcsIDB4MDcsIDB4MDYsIDB4MDYs IDB4MDcsIDB4MDcsIAogICAgMHgwMCwgMHgwMCwgMHgwMSwgMHgwMSwgMHgw MCwgMHgwMCwgMHgwMSwgMHgwMSwgMHgwMiwgMHgwMiwgMHgwMywgMHgwMywg MHgwMiwgMHgwMiwgMHgwMywgMHgwMywgCiAgICAweDAwLCAweDAwLCAweDAx LCAweDAxLCAweDAwLCAweDAwLCAweDAxLCAweDAxLCAweDAyLCAweDAyLCAw eDAzLCAweDAzLCAweDAyLCAweDAyLCAweDAzLCAweDAzLCAKICAgIDB4MDQs IDB4MDQsIDB4MDUsIDB4MDUsIDB4MDQsIDB4MDQsIDB4MDUsIDB4MDUsIDB4 MDYsIDB4MDYsIDB4MDcsIDB4MDcsIDB4MDYsIDB4MDYsIDB4MDcsIDB4MDcs IAogICAgMHgwNCwgMHgwNCwgMHgwNSwgMHgwNSwgMHgwNCwgMHgwNCwgMHgw NSwgMHgwNSwgMHgwNiwgMHgwNiwgMHgwNywgMHgwNywgMHgwNiwgMHgwNiwg MHgwNywgMHgwNywgCiAgICAweDA4LCAweDA4LCAweDA5LCAweDA5LCAweDA4 LCAweDA4LCAweDA5LCAweDA5LCAweDBhLCAweDBhLCAweDBiLCAweDBiLCAw eDBhLCAweDBhLCAweDBiLCAweDBiLCAKICAgIDB4MDgsIDB4MDgsIDB4MDks IDB4MDksIDB4MDgsIDB4MDgsIDB4MDksIDB4MDksIDB4MGEsIDB4MGEsIDB4 MGIsIDB4MGIsIDB4MGEsIDB4MGEsIDB4MGIsIDB4MGIsIAogICAgMHgwYywg MHgwYywgMHgwZCwgMHgwZCwgMHgwYywgMHgwYywgMHgwZCwgMHgwZCwgMHgw ZSwgMHgwZSwgMHgwZiwgMHgwZiwgMHgwZSwgMHgwZSwgMHgwZiwgMHgwZiwg CiAgICAweDBjLCAweDBjLCAweDBkLCAweDBkLCAweDBjLCAweDBjLCAweDBk LCAweDBkLCAweDBlLCAweDBlLCAweDBmLCAweDBmLCAweDBlLCAweDBlLCAw eDBmLCAweDBmLCAKICAgIDB4MDgsIDB4MDgsIDB4MDksIDB4MDksIDB4MDgs IDB4MDgsIDB4MDksIDB4MDksIDB4MGEsIDB4MGEsIDB4MGIsIDB4MGIsIDB4 MGEsIDB4MGEsIDB4MGIsIDB4MGIsIAogICAgMHgwOCwgMHgwOCwgMHgwOSwg MHgwOSwgMHgwOCwgMHgwOCwgMHgwOSwgMHgwOSwgMHgwYSwgMHgwYSwgMHgw YiwgMHgwYiwgMHgwYSwgMHgwYSwgMHgwYiwgMHgwYiwgCiAgICAweDBjLCAw eDBjLCAweDBkLCAweDBkLCAweDBjLCAweDBjLCAweDBkLCAweDBkLCAweDBl LCAweDBlLCAweDBmLCAweDBmLCAweDBlLCAweDBlLCAweDBmLCAweDBmLCAK ICAgIDB4MGMsIDB4MGMsIDB4MGQsIDB4MGQsIDB4MGMsIDB4MGMsIDB4MGQs IDB4MGQsIDB4MGUsIDB4MGUsIDB4MGYsIDB4MGYsIDB4MGUsIDB4MGUsIDB4 MGYsIDB4MGYKfTsKCi8qKgogKiBuYW5kX2NhbGN1bGF0ZV9lY2MgLSBbTkFO RCBJbnRlcmZhY2VdIENhbGN1bGF0ZSAzLWJ5dGUgRUNDIGZvciAyNTYtYnl0 ZSBibG9jawogKiBAbXRkOglNVEQgYmxvY2sgc3RydWN0dXJlICh1bnVzZWQp CiAqIEBkYXQ6CXJhdyBkYXRhCiAqIEBlY2NfY29kZToJYnVmZmVyIGZvciBF Q0MKICovCmludCBuYW5kX2NhbGN1bGF0ZV9lY2Moc3RydWN0IG10ZF9pbmZv ICptdGQsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmJ1ZiwKCQkgICAgICAgdW5z aWduZWQgY2hhciAqY29kZSkKewogICAgaW50IGk7CiAgICBjb25zdCB1bnNp Z25lZCBsb25nICpicCA9ICh1bnNpZ25lZCBsb25nICopYnVmOwogICAgdW5z aWduZWQgbG9uZyBjdXI7ICAgICAgLyogY3VycmVudCB2YWx1ZSBpbiBidWZm ZXIgKi8KICAgIC8qIHJwMC4ucnAxNSBhcmUgdGhlIHZhcmlvdXMgYWNjdW11 bGF0ZWQgcGFyaXRpZXMgKHBlciBieXRlKSAqLwogICAgdW5zaWduZWQgbG9u ZyBycDAsIHJwMSwgcnAyLCBycDMsIHJwNCwgcnA1LCBycDYsIHJwNzsKICAg IHVuc2lnbmVkIGxvbmcgcnA4LCBycDksIHJwMTAsIHJwMTEsIHJwMTIsIHJw MTMsIHJwMTQsIHJwMTU7CiAgICB1bnNpZ25lZCBsb25nIHBhcjsgICAgICAv KiB0aGUgY3VtdWxhdGl2ZSBwYXJpdHkgZm9yIGFsbCBkYXRhICovCiAgICB1 bnNpZ25lZCBsb25nIHRtcHBhcjsgICAvKiB0aGUgY3VtdWxhdGl2ZSBwYXJp dHkgZm9yIHRoaXMgaXRlcmF0aW9uOwogICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgZm9yIHJwMTIgYW5kIHJwMTQgYXQgdGhlIGVuZCBvZiB0aGUg bG9vcCAqLwoKICAgIHBhciA9IDA7CiAgICBycDQgPSAwOyBycDYgPSAwOwog ICAgcnA4ID0gMDsgcnAxMCA9IDA7CiAgICBycDEyID0gMDsgcnAxNCA9IDA7 CgogICAgLyoKICAgICAgICBUaGUgbG9vcCBpcyB1bnJvbGxlZCBhIG51bWJl ciBvZiB0aW1lczsKICAgICAgICBUaGlzIGF2b2lkcyBpZiBzdGF0ZW1lbnRz IHRvIGRlY2lkZSBvbiB3aGljaCBycCB2YWx1ZSB0byB1cGRhdGUKICAgICAg ICBBbHNvIHdlIHByb2Nlc3MgdGhlIGRhdGEgYnkgbG9uZ3dvcmRzLgogICAg ICAgIE5vdGU6IHBhc3NpbmcgdW5hbGlnbmVkIGRhdGEgbWlnaHQgZ2l2ZSBh IHBlcmZvcm1hbmNlIHBlbmFsdHkuCiAgICAgICAgSXQgaXMgYXNzdW1lZCB0 aGF0IHRoZSBidWZmZXJzIGFyZSBhbGlnbmVkLgogICAgICAgIHRtcHBhciBp cyB0aGUgY3VtdWxhdGl2ZSBzdW0gb2YgdGhpcyBpdGVyYXRpb24uCiAgICAg ICAgbmVlZGVkIGZvciBjYWxjdWxhdGluZyBycDEyLCBycDE0IGFuZCBwYXIK ICAgICAgICBhbHNvIHVzZWQgYXMgYSBwZXJmb3JtYW5jZSBpbXByb3ZlbWVu dCBmb3IgcnA2LCBycDggYW5kIHJwMTAKICAgICovCiAgICBmb3IgKGkgPSAw OyBpIDwgNDsgaSsrKQogICAgewogICAgICAgIGN1ciA9ICpicCsrOyB0bXBw YXIgID0gY3VyOyBycDQgXj0gY3VyOwogICAgICAgIGN1ciA9ICpicCsrOyB0 bXBwYXIgXj0gY3VyOyBycDYgXj0gdG1wcGFyOwogICAgICAgIGN1ciA9ICpi cCsrOyB0bXBwYXIgXj0gY3VyOyBycDQgXj0gY3VyOwogICAgICAgIGN1ciA9 ICpicCsrOyB0bXBwYXIgXj0gY3VyOyBycDggXj0gdG1wcGFyOwoKICAgICAg ICBjdXIgPSAqYnArKzsgdG1wcGFyIF49IGN1cjsgcnA0IF49IGN1cjsgcnA2 IF49IGN1cjsKICAgICAgICBjdXIgPSAqYnArKzsgdG1wcGFyIF49IGN1cjsg cnA2IF49IGN1cjsKCSAgICBjdXIgPSAqYnArKzsgdG1wcGFyIF49IGN1cjsg cnA0IF49IGN1cjsKCSAgICBjdXIgPSAqYnArKzsgdG1wcGFyIF49IGN1cjsg cnAxMCBePSB0bXBwYXI7CgoJICAgIGN1ciA9ICpicCsrOyB0bXBwYXIgXj0g Y3VyOyBycDQgXj0gY3VyOyBycDYgXj0gY3VyOyBycDggXj0gY3VyOwogICAg ICAgIGN1ciA9ICpicCsrOyB0bXBwYXIgXj0gY3VyOyBycDYgXj0gY3VyOyBy cDggXj0gY3VyOwoJICAgIGN1ciA9ICpicCsrOyB0bXBwYXIgXj0gY3VyOyBy cDQgXj0gY3VyOyBycDggXj0gY3VyOwogICAgICAgIGN1ciA9ICpicCsrOyB0 bXBwYXIgXj0gY3VyOyBycDggXj0gY3VyOwoKICAgICAgICBjdXIgPSAqYnAr KzsgdG1wcGFyIF49IGN1cjsgcnA0IF49IGN1cjsgcnA2IF49IGN1cjsKICAg ICAgICBjdXIgPSAqYnArKzsgdG1wcGFyIF49IGN1cjsgcnA2IF49IGN1cjsK ICAgICAgICBjdXIgPSAqYnArKzsgdG1wcGFyIF49IGN1cjsgcnA0IF49IGN1 cjsKICAgICAgICBjdXIgPSAqYnArKzsgdG1wcGFyIF49IGN1cjsKCgkgICAg cGFyIF49IHRtcHBhcjsKICAgICAgICBpZiAoKGkgJiAweDEpID09IDApIHJw MTIgXj0gdG1wcGFyOwogICAgICAgIGlmICgoaSAmIDB4MikgPT0gMCkgcnAx NCBePSB0bXBwYXI7CiAgICB9CgogICAgLyoKICAgICAgIGhhbmRsZSB0aGUg ZmFjdCB0aGF0IHdlIHVzZSBsb25nd29yZCBvcGVyYXRpb25zCiAgICAgICB3 ZSdsbCBicmluZyBycDQuLnJwMTQgYmFjayB0byBzaW5nbGUgYnl0ZSBlbnRp dGllcyBieSBzaGlmdGluZyBhbmQgeG9yaW5nCiAgICAgICBmaXJzdCBmb2xk IHRoZSB1cHBlciBhbmQgbG93ZXIgMTYgYml0cywgdGhlbiB0aGUgdXBwZXIg YW5kIGxvd2VyIDgKICAgICovCiAgICBycDQgXj0gKHJwNCA+PiAxNik7IHJw NCBePSAocnA0ID4+IDgpOyBycDQgJj0gMHhmZjsKICAgIHJwNiBePSAocnA2 ID4+IDE2KTsgcnA2IF49IChycDYgPj4gOCk7IHJwNiAmPSAweGZmOwogICAg cnA4IF49IChycDggPj4gMTYpOyBycDggXj0gKHJwOCA+PiA4KTsgcnA4ICY9 IDB4ZmY7CiAgICBycDEwIF49IChycDEwID4+IDE2KTsgcnAxMCBePSAocnAx MCA+PiA4KTsgcnAxMCAmPSAweGZmOwogICAgcnAxMiBePSAocnAxMiA+PiAx Nik7IHJwMTIgXj0gKHJwMTIgPj4gOCk7IHJwMTIgJj0gMHhmZjsKICAgIHJw MTQgXj0gKHJwMTQgPj4gMTYpOyBycDE0IF49IChycDE0ID4+IDgpOyBycDE0 ICY9IDB4ZmY7CgogICAgLyoKICAgICAgICB3ZSBhbHNvIG5lZWQgdG8gY2Fs Y3VsYXRlIHRoZSByb3cgcGFyaXR5IGZvciBycDAuLnJwMwogICAgICAgIFRo aXMgaXMgcHJlc2VudCBpbiBwYXIsIGJlY2F1c2UgcGFyIGlzIG5vdwogICAg ICAgIHJwMyBycDMgcnAyIHJwMgogICAgICAgIGFzIHdlbGwgYXMKICAgICAg ICBycDEgcnAwIHJwMSBycDAKICAgICAgICBGaXJzdCBjYWxjdWxhdGUgcnAy IGFuZCBycDMKICAgICAgICAoYW5kIHllczogcnAyID0gKHBhciBeIHJwMykg JiAweGZmOyBidXQgZG9pbmcgdGhhdCBkaWQgbm90CiAgICAgICAgZ2l2ZSBh IHBlcmZvcm1hbmNlIGltcHJvdmVtZW50KQogICAgKi8KICAgIHJwMyA9IChw YXIgPj4gMTYpOyBycDMgXj0gKHJwMyA+PiA4KTsgcnAzICY9IDB4ZmY7CiAg ICBycDIgPSBwYXIgJiAweGZmZmY7IHJwMiBePSAocnAyID4+IDgpOyBycDIg Jj0gMHhmZjsKCiAgICAvKiByZWR1Y2UgcGFyIHRvIDE2IGJpdHMgdGhlbiBj YWxjdWxhdGUgcnAxIGFuZCBycDAgKi8KICAgIHBhciBePSAocGFyID4+IDE2 KTsKICAgIHJwMSA9IChwYXIgPj4gOCkgJiAweGZmOwogICAgcnAwID0gKHBh ciAmIDB4ZmYpOwoKICAgIC8qIGZpbmFsbHkgcmVkdWNlIHBhciB0byA4IGJp dHMgKi8KICAgIHBhciBePSAocGFyID4+IDgpOyBwYXIgJj0gMHhmZjsKCiAg ICAvKgogICAgICAgIGFuZCBjYWxjdWxhdGUgcnA1Li5ycDE1CiAgICAgICAg bm90ZSB0aGF0IHBhciA9IHJwNCBeIHJwNSBhbmQgZHVlIHRvIHRoZSBjb21t dXRhdGl2ZSBwcm9wZXJ0eQogICAgICAgIG9mIHRoZSBeIG9wZXJhdG9yIHdl IGNhbiBzYXk6CiAgICAgICAgcnA1ID0gKHBhciBeIHJwNCk7CiAgICAgICAg VGhlICYgMHhmZiBzZWVtcyBzdXBlcmZsdW91cywgYnV0IGJlbmNobWFya2lu ZyBsZWFybmVkIHRoYXQgCiAgICAgICAgbGVhdmluZyBpdCBvdXQgZ2l2ZXMg c2xpZ2h0bHkgd29yc2UgcmVzdWx0cy4gTm8gaWRlYSB3aHksIHByb2JhYmx5 CiAgICAgICAgaXQgaGFzIHRvIGRvIHdpdGggdGhlIHdheSB0aGUgcGlwZWxp bmUgaW4gcGVudGl1bSBpcyBvcmdhbml6ZWQuCiAgICAqLwogICAgcnA1ID0g KHBhciBeIHJwNCkgJiAweGZmOwogICAgcnA3ID0gKHBhciBeIHJwNikgJiAw eGZmOwogICAgcnA5ID0gKHBhciBeIHJwOCkgJiAweGZmOwogICAgcnAxMSA9 IChwYXIgXiBycDEwKSAmIDB4ZmY7CiAgICBycDEzID0gKHBhciBeIHJwMTIp ICYgMHhmZjsKICAgIHJwMTUgPSAocGFyIF4gcnAxNCkgJiAweGZmOwoKICAg IC8qCiAgICAgICAgRmluYWxseSBjYWxjdWxhdGUgdGhlIGVjYyBiaXRzLgog ICAgICAgIEFnYWluIGhlcmUgaXQgbWlnaHQgc2VlbSB0aGF0IHRoZXJlIGFy ZSBwZXJmb3JtYW5jZSBvcHRpbWlzYXRpb25zCiAgICAgICAgcG9zc2libGUs IGJ1dCBiZW5jaG1hcmtzIHNob3dlZCB0aGF0IG9uIHRoZSBzeXN0ZW0gdGhp cyBpcyBkZXZlbG9wZWQKICAgICAgICB0aGUgY29kZSBiZWxvdyBpcyB0aGUg ZmFzdGVzdAogICAgKi8KI2lmZGVmIENPTkZJR19NVERfTkFORF9FQ0NfU01D CiAgICBjb2RlWzBdID0KICAgICAgICAoaW52cGFyaXR5W3JwN10gPDwgNykg fAogICAgICAgIChpbnZwYXJpdHlbcnA2XSA8PCA2KSB8CiAgICAgICAgKGlu dnBhcml0eVtycDVdIDw8IDUpIHwKICAgICAgICAoaW52cGFyaXR5W3JwNF0g PDwgNCkgfAogICAgICAgIChpbnZwYXJpdHlbcnAzXSA8PCAzKSB8CiAgICAg ICAgKGludnBhcml0eVtycDJdIDw8IDIpIHwKICAgICAgICAoaW52cGFyaXR5 W3JwMV0gPDwgMSkgfAogICAgICAgIChpbnZwYXJpdHlbcnAwXSk7CiAgICBj b2RlWzFdID0KICAgICAgICAoaW52cGFyaXR5W3JwMTVdIDw8IDcpIHwKICAg ICAgICAoaW52cGFyaXR5W3JwMTRdIDw8IDYpIHwKICAgICAgICAoaW52cGFy aXR5W3JwMTNdIDw8IDUpIHwKICAgICAgICAoaW52cGFyaXR5W3JwMTJdIDw8 IDQpIHwKICAgICAgICAoaW52cGFyaXR5W3JwMTFdIDw8IDMpIHwKICAgICAg ICAoaW52cGFyaXR5W3JwMTBdIDw8IDIpIHwKICAgICAgICAoaW52cGFyaXR5 W3JwOV0gIDw8IDEpIHwKICAgICAgICAoaW52cGFyaXR5W3JwOF0pOwojZWxz ZQogICAgY29kZVsxXSA9CiAgICAgICAgKGludnBhcml0eVtycDddIDw8IDcp IHwKICAgICAgICAoaW52cGFyaXR5W3JwNl0gPDwgNikgfAogICAgICAgIChp bnZwYXJpdHlbcnA1XSA8PCA1KSB8CiAgICAgICAgKGludnBhcml0eVtycDRd IDw8IDQpIHwKICAgICAgICAoaW52cGFyaXR5W3JwM10gPDwgMykgfAogICAg ICAgIChpbnZwYXJpdHlbcnAyXSA8PCAyKSB8CiAgICAgICAgKGludnBhcml0 eVtycDFdIDw8IDEpIHwKICAgICAgICAoaW52cGFyaXR5W3JwMF0pOwogICAg Y29kZVswXSA9CiAgICAgICAgKGludnBhcml0eVtycDE1XSA8PCA3KSB8CiAg ICAgICAgKGludnBhcml0eVtycDE0XSA8PCA2KSB8CiAgICAgICAgKGludnBh cml0eVtycDEzXSA8PCA1KSB8CiAgICAgICAgKGludnBhcml0eVtycDEyXSA8 PCA0KSB8CiAgICAgICAgKGludnBhcml0eVtycDExXSA8PCAzKSB8CiAgICAg ICAgKGludnBhcml0eVtycDEwXSA8PCAyKSB8CiAgICAgICAgKGludnBhcml0 eVtycDldICA8PCAxKSB8CiAgICAgICAgKGludnBhcml0eVtycDhdKTsKI2Vu ZGlmCiAgICBjb2RlWzJdID0KICAgICAgICAoaW52cGFyaXR5W3BhciAmIDB4 ZjBdIDw8IDcpIHwKICAgICAgICAoaW52cGFyaXR5W3BhciAmIDB4MGZdIDw8 IDYpIHwKICAgICAgICAoaW52cGFyaXR5W3BhciAmIDB4Y2NdIDw8IDUpIHwK ICAgICAgICAoaW52cGFyaXR5W3BhciAmIDB4MzNdIDw8IDQpIHwKICAgICAg ICAoaW52cGFyaXR5W3BhciAmIDB4YWFdIDw8IDMpIHwKICAgICAgICAoaW52 cGFyaXR5W3BhciAmIDB4NTVdIDw8IDIpIHwgMzsKfQoKI2lmbmRlZiBTVEFO REFMT05FCkVYUE9SVF9TWU1CT0wobmFuZF9jYWxjdWxhdGVfZWNjKTsKI2Vu ZGlmCgovKioKICogbmFuZF9jb3JyZWN0X2RhdGEgLSBbTkFORCBJbnRlcmZh Y2VdIERldGVjdCBhbmQgY29ycmVjdCBiaXQgZXJyb3IocykKICogQG10ZDoJ TVREIGJsb2NrIHN0cnVjdHVyZSAodW51c2VkKQogKiBAZGF0OglyYXcgZGF0 YSByZWFkIGZyb20gdGhlIGNoaXAKICogQHJlYWRfZWNjOglFQ0MgZnJvbSB0 aGUgY2hpcAogKiBAY2FsY19lY2M6CXRoZSBFQ0MgY2FsY3VsYXRlZCBmcm9t IHJhdyBkYXRhCiAqCiAqIERldGVjdCBhbmQgY29ycmVjdCBhIDEgYml0IGVy cm9yIGZvciAyNTYgYnl0ZSBibG9jawogKi8KaW50IG5hbmRfY29ycmVjdF9k YXRhKHN0cnVjdCBtdGRfaW5mbyAqbXRkLCB1bnNpZ25lZCBjaGFyICpidWYs CgkJICAgICAgdW5zaWduZWQgY2hhciAqcmVhZF9lY2MsIHVuc2lnbmVkIGNo YXIgKmNhbGNfZWNjKQp7CiAgICBpbnQgbnJfYml0czsKICAgIHVuc2lnbmVk IGNoYXIgYjAsIGIxLCBiMjsKICAgIHVuc2lnbmVkIGNoYXIgYnl0ZV9hZGRy LCBiaXRfYWRkcjsKCiAgICAvKiB3ZSBtaWdodCBuZWVkIHRoZSB4b3IncyBt b3JlIHRoYW4gb25jZSwgc28ga2VlcCB0aGVtIGluIGEgbG9jYWwgdmFyICov CiAgICAvKiBiMCB0byBiMiBpbmRpY2F0ZSB3aGljaCBiaXQgaXMgZmF1bHR5 IChpZiBhbnkpICovCiNpZmRlZiBDT05GSUdfTVREX05BTkRfRUNDX1NNQwog ICAgYjAgPSByZWFkX2VjY1swXSBeIGNhbGNfZWNjWzBdOwogICAgYjEgPSBy ZWFkX2VjY1sxXSBeIGNhbGNfZWNjWzFdOwojZWxzZQogICAgYjAgPSByZWFk X2VjY1sxXSBeIGNhbGNfZWNjWzFdOwogICAgYjEgPSByZWFkX2VjY1swXSBe IGNhbGNfZWNjWzBdOwojZW5kaWYKICAgIGIyID0gcmVhZF9lY2NbMl0gXiBj YWxjX2VjY1syXTsKCiAgICAvKiBjaGVjayBpZiB0aGVyZSBhcmUgYW55IGJp dGZhdWx0cyAqLwogICAgCiAgICAvKiBjb3VudCBuciBvZiBiaXRzOyB1c2Ug dGFibGUgbG9va3VwLCBmYXN0ZXIgdGhhbiBjYWxjdWxhdGluZyBpdCAqLwog ICAgbnJfYml0cyA9IGJpdHNwZXJieXRlW2IwXSArIGJpdHNwZXJieXRlW2Ix XSArIGJpdHNwZXJieXRlW2IyXTsKCiAgICAvKiByZXBlYXRlZCBpZiBzdGF0 ZW1lbnRzIGFyZSBzbGlnaHRseSBtb3JlIGVmZmljaWVudCB0aGFuIHN3aXRj aCAuLi4gKi8KICAgIC8qIG9yZGVyZWQgaW4gb3JkZXIgb2YgbGlrZWxpaG9v ZCAqLwogICAgaWYgKG5yX2JpdHMgPT0gMCkgcmV0dXJuKDApOyAvKiBubyBl cnJvciAqLwogICAgaWYgKG5yX2JpdHMgPT0gMTEpIC8qIGNvcnJlY3RhYmxl IGVycm9yICovCiAgICB7CiAgICAgICAgLyoKICAgICAgICAgICBycDE1LzEz LzExLzkvNy81LzMvMSBpbmRpY2F0ZSB3aGljaCBieXRlIGlzIHRoZSBmYXVs dHkgYnl0ZQogICAgICAgICAgIGNwIDUvMy8xIGluZGljYXRlIHRoZSBmYXVs dHkgYml0LgogICAgICAgICAgIEEgbG9va3VwIHRhYmxlIGlzIHVzZWQgdG8g ZmlsdGVyIHRoZSBiaXRzIGZyb20gdGhlIGJ5dGUgdGhleQogICAgICAgICAg IGFyZSBpbi4gVGhpcyBpcyBhZGRyZXNzYml0cy4gCiAgICAgICAgICAgQSBt YXJnaW5hbCBvcHRpbWlzYXRpb24gaXMgcG9zc2libGUgYnkgaGF2aW5nIHRo cmVlIGRpZmZlcmVudCAKICAgICAgICAgICBsb29rdXAgdGFibGVzLiBPbmUg YXMgd2UgaGF2ZSBub3cgKGZvciBiMCksIG9uZSBmb3IgYjIgCiAgICAgICAg ICAgKHRoYXQgd291bGQgYXZvaWQgdGhlID4+IDEpLCBhbmQgb25lIGZvciBi MSAod2l0aCBhbGwgdmFsdWVzCiAgICAgICAgICAgPDwgNCkuIEhvd2V2ZXIg aXQgd2FzIGZlbHQgdGhhdCBpbnRyb2R1Y2luZyB0d28gbW9yZSB0YWJsZXMK ICAgICAgICAgICBoYXJkbHkganVzdGlmeSB0aGUgZ2Fpbi4KICAgICAgICAg ICAKICAgICAgICAgICBUaGUgYjIgc2hpZnQgaXMgdGhlcmUgdG8gZ2V0IHJp ZCBvZiB0aGUgbG93ZXN0IHR3byBiaXRzLgogICAgICAgICAgIFdlIGNvdWxk IGFsc28gZG8gYWRkcmVzc2JpdHNbYjJdID4+IDEKICAgICAgICAqLwogICAg ICAgIGJ5dGVfYWRkciA9IChhZGRyZXNzYml0c1tiMV0gPDwgNCkgKyBhZGRy ZXNzYml0c1tiMF07CiAgICAgICAgYml0X2FkZHIgPSBhZGRyZXNzYml0c1ti MiA+PiAyXTsKICAgICAgICAvKiBmbGlwIHRoZSBiaXQgKi8KICAgICAgICBi dWZbYnl0ZV9hZGRyXSBePSAoMSA8PCBiaXRfYWRkcik7CiAgICAgICAgcmV0 dXJuKDEpOwogICAgfQogICAgaWYgKG5yX2JpdHMgPT0gMSkgcmV0dXJuKDEp OyAvKiBlcnJvciBpbiBlY2MgZGF0YTsgbm8gYWN0aW9uIG5lZWRlZCAqLwog ICAgcmV0dXJuIC0xOwp9CgojaWZuZGVmIFNUQU5EQUxPTkUKRVhQT1JUX1NZ TUJPTChuYW5kX2NvcnJlY3RfZGF0YSk7CgpNT0RVTEVfTElDRU5TRSgiR1BM Iik7Ck1PRFVMRV9BVVRIT1IoIkZyYW5zIE1ldWxlbmJyb2VrcyIpOwpNT0RV TEVfREVTQ1JJUFRJT04oIkdlbmVyaWMgTkFORCBFQ0Mgc3VwcG9ydCIpOwoj ZW5kaWYK --0-945466422-1215339134=:94697 Content-Type: text/plain; name="ecc.txt" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="ecc.txt" SW50cm9kdWN0aW9uCj09PT09PT09PT09PQoKSGF2aW5nIGxvb2tlZCBhdCB0 aGUgbGludXggbXRkL25hbmQgZHJpdmVyIGFuZCBtb3JlIHNwZWNpZmljIGF0 IG5hbmRfZWNjLmMgCkkgZmVsdCB0aGVyZSB3YXMgcm9vbSBmb3Igb3B0aW1p c2F0aW9uLiBJIGJhc2hlZCB0aGUgY29kZSBmb3IgYSBmZXcgaG91cnMKcGVy Zm9ybWluZyB0cmlja3MgbGlrZSB0YWJsZSBsb29rdXAgcmVtb3Zpbmcgc3Vw ZXJmbHVvdXMgY29kZSBldGMuIApBZnRlciB0aGF0IHRoZSBzcGVlZCB3YXMg aW5jcmVhc2VkIGJ5IDM1LTQwJS4gClN0aWxsIEkgd2FzIG5vdCB0b28gaGFw cHkgYXMgSSBmZWx0IHRoZXJlIHdhcyBhZGRpdGlvbmFsIHJvb20gZm9yIGlt cHJvdmVtZW50LgoKQmFkISBJIHdhcyBob29rZWQuCkkgZGVjaWRlZCB0byBh bm5vdGF0ZSBteSBzdGVwcyBpbiB0aGlzIGZpbGUuIFBlcmhhcHMgaXQgaXMg dXNlZnVsIHRvIHNvbWVvbmUKb3Igc29tZW9uZSBsZWFybnMgc29tZXRoaW5n IGZyb20gaXQuCgoKVGhlIHByb2JsZW0KPT09PT09PT09PT0KCk5BTkQgZmxh c2ggKGF0IGxlYXN0IFNMQyBvbmUpIHR5cGljYWxseSBoYXMgc2VjdG9ycyBv ZiAyNTYgYnl0ZXMuCkhvd2V2ZXIgTkFORCBmbGFzaCBpcyBub3QgZXh0cmVt ZWx5IHJlbGlhYmxlIHNvIHNvbWUgZXJyb3IgZGV0ZWN0aW9uCihhbmQgc29t ZXRpbWVzIGNvcnJlY3Rpb24pIGlzIG5lZWRlZC4KClRoaXMgaXMgZG9uZSBi eSBtZWFucyBvZiBhIEhhbW1pbmcgY29kZS4gSSdsbCB0cnkgdG8gZXhwbGFp biBpdCBpbgpsYXltYW5zIHRlcm1zIChhbmQgYXBvbG9naWVzIHRvIGFsbCB0 aGUgcHJvJ3MgaW4gdGhlIGZpZWxkIGluIGNhc2UgSSBkbwpub3QgdXNlIHRo ZSByaWdodCB0ZXJtaW5vbG9neSwgbXkgY29kaW5nIHRoZW9yeSBjbGFzcyB3 YXMgYWxtb3N0IDMwCnllYXJzIGFnbywgYW5kIEkgbXVzdCBhZG1pdCBpdCB3 YXMgbm90IG9uZSBvZiBteSBmYXZvdXJpdGVzKS4KCkFzIEkgc2FpZCBiZWZv cmUgdGhlIGVjYyBjYWxjdWxhdGlvbiBpcyBwZXJmb3JtZWQgb24gc2VjdG9y cyBvZiAyNTYKYnl0ZXMuIFRoaXMgaXMgZG9uZSBieSBjYWxjdWxhdGluZyBz ZXZlcmFsIHBhcml0eSBiaXRzIG92ZXIgdGhlIHJvd3MgYW5kCmNvbHVtbnMu IFRoZSBwYXJpdHkgdXNlZCBpcyBldmVuIHBhcml0eSB3aGljaCBtZWFucyB0 aGF0IHRoZSBwYXJpdHkgYml0ID0gMQppZiB0aGUgZGF0YSBvdmVyIHdoaWNo IHRoZSBwYXJpdHkgaXMgY2FsY3VsYXRlZCBpcyAxIGFuZCB0aGUgcGFyaXR5 IGJpdCA9IDAKaWYgdGhlIGRhdGEgb3ZlciB3aGljaCB0aGUgcGFyaXR5IGlz IGNhbGN1bGF0ZWQgaXMgMC4gU28gdGhlIHRvdGFsCm51bWJlciBvZiBiaXRz IG92ZXIgdGhlIGRhdGEgb3ZlciB3aGljaCB0aGUgcGFyaXR5IGlzIGNhbGN1 bGF0ZWQgKyB0aGUKcGFyaXR5IGJpdCBpcyBldmVuLiAoc2VlIHdpa2lwZWRp YSBpZiB5b3UgY2FuJ3QgZm9sbG93IHRoaXMpLgpQYXJpdHkgaXMgb2Z0ZW4g Y2FsY3VsYXRlZCBieSBtZWFucyBvZiBhbiBleGNsdXNpdmUgb3Igb3BlcmF0 aW9uLApzb21ldGltZXMgYWxzbyByZWZlcnJlZCB0byBhcyB4b3IuIEluIEMg dGhlIG9wZXJhdG9yIGZvciB4b3IgaXMgXgoKQmFjayB0byBlY2MuCkxldCdz IGdpdmUgYSBzbWFsbCBmaWd1cmU6CgpieXRlICAgMDogIGJpdDcgYml0NiBi aXQ1IGJpdDQgYml0MyBiaXQyIGJpdDEgYml0MCAgIHJwMCBycDIgcnA0IC4u LiBycDE0CmJ5dGUgICAxOiAgYml0NyBiaXQ2IGJpdDUgYml0NCBiaXQzIGJp dDIgYml0MSBiaXQwICAgcnAxIHJwMiBycDQgLi4uIHJwMTQKYnl0ZSAgIDI6 ICBiaXQ3IGJpdDYgYml0NSBiaXQ0IGJpdDMgYml0MiBiaXQxIGJpdDAgICBy cDAgcnAzIHJwNCAuLi4gcnAxNApieXRlICAgMzogIGJpdDcgYml0NiBiaXQ1 IGJpdDQgYml0MyBiaXQyIGJpdDEgYml0MCAgIHJwMSBycDMgcnA0IC4uLiBy cDE0CmJ5dGUgICA0OiAgYml0NyBiaXQ2IGJpdDUgYml0NCBiaXQzIGJpdDIg Yml0MSBiaXQwICAgcnAwIHJwMiBycDUgLi4uIHJwMTQKLi4uLgpieXRlIDI1 NDogIGJpdDcgYml0NiBiaXQ1IGJpdDQgYml0MyBiaXQyIGJpdDEgYml0MCAg IHJwMCBycDMgcnA1IC4uLiBycDE1CmJ5dGUgMjU1OiAgYml0NyBiaXQ2IGJp dDUgYml0NCBiaXQzIGJpdDIgYml0MSBiaXQwICAgcnAxIHJwMyBycDUgLi4u IHJwMTUKICAgICAgICAgICBjcDEgIGNwMCAgY3AxICBjcDAgIGNwMSAgY3Aw ICBjcDEgIGNwMAogICAgICAgICAgIGNwMyAgY3AzICBjcDIgIGNwMiAgY3Az ICBjcDMgIGNwMiAgY3AyCiAgICAgICAgICAgY3A1ICBjcDUgIGNwNSAgY3A1 ICBjcDQgIGNwNCAgY3A0ICBjcDQKClRoaXMgZmlndXJlIHJlcHJlc2VudHMg YSBzZWN0b3Igb2YgMjU2IGJ5dGVzLgpjcCBpcyBteSBhYmJyZXZpYXRvbiBm b3IgY29sdW1uIHBhcml0eSwgcnAgZm9yIHJvdyBwYXJpdHkuCgpMZXQncyBz dGFydCB0byBleHBsYWluIGNvbHVtbiBwYXJpdHkuCmNwMCBpcyB0aGUgcGFy aXR5IHRoYXQgYmVsb25ncyB0byBhbGwgYml0MCwgYml0MiwgYml0NCwgYml0 Ni4Kc28gdGhlIHN1bSBvZiBhbGwgYml0MCwgYml0MiwgYml0NCBhbmQgYml0 NiB2YWx1ZXMgKyBjcDAgaXRzZWxmIGlzIGV2ZW4uClNpbWlsYXJseSBjcDEg aXMgdGhlIHN1bSBvZiBhbGwgYml0MSwgYml0MywgYml0NSBhbmQgYml0Ny4K Y3AyIGlzIHRoZSBwYXJpdHkgb3ZlciBiaXQwLCBiaXQxLCBiaXQ0IGFuZCBi aXQ1CmNwMyBpcyB0aGUgcGFyaXR5IG92ZXIgYml0MiwgYml0MywgYml0NiBh bmQgYml0Ny4KY3A0IGlzIHRoZSBwYXJpdHkgb3ZlciBiaXQwLCBiaXQxLCBi aXQyIGFuZCBiaXQzLgpjcDUgaXMgdGhlIHBhcml0eSBvdmVyIGJpdDQsIGJp dDUsIGJpdDYgYW5kIGJpdDcuCk5vdGUgdGhhdCBlYWNoIG9mIGNwMCAuLiBj cDUgaXMgZXhhY3RseSBvbmUgYml0LgoKUm93IHBhcml0eSBhY3R1YWxseSB3 b3JrcyBhbG1vc3QgdGhlIHNhbWUuCnJwMCBpcyB0aGUgcGFyaXR5IG9mIGFs bCBldmVuIGJ5dGVzICgwLCAyLCA0LCA2LCAuLi4gMjUyLCAyNTQpCnJwMSBp cyB0aGUgcGFyaXR5IG9mIGFsbCBvZGQgYnl0ZXMgKDEsIDMsIDUsIDcsIC4u LiwgMjUzLCAyNTUpCnJwMiBpcyB0aGUgcGFyaXR5IG9mIGFsbCBieXRlcyAw LCAxLCA0LCA1LCA4LCA5LCAuLi4gCihzbyBoYW5kbGUgdHdvIGJ5dGVzLCB0 aGVuIHNraXAgMiBieXRlcykuCnJwMyBpcyBjb3ZlcnMgdGhlIGhhbGYgcnAy IGRvZXMgbm90IGNvdmVyIChieXRlcyAyLCAzLCA2LCA3LCAxMCwgMTEsIC4u LikKZm9yIHJwNCB0aGUgcnVsZSBpcyBjb3ZlciA0IGJ5dGVzLCBza2lwIDQg Ynl0ZXMsIGNvdmVyIDQgYnl0ZXMsIHNraXAgNCBldGMuCnNvIHJwNCBjYWxj dWxhdGVzIHBhcml0eSBvdmVyIGJ5dGVzIDAsIDEsIDIsIDMsIDgsIDksIDEw LCAxMSwgMTYsIC4uLikKYW5kIHJwNSBjb3ZlcnMgdGhlIG90aGVyIGhhbGYs IHNvIGJ5dGVzIDQsIDUsIDYsIDcsIDEyLCAxMywgMTQsIDE1LCAyMCwgLi4K VGhlIHN0b3J5IG5vdyBiZWNvbWVzIHF1aXRlIGJvcmluZy4gSSBndWVzcyB5 b3UgZ2V0IHRoZSBpZGVhLgpycDYgY292ZXJzIDggYnl0ZXMgdGhlbiBza2lw cyA4IGV0YwpycDcgc2tpcHMgOCBieXRlcyB0aGVuIGNvdmVycyA4IGV0Ywpy cDggY292ZXJzIDE2IGJ5dGVzIHRoZW4gc2tpcHMgMTYgZXRjCnJwOSBza2lw cyAxNiBieXRlcyB0aGVuIGNvdmVycyAxNiBldGMKcnAxMCBjb3ZlcnMgMzIg Ynl0ZXMgdGhlbiBza2lwcyAzMiBldGMKcnAxMSBza2lwcyAzMiBieXRlcyB0 aGVuIGNvdmVycyAzMiBldGMKcnAxMiBjb3ZlcnMgNjQgYnl0ZXMgdGhlbiBz a2lwcyA2NCBldGMKcnAxMyBza2lwcyA2NCBieXRlcyB0aGVuIGNvdmVycyA2 NCBldGMKcnAxNCBjb3ZlcnMgMTI4IGJ5dGVzIHRoZW4gc2tpcHMgMTI4CnJw MTUgc2tpcHMgMTI4IGJ5dGVzIHRoZW4gY292ZXJzIDEyOCAKCkluIHRoZSBl bmQgdGhlIHBhcml0eSBiaXRzIGFyZSBncm91cGVkIHRvZ2V0aGVyIGluIHRo cmVlIGJ5dGVzIGFzCmZvbGxvd3M6CkVDQyAgICBCaXQgNyBCaXQgNiBCaXQg NSBCaXQgNCBCaXQgMyBCaXQgMiBCaXQgMSBCaXQgMApFQ0MgMCAgIHJwMDcg IHJwMDYgIHJwMDUgIHJwMDQgIHJwMDMgIHJwMDIgIHJwMDEgIHJwMDAKRUND IDEgICBycDE1ICBycDE0ICBycDEzICBycDEyICBycDExICBycDEwICBycDA5 ICBycDA4CkVDQyAyICAgY3A1ICAgY3A0ICAgY3AzICAgY3AyICAgY3AxICAg Y3AwICAgICAgMSAgICAgMQoKSSBkZXRlY3RlZCBhZnRlciB3cml0aW5nIHRo aXMgdGhhdCBTVCBhcHBsaWNhdGlvbiBub3RlIEFOMTgyMwooaHR0cDovL3d3 dy5zdC5jb20vc3RvbmxpbmUvYm9va3MvcGRmL2RvY3MvMTAxMjMucGRmKSBn aXZlcyBhIG11Y2gKbmljZXIgcGljdHVyZS4oYnV0IHRoZXkgdXNlIGxpbmUg cGFyaXR5IGFzIHRlcm0gd2hlcmUgSSB1c2Ugcm93IHBhcml0eSkKT2ggd2Vs bCwgSSdtIGdyYXBoaWNhbGx5IGNoYWxsZW5nZWQsIHNvIHN1ZmZlciB3aXRo IG1lIGZvciBhIG1vbWVudCA6LSkKQW5kIEkgY291bGQgbm90IHJldXNlIHRo ZSBTVCBwaWN0dXJlIGFueXdheSBmb3IgY29weXJpZ2h0IHJlYXNvbnMuCgoK QXR0ZW1wdCAwCj09PT09PT09PQoKSW1wbGVtZW50aW5nIHRoZSBwYXJpdHkg Y2FsY3VsYXRpb24gaXMgcHJldHR5IHNpbXBsZS4KSW4gQyBwc2V1ZG9jb2Rl Ogpmb3IgKGkgPSAwOyBpIDwgMjU2OyBpKyspCnsKICAgIGlmIChpICYgMHgw MSkKICAgICAgIHJwMSA9IGJpdDcgXiBiaXQ2IF4gYml0NSBeIGJpdDQgXiBi aXQzIF4gYml0MiBeIGJpdDEgXiBiaXQwIF4gcnAxOwogICAgZWxzZQogICAg ICAgcnAwID0gYml0NyBeIGJpdDYgXiBiaXQ1IF4gYml0NCBeIGJpdDMgXiBi aXQyIF4gYml0MSBeIGJpdDAgXiBycDE7CiAgICBpZiAoaSAmIDB4MDIpCiAg ICAgICBycDMgPSBiaXQ3IF4gYml0NiBeIGJpdDUgXiBiaXQ0IF4gYml0MyBe IGJpdDIgXiBiaXQxIF4gYml0MCBeIHJwMzsKICAgIGVsc2UKICAgICAgIHJw MiA9IGJpdDcgXiBiaXQ2IF4gYml0NSBeIGJpdDQgXiBiaXQzIF4gYml0MiBe IGJpdDEgXiBiaXQwIF4gcnAyOwogICAgaWYgKGkgJiAweDA0KQogICAgICBy cDUgPSBiaXQ3IF4gYml0NiBeIGJpdDUgXiBiaXQ0IF4gYml0MyBeIGJpdDIg XiBiaXQxIF4gYml0MCBeIHJwNTsKICAgIGVsc2UKICAgICAgcnA0ID0gYml0 NyBeIGJpdDYgXiBiaXQ1IF4gYml0NCBeIGJpdDMgXiBiaXQyIF4gYml0MSBe IGJpdDAgXiBycDQ7CiAgICBpZiAoaSAmIDB4MDgpCiAgICAgIHJwNyA9IGJp dDcgXiBiaXQ2IF4gYml0NSBeIGJpdDQgXiBiaXQzIF4gYml0MiBeIGJpdDEg XiBiaXQwIF4gcnA3OwogICAgZWxzZQogICAgICBycDYgPSBiaXQ3IF4gYml0 NiBeIGJpdDUgXiBiaXQ0IF4gYml0MyBeIGJpdDIgXiBiaXQxIF4gYml0MCBe IHJwNjsKICAgIGlmIChpICYgMHgxMCkKICAgICAgcnA5ID0gYml0NyBeIGJp dDYgXiBiaXQ1IF4gYml0NCBeIGJpdDMgXiBiaXQyIF4gYml0MSBeIGJpdDAg XiBycDk7CiAgICBlbHNlCiAgICAgIHJwOCA9IGJpdDcgXiBiaXQ2IF4gYml0 NSBeIGJpdDQgXiBiaXQzIF4gYml0MiBeIGJpdDEgXiBiaXQwIF4gcnA4Owog ICAgaWYgKGkgJiAweDIwKQogICAgICBycDExID0gYml0NyBeIGJpdDYgXiBi aXQ1IF4gYml0NCBeIGJpdDMgXiBiaXQyIF4gYml0MSBeIGJpdDAgXiBycDEx OwogICAgZWxzZQogICAgcnAxMCA9IGJpdDcgXiBiaXQ2IF4gYml0NSBeIGJp dDQgXiBiaXQzIF4gYml0MiBeIGJpdDEgXiBiaXQwIF4gcnAxMDsKICAgIGlm IChpICYgMHg0MCkKICAgICAgcnAxMyA9IGJpdDcgXiBiaXQ2IF4gYml0NSBe IGJpdDQgXiBiaXQzIF4gYml0MiBeIGJpdDEgXiBiaXQwIF4gcnAxMzsKICAg IGVsc2UKICAgICAgcnAxMiA9IGJpdDcgXiBiaXQ2IF4gYml0NSBeIGJpdDQg XiBiaXQzIF4gYml0MiBeIGJpdDEgXiBiaXQwIF4gcnAxMjsKICAgIGlmIChp ICYgMHg4MCkKICAgICAgcnAxNSA9IGJpdDcgXiBiaXQ2IF4gYml0NSBeIGJp dDQgXiBiaXQzIF4gYml0MiBeIGJpdDEgXiBiaXQwIF4gcnAxNTsKICAgIGVs c2UKICAgICAgcnAxNCA9IGJpdDcgXiBiaXQ2IF4gYml0NSBeIGJpdDQgXiBi aXQzIF4gYml0MiBeIGJpdDEgXiBiaXQwIF4gcnAxNDsKICAgIGNwMCA9IGJp dDYgXiBiaXQ0IF4gYml0MiBeIGJpdDAgXiBjcDA7CiAgICBjcDEgPSBiaXQ3 IF4gYml0NSBeIGJpdDMgXiBiaXQxIF4gY3AxOwogICAgY3AyID0gYml0NSBe IGJpdDQgXiBiaXQxIF4gYml0MCBeIGNwMjsKICAgIGNwMyA9IGJpdDcgXiBi aXQ2IF4gYml0MyBeIGJpdDIgXiBjcDMKICAgIGNwNCA9IGJpdDMgXiBiaXQy IF4gYml0MSBeIGJpdDAgXiBjcDQKICAgIGNwNSA9IGJpdDcgXiBiaXQ2IF4g Yml0NSBeIGJpdDQgXiBjcDUKfQoKCkFuYWx5c2lzIDAKPT09PT09PT09PQoK QyBkb2VzIGhhdmUgYml0d2lzZSBvcGVyYXRvcnMgYnV0IG5vdCByZWFsbHkg b3BlcmF0b3JzIHRvIGRvIHRoZSBhYm92ZQplZmZpY2llbnRseSAoYW5kIG1v c3QgaGFyZHdhcmUgaGFzIG5vIHN1Y2ggaW5zdHJ1Y3Rpb25zIGVpdGhlciku ClRoZXJlZm9yZSB3aXRob3V0IGltcGxlbWVudGluZyB0aGlzIGl0IHdhcyBj bGVhciB0aGF0IHRoZSBjb2RlIGFib3ZlIHdhcwpub3QgZ29pbmcgdG8gYnJp bmcgbWUgYSBOb2JlbCBwcml6ZSA6LSkKCkZvcnR1bmF0ZWx5IHRoZSBleGNs dXNpdmUgb3Igb3BlcmF0aW9uIGlzIGNvbW11dGF0aXZlLCBzbyB3ZSBjYW4g Y29tYmluZQp0aGUgdmFsdWVzIGluIGFueSBvcmRlci4gU28gaW5zdGVhZCBv ZiBjYWxjdWxhdGluZyBhbGwgdGhlIGJpdHMKaW5kaXZpZHVhbGx5LCBsZXQg dXMgdHJ5IHRvIHJlYXJyYW5nZSB0aGluZ3MuCkZvciB0aGUgY29sdW1uIHBh cml0eSB0aGlzIGlzIGVhc3kuIFdlIGNhbiBqdXN0IHhvciB0aGUgYnl0ZXMg YW5kIGluIHRoZQplbmQgZmlsdGVyIG91dCB0aGUgcmVsZXZhbnQgYml0cy4g VGhpcyBpcyBwcmV0dHkgbmljZSBhcyBpdCB3aWxsIGJyaW5nCmFsbCBjcCBj YWxjdWxhdGlvbiBvdXQgb2YgdGhlIGlmIGxvb3AuCgpTaW1pbGFybHkgd2Ug Y2FuIGZpcnN0IHhvciB0aGUgYnl0ZXMgZm9yIHRoZSB2YXJpb3VzIHJvd3Mu ClRoaXMgbGVhZHMgdG86CgoKQXR0ZW1wdCAxCj09PT09PT09PQoKY29uc3Qg Y2hhciBwYXJpdHlbMjU2XSA9IHsKICAgIDAsIDEsIDEsIDAsIDEsIDAsIDAs IDEsIDEsIDAsIDAsIDEsIDAsIDEsIDEsIDAsIAogICAgMSwgMCwgMCwgMSwg MCwgMSwgMSwgMCwgMCwgMSwgMSwgMCwgMSwgMCwgMCwgMSwgCiAgICAxLCAw LCAwLCAxLCAwLCAxLCAxLCAwLCAwLCAxLCAxLCAwLCAxLCAwLCAwLCAxLCAK ICAgIDAsIDEsIDEsIDAsIDEsIDAsIDAsIDEsIDEsIDAsIDAsIDEsIDAsIDEs IDEsIDAsIAogICAgMSwgMCwgMCwgMSwgMCwgMSwgMSwgMCwgMCwgMSwgMSwg MCwgMSwgMCwgMCwgMSwgCiAgICAwLCAxLCAxLCAwLCAxLCAwLCAwLCAxLCAx LCAwLCAwLCAxLCAwLCAxLCAxLCAwLCAKICAgIDAsIDEsIDEsIDAsIDEsIDAs IDAsIDEsIDEsIDAsIDAsIDEsIDAsIDEsIDEsIDAsIAogICAgMSwgMCwgMCwg MSwgMCwgMSwgMSwgMCwgMCwgMSwgMSwgMCwgMSwgMCwgMCwgMSwgCiAgICAx LCAwLCAwLCAxLCAwLCAxLCAxLCAwLCAwLCAxLCAxLCAwLCAxLCAwLCAwLCAx LCAKICAgIDAsIDEsIDEsIDAsIDEsIDAsIDAsIDEsIDEsIDAsIDAsIDEsIDAs IDEsIDEsIDAsIAogICAgMCwgMSwgMSwgMCwgMSwgMCwgMCwgMSwgMSwgMCwg MCwgMSwgMCwgMSwgMSwgMCwgCiAgICAxLCAwLCAwLCAxLCAwLCAxLCAxLCAw LCAwLCAxLCAxLCAwLCAxLCAwLCAwLCAxLCAKICAgIDAsIDEsIDEsIDAsIDEs IDAsIDAsIDEsIDEsIDAsIDAsIDEsIDAsIDEsIDEsIDAsIAogICAgMSwgMCwg MCwgMSwgMCwgMSwgMSwgMCwgMCwgMSwgMSwgMCwgMSwgMCwgMCwgMSwgCiAg ICAxLCAwLCAwLCAxLCAwLCAxLCAxLCAwLCAwLCAxLCAxLCAwLCAxLCAwLCAw LCAxLCAKICAgIDAsIDEsIDEsIDAsIDEsIDAsIDAsIDEsIDEsIDAsIDAsIDEs IDAsIDEsIDEsIDAKfTsKCnZvaWQgZWNjMShjb25zdCB1bnNpZ25lZCBjaGFy ICpidWYsIHVuc2lnbmVkIGNoYXIgKmNvZGUpCnsKICAgIGludCBpOwogICAg Y29uc3QgdW5zaWduZWQgY2hhciAqYnAgPSBidWY7CiAgICB1bnNpZ25lZCBj aGFyIGN1cjsKICAgIHVuc2lnbmVkIGNoYXIgcnAwLCBycDEsIHJwMiwgcnAz LCBycDQsIHJwNSwgcnA2LCBycDc7CiAgICB1bnNpZ25lZCBjaGFyIHJwOCwg cnA5LCBycDEwLCBycDExLCBycDEyLCBycDEzLCBycDE0LCBycDE1OwogICAg dW5zaWduZWQgY2hhciBwYXI7CgogICAgcGFyID0gMDsKICAgIHJwMCA9IDA7 IHJwMSA9IDA7IHJwMiA9IDA7IHJwMyA9IDA7CiAgICBycDQgPSAwOyBycDUg PSAwOyBycDYgPSAwOyBycDcgPSAwOwogICAgcnA4ID0gMDsgcnA5ID0gMDsg cnAxMCA9IDA7IHJwMTEgPSAwOwogICAgcnAxMiA9IDA7IHJwMTMgPSAwOyBy cDE0ID0gMDsgcnAxNSA9IDA7CgogICAgZm9yIChpID0gMDsgaSA8IDI1Njsg aSsrKQogICAgewogICAgICAgIGN1ciA9ICpicCsrOwogICAgICAgIHBhciBe PSBjdXI7CiAgICAgICAgaWYgKGkgJiAweDAxKSBycDEgXj0gY3VyOyBlbHNl IHJwMCBePSBjdXI7CiAgICAgICAgaWYgKGkgJiAweDAyKSBycDMgXj0gY3Vy OyBlbHNlIHJwMiBePSBjdXI7CiAgICAgICAgaWYgKGkgJiAweDA0KSBycDUg Xj0gY3VyOyBlbHNlIHJwNCBePSBjdXI7CiAgICAgICAgaWYgKGkgJiAweDA4 KSBycDcgXj0gY3VyOyBlbHNlIHJwNiBePSBjdXI7CiAgICAgICAgaWYgKGkg JiAweDEwKSBycDkgXj0gY3VyOyBlbHNlIHJwOCBePSBjdXI7CiAgICAgICAg aWYgKGkgJiAweDIwKSBycDExIF49IGN1cjsgZWxzZSBycDEwIF49IGN1cjsK ICAgICAgICBpZiAoaSAmIDB4NDApIHJwMTMgXj0gY3VyOyBlbHNlIHJwMTIg Xj0gY3VyOwogICAgICAgIGlmIChpICYgMHg4MCkgcnAxNSBePSBjdXI7IGVs c2UgcnAxNCBePSBjdXI7CiAgICB9CiAgICBjb2RlWzBdID0KICAgICAgICAo cGFyaXR5W3JwN10gPDwgNykgfAogICAgICAgIChwYXJpdHlbcnA2XSA8PCA2 KSB8CiAgICAgICAgKHBhcml0eVtycDVdIDw8IDUpIHwKICAgICAgICAocGFy aXR5W3JwNF0gPDwgNCkgfAogICAgICAgIChwYXJpdHlbcnAzXSA8PCAzKSB8 CiAgICAgICAgKHBhcml0eVtycDJdIDw8IDIpIHwKICAgICAgICAocGFyaXR5 W3JwMV0gPDwgMSkgfAogICAgICAgIChwYXJpdHlbcnAwXSk7CiAgICBjb2Rl WzFdID0KICAgICAgICAocGFyaXR5W3JwMTVdIDw8IDcpIHwKICAgICAgICAo cGFyaXR5W3JwMTRdIDw8IDYpIHwKICAgICAgICAocGFyaXR5W3JwMTNdIDw8 IDUpIHwKICAgICAgICAocGFyaXR5W3JwMTJdIDw8IDQpIHwKICAgICAgICAo cGFyaXR5W3JwMTFdIDw8IDMpIHwKICAgICAgICAocGFyaXR5W3JwMTBdIDw8 IDIpIHwKICAgICAgICAocGFyaXR5W3JwOV0gIDw8IDEpIHwKICAgICAgICAo cGFyaXR5W3JwOF0pOwogICAgY29kZVsyXSA9CiAgICAgICAgKHBhcml0eVtw YXIgJiAweGYwXSA8PCA3KSB8CiAgICAgICAgKHBhcml0eVtwYXIgJiAweDBm XSA8PCA2KSB8CiAgICAgICAgKHBhcml0eVtwYXIgJiAweGNjXSA8PCA1KSB8 CiAgICAgICAgKHBhcml0eVtwYXIgJiAweDMzXSA8PCA0KSB8CiAgICAgICAg KHBhcml0eVtwYXIgJiAweGFhXSA8PCAzKSB8CiAgICAgICAgKHBhcml0eVtw YXIgJiAweDU1XSA8PCAyKTsKICAgIGNvZGVbMF0gPSB+Y29kZVswXTsKICAg IGNvZGVbMV0gPSB+Y29kZVsxXTsKICAgIGNvZGVbMl0gPSB+Y29kZVsyXTsK fQoKU3RpbGwgcHJldHR5IHN0cmFpZ2h0Zm9yd2FyZC4gTm90IHRvbyBzdXJl IHdoeSB0aGUgbGFzdCBpbnZlcnQgaXMKbmVlZGVkLCBidXQgaXQgaGFwcGVu ZWQgYWxzbyBpbiB0aGUgb3JpZ2luYWwgY29kZS4KSSBhbHNvIGludHJvZHVj ZWQgdGhlIHBhcml0eSBsb29rdXAuIEkgZXhwZWN0ZWQgdGhpcyB0byBiZSB0 aGUgZmFzdGVzdAp3YXkgdG8gY2FsY3VsYXRlIHRoZSBwYXJpdHksIGJ1dCBJ IHdpbGwgaW52ZXN0aWdhdGUgYWx0ZXJuYXRpdmVzIGxhdGVyCm9uLgoKCkFu YWx5c2lzIDEKPT09PT09PT09PQoKVGhlIGNvZGUgd29ya3MsIGJ1dCBpcyBu b3QgdGVycmlibHkgZWZmaWNpZW50LiBPbiBteSBzeXN0ZW0gaXQgdG9vawph bG1vc3QgNCB0aW1lcyBhcyBtdWNoIHRpbWUgYXMgdGhlIGxpbnV4IGRyaXZl ciBjb2RlLiBCdXQgaGV5LCBpZiBpdCB3YXMKKnRoYXQqIGVhc3kgdGhpcyB3 b3VsZCBoYXZlIGJlZW4gZG9uZSBsb25nIGJlZm9yZS4KTm8gcGFpbi4gbm8g Z2Fpbi4KCkZvcnR1bmF0ZWx5IHRoZXJlIGlzIHBsZW50eSBvZiByb29tIGZv ciBpbXByb3ZlbWVudC4KCkluIHN0ZXAgMSB3ZSBtb3ZlZCBmcm9tIGJpdC13 aXNlIGNhbGN1bGF0aW9uIHRvIGJ5dGUtd2lzZSBjYWxjdWxhdGlvbi4KSG93 ZXZlciBpbiBDIHdlIGNhbiBhbHNvIHVzZSB0aGUgdW5zaWduZWQgbG9uZyBk YXRhIHR5cGUgYW5kIHZpcnR1YWxseQpldmVyeSBtb2Rlcm4gbWljcm9wcm9j ZXNzb3Igc3VwcG9ydHMgMzIgYml0IG9wZXJhdGlvbnMsIHNvIHdoeSBub3Qg dHJ5CnRvIHdyaXRlIG91ciBjb2RlIGluIHN1Y2ggYSB3YXkgdGhhdCB3ZSBw cm9jZXNzIGRhdGEgaW4gMzIgYml0IGNodW5rcy4KCk9mIGNvdXJzZSB0aGlz IG1lYW5zIHNvbWUgbW9kaWZpY2F0aW9uIGFzIHRoZSByb3cgcGFyaXR5IGlz IGJ5dGUgYnkKYnl0ZS4gQSBxdWljayBhbmFseXNpczoKZm9yIHRoZSBjb2x1 bW4gcGFyaXR5IHdlIHVzZSB0aGUgcGFyIHZhcmlhYmxlLiBXaGVuIGV4dGVu ZGluZyB0byAzMiBiaXRzIAp3ZSBjYW4gaW4gdGhlIGVuZCBlYXNpbHkgY2Fs Y3VsYXRlIHAwIGFuZCBwMSBmcm9tIGl0LgooYmVjYXVzZSBwYXIgbm93IGNv bnNpc3RzIG9mIDQgYnl0ZXMsIGNvbnRyaWJ1dGluZyB0byBycDEsIHJwMCwg cnAxLCBycDAKcmVzcGVjdGl2ZWx5KQphbHNvIHJwMiBhbmQgcnAzIGNhbiBi ZSBlYXNpbHkgcmV0cmlldmVkIGZyb20gcGFyIGFzIHJwMyBjb3ZlcnMgdGhl CmZpcnN0IHR3byBieXRlcyBhbmQgcnAyIHRoZSBsYXN0IHR3byBieXRlcy4K Ck5vdGUgdGhhdCBvZiBjb3Vyc2Ugbm93IHRoZSBsb29wIGlzIGV4ZWN1dGVk IG9ubHkgNjQgdGltZXMgKDI1Ni80KS4gCkFuZCBub3RlIHRoYXQgY2FyZSBt dXN0IHRha2VuIHdydCBieXRlIG9yZGVyaW5nLiBUaGUgd2F5IGJ5dGVzIGFy ZQpvcmRlcmVkIGluIGEgbG9uZyBpcyBtYWNoaW5lIGRlcGVuZGVudCwgYW5k IG1pZ2h0IGFmZmVjdCB1cy4gCkFueXdheSwgaWYgdGhlcmUgaXMgYW4gaXNz dWU6IHRoaXMgY29kZSBpcyBkZXZlbG9wZWQgb24geDg2ICh0byBiZQpwcmVj aXNlOiBhIERFTEwgUEMgd2l0aCBhIEQ5MjAgSW50ZWwgQ1BVKQoKQW5kIG9m IGNvdXJzZSB0aGUgcGVyZm9ybWFuY2UgbWlnaHQgZGVwZW5kIG9uIGFsaWdu bWVudCwgYnV0IEkgZXhwZWN0CnRoYXQgdGhlIEkvTyBidWZmZXJzIGluIHRo ZSBuYW5kIGRyaXZlciBhcmUgYWxpZ25lZCBwcm9wZXJseSAoYW5kCm90aGVy d2lzZSB0aGF0IHNob3VsZCBiZSBmaXhlZCB0byBnZXQgbWF4aW11bSBwZXJm b3JtYW5jZSkuCgpMZXQncyBnaXZlIGl0IGEgdHJ5Li4uCgoKQXR0ZW1wdCAy Cj09PT09PT09PQoKZXh0ZXJuIGNvbnN0IGNoYXIgcGFyaXR5WzI1Nl07Cgp2 b2lkIGVjYzIoY29uc3QgdW5zaWduZWQgY2hhciAqYnVmLCB1bnNpZ25lZCBj aGFyICpjb2RlKQp7CiAgICBpbnQgaTsKICAgIGNvbnN0IHVuc2lnbmVkIGxv bmcgKmJwID0gKHVuc2lnbmVkIGxvbmcgKilidWY7CiAgICB1bnNpZ25lZCBs b25nIGN1cjsKICAgIHVuc2lnbmVkIGxvbmcgcnAwLCBycDEsIHJwMiwgcnAz LCBycDQsIHJwNSwgcnA2LCBycDc7CiAgICB1bnNpZ25lZCBsb25nIHJwOCwg cnA5LCBycDEwLCBycDExLCBycDEyLCBycDEzLCBycDE0LCBycDE1OwogICAg dW5zaWduZWQgbG9uZyBwYXI7CgogICAgcGFyID0gMDsKICAgIHJwMCA9IDA7 IHJwMSA9IDA7IHJwMiA9IDA7IHJwMyA9IDA7CiAgICBycDQgPSAwOyBycDUg PSAwOyBycDYgPSAwOyBycDcgPSAwOwogICAgcnA4ID0gMDsgcnA5ID0gMDsg cnAxMCA9IDA7IHJwMTEgPSAwOwogICAgcnAxMiA9IDA7IHJwMTMgPSAwOyBy cDE0ID0gMDsgcnAxNSA9IDA7CgogICAgZm9yIChpID0gMDsgaSA8IDY0OyBp KyspCiAgICB7CiAgICAgICAgY3VyID0gKmJwKys7CiAgICAgICAgcGFyIF49 IGN1cjsKICAgICAgICBpZiAoaSAmIDB4MDEpIHJwNSBePSBjdXI7IGVsc2Ug cnA0IF49IGN1cjsKICAgICAgICBpZiAoaSAmIDB4MDIpIHJwNyBePSBjdXI7 IGVsc2UgcnA2IF49IGN1cjsKICAgICAgICBpZiAoaSAmIDB4MDQpIHJwOSBe PSBjdXI7IGVsc2UgcnA4IF49IGN1cjsKICAgICAgICBpZiAoaSAmIDB4MDgp IHJwMTEgXj0gY3VyOyBlbHNlIHJwMTAgXj0gY3VyOwogICAgICAgIGlmIChp ICYgMHgxMCkgcnAxMyBePSBjdXI7IGVsc2UgcnAxMiBePSBjdXI7CiAgICAg ICAgaWYgKGkgJiAweDIwKSBycDE1IF49IGN1cjsgZWxzZSBycDE0IF49IGN1 cjsKICAgIH0KICAgIC8qCiAgICAgICB3ZSBuZWVkIHRvIGFkYXB0IHRoZSBj b2RlIGdlbmVyYXRpb24gZm9yIHRoZSBmYWN0IHRoYXQgcnAgdmFycyBhcmUg bm93CiAgICAgICBsb25nOyBhbHNvIHRoZSBjb2x1bW4gcGFyaXR5IGNhbGN1 bGF0aW9uIG5lZWRzIHRvIGJlIGNoYW5nZWQuCiAgICAgICB3ZSdsbCBicmlu ZyBycDQgdG8gMTUgYmFjayB0byBzaW5nbGUgYnl0ZSBlbnRpdGllcyBieSBz aGlmdGluZyBhbmQKICAgICAgIHhvcmluZwogICAgKi8KICAgIHJwNCBePSAo cnA0ID4+IDE2KTsgcnA0IF49IChycDQgPj4gOCk7IHJwNCAmPSAweGZmOwog ICAgcnA1IF49IChycDUgPj4gMTYpOyBycDUgXj0gKHJwNSA+PiA4KTsgcnA1 ICY9IDB4ZmY7CiAgICBycDYgXj0gKHJwNiA+PiAxNik7IHJwNiBePSAocnA2 ID4+IDgpOyBycDYgJj0gMHhmZjsKICAgIHJwNyBePSAocnA3ID4+IDE2KTsg cnA3IF49IChycDcgPj4gOCk7IHJwNyAmPSAweGZmOwogICAgcnA4IF49IChy cDggPj4gMTYpOyBycDggXj0gKHJwOCA+PiA4KTsgcnA4ICY9IDB4ZmY7CiAg ICBycDkgXj0gKHJwOSA+PiAxNik7IHJwOSBePSAocnA5ID4+IDgpOyBycDkg Jj0gMHhmZjsKICAgIHJwMTAgXj0gKHJwMTAgPj4gMTYpOyBycDEwIF49IChy cDEwID4+IDgpOyBycDEwICY9IDB4ZmY7CiAgICBycDExIF49IChycDExID4+ IDE2KTsgcnAxMSBePSAocnAxMSA+PiA4KTsgcnAxMSAmPSAweGZmOwogICAg cnAxMiBePSAocnAxMiA+PiAxNik7IHJwMTIgXj0gKHJwMTIgPj4gOCk7IHJw MTIgJj0gMHhmZjsKICAgIHJwMTMgXj0gKHJwMTMgPj4gMTYpOyBycDEzIF49 IChycDEzID4+IDgpOyBycDEzICY9IDB4ZmY7CiAgICBycDE0IF49IChycDE0 ID4+IDE2KTsgcnAxNCBePSAocnAxNCA+PiA4KTsgcnAxNCAmPSAweGZmOwog ICAgcnAxNSBePSAocnAxNSA+PiAxNik7IHJwMTUgXj0gKHJwMTUgPj4gOCk7 IHJwMTUgJj0gMHhmZjsKICAgIHJwMyA9IChwYXIgPj4gMTYpOyBycDMgXj0g KHJwMyA+PiA4KTsgcnAzICY9IDB4ZmY7CiAgICBycDIgPSBwYXIgJiAweGZm ZmY7IHJwMiBePSAocnAyID4+IDgpOyBycDIgJj0gMHhmZjsKICAgIHBhciBe PSAocGFyID4+IDE2KTsKICAgIHJwMSA9IChwYXIgPj4gOCk7IHJwMSAmPSAw eGZmOwogICAgcnAwID0gKHBhciAmIDB4ZmYpOwogICAgcGFyIF49IChwYXIg Pj4gOCk7IHBhciAmPSAweGZmOwoKICAgIGNvZGVbMF0gPQogICAgICAgIChw YXJpdHlbcnA3XSA8PCA3KSB8CiAgICAgICAgKHBhcml0eVtycDZdIDw8IDYp IHwKICAgICAgICAocGFyaXR5W3JwNV0gPDwgNSkgfAogICAgICAgIChwYXJp dHlbcnA0XSA8PCA0KSB8CiAgICAgICAgKHBhcml0eVtycDNdIDw8IDMpIHwK ICAgICAgICAocGFyaXR5W3JwMl0gPDwgMikgfAogICAgICAgIChwYXJpdHlb cnAxXSA8PCAxKSB8CiAgICAgICAgKHBhcml0eVtycDBdKTsKICAgIGNvZGVb MV0gPQogICAgICAgIChwYXJpdHlbcnAxNV0gPDwgNykgfAogICAgICAgIChw YXJpdHlbcnAxNF0gPDwgNikgfAogICAgICAgIChwYXJpdHlbcnAxM10gPDwg NSkgfAogICAgICAgIChwYXJpdHlbcnAxMl0gPDwgNCkgfAogICAgICAgIChw YXJpdHlbcnAxMV0gPDwgMykgfAogICAgICAgIChwYXJpdHlbcnAxMF0gPDwg MikgfAogICAgICAgIChwYXJpdHlbcnA5XSAgPDwgMSkgfAogICAgICAgIChw YXJpdHlbcnA4XSk7CiAgICBjb2RlWzJdID0KICAgICAgICAocGFyaXR5W3Bh ciAmIDB4ZjBdIDw8IDcpIHwKICAgICAgICAocGFyaXR5W3BhciAmIDB4MGZd IDw8IDYpIHwKICAgICAgICAocGFyaXR5W3BhciAmIDB4Y2NdIDw8IDUpIHwK ICAgICAgICAocGFyaXR5W3BhciAmIDB4MzNdIDw8IDQpIHwKICAgICAgICAo cGFyaXR5W3BhciAmIDB4YWFdIDw8IDMpIHwKICAgICAgICAocGFyaXR5W3Bh ciAmIDB4NTVdIDw8IDIpOwogICAgY29kZVswXSA9IH5jb2RlWzBdOwogICAg Y29kZVsxXSA9IH5jb2RlWzFdOwogICAgY29kZVsyXSA9IH5jb2RlWzJdOwp9 CgpUaGUgcGFyaXR5IGFycmF5IGlzIG5vdCBzaG93biBhbnkgbW9yZS4gTm90 ZSBhbHNvIHRoYXQgZm9yIHRoZXNlCmV4YW1wbGVzIEkga2luZGEgZGV2aWF0 ZWQgZnJvbSBteSByZWd1bGFyIHByb2dyYW1taW5nIHN0eWxlIGJ5IGFsbG93 aW5nCm11bHRpcGxlIHN0YXRlbWVudHMgb24gYSBsaW5lLCBub3QgdXNpbmcg eyB9IGluIHRoZW4gYW5kIGVsc2UgYmxvY2tzCndpdGggb25seSBhIHNpbmds ZSBzdGF0ZW1lbnQgYW5kIGJ5IHVzaW5nIG9wZXJhdG9ycyBsaWtlIF49CgoK QW5hbHlzaXMgMgo9PT09PT09PT09CgpUaGUgY29kZSAob2YgY291cnNlKSB3 b3JrcywgYW5kIGh1cnJheTogd2UgYXJlIGEgbGl0dGxlIGJpdCBmYXN0ZXIg dGhhbgp0aGUgbGludXggZHJpdmVyIGNvZGUgKGFib3V0IDE1JSkuIEJ1dCB3 YWl0LCBkb24ndCBjaGVlciB0b28gcXVpY2tseS4KVEhlcmUgaXMgbW9yZSB0 byBiZSBnYWluZWQuCklmIHdlIGxvb2sgYXQgZS5nLiBycDE0IGFuZCBycDE1 IHdlIHNlZSB0aGF0IHdlIGVpdGhlciB4b3Igb3VyIGRhdGEgd2l0aApycDE0 IG9yIHdpdGggcnAxNS4gSG93ZXZlciB3ZSBhbHNvIGhhdmUgcGFyIHdoaWNo IGdvZXMgb3ZlciBhbGwgZGF0YS4KVGhpcyBtZWFucyB0aGVyZSBpcyBubyBu ZWVkIHRvIGNhbGN1bGF0ZSBycDE0IGFzIGl0IGNhbiBiZSBjYWxjdWxhdGVk IGZyb20KcnAxNSB0aHJvdWdoIHJwMTQgPSBwYXIgXiBycDE1Owoob3IgaWYg ZGVzaXJlZCB3ZSBjYW4gYXZvaWQgY2FsY3VsYXRpbmcgcnAxNSBhbmQgY2Fs Y3VsYXRlIGl0IGZyb20KcnAxNCkuICBUaGF0IGlzIHdoeSBzb21lIHBsYWNl cyByZWZlciB0byBpbnZlcnNlIHBhcml0eS4KT2YgY291cnNlIHRoZSBzYW1l IHRoaW5nIGhvbGRzIGZvciBycDQvNSwgcnA2LzcsIHJwOC85LCBycDEwLzEx IGFuZCBycDEyLzEzLgpFZmZlY3RpdmVseSB0aGlzIG1lYW5zIHdlIGNhbiBl bGltaW5hdGUgdGhlIGVsc2UgY2xhdXNlIGZyb20gdGhlIGlmCnN0YXRlbWVu dHMuIEFsc28gd2UgY2FuIG9wdGltaXNlIHRoZSBjYWxjdWxhdGlvbiBpbiB0 aGUgZW5kIGEgbGl0dGxlIGJpdApieSBnb2luZyBmcm9tIGxvbmcgdG8gYnl0 ZSBmaXJzdC4gQWN0dWFsbHkgd2UgY2FuIGV2ZW4gYXZvaWQgdGhlIHRhYmxl Cmxvb2t1cHMKCkF0dGVtcHQgMwo9PT09PT09PT0KCk9kZCByZXBsYWNlZDoK ICAgICAgICBpZiAoaSAmIDB4MDEpIHJwNSBePSBjdXI7IGVsc2UgcnA0IF49 IGN1cjsKICAgICAgICBpZiAoaSAmIDB4MDIpIHJwNyBePSBjdXI7IGVsc2Ug cnA2IF49IGN1cjsKICAgICAgICBpZiAoaSAmIDB4MDQpIHJwOSBePSBjdXI7 IGVsc2UgcnA4IF49IGN1cjsKICAgICAgICBpZiAoaSAmIDB4MDgpIHJwMTEg Xj0gY3VyOyBlbHNlIHJwMTAgXj0gY3VyOwogICAgICAgIGlmIChpICYgMHgx MCkgcnAxMyBePSBjdXI7IGVsc2UgcnAxMiBePSBjdXI7CiAgICAgICAgaWYg KGkgJiAweDIwKSBycDE1IF49IGN1cjsgZWxzZSBycDE0IF49IGN1cjsKd2l0 aAogICAgICAgIGlmIChpICYgMHgwMSkgcnA1IF49IGN1cjsKICAgICAgICBp ZiAoaSAmIDB4MDIpIHJwNyBePSBjdXI7CiAgICAgICAgaWYgKGkgJiAweDA0 KSBycDkgXj0gY3VyOyAKICAgICAgICBpZiAoaSAmIDB4MDgpIHJwMTEgXj0g Y3VyOwogICAgICAgIGlmIChpICYgMHgxMCkgcnAxMyBePSBjdXI7CiAgICAg ICAgaWYgKGkgJiAweDIwKSBycDE1IF49IGN1cjsKCiAgICAgICAgYW5kIG91 dHNpZGUgdGhlIGxvb3AgYWRkZWQ6CiAgICBycDQgID0gcGFyIF4gcnA1Owog ICAgcnA2ICA9IHBhciBeIHJwNzsKICAgIHJwOCAgPSBwYXIgXiBycDk7CiAg ICBycDEwICA9IHBhciBeIHJwMTE7CiAgICBycDEyICA9IHBhciBeIHJwMTM7 CiAgICBycDE0ICA9IHBhciBeIHJwMTU7CgpBbmQgYWZ0ZXIgdGhhdCB0aGUg Y29kZSB0YWtlcyBhYm91dCAzMCUgbW9yZSB0aW1lLCBhbHRob3VnaCB0aGUg bnVtYmVyIG9mCnN0YXRlbWVudHMgaXMgcmVkdWNlZC4gVGhpcyBpcyBhbHNv IHJlZmxlY3RlZCBpbiB0aGUgYXNzZW1ibHkgY29kZS4KCgpBbmFseXNpcyAz Cj09PT09PT09PT0KClZlcnkgd2VpcmQuIEd1ZXNzIGl0IGhhcyB0byBkbyB3 aXRoIGNhY2hpbmcgb3IgaW5zdHJ1Y3Rpb24gcGFyYWxsZWxsaXNtCm9yIHNv LiBJIGFsc28gdHJpZWQgb24gYW4gZWVlUEMgKENlbGVyb24sIGNsb2NrZWQg YXQgOTAwIE1oeikuIEludGVyZXN0aW5nCm9ic2VydmF0aW9uIHdhcyB0aGF0 IHRoaXMgb25lIGlzIG9ubHkgMzAlIHNsb3dlciAoYWNjb3JkaW5nIHRvIHRp bWUpCmV4ZWN1dGluZyB0aGUgY29kZSBhcyBteSAzR2h6IEQ5MjAgcHJvY2Vz c29yLgoKV2VsbCwgaXQgd2FzIGV4cGVjdGVkIG5vdCB0byBiZSBlYXN5IHNv IG1heWJlIGluc3RlYWQgbW92ZSB0byBhCmRpZmZlcmVudCB0cmFjazogbGV0 J3MgbW92ZSBiYWNrIHRvIHRoZSBjb2RlIGZyb20gYXR0ZW1wdDIgYW5kIGRv IHNvbWUKbG9vcCB1bnJvbGxpbmcuIFRoaXMgd2lsbCBlbGltaW5hdGUgYSBm ZXcgaWYgc3RhdGVtZW50cy4gSSdsbCB0cnkKZGlmZmVyZW50IGFtb3VudHMg b2YgdW5yb2xsaW5nIHRvIHNlZSB3aGF0IHdvcmtzIGJlc3QuCgoKQXR0ZW1w dCA0Cj09PT09PT09PQoKVW5yb2xsZWQgdGhlIGxvb3AgMSwgMiwgMyBhbmQg NCB0aW1lcy4KRm9yIDQgdGhlIGNvZGUgc3RhcnRzIHdpdGg6CgogICAgZm9y IChpID0gMDsgaSA8IDQ7IGkrKykKICAgIHsKICAgICAgICBjdXIgPSAqYnAr KzsKICAgICAgICBwYXIgXj0gY3VyOwogICAgICAgIHJwNCBePSBjdXI7CiAg ICAgICAgcnA2IF49IGN1cjsKICAgICAgICBycDggXj0gY3VyOwogICAgICAg IHJwMTAgXj0gY3VyOwogICAgICAgIGlmIChpICYgMHgxKSBycDEzIF49IGN1 cjsgZWxzZSBycDEyIF49IGN1cjsKICAgICAgICBpZiAoaSAmIDB4MikgcnAx NSBePSBjdXI7IGVsc2UgcnAxNCBePSBjdXI7CiAgICAgICAgY3VyID0gKmJw Kys7CiAgICAgICAgcGFyIF49IGN1cjsKICAgICAgICBycDUgXj0gY3VyOwog ICAgICAgIHJwNiBePSBjdXI7CiAgICAgICAgLi4uCgoKQW5hbHlzaXMgNAo9 PT09PT09PT09CgpVbnJvbGxpbmcgb25jZSBnYWlucyBhYm91dCAxNSUKVW5y b2xsaW5nIHR3aWNlIGtlZXBzIHRoZSBnYWluIGF0IGFib3V0IDE1JQpVbnJv bGxpbmcgdGhyZWUgdGltZXMgZ2l2ZXMgYSBnYWluIG9mIDMwJSBjb21wYXJl ZCB0byBhdHRlbXB0IDIuClVucm9sbGluZyBmb3VyIHRpbWVzIGdpdmVzIGEg bWFyZ2luYWwgaW1wcm92ZW1lbnQgY29tcGFyZWQgdG8gdW5yb2xsaW5nCnRo cmVlIHRpbWVzLgoKSSBkZWNpZGVkIHRvIHByb2NlZWQgd2l0aCBhIGZvdXIg dGltZSB1bnJvbGxlZCBsb29wIGFueXdheS4gSXQgd2FzIG15IGd1dApmZWVs aW5nIHRoYXQgaW4gdGhlIG5leHQgc3RlcHMgSSB3b3VsZCBvYnRhaW4gYWRk aXRpb25hbCBnYWluIGZyb20gaXQuCgpUaGUgbmV4dCBzdGVwIHdhcyB0cmln Z2VyZWQgYnkgdGhlIGZhY3QgdGhhdCBwYXIgY29udGFpbnMgdGhlIHhvciBv ZiBhbGwKYnl0ZXMgYW5kIHJwNCBhbmQgcnA1IGVhY2ggY29udGFpbiB0aGUg eG9yIG9mIGhhbGYgb2YgdGhlIGJ5dGVzLgpTbyBpbiBlZmZlY3QgcGFyID0g cnA0IF4gcnA1LiBCdXQgYXMgeG9yIGlzIGNvbW11dGF0aXZlIHdlIGNhbiBh bHNvIHNheQp0aGF0IHJwNSA9IHBhciBeIHJwNC4gU28gbm8gbmVlZCB0byBr ZWVwIGJvdGggcnA0IGFuZCBycDUgYXJvdW5kLiBXZSBjYW4KZWxpbWluYXRl IHJwNSAob3IgcnA0LCBidXQgSSBhbHJlYWR5IGZvcmVzYXcgYW5vdGhlciBv cHRpbWlzYXRpb24pLgpUaGUgc2FtZSBob2xkcyBmb3IgcnA2LzcsIHJwOC85 LCBycDEwLzExIHJwMTIvMTMgYW5kIHJwMTQvMTUuCgoKQXR0ZW1wdCA1Cj09 PT09PT09PQoKRWZmZWN0aXZlbHkgc28gYWxsIG9kZCBkaWdpdCBycCBhc3Np Z25tZW50cyBpbiB0aGUgbG9vcCB3ZXJlIHJlbW92ZWQuClRoaXMgaW5jbHVk ZWQgdGhlIGVsc2UgY2xhdXNlIG9mIHRoZSBpZiBzdGF0ZW1lbnRzLgpPZiBj b3Vyc2UgYWZ0ZXIgdGhlIGxvb3Agd2UgbmVlZCB0byBjb3JyZWN0IHRoaW5n cyBieSBhZGRpbmcgY29kZSBsaWtlOgogICAgcnA1ID0gcGFyIF4gcnA0OwpB bHNvIHRoZSBpbml0aWFsIGFzc2lnbm1lbnRzIChycDUgPSAwOyBldGMpIGNv dWxkIGJlIHJlbW92ZWQuCkFsb25nIHRoZSBsaW5lIEkgYWxzbyByZW1vdmVk IHRoZSBpbml0aWFsaXNhdGlvbiBvZiBycDAvMS8yLzMuCgoKQW5hbHlzaXMg NQo9PT09PT09PT09CgpNZWFzdXJlbWVudHMgc2hvd2VkIHRoaXMgd2FzIGEg Z29vZCBtb3ZlLiBUaGUgcnVuLXRpbWUgcm91Z2hseSBoYWx2ZWQKY29tcGFy ZWQgd2l0aCBhdHRlbXB0IDQgd2l0aCA0IHRpbWVzIHVucm9sbGVkLCBhbmQg d2Ugb25seSByZXF1aXJlIDEvM3JkCm9mIHRoZSBwcm9jZXNzb3IgdGltZSBj b21wYXJlZCB0byB0aGUgY3VycmVudCBjb2RlIGluIHRoZSBsaW51eCBrZXJu ZWwuCgpIb3dldmVyLCBzdGlsbCBJIHRob3VnaHQgdGhlcmUgd2FzIG1vcmUu IEkgZGlkbid0IGxpa2UgYWxsIHRoZSBpZgpzdGF0ZW1lbnRzLiBXaHkgbm90 IGtlZXAgYSBydW5uaW5nIHBhcml0eSBhbmQgb25seSBrZWVwIHRoZSBsYXN0 IGlmCnN0YXRlbWVudC4gVGltZSBmb3IgeWV0IGFub3RoZXIgdmVyc2lvbiEK CgpBdHRlbXB0IDYKPT09PT09PT09CgpUSGUgY29kZSB3aXRoaW4gdGhlIGZv ciBsb29wIHdhcyBjaGFuZ2VkIHRvOgoKICAgIGZvciAoaSA9IDA7IGkgPCA0 OyBpKyspCiAgICB7CiAgICAgICAgY3VyID0gKmJwKys7IHRtcHBhciAgPSBj dXI7IHJwNCBePSBjdXI7CiAgICAgICAgY3VyID0gKmJwKys7IHRtcHBhciBe PSBjdXI7IHJwNiBePSB0bXBwYXI7CiAgICAgICAgY3VyID0gKmJwKys7IHRt cHBhciBePSBjdXI7IHJwNCBePSBjdXI7CiAgICAgICAgY3VyID0gKmJwKys7 IHRtcHBhciBePSBjdXI7IHJwOCBePSB0bXBwYXI7CgogICAgICAgIGN1ciA9 ICpicCsrOyB0bXBwYXIgXj0gY3VyOyBycDQgXj0gY3VyOyBycDYgXj0gY3Vy OwogICAgICAgIGN1ciA9ICpicCsrOyB0bXBwYXIgXj0gY3VyOyBycDYgXj0g Y3VyOwoJICAgIGN1ciA9ICpicCsrOyB0bXBwYXIgXj0gY3VyOyBycDQgXj0g Y3VyOwoJICAgIGN1ciA9ICpicCsrOyB0bXBwYXIgXj0gY3VyOyBycDEwIF49 IHRtcHBhcjsKCgkgICAgY3VyID0gKmJwKys7IHRtcHBhciBePSBjdXI7IHJw NCBePSBjdXI7IHJwNiBePSBjdXI7IHJwOCBePSBjdXI7CiAgICAgICAgY3Vy ID0gKmJwKys7IHRtcHBhciBePSBjdXI7IHJwNiBePSBjdXI7IHJwOCBePSBj dXI7CgkgICAgY3VyID0gKmJwKys7IHRtcHBhciBePSBjdXI7IHJwNCBePSBj dXI7IHJwOCBePSBjdXI7CiAgICAgICAgY3VyID0gKmJwKys7IHRtcHBhciBe PSBjdXI7IHJwOCBePSBjdXI7CgogICAgICAgIGN1ciA9ICpicCsrOyB0bXBw YXIgXj0gY3VyOyBycDQgXj0gY3VyOyBycDYgXj0gY3VyOwogICAgICAgIGN1 ciA9ICpicCsrOyB0bXBwYXIgXj0gY3VyOyBycDYgXj0gY3VyOwogICAgICAg IGN1ciA9ICpicCsrOyB0bXBwYXIgXj0gY3VyOyBycDQgXj0gY3VyOwogICAg ICAgIGN1ciA9ICpicCsrOyB0bXBwYXIgXj0gY3VyOwoKCSAgICBwYXIgXj0g dG1wcGFyOwogICAgICAgIGlmICgoaSAmIDB4MSkgPT0gMCkgcnAxMiBePSB0 bXBwYXI7CiAgICAgICAgaWYgKChpICYgMHgyKSA9PSAwKSBycDE0IF49IHRt cHBhcjsKICAgIH0KCkFzIHlvdSBjYW4gc2VlIHRtcHBhciBpcyB1c2VkIHRv IGFjY3VtdWxhdGUgdGhlIHBhcml0eSB3aXRoaW4gYSBmb3IKaXRlcmF0aW9u LiBJbiB0aGUgbGFzdCAzIHN0YXRlbWVudHMgaXMgaXMgYWRkZWQgdG8gcGFy IGFuZCwgaWYgbmVlZGVkLAp0byBycDEyIGFuZCBycDE0LgoKV2hpbGUgbWFr aW5nIHRoZSBjaGFuZ2VzIEkgYWxzbyBmb3VuZCB0aGF0IEkgY291bGQgZXhw bG9pdCB0aGF0IHRtcHBhcgpjb250YWlucyB0aGUgcnVubmluZyBwYXJpdHkg Zm9yIHRoaXMgaXRlcmF0aW9uLiBTbyBpbnN0ZWFkIG9mIGhhdmluZzoKcnA0 IF49IGN1cjsgcnA2ID0gY3VyOwpJIHJlbW92ZWQgdGhlIHJwNiA9IGN1cjsg c3RhdGVtZW50IGFuZCBkaWQgcnA2IF49IHRtcHBhcjsgb24gbmV4dApzdGF0 ZW1lbnQuIEEgc2ltaWxhciBjaGFuZ2Ugd2FzIGRvbmUgZm9yIHJwOCBhbmQg cnAxMAoKCkFuYWx5c2lzIDYKPT09PT09PT09PQoKTWVhc3VyaW5nIHRoaXMg Y29kZSBhZ2FpbiBzaG93ZWQgYmlnIGdhaW4uIFdoZW4gZXhlY3V0aW5nIHRo ZSBvcmlnaW5hbApsaW51eCBjb2RlIDEgbWlsbGlvbiB0aW1lcywgdGhpcyB0 b29rIGFib3V0IDEgc2Vjb25kIG9uIG15IHN5c3RlbS4KKHVzaW5nIHRpbWUg dG8gbWVhc3VyZSB0aGUgcGVyZm9ybWFuY2UpLiBBZnRlciB0aGlzIGl0ZXJh dGlvbiBJIHdhcyBiYWNrCnRvIDAuMDc1IHNlYy4gQWN0dWFsbHkgSSBoYWQg dG8gZGVjaWRlIHRvIHN0YXJ0IG1lYXN1cmluZyBvdmVyIDEwCm1pbGxpb24g aW50ZXJhdGlvbnMgaW4gb3JkZXIgbm90IHRvIGxvb3NlIHRvbyBtdWNoIGFj Y3VyYWN5LiBUaGlzIG9uZQpkZWZpbml0ZWx5IHNlZW1lZCB0byBiZSB0aGUg amFja3BvdCEKClRoZXJlIGlzIGEgbGl0dGxlIGJpdCBtb3JlIHJvb20gZm9y IGltcHJvdmVtZW50IHRob3VnaC4gVGhlcmUgYXJlIHRocmVlCnBsYWNlcyB3 aXRoIHN0YXRlbWVudHM6CnJwNCBePSBjdXI7IHJwNiBePSBjdXI7Ckl0IHNl ZW1zIG1vcmUgZWZmaWNpZW50IHRvIGFsc28gbWFpbnRhaW4gYSB2YXJpYWJs ZSBycDRfNiBpbiB0aGUgd2hpbGUKbG9vcDsgVGhpcyBlbGltaW5hdGVzIDMg c3RhdGVtZW50cyBwZXIgbG9vcC4gT2YgY291cnNlIGFmdGVyIHRoZSBsb29w IHdlCm5lZWQgdG8gY29ycmVjdCBieSBhZGRpbmc6CiAgICBycDQgXj0gcnA0 XzY7CiAgICBycDYgXj0gcnA0XzYKRnVydGhlcm1vcmUgdGhlcmUgYXJlIDQg c2VxdWVudGlhbCBhc3NpbmdtZW50cyB0byBycDguIFRoaXMgY2FuIGJlCmVu Y29kZWQgc2xpZ2h0bHkgbW9yZSBlZmZpY2llbnQgYnkgc2F2aW5nIHRtcHBh ciBiZWZvcmUgdGhvc2UgNCBsaW5lcwphbmQgbGF0ZXIgZG8gcnA4ID0gcnA4 IF4gdG1wcGFyIF4gbm90cnA4Owood2hlcmUgbm90cnA4IGlzIHRoZSB2YWx1 ZSBvZiBycDggYmVmb3JlIHRob3NlIDQgbGluZXMpLgpBZ2FpbiBhIHVzZSBv ZiB0aGUgY29tbXV0YXRpdmUgcHJvcGVydHkgb2YgeG9yLgpUaW1lIGZvciBh IG5ldyB0ZXN0IQoKCkF0dGVtcHQgNwo9PT09PT09PT0KClRoZSBuZXcgY29k ZSBub3cgbG9va3MgbGlrZToKCiAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsr KQogICAgewogICAgICAgIGN1ciA9ICpicCsrOyB0bXBwYXIgID0gY3VyOyBy cDQgXj0gY3VyOwogICAgICAgIGN1ciA9ICpicCsrOyB0bXBwYXIgXj0gY3Vy OyBycDYgXj0gdG1wcGFyOwogICAgICAgIGN1ciA9ICpicCsrOyB0bXBwYXIg Xj0gY3VyOyBycDQgXj0gY3VyOwogICAgICAgIGN1ciA9ICpicCsrOyB0bXBw YXIgXj0gY3VyOyBycDggXj0gdG1wcGFyOwoKICAgICAgICBjdXIgPSAqYnAr KzsgdG1wcGFyIF49IGN1cjsgcnA0XzYgXj0gY3VyOwogICAgICAgIGN1ciA9 ICpicCsrOyB0bXBwYXIgXj0gY3VyOyBycDYgXj0gY3VyOwoJICAgIGN1ciA9 ICpicCsrOyB0bXBwYXIgXj0gY3VyOyBycDQgXj0gY3VyOwoJICAgIGN1ciA9 ICpicCsrOyB0bXBwYXIgXj0gY3VyOyBycDEwIF49IHRtcHBhcjsKCgkgICAg bm90cnA4ID0gdG1wcGFyOwoJICAgIGN1ciA9ICpicCsrOyB0bXBwYXIgXj0g Y3VyOyBycDRfNiBePSBjdXI7CiAgICAgICAgY3VyID0gKmJwKys7IHRtcHBh ciBePSBjdXI7IHJwNiBePSBjdXI7CgkgICAgY3VyID0gKmJwKys7IHRtcHBh ciBePSBjdXI7IHJwNCBePSBjdXI7CiAgICAgICAgY3VyID0gKmJwKys7IHRt cHBhciBePSBjdXI7CgkgICAgcnA4ID0gcnA4IF4gdG1wcGFyIF4gbm90cnA4 OwoKICAgICAgICBjdXIgPSAqYnArKzsgdG1wcGFyIF49IGN1cjsgcnA0XzYg Xj0gY3VyOwogICAgICAgIGN1ciA9ICpicCsrOyB0bXBwYXIgXj0gY3VyOyBy cDYgXj0gY3VyOwogICAgICAgIGN1ciA9ICpicCsrOyB0bXBwYXIgXj0gY3Vy OyBycDQgXj0gY3VyOwogICAgICAgIGN1ciA9ICpicCsrOyB0bXBwYXIgXj0g Y3VyOwoKCSAgICBwYXIgXj0gdG1wcGFyOwogICAgICAgIGlmICgoaSAmIDB4 MSkgPT0gMCkgcnAxMiBePSB0bXBwYXI7CiAgICAgICAgaWYgKChpICYgMHgy KSA9PSAwKSBycDE0IF49IHRtcHBhcjsKICAgIH0KICAgIHJwNCBePSBycDRf NjsKICAgIHJwNiBePSBycDRfNjsKCgpOb3QgYSBiaWcgY2hhbmdlLCBidXQg ZXZlcnkgcGVubnkgY291bnRzIDotKQoKCkFuYWx5c2lzIDcKPT09PT09PT09 PQoKQWN1dGFsbHkgdGhpcyBtYWRlIHRoaW5ncyB3b3JzZS4gTm90IHZlcnkg bXVjaCwgYnV0IEkgZG9uJ3Qgd2FudCB0byBtb3ZlCmludG8gdGhlIHdyb25n IGRpcmVjdGlvbi4gTWF5YmUgc29tZXRoaW5nIHRvIGludmVzdGlnYXRlIGxh dGVyLiBDb3VsZApoYXZlIHRvIGRvIHdpdGggY2FjaGluZyBhZ2Fpbi4KCkd1 ZXNzIHRoYXQgaXMgd2hhdCB0aGVyZSBpcyB0byB3aW4gd2l0aGluIHRoZSBs b29wLiBNYXliZSB1bnJvbGxpbmcgb25lCm1vcmUgdGltZSB3aWxsIGhlbHAu IEknbGwga2VlcCB0aGUgb3B0aW1pc2F0aW9ucyBmcm9tIDcgZm9yIG5vdy4K CgpBdHRlbXB0IDgKPT09PT09PT09CgpVbnJvbGxlZCB0aGUgbG9vcCBvbmUg bW9yZSB0aW1lLgoKCkFuYWx5c2lzIDgKPT09PT09PT09PQoKVGhpcyBtYWtl cyB0aGluZ3Mgd29yc2UuIExldCdzIHN0aWNrIHdpdGggYXR0ZW1wdCA2IGFu ZCBjb250aW51ZSBmcm9tIHRoZXJlLgpBbHRob3VnaCBpdCBzZWVtcyB0aGF0 IHRoZSBjb2RlIHdpdGhpbiB0aGUgbG9vcCBjYW5ub3QgYmUgb3B0aW1pc2Vk CmZ1cnRoZXIgdGhlcmUgaXMgc3RpbGwgcm9vbSB0byBvcHRpbWl6ZSB0aGUg Z2VuZXJhdGlvbiBvZiB0aGUgZWNjIGNvZGVzLgpXZSBjYW4gc2ltcGx5IGNh bGN1YWxhdGUgdGhlIHRvdGFsIHBhcml0eS4gSWYgdGhpcyBpcyAwIHRoZW4g cnA0ID0gcnA1CmV0Yy4gSWYgdGhlIHBhcml0eSBpcyAxLCB0aGVuIHJwNCA9 ICFycDU7CkJ1dCBpZiBycDQgPSBycDUgd2UgZG8gbm90IG5lZWQgcnA1IGV0 Yy4gV2UgY2FuIGp1c3Qgd3JpdGUgdGhlIGV2ZW4gYml0cwppbiB0aGUgcmVz dWx0IGJ5dGUgYW5kIHRoZW4gZG8gc29tZXRoaW5nIGxpa2UKICAgIGNvZGVb MF0gfD0gKGNvZGVbMF0gPDwgMSk7CkxldHMgdGVzdCB0aGlzLgoKCkF0dGVt cHQgOQo9PT09PT09PT0KCkNoYW5nZWQgdGhlIGNvZGUgYnV0IGFnYWluIHRo aXMgc2xpZ2h0bHkgZGVncmFkZXMgcGVyZm9ybWFuY2UuIFRyaWVkIGFsbApr aW5kIG9mIG90aGVyIHRoaW5ncywgbGlrZSBoYXZpbmcgZGVkaWNhdGVkIHBh cml0eSBhcnJheXMgdG8gYXZvaWQgdGhlCnNoaWZ0IGFmdGVyIHBhcml0eVty cDddIDw8IDc7IE5vIGdhaW4uCkNoYW5nZSB0aGUgbG9va3VwIHVzaW5nIHRo ZSBwYXJpdHkgYXJyYXkgYnkgdXNpbmcgc2hpZnQgb3BlcmF0b3JzIChlLmcu CnJlcGxhY2UgcGFyaXR5W3JwN10gPDwgNyB3aXRoOgpycDcgXj0gKHJwNyA8 PCA0KTsKcnA3IF49IChycDcgPDwgMik7CnJwNyBePSAocnA3IDw8IDEpOwpy cDcgJj0gMHg4MDsKTm8gZ2Fpbi4KClRoZSBvbmx5IG1hcmdpbmFsIGNoYW5n ZSB3YXMgaW52ZXJ0aW5nIHRoZSBwYXJpdHkgYml0cywgc28gd2UgY2FuIHJl bW92ZQp0aGUgbGFzdCB0aHJlZSBpbnZlcnQgc3RhdGVtZW50cy4KCkFoIHdl bGwsIHBpdHkgdGhpcyBkb2VzIG5vdCBkZWxpdmVyIG1vcmUuIFRoZW4gYWdh aW4gMTAgbWlsbGlvbgppdGVyYXRpb25zIHVzaW5nIHRoZSBsaW51eCBkcml2 ZXIgY29kZSB0YWtlcyBiZXR3ZWVuIDEzIGFuZCAxMy41CnNlY29uZHMsIHdo ZXJlYXMgbXkgY29kZSBub3cgdGFrZXMgYWJvdXQgMC43MyBzZWNvbmRzIGZv ciB0aG9zZSAxMAptaWxsaW9uIGl0ZXJhdGlvbnMuIFNvIGJhc2ljYWxseSBJ J3ZlIGltcHJvdmVkIHRoZSBwZXJmb3JtYW5jZSBieSBhCmZhY3RvciAxOCBv biBteSBzeXN0ZW0uIE5vdCB0aGF0IGJhZC4gT2YgY291cnNlIG9uIGRpZmZl cmVudCBoYXJkd2FyZQp5b3Ugd2lsbCBnZXQgZGlmZmVyZW50IHJlc3VsdHMu IE5vIHdhcnJhbnRpZXMhCgpCdXQgb2YgY291cnNlIHRoZXJlIGlzIG5vIHN1 Y2ggdGhpbmcgYXMgYSBmcmVlIGx1bmNoLiBUaGUgY29kZXNpemUgYWxtb3N0 CnRyaXBsZWQgKGZyb20gNTYyIGJ5dGVzIHRvIDE0MzQgYnl0ZXMpLiBUaGVu IGFnYWluLCBpdCBpcyBub3QgdGhhdCBtdWNoLgoKCkNvcnJlY3RpbmcgZXJy b3JzCj09PT09PT09PT09PT09PT09CgpGb3IgY29ycmVjdGluZyBlcnJvcnMg SSBhZ2FpbiB1c2VkIHRoZSBTVCBhcHBsaWNhdGlvbiBub3RlIGFzIGEgc3Rh cnRlciwKYnV0IEkgYWxzbyBwZWVrZWQgYXQgdGhlIGV4aXN0aW5nIGNvZGUu ClRoZSBhbGdvcml0aG0gaXRzZWxmIGlzIHByZXR0eSBzdHJhaWdodGZvcndh cmQuIEp1c3QgeG9yIHRoZSBnaXZlbiBhbmQKdGhlIGNhbGN1bGF0ZWQgZWNj LiBJZiBhbGwgYnl0ZXMgYXJlIDAgdGhlcmUgaXMgbm8gcHJvYmxlbS4gSWYg MTEgYml0cwphcmUgMSB3ZSBoYXZlIG9uZSBjb3JyZWN0YWJsZSBiaXQgZXJy b3IuIElmIHRoZXJlIGlzIDEgYml0IDEsIHdlIGhhdmUgYW4KZXJyb3IgaW4g dGhlIGdpdmVuIGVjYyBjb2RlLiAKSXQgcHJvdmVkIHRvIGJlIGZhc3Rlc3Qg dG8gZG8gc29tZSB0YWJsZSBsb29rdXBzLiBQZXJmb3JtYW5jZSBnYWluCmlu dHJvZHVjZWQgYnkgdGhpcyBpcyBhYm91dCBhIGZhY3RvciAyIG9uIG15IHN5 c3RlbSB3aGVuIGEgcmVwYWlyIGhhZCB0bwpiZSBkb25lLCBhbmQgMSUgb3Ig c28gaWYgbm8gcmVwYWlyIGhhZCB0byBiZSBkb25lLgpDb2RlIHNpemUgaW5j cmVhc2VkIGZyb20gMzMwIGJ5dGVzIHRvIDY4NiBieXRlcyBmb3IgdGhpcyBm dW5jdGlvbi4KKGdjYyA0LjIsIC1PMykKCgpDb25jbHVzaW9uCj09PT09PT09 PT0KClRoZSBnYWluIHdoZW4gY2FsY3VsYXRpbmcgdGhlIGVjYyBpcyB0cmVt ZW5kb3VzLiBPbSBteSBkZXZlbG9wbWVudCBoYXJkd2FyZSAKYSBzcGVlZHVw IG9mIGEgZmFjdG9yIG9mIDE4IGZvciBlY2MgY2FsY3VsYXRpb24gd2FzIGFj aGlldmVkLiBPbiBhIHRlc3Qgb24gYW4KZW1iZWRkZWQgc3lzdGVtIHdpdGgg YSBNSVBTIGNvcmUgYSBmYWN0b3IgNyB3YXMgb2J0YWluZWQuCkZvciBjb3Jy ZWN0aW9uIG5vdCBtdWNoIGdhaW4gY291bGQgYmUgb2J0YWluZWQgKGFzIGJp dGZsaXBzIGFyZSByYXJlKS4gVGhlbgphZ2FpbiB0aGVyZSBhcmUgYWxzbyBt dWNoIGxlc3MgY3ljbGVzIHNwZW50IHRoZXJlLgoKSXQgc2VlbXMgdGhlcmUg aXMgbm90IG11Y2ggbW9yZSBnYWluIHBvc3NpYmxlIGluIHRoaXMsIGF0IGxl YXN0IHdoZW4KcHJvZ3JhbW1lZCBpbiBDLiBPZiBjb3Vyc2UgaXQgbWlnaHQg YmUgcG9zc2libGUgdG8gc3F1ZWV6ZSBzb21ldGhpbmcgbW9yZQpvdXQgb2Yg aXQgd2l0aCBhbiBhc3NlbWJsZXIgcHJvZ3JhbSwgYnV0IGR1ZSB0byBwaXBl bGluZSBiZWhhdmlvdXIgZXRjCnRoaXMgaXMgdmVyeSB0cmlja3kgKGF0IGxl YXN0IGZvciBpbnRlbCBodykuCgo= --0-945466422-1215339134=:94697--