From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mailman by lists.gnu.org with archive (Exim 4.43) id 1K4N7P-0006bb-Hu for mharc-grub-devel@gnu.org; Thu, 05 Jun 2008 17:35:35 -0400 Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1K4N7M-0006WP-T5 for grub-devel@gnu.org; Thu, 05 Jun 2008 17:35:32 -0400 Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1K4N7K-0006Rg-Ox for grub-devel@gnu.org; Thu, 05 Jun 2008 17:35:32 -0400 Received: from [199.232.76.173] (port=49907 helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1K4N7K-0006R5-Fw for grub-devel@gnu.org; Thu, 05 Jun 2008 17:35:30 -0400 Received: from fg-out-1718.google.com ([72.14.220.157]:33773) by monty-python.gnu.org with esmtp (Exim 4.60) (envelope-from ) id 1K4N7I-0008KY-U8 for grub-devel@gnu.org; Thu, 05 Jun 2008 17:35:30 -0400 Received: by fg-out-1718.google.com with SMTP id l26so619916fgb.30 for ; Thu, 05 Jun 2008 14:35:27 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma; h=domainkey-signature:received:received:subject:from:to:content-type :date:message-id:mime-version:x-mailer; bh=idgGhXnsraD1syN7/XA/2H4sJYmwrZXpWNor9RzWvUA=; b=MmauU8C5FbRiZ7FvkjvsMg6jQocXTRczd5M0MEoOnmSnC1YySGzc6rC+xp+1vBzBmR 8vsxpaXDokqZyJzaE1lD9gqaDXpckpcr1BeSUAT8hJdHhVWcZ2w+B9k0WFv4gMnDrXYR tUMlSghItc2LE0NnRrETXKfXHU4JN1DK5XoDU= DomainKey-Signature: a=rsa-sha1; c=nofws; d=gmail.com; s=gamma; h=subject:from:to:content-type:date:message-id:mime-version:x-mailer; b=I/py9fJUCJl8YZTQbjWg6V+l66EHi1iAVfJlk57kNe7Y1igl9hD9QChH6r4vvUF/Ql fB90nn3zrrjnqs1YR2QqxyWGGEjJKDBiQ4HvGnkytcsh5KEmQXUnhTi/tMwklm+/SsDF h2vMioU9F00OEcwuEd3imxFSz2EJVlM9Aww1I= Received: by 10.86.89.1 with SMTP id m1mr2909124fgb.45.1212701726124; Thu, 05 Jun 2008 14:35:26 -0700 (PDT) Received: from ?192.168.1.101? ( [213.37.137.93]) by mx.google.com with ESMTPS id e32sm7968106fke.15.2008.06.05.14.35.21 (version=SSLv3 cipher=RC4-MD5); Thu, 05 Jun 2008 14:35:25 -0700 (PDT) From: Javier =?ISO-8859-1?Q?Mart=EDn?= To: grub-devel@gnu.org Content-Type: multipart/signed; micalg=pgp-sha1; protocol="application/pgp-signature"; boundary="=-pC/cUfooMLRMhVdnyYus" Date: Thu, 05 Jun 2008 23:35:30 +0200 Message-Id: <1212701730.3141.25.camel@localhost> Mime-Version: 1.0 X-Mailer: Evolution 2.22.1.1 X-detected-kernel: by monty-python.gnu.org: Linux 2.6 (newer, 2) Subject: [PATCH] Reimplementing the legacy "map" command X-BeenThere: grub-devel@gnu.org X-Mailman-Version: 2.1.5 Precedence: list Reply-To: The development of GRUB 2 List-Id: The development of GRUB 2 List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 05 Jun 2008 21:35:33 -0000 --=-pC/cUfooMLRMhVdnyYus Content-Type: multipart/mixed; boundary="=-mAPtOKGdqxEzPbAMDDj1" --=-mAPtOKGdqxEzPbAMDDj1 Content-Type: text/plain Content-Transfer-Encoding: quoted-printable Hi again everybody. After some hacking with the GRUB internals, I've completed a reimplementation of the legacy "map" command that allowed the BIOS drives to have their numbers reassigned, in order to boot OSes whose boot code requires their installation to be located in the first HD (BIOS drive 0x80). This implementation gets next to the status of the command in GRUB Legacy, with the main changes being: * Command: now called "drivemap", attending to suggestions in this list * UI: the less complete part of the job. The syntax is now as follows: drivemap (hd1) 0x80 # Makes (hd1) appear as the first BIOS drive i.e. the second argument is now any BIOS drive number instead of another device. This change is in part due to my lack of time, but also because others here pointed that it would be useful to allow arbitrary mappings. If required, old syntax could be reimplemented in short time. * Backend: the command is now a module, but there is also code in the several files like the machine-specific loader.S, the loader header file and the makefiles. * Backend: a preboot hook system has been added to the loader backend, allowing modules to register functions to be run just before the grub_X_real_boot function is called. The drivemap module uses this new functionality to get its install_int13_handler function to be called before booting the target OS without creating chaos in GRUB itself. * Functionality: the new module is independent of chainloader, so its functions can be applied with any target loader. What effects will this have, I don't know. This patch is just a preliminary version that has been tested only in QEMU and Bochs, not on real hardware because I'm cut off from x86 computers from the time being (I'm running on a PPC mac now). I will be back to town (and to my olde amd64 box) this weekend, but I wanted to submit this so others could scrutinize it for obvious mistakes, and maybe test it. I've tried to respect the style rules I've seen, but please note that this is my first patch. Cheers! Habbit --=-mAPtOKGdqxEzPbAMDDj1 Content-Disposition: attachment; filename=drivemap.patch Content-Type: text/x-patch; name=drivemap.patch; charset=UTF-8 Content-Transfer-Encoding: base64 PyBjb21tYW5kcy9pMzg2L3BjL2RyaXZlbWFwLmMNCkluZGV4OiBjb25mL2kzODYtcGMubWsNCj09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT0NClJDUyBmaWxlOiAvc291cmNlcy9ncnViL2dydWIyL2NvbmYvaTM4Ni1wYy5tayx2 DQpyZXRyaWV2aW5nIHJldmlzaW9uIDEuMTMyDQpkaWZmIC11IC1yMS4xMzIgaTM4Ni1wYy5taw0K LS0tIGNvbmYvaTM4Ni1wYy5tawkzMCBNYXkgMjAwOCAwNDoyMDo0NyAtMDAwMAkxLjEzMg0KKysr IGNvbmYvaTM4Ni1wYy5tawk1IEp1biAyMDA4IDIwOjA4OjIwIC0wMDAwDQpAQCAtODQyLDcgKzg0 Miw3IEBADQogCXZiZS5tb2QgdmJldGVzdC5tb2QgdmJlaW5mby5tb2QgdmlkZW8ubW9kIGdmeHRl cm0ubW9kIFwNCiAJdmlkZW90ZXN0Lm1vZCBwbGF5Lm1vZCBiaXRtYXAubW9kIHRnYS5tb2QgY3B1 aWQubW9kIHNlcmlhbC5tb2QJXA0KIAlhdGEubW9kIHZnYS5tb2QgbWVtZGlzay5tb2QganBlZy5t b2QgcG5nLm1vZCBwY2kubW9kIGxzcGNpLm1vZCBcDQotCWFvdXQubW9kIF9ic2QubW9kIGJzZC5t b2QNCisJYW91dC5tb2QgX2JzZC5tb2QgYnNkLm1vZCBkcml2ZW1hcC5tb2QNCiANCiAjIEZvciBi aW9zZGlzay5tb2QuDQogYmlvc2Rpc2tfbW9kX1NPVVJDRVMgPSBkaXNrL2kzODYvcGMvYmlvc2Rp c2suYw0KQEAgLTI5NzAsNCArMjk3MCw2MCBAQA0KIGJzZF9tb2RfQ0ZMQUdTID0gJChDT01NT05f Q0ZMQUdTKQ0KIGJzZF9tb2RfTERGTEFHUyA9ICQoQ09NTU9OX0xERkxBR1MpDQogDQorIyBGb3Ig ZHJpdmVtYXAubW9kLg0KK2RyaXZlbWFwX21vZF9TT1VSQ0VTID0gY29tbWFuZHMvaTM4Ni9wYy9k cml2ZW1hcC5jDQorQ0xFQU5GSUxFUyArPSBkcml2ZW1hcC5tb2QgbW9kLWRyaXZlbWFwLm8gbW9k LWRyaXZlbWFwLmMgcHJlLWRyaXZlbWFwLm8gZHJpdmVtYXBfbW9kLWNvbW1hbmRzX2kzODZfcGNf ZHJpdmVtYXAubyB1bmQtZHJpdmVtYXAubHN0DQoraWZuZXEgKCQoZHJpdmVtYXBfbW9kX0VYUE9S VFMpLG5vKQ0KK0NMRUFORklMRVMgKz0gZGVmLWRyaXZlbWFwLmxzdA0KK0RFRlNZTUZJTEVTICs9 IGRlZi1kcml2ZW1hcC5sc3QNCitlbmRpZg0KK01PU1RMWUNMRUFORklMRVMgKz0gZHJpdmVtYXBf bW9kLWNvbW1hbmRzX2kzODZfcGNfZHJpdmVtYXAuZA0KK1VORFNZTUZJTEVTICs9IHVuZC1kcml2 ZW1hcC5sc3QNCisNCitkcml2ZW1hcC5tb2Q6IHByZS1kcml2ZW1hcC5vIG1vZC1kcml2ZW1hcC5v DQorCS1ybSAtZiAkQA0KKwkkKFRBUkdFVF9DQykgJChkcml2ZW1hcF9tb2RfTERGTEFHUykgJChU QVJHRVRfTERGTEFHUykgLVdsLC1yLC1kIC1vICRAICReDQorCSQoU1RSSVApIC0tc3RyaXAtdW5u ZWVkZWQgLUsgZ3J1Yl9tb2RfaW5pdCAtSyBncnViX21vZF9maW5pIC1SIC5ub3RlIC1SIC5jb21t ZW50ICRADQorDQorcHJlLWRyaXZlbWFwLm86ICQoZHJpdmVtYXBfbW9kX0RFUEVOREVOQ0lFUykg ZHJpdmVtYXBfbW9kLWNvbW1hbmRzX2kzODZfcGNfZHJpdmVtYXAubw0KKwktcm0gLWYgJEANCisJ JChUQVJHRVRfQ0MpICQoZHJpdmVtYXBfbW9kX0xERkxBR1MpICQoVEFSR0VUX0xERkxBR1MpIC1X bCwtciwtZCAtbyAkQCBkcml2ZW1hcF9tb2QtY29tbWFuZHNfaTM4Nl9wY19kcml2ZW1hcC5vDQor DQorbW9kLWRyaXZlbWFwLm86IG1vZC1kcml2ZW1hcC5jDQorCSQoVEFSR0VUX0NDKSAkKFRBUkdF VF9DUFBGTEFHUykgJChUQVJHRVRfQ0ZMQUdTKSAkKGRyaXZlbWFwX21vZF9DRkxBR1MpIC1jIC1v ICRAICQ8DQorDQorbW9kLWRyaXZlbWFwLmM6IG1vZGRlcC5sc3QgZ2VubW9kc3JjLnNoDQorCXNo ICQoc3JjZGlyKS9nZW5tb2RzcmMuc2ggJ2RyaXZlbWFwJyAkPCA+ICRAIHx8IChybSAtZiAkQDsg ZXhpdCAxKQ0KKw0KK2lmbmVxICgkKGRyaXZlbWFwX21vZF9FWFBPUlRTKSxubykNCitkZWYtZHJp dmVtYXAubHN0OiBwcmUtZHJpdmVtYXAubw0KKwkkKE5NKSAtZyAtLWRlZmluZWQtb25seSAtUCAt cCAkPCB8IHNlZCAncy9eXChbXiBdKlwpLiovXDEgZHJpdmVtYXAvJyA+ICRADQorZW5kaWYNCisN Cit1bmQtZHJpdmVtYXAubHN0OiBwcmUtZHJpdmVtYXAubw0KKwllY2hvICdkcml2ZW1hcCcgPiAk QA0KKwkkKE5NKSAtdSAtUCAtcCAkPCB8IGN1dCAtZjEgLWQnICcgPj4gJEANCisNCitkcml2ZW1h cF9tb2QtY29tbWFuZHNfaTM4Nl9wY19kcml2ZW1hcC5vOiBjb21tYW5kcy9pMzg2L3BjL2RyaXZl bWFwLmMgJChjb21tYW5kcy9pMzg2L3BjL2RyaXZlbWFwLmNfREVQRU5ERU5DSUVTKQ0KKwkkKFRB UkdFVF9DQykgLUljb21tYW5kcy9pMzg2L3BjIC1JJChzcmNkaXIpL2NvbW1hbmRzL2kzODYvcGMg JChUQVJHRVRfQ1BQRkxBR1MpICAkKFRBUkdFVF9DRkxBR1MpICQoZHJpdmVtYXBfbW9kX0NGTEFH UykgLU1EIC1jIC1vICRAICQ8DQorLWluY2x1ZGUgZHJpdmVtYXBfbW9kLWNvbW1hbmRzX2kzODZf cGNfZHJpdmVtYXAuZA0KKw0KK0NMRUFORklMRVMgKz0gY21kLWRyaXZlbWFwX21vZC1jb21tYW5k c19pMzg2X3BjX2RyaXZlbWFwLmxzdCBmcy1kcml2ZW1hcF9tb2QtY29tbWFuZHNfaTM4Nl9wY19k cml2ZW1hcC5sc3QgcGFydG1hcC1kcml2ZW1hcF9tb2QtY29tbWFuZHNfaTM4Nl9wY19kcml2ZW1h cC5sc3QNCitDT01NQU5ERklMRVMgKz0gY21kLWRyaXZlbWFwX21vZC1jb21tYW5kc19pMzg2X3Bj X2RyaXZlbWFwLmxzdA0KK0ZTRklMRVMgKz0gZnMtZHJpdmVtYXBfbW9kLWNvbW1hbmRzX2kzODZf cGNfZHJpdmVtYXAubHN0DQorUEFSVE1BUEZJTEVTICs9IHBhcnRtYXAtZHJpdmVtYXBfbW9kLWNv bW1hbmRzX2kzODZfcGNfZHJpdmVtYXAubHN0DQorDQorY21kLWRyaXZlbWFwX21vZC1jb21tYW5k c19pMzg2X3BjX2RyaXZlbWFwLmxzdDogY29tbWFuZHMvaTM4Ni9wYy9kcml2ZW1hcC5jICQoY29t bWFuZHMvaTM4Ni9wYy9kcml2ZW1hcC5jX0RFUEVOREVOQ0lFUykgZ2VuY21kbGlzdC5zaA0KKwlz ZXQgLWU7IAkgICQoVEFSR0VUX0NDKSAtSWNvbW1hbmRzL2kzODYvcGMgLUkkKHNyY2RpcikvY29t bWFuZHMvaTM4Ni9wYyAkKFRBUkdFVF9DUFBGTEFHUykgJChUQVJHRVRfQ0ZMQUdTKSAkKGRyaXZl bWFwX21vZF9DRkxBR1MpIC1FICQ8IAkgIHwgc2ggJChzcmNkaXIpL2dlbmNtZGxpc3Quc2ggZHJp dmVtYXAgPiAkQCB8fCAocm0gLWYgJEA7IGV4aXQgMSkNCisNCitmcy1kcml2ZW1hcF9tb2QtY29t bWFuZHNfaTM4Nl9wY19kcml2ZW1hcC5sc3Q6IGNvbW1hbmRzL2kzODYvcGMvZHJpdmVtYXAuYyAk KGNvbW1hbmRzL2kzODYvcGMvZHJpdmVtYXAuY19ERVBFTkRFTkNJRVMpIGdlbmZzbGlzdC5zaA0K KwlzZXQgLWU7IAkgICQoVEFSR0VUX0NDKSAtSWNvbW1hbmRzL2kzODYvcGMgLUkkKHNyY2Rpcikv Y29tbWFuZHMvaTM4Ni9wYyAkKFRBUkdFVF9DUFBGTEFHUykgJChUQVJHRVRfQ0ZMQUdTKSAkKGRy aXZlbWFwX21vZF9DRkxBR1MpIC1FICQ8IAkgIHwgc2ggJChzcmNkaXIpL2dlbmZzbGlzdC5zaCBk cml2ZW1hcCA+ICRAIHx8IChybSAtZiAkQDsgZXhpdCAxKQ0KKw0KK3BhcnRtYXAtZHJpdmVtYXBf bW9kLWNvbW1hbmRzX2kzODZfcGNfZHJpdmVtYXAubHN0OiBjb21tYW5kcy9pMzg2L3BjL2RyaXZl bWFwLmMgJChjb21tYW5kcy9pMzg2L3BjL2RyaXZlbWFwLmNfREVQRU5ERU5DSUVTKSBnZW5wYXJ0 bWFwbGlzdC5zaA0KKwlzZXQgLWU7IAkgICQoVEFSR0VUX0NDKSAtSWNvbW1hbmRzL2kzODYvcGMg LUkkKHNyY2RpcikvY29tbWFuZHMvaTM4Ni9wYyAkKFRBUkdFVF9DUFBGTEFHUykgJChUQVJHRVRf Q0ZMQUdTKSAkKGRyaXZlbWFwX21vZF9DRkxBR1MpIC1FICQ8IAkgIHwgc2ggJChzcmNkaXIpL2dl bnBhcnRtYXBsaXN0LnNoIGRyaXZlbWFwID4gJEAgfHwgKHJtIC1mICRAOyBleGl0IDEpDQorDQor DQorZHJpdmVtYXBfbW9kX0NGTEFHUyA9ICQoQ09NTU9OX0NGTEFHUykNCitkcml2ZW1hcF9tb2Rf TERGTEFHUyA9ICQoQ09NTU9OX0xERkxBR1MpDQorDQogaW5jbHVkZSAkKHNyY2RpcikvY29uZi9j b21tb24ubWsNCkluZGV4OiBjb25mL2kzODYtcGMucm1rDQo9PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQpSQ1MgZmlsZTog L3NvdXJjZXMvZ3J1Yi9ncnViMi9jb25mL2kzODYtcGMucm1rLHYNCnJldHJpZXZpbmcgcmV2aXNp b24gMS4xMTkNCmRpZmYgLXUgLXIxLjExOSBpMzg2LXBjLnJtaw0KLS0tIGNvbmYvaTM4Ni1wYy5y bWsJMzAgTWF5IDIwMDggMDQ6MjA6NDcgLTAwMDAJMS4xMTkNCisrKyBjb25mL2kzODYtcGMucm1r CTUgSnVuIDIwMDggMjA6MDg6MjEgLTAwMDANCkBAIC0zMTksNCArMzE5LDkgQEANCiBic2RfbW9k X0NGTEFHUyA9ICQoQ09NTU9OX0NGTEFHUykNCiBic2RfbW9kX0xERkxBR1MgPSAkKENPTU1PTl9M REZMQUdTKQ0KIA0KKyMgRm9yIGRyaXZlbWFwLm1vZC4NCitkcml2ZW1hcF9tb2RfU09VUkNFUyA9 IGNvbW1hbmRzL2kzODYvcGMvZHJpdmVtYXAuYw0KK2RyaXZlbWFwX21vZF9DRkxBR1MgPSAkKENP TU1PTl9DRkxBR1MpDQorZHJpdmVtYXBfbW9kX0xERkxBR1MgPSAkKENPTU1PTl9MREZMQUdTKQ0K Kw0KIGluY2x1ZGUgJChzcmNkaXIpL2NvbmYvY29tbW9uLm1rDQpJbmRleDogaW5jbHVkZS9ncnVi L2xvYWRlci5oDQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09DQpSQ1MgZmlsZTogL3NvdXJjZXMvZ3J1Yi9ncnViMi9pbmNs dWRlL2dydWIvbG9hZGVyLmgsdg0KcmV0cmlldmluZyByZXZpc2lvbiAxLjkNCmRpZmYgLXUgLXIx LjkgbG9hZGVyLmgNCi0tLSBpbmNsdWRlL2dydWIvbG9hZGVyLmgJMjEgSnVsIDIwMDcgMjM6MzI6 MjIgLTAwMDAJMS45DQorKysgaW5jbHVkZS9ncnViL2xvYWRlci5oCTUgSnVuIDIwMDggMjA6MDg6 MjEgLTAwMDANCkBAIC0zNyw2ICszNywxOSBAQA0KIC8qIFVuc2V0IGN1cnJlbnQgbG9hZGVyLCBp ZiBhbnkuICAqLw0KIHZvaWQgRVhQT1JUX0ZVTkMoZ3J1Yl9sb2FkZXJfdW5zZXQpICh2b2lkKTsN CiANCit0eXBlZGVmIHN0cnVjdCBob29rbGlzdF9ub2RlICpncnViX3ByZWJvb3RfaG9va2lkOw0K Kw0KKy8qIFJlZ2lzdGVyIGEgZnVuY3Rpb24gdG8gYmUgY2FsbGVkIGJlZm9yZSB0aGUgYm9vdCBo b29rLiBSZXR1cm5zIGFuIGlkIHRoYXQNCisgICBjYW4gYmUgbGF0ZXIgdXNlZCB0byB1bnJlZ2lz dGVyIHRoZSBwcmVib290IChpLmUuIGlmIG1vZHVsZSB1bmxvYWRlZCkuIElmDQorICAgYWJvcnRf b25fZXJyb3IgaXMgc2V0LCB0aGUgYm9vdCBzZXF1ZW5jZSB3aWxsIGFib3J0IGlmIGFueSBvZiB0 aGUgcmVnaXN0ZXJlZA0KKyAgIGZ1bmN0aW9ucyByZXR1cm4gYW55dGhpbmcgZWxzZSB0aGFuIEdS VUJfRVJSX05PTkUgKi8NCitncnViX3ByZWJvb3RfaG9va2lkIEVYUE9SVF9GVU5DKGdydWJfbG9h ZGVyX3JlZ2lzdGVyX3ByZWJvb3QpDQorICAgICAgICAgICAoZ3J1Yl9lcnJfdCAoKmhvb2spICh2 b2lkKSwgaW50IGFib3J0X29uX2Vycm9yKTsgDQorDQorLyogVW5yZWdpc3RlciBhIHByZWJvb3Qg aG9vayBieSB0aGUgaWQgcmV0dXJuZWQgYnkgbG9hZGVyX3JlZ2lzdGVyX3ByZWJvb3QuDQorICAg VGhpcyBmdW5jdGlvbnMgYmVjb21lcyBhIG5vLW9wIGlmIG5vIHN1Y2ggZnVuY3Rpb24gaXMgcmVn aXN0ZXJlZCAqLw0KK3ZvaWQgRVhQT1JUX0ZVTkMoZ3J1Yl9sb2FkZXJfdW5yZWdpc3Rlcl9wcmVi b290KSAoZ3J1Yl9wcmVib290X2hvb2tpZCBpZCk7DQorDQogLyogQ2FsbCB0aGUgYm9vdCBob29r IGluIGN1cnJlbnQgbG9hZGVyLiBUaGlzIG1heSBvciBtYXkgbm90IHJldHVybiwNCiAgICBkZXBl bmRpbmcgb24gdGhlIHNldHRpbmcgYnkgZ3J1Yl9sb2FkZXJfc2V0LiAgKi8NCiBncnViX2Vycl90 IEVYUE9SVF9GVU5DKGdydWJfbG9hZGVyX2Jvb3QpICh2b2lkKTsNCkluZGV4OiBpbmNsdWRlL2dy dWIvaTM4Ni9sb2FkZXIuaA0KPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KUkNTIGZpbGU6IC9zb3VyY2VzL2dydWIvZ3J1 YjIvaW5jbHVkZS9ncnViL2kzODYvbG9hZGVyLmgsdg0KcmV0cmlldmluZyByZXZpc2lvbiAxLjQN CmRpZmYgLXUgLXIxLjQgbG9hZGVyLmgNCi0tLSBpbmNsdWRlL2dydWIvaTM4Ni9sb2FkZXIuaAkz MCBNYXIgMjAwOCAxODowNDozOSAtMDAwMAkxLjQNCisrKyBpbmNsdWRlL2dydWIvaTM4Ni9sb2Fk ZXIuaAk1IEp1biAyMDA4IDIwOjA4OjIxIC0wMDAwDQpAQCAtMzEsNiArMzEsMTUgQEANCiBleHRl cm4gZ3J1Yl9hZGRyX3QgRVhQT1JUX1ZBUihncnViX29zX2FyZWFfYWRkcik7DQogZXh0ZXJuIGdy dWJfc2l6ZV90IEVYUE9SVF9WQVIoZ3J1Yl9vc19hcmVhX3NpemUpOw0KIA0KK2V4dGVybiBncnVi X3VpbnQzMl90IEVYUE9SVF9WQVIoZ3J1Yl9kcml2ZW1hcF9pbnQxM19vbGRoYW5kbGVyKTsgLyog cmVhbG0gZmFyIHB0ciA9IDIgKiAxNmIgKi8NCitleHRlcm4gZ3J1Yl91aW50MTZfdCBFWFBPUlRf VkFSKGdydWJfZHJpdmVtYXBfaW50MTNfc2l6ZSk7ICAvKiBTaXplIG9mIHRoZSBzZWN0aW9uIHRv IGJlIGNvcGllZCAqLw0KKy8qIFRoaXMgaXMgTk9UIGEgdHlwbzogd2UganVzdCB3YW50IHRoaXMg InZvaWQiIHZhciBpbiBvcmRlciB0byB0YWtlIGl0cw0KKyAqIGFkZHJlc3Mgd2l0aCAmdmFyIC0g dXNlZCBmb3IgcmVsYXRpdmUgYWRkcmVzc2luZyB3aXRoaW4gdGhlIGludDEzIGhhbmRsZXIgKi8N CitleHRlcm4gdm9pZCBFWFBPUlRfVkFSKGdydWJfZHJpdmVtYXBfaW50MTNfaGFuZGxlcl9iYXNl KTsNCitleHRlcm4gdm9pZCBFWFBPUlRfVkFSKGdydWJfZHJpdmVtYXBfaW50MTNfbWFwc3RhcnQp Ow0KKw0KK3ZvaWQgRVhQT1JUX0ZVTkMoZ3J1Yl9kcml2ZW1hcF9pbnQxM19oYW5kbGVyKSh2b2lk KTsNCisNCiBncnViX2Vycl90IEVYUE9SVF9GVU5DKGdydWJfbGludXhfYm9vdCkgKHZvaWQpOw0K IA0KIC8qIFRoZSBhc20gcGFydCBvZiB0aGUgbXVsdGlib290IGxvYWRlci4gICovDQpJbmRleDog a2Vybi9sb2FkZXIuYw0KPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PQ0KUkNTIGZpbGU6IC9zb3VyY2VzL2dydWIvZ3J1YjIv a2Vybi9sb2FkZXIuYyx2DQpyZXRyaWV2aW5nIHJldmlzaW9uIDEuOQ0KZGlmZiAtdSAtcjEuOSBs b2FkZXIuYw0KLS0tIGtlcm4vbG9hZGVyLmMJMjEgSnVsIDIwMDcgMjM6MzI6MjYgLTAwMDAJMS45 DQorKysga2Vybi9sb2FkZXIuYwk1IEp1biAyMDA4IDIwOjA4OjIxIC0wMDAwDQpAQCAtNjEsMTEg KzYxLDc4IEBADQogICBncnViX2xvYWRlcl9sb2FkZWQgPSAwOw0KIH0NCiANCitzdHJ1Y3QgaG9v a2xpc3Rfbm9kZQ0KK3sNCisgIGdydWJfZXJyX3QgKCpob29rKSAodm9pZCk7DQorICBpbnQgYWJv cnRfb25fZXJyb3I7DQorICBzdHJ1Y3QgaG9va2xpc3Rfbm9kZSAqbmV4dDsNCit9Ow0KKw0KK3N0 YXRpYyBzdHJ1Y3QgaG9va2xpc3Rfbm9kZSAqcHJlYm9vdF9ob29rcyA9IDA7DQorDQorZ3J1Yl9w cmVib290X2hvb2tpZA0KK2dydWJfbG9hZGVyX3JlZ2lzdGVyX3ByZWJvb3QoZ3J1Yl9lcnJfdCAo Kmhvb2spICh2b2lkKSwgaW50IGFib3J0X29uX2Vycm9yKQ0KK3sNCisgIGlmICgwID09IGhvb2sp DQorICAgIHsNCisgICAgICBncnViX2Vycm9yIChHUlVCX0VSUl9CQURfQVJHVU1FTlQsICJwcmVi b290IGhvb29rIG11c3Qgbm90IGJlIG51bGwiKTsNCisgICAgICByZXR1cm4gMDsNCisgICAgfQ0K KyAgZ3J1Yl9wcmVib290X2hvb2tpZCBuZXdlbnRyeSA9IGdydWJfbWFsbG9jIChzaXplb2YgKHN0 cnVjdCBob29rbGlzdF9ub2RlKSk7DQorICBpZiAoIW5ld2VudHJ5KQ0KKyAgICB7DQorICAgICAg Z3J1Yl9lcnJvciAoR1JVQl9FUlJfT1VUX09GX01FTU9SWSwgImNhbm5vdCBhbGxvYyBhIGhvb2tp bmZvIHN0cnVjdHVyZSIpOw0KKyAgICAgIHJldHVybiAwOw0KKyAgICB9DQorICBlbHNlDQorICAg IHsNCisgICAgICBuZXdlbnRyeS0+aG9vayA9IGhvb2s7DQorICAgICAgbmV3ZW50cnktPmFib3J0 X29uX2Vycm9yID0gYWJvcnRfb25fZXJyb3I7DQorICAgICAgbmV3ZW50cnktPm5leHQgPSBwcmVi b290X2hvb2tzOw0KKyAgICAgIHByZWJvb3RfaG9va3MgPSBuZXdlbnRyeTsNCisgICAgICByZXR1 cm4gbmV3ZW50cnk7DQorICAgIH0NCit9DQorDQordm9pZA0KK2dydWJfbG9hZGVyX3VucmVnaXN0 ZXJfcHJlYm9vdChncnViX3ByZWJvb3RfaG9va2lkIGlkKQ0KK3sNCisgIGlmICgwID09IGlkKQ0K KyAgICByZXR1cm47DQorICBncnViX3ByZWJvb3RfaG9va2lkIGVudHJ5ID0gMCwgc2VhcmNoID0g cHJlYm9vdF9ob29rcywgcHJldmlvdXMgPSAwOw0KKyAgd2hpbGUgKHNlYXJjaCkNCisgICAgew0K KyAgICAgIGlmIChzZWFyY2ggPT0gaWQpDQorICAgICAgICB7DQorICAgICAgICAgIGVudHJ5ID0g c2VhcmNoOw0KKyAgICAgICAgICBicmVhazsNCisgICAgICAgIH0NCisgICAgICBwcmV2aW91cyA9 IHNlYXJjaDsNCisgICAgICBzZWFyY2ggPSBzZWFyY2gtPm5leHQ7DQorICAgIH0NCisgIGlmIChl bnRyeSkgLyogRm91bmQgKi8NCisgICAgew0KKyAgICAgIGlmIChwcmV2aW91cykNCisgICAgICAg IHByZXZpb3VzLT5uZXh0ID0gZW50cnktPm5leHQ7DQorICAgICAgZWxzZSBwcmVib290X2hvb2tz ID0gZW50cnktPm5leHQ7IC8qIEVudHJ5IHdhcyBoZWFkIG9mIGxpc3QgKi8NCisgICAgICBncnVi X2ZyZWUgKGVudHJ5KTsNCisgICAgfQ0KK30NCisNCiBncnViX2Vycl90DQogZ3J1Yl9sb2FkZXJf Ym9vdCAodm9pZCkNCiB7DQogICBpZiAoISBncnViX2xvYWRlcl9sb2FkZWQpDQogICAgIHJldHVy biBncnViX2Vycm9yIChHUlVCX0VSUl9OT19LRVJORUwsICJubyBsb2FkZWQga2VybmVsIik7DQor ICANCisgIGdydWJfcHJlYm9vdF9ob29raWQgZW50cnkgPSBwcmVib290X2hvb2tzOw0KKyAgd2hp bGUgKGVudHJ5KQ0KKyAgICB7DQorICAgICAgZ3J1Yl9lcnJfdCByZXRWYWwgPSBlbnRyeS0+aG9v aygpOw0KKyAgICAgIGlmIChyZXRWYWwgIT0gR1JVQl9FUlJfTk9ORSAmJiBlbnRyeS0+YWJvcnRf b25fZXJyb3IpDQorICAgICAgICByZXR1cm4gcmV0VmFsOw0KKyAgICAgIGVudHJ5ID0gZW50cnkt Pm5leHQ7DQorICAgIH0NCiANCiAgIGlmIChncnViX2xvYWRlcl9ub3JldHVybikNCiAgICAgZ3J1 Yl9tYWNoaW5lX2ZpbmkgKCk7DQpJbmRleDoga2Vybi9pMzg2L2xvYWRlci5TDQo9PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 DQpSQ1MgZmlsZTogL3NvdXJjZXMvZ3J1Yi9ncnViMi9rZXJuL2kzODYvbG9hZGVyLlMsdg0KcmV0 cmlldmluZyByZXZpc2lvbiAxLjMNCmRpZmYgLXUgLXIxLjMgbG9hZGVyLlMNCi0tLSBrZXJuL2kz ODYvbG9hZGVyLlMJMTkgRmViIDIwMDggMTY6NDA6NDQgLTAwMDAJMS4zDQorKysga2Vybi9pMzg2 L2xvYWRlci5TCTUgSnVuIDIwMDggMjA6MDg6MjIgLTAwMDANCkBAIC01OSw2ICs1OSwxNDIgQEAN CiBWQVJJQUJMRShncnViX2xpbnV4X2lzX2J6aW1hZ2UpDQogCS5sb25nCTANCiANCisNCisjZGVm aW5lIEdSVUJfRFJJVkVNQVBfSU5UMTNIX09GRlNFVCh4KSAoKHgpIC0gZ3J1Yl9kcml2ZW1hcF9p bnQxM19oYW5kbGVyX2Jhc2UpDQorVkFSSUFCTEUoZ3J1Yl9kcml2ZW1hcF9pbnQxM19oYW5kbGVy X2Jhc2UpICAvKiBXaGVuIGRlcGxveWVkLCB0aGlzIHRhZyBtdXN0IGJlIHNlZ21lbnQtYWxpZ25l ZCAqLw0KK1ZBUklBQkxFKGdydWJfZHJpdmVtYXBfaW50MTNfb2xkaGFuZGxlcikNCisgIC53b3Jk IDB4ZGVhZCwgMHhiZWVmDQorLyogRHJpdmVtYXAgbW9kdWxlIC0gSU5UIDEzaCBoYW5kbGVyIC0g QklPUyBIRCBtYXAgKi8NCisvKiBSaWdodCBub3cgdGhpcyBmdW5jdGlvbiBpcyBqdXN0IGEgcGFz c3Rocm91Z2ggdG8gdGhlIG9sZCBoYW5kbGVyDQorICogV2UgbmVlZCB0byB1c2UgcmVsYXRpdmUg YWRkcmVzc2luZywgYW5kIHdpdGggQ1MgdG8gdG9wIGl0IGFsbCwgc2luY2Ugd2UNCisgKiBtdXN0 IG1ha2UgYXMgZmV3IGNoYW5nZXMgdG8gdGhlIHJlZ2lzdGVycyBhcyBwb3NzaWJsZS4gUGl0eSB3 ZSdyZSBub3Qgb24NCisgKiBhbWQ2NDogcklQLXJlbGF0aXZlIGFkZHJlc3Npbmcgd291bGQgbWFr ZSBsaWZlIGVhc2llciBoZXJlLg0KKyAqLw0KKy5jb2RlMTYNCitGVU5DVElPTihncnViX2RyaXZl bWFwX2ludDEzX2hhbmRsZXIpDQorICBwdXNoICVicA0KKyAgbW92ICVzcCwgJWJwDQorICBwdXNo ICVheCAgLyogV2UnbGwgbmVlZCBpdCBsYXRlciB0byBkZXRlcm1pbmUgdGhlIHVzZWQgQklPUyBm dW5jdGlvbiAqLw0KKw0KKyAgLyogREVCVUc6IHByaW50IHJlcXVlc3RlZCBkcml2ZSAoREwpICov DQorICAvKnB1c2ggJWVzDQorICBwdXNoYWwNCisgIG1vdiAkNCwgJWRpDQorICBtb3YgJDB4Yjgw MCwgJWJ4DQorICBtb3YgJWJ4LCAlZXMNCisgIA0KKyAgbW92YiAlZGwsICVibA0KKyAgYW5kYiAk MHgwZiwgJWJsDQorICBhZGRiICQweDMwLCAlYmwNCisgIHNobGwgJDE2LCAlZWJ4DQorICBtb3Zi ICVkbCwgJWJsDQorICBzaHJiICQ0LCAlYmwNCisgIGFkZGIgJDB4MzAsICVibA0KKyAgYW5kbCAk MHgwMGZmMDBmZiwgJWVieA0KKyAgb3JsICQweDBmMDAwZjAwLCAlZWJ4DQorICBtb3ZsICVlYngs ICVlczooJWRpKQ0KKyAgYWRkICQ0LCAlZGkNCisgIHBvcGFsDQorICBwb3AgJWVzKi8NCisNCisg IC8qIE1hcCB0aGUgZHJpdmUgbnVtYmVyIChhbHdheXMgaW4gREw/KSAqLw0KKyAgcHVzaCAlYXgN CisgIHB1c2ggJWJ4DQorICBwdXNoICVzaQ0KKyAgbW92ICRHUlVCX0RSSVZFTUFQX0lOVDEzSF9P RkZTRVQoZ3J1Yl9kcml2ZW1hcF9pbnQxM19zaXplKSwgJWJ4DQorICB4b3IgJXNpLCAlc2kNCisx Om1vdncgJWNzOiglYngsJXNpKSwgJWF4DQorICBjbXAgJWFoLCAlYWwNCisgIGp6IDNmIC8qIERS Vj1EU1QgPT4gbWFwIGVuZCAtIGRyaXZlIG5vdCByZW1hcHBlZCwgbGVhdmUgREwgYXMtaXMgKi8N CisgIGNtcCAlZGwsICVhbA0KKyAganogMmYgLyogRm91bmQgLSBkcml2ZSByZW1hcHBlZCwgbW9k aWZ5IERMICovDQorICBhZGQgJDIsICVzaQ0KKyAgam1wIDFiIC8qIE5vdCBmb3VuZCwgYnV0IG1v cmUgcmVtYWluaW5nLCBsb29wICAqLw0KKzI6bW92ICVhaCwgJWRsDQorMzpwb3AgJXNpDQorICBw b3AgJWJ4DQorICB4Y2hndyAlYXgsIC00KCVicCkgLyogUmVjb3ZlciB0aGUgb2xkIEFYIGFuZCBz YXZlIHRoZSBtYXAgZW50cnkgZm9yIGxhdGVyICovDQorICANCisgIC8qIERFQlVHOiBwcmludCBt YXAgZW50cnkgRFJWIChBTCkgYW5kIERTVCAoQUgpICovICANCisgIC8qcHVzaCAlZXMNCisgIHB1 c2hhbA0KKyAgbW92ICQ4LCAlZGkNCisgIG1vdiAkMHhiODAwLCAlYngNCisgIG1vdiAlYngsICVl cw0KKyAgDQorICBtb3ZiIC00KCVicCksICVibA0KKyAgYW5kYiAkMHgwZiwgJWJsDQorICBhZGRi ICQweDMwLCAlYmwNCisgIHNobGwgJDE2LCAlZWJ4DQorICBtb3ZiIC00KCVicCksICVibA0KKyAg c2hyYiAkNCwgJWJsDQorICBhZGRiICQweDMwLCAlYmwNCisgIGFuZGwgJDB4MDBmZjAwZmYsICVl YngNCisgIG9ybCAkMHgwZjAwMGYwMCwgJWVieA0KKyAgbW92bCAlZWJ4LCAlZXM6KCVkaSkNCisg IGFkZCAkNCwgJWRpDQorICAgDQorICBtb3ZiIC0zKCVicCksICVibA0KKyAgYW5kYiAkMHgwZiwg JWJsDQorICBhZGRiICQweDMwLCAlYmwNCisgIHNobGwgJDE2LCAlZWJ4DQorICBtb3ZiIC0zKCVi cCksICVibA0KKyAgc2hyYiAkNCwgJWJsDQorICBhZGRiICQweDMwLCAlYmwNCisgIGFuZGwgJDB4 MDBmZjAwZmYsICVlYngNCisgIG9ybCAkMHgwZjAwMGYwMCwgJWVieA0KKyAgbW92bCAlZWJ4LCAl ZXM6KCVkaSkNCisgIGFkZCAkNCwgJWRpDQorDQorICBwb3BhbA0KKyAgcG9wICVlcyovDQorDQor ICANCisgIHB1c2ggJWJwICANCisgIC8qIFNpbXVsYXRlIGludGVycnVwdCBjYWxsOiBwdXNoIGZs YWdzIGFuZCBkbyBhIGZhciBjYWxsIGluIG9yZGVyIHRvIHNldA0KKyAgICogdGhlIHN0YWNrIHRo ZSB3YXkgdGhlIG9sZCBoYW5kbGVyIGV4cGVjdHMgaXQgc28gdGhhdCBpdHMgaXJldCB3b3JrcyAq Lw0KKyAgcHVzaCA2KCVicCkNCisgIG1vdncgKCVicCksICVicCAgLyogUmVzdG9yZSB0aGUgY2Fs bGVyIEJQIChpcyB0aGlzIG5lZWRlZCBhbmQvb3Igc2Vuc2libGU/KSAqLw0KKyAgbGNhbGwgKiVj czpHUlVCX0RSSVZFTUFQX0lOVDEzSF9PRkZTRVQoZ3J1Yl9kcml2ZW1hcF9pbnQxM19vbGRoYW5k bGVyKQ0KKyAgcG9wICVicCAvKiBUaGUgcHVzaGVkIGZsYWdzIHdlcmUgcmVtb3ZlZCBieSBpcmV0 ICovDQorICAvKiBTZXQgdGhlIHNhdmVkIGZsYWdzIHRvIHdoYXQgdGhlIGludDEzaCBoYW5kbGVy IHJldHVybmVkICovDQorICBwdXNoICVheA0KKyAgcHVzaGYNCisgIHBvcCAlYXgNCisgIG1vdncg JWF4LCA2KCVicCkNCisgIHBvcCAlYXgNCisNCisgIC8qIFJldmVyc2UgbWFwIGFueSByZXR1cm5l ZCBkcml2ZSBudW1iZXIgaWYgdGhlIGRhdGEgcmV0dXJuZWQgaW5jbHVkZXMgaXQuDQorICAgKiBU aGUgb25seSBmdW5jIHRoYXQgZG9lcyB0aGlzIHNlZW1zIHRvIGJlIG9yaWdBSCA9IDB4MDgsIGJ1 dCBtYW55IEJJT1MNCisgICAqIHJlZnMgc2F5IHJldERMID0gIyBvZiBkcml2ZXMgY29ubmVjdGVk LiBIb3dldmVyLCB0aGUgR1JVQiBMZWdhY3kgY29kZQ0KKyAgICogdHJlYXRzIHRoaXMgYXMgdGhl IF9kcml2ZSBudW1iZXJfIGFuZCAidW5kb2VzIiB0aGUgcmVtYXBwaW5nLiBUaHVzLA0KKyAgICog dGhpcyBzZWN0aW9uIGhhcyBiZWVuIGRpc2FibGVkIGZvciB0ZXN0aW5nIGlmIGl0J3MgcmVxdWly ZWQgKi8NCisjICBjbXBiICQweDA4LCAtMSglYnApIC8qIENhbGxlcidzIEFIICovDQorIyAgam5l IDRmDQorIyAgcHVzaCAlZXMNCisjICBwdXNoYWwNCisjICBtb3YgJDAsICVkaQ0KKyMgIG1vdiAk MHhiODAwLCAlYngNCisjICBtb3YgJWJ4LCAlZXMNCisjICB4Y2hndyAlYXgsIC00KCVicCkgLyog TWFwIGVudHJ5IHVzZWQgKi8NCisjICBjbXAgJWFoLCAlYWwgIC8qIERSVj1EU1QgPT4gZHJpdmUg bm90IHJlbWFwcGVkICovDQorIyAgamUgNGYNCisjICBtb3YgJWFoLCAlZGwgIC8qIFVuZG8gcmVt YXAgKi8NCisNCis0Om1vdiAlYnAsICVzcA0KKyAgcG9wICVicA0KKyAgaXJldA0KKy8qIFRoaXMg bGFiZWwgTVVTVCBiZSBhdCB0aGUgZW5kIG9mIHRoZSBjb3BpZWQgYmxvY2ssIHNpbmNlIHRoZSBp bnN0YWxsZXIgY29kZQ0KKyAqIHJlc2VydmVzIGFkZGl0aW9uYWwgc3BhY2UgZm9yIG1hcHBpbmdz IGF0IHJ1bnRpbWUgYW5kIGNvcGllcyB0aGVtIG92ZXIgaXQgKi8NCisuYWxpZ24gMg0KK1ZBUklB QkxFKGdydWJfZHJpdmVtYXBfaW50MTNfbWFwc3RhcnQpDQorICAuc3BhY2UgMA0KKy5jb2RlMzIg LyogQ29weSBzdG9wcyBoZXJlICovDQorVkFSSUFCTEUoZ3J1Yl9kcml2ZW1hcF9pbnQxM19zaXpl KQ0KKyAgLndvcmQgR1JVQl9EUklWRU1BUF9JTlQxM0hfT0ZGU0VUKGdydWJfZHJpdmVtYXBfaW50 MTNfc2l6ZSkNCisjdW5kZWYgR1JVQl9EUklWRU1BUF9JTlQxM0hfT0ZGU0VUDQorDQorDQogRlVO Q1RJT04oZ3J1Yl9saW51eF9ib290KQ0KIAkvKiBNdXN0IGJlIGRvbmUgYmVmb3JlIHpJbWFnZSBj b3B5LiAgKi8NCiAJY2FsbAlFWFRfQyhncnViX2RsX3VubG9hZF9hbGwpDQo= --=-mAPtOKGdqxEzPbAMDDj1-- --=-pC/cUfooMLRMhVdnyYus Content-Type: application/pgp-signature; name=signature.asc Content-Description: Esta parte del mensaje =?ISO-8859-1?Q?est=E1?= firmada digitalmente -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.6 (GNU/Linux) iQIVAwUASEhcIqSl+Fbdeo72AQJs/A//Zr2IGcjk7+UF9ZIH++dT49Ve+dryw1Dl MO4j9HM2TTWQi0kyWGshM29HKGfcMYsIVuigUoqOzsJ5boGdFCNWq3QKfhLx6siS F7V4+sN42OIe9I81aTF05xyp/Y5LimNIvx1/4MtKDEWn/9fSMVZxb5/Rb9NrvtrB v2qd9nRU2eGJA14x3kC+29QV8aERO1lzTrPYwITHHnmGXmL3HRPgCHODTDbgPNnI AD3OVROfuuTP2qq1PhvqhAOslWrm6x4rwQ97d9MUVNzkIbFkUi3uibSEfoONbnfA RnLWN/wEIfU6XGXhzg7HokfZfXt0ETJ5ymlVZPWdmTnQO3Tu3SM8Hq7pETbx7bV2 mXETX7Ss4mKySn373Arp1R6YWjOqw5lvJz1MLMDU80B8sjCiMzF9m20wmNL6MVi6 XTDVgJ/ZBMmjVkqdgYBhsDu90AxdXqFtEdkXA9HYesJ5OqNRYFiCVB3So+Qi0kyD F9qOiaIyZvBHBmOZzvGtDHY8xHTSjGrIOv6ezY7agmG868Bz8vm8jkX7G+ZHzbVQ efg8zvOtgGzQ5F2wuf338m13pYyO84BsUglfwL0y05JhsiZCBlCd8KB6/SOj1Ln+ mXColut5oiixIqPTWxKbUMaT6FLRirNFNMsBXoWVoWRDIHda++gQyLyjCapUe6I7 YmAOQo/NuSk= =ao5d -----END PGP SIGNATURE----- --=-pC/cUfooMLRMhVdnyYus--