Index: client/1.0/neutral/pkgd.eagle ================================================================== --- client/1.0/neutral/pkgd.eagle +++ client/1.0/neutral/pkgd.eagle @@ -180,11 +180,11 @@ # package downloader client? # variable clientDirectory if {![info exists clientDirectory]} then { - set clientDirectory [file dirname $script] + set clientDirectory [file normalize [file dirname $script]] } # # NOTE: This is the HTTP(S) login cookie to use when downloading files # from the package file server. Index: client/1.0/neutral/pkgd.eagle.asc ================================================================== --- client/1.0/neutral/pkgd.eagle.asc +++ client/1.0/neutral/pkgd.eagle.asc @@ -1,18 +1,18 @@ -----BEGIN PGP SIGNATURE----- Version: GnuPG v2 Comment: Eagle Package Repository -iQIcBAABCAAGBQJYVwVLAAoJEFAslq9JXcLZV4UQAKmMmmr7Dt82toNUwCUjo16M -TvqBNC/u4smP6/SRqcJv/vVWwZ6f4t+DBLDKkW6CcWkkZo9/eG4UTNwugWaGxyzv -5M2IG4BYkNAjadXkYyyr778A5MM3rOoCv5Y3M9AQKGgVFBcxZolAmu6ZCKqFdQpZ -BXRI6n6wPFuzPUtG2KVEP4T95Fw+XHZ0w++JMnM+s8a3eOtDTKkrzJhvFl0wQNcS -xbqQKe6yRriWixH7n5E0ZYqNXpK+/eZWFtJKcTGlN/9qJHGdP20rH+e6Deaur0pT -bZ1NEdINdWgFUTJq+trNhD8RGjNKWfxyli8XZkL3DaYHzRm/bwMvsj1b4+2xj4qp -Y3mBngA6aUXQ4BFdkFc/jCDZfORKe+hfUR+OLRwu62f+ACzVH/tzB0ppUYDsFagM -F/rcy4/Gdoe61IQPHTYgT8YWN7WBdmHfoM+8/vhAZe1rc7cBEr0d2qFHMaPAuop+ -ajqV0EOa9hKy7Yv2VIhuEYb724XuT87UHnRMaX/550x+FyAI/1zhhw0E6Uib5vk6 -dFtj8uSJasyxMH5Q4uvzMJsAEmHE68IWv8uImsyWIpOd994gN6DCl486/2/D5bWe -QSrej7PStnTClMIjqtqtsOw7Gr7Kl0uwIHubj1fmhJu0Jq7AsKznD432aZnP1MCG -cR1Wr4EgYSr79vX9Cd6s -=Lcfm +iQIcBAABCAAGBQJYXGyDAAoJEFAslq9JXcLZCjAP/Rdfuu9bvBU3wsT6EjsMhuiX +Yx3Qe4M2gQZGgamLw2MCF4uSc5YP1pO2WR8K8d6C5J5BcOIf0P4Zo1knySsn1dan +RAUHLQ8XDJ+W46rYRuCcO25fdGuAXLFyHjeQEk//Uqq/fHBGhLW7hrYhCM1eR1p2 +HtXr+lZiHxTFVqTDWk35aK5+NYcd9ofpyMe0LidGeuQq0s75E1EbVBy5BfHfROTg +HC9QTcmcJ8sW/5GJ5Tfl12vD8WxK6AUpuk5bORZkX4EqKqWYYaP1myolND9TwXF4 +uWz26qUGCjjRLUF8VOdVQzEvib7SS6rmt/3eg8iU6O0KjFu1ua2QFfPKXVaWsHvw +DxK/r//5ktgDlbk0Fz0Z1qdQNcNG5jyp1CZBHmzuzolj+bjFvMTi2YWVGPAdbj0Z +N70iF+QfK1J7gAdjG8EiVQba3xAEm9pWFX0Qdidoqy83FSgJG//Iu/tzKcessPOl +8gXCYmB1PDlFZq9QdwcYj76cciCU6FQf/xoaWl4ybiNjLz08uLMnHI78q9nuUPVd +zIHNK0XdCfisavUznLd9Ey3SDwBmmY4U6MjPGhTOV51bEZodIa8vyq2r8GjHATJu +Ows0qcN3/ozKHHa8vmGitmCPVBXp4Nc93TM3EvYU/afM1rGleNOqEKhuZhSOfM+s ++Y6oe3TJvwuuXU7SPQ2J +=zWxC -----END PGP SIGNATURE----- Index: client/1.0/neutral/pkgd.eagle.harpy ================================================================== --- client/1.0/neutral/pkgd.eagle.harpy +++ client/1.0/neutral/pkgd.eagle.harpy @@ -19,50 +19,50 @@ None Mistachkin Systems - 041a78ad-def2-468e-93e5-a4187d69b9fc + 94d758a7-976a-4ff2-9d25-c00a7cd7bb11 SHA512 Script - 2016-12-18T21:52:29.3681640Z + 2016-12-23T00:13:56.0371093Z -1.00:00:00 0x9559f6017247e3e2 - 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 Index: client/1.0/neutral/pkgd.eagle.harpy.asc ================================================================== --- client/1.0/neutral/pkgd.eagle.harpy.asc +++ client/1.0/neutral/pkgd.eagle.harpy.asc @@ -1,18 +1,18 @@ -----BEGIN PGP SIGNATURE----- Version: GnuPG v2 Comment: Eagle Package Repository -iQIcBAABCAAGBQJYVwVMAAoJEFAslq9JXcLZAmcQAL6t6rLSpsVOv9oxVowgdcj2 -vMiYFiyXbvzqrZhUlfBsalSyrJe1wBHug9C7oZo081v6zvi5WnA5d1CQ8ukRfTyj -i9Ip15U/QsCvPu9sFclhkfUdncJL59rcLSfMxEBpDJsrfIlcFPhK1BtwvmhGtMAm -7kHPYEeqqOj8GQtXUmLoftb1gpqV9c9e3cXd9hwKxFDma/RE/02wv7t83Sd5Jik/ -4weq2o541CqXyl0Y5z2HYuwDlNOzEw6kG3NRyoU1MwvfgBW9WOyZd4hhRERcMb3g -71ljRtwfq0sbJv6cGMaJIRziewPHCIW8bGjOAnmGqEqag0yh6YNCm7uf7QodF+bo -G/u4MulM0FI0SvTshLCtbsyE/bA3HC9kRpOL6kVLcCw5V42SjlkAzyS5iZMXfxLG -E/icZXXQRNrhTyfILXAbVQqD2X1knw60QaXHpS5YRNd+9PgUPZIf4k2dykvQdtlX -OfFCbXHgxM9kX59DgzBFJF0yIGC9GEHGaglOxlOm838dpNu0Z0MFgsJcOpz0natZ -Ou1g77F485JhlF0mKOakTr09YDguGIl4KiqiDithalzFhx2K1kaygxIjEyXaiwmp -u/n1QjRDnN6mtgOGqK5X1/VFbvBpTpD61gjUde4FAeD/Qcoqbt0++dLhaUjmnVOs -orCqiEuvvHU2Fko25R/0 -=rePc +iQIcBAABCAAGBQJYXGyEAAoJEFAslq9JXcLZuwYQALBmN463PJ9NxMHc3ecSvXW+ +Qx6S/SussBUXJV+88sdcHyhPwUkxJ681qcz/DrTRc1HEkDPiIQElnfw0Sm4OzML7 +mglW7B7EUzLb9o5HqPTA1c/maz8bD6EvuVZiauc7laQWIK5RbZ9/Gzezc0wW+USd +2ZUIn1ByQu0KGgTPWl/b/ubxcMuF2ptjHeMi4BPhKnhIk+V0D/2vgSZ1SmndIpf5 +BBHDJZTp7t49VDcG+hm1hzx05pNAuKuwzd+YDS+dVmiYWW4xpAqbnDWKTprwRjwh +DLxInuEHOmWLnXGoTZ5y/ORgULz8LIC9m9Xrf5jNYWUL4HeDsZkI8YB08bMZrf+U +Ci9hd5QTH/5hnY3+hlQfv3YGc7jeZDVklzwMie9e9nHVE/aO/LWm1Rq2TTO7RoaH +W9zk0EjawYBUJzWPEiCjzEyfvzdWSXgUEsLkPBniyNJBLlVKqUHc/lhKJvkWT6yF +hm8F3az4jWfXebnPihLZajGQtOmWRXjZz2BNMs65gtKRxmKctKLC71RAMtzRENGd +imIjDXnn3fTzrVuuPBqUvfUqBncXHCstH1h98eSGYsshnTL9SIPU2NyHYJ78PvPy +2doTigyoz37JBpuuoXtkfj6mHyzO//zub8UX+k3FBvo2JSie6fiCiLxYkBX9Jyrj +BqqWwmkDVDxg6W76CvJG +=nda7 -----END PGP SIGNATURE----- Index: client/1.0/neutral/pkgr_upload.eagle ================================================================== --- client/1.0/neutral/pkgr_upload.eagle +++ client/1.0/neutral/pkgr_upload.eagle @@ -37,15 +37,24 @@ exit 1 } # # NOTE: This procedure sets up the default values for all configuration - # parameters used by the package uploader client. The script - # argument is the fully qualified path and file name for the script - # being evaluated. + # parameters used by the package uploader client. There are no + # arguments. # - proc setupUploadVars { script } { + proc setupUploadVars {} { + # + # NOTE: This variable must exist and must be the fully qualified path + # of the directory containing this script. + # + variable pkgr_path + + if {![info exists pkgr_path]} then { + error "required namespace variable 'pkgr_path' does not exist" + } + # # NOTE: The project code for the Fossil repository. This will be checked # prior to staging or committing any files. # variable projectCode; # DEFAULT: 9ceada8dbb8678898e5b2c05386e73b3ff2c2dec @@ -53,17 +62,17 @@ if {![info exists projectCode]} then { set projectCode 9ceada8dbb8678898e5b2c05386e73b3ff2c2dec } # - # NOTE: What is the fully qualified path to the directory containing the - # checkout for the package client? + # NOTE: What is the fully qualified path to the directory containing + # package client toolset? # - variable checkoutDirectory; # DEFAULT: + variable scriptDirectory; # DEFAULT: - if {![info exists checkoutDirectory]} then { - set checkoutDirectory [file dirname $script] + if {![info exists scriptDirectory]} then { + set scriptDirectory $pkgr_path } # # NOTE: The command to use when attempting to check for changes prior to # staging files using Fossil. @@ -90,11 +99,21 @@ # prior to staging files using Fossil. # variable fossilInfoCommand; # DEFAULT fossil info ... if {![info exists fossilInfoCommand]} then { - set fossilInfoCommand {fossil info --chdir {${checkoutDirectory}}} + set fossilInfoCommand {fossil info --chdir {${scriptDirectory}}} + } + + # + # NOTE: The regular expression pattern used when attempting to extract + # the root directory for the Fossil checkout. + # + variable fossilInfoLocalRootPattern; # DEFAULT: {^local-root:\s+(.*?)$} + + if {![info exists fossilInfoLocalRootPattern]} then { + set fossilInfoLocalRootPattern {^local-root:\s+(.*?)$} } # # NOTE: The regular expression pattern used when attempting to verify # that the Fossil checkout belongs to the correct project. @@ -133,11 +152,11 @@ # variable fossilAddCommand; # DEFAULT fossil add ... if {![info exists fossilAddCommand]} then { set fossilAddCommand \ - {fossil add --chdir {${checkoutDirectory}} {${fileName}}} + {fossil add --chdir {${targetDirectory}} {${fileName}}} } # # NOTE: The command to use when attempting to commit package files using # Fossil. @@ -167,10 +186,28 @@ if {![info exists verboseMetadataSubmit]} then { set verboseMetadataSubmit false } } + + # + # NOTE: This procedure sets up the default values for all configuration + # parameters used by the package uploader client that require the + # location of the checkout directory. There are no arguments. + # + proc setupCheckoutVars {} { + # + # NOTE: What is the fully qualified path to the root directory of the + # Fossil checkout containing the package client toolset? This + # procedure may raise script errors. + # + variable checkoutDirectory; # DEFAULT: + + if {![info exists checkoutDirectory]} then { + set checkoutDirectory [getCheckoutDirectory] + } + } # # NOTE: This procedure returns a string value, formatted for use within a # script block being processed by the [string map] command. The # value argument is the string value to format. No return value is @@ -532,19 +569,80 @@ [list $uri] [list 20] [list stdout] [list \ [expr {!$verboseMetadataSubmit}]] $options] } } + # + # NOTE: This procedure attempts to query the root directory of the Fossil + # checkout. There are no arguments. An empty string is returned if + # the root directory of the Fossil checkout cannot be determined. + # + proc getCheckoutDirectory {} { + variable fossilInfoCommand + variable fossilInfoLocalRootPattern + variable scriptDirectory + + if {[isEagle]} then { + if {[catch { + eval exec -nocarriagereturns -stdout output -stderr error \ + [subst $fossilInfoCommand] + } result] == 0} then { + set result [appendArgs $output $error] + } else { + return false + } + } else { + if {[catch { + eval exec [subst $fossilInfoCommand] + } result]} then { + return false + } + } + + if {![info exists result] || ![regexp -line -- \ + $fossilInfoLocalRootPattern $result dummy directory]} then { + return "" + } + + return [string trim $directory] + } + + # + # NOTE: This procedure attempts to verify that the root directory of the + # Fossil checkout is present, valid, and is actually a directory. + # There are no arguments. Script errors will be raised if any of + # the checks fail. + # + proc verifyCheckoutDirectory {} { + variable checkoutDirectory + + if {![info exists checkoutDirectory]} then { + error "checkout directory is missing" + } + + if {[string length $checkoutDirectory] == 0} then { + error "checkout directory is invalid" + } + + if {![file isdir $checkoutDirectory]} then { + error [appendArgs \ + "checkout directory \"" $checkoutDirectory \ + "\" is not really a directory"] + } + } + # # NOTE: This procedure attempts to verify that the checkout directory does # not contain any (stray) changes. There are no arguments. Non-zero # is returned if the verification is successful. # proc verifyThereAreNoChanges {} { variable checkoutDirectory variable fossilChangesCommand variable fossilChangesPattern + + verifyCheckoutDirectory if {[isEagle]} then { if {[catch { eval exec -nocarriagereturns -stdout output -stderr error \ [subst $fossilChangesCommand] @@ -573,14 +671,14 @@ # NOTE: This procedure attempts to verify that the checkout directory does # belong to the correct project. There are no arguments. Non-zero # is returned if the verification is successful. # proc verifyThisIsTheCorrectProject {} { - variable checkoutDirectory variable fossilInfoCommand variable fossilInfoProjectCodePattern variable projectCode + variable scriptDirectory if {[isEagle]} then { if {[catch { eval exec -nocarriagereturns -stdout output -stderr error \ [subst $fossilInfoCommand] @@ -609,13 +707,13 @@ # NOTE: This procedure attempts to verify that the checkout directory does # belong to the correct branch. There are no arguments. Non-zero # is returned if the verification is successful. # proc verifyThisIsTheCorrectBranch {} { - variable checkoutDirectory variable fossilInfoCommand variable fossilInfoTagsPattern + variable scriptDirectory if {[isEagle]} then { if {[catch { eval exec -nocarriagereturns -stdout output -stderr error \ [subst $fossilInfoCommand] @@ -647,10 +745,12 @@ # proc changeToTheCorrectBranch {} { variable checkoutDirectory variable fossilUpdateCommand + verifyCheckoutDirectory + if {[isEagle]} then { if {[catch { eval exec -success Success [subst $fossilUpdateCommand] } error]} then { error [appendArgs \ @@ -673,10 +773,12 @@ # # proc stagePackageFiles { language version platform fileNames } { variable checkoutDirectory variable fossilAddCommand + + verifyCheckoutDirectory if {![verifyThereAreNoChanges]} then { error "cannot stage files: there are pending changes" } @@ -690,31 +792,29 @@ if {![verifyThisIsTheCorrectBranch]} then { error "cannot stage files: still on wrong branch" } } - set newFileNames [list] - - foreach fileName $fileNames { - if {![::PackageRepository::createOpenPgpSignature $fileName]} then { - error [appendArgs \ - "cannot stage file \"" $fileName "\": OpenPGP signing failed"] - } - - lappend newFileNames $fileName - lappend newFileNames [appendArgs $fileName .asc] - } - - set relativeFileNames [getRelativeFileNames $newFileNames 2] - - foreach fileName $newFileNames relativeFileName $relativeFileNames { + set targetDirectory [file join \ + $checkoutDirectory $language $version $platform] + + set relativeFileNames [getRelativeFileNames $fileNames 2] + + foreach fileName $fileNames relativeFileName $relativeFileNames { file mkdir [file join \ - $checkoutDirectory $language $version $platform \ - [file dirname $relativeFileName]] + $targetDirectory [file dirname $relativeFileName]] - file copy $fileName \ - [file join $checkoutDirectory $relativeFileName] + set checkoutFileName [file join $targetDirectory $relativeFileName] + + file copy $fileName $checkoutFileName + + if {![::PackageRepository::createOpenPgpSignature \ + $checkoutFileName]} then { + error [appendArgs \ + "could not stage file \"" $fileName \ + "\": OpenPGP signing failed"] + } set fileName $relativeFileName; # NOTE: For [subst]. if {[isEagle]} then { set fileName [::PackageRepository::formatExecArgument $fileName] @@ -745,10 +845,12 @@ # proc commitPackageFiles { package patchLevel language version varName } { variable checkoutDirectory variable fossilCommitCommand variable fossilCommitPattern + + verifyCheckoutDirectory set branch [appendArgs pkg_ $package _ $patchLevel] set comment [appendArgs \ "Add package " $package " v" $patchLevel " for " $language \ @@ -1265,10 +1367,11 @@ # proc setupTkUserInterface {} { variable widgets package require Tk + catch {console show} catch {wm withdraw .}; set toplevel [toplevel .uploader] set widgets(toplevel) $toplevel ########################################################################### @@ -1429,11 +1532,12 @@ ::PackageRepository::maybeReadSettingsFile [info script] # # NOTE: Setup the variables, within this namespace, used by this script. # - setupUploadVars [info script] + setupUploadVars + setupCheckoutVars # # NOTE: Provide the package to the interpreter. # package provide Eagle.Package.Uploader \ Index: client/1.0/neutral/pkgr_upload.eagle.asc ================================================================== --- client/1.0/neutral/pkgr_upload.eagle.asc +++ client/1.0/neutral/pkgr_upload.eagle.asc @@ -1,18 +1,18 @@ -----BEGIN PGP SIGNATURE----- Version: GnuPG v2 Comment: Eagle Package Repository -iQIcBAABCAAGBQJYXFoOAAoJEFAslq9JXcLZhMkQAJZtIZkYABGbmvvDDD+R0RV9 -iskYSLYaXomMUZdpQd1FKHYwK0GrvDx2UsUfpz7MFp723Go82PTxZ8BtPdkTs+dD -dKxRCJXD3zRM9xsmj1tsYdWHnWPpzBS7aJZWaobeuwdOp+7kHU3y2hgfOAjfuuGB -6JI56KLVPjmA48hlguJxs3nNgSBphTZeW1RGA8vaW5087l/qypG4DH5I83FecxJg -yBAdag85arOIVPZqL+pxAGNtf2NUqdGciXiJRyTOMW9/a7PeBgH5p++osN7Q4ZLJ -WX+f6oCrxpcGR7bRlRicWMcDUnIee3bme3D4OR8uPLv/3nlZ5UUeDH95kECreVrT -w9xEFZDgsGb7kpnvCHDdoBKkC+3n/o0pg6Q23z8rpLCNTUbp6UfA+Spq2ST8kNvT -+hws3NIqPTVn5mQGQY1YXQdtiWLtTl7tovp0GRDiLuSiDhV+vCPHjwWcMeR7YdOj -7PtXVAzjms6TSptZXVMEzdyclAo5qqgQuktxkSJ/A32sScPxLq0GHUelVn9VtRkn -Vhdle07fQxVsvpN1CqO9/pjLTJAnqGzydnfLt+doqDdr1oackgsSxROBdh1t/oL0 -a3doJGlzqbHrkVZymdvGVF5zAH21A5PuPMwoOd0kopX2aGN6hJPgobY8vNn3ALdr -XEsEeb9cRyogLstDGJBq -=ebKD +iQIcBAABCAAGBQJYXGyLAAoJEFAslq9JXcLZPWAQAIMhs597RSgvxqPSr+cly9ly +94jryba6xA+sDtK3auL2aMYHCD6cAJn1TbzG+aGslIVvfQB9Os5R4JmH+GLSU7/I +5jhPEDAGoDSFtBOw5Nc7BstqKb2/mVoJte3FX/2xU1xphBo0cWc4lRVAovSTnuXr +O9Wlx9tDV6uKsqQIf/t0vIZc2l85kgnj5xADyoTxVxA4K/1Ehy21QU6EGP/5T28D +X7L0bF0Q50O/UpUgz7QTTbw1emf9Ahz72fzk/mhrH/PO/K87f9zI5Y+vJMxBSYCY +q1h3vJ+u4mZ/9153uK5QHUT7tyjri7hOFd/yNq2fh+nzSr3Lhdqa3mhmBQtVbN1y +K406dUm4lMgzT9NAA44xzo2qM5e69xMt5fwFLMcd9WaFP8gxwpdZkg28GdWqJ0p+ +LHUkvBFZVmp6pifSi7sZBwjUA82SMbx7DcjBgfdv4wVYZi1iZKsZFvFw+AW/AyjA +6abqIsQHB928SfJKGHWzM8JXhGl/JxmyD4varICU5Q4kYqkGscCg9qCybnJFKEY5 +zTmt8XQdkYcMEQMlNmvK212tiS/r8EwlgjkaE9NnSA/2g2PD4nMe1/IS/yOez0eY +TgJ+22d4SLZu2ZZi7wBwPgC9DTY+A8mvzb9lJZJznHVAgZTSm9d8N1jpLg8NsPwK +6ueeyqj51QE3LX+UrRQQ +=ncuN -----END PGP SIGNATURE----- Index: client/1.0/neutral/pkgr_upload.eagle.harpy ================================================================== --- client/1.0/neutral/pkgr_upload.eagle.harpy +++ client/1.0/neutral/pkgr_upload.eagle.harpy @@ -19,50 +19,50 @@ None Mistachkin Systems - 76236cbb-7d78-47c9-a22d-ea0ab7a4cfe7 + c753e05e-94b3-46c6-9637-d398c4848b3a SHA512 Script - 2016-12-22T22:55:52.5244140Z + 2016-12-23T00:14:28.8095703Z -1.00:00:00 0x9559f6017247e3e2 - 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 Index: client/1.0/neutral/pkgr_upload.eagle.harpy.asc ================================================================== --- client/1.0/neutral/pkgr_upload.eagle.harpy.asc +++ client/1.0/neutral/pkgr_upload.eagle.harpy.asc @@ -1,18 +1,18 @@ -----BEGIN PGP SIGNATURE----- Version: GnuPG v2 Comment: Eagle Package Repository -iQIcBAABCAAGBQJYXFoQAAoJEFAslq9JXcLZRmQP/i/Sa/NP1M5809LMqoB4R/Rz -DmyeRvRHkHS4A9C0lGkMjUIawnQ0boYP5vKU1FBPaFWnIzBbED8qZhvH5K+pzf7d -RJ7XXtA151uHZdfVrydB+zMo2QUy39BA4ncXjdiW3CKniNoEJzdLQirN41c6kiGN -3JbdF3eEADJF3YABfD/qCUeAiPYGOxqQd+hezJW7ste3EN0eX2H3mQtU+CTbQIx7 -WM0EcSesrtPIS44OreGu8vhFiTr9cCwwK0WjTeS8i3goaWtXsYao+8g5WK4qVUTV -EkkENNjB60lUNvArbE+BEIvyOzaqs9lV827PyxkeLB1Z0uWO+WVV9eKow9++SaVL -ujRE8O88SInWgZh2bzIDjOI2MUAkYOd29oAxnfkL5hTQfqNWc8SGHNEZNTPyrptw -+brKA7v8yO7CGM9Girdv1QpCQvE3RSx+nDeMLZugpYDIT9ODSlXQWDc5+Knj8+zu -Ydtw8KTNLCqSaPx+GoPBJPccQm/YC+IFmI/i4y9apGETjrocHYtrSJA/DS1rpZNW -SNEd6QgsZpBd9ohTUgRO/c8D37DJDxQH7gC/M0eFhfSqqQOVgSBbAVKEGcEOiTNc -zILYC0H54mkLBj5jrBTn3SnkqkTpFYVegTZhzh+kuf39OocXdxUO22pN0MdgaXJH -5YBgraPu4dkN9s/dOSh9 -=LMEm +iQIcBAABCAAGBQJYXGyNAAoJEFAslq9JXcLZFdgP/imj8lRtavoWbsVhRu2p19Sv +xZYaHTrhFW/V6j7Iprpn9nufeB27jsocKk7hMTQcD+WfH6cTVK9JvvhXKei2fh1C +ayU/eFpdM+bh/O6C0fNHA+KIQK4HVpBQjQQH/dJJNZoj9C5S5bbZcSTrEmf1sQ36 +ahSsTalLSyjQrlw1nTaKsMyWGHrZWKERgPwh5r3L368AvjotdyAc5tVCo72Q1fF1 +rKXR4aVtOzialmrITBQvzGpGmSDCrDkpbhZ8XSPE2fAnp93aWN6jJNHC/Nu9BX85 +yn52+VIocArMuxh1USLEuSXKveQbgzrsX+wkdwY4VbqvQfnUPV74yM6gvJuNFWxQ ++imtptEXCIEUUFIfcMJSfMiT9MXztKPbSTMpjJumoepwRDffho2vZO973fgXAQVX +qmwxZ+a7peTt5/oIJY9nYyuMT7PsfhpfvC9QtZCVk5ELm9JQFjjG3yu+Ut63y52n +qEKC0xxJtfV2Pe2qiWHBn40FTCSVPqeGtDuKcL1DN+OL1iot0neeDcDoAGkEosJt +kL2Yb8K3X53QjF+8Q8wn/2KjcUogM0kJfR7Omhaj0qu7EpJty1E1RmTD2j4vanK1 +7POWcEikZVKe4U7daDDAAAaEsJvDScu+SGk6j2tGFNHuUIRytwAeOrElJuPq3Xsu +e61zVr/Mq2PLsL0ftxWV +=ALy9 -----END PGP SIGNATURE-----