pax_global_header00006660000000000000000000000064132334135710014514gustar00rootroot0000000000000052 comment=ae949f372c018d30c0cc9ec5e3445661fa6568f7 torbrowser-launcher-0.2.9/000077500000000000000000000000001323341357100155335ustar00rootroot00000000000000torbrowser-launcher-0.2.9/.gitignore000066400000000000000000000005461323341357100175300ustar00rootroot00000000000000*.py[cod] # C extensions *.so # Packages *.egg *.egg-info dist deb_dist build eggs parts bin var sdist develop-eggs .installed.cfg MANIFEST # Installer logs pip-log.txt # Unit test / coverage reports .coverage .tox nosetests.xml # Translations *.mo # Mr Developer .mr.developer.cfg .project .pydevproject # vim *.swp .*~ torbrowser-launcher-*.tar.gz torbrowser-launcher-0.2.9/BUILD.md000066400000000000000000000023551323341357100167210ustar00rootroot00000000000000# Building Tor Browser Launcher First, clone the repository: ```sh git clone https://github.com/micahflee/torbrowser-launcher.git cd torbrowser-launcher ``` Then install dependencies, build a package, and install: ### Debian, Ubuntu, Linux Mint, etc. ```sh sudo apt-get install build-essential dh-python python-all python-stdeb python-gtk2 python-twisted python-lzma python-txsocksx gnupg fakeroot xz-utils tor # If you're running an OS that has python-gpg like Ubuntu 17.04+ or Debian 9+, install that too sudo apt install python-gpg ./build_deb.sh sudo dpkg -i deb_dist/torbrowser-launcher_*.deb ``` Optionally you can install `python-pygame` if you want to play a modem sound while Tor Browser is launching. ### Red Hat, Fedora, CentOS, etc. ```sh sudo dnf install python-psutil python-twisted gnupg fakeroot rpm-build python-txsocksx tor pygtk2 python2-gpg ./build_rpm.sh sudo yum install dist/torbrowser-launcher-*.rpm ``` Optionally you can install `pygame` if you want to play a modem sound while Tor Browser is launching. ### Run without installing Install the dependencies: sadly, not all of them are available in virtualenv, so you will need to install (some of) them system-wide. Then, you can run: `TBL_SHARE=share ./torbrowser-launcher` torbrowser-launcher-0.2.9/CHANGELOG.md000066400000000000000000000134111323341357100173440ustar00rootroot00000000000000# Tor Browser Launcher Changelog ## 0.2.9 * Fixed crash issue related to Tor Browser 7.5 changing how the currently installed version number is stored * Updated list of Tor Project dist mirrors * Fixed edge case crash for when stdout isn't writable * Updated AppStream metadata * Updated AppArmor profiles ## 0.2.8 * Update URL to check for latest version, which changed in Tor Browser 7 * Automatically refresh GPG keyring, to prevent signature verification false positives * Improve GnuPG code by using GPGME if available * Updated AppArmor profiles * Added Czech, Hungarian localization ## 0.2.7 * Updated Tor Browser signing key because they added a new subkey and verification was failing * Updated AppArmor profiles * Improved localization, and added Russian ## 0.2.6 * Fixed bug related to fallback to English feature that caused Settings to crash ## 0.2.5 * Fix issue where Tor Browser Launcher failed to launch if currently installed version of Tor Browser was too old * If Tor Browser download isn't available in your language, fallback to English * Avoid re-downloading tarball if it's already present * Verify GnuPG importing keys using status-fd rather than exit codes * Various AppArmor improvements * Removed unused dependency ## 0.2.4 * Fix signature verification bypass attack, reported by Jann Horn (CVE-2016-3180) ## 0.2.3 * Removed certificate pinning to https://www.torproject.org to avoid issues with upcoming certificate change, and hard-coded minimum Tor Browser version in the release * Fix issue with detecting language * Make Tor SOCKS5 proxy configurable, for users not running on 9050 * Improved AppArmor profiles * Added translations * Switched from xpm icons to png icons * Changed "Exit" button to "Cancel" button * New package description ## 0.2.2 * Tor Browser Launcher no longer attempts to auto-update, now that Tor Browser has this feature * System Tor is now an optional dependency * Fix issue where downloads fail because of unicode URLs * Removed window management code that stopped working many releases ago, and removed wmctrl dependency * Removed test code that caused signature verification to happen at the wrong time ## 0.2.1 * Stop using RecommendedTBBVersions and start using more reliable "release" channel XML * Converted settings file from pickle format to JSON * Download tarball signatures to verify, rather than SHA256SUMS and signature * Implemented IPolicyForHTTPS to prevent twisted-related crashes in Debian * Some AppArmor fixes ## 0.2.0 * Fix critical bug with new location of start-tor-browser * Silenced some AppArmor denied events from logs * Print less console output * Remove support for accepting links * Added better support for updating over Tor in Fedora ## 0.1.9 * Added option to disable accepting links, to workaround Firefox/Tor Browser issue ## 0.1.8 * Added new Tor Browser signing key * Fixed removing alpha/beta code due to change in RecommendedTBBVersions syntax * Fixed opening links in TBB if you originally opened TBB without clicking a link ## 0.1.7 * You can now pass URLs into TBL, and set it as your default browser * Hides TBL window before launching TBB * Default mirror switched to https://dist.torproject.org/ * Added AppData file to look better in software centers * Exclude AppArmor profiles in Ubuntu, where they're broken ## 0.1.6 * Updated licensing confusion to just be MIT in all locations * Fixed bug related to TBB 4.0's new folder structure * Updated .desktop files to comply with standards ## 0.1.5 * Split source code into several files * Several AppArmor updates * Prepare for upcoming RecommendedTBBVersion format change * More verbose UI when updating * No longer detaches start-tor-browser as separate process * Temporarily disable AppArmor profiles in Ubuntu ## 0.1.4 * RecommendedTBBVersion URL change * Many AppArmor improvements * Allow installation into a virtualenv ## 0.1.3 * Force installing stable release if available in RecommendedTBBVersions * Removed Mike Perry's signing key and added Erinn Clark's signing key * Fixed AppArmor profiles (thanks to troubadoour) ## 0.1.2 * Updated Dutch translation * Fixed bug with loading mirrors list * Huge refactor of AppArmor profiles * Added OnionShare support to AppArmor profiles * Suppresses output from detached TBB process * Uses freedesktop xdg-user-dirs instead of ~/.torbrowser * Removed all signing keys except Mike Perry's * Made tor and python-txsocksx dependencies to update over Tor by default ## 0.1.1 * Added TBL_SHARE support, to more easily develop without installing systemwide * Modem sound and python-pygame dependency is now optional * Support for updating TBB over Tor using a system Tor * Removed support for stable/alpha preference, forces stable now * Added French translations ## 0.1.0 * Added Polish translations * Version 0.1.0 marks first version in Debian! * Changed GPG release signing key from 5C17616361BD9F92422AC08BB4D25A1E99999697 to 0B1491929806596254700155FD720AD9EBA34B1C ## 0.0.9 * Fixed AppArmor rules that were broken in Ubuntu * Added support for basic RPM packaging * Removed un-used dependencies * Fixed URLs to deal with TBB release filename changes ## 0.0.8 * Removed older code that's no longer used * Updated list of Tor mirrors * Replaced certificate for www.torproject.org post-heartbleed * Fixed URLs to deal with TBB release filename changes ## 0.0.7 * Added AppArmor profiles for torbrowser-launcher and TBB * Removed included libs in favor of adding new Debian package dependencies ## 0.0.6 * Fixed URLs to deal with changes in TBB releases for 3.x ## 0.0.5 * Updated paths because TBB 3.x changed directory structure * mirrors.txt now has local version in /usr/local * Updated TBB signature URL * Made optional modem sound when launching Tor, because it's sooo slow :) * Extra check to make sure the latest version is installed torbrowser-launcher-0.2.9/LICENSE000066400000000000000000000022001323341357100165320ustar00rootroot00000000000000Tor Browser Launcher https://github.com/micahflee/torbrowser-launcher/ Copyright (c) 2013-2017 Micah Lee Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. torbrowser-launcher-0.2.9/README.md000066400000000000000000000027251323341357100170200ustar00rootroot00000000000000# Tor Browser Launcher Tor Browser Launcher is intended to make Tor Browser easier to install and use for GNU/Linux users. You install ```torbrowser-launcher``` from your distribution's package manager and it handles everything else: * Downloads and installs the most recent version of Tor Browser in your language and for your computer's architecture, or launches Tor Browser if it's already installed (Tor Browser will automatically update itself) * Verifies Tor Browser's [signature](https://www.torproject.org/docs/verifying-signatures.html.en) for you, to ensure the version you downloaded was cryptographically signed by Tor developers and was not tampered with * Adds "Tor Browser" and "Tor Browser Launcher Settings" application launcher to your desktop environment's menu * Includes AppArmor profiles to make a Tor Browser compromise not as bad * Optionally plays a modem sound when you open Tor Browser (because Tor is so slow) Tor Browser Launcher is included in Ubuntu, Debian, and Fedora. To install it in any other distribution, see the [build instructions](/BUILD.md). You might want to check out the [security design doc](/security_design.md). ![Tor Browser Launcher screenshot](/screenshot.png) # Installing in Ubuntu If you want to always have the latest version of the `torbrowser-launcher` package before your distribution gets it, you can use my PPA: ```sh sudo add-apt-repository ppa:micahflee/ppa sudo apt-get update sudo apt-get install torbrowser-launcher ``` torbrowser-launcher-0.2.9/apparmor/000077500000000000000000000000001323341357100173545ustar00rootroot00000000000000torbrowser-launcher-0.2.9/apparmor/license.txt000066400000000000000000000030661323341357100215440ustar00rootroot00000000000000TBB AppArmor profiles are based on https://gitorious.org/tbb-apparmor/tbb-apparmor/ Originally written by Radostan Riedel -- Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the names of the copyright owners nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. torbrowser-launcher-0.2.9/apparmor/local/000077500000000000000000000000001323341357100204465ustar00rootroot00000000000000torbrowser-launcher-0.2.9/apparmor/local/torbrowser.Browser.firefox000066400000000000000000000002061323341357100256620ustar00rootroot00000000000000# Site-specific additions and overrides for torbrowser.Browser.firefox. # For more details, please see /etc/apparmor.d/local/README. torbrowser-launcher-0.2.9/apparmor/local/torbrowser.Browser.plugin-container000066400000000000000000000002051323341357100274750ustar00rootroot00000000000000# Site-specific additions and overrides for torbrowser.Browser.firefox. # For more details, please see /etc/apparmor.d/local/README. torbrowser-launcher-0.2.9/apparmor/local/torbrowser.Tor.tor000066400000000000000000000002051323341357100241440ustar00rootroot00000000000000# Site-specific additions and overrides for torbrowser.Browser.firefox. # For more details, please see /etc/apparmor.d/local/README. torbrowser-launcher-0.2.9/apparmor/torbrowser.Browser.firefox000066400000000000000000000071351323341357100246000ustar00rootroot00000000000000#include #include /home/*/.local/share/torbrowser/tbb/{i686,x86_64}/tor-browser_*/Browser/firefox { #include # Uncomment the following lines if you want to give the Tor Browser read-write # access to most of your personal files. # #include # @{HOME}/ r, #dbus, network netlink raw, network tcp, ptrace (trace) peer=@{profile_name}, deny /etc/host.conf r, deny /etc/hosts r, deny /etc/nsswitch.conf r, deny /etc/resolv.conf r, deny /etc/passwd r, deny /etc/group r, deny /etc/mailcap r, deny /etc/machine-id r, deny /var/lib/dbus/machine-id r, /dev/ r, /dev/shm/ r, owner @{PROC}/@{pid}/fd/ r, owner @{PROC}/@{pid}/mountinfo r, owner @{PROC}/@{pid}/stat r, owner @{PROC}/@{pid}/status r, owner @{PROC}/@{pid}/task/*/stat r, @{PROC}/sys/kernel/random/uuid r, owner @{torbrowser_installation_dir}/ r, owner @{torbrowser_installation_dir}/* r, owner @{torbrowser_installation_dir}/.** rwk, owner @{torbrowser_installation_dir}/update.test/ rwk, owner @{torbrowser_home_dir}/.** rwk, owner @{torbrowser_home_dir}/ rw, owner @{torbrowser_home_dir}/** rwk, owner @{torbrowser_home_dir}.bak/ rwk, owner @{torbrowser_home_dir}.bak/** rwk, owner @{torbrowser_home_dir}/*.so mr, owner @{torbrowser_home_dir}/components/*.so mr, owner @{torbrowser_home_dir}/browser/components/*.so mr, owner @{torbrowser_home_dir}/firefox rix, owner @{torbrowser_home_dir}/plugin-container px -> torbrowser_plugin_container, owner @{torbrowser_home_dir}/{,TorBrowser/UpdateInfo/}updates/[0-9]*/updater ix, owner @{torbrowser_home_dir}/{,TorBrowser/UpdateInfo/}updates/0/MozUpdater/bgupdate/updater ix, owner @{torbrowser_home_dir}/TorBrowser/Data/Browser/profiles.ini r, owner @{torbrowser_home_dir}/TorBrowser/Data/Browser/profile.default/ r, owner @{torbrowser_home_dir}/TorBrowser/Tor/tor px, owner @{torbrowser_home_dir}/TorBrowser/Tor/ r, owner @{torbrowser_home_dir}/TorBrowser/Tor/*.so mr, owner @{torbrowser_home_dir}/TorBrowser/Tor/*.so.* mr, /etc/mailcap r, /etc/mime.types r, /usr/share/ r, /usr/share/mime/ r, /usr/share/themes/ r, /usr/share/applications/** rk, /usr/share/gnome/applications/ r, /usr/share/gnome/applications/kde4/ r, /usr/share/poppler/cMap/ r, # Distribution homepage /usr/share/homepage/ r, /usr/share/homepage/** r, /sys/devices/system/cpu/ r, /sys/devices/system/cpu/present r, /sys/devices/system/node/ r, /sys/devices/system/node/node[0-9]*/meminfo r, deny /sys/devices/virtual/block/*/uevent r, # Should use abstractions/gstreamer instead once merged upstream /etc/udev/udev.conf r, /run/udev/data/+pci:* r, /sys/devices/pci[0-9]*/**/uevent r, owner /{dev,run}/shm/shmfd-* rw, # Required for multiprocess Firefox (aka Electrolysis, i.e. e10s) owner /{dev,run}/shm/org.chromium.* rw, # Deny access to DRM nodes, that's granted by the X abstraction, which is # sourced by the gnome abstraction, that we include. deny /dev/dri/** rwklx, # Silence denial logs about permissions we don't need deny /dev/dri/ rwklx, deny @{HOME}/.cache/fontconfig/ rw, deny @{HOME}/.cache/fontconfig/** rw, deny @{HOME}/.config/gtk-2.0/ rw, deny @{HOME}/.config/gtk-2.0/** rw, deny @{PROC}/@{pid}/net/route r, deny /sys/devices/system/cpu/cpufreq/policy[0-9]*/cpuinfo_max_freq r, deny /sys/devices/system/cpu/*/cache/index[0-9]*/size r, # KDE 4 owner @{HOME}/.kde/share/config/* r, # Xfce4 /etc/xfce4/defaults.list r, /usr/share/xfce4/applications/ r, #include } torbrowser-launcher-0.2.9/apparmor/torbrowser.Browser.plugin-container000066400000000000000000000060051323341357100264070ustar00rootroot00000000000000#include #include profile torbrowser_plugin_container { #include # Uncomment the following lines if you don'want the Tor Browser # to have direct access to your sound hardware. You will also # need to remove the "deny" word in the machine-id lines further # bellow. # #include # /etc/asound.conf r, # owner @{PROC}/@{pid}/fd/ r, # owner @{torbrowser_home_dir}/TorBrowser/Data/Browser/profile.default/tmp/mozilla-temp-* rw, deny /etc/host.conf r, deny /etc/hosts r, deny /etc/nsswitch.conf r, deny /etc/resolv.conf r, deny /etc/passwd r, deny /etc/group r, deny /etc/mailcap r, deny /etc/machine-id r, deny /var/lib/dbus/machine-id r, owner @{PROC}/@{pid}/mountinfo r, owner @{PROC}/@{pid}/stat r, owner @{PROC}/@{pid}/status r, owner @{PROC}/@{pid}/task/*/stat r, @{PROC}/sys/kernel/random/uuid r, owner @{torbrowser_home_dir}/*.dat r, owner @{torbrowser_home_dir}/*.manifest r, owner @{torbrowser_home_dir}/*.so mr, owner @{torbrowser_home_dir}/.cache/fontconfig/ rw, owner @{torbrowser_home_dir}/.cache/fontconfig/** rw, owner @{torbrowser_home_dir}/browser/** r, owner @{torbrowser_home_dir}/components/*.so mr, owner @{torbrowser_home_dir}/browser/components/*.so mr, owner @{torbrowser_home_dir}/defaults/pref/ r, owner @{torbrowser_home_dir}/defaults/pref/*.js r, owner @{torbrowser_home_dir}/fonts/ r, owner @{torbrowser_home_dir}/fonts/** r, owner @{torbrowser_home_dir}/omni.ja r, owner @{torbrowser_home_dir}/plugin-container ixmr, owner @{torbrowser_home_dir}/TorBrowser/Data/Browser/profile.default/extensions/*.xpi r, owner @{torbrowser_home_dir}/TorBrowser/Data/Browser/profile.default/tmp/* rw, owner @{torbrowser_home_dir}/TorBrowser/Data/fontconfig/fonts.conf r, owner @{torbrowser_home_dir}/TorBrowser/Tor/ r, owner @{torbrowser_home_dir}/TorBrowser/Tor/*.so mr, owner @{torbrowser_home_dir}/TorBrowser/Tor/*.so.* mr, owner @{torbrowser_home_dir}/Downloads/ rwk, owner @{torbrowser_home_dir}/Downloads/** rwk, /sys/devices/system/cpu/ r, /sys/devices/system/cpu/present r, /sys/devices/system/node/ r, /sys/devices/system/node/node[0-9]*/meminfo r, deny /sys/devices/virtual/block/*/uevent r, # Should use abstractions/gstreamer instead once merged upstream /etc/udev/udev.conf r, /run/udev/data/+pci:* r, /sys/devices/pci[0-9]*/**/uevent r, owner /{dev,run}/shm/shmfd-* rw, # Required for multiprocess Firefox (aka Electrolysis, i.e. e10s) owner /{dev,run}/shm/org.chromium.* rw, # Deny access to DRM nodes, that's granted by the X abstraction, which is # sourced by the gnome abstraction, that we include. deny /dev/dri/** rwklx, # Silence denial logs about permissions we don't need deny /dev/dri/ rwklx, deny @{PROC}/@{pid}/net/route r, deny /sys/devices/system/cpu/cpufreq/policy[0-9]*/cpuinfo_max_freq r, deny /sys/devices/system/cpu/*/cache/index[0-9]*/size r, #include } torbrowser-launcher-0.2.9/apparmor/torbrowser.Tor.tor000066400000000000000000000032021323341357100230520ustar00rootroot00000000000000#include /home/*/.local/share/torbrowser/tbb/{i686,x86_64}/tor-browser_*/{Browser/TorBrowser/,}Tor/tor { #include network netlink raw, network tcp, network udp, /etc/host.conf r, /etc/nsswitch.conf r, /etc/passwd r, /etc/resolv.conf r, owner @{HOME}/.local/share/torbrowser/tbb/{i686,x86_64}/tor-browser_*/{Browser/TorBrowser/,}Tor/tor mr, owner @{HOME}/.local/share/torbrowser/tbb/{i686,x86_64}/tor-browser_*/{Browser/TorBrowser/,}Data/Tor/ rw, owner @{HOME}/.local/share/torbrowser/tbb/{i686,x86_64}/tor-browser_*/{Browser/TorBrowser/,}Data/Tor/* rw, owner @{HOME}/.local/share/torbrowser/tbb/{i686,x86_64}/tor-browser_*/{Browser/TorBrowser/,}Data/Tor/lock rwk, owner @{HOME}/.local/share/torbrowser/tbb/{i686,x86_64}/tor-browser_*/{Browser/TorBrowser/Tor,Lib}/*.so mr, owner @{HOME}/.local/share/torbrowser/tbb/{i686,x86_64}/tor-browser_*/{Browser/TorBrowser/Tor,Lib}/*.so.* mr, # Silence file_inherit logs deny @{HOME}/.local/share/torbrowser/tbb/{i686,x86_64}/tor-browser_*/Browser/{browser/,}omni.ja r, deny @{HOME}/.local/share/torbrowser/tbb/{i686,x86_64}/tor-browser_*/{Browser/TorBrowser/,}Data/Browser/profile.default/.parentlock rw, deny @{HOME}/.local/share/torbrowser/tbb/{i686,x86_64}/tor-browser_*/{Browser/TorBrowser/,}Data/Browser/profile.default/extensions/*.xpi r, deny @{HOME}/.local/share/torbrowser/tbb/{i686,x86_64}/tor-browser_*/{Browser/TorBrowser/,}Data/Browser/profile.default/startupCache/* r, @{PROC}/sys/kernel/random/uuid r, /sys/devices/system/cpu/ r, # OnionShare compatibility /tmp/onionshare/** rw, #include } torbrowser-launcher-0.2.9/apparmor/tunables/000077500000000000000000000000001323341357100211715ustar00rootroot00000000000000torbrowser-launcher-0.2.9/apparmor/tunables/torbrowser000066400000000000000000000002351323341357100233240ustar00rootroot00000000000000@{torbrowser_installation_dir}=@{HOME}/.local/share/torbrowser/tbb/{i686,x86_64}/tor-browser_* @{torbrowser_home_dir}=@{torbrowser_installation_dir}/Browser torbrowser-launcher-0.2.9/build_deb.sh000077500000000000000000000004531323341357100200050ustar00rootroot00000000000000#!/bin/sh VERSION=`cat share/torbrowser-launcher/version` # clean up from last build rm -r deb_dist # build binary package python setup.py --command-packages=stdeb.command bdist_deb # install it echo "" echo "To install, run:" echo "sudo dpkg -i deb_dist/torbrowser-launcher_$VERSION-1_all.deb" torbrowser-launcher-0.2.9/build_rpm.sh000077500000000000000000000005211323341357100200450ustar00rootroot00000000000000#!/bin/sh VERSION=`cat share/torbrowser-launcher/version` # clean up from last build rm -r build dist # build binary package python setup.py bdist_rpm --requires="python-twisted, gnupg, fakeroot, pygtk2, python2-gpg" # install it echo "" echo "To install, run:" echo "sudo dnf install dist/torbrowser-launcher-$VERSION-1.noarch.rpm" torbrowser-launcher-0.2.9/makepot.sh000077500000000000000000000001671323341357100175360ustar00rootroot00000000000000#!/bin/sh cd torbrowser_launcher xgettext --language=Python --from-code=UTF-8 --output=../torbrowser_launcher.pot *.py torbrowser-launcher-0.2.9/po/000077500000000000000000000000001323341357100161515ustar00rootroot00000000000000torbrowser-launcher-0.2.9/po/cs.po000066400000000000000000000157621323341357100171310ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-01-29 21:06+0100\n" "PO-Revision-Date: 2017-01-29 21:33+0100\n" "Language-Team: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Poedit 1.8.11\n" "Last-Translator: Marek Suchánek \n" "Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n" "Language: cs\n" #: __init__.py:49 msgid "Tor Browser Launcher" msgstr "Spouštěč prohlížeče Tor" #: __init__.py:50 msgid "By Micah Lee, licensed under MIT" msgstr "Vytvořil Micah Lee pod licencí MIT" #: __init__.py:51 #, python-brace-format msgid "version {0}" msgstr "verze {0}" #: common.py:108 #, python-brace-format msgid "Error creating {0}" msgstr "Chyba při vytváření {0}" #: common.py:110 common.py:186 #, python-brace-format msgid "{0} is not writable" msgstr "Do {0} není možné zapisovat" #: common.py:183 #, python-brace-format msgid "Cannot create directory {0}" msgstr "Nelze vytvořit adresář {0}" #: common.py:193 msgid "Creating GnuPG homedir" msgstr "Vytváří se domovská složka GnuGPG" #: common.py:240 #, python-format msgid "Could not import key with fingerprint: %s." msgstr "Selhal import klíče s otiskem: %s." #: common.py:245 msgid "Not all keys were imported successfully!" msgstr "Ne všechny klíče byly importovány úspěšně!" #: launcher.py:75 msgid "Downloading over Tor" msgstr "Stahování přes Tor" #: launcher.py:77 msgid "" "The python-txsocksx package is missing, downloads will not happen over tor" msgstr "Chybí balíček python-txsocksx, stahování se neuskuteční přes tor" #: launcher.py:87 msgid "Downloading and installing Tor Browser for the first time." msgstr "Poprvé se stahuje a instaluje Prohlížeč Tor." #: launcher.py:89 msgid "" "Your version of Tor Browser is out-of-date. Downloading and installing the " "newest version." msgstr "" "Vaše verze Prohlížeče Tor je zastaralá. Stáhne se a nainstaluje nejnovější " "verze." #: launcher.py:114 msgid "Tor Browser" msgstr "Prohlížeč Tor" #: launcher.py:210 msgid "Start" msgstr "Spustit" #: launcher.py:220 settings.py:195 msgid "Cancel" msgstr "Zrušit" #: launcher.py:255 launcher.py:270 launcher.py:274 launcher.py:412 msgid "Downloading" msgstr "Stahuje se" #: launcher.py:262 msgid "Latest version: {}" msgstr "Nejnovější verze: {}" #: launcher.py:265 msgid "Error detecting Tor Browser version." msgstr "Chyba při zjišťování verze Prohlížeče Tor." #: launcher.py:281 launcher.py:479 msgid "Verifying Signature" msgstr "Ověřuje se podpis" #: launcher.py:285 msgid "Extracting" msgstr "Extrahuje se" #: launcher.py:289 msgid "Running" msgstr "Běží" #: launcher.py:293 msgid "Starting download over again" msgstr "Stahování se spouští znovu" #: launcher.py:307 launcher.py:309 launcher.py:311 launcher.py:353 msgid "Download Error:" msgstr "Chyba stahování:" #: launcher.py:307 launcher.py:374 msgid "You are currently using a non-default mirror" msgstr "Používáte právě nevýchozí zrcadlo" #: launcher.py:307 launcher.py:374 msgid "Would you like to switch back to the default?" msgstr "Přejete si přepnout zpět na výchozí?" #: launcher.py:309 msgid "Would you like to try the English version of Tor Browser instead?" msgstr "Přejete si místo toho zkusit anglickou verzi Prohlížeče Tor?" #: launcher.py:326 msgid "Downloaded" msgstr "Staženo" #: launcher.py:374 msgid "DNS Lookup Error" msgstr "Chyba při vyhledávání DNS" #: launcher.py:383 launcher.py:385 msgid "" "The SSL certificate served by https://www.torproject.org is invalid! You may " "be under attack." msgstr "" "Certifikát SSL získaný od https://www.torproject.org je neplatný! Možná je " "na vás veden útok." #: launcher.py:383 msgid "Try the download again using Tor?" msgstr "Zkusit stahování znovu pomocí Toru?" #: launcher.py:392 #, python-brace-format msgid "Error connecting to Tor at {0}" msgstr "Chyba při připojování k Toru na {0}" #: launcher.py:395 #, python-brace-format msgid "" "Error starting download:\n" "\n" "{0}\n" "\n" "Are you connected to the internet?" msgstr "" "Chyba při spouštění stahování:\n" "\n" "{0}\n" "\n" "Jste připojeni k internetu?" #: launcher.py:494 msgid "" "SIGNATURE VERIFICATION FAILED!\n" "\n" "You might be under attack, or there might just be a networking problem. " "Click Start try the download again." msgstr "" "SELHALO OVĚŘENÍ PODPISU!\n" "\n" "Možná je na vás veden útok, anebo může jít pouze o síťovou závadu. Pro nové " "stažení klikněte na Spustit." #: launcher.py:504 msgid "Installing" msgstr "Instaluje se" #: launcher.py:526 #, python-brace-format msgid "Tor Browser Launcher doesn't understand the file format of {0}" msgstr "Spouštěč prohlížeče Tor nerozumí formátu souboru {0}" #: launcher.py:548 msgid "" "The version of Tor Browser you have installed is earlier than it should be, " "which could be a sign of an attack!" msgstr "" "Verze prohlížeče Tor, kterou máte nainstalovanou, je ranější, než by měla " "být, což může značit útok!" #: launcher.py:568 msgid "The python-pygame package is missing, the modem sound is unavailable." msgstr "Chybí balíček python-pygame, zvuk modemu není dostupný." #: launcher.py:598 msgid "Downloading Tor Browser Bundle over again." msgstr "Znovu se stahuje balík Prohlížeče Tor." #: settings.py:41 msgid "Tor Browser Launcher Settings" msgstr "Nastavení Spouštěče prohlížeče Tor" #: settings.py:71 msgid "Download over system Tor" msgstr "Stáhnout přes systémový Tor" #: settings.py:73 msgid "" "This option is only available when using a system wide Tor installation." msgstr "" "Tato možnost je dostupná, pouze pokud se používá systémová instalace Toru." #: settings.py:75 msgid "This option requires the python-txsocksx package." msgstr "Tato možnost vyžaduje balíček python-txsocksx." #: settings.py:89 msgid "Play modem sound, because Tor is slow :]" msgstr "Přehrávat zvuk modemu, jelikož je Tor pomalý :]" #: settings.py:101 msgid "This option requires python-pygame to be installed" msgstr "Tato možnost vyžaduje nainstalovaný python-pygame" #: settings.py:106 msgid "Force downloading English version of Tor Browser" msgstr "Vynutit stažení anglické verze Prohlížeče Tor" #: settings.py:119 msgid "Tor server" msgstr "Server Toru" #: settings.py:131 msgid "Status: Installed" msgstr "Stav: Nainstalováno" #: settings.py:133 msgid "Status: Not Installed" msgstr "Stav: Nenainstalováno" #: settings.py:142 msgid "Reinstall Tor Browser" msgstr "Přeinstalovat Prohlížeč Tor" #: settings.py:151 msgid "Install Tor Browser" msgstr "Nainstalovat Prohlížeč Tor" #: settings.py:162 msgid "Mirror" msgstr "Zrcadlo" #: settings.py:186 msgid "Save & Exit" msgstr "Uložit a ukončit" torbrowser-launcher-0.2.9/po/fr.po000066400000000000000000000145131323341357100171240ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2016-12-02 15:16+0400\n" "PO-Revision-Date: 2016-12-02 15:16+0400\n" "Last-Translator: Andrey Kunitsyn \n" "Language-Team: French\n" "Language: fr\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Poedit 1.8.7.1\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" #: __init__.py:49 msgid "Tor Browser Launcher" msgstr "Tor Browser Launcher" #: __init__.py:50 msgid "By Micah Lee, licensed under MIT" msgstr "" #: __init__.py:51 #, python-brace-format msgid "version {0}" msgstr "" #: common.py:108 #, python-brace-format msgid "Error creating {0}" msgstr "Erreur lors de la création de {0}" #: common.py:110 common.py:186 #, python-brace-format msgid "{0} is not writable" msgstr "Impossible d'écrire {0}" #: common.py:183 #, python-brace-format msgid "Cannot create directory {0}" msgstr "Impossible de créer le dossier {0}" #: common.py:193 msgid "Creating GnuPG homedir" msgstr "Creation du dossier GnuPG" #: common.py:240 #, python-format msgid "Could not import key with fingerprint: %s." msgstr "" #: common.py:245 msgid "Not all keys were imported successfully!" msgstr "" #: launcher.py:75 msgid "Downloading over Tor" msgstr "" #: launcher.py:77 msgid "" "The python-txsocksx package is missing, downloads will not happen over tor" msgstr "" "Le paquet python-txsocks est manquant, les téléchargements ne se feront pas " "sur Tor." #: launcher.py:87 msgid "Downloading and installing Tor Browser for the first time." msgstr "" #: launcher.py:89 msgid "" "Your version of Tor Browser is out-of-date. Downloading and installing the " "newest version." msgstr "" #: launcher.py:114 msgid "Tor Browser" msgstr "Tor Browser" #: launcher.py:210 msgid "Start" msgstr "Démarrer" #: launcher.py:220 settings.py:195 msgid "Cancel" msgstr "Annuler" #: launcher.py:255 launcher.py:270 launcher.py:274 launcher.py:412 msgid "Downloading" msgstr "Téléchargement" #: launcher.py:262 msgid "Latest version: {}" msgstr "" #: launcher.py:265 msgid "Error detecting Tor Browser version." msgstr "" #: launcher.py:281 launcher.py:479 msgid "Verifying Signature" msgstr "Vérification de la signature" #: launcher.py:285 msgid "Extracting" msgstr "Décompression" #: launcher.py:289 msgid "Running" msgstr "Exécution" #: launcher.py:293 msgid "Starting download over again" msgstr "Télécharger à nouveau" #: launcher.py:307 launcher.py:309 launcher.py:311 launcher.py:353 msgid "Download Error:" msgstr "Erreur de téléchargement:" #: launcher.py:307 launcher.py:374 msgid "You are currently using a non-default mirror" msgstr "Vous utilisez actuellement un miroir non-défaut" #: launcher.py:307 launcher.py:374 msgid "Would you like to switch back to the default?" msgstr "Voulez-vous revenir à la valeur par défaut?" #: launcher.py:309 msgid "Would you like to try the English version of Tor Browser instead?" msgstr "" #: launcher.py:326 msgid "Downloaded" msgstr "Téléchargé" #: launcher.py:374 msgid "DNS Lookup Error" msgstr "Erreur de type DNS Lookup" #: launcher.py:383 launcher.py:385 msgid "" "The SSL certificate served by https://www.torproject.org is invalid! You may " "be under attack." msgstr "" "Le certificat SSL servi par https://www.torproject.org n'est pas valide! " "Vous pouvez être l'objet d'une attaques." #: launcher.py:383 msgid "Try the download again using Tor?" msgstr "Essayez le télécharger à nouveau l'utilisation de Tor?" #: launcher.py:392 #, python-brace-format msgid "Error connecting to Tor at {0}" msgstr "" #: launcher.py:395 #, python-brace-format msgid "" "Error starting download:\n" "\n" "{0}\n" "\n" "Are you connected to the internet?" msgstr "" "Erreur de téléchargement lors du démarrage:\n" "\n" "{0}\n" "\n" "Êtes-vous connecté à l'Internet?" #: launcher.py:494 msgid "" "SIGNATURE VERIFICATION FAILED!\n" "\n" "You might be under attack, or there might just be a networking problem. " "Click Start try the download again." msgstr "" "LA VÉRICATION DE LA SIGNATURE A ÉCHOUÉE\n" "\n" "Vous pourriez être l'objet d'une attaque, ou il ce peut être un problème de " "réseau. Click Start try the download again." #: launcher.py:504 msgid "Installing" msgstr "Installation en cours" #: launcher.py:526 #, python-brace-format msgid "Tor Browser Launcher doesn't understand the file format of {0}" msgstr "Tor Browser Launcher ne comprend pas le format du fichier {0}" #: launcher.py:548 msgid "" "The version of Tor Browser you have installed is earlier than it should be, " "which could be a sign of an attack!" msgstr "" #: launcher.py:568 msgid "The python-pygame package is missing, the modem sound is unavailable." msgstr "" "Le paquet python-pygame est manquant, le sound de modem est indisponible." #: launcher.py:598 msgid "Downloading Tor Browser Bundle over again." msgstr "Téléchargement du Tor Browser Bundle une nouvelle fois." #: settings.py:41 msgid "Tor Browser Launcher Settings" msgstr "Tor Browser Launcher configurations" #: settings.py:71 msgid "Download over system Tor" msgstr "" #: settings.py:73 msgid "" "This option is only available when using a system wide Tor installation." msgstr "" "Cette option n'est disponible qu'en conjonction avec une installation " "système de Tor." #: settings.py:75 msgid "This option requires the python-txsocksx package." msgstr "Cette option requiert le paquet python-txsocksx" #: settings.py:89 msgid "Play modem sound, because Tor is slow :]" msgstr "Faire jouer un son de modem, car Tor est lent :]" #: settings.py:101 msgid "This option requires python-pygame to be installed" msgstr "Cette option requiert le paquet python-pygame" #: settings.py:106 msgid "Force downloading English version of Tor Browser" msgstr "" #: settings.py:119 msgid "Tor server" msgstr "" #: settings.py:131 msgid "Status: Installed" msgstr "" #: settings.py:133 msgid "Status: Not Installed" msgstr "" #: settings.py:142 msgid "Reinstall Tor Browser" msgstr "" #: settings.py:151 msgid "Install Tor Browser" msgstr "" #: settings.py:162 msgid "Mirror" msgstr "Miroir" #: settings.py:186 msgid "Save & Exit" msgstr "Enregistrer et quitter" torbrowser-launcher-0.2.9/po/hu.po000066400000000000000000000160501323341357100171270ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-02-16 00:17+0100\n" "PO-Revision-Date: 2017-02-16 00:55+0100\n" "Language-Team: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Poedit 1.8.8\n" "Last-Translator: Barcza Károly \n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "Language: hu_HU\n" #: __init__.py:49 msgid "Tor Browser Launcher" msgstr "Tor böngésző indító" #: __init__.py:50 msgid "By Micah Lee, licensed under MIT" msgstr "Micah Lee által MIT licenc alatt" #: __init__.py:51 #, python-brace-format msgid "version {0}" msgstr "verzió {0}" #: common.py:108 #, python-brace-format msgid "Error creating {0}" msgstr "Hiba a(z) {0} létrehozásakor" #: common.py:110 common.py:186 #, python-brace-format msgid "{0} is not writable" msgstr "{0} nem írható" #: common.py:183 #, python-brace-format msgid "Cannot create directory {0}" msgstr "Nem sikerült a(z) {0} létrehozása" #: common.py:193 msgid "Creating GnuPG homedir" msgstr "GnuPG könyvtár létrehozása" #: common.py:240 #, python-format msgid "Could not import key with fingerprint: %s." msgstr "Nem lehetett importálni a kulcsot ujjlenyomattal: %s." #: common.py:245 msgid "Not all keys were imported successfully!" msgstr "" #: launcher.py:75 msgid "Downloading over Tor" msgstr "Letöltés Tor-on keresztül" #: launcher.py:77 msgid "" "The python-txsocksx package is missing, downloads will not happen over tor" msgstr "" "A python-txsocksx csoamag nem található, a letöltés nem fog megtörténni a " "tor-on" #: launcher.py:87 msgid "Downloading and installing Tor Browser for the first time." msgstr "Tor böngésző letöltése és telepítése első alkalommal." #: launcher.py:89 msgid "" "Your version of Tor Browser is out-of-date. Downloading and installing the " "newest version." msgstr "" "A Tor böngésző verziója elavult. Töltsük le és telepítsük a legfrissebb " "változatot." #: launcher.py:114 msgid "Tor Browser" msgstr "Tor böngésző" #: launcher.py:210 msgid "Start" msgstr "Elindítás" #: launcher.py:220 settings.py:195 msgid "Cancel" msgstr "Megszakít" #: launcher.py:255 launcher.py:270 launcher.py:274 launcher.py:412 msgid "Downloading" msgstr "Letöltés" #: launcher.py:262 msgid "Latest version: {}" msgstr "Legújabb változat: {}" #: launcher.py:265 msgid "Error detecting Tor Browser version." msgstr "Hiba a Tor böngésző verzió felsimerésekor" #: launcher.py:281 launcher.py:479 msgid "Verifying Signature" msgstr "Aláírás ellenőrzése" #: launcher.py:285 msgid "Extracting" msgstr "Kibontás" #: launcher.py:289 msgid "Running" msgstr "Fut" #: launcher.py:293 msgid "Starting download over again" msgstr "Újra letöltés indítása" #: launcher.py:307 launcher.py:309 launcher.py:311 launcher.py:353 msgid "Download Error:" msgstr "Hiba a letöltésben:" #: launcher.py:307 launcher.py:374 msgid "You are currently using a non-default mirror" msgstr "Jelenleg használt tükörszerver nem az alapértelmezett" #: launcher.py:307 launcher.py:374 msgid "Would you like to switch back to the default?" msgstr "Valóban szeretnéd visszaváltani alapértelmezettre?" #: launcher.py:309 msgid "Would you like to try the English version of Tor Browser instead?" msgstr "Ehelyett megpróbálod a Tor böngésző angol változatát ?" #: launcher.py:326 msgid "Downloaded" msgstr "Letöltve" #: launcher.py:374 msgid "DNS Lookup Error" msgstr "DNS feloldási hiba" #: launcher.py:383 launcher.py:385 msgid "" "The SSL certificate served by https://www.torproject.org is invalid! You may " "be under attack." msgstr "" "A ttps://www.torproject.org által adott SSL tanúsítvány érvénytelen! Lehet, " "hogy támadás alatt vagy." #: launcher.py:383 msgid "Try the download again using Tor?" msgstr "Megpróbálod újra a Tor letöltését?" #: launcher.py:392 #, python-brace-format msgid "Error connecting to Tor at {0}" msgstr "Hiba a Tör csatlakozáskor itt {0}" #: launcher.py:395 #, python-brace-format msgid "" "Error starting download:\n" "\n" "{0}\n" "\n" "Are you connected to the internet?" msgstr "" "Sikertelen a letöltés indítása:\n" "\n" "{0}\n" "\n" "Csatlakozva vagy az internethez?" #: launcher.py:494 msgid "" "SIGNATURE VERIFICATION FAILED!\n" "\n" "You might be under attack, or there might just be a networking problem. " "Click Start try the download again." msgstr "" "ALÁÍRÁS ELLENŐRZÉSE SIKERTELEN\n" "\n" "Lehet, hogy támadás alatt vagy, vagy előfordulhat egy hálózati probléma is. " "Kattints az indításra az újbóli letöltéshez." #: launcher.py:504 msgid "Installing" msgstr "Telepítés.." #: launcher.py:526 #, python-brace-format msgid "Tor Browser Launcher doesn't understand the file format of {0}" msgstr "Tor böngésző indító nem érti a(z) {0} fájl formátumot." #: launcher.py:548 msgid "" "The version of Tor Browser you have installed is earlier than it should be, " "which could be a sign of an attack!" msgstr "" "A Tor böngésződ verziója egy korábbi verzió mint amilyennek lennie kellene, " "ami lehet egy támadás jele!" #: launcher.py:568 msgid "The python-pygame package is missing, the modem sound is unavailable." msgstr "A python-pygame csomag nem található, a modem hang nem elérhető." #: launcher.py:598 msgid "Downloading Tor Browser Bundle over again." msgstr "Tör böngészőcsomag letöltése újra." #: settings.py:41 msgid "Tor Browser Launcher Settings" msgstr "Tör böngésző indító beállítások" #: settings.py:71 msgid "Download over system Tor" msgstr "Letöltés rendszer Tor-on keresztül" #: settings.py:73 msgid "" "This option is only available when using a system wide Tor installation." msgstr "" "Ehhez az opció akkor elérhető amikor használatban van a rendszer szintű Tor." #: settings.py:75 msgid "This option requires the python-txsocksx package." msgstr "Ehhez az opcióhoz szükséges a python-txsocksx csomag" #: settings.py:89 msgid "Play modem sound, because Tor is slow :]" msgstr "Modem hang lejátszása, mert a Tor lassú :]" #: settings.py:101 msgid "This option requires python-pygame to be installed" msgstr "Ehhez az opcióhoz szükséges hogy a python-pygame telepítve legyen" #: settings.py:106 msgid "Force downloading English version of Tor Browser" msgstr "Kényszerítse a Tor angol változatának letöltését" #: settings.py:119 msgid "Tor server" msgstr "Tor-szerver" #: settings.py:131 msgid "Status: Installed" msgstr "Állapot: Telepített" #: settings.py:133 msgid "Status: Not Installed" msgstr "Állapot: Nincs telepítve" #: settings.py:142 msgid "Reinstall Tor Browser" msgstr "Tor böngésző úratelepítése" #: settings.py:151 msgid "Install Tor Browser" msgstr "Tor-böngésző telepítése" #: settings.py:162 msgid "Mirror" msgstr "Tükrözés" #: settings.py:186 msgid "Save & Exit" msgstr "Mentés és kilépés" torbrowser-launcher-0.2.9/po/nl.po000066400000000000000000000134521323341357100171270ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2016-12-02 17:28+0400\n" "PO-Revision-Date: 2016-12-02 17:40+0400\n" "Language-Team: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Poedit 1.8.7.1\n" "Last-Translator: Andrey Kunitsyn \n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "Language: nl\n" #: __init__.py:49 msgid "Tor Browser Launcher" msgstr "Tor Browser Launcher" #: __init__.py:50 msgid "By Micah Lee, licensed under MIT" msgstr "Door Micah Lee, onder MIT licensie" #: __init__.py:51 #, python-brace-format msgid "version {0}" msgstr "versie {0}" #: common.py:108 #, python-brace-format msgid "Error creating {0}" msgstr "Fout bij maken van {0}" #: common.py:110 common.py:186 #, python-brace-format msgid "{0} is not writable" msgstr "{0} is niet schrijfbaar" #: common.py:183 #, python-brace-format msgid "Cannot create directory {0}" msgstr "Kan map niet maken: {0}" #: common.py:193 msgid "Creating GnuPG homedir" msgstr "Aanmeken GnuPG map" #: common.py:240 #, python-format msgid "Could not import key with fingerprint: %s." msgstr "" #: common.py:245 msgid "Not all keys were imported successfully!" msgstr "" #: launcher.py:75 msgid "Downloading over Tor" msgstr "" #: launcher.py:77 msgid "" "The python-txsocksx package is missing, downloads will not happen over tor" msgstr "" #: launcher.py:87 msgid "Downloading and installing Tor Browser for the first time." msgstr "" #: launcher.py:89 msgid "" "Your version of Tor Browser is out-of-date. Downloading and installing the " "newest version." msgstr "" #: launcher.py:114 msgid "Tor Browser" msgstr "Tor Browser" #: launcher.py:210 msgid "Start" msgstr "Start" #: launcher.py:220 settings.py:195 msgid "Cancel" msgstr "Annuleren" #: launcher.py:255 launcher.py:270 launcher.py:274 launcher.py:412 msgid "Downloading" msgstr "Bezig met downloaden" #: launcher.py:262 #, fuzzy msgid "Latest version: {}" msgstr "Laatste versie: {}" #: launcher.py:265 msgid "Error detecting Tor Browser version." msgstr "" #: launcher.py:281 launcher.py:479 msgid "Verifying Signature" msgstr "Handtekening verifiëren" #: launcher.py:285 msgid "Extracting" msgstr "Uitpakken" #: launcher.py:289 msgid "Running" msgstr "Uitvoeren" #: launcher.py:293 msgid "Starting download over again" msgstr "" #: launcher.py:307 launcher.py:309 launcher.py:311 launcher.py:353 msgid "Download Error:" msgstr "Download fout:" #: launcher.py:307 launcher.py:374 msgid "You are currently using a non-default mirror" msgstr "" #: launcher.py:307 launcher.py:374 msgid "Would you like to switch back to the default?" msgstr "" #: launcher.py:309 msgid "Would you like to try the English version of Tor Browser instead?" msgstr "" #: launcher.py:326 msgid "Downloaded" msgstr "Gedownload" #: launcher.py:374 msgid "DNS Lookup Error" msgstr "" #: launcher.py:383 launcher.py:385 msgid "" "The SSL certificate served by https://www.torproject.org is invalid! You may " "be under attack." msgstr "" "Het SSL certificaat geserveerd door https://www.torproject.org is ongeldig! " "Je bent misschien onder aanval." #: launcher.py:383 msgid "Try the download again using Tor?" msgstr "Probeer de download opnieuw via Tor?" #: launcher.py:392 #, python-brace-format msgid "Error connecting to Tor at {0}" msgstr "" #: launcher.py:395 #, python-brace-format msgid "" "Error starting download:\n" "\n" "{0}\n" "\n" "Are you connected to the internet?" msgstr "" "Fout bij het downloaden:\n" "\n" "{0}\n" "\n" "Bent u verbonden met het internet?" #: launcher.py:494 msgid "" "SIGNATURE VERIFICATION FAILED!\n" "\n" "You might be under attack, or there might just be a networking problem. " "Click Start try the download again." msgstr "" "HANDTEKENING VERIFICATIE MISLUKT!\n" "\n" "U wordt misschien aangevallen of gewoon een netwerk probleem. Klik op Start " "om het downloaden nogmaals te proberen." #: launcher.py:504 msgid "Installing" msgstr "Installeren" #: launcher.py:526 #, python-brace-format msgid "Tor Browser Launcher doesn't understand the file format of {0}" msgstr "" #: launcher.py:548 msgid "" "The version of Tor Browser you have installed is earlier than it should be, " "which could be a sign of an attack!" msgstr "" #: launcher.py:568 msgid "The python-pygame package is missing, the modem sound is unavailable." msgstr "" #: launcher.py:598 msgid "Downloading Tor Browser Bundle over again." msgstr "Tor Browser Bundle opnieuw aan het downloaden." #: settings.py:41 msgid "Tor Browser Launcher Settings" msgstr "Tor Browser Launcher Instellingen" #: settings.py:71 msgid "Download over system Tor" msgstr "" #: settings.py:73 msgid "" "This option is only available when using a system wide Tor installation." msgstr "" #: settings.py:75 msgid "This option requires the python-txsocksx package." msgstr "Voor deze optie is het python-txsocksx pakket nodig." #: settings.py:89 msgid "Play modem sound, because Tor is slow :]" msgstr "Speel modem geluid, omdat Tor langzaam is :]" #: settings.py:101 msgid "This option requires python-pygame to be installed" msgstr "Voor deze optie moet python-pygame geïnstalleerd zijn" #: settings.py:106 msgid "Force downloading English version of Tor Browser" msgstr "" #: settings.py:119 msgid "Tor server" msgstr "" #: settings.py:131 msgid "Status: Installed" msgstr "" #: settings.py:133 msgid "Status: Not Installed" msgstr "" #: settings.py:142 msgid "Reinstall Tor Browser" msgstr "" #: settings.py:151 msgid "Install Tor Browser" msgstr "" #: settings.py:162 msgid "Mirror" msgstr "" #: settings.py:186 msgid "Save & Exit" msgstr "Opslaan & afsluiten" torbrowser-launcher-0.2.9/po/pl.po000066400000000000000000000130101323341357100171170ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2016-12-02 15:24+0400\n" "PO-Revision-Date: 2016-12-02 15:35+0400\n" "Language-Team: Polish\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Poedit 1.8.7.1\n" "Last-Translator: AreYouLoco? \n" "Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 " "|| n%100>=20) ? 1 : 2);\n" "Language: pl\n" #: __init__.py:49 msgid "Tor Browser Launcher" msgstr "Launcher Przeglądarki Tora" #: __init__.py:50 msgid "By Micah Lee, licensed under MIT" msgstr "" #: __init__.py:51 #, python-brace-format msgid "version {0}" msgstr "wersja {0}" #: common.py:108 #, python-brace-format msgid "Error creating {0}" msgstr "Błąd przy tworzeniu {0}" #: common.py:110 common.py:186 #, python-brace-format msgid "{0} is not writable" msgstr "{0} jest tylko do odczytu" #: common.py:183 #, python-brace-format msgid "Cannot create directory {0}" msgstr "Nie można stworzyć {0}" #: common.py:193 msgid "Creating GnuPG homedir" msgstr "Tworzenie katalogu głównego GnuPG" #: common.py:240 #, python-format msgid "Could not import key with fingerprint: %s." msgstr "" #: common.py:245 msgid "Not all keys were imported successfully!" msgstr "" #: launcher.py:75 msgid "Downloading over Tor" msgstr "" #: launcher.py:77 msgid "" "The python-txsocksx package is missing, downloads will not happen over tor" msgstr "" #: launcher.py:87 msgid "Downloading and installing Tor Browser for the first time." msgstr "" #: launcher.py:89 msgid "" "Your version of Tor Browser is out-of-date. Downloading and installing the " "newest version." msgstr "" #: launcher.py:114 msgid "Tor Browser" msgstr "Przeglądarka Tora" #: launcher.py:210 msgid "Start" msgstr "" #: launcher.py:220 settings.py:195 msgid "Cancel" msgstr "" #: launcher.py:255 launcher.py:270 launcher.py:274 launcher.py:412 msgid "Downloading" msgstr "Pobieranie" #: launcher.py:262 msgid "Latest version: {}" msgstr "" #: launcher.py:265 msgid "Error detecting Tor Browser version." msgstr "" #: launcher.py:281 launcher.py:479 msgid "Verifying Signature" msgstr "Weryfikowanie podpisu" #: launcher.py:285 msgid "Extracting" msgstr "Rozpakowywanie" #: launcher.py:289 msgid "Running" msgstr "Uruchamianie" #: launcher.py:293 msgid "Starting download over again" msgstr "Ponowne rozpoczynanie pobierania" #: launcher.py:307 launcher.py:309 launcher.py:311 launcher.py:353 msgid "Download Error:" msgstr "Błąd pobierania:" #: launcher.py:307 launcher.py:374 msgid "You are currently using a non-default mirror" msgstr "" #: launcher.py:307 launcher.py:374 msgid "Would you like to switch back to the default?" msgstr "" #: launcher.py:309 msgid "Would you like to try the English version of Tor Browser instead?" msgstr "" #: launcher.py:326 msgid "Downloaded" msgstr "Pobrano" #: launcher.py:374 msgid "DNS Lookup Error" msgstr "" #: launcher.py:383 launcher.py:385 msgid "" "The SSL certificate served by https://www.torproject.org is invalid! You may " "be under attack." msgstr "" #: launcher.py:383 msgid "Try the download again using Tor?" msgstr "" #: launcher.py:392 #, python-brace-format msgid "Error connecting to Tor at {0}" msgstr "" #: launcher.py:395 #, python-brace-format msgid "" "Error starting download:\n" "\n" "{0}\n" "\n" "Are you connected to the internet?" msgstr "" "Błąd przy rozpoczynaniu pobierania:\n" "\n" "{0}\n" "\n" "Czy jesteś podłąćzony do internetu?" #: launcher.py:494 msgid "" "SIGNATURE VERIFICATION FAILED!\n" "\n" "You might be under attack, or there might just be a networking problem. " "Click Start try the download again." msgstr "" "WERYFIKACJA PODPISU NIEUDANA!\n" "\n" "Możesz być atakowany, lub mogą być to tylko problemy z połączeniem. Naciśnij " "Start aby pobrać ponownie." #: launcher.py:504 msgid "Installing" msgstr "Instalowanie" #: launcher.py:526 #, python-brace-format msgid "Tor Browser Launcher doesn't understand the file format of {0}" msgstr "" #: launcher.py:548 msgid "" "The version of Tor Browser you have installed is earlier than it should be, " "which could be a sign of an attack!" msgstr "" #: launcher.py:568 msgid "The python-pygame package is missing, the modem sound is unavailable." msgstr "" #: launcher.py:598 msgid "Downloading Tor Browser Bundle over again." msgstr "Ponowne pobieranie Tor Browser Bundle" #: settings.py:41 msgid "Tor Browser Launcher Settings" msgstr "" #: settings.py:71 msgid "Download over system Tor" msgstr "" #: settings.py:73 msgid "" "This option is only available when using a system wide Tor installation." msgstr "" #: settings.py:75 msgid "This option requires the python-txsocksx package." msgstr "" #: settings.py:89 msgid "Play modem sound, because Tor is slow :]" msgstr "" #: settings.py:101 msgid "This option requires python-pygame to be installed" msgstr "" #: settings.py:106 msgid "Force downloading English version of Tor Browser" msgstr "" #: settings.py:119 msgid "Tor server" msgstr "" #: settings.py:131 msgid "Status: Installed" msgstr "" #: settings.py:133 msgid "Status: Not Installed" msgstr "" #: settings.py:142 msgid "Reinstall Tor Browser" msgstr "" #: settings.py:151 msgid "Install Tor Browser" msgstr "" #: settings.py:162 msgid "Mirror" msgstr "" #: settings.py:186 msgid "Save & Exit" msgstr "" torbrowser-launcher-0.2.9/po/ru.po000066400000000000000000000200071323341357100171360ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2016-12-02 15:14+0400\n" "PO-Revision-Date: 2016-12-02 17:52+0400\n" "Last-Translator: Andrey Kunitsyn \n" "Language-Team: Russian\n" "Language: ru_RU\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Poedit 1.8.7.1\n" "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" "%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" #: __init__.py:49 msgid "Tor Browser Launcher" msgstr "Программа запуска Tor Browser" #: __init__.py:50 msgid "By Micah Lee, licensed under MIT" msgstr "Написана Micah Lee и распространяется по лицензии MIT" #: __init__.py:51 #, python-brace-format msgid "version {0}" msgstr "версия {0}" #: common.py:108 #, python-brace-format msgid "Error creating {0}" msgstr "Ошибка создания {0}" #: common.py:110 common.py:186 #, python-brace-format msgid "{0} is not writable" msgstr "Нельзя записать в {0}" #: common.py:183 #, python-brace-format msgid "Cannot create directory {0}" msgstr "Нельзя создать каталог {0}" #: common.py:193 msgid "Creating GnuPG homedir" msgstr "Создание домашнего каталога GnuPG" #: common.py:240 #, python-format msgid "Could not import key with fingerprint: %s." msgstr "Не удалось импортировать ключ с отпечатком: %s." #: common.py:245 msgid "Not all keys were imported successfully!" msgstr "Не все ключи были успешно импортированы!" #: launcher.py:75 msgid "Downloading over Tor" msgstr "Загружать через Tor" #: launcher.py:77 msgid "" "The python-txsocksx package is missing, downloads will not happen over tor" msgstr "" "Пакет python-txsocks отсутствует, загрузка не будет производиться через Tor" #: launcher.py:87 msgid "Downloading and installing Tor Browser for the first time." msgstr "Загрузка и установка Tor Browser в первый раз" #: launcher.py:89 msgid "" "Your version of Tor Browser is out-of-date. Downloading and installing the " "newest version." msgstr "Ваша версия Tor Browser устарела. Загрузка и установка новой версии." #: launcher.py:114 msgid "Tor Browser" msgstr "Tor Browser" #: launcher.py:210 msgid "Start" msgstr "Запуск" #: launcher.py:220 settings.py:195 msgid "Cancel" msgstr "Отмена" #: launcher.py:255 launcher.py:270 launcher.py:274 launcher.py:412 msgid "Downloading" msgstr "Загрузка" #: launcher.py:262 msgid "Latest version: {}" msgstr "Последняя версия: {}" #: launcher.py:265 msgid "Error detecting Tor Browser version." msgstr "Ошибка сверки версии Tor Browser." #: launcher.py:281 launcher.py:479 msgid "Verifying Signature" msgstr "Сверка подписи" #: launcher.py:285 msgid "Extracting" msgstr "Распаковка" #: launcher.py:289 msgid "Running" msgstr "Запуск" #: launcher.py:293 msgid "Starting download over again" msgstr "Начинать загрузку снова" #: launcher.py:307 launcher.py:309 launcher.py:311 launcher.py:353 msgid "Download Error:" msgstr "Ошибка загрузки:" #: launcher.py:307 launcher.py:374 msgid "You are currently using a non-default mirror" msgstr "Вы используете нестандартное зеркало" #: launcher.py:307 launcher.py:374 msgid "Would you like to switch back to the default?" msgstr "Вы бы хотели вернуться к стандартному?" #: launcher.py:309 msgid "Would you like to try the English version of Tor Browser instead?" msgstr "Вы хотели бы вместо этого попробовать английскую версию Tor Browser?" #: launcher.py:326 msgid "Downloaded" msgstr "Загружено" #: launcher.py:374 msgid "DNS Lookup Error" msgstr "Ошибка запроса DNS" #: launcher.py:383 launcher.py:385 msgid "" "The SSL certificate served by https://www.torproject.org is invalid! You may " "be under attack." msgstr "" "SSL-сертификат находящейся на https://www.torproject.org недействителен! Вы " "можете быть атакованы." #: launcher.py:383 msgid "Try the download again using Tor?" msgstr "Загрузить снова через Tor?" #: launcher.py:392 #, python-brace-format msgid "Error connecting to Tor at {0}" msgstr "Ошибка подключения к Tor через {0}" #: launcher.py:395 #, python-brace-format msgid "" "Error starting download:\n" "\n" "{0}\n" "\n" "Are you connected to the internet?" msgstr "" "Ошибка при запуске загрузки:\n" "\n" "{0}\n" "\n" "Вы подключены к сети?" #: launcher.py:494 msgid "" "SIGNATURE VERIFICATION FAILED!\n" "\n" "You might be under attack, or there might just be a networking problem. " "Click Start try the download again." msgstr "" "ОШИБКА СВЕРКИ ПОДПИСИ!\n" "\n" "Вы можете бы быть под атакой, или имеют место проблемы с сетью. Нажмите " "кнопку Пуск и попробуйте снова." #: launcher.py:504 msgid "Installing" msgstr "Установка" #: launcher.py:526 #, python-brace-format msgid "Tor Browser Launcher doesn't understand the file format of {0}" msgstr "Программа запуска Tor Browser не понимает формат файла {0}" #: launcher.py:548 msgid "" "The version of Tor Browser you have installed is earlier than it should be, " "which could be a sign of an attack!" msgstr "" "Вы установили новую версию Tor Browser раньше, чем это должно быть. Это " "может быть атакой!" #: launcher.py:568 msgid "The python-pygame package is missing, the modem sound is unavailable." msgstr "Пакет python-pygame не найден, звуки модема недоступны." #: launcher.py:598 msgid "Downloading Tor Browser Bundle over again." msgstr "Загрузка Tor Browser Bundle снова." #: settings.py:41 msgid "Tor Browser Launcher Settings" msgstr "Настройка программы запуска Tor Browser" #: settings.py:71 msgid "Download over system Tor" msgstr "Скачать через Tor" #: settings.py:73 msgid "" "This option is only available when using a system wide Tor installation." msgstr "Эта опция доступна только при установки Tor в систему." #: settings.py:75 msgid "This option requires the python-txsocksx package." msgstr "Эта опция требует пакет python-txsocksx." #: settings.py:89 msgid "Play modem sound, because Tor is slow :]" msgstr "Играть звуки модема, если Tor слишком медленный :]" #: settings.py:101 msgid "This option requires python-pygame to be installed" msgstr "Эта опция требует установленный python-pygame" #: settings.py:106 msgid "Force downloading English version of Tor Browser" msgstr "Загружать только английскую версию Tor Browser" #: settings.py:119 msgid "Tor server" msgstr "Сервер Tor" #: settings.py:131 msgid "Status: Installed" msgstr "Статус: установлен" #: settings.py:133 msgid "Status: Not Installed" msgstr "Статус: не установлен" #: settings.py:142 msgid "Reinstall Tor Browser" msgstr "Переустановить Tor Browser" #: settings.py:151 msgid "Install Tor Browser" msgstr "Установить Tor Browser" #: settings.py:162 msgid "Mirror" msgstr "Зеркало" #: settings.py:186 msgid "Save & Exit" msgstr "Сохранить и выйти" torbrowser-launcher-0.2.9/ppa_release.sh000077500000000000000000000014151323341357100203530ustar00rootroot00000000000000#!/bin/sh # This script pushes updates to my Ubuntu PPA: https://launchpad.net/~micahflee/+archive/ppa # More info: https://help.launchpad.net/Packaging/PPA/Uploading # # If you want to use it, you'll need your own ~/.dput.cf. Here's mine: # # [ppa] # fqdn = ppa.launchpad.net # method = ftp # incoming = ~micahflee/ubuntu/ppa/ # login = anonymous # allow_unsigned_uploads = 0 VERSION=`cat share/torbrowser-launcher/version` # Make a source pacakge rm -rf deb_dist python setup.py --command-packages=stdeb.command sdist_dsc # Sign it cd deb_dist/torbrowser-launcher-$VERSION dpkg-buildpackage -S #dpkg-buildpackage -S -pqubes-gpg-client-wrapper -k927F419D7EC82C2F149C1BD1403C2657CD994F73 cd .. # Push it to the ppa dput ppa torbrowser-launcher_$VERSION-1_source.changes cd .. torbrowser-launcher-0.2.9/requirements.txt000066400000000000000000000011721323341357100210200ustar00rootroot00000000000000# the hashes in this requirements file can be used by peep. # sha256: UNMM7nB3D9RNt86kIcsvt1ryR8OhzVSIXAazCnyF3SM Parsley==1.2 # sha256: 9OuUqrPqnuzznO9G6Ht0J2XPDBnb5UT8XKIh5wBqdQ8 txsocksx==1.13.0.1 # sha256: vf2WGsIhb1xlsH8sOl5RFvZxO4wc8HbEABDGSBDSaWM Twisted==14.0.0 # sha256: kcunt818uC9vTgI_53-U3D30rlKH_VXe8hSNwjLQx9o zope.interface==4.1.1 # Note: PyGObject is also required, but it is not installable using pip. To # install torbrowser-launcher in a virtualenv, you'll need to create the # virtualenv with --system-site-packages and install PyGObject somehow. On # Debian you can get it from the python-gobject-2 package. torbrowser-launcher-0.2.9/screenshot.png000066400000000000000000004573601323341357100204350ustar00rootroot00000000000000PNG  IHDRnEbKGD pHYs+tIME *^jc IDATxw|yWqD'vJ),Lr%q\RiN\[)oI8N׶\ؒ-Ŗ"5KbH;H ݝ+k;~>ۛݝ<mٍX\L׮[Zq tV2|rL2Gռ _幏V93}y|mk1*9--d7$.K^KϟYz ?AUHV]0*ݮ ]vT^;Wz1LGe]%'/Uщ(-U.}BLh#>ԫ\2~ѧgJ x Ze$3UVE,v^d_d.%JbB^2<&=) |Uw^i|)fVW֧)G)zy]T<=-'3B>@?Wh<$̝e)'zd z7ݙnK15y ,ܺB59*65N:[`2Ϝ@gQH78-dfQTfw}KOXU>eW O~oƫ2r|9/ifNku*w+LrΔY "-^W4 :\jZ HW:: sO!rϥt^JYq]=XY&tދ!'O&+/kwIqvr&H'm'o/H򮦡;X*wpnĄqL&'V L =9ˇD_TεQh֙vbFi7#Ux/S&|z%;e_S&bR:Y/\dQL+)gέAtވ!stj">Y Th&_~{xZnV KLsrz2r<*`9^W *Kcs?suQ tbL=wXx*nfHJ9W2P,ۚB ɞ=Stv/Xk&u]EJVb DpY_{ RեOOX=V^ةt:绥˱8%hu?FgL ]M>S*T.Up K8@~u7']YtmM]B-eչ7l@yKs𬡨ξ.3\-NĝS1[㝜WuvORGݓNwG*o`UT u,*m±炦`?͝۞3^6D}!\Ao3 zYR]p=(%.BY75 *tm/ZS=?Lzbreb@*{_Jiy'n(`ϬU9#'\('U\VYV̱*yl:{kZB]r1t4(mחp;TV;PԉbXt9H{tib>˰NyXr`e T*X̔ 7e)Ș@)_ 'WFR=L6[믦d%I\byg2^<ʅzW#+E&WJgUfn(h]ks iO3Lfz2VyWպx/Q(?BW[K'D.(ל5y*GdU MAbo =R9.^7=\T GT5KȓNܩU<-/lqd™E*Ffp*8j8ٵ]IS[/Lr+ 3T6Rt2qZuUb`KL[KeT܉̔>5:;bYMs[yyay zi'o>W)/be6/.gb]FyzB1J3=]f*b$Όҋ9 w5GREL=LU=ɥ+U|tpb;ehBJ9"Xع܉Gkwag ԜIRZOڃ*XTȪ FJM(Ut"aBЛŪk׹].::`KU勽{42=IԤgq6!=LҐJ N.;vǶl& q4x1(3Ho65-Ky[8!   ZVʄSYk!kͼmws*,ϗ,t>*b}}-UyMYU&u~T7NbF K 1   \6j>{U|2OrWLXUL Jdz=cnÓ%ӤEt 3gaF%rͫ k60m*ҡ-'+YMYb153b>CرQUQ*(MƣxC?z!#D#h' PTynFAAzBd~jͼ~qŵ/%ۢ c,R 4iii̙^|>cUc;>64*HC{$tWq=4: g 7su$OiA–GcO3=] 8ɘ#8Eh/xN$8 /QeTP_(<@:-, DQinI['%̱>ulĶ\WP8{ƕq}g'|fmsXvY0r_$@Z[&?m 0i^M }Oh`|jme\GmЛ}4۟:D4/ny?chd5׳fDRgxx~2B>M0ǽ]e&*sJmY@ eϳā.Bʏ_;i{>5;WpFcqvi 30t._φ% KhcD1F PC*dO:PLN|e{hl.E`;`#fS-wv3 R⾰dx'qz.\`0]0s 'ks*G{1 Qh.ex`3V[X|;S̀k-WO= \,z>:,"|˙5O?ɑQPKׅ8Uxe:Q{'|m<E${&NLLjxlqf`NEr eU\H!PUOWp.p/c'8a s7\kh{axE=u*H]@q?'i/p\pz9AEo&?A65=k 8;XLӼv\v}x 8})0&#WkcAu?/>0åWH4VLp,0B4W14 2Cc}F1?Pê71cϟB$NY 솛'9=^K   3,G9Ird/5AaXGPAAA<Լ˭{ЛŇ2da Wa}$`֖|ha+YʡOVfGے:'fg\}x93 KkcquR`08 D–;όP`#ffzz8sMm[I+ P[H E} J54e*Цo#8,{+O5tD8e 2GP[+0~0F@m18zvհeYV%ȑ3H5^c=91 U* 0ʑ.QAAfϊ[}RZ\t&6iS>i!abqGz=UJZp*"{Aw,ԭx7t whu&:3%mlkNǸO˚x'8z(&~67+,g* qzΠe&^i9x3C]Q+6iF^`SW/'|<ԮW.kNaDYFx4z,碝,Fv꒱N4l*`37^o6ęxliLo`~ TМN;Wp!<( ȸ WQQz<óQBA/H/Q0(Mb|1 R  KI짝ܠTN8zb_tyKaq0Mx^n0',NOp̗G#w(=$gy^Mx0q"sq*6'@Max$Nљg[sz   L7p P*˼BiP@}s9b~b}7Khǡ:ǃeDB)P2/AAAA~1o`BE}7 0uFgUdžR1@rPa`\AAA@k Jev8Ks4Φ[k %\\gO^   0BYI]r錘݅ܽΤ   Y8W7ˉS24k    {wW[Ձ˵u(ҩMAAAAXΣu?*f_s8    BJ㕚Pd3-T/   c,[;C²8ZkL$HS^2x^,B)a5fք{AAA%;ż5i!H$7׼6Ass ~׋cd}ȑtI-鎣I$D"8}4۷m?/zEAAAPܨA ӿ58wοtC~Z[E,gk=V^R*H$2VKq^hx?E)E A/  b>%*(zh4F(Tnڄm8%VmlNؐMKJZg}k3޶mni߿!јh   da$3"5D5_o17#dt;u>-Z%]g[ҟ8Ϭ#  ` q&<@,ӟK'OZd1 IDATy눵IԱHtǓ"mWJ1o^g"AAMCv\]FYb[ܜY??VM-  ‹  /-5 |K%, n5ўv]3AxJN"{vJwTӉpm>53Ke{ I>=\kX`! ˺&o3}hlAAa$.˼ʒZ+k%}<xx;?5w~մz]uAĦQw7|!ؽg*vS8Y5LX[m06}Ϟ=]={d&ڵkygK{C:Rf %aY$, ˊJo(  Eo~j!aY1cnVPm.y\˿;w-=0qb״WۼiAe _q{ yxUN7cVϏ >|xQ򲻿,7T |4.\pqOxt3KVf/9~]26oXSq?'@bo>y<5>>[6A>O}?;D[[m\8P:6x'|܌xYu{"[ߗRAA.!Q9v/NJX464겼y{nOX|+Yx xoj6x5Wü;_4WP:s4]{_~o޹$?i(Lzӫ?S焲/$2L 9Os[w~w- 3‘]AAϫS"I=}7G8}o{|+YtTmmmWR+S;ye^ͬ^%o2_x '  +W;sΙ!eQ__O0yw{wT{q0^7~~M`kNxB7[Wkcc~p3}uT{iotV/o#zO=əP+7t0-sҟ(#X:Y ]e)ŚĎ)~7Ԥ꺊uksϼdz>;Ẇ?S(_"8N>$hkk66YTX"sYi5%a  e㳭*ft,fEYj-i1ݿ'y|J -!Fr%OX-1Y,uqM :V/=a`6zy KjbALɓLXZs궖fgKau#t5+jHzx,tz-*n^e?=fVyQ(q+QOB   QFT9P(3%:ʻ #~y=Nm>xˮrDשpwԇ?I 壑q/ss֖IG>EbGN y5' a;()f{V%{Y3|"AA U:yJQ1o%,Xd)a`vf9xI }g ?0o\_ i3ȓ{ehWyTRxΰs(e4oN!{LQV{ cv.ū fN>K\tBt$ĵ{{ `-*C &([MLLh&_gg?gFK_њ??ܹs _җ2ǧ'܁ҟ ijj~<~_R4 [ɀw^'vwAAAP%* +Am]-s3ȧv xvSvExǖXEX7eKuRtGNex/{~r?>m*4j>k2_ss-Ƈ&F-l#l^\>wL6lC,y]O tH8wPWW˹'h٢|6xD"/nİ;D  *#卂yʹά'Xb%@ #X mE, {G\@F$ [w7~6s2>o^o]M^(Z;>_[?P5綥A֠t?{S`VѴ`5j=(x?{ ld;ead[M'S_ n4{^޸$ Xrvd=vկfma*41bJ Ug3Ը  p1^48IFUƌ;.;I }>;eY"-\uRJa(& O%}NaO[sI{l4gǣx)IٔNlې{k:w,^X,u|9bhǃv^w,ŞN֏#AA2CLqh̤ӽbb$0>a5|+2Epw\1cے/>[iLBA"RdY>LUU'  Gz<*FYߕ X,N²?BPF-k&w.ﻤKlKO z۶3"}S% G'$,kJ   \ΨzxCs۬ԻEx,gxx|/YLz2/^t5ea'tIItp'kk\g?W ڣ   S\gاqp4weRHĻDH$,֭Hp#88-Ls9.{'缒.-=Y>ce,sLW>?Ų,B`JAAavQhx^\ ?{i+{,gdt!n}嫹_N"Ȉ\a`I[Ӣ%^8r>N:ٞ}[ ij曹[^#b    / S2]}v:f>ZU2vqB_ֶ6֭[ǚ5WԔ%ӂ>Wฅdn{[3K[ ĉpowH楏IOI__wb׮ck   \rC{3[J<|dx)H$Yr׶=ٕƽ%-1M5!A{AAA1ʈy #^)PZzk zgY kdgR*r?,|J}&{KlOj0<#=Fv1GMFAA᥋RX" ŭ,KYa[feL,E.RW]E}m 43۟Gc sl/5aZ&  KYTT:Kehsۚlo0 |>>jlf`pCǺiA0AA%ls/g*Sg"ݩtlN/ˋX<=VWj 2]G<ʠ0.3,l/;ں   Rx8m   |*=fyG4&Hx 2 lK̻ɶODIT8NeaW;PpڞKC]5>I B/ K ٵiqScǺ (7L6$r%׼1~8{lkN % ѓ/)AA~}ihC$2>1HD m⥊JDZ>0 ^Lz/PQ_[]y .քT 7\AAٮ'/5-?6A*,4Aq>/@χR/-?9}<\+s0+ί-c4۷oga,ٳ={bݜdLhc#ݽ?~-4Hb^T?@WW@l+֚H$ƒ>ȇ>)g]@Qhi{p|ۣ Dp.nZDR䓠(}ycQ>o~^ãWO O36lU! }YΜ& zXbEٕP W+zLww7cÆ Z G`Νtww*!o>zzzfĹslݻ¦cAM$O߿_ugDyr׳xZwIvMUU{y^:0wx@Jq=áDzi͟)jYy o{H$~҆n{Ӕϫ(̬h~FWv@ s|=t?@FC^㉯[7D8>^|^\;>~ǹM|5Wz+XPe9s*LI<k^ /(ñ¡ãck.njkkZh"FGGa47o;wP(Woo/Oٲe `0c]!/ x4ƃ|H,҅\{ jŒ>،p8%4770}qz)\OcP襏^s.<n :3zp>j1m[7h6mj21_K1;%-U#Q>?MkXwv5]musg[r3rCFGbÝෟ3buOwc01wMwnO?EuʣE~Y<Ξ=a$ת9, CkMmM 6m*_pZZZe``'Ny:wk׮ybŋX͛ikk`yh߿x<Μ9sشiSźw^z),rʌUq~i9hrbb˖-\y8î]ػw/hP(ĭJSSضMcc#6m5aǎ۷X,FCC_=|^ ^8<補8q侠OOp뭷p’S1$=|I1Yo\{c,bXGa3'SZ+oSe8'O9˅s[y͕a gӻW{Op! q]rءDl@޴Z/m;''H,n5k&WJ}{7~*6L+}]@_-OG/￉}Ѭw:ɣNp?9!׭3&߿+2:7%^Wy?Amw2\/EM4]~Sѹ/~@sssYy9SJ}1N>Muu5ifϬwxґN()0ZkN>M$)GUU/႟̦Ml߾￟;@ @GGz+~ӧOm6ZZZXp!Zk=Jmm-[lqZO{n6nHKK dڵkZcxwOgzyyӛޔPuz^ihho&HsLҢz!^]]]VǏ<뮣gr+bjkctuu1>>Nmmғe``g  KOOwyg?O48v FǶ=gh8{,y>FGGio/ojÜ>xEԘ9uլz QJW Աn]Ganly^DGO2\[t Nx͢/纖xD,&a)׭Jsb(G+`ժUm<Ȗ-[27o̷-줱1#@̙áCf…Y¼s'w^6luʔvijjx an2ha*g5)Z73=PXkjj2e3gNfr-wH$‘#G1SkHog9wܼvŊ~& rwp}dɒȑ#/*FZSʤݸ*npՌyժU={g/^~d7&è]-/G[Gb+W]ɼ:oҐ9tlyP@1}i'kba52'ȅC@0`0͙uRl]א>=oZﴇ8~s[ԣN7?Һu,]ʅ}Zka54\J= Gbb;Z87[#p4Mx"֭][Q>m|EXt x䶀F9άpiuf¥N6J>g(bh(a9tuuutww8A3VX|9K.g宻bݺulذlt]ISGeǎ ²I,m{RYʞxhooɓض]V/:-ӥ[0dMrߥ5,Yv~tRV^Л~& lܸrIZ[[aҥlܸq~GǸ84L}m Vޮ.jv}G8ƶ,;vZ:2_w,Hyٝw(LzZ{  ;zΨj8c1G*P6jduupj̦&Xe_NmU.Zk~=}}_图ip{ t 䮢7+J%=G~`w$׆m| >1h}б'{5}4;{2"N nK_2'O" rmUGo2>WaZ388E:EZi>h$F_\xv/_o߾ ;hnnguʦirWl2vɶmXhQfb֭n1{|A/_͛x˞1+u3+uS-Tͥ=Nc{Z1S4y_ϩSؽ{7s\s ׯ/ن +"q?~`0^;:ع xbe5gƊ~zؿ?}}}q… ٱch￟׾ecYMh[v5w{݋ngpؔ}-fUxpjܲ*C+CTT6Jg Bno#FkpAGpW-{QU%r)tOA>|(#t{">޺3v ZZ}ubl;y_3R1j'Ab 8ŋ|^R;io !ݷ;=qV儾GGѣ6ȔS/ERY_NcM7;Rv=%jesqɤh ;n msؾDg_4Kڵ--zY HOKBWՒDFhh(cǎeh}MMMDTUeϞ=7ݻ|0L׳rJTU%** H޽Ybl}::[lyyy(BSSu3ӇKiIII455_ߺ޿~wt: N8[}j֭[t/44=LWF|r4M#--F:Ѳ8, *UUU_Bqh%%%;n%<,3_|Xy B=&&S.f4՗}e>5j= [Lg=TZ #B2*zDz.BN:q2W~1?q 4Tc͚F*?7s3xLO#dld&&mڷo?֮]KeUAAABC_CZf3 ?d=/ZEbDSS?aXp㞒$Mu|L&֮]QU\C\\ǏgY}i7nF|0aB@a^QƌCPP˖-H(?0a~-C1j(h2VѣGիYbQQQ/3Ѳcٲe[;8餓t^_Bqzr_ٲʪSHKNd>.w ;w٦aňn +@xRc_ 6tN1- zT#ǐ'aL_˂?3w?1hC"~_X!( dK?>Q]_OhpC3 y?slD]}a&L-VKlGJ('dVNO t>,~]įBgN; McroX MCk/c{6xغu+ őzƍgӦM$%'3d`zMLLwPv ϼvmaM+il@Q9AGܽRA!_~;;΢7'7ڵk)@4e~BL}ItMM ܹ222۷oB!O?d≓v42 4h8x87zuu|Q^lAzCd;;〃i۲4b^V)h!BF}ow>}hOyq`0ͻ{wѽ&Pc-ᾱUw9 M$'D3~DB0B!GîA޽]in8_i4Iݕ!(J2Q&3qt:U%DDlg|d !B!TAzVJ;w̃^Q@4+KN%-)8) !B!QO4 2{{ն> ڼK!B!8^VGHvLJ2xݘrZ߶ȏX[=q}^o]ܔځ~y}K34tX"mɟX*:J| 6`c63KuKi 55g Vur*6u{mß}ò?_ |ա@@{Y-ezЙ#cGu3EZKa~>K}<>ty[-x&?N?xs|@dRVi x~?VxFӬN)X^a3Hk}ss3AAz+xHKEU)=qbAe電n͝F/#\gvĥoB'!{lƇO=ŎHɿѼotu8H+쎄c!5>b/VfBSmm>Z 7^& _iPخn u;X{|O66>0嬳9w|PLħ^#zpmwnBC9:}z~]z 86naȞ)_ùS'7A5IZ0ks_{2z@JZ&()S$#oߐ[]lj x끇fw,'yص~=E8XVFѡr/&3bLnȍAβ?wrR4(w>tGqeij(?#V^e]+̠va~Kxy.H`ͺڱ 84>&fy7b 6/4۟lC8B~,Y!,}8v)Sl¼?>~w_EIJx(NL mg 7y?^eVÊ_%YbG{[JhvJହ߮`we̿q(F5=s!v >fcimocOk"SGYWwVȠiqͩ}q eԸ,d@󞯹ȺYf]vˣgne0Gs,<9??uqsw0:u+z{_Mi`Ir9CZ=۾/+۫501;qbc:.GTUro[ }D.o[&yucؽ~߻ ߳禧vc2>~6Afv~n7Y_|r5VЦF:Qp+u=m#Cf? oGr˳gxpE\~=kl}ś7qp,N:޺a~cm?ގ?XΡqUt-kxy{#tp~V^yp;cټf* bze_/bZ{xcޟ׫D˙W\no,Yߧyw6QvU;u?2e^`۪4g%sI-vc>}9_-eG>"˅[x{v7ƶJ+BIYYm}'&>]Pp70cLym&믿.N la /r׳7`UfDfٰb3UMu^ɀk3ɗH` AS:IC8fNC埾ɻ!c5 2ճyzq}uB=ȿ13n ر]C4/f 鼌-VM{Ro^770rsF>Տ彾Osy`U(k]L>#̑=5VbTaK#T.8Bi`Bs U:"_oNL/ygylnAs\fYF7p%T'Fyؙ۟]iMl_<2\+ cXOy=n-n@ IDAT<1 Ƹhs-[ɺ3ȈׁʙI&9:ƥٿ'>|]oix}^j7Fc;f_i1~0=Ʒ}cȟz^v|8xh5l^ $rLNy<zq%QW2%7w4YOyɮA붟I|jm*Djw~n_.$lGkD>殨`\KY nCHC +Ü{P3#'Z.[W>*^$?3Bjٱz=3\ Y|2_%Sw|,%аXT'E4_ kd;w͌q#͋\VAhbPVlۡ5k~>DZ2PuyRSnУ`!9)?Xذj/AZ O6yY&nB]yϹ`-Y/-L˲k%㦛opg!3f 2"tf==ߋ|0onjOK'S%1!G *{Ҹ $w1Spޗ >HS,Chf;+w-bIaWJ^~玍Fz\V7O[2CD^Gߖ?!n83 `-ϧ:A zY\<gX>0tP6'~+Z̒&95h+$WMI%;mwǫDcz9n1MM <ʪR81 r/~uk+]Q댷i L]a#mcb):Viy|SI)c#3lfkRjepeQzho:߷LS]gy%מlw'o#G'8pY{#G}_Vrq1 ;sBƅ٘gXgH?n2>l[u~YOmP}R!md]y5=پ!lo ԏrp/CQ>;\F/,dCxJooiAq$H#DFnsk [%sÌw#ĠՄ^:c6o R^mސҟtk [-6dؐ dȐ(7ɗd#Z?T1ζ_d_߯}62m68_[ ҺPOiV3${}ULOq.`v۴뫡autfA9YڱLFFJr9IǢmeyB%٘:*8feI8rN[KC4 A,{Prˮ(<E쓓,n&i䓓:5|uuwg_O߷S\SLMD[ 6-0cO+).)"72w ΂yFxzfv6ֳ(4G0dh $5&eQDeu=2]Oas#ķA +7<u4E$AS%UM( ! 6Vc::TgWyDgLZ_IlcYYb&[O~y,Æќ+G鯬/.A5Ayh@pNw-ǜ'2*;<ڟ˗vn9eu9K?bxŠVŜʔ.-.}{&J(F:uͺTCw`ۨiuz=۾VNISu Op$; ^*]ce1ӡ8仑?ۧgyEcʃ3"3wia6\N1qt X|q ;?ZȋF3~xRJ1:P}5~οu%pYQδ>U /x{q4U궷/M|6F2~]Oe1 r29Qګ]v6 pZwYݾ~Uşz^H?vZFO&rA>3BteC1/~7a=]| t:#s?gg}g.mZ޳mP-|"þn.i .ÝZ]#A'Gw(ILۼ w_vf[Cs,fm=s=iYxO{wNFUֻ@p7Q\\huCrߝvTЬY(V(\^>>갪 uZfZs˙דdSSIugr=cJiy >Ћ4}kkмuUɟfWn'ϕ00(߾)cKS4)jkµ 5MnKVx Í[n-O˜$_?o B|/RYLSW]>ٗ67*v}GAIʡ;y;(DM|/|BCQ8NqIړC2wg?ǍZ bl?}ѓ<6<-pYP-Պ5$ɣ¨mր5+ZS1?#eALn;r"2ik7ԠO%FgEKR϶BMN&DlԚ46N?A'HM 磏>MH\m+Һ e0\a  p #[p5KOī~^2SA݃xY~?MiuieO4~{[}sCIzuG}g==KxG=gzz-w3d23ʒ*v./$of?,5f6TS@TFP35Ƣ*bT]6j#_>,,NGP~vW2ab.ηxC>Pb!2_>C8)^ :25/xKr`;pb+7DL/_/VͿ>i4R?Oʉr6)=qĿ>_˔+`H%oӟ<&=N}:5VCzf,!}-c4*nbGlڔImOT=?,y'Q5ya(^L˝LQsLƃ apg+}ۼϳymClx] h_>}CqyLq>>JD>ۼ{zm}lŞޝA(~~ӳ:)=ue&CFW3ĉ,c uq%TVś[]EVj&Jw7sA$&ʀ7xs s#%T͝W%ob~Cq((s>^$[-ul6ׁ)u(goܱgv4;{;dq Wվ?̀>D]SDƝWr̸T[Њqx&-y7_X˟l,K=*R>f@ODpf^*i&]t/{'? 8QeTz\l%Y>2&/ H?y:y_ƌKj{I&y㻑 M]y6{'lOcTZ&.O-6 $꒞>64Ͽ:ksxLj^W~xs;!N:b9/{up׀[y쥕Es =}?ɯ5 K3nqCw:7E>/2tpy|׻÷e^sjo^PsɿgofЅ{,癜;bAU|^i%(z\m_斈p~~>z&gc^nmeq1I~[ި1iX5хwsk.ȋ{3"5nڗG8t^F{]|1}u9;Q&Бz4~ж#[?oN<Mlۼ3]kvOck >Z7$hī7OGxש);!SRz޿KJkfBGC z7n{=ㅕzQ:*+QIݼˎw_LTttw6FX&ZeODI /D5[!5ԱW4{GɗqپbYٳu'*vDRvBeZ=-/v~}Ko[jRގwQCEkxb)PI E_|Ş>vHQOɆbJ-2Dz>.D9NËEJTމ\3!d M;YXMSff_-!Dgöo [ZkO\k6J8sŗx}m^\>bȞs-eYʮ: 4g\ug'BEynQ 's\u WZ?Nh:i{B!B%60gX~~9y/~O~ 6hQ(>;Wеo7y7o}:tl_QD@VMRZ6TZ VS:=eL|->#=Of&hfEƥzS>}>NZD|Ĺ_; /ϙm^!B!Dy\3ǒ͔c*U-MVHv:#RV&9WsL>λ'ݦCA]Aehڽm1'29s?˶ՁVǖ?JяHs% fD{&_.ia7̯E3Fjԡ ɤ ɟG~U g6@9{iB!Bѹ464Sk#!&Z + Iьt;9\~ֽL6O׼-{Vv*(}dX[ƁV01$³wU30Fω'&;\ʆ <MPA!,o4I/g 78,:tr 3`Je)r(}3 ssyDICN$]`y~@kw>1ΔV7idB!B!D>XTt=+(w{4rOB!Bqpxz%B!B!!Hpz7>yyB!Bqp(>Bf^FsB!B!DynIB!B! m[җG !B!8b5n+nra1yxޚ2sWШFwx 6^aspۏpL8'umFWuf@BB!B#PFqҚ#0zRW<ʷ垗&Toei'QoxW8A^u vrB!BfI 9~b 3y|nI+1 9coCۙO6>yn!HRyB!B U[у\׳9K/X_yu;װ?yѺa $oef/s1S89慟b~6/a^!B!G3 5+i$y6џZ4c4&1RGi<,%gp5'*~97zلB!B!6<|~!a2"FaQ4.FPD7=:'=I^n2uͻ? 8;S B!B!./yw5Ͽ3/^CH A!B ۣ~!F]]DEEIa!B!\Z59r}`m[B@Q\\LVV&I D!BBqQޖZ/ n:IKK#66V E!B~p mZ5B, $&&zRt:RxB!BU;Z]Se!Dزe DEE5ٳzbcc% !Bq7y2{ y!:C]][l HNNN޽{z B!B#5ȃ9u,=8&&^AJKKپ}o@߾}])**b޽X,ǰZB!G~o }yo -B={뽆۷SZZ[ӹ{ ^!Bq4hx[{3@GN{~˖-\eX^^&j)..[B!Gr? ^n0//EvyO; /B!sWUa^q@;WTT8...+;3HA !B![s]GjK}IKKstxg4۷B!69Ϋۛ6o@/]GhjjƯIB!BCoj(h(.;{PM8ꔕQWWצs;O"##=t:#(B!8 [ל~l1_s_Cuu5uuu>s^3'(!IM#]'X!D -̷k./*N]vyqqNGNNz ѹٻg_ow-gM*ȭnL$%"KДьN@f^P05d77Y_);LHlwO]-W]5oŧ2IYb͌ >ֺy˯{!r8B=qzכ[wĄ8R׷2o>88@=1_"ߖ787R] u;PGǟCձ)SaJPof g asdaMe⮶O_AYyzE\ 3yO(hKOL#:r̬L iÍ^k^Oat߳c2Hj.gVZO>g~ik-7?jQb. 2ja<!@[M'R !A&6.w .])r8XVTUzSSSDEE9|llwqUWAq4́RS3+e۰vַ_YZ64-]Vr'p 8@Qǽr/p'}uP9Ըw3Y>l. >I! l,Z2|z ѬH۷B21J\M }"YTvMkPzԾww@L$P;B^a@ϛ,IW&wc?ٟe___ȹC跗PU͌=|0'b˩ʎX 1o]6b[Gʘh~0 eԹX*b^n}5(E#`x yN!44W'n:m*/r̬Lשּׂ#{y{.BY )1"K, o)ҏgF9*nѷ'Eg2.J<)y()VAtoJC B,pnXABEmiʤWYʀ-7&{F wwĐBM+yOӫu䃾CM_—Pg%P(#,'3܅\:1˳%k.qF@C ׳n^g.9J %A*S,ەսڠw1%fm aN _ښdhGA'qbzz<'{AێD[/FD O=8Y1-4{tO#;::닋yl\[Ģk.=#I{te/{Oq!=5V4t "į+aTK͑ $fܚM戲"=.dg54W;ZYŲtL?/l3?Uj&~6It\KDΥ8Ù \$WB {mwoEF v˼g?w@&RoG!ndWANL!]e;v4tmAg vFc'@ɌwڋAużҿ!63eM pelz=33vXΎf͛3Gܙhp_KzTRVD6{ww-`9n^Ø35̂{xvfwY =$]H\ʗg11n9ʂ?q2&295;g[r _ҋ'aGJ=/FĨrrpf#X,դzͭJ>O߃c)Z/+ؒjh1 lɟomKLw| )w;1=Lp; K_z{fRQ*5Vq=ZbKrGW>6vEڪ-/y5_6oOvE ~#x$e7=DKeSh;[+f!o |1VTp w&=z S7b4سԾWdi5I&|l GRپz;L; 5@oo 3[uy *#Ta_8x^"Nӥ%Et3 OW^a^ݝvn>8`ޏYRvwYҽ/Y *+-6f=[2Q7R:>҇_7iXY1ύぅqЄyMb/bxBpRip0r 4~:5),<Ōŏ0c?ӻ G[p8aN[SZ,ר7^W[5ge~<>C:o(o#/eyM7@iדβk]:`*fwEWg q0Ljx{e" 2j=ao/_]9pG1yd"T|YWjSױALO~Kd Bd|S̹R zFKiU&꺭=8+3+XQsP>4|~:7޺7R~$p|r B[[s<._l`-fTRʇ̌x3u^l0g,d{'TWSB{_6Ӭ&4~ߣ# Er^Yf^ak@-?sn YSj'GBx4`5bYv2`_=BSå k,Z:wcٻeܺDy70uտ7-Џ GY@>STAiv)fĥTmJImu}6 w1Z.&U5VhA>礡zBaOm(u k-[ta¿s4-W2o}ORSˏȏPKhX+TR B=X IDATqO~?i :i/Yieٕ?w1#yzb`j(0ᅌ2 0tF2:I+k[]ݪ=c6*{]JB֡p-oc?}xSW8u 77 z1oAn6v$]N4aSfݶz TsE͍ 4l\ß fkwnAsq2!Od7chCIHtcGpʜqy:]g3؞QSq/>;@S;Bç[_gŒt 7E--ZM^WO2_?vE'4HC;֧]m9Ӣї3gԘIظ?ih8uy~1_ҩ<Ҳ;= II#lYIag,K'7d='[!tTq[֓*ghVZ9 b ?w|AmeD"ŬARA A!Lz>EΣxjjϭVP/ٱ}N Mκ00hd{$g$!*KR<>>qUmT)p8Ovy 0܅ÅosώaވOyVΨV]07]>_^XeYpl]GjwpO{dqxkg쌭U<ވԩ^Ȫ}9ݷ d;unGx t2"]5'˽],PvC{~F.X{9u+;@#LEʹW{Ε{ Z=Bˤq˄GfuW^~35gbÕ[9^m%!6ßxeɓAѿS>|d'?F'T5q=gu.^7,#x%G~oA0+/yGBAя% 3⍆ꢀ4j1 B{(oGzWz4\1v󭙙6d2#b ?ECTJU@M(uo&^h֜mnFgp:{`_ɗS?v} ,5\ŭ1cǷ8w9-ni׃-bDZw] =Z6k9u m΢B{LodQw,[̚~'}OU+s?lɾL'9+]#ACsE`qLh rѺ)|s,>N(yAswπ/+)E^~<P/PT<616ld_)10Ƽݓc*upha"DCHP򣙹+o^ZNu|f]ujN'AAƣYlXmZJPQTv/Yt̿rkW.$"|+w C=x)vDǟI!s'Cܰr |Gc\.cTA:(ѓep`YN,Z ['3|iQPwiC=ypFH B[$~]f?JTQj =lŦ  9nLW"3gRo cJ3mޮg#q:w,("S JWJ5UY8'Am=Co F) B}ESK敕{ѯW?×6[AU>:%ۇd`٘V?rQ1 WMم4k  AFE6K.*煺C]HscМ@H^ӊw}žԮJ c#iրM$ҽ Cѐ^_pJƩfCg4E"-3]l8{n,ߧl+V򢧵i  qIG-+wA{B>/ZTZQsHb #Ҏ+ #)zVYЯE q5ts?cuFnncm,(\+Z:ڊ  LJ+D uRGL uRb>=S+`F{L*?Ou"<,po+^~lO8sMh݁{gh!؋Axv;KGM"jn2a}XeGьGW̮z5E BE3^q'ABmGIsM/`1E֕JW3H8Rulx3b,['  wjJ{dxB`ʫS} 54Wy>].b#7%&uhϠ9Uw7 `/=[y81vAό}F2   H4{A}L4ɦ՚_F3:Lۅ ͐ 5@2   hBJ* vM[v*fP:}gMљ|;kWeАAIAAD])1/#Bd&"!>ٯ|B9myEػ̮L$AA$7{EOso^oB>lO#֧'B(/@xp$, M<>dAAAŽI=`/XlznzۧJQ tϸ4~uv!h9+ x#7_Ġia̞9[2 5&Mbl_c߆e  W$B^[dFuUIDN#bZ@BF/B?nO6"|qjb⅋rFxN~= p.=b7a_yjo=OI֗kW`g6OO٫Id/S??] M[]lXFA0 EYnYZ wB-h"ڍ{fhī|]nz{g$Π9סf^ק+@xExvgYgR0kW1O֓{LSz]c&OUT܈!˿X~zjVZA:ӿ#y{|e-]1,Klg9bo/ӏ-y1YOo;:7AJ D@]^^07kWe̶JFT/mms{6)1Y0x(|4%Ṁ q Q>UW^mmm(;,js -|͛%+jUg4kjw-Ξ]_s0W ~拳2OGU}P;_Eӹ 8Xkɱ>fDJ5j.UꥤC~vd8޲2E % ФKynzAkiKd}z\y FnCļ6^vnIM[{> _ (󙳴/d |`ds rh1kzo ֐j՝=DUH&`kk_b#~b;2j\AZF5_fr.&5Uk+=W>rZ>aD,=K@s) |_J/p$ŬؑcH+qrm[U oZ9۰FKmLeC/ު +b e6Kn_!PZ5WMn/wgY@;\/^m=N]v\&6ǤyE;?@v?~iHI{6y|[xC{,PfџYrb=[q+>ċdR'ŃxxLy ,kXI/Y/g hư>Z#GlNg6xxvf@yށ*k'_l;n :n@œ#g?ʁr,iۛaԾCɨV!/t8lՀKUYuH:GJ!~~Db3Yـ Pݩʪۥ # st6?Ȥ3XhACk3#z&'qn&Cٳfsay,mI dbOy/xNGبrv,=  ޘW=GG+a"mf߼E`iC3F%$N@ۘ1Q{q!Wsf=pWl ůcih;a}-Rl8o{-q>n8T gptdܿ5? .5{tC}UlKu\ղQ5[0͞5T TIkgȫB],P;$j;𸤨tғLZO>7MG+Áiż=Fpѻ>_zYyi.)}iKzw>X$ tX^Ʈ GҥR6OŖ~f$]uY&vxfq,I]sh{q#e'K>F1XT{S0W%*>\ڎ&s0VbsryyR&]6V K|"td~ragHx%oJ N͸51Ҿ?_?ƅW~>]/Uh;7>o :c2w:\Ajv1^__絡ڙl(ׇ0jtsNOo㟧1דt0IШ>.Z!eof,96 ƩR6bkb=kA U+EȽeF5/@'q@so|i8/B`gc s/ WD&k枻^.]vWBRϽFT'.}-tF@P=*Z&v3}weͲ|P d$go5l#=D4oofɌ֑߃Cѫ}'y{f,dOf.{ݞ\Un_an ?6u,%ڮ^](Q6vH\  }oBדw%^Ͳ֞ڥ?ח c^U3QZ!:щ^oJ"Qp:K<>ɽ&=_\N oy{rhKg{[(8ļc4U^4(lpԾ;9_lzͮ҉N!}/ѬT9qcy4Ś ۥԝ{ [;@~KgCvO)Xp69ḴŜ~JǮlڬ{XD\olQ9K=pg\um' LKuZΚJ omO70ה2a\/벪GFZz:P-M}zRf`Q廮ڳFA&AU,KBVS3QFʹKJu)1Y2_47)P^l4 AjS텚~aGΚwVOo[v6.*.]I0#)ٚ62bhԖds=݇3FhKU`o )Ϛ *{0{)S] V%R`9HSճ/Lp*HLc7˙']/h }NtUsap ÿ7{^0s٨k.Sr^3^Z]@]Ijy.U+~ۧ6ѧRudZ4Kf$>Ao}ip$lNU2FbEӰ,J350x||q5)~܊LvN&Ӫn\+m邝=܋]\o~V6aHXK YS3Dy[q%;uvދEtWTv )_}v:8]'mYY:R̚L} IDATic큃6cޏ{m9sR zi#k5*yNF6¿z9y;l pWjy|ybVkzI^z֨IMZO#/P3W`Fo=>tdƢ1G.XE&:R.-gYzX*ʴRo %ax:fALxrjnձ4q?1}-EK< NaAj|of}#,:ͬP3MQy}z;|i&.v!x)IIo# qFߙ|"[+koZ%݇R5JJno+ m'56y_z3W>{g$bdO#xs1D]-s'DW6kU9pb%.?7wLe]z>QVw& ˒p򯓥R60YRa'?-zU|+=^4"ӈUX@HY7{]#l6L}h{/y;l pWٵ3uļZۈK#fm*F5ҹDN#bZ@`|]-N#',+-W<5*9 gѭy9{4i@^Me65w cōgbwiFz򸏡J=M/KܼgZ4T{h^l~б޲cΞ65MR&ެ#]58"yk-=oun.7V.4pnBܬ*RXa=$#'tnL+fyryV̌yveKMvfO.#- 56 zCE(tO6 I-džEj:*57 ;"ʅ gh>ЍqK͡OIy/`K^Sy <[sfNn7W2&㶼z-{u%'һȫ4r,hu\gX~=Jc7#|Y˟@ ;|ѫY{zrVfYiC{mS,} jE=J!0%(0oGl*,gX {ܴe>)Y?B\˷VAiLy/1 Aj\%w j%@,QBB->=?M'<1k]}jlVY!^IRb^vk jD{Y.Hg[{;^CZn^qs\36Ԫ⪱̨:Mtu&JK{%dqTA]'L[*>f!KTRu?v*Πu%,ؘ*zeՑGOxh} {ҶU|y{`|l7vz+4z'x2Vhm<-+k;]_xy_Ff5@Oo&-3wa5Zo8i畡,ܙ |P瑕uT%c_XWL*Ѕ׸^Rilq6 39q#^>f~M^c#QkK7}᷿Zc_$įtgs>,*2;#4U LtJt͏6cRgЗٺmmɌdAq$ƦfyߞE1Y\?>Bn6Ao\y:vk۔ÌeK'q<-B P]9_ըQ,%E ȨuK_bW,T*\jt&1xNkUk7̩TƐ3C#ԏq`x,QO4VLCkEOiw)n¹Ck w-t*.g_c%Dg°]C=ȭk8Y2~`bg7ƶ林h~xmB (O'u#M3iIF^ gs3dG]L2➣:8 Lgrd۩ɺv}ϊ38ukNqPT3\.}t 7M o>X9/&S#~>]"ۋ,eL`7GwmUg%u`}(Oawj+!AhBG+P(JF yV(E>N,+t,uÌ 򰉾&'Ei9F Ұb>u1:o.1a|>}6 #B!s&_Q m_@ENV4lsǒ.̝E .{ (W*ļT MoO3G ޛWh7ʻ/=su'=&@`O)%. !T8:YUF(o$@+ eCA (+RL7$E ɠ# µcLKZ~vOV$/4tdA7ܵX*̹uFC'B-t /2^m R."!)jMJ9}Üy@ #F ٥WB{a;] ^ #B k ɗ5rTAf>Z KtżA/:3ˊy1PxbĮ3"\K/4(FG^]D1 5fgA mv]H;, !5:*zv.X~,eǸsݍXvO3D BY\K.~o9M1:=pˮ1-v0GRcM/(1xVrCgRPϺiQ|< ( 9}`˝Yw>KwZB_y("d.AA/,m\""sgRΝ‰^v2qN6N9F 鼌B|m*pF拈dQoy_3Rʢ u&AxH-& U6TA uWM/0׆W]-/pɮވGO-B譳rY;-dAAA|oe =q/}Bҭg7}F cPD&IO*(],.y1`l$A$  ]+K`W}A}Fv8Y8ȣ zxڙo;4B5B>dH]mj{=~N2   e Hz10rBp[P*0O3zLD"HJ/=xwn9Q,'n]՘뤽,]T2   ܅⽴|77{筩o7=3 w!lJ w {< Ω' µs쏠q߃fTx8:֘}VZ.3"1uŽ^AA{'ao@b ͺmhքۍj@4H,T]=M r;kM\ ̓f)@J\쿇AjTϽ=AAAŽZ7f/A;ۧ?E6HMd9nE+?n#h\cp lyDM*d{_T4hE|53*p$E   H+ԸfW"܅1#5{QAdOd?6M>WɒS8jm,i7ʻBO%kϣڣ1I"AAGaPoW&xT)"{>ٯ 'bZ]O>xwţEס+Ny-<:3Zm|k_Κ%B^ry=k k2UiY5{9 8ܒ6`TO/, 7s'ow0R"B@Ae<-:6VKUx77^f+ٿ<pglJ_ {<,8Xd_mgӠ#~Fvj>aNDMڝ[4j?G#,Ǚ~`}WUnsW=Dq=kUuQ[՟[p"SQ,Jl28?n6IH @$Okw \,r#{ !?8ԅrn_b] oe櫏#I׾ uxs8O_.::\,\#O/mW{gweEz H15R]2yn G,6.)무w6)w#^EHD 7# 3/i3&cy&'gC 1=|v_ʋtԞCB m⢩}XZ:snNaM ϙnck )1}~?3{`==z7 k)Jp]N$׼e/ / 5*%uLZFj gד kOKzfcwxxR:WVzwhM3cW,ZSە@RL)s➑y*2C ͞<- {|>`!wPUA \i$5ɞLy.ɠ" ylzg`gq0]ϻOXUjL /dUVG. 5*a_|u\^*J7g_y߿ew[ZVVV6yc*s2luy/?>+:|k ]0c&C;se7rNBkٻCDW㝜Sj5MY`$#UNI:ϭYٖ5٢!|BSP_n6gu6R1:ϰ7̏ǼƗɊ?E/G^e~.o^M1 #O㑗Ƒ[|:rqw2c!|6Sf&;=v'gwq^1[o_ߌJl8x} f9l#*[ڿϼeֻneOo^U3R9 bz~H(G ~MDR퇄oR]cijD|߮x^$|ŗY=8cl$;9̎}<}nI77ɉu)}4Cr|wgSP7B}rP_NQ./5y2c8w~fmQoۚzcMgX~ F"r5|"TG/m|^oO^IҘ^ESf.w3 CByo"=ύ1mA|Ti4tVĪXv EO3nJgB35Y'M+䴇Gm1%`}+ \} >|/;cne4J 9@G]囦ztVGXXx)ٵ$ugiPIwq9,>3\6l(+,ȧ[eؚ X)AQ|ZΞ +3?o^9$v#vn36,~쵛۸EcbQ=ؓ鸀OonDl`Gɯ~;g <=26lVN6瀭{?.~< `4]۸-,_Eq4:J<˦R or08c|*lX(m*H?qIc? 1XW=LռijtYBWܜihW4Vj},sg^IJ_pwss1ѧKh[sk=!%.:=}A_-C0K${Vgs" IDATy}l7PA֯Y@k3:H[`6i.rݻ8%p1S]CnJ)#Hh{&ʂG&gLZFiF3]Kx(i*Q-a$ ī8JSOaQu#Gl@Er=oٙƚzs/ :KPZwL|e}oAe8rWYY#l#'x83oBghsOf,:&.Z5`F1֢rpv E'SWSZ̛m'q$5M"@\37$GtMCܻR:;.IhR'€2|Mb:FH\0W?ٯ_e-z+'JzD#kx<rgNZ=46͜F8; @Chnۢ y2(<1vfI8Ov 쌫ݝAG^ECww&^Vc}k1wch)qsSD-hV#! #iOOvZ_=_ '$Iʜ\R#Ǒ4&we$}a ;V撲 =؏cNwVpokaЎ-dw.ee!F a&.Dѥ]'V9HJs_t Yel[d*=YMSf`&p Gr ,#Y֢,c8?]InBˠbKsL{D9_#[2KjG`=rfoYX\Ǧ# '5B\w׆Eb61-Z6NSy3㞥C8_8Z.OPD6o|͙uFoش7w[-}VegX7W;zw%ɮIιQ&`Q< 8s>/ idWDЩ"GnLSwbk9""m*0 y'Gw@_n/\̚kXr-۷mgc߳TBꦾy/bUpswm?[HG@lW@ofQ@bHT1l=SLo^*eܞ*+֒9gF2}ݳq/0:u~vg`/ŋ0IS!7% h9래f+hGKG-7k.V}p%gm x$M]GҕTekO+/rv_-,m,=`K4q8<ec/>Sx⦅_xV.ʠ17t]&uYrސ 8i\+\5k{h|ڛ7M-}Vce| gxhVF=#!e+iE>:O7;W~܍Y&9Q][2(' U]X8b}}Sۍ 槒V 9""m*7h5Q y >lOcU5:oB~v+>8;^NW_:l7 r i%;6M9=l@S.䲳+/M@)m%2 VM1p 0Lg$nh{!slBLWj6[T6gq7[!Knl~a'rj@ynqDyr)h'N [8:iQ 3#'9[=4<]<.OC32>Pk3yicllSII߅b"/ =ۭr6sMΆ3qK~n.*26A1O6¤r,ѽwC^鐯 (ِ :2puA,{GZ{ _*!'MvD'jykpNR0Z#4!gʶm@ ]Zjx IQ ቴsRg&ۜWlԝL biOl={K] $ySv2~M\E~ULr61ta@@*m9`%̖M=٤dѾ;5|> Mcv>WMGP|poanjMI9dXG[j?95NV,՞Qn ͚Fe˶f}Vce| g4+3c/b)cz(.]z.3}ۥ潼lO+δJ[XdREk 6QA]j|Zd5_.JNEjN/}/_!;Qtip`'9_,7v/=%yjXX xu{$W^ЗHz9aϼ&v$EWovJk/G1 ¯[ؕKF/|Fgv-:azMަ D% -)rkם85xvlJI8`=o/$5`9oYY,O%-s6nyrmegą`²*c&O^NywrXM]6n~YO?IJQole9 ob]n+:[=46͚&eKYt~./[L7 燭tL:Y~lGBfS߅(Gǒk}r23n OϮ>xEoб[_Aj.ȐGkׯ NR]VelWe'_b7~-Ⱦ= DČ>fc!]wB窦0g,W bNO>o˲ظN#ڻ&L.nYڟ~%ыsn>R˶4'w#`%s>[oٌ?nSNM!l[wًY\%gu3x\&N=Uݓ-?cizy8{9"yP5=v/ 7qm10ft5_v\#5$?+툽V[V8B*]O~duoA-*:d:pz ٵ+f͘¯&CKn]ɭKhtf~̹=| itLkZ[қ|v(Mv֏p[舆ׅ}E˲d濱u>f>eVY5c/Ϋzb]v!cfĬ1gPwNJwS艤[xlMXY ],6y(*(ۮ#5^#i>^MJ@5?>m}{O,n᫩j<5M%+"r\h'y}pHD"Oy?<Ƥ^.ͧAK100 0x5("rsgo%ӼQGXt)ti>ED3,SDD`QBK mx$x9yRUowU ͧH V"""r7uGcj?L_E4ZF4""m@uIYJ""][ џ("$7wXڅNA)"rN,0 fл=JNDDDDDD y0f gRz# ^DDDDDDi⽲Q?̫f^DDDε/ T """4_}u{U׋aço ʼn #c1T}g<[ +<޺u ]5~ץ3t5xMboCEnu/yq N>)Lm/QQN=;4dLJKo B.""G *vAj=h:_u""rYy3 v+ Td=ύkkhmQ.Z=^sC5l&G3Y 9k b gų)k1~+>6>OoY~wY0T3O)1+_A[y]bF6-,7Muĝ?'Z4?9U/E{CܘC0CsYy;D#b[:;?q OgZs7|1YDbfB\ T#_e#) כ_evm""rUWWܬTjiS?)[̼C> 2\cP)Zc~7F'E2b荌 1y'k|Jy6u~ϮGWdrYvҵL̴5ػ=?F&~q]t+_~MՂy;OW˿?ͭ EQp+9dX ?8Gc$f+OEOrMA֝+nj#b{'Nn~ɷZO3Uoʓ']k |!|\Vm}vʛOopn"2hxjCDD5_#oXտFȴO ni+J3?`zaw axH.7oLCE,+x?%|eIϏ^+^3+k&vMZڨQg-s$j<ϯ١az|`e@A[DDDZWx{ Cًa<54|n.=c7aoSyr[hֽjZT_# 7澷s0^p3/w|B_H72{=l.{WĪȥt6pŊ/Y3VG1?S]0'~{^N-Txi7ew-9 R3c]ߪrN.]]}&W vx^:#yfiY 3f'yzKO&$$0lfSJ9Kl ͏Gzs)cjA#x|,\pMx ̎L<gM\55CA]DDD'WnG ""rD L]֖W_2EɎhJnes;.@n6w\m =Y iQv8Wapʿ&JcIX gWrF`391:c81#O|iP>f>W SV tpt9/ǵ\3B.81(*?DDPz6"}SCC֖}%;Iߓ7f(=l`R=_zϷDzkx{fx+ '|o}= g1*ٲ5#ԟU_2g(>/~}ZRLg'`{ͯ0WvBrT^^7 k.& CI+(y2]x.pZlD&\Zs5GQ<7ML1 غcn_;0K"jWxɼz.s;?:z(F %+2'=p!2C^1|O9q<#'*חMeYZ?k?RN; ?GDDoQe,oa=qWugS_Oe~,c|;t.I |xSykw*%9LiVep7L 0w"""r*9gBBHuCәHp\NëN 7'_4{Z|9W!A7WxR>w=K&""Q9]cY@nb""r(4Aex,BB0u3v٣}N|GK_9*sF(DDMHF LkA^9^DDDDDDЩ}x^:7V)/""""""rhuF3ü.UF`oZ_n^=Uo:zǠj;Z7j=äN,/""""""rY da}(Ջ f7ucg """"""".7Lk_5ɋoHί|aTy`7^DDDDDDj<}ݔ^"""""""Qـlրxiak-΋^fFuPЭDDDDDDD䠇VoJFUg[؉Hy}nAݰ0, *7 e ,f/""""""rU57,`wuu ոW|勈!aJ7 ݞNDDDDDDPzN aau_>"""""""X&FU}-_S/"""""""_U|̾~XLu۫EDDDDDDYo"۫|v5\ h"""""""972}mf_Z?^߬&H+1PoZ\ x9ZkjoiPyz"""""""Q@dX&WS}i >~u?5OF^DDDDDDp|jI5Fݦ"""""""rnZ_vxuF7jIRȡa5a̽/_"""""""rhczfW: """""""U}U}$ԉ$_+u㹽zh{^^"""""""=`Xu}xDDDDDDDR0U"""""""p<>r~7 """""""/שg+|?)t_gi^D\>KDD`TVV6 zvM IDAT=+ٛh"ҶCeY|>,P/""{i "#kDh>rޚ7oV/$0O#"" `G^D(`Ư9ayH[5O2;[{(ۍi46zHd6JH >+@DD8;|X60??[=KDu9KE(5EjZ/"S#@Zno(̋+kV^ CDH85m]vӅii 9^*+PʋȑsK÷Z8F, CD`~n3 Cn!>#tyˆlkUti!jj⫺ef^D}jWDD T0t$&3#:.5>˞"*nڅ'R.|>.Qj(̋!cwivwHϸ8l:AmCrLWu:k3gm(wg`E Y5 M}=7g>,(AOA$F$"gvRX^D#=h 2(^})9 )Tc'^5""""r etSחX*V)aSQݴ;n QAqdo+`:I Hrdw} (R-o]!hZa ws{ ""moGDD$6nm/e" uӿ`v'KƷzvcYa49.a(]#{`7,^2o)e" fDh` {w {'""""zۯWȲE@@7oBa*Iv.v0 8Bpڜddp9;ޅ>"r` 9X6)ͦ2o).[ae0MqisV6NG0",f/"GIoNJDDDDP;u~/f1?vsz k.[ ݣz abb`55с1;Cq q-n_ XD@Dò~="c9&N>ͽO?}I+RÆ}H:gy*i؞`G0.IQgOE{67VOD&s*̋H+y}Ld 4ՔQDa]L[ڳJ6[ a0G0jj=u9+cq`&.W }b*In61r<þ¼4g^hw"ExGC- _1gD S{<v;v1zh}:.WqtF")*Tȱf|J `{]FgMzY*ؽ|:ԡ8<]jEdo^}U;v,SL+rry@r$(T;V>}evgf(pP.бB(=v}$zݚNDZf}ks7 pqY' pQZ@f»Hl7XR<|LcU 6 I(?Nyg[ Mmg(̋]3_v`ĉsw;28]΃s4 0lD- 9A^^mnk ԋnm-kJ¼Hk3Me˖甔pڬp?i6&p./x٣%E>i*̋(ط@T7;QUw{DU򹹹,^kn2~?Pl6b7 42`s ^ϧ&to!^ DZxaqmC-H87s>yDًf~Ν\tEps 7aqvNw`M80m&vOvYfMÐ5vas[#{A-3΋H4&]1>C/̟gN>sN=TC1MMa&y^}PPDK'"m(WRբKMEuK7m}4u9\ve 5Kortퟸ۹;d֭Xȱ#  8'i Qa5;^(ȋ#9U+^U5VC럌h' cGpѵѫ/N >W^y|A?3xC{[v:I44ﭾ隀?[6vyh7JΪ]ˉH4;8ytډ0,o ocᢅ].8IAZ ߯ZxZEDDقS}5oہhdfkWQ ^N;u 6 W 4004r|,f1c&a؉ C  o?Rk͚y P@ciUTr2Q 9  #lxm>RPjוW]#Owo?VƤW':AeOs4ɷݖUxݑ|6w= N4ş,g hћt㾛s] O6~\/eN:n>Žx,&R9\Yj<ި3SvV|˨9h\2:&qWMM΂L [\?νw*cF,̸~D%qo?'ѿF~͝So Y>t{ A {) b73qT8fb-oM#,";ȳ@g9<1.x#@9[W>ʽak%?&\K?3n>v(M{M%i&L1K > _ HGƽb|d b-&b\+(tg}ݝoLMy[n=E^K]g w_Ml\ } ,yk*gӢ ?ΕB;pq\Vhc䙯x̓ 汰'<ّNl8TL#sY9%._(;q^<oO!۟ǝȆYćl3EDEA|?BH?2}W1XQ Ibh,f>>m =pA |;WwͣәOy'>oSɿ1M6)䍹'BT"{g7#y?12eZ^Kyཧx`VMO탿EgOuL,o6F櫌"ܹs+9/XtϷ'tsowqՋYqg\_-IX Á' ;NeבX0?_ a]_Z94o(ڱzO[ukVy8g8s cf"I!ax/xÎ;w[<;bڸv[4'w w>)<5k;}nh:s9s\ITy]BVyi<Gyç7g7/H'0XJ֮$ĝ< u D A8S`W{ GUt<F40li`&3jD4vB$\O"Vss`~̔\ܭ7/NK抹l+:b]^Nb~9#ʉA"]?6B03%:Ը6@)^;& Bsىt(ܭBĊqT̬Vh}ňrߋ |s9W_1'm{%{nYk1\e:=b)Ɵ?n=ՕE@[v*cÉ=`Mw[yq“<ݹ<{]N φ9;P zTU{:Xy)L\@mX&F tCG,vd[ 4jl6o 00 %0yח2:3'Xݨ7'cf%9Uzr /nrd)316z(9*WO5 G(WhP1jqwg=?\o5"n=8=uڲpgs[F.Hlr,Ce?cCQQßfc5Ux6?cGi9@W.lWTBU `\3ᖠ ͵f5i ti'?ub n BmE6#cW@q l>_`9c.%6m3xcnwι,zd)Twk֠)8+kT@.a't;J&G@b^z\?OeeR>?m91ilt-0Bл| P"5̨J&T>>uB tޭQj٧O.v?]Xڦ'݂P4nACOZZ1`2QY\`;*ԲrL?6nu2L{B7Gn2uuu\nkC](\s֦b2Qsc:7մtU߈]oFt}%5w; Gb1y3`_>Л͚W D4 AI|z |4{;^0/׺7AvYLbr6SŨYO hd L,Xg%i(|rQH ]!$O^ 4*73{o%Vt9[ #'WxЀ8{騂48|W|U:Ge>3㙣y63CzDWK>ނl;{Ǯx28qĻR7h8&^m9{S0,?x-X|@ K95̮#^;!g/11}*P ]89 Oe{2*P-w7ޝ ש7^>*{]Ƚ&эǮcy:Cy[Ir̒{"]õgx„hXژ~,;J*1 1 Bɮiv0ř796AHddF?cMoy*n"szԼkUS% z:`٨n} s?8G:>˴AaM,v~%u锵%]mPBo_.rO/ O%Y4-~G1 yiAV֛n d#VnOU3V茸( n1OEtc|2ߤvkYI\ɏs$ z2͐MK$ŋ)w8Y-$ļ*bDEUf "ӱЛu:h"Ak U[(y"7{3q]6ԯHJ|;=OF_A!HЧZ"Aݦ*t4+ IDATbcUkFwjVCb/ 76V7Gt`AZk{Tܹ1^u>U  cDݔ3/ :">::A=E+m_ _,"Sk Abm\ҋAZy`' yΧZ.]q.VwAalȣvmSoĦUH>z_eu=2/ ooN@ҋAv֌oKh SH< u>un?^'}Oh7vXG ֘х?AA#;MȧsS7U߃  V(}Iɾh?G>>1~g̕7x{7(vAV#ZY\Q䂾. 4$jS(&\ O2]:.  !O%z.^AhM>v)~ٸ MSG, slىo+ENKAAhb=ձ6s B~gܷYAhʾDG[ b, Qz|߮CWLs A.2G5M!R,2MbAvMj9^HKS_~.JaXٟL7v}s-!zz-kZ)AA!t,}D/ 2ޔ4ɬ1@ǸׇJ\Чjz&Drx3"J^A=">y%^B>YAh mr: xq{}t-^'wouRBtB^Fll`& z. ^PP7اP7GDx5^ ~UUuт>^7OC|DG d"ސx .4.(\:#l y:n>> 1/ b^Is˼E>,ࣷ#B^QÁ+(#eii }p(%8]tF!AZO#^BK^c|DcPL}kG TbAa &MbJ/X~UUc\UUts,O>-.QXwz%l0A (oMb O%Αy FO$+E 7=GI|*o!zs#sc\ܛKj dA|vw7PR,MgnA'䢿IBh(G}c֢OfO2(.^AyB?پdz3[(!y*jsSYʞOZ#=4g>Z DAO#әv,D}s%1/yAOpox!o*UUE1â>Fأ D>mpoiXU$WE5P/ zPȚ tLMi D}t᥵D^#-*E -)FIOЧrONQ}XjumK{(7xs1QkGCiu! Ђ:|'.Ak}7 vn}2,^Ir| Jld˥렞1͊n訆Zo-XB.+RE XƉ~nK҅bG:Adg 5p7  !J Dsu x#W`YYlV|0 z{To/csYhcܬ,n:>>b D{d>^R?@ x-o*E po6"'&uMQ[^fE j ZPAAZ ESf%sW#7Bj/0wABdt|ĵ^4~XV|>qAݤ-aۨV}9)}t@NK]:pMy pJt Eļ Ъ< \|d_/B^AvGVʺe3b` /W qru }ZSؕW5Q't  ,`wB>Z-!1RY#n[C" @-o/E jk|w Ԃ>*}u4<+ })u%^ww/ D{s1]dwӵ階i~TՒVh5xk}frv9Q5{ly A Vh@'G3p"n:XK|VDOj8brJ>l9)RYQ^ӽ#r2rڨXUQk0kVs2p̫zҳGwrrp:x~**Yf kVX|~ڸ-vAZ뚎h1I @'4Jz#eMZl1J`(^< A]|: 툀,E>zɺdTUy#Êي° }t>Tdfe2i.*faCׯ/~`.KU~; ,A}n#5C! (h%cIUtp91Vۿ򚢅֐ה:+!*j]?@AoD,.O:noUW0 gU;/U!/ 6HGSͫ:a?qjk}d:ڏL̓VLp"tXy>\xj}d8 2P7p ]1*cZ70>lN+%JtCK4Qc26ۊ#Íj- mUNAAMe?p1ì|ql1ԝ+潚R^4PBKQuʱ]iAEIympQm8D{c~IUM&'$Ga}e^U5:+zh^fY>|:15Lȧ^ggbƷFD{}<%.,2/ nڒ1 g<]B|Or2oUUu@O\Z0}-V֙Kfa4U~~?%N QF0kַ;-tv3L䄢ඹk7QZpŷړQa8=>_wv6&uAY”v8[YцC{*/|ֻQQB4-W‏-#鱀Zf_ڀ~`Xe 澇i!뻦:vWî^'#>2g^1Z͖'F]f>">DE-/ Ad.sbߌO-dQhz {˲՝*@W Kaprp?WyquyuRUt:ҹeeI5vؘy%`]´ Em^tb%?JV ݰSQQ%-V=gU,aҦk^;ݴ5ccю*v**=xk%;r͡&AŶ ӹMMŖPIIE-*w (XVq0P^[UM0P-Vf[p {7}#lݦJYE ^OMBa ێfw\m] }g൹(-ӱM6AYB~LwJA* ;`6?O^ͭS.a|~emL3(J0^P5(a)hX sxE'녵(yl/)OYa_MMV,Jvf:JgJ!"n𺊡ռohU3K|2|zp"AV*M%'r#:>.>_3j@uܼd18Ҋ w9uGփjcuA|usXP[S5y LGY^ ?d0Gn G8Ex݆Uͦ'pQ 3x뵸)v2q>hF`d* kR4k;N.`CzeDƆ`.8մ,rg/T~u'o*^5p*7W6lLmP0B3!oFG^d}%v|\hn*XҜV  ȼyAa O4_>z>z_A[^O>Ynn:?};'v2ckGuE-`xH^.W@QnɊv;ʫ,}h J6a$֣6?:}Nϯw{q+V`3ҞQc /héST1sVqf ukUj3M+ge6g#BvdAϽ(Ԯ{AO (w~՗Am]wPيNSqm Օ2s%-/,D kҽ%-HՖ< g«\s[EbXݏ;rl7Pcοu %\r5oi*pejYWCנ)5NT Jj,3V/_ʦU2*Iܢ`ZW@U9UAdzf+* \sP6`PQ\L0m:`my&| t9W^Q}ft#͛O?];b"AZZk$'Z *lNyy};^Wgh ̠hG4B̙d{Þ2/O4͎)M<]NCcɣRWJJZt)lj/|Sey΃qNԎ<rx<&9915IY| Py0?R;[h7٩Л,Ol,]hmAAv[tuklou^ãf}y~;QCG4y8) ,#fsb1a%_r%Oᬞn=Y=3'w,{|^AA6J^rmrv/C*Vgm:qZnܗkvב#l\3etpO}iżs EfS7?*Q]KϬBe5~z_KIwQm>W53#ϵK~_aODĉqXQ1^}тĮbO[nY.Z 𧵴$0Gg6g>~;rK^Q*Ar =椥ʙknk'1 QdxCh;;uQYQQƛ2/SooWs?:m/x e돳XuzٺW{Sȳ:DyRĕb ʃ| ۹!g4^C mzFTeƅ~Gʐ]:!X  W@ƊWʰۺK1MyΛoUXGgN)NZ&{:E7TV)}\014P]oc?QWA/֌o0G>%?Y!ɭ1wE ;4ЧrO/QdyE&PFhnZ{6[nD7*UލNAdDԶJQbbQ"3VVZ>EŒ4/ aT~'ps#yFh_ o>u_W {^=8l.m7w0QYz )稉3ú)86J^.=)cL9K8q s?OqsQł5C寷WTlO⒉kX”ѵnΦN8NKzP(F nA'hK:ѱ4SsxZdclNqZ-*5Y2ѱ4lg z)ԍ/5Ίm|Q%yAhN">ъ7H#IZ37fTD T7V7$u~|1oY,>  ¬Lnݯ5Tߝͭc uVf6tuK\쀂ip"<`¼' 5}܋#G%tEz}k 6|.ݙ+X[GVSV`wTtP|zvrּJBl5~csi iןm% s0Gז6?6Ap$x*i 9b$.N˽Em?~ה|zkΛKvk԰akc<]9yk_Y_ro9= #]k'g$gMȦKNǰa 1[xI'h'n*ɵ -:v_5נiet}^ ]EeG Yv+eeTkHKLk)+ +˕4QG%̧k27 [2w'APG 9N2efԅ]Vb 0?œ,+AP7fNLJRʾ-߾ MwvxMwf\1:gKg6lyw_ƴ55 t;yE<) Nfc,,s2Ok0w\Yv;L}]vy*rGYЂQݵʺ|ab+0b:5 UQ^WQtCh N-e^%;JW#2F} 3/e's!fh3s>[ݶ|nz7 C(Z.`! IDAT EuPuK~?ݝb_.xэ _~IǴb|v*~-ej,vaxظR zF&~ 7 <};wo>B<6Ux [u 2©[U5}?'GUyͯl9u~}!^NtDۺeUaZRQ0q<N36,F-J,8ҷDJſfԠw./[ϒ>fbpVCc4'($ P]l`@#hzf1@O;@JV[yȿ1nHg2J*ZhC kgpeJ## yaIh`'v>|ykKc딆 `( @7t .)_>}E<3LeG]N{w{A؃|:ŧ ZzOWq{G]4 - @` Ȍ^FUgZ.mSMkdjPXp ݞ0/M7ҥ3AD:>7Z%y*@ 2뼥 Tzk PTL˙A 5e ]j.+膝J`LGU!î4TeY1zq;ī-/&tɵS^ PMU) aSE{ G+B{JЖш{wRSQ_7)fAo5^Y-*3-T;AÎSM? E!ˡcsflPL=:U!?ˍVwOk)8jGEy-U'>ݎSM=WT25\wɯˁ@ Z*x&EvN6NU^x<.Kf6b˜:ޚZp MvXkWżJS*KvR'#o}D[!َ媪։h-棅{21jbj |[Z-ELo*tm BK Y 2 xylc\:Rn=Vg7],DX,*.'?ḽBևTUb̰Iuki^] :ͅy ;|Z'`v=S Qcnb#ňqZ.j},xV3ݞn "Ah [JpΫr BAhhoтQUM}܇JiOb:)oy TdJ. IV1ĩ֧v+Į5hrk|TYW%3./!/Bc2wTF7ғzOb͎5}SAa>XG1;!м5>O;gymṕHeK\# ?ۖ3sL&  A=`iM4H1`0RyeS&^e~ׯ2G^.'p+89Ad#[7vμ  `f7kZMu"!h|OA"/sш$j  |vw >'52UAqn||#t><>>a+O|*Ǽv G = oOAawFbTDb"'CR]9}:C{w{ AM7w}~F>z|sd4[AΆOZߜ>v_=%!.HwYC}pmojAAh}tȧӇ3 "]m]8Z*BF7-iOgXWND  fQ  +b^%)]CR F)frseAAvO!o~';Z ._E#G*B.I].ӑ'Iܰ +5G>Qh~9R,b^k~TğwwЋ^zk+>XgՋʯ9o`8'XۃbXxXRGNG+ewN,:~s =aٵ_~L50\p<|"w@@"AoSmyAAv9yAY勘9Pv5.e_5~6B;x;ģYZ?^ݝa>sx x>}ߕ*h-)AA yX~®pOxEļ P2~n__a5@+{X]Q( `& peW-eU1z`u|碣bp-c9XR`kxaR/MW3UuYn@Щm:w2]7Β n c3$\ɏAĦ}_',W!{{xPOrէS@-+QnaW z K$Sg$b^BXڍ`LkYhk1O Zٿd?&0$'E--o/x\{T ۥOk?ޯ7ki ˬ 84t$}2}:z y<pKZ_r߮Yٖ=g9G} 'ŃG+xqr~j-\eLXvxaIEEEx( ou"zAA8!2} PG)!2:֗ºXV/znbV?l8÷tR{Rn %:f$f>s`=xc^Y|#*>x-lO1g: ^U'3;OnsSopJW2֩=~~ǝf̽aB`5ӮNofdM{ 3 (;i+_d%7f,FqQ\:y aWkdA؝pft2d,82>Ah}dT4Qi D _ zF_RkE^\wkrt6GRy6l{VCpM T~xpa*4280Ll4um: JXSa`u:*ǿҷo> O n޷3HKXNGe\ΣchW=v}%Ci]c?۴9/)O'o}e`naO_aa9ol䩕)\t=y M@9da {@۝ױԫXp SfIݑ6૑zڗ;h?w8YWZeRGBc^D[="E žcFTۿa &bj/p&wЍ`}UY-:PO<Wf{8.E7 =ݺ,9lw?ĝ+9>ō#l!?`oˠqs hcMnZIi2\x`5,u&(5,~^8OWkǹL.t+l)duQOab  ֲdIs~QK1>|u5s賙:ŲMqZla74 p ܰw˓|7m:C:wK7apdEPlwI>~ 5^}zUן$|ԗ,)4N<"}x>G]U 3aswg2 l}R=^GrԀy):`'e-2jFSpՔ4`s0H'=>+j2~и-+ވ }k. ž+(1`p >k>YZ)FMuu>嵧w{wƲh5k *KXߋ?~+(O/Y`S?{EՆ{fKz BK(T |"""JAłҋtNzIH2HdCQs͵;9睙ZK-l\Ǣ73 k9%"!ѳN֐xj3-bF d qtp:mRSE,R/1L P=M\JSE8wo--3[3S8Ѧso9'fr ]lin5ݮK'_oE7>p@J=W;Ԩ ,*'R,tyy{5P#`l rq+o /݌MK73۴fMX!T1_h{)%N2ŕ2bO1EӄULf-b #W4u{K FC3h}iwT56rO:c)<9K;͹/Kdo8lbdpU@@OM _(_OdNB +(((((!f .$SZD"[ҫr}jgs;xi5i}XI&5x [xYUX IDATz3 )'Oh\D0Ż"A6}hіB/phGpǼVl ClX~" w5Go+I6kCm H}GVpBM⃕8Ν[愯1pfn2DK4zfu߉lG GDYaڅ0PEN|t׌Fɫ ,WG8};sUkҢ~Mj٠D0 LwUyszw^ ʾLotH`!8s/TekeHc"roZ>O-ReD!Zиf֥i|U+X/`/&r#-bzaT`Y&Av/3~6_,8p@*l%P\8fgkH<+^T(K bWL;$MmPQ6QtnU,uY7i,J_*3glWNEq'^\̛UXHd w7Wѡ"6q꩏qݮ5܋BV&ށXv.b@x9[*Dؔ0A"ܕ+[3Fz条T;-뭬mև/RR`RgIe'9hG.u|E =.Ј6)(Q:i3g!Y`khM FS5H7{Ro|M9 jg*v֋yG2?YKjm Zb |0fi5j\*l/bL>Ϟ뙓Ww9 d" Ӭvnis6FSgpP*>ۖ|*;jJtlTvp,\? va(c·_P|-jWPPPPPxÈyQo}.nSKu>8?4;Ğ75 ʑxǦ=I*K'WG?pcd{|5xtt)9̛FFe{$ |򭚡q[c'n *;9aCDji_ q廕Iq[53^uU*Oe쎝oڅ}ٺT{Tyfڨ7 ώW[K/A݁Bַc22'(9PSyR1( /{ߋ$Ih43l^L6ހ^gǨtNō % zI;KrR"UĠܑ{Ȥ%f~+[G퟿5%y/=*¯Zhs7VZ.ը*DJUS BwQĶ <|u0 BV8j%+[٨ZV6sgNq/"vTd41Xk`dS`:n'޺Vs(Ro eTT/yE["V7{[Y{<>|0BT3%F M|N^('!Pļ K@6|`=BhwS?Mh:s>%bp рP %>;)u^ ?Z oiB?o{Jf)<=XA`,!(6QPPPuI ?FX%TkdsR(^,3ZirQ.E+((((<(]׿tDs,JFAAAAAy+(((((((cddddRQPPPPx^Q? [N8sFz9(y,\nd@B؅)xI\>|g/ʸyA/Y^,|8流WPo^?s.c|`xs/>iAF_qR.hR\w6*^_+;2qyϻB弩#r6}J&)(<9%woOr%\Ŗypltڒt|kN2c5s:{*>"޿SӞ4*^~eȝÿYe:B kc,=G#q+ub`(y鲠L64,%GM?kЦyw/\!!f^PA5frN+L0ӧ \2m~)/?bA',$%!%.FAWD_GVco 6D ^j3n]E+8TTerlՁƽJraUm]LIG B@k;Wu_&DbdMб*\;4tggwD5p"gZt6>t=-QmzS= JyM|^ظڡqVT$|B%,bee (oU'se.LμvBsG͛l/6@ABE[O !z:zi$!^=[֎ϐlVcF[lQ(r~2mdM/?rr}Q]9FG[? \}+tyg8U~CkDڑ˻S y:n})Kze!Y4t=L)n*3(rl^raBXӏW jlcV؎u-9jm>ocl]uįC7e}5‡,`Z7?4$| 3/d{؛2ɦۤppLkIpw׏sO(&c2}qT26yS`.* q)|ѕ+uH>lT>\CuɟFUH=?H)wɅj %}}/R M+ES'N#i: ݀o`W]ھLpFNwH))#哷Xpv5Z#,>cN-K#slt oY_&W|ޫ7j OC/uZ<>woQ  / r>A(R_T)- PX}ʚа>y;8>{v)4=G{<1!׼7Kˤ/hsqfYgo[_"Mi;Yʐ!lV91hKv-;s_.Oat*dANn?k2q䚞fZ*:Sߧt qiro /C^؊/nZ=k1fLvlԠ&^Yu+.UhQϛO@_VD! Wssyk{vt2CyM5+d?1`Mi(pgrRt@رKAC_N&eZ=5gʄdTuB9JECߊ6n.hkKnܙdV&򡨼/ޱŜW֚}Xy+5c U"k^m  U rDnkϟ'#7NcZ8 |赸=+2jU[ "cq ke^AAAɉ;w+[HVXh+߯e|9s2E\?y GAZ챱5<ŽlVaiBAM1JT8Wmۖm$]St`z|% ~A߯Z# R1L?/ Tʚm?{GquNext`K#czȭz%S'0aL:TWN{7I`/<^(h_ )%L7E(:{ph6n⏣A^iܹ֕5_bv!:ۻ4v^q>`ڸ95dg'- =nmJUw, 4uh3kKq&ȵm;poWWQٸ脕6SPPPxbuX[ۘ]YB dY"X9eS7Y K]e>kkz3z_cA-+T7y1@kѾ5`xv,.!o */]3MqjԕɈAVcھFyXm?bSwހڗ_.¿CS,G|oȮu˘==sweMC/z06ms_h*;Qz+(((<9$)7i,3{N^9@ԯ Q`ZE{ `4JϨڛ.q)m Ojܫa.edI VUgQk{ '`woOZiR] KıG{i'X0ޣP^OBA#fvXޭU%"D[Q4n{؇ ׊׌fU%9$ UH #ýqή -TQ$ܡYOYۂPˢ<MQ >R&<~bȭ='QLiGϘ|Q'qJKy8] ~FҕurE$Igm9*rSsI^oޚ72vQ'n\{wʦl>%[VGW}Q\YPm1܋Ly)<o G-g-Jq% OߪD[~^Nnch \{1sW 9q/u\ݹ%+6JHp\g2;u&S4 ή2r{J,ȁ[F4W\zv :RecU{=z7j6>c›OKwձ ,us x$͚U{&n-V%Y[No:k~LOz=ƽJvAa}7&~'}GSq^ޖs}f/=(j|VXQkR.c3S={{BX$!U7q\j/Zc9#WԐhZGA&YLx$M857jQ(O);t gؿe5mHQ lo`}یyUvE;# 5kKPUE+wT1_-7ɧ &}DǕ틙b?n`ߊE9x(|Lj(mXsCG)Qcͅߘ*@|1MŽzmna;8wj/J[qu3+Voޝp4hpIc+<x+k>eDjwj`~qoZg%G)r׮X}fwF旍Ҹje\%q;5Yke$Mv7lXx_qRV Y=CK//mwFVm*JT*(n(W&6 dv}1^BKDt :vkAyhO|ܭQ?KB/.46R۴cMxRoݓ:u7e@Cț'Y+r<]p2IJIRSeK7CI GXFɸ^USVn״XA\Z)/:QX=VLbJ=>jԶy4q*`[1_%,us[,a~?6O׭$e)e<Eg^a /(Px}DpŷiAOzSƗn4ٳk;wmMK)Zyj)7Z7myƻĮmUiWMy=>>@ćL]q4MO`ŸoH0qF2~;Q IDAT~FMT.x~>, .t' ۇ`qʜj~H۫>\ a\5Wkx:ʗ6;AYp؊^uF֑+~ ΰvrV-~{>!ktNkCx.9ٟ$Ij rz!{uw(#;vtܿyMN#9զΩ#%QLQf@xZ`K: ^# qi6/G U[Y;Tb^PcEʚ\D񋲑ӞzVژFl]/>DZ(Wx~k8e$@߿cN,T6{ k|h5sZ)/$ymUey@OuvZMZ~ оDȿ/aԥt8gl⎶"=EK^焀Lw[ΥS|e Xk(E=op胭LȤ|TlZ2#B] ''۷,UY0m?cvlR=2or=زkNaa--9WOgKOᶠB:+( Ww2fpX^Syq B pϡRB;֗ @(4/֝|ʅlɌ[|Du|\uG~ ZNi/oP6rȮYnNhض]Ƨ`r]%9 IY9q% l|7iW1"뮲sLo;IN TO6bgנo2a[I¦_y..ʠuj=+%!3ΥM֘hÍ {5/r=EV͛hfըb J9{KF4&]ky͢] f6$>=TUR-)^\bQ m>_[ZL>8>IL ochCVx}K c[OGڒ|\z,Χ҉f_m̸IǘΗ:ϚB&OwFMv4V—+`f8%)o} sn#tD)'6E+)HHXYP'dWhAF$^9л&Gmٓ\1HҋI(5gZz rǙܹo@[-e~ߒ^lA`;Ԁ(e4U긱7~]W.ڠՁ&S1'LP&2/~x#5"] $R.{iנ7XIz2rE,bI-o:"u|uOzq{nߩ+p`qzuwyǜyYePl}Nżl(#o@E+(0o}˜Y>uO[=#|z+ 9l5]ɬ.{n}(ޟ—Nɞ^BFLd}! l5X-3B2A5Q8B\rT r6W(VҸ|4ɾ6{Y7s)sO{SkgIҁ%X-"p 383&Z.m[Ȃ c9C,@љc~5uqR>!+73F^S9?3w,<~([zߙ:0*):М4Dtb@ 2r`BNߔQ~60IoGE"~o,staP mts@t~t Ct75 C%()޾%L5jN>I8//[K~v/6;jt q',ysr4ؐ# eR@p>ޒ$N%?m,HKvrv^yN]N$݊$*b.ܤW EߝDaq%&-@+0% kj7AL=ve@UH>4gjeq,:bO9\c M^m ř+5a}(1ٕ&2$!KBNgrW])SkYFx|b(֞Gs)9L^ٰD޵9cnHkթ*ޚBy+#g-/o1aGY1{xs*yY"p9|׬IqЯmeUϬQc&*M-yW[SנM &0&}p;b9Ry3ByJ}Ym8'_nYo6ѝdKqQ%>sd=:L=$g˂Bx1Ԛ~QDeqyGl=u f4k茘q×zamqT$BZpiR@;~C#,t PzY ?.+wu$}Zg]Ξ bInmK[R  ʕ>nEt?{YaAVڌ4؛־R9-)v##v;AG%m`N_CӬnQ1eX:] 6 8oq")gAAQe2oJŭ'$.ߏolb Ldͤ D&KK)9ivxIEpﱼWגk ݶ#6=F]-'gp~ŧnmq?}*%bޛ3C-Ϣ88eX0oЧ>1x}-d._5n&˸%gkYn~hIf^r'7+0d|"MI􏙴גhPH$sxw,>G)Hjӛת1e֜8s&l ?k_%|R9b*#/d+7i=К'Iti ;P+p9i BQ6{ onIEu$B]`/r4mFE`}'Z7HLˤݣ7MR*78^jnOmJbyhZPY9iwj ]ĹC? >UqL>_iTŁ7v~e|ywo>WױMOm!%gǞ}0ˠ8p _'3kr/,+>o'*}_7+`7G">aYب'zU6MZ*5-z$ H,w=P٥d i$BPUA. %,=(XQp:j T0Z8!hqkV3m*h t 6JA*Mf#fObe  JnPI/ξ%]Yt-315[MyE_ܴ*D?{T'_7!-~M[af M~ĵνp;:!ŤjFLm ݁ Pܗejoe0;ُre ހdKmOlQJ$k֗ /G9ddtHM: E^]~3X u:ٵ:Ɇȗ?j笴ʲѠǨg]T `KA?rfϚN銽Nq~6"A(%2,ޙBqyKi=? k;9bI̪LQZ拪#SP}( >!/y7eWw[ 0wvgҨ&b֐^DK3Y5:8ਏ΀^AOQ|7u z ᯿0]3KFn>T7LZAC|t<~˻wJ_x5v][[E:h?[o֘A.>E w.pKp3kv6')I6v]V,ɃsFowKntj,pcM1i 67ʓdH1pQ|[PaiB].`_V5pbW)N=0oGlᷗdoz݉[OEXG>ҹ+i >r[ YܭL&Sۧ`Œrf&=BpekWCDnpZ7rajp]MRMVEѱ;O4u!ˮ{Ъ_$vQtnU,uY7iU(^jkbؑ&hos%ՇByxngQwR 4Z5C~D"d ]`#3#~Xdkoc9u b6,DudC*thKԉNw4J_}K|qٿ+tOV6/jϚYΒIꄷVX.n.@Ǔ>8o5Hy*MҲX[: +$Ɉ!=?:LV}!ߩRsuzyCs R,<PHcIiͽnz SLzFZ,:!̌T$={gIsf))B^?^uiLd* &*{*>\^2!dV8ZKs޸7y1@kѾCgS{4=U?q&KRL2bSL]W?9|UGtN§N"IA"cV\_Geή|?ےJ#2+i$jB$DEQADV bbAQAz{ I}Kr3envgnC?Ry7 U0w%_iѷe~Z^bv k~dTHfcb/ ^ Xv*XȱBpC֏#x|0~nHlK~pteC?РqUHZ KvEP/ܾEW ZFq[& U{5FXfLPr!|;XGQ=5OKbp4rR>aoo^́V<s CW /}UizOO^_/Ѵ!|4[żԄ{X) q-*!!ٹB3 IDATk6 7r)P nҏ?犉q޺=\U`5홪)vo6~p? =Ogw IiҫS`^ӝp=fw{:́O{=T;EA1W#O ޟԖ?- $\%AłC *mhzz(*6U ag"w{v5VZ&bҕ;Ip|rp~ WbC\`ÄDnctRӗLMn_Chg"ۖ¹طA?KYҹj-$[o b$!ʝgPɟkPJn07xo71?śfZ:,w3]sZ"\WCҥ;Eyb37|?gϏ`̎Zhw\i8U ["-%.ף}6StGW+6F0_fɨoNoiY!khR˟:BƷxI㋊߭q}>3wS2iwumDH7۝jϟԠeC۬I,uZ‚zjw"nݴV =6aZ"|>7z>ݞ5X&I沤=IXɡҗl$B6-?JUUuKVmfáM9 uW6/هu9o/ . ~&9Wє͙CH'saͼ*Loxu|;˷wC(&V2ϧFu7d}eq燢 ydWTEV>ıeg{npxOװ{q}!g DQ_+L?Q*o1bZz_}_{۩I?5:zqfWMGb0o}humn{lU )EGBqEc_ %]W99GeddnJ:pS0]d6a4]d2a00 FT`p*UTUEq܏* @p*sߎ/`P ñ3ᆱ|nc*w:A ʼng ʉ {7II^1A/19[U f|XfC>r2+EGظkGJ5yo } D Wk2) (ZwleX,UAuFxwg2^(U~jm[^Fn>ywaPt`ǃ."<ɨ:b7I =~73k\8ySp^C> /edawb$ABZqZU+Sn=B]; *+~Y{K(Rg'uԔdv܎jFlÃwWF^ B-pX0ُډu<5v>]AYA׵kρXjbmN) ~~TAlZywS#}k&AAA/'Y+^!WQ;ok u;/   Wݱ_w* j+n=    \Ma=*JVq{#/UvkΌߓSsI,14157S8v=.ш,=ye^}XDA^Q$Ky%Ui8ܣAAkGSEZ6z:>dDFV>Ngj`ǗeGd څP cah3FtL?+ﷀ9Os >KjȻ%3QȖes53Q|-mu؁yC>eKeg (ĶSy:^\H=8OT>7 Bv~ry<zӻ0r,ã/, ~@w[|f`]>J@eS^y#}>[ͤҋ3s ;Aa@360Jj Ic}f藷xsER wkճҴ=[~~ }%@  PeQyW-l ڳ(ߐmYXuzK'$Xhzs@uNJZM@hND,z6jT0r9ވ(_{oVdoa`L,,ދ3|} u>Η3Ź1;6ɲqb2"jNy+ν‰իILG].Û_zFQbPAA(Bw!fE |AH4/,y|z: nTn3^ɫ2&{}@K#;2hw^H{KЩ!FW~mį㎻EѱeQ݆ ].o6(:O  Ul^=j,}t c^lގ7REOoHCk8׌Q>ybxϊbӽcDgҋӧZ*x#fcn4Sdb0LTjZ߃ ؔ]rk>lb䉖ׇ K(<}NjКȲɓX {  J1((J-uG?ȿ K]IJ%qd1ز|?sжgLLV.SW޲s[q]?6o`ס}_4gukQ9r&3~[֬pj֮C,ȗ j#>Ggi#tb6:>:L_gֲgR~}6/<*6&>k! ׬e#(qu3MhS+5?M9ĴmG_{IC?Gذ Gng?iThђ}2si5]'uS#P- ëe2gR_}쟛*4{%v$Ęq3XqakؑZ]G]{T+G+b_{kx\[4`??U P>$؊Umkxlً]]]{ 6Oi4m"? PFXm5!7  *y_b[Q ^vוh{O^}^5v\h: M~[r^$ꍪ(uRF}VWeN|R@wl8͖'XVWX,t#Ŋ%7 |y٬E  4Fzq}̮`20`2\Bh4 |ǫSԫ%b2a]GE- ZY%vtKۃ,$e,N  }WgOA^Ѵ]z9SQд2ˍy#ݞ{A?|4sOb_A հbq2-…}μףt^/ BbO{w{c'_AeuZ,ʨ/;.EW =Y  n~hk>{"&bmSjƹs:NY/A#R8s7`7/A5/nb=q2)4KA_&g? S_"/fTv:R,=igc'J-e.5#Vymd/$̜҃{1(NZKJpAQ ǹ?2{"A{O6{Xq&#?H^$V#re*Gc(i4-z{\!SnjasX-y# hxcm(:ԄV«VJD2P\-R$\Fطo?/ /q/s:YyAAJb#US{6ᔵL™ ֈ ݆Ik uy{?x9ʼn/Iް}憼R;uMo2JSz Kp8L\-ZWA8?~KDD~-=5kz)[etμRG㍈yAA(Q4O9y|#C[;l;[RI`L`9ƌ^aiyml53VhJ6@AoR{;aeD~P)]{핽vQ~x)*FGځ(ʨ721ޠQ$9c]ěJX5j])lK Pj =(=ÔOa.dh8wTX[{C8k9ԧ;Lx&fiN6s2S%(-=mqĚʖ߾?q$Mm/х??j1βu7L} i` ".7BW?ҳl xLμoBרVo~,׺?p &pi&L?N͚5Q m/$w^$Nۗ ъc1'XVͤqRʮ4Y^-xj i$3 i$a̙^ni i7|k^ !+aSVk3uҹ!ԏԝ[HV h֑Մx8wgRK] [`U#϶od$*>W4SCm&z5AsӼQl΁^νmd³{- Ajkk}%5%t=ξ-\o7WErl YxW>β}gh-$#4L_J5ɲcSDl<%i [Si<:֠V'wpLa 4Nسvv\7;qǭVv|w^8B6g2:#kEJ#vXhش"6ҽKvNԩ'p?/5 B͏%H(A[e Ce]/{}4 B `FQsTxi6Sؚ[bPS)磓u>$TVA ]CAÀͦ9zu]GӴ܇ݾ/7^GW4lfJho~5^9wbݱzX<Ț 4y~nѸuE_gHlE_Y%5 nFF+ul9^l-inL44œ=ig/^uu-O O頠lt< B͏l(czEQQ h:ze5n+dEzAdni`7Jn:W'U)&L.iOUYvl?rmcGUwwgOc+flJU7n>Mrر'c嚄盉lԕG՛shrgehJ>ňW:*bERU͢ +ylV{oD=mg^ua5dr IDATUD%WH1ճlۚEv "He3O9t,:y!^_%Hfx[>tC3esk:OnFO  ҳgWj0-ӼtZud5]H'[˭ i<_1ZiI !ǎ@ɍ}jP"bd{Qz 炛ѾVJ]+Tp?`: Gsj= 0|v$B5)xgo2'zUORb[x@ЊU~a/ڋFuDLmPU+ql4تV#zv9G{?֐ݭW=]=1wv ax_E:2p<*:Ԙ:֋B0^H!rKZWv򩻝.MŸ}^i ǀښ_5#9mzӥ^挽+ݯsڻjFoWkZ*-+gXqLY뙷͋WrOvIt+ :C*MCR5@wΝw EvG)O0Ҡw-UԦl3f0ѧ? `;{HPts>y;f3M>GCƒI4T_xXneƤsmWžHZDs6Zg:V5]cӀ݆q}PILc ٹp*UMd,js?-%O^L_'ҲZNn%揼€1g,2(EV ´? eUCa _~ \ա<'FL۪ D|P 륓Ǔv?g )cӄKިzɣ!A(~_{P؟Vq,|( +sbKA.pv֝C^Eec._dZV&9m0}\}ayz0]qom{s28g-s%%j9*տI_W?%裢>L&AB4 ث2Dѥ\AZG]r;1m˒*z[z];}xR#o)JyeE4JKj MA=}Bѐ0ه+ZRx  zݖh Zq B)ksSJ\hNn b^A7fΞKM+(+y] : +NA֭ZAffEAjEϏ15Y?;Kļ &2o`VGz}3'7^ 8{pzէ`0aM],wm̩-$_!'k+}h+8=VX!ĺbſ;zwсKiW[=}U"0*{ N_므nsrn->NJNӫۼߩ5h0b =a1~b Sytn^Á6g{YhK\,r>O%c :tՇ2}J'GgB3dJɟyMkmBrdR⚿g?멵ħMazi2rA.ޯ߭f'rglC>pPS2ulQ㛆g8d%>М·U=$b2Pž7̎WNZd_ף$l.g{ [26,JZ۴Ưfrt<4j_yraDRl $=WR6Ɯ8_ǝLwAA(#"Q<h;/qwU`'-Aut 85C1>·6դ4QٕaͯIKI>˛midZP iZi߻fo[9ߌ׿ -eȽ/5g*̣rE\ Խ9 ; ѱML)p?>)}=3ʼnb(W3gɤR_J^kgMԡHQsyAA/%$!vECfcIO97a_FD5Hus6-m3|eKÈ5[pfJd̀Ml;Yt-Ooב1EVF%C%uU9PpcGZ͵v'XO)J&*Gw&2} "7#y1{m9ԷZNRv"}ٰ{fb^ْM[_Iʚ5AczA(1Ӭ9 g7һ~wX8zpsR9qxA-?׌1'N1\ܯKhS::NE¬dp,{~F`0f='(b6şŞӜۻAUXy`?iTJLVPS1GSsK}baLo.[#%FG]#`;iMy'z%\z汗=zifsl<@wcE q%{EQlbkLF΁}̵+9!~أ5LH}|@hCrA( ?wԻNw \JCKq=f*,E w;+pE'6VX²gm (.F>!ε}nS  װ4n4Բz` J{!usQL&)R&i~)\Q+$1_^)p g ;L!¿VQ{dIfM׆]x 5 Z]Mutn֔Lnm՚"ٓv|K(ekgp>0`=Xn2r,זo[Nw`I,R& i?\yŻ9\~bR)x='#?A(U_=nu*)io8 <׬P5<[2/!VP|7O ;@=ĝؒmqA{֒E\Ce[8hl96Ԛ^SXϤc=N^SkR^CYsMg5lOBs kDϗ`h6 p+u^ėp 47aD+V1_̐Ư6~ř3 8ݦ ]uզQcVPK[5 s7LZm=ߛrC)v΅}Y},Eܷr VNo+U#03n|i]D깵@ {!J'+16N7VܮkGz>+(zJ1/ o$4ʕ9\1"Ekԗ^c#D4mAL#OĿrUfD͗^̽vvE>]$2Q(O'HB\.AS?e?s>AʸBKGΟy۫+j:TMnpQ:aTFe椳h$В*qzas,j1c_-p[;U_B,d9UkF}" =ʉ1oPy("hڜ [6rbhl+I#9t5_ty=Sghz;{kF \ױCx-OaF@Kf㙶'e Q_rTIH|_EZf^Jg^ĵ`(v$A $1ymTz$b >'6A*%E<D F-ř35?Vȗf4mtg[20I2@7 _['S)1U#1 25ռwB26[ivkk) ˽ 8W>6V> lO4>ۍX z,]A46 ߾ShV._CRS/ϿѢAB{n(ouyӌx:O_0- O!W/h .0)*z} 薼2q)sP,i逎jqd-Zi^h6 +rtjZr랦{oiVQ ݶzGMIL~HԄgii#5F偸 (iF/k'Jk{:Btw*\./}O/ӿq* pѕeqE3|s3͓7=G^|).+HN9,jGUѽSWi=M31Fn>zL'3xbUv[nDJv_TZV_?.?G?˂Id \ĩb9nX^Q S?mk N'ecSX?|&<WiCyhzE:>&OukjδKn1! ͠Gix8'hK q,<_ }BPZcHT IDATu`R\Dn|rl`%ۊUU8M[l:GΥQ EsO$ǖ[lgq<*7n/ +O?nL1iH$6]ʣ4iʽlju F6c!Y]5AV..2!$+s!ϳ'{P &w&q *4wжZ[bCc l0A(!c!53Ywlg]tʗ}IH@Mf]R.\]%oJvd9Ivѹqu4=/yU8=O6PS|>v^Ȃ?͹S /M9%U?1܈'>ZJr6l64@sjec=F¸W{$^ g\J.a 'UhDjMچThтe3RQdBy<{ۻfkICp4a\ URXvZ4=w@.2!܇s;xjR.!.OvZZnjwQ]gsˌzC " z \pOq8vv7mSv7N$^6qMqqw){ *>;3M[kν{}y=KݲփdkVTtsz/J]#xpW]MdwqB8RxoDcX™өy{9ǔL0AѴiLO8ůҨm BcRfwrܱØl!؎ -lKDx$og;Tv')B͉_Y]uBwt3k,fCAJq,JO쭓]FklbXJm[ϩXExQ#,cϑ}7yz/|7>#_(z痧#;~$Ͻn*?:>Of`L{Yof3zg[d~E9yS{wP}uǨ#{O=}DAve3zZ4m{GVr(lR'MֆVfG< ac@RxD;Utܲ.>r' ,&37 h6CXm{ O8x6ΩVns='uS,/ 2|0&iw%lrzEv^ae'o@A~le5'8~)y• |/jk8Ȋw;XxVrqv""/2x~#uשo>π^m@q_ ǐa#(6OԈ^b`xdNGVbH<6[eg 3t||ҏC1ZjlYH~nW_NDj<5l[w ]Dy(+ܤ=L+b`Q%Oa Y[c|ʓ||̨E5[/`h_Eo?˛oԪB$vX<2-q.s"ؗ!9Prl,YMM㪭|gB o{lװ5 Ҳ9uGs/TƄ?͔ݿቯC]τ|F=Xi=&]s fvyzsͽ2O)Km>N&ۡ]ۉW0/D'{_BE"AJ»۲ìA?\,s7Mv9bpl3c!/(UrȨ{]@Ma4'$wkËo9ff/d8e z~[d˟e2ُ?Aˢ8?nV)Ƿߞ&ye_PݟA?1aC9'/'z'mf9gn~~m>Ϥt}rge23_<3 zc2Fp3K`?)n5':K~KNG~ sGJ-9's`)s+k2hcn%LՏ{gwo F=+ox[}~|>zy}}~/}o/~o^'-.(ZW{0 בNdĀ E%Rh''3HE0>@ء˃m^WW4U9愚ZWHDߓm.+((((t[!UTm\"n޽SzƈAw)Q Sme9ކatH؞Ǻ;[:@5jN9;EЧ8^.5+((((\5V<5@e'w/ -n/ɗ"}Ş׵>J)Bp;>&;f;d^D])0 '+/QzE>#;/Uv:N . (eFAAAA{ 9? |,ȼէGtDz_>(RvOCJQPPPP2I~*o>" W pž˵s$?;d^t\ ݞ'"ɮK"էK#I-wt^!((((((twk`QuT\^AAAAAEdlЋ!{ORуLQd&~h8!;|Xp!-Tp5y!9/ t*)K\>2+(((((=Uє̵>|^AAAAABPz!;zuH>U}Ru nJQPPPPxH|g\eɲG yH[`AYu ;S WO"jk:Y22 ^'IJ'sOЧV鎇)B^KYB) m;\Aai_Mw)%eE$yax=^|^~e,m~lƶlŦ3g۶CÏ?ksT<'wA}@`l(!-{ل !4-dqRYhk膎h[ۦ/E"x~ Mr'Nfa\hKD.VD(Т}E1ՆE)%BA١,N-aDm>m;yv$q'An6XT>ɳʹy 5lNަ~Sb_AAAAӬ=52x?N3M/M=3Kef=oqS_x/ܚI^έZȂ(f? }AVĪp_D{cbF>i&,+gP̈󓼶,wn<nW[@sB]^^C؂19 u,bXmV(AŮ%-HGu>;`{*W׏Qj/~)-^̝%Hk̾ST>}SKZ''~2lZ`6/}挧N!++s0q`4Wތ֓'8~,JLgHU}.\>ERbrW.cXXÉiǣdz8wǩSgHe#✮e"" RnglV|vz#ήߺ$vm`.qskHo{~>vǏ#+!em~|෰6{&S86ï?=_tk0K<bgL4n|Y>:6 XM'Yç9VgAi*]Nߛg2(\CxE۴|?~fix|r# 0F: ^Kem 9%qǺ ^B>;Ϟ1v>{GqvOv#R56qoyx7}U=ur`ۖ.5MsHfmE3p˼9_Drt'AdB&lFœ`t|BX#4]d2C1hU:.ZgژehRihz7!&]]!j_5E߻vzOƈFF23ڨ>]ݽՊn.z|\+uk|H  pBNԃ2;HzNÉ}2~nxHx۠5`ÕMAVba&3v^)i7pzWک+<":q1~ZI~ҭa'p?'H-]hpK/־,lt}n+]fr>HFuyWW<(j9YW7G/p㜫{Z^lh|oμ]!؍ض"pЊ}a #0g>˾q,[^V N ychWVnq7N܌/(sO#soph>>9=BN#1!aE=$2޶D<ٖ6RsHih~Ap!w{=H5[/JNm?XvЪ&X4:No 'I _]Be$ QߵkW3YM D)2W}wϱɼkW s+'䚩x'&x2M\5~/'^L} mJB*!D1("^Z*oU wF2`߱&cfb3*6>ۛ1Mmc$OuuHѦ>?[ϑy1bmjW?Oi`7Oi"q4mx,\54=.2]s׿]ޮ!5J +S#wX51&Ha4rսx0vO0+ {aDћ,{MǒIi "=TsË4MCİ^"<3Yye8x8nY m5y oGmygr}^zv7=Kpx^Vc',+b!A Wdqӊ@Չ|: וg9s+W=Tn9 ELF*7`f.d3zRoҥE[A*6㼔X6g4_`߆=sWܶ 6zW&MȉؾPD n uvJ8~*h,,$.CCԟ`旅 Xm۵ / 7y]lXB6.au)Jrn.*q\0ib@=qRH]k9D,nhD}>XIuӛ׏o *Y"++ع8r^#T6bCɲg|d;TӦIÙ2HV;~_f -=v$9‰uؽ<D 'j֗ +q ]C K#05Ɗ-lpfw!E9M;݌O䔕3jz?r ٲ7C\-U50 J}E1'hڻ-*ipepNz~_FEIFyuRIg4 IDAT8#0\@Α0N,},EGǿ,ZdxѿNJGt }D$SOzlTtUDk2^}b#nb#{f*~st"t?SWg s;xKO nr mOzdϙLkLz3$N^qf {$mfx8?|W_brv+73[n/yg SرeG3M2ᆦH^$6zLτ<(Jf<?~36=ۗK,;e}D6s_KVz;o zZL=DB}}Zϰ6/F$ш۟MaȥO]ֱ "Ny 4M}u)\C \Hݻ9:JmNn_6_p=7OZZ8[? /ʽ?2n/}Eh?sn}yj{#̫ŠW/d::~!ȟv-S>5 cfBӡV̿u$ȉ2Gu[+aS|5Np3$j{o i<grݘtmѓ8]y 00\iOCˉ3#qg^kֳh>t=}$N-^408ӛiwRt)0rd2LE5ӕN]M l?u6qw:c>8Iz=aJmbxZvmCu=(8֓g)G2~3f/񽙍8Rv=N1C(t Ju>7]3+q2;㖅޳?˱돱enOyɞ5{&o9Úç9QYJѰ2< n>ŽΟb<|i0F4;a_ƭ)iܔh:-/}N v޳͡"2t|.*ȕ&?i8D}$ky&2r!gS6o S2-'qn6L)"oD/bV˰kmQv69e>Ė'ط)9hI\ aq/Z)u0fgwpp>A%ޮK(1ngojX̹w&MjN&o=9ڋRa6.դҰjYq^r[?Ƹ@ 7獣}RW}syzRpdynzl.K̞9~߃ -e[ݿ%?;CΥ4=M J{ωLr wxNCÏR{[P k"TS՜`QFvmœ3&Li"r\?BiL*]˛Qq~+V4#S%c(3Q*x#V@!H?V² e1e>+:&,r02㎲p~=}akٛQ'O<U&Lrr0%G0nd%+*PC@wE }v}KO&vT4Гֹ}菼rn; m8b|J)A=S.Pd|7V\Iz,w-뒹G/$ZdHЋ$ vC|; Wt 9J-("ZV.iL{qƖPL'wp>*o;#1YeRWy<*Ǥ/~s{!NٞwRWG{u6zs'= e撆E[?lx'73AaX$'45oc CYy6~kl% n^ϲ;,RG'#"mZ0e(H /-^ኀ!B p"qdumu'iyC8{țntLJaj^sȼ[RǕrAt7IyݱghHdåEXy^>,itT;` CXRPz%6 {: S Zy>liN7ORIOI? {]TD;?4p#C1?@:UfpG2̿ê̼ǖe{8j-GVQ=R |VWtޟϱ vyqOA_-f2)  20/Jz=IKCH) 7ABGțO緰l KvFc,?>[takDzPR:a4IOso0,E1M,OW­.tiG0֩@30N72g`GR= C2#30 .\]?w^ mm6*l'Y…袺14IOwj:Sfh˵⏡w_i&yeU6 om^k3v&6i_8uJ2FRiNJwp`PdQ&o;ߞaآuDV)c% vVdg!ĎZDlJR2#t|[D$ϰ6hkdH$˳*>|SdR+̈-(1g;:0K%Rwk~.Ö(+1Zp(B8[Ci#/', ۲ؖm/!  i[4l@=Ӆnxy0f<`{@;Lsmx:"`o<Z}9MG̋om|(; Ȗ\lC ,~٥Sly3䰌s(2"|@՛|.`,HvMyY.S{ȀMj]TVCvZڰ3M->̏1ʄveKB]6:*޹1{99,q$6i_uJ6FRiwha /ٖSԛ20) ̧6ּN~-<&у=fJl7#N@e)ԹcBDyY\xR Dǒd$Bu$c~,ipY3DUm5pBc$_dɆsZ<]dXØ3'7WsQ=,[XKּ9 }of+Ya̹>܂6;Y>la&Q4ZXm^Nz,A$63U4$fzV.nQfjhmg&}zq -49ɞ/_dH7 Xv6!"^zg3cÒl!OWp7@mڎlkɛ##%F;=Y ش^9LC/dfOlq?C룩)㖇nSq6VmgKg0bR_=Li:*3b>[Pf΢f:5>V-'s:q"(CB\:{I4=Nu4]s~!=uCG6cfNN" a`1aB6\VsK'0 !麡ro矮+FzD?GcĈ~M6Khm=l!&Mֱp3oiR+C7tq #?'dXŚMgi/m/K4r39,$&=M".ԄU뢺Znƍˠa>ZEŶ&2Ə2nƋ~L_/vʓ'ر,6iir'֕/c)ь&= Of%Zd>9*ϕK:a蕑z{놎k<5M5{ɦTl!kJnke{>u]&[):G;qX$(SgD&1mtV6H qn=]623{va!˗|ͅG9q}p=vZt&}MoSD[fo =q05XBzj ,ͩl)&C낺q#(ƢViVqc{06q *^;9ՄUwOr.a`^tGfKMp+QFRi*^[[O-aٺ'Efn{m`Ջ8Ő)%uj~jW-;9z "JKy-ֳfU#e͍4׋S{;Rv CF%^Eۡ >/ÊvpW#^Ht™y_ͯdӡL&}8.3ya|x˞Xʷ6Z};?)#C:{bhQ5kK7v͓mbӲg?5olZOC9fQ44Åܷm}c_$ϼ{ l̰]t-NyxٴOÆ7\zٷOp uʼivXBNԯ{Eoٙ29bV…&<% ʣǘa8Ofˊͬ}ƌ[C,o\%GoɗN!]uЂ7&,oQq3O[kpOa@MlpZii0OH$|yMNoGņ*q3a~2MpͯoVZjP׆ٻ'ڡml^{3u5{P;6NlG}8I=Ie{ް@MOph/cT+pF#CqtAiy!!{Ėeص,J 0O~v;ٺ6< x"|c뷱e6dO!i5'ؿn6,<54Ȟ#;ykqB&Gڃy6YBk:̖ܹ=` 7'ˌSV2bk MmA,6oaۮ[zɈ|&?yOuXءw666P(&~Z89<*i_6*g~>&Ws?w 5/pwp7՗1'_厡fWv:=jt~v?¡G/_s9"`ÿS8j{+(\Ͱ[Xw~U16Nc_MT}е|F];{ ޶.z/$J䓵vM Lױ0B+()ps|`Vxj7h]⩍|CK//T&Qf|-{G&…-숤yҩ% RDA4G ODIWP|xfѯzqf9\>R~?o)%ŋAcDr&buDT]6xoz)@A/U/.[{ʘ_jf!3OrݏćtG:/Rx{BʤxH}?@/k}\YSǔ }@ };^Ap?Em2!ۦ堒O?ϾޠV&+A[4^kGrG/>e>^,D>;c-4tyC~2^č&3ȼ»θ'# u,o|h]^#0'@mZ(x>)]ȼUHn%ŋGY;2LiGRt/RA_=y5;9o ?Rj!ԋ!E8/w"N;t$]xw6\-:iOkhq|raR+\Ű[غ`-^[A^Ƣnc<&fAvǏr/l]{խY%Y~5q\ɸbk w6q͏`V_ӄ>'e^%:coMyӫ4f! dMO0a"ޓ~/Y–fF كH30ӝ%уp}wVy{89w#2.IXnYyWQ?fɢ@/]]kvS F]vwQP-/?JR!^'%p+5+\bF nXɒa*3H2M\fyӯc~n 7ms kx5>)ɏ"mOC} ?lwA;6g('q-g_jμk2rZ_dh|hȌF.Bθ򼺆_s:QSGYuxIn!p.}=١#vA?O=lxp k. Ϫ -/>rN?ݱxy[y:{|g},=}.y֡ȼs3خL-5ICy)6,&+#wTݿDVX ¾,J+\oEt/p>~m.ʲq5iO[PC3^GևaI؞$2+GS" _֛Y4'3 Ws 9ncd~ Yz?}~YS>gVYq?w ؿ=5|C%m6厏Q <Κm['qȝ c{&m\=c£S:Yj97#F\V~q3\j[qy]j=yL3^c}z),/:poq9d p'oyiDŽ5&|}nj3O *j J?;t?K^s${,vs5/e|׳Sxs2̽uimg۬Ym-qvOF&fs-#71,?@} }co/ұh'S|K^` SC(`?W*z4?<\# X!#-1376p;;8҃ɐ_ ͙{vh+(aGPTb.LwaRtϾ3 ;@[XseVb;K&'u'%7VXVe[ЂЂЂ:0 ;33̾v?{:>ԩT}ێ3},* t!t.xd%fUI?w%sA\yFl, WOc]=5X\kdG($Qt"lZ -ES"<#p >} CZ[PQ \A?'t%n| c87h~_[~PK|}4 9yo$| y^z Vuຯoem$T8mZp\?ǣ[Pb ?~o>oZ="\{|-jDWp`r y. r1Y~ ¦1{b}_/u 6~r݃ Waiv{կ\u[pG p5uY:Zs~5ʐ[1 /Pz rGw؈?F]WQ{ 9E ~--Z|br(muh{l[ހu~Z'/k/t밴:@\HZn!`#ncJC^lA咅:*),.yUsX՘l ƞ6M7nĺcR{>7ƚ[1z˱~Ui|}+@e\H+]-(0bKN?q7`|۱s^SQپ{^hI=毝ch&}opU[ÊYhX56*b7 aJC}o{p7`ͦY83W qvx 6ɗ;akNZ ~yeӋ\rg|g,jr61t+ػWs. _އw a֢֯ G`|\|W.߿:j1(O[Ø(Chr=ӇrP4m8Itaĥ'5(m?<4}z~tgvk.8B8l@0Ě7a8dn.AJUZCl.s>_}zո Ѹ:}_1,G[JQ珡s-T 7?זag'S> *a<׎ĖWbE&[Oؓ#(c!-K<ՎGPk!9]՘wG1u'4$SlsH{*1t:*ͨX]SzSY!tnoAĥ^îXkk1Mh;yXpgVhX3Uu>875OV /^s9Ǐj8zѿ[uI yvuv[ʷ_=&2 #kL!{>[",|vŞS / 򶛰6q?>wF7㪆HZ7^KѪiUQIWaN0|F=ȋҋZ,,`6*1K8|t[>5_w-7C{1&}võͫS[^(E,^iEe(3Wz,^ׂ htoP<6,D̿aOc4iO{Ht{-(Gee #kS/9+aau񩯬F"JȭÚOzî#}_Bk/Ư[<E+o+`# +>AGn݊r#|4l^%Q曗g~H! $zwC%( Z. J؂J"{j<~gZ%a R,ݜv/)FEDBQh! j-ht V׈%%%ME(e-?:m"ڒRZbw՟[&ca.6_kAmUeۘ=-OB}Z /:"p(/AquFNn\U^ЎvtOsbޑkّ 1,.q)k+PT-0d &B:u'4$QŹ4Q>> h3lYtQ'="@}]#B.ܖ`@.*\TW˶ cg nZy7/`\zM>ͭmj tV7TbtȌa.H)qCW$&ε vyER ˫b[nBmj Tt8.i(_XCG[ ȐmCOH[}r_?"o>'uώ%zmY099"`s94ɴn35+k w+:V%ko:_~ rGpc{rvSTʝ݈ڢ @0N8jV!d5oWͅaoWT;Z' nW*E02qTcb}ٜ'Ob@(XBbt[*QR&) S F!1eE 'W@LJ1FZ8'z2P!z=T|Db~_W#t:8O Ŧ > e(Ih*O'K4ssxvN~3>  <X-dy\3P8\=s6XX߉ݏ4E3o\L0̰;}ts1z">kzt'$s^ɇO !TR|BhxAQ~rsT!|B]x"G)gc"7▓ 04JxMّT;,5/rqx}[x5~=׭æ4}Jt{M1kW3L-ȎqgV^ڃpO6#V9#8/0bĬcϫxwqk=65,z>&ݔݴT O\]xo"M !0Z; c$AQ(&gPYUL[6牘uՆa!صFaa|DDh7=q<%6}+LLr\30BM>GFBTDxFUŖ74L&QDm|6t2͋ jo؀mOWΡy$j?iI?Q$^bx(&cRJAOAŎW:[}NoWo1qo~;x2b3C~j={wuq jnFQ@vkNEQ+Yg桨 :l)'^ڴbGVloݎH(lUɔ"fd}#8ALbr2DA Tpk=/QkO\B LxK3[WqzLU7|MC t׳mϭ.jtɣ7DRNR}=8@ro_nsB4 T ȇ^ ik#gd`]#*1 0= Gߧ*01f8a> g1dnC*pM9nOY:#Miz4$W~_;iMU}PZv Jl\$x,] s^K>jW=&s2 &or&6b)c8 ,/wB@n<;0jԭ.=,^lcqc!:uf+e]:^@ Exg$FH7QkL/!,>⺼e`9$F 2.^-DB'Wr.aյM{xukurv)DM>ɔɤRnynS1^Ze+1~t6uԈh^TXu봋??dGsʠw~{Y>DjLH&1*sӟⅷ1 1s#A@?!DžXX"^A7zzz]CʗbMez?m lFq%G7uCCm={䢰@]'5Bht!KeK .<:Žg{Qr,)O%}T5UA9Vv n_.-Y9)cG9:;v-XT`;Wcvy9%GӉ\:چS;K| 6o)Ǟlǥa 9:Ӄ@:\^ C~l21f%\ "0 ??7x&&@Ur0g/cC{Σ4a Tߋعl5'3'facv\Չ !ŘU'l*fB-A =Wtj9BGNЏGQեLEy38 F:пMy"^ \/90f!|MC2 ׺RTuD+=Tѩ[nS؍ȵF1#˶_Տ.DY0}wmĺ/ EǠwzo;чߥS'+ +̺ܚd Qӊݏ>~v>{gKѼrr 0{m#ĩxbJщ3蚬Ǣ+kQT_ow`( ygpd'zsdi%jZt/:Cp𢳇;lv8 Fy x t7tf^y|NtbBz4+EUQs=l-t;r6݁/ܻ."{ 10QKv|1V2A㵁xpv¹~kDʿz:iG=x}8~CG0S⓻漩AyxV>(LƁ:ږ]KϺw%jWYnU8i,MX<$z_{#bA1=gMIDAT>}֞XIν~ao%(%X!]l:?qa-vkUV;~[7N< ;:,Dq`CO GljB] g4_1bԣ &W]Νݸ˛\bLukŞ'_ūOCg t,ZQڕ0 ]8m^~ |pEKZ0"8e=̭*@Kg1K7`QE`";ܶtTbm0P{i;:[GEOO?8Wi_BnNC.mډK Qsʐ{lϠ/ 8% 2tBucc!W y vbl" A#=c@UV[uat Uy{=чQQ~Uu'X(&+Q%[Pz INm;c܍]#?Gbqִ ÜqVk.].@2娼'Jf/u}I86s|n~ԏp@"4ק-qc8lƊ #?. Ԯ-FM? nyPymcpKYkN)+\GӋм,^r(2:C:ֿnGwM*)ےRB #^@z- 'eVkΟ;Ľh`NClGBB"YoQPBȾxnQA?.݆Qew gc⾓Yn| t=jiKiKF!D8W~~ߑ !mۚYw?c\e(TM'1-~lB!$AB9p1O:KC≏0a:T!Dqߙ:o?dK3=vT瘂Nў!3I & !Sȧ]a͞BR(q }.<|6ey7ˆ4dndBNI \|OTMZ^*u=f/kro{,Mwɂ!-/K;½OBޯԹKBHڻ5G/~%Gs+|i<*w?Mb6ci*\i݀1ކm_SjaޅBEA I!2^ o=A Iry*j!NKY/(&b>r5"~B=!:H^u:ԱBHrbYGx|T?EtB(OVbO!,=U@!?56vwB!N[%w]N=!ɹ}7Å2oIB!>Aukt:=-B>bzه>[Iɬ.@5BȇV&DNgŞB'<)e/ybRԄBGY^DBr߮+F!{^ڏT! zGQ!i' *5"odZ'BAuoAB(ғzĊyHB>G!Aȫ ( !P[;tW`J!dJf7yB}B>]B!=Yv`ApDA!>ߧzLֺ˞BIv!i'B|)BUxg{lN!|tźWzE>!ўN !/ŸBzz3Sv :B!N}6#BחΤ~AsB3QȻyB!>A=!~ yyB!gAo7('BGD!{^<B@BIɱiWB!4!0<FÎ]=!>A !~6f1/`_SB!ێB!*IѿI !B!g>SnLAO!h'B(Sv.[E<)BžB[W w'B( ! =!7'B(^RB!ipPB!N\xBစB!ihg0!B!vy+c2/.zB!B!$2>9ΝaP=B!B!~ z&kJSɸRJ(%.{oHӾv. O!äF4L["LtBa2$Sn(Sձ¡ӟ(u+lJheFNIu Q!ht8T[BUS6gM@Ny-x6aV>i*)y)Kiי.y*Ue"w*TR]zo4`s.o {SJxRs^T¾8#]-+Bj$t~28Bgl5}~WRyD3nBgZ~OD!ThYP.m W~i1Sbjhf]L:hp{Q' JɈJHdR\XzF ;Q/_H"_$XNTl>7 Sr/ !+SH1Pk߅RZAhfL@w ^ @\ p&0,!}f6 5DZU)1[?DC"D02 H3nctMH0* t{Sa.˻Ԫ|R1}4gE/"UlO*Qo*I{q.\ ]Erc<95t]uE" M̐zLhuăp`ފ!p;OhNݳ6gd{=BNh*=T:!O4 7M]fu,6yIY״ҧМ@9DZɻ}WR,gL"eаȧbgB'n"O)tgZ"}Ź׍=(&oXq*B^*>ꂟ7H !)K˔΢9]WgW{/G}a6^gjͮH${uɦ7Uöl?T]2CCyϥ2/$4VUx|'mn?* ]ؤ7u&;zKwPL'|6o*7l-M*N˘o{ˈĴe^L[ާRDE ) {"Sk셴2T{f@}bCwCy r]Ri^nט$3sRiMPxwKhi!,m#v06r1* ű~+i(ys ]yyyإK'H$ڑŚIgzΣ;eXEߋ$B;Z+O8d;x*tl'b3SOE"b^Ͱ(gc[ܴ{}U%D.MN y'1R'eýU_ kHeWw~[U^ac:f"sl22VLORm\ˈZ<[&V顥TK/fC.ą0!u)`Ycr((u^RsiPI7U]:i=zq|wtQ Bff3ʎ+"Ц}BqW0#tѺsAOvRhV/1(Ȅye SU~}||6[n21CJ:Sfi`z.b-V+>47\T;K+ ELja!gp8OeEJƏ(?f܎fN.HCc;mAqV ḯc>.43nM2FG]HJ)]FRQ)\@"P&gx$F SI/!/!at]8:)Lbs TɕU|svm:iW229)UЬnn\_}@n~:OK傕tM8_~>_~{ubp붝nNfyqz-D>M,qf+P9ǥ&*QԔ"F`Ӄ ifhV$cdDՀ4V\0φRndw^GiPy;"N仹xkdpf,n2 Kѳ݄xYVݞJs@A@?%k‹[pm/I2 )wuiK59s.ku?eМ)+Y*әce:NR*&=NҴE>L$YW L/ K6Rym7a zɕ~~z(9]U?MpJp x y9%̀q>n[lQ(bfF3y͍H4SfC1.$ʼnrW$o78WLk)6 ߵvXCjz&ﭞq[څ͊$+n}Ƈ-[$`=b z7'<}[ץi~$[#?ytz.drl2q&S%ײ;6hqO56ټ3όk |q[^:/|VtG h)C^Xt7xFLl?'`xR.јS8xHwv4TM'Zt": L UDlz'4%ܟ/-8 Ysyi7! ͪ6e sok3Sqf%crk#kt6dn)vS@EAA5tGOt>?y)ۭ8Oh y4@zt*AF?^8X01 i770gf]Ǜ3٠i1`ltp4HIۨ"J݀f^cqWYwtIلoNR&pٝ *Q)NiUǑtx /8Fݦyu l}{DґM}tDNωl^L(I.\6(Ң[5Gc8+k$qA"K=Y[Gbz:>~;s|[ѵ +Ne϶HMȢ.*Ve,f2yCTSY;:[XkՓP6tG9JT{*P;z )-A<6 uyvzD,`򓮚=ozWei-LsZSϾh&%w/>'ݙ8IZP dt4ζjCMHT,B[zM}zlZo=ŜBU"V\[U_0e^Vn#~(!{?OfKkY>{zJiʚZYx'D"~3<{ES}qH;ej dû*eeK(]/;:No?'<֧2.];Ub-άnt}~=d_?o/nY'IENDB`torbrowser-launcher-0.2.9/security_design.md000066400000000000000000000060131323341357100212550ustar00rootroot00000000000000# Tor Browser Launcher Security Design This document could be improved. At the moment it's copy/pasted verbatum from a post to the [debian bug tracker](http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=752275). ## TLS/x.509 security torbrowser-launcher doesn't rely on the CA infrastructure. The only TLS it does is make HTTPS requests to check.torproject.org and (if you haven't set a mirror) www.torproject.org. When it connects to these hostnames, it uses a hardcoded certificate. So none of the TLS PKI issues apply at all here. (And I took extra measures to make sure the .pem included with torbrowser-launcher is valid. I downloaded the cert from several different internet connections/ISPs and compared, and when I had one I thought was correct I sought out Tor devs to verify I was including the right one and not a malicious one.) ## Downgrade attacks Downgrade attacks shouldn't be possible, unless they're committed by Tor devs themselves. If an attacker captures a valid old request to https://check.torproject.org/RecommendedTBBVersions that claims that the current version is an older version than what's currently installed, torbrowser-launcher prevents it from installing. (And by "installing" I mean extracting to the user's home dir.) However, there is the scenereo where the user has set a third-party mirror to download from instead of the default. The third-party mirror could serve a tarball and sig that have filenames of the latest version, but are actually an older version. This attack is mitigated by the fact that all mirror options use HTTPS -- though none of the mirror certs are pinned, so in this case it would rely on CA infrastructure. This is an edge case, and would only work against users who are using a non-default mirror, and who also have access to a trusted CA signing key. ## Installing Tor Browser system-wide You cannot install Tor Browser system-wide. It's released by the Tor Project as a bundle. There's a lot of code in there that specifically prevents it from touching any other files outside of it's own directory. All files need to be owned by current user, and it's designed to be runnable off of a USB stick. A long time ago I put a bunch of work into tearing apart the "bundle"-ness of TBB to make it installable systemwide, and concluded it wasn't practical without the Tor devs releasing it as such. If you could install it systemwide, there would be no reason for torbrowser-launcher -- it could then just be a normal debian package. ## What secret keys/access attackers need to succeed Yes, attackers that 1) have access to the trusted keys included with torbrowser-launcher and 2) have access to modify files on https://www.torproject.org/ or have access to its TLS key are able to get arbitrary code exec as the current user when they open Tor Browser. This may or may not include any of the Tor devs whose keys are included. But like Holger said above, this is a feature, not a bug. This is the whole purpose of torbrowser-launcher, so users can automatically install TBB updates that are signed by Tor devs. torbrowser-launcher-0.2.9/setup.py000066400000000000000000000103631323341357100172500ustar00rootroot00000000000000""" Tor Browser Launcher https://github.com/micahflee/torbrowser-launcher/ Copyright (c) 2013-2017 Micah Lee Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. """ from distutils.core import setup import os, sys, platform, subprocess SHARE = 'share' # detect linux distribution distro = platform.dist()[0] def file_list(path): files = [] for filename in os.listdir(path): if os.path.isfile(path+'/'+filename): files.append(path+'/'+filename) return files def create_mo_files(): po_dir = 'po/' if not os.path.exists(po_dir): return [] domain = 'torbrowser-launcher' mo_files = [] po_files = [f for f in next(os.walk(po_dir))[2] if os.path.splitext(f)[1] == '.po'] for po_file in po_files: filename, extension = os.path.splitext(po_file) mo_file = domain + '.mo' mo_dir = 'share/locale/' + filename + '/LC_MESSAGES/' subprocess.call('mkdir -p ' + mo_dir, shell=True) msgfmt_cmd = 'msgfmt {} -o {}'.format(po_dir + po_file, mo_dir + mo_file) subprocess.call(msgfmt_cmd, shell=True) mo_files.append(mo_dir + mo_file) return mo_files with open(os.path.join(SHARE, 'torbrowser-launcher/version')) as buf: version = buf.read().strip() datafiles = [] for root, dirs, files in os.walk(SHARE): datafiles.append((os.path.join(sys.prefix, root), [os.path.join(root, f) for f in files])) # disable shipping apparmor profiles until they work in ubuntu (#128) if distro != 'Ubuntu': if not hasattr(sys, 'real_prefix'): # we're not in a virtualenv, so we can probably write to /etc datafiles += [ ('/etc/apparmor.d/', [ 'apparmor/torbrowser.Browser.firefox', 'apparmor/torbrowser.Browser.plugin-container', 'apparmor/torbrowser.Tor.tor']), ('/etc/apparmor.d/local/', [ 'apparmor/local/torbrowser.Browser.firefox', 'apparmor/local/torbrowser.Browser.plugin-container', 'apparmor/local/torbrowser.Tor.tor']), ('/etc/apparmor.d/tunables/', ['apparmor/tunables/torbrowser']) ] datafiles += [('/usr/share/locale/', create_mo_files())] setup( name='torbrowser-launcher', version=version, author='Micah Lee', author_email='micah@micahflee.com', url='https://www.github.com/micahflee/torbrowser-launcher', platforms=['GNU/Linux'], license='MIT', description='A program to help you securely download and run Tor Browser', long_description=""" Tor Browser Launcher is intended to make Tor Browser easier to install and use for GNU/Linux users. You install torbrowser-launcher from your distribution's package manager and it handles securely downloading the most recent version of Tor Browser for you, in your language and for your architecture. It also adds a "Tor Browser" application launcher to your operating system's menu. When you first launch Tor Browser Launcher, it will download Tor Browser from https://www.torproject.org/, verify the PGP signature, extract it in your home directory, and launch it. When you run it after that it will just launch Tor Browser. """, packages=['torbrowser_launcher'], scripts=['torbrowser-launcher'], data_files=datafiles ) torbrowser-launcher-0.2.9/share/000077500000000000000000000000001323341357100166355ustar00rootroot00000000000000torbrowser-launcher-0.2.9/share/applications/000077500000000000000000000000001323341357100213235ustar00rootroot00000000000000torbrowser-launcher-0.2.9/share/applications/torbrowser-settings.desktop000066400000000000000000000012761323341357100267720ustar00rootroot00000000000000[Desktop Entry] Name=Tor Browser Launcher Settings Name[fr]=Tor Browser Launcher configurations Name[hu]=Tor-böngésző indító beállításai Name[nl]=Tor Browser Launcher Instellingen Name[ru]=Tor Browser (настройки запуска) GenericName=Tor Browser Launcher Settings GenericName[hu]=Tor-böngésző indító beállításai Comment=Tor Browser Launcher Settings Comment[fr]=Tor Browser Launcher configurations Comment[hu]=Tor-böngésző indító beállításai Comment[nl]=Tor Browser Launcher Instellingen Comment[ru]=Tor Browser (настройки запуска) Exec=torbrowser-launcher --settings Terminal=false Type=Application Icon=torbrowser Categories=Network;WebBrowser; torbrowser-launcher-0.2.9/share/applications/torbrowser.desktop000066400000000000000000000005011323341357100251220ustar00rootroot00000000000000[Desktop Entry] Name=Tor Browser Name[hu]=Tor-böngésző GenericName=Tor browser GenericName[hu]=Tor böngésző indító Comment=Launch Tor Browser Comment[hu]=Tor böngésző indító Exec=torbrowser-launcher %u Terminal=false Type=Application Icon=torbrowser Categories=Network;WebBrowser; StartupWMClass=Tor Browser torbrowser-launcher-0.2.9/share/metainfo/000077500000000000000000000000001323341357100204375ustar00rootroot00000000000000torbrowser-launcher-0.2.9/share/metainfo/torbrowser.appdata.xml000066400000000000000000000034751323341357100250130ustar00rootroot00000000000000 org.torproject.torbrowser.desktop CC0-1.0 MIT Tor Browser Launcher A program to help you download, keep updated, and run the Tor Browser Bundle

Tor Browser Launcher is intended to make the Tor Browser Bundle (TBB) easier to maintain and use for GNU/Linux users. It downloads the same TBB from torproject.org that everyone else uses, and it doesn't alter it in any way. But it does make it much more usable, and it makes the task of keeping it up-to-date more secure.

You install torbrowser-launcher from your distribution's package manager and it handles everything else, including:

  • Downloading the most recent version of TBB for you, in your language and for your architecture
  • Automatically updating (while preserving your bookmarks and preferences)
  • Verifying the TBB's GnuPG signature
  • Includes AppArmor profiles to make a Tor Browser compromise not as bad (in some distros)
  • Adding a Tor Browser application launcher to your desktop environment's menu
  • Lets you set Tor Browser as your default browser
  • Optionally playing a modem sound when you open Tor Browser (because Tor is so slow)
https://raw.githubusercontent.com/micahflee/torbrowser-launcher/master/screenshot.png Window to change Tor Browser Launcher settings https://github.com/micahflee/torbrowser-launcher micah@micahflee.com
torbrowser-launcher-0.2.9/share/pixmaps/000077500000000000000000000000001323341357100203165ustar00rootroot00000000000000torbrowser-launcher-0.2.9/share/pixmaps/torbrowser.png000066400000000000000000000451311323341357100232400ustar00rootroot00000000000000PNG  IHDR>asRGBbKGD pHYs.#.#x?vtIMEl IDATxyuϷ /Ná*\uUu]OVן޷[oA3B!g>?g&$! ﵕW{}s|϶_½EUgLUU[VIjHHODj'IDc}?%2K/_qE .^U/,SU7/rFhc`a_}'M;WA_U0X͑usEQ#KVR=XKsw+]h90Qw<| nIm (𕥗/ Cׯ9 p /QA0PG_U7M;2n=; ;R-bX||{&2u &B@Ճucfͪzܾd|}9Hy9LQն>Hbyxr# $ P*ɔ$'?Eϟc1UF^QU , %&|RD.[R>bُy:u0_)= *c^bV&w-% Fc}yA^"ǁmgnkNx?Q6xԠ@@@A;^4B1E*EZi ^|BBVb~Xrd$N^w&AŎ%&"_\|~fy ?xJU&%7]=:u#;h&!X'q b#ZT>9/G6&#zs<2ݏvCp \W?F.v-7q멪!UQE̍16+ ?CI8} *VSlɭ5 /T<ϑr,!쇔bNYhKsD(BǧS['& n5#qہyH]zy;1]8.]6AEmM 454ZZ+ 9ck!&kR",Jz >ތGMv18YmY J = H4Z E{/R@[6dDk k{`?{zvj1{ΠF!T v⢇.;Υ/'ʁEq|m?ӓ BbY2u4Z[IUl fWu*4 )qp<0M`PHk@VX(!e{h Պj`Vd*Yn> J?vW+Ip~ 9:o|VyG݇PKɬ}jsfS=:`G Qq**T5@4GD2.fo8֙qVnj(3 c)C8NcG!S,ܭ8WZ|Ѧ{,f嘽`518!1<qBGRqR\7yk_-  55TIĸW(ZK(C!V<& f1$@GLpcW*j5m7n=8[Vym4F] [Ư;z &B׌$0G[nz`F /ze۸7~B  tKvu.x 11cp1 c0b0`5y~_<~L;uq}sqqblΓp[IF `D0&F/)oL7ܧbɽV:ek33$ XV[TeV\ ԖQ9q¿$"`ow0u&[y"x܌P6^v*ߤ2FAUXYvwj`X[KjILA=,m A^2q::;vq{tOǞ?!WWɑcSYkFlqK`_CmvHh:ֳc[FDM0?\I$K8\{?p ,\q.Fʈ=V^K^ܻxY/~^$FT`ƢomhpR~}9gfB Z6v!6Bġed(@\vl 潆LvN`y1ގK}8sɨ7ũ_垀U˦-ٴn#~Sg6T 3,dp66nT3i[Yn_ZFan}n**' vw;7\y"Gc:m z_gkb?.Ɲ/O1g1:X_CА%"P郎ppX?ԱF0; ZZQ[U#\X" ck^`g>+[Ub]n9w#C -jb?Auy*<8+_"{΅ֹDKYɻo`18%Bxc#q- ΰΏF?Q븥miL5 "`*z!YqB3@Y""(w5zuhR Y,!(9 P\<M}88^MyF)͔0{\8w#21% aJU6 zҼubl%AS>[8E&AUy[{\y$L G0'F }Hc - LQ0d`MƱKQ!<>V'0͆Ƞ2SQ-w@ˊZ|ͣuf b^C$(QX y1ob`fGvY+3re %{b>;@-`S,16A ׎I< ; uϋeuc\x+CUH(հǹm79c\g-yn D@b.aݍWE4:ED{*3hLy=0av`? %MXtpThVbQ{~MpsF_Ou7ם\u1b/!~~zU5mDB/D"AKC+;~ށaT6k[@=lD.^F,"7Wȱgy웻gz-U{kKrL$-D; bpsi}OH B~ٶϹb94B,gr!m[&!PڂjY :uIq!gxHk1/[(J}O-;Ek~ʞ0Qas ~{&xx& ;u?3N 9 &H.-1b$*4c\d|ZA8lIggd"*,شklMӥ/% 1fb᛾#bBL(Bӵ@n۶=Y?I w KqAt5l7$Ԍt6>*Y 琌U X{ 3w ۯf\ , +"g>s7as q *,"Zvc[T E}{nmF=vŜ 3}dI>1#||nY"-lO nMƈ%bW7TB}U#o}4.G$!CϹ-@GO 2dqɊ+kF I|! ^maފJ^qEMQKh$P# c9 d~>[R7iTi"D RB"ZE}e$Հ;OF[s8)}X)avՙ'*lL,ċ< ÕCyoi΄Sc2 1aA.3ԐZSQpyUL4a}[EHP`g \0$l?8m{ ux*r;bƲv*N\{ZA7Xk].%\oEE{7_'OyENR5XÅ!S&` f<ܡG\*& ڰ"L b^0 ]QNUd^oʥbP=^ɽyrV̀ `6G3I`p4FI}%aH8{yhi] ByJ2E CǬC O2V'_|a8틱~>z,$:$EXW샐C ډ n@ƈx )FT^ ZaA8G¿ph1 O2¦σOvBUEUZ޾U]?Ue%:w]l_DW2q>K>=O{Ko}5=E 7̷'zø C AS-&“Њ a3-NQ5x]78l"B:>sgOŊyw ԝ*zQ w'\:8 ,e1T:<VX97u⨃xADŽv2;汖GBUp(H p|~)$D/8\E{I Z+om(笑 "%𙱆6,M|̺8S<Wsۗ('^! ђDP#`fN7?LR9$F=,L-XAA .Hy#nle}`k'Lƙs|$l9OӾc"\gaT `^^-êE+pc`>"[aiwq7 ` NT1KwC)TqG&M"#a\@d$ *@^ˮ @ڃE"6M]Y p|% ӯMLɐǪ'a0}5A}&vx"-:ngbgr^8# !ֽ1&w^[..>>gf֚{}gx[VM%&cS b QD_0DrDJ(4T5"TBb̚=tF6&2ˆ{Y;{EQS6eaW~po Z0aG u,tŨ9&<$L߁ <K"+. A_#v1`bb'r`NO}2jYDm8yzk .~P%5ڞ ^YǶֱ(JUP5JÕT WR1"crcG,*:l< Dtjtjljt*WOe1l&E88 'GmWcyK7~Ż{MJ4l]kGe,|=<96߲XK썖, 2"p, "͌9Sm`^ tkLcG},&cfNZ_9жBGȽ?e'N=M̞36mװ'$:ZH8%ԟTOuu]l:L3H3z**J!7EXٛҐO[5xP d9 ,0gNh ' L@kQK.$I_Eػoz>N~b&M4k. EW~E2Bn6UAH|-ORb7A8P x9*8%W*@SY[gs ?(K& Rq}re ^~1.477w_ǟkJ;O9ƖHF%*>zq UtP~jԕW(nqaR|ejENn$Tu㙿p~O@IAzڐ6҅ڠ/܉_+$qy{QX7-ӛ0}b*1.-3;p5&/=du?xTpvcնz7TJ9iQͩp)Vh2_ӟg ]F4jw쀒5jwa1L89sa}?`1F\p|xMr (Xk'Vm)m@C$ N:^t*-E)RAAlP6V4¤0 nsz# ?%\LMU-GI-Lk7e}IHӱ|[ 3 nqޞ0Xjf, R0TO)Avv IDATp s) L&S( ѓb%p 8jDD:{hOHW|>17CIa)׆Z5dSRX̂cLl:qցOɋJ XCOA gkx*%@:6"U0)34~J$6/)"iQH!~[ݣ*+U_-Cn'7"X_^j ,9'G9UuQm#Wҹ H0e4m]#GMl?0*uDc)v|Dĵm "ҡx>2Z%ďIC+ Rff$`_$ɴ w^3"(^439Q2#3j*uLK k-sf,dHe0f|G0 7_k ? 94(kϣh[hX^av𐖝MM'3~ b; '㉯pk?(ITތ9R+`vĩj Ua6 bѢmڑ t<2K0[t2|G.^ш#ok - jJ=~w|5NafAc"sH*NM]m`WEz[ Uos_IbT ,&4G뚨}:,xWj4ZU.#!Fad0/sVx.؈ M{rkT%HUlr^**>0Ѭڃa8!6G' Hy%k9uh[gDqH+0Uɪ`p,n**69-Dw]*FHK/s3V0yLnӰFQw2 !/l^UB$CMej8j)3y>tggL _ FN`waan0N` VUdm!*@o|8/(L\DpDsVn*\ә|$/y-7(%x EQ zK$O`;uyU߫'17o-b\R_̄D) 5m܁x:{[^FhhK|Ԙ:H8X-dC/d %bK=G28I5Uᙓ%IPYk2mÜpVR&(TKUB|*v9J|KAR8в.X~ۑdSɀS5o!sI'&;VG RA(LyT2iYؾdSVEc|rnfB )S ]?l8g[ |8ۃM]p7NKxDfl5᲍/?*#`=lὍBR*+k݂n6C63ʩUx6@{7}-GG Q0鉇9 :ۺ'. cd$o5or lO2҃>Z!5Ma1D] I52qdD/wW _t!^O=&,ryo&XJqg( =ʹO4ufc %xJ 6[!Q'hU,=;So+^nG*!m4ᢓ/H g<ͤ/fc>_ aU# KbxxFԗZy򦿲q 3xzkRf'w:17Ȟ4~ xmL 幓W3Xz+![yR r9P:n6] b`7%[M`@%Ɂ 9899;9|w=<#S9p4ql. 1E' ĔA$hwYAEoL`owJ_q ?qx*hNIm{Pmd6#;³_̅j%ҏ-T= rY|৷7+NTX,m1Qڏgq67a7؆ū qNpip)Kسν鼽}? M>f>eaEڊu|zB.M5g S&7o[>,09W|4{ X? ?PŠЈXWU#9PObڧU쯾tBfJt 9.US /e߄]4o_ӽ\ m, ʽ[ػf^&̲b9ɇ )Wpö:g~`XEWY'KUE -5h:c quHWGW~KL[ dmc,v6 }j> 2 iWWU&=/dԈeęlF~C[* ",]p!~M&6F&nM ڰ9b)K.o%qQ;m?M.+xbKqHT؊L6 CCC Τed,t\emhJ`:hq]bVĈK "Kb{x 7 3u,C{:q;C{A7h,d"S']f/f|!!ܘ{9O^ @2d06>Zkח%?I׬TvԢ31,f{co? +hG[jXUknCt|iiVGբŁZȈT$RT$R4hS/ SX Wd:yjwoBipJ>9|@w,HV!q R6d>pT%5U՟~;Sr3 ALapJ7+z{FI`]_Lhlj5gv}}X =F̮]ЏukhidvH A".cm/X"`|36o{{z \VÞWmd7N$.h M oxJp R-v%= CzY[jk%3r'\^lVe]Vq[JlKݯޅum݉X2AQuP# BN#rb }2(MtT1?S痃+bʮ7ҕ8h{ȡoT|::3!=盘7g 6f_a][Va_Ek 3Leߙۉ?\[(ݵvDmѼ8 }T*XjcI l"FڥP@ sO;Ëxu֡~5 GM yI+( 7 u5{^ /K}o_ 4l<3.$S9ދ6i㬃k(*䪲Aq p?ëÍ$MGA]1keѯ*n unU;1LdAp9،ӲQ o,/WؾGZ\%Jػڍ%+I?ObW_pf/״uͥ״we x!ei8 g9l1?ud *"࿲ Y'<ּ_\ɮʌ~6qckGW۶[cv[bL`(+X ]?/uW=Bi;?E}-,wxd*&[wKrGk3Od !3 P[/bqjp?Dg=o LNEwt*UJ{7O.cuEGhiP% QP:Npp9UdIf˦zq0$O5UهCAJVᠵ((O'E^T!KM}P˫utzqi$ί$J;-0<\E]'m-CjO &CMF&xl^mQ-R6]$نKVgUx5!0vcm̛t Ųi=l#[\8O|%Zjs߁/?+Ygt9:Cb&*Xz0$yc.N{${~r|i bgVeрMt,,5m PLk)Ԑh̾$-_DY{4!+RT0$&4M 8(l=<4|]?;-[^q Ӻbܟg"fܵőnh]wR&L&^Gocovd7q?ۗ>Oɛ%smicA5"<~]ky/Dd 7yE!?ǰJb2y!S[gS,DPD} _\`2>lph~bh?O~=uG)|_wZ9ɿ:ⶰhޮϧ1SHrMQ@c T &HTPm4m#Wu/$b`P63q(`ZY֐L2Ʌf#596|i~7/*^SŸ/mw,|j;KVԐ=mTmR­4յ{qȔ9. H! %N A⥲ -X|ܹ # beѵ`Yv*xI=A3cj4fM8Ò\KWG$~> r`IU_vG "/_AHZD 1Z7@ugySUw5vcLAc >=]fq'aMӫhY֌CY83 s4zFok&*WԐ ? s>uT]5p v^U[fUl|SPSCTg-}U{_w8,' 0G5e1d̟T64\v~e;:gTSPI&4oOk{˿xOtlE*MC( '[ }-c׈X$m!QDw% b} Ld |%bǸ*Użɧ8΃Q w'EU 1%@x0 $a8`ؿt;)~!ߤ(@apŖA(䯇+I7pɮ; 8wO}Baʡ]Wyq7ƈ>=Y=Gx4ҪدW"`nRR}'=F3C+:.L]RZ41if  ŴjQg|pCk3F}P:}TaLLH/KJlۉ#{{ Õ OK=Әp9ow/G$ V62{'6hu<%YDzjK<$fn2Jee%=_Tg}gDl.+7H1aanrlm`dd~Qakn qyq93Zمz%y RVUXkT?cַQTYSy)D}| ~`} l=? %{yQ{ ߝ:Κd:_^g=JbnyW>ux ?}U=_)jIHHygi'=S-6,@"GgW$wW_P 9=niuxwq*+?_1.W~>f}*'Եd%F8;K|p3|!Ͻ],GC2NZz3)~UE;*W[l]ZXUG" 17_=~3R$n֗b9Uj;;]ԱtW<{ 8/"~9GRTm-pVc̵83yǾ|;:2}ϭin6`0@g""P FBdu"Vhd KL4%iFX$1aݺu^={siOwӜys=:m8J[tNúm\O{⛒gto /vx&W%0zf0ӯA돲`Zet,3+=v3|X(״4 `48I!M9y"Z⫱m΢DToAiD&9IWN` IDATciPp#hp,q% 7|#9Fj30/V# ~hAOy 9.o}GWMlΫ>Z[7שJ7Y 7mY@u@Rˊ%Hl#7IbO&ʙAN#cWW2 j$4-NRL$V4d1;:z{u}YZ{̊*-6Ԗ@GW۴V:"u;Q|#yqb7Oad9 7r\SoZ*7Or1b.Bkz G-(f`"cfV,"K!{ 4'wy\=)=콍ztJs;9:kinMKx8m#Hqv9 b%G'+1e(5H:"3F >r60Kice.\q#yS-W'x8y6 *?\.n|.d^#"'Sy dmHq@K0ES/kf| lcpm( J>rM4tv&PR'rG0=b1A;VrK+(, ۇWY+!+2|›[WSi\=bhZ)"DC&OdGHeRd2) | AաtRh7<#ňģqA/T{O.FF½ |Cl$&:ftnMLYk-ͭ:(tXp<%fUґfE j`x8\jO#orp4cض0KC9@f٤Q/.;z7#R]EM|O:znzgQEѷ"?# 2,j[7Q2z!lanR fM]h 3lxec-{Ipf)͹pо+Wfi&bdnBzUdZ̨"3o?UO&u(АTuDJCU}ZF F9;R)Pz~5/as5vzl{8 AWPW={ ~2ǁo~ty*ĭz5Oonlٲ|9 Z8{x/'' |"=~b838b%_vw=/hG)fX~6Jgw~l;8!O.!7Hx|UR7,/Q0EJԍLԑV$s?#~/A ֻv\Owv/oiný0;z#"ucKA3\04CbW-O/"z$F9M֞ y:ϑZK6`+=}?o1Gckq;;מmoJ((%?/.NKi"sLa5nŴ$xtl Cj= r(M}1fCo׫ZD_n9Ÿw["gAj#dnewgQfnSɳIݻ=RfD11oVR$':۟ OR3|A7F NkY%'z(A3Y?Ѹ㗠Nk$t/%3g\}AP;`ī݇|[Un?8ŸtOVAl0Q[E '`:mDcΠu \Kܹr_ǯOϒ&` 衤hsj"5]}tt6ق PAHV 2 3y,s[BH l2`hHo?d$ ]F}LLϐׇܥࡿ@Pꎮ_\(O 1UGDU-Sh;%0Wa)|6 _O֑']w]tnuῂ[~"qƵbQR"򻎮ZSBI =<\$NRA,r^^nNVFm5zcdN43~K:NFѓ Q]˝?*U)q P.U׀[C%|:91NLрJ`2bK-I9M RKGD}JB 0Jߺj6p38p[e2 @BDFHJLNP@OggS.`UTgrNTQMLXYvvn_e_J5]#7Q"E[ٍN';MMqfA0r hѵ nPC"hwfu%׹2s7}9 S+ů_\Ǐmf"u{ffB*@)R)mg@@>{ y_s b;!3ˊj`icO-ַ h$h @!ܣ0 bpQΤO,3*ZS(5 W U0ZEФ'kSlZQmEX ~x: ^d~22H69~UʣXKI+*j"uﳽvWP WY l'c&.`=/5@a7"[E9ķ q$3u!e#iGn+ ˺&vgl9{2~ޟϧzjm=a %J ']`4Pȹj0ɩ ͜J~}'0]MOWWT9Ǿd묬}|G+$R"f1MiڋA@E.kMW Xx0 sLeQl=$ut(T @KV.&ᙖ4* "4 E @}5ğ;%MHpd֗)rYT<^ 5Q ->- L;fm.`k5\GËwfj KDwƋW׷]n+8Й3Z=\ef̔a1ez$-|<|~bWoz!󓝡{xۜ<尥gR5)YB{~0ϚWωj쌪9ji: 楎 XZ!E1TㆆC PratXH}bI"FK e+lPT)X/H:.QfEm3DI"mL*FL ͷ ]$8 -2&O:ǀ;f_#Am XvNPyCJ^ ڶ wҔx!hUfvᘲ([|Z3.왷y36J>M9tv]Yngψ׸,_z&φYrZ$+UY>䆟sTSGq?d<H|[{f٣ه_2gYٱ^(7sDAYC2^~kM~y7.xߪ}sӪF@z ` "7VX ⢓\*f,5k&7E} c*QU;!2Y=xH"*YWF^#| Qcd=,sJBPlTV*EmZs3dc,[K &LʛPolcw7/>jF?ޞ|Gۨcg |of_ia|5YOuklv_#̷^$ɖg}Uݻ+{6m ѽ_YdgzϞ\&`:P}MMEʟotwz7xr٘j9+I̠"S|Χ٨Ơ~…Ƨ|nb'\ɉd9un$U'a5=^hb (*K 2 r1R/G@qr^zWg\ anEE*bBӏc=@m($pX < !(.:1쪬Zx"R/E&Ʊ $,b4t:`TU3;}|谲>l=\)[:GSmE3mZ\ ""W<~?n 4Pͪ܊ @Tڳ<_pf:9}>2If` _8?3` ='*6G, ()("g1Z&ֶ lC%fߦpUo1ƴB"sk޷3U܁#&M0lFvVI'!ΪVUKS FUT1 Qb04))lٶU5HB8eۃ@xQU: CA5mDh5.jXa(VJC|$yd( 3^$`hԷAݞ@ xN)Tk,}頀,Ӧ!` K?9fCddX hɲwo;vu Yx8m%}><q;ܪÇT\͉U w9F>>^/·GsPgnP»s.A/H6\ehmd w ! g\Y Q}5V ^ C=6s~l!ӎ sv,5kMk+e* dY `D,2br .ahP2$^9ԋl]uiSl,3=w MدʹȢZn9 0fznMA`D_c:CH @_zsylRj(ǯ[ؖ9ohHOO@&Pƭhƛbq ^kS9#TY~p~w ~J0D6]旵[EQ35Xu`50f^\ڽc[~ݐ1h̒W fful붳;u$H Ѕu %C^γ|ܶoiu\RL&q`l=iff pXt ';S j*06隮Ze ZUnJIo2.Բne" UF>n9Y,ZJ N-֟eydbfg&ZEEUQ2r.B,eL;,OC4 %T(h],Tub9q3ë]ù9rqn7OggS^*]qnwu}cls_t6»FF|)3Ծ 68 EjX͏&%` &t#$e(x%YӲ\;QԴn>։ت^`@Tu!84zD9U\ZiJRUJ14Sp08hު;? Z߶&Η'bgʢ!s';*Zrln- YFR4m ƶ\A,DbqdBff,2\=pVEa.-uXHyJ)@94TD;PTE6t#cg`$ G(I'>֟6><z ϾU}oh)/*hoUa>|asb~X4$gJڸřְ[>\Ցr.U!@d% T^Ȁ& B t-3b,GCLGЌ812{c!23cbOQP\]:.X4\V%@2uK#0 6.H'PGiES* f-T \Yi@U5.;xo .׃Xl%KaZ>k{ Aڠ<#>˭[o;կ|)[?Ŏ|CZ"c/TD6ffv\Ő[= 14Y@yc5^ŸZitіIJDi5>gai " 2e`)d'vȀlC8ce[`T:1>O=z+2xnxIAmu#& ,ߍuU?k[>]?E%{THy#d>\½/]#oh.)>{C +ǞZO=Fj>:/$5)}Lm@ aFuPZWy泸쀝"Ϙ)"1,a$@7* OANT[ʑTA5TN4 (@gY_;L]䞎a,}&KS990Jv*ʭhmSWhLhN,9ܔ)f]Ub@u #j^/@fB}0XZmȐqg|M˕CK`v?98I~ƭ @8e3W}66Ffeٝ`:-Zh?m!]poΰ}vp)/jGM);@X\1{ ff3@s-g5ݮ/:[s`lө= HUe'DTØ)PbvSerY$vƬ()#H)>ܖs2Uϳ," a.':N5U5 D7d2 <6SV;P$Dӊs,TMUYʛYXYrXdRyd%,xRӋ7\/-z)aE CF@pD-ůoB] "˴G1DM;Y>}/Ծ\>ۯI9/T ~%l{J @Abb]nfݕd@Нldkn!{ds`s:Y4EE4V*"+DO QŨtXƀ\S2${Ҟ]U%Y6F7PY-cC C]V|iNκYdLfgϑMqxEɩvS$Ped )$v_CkFq%xf5ddơs AeӷuY0+V"2 (hÔm}. Fn!8@BPQѣ*UUv!p=3$l} pwfؾY!}_F: sPTb;2, f:fyGudêWLɞ Kh#C樖Ta䁪j \h88r6m`eԂ&Uc\yۀmunkes5,L'ґ4{:f G(adwڋQ H]b u0`=OWo7p ߣU2Ub/Z۶~x1 ߏ{@ km?[Z̫6~H{ {lu5%@?%prbaŶ(UU!@(VPmw4'!3`@IqvELx&W#n.F;W {H*aƔd\3O{BW!' 23І#v:&\n*3(XxZ)Y!uj 3GΧ)TDIc݉>rȝ }zϷڵK8F@ׅX5 ٪* @yk%<~x1xP^;)$]_6d 0fXAkFKђXK0e\se/0:zq6 SA4@ kB0LA(CfllR`DR0U_<{1g0Ln*9ٲHȳa>(0 *E'yMQβ<b9",la.18ʇȶB:7Q݅$7 k:ul-H4YY$*C5 Te'?}Ld i2N`WJA!'\ S?m78/[e}_,۶-z:5=X4Hf/dJcy<}bv7ylfr0XjI%::&sz)qA{3^ˆ  *v2*uXgIQWi nG wD%y'.pu1toCR }(c =Iu(rL΋-J%ՙuQI#,qP JO 0m bhWC# qd/A3k~ p-P %X,j m)O>Z/}ڷzcc+ܻ\~_ '{|5Z0G)A@gd¼xy5$жvMQt]1:dtoVjý"vV-]@QkbI! oX9 =3,d(S ":ke3!6UJY<}n+T“#F9 3 U`C@Ϣ|]5PZϲE&x#jUe)Lew=x_ +*RTB@F"a`۶;@=T%4^V,6XVB OYRAOggS<.ozrcnTeglqe #l}8m7} [Mˊk~z ^em,`-l5VKV-ۜ6hsf6] h4ktС("XUUUUU6% ŤmmEU4UUd$v0C nn$,8 m.( Zduq,VVHsεV:I]eS9K ͷ=gJtrTzk~m&BZ Eg>̺8*QimzW܏1A?a^PI\U6ӲdA,.sVo@IIJƁ@zU =(ze ? >`W@exEp)m^;=_y!G {POġ=턭oDՎsMdNlJQgՖ Vk6`KlnFkVeb)ZnNVQk )A5, dkt,b1=fY%VYeReQˢIZ8 Uq䬜JzD9C 0$ ,9TPdvTuD \8wES㨳fSQDG`^Yf&sVh=jUD݀3UXXk)TP6dcL89FY&ZJy[ hPXX4Hz,z4`Zt Z>\g;߷-t7|:ϔ+?ysy="@5Wm ?K"]WlXE#@nɺv}*VTjؑSF݌V]d-ي5\Fiw4 Q JЦ"BhIÞ@ t4_dGѧ{ Dm&tN}7;۷ߏ$ao̰ޯGhU4&l3Cc ϳv6RUƁ tfxh7!T d4CZ 2S/PT hزxhH,BDreZʼ&+k TJEZ `-  ]&,0Z؄T{d K ~xII_T4 tEh]y0U5h5I0@jk~ dUMVnۗEk2ٳLlZ˥T4Z%M%z2KP2qѨ J:ڀj1r]ۼyz}}3MS"x (Tb"i_N9Xd PPWF2Ξp,H2vК+xpr>a6%N" XU@Ʃ@XQuW)x@>(/~r%R,ـ/,ض@r$2>˯^|oPU|e+_o ޷ hZ֊U!lagkVrc k0r|um̛Y>*;kR5eD!#$&J'E+! @:7(:D$FT4\$,4G_fYX5́';l9PDn%]-_ifشa:k*Ep̰0 rVLjR Hx"njaIpq46Pe \\`'F$XGYG 5,B038XhaE6 V!ZPh{Y$$B *I! ~ܰmMa?+l?雕 a_j[p\PVqĤٿ#*kߛ0ʾfMrNϔh#[-R5fDvEae eK@g<%#36@v /vcunz|/X*2jHyBuOV>du򮂆o !<΢cb4Xh ˬ(II0#;%:0KR$P 1d&I g<(% d"6hH&{ *h m$ qZ^̯pto))^w6/ [ڰ&aMquR[ԁH:* Lclb|Ŵjl]E-RRBz -FJe)!R:j5kmGv:!(G$<3ði̖l;nrfMO[byL7wNb&gjL?5/3t\HP]/UHb@D OrB@(Z+ XW(YjS !H2he ʚWT-M»YɅXb!,;mL wJq졯/Yu7wJq7Y˒[0mۊ[@ v7iUZ*@Bk%|{H,GcI,+K]K+j]E)0 Si42xXyf Cx=c Xrn,u᷸h T3]oM I4Y- z4q{+ʌjrJEseBfi@50 D1I2r$C: R@h|OX@d./RUhUS_ckIҬVBZ$"ZU`Z;l_؎ }B러fQœ MʸzQ;V\Yesmb[Z82JbYz]O֌Y", "VTדxQSƙa q鞰IrP @+TCFX^L8𝙆kgc⢽巫;5ݘP*h`/ #r48]ͧR +cFp*)K{6$)@Mnb<< Ř(iW@h+TX3ڶ+6XfX.FuUTJ 0VQlȾ?Z6_MU1^[wʀc+|x;l_U<:"PնQ~_SeҺHsmQc5zmͺƈ1FW-1KJ\-K|# BB 2N`FΡ*uCjW7VeD*WB0h؜^`~OnQSY{?iPP]n tW 1Ȉ @@~r1@1iٷu+D(TX+)ldr%t/MW2.u!H?n.=,HGN22|3 VPLnaX"R:_-2@yIX>oϔ+LзWy[ ]v.G$nؗ~k_ڶ[Β@5iَ؋tkם،v힎f:\Zk* K Q#,墢*ܑ8ePJճs_یȒ&VƜxW=Ov3H *uIf)pMU`$ôF zj,],IB!u-Ljf,>e 4Wr% a}JP)..d )`B(AH qQr;&h"^<@6n+ з57| W*u߲/TQP)9 /5 $3jڢc3G,ʁc2\Zrjb  BVnd}aLBpJd1 +ʴ3>P`{.4wB9N9OޝsG^${}' r{&ipjYgi(aflz̝ . CBw'NA: 56m1`4qy5 6`YD>M <6 {@]b,Yv!@, "Bt2X  1aOggSohcztmerb~rj>n'xۿ#cVxTo|1>P51^ԚĨo'fzKww..MrFlD}$Ӑ<[kuNfp<χ%S !ۊaC 'Ijyi>8 v"i1I ǻx̮zJf8oCzߩ;e=iwd)OFdpUQP5ӓ^&QVEdV;d֑-iAUc]] @u0A,[R@`AlE`0MA ^јNł{{q"[>m|=nrg}3@ռh[J- R[Kcl>t:ZKհ26β7mmƜǐMY&٩+^"e/8q%j^ xCR$SM`b ޵xf|`O;jFll.*_iTfX>#$N<]4;`1>wSsc(S3&:z-cD FMeܓQТ I @[ؠG%,8kňL$dX[@8 ŀ&2\u-` 8oz%sW8oW>Vlk_hX}ц BszA@ܨ%Ml@amZo»c?J}Sm7>w5SB}'߷U3k~a@ʜB5 {޶_}BscV ~3kc/4fT޼n$O \`vi6CEI("*b2YqkܬyǨ;)'²ZPt(JZB64M :2@R HY@-hp`r (NXk3ӗNzWUL/`2;/摹C$E/=M7q #[uAa&S}ƗW, GM3Eu;kpt T`p03z +ȡV"!TVM`qKOmYbZ@a4 T6\Rߞŧdž^3ԾYG?@UkH9sɀ30YrU:ް* *(uf%b=ٛbiӝzau'lKdh#3[)!_zZtLf$(jr$ckL4e,(RGL +۬,MT\AhdM+|wSPuz M9:}|~>%m^BC^67af.qIS4 @jtee -˽D@C!F^U´H ,0Rw@EQda/ fUR`UQUTzP@T"HUH-H~x1UޕoK7"736ji+0Q%"u]}NٸJ V(r=v&bRjmN>D5!IT{xD,@9erUb/4XسR:YP$m6uOSW <ߘ\ճL^'8$]3Sћө'sH [*49.ת2Ӵ2؞D9F = WXΟEޚ0P[8brM@$U0P(Ks38?Z1(Rl:vh^z>b J ӭ:HOggSr`bxkYypy>ϧ9t P's~uauۡFp&"@m AlIL|8h6%ĜqЅdo?Q*Q;3`i{TEV qЫ,(,R!(b= 2vO22(Edx h9}klv . lmc{fqyoaä&_:iz+33#797*Su,SYTI+[h$yI2@YuwA \cj (MTF9"U c۰6nYZl)\Jꂪ d;=QuT1H_p"%P)Lˬɱ%H 2,[»~)_b[} w0/fmPb <ާ,{{o>up|ʔB#x> dPͺ޶m+(ҔTKQd40f$*t-U"!èi'e7{W;p|ݡo}bCM'"~fZ+zʉɬ޶IZc!"ۧ@8lMM7k"1a$Hvn0lLrcT^`Q H@J`dJ0MBx>|ZaK-Dָm^̟potŒe.1j_T!,΂@ڨF*!_^=jJsO3'lͱdUBL+VEXfc-%U"*rT{3p4 J)B0h-nC25Qyv o8m]4՗^!M@]."+;  $Y3@/0j+O NI$W*x2b y0E5J,B+An FZp%,.tE(*hSL`BVT)g 02E`YKXذ%Y(_z >\/}$|ۿSB]2F!9 1]{>n9jpm4%(#Zv,ٵLF6RmqtW!_jtZILP5)*@/⥩@N{ -<;&yfs =Yh?fNvs{gdU8WOBʯ2B3lNm^rbҭfP|jjqf@Ó W)Pt`DbK6f$}h %2숂^2TTծ. zd, FUA`aڅS8A xK>˭.oP_nمOkgW"W3߬b@$D}d35ª5YoV3`{aS+9htk$uv Tj\`Ɉ~K(Xdbh T ocFVJQ: ^C 3͔f8ϳ{J- feۀ-{#ZRp&K:ОMDT~;&іC(3vER$%I\P % @Z@)FN]@N;bw84c*Xkۆ@ ",)j)%Od:^ˮ,>h·I_5yAFhG[3b4WbJn?nyض +| V`eij_V|171,#2bi!5ִX,T_/7&Ɋ-u8*q ςagZY@S8":689prT4w!5Lj2sҰTtu 0Ngq cbR 䕂&?/JAg\ 8>:Iȑ`n/,<,UXrB lKdp2r"AG F`cԇ-]뽋d/w[;R}%_l__f툶S 환LL6$v6f2x{[jVհh-mK`:u(EPUQ A%a9\ :gwiS]@5K(rqCIΡCc7ys 3 @Qw3w3odVUyӼ|:Chwprfɾ${@*;D@zT` $^$f`:T/˞~z*\ )Z:~R@`@a ƅqL, "&x5 &Ĩ$ĆzDP`'ZY-*!+/6*x<a&$`V˪ `@$D$*[y~2հ.&TJ7 /!@4T$fPt}zCT1Y!OF4T$z2P7dRdfdD,J lA t@€ mLTNf Be`T@~ ez> -4'-fm-]ͶXyj"Noy|^%[ /5\6>OM>?i,80~$;B}xT.jog@phYIզ  )qت}1llmS H#~pP!"㙲S?oŔM-*[Q̴n8g+Fr=D'TzVZ@ `n7V-"mPəz(ty~ξ5q7mИ3G@2M2aY @N@75WlB.*Me@2SyǦuZZwO2@Ѐeȡ p @D( `+ زB;WU SYıCY!A!C K).1,BX];{@^|M7>oȝ~ʦ ~k9bV( 1w3v,bXnbKs ,- cLvX4GYfiE-Möehg"v zZyLF AM1ft专\.19CSt7l2ԯo^x, 3q;c^89XO=usj†׃3rR喁2)%`,?|Y~/c)Q OtQMf_Q]3&jGv$aYmͺđ3n h B'خ(؉a[LL6JYui´jai Ҳ|u f%ymI r=Of: pG 8 6<<ˡ)L& LQ=-1 ϜPF(SCQ^ӟvմQaZSVo"Z9#.qʵU5qCUDM6TU(gKRDƩ*C1AATr_@Yd/; ގ`abxF?#@Y`'P\A֕"ۀD 6Qd06OggS$;fiokxkfzwe>op,oϰOl!]oŸ*z$ Fk>DAwzĤ,u%J+iC:@ɘʮ[8mUXVC`91hߤ P`($*QS))Nc}@NLQW1E6{=D0ٚu]0UI*MTwSː$q%j"@䳗  (^EǶ"`1VZH JH- @ Iڪ`m aϛ[Wm`#P{`lXyo$HBr%@~e[,ÒǀCI?w a> 8Dʅ"@C 92篕rT}\TR,ugCBec[mJ1# F4FVrjYrL*j0,F 6F`ҫG@2 (A< xsƛόS0OvOe:H Pp Rpe_gf }V0o F T 1LΝPɌ=u*df(qP fV` i2h_T`m c \_UJ0#XO֥DDq,܈ ےd_pc"J. ;y?*),T%/jg#kܺ@[PocIhJ1Rbloq*J[d42"YɚceedLhZIR(D& -#4wyTN+̈́(Lh \ԟwi{s00E-!T~u 2DOUfVIx=,bMsc_L@d ҉ieCB4)2eHV[27PɄ~".= H9HЎZ0;D5F$ j8ZId+%hfզ1IkӊbXh LbJ5sr`KEh&~2fLմ6^$2 +vs0ZÏ{p0$i5:v><;8=qQ i2qB3LUw`W/APD8QCʩ4"Gf:Y庫H[,1 ZM`'=Ɓ]X@n*CtL"JhDP r8m~m e#,L)Х=ܮBj>r[ пB}x:Aȶ(T)pYHTėXLHAR3+6ul:IDI6m*ruv[)Kf,Q VF-TE`xΈޮI-Dv2x0EB\g8#|0EN$C38v̰_՜vSv\UdTeΡZ۹@4Dz{6ԧ4+1akq)5زX$/xL IX$al`MIr czh CGٷ|xU\wbd]% h] (K"eX" wpKS#,Y[y,)am@70arH#,Z+ bh$m⻚lLM쓑4#X"U1,j>E&Pl VhShy5&+B2;rpc;VbEDݽu!fH&b_ar'rwؘW*JzM5w?L_A׈΍sU;ꇀkjx8F+& N`MB^PYY ہ4<_8W;w0F[@,(G5P;1Um$n2pW"}"VcdU-)kTp9 @XQeD6@X277L80@J^[e7 mDպ@XcDԿ"ؐxa&fglL8f,O6vuJ5 bJ @Z3Y pQ<rOSVv̈́3dh[`pS> n?|3`W@Q֒ 4lxO) AƬ3H-TMʰMII bfl*,9kMYgꣽEz80&94 4-܃4+8E@9ḑi⩦eO|fab]D {}lM͏yay;GEQw;>9Pżf0MG35hyC "\%djK{*6EF2Z Lj86L=eֆAJ(@\RH- fS@3nF$(q2E]#"AX(C Ѫ6H J87Uy2%{&t?c|TI7vAl{Z.cyv7%mL61ca)Q@VT-4Dzª5#KrEe\&m%RgfӨl(op. Fd`^n#3SȖXߥ?j{6Y_й>gIfoc{{ 2:Y@O BVEUJH${W["Jb! u*lF+X{LJKr֐]:DZ!m@V+ ZD$E1+@m6 OggSN;~cr]d[sXtrxj>P?c33/M?/|d~hA; ,mv!fTb,يMRAKΔe$]ߖFx1jr, :"+;"@Mj3R -VlY oʓt Զ!y0@Ngfag 6z/qh::O6GPΚP V'j U8IrBT!f-M6("DY yefju/ ve0Ch4P*PUt4@@8'q0` e>===,= N@DEJZEN 2d$ymV[RVL,4ݴZ5CD3gM dy ͠e&hd&J@@ien:Jd< aT?lpx- rj] etW1kև4wEv2Ydyxo lu%Luf0{0$0^'xrG!q,BuӚ <0FoPk #LQ=QLe) acڡ:dq(r4$`ĂTkԕh܃ZHX+^c+0oPrQ;[~O.]o>vCc$ S5aQa̦5Y5``omRb&լXc6Vf} M!ڥN%D]@tYS'i"-1"RA9*9b켻<_zwx||MM<ټ+hgQg»SYK{,'fmA$[dV0=>I v├etZՈd823SAY1+2"l!  IRi.@1d DZ# _ b 0ȊFYbK Ck̹]g/i>GKXZV:Fo4$f;`S,fdח@H-}HmZu'El!W`}L4D @C2lZs @e T:H ;v᎕IR 9 axo^.{m`S_G}̈H3a䳵5{kJ ^[Seg&SS 2'Y9ga0d&睧IBDӃ-DQĪ2ĭɶm| 1h @/O4[ ^[ߠh,)K>t 3wa~v;08HUUֻ.RE4j1 YZjExC<몕,F XZWUEF)Ѷi@5ؚ qp>^JB䤑.`<(^ǭ[ 6nm/ GLErOٮ?p"%PjN.11h&4}4M )COjI ^4,enVBeQ8@"VM[da@i ,c5ZF+(('{T4VVj+/Ul#UXH^1# X~ )">̛S7V.>BopVҿS"|+6z_jkZ+1h1 i:$mc؊vf]} {R2 ͂Q}،QS-5 ٺX%Kcb@% DMp4Fa)(x]f) ;WPZ0(36d9cwM̐ݸ|=8'GWpW?~x{k"`:ZcD]A.&% VCVb5[.Q4%VheYbՊ  fTlt@miiUi5NdPQcԡש `LUz@n"'6g:g;Y>7{]οo>efz zULѠֆy@By:,*BNMMM EBXDeP5Ri጖jfʎMZA{5[V'8$TVQpL}~IU'0K6d9Bj^W[>op*g(Q~> W%g P?09͠/EEfm^TML3&!ϾicS0l"ì#>ub8Rh$HĚlШ^El+(@PלB^@d#FEA&Zg(c(4Xym&1͞=ŝ|'k3Zɮ"& r+鴟gm3Wg0T֚ $I;$AQ;J pRBm/2Hm2K4 ӍfH,ݽh)*yV! 1B&d@ |M{bC(@)>[媔a\io  ]o'Go?;6v/FGm+jX4Ώ톊A:1ĪbUL{xz XER0PjVhZ&0^L1-@A,u#t@2AXe"6_Op0'h@Hhlu4U$&bHHBPckahEA$mօ?*A âO6A(R v\ " ۠Yr"rÝ@uVrQ,Rt5 L80V3W^`~M`⫌ҋHl34Rjf&M Za?Cv< j$IffQ8D!;PBjN7dD0{: +6/Ey_, `۫!,Pg_>D ?c_1C|_ށFS¿xwwwv kaNc=Pl+s2ff[M+mºmhj4F⦝a&XaҪM6( #˂bZɜia*JʲJF^ŋ(B XaU4tmLD~8927Φf>3Ó\  Y{ aLZ b,R 5 {.KKq+30,(< ؁!D~0$IʉU T) T@(lhYU50AlڞnXZ .EJA ,$ B?OggS~ *p9qy|sphw~kxq~ۨ xė}q.3/J͡_P)=>PvhG6g#vfni%X6 52vV l[Q+R Z:5w!`i0p7I AP,34܊؁ossvu=gߜ)G|Os f @x!ו*\lN1&Rgz 0{L%!1e6s NIIeɈih`4k@*h˺.P,0*yʰUE@Q֝K73Ŏ$$>&ySoPއJH ->1+HC:%ZѰF LQ`өkf]4,f-6\/v#US&0$7M 6Y4M)4 Bۈh @P) h aAYFao{+f4฻f>KL2*{\5,k58)e^v!ޔ/7k `UYHLP4==iYs֐Kv-;VA# (^2xh*Ѭxe?b?/+)Tg"%qXA2 X%E@n@e)?doy xҋv|5 vX7  >vv΂0Q`Q mүY$1o۪jшA$ X=fրvB!U140gnձɞ} Ha2քI̢tܞá',P :PQ:!sJr* E94,QrÂǙVarBХH$ ]TVPUBE-Lx%lSk &xq#BБ pTSOL <w0*pM1`Y< @"rBL?*kڲYhl  ]^( x-%Stʀ!(,aKϒ&X@U[.>HXmVWf|%fV &d#`e4 -떶P,m"%V Q LYHL9Y[ WÁ]0kA"f )P<rC@kmDL~݆ك?"KHś\UV}?)LdI9,vt^0=LV@tLC%1288lg z=$ L &BA(3o ygz4r]Z ZY@2 &i"NcY"Ѝg Nl @w51 `)<"ȸ" @gT(PY 1F +ײ`0+@^ PUWV*"T׈"X @ HơXl ۈ x7~O֍V/^%/Y}0n$_j۰6 +!`d#mp&$F*dZW.h, 4Ljmdմja8,mL2FhdPP,jbdϰH$U4u:oʫ,pL-rJZ7SQ_PJ SNj433# 1Q08dz.ڼ9 -S]deMGI+6F$UM] 0jaQ !Y]tVQ&340dY6iѶ3XI/ơ,8%4" .O x[.J!\sI t $cD+_FG6pgP^XF%r;Djk'і(PvO7OYc54atI2# HT%ᤊZp8}{(N0mNqM_;'LО;CO6JK1K,*]0e"fQI4`%*. 0%)`B&!6k:=`F5 &FD" @DqQƆe:41ָ,:4bg)hBOY8]Sv R@D 08Y$ho XK,\,`5 h#>&4[8wP揊w 8~AUq0UjId`~ T~F /4)iBsKb b[U-"Wz2KSĴ,,(աhMGxb< B Ll>g4Ɂxwac5 [u ;Wz3@wʖG{p"}؅CЗLȡ2yg;ɩ:svjB ƀ=Y%+ SeL",3kJ50PdJ1b*roK݊az+@`E+eRK=Hr" Ru QlyyTE{)ADv{ˀ^(=E _&U6B>rQQɪ! 2 YOBmV1H F#EdXc?Am:,KB`BwD@(7㢣4rK$ FqX[g ?1S[ ;wZDpվ>=j'QwFhد crJMLoJi0s u74}ea\1☾㣡-+3B8_Ew0 A/OԄK/@,zw5~՜ K{n p| )y̹CH(oPCe]$]⟟]'yԏwm|K?w#>,8șnlF )FF3PZaL<` ~/9mkC#b[iJdTCsݒA,gjF[U2m]Vm9vce)- j"v@H xPNij5䎙InXjg$Q3L⤫z(ݱ*+z9VQ0b/J9`Ԕao;W("#Ĕ[Fl5Êq b L^W] ęCGL@Z` = J-@8fQ1V D_PSDeidp5}P~&JWjD%ppCs *4ߙ< f,Xm"!fEm8ZDԂӴzx`:M*U%M 갾9dnMT, v6&6* -X5P-ͥQ,@!J%/\E࠱mWC3pؘmiL+rxjycvIݾ'9,UUܪ}6 es(} †4=Ҳx B23XZ c@he _'+"aE}H(zto/"zyp x ^[ p)G4\B}lǁm3u |֢ A`L{ 4Ѽݴ˜wnU#K+*"6ZX5fRkuƬt6 bΓ++C` 0m &MY1:Y7%eUG;inܝ͜%[@ME?MčhmҼ39Oҏ(ojr ɂ`vl~vH,3z,q CD3TEP!lȉq"2(9r14@%+gRAȌb@\*li Ef^p*ܲ&(". .)dmYB / ۈ|(ͳпoC^ OA2m00۶mMHHN ÊjFY {1x1k89hMz8JC 3UZDۚ lAJㅑ,AzCY MYJԶTm(1"ngWG'3pnꡫnw3B9gqRQw[s9.o7 3ũ2I~F 5LM|b1iYzdY%@0jz30!NOPEҋ$hz,ZB2q6h$P1T໘ @rURj qN[-*]x]aq#ۑ i/2FF)xzGw)RoC/ќB_ H{^_jGa >.;ëPs?&d1VB-,:bVA`P U)UV-  H RXK7J p=AVZ]R645!H2kzfwߦɁi_>ofgR0yss g. Q,`ɖf&"תޣ 8$Rqaeդ'Ȅbҽ m} cpC*L\E$ @슔5K%Z @uK8˝` c2nr`6 r`΁2mVkhA6bXzx5(-ڗK6.>|@ g eĬC0Ap4MCl]U=n}b,r^=,s?^d+37`rˆIQ@iy&*hBMz'`ӄk 2R'KU15l}zTtBI(Yl (jXDÀp1r(4 hADE_ C@XfYe+hD>|+42kKV7t7PwDqɄؓМ 0ÚM̤QL[">iO2zlhuUKҴA6 0db 6Tcd]0!#L't!'(l ɹ܈ #6_W=a & lo5pGX4n"a֨LT۱ VԚiNۈ!2X6}ZaՄ$5!$uPEɵC2\34^jCFZEc(\{ŵ4x>+|Jfw] jJIthѾ.TL禄([o,Q@t[W&d^JpU<4PBIFY$ ׺{YY5 4jFi:hTY+襬(聫Ò*'rY[PRQ,T+ HY[U/ #D(B$A9+ۘ| h/+% |55 [ ۗ;=I6 `ojۨJbAioVY,N;C5YmĪj`4X̆4D0Z΍Q"Q +u 1Ta`ER`AHw!):92D`vO z\]wl_3޺{:y;bXzzj-1J YHYZA @-e`L(a.3+ T-@@h:&bpV$ 4l`nCDNKBBR!2T `Q@J;5@! @ѓݐTZlDXz ~Z %co0{駥XώfNJL@T:#co_#coJ͹Zh Xla`b kjkT#Ѩ'I%,k@- S V*iMݑ9@}˕=Tum*7neb 2':x2,ݝcuq|ƪZgs"\]ǖGe8k.$UdCuuq!mK(Hp e_iOAXX3ڙKugĢ  4@CdC`H @QUAhma0Y-$h; OggS {1SvlwhbZihrorg~&p~--^ͻF懀 3gK>8%mGvx L?#.ދmCވ,c<DZ!K4|B=KX!RA]Sڪ*^ ET+E`@1^F@d*0 ːB 1Yf`qHعgƮj=I<0L'7$&j9td75z2k<ydޙ^֚&RD +ɒvL "`䇗2 ͸MW-:ji P-@{5#H ꪤgf)Wfz@F XSzs5PHx/ ֿd6w {Q d1x]u>=M!ԾU~]x_#7B.wa7ּ3@- USӊ%'mVEYvʍZFͦ-lhj e` (iz#g[`(Y,"Q (N`+gdꕎPJ\$>A' ?bTu6d=f==)*Y =PD3l}W;SYȤ 3&az{@ ݳ%pH%z3,! f-p0ΪZf 84P"pe@ Y0m V \*HQ6D^m- /@$!s H>F̖C@!8XJ t8HI%ؾ3ضF>)*0665[Z̩V3sKJ<v",UFЊ-l̑YtKmdAf""֮T@:X 54-!ޣT4x"אCj2KuI0djSv@۽_uW%SQièjsW?wZ(jFhYR9@ )\Ҁ C GR_ Ve%@]nB#,1(pp,JRݑLKuid* E`-+"0qA(A^05lB e;ID^h Uϡ/5뾀-7 4$\B ͂Fvl:~MZjfjvli`c( %Œ6R02S'U ۘb T1SRc!QiEX9mMtGڣ u{JLћ왹LsZ;4uAV wL]ңH@ԭO&cf *xWԅp 3}=iՑP@Mbɉ@ƪFVb`RlK!^$PH JfyT hBd& `B jVQVaeUW\X2 5Q1F$A ܘ x-L Yo1sYx@ 69hTmմdLlM!հ5X~$ &,z̘1VP ت(ʈFN iLШ(:"XS )J/EʁrV5lR19֩ϩk&%3Rvd'1m`ޗ>E2Us\4l "x%ȡf@&YC3054MDLeieyHAU@uk*ugPd‘jhjM 3eSŕ2 EE ( _ Z=#ĄDBD~xva=!Wg7PqoiD;k-:x&d-q٦=Sb)>n&95ZmE*jaݺUnVECLk" FDmm$RYTNɓh:kKN_s=3d%mXٍz^UvDvh斟^Ȯu/Hg㹔l4[*ȁy9 T 7[40!@m|PK aYʴ`P!&"`Rd@HQrE ^t۸\bzo|pXoC7`xw39~5Y-sнYK3&NoZjul׵fV:0-Դª|LVb1cR؀9A&Pc@kd "u",֣T=`z@eg9Eu'ĝ9.qg3Mש3Se65LNcȈ8b}o,d, &a yq*j;@y-\;1D :ds@.z< H|%!e8>1$@qZZX=D ,H$J#'2KND0]|W(o|m 1/ܭ8mcB6"{A`4H`5N,I[3}j[ŔlKK{ pn]eіg(FE#l s1@h~؂)GRZBjF+#[2"%\M`ғ)gr,f>t|6Er6 /*c{x\2T%uEUEfe՜=6A#s2'~22єqPFtbhkB劻)ҽx$ wZKDjZ X7R@@i1ȥgczB @((# z#rڲl>0^ gƀ !V Xrv֦SQ6M0$~*ʐ-&/-.,$fZ؀m{K2[ ВJ`{ѱ3**,UFHPR!)lX^tQ={ׂ۳ nf#$ǵԹu8u)v343Ko\ Ћj<$53 z!EvO̸ Kqf !53PD=oY1ܯό)RJqPS twCr9 rCW,{U "הh b]Â!5-H]Lׇ`ˆ) "Ԙjl۸|n1E>dұF];{ha3dDJ2lE9LնY=ݘHpA1gJ)d,qbfgVl]Kn}YfaV"6#hQ3KsĊZvQ Ԙ0nbqD%)"̪^2(R,sɁuOVo:7n1;d;以U=C\'Oi&& DN(:ik*"awWYƃF9 q ŬH w `J!T-2,,bI$cPL⠇8NQ<,,,yƱH"Ӏr8XE,2F+ԖZfqcUX ƫj^Dv1/Qܩ%UM`W`}n>iu$9ڊ6|h&IbƠb&CQYEf`(@Hx{*Sf;ڤjE V1 BE`wGHU1 D@Jʩ%CKldm2ezFE){O-KS 5zgLWU!L牞J7վnk]z>~dtޅoo֒,I xꆷd@(^Xd.SƦB5V!#;@@ bUi,hnZG Nv~ʙ@h@ y 0+kUR K`@*Duau6>h}9WΜag1FC ̼pZwy,Ѷ84!dϊ>ucU $RkV,V[f$XQ,`APK ZVRLôe&e܄4LhY^V 4CO9kC~k/ZP!]=g592PL2r:Y@@C@%#&s jk(+ `RJ sڕ. =c􄉐D"JUe5R+`/@P` Tm`0jb2 E% bb`cOggS Zeyerwgqsiae8|[ڒ[7[rQC{>Q0P+fd4j-`vje>o6|VX5UbU7mFY:( 0UQ`@fmaIC O '+i\mE`.U̮U/'צIOV%{xKF}!NHhȌE&e;J6M4'aglLL`1qW*p´Zh@ BX)%po 'ȎN@pTxgCD5*"TB3Su*4rBC{ȔT5NK)^&p x؜QNZ%%n30/i=nʥw?A+g[M49Űj4 ;<SRi^̇gi&k뱷+3XԱQ6@X#bY\qm4ZvVY&E@FB nKD=E﵊!4L@b>LO_9W]CصC{dv⢫f*dT#G <%UV: xr+DlтsհJR) 0݃H"Wޕh*6\pzE-NA,CeLJGPW Xh)f*UԺ*#5v_&^ \17eM/OwT2ITՏjh10-b'F01K1F:jgad'-lc;YfWb͊!*֭ XQE*D ‹ʘ,*VH0RҞf =3}UfWtLdEqez٪n盱k{=Q $ Z/M=9NjE% PlbK6A8{*az-"qT`Q\h+z%ƞ !Bud}8 @kr-iM` 1 /I(&?ErGd|a¡~g`|2M},)lg*Ax$fV%fÈЏ411ǧr8PizY6` ιhZ{Q+:f@Q U.āyQ,,2kUC` `:(^F~lbNo1{FJ7?1L y;LPDqs^Fmܖvϭi9S FعY``v2*ڐ"MQkk2a q"0q\H2)O0.YW#_;Y&7=rqGd1dM߃SYh]0IfRplRׯ/LsII~̡6& g%Q{xҍv@@@3|Obd/-㈴Ô0 eI"TPg`Y=3ەX``&Vj-Ȋˆm  )@mvwDD7k۶mqHm@ PU>ۈ{ #y[Lb̷j/iS v$<8`DӪiMTX>QV;knl\y%kd[4Q5,E1mDh- `Zc+BeEj2>a~ŝuWk\Ia/@{P5~_P{Vs{ mX&;l5,VŶdO7IղxL1ͪ-mg@dAiVQDH_T [!p'VfZZX[da85;WE @_.3CwեB$m)9FlU2]ɮ2iN]7 ]PLu:̮&`7 R@ ,b`sZN-+P Sa4(*@0 nȌ&' X .cBˍ ^OYU_mtS@8Y֕%,ƀu=b]]{DHO aw; } ا[(eʳ^hֶtmL6 Hdiaii-3n;XTmBAWB݊`@*܂FpdM5 @HW$ k@qfB:M;rAE3[S lΠ| Aʮʩ}m8Q==䞙la*@dMXM?齎$qpsxCԴ)&'кVsnZrHچ0RJ(i[i`((-*d$Gfe Q"@IRI:aOӻk !3K;k wwOwL^4$6=q (],"!M]p*BTIb!+ xjzCXebS 3C# S @ ^*fFf0@1VVZH}bbBd  _"`Ҧb4scm)y JP-'U"b"{ xo19)qT,v`#0t3[S-L g( &2 l(*pwTEAT`+уbc G:L +E%%h| 0 RB/̷xz0@N{=vmcsQ Qi4X",f56lzLŠiFaaf+V,1rcdĺMM8" hj m1U"(*7"NI+=8.>Z!1~k3tbs_LG澻2uW7fN|Uwerdgl)79kSwi%bH\pr<3L#0k^}멨 ] P &BwXUȊGwPĥ3\Fty-5"!4b {[Gq-xY+@NgAcdឱH 窴STv^0Ĝ~.cP;ЊB}I\`"Zvz [@bF|X㱊`)Mbt:d=,#Vm+7r@n̩ 5& P$zD^a 8RD"e izJT PMReWH/|"vqߧ8ȵK,}9G2ԉv4A%Nnؐ R p4 Qki[""H5L'޵@u,GonC`d' Y[~0@P:frb!Anp\RU\+Zt|wG/x+ŀ`8bih.""~`}|PV΀ÖoP`o[F[?fKV;;W &+]^{33*\ϏQGdGV3e0IDRê͖TV1bx(AUiZe5P\zU93~_OM<է{@0Ke hQIjq=.a]c9>Χ?\`w;fZ;+C/-"08OB*1s+zo&nęt/=, dX@ dV26,+pg0k fiXvrg"?I p[Z$Yrp $"A0`$~.~Z?+a S4A iQ9mµv ?2a1I@io:lmV̋Dd%c T kYBulVUnDaǮn *fwW}m Zꌖ,tvYi[ޟș^v+oh aKz 8T\W7h 96==!X =q=30u.*>@7WV!y/p-+W R)A_b7_l1@s bE,YRQJ&+x X x(ʚXW;\)Ї4P?B#FThr*&DKbfH:UAUiP]nQVmacg\w=MT`KcB4FjU[ v@c!n #IlY&sŢP-RW]{@C]s29s_\328-sfmleaNLe9L0UtCP\OgBȥ1OV 4]H^m`*(*eccG K@eaS?|,3YLdK@ H!xh}rᮡei2X~2?|cԻ_5N=2քESaZI[񊬦#k sZv ePfY`EME03dHvF0^! Q#{"܃2`E[h 9e.& [GML=hz&g އ˩Qs{(O=,DUɝqTw#`X3@fь Hȷ@nǓ8k8i ;{(& l-[M 3n؟vN%kM~hd!Y?:*FÄsKv%Z MV=jE:fa[5ZNdD ,>Ya` nDjA1cQ$+T:D@A1BGEqFPg2]C&_5jֵ\sU^)[oz7|>Jɦl_80 \61= U$&@LH57'PFʊc UsYĽ2Yʢа^ 7Uʹ-!L<3it)ޛ`he0;D*.j` dQD1bfۤ% QͦOۄ) 23(oidqH}x|brg,ڈ2H '֬ȼ/  d A"VUN b)ZbiYj40WX W@ bg| 1`"D*V3B?~Ű4fa=9Tg 4%)@w18)oBrޙysQ٨q<(r@eT=P4$Vw@L3s֪+'j(6}hLwz0;%L. \`ԔYE^`J%T\АkUbbt+EE ?5!Jqp =c鸉3MakaM4Xa`(gƉʔJ)k1 ~}N.aTCODJqL`[`0RA#wg:uAY,V;YnΆZ@5~x ?H1b~?#G n;mX-LM)d:! fV@:Z.!_ϯ6EW&&3ޚ$2NgnJ ug_`)1Y奓Ε q+|E^/^ _Sy'|{Q/R8svε*ԅ%ݛ?8fMat,ڔylY Pd-Yo<"UY'JE ^ITT _ >z|Gk%DT[*$H!.("֢,*S%OyC$O 4%_s3V &_:'U96Ng*iFtcS,M1U Q4`U]k}+6!)~Sy/,/jb%y=A„vЊ2o"6Yh~Eլ$Rc7T5B&dUd`]au$Pyc˷)h,GAcMҪa"ukۭVc=m f1ioMo0 ;〉؉bZweUd1JGcJ R5MABnd0AvWhah xVFQYl"X{2|q?Xv'ԐҚTFvt' c`@D(SE+hQElYS,bk-* N`@OHe^"N=mE` W}o5: s:1d8=4Hѡ@Zbc}PS8arv.g^<鳱J }:| toU(I,mW'{@n@Nպ6N IkSG >]O+kv*}|yt@Ē!׆lqxf,&j.!f|+IS2P9G{zwBmV+kҩ!5IFh|F bG1 3&=ۇ_ku͏y欗-1~ws)1_@}G5cdc_"ȝ:Mv[ 7۰6b֜a\-p23MS/+MEŔܫBJU4؍7tbXq}^w*e2l>[ ׌AM~]}45!P9uWWD~g[R?zcL!e.7]eZT|Xct/K?ܘ++2ǒ~)WcYЃ8 `r$tLDd̀Pg=vkyHASS4@ AqwdӋ+bWYY֢"X@vOTzatv ? +̶Նsn`f%J1,@bèm(P,K.a1*>ۄ)oQ;S0%nPjᡤ)j5"$6tC-;&Ia@(/vch-@ŐL5E"t};ʝ UdfA`-3R آX % uD1"P@_`ʳ1^sq@>'oaxoS7X@gXy?Ŵ fw?vUȝjmDü910gYSsһQebQ,*sg kf.۩]HL ȐPHQmљ:X0!jVάѨ@3ˢp_OejL'֫`jvO?ϼN9ٺ1br򆎄dc0e7 TUm;ВWQLm` X -wŞGN,; (RD_s8y : Ӓ ]O|;J!rtUoʼIf,TxS;X> ;Xe7.>\dᶸĻA 966^?}G J] _`N~vdB4S11>I2O`!!)k`LUM uS" [ym^a_ q^1A5ƈ ""Y'i5MaTfejii XPoWZAۈ*E`f}=m?H0kf\<-|sLIf֘2:+i'jC%5aff`%,p -zjrNIUIqh$ " =!8"'G6@^MZ֎5aVOˣUa03,+(Yf9YQ(lp EN7N̊|x8H/b0S2"lsjElPWfoѻuRs ~ eY" Mw  4q\$۳qbQd*^@`ʘ c MŘPtMl2F9S1 thX HQ Oݝ'=s`#nwBs`2c3dH-il?~=8yh 0@[h+ׇL-2Y2Nyd,3RnHE+HQCbS)Ʌ.PK>^g7}(c8o/ iai ?K*LEI'`^YXQC!tA!+H53}ދͷSLRץ^5+5CE]ór]oi:^0;ȷ}M0#"Ȝ!KE5-IDM"(QQO͡O-PߺShMխߟo`22$:&TQ;֛_T?9}A[[?/r&os֣s1"TE Uދp r$mi1wyz767XcO$Au0-3fb4̭[0!:zࡠ@D+8v:kbɃ,L,WVV"(y{4dg'N_]s X[q_.Zhr:FZc [A sLf@!Y$@5pU\^dyR@f. @X1@gPbFLHk rɂ0@O/*PYf@1pmb٧ \Q%o}id)p?zqn@)m.OggS@MagPRMN]ba[YXvi|st}g&D `hx)gGacA`;> w۾:e&8N9U7&U55w bMT>k0_3wdO((bbYn-jߡ!96*;+FKŰf͆,XHiZJZ$"ne' K8p,tXLdxtnbce"DŽ]z(™iu&5<33E7Ym| #äYiej|L8t ꘸ldr!QU`I!Jj-*uX ǫcTps"$X[/ІE}o{w(rno̱^zq#"\ Umk*O|P'04*H1, BGV:@wr`"l0;d\@L3*S@3Ce -6O* l*z}@#=G "fT; mN3` FdKq $}J$sL+:@2+@j H2 @DzG5=$@AE}mLCf2NȢV'Ր|OSZh.cr@H4N $A*zD glrQ1x!3A2謍!#0UT,SrܝCĿ ۋ1+jAm4+Rq4['5.Xt&͓2TX,EX[yxDώ,5YB9P\W5m"XWᇕ.kIDyjרXѰ&[Y pou :<`{8W}R&ܐ{AMt|IX|r.?\A`T]A lXJY %!T)Yi9=]B0ŷ x+=F\op$B GR'11A< Y+:删6+‘^ % 2qcBEE3g80h eڒYE0,Mkn]R2ШS}p2ph/&sBL| Z0&؁Hh`!~$ $R`FQ<',"V4p:k%!IT]ս܇d^G ?lQXGg,l>7&RPhחo!cm"A֋uM@=5"/,"!h'\ vU[mW[ jc P/NUbPZռHY |=Pl67vu'NCXFj9xKI(>/+Gqhrr4]ۂA]%ZBiЩ*kt ͭiX_G $bM.1X1jfuY/q2^ @pP Sɺ8*Wˬ1. 4Ql)3veuW4 =sEL$  ~7Sz2iVL_q#""5~p5d#J=F`OP  0R<TjĂf@ J@!q3S*И, CK" yQf@FJp,thϨ@eK1 ةV3%Xǀ&0F=1%fZ5 ʥqDЌ$STE1M;?޹hffL""ԩʙkqQ(lJa'p$0@Z46xP "вc@R$!:@.!ZET+ɪn ږ &̼@Cryq:&܋Hb,FrDQj@ 0 ]h ԏJV(Hl ` *DjhEd* k!Jf~A`&9R<`bJaXX9)@ -a n84P94a+HYK/4 Ug2B) hfȚ Ϲuyq\)pF$n ` aFH %V{U =QcU)ˀT+ @*fUCs2 `|ZW1> ؝ $VS, ОwlUO#lfߡb$Qf?Y(1+Y!Qq3H  %6kfN$@XʼnfbU  b5V-XX*jcGlAb"9QN[@AE,Rɢuj[4-dL Y(f,*aJw1". _<El:)F@/J(΍LOOw7)w=Skf$I )m)1jLB{5Hƶ]*xN2⬤] eBUEKm:%KMa]W R= HIbzR&mOggS nqzxueLOLNNOY[a>lbmcck~)Zzk." $k?džوh  "zO% O窀9 J[A /J]Zxz#,rx"Y Ӭp"Vl`% m9Fj1`]" ^[R@UCKfm_`%R_`IEϾ=%d Bƨfeќ ( *P&hT@#-q8#6! 6]| #y`9$Fe{+`$ (tR3g3]`g$v@g4M F TuowbtM&=򄙀•\Cm(gg(Ԑi {o3VB8 SBV`RXmc,QvyCKGY$`*ZGC(؀+(n-Z0Kv1`$wpx jU0A]VԬD1.ˋqIKa^ݡ\~Whe^?f@p/TU4Zۊ;ID%A*(ar 1+ga:U@@bdjELBCX RGX!,d%Z9TPQ+9q( 8Ԧ*pI Bl,@_|*+i d8^?}=N[lF 6Cx@eAЦ B6f[4X@!024 C28LlT\2buꦕ5H{DB*rM?HLױ՜se--;q wNcw01 hh0E4+aD2 وs`jehYRJ̄.hM$jw%x 4aM +c7>pyEx*" 1 dae!bdQv*~ܘ2dpHnD}|fØQNYV4ˤS(TAhz!($'l1X1,Vⴵ46`@%UJoVcMBQJb۶"Um;AQ[*J d P5=H@N ڲ0hHi[ uf}eN9Qi} =Do1$S__^euň&" LNsbHZL0TN va]uƋhX EہP *Ψ5G- `q[[ZZ,n6VЊh ƀWU6('2\p0B/ %j7@or"jJ -p::i Z@0Wm-19քcWDckV5o֪*0~BRmEj\2CP쭌ƚaX!b TF8pɩ00iTVu$q8 HonnsL͠3$;|):=MQhh:"i8iT'5"Aa7!vlR0 ؘ 3*Yx\wYH] XMڦSP(*6BÈ@HzDR &!ڂĂZbP j@`f% 1ضd ~ēQ74wΙCOTaJD`UAMAmIHkԽ7:#&:OsaB2]]9j ~(qC{w޲1| u %"FWHmǔ&x;ZQ6亂 XrXF#y9|hϋ}z x֍BdnJ"HYҾmhd_R٬}bu{p }W~EIw'tp6.S8N+#Nu:s5-݋58 2 Z &x y^|j`(oޒH~聎Ź2q[41non7_v% ×}!9 8$ɣ9_Jd{$TB Kf-t̳88ޱt"pL" ~zҞ7~hӳ񗜤/ NȈ@WR[Y di5 {°əK{V(9߽QB<Yy`*۪z6~mZyl:BG`ӪcR"\몄XQU9KAЁc]ѬS;uQoq8"tE_O!:?;vs\rzcTMǍU޹3ܚd ܬ{}^΢ּf/tGUo 5+ݺ˷OggS@ԩM`\QMMPIONZ^Zvqvx~O';3T{E% צC9 :)fBӞ:PZ4={G** kr# ˳RG={T>$\J|z!-3ܰΚ'ƭ[Ruj+>tp%Y|ԮaN p{}LSE4:?O4mz}2`/渎)u="*gPi+lՇJAT6{EQkPBUcFAb*swxF%QRA}3<,8=3?_ۗ'3dy&BRUB۶a<Mbfvh#d_UN-#N):C'k XXHI 2Yy>? } |>IZG^=YVY!+g1g`>Uѧb SwTp/>7ߓ 3 z :HCͮ8kg쭭j҈Y3qEmr䦇.bLZj x,Yq!gƪ+R| 7z@U>䵘% =c0^{z=!?)({D;:fqE]kA,aj,QVc4%]#v5Y0;&vR{m-ƞ3un iz̝E ]PA AA;Ǔ(QThd"n XTƕHL1mfkNvܧ⋿ӛ#D* usaFK"!Kc#]!CbӸUK 䩳RDQ:BBrHFE;?h(A᳒YSx駔@+)d \")3 wF /gzC5X3Rfۂ94t̿63?7OΦBXȑ"!i=-EU e8N0Eq݅!ZtفV6"X+WyK{Z\;-`=|#V  y"r a;0DELp|2oo(޵LnG'og읩eX;ঐ"bXdCb Bg?chXbA&D ZEfaNa8aLLk,g&drJ]xgN2- U\ktԪbhn1`@ Ex!Q5ѣIU]Fׇ'L#[Nl\ѫq(Nj\]Zxbݚ( yO`L]2x6=1 PfdTTA-@iUUDUEF2x-s *r3@[ܰgp&S>/JdUDQ'U̪:L[$0D6^Hg8U-Iy3P 0V* kn@֜N&qYn21aII=DX9@p282V/FɎe@Y6Pо-~$fڀې.Npf9  %$P Qcj1D@0> ̫J@JDV85;#`uj,u Z2WF0 }.T,Q<@ 36(Йslolpò@$}N)\qmW(c^:QەY@`&'H#) 1,m1x`Cآ3MhV+֢l I`m- %V i|GJ`O >Z##L` laTB&>ڜLR/B:nI/'9JJ?d:u?Šv0LѶ 9'@&(S#J2ִ,MPE2ِg V3T@-2Br)`lB܊fHTM"6V4O.K~ ˪ Z0t'恚Q,2BмN)*6`uf#Ib`#VcրTe|%%2v j(,JTR"X0; M΁4b-B#cH ӝsMm 01ʚW9GAVi"]A ˫7oX}N|7\4ϙLuP z@p'l0#2qfTk hT (=,t J2~F!x~(*}\̷<J2c,804 I]#Ȣ Y{S Dhj,JBLU7&]&Ƹ˻C]ngin5na3@w$d,h @orm` 2MeZKi]0`-vBUڷaƋ`lT1 #ŠaY4x~Y'}X7E+*p1:JM^P}6̫wX_‡gt@5Soߑ2dfz+Y/Hjq/@~NZQu0OdbԊ3S @TBLu D<%EydSkWw`B(ˡTNW x|4!XV(_L f󺍤N6j417.*8Х61 *zF;NYKhx\>x?L"]<bdҨV*J$ x^ IFzj#QE^,L,I-,Q(Dա@df2<¦z֣"]ir~"k? TK/my-ܠqScCnw?>}?Ų~NɹEcݩ(@ 5 a[7*9lE=`uK(ƯL8-*- ,[Jƥ۱ȲO\@P[X^/@CCh[fbf&$ S:|i@M쬧 Ett u׀ $dF;)j 8љ$ (a9]Et~ʪ=,9Ӭ R9Hv@)" `ʡJرC1#0i[xI)ZL21 (zͧP@F¼*0 :h Ĵ{#g j*Q%;u6+YrePί,6dgDi ԭF9:ikCp& 􁬧x2HoD(܃#&iVߎ1g$_@Ns&T [A=Nt7t7NH T^Dz3 ެjXX6  2r Í B4L(Lac@6ā> `zM~jUYK@(}?97e0eWKjG03YɎ jFamS _6`^{P&U@OOO݈5,;f6"+ڪiR[U@i( C@*,LEZX0͇L-]s,kB}pOggS@ (Q|{n~Y_^!N S~pW!Y G +uBz#HQ @d$!eͬ8lSҘ5, %@,֨),9 7O%xf䭖UN S9oِ7֬(b%uzZ޺ԩZp3Se w:Zi%!`YGI1"CJ&o*)ʙ;6 pQJfRHF馁eMnַ</dh5WQ8*O aaa8P$r C,,hX0.#<^FB;Ǝ@Ugju&"XCik`NxRO! 椇ד4p! _ ?`^5\g,l*$dQ@&@3 0m\EP: yJE j/TTmp;^L*xfTj R]Zo^B@%P IA`t"Ch5 9%Nx),dNg1L6;n1'A6QScjRvі `bdjLdbab[Ĩ7AJtE/T84Y4Ls7VERH ~\˻r(  "X&U\V&(}9" #VGZp.^tT RB&Y3^"~Au 5  AYF$A/@a\* 9^4VA D7MX ;։/F%`,1$?nfkB(iMF55( @gf(ŶqC SC9g2`|v#̻f肧&)zTIp&׵zߎ*EwE&$ݼ1ݔyeQT Xk  8LbA鵑-@)+v-X4~Eun+-@8 x= ،b *jEHbuFlM 6baai(RB:_92oڅ4x͇֔ WҫJϢ޺$A >k 6:; FI 2Д+DߺM@- =lWUPHPQJnf3ж[J![U.d`yʐ,_T 6Ʋ1hDn3g@[XS@B22jXTՙdk>:LE7(}w5+qkxQUL7D! ,wH(. 0Cg#"ŭ:  ! *\JѸi*N)h&DJ]r.b$^ cUTZQ@UP"*FP̂ aYTN!կ͉LoH q$->6SE= YlvT5:d PAh* {`ll@ ȪAsege6$ N?d٧grsY:V1߀(9Xc$Fr(l( S d(\KثHG/s4o10{uO/hUN5Q,vETAM:3H>0t5sQ+` D*R֘[ ԈXFALcn**+ɸiOb ;.6`GQr0-$YVÃ$Z$"jRoB:R>'g@KCH 2lgD Y{DR/~2o5\0uQ~$@ޓMS}CTYQD(pd kMt:ЋN % $rJj U4Z2L6-K@}fy40fy![9@iq}rfBW1 ZquӺ1lHUi92[HUPCͲūFEVzyw]..AIPbY%(b"ꪑQr &> r_p+Y:> ̺uYjȺ5dY[#"Qe.J*LX Fc )PnZe_ƂІ9 ilA-A؊5!:!.bkTcA ̰fW5EQ0T dOCW Dg1Juifޙ4H29ge@s03 #d{L#-HCJEvQqJ]uQNlFF[,Yɢ2X_\@ 6iiL@M1`J d>6(2{R n{ |A(E?7 bhf]TD޻$(@0%C(❦b(@sK@mЦ#ByΤ,%a)WȄAjZɖZ1\hOla:X7PTV`9*.]Id$pZlG$|f̞& feNNɜu`je֖B@,#%S+g=,žs 5)QFKf eHTߨҰS0Zڹ,G,xDf +j{`+zfY 6-o(DD0y@HH1kh@,qbGw>&%qmFN#A0^u,,:Jo@ 5 Ri3Ī@$C L !'8?6^ 4G*.J0<!{$A@d: F[3WTeUVjta*1șP+ hI(*H"Uf낀ܼnY Z,bVDlV.94c@ V-2H ,l,+NqM4 enM!ZwS"@ X$9̈څ-{+ADy(,Tjj\ Z/c0^6о 7|%d l}oqy%l&7P${~z YDX 'L:_c Zm1x;f TLj(la6ؔ9e5HjQmDJҺ5TT@*PRaĀ:Roa2YS IsG%!gyrIvÔYr1g%Xc:g=H0TP Xηk@` 2FBYlj P ((`ȠjT $zF)P pX .1Iyg:s]MT p " 0=Y{ 3TUULZeT tcjd,,\IT[,5e ;bjERQWZ YH>#jld$#P`"0ٰ~Ḓi{//-k[f| d%j4kTI%&Y9bb xP,",ؐq Yf QL54Fch,?Z X7-HL2[kbx Em ׭=I|?tCOLL҉^8혳V&mbgVфcR.Ӑ98<$ x'afPTnLTK. ,(w$KEjY!_oj61>!#j@+;]i&$R|ߵ<׼v ڙY3m) >@MQ5k)$!3=IZ+ 4[W{TA\|j2aCg20p-VZ,4'Ƒ1uw85 Te(ݺәFj6 TUOיENk*JȊL9 ( c6@ iq=+.6PT,$tJqd+- `R䬏^a'P7 03}Fǚ+Q(hJ@ (ade\#(&>6D lR> a/>*^).CzSC cu Dִ5P18hͪ޵Mǵ"`I(V ȰZ3P*u-+'0ʹ! k S3<,35UϭgB{8ƝӭsF؟w* ɉECip6cgI:Pw4b D**(&nКxm\EO2ҝ.F !W!6L8c+h`PB;#xb @?cEV;!ܥ:D%M|QNIй!x~~,p VJg Tu QHJaZ0 [}R ad@V#=ٟ53mX1 5ź 6Y1-0E!BG@_(y>><6bq.[& Ԝ,ًYݑvh mg %cf!^%q%C-U!{AI7!aPCUT$a jDfv d/$bp$ p-U 6[D+V4V~6ĵ ~_'(&wxMW$͊lƎd;`p*snE*;%"&1jgoc\<6nGr) dQcVS7,*U0f48"6.z-Z$54 Q lӒ\)?l|znnOJ5}+ɰT͆tVx5 EUUq `` 3@ÀV   q h tZiQ>-P-^fz !: 6UUt0=(`mVť?8Au ocQ-r{^7s"R`Y @P>PWܔ[+KAH88 k߁^ QoDSFۂ1mM;6d0mL  EAwKɐNQFGL/lw(ccU/JTr[ej&*t ea9q ԠPt`Eκj%xC8}c_M{ɥSS?5vQchL]I)noftP6 t`Xd Drp΀ɬLsA2 ^!ETPՂ0PC^q*i⫲ XW9:i6`-6`+8Wށ0Z`{;H}Qհ"~ۤC \۸M|ş| o6QԞZVPhô^TKΝ?izv;ZꯝmǟLȢlFoLcr?ns}|odf("UQuSP 7r;2q'|?FFz*Na?wv1>os5I~< WPSLm5Taz3۽A~$j5֫{Z鲸̷ZdC;zsבg,E9=§a"m-`[/.mif-CB!kgzy;̲sn<270*x5i\3躗Ҋ#P l@TatX(CFUUA@`"F! O`)nEȲVв%~huK 7"H$I#(!6D>ۤpa7mC;{?VMQ 1UVߺ |`;x}/.rrl 1aseڜ}OB>|͎>Ǿ8S2DE(0bP42ڶ¢BόG Mg ܹcfI!D-:=q:v 21n,JPc,Y dt/*G,}w 됸n B$zkϞ)1M LM5LyLjwG*+P\PfWu,8$@T@. ZԮ #`/Bl ZۤMϽ$OvI9yz(FA *egmZ;>=|ٺo2=lXrcyFj<)3궖jc,Y6eAR,+  brM0CZ(t$@}6R P `|$zNM]1ҥ({$|ic(Ҋ[{ri:{p`f2+Hk: B^ jFRP,3%Y6- dCDz% qPn0X0Ǥr`FD PG k1–lP+7@ ˪f镺Z֘UI +OggS@nlK._feW@>,EtR-!ax4pO!즁őx߼o6M ;6 jr8SM{KK  [X-6[dܰҚhfVkbպigP(Z(B@HPA Q4$$ᰆQ "Q p[mPyv^l8-k,*T٨[ Եg%JV6r -(f]mi"a$-TʂWF 6JAYQiKW()4i]\Oi@0ln c-@Q|_vi䖑g;{P@T$d{)t)H;}lwҀ~ 3Hs> -V֬ip/M 0OjY] 7fku4L1׋7m7MdFjP54 3s @0 z6caoaZ,%Z**hFUPF!1`3F#BpHfi 6a& |_mn O` |m! 6۞SWKiȅLX,`j!mbQ Sdc"(l/@G-e@  @W`L{ؠY8J}YX-  T% ωFڀ` Rx/L}RR9w*-־/ 1ьYYAI*#|f 6af 6X3P#b D(jBMV,D1E7x" vwȲcj z公v. $&@)@"`6d, @* Ĥ]*.tZ `]"UU {T7 F}wkaMIP~MjbmvI Gx) ~3|DqōB-D8ǘ;n2)rp*ѳu9]־ (H-MHٙ6vbakΊeb[ZR, {5PA*[Q5ZlTC75FBVF (+I9yRmѢv9zg*BZZTp  Gd%#"̰(2/Nc̋Ki@jU 'U x^k@k-t_l7[7/nVјwR EeZwuZEnQ*`d`G$)60|q!D ythFHcB\ 5a'a/kcR ̏L1sjkZZm!"j&,Y&X; jzE`D i IPHA( @#;DPT"R8q kzh I|)Ie]8G()Cr`sɨE$xc.= mN f űTۺ"jo񩭽%!.8Ѵ&tk5jie-jX0jD" 0kQS@ jѽx.@`c$ }gJM`l>^p$*1&NDb(v u@z5S$@KvFhuK50v$dA-, q,㠻XJib!8Ʋlt[DQ 8gŹ8ĨxĂ1Uk-evXm^6܌%ۘDfO!> _%2`"-#GNAk5gu yjf;icc6bckgW;"1 Ѫ)Jљ֬T)U*XTl ʡ䊫N)U0`Fjw;PTk@] +J2X@jZg4I!+.,LR 8@haewSZ$`kՖ &5B6ޡA%0Ċ""`_-(VYP1pFA(Y֬`E5SU XT[hTYAUST)R6XO!mdvLd:r*oZNbˆmjZMڈ*&j/؊*boՊVŚu #۪X,LAŠ xGX(AFl1;b `QDFESJPv5D @7E* xJ*ĆTXFG'-M`0xFk0LG BR_$Pv6@ְ֊N "`hѡ+ ;#Z]*DhE' %H*[,T貪#ŀ@k/^6T-@ ~K07B1d-pcٕ 6N;FHxT5lT Tb؊ikXm0lh4ԊaݰbiCTtVGJ c6q6tUn$9+t0t@؃20 *YrӫJ cK;#'4`@,$̲^ .rBd`VHVA@ teuªl 2QQK+m-Vۂuj3uH \@c@/F@)ԲX6&aӰp・ ͷao ,٦e:sh`kIĒ 6Xrk6fXQCVMXZC[Q5kYTZj FUz( = 5RځՒA"P9$CEQUHt)E J4t1~($'hHdƦ٫+ ڂYMNJɬP0*DWC&U@P-So1R`!>u,aҼÏ<jp@ "вq,[!^VMq? G67=B]B `x1S`QQ;Af>:$-o՟fPl&khKKbh*v*2"10UE -a dPc1U )(8*j*Qn H*F9eHsoLe'w8/DQdWG[" 3 1*cL(sq ST3MNq.BTq\dee%% 2o.Hnf^@1'YJ,SQW'^ RE ZQTb!"vEE X`Mq\ 6ܔ@2|eq›:F2LWA @\+Ζ6Ybi%M1L3iBl5 QRLqĩQDUTbX`ѣDB-,H%c1 t d@v$dxfd8tl# @.(,%"Jd2Zj +0ڲR% @G!}w86N/ηϛFlkYc'@rN^SWtZXB)  I`aE!bHOggS@ aHKRc]FhQILi^FS} "̧eCrp "̧U2a TQlxI\+0 ۈx{#>jIP1Zۚ`i+bo mi ۨV:juZ B&Y`3 @U`- bZ;,"JD bQTZB5Dt WV͐sDBFu1bw)ve^S8˕MǃeL0y"1n™n, b񘊉 )++C"&'lƕ,JRfLE,qI/ `*`m_}\>okS#f^3 u\!۰'VdC+F<167Y} 1~G!DDPMp^282 s8!bk}*v b1l*V1l3 lMSNR d` av @`2 ("Zk/1F+j jTAM"``j j(jjvY" d"et{Q"0<&Z*=(a A l\(m MHEǖD@3Z%Ea($X`SQVFDFr1T5 ," .Ff:bW*0 $d G$-~ Jފ̿Pϐ//vߖʑw 4.}gVp)6%r:Û л3#PUŠ İBfjMB("՘PݭͮmE .5V4ޕF@D'@ 0EQ"L`:Xu5389W;6UXm! SS<0J3 #,B:ȕ3XI( #ʒk)7nlE0 vk %Ouבزk ]W%HX82%"VX Z&T%y 6dpS 0d "6w*i~9S?S+aX#-٪ZQ ,@[ bfH4zkSRĠ谈($5bd$VGPE%, jTvp{!{ÒTީ0^4'ސ86vޚgմqFf6XQӚuLaEB <8q@HH0h*b*]*ƶb"`*-@@]`iWb:#Ll"[ xww?v5  )&RW%ȋ&Vkb'mt ˪OȀeE5S Dt "ϑ \5ښ8dJUGds9@@ʚ[F=D_"DV+Ќ*P`.#.DA!8>G)B 67A} A8 >l ^ ܼ~/XM#`3g&Cm4MKK,lc[-RL: H *JF PJ a@K"4hU\-0`@.}-T V-QðZƲ  XJ`(j $!4(nO-** Qzs҉{Ա1wA ʨ?u-&B.ORߗamЯm1pK49*k>rPo ؒ׵^Q0VYh)^@"&^'x&6dLsMPB܆ %]TRFB[;| TNTmĢjqZ,LȼhV"Qð3-2aa+6dajU- ZUohM ADT1E@Њo~.nR8113)b2XU0DZJ % ,ӕ2@csbXN$@ڲ0@֊0؀a1@mP^ `Z˲6 VW nE@llw]Eb+`A*z,k -D]ATKd9 [*>6]ƆDɐhl鹛 ip lө Tmuۦ m`ڈa1D8!`=hXfa93YZ)aa C ۆXh-D FPh Z=!+F2FVQ!hp:Qe#hC ^i gGD\RD|@DeM0@6&3G1 n@ BvAЖTL0_^-*Xk͌+:1>zKw%#D᡻i(OOe̲HiKRxV*{ :!0bXE eWaZw;0Q1 i ȪVj!FFd)0l.Fd!Æߒ7ƈ> pN!mXG>{pC"`k5AqP6jX, rUߊ-b5 f}jPeDCժ-R0  C_T@01e[ b* ϟ;cA+i.,#1#EEvsB( YY^BB' I.aZjiWT YQPς+Ϲ"{]`aDV‘Y/l *(b,rSΈ`)Fd%F0lᦨO!'".GSʹM1Sœ% V.^6X +2'XZm14ڶb)E*ZPYfM ]YkPr! m^e*V1ΐRZFoT˖ne@qC1K(fՎ8vME|լt/@kVf*txgXeJݍ`E0PZ" l$(3U!U8"| r}IdsXfڢ:̃Unp^ kJb`7b,%PeY0ƒ,'&4Sua{~s!mic`΅LF/#wS9¢mYJ]Ф)jcgcѴQTu(:Y`0D-011JR,g؍B15b"B|T4`=*0q\@TX;|vL8%ge ,@9.gfP"+$!\("CALX8ВFT)/@qG2P<$zNZ5.*Ze,YXP5@U(@Tm dH"Fd-a&yoMB+MYƘAmԋ;hޑ !"lm:bX`cooAZna]M 6(+S*uh+Vm P[r(!bIʑ@ ,H\f*B Z&j1_dhͷ)x݀"U4XFEbk bJt1db92T&i*arVQV62 /{oȒ:Y!Z@2,7VwKۗo+hnvwv}%@f敐W&&@xH~F3/&U.K,CņKҸ &6 QR*c` X^6t)$+6++ 7}B_@sc};jAXi:B0j 62[7LXkTՐ<[m\7Cd ha"K)z0eكڸʂd`$B+0X!#l*F\XlQFQ4](t `Vr IX8픱;B/Gvm2["pkGI&@Z3 hX[A^>BehY03 2HaU*u/An,wǰiȐө Ruٟ \)"+R#yoVWj9""qkEb.2`FFOggS@iS3=`X\Q=Wa>H:64]b8l4⦱B+~ G.؝t(h<@(a"Hl-nBb ibau2Ym0-:T>`1bTQѣjDbm1Xzl֋1(E*t[j+-\(a`zXPox(` 䤰 vB2qHHd/S,G8A^Rأ [i"!aHkLfgd9ı@I@tB >dX'I]|*+֜J@ E02@]b ՕZY&  & F![2>fSycM>a ߙzf7UBދcSL F`h0aęuRo6 ho ,0jA -,ƫb;ST*;z +"Z*5"@(" ZTp#}pS"rM84=Ox*M`CO3 8w)IO ,PtOi5݁+T UD5^ԄOHMZ-5Uh`"VZ۠hp:IނojXkab":UlDՂ Y-@^$>7x.iqFnu\ii^ a5tz*8u d5.ظȔ, MV-M+66u+bZ1""hDh (j@0 :HºYX8%?rԦ#t  (= vX $*gNO ! %@XkUU!Akͤ`;B) xN CWF "%("t-]Q(E`B:@pլAJr#^J-`E@ka,ˢUkB$`h~&ܔ&D5Ԉmq iMnB_hco ##b7dpӡjL:xAzkZg1Kq'8(؊mM8E"j))SP  lcWe ,-)P`%X (8mwwy` 2p#E)@f.XZˡ#j2v^d(Z~g0b%" C3PHD ,L% Vrl=46  ` ey,ţpX`]$3 xj$v 0VTCqa62|J 7UTHI#i/,p>6aQ4BixôX6ZnZAY5ۺۋljRҚiZ UPDAPBQBD,.V-XDmȸT6 RRXE@ }y ginJ'gUPed"H+A +X \k`:4uO`z"l.#) EADYd\Hyg]BQAv3]?^^8O.: ň*Z+T(E *"`5# &4ᗂBӌ ϒigMϼHxnC ZmxB:{9GAË up /ujgݺaK X(KaS1"mM):u#BZ (I,-F0nRK( ,/Qm](8 pX>EorL[mew  mUkgJj%1 j-V0wЁfG*fbU(+rdn` "\猑. :`<Ϸ#== @y5 "XkQ XA#`1 e!)"r[-/! &d)m/߄ƏqÿC,kmT֜x|?W6jU; 諒kü"#XK[XV1-Ժ `i3)jF4h5 b **,'m 06/qbQ5  :0q[mh[H(َb 9 EXs Rib\ (@ g4-jUVZ´R0o@U4+Uf]]]kne1>n@@,@E@l]z ы \R(EpXvWu>WDCm戛?[0FnĐشө dm3iI@-fho*vvoA3V-ŀ@;1-mKFuQ-XTE͢LAFA@7J6VhdEA5Zm"]DZCFR4 azJni`!GhF,uFIqǹ9y*PmCSA)uU EUKWIal}ָdU TQԺ Pk,Za/ `jܴk"f7#u. _ =$}ᚍ)cL2sLՂZP jlM;bfFJfa0hŊP2QlĈdChJ(B Z01J,J15ȓf: TfcW NgT'рtIײL/:6lép%(c$I:6 WD&]RT\9 J*AF\ XQ+T[oU(J>3H,@O uʼn*]5 JC X64K} ddᦇO!DO.lFh< 6Τiവ8Zɶvb-lT[VPCufŭTDAՆb(aKR"cȋCXơPE1T %VUYy˚w1k*>WZ# -v( 2 cwE.)ʪEI*@a%:^ @hhDCPktafB0:Z "׀uiС ;[@3mV1-@AR1ۀ^E01JYf8)%< _{3nbfކ ܻ!eX*hhTy*P1jZQ;[SY챵(aMMCmb] 1U Ehܮ-j·dCɅѻDTDpbkD4EP%\`E~'VGӣw0 xjJ m ,5n@^-! DP8hX7@5FAŀAkuTVb@TXt(N*QkbFѡ*֡Ja5ljZv~Fܴ b2\M#n¼h{h>A7YwABla:TAl$u41լULA@LC UWڅT"Ăh` 4 "2&h B*PHPƁ!,`5 t j@r'Z`JMX E aq{*Z ,vi֊ x%&bBz#WTS!$3tC]Bt-'dI(CF862!VTъ`Ω"*Z7}j>&KKZp#x,ç=Wv10|g7"ٝ74k͆  V-V;%";Tv1Z]r#=:"V,DպXbP)NР++V%,'!Rr((eY4}r-?XhFA$O*&PR,K.Tt33<aeڎCݳt7קO~tu5ȪbR}m}8x@ЭC6ܴ"bdx16܌)hӡs)tm@cNSΰ`'ðqVX,3.6cgs-m8 Тjz,@d1F`,+Nx2 \2(څ^#zXz`.!0R>Թ*RQ* e.*FۆnL"b|ղ*5bFL0+ZU,"<^1SO6_yEFZY@TcXD8@BV\Rʤ܅!JS%/{@zD@) (2gff\Oޝ0ݐ =s"uI w \P*\w޹iQ,Cc,H (]UcƧ=V S[*"X]\bpQUQP ܔ%4"-)Ku "a6Fh:FHET$.bAմJ}]Q)Zoa9XbaZRjX%hEFlY+[(XF Bl5  F#bи{Q(!&4HP xq-^A!88 [|wDŽ4 .+ T@\b- )ծhq8SQ 0* L Y@O3RXuW̌RԊ30 2q;B@f5 5Oc) $5#.SŪ /a`uZH.XP 2OggS@>jUHIa88P]ODTLcWy6T%bdFmMU^BKFp&+K99# ԙbIVV5cf}U ;;UP;jA,hhĵLղԋauw Fl쩢pߡXE0XTKj\x7@-Z/$z&0]EiXj@ M[;s[E{z 78#3[EPZEEfGڡXcDD-UE7-a62hnb5J07dNXn& l`@1CHk, @aI$f[5vV֬TeP]hke1BBRV$Q,I4"L Dd-[sa(R6MN1 0 EX{'PH݂XxL'6(H P 0(A*bfJ`YF\ 5D 5lڪ,/?qWd[XSѩjT ,U[A ( ql ~6[ut?oېlk"ml^dl;Y|g22PYԂ´jc 릅ÖV2i`UXEUPaj*jҦ4v V,XA"E>Wŝl:x撁'jmq` ΰ ZQ\)ڐyYmkhXdhG)2|\qԇl O1dz9k/&$Ӫ!$LšVSLaacmʐ5+m5Zj CѡEVF`E) (xeϿu"#(DD!Ҫ^/E F0UW=-iQ.\R .W2J1] #t+KiA!# :2+OD}gFtž6Ěԗ:TI\TQD,-bliidMsǖ1K+VFeiX#X(vdEQ*Z!2в +$HFؑeG,hRA1eQyl8k ] !(F̺\U@%YY@&0#9,23L!E-;Mه$"  /,{;?ݡbw>"KաK$]6@?`B!1͌ VZ"Z 5bd, K$ OggS@rŔZ3^gL_Rd;Q^QN^4Kubl:Ȏ|T!1a2] rO$qA|aX@Huh@Rb$EAa7nqi&SRIm ֍>T>p]t"ZVD( BBT䴐!@l8@b"j cT`,'lNaN]1җQ԰e$XBA(A2CH4kH0 -c j@N6YY d]Uc@Jl{⬄x$ 2^DDk%D(ZE,T`UYk@Њ kV0GebUmS-T-ZC˿6!#2|e&!%Dɐ+3_ؐTJH5C!L"j[lδCliiiaK uS6 ,Lki`QDXPQ }5Tr6? A_EU"*FDz `L-7w8fbL!+hxVcDؒ=~ƵI8 ֤|w܄hd9v3 >/ѓV_~OQHR*iVLlMU4ZbU,h hE4bb-b(j~6)hc6|eBiM B+6aWVtôllXS io9@=/Ά\9iS_SV bbiuDj.Z]ENb 4lH}XE>E;0P*Z` 0PԫfZ{b{Vz0rh + r Zi`ք"ˀŢCQ [a"(ta HH7ZQU@DdAD `EA;E]*TDR"hZAPkR & * *V$)߂6dJqMT_B }NC?*I2-47ls$:b*2D{NLP`= l5S)*%E(IFq \V @dd*(Ҩ5 N%Tc(&{s xJq$`YwqYE&C&" dTA:*QWp ,g6,O XzXz.kSВ@, I \3^D|o)3nqˢ/z!7i^UU C&@T+j]'T]"וPG ^&Cu a˄y)D? 7vFf6'NTaEI3@!Xl, fa#fx;[X, joZhXiET"". !:L );[ӡ%H\REZ&27WœhPl8qN-0kʸ%KͶB+ FE 8~䪨)b^e) -*SZwHdIY(8]- }{)@=OL[O牃Te9 KlR) TV6Q6E5dF2ZW6D&$112&Z7!Y] 0 >7BNSyPDSAn;h2lmkM5)ZOaSSXh D4 !cME,R(VZUiۃ'-)$ PU+Sw mx XCJQ5f C@!BUI @0K `&ӘqG+ 37"b=1bm $s^]R]"d˞k$ߞ~ v3 <}I}7yzt`=5ȁJB WG@ ݫccG]c\J! `ˆ~Vt%Жc˞7=x a^Amk~Bnh ȩPZs$'DfI*VQz{2j1ƬibYFceVv֡ (E֊8`MqM(cF(]["XMoPQER(ZYN$ ?qE ծ|B)B(Nn{1UpTvg!QhY-`,$.b˶@RYj=aQ ơA@}W j,C 9#;yN*z;,< "i x4M+̲X` >&܌)댚j60lwc_BN*Π=TөEasa[%jZ7h=b bŰn9v ,hmjѣ s-*:(+Q@Dcj#0b1vF^D+ "bP4",bUK\0$TR!`@EEnj\[jyJg3 @&( =Uoi $L%U=F ,F#K5,:a^5 x "#x{#Quc@pB:*"65+`0"Â#ahHQla1~f4S} 40|ߴw!D; n0F43J]bFO:h͎j zZB ÚPb NU4VD4  !X`Ph`F@R8ѠJ6 `V9ZpxL!IJ6 X<$DV$ YT!Zd@ lP`0FK03rlw q:[@"6p}sYU-KT*JRtĥHQ b-*+)XJg)! vBqōB"`[})٧xGN!hGKO.Q`MJNכ\mmYÐq0n-%iR#&ݫZQa U+,"Na@I7jEa[+XQHMA9#$z(N[ĥ9D\$@N8a(s&PV^e?z[R[Xըz* #0XVb!BV굧]W!h8Zk슛 Ԭ@ޙ,ZHh,"?KP+kaf G4RK& ktKJc+F3O:VEc HQNĭ@hDti܄)1̷1×[pİ _)!6B! a &Y6A)biVŚEl4ю1f䖦di2hTEUEUQ v*P  aX1xqc@΂]u5K/o5䦓:`cSF ʝTZ=3 L2^VCxȈJQG/T`AVk ؒ&@@B;"J`H[w>26xgula%.6k0H5hb@ۊ,6TQ C OggS@@APaPYS^kKQSUIRVd!T20?${Su ëd 2ܩ #ZvжXʛf[OlaZOE> 2XX bc:vX#QPbYȱpP`$IjjIJ "\LGkFo&8h4!@b;LVY`Jb(&Y $ŕK2qR#d$*w<% \jD%Uu{m vYJ&V[Xw}lgQ/a7=e f"mI+-"H@,YbG >f܌%02sy͸)Kkm2܌!@;6|Â6Bm!I _Ѿ'TGn'6`6M6憎eŪUnc*#Mj$٣հԱĚ:``1X>е֕"L)k,i U(W@ZG(*.T "_Y+K02+"k鸇j%K` "ݕn+Ppe&5 *ȐtR@Lfx\6c b6&ƺCaҪ.C (B) HY]bX(ZڶEjkX]U~64w![F |12xq2baxr&Yͧ3I6&b6bo(V$Qbo5COwwh kP!Ū!ababvkPLynd}NAA+"*Q+4UA@auZHj1Q0E=$%Uc`BBI; =rdam,&2-8F xeqe~ ǵZ{6."塊qcy@X躯vȮ@,1?tPTP?T+b1X#F/`т,Fd&O &[!uH wbx@}8/>FttK@}P>fokImLXDRDb`g$!P/a2̵QA-:jU՚ A`0 *v "!;R (*b15wY % KE<6(j4 k ls{93YgaȢ;J`(%2P_$ĽXBPQ9[iF]1jU'=HDhRU3!*Hpx>Ǝ2q|I .57}C&{J ~}[@%Ӟ"*@2X#"KP4~Ăjm<'~6&DuJN] vpS)5lÆ\~Cdʌ,*9 .`Tw^\gIb24hQh)VlsT3i.X^BOP;؍VKSElA\UAjDUIHhXP18-!La"\ D-EFZ;X\&oOڹų !0vVAVZe-L kgeoP,7E6. @p;|[_ /nxdd`?Iݕ Lb K2)e, ݀{.DN=pF(B9v|ZdmA&d)m)R-I]u "a)R`cF:1A.jZ#[5찍M1LӵvUӰ*X5miS!((:D jSt]6.Bl;XH8@!"0]`UE"%% p28vӰdts^QX^`䜒8XJy*g@mhe$KBf(* y!NU.Z xXZ~(4`>]1!6$.Wv߈܅ oa0&12ީ 5HXxwY`gg5LګհuPl]-EbfiXhրhEZD EVQ?ciBȋ:ċ!  2(**N,"1AC\@xibvL+EUr@MK&@e*BZ:^fX7]jYLbAfxls |EjZ4uf*__6LC%T/?|E[$aij@X#.D ( #Xb^V Sm^Yq/!Do2! j]ީ dm;l85@X3%H ;b&IjXƞiŴ^FhYL4B L`h ((Bb ܵCBd]ZXM.K5fv8e8mއ3&X;a4CFUMx5dQp@g|͂êNRY0d 9iY:ߪ rH :G2SKi7Ԭr m[WTr`BJCn ^ WW_G:R^7x!hc2|qz Yb ީPK69]`ౚ񆚶V[Úd(êXêmKԴ,-[jhl͚5V:FV P 8*XXMhl l0FTj#ZAE4 ,ΰuAi @RzI9ȓi |IO&Dc$hQ$0$lK/Y<q0J \1P (JflDG$R u- x"UETC^IaZY (c ": A0TQňTV'dЀv?1|r'd.a60|za݆jc'3``c6vvOl Vl.jKmiXfcEmE:-mUPt(*ňNbA FEuRYlQ1bX#'DĂT lzK^Q: BыLE  W*Y)\YTA$Cɒ0c-pH".+' LM M7Pɪ -\ԏjL)bq}z5 Q?HC$ Z@- he}OggS@A GCG]Yf@K[X==P~V)YqçL#ç+2Hl#N4"3g@l@2 av`bZ5herl1qF 5MhCX%U*ꂴN1"и , hAŒrZ((UӖF1 A Qpr~n8`@@\HAp2 ^eUʴ#d !c RfްĖrY:_X-sߟe wb C6  Vq,b!t]Wmd,6[ܔ!++N nJB]@ _3!, aD,'X-b[b5N]{GĴ*ԺE&fӚib%uS$rPWցQ Z2r qؒP +C6+cNB6с`7,j$q*CCH'! o$ZR@d0)T!D+J5ڋQ.ӠEq#$fN`ѶGJcgihn(]nZ""&EcNQԵ`^VKyq%ʊ6| oU" C"(QG4S0(II11#1٪-)j͊Z 3( 穊.Vj8pDDlIDE4I3QMB+ѫk3 ` |vn=8i]њ.5`Ľ d=YS"zS?@CZ, Ca1+Adfru)Jn7;'Xp {`KJh/^WinjR7 mUʎH;GB\6.D}sawIDiM\[p? 2 ag1+3Em JgB.1Tۤ`1F%XiŴj@ bG&DHRTiɱ8-`(mE:9ME"ۮ``Y:݄-.eBkgnI.6i  İu@MX!- XaXlbul#ӝa=@fv,O<xARӟxxoȉaW?IH-H ¨}e~`>dD"UhU#Gd%;=Gd%d*q|!f6'uҘ1:2/p Q3Nhml# Ě}:Xٶ3ZS°`, 4tjM؁RkdQ`}( вB"-vTDx ,.,B @,2(Iih a0`"*Y-Ψf#G^ x@CwO*@4vs߮jC@X?UwLC]/{EXP$ "`f4UD^"E`GXV,"[^ ^܌)Du2c!lC-X#"ȕ׉AHcT4gm/,&FWU]h7D0iH+Z)kY1XXfUMú$H(d#5`cj1-Dz'ZBeu[MϑsH `vbKA5ׄ$Mra4$݄ 0,Dz}OaU7]pߓ((Hn!ʮF @p WZD-%13ba V<\;jJb;CkXk`A2V`R ׈`w+X5l`QŅ'F$&%q~ >Y!I]+cɪ7VXId XC4T3f,ibvJAj6f9G%%j0@Q4*k5q dl#̢5t bE0FV"f4J2=`;JPC2K y4 *gVED"~@DĪdbcĕhb" !7 "I`.jUk1"hV5" ciV5TjoE,UWA.\`dhFD.bi[qj 4f|HiQTht P2 "-6X55hU-;+9-1T*^uFƪbAX#0" P ghDDE܁ `ĈAXHu v= 9a2KEw,rf%HTiB-`aaf%Ud(#Be +ơ @ ֍$A8@)Dj0UJNQqm/ @ XUgeAwfeWPxIa=vv6DK wEX6!h6|MiM B+6awfa[-c BG; |EQ#;juj4jN "-UFa-BGY=+AFabXIЀj F`1 :ֈEɵ;1Kxtr;&4댋E2MWmv,*Ic.uu.4ZׅXqt68@Fq 'PGeh&Fb)P0dM3@q(;A~kCQ><`;pY1!`\n˺e(d\#,J-%F$!i4cӊ<_gIHߠT"iB>kx%B'h  FL;Ţmdbu){K#U{+vZc c,MѶ"Zj #ڀ&0`&(HtAXbLD1[\tC)PIdF( e{ƞ.T6xhۀ-zei`C۶=`lDۮ\+VBUc 4pe!!#x" '1CZVTUK#܁vNP JUn m\ET&T)矑SpSէLϦ oE5kT !^1yMMEĴͦ v6SaX1l):E gj"j r{_K;1ATF]b%(,2v/p.8Eʪ Rgci!PS圤MN#°"M?T05D,zR9V0PU%J9 4H ݺKmaщVS+XQ,LZSQ@PT1vWEl`"lF V*$1xwq틐[Ĉ1|23zw*0~Ā9aYpЭ3TjXb!ZIdժ--TԴ VЈb mddơd-r(d@)BFt(V[q^4RtD <駬xr+r΍G5(޿RZ4,VD8C 9"/K(+jq7MpLaxٝw#ٽIy%4Pmp=yTp0I ৫nZa,eYQ0 OggS@ * bi`N:osm~hRNk&ܤ٪RGXVD(ԫ^Gw4/Ii6+TG8\bOFqy`p ~qjI$f:s0iXMlmlLmie`*x_6Mme`5͚l J` BA@6zU+EjPH!FXжA@ZĔ%y&di01bc=2*%HelUy[P@0ZqGD:CvwaQ)1F;c N "]Lc1L#;;[EDbAF#k@9V\YUCًzZŢSטVm zo56:\knbG,!Ԛ c"]DIm8@#tQTb$b8ښV{* j_^35ni6dXh`֘V $EB!HŅ1ZB 2hTEł*-Вb&),T5,C#H$iwH!ߤKT P6E4l [ `68hc:UTV bgoHC'%IB2X6( x `Fjl TŹ@PZJ-Ϳ \^XH}rci?fPO5~[~?9$mpD>`3ĂմLS;[XT K1XU4հfՊ&jUъEP .0b 4ԡX@kTo70j pȲBj p`P5)D n((J K I`P ‐l@vUV@DDV*Ą`ۮ>ʿ`$#f*ѠӊD@ *hPŅEh1""8~ 0ÝO, m\ЎalxoF+Dt*ت 1qj|_-Cnبa7X"F랱dݗu9gM,r*-ˆ zaCf\v9 @fÒH` ME"@0.=3jOH]L1qU4[Qd *7/ i^!0H CR(p t7pl),؛B ji`h@rȂ1@ mސnwގmܤK7ׯ_d>OXPHҢ1p+^A+V5^w (i;p_V43m"o>Z6~-kl$hbfVl@-D[ZQkYGYTfC(lNlEkF1ˆdb* B%D,BEN1TkXI' zqV qJV:". \pYМ @e h`Yug@e úJrqpaыD.P$EFC1 y%j$L R3zآVR@LtM J"^ 0kVa]ȩ)`VL+vFu|mOWB+L]/톑>F\~b2f _oȜ H n[h)6'3P'ck8ZMLmhbXl[qE. P TZ"U2qLnDޜ0BnC0Iن $b&&aLZ@FHbU JiH(KGM)+oS8 hF̡'!x<.Qh(JըR.b) 2g[Ȗ/9 aLAF,KEYQME $@}0^i5ҪciD`Aro%UV@pi.EuźWUjR_k"@]CuQAۈ xeˤ}ZoL6,PAdR+SjGm#,|@UDԽ't5 {zCNmLĴšabo)Fc,(KS-Rʵ*DT±. dGB3yNh( *K$*bRD0خEs ڬlȤST3^%wYgz4dqSAl0g=D ="OqSRYVl룤wMˊEZI4U $Ȍ Ϩgišo2ZǸje(z'ji9/Ū$*سΣ v| XQ@rCP+*jFкuj6oL%)]vFm,aZPւ:VaM ֌,m4`ժ7m01,U1$lV5TU9ߡENZ,V@@`b Y@b#٠hETVhJ=*\U#1 =A-iriܚt R0 Hf/8"- 7VK2H)b  -(>HYfl eW"@@T hD-ezfR~8P55V:N,#y7$P* ESUTP0ea(kF0f]# IiK8ꍒپAo6>mZELTb(a+*;kdX SlTll2` j2 b5S*DTDDPHH`*FPPNE< m-nXj c@b.3LeYaUhG ^z(0Oau /ʀQa걗60)[$@ 06H$cGbJJW`2D3(X6HB b oǑKZ+6F "jyLTZ W֩PETZU9jz.)Hohx poTEV6ށYdm2A Q<7մ٘Պ͖jkl!6u9hbaݺ؈a Ɗh`SVB![HT~eD`:Z|}U GXQ:QR\5 w@'zzJjhc-^,4Q23h X # hI@,(`R:#P@YL9G@b Y2SWPY?DC#(VTNt 6[* :cChxU@ (?6^4S>wG:UEG> cZ5,jôZUkju[ᖣ: KLTlD1s0mWI>BFEl !*B%#ZPjgU@\5(6'3D5%ː±HRJl<[qC S"/-+h)]-&>VH ) +@3(0, `Ժ*jlr ha۸cc J@M =QX#J0V0ʢLpx}=6G \0UˆW¢A%rh,a dlOggS@:ۯ~`xyki`}\p}۔}Hc?L6ܝL~(ذ;$FǴm;‰$LzK!ξNժ>6f$NLXl>JL ZV"AHr 1i[F(Fd!+FFI.b2 TZYJ/UjEi!4"P[u4ۂ%kVf!G%-Ѫd#i7au2eCLK+-2.TkkvQ ZRQb3"ˊt6#A(/hm@($"@1ʢX3SB˶$XDB`꺪J0t<BD|EaSW aBאS1͝^jr*rE9\i(D:iL`[3팦 4&@Z A g@/>XY(Y1nAU Ys+̔#OD=Xu 4C>Mn]y ^rRv `ujT4+\L2.eɴmmzEM{+6X {JgZ%hci ֳ֬L$c iXQĊUP+ X94 !!l#3X$4zD$*bIU.aȁQ.`1 J"ɥX{2V b AT ƖK= xaAaSc9.l0v@VTQ'j5aOYAzUYLMYRR> X@*kYTETe{@ `\ cpObd1ZvR@E+ L\"Ւ,I,UPnu~M>+Qʙ}K&lׇ|" I00ՊTo:oX%L#sV UBC-E궢QG{(Qq]aʵEJa,0"@<#KfDE@G")V`( FA]?O-tSjC_5A3'fћF  /}$@|%h:440~D#F$UGZe4W^Jqy"xD}LqkdQ脪X; 7 0]dy\6P?&(S, ,秲 bݗPnlg@Uy!u,Xv X >ށ ^+Q(3 {8@JPkgO$Zhxb.jX [ +RTͨ ӴɶmS ZS!1)ti]*qm(w):~C`4xWR-VU%bg~~[_5-`]+K>D5S? 3 Z1g%Lk]jzd(O;q9hM| 22"׌Xh]VT*" aѲ,r PY#xHmiIY.XT5FD 51"THɨ)hujxԘA236Jl8>ށy Ι0goz(ea6b@cG"kj7 bJYar1{3jmMC1iR͕+FQB@$Sp{XRۤTZ!- BlXNfxmE㔗p%`ڢ$;Kfj$Xk5 Xh5kaOe`W6tVGP7"@#S6vWoB+LNq౛i֮&a`\/ҠDa6@Cm@wt#. օQjYȋ̺.U@8H1 { \ ^5 XVm߀ ^Y ^>* ̆{^<)jj5l-}kUG-6jX1Z1,`MGaiXjaR*VQ֪h *hK@B.?S)v x CzTAR8 `zRhD"bl"srv6qrO34@/9 Z h!DX&6FrGvX tvF@`"VI iYeCwEW Xj r8,Tb@_Y1 ,bTփqe-(40)EDzmUU1` [' >\/< jNI}Z'=gOœ- TM bgO6hҖYZX1mj)bcٛc,cZbմT˪b,id buc nbQ X t4AUz4 L[w +F-i)$Jj1 Qef^$ES9e Ԯ̕^4Rbd*3ԬM%š}x<;b"Ѯ 3KNNGЫ\W]{yn'fȷ ^ӥJz݁s !? 7\WPft#dѶ/h}/}NX,b_XH=D~c$K1XhM+Vci &X(j#kjU+/ 51ȋYcP"h,(Q8,%A WeۙCRQSH=6c4N lO`X2BWZrd0P8 t}miqO2$N .. 1 P*Zqhu) lݰȗ5ʊg@03yO䴺D`Y%kQPHK|TPQtQj-z}-wT)m[<.5G~rdVX&:f-duGo/fb3;;ڨ*fbZ,,2ɶUôYi#e`aj&0ZQjJncFehFJU`9-PdRԈ@*b4"98$^ eEj10,cU5%A$ŗY,86tdzZa*!&4]ciHG8Qh[cDhdmŚnxA4@jd`mee^: B-uUl/zfXDL33&ruhh[ B@ @ ^?ms JnN ,] VB!9bM>OggS@jGPzmpi}sh]qS@zb$%JpF>:+J.eF2}xZͷ@H4 N]kve"1m<2"V lREXZXQ ebTDTm,51"1PlFECeiBɢJuMTPpaKJ"_)BIMdk2_iJ)>\ dvv޷B+TAX ddQRNuH%=@Z )dYY @ /X G@!@F$+3&TQ 0 E gJ^yYRT zw VO{˪@{]fP]FDwI)@UP51H #K~n~Kl( oaG%J~#mZk3zO0g@-h0 ۶nͪY0ؔmeap`bJdVB"jΦ(R v{DDʪ>,=@0XbpiHlcF5 P0J&HYnGQZS"S"rƝãZޖ9=˫(3/\1`dA? K% ah[XRI" L..&r:5@ᥬmp8/l0%8k5 yPE,Z} rV vN חn0r|1z7ld lY^~n8`"WQ^oc&%@肥hUan%b`Y`lZ\FXZZ1{CqFҲb0 I1h$[YDфP(d$e pڦeVlq=PTh`!l HyqԪTȊ*HZECoj2%|QSn6;=Vyzhz^›8N,!(֤@h(N9D``b VpŇwZLI+U JU.B%v }.u#QQIͅ.D⚞mre0C$D2Tj^4^:`~KxHo`G;ud6)$p Ւl5$*4md7lζȐ9ĊkjaYFY2,,hŚ:Qۥq YNːQb& v[B I2)@u6T쮂hDElENQ(,Ee c;h{B<"Do`c Χ@=1 AQ،RĝUBba %&X q0yRa͙i+0ƈDwޑMq>-*",ї(zV;DEZ`ZQ$8\)A8V*RP:"H@l@˓۰o"/+#OJZs&dE26jj,F681]G {5u%ZdKKnҺRfەYvRꠚjE%!D*ЁZS Y: VY (L9`CR r(H[έ+"eFM"̲h¨OBdd0Bb)1Q3Z_%cuR` 1  #YA¶*Dƪ6vw[ eZ24 z* _w8@g%GvUr6"zЭc M(bP <˕J="Zo(lY6@FоKϕ(m`]zq%ݘZ {G@Ғpf2 Xmj;ji7Qӂv^Md!bj2Xձ6=@pVZ`bl xbcEmBYEhHiGFT`+5Oq\mi,/YiR![e*ǖr22]gxYmD+O^˂"<ĭ6 ADE%p`R5ݝiUW8ˢ,fJ.]_}58v~@^W~#kX`  xYlX4UF+vɎD!>RlD< uxiKDt!8`֎s1>$`ViFvvU`kdf%V2gR,SK:$lXr4WXJ@ĊtzAV$ZCXFWAG셖\kYd )إE ql0gQξ0>#PH`  GC*@^&KƊlŁF!-Prc-<BUU?A^sSA,TP˅IV [`\] ReRԪBD 6FV% 5~<10ZXېuxQ32Υ߆M ^4vV/B$#ƴYk1 lD4N&jbcbi*j]ժ n6f5Z$fD2Zf $  D=oHBUCTh[ѡYa pA.2 DA0J$2E`XSD_R$ cpXK,:eY`XZͪzi= eq# ʕ,,@,vX#V i0 P>c4o1\npME<A gb$ JFreKUHQRk ۘu  m`{Y9˹sp$⽟-@mj3-vv;5l0Z5LiXHhbTkZ#*wyϣZߞ2}(1"- Z.+T M@SI0V qN(o@K `fY_WȺ٥jcLg@IDH(Ā˕)@JQ `" P R"0Ḳ%XXJVz"h ^KjP&`vq,`[#-bDQ^"n_Y(83[ MnSaob$RTF*6 X``eU#*V,E'Q QT`QkA[D bڷ=Wu( XTDUEVXT՚Uq8"$A*DbQgjer3.TmH^rY{@=W*ISYB7XsI&)z@:^tnvv ,!!`4U `ȵ=!r(0dءd5"T*b('Gfm!ݗ_Lm_6.+iD!["/EV6@P"M:`Z#zlMZ֛ 5S,Q`K4ĴѠU²RU X#0Z !tEYQD )UE&pLn (5Ԭז'PE"P`u^PYOL`l[V;ĉ̈@L]aqRQ:;% +c3$Dʡ)Q Ã*M1Y$@qmCE]gy/S*שּׂtdpJEҏB{R(~Y_3WGeۿ[gC{`D<]XJH15^n/ToW cv؈6ZQuAƜ$ WHDj!i_5 ج--M6R.Ke9296clXRUZCZc72ΐ1eAPEWIQ*(iŜBP 6¸{PKX]@'pc3^~,sh/x1Tq!g՘`AeAGJENdƀ+X (RBrEME Yjd^Ln qrU@RF$p, gEj;Jԗ+VhV61z`6IKOggS@3t\w`u}blc|hx`w0A3Co x/&hy#}ӦYc̑m0si-6:ZKjogkZ0E 'c0JfZM4s+X%VR5Ղ $GjbAP66aFP5z}Wn 7 Y`RȲVe,U\J ñN1 &(xI0-d:Fi`;@@(u[qt uB^%[!FL #5Zj{FÁ w'nA|urqx &gr+@ׯ bD;1U:E R] )p8 mˠ[x4l".qˢ{Fp>Xhȷmk6SAXsA! V,jؐ؜E#䣲$;}֭.{%V,0hDUT`UN=p -tE&12aRȋXZr.!2'Ȥ;3O,(&ձ(nJo#9{IhriNQ@y@Pn0E(3R 0ZUδݐ(8@H(`+M%vlCbRY!Fz U}" ,8tVkzjT 6]V#&#PXg!h۟k^k " YQZ=@K*% gĘۈ 6ȴ! b)bK{-l)co5Ԛ*n*NHSZcDb(IkW!ahXMA * $%*5r02 UR.'NB <2#xq":tiԁo*f=EֳC]GqV DaXpjАU#zC"B_ *HB ʖ%IB # )HW/U%UPX7 `d" @}doH.V%USc LT E?Ekum+ۈ}pΦv)9؋Z 3DV;٬PkVLk6 K7[V AĶ!5QKeCX &kS!,nT$:3rZ$ET3cf'N@LNT ֚Y_g٘ l>&EmD`-T,U- D2*1e "ءHpЭHD*3PÂX VL+b+ʂ+R @EphP1T c,GQ)(7yt}P ze9%" `'c4ˠ58t[ES @D]--kVRUzmMr8zhb`4(?~}@O.u] s۞| ]z}.jJǼ=Y"z[ۀp%*w? lgoZLRo[lLKKmJ[Wk6 i1sZsbbi$% ي`g @P HBDX"r"֬ 6ւ#`[IXe ((@@D,*Az"K]ǎ.+Dq+r4a`Kӄbs_0X#K$,M*S>Ak*D8v7@S aX"T5vLQu>~|\YU }61zZ ݂Ţ[J(D,Q A%")#j2~"oLF6b΀}C5<@EȆ\miSE?Uictպ-X۶$^,1,,--Mt`]:E KFшm[8r*Ce( So[ $D-Gb  YCG9p(5άj^J(,V7c,+p 333VƋaZ4ZLZAcy*!EdnGB#4:'l*xm`cT `*FҢ4+ڂAE8lV Q)S,3p 4 Zz TTXzk`+:D`)W\Y 5$6ހQ9; G"q.!ژLsio&`_40:l`[gډU &hl)bDՊFt.R)Ql1QA)FF`Pһ͂kJPmpP@Kk%p&,XcTP5(BqwqUUʄpݒ۩nx&g j3`أM8ErzG3hҘbDzAaETY Udĥ* U(r jn굇\ p1}n?cU|К|-y@Ͳ8 ϳUAVS@.g" i@4,-MAE)YP !0"k hKx12A l|IdUHaE>f6jX &V`KI3A 66͂fe)&.VƢ*VVEA`Ck/KR)@Q\T`a-T)@(6( %<I) hܬ=FT\y eeыd Ѝ2 -U@qn&nfEcA-  0JVjJ` 1T ,h*>ڸ+ǃ -@Mm "2h96\-D X 2\ @6j3 r&e\c@h,E,^~ %p/t ga:c6İQH 6]dP/FZ6MeBl)XZ*(贪XjKFh[R[U k0U 8Y"U +P65 K)-`1%~"(L菢X])F5R<̾LM]| hS "IGd#&=ۘ ˂Q]d*E }(Fr S"jE0`, F b  EqGv2LA I +gXU1@ X͒Pu|U~ jFBhmzc1} &5!Y58--mQ-f^m+jgVM6fPD-, QjjTZ[Eeсb0h,3N;¨ʂրG"&@$);RԘ%CƢS*j@@h5fFh3YNRUp,S7@%.?*j$# ؓ-}jZ1+8 #'b-2 ]cn(!ǭLnKHw PL" }gLŅ`/m1j^Ѩe u_EQRCs:^\p>3 컱>Rn9'C=t 𚛐W =-,fìs1Cbڙac+h FjkZPĺ0,f15ZUQCEcJ: E@$iZ@FaAVHge[8@&U Bb,.,1d4 E!%[-2+(*lH8N'#A587 !iIF NDvHB 2ar2Зa2H`AR`2TddlV 1s12XZZ8-"bh'o%Xѯ- @@~ >Va",+qp}bx ȫV ~".YaosZ"5k0}v:浝HPl [[( 6d66die͚ͪmMMRL 6"YͶ6NQmEHAE^,AX̲D 2F1[4)HM2n0T-4=iR (/J,P7s^}$7c%'j;4\R"|^0#bSЋ"[@1&B2|_"=C,8E( ֥[ wJE]@չW0_ ;CgjCRp/ͫiFŗlb* """HpkK(Ϸap+v\[Ѩ'3g[3{;kY^pV KFVd*&C10P" -(1QDQD0X#-X m CY((c*: hT@i1rH6A E\ԙg4 b"~DW LU+$L2N(0D.lFrbTMro(aAl BeUd%k,Z ;-Xۋъr<p )EQuh- ֪zAъe @P1eY^F>H%rbo[ yP3bLY^t1Pэ+(;g#* n߁s_,tZdo}f g8{ڛ51 |`ZmɆXSKðUmي- +-؀aŊƶ**bu%T{>pk/rʓl['  (kP5j-b&T+A5DL 7}ϓT@e3$] +3o.Z `'P(}SXԔrd#Hʑ+$Z ыBIE88+vr 6Yj"Xk \@CXv,,@,ebAFSŀX,DAX bTUPP@k(ۈ}4jJ} [dBs7,aO?jmG@Ez^ ְ5,bXvبհ֊$no1, ðbi*vaR؂TRMb8@PRM)9$Xp0j"D4%$ VUHHu֨s4k0q1ӄ zTbd` ,4`,X j- `GTKk)PG" I  1]P4(+e4 4@rP* L\1J) `QRuF\KEzMRt ed@LFHBa~ۘ}`*9sm|p (V1GZ~o `vxmG34:gÊhZ Qy,ܪ;6ga,Lv-ŴÉ*(Vҕ"n`# A%!l^ i{PLN,C j@ lz .^j$("10o/M0@q  :ny YW5>3ʚ*n" ev$MD$z F т*q ^(z֖-E+Z-k\^j@s=R|/57:=8tEE[_ ^?5̑s`/MWӅ=hh49va81C ;{okcѰb)f.#P,f*baa)`j*z#8(4&"J`\Q "UxP`M$"I.-VEkf2D-XS4F HS~uje0;)p AH?&XaE~8 *ը騈.?5qHhy>xyS* -09&@P])ld,C@T6i)uNSW\ a]YM 3 3d VRUTI#& MlV `@'Ar7L+xF ܜ5>;Zۘ=5î vj#ZǾ-TDzeg٢Em(@ UUL)U*-"8"p!e,*Qdq +elH,t#U mU\ >Pq|u+l,26pKuܫژ9;-`ބׁMUf+F3~`.$ziazV4aB&CDY\V"HD \N}&"R 37 1y85ku"|aQ[ ˚"" P { >XUkEdu6?](K;u9HfگpMHoOggS@!3Xk]g`hs_tavX`j~"w \ %W0WY -TS4km[O3#ôZllm*baVla))daFEĊFʢ EiEh0Z@*TB18Vb#RAP*bZPbX(IWDD:zVThD,0E,5*X7GZsF0<](Eb  +#CXF ` +rR*InIQ @EKjgǝxh ¶ -Ũ*}7^(DUD+*b0/cUE1d*M:YosTJ(*J^PBkg`Z̨7?Ƿa鉤&a:>;L4,6Xh͊iPlcgi16j5E֡S*hTE`T%Pʒ$ #"VsζSxTU1aKEKtTEE 1'NZxp.d´H Yk%+&`/7.(*1@DaPJK=r&l3Y@Vk+4CUC6*+Fč8XUJ[/g ` @$@m%^(@PudM2 2b 42HVpiTA*uI|~7;7Bkg6(#=ȁ܆o*zs$6S9=~x4.V#V1^Q5 f*bigg6Zd+3_(^XAXtXD#(!B ĹHիڂMiE@al!cƪE:9DDIARƅ4aZ%Ȳ@VB7n`T˨J$\W9Gݤ;mC.yǵ t*Z#DXEQ$.CEej- EuAh p55 \7`m^ض%"H鬤^SRHEFX"2b$0Ga ހ ^X 30W𢂉jyBYOGFYN]c hgiۺւZ֚iiiiKiXEQ "V(ƨ#|aҔF5LqOVhXR+HrMkVb *!0ⵓ ʂ^fb @ݲɉpJM:;nuJ ՈҼHr(C@,Tĩx7^*5[$r3죭͚T) s@LMmDo&,XόTjZ;ձ1,jdRd`ҔYت{B8bEC!!La  ɒflAk$G XXcC-Yb d-rFMTYmb0gжCO*/JXN#hJ킵QWd QE@ ˪'0))]<}5u,, e(vd` 1ֱ 4U^{`B.R8u GSMf6M'&4"ÈYM ZXQDF°bjVQDjZhUkaiUUVZTkW#YFFٖA) PWmՂZQC*Ey+JoOq(  JԾʬl2@f&DI LOV@0$()iEɲUegV%LqaDIK,vX@DCIiAPE JaM- htpTu z@PWz@|X3 J}ɵZ{F(5+0dY-!sN2~P{ (p 6x}mg[k}, 4j[X1R-l6mêa(KĪEj]ըňu*^XB B'dDC9nI^"E`eQ҉'SwNEg; hXӌ T{=2!tJ!̣2I^tJY z02*f)YVDzhƉ 9\oP6cEQR02@%bY$(=ن)HЏoz!D*o+5L],WȰZ0QzDEa([q\Y˚*5R]ViIĭin}%"7+[pφ`KP,S|ym` mZSlj ;+bZ6YdK+ъMb`BiګXjFa*R"Vj)aD"*#,P Jd@X#$C F)TR: d%.l64ak]dKLxLb[j4[ :4 D!Hl-PꎙU.d.`)Xf`zѪn6n^e [yʦH(JȲ,$dG&28؆5VPOQ@"0kYwj ll|`~$aKw: w\/\/L#?ÏQ>R9!bgkkkLb KC-ҊVh`&[VmY4ZTNt4QR#H4fl0agh)p Ph3"@ H&HuimJY19 sǖ 0@ Z;0t ";E4<t3Zdb@$i{{Ii! ;i-UXXbZ!n5TPC-MDXth ` |:Xb- `U#X0%i+e]W2FcbV˝zR8wY8lI*ZbqHkw;1A ae.!: XH*\R&)FQ cDp ZzB[CM(LVB`M2""Ƣ : [EB Dh^o5Ax`$Ȏp i3v4QIBD ؉Mb6VKZjو8 1lȢ- ܰ55M;ت)jaH`B2@+m@LA4aX6.ddKk*oժ @UJFfDiKꤔ8dԢ (UO&kz0 VX@e4Bbnxp``=zDiBtЉ 3C5 (0rC7Ov$jFi2K,) z Eh"QDiB,)SQd &R\mn?)7@áp2}8< ,""QjL]~$oa}CDY&ن֬mXasӚx vK ֬.ciba] {kb]h ut+Dmt|=ȖjuB?(P"%H`IIZ=EEydB) t|6@r%L0wr(Ĵ8SQM5`1 jX ^m[ƴ4 e3g- "bRJ(N)!;;*zƌ\ih-&=Z¡;T gѱD˝۶-'8T . a`\5 {qLZ E |//b@Uխ(u^J9 ۨ}@'Fk)a-.ۆ[o#Z'Sm-!VCLrQV$Y6Y&jXlm"ZU,#VcUERXU,I@Ȁ,8-PaC`$:2mHbFU0P^ciZ4q *opOR3PXet0Fqn &`wv  W1"D:Vd4J يX+BiusgB1:Ee3&I:uY0+ [[m`9 BHXbжH(P$ ^Rs~d„+^_,P3 њ cW,;XjfT`Em.ܠ;JfaXC`XL F"BB#8 bFKƪ(+-K@ "e{i:DŽZm !3L@.-$'0PQXC-eBH!ya#4Yɀ#iYVšg žBVEk zhp GqHM$lBv |_ؗAU) 4F@:40笖+6V4^'ЮW [/ }5t`,Y >;566f> ,t# }ek66%53FYAL8(bM2bay&YZkT+EmJc@ # T\#SIPaĐtX XQRJz8tTqSBQ+ X dS$œJD16˚(P(Y%" a"-$.-t2Q۰0@IZ^4DOo8X7V[ǘoD'kk/!~p n 5:Ċ*TT `u?_o8=^xev^q :+y4Ip'5GH}X.?XZ쁖MnjS>?X"6#4݀ s#}vzT;'aGJ< @P{˘mumg>MYa0 # j5Ķ)L" O*NQDZX!j in=q%F1$ keFhe-,@b4,êS35r=#Cu  @UAvBVRWוEKbY, u>w*yh7\aj9r$T̷"ZN@XPQ)b5EllU, vj%6VXXfVMDMPAU*~7)YVK)?!QA[ Yń$$FӘCMC C$Lj;as0(`x)uswUIDZ-"jRh8"ddPfCB JbKt x˄1QƱdpڃQ *Ě ('zgMD\"~ۘukf`ewY7f`^^uӉct bagc[ QZjX Q+biZ7d{K6Z"bXjUDA!(ZQ``-`#0A8H #DD8 299 KpSAEE!5(6XJєSa60~|*coY2E)TZDljPr^lN@n a7@RW,YbDKXbfi7bOD+.$`+@+T-X,A΄$l5P>mDT+>݀ D: s7!K?0f@7iHhg*zk3?-bg5,V[{՛8 X]bU]Gth*Z쬏I\4, 3A#xA""B.^̊d, ICl!  LFX"Z":Z p V,ъUBm­smE1Ut=Rd& @L䈺@ʼnY.VHZVꅸH0]P]Nrl:߃oZ:x ^eI/Tk,+cd+R] k1O4jص"s~ij(w'S5[ߺ83b\ OggS@V#;vi^=auHoxGɪ%Q~[? ̙قi:Fb>_I.HEl7BdEbj[FV+̱nVjU4k-#8"TqY&Ҫ .t3$VD!c # Ҹ%2 C[zi 0 }?ҶK"a4Na&sa1J="#e@H7أ#fP4C @A4= ],dX q 㫁đfN()%h9/^hBY@ɰ $@|է7lUG%P$?p^䧢L |Ps9H^NZ:6,b;@^j^DoD;Z l3ƴv1Ӏ@{G;^V[Sޫ'4Zj7~2+,hudfoML M!bC)UAAPY)Ȅn aqKDI)DRC+ZDE/K҂A/@j}NJ ,0ZȂ4 "f&SEC S"h7c9KFPZnesCL /]2ʘeh&$\$.ϱ(:j(0cFY6][ґUGx|EY/ttG1c J?y 9$TeBqd.2/@|&2o}K%Fǁ\;hi}h'XmqIu j X0FcE]:S i[uh*bMAm0S\a\A" gXRaj)#XcHށK+EOi+Kv#Pxݐ ĔgyP+j01{k}UoEF b@(;MZFKc!mÒem ²b=Z涡0A-@ gZj  h^{jT攗`ר@}` cE@7aEg6}ԋb د7$Ja)8F MWi)D^ۈu_l@qo#770n6VbFa-9&vvVN,P{$F`ՊVQF0ĺi!bZXZ5[- 5V2RWb CkJ)3ҖR=  ]KQfi@3x55v32de-0K,$f(xDKf`!֌ ĈN,;1@ct jbh\cbQvQT0ۈ-`C b^ 0s3yVX*!9sT5<1l Dlx206gJg> I. )D&C3Rn"ov_0}C-6n:4%ۓ6}"uwApKbcuwKPlj؈)6j, 9Kŕ֯G)Bb=R(zA*Wf@($*K6&Ta%YA+HE bR/hԩd dC ik2ELYzɒ0*BF!Dş0Yac5!Z6BcupF,|+TH*q{Wa1ȖyqǞ;?V gA"W p\60 H!T0F@8@DgX^B$Y@4EvVm^4M6f .c8QGEpFaQU;jiRbbXҚ5L,n 놪m&Z"[,Cz:2鐐 X5[F&3|Z (`2h#RETj*X&h@a@ E@qe-UTl2dG 1e* H qnyWqhP r @vhY1`Ud"HX#0^"zU]"Յr KTjiu5B h^ ZFDHb ^̫hu+߅N\w^$n>߈ș>`sG;a82'a:#j[A*"պa)VjTTZAV4ҕ5uх N@TcE0։A 9` 60ā,=#DP-&fay֬,͜ 锨|M <ɔs݈BD%1PXӑ??}WUJX U:lˉjQz*MRR0-*X"EXR+Um(VUAĈLUzdKJۈ} {3GϷྂ%bE2rk룝hcFNFfۘhĪhIUP+JSAEVQ1VX*T{q.a%@UuRA %H$ : HBM: "y5(/LjIuf@NzV/1x=򺲒( PH-ň 0du7Fn 3ŋf&P $^XF)>KnU1 ^BլV`e 8Xj K =, ` +2l,CzAS  MRWY@-8 X^^: PЙHa֩mE@/@U-ۛSYma!YZWQG):*\ bkĈ*!1 K8`"Q5  6d6d'%:D2(ZSG•cژh=+}DA* @uѫEހW H+Ȱ.w(SR „벤@T[9i=>3Ǹg=sKzzg|5%>۸=~{/%Ms@ŨжluRzN:qh0KXm0ŰW[{b11ulVل Xɚi+^$񳃤&Z`aWJ \qYz`$0P"B0"9(u}H-C4`@Њ'L$ 2 X`QN?FDTcB,`Q 1K2̦% ` !FNEBXD6^&Z)@QtDСpժB#|? ~"@;EB~EA& XߘI\t4*j}`hۧb45cj5mX* !f 4TTԶK VP(q+A@ Ѩ[% SH2VEA hU !ymFwY3*ˑk$ME& ,T1ЏI%j`Lp"U:&JW\GSL*@aUyF0Z"JZX`aKq J0= #j9fT ONʼ>p/ɲ8 c>sA^V0` CH<}ë1@>ga+j~#~ ,-, ۀk D0݀s sc1Ѷ1}AXl"Zgj=8}Bt4Z5nb 3Us RmeҊth:4J@ C˄6S"P8F& ŢTĒV=rT*J3D RA LF3*2R .jLv7B^1e:P, I@XAfgH@BIP%06vT1)!ݚ; r0 ;A(R0= 0{IAyRVq'WQ&"p ^(Q_PQËW#RVE*;/ߢq]OggS@$c bi_W[?athwsg.u&qoкxh/LY14,Qk>90LhZ5Mɕ%4/6ðb1b`R* ZE\ Y?dBD5""" XA.X%[D4 JآStUi6Q!H~S|G{㽖|7ضdS1EBX@BGdl %$4K;L.80^= 4rpbQ-nQEV ۊ @v"r,Co%-p] RQ ӆF)(R5'\|Z ހsPR/7\|e#Rsmg@6E)LXM1mMLlTmվhck5ljXnLA NuŨb "Fբ*$FHN-ZjaJCCfBՠGTD9 gAAy,କfxĺ&4ALfRyYز LQ lR/_C#fG ^0m)3ƈ)\}CV (b;!a@DaUj8 I y@!qd؊)(їL.P5VwT)$^AT*%TjD0@z"g}7ไOD^6@Nn֑$L`sC1A^lhiaCnZiÈA 0:jl&jiXXԵK[QU:** Ve@8[dd #- H "F#UP " UbFhAw",fŴC@ Dz1MTX%d<3h TrL[ f%hS P5ȖxD9 kU[EXkaL[+eЊcetn[z*6@ZC֮TXA*E+P4-~v@S|\دÝ7"˜v69r Fb5 'Tq33lT+XXh`  zU&R>(@Uk,ET#dfE%CdaMm JA PXEm="$YD¨.0ĕQ'~c;ko6 Y &v;)R*idRX#Q;QhKXmX IU QqVU*H %I ଒sC Чd#,( ȹ{/W F8BQL \s^|RFa8%!)gOG⢧jfsN`XlVP5-R FlIT` F)hjUQTPQQѠS5A b~Gʡf Z؈~5LQ<Kc*"$ PE)kEoOEW!и-1&h;h؍mBR@N SHqdY"4^"F hA PjmEP40VT,lTVElU("6Q% ATz/: +t_0p~ _(au`pY`uHFX̋# 0Aj;δXEDmal`a U {Z$"1E X;`&6Sg'YDDPm-ɮfuM56F@#D* DjUe ִ@H%ejaY4[|8֋f:%)fV5i@a , D Q+31W ;:0YR֐<6 bDpIk4J!TVUFMU*`ZU 5 C;4Zl$HۈKR!碿 8[D^zOڬ86x@bAibiX"zniE3)İfbUFjŶvboѧDR@,@v:q@0nmB(V4B@Sp c \Ry/5bFҚXt>] y'29ef-h"F`AW4. {/)m]i1'fβiȂ Zժ\nW}a ~d &v fX=,<^\h3F h&6lc_p=W>T/w \?Ͱ$f7^ \a.lflٴusBz?'bu6Jn-dޭ$jXhZuTt JڳPEҀ[`j9Dՠ\HxuP>ĈCӬAk V.(yY_AuU^$ӄ*ЊYY Uha  U8,;@;rL{U{dH 8 YX4 hy=] %l0W,µY%h/!`AUQ!W1*_#,*Z,|Pj 7WR#5( RzrQMa `@jA#J^"nI7|iLЬ7H\va`gE3 ڈ9:ǘdœ0P*bV#3Lh]Vgf0hQDU@MiZ#FQ4Q*FPK XlP06pQ%Z-آUDTm;,8K1aQwjebSŚ"IgL]9-.E80M3L| DaTe R  4A2y<`d#EQi *f]lT EZ`,h)X,}P FF\`a.*6(BX VjpmkhA>a_^ rV( r?(š.>-ɛmz_0:JPXlcZLMW,M1M+l 0D0ԺW(XTBl/̮nƒ@eHgaf N u.Zby֠YݔYw1/o dUjܽ10y2&E 812w%UƕjM=tɐV3,l4fx*@& @D22wV҉6A/.⊘c۞ۘ}+xb.(mh_y_"}yNi `nEm6栍ƒPV+66V;K͠3yX3.)uKCu!֋E }T&J[x #X C.HleȅQ DE!8:@ LLKk% :D RPPGi2&()';qqMuL4t9bByi`sГl3g2W,DYW 94 ߈D9 ]@FJd*KհQu(:TGŠVUAhVU ⵬05 !#[XZ>܁x/4Tn_dȄ-n"}k % "b70bM{[5)v biŊ&1 3cfbgiiۗmBd4u֒`  )^5ƁLHF1 D0.bUE4b*Za $!Ԋ떅c%mGaZOޮԑaV4f)3%QuhV ՠQ* U/ H~$o .xW9%iiP ,M0#1F`=Q@4FP9PhQ8ز%$GX9)HRT1@6Xhht$Y,#@Rmx Y 2wm9*\3 =dɔ H" TMxjNTxBXD .8͂pʋAdp4`*P*'k*,` (.  TAZ' ".0?+[X@% OggS&\5KcTWȋ> D^E7dX$GjNB) V4UliZDMkXG-ҺuBs5Р 贂j۾ڸ+4F@a; :QUT XXD9@ d\@:Jp"p5fSQWvE` JT2ʂ XBTPmx L @Sa4:m2՛d:@dhx^*F,*ֈۈhTpY+MD!@թ( bŪhXQU`@>ɖ+ۘu-hv pY֛]$'5E.A0[qPI}}IłAUm{5u*+k"cFYXUmYZP("P˘1KG@v@@V,(M: )uTc@P 5H-XQpLjQ-3ǮN҉ #7o'@( ̀Р ! "jE \莒LX0n"& @qh(4gTպN<4@ |i٠^'5R <F+`c)~Y 5Zf $ %^Vۨrl^ðԌη12AJEV*ZPFYT 2N[ƨh/`5XӵZq0Dlȱ8r:EZ[ﰥQV-mF DXhG5h]u 1XRbVWH EHL(dY1dB5ӡdAy$$Ģۄ ^ȶeVr Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. """ import torbrowser_launcher torbrowser_launcher.main() torbrowser-launcher-0.2.9/torbrowser_launcher.pot000066400000000000000000000115141323341357100223520ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2016-12-02 15:13+0400\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" "Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=CHARSET\n" "Content-Transfer-Encoding: 8bit\n" #: __init__.py:49 msgid "Tor Browser Launcher" msgstr "" #: __init__.py:50 msgid "By Micah Lee, licensed under MIT" msgstr "" #: __init__.py:51 #, python-brace-format msgid "version {0}" msgstr "" #: common.py:108 #, python-brace-format msgid "Error creating {0}" msgstr "" #: common.py:110 common.py:186 #, python-brace-format msgid "{0} is not writable" msgstr "" #: common.py:183 #, python-brace-format msgid "Cannot create directory {0}" msgstr "" #: common.py:193 msgid "Creating GnuPG homedir" msgstr "" #: common.py:240 #, python-format msgid "Could not import key with fingerprint: %s." msgstr "" #: common.py:245 msgid "Not all keys were imported successfully!" msgstr "" #: launcher.py:75 msgid "Downloading over Tor" msgstr "" #: launcher.py:77 msgid "" "The python-txsocksx package is missing, downloads will not happen over tor" msgstr "" #: launcher.py:87 msgid "Downloading and installing Tor Browser for the first time." msgstr "" #: launcher.py:89 msgid "" "Your version of Tor Browser is out-of-date. Downloading and installing the " "newest version." msgstr "" #: launcher.py:114 msgid "Tor Browser" msgstr "" #: launcher.py:210 msgid "Start" msgstr "" #: launcher.py:220 settings.py:195 msgid "Cancel" msgstr "" #: launcher.py:255 launcher.py:270 launcher.py:274 launcher.py:412 msgid "Downloading" msgstr "" #: launcher.py:262 msgid "Latest version: {}" msgstr "" #: launcher.py:265 msgid "Error detecting Tor Browser version." msgstr "" #: launcher.py:281 launcher.py:479 msgid "Verifying Signature" msgstr "" #: launcher.py:285 msgid "Extracting" msgstr "" #: launcher.py:289 msgid "Running" msgstr "" #: launcher.py:293 msgid "Starting download over again" msgstr "" #: launcher.py:307 launcher.py:309 launcher.py:311 launcher.py:353 msgid "Download Error:" msgstr "" #: launcher.py:307 launcher.py:374 msgid "You are currently using a non-default mirror" msgstr "" #: launcher.py:307 launcher.py:374 msgid "Would you like to switch back to the default?" msgstr "" #: launcher.py:309 msgid "Would you like to try the English version of Tor Browser instead?" msgstr "" #: launcher.py:326 msgid "Downloaded" msgstr "" #: launcher.py:374 msgid "DNS Lookup Error" msgstr "" #: launcher.py:383 launcher.py:385 msgid "" "The SSL certificate served by https://www.torproject.org is invalid! You may " "be under attack." msgstr "" #: launcher.py:383 msgid "Try the download again using Tor?" msgstr "" #: launcher.py:392 #, python-brace-format msgid "Error connecting to Tor at {0}" msgstr "" #: launcher.py:395 #, python-brace-format msgid "" "Error starting download:\n" "\n" "{0}\n" "\n" "Are you connected to the internet?" msgstr "" #: launcher.py:494 msgid "" "SIGNATURE VERIFICATION FAILED!\n" "\n" "You might be under attack, or there might just be a networking problem. " "Click Start try the download again." msgstr "" #: launcher.py:504 msgid "Installing" msgstr "" #: launcher.py:526 #, python-brace-format msgid "Tor Browser Launcher doesn't understand the file format of {0}" msgstr "" #: launcher.py:548 msgid "" "The version of Tor Browser you have installed is earlier than it should be, " "which could be a sign of an attack!" msgstr "" #: launcher.py:568 msgid "The python-pygame package is missing, the modem sound is unavailable." msgstr "" #: launcher.py:598 msgid "Downloading Tor Browser Bundle over again." msgstr "" #: settings.py:41 msgid "Tor Browser Launcher Settings" msgstr "" #: settings.py:71 msgid "Download over system Tor" msgstr "" #: settings.py:73 msgid "" "This option is only available when using a system wide Tor installation." msgstr "" #: settings.py:75 msgid "This option requires the python-txsocksx package." msgstr "" #: settings.py:89 msgid "Play modem sound, because Tor is slow :]" msgstr "" #: settings.py:101 msgid "This option requires python-pygame to be installed" msgstr "" #: settings.py:106 msgid "Force downloading English version of Tor Browser" msgstr "" #: settings.py:119 msgid "Tor server" msgstr "" #: settings.py:131 msgid "Status: Installed" msgstr "" #: settings.py:133 msgid "Status: Not Installed" msgstr "" #: settings.py:142 msgid "Reinstall Tor Browser" msgstr "" #: settings.py:151 msgid "Install Tor Browser" msgstr "" #: settings.py:162 msgid "Mirror" msgstr "" #: settings.py:186 msgid "Save & Exit" msgstr "" torbrowser-launcher-0.2.9/torbrowser_launcher/000077500000000000000000000000001323341357100216245ustar00rootroot00000000000000torbrowser-launcher-0.2.9/torbrowser_launcher/__init__.py000066400000000000000000000043461323341357100237440ustar00rootroot00000000000000""" Tor Browser Launcher https://github.com/micahflee/torbrowser-launcher/ Copyright (c) 2013-2017 Micah Lee Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. """ from __future__ import print_function import os, sys, argparse from .common import Common, SHARE from .settings import Settings from .launcher import Launcher def main(): # parse arguments parser = argparse.ArgumentParser() parser.add_argument('--settings', action='store_true', dest='settings', help='Open Tor Browser Launcher settings') parser.add_argument('url', nargs='*', help='URL to load') args = parser.parse_args() settings = bool(args.settings) url_list = args.url # load the version and print the banner with open(os.path.join(SHARE, 'version')) as buf: tor_browser_launcher_version = buf.read().strip() print(_('Tor Browser Launcher')) print(_('By Micah Lee, licensed under MIT')) print(_('version {0}').format(tor_browser_launcher_version)) print('https://github.com/micahflee/torbrowser-launcher') common = Common(tor_browser_launcher_version) if settings: # settings mode app = Settings(common) else: # launcher mode app = Launcher(common, url_list) if __name__ == "__main__": main() torbrowser-launcher-0.2.9/torbrowser_launcher/common.py000066400000000000000000000334311323341357100234720ustar00rootroot00000000000000""" Tor Browser Launcher https://github.com/micahflee/torbrowser-launcher/ Copyright (c) 2013-2017 Micah Lee Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. """ from __future__ import print_function import os import sys import platform import subprocess import locale import pickle import json import re try: import gpg gpgme_support = True except ImportError: gpgme_support = False import pygtk pygtk.require('2.0') import gtk SHARE = os.getenv('TBL_SHARE', sys.prefix+'/share/torbrowser-launcher') import gettext gettext.install('torbrowser-launcher') from twisted.internet import gtk2reactor gtk2reactor.install() # We're looking for output which: # # 1. The first portion must be `[GNUPG:] IMPORT_OK` # 2. The second must be an integer between [0, 15], inclusive # 3. The third must be an uppercased hex-encoded 160-bit fingerprint gnupg_import_ok_pattern = re.compile( "(\[GNUPG\:\]) (IMPORT_OK) ([0-9]|[1]?[0-5]) ([A-F0-9]{40})") class Common: def __init__(self, tbl_version): self.tbl_version = tbl_version # initialize the app self.default_mirror = 'https://dist.torproject.org/' self.discover_arch_lang() self.build_paths() for d in self.paths['dirs']: self.mkdir(self.paths['dirs'][d]) self.load_mirrors() self.load_settings() self.mkdir(self.paths['download_dir']) self.mkdir(self.paths['tbb']['dir']) self.init_gnupg() # allow buttons to have icons try: gtk_settings = gtk.settings_get_default() gtk_settings.props.gtk_button_images = True except: pass # discover the architecture and language def discover_arch_lang(self): # figure out the architecture self.architecture = 'x86_64' if '64' in platform.architecture()[0] else 'i686' # figure out the language available_languages = ['en-US', 'ar', 'de', 'es-ES', 'fa', 'fr', 'it', 'ko', 'nl', 'pl', 'pt-PT', 'ru', 'vi', 'zh-CN'] default_locale = locale.getlocale(locale.LC_MESSAGES)[0] if default_locale is None: self.language = 'en-US' else: self.language = default_locale.replace('_', '-') if self.language not in available_languages: self.language = self.language.split('-')[0] if self.language not in available_languages: for l in available_languages: if l[0:2] == self.language: self.language = l # if language isn't available, default to english if self.language not in available_languages: self.language = 'en-US' # build all relevant paths def build_paths(self, tbb_version=None): homedir = os.getenv('HOME') if not homedir: homedir = '/tmp/.torbrowser-'+os.getenv('USER') if not os.path.exists(homedir): try: os.mkdir(homedir, 0o700) except: self.set_gui('error', _("Error creating {0}").format(homedir), [], False) if not os.access(homedir, os.W_OK): self.set_gui('error', _("{0} is not writable").format(homedir), [], False) tbb_config = '{0}/.config/torbrowser'.format(homedir) tbb_cache = '{0}/.cache/torbrowser'.format(homedir) tbb_local = '{0}/.local/share/torbrowser'.format(homedir) old_tbb_data = '{0}/.torbrowser'.format(homedir) if tbb_version: # tarball filename if self.architecture == 'x86_64': arch = 'linux64' else: arch = 'linux32' if hasattr(self, 'settings') and self.settings['force_en-US']: language = 'en-US' else: language = self.language tarball_filename = 'tor-browser-'+arch+'-'+tbb_version+'_'+language+'.tar.xz' # tarball self.paths['tarball_url'] = '{0}torbrowser/'+tbb_version+'/'+tarball_filename self.paths['tarball_file'] = tbb_cache+'/download/'+tarball_filename self.paths['tarball_filename'] = tarball_filename # sig self.paths['sig_url'] = '{0}torbrowser/'+tbb_version+'/'+tarball_filename+'.asc' self.paths['sig_file'] = tbb_cache+'/download/'+tarball_filename+'.asc' self.paths['sig_filename'] = tarball_filename+'.asc' else: self.paths = { 'dirs': { 'config': tbb_config, 'cache': tbb_cache, 'local': tbb_local, }, 'old_data_dir': old_tbb_data, 'tbl_bin': sys.argv[0], 'icon_file': os.path.join(os.path.dirname(SHARE), 'pixmaps/torbrowser.png'), 'torproject_pem': os.path.join(SHARE, 'torproject.pem'), 'keyserver_ca': os.path.join(SHARE, 'sks-keyservers.netCA.pem'), 'signing_keys': { 'tor_browser_developers': os.path.join(SHARE, 'tor-browser-developers.asc') }, 'mirrors_txt': [os.path.join(SHARE, 'mirrors.txt'), tbb_config+'/mirrors.txt'], 'modem_sound': os.path.join(SHARE, 'modem.ogg'), 'download_dir': tbb_cache+'/download', 'gnupg_homedir': tbb_local+'/gnupg_homedir', 'settings_file': tbb_config+'/settings.json', 'settings_file_pickle': tbb_config+'/settings', 'version_check_url': 'https://aus1.torproject.org/torbrowser/update_3/release/Linux_x86_64-gcc3/x/en-US', 'version_check_file': tbb_cache+'/download/release.xml', 'tbb': { 'changelog': tbb_local+'/tbb/'+self.architecture+'/tor-browser_'+self.language+'/Browser/TorBrowser/Docs/ChangeLog.txt', 'dir': tbb_local+'/tbb/'+self.architecture, 'dir_tbb': tbb_local+'/tbb/'+self.architecture+'/tor-browser_'+self.language, 'start': tbb_local+'/tbb/'+self.architecture+'/tor-browser_'+self.language+'/start-tor-browser.desktop', }, } # Add the expected fingerprint for imported keys: self.fingerprints = { 'tor_browser_developers': 'EF6E286DDA85EA2A4BA7DE684E2C6E8793298290' } # create a directory @staticmethod def mkdir(path): try: if not os.path.exists(path): os.makedirs(path, 0o700) return True except: print(_("Cannot create directory {0}").format(path)) return False if not os.access(path, os.W_OK): print(_("{0} is not writable").format(path)) return False return True # if gnupg_homedir isn't set up, set it up def init_gnupg(self): if not os.path.exists(self.paths['gnupg_homedir']): print(_('Creating GnuPG homedir'), self.paths['gnupg_homedir']) self.mkdir(self.paths['gnupg_homedir']) self.import_keys() def refresh_keyring(self, fingerprint=None): if fingerprint is not None: print('Refreshing local keyring... Missing key: ' + fingerprint) else: print('Refreshing local keyring...') p = subprocess.Popen(['/usr/bin/gpg', '--status-fd', '2', '--homedir', self.paths['gnupg_homedir'], '--keyserver', 'hkps://hkps.pool.sks-keyservers.net', '--keyserver-options', 'ca-cert-file=' + self.paths['keyserver_ca'] + ',include-revoked,no-honor-keyserver-url,no-honor-pka-record', '--refresh-keys'], stderr=subprocess.PIPE) p.wait() for output in p.stderr.readlines(): match = gnupg_import_ok_pattern.match(output) if match and match.group(2) == 'IMPORT_OK': fingerprint = str(match.group(4)) if match.group(3) == '0': print('Keyring refreshed successfully...') print(' No key updates for key: ' + fingerprint) elif match.group(3) == '4': print('Keyring refreshed successfully...') print(' New signatures for key: ' + fingerprint) else: print('Keyring refreshed successfully...') def import_key_and_check_status(self, key): """Import a GnuPG key and check that the operation was successful. :param str key: A string specifying the key's filepath from ``Common.paths`` :rtype: bool :returns: ``True`` if the key is now within the keyring (or was previously and hasn't changed). ``False`` otherwise. """ if gpgme_support: with gpg.Context() as c: c.set_engine_info(gpg.constants.protocol.OpenPGP, home_dir=self.paths['gnupg_homedir']) impkey = self.paths['signing_keys'][key] try: c.op_import(gpg.Data(file=impkey)) except: return False else: result = c.op_import_result() if result and self.fingerprints[key] in result.imports[0].fpr: return True else: return False else: success = False p = subprocess.Popen(['/usr/bin/gpg', '--status-fd', '2', '--homedir', self.paths['gnupg_homedir'], '--import', self.paths['signing_keys'][key]], stderr=subprocess.PIPE) p.wait() for output in p.stderr.readlines(): match = gnupg_import_ok_pattern.match(output) if match: if match.group().find(self.fingerprints[key]) >= 0: success = True break return success # import gpg keys def import_keys(self): """Import all GnuPG keys. :rtype: bool :returns: ``True`` if all keys were successfully imported; ``False`` otherwise. """ keys = ['tor_browser_developers',] all_imports_succeeded = True for key in keys: imported = self.import_key_and_check_status(key) if not imported: print(_('Could not import key with fingerprint: %s.' % self.fingerprints[key])) all_imports_succeeded = False if not all_imports_succeeded: print(_('Not all keys were imported successfully!')) self.refresh_keyring() return all_imports_succeeded # load mirrors def load_mirrors(self): self.mirrors = [] for srcfile in self.paths['mirrors_txt']: if not os.path.exists(srcfile): continue for mirror in open(srcfile, 'r').readlines(): if mirror.strip() not in self.mirrors: self.mirrors.append(mirror.strip()) # load settings def load_settings(self): default_settings = { 'tbl_version': self.tbl_version, 'installed': False, 'download_over_tor': False, 'modem_sound': False, 'tor_socks_address': 'tcp:127.0.0.1:9050', 'mirror': self.default_mirror, 'force_en-US': False, } if os.path.isfile(self.paths['settings_file']): settings = json.load(open(self.paths['settings_file'])) resave = False # detect installed settings['installed'] = os.path.isfile(self.paths['tbb']['start']) # make sure settings file is up-to-date for setting in default_settings: if setting not in settings: settings[setting] = default_settings[setting] resave = True # make sure the version is current if settings['tbl_version'] != self.tbl_version: settings['tbl_version'] = self.tbl_version resave = True self.settings = settings if resave: self.save_settings() # if settings file is still using old pickle format, convert to json elif os.path.isfile(self.paths['settings_file_pickle']): self.settings = pickle.load(open(self.paths['settings_file_pickle'])) self.save_settings() os.remove(self.paths['settings_file_pickle']) self.load_settings() else: self.settings = default_settings self.save_settings() # save settings def save_settings(self): json.dump(self.settings, open(self.paths['settings_file'], 'w')) return True torbrowser-launcher-0.2.9/torbrowser_launcher/launcher.py000066400000000000000000000656401323341357100240120ustar00rootroot00000000000000""" Tor Browser Launcher https://github.com/micahflee/torbrowser-launcher/ Copyright (c) 2013-2017 Micah Lee Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. """ from __future__ import print_function import os import subprocess import time import json import tarfile import hashlib import lzma import threading import re import unicodedata from twisted.internet import reactor from twisted.web.client import Agent, RedirectAgent, ResponseDone, ResponseFailed from twisted.web.http_headers import Headers from twisted.internet.protocol import Protocol from twisted.internet.error import DNSLookupError, ConnectionRefusedError try: import gpg gpgme_support = True except ImportError: gpgme_support = False import xml.etree.ElementTree as ET import OpenSSL import pygtk pygtk.require('2.0') import gtk class TryStableException(Exception): pass class TryDefaultMirrorException(Exception): pass class TryForcingEnglishException(Exception): pass class DownloadErrorException(Exception): pass class Launcher: def __init__(self, common, url_list): self.common = common self.url_list = url_list self.force_redownload = False # this is the current version of Tor Browser, which should get updated with every release self.min_version = '6.0.2' # init launcher self.set_gui(None, '', []) self.launch_gui = True # if Tor Browser is not installed, detect latest version, download, and install if not self.common.settings['installed'] or not self.check_min_version(): # if downloading over Tor, include txsocksx if self.common.settings['download_over_tor']: try: import txsocksx print(_('Downloading over Tor')) except ImportError: md = gtk.MessageDialog(None, gtk.DIALOG_DESTROY_WITH_PARENT, gtk.MESSAGE_WARNING, gtk.BUTTONS_CLOSE, _("The python-txsocksx package is missing, downloads will not happen over tor")) md.set_position(gtk.WIN_POS_CENTER) md.run() md.destroy() self.common.settings['download_over_tor'] = False self.common.save_settings() # different message if downloading for the first time, or because your installed version is too low download_message = "" if not self.common.settings['installed']: download_message = _("Downloading and installing Tor Browser for the first time.") elif not self.check_min_version(): download_message = _("Your version of Tor Browser is out-of-date. Downloading and installing the newest version.") # download and install print(download_message) self.set_gui('task', download_message, ['download_version_check', 'set_version', 'download_sig', 'download_tarball', 'verify', 'extract', 'run']) else: # Tor Browser is already installed, so run self.run(False) self.launch_gui = False if self.launch_gui: # build the rest of the UI self.build_ui() def configure_window(self): if not hasattr(self, 'window'): self.window = gtk.Window(gtk.WINDOW_TOPLEVEL) self.window.set_title(_("Tor Browser")) self.window.set_icon_from_file(self.common.paths['icon_file']) self.window.set_position(gtk.WIN_POS_CENTER) self.window.set_border_width(10) self.window.connect("delete_event", self.delete_event) self.window.connect("destroy", self.destroy) # there are different GUIs that might appear, this sets which one we want def set_gui(self, gui, message, tasks, autostart=True): self.gui = gui self.gui_message = message self.gui_tasks = tasks self.gui_task_i = 0 self.gui_autostart = autostart # set all gtk variables to False def clear_ui(self): if hasattr(self, 'box') and hasattr(self.box, 'destroy'): self.box.destroy() self.box = False self.label = False self.progressbar = False self.button_box = False self.start_button = False self.exit_button = False # build the application's UI def build_ui(self): self.clear_ui() self.box = gtk.VBox(False, 20) self.configure_window() self.window.add(self.box) if 'error' in self.gui: # labels self.label = gtk.Label(self.gui_message) self.label.set_line_wrap(True) self.box.pack_start(self.label, True, True, 0) self.label.show() # button box self.button_box = gtk.HButtonBox() self.button_box.set_layout(gtk.BUTTONBOX_SPREAD) self.box.pack_start(self.button_box, True, True, 0) self.button_box.show() if self.gui != 'error': # yes button yes_image = gtk.Image() yes_image.set_from_stock(gtk.STOCK_APPLY, gtk.ICON_SIZE_BUTTON) self.yes_button = gtk.Button("Yes") self.yes_button.set_image(yes_image) if self.gui == 'error_try_stable': self.yes_button.connect("clicked", self.try_stable, None) elif self.gui == 'error_try_default_mirror': self.yes_button.connect("clicked", self.try_default_mirror, None) elif self.gui == 'error_try_forcing_english': self.yes_button.connect("clicked", self.try_forcing_english, None) elif self.gui == 'error_try_tor': self.yes_button.connect("clicked", self.try_tor, None) self.button_box.add(self.yes_button) self.yes_button.show() # exit button exit_image = gtk.Image() exit_image.set_from_stock(gtk.STOCK_CANCEL, gtk.ICON_SIZE_BUTTON) self.exit_button = gtk.Button("Exit") self.exit_button.set_image(exit_image) self.exit_button.connect("clicked", self.destroy, None) self.button_box.add(self.exit_button) self.exit_button.show() elif self.gui == 'task': # label self.label = gtk.Label(self.gui_message) self.label.set_line_wrap(True) self.box.pack_start(self.label, True, True, 0) self.label.show() # progress bar self.progressbar = gtk.ProgressBar(adjustment=None) self.progressbar.set_orientation(gtk.PROGRESS_LEFT_TO_RIGHT) self.progressbar.set_pulse_step(0.01) self.box.pack_start(self.progressbar, True, True, 0) # button box self.button_box = gtk.HButtonBox() self.button_box.set_layout(gtk.BUTTONBOX_SPREAD) self.box.pack_start(self.button_box, True, True, 0) self.button_box.show() # start button start_image = gtk.Image() start_image.set_from_stock(gtk.STOCK_APPLY, gtk.ICON_SIZE_BUTTON) self.start_button = gtk.Button(_("Start")) self.start_button.set_image(start_image) self.start_button.connect("clicked", self.start, None) self.button_box.add(self.start_button) if not self.gui_autostart: self.start_button.show() # exit button exit_image = gtk.Image() exit_image.set_from_stock(gtk.STOCK_CANCEL, gtk.ICON_SIZE_BUTTON) self.exit_button = gtk.Button(_("Cancel")) self.exit_button.set_image(exit_image) self.exit_button.connect("clicked", self.destroy, None) self.button_box.add(self.exit_button) self.exit_button.show() self.box.show() self.window.show() if self.gui_autostart: self.start(None) # start button clicked, begin tasks def start(self, widget, data=None): # disable the start button if self.start_button: self.start_button.set_sensitive(False) # start running tasks self.run_task() # run the next task in the task list def run_task(self): self.refresh_gtk() if self.gui_task_i >= len(self.gui_tasks): self.destroy(False) return task = self.gui_tasks[self.gui_task_i] # get ready for the next task self.gui_task_i += 1 if task == 'download_version_check': print(_('Downloading'), self.common.paths['version_check_url']) self.download('version check', self.common.paths['version_check_url'], self.common.paths['version_check_file']) if task == 'set_version': version = self.get_stable_version() if version: self.common.build_paths(self.get_stable_version()) print(_('Latest version: {}').format(version)) self.run_task() else: self.set_gui('error', _("Error detecting Tor Browser version."), [], False) self.clear_ui() self.build_ui() elif task == 'download_sig': print(_('Downloading'), self.common.paths['sig_url'].format(self.common.settings['mirror'])) self.download('signature', self.common.paths['sig_url'], self.common.paths['sig_file']) elif task == 'download_tarball': print(_('Downloading'), self.common.paths['tarball_url'].format(self.common.settings['mirror'])) if not self.force_redownload and os.path.exists(self.common.paths['tarball_file']): self.run_task() else: self.download('tarball', self.common.paths['tarball_url'], self.common.paths['tarball_file']) elif task == 'verify': print(_('Verifying Signature')) self.verify() elif task == 'extract': print(_('Extracting'), self.common.paths['tarball_filename']) self.extract() elif task == 'run': print(_('Running'), self.common.paths['tbb']['start']) self.run() elif task == 'start_over': print(_('Starting download over again')) self.start_over() def response_received(self, response): class FileDownloader(Protocol): def __init__(self, common, file, url, total, progress, done_cb): self.file = file self.total = total self.so_far = 0 self.progress = progress self.all_done = done_cb if response.code != 200: if common.settings['mirror'] != common.default_mirror: raise TryDefaultMirrorException( (_("Download Error:") + " {0} {1}\n\n" + _("You are currently using a non-default mirror") + ":\n{2}\n\n" + _("Would you like to switch back to the default?")).format( response.code, response.phrase, common.settings['mirror'] ) ) elif common.language != 'en-US' and not common.settings['force_en-US']: raise TryForcingEnglishException( (_("Download Error:") + " {0} {1}\n\n" + _("Would you like to try the English version of Tor Browser instead?")).format( response.code, response.phrase ) ) else: raise DownloadErrorException( (_("Download Error:") + " {0} {1}").format(response.code, response.phrase) ) def dataReceived(self, bytes): self.file.write(bytes) self.so_far += len(bytes) percent = float(self.so_far) / float(self.total) self.progress.set_fraction(percent) amount = float(self.so_far) units = "bytes" for (size, unit) in [(1024 * 1024, "MiB"), (1024, "KiB")]: if amount > size: units = unit amount /= float(size) break self.progress.set_text(_('Downloaded')+(' %2.1f%% (%2.1f %s)' % ((percent * 100.0), amount, units))) def connectionLost(self, reason): self.all_done(reason) if hasattr(self, 'current_download_url'): url = self.current_download_url else: url = None dl = FileDownloader( self.common, self.file_download, url, response.length, self.progressbar, self.response_finished ) response.deliverBody(dl) def response_finished(self, msg): if msg.check(ResponseDone): self.file_download.close() delattr(self, 'current_download_path') delattr(self, 'current_download_url') # next task! self.run_task() else: print("FINISHED", msg) ## FIXME handle errors def download_error(self, f): print(_("Download Error:"), f.value, type(f.value)) if isinstance(f.value, TryStableException): f.trap(TryStableException) self.set_gui('error_try_stable', str(f.value), [], False) elif isinstance(f.value, TryDefaultMirrorException): f.trap(TryDefaultMirrorException) self.set_gui('error_try_default_mirror', str(f.value), [], False) elif isinstance(f.value, TryForcingEnglishException): f.trap(TryForcingEnglishException) self.set_gui('error_try_forcing_english', str(f.value), [], False) elif isinstance(f.value, DownloadErrorException): f.trap(DownloadErrorException) self.set_gui('error', str(f.value), [], False) elif isinstance(f.value, DNSLookupError): f.trap(DNSLookupError) if common.settings['mirror'] != common.default_mirror: self.set_gui('error_try_default_mirror', (_("DNS Lookup Error") + "\n\n" + _("You are currently using a non-default mirror") + ":\n{0}\n\n" + _("Would you like to switch back to the default?") ).format(common.settings['mirror']), [], False) else: self.set_gui('error', str(f.value), [], False) elif isinstance(f.value, ResponseFailed): for reason in f.value.reasons: if isinstance(reason.value, OpenSSL.SSL.Error): # TODO: add the ability to report attack by posting bug to trac.torproject.org if not self.common.settings['download_over_tor']: self.set_gui('error_try_tor', _('The SSL certificate served by https://www.torproject.org is invalid! You may ' 'be under attack.') + " " + _('Try the download again using Tor?'), [], False) else: self.set_gui('error', _('The SSL certificate served by https://www.torproject.org is invalid! ' 'You may be under attack.'), [], False) elif isinstance(f.value, ConnectionRefusedError) and self.common.settings['download_over_tor']: # If we're using Tor, we'll only get this error when we fail to # connect to the SOCKS server. If the connection fails at the # remote end, we'll get txsocksx.errors.ConnectionRefused. addr = self.common.settings['tor_socks_address'] self.set_gui('error', _("Error connecting to Tor at {0}").format(addr), [], False) else: self.set_gui('error', _("Error starting download:\n\n{0}\n\nAre you connected to the internet?").format(f.value), [], False) self.build_ui() def download(self, name, url, path): # keep track of current download self.current_download_path = path self.current_download_url = url mirror_url = url.format(self.common.settings['mirror']) # convert mirror_url from unicode to string, if needed (#205) if isinstance(mirror_url, unicode): mirror_url = unicodedata.normalize('NFKD', mirror_url).encode('ascii', 'ignore') # initialize the progress bar self.progressbar.set_fraction(0) self.progressbar.set_text(_('Downloading') + ' {0}'.format(name)) self.progressbar.show() self.refresh_gtk() if self.common.settings['download_over_tor']: from twisted.internet.endpoints import clientFromString from txsocksx.http import SOCKS5Agent torendpoint = clientFromString(reactor, self.common.settings['tor_socks_address']) # default mirror gets certificate pinning, only for requests that use the mirror agent = SOCKS5Agent(reactor, proxyEndpoint=torendpoint) else: agent = Agent(reactor) # actually, agent needs to follow redirect agent = RedirectAgent(agent) # start the request d = agent.request('GET', mirror_url, Headers({'User-Agent': ['torbrowser-launcher']}), None) self.file_download = open(path, 'w') d.addCallback(self.response_received).addErrback(self.download_error) if not reactor.running: reactor.run() def try_default_mirror(self, widget, data=None): # change mirror to default and relaunch TBL self.common.settings['mirror'] = self.common.default_mirror self.common.save_settings() subprocess.Popen([self.common.paths['tbl_bin']]) self.destroy(False) def try_forcing_english(self, widget, data=None): # change force english to true and relaunch TBL self.common.settings['force_en-US'] = True self.common.save_settings() subprocess.Popen([self.common.paths['tbl_bin']]) self.destroy(False) def try_tor(self, widget, data=None): # set download_over_tor to true and relaunch TBL self.common.settings['download_over_tor'] = True self.common.save_settings() subprocess.Popen([self.common.paths['tbl_bin']]) self.destroy(False) def get_stable_version(self): tree = ET.parse(self.common.paths['version_check_file']) for up in tree.getroot(): if up.tag == 'update' and up.attrib['appVersion']: version = str(up.attrib['appVersion']) # make sure the version does not contain directory traversal attempts # e.g. "5.5.3", "6.0a", "6.0a-hardened" are valid but "../../../../.." is invalid if not re.match(r'^[a-z0-9\.\-]+$', version): return None return version return None def verify(self): self.progressbar.set_fraction(0) self.progressbar.set_text(_('Verifying Signature')) self.progressbar.show() def gui_raise_sigerror(self, sigerror='MissingErr'): """ :type sigerror: str """ sigerror = 'SIGNATURE VERIFICATION FAILED!\n\nError Code: {0}\n\nYou might be under attack, there might' \ ' be a network\nproblem, or you may be missing a recently added\nTor Browser verification key.' \ '\nClick Start to refresh the keyring and try again. If the message persists report the above' \ ' error code here:\nhttps://github.com/micahflee/torbrowser-launcher/issues'.format(sigerror) self.set_gui('task', sigerror, ['start_over'], False) self.clear_ui() self.build_ui() if gpgme_support: with gpg.Context() as c: c.set_engine_info(gpg.constants.protocol.OpenPGP, home_dir=self.common.paths['gnupg_homedir']) sig = gpg.Data(file=self.common.paths['sig_file']) signed = gpg.Data(file=self.common.paths['tarball_file']) try: c.verify(signature=sig, signed_data=signed) except gpg.errors.BadSignatures as e: result = str(e).split(": ") if result[1] == 'Bad signature': gui_raise_sigerror(self, str(e)) elif result[1] == 'No public key': self.common.refresh_keyring(result[0]) gui_raise_sigerror(self, str(e)) else: self.run_task() else: FNULL = open(os.devnull, 'w') p = subprocess.Popen(['/usr/bin/gpg', '--homedir', self.common.paths['gnupg_homedir'], '--verify', self.common.paths['sig_file'], self.common.paths['tarball_file']], stdout=FNULL, stderr=subprocess.STDOUT) self.pulse_until_process_exits(p) if p.returncode == 0: self.run_task() else: self.common.refresh_keyring() gui_raise_sigerror(self, 'GENERIC_VERIFY_FAIL') if not reactor.running: reactor.run() def extract(self): # initialize the progress bar self.progressbar.set_fraction(0) self.progressbar.set_text(_('Installing')) self.progressbar.show() self.refresh_gtk() extracted = False try: if self.common.paths['tarball_file'][-2:] == 'xz': # if tarball is .tar.xz xz = lzma.LZMAFile(self.common.paths['tarball_file']) tf = tarfile.open(fileobj=xz) tf.extractall(self.common.paths['tbb']['dir']) extracted = True else: # if tarball is .tar.gz if tarfile.is_tarfile(self.common.paths['tarball_file']): tf = tarfile.open(self.common.paths['tarball_file']) tf.extractall(self.common.paths['tbb']['dir']) extracted = True except: pass if not extracted: self.set_gui('task', _("Tor Browser Launcher doesn't understand the file format of {0}".format(self.common.paths['tarball_file'])), ['start_over'], False) self.clear_ui() self.build_ui() return self.run_task() def check_min_version(self): installed_version = None for line in open(self.common.paths['tbb']['changelog']).readlines(): if line.startswith('Tor Browser '): installed_version = line.split()[2] break if self.min_version <= installed_version: return True return False def run(self, run_next_task=True): # don't run if it isn't at least the minimum version if not self.check_min_version(): message = _("The version of Tor Browser you have installed is earlier than it should be, which could be a " "sign of an attack!") print(message) md = gtk.MessageDialog(None, gtk.DIALOG_DESTROY_WITH_PARENT, gtk.MESSAGE_WARNING, gtk.BUTTONS_CLOSE, _(message)) md.set_position(gtk.WIN_POS_CENTER) md.run() md.destroy() return # play modem sound? if self.common.settings['modem_sound']: def play_modem_sound(): try: import pygame pygame.mixer.init() sound = pygame.mixer.Sound(self.common.paths['modem_sound']) sound.play() time.sleep(10) except ImportError: md = gtk.MessageDialog( None, gtk.DIALOG_DESTROY_WITH_PARENT, gtk.MESSAGE_WARNING, gtk.BUTTONS_CLOSE, _("The python-pygame package is missing, the modem sound is unavailable.") ) md.set_position(gtk.WIN_POS_CENTER) md.run() md.destroy() t = threading.Thread(target=play_modem_sound) t.start() # hide the TBL window (#151) if hasattr(self, 'window'): self.window.hide() while gtk.events_pending(): gtk.main_iteration_do(True) # run Tor Browser subprocess.call([self.common.paths['tbb']['start']], cwd=self.common.paths['tbb']['dir_tbb']) if run_next_task: self.run_task() # make the progress bar pulse until process p (a Popen object) finishes def pulse_until_process_exits(self, p): while p.poll() is None: time.sleep(0.01) self.progressbar.pulse() self.refresh_gtk() # start over and download TBB again def start_over(self): self.force_redownload = True # Overwrite any existing file self.label.set_text(_("Downloading Tor Browser Bundle over again.")) self.gui_tasks = ['download_tarball', 'verify', 'extract', 'run'] self.gui_task_i = 0 self.start(None) # refresh gtk def refresh_gtk(self): while gtk.events_pending(): gtk.main_iteration(False) # exit def delete_event(self, widget, event, data=None): return False def destroy(self, widget, data=None): if hasattr(self, 'file_download'): self.file_download.close() if hasattr(self, 'current_download_path'): os.remove(self.current_download_path) delattr(self, 'current_download_path') delattr(self, 'current_download_url') if reactor.running: reactor.stop() torbrowser-launcher-0.2.9/torbrowser_launcher/settings.py000066400000000000000000000234451323341357100240460ustar00rootroot00000000000000""" Tor Browser Launcher https://github.com/micahflee/torbrowser-launcher/ Copyright (c) 2013-2017 Micah Lee Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. """ import subprocess, time, shutil import pygtk pygtk.require('2.0') import gtk class Settings: def __init__(self, common): self.common = common # set up the window self.window = gtk.Window(gtk.WINDOW_TOPLEVEL) self.window.set_title(_("Tor Browser Launcher Settings")) self.window.set_icon_from_file(self.common.paths['icon_file']) self.window.set_position(gtk.WIN_POS_CENTER) self.window.set_border_width(10) self.window.connect("delete_event", self.delete_event) self.window.connect("destroy", self.destroy) # build the rest of the UI self.box = gtk.VBox(False, 10) self.window.add(self.box) self.box.show() self.hbox = gtk.HBox(False, 10) self.box.pack_start(self.hbox, True, True, 0) self.hbox.show() self.settings_box = gtk.VBox(False, 10) self.hbox.pack_start(self.settings_box, True, True, 0) self.settings_box.show() self.status_box = gtk.VBox(False, 10) self.hbox.pack_start(self.status_box, True, True, 0) self.status_box.show() # download over system tor try: import txsocksx self.txsocks_found = True except ImportError: self.txsocks_found = False self.tor_download_checkbox = gtk.CheckButton(_("Download over system Tor")) if self.txsocks_found: self.tor_download_checkbox.set_tooltip_text(_("This option is only available when using a system wide Tor installation.")) else: self.tor_download_checkbox.set_tooltip_text(_("This option requires the python-txsocksx package.")) self.settings_box.pack_start(self.tor_download_checkbox, True, True, 0) if self.common.settings['download_over_tor'] and self.txsocks_found: self.tor_download_checkbox.set_active(True) else: self.tor_download_checkbox.set_active(False) if self.txsocks_found == False: self.tor_download_checkbox.set_sensitive(False) self.tor_download_checkbox.show() # modem sound self.modem_checkbox = gtk.CheckButton(_("Play modem sound, because Tor is slow :]")) self.settings_box.pack_start(self.modem_checkbox, True, True, 0) try: import pygame if self.common.settings['modem_sound']: self.modem_checkbox.set_active(True) else: self.modem_checkbox.set_active(False) except ImportError: self.modem_checkbox.set_active(False) self.modem_checkbox.set_sensitive(False) self.modem_checkbox.set_tooltip_text(_("This option requires python-pygame to be installed")) self.modem_checkbox.show() # force en-US, only display if language isn't already en-US if self.common.language != 'en-US': self.force_en_checkbox = gtk.CheckButton(_("Force downloading English version of Tor Browser")) if self.common.settings['force_en-US']: self.force_en_checkbox.set_active(True) else: self.force_en_checkbox.set_active(False) self.settings_box.pack_start(self.force_en_checkbox, True, True, 0) self.force_en_checkbox.show() # Tor SOCKS address self.tor_addr_box = gtk.HBox(False, 10) self.settings_box.pack_start(self.tor_addr_box, True, True, 0) self.tor_addr_box.show() self.tor_addr_label = gtk.Label(_('Tor server')) self.tor_addr_label.set_line_wrap(True) self.tor_addr_box.pack_start(self.tor_addr_label, True, True, 0) self.tor_addr_label.show() self.tor_addr = gtk.Entry() self.tor_addr.set_text(self.common.settings['tor_socks_address']) self.tor_addr_box.pack_start(self.tor_addr, True, True, 0) self.tor_addr.show() # status if(self.common.settings['installed']): self.status_label = gtk.Label(_('Status: Installed')) else: self.status_label = gtk.Label(_('Status: Not Installed')) self.status_label.set_line_wrap(True) self.status_box.pack_start(self.status_label, True, True, 0) self.status_label.show() if(self.common.settings['installed']): # reinstall button reinstall_image = gtk.Image() reinstall_image.set_from_stock(gtk.STOCK_APPLY, gtk.ICON_SIZE_BUTTON) self.reinstall_button = gtk.Button(_("Reinstall Tor Browser")) self.reinstall_button.set_image(reinstall_image) self.reinstall_button.connect("clicked", self.reinstall, None) self.status_box.add(self.reinstall_button) self.reinstall_button.show() else: # install button install_image = gtk.Image() install_image.set_from_stock(gtk.STOCK_APPLY, gtk.ICON_SIZE_BUTTON) self.install_button = gtk.Button(_("Install Tor Browser")) self.install_button.set_image(install_image) self.install_button.connect("clicked", self.install, None) self.status_box.add(self.install_button) self.install_button.show() # mirrors self.mirrors_box = gtk.HBox(False, 10) self.box.pack_start(self.mirrors_box, True, True, 0) self.mirrors_box.show() self.mirrors_label = gtk.Label(_('Mirror')) self.mirrors_label.set_line_wrap(True) self.mirrors_box.pack_start(self.mirrors_label, True, True, 0) self.mirrors_label.show() self.mirrors = gtk.combo_box_new_text() for mirror in self.common.mirrors: self.mirrors.append_text(mirror) if self.common.settings['mirror'] in self.common.mirrors: self.mirrors.set_active(self.common.mirrors.index(self.common.settings['mirror'])) else: self.mirrors.set_active(0) self.mirrors_box.pack_start(self.mirrors, True, True, 0) self.mirrors.show() # button box self.button_box = gtk.HButtonBox() self.button_box.set_layout(gtk.BUTTONBOX_SPREAD) self.box.pack_start(self.button_box, True, True, 0) self.button_box.show() # save and exit button save_exit_image = gtk.Image() save_exit_image.set_from_stock(gtk.STOCK_APPLY, gtk.ICON_SIZE_BUTTON) self.save_exit_button = gtk.Button(_("Save & Exit")) self.save_exit_button.set_image(save_exit_image) self.save_exit_button.connect("clicked", self.save_exit, None) self.button_box.add(self.save_exit_button) self.save_exit_button.show() # cancel button cancel_image = gtk.Image() cancel_image.set_from_stock(gtk.STOCK_CANCEL, gtk.ICON_SIZE_BUTTON) self.cancel_button = gtk.Button(_("Cancel")) self.cancel_button.set_image(cancel_image) self.cancel_button.connect("clicked", self.destroy, None) self.button_box.add(self.cancel_button) self.cancel_button.show() # show the window self.window.show() # start gtk gtk.main() # UI Callback for update over tor/use system tor def on_system_tor_clicked(self, event): if self.txsocks_found: value = self.system_tor_checkbox.get_active() else: value = False self.tor_download_checkbox.set_active(value) self.tor_download_checkbox.set_sensitive(value) # install def install(self, widget, data=None): self.save() subprocess.Popen([self.common.paths['tbl_bin']]) self.destroy(False) # launch def reinstall(self, widget, data=None): self.save() shutil.rmtree(self.common.paths['tbb']['dir']) subprocess.Popen([self.common.paths['tbl_bin']]) self.destroy(False) # save and exit def save_exit(self, widget, data=None): self.save() self.destroy(False) # save settings def save(self): # checkbox options self.common.settings['download_over_tor'] = self.tor_download_checkbox.get_active() self.common.settings['modem_sound'] = self.modem_checkbox.get_active() if hasattr(self, 'force_en_checkbox'): self.common.settings['force_en-US'] = self.force_en_checkbox.get_active() else: self.common.settings['force_en-US'] = False self.common.settings['tor_socks_address'] = self.tor_addr.get_text() # figure out the selected mirror self.common.settings['mirror'] = self.common.mirrors[self.mirrors.get_active()] # save them self.common.save_settings() # exit def delete_event(self, widget, event, data=None): return False def destroy(self, widget, data=None): gtk.main_quit()